Mercurial > vba-linux
diff 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 diff
1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/src/win32/7zip/7z/CPP/7zip/Crypto/HmacSha1.cpp Sat Mar 03 10:31:27 2012 -0600 1.3 @@ -0,0 +1,109 @@ 1.4 +// HmacSha1.cpp 1.5 + 1.6 +#include "StdAfx.h" 1.7 + 1.8 +#include "HmacSha1.h" 1.9 + 1.10 +namespace NCrypto { 1.11 +namespace NSha1 { 1.12 + 1.13 +void CHmac::SetKey(const Byte *key, size_t keySize) 1.14 +{ 1.15 + Byte keyTemp[kBlockSize]; 1.16 + size_t i; 1.17 + for (i = 0; i < kBlockSize; i++) 1.18 + keyTemp[i] = 0; 1.19 + if(keySize > kBlockSize) 1.20 + { 1.21 + _sha.Init(); 1.22 + _sha.Update(key, keySize); 1.23 + _sha.Final(keyTemp); 1.24 + keySize = kDigestSize; 1.25 + } 1.26 + else 1.27 + for (i = 0; i < keySize; i++) 1.28 + keyTemp[i] = key[i]; 1.29 + for (i = 0; i < kBlockSize; i++) 1.30 + keyTemp[i] ^= 0x36; 1.31 + _sha.Init(); 1.32 + _sha.Update(keyTemp, kBlockSize); 1.33 + for (i = 0; i < kBlockSize; i++) 1.34 + keyTemp[i] ^= 0x36 ^ 0x5C; 1.35 + _sha2.Init(); 1.36 + _sha2.Update(keyTemp, kBlockSize); 1.37 +} 1.38 + 1.39 +void CHmac::Final(Byte *mac, size_t macSize) 1.40 +{ 1.41 + Byte digest[kDigestSize]; 1.42 + _sha.Final(digest); 1.43 + _sha2.Update(digest, kDigestSize); 1.44 + _sha2.Final(digest); 1.45 + for(size_t i = 0; i < macSize; i++) 1.46 + mac[i] = digest[i]; 1.47 +} 1.48 + 1.49 + 1.50 +void CHmac32::SetKey(const Byte *key, size_t keySize) 1.51 +{ 1.52 + UInt32 keyTemp[kBlockSizeInWords]; 1.53 + size_t i; 1.54 + for (i = 0; i < kBlockSizeInWords; i++) 1.55 + keyTemp[i] = 0; 1.56 + if(keySize > kBlockSize) 1.57 + { 1.58 + CContext sha; 1.59 + sha.Init(); 1.60 + sha.Update(key, keySize); 1.61 + Byte digest[kDigestSize]; 1.62 + sha.Final(digest); 1.63 + 1.64 + for (int i = 0 ; i < kDigestSizeInWords; i++) 1.65 + keyTemp[i] = 1.66 + ((UInt32)(digest[i * 4 + 0]) << 24) | 1.67 + ((UInt32)(digest[i * 4 + 1]) << 16) | 1.68 + ((UInt32)(digest[i * 4 + 2]) << 8) | 1.69 + ((UInt32)(digest[i * 4 + 3])); 1.70 + keySize = kDigestSizeInWords; 1.71 + } 1.72 + else 1.73 + for (size_t i = 0; i < keySize; i++) 1.74 + keyTemp[i / 4] |= (key[i] << (24 - 8 * (i & 3))); 1.75 + for (i = 0; i < kBlockSizeInWords; i++) 1.76 + keyTemp[i] ^= 0x36363636; 1.77 + _sha.Init(); 1.78 + _sha.Update(keyTemp, kBlockSizeInWords); 1.79 + for (i = 0; i < kBlockSizeInWords; i++) 1.80 + keyTemp[i] ^= 0x36363636 ^ 0x5C5C5C5C; 1.81 + _sha2.Init(); 1.82 + _sha2.Update(keyTemp, kBlockSizeInWords); 1.83 +} 1.84 + 1.85 +void CHmac32::Final(UInt32 *mac, size_t macSize) 1.86 +{ 1.87 + UInt32 digest[kDigestSizeInWords]; 1.88 + _sha.Final(digest); 1.89 + _sha2.Update(digest, kDigestSizeInWords); 1.90 + _sha2.Final(digest); 1.91 + for(size_t i = 0; i < macSize; i++) 1.92 + mac[i] = digest[i]; 1.93 +} 1.94 + 1.95 +void CHmac32::GetLoopXorDigest(UInt32 *mac, UInt32 numIteration) 1.96 +{ 1.97 + UInt32 block[kBlockSizeInWords]; 1.98 + UInt32 block2[kBlockSizeInWords]; 1.99 + _sha.PrepareBlock(block, kDigestSizeInWords); 1.100 + _sha2.PrepareBlock(block2, kDigestSizeInWords); 1.101 + for(unsigned int s = 0; s < kDigestSizeInWords; s++) 1.102 + block[s] = mac[s]; 1.103 + for(UInt32 i = 0; i < numIteration; i++) 1.104 + { 1.105 + _sha.GetBlockDigest(block, block2); 1.106 + _sha2.GetBlockDigest(block2, block); 1.107 + for (unsigned int s = 0; s < kDigestSizeInWords; s++) 1.108 + mac[s] ^= block[s]; 1.109 + } 1.110 +} 1.111 + 1.112 +}}