1 // HmacSha1.cpp
2
3 #include "StdAfx.h"
4
5 #include <string.h>
6
7 #include "../../../C/CpuArch.h"
8
9 #include "HmacSha1.h"
10
11 namespace NCrypto {
12 namespace NSha1 {
13
SetKey(const Byte * key,size_t keySize)14 void CHmac::SetKey(const Byte *key, size_t keySize)
15 {
16 MY_ALIGN (16)
17 UInt32 temp[SHA1_NUM_BLOCK_WORDS];
18 size_t i;
19
20 for (i = 0; i < SHA1_NUM_BLOCK_WORDS; i++)
21 temp[i] = 0;
22
23 if (keySize > kBlockSize)
24 {
25 _sha.Init();
26 _sha.Update(key, keySize);
27 _sha.Final((Byte *)temp);
28 }
29 else
30 memcpy(temp, key, keySize);
31
32 for (i = 0; i < SHA1_NUM_BLOCK_WORDS; i++)
33 temp[i] ^= 0x36363636;
34
35 _sha.Init();
36 _sha.Update((const Byte *)temp, kBlockSize);
37
38 for (i = 0; i < SHA1_NUM_BLOCK_WORDS; i++)
39 temp[i] ^= 0x36363636 ^ 0x5C5C5C5C;
40
41 _sha2.Init();
42 _sha2.Update((const Byte *)temp, kBlockSize);
43 }
44
45
Final(Byte * mac)46 void CHmac::Final(Byte *mac)
47 {
48 _sha.Final(mac);
49 _sha2.Update(mac, kDigestSize);
50 _sha2.Final(mac);
51 }
52
53
GetLoopXorDigest1(void * mac,UInt32 numIteration)54 void CHmac::GetLoopXorDigest1(void *mac, UInt32 numIteration)
55 {
56 MY_ALIGN (16) UInt32 block [SHA1_NUM_BLOCK_WORDS];
57 MY_ALIGN (16) UInt32 block2[SHA1_NUM_BLOCK_WORDS];
58 MY_ALIGN (16) UInt32 mac2 [SHA1_NUM_BLOCK_WORDS];
59
60 _sha. PrepareBlock((Byte *)block, SHA1_DIGEST_SIZE);
61 _sha2.PrepareBlock((Byte *)block2, SHA1_DIGEST_SIZE);
62
63 block[0] = ((const UInt32 *)mac)[0];
64 block[1] = ((const UInt32 *)mac)[1];
65 block[2] = ((const UInt32 *)mac)[2];
66 block[3] = ((const UInt32 *)mac)[3];
67 block[4] = ((const UInt32 *)mac)[4];
68
69 mac2[0] = block[0];
70 mac2[1] = block[1];
71 mac2[2] = block[2];
72 mac2[3] = block[3];
73 mac2[4] = block[4];
74
75 for (UInt32 i = 0; i < numIteration; i++)
76 {
77 _sha. GetBlockDigest((const Byte *)block, (Byte *)block2);
78 _sha2.GetBlockDigest((const Byte *)block2, (Byte *)block);
79
80 mac2[0] ^= block[0];
81 mac2[1] ^= block[1];
82 mac2[2] ^= block[2];
83 mac2[3] ^= block[3];
84 mac2[4] ^= block[4];
85 }
86
87 ((UInt32 *)mac)[0] = mac2[0];
88 ((UInt32 *)mac)[1] = mac2[1];
89 ((UInt32 *)mac)[2] = mac2[2];
90 ((UInt32 *)mac)[3] = mac2[3];
91 ((UInt32 *)mac)[4] = mac2[4];
92 }
93
94 }}
95