Coverage Report

Created: 2024-11-21 07:03

/src/cryptopp/cmac.h
Line
Count
Source (jump to first uncovered line)
1
// cmac.h - originally written and placed in the public domain by Wei Dai
2
3
/// \file cmac.h
4
/// \brief Classes for CMAC message authentication code
5
/// \since Crypto++ 5.6.0
6
7
#ifndef CRYPTOPP_CMAC_H
8
#define CRYPTOPP_CMAC_H
9
10
#include "seckey.h"
11
#include "secblock.h"
12
13
/// \brief Enable CMAC and wide block ciphers
14
/// \details CMAC is only defined for AES. The library can support wide
15
///  block ciphers like Kaylna and Threefish since we know the polynomials.
16
#ifndef CRYPTOPP_CMAC_WIDE_BLOCK_CIPHERS
17
# define CRYPTOPP_CMAC_WIDE_BLOCK_CIPHERS 1
18
#endif  // CRYPTOPP_CMAC_WIDE_BLOCK_CIPHERS
19
20
NAMESPACE_BEGIN(CryptoPP)
21
22
/// \brief CMAC base implementation
23
/// \since Crypto++ 5.6.0
24
class CRYPTOPP_DLL CRYPTOPP_NO_VTABLE CMAC_Base : public MessageAuthenticationCode
25
{
26
public:
27
28
0
  virtual ~CMAC_Base() {}
29
0
  CMAC_Base() : m_counter(0) {}
30
31
  void UncheckedSetKey(const byte *key, unsigned int length, const NameValuePairs &params);
32
  void Update(const byte *input, size_t length);
33
  void TruncatedFinal(byte *mac, size_t size);
34
0
  unsigned int DigestSize() const {return GetCipher().BlockSize();}
35
0
  unsigned int OptimalBlockSize() const {return GetCipher().BlockSize();}
36
0
  unsigned int OptimalDataAlignment() const {return GetCipher().OptimalDataAlignment();}
37
0
  std::string AlgorithmProvider() const {return GetCipher().AlgorithmProvider();}
38
39
protected:
40
  friend class EAX_Base;
41
42
0
  const BlockCipher & GetCipher() const {return const_cast<CMAC_Base*>(this)->AccessCipher();}
43
  virtual BlockCipher & AccessCipher() =0;
44
45
  void ProcessBuf();
46
  SecByteBlock m_reg;
47
  unsigned int m_counter;
48
};
49
50
/// \brief CMAC message authentication code
51
/// \tparam T block cipher
52
/// \details Template parameter T should be a class derived from BlockCipherDocumentation, for example AES, with a block size of 8, 16, or 32.
53
/// \sa <a href="http://www.cryptolounge.org/wiki/CMAC">CMAC</a>
54
/// \since Crypto++ 5.6.0
55
template <class T>
56
class CMAC : public MessageAuthenticationCodeImpl<CMAC_Base, CMAC<T> >, public SameKeyLengthAs<T>
57
{
58
public:
59
  /// \brief Construct a CMAC
60
  CMAC() {}
61
  /// \brief Construct a CMAC
62
  /// \param key the MAC key
63
  /// \param length the key size, in bytes
64
  CMAC(const byte *key, size_t length=SameKeyLengthAs<T>::DEFAULT_KEYLENGTH)
65
    {this->SetKey(key, length);}
66
67
  static std::string StaticAlgorithmName() {return std::string("CMAC(") + T::StaticAlgorithmName() + ")";}
68
69
private:
70
  BlockCipher & AccessCipher() {return m_cipher;}
71
  typename T::Encryption m_cipher;
72
};
73
74
NAMESPACE_END
75
76
#endif