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 +}}