Path: blob/main/crypto/openssl/providers/implementations/encode_decode/decode_der2key.c
104897 views
/*1* Copyright 2020-2025 The OpenSSL Project Authors. All Rights Reserved.2*3* Licensed under the Apache License 2.0 (the "License"). You may not use4* this file except in compliance with the License. You can obtain a copy5* in the file LICENSE in the source distribution or at6* https://www.openssl.org/source/license.html7*/89/*10* low level APIs are deprecated for public use, but still ok for11* internal use.12*/13#include "internal/deprecated.h"1415#include <openssl/byteorder.h>16#include <openssl/core_dispatch.h>17#include <openssl/core_names.h>18#include <openssl/core_object.h>19#include <openssl/crypto.h>20#include <openssl/err.h>21#include <openssl/params.h>22#include <openssl/pem.h> /* PEM_BUFSIZE and public PEM functions */23#include <openssl/pkcs12.h>24#include <openssl/provider.h>25#include <openssl/x509.h>26#include <openssl/proverr.h>27#include <openssl/asn1t.h>28#include "internal/cryptlib.h" /* ossl_assert() */29#include "crypto/dh.h"30#include "crypto/dsa.h"31#include "crypto/ec.h"32#include "crypto/evp.h"33#include "crypto/ecx.h"34#include "crypto/rsa.h"35#include "crypto/ml_dsa.h"36#include "crypto/slh_dsa.h"37#include "crypto/x509.h"38#include "crypto/ml_kem.h"39#include "openssl/obj_mac.h"40#include "prov/bio.h"41#include "prov/implementations.h"42#include "endecoder_local.h"43#include "internal/nelem.h"44#include "ml_dsa_codecs.h"45#include "ml_kem_codecs.h"4647#ifndef OPENSSL_NO_SLH_DSA48typedef struct {49ASN1_OBJECT *oid;50} BARE_ALGOR;5152typedef struct {53BARE_ALGOR algor;54ASN1_BIT_STRING *pubkey;55} BARE_PUBKEY;5657ASN1_SEQUENCE(BARE_ALGOR) = {58ASN1_SIMPLE(BARE_ALGOR, oid, ASN1_OBJECT),59} static_ASN1_SEQUENCE_END(BARE_ALGOR)6061ASN1_SEQUENCE(BARE_PUBKEY) = {62ASN1_EMBED(BARE_PUBKEY, algor, BARE_ALGOR),63ASN1_SIMPLE(BARE_PUBKEY, pubkey, ASN1_BIT_STRING)64} static_ASN1_SEQUENCE_END(BARE_PUBKEY)65#endif /* OPENSSL_NO_SLH_DSA */6667struct der2key_ctx_st; /* Forward declaration */68typedef int check_key_fn(void *, struct der2key_ctx_st *ctx);69typedef void adjust_key_fn(void *, struct der2key_ctx_st *ctx);70typedef void free_key_fn(void *);71typedef void *d2i_PKCS8_fn(const unsigned char **, long,72struct der2key_ctx_st *);73typedef void *d2i_PUBKEY_fn(const unsigned char **, long,74struct der2key_ctx_st *);75struct keytype_desc_st {76const char *keytype_name;77const OSSL_DISPATCH *fns; /* Keymgmt (to pilfer functions from) */7879/* The input structure name */80const char *structure_name;8182/*83* The EVP_PKEY_xxx type macro. Should be zero for type specific84* structures, non-zero when the outermost structure is PKCS#8 or85* SubjectPublicKeyInfo. This determines which of the function86* pointers below will be used.87*/88int evp_type;8990/* The selection mask for OSSL_FUNC_decoder_does_selection() */91int selection_mask;9293/* For type specific decoders, we use the corresponding d2i */94d2i_of_void *d2i_private_key; /* From type-specific DER */95d2i_of_void *d2i_public_key; /* From type-specific DER */96d2i_of_void *d2i_key_params; /* From type-specific DER */97d2i_PKCS8_fn *d2i_PKCS8; /* Wrapped in a PrivateKeyInfo */98d2i_PUBKEY_fn *d2i_PUBKEY; /* Wrapped in a SubjectPublicKeyInfo */99100/*101* For any key, we may need to check that the key meets expectations.102* This is useful when the same functions can decode several variants103* of a key.104*/105check_key_fn *check_key;106107/*108* For any key, we may need to make provider specific adjustments, such109* as ensure the key carries the correct library context.110*/111adjust_key_fn *adjust_key;112/* {type}_free() */113free_key_fn *free_key;114};115116/*117* Context used for DER to key decoding.118*/119struct der2key_ctx_st {120PROV_CTX *provctx;121char propq[OSSL_MAX_PROPQUERY_SIZE];122const struct keytype_desc_st *desc;123/* The selection that is passed to der2key_decode() */124int selection;125/* Flag used to signal that a failure is fatal */126unsigned int flag_fatal : 1;127};128129typedef void *key_from_pkcs8_t(const PKCS8_PRIV_KEY_INFO *p8inf,130OSSL_LIB_CTX *libctx, const char *propq);131static void *der2key_decode_p8(const unsigned char **input_der,132long input_der_len, struct der2key_ctx_st *ctx,133key_from_pkcs8_t *key_from_pkcs8)134{135PKCS8_PRIV_KEY_INFO *p8inf = NULL;136const X509_ALGOR *alg = NULL;137void *key = NULL;138139if ((p8inf = d2i_PKCS8_PRIV_KEY_INFO(NULL, input_der, input_der_len)) != NULL140&& PKCS8_pkey_get0(NULL, NULL, NULL, &alg, p8inf)141&& (OBJ_obj2nid(alg->algorithm) == ctx->desc->evp_type142/* Allow decoding sm2 private key with id_ecPublicKey */143|| (OBJ_obj2nid(alg->algorithm) == NID_X9_62_id_ecPublicKey144&& ctx->desc->evp_type == NID_sm2)))145key = key_from_pkcs8(p8inf, PROV_LIBCTX_OF(ctx->provctx), ctx->propq);146PKCS8_PRIV_KEY_INFO_free(p8inf);147148return key;149}150151/* ---------------------------------------------------------------------- */152153static OSSL_FUNC_decoder_freectx_fn der2key_freectx;154static OSSL_FUNC_decoder_decode_fn der2key_decode;155static OSSL_FUNC_decoder_export_object_fn der2key_export_object;156static OSSL_FUNC_decoder_settable_ctx_params_fn der2key_settable_ctx_params;157static OSSL_FUNC_decoder_set_ctx_params_fn der2key_set_ctx_params;158159static struct der2key_ctx_st *160der2key_newctx(void *provctx, const struct keytype_desc_st *desc)161{162struct der2key_ctx_st *ctx = OPENSSL_zalloc(sizeof(*ctx));163164if (ctx != NULL) {165ctx->provctx = provctx;166ctx->desc = desc;167}168return ctx;169}170171static const OSSL_PARAM *der2key_settable_ctx_params(ossl_unused void *provctx)172{173static const OSSL_PARAM settables[] = {174OSSL_PARAM_utf8_string(OSSL_DECODER_PARAM_PROPERTIES, NULL, 0),175OSSL_PARAM_END176};177return settables;178}179180static int der2key_set_ctx_params(void *vctx, const OSSL_PARAM params[])181{182struct der2key_ctx_st *ctx = vctx;183const OSSL_PARAM *p;184char *str = ctx->propq;185186p = OSSL_PARAM_locate_const(params, OSSL_DECODER_PARAM_PROPERTIES);187if (p != NULL && !OSSL_PARAM_get_utf8_string(p, &str, sizeof(ctx->propq)))188return 0;189190return 1;191}192193static void der2key_freectx(void *vctx)194{195struct der2key_ctx_st *ctx = vctx;196197OPENSSL_free(ctx);198}199200static int der2key_check_selection(int selection,201const struct keytype_desc_st *desc)202{203/*204* The selections are kinda sorta "levels", i.e. each selection given205* here is assumed to include those following.206*/207int checks[] = {208OSSL_KEYMGMT_SELECT_PRIVATE_KEY,209OSSL_KEYMGMT_SELECT_PUBLIC_KEY,210OSSL_KEYMGMT_SELECT_ALL_PARAMETERS211};212size_t i;213214/* The decoder implementations made here support guessing */215if (selection == 0)216return 1;217218for (i = 0; i < OSSL_NELEM(checks); i++) {219int check1 = (selection & checks[i]) != 0;220int check2 = (desc->selection_mask & checks[i]) != 0;221222/*223* If the caller asked for the currently checked bit(s), return224* whether the decoder description says it's supported.225*/226if (check1)227return check2;228}229230/* This should be dead code, but just to be safe... */231return 0;232}233234static int der2key_decode(void *vctx, OSSL_CORE_BIO *cin, int selection,235OSSL_CALLBACK *data_cb, void *data_cbarg,236OSSL_PASSPHRASE_CALLBACK *pw_cb, void *pw_cbarg)237{238struct der2key_ctx_st *ctx = vctx;239unsigned char *der = NULL;240const unsigned char *derp;241long der_len = 0;242void *key = NULL;243int ok = 0;244245ctx->selection = selection;246/*247* The caller is allowed to specify 0 as a selection mask, to have the248* structure and key type guessed. For type-specific structures, this249* is not recommended, as some structures are very similar.250* Note that 0 isn't the same as OSSL_KEYMGMT_SELECT_ALL, as the latter251* signifies a private key structure, where everything else is assumed252* to be present as well.253*/254if (selection == 0)255selection = ctx->desc->selection_mask;256if ((selection & ctx->desc->selection_mask) == 0) {257ERR_raise(ERR_LIB_PROV, ERR_R_PASSED_INVALID_ARGUMENT);258return 0;259}260261ok = ossl_read_der(ctx->provctx, cin, &der, &der_len);262if (!ok)263goto next;264265ok = 0; /* Assume that we fail */266267ERR_set_mark();268if ((selection & OSSL_KEYMGMT_SELECT_PRIVATE_KEY) != 0) {269derp = der;270if (ctx->desc->d2i_PKCS8 != NULL) {271key = ctx->desc->d2i_PKCS8(&derp, der_len, ctx);272if (ctx->flag_fatal) {273ERR_clear_last_mark();274goto end;275}276} else if (ctx->desc->d2i_private_key != NULL) {277key = ctx->desc->d2i_private_key(NULL, &derp, der_len);278}279if (key == NULL && ctx->selection != 0) {280ERR_clear_last_mark();281goto next;282}283}284if (key == NULL && (selection & OSSL_KEYMGMT_SELECT_PUBLIC_KEY) != 0) {285derp = der;286if (ctx->desc->d2i_PUBKEY != NULL)287key = ctx->desc->d2i_PUBKEY(&derp, der_len, ctx);288else if (ctx->desc->d2i_public_key != NULL)289key = ctx->desc->d2i_public_key(NULL, &derp, der_len);290if (key == NULL && ctx->selection != 0) {291ERR_clear_last_mark();292goto next;293}294}295if (key == NULL && (selection & OSSL_KEYMGMT_SELECT_ALL_PARAMETERS) != 0) {296derp = der;297if (ctx->desc->d2i_key_params != NULL)298key = ctx->desc->d2i_key_params(NULL, &derp, der_len);299if (key == NULL && ctx->selection != 0) {300ERR_clear_last_mark();301goto next;302}303}304if (key == NULL)305ERR_clear_last_mark();306else307ERR_pop_to_mark();308309/*310* Last minute check to see if this was the correct type of key. This311* should never lead to a fatal error, i.e. the decoding itself was312* correct, it was just an unexpected key type. This is generally for313* classes of key types that have subtle variants, like RSA-PSS keys as314* opposed to plain RSA keys.315*/316if (key != NULL317&& ctx->desc->check_key != NULL318&& !ctx->desc->check_key(key, ctx)) {319ctx->desc->free_key(key);320key = NULL;321}322323if (key != NULL && ctx->desc->adjust_key != NULL)324ctx->desc->adjust_key(key, ctx);325326next:327/*328* Indicated that we successfully decoded something, or not at all.329* Ending up "empty handed" is not an error.330*/331ok = 1;332333/*334* We free memory here so it's not held up during the callback, because335* we know the process is recursive and the allocated chunks of memory336* add up.337*/338OPENSSL_free(der);339der = NULL;340341if (key != NULL) {342OSSL_PARAM params[4];343int object_type = OSSL_OBJECT_PKEY;344345params[0] = OSSL_PARAM_construct_int(OSSL_OBJECT_PARAM_TYPE, &object_type);346347#ifndef OPENSSL_NO_SM2348if (strcmp(ctx->desc->keytype_name, "EC") == 0349&& (EC_KEY_get_flags(key) & EC_FLAG_SM2_RANGE) != 0)350params[1] = OSSL_PARAM_construct_utf8_string(OSSL_OBJECT_PARAM_DATA_TYPE,351"SM2", 0);352else353#endif354params[1] = OSSL_PARAM_construct_utf8_string(OSSL_OBJECT_PARAM_DATA_TYPE,355(char *)ctx->desc->keytype_name,3560);357/* The address of the key becomes the octet string */358params[2] = OSSL_PARAM_construct_octet_string(OSSL_OBJECT_PARAM_REFERENCE,359&key, sizeof(key));360params[3] = OSSL_PARAM_construct_end();361362ok = data_cb(params, data_cbarg);363}364365end:366ctx->desc->free_key(key);367OPENSSL_free(der);368369return ok;370}371372static int der2key_export_object(void *vctx,373const void *reference, size_t reference_sz,374OSSL_CALLBACK *export_cb, void *export_cbarg)375{376struct der2key_ctx_st *ctx = vctx;377OSSL_FUNC_keymgmt_export_fn *export = ossl_prov_get_keymgmt_export(ctx->desc->fns);378void *keydata;379380if (reference_sz == sizeof(keydata) && export != NULL) {381int selection = ctx->selection;382383if (selection == 0)384selection = OSSL_KEYMGMT_SELECT_ALL;385/* The contents of the reference is the address to our object */386keydata = *(void **)reference;387388return export(keydata, selection, export_cb, export_cbarg);389}390return 0;391}392393#define D2I_PUBKEY_NOCTX(n, f) \394static void * \395n##_d2i_PUBKEY(const unsigned char **der, long der_len, \396ossl_unused struct der2key_ctx_st *ctx) \397{ \398return f(NULL, der, der_len); \399}400401/* ---------------------------------------------------------------------- */402403#ifndef OPENSSL_NO_DH404#define dh_evp_type EVP_PKEY_DH405#define dh_d2i_private_key NULL406#define dh_d2i_public_key NULL407#define dh_d2i_key_params (d2i_of_void *)d2i_DHparams408#define dh_free (free_key_fn *)DH_free409#define dh_check NULL410411static void *dh_d2i_PKCS8(const unsigned char **der, long der_len,412struct der2key_ctx_st *ctx)413{414return der2key_decode_p8(der, der_len, ctx,415(key_from_pkcs8_t *)ossl_dh_key_from_pkcs8);416}417418D2I_PUBKEY_NOCTX(dh, ossl_d2i_DH_PUBKEY)419D2I_PUBKEY_NOCTX(dhx, ossl_d2i_DHx_PUBKEY)420421static void dh_adjust(void *key, struct der2key_ctx_st *ctx)422{423ossl_dh_set0_libctx(key, PROV_LIBCTX_OF(ctx->provctx));424}425426#define dhx_evp_type EVP_PKEY_DHX427#define dhx_d2i_private_key NULL428#define dhx_d2i_public_key NULL429#define dhx_d2i_key_params (d2i_of_void *)d2i_DHxparams430#define dhx_d2i_PKCS8 dh_d2i_PKCS8431#define dhx_free (free_key_fn *)DH_free432#define dhx_check NULL433#define dhx_adjust dh_adjust434#endif435436/* ---------------------------------------------------------------------- */437438#ifndef OPENSSL_NO_DSA439#define dsa_evp_type EVP_PKEY_DSA440#define dsa_d2i_private_key (d2i_of_void *)d2i_DSAPrivateKey441#define dsa_d2i_public_key (d2i_of_void *)d2i_DSAPublicKey442#define dsa_d2i_key_params (d2i_of_void *)d2i_DSAparams443#define dsa_free (free_key_fn *)DSA_free444#define dsa_check NULL445446static void *dsa_d2i_PKCS8(const unsigned char **der, long der_len,447struct der2key_ctx_st *ctx)448{449return der2key_decode_p8(der, der_len, ctx,450(key_from_pkcs8_t *)ossl_dsa_key_from_pkcs8);451}452453D2I_PUBKEY_NOCTX(dsa, ossl_d2i_DSA_PUBKEY)454455static void dsa_adjust(void *key, struct der2key_ctx_st *ctx)456{457ossl_dsa_set0_libctx(key, PROV_LIBCTX_OF(ctx->provctx));458}459#endif460461/* ---------------------------------------------------------------------- */462463#ifndef OPENSSL_NO_EC464#define ec_evp_type EVP_PKEY_EC465#define ec_d2i_private_key (d2i_of_void *)d2i_ECPrivateKey466#define ec_d2i_public_key NULL467#define ec_d2i_key_params (d2i_of_void *)d2i_ECParameters468#define ec_free (free_key_fn *)EC_KEY_free469470static void *ec_d2i_PKCS8(const unsigned char **der, long der_len,471struct der2key_ctx_st *ctx)472{473return der2key_decode_p8(der, der_len, ctx,474(key_from_pkcs8_t *)ossl_ec_key_from_pkcs8);475}476477D2I_PUBKEY_NOCTX(ec, d2i_EC_PUBKEY)478479static int ec_check(void *key, struct der2key_ctx_st *ctx)480{481/* We're trying to be clever by comparing two truths */482int ret = 0;483int sm2 = (EC_KEY_get_flags(key) & EC_FLAG_SM2_RANGE) != 0;484485if (sm2)486ret = ctx->desc->evp_type == EVP_PKEY_SM2487|| ctx->desc->evp_type == NID_X9_62_id_ecPublicKey;488else489ret = ctx->desc->evp_type != EVP_PKEY_SM2;490491return ret;492}493494static void ec_adjust(void *key, struct der2key_ctx_st *ctx)495{496ossl_ec_key_set0_libctx(key, PROV_LIBCTX_OF(ctx->provctx));497}498499#ifndef OPENSSL_NO_ECX500/*501* ED25519, ED448, X25519, X448 only implement PKCS#8 and SubjectPublicKeyInfo,502* so no d2i functions to be had.503*/504505static void *ecx_d2i_PKCS8(const unsigned char **der, long der_len,506struct der2key_ctx_st *ctx)507{508return der2key_decode_p8(der, der_len, ctx,509(key_from_pkcs8_t *)ossl_ecx_key_from_pkcs8);510}511512D2I_PUBKEY_NOCTX(ed25519, ossl_d2i_ED25519_PUBKEY)513D2I_PUBKEY_NOCTX(ed448, ossl_d2i_ED448_PUBKEY)514D2I_PUBKEY_NOCTX(x25519, ossl_d2i_X25519_PUBKEY)515D2I_PUBKEY_NOCTX(x448, ossl_d2i_X448_PUBKEY)516517static void ecx_key_adjust(void *key, struct der2key_ctx_st *ctx)518{519ossl_ecx_key_set0_libctx(key, PROV_LIBCTX_OF(ctx->provctx));520}521522#define ed25519_evp_type EVP_PKEY_ED25519523#define ed25519_d2i_private_key NULL524#define ed25519_d2i_public_key NULL525#define ed25519_d2i_key_params NULL526#define ed25519_d2i_PKCS8 ecx_d2i_PKCS8527#define ed25519_free (free_key_fn *)ossl_ecx_key_free528#define ed25519_check NULL529#define ed25519_adjust ecx_key_adjust530531#define ed448_evp_type EVP_PKEY_ED448532#define ed448_d2i_private_key NULL533#define ed448_d2i_public_key NULL534#define ed448_d2i_key_params NULL535#define ed448_d2i_PKCS8 ecx_d2i_PKCS8536#define ed448_free (free_key_fn *)ossl_ecx_key_free537#define ed448_check NULL538#define ed448_adjust ecx_key_adjust539540#define x25519_evp_type EVP_PKEY_X25519541#define x25519_d2i_private_key NULL542#define x25519_d2i_public_key NULL543#define x25519_d2i_key_params NULL544#define x25519_d2i_PKCS8 ecx_d2i_PKCS8545#define x25519_free (free_key_fn *)ossl_ecx_key_free546#define x25519_check NULL547#define x25519_adjust ecx_key_adjust548549#define x448_evp_type EVP_PKEY_X448550#define x448_d2i_private_key NULL551#define x448_d2i_public_key NULL552#define x448_d2i_key_params NULL553#define x448_d2i_PKCS8 ecx_d2i_PKCS8554#define x448_free (free_key_fn *)ossl_ecx_key_free555#define x448_check NULL556#define x448_adjust ecx_key_adjust557#endif /* OPENSSL_NO_ECX */558559#ifndef OPENSSL_NO_SM2560#define sm2_evp_type EVP_PKEY_SM2561#define sm2_d2i_private_key (d2i_of_void *)d2i_ECPrivateKey562#define sm2_d2i_public_key NULL563#define sm2_d2i_key_params (d2i_of_void *)d2i_ECParameters564#define sm2_d2i_PUBKEY ec_d2i_PUBKEY565#define sm2_free (free_key_fn *)EC_KEY_free566#define sm2_check ec_check567#define sm2_adjust ec_adjust568569static void *sm2_d2i_PKCS8(const unsigned char **der, long der_len,570struct der2key_ctx_st *ctx)571{572return der2key_decode_p8(der, der_len, ctx,573(key_from_pkcs8_t *)ossl_ec_key_from_pkcs8);574}575#endif576577#endif578579/* ---------------------------------------------------------------------- */580581#ifndef OPENSSL_NO_ML_KEM582static void *583ml_kem_d2i_PKCS8(const uint8_t **der, long der_len, struct der2key_ctx_st *ctx)584{585ML_KEM_KEY *key;586587key = ossl_ml_kem_d2i_PKCS8(*der, der_len, ctx->desc->evp_type,588ctx->provctx, ctx->propq);589if (key != NULL)590*der += der_len;591return key;592}593594static ossl_inline void *595ml_kem_d2i_PUBKEY(const uint8_t **der, long der_len,596struct der2key_ctx_st *ctx)597{598ML_KEM_KEY *key;599600key = ossl_ml_kem_d2i_PUBKEY(*der, der_len, ctx->desc->evp_type,601ctx->provctx, ctx->propq);602if (key != NULL)603*der += der_len;604return key;605}606607#define ml_kem_512_evp_type EVP_PKEY_ML_KEM_512608#define ml_kem_512_d2i_private_key NULL609#define ml_kem_512_d2i_public_key NULL610#define ml_kem_512_d2i_key_params NULL611#define ml_kem_512_d2i_PUBKEY ml_kem_d2i_PUBKEY612#define ml_kem_512_d2i_PKCS8 ml_kem_d2i_PKCS8613#define ml_kem_512_free (free_key_fn *)ossl_ml_kem_key_free614#define ml_kem_512_check NULL615#define ml_kem_512_adjust NULL616617#define ml_kem_768_evp_type EVP_PKEY_ML_KEM_768618#define ml_kem_768_d2i_private_key NULL619#define ml_kem_768_d2i_public_key NULL620#define ml_kem_768_d2i_key_params NULL621#define ml_kem_768_d2i_PUBKEY ml_kem_d2i_PUBKEY622#define ml_kem_768_d2i_PKCS8 ml_kem_d2i_PKCS8623#define ml_kem_768_free (free_key_fn *)ossl_ml_kem_key_free624#define ml_kem_768_check NULL625#define ml_kem_768_adjust NULL626627#define ml_kem_1024_evp_type EVP_PKEY_ML_KEM_1024628#define ml_kem_1024_d2i_private_key NULL629#define ml_kem_1024_d2i_public_key NULL630#define ml_kem_1024_d2i_PUBKEY ml_kem_d2i_PUBKEY631#define ml_kem_1024_d2i_PKCS8 ml_kem_d2i_PKCS8632#define ml_kem_1024_d2i_key_params NULL633#define ml_kem_1024_free (free_key_fn *)ossl_ml_kem_key_free634#define ml_kem_1024_check NULL635#define ml_kem_1024_adjust NULL636637#endif638639#ifndef OPENSSL_NO_SLH_DSA640static void *641slh_dsa_d2i_PKCS8(const uint8_t **der, long der_len, struct der2key_ctx_st *ctx)642{643SLH_DSA_KEY *key = NULL, *ret = NULL;644OSSL_LIB_CTX *libctx = PROV_LIBCTX_OF(ctx->provctx);645PKCS8_PRIV_KEY_INFO *p8inf = NULL;646const unsigned char *p;647const X509_ALGOR *alg = NULL;648int plen, ptype;649650if ((p8inf = d2i_PKCS8_PRIV_KEY_INFO(NULL, der, der_len)) == NULL651|| !PKCS8_pkey_get0(NULL, &p, &plen, &alg, p8inf))652goto end;653654/* Algorithm parameters must be absent. */655if ((X509_ALGOR_get0(NULL, &ptype, NULL, alg), ptype != V_ASN1_UNDEF)) {656ERR_raise_data(ERR_LIB_PROV, PROV_R_UNEXPECTED_KEY_PARAMETERS,657"unexpected parameters with a PKCS#8 %s private key",658ctx->desc->keytype_name);659goto end;660}661if (OBJ_obj2nid(alg->algorithm) != ctx->desc->evp_type)662goto end;663if ((key = ossl_slh_dsa_key_new(libctx, ctx->propq,664ctx->desc->keytype_name))665== NULL)666goto end;667668if (!ossl_slh_dsa_set_priv(key, p, plen))669goto end;670ret = key;671end:672PKCS8_PRIV_KEY_INFO_free(p8inf);673if (ret == NULL)674ossl_slh_dsa_key_free(key);675return ret;676}677678static ossl_inline void *slh_dsa_d2i_PUBKEY(const uint8_t **der, long der_len,679struct der2key_ctx_st *ctx)680{681int ok = 0;682OSSL_LIB_CTX *libctx = PROV_LIBCTX_OF(ctx->provctx);683SLH_DSA_KEY *ret = NULL;684BARE_PUBKEY *spki = NULL;685const uint8_t *end = *der;686size_t len;687688ret = ossl_slh_dsa_key_new(libctx, ctx->propq, ctx->desc->keytype_name);689if (ret == NULL)690return NULL;691len = ossl_slh_dsa_key_get_pub_len(ret);692693/*-694* The DER ASN.1 encoding of SLH-DSA public keys prepends 18 bytes to the695* encoded public key (since the largest public key size is 64 bytes):696*697* - 2 byte outer sequence tag and length698* - 2 byte algorithm sequence tag and length699* - 2 byte algorithm OID tag and length700* - 9 byte algorithm OID701* - 2 byte bit string tag and length702* - 1 bitstring lead byte703*704* Check that we have the right OID, the bit string has no "bits left" and705* that we consume all the input exactly.706*/707if (der_len != 18 + (long)len) {708ERR_raise_data(ERR_LIB_PROV, PROV_R_BAD_ENCODING,709"unexpected %s public key length: %ld != %ld",710ctx->desc->keytype_name, der_len,71118 + (long)len);712goto err;713}714715if ((spki = OPENSSL_zalloc(sizeof(*spki))) == NULL)716goto err;717718/* The spki storage is freed on error */719if (ASN1_item_d2i_ex((ASN1_VALUE **)&spki, &end, der_len,720ASN1_ITEM_rptr(BARE_PUBKEY), NULL, NULL)721== NULL) {722ERR_raise_data(ERR_LIB_PROV, PROV_R_BAD_ENCODING,723"malformed %s public key ASN.1 encoding",724ossl_slh_dsa_key_get_name(ret));725goto err;726}727728/* The spki structure now owns some memory */729if ((spki->pubkey->flags & 0x7) != 0 || end != *der + der_len) {730ERR_raise_data(ERR_LIB_PROV, PROV_R_BAD_ENCODING,731"malformed %s public key ASN.1 encoding",732ossl_slh_dsa_key_get_name(ret));733goto err;734}735if (OBJ_cmp(OBJ_nid2obj(ctx->desc->evp_type), spki->algor.oid) != 0) {736ERR_raise_data(ERR_LIB_PROV, PROV_R_BAD_ENCODING,737"unexpected algorithm OID for an %s public key",738ossl_slh_dsa_key_get_name(ret));739goto err;740}741742if (!ossl_slh_dsa_set_pub(ret, spki->pubkey->data, spki->pubkey->length)) {743ERR_raise_data(ERR_LIB_PROV, PROV_R_BAD_ENCODING,744"failed to parse %s public key from the input data",745ossl_slh_dsa_key_get_name(ret));746goto err;747}748ok = 1;749err:750if (spki != NULL) {751ASN1_OBJECT_free(spki->algor.oid);752ASN1_BIT_STRING_free(spki->pubkey);753OPENSSL_free(spki);754}755if (!ok) {756ossl_slh_dsa_key_free(ret);757ret = NULL;758}759return ret;760}761762#define slh_dsa_sha2_128s_evp_type EVP_PKEY_SLH_DSA_SHA2_128S763#define slh_dsa_sha2_128s_d2i_private_key NULL764#define slh_dsa_sha2_128s_d2i_public_key NULL765#define slh_dsa_sha2_128s_d2i_key_params NULL766#define slh_dsa_sha2_128s_d2i_PKCS8 slh_dsa_d2i_PKCS8767#define slh_dsa_sha2_128s_d2i_PUBKEY slh_dsa_d2i_PUBKEY768#define slh_dsa_sha2_128s_free (free_key_fn *)ossl_slh_dsa_key_free769#define slh_dsa_sha2_128s_check NULL770#define slh_dsa_sha2_128s_adjust NULL771772#define slh_dsa_sha2_128f_evp_type EVP_PKEY_SLH_DSA_SHA2_128F773#define slh_dsa_sha2_128f_d2i_private_key NULL774#define slh_dsa_sha2_128f_d2i_public_key NULL775#define slh_dsa_sha2_128f_d2i_key_params NULL776#define slh_dsa_sha2_128f_d2i_PKCS8 slh_dsa_d2i_PKCS8777#define slh_dsa_sha2_128f_d2i_PUBKEY slh_dsa_d2i_PUBKEY778#define slh_dsa_sha2_128f_free (free_key_fn *)ossl_slh_dsa_key_free779#define slh_dsa_sha2_128f_check NULL780#define slh_dsa_sha2_128f_adjust NULL781782#define slh_dsa_sha2_192s_evp_type EVP_PKEY_SLH_DSA_SHA2_192S783#define slh_dsa_sha2_192s_d2i_private_key NULL784#define slh_dsa_sha2_192s_d2i_public_key NULL785#define slh_dsa_sha2_192s_d2i_key_params NULL786#define slh_dsa_sha2_192s_d2i_PKCS8 slh_dsa_d2i_PKCS8787#define slh_dsa_sha2_192s_d2i_PUBKEY slh_dsa_d2i_PUBKEY788#define slh_dsa_sha2_192s_free (free_key_fn *)ossl_slh_dsa_key_free789#define slh_dsa_sha2_192s_check NULL790#define slh_dsa_sha2_192s_adjust NULL791792#define slh_dsa_sha2_192f_evp_type EVP_PKEY_SLH_DSA_SHA2_192F793#define slh_dsa_sha2_192f_d2i_private_key NULL794#define slh_dsa_sha2_192f_d2i_public_key NULL795#define slh_dsa_sha2_192f_d2i_key_params NULL796#define slh_dsa_sha2_192f_d2i_PKCS8 slh_dsa_d2i_PKCS8797#define slh_dsa_sha2_192f_d2i_PUBKEY slh_dsa_d2i_PUBKEY798#define slh_dsa_sha2_192f_free (free_key_fn *)ossl_slh_dsa_key_free799#define slh_dsa_sha2_192f_check NULL800#define slh_dsa_sha2_192f_adjust NULL801802#define slh_dsa_sha2_256s_evp_type EVP_PKEY_SLH_DSA_SHA2_256S803#define slh_dsa_sha2_256s_d2i_private_key NULL804#define slh_dsa_sha2_256s_d2i_public_key NULL805#define slh_dsa_sha2_256s_d2i_key_params NULL806#define slh_dsa_sha2_256s_d2i_PKCS8 slh_dsa_d2i_PKCS8807#define slh_dsa_sha2_256s_d2i_PUBKEY slh_dsa_d2i_PUBKEY808#define slh_dsa_sha2_256s_free (free_key_fn *)ossl_slh_dsa_key_free809#define slh_dsa_sha2_256s_check NULL810#define slh_dsa_sha2_256s_adjust NULL811812#define slh_dsa_sha2_256f_evp_type EVP_PKEY_SLH_DSA_SHA2_256F813#define slh_dsa_sha2_256f_d2i_private_key NULL814#define slh_dsa_sha2_256f_d2i_public_key NULL815#define slh_dsa_sha2_256f_d2i_key_params NULL816#define slh_dsa_sha2_256f_d2i_PKCS8 slh_dsa_d2i_PKCS8817#define slh_dsa_sha2_256f_d2i_PUBKEY slh_dsa_d2i_PUBKEY818#define slh_dsa_sha2_256f_free (free_key_fn *)ossl_slh_dsa_key_free819#define slh_dsa_sha2_256f_check NULL820#define slh_dsa_sha2_256f_adjust NULL821822#define slh_dsa_shake_128s_evp_type EVP_PKEY_SLH_DSA_SHAKE_128S823#define slh_dsa_shake_128s_d2i_private_key NULL824#define slh_dsa_shake_128s_d2i_public_key NULL825#define slh_dsa_shake_128s_d2i_key_params NULL826#define slh_dsa_shake_128s_d2i_PKCS8 slh_dsa_d2i_PKCS8827#define slh_dsa_shake_128s_d2i_PUBKEY slh_dsa_d2i_PUBKEY828#define slh_dsa_shake_128s_free (free_key_fn *)ossl_slh_dsa_key_free829#define slh_dsa_shake_128s_check NULL830#define slh_dsa_shake_128s_adjust NULL831832#define slh_dsa_shake_128f_evp_type EVP_PKEY_SLH_DSA_SHAKE_128F833#define slh_dsa_shake_128f_d2i_private_key NULL834#define slh_dsa_shake_128f_d2i_public_key NULL835#define slh_dsa_shake_128f_d2i_key_params NULL836#define slh_dsa_shake_128f_d2i_PKCS8 slh_dsa_d2i_PKCS8837#define slh_dsa_shake_128f_d2i_PUBKEY slh_dsa_d2i_PUBKEY838#define slh_dsa_shake_128f_free (free_key_fn *)ossl_slh_dsa_key_free839#define slh_dsa_shake_128f_check NULL840#define slh_dsa_shake_128f_adjust NULL841842#define slh_dsa_shake_192s_evp_type EVP_PKEY_SLH_DSA_SHAKE_192S843#define slh_dsa_shake_192s_d2i_private_key NULL844#define slh_dsa_shake_192s_d2i_public_key NULL845#define slh_dsa_shake_192s_d2i_key_params NULL846#define slh_dsa_shake_192s_d2i_PKCS8 slh_dsa_d2i_PKCS8847#define slh_dsa_shake_192s_d2i_PUBKEY slh_dsa_d2i_PUBKEY848#define slh_dsa_shake_192s_free (free_key_fn *)ossl_slh_dsa_key_free849#define slh_dsa_shake_192s_check NULL850#define slh_dsa_shake_192s_adjust NULL851852#define slh_dsa_shake_192f_evp_type EVP_PKEY_SLH_DSA_SHAKE_192F853#define slh_dsa_shake_192f_d2i_private_key NULL854#define slh_dsa_shake_192f_d2i_public_key NULL855#define slh_dsa_shake_192f_d2i_key_params NULL856#define slh_dsa_shake_192f_d2i_PKCS8 slh_dsa_d2i_PKCS8857#define slh_dsa_shake_192f_d2i_PUBKEY slh_dsa_d2i_PUBKEY858#define slh_dsa_shake_192f_free (free_key_fn *)ossl_slh_dsa_key_free859#define slh_dsa_shake_192f_check NULL860#define slh_dsa_shake_192f_adjust NULL861862#define slh_dsa_shake_256s_evp_type EVP_PKEY_SLH_DSA_SHAKE_256S863#define slh_dsa_shake_256s_d2i_private_key NULL864#define slh_dsa_shake_256s_d2i_public_key NULL865#define slh_dsa_shake_256s_d2i_key_params NULL866#define slh_dsa_shake_256s_d2i_PKCS8 slh_dsa_d2i_PKCS8867#define slh_dsa_shake_256s_d2i_PUBKEY slh_dsa_d2i_PUBKEY868#define slh_dsa_shake_256s_free (free_key_fn *)ossl_slh_dsa_key_free869#define slh_dsa_shake_256s_check NULL870#define slh_dsa_shake_256s_adjust NULL871872#define slh_dsa_shake_256f_evp_type EVP_PKEY_SLH_DSA_SHAKE_256F873#define slh_dsa_shake_256f_d2i_private_key NULL874#define slh_dsa_shake_256f_d2i_public_key NULL875#define slh_dsa_shake_256f_d2i_key_params NULL876#define slh_dsa_shake_256f_d2i_PKCS8 slh_dsa_d2i_PKCS8877#define slh_dsa_shake_256f_d2i_PUBKEY slh_dsa_d2i_PUBKEY878#define slh_dsa_shake_256f_free (free_key_fn *)ossl_slh_dsa_key_free879#define slh_dsa_shake_256f_check NULL880#define slh_dsa_shake_256f_adjust NULL881#endif /* OPENSSL_NO_SLH_DSA */882883/* ---------------------------------------------------------------------- */884885#define rsa_evp_type EVP_PKEY_RSA886#define rsa_d2i_private_key (d2i_of_void *)d2i_RSAPrivateKey887#define rsa_d2i_public_key (d2i_of_void *)d2i_RSAPublicKey888#define rsa_d2i_key_params NULL889#define rsa_free (free_key_fn *)RSA_free890891static void *rsa_d2i_PKCS8(const unsigned char **der, long der_len,892struct der2key_ctx_st *ctx)893{894return der2key_decode_p8(der, der_len, ctx,895(key_from_pkcs8_t *)ossl_rsa_key_from_pkcs8);896}897898static void *899rsa_d2i_PUBKEY(const unsigned char **der, long der_len,900ossl_unused struct der2key_ctx_st *ctx)901{902return d2i_RSA_PUBKEY(NULL, der, der_len);903}904905static int rsa_check(void *key, struct der2key_ctx_st *ctx)906{907int valid;908909switch (RSA_test_flags(key, RSA_FLAG_TYPE_MASK)) {910case RSA_FLAG_TYPE_RSA:911valid = (ctx->desc->evp_type == EVP_PKEY_RSA);912break;913case RSA_FLAG_TYPE_RSASSAPSS:914valid = (ctx->desc->evp_type == EVP_PKEY_RSA_PSS);915break;916default:917/* Currently unsupported RSA key type */918valid = 0;919}920921valid = (valid && ossl_rsa_check_factors(key));922923return valid;924}925926static void rsa_adjust(void *key, struct der2key_ctx_st *ctx)927{928ossl_rsa_set0_libctx(key, PROV_LIBCTX_OF(ctx->provctx));929}930931#define rsapss_evp_type EVP_PKEY_RSA_PSS932#define rsapss_d2i_private_key (d2i_of_void *)d2i_RSAPrivateKey933#define rsapss_d2i_public_key (d2i_of_void *)d2i_RSAPublicKey934#define rsapss_d2i_key_params NULL935#define rsapss_d2i_PKCS8 rsa_d2i_PKCS8936#define rsapss_d2i_PUBKEY rsa_d2i_PUBKEY937#define rsapss_free (free_key_fn *)RSA_free938#define rsapss_check rsa_check939#define rsapss_adjust rsa_adjust940941/* ---------------------------------------------------------------------- */942943#ifndef OPENSSL_NO_ML_DSA944static void *945ml_dsa_d2i_PKCS8(const uint8_t **der, long der_len, struct der2key_ctx_st *ctx)946{947ML_DSA_KEY *key;948949key = ossl_ml_dsa_d2i_PKCS8(*der, der_len, ctx->desc->evp_type,950ctx->provctx, ctx->propq);951if (key != NULL)952*der += der_len;953return key;954}955956static ossl_inline void *ml_dsa_d2i_PUBKEY(const uint8_t **der, long der_len,957struct der2key_ctx_st *ctx)958{959ML_DSA_KEY *key;960961key = ossl_ml_dsa_d2i_PUBKEY(*der, der_len, ctx->desc->evp_type,962ctx->provctx, ctx->propq);963if (key != NULL)964*der += der_len;965return key;966}967968#define ml_dsa_44_evp_type EVP_PKEY_ML_DSA_44969#define ml_dsa_44_d2i_private_key NULL970#define ml_dsa_44_d2i_public_key NULL971#define ml_dsa_44_d2i_key_params NULL972#define ml_dsa_44_d2i_PUBKEY ml_dsa_d2i_PUBKEY973#define ml_dsa_44_d2i_PKCS8 ml_dsa_d2i_PKCS8974#define ml_dsa_44_free (free_key_fn *)ossl_ml_dsa_key_free975#define ml_dsa_44_check NULL976#define ml_dsa_44_adjust NULL977978#define ml_dsa_65_evp_type EVP_PKEY_ML_DSA_65979#define ml_dsa_65_d2i_private_key NULL980#define ml_dsa_65_d2i_public_key NULL981#define ml_dsa_65_d2i_key_params NULL982#define ml_dsa_65_d2i_PUBKEY ml_dsa_d2i_PUBKEY983#define ml_dsa_65_d2i_PKCS8 ml_dsa_d2i_PKCS8984#define ml_dsa_65_free (free_key_fn *)ossl_ml_dsa_key_free985#define ml_dsa_65_check NULL986#define ml_dsa_65_adjust NULL987988#define ml_dsa_87_evp_type EVP_PKEY_ML_DSA_87989#define ml_dsa_87_d2i_private_key NULL990#define ml_dsa_87_d2i_public_key NULL991#define ml_dsa_87_d2i_PUBKEY ml_dsa_d2i_PUBKEY992#define ml_dsa_87_d2i_PKCS8 ml_dsa_d2i_PKCS8993#define ml_dsa_87_d2i_key_params NULL994#define ml_dsa_87_free (free_key_fn *)ossl_ml_dsa_key_free995#define ml_dsa_87_check NULL996#define ml_dsa_87_adjust NULL997998#endif9991000/* ---------------------------------------------------------------------- */10011002/*1003* The DO_ macros help define the selection mask and the method functions1004* for each kind of object we want to decode.1005*/1006#define DO_type_specific_keypair(keytype) \1007"type-specific", keytype##_evp_type, \1008(OSSL_KEYMGMT_SELECT_KEYPAIR), \1009keytype##_d2i_private_key, \1010keytype##_d2i_public_key, \1011NULL, \1012NULL, \1013NULL, \1014keytype##_check, \1015keytype##_adjust, \1016keytype##_free10171018#define DO_type_specific_pub(keytype) \1019"type-specific", keytype##_evp_type, \1020(OSSL_KEYMGMT_SELECT_PUBLIC_KEY), \1021NULL, \1022keytype##_d2i_public_key, \1023NULL, \1024NULL, \1025NULL, \1026keytype##_check, \1027keytype##_adjust, \1028keytype##_free10291030#define DO_type_specific_priv(keytype) \1031"type-specific", keytype##_evp_type, \1032(OSSL_KEYMGMT_SELECT_PRIVATE_KEY), \1033keytype##_d2i_private_key, \1034NULL, \1035NULL, \1036NULL, \1037NULL, \1038keytype##_check, \1039keytype##_adjust, \1040keytype##_free10411042#define DO_type_specific_params(keytype) \1043"type-specific", keytype##_evp_type, \1044(OSSL_KEYMGMT_SELECT_ALL_PARAMETERS), \1045NULL, \1046NULL, \1047keytype##_d2i_key_params, \1048NULL, \1049NULL, \1050keytype##_check, \1051keytype##_adjust, \1052keytype##_free10531054#define DO_type_specific(keytype) \1055"type-specific", keytype##_evp_type, \1056(OSSL_KEYMGMT_SELECT_ALL), \1057keytype##_d2i_private_key, \1058keytype##_d2i_public_key, \1059keytype##_d2i_key_params, \1060NULL, \1061NULL, \1062keytype##_check, \1063keytype##_adjust, \1064keytype##_free10651066#define DO_type_specific_no_pub(keytype) \1067"type-specific", keytype##_evp_type, \1068(OSSL_KEYMGMT_SELECT_PRIVATE_KEY \1069| OSSL_KEYMGMT_SELECT_ALL_PARAMETERS), \1070keytype##_d2i_private_key, \1071NULL, \1072keytype##_d2i_key_params, \1073NULL, \1074NULL, \1075keytype##_check, \1076keytype##_adjust, \1077keytype##_free10781079#define DO_PrivateKeyInfo(keytype) \1080"PrivateKeyInfo", keytype##_evp_type, \1081(OSSL_KEYMGMT_SELECT_PRIVATE_KEY), \1082NULL, \1083NULL, \1084NULL, \1085keytype##_d2i_PKCS8, \1086NULL, \1087keytype##_check, \1088keytype##_adjust, \1089keytype##_free10901091#define DO_SubjectPublicKeyInfo(keytype) \1092"SubjectPublicKeyInfo", keytype##_evp_type, \1093(OSSL_KEYMGMT_SELECT_PUBLIC_KEY), \1094NULL, \1095NULL, \1096NULL, \1097NULL, \1098keytype##_d2i_PUBKEY, \1099keytype##_check, \1100keytype##_adjust, \1101keytype##_free11021103#define DO_DH(keytype) \1104"DH", keytype##_evp_type, \1105(OSSL_KEYMGMT_SELECT_ALL_PARAMETERS), \1106NULL, \1107NULL, \1108keytype##_d2i_key_params, \1109NULL, \1110NULL, \1111keytype##_check, \1112keytype##_adjust, \1113keytype##_free11141115#define DO_DHX(keytype) \1116"DHX", keytype##_evp_type, \1117(OSSL_KEYMGMT_SELECT_ALL_PARAMETERS), \1118NULL, \1119NULL, \1120keytype##_d2i_key_params, \1121NULL, \1122NULL, \1123keytype##_check, \1124keytype##_adjust, \1125keytype##_free11261127#define DO_DSA(keytype) \1128"DSA", keytype##_evp_type, \1129(OSSL_KEYMGMT_SELECT_ALL), \1130keytype##_d2i_private_key, \1131keytype##_d2i_public_key, \1132keytype##_d2i_key_params, \1133NULL, \1134NULL, \1135keytype##_check, \1136keytype##_adjust, \1137keytype##_free11381139#define DO_EC(keytype) \1140"EC", keytype##_evp_type, \1141(OSSL_KEYMGMT_SELECT_PRIVATE_KEY \1142| OSSL_KEYMGMT_SELECT_ALL_PARAMETERS), \1143keytype##_d2i_private_key, \1144NULL, \1145keytype##_d2i_key_params, \1146NULL, \1147NULL, \1148keytype##_check, \1149keytype##_adjust, \1150keytype##_free11511152#define DO_RSA(keytype) \1153"RSA", keytype##_evp_type, \1154(OSSL_KEYMGMT_SELECT_KEYPAIR), \1155keytype##_d2i_private_key, \1156keytype##_d2i_public_key, \1157NULL, \1158NULL, \1159NULL, \1160keytype##_check, \1161keytype##_adjust, \1162keytype##_free11631164/*1165* MAKE_DECODER is the single driver for creating OSSL_DISPATCH tables.1166* It takes the following arguments:1167*1168* keytype_name The implementation key type as a string.1169* keytype The implementation key type. This must correspond exactly1170* to our existing keymgmt keytype names... in other words,1171* there must exist an ossl_##keytype##_keymgmt_functions.1172* type The type name for the set of functions that implement the1173* decoder for the key type. This isn't necessarily the same1174* as keytype. For example, the key types ed25519, ed448,1175* x25519 and x448 are all handled by the same functions with1176* the common type name ecx.1177* kind The kind of support to implement. This translates into1178* the DO_##kind macros above, to populate the keytype_desc_st1179* structure.1180*/1181#define MAKE_DECODER(keytype_name, keytype, type, kind) \1182static const struct keytype_desc_st kind##_##keytype##_desc = { keytype_name, ossl_##keytype##_keymgmt_functions, \1183DO_##kind(keytype) }; \1184\1185static OSSL_FUNC_decoder_newctx_fn kind##_der2##keytype##_newctx; \1186\1187static void *kind##_der2##keytype##_newctx(void *provctx) \1188{ \1189return der2key_newctx(provctx, &kind##_##keytype##_desc); \1190} \1191static int kind##_der2##keytype##_does_selection(void *provctx, \1192int selection) \1193{ \1194return der2key_check_selection(selection, \1195&kind##_##keytype##_desc); \1196} \1197const OSSL_DISPATCH \1198ossl_##kind##_der_to_##keytype##_decoder_functions[] \1199= { \1200{ OSSL_FUNC_DECODER_NEWCTX, \1201(void (*)(void))kind##_der2##keytype##_newctx }, \1202{ OSSL_FUNC_DECODER_FREECTX, \1203(void (*)(void))der2key_freectx }, \1204{ OSSL_FUNC_DECODER_DOES_SELECTION, \1205(void (*)(void))kind##_der2##keytype##_does_selection }, \1206{ OSSL_FUNC_DECODER_DECODE, \1207(void (*)(void))der2key_decode }, \1208{ OSSL_FUNC_DECODER_EXPORT_OBJECT, \1209(void (*)(void))der2key_export_object }, \1210{ OSSL_FUNC_DECODER_SETTABLE_CTX_PARAMS, \1211(void (*)(void))der2key_settable_ctx_params }, \1212{ OSSL_FUNC_DECODER_SET_CTX_PARAMS, \1213(void (*)(void))der2key_set_ctx_params }, \1214OSSL_DISPATCH_END \1215}12161217#ifndef OPENSSL_NO_DH1218MAKE_DECODER("DH", dh, dh, PrivateKeyInfo);1219MAKE_DECODER("DH", dh, dh, SubjectPublicKeyInfo);1220MAKE_DECODER("DH", dh, dh, type_specific_params);1221MAKE_DECODER("DH", dh, dh, DH);1222MAKE_DECODER("DHX", dhx, dhx, PrivateKeyInfo);1223MAKE_DECODER("DHX", dhx, dhx, SubjectPublicKeyInfo);1224MAKE_DECODER("DHX", dhx, dhx, type_specific_params);1225MAKE_DECODER("DHX", dhx, dhx, DHX);1226#endif1227#ifndef OPENSSL_NO_DSA1228MAKE_DECODER("DSA", dsa, dsa, PrivateKeyInfo);1229MAKE_DECODER("DSA", dsa, dsa, SubjectPublicKeyInfo);1230MAKE_DECODER("DSA", dsa, dsa, type_specific);1231MAKE_DECODER("DSA", dsa, dsa, DSA);1232#endif1233#ifndef OPENSSL_NO_EC1234MAKE_DECODER("EC", ec, ec, PrivateKeyInfo);1235MAKE_DECODER("EC", ec, ec, SubjectPublicKeyInfo);1236MAKE_DECODER("EC", ec, ec, type_specific_no_pub);1237MAKE_DECODER("EC", ec, ec, EC);1238#ifndef OPENSSL_NO_ECX1239MAKE_DECODER("X25519", x25519, ecx, PrivateKeyInfo);1240MAKE_DECODER("X25519", x25519, ecx, SubjectPublicKeyInfo);1241MAKE_DECODER("X448", x448, ecx, PrivateKeyInfo);1242MAKE_DECODER("X448", x448, ecx, SubjectPublicKeyInfo);1243MAKE_DECODER("ED25519", ed25519, ecx, PrivateKeyInfo);1244MAKE_DECODER("ED25519", ed25519, ecx, SubjectPublicKeyInfo);1245MAKE_DECODER("ED448", ed448, ecx, PrivateKeyInfo);1246MAKE_DECODER("ED448", ed448, ecx, SubjectPublicKeyInfo);1247#endif1248#ifndef OPENSSL_NO_SM21249MAKE_DECODER("SM2", sm2, ec, PrivateKeyInfo);1250MAKE_DECODER("SM2", sm2, ec, SubjectPublicKeyInfo);1251MAKE_DECODER("SM2", sm2, sm2, type_specific_no_pub);1252#endif1253#endif1254#ifndef OPENSSL_NO_ML_KEM1255MAKE_DECODER("ML-KEM-512", ml_kem_512, ml_kem_512, PrivateKeyInfo);1256MAKE_DECODER("ML-KEM-512", ml_kem_512, ml_kem_512, SubjectPublicKeyInfo);1257MAKE_DECODER("ML-KEM-768", ml_kem_768, ml_kem_768, PrivateKeyInfo);1258MAKE_DECODER("ML-KEM-768", ml_kem_768, ml_kem_768, SubjectPublicKeyInfo);1259MAKE_DECODER("ML-KEM-1024", ml_kem_1024, ml_kem_1024, PrivateKeyInfo);1260MAKE_DECODER("ML-KEM-1024", ml_kem_1024, ml_kem_1024, SubjectPublicKeyInfo);1261#endif1262#ifndef OPENSSL_NO_SLH_DSA1263MAKE_DECODER("SLH-DSA-SHA2-128s", slh_dsa_sha2_128s, slh_dsa, PrivateKeyInfo);1264MAKE_DECODER("SLH-DSA-SHA2-128f", slh_dsa_sha2_128f, slh_dsa, PrivateKeyInfo);1265MAKE_DECODER("SLH-DSA-SHA2-192s", slh_dsa_sha2_192s, slh_dsa, PrivateKeyInfo);1266MAKE_DECODER("SLH-DSA-SHA2-192f", slh_dsa_sha2_192f, slh_dsa, PrivateKeyInfo);1267MAKE_DECODER("SLH-DSA-SHA2-256s", slh_dsa_sha2_256s, slh_dsa, PrivateKeyInfo);1268MAKE_DECODER("SLH-DSA-SHA2-256f", slh_dsa_sha2_256f, slh_dsa, PrivateKeyInfo);1269MAKE_DECODER("SLH-DSA-SHAKE-128s", slh_dsa_shake_128s, slh_dsa, PrivateKeyInfo);1270MAKE_DECODER("SLH-DSA-SHAKE-128f", slh_dsa_shake_128f, slh_dsa, PrivateKeyInfo);1271MAKE_DECODER("SLH-DSA-SHAKE-192s", slh_dsa_shake_192s, slh_dsa, PrivateKeyInfo);1272MAKE_DECODER("SLH-DSA-SHAKE-192f", slh_dsa_shake_192f, slh_dsa, PrivateKeyInfo);1273MAKE_DECODER("SLH-DSA-SHAKE-256s", slh_dsa_shake_256s, slh_dsa, PrivateKeyInfo);1274MAKE_DECODER("SLH-DSA-SHAKE-256f", slh_dsa_shake_256f, slh_dsa, PrivateKeyInfo);12751276MAKE_DECODER("SLH-DSA-SHA2-128s", slh_dsa_sha2_128s, slh_dsa, SubjectPublicKeyInfo);1277MAKE_DECODER("SLH-DSA-SHA2-128f", slh_dsa_sha2_128f, slh_dsa, SubjectPublicKeyInfo);1278MAKE_DECODER("SLH-DSA-SHA2-192s", slh_dsa_sha2_192s, slh_dsa, SubjectPublicKeyInfo);1279MAKE_DECODER("SLH-DSA-SHA2-192f", slh_dsa_sha2_192f, slh_dsa, SubjectPublicKeyInfo);1280MAKE_DECODER("SLH-DSA-SHA2-256s", slh_dsa_sha2_256s, slh_dsa, SubjectPublicKeyInfo);1281MAKE_DECODER("SLH-DSA-SHA2-256f", slh_dsa_sha2_256f, slh_dsa, SubjectPublicKeyInfo);1282MAKE_DECODER("SLH-DSA-SHAKE-128s", slh_dsa_shake_128s, slh_dsa, SubjectPublicKeyInfo);1283MAKE_DECODER("SLH-DSA-SHAKE-128f", slh_dsa_shake_128f, slh_dsa, SubjectPublicKeyInfo);1284MAKE_DECODER("SLH-DSA-SHAKE-192s", slh_dsa_shake_192s, slh_dsa, SubjectPublicKeyInfo);1285MAKE_DECODER("SLH-DSA-SHAKE-192f", slh_dsa_shake_192f, slh_dsa, SubjectPublicKeyInfo);1286MAKE_DECODER("SLH-DSA-SHAKE-256s", slh_dsa_shake_256s, slh_dsa, SubjectPublicKeyInfo);1287MAKE_DECODER("SLH-DSA-SHAKE-256f", slh_dsa_shake_256f, slh_dsa, SubjectPublicKeyInfo);1288#endif /* OPENSSL_NO_SLH_DSA */1289MAKE_DECODER("RSA", rsa, rsa, PrivateKeyInfo);1290MAKE_DECODER("RSA", rsa, rsa, SubjectPublicKeyInfo);1291MAKE_DECODER("RSA", rsa, rsa, type_specific_keypair);1292MAKE_DECODER("RSA", rsa, rsa, RSA);1293MAKE_DECODER("RSA-PSS", rsapss, rsapss, PrivateKeyInfo);1294MAKE_DECODER("RSA-PSS", rsapss, rsapss, SubjectPublicKeyInfo);12951296#ifndef OPENSSL_NO_ML_DSA1297MAKE_DECODER("ML-DSA-44", ml_dsa_44, ml_dsa_44, PrivateKeyInfo);1298MAKE_DECODER("ML-DSA-44", ml_dsa_44, ml_dsa_44, SubjectPublicKeyInfo);1299MAKE_DECODER("ML-DSA-65", ml_dsa_65, ml_dsa_65, PrivateKeyInfo);1300MAKE_DECODER("ML-DSA-65", ml_dsa_65, ml_dsa_65, SubjectPublicKeyInfo);1301MAKE_DECODER("ML-DSA-87", ml_dsa_87, ml_dsa_87, PrivateKeyInfo);1302MAKE_DECODER("ML-DSA-87", ml_dsa_87, ml_dsa_87, SubjectPublicKeyInfo);1303#endif130413051306