Main Page   Class Hierarchy   Alphabetical List   Compound List   File List   Compound Members   File Members  

hmac.h

00001 // hmac.h - written and placed in the public domain by Wei Dai
00002 
00003 #ifndef CRYPTOPP_HMAC_H
00004 #define CRYPTOPP_HMAC_H
00005 
00006 #include "cryptlib.h"
00007 #include "misc.h"
00008 
00009 NAMESPACE_BEGIN(CryptoPP)
00010 
00012 
00013 template <class T> class HMAC : public MessageAuthenticationCode, public VariableKeyLength<16, 0, T::BLOCKSIZE>
00014 {
00015 public:
00016         // put enums here for Metrowerks 4
00017         enum {DIGESTSIZE=T::DIGESTSIZE, BLOCKSIZE=T::BLOCKSIZE};
00018 
00019         // CW50 workaround: can't use DEFAULT_KEYLENGTH here
00020         HMAC(const byte *userKey, unsigned int keylength = 16);
00021         void Update(const byte *input, unsigned int length);
00022         void Final(byte *mac);
00023         unsigned int DigestSize() const {return DIGESTSIZE;}
00024 
00025 private:
00026         enum {IPAD=0x36, OPAD=0x5c};
00027 
00028         void Init();
00029 
00030         SecByteBlock k_ipad, k_opad;
00031         T hash;
00032 };
00033 
00034 template <class T>
00035 HMAC<T>::HMAC(const byte *userKey, unsigned int keylength)
00036         : k_ipad(MAX_KEYLENGTH), k_opad(MAX_KEYLENGTH)
00037 {
00038         assert(keylength == KeyLength(keylength));
00039 
00040         memset(k_ipad, IPAD, MAX_KEYLENGTH);
00041         xorbuf(k_ipad, userKey, keylength);
00042 
00043         memset(k_opad, OPAD, MAX_KEYLENGTH);
00044         xorbuf(k_opad, userKey, keylength);
00045 
00046         Init();
00047 }
00048 
00049 template <class T>
00050 void HMAC<T>::Init()
00051 {
00052         hash.Update(k_ipad, MAX_KEYLENGTH);
00053 }
00054 
00055 template <class T>
00056 void HMAC<T>::Update(const byte *input, unsigned int length)
00057 {
00058         hash.Update(input, length);
00059 }
00060 
00061 template <class T>
00062 void HMAC<T>::Final(byte *mac)
00063 {
00064         hash.Final(mac);
00065 
00066         hash.Update(k_opad, MAX_KEYLENGTH);
00067         hash.Update(mac, DIGESTSIZE);
00068         hash.Final(mac);
00069         Init();
00070 }
00071 
00072 NAMESPACE_END
00073 
00074 #endif

Generated at Mon Jan 15 01:16:32 2001 for Crypto++ by doxygen1.2.4 written by Dimitri van Heesch, © 1997-2000