summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatt Caswell <matt@openssl.org>2021-05-27 10:56:02 +0100
committerPauli <pauli@openssl.org>2021-06-05 17:39:27 +1000
commit7be04a3ac40fb6cf83be2c619dc30625988c6742 (patch)
tree1fa067011552138e104b42eb78dcdc3894572f00
parent6282d6c28456543734defc45f653adeec1362958 (diff)
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 <shane.lontis@oracle.com> Reviewed-by: Paul Dale <pauli@openssl.org> (Merged from https://github.com/openssl/openssl/pull/15591)
-rw-r--r--crypto/asn1/a_dup.c13
-rw-r--r--crypto/cmp/cmp_asn.c20
-rw-r--r--crypto/x509/x_x509.c14
-rw-r--r--include/openssl/asn1t.h.in2
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)