hmac_sha256.cpp raw

   1  // Copyright (c) 2014-present The Bitcoin Core developers
   2  // Distributed under the MIT software license, see the accompanying
   3  // file COPYING or http://www.opensource.org/licenses/mit-license.php.
   4  
   5  #include <crypto/hmac_sha256.h>
   6  
   7  #include <crypto/sha256.h>
   8  #include <support/cleanse.h>
   9  
  10  #include <cstring>
  11  
  12  CHMAC_SHA256::CHMAC_SHA256(const unsigned char* key, size_t keylen)
  13  {
  14      unsigned char rkey[64];
  15      if (keylen <= 64) {
  16          memcpy(rkey, key, keylen);
  17          memset(rkey + keylen, 0, 64 - keylen);
  18      } else {
  19          CSHA256().Write(key, keylen).Finalize(rkey);
  20          memset(rkey + 32, 0, 32);
  21      }
  22  
  23      for (int n = 0; n < 64; n++)
  24          rkey[n] ^= 0x5c;
  25      outer.Write(rkey, 64);
  26  
  27      for (int n = 0; n < 64; n++)
  28          rkey[n] ^= 0x5c ^ 0x36;
  29      inner.Write(rkey, 64);
  30  
  31      memory_cleanse(rkey, sizeof(rkey));
  32  }
  33  
  34  void CHMAC_SHA256::Finalize(unsigned char hash[OUTPUT_SIZE])
  35  {
  36      unsigned char temp[32];
  37      inner.Finalize(temp);
  38      outer.Write(temp, 32).Finalize(hash);
  39      memory_cleanse(temp, sizeof(temp));
  40  }
  41