diff options
author | jsing <> | 2022-11-09 18:25:36 +0000 |
---|---|---|
committer | jsing <> | 2022-11-09 18:25:36 +0000 |
commit | 044d4caaeb509d391d3759f42b99126ff90e4e09 (patch) | |
tree | 6b40c224651c532c6e12fa4ed610f88afacceba2 | |
parent | d43c65a247b804bf29ddd3fbb217000c30629dea (diff) | |
download | openbsd-044d4caaeb509d391d3759f42b99126ff90e4e09.tar.gz openbsd-044d4caaeb509d391d3759f42b99126ff90e4e09.tar.bz2 openbsd-044d4caaeb509d391d3759f42b99126ff90e4e09.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@
-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 | ||