00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #include "pch.h"
00018 #include "sha3.h"
00019
00020 NAMESPACE_BEGIN(CryptoPP)
00021
00022 static const word64 KeccakF_RoundConstants[24] =
00023 {
00024 W64LIT(0x0000000000000001), W64LIT(0x0000000000008082), W64LIT(0x800000000000808a),
00025 W64LIT(0x8000000080008000), W64LIT(0x000000000000808b), W64LIT(0x0000000080000001),
00026 W64LIT(0x8000000080008081), W64LIT(0x8000000000008009), W64LIT(0x000000000000008a),
00027 W64LIT(0x0000000000000088), W64LIT(0x0000000080008009), W64LIT(0x000000008000000a),
00028 W64LIT(0x000000008000808b), W64LIT(0x800000000000008b), W64LIT(0x8000000000008089),
00029 W64LIT(0x8000000000008003), W64LIT(0x8000000000008002), W64LIT(0x8000000000000080),
00030 W64LIT(0x000000000000800a), W64LIT(0x800000008000000a), W64LIT(0x8000000080008081),
00031 W64LIT(0x8000000000008080), W64LIT(0x0000000080000001), W64LIT(0x8000000080008008)
00032 };
00033
00034 static void KeccakF1600(word64 *state)
00035 {
00036 {
00037 word64 Aba, Abe, Abi, Abo, Abu;
00038 word64 Aga, Age, Agi, Ago, Agu;
00039 word64 Aka, Ake, Aki, Ako, Aku;
00040 word64 Ama, Ame, Ami, Amo, Amu;
00041 word64 Asa, Ase, Asi, Aso, Asu;
00042 word64 BCa, BCe, BCi, BCo, BCu;
00043 word64 Da, De, Di, Do, Du;
00044 word64 Eba, Ebe, Ebi, Ebo, Ebu;
00045 word64 Ega, Ege, Egi, Ego, Egu;
00046 word64 Eka, Eke, Eki, Eko, Eku;
00047 word64 Ema, Eme, Emi, Emo, Emu;
00048 word64 Esa, Ese, Esi, Eso, Esu;
00049
00050
00051 typedef BlockGetAndPut<word64, LittleEndian, true, true> Block;
00052 Block::Get(state)(Aba)(Abe)(Abi)(Abo)(Abu)(Aga)(Age)(Agi)(Ago)(Agu)(Aka)(Ake)(Aki)(Ako)(Aku)(Ama)(Ame)(Ami)(Amo)(Amu)(Asa)(Ase)(Asi)(Aso)(Asu);
00053
00054 for( unsigned int round = 0; round < 24; round += 2 )
00055 {
00056
00057 BCa = Aba^Aga^Aka^Ama^Asa;
00058 BCe = Abe^Age^Ake^Ame^Ase;
00059 BCi = Abi^Agi^Aki^Ami^Asi;
00060 BCo = Abo^Ago^Ako^Amo^Aso;
00061 BCu = Abu^Agu^Aku^Amu^Asu;
00062
00063
00064 Da = BCu^rotlFixed(BCe, 1);
00065 De = BCa^rotlFixed(BCi, 1);
00066 Di = BCe^rotlFixed(BCo, 1);
00067 Do = BCi^rotlFixed(BCu, 1);
00068 Du = BCo^rotlFixed(BCa, 1);
00069
00070 Aba ^= Da;
00071 BCa = Aba;
00072 Age ^= De;
00073 BCe = rotlFixed(Age, 44);
00074 Aki ^= Di;
00075 BCi = rotlFixed(Aki, 43);
00076 Amo ^= Do;
00077 BCo = rotlFixed(Amo, 21);
00078 Asu ^= Du;
00079 BCu = rotlFixed(Asu, 14);
00080 Eba = BCa ^((~BCe)& BCi );
00081 Eba ^= (word64)KeccakF_RoundConstants[round];
00082 Ebe = BCe ^((~BCi)& BCo );
00083 Ebi = BCi ^((~BCo)& BCu );
00084 Ebo = BCo ^((~BCu)& BCa );
00085 Ebu = BCu ^((~BCa)& BCe );
00086
00087 Abo ^= Do;
00088 BCa = rotlFixed(Abo, 28);
00089 Agu ^= Du;
00090 BCe = rotlFixed(Agu, 20);
00091 Aka ^= Da;
00092 BCi = rotlFixed(Aka, 3);
00093 Ame ^= De;
00094 BCo = rotlFixed(Ame, 45);
00095 Asi ^= Di;
00096 BCu = rotlFixed(Asi, 61);
00097 Ega = BCa ^((~BCe)& BCi );
00098 Ege = BCe ^((~BCi)& BCo );
00099 Egi = BCi ^((~BCo)& BCu );
00100 Ego = BCo ^((~BCu)& BCa );
00101 Egu = BCu ^((~BCa)& BCe );
00102
00103 Abe ^= De;
00104 BCa = rotlFixed(Abe, 1);
00105 Agi ^= Di;
00106 BCe = rotlFixed(Agi, 6);
00107 Ako ^= Do;
00108 BCi = rotlFixed(Ako, 25);
00109 Amu ^= Du;
00110 BCo = rotlFixed(Amu, 8);
00111 Asa ^= Da;
00112 BCu = rotlFixed(Asa, 18);
00113 Eka = BCa ^((~BCe)& BCi );
00114 Eke = BCe ^((~BCi)& BCo );
00115 Eki = BCi ^((~BCo)& BCu );
00116 Eko = BCo ^((~BCu)& BCa );
00117 Eku = BCu ^((~BCa)& BCe );
00118
00119 Abu ^= Du;
00120 BCa = rotlFixed(Abu, 27);
00121 Aga ^= Da;
00122 BCe = rotlFixed(Aga, 36);
00123 Ake ^= De;
00124 BCi = rotlFixed(Ake, 10);
00125 Ami ^= Di;
00126 BCo = rotlFixed(Ami, 15);
00127 Aso ^= Do;
00128 BCu = rotlFixed(Aso, 56);
00129 Ema = BCa ^((~BCe)& BCi );
00130 Eme = BCe ^((~BCi)& BCo );
00131 Emi = BCi ^((~BCo)& BCu );
00132 Emo = BCo ^((~BCu)& BCa );
00133 Emu = BCu ^((~BCa)& BCe );
00134
00135 Abi ^= Di;
00136 BCa = rotlFixed(Abi, 62);
00137 Ago ^= Do;
00138 BCe = rotlFixed(Ago, 55);
00139 Aku ^= Du;
00140 BCi = rotlFixed(Aku, 39);
00141 Ama ^= Da;
00142 BCo = rotlFixed(Ama, 41);
00143 Ase ^= De;
00144 BCu = rotlFixed(Ase, 2);
00145 Esa = BCa ^((~BCe)& BCi );
00146 Ese = BCe ^((~BCi)& BCo );
00147 Esi = BCi ^((~BCo)& BCu );
00148 Eso = BCo ^((~BCu)& BCa );
00149 Esu = BCu ^((~BCa)& BCe );
00150
00151
00152 BCa = Eba^Ega^Eka^Ema^Esa;
00153 BCe = Ebe^Ege^Eke^Eme^Ese;
00154 BCi = Ebi^Egi^Eki^Emi^Esi;
00155 BCo = Ebo^Ego^Eko^Emo^Eso;
00156 BCu = Ebu^Egu^Eku^Emu^Esu;
00157
00158
00159 Da = BCu^rotlFixed(BCe, 1);
00160 De = BCa^rotlFixed(BCi, 1);
00161 Di = BCe^rotlFixed(BCo, 1);
00162 Do = BCi^rotlFixed(BCu, 1);
00163 Du = BCo^rotlFixed(BCa, 1);
00164
00165 Eba ^= Da;
00166 BCa = Eba;
00167 Ege ^= De;
00168 BCe = rotlFixed(Ege, 44);
00169 Eki ^= Di;
00170 BCi = rotlFixed(Eki, 43);
00171 Emo ^= Do;
00172 BCo = rotlFixed(Emo, 21);
00173 Esu ^= Du;
00174 BCu = rotlFixed(Esu, 14);
00175 Aba = BCa ^((~BCe)& BCi );
00176 Aba ^= (word64)KeccakF_RoundConstants[round+1];
00177 Abe = BCe ^((~BCi)& BCo );
00178 Abi = BCi ^((~BCo)& BCu );
00179 Abo = BCo ^((~BCu)& BCa );
00180 Abu = BCu ^((~BCa)& BCe );
00181
00182 Ebo ^= Do;
00183 BCa = rotlFixed(Ebo, 28);
00184 Egu ^= Du;
00185 BCe = rotlFixed(Egu, 20);
00186 Eka ^= Da;
00187 BCi = rotlFixed(Eka, 3);
00188 Eme ^= De;
00189 BCo = rotlFixed(Eme, 45);
00190 Esi ^= Di;
00191 BCu = rotlFixed(Esi, 61);
00192 Aga = BCa ^((~BCe)& BCi );
00193 Age = BCe ^((~BCi)& BCo );
00194 Agi = BCi ^((~BCo)& BCu );
00195 Ago = BCo ^((~BCu)& BCa );
00196 Agu = BCu ^((~BCa)& BCe );
00197
00198 Ebe ^= De;
00199 BCa = rotlFixed(Ebe, 1);
00200 Egi ^= Di;
00201 BCe = rotlFixed(Egi, 6);
00202 Eko ^= Do;
00203 BCi = rotlFixed(Eko, 25);
00204 Emu ^= Du;
00205 BCo = rotlFixed(Emu, 8);
00206 Esa ^= Da;
00207 BCu = rotlFixed(Esa, 18);
00208 Aka = BCa ^((~BCe)& BCi );
00209 Ake = BCe ^((~BCi)& BCo );
00210 Aki = BCi ^((~BCo)& BCu );
00211 Ako = BCo ^((~BCu)& BCa );
00212 Aku = BCu ^((~BCa)& BCe );
00213
00214 Ebu ^= Du;
00215 BCa = rotlFixed(Ebu, 27);
00216 Ega ^= Da;
00217 BCe = rotlFixed(Ega, 36);
00218 Eke ^= De;
00219 BCi = rotlFixed(Eke, 10);
00220 Emi ^= Di;
00221 BCo = rotlFixed(Emi, 15);
00222 Eso ^= Do;
00223 BCu = rotlFixed(Eso, 56);
00224 Ama = BCa ^((~BCe)& BCi );
00225 Ame = BCe ^((~BCi)& BCo );
00226 Ami = BCi ^((~BCo)& BCu );
00227 Amo = BCo ^((~BCu)& BCa );
00228 Amu = BCu ^((~BCa)& BCe );
00229
00230 Ebi ^= Di;
00231 BCa = rotlFixed(Ebi, 62);
00232 Ego ^= Do;
00233 BCe = rotlFixed(Ego, 55);
00234 Eku ^= Du;
00235 BCi = rotlFixed(Eku, 39);
00236 Ema ^= Da;
00237 BCo = rotlFixed(Ema, 41);
00238 Ese ^= De;
00239 BCu = rotlFixed(Ese, 2);
00240 Asa = BCa ^((~BCe)& BCi );
00241 Ase = BCe ^((~BCi)& BCo );
00242 Asi = BCi ^((~BCo)& BCu );
00243 Aso = BCo ^((~BCu)& BCa );
00244 Asu = BCu ^((~BCa)& BCe );
00245 }
00246
00247
00248 Block::Put(NULL, state)(Aba)(Abe)(Abi)(Abo)(Abu)(Aga)(Age)(Agi)(Ago)(Agu)(Aka)(Ake)(Aki)(Ako)(Aku)(Ama)(Ame)(Ami)(Amo)(Amu)(Asa)(Ase)(Asi)(Aso)(Asu);
00249 }
00250 }
00251
00252 void SHA3::Update(const byte *input, size_t length)
00253 {
00254 assert((input && length) || !(input || length));
00255 if (!length)
00256 return;
00257
00258 size_t spaceLeft;
00259 while (length >= (spaceLeft = r() - m_counter))
00260 {
00261 if (spaceLeft)
00262 xorbuf(m_state.BytePtr() + m_counter, input, spaceLeft);
00263 KeccakF1600(m_state);
00264 input += spaceLeft;
00265 length -= spaceLeft;
00266 m_counter = 0;
00267 }
00268
00269 if (length)
00270 xorbuf(m_state.BytePtr() + m_counter, input, length);
00271 m_counter += (unsigned int)length;
00272 }
00273
00274 void SHA3::Restart()
00275 {
00276 memset(m_state, 0, m_state.SizeInBytes());
00277 m_counter = 0;
00278 }
00279
00280 void SHA3::TruncatedFinal(byte *hash, size_t size)
00281 {
00282 ThrowIfInvalidTruncatedSize(size);
00283 m_state.BytePtr()[m_counter] ^= 1;
00284 m_state.BytePtr()[r()-1] ^= 0x80;
00285 KeccakF1600(m_state);
00286 memcpy(hash, m_state, size);
00287 Restart();
00288 }
00289
00290 NAMESPACE_END