Remove EC_EXTRA_DATA
authortb <tb@openbsd.org>
Sun, 25 Jun 2023 18:52:27 +0000 (18:52 +0000)
committertb <tb@openbsd.org>
Sun, 25 Jun 2023 18:52:27 +0000 (18:52 +0000)
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

lib/libcrypto/ec/ec_key.c
lib/libcrypto/ec/ec_kmeth.c
lib/libcrypto/ec/ec_lib.c
lib/libcrypto/ec/ec_local.h

index 2f9f05c..4127352 100644 (file)
@@ -1,4 +1,4 @@
-/* $OpenBSD: ec_key.c,v 1.32 2023/03/27 10:25:02 tb Exp $ */
+/* $OpenBSD: ec_key.c,v 1.33 2023/06/25 18:52:27 tb Exp $ */
 /*
  * Written by Nils Larsch for the OpenSSL project.
  */
@@ -122,16 +122,12 @@ EC_KEY_free(EC_KEY *r)
        EC_POINT_free(r->pub_key);
        BN_free(r->priv_key);
 
-       EC_EX_DATA_free_all_data(&r->method_data);
-
        freezero(r, sizeof(EC_KEY));
 }
 
 EC_KEY *
 EC_KEY_copy(EC_KEY *dest, const EC_KEY *src)
 {
-       EC_EXTRA_DATA *d;
-
        if (dest == NULL || src == NULL) {
                ECerror(ERR_R_PASSED_NULL_PARAMETER);
                return NULL;
@@ -175,18 +171,6 @@ EC_KEY_copy(EC_KEY *dest, const EC_KEY *src)
                if (!bn_copy(dest->priv_key, src->priv_key))
                        return NULL;
        }
-       /* copy method/extra data */
-       EC_EX_DATA_free_all_data(&dest->method_data);
-
-       for (d = src->method_data; d != NULL; d = d->next) {
-               void *t = d->dup_func(d->data);
-
-               if (t == NULL)
-                       return 0;
-               if (!EC_EX_DATA_set_data(&dest->method_data, t, d->dup_func,
-                   d->free_func, d->clear_free_func))
-                       return 0;
-       }
 
        /* copy the rest */
        dest->enc_flag = src->enc_flag;
@@ -526,38 +510,6 @@ EC_KEY_set_conv_form(EC_KEY *key, point_conversion_form_t cform)
                EC_GROUP_set_point_conversion_form(key->group, cform);
 }
 
-void *
-EC_KEY_get_key_method_data(EC_KEY *key,
-    void *(*dup_func) (void *),
-    void (*free_func) (void *),
-    void (*clear_free_func) (void *))
-{
-       void *ret;
-
-       CRYPTO_r_lock(CRYPTO_LOCK_EC);
-       ret = EC_EX_DATA_get_data(key->method_data, dup_func, free_func, clear_free_func);
-       CRYPTO_r_unlock(CRYPTO_LOCK_EC);
-
-       return ret;
-}
-
-void *
-EC_KEY_insert_key_method_data(EC_KEY *key, void *data,
-    void *(*dup_func) (void *),
-    void (*free_func) (void *),
-    void (*clear_free_func) (void *))
-{
-       EC_EXTRA_DATA *ex_data;
-
-       CRYPTO_w_lock(CRYPTO_LOCK_EC);
-       ex_data = EC_EX_DATA_get_data(key->method_data, dup_func, free_func, clear_free_func);
-       if (ex_data == NULL)
-               EC_EX_DATA_set_data(&key->method_data, data, dup_func, free_func, clear_free_func);
-       CRYPTO_w_unlock(CRYPTO_LOCK_EC);
-
-       return ex_data;
-}
-
 void
 EC_KEY_set_asn1_flag(EC_KEY *key, int flag)
 {
index 56fb437..4e296cf 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: ec_kmeth.c,v 1.7 2022/11/26 16:08:52 tb Exp $ */
+/*     $OpenBSD: ec_kmeth.c,v 1.8 2023/06/25 18:52:27 tb Exp $ */
 /*
  * Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL
  * project.
@@ -168,7 +168,6 @@ EC_KEY_new_method(ENGINE *engine)
        ret->enc_flag = 0;
        ret->conv_form = POINT_CONVERSION_UNCOMPRESSED;
        ret->references = 1;
-       ret->method_data = NULL;
 
        if (!CRYPTO_new_ex_data(CRYPTO_EX_INDEX_RSA, ret, &ret->ex_data))
                goto err;
index cb581f6..2e180e9 100644 (file)
@@ -1,4 +1,4 @@
-/* $OpenBSD: ec_lib.c,v 1.60 2023/06/24 18:21:07 jsing Exp $ */
+/* $OpenBSD: ec_lib.c,v 1.61 2023/06/25 18:52:27 tb Exp $ */
 /*
  * Originally written by Bodo Moeller for the OpenSSL project.
  */
@@ -651,158 +651,6 @@ ec_point_blind_coordinates(const EC_GROUP *group, EC_POINT *p, BN_CTX *ctx)
        return group->meth->blind_coordinates(group, p, ctx);
 }
 
