diff options
Diffstat (limited to 'src/lib/libcrypto/ec/ec2_smpl.c')
| -rw-r--r-- | src/lib/libcrypto/ec/ec2_smpl.c | 78 |
1 files changed, 25 insertions, 53 deletions
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 | ||
