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
16WvEVPMDDigest::WvEVPMDDigest(const EVP_MD*_evpmd) :
17 evpmd(_evpmd), active(false)
18{
19 evpctx = EVP_MD_CTX_new();
20 _reset();
21}
22
23
24WvEVPMDDigest::~WvEVPMDDigest()
25{
26 cleanup();
27 EVP_MD_CTX_free(evpctx);
28}
29
30
31bool 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
69void 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
111WvHMACDigest::~WvHMACDigest()
112{
113 cleanup();
114 HMAC_CTX_free(hmacctx);
115 deletev key;
116 delete digest;
117}
118
119
120bool 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
154void 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
172WvCrc32Digest::WvCrc32Digest()
173{
174 _reset();
175}
176
177
178bool 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
207WvAdler32Digest::WvAdler32Digest()
208{
209 _reset();
210}
211
212
213bool 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}
virtual bool _finish(WvBuf &outbuf)
Template method implementation of finish().
Definition: wvdigest.cc:222
virtual bool _reset()
Template method implementation of reset().
Definition: wvdigest.cc:229
virtual bool _encode(WvBuf &inbuf, WvBuf &outbuf, bool flush)
Template method implementation of encode().
Definition: wvdigest.cc:213
virtual size_t digestsize() const
Returns the number of bytes in the message digest.
Definition: wvdigest.cc:236
size_t optgettable() const
Returns the optimal maximum number of elements in the buffer currently available for reading without ...
Definition: wvbufbase.h:154
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
Specialization of WvBufBase for unsigned char type buffers intended for use with raw memory buffers.
Definition: wvbuf.h:24
virtual size_t digestsize() const
Returns the number of bytes in the message digest.
Definition: wvdigest.cc:201
virtual bool _finish(WvBuf &outbuf)
Template method implementation of finish().
Definition: wvdigest.cc:187
virtual bool _reset()
Template method implementation of reset().
Definition: wvdigest.cc:194
virtual bool _encode(WvBuf &inbuf, WvBuf &outbuf, bool flush)
Template method implementation of encode().
Definition: wvdigest.cc:178
virtual bool _finish(WvBuf &outbuf)
Template method implementation of finish().
Definition: wvdigest.cc:44
virtual size_t digestsize() const
Returns the number of bytes in the message digest.
Definition: wvdigest.cc:80
virtual bool _encode(WvBuf &inbuf, WvBuf &outbuf, bool flush)
Template method implementation of encode().
Definition: wvdigest.cc:31
virtual bool _reset()
Template method implementation of reset().
Definition: wvdigest.cc:56
virtual bool _finish(WvBuf &outbuf)
Template method implementation of finish().
Definition: wvdigest.cc:133
virtual size_t digestsize() const
Returns the number of bytes in the message digest.
Definition: wvdigest.cc:166
virtual bool _encode(WvBuf &inbuf, WvBuf &outbuf, bool flush)
Template method implementation of encode().
Definition: wvdigest.cc:120
WvHMACDigest(WvEVPMDDigest *_digest, const void *_key, size_t _keysize)
Creates an HMAC digest encoder.
Definition: wvdigest.cc:101
virtual bool _reset()
Template method implementation of reset().
Definition: wvdigest.cc:145
WvMD5Digest()
Creates an MD5 digest encoder.
Definition: wvdigest.cc:88
WvSHA1Digest()
Creates an SHA1 digest encoder.
Definition: wvdigest.cc:95
#define deletev
Remplacement for delete[].
Definition: delete.h:129