7
NAMESPACE_BEGIN(CryptoPP)
10
enum GCM_TablesOption {GCM_2K_Tables, GCM_64K_Tables};
13
class CRYPTOPP_DLL CRYPTOPP_NO_VTABLE GCM_Base : public AuthenticatedSymmetricCipherBase
16
// AuthenticatedSymmetricCipher
17
std::string AlgorithmName() const
18
{return GetBlockCipher().AlgorithmName() + std::string("/GCM");}
19
size_t MinKeyLength() const
20
{return GetBlockCipher().MinKeyLength();}
21
size_t MaxKeyLength() const
22
{return GetBlockCipher().MaxKeyLength();}
23
size_t DefaultKeyLength() const
24
{return GetBlockCipher().DefaultKeyLength();}
25
size_t GetValidKeyLength(size_t n) const
26
{return GetBlockCipher().GetValidKeyLength(n);}
27
bool IsValidKeyLength(size_t n) const
28
{return GetBlockCipher().IsValidKeyLength(n);}
29
unsigned int OptimalDataAlignment() const;
30
IV_Requirement IVRequirement() const
32
unsigned int IVSize() const
34
unsigned int MinIVLength() const
36
unsigned int MaxIVLength() const
37
{return UINT_MAX;} // (W64LIT(1)<<61)-1 in the standard
38
unsigned int DigestSize() const
40
lword MaxHeaderLength() const
41
{return (W64LIT(1)<<61)-1;}
42
lword MaxMessageLength() const
43
{return ((W64LIT(1)<<39)-256)/8;}
46
// AuthenticatedSymmetricCipherBase
47
bool AuthenticationIsOnPlaintext() const
49
unsigned int AuthenticationBlockSize() const
50
{return HASH_BLOCKSIZE;}
51
void SetKeyWithoutResync(const byte *userKey, size_t keylength, const NameValuePairs ¶ms);
52
void Resync(const byte *iv, size_t len);
53
size_t AuthenticateBlocks(const byte *data, size_t len);
54
void AuthenticateLastHeaderBlock();
55
void AuthenticateLastConfidentialBlock();
56
void AuthenticateLastFooterBlock(byte *mac, size_t macSize);
57
SymmetricCipher & AccessSymmetricCipher() {return m_ctr;}
59
virtual BlockCipher & AccessBlockCipher() =0;
60
virtual GCM_TablesOption GetTablesOption() const =0;
62
const BlockCipher & GetBlockCipher() const {return const_cast<GCM_Base *>(this)->AccessBlockCipher();};
63
byte *HashBuffer() {return m_buffer+REQUIRED_BLOCKSIZE;}
64
byte *HashKey() {return m_buffer+2*REQUIRED_BLOCKSIZE;}
65
byte *MulTable() {return m_buffer+3*REQUIRED_BLOCKSIZE;}
67
class GCTR : public CTR_Mode_ExternalCipher::Encryption
70
void IncrementCounterBy256();
74
static word16 s_reductionTable[256];
75
static bool s_reductionTableInitialized;
76
enum {REQUIRED_BLOCKSIZE = 16, HASH_BLOCKSIZE = 16};
80
template <class T_BlockCipher, GCM_TablesOption T_TablesOption, bool T_IsEncryption>
81
class GCM_Final : public GCM_Base
84
static std::string StaticAlgorithmName()
85
{return T_BlockCipher::StaticAlgorithmName() + std::string("/GCM");}
86
bool IsForwardTransformation() const
87
{return T_IsEncryption;}
90
GCM_TablesOption GetTablesOption() const {return T_TablesOption;}
91
BlockCipher & AccessBlockCipher() {return m_cipher;}
92
typename T_BlockCipher::Encryption m_cipher;
95
//! <a href="http://www.cryptolounge.org/wiki/GCM">GCM</a>
96
template <class T_BlockCipher, GCM_TablesOption T_TablesOption=GCM_2K_Tables>
97
struct GCM : public AuthenticatedSymmetricCipherDocumentation
99
typedef GCM_Final<T_BlockCipher, T_TablesOption, true> Encryption;
100
typedef GCM_Final<T_BlockCipher, T_TablesOption, false> Decryption;