Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Namespace Members | Class Members | File Members | Related Pages

wvdigest.cc

Go to the documentation of this file.
00001 /*
00002  * Worldvisions Tunnel Vision Software:
00003  *   Copyright (C) 1997-2002 Net Integration Technologies, Inc.
00004  * 
00005  * MD5, SHA-1 and HMAC digest abstractions.
00006  */
00007 #include "wvdigest.h"
00008 #include <openssl/evp.h>
00009 #include <openssl/hmac.h>
00010 #include <assert.h>
00011 
00012 /***** WvEVPMDDigest *****/
00013 
00014 WvEVPMDDigest::WvEVPMDDigest(const env_md_st *_evpmd) :
00015     evpmd(_evpmd), active(false)
00016 {
00017     evpctx = new EVP_MD_CTX;
00018     _reset();
00019 }
00020 
00021 
00022 WvEVPMDDigest::~WvEVPMDDigest()
00023 {
00024     cleanup();
00025     delete evpctx;
00026 }
00027 
00028 
00029 bool WvEVPMDDigest::_encode(WvBuf &inbuf, WvBuf &outbuf,
00030     bool flush)
00031 {
00032     size_t len;
00033     while ((len = inbuf.optgettable()) != 0)
00034     {
00035         const unsigned char *data = inbuf.get(len);
00036         EVP_DigestUpdate(evpctx, data, len);
00037     }
00038     return true;
00039 }
00040 
00041 
00042 bool WvEVPMDDigest::_finish(WvBuf &outbuf)
00043 {
00044     assert(active);
00045     unsigned char digest[EVP_MAX_MD_SIZE];
00046     unsigned int size; // size_t is not an unsigned int on many 64 bit systems
00047     EVP_DigestFinal(evpctx, digest, & size);
00048     active = false;
00049     outbuf.put(digest, size);
00050     return true;
00051 }
00052 
00053 
00054 bool WvEVPMDDigest::_reset()
00055 {
00056     cleanup();
00057     
00058     // the typecast is necessary for API compatibility with different
00059     // versions of openssl.  None of them *actually* change the contents of
00060     // the pointer.
00061     EVP_DigestInit(evpctx, (env_md_st *)evpmd);
00062     active = true;
00063     return true;
00064 }
00065 
00066 
00067 void WvEVPMDDigest::cleanup()
00068 {
00069     if (active)
00070     {
00071         // discard digest
00072         unsigned char digest[EVP_MAX_MD_SIZE];
00073         EVP_DigestFinal(evpctx, digest, NULL);
00074         active = false;
00075     }
00076 }
00077 
00078 size_t WvEVPMDDigest::digestsize() const
00079 {
00080     return EVP_MD_size((env_md_st *)evpmd);
00081 }
00082 
00083 
00084 /***** WvMD5Digest *****/
00085 
00086 WvMD5Digest::WvMD5Digest() : WvEVPMDDigest(EVP_md5())
00087 {
00088 }
00089 
00090 
00091 /***** WvSHA1Digest *****/
00092 
00093 WvSHA1Digest::WvSHA1Digest() : WvEVPMDDigest(EVP_sha1())
00094 {
00095 }
00096 
00097 
00098 /***** WvHMACDigest *****/
00099 
00100 WvHMACDigest::WvHMACDigest(WvEVPMDDigest *_digest,
00101     const void *_key, size_t _keysize) :
00102     digest(_digest), keysize(_keysize), active(false)
00103 {
00104     key = new unsigned char[keysize];
00105     memcpy(key, _key, keysize);
00106     hmacctx = new HMAC_CTX;
00107     _reset();
00108 }
00109 
00110 WvHMACDigest::~WvHMACDigest()
00111 {
00112     cleanup();
00113     delete hmacctx;
00114     delete[] key;
00115     delete digest;
00116 }
00117 
00118 
00119 bool WvHMACDigest::_encode(WvBuf &inbuf, WvBuf &outbuf,
00120     bool flush)
00121 {
00122     size_t len;
00123     while ((len = inbuf.optgettable()) != 0)
00124     {
00125         const unsigned char *data = inbuf.get(len);
00126         HMAC_Update(hmacctx, data, len);
00127     }
00128     return true;
00129 }
00130 
00131 
00132 bool WvHMACDigest::_finish(WvBuf &outbuf)
00133 {
00134     assert(active);
00135     unsigned char digest[EVP_MAX_MD_SIZE];
00136     unsigned int size;
00137     HMAC_Final(hmacctx, digest, & size);
00138     active = false;
00139     outbuf.put(digest, size);
00140     return true;
00141 }
00142 
00143 
00144 bool WvHMACDigest::_reset()
00145 {
00146     cleanup();
00147     HMAC_Init(hmacctx, key, keysize, (env_md_st *)digest->getevpmd());
00148     active = true;
00149     return true;
00150 }
00151 
00152 
00153 void WvHMACDigest::cleanup()
00154 {
00155     if (active)
00156     {
00157         // discard digest
00158         unsigned char digest[EVP_MAX_MD_SIZE];
00159         HMAC_Final(hmacctx, digest, NULL);
00160         active = false;
00161     }
00162 }
00163 
00164 
00165 size_t WvHMACDigest::digestsize() const
00166 {
00167     return digest->digestsize();
00168 }

Generated on Wed Dec 15 15:08:11 2004 for WvStreams by  doxygen 1.3.9.1