bool msl::hmac_sha512(std::string key,const std::string& plain,std::string& hash) { if(key.size()>SHA512_BLOCK_SIZE) { if(!msl::hash_sha512(key,key)) return false; } std::string o_key_pad(SHA512_BLOCK_SIZE,0x5c); std::string i_key_pad(SHA512_BLOCK_SIZE,0x36); for(size_t ii=0;ii<key.size();++ii) { o_key_pad[ii]^=key[ii]; i_key_pad[ii]^=key[ii]; } std::string hash_temp=""; if(!msl::hash_sha512(i_key_pad+plain,hash_temp)||!msl::hash_sha512(o_key_pad+hash_temp,hash_temp)) return false; hash=hash_temp; return true; }
//Computes HMACSHA256 on given plain text and key, outputs a string of bytes. std::string hmac_sha256(std::string key,const std::string& plain) { if(key.size()>SHA256_BLOCK_SIZE) key=hash_sha256(key); std::string o_key_pad(SHA256_BLOCK_SIZE,0x5c); std::string i_key_pad(SHA256_BLOCK_SIZE,0x36); for(size_t ii=0;ii<key.size();++ii) { o_key_pad[ii]^=key[ii]; i_key_pad[ii]^=key[ii]; } std::string hash=hash_sha256(i_key_pad+plain); return hash_sha256(o_key_pad+hash); }