diff options
Diffstat (limited to 'src/lib')
-rw-r--r-- | src/lib/libcrypto/ec/ec2_mult.c | 14 | ||||
-rw-r--r-- | src/lib/libcrypto/ec/ec2_oct.c | 59 | ||||
-rw-r--r-- | src/lib/libcrypto/ec/ec2_smpl.c | 78 | ||||
-rw-r--r-- | src/lib/libcrypto/ec/ec_check.c | 31 | ||||
-rw-r--r-- | src/lib/libcrypto/ec/ec_lib.c | 452 | ||||
-rw-r--r-- | src/lib/libcrypto/ec/ec_mult.c | 22 | ||||
-rw-r--r-- | src/lib/libcrypto/ec/ec_oct.c | 70 | ||||
-rw-r--r-- | src/lib/libcrypto/ec/ecp_mont.c | 12 | ||||
-rw-r--r-- | src/lib/libcrypto/ec/ecp_nist.c | 58 | ||||
-rw-r--r-- | src/lib/libcrypto/ec/ecp_oct.c | 62 | ||||
-rw-r--r-- | src/lib/libcrypto/ec/ecp_smpl.c | 186 |
11 files changed, 553 insertions, 491 deletions
diff --git a/src/lib/libcrypto/ec/ec2_mult.c b/src/lib/libcrypto/ec/ec2_mult.c index d32b7442c4..d7cbd933f2 100644 --- a/src/lib/libcrypto/ec/ec2_mult.c +++ b/src/lib/libcrypto/ec/ec2_mult.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: ec2_mult.c,v 1.16 2023/03/27 10:25:02 tb Exp $ */ | 1 | /* $OpenBSD: ec2_mult.c,v 1.17 2023/04/11 18:58:20 jsing Exp $ */ |
2 | /* ==================================================================== | 2 | /* ==================================================================== |
3 | * Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED. | 3 | * Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED. |
4 | * | 4 | * |
@@ -375,17 +375,11 @@ int | |||
375 | ec_GF2m_simple_mul(const EC_GROUP *group, EC_POINT *r, const BIGNUM *scalar, | 375 | ec_GF2m_simple_mul(const EC_GROUP *group, EC_POINT *r, const BIGNUM *scalar, |
376 | size_t num, const EC_POINT *points[], const BIGNUM *scalars[], BN_CTX *ctx) | 376 | size_t num, const EC_POINT *points[], const BIGNUM *scalars[], BN_CTX *ctx) |
377 | { | 377 | { |
378 | BN_CTX *new_ctx = NULL; | ||
379 | int ret = 0; | ||
380 | size_t i; | ||
381 | EC_POINT *p = NULL; | 378 | EC_POINT *p = NULL; |
382 | EC_POINT *acc = NULL; | 379 | EC_POINT *acc = NULL; |
380 | size_t i; | ||
381 | int ret = 0; | ||
383 | 382 | ||
384 | if (ctx == NULL) { | ||
385 | ctx = new_ctx = BN_CTX_new(); | ||
386 | if (ctx == NULL) | ||
387 | return 0; | ||
388 | } | ||
389 | /* | 383 | /* |
390 | * This implementation is more efficient than the wNAF implementation | 384 | * This implementation is more efficient than the wNAF implementation |
391 | * for 2 or fewer points. Use the ec_wNAF_mul implementation for 3 | 385 | * for 2 or fewer points. Use the ec_wNAF_mul implementation for 3 |
@@ -432,7 +426,7 @@ ec_GF2m_simple_mul(const EC_GROUP *group, EC_POINT *r, const BIGNUM *scalar, | |||
432 | err: | 426 | err: |
433 | EC_POINT_free(p); | 427 | EC_POINT_free(p); |
434 | EC_POINT_free(acc); | 428 | EC_POINT_free(acc); |
435 | BN_CTX_free(new_ctx); | 429 | |
436 | return ret; | 430 | return ret; |
437 | } | 431 | } |
438 | 432 | ||
diff --git a/src/lib/libcrypto/ec/ec2_oct.c b/src/lib/libcrypto/ec/ec2_oct.c index d3fbc12749..6cb7259824 100644 --- a/src/lib/libcrypto/ec/ec2_oct.c +++ b/src/lib/libcrypto/ec/ec2_oct.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: ec2_oct.c,v 1.19 2022/11/26 16:08:52 tb Exp $ */ | 1 | /* $OpenBSD: ec2_oct.c,v 1.20 2023/04/11 18:58:20 jsing Exp $ */ |
2 | /* ==================================================================== | 2 | /* ==================================================================== |
3 | * Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED. | 3 | * Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED. |
4 | * | 4 | * |
@@ -94,21 +94,17 @@ int | |||
94 | ec_GF2m_simple_set_compressed_coordinates(const EC_GROUP *group, EC_POINT *point, | 94 | ec_GF2m_simple_set_compressed_coordinates(const EC_GROUP *group, EC_POINT *point, |
95 | const BIGNUM *x_, int y_bit, BN_CTX *ctx) | 95 | const BIGNUM *x_, int y_bit, BN_CTX *ctx) |
96 | { | 96 | { |
97 | BN_CTX *new_ctx = NULL; | ||
98 | BIGNUM *tmp, *x, *y, *z; | 97 | BIGNUM *tmp, *x, *y, *z; |
99 | int ret = 0, z0; | 98 | int z0; |
99 | int ret = 0; | ||
100 | 100 | ||
101 | /* clear error queue */ | 101 | /* clear error queue */ |
102 | ERR_clear_error(); | 102 | ERR_clear_error(); |
103 | 103 | ||
104 | if (ctx == NULL) { | ||
105 | ctx = new_ctx = BN_CTX_new(); | ||
106 | if (ctx == NULL) | ||
107 | return 0; | ||
108 | } | ||
109 | y_bit = (y_bit != 0) ? 1 : 0; | 104 | y_bit = (y_bit != 0) ? 1 : 0; |
110 | 105 | ||
111 | BN_CTX_start(ctx); | 106 | BN_CTX_start(ctx); |
107 | |||
112 | if ((tmp = BN_CTX_get(ctx)) == NULL) | 108 | if ((tmp = BN_CTX_get(ctx)) == NULL) |
113 | goto err; | 109 | goto err; |
114 | if ((x = BN_CTX_get(ctx)) == NULL) | 110 | if ((x = BN_CTX_get(ctx)) == NULL) |
@@ -163,7 +159,7 @@ ec_GF2m_simple_set_compressed_coordinates(const EC_GROUP *group, EC_POINT *point | |||
163 | 159 | ||
164 | err: | 160 | err: |
165 | BN_CTX_end(ctx); | 161 | BN_CTX_end(ctx); |
166 | BN_CTX_free(new_ctx); | 162 | |
167 | return ret; | 163 | return ret; |
168 | } | 164 | } |
169 | 165 | ||
@@ -177,18 +173,17 @@ ec_GF2m_simple_point2oct(const EC_GROUP *group, const EC_POINT *point, | |||
177 | point_conversion_form_t form, | 173 | point_conversion_form_t form, |
178 | unsigned char *buf, size_t len, BN_CTX *ctx) | 174 | unsigned char *buf, size_t len, BN_CTX *ctx) |
179 | { | 175 | { |
180 | size_t ret; | ||
181 | BN_CTX *new_ctx = NULL; | ||
182 | int used_ctx = 0; | ||
183 | BIGNUM *x, *y, *yxi; | 176 | BIGNUM *x, *y, *yxi; |
184 | size_t field_len, i, skip; | 177 | size_t field_len, i, skip; |
178 | size_t ret; | ||
185 | 179 | ||
186 | if ((form != POINT_CONVERSION_COMPRESSED) | 180 | if (form != POINT_CONVERSION_COMPRESSED && |
187 | && (form != POINT_CONVERSION_UNCOMPRESSED) | 181 | form != POINT_CONVERSION_UNCOMPRESSED && |
188 | && (form != POINT_CONVERSION_HYBRID)) { | 182 | form != POINT_CONVERSION_HYBRID) { |
189 | ECerror(EC_R_INVALID_FORM); | 183 | ECerror(EC_R_INVALID_FORM); |
190 | goto err; | 184 | return 0; |
191 | } | 185 | } |
186 | |||
192 | if (EC_POINT_is_at_infinity(group, point) > 0) { | 187 | if (EC_POINT_is_at_infinity(group, point) > 0) { |
193 | /* encodes to a single 0 octet */ | 188 | /* encodes to a single 0 octet */ |
194 | if (buf != NULL) { | 189 | if (buf != NULL) { |
@@ -200,6 +195,9 @@ ec_GF2m_simple_point2oct(const EC_GROUP *group, const EC_POINT *point, | |||
200 | } | 195 | } |
201 | return 1; | 196 | return 1; |
202 | } | 197 | } |
198 | |||
199 | BN_CTX_start(ctx); | ||
200 | |||
203 | /* ret := required output buffer length */ | 201 | /* ret := required output buffer length */ |
204 | field_len = (EC_GROUP_get_degree(group) + 7) / 8; | 202 | field_len = (EC_GROUP_get_degree(group) + 7) / 8; |
205 | ret = (form == POINT_CONVERSION_COMPRESSED) ? 1 + field_len : | 203 | ret = (form == POINT_CONVERSION_COMPRESSED) ? 1 + field_len : |
@@ -211,13 +209,7 @@ ec_GF2m_simple_point2oct(const EC_GROUP *group, const EC_POINT *point, | |||
211 | ECerror(EC_R_BUFFER_TOO_SMALL); | 209 | ECerror(EC_R_BUFFER_TOO_SMALL); |
212 | goto err; | 210 | goto err; |
213 | } | 211 | } |
214 | if (ctx == NULL) { | 212 | |
215 | ctx = new_ctx = BN_CTX_new(); | ||
216 | if (ctx == NULL) | ||
217 | return 0; | ||
218 | } | ||
219 | BN_CTX_start(ctx); | ||
220 | used_ctx = 1; | ||
221 | if ((x = BN_CTX_get(ctx)) == NULL) | 213 | if ((x = BN_CTX_get(ctx)) == NULL) |
222 | goto err; | 214 | goto err; |
223 | if ((y = BN_CTX_get(ctx)) == NULL) | 215 | if ((y = BN_CTX_get(ctx)) == NULL) |
@@ -271,18 +263,12 @@ ec_GF2m_simple_point2oct(const EC_GROUP *group, const EC_POINT *point, | |||
271 | goto err; | 263 | goto err; |
272 | } | 264 | } |
273 | } | 265 | } |
274 | if (used_ctx) | ||
275 | BN_CTX_end(ctx); | ||
276 | BN_CTX_free(new_ctx); | ||
277 | return ret; | ||
278 | 266 | ||
279 | err: | 267 | err: |
280 | if (used_ctx) | 268 | BN_CTX_end(ctx); |
281 | BN_CTX_end(ctx); | ||
282 | BN_CTX_free(new_ctx); | ||
283 | return 0; | ||
284 | } | ||
285 | 269 | ||
270 | return ret; | ||
271 | } | ||
286 | 272 | ||
287 | /* | 273 | /* |
288 | * Converts an octet string representation to an EC_POINT. | 274 | * Converts an octet string representation to an EC_POINT. |
@@ -294,7 +280,6 @@ ec_GF2m_simple_oct2point(const EC_GROUP *group, EC_POINT *point, | |||
294 | { | 280 | { |
295 | point_conversion_form_t form; | 281 | point_conversion_form_t form; |
296 | int y_bit; | 282 | int y_bit; |
297 | BN_CTX *new_ctx = NULL; | ||
298 | BIGNUM *x, *y, *yxi; | 283 | BIGNUM *x, *y, *yxi; |
299 | size_t field_len, enc_len; | 284 | size_t field_len, enc_len; |
300 | int ret = 0; | 285 | int ret = 0; |
@@ -349,12 +334,8 @@ ec_GF2m_simple_oct2point(const EC_GROUP *group, EC_POINT *point, | |||
349 | return 0; | 334 | return 0; |
350 | } | 335 | } |
351 | 336 | ||
352 | if (ctx == NULL) { | ||
353 | ctx = new_ctx = BN_CTX_new(); | ||
354 | if (ctx == NULL) | ||
355 | return 0; | ||
356 | } | ||
357 | BN_CTX_start(ctx); | 337 | BN_CTX_start(ctx); |
338 | |||
358 | if ((x = BN_CTX_get(ctx)) == NULL) | 339 | if ((x = BN_CTX_get(ctx)) == NULL) |
359 | goto err; | 340 | goto err; |
360 | if ((y = BN_CTX_get(ctx)) == NULL) | 341 | if ((y = BN_CTX_get(ctx)) == NULL) |
@@ -415,7 +396,7 @@ ec_GF2m_simple_oct2point(const EC_GROUP *group, EC_POINT *point, | |||
415 | 396 | ||
416 | err: | 397 | err: |
417 | BN_CTX_end(ctx); | 398 | BN_CTX_end(ctx); |
418 | BN_CTX_free(new_ctx); | 399 | |
419 | return ret; | 400 | return ret; |
420 | } | 401 | } |
421 | #endif | 402 | #endif |
diff --git a/src/lib/libcrypto/ec/ec2_smpl.c b/src/lib/libcrypto/ec/ec2_smpl.c index 1ad339cbd7..850159cb25 100644 --- a/src/lib/libcrypto/ec/ec2_smpl.c +++ b/src/lib/libcrypto/ec/ec2_smpl.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: ec2_smpl.c,v 1.34 2023/03/27 10:25:02 tb Exp $ */ | 1 | /* $OpenBSD: ec2_smpl.c,v 1.35 2023/04/11 18:58:20 jsing Exp $ */ |
2 | /* ==================================================================== | 2 | /* ==================================================================== |
3 | * Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED. | 3 | * Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED. |
4 | * | 4 | * |
@@ -216,18 +216,11 @@ ec_GF2m_simple_group_get_degree(const EC_GROUP *group) | |||
216 | static int | 216 | static int |
217 | ec_GF2m_simple_group_check_discriminant(const EC_GROUP *group, BN_CTX *ctx) | 217 | ec_GF2m_simple_group_check_discriminant(const EC_GROUP *group, BN_CTX *ctx) |
218 | { | 218 | { |
219 | int ret = 0; | ||
220 | BIGNUM *b; | 219 | BIGNUM *b; |
221 | BN_CTX *new_ctx = NULL; | 220 | int ret = 0; |
222 | 221 | ||
223 | if (ctx == NULL) { | ||
224 | ctx = new_ctx = BN_CTX_new(); | ||
225 | if (ctx == NULL) { | ||
226 | ECerror(ERR_R_MALLOC_FAILURE); | ||
227 | goto err; | ||
228 | } | ||
229 | } | ||
230 | BN_CTX_start(ctx); | 222 | BN_CTX_start(ctx); |
223 | |||
231 | if ((b = BN_CTX_get(ctx)) == NULL) | 224 | if ((b = BN_CTX_get(ctx)) == NULL) |
232 | goto err; | 225 | goto err; |
233 | 226 | ||
@@ -244,9 +237,8 @@ ec_GF2m_simple_group_check_discriminant(const EC_GROUP *group, BN_CTX *ctx) | |||
244 | ret = 1; | 237 | ret = 1; |
245 | 238 | ||
246 | err: | 239 | err: |
247 | if (ctx != NULL) | 240 | BN_CTX_end(ctx); |
248 | BN_CTX_end(ctx); | 241 | |
249 | BN_CTX_free(new_ctx); | ||
250 | return ret; | 242 | return ret; |
251 | } | 243 | } |
252 | 244 | ||
@@ -368,7 +360,6 @@ static int | |||
368 | ec_GF2m_simple_add(const EC_GROUP *group, EC_POINT *r, const EC_POINT *a, | 360 | ec_GF2m_simple_add(const EC_GROUP *group, EC_POINT *r, const EC_POINT *a, |
369 | const EC_POINT *b, BN_CTX *ctx) | 361 | const EC_POINT *b, BN_CTX *ctx) |
370 | { | 362 | { |
371 | BN_CTX *new_ctx = NULL; | ||
372 | BIGNUM *x0, *y0, *x1, *y1, *x2, *y2, *s, *t; | 363 | BIGNUM *x0, *y0, *x1, *y1, *x2, *y2, *s, *t; |
373 | int ret = 0; | 364 | int ret = 0; |
374 | 365 | ||
@@ -382,12 +373,9 @@ ec_GF2m_simple_add(const EC_GROUP *group, EC_POINT *r, const EC_POINT *a, | |||
382 | return 0; | 373 | return 0; |
383 | return 1; | 374 | return 1; |
384 | } | 375 | } |
385 | if (ctx == NULL) { | 376 | |
386 | ctx = new_ctx = BN_CTX_new(); | ||
387 | if (ctx == NULL) | ||
388 | return 0; | ||
389 | } | ||
390 | BN_CTX_start(ctx); | 377 | BN_CTX_start(ctx); |
378 | |||
391 | if ((x0 = BN_CTX_get(ctx)) == NULL) | 379 | if ((x0 = BN_CTX_get(ctx)) == NULL) |
392 | goto err; | 380 | goto err; |
393 | if ((y0 = BN_CTX_get(ctx)) == NULL) | 381 | if ((y0 = BN_CTX_get(ctx)) == NULL) |
@@ -475,7 +463,7 @@ ec_GF2m_simple_add(const EC_GROUP *group, EC_POINT *r, const EC_POINT *a, | |||
475 | 463 | ||
476 | err: | 464 | err: |
477 | BN_CTX_end(ctx); | 465 | BN_CTX_end(ctx); |
478 | BN_CTX_free(new_ctx); | 466 | |
479 | return ret; | 467 | return ret; |
480 | } | 468 | } |
481 | 469 | ||
@@ -517,11 +505,10 @@ ec_GF2m_simple_is_at_infinity(const EC_GROUP *group, const EC_POINT *point) | |||
517 | static int | 505 | static int |
518 | ec_GF2m_simple_is_on_curve(const EC_GROUP *group, const EC_POINT *point, BN_CTX *ctx) | 506 | ec_GF2m_simple_is_on_curve(const EC_GROUP *group, const EC_POINT *point, BN_CTX *ctx) |
519 | { | 507 | { |
520 | int ret = -1; | ||
521 | BN_CTX *new_ctx = NULL; | ||
522 | BIGNUM *lh, *y2; | ||
523 | int (*field_mul) (const EC_GROUP *, BIGNUM *, const BIGNUM *, const BIGNUM *, BN_CTX *); | 508 | int (*field_mul) (const EC_GROUP *, BIGNUM *, const BIGNUM *, const BIGNUM *, BN_CTX *); |
524 | int (*field_sqr) (const EC_GROUP *, BIGNUM *, const BIGNUM *, BN_CTX *); | 509 | int (*field_sqr) (const EC_GROUP *, BIGNUM *, const BIGNUM *, BN_CTX *); |
510 | BIGNUM *lh, *y2; | ||
511 | int ret = -1; | ||
525 | 512 | ||
526 | if (EC_POINT_is_at_infinity(group, point) > 0) | 513 | if (EC_POINT_is_at_infinity(group, point) > 0) |
527 | return 1; | 514 | return 1; |
@@ -533,12 +520,8 @@ ec_GF2m_simple_is_on_curve(const EC_GROUP *group, const EC_POINT *point, BN_CTX | |||
533 | if (!point->Z_is_one) | 520 | if (!point->Z_is_one) |
534 | return -1; | 521 | return -1; |
535 | 522 | ||
536 | if (ctx == NULL) { | ||
537 | ctx = new_ctx = BN_CTX_new(); | ||
538 | if (ctx == NULL) | ||
539 | return -1; | ||
540 | } | ||
541 | BN_CTX_start(ctx); | 523 | BN_CTX_start(ctx); |
524 | |||
542 | if ((y2 = BN_CTX_get(ctx)) == NULL) | 525 | if ((y2 = BN_CTX_get(ctx)) == NULL) |
543 | goto err; | 526 | goto err; |
544 | if ((lh = BN_CTX_get(ctx)) == NULL) | 527 | if ((lh = BN_CTX_get(ctx)) == NULL) |
@@ -563,11 +546,12 @@ ec_GF2m_simple_is_on_curve(const EC_GROUP *group, const EC_POINT *point, BN_CTX | |||
563 | goto err; | 546 | goto err; |
564 | if (!BN_GF2m_add(lh, lh, y2)) | 547 | if (!BN_GF2m_add(lh, lh, y2)) |
565 | goto err; | 548 | goto err; |
549 | |||
566 | ret = BN_is_zero(lh); | 550 | ret = BN_is_zero(lh); |
551 | |||
567 | err: | 552 | err: |
568 | if (ctx) | 553 | BN_CTX_end(ctx); |
569 | BN_CTX_end(ctx); | 554 | |
570 | BN_CTX_free(new_ctx); | ||
571 | return ret; | 555 | return ret; |
572 | } | 556 | } |
573 | 557 | ||
@@ -583,24 +567,19 @@ ec_GF2m_simple_cmp(const EC_GROUP *group, const EC_POINT *a, | |||
583 | const EC_POINT *b, BN_CTX *ctx) | 567 | const EC_POINT *b, BN_CTX *ctx) |
584 | { | 568 | { |
585 | BIGNUM *aX, *aY, *bX, *bY; | 569 | BIGNUM *aX, *aY, *bX, *bY; |
586 | BN_CTX *new_ctx = NULL; | ||
587 | int ret = -1; | 570 | int ret = -1; |
588 | 571 | ||
589 | if (EC_POINT_is_at_infinity(group, a) > 0) { | 572 | if (EC_POINT_is_at_infinity(group, a) > 0) |
590 | return EC_POINT_is_at_infinity(group, b) > 0 ? 0 : 1; | 573 | return EC_POINT_is_at_infinity(group, b) > 0 ? 0 : 1; |
591 | } | 574 | |
592 | if (EC_POINT_is_at_infinity(group, b) > 0) | 575 | if (EC_POINT_is_at_infinity(group, b) > 0) |
593 | return 1; | 576 | return 1; |
594 | 577 | ||
595 | if (a->Z_is_one && b->Z_is_one) { | 578 | if (a->Z_is_one && b->Z_is_one) |
596 | return ((BN_cmp(&a->X, &b->X) == 0) && BN_cmp(&a->Y, &b->Y) == 0) ? 0 : 1; | 579 | return ((BN_cmp(&a->X, &b->X) == 0) && BN_cmp(&a->Y, &b->Y) == 0) ? 0 : 1; |
597 | } | 580 | |
598 | if (ctx == NULL) { | ||
599 | ctx = new_ctx = BN_CTX_new(); | ||
600 | if (ctx == NULL) | ||
601 | return -1; | ||
602 | } | ||
603 | BN_CTX_start(ctx); | 581 | BN_CTX_start(ctx); |
582 | |||
604 | if ((aX = BN_CTX_get(ctx)) == NULL) | 583 | if ((aX = BN_CTX_get(ctx)) == NULL) |
605 | goto err; | 584 | goto err; |
606 | if ((aY = BN_CTX_get(ctx)) == NULL) | 585 | if ((aY = BN_CTX_get(ctx)) == NULL) |
@@ -617,9 +596,8 @@ ec_GF2m_simple_cmp(const EC_GROUP *group, const EC_POINT *a, | |||
617 | ret = ((BN_cmp(aX, bX) == 0) && BN_cmp(aY, bY) == 0) ? 0 : 1; | 596 | ret = ((BN_cmp(aX, bX) == 0) && BN_cmp(aY, bY) == 0) ? 0 : 1; |
618 | 597 | ||
619 | err: | 598 | err: |
620 | if (ctx) | 599 | BN_CTX_end(ctx); |
621 | BN_CTX_end(ctx); | 600 | |
622 | BN_CTX_free(new_ctx); | ||
623 | return ret; | 601 | return ret; |
624 | } | 602 | } |
625 | 603 | ||
@@ -627,19 +605,14 @@ ec_GF2m_simple_cmp(const EC_GROUP *group, const EC_POINT *a, | |||
627 | static int | 605 | static int |
628 | ec_GF2m_simple_make_affine(const EC_GROUP *group, EC_POINT *point, BN_CTX *ctx) | 606 | ec_GF2m_simple_make_affine(const EC_GROUP *group, EC_POINT *point, BN_CTX *ctx) |
629 | { | 607 | { |
630 | BN_CTX *new_ctx = NULL; | ||
631 | BIGNUM *x, *y; | 608 | BIGNUM *x, *y; |
632 | int ret = 0; | 609 | int ret = 0; |
633 | 610 | ||
634 | if (point->Z_is_one || EC_POINT_is_at_infinity(group, point) > 0) | 611 | if (point->Z_is_one || EC_POINT_is_at_infinity(group, point) > 0) |
635 | return 1; | 612 | return 1; |
636 | 613 | ||
637 | if (ctx == NULL) { | ||
638 | ctx = new_ctx = BN_CTX_new(); | ||
639 | if (ctx == NULL) | ||
640 | return 0; | ||
641 | } | ||
642 | BN_CTX_start(ctx); | 614 | BN_CTX_start(ctx); |
615 | |||
643 | if ((x = BN_CTX_get(ctx)) == NULL) | 616 | if ((x = BN_CTX_get(ctx)) == NULL) |
644 | goto err; | 617 | goto err; |
645 | if ((y = BN_CTX_get(ctx)) == NULL) | 618 | if ((y = BN_CTX_get(ctx)) == NULL) |
@@ -657,9 +630,8 @@ ec_GF2m_simple_make_affine(const EC_GROUP *group, EC_POINT *point, BN_CTX *ctx) | |||
657 | ret = 1; | 630 | ret = 1; |
658 | 631 | ||
659 | err: | 632 | err: |
660 | if (ctx) | 633 | BN_CTX_end(ctx); |
661 | BN_CTX_end(ctx); | 634 | |
662 | BN_CTX_free(new_ctx); | ||
663 | return ret; | 635 | return ret; |
664 | } | 636 | } |
665 | 637 | ||
diff --git a/src/lib/libcrypto/ec/ec_check.c b/src/lib/libcrypto/ec/ec_check.c index 5c6165e129..4e065c739a 100644 --- a/src/lib/libcrypto/ec/ec_check.c +++ b/src/lib/libcrypto/ec/ec_check.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: ec_check.c,v 1.12 2022/11/26 16:08:52 tb Exp $ */ | 1 | /* $OpenBSD: ec_check.c,v 1.13 2023/04/11 18:58:20 jsing Exp $ */ |
2 | /* ==================================================================== | 2 | /* ==================================================================== |
3 | * Copyright (c) 1998-2002 The OpenSSL Project. All rights reserved. | 3 | * Copyright (c) 1998-2002 The OpenSSL Project. All rights reserved. |
4 | * | 4 | * |
@@ -57,21 +57,20 @@ | |||
57 | #include <openssl/err.h> | 57 | #include <openssl/err.h> |
58 | 58 | ||
59 | int | 59 | int |
60 | EC_GROUP_check(const EC_GROUP *group, BN_CTX *ctx) | 60 | EC_GROUP_check(const EC_GROUP *group, BN_CTX *ctx_in) |
61 | { | 61 | { |
62 | int ret = 0; | 62 | BN_CTX *ctx; |
63 | BIGNUM *order; | 63 | BIGNUM *order; |
64 | BN_CTX *new_ctx = NULL; | ||
65 | EC_POINT *point = NULL; | 64 | EC_POINT *point = NULL; |
65 | int ret = 0; | ||
66 | |||
67 | if ((ctx = ctx_in) == NULL) | ||
68 | ctx = BN_CTX_new(); | ||
69 | if (ctx == NULL) | ||
70 | goto err; | ||
66 | 71 | ||
67 | if (ctx == NULL) { | ||
68 | ctx = new_ctx = BN_CTX_new(); | ||
69 | if (ctx == NULL) { | ||
70 | ECerror(ERR_R_MALLOC_FAILURE); | ||
71 | goto err; | ||
72 | } | ||
73 | } | ||
74 | BN_CTX_start(ctx); | 72 | BN_CTX_start(ctx); |
73 | |||
75 | if ((order = BN_CTX_get(ctx)) == NULL) | 74 | if ((order = BN_CTX_get(ctx)) == NULL) |
76 | goto err; | 75 | goto err; |
77 | 76 | ||
@@ -104,12 +103,16 @@ EC_GROUP_check(const EC_GROUP *group, BN_CTX *ctx) | |||
104 | ECerror(EC_R_INVALID_GROUP_ORDER); | 103 | ECerror(EC_R_INVALID_GROUP_ORDER); |
105 | goto err; | 104 | goto err; |
106 | } | 105 | } |
106 | |||
107 | ret = 1; | 107 | ret = 1; |
108 | 108 | ||
109 | err: | 109 | err: |
110 | if (ctx != NULL) | 110 | BN_CTX_end(ctx); |
111 | BN_CTX_end(ctx); | 111 | |
112 | BN_CTX_free(new_ctx); | 112 | if (ctx != ctx_in) |
113 | BN_CTX_free(ctx); | ||
114 | |||
113 | EC_POINT_free(point); | 115 | EC_POINT_free(point); |
116 | |||
114 | return ret; | 117 | return ret; |
115 | } | 118 | } |
diff --git a/src/lib/libcrypto/ec/ec_lib.c b/src/lib/libcrypto/ec/ec_lib.c index 38ddd7af9f..bc472b73b7 100644 --- a/src/lib/libcrypto/ec/ec_lib.c +++ b/src/lib/libcrypto/ec/ec_lib.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: ec_lib.c,v 1.52 2023/03/27 10:25:02 tb Exp $ */ | 1 | /* $OpenBSD: ec_lib.c,v 1.53 2023/04/11 18:58:20 jsing Exp $ */ |
2 | /* | 2 | /* |
3 | * Originally written by Bodo Moeller for the OpenSSL project. | 3 | * Originally written by Bodo Moeller for the OpenSSL project. |
4 | */ | 4 | */ |
@@ -487,24 +487,52 @@ EC_GROUP_get_seed_len(const EC_GROUP *group) | |||
487 | 487 | ||
488 | int | 488 | int |
489 | EC_GROUP_set_curve(EC_GROUP *group, const BIGNUM *p, const BIGNUM *a, | 489 | EC_GROUP_set_curve(EC_GROUP *group, const BIGNUM *p, const BIGNUM *a, |
490 | const BIGNUM *b, BN_CTX *ctx) | 490 | const BIGNUM *b, BN_CTX *ctx_in) |
491 | { | 491 | { |
492 | BN_CTX *ctx; | ||
493 | int ret = 0; | ||
494 | |||
495 | if ((ctx = ctx_in) == NULL) | ||
496 | ctx = BN_CTX_new(); | ||
497 | if (ctx == NULL) | ||
498 | goto err; | ||
499 | |||
492 | if (group->meth->group_set_curve == NULL) { | 500 | if (group->meth->group_set_curve == NULL) { |
493 | ECerror(ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); | 501 | ECerror(ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); |
494 | return 0; | 502 | goto err; |
495 | } | 503 | } |
496 | return group->meth->group_set_curve(group, p, a, b, ctx); | 504 | ret = group->meth->group_set_curve(group, p, a, b, ctx); |
505 | |||
506 | err: | ||
507 | if (ctx != ctx_in) | ||
508 | BN_CTX_free(ctx); | ||
509 | |||
510 | return ret; | ||
497 | } | 511 | } |
498 | 512 | ||
499 | int | 513 | int |
500 | EC_GROUP_get_curve(const EC_GROUP *group, BIGNUM *p, BIGNUM *a, BIGNUM *b, | 514 | EC_GROUP_get_curve(const EC_GROUP *group, BIGNUM *p, BIGNUM *a, BIGNUM *b, |
501 | BN_CTX *ctx) | 515 | BN_CTX *ctx_in) |
502 | { | 516 | { |
517 | BN_CTX *ctx; | ||
518 | int ret = 0; | ||
519 | |||
520 | if ((ctx = ctx_in) == NULL) | ||
521 | ctx = BN_CTX_new(); | ||
522 | if (ctx == NULL) | ||
523 | goto err; | ||
524 | |||
503 | if (group->meth->group_get_curve == NULL) { | 525 | if (group->meth->group_get_curve == NULL) { |
504 | ECerror(ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); | 526 | ECerror(ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); |
505 | return 0; | 527 | return 0; |
506 | } | 528 | } |
507 | return group->meth->group_get_curve(group, p, a, b, ctx); | 529 | ret = group->meth->group_get_curve(group, p, a, b, ctx); |
530 | |||
531 | err: | ||
532 | if (ctx != ctx_in) | ||
533 | BN_CTX_free(ctx); | ||
534 | |||
535 | return ret; | ||
508 | } | 536 | } |
509 | 537 | ||
510 | int | 538 | int |
@@ -549,13 +577,27 @@ EC_GROUP_get_degree(const EC_GROUP *group) | |||
549 | 577 | ||
550 | 578 | ||
551 | int | 579 | int |
552 | EC_GROUP_check_discriminant(const EC_GROUP *group, BN_CTX *ctx) | 580 | EC_GROUP_check_discriminant(const EC_GROUP *group, BN_CTX *ctx_in) |
553 | { | 581 | { |
582 | BN_CTX *ctx; | ||
583 | int ret = 0; | ||
584 | |||
585 | if ((ctx = ctx_in) == NULL) | ||
586 | ctx = BN_CTX_new(); | ||
587 | if (ctx == NULL) | ||
588 | goto err; | ||
589 | |||
554 | if (group->meth->group_check_discriminant == 0) { | 590 | if (group->meth->group_check_discriminant == 0) { |
555 | ECerror(ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); | 591 | ECerror(ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); |
556 | return 0; | 592 | return 0; |
557 | } | 593 | } |
558 | return group->meth->group_check_discriminant(group, ctx); | 594 | return group->meth->group_check_discriminant(group, ctx); |
595 | |||
596 | err: | ||
597 | if (ctx != ctx_in) | ||
598 | BN_CTX_free(ctx); | ||
599 | |||
600 | return ret; | ||
559 | } | 601 | } |
560 | 602 | ||
561 | 603 | ||
@@ -803,9 +845,6 @@ EC_EX_DATA_clear_free_all_data(EC_EXTRA_DATA ** ex_data) | |||
803 | *ex_data = NULL; | 845 | *ex_data = NULL; |
804 | } | 846 | } |
805 | 847 | ||
806 | |||
807 | /* functions for EC_POINT objects */ | ||
808 | |||
809 | EC_POINT * | 848 | EC_POINT * |
810 | EC_POINT_new(const EC_GROUP *group) | 849 | EC_POINT_new(const EC_GROUP *group) |
811 | { | 850 | { |
@@ -867,7 +906,6 @@ EC_POINT_copy(EC_POINT *dest, const EC_POINT *src) | |||
867 | return dest->meth->point_copy(dest, src); | 906 | return dest->meth->point_copy(dest, src); |
868 | } | 907 | } |
869 | 908 | ||
870 | |||
871 | EC_POINT * | 909 | EC_POINT * |
872 | EC_POINT_dup(const EC_POINT *a, const EC_GROUP *group) | 910 | EC_POINT_dup(const EC_POINT *a, const EC_GROUP *group) |
873 | { | 911 | { |
@@ -888,18 +926,16 @@ EC_POINT_dup(const EC_POINT *a, const EC_GROUP *group) | |||
888 | return t; | 926 | return t; |
889 | } | 927 | } |
890 | 928 | ||
891 | |||
892 | const EC_METHOD * | 929 | const EC_METHOD * |
893 | EC_POINT_method_of(const EC_POINT *point) | 930 | EC_POINT_method_of(const EC_POINT *point) |
894 | { | 931 | { |
895 | return point->meth; | 932 | return point->meth; |
896 | } | 933 | } |
897 | 934 | ||
898 | |||
899 | int | 935 | int |
900 | EC_POINT_set_to_infinity(const EC_GROUP *group, EC_POINT *point) | 936 | EC_POINT_set_to_infinity(const EC_GROUP *group, EC_POINT *point) |
901 | { | 937 | { |
902 | if (group->meth->point_set_to_infinity == 0) { | 938 | if (group->meth->point_set_to_infinity == NULL) { |
903 | ECerror(ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); | 939 | ECerror(ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); |
904 | return 0; | 940 | return 0; |
905 | } | 941 | } |
@@ -912,40 +948,70 @@ EC_POINT_set_to_infinity(const EC_GROUP *group, EC_POINT *point) | |||
912 | 948 | ||
913 | int | 949 | int |
914 | EC_POINT_set_Jprojective_coordinates(const EC_GROUP *group, EC_POINT *point, | 950 | EC_POINT_set_Jprojective_coordinates(const EC_GROUP *group, EC_POINT *point, |
915 | const BIGNUM *x, const BIGNUM *y, const BIGNUM *z, BN_CTX *ctx) | 951 | const BIGNUM *x, const BIGNUM *y, const BIGNUM *z, BN_CTX *ctx_in) |
916 | { | 952 | { |
953 | BN_CTX *ctx; | ||
954 | int ret = 0; | ||
955 | |||
956 | if ((ctx = ctx_in) == NULL) | ||
957 | ctx = BN_CTX_new(); | ||
958 | if (ctx == NULL) | ||
959 | goto err; | ||
960 | |||
917 | if (group->meth->point_set_Jprojective_coordinates == NULL) { | 961 | if (group->meth->point_set_Jprojective_coordinates == NULL) { |
918 | ECerror(ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); | 962 | ECerror(ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); |
919 | return 0; | 963 | goto err; |
920 | } | 964 | } |
921 | if (group->meth != point->meth) { | 965 | if (group->meth != point->meth) { |
922 | ECerror(EC_R_INCOMPATIBLE_OBJECTS); | 966 | ECerror(EC_R_INCOMPATIBLE_OBJECTS); |
923 | return 0; | 967 | goto err; |
924 | } | 968 | } |
925 | if (!group->meth->point_set_Jprojective_coordinates(group, point, | 969 | if (!group->meth->point_set_Jprojective_coordinates(group, point, |
926 | x, y, z, ctx)) | 970 | x, y, z, ctx)) |
927 | return 0; | 971 | goto err; |
972 | |||
928 | if (EC_POINT_is_on_curve(group, point, ctx) <= 0) { | 973 | if (EC_POINT_is_on_curve(group, point, ctx) <= 0) { |
929 | ECerror(EC_R_POINT_IS_NOT_ON_CURVE); | 974 | ECerror(EC_R_POINT_IS_NOT_ON_CURVE); |
930 | return 0; | 975 | goto err; |
931 | } | 976 | } |
932 | return 1; | 977 | |
978 | ret = 1; | ||
979 | |||
980 | err: | ||
981 | if (ctx != ctx_in) | ||
982 | BN_CTX_free(ctx); | ||
983 | |||
984 | return ret; | ||
933 | } | 985 | } |
934 | 986 | ||
935 | int | 987 | int |
936 | EC_POINT_get_Jprojective_coordinates(const EC_GROUP *group, | 988 | EC_POINT_get_Jprojective_coordinates(const EC_GROUP *group, |
937 | const EC_POINT *point, BIGNUM *x, BIGNUM *y, BIGNUM *z, BN_CTX *ctx) | 989 | const EC_POINT *point, BIGNUM *x, BIGNUM *y, BIGNUM *z, BN_CTX *ctx_in) |
938 | { | 990 | { |
991 | BN_CTX *ctx; | ||
992 | int ret = 0; | ||
993 | |||
994 | if ((ctx = ctx_in) == NULL) | ||
995 | ctx = BN_CTX_new(); | ||
996 | if (ctx == NULL) | ||
997 | goto err; | ||
998 | |||
939 | if (group->meth->point_get_Jprojective_coordinates == NULL) { | 999 | if (group->meth->point_get_Jprojective_coordinates == NULL) { |
940 | ECerror(ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); | 1000 | ECerror(ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); |
941 | return 0; | 1001 | goto err; |
942 | } | 1002 | } |
943 | if (group->meth != point->meth) { | 1003 | if (group->meth != point->meth) { |
944 | ECerror(EC_R_INCOMPATIBLE_OBJECTS); | 1004 | ECerror(EC_R_INCOMPATIBLE_OBJECTS); |
945 | return 0; | 1005 | goto err; |
946 | } | 1006 | } |
947 | return group->meth->point_get_Jprojective_coordinates(group, point, | 1007 | ret = group->meth->point_get_Jprojective_coordinates(group, point, |
948 | x, y, z, ctx); | 1008 | x, y, z, ctx); |
1009 | |||
1010 | err: | ||
1011 | if (ctx != ctx_in) | ||
1012 | BN_CTX_free(ctx); | ||
1013 | |||
1014 | return ret; | ||
949 | } | 1015 | } |
950 | 1016 | ||
951 | int | 1017 | int |
@@ -964,23 +1030,39 @@ EC_POINT_get_Jprojective_coordinates_GFp(const EC_GROUP *group, | |||
964 | 1030 | ||
965 | int | 1031 | int |
966 | EC_POINT_set_affine_coordinates(const EC_GROUP *group, EC_POINT *point, | 1032 | EC_POINT_set_affine_coordinates(const EC_GROUP *group, EC_POINT *point, |
967 | const BIGNUM *x, const BIGNUM *y, BN_CTX *ctx) | 1033 | const BIGNUM *x, const BIGNUM *y, BN_CTX *ctx_in) |
968 | { | 1034 | { |
1035 | BN_CTX *ctx; | ||
1036 | int ret = 0; | ||
1037 | |||
1038 | if ((ctx = ctx_in) == NULL) | ||
1039 | ctx = BN_CTX_new(); | ||
1040 | if (ctx == NULL) | ||
1041 | goto err; | ||
1042 | |||
969 | if (group->meth->point_set_affine_coordinates == NULL) { | 1043 | if (group->meth->point_set_affine_coordinates == NULL) { |
970 | ECerror(ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); | 1044 | ECerror(ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); |
971 | return 0; | 1045 | goto err; |
972 | } | 1046 | } |
973 | if (group->meth != point->meth) { | 1047 | if (group->meth != point->meth) { |
974 | ECerror(EC_R_INCOMPATIBLE_OBJECTS); | 1048 | ECerror(EC_R_INCOMPATIBLE_OBJECTS); |
975 | return 0; | 1049 | goto err; |
976 | } | 1050 | } |
977 | if (!group->meth->point_set_affine_coordinates(group, point, x, y, ctx)) | 1051 | if (!group->meth->point_set_affine_coordinates(group, point, x, y, ctx)) |
978 | return 0; | 1052 | goto err; |
1053 | |||
979 | if (EC_POINT_is_on_curve(group, point, ctx) <= 0) { | 1054 | if (EC_POINT_is_on_curve(group, point, ctx) <= 0) { |
980 | ECerror(EC_R_POINT_IS_NOT_ON_CURVE); | 1055 | ECerror(EC_R_POINT_IS_NOT_ON_CURVE); |
981 | return 0; | 1056 | goto err; |
982 | } | 1057 | } |
983 | return 1; | 1058 | |
1059 | ret = 1; | ||
1060 | |||
1061 | err: | ||
1062 | if (ctx != ctx_in) | ||
1063 | BN_CTX_free(ctx); | ||
1064 | |||
1065 | return ret; | ||
984 | } | 1066 | } |
985 | 1067 | ||
986 | int | 1068 | int |
@@ -1001,8 +1083,16 @@ EC_POINT_set_affine_coordinates_GF2m(const EC_GROUP *group, EC_POINT *point, | |||
1001 | 1083 | ||
1002 | int | 1084 | int |
1003 | EC_POINT_get_affine_coordinates(const EC_GROUP *group, const EC_POINT *point, | 1085 | EC_POINT_get_affine_coordinates(const EC_GROUP *group, const EC_POINT *point, |
1004 | BIGNUM *x, BIGNUM *y, BN_CTX *ctx) | 1086 | BIGNUM *x, BIGNUM *y, BN_CTX *ctx_in) |
1005 | { | 1087 | { |
1088 | BN_CTX *ctx; | ||
1089 | int ret = 0; | ||
1090 | |||
1091 | if ((ctx = ctx_in) == NULL) | ||
1092 | ctx = BN_CTX_new(); | ||
1093 | if (ctx == NULL) | ||
1094 | goto err; | ||
1095 | |||
1006 | if (group->meth->point_get_affine_coordinates == NULL) { | 1096 | if (group->meth->point_get_affine_coordinates == NULL) { |
1007 | ECerror(ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); | 1097 | ECerror(ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); |
1008 | return 0; | 1098 | return 0; |
@@ -1011,7 +1101,13 @@ EC_POINT_get_affine_coordinates(const EC_GROUP *group, const EC_POINT *point, | |||
1011 | ECerror(EC_R_INCOMPATIBLE_OBJECTS); | 1101 | ECerror(EC_R_INCOMPATIBLE_OBJECTS); |
1012 | return 0; | 1102 | return 0; |
1013 | } | 1103 | } |
1014 | return group->meth->point_get_affine_coordinates(group, point, x, y, ctx); | 1104 | ret = group->meth->point_get_affine_coordinates(group, point, x, y, ctx); |
1105 | |||
1106 | err: | ||
1107 | if (ctx != ctx_in) | ||
1108 | BN_CTX_free(ctx); | ||
1109 | |||
1110 | return ret; | ||
1015 | } | 1111 | } |
1016 | 1112 | ||
1017 | int | 1113 | int |
@@ -1032,38 +1128,74 @@ EC_POINT_get_affine_coordinates_GF2m(const EC_GROUP *group, const EC_POINT *poin | |||
1032 | 1128 | ||
1033 | int | 1129 | int |
1034 | EC_POINT_add(const EC_GROUP *group, EC_POINT *r, const EC_POINT *a, | 1130 | EC_POINT_add(const EC_GROUP *group, EC_POINT *r, const EC_POINT *a, |
1035 | const EC_POINT *b, BN_CTX *ctx) | 1131 | const EC_POINT *b, BN_CTX *ctx_in) |
1036 | { | 1132 | { |
1037 | if (group->meth->add == 0) { | 1133 | BN_CTX *ctx; |
1134 | int ret = 0; | ||
1135 | |||
1136 | if ((ctx = ctx_in) == NULL) | ||
1137 | ctx = BN_CTX_new(); | ||
1138 | if (ctx == NULL) | ||
1139 | goto err; | ||
1140 | |||
1141 | if (group->meth->add == NULL) { | ||
1038 | ECerror(ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); | 1142 | ECerror(ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); |
1039 | return 0; | 1143 | goto err; |
1040 | } | 1144 | } |
1041 | if ((group->meth != r->meth) || (r->meth != a->meth) || (a->meth != b->meth)) { | 1145 | if (group->meth != r->meth || group->meth != a->meth || |
1146 | group->meth != b->meth) { | ||
1042 | ECerror(EC_R_INCOMPATIBLE_OBJECTS); | 1147 | ECerror(EC_R_INCOMPATIBLE_OBJECTS); |
1043 | return 0; | 1148 | goto err; |
1044 | } | 1149 | } |
1045 | return group->meth->add(group, r, a, b, ctx); | 1150 | ret = group->meth->add(group, r, a, b, ctx); |
1046 | } | ||
1047 | 1151 | ||
1152 | err: | ||
1153 | if (ctx != ctx_in) | ||
1154 | BN_CTX_free(ctx); | ||
1155 | |||
1156 | return ret; | ||
1157 | } | ||
1048 | 1158 | ||
1049 | int | 1159 | int |
1050 | EC_POINT_dbl(const EC_GROUP *group, EC_POINT *r, const EC_POINT *a, BN_CTX *ctx) | 1160 | EC_POINT_dbl(const EC_GROUP *group, EC_POINT *r, const EC_POINT *a, |
1161 | BN_CTX *ctx_in) | ||
1051 | { | 1162 | { |
1052 | if (group->meth->dbl == 0) { | 1163 | BN_CTX *ctx; |
1164 | int ret = 0; | ||
1165 | |||
1166 | if ((ctx = ctx_in) == NULL) | ||
1167 | ctx = BN_CTX_new(); | ||
1168 | if (ctx == NULL) | ||
1169 | goto err; | ||
1170 | |||
1171 | if (group->meth->dbl == NULL) { | ||
1053 | ECerror(ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); | 1172 | ECerror(ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); |
1054 | return 0; | 1173 | return 0; |
1055 | } | 1174 | } |
1056 | if ((group->meth != r->meth) || (r->meth != a->meth)) { | 1175 | if (group->meth != r->meth || r->meth != a->meth) { |
1057 | ECerror(EC_R_INCOMPATIBLE_OBJECTS); | 1176 | ECerror(EC_R_INCOMPATIBLE_OBJECTS); |
1058 | return 0; | 1177 | return 0; |
1059 | } | 1178 | } |
1060 | return group->meth->dbl(group, r, a, ctx); | 1179 | ret = group->meth->dbl(group, r, a, ctx); |
1061 | } | ||
1062 | 1180 | ||
1181 | err: | ||
1182 | if (ctx != ctx_in) | ||
1183 | BN_CTX_free(ctx); | ||
1184 | |||
1185 | return ret; | ||
1186 | } | ||
1063 | 1187 | ||
1064 | int | 1188 | int |
1065 | EC_POINT_invert(const EC_GROUP *group, EC_POINT *a, BN_CTX *ctx) | 1189 | EC_POINT_invert(const EC_GROUP *group, EC_POINT *a, BN_CTX *ctx_in) |
1066 | { | 1190 | { |
1191 | BN_CTX *ctx; | ||
1192 | int ret = 0; | ||
1193 | |||
1194 | if ((ctx = ctx_in) == NULL) | ||
1195 | ctx = BN_CTX_new(); | ||
1196 | if (ctx == NULL) | ||
1197 | goto err; | ||
1198 | |||
1067 | if (group->meth->invert == 0) { | 1199 | if (group->meth->invert == 0) { |
1068 | ECerror(ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); | 1200 | ECerror(ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); |
1069 | return 0; | 1201 | return 0; |
@@ -1073,13 +1205,18 @@ EC_POINT_invert(const EC_GROUP *group, EC_POINT *a, BN_CTX *ctx) | |||
1073 | return 0; | 1205 | return 0; |
1074 | } | 1206 | } |
1075 | return group->meth->invert(group, a, ctx); | 1207 | return group->meth->invert(group, a, ctx); |
1076 | } | ||
1077 | 1208 | ||
1209 | err: | ||
1210 | if (ctx != ctx_in) | ||
1211 | BN_CTX_free(ctx); | ||
1212 | |||
1213 | return ret; | ||
1214 | } | ||
1078 | 1215 | ||
1079 | int | 1216 | int |
1080 | EC_POINT_is_at_infinity(const EC_GROUP *group, const EC_POINT *point) | 1217 | EC_POINT_is_at_infinity(const EC_GROUP *group, const EC_POINT *point) |
1081 | { | 1218 | { |
1082 | if (group->meth->is_at_infinity == 0) { | 1219 | if (group->meth->is_at_infinity == NULL) { |
1083 | ECerror(ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); | 1220 | ECerror(ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); |
1084 | return 0; | 1221 | return 0; |
1085 | } | 1222 | } |
@@ -1090,114 +1227,184 @@ EC_POINT_is_at_infinity(const EC_GROUP *group, const EC_POINT *point) | |||
1090 | return group->meth->is_at_infinity(group, point); | 1227 | return group->meth->is_at_infinity(group, point); |
1091 | } | 1228 | } |
1092 | 1229 | ||
1093 | |||
1094 | int | 1230 | int |
1095 | EC_POINT_is_on_curve(const EC_GROUP *group, const EC_POINT *point, BN_CTX *ctx) | 1231 | EC_POINT_is_on_curve(const EC_GROUP *group, const EC_POINT *point, |
1232 | BN_CTX *ctx_in) | ||
1096 | { | 1233 | { |
1097 | if (group->meth->is_on_curve == 0) { | 1234 | BN_CTX *ctx; |
1235 | int ret = 0; | ||
1236 | |||
1237 | if ((ctx = ctx_in) == NULL) | ||
1238 | ctx = BN_CTX_new(); | ||
1239 | if (ctx == NULL) | ||
1240 | goto err; | ||
1241 | |||
1242 | if (group->meth->is_on_curve == NULL) { | ||
1098 | ECerror(ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); | 1243 | ECerror(ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); |
1099 | return 0; | 1244 | goto err; |
1100 | } | 1245 | } |
1101 | if (group->meth != point->meth) { | 1246 | if (group->meth != point->meth) { |
1102 | ECerror(EC_R_INCOMPATIBLE_OBJECTS); | 1247 | ECerror(EC_R_INCOMPATIBLE_OBJECTS); |
1103 | return 0; | 1248 | goto err; |
1104 | } | 1249 | } |
1105 | return group->meth->is_on_curve(group, point, ctx); | 1250 | ret = group->meth->is_on_curve(group, point, ctx); |
1106 | } | 1251 | |
1252 | err: | ||
1253 | if (ctx != ctx_in) | ||
1254 | BN_CTX_free(ctx); | ||
1107 | 1255 | ||
1256 | return ret; | ||
1257 | } | ||
1108 | 1258 | ||
1109 | int | 1259 | int |
1110 | EC_POINT_cmp(const EC_GROUP *group, const EC_POINT *a, const EC_POINT *b, | 1260 | EC_POINT_cmp(const EC_GROUP *group, const EC_POINT *a, const EC_POINT *b, |
1111 | BN_CTX *ctx) | 1261 | BN_CTX *ctx_in) |
1112 | { | 1262 | { |
1113 | if (group->meth->point_cmp == 0) { | 1263 | BN_CTX *ctx; |
1264 | int ret = -1; | ||
1265 | |||
1266 | if ((ctx = ctx_in) == NULL) | ||
1267 | ctx = BN_CTX_new(); | ||
1268 | if (ctx == NULL) | ||
1269 | goto err; | ||
1270 | |||
1271 | if (group->meth->point_cmp == NULL) { | ||
1114 | ECerror(ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); | 1272 | ECerror(ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); |
1115 | return -1; | 1273 | goto err; |
1116 | } | 1274 | } |
1117 | if ((group->meth != a->meth) || (a->meth != b->meth)) { | 1275 | if (group->meth != a->meth || a->meth != b->meth) { |
1118 | ECerror(EC_R_INCOMPATIBLE_OBJECTS); | 1276 | ECerror(EC_R_INCOMPATIBLE_OBJECTS); |
1119 | return -1; | 1277 | goto err; |
1120 | } | 1278 | } |
1121 | return group->meth->point_cmp(group, a, b, ctx); | 1279 | ret = group->meth->point_cmp(group, a, b, ctx); |
1122 | } | 1280 | |
1281 | err: | ||
1282 | if (ctx != ctx_in) | ||
1283 | BN_CTX_free(ctx); | ||
1123 | 1284 | ||
1285 | return ret; | ||
1286 | } | ||
1124 | 1287 | ||
1125 | int | 1288 | int |
1126 | EC_POINT_make_affine(const EC_GROUP *group, EC_POINT *point, BN_CTX *ctx) | 1289 | EC_POINT_make_affine(const EC_GROUP *group, EC_POINT *point, BN_CTX *ctx_in) |
1127 | { | 1290 | { |
1128 | if (group->meth->make_affine == 0) { | 1291 | BN_CTX *ctx; |
1292 | int ret = 0; | ||
1293 | |||
1294 | if ((ctx = ctx_in) == NULL) | ||
1295 | ctx = BN_CTX_new(); | ||
1296 | if (ctx == NULL) | ||
1297 | goto err; | ||
1298 | |||
1299 | if (group->meth->make_affine == NULL) { | ||
1129 | ECerror(ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); | 1300 | ECerror(ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); |
1130 | return 0; | 1301 | goto err; |
1131 | } | 1302 | } |
1132 | if (group->meth != point->meth) { | 1303 | if (group->meth != point->meth) { |
1133 | ECerror(EC_R_INCOMPATIBLE_OBJECTS); | 1304 | ECerror(EC_R_INCOMPATIBLE_OBJECTS); |
1134 | return 0; | 1305 | goto err; |
1135 | } | 1306 | } |
1136 | return group->meth->make_affine(group, point, ctx); | 1307 | ret = group->meth->make_affine(group, point, ctx); |
1137 | } | ||
1138 | 1308 | ||
1309 | err: | ||
1310 | if (ctx != ctx_in) | ||
1311 | BN_CTX_free(ctx); | ||
1312 | |||
1313 | return ret; | ||
1314 | } | ||
1139 | 1315 | ||
1140 | int | 1316 | int |
1141 | EC_POINTs_make_affine(const EC_GROUP *group, size_t num, EC_POINT *points[], | 1317 | EC_POINTs_make_affine(const EC_GROUP *group, size_t num, EC_POINT *points[], |
1142 | BN_CTX *ctx) | 1318 | BN_CTX *ctx_in) |
1143 | { | 1319 | { |
1320 | BN_CTX *ctx; | ||
1144 | size_t i; | 1321 | size_t i; |
1322 | int ret = 0; | ||
1145 | 1323 | ||
1146 | if (group->meth->points_make_affine == 0) { | 1324 | if ((ctx = ctx_in) == NULL) |
1325 | ctx = BN_CTX_new(); | ||
1326 | if (ctx == NULL) | ||
1327 | goto err; | ||
1328 | |||
1329 | if (group->meth->points_make_affine == NULL) { | ||
1147 | ECerror(ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); | 1330 | ECerror(ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); |
1148 | return 0; | 1331 | goto err; |
1149 | } | 1332 | } |
1150 | for (i = 0; i < num; i++) { | 1333 | for (i = 0; i < num; i++) { |
1151 | if (group->meth != points[i]->meth) { | 1334 | if (group->meth != points[i]->meth) { |
1152 | ECerror(EC_R_INCOMPATIBLE_OBJECTS); | 1335 | ECerror(EC_R_INCOMPATIBLE_OBJECTS); |
1153 | return 0; | 1336 | goto err; |
1154 | } | 1337 | } |
1155 | } | 1338 | } |
1156 | return group->meth->points_make_affine(group, num, points, ctx); | 1339 | ret = group->meth->points_make_affine(group, num, points, ctx); |
1157 | } | ||
1158 | 1340 | ||
1341 | err: | ||
1342 | if (ctx != ctx_in) | ||
1343 | BN_CTX_free(ctx); | ||
1344 | |||
1345 | return ret; | ||
1346 | } | ||
1159 | 1347 | ||
1160 | /* Functions for point multiplication */ | ||
1161 | int | 1348 | int |
1162 | EC_POINTs_mul(const EC_GROUP *group, EC_POINT *r, const BIGNUM *scalar, | 1349 | EC_POINTs_mul(const EC_GROUP *group, EC_POINT *r, const BIGNUM *scalar, |
1163 | size_t num, const EC_POINT *points[], const BIGNUM *scalars[], BN_CTX *ctx) | 1350 | size_t num, const EC_POINT *points[], const BIGNUM *scalars[], |
1351 | BN_CTX *ctx_in) | ||
1164 | { | 1352 | { |
1165 | /* | 1353 | BN_CTX *ctx; |
1166 | * The function pointers must be set, and only support num == 0 and | 1354 | int ret = 0; |
1167 | * num == 1. | 1355 | |
1168 | */ | 1356 | if ((ctx = ctx_in) == NULL) |
1357 | ctx = BN_CTX_new(); | ||
1358 | if (ctx == NULL) | ||
1359 | goto err; | ||
1360 | |||
1361 | /* Only num == 0 and num == 1 is supported. */ | ||
1169 | if (group->meth->mul_generator_ct == NULL || | 1362 | if (group->meth->mul_generator_ct == NULL || |
1170 | group->meth->mul_single_ct == NULL || | 1363 | group->meth->mul_single_ct == NULL || |
1171 | group->meth->mul_double_nonct == NULL || | 1364 | group->meth->mul_double_nonct == NULL || |
1172 | num > 1) { | 1365 | num > 1) { |
1173 | ECerror(ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); | 1366 | ECerror(ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); |
1174 | return 0; | 1367 | goto err; |
1175 | } | 1368 | } |
1176 | 1369 | ||
1177 | /* Either bP or aG + bP, this is sane. */ | 1370 | if (num == 1 && points != NULL && scalars != NULL) { |
1178 | if (num == 1 && points != NULL && scalars != NULL) | 1371 | /* Either bP or aG + bP, this is sane. */ |
1179 | return EC_POINT_mul(group, r, scalar, points[0], scalars[0], | 1372 | ret = EC_POINT_mul(group, r, scalar, points[0], scalars[0], ctx); |
1180 | ctx); | 1373 | } else if (scalar != NULL && points == NULL && scalars == NULL) { |
1374 | /* aG, this is sane */ | ||
1375 | ret = EC_POINT_mul(group, r, scalar, NULL, NULL, ctx); | ||
1376 | } else { | ||
1377 | /* anything else is an error */ | ||
1378 | ECerror(ERR_R_EC_LIB); | ||
1379 | goto err; | ||
1380 | } | ||
1181 | 1381 | ||
1182 | /* aG, this is sane */ | 1382 | err: |
1183 | if (scalar != NULL && points == NULL && scalars == NULL) | 1383 | if (ctx != ctx_in) |
1184 | return EC_POINT_mul(group, r, scalar, NULL, NULL, ctx); | 1384 | BN_CTX_free(ctx); |
1185 | 1385 | ||
1186 | /* anything else is an error */ | 1386 | return ret; |
1187 | ECerror(ERR_R_EC_LIB); | ||
1188 | return 0; | ||
1189 | } | 1387 | } |
1190 | 1388 | ||
1191 | int | 1389 | int |
1192 | EC_POINT_mul(const EC_GROUP *group, EC_POINT *r, const BIGNUM *g_scalar, | 1390 | EC_POINT_mul(const EC_GROUP *group, EC_POINT *r, const BIGNUM *g_scalar, |
1193 | const EC_POINT *point, const BIGNUM *p_scalar, BN_CTX *ctx) | 1391 | const EC_POINT *point, const BIGNUM *p_scalar, BN_CTX *ctx_in) |
1194 | { | 1392 | { |
1393 | BN_CTX *ctx; | ||
1394 | int ret = 0; | ||
1395 | |||
1396 | if ((ctx = ctx_in) == NULL) | ||
1397 | ctx = BN_CTX_new(); | ||
1398 | if (ctx == NULL) | ||
1399 | goto err; | ||
1400 | |||
1195 | if (group->meth->mul_generator_ct == NULL || | 1401 | if (group->meth->mul_generator_ct == NULL || |
1196 | group->meth->mul_single_ct == NULL || | 1402 | group->meth->mul_single_ct == NULL || |
1197 | group->meth->mul_double_nonct == NULL) { | 1403 | group->meth->mul_double_nonct == NULL) { |
1198 | ECerror(ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); | 1404 | ECerror(ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); |
1199 | return 0; | 1405 | goto err; |
1200 | } | 1406 | } |
1407 | |||
1201 | if (g_scalar != NULL && point == NULL && p_scalar == NULL) { | 1408 | if (g_scalar != NULL && point == NULL && p_scalar == NULL) { |
1202 | /* | 1409 | /* |
1203 | * In this case we want to compute g_scalar * GeneratorPoint: | 1410 | * In this case we want to compute g_scalar * GeneratorPoint: |
@@ -1207,52 +1414,69 @@ EC_POINT_mul(const EC_GROUP *group, EC_POINT *r, const BIGNUM *g_scalar, | |||
1207 | * secret. This is why we ignore if BN_FLG_CONSTTIME is actually | 1414 | * secret. This is why we ignore if BN_FLG_CONSTTIME is actually |
1208 | * set and we always call the constant time version. | 1415 | * set and we always call the constant time version. |
1209 | */ | 1416 | */ |
1210 | return group->meth->mul_generator_ct(group, r, g_scalar, ctx); | 1417 | ret = group->meth->mul_generator_ct(group, r, g_scalar, ctx); |
1211 | } | 1418 | } else if (g_scalar == NULL && point != NULL && p_scalar != NULL) { |
1212 | if (g_scalar == NULL && point != NULL && p_scalar != NULL) { | 1419 | /* |
1213 | /* In this case we want to compute p_scalar * GenericPoint: | 1420 | * In this case we want to compute p_scalar * GenericPoint: |
1214 | * this codepath is reached most prominently by the second half | 1421 | * this codepath is reached most prominently by the second half |
1215 | * of ECDH, where the secret scalar is multiplied by the peer's | 1422 | * of ECDH, where the secret scalar is multiplied by the peer's |
1216 | * public point. To protect the secret scalar, we ignore if | 1423 | * public point. To protect the secret scalar, we ignore if |
1217 | * BN_FLG_CONSTTIME is actually set and we always call the | 1424 | * BN_FLG_CONSTTIME is actually set and we always call the |
1218 | * constant time version. | 1425 | * constant time version. |
1219 | */ | 1426 | */ |
1220 | return group->meth->mul_single_ct(group, r, p_scalar, point, | 1427 | ret = group->meth->mul_single_ct(group, r, p_scalar, point, ctx); |
1221 | ctx); | 1428 | } else if (g_scalar != NULL && point != NULL && p_scalar != NULL) { |
1222 | } | ||
1223 | if (g_scalar != NULL && point != NULL && p_scalar != NULL) { | ||
1224 | /* | 1429 | /* |
1225 | * In this case we want to compute | 1430 | * In this case we want to compute |
1226 | * g_scalar * GeneratorPoint + p_scalar * GenericPoint: | 1431 | * g_scalar * GeneratorPoint + p_scalar * GenericPoint: |
1227 | * this codepath is reached most prominently by ECDSA signature | 1432 | * this codepath is reached most prominently by ECDSA signature |
1228 | * verification. So we call the non-ct version. | 1433 | * verification. So we call the non-ct version. |
1229 | */ | 1434 | */ |
1230 | return group->meth->mul_double_nonct(group, r, g_scalar, | 1435 | ret = group->meth->mul_double_nonct(group, r, g_scalar, |
1231 | p_scalar, point, ctx); | 1436 | p_scalar, point, ctx); |
1437 | } else { | ||
1438 | /* Anything else is an error. */ | ||
1439 | ECerror(ERR_R_EC_LIB); | ||
1440 | goto err; | ||
1232 | } | 1441 | } |
1233 | 1442 | ||
1234 | /* Anything else is an error. */ | 1443 | err: |
1235 | ECerror(ERR_R_EC_LIB); | 1444 | if (ctx != ctx_in) |
1236 | return 0; | 1445 | BN_CTX_free(ctx); |
1446 | |||
1447 | return ret; | ||
1237 | } | 1448 | } |
1238 | 1449 | ||
1239 | int | 1450 | int |
1240 | EC_GROUP_precompute_mult(EC_GROUP *group, BN_CTX *ctx) | 1451 | EC_GROUP_precompute_mult(EC_GROUP *group, BN_CTX *ctx_in) |
1241 | { | 1452 | { |
1242 | if (group->meth->precompute_mult != 0) | 1453 | BN_CTX *ctx; |
1243 | return group->meth->precompute_mult(group, ctx); | 1454 | int ret = 0; |
1244 | else | 1455 | |
1245 | return 1; /* nothing to do, so report success */ | 1456 | if (group->meth->precompute_mult == NULL) |
1457 | return 1; | ||
1458 | |||
1459 | if ((ctx = ctx_in) == NULL) | ||
1460 | ctx = BN_CTX_new(); | ||
1461 | if (ctx == NULL) | ||
1462 | goto err; | ||
1463 | |||
1464 | ret = group->meth->precompute_mult(group, ctx); | ||
1465 | |||
1466 | err: | ||
1467 | if (ctx != ctx_in) | ||
1468 | BN_CTX_free(ctx); | ||
1469 | |||
1470 | return ret; | ||
1246 | } | 1471 | } |
1247 | 1472 | ||
1248 | int | 1473 | int |
1249 | EC_GROUP_have_precompute_mult(const EC_GROUP *group) | 1474 | EC_GROUP_have_precompute_mult(const EC_GROUP *group) |
1250 | { | 1475 | { |
1251 | if (group->meth->have_precompute_mult != 0) | 1476 | if (group->meth->have_precompute_mult == NULL) |
1252 | return group->meth->have_precompute_mult(group); | 1477 | return 0; |
1253 | else | 1478 | |
1254 | return 0; /* cannot tell whether precomputation has | 1479 | return group->meth->have_precompute_mult(group); |
1255 | * been performed */ | ||
1256 | } | 1480 | } |
1257 | 1481 | ||
1258 | int | 1482 | int |
diff --git a/src/lib/libcrypto/ec/ec_mult.c b/src/lib/libcrypto/ec/ec_mult.c index c792725661..b70e60a1b4 100644 --- a/src/lib/libcrypto/ec/ec_mult.c +++ b/src/lib/libcrypto/ec/ec_mult.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: ec_mult.c,v 1.28 2023/03/08 05:45:31 jsing Exp $ */ | 1 | /* $OpenBSD: ec_mult.c,v 1.29 2023/04/11 18:58:20 jsing Exp $ */ |
2 | /* | 2 | /* |
3 | * Originally written by Bodo Moeller and Nils Larsch for the OpenSSL project. | 3 | * Originally written by Bodo Moeller and Nils Larsch for the OpenSSL project. |
4 | */ | 4 | */ |
@@ -335,7 +335,6 @@ int | |||
335 | ec_wNAF_mul(const EC_GROUP *group, EC_POINT *r, const BIGNUM *scalar, | 335 | ec_wNAF_mul(const EC_GROUP *group, EC_POINT *r, const BIGNUM *scalar, |
336 | size_t num, const EC_POINT *points[], const BIGNUM *scalars[], BN_CTX *ctx) | 336 | size_t num, const EC_POINT *points[], const BIGNUM *scalars[], BN_CTX *ctx) |
337 | { | 337 | { |
338 | BN_CTX *new_ctx = NULL; | ||
339 | const EC_POINT *generator = NULL; | 338 | const EC_POINT *generator = NULL; |
340 | EC_POINT *tmp = NULL; | 339 | EC_POINT *tmp = NULL; |
341 | size_t totalnum; | 340 | size_t totalnum; |
@@ -375,11 +374,6 @@ ec_wNAF_mul(const EC_GROUP *group, EC_POINT *r, const BIGNUM *scalar, | |||
375 | } | 374 | } |
376 | } | 375 | } |
377 | 376 | ||
378 | if (ctx == NULL) { | ||
379 | ctx = new_ctx = BN_CTX_new(); | ||
380 | if (ctx == NULL) | ||
381 | goto err; | ||
382 | } | ||
383 | if (scalar != NULL) { | 377 | if (scalar != NULL) { |
384 | generator = EC_GROUP_get0_generator(group); | 378 | generator = EC_GROUP_get0_generator(group); |
385 | if (generator == NULL) { | 379 | if (generator == NULL) { |
@@ -679,7 +673,6 @@ ec_wNAF_mul(const EC_GROUP *group, EC_POINT *r, const BIGNUM *scalar, | |||
679 | ret = 1; | 673 | ret = 1; |
680 | 674 | ||
681 | err: | 675 | err: |
682 | BN_CTX_free(new_ctx); | ||
683 | EC_POINT_free(tmp); | 676 | EC_POINT_free(tmp); |
684 | free(wsize); | 677 | free(wsize); |
685 | free(wNAF_len); | 678 | free(wNAF_len); |
@@ -726,7 +719,6 @@ ec_wNAF_precompute_mult(EC_GROUP *group, BN_CTX *ctx) | |||
726 | { | 719 | { |
727 | const EC_POINT *generator; | 720 | const EC_POINT *generator; |
728 | EC_POINT *tmp_point = NULL, *base = NULL, **var; | 721 | EC_POINT *tmp_point = NULL, *base = NULL, **var; |
729 | BN_CTX *new_ctx = NULL; | ||
730 | BIGNUM *order; | 722 | BIGNUM *order; |
731 | size_t i, bits, w, pre_points_per_block, blocksize, numblocks, | 723 | size_t i, bits, w, pre_points_per_block, blocksize, numblocks, |
732 | num; | 724 | num; |
@@ -745,12 +737,9 @@ ec_wNAF_precompute_mult(EC_GROUP *group, BN_CTX *ctx) | |||
745 | ECerror(EC_R_UNDEFINED_GENERATOR); | 737 | ECerror(EC_R_UNDEFINED_GENERATOR); |
746 | goto err; | 738 | goto err; |
747 | } | 739 | } |
748 | if (ctx == NULL) { | 740 | |
749 | ctx = new_ctx = BN_CTX_new(); | ||
750 | if (ctx == NULL) | ||
751 | goto err; | ||
752 | } | ||
753 | BN_CTX_start(ctx); | 741 | BN_CTX_start(ctx); |
742 | |||
754 | if ((order = BN_CTX_get(ctx)) == NULL) | 743 | if ((order = BN_CTX_get(ctx)) == NULL) |
755 | goto err; | 744 | goto err; |
756 | 745 | ||
@@ -857,10 +846,9 @@ ec_wNAF_precompute_mult(EC_GROUP *group, BN_CTX *ctx) | |||
857 | pre_comp = NULL; | 846 | pre_comp = NULL; |
858 | 847 | ||
859 | ret = 1; | 848 | ret = 1; |
849 | |||
860 | err: | 850 | err: |
861 | if (ctx != NULL) | 851 | BN_CTX_end(ctx); |
862 | BN_CTX_end(ctx); | ||
863 | BN_CTX_free(new_ctx); | ||
864 | ec_pre_comp_free(pre_comp); | 852 | ec_pre_comp_free(pre_comp); |
865 | if (points) { | 853 | if (points) { |
866 | EC_POINT **p; | 854 | EC_POINT **p; |
diff --git a/src/lib/libcrypto/ec/ec_oct.c b/src/lib/libcrypto/ec/ec_oct.c index ef17ec59a5..b1c9e6a634 100644 --- a/src/lib/libcrypto/ec/ec_oct.c +++ b/src/lib/libcrypto/ec/ec_oct.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: ec_oct.c,v 1.10 2023/03/08 04:50:27 jsing Exp $ */ | 1 | /* $OpenBSD: ec_oct.c,v 1.11 2023/04/11 18:58:20 jsing Exp $ */ |
2 | /* | 2 | /* |
3 | * Originally written by Bodo Moeller for the OpenSSL project. | 3 | * Originally written by Bodo Moeller for the OpenSSL project. |
4 | */ | 4 | */ |
@@ -72,18 +72,32 @@ | |||
72 | 72 | ||
73 | int | 73 | int |
74 | EC_POINT_set_compressed_coordinates(const EC_GROUP *group, EC_POINT *point, | 74 | EC_POINT_set_compressed_coordinates(const EC_GROUP *group, EC_POINT *point, |
75 | const BIGNUM *x, int y_bit, BN_CTX *ctx) | 75 | const BIGNUM *x, int y_bit, BN_CTX *ctx_in) |
76 | { | 76 | { |
77 | BN_CTX *ctx; | ||
78 | int ret = 0; | ||
79 | |||
80 | if ((ctx = ctx_in) == NULL) | ||
81 | ctx = BN_CTX_new(); | ||
82 | if (ctx == NULL) | ||
83 | goto err; | ||
84 | |||
77 | if (group->meth->point_set_compressed_coordinates == NULL) { | 85 | if (group->meth->point_set_compressed_coordinates == NULL) { |
78 | ECerror(ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); | 86 | ECerror(ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); |
79 | return 0; | 87 | goto err; |
80 | } | 88 | } |
81 | if (group->meth != point->meth) { | 89 | if (group->meth != point->meth) { |
82 | ECerror(EC_R_INCOMPATIBLE_OBJECTS); | 90 | ECerror(EC_R_INCOMPATIBLE_OBJECTS); |
83 | return 0; | 91 | goto err; |
84 | } | 92 | } |
85 | return group->meth->point_set_compressed_coordinates(group, point, | 93 | ret = group->meth->point_set_compressed_coordinates(group, point, |
86 | x, y_bit, ctx); | 94 | x, y_bit, ctx); |
95 | |||
96 | err: | ||
97 | if (ctx != ctx_in) | ||
98 | BN_CTX_free(ctx); | ||
99 | |||
100 | return ret; | ||
87 | } | 101 | } |
88 | 102 | ||
89 | int | 103 | int |
@@ -104,31 +118,59 @@ EC_POINT_set_compressed_coordinates_GF2m(const EC_GROUP *group, EC_POINT *point, | |||
104 | 118 | ||
105 | size_t | 119 | size_t |
106 | EC_POINT_point2oct(const EC_GROUP *group, const EC_POINT *point, | 120 | EC_POINT_point2oct(const EC_GROUP *group, const EC_POINT *point, |
107 | point_conversion_form_t form, | 121 | point_conversion_form_t form, unsigned char *buf, size_t len, |
108 | unsigned char *buf, size_t len, BN_CTX *ctx) | 122 | BN_CTX *ctx_in) |
109 | { | 123 | { |
124 | BN_CTX *ctx; | ||
125 | int ret = 0; | ||
126 | |||
127 | if ((ctx = ctx_in) == NULL) | ||
128 | ctx = BN_CTX_new(); | ||
129 | if (ctx == NULL) | ||
130 | goto err; | ||
131 | |||
110 | if (group->meth->point2oct == NULL) { | 132 | if (group->meth->point2oct == NULL) { |
111 | ECerror(ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); | 133 | ECerror(ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); |
112 | return 0; | 134 | goto err; |
113 | } | 135 | } |
114 | if (group->meth != point->meth) { | 136 | if (group->meth != point->meth) { |
115 | ECerror(EC_R_INCOMPATIBLE_OBJECTS); | 137 | ECerror(EC_R_INCOMPATIBLE_OBJECTS); |
116 | return 0; | 138 | goto err; |
117 | } | 139 | } |
118 | return group->meth->point2oct(group, point, form, buf, len, ctx); | 140 | ret = group->meth->point2oct(group, point, form, buf, len, ctx); |
141 | |||
142 | err: | ||
143 | if (ctx != ctx_in) | ||
144 | BN_CTX_free(ctx); | ||
145 | |||
146 | return ret; | ||
119 | } | 147 | } |
120 | 148 | ||
121 | int | 149 | int |
122 | EC_POINT_oct2point(const EC_GROUP *group, EC_POINT *point, | 150 | EC_POINT_oct2point(const EC_GROUP *group, EC_POINT *point, |
123 | const unsigned char *buf, size_t len, BN_CTX *ctx) | 151 | const unsigned char *buf, size_t len, BN_CTX *ctx_in) |
124 | { | 152 | { |
153 | BN_CTX *ctx; | ||
154 | int ret = 0; | ||
155 | |||
156 | if ((ctx = ctx_in) == NULL) | ||
157 | ctx = BN_CTX_new(); | ||
158 | if (ctx == NULL) | ||
159 | goto err; | ||
160 | |||
125 | if (group->meth->oct2point == NULL) { | 161 | if (group->meth->oct2point == NULL) { |
126 | ECerror(ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); | 162 | ECerror(ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); |
127 | return 0; | 163 | goto err; |
128 | } | 164 | } |
129 | if (group->meth != point->meth) { | 165 | if (group->meth != point->meth) { |
130 | ECerror(EC_R_INCOMPATIBLE_OBJECTS); | 166 | ECerror(EC_R_INCOMPATIBLE_OBJECTS); |
131 | return 0; | 167 | goto err; |
132 | } | 168 | } |
133 | return group->meth->oct2point(group, point, buf, len, ctx); | 169 | ret = group->meth->oct2point(group, point, buf, len, ctx); |
170 | |||
171 | err: | ||
172 | if (ctx != ctx_in) | ||
173 | BN_CTX_free(ctx); | ||
174 | |||
175 | return ret; | ||
134 | } | 176 | } |
diff --git a/src/lib/libcrypto/ec/ecp_mont.c b/src/lib/libcrypto/ec/ecp_mont.c index 915cf15f72..b113855603 100644 --- a/src/lib/libcrypto/ec/ecp_mont.c +++ b/src/lib/libcrypto/ec/ecp_mont.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: ecp_mont.c,v 1.28 2023/03/27 10:25:02 tb Exp $ */ | 1 | /* $OpenBSD: ecp_mont.c,v 1.29 2023/04/11 18:58:20 jsing Exp $ */ |
2 | /* | 2 | /* |
3 | * Originally written by Bodo Moeller for the OpenSSL project. | 3 | * Originally written by Bodo Moeller for the OpenSSL project. |
4 | */ | 4 | */ |
@@ -127,18 +127,12 @@ static int | |||
127 | ec_GFp_mont_group_set_curve(EC_GROUP *group, const BIGNUM *p, const BIGNUM *a, | 127 | ec_GFp_mont_group_set_curve(EC_GROUP *group, const BIGNUM *p, const BIGNUM *a, |
128 | const BIGNUM *b, BN_CTX *ctx) | 128 | const BIGNUM *b, BN_CTX *ctx) |
129 | { | 129 | { |
130 | BN_CTX *new_ctx = NULL; | ||
131 | BN_MONT_CTX *mont = NULL; | 130 | BN_MONT_CTX *mont = NULL; |
132 | BIGNUM *one = NULL; | 131 | BIGNUM *one = NULL; |
133 | int ret = 0; | 132 | int ret = 0; |
134 | 133 | ||
135 | ec_GFp_mont_group_clear(group); | 134 | ec_GFp_mont_group_clear(group); |
136 | 135 | ||
137 | if (ctx == NULL) { | ||
138 | ctx = new_ctx = BN_CTX_new(); | ||
139 | if (ctx == NULL) | ||
140 | return 0; | ||
141 | } | ||
142 | mont = BN_MONT_CTX_new(); | 136 | mont = BN_MONT_CTX_new(); |
143 | if (mont == NULL) | 137 | if (mont == NULL) |
144 | goto err; | 138 | goto err; |
@@ -158,14 +152,13 @@ ec_GFp_mont_group_set_curve(EC_GROUP *group, const BIGNUM *p, const BIGNUM *a, | |||
158 | one = NULL; | 152 | one = NULL; |
159 | 153 | ||
160 | ret = ec_GFp_simple_group_set_curve(group, p, a, b, ctx); | 154 | ret = ec_GFp_simple_group_set_curve(group, p, a, b, ctx); |
161 | |||
162 | if (!ret) | 155 | if (!ret) |
163 | ec_GFp_mont_group_clear(group); | 156 | ec_GFp_mont_group_clear(group); |
164 | 157 | ||
165 | err: | 158 | err: |
166 | BN_CTX_free(new_ctx); | ||
167 | BN_MONT_CTX_free(mont); | 159 | BN_MONT_CTX_free(mont); |
168 | BN_free(one); | 160 | BN_free(one); |
161 | |||
169 | return ret; | 162 | return ret; |
170 | } | 163 | } |
171 | 164 | ||
@@ -222,6 +215,7 @@ ec_GFp_mont_field_set_to_one(const EC_GROUP *group, BIGNUM *r, BN_CTX *ctx) | |||
222 | } | 215 | } |
223 | if (!bn_copy(r, group->mont_one)) | 216 | if (!bn_copy(r, group->mont_one)) |
224 | return 0; | 217 | return 0; |
218 | |||
225 | return 1; | 219 | return 1; |
226 | } | 220 | } |
227 | 221 | ||
diff --git a/src/lib/libcrypto/ec/ecp_nist.c b/src/lib/libcrypto/ec/ecp_nist.c index c736526a66..9478b4dc6e 100644 --- a/src/lib/libcrypto/ec/ecp_nist.c +++ b/src/lib/libcrypto/ec/ecp_nist.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: ecp_nist.c,v 1.25 2023/04/11 18:53:20 jsing Exp $ */ | 1 | /* $OpenBSD: ecp_nist.c,v 1.26 2023/04/11 18:58:20 jsing Exp $ */ |
2 | /* | 2 | /* |
3 | * Written by Nils Larsch for the OpenSSL project. | 3 | * Written by Nils Larsch for the OpenSSL project. |
4 | */ | 4 | */ |
@@ -80,15 +80,6 @@ static int | |||
80 | ec_GFp_nist_group_set_curve(EC_GROUP *group, const BIGNUM *p, | 80 | ec_GFp_nist_group_set_curve(EC_GROUP *group, const BIGNUM *p, |
81 | const BIGNUM *a, const BIGNUM *b, BN_CTX *ctx) | 81 | const BIGNUM *a, const BIGNUM *b, BN_CTX *ctx) |
82 | { | 82 | { |
83 | int ret = 0; | ||
84 | BN_CTX *new_ctx = NULL; | ||
85 | |||
86 | if (ctx == NULL) | ||
87 | if ((ctx = new_ctx = BN_CTX_new()) == NULL) | ||
88 | return 0; | ||
89 | |||
90 | BN_CTX_start(ctx); | ||
91 | |||
92 | if (BN_ucmp(BN_get0_nist_prime_192(), p) == 0) | 83 | if (BN_ucmp(BN_get0_nist_prime_192(), p) == 0) |
93 | group->field_mod_func = BN_nist_mod_192; | 84 | group->field_mod_func = BN_nist_mod_192; |
94 | else if (BN_ucmp(BN_get0_nist_prime_224(), p) == 0) | 85 | else if (BN_ucmp(BN_get0_nist_prime_224(), p) == 0) |
@@ -101,67 +92,40 @@ ec_GFp_nist_group_set_curve(EC_GROUP *group, const BIGNUM *p, | |||
101 | group->field_mod_func = BN_nist_mod_521; | 92 | group->field_mod_func = BN_nist_mod_521; |
102 | else { | 93 | else { |
103 | ECerror(EC_R_NOT_A_NIST_PRIME); | 94 | ECerror(EC_R_NOT_A_NIST_PRIME); |
104 | goto err; | 95 | return 0; |
105 | } | 96 | } |
106 | 97 | ||
107 | ret = ec_GFp_simple_group_set_curve(group, p, a, b, ctx); | 98 | return ec_GFp_simple_group_set_curve(group, p, a, b, ctx); |
108 | |||
109 | err: | ||
110 | BN_CTX_end(ctx); | ||
111 | BN_CTX_free(new_ctx); | ||
112 | return ret; | ||
113 | } | 99 | } |
114 | 100 | ||
115 | static int | 101 | static int |
116 | ec_GFp_nist_field_mul(const EC_GROUP *group, BIGNUM *r, const BIGNUM *a, | 102 | ec_GFp_nist_field_mul(const EC_GROUP *group, BIGNUM *r, const BIGNUM *a, |
117 | const BIGNUM *b, BN_CTX *ctx) | 103 | const BIGNUM *b, BN_CTX *ctx) |
118 | { | 104 | { |
119 | int ret = 0; | 105 | if (group == NULL || r == NULL || a == NULL || b == NULL) { |
120 | BN_CTX *ctx_new = NULL; | ||
121 | |||
122 | if (!group || !r || !a || !b) { | ||
123 | ECerror(ERR_R_PASSED_NULL_PARAMETER); | 106 | ECerror(ERR_R_PASSED_NULL_PARAMETER); |
124 | goto err; | 107 | return 0; |
125 | } | 108 | } |
126 | if (!ctx) | ||
127 | if ((ctx_new = ctx = BN_CTX_new()) == NULL) | ||
128 | goto err; | ||
129 | 109 | ||
130 | if (!BN_mul(r, a, b, ctx)) | 110 | if (!BN_mul(r, a, b, ctx)) |
131 | goto err; | 111 | return 0; |
132 | if (!group->field_mod_func(r, r, &group->field, ctx)) | ||
133 | goto err; | ||
134 | 112 | ||
135 | ret = 1; | 113 | return group->field_mod_func(r, r, &group->field, ctx); |
136 | err: | ||
137 | BN_CTX_free(ctx_new); | ||
138 | return ret; | ||
139 | } | 114 | } |
140 | 115 | ||
141 | static int | 116 | static int |
142 | ec_GFp_nist_field_sqr(const EC_GROUP *group, BIGNUM *r, const BIGNUM *a, | 117 | ec_GFp_nist_field_sqr(const EC_GROUP *group, BIGNUM *r, const BIGNUM *a, |
143 | BN_CTX *ctx) | 118 | BN_CTX *ctx) |
144 | { | 119 | { |
145 | int ret = 0; | 120 | if (group == NULL || r == NULL || a == NULL) { |
146 | BN_CTX *ctx_new = NULL; | ||
147 | |||
148 | if (!group || !r || !a) { | ||
149 | ECerror(EC_R_PASSED_NULL_PARAMETER); | 121 | ECerror(EC_R_PASSED_NULL_PARAMETER); |
150 | goto err; | 122 | return 0; |
151 | } | 123 | } |
152 | if (!ctx) | ||
153 | if ((ctx_new = ctx = BN_CTX_new()) == NULL) | ||
154 | goto err; | ||
155 | 124 | ||
156 | if (!BN_sqr(r, a, ctx)) | 125 | if (!BN_sqr(r, a, ctx)) |
157 | goto err; | 126 | return 0; |
158 | if (!group->field_mod_func(r, r, &group->field, ctx)) | ||
159 | goto err; | ||
160 | 127 | ||
161 | ret = 1; | 128 | return group->field_mod_func(r, r, &group->field, ctx); |
162 | err: | ||
163 | BN_CTX_free(ctx_new); | ||
164 | return ret; | ||
165 | } | 129 | } |
166 | 130 | ||
167 | static const EC_METHOD ec_GFp_nist_method = { | 131 | static const EC_METHOD ec_GFp_nist_method = { |
diff --git a/src/lib/libcrypto/ec/ecp_oct.c b/src/lib/libcrypto/ec/ecp_oct.c index f2f1929e84..8cdf544bf1 100644 --- a/src/lib/libcrypto/ec/ecp_oct.c +++ b/src/lib/libcrypto/ec/ecp_oct.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: ecp_oct.c,v 1.19 2022/11/26 16:08:52 tb Exp $ */ | 1 | /* $OpenBSD: ecp_oct.c,v 1.20 2023/04/11 18:58:20 jsing 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 | * Includes code written by Bodo Moeller for the OpenSSL project. | 4 | * Includes code written by Bodo Moeller for the OpenSSL project. |
@@ -70,21 +70,16 @@ int | |||
70 | ec_GFp_simple_set_compressed_coordinates(const EC_GROUP *group, | 70 | ec_GFp_simple_set_compressed_coordinates(const EC_GROUP *group, |
71 | EC_POINT *point, const BIGNUM *x_, int y_bit, BN_CTX *ctx) | 71 | EC_POINT *point, const BIGNUM *x_, int y_bit, BN_CTX *ctx) |
72 | { | 72 | { |
73 | BN_CTX *new_ctx = NULL; | ||
74 | BIGNUM *tmp1, *tmp2, *x, *y; | 73 | BIGNUM *tmp1, *tmp2, *x, *y; |
75 | int ret = 0; | 74 | int ret = 0; |
76 | 75 | ||
77 | /* clear error queue */ | 76 | /* clear error queue */ |
78 | ERR_clear_error(); | 77 | ERR_clear_error(); |
79 | 78 | ||
80 | if (ctx == NULL) { | ||
81 | ctx = new_ctx = BN_CTX_new(); | ||
82 | if (ctx == NULL) | ||
83 | return 0; | ||
84 | } | ||
85 | y_bit = (y_bit != 0); | 79 | y_bit = (y_bit != 0); |
86 | 80 | ||
87 | BN_CTX_start(ctx); | 81 | BN_CTX_start(ctx); |
82 | |||
88 | if ((tmp1 = BN_CTX_get(ctx)) == NULL) | 83 | if ((tmp1 = BN_CTX_get(ctx)) == NULL) |
89 | goto err; | 84 | goto err; |
90 | if ((tmp2 = BN_CTX_get(ctx)) == NULL) | 85 | if ((tmp2 = BN_CTX_get(ctx)) == NULL) |
@@ -179,27 +174,25 @@ ec_GFp_simple_set_compressed_coordinates(const EC_GROUP *group, | |||
179 | 174 | ||
180 | err: | 175 | err: |
181 | BN_CTX_end(ctx); | 176 | BN_CTX_end(ctx); |
182 | BN_CTX_free(new_ctx); | 177 | |
183 | return ret; | 178 | return ret; |
184 | } | 179 | } |
185 | 180 | ||
186 | |||
187 | size_t | 181 | size_t |
188 | ec_GFp_simple_point2oct(const EC_GROUP *group, const EC_POINT *point, point_conversion_form_t form, | 182 | ec_GFp_simple_point2oct(const EC_GROUP *group, const EC_POINT *point, |
189 | unsigned char *buf, size_t len, BN_CTX *ctx) | 183 | point_conversion_form_t form, unsigned char *buf, size_t len, BN_CTX *ctx) |
190 | { | 184 | { |
191 | size_t ret; | ||
192 | BN_CTX *new_ctx = NULL; | ||
193 | int used_ctx = 0; | ||
194 | BIGNUM *x, *y; | 185 | BIGNUM *x, *y; |
195 | size_t field_len, i, skip; | 186 | size_t field_len, i, skip; |
187 | size_t ret = 0; | ||
196 | 188 | ||
197 | if ((form != POINT_CONVERSION_COMPRESSED) | 189 | if (form != POINT_CONVERSION_COMPRESSED && |
198 | && (form != POINT_CONVERSION_UNCOMPRESSED) | 190 | form != POINT_CONVERSION_UNCOMPRESSED && |
199 | && (form != POINT_CONVERSION_HYBRID)) { | 191 | form != POINT_CONVERSION_HYBRID) { |
200 | ECerror(EC_R_INVALID_FORM); | 192 | ECerror(EC_R_INVALID_FORM); |
201 | goto err; | 193 | return 0; |
202 | } | 194 | } |
195 | |||
203 | if (EC_POINT_is_at_infinity(group, point) > 0) { | 196 | if (EC_POINT_is_at_infinity(group, point) > 0) { |
204 | /* encodes to a single 0 octet */ | 197 | /* encodes to a single 0 octet */ |
205 | if (buf != NULL) { | 198 | if (buf != NULL) { |
@@ -211,23 +204,20 @@ ec_GFp_simple_point2oct(const EC_GROUP *group, const EC_POINT *point, point_conv | |||
211 | } | 204 | } |
212 | return 1; | 205 | return 1; |
213 | } | 206 | } |
207 | |||
214 | /* ret := required output buffer length */ | 208 | /* ret := required output buffer length */ |
215 | field_len = BN_num_bytes(&group->field); | 209 | field_len = BN_num_bytes(&group->field); |
216 | ret = (form == POINT_CONVERSION_COMPRESSED) ? 1 + field_len : 1 + 2 * field_len; | 210 | ret = (form == POINT_CONVERSION_COMPRESSED) ? 1 + field_len : 1 + 2 * field_len; |
217 | 211 | ||
212 | BN_CTX_start(ctx); | ||
213 | |||
218 | /* if 'buf' is NULL, just return required length */ | 214 | /* if 'buf' is NULL, just return required length */ |
219 | if (buf != NULL) { | 215 | if (buf != NULL) { |
220 | if (len < ret) { | 216 | if (len < ret) { |
221 | ECerror(EC_R_BUFFER_TOO_SMALL); | 217 | ECerror(EC_R_BUFFER_TOO_SMALL); |
222 | goto err; | 218 | goto err; |
223 | } | 219 | } |
224 | if (ctx == NULL) { | 220 | |
225 | ctx = new_ctx = BN_CTX_new(); | ||
226 | if (ctx == NULL) | ||
227 | return 0; | ||
228 | } | ||
229 | BN_CTX_start(ctx); | ||
230 | used_ctx = 1; | ||
231 | if ((x = BN_CTX_get(ctx)) == NULL) | 221 | if ((x = BN_CTX_get(ctx)) == NULL) |
232 | goto err; | 222 | goto err; |
233 | if ((y = BN_CTX_get(ctx)) == NULL) | 223 | if ((y = BN_CTX_get(ctx)) == NULL) |
@@ -276,18 +266,12 @@ ec_GFp_simple_point2oct(const EC_GROUP *group, const EC_POINT *point, point_conv | |||
276 | goto err; | 266 | goto err; |
277 | } | 267 | } |
278 | } | 268 | } |
279 | if (used_ctx) | ||
280 | BN_CTX_end(ctx); | ||
281 | BN_CTX_free(new_ctx); | ||
282 | return ret; | ||
283 | 269 | ||
284 | err: | 270 | err: |
285 | if (used_ctx) | 271 | BN_CTX_end(ctx); |
286 | BN_CTX_end(ctx); | ||
287 | BN_CTX_free(new_ctx); | ||
288 | return 0; | ||
289 | } | ||
290 | 272 | ||
273 | return ret; | ||
274 | } | ||
291 | 275 | ||
292 | int | 276 | int |
293 | ec_GFp_simple_oct2point(const EC_GROUP *group, EC_POINT *point, | 277 | ec_GFp_simple_oct2point(const EC_GROUP *group, EC_POINT *point, |
@@ -295,7 +279,6 @@ ec_GFp_simple_oct2point(const EC_GROUP *group, EC_POINT *point, | |||
295 | { | 279 | { |
296 | point_conversion_form_t form; | 280 | point_conversion_form_t form; |
297 | int y_bit; | 281 | int y_bit; |
298 | BN_CTX *new_ctx = NULL; | ||
299 | BIGNUM *x, *y; | 282 | BIGNUM *x, *y; |
300 | size_t field_len, enc_len; | 283 | size_t field_len, enc_len; |
301 | int ret = 0; | 284 | int ret = 0; |
@@ -331,12 +314,9 @@ ec_GFp_simple_oct2point(const EC_GROUP *group, EC_POINT *point, | |||
331 | ECerror(EC_R_INVALID_ENCODING); | 314 | ECerror(EC_R_INVALID_ENCODING); |
332 | return 0; | 315 | return 0; |
333 | } | 316 | } |
334 | if (ctx == NULL) { | 317 | |
335 | ctx = new_ctx = BN_CTX_new(); | ||
336 | if (ctx == NULL) | ||
337 | return 0; | ||
338 | } | ||
339 | BN_CTX_start(ctx); | 318 | BN_CTX_start(ctx); |
319 | |||
340 | if ((x = BN_CTX_get(ctx)) == NULL) | 320 | if ((x = BN_CTX_get(ctx)) == NULL) |
341 | goto err; | 321 | goto err; |
342 | if ((y = BN_CTX_get(ctx)) == NULL) | 322 | if ((y = BN_CTX_get(ctx)) == NULL) |
@@ -380,6 +360,6 @@ ec_GFp_simple_oct2point(const EC_GROUP *group, EC_POINT *point, | |||
380 | 360 | ||
381 | err: | 361 | err: |
382 | BN_CTX_end(ctx); | 362 | BN_CTX_end(ctx); |
383 | BN_CTX_free(new_ctx); | 363 | |
384 | return ret; | 364 | return ret; |
385 | } | 365 | } |
diff --git a/src/lib/libcrypto/ec/ecp_smpl.c b/src/lib/libcrypto/ec/ecp_smpl.c index 90330652e4..1162d89ca5 100644 --- a/src/lib/libcrypto/ec/ecp_smpl.c +++ b/src/lib/libcrypto/ec/ecp_smpl.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: ecp_smpl.c,v 1.43 2023/03/27 10:25:02 tb Exp $ */ | 1 | /* $OpenBSD: ecp_smpl.c,v 1.44 2023/04/11 18:58:20 jsing 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 | * Includes code written by Bodo Moeller for the OpenSSL project. | 4 | * Includes code written by Bodo Moeller for the OpenSSL project. |
@@ -118,21 +118,17 @@ int | |||
118 | ec_GFp_simple_group_set_curve(EC_GROUP *group, | 118 | ec_GFp_simple_group_set_curve(EC_GROUP *group, |
119 | const BIGNUM *p, const BIGNUM *a, const BIGNUM *b, BN_CTX *ctx) | 119 | const BIGNUM *p, const BIGNUM *a, const BIGNUM *b, BN_CTX *ctx) |
120 | { | 120 | { |
121 | int ret = 0; | ||
122 | BN_CTX *new_ctx = NULL; | ||
123 | BIGNUM *tmp_a; | 121 | BIGNUM *tmp_a; |
122 | int ret = 0; | ||
124 | 123 | ||
125 | /* p must be a prime > 3 */ | 124 | /* p must be a prime > 3 */ |
126 | if (BN_num_bits(p) <= 2 || !BN_is_odd(p)) { | 125 | if (BN_num_bits(p) <= 2 || !BN_is_odd(p)) { |
127 | ECerror(EC_R_INVALID_FIELD); | 126 | ECerror(EC_R_INVALID_FIELD); |
128 | return 0; | 127 | return 0; |
129 | } | 128 | } |
130 | if (ctx == NULL) { | 129 | |
131 | ctx = new_ctx = BN_CTX_new(); | ||
132 | if (ctx == NULL) | ||
133 | return 0; | ||
134 | } | ||
135 | BN_CTX_start(ctx); | 130 | BN_CTX_start(ctx); |
131 | |||
136 | if ((tmp_a = BN_CTX_get(ctx)) == NULL) | 132 | if ((tmp_a = BN_CTX_get(ctx)) == NULL) |
137 | goto err; | 133 | goto err; |
138 | 134 | ||
@@ -166,51 +162,38 @@ ec_GFp_simple_group_set_curve(EC_GROUP *group, | |||
166 | 162 | ||
167 | err: | 163 | err: |
168 | BN_CTX_end(ctx); | 164 | BN_CTX_end(ctx); |
169 | BN_CTX_free(new_ctx); | 165 | |
170 | return ret; | 166 | return ret; |
171 | } | 167 | } |
172 | 168 | ||
173 | int | 169 | int |
174 | ec_GFp_simple_group_get_curve(const EC_GROUP *group, BIGNUM *p, BIGNUM *a, BIGNUM *b, BN_CTX *ctx) | 170 | ec_GFp_simple_group_get_curve(const EC_GROUP *group, BIGNUM *p, BIGNUM *a, BIGNUM *b, BN_CTX *ctx) |
175 | { | 171 | { |
176 | int ret = 0; | ||
177 | BN_CTX *new_ctx = NULL; | ||
178 | |||
179 | if (p != NULL) { | 172 | if (p != NULL) { |
180 | if (!bn_copy(p, &group->field)) | 173 | if (!bn_copy(p, &group->field)) |
181 | return 0; | 174 | return 0; |
182 | } | 175 | } |
183 | if (a != NULL || b != NULL) { | 176 | if (group->meth->field_decode != NULL) { |
184 | if (group->meth->field_decode) { | 177 | if (a != NULL) { |
185 | if (ctx == NULL) { | 178 | if (!group->meth->field_decode(group, a, &group->a, ctx)) |
186 | ctx = new_ctx = BN_CTX_new(); | 179 | return 0; |
187 | if (ctx == NULL) | 180 | } |
188 | return 0; | 181 | if (b != NULL) { |
189 | } | 182 | if (!group->meth->field_decode(group, b, &group->b, ctx)) |
190 | if (a != NULL) { | 183 | return 0; |
191 | if (!group->meth->field_decode(group, a, &group->a, ctx)) | 184 | } |
192 | goto err; | 185 | } else { |
193 | } | 186 | if (a != NULL) { |
194 | if (b != NULL) { | 187 | if (!bn_copy(a, &group->a)) |
195 | if (!group->meth->field_decode(group, b, &group->b, ctx)) | 188 | return 0; |
196 | goto err; | 189 | } |
197 | } | 190 | if (b != NULL) { |
198 | } else { | 191 | if (!bn_copy(b, &group->b)) |
199 | if (a != NULL) { | 192 | return 0; |
200 | if (!bn_copy(a, &group->a)) | ||
201 | goto err; | ||
202 | } | ||
203 | if (b != NULL) { | ||
204 | if (!bn_copy(b, &group->b)) | ||
205 | goto err; | ||
206 | } | ||
207 | } | 193 | } |
208 | } | 194 | } |
209 | ret = 1; | ||
210 | 195 | ||
211 | err: | 196 | return 1; |
212 | BN_CTX_free(new_ctx); | ||
213 | return ret; | ||
214 | } | 197 | } |
215 | 198 | ||
216 | int | 199 | int |
@@ -222,19 +205,12 @@ ec_GFp_simple_group_get_degree(const EC_GROUP *group) | |||
222 | int | 205 | int |
223 | ec_GFp_simple_group_check_discriminant(const EC_GROUP *group, BN_CTX *ctx) | 206 | ec_GFp_simple_group_check_discriminant(const EC_GROUP *group, BN_CTX *ctx) |
224 | { | 207 | { |
225 | int ret = 0; | ||
226 | BIGNUM *a, *b, *order, *tmp_1, *tmp_2; | 208 | BIGNUM *a, *b, *order, *tmp_1, *tmp_2; |
227 | const BIGNUM *p = &group->field; | 209 | const BIGNUM *p = &group->field; |
228 | BN_CTX *new_ctx = NULL; | 210 | int ret = 0; |
229 | 211 | ||
230 | if (ctx == NULL) { | ||
231 | ctx = new_ctx = BN_CTX_new(); | ||
232 | if (ctx == NULL) { | ||
233 | ECerror(ERR_R_MALLOC_FAILURE); | ||
234 | goto err; | ||
235 | } | ||
236 | } | ||
237 | BN_CTX_start(ctx); | 212 | BN_CTX_start(ctx); |
213 | |||
238 | if ((a = BN_CTX_get(ctx)) == NULL) | 214 | if ((a = BN_CTX_get(ctx)) == NULL) |
239 | goto err; | 215 | goto err; |
240 | if ((b = BN_CTX_get(ctx)) == NULL) | 216 | if ((b = BN_CTX_get(ctx)) == NULL) |
@@ -288,9 +264,8 @@ ec_GFp_simple_group_check_discriminant(const EC_GROUP *group, BN_CTX *ctx) | |||
288 | ret = 1; | 264 | ret = 1; |
289 | 265 | ||
290 | err: | 266 | err: |
291 | if (ctx != NULL) | 267 | BN_CTX_end(ctx); |
292 | BN_CTX_end(ctx); | 268 | |
293 | BN_CTX_free(new_ctx); | ||
294 | return ret; | 269 | return ret; |
295 | } | 270 | } |
296 | 271 | ||
@@ -341,18 +316,12 @@ ec_GFp_simple_set_Jprojective_coordinates(const EC_GROUP *group, | |||
341 | EC_POINT *point, const BIGNUM *x, const BIGNUM *y, const BIGNUM *z, | 316 | EC_POINT *point, const BIGNUM *x, const BIGNUM *y, const BIGNUM *z, |
342 | BN_CTX *ctx) | 317 | BN_CTX *ctx) |
343 | { | 318 | { |
344 | BN_CTX *new_ctx = NULL; | ||
345 | int ret = 0; | 319 | int ret = 0; |
346 | 320 | ||
347 | if (ctx == NULL) { | ||
348 | ctx = new_ctx = BN_CTX_new(); | ||
349 | if (ctx == NULL) | ||
350 | return 0; | ||
351 | } | ||
352 | if (x != NULL) { | 321 | if (x != NULL) { |
353 | if (!BN_nnmod(&point->X, x, &group->field, ctx)) | 322 | if (!BN_nnmod(&point->X, x, &group->field, ctx)) |
354 | goto err; | 323 | goto err; |
355 | if (group->meth->field_encode) { | 324 | if (group->meth->field_encode != NULL) { |
356 | if (!group->meth->field_encode(group, &point->X, &point->X, ctx)) | 325 | if (!group->meth->field_encode(group, &point->X, &point->X, ctx)) |
357 | goto err; | 326 | goto err; |
358 | } | 327 | } |
@@ -360,7 +329,7 @@ ec_GFp_simple_set_Jprojective_coordinates(const EC_GROUP *group, | |||
360 | if (y != NULL) { | 329 | if (y != NULL) { |
361 | if (!BN_nnmod(&point->Y, y, &group->field, ctx)) | 330 | if (!BN_nnmod(&point->Y, y, &group->field, ctx)) |
362 | goto err; | 331 | goto err; |
363 | if (group->meth->field_encode) { | 332 | if (group->meth->field_encode != NULL) { |
364 | if (!group->meth->field_encode(group, &point->Y, &point->Y, ctx)) | 333 | if (!group->meth->field_encode(group, &point->Y, &point->Y, ctx)) |
365 | goto err; | 334 | goto err; |
366 | } | 335 | } |
@@ -371,7 +340,7 @@ ec_GFp_simple_set_Jprojective_coordinates(const EC_GROUP *group, | |||
371 | if (!BN_nnmod(&point->Z, z, &group->field, ctx)) | 340 | if (!BN_nnmod(&point->Z, z, &group->field, ctx)) |
372 | goto err; | 341 | goto err; |
373 | Z_is_one = BN_is_one(&point->Z); | 342 | Z_is_one = BN_is_one(&point->Z); |
374 | if (group->meth->field_encode) { | 343 | if (group->meth->field_encode != NULL) { |
375 | if (Z_is_one && (group->meth->field_set_to_one != 0)) { | 344 | if (Z_is_one && (group->meth->field_set_to_one != 0)) { |
376 | if (!group->meth->field_set_to_one(group, &point->Z, ctx)) | 345 | if (!group->meth->field_set_to_one(group, &point->Z, ctx)) |
377 | goto err; | 346 | goto err; |
@@ -385,7 +354,6 @@ ec_GFp_simple_set_Jprojective_coordinates(const EC_GROUP *group, | |||
385 | ret = 1; | 354 | ret = 1; |
386 | 355 | ||
387 | err: | 356 | err: |
388 | BN_CTX_free(new_ctx); | ||
389 | return ret; | 357 | return ret; |
390 | } | 358 | } |
391 | 359 | ||
@@ -393,15 +361,9 @@ int | |||
393 | ec_GFp_simple_get_Jprojective_coordinates(const EC_GROUP *group, | 361 | ec_GFp_simple_get_Jprojective_coordinates(const EC_GROUP *group, |
394 | const EC_POINT *point, BIGNUM *x, BIGNUM *y, BIGNUM *z, BN_CTX *ctx) | 362 | const EC_POINT *point, BIGNUM *x, BIGNUM *y, BIGNUM *z, BN_CTX *ctx) |
395 | { | 363 | { |
396 | BN_CTX *new_ctx = NULL; | ||
397 | int ret = 0; | 364 | int ret = 0; |
398 | 365 | ||
399 | if (group->meth->field_decode != 0) { | 366 | if (group->meth->field_decode != NULL) { |
400 | if (ctx == NULL) { | ||
401 | ctx = new_ctx = BN_CTX_new(); | ||
402 | if (ctx == NULL) | ||
403 | return 0; | ||
404 | } | ||
405 | if (x != NULL) { | 367 | if (x != NULL) { |
406 | if (!group->meth->field_decode(group, x, &point->X, ctx)) | 368 | if (!group->meth->field_decode(group, x, &point->X, ctx)) |
407 | goto err; | 369 | goto err; |
@@ -432,7 +394,6 @@ ec_GFp_simple_get_Jprojective_coordinates(const EC_GROUP *group, | |||
432 | ret = 1; | 394 | ret = 1; |
433 | 395 | ||
434 | err: | 396 | err: |
435 | BN_CTX_free(new_ctx); | ||
436 | return ret; | 397 | return ret; |
437 | } | 398 | } |
438 | 399 | ||
@@ -453,7 +414,6 @@ int | |||
453 | ec_GFp_simple_point_get_affine_coordinates(const EC_GROUP *group, const EC_POINT *point, | 414 | ec_GFp_simple_point_get_affine_coordinates(const EC_GROUP *group, const EC_POINT *point, |
454 | BIGNUM *x, BIGNUM *y, BN_CTX *ctx) | 415 | BIGNUM *x, BIGNUM *y, BN_CTX *ctx) |
455 | { | 416 | { |
456 | BN_CTX *new_ctx = NULL; | ||
457 | BIGNUM *Z, *Z_1, *Z_2, *Z_3; | 417 | BIGNUM *Z, *Z_1, *Z_2, *Z_3; |
458 | const BIGNUM *Z_; | 418 | const BIGNUM *Z_; |
459 | int ret = 0; | 419 | int ret = 0; |
@@ -462,12 +422,9 @@ ec_GFp_simple_point_get_affine_coordinates(const EC_GROUP *group, const EC_POINT | |||
462 | ECerror(EC_R_POINT_AT_INFINITY); | 422 | ECerror(EC_R_POINT_AT_INFINITY); |
463 | return 0; | 423 | return 0; |
464 | } | 424 | } |
465 | if (ctx == NULL) { | 425 | |
466 | ctx = new_ctx = BN_CTX_new(); | ||
467 | if (ctx == NULL) | ||
468 | return 0; | ||
469 | } | ||
470 | BN_CTX_start(ctx); | 426 | BN_CTX_start(ctx); |
427 | |||
471 | if ((Z = BN_CTX_get(ctx)) == NULL) | 428 | if ((Z = BN_CTX_get(ctx)) == NULL) |
472 | goto err; | 429 | goto err; |
473 | if ((Z_1 = BN_CTX_get(ctx)) == NULL) | 430 | if ((Z_1 = BN_CTX_get(ctx)) == NULL) |
@@ -552,7 +509,7 @@ ec_GFp_simple_point_get_affine_coordinates(const EC_GROUP *group, const EC_POINT | |||
552 | 509 | ||
553 | err: | 510 | err: |
554 | BN_CTX_end(ctx); | 511 | BN_CTX_end(ctx); |
555 | BN_CTX_free(new_ctx); | 512 | |
556 | return ret; | 513 | return ret; |
557 | } | 514 | } |
558 | 515 | ||
@@ -561,9 +518,8 @@ ec_GFp_simple_add(const EC_GROUP *group, EC_POINT *r, const EC_POINT *a, const E | |||
561 | { | 518 | { |
562 | int (*field_mul) (const EC_GROUP *, BIGNUM *, const BIGNUM *, const BIGNUM *, BN_CTX *); | 519 | int (*field_mul) (const EC_GROUP *, BIGNUM *, const BIGNUM *, const BIGNUM *, BN_CTX *); |
563 | int (*field_sqr) (const EC_GROUP *, BIGNUM *, const BIGNUM *, BN_CTX *); | 520 | int (*field_sqr) (const EC_GROUP *, BIGNUM *, const BIGNUM *, BN_CTX *); |
564 | const BIGNUM *p; | ||
565 | BN_CTX *new_ctx = NULL; | ||
566 | BIGNUM *n0, *n1, *n2, *n3, *n4, *n5, *n6; | 521 | BIGNUM *n0, *n1, *n2, *n3, *n4, *n5, *n6; |
522 | const BIGNUM *p; | ||
567 | int ret = 0; | 523 | int ret = 0; |
568 | 524 | ||
569 | if (a == b) | 525 | if (a == b) |
@@ -577,12 +533,8 @@ ec_GFp_simple_add(const EC_GROUP *group, EC_POINT *r, const EC_POINT *a, const E | |||
577 | field_sqr = group->meth->field_sqr; | 533 | field_sqr = group->meth->field_sqr; |
578 | p = &group->field; | 534 | p = &group->field; |
579 | 535 | ||
580 | if (ctx == NULL) { | ||
581 | ctx = new_ctx = BN_CTX_new(); | ||
582 | if (ctx == NULL) | ||
583 | return 0; | ||
584 | } | ||
585 | BN_CTX_start(ctx); | 536 | BN_CTX_start(ctx); |
537 | |||
586 | if ((n0 = BN_CTX_get(ctx)) == NULL) | 538 | if ((n0 = BN_CTX_get(ctx)) == NULL) |
587 | goto end; | 539 | goto end; |
588 | if ((n1 = BN_CTX_get(ctx)) == NULL) | 540 | if ((n1 = BN_CTX_get(ctx)) == NULL) |
@@ -738,9 +690,8 @@ ec_GFp_simple_add(const EC_GROUP *group, EC_POINT *r, const EC_POINT *a, const E | |||
738 | ret = 1; | 690 | ret = 1; |
739 | 691 | ||
740 | end: | 692 | end: |
741 | if (ctx) /* otherwise we already called BN_CTX_end */ | 693 | BN_CTX_end(ctx); |
742 | BN_CTX_end(ctx); | 694 | |
743 | BN_CTX_free(new_ctx); | ||
744 | return ret; | 695 | return ret; |
745 | } | 696 | } |
746 | 697 | ||
@@ -750,7 +701,6 @@ ec_GFp_simple_dbl(const EC_GROUP *group, EC_POINT *r, const EC_POINT *a, BN_CTX | |||
750 | int (*field_mul) (const EC_GROUP *, BIGNUM *, const BIGNUM *, const BIGNUM *, BN_CTX *); | 701 | int (*field_mul) (const EC_GROUP *, BIGNUM *, const BIGNUM *, const BIGNUM *, BN_CTX *); |
751 | int (*field_sqr) (const EC_GROUP *, BIGNUM *, const BIGNUM *, BN_CTX *); | 702 | int (*field_sqr) (const EC_GROUP *, BIGNUM *, const BIGNUM *, BN_CTX *); |
752 | const BIGNUM *p; | 703 | const BIGNUM *p; |
753 | BN_CTX *new_ctx = NULL; | ||
754 | BIGNUM *n0, *n1, *n2, *n3; | 704 | BIGNUM *n0, *n1, *n2, *n3; |
755 | int ret = 0; | 705 | int ret = 0; |
756 | 706 | ||
@@ -763,12 +713,8 @@ ec_GFp_simple_dbl(const EC_GROUP *group, EC_POINT *r, const EC_POINT *a, BN_CTX | |||
763 | field_sqr = group->meth->field_sqr; | 713 | field_sqr = group->meth->field_sqr; |
764 | p = &group->field; | 714 | p = &group->field; |
765 | 715 | ||
766 | if (ctx == NULL) { | ||
767 | ctx = new_ctx = BN_CTX_new(); | ||
768 | if (ctx == NULL) | ||
769 | return 0; | ||
770 | } | ||
771 | BN_CTX_start(ctx); | 716 | BN_CTX_start(ctx); |
717 | |||
772 | if ((n0 = BN_CTX_get(ctx)) == NULL) | 718 | if ((n0 = BN_CTX_get(ctx)) == NULL) |
773 | goto err; | 719 | goto err; |
774 | if ((n1 = BN_CTX_get(ctx)) == NULL) | 720 | if ((n1 = BN_CTX_get(ctx)) == NULL) |
@@ -881,7 +827,7 @@ ec_GFp_simple_dbl(const EC_GROUP *group, EC_POINT *r, const EC_POINT *a, BN_CTX | |||
881 | 827 | ||
882 | err: | 828 | err: |
883 | BN_CTX_end(ctx); | 829 | BN_CTX_end(ctx); |
884 | BN_CTX_free(new_ctx); | 830 | |
885 | return ret; | 831 | return ret; |
886 | } | 832 | } |
887 | 833 | ||
@@ -907,7 +853,6 @@ ec_GFp_simple_is_on_curve(const EC_GROUP *group, const EC_POINT *point, BN_CTX * | |||
907 | int (*field_mul) (const EC_GROUP *, BIGNUM *, const BIGNUM *, const BIGNUM *, BN_CTX *); | 853 | int (*field_mul) (const EC_GROUP *, BIGNUM *, const BIGNUM *, const BIGNUM *, BN_CTX *); |
908 | int (*field_sqr) (const EC_GROUP *, BIGNUM *, const BIGNUM *, BN_CTX *); | 854 | int (*field_sqr) (const EC_GROUP *, BIGNUM *, const BIGNUM *, BN_CTX *); |
909 | const BIGNUM *p; | 855 | const BIGNUM *p; |
910 | BN_CTX *new_ctx = NULL; | ||
911 | BIGNUM *rh, *tmp, *Z4, *Z6; | 856 | BIGNUM *rh, *tmp, *Z4, *Z6; |
912 | int ret = -1; | 857 | int ret = -1; |
913 | 858 | ||
@@ -918,12 +863,8 @@ ec_GFp_simple_is_on_curve(const EC_GROUP *group, const EC_POINT *point, BN_CTX * | |||
918 | field_sqr = group->meth->field_sqr; | 863 | field_sqr = group->meth->field_sqr; |
919 | p = &group->field; | 864 | p = &group->field; |
920 | 865 | ||
921 | if (ctx == NULL) { | ||
922 | ctx = new_ctx = BN_CTX_new(); | ||
923 | if (ctx == NULL) | ||
924 | return -1; | ||
925 | } | ||
926 | BN_CTX_start(ctx); | 866 | BN_CTX_start(ctx); |
867 | |||
927 | if ((rh = BN_CTX_get(ctx)) == NULL) | 868 | if ((rh = BN_CTX_get(ctx)) == NULL) |
928 | goto err; | 869 | goto err; |
929 | if ((tmp = BN_CTX_get(ctx)) == NULL) | 870 | if ((tmp = BN_CTX_get(ctx)) == NULL) |
@@ -999,7 +940,7 @@ ec_GFp_simple_is_on_curve(const EC_GROUP *group, const EC_POINT *point, BN_CTX * | |||
999 | 940 | ||
1000 | err: | 941 | err: |
1001 | BN_CTX_end(ctx); | 942 | BN_CTX_end(ctx); |
1002 | BN_CTX_free(new_ctx); | 943 | |
1003 | return ret; | 944 | return ret; |
1004 | } | 945 | } |
1005 | 946 | ||
@@ -1013,29 +954,24 @@ ec_GFp_simple_cmp(const EC_GROUP *group, const EC_POINT *a, const EC_POINT *b, B | |||
1013 | 954 | ||
1014 | int (*field_mul) (const EC_GROUP *, BIGNUM *, const BIGNUM *, const BIGNUM *, BN_CTX *); | 955 | int (*field_mul) (const EC_GROUP *, BIGNUM *, const BIGNUM *, const BIGNUM *, BN_CTX *); |
1015 | int (*field_sqr) (const EC_GROUP *, BIGNUM *, const BIGNUM *, BN_CTX *); | 956 | int (*field_sqr) (const EC_GROUP *, BIGNUM *, const BIGNUM *, BN_CTX *); |
1016 | BN_CTX *new_ctx = NULL; | ||
1017 | BIGNUM *tmp1, *tmp2, *Za23, *Zb23; | 957 | BIGNUM *tmp1, *tmp2, *Za23, *Zb23; |
1018 | const BIGNUM *tmp1_, *tmp2_; | 958 | const BIGNUM *tmp1_, *tmp2_; |
1019 | int ret = -1; | 959 | int ret = -1; |
1020 | 960 | ||
1021 | if (EC_POINT_is_at_infinity(group, a) > 0) { | 961 | if (EC_POINT_is_at_infinity(group, a) > 0) |
1022 | return EC_POINT_is_at_infinity(group, b) > 0 ? 0 : 1; | 962 | return EC_POINT_is_at_infinity(group, b) > 0 ? 0 : 1; |
1023 | } | 963 | |
1024 | if (EC_POINT_is_at_infinity(group, b) > 0) | 964 | if (EC_POINT_is_at_infinity(group, b) > 0) |
1025 | return 1; | 965 | return 1; |
1026 | 966 | ||
1027 | if (a->Z_is_one && b->Z_is_one) { | 967 | if (a->Z_is_one && b->Z_is_one) |
1028 | return ((BN_cmp(&a->X, &b->X) == 0) && BN_cmp(&a->Y, &b->Y) == 0) ? 0 : 1; | 968 | return ((BN_cmp(&a->X, &b->X) == 0) && BN_cmp(&a->Y, &b->Y) == 0) ? 0 : 1; |
1029 | } | 969 | |
1030 | field_mul = group->meth->field_mul; | 970 | field_mul = group->meth->field_mul; |
1031 | field_sqr = group->meth->field_sqr; | 971 | field_sqr = group->meth->field_sqr; |
1032 | 972 | ||
1033 | if (ctx == NULL) { | ||
1034 | ctx = new_ctx = BN_CTX_new(); | ||
1035 | if (ctx == NULL) | ||
1036 | return -1; | ||
1037 | } | ||
1038 | BN_CTX_start(ctx); | 973 | BN_CTX_start(ctx); |
974 | |||
1039 | if ((tmp1 = BN_CTX_get(ctx)) == NULL) | 975 | if ((tmp1 = BN_CTX_get(ctx)) == NULL) |
1040 | goto end; | 976 | goto end; |
1041 | if ((tmp2 = BN_CTX_get(ctx)) == NULL) | 977 | if ((tmp2 = BN_CTX_get(ctx)) == NULL) |
@@ -1100,26 +1036,21 @@ ec_GFp_simple_cmp(const EC_GROUP *group, const EC_POINT *a, const EC_POINT *b, B | |||
1100 | 1036 | ||
1101 | end: | 1037 | end: |
1102 | BN_CTX_end(ctx); | 1038 | BN_CTX_end(ctx); |
1103 | BN_CTX_free(new_ctx); | 1039 | |
1104 | return ret; | 1040 | return ret; |
1105 | } | 1041 | } |
1106 | 1042 | ||
1107 | int | 1043 | int |
1108 | ec_GFp_simple_make_affine(const EC_GROUP *group, EC_POINT *point, BN_CTX *ctx) | 1044 | ec_GFp_simple_make_affine(const EC_GROUP *group, EC_POINT *point, BN_CTX *ctx) |
1109 | { | 1045 | { |
1110 | BN_CTX *new_ctx = NULL; | ||
1111 | BIGNUM *x, *y; | 1046 | BIGNUM *x, *y; |
1112 | int ret = 0; | 1047 | int ret = 0; |
1113 | 1048 | ||
1114 | if (point->Z_is_one || EC_POINT_is_at_infinity(group, point) > 0) | 1049 | if (point->Z_is_one || EC_POINT_is_at_infinity(group, point) > 0) |
1115 | return 1; | 1050 | return 1; |
1116 | 1051 | ||
1117 | if (ctx == NULL) { | ||
1118 | ctx = new_ctx = BN_CTX_new(); | ||
1119 | if (ctx == NULL) | ||
1120 | return 0; | ||
1121 | } | ||
1122 | BN_CTX_start(ctx); | 1052 | BN_CTX_start(ctx); |
1053 | |||
1123 | if ((x = BN_CTX_get(ctx)) == NULL) | 1054 | if ((x = BN_CTX_get(ctx)) == NULL) |
1124 | goto err; | 1055 | goto err; |
1125 | if ((y = BN_CTX_get(ctx)) == NULL) | 1056 | if ((y = BN_CTX_get(ctx)) == NULL) |
@@ -1137,14 +1068,13 @@ ec_GFp_simple_make_affine(const EC_GROUP *group, EC_POINT *point, BN_CTX *ctx) | |||
1137 | 1068 | ||
1138 | err: | 1069 | err: |
1139 | BN_CTX_end(ctx); | 1070 | BN_CTX_end(ctx); |
1140 | BN_CTX_free(new_ctx); | 1071 | |
1141 | return ret; | 1072 | return ret; |
1142 | } | 1073 | } |
1143 | 1074 | ||
1144 | int | 1075 | int |
1145 | ec_GFp_simple_points_make_affine(const EC_GROUP *group, size_t num, EC_POINT *points[], BN_CTX *ctx) | 1076 | ec_GFp_simple_points_make_affine(const EC_GROUP *group, size_t num, EC_POINT *points[], BN_CTX *ctx) |
1146 | { | 1077 | { |
1147 | BN_CTX *new_ctx = NULL; | ||
1148 | BIGNUM *tmp0, *tmp1; | 1078 | BIGNUM *tmp0, *tmp1; |
1149 | size_t pow2 = 0; | 1079 | size_t pow2 = 0; |
1150 | BIGNUM **heap = NULL; | 1080 | BIGNUM **heap = NULL; |
@@ -1154,12 +1084,8 @@ ec_GFp_simple_points_make_affine(const EC_GROUP *group, size_t num, EC_POINT *po | |||
1154 | if (num == 0) | 1084 | if (num == 0) |
1155 | return 1; | 1085 | return 1; |
1156 | 1086 | ||
1157 | if (ctx == NULL) { | ||
1158 | ctx = new_ctx = BN_CTX_new(); | ||
1159 | if (ctx == NULL) | ||
1160 | return 0; | ||
1161 | } | ||
1162 | BN_CTX_start(ctx); | 1087 | BN_CTX_start(ctx); |
1088 | |||
1163 | if ((tmp0 = BN_CTX_get(ctx)) == NULL) | 1089 | if ((tmp0 = BN_CTX_get(ctx)) == NULL) |
1164 | goto err; | 1090 | goto err; |
1165 | if ((tmp1 = BN_CTX_get(ctx)) == NULL) | 1091 | if ((tmp1 = BN_CTX_get(ctx)) == NULL) |
@@ -1301,7 +1227,7 @@ ec_GFp_simple_points_make_affine(const EC_GROUP *group, size_t num, EC_POINT *po | |||
1301 | 1227 | ||
1302 | err: | 1228 | err: |
1303 | BN_CTX_end(ctx); | 1229 | BN_CTX_end(ctx); |
1304 | BN_CTX_free(new_ctx); | 1230 | |
1305 | if (heap != NULL) { | 1231 | if (heap != NULL) { |
1306 | /* | 1232 | /* |
1307 | * heap[pow2/2] .. heap[pow2-1] have not been allocated | 1233 | * heap[pow2/2] .. heap[pow2-1] have not been allocated |
@@ -1431,12 +1357,8 @@ ec_GFp_simple_mul_ct(const EC_GROUP *group, EC_POINT *r, const BIGNUM *scalar, | |||
1431 | BIGNUM *k = NULL; | 1357 | BIGNUM *k = NULL; |
1432 | BIGNUM *lambda = NULL; | 1358 | BIGNUM *lambda = NULL; |
1433 | BIGNUM *cardinality = NULL; | 1359 | BIGNUM *cardinality = NULL; |
1434 | BN_CTX *new_ctx = NULL; | ||
1435 | int ret = 0; | 1360 | int ret = 0; |
1436 | 1361 | ||
1437 | if (ctx == NULL && (ctx = new_ctx = BN_CTX_new()) == NULL) | ||
1438 | return 0; | ||
1439 | |||
1440 | BN_CTX_start(ctx); | 1362 | BN_CTX_start(ctx); |
1441 | 1363 | ||
1442 | if ((s = EC_POINT_new(group)) == NULL) | 1364 | if ((s = EC_POINT_new(group)) == NULL) |
@@ -1605,9 +1527,7 @@ ec_GFp_simple_mul_ct(const EC_GROUP *group, EC_POINT *r, const BIGNUM *scalar, | |||
1605 | 1527 | ||
1606 | err: | 1528 | err: |
1607 | EC_POINT_free(s); | 1529 | EC_POINT_free(s); |
1608 | if (ctx != NULL) | 1530 | BN_CTX_end(ctx); |
1609 | BN_CTX_end(ctx); | ||
1610 | BN_CTX_free(new_ctx); | ||
1611 | 1531 | ||
1612 | return ret; | 1532 | return ret; |
1613 | } | 1533 | } |