Crypto++

- Main Page
- Namespaces
- Classes
- Files

- File List
- File Members

gcm.h

    00001 #ifndef CRYPTOPP_GCM_H
    00002 #define CRYPTOPP_GCM_H
    00003
    00004 #include "authenc.h"
    00005 #include "modes.h"
    00006
    00007 NAMESPACE_BEGIN(CryptoPP)
    00008
    00009 //! .
    00010 enum GCM_TablesOption {GCM_2K_Tables, GCM_64K_Tables};
    00011
    00012 //! .
    00013 class CRYPTOPP_DLL CRYPTOPP_NO_VTABLE GCM_Base : public AuthenticatedSymmetricCipherBase
    00014 {
    00015 public:
    00016     // AuthenticatedSymmetricCipher
    00017     std::string AlgorithmName() const
    00018         {return GetBlockCipher().AlgorithmName() + std::string("/GCM");}
    00019     size_t MinKeyLength() const
    00020         {return GetBlockCipher().MinKeyLength();}
    00021     size_t MaxKeyLength() const
    00022         {return GetBlockCipher().MaxKeyLength();}
    00023     size_t DefaultKeyLength() const
    00024         {return GetBlockCipher().DefaultKeyLength();}
    00025     size_t GetValidKeyLength(size_t n) const
    00026         {return GetBlockCipher().GetValidKeyLength(n);}
    00027     bool IsValidKeyLength(size_t n) const
    00028         {return GetBlockCipher().IsValidKeyLength(n);}
    00029     unsigned int OptimalDataAlignment() const;
    00030     IV_Requirement IVRequirement() const
    00031         {return UNIQUE_IV;}
    00032     unsigned int IVSize() const
    00033         {return 12;}
    00034     unsigned int MinIVLength() const
    00035         {return 1;}
    00036     unsigned int MaxIVLength() const
    00037         {return UINT_MAX;}      // (W64LIT(1)<<61)-1 in the standard
    00038     unsigned int DigestSize() const
    00039         {return 16;}
    00040     lword MaxHeaderLength() const
    00041         {return (W64LIT(1)<<61)-1;}
    00042     lword MaxMessageLength() const
    00043         {return ((W64LIT(1)<<39)-256)/8;}
    00044
    00045 protected:
    00046     // AuthenticatedSymmetricCipherBase
    00047     bool AuthenticationIsOnPlaintext() const
    00048         {return false;}
    00049     unsigned int AuthenticationBlockSize() const
    00050         {return HASH_BLOCKSIZE;}
    00051     void SetKeyWithoutResync(const byte *userKey, size_t keylength, const NameValuePairs &params);
    00052     void Resync(const byte *iv, size_t len);
    00053     size_t AuthenticateBlocks(const byte *data, size_t len);
    00054     void AuthenticateLastHeaderBlock();
    00055     void AuthenticateLastConfidentialBlock();
    00056     void AuthenticateLastFooterBlock(byte *mac, size_t macSize);
    00057     SymmetricCipher & AccessSymmetricCipher() {return m_ctr;}
    00058
    00059     virtual BlockCipher & AccessBlockCipher() =0;
    00060     virtual GCM_TablesOption GetTablesOption() const =0;
    00061
    00062     const BlockCipher & GetBlockCipher() const {return const_cast<GCM_Base *>(this)->AccessBlockCipher();};
    00063     byte *HashBuffer() {return m_buffer+REQUIRED_BLOCKSIZE;}
    00064     byte *HashKey() {return m_buffer+2*REQUIRED_BLOCKSIZE;}
    00065     byte *MulTable() {return m_buffer+3*REQUIRED_BLOCKSIZE;}
    00066     inline void ReverseHashBufferIfNeeded();
    00067
    00068     class CRYPTOPP_DLL GCTR : public CTR_Mode_ExternalCipher::Encryption
    00069     {
    00070     protected:
    00071         void IncrementCounterBy256();
    00072     };
    00073
    00074     GCTR m_ctr;
    00075     static word16 s_reductionTable[256];
    00076     static volatile bool s_reductionTableInitialized;
    00077     enum {REQUIRED_BLOCKSIZE = 16, HASH_BLOCKSIZE = 16};
    00078 };
    00079
    00080 //! .
    00081 template <class T_BlockCipher, GCM_TablesOption T_TablesOption, bool T_IsEncryption>
    00082 class GCM_Final : public GCM_Base
    00083 {
    00084 public:
    00085     static std::string StaticAlgorithmName()
    00086         {return T_BlockCipher::StaticAlgorithmName() + std::string("/GCM");}
    00087     bool IsForwardTransformation() const
    00088         {return T_IsEncryption;}
    00089
    00090 private:
    00091     GCM_TablesOption GetTablesOption() const {return T_TablesOption;}
    00092     BlockCipher & AccessBlockCipher() {return m_cipher;}
    00093     typename T_BlockCipher::Encryption m_cipher;
    00094 };
    00095
    00096 //! <a href="http://www.cryptolounge.org/wiki/GCM">GCM</a>
    00097 template <class T_BlockCipher, GCM_TablesOption T_TablesOption=GCM_2K_Tables>
    00098 struct GCM : public AuthenticatedSymmetricCipherDocumentation
    00099 {
    00100     typedef GCM_Final<T_BlockCipher, T_TablesOption, true> Encryption;
    00101     typedef GCM_Final<T_BlockCipher, T_TablesOption, false> Decryption;
    00102 };
    00103
    00104 NAMESPACE_END
    00105
    00106 #endif