rlm@1
|
1 // Pbkdf2HmacSha1.cpp
|
rlm@1
|
2
|
rlm@1
|
3 #include "StdAfx.h"
|
rlm@1
|
4
|
rlm@1
|
5 #include "HmacSha1.h"
|
rlm@1
|
6
|
rlm@1
|
7 namespace NCrypto {
|
rlm@1
|
8 namespace NSha1 {
|
rlm@1
|
9
|
rlm@1
|
10 void Pbkdf2Hmac(const Byte *pwd, size_t pwdSize, const Byte *salt, size_t saltSize,
|
rlm@1
|
11 UInt32 numIterations, Byte *key, size_t keySize)
|
rlm@1
|
12 {
|
rlm@1
|
13 CHmac baseCtx;
|
rlm@1
|
14 baseCtx.SetKey(pwd, pwdSize);
|
rlm@1
|
15 for (UInt32 i = 1; keySize > 0; i++)
|
rlm@1
|
16 {
|
rlm@1
|
17 CHmac ctx = baseCtx;
|
rlm@1
|
18 ctx.Update(salt, saltSize);
|
rlm@1
|
19 Byte u[kDigestSize] = { (Byte)(i >> 24), (Byte)(i >> 16), (Byte)(i >> 8), (Byte)(i) };
|
rlm@1
|
20 const unsigned int curSize = (keySize < kDigestSize) ? (unsigned int)keySize : kDigestSize;
|
rlm@1
|
21 ctx.Update(u, 4);
|
rlm@1
|
22 ctx.Final(u, kDigestSize);
|
rlm@1
|
23
|
rlm@1
|
24 unsigned int s;
|
rlm@1
|
25 for (s = 0; s < curSize; s++)
|
rlm@1
|
26 key[s] = u[s];
|
rlm@1
|
27
|
rlm@1
|
28 for (UInt32 j = numIterations; j > 1; j--)
|
rlm@1
|
29 {
|
rlm@1
|
30 ctx = baseCtx;
|
rlm@1
|
31 ctx.Update(u, kDigestSize);
|
rlm@1
|
32 ctx.Final(u, kDigestSize);
|
rlm@1
|
33 for (s = 0; s < curSize; s++)
|
rlm@1
|
34 key[s] ^= u[s];
|
rlm@1
|
35 }
|
rlm@1
|
36
|
rlm@1
|
37 key += curSize;
|
rlm@1
|
38 keySize -= curSize;
|
rlm@1
|
39 }
|
rlm@1
|
40 }
|
rlm@1
|
41
|
rlm@1
|
42 void Pbkdf2Hmac32(const Byte *pwd, size_t pwdSize, const UInt32 *salt, size_t saltSize,
|
rlm@1
|
43 UInt32 numIterations, UInt32 *key, size_t keySize)
|
rlm@1
|
44 {
|
rlm@1
|
45 CHmac32 baseCtx;
|
rlm@1
|
46 baseCtx.SetKey(pwd, pwdSize);
|
rlm@1
|
47 for (UInt32 i = 1; keySize > 0; i++)
|
rlm@1
|
48 {
|
rlm@1
|
49 CHmac32 ctx = baseCtx;
|
rlm@1
|
50 ctx.Update(salt, saltSize);
|
rlm@1
|
51 UInt32 u[kDigestSizeInWords] = { i };
|
rlm@1
|
52 const unsigned int curSize = (keySize < kDigestSizeInWords) ? (unsigned int)keySize : kDigestSizeInWords;
|
rlm@1
|
53 ctx.Update(u, 1);
|
rlm@1
|
54 ctx.Final(u, kDigestSizeInWords);
|
rlm@1
|
55
|
rlm@1
|
56 // Speed-optimized code start
|
rlm@1
|
57 ctx = baseCtx;
|
rlm@1
|
58 ctx.GetLoopXorDigest(u, numIterations - 1);
|
rlm@1
|
59 // Speed-optimized code end
|
rlm@1
|
60
|
rlm@1
|
61 unsigned int s;
|
rlm@1
|
62 for (s = 0; s < curSize; s++)
|
rlm@1
|
63 key[s] = u[s];
|
rlm@1
|
64
|
rlm@1
|
65 /*
|
rlm@1
|
66 // Default code start
|
rlm@1
|
67 for (UInt32 j = numIterations; j > 1; j--)
|
rlm@1
|
68 {
|
rlm@1
|
69 ctx = baseCtx;
|
rlm@1
|
70 ctx.Update(u, kDigestSizeInWords);
|
rlm@1
|
71 ctx.Final(u, kDigestSizeInWords);
|
rlm@1
|
72 for (s = 0; s < curSize; s++)
|
rlm@1
|
73 key[s] ^= u[s];
|
rlm@1
|
74 }
|
rlm@1
|
75 // Default code end
|
rlm@1
|
76 */
|
rlm@1
|
77
|
rlm@1
|
78 key += curSize;
|
rlm@1
|
79 keySize -= curSize;
|
rlm@1
|
80 }
|
rlm@1
|
81 }
|
rlm@1
|
82
|
rlm@1
|
83 }}
|