diff options
| author | jsing <> | 2022-11-09 18:25:36 +0000 |
|---|---|---|
| committer | jsing <> | 2022-11-09 18:25:36 +0000 |
| commit | 14a7ab4e78d4353cba92abb498095285392b6c5f (patch) | |
| tree | 6b40c224651c532c6e12fa4ed610f88afacceba2 /src | |
| parent | 7cbad7d3dd80fdd1276c8da7015092fdae0055f2 (diff) | |
| download | openbsd-14a7ab4e78d4353cba92abb498095285392b6c5f.tar.gz openbsd-14a7ab4e78d4353cba92abb498095285392b6c5f.tar.bz2 openbsd-14a7ab4e78d4353cba92abb498095285392b6c5f.zip | |
Clean up EVP_PKEY_METHOD related tables and code.
This is effectively the same as done for EVP_PKEY_ASN1_METHOD, although
this table only has nine entries.
ok tb@
Diffstat (limited to 'src')
| -rw-r--r-- | src/lib/libcrypto/evp/pmeth_lib.c | 97 |
1 files changed, 41 insertions, 56 deletions
diff --git a/src/lib/libcrypto/evp/pmeth_lib.c b/src/lib/libcrypto/evp/pmeth_lib.c index 5c354d5c23..0a0451fd92 100644 --- a/src/lib/libcrypto/evp/pmeth_lib.c +++ b/src/lib/libcrypto/evp/pmeth_lib.c | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | /* $OpenBSD: pmeth_lib.c,v 1.23 2022/11/09 17:03:53 jsing Exp $ */ | 1 | /* $OpenBSD: pmeth_lib.c,v 1.24 2022/11/09 18:25:36 jsing Exp $ */ |
| 2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL | 2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL |
| 3 | * project 2006. | 3 | * project 2006. |
| 4 | */ | 4 | */ |
| @@ -75,10 +75,8 @@ | |||
| 75 | #include "asn1_locl.h" | 75 | #include "asn1_locl.h" |
| 76 | #include "evp_locl.h" | 76 | #include "evp_locl.h" |
| 77 | 77 | ||
| 78 | typedef int sk_cmp_fn_type(const char * const *a, const char * const *b); | ||
| 79 | |||
| 80 | DECLARE_STACK_OF(EVP_PKEY_METHOD) | 78 | DECLARE_STACK_OF(EVP_PKEY_METHOD) |
| 81 | STACK_OF(EVP_PKEY_METHOD) *app_pkey_methods = NULL; | 79 | STACK_OF(EVP_PKEY_METHOD) *pkey_app_methods = NULL; |
| 82 | 80 | ||
| 83 | extern const EVP_PKEY_METHOD cmac_pkey_meth; | 81 | extern const EVP_PKEY_METHOD cmac_pkey_meth; |
| 84 | extern const EVP_PKEY_METHOD dh_pkey_meth; | 82 | extern const EVP_PKEY_METHOD dh_pkey_meth; |
| @@ -91,75 +89,61 @@ extern const EVP_PKEY_METHOD hmac_pkey_meth; | |||
| 91 | extern const EVP_PKEY_METHOD rsa_pkey_meth; | 89 | extern const EVP_PKEY_METHOD rsa_pkey_meth; |
| 92 | extern const EVP_PKEY_METHOD rsa_pss_pkey_meth; | 90 | extern const EVP_PKEY_METHOD rsa_pss_pkey_meth; |
| 93 | 91 | ||
| 94 | static const EVP_PKEY_METHOD *standard_methods[] = { | 92 | static const EVP_PKEY_METHOD *pkey_methods[] = { |
| 95 | #ifndef OPENSSL_NO_RSA | 93 | &cmac_pkey_meth, |
| 96 | &rsa_pkey_meth, | ||
| 97 | #endif | ||
| 98 | #ifndef OPENSSL_NO_DH | ||
| 99 | &dh_pkey_meth, | 94 | &dh_pkey_meth, |
| 100 | #endif | ||
| 101 | #ifndef OPENSSL_NO_DSA | ||
| 102 | &dsa_pkey_meth, | 95 | &dsa_pkey_meth, |
| 103 | #endif | ||
| 104 | #ifndef OPENSSL_NO_EC | ||
| 105 | &ec_pkey_meth, | 96 | &ec_pkey_meth, |
| 106 | #endif | ||
| 107 | #ifndef OPENSSL_NO_GOST | ||
| 108 | &gostr01_pkey_meth, | ||
| 109 | &gostimit_pkey_meth, | 97 | &gostimit_pkey_meth, |
| 110 | #endif | 98 | &gostr01_pkey_meth, |
| 99 | &hkdf_pkey_meth, | ||
| 111 | &hmac_pkey_meth, | 100 | &hmac_pkey_meth, |
| 112 | &cmac_pkey_meth, | 101 | &rsa_pkey_meth, |
| 113 | #ifndef OPENSSL_NO_RSA | ||
| 114 | &rsa_pss_pkey_meth, | 102 | &rsa_pss_pkey_meth, |
| 115 | #endif | ||
| 116 | &hkdf_pkey_meth, | ||
| 117 | }; | 103 | }; |
| 118 | 104 | ||
| 119 | static int pmeth_cmp_BSEARCH_CMP_FN(const void *, const void *); | 105 | static const size_t pkey_methods_count = |
| 120 | static int pmeth_cmp(const EVP_PKEY_METHOD * const *, const EVP_PKEY_METHOD * const *); | 106 | sizeof(pkey_methods) / sizeof(pkey_methods[0]); |
| 121 | static const EVP_PKEY_METHOD * *OBJ_bsearch_pmeth(const EVP_PKEY_METHOD * *key, const EVP_PKEY_METHOD * const *base, int num); | ||
| 122 | 107 | ||
| 123 | static int | 108 | int |
| 124 | pmeth_cmp(const EVP_PKEY_METHOD * const *a, const EVP_PKEY_METHOD * const *b) | 109 | evp_pkey_meth_get_count(void) |
| 125 | { | 110 | { |
| 126 | return ((*a)->pkey_id - (*b)->pkey_id); | 111 | int num = pkey_methods_count; |
| 127 | } | ||
| 128 | 112 | ||
| 113 | if (pkey_app_methods != NULL) | ||
| 114 | num += sk_EVP_PKEY_METHOD_num(pkey_app_methods); | ||
| 129 | 115 | ||
| 130 | static int | 116 | return num; |
| 131 | pmeth_cmp_BSEARCH_CMP_FN(const void *a_, const void *b_) | ||
| 132 | { | ||
| 133 | const EVP_PKEY_METHOD * const *a = a_; | ||
| 134 | const EVP_PKEY_METHOD * const *b = b_; | ||
| 135 | return pmeth_cmp(a, b); | ||
| 136 | } | 117 | } |
| 137 | 118 | ||
| 138 | static const EVP_PKEY_METHOD * * | 119 | const EVP_PKEY_METHOD * |
| 139 | OBJ_bsearch_pmeth(const EVP_PKEY_METHOD * *key, const EVP_PKEY_METHOD * const *base, int num) | 120 | evp_pkey_meth_get0(int idx) |
| 140 | { | 121 | { |
| 141 | return (const EVP_PKEY_METHOD * *)OBJ_bsearch_(key, base, num, sizeof(const EVP_PKEY_METHOD *), | 122 | int num = pkey_methods_count; |
| 142 | pmeth_cmp_BSEARCH_CMP_FN); | 123 | |
| 124 | if (idx < 0) | ||
| 125 | return NULL; | ||
| 126 | if (idx < num) | ||
| 127 | return pkey_methods[idx]; | ||
| 128 | |||
| 129 | idx -= num; | ||
| 130 | |||
| 131 | return sk_EVP_PKEY_METHOD_value(pkey_app_methods, idx); | ||
| 143 | } | 132 | } |
| 144 | 133 | ||
| 145 | const EVP_PKEY_METHOD * | 134 | const EVP_PKEY_METHOD * |
| 146 | EVP_PKEY_meth_find(int type) | 135 | EVP_PKEY_meth_find(int type) |
| 147 | { | 136 | { |
| 148 | EVP_PKEY_METHOD tmp; | 137 | const EVP_PKEY_METHOD *pmeth; |
| 149 | const EVP_PKEY_METHOD *t = &tmp, **ret; | 138 | int i; |
| 150 | 139 | ||
| 151 | tmp.pkey_id = type; | 140 | for (i = evp_pkey_meth_get_count() - 1; i >= 0; i--) { |
| 152 | if (app_pkey_methods) { | 141 | pmeth = evp_pkey_meth_get0(i); |
| 153 | int idx; | 142 | if (pmeth->pkey_id == type) |
| 154 | idx = sk_EVP_PKEY_METHOD_find(app_pkey_methods, &tmp); | 143 | return pmeth; |
| 155 | if (idx >= 0) | ||
| 156 | return sk_EVP_PKEY_METHOD_value(app_pkey_methods, idx); | ||
| 157 | } | 144 | } |
| 158 | ret = OBJ_bsearch_pmeth(&t, standard_methods, | 145 | |
| 159 | sizeof(standard_methods)/sizeof(EVP_PKEY_METHOD *)); | 146 | return NULL; |
| 160 | if (!ret || !*ret) | ||
| 161 | return NULL; | ||
| 162 | return *ret; | ||
| 163 | } | 147 | } |
| 164 | 148 | ||
| 165 | static EVP_PKEY_CTX * | 149 | static EVP_PKEY_CTX * |
| @@ -331,14 +315,15 @@ EVP_PKEY_CTX_dup(EVP_PKEY_CTX *pctx) | |||
| 331 | int | 315 | int |
| 332 | EVP_PKEY_meth_add0(const EVP_PKEY_METHOD *pmeth) | 316 | EVP_PKEY_meth_add0(const EVP_PKEY_METHOD *pmeth) |
| 333 | { | 317 | { |
| 334 | if (app_pkey_methods == NULL) { | 318 | if (pkey_app_methods == NULL) { |
| 335 | app_pkey_methods = sk_EVP_PKEY_METHOD_new(pmeth_cmp); | 319 | pkey_app_methods = sk_EVP_PKEY_METHOD_new(NULL); |
| 336 | if (!app_pkey_methods) | 320 | if (pkey_app_methods == NULL) |
| 337 | return 0; | 321 | return 0; |
| 338 | } | 322 | } |
| 339 | if (!sk_EVP_PKEY_METHOD_push(app_pkey_methods, pmeth)) | 323 | |
| 324 | if (!sk_EVP_PKEY_METHOD_push(pkey_app_methods, pmeth)) | ||
| 340 | return 0; | 325 | return 0; |
| 341 | sk_EVP_PKEY_METHOD_sort(app_pkey_methods); | 326 | |
| 342 | return 1; | 327 | return 1; |
| 343 | } | 328 | } |
| 344 | 329 | ||
