20 #ifndef _ANCH_CRYPTO_HMAC_ 21 #define _ANCH_CRYPTO_HMAC_ 38 H
HMAC(
const std::string& key,
const std::string& message) {
40 std::ostringstream keyBuf;
41 const std::size_t block = H::getBlockSize();
42 if(key.length() > block) {
47 std::array<uint8_t,block> keyArray;
49 const std::string& buffer = keyBuf.str();
50 for(std::size_t i = 0 ; i < buffer.length() ; ++i) {
51 keyArray[i] =
static_cast<uint8_t
>(buffer[i]);
56 std::size_t msgLen = message.length();
57 std::size_t inSize = block + msgLen;
58 uint8_t* inPad =
new uint8_t[inSize];
59 std::array<uint8_t, (block + H::getOutputSize())> outPad;
61 for(std::size_t i = 0 ; i < block ; ++i) {
62 inPad[i] =
static_cast<uint8_t
>(0x36) ^ keyArray[i];
63 outPad[i] =
static_cast<uint8_t
>(0x5c) ^ keyArray[i];
68 const uint8_t* msg =
reinterpret_cast<const uint8_t*
>(message.c_str());
69 for(std::size_t i = 0 ; i < msgLen ; ++i) {
70 inPad[i + block] = msg[i];
72 const std::array<uint8_t,H::getOutputSize()>& inDigest = H(inPad, inSize).digest();
77 std::size_t idx = block;
78 for(uint8_t byte : inDigest) {
82 return H(outPad.data(), outPad.size());
94 H
HMAC(
const char*
const key,
const char*
const message) {
95 return HMAC<H>(std::string(key), std::string(message));
101 #endif // _ANCH_CRYPTO_HMAC_ H HMAC(const std::string &, const std::string &)
Definition: hmac.hpp:38
AnCH framework base namespace.
Definition: base64.hpp:28