summaryrefslogtreecommitdiff
path: root/src/lib/libcrypto/bn
diff options
context:
space:
mode:
authorschwarze <>2022-11-20 23:35:00 +0000
committerschwarze <>2022-11-20 23:35:00 +0000
commit24b92fa9d36633c9630c63433973fe680957c836 (patch)
tree77658a9ec93316a585244f95b6ac2df89c015491 /src/lib/libcrypto/bn
parent3585c6fd96623cbda97253ab2fb8f0742ceaef83 (diff)
downloadopenbsd-24b92fa9d36633c9630c63433973fe680957c836.tar.gz
openbsd-24b92fa9d36633c9630c63433973fe680957c836.tar.bz2
openbsd-24b92fa9d36633c9630c63433973fe680957c836.zip
Fix a surprising quirk in BN_GF2m_mod(3).
All other wrappers in the same file that use a temporary array of degrees size that array dynamically, such that they are able to handle reducing polynomials of arbitrary lengths. BN_GF2m_mod(3) was the only one that used a static array of size 6 instead, limiting it to trinomials and pentanomials and causing it to fail for longer reducing polynomials. Make this more uniform and less surprising by using exactly the same code as in all the other wrappers, such that BN_GF2m_mod(3) works with reducing polynomials of arbitrary length, too, just like the others. Again, tb@ points out this quirk is very unlikely to cause vulnerabilities in practice because cryptographic applications do not use longer reducing polynomials. This patch is not expected to significantly impact performance because the relevant caller, BN_GF2m_mod_div(3), already uses dynamic allocation via BN_GF2m_mod_mul(3). OK tb@
Diffstat (limited to 'src/lib/libcrypto/bn')
-rw-r--r--src/lib/libcrypto/bn/bn_gf2m.c16
1 files changed, 11 insertions, 5 deletions
diff --git a/src/lib/libcrypto/bn/bn_gf2m.c b/src/lib/libcrypto/bn/bn_gf2m.c
index 1fd7105a31..b9e3ba8566 100644
--- a/src/lib/libcrypto/bn/bn_gf2m.c
+++ b/src/lib/libcrypto/bn/bn_gf2m.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: bn_gf2m.c,v 1.24 2022/11/20 22:23:43 schwarze Exp $ */ 1/* $OpenBSD: bn_gf2m.c,v 1.25 2022/11/20 23:35:00 schwarze Exp $ */
2/* ==================================================================== 2/* ====================================================================
3 * Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED. 3 * Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED.
4 * 4 *
@@ -464,17 +464,23 @@ int
464BN_GF2m_mod(BIGNUM *r, const BIGNUM *a, const BIGNUM *p) 464BN_GF2m_mod(BIGNUM *r, const BIGNUM *a, const BIGNUM *p)
465{ 465{
466 int ret = 0; 466 int ret = 0;
467 int arr[6]; 467 const int max = BN_num_bits(p) + 1;
468 int *arr = NULL;
468 469
469 bn_check_top(a); 470 bn_check_top(a);
470 bn_check_top(p); 471 bn_check_top(p);
471 ret = BN_GF2m_poly2arr(p, arr, sizeof(arr) / sizeof(arr[0])); 472 if ((arr = reallocarray(NULL, max, sizeof(int))) == NULL)
472 if (!ret || ret > (int)(sizeof(arr) / sizeof(arr[0]))) { 473 goto err;
474 ret = BN_GF2m_poly2arr(p, arr, max);
475 if (!ret || ret > max) {
473 BNerror(BN_R_INVALID_LENGTH); 476 BNerror(BN_R_INVALID_LENGTH);
474 return 0; 477 goto err;
475 } 478 }
476 ret = BN_GF2m_mod_arr(r, a, arr); 479 ret = BN_GF2m_mod_arr(r, a, arr);
477 bn_check_top(r); 480 bn_check_top(r);
481
482 err:
483 free(arr);
478 return ret; 484 return ret;
479} 485}
480 486