• 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

Generated on Mon Aug 9 2010 15:56:34 for Crypto++ by  doxygen 1.7.1