Skip to content

Commit b6b8de1

Browse files
committed
Add bounds checks for Blake2 digest size
1 parent 24f9981 commit b6b8de1

3 files changed

Lines changed: 54 additions & 0 deletions

File tree

tests/api/test_blake2.c

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,12 @@ int test_wc_InitBlake2b(void)
5050
ExpectIntEQ(wc_InitBlake2b(&blake, 128), WC_NO_ERR_TRACE(BAD_FUNC_ARG));
5151
ExpectIntEQ(wc_InitBlake2b(NULL, WC_BLAKE2B_DIGEST_SIZE),
5252
WC_NO_ERR_TRACE(BAD_FUNC_ARG));
53+
/* digestSz values that truncate via (byte) cast to a valid size must be
54+
* rejected: 257 mod 256 = 1, 320 mod 256 = 64 - both within BLAKE2B range */
55+
ExpectIntEQ(wc_InitBlake2b(&blake, 257),
56+
WC_NO_ERR_TRACE(BAD_FUNC_ARG));
57+
ExpectIntEQ(wc_InitBlake2b(&blake, 256 + BLAKE2B_OUTBYTES),
58+
WC_NO_ERR_TRACE(BAD_FUNC_ARG));
5359

5460
/* Test good arg. */
5561
ExpectIntEQ(wc_InitBlake2b(&blake, WC_BLAKE2B_DIGEST_SIZE), 0);
@@ -82,6 +88,12 @@ int test_wc_InitBlake2b_WithKey(void)
8288
ExpectIntEQ(wc_InitBlake2b_WithKey(NULL, digestSz, key, keylen),
8389
WC_NO_ERR_TRACE(BAD_FUNC_ARG));
8490

91+
/* digestSz that truncates to a valid byte-sized value must be rejected */
92+
ExpectIntEQ(wc_InitBlake2b_WithKey(&blake, 257, NULL, keylen),
93+
WC_NO_ERR_TRACE(BAD_FUNC_ARG));
94+
ExpectIntEQ(wc_InitBlake2b_WithKey(&blake, 256 + BLAKE2B_OUTBYTES, NULL, keylen),
95+
WC_NO_ERR_TRACE(BAD_FUNC_ARG));
96+
8597
/* Test good arg. */
8698
ExpectIntEQ(wc_InitBlake2b_WithKey(&blake, digestSz, NULL, keylen), 0);
8799
ExpectIntEQ(wc_InitBlake2b_WithKey(&blake, digestSz, key, keylen), 0);
@@ -127,8 +139,14 @@ int test_wc_Blake2bFinal(void)
127139
ExpectIntEQ(wc_Blake2bFinal(&blake, NULL, 0),
128140
WC_NO_ERR_TRACE(BAD_FUNC_ARG));
129141
ExpectIntEQ(wc_Blake2bFinal(NULL, hash, 0), WC_NO_ERR_TRACE(BAD_FUNC_ARG));
142+
/* requestSz that truncates to valid byte must be rejected */
143+
ExpectIntEQ(wc_Blake2bFinal(&blake, hash, 257),
144+
WC_NO_ERR_TRACE(BAD_FUNC_ARG));
145+
ExpectIntEQ(wc_Blake2bFinal(&blake, hash, 256 + BLAKE2B_OUTBYTES),
146+
WC_NO_ERR_TRACE(BAD_FUNC_ARG));
130147

131148
/* Test good args. */
149+
ExpectIntEQ(wc_InitBlake2b(&blake, WC_BLAKE2B_DIGEST_SIZE), 0);
132150
ExpectIntEQ(wc_Blake2bFinal(&blake, hash, WC_BLAKE2B_DIGEST_SIZE), 0);
133151
#endif
134152
return EXPECT_RESULT();
@@ -322,6 +340,12 @@ int test_wc_InitBlake2s(void)
322340
ExpectIntEQ(wc_InitBlake2s(&blake, 128), WC_NO_ERR_TRACE(BAD_FUNC_ARG));
323341
ExpectIntEQ(wc_InitBlake2s(NULL, WC_BLAKE2S_DIGEST_SIZE),
324342
WC_NO_ERR_TRACE(BAD_FUNC_ARG));
343+
/* digestSz that truncates via (byte) cast to a valid size must be rejected:
344+
* 257 mod 256 = 1, 288 mod 256 = 32 - both within BLAKE2S range */
345+
ExpectIntEQ(wc_InitBlake2s(&blake, 257),
346+
WC_NO_ERR_TRACE(BAD_FUNC_ARG));
347+
ExpectIntEQ(wc_InitBlake2s(&blake, 256 + BLAKE2S_OUTBYTES),
348+
WC_NO_ERR_TRACE(BAD_FUNC_ARG));
325349

326350
/* Test good arg. */
327351
ExpectIntEQ(wc_InitBlake2s(&blake, WC_BLAKE2S_DIGEST_SIZE), 0);
@@ -352,6 +376,12 @@ int test_wc_InitBlake2s_WithKey(void)
352376
ExpectIntEQ(wc_InitBlake2s_WithKey(NULL, digestSz, key, keylen),
353377
WC_NO_ERR_TRACE(BAD_FUNC_ARG));
354378

