Line | Count | Source (jump to first uncovered line) |
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 | 5.30k | { |
13 | 5.30k | AssertValidKeyLength(keylength); |
14 | | |
15 | 5.30k | Restart(); |
16 | | |
17 | 5.30k | HashTransformation &hash = AccessHash(); |
18 | 5.30k | unsigned int blockSize = hash.BlockSize(); |
19 | | |
20 | 5.30k | if (!blockSize) |
21 | 0 | throw InvalidArgument("HMAC: can only be used with a block-based hash function"); |
22 | | |
23 | 5.30k | m_buf.resize(2*AccessHash().BlockSize() + AccessHash().DigestSize()); |
24 | | |
25 | 5.30k | if (keylength <= blockSize) |
26 | 2.92k | { |
27 | | // hmac.cpp:26:9: runtime error: null pointer passed as argument 2 |
28 | 2.92k | if (AccessIpad() && userKey && keylength) |
29 | 2.54k | std::memcpy(AccessIpad(), userKey, keylength); |
30 | 2.92k | } |
31 | 2.38k | else |
32 | 2.38k | { |
33 | 2.38k | AccessHash().CalculateDigest(AccessIpad(), userKey, keylength); |
34 | 2.38k | keylength = hash.DigestSize(); |
35 | 2.38k | } |
36 | | |
37 | 5.30k | CRYPTOPP_ASSERT(keylength <= blockSize); |
38 | 5.30k | std::memset(AccessIpad()+keylength, 0, blockSize-keylength); |
39 | | |
40 | 507k | for (unsigned int i=0; i<blockSize; i++) |
41 | 502k | { |
42 | 502k | AccessOpad()[i] = AccessIpad()[i] ^ 0x5c; |
43 | 502k | AccessIpad()[i] ^= 0x36; |
44 | 502k | } |
45 | 5.30k | } |
46 | | |
47 | | void HMAC_Base::KeyInnerHash() |
48 | 172k | { |
49 | 172k | CRYPTOPP_ASSERT(!m_innerHashKeyed); |
50 | 172k | HashTransformation &hash = AccessHash(); |
51 | 172k | hash.Update(AccessIpad(), hash.BlockSize()); |
52 | 172k | m_innerHashKeyed = true; |
53 | 172k | } |
54 | | |
55 | | void HMAC_Base::Restart() |
56 | 5.30k | { |
57 | 5.30k | if (m_innerHashKeyed) |
58 | 0 | { |
59 | 0 | AccessHash().Restart(); |
60 | 0 | m_innerHashKeyed = false; |
61 | 0 | } |
62 | 5.30k | } |
63 | | |
64 | | void HMAC_Base::Update(const byte *input, size_t length) |
65 | 810k | { |
66 | 810k | if (!m_innerHashKeyed) |
67 | 172k | KeyInnerHash(); |
68 | 810k | AccessHash().Update(input, length); |
69 | 810k | } |
70 | | |
71 | | void HMAC_Base::TruncatedFinal(byte *mac, size_t size) |
72 | 172k | { |
73 | 172k | ThrowIfInvalidTruncatedSize(size); |
74 | | |
75 | 172k | HashTransformation &hash = AccessHash(); |
76 | | |
77 | 172k | if (!m_innerHashKeyed) |
78 | 0 | KeyInnerHash(); |
79 | 172k | hash.Final(AccessInnerHash()); |
80 | | |
81 | 172k | hash.Update(AccessOpad(), hash.BlockSize()); |
82 | 172k | hash.Update(AccessInnerHash(), hash.DigestSize()); |
83 | 172k | hash.TruncatedFinal(mac, size); |
84 | | |
85 | 172k | m_innerHashKeyed = false; |
86 | 172k | } |
87 | | |
88 | | NAMESPACE_END |
89 | | |
90 | | #endif |