WvStreams
wvdigest.cc
1 /*
2  * Worldvisions Tunnel Vision Software:
3  * Copyright (C) 1997-2002 Net Integration Technologies, Inc.
4  *
5  * MD5, SHA-1 and HMAC digest abstractions.
6  */
7 #include "wvdigest.h"
8 #include "wvserialize.h"
9 #include <openssl/evp.h>
10 #include <openssl/hmac.h>
11 #include <assert.h>
12 #include <zlib.h>
13 
14 /***** WvEVPMDDigest *****/
15 
16 WvEVPMDDigest::WvEVPMDDigest(const EVP_MD*_evpmd) :
17  evpmd(_evpmd), active(false)
18 {
19  evpctx = EVP_MD_CTX_new();
20  _reset();
21 }
22 
23 
24 WvEVPMDDigest::~WvEVPMDDigest()
25 {
26  cleanup();
27  EVP_MD_CTX_free(evpctx);
28 }
29 
30 
31 bool WvEVPMDDigest::_encode(WvBuf &inbuf, WvBuf &outbuf,
32  bool flush)
33 {
34  size_t len;
35  while ((len = inbuf.optgettable()) != 0)
36  {
37  const unsigned char *data = inbuf.get(len);
38  EVP_DigestUpdate(evpctx, data, len);
39  }
40  return true;
41 }
42 
43 
45 {
46  assert(active);
47  unsigned char digest[EVP_MAX_MD_SIZE];
48  unsigned int size; // size_t is not an unsigned int on many 64 bit systems
49  EVP_DigestFinal(evpctx, digest, & size);
50  active = false;
51  outbuf.put(digest, size);
52  return true;
53 }
54 
55 
57 {
58  cleanup();
59 
60  // the typecast is necessary for API compatibility with different
61  // versions of openssl. None of them *actually* change the contents of
62  // the pointer.
63  EVP_DigestInit(evpctx, evpmd);
64  active = true;
65  return true;
66 }
67 
68 
69 void WvEVPMDDigest::cleanup()
70 {
71  if (active)
72  {
73  // discard digest
74  unsigned char digest[EVP_MAX_MD_SIZE];
75  EVP_DigestFinal(evpctx, digest, NULL);
76  active = false;
77  }
78 }
79 
81 {
82  return EVP_MD_size(evpmd);
83 }
84 
85 
86 /***** WvMD5Digest *****/
87 
89 {
90 }
91 
92 
93 /***** WvSHA1Digest *****/
94 
96 {
97 }
98 
99 /***** WvHMACDigest *****/
100 
102  const void *_key, size_t _keysize) :
103  digest(_digest), keysize(_keysize), active(false)
104 {
105  key = new unsigned char[keysize];
106  memcpy(key, _key, keysize);
107  hmacctx = HMAC_CTX_new();
108  _reset();
109 }
110 
111 WvHMACDigest::~WvHMACDigest()
112 {
113  cleanup();
114  HMAC_CTX_free(hmacctx);
115  deletev key;
116  delete digest;
117 }
118 
119 
120 bool WvHMACDigest::_encode(WvBuf &inbuf, WvBuf &outbuf,
121  bool flush)
122 {
123  size_t len;
124  while ((len = inbuf.optgettable()) != 0)
125  {
126  const unsigned char *data = inbuf.get(len);
127  HMAC_Update(hmacctx, data, len);
128  }
129  return true;
130 }
131 
132 
134 {
135  assert(active);
136  unsigned char digest[EVP_MAX_MD_SIZE];
137  unsigned int size;
138  HMAC_Final(hmacctx, digest, & size);
139  active = false;
140  outbuf.put(digest, size);
141  return true;
142 }
143 
144 
146 {
147  cleanup();
148  HMAC_Init(hmacctx, key, keysize, digest->getevpmd());
149  active = true;
150  return true;
151 }
152 
153 
154 void WvHMACDigest::cleanup()
155 {
156  if (active)
157  {
158  // discard digest
159  unsigned char digest[EVP_MAX_MD_SIZE];
160  HMAC_Final(hmacctx, digest, NULL);
161  active = false;
162  }
163 }
164 
165 
167 {
168  return digest->digestsize();
169 }
170 
171 
172 WvCrc32Digest::WvCrc32Digest()
173 {
174  _reset();
175 }
176 
177 
178 bool WvCrc32Digest::_encode(WvBuf &inbuf, WvBuf &outbuf, bool flush)
179 {
180  size_t len;
181  while ((len = inbuf.optgettable()) != 0)
182  crc = crc32(crc, inbuf.get(len), len);
183  return true;
184 }
185 
186 
188 {
189  wv_serialize(outbuf, crc);
190  return true;
191 }
192 
193 
195 {
196  crc = crc32(0, NULL, 0);
197  return true;
198 }
199 
200 
202 {
203  return sizeof(crc);
204 }
205 
206 
207 WvAdler32Digest::WvAdler32Digest()
208 {
209  _reset();
210 }
211 
212 
213 bool WvAdler32Digest::_encode(WvBuf &inbuf, WvBuf &outbuf, bool flush)
214 {
215  size_t len;
216  while ((len = inbuf.optgettable()) != 0)
217  crc = adler32(crc, inbuf.get(len), len);
218  return true;
219 }
220 
221 
223 {
224  wv_serialize(outbuf, crc);
225  return true;
226 }
227 
228 
230 {
231  crc = adler32(0, NULL, 0);
232  return true;
233 }
234 
235 
237 {
238  return sizeof(crc);
239 }
WvBufBaseCommonImpl::get
const T * get(size_t count)
Reads exactly the specified number of elements and returns a pointer to a storage location owned by t...
Definition: wvbufbase.h:114
WvHMACDigest::digestsize
virtual size_t digestsize() const
Returns the number of bytes in the message digest.
Definition: wvdigest.cc:166
WvCrc32Digest::_reset
virtual bool _reset()
Template method implementation of reset().
Definition: wvdigest.cc:194
WvCrc32Digest::_finish
virtual bool _finish(WvBuf &outbuf)
Template method implementation of finish().
Definition: wvdigest.cc:187
WvBufBaseCommonImpl::optgettable
size_t optgettable() const
Returns the optimal maximum number of elements in the buffer currently available for reading without ...
Definition: wvbufbase.h:154
WvMD5Digest::WvMD5Digest
WvMD5Digest()
Creates an MD5 digest encoder.
Definition: wvdigest.cc:88
WvEVPMDDigest::_encode
virtual bool _encode(WvBuf &inbuf, WvBuf &outbuf, bool flush)
Template method implementation of encode().
Definition: wvdigest.cc:31
WvSHA1Digest::WvSHA1Digest
WvSHA1Digest()
Creates an SHA1 digest encoder.
Definition: wvdigest.cc:95
WvHMACDigest::_reset
virtual bool _reset()
Template method implementation of reset().
Definition: wvdigest.cc:145
WvHMACDigest::_encode
virtual bool _encode(WvBuf &inbuf, WvBuf &outbuf, bool flush)
Template method implementation of encode().
Definition: wvdigest.cc:120
WvEVPMDDigest
Definition: wvdigest.h:43
WvEVPMDDigest::digestsize
virtual size_t digestsize() const
Returns the number of bytes in the message digest.
Definition: wvdigest.cc:80
WvAdler32Digest::_encode
virtual bool _encode(WvBuf &inbuf, WvBuf &outbuf, bool flush)
Template method implementation of encode().
Definition: wvdigest.cc:213
WvBufBase< unsigned char >
Specialization of WvBufBase for unsigned char type buffers intended for use with raw memory buffers.
Definition: wvbuf.h:22
WvHMACDigest::WvHMACDigest
WvHMACDigest(WvEVPMDDigest *_digest, const void *_key, size_t _keysize)
Creates an HMAC digest encoder.
Definition: wvdigest.cc:101
WvAdler32Digest::_reset
virtual bool _reset()
Template method implementation of reset().
Definition: wvdigest.cc:229
deletev
#define deletev
Remplacement for delete[].
Definition: delete.h:129
WvAdler32Digest::digestsize
virtual size_t digestsize() const
Returns the number of bytes in the message digest.
Definition: wvdigest.cc:236
WvHMACDigest::_finish
virtual bool _finish(WvBuf &outbuf)
Template method implementation of finish().
Definition: wvdigest.cc:133
WvEVPMDDigest::_reset
virtual bool _reset()
Template method implementation of reset().
Definition: wvdigest.cc:56
WvCrc32Digest::digestsize
virtual size_t digestsize() const
Returns the number of bytes in the message digest.
Definition: wvdigest.cc:201
WvCrc32Digest::_encode
virtual bool _encode(WvBuf &inbuf, WvBuf &outbuf, bool flush)
Template method implementation of encode().
Definition: wvdigest.cc:178
WvEVPMDDigest::_finish
virtual bool _finish(WvBuf &outbuf)
Template method implementation of finish().
Definition: wvdigest.cc:44
WvAdler32Digest::_finish
virtual bool _finish(WvBuf &outbuf)
Template method implementation of finish().
Definition: wvdigest.cc:222