379+
/* digestSz that truncates to a valid byte-sized value must be rejected */
380+
ExpectIntEQ(wc_InitBlake2s_WithKey(&blake, 257, NULL, keylen),
381+
WC_NO_ERR_TRACE(BAD_FUNC_ARG));
382+
ExpectIntEQ(wc_InitBlake2s_WithKey(&blake, 256 + BLAKE2S_OUTBYTES, NULL, keylen),
383+
WC_NO_ERR_TRACE(BAD_FUNC_ARG));
384+
355385
/* Test good arg. */
356386
ExpectIntEQ(wc_InitBlake2s_WithKey(&blake, digestSz, NULL, keylen), 0);
357387
ExpectIntEQ(wc_InitBlake2s_WithKey(&blake, digestSz, key, keylen), 0);
@@ -397,8 +427,14 @@ int test_wc_Blake2sFinal(void)
397427
ExpectIntEQ(wc_Blake2sFinal(&blake, NULL, 0),
398428
WC_NO_ERR_TRACE(BAD_FUNC_ARG));
399429
ExpectIntEQ(wc_Blake2sFinal(NULL, hash, 0), WC_NO_ERR_TRACE(BAD_FUNC_ARG));
430+
/* requestSz that truncates to valid byte must be rejected */
431+
ExpectIntEQ(wc_Blake2sFinal(&blake, hash, 257),
432+
WC_NO_ERR_TRACE(BAD_FUNC_ARG));
433+
ExpectIntEQ(wc_Blake2sFinal(&blake, hash, 256 + BLAKE2S_OUTBYTES),
434+
WC_NO_ERR_TRACE(BAD_FUNC_ARG));
400435

401436
/* Test good args. */
437+
ExpectIntEQ(wc_InitBlake2s(&blake, WC_BLAKE2S_DIGEST_SIZE), 0);
402438
ExpectIntEQ(wc_Blake2sFinal(&blake, hash, WC_BLAKE2S_DIGEST_SIZE), 0);
403439
#endif
404440
return EXPECT_RESULT();

wolfcrypt/src/blake2b.c

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -426,6 +426,9 @@ int wc_InitBlake2b(Blake2b* b2b, word32 digestSz)
426426
if (b2b == NULL){
427427
return BAD_FUNC_ARG;
428428
}
429+
if (digestSz == 0 || digestSz > BLAKE2B_OUTBYTES) {
430+
return BAD_FUNC_ARG;
431+
}
429432
b2b->digestSz = digestSz;
430433

431434
return blake2b_init(b2b->S, (byte)digestSz);
@@ -437,6 +440,9 @@ int wc_InitBlake2b_WithKey(Blake2b* b2b, word32 digestSz, const byte *key, word3
437440
if (b2b == NULL){
438441
return BAD_FUNC_ARG;
439442
}
443+
if (digestSz == 0 || digestSz > BLAKE2B_OUTBYTES) {
444+
return BAD_FUNC_ARG;
445+
}
440446
b2b->digestSz = digestSz;
441447

442448
if (keylen >= 256)
@@ -478,6 +484,9 @@ int wc_Blake2bFinal(Blake2b* b2b, byte* final, word32 requestSz)
478484
}
479485

480486
sz = requestSz ? requestSz : b2b->digestSz;
487+
if (sz == 0 || sz > BLAKE2B_OUTBYTES) {
488+
return BAD_FUNC_ARG;
489+
}
481490

482491
return blake2b_final(b2b->S, final, (byte)sz);
483492
}

wolfcrypt/src/blake2s.c

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -421,6 +421,9 @@ int wc_InitBlake2s(Blake2s* b2s, word32 digestSz)
421421
if (b2s == NULL){
422422
return BAD_FUNC_ARG;
423423
}
424+
if (digestSz == 0 || digestSz > BLAKE2S_OUTBYTES) {
425+
return BAD_FUNC_ARG;
426+
}
424427
b2s->digestSz = digestSz;
425428

426429
return blake2s_init(b2s->S, (byte)digestSz);
@@ -433,6 +436,9 @@ int wc_InitBlake2s_WithKey(Blake2s* b2s, word32 digestSz, const byte *key, word3
433436
if (b2s == NULL){
434437
return BAD_FUNC_ARG;
435438
}
439+
if (digestSz == 0 || digestSz > BLAKE2S_OUTBYTES) {
440+
return BAD_FUNC_ARG;
441+
}
436442
b2s->digestSz = digestSz;
437443

438444
if (keylen >= 256)
@@ -475,6 +481,9 @@ int wc_Blake2sFinal(Blake2s* b2s, byte* final, word32 requestSz)
475481
}
476482

477483
sz = requestSz ? requestSz : b2s->digestSz;
484+
if (sz == 0 || sz > BLAKE2S_OUTBYTES) {
485+
return BAD_FUNC_ARG;
486+
}
478487

479488
return blake2s_final(b2s->S, final, (byte)sz);
480489
}

0 commit comments

Comments
 (0)