Skip to content

Commit 2c4f854

Browse files
authored
Merge pull request #10447 from mattia-moffa/20260508-blake2-long-key-fix
Fix Blake2 oversized key path
2 parents 4438615 + 5aa8e6a commit 2c4f854

3 files changed

Lines changed: 64 additions & 18 deletions

File tree

wolfcrypt/src/blake2b.c

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -501,6 +501,8 @@ int wc_Blake2bHmacInit(Blake2b* b2b, const byte* key, size_t key_len)
501501
if (key == NULL)
502502
return BAD_FUNC_ARG;
503503

504+
XMEMSET(x_key, 0, sizeof(x_key));
505+
504506
if (key_len > BLAKE2B_BLOCKBYTES) {
505507
ret = wc_InitBlake2b(b2b, BLAKE2B_OUTBYTES);
506508
if (ret == 0)
@@ -509,9 +511,6 @@ int wc_Blake2bHmacInit(Blake2b* b2b, const byte* key, size_t key_len)
509511
ret = wc_Blake2bFinal(b2b, x_key, 0);
510512
} else {
511513
XMEMCPY(x_key, key, key_len);
512-
if (key_len < BLAKE2B_BLOCKBYTES) {
513-
XMEMSET(x_key + key_len, 0, BLAKE2B_BLOCKBYTES - key_len);
514-
}
515514
}
516515

