diff options
| author | tb <> | 2023-06-25 18:52:27 +0000 |
|---|---|---|
| committer | tb <> | 2023-06-25 18:52:27 +0000 |
| commit | b60bbdf8219ec24f77b8e7e83287a5eaab014cc3 (patch) | |
| tree | 0df2834b9d3887c87ec022222f74c206da81e21c | |
| parent | 85f78eb5e708f88227cbc815f99624d39cdfada5 (diff) | |
| download | openbsd-b60bbdf8219ec24f77b8e7e83287a5eaab014cc3.tar.gz openbsd-b60bbdf8219ec24f77b8e7e83287a5eaab014cc3.tar.bz2 openbsd-b60bbdf8219ec24f77b8e7e83287a5eaab014cc3.zip | |
Remove EC_EXTRA_DATA
With the ecdh_check() and ecdsa_check() abominations gone, we can finally
get rid of EC_EXTRA_DATA and EC_KEY_{get,insert}_key_method_data(). The
EC_EX_DATA_*() handlers, (which fortunately have always had "'package'
level visibility") join the ride to the great bit bucket in the sky.
Thanks to op for making this possible.
ok jsing
| -rw-r--r-- | src/lib/libcrypto/ec/ec_key.c | 50 | ||||
| -rw-r--r-- | src/lib/libcrypto/ec/ec_kmeth.c | 3 | ||||
| -rw-r--r-- | src/lib/libcrypto/ec/ec_lib.c | 154 | ||||
| -rw-r--r-- | src/lib/libcrypto/ec/ec_local.h | 27 |
4 files changed, 4 insertions, 230 deletions
diff --git a/src/lib/libcrypto/ec/ec_key.c b/src/lib/libcrypto/ec/ec_key.c index 2f9f05cc56..4127352523 100644 --- a/src/lib/libcrypto/ec/ec_key.c +++ b/src/lib/libcrypto/ec/ec_key.c | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | /* $OpenBSD: ec_key.c,v 1.32 2023/03/27 10:25:02 tb Exp $ */ | 1 | /* $OpenBSD: ec_key.c,v 1.33 2023/06/25 18:52:27 tb Exp $ */ |
| 2 | /* | 2 | /* |
| 3 | * Written by Nils Larsch for the OpenSSL project. | 3 | * Written by Nils Larsch for the OpenSSL project. |
| 4 | */ | 4 | */ |
| @@ -122,16 +122,12 @@ EC_KEY_free(EC_KEY *r) | |||
| 122 | EC_POINT_free(r->pub_key); | 122 | EC_POINT_free(r->pub_key); |
| 123 | BN_free(r->priv_key); | 123 | BN_free(r->priv_key); |
| 124 | 124 | ||
| 125 | EC_EX_DATA_free_all_data(&r->method_data); | ||
| 126 | |||
| 127 | freezero(r, sizeof(EC_KEY)); | 125 | freezero(r, sizeof(EC_KEY)); |
| 128 | } | 126 | } |
| 129 | 127 | ||
| 130 | EC_KEY * | 128 | EC_KEY * |
| 131 | EC_KEY_copy(EC_KEY *dest, const EC_KEY *src) | 129 | EC_KEY_copy(EC_KEY *dest, const EC_KEY *src) |
| 132 | { | 130 | { |
| 133 | EC_EXTRA_DATA *d; | ||
| 134 | |||
| 135 | if (dest == NULL || src == NULL) { | 131 | if (dest == NULL || src == NULL) { |
| 136 | ECerror(ERR_R_PASSED_NULL_PARAMETER); | 132 | ECerror(ERR_R_PASSED_NULL_PARAMETER); |
| 137 | return NULL; | 133 | return NULL; |
| @@ -175,18 +171,6 @@ EC_KEY_copy(EC_KEY *dest, const EC_KEY *src) | |||
| 175 | if (!bn_copy(dest->priv_key, src->priv_key)) | 171 | if (!bn_copy(dest->priv_key, src->priv_key)) |
| 176 | return NULL; | 172 | return NULL; |
| 177 | } | 173 | } |
| 178 | /* copy method/extra data */ | ||
| 179 | EC_EX_DATA_free_all_data(&dest->method_data); | ||
| 180 | |||
| 181 | for (d = src->method_data; d != NULL; d = d->next) { | ||
| 182 | void *t = d->dup_func(d->data); | ||
| 183 | |||
| 184 | if (t == NULL) | ||
| 185 | return 0; | ||
| 186 | if (!EC_EX_DATA_set_data(&dest->method_data, t, d->dup_func, | ||
| 187 | d->free_func, d->clear_free_func)) | ||
| 188 | return 0; | ||
| 189 | } | ||
| 190 | 174 | ||
| 191 | /* copy the rest */ | 175 | /* copy the rest */ |
| 192 | dest->enc_flag = src->enc_flag; | 176 | dest->enc_flag = src->enc_flag; |
| @@ -526,38 +510,6 @@ EC_KEY_set_conv_form(EC_KEY *key, point_conversion_form_t cform) | |||
| 526 | EC_GROUP_set_point_conversion_form(key->group, cform); | 510 | EC_GROUP_set_point_conversion_form(key->group, cform); |
| 527 | } | 511 | } |
| 528 | 512 | ||
| 529 | void * | ||
| 530 | EC_KEY_get_key_method_data(EC_KEY *key, | ||
| 531 | void *(*dup_func) (void *), | ||
| 532 | void (*free_func) (void *), | ||
| 533 | void (*clear_free_func) (void *)) | ||
| 534 | { | ||
| 535 | void *ret; | ||
| 536 | |||
| 537 | CRYPTO_r_lock(CRYPTO_LOCK_EC); | ||
| 538 | ret = EC_EX_DATA_get_data(key->method_data, dup_func, free_func, clear_free_func); | ||
| 539 | CRYPTO_r_unlock(CRYPTO_LOCK_EC); | ||
| 540 | |||
| 541 | return ret; | ||
| 542 | } | ||
| 543 | |||
| 544 | void * | ||
| 545 | EC_KEY_insert_key_method_data(EC_KEY *key, void *data, | ||
| 546 | void *(*dup_func) (void *), | ||
| 547 | void (*free_func) (void *), | ||
| 548 | void (*clear_free_func) (void *)) | ||
| 549 | { | ||
| 550 | EC_EXTRA_DATA *ex_data; | ||
| 551 | |||
| 552 | CRYPTO_w_lock(CRYPTO_LOCK_EC); | ||
| 553 | ex_data = EC_EX_DATA_get_data(key->method_data, dup_func, free_func, clear_free_func); | ||
| 554 | if (ex_data == NULL) | ||
| 555 | EC_EX_DATA_set_data(&key->method_data, data, dup_func, free_func, clear_free_func); | ||
| 556 | CRYPTO_w_unlock(CRYPTO_LOCK_EC); | ||
| 557 | |||
| 558 | return ex_data; | ||
| 559 | } | ||
| 560 | |||
| 561 | void | 513 | void |
| 562 | EC_KEY_set_asn1_flag(EC_KEY *key, int flag) | 514 | EC_KEY_set_asn1_flag(EC_KEY *key, int flag) |
| 563 | { | 515 | { |
diff --git a/src/lib/libcrypto/ec/ec_kmeth.c b/src/lib/libcrypto/ec/ec_kmeth.c index 56fb437093..4e296cfa68 100644 --- a/src/lib/libcrypto/ec/ec_kmeth.c +++ b/src/lib/libcrypto/ec/ec_kmeth.c | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | /* $OpenBSD: ec_kmeth.c,v 1.7 2022/11/26 16:08:52 tb Exp $ */ | 1 | /* $OpenBSD: ec_kmeth.c,v 1.8 2023/06/25 18:52:27 tb Exp $ */ |
| 2 | /* | 2 | /* |
| 3 | * Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL | 3 | * Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL |
| 4 | * project. | 4 | * project. |
| @@ -168,7 +168,6 @@ EC_KEY_new_method(ENGINE *engine) | |||
| 168 | ret->enc_flag = 0; | 168 | ret->enc_flag = 0; |
| 169 | ret->conv_form = POINT_CONVERSION_UNCOMPRESSED; | 169 | ret->conv_form = POINT_CONVERSION_UNCOMPRESSED; |
| 170 | ret->references = 1; | 170 | ret->references = 1; |
| 171 | ret->method_data = NULL; | ||
| 172 | 171 | ||
| 173 | if (!CRYPTO_new_ex_data(CRYPTO_EX_INDEX_RSA, ret, &ret->ex_data)) | 172 | if (!CRYPTO_new_ex_data(CRYPTO_EX_INDEX_RSA, ret, &ret->ex_data)) |
| 174 | goto err; | 173 | goto err; |
diff --git a/src/lib/libcrypto/ec/ec_lib.c b/src/lib/libcrypto/ec/ec_lib.c index cb581f6e1c..2e180e9661 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.60 2023/06/24 18:21:07 jsing Exp $ */ | 1 | /* $OpenBSD: ec_lib.c,v 1.61 2023/06/25 18:52:27 tb 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 | */ |
| @@ -651,158 +651,6 @@ ec_point_blind_coordinates(const EC_GROUP *group, EC_POINT *p, BN_CTX *ctx) | |||
| 651 | return group->meth->blind_coordinates(group, p, ctx); | 651 | return group->meth->blind_coordinates(group, p, ctx); |
| 652 | } | 652 | } |
| 653 | 653 | ||
| 654 | /* this has 'package' visibility */ | ||
| 655 | int | ||
| 656 | EC_EX_DATA_set_data(EC_EXTRA_DATA ** ex_data, void *data, | ||
| 657 | void *(*dup_func) (void *), | ||
| 658 | void (*free_func) (void *), | ||
| 659 | void (*clear_free_func) (void *)) | ||
| 660 | { | ||
| 661 | EC_EXTRA_DATA *d; | ||
| 662 | |||
| 663 | if (ex_data == NULL) | ||
| 664 | return 0; | ||
| 665 | |||
| 666 | for (d = *ex_data; d != NULL; d = d->next) { | ||
| 667 | if (d->dup_func == dup_func && d->free_func == free_func && | ||
| 668 | d->clear_free_func == clear_free_func) { | ||
| 669 | ECerror(EC_R_SLOT_FULL); | ||
| 670 | return 0; | ||
| 671 | } | ||
| 672 | } | ||
| 673 | |||
| 674 | if (data == NULL) | ||
| 675 | /* no explicit entry needed */ | ||
| 676 | return 1; | ||
| 677 | |||
| 678 | d = malloc(sizeof *d); | ||
| 679 | if (d == NULL) | ||
| 680 | return 0; | ||
| 681 | |||
| 682 | d->data = data; | ||
| 683 | d->dup_func = dup_func; | ||
| 684 | d->free_func = free_func; | ||
| 685 | d->clear_free_func = clear_free_func; | ||
| 686 | |||
| 687 | d->next = *ex_data; | ||
| 688 | *ex_data = d; | ||
| 689 | |||
| 690 | return 1; | ||
| 691 | } | ||
| 692 | |||
| 693 | /* this has 'package' visibility */ | ||
| 694 | void * | ||
| 695 | EC_EX_DATA_get_data(const EC_EXTRA_DATA *ex_data, | ||
| 696 | void *(*dup_func) (void *), | ||
| 697 | void (*free_func) (void *), | ||
| 698 | void (*clear_free_func) (void *)) | ||
| 699 | { | ||
| 700 | const EC_EXTRA_DATA *d; | ||
| 701 | |||
| 702 | for (d = ex_data; d != NULL; d = d->next) { | ||
| 703 | if (d->dup_func == dup_func && d->free_func == free_func && d->clear_free_func == clear_free_func) | ||
| 704 | return d->data; | ||
| 705 | } | ||
| 706 | |||
| 707 | return NULL; | ||
| 708 | } | ||
| 709 | |||
| 710 | /* this has 'package' visibility */ | ||
| 711 | void | ||
| 712 | EC_EX_DATA_free_data(EC_EXTRA_DATA ** ex_data, | ||
| 713 | void *(*dup_func) (void *), | ||
| 714 | void (*free_func) (void *), | ||
| 715 | void (*clear_free_func) (void *)) | ||
| 716 | { | ||
| 717 | EC_EXTRA_DATA **p; | ||
| 718 | |||
| 719 | if (ex_data == NULL) | ||
| 720 | return; | ||
| 721 | |||
| 722 | for (p = ex_data; *p != NULL; p = &((*p)->next)) { | ||
| 723 | if ((*p)->dup_func == dup_func && | ||
| 724 | (*p)->free_func == free_func && | ||
| 725 | (*p)->clear_free_func == clear_free_func) { | ||
| 726 | EC_EXTRA_DATA *next = (*p)->next; | ||
| 727 | |||
| 728 | (*p)->free_func((*p)->data); | ||
| 729 | free(*p); | ||
| 730 | |||
| 731 | *p = next; | ||
| 732 | return; | ||
| 733 | } | ||
| 734 | } | ||
| 735 | } | ||
| 736 | |||
| 737 | /* this has 'package' visibility */ | ||
| 738 | void | ||
| 739 | EC_EX_DATA_clear_free_data(EC_EXTRA_DATA ** ex_data, | ||
| 740 | void *(*dup_func) (void *), | ||
| 741 | void (*free_func) (void *), | ||
| 742 | void (*clear_free_func) (void *)) | ||
| 743 | { | ||
| 744 | EC_EXTRA_DATA **p; | ||
| 745 | |||
| 746 | if (ex_data == NULL) | ||
| 747 | return; | ||
| 748 | |||
| 749 | for (p = ex_data; *p != NULL; p = &((*p)->next)) { | ||
| 750 | if ((*p)->dup_func == dup_func && | ||
| 751 | (*p)->free_func == free_func && | ||
| 752 | (*p)->clear_free_func == clear_free_func) { | ||
| 753 | EC_EXTRA_DATA *next = (*p)->next; | ||
| 754 | |||
| 755 | (*p)->clear_free_func((*p)->data); | ||
| 756 | free(*p); | ||
| 757 | |||
| 758 | *p = next; | ||
| 759 | return; | ||
| 760 | } | ||
| 761 | } | ||
| 762 | } | ||
| 763 | |||
| 764 | /* this has 'package' visibility */ | ||
| 765 | void | ||
| 766 | EC_EX_DATA_free_all_data(EC_EXTRA_DATA ** ex_data) | ||
| 767 | { | ||
| 768 | EC_EXTRA_DATA *d; | ||
| 769 | |||
| 770 | if (ex_data == NULL) | ||
| 771 | return; | ||
| 772 | |||
| 773 | d = *ex_data; | ||
| 774 | while (d) { | ||
| 775 | EC_EXTRA_DATA *next = d->next; | ||
| 776 | |||
| 777 | d->free_func(d->data); | ||
| 778 | free(d); | ||
| 779 | |||
| 780 | d = next; | ||
| 781 | } | ||
| 782 | *ex_data = NULL; | ||
| 783 | } | ||
| 784 | |||
| 785 | /* this has 'package' visibility */ | ||
| 786 | void | ||
| 787 | EC_EX_DATA_clear_free_all_data(EC_EXTRA_DATA ** ex_data) | ||
| 788 | { | ||
| 789 | EC_EXTRA_DATA *d; | ||
| 790 | |||
| 791 | if (ex_data == NULL) | ||
| 792 | return; | ||
| 793 | |||
| 794 | d = *ex_data; | ||
| 795 | while (d) { | ||
| 796 | EC_EXTRA_DATA *next = d->next; | ||
| 797 | |||
| 798 | d->clear_free_func(d->data); | ||
| 799 | free(d); | ||
| 800 | |||
| 801 | d = next; | ||
| 802 | } | ||
| 803 | *ex_data = NULL; | ||
| 804 | } | ||
| 805 | |||
| 806 | EC_POINT * | 654 | EC_POINT * |
| 807 | EC_POINT_new(const EC_GROUP *group) | 655 | EC_POINT_new(const EC_GROUP *group) |
| 808 | { | 656 | { |
diff --git a/src/lib/libcrypto/ec/ec_local.h b/src/lib/libcrypto/ec/ec_local.h index eb0d6a82a6..6913cb5683 100644 --- a/src/lib/libcrypto/ec/ec_local.h +++ b/src/lib/libcrypto/ec/ec_local.h | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | /* $OpenBSD: ec_local.h,v 1.18 2023/06/25 07:50:37 tb Exp $ */ | 1 | /* $OpenBSD: ec_local.h,v 1.19 2023/06/25 18:52:27 tb 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 | */ |
| @@ -173,14 +173,6 @@ struct ec_method_st { | |||
| 173 | BN_CTX *ctx); | 173 | BN_CTX *ctx); |
| 174 | } /* EC_METHOD */; | 174 | } /* EC_METHOD */; |
| 175 | 175 | ||
| 176 | typedef struct ec_extra_data_st { | ||
| 177 | struct ec_extra_data_st *next; | ||
| 178 | void *data; | ||
| 179 | void *(*dup_func)(void *); | ||
| 180 | void (*free_func)(void *); | ||
| 181 | void (*clear_free_func)(void *); | ||
| 182 | } EC_EXTRA_DATA; /* used in EC_GROUP */ | ||
| 183 | |||
| 184 | struct ec_group_st { | 176 | struct ec_group_st { |
| 185 | /* | 177 | /* |
| 186 | * Methods and members exposed via the public API. | 178 | * Methods and members exposed via the public API. |
| @@ -260,26 +252,9 @@ struct ec_key_st { | |||
| 260 | int references; | 252 | int references; |
| 261 | int flags; | 253 | int flags; |
| 262 | 254 | ||
| 263 | EC_EXTRA_DATA *method_data; | ||
| 264 | CRYPTO_EX_DATA ex_data; | 255 | CRYPTO_EX_DATA ex_data; |
| 265 | } /* EC_KEY */; | 256 | } /* EC_KEY */; |
| 266 | 257 | ||
| 267 | /* Basically a 'mixin' for extra data, but available for EC_GROUPs/EC_KEYs only | ||
| 268 | * (with visibility limited to 'package' level for now). | ||
| 269 | * We use the function pointers as index for retrieval; this obviates | ||
| 270 | * global ex_data-style index tables. | ||
| 271 | */ | ||
| 272 | int EC_EX_DATA_set_data(EC_EXTRA_DATA **, void *data, | ||
| 273 | void *(*dup_func)(void *), void (*free_func)(void *), void (*clear_free_func)(void *)); | ||
| 274 | void *EC_EX_DATA_get_data(const EC_EXTRA_DATA *, | ||
| 275 | void *(*dup_func)(void *), void (*free_func)(void *), void (*clear_free_func)(void *)); | ||
| 276 | void EC_EX_DATA_free_data(EC_EXTRA_DATA **, | ||
| 277 | void *(*dup_func)(void *), void (*free_func)(void *), void (*clear_free_func)(void *)); | ||
| 278 | void EC_EX_DATA_clear_free_data(EC_EXTRA_DATA **, | ||
| 279 | void *(*dup_func)(void *), void (*free_func)(void *), void (*clear_free_func)(void *)); | ||
| 280 | void EC_EX_DATA_free_all_data(EC_EXTRA_DATA **); | ||
| 281 | void EC_EX_DATA_clear_free_all_data(EC_EXTRA_DATA **); | ||
| 282 | |||
| 283 | struct ec_point_st { | 258 | struct ec_point_st { |
| 284 | const EC_METHOD *meth; | 259 | const EC_METHOD *meth; |
| 285 | 260 | ||
