Coverage Report

Created: 2024-11-21 07:03

/src/cryptopp/hmac.cpp
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