rlm@1
|
1 // HmacSha1.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 CHmac::SetKey(const Byte *key, size_t keySize)
|
rlm@1
|
11 {
|
rlm@1
|
12 Byte keyTemp[kBlockSize];
|
rlm@1
|
13 size_t i;
|
rlm@1
|
14 for (i = 0; i < kBlockSize; i++)
|
rlm@1
|
15 keyTemp[i] = 0;
|
rlm@1
|
16 if(keySize > kBlockSize)
|
rlm@1
|
17 {
|
rlm@1
|
18 _sha.Init();
|
rlm@1
|
19 _sha.Update(key, keySize);
|
rlm@1
|
20 _sha.Final(keyTemp);
|
rlm@1
|
21 keySize = kDigestSize;
|
rlm@1
|
22 }
|
rlm@1
|
23 else
|
rlm@1
|
24 for (i = 0; i < keySize; i++)
|
rlm@1
|
25 keyTemp[i] = key[i];
|
rlm@1
|
26 for (i = 0; i < kBlockSize; i++)
|
rlm@1
|
27 keyTemp[i] ^= 0x36;
|
rlm@1
|
28 _sha.Init();
|
rlm@1
|
29 _sha.Update(keyTemp, kBlockSize);
|
rlm@1
|
30 for (i = 0; i < kBlockSize; i++)
|
rlm@1
|
31 keyTemp[i] ^= 0x36 ^ 0x5C;
|
rlm@1
|
32 _sha2.Init();
|
rlm@1
|
33 _sha2.Update(keyTemp, kBlockSize);
|
rlm@1
|
34 }
|
rlm@1
|
35
|
rlm@1
|
36 void CHmac::Final(Byte *mac, size_t macSize)
|
rlm@1
|
37 {
|
rlm@1
|
38 Byte digest[kDigestSize];
|
rlm@1
|
39 _sha.Final(digest);
|
rlm@1
|
40 _sha2.Update(digest, kDigestSize);
|
rlm@1
|
41 _sha2.Final(digest);
|
rlm@1
|
42 for(size_t i = 0; i < macSize; i++)
|
rlm@1
|
43 mac[i] = digest[i];
|
rlm@1
|
44 }
|
rlm@1
|
45
|
rlm@1
|
46
|
rlm@1
|
47 void CHmac32::SetKey(const Byte *key, size_t keySize)
|
rlm@1
|
48 {
|
rlm@1
|
49 UInt32 keyTemp[kBlockSizeInWords];
|
rlm@1
|
50 size_t i;
|
rlm@1
|
51 for (i = 0; i < kBlockSizeInWords; i++)
|
rlm@1
|
52 keyTemp[i] = 0;
|
rlm@1
|
53 if(keySize > kBlockSize)
|
rlm@1
|
54 {
|
rlm@1
|
55 CContext sha;
|
rlm@1
|
56 sha.Init();
|
rlm@1
|
57 sha.Update(key, keySize);
|
rlm@1
|
58 Byte digest[kDigestSize];
|
rlm@1
|
59 sha.Final(digest);
|
rlm@1
|
60
|
rlm@1
|
61 for (int i = 0 ; i < kDigestSizeInWords; i++)
|
rlm@1
|
62 keyTemp[i] =
|
rlm@1
|
63 ((UInt32)(digest[i * 4 + 0]) << 24) |
|
rlm@1
|
64 ((UInt32)(digest[i * 4 + 1]) << 16) |
|
rlm@1
|
65 ((UInt32)(digest[i * 4 + 2]) << 8) |
|
rlm@1
|
66 ((UInt32)(digest[i * 4 + 3]));
|
rlm@1
|
67 keySize = kDigestSizeInWords;
|
rlm@1
|
68 }
|
rlm@1
|
69 else
|
rlm@1
|
70 for (size_t i = 0; i < keySize; i++)
|
rlm@1
|
71 keyTemp[i / 4] |= (key[i] << (24 - 8 * (i & 3)));
|
rlm@1
|
72 for (i = 0; i < kBlockSizeInWords; i++)
|
rlm@1
|
73 keyTemp[i] ^= 0x36363636;
|
rlm@1
|
74 _sha.Init();
|
rlm@1
|
75 _sha.Update(keyTemp, kBlockSizeInWords);
|
rlm@1
|
76 for (i = 0; i < kBlockSizeInWords; i++)
|
rlm@1
|
77 keyTemp[i] ^= 0x36363636 ^ 0x5C5C5C5C;
|
rlm@1
|
78 _sha2.Init();
|
rlm@1
|
79 _sha2.Update(keyTemp, kBlockSizeInWords);
|
rlm@1
|
80 }
|
rlm@1
|
81
|
rlm@1
|
82 void CHmac32::Final(UInt32 *mac, size_t macSize)
|
rlm@1
|
83 {
|
rlm@1
|
84 UInt32 digest[kDigestSizeInWords];
|
rlm@1
|
85 _sha.Final(digest);
|
rlm@1
|
86 _sha2.Update(digest, kDigestSizeInWords);
|
rlm@1
|
87 _sha2.Final(digest);
|
rlm@1
|
88 for(size_t i = 0; i < macSize; i++)
|
rlm@1
|
89 mac[i] = digest[i];
|
rlm@1
|
90 }
|
rlm@1
|
91
|
rlm@1
|
92 void CHmac32::GetLoopXorDigest(UInt32 *mac, UInt32 numIteration)
|
rlm@1
|
93 {
|
rlm@1
|
94 UInt32 block[kBlockSizeInWords];
|
rlm@1
|
95 UInt32 block2[kBlockSizeInWords];
|
rlm@1
|
96 _sha.PrepareBlock(block, kDigestSizeInWords);
|
rlm@1
|
97 _sha2.PrepareBlock(block2, kDigestSizeInWords);
|
rlm@1
|
98 for(unsigned int s = 0; s < kDigestSizeInWords; s++)
|
rlm@1
|
99 block[s] = mac[s];
|
rlm@1
|
100 for(UInt32 i = 0; i < numIteration; i++)
|
rlm@1
|
101 {
|
rlm@1
|
102 _sha.GetBlockDigest(block, block2);
|
rlm@1
|
103 _sha2.GetBlockDigest(block2, block);
|
rlm@1
|
104 for (unsigned int s = 0; s < kDigestSizeInWords; s++)
|
rlm@1
|
105 mac[s] ^= block[s];
|
rlm@1
|
106 }
|
rlm@1
|
107 }
|
rlm@1
|
108
|
rlm@1
|
109 }}
|