Update contrib.
2 * Copyright (c) 2006-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 * software md5 implementation
16 * software md5 implementation
26 #include <cryptospi/hashplugin.h>
27 #include "pluginconfig.h"
29 using namespace SoftwareCrypto;
32 CMD5Impl* CMD5Impl::NewL(TUid aImplementationUid)
34 CMD5Impl* self=new (ELeave) CMD5Impl(aImplementationUid);
39 CMD5Impl* CMD5Impl::NewLC(TUid aImplementationUid)
41 CMD5Impl* self=NewL(aImplementationUid);
42 CleanupStack::PushL(self);
46 CMD5Impl::CMD5Impl(TUid aImplementationUid) : iImplementationUid(aImplementationUid), iHash(KMD5HashSize)
50 CMD5Impl::CMD5Impl(const CMD5Impl& aCMD5Impl)
51 : iHash(aCMD5Impl.iHash),iA(aCMD5Impl.iA),iB(aCMD5Impl.iB),iC(aCMD5Impl.iC),iD(aCMD5Impl.iD),
52 iNl(aCMD5Impl.iNl),iNh(aCMD5Impl.iNh)
54 (void)Mem::Copy(iData, aCMD5Impl.iData, sizeof(iData));
61 void CMD5Impl::Reset()
71 void CMD5Impl::Close()
76 void CMD5Impl::GetCharacteristicsL(const TCharacteristics*& aPluginCharacteristics)
78 aPluginCharacteristics=NULL;
79 TInt hashNum=sizeof(KHashCharacteristics)/sizeof(THashCharacteristics*);
80 for (TInt i=0;i<hashNum;i++)
82 if (KHashCharacteristics[i]->cmn.iImplementationUID == ImplementationUid().iUid)
84 aPluginCharacteristics = KHashCharacteristics[i];
90 CExtendedCharacteristics* CMD5Impl::CreateExtendedCharacteristicsL()
92 // All Symbian software plug-ins have unlimited concurrency, cannot be reserved
93 // for exclusive use and are not CERTIFIED to be standards compliant.
94 return CExtendedCharacteristics::NewL(KMaxTInt, EFalse);
97 const CExtendedCharacteristics* CMD5Impl::GetExtendedCharacteristicsL()
99 return CMD5Impl::CreateExtendedCharacteristicsL();
102 TAny* CMD5Impl::GetExtension(TUid /*aExtensionId*/)
107 TPtrC8 CMD5Impl::Hash(const TDesC8& aMessage)
110 TPtrC8 ptr(KNullDesC8());
111 DoUpdate(aMessage.Ptr(),aMessage.Size());
119 void CMD5Impl::Update(const TDesC8& aMessage)
121 DoUpdate(aMessage.Ptr(),aMessage.Size());
124 TPtrC8 CMD5Impl::Final(const TDesC8& aMessage)
126 TPtrC8 ptr(KNullDesC8());
127 if (aMessage!=KNullDesC8())
129 DoUpdate(aMessage.Ptr(),aMessage.Size());
137 MHash* CMD5Impl::ReplicateL()
139 return CMD5Impl::NewL(iImplementationUid);
142 MHash* CMD5Impl::CopyL()
144 return new(ELeave) CMD5Impl(*this);
147 TUid CMD5Impl::ImplementationUid()
149 return iImplementationUid;
152 void CMD5Impl::DoUpdate(const TUint8* aData,TUint aLength)
154 const TUint8* pend=aData+aLength;
155 for (const TUint8* paData=aData;paData<pend;paData++)
157 const TUint8 byte=*paData;
164 iData[iNl>>2]|=byte<<8;
167 iData[iNl>>2]|=byte<<16;
170 iData[iNl>>2]|=byte<<24;
184 static inline TUint CMD5_F(TUint x,TUint y,TUint z)
186 return (x&y) | (~x&z);
188 static inline TUint CMD5_G(TUint x,TUint y,TUint z)
190 return (x&z) | (y&~z);
192 static inline TUint CMD5_H(TUint x,TUint y,TUint z)
196 static inline TUint CMD5_I(TUint x,TUint y,TUint z)
203 static inline TUint CMD5_FF(TUint a,const TUint b,const TUint c,const TUint d,const TUint m,const TUint s,const TUint t)
205 a+=CMD5_F(b,c,d) + m + t;
209 static inline TUint CMD5_GG(TUint a,const TUint b,const TUint c,const TUint d,const TUint m,const TUint s,const TUint t)
211 a+=CMD5_G(b,c,d) + m + t;
215 static inline TUint CMD5_HH(TUint a,const TUint b,const TUint c,const TUint d,const TUint m,const TUint s,const TUint t)
217 a+=CMD5_H(b,c,d) + m + t;
221 static inline TUint CMD5_II(TUint a,const TUint b,const TUint c,const TUint d,const TUint m,const TUint s,const TUint t)
223 a+=CMD5_I(b,c,d) + m + t;
227 void CMD5Impl::Block()
229 register TUint tempA=iA;
230 register TUint tempB=iB;
231 register TUint tempC=iC;
232 register TUint tempD=iD;
234 tempA = CMD5_FF(tempA,tempB,tempC,tempD,iData[ 0], 7, 0xd76aa478);
235 tempD = CMD5_FF(tempD,tempA,tempB,tempC,iData[ 1],12, 0xe8c7b756);
236 tempC = CMD5_FF(tempC,tempD,tempA,tempB,iData[ 2],17, 0x242070db);
237 tempB = CMD5_FF(tempB,tempC,tempD,tempA,iData[ 3],22, 0xc1bdceee);
238 tempA = CMD5_FF(tempA,tempB,tempC,tempD,iData[ 4], 7, 0xf57c0faf);
239 tempD = CMD5_FF(tempD,tempA,tempB,tempC,iData[ 5],12, 0x4787c62a);
240 tempC = CMD5_FF(tempC,tempD,tempA,tempB,iData[ 6],17, 0xa8304613);
241 tempB = CMD5_FF(tempB,tempC,tempD,tempA,iData[ 7],22, 0xfd469501);
242 tempA = CMD5_FF(tempA,tempB,tempC,tempD,iData[ 8], 7, 0x698098d8);
243 tempD = CMD5_FF(tempD,tempA,tempB,tempC,iData[ 9],12, 0x8b44f7af);
244 tempC = CMD5_FF(tempC,tempD,tempA,tempB,iData[10],17, 0xffff5bb1);
245 tempB = CMD5_FF(tempB,tempC,tempD,tempA,iData[11],22, 0x895cd7be);
246 tempA = CMD5_FF(tempA,tempB,tempC,tempD,iData[12], 7, 0x6b901122);
247 tempD = CMD5_FF(tempD,tempA,tempB,tempC,iData[13],12, 0xfd987193);
248 tempC = CMD5_FF(tempC,tempD,tempA,tempB,iData[14],17, 0xa679438e);
249 tempB = CMD5_FF(tempB,tempC,tempD,tempA,iData[15],22, 0x49b40821);
251 tempA = CMD5_GG(tempA,tempB,tempC,tempD,iData[ 1], 5, 0xf61e2562);
252 tempD = CMD5_GG(tempD,tempA,tempB,tempC,iData[ 6], 9, 0xc040b340);
253 tempC = CMD5_GG(tempC,tempD,tempA,tempB,iData[11],14, 0x265e5a51);
254 tempB = CMD5_GG(tempB,tempC,tempD,tempA,iData[ 0],20, 0xe9b6c7aa);
255 tempA = CMD5_GG(tempA,tempB,tempC,tempD,iData[ 5], 5, 0xd62f105d);
256 tempD = CMD5_GG(tempD,tempA,tempB,tempC,iData[10], 9, 0x02441453);
257 tempC = CMD5_GG(tempC,tempD,tempA,tempB,iData[15],14, 0xd8a1e681);
258 tempB = CMD5_GG(tempB,tempC,tempD,tempA,iData[ 4],20, 0xe7d3fbc8);
259 tempA = CMD5_GG(tempA,tempB,tempC,tempD,iData[ 9], 5, 0x21e1cde6);
260 tempD = CMD5_GG(tempD,tempA,tempB,tempC,iData[14], 9, 0xc33707d6);
261 tempC = CMD5_GG(tempC,tempD,tempA,tempB,iData[ 3],14, 0xf4d50d87);
262 tempB = CMD5_GG(tempB,tempC,tempD,tempA,iData[ 8],20, 0x455a14ed);
263 tempA = CMD5_GG(tempA,tempB,tempC,tempD,iData[13], 5, 0xa9e3e905);
264 tempD = CMD5_GG(tempD,tempA,tempB,tempC,iData[ 2], 9, 0xfcefa3f8);
265 tempC = CMD5_GG(tempC,tempD,tempA,tempB,iData[ 7],14, 0x676f02d9);
266 tempB = CMD5_GG(tempB,tempC,tempD,tempA,iData[12],20, 0x8d2a4c8a);
268 tempA = CMD5_HH(tempA,tempB,tempC,tempD,iData[ 5], 4, 0xfffa3942);
269 tempD = CMD5_HH(tempD,tempA,tempB,tempC,iData[ 8],11, 0x8771f681);
270 tempC = CMD5_HH(tempC,tempD,tempA,tempB,iData[11],16, 0x6d9d6122);
271 tempB = CMD5_HH(tempB,tempC,tempD,tempA,iData[14],23, 0xfde5380c);
272 tempA = CMD5_HH(tempA,tempB,tempC,tempD,iData[ 1], 4, 0xa4beea44);
273 tempD = CMD5_HH(tempD,tempA,tempB,tempC,iData[ 4],11, 0x4bdecfa9);
274 tempC = CMD5_HH(tempC,tempD,tempA,tempB,iData[ 7],16, 0xf6bb4b60);
275 tempB = CMD5_HH(tempB,tempC,tempD,tempA,iData[10],23, 0xbebfbc70);
276 tempA = CMD5_HH(tempA,tempB,tempC,tempD,iData[13], 4, 0x289b7ec6);
277 tempD = CMD5_HH(tempD,tempA,tempB,tempC,iData[ 0],11, 0xeaa127fa);
278 tempC = CMD5_HH(tempC,tempD,tempA,tempB,iData[ 3],16, 0xd4ef3085);
279 tempB = CMD5_HH(tempB,tempC,tempD,tempA,iData[ 6],23, 0x04881d05);
280 tempA = CMD5_HH(tempA,tempB,tempC,tempD,iData[ 9], 4, 0xd9d4d039);
281 tempD = CMD5_HH(tempD,tempA,tempB,tempC,iData[12],11, 0xe6db99e5);
282 tempC = CMD5_HH(tempC,tempD,tempA,tempB,iData[15],16, 0x1fa27cf8);
283 tempB = CMD5_HH(tempB,tempC,tempD,tempA,iData[ 2],23, 0xc4ac5665);
285 tempA = CMD5_II(tempA,tempB,tempC,tempD,iData[ 0], 6, 0xf4292244);
286 tempD = CMD5_II(tempD,tempA,tempB,tempC,iData[ 7],10, 0x432aff97);
287 tempC = CMD5_II(tempC,tempD,tempA,tempB,iData[14],15, 0xab9423a7);
288 tempB = CMD5_II(tempB,tempC,tempD,tempA,iData[ 5],21, 0xfc93a039);
289 tempA = CMD5_II(tempA,tempB,tempC,tempD,iData[12], 6, 0x655b59c3);
290 tempD = CMD5_II(tempD,tempA,tempB,tempC,iData[ 3],10, 0x8f0ccc92);
291 tempC = CMD5_II(tempC,tempD,tempA,tempB,iData[10],15, 0xffeff47d);
292 tempB = CMD5_II(tempB,tempC,tempD,tempA,iData[ 1],21, 0x85845dd1);
293 tempA = CMD5_II(tempA,tempB,tempC,tempD,iData[ 8], 6, 0x6fa87e4f);
294 tempD = CMD5_II(tempD,tempA,tempB,tempC,iData[15],10, 0xfe2ce6e0);
295 tempC = CMD5_II(tempC,tempD,tempA,tempB,iData[ 6],15, 0xa3014314);
296 tempB = CMD5_II(tempB,tempC,tempD,tempA,iData[13],21, 0x4e0811a1);
297 tempA = CMD5_II(tempA,tempB,tempC,tempD,iData[ 4], 6, 0xf7537e82);
298 tempD = CMD5_II(tempD,tempA,tempB,tempC,iData[11],10, 0xbd3af235);
299 tempC = CMD5_II(tempC,tempD,tempA,tempB,iData[ 2],15, 0x2ad7d2bb);
300 tempB = CMD5_II(tempB,tempC,tempD,tempA,iData[ 9],21, 0xeb86d391);
309 #define CMD5_FF(a, b, c, d, m, s, t) (b + CMD_R(a += CMD5_F(b,c,d) + m + t, s))
310 #define CMD5_GG(a, b, c, d, m, s, t) (b + CMD_R(a += CMD5_G(b,c,d) + m + t, s))
311 #define CMD5_HH(a, b, c, d, m, s, t) (b + CMD_R(a += CMD5_H(b,c,d) + m + t, s))
312 #define CMD5_II(a, b, c, d, m, s, t) (b + CMD_R(a += CMD5_I(b,c,d) + m + t, s))
313 void CMD5Impl::Block()
315 register TUint tempA=iA;
316 register TUint tempB=iB;
317 register TUint tempC=iC;
318 register TUint tempD=iD;
320 tempA = CMD5_FF(tempA,tempB,tempC,tempD,iData[ 0], 7, 0xd76aa478);
321 tempD = CMD5_FF(tempD,tempA,tempB,tempC,iData[ 1],12, 0xe8c7b756);
322 tempC = CMD5_FF(tempC,tempD,tempA,tempB,iData[ 2],17, 0x242070db);
323 tempB = CMD5_FF(tempB,tempC,tempD,tempA,iData[ 3],22, 0xc1bdceee);
324 tempA = CMD5_FF(tempA,tempB,tempC,tempD,iData[ 4], 7, 0xf57c0faf);
325 tempD = CMD5_FF(tempD,tempA,tempB,tempC,iData[ 5],12, 0x4787c62a);
326 tempC = CMD5_FF(tempC,tempD,tempA,tempB,iData[ 6],17, 0xa8304613);
327 tempB = CMD5_FF(tempB,tempC,tempD,tempA,iData[ 7],22, 0xfd469501);
328 tempA = CMD5_FF(tempA,tempB,tempC,tempD,iData[ 8], 7, 0x698098d8);
329 tempD = CMD5_FF(tempD,tempA,tempB,tempC,iData[ 9],12, 0x8b44f7af);
330 tempC = CMD5_FF(tempC,tempD,tempA,tempB,iData[10],17, 0xffff5bb1);
331 tempB = CMD5_FF(tempB,tempC,tempD,tempA,iData[11],22, 0x895cd7be);
332 tempA = CMD5_FF(tempA,tempB,tempC,tempD,iData[12], 7, 0x6b901122);
333 tempD = CMD5_FF(tempD,tempA,tempB,tempC,iData[13],12, 0xfd987193);
334 tempC = CMD5_FF(tempC,tempD,tempA,tempB,iData[14],17, 0xa679438e);
335 tempB = CMD5_FF(tempB,tempC,tempD,tempA,iData[15],22, 0x49b40821);
337 tempA = CMD5_GG(tempA,tempB,tempC,tempD,iData[ 1], 5, 0xf61e2562);
338 tempD = CMD5_GG(tempD,tempA,tempB,tempC,iData[ 6], 9, 0xc040b340);
339 tempC = CMD5_GG(tempC,tempD,tempA,tempB,iData[11],14, 0x265e5a51);
340 tempB = CMD5_GG(tempB,tempC,tempD,tempA,iData[ 0],20, 0xe9b6c7aa);
341 tempA = CMD5_GG(tempA,tempB,tempC,tempD,iData[ 5], 5, 0xd62f105d);
342 tempD = CMD5_GG(tempD,tempA,tempB,tempC,iData[10], 9, 0x02441453);
343 tempC = CMD5_GG(tempC,tempD,tempA,tempB,iData[15],14, 0xd8a1e681);
344 tempB = CMD5_GG(tempB,tempC,tempD,tempA,iData[ 4],20, 0xe7d3fbc8);
345 tempA = CMD5_GG(tempA,tempB,tempC,tempD,iData[ 9], 5, 0x21e1cde6);
346 tempD = CMD5_GG(tempD,tempA,tempB,tempC,iData[14], 9, 0xc33707d6);
347 tempC = CMD5_GG(tempC,tempD,tempA,tempB,iData[ 3],14, 0xf4d50d87);
348 tempB = CMD5_GG(tempB,tempC,tempD,tempA,iData[ 8],20, 0x455a14ed);
349 tempA = CMD5_GG(tempA,tempB,tempC,tempD,iData[13], 5, 0xa9e3e905);
350 tempD = CMD5_GG(tempD,tempA,tempB,tempC,iData[ 2], 9, 0xfcefa3f8);
351 tempC = CMD5_GG(tempC,tempD,tempA,tempB,iData[ 7],14, 0x676f02d9);
352 tempB = CMD5_GG(tempB,tempC,tempD,tempA,iData[12],20, 0x8d2a4c8a);
354 tempA = CMD5_HH(tempA,tempB,tempC,tempD,iData[ 5], 4, 0xfffa3942);
355 tempD = CMD5_HH(tempD,tempA,tempB,tempC,iData[ 8],11, 0x8771f681);
356 tempC = CMD5_HH(tempC,tempD,tempA,tempB,iData[11],16, 0x6d9d6122);
357 tempB = CMD5_HH(tempB,tempC,tempD,tempA,iData[14],23, 0xfde5380c);
358 tempA = CMD5_HH(tempA,tempB,tempC,tempD,iData[ 1], 4, 0xa4beea44);
359 tempD = CMD5_HH(tempD,tempA,tempB,tempC,iData[ 4],11, 0x4bdecfa9);
360 tempC = CMD5_HH(tempC,tempD,tempA,tempB,iData[ 7],16, 0xf6bb4b60);
361 tempB = CMD5_HH(tempB,tempC,tempD,tempA,iData[10],23, 0xbebfbc70);
362 tempA = CMD5_HH(tempA,tempB,tempC,tempD,iData[13], 4, 0x289b7ec6);
363 tempD = CMD5_HH(tempD,tempA,tempB,tempC,iData[ 0],11, 0xeaa127fa);
364 tempC = CMD5_HH(tempC,tempD,tempA,tempB,iData[ 3],16, 0xd4ef3085);
365 tempB = CMD5_HH(tempB,tempC,tempD,tempA,iData[ 6],23, 0x04881d05);
366 tempA = CMD5_HH(tempA,tempB,tempC,tempD,iData[ 9], 4, 0xd9d4d039);
367 tempD = CMD5_HH(tempD,tempA,tempB,tempC,iData[12],11, 0xe6db99e5);
368 tempC = CMD5_HH(tempC,tempD,tempA,tempB,iData[15],16, 0x1fa27cf8);
369 tempB = CMD5_HH(tempB,tempC,tempD,tempA,iData[ 2],23, 0xc4ac5665);
371 tempA = CMD5_II(tempA,tempB,tempC,tempD,iData[ 0], 6, 0xf4292244);
372 tempD = CMD5_II(tempD,tempA,tempB,tempC,iData[ 7],10, 0x432aff97);
373 tempC = CMD5_II(tempC,tempD,tempA,tempB,iData[14],15, 0xab9423a7);
374 tempB = CMD5_II(tempB,tempC,tempD,tempA,iData[ 5],21, 0xfc93a039);
375 tempA = CMD5_II(tempA,tempB,tempC,tempD,iData[12], 6, 0x655b59c3);
376 tempD = CMD5_II(tempD,tempA,tempB,tempC,iData[ 3],10, 0x8f0ccc92);
377 tempC = CMD5_II(tempC,tempD,tempA,tempB,iData[10],15, 0xffeff47d);
378 tempB = CMD5_II(tempB,tempC,tempD,tempA,iData[ 1],21, 0x85845dd1);
379 tempA = CMD5_II(tempA,tempB,tempC,tempD,iData[ 8], 6, 0x6fa87e4f);
380 tempD = CMD5_II(tempD,tempA,tempB,tempC,iData[15],10, 0xfe2ce6e0);
381 tempC = CMD5_II(tempC,tempD,tempA,tempB,iData[ 6],15, 0xa3014314);
382 tempB = CMD5_II(tempB,tempC,tempD,tempA,iData[13],21, 0x4e0811a1);
383 tempA = CMD5_II(tempA,tempB,tempC,tempD,iData[ 4], 6, 0xf7537e82);
384 tempD = CMD5_II(tempD,tempA,tempB,tempC,iData[11],10, 0xbd3af235);
385 tempC = CMD5_II(tempC,tempD,tempA,tempB,iData[ 2],15, 0x2ad7d2bb);
386 tempB = CMD5_II(tempB,tempC,tempD,tempA,iData[ 9],21, 0xeb86d391);
394 static inline void CMD5_FF(TUint& a,const TUint b,const TUint c,const TUint d,const TUint m,const TUint s,const TUint t)
396 a+=CMD5_F(b,c,d) + m + t;
399 static inline void CMD5_GG(TUint& a,const TUint b,const TUint c,const TUint d,const TUint m,const TUint s,const TUint t)
401 a+=CMD5_G(b,c,d) + m + t;
404 static inline void CMD5_HH(TUint& a,const TUint b,const TUint c,const TUint d,const TUint m,const TUint s,const TUint t)
406 a+=CMD5_H(b,c,d) + m + t;
409 static inline void CMD5_II(TUint& a,const TUint b,const TUint c,const TUint d,const TUint m,const TUint s,const TUint t)
411 a+=CMD5_I(b,c,d) + m + t;
414 void CMD5Impl::Block()
416 register TUint tempA=iA;
417 register TUint tempB=iB;
418 register TUint tempC=iC;
419 register TUint tempD=iD;
421 CMD5_FF(tempA,tempB,tempC,tempD,iData[ 0], 7, 0xd76aa478);
422 CMD5_FF(tempD,tempA,tempB,tempC,iData[ 1],12, 0xe8c7b756);
423 CMD5_FF(tempC,tempD,tempA,tempB,iData[ 2],17, 0x242070db);
424 CMD5_FF(tempB,tempC,tempD,tempA,iData[ 3],22, 0xc1bdceee);
425 CMD5_FF(tempA,tempB,tempC,tempD,iData[ 4], 7, 0xf57c0faf);
426 CMD5_FF(tempD,tempA,tempB,tempC,iData[ 5],12, 0x4787c62a);
427 CMD5_FF(tempC,tempD,tempA,tempB,iData[ 6],17, 0xa8304613);
428 CMD5_FF(tempB,tempC,tempD,tempA,iData[ 7],22, 0xfd469501);
429 CMD5_FF(tempA,tempB,tempC,tempD,iData[ 8], 7, 0x698098d8);
430 CMD5_FF(tempD,tempA,tempB,tempC,iData[ 9],12, 0x8b44f7af);
431 CMD5_FF(tempC,tempD,tempA,tempB,iData[10],17, 0xffff5bb1);
432 CMD5_FF(tempB,tempC,tempD,tempA,iData[11],22, 0x895cd7be);
433 CMD5_FF(tempA,tempB,tempC,tempD,iData[12], 7, 0x6b901122);
434 CMD5_FF(tempD,tempA,tempB,tempC,iData[13],12, 0xfd987193);
435 CMD5_FF(tempC,tempD,tempA,tempB,iData[14],17, 0xa679438e);
436 CMD5_FF(tempB,tempC,tempD,tempA,iData[15],22, 0x49b40821);
438 CMD5_GG(tempA,tempB,tempC,tempD,iData[ 1], 5, 0xf61e2562);
439 CMD5_GG(tempD,tempA,tempB,tempC,iData[ 6], 9, 0xc040b340);
440 CMD5_GG(tempC,tempD,tempA,tempB,iData[11],14, 0x265e5a51);
441 CMD5_GG(tempB,tempC,tempD,tempA,iData[ 0],20, 0xe9b6c7aa);
442 CMD5_GG(tempA,tempB,tempC,tempD,iData[ 5], 5, 0xd62f105d);
443 CMD5_GG(tempD,tempA,tempB,tempC,iData[10], 9, 0x02441453);
444 CMD5_GG(tempC,tempD,tempA,tempB,iData[15],14, 0xd8a1e681);
445 CMD5_GG(tempB,tempC,tempD,tempA,iData[ 4],20, 0xe7d3fbc8);
446 CMD5_GG(tempA,tempB,tempC,tempD,iData[ 9], 5, 0x21e1cde6);
447 CMD5_GG(tempD,tempA,tempB,tempC,iData[14], 9, 0xc33707d6);
448 CMD5_GG(tempC,tempD,tempA,tempB,iData[ 3],14, 0xf4d50d87);
449 CMD5_GG(tempB,tempC,tempD,tempA,iData[ 8],20, 0x455a14ed);
450 CMD5_GG(tempA,tempB,tempC,tempD,iData[13], 5, 0xa9e3e905);
451 CMD5_GG(tempD,tempA,tempB,tempC,iData[ 2], 9, 0xfcefa3f8);
452 CMD5_GG(tempC,tempD,tempA,tempB,iData[ 7],14, 0x676f02d9);
453 CMD5_GG(tempB,tempC,tempD,tempA,iData[12],20, 0x8d2a4c8a);
455 CMD5_HH(tempA,tempB,tempC,tempD,iData[ 5], 4, 0xfffa3942);
456 CMD5_HH(tempD,tempA,tempB,tempC,iData[ 8],11, 0x8771f681);
457 CMD5_HH(tempC,tempD,tempA,tempB,iData[11],16, 0x6d9d6122);
458 CMD5_HH(tempB,tempC,tempD,tempA,iData[14],23, 0xfde5380c);
459 CMD5_HH(tempA,tempB,tempC,tempD,iData[ 1], 4, 0xa4beea44);
460 CMD5_HH(tempD,tempA,tempB,tempC,iData[ 4],11, 0x4bdecfa9);
461 CMD5_HH(tempC,tempD,tempA,tempB,iData[ 7],16, 0xf6bb4b60);
462 CMD5_HH(tempB,tempC,tempD,tempA,iData[10],23, 0xbebfbc70);
463 CMD5_HH(tempA,tempB,tempC,tempD,iData[13], 4, 0x289b7ec6);
464 CMD5_HH(tempD,tempA,tempB,tempC,iData[ 0],11, 0xeaa127fa);
465 CMD5_HH(tempC,tempD,tempA,tempB,iData[ 3],16, 0xd4ef3085);
466 CMD5_HH(tempB,tempC,tempD,tempA,iData[ 6],23, 0x04881d05);
467 CMD5_HH(tempA,tempB,tempC,tempD,iData[ 9], 4, 0xd9d4d039);
468 CMD5_HH(tempD,tempA,tempB,tempC,iData[12],11, 0xe6db99e5);
469 CMD5_HH(tempC,tempD,tempA,tempB,iData[15],16, 0x1fa27cf8);
470 CMD5_HH(tempB,tempC,tempD,tempA,iData[ 2],23, 0xc4ac5665);
472 CMD5_II(tempA,tempB,tempC,tempD,iData[ 0], 6, 0xf4292244);
473 CMD5_II(tempD,tempA,tempB,tempC,iData[ 7],10, 0x432aff97);
474 CMD5_II(tempC,tempD,tempA,tempB,iData[14],15, 0xab9423a7);
475 CMD5_II(tempB,tempC,tempD,tempA,iData[ 5],21, 0xfc93a039);
476 CMD5_II(tempA,tempB,tempC,tempD,iData[12], 6, 0x655b59c3);
477 CMD5_II(tempD,tempA,tempB,tempC,iData[ 3],10, 0x8f0ccc92);
478 CMD5_II(tempC,tempD,tempA,tempB,iData[10],15, 0xffeff47d);
479 CMD5_II(tempB,tempC,tempD,tempA,iData[ 1],21, 0x85845dd1);
480 CMD5_II(tempA,tempB,tempC,tempD,iData[ 8], 6, 0x6fa87e4f);
481 CMD5_II(tempD,tempA,tempB,tempC,iData[15],10, 0xfe2ce6e0);
482 CMD5_II(tempC,tempD,tempA,tempB,iData[ 6],15, 0xa3014314);
483 CMD5_II(tempB,tempC,tempD,tempA,iData[13],21, 0x4e0811a1);
484 CMD5_II(tempA,tempB,tempC,tempD,iData[ 4], 6, 0xf7537e82);
485 CMD5_II(tempD,tempA,tempB,tempC,iData[11],10, 0xbd3af235);
486 CMD5_II(tempC,tempD,tempA,tempB,iData[ 2],15, 0x2ad7d2bb);
487 CMD5_II(tempB,tempC,tempD,tempA,iData[ 9],21, 0xeb86d391);
497 void CMD5Impl::DoFinal(void)
500 const TUint ul128=128;
504 iData[iNl>>2] = ul128;
507 iData[iNl>>2] += ul128<<8;
510 iData[iNl>>2] += ul128<<16;
513 iData[iNl>>2] += ul128<<24;
523 Mem::FillZ(iData,14*sizeof(TUint));
527 const TUint offset=(iNl+4)>>2;
528 Mem::FillZ(iData+offset,(14-offset)*sizeof(TUint));
531 iData[14]=iNh<<3;//number in bits
532 // this will fail if the total input length is longer than 2^32 in bits
533 //(2^31 in bytes) which is roughly half a gig.
537 // Generate hash value into iHash
540 iHash[0]=(TUint8)(tmp & 255);
541 iHash[1]=(TUint8)((tmp >>= 8) & 255);
542 iHash[2]=(TUint8)((tmp >>= 8) & 255);
543 iHash[3]=(TUint8)((tmp >>= 8) & 255);
546 iHash[4]=(TUint8)(tmp & 255);
547 iHash[5]=(TUint8)((tmp >>= 8) & 255);
548 iHash[6]=(TUint8)((tmp >>= 8) & 255);
549 iHash[7]=(TUint8)((tmp >>= 8) & 255);
552 iHash[8]=(TUint8)(tmp & 255);
553 iHash[9]=(TUint8)((tmp >>= 8) & 255);
554 iHash[10]=(TUint8)((tmp >>= 8) & 255);
555 iHash[11]=(TUint8)((tmp >>= 8) & 255);
558 iHash[12]=(TUint8)(tmp & 255);
559 iHash[13]=(TUint8)((tmp >>= 8) & 255);
560 iHash[14]=(TUint8)((tmp >>= 8) & 255);
561 iHash[15]=(TUint8)((tmp >>= 8) & 255);
564 void CMD5Impl::RestoreState()
572 Mem::Copy(&iData[0], &iDataCopy[0], KMD5BlockSize*sizeof(TUint));
575 void CMD5Impl::StoreState()
583 Mem::Copy(&iDataCopy[0], &iData[0], KMD5BlockSize*sizeof(TUint));
586 void CMD5Impl::SetOperationModeL(TUid /*aOperationMode*/)
588 User::Leave(KErrNotSupported);
591 void CMD5Impl::SetKeyL(const CKey& /*aKey*/)
593 User::Leave(KErrNotSupported);