/src/nss/lib/cryptohi/sechash.c
Line | Count | Source (jump to first uncovered line) |
1 | | /* This Source Code Form is subject to the terms of the Mozilla Public |
2 | | * License, v. 2.0. If a copy of the MPL was not distributed with this |
3 | | * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ |
4 | | #include "sechash.h" |
5 | | #include "secoidt.h" |
6 | | #include "secerr.h" |
7 | | #include "blapi.h" |
8 | | #include "pk11func.h" /* for the PK11_ calls below. */ |
9 | | |
10 | | static void * |
11 | | null_hash_new_context(void) |
12 | 0 | { |
13 | 0 | return NULL; |
14 | 0 | } |
15 | | |
16 | | static void * |
17 | | null_hash_clone_context(void *v) |
18 | 0 | { |
19 | 0 | PORT_Assert(v == NULL); |
20 | 0 | return NULL; |
21 | 0 | } |
22 | | |
23 | | static void |
24 | | null_hash_begin(void *v) |
25 | 0 | { |
26 | 0 | } |
27 | | |
28 | | static void |
29 | | null_hash_update(void *v, const unsigned char *input, unsigned int length) |
30 | 0 | { |
31 | 0 | } |
32 | | |
33 | | static void |
34 | | null_hash_end(void *v, unsigned char *output, unsigned int *outLen, |
35 | | unsigned int maxOut) |
36 | 0 | { |
37 | 0 | *outLen = 0; |
38 | 0 | } |
39 | | |
40 | | static void |
41 | | null_hash_destroy_context(void *v, PRBool b) |
42 | 0 | { |
43 | 0 | PORT_Assert(v == NULL); |
44 | 0 | } |
45 | | |
46 | | static void * |
47 | | md2_NewContext(void) |
48 | 0 | { |
49 | 0 | return (void *)PK11_CreateDigestContext(SEC_OID_MD2); |
50 | 0 | } |
51 | | |
52 | | static void * |
53 | | md5_NewContext(void) |
54 | 0 | { |
55 | 0 | return (void *)PK11_CreateDigestContext(SEC_OID_MD5); |
56 | 0 | } |
57 | | |
58 | | static void * |
59 | | sha1_NewContext(void) |
60 | 0 | { |
61 | 0 | return (void *)PK11_CreateDigestContext(SEC_OID_SHA1); |
62 | 0 | } |
63 | | |
64 | | static void * |
65 | | sha224_NewContext(void) |
66 | 0 | { |
67 | 0 | return (void *)PK11_CreateDigestContext(SEC_OID_SHA224); |
68 | 0 | } |
69 | | |
70 | | static void * |
71 | | sha256_NewContext(void) |
72 | 0 | { |
73 | 0 | return (void *)PK11_CreateDigestContext(SEC_OID_SHA256); |
74 | 0 | } |
75 | | |
76 | | static void * |
77 | | sha384_NewContext(void) |
78 | 0 | { |
79 | 0 | return (void *)PK11_CreateDigestContext(SEC_OID_SHA384); |
80 | 0 | } |
81 | | |
82 | | static void * |
83 | | sha512_NewContext(void) |
84 | 0 | { |
85 | 0 | return (void *)PK11_CreateDigestContext(SEC_OID_SHA512); |
86 | 0 | } |
87 | | |
88 | | static void * |
89 | | sha3_224_NewContext(void) |
90 | 0 | { |
91 | 0 | return (void *)PK11_CreateDigestContext(SEC_OID_SHA3_224); |
92 | 0 | } |
93 | | |
94 | | static void * |
95 | | sha3_256_NewContext(void) |
96 | 0 | { |
97 | 0 | return (void *)PK11_CreateDigestContext(SEC_OID_SHA3_256); |
98 | 0 | } |
99 | | |
100 | | static void * |
101 | | sha3_384_NewContext(void) |
102 | 0 | { |
103 | 0 | return (void *)PK11_CreateDigestContext(SEC_OID_SHA3_384); |
104 | 0 | } |
105 | | |
106 | | static void * |
107 | | sha3_512_NewContext(void) |
108 | 0 | { |
109 | 0 | return (void *)PK11_CreateDigestContext(SEC_OID_SHA3_512); |
110 | 0 | } |
111 | | |
112 | | const SECHashObject SECHashObjects[] = { |
113 | | { 0, |
114 | | (void *(*)(void))null_hash_new_context, |
115 | | (void *(*)(void *))null_hash_clone_context, |
116 | | (void (*)(void *, PRBool))null_hash_destroy_context, |
117 | | (void (*)(void *))null_hash_begin, |
118 | | (void (*)(void *, const unsigned char *, unsigned int))null_hash_update, |
119 | | (void (*)(void *, unsigned char *, unsigned int *, |
120 | | unsigned int))null_hash_end, |
121 | | 0, |
122 | | HASH_AlgNULL }, |
123 | | { MD2_LENGTH, |
124 | | (void *(*)(void))md2_NewContext, |
125 | | (void *(*)(void *))PK11_CloneContext, |
126 | | (void (*)(void *, PRBool))PK11_DestroyContext, |
127 | | (void (*)(void *))PK11_DigestBegin, |
128 | | (void (*)(void *, const unsigned char *, unsigned int))PK11_DigestOp, |
129 | | (void (*)(void *, unsigned char *, unsigned int *, unsigned int)) |
130 | | PK11_DigestFinal, |
131 | | MD2_BLOCK_LENGTH, |
132 | | HASH_AlgMD2 }, |
133 | | { MD5_LENGTH, |
134 | | (void *(*)(void))md5_NewContext, |
135 | | (void *(*)(void *))PK11_CloneContext, |
136 | | (void (*)(void *, PRBool))PK11_DestroyContext, |
137 | | (void (*)(void *))PK11_DigestBegin, |
138 | | (void (*)(void *, const unsigned char *, unsigned int))PK11_DigestOp, |
139 | | (void (*)(void *, unsigned char *, unsigned int *, unsigned int)) |
140 | | PK11_DigestFinal, |
141 | | MD5_BLOCK_LENGTH, |
142 | | HASH_AlgMD5 }, |
143 | | { SHA1_LENGTH, |
144 | | (void *(*)(void))sha1_NewContext, |
145 | | (void *(*)(void *))PK11_CloneContext, |
146 | | (void (*)(void *, PRBool))PK11_DestroyContext, |
147 | | (void (*)(void *))PK11_DigestBegin, |
148 | | (void (*)(void *, const unsigned char *, unsigned int))PK11_DigestOp, |
149 | | (void (*)(void *, unsigned char *, unsigned int *, unsigned int)) |
150 | | PK11_DigestFinal, |
151 | | SHA1_BLOCK_LENGTH, |
152 | | HASH_AlgSHA1 }, |
153 | | { SHA256_LENGTH, |
154 | | (void *(*)(void))sha256_NewContext, |
155 | | (void *(*)(void *))PK11_CloneContext, |
156 | | (void (*)(void *, PRBool))PK11_DestroyContext, |
157 | | (void (*)(void *))PK11_DigestBegin, |
158 | | (void (*)(void *, const unsigned char *, unsigned int))PK11_DigestOp, |
159 | | (void (*)(void *, unsigned char *, unsigned int *, unsigned int)) |
160 | | PK11_DigestFinal, |
161 | | SHA256_BLOCK_LENGTH, |
162 | | HASH_AlgSHA256 }, |
163 | | { SHA384_LENGTH, |
164 | | (void *(*)(void))sha384_NewContext, |
165 | | (void *(*)(void *))PK11_CloneContext, |
166 | | (void (*)(void *, PRBool))PK11_DestroyContext, |
167 | | (void (*)(void *))PK11_DigestBegin, |
168 | | (void (*)(void *, const unsigned char *, unsigned int))PK11_DigestOp, |
169 | | (void (*)(void *, unsigned char *, unsigned int *, unsigned int)) |
170 | | PK11_DigestFinal, |
171 | | SHA384_BLOCK_LENGTH, |
172 | | HASH_AlgSHA384 }, |
173 | | { SHA512_LENGTH, |
174 | | (void *(*)(void))sha512_NewContext, |
175 | | (void *(*)(void *))PK11_CloneContext, |
176 | | (void (*)(void *, PRBool))PK11_DestroyContext, |
177 | | (void (*)(void *))PK11_DigestBegin, |
178 | | (void (*)(void *, const unsigned char *, unsigned int))PK11_DigestOp, |
179 | | (void (*)(void *, unsigned char *, unsigned int *, unsigned int)) |
180 | | PK11_DigestFinal, |
181 | | SHA512_BLOCK_LENGTH, |
182 | | HASH_AlgSHA512 }, |
183 | | { SHA224_LENGTH, |
184 | | (void *(*)(void))sha224_NewContext, |
185 | | (void *(*)(void *))PK11_CloneContext, |
186 | | (void (*)(void *, PRBool))PK11_DestroyContext, |
187 | | (void (*)(void *))PK11_DigestBegin, |
188 | | (void (*)(void *, const unsigned char *, unsigned int))PK11_DigestOp, |
189 | | (void (*)(void *, unsigned char *, unsigned int *, unsigned int)) |
190 | | PK11_DigestFinal, |
191 | | SHA224_BLOCK_LENGTH, |
192 | | HASH_AlgSHA224 }, |
193 | | { SHA3_224_LENGTH, |
194 | | (void *(*)(void))sha3_224_NewContext, |
195 | | (void *(*)(void *))PK11_CloneContext, |
196 | | (void (*)(void *, PRBool))PK11_DestroyContext, |
197 | | (void (*)(void *))PK11_DigestBegin, |
198 | | (void (*)(void *, const unsigned char *, unsigned int))PK11_DigestOp, |
199 | | (void (*)(void *, unsigned char *, unsigned int *, unsigned int)) |
200 | | PK11_DigestFinal, |
201 | | SHA3_224_BLOCK_LENGTH, |
202 | | HASH_AlgSHA3_224 }, |
203 | | { SHA3_256_LENGTH, |
204 | | (void *(*)(void))sha3_256_NewContext, |
205 | | (void *(*)(void *))PK11_CloneContext, |
206 | | (void (*)(void *, PRBool))PK11_DestroyContext, |
207 | | (void (*)(void *))PK11_DigestBegin, |
208 | | (void (*)(void *, const unsigned char *, unsigned int))PK11_DigestOp, |
209 | | (void (*)(void *, unsigned char *, unsigned int *, unsigned int)) |
210 | | PK11_DigestFinal, |
211 | | SHA3_256_BLOCK_LENGTH, |
212 | | HASH_AlgSHA3_256 }, |
213 | | { SHA3_384_LENGTH, |
214 | | (void *(*)(void))sha3_384_NewContext, |
215 | | (void *(*)(void *))PK11_CloneContext, |
216 | | (void (*)(void *, PRBool))PK11_DestroyContext, |
217 | | (void (*)(void *))PK11_DigestBegin, |
218 | | (void (*)(void *, const unsigned char *, unsigned int))PK11_DigestOp, |
219 | | (void (*)(void *, unsigned char *, unsigned int *, unsigned int)) |
220 | | PK11_DigestFinal, |
221 | | SHA3_384_BLOCK_LENGTH, |
222 | | HASH_AlgSHA3_384 }, |
223 | | { SHA3_512_LENGTH, |
224 | | (void *(*)(void))sha3_512_NewContext, |
225 | | (void *(*)(void *))PK11_CloneContext, |
226 | | (void (*)(void *, PRBool))PK11_DestroyContext, |
227 | | (void (*)(void *))PK11_DigestBegin, |
228 | | (void (*)(void *, const unsigned char *, unsigned int))PK11_DigestOp, |
229 | | (void (*)(void *, unsigned char *, unsigned int *, unsigned int)) |
230 | | PK11_DigestFinal, |
231 | | SHA3_512_BLOCK_LENGTH, |
232 | | HASH_AlgSHA3_512 }, |
233 | | }; |
234 | | |
235 | | const SECHashObject * |
236 | | HASH_GetHashObject(HASH_HashType type) |
237 | 0 | { |
238 | 0 | return &SECHashObjects[type]; |
239 | 0 | } |
240 | | |
241 | | HASH_HashType |
242 | | HASH_GetHashTypeByOidTag(SECOidTag hashOid) |
243 | 4.16k | { |
244 | 4.16k | HASH_HashType ht = HASH_AlgNULL; |
245 | | |
246 | 4.16k | switch (hashOid) { |
247 | 0 | case SEC_OID_MD2: |
248 | 0 | ht = HASH_AlgMD2; |
249 | 0 | break; |
250 | 0 | case SEC_OID_MD5: |
251 | 0 | ht = HASH_AlgMD5; |
252 | 0 | break; |
253 | 3.37k | case SEC_OID_SHA1: |
254 | 3.37k | ht = HASH_AlgSHA1; |
255 | 3.37k | break; |
256 | 0 | case SEC_OID_SHA224: |
257 | 0 | ht = HASH_AlgSHA224; |
258 | 0 | break; |
259 | 384 | case SEC_OID_SHA256: |
260 | 384 | ht = HASH_AlgSHA256; |
261 | 384 | break; |
262 | 370 | case SEC_OID_SHA384: |
263 | 370 | ht = HASH_AlgSHA384; |
264 | 370 | break; |
265 | 42 | case SEC_OID_SHA512: |
266 | 42 | ht = HASH_AlgSHA512; |
267 | 42 | break; |
268 | 0 | case SEC_OID_SHA3_224: |
269 | 0 | ht = HASH_AlgSHA3_224; |
270 | 0 | break; |
271 | 0 | case SEC_OID_SHA3_256: |
272 | 0 | ht = HASH_AlgSHA3_256; |
273 | 0 | break; |
274 | 0 | case SEC_OID_SHA3_384: |
275 | 0 | ht = HASH_AlgSHA3_384; |
276 | 0 | break; |
277 | 0 | case SEC_OID_SHA3_512: |
278 | 0 | ht = HASH_AlgSHA3_512; |
279 | 0 | break; |
280 | 0 | default: |
281 | 0 | PORT_SetError(SEC_ERROR_INVALID_ALGORITHM); |
282 | 0 | break; |
283 | 4.16k | } |
284 | 4.16k | return ht; |
285 | 4.16k | } |
286 | | |
287 | | SECOidTag |
288 | | HASH_GetHashOidTagByHashType(HASH_HashType type) |
289 | 0 | { |
290 | 0 | SECOidTag oid = SEC_OID_UNKNOWN; |
291 | |
|
292 | 0 | switch (type) { |
293 | 0 | case HASH_AlgMD2: |
294 | 0 | oid = SEC_OID_MD2; |
295 | 0 | break; |
296 | 0 | case HASH_AlgMD5: |
297 | 0 | oid = SEC_OID_MD5; |
298 | 0 | break; |
299 | 0 | case HASH_AlgSHA1: |
300 | 0 | oid = SEC_OID_SHA1; |
301 | 0 | break; |
302 | 0 | case HASH_AlgSHA224: |
303 | 0 | oid = SEC_OID_SHA224; |
304 | 0 | break; |
305 | 0 | case HASH_AlgSHA256: |
306 | 0 | oid = SEC_OID_SHA256; |
307 | 0 | break; |
308 | 0 | case HASH_AlgSHA384: |
309 | 0 | oid = SEC_OID_SHA384; |
310 | 0 | break; |
311 | 0 | case HASH_AlgSHA512: |
312 | 0 | oid = SEC_OID_SHA512; |
313 | 0 | break; |
314 | 0 | case HASH_AlgSHA3_224: |
315 | 0 | oid = SEC_OID_SHA3_224; |
316 | 0 | break; |
317 | 0 | case HASH_AlgSHA3_256: |
318 | 0 | oid = SEC_OID_SHA3_256; |
319 | 0 | break; |
320 | 0 | case HASH_AlgSHA3_384: |
321 | 0 | oid = SEC_OID_SHA3_384; |
322 | 0 | break; |
323 | 0 | case HASH_AlgSHA3_512: |
324 | 0 | oid = SEC_OID_SHA3_512; |
325 | 0 | break; |
326 | 0 | default: |
327 | 0 | PORT_SetError(SEC_ERROR_INVALID_ALGORITHM); |
328 | 0 | break; |
329 | 0 | } |
330 | 0 | return oid; |
331 | 0 | } |
332 | | |
333 | | SECOidTag |
334 | | HASH_GetHashOidTagByHMACOidTag(SECOidTag hmacOid) |
335 | 0 | { |
336 | 0 | SECOidTag hashOid = SEC_OID_UNKNOWN; |
337 | |
|
338 | 0 | switch (hmacOid) { |
339 | | /* no oid exists for HMAC_MD2 */ |
340 | | /* NSS does not define a oid for HMAC_MD4 */ |
341 | 0 | case SEC_OID_HMAC_SHA1: |
342 | 0 | hashOid = SEC_OID_SHA1; |
343 | 0 | break; |
344 | 0 | case SEC_OID_HMAC_SHA224: |
345 | 0 | hashOid = SEC_OID_SHA224; |
346 | 0 | break; |
347 | 0 | case SEC_OID_HMAC_SHA256: |
348 | 0 | hashOid = SEC_OID_SHA256; |
349 | 0 | break; |
350 | 0 | case SEC_OID_HMAC_SHA384: |
351 | 0 | hashOid = SEC_OID_SHA384; |
352 | 0 | break; |
353 | 0 | case SEC_OID_HMAC_SHA512: |
354 | 0 | hashOid = SEC_OID_SHA512; |
355 | 0 | break; |
356 | 0 | case SEC_OID_HMAC_SHA3_224: |
357 | 0 | hashOid = SEC_OID_SHA3_224; |
358 | 0 | break; |
359 | 0 | case SEC_OID_HMAC_SHA3_256: |
360 | 0 | hashOid = SEC_OID_SHA3_256; |
361 | 0 | break; |
362 | 0 | case SEC_OID_HMAC_SHA3_384: |
363 | 0 | hashOid = SEC_OID_SHA3_384; |
364 | 0 | break; |
365 | 0 | case SEC_OID_HMAC_SHA3_512: |
366 | 0 | hashOid = SEC_OID_SHA3_512; |
367 | 0 | break; |
368 | 0 | default: |
369 | 0 | hashOid = SEC_OID_UNKNOWN; |
370 | 0 | PORT_SetError(SEC_ERROR_INVALID_ALGORITHM); |
371 | 0 | break; |
372 | 0 | } |
373 | 0 | return hashOid; |
374 | 0 | } |
375 | | |
376 | | SECOidTag |
377 | | HASH_GetHMACOidTagByHashOidTag(SECOidTag hashOid) |
378 | 0 | { |
379 | 0 | SECOidTag hmacOid = SEC_OID_UNKNOWN; |
380 | |
|
381 | 0 | switch (hashOid) { |
382 | | /* no oid exists for HMAC_MD2 */ |
383 | | /* NSS does not define a oid for HMAC_MD4 */ |
384 | 0 | case SEC_OID_SHA1: |
385 | 0 | hmacOid = SEC_OID_HMAC_SHA1; |
386 | 0 | break; |
387 | 0 | case SEC_OID_SHA224: |
388 | 0 | hmacOid = SEC_OID_HMAC_SHA224; |
389 | 0 | break; |
390 | 0 | case SEC_OID_SHA256: |
391 | 0 | hmacOid = SEC_OID_HMAC_SHA256; |
392 | 0 | break; |
393 | 0 | case SEC_OID_SHA384: |
394 | 0 | hmacOid = SEC_OID_HMAC_SHA384; |
395 | 0 | break; |
396 | 0 | case SEC_OID_SHA512: |
397 | 0 | hmacOid = SEC_OID_HMAC_SHA512; |
398 | 0 | break; |
399 | 0 | case SEC_OID_SHA3_224: |
400 | 0 | hmacOid = SEC_OID_HMAC_SHA3_224; |
401 | 0 | break; |
402 | 0 | case SEC_OID_SHA3_256: |
403 | 0 | hmacOid = SEC_OID_HMAC_SHA3_256; |
404 | 0 | break; |
405 | 0 | case SEC_OID_SHA3_384: |
406 | 0 | hmacOid = SEC_OID_HMAC_SHA3_384; |
407 | 0 | break; |
408 | 0 | case SEC_OID_SHA3_512: |
409 | 0 | hmacOid = SEC_OID_HMAC_SHA3_512; |
410 | 0 | break; |
411 | 0 | default: |
412 | 0 | hmacOid = SEC_OID_UNKNOWN; |
413 | 0 | PORT_SetError(SEC_ERROR_INVALID_ALGORITHM); |
414 | 0 | break; |
415 | 0 | } |
416 | 0 | return hmacOid; |
417 | 0 | } |
418 | | |
419 | | const SECHashObject * |
420 | | HASH_GetHashObjectByOidTag(SECOidTag hashOid) |
421 | 4.16k | { |
422 | 4.16k | HASH_HashType ht = HASH_GetHashTypeByOidTag(hashOid); |
423 | | |
424 | 4.16k | return (ht == HASH_AlgNULL) ? NULL : &SECHashObjects[ht]; |
425 | 4.16k | } |
426 | | |
427 | | /* returns zero for unknown hash OID */ |
428 | | unsigned int |
429 | | HASH_ResultLenByOidTag(SECOidTag hashOid) |
430 | 4.16k | { |
431 | 4.16k | const SECHashObject *hashObject = HASH_GetHashObjectByOidTag(hashOid); |
432 | 4.16k | unsigned int resultLen = 0; |
433 | | |
434 | 4.16k | if (hashObject) |
435 | 4.16k | resultLen = hashObject->length; |
436 | 4.16k | return resultLen; |
437 | 4.16k | } |
438 | | |
439 | | /* returns zero if hash type invalid. */ |
440 | | unsigned int |
441 | | HASH_ResultLen(HASH_HashType type) |
442 | 0 | { |
443 | 0 | if ((type < HASH_AlgNULL) || (type >= HASH_AlgTOTAL)) { |
444 | 0 | PORT_SetError(SEC_ERROR_INVALID_ALGORITHM); |
445 | 0 | return (0); |
446 | 0 | } |
447 | | |
448 | 0 | return (SECHashObjects[type].length); |
449 | 0 | } |
450 | | |
451 | | unsigned int |
452 | | HASH_ResultLenContext(HASHContext *context) |
453 | 0 | { |
454 | 0 | return (context->hashobj->length); |
455 | 0 | } |
456 | | |
457 | | SECStatus |
458 | | HASH_HashBuf(HASH_HashType type, |
459 | | unsigned char *dest, |
460 | | const unsigned char *src, |
461 | | PRUint32 src_len) |
462 | 0 | { |
463 | 0 | HASHContext *cx; |
464 | 0 | unsigned int part; |
465 | |
|
466 | 0 | if ((type < HASH_AlgNULL) || (type >= HASH_AlgTOTAL)) { |
467 | 0 | return (SECFailure); |
468 | 0 | } |
469 | | |
470 | 0 | cx = HASH_Create(type); |
471 | 0 | if (cx == NULL) { |
472 | 0 | return (SECFailure); |
473 | 0 | } |
474 | 0 | HASH_Begin(cx); |
475 | 0 | HASH_Update(cx, src, src_len); |
476 | 0 | HASH_End(cx, dest, &part, HASH_ResultLenContext(cx)); |
477 | 0 | HASH_Destroy(cx); |
478 | |
|
479 | 0 | return (SECSuccess); |
480 | 0 | } |
481 | | |
482 | | HASHContext * |
483 | | HASH_Create(HASH_HashType type) |
484 | 0 | { |
485 | 0 | void *hash_context = NULL; |
486 | 0 | HASHContext *ret = NULL; |
487 | |
|
488 | 0 | if ((type < HASH_AlgNULL) || (type >= HASH_AlgTOTAL)) { |
489 | 0 | return (NULL); |
490 | 0 | } |
491 | | |
492 | 0 | hash_context = (*SECHashObjects[type].create)(); |
493 | 0 | if (hash_context == NULL) { |
494 | 0 | goto loser; |
495 | 0 | } |
496 | | |
497 | 0 | ret = (HASHContext *)PORT_Alloc(sizeof(HASHContext)); |
498 | 0 | if (ret == NULL) { |
499 | 0 | goto loser; |
500 | 0 | } |
501 | | |
502 | 0 | ret->hash_context = hash_context; |
503 | 0 | ret->hashobj = &SECHashObjects[type]; |
504 | |
|
505 | 0 | return (ret); |
506 | | |
507 | 0 | loser: |
508 | 0 | if (hash_context != NULL) { |
509 | 0 | (*SECHashObjects[type].destroy)(hash_context, PR_TRUE); |
510 | 0 | } |
511 | |
|
512 | 0 | return (NULL); |
513 | 0 | } |
514 | | |
515 | | HASHContext * |
516 | | HASH_Clone(HASHContext *context) |
517 | 0 | { |
518 | 0 | void *hash_context = NULL; |
519 | 0 | HASHContext *ret = NULL; |
520 | |
|
521 | 0 | hash_context = (*context->hashobj->clone)(context->hash_context); |
522 | 0 | if (hash_context == NULL) { |
523 | 0 | goto loser; |
524 | 0 | } |
525 | | |
526 | 0 | ret = (HASHContext *)PORT_Alloc(sizeof(HASHContext)); |
527 | 0 | if (ret == NULL) { |
528 | 0 | goto loser; |
529 | 0 | } |
530 | | |
531 | 0 | ret->hash_context = hash_context; |
532 | 0 | ret->hashobj = context->hashobj; |
533 | |
|
534 | 0 | return (ret); |
535 | | |
536 | 0 | loser: |
537 | 0 | if (hash_context != NULL) { |
538 | 0 | (*context->hashobj->destroy)(hash_context, PR_TRUE); |
539 | 0 | } |
540 | |
|
541 | 0 | return (NULL); |
542 | 0 | } |
543 | | |
544 | | void |
545 | | HASH_Destroy(HASHContext *context) |
546 | 0 | { |
547 | 0 | (*context->hashobj->destroy)(context->hash_context, PR_TRUE); |
548 | 0 | PORT_Free(context); |
549 | 0 | return; |
550 | 0 | } |
551 | | |
552 | | void |
553 | | HASH_Begin(HASHContext *context) |
554 | 0 | { |
555 | 0 | (*context->hashobj->begin)(context->hash_context); |
556 | 0 | return; |
557 | 0 | } |
558 | | |
559 | | void |
560 | | HASH_Update(HASHContext *context, |
561 | | const unsigned char *src, |
562 | | unsigned int len) |
563 | 0 | { |
564 | 0 | (*context->hashobj->update)(context->hash_context, src, len); |
565 | 0 | return; |
566 | 0 | } |
567 | | |
568 | | void |
569 | | HASH_End(HASHContext *context, |
570 | | unsigned char *result, |
571 | | unsigned int *result_len, |
572 | | unsigned int max_result_len) |
573 | 0 | { |
574 | 0 | (*context->hashobj->end)(context->hash_context, result, result_len, |
575 | 0 | max_result_len); |
576 | 0 | return; |
577 | 0 | } |
578 | | |
579 | | HASH_HashType |
580 | | HASH_GetType(HASHContext *context) |
581 | 0 | { |
582 | 0 | return (context->hashobj->type); |
583 | 0 | } |