1*f6dc9357SAndroid Build Coastguard Worker // HmacSha256.cpp
2*f6dc9357SAndroid Build Coastguard Worker
3*f6dc9357SAndroid Build Coastguard Worker #include "StdAfx.h"
4*f6dc9357SAndroid Build Coastguard Worker
5*f6dc9357SAndroid Build Coastguard Worker #include <string.h>
6*f6dc9357SAndroid Build Coastguard Worker
7*f6dc9357SAndroid Build Coastguard Worker #include "../../../C/CpuArch.h"
8*f6dc9357SAndroid Build Coastguard Worker
9*f6dc9357SAndroid Build Coastguard Worker #include "HmacSha256.h"
10*f6dc9357SAndroid Build Coastguard Worker
11*f6dc9357SAndroid Build Coastguard Worker namespace NCrypto {
12*f6dc9357SAndroid Build Coastguard Worker namespace NSha256 {
13*f6dc9357SAndroid Build Coastguard Worker
SetKey(const Byte * key,size_t keySize)14*f6dc9357SAndroid Build Coastguard Worker void CHmac::SetKey(const Byte *key, size_t keySize)
15*f6dc9357SAndroid Build Coastguard Worker {
16*f6dc9357SAndroid Build Coastguard Worker MY_ALIGN (16)
17*f6dc9357SAndroid Build Coastguard Worker UInt32 temp[SHA256_NUM_BLOCK_WORDS];
18*f6dc9357SAndroid Build Coastguard Worker size_t i;
19*f6dc9357SAndroid Build Coastguard Worker
20*f6dc9357SAndroid Build Coastguard Worker for (i = 0; i < SHA256_NUM_BLOCK_WORDS; i++)
21*f6dc9357SAndroid Build Coastguard Worker temp[i] = 0;
22*f6dc9357SAndroid Build Coastguard Worker
23*f6dc9357SAndroid Build Coastguard Worker if (keySize > kBlockSize)
24*f6dc9357SAndroid Build Coastguard Worker {
25*f6dc9357SAndroid Build Coastguard Worker Sha256_Init(&_sha);
26*f6dc9357SAndroid Build Coastguard Worker Sha256_Update(&_sha, key, keySize);
27*f6dc9357SAndroid Build Coastguard Worker Sha256_Final(&_sha, (Byte *)temp);
28*f6dc9357SAndroid Build Coastguard Worker }
29*f6dc9357SAndroid Build Coastguard Worker else
30*f6dc9357SAndroid Build Coastguard Worker memcpy(temp, key, keySize);
31*f6dc9357SAndroid Build Coastguard Worker
32*f6dc9357SAndroid Build Coastguard Worker for (i = 0; i < SHA256_NUM_BLOCK_WORDS; i++)
33*f6dc9357SAndroid Build Coastguard Worker temp[i] ^= 0x36363636;
34*f6dc9357SAndroid Build Coastguard Worker
35*f6dc9357SAndroid Build Coastguard Worker Sha256_Init(&_sha);
36*f6dc9357SAndroid Build Coastguard Worker Sha256_Update(&_sha, (const Byte *)temp, kBlockSize);
37*f6dc9357SAndroid Build Coastguard Worker
38*f6dc9357SAndroid Build Coastguard Worker for (i = 0; i < SHA256_NUM_BLOCK_WORDS; i++)
39*f6dc9357SAndroid Build Coastguard Worker temp[i] ^= 0x36363636 ^ 0x5C5C5C5C;
40*f6dc9357SAndroid Build Coastguard Worker
41*f6dc9357SAndroid Build Coastguard Worker Sha256_Init(&_sha2);
42*f6dc9357SAndroid Build Coastguard Worker Sha256_Update(&_sha2, (const Byte *)temp, kBlockSize);
43*f6dc9357SAndroid Build Coastguard Worker }
44*f6dc9357SAndroid Build Coastguard Worker
45*f6dc9357SAndroid Build Coastguard Worker
Final(Byte * mac)46*f6dc9357SAndroid Build Coastguard Worker void CHmac::Final(Byte *mac)
47*f6dc9357SAndroid Build Coastguard Worker {
48*f6dc9357SAndroid Build Coastguard Worker Sha256_Final(&_sha, mac);
49*f6dc9357SAndroid Build Coastguard Worker Sha256_Update(&_sha2, mac, SHA256_DIGEST_SIZE);
50*f6dc9357SAndroid Build Coastguard Worker Sha256_Final(&_sha2, mac);
51*f6dc9357SAndroid Build Coastguard Worker }
52*f6dc9357SAndroid Build Coastguard Worker
53*f6dc9357SAndroid Build Coastguard Worker }}
54