summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjsing <>2022-11-09 18:25:36 +0000
committerjsing <>2022-11-09 18:25:36 +0000
commit044d4caaeb509d391d3759f42b99126ff90e4e09 (patch)
tree6b40c224651c532c6e12fa4ed610f88afacceba2
parentd43c65a247b804bf29ddd3fbb217000c30629dea (diff)
downloadopenbsd-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.c97
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
78typedef int sk_cmp_fn_type(const char * const *a, const char * const *b);
79
80DECLARE_STACK_OF(EVP_PKEY_METHOD) 78DECLARE_STACK_OF(EVP_PKEY_METHOD)
81STACK_OF(EVP_PKEY_METHOD) *app_pkey_methods = NULL; 79STACK_OF(EVP_PKEY_METHOD) *pkey_app_methods = NULL;
82 80
83extern const EVP_PKEY_METHOD cmac_pkey_meth; 81extern const EVP_PKEY_METHOD cmac_pkey_meth;
84extern const EVP_PKEY_METHOD dh_pkey_meth; 82extern const EVP_PKEY_METHOD dh_pkey_meth;
@@ -91,75 +89,61 @@ extern const EVP_PKEY_METHOD hmac_pkey_meth;
91extern const EVP_PKEY_METHOD rsa_pkey_meth; 89extern const EVP_PKEY_METHOD rsa_pkey_meth;
92extern const EVP_PKEY_METHOD rsa_pss_pkey_meth; 90extern const EVP_PKEY_METHOD rsa_pss_pkey_meth;
93 91
94static const EVP_PKEY_METHOD *standard_methods[] = { 92static 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
119static int pmeth_cmp_BSEARCH_CMP_FN(const void *, const void *); 105static const size_t pkey_methods_count =
120static int pmeth_cmp(const EVP_PKEY_METHOD * const *, const EVP_PKEY_METHOD * const *); 106 sizeof(pkey_methods) / sizeof(pkey_methods[0]);
121static const EVP_PKEY_METHOD * *OBJ_bsearch_pmeth(const EVP_PKEY_METHOD * *key, const EVP_PKEY_METHOD * const *base, int num);
122 107
123static int 108int
124pmeth_cmp(const EVP_PKEY_METHOD * const *a, const EVP_PKEY_METHOD * const *b) 109evp_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
130static int 116 return num;
131pmeth_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
138static const EVP_PKEY_METHOD * * 119const EVP_PKEY_METHOD *
139OBJ_bsearch_pmeth(const EVP_PKEY_METHOD * *key, const EVP_PKEY_METHOD * const *base, int num) 120evp_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
145const EVP_PKEY_METHOD * 134const EVP_PKEY_METHOD *
146EVP_PKEY_meth_find(int type) 135EVP_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
165static EVP_PKEY_CTX * 149static EVP_PKEY_CTX *
@@ -331,14 +315,15 @@ EVP_PKEY_CTX_dup(EVP_PKEY_CTX *pctx)
331int 315int
332EVP_PKEY_meth_add0(const EVP_PKEY_METHOD *pmeth) 316EVP_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