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