-/* this has 'package' visibility */
-int
-EC_EX_DATA_set_data(EC_EXTRA_DATA ** ex_data, void *data,
-    void *(*dup_func) (void *),
-    void (*free_func) (void *),
-    void (*clear_free_func) (void *))
-{
-       EC_EXTRA_DATA *d;
-
-       if (ex_data == NULL)
-               return 0;
-
-       for (d = *ex_data; d != NULL; d = d->next) {
-               if (d->dup_func == dup_func && d->free_func == free_func &&
-                   d->clear_free_func == clear_free_func) {
-                       ECerror(EC_R_SLOT_FULL);
-                       return 0;
-               }
-       }
-
-       if (data == NULL)
-               /* no explicit entry needed */
-               return 1;
-
-       d = malloc(sizeof *d);
-       if (d == NULL)
-               return 0;
-
-       d->data = data;
-       d->dup_func = dup_func;
-       d->free_func = free_func;
-       d->clear_free_func = clear_free_func;
-
-       d->next = *ex_data;
-       *ex_data = d;
-
-       return 1;
-}
-
-/* this has 'package' visibility */
-void *
-EC_EX_DATA_get_data(const EC_EXTRA_DATA *ex_data,
-    void *(*dup_func) (void *),
-    void (*free_func) (void *),
-    void (*clear_free_func) (void *))
-{
-       const EC_EXTRA_DATA *d;
-
-       for (d = ex_data; d != NULL; d = d->next) {
-               if (d->dup_func == dup_func && d->free_func == free_func && d->clear_free_func == clear_free_func)
-                       return d->data;
-       }
-
-       return NULL;
-}
-
-/* this has 'package' visibility */
-void
-EC_EX_DATA_free_data(EC_EXTRA_DATA ** ex_data,
-    void *(*dup_func) (void *),
-    void (*free_func) (void *),
-    void (*clear_free_func) (void *))
-{
-       EC_EXTRA_DATA **p;
-
-       if (ex_data == NULL)
-               return;
-
-       for (p = ex_data; *p != NULL; p = &((*p)->next)) {
-               if ((*p)->dup_func == dup_func &&
-                   (*p)->free_func == free_func &&
-                   (*p)->clear_free_func == clear_free_func) {
-                       EC_EXTRA_DATA *next = (*p)->next;
-
-                       (*p)->free_func((*p)->data);
-                       free(*p);
-
-                       *p = next;
-                       return;
-               }
-       }
-}
-
-/* this has 'package' visibility */
-void
-EC_EX_DATA_clear_free_data(EC_EXTRA_DATA ** ex_data,
-    void *(*dup_func) (void *),
-    void (*free_func) (void *),
-    void (*clear_free_func) (void *))
-{
-       EC_EXTRA_DATA **p;
-
-       if (ex_data == NULL)
-               return;
-
-       for (p = ex_data; *p != NULL; p = &((*p)->next)) {
-               if ((*p)->dup_func == dup_func &&
-                   (*p)->free_func == free_func &&
-                   (*p)->clear_free_func == clear_free_func) {
-                       EC_EXTRA_DATA *next = (*p)->next;
-
-                       (*p)->clear_free_func((*p)->data);
-                       free(*p);
-
-                       *p = next;
-                       return;
-               }
-       }
-}
-
-/* this has 'package' visibility */
-void
-EC_EX_DATA_free_all_data(EC_EXTRA_DATA ** ex_data)
-{
-       EC_EXTRA_DATA *d;
-
-       if (ex_data == NULL)
-               return;
-
-       d = *ex_data;
-       while (d) {
-               EC_EXTRA_DATA *next = d->next;
-
-               d->free_func(d->data);
-               free(d);
-
-               d = next;
-       }
-       *ex_data = NULL;
-}
-
-/* this has 'package' visibility */
-void
-EC_EX_DATA_clear_free_all_data(EC_EXTRA_DATA ** ex_data)
-{
-       EC_EXTRA_DATA *d;
-
-       if (ex_data == NULL)
-               return;
-
-       d = *ex_data;
-       while (d) {
-               EC_EXTRA_DATA *next = d->next;
-
-               d->clear_free_func(d->data);
-               free(d);
-
-               d = next;
-       }
-       *ex_data = NULL;
-}
-
 EC_POINT *
 EC_POINT_new(const EC_GROUP *group)
 {
index eb0d6a8..6913cb5 100644 (file)
@@ -1,4 +1,4 @@
-/* $OpenBSD: ec_local.h,v 1.18 2023/06/25 07:50:37 tb Exp $ */
+/* $OpenBSD: ec_local.h,v 1.19 2023/06/25 18:52:27 tb Exp $ */
 /*
  * Originally written by Bodo Moeller for the OpenSSL project.
  */
@@ -173,14 +173,6 @@ struct ec_method_st {
            BN_CTX *ctx);
 } /* EC_METHOD */;
 
