os/security/cryptoplugins/cryptospiplugins/source/softwarecrypto/sha384and512impl.cpp
First public contribution.
2 * Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies).
4 * This component and the accompanying materials are made available
5 * under the terms of the License "Eclipse Public License v1.0"
6 * which accompanies this distribution, and is available
7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
9 * Initial Contributors:
10 * Nokia Corporation - initial contribution.
15 * Common implementation of SHA384 and SHA512
16 * RFC 4634 (US Secure Hash Algorithms (SHA and HMAC-SHA))
25 #include <cryptospi/hashplugin.h>
26 #include "sha384and512impl.h"
27 #include "pluginconfig.h"
32 * SHA-512 uses a sequence of eighty constant 64-bit words.
33 * These words represent the first sixty-four bits of the fractional
34 * parts of the cube roots of the first eighty prime numbers.
36 * FIPS 180-2 Section 4.2.3
40 UI64LIT(0x428a2f98d728ae22), UI64LIT(0x7137449123ef65cd), UI64LIT(0xb5c0fbcfec4d3b2f), UI64LIT(0xe9b5dba58189dbbc),
41 UI64LIT(0x3956c25bf348b538), UI64LIT(0x59f111f1b605d019), UI64LIT(0x923f82a4af194f9b), UI64LIT(0xab1c5ed5da6d8118),
42 UI64LIT(0xd807aa98a3030242), UI64LIT(0x12835b0145706fbe), UI64LIT(0x243185be4ee4b28c), UI64LIT(0x550c7dc3d5ffb4e2),
43 UI64LIT(0x72be5d74f27b896f), UI64LIT(0x80deb1fe3b1696b1), UI64LIT(0x9bdc06a725c71235), UI64LIT(0xc19bf174cf692694),
44 UI64LIT(0xe49b69c19ef14ad2), UI64LIT(0xefbe4786384f25e3), UI64LIT(0x0fc19dc68b8cd5b5), UI64LIT(0x240ca1cc77ac9c65),
45 UI64LIT(0x2de92c6f592b0275), UI64LIT(0x4a7484aa6ea6e483), UI64LIT(0x5cb0a9dcbd41fbd4), UI64LIT(0x76f988da831153b5),
46 UI64LIT(0x983e5152ee66dfab), UI64LIT(0xa831c66d2db43210), UI64LIT(0xb00327c898fb213f), UI64LIT(0xbf597fc7beef0ee4),
47 UI64LIT(0xc6e00bf33da88fc2), UI64LIT(0xd5a79147930aa725), UI64LIT(0x06ca6351e003826f), UI64LIT(0x142929670a0e6e70),
48 UI64LIT(0x27b70a8546d22ffc), UI64LIT(0x2e1b21385c26c926), UI64LIT(0x4d2c6dfc5ac42aed), UI64LIT(0x53380d139d95b3df),
49 UI64LIT(0x650a73548baf63de), UI64LIT(0x766a0abb3c77b2a8), UI64LIT(0x81c2c92e47edaee6), UI64LIT(0x92722c851482353b),
50 UI64LIT(0xa2bfe8a14cf10364), UI64LIT(0xa81a664bbc423001), UI64LIT(0xc24b8b70d0f89791), UI64LIT(0xc76c51a30654be30),
51 UI64LIT(0xd192e819d6ef5218), UI64LIT(0xd69906245565a910), UI64LIT(0xf40e35855771202a), UI64LIT(0x106aa07032bbd1b8),
52 UI64LIT(0x19a4c116b8d2d0c8), UI64LIT(0x1e376c085141ab53), UI64LIT(0x2748774cdf8eeb99), UI64LIT(0x34b0bcb5e19b48a8),
53 UI64LIT(0x391c0cb3c5c95a63), UI64LIT(0x4ed8aa4ae3418acb), UI64LIT(0x5b9cca4f7763e373), UI64LIT(0x682e6ff3d6b2b8a3),
54 UI64LIT(0x748f82ee5defb2fc), UI64LIT(0x78a5636f43172f60), UI64LIT(0x84c87814a1f0ab72), UI64LIT(0x8cc702081a6439ec),
55 UI64LIT(0x90befffa23631e28), UI64LIT(0xa4506cebde82bde9), UI64LIT(0xbef9a3f7b2c67915), UI64LIT(0xc67178f2e372532b),
56 UI64LIT(0xca273eceea26619c), UI64LIT(0xd186b8c721c0c207), UI64LIT(0xeada7dd6cde0eb1e), UI64LIT(0xf57d4f7fee6ed178),
57 UI64LIT(0x06f067aa72176fba), UI64LIT(0x0a637dc5a2c898a6), UI64LIT(0x113f9804bef90dae), UI64LIT(0x1b710b35131c471b),
58 UI64LIT(0x28db77f523047d84), UI64LIT(0x32caab7b40c72493), UI64LIT(0x3c9ebe0a15c9bebc), UI64LIT(0x431d67c49c100d4c),
59 UI64LIT(0x4cc5d4becb3e42b6), UI64LIT(0x597f299cfc657e2a), UI64LIT(0x5fcb6fab3ad6faec), UI64LIT(0x6c44198c4a475817)
63 * Define the SHA SIGMA and sigma macros
65 * FIPS 180-2 section 4.1.3
68 inline TUint64 SHA512_SIGMA0(TUint64 aWord)
70 return (SHA_ROTR<TUint64>(28,aWord) ^ SHA_ROTR<TUint64>(34,aWord) ^ SHA_ROTR<TUint64>(39,aWord));
73 inline TUint64 SHA512_SIGMA1(TUint64 aWord)
75 return (SHA_ROTR<TUint64>(14,aWord) ^ SHA_ROTR<TUint64>(18,aWord) ^ SHA_ROTR<TUint64>(41,aWord));
78 inline TUint64 SHA512_sigma0(TUint64 aWord)
80 return (SHA_ROTR<TUint64>(1, aWord) ^ SHA_ROTR<TUint64>(8, aWord) ^ SHA_SHR<TUint64>(7, aWord));
83 inline TUint64 SHA512_sigma1(TUint64 aWord)
85 return (SHA_ROTR<TUint64>(19,aWord) ^ SHA_ROTR<TUint64>(61,aWord) ^ SHA_SHR<TUint64>(6,aWord));
89 inline TUint64 Make64BitWord(const TUint8* aData)
91 TUint64 result = (TUint64)aData[0] << 56 | (TUint64)aData[1] << 48 | (TUint64)aData[2] << 40 |
92 (TUint64)aData[3] << 32 | (TUint64)aData[4] << 24 | (TUint64)aData[5] << 16 |
93 (TUint64)aData[6] << 8 | (TUint64)aData[7];
98 using namespace SoftwareCrypto;
100 CSHA384And512Impl* CSHA384And512Impl::NewL(TInt aHashSize)
102 CSHA384And512Impl* self=new (ELeave) CSHA384And512Impl(aHashSize);
106 CSHA384And512Impl::CSHA384And512Impl(TInt aHashSize) : iHash(aHashSize)
110 CSHA384And512Impl::CSHA384And512Impl(const CSHA384And512Impl& aSHA512Impl)
111 : iHash(aSHA512Impl.iHash),
120 iNl(aSHA512Impl.iNl),
121 iNh(aSHA512Impl.iNh),
122 iBlockIndex(aSHA512Impl.iBlockIndex)
124 Mem::Copy(iData, aSHA512Impl.iData, KSHA512BlockSize*sizeof(TUint64));
127 void CSHA384And512Impl::Reset(const TAny* aValueArr)
129 const TUint64* values = static_cast<const TUint64*>(aValueArr);
133 * These words were obtained by taking the first thirty-two bits
134 * of the fractional parts of the square roots of the first eight
137 * FIPS 180-2 Section 5.3.2
152 //This function will panic if the total input length is longer than 2^128 in bits
153 _LIT(KPanicString, "Message length exceeds supported length");
154 inline void CSHA384And512Impl::AddLength(const TUint64 aLength)
158 __ASSERT_ALWAYS(((iNh != KMaxTUint64) || (temp <= iNl)), User::Panic(KPanicString, KErrOverflow));
162 // This assumes a big-endian architecture
163 void CSHA384And512Impl::Update(const TUint8* aData,TUint aLength)
165 while((aLength / 8) > 0 && (iBlockIndex % 8 == 0))
167 iData[iBlockIndex>>3] = Make64BitWord(aData);
171 if(iBlockIndex==KSHA512BlockSize)
174 AddLength(KSHA512BlockSize);
180 if(!(iBlockIndex&0x07))
182 iData[iBlockIndex >> 3] = 0;
184 iData[iBlockIndex >> 3] |= static_cast<TUint64>(*aData) << ((7 - iBlockIndex&0x07) << 3) ;
187 if(iBlockIndex==KSHA512BlockSize)
190 AddLength(KSHA512BlockSize);
195 static inline void CSHA512_16( const TUint64 aA,
208 aTemp1 = aH + SHA512_SIGMA1(aE) + SHA_Ch(aE,aF,aG) + aK + aWord;
209 aTemp2 = SHA512_SIGMA0(aA) + SHA_Maj(aA,aB,aC);
211 aH = aTemp1 + aTemp2;
214 static inline void CSHA512_64( const TUint64 aA,
226 const TUint64 aWord2,
227 const TUint64 aWord7,
228 const TUint64 aWord15,
229 const TUint64 aWord16)
231 aWord0 = SHA512_sigma1(aWord2) + aWord7 + SHA512_sigma0(aWord15) + aWord16;
232 CSHA512_16(aA, aB, aC, aD, aE, aF, aG, aH, aTemp1, aTemp2, aK, aWord0);
236 * This function actually calculates the hash.
237 * Function is defined in FIPS 180-2 section 6.3.2
239 * This function is the expanded version of the following loop.
240 * for(TUint i = 0; i < 80; ++i)
244 * iData[i] = SHA512_sigma1(iData[i-2]) + iData[i-7] + SHA512_sigma0(iData[i-15]) + iData[i-16];
247 * temp1 = tempH + SHA512_SIGMA1(tempE) + SHA_Ch(tempE,tempF,tempG) + K[i] + iData[i];
248 * temp2 = SHA512_SIGMA0(tempA) + SHA_Maj(tempA,tempB,tempC);
252 * tempE = tempD + temp1;
256 * tempA = temp1 + temp2;
259 void CSHA384And512Impl::Block()
272 CSHA512_16(tempA,tempB,tempC,tempD,tempE,tempF,tempG,tempH,temp1,temp2,K[0],iData[0]);
273 CSHA512_16(tempH,tempA,tempB,tempC,tempD,tempE,tempF,tempG,temp1,temp2,K[1],iData[1]);
274 CSHA512_16(tempG,tempH,tempA,tempB,tempC,tempD,tempE,tempF,temp1,temp2,K[2],iData[2]);
275 CSHA512_16(tempF,tempG,tempH,tempA,tempB,tempC,tempD,tempE,temp1,temp2,K[3],iData[3]);
276 CSHA512_16(tempE,tempF,tempG,tempH,tempA,tempB,tempC,tempD,temp1,temp2,K[4],iData[4]);
277 CSHA512_16(tempD,tempE,tempF,tempG,tempH,tempA,tempB,tempC,temp1,temp2,K[5],iData[5]);
278 CSHA512_16(tempC,tempD,tempE,tempF,tempG,tempH,tempA,tempB,temp1,temp2,K[6],iData[6]);
279 CSHA512_16(tempB,tempC,tempD,tempE,tempF,tempG,tempH,tempA,temp1,temp2,K[7],iData[7]);
281 CSHA512_16(tempA,tempB,tempC,tempD,tempE,tempF,tempG,tempH,temp1,temp2,K[8],iData[8]);
282 CSHA512_16(tempH,tempA,tempB,tempC,tempD,tempE,tempF,tempG,temp1,temp2,K[9],iData[9]);
283 CSHA512_16(tempG,tempH,tempA,tempB,tempC,tempD,tempE,tempF,temp1,temp2,K[10],iData[10]);
284 CSHA512_16(tempF,tempG,tempH,tempA,tempB,tempC,tempD,tempE,temp1,temp2,K[11],iData[11]);
285 CSHA512_16(tempE,tempF,tempG,tempH,tempA,tempB,tempC,tempD,temp1,temp2,K[12],iData[12]);
286 CSHA512_16(tempD,tempE,tempF,tempG,tempH,tempA,tempB,tempC,temp1,temp2,K[13],iData[13]);
287 CSHA512_16(tempC,tempD,tempE,tempF,tempG,tempH,tempA,tempB,temp1,temp2,K[14],iData[14]);
288 CSHA512_16(tempB,tempC,tempD,tempE,tempF,tempG,tempH,tempA,temp1,temp2,K[15],iData[15]);
290 CSHA512_64( tempA, tempB, tempC, tempD, tempE, tempF, tempG, tempH, temp1, temp2,
291 K[16], iData[16], iData[14], iData[9], iData[1], iData[0]);
292 CSHA512_64( tempH, tempA, tempB, tempC, tempD, tempE, tempF, tempG, temp1, temp2,
293 K[17], iData[17], iData[15], iData[10], iData[2], iData[1]);
294 CSHA512_64( tempG, tempH, tempA, tempB, tempC, tempD, tempE, tempF, temp1, temp2,
295 K[18], iData[18], iData[16], iData[11], iData[3], iData[2]);
296 CSHA512_64( tempF, tempG, tempH, tempA, tempB, tempC, tempD, tempE, temp1, temp2,
297 K[19], iData[19], iData[17], iData[12], iData[4], iData[3]);
298 CSHA512_64( tempE, tempF, tempG, tempH, tempA, tempB, tempC, tempD, temp1, temp2,
299 K[20], iData[20], iData[18], iData[13], iData[5], iData[4]);
300 CSHA512_64( tempD, tempE, tempF, tempG, tempH, tempA, tempB, tempC, temp1, temp2,
301 K[21], iData[21], iData[19], iData[14], iData[6], iData[5]);
302 CSHA512_64( tempC, tempD, tempE, tempF, tempG, tempH, tempA, tempB, temp1, temp2,
303 K[22], iData[22], iData[20], iData[15], iData[7], iData[6]);
304 CSHA512_64( tempB, tempC, tempD, tempE, tempF, tempG, tempH, tempA, temp1, temp2,
305 K[23], iData[23], iData[21], iData[16], iData[8], iData[7]);
307 CSHA512_64( tempA, tempB, tempC, tempD, tempE, tempF, tempG, tempH, temp1, temp2,
308 K[24], iData[24], iData[22], iData[17], iData[9], iData[8]);
309 CSHA512_64( tempH, tempA, tempB, tempC, tempD, tempE, tempF, tempG, temp1, temp2,
310 K[25], iData[25], iData[23], iData[18], iData[10], iData[9]);
311 CSHA512_64( tempG, tempH, tempA, tempB, tempC, tempD, tempE, tempF, temp1, temp2,
312 K[26], iData[26], iData[24], iData[19], iData[11], iData[10]);
313 CSHA512_64( tempF, tempG, tempH, tempA, tempB, tempC, tempD, tempE, temp1, temp2,
314 K[27], iData[27], iData[25], iData[20], iData[12], iData[11]);
315 CSHA512_64( tempE, tempF, tempG, tempH, tempA, tempB, tempC, tempD, temp1, temp2,
316 K[28], iData[28], iData[26], iData[21], iData[13], iData[12]);
317 CSHA512_64( tempD, tempE, tempF, tempG, tempH, tempA, tempB, tempC, temp1, temp2,
318 K[29], iData[29], iData[27], iData[22], iData[14], iData[13]);
319 CSHA512_64( tempC, tempD, tempE, tempF, tempG, tempH, tempA, tempB, temp1, temp2,
320 K[30], iData[30], iData[28], iData[23], iData[15], iData[14]);
321 CSHA512_64( tempB, tempC, tempD, tempE, tempF, tempG, tempH, tempA, temp1, temp2,
322 K[31], iData[31], iData[29], iData[24], iData[16], iData[15]);
324 CSHA512_64( tempA, tempB, tempC, tempD, tempE, tempF, tempG, tempH, temp1, temp2,
325 K[32], iData[32], iData[30], iData[25], iData[17], iData[16]);
326 CSHA512_64( tempH, tempA, tempB, tempC, tempD, tempE, tempF, tempG, temp1, temp2,
327 K[33], iData[33], iData[31], iData[26], iData[18], iData[17]);
328 CSHA512_64( tempG, tempH, tempA, tempB, tempC, tempD, tempE, tempF, temp1, temp2,
329 K[34], iData[34], iData[32], iData[27], iData[19], iData[18]);
330 CSHA512_64( tempF, tempG, tempH, tempA, tempB, tempC, tempD, tempE, temp1, temp2,
331 K[35], iData[35], iData[33], iData[28], iData[20], iData[19]);
332 CSHA512_64( tempE, tempF, tempG, tempH, tempA, tempB, tempC, tempD, temp1, temp2,
333 K[36], iData[36], iData[34], iData[29], iData[21], iData[20]);
334 CSHA512_64( tempD, tempE, tempF, tempG, tempH, tempA, tempB, tempC, temp1, temp2,
335 K[37], iData[37], iData[35], iData[30], iData[22], iData[21]);
336 CSHA512_64( tempC, tempD, tempE, tempF, tempG, tempH, tempA, tempB, temp1, temp2,
337 K[38], iData[38], iData[36], iData[31], iData[23], iData[22]);
338 CSHA512_64( tempB, tempC, tempD, tempE, tempF, tempG, tempH, tempA, temp1, temp2,
339 K[39], iData[39], iData[37], iData[32], iData[24], iData[23]);
341 CSHA512_64( tempA, tempB, tempC, tempD, tempE, tempF, tempG, tempH, temp1, temp2,
342 K[40], iData[40], iData[38], iData[33], iData[25], iData[24]);
343 CSHA512_64( tempH, tempA, tempB, tempC, tempD, tempE, tempF, tempG, temp1, temp2,
344 K[41], iData[41], iData[39], iData[34], iData[26], iData[25]);
345 CSHA512_64( tempG, tempH, tempA, tempB, tempC, tempD, tempE, tempF, temp1, temp2,
346 K[42], iData[42], iData[40], iData[35], iData[27], iData[26]);
347 CSHA512_64( tempF, tempG, tempH, tempA, tempB, tempC, tempD, tempE, temp1, temp2,
348 K[43], iData[43], iData[41], iData[36], iData[28], iData[27]);
349 CSHA512_64( tempE, tempF, tempG, tempH, tempA, tempB, tempC, tempD, temp1, temp2,
350 K[44], iData[44], iData[42], iData[37], iData[29], iData[28]);
351 CSHA512_64( tempD, tempE, tempF, tempG, tempH, tempA, tempB, tempC, temp1, temp2,
352 K[45], iData[45], iData[43], iData[38], iData[30], iData[29]);
353 CSHA512_64( tempC, tempD, tempE, tempF, tempG, tempH, tempA, tempB, temp1, temp2,
354 K[46], iData[46], iData[44], iData[39], iData[31], iData[30]);
355 CSHA512_64( tempB, tempC, tempD, tempE, tempF, tempG, tempH, tempA, temp1, temp2,
356 K[47], iData[47], iData[45], iData[40], iData[32], iData[31]);
358 CSHA512_64( tempA, tempB, tempC, tempD, tempE, tempF, tempG, tempH, temp1, temp2,
359 K[48], iData[48], iData[46], iData[41], iData[33], iData[32]);
360 CSHA512_64( tempH, tempA, tempB, tempC, tempD, tempE, tempF, tempG, temp1, temp2,
361 K[49], iData[49], iData[47], iData[42], iData[34], iData[33]);
362 CSHA512_64( tempG, tempH, tempA, tempB, tempC, tempD, tempE, tempF, temp1, temp2,
363 K[50], iData[50], iData[48], iData[43], iData[35], iData[34]);
364 CSHA512_64( tempF, tempG, tempH, tempA, tempB, tempC, tempD, tempE, temp1, temp2,
365 K[51], iData[51], iData[49], iData[44], iData[36], iData[35]);
366 CSHA512_64( tempE, tempF, tempG, tempH, tempA, tempB, tempC, tempD, temp1, temp2,
367 K[52], iData[52], iData[50], iData[45], iData[37], iData[36]);
368 CSHA512_64( tempD, tempE, tempF, tempG, tempH, tempA, tempB, tempC, temp1, temp2,
369 K[53], iData[53], iData[51], iData[46], iData[38], iData[37]);
370 CSHA512_64( tempC, tempD, tempE, tempF, tempG, tempH, tempA, tempB, temp1, temp2,
371 K[54], iData[54], iData[52], iData[47], iData[39], iData[38]);
372 CSHA512_64( tempB, tempC, tempD, tempE, tempF, tempG, tempH, tempA, temp1, temp2,
373 K[55], iData[55], iData[53], iData[48], iData[40], iData[39]);
375 CSHA512_64( tempA, tempB, tempC, tempD, tempE, tempF, tempG, tempH, temp1, temp2,
376 K[56], iData[56], iData[54], iData[49], iData[41], iData[40]);
377 CSHA512_64( tempH, tempA, tempB, tempC, tempD, tempE, tempF, tempG, temp1, temp2,
378 K[57], iData[57], iData[55], iData[50], iData[42], iData[41]);
379 CSHA512_64( tempG, tempH, tempA, tempB, tempC, tempD, tempE, tempF, temp1, temp2,
380 K[58], iData[58], iData[56], iData[51], iData[43], iData[42]);
381 CSHA512_64( tempF, tempG, tempH, tempA, tempB, tempC, tempD, tempE, temp1, temp2,
382 K[59], iData[59], iData[57], iData[52], iData[44], iData[43]);
383 CSHA512_64( tempE, tempF, tempG, tempH, tempA, tempB, tempC, tempD, temp1, temp2,
384 K[60], iData[60], iData[58], iData[53], iData[45], iData[44]);
385 CSHA512_64( tempD, tempE, tempF, tempG, tempH, tempA, tempB, tempC, temp1, temp2,
386 K[61], iData[61], iData[59], iData[54], iData[46], iData[45]);
387 CSHA512_64( tempC, tempD, tempE, tempF, tempG, tempH, tempA, tempB, temp1, temp2,
388 K[62], iData[62], iData[60], iData[55], iData[47], iData[46]);
389 CSHA512_64( tempB, tempC, tempD, tempE, tempF, tempG, tempH, tempA, temp1, temp2,
390 K[63], iData[63], iData[61], iData[56], iData[48], iData[47]);
392 CSHA512_64( tempA, tempB, tempC, tempD, tempE, tempF, tempG, tempH, temp1, temp2,
393 K[64], iData[64], iData[62], iData[57], iData[49], iData[48]);
394 CSHA512_64( tempH, tempA, tempB, tempC, tempD, tempE, tempF, tempG, temp1, temp2,
395 K[65], iData[65], iData[63], iData[58], iData[50], iData[49]);
396 CSHA512_64( tempG, tempH, tempA, tempB, tempC, tempD, tempE, tempF, temp1, temp2,
397 K[66], iData[66], iData[64], iData[59], iData[51], iData[50]);
398 CSHA512_64( tempF, tempG, tempH, tempA, tempB, tempC, tempD, tempE, temp1, temp2,
399 K[67], iData[67], iData[65], iData[60], iData[52], iData[51]);
400 CSHA512_64( tempE, tempF, tempG, tempH, tempA, tempB, tempC, tempD, temp1, temp2,
401 K[68], iData[68], iData[66], iData[61], iData[53], iData[52]);
402 CSHA512_64( tempD, tempE, tempF, tempG, tempH, tempA, tempB, tempC, temp1, temp2,
403 K[69], iData[69], iData[67], iData[62], iData[54], iData[53]);
404 CSHA512_64( tempC, tempD, tempE, tempF, tempG, tempH, tempA, tempB, temp1, temp2,
405 K[70], iData[70], iData[68], iData[63], iData[55], iData[54]);
406 CSHA512_64( tempB, tempC, tempD, tempE, tempF, tempG, tempH, tempA, temp1, temp2,
407 K[71], iData[71], iData[69], iData[64], iData[56], iData[55]);
409 CSHA512_64( tempA, tempB, tempC, tempD, tempE, tempF, tempG, tempH, temp1, temp2,
410 K[72], iData[72], iData[70], iData[65], iData[57], iData[56]);
411 CSHA512_64( tempH, tempA, tempB, tempC, tempD, tempE, tempF, tempG, temp1, temp2,
412 K[73], iData[73], iData[71], iData[66], iData[58], iData[57]);
413 CSHA512_64( tempG, tempH, tempA, tempB, tempC, tempD, tempE, tempF, temp1, temp2,
414 K[74], iData[74], iData[72], iData[67], iData[59], iData[58]);
415 CSHA512_64( tempF, tempG, tempH, tempA, tempB, tempC, tempD, tempE, temp1, temp2,
416 K[75], iData[75], iData[73], iData[68], iData[60], iData[59]);
417 CSHA512_64( tempE, tempF, tempG, tempH, tempA, tempB, tempC, tempD, temp1, temp2,
418 K[76], iData[76], iData[74], iData[69], iData[61], iData[60]);
419 CSHA512_64( tempD, tempE, tempF, tempG, tempH, tempA, tempB, tempC, temp1, temp2,
420 K[77], iData[77], iData[75], iData[70], iData[62], iData[61]);
421 CSHA512_64( tempC, tempD, tempE, tempF, tempG, tempH, tempA, tempB, temp1, temp2,
422 K[78], iData[78], iData[76], iData[71], iData[63], iData[62]);
423 CSHA512_64( tempB, tempC, tempD, tempE, tempF, tempG, tempH, tempA, temp1, temp2,
424 K[79], iData[79], iData[77], iData[72], iData[64], iData[63]);
439 * According to the standard, the message must be padded to an
440 * even 512 bits. The first padding bit must be a '1'. The last
441 * 64 bits represent the length of the original message. All bits
442 * in between should be 0. This helper function will pad the
443 * message according to those rules by filling the iData array
446 void CSHA384And512Impl::PadMessage()
448 const TUint64 padByte = 0x80;
450 if(!(iBlockIndex&0x07))
452 iData[iBlockIndex >> 3] = 0;
454 iData[iBlockIndex >> 3] |= padByte << ((7 - iBlockIndex&0x07) << 3) ;
456 if (iBlockIndex >= (KSHA512BlockSize - 2*sizeof(TUint64)))
458 if (iBlockIndex < (KSHA512BlockSize - sizeof(TUint64)))
459 iData[(KSHA512BlockSize>>3)-1]=0;
461 Mem::FillZ(iData,KSHA512BlockSize);
465 const TUint offset=(iBlockIndex+8)>>3; //+8 to account for the word added in the
466 //switch statement above
467 Mem::FillZ(iData+offset, (KSHA512BlockSize - offset*sizeof(TUint64)));
470 iData[(KSHA512BlockSize >> 3) - 2] = iNh;
471 iData[(KSHA512BlockSize >> 3) - 1] = iNl;
474 inline void CSHA384And512Impl::CopyWordToHash(TUint64 aVal, TUint aIndex)
476 TUint64 value = Make64BitWord(reinterpret_cast<TUint8*>(&aVal));
477 Mem::Copy(const_cast<TUint8*>(iHash.Ptr())+ (8*aIndex), &value, sizeof(aVal));
480 const TDesC8& CSHA384And512Impl::Final()
482 AddLength(iBlockIndex);
486 // Generate hash value into iHash
488 CopyWordToHash(iA, 0);
489 CopyWordToHash(iB, 1);
490 CopyWordToHash(iC, 2);
491 CopyWordToHash(iD, 3);
492 CopyWordToHash(iE, 4);
493 CopyWordToHash(iF, 5);
494 CopyWordToHash(iG, 6);
495 CopyWordToHash(iH, 7);
500 void CSHA384And512Impl::RestoreState()
512 iBlockIndex = iBlockIndexCopy;
513 Mem::Copy((TAny*)iData, (TAny*)iDataCopy, KSHA512BlockSize*sizeof(TUint64));
516 void CSHA384And512Impl::StoreState()
528 iBlockIndexCopy = iBlockIndex;
529 Mem::Copy((TAny*)iDataCopy, (TAny*)iData, KSHA512BlockSize*sizeof(TUint64));
532 // Implemented in hmacimpl.cpp or softwarehashbase.cpp
533 // but required as derived from MHash. No coverage here.
534 #ifdef _BullseyeCoverage
535 #pragma suppress_warnings on
536 #pragma BullseyeCoverage off
537 #pragma suppress_warnings off