diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/lib/libcrypto/bn/bn_recp.c | 47 |
1 files changed, 23 insertions, 24 deletions
diff --git a/src/lib/libcrypto/bn/bn_recp.c b/src/lib/libcrypto/bn/bn_recp.c index 8f917e95db..757ed0c3d2 100644 --- a/src/lib/libcrypto/bn/bn_recp.c +++ b/src/lib/libcrypto/bn/bn_recp.c | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | /* $OpenBSD: bn_recp.c,v 1.30 2025/01/22 12:53:16 tb Exp $ */ | 1 | /* $OpenBSD: bn_recp.c,v 1.31 2025/02/04 05:09:53 tb Exp $ */ |
| 2 | /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) | 2 | /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) |
| 3 | * All rights reserved. | 3 | * All rights reserved. |
| 4 | * | 4 | * |
| @@ -139,34 +139,33 @@ BN_div_reciprocal(BIGNUM *dv, BIGNUM *rem, const BIGNUM *m, BN_RECP_CTX *recp, | |||
| 139 | int i, j, ret = 0; | 139 | int i, j, ret = 0; |
| 140 | BIGNUM *a, *b, *d, *r; | 140 | BIGNUM *a, *b, *d, *r; |
| 141 | 141 | ||
| 142 | if (BN_ucmp(m, recp->N) < 0) { | ||
| 143 | if (dv != NULL) | ||
| 144 | BN_zero(dv); | ||
| 145 | if (rem != NULL) | ||
| 146 | return bn_copy(rem, m); | ||
| 147 | return 1; | ||
| 148 | } | ||
| 149 | |||
| 142 | BN_CTX_start(ctx); | 150 | BN_CTX_start(ctx); |
| 143 | a = BN_CTX_get(ctx); | 151 | if ((a = BN_CTX_get(ctx)) == NULL) |
| 144 | b = BN_CTX_get(ctx); | 152 | goto err; |
| 145 | if (dv != NULL) | 153 | if ((b = BN_CTX_get(ctx)) == NULL) |
| 146 | d = dv; | 154 | goto err; |
| 147 | else | 155 | |
| 156 | if ((d = dv) == NULL) | ||
| 148 | d = BN_CTX_get(ctx); | 157 | d = BN_CTX_get(ctx); |
| 149 | if (rem != NULL) | 158 | if (d == NULL) |
| 150 | r = rem; | ||
| 151 | else | ||
| 152 | r = BN_CTX_get(ctx); | ||
| 153 | if (a == NULL || b == NULL || d == NULL || r == NULL) | ||
| 154 | goto err; | 159 | goto err; |
| 155 | 160 | ||
| 156 | if (BN_ucmp(m, recp->N) < 0) { | 161 | if ((r = rem) == NULL) |
| 157 | BN_zero(d); | 162 | r = BN_CTX_get(ctx); |
| 158 | if (!bn_copy(r, m)) { | 163 | if (r == NULL) |
| 159 | BN_CTX_end(ctx); | 164 | goto err; |
| 160 | return 0; | ||
| 161 | } | ||
| 162 | BN_CTX_end(ctx); | ||
| 163 | return 1; | ||
| 164 | } | ||
| 165 | 165 | ||
| 166 | /* We want the remainder | 166 | /* |
| 167 | * Given input of ABCDEF / ab | 167 | * We want the remainder. Given input of ABCDEF / ab we need to |
| 168 | * we need multiply ABCDEF by 3 digests of the reciprocal of ab | 168 | * multiply ABCDEF by 3 digits of the reciprocal of ab. |
| 169 | * | ||
| 170 | */ | 169 | */ |
| 171 | 170 | ||
| 172 | /* i := max(BN_num_bits(m), 2*BN_num_bits(N)) */ | 171 | /* i := max(BN_num_bits(m), 2*BN_num_bits(N)) */ |