-typedef struct ec_extra_data_st {
-       struct ec_extra_data_st *next;
-       void *data;
-       void *(*dup_func)(void *);
-       void (*free_func)(void *);
-       void (*clear_free_func)(void *);
-} EC_EXTRA_DATA; /* used in EC_GROUP */
-
 struct ec_group_st {
        /*
         * Methods and members exposed via the public API.
@@ -260,26 +252,9 @@ struct ec_key_st {
        int     references;
        int     flags;
 
-       EC_EXTRA_DATA *method_data;
        CRYPTO_EX_DATA ex_data;
 } /* EC_KEY */;
 
-/* Basically a 'mixin' for extra data, but available for EC_GROUPs/EC_KEYs only
- * (with visibility limited to 'package' level for now).
- * We use the function pointers as index for retrieval; this obviates
- * global ex_data-style index tables.
- */
-int EC_EX_DATA_set_data(EC_EXTRA_DATA **, void *data,
-       void *(*dup_func)(void *), void (*free_func)(void *), void (*clear_free_func)(void *));
-void *EC_EX_DATA_get_data(const EC_EXTRA_DATA *,
-       void *(*dup_func)(void *), void (*free_func)(void *), void (*clear_free_func)(void *));
-void EC_EX_DATA_free_data(EC_EXTRA_DATA **,
-       void *(*dup_func)(void *), void (*free_func)(void *), void (*clear_free_func)(void *));
-void EC_EX_DATA_clear_free_data(EC_EXTRA_DATA **,
-       void *(*dup_func)(void *), void (*free_func)(void *), void (*clear_free_func)(void *));
-void EC_EX_DATA_free_all_data(EC_EXTRA_DATA **);
-void EC_EX_DATA_clear_free_all_data(EC_EXTRA_DATA **);
-
 struct ec_point_st {
        const EC_METHOD *meth;