Path: blob/main/crypto/openssl/providers/implementations/encode_decode/encode_key2any.c
103743 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 for internal use.11*/12#include "internal/deprecated.h"1314#include <openssl/byteorder.h>15#include <openssl/core.h>16#include <openssl/core_dispatch.h>17#include <openssl/core_names.h>18#include <openssl/crypto.h>19#include <openssl/params.h>20#include <openssl/asn1.h>21#include <openssl/err.h>22#include <openssl/pem.h>23#include <openssl/x509.h>24#include <openssl/pkcs12.h> /* PKCS8_encrypt() */25#include <openssl/dh.h>26#include <openssl/dsa.h>27#include <openssl/ec.h>28#include <openssl/proverr.h>29#include "internal/passphrase.h"30#include "internal/cryptlib.h"31#include "crypto/ecx.h"32#include "crypto/ml_kem.h"33#include "crypto/rsa.h"34#include "crypto/ml_dsa.h"35#include "crypto/slh_dsa.h"36#include "prov/implementations.h"37#include "prov/bio.h"38#include "prov/provider_ctx.h"39#include "prov/der_rsa.h"40#include "endecoder_local.h"41#include "ml_dsa_codecs.h"42#include "ml_kem_codecs.h"4344#if defined(OPENSSL_NO_DH) && defined(OPENSSL_NO_DSA) && defined(OPENSSL_NO_EC)45#define OPENSSL_NO_KEYPARAMS46#endif4748typedef struct key2any_ctx_st {49PROV_CTX *provctx;5051/* Set to 0 if parameters should not be saved (dsa only) */52int save_parameters;5354/* Set to 1 if intending to encrypt/decrypt, otherwise 0 */55int cipher_intent;5657EVP_CIPHER *cipher;5859struct ossl_passphrase_data_st pwdata;60} KEY2ANY_CTX;6162typedef int check_key_type_fn(const void *key, int nid);63typedef int key_to_paramstring_fn(const void *key, int nid, int save,64void **str, int *strtype);65typedef int key_to_der_fn(BIO *out, const void *key,66int key_nid, const char *pemname,67key_to_paramstring_fn *p2s,68OSSL_i2d_of_void_ctx *k2d, KEY2ANY_CTX *ctx);69typedef int write_bio_of_void_fn(BIO *bp, const void *x);7071/* Free the blob allocated during key_to_paramstring_fn */72static void free_asn1_data(int type, void *data)73{74switch (type) {75case V_ASN1_OBJECT:76ASN1_OBJECT_free(data);77break;78case V_ASN1_SEQUENCE:79ASN1_STRING_free(data);80break;81}82}8384static PKCS8_PRIV_KEY_INFO *key_to_p8info(const void *key, int key_nid,85void *params, int params_type,86OSSL_i2d_of_void_ctx *k2d,87KEY2ANY_CTX *ctx)88{89/* der, derlen store the key DER output and its length */90unsigned char *der = NULL;91int derlen;92/* The final PKCS#8 info */93PKCS8_PRIV_KEY_INFO *p8info = NULL;9495if ((p8info = PKCS8_PRIV_KEY_INFO_new()) == NULL96|| (derlen = k2d(key, &der, (void *)ctx)) <= 097|| !PKCS8_pkey_set0(p8info, OBJ_nid2obj(key_nid), 0,98params_type, params, der, derlen)) {99ERR_raise(ERR_LIB_PROV, ERR_R_ASN1_LIB);100PKCS8_PRIV_KEY_INFO_free(p8info);101OPENSSL_free(der);102p8info = NULL;103}104105return p8info;106}107108static X509_SIG *p8info_to_encp8(PKCS8_PRIV_KEY_INFO *p8info,109KEY2ANY_CTX *ctx)110{111X509_SIG *p8 = NULL;112char kstr[PEM_BUFSIZE];113size_t klen = 0;114OSSL_LIB_CTX *libctx = PROV_LIBCTX_OF(ctx->provctx);115116if (ctx->cipher == NULL)117return NULL;118119if (!ossl_pw_get_passphrase(kstr, sizeof(kstr), &klen, NULL, 1,120&ctx->pwdata)) {121ERR_raise(ERR_LIB_PROV, PROV_R_UNABLE_TO_GET_PASSPHRASE);122return NULL;123}124/* First argument == -1 means "standard" */125p8 = PKCS8_encrypt_ex(-1, ctx->cipher, kstr, klen, NULL, 0, 0, p8info, libctx, NULL);126OPENSSL_cleanse(kstr, klen);127return p8;128}129130static X509_SIG *key_to_encp8(const void *key, int key_nid,131void *params, int params_type,132OSSL_i2d_of_void_ctx *k2d,133KEY2ANY_CTX *ctx)134{135PKCS8_PRIV_KEY_INFO *p8info = key_to_p8info(key, key_nid, params, params_type, k2d, ctx);136X509_SIG *p8 = NULL;137138if (p8info == NULL) {139free_asn1_data(params_type, params);140} else {141p8 = p8info_to_encp8(p8info, ctx);142PKCS8_PRIV_KEY_INFO_free(p8info);143}144return p8;145}146147static X509_PUBKEY *key_to_pubkey(const void *key, int key_nid,148void *params, int params_type,149OSSL_i2d_of_void_ctx *k2d,150KEY2ANY_CTX *ctx)151{152/* der, derlen store the key DER output and its length */153unsigned char *der = NULL;154int derlen;155/* The final X509_PUBKEY */156X509_PUBKEY *xpk = NULL;157158if ((xpk = X509_PUBKEY_new()) == NULL159|| (derlen = k2d(key, &der, (void *)ctx)) <= 0160|| !X509_PUBKEY_set0_param(xpk, OBJ_nid2obj(key_nid),161params_type, params, der, derlen)) {162ERR_raise(ERR_LIB_PROV, ERR_R_X509_LIB);163X509_PUBKEY_free(xpk);164OPENSSL_free(der);165xpk = NULL;166}167168return xpk;169}170171/*172* key_to_epki_* produce encoded output with the private key data in a173* EncryptedPrivateKeyInfo structure (defined by PKCS#8). They require174* that there's an intent to encrypt, anything else is an error.175*176* key_to_pki_* primarily produce encoded output with the private key data177* in a PrivateKeyInfo structure (also defined by PKCS#8). However, if178* there is an intent to encrypt the data, the corresponding key_to_epki_*179* function is used instead.180*181* key_to_spki_* produce encoded output with the public key data in an182* X.509 SubjectPublicKeyInfo.183*184* Key parameters don't have any defined envelopment of this kind, but are185* included in some manner in the output from the functions described above,186* either in the AlgorithmIdentifier's parameter field, or as part of the187* key data itself.188*/189190static int key_to_epki_der_priv_bio(BIO *out, const void *key,191int key_nid,192ossl_unused const char *pemname,193key_to_paramstring_fn *p2s,194OSSL_i2d_of_void_ctx *k2d,195KEY2ANY_CTX *ctx)196{197int ret = 0;198void *str = NULL;199int strtype = V_ASN1_UNDEF;200X509_SIG *p8;201202if (!ctx->cipher_intent)203return 0;204205if (p2s != NULL && !p2s(key, key_nid, ctx->save_parameters, &str, &strtype))206return 0;207208p8 = key_to_encp8(key, key_nid, str, strtype, k2d, ctx);209if (p8 != NULL)210ret = i2d_PKCS8_bio(out, p8);211212X509_SIG_free(p8);213214return ret;215}216217static int key_to_epki_pem_priv_bio(BIO *out, const void *key,218int key_nid,219ossl_unused const char *pemname,220key_to_paramstring_fn *p2s,221OSSL_i2d_of_void_ctx *k2d,222KEY2ANY_CTX *ctx)223{224int ret = 0;225void *str = NULL;226int strtype = V_ASN1_UNDEF;227X509_SIG *p8;228229if (!ctx->cipher_intent)230return 0;231232if (p2s != NULL && !p2s(key, key_nid, ctx->save_parameters, &str, &strtype))233return 0;234235p8 = key_to_encp8(key, key_nid, str, strtype, k2d, ctx);236if (p8 != NULL)237ret = PEM_write_bio_PKCS8(out, p8);238239X509_SIG_free(p8);240241return ret;242}243244static int key_to_pki_der_priv_bio(BIO *out, const void *key,245int key_nid,246ossl_unused const char *pemname,247key_to_paramstring_fn *p2s,248OSSL_i2d_of_void_ctx *k2d,249KEY2ANY_CTX *ctx)250{251int ret = 0;252void *str = NULL;253int strtype = V_ASN1_UNDEF;254PKCS8_PRIV_KEY_INFO *p8info;255256if (ctx->cipher_intent)257return key_to_epki_der_priv_bio(out, key, key_nid, pemname,258p2s, k2d, ctx);259260if (p2s != NULL && !p2s(key, key_nid, ctx->save_parameters, &str, &strtype))261return 0;262263p8info = key_to_p8info(key, key_nid, str, strtype, k2d, ctx);264265if (p8info != NULL)266ret = i2d_PKCS8_PRIV_KEY_INFO_bio(out, p8info);267else268free_asn1_data(strtype, str);269270PKCS8_PRIV_KEY_INFO_free(p8info);271272return ret;273}274275static int key_to_pki_pem_priv_bio(BIO *out, const void *key,276int key_nid,277ossl_unused const char *pemname,278key_to_paramstring_fn *p2s,279OSSL_i2d_of_void_ctx *k2d,280KEY2ANY_CTX *ctx)281{282int ret = 0;283void *str = NULL;284int strtype = V_ASN1_UNDEF;285PKCS8_PRIV_KEY_INFO *p8info;286287if (ctx->cipher_intent)288return key_to_epki_pem_priv_bio(out, key, key_nid, pemname,289p2s, k2d, ctx);290291if (p2s != NULL && !p2s(key, key_nid, ctx->save_parameters, &str, &strtype))292return 0;293294p8info = key_to_p8info(key, key_nid, str, strtype, k2d, ctx);295296if (p8info != NULL)297ret = PEM_write_bio_PKCS8_PRIV_KEY_INFO(out, p8info);298else299free_asn1_data(strtype, str);300301PKCS8_PRIV_KEY_INFO_free(p8info);302303return ret;304}305306static int key_to_spki_der_pub_bio(BIO *out, const void *key,307int key_nid,308ossl_unused const char *pemname,309key_to_paramstring_fn *p2s,310OSSL_i2d_of_void_ctx *k2d,311KEY2ANY_CTX *ctx)312{313int ret = 0;314void *str = NULL;315int strtype = V_ASN1_UNDEF;316X509_PUBKEY *xpk = NULL;317318if (p2s != NULL && !p2s(key, key_nid, ctx->save_parameters, &str, &strtype))319return 0;320321xpk = key_to_pubkey(key, key_nid, str, strtype, k2d, ctx);322323if (xpk != NULL)324ret = i2d_X509_PUBKEY_bio(out, xpk);325326/* Also frees |str| */327X509_PUBKEY_free(xpk);328return ret;329}330331static int key_to_spki_pem_pub_bio(BIO *out, const void *key,332int key_nid,333ossl_unused const char *pemname,334key_to_paramstring_fn *p2s,335OSSL_i2d_of_void_ctx *k2d,336KEY2ANY_CTX *ctx)337{338int ret = 0;339void *str = NULL;340int strtype = V_ASN1_UNDEF;341X509_PUBKEY *xpk = NULL;342343if (p2s != NULL && !p2s(key, key_nid, ctx->save_parameters, &str, &strtype))344return 0;345346xpk = key_to_pubkey(key, key_nid, str, strtype, k2d, ctx);347348if (xpk != NULL)349ret = PEM_write_bio_X509_PUBKEY(out, xpk);350else351free_asn1_data(strtype, str);352353/* Also frees |str| */354X509_PUBKEY_free(xpk);355return ret;356}357358/*359* key_to_type_specific_* produce encoded output with type specific key data,360* no envelopment; the same kind of output as the type specific i2d_ and361* PEM_write_ functions, which is often a simple SEQUENCE of INTEGER.362*363* OpenSSL tries to discourage production of new keys in this form, because364* of the ambiguity when trying to recognise them, but can't deny that PKCS#1365* et al still are live standards.366*367* Note that these functions completely ignore p2s, and rather rely entirely368* on k2d to do the complete work.369*/370static int key_to_type_specific_der_bio(BIO *out, const void *key,371int key_nid,372ossl_unused const char *pemname,373key_to_paramstring_fn *p2s,374OSSL_i2d_of_void_ctx *k2d,375KEY2ANY_CTX *ctx)376{377unsigned char *der = NULL;378int derlen;379int ret;380381if ((derlen = k2d(key, &der, (void *)ctx)) <= 0) {382ERR_raise(ERR_LIB_PROV, ERR_R_PROV_LIB);383return 0;384}385386ret = BIO_write(out, der, derlen);387OPENSSL_free(der);388return ret > 0;389}390#define key_to_type_specific_der_priv_bio key_to_type_specific_der_bio391#define key_to_type_specific_der_pub_bio key_to_type_specific_der_bio392#define key_to_type_specific_der_param_bio key_to_type_specific_der_bio393394static int key_to_type_specific_pem_bio_cb(BIO *out, const void *key,395int key_nid, const char *pemname,396key_to_paramstring_fn *p2s,397OSSL_i2d_of_void_ctx *k2d,398KEY2ANY_CTX *ctx,399pem_password_cb *cb, void *cbarg)400{401return PEM_ASN1_write_bio_ctx(k2d, (void *)ctx, pemname, out, key,402ctx->cipher, NULL, 0, cb, cbarg)403> 0;404}405406static int key_to_type_specific_pem_priv_bio(BIO *out, const void *key,407int key_nid, const char *pemname,408key_to_paramstring_fn *p2s,409OSSL_i2d_of_void_ctx *k2d,410KEY2ANY_CTX *ctx)411{412return key_to_type_specific_pem_bio_cb(out, key, key_nid, pemname,413p2s, k2d, ctx,414ossl_pw_pem_password, &ctx->pwdata);415}416417static int key_to_type_specific_pem_pub_bio(BIO *out, const void *key,418int key_nid, const char *pemname,419key_to_paramstring_fn *p2s,420OSSL_i2d_of_void_ctx *k2d,421KEY2ANY_CTX *ctx)422{423return key_to_type_specific_pem_bio_cb(out, key, key_nid, pemname,424p2s, k2d, ctx, NULL, NULL);425}426427#ifndef OPENSSL_NO_KEYPARAMS428static int key_to_type_specific_pem_param_bio(BIO *out, const void *key,429int key_nid, const char *pemname,430key_to_paramstring_fn *p2s,431OSSL_i2d_of_void_ctx *k2d,432KEY2ANY_CTX *ctx)433{434return key_to_type_specific_pem_bio_cb(out, key, key_nid, pemname,435p2s, k2d, ctx, NULL, NULL);436}437#endif438439/* ---------------------------------------------------------------------- */440441#define k2d_NOCTX(n, f) \442static int \443n##_k2d(const void *key, unsigned char **pder, \444ossl_unused void *ctx) \445{ \446return f(key, pder); \447}448449/* ---------------------------------------------------------------------- */450451#ifndef OPENSSL_NO_DH452static int prepare_dh_params(const void *dh, int nid, int save,453void **pstr, int *pstrtype)454{455ASN1_STRING *params = ASN1_STRING_new();456457if (params == NULL) {458ERR_raise(ERR_LIB_PROV, ERR_R_ASN1_LIB);459return 0;460}461462if (nid == EVP_PKEY_DHX)463params->length = i2d_DHxparams(dh, ¶ms->data);464else465params->length = i2d_DHparams(dh, ¶ms->data);466467if (params->length <= 0) {468ERR_raise(ERR_LIB_PROV, ERR_R_ASN1_LIB);469ASN1_STRING_free(params);470return 0;471}472params->type = V_ASN1_SEQUENCE;473474*pstr = params;475*pstrtype = V_ASN1_SEQUENCE;476return 1;477}478479static int dh_spki_pub_to_der(const void *dh, unsigned char **pder,480ossl_unused void *ctx)481{482const BIGNUM *bn = NULL;483ASN1_INTEGER *pub_key = NULL;484int ret;485486if ((bn = DH_get0_pub_key(dh)) == NULL) {487ERR_raise(ERR_LIB_PROV, PROV_R_NOT_A_PUBLIC_KEY);488return 0;489}490if ((pub_key = BN_to_ASN1_INTEGER(bn, NULL)) == NULL) {491ERR_raise(ERR_LIB_PROV, PROV_R_BN_ERROR);492return 0;493}494495ret = i2d_ASN1_INTEGER(pub_key, pder);496497ASN1_STRING_clear_free(pub_key);498return ret;499}500501static int dh_pki_priv_to_der(const void *dh, unsigned char **pder,502ossl_unused void *ctx)503{504const BIGNUM *bn = NULL;505ASN1_INTEGER *priv_key = NULL;506int ret;507508if ((bn = DH_get0_priv_key(dh)) == NULL) {509ERR_raise(ERR_LIB_PROV, PROV_R_NOT_A_PRIVATE_KEY);510return 0;511}512if ((priv_key = BN_to_ASN1_INTEGER(bn, NULL)) == NULL) {513ERR_raise(ERR_LIB_PROV, PROV_R_BN_ERROR);514return 0;515}516517ret = i2d_ASN1_INTEGER(priv_key, pder);518519ASN1_STRING_clear_free(priv_key);520return ret;521}522523#define dh_epki_priv_to_der dh_pki_priv_to_der524525static int526dh_type_specific_params_to_der(const void *dh, unsigned char **pder,527ossl_unused void *ctx)528{529if (DH_test_flags(dh, DH_FLAG_TYPE_DHX))530return i2d_DHxparams(dh, pder);531return i2d_DHparams(dh, pder);532}533534/*535* DH doesn't have i2d_DHPrivateKey or i2d_DHPublicKey, so we can't make536* corresponding functions here.537*/538#define dh_type_specific_priv_to_der NULL539#define dh_type_specific_pub_to_der NULL540541static int dh_check_key_type(const void *dh, int expected_type)542{543int type = DH_test_flags(dh, DH_FLAG_TYPE_DHX) ? EVP_PKEY_DHX : EVP_PKEY_DH;544545return type == expected_type;546}547548#define dh_evp_type EVP_PKEY_DH549#define dhx_evp_type EVP_PKEY_DHX550#define dh_pem_type "DH"551#define dhx_pem_type "X9.42 DH"552#endif553554/* ---------------------------------------------------------------------- */555556#ifndef OPENSSL_NO_DSA557static int encode_dsa_params(const void *dsa, int nid,558void **pstr, int *pstrtype)559{560ASN1_STRING *params = ASN1_STRING_new();561562if (params == NULL) {563ERR_raise(ERR_LIB_PROV, ERR_R_ASN1_LIB);564return 0;565}566567params->length = i2d_DSAparams(dsa, ¶ms->data);568569if (params->length <= 0) {570ERR_raise(ERR_LIB_PROV, ERR_R_ASN1_LIB);571ASN1_STRING_free(params);572return 0;573}574575*pstrtype = V_ASN1_SEQUENCE;576*pstr = params;577return 1;578}579580static int prepare_dsa_params(const void *dsa, int nid, int save,581void **pstr, int *pstrtype)582{583const BIGNUM *p = DSA_get0_p(dsa);584const BIGNUM *q = DSA_get0_q(dsa);585const BIGNUM *g = DSA_get0_g(dsa);586587if (save && p != NULL && q != NULL && g != NULL)588return encode_dsa_params(dsa, nid, pstr, pstrtype);589590*pstr = NULL;591*pstrtype = V_ASN1_UNDEF;592return 1;593}594595static int dsa_spki_pub_to_der(const void *dsa, unsigned char **pder,596ossl_unused void *ctx)597{598const BIGNUM *bn = NULL;599ASN1_INTEGER *pub_key = NULL;600int ret;601602if ((bn = DSA_get0_pub_key(dsa)) == NULL) {603ERR_raise(ERR_LIB_PROV, PROV_R_NOT_A_PUBLIC_KEY);604return 0;605}606if ((pub_key = BN_to_ASN1_INTEGER(bn, NULL)) == NULL) {607ERR_raise(ERR_LIB_PROV, PROV_R_BN_ERROR);608return 0;609}610611ret = i2d_ASN1_INTEGER(pub_key, pder);612613ASN1_STRING_clear_free(pub_key);614return ret;615}616617static int dsa_pki_priv_to_der(const void *dsa, unsigned char **pder,618ossl_unused void *ctx)619{620const BIGNUM *bn = NULL;621ASN1_INTEGER *priv_key = NULL;622int ret;623624if ((bn = DSA_get0_priv_key(dsa)) == NULL) {625ERR_raise(ERR_LIB_PROV, PROV_R_NOT_A_PRIVATE_KEY);626return 0;627}628if ((priv_key = BN_to_ASN1_INTEGER(bn, NULL)) == NULL) {629ERR_raise(ERR_LIB_PROV, PROV_R_BN_ERROR);630return 0;631}632633ret = i2d_ASN1_INTEGER(priv_key, pder);634635ASN1_STRING_clear_free(priv_key);636return ret;637}638639k2d_NOCTX(dsa_prv, i2d_DSAPrivateKey)640k2d_NOCTX(dsa_pub, i2d_DSAPublicKey)641k2d_NOCTX(dsa_param, i2d_DSAparams)642643#define dsa_epki_priv_to_der dsa_pki_priv_to_der644645#define dsa_type_specific_priv_to_der dsa_prv_k2d646#define dsa_type_specific_pub_to_der dsa_pub_k2d647#define dsa_type_specific_params_to_der dsa_param_k2d648649#define dsa_check_key_type NULL650#define dsa_evp_type EVP_PKEY_DSA651#define dsa_pem_type "DSA"652#endif653654/* ---------------------------------------------------------------------- */655656#ifndef OPENSSL_NO_EC657static int prepare_ec_explicit_params(const void *eckey,658void **pstr, int *pstrtype)659{660ASN1_STRING *params = ASN1_STRING_new();661662if (params == NULL) {663ERR_raise(ERR_LIB_PROV, ERR_R_ASN1_LIB);664return 0;665}666667params->length = i2d_ECParameters(eckey, ¶ms->data);668if (params->length <= 0) {669ERR_raise(ERR_LIB_PROV, ERR_R_ASN1_LIB);670ASN1_STRING_free(params);671return 0;672}673674*pstrtype = V_ASN1_SEQUENCE;675*pstr = params;676return 1;677}678679/*680* This implements EcpkParameters, where the CHOICE is based on whether there681* is a curve name (curve nid) to be found or not. See RFC 3279 for details.682*/683static int prepare_ec_params(const void *eckey, int nid, int save,684void **pstr, int *pstrtype)685{686int curve_nid;687const EC_GROUP *group = EC_KEY_get0_group(eckey);688ASN1_OBJECT *params = NULL;689690if (group == NULL)691return 0;692curve_nid = EC_GROUP_get_curve_name(group);693if (curve_nid != NID_undef) {694params = OBJ_nid2obj(curve_nid);695if (params == NULL)696return 0;697}698699if (curve_nid != NID_undef700&& (EC_GROUP_get_asn1_flag(group) & OPENSSL_EC_NAMED_CURVE)) {701/* The CHOICE came to namedCurve */702if (OBJ_length(params) == 0) {703/* Some curves might not have an associated OID */704ERR_raise(ERR_LIB_PROV, PROV_R_MISSING_OID);705ASN1_OBJECT_free(params);706return 0;707}708*pstr = params;709*pstrtype = V_ASN1_OBJECT;710return 1;711} else {712/* The CHOICE came to ecParameters */713return prepare_ec_explicit_params(eckey, pstr, pstrtype);714}715}716717static int ec_spki_pub_to_der(const void *eckey, unsigned char **pder,718ossl_unused void *ctx)719{720if (EC_KEY_get0_public_key(eckey) == NULL) {721ERR_raise(ERR_LIB_PROV, PROV_R_NOT_A_PUBLIC_KEY);722return 0;723}724return i2o_ECPublicKey(eckey, pder);725}726727static int ec_pki_priv_to_der(const void *veckey, unsigned char **pder,728ossl_unused void *ctx)729{730EC_KEY *eckey = (EC_KEY *)veckey;731unsigned int old_flags;732int ret = 0;733734/*735* For PKCS8 the curve name appears in the PKCS8_PRIV_KEY_INFO object736* as the pkeyalg->parameter field. (For a named curve this is an OID)737* The pkey field is an octet string that holds the encoded738* ECPrivateKey SEQUENCE with the optional parameters field omitted.739* We omit this by setting the EC_PKEY_NO_PARAMETERS flag.740*/741old_flags = EC_KEY_get_enc_flags(eckey); /* save old flags */742EC_KEY_set_enc_flags(eckey, old_flags | EC_PKEY_NO_PARAMETERS);743ret = i2d_ECPrivateKey(eckey, pder);744EC_KEY_set_enc_flags(eckey, old_flags); /* restore old flags */745return ret; /* return the length of the der encoded data */746}747748k2d_NOCTX(ec_param, i2d_ECParameters)749k2d_NOCTX(ec_prv, i2d_ECPrivateKey)750751#define ec_epki_priv_to_der ec_pki_priv_to_der752753#define ec_type_specific_params_to_der ec_param_k2d754/* No ec_type_specific_pub_to_der, there simply is no such thing */755#define ec_type_specific_priv_to_der ec_prv_k2d756757#define ec_check_key_type NULL758#define ec_evp_type EVP_PKEY_EC759#define ec_pem_type "EC"760761#ifndef OPENSSL_NO_SM2762/*763* Albeit SM2 is a slightly different algorithm than ECDSA, the key type764* encoding (in all places where an AlgorithmIdentifier is produced, such765* as PrivateKeyInfo and SubjectPublicKeyInfo) is the same as for ECC keys766* according to the example in GM/T 0015-2012, appendix D.2.767* This leaves the distinction of SM2 keys to the EC group (which is found768* in AlgorithmIdentified.params).769*/770#define sm2_evp_type ec_evp_type771#define sm2_pem_type "SM2"772#endif773#endif774775/* ---------------------------------------------------------------------- */776777#ifndef OPENSSL_NO_ECX778#define prepare_ecx_params NULL779780static int ecx_spki_pub_to_der(const void *vecxkey, unsigned char **pder,781ossl_unused void *ctx)782{783const ECX_KEY *ecxkey = vecxkey;784unsigned char *keyblob;785786if (ecxkey == NULL) {787ERR_raise(ERR_LIB_PROV, ERR_R_PASSED_NULL_PARAMETER);788return 0;789}790791keyblob = OPENSSL_memdup(ecxkey->pubkey, ecxkey->keylen);792if (keyblob == NULL)793return 0;794795*pder = keyblob;796return ecxkey->keylen;797}798799static int ecx_pki_priv_to_der(const void *vecxkey, unsigned char **pder,800ossl_unused void *ctx)801{802const ECX_KEY *ecxkey = vecxkey;803ASN1_OCTET_STRING oct;804int keybloblen;805806if (ecxkey == NULL || ecxkey->privkey == NULL) {807ERR_raise(ERR_LIB_PROV, ERR_R_PASSED_NULL_PARAMETER);808return 0;809}810811oct.data = ecxkey->privkey;812oct.length = ecxkey->keylen;813oct.flags = 0;814815keybloblen = i2d_ASN1_OCTET_STRING(&oct, pder);816if (keybloblen < 0) {817ERR_raise(ERR_LIB_PROV, ERR_R_ASN1_LIB);818return 0;819}820821return keybloblen;822}823824#define ecx_epki_priv_to_der ecx_pki_priv_to_der825826/*827* ED25519, ED448, X25519 and X448 only has PKCS#8 / SubjectPublicKeyInfo828* representation, so we don't define ecx_type_specific_[priv,pub,params]_to_der.829*/830831#define ecx_check_key_type NULL832833#define ed25519_evp_type EVP_PKEY_ED25519834#define ed448_evp_type EVP_PKEY_ED448835#define x25519_evp_type EVP_PKEY_X25519836#define x448_evp_type EVP_PKEY_X448837#define ed25519_pem_type "ED25519"838#define ed448_pem_type "ED448"839#define x25519_pem_type "X25519"840#define x448_pem_type "X448"841#endif842843/* ---------------------------------------------------------------------- */844845#ifndef OPENSSL_NO_ML_DSA846static int ml_dsa_spki_pub_to_der(const void *vkey, unsigned char **pder,847ossl_unused void *ctx)848{849return ossl_ml_dsa_i2d_pubkey(vkey, pder);850}851852static int ml_dsa_pki_priv_to_der(const void *vkey, unsigned char **pder,853void *vctx)854{855KEY2ANY_CTX *ctx = vctx;856857return ossl_ml_dsa_i2d_prvkey(vkey, pder, ctx->provctx);858}859860#define ml_dsa_epki_priv_to_der ml_dsa_pki_priv_to_der861#define prepare_ml_dsa_params NULL862#define ml_dsa_check_key_type NULL863864#define ml_dsa_44_evp_type EVP_PKEY_ML_DSA_44865#define ml_dsa_44_pem_type "ML-DSA-44"866#define ml_dsa_65_evp_type EVP_PKEY_ML_DSA_65867#define ml_dsa_65_pem_type "ML-DSA-65"868#define ml_dsa_87_evp_type EVP_PKEY_ML_DSA_87869#define ml_dsa_87_pem_type "ML-DSA-87"870#endif /* OPENSSL_NO_ML_DSA */871872/* ---------------------------------------------------------------------- */873874#ifndef OPENSSL_NO_ML_KEM875876static int ml_kem_spki_pub_to_der(const void *vkey, unsigned char **pder,877ossl_unused void *ctx)878{879return ossl_ml_kem_i2d_pubkey(vkey, pder);880}881882static int ml_kem_pki_priv_to_der(const void *vkey, unsigned char **pder,883void *vctx)884{885KEY2ANY_CTX *ctx = vctx;886887return ossl_ml_kem_i2d_prvkey(vkey, pder, ctx->provctx);888}889890#define ml_kem_epki_priv_to_der ml_kem_pki_priv_to_der891#define prepare_ml_kem_params NULL892#define ml_kem_check_key_type NULL893894#define ml_kem_512_evp_type EVP_PKEY_ML_KEM_512895#define ml_kem_512_pem_type "ML-KEM-512"896#define ml_kem_768_evp_type EVP_PKEY_ML_KEM_768897#define ml_kem_768_pem_type "ML-KEM-768"898#define ml_kem_1024_evp_type EVP_PKEY_ML_KEM_1024899#define ml_kem_1024_pem_type "ML-KEM-1024"900#endif901902/* ---------------------------------------------------------------------- */903904/*905* Helper functions to prepare RSA-PSS params for encoding. We would906* have simply written the whole AlgorithmIdentifier, but existing libcrypto907* functionality doesn't allow that.908*/909910static int prepare_rsa_params(const void *rsa, int nid, int save,911void **pstr, int *pstrtype)912{913const RSA_PSS_PARAMS_30 *pss = ossl_rsa_get0_pss_params_30((RSA *)rsa);914915*pstr = NULL;916917switch (RSA_test_flags(rsa, RSA_FLAG_TYPE_MASK)) {918case RSA_FLAG_TYPE_RSA:919/* If plain RSA, the parameters shall be NULL */920*pstrtype = V_ASN1_NULL;921return 1;922case RSA_FLAG_TYPE_RSASSAPSS:923if (ossl_rsa_pss_params_30_is_unrestricted(pss)) {924*pstrtype = V_ASN1_UNDEF;925return 1;926} else {927ASN1_STRING *astr = NULL;928WPACKET pkt;929unsigned char *str = NULL;930size_t str_sz = 0;931int i;932933for (i = 0; i < 2; i++) {934switch (i) {935case 0:936if (!WPACKET_init_null_der(&pkt))937goto err;938break;939case 1:940if ((str = OPENSSL_malloc(str_sz)) == NULL941|| !WPACKET_init_der(&pkt, str, str_sz)) {942WPACKET_cleanup(&pkt);943goto err;944}945break;946}947if (!ossl_DER_w_RSASSA_PSS_params(&pkt, -1, pss)948|| !WPACKET_finish(&pkt)949|| !WPACKET_get_total_written(&pkt, &str_sz)) {950WPACKET_cleanup(&pkt);951goto err;952}953WPACKET_cleanup(&pkt);954955/*956* If no PSS parameters are going to be written, there's no957* point going for another iteration.958* This saves us from getting |str| allocated just to have it959* immediately de-allocated.960*/961if (str_sz == 0)962break;963}964965if ((astr = ASN1_STRING_new()) == NULL)966goto err;967*pstrtype = V_ASN1_SEQUENCE;968ASN1_STRING_set0(astr, str, (int)str_sz);969*pstr = astr;970971return 1;972err:973OPENSSL_free(str);974return 0;975}976}977978/* Currently unsupported RSA key type */979return 0;980}981982k2d_NOCTX(rsa_prv, i2d_RSAPrivateKey)983k2d_NOCTX(rsa_pub, i2d_RSAPublicKey)984985/*986* RSA is extremely simple, as PKCS#1 is used for the PKCS#8 |privateKey|987* field as well as the SubjectPublicKeyInfo |subjectPublicKey| field.988*/989#define rsa_pki_priv_to_der rsa_type_specific_priv_to_der990#define rsa_epki_priv_to_der rsa_type_specific_priv_to_der991#define rsa_spki_pub_to_der rsa_type_specific_pub_to_der992#define rsa_type_specific_priv_to_der rsa_prv_k2d993#define rsa_type_specific_pub_to_der rsa_pub_k2d994#define rsa_type_specific_params_to_der NULL995996static int rsa_check_key_type(const void *rsa, int expected_type)997{998switch (RSA_test_flags(rsa, RSA_FLAG_TYPE_MASK)) {999case RSA_FLAG_TYPE_RSA:1000return expected_type == EVP_PKEY_RSA;1001case RSA_FLAG_TYPE_RSASSAPSS:1002return expected_type == EVP_PKEY_RSA_PSS;1003}10041005/* Currently unsupported RSA key type */1006return EVP_PKEY_NONE;1007}10081009#define rsa_evp_type EVP_PKEY_RSA1010#define rsapss_evp_type EVP_PKEY_RSA_PSS1011#define rsa_pem_type "RSA"1012#define rsapss_pem_type "RSA-PSS"10131014/* ---------------------------------------------------------------------- */10151016#ifndef OPENSSL_NO_SLH_DSA1017#define prepare_slh_dsa_params NULL10181019static int slh_dsa_spki_pub_to_der(const void *vkey, unsigned char **pder,1020ossl_unused void *ctx)1021{1022const SLH_DSA_KEY *key = vkey;1023uint8_t *key_blob;1024size_t key_len;10251026if (key == NULL) {1027ERR_raise(ERR_LIB_PROV, ERR_R_PASSED_NULL_PARAMETER);1028return 0;1029}1030key_len = ossl_slh_dsa_key_get_pub_len(key);1031key_blob = OPENSSL_memdup(ossl_slh_dsa_key_get_pub(key), key_len);1032if (key_blob == NULL)1033return 0;10341035*pder = key_blob;1036return key_len;1037}10381039static int slh_dsa_pki_priv_to_der(const void *vkey, unsigned char **pder,1040ossl_unused void *ctx)1041{1042const SLH_DSA_KEY *key = vkey;1043size_t len;10441045if (ossl_slh_dsa_key_get_priv(key) == NULL) {1046ERR_raise(ERR_LIB_PROV, ERR_R_PASSED_NULL_PARAMETER);1047return 0;1048}1049len = ossl_slh_dsa_key_get_priv_len(key);10501051if (pder != NULL1052&& ((*pder = OPENSSL_memdup(ossl_slh_dsa_key_get_priv(key), len)) == NULL))1053return 0;10541055return len;1056}1057#define slh_dsa_epki_priv_to_der slh_dsa_pki_priv_to_der10581059/* SLH_DSA only has PKCS#8 / SubjectPublicKeyInfo representations. */10601061#define slh_dsa_check_key_type NULL1062#define slh_dsa_sha2_128s_evp_type EVP_PKEY_SLH_DSA_SHA2_128S1063#define slh_dsa_sha2_128f_evp_type EVP_PKEY_SLH_DSA_SHA2_128F1064#define slh_dsa_sha2_192s_evp_type EVP_PKEY_SLH_DSA_SHA2_192S1065#define slh_dsa_sha2_192f_evp_type EVP_PKEY_SLH_DSA_SHA2_192F1066#define slh_dsa_sha2_256s_evp_type EVP_PKEY_SLH_DSA_SHA2_256S1067#define slh_dsa_sha2_256f_evp_type EVP_PKEY_SLH_DSA_SHA2_256F1068#define slh_dsa_shake_128s_evp_type EVP_PKEY_SLH_DSA_SHAKE_128S1069#define slh_dsa_shake_128f_evp_type EVP_PKEY_SLH_DSA_SHAKE_128F1070#define slh_dsa_shake_192s_evp_type EVP_PKEY_SLH_DSA_SHAKE_192S1071#define slh_dsa_shake_192f_evp_type EVP_PKEY_SLH_DSA_SHAKE_192F1072#define slh_dsa_shake_256s_evp_type EVP_PKEY_SLH_DSA_SHAKE_256S1073#define slh_dsa_shake_256f_evp_type EVP_PKEY_SLH_DSA_SHAKE_256F1074#define slh_dsa_sha2_128s_input_type "SLH-DSA-SHA2-128s"1075#define slh_dsa_sha2_128f_input_type "SLH-DSA-SHA2-128f"1076#define slh_dsa_sha2_192s_input_type "SLH-DSA-SHA2-192s"1077#define slh_dsa_sha2_192f_input_type "SLH-DSA-SHA2-192f"1078#define slh_dsa_sha2_256s_input_type "SLH-DSA-SHA2-256s"1079#define slh_dsa_sha2_256f_input_type "SLH-DSA-SHA2-256f"1080#define slh_dsa_shake_128s_input_type "SLH-DSA-SHAKE-128s"1081#define slh_dsa_shake_128f_input_type "SLH-DSA-SHAKE-128f"1082#define slh_dsa_shake_192s_input_type "SLH-DSA-SHAKE-192s"1083#define slh_dsa_shake_192f_input_type "SLH-DSA-SHAKE-192f"1084#define slh_dsa_shake_256s_input_type "SLH-DSA-SHAKE-256s"1085#define slh_dsa_shake_256f_input_type "SLH-DSA-SHAKE-256f"1086#define slh_dsa_sha2_128s_pem_type "SLH-DSA-SHA2-128s"1087#define slh_dsa_sha2_128f_pem_type "SLH-DSA-SHA2-128f"1088#define slh_dsa_sha2_192s_pem_type "SLH-DSA-SHA2-192s"1089#define slh_dsa_sha2_192f_pem_type "SLH-DSA-SHA2-192f"1090#define slh_dsa_sha2_256s_pem_type "SLH-DSA-SHA2-256s"1091#define slh_dsa_sha2_256f_pem_type "SLH-DSA-SHA2-256f"1092#define slh_dsa_shake_128s_pem_type "SLH-DSA-SHAKE-128s"1093#define slh_dsa_shake_128f_pem_type "SLH-DSA-SHAKE-128f"1094#define slh_dsa_shake_192s_pem_type "SLH-DSA-SHAKE-192s"1095#define slh_dsa_shake_192f_pem_type "SLH-DSA-SHAKE-192f"1096#define slh_dsa_shake_256s_pem_type "SLH-DSA-SHAKE-256s"1097#define slh_dsa_shake_256f_pem_type "SLH-DSA-SHAKE-256f"1098#endif /* OPENSSL_NO_SLH_DSA */10991100/* ---------------------------------------------------------------------- */11011102static OSSL_FUNC_decoder_newctx_fn key2any_newctx;1103static OSSL_FUNC_decoder_freectx_fn key2any_freectx;11041105static void *key2any_newctx(void *provctx)1106{1107KEY2ANY_CTX *ctx = OPENSSL_zalloc(sizeof(*ctx));11081109if (ctx != NULL) {1110ctx->provctx = provctx;1111ctx->save_parameters = 1;1112}11131114return ctx;1115}11161117static void key2any_freectx(void *vctx)1118{1119KEY2ANY_CTX *ctx = vctx;11201121ossl_pw_clear_passphrase_data(&ctx->pwdata);1122EVP_CIPHER_free(ctx->cipher);1123OPENSSL_free(ctx);1124}11251126static const OSSL_PARAM *key2any_settable_ctx_params(ossl_unused void *provctx)1127{1128static const OSSL_PARAM settables[] = {1129OSSL_PARAM_utf8_string(OSSL_ENCODER_PARAM_CIPHER, NULL, 0),1130OSSL_PARAM_utf8_string(OSSL_ENCODER_PARAM_PROPERTIES, NULL, 0),1131OSSL_PARAM_END,1132};11331134return settables;1135}11361137static int key2any_set_ctx_params(void *vctx, const OSSL_PARAM params[])1138{1139KEY2ANY_CTX *ctx = vctx;1140OSSL_LIB_CTX *libctx = ossl_prov_ctx_get0_libctx(ctx->provctx);1141const OSSL_PARAM *cipherp = OSSL_PARAM_locate_const(params, OSSL_ENCODER_PARAM_CIPHER);1142const OSSL_PARAM *propsp = OSSL_PARAM_locate_const(params, OSSL_ENCODER_PARAM_PROPERTIES);1143const OSSL_PARAM *save_paramsp = OSSL_PARAM_locate_const(params, OSSL_ENCODER_PARAM_SAVE_PARAMETERS);11441145if (cipherp != NULL) {1146const char *ciphername = NULL;1147const char *props = NULL;11481149if (!OSSL_PARAM_get_utf8_string_ptr(cipherp, &ciphername))1150return 0;1151if (propsp != NULL && !OSSL_PARAM_get_utf8_string_ptr(propsp, &props))1152return 0;11531154EVP_CIPHER_free(ctx->cipher);1155ctx->cipher = NULL;1156ctx->cipher_intent = ciphername != NULL;1157if (ciphername != NULL1158&& ((ctx->cipher = EVP_CIPHER_fetch(libctx, ciphername, props)) == NULL))1159return 0;1160}11611162if (save_paramsp != NULL) {1163if (!OSSL_PARAM_get_int(save_paramsp, &ctx->save_parameters))1164return 0;1165}1166return 1;1167}11681169static int key2any_check_selection(int selection, int selection_mask)1170{1171/*1172* The selections are kinda sorta "levels", i.e. each selection given1173* here is assumed to include those following.1174*/1175int checks[] = {1176OSSL_KEYMGMT_SELECT_PRIVATE_KEY,1177OSSL_KEYMGMT_SELECT_PUBLIC_KEY,1178OSSL_KEYMGMT_SELECT_ALL_PARAMETERS1179};1180size_t i;11811182/* The decoder implementations made here support guessing */1183if (selection == 0)1184return 1;11851186for (i = 0; i < OSSL_NELEM(checks); i++) {1187int check1 = (selection & checks[i]) != 0;1188int check2 = (selection_mask & checks[i]) != 0;11891190/*1191* If the caller asked for the currently checked bit(s), return1192* whether the decoder description says it's supported.1193*/1194if (check1)1195return check2;1196}11971198/* This should be dead code, but just to be safe... */1199return 0;1200}12011202static int key2any_encode(KEY2ANY_CTX *ctx, OSSL_CORE_BIO *cout,1203const void *key, int type, const char *pemname,1204check_key_type_fn *checker,1205key_to_der_fn *writer,1206OSSL_PASSPHRASE_CALLBACK *pwcb, void *pwcbarg,1207key_to_paramstring_fn *key2paramstring,1208OSSL_i2d_of_void_ctx *key2der)1209{1210int ret = 0;12111212if (key == NULL) {1213ERR_raise(ERR_LIB_PROV, ERR_R_PASSED_NULL_PARAMETER);1214} else if (writer != NULL1215&& (checker == NULL || checker(key, type))) {1216BIO *out = ossl_bio_new_from_core_bio(ctx->provctx, cout);12171218if (out != NULL1219&& (pwcb == NULL1220|| ossl_pw_set_ossl_passphrase_cb(&ctx->pwdata, pwcb, pwcbarg)))1221ret = writer(out, key, type, pemname, key2paramstring, key2der, ctx);12221223BIO_free(out);1224} else {1225ERR_raise(ERR_LIB_PROV, ERR_R_PASSED_INVALID_ARGUMENT);1226}1227return ret;1228}12291230#define DO_PRIVATE_KEY_selection_mask OSSL_KEYMGMT_SELECT_PRIVATE_KEY1231#define DO_PRIVATE_KEY(impl, type, kind, output) \1232if ((selection & DO_PRIVATE_KEY_selection_mask) != 0) \1233return key2any_encode(ctx, cout, key, impl##_evp_type, \1234impl##_pem_type " PRIVATE KEY", \1235type##_check_key_type, \1236key_to_##kind##_##output##_priv_bio, \1237cb, cbarg, prepare_##type##_params, \1238type##_##kind##_priv_to_der);12391240#define DO_PUBLIC_KEY_selection_mask OSSL_KEYMGMT_SELECT_PUBLIC_KEY1241#define DO_PUBLIC_KEY(impl, type, kind, output) \1242if ((selection & DO_PUBLIC_KEY_selection_mask) != 0) \1243return key2any_encode(ctx, cout, key, impl##_evp_type, \1244impl##_pem_type " PUBLIC KEY", \1245type##_check_key_type, \1246key_to_##kind##_##output##_pub_bio, \1247cb, cbarg, prepare_##type##_params, \1248type##_##kind##_pub_to_der);12491250#define DO_PARAMETERS_selection_mask OSSL_KEYMGMT_SELECT_ALL_PARAMETERS1251#define DO_PARAMETERS(impl, type, kind, output) \1252if ((selection & DO_PARAMETERS_selection_mask) != 0) \1253return key2any_encode(ctx, cout, key, impl##_evp_type, \1254impl##_pem_type " PARAMETERS", \1255type##_check_key_type, \1256key_to_##kind##_##output##_param_bio, \1257NULL, NULL, NULL, \1258type##_##kind##_params_to_der);12591260/*-1261* Implement the kinds of output structure that can be produced. They are1262* referred to by name, and for each name, the following macros are defined1263* (braces not included):1264*1265* DO_{kind}_selection_mask1266*1267* A mask of selection bits that must not be zero. This is used as a1268* selection criterion for each implementation.1269* This mask must never be zero.1270*1271* DO_{kind}1272*1273* The performing macro. It must use the DO_ macros defined above,1274* always in this order:1275*1276* - DO_PRIVATE_KEY1277* - DO_PUBLIC_KEY1278* - DO_PARAMETERS1279*1280* Any of those may be omitted, but the relative order must still be1281* the same.1282*/12831284/*1285* PKCS#8 defines two structures for private keys only:1286* - PrivateKeyInfo (raw unencrypted form)1287* - EncryptedPrivateKeyInfo (encrypted wrapping)1288*1289* To allow a certain amount of flexibility, we allow the routines1290* for PrivateKeyInfo to also produce EncryptedPrivateKeyInfo if a1291* passphrase callback has been passed to them.1292*/1293#define DO_PrivateKeyInfo_selection_mask DO_PRIVATE_KEY_selection_mask1294#define DO_PrivateKeyInfo(impl, type, output) \1295DO_PRIVATE_KEY(impl, type, pki, output)12961297#define DO_EncryptedPrivateKeyInfo_selection_mask DO_PRIVATE_KEY_selection_mask1298#define DO_EncryptedPrivateKeyInfo(impl, type, output) \1299DO_PRIVATE_KEY(impl, type, epki, output)13001301/* SubjectPublicKeyInfo is a structure for public keys only */1302#define DO_SubjectPublicKeyInfo_selection_mask DO_PUBLIC_KEY_selection_mask1303#define DO_SubjectPublicKeyInfo(impl, type, output) \1304DO_PUBLIC_KEY(impl, type, spki, output)13051306/*1307* "type-specific" is a uniform name for key type specific output for private1308* and public keys as well as key parameters. This is used internally in1309* libcrypto so it doesn't have to have special knowledge about select key1310* types, but also when no better name has been found. If there are more1311* expressive DO_ names above, those are preferred.1312*1313* Three forms exist:1314*1315* - type_specific_keypair Only supports private and public key1316* - type_specific_params Only supports parameters1317* - type_specific Supports all parts of an EVP_PKEY1318* - type_specific_no_pub Supports all parts of an EVP_PKEY1319* except public key1320*/1321#define DO_type_specific_params_selection_mask DO_PARAMETERS_selection_mask1322#define DO_type_specific_params(impl, type, output) \1323DO_PARAMETERS(impl, type, type_specific, output)1324#define DO_type_specific_keypair_selection_mask \1325(DO_PRIVATE_KEY_selection_mask | DO_PUBLIC_KEY_selection_mask)1326#define DO_type_specific_keypair(impl, type, output) \1327DO_PRIVATE_KEY(impl, type, type_specific, output) \1328DO_PUBLIC_KEY(impl, type, type_specific, output)1329#define DO_type_specific_selection_mask \1330(DO_type_specific_keypair_selection_mask \1331| DO_type_specific_params_selection_mask)1332#define DO_type_specific(impl, type, output) \1333DO_type_specific_keypair(impl, type, output) \1334DO_type_specific_params(impl, type, output)1335#define DO_type_specific_no_pub_selection_mask \1336(DO_PRIVATE_KEY_selection_mask | DO_PARAMETERS_selection_mask)1337#define DO_type_specific_no_pub(impl, type, output) \1338DO_PRIVATE_KEY(impl, type, type_specific, output) \1339DO_type_specific_params(impl, type, output)13401341/*1342* Type specific aliases for the cases where we need to refer to them by1343* type name.1344* This only covers key types that are represented with i2d_{TYPE}PrivateKey,1345* i2d_{TYPE}PublicKey and i2d_{TYPE}params / i2d_{TYPE}Parameters.1346*/1347#define DO_RSA_selection_mask DO_type_specific_keypair_selection_mask1348#define DO_RSA(impl, type, output) DO_type_specific_keypair(impl, type, output)13491350#define DO_DH_selection_mask DO_type_specific_params_selection_mask1351#define DO_DH(impl, type, output) DO_type_specific_params(impl, type, output)13521353#define DO_DHX_selection_mask DO_type_specific_params_selection_mask1354#define DO_DHX(impl, type, output) DO_type_specific_params(impl, type, output)13551356#define DO_DSA_selection_mask DO_type_specific_selection_mask1357#define DO_DSA(impl, type, output) DO_type_specific(impl, type, output)13581359#define DO_EC_selection_mask DO_type_specific_no_pub_selection_mask1360#define DO_EC(impl, type, output) DO_type_specific_no_pub(impl, type, output)13611362#define DO_SM2_selection_mask DO_type_specific_no_pub_selection_mask1363#define DO_SM2(impl, type, output) DO_type_specific_no_pub(impl, type, output)13641365/* PKCS#1 defines a structure for RSA private and public keys */1366#define DO_PKCS1_selection_mask DO_RSA_selection_mask1367#define DO_PKCS1(impl, type, output) DO_RSA(impl, type, output)13681369/* PKCS#3 defines a structure for DH parameters */1370#define DO_PKCS3_selection_mask DO_DH_selection_mask1371#define DO_PKCS3(impl, type, output) DO_DH(impl, type, output)1372/* X9.42 defines a structure for DHx parameters */1373#define DO_X9_42_selection_mask DO_DHX_selection_mask1374#define DO_X9_42(impl, type, output) DO_DHX(impl, type, output)13751376/* X9.62 defines a structure for EC keys and parameters */1377#define DO_X9_62_selection_mask DO_EC_selection_mask1378#define DO_X9_62(impl, type, output) DO_EC(impl, type, output)13791380/*1381* MAKE_ENCODER is the single driver for creating OSSL_DISPATCH tables.1382* It takes the following arguments:1383*1384* impl This is the key type name that's being implemented.1385* type This is the type name for the set of functions that implement1386* the key type. For example, ed25519, ed448, x25519 and x4481387* are all implemented with the exact same set of functions.1388* kind What kind of support to implement. These translate into1389* the DO_##kind macros above.1390* output The output type to implement. may be der or pem.1391*1392* The resulting OSSL_DISPATCH array gets the following name (expressed in1393* C preprocessor terms) from those arguments:1394*1395* ossl_##impl##_to_##kind##_##output##_encoder_functions1396*/1397#define MAKE_ENCODER(impl, type, kind, output) \1398static OSSL_FUNC_encoder_import_object_fn \1399impl##_to_##kind##_##output##_import_object; \1400static OSSL_FUNC_encoder_free_object_fn \1401impl##_to_##kind##_##output##_free_object; \1402static OSSL_FUNC_encoder_encode_fn \1403impl##_to_##kind##_##output##_encode; \1404\1405static void * \1406impl##_to_##kind##_##output##_import_object(void *vctx, int selection, \1407const OSSL_PARAM params[]) \1408{ \1409KEY2ANY_CTX *ctx = vctx; \1410\1411return ossl_prov_import_key(ossl_##impl##_keymgmt_functions, \1412ctx->provctx, selection, params); \1413} \1414static void impl##_to_##kind##_##output##_free_object(void *key) \1415{ \1416ossl_prov_free_key(ossl_##impl##_keymgmt_functions, key); \1417} \1418static int impl##_to_##kind##_##output##_does_selection(void *ctx, \1419int selection) \1420{ \1421return key2any_check_selection(selection, \1422DO_##kind##_selection_mask); \1423} \1424static int \1425impl##_to_##kind##_##output##_encode(void *ctx, OSSL_CORE_BIO *cout, \1426const void *key, \1427const OSSL_PARAM key_abstract[], \1428int selection, \1429OSSL_PASSPHRASE_CALLBACK *cb, \1430void *cbarg) \1431{ \1432/* We don't deal with abstract objects */ \1433if (key_abstract != NULL) { \1434ERR_raise(ERR_LIB_PROV, ERR_R_PASSED_INVALID_ARGUMENT); \1435return 0; \1436} \1437DO_##kind(impl, type, output) \1438\1439ERR_raise(ERR_LIB_PROV, ERR_R_PASSED_INVALID_ARGUMENT); \1440return 0; \1441} \1442const OSSL_DISPATCH \1443ossl_##impl##_to_##kind##_##output##_encoder_functions[] \1444= { \1445{ OSSL_FUNC_ENCODER_NEWCTX, \1446(void (*)(void))key2any_newctx }, \1447{ OSSL_FUNC_ENCODER_FREECTX, \1448(void (*)(void))key2any_freectx }, \1449{ OSSL_FUNC_ENCODER_SETTABLE_CTX_PARAMS, \1450(void (*)(void))key2any_settable_ctx_params }, \1451{ OSSL_FUNC_ENCODER_SET_CTX_PARAMS, \1452(void (*)(void))key2any_set_ctx_params }, \1453{ OSSL_FUNC_ENCODER_DOES_SELECTION, \1454(void (*)(void))impl##_to_##kind##_##output##_does_selection }, \1455{ OSSL_FUNC_ENCODER_IMPORT_OBJECT, \1456(void (*)(void))impl##_to_##kind##_##output##_import_object }, \1457{ OSSL_FUNC_ENCODER_FREE_OBJECT, \1458(void (*)(void))impl##_to_##kind##_##output##_free_object }, \1459{ OSSL_FUNC_ENCODER_ENCODE, \1460(void (*)(void))impl##_to_##kind##_##output##_encode }, \1461OSSL_DISPATCH_END \1462}14631464/*1465* Replacements for i2d_{TYPE}PrivateKey, i2d_{TYPE}PublicKey,1466* i2d_{TYPE}params, as they exist.1467*/1468MAKE_ENCODER(rsa, rsa, type_specific_keypair, der);1469#ifndef OPENSSL_NO_DH1470MAKE_ENCODER(dh, dh, type_specific_params, der);1471MAKE_ENCODER(dhx, dh, type_specific_params, der);1472#endif1473#ifndef OPENSSL_NO_DSA1474MAKE_ENCODER(dsa, dsa, type_specific, der);1475#endif1476#ifndef OPENSSL_NO_EC1477MAKE_ENCODER(ec, ec, type_specific_no_pub, der);1478#ifndef OPENSSL_NO_SM21479MAKE_ENCODER(sm2, ec, type_specific_no_pub, der);1480#endif1481#endif14821483/*1484* Replacements for PEM_write_bio_{TYPE}PrivateKey,1485* PEM_write_bio_{TYPE}PublicKey, PEM_write_bio_{TYPE}params, as they exist.1486*/1487MAKE_ENCODER(rsa, rsa, type_specific_keypair, pem);1488#ifndef OPENSSL_NO_DH1489MAKE_ENCODER(dh, dh, type_specific_params, pem);1490MAKE_ENCODER(dhx, dh, type_specific_params, pem);1491#endif1492#ifndef OPENSSL_NO_DSA1493MAKE_ENCODER(dsa, dsa, type_specific, pem);1494#endif1495#ifndef OPENSSL_NO_EC1496MAKE_ENCODER(ec, ec, type_specific_no_pub, pem);1497#ifndef OPENSSL_NO_SM21498MAKE_ENCODER(sm2, ec, type_specific_no_pub, pem);1499#endif1500#endif15011502/*1503* PKCS#8 and SubjectPublicKeyInfo support. This may duplicate some of the1504* implementations specified above, but are more specific.1505* The SubjectPublicKeyInfo implementations also replace the1506* PEM_write_bio_{TYPE}_PUBKEY functions.1507* For PEM, these are expected to be used by PEM_write_bio_PrivateKey(),1508* PEM_write_bio_PUBKEY() and PEM_write_bio_Parameters().1509*/1510MAKE_ENCODER(rsa, rsa, EncryptedPrivateKeyInfo, der);1511MAKE_ENCODER(rsa, rsa, EncryptedPrivateKeyInfo, pem);1512MAKE_ENCODER(rsa, rsa, PrivateKeyInfo, der);1513MAKE_ENCODER(rsa, rsa, PrivateKeyInfo, pem);1514MAKE_ENCODER(rsa, rsa, SubjectPublicKeyInfo, der);1515MAKE_ENCODER(rsa, rsa, SubjectPublicKeyInfo, pem);1516MAKE_ENCODER(rsapss, rsa, EncryptedPrivateKeyInfo, der);1517MAKE_ENCODER(rsapss, rsa, EncryptedPrivateKeyInfo, pem);1518MAKE_ENCODER(rsapss, rsa, PrivateKeyInfo, der);1519MAKE_ENCODER(rsapss, rsa, PrivateKeyInfo, pem);1520MAKE_ENCODER(rsapss, rsa, SubjectPublicKeyInfo, der);1521MAKE_ENCODER(rsapss, rsa, SubjectPublicKeyInfo, pem);1522#ifndef OPENSSL_NO_DH1523MAKE_ENCODER(dh, dh, EncryptedPrivateKeyInfo, der);1524MAKE_ENCODER(dh, dh, EncryptedPrivateKeyInfo, pem);1525MAKE_ENCODER(dh, dh, PrivateKeyInfo, der);1526MAKE_ENCODER(dh, dh, PrivateKeyInfo, pem);1527MAKE_ENCODER(dh, dh, SubjectPublicKeyInfo, der);1528MAKE_ENCODER(dh, dh, SubjectPublicKeyInfo, pem);1529MAKE_ENCODER(dhx, dh, EncryptedPrivateKeyInfo, der);1530MAKE_ENCODER(dhx, dh, EncryptedPrivateKeyInfo, pem);1531MAKE_ENCODER(dhx, dh, PrivateKeyInfo, der);1532MAKE_ENCODER(dhx, dh, PrivateKeyInfo, pem);1533MAKE_ENCODER(dhx, dh, SubjectPublicKeyInfo, der);1534MAKE_ENCODER(dhx, dh, SubjectPublicKeyInfo, pem);1535#endif1536#ifndef OPENSSL_NO_DSA1537MAKE_ENCODER(dsa, dsa, EncryptedPrivateKeyInfo, der);1538MAKE_ENCODER(dsa, dsa, EncryptedPrivateKeyInfo, pem);1539MAKE_ENCODER(dsa, dsa, PrivateKeyInfo, der);1540MAKE_ENCODER(dsa, dsa, PrivateKeyInfo, pem);1541MAKE_ENCODER(dsa, dsa, SubjectPublicKeyInfo, der);1542MAKE_ENCODER(dsa, dsa, SubjectPublicKeyInfo, pem);1543#endif1544#ifndef OPENSSL_NO_EC1545MAKE_ENCODER(ec, ec, EncryptedPrivateKeyInfo, der);1546MAKE_ENCODER(ec, ec, EncryptedPrivateKeyInfo, pem);1547MAKE_ENCODER(ec, ec, PrivateKeyInfo, der);1548MAKE_ENCODER(ec, ec, PrivateKeyInfo, pem);1549MAKE_ENCODER(ec, ec, SubjectPublicKeyInfo, der);1550MAKE_ENCODER(ec, ec, SubjectPublicKeyInfo, pem);1551#ifndef OPENSSL_NO_SM21552MAKE_ENCODER(sm2, ec, EncryptedPrivateKeyInfo, der);1553MAKE_ENCODER(sm2, ec, EncryptedPrivateKeyInfo, pem);1554MAKE_ENCODER(sm2, ec, PrivateKeyInfo, der);1555MAKE_ENCODER(sm2, ec, PrivateKeyInfo, pem);1556MAKE_ENCODER(sm2, ec, SubjectPublicKeyInfo, der);1557MAKE_ENCODER(sm2, ec, SubjectPublicKeyInfo, pem);1558#endif1559#ifndef OPENSSL_NO_ECX1560MAKE_ENCODER(ed25519, ecx, EncryptedPrivateKeyInfo, der);1561MAKE_ENCODER(ed25519, ecx, EncryptedPrivateKeyInfo, pem);1562MAKE_ENCODER(ed25519, ecx, PrivateKeyInfo, der);1563MAKE_ENCODER(ed25519, ecx, PrivateKeyInfo, pem);1564MAKE_ENCODER(ed25519, ecx, SubjectPublicKeyInfo, der);1565MAKE_ENCODER(ed25519, ecx, SubjectPublicKeyInfo, pem);1566MAKE_ENCODER(ed448, ecx, EncryptedPrivateKeyInfo, der);1567MAKE_ENCODER(ed448, ecx, EncryptedPrivateKeyInfo, pem);1568MAKE_ENCODER(ed448, ecx, PrivateKeyInfo, der);1569MAKE_ENCODER(ed448, ecx, PrivateKeyInfo, pem);1570MAKE_ENCODER(ed448, ecx, SubjectPublicKeyInfo, der);1571MAKE_ENCODER(ed448, ecx, SubjectPublicKeyInfo, pem);1572MAKE_ENCODER(x25519, ecx, EncryptedPrivateKeyInfo, der);1573MAKE_ENCODER(x25519, ecx, EncryptedPrivateKeyInfo, pem);1574MAKE_ENCODER(x25519, ecx, PrivateKeyInfo, der);1575MAKE_ENCODER(x25519, ecx, PrivateKeyInfo, pem);1576MAKE_ENCODER(x25519, ecx, SubjectPublicKeyInfo, der);1577MAKE_ENCODER(x25519, ecx, SubjectPublicKeyInfo, pem);1578MAKE_ENCODER(x448, ecx, EncryptedPrivateKeyInfo, der);1579MAKE_ENCODER(x448, ecx, EncryptedPrivateKeyInfo, pem);1580MAKE_ENCODER(x448, ecx, PrivateKeyInfo, der);1581MAKE_ENCODER(x448, ecx, PrivateKeyInfo, pem);1582MAKE_ENCODER(x448, ecx, SubjectPublicKeyInfo, der);1583MAKE_ENCODER(x448, ecx, SubjectPublicKeyInfo, pem);1584#endif1585#endif1586#ifndef OPENSSL_NO_SLH_DSA1587MAKE_ENCODER(slh_dsa_sha2_128s, slh_dsa, EncryptedPrivateKeyInfo, der);1588MAKE_ENCODER(slh_dsa_sha2_128f, slh_dsa, EncryptedPrivateKeyInfo, der);1589MAKE_ENCODER(slh_dsa_sha2_192s, slh_dsa, EncryptedPrivateKeyInfo, der);1590MAKE_ENCODER(slh_dsa_sha2_192f, slh_dsa, EncryptedPrivateKeyInfo, der);1591MAKE_ENCODER(slh_dsa_sha2_256s, slh_dsa, EncryptedPrivateKeyInfo, der);1592MAKE_ENCODER(slh_dsa_sha2_256f, slh_dsa, EncryptedPrivateKeyInfo, der);1593MAKE_ENCODER(slh_dsa_sha2_128s, slh_dsa, EncryptedPrivateKeyInfo, pem);1594MAKE_ENCODER(slh_dsa_sha2_128f, slh_dsa, EncryptedPrivateKeyInfo, pem);1595MAKE_ENCODER(slh_dsa_sha2_192s, slh_dsa, EncryptedPrivateKeyInfo, pem);1596MAKE_ENCODER(slh_dsa_sha2_192f, slh_dsa, EncryptedPrivateKeyInfo, pem);1597MAKE_ENCODER(slh_dsa_sha2_256s, slh_dsa, EncryptedPrivateKeyInfo, pem);1598MAKE_ENCODER(slh_dsa_sha2_256f, slh_dsa, EncryptedPrivateKeyInfo, pem);1599MAKE_ENCODER(slh_dsa_shake_128s, slh_dsa, EncryptedPrivateKeyInfo, der);1600MAKE_ENCODER(slh_dsa_shake_128f, slh_dsa, EncryptedPrivateKeyInfo, der);1601MAKE_ENCODER(slh_dsa_shake_192s, slh_dsa, EncryptedPrivateKeyInfo, der);1602MAKE_ENCODER(slh_dsa_shake_192f, slh_dsa, EncryptedPrivateKeyInfo, der);1603MAKE_ENCODER(slh_dsa_shake_256s, slh_dsa, EncryptedPrivateKeyInfo, der);1604MAKE_ENCODER(slh_dsa_shake_256f, slh_dsa, EncryptedPrivateKeyInfo, der);1605MAKE_ENCODER(slh_dsa_shake_128s, slh_dsa, EncryptedPrivateKeyInfo, pem);1606MAKE_ENCODER(slh_dsa_shake_128f, slh_dsa, EncryptedPrivateKeyInfo, pem);1607MAKE_ENCODER(slh_dsa_shake_192s, slh_dsa, EncryptedPrivateKeyInfo, pem);1608MAKE_ENCODER(slh_dsa_shake_192f, slh_dsa, EncryptedPrivateKeyInfo, pem);1609MAKE_ENCODER(slh_dsa_shake_256s, slh_dsa, EncryptedPrivateKeyInfo, pem);1610MAKE_ENCODER(slh_dsa_shake_256f, slh_dsa, EncryptedPrivateKeyInfo, pem);1611MAKE_ENCODER(slh_dsa_sha2_128s, slh_dsa, PrivateKeyInfo, der);1612MAKE_ENCODER(slh_dsa_sha2_128f, slh_dsa, PrivateKeyInfo, der);1613MAKE_ENCODER(slh_dsa_sha2_192s, slh_dsa, PrivateKeyInfo, der);1614MAKE_ENCODER(slh_dsa_sha2_192f, slh_dsa, PrivateKeyInfo, der);1615MAKE_ENCODER(slh_dsa_sha2_256s, slh_dsa, PrivateKeyInfo, der);1616MAKE_ENCODER(slh_dsa_sha2_256f, slh_dsa, PrivateKeyInfo, der);1617MAKE_ENCODER(slh_dsa_sha2_128s, slh_dsa, PrivateKeyInfo, pem);1618MAKE_ENCODER(slh_dsa_sha2_128f, slh_dsa, PrivateKeyInfo, pem);1619MAKE_ENCODER(slh_dsa_sha2_192s, slh_dsa, PrivateKeyInfo, pem);1620MAKE_ENCODER(slh_dsa_sha2_192f, slh_dsa, PrivateKeyInfo, pem);1621MAKE_ENCODER(slh_dsa_sha2_256s, slh_dsa, PrivateKeyInfo, pem);1622MAKE_ENCODER(slh_dsa_sha2_256f, slh_dsa, PrivateKeyInfo, pem);1623MAKE_ENCODER(slh_dsa_shake_128s, slh_dsa, PrivateKeyInfo, der);1624MAKE_ENCODER(slh_dsa_shake_128f, slh_dsa, PrivateKeyInfo, der);1625MAKE_ENCODER(slh_dsa_shake_192s, slh_dsa, PrivateKeyInfo, der);1626MAKE_ENCODER(slh_dsa_shake_192f, slh_dsa, PrivateKeyInfo, der);1627MAKE_ENCODER(slh_dsa_shake_256s, slh_dsa, PrivateKeyInfo, der);1628MAKE_ENCODER(slh_dsa_shake_256f, slh_dsa, PrivateKeyInfo, der);1629MAKE_ENCODER(slh_dsa_shake_128s, slh_dsa, PrivateKeyInfo, pem);1630MAKE_ENCODER(slh_dsa_shake_128f, slh_dsa, PrivateKeyInfo, pem);1631MAKE_ENCODER(slh_dsa_shake_192s, slh_dsa, PrivateKeyInfo, pem);1632MAKE_ENCODER(slh_dsa_shake_192f, slh_dsa, PrivateKeyInfo, pem);1633MAKE_ENCODER(slh_dsa_shake_256s, slh_dsa, PrivateKeyInfo, pem);1634MAKE_ENCODER(slh_dsa_shake_256f, slh_dsa, PrivateKeyInfo, pem);1635MAKE_ENCODER(slh_dsa_sha2_128s, slh_dsa, SubjectPublicKeyInfo, der);1636MAKE_ENCODER(slh_dsa_sha2_128f, slh_dsa, SubjectPublicKeyInfo, der);1637MAKE_ENCODER(slh_dsa_sha2_192s, slh_dsa, SubjectPublicKeyInfo, der);1638MAKE_ENCODER(slh_dsa_sha2_192f, slh_dsa, SubjectPublicKeyInfo, der);1639MAKE_ENCODER(slh_dsa_sha2_256s, slh_dsa, SubjectPublicKeyInfo, der);1640MAKE_ENCODER(slh_dsa_sha2_256f, slh_dsa, SubjectPublicKeyInfo, der);1641MAKE_ENCODER(slh_dsa_sha2_128s, slh_dsa, SubjectPublicKeyInfo, pem);1642MAKE_ENCODER(slh_dsa_sha2_128f, slh_dsa, SubjectPublicKeyInfo, pem);1643MAKE_ENCODER(slh_dsa_sha2_192s, slh_dsa, SubjectPublicKeyInfo, pem);1644MAKE_ENCODER(slh_dsa_sha2_192f, slh_dsa, SubjectPublicKeyInfo, pem);1645MAKE_ENCODER(slh_dsa_sha2_256s, slh_dsa, SubjectPublicKeyInfo, pem);1646MAKE_ENCODER(slh_dsa_sha2_256f, slh_dsa, SubjectPublicKeyInfo, pem);1647MAKE_ENCODER(slh_dsa_shake_128s, slh_dsa, SubjectPublicKeyInfo, der);1648MAKE_ENCODER(slh_dsa_shake_128f, slh_dsa, SubjectPublicKeyInfo, der);1649MAKE_ENCODER(slh_dsa_shake_192s, slh_dsa, SubjectPublicKeyInfo, der);1650MAKE_ENCODER(slh_dsa_shake_192f, slh_dsa, SubjectPublicKeyInfo, der);1651MAKE_ENCODER(slh_dsa_shake_256s, slh_dsa, SubjectPublicKeyInfo, der);1652MAKE_ENCODER(slh_dsa_shake_256f, slh_dsa, SubjectPublicKeyInfo, der);1653MAKE_ENCODER(slh_dsa_shake_128s, slh_dsa, SubjectPublicKeyInfo, pem);1654MAKE_ENCODER(slh_dsa_shake_128f, slh_dsa, SubjectPublicKeyInfo, pem);1655MAKE_ENCODER(slh_dsa_shake_192s, slh_dsa, SubjectPublicKeyInfo, pem);1656MAKE_ENCODER(slh_dsa_shake_192f, slh_dsa, SubjectPublicKeyInfo, pem);1657MAKE_ENCODER(slh_dsa_shake_256s, slh_dsa, SubjectPublicKeyInfo, pem);1658MAKE_ENCODER(slh_dsa_shake_256f, slh_dsa, SubjectPublicKeyInfo, pem);1659#endif /* OPENSSL_NO_SLH_DSA */16601661#ifndef OPENSSL_NO_ML_KEM1662MAKE_ENCODER(ml_kem_512, ml_kem, EncryptedPrivateKeyInfo, der);1663MAKE_ENCODER(ml_kem_512, ml_kem, EncryptedPrivateKeyInfo, pem);1664MAKE_ENCODER(ml_kem_512, ml_kem, PrivateKeyInfo, der);1665MAKE_ENCODER(ml_kem_512, ml_kem, PrivateKeyInfo, pem);1666MAKE_ENCODER(ml_kem_512, ml_kem, SubjectPublicKeyInfo, der);1667MAKE_ENCODER(ml_kem_512, ml_kem, SubjectPublicKeyInfo, pem);16681669MAKE_ENCODER(ml_kem_768, ml_kem, EncryptedPrivateKeyInfo, der);1670MAKE_ENCODER(ml_kem_768, ml_kem, EncryptedPrivateKeyInfo, pem);1671MAKE_ENCODER(ml_kem_768, ml_kem, PrivateKeyInfo, der);1672MAKE_ENCODER(ml_kem_768, ml_kem, PrivateKeyInfo, pem);1673MAKE_ENCODER(ml_kem_768, ml_kem, SubjectPublicKeyInfo, der);1674MAKE_ENCODER(ml_kem_768, ml_kem, SubjectPublicKeyInfo, pem);16751676MAKE_ENCODER(ml_kem_1024, ml_kem, EncryptedPrivateKeyInfo, der);1677MAKE_ENCODER(ml_kem_1024, ml_kem, EncryptedPrivateKeyInfo, pem);1678MAKE_ENCODER(ml_kem_1024, ml_kem, PrivateKeyInfo, der);1679MAKE_ENCODER(ml_kem_1024, ml_kem, PrivateKeyInfo, pem);1680MAKE_ENCODER(ml_kem_1024, ml_kem, SubjectPublicKeyInfo, der);1681MAKE_ENCODER(ml_kem_1024, ml_kem, SubjectPublicKeyInfo, pem);1682#endif16831684/*1685* Support for key type specific output formats. Not all key types have1686* this, we only aim to duplicate what is available in 1.1.1 as1687* i2d_TYPEPrivateKey(), i2d_TYPEPublicKey() and i2d_TYPEparams().1688* For example, there are no publicly available i2d_ function for1689* ED25519, ED448, X25519 or X448, and they therefore only have PKCS#81690* and SubjectPublicKeyInfo implementations as implemented above.1691*/1692MAKE_ENCODER(rsa, rsa, RSA, der);1693MAKE_ENCODER(rsa, rsa, RSA, pem);1694#ifndef OPENSSL_NO_DH1695MAKE_ENCODER(dh, dh, DH, der);1696MAKE_ENCODER(dh, dh, DH, pem);1697MAKE_ENCODER(dhx, dh, DHX, der);1698MAKE_ENCODER(dhx, dh, DHX, pem);1699#endif1700#ifndef OPENSSL_NO_DSA1701MAKE_ENCODER(dsa, dsa, DSA, der);1702MAKE_ENCODER(dsa, dsa, DSA, pem);1703#endif1704#ifndef OPENSSL_NO_EC1705MAKE_ENCODER(ec, ec, EC, der);1706MAKE_ENCODER(ec, ec, EC, pem);1707#ifndef OPENSSL_NO_SM21708MAKE_ENCODER(sm2, ec, SM2, der);1709MAKE_ENCODER(sm2, ec, SM2, pem);1710#endif1711#endif17121713/* Convenience structure names */1714MAKE_ENCODER(rsa, rsa, PKCS1, der);1715MAKE_ENCODER(rsa, rsa, PKCS1, pem);1716MAKE_ENCODER(rsapss, rsa, PKCS1, der);1717MAKE_ENCODER(rsapss, rsa, PKCS1, pem);1718#ifndef OPENSSL_NO_DH1719MAKE_ENCODER(dh, dh, PKCS3, der); /* parameters only */1720MAKE_ENCODER(dh, dh, PKCS3, pem); /* parameters only */1721MAKE_ENCODER(dhx, dh, X9_42, der); /* parameters only */1722MAKE_ENCODER(dhx, dh, X9_42, pem); /* parameters only */1723#endif1724#ifndef OPENSSL_NO_EC1725MAKE_ENCODER(ec, ec, X9_62, der);1726MAKE_ENCODER(ec, ec, X9_62, pem);1727#endif17281729#ifndef OPENSSL_NO_ML_DSA1730MAKE_ENCODER(ml_dsa_44, ml_dsa, EncryptedPrivateKeyInfo, der);1731MAKE_ENCODER(ml_dsa_44, ml_dsa, EncryptedPrivateKeyInfo, pem);1732MAKE_ENCODER(ml_dsa_44, ml_dsa, PrivateKeyInfo, der);1733MAKE_ENCODER(ml_dsa_44, ml_dsa, PrivateKeyInfo, pem);1734MAKE_ENCODER(ml_dsa_44, ml_dsa, SubjectPublicKeyInfo, der);1735MAKE_ENCODER(ml_dsa_44, ml_dsa, SubjectPublicKeyInfo, pem);17361737MAKE_ENCODER(ml_dsa_65, ml_dsa, EncryptedPrivateKeyInfo, der);1738MAKE_ENCODER(ml_dsa_65, ml_dsa, EncryptedPrivateKeyInfo, pem);1739MAKE_ENCODER(ml_dsa_65, ml_dsa, PrivateKeyInfo, der);1740MAKE_ENCODER(ml_dsa_65, ml_dsa, PrivateKeyInfo, pem);1741MAKE_ENCODER(ml_dsa_65, ml_dsa, SubjectPublicKeyInfo, der);1742MAKE_ENCODER(ml_dsa_65, ml_dsa, SubjectPublicKeyInfo, pem);17431744MAKE_ENCODER(ml_dsa_87, ml_dsa, EncryptedPrivateKeyInfo, der);1745MAKE_ENCODER(ml_dsa_87, ml_dsa, EncryptedPrivateKeyInfo, pem);1746MAKE_ENCODER(ml_dsa_87, ml_dsa, PrivateKeyInfo, der);1747MAKE_ENCODER(ml_dsa_87, ml_dsa, PrivateKeyInfo, pem);1748MAKE_ENCODER(ml_dsa_87, ml_dsa, SubjectPublicKeyInfo, der);1749MAKE_ENCODER(ml_dsa_87, ml_dsa, SubjectPublicKeyInfo, pem);1750#endif /* OPENSSL_NO_ML_DSA */175117521753