view src/win32/7zip/7z/CPP/7zip/Crypto/HmacSha1.cpp @ 1:f9f4f1b99eed

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