diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/lib/libcrypto/bn/bn_mod.c | 45 |
1 files changed, 44 insertions, 1 deletions
diff --git a/src/lib/libcrypto/bn/bn_mod.c b/src/lib/libcrypto/bn/bn_mod.c index 868ef5bc5b..79766d0036 100644 --- a/src/lib/libcrypto/bn/bn_mod.c +++ b/src/lib/libcrypto/bn/bn_mod.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: bn_mod.c,v 1.20 2023/03/27 10:21:23 tb Exp $ */ | 1 | /* $OpenBSD: bn_mod.c,v 1.21 2023/06/13 09:28:13 tb Exp $ */ |
2 | /* Includes code written by Lenka Fibikova <fibikova@exp-math.uni-essen.de> | 2 | /* Includes code written by Lenka Fibikova <fibikova@exp-math.uni-essen.de> |
3 | * for the OpenSSL project. */ | 3 | * for the OpenSSL project. */ |
4 | /* ==================================================================== | 4 | /* ==================================================================== |
@@ -136,6 +136,10 @@ BN_mod_nonct(BIGNUM *r, const BIGNUM *a, const BIGNUM *m, BN_CTX *ctx) | |||
136 | int | 136 | int |
137 | BN_nnmod(BIGNUM *r, const BIGNUM *a, const BIGNUM *m, BN_CTX *ctx) | 137 | BN_nnmod(BIGNUM *r, const BIGNUM *a, const BIGNUM *m, BN_CTX *ctx) |
138 | { | 138 | { |
139 | if (r == m) { | ||
140 | BNerror(BN_R_INVALID_ARGUMENT); | ||
141 | return 0; | ||
142 | } | ||
139 | if (!BN_mod_ct(r, a, m, ctx)) | 143 | if (!BN_mod_ct(r, a, m, ctx)) |
140 | return 0; | 144 | return 0; |
141 | if (BN_is_negative(r)) | 145 | if (BN_is_negative(r)) |
@@ -147,6 +151,10 @@ int | |||
147 | BN_mod_add(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, const BIGNUM *m, | 151 | BN_mod_add(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, const BIGNUM *m, |
148 | BN_CTX *ctx) | 152 | BN_CTX *ctx) |
149 | { | 153 | { |
154 | if (r == m) { | ||
155 | BNerror(BN_R_INVALID_ARGUMENT); | ||
156 | return 0; | ||
157 | } | ||
150 | if (!BN_add(r, a, b)) | 158 | if (!BN_add(r, a, b)) |
151 | return 0; | 159 | return 0; |
152 | return BN_nnmod(r, r, m, ctx); | 160 | return BN_nnmod(r, r, m, ctx); |
@@ -159,6 +167,10 @@ BN_mod_add(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, const BIGNUM *m, | |||
159 | int | 167 | int |
160 | BN_mod_add_quick(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, const BIGNUM *m) | 168 | BN_mod_add_quick(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, const BIGNUM *m) |
161 | { | 169 | { |
170 | if (r == m) { | ||
171 | BNerror(BN_R_INVALID_ARGUMENT); | ||
172 | return 0; | ||
173 | } | ||
162 | if (!BN_uadd(r, a, b)) | 174 | if (!BN_uadd(r, a, b)) |
163 | return 0; | 175 | return 0; |
164 | if (BN_ucmp(r, m) >= 0) | 176 | if (BN_ucmp(r, m) >= 0) |
@@ -170,6 +182,10 @@ int | |||
170 | BN_mod_sub(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, const BIGNUM *m, | 182 | BN_mod_sub(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, const BIGNUM *m, |
171 | BN_CTX *ctx) | 183 | BN_CTX *ctx) |
172 | { | 184 | { |
185 | if (r == m) { | ||
186 | BNerror(BN_R_INVALID_ARGUMENT); | ||
187 | return 0; | ||
188 | } | ||
173 | if (!BN_sub(r, a, b)) | 189 | if (!BN_sub(r, a, b)) |
174 | return 0; | 190 | return 0; |
175 | return BN_nnmod(r, r, m, ctx); | 191 | return BN_nnmod(r, r, m, ctx); |
@@ -182,6 +198,10 @@ BN_mod_sub(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, const BIGNUM *m, | |||
182 | int | 198 | int |
183 | BN_mod_sub_quick(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, const BIGNUM *m) | 199 | BN_mod_sub_quick(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, const BIGNUM *m) |
184 | { | 200 | { |
201 | if (r == m) { | ||
202 | BNerror(BN_R_INVALID_ARGUMENT); | ||
203 | return 0; | ||
204 | } | ||
185 | if (BN_ucmp(a, b) >= 0) | 205 | if (BN_ucmp(a, b) >= 0) |
186 | return BN_usub(r, a, b); | 206 | return BN_usub(r, a, b); |
187 | if (!BN_usub(r, b, a)) | 207 | if (!BN_usub(r, b, a)) |
@@ -198,6 +218,11 @@ BN_mod_mul(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, const BIGNUM *m, | |||
198 | 218 | ||
199 | BN_CTX_start(ctx); | 219 | BN_CTX_start(ctx); |
200 | 220 | ||
221 | if (r == m) { | ||
222 | BNerror(BN_R_INVALID_ARGUMENT); | ||
223 | goto err; | ||
224 | } | ||
225 | |||
201 | rr = r; | 226 | rr = r; |
202 | if (rr == a || rr == b) | 227 | if (rr == a || rr == b) |
203 | rr = BN_CTX_get(ctx); | 228 | rr = BN_CTX_get(ctx); |
@@ -231,6 +256,10 @@ BN_mod_sqr(BIGNUM *r, const BIGNUM *a, const BIGNUM *m, BN_CTX *ctx) | |||
231 | int | 256 | int |
232 | BN_mod_lshift1(BIGNUM *r, const BIGNUM *a, const BIGNUM *m, BN_CTX *ctx) | 257 | BN_mod_lshift1(BIGNUM *r, const BIGNUM *a, const BIGNUM *m, BN_CTX *ctx) |
233 | { | 258 | { |
259 | if (r == m) { | ||
260 | BNerror(BN_R_INVALID_ARGUMENT); | ||
261 | return 0; | ||
262 | } | ||
234 | if (!BN_lshift1(r, a)) | 263 | if (!BN_lshift1(r, a)) |
235 | return 0; | 264 | return 0; |
236 | return BN_nnmod(r, r, m, ctx); | 265 | return BN_nnmod(r, r, m, ctx); |
@@ -243,6 +272,10 @@ BN_mod_lshift1(BIGNUM *r, const BIGNUM *a, const BIGNUM *m, BN_CTX *ctx) | |||
243 | int | 272 | int |
244 | BN_mod_lshift1_quick(BIGNUM *r, const BIGNUM *a, const BIGNUM *m) | 273 | BN_mod_lshift1_quick(BIGNUM *r, const BIGNUM *a, const BIGNUM *m) |
245 | { | 274 | { |
275 | if (r == m) { | ||
276 | BNerror(BN_R_INVALID_ARGUMENT); | ||
277 | return 0; | ||
278 | } | ||
246 | if (!BN_lshift1(r, a)) | 279 | if (!BN_lshift1(r, a)) |
247 | return 0; | 280 | return 0; |
248 | if (BN_ucmp(r, m) >= 0) | 281 | if (BN_ucmp(r, m) >= 0) |
@@ -258,6 +291,11 @@ BN_mod_lshift(BIGNUM *r, const BIGNUM *a, int n, const BIGNUM *m, BN_CTX *ctx) | |||
258 | 291 | ||
259 | BN_CTX_start(ctx); | 292 | BN_CTX_start(ctx); |
260 | 293 | ||
294 | if (r == m) { | ||
295 | BNerror(BN_R_INVALID_ARGUMENT); | ||
296 | goto err; | ||
297 | } | ||
298 | |||
261 | if (!BN_nnmod(r, a, m, ctx)) | 299 | if (!BN_nnmod(r, a, m, ctx)) |
262 | goto err; | 300 | goto err; |
263 | 301 | ||
@@ -288,6 +326,11 @@ BN_mod_lshift_quick(BIGNUM *r, const BIGNUM *a, int n, const BIGNUM *m) | |||
288 | { | 326 | { |
289 | int max_shift; | 327 | int max_shift; |
290 | 328 | ||
329 | if (r == m) { | ||
330 | BNerror(BN_R_INVALID_ARGUMENT); | ||
331 | return 0; | ||
332 | } | ||
333 | |||
291 | if (!bn_copy(r, a)) | 334 | if (!bn_copy(r, a)) |
292 | return 0; | 335 | return 0; |
293 | 336 | ||