Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | 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 Tue Oct 5 01:09:20 2004 for WvStreams by doxygen 1.3.7