annotate 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
rev   line source
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 }}