517516
if (ret == 0) {
@@ -541,6 +540,7 @@ int wc_Blake2bHmacFinal(Blake2b* b2b, const byte* key, size_t key_len,
541540
byte* out, size_t out_len)
542541
{
543542
byte x_key[BLAKE2B_BLOCKBYTES];
543+
Blake2b keyHash;
544544
int i;
545545
int ret = 0;
546546

@@ -550,17 +550,17 @@ int wc_Blake2bHmacFinal(Blake2b* b2b, const byte* key, size_t key_len,
550550
if (out_len != BLAKE2B_OUTBYTES)
551551
return BUFFER_E;
552552

553+
XMEMSET(x_key, 0, sizeof(x_key));
554+
553555
if (key_len > BLAKE2B_BLOCKBYTES) {
554-
ret = wc_InitBlake2b(b2b, BLAKE2B_OUTBYTES);
556+
ret = wc_InitBlake2b(&keyHash, BLAKE2B_OUTBYTES);
555557
if (ret == 0)
556-
ret = wc_Blake2bUpdate(b2b, key, (word32)key_len);
558+
ret = wc_Blake2bUpdate(&keyHash, key, (word32)key_len);
557559
if (ret == 0)
558-
ret = wc_Blake2bFinal(b2b, x_key, 0);
560+
ret = wc_Blake2bFinal(&keyHash, x_key, 0);
561+
ForceZero(&keyHash, sizeof(keyHash));
559562
} else {
560563
XMEMCPY(x_key, key, key_len);
561-
if (key_len < BLAKE2B_BLOCKBYTES) {
562-
XMEMSET(x_key + key_len, 0, BLAKE2B_BLOCKBYTES - key_len);
563-
}
564564
}
565565

566566
if (ret == 0) {

wolfcrypt/src/blake2s.c

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -498,6 +498,8 @@ int wc_Blake2sHmacInit(Blake2s* b2s, const byte* key, size_t key_len)
498498
if (key == NULL)
499499
return BAD_FUNC_ARG;
500500

501+
XMEMSET(x_key, 0, sizeof(x_key));
502+
501503
if (key_len > BLAKE2S_BLOCKBYTES) {
502504
ret = wc_InitBlake2s(b2s, BLAKE2S_OUTBYTES);
503505
if (ret == 0)
@@ -506,9 +508,6 @@ int wc_Blake2sHmacInit(Blake2s* b2s, const byte* key, size_t key_len)
506508
ret = wc_Blake2sFinal(b2s, x_key, 0);
507509
} else {
508510
XMEMCPY(x_key, key, key_len);
509-
if (key_len < BLAKE2S_BLOCKBYTES) {
510-
XMEMSET(x_key + key_len, 0, BLAKE2S_BLOCKBYTES - key_len);
511-
}
512511
}
513512

514513
if (ret == 0) {
@@ -538,6 +537,7 @@ int wc_Blake2sHmacFinal(Blake2s* b2s, const byte* key, size_t key_len,
538537
byte* out, size_t out_len)
539538
{
540539
byte x_key[BLAKE2S_BLOCKBYTES];
540+
Blake2s keyHash;
541541
int i;
542542
int ret = 0;
543543

@@ -547,17 +547,17 @@ int wc_Blake2sHmacFinal(Blake2s* b2s, const byte* key, size_t key_len,
547547
if (out_len != BLAKE2S_OUTBYTES)
548548
return BUFFER_E;
549549

550+
XMEMSET(x_key, 0, sizeof(x_key));
551+
550552
if (key_len > BLAKE2S_BLOCKBYTES) {
551-
ret = wc_InitBlake2s(b2s, BLAKE2S_OUTBYTES);
553+
ret = wc_InitBlake2s(&keyHash, BLAKE2S_OUTBYTES);
552554
if (ret == 0)
553-
ret = wc_Blake2sUpdate(b2s, key, (word32)key_len);
555+
ret = wc_Blake2sUpdate(&keyHash, key, (word32)key_len);
554556
if (ret == 0)
555-
ret = wc_Blake2sFinal(b2s, x_key, 0);
557+
ret = wc_Blake2sFinal(&keyHash, x_key, 0);
558+
ForceZero(&keyHash, sizeof(keyHash));
556559
} else {
557560
XMEMCPY(x_key, key, key_len);
558-
if (key_len < BLAKE2S_BLOCKBYTES) {
559-
XMEMSET(x_key + key_len, 0, BLAKE2S_BLOCKBYTES - key_len);
560-
}
561561
}
562562

563563
if (ret == 0) {

wolfcrypt/test/test.c

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5196,6 +5196,31 @@ WOLFSSL_TEST_SUBROUTINE wc_test_ret_t blake2b_hmac_test(void)
51965196
if (ret != 0)
51975197
return WC_TEST_RET_ENC_EC(ret);
51985198

5199+
{
5200+
byte long_key[BLAKE2B_BLOCKBYTES + 72];
5201+
static const byte expected_long[] = {
5202+
0xb5, 0x17, 0xd2, 0x26, 0xcb, 0x6c, 0xa2, 0x09,
5203+
0xd2, 0x56, 0x30, 0xa2, 0x55, 0xe9, 0xfa, 0xfb,
5204+
0x1e, 0x0f, 0xbf, 0x60, 0x00, 0xbd, 0x44, 0x09,
5205+
0xb7, 0xf6, 0x25, 0x75, 0x90, 0x80, 0xb1, 0xde,
5206+
0x72, 0xa5, 0x8a, 0x15, 0x95, 0xd2, 0x49, 0x8d,
5207+
0x4c, 0xdc, 0xc8, 0x68, 0x68, 0xa5, 0x07, 0x62,
5208+
0x10, 0x64, 0x0b, 0x20, 0x0b, 0xe0, 0xb0, 0xb2,
5209+
0x13, 0xf4, 0x2d, 0x42, 0x15, 0x7a, 0x5c, 0xd6,
5210+
};
5211+
int i;
5212+
5213+
for (i = 0; i < (int)sizeof(long_key); ++i)
5214+
long_key[i] = (byte)i;
5215+
5216+
ret = wc_Blake2bHmac(message2, sizeof(message2),
5217+
long_key, sizeof(long_key), out, sizeof(out));
5218+
if (ret != 0)
5219+
return WC_TEST_RET_ENC_EC(ret);
5220+
if (XMEMCMP(out, expected_long, sizeof(out)) != 0)
5221+
return WC_TEST_RET_ENC_NC;
5222+
}
5223+
51995224
return 0;
52005225
}
52015226
#endif /* HAVE_BLAKE2B */
@@ -5334,6 +5359,27 @@ WOLFSSL_TEST_SUBROUTINE wc_test_ret_t blake2s_hmac_test(void)
53345359
if (ret != 0)
53355360
return WC_TEST_RET_ENC_EC(ret);
53365361

5362+
{
5363+
byte long_key[BLAKE2S_BLOCKBYTES + 36];
5364+
static const byte expected_long[] = {
5365+
0x1a, 0xd0, 0x73, 0xd7, 0xba, 0xab, 0x55, 0x83,
5366+
0x26, 0xa8, 0xc2, 0x71, 0xf2, 0x1a, 0xdf, 0x3e,
5367+
0x28, 0x57, 0x14, 0x49, 0x3a, 0x26, 0x33, 0xe7,
5368+
0x7f, 0xf4, 0xca, 0x1a, 0xfd, 0xa3, 0xe0, 0xd9,
5369+
};
5370+
int i;
5371+
5372+
for (i = 0; i < (int)sizeof(long_key); ++i)
5373+
long_key[i] = (byte)i;
5374+
5375+
ret = wc_Blake2sHmac(message2, sizeof(message2),
5376+
long_key, sizeof(long_key), out, sizeof(out));
5377+
if (ret != 0)
5378+
return WC_TEST_RET_ENC_EC(ret);
5379+
if (XMEMCMP(out, expected_long, sizeof(out)) != 0)
5380+
return WC_TEST_RET_ENC_NC;
5381+
}
5382+
53375383
return 0;
53385384
}
53395385
#endif /* HAVE_BLAKE2S */

0 commit comments

Comments
 (0)