source: git/src-cryptopp/hmac.cpp

Last change on this file was e230cb0, checked in by David Stainton <dstainton415@…>, at 2016-10-12T13:27:29Z

Add cryptopp from tag CRYPTOPP_5_6_5

  • Property mode set to 100644
File size: 1.9 KB
Line 
1// hmac.cpp - written and placed in the public domain by Wei Dai
2
3#include "pch.h"
4
5#ifndef CRYPTOPP_IMPORTS
6
7#include "hmac.h"
8
9NAMESPACE_BEGIN(CryptoPP)
10
11void HMAC_Base::UncheckedSetKey(const byte *userKey, unsigned int keylength, const NameValuePairs &)
12{
13        AssertValidKeyLength(keylength);
14
15        Restart();
16
17        HashTransformation &hash = AccessHash();
18        unsigned int blockSize = hash.BlockSize();
19
20        if (!blockSize)
21                throw InvalidArgument("HMAC: can only be used with a block-based hash function");
22
23        m_buf.resize(2*AccessHash().BlockSize() + AccessHash().DigestSize());
24
25        if (keylength <= blockSize)
26                memcpy(AccessIpad(), userKey, keylength);
27        else
28        {
29                AccessHash().CalculateDigest(AccessIpad(), userKey, keylength);
30                keylength = hash.DigestSize();
31        }
32
33        CRYPTOPP_ASSERT(keylength <= blockSize);
34        memset(AccessIpad()+keylength, 0, blockSize-keylength);
35
36        for (unsigned int i=0; i<blockSize; i++)
37        {
38                AccessOpad()[i] = AccessIpad()[i] ^ 0x5c;
39                AccessIpad()[i] ^= 0x36;
40        }
41}
42
43void HMAC_Base::KeyInnerHash()
44{
45        CRYPTOPP_ASSERT(!m_innerHashKeyed);
46        HashTransformation &hash = AccessHash();
47        hash.Update(AccessIpad(), hash.BlockSize());
48        m_innerHashKeyed = true;
49}
50
51void HMAC_Base::Restart()
52{
53        if (m_innerHashKeyed)
54        {
55                AccessHash().Restart();
56                m_innerHashKeyed = false;
57        }
58}
59
60void HMAC_Base::Update(const byte *input, size_t length)
61{
62        if (!m_innerHashKeyed)
63                KeyInnerHash();
64        AccessHash().Update(input, length);
65}
66
67void HMAC_Base::TruncatedFinal(byte *mac, size_t size)
68{
69        ThrowIfInvalidTruncatedSize(size);
70
71        HashTransformation &hash = AccessHash();
72
73        if (!m_innerHashKeyed)
74                KeyInnerHash();
75        hash.Final(AccessInnerHash());
76
77        hash.Update(AccessOpad(), hash.BlockSize());
78        hash.Update(AccessInnerHash(), hash.DigestSize());
79        hash.TruncatedFinal(mac, size);
80
81        m_innerHashKeyed = false;
82}
83
84NAMESPACE_END
85
86#endif
Note: See TracBrowser for help on using the repository browser.