Path: blob/main/crypto/openssl/providers/implementations/encode_decode/encode_key2any.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 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);707172/* Free the blob allocated during key_to_paramstring_fn */73static void free_asn1_data(int type, void *data)74{75switch (type) {76case V_ASN1_OBJECT:77ASN1_OBJECT_free(data);78break;79case V_ASN1_SEQUENCE:80ASN1_STRING_free(data);81break;82}83}8485static PKCS8_PRIV_KEY_INFO *key_to_p8info(const void *key, int key_nid,86void *params, int params_type,87OSSL_i2d_of_void_ctx *k2d,88KEY2ANY_CTX *ctx)89{90/* der, derlen store the key DER output and its length */91unsigned char *der = NULL;92int derlen;93/* The final PKCS#8 info */94PKCS8_PRIV_KEY_INFO *p8info = NULL;9596if ((p8info = PKCS8_PRIV_KEY_INFO_new()) == NULL97|| (derlen = k2d(key, &der, (void *)ctx)) <= 098|| !PKCS8_pkey_set0(p8info, OBJ_nid2obj(key_nid), 0,99params_type, params, der, derlen)) {100ERR_raise(ERR_LIB_PROV, ERR_R_ASN1_LIB);101PKCS8_PRIV_KEY_INFO_free(p8info);102OPENSSL_free(der);103p8info = NULL;104}105106return p8info;107}108109static X509_SIG *p8info_to_encp8(PKCS8_PRIV_KEY_INFO *p8info,110KEY2ANY_CTX *ctx)111{112X509_SIG *p8 = NULL;113char kstr[PEM_BUFSIZE];114size_t klen = 0;115OSSL_LIB_CTX *libctx = PROV_LIBCTX_OF(ctx->provctx);116117if (ctx->cipher == NULL)118return NULL;119120if (!ossl_pw_get_passphrase(kstr, sizeof(kstr), &klen, NULL, 1,121&ctx->pwdata)) {122ERR_raise(ERR_LIB_PROV, PROV_R_UNABLE_TO_GET_PASSPHRASE);123return NULL;124}125/* First argument == -1 means "standard" */126p8 = PKCS8_encrypt_ex(-1, ctx->cipher, kstr, klen, NULL, 0, 0, p8info, libctx, NULL);127OPENSSL_cleanse(kstr, klen);128return p8;129}130131static X509_SIG *key_to_encp8(const void *key, int key_nid,132void *params, int params_type,133OSSL_i2d_of_void_ctx *k2d,134KEY2ANY_CTX *ctx)135{136PKCS8_PRIV_KEY_INFO *p8info =137key_to_p8info(key, key_nid, params, params_type, k2d, ctx);138X509_SIG *p8 = NULL;139140if (p8info == NULL) {141free_asn1_data(params_type, params);142} else {143p8 = p8info_to_encp8(p8info, ctx);144PKCS8_PRIV_KEY_INFO_free(p8info);145}146return p8;147}148149static X509_PUBKEY *key_to_pubkey(const void *key, int key_nid,150void *params, int params_type,151OSSL_i2d_of_void_ctx *k2d,152KEY2ANY_CTX *ctx)153{154/* der, derlen store the key DER output and its length */155unsigned char *der = NULL;156int derlen;157/* The final X509_PUBKEY */158X509_PUBKEY *xpk = NULL;159160161if ((xpk = X509_PUBKEY_new()) == NULL162|| (derlen = k2d(key, &der, (void *)ctx)) <= 0163|| !X509_PUBKEY_set0_param(xpk, OBJ_nid2obj(key_nid),164params_type, params, der, derlen)) {165ERR_raise(ERR_LIB_PROV, ERR_R_X509_LIB);166X509_PUBKEY_free(xpk);167OPENSSL_free(der);168xpk = NULL;169}170171return xpk;172}173174/*175* key_to_epki_* produce encoded output with the private key data in a176* EncryptedPrivateKeyInfo structure (defined by PKCS#8). They require177* that there's an intent to encrypt, anything else is an error.178*179* key_to_pki_* primarily produce encoded output with the private key data180* in a PrivateKeyInfo structure (also defined by PKCS#8). However, if181* there is an intent to encrypt the data, the corresponding key_to_epki_*182* function is used instead.183*184* key_to_spki_* produce encoded output with the public key data in an185* X.509 SubjectPublicKeyInfo.186*187* Key parameters don't have any defined envelopment of this kind, but are188* included in some manner in the output from the functions described above,189* either in the AlgorithmIdentifier's parameter field, or as part of the190* key data itself.191*/192193static int key_to_epki_der_priv_bio(BIO *out, const void *key,194int key_nid,195ossl_unused const char *pemname,196key_to_paramstring_fn *p2s,197OSSL_i2d_of_void_ctx *k2d,198KEY2ANY_CTX *ctx)199{200int ret = 0;201void *str = NULL;202int strtype = V_ASN1_UNDEF;203X509_SIG *p8;204205if (!ctx->cipher_intent)206return 0;207208if (p2s != NULL && !p2s(key, key_nid, ctx->save_parameters,209&str, &strtype))210return 0;211212p8 = key_to_encp8(key, key_nid, str, strtype, k2d, ctx);213if (p8 != NULL)214ret = i2d_PKCS8_bio(out, p8);215216X509_SIG_free(p8);217218return ret;219}220221static int key_to_epki_pem_priv_bio(BIO *out, const void *key,222int key_nid,223ossl_unused const char *pemname,224key_to_paramstring_fn *p2s,225OSSL_i2d_of_void_ctx *k2d,226KEY2ANY_CTX *ctx)227{228int ret = 0;229void *str = NULL;230int strtype = V_ASN1_UNDEF;231X509_SIG *p8;232233if (!ctx->cipher_intent)234return 0;235236if (p2s != NULL && !p2s(key, key_nid, ctx->save_parameters,237&str, &strtype))238return 0;239240p8 = key_to_encp8(key, key_nid, str, strtype, k2d, ctx);241if (p8 != NULL)242ret = PEM_write_bio_PKCS8(out, p8);243244X509_SIG_free(p8);245246return ret;247}248249static int key_to_pki_der_priv_bio(BIO *out, const void *key,250int key_nid,251ossl_unused const char *pemname,252key_to_paramstring_fn *p2s,253OSSL_i2d_of_void_ctx *k2d,254KEY2ANY_CTX *ctx)255{256int ret = 0;257void *str = NULL;258int strtype = V_ASN1_UNDEF;259PKCS8_PRIV_KEY_INFO *p8info;260261if (ctx->cipher_intent)262return key_to_epki_der_priv_bio(out, key, key_nid, pemname,263p2s, k2d, ctx);264265if (p2s != NULL && !p2s(key, key_nid, ctx->save_parameters,266&str, &strtype))267return 0;268269p8info = key_to_p8info(key, key_nid, str, strtype, k2d, ctx);270271if (p8info != NULL)272ret = i2d_PKCS8_PRIV_KEY_INFO_bio(out, p8info);273else274free_asn1_data(strtype, str);275276PKCS8_PRIV_KEY_INFO_free(p8info);277278return ret;279}280281static int key_to_pki_pem_priv_bio(BIO *out, const void *key,282int key_nid,283ossl_unused const char *pemname,284key_to_paramstring_fn *p2s,285OSSL_i2d_of_void_ctx *k2d,286KEY2ANY_CTX *ctx)287{288int ret = 0;289void *str = NULL;290int strtype = V_ASN1_UNDEF;291PKCS8_PRIV_KEY_INFO *p8info;292293if (ctx->cipher_intent)294return key_to_epki_pem_priv_bio(out, key, key_nid, pemname,295p2s, k2d, ctx);296297if (p2s != NULL && !p2s(key, key_nid, ctx->save_parameters,298&str, &strtype))299return 0;300301p8info = key_to_p8info(key, key_nid, str, strtype, k2d, ctx);302303if (p8info != NULL)304ret = PEM_write_bio_PKCS8_PRIV_KEY_INFO(out, p8info);305else306free_asn1_data(strtype, str);307308PKCS8_PRIV_KEY_INFO_free(p8info);309310return ret;311}312313static int key_to_spki_der_pub_bio(BIO *out, const void *key,314int key_nid,315ossl_unused const char *pemname,316key_to_paramstring_fn *p2s,317OSSL_i2d_of_void_ctx *k2d,318KEY2ANY_CTX *ctx)319{320int ret = 0;321void *str = NULL;322int strtype = V_ASN1_UNDEF;323X509_PUBKEY *xpk = NULL;324325if (p2s != NULL && !p2s(key, key_nid, ctx->save_parameters,326&str, &strtype))327return 0;328329xpk = key_to_pubkey(key, key_nid, str, strtype, k2d, ctx);330331if (xpk != NULL)332ret = i2d_X509_PUBKEY_bio(out, xpk);333334/* Also frees |str| */335X509_PUBKEY_free(xpk);336return ret;337}338339static int key_to_spki_pem_pub_bio(BIO *out, const void *key,340int key_nid,341ossl_unused const char *pemname,342key_to_paramstring_fn *p2s,343OSSL_i2d_of_void_ctx *k2d,344KEY2ANY_CTX *ctx)345{346int ret = 0;347void *str = NULL;348int strtype = V_ASN1_UNDEF;349X509_PUBKEY *xpk = NULL;350351if (p2s != NULL && !p2s(key, key_nid, ctx->save_parameters,352&str, &strtype))353return 0;354355xpk = key_to_pubkey(key, key_nid, str, strtype, k2d, ctx);356357if (xpk != NULL)358ret = PEM_write_bio_X509_PUBKEY(out, xpk);359else360free_asn1_data(strtype, str);361362/* Also frees |str| */363X509_PUBKEY_free(xpk);364return ret;365}366367/*368* key_to_type_specific_* produce encoded output with type specific key data,369* no envelopment; the same kind of output as the type specific i2d_ and370* PEM_write_ functions, which is often a simple SEQUENCE of INTEGER.371*372* OpenSSL tries to discourage production of new keys in this form, because373* of the ambiguity when trying to recognise them, but can't deny that PKCS#1374* et al still are live standards.375*376* Note that these functions completely ignore p2s, and rather rely entirely377* on k2d to do the complete work.378*/379static int key_to_type_specific_der_bio(BIO *out, const void *key,380int key_nid,381ossl_unused const char *pemname,382key_to_paramstring_fn *p2s,383OSSL_i2d_of_void_ctx *k2d,384KEY2ANY_CTX *ctx)385{386unsigned char *der = NULL;387int derlen;388int ret;389390if ((derlen = k2d(key, &der, (void *)ctx)) <= 0) {391ERR_raise(ERR_LIB_PROV, ERR_R_PROV_LIB);392return 0;393}394395ret = BIO_write(out, der, derlen);396OPENSSL_free(der);397return ret > 0;398}399#define key_to_type_specific_der_priv_bio key_to_type_specific_der_bio400#define key_to_type_specific_der_pub_bio key_to_type_specific_der_bio401#define key_to_type_specific_der_param_bio key_to_type_specific_der_bio402403static int key_to_type_specific_pem_bio_cb(BIO *out, const void *key,404int key_nid, const char *pemname,405key_to_paramstring_fn *p2s,406OSSL_i2d_of_void_ctx *k2d,407KEY2ANY_CTX *ctx,408pem_password_cb *cb, void *cbarg)409{410return PEM_ASN1_write_bio_ctx(k2d, (void *)ctx, pemname, out, key,411ctx->cipher, NULL, 0, cb, cbarg) > 0;412}413414static int key_to_type_specific_pem_priv_bio(BIO *out, const void *key,415int key_nid, const char *pemname,416key_to_paramstring_fn *p2s,417OSSL_i2d_of_void_ctx *k2d,418KEY2ANY_CTX *ctx)419{420return key_to_type_specific_pem_bio_cb(out, key, key_nid, pemname,421p2s, k2d, ctx,422ossl_pw_pem_password, &ctx->pwdata);423}424425static int key_to_type_specific_pem_pub_bio(BIO *out, const void *key,426int key_nid, const char *pemname,427key_to_paramstring_fn *p2s,428OSSL_i2d_of_void_ctx *k2d,429KEY2ANY_CTX *ctx)430{431return key_to_type_specific_pem_bio_cb(out, key, key_nid, pemname,432p2s, k2d, ctx, NULL, NULL);433}434435#ifndef OPENSSL_NO_KEYPARAMS436static int key_to_type_specific_pem_param_bio(BIO *out, const void *key,437int key_nid, const char *pemname,438key_to_paramstring_fn *p2s,439OSSL_i2d_of_void_ctx *k2d,440KEY2ANY_CTX *ctx)441{442return key_to_type_specific_pem_bio_cb(out, key, key_nid, pemname,443p2s, k2d, ctx, NULL, NULL);444}445#endif446447/* ---------------------------------------------------------------------- */448449#define k2d_NOCTX(n, f) \450static int \451n##_k2d(const void *key, unsigned char **pder, \452ossl_unused void *ctx) \453{ \454return f(key, pder); \455}456457/* ---------------------------------------------------------------------- */458459#ifndef OPENSSL_NO_DH460static int prepare_dh_params(const void *dh, int nid, int save,461void **pstr, int *pstrtype)462{463ASN1_STRING *params = ASN1_STRING_new();464465if (params == NULL) {466ERR_raise(ERR_LIB_PROV, ERR_R_ASN1_LIB);467return 0;468}469470if (nid == EVP_PKEY_DHX)471params->length = i2d_DHxparams(dh, ¶ms->data);472else473params->length = i2d_DHparams(dh, ¶ms->data);474475if (params->length <= 0) {476ERR_raise(ERR_LIB_PROV, ERR_R_ASN1_LIB);477ASN1_STRING_free(params);478return 0;479}480params->type = V_ASN1_SEQUENCE;481482*pstr = params;483*pstrtype = V_ASN1_SEQUENCE;484return 1;485}486487static int dh_spki_pub_to_der(const void *dh, unsigned char **pder,488ossl_unused void *ctx)489{490const BIGNUM *bn = NULL;491ASN1_INTEGER *pub_key = NULL;492int ret;493494if ((bn = DH_get0_pub_key(dh)) == NULL) {495ERR_raise(ERR_LIB_PROV, PROV_R_NOT_A_PUBLIC_KEY);496return 0;497}498if ((pub_key = BN_to_ASN1_INTEGER(bn, NULL)) == NULL) {499ERR_raise(ERR_LIB_PROV, PROV_R_BN_ERROR);500return 0;501}502503ret = i2d_ASN1_INTEGER(pub_key, pder);504505ASN1_STRING_clear_free(pub_key);506return ret;507}508509static int dh_pki_priv_to_der(const void *dh, unsigned char **pder,510ossl_unused void *ctx)511{512const BIGNUM *bn = NULL;513ASN1_INTEGER *priv_key = NULL;514int ret;515516if ((bn = DH_get0_priv_key(dh)) == NULL) {517ERR_raise(ERR_LIB_PROV, PROV_R_NOT_A_PRIVATE_KEY);518return 0;519}520if ((priv_key = BN_to_ASN1_INTEGER(bn, NULL)) == NULL) {521ERR_raise(ERR_LIB_PROV, PROV_R_BN_ERROR);522return 0;523}524525ret = i2d_ASN1_INTEGER(priv_key, pder);526527ASN1_STRING_clear_free(priv_key);528return ret;529}530531# define dh_epki_priv_to_der dh_pki_priv_to_der532533static int534dh_type_specific_params_to_der(const void *dh, unsigned char **pder,535ossl_unused void *ctx)536{537if (DH_test_flags(dh, DH_FLAG_TYPE_DHX))538return i2d_DHxparams(dh, pder);539return i2d_DHparams(dh, pder);540}541542/*543* DH doesn't have i2d_DHPrivateKey or i2d_DHPublicKey, so we can't make544* corresponding functions here.545*/546# define dh_type_specific_priv_to_der NULL547# define dh_type_specific_pub_to_der NULL548549static int dh_check_key_type(const void *dh, int expected_type)550{551int type =552DH_test_flags(dh, DH_FLAG_TYPE_DHX) ? EVP_PKEY_DHX : EVP_PKEY_DH;553554return type == expected_type;555}556557# define dh_evp_type EVP_PKEY_DH558# define dhx_evp_type EVP_PKEY_DHX559# define dh_pem_type "DH"560# define dhx_pem_type "X9.42 DH"561#endif562563/* ---------------------------------------------------------------------- */564565#ifndef OPENSSL_NO_DSA566static int encode_dsa_params(const void *dsa, int nid,567void **pstr, int *pstrtype)568{569ASN1_STRING *params = ASN1_STRING_new();570571if (params == NULL) {572ERR_raise(ERR_LIB_PROV, ERR_R_ASN1_LIB);573return 0;574}575576params->length = i2d_DSAparams(dsa, ¶ms->data);577578if (params->length <= 0) {579ERR_raise(ERR_LIB_PROV, ERR_R_ASN1_LIB);580ASN1_STRING_free(params);581return 0;582}583584*pstrtype = V_ASN1_SEQUENCE;585*pstr = params;586return 1;587}588589static int prepare_dsa_params(const void *dsa, int nid, int save,590void **pstr, int *pstrtype)591{592const BIGNUM *p = DSA_get0_p(dsa);593const BIGNUM *q = DSA_get0_q(dsa);594const BIGNUM *g = DSA_get0_g(dsa);595596if (save && p != NULL && q != NULL && g != NULL)597return encode_dsa_params(dsa, nid, pstr, pstrtype);598599*pstr = NULL;600*pstrtype = V_ASN1_UNDEF;601return 1;602}603604static int dsa_spki_pub_to_der(const void *dsa, unsigned char **pder,605ossl_unused void *ctx)606{607const BIGNUM *bn = NULL;608ASN1_INTEGER *pub_key = NULL;609int ret;610611if ((bn = DSA_get0_pub_key(dsa)) == NULL) {612ERR_raise(ERR_LIB_PROV, PROV_R_NOT_A_PUBLIC_KEY);613return 0;614}615if ((pub_key = BN_to_ASN1_INTEGER(bn, NULL)) == NULL) {616ERR_raise(ERR_LIB_PROV, PROV_R_BN_ERROR);617return 0;618}619620ret = i2d_ASN1_INTEGER(pub_key, pder);621622ASN1_STRING_clear_free(pub_key);623return ret;624}625626static int dsa_pki_priv_to_der(const void *dsa, unsigned char **pder,627ossl_unused void *ctx)628{629const BIGNUM *bn = NULL;630ASN1_INTEGER *priv_key = NULL;631int ret;632633if ((bn = DSA_get0_priv_key(dsa)) == NULL) {634ERR_raise(ERR_LIB_PROV, PROV_R_NOT_A_PRIVATE_KEY);635return 0;636}637if ((priv_key = BN_to_ASN1_INTEGER(bn, NULL)) == NULL) {638ERR_raise(ERR_LIB_PROV, PROV_R_BN_ERROR);639return 0;640}641642ret = i2d_ASN1_INTEGER(priv_key, pder);643644ASN1_STRING_clear_free(priv_key);645return ret;646}647648k2d_NOCTX(dsa_prv, i2d_DSAPrivateKey)649k2d_NOCTX(dsa_pub, i2d_DSAPublicKey)650k2d_NOCTX(dsa_param, i2d_DSAparams)651652# define dsa_epki_priv_to_der dsa_pki_priv_to_der653654# define dsa_type_specific_priv_to_der dsa_prv_k2d655# define dsa_type_specific_pub_to_der dsa_pub_k2d656# define dsa_type_specific_params_to_der dsa_param_k2d657658# define dsa_check_key_type NULL659# define dsa_evp_type EVP_PKEY_DSA660# define dsa_pem_type "DSA"661#endif662663/* ---------------------------------------------------------------------- */664665#ifndef OPENSSL_NO_EC666static int prepare_ec_explicit_params(const void *eckey,667void **pstr, int *pstrtype)668{669ASN1_STRING *params = ASN1_STRING_new();670671if (params == NULL) {672ERR_raise(ERR_LIB_PROV, ERR_R_ASN1_LIB);673return 0;674}675676params->length = i2d_ECParameters(eckey, ¶ms->data);677if (params->length <= 0) {678ERR_raise(ERR_LIB_PROV, ERR_R_ASN1_LIB);679ASN1_STRING_free(params);680return 0;681}682683*pstrtype = V_ASN1_SEQUENCE;684*pstr = params;685return 1;686}687688/*689* This implements EcpkParameters, where the CHOICE is based on whether there690* is a curve name (curve nid) to be found or not. See RFC 3279 for details.691*/692static int prepare_ec_params(const void *eckey, int nid, int save,693void **pstr, int *pstrtype)694{695int curve_nid;696const EC_GROUP *group = EC_KEY_get0_group(eckey);697ASN1_OBJECT *params = NULL;698699if (group == NULL)700return 0;701curve_nid = EC_GROUP_get_curve_name(group);702if (curve_nid != NID_undef) {703params = OBJ_nid2obj(curve_nid);704if (params == NULL)705return 0;706}707708if (curve_nid != NID_undef709&& (EC_GROUP_get_asn1_flag(group) & OPENSSL_EC_NAMED_CURVE)) {710/* The CHOICE came to namedCurve */711if (OBJ_length(params) == 0) {712/* Some curves might not have an associated OID */713ERR_raise(ERR_LIB_PROV, PROV_R_MISSING_OID);714ASN1_OBJECT_free(params);715return 0;716}717*pstr = params;718*pstrtype = V_ASN1_OBJECT;719return 1;720} else {721/* The CHOICE came to ecParameters */722return prepare_ec_explicit_params(eckey, pstr, pstrtype);723}724}725726static int ec_spki_pub_to_der(const void *eckey, unsigned char **pder,727ossl_unused void *ctx)728{729if (EC_KEY_get0_public_key(eckey) == NULL) {730ERR_raise(ERR_LIB_PROV, PROV_R_NOT_A_PUBLIC_KEY);731return 0;732}733return i2o_ECPublicKey(eckey, pder);734}735736static int ec_pki_priv_to_der(const void *veckey, unsigned char **pder,737ossl_unused void *ctx)738{739EC_KEY *eckey = (EC_KEY *)veckey;740unsigned int old_flags;741int ret = 0;742743/*744* For PKCS8 the curve name appears in the PKCS8_PRIV_KEY_INFO object745* as the pkeyalg->parameter field. (For a named curve this is an OID)746* The pkey field is an octet string that holds the encoded747* ECPrivateKey SEQUENCE with the optional parameters field omitted.748* We omit this by setting the EC_PKEY_NO_PARAMETERS flag.749*/750old_flags = EC_KEY_get_enc_flags(eckey); /* save old flags */751EC_KEY_set_enc_flags(eckey, old_flags | EC_PKEY_NO_PARAMETERS);752ret = i2d_ECPrivateKey(eckey, pder);753EC_KEY_set_enc_flags(eckey, old_flags); /* restore old flags */754return ret; /* return the length of the der encoded data */755}756757k2d_NOCTX(ec_param, i2d_ECParameters)758k2d_NOCTX(ec_prv, i2d_ECPrivateKey)759760# define ec_epki_priv_to_der ec_pki_priv_to_der761762# define ec_type_specific_params_to_der ec_param_k2d763/* No ec_type_specific_pub_to_der, there simply is no such thing */764# define ec_type_specific_priv_to_der ec_prv_k2d765766# define ec_check_key_type NULL767# define ec_evp_type EVP_PKEY_EC768# define ec_pem_type "EC"769770# ifndef OPENSSL_NO_SM2771/*772* Albeit SM2 is a slightly different algorithm than ECDSA, the key type773* encoding (in all places where an AlgorithmIdentifier is produced, such774* as PrivateKeyInfo and SubjectPublicKeyInfo) is the same as for ECC keys775* according to the example in GM/T 0015-2012, appendix D.2.776* This leaves the distinction of SM2 keys to the EC group (which is found777* in AlgorithmIdentified.params).778*/779# define sm2_evp_type ec_evp_type780# define sm2_pem_type "SM2"781# endif782#endif783784/* ---------------------------------------------------------------------- */785786#ifndef OPENSSL_NO_ECX787# define prepare_ecx_params NULL788789static int ecx_spki_pub_to_der(const void *vecxkey, unsigned char **pder,790ossl_unused void *ctx)791{792const ECX_KEY *ecxkey = vecxkey;793unsigned char *keyblob;794795if (ecxkey == NULL) {796ERR_raise(ERR_LIB_PROV, ERR_R_PASSED_NULL_PARAMETER);797return 0;798}799800keyblob = OPENSSL_memdup(ecxkey->pubkey, ecxkey->keylen);801if (keyblob == NULL)802return 0;803804*pder = keyblob;805return ecxkey->keylen;806}807808static int ecx_pki_priv_to_der(const void *vecxkey, unsigned char **pder,809ossl_unused void *ctx)810{811const ECX_KEY *ecxkey = vecxkey;812ASN1_OCTET_STRING oct;813int keybloblen;814815if (ecxkey == NULL || ecxkey->privkey == NULL) {816ERR_raise(ERR_LIB_PROV, ERR_R_PASSED_NULL_PARAMETER);817return 0;818}819820oct.data = ecxkey->privkey;821oct.length = ecxkey->keylen;822oct.flags = 0;823824keybloblen = i2d_ASN1_OCTET_STRING(&oct, pder);825if (keybloblen < 0) {826ERR_raise(ERR_LIB_PROV, ERR_R_ASN1_LIB);827return 0;828}829830return keybloblen;831}832833# define ecx_epki_priv_to_der ecx_pki_priv_to_der834835/*836* ED25519, ED448, X25519 and X448 only has PKCS#8 / SubjectPublicKeyInfo837* representation, so we don't define ecx_type_specific_[priv,pub,params]_to_der.838*/839840# define ecx_check_key_type NULL841842# define ed25519_evp_type EVP_PKEY_ED25519843# define ed448_evp_type EVP_PKEY_ED448844# define x25519_evp_type EVP_PKEY_X25519845# define x448_evp_type EVP_PKEY_X448846# define ed25519_pem_type "ED25519"847# define ed448_pem_type "ED448"848# define x25519_pem_type "X25519"849# define x448_pem_type "X448"850#endif851852/* ---------------------------------------------------------------------- */853854#ifndef OPENSSL_NO_ML_DSA855static int ml_dsa_spki_pub_to_der(const void *vkey, unsigned char **pder,856ossl_unused void *ctx)857{858return ossl_ml_dsa_i2d_pubkey(vkey, pder);859}860861static int ml_dsa_pki_priv_to_der(const void *vkey, unsigned char **pder,862void *vctx)863{864KEY2ANY_CTX *ctx = vctx;865866return ossl_ml_dsa_i2d_prvkey(vkey, pder, ctx->provctx);867}868869# define ml_dsa_epki_priv_to_der ml_dsa_pki_priv_to_der870# define prepare_ml_dsa_params NULL871# define ml_dsa_check_key_type NULL872873# define ml_dsa_44_evp_type EVP_PKEY_ML_DSA_44874# define ml_dsa_44_pem_type "ML-DSA-44"875# define ml_dsa_65_evp_type EVP_PKEY_ML_DSA_65876# define ml_dsa_65_pem_type "ML-DSA-65"877# define ml_dsa_87_evp_type EVP_PKEY_ML_DSA_87878# define ml_dsa_87_pem_type "ML-DSA-87"879#endif /* OPENSSL_NO_ML_DSA */880881/* ---------------------------------------------------------------------- */882883#ifndef OPENSSL_NO_ML_KEM884885static int ml_kem_spki_pub_to_der(const void *vkey, unsigned char **pder,886ossl_unused void *ctx)887{888return ossl_ml_kem_i2d_pubkey(vkey, pder);889}890891static int ml_kem_pki_priv_to_der(const void *vkey, unsigned char **pder,892void *vctx)893{894KEY2ANY_CTX *ctx = vctx;895896return ossl_ml_kem_i2d_prvkey(vkey, pder, ctx->provctx);897}898899# define ml_kem_epki_priv_to_der ml_kem_pki_priv_to_der900# define prepare_ml_kem_params NULL901# define ml_kem_check_key_type NULL902903# define ml_kem_512_evp_type EVP_PKEY_ML_KEM_512904# define ml_kem_512_pem_type "ML-KEM-512"905# define ml_kem_768_evp_type EVP_PKEY_ML_KEM_768906# define ml_kem_768_pem_type "ML-KEM-768"907# define ml_kem_1024_evp_type EVP_PKEY_ML_KEM_1024908# define ml_kem_1024_pem_type "ML-KEM-1024"909#endif910911/* ---------------------------------------------------------------------- */912913/*914* Helper functions to prepare RSA-PSS params for encoding. We would915* have simply written the whole AlgorithmIdentifier, but existing libcrypto916* functionality doesn't allow that.917*/918919static int prepare_rsa_params(const void *rsa, int nid, int save,920void **pstr, int *pstrtype)921{922const RSA_PSS_PARAMS_30 *pss = ossl_rsa_get0_pss_params_30((RSA *)rsa);923924*pstr = NULL;925926switch (RSA_test_flags(rsa, RSA_FLAG_TYPE_MASK)) {927case RSA_FLAG_TYPE_RSA:928/* If plain RSA, the parameters shall be NULL */929*pstrtype = V_ASN1_NULL;930return 1;931case RSA_FLAG_TYPE_RSASSAPSS:932if (ossl_rsa_pss_params_30_is_unrestricted(pss)) {933*pstrtype = V_ASN1_UNDEF;934return 1;935} else {936ASN1_STRING *astr = NULL;937WPACKET pkt;938unsigned char *str = NULL;939size_t str_sz = 0;940int i;941942for (i = 0; i < 2; i++) {943switch (i) {944case 0:945if (!WPACKET_init_null_der(&pkt))946goto err;947break;948case 1:949if ((str = OPENSSL_malloc(str_sz)) == NULL950|| !WPACKET_init_der(&pkt, str, str_sz)) {951WPACKET_cleanup(&pkt);952goto err;953}954break;955}956if (!ossl_DER_w_RSASSA_PSS_params(&pkt, -1, pss)957|| !WPACKET_finish(&pkt)958|| !WPACKET_get_total_written(&pkt, &str_sz)) {959WPACKET_cleanup(&pkt);960goto err;961}962WPACKET_cleanup(&pkt);963964/*965* If no PSS parameters are going to be written, there's no966* point going for another iteration.967* This saves us from getting |str| allocated just to have it968* immediately de-allocated.969*/970if (str_sz == 0)971break;972}973974if ((astr = ASN1_STRING_new()) == NULL)975goto err;976*pstrtype = V_ASN1_SEQUENCE;977ASN1_STRING_set0(astr, str, (int)str_sz);978*pstr = astr;979980return 1;981err:982OPENSSL_free(str);983return 0;984}985}986987/* Currently unsupported RSA key type */988return 0;989}990991k2d_NOCTX(rsa_prv, i2d_RSAPrivateKey)992k2d_NOCTX(rsa_pub, i2d_RSAPublicKey)993994/*995* RSA is extremely simple, as PKCS#1 is used for the PKCS#8 |privateKey|996* field as well as the SubjectPublicKeyInfo |subjectPublicKey| field.997*/998#define rsa_pki_priv_to_der rsa_type_specific_priv_to_der999#define rsa_epki_priv_to_der rsa_type_specific_priv_to_der1000#define rsa_spki_pub_to_der rsa_type_specific_pub_to_der1001#define rsa_type_specific_priv_to_der rsa_prv_k2d1002#define rsa_type_specific_pub_to_der rsa_pub_k2d1003#define rsa_type_specific_params_to_der NULL10041005static int rsa_check_key_type(const void *rsa, int expected_type)1006{1007switch (RSA_test_flags(rsa, RSA_FLAG_TYPE_MASK)) {1008case RSA_FLAG_TYPE_RSA:1009return expected_type == EVP_PKEY_RSA;1010case RSA_FLAG_TYPE_RSASSAPSS:1011return expected_type == EVP_PKEY_RSA_PSS;1012}10131014/* Currently unsupported RSA key type */1015return EVP_PKEY_NONE;1016}10171018#define rsa_evp_type EVP_PKEY_RSA1019#define rsapss_evp_type EVP_PKEY_RSA_PSS1020#define rsa_pem_type "RSA"1021#define rsapss_pem_type "RSA-PSS"10221023/* ---------------------------------------------------------------------- */10241025#ifndef OPENSSL_NO_SLH_DSA1026# define prepare_slh_dsa_params NULL10271028static int slh_dsa_spki_pub_to_der(const void *vkey, unsigned char **pder,1029ossl_unused void *ctx)1030{1031const SLH_DSA_KEY *key = vkey;1032uint8_t *key_blob;1033size_t key_len;10341035if (key == NULL) {1036ERR_raise(ERR_LIB_PROV, ERR_R_PASSED_NULL_PARAMETER);1037return 0;1038}1039key_len = ossl_slh_dsa_key_get_pub_len(key);1040key_blob = OPENSSL_memdup(ossl_slh_dsa_key_get_pub(key), key_len);1041if (key_blob == NULL)1042return 0;10431044*pder = key_blob;1045return key_len;1046}10471048static int slh_dsa_pki_priv_to_der(const void *vkey, unsigned char **pder,1049ossl_unused void *ctx)1050{1051const SLH_DSA_KEY *key = vkey;1052size_t len;10531054if (ossl_slh_dsa_key_get_priv(key) == NULL) {1055ERR_raise(ERR_LIB_PROV, ERR_R_PASSED_NULL_PARAMETER);1056return 0;1057}1058len = ossl_slh_dsa_key_get_priv_len(key);10591060if (pder != NULL1061&& ((*pder = OPENSSL_memdup(ossl_slh_dsa_key_get_priv(key), len)) == NULL))1062return 0;10631064return len;1065}1066# define slh_dsa_epki_priv_to_der slh_dsa_pki_priv_to_der10671068/* SLH_DSA only has PKCS#8 / SubjectPublicKeyInfo representations. */10691070# define slh_dsa_check_key_type NULL1071# define slh_dsa_sha2_128s_evp_type EVP_PKEY_SLH_DSA_SHA2_128S1072# define slh_dsa_sha2_128f_evp_type EVP_PKEY_SLH_DSA_SHA2_128F1073# define slh_dsa_sha2_192s_evp_type EVP_PKEY_SLH_DSA_SHA2_192S1074# define slh_dsa_sha2_192f_evp_type EVP_PKEY_SLH_DSA_SHA2_192F1075# define slh_dsa_sha2_256s_evp_type EVP_PKEY_SLH_DSA_SHA2_256S1076# define slh_dsa_sha2_256f_evp_type EVP_PKEY_SLH_DSA_SHA2_256F1077# define slh_dsa_shake_128s_evp_type EVP_PKEY_SLH_DSA_SHAKE_128S1078# define slh_dsa_shake_128f_evp_type EVP_PKEY_SLH_DSA_SHAKE_128F1079# define slh_dsa_shake_192s_evp_type EVP_PKEY_SLH_DSA_SHAKE_192S1080# define slh_dsa_shake_192f_evp_type EVP_PKEY_SLH_DSA_SHAKE_192F1081# define slh_dsa_shake_256s_evp_type EVP_PKEY_SLH_DSA_SHAKE_256S1082# define slh_dsa_shake_256f_evp_type EVP_PKEY_SLH_DSA_SHAKE_256F1083# define slh_dsa_sha2_128s_input_type "SLH-DSA-SHA2-128s"1084# define slh_dsa_sha2_128f_input_type "SLH-DSA-SHA2-128f"1085# define slh_dsa_sha2_192s_input_type "SLH-DSA-SHA2-192s"1086# define slh_dsa_sha2_192f_input_type "SLH-DSA-SHA2-192f"1087# define slh_dsa_sha2_256s_input_type "SLH-DSA-SHA2-256s"1088# define slh_dsa_sha2_256f_input_type "SLH-DSA-SHA2-256f"1089# define slh_dsa_shake_128s_input_type "SLH-DSA-SHAKE-128s"1090# define slh_dsa_shake_128f_input_type "SLH-DSA-SHAKE-128f"1091# define slh_dsa_shake_192s_input_type "SLH-DSA-SHAKE-192s"1092# define slh_dsa_shake_192f_input_type "SLH-DSA-SHAKE-192f"1093# define slh_dsa_shake_256s_input_type "SLH-DSA-SHAKE-256s"1094# define slh_dsa_shake_256f_input_type "SLH-DSA-SHAKE-256f"1095# define slh_dsa_sha2_128s_pem_type "SLH-DSA-SHA2-128s"1096# define slh_dsa_sha2_128f_pem_type "SLH-DSA-SHA2-128f"1097# define slh_dsa_sha2_192s_pem_type "SLH-DSA-SHA2-192s"1098# define slh_dsa_sha2_192f_pem_type "SLH-DSA-SHA2-192f"1099# define slh_dsa_sha2_256s_pem_type "SLH-DSA-SHA2-256s"1100# define slh_dsa_sha2_256f_pem_type "SLH-DSA-SHA2-256f"1101# define slh_dsa_shake_128s_pem_type "SLH-DSA-SHAKE-128s"1102# define slh_dsa_shake_128f_pem_type "SLH-DSA-SHAKE-128f"1103# define slh_dsa_shake_192s_pem_type "SLH-DSA-SHAKE-192s"1104# define slh_dsa_shake_192f_pem_type "SLH-DSA-SHAKE-192f"1105# define slh_dsa_shake_256s_pem_type "SLH-DSA-SHAKE-256s"1106# define slh_dsa_shake_256f_pem_type "SLH-DSA-SHAKE-256f"1107#endif /* OPENSSL_NO_SLH_DSA */11081109/* ---------------------------------------------------------------------- */11101111static OSSL_FUNC_decoder_newctx_fn key2any_newctx;1112static OSSL_FUNC_decoder_freectx_fn key2any_freectx;11131114static void *key2any_newctx(void *provctx)1115{1116KEY2ANY_CTX *ctx = OPENSSL_zalloc(sizeof(*ctx));11171118if (ctx != NULL) {1119ctx->provctx = provctx;1120ctx->save_parameters = 1;1121}11221123return ctx;1124}11251126static void key2any_freectx(void *vctx)1127{1128KEY2ANY_CTX *ctx = vctx;11291130ossl_pw_clear_passphrase_data(&ctx->pwdata);1131EVP_CIPHER_free(ctx->cipher);1132OPENSSL_free(ctx);1133}11341135static const OSSL_PARAM *key2any_settable_ctx_params(ossl_unused void *provctx)1136{1137static const OSSL_PARAM settables[] = {1138OSSL_PARAM_utf8_string(OSSL_ENCODER_PARAM_CIPHER, NULL, 0),1139OSSL_PARAM_utf8_string(OSSL_ENCODER_PARAM_PROPERTIES, NULL, 0),1140OSSL_PARAM_END,1141};11421143return settables;1144}11451146static int key2any_set_ctx_params(void *vctx, const OSSL_PARAM params[])1147{1148KEY2ANY_CTX *ctx = vctx;1149OSSL_LIB_CTX *libctx = ossl_prov_ctx_get0_libctx(ctx->provctx);1150const OSSL_PARAM *cipherp =1151OSSL_PARAM_locate_const(params, OSSL_ENCODER_PARAM_CIPHER);1152const OSSL_PARAM *propsp =1153OSSL_PARAM_locate_const(params, OSSL_ENCODER_PARAM_PROPERTIES);1154const OSSL_PARAM *save_paramsp =1155OSSL_PARAM_locate_const(params, OSSL_ENCODER_PARAM_SAVE_PARAMETERS);11561157if (cipherp != NULL) {1158const char *ciphername = NULL;1159const char *props = NULL;11601161if (!OSSL_PARAM_get_utf8_string_ptr(cipherp, &ciphername))1162return 0;1163if (propsp != NULL && !OSSL_PARAM_get_utf8_string_ptr(propsp, &props))1164return 0;11651166EVP_CIPHER_free(ctx->cipher);1167ctx->cipher = NULL;1168ctx->cipher_intent = ciphername != NULL;1169if (ciphername != NULL1170&& ((ctx->cipher =1171EVP_CIPHER_fetch(libctx, ciphername, props)) == NULL))1172return 0;1173}11741175if (save_paramsp != NULL) {1176if (!OSSL_PARAM_get_int(save_paramsp, &ctx->save_parameters))1177return 0;1178}1179return 1;1180}11811182static int key2any_check_selection(int selection, int selection_mask)1183{1184/*1185* The selections are kinda sorta "levels", i.e. each selection given1186* here is assumed to include those following.1187*/1188int checks[] = {1189OSSL_KEYMGMT_SELECT_PRIVATE_KEY,1190OSSL_KEYMGMT_SELECT_PUBLIC_KEY,1191OSSL_KEYMGMT_SELECT_ALL_PARAMETERS1192};1193size_t i;11941195/* The decoder implementations made here support guessing */1196if (selection == 0)1197return 1;11981199for (i = 0; i < OSSL_NELEM(checks); i++) {1200int check1 = (selection & checks[i]) != 0;1201int check2 = (selection_mask & checks[i]) != 0;12021203/*1204* If the caller asked for the currently checked bit(s), return1205* whether the decoder description says it's supported.1206*/1207if (check1)1208return check2;1209}12101211/* This should be dead code, but just to be safe... */1212return 0;1213}12141215static int key2any_encode(KEY2ANY_CTX *ctx, OSSL_CORE_BIO *cout,1216const void *key, int type, const char *pemname,1217check_key_type_fn *checker,1218key_to_der_fn *writer,1219OSSL_PASSPHRASE_CALLBACK *pwcb, void *pwcbarg,1220key_to_paramstring_fn *key2paramstring,1221OSSL_i2d_of_void_ctx *key2der)1222{1223int ret = 0;12241225if (key == NULL) {1226ERR_raise(ERR_LIB_PROV, ERR_R_PASSED_NULL_PARAMETER);1227} else if (writer != NULL1228&& (checker == NULL || checker(key, type))) {1229BIO *out = ossl_bio_new_from_core_bio(ctx->provctx, cout);12301231if (out != NULL1232&& (pwcb == NULL1233|| ossl_pw_set_ossl_passphrase_cb(&ctx->pwdata, pwcb, pwcbarg)))1234ret =1235writer(out, key, type, pemname, key2paramstring, key2der, ctx);12361237BIO_free(out);1238} else {1239ERR_raise(ERR_LIB_PROV, ERR_R_PASSED_INVALID_ARGUMENT);1240}1241return ret;1242}12431244#define DO_PRIVATE_KEY_selection_mask OSSL_KEYMGMT_SELECT_PRIVATE_KEY1245#define DO_PRIVATE_KEY(impl, type, kind, output) \1246if ((selection & DO_PRIVATE_KEY_selection_mask) != 0) \1247return key2any_encode(ctx, cout, key, impl##_evp_type, \1248impl##_pem_type " PRIVATE KEY", \1249type##_check_key_type, \1250key_to_##kind##_##output##_priv_bio, \1251cb, cbarg, prepare_##type##_params, \1252type##_##kind##_priv_to_der);12531254#define DO_PUBLIC_KEY_selection_mask OSSL_KEYMGMT_SELECT_PUBLIC_KEY1255#define DO_PUBLIC_KEY(impl, type, kind, output) \1256if ((selection & DO_PUBLIC_KEY_selection_mask) != 0) \1257return key2any_encode(ctx, cout, key, impl##_evp_type, \1258impl##_pem_type " PUBLIC KEY", \1259type##_check_key_type, \1260key_to_##kind##_##output##_pub_bio, \1261cb, cbarg, prepare_##type##_params, \1262type##_##kind##_pub_to_der);12631264#define DO_PARAMETERS_selection_mask OSSL_KEYMGMT_SELECT_ALL_PARAMETERS1265#define DO_PARAMETERS(impl, type, kind, output) \1266if ((selection & DO_PARAMETERS_selection_mask) != 0) \1267return key2any_encode(ctx, cout, key, impl##_evp_type, \1268impl##_pem_type " PARAMETERS", \1269type##_check_key_type, \1270key_to_##kind##_##output##_param_bio, \1271NULL, NULL, NULL, \1272type##_##kind##_params_to_der);12731274/*-1275* Implement the kinds of output structure that can be produced. They are1276* referred to by name, and for each name, the following macros are defined1277* (braces not included):1278*1279* DO_{kind}_selection_mask1280*1281* A mask of selection bits that must not be zero. This is used as a1282* selection criterion for each implementation.1283* This mask must never be zero.1284*1285* DO_{kind}1286*1287* The performing macro. It must use the DO_ macros defined above,1288* always in this order:1289*1290* - DO_PRIVATE_KEY1291* - DO_PUBLIC_KEY1292* - DO_PARAMETERS1293*1294* Any of those may be omitted, but the relative order must still be1295* the same.1296*/12971298/*1299* PKCS#8 defines two structures for private keys only:1300* - PrivateKeyInfo (raw unencrypted form)1301* - EncryptedPrivateKeyInfo (encrypted wrapping)1302*1303* To allow a certain amount of flexibility, we allow the routines1304* for PrivateKeyInfo to also produce EncryptedPrivateKeyInfo if a1305* passphrase callback has been passed to them.1306*/1307#define DO_PrivateKeyInfo_selection_mask DO_PRIVATE_KEY_selection_mask1308#define DO_PrivateKeyInfo(impl, type, output) \1309DO_PRIVATE_KEY(impl, type, pki, output)13101311#define DO_EncryptedPrivateKeyInfo_selection_mask DO_PRIVATE_KEY_selection_mask1312#define DO_EncryptedPrivateKeyInfo(impl, type, output) \1313DO_PRIVATE_KEY(impl, type, epki, output)13141315/* SubjectPublicKeyInfo is a structure for public keys only */1316#define DO_SubjectPublicKeyInfo_selection_mask DO_PUBLIC_KEY_selection_mask1317#define DO_SubjectPublicKeyInfo(impl, type, output) \1318DO_PUBLIC_KEY(impl, type, spki, output)13191320/*1321* "type-specific" is a uniform name for key type specific output for private1322* and public keys as well as key parameters. This is used internally in1323* libcrypto so it doesn't have to have special knowledge about select key1324* types, but also when no better name has been found. If there are more1325* expressive DO_ names above, those are preferred.1326*1327* Three forms exist:1328*1329* - type_specific_keypair Only supports private and public key1330* - type_specific_params Only supports parameters1331* - type_specific Supports all parts of an EVP_PKEY1332* - type_specific_no_pub Supports all parts of an EVP_PKEY1333* except public key1334*/1335#define DO_type_specific_params_selection_mask DO_PARAMETERS_selection_mask1336#define DO_type_specific_params(impl, type, output) \1337DO_PARAMETERS(impl, type, type_specific, output)1338#define DO_type_specific_keypair_selection_mask \1339( DO_PRIVATE_KEY_selection_mask | DO_PUBLIC_KEY_selection_mask )1340#define DO_type_specific_keypair(impl, type, output) \1341DO_PRIVATE_KEY(impl, type, type_specific, output) \1342DO_PUBLIC_KEY(impl, type, type_specific, output)1343#define DO_type_specific_selection_mask \1344( DO_type_specific_keypair_selection_mask \1345| DO_type_specific_params_selection_mask )1346#define DO_type_specific(impl, type, output) \1347DO_type_specific_keypair(impl, type, output) \1348DO_type_specific_params(impl, type, output)1349#define DO_type_specific_no_pub_selection_mask \1350( DO_PRIVATE_KEY_selection_mask | DO_PARAMETERS_selection_mask)1351#define DO_type_specific_no_pub(impl, type, output) \1352DO_PRIVATE_KEY(impl, type, type_specific, output) \1353DO_type_specific_params(impl, type, output)13541355/*1356* Type specific aliases for the cases where we need to refer to them by1357* type name.1358* This only covers key types that are represented with i2d_{TYPE}PrivateKey,1359* i2d_{TYPE}PublicKey and i2d_{TYPE}params / i2d_{TYPE}Parameters.1360*/1361#define DO_RSA_selection_mask DO_type_specific_keypair_selection_mask1362#define DO_RSA(impl, type, output) DO_type_specific_keypair(impl, type, output)13631364#define DO_DH_selection_mask DO_type_specific_params_selection_mask1365#define DO_DH(impl, type, output) DO_type_specific_params(impl, type, output)13661367#define DO_DHX_selection_mask DO_type_specific_params_selection_mask1368#define DO_DHX(impl, type, output) DO_type_specific_params(impl, type, output)13691370#define DO_DSA_selection_mask DO_type_specific_selection_mask1371#define DO_DSA(impl, type, output) DO_type_specific(impl, type, output)13721373#define DO_EC_selection_mask DO_type_specific_no_pub_selection_mask1374#define DO_EC(impl, type, output) DO_type_specific_no_pub(impl, type, output)13751376#define DO_SM2_selection_mask DO_type_specific_no_pub_selection_mask1377#define DO_SM2(impl, type, output) DO_type_specific_no_pub(impl, type, output)13781379/* PKCS#1 defines a structure for RSA private and public keys */1380#define DO_PKCS1_selection_mask DO_RSA_selection_mask1381#define DO_PKCS1(impl, type, output) DO_RSA(impl, type, output)13821383/* PKCS#3 defines a structure for DH parameters */1384#define DO_PKCS3_selection_mask DO_DH_selection_mask1385#define DO_PKCS3(impl, type, output) DO_DH(impl, type, output)1386/* X9.42 defines a structure for DHx parameters */1387#define DO_X9_42_selection_mask DO_DHX_selection_mask1388#define DO_X9_42(impl, type, output) DO_DHX(impl, type, output)13891390/* X9.62 defines a structure for EC keys and parameters */1391#define DO_X9_62_selection_mask DO_EC_selection_mask1392#define DO_X9_62(impl, type, output) DO_EC(impl, type, output)13931394/*1395* MAKE_ENCODER is the single driver for creating OSSL_DISPATCH tables.1396* It takes the following arguments:1397*1398* impl This is the key type name that's being implemented.1399* type This is the type name for the set of functions that implement1400* the key type. For example, ed25519, ed448, x25519 and x4481401* are all implemented with the exact same set of functions.1402* kind What kind of support to implement. These translate into1403* the DO_##kind macros above.1404* output The output type to implement. may be der or pem.1405*1406* The resulting OSSL_DISPATCH array gets the following name (expressed in1407* C preprocessor terms) from those arguments:1408*1409* ossl_##impl##_to_##kind##_##output##_encoder_functions1410*/1411#define MAKE_ENCODER(impl, type, kind, output) \1412static OSSL_FUNC_encoder_import_object_fn \1413impl##_to_##kind##_##output##_import_object; \1414static OSSL_FUNC_encoder_free_object_fn \1415impl##_to_##kind##_##output##_free_object; \1416static OSSL_FUNC_encoder_encode_fn \1417impl##_to_##kind##_##output##_encode; \1418\1419static void * \1420impl##_to_##kind##_##output##_import_object(void *vctx, int selection, \1421const OSSL_PARAM params[]) \1422{ \1423KEY2ANY_CTX *ctx = vctx; \1424\1425return ossl_prov_import_key(ossl_##impl##_keymgmt_functions, \1426ctx->provctx, selection, params); \1427} \1428static void impl##_to_##kind##_##output##_free_object(void *key) \1429{ \1430ossl_prov_free_key(ossl_##impl##_keymgmt_functions, key); \1431} \1432static int impl##_to_##kind##_##output##_does_selection(void *ctx, \1433int selection) \1434{ \1435return key2any_check_selection(selection, \1436DO_##kind##_selection_mask); \1437} \1438static int \1439impl##_to_##kind##_##output##_encode(void *ctx, OSSL_CORE_BIO *cout, \1440const void *key, \1441const OSSL_PARAM key_abstract[], \1442int selection, \1443OSSL_PASSPHRASE_CALLBACK *cb, \1444void *cbarg) \1445{ \1446/* We don't deal with abstract objects */ \1447if (key_abstract != NULL) { \1448ERR_raise(ERR_LIB_PROV, ERR_R_PASSED_INVALID_ARGUMENT); \1449return 0; \1450} \1451DO_##kind(impl, type, output) \1452\1453ERR_raise(ERR_LIB_PROV, ERR_R_PASSED_INVALID_ARGUMENT); \1454return 0; \1455} \1456const OSSL_DISPATCH \1457ossl_##impl##_to_##kind##_##output##_encoder_functions[] = { \1458{ OSSL_FUNC_ENCODER_NEWCTX, \1459(void (*)(void))key2any_newctx }, \1460{ OSSL_FUNC_ENCODER_FREECTX, \1461(void (*)(void))key2any_freectx }, \1462{ OSSL_FUNC_ENCODER_SETTABLE_CTX_PARAMS, \1463(void (*)(void))key2any_settable_ctx_params }, \1464{ OSSL_FUNC_ENCODER_SET_CTX_PARAMS, \1465(void (*)(void))key2any_set_ctx_params }, \1466{ OSSL_FUNC_ENCODER_DOES_SELECTION, \1467(void (*)(void))impl##_to_##kind##_##output##_does_selection }, \1468{ OSSL_FUNC_ENCODER_IMPORT_OBJECT, \1469(void (*)(void))impl##_to_##kind##_##output##_import_object }, \1470{ OSSL_FUNC_ENCODER_FREE_OBJECT, \1471(void (*)(void))impl##_to_##kind##_##output##_free_object }, \1472{ OSSL_FUNC_ENCODER_ENCODE, \1473(void (*)(void))impl##_to_##kind##_##output##_encode }, \1474OSSL_DISPATCH_END \1475}14761477/*1478* Replacements for i2d_{TYPE}PrivateKey, i2d_{TYPE}PublicKey,1479* i2d_{TYPE}params, as they exist.1480*/1481MAKE_ENCODER(rsa, rsa, type_specific_keypair, der);1482#ifndef OPENSSL_NO_DH1483MAKE_ENCODER(dh, dh, type_specific_params, der);1484MAKE_ENCODER(dhx, dh, type_specific_params, der);1485#endif1486#ifndef OPENSSL_NO_DSA1487MAKE_ENCODER(dsa, dsa, type_specific, der);1488#endif1489#ifndef OPENSSL_NO_EC1490MAKE_ENCODER(ec, ec, type_specific_no_pub, der);1491# ifndef OPENSSL_NO_SM21492MAKE_ENCODER(sm2, ec, type_specific_no_pub, der);1493# endif1494#endif14951496/*1497* Replacements for PEM_write_bio_{TYPE}PrivateKey,1498* PEM_write_bio_{TYPE}PublicKey, PEM_write_bio_{TYPE}params, as they exist.1499*/1500MAKE_ENCODER(rsa, rsa, type_specific_keypair, pem);1501#ifndef OPENSSL_NO_DH1502MAKE_ENCODER(dh, dh, type_specific_params, pem);1503MAKE_ENCODER(dhx, dh, type_specific_params, pem);1504#endif1505#ifndef OPENSSL_NO_DSA1506MAKE_ENCODER(dsa, dsa, type_specific, pem);1507#endif1508#ifndef OPENSSL_NO_EC1509MAKE_ENCODER(ec, ec, type_specific_no_pub, pem);1510# ifndef OPENSSL_NO_SM21511MAKE_ENCODER(sm2, ec, type_specific_no_pub, pem);1512# endif1513#endif15141515/*1516* PKCS#8 and SubjectPublicKeyInfo support. This may duplicate some of the1517* implementations specified above, but are more specific.1518* The SubjectPublicKeyInfo implementations also replace the1519* PEM_write_bio_{TYPE}_PUBKEY functions.1520* For PEM, these are expected to be used by PEM_write_bio_PrivateKey(),1521* PEM_write_bio_PUBKEY() and PEM_write_bio_Parameters().1522*/1523MAKE_ENCODER(rsa, rsa, EncryptedPrivateKeyInfo, der);1524MAKE_ENCODER(rsa, rsa, EncryptedPrivateKeyInfo, pem);1525MAKE_ENCODER(rsa, rsa, PrivateKeyInfo, der);1526MAKE_ENCODER(rsa, rsa, PrivateKeyInfo, pem);1527MAKE_ENCODER(rsa, rsa, SubjectPublicKeyInfo, der);1528MAKE_ENCODER(rsa, rsa, SubjectPublicKeyInfo, pem);1529MAKE_ENCODER(rsapss, rsa, EncryptedPrivateKeyInfo, der);1530MAKE_ENCODER(rsapss, rsa, EncryptedPrivateKeyInfo, pem);1531MAKE_ENCODER(rsapss, rsa, PrivateKeyInfo, der);1532MAKE_ENCODER(rsapss, rsa, PrivateKeyInfo, pem);1533MAKE_ENCODER(rsapss, rsa, SubjectPublicKeyInfo, der);1534MAKE_ENCODER(rsapss, rsa, SubjectPublicKeyInfo, pem);1535#ifndef OPENSSL_NO_DH1536MAKE_ENCODER(dh, dh, EncryptedPrivateKeyInfo, der);1537MAKE_ENCODER(dh, dh, EncryptedPrivateKeyInfo, pem);1538MAKE_ENCODER(dh, dh, PrivateKeyInfo, der);1539MAKE_ENCODER(dh, dh, PrivateKeyInfo, pem);1540MAKE_ENCODER(dh, dh, SubjectPublicKeyInfo, der);1541MAKE_ENCODER(dh, dh, SubjectPublicKeyInfo, pem);1542MAKE_ENCODER(dhx, dh, EncryptedPrivateKeyInfo, der);1543MAKE_ENCODER(dhx, dh, EncryptedPrivateKeyInfo, pem);1544MAKE_ENCODER(dhx, dh, PrivateKeyInfo, der);1545MAKE_ENCODER(dhx, dh, PrivateKeyInfo, pem);1546MAKE_ENCODER(dhx, dh, SubjectPublicKeyInfo, der);1547MAKE_ENCODER(dhx, dh, SubjectPublicKeyInfo, pem);1548#endif1549#ifndef OPENSSL_NO_DSA1550MAKE_ENCODER(dsa, dsa, EncryptedPrivateKeyInfo, der);1551MAKE_ENCODER(dsa, dsa, EncryptedPrivateKeyInfo, pem);1552MAKE_ENCODER(dsa, dsa, PrivateKeyInfo, der);1553MAKE_ENCODER(dsa, dsa, PrivateKeyInfo, pem);1554MAKE_ENCODER(dsa, dsa, SubjectPublicKeyInfo, der);1555MAKE_ENCODER(dsa, dsa, SubjectPublicKeyInfo, pem);1556#endif1557#ifndef OPENSSL_NO_EC1558MAKE_ENCODER(ec, ec, EncryptedPrivateKeyInfo, der);1559MAKE_ENCODER(ec, ec, EncryptedPrivateKeyInfo, pem);1560MAKE_ENCODER(ec, ec, PrivateKeyInfo, der);1561MAKE_ENCODER(ec, ec, PrivateKeyInfo, pem);1562MAKE_ENCODER(ec, ec, SubjectPublicKeyInfo, der);1563MAKE_ENCODER(ec, ec, SubjectPublicKeyInfo, pem);1564# ifndef OPENSSL_NO_SM21565MAKE_ENCODER(sm2, ec, EncryptedPrivateKeyInfo, der);1566MAKE_ENCODER(sm2, ec, EncryptedPrivateKeyInfo, pem);1567MAKE_ENCODER(sm2, ec, PrivateKeyInfo, der);1568MAKE_ENCODER(sm2, ec, PrivateKeyInfo, pem);1569MAKE_ENCODER(sm2, ec, SubjectPublicKeyInfo, der);1570MAKE_ENCODER(sm2, ec, SubjectPublicKeyInfo, pem);1571# endif1572# ifndef OPENSSL_NO_ECX1573MAKE_ENCODER(ed25519, ecx, EncryptedPrivateKeyInfo, der);1574MAKE_ENCODER(ed25519, ecx, EncryptedPrivateKeyInfo, pem);1575MAKE_ENCODER(ed25519, ecx, PrivateKeyInfo, der);1576MAKE_ENCODER(ed25519, ecx, PrivateKeyInfo, pem);1577MAKE_ENCODER(ed25519, ecx, SubjectPublicKeyInfo, der);1578MAKE_ENCODER(ed25519, ecx, SubjectPublicKeyInfo, pem);1579MAKE_ENCODER(ed448, ecx, EncryptedPrivateKeyInfo, der);1580MAKE_ENCODER(ed448, ecx, EncryptedPrivateKeyInfo, pem);1581MAKE_ENCODER(ed448, ecx, PrivateKeyInfo, der);1582MAKE_ENCODER(ed448, ecx, PrivateKeyInfo, pem);1583MAKE_ENCODER(ed448, ecx, SubjectPublicKeyInfo, der);1584MAKE_ENCODER(ed448, ecx, SubjectPublicKeyInfo, pem);1585MAKE_ENCODER(x25519, ecx, EncryptedPrivateKeyInfo, der);1586MAKE_ENCODER(x25519, ecx, EncryptedPrivateKeyInfo, pem);1587MAKE_ENCODER(x25519, ecx, PrivateKeyInfo, der);1588MAKE_ENCODER(x25519, ecx, PrivateKeyInfo, pem);1589MAKE_ENCODER(x25519, ecx, SubjectPublicKeyInfo, der);1590MAKE_ENCODER(x25519, ecx, SubjectPublicKeyInfo, pem);1591MAKE_ENCODER(x448, ecx, EncryptedPrivateKeyInfo, der);1592MAKE_ENCODER(x448, ecx, EncryptedPrivateKeyInfo, pem);1593MAKE_ENCODER(x448, ecx, PrivateKeyInfo, der);1594MAKE_ENCODER(x448, ecx, PrivateKeyInfo, pem);1595MAKE_ENCODER(x448, ecx, SubjectPublicKeyInfo, der);1596MAKE_ENCODER(x448, ecx, SubjectPublicKeyInfo, pem);1597# endif1598#endif1599#ifndef OPENSSL_NO_SLH_DSA1600MAKE_ENCODER(slh_dsa_sha2_128s, slh_dsa, EncryptedPrivateKeyInfo, der);1601MAKE_ENCODER(slh_dsa_sha2_128f, slh_dsa, EncryptedPrivateKeyInfo, der);1602MAKE_ENCODER(slh_dsa_sha2_192s, slh_dsa, EncryptedPrivateKeyInfo, der);1603MAKE_ENCODER(slh_dsa_sha2_192f, slh_dsa, EncryptedPrivateKeyInfo, der);1604MAKE_ENCODER(slh_dsa_sha2_256s, slh_dsa, EncryptedPrivateKeyInfo, der);1605MAKE_ENCODER(slh_dsa_sha2_256f, slh_dsa, EncryptedPrivateKeyInfo, der);1606MAKE_ENCODER(slh_dsa_sha2_128s, slh_dsa, EncryptedPrivateKeyInfo, pem);1607MAKE_ENCODER(slh_dsa_sha2_128f, slh_dsa, EncryptedPrivateKeyInfo, pem);1608MAKE_ENCODER(slh_dsa_sha2_192s, slh_dsa, EncryptedPrivateKeyInfo, pem);1609MAKE_ENCODER(slh_dsa_sha2_192f, slh_dsa, EncryptedPrivateKeyInfo, pem);1610MAKE_ENCODER(slh_dsa_sha2_256s, slh_dsa, EncryptedPrivateKeyInfo, pem);1611MAKE_ENCODER(slh_dsa_sha2_256f, slh_dsa, EncryptedPrivateKeyInfo, pem);1612MAKE_ENCODER(slh_dsa_shake_128s, slh_dsa, EncryptedPrivateKeyInfo, der);1613MAKE_ENCODER(slh_dsa_shake_128f, slh_dsa, EncryptedPrivateKeyInfo, der);1614MAKE_ENCODER(slh_dsa_shake_192s, slh_dsa, EncryptedPrivateKeyInfo, der);1615MAKE_ENCODER(slh_dsa_shake_192f, slh_dsa, EncryptedPrivateKeyInfo, der);1616MAKE_ENCODER(slh_dsa_shake_256s, slh_dsa, EncryptedPrivateKeyInfo, der);1617MAKE_ENCODER(slh_dsa_shake_256f, slh_dsa, EncryptedPrivateKeyInfo, der);1618MAKE_ENCODER(slh_dsa_shake_128s, slh_dsa, EncryptedPrivateKeyInfo, pem);1619MAKE_ENCODER(slh_dsa_shake_128f, slh_dsa, EncryptedPrivateKeyInfo, pem);1620MAKE_ENCODER(slh_dsa_shake_192s, slh_dsa, EncryptedPrivateKeyInfo, pem);1621MAKE_ENCODER(slh_dsa_shake_192f, slh_dsa, EncryptedPrivateKeyInfo, pem);1622MAKE_ENCODER(slh_dsa_shake_256s, slh_dsa, EncryptedPrivateKeyInfo, pem);1623MAKE_ENCODER(slh_dsa_shake_256f, slh_dsa, EncryptedPrivateKeyInfo, pem);1624MAKE_ENCODER(slh_dsa_sha2_128s, slh_dsa, PrivateKeyInfo, der);1625MAKE_ENCODER(slh_dsa_sha2_128f, slh_dsa, PrivateKeyInfo, der);1626MAKE_ENCODER(slh_dsa_sha2_192s, slh_dsa, PrivateKeyInfo, der);1627MAKE_ENCODER(slh_dsa_sha2_192f, slh_dsa, PrivateKeyInfo, der);1628MAKE_ENCODER(slh_dsa_sha2_256s, slh_dsa, PrivateKeyInfo, der);1629MAKE_ENCODER(slh_dsa_sha2_256f, slh_dsa, PrivateKeyInfo, der);1630MAKE_ENCODER(slh_dsa_sha2_128s, slh_dsa, PrivateKeyInfo, pem);1631MAKE_ENCODER(slh_dsa_sha2_128f, slh_dsa, PrivateKeyInfo, pem);1632MAKE_ENCODER(slh_dsa_sha2_192s, slh_dsa, PrivateKeyInfo, pem);1633MAKE_ENCODER(slh_dsa_sha2_192f, slh_dsa, PrivateKeyInfo, pem);1634MAKE_ENCODER(slh_dsa_sha2_256s, slh_dsa, PrivateKeyInfo, pem);1635MAKE_ENCODER(slh_dsa_sha2_256f, slh_dsa, PrivateKeyInfo, pem);1636MAKE_ENCODER(slh_dsa_shake_128s, slh_dsa, PrivateKeyInfo, der);1637MAKE_ENCODER(slh_dsa_shake_128f, slh_dsa, PrivateKeyInfo, der);1638MAKE_ENCODER(slh_dsa_shake_192s, slh_dsa, PrivateKeyInfo, der);1639MAKE_ENCODER(slh_dsa_shake_192f, slh_dsa, PrivateKeyInfo, der);1640MAKE_ENCODER(slh_dsa_shake_256s, slh_dsa, PrivateKeyInfo, der);1641MAKE_ENCODER(slh_dsa_shake_256f, slh_dsa, PrivateKeyInfo, der);1642MAKE_ENCODER(slh_dsa_shake_128s, slh_dsa, PrivateKeyInfo, pem);1643MAKE_ENCODER(slh_dsa_shake_128f, slh_dsa, PrivateKeyInfo, pem);1644MAKE_ENCODER(slh_dsa_shake_192s, slh_dsa, PrivateKeyInfo, pem);1645MAKE_ENCODER(slh_dsa_shake_192f, slh_dsa, PrivateKeyInfo, pem);1646MAKE_ENCODER(slh_dsa_shake_256s, slh_dsa, PrivateKeyInfo, pem);1647MAKE_ENCODER(slh_dsa_shake_256f, slh_dsa, PrivateKeyInfo, pem);1648MAKE_ENCODER(slh_dsa_sha2_128s, slh_dsa, SubjectPublicKeyInfo, der);1649MAKE_ENCODER(slh_dsa_sha2_128f, slh_dsa, SubjectPublicKeyInfo, der);1650MAKE_ENCODER(slh_dsa_sha2_192s, slh_dsa, SubjectPublicKeyInfo, der);1651MAKE_ENCODER(slh_dsa_sha2_192f, slh_dsa, SubjectPublicKeyInfo, der);1652MAKE_ENCODER(slh_dsa_sha2_256s, slh_dsa, SubjectPublicKeyInfo, der);1653MAKE_ENCODER(slh_dsa_sha2_256f, slh_dsa, SubjectPublicKeyInfo, der);1654MAKE_ENCODER(slh_dsa_sha2_128s, slh_dsa, SubjectPublicKeyInfo, pem);1655MAKE_ENCODER(slh_dsa_sha2_128f, slh_dsa, SubjectPublicKeyInfo, pem);1656MAKE_ENCODER(slh_dsa_sha2_192s, slh_dsa, SubjectPublicKeyInfo, pem);1657MAKE_ENCODER(slh_dsa_sha2_192f, slh_dsa, SubjectPublicKeyInfo, pem);1658MAKE_ENCODER(slh_dsa_sha2_256s, slh_dsa, SubjectPublicKeyInfo, pem);1659MAKE_ENCODER(slh_dsa_sha2_256f, slh_dsa, SubjectPublicKeyInfo, pem);1660MAKE_ENCODER(slh_dsa_shake_128s, slh_dsa, SubjectPublicKeyInfo, der);1661MAKE_ENCODER(slh_dsa_shake_128f, slh_dsa, SubjectPublicKeyInfo, der);1662MAKE_ENCODER(slh_dsa_shake_192s, slh_dsa, SubjectPublicKeyInfo, der);1663MAKE_ENCODER(slh_dsa_shake_192f, slh_dsa, SubjectPublicKeyInfo, der);1664MAKE_ENCODER(slh_dsa_shake_256s, slh_dsa, SubjectPublicKeyInfo, der);1665MAKE_ENCODER(slh_dsa_shake_256f, slh_dsa, SubjectPublicKeyInfo, der);1666MAKE_ENCODER(slh_dsa_shake_128s, slh_dsa, SubjectPublicKeyInfo, pem);1667MAKE_ENCODER(slh_dsa_shake_128f, slh_dsa, SubjectPublicKeyInfo, pem);1668MAKE_ENCODER(slh_dsa_shake_192s, slh_dsa, SubjectPublicKeyInfo, pem);1669MAKE_ENCODER(slh_dsa_shake_192f, slh_dsa, SubjectPublicKeyInfo, pem);1670MAKE_ENCODER(slh_dsa_shake_256s, slh_dsa, SubjectPublicKeyInfo, pem);1671MAKE_ENCODER(slh_dsa_shake_256f, slh_dsa, SubjectPublicKeyInfo, pem);1672#endif /* OPENSSL_NO_SLH_DSA */16731674#ifndef OPENSSL_NO_ML_KEM1675MAKE_ENCODER(ml_kem_512, ml_kem, EncryptedPrivateKeyInfo, der);1676MAKE_ENCODER(ml_kem_512, ml_kem, EncryptedPrivateKeyInfo, pem);1677MAKE_ENCODER(ml_kem_512, ml_kem, PrivateKeyInfo, der);1678MAKE_ENCODER(ml_kem_512, ml_kem, PrivateKeyInfo, pem);1679MAKE_ENCODER(ml_kem_512, ml_kem, SubjectPublicKeyInfo, der);1680MAKE_ENCODER(ml_kem_512, ml_kem, SubjectPublicKeyInfo, pem);16811682MAKE_ENCODER(ml_kem_768, ml_kem, EncryptedPrivateKeyInfo, der);1683MAKE_ENCODER(ml_kem_768, ml_kem, EncryptedPrivateKeyInfo, pem);1684MAKE_ENCODER(ml_kem_768, ml_kem, PrivateKeyInfo, der);1685MAKE_ENCODER(ml_kem_768, ml_kem, PrivateKeyInfo, pem);1686MAKE_ENCODER(ml_kem_768, ml_kem, SubjectPublicKeyInfo, der);1687MAKE_ENCODER(ml_kem_768, ml_kem, SubjectPublicKeyInfo, pem);16881689MAKE_ENCODER(ml_kem_1024, ml_kem, EncryptedPrivateKeyInfo, der);1690MAKE_ENCODER(ml_kem_1024, ml_kem, EncryptedPrivateKeyInfo, pem);1691MAKE_ENCODER(ml_kem_1024, ml_kem, PrivateKeyInfo, der);1692MAKE_ENCODER(ml_kem_1024, ml_kem, PrivateKeyInfo, pem);1693MAKE_ENCODER(ml_kem_1024, ml_kem, SubjectPublicKeyInfo, der);1694MAKE_ENCODER(ml_kem_1024, ml_kem, SubjectPublicKeyInfo, pem);1695#endif16961697/*1698* Support for key type specific output formats. Not all key types have1699* this, we only aim to duplicate what is available in 1.1.1 as1700* i2d_TYPEPrivateKey(), i2d_TYPEPublicKey() and i2d_TYPEparams().1701* For example, there are no publicly available i2d_ function for1702* ED25519, ED448, X25519 or X448, and they therefore only have PKCS#81703* and SubjectPublicKeyInfo implementations as implemented above.1704*/1705MAKE_ENCODER(rsa, rsa, RSA, der);1706MAKE_ENCODER(rsa, rsa, RSA, pem);1707#ifndef OPENSSL_NO_DH1708MAKE_ENCODER(dh, dh, DH, der);1709MAKE_ENCODER(dh, dh, DH, pem);1710MAKE_ENCODER(dhx, dh, DHX, der);1711MAKE_ENCODER(dhx, dh, DHX, pem);1712#endif1713#ifndef OPENSSL_NO_DSA1714MAKE_ENCODER(dsa, dsa, DSA, der);1715MAKE_ENCODER(dsa, dsa, DSA, pem);1716#endif1717#ifndef OPENSSL_NO_EC1718MAKE_ENCODER(ec, ec, EC, der);1719MAKE_ENCODER(ec, ec, EC, pem);1720# ifndef OPENSSL_NO_SM21721MAKE_ENCODER(sm2, ec, SM2, der);1722MAKE_ENCODER(sm2, ec, SM2, pem);1723# endif1724#endif17251726/* Convenience structure names */1727MAKE_ENCODER(rsa, rsa, PKCS1, der);1728MAKE_ENCODER(rsa, rsa, PKCS1, pem);1729MAKE_ENCODER(rsapss, rsa, PKCS1, der);1730MAKE_ENCODER(rsapss, rsa, PKCS1, pem);1731#ifndef OPENSSL_NO_DH1732MAKE_ENCODER(dh, dh, PKCS3, der); /* parameters only */1733MAKE_ENCODER(dh, dh, PKCS3, pem); /* parameters only */1734MAKE_ENCODER(dhx, dh, X9_42, der); /* parameters only */1735MAKE_ENCODER(dhx, dh, X9_42, pem); /* parameters only */1736#endif1737#ifndef OPENSSL_NO_EC1738MAKE_ENCODER(ec, ec, X9_62, der);1739MAKE_ENCODER(ec, ec, X9_62, pem);1740#endif17411742#ifndef OPENSSL_NO_ML_DSA1743MAKE_ENCODER(ml_dsa_44, ml_dsa, EncryptedPrivateKeyInfo, der);1744MAKE_ENCODER(ml_dsa_44, ml_dsa, EncryptedPrivateKeyInfo, pem);1745MAKE_ENCODER(ml_dsa_44, ml_dsa, PrivateKeyInfo, der);1746MAKE_ENCODER(ml_dsa_44, ml_dsa, PrivateKeyInfo, pem);1747MAKE_ENCODER(ml_dsa_44, ml_dsa, SubjectPublicKeyInfo, der);1748MAKE_ENCODER(ml_dsa_44, ml_dsa, SubjectPublicKeyInfo, pem);17491750MAKE_ENCODER(ml_dsa_65, ml_dsa, EncryptedPrivateKeyInfo, der);1751MAKE_ENCODER(ml_dsa_65, ml_dsa, EncryptedPrivateKeyInfo, pem);1752MAKE_ENCODER(ml_dsa_65, ml_dsa, PrivateKeyInfo, der);1753MAKE_ENCODER(ml_dsa_65, ml_dsa, PrivateKeyInfo, pem);1754MAKE_ENCODER(ml_dsa_65, ml_dsa, SubjectPublicKeyInfo, der);1755MAKE_ENCODER(ml_dsa_65, ml_dsa, SubjectPublicKeyInfo, pem);17561757MAKE_ENCODER(ml_dsa_87, ml_dsa, EncryptedPrivateKeyInfo, der);1758MAKE_ENCODER(ml_dsa_87, ml_dsa, EncryptedPrivateKeyInfo, pem);1759MAKE_ENCODER(ml_dsa_87, ml_dsa, PrivateKeyInfo, der);1760MAKE_ENCODER(ml_dsa_87, ml_dsa, PrivateKeyInfo, pem);1761MAKE_ENCODER(ml_dsa_87, ml_dsa, SubjectPublicKeyInfo, der);1762MAKE_ENCODER(ml_dsa_87, ml_dsa, SubjectPublicKeyInfo, pem);1763#endif /* OPENSSL_NO_ML_DSA */176417651766