mirror of
https://github.com/openssl/openssl.git
synced 2024-11-21 01:15:20 +08:00
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)
This commit is contained in:
parent
6282d6c284
commit
7be04a3ac4
@ -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
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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)
|
||||
|
Loading…
Reference in New Issue
Block a user