From 7be04a3ac40fb6cf83be2c619dc30625988c6742 Mon Sep 17 00:00:00 2001 From: Matt Caswell Date: Thu, 27 May 2021 10:56:02 +0100 Subject: Give ASN.1 objects the ability to report their libctx/propq Some ASN.1 objects have an embedded libctx/propq. If they have one we give the ASN.1 code the ability to find these values and use them where needed. This is used for OSSL_CMP_MSG_dup() and X509_dup(). Reviewed-by: Shane Lontis Reviewed-by: Paul Dale (Merged from https://github.com/openssl/openssl/pull/15591) --- crypto/asn1/a_dup.c | 13 +++++++++---- crypto/cmp/cmp_asn.c | 20 +++++++++++++++++--- crypto/x509/x_x509.c | 14 ++++++++++++++ include/openssl/asn1t.h.in | 2 ++ 4 files changed, 42 insertions(+), 7 deletions(-) diff --git a/crypto/asn1/a_dup.c b/crypto/asn1/a_dup.c index 2fa3ccd28a..93e8b2aa8d 100644 --- a/crypto/asn1/a_dup.c +++ b/crypto/asn1/a_dup.c @@ -56,6 +56,8 @@ void *ASN1_item_dup(const ASN1_ITEM *it, const void *x) const unsigned char *p; long i; ASN1_VALUE *ret; + OSSL_LIB_CTX *libctx = NULL; + const char *propq = NULL; if (x == NULL) return NULL; @@ -67,9 +69,12 @@ void *ASN1_item_dup(const ASN1_ITEM *it, const void *x) asn1_cb = aux != NULL ? aux->asn1_cb : NULL; } - if (asn1_cb != NULL - && !asn1_cb(ASN1_OP_DUP_PRE, (ASN1_VALUE **)&x, it, NULL)) - goto auxerr; + if (asn1_cb != NULL) { + if (!asn1_cb(ASN1_OP_DUP_PRE, (ASN1_VALUE **)&x, it, NULL) + || !asn1_cb(ASN1_OP_GET0_LIBCTX, (ASN1_VALUE **)&x, it, &libctx) + || !asn1_cb(ASN1_OP_GET0_PROPQ, (ASN1_VALUE **)&x, it, &propq)) + goto auxerr; + } i = ASN1_item_i2d(x, &b, it); if (b == NULL) { @@ -77,7 +82,7 @@ void *ASN1_item_dup(const ASN1_ITEM *it, const void *x) return NULL; } p = b; - ret = ASN1_item_d2i(NULL, &p, i, it); + ret = ASN1_item_d2i_ex(NULL, &p, i, it, libctx, propq); OPENSSL_free(b); if (asn1_cb != NULL diff --git a/crypto/cmp/cmp_asn.c b/crypto/cmp/cmp_asn.c index 1d17f77bd6..31b67178d8 100644 --- a/crypto/cmp/cmp_asn.c +++ b/crypto/cmp/cmp_asn.c @@ -211,21 +211,35 @@ int ossl_cmp_asn1_get_int(const ASN1_INTEGER *a) static int ossl_cmp_msg_cb(int operation, ASN1_VALUE **pval, const ASN1_ITEM *it, void *exarg) { - OSSL_CMP_MSG *ret = (OSSL_CMP_MSG *)*pval; + OSSL_CMP_MSG *msg = (OSSL_CMP_MSG *)*pval; switch (operation) { case ASN1_OP_FREE_POST: - OPENSSL_free(ret->propq); + OPENSSL_free(msg->propq); break; case ASN1_OP_DUP_POST: { OSSL_CMP_MSG *old = exarg; - if (!ossl_cmp_msg_set0_libctx(ret, old->libctx, old->propq)) + if (!ossl_cmp_msg_set0_libctx(msg, old->libctx, old->propq)) return 0; } break; + case ASN1_OP_GET0_LIBCTX: + { + OSSL_LIB_CTX **libctx = exarg; + + *libctx = msg->libctx; + } + break; + case ASN1_OP_GET0_PROPQ: + { + const char **propq = exarg; + + *propq = msg->propq; + } + break; default: break; } diff --git a/crypto/x509/x_x509.c b/crypto/x509/x_x509.c index 6666058b4c..260bfda683 100644 --- a/crypto/x509/x_x509.c +++ b/crypto/x509/x_x509.c @@ -123,6 +123,20 @@ static int x509_cb(int operation, ASN1_VALUE **pval, const ASN1_ITEM *it, } } break; + case ASN1_OP_GET0_LIBCTX: + { + OSSL_LIB_CTX **libctx = exarg; + + *libctx = ret->libctx; + } + break; + case ASN1_OP_GET0_PROPQ: + { + const char **propq = exarg; + + *propq = ret->propq; + } + break; default: break; } diff --git a/include/openssl/asn1t.h.in b/include/openssl/asn1t.h.in index 7e0e41a011..321f106e03 100644 --- a/include/openssl/asn1t.h.in +++ b/include/openssl/asn1t.h.in @@ -756,6 +756,8 @@ typedef struct ASN1_STREAM_ARG_st { # define ASN1_OP_DETACHED_POST 13 # define ASN1_OP_DUP_PRE 14 # define ASN1_OP_DUP_POST 15 +# define ASN1_OP_GET0_LIBCTX 16 +# define ASN1_OP_GET0_PROPQ 17 /* Macro to implement a primitive type */ # define IMPLEMENT_ASN1_TYPE(stname) IMPLEMENT_ASN1_TYPE_ex(stname, stname, 0) -- cgit v1.2.3