Coverage Report

Created: 2024-05-20 06:23

/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
9.83k
{
244
9.83k
    HASH_HashType ht = HASH_AlgNULL;
245
246
9.83k
    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
9.56k
        case SEC_OID_SHA1:
254
9.56k
            ht = HASH_AlgSHA1;
255
9.56k
            break;
256
0
        case SEC_OID_SHA224:
257
0
            ht = HASH_AlgSHA224;
258
0
            break;
259
116
        case SEC_OID_SHA256:
260
116
            ht = HASH_AlgSHA256;
261
116
            break;
262
88
        case SEC_OID_SHA384:
263
88
            ht = HASH_AlgSHA384;
264
88
            break;
265
62
        case SEC_OID_SHA512:
266
62
            ht = HASH_AlgSHA512;
267
62
            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
9.83k
    }
284
9.83k
    return ht;
285
9.83k
}
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
9.83k
{
422
9.83k
    HASH_HashType ht = HASH_GetHashTypeByOidTag(hashOid);
423
424
9.83k
    return (ht == HASH_AlgNULL) ? NULL : &SECHashObjects[ht];
425
9.83k
}
426
427
/* returns zero for unknown hash OID */
428
unsigned int
429
HASH_ResultLenByOidTag(SECOidTag hashOid)
430
9.83k
{
431
9.83k
    const SECHashObject *hashObject = HASH_GetHashObjectByOidTag(hashOid);
432
9.83k
    unsigned int resultLen = 0;
433
434
9.83k
    if (hashObject)
435
9.83k
        resultLen = hashObject->length;
436
9.83k
    return resultLen;
437
9.83k
}
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
}