// HmacSha256.cpp #include "StdAfx.h" #include #include "../../../C/CpuArch.h" #include "HmacSha256.h" namespace NCrypto { namespace NSha256 { void CHmac::SetKey(const Byte *key, size_t keySize) { MY_ALIGN (16) UInt32 temp[SHA256_NUM_BLOCK_WORDS]; size_t i; for (i = 0; i < SHA256_NUM_BLOCK_WORDS; i++) temp[i] = 0; if (keySize > kBlockSize) { Sha256_Init(&_sha); Sha256_Update(&_sha, key, keySize); Sha256_Final(&_sha, (Byte *)temp); } else memcpy(temp, key, keySize); for (i = 0; i < SHA256_NUM_BLOCK_WORDS; i++) temp[i] ^= 0x36363636; Sha256_Init(&_sha); Sha256_Update(&_sha, (const Byte *)temp, kBlockSize); for (i = 0; i < SHA256_NUM_BLOCK_WORDS; i++) temp[i] ^= 0x36363636 ^ 0x5C5C5C5C; Sha256_Init(&_sha2); Sha256_Update(&_sha2, (const Byte *)temp, kBlockSize); } void CHmac::Final(Byte *mac) { Sha256_Final(&_sha, mac); Sha256_Update(&_sha2, mac, SHA256_DIGEST_SIZE); Sha256_Final(&_sha2, mac); } }}