summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authortb <>2023-07-28 10:19:20 +0000
committertb <>2023-07-28 10:19:20 +0000
commit80044b19f0ece8df72ab24e3c1d89b8ca3d14bf7 (patch)
tree2ee287d6ab4c68a054e3379b662b9a6d1a67c316
parent39fd8a543e6f18ed3accea6db537f4a36fdb017d (diff)
downloadopenbsd-80044b19f0ece8df72ab24e3c1d89b8ca3d14bf7.tar.gz
openbsd-80044b19f0ece8df72ab24e3c1d89b8ca3d14bf7.tar.bz2
openbsd-80044b19f0ece8df72ab24e3c1d89b8ca3d14bf7.zip
Make ex_data implementations internal
To state the obvious: library suffers from way too much extensibility. In theory, applications can implement their own ex_data implementation. In practice, none did. A glance at ex_data.c might give an idea as to why. Make this internal so this particular turd can be replaced with something slightly saner. Also sync up the CRYPTO_EX_INDEX_* defines with OpenSSL - at least the parts we support. ok jsing
-rw-r--r--src/lib/libcrypto/Symbols.list3
-rw-r--r--src/lib/libcrypto/Symbols.namespace3
-rw-r--r--src/lib/libcrypto/crypto.h64
-rw-r--r--src/lib/libcrypto/ex_data.c56
-rw-r--r--src/lib/libcrypto/hidden/openssl/crypto.h5
-rw-r--r--src/lib/libcrypto/stack/safestack.h24
6 files changed, 41 insertions, 114 deletions
diff --git a/src/lib/libcrypto/Symbols.list b/src/lib/libcrypto/Symbols.list
index 2f081c1a4c..8129d9f182 100644
--- a/src/lib/libcrypto/Symbols.list
+++ b/src/lib/libcrypto/Symbols.list
@@ -691,7 +691,6 @@ CRYPTO_dbg_realloc
691CRYPTO_dbg_set_options 691CRYPTO_dbg_set_options
692CRYPTO_destroy_dynlockid 692CRYPTO_destroy_dynlockid
693CRYPTO_dup_ex_data 693CRYPTO_dup_ex_data
694CRYPTO_ex_data_new_class
695CRYPTO_free 694CRYPTO_free
696CRYPTO_free_ex_data 695CRYPTO_free_ex_data
697CRYPTO_free_locked 696CRYPTO_free_locked
@@ -712,7 +711,6 @@ CRYPTO_get_dynlock_destroy_callback
712CRYPTO_get_dynlock_lock_callback 711CRYPTO_get_dynlock_lock_callback
713CRYPTO_get_dynlock_value 712CRYPTO_get_dynlock_value
714CRYPTO_get_ex_data 713CRYPTO_get_ex_data
715CRYPTO_get_ex_data_implementation
716CRYPTO_get_ex_new_index 714CRYPTO_get_ex_new_index
717CRYPTO_get_id_callback 715CRYPTO_get_id_callback
718CRYPTO_get_lock_name 716CRYPTO_get_lock_name
@@ -752,7 +750,6 @@ CRYPTO_set_dynlock_create_callback
752CRYPTO_set_dynlock_destroy_callback 750CRYPTO_set_dynlock_destroy_callback
753CRYPTO_set_dynlock_lock_callback 751CRYPTO_set_dynlock_lock_callback
754CRYPTO_set_ex_data 752CRYPTO_set_ex_data
755CRYPTO_set_ex_data_implementation
756CRYPTO_set_id_callback 753CRYPTO_set_id_callback
757CRYPTO_set_locked_mem_ex_functions 754CRYPTO_set_locked_mem_ex_functions
758CRYPTO_set_locked_mem_functions 755CRYPTO_set_locked_mem_functions
diff --git a/src/lib/libcrypto/Symbols.namespace b/src/lib/libcrypto/Symbols.namespace
index 07a1b86ad1..dcf70a63e6 100644
--- a/src/lib/libcrypto/Symbols.namespace
+++ b/src/lib/libcrypto/Symbols.namespace
@@ -1945,9 +1945,6 @@ _libre_OpenSSL_version
1945_libre_OpenSSL_version_num 1945_libre_OpenSSL_version_num
1946_libre_SSLeay_version 1946_libre_SSLeay_version
1947_libre_SSLeay 1947_libre_SSLeay
1948_libre_CRYPTO_get_ex_data_implementation
1949_libre_CRYPTO_set_ex_data_implementation
1950_libre_CRYPTO_ex_data_new_class
1951_libre_CRYPTO_get_ex_new_index 1948_libre_CRYPTO_get_ex_new_index
1952_libre_CRYPTO_new_ex_data 1949_libre_CRYPTO_new_ex_data
1953_libre_CRYPTO_dup_ex_data 1950_libre_CRYPTO_dup_ex_data
diff --git a/src/lib/libcrypto/crypto.h b/src/lib/libcrypto/crypto.h
index f91374f496..07a55ec1f6 100644
--- a/src/lib/libcrypto/crypto.h
+++ b/src/lib/libcrypto/crypto.h
@@ -1,4 +1,4 @@
1/* $OpenBSD: crypto.h,v 1.62 2023/07/05 13:06:06 bcook Exp $ */ 1/* $OpenBSD: crypto.h,v 1.63 2023/07/28 10:19:20 tb Exp $ */
2/* ==================================================================== 2/* ====================================================================
3 * Copyright (c) 1998-2006 The OpenSSL Project. All rights reserved. 3 * Copyright (c) 1998-2006 The OpenSSL Project. All rights reserved.
4 * 4 *
@@ -244,44 +244,22 @@ struct crypto_ex_data_st {
244}; 244};
245DECLARE_STACK_OF(void) 245DECLARE_STACK_OF(void)
246 246
247/* This stuff is basically class callback functions 247#define CRYPTO_EX_INDEX_SSL 0
248 * The current classes are SSL_CTX, SSL, SSL_SESSION, and a few more */ 248#define CRYPTO_EX_INDEX_SSL_CTX 1
249 249#define CRYPTO_EX_INDEX_SSL_SESSION 2
250typedef struct crypto_ex_data_func_st { 250#define CRYPTO_EX_INDEX_APP 3
251 long argl; /* Arbitrary long */ 251#define CRYPTO_EX_INDEX_BIO 4
252 void *argp; /* Arbitrary void * */ 252#define CRYPTO_EX_INDEX_DH 5
253 CRYPTO_EX_new *new_func; 253#define CRYPTO_EX_INDEX_DSA 6
254 CRYPTO_EX_free *free_func; 254#define CRYPTO_EX_INDEX_EC_KEY 7
255 CRYPTO_EX_dup *dup_func; 255#define CRYPTO_EX_INDEX_ENGINE 8
256} CRYPTO_EX_DATA_FUNCS; 256#define CRYPTO_EX_INDEX_RSA 9
257 257#define CRYPTO_EX_INDEX_UI 10
258DECLARE_STACK_OF(CRYPTO_EX_DATA_FUNCS) 258#define CRYPTO_EX_INDEX_UI_METHOD 11
259 259#define CRYPTO_EX_INDEX_X509 12
260/* Per class, we have a STACK of CRYPTO_EX_DATA_FUNCS for each CRYPTO_EX_DATA 260#define CRYPTO_EX_INDEX_X509_STORE 13
261 * entry. 261#define CRYPTO_EX_INDEX_X509_STORE_CTX 14
262 */ 262#define CRYPTO_EX_INDEX__COUNT 15
263
264#define CRYPTO_EX_INDEX_BIO 0
265#define CRYPTO_EX_INDEX_SSL 1
266#define CRYPTO_EX_INDEX_SSL_CTX 2
267#define CRYPTO_EX_INDEX_SSL_SESSION 3
268#define CRYPTO_EX_INDEX_X509_STORE 4
269#define CRYPTO_EX_INDEX_X509_STORE_CTX 5
270#define CRYPTO_EX_INDEX_RSA 6
271#define CRYPTO_EX_INDEX_DSA 7
272#define CRYPTO_EX_INDEX_DH 8
273#define CRYPTO_EX_INDEX_ENGINE 9
274#define CRYPTO_EX_INDEX_X509 10
275#define CRYPTO_EX_INDEX_UI 11
276#define CRYPTO_EX_INDEX_ECDSA 12
277#define CRYPTO_EX_INDEX_ECDH 13
278#define CRYPTO_EX_INDEX_COMP 14
279#define CRYPTO_EX_INDEX_STORE 15
280#define CRYPTO_EX_INDEX_EC_KEY 16
281
282/* Dynamically assigned indexes start from this value (don't use directly, use
283 * via CRYPTO_ex_data_new_class). */
284#define CRYPTO_EX_INDEX_USER 100
285 263
286#ifndef LIBRESSL_INTERNAL 264#ifndef LIBRESSL_INTERNAL
287#define CRYPTO_malloc_init() (0) 265#define CRYPTO_malloc_init() (0)
@@ -328,14 +306,6 @@ unsigned long OpenSSL_version_num(void);
328const char *SSLeay_version(int type); 306const char *SSLeay_version(int type);
329unsigned long SSLeay(void); 307unsigned long SSLeay(void);
330 308
331/* An opaque type representing an implementation of "ex_data" support */
332typedef struct st_CRYPTO_EX_DATA_IMPL CRYPTO_EX_DATA_IMPL;
333/* Return an opaque pointer to the current "ex_data" implementation */
334const CRYPTO_EX_DATA_IMPL *CRYPTO_get_ex_data_implementation(void);
335/* Sets the "ex_data" implementation to be used (if it's not too late) */
336int CRYPTO_set_ex_data_implementation(const CRYPTO_EX_DATA_IMPL *i);
337/* Get a new "ex_data" class, and return the corresponding "class_index" */
338int CRYPTO_ex_data_new_class(void);
339/* Within a given class, get/register a new index */ 309/* Within a given class, get/register a new index */
340int CRYPTO_get_ex_new_index(int class_index, long argl, void *argp, 310int CRYPTO_get_ex_new_index(int class_index, long argl, void *argp,
341 CRYPTO_EX_new *new_func, CRYPTO_EX_dup *dup_func, 311 CRYPTO_EX_new *new_func, CRYPTO_EX_dup *dup_func,
diff --git a/src/lib/libcrypto/ex_data.c b/src/lib/libcrypto/ex_data.c
index 71b2fc397b..17db16e58d 100644
--- a/src/lib/libcrypto/ex_data.c
+++ b/src/lib/libcrypto/ex_data.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: ex_data.c,v 1.22 2023/07/08 08:28:23 beck Exp $ */ 1/* $OpenBSD: ex_data.c,v 1.23 2023/07/28 10:19:20 tb Exp $ */
2 2
3/* 3/*
4 * Overhaul notes; 4 * Overhaul notes;
@@ -141,6 +141,26 @@
141#include <openssl/err.h> 141#include <openssl/err.h>
142#include <openssl/lhash.h> 142#include <openssl/lhash.h>
143 143
144typedef struct crypto_ex_data_func_st {
145 long argl; /* Arbitrary long */
146 void *argp; /* Arbitrary void * */
147 CRYPTO_EX_new *new_func;
148 CRYPTO_EX_free *free_func;
149 CRYPTO_EX_dup *dup_func;
150} CRYPTO_EX_DATA_FUNCS;
151
152DECLARE_STACK_OF(CRYPTO_EX_DATA_FUNCS)
153
154#define sk_CRYPTO_EX_DATA_FUNCS_new_null() SKM_sk_new_null(CRYPTO_EX_DATA_FUNCS)
155#define sk_CRYPTO_EX_DATA_FUNCS_num(st) SKM_sk_num(CRYPTO_EX_DATA_FUNCS, (st))
156#define sk_CRYPTO_EX_DATA_FUNCS_value(st, i) SKM_sk_value(CRYPTO_EX_DATA_FUNCS, (st), (i))
157#define sk_CRYPTO_EX_DATA_FUNCS_set(st, i, val) SKM_sk_set(CRYPTO_EX_DATA_FUNCS, (st), (i), (val))
158#define sk_CRYPTO_EX_DATA_FUNCS_push(st, val) SKM_sk_push(CRYPTO_EX_DATA_FUNCS, (st), (val))
159#define sk_CRYPTO_EX_DATA_FUNCS_pop_free(st, free_func) SKM_sk_pop_free(CRYPTO_EX_DATA_FUNCS, (st), (free_func))
160
161/* An opaque type representing an implementation of "ex_data" support */
162typedef struct st_CRYPTO_EX_DATA_IMPL CRYPTO_EX_DATA_IMPL;
163
144/* What an "implementation of ex_data functionality" looks like */ 164/* What an "implementation of ex_data functionality" looks like */
145struct st_CRYPTO_EX_DATA_IMPL { 165struct st_CRYPTO_EX_DATA_IMPL {
146 /*********************/ 166 /*********************/
@@ -210,29 +230,6 @@ impl_check(void)
210 * invoking the function (which checks again inside a lock). */ 230 * invoking the function (which checks again inside a lock). */
211#define IMPL_CHECK if(!impl) impl_check(); 231#define IMPL_CHECK if(!impl) impl_check();
212 232
213/* API functions to get/set the "ex_data" implementation */
214const CRYPTO_EX_DATA_IMPL *
215CRYPTO_get_ex_data_implementation(void)
216{
217 IMPL_CHECK
218 return impl;
219}
220LCRYPTO_ALIAS(CRYPTO_get_ex_data_implementation);
221
222int
223CRYPTO_set_ex_data_implementation(const CRYPTO_EX_DATA_IMPL *i)
224{
225 int toret = 0;
226 CRYPTO_w_lock(CRYPTO_LOCK_EX_DATA);
227 if (!impl) {
228 impl = i;
229 toret = 1;
230 }
231 CRYPTO_w_unlock(CRYPTO_LOCK_EX_DATA);
232 return toret;
233}
234LCRYPTO_ALIAS(CRYPTO_set_ex_data_implementation);
235
236/****************************************************************************/ 233/****************************************************************************/
237/* Interal (default) implementation of "ex_data" support. API functions are 234/* Interal (default) implementation of "ex_data" support. API functions are
238 * further down. */ 235 * further down. */
@@ -247,6 +244,7 @@ typedef struct st_ex_class_item {
247} EX_CLASS_ITEM; 244} EX_CLASS_ITEM;
248 245
249/* When assigning new class indexes, this is our counter */ 246/* When assigning new class indexes, this is our counter */
247#define CRYPTO_EX_INDEX_USER 100
250static int ex_class = CRYPTO_EX_INDEX_USER; 248static int ex_class = CRYPTO_EX_INDEX_USER;
251 249
252/* The global hash table of EX_CLASS_ITEM items */ 250/* The global hash table of EX_CLASS_ITEM items */
@@ -541,16 +539,6 @@ skip:
541/* API functions that defer all "state" operations to the "ex_data" 539/* API functions that defer all "state" operations to the "ex_data"
542 * implementation we have set. */ 540 * implementation we have set. */
543 541
544/* Obtain an index for a new class (not the same as getting a new index within
545 * an existing class - this is actually getting a new *class*) */
546int
547CRYPTO_ex_data_new_class(void)
548{
549 IMPL_CHECK
550 return EX_IMPL(new_class)();
551}
552LCRYPTO_ALIAS(CRYPTO_ex_data_new_class);
553
554/* Release all "ex_data" state to prevent memory leaks. This can't be made 542/* Release all "ex_data" state to prevent memory leaks. This can't be made
555 * thread-safe without overhauling a lot of stuff, and shouldn't really be 543 * thread-safe without overhauling a lot of stuff, and shouldn't really be
556 * called under potential race-conditions anyway (it's for program shutdown 544 * called under potential race-conditions anyway (it's for program shutdown
diff --git a/src/lib/libcrypto/hidden/openssl/crypto.h b/src/lib/libcrypto/hidden/openssl/crypto.h
index 69ffa9480b..dc0b7a02b1 100644
--- a/src/lib/libcrypto/hidden/openssl/crypto.h
+++ b/src/lib/libcrypto/hidden/openssl/crypto.h
@@ -1,4 +1,4 @@
1/* $OpenBSD: crypto.h,v 1.1 2023/07/08 08:28:23 beck Exp $ */ 1/* $OpenBSD: crypto.h,v 1.2 2023/07/28 10:19:20 tb Exp $ */
2/* 2/*
3 * Copyright (c) 2023 Bob Beck <beck@openbsd.org> 3 * Copyright (c) 2023 Bob Beck <beck@openbsd.org>
4 * 4 *
@@ -29,9 +29,6 @@ LCRYPTO_USED(OpenSSL_version);
29LCRYPTO_USED(OpenSSL_version_num); 29LCRYPTO_USED(OpenSSL_version_num);
30LCRYPTO_USED(SSLeay_version); 30LCRYPTO_USED(SSLeay_version);
31LCRYPTO_USED(SSLeay); 31LCRYPTO_USED(SSLeay);
32LCRYPTO_USED(CRYPTO_get_ex_data_implementation);
33LCRYPTO_USED(CRYPTO_set_ex_data_implementation);
34LCRYPTO_USED(CRYPTO_ex_data_new_class);
35LCRYPTO_USED(CRYPTO_get_ex_new_index); 32LCRYPTO_USED(CRYPTO_get_ex_new_index);
36LCRYPTO_USED(CRYPTO_new_ex_data); 33LCRYPTO_USED(CRYPTO_new_ex_data);
37LCRYPTO_USED(CRYPTO_dup_ex_data); 34LCRYPTO_USED(CRYPTO_dup_ex_data);
diff --git a/src/lib/libcrypto/stack/safestack.h b/src/lib/libcrypto/stack/safestack.h
index c58ebea449..5b8ffed6a1 100644
--- a/src/lib/libcrypto/stack/safestack.h
+++ b/src/lib/libcrypto/stack/safestack.h
@@ -1,4 +1,4 @@
1/* $OpenBSD: safestack.h,v 1.26 2023/04/25 18:53:42 tb Exp $ */ 1/* $OpenBSD: safestack.h,v 1.27 2023/07/28 10:19:20 tb Exp $ */
2/* ==================================================================== 2/* ====================================================================
3 * Copyright (c) 1999 The OpenSSL Project. All rights reserved. 3 * Copyright (c) 1999 The OpenSSL Project. All rights reserved.
4 * 4 *
@@ -619,28 +619,6 @@ DECLARE_SPECIAL_STACK_OF(OPENSSL_BLOCK, void)
619#define sk_CONF_VALUE_sort(st) SKM_sk_sort(CONF_VALUE, (st)) 619#define sk_CONF_VALUE_sort(st) SKM_sk_sort(CONF_VALUE, (st))
620#define sk_CONF_VALUE_is_sorted(st) SKM_sk_is_sorted(CONF_VALUE, (st)) 620#define sk_CONF_VALUE_is_sorted(st) SKM_sk_is_sorted(CONF_VALUE, (st))
621 621
622#define sk_CRYPTO_EX_DATA_FUNCS_new(cmp) SKM_sk_new(CRYPTO_EX_DATA_FUNCS, (cmp))
623#define sk_CRYPTO_EX_DATA_FUNCS_new_null() SKM_sk_new_null(CRYPTO_EX_DATA_FUNCS)
624#define sk_CRYPTO_EX_DATA_FUNCS_free(st) SKM_sk_free(CRYPTO_EX_DATA_FUNCS, (st))
625#define sk_CRYPTO_EX_DATA_FUNCS_num(st) SKM_sk_num(CRYPTO_EX_DATA_FUNCS, (st))
626#define sk_CRYPTO_EX_DATA_FUNCS_value(st, i) SKM_sk_value(CRYPTO_EX_DATA_FUNCS, (st), (i))
627#define sk_CRYPTO_EX_DATA_FUNCS_set(st, i, val) SKM_sk_set(CRYPTO_EX_DATA_FUNCS, (st), (i), (val))
628#define sk_CRYPTO_EX_DATA_FUNCS_zero(st) SKM_sk_zero(CRYPTO_EX_DATA_FUNCS, (st))
629#define sk_CRYPTO_EX_DATA_FUNCS_push(st, val) SKM_sk_push(CRYPTO_EX_DATA_FUNCS, (st), (val))
630#define sk_CRYPTO_EX_DATA_FUNCS_unshift(st, val) SKM_sk_unshift(CRYPTO_EX_DATA_FUNCS, (st), (val))
631#define sk_CRYPTO_EX_DATA_FUNCS_find(st, val) SKM_sk_find(CRYPTO_EX_DATA_FUNCS, (st), (val))
632#define sk_CRYPTO_EX_DATA_FUNCS_find_ex(st, val) SKM_sk_find_ex(CRYPTO_EX_DATA_FUNCS, (st), (val))
633#define sk_CRYPTO_EX_DATA_FUNCS_delete(st, i) SKM_sk_delete(CRYPTO_EX_DATA_FUNCS, (st), (i))
634#define sk_CRYPTO_EX_DATA_FUNCS_delete_ptr(st, ptr) SKM_sk_delete_ptr(CRYPTO_EX_DATA_FUNCS, (st), (ptr))
635#define sk_CRYPTO_EX_DATA_FUNCS_insert(st, val, i) SKM_sk_insert(CRYPTO_EX_DATA_FUNCS, (st), (val), (i))
636#define sk_CRYPTO_EX_DATA_FUNCS_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(CRYPTO_EX_DATA_FUNCS, (st), (cmp))
637#define sk_CRYPTO_EX_DATA_FUNCS_dup(st) SKM_sk_dup(CRYPTO_EX_DATA_FUNCS, st)
638#define sk_CRYPTO_EX_DATA_FUNCS_pop_free(st, free_func) SKM_sk_pop_free(CRYPTO_EX_DATA_FUNCS, (st), (free_func))
639#define sk_CRYPTO_EX_DATA_FUNCS_shift(st) SKM_sk_shift(CRYPTO_EX_DATA_FUNCS, (st))
640#define sk_CRYPTO_EX_DATA_FUNCS_pop(st) SKM_sk_pop(CRYPTO_EX_DATA_FUNCS, (st))
641#define sk_CRYPTO_EX_DATA_FUNCS_sort(st) SKM_sk_sort(CRYPTO_EX_DATA_FUNCS, (st))
642#define sk_CRYPTO_EX_DATA_FUNCS_is_sorted(st) SKM_sk_is_sorted(CRYPTO_EX_DATA_FUNCS, (st))
643
644#define sk_CRYPTO_dynlock_new(cmp) SKM_sk_new(CRYPTO_dynlock, (cmp)) 622#define sk_CRYPTO_dynlock_new(cmp) SKM_sk_new(CRYPTO_dynlock, (cmp))
645#define sk_CRYPTO_dynlock_new_null() SKM_sk_new_null(CRYPTO_dynlock) 623#define sk_CRYPTO_dynlock_new_null() SKM_sk_new_null(CRYPTO_dynlock)
646#define sk_CRYPTO_dynlock_free(st) SKM_sk_free(CRYPTO_dynlock, (st)) 624#define sk_CRYPTO_dynlock_free(st) SKM_sk_free(CRYPTO_dynlock, (st))