#include <openssl/x509.h>
#include "internal/cryptlib.h" /* ossl_assert() */
#include "internal/asn1.h"
+#include "crypto/dh.h"
+#include "crypto/dsa.h"
+#include "crypto/ec.h"
#include "crypto/ecx.h"
+#include "crypto/rsa.h"
#include "prov/bio.h"
#include "prov/implementations.h"
#include "prov/providercommonerr.h"
static OSSL_FUNC_decoder_decode_fn der2key_decode;
static OSSL_FUNC_decoder_export_object_fn der2key_export_object;
+struct der2key_ctx_st; /* Forward declaration */
typedef void *(extract_key_fn)(EVP_PKEY *);
+typedef void (adjust_key_fn)(void *, struct der2key_ctx_st *ctx);
typedef void (free_key_fn)(void *);
struct keytype_desc_st {
const char *keytype_name;
d2i_of_void *d2i_private_key;
d2i_of_void *d2i_public_key;
d2i_of_void *d2i_key_params;
+
/*
* For PKCS#8 decoders, we use EVP_PKEY extractors, EVP_PKEY_get1_{TYPE}()
*/
extract_key_fn *extract_key;
+ /*
+ * For any key, we may need to make provider specific adjustments, such
+ * as ensure the key carries the correct library context.
+ */
+ adjust_key_fn *adjust_key;
/* {type}_free() */
free_key_fn *free_key;
};
}
}
+ if (key != NULL && ctx->desc->adjust_key != NULL)
+ ctx->desc->adjust_key(key, ctx);
+
end:
/*
* Prune low-level ASN.1 parse errors from error queue, assuming
# define dh_d2i_key_params (d2i_of_void *)d2i_DHparams
# define dh_free (free_key_fn *)DH_free
+static void dh_adjust(void *key, struct der2key_ctx_st *ctx)
+{
+ ossl_dh_set0_libctx(key, PROV_LIBCTX_OF(ctx->provctx));
+}
+
# define dhx_evp_type EVP_PKEY_DHX
# define dhx_evp_extract (extract_key_fn *)EVP_PKEY_get1_DH
# define dhx_d2i_private_key NULL
# define dhx_d2i_public_key NULL
# define dhx_d2i_key_params (d2i_of_void *)d2i_DHxparams
# define dhx_free (free_key_fn *)DH_free
+# define dhx_adjust dh_adjust
#endif
/* ---------------------------------------------------------------------- */
# define dsa_d2i_public_key (d2i_of_void *)d2i_DSAPublicKey
# define dsa_d2i_key_params (d2i_of_void *)d2i_DSAparams
# define dsa_free (free_key_fn *)DSA_free
+
+static void dsa_adjust(void *key, struct der2key_ctx_st *ctx)
+{
+ ossl_dsa_set0_libctx(key, PROV_LIBCTX_OF(ctx->provctx));
+}
#endif
/* ---------------------------------------------------------------------- */
# define ec_d2i_key_params (d2i_of_void *)d2i_ECParameters
# define ec_free (free_key_fn *)EC_KEY_free
+static void ec_adjust(void *key, struct der2key_ctx_st *ctx)
+{
+ ec_key_set0_libctx(key, PROV_LIBCTX_OF(ctx->provctx));
+}
+
/*
* ED25519, ED448, X25519, X448 only implement PKCS#8 and SubjectPublicKeyInfo,
* so no d2i functions to be had.
*/
+
+static void ecx_key_adjust(void *key, struct der2key_ctx_st *ctx)
+{
+ ecx_key_set0_libctx(key, PROV_LIBCTX_OF(ctx->provctx));
+}
+
# define ed25519_evp_type EVP_PKEY_ED25519
# define ed25519_evp_extract (extract_key_fn *)evp_pkey_get1_ED25519
# define ed25519_d2i_private_key NULL
# define ed25519_d2i_public_key NULL
# define ed25519_d2i_key_params NULL
# define ed25519_free (free_key_fn *)ecx_key_free
+# define ed25519_adjust ecx_key_adjust
# define ed448_evp_type EVP_PKEY_ED448
# define ed448_evp_extract (extract_key_fn *)evp_pkey_get1_ED448
# define ed448_d2i_public_key NULL
# define ed448_d2i_key_params NULL
# define ed448_free (free_key_fn *)ecx_key_free
+# define ed448_adjust ecx_key_adjust
# define x25519_evp_type EVP_PKEY_X25519
# define x25519_evp_extract (extract_key_fn *)evp_pkey_get1_X25519
# define x25519_d2i_public_key NULL
# define x25519_d2i_key_params NULL
# define x25519_free (free_key_fn *)ecx_key_free
+# define x25519_adjust ecx_key_adjust
# define x448_evp_type EVP_PKEY_X448
# define x448_evp_extract (extract_key_fn *)evp_pkey_get1_X448
# define x448_d2i_public_key NULL
# define x448_d2i_key_params NULL
# define x448_free (free_key_fn *)ecx_key_free
+# define x448_adjust ecx_key_adjust
#endif
/* ---------------------------------------------------------------------- */
#define rsa_d2i_key_params NULL
#define rsa_free (free_key_fn *)RSA_free
+static void rsa_adjust(void *key, struct der2key_ctx_st *ctx)
+{
+ ossl_rsa_set0_libctx(key, PROV_LIBCTX_OF(ctx->provctx));
+}
+
#define rsapss_evp_type EVP_PKEY_RSA_PSS
#define rsapss_evp_extract (extract_key_fn *)EVP_PKEY_get1_RSA
#define rsapss_d2i_private_key (d2i_of_void *)d2i_RSAPrivateKey
#define rsapss_d2i_public_key (d2i_of_void *)d2i_RSAPublicKey
#define rsapss_d2i_key_params NULL
#define rsapss_free (free_key_fn *)RSA_free
+#define rsapss_adjust rsa_adjust
/* ---------------------------------------------------------------------- */
keytype##_d2i_public_key, \
NULL, \
NULL, \
+ keytype##_adjust, \
keytype##_free
#define DO_type_specific_pub(keytype) \
keytype##_d2i_public_key, \
NULL, \
NULL, \
+ keytype##_adjust, \
keytype##_free
#define DO_type_specific_priv(keytype) \
NULL, \
NULL, \
NULL, \
+ keytype##_adjust, \
keytype##_free
#define DO_type_specific_params(keytype) \
NULL, \
keytype##_d2i_key_params, \
NULL, \
+ keytype##_adjust, \
keytype##_free
#define DO_type_specific(keytype) \
keytype##_d2i_public_key, \
keytype##_d2i_key_params, \
NULL, \
+ keytype##_adjust, \
keytype##_free
#define DO_type_specific_no_pub(keytype) \
NULL, \
keytype##_d2i_key_params, \
NULL, \
+ keytype##_adjust, \
keytype##_free
#define DO_PKCS8(keytype) \
NULL, \
NULL, \
keytype##_evp_extract, \
+ keytype##_adjust, \
keytype##_free
#define DO_SubjectPublicKeyInfo(keytype) \
NULL, \
NULL, \
keytype##_evp_extract, \
+ keytype##_adjust, \
keytype##_free
#define DO_DH(keytype) \
NULL, \
keytype##_d2i_key_params, \
NULL, \
+ keytype##_adjust, \
keytype##_free
#define DO_DHX(keytype) \
NULL, \
keytype##_d2i_key_params, \
NULL, \
+ keytype##_adjust, \
keytype##_free
#define DO_DSA(keytype) \
keytype##_d2i_public_key, \
keytype##_d2i_key_params, \
NULL, \
+ keytype##_adjust, \
keytype##_free
#define DO_EC(keytype) \
NULL, \
keytype##_d2i_key_params, \
NULL, \
+ keytype##_adjust, \
keytype##_free
#define DO_RSA(keytype) \
keytype##_d2i_public_key, \
NULL, \
NULL, \
+ keytype##_adjust, \
keytype##_free
/*