hmac_sha512.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_sha512.h>
   6  
   7  #include <crypto/sha512.h>
   8  #include <support/cleanse.h>
   9  
  10  #include <cstring>
  11  
  12  CHMAC_SHA512::CHMAC_SHA512(const unsigned char* key, size_t keylen)
  13  {
  14      unsigned char rkey[128];
  15      if (keylen <= 128) {
  16          memcpy(rkey, key, keylen);
  17          memset(rkey + keylen, 0, 128 - keylen);
  18      } else {
  19          CSHA512().Write(key, keylen).Finalize(rkey);
  20          memset(rkey + 64, 0, 64);
  21      }
  22  
  23      for (int n = 0; n < 128; n++)
  24          rkey[n] ^= 0x5c;
  25      outer.Write(rkey, 128);
  26  
  27      for (int n = 0; n < 128; n++)
  28          rkey[n] ^= 0x5c ^ 0x36;
  29      inner.Write(rkey, 128);
  30  
  31      memory_cleanse(rkey, sizeof(rkey));
  32  }
  33  
  34  void CHMAC_SHA512::Finalize(unsigned char hash[OUTPUT_SIZE])
  35  {
  36      unsigned char temp[64];
  37      inner.Finalize(temp);
  38      outer.Write(temp, 64).Finalize(hash);
  39      memory_cleanse(temp, sizeof(temp));
  40  }
  41