Path: blob/main/crypto/openssl/providers/implementations/encode_decode/decode_der2key.c
48383 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] =346OSSL_PARAM_construct_int(OSSL_OBJECT_PARAM_TYPE, &object_type);347348#ifndef OPENSSL_NO_SM2349if (strcmp(ctx->desc->keytype_name, "EC") == 0350&& (EC_KEY_get_flags(key) & EC_FLAG_SM2_RANGE) != 0)351params[1] =352OSSL_PARAM_construct_utf8_string(OSSL_OBJECT_PARAM_DATA_TYPE,353"SM2", 0);354else355#endif356params[1] =357OSSL_PARAM_construct_utf8_string(OSSL_OBJECT_PARAM_DATA_TYPE,358(char *)ctx->desc->keytype_name,3590);360/* The address of the key becomes the octet string */361params[2] =362OSSL_PARAM_construct_octet_string(OSSL_OBJECT_PARAM_REFERENCE,363&key, sizeof(key));364params[3] = OSSL_PARAM_construct_end();365366ok = data_cb(params, data_cbarg);367}368369end:370ctx->desc->free_key(key);371OPENSSL_free(der);372373return ok;374}375376static int der2key_export_object(void *vctx,377const void *reference, size_t reference_sz,378OSSL_CALLBACK *export_cb, void *export_cbarg)379{380struct der2key_ctx_st *ctx = vctx;381OSSL_FUNC_keymgmt_export_fn *export =382ossl_prov_get_keymgmt_export(ctx->desc->fns);383void *keydata;384385if (reference_sz == sizeof(keydata) && export != NULL) {386int selection = ctx->selection;387388if (selection == 0)389selection = OSSL_KEYMGMT_SELECT_ALL;390/* The contents of the reference is the address to our object */391keydata = *(void **)reference;392393return export(keydata, selection, export_cb, export_cbarg);394}395return 0;396}397398#define D2I_PUBKEY_NOCTX(n, f) \399static void * \400n##_d2i_PUBKEY(const unsigned char **der, long der_len, \401ossl_unused struct der2key_ctx_st *ctx) \402{ \403return f(NULL, der, der_len); \404}405406/* ---------------------------------------------------------------------- */407408#ifndef OPENSSL_NO_DH409# define dh_evp_type EVP_PKEY_DH410# define dh_d2i_private_key NULL411# define dh_d2i_public_key NULL412# define dh_d2i_key_params (d2i_of_void *)d2i_DHparams413# define dh_free (free_key_fn *)DH_free414# define dh_check NULL415416static void *dh_d2i_PKCS8(const unsigned char **der, long der_len,417struct der2key_ctx_st *ctx)418{419return der2key_decode_p8(der, der_len, ctx,420(key_from_pkcs8_t *)ossl_dh_key_from_pkcs8);421}422423D2I_PUBKEY_NOCTX(dh, ossl_d2i_DH_PUBKEY)424D2I_PUBKEY_NOCTX(dhx, ossl_d2i_DHx_PUBKEY)425426static void dh_adjust(void *key, struct der2key_ctx_st *ctx)427{428ossl_dh_set0_libctx(key, PROV_LIBCTX_OF(ctx->provctx));429}430431# define dhx_evp_type EVP_PKEY_DHX432# define dhx_d2i_private_key NULL433# define dhx_d2i_public_key NULL434# define dhx_d2i_key_params (d2i_of_void *)d2i_DHxparams435# define dhx_d2i_PKCS8 dh_d2i_PKCS8436# define dhx_free (free_key_fn *)DH_free437# define dhx_check NULL438# define dhx_adjust dh_adjust439#endif440441/* ---------------------------------------------------------------------- */442443#ifndef OPENSSL_NO_DSA444# define dsa_evp_type EVP_PKEY_DSA445# define dsa_d2i_private_key (d2i_of_void *)d2i_DSAPrivateKey446# define dsa_d2i_public_key (d2i_of_void *)d2i_DSAPublicKey447# define dsa_d2i_key_params (d2i_of_void *)d2i_DSAparams448# define dsa_free (free_key_fn *)DSA_free449# define dsa_check NULL450451static void *dsa_d2i_PKCS8(const unsigned char **der, long der_len,452struct der2key_ctx_st *ctx)453{454return der2key_decode_p8(der, der_len, ctx,455(key_from_pkcs8_t *)ossl_dsa_key_from_pkcs8);456}457458D2I_PUBKEY_NOCTX(dsa, ossl_d2i_DSA_PUBKEY)459460static void dsa_adjust(void *key, struct der2key_ctx_st *ctx)461{462ossl_dsa_set0_libctx(key, PROV_LIBCTX_OF(ctx->provctx));463}464#endif465466/* ---------------------------------------------------------------------- */467468#ifndef OPENSSL_NO_EC469# define ec_evp_type EVP_PKEY_EC470# define ec_d2i_private_key (d2i_of_void *)d2i_ECPrivateKey471# define ec_d2i_public_key NULL472# define ec_d2i_key_params (d2i_of_void *)d2i_ECParameters473# define ec_free (free_key_fn *)EC_KEY_free474475static void *ec_d2i_PKCS8(const unsigned char **der, long der_len,476struct der2key_ctx_st *ctx)477{478return der2key_decode_p8(der, der_len, ctx,479(key_from_pkcs8_t *)ossl_ec_key_from_pkcs8);480}481482D2I_PUBKEY_NOCTX(ec, d2i_EC_PUBKEY)483484static int ec_check(void *key, struct der2key_ctx_st *ctx)485{486/* We're trying to be clever by comparing two truths */487int ret = 0;488int sm2 = (EC_KEY_get_flags(key) & EC_FLAG_SM2_RANGE) != 0;489490if (sm2)491ret = ctx->desc->evp_type == EVP_PKEY_SM2492|| ctx->desc->evp_type == NID_X9_62_id_ecPublicKey;493else494ret = ctx->desc->evp_type != EVP_PKEY_SM2;495496return ret;497}498499static void ec_adjust(void *key, struct der2key_ctx_st *ctx)500{501ossl_ec_key_set0_libctx(key, PROV_LIBCTX_OF(ctx->provctx));502}503504# ifndef OPENSSL_NO_ECX505/*506* ED25519, ED448, X25519, X448 only implement PKCS#8 and SubjectPublicKeyInfo,507* so no d2i functions to be had.508*/509510static void *ecx_d2i_PKCS8(const unsigned char **der, long der_len,511struct der2key_ctx_st *ctx)512{513return der2key_decode_p8(der, der_len, ctx,514(key_from_pkcs8_t *)ossl_ecx_key_from_pkcs8);515}516517D2I_PUBKEY_NOCTX(ed25519, ossl_d2i_ED25519_PUBKEY)518D2I_PUBKEY_NOCTX(ed448, ossl_d2i_ED448_PUBKEY)519D2I_PUBKEY_NOCTX(x25519, ossl_d2i_X25519_PUBKEY)520D2I_PUBKEY_NOCTX(x448, ossl_d2i_X448_PUBKEY)521522static void ecx_key_adjust(void *key, struct der2key_ctx_st *ctx)523{524ossl_ecx_key_set0_libctx(key, PROV_LIBCTX_OF(ctx->provctx));525}526527# define ed25519_evp_type EVP_PKEY_ED25519528# define ed25519_d2i_private_key NULL529# define ed25519_d2i_public_key NULL530# define ed25519_d2i_key_params NULL531# define ed25519_d2i_PKCS8 ecx_d2i_PKCS8532# define ed25519_free (free_key_fn *)ossl_ecx_key_free533# define ed25519_check NULL534# define ed25519_adjust ecx_key_adjust535536# define ed448_evp_type EVP_PKEY_ED448537# define ed448_d2i_private_key NULL538# define ed448_d2i_public_key NULL539# define ed448_d2i_key_params NULL540# define ed448_d2i_PKCS8 ecx_d2i_PKCS8541# define ed448_free (free_key_fn *)ossl_ecx_key_free542# define ed448_check NULL543# define ed448_adjust ecx_key_adjust544545# define x25519_evp_type EVP_PKEY_X25519546# define x25519_d2i_private_key NULL547# define x25519_d2i_public_key NULL548# define x25519_d2i_key_params NULL549# define x25519_d2i_PKCS8 ecx_d2i_PKCS8550# define x25519_free (free_key_fn *)ossl_ecx_key_free551# define x25519_check NULL552# define x25519_adjust ecx_key_adjust553554# define x448_evp_type EVP_PKEY_X448555# define x448_d2i_private_key NULL556# define x448_d2i_public_key NULL557# define x448_d2i_key_params NULL558# define x448_d2i_PKCS8 ecx_d2i_PKCS8559# define x448_free (free_key_fn *)ossl_ecx_key_free560# define x448_check NULL561# define x448_adjust ecx_key_adjust562# endif /* OPENSSL_NO_ECX */563564# ifndef OPENSSL_NO_SM2565# define sm2_evp_type EVP_PKEY_SM2566# define sm2_d2i_private_key (d2i_of_void *)d2i_ECPrivateKey567# define sm2_d2i_public_key NULL568# define sm2_d2i_key_params (d2i_of_void *)d2i_ECParameters569# define sm2_d2i_PUBKEY ec_d2i_PUBKEY570# define sm2_free (free_key_fn *)EC_KEY_free571# define sm2_check ec_check572# define sm2_adjust ec_adjust573574static void *sm2_d2i_PKCS8(const unsigned char **der, long der_len,575struct der2key_ctx_st *ctx)576{577return der2key_decode_p8(der, der_len, ctx,578(key_from_pkcs8_t *)ossl_ec_key_from_pkcs8);579}580# endif581582#endif583584/* ---------------------------------------------------------------------- */585586#ifndef OPENSSL_NO_ML_KEM587static void *588ml_kem_d2i_PKCS8(const uint8_t **der, long der_len, struct der2key_ctx_st *ctx)589{590ML_KEM_KEY *key;591592key = ossl_ml_kem_d2i_PKCS8(*der, der_len, ctx->desc->evp_type,593ctx->provctx, ctx->propq);594if (key != NULL)595*der += der_len;596return key;597}598599static ossl_inline void *600ml_kem_d2i_PUBKEY(const uint8_t **der, long der_len,601struct der2key_ctx_st *ctx)602{603ML_KEM_KEY *key;604605key = ossl_ml_kem_d2i_PUBKEY(*der, der_len, ctx->desc->evp_type,606ctx->provctx, ctx->propq);607if (key != NULL)608*der += der_len;609return key;610}611612# define ml_kem_512_evp_type EVP_PKEY_ML_KEM_512613# define ml_kem_512_d2i_private_key NULL614# define ml_kem_512_d2i_public_key NULL615# define ml_kem_512_d2i_key_params NULL616# define ml_kem_512_d2i_PUBKEY ml_kem_d2i_PUBKEY617# define ml_kem_512_d2i_PKCS8 ml_kem_d2i_PKCS8618# define ml_kem_512_free (free_key_fn *)ossl_ml_kem_key_free619# define ml_kem_512_check NULL620# define ml_kem_512_adjust NULL621622# define ml_kem_768_evp_type EVP_PKEY_ML_KEM_768623# define ml_kem_768_d2i_private_key NULL624# define ml_kem_768_d2i_public_key NULL625# define ml_kem_768_d2i_key_params NULL626# define ml_kem_768_d2i_PUBKEY ml_kem_d2i_PUBKEY627# define ml_kem_768_d2i_PKCS8 ml_kem_d2i_PKCS8628# define ml_kem_768_free (free_key_fn *)ossl_ml_kem_key_free629# define ml_kem_768_check NULL630# define ml_kem_768_adjust NULL631632# define ml_kem_1024_evp_type EVP_PKEY_ML_KEM_1024633# define ml_kem_1024_d2i_private_key NULL634# define ml_kem_1024_d2i_public_key NULL635# define ml_kem_1024_d2i_PUBKEY ml_kem_d2i_PUBKEY636# define ml_kem_1024_d2i_PKCS8 ml_kem_d2i_PKCS8637# define ml_kem_1024_d2i_key_params NULL638# define ml_kem_1024_free (free_key_fn *)ossl_ml_kem_key_free639# define ml_kem_1024_check NULL640# define ml_kem_1024_adjust NULL641642#endif643644#ifndef OPENSSL_NO_SLH_DSA645static void *646slh_dsa_d2i_PKCS8(const uint8_t **der, long der_len, struct der2key_ctx_st *ctx)647{648SLH_DSA_KEY *key = NULL, *ret = NULL;649OSSL_LIB_CTX *libctx = PROV_LIBCTX_OF(ctx->provctx);650PKCS8_PRIV_KEY_INFO *p8inf = NULL;651const unsigned char *p;652const X509_ALGOR *alg = NULL;653int plen, ptype;654655if ((p8inf = d2i_PKCS8_PRIV_KEY_INFO(NULL, der, der_len)) == NULL656|| !PKCS8_pkey_get0(NULL, &p, &plen, &alg, p8inf))657goto end;658659/* Algorithm parameters must be absent. */660if ((X509_ALGOR_get0(NULL, &ptype, NULL, alg), ptype != V_ASN1_UNDEF)) {661ERR_raise_data(ERR_LIB_PROV, PROV_R_UNEXPECTED_KEY_PARAMETERS,662"unexpected parameters with a PKCS#8 %s private key",663ctx->desc->keytype_name);664goto end;665}666if (OBJ_obj2nid(alg->algorithm) != ctx->desc->evp_type)667goto end;668if ((key = ossl_slh_dsa_key_new(libctx, ctx->propq,669ctx->desc->keytype_name)) == NULL)670goto end;671672if (!ossl_slh_dsa_set_priv(key, p, plen))673goto end;674ret = key;675end:676PKCS8_PRIV_KEY_INFO_free(p8inf);677if (ret == NULL)678ossl_slh_dsa_key_free(key);679return ret;680}681682static ossl_inline void *slh_dsa_d2i_PUBKEY(const uint8_t **der, long der_len,683struct der2key_ctx_st *ctx)684{685int ok = 0;686OSSL_LIB_CTX *libctx = PROV_LIBCTX_OF(ctx->provctx);687SLH_DSA_KEY *ret = NULL;688BARE_PUBKEY *spki = NULL;689const uint8_t *end = *der;690size_t len;691692ret = ossl_slh_dsa_key_new(libctx, ctx->propq, ctx->desc->keytype_name);693if (ret == NULL)694return NULL;695len = ossl_slh_dsa_key_get_pub_len(ret);696697/*-698* The DER ASN.1 encoding of SLH-DSA public keys prepends 18 bytes to the699* encoded public key (since the largest public key size is 64 bytes):700*701* - 2 byte outer sequence tag and length702* - 2 byte algorithm sequence tag and length703* - 2 byte algorithm OID tag and length704* - 9 byte algorithm OID705* - 2 byte bit string tag and length706* - 1 bitstring lead byte707*708* Check that we have the right OID, the bit string has no "bits left" and709* that we consume all the input exactly.710*/711if (der_len != 18 + (long)len) {712ERR_raise_data(ERR_LIB_PROV, PROV_R_BAD_ENCODING,713"unexpected %s public key length: %ld != %ld",714ctx->desc->keytype_name, der_len,71518 + (long)len);716goto err;717}718719if ((spki = OPENSSL_zalloc(sizeof(*spki))) == NULL)720goto err;721722/* The spki storage is freed on error */723if (ASN1_item_d2i_ex((ASN1_VALUE **)&spki, &end, der_len,724ASN1_ITEM_rptr(BARE_PUBKEY), NULL, NULL) == NULL) {725ERR_raise_data(ERR_LIB_PROV, PROV_R_BAD_ENCODING,726"malformed %s public key ASN.1 encoding",727ossl_slh_dsa_key_get_name(ret));728goto err;729}730731/* The spki structure now owns some memory */732if ((spki->pubkey->flags & 0x7) != 0 || end != *der + der_len) {733ERR_raise_data(ERR_LIB_PROV, PROV_R_BAD_ENCODING,734"malformed %s public key ASN.1 encoding",735ossl_slh_dsa_key_get_name(ret));736goto err;737}738if (OBJ_cmp(OBJ_nid2obj(ctx->desc->evp_type), spki->algor.oid) != 0) {739ERR_raise_data(ERR_LIB_PROV, PROV_R_BAD_ENCODING,740"unexpected algorithm OID for an %s public key",741ossl_slh_dsa_key_get_name(ret));742goto err;743}744745if (!ossl_slh_dsa_set_pub(ret, spki->pubkey->data, spki->pubkey->length)) {746ERR_raise_data(ERR_LIB_PROV, PROV_R_BAD_ENCODING,747"failed to parse %s public key from the input data",748ossl_slh_dsa_key_get_name(ret));749goto err;750}751ok = 1;752err:753if (spki != NULL) {754ASN1_OBJECT_free(spki->algor.oid);755ASN1_BIT_STRING_free(spki->pubkey);756OPENSSL_free(spki);757}758if (!ok) {759ossl_slh_dsa_key_free(ret);760ret = NULL;761}762return ret;763}764765# define slh_dsa_sha2_128s_evp_type EVP_PKEY_SLH_DSA_SHA2_128S766# define slh_dsa_sha2_128s_d2i_private_key NULL767# define slh_dsa_sha2_128s_d2i_public_key NULL768# define slh_dsa_sha2_128s_d2i_key_params NULL769# define slh_dsa_sha2_128s_d2i_PKCS8 slh_dsa_d2i_PKCS8770# define slh_dsa_sha2_128s_d2i_PUBKEY slh_dsa_d2i_PUBKEY771# define slh_dsa_sha2_128s_free (free_key_fn *)ossl_slh_dsa_key_free772# define slh_dsa_sha2_128s_check NULL773# define slh_dsa_sha2_128s_adjust NULL774775# define slh_dsa_sha2_128f_evp_type EVP_PKEY_SLH_DSA_SHA2_128F776# define slh_dsa_sha2_128f_d2i_private_key NULL777# define slh_dsa_sha2_128f_d2i_public_key NULL778# define slh_dsa_sha2_128f_d2i_key_params NULL779# define slh_dsa_sha2_128f_d2i_PKCS8 slh_dsa_d2i_PKCS8780# define slh_dsa_sha2_128f_d2i_PUBKEY slh_dsa_d2i_PUBKEY781# define slh_dsa_sha2_128f_free (free_key_fn *)ossl_slh_dsa_key_free782# define slh_dsa_sha2_128f_check NULL783# define slh_dsa_sha2_128f_adjust NULL784785# define slh_dsa_sha2_192s_evp_type EVP_PKEY_SLH_DSA_SHA2_192S786# define slh_dsa_sha2_192s_d2i_private_key NULL787# define slh_dsa_sha2_192s_d2i_public_key NULL788# define slh_dsa_sha2_192s_d2i_key_params NULL789# define slh_dsa_sha2_192s_d2i_PKCS8 slh_dsa_d2i_PKCS8790# define slh_dsa_sha2_192s_d2i_PUBKEY slh_dsa_d2i_PUBKEY791# define slh_dsa_sha2_192s_free (free_key_fn *)ossl_slh_dsa_key_free792# define slh_dsa_sha2_192s_check NULL793# define slh_dsa_sha2_192s_adjust NULL794795# define slh_dsa_sha2_192f_evp_type EVP_PKEY_SLH_DSA_SHA2_192F796# define slh_dsa_sha2_192f_d2i_private_key NULL797# define slh_dsa_sha2_192f_d2i_public_key NULL798# define slh_dsa_sha2_192f_d2i_key_params NULL799# define slh_dsa_sha2_192f_d2i_PKCS8 slh_dsa_d2i_PKCS8800# define slh_dsa_sha2_192f_d2i_PUBKEY slh_dsa_d2i_PUBKEY801# define slh_dsa_sha2_192f_free (free_key_fn *)ossl_slh_dsa_key_free802# define slh_dsa_sha2_192f_check NULL803# define slh_dsa_sha2_192f_adjust NULL804805# define slh_dsa_sha2_256s_evp_type EVP_PKEY_SLH_DSA_SHA2_256S806# define slh_dsa_sha2_256s_d2i_private_key NULL807# define slh_dsa_sha2_256s_d2i_public_key NULL808# define slh_dsa_sha2_256s_d2i_key_params NULL809# define slh_dsa_sha2_256s_d2i_PKCS8 slh_dsa_d2i_PKCS8810# define slh_dsa_sha2_256s_d2i_PUBKEY slh_dsa_d2i_PUBKEY811# define slh_dsa_sha2_256s_free (free_key_fn *)ossl_slh_dsa_key_free812# define slh_dsa_sha2_256s_check NULL813# define slh_dsa_sha2_256s_adjust NULL814815# define slh_dsa_sha2_256f_evp_type EVP_PKEY_SLH_DSA_SHA2_256F816# define slh_dsa_sha2_256f_d2i_private_key NULL817# define slh_dsa_sha2_256f_d2i_public_key NULL818# define slh_dsa_sha2_256f_d2i_key_params NULL819# define slh_dsa_sha2_256f_d2i_PKCS8 slh_dsa_d2i_PKCS8820# define slh_dsa_sha2_256f_d2i_PUBKEY slh_dsa_d2i_PUBKEY821# define slh_dsa_sha2_256f_free (free_key_fn *)ossl_slh_dsa_key_free822# define slh_dsa_sha2_256f_check NULL823# define slh_dsa_sha2_256f_adjust NULL824825# define slh_dsa_shake_128s_evp_type EVP_PKEY_SLH_DSA_SHAKE_128S826# define slh_dsa_shake_128s_d2i_private_key NULL827# define slh_dsa_shake_128s_d2i_public_key NULL828# define slh_dsa_shake_128s_d2i_key_params NULL829# define slh_dsa_shake_128s_d2i_PKCS8 slh_dsa_d2i_PKCS8830# define slh_dsa_shake_128s_d2i_PUBKEY slh_dsa_d2i_PUBKEY831# define slh_dsa_shake_128s_free (free_key_fn *)ossl_slh_dsa_key_free832# define slh_dsa_shake_128s_check NULL833# define slh_dsa_shake_128s_adjust NULL834835# define slh_dsa_shake_128f_evp_type EVP_PKEY_SLH_DSA_SHAKE_128F836# define slh_dsa_shake_128f_d2i_private_key NULL837# define slh_dsa_shake_128f_d2i_public_key NULL838# define slh_dsa_shake_128f_d2i_key_params NULL839# define slh_dsa_shake_128f_d2i_PKCS8 slh_dsa_d2i_PKCS8840# define slh_dsa_shake_128f_d2i_PUBKEY slh_dsa_d2i_PUBKEY841# define slh_dsa_shake_128f_free (free_key_fn *)ossl_slh_dsa_key_free842# define slh_dsa_shake_128f_check NULL843# define slh_dsa_shake_128f_adjust NULL844845# define slh_dsa_shake_192s_evp_type EVP_PKEY_SLH_DSA_SHAKE_192S846# define slh_dsa_shake_192s_d2i_private_key NULL847# define slh_dsa_shake_192s_d2i_public_key NULL848# define slh_dsa_shake_192s_d2i_key_params NULL849# define slh_dsa_shake_192s_d2i_PKCS8 slh_dsa_d2i_PKCS8850# define slh_dsa_shake_192s_d2i_PUBKEY slh_dsa_d2i_PUBKEY851# define slh_dsa_shake_192s_free (free_key_fn *)ossl_slh_dsa_key_free852# define slh_dsa_shake_192s_check NULL853# define slh_dsa_shake_192s_adjust NULL854855# define slh_dsa_shake_192f_evp_type EVP_PKEY_SLH_DSA_SHAKE_192F856# define slh_dsa_shake_192f_d2i_private_key NULL857# define slh_dsa_shake_192f_d2i_public_key NULL858# define slh_dsa_shake_192f_d2i_key_params NULL859# define slh_dsa_shake_192f_d2i_PKCS8 slh_dsa_d2i_PKCS8860# define slh_dsa_shake_192f_d2i_PUBKEY slh_dsa_d2i_PUBKEY861# define slh_dsa_shake_192f_free (free_key_fn *)ossl_slh_dsa_key_free862# define slh_dsa_shake_192f_check NULL863# define slh_dsa_shake_192f_adjust NULL864865# define slh_dsa_shake_256s_evp_type EVP_PKEY_SLH_DSA_SHAKE_256S866# define slh_dsa_shake_256s_d2i_private_key NULL867# define slh_dsa_shake_256s_d2i_public_key NULL868# define slh_dsa_shake_256s_d2i_key_params NULL869# define slh_dsa_shake_256s_d2i_PKCS8 slh_dsa_d2i_PKCS8870# define slh_dsa_shake_256s_d2i_PUBKEY slh_dsa_d2i_PUBKEY871# define slh_dsa_shake_256s_free (free_key_fn *)ossl_slh_dsa_key_free872# define slh_dsa_shake_256s_check NULL873# define slh_dsa_shake_256s_adjust NULL874875# define slh_dsa_shake_256f_evp_type EVP_PKEY_SLH_DSA_SHAKE_256F876# define slh_dsa_shake_256f_d2i_private_key NULL877# define slh_dsa_shake_256f_d2i_public_key NULL878# define slh_dsa_shake_256f_d2i_key_params NULL879# define slh_dsa_shake_256f_d2i_PKCS8 slh_dsa_d2i_PKCS8880# define slh_dsa_shake_256f_d2i_PUBKEY slh_dsa_d2i_PUBKEY881# define slh_dsa_shake_256f_free (free_key_fn *)ossl_slh_dsa_key_free882# define slh_dsa_shake_256f_check NULL883# define slh_dsa_shake_256f_adjust NULL884#endif /* OPENSSL_NO_SLH_DSA */885886/* ---------------------------------------------------------------------- */887888#define rsa_evp_type EVP_PKEY_RSA889#define rsa_d2i_private_key (d2i_of_void *)d2i_RSAPrivateKey890#define rsa_d2i_public_key (d2i_of_void *)d2i_RSAPublicKey891#define rsa_d2i_key_params NULL892#define rsa_free (free_key_fn *)RSA_free893894static void *rsa_d2i_PKCS8(const unsigned char **der, long der_len,895struct der2key_ctx_st *ctx)896{897return der2key_decode_p8(der, der_len, ctx,898(key_from_pkcs8_t *)ossl_rsa_key_from_pkcs8);899}900901static void *902rsa_d2i_PUBKEY(const unsigned char **der, long der_len,903ossl_unused struct der2key_ctx_st *ctx)904{905return d2i_RSA_PUBKEY(NULL, der, der_len);906}907908static int rsa_check(void *key, struct der2key_ctx_st *ctx)909{910int valid;911912switch (RSA_test_flags(key, RSA_FLAG_TYPE_MASK)) {913case RSA_FLAG_TYPE_RSA:914valid = (ctx->desc->evp_type == EVP_PKEY_RSA);915break;916case RSA_FLAG_TYPE_RSASSAPSS:917valid = (ctx->desc->evp_type == EVP_PKEY_RSA_PSS);918break;919default:920/* Currently unsupported RSA key type */921valid = 0;922}923924valid = (valid && ossl_rsa_check_factors(key));925926return valid;927}928929static void rsa_adjust(void *key, struct der2key_ctx_st *ctx)930{931ossl_rsa_set0_libctx(key, PROV_LIBCTX_OF(ctx->provctx));932}933934#define rsapss_evp_type EVP_PKEY_RSA_PSS935#define rsapss_d2i_private_key (d2i_of_void *)d2i_RSAPrivateKey936#define rsapss_d2i_public_key (d2i_of_void *)d2i_RSAPublicKey937#define rsapss_d2i_key_params NULL938#define rsapss_d2i_PKCS8 rsa_d2i_PKCS8939#define rsapss_d2i_PUBKEY rsa_d2i_PUBKEY940#define rsapss_free (free_key_fn *)RSA_free941#define rsapss_check rsa_check942#define rsapss_adjust rsa_adjust943944/* ---------------------------------------------------------------------- */945946#ifndef OPENSSL_NO_ML_DSA947static void *948ml_dsa_d2i_PKCS8(const uint8_t **der, long der_len, struct der2key_ctx_st *ctx)949{950ML_DSA_KEY *key;951952key = ossl_ml_dsa_d2i_PKCS8(*der, der_len, ctx->desc->evp_type,953ctx->provctx, ctx->propq);954if (key != NULL)955*der += der_len;956return key;957}958959static ossl_inline void * ml_dsa_d2i_PUBKEY(const uint8_t **der, long der_len,960struct der2key_ctx_st *ctx)961{962ML_DSA_KEY *key;963964key = ossl_ml_dsa_d2i_PUBKEY(*der, der_len, ctx->desc->evp_type,965ctx->provctx, ctx->propq);966if (key != NULL)967*der += der_len;968return key;969}970971# define ml_dsa_44_evp_type EVP_PKEY_ML_DSA_44972# define ml_dsa_44_d2i_private_key NULL973# define ml_dsa_44_d2i_public_key NULL974# define ml_dsa_44_d2i_key_params NULL975# define ml_dsa_44_d2i_PUBKEY ml_dsa_d2i_PUBKEY976# define ml_dsa_44_d2i_PKCS8 ml_dsa_d2i_PKCS8977# define ml_dsa_44_free (free_key_fn *)ossl_ml_dsa_key_free978# define ml_dsa_44_check NULL979# define ml_dsa_44_adjust NULL980981# define ml_dsa_65_evp_type EVP_PKEY_ML_DSA_65982# define ml_dsa_65_d2i_private_key NULL983# define ml_dsa_65_d2i_public_key NULL984# define ml_dsa_65_d2i_key_params NULL985# define ml_dsa_65_d2i_PUBKEY ml_dsa_d2i_PUBKEY986# define ml_dsa_65_d2i_PKCS8 ml_dsa_d2i_PKCS8987# define ml_dsa_65_free (free_key_fn *)ossl_ml_dsa_key_free988# define ml_dsa_65_check NULL989# define ml_dsa_65_adjust NULL990991# define ml_dsa_87_evp_type EVP_PKEY_ML_DSA_87992# define ml_dsa_87_d2i_private_key NULL993# define ml_dsa_87_d2i_public_key NULL994# define ml_dsa_87_d2i_PUBKEY ml_dsa_d2i_PUBKEY995# define ml_dsa_87_d2i_PKCS8 ml_dsa_d2i_PKCS8996# define ml_dsa_87_d2i_key_params NULL997# define ml_dsa_87_free (free_key_fn *)ossl_ml_dsa_key_free998# define ml_dsa_87_check NULL999# define ml_dsa_87_adjust NULL10001001#endif10021003/* ---------------------------------------------------------------------- */10041005/*1006* The DO_ macros help define the selection mask and the method functions1007* for each kind of object we want to decode.1008*/1009#define DO_type_specific_keypair(keytype) \1010"type-specific", keytype##_evp_type, \1011( OSSL_KEYMGMT_SELECT_KEYPAIR ), \1012keytype##_d2i_private_key, \1013keytype##_d2i_public_key, \1014NULL, \1015NULL, \1016NULL, \1017keytype##_check, \1018keytype##_adjust, \1019keytype##_free10201021#define DO_type_specific_pub(keytype) \1022"type-specific", keytype##_evp_type, \1023( OSSL_KEYMGMT_SELECT_PUBLIC_KEY ), \1024NULL, \1025keytype##_d2i_public_key, \1026NULL, \1027NULL, \1028NULL, \1029keytype##_check, \1030keytype##_adjust, \1031keytype##_free10321033#define DO_type_specific_priv(keytype) \1034"type-specific", keytype##_evp_type, \1035( OSSL_KEYMGMT_SELECT_PRIVATE_KEY ), \1036keytype##_d2i_private_key, \1037NULL, \1038NULL, \1039NULL, \1040NULL, \1041keytype##_check, \1042keytype##_adjust, \1043keytype##_free10441045#define DO_type_specific_params(keytype) \1046"type-specific", keytype##_evp_type, \1047( OSSL_KEYMGMT_SELECT_ALL_PARAMETERS ), \1048NULL, \1049NULL, \1050keytype##_d2i_key_params, \1051NULL, \1052NULL, \1053keytype##_check, \1054keytype##_adjust, \1055keytype##_free10561057#define DO_type_specific(keytype) \1058"type-specific", keytype##_evp_type, \1059( OSSL_KEYMGMT_SELECT_ALL ), \1060keytype##_d2i_private_key, \1061keytype##_d2i_public_key, \1062keytype##_d2i_key_params, \1063NULL, \1064NULL, \1065keytype##_check, \1066keytype##_adjust, \1067keytype##_free10681069#define DO_type_specific_no_pub(keytype) \1070"type-specific", keytype##_evp_type, \1071( OSSL_KEYMGMT_SELECT_PRIVATE_KEY \1072| OSSL_KEYMGMT_SELECT_ALL_PARAMETERS ), \1073keytype##_d2i_private_key, \1074NULL, \1075keytype##_d2i_key_params, \1076NULL, \1077NULL, \1078keytype##_check, \1079keytype##_adjust, \1080keytype##_free10811082#define DO_PrivateKeyInfo(keytype) \1083"PrivateKeyInfo", keytype##_evp_type, \1084( OSSL_KEYMGMT_SELECT_PRIVATE_KEY ), \1085NULL, \1086NULL, \1087NULL, \1088keytype##_d2i_PKCS8, \1089NULL, \1090keytype##_check, \1091keytype##_adjust, \1092keytype##_free10931094#define DO_SubjectPublicKeyInfo(keytype) \1095"SubjectPublicKeyInfo", keytype##_evp_type, \1096( OSSL_KEYMGMT_SELECT_PUBLIC_KEY ), \1097NULL, \1098NULL, \1099NULL, \1100NULL, \1101keytype##_d2i_PUBKEY, \1102keytype##_check, \1103keytype##_adjust, \1104keytype##_free11051106#define DO_DH(keytype) \1107"DH", keytype##_evp_type, \1108( OSSL_KEYMGMT_SELECT_ALL_PARAMETERS ), \1109NULL, \1110NULL, \1111keytype##_d2i_key_params, \1112NULL, \1113NULL, \1114keytype##_check, \1115keytype##_adjust, \1116keytype##_free11171118#define DO_DHX(keytype) \1119"DHX", keytype##_evp_type, \1120( OSSL_KEYMGMT_SELECT_ALL_PARAMETERS ), \1121NULL, \1122NULL, \1123keytype##_d2i_key_params, \1124NULL, \1125NULL, \1126keytype##_check, \1127keytype##_adjust, \1128keytype##_free11291130#define DO_DSA(keytype) \1131"DSA", keytype##_evp_type, \1132( OSSL_KEYMGMT_SELECT_ALL ), \1133keytype##_d2i_private_key, \1134keytype##_d2i_public_key, \1135keytype##_d2i_key_params, \1136NULL, \1137NULL, \1138keytype##_check, \1139keytype##_adjust, \1140keytype##_free11411142#define DO_EC(keytype) \1143"EC", keytype##_evp_type, \1144( OSSL_KEYMGMT_SELECT_PRIVATE_KEY \1145| OSSL_KEYMGMT_SELECT_ALL_PARAMETERS ), \1146keytype##_d2i_private_key, \1147NULL, \1148keytype##_d2i_key_params, \1149NULL, \1150NULL, \1151keytype##_check, \1152keytype##_adjust, \1153keytype##_free11541155#define DO_RSA(keytype) \1156"RSA", keytype##_evp_type, \1157( OSSL_KEYMGMT_SELECT_KEYPAIR ), \1158keytype##_d2i_private_key, \1159keytype##_d2i_public_key, \1160NULL, \1161NULL, \1162NULL, \1163keytype##_check, \1164keytype##_adjust, \1165keytype##_free11661167/*1168* MAKE_DECODER is the single driver for creating OSSL_DISPATCH tables.1169* It takes the following arguments:1170*1171* keytype_name The implementation key type as a string.1172* keytype The implementation key type. This must correspond exactly1173* to our existing keymgmt keytype names... in other words,1174* there must exist an ossl_##keytype##_keymgmt_functions.1175* type The type name for the set of functions that implement the1176* decoder for the key type. This isn't necessarily the same1177* as keytype. For example, the key types ed25519, ed448,1178* x25519 and x448 are all handled by the same functions with1179* the common type name ecx.1180* kind The kind of support to implement. This translates into1181* the DO_##kind macros above, to populate the keytype_desc_st1182* structure.1183*/1184#define MAKE_DECODER(keytype_name, keytype, type, kind) \1185static const struct keytype_desc_st kind##_##keytype##_desc = \1186{ keytype_name, ossl_##keytype##_keymgmt_functions, \1187DO_##kind(keytype) }; \1188\1189static OSSL_FUNC_decoder_newctx_fn kind##_der2##keytype##_newctx; \1190\1191static void *kind##_der2##keytype##_newctx(void *provctx) \1192{ \1193return der2key_newctx(provctx, &kind##_##keytype##_desc); \1194} \1195static int kind##_der2##keytype##_does_selection(void *provctx, \1196int selection) \1197{ \1198return der2key_check_selection(selection, \1199&kind##_##keytype##_desc); \1200} \1201const OSSL_DISPATCH \1202ossl_##kind##_der_to_##keytype##_decoder_functions[] = { \1203{ OSSL_FUNC_DECODER_NEWCTX, \1204(void (*)(void))kind##_der2##keytype##_newctx }, \1205{ OSSL_FUNC_DECODER_FREECTX, \1206(void (*)(void))der2key_freectx }, \1207{ OSSL_FUNC_DECODER_DOES_SELECTION, \1208(void (*)(void))kind##_der2##keytype##_does_selection }, \1209{ OSSL_FUNC_DECODER_DECODE, \1210(void (*)(void))der2key_decode }, \1211{ OSSL_FUNC_DECODER_EXPORT_OBJECT, \1212(void (*)(void))der2key_export_object }, \1213{ OSSL_FUNC_DECODER_SETTABLE_CTX_PARAMS, \1214(void (*)(void))der2key_settable_ctx_params }, \1215{ OSSL_FUNC_DECODER_SET_CTX_PARAMS, \1216(void (*)(void))der2key_set_ctx_params }, \1217OSSL_DISPATCH_END \1218}12191220#ifndef OPENSSL_NO_DH1221MAKE_DECODER("DH", dh, dh, PrivateKeyInfo);1222MAKE_DECODER("DH", dh, dh, SubjectPublicKeyInfo);1223MAKE_DECODER("DH", dh, dh, type_specific_params);1224MAKE_DECODER("DH", dh, dh, DH);1225MAKE_DECODER("DHX", dhx, dhx, PrivateKeyInfo);1226MAKE_DECODER("DHX", dhx, dhx, SubjectPublicKeyInfo);1227MAKE_DECODER("DHX", dhx, dhx, type_specific_params);1228MAKE_DECODER("DHX", dhx, dhx, DHX);1229#endif1230#ifndef OPENSSL_NO_DSA1231MAKE_DECODER("DSA", dsa, dsa, PrivateKeyInfo);1232MAKE_DECODER("DSA", dsa, dsa, SubjectPublicKeyInfo);1233MAKE_DECODER("DSA", dsa, dsa, type_specific);1234MAKE_DECODER("DSA", dsa, dsa, DSA);1235#endif1236#ifndef OPENSSL_NO_EC1237MAKE_DECODER("EC", ec, ec, PrivateKeyInfo);1238MAKE_DECODER("EC", ec, ec, SubjectPublicKeyInfo);1239MAKE_DECODER("EC", ec, ec, type_specific_no_pub);1240MAKE_DECODER("EC", ec, ec, EC);1241# ifndef OPENSSL_NO_ECX1242MAKE_DECODER("X25519", x25519, ecx, PrivateKeyInfo);1243MAKE_DECODER("X25519", x25519, ecx, SubjectPublicKeyInfo);1244MAKE_DECODER("X448", x448, ecx, PrivateKeyInfo);1245MAKE_DECODER("X448", x448, ecx, SubjectPublicKeyInfo);1246MAKE_DECODER("ED25519", ed25519, ecx, PrivateKeyInfo);1247MAKE_DECODER("ED25519", ed25519, ecx, SubjectPublicKeyInfo);1248MAKE_DECODER("ED448", ed448, ecx, PrivateKeyInfo);1249MAKE_DECODER("ED448", ed448, ecx, SubjectPublicKeyInfo);1250# endif1251# ifndef OPENSSL_NO_SM21252MAKE_DECODER("SM2", sm2, ec, PrivateKeyInfo);1253MAKE_DECODER("SM2", sm2, ec, SubjectPublicKeyInfo);1254MAKE_DECODER("SM2", sm2, sm2, type_specific_no_pub);1255# endif1256#endif1257#ifndef OPENSSL_NO_ML_KEM1258MAKE_DECODER("ML-KEM-512", ml_kem_512, ml_kem_512, PrivateKeyInfo);1259MAKE_DECODER("ML-KEM-512", ml_kem_512, ml_kem_512, SubjectPublicKeyInfo);1260MAKE_DECODER("ML-KEM-768", ml_kem_768, ml_kem_768, PrivateKeyInfo);1261MAKE_DECODER("ML-KEM-768", ml_kem_768, ml_kem_768, SubjectPublicKeyInfo);1262MAKE_DECODER("ML-KEM-1024", ml_kem_1024, ml_kem_1024, PrivateKeyInfo);1263MAKE_DECODER("ML-KEM-1024", ml_kem_1024, ml_kem_1024, SubjectPublicKeyInfo);1264#endif1265#ifndef OPENSSL_NO_SLH_DSA1266MAKE_DECODER("SLH-DSA-SHA2-128s", slh_dsa_sha2_128s, slh_dsa, PrivateKeyInfo);1267MAKE_DECODER("SLH-DSA-SHA2-128f", slh_dsa_sha2_128f, slh_dsa, PrivateKeyInfo);1268MAKE_DECODER("SLH-DSA-SHA2-192s", slh_dsa_sha2_192s, slh_dsa, PrivateKeyInfo);1269MAKE_DECODER("SLH-DSA-SHA2-192f", slh_dsa_sha2_192f, slh_dsa, PrivateKeyInfo);1270MAKE_DECODER("SLH-DSA-SHA2-256s", slh_dsa_sha2_256s, slh_dsa, PrivateKeyInfo);1271MAKE_DECODER("SLH-DSA-SHA2-256f", slh_dsa_sha2_256f, slh_dsa, PrivateKeyInfo);1272MAKE_DECODER("SLH-DSA-SHAKE-128s", slh_dsa_shake_128s, slh_dsa, PrivateKeyInfo);1273MAKE_DECODER("SLH-DSA-SHAKE-128f", slh_dsa_shake_128f, slh_dsa, PrivateKeyInfo);1274MAKE_DECODER("SLH-DSA-SHAKE-192s", slh_dsa_shake_192s, slh_dsa, PrivateKeyInfo);1275MAKE_DECODER("SLH-DSA-SHAKE-192f", slh_dsa_shake_192f, slh_dsa, PrivateKeyInfo);1276MAKE_DECODER("SLH-DSA-SHAKE-256s", slh_dsa_shake_256s, slh_dsa, PrivateKeyInfo);1277MAKE_DECODER("SLH-DSA-SHAKE-256f", slh_dsa_shake_256f, slh_dsa, PrivateKeyInfo);12781279MAKE_DECODER("SLH-DSA-SHA2-128s", slh_dsa_sha2_128s, slh_dsa, SubjectPublicKeyInfo);1280MAKE_DECODER("SLH-DSA-SHA2-128f", slh_dsa_sha2_128f, slh_dsa, SubjectPublicKeyInfo);1281MAKE_DECODER("SLH-DSA-SHA2-192s", slh_dsa_sha2_192s, slh_dsa, SubjectPublicKeyInfo);1282MAKE_DECODER("SLH-DSA-SHA2-192f", slh_dsa_sha2_192f, slh_dsa, SubjectPublicKeyInfo);1283MAKE_DECODER("SLH-DSA-SHA2-256s", slh_dsa_sha2_256s, slh_dsa, SubjectPublicKeyInfo);1284MAKE_DECODER("SLH-DSA-SHA2-256f", slh_dsa_sha2_256f, slh_dsa, SubjectPublicKeyInfo);1285MAKE_DECODER("SLH-DSA-SHAKE-128s", slh_dsa_shake_128s, slh_dsa, SubjectPublicKeyInfo);1286MAKE_DECODER("SLH-DSA-SHAKE-128f", slh_dsa_shake_128f, slh_dsa, SubjectPublicKeyInfo);1287MAKE_DECODER("SLH-DSA-SHAKE-192s", slh_dsa_shake_192s, slh_dsa, SubjectPublicKeyInfo);1288MAKE_DECODER("SLH-DSA-SHAKE-192f", slh_dsa_shake_192f, slh_dsa, SubjectPublicKeyInfo);1289MAKE_DECODER("SLH-DSA-SHAKE-256s", slh_dsa_shake_256s, slh_dsa, SubjectPublicKeyInfo);1290MAKE_DECODER("SLH-DSA-SHAKE-256f", slh_dsa_shake_256f, slh_dsa, SubjectPublicKeyInfo);1291#endif /* OPENSSL_NO_SLH_DSA */1292MAKE_DECODER("RSA", rsa, rsa, PrivateKeyInfo);1293MAKE_DECODER("RSA", rsa, rsa, SubjectPublicKeyInfo);1294MAKE_DECODER("RSA", rsa, rsa, type_specific_keypair);1295MAKE_DECODER("RSA", rsa, rsa, RSA);1296MAKE_DECODER("RSA-PSS", rsapss, rsapss, PrivateKeyInfo);1297MAKE_DECODER("RSA-PSS", rsapss, rsapss, SubjectPublicKeyInfo);12981299#ifndef OPENSSL_NO_ML_DSA1300MAKE_DECODER("ML-DSA-44", ml_dsa_44, ml_dsa_44, PrivateKeyInfo);1301MAKE_DECODER("ML-DSA-44", ml_dsa_44, ml_dsa_44, SubjectPublicKeyInfo);1302MAKE_DECODER("ML-DSA-65", ml_dsa_65, ml_dsa_65, PrivateKeyInfo);1303MAKE_DECODER("ML-DSA-65", ml_dsa_65, ml_dsa_65, SubjectPublicKeyInfo);1304MAKE_DECODER("ML-DSA-87", ml_dsa_87, ml_dsa_87, PrivateKeyInfo);1305MAKE_DECODER("ML-DSA-87", ml_dsa_87, ml_dsa_87, SubjectPublicKeyInfo);1306#endif130713081309