Crypto++ 8.0 Free C++ class library of cryptographic schemes

hmac.cpp
1 // hmac.cpp - originally 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
9 NAMESPACE_BEGIN(CryptoPP)
10
11 void 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
43 void 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
51 void HMAC_Base::Restart()
52 {
53 if (m_innerHashKeyed)
54 {
55 AccessHash().Restart();
56 m_innerHashKeyed = false;
57 }
58 }
59
60 void HMAC_Base::Update(const byte *input, size_t length)
61 {
62 if (!m_innerHashKeyed)
63 KeyInnerHash();
64 AccessHash().Update(input, length);
65 }
66
67 void 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
84 NAMESPACE_END
85
86 #endif
HashTransformation::BlockSize
virtual unsigned int BlockSize() const
Provides the block size of the compression function.
Definition: cryptlib.h:1137
Name::DigestSize
const char * DigestSize()
int, in bytes
Definition: argnames.h:79
InvalidArgument
An invalid argument was detected.
Definition: cryptlib.h:202
HashTransformation::TruncatedFinal
virtual void TruncatedFinal(byte *digest, size_t digestSize)=0
Computes the hash of the current message.
hmac.h
Classes for HMAC message authentication codes.
HMAC_Base
HMAC information.
Definition: hmac.h:17
HashTransformation::Restart
virtual void Restart()
Restart the hash.
Definition: cryptlib.h:1119
pch.h
Precompiled header file.
HMAC_Base::Update
void Update(const byte *input, size_t length)
Updates a hash with additional input.
Definition: hmac.cpp:60
HMAC_Base::Restart
void Restart()
Restart the hash.
Definition: hmac.cpp:51
CRYPTOPP_ASSERT
#define CRYPTOPP_ASSERT(exp)
Debugging and diagnostic assertion.
Definition: trap.h:69
HMAC_Base::TruncatedFinal
void TruncatedFinal(byte *mac, size_t size)
Computes the hash of the current message.
Definition: hmac.cpp:67
Name::BlockSize
const char * BlockSize()
int, in bytes
Definition: argnames.h:27
HashTransformation::DigestSize
virtual unsigned int DigestSize() const =0
Provides the digest size of the hash.
HashTransformation
Interface for hash functions and data processing part of MACs.
Definition: cryptlib.h:1084
CryptoPP
Crypto++ library namespace.
HashTransformation::Final
virtual void Final(byte *digest)
Computes the hash of the current message.
Definition: cryptlib.h:1114
HashTransformation::Update
virtual void Update(const byte *input, size_t length)=0
Updates a hash with additional input.
NameValuePairs
Interface for retrieving values given their names.
Definition: cryptlib.h:293