1/*
2 * Copyright 2020-2025 The OpenSSL Project Authors. All Rights Reserved.
3 *
4 * Licensed under the Apache License 2.0 (the "License").  You may not use
5 * this file except in compliance with the License.  You can obtain a copy
6 * in the file LICENSE in the source distribution or at
7 * https://www.openssl.org/source/license.html
8 */
9{-
10use OpenSSL::paramnames qw(produce_param_decoder);
11-}
12
13/*
14 * low level APIs are deprecated for public use, but still ok for
15 * internal use.
16 */
17#include "internal/deprecated.h"
18
19#include <openssl/byteorder.h>
20#include <openssl/core_dispatch.h>
21#include <openssl/core_names.h>
22#include <openssl/core_object.h>
23#include <openssl/crypto.h>
24#include <openssl/err.h>
25#include <openssl/params.h>
26#include <openssl/pem.h>         /* PEM_BUFSIZE and public PEM functions */
27#include <openssl/pkcs12.h>
28#include <openssl/provider.h>
29#include <openssl/x509.h>
30#include <openssl/proverr.h>
31#include <openssl/asn1t.h>
32#include "internal/cryptlib.h"   /* ossl_assert() */
33#include "crypto/dh.h"
34#include "crypto/dsa.h"
35#include "crypto/ec.h"
36#include "crypto/evp.h"
37#include "crypto/ecx.h"
38#include "crypto/rsa.h"
39#include "crypto/ml_dsa.h"
40#include "crypto/slh_dsa.h"
41#include "crypto/x509.h"
42#include "crypto/ml_kem.h"
43#include "openssl/obj_mac.h"
44#include "prov/bio.h"
45#include "prov/implementations.h"
46#include "prov/endecoder_local.h"
47#include "internal/nelem.h"
48#include "prov/ml_dsa_codecs.h"
49#include "prov/ml_kem_codecs.h"
50
51#ifndef OPENSSL_NO_SLH_DSA
52typedef struct {
53    ASN1_OBJECT *oid;
54} BARE_ALGOR;
55
56typedef struct {
57    BARE_ALGOR algor;
58    ASN1_BIT_STRING *pubkey;
59} BARE_PUBKEY;
60
61ASN1_SEQUENCE(BARE_ALGOR) = {
62    ASN1_SIMPLE(BARE_ALGOR, oid, ASN1_OBJECT),
63} static_ASN1_SEQUENCE_END(BARE_ALGOR)
64
65ASN1_SEQUENCE(BARE_PUBKEY) = {
66    ASN1_EMBED(BARE_PUBKEY, algor, BARE_ALGOR),
67    ASN1_SIMPLE(BARE_PUBKEY, pubkey, ASN1_BIT_STRING)
68} static_ASN1_SEQUENCE_END(BARE_PUBKEY)
69#endif /* OPENSSL_NO_SLH_DSA */
70
71struct der2key_ctx_st;           /* Forward declaration */
72typedef int check_key_fn(void *, struct der2key_ctx_st *ctx);
73typedef void adjust_key_fn(void *, struct der2key_ctx_st *ctx);
74typedef void free_key_fn(void *);
75typedef void *d2i_PKCS8_fn(const unsigned char **, long,
76                           struct der2key_ctx_st *);
77typedef void *d2i_PUBKEY_fn(const unsigned char **, long,
78                            struct der2key_ctx_st *);
79struct keytype_desc_st {
80    const char *keytype_name;
81    const OSSL_DISPATCH *fns; /* Keymgmt (to pilfer functions from) */
82
83    /* The input structure name */
84    const char *structure_name;
85
86    /*
87     * The EVP_PKEY_xxx type macro.  Should be zero for type specific
88     * structures, non-zero when the outermost structure is PKCS#8 or
89     * SubjectPublicKeyInfo.  This determines which of the function
90     * pointers below will be used.
91     */
92    int evp_type;
93
94    /* The selection mask for OSSL_FUNC_decoder_does_selection() */
95    int selection_mask;
96
97    /* For type specific decoders, we use the corresponding d2i */
98    d2i_of_void *d2i_private_key; /* From type-specific DER */
99    d2i_of_void *d2i_public_key;  /* From type-specific DER */
100    d2i_of_void *d2i_key_params;  /* From type-specific DER */
101    d2i_PKCS8_fn *d2i_PKCS8;      /* Wrapped in a PrivateKeyInfo */
102    d2i_PUBKEY_fn *d2i_PUBKEY;    /* Wrapped in a SubjectPublicKeyInfo */
103
104    /*
105     * For any key, we may need to check that the key meets expectations.
106     * This is useful when the same functions can decode several variants
107     * of a key.
108     */
109    check_key_fn *check_key;
110
111    /*
112     * For any key, we may need to make provider specific adjustments, such
113     * as ensure the key carries the correct library context.
114     */
115    adjust_key_fn *adjust_key;
116    /* {type}_free() */
117    free_key_fn *free_key;
118};
119
120/*
121 * Context used for DER to key decoding.
122 */
123struct der2key_ctx_st {
124    PROV_CTX *provctx;
125    char propq[OSSL_MAX_PROPQUERY_SIZE];
126    const struct keytype_desc_st *desc;
127    /* The selection that is passed to der2key_decode() */
128    int selection;
129    /* Flag used to signal that a failure is fatal */
130    unsigned int flag_fatal : 1;
131};
132
133typedef void *key_from_pkcs8_t(const PKCS8_PRIV_KEY_INFO *p8inf,
134                               OSSL_LIB_CTX *libctx, const char *propq);
135static void *der2key_decode_p8(const unsigned char **input_der,
136                               long input_der_len, struct der2key_ctx_st *ctx,
137                               key_from_pkcs8_t *key_from_pkcs8)
138{
139    PKCS8_PRIV_KEY_INFO *p8inf = NULL;
140    const X509_ALGOR *alg = NULL;
141    void *key = NULL;
142
143    if ((p8inf = d2i_PKCS8_PRIV_KEY_INFO(NULL, input_der, input_der_len)) != NULL
144        && PKCS8_pkey_get0(NULL, NULL, NULL, &alg, p8inf)
145        && (OBJ_obj2nid(alg->algorithm) == ctx->desc->evp_type
146            /* Allow decoding sm2 private key with id_ecPublicKey */
147            || (OBJ_obj2nid(alg->algorithm) == NID_X9_62_id_ecPublicKey
148                && ctx->desc->evp_type == NID_sm2)))
149        key = key_from_pkcs8(p8inf, PROV_LIBCTX_OF(ctx->provctx), ctx->propq);
150    PKCS8_PRIV_KEY_INFO_free(p8inf);
151
152    return key;
153}
154
155/* ---------------------------------------------------------------------- */
156
157static OSSL_FUNC_decoder_freectx_fn der2key_freectx;
158static OSSL_FUNC_decoder_decode_fn der2key_decode;
159static OSSL_FUNC_decoder_export_object_fn der2key_export_object;
160static OSSL_FUNC_decoder_settable_ctx_params_fn der2key_settable_ctx_params;
161static OSSL_FUNC_decoder_set_ctx_params_fn der2key_set_ctx_params;
162
163static struct der2key_ctx_st *
164der2key_newctx(void *provctx, const struct keytype_desc_st *desc)
165{
166    struct der2key_ctx_st *ctx = OPENSSL_zalloc(sizeof(*ctx));
167
168    if (ctx != NULL) {
169        ctx->provctx = provctx;
170        ctx->desc = desc;
171    }
172    return ctx;
173}
174
175{- produce_param_decoder('der2key_set_ctx_params',
176                         (['DECODER_PARAM_PROPERTIES', 'propq', 'utf8_string'],
177                         )); -}
178
179static const OSSL_PARAM *der2key_settable_ctx_params(ossl_unused void *provctx)
180{
181    return der2key_set_ctx_params_list;
182}
183
184static int der2key_set_ctx_params(void *vctx, const OSSL_PARAM params[])
185{
186    struct der2key_ctx_st *ctx = vctx;
187    struct der2key_set_ctx_params_st p;
188    char *str;
189
190    if (ctx == NULL || !der2key_set_ctx_params_decoder(params, &p))
191        return 0;
192
193    str = ctx->propq;
194    if (p.propq != NULL
195            && !OSSL_PARAM_get_utf8_string(p.propq, &str, sizeof(ctx->propq)))
196        return 0;
197
198    return 1;
199}
200
201static void der2key_freectx(void *vctx)
202{
203    struct der2key_ctx_st *ctx = vctx;
204
205    OPENSSL_free(ctx);
206}
207
208static int der2key_check_selection(int selection,
209                                   const struct keytype_desc_st *desc)
210{
211    /*
212     * The selections are kinda sorta "levels", i.e. each selection given
213     * here is assumed to include those following.
214     */
215    int checks[] = {
216        OSSL_KEYMGMT_SELECT_PRIVATE_KEY,
217        OSSL_KEYMGMT_SELECT_PUBLIC_KEY,
218        OSSL_KEYMGMT_SELECT_ALL_PARAMETERS
219    };
220    size_t i;
221
222    /* The decoder implementations made here support guessing */
223    if (selection == 0)
224        return 1;
225
226    for (i = 0; i < OSSL_NELEM(checks); i++) {
227        int check1 = (selection & checks[i]) != 0;
228        int check2 = (desc->selection_mask & checks[i]) != 0;
229
230        /*
231         * If the caller asked for the currently checked bit(s), return
232         * whether the decoder description says it's supported.
233         */
234        if (check1)
235            return check2;
236    }
237
238    /* This should be dead code, but just to be safe... */
239    return 0;
240}
241
242static int der2key_decode(void *vctx, OSSL_CORE_BIO *cin, int selection,
243                          OSSL_CALLBACK *data_cb, void *data_cbarg,
244                          OSSL_PASSPHRASE_CALLBACK *pw_cb, void *pw_cbarg)
245{
246    struct der2key_ctx_st *ctx = vctx;
247    unsigned char *der = NULL;
248    const unsigned char *derp;
249    long der_len = 0;
250    void *key = NULL;
251    int ok = 0;
252
253    ctx->selection = selection;
254    /*
255     * The caller is allowed to specify 0 as a selection mask, to have the
256     * structure and key type guessed.  For type-specific structures, this
257     * is not recommended, as some structures are very similar.
258     * Note that 0 isn't the same as OSSL_KEYMGMT_SELECT_ALL, as the latter
259     * signifies a private key structure, where everything else is assumed
260     * to be present as well.
261     */
262    if (selection == 0)
263        selection = ctx->desc->selection_mask;
264    if ((selection & ctx->desc->selection_mask) == 0) {
265        ERR_raise(ERR_LIB_PROV, ERR_R_PASSED_INVALID_ARGUMENT);
266        return 0;
267    }
268
269    ok = ossl_read_der(ctx->provctx, cin, &der, &der_len);
270    if (!ok)
271        goto next;
272
273    ok = 0; /* Assume that we fail */
274
275    ERR_set_mark();
276    if ((selection & OSSL_KEYMGMT_SELECT_PRIVATE_KEY) != 0) {
277        derp = der;
278        if (ctx->desc->d2i_PKCS8 != NULL) {
279            key = ctx->desc->d2i_PKCS8(&derp, der_len, ctx);
280            if (ctx->flag_fatal) {
281                ERR_clear_last_mark();
282                goto end;
283            }
284        } else if (ctx->desc->d2i_private_key != NULL) {
285            key = ctx->desc->d2i_private_key(NULL, &derp, der_len);
286        }
287        if (key == NULL && ctx->selection != 0) {
288            ERR_clear_last_mark();
289            goto next;
290        }
291    }
292    if (key == NULL && (selection & OSSL_KEYMGMT_SELECT_PUBLIC_KEY) != 0) {
293        derp = der;
294        if (ctx->desc->d2i_PUBKEY != NULL)
295            key = ctx->desc->d2i_PUBKEY(&derp, der_len, ctx);
296        else if (ctx->desc->d2i_public_key != NULL)
297            key = ctx->desc->d2i_public_key(NULL, &derp, der_len);
298        if (key == NULL && ctx->selection != 0) {
299            ERR_clear_last_mark();
300            goto next;
301        }
302    }
303    if (key == NULL && (selection & OSSL_KEYMGMT_SELECT_ALL_PARAMETERS) != 0) {
304        derp = der;
305        if (ctx->desc->d2i_key_params != NULL)
306            key = ctx->desc->d2i_key_params(NULL, &derp, der_len);
307        if (key == NULL && ctx->selection != 0) {
308            ERR_clear_last_mark();
309            goto next;
310        }
311    }
312    if (key == NULL)
313        ERR_clear_last_mark();
314    else
315        ERR_pop_to_mark();
316
317    /*
318     * Last minute check to see if this was the correct type of key.  This
319     * should never lead to a fatal error, i.e. the decoding itself was
320     * correct, it was just an unexpected key type.  This is generally for
321     * classes of key types that have subtle variants, like RSA-PSS keys as
322     * opposed to plain RSA keys.
323     */
324    if (key != NULL
325        && ctx->desc->check_key != NULL
326        && !ctx->desc->check_key(key, ctx)) {
327        ctx->desc->free_key(key);
328        key = NULL;
329    }
330
331    if (key != NULL && ctx->desc->adjust_key != NULL)
332        ctx->desc->adjust_key(key, ctx);
333
334 next:
335    /*
336     * Indicated that we successfully decoded something, or not at all.
337     * Ending up "empty handed" is not an error.
338     */
339    ok = 1;
340
341    /*
342     * We free memory here so it's not held up during the callback, because
343     * we know the process is recursive and the allocated chunks of memory
344     * add up.
345     */
346    OPENSSL_free(der);
347    der = NULL;
348
349    if (key != NULL) {
350        OSSL_PARAM params[4];
351        int object_type = OSSL_OBJECT_PKEY;
352
353        params[0] =
354            OSSL_PARAM_construct_int(OSSL_OBJECT_PARAM_TYPE, &object_type);
355
356#ifndef OPENSSL_NO_SM2
357        if (strcmp(ctx->desc->keytype_name, "EC") == 0
358            && (EC_KEY_get_flags(key) & EC_FLAG_SM2_RANGE) != 0)
359            params[1] =
360                OSSL_PARAM_construct_utf8_string(OSSL_OBJECT_PARAM_DATA_TYPE,
361                                                 "SM2", 0);
362        else
363#endif
364            params[1] =
365                OSSL_PARAM_construct_utf8_string(OSSL_OBJECT_PARAM_DATA_TYPE,
366                                                 (char *)ctx->desc->keytype_name,
367                                                 0);
368        /* The address of the key becomes the octet string */
369        params[2] =
370            OSSL_PARAM_construct_octet_string(OSSL_OBJECT_PARAM_REFERENCE,
371                                              &key, sizeof(key));
372        params[3] = OSSL_PARAM_construct_end();
373
374        ok = data_cb(params, data_cbarg);
375    }
376
377 end:
378    ctx->desc->free_key(key);
379    OPENSSL_free(der);
380
381    return ok;
382}
383
384static int der2key_export_object(void *vctx,
385                                 const void *reference, size_t reference_sz,
386                                 OSSL_CALLBACK *export_cb, void *export_cbarg)
387{
388    struct der2key_ctx_st *ctx = vctx;
389    OSSL_FUNC_keymgmt_export_fn *export =
390        ossl_prov_get_keymgmt_export(ctx->desc->fns);
391    void *keydata;
392
393    if (reference_sz == sizeof(keydata) && export != NULL) {
394        int selection = ctx->selection;
395
396        if (selection == 0)
397            selection = OSSL_KEYMGMT_SELECT_ALL;
398        /* The contents of the reference is the address to our object */
399        keydata = *(void **)reference;
400
401        return export(keydata, selection, export_cb, export_cbarg);
402    }
403    return 0;
404}
405
406#define D2I_PUBKEY_NOCTX(n, f)                              \
407    static void *                                           \
408    n##_d2i_PUBKEY(const unsigned char **der, long der_len, \
409                   ossl_unused struct der2key_ctx_st *ctx)  \
410    {                                                       \
411        return f(NULL, der, der_len);                       \
412    }
413
414/* ---------------------------------------------------------------------- */
415
416#ifndef OPENSSL_NO_DH
417# define dh_evp_type                    EVP_PKEY_DH
418# define dh_d2i_private_key             NULL
419# define dh_d2i_public_key              NULL
420# define dh_d2i_key_params              (d2i_of_void *)d2i_DHparams
421# define dh_free                        (free_key_fn *)DH_free
422# define dh_check                       NULL
423
424static void *dh_d2i_PKCS8(const unsigned char **der, long der_len,
425                          struct der2key_ctx_st *ctx)
426{
427    return der2key_decode_p8(der, der_len, ctx,
428                             (key_from_pkcs8_t *)ossl_dh_key_from_pkcs8);
429}
430
431D2I_PUBKEY_NOCTX(dh, ossl_d2i_DH_PUBKEY)
432D2I_PUBKEY_NOCTX(dhx, ossl_d2i_DHx_PUBKEY)
433
434static void dh_adjust(void *key, struct der2key_ctx_st *ctx)
435{
436    ossl_dh_set0_libctx(key, PROV_LIBCTX_OF(ctx->provctx));
437}
438
439# define dhx_evp_type                   EVP_PKEY_DHX
440# define dhx_d2i_private_key            NULL
441# define dhx_d2i_public_key             NULL
442# define dhx_d2i_key_params             (d2i_of_void *)d2i_DHxparams
443# define dhx_d2i_PKCS8                  dh_d2i_PKCS8
444# define dhx_free                       (free_key_fn *)DH_free
445# define dhx_check                      NULL
446# define dhx_adjust                     dh_adjust
447#endif
448
449/* ---------------------------------------------------------------------- */
450
451#ifndef OPENSSL_NO_DSA
452# define dsa_evp_type                   EVP_PKEY_DSA
453# define dsa_d2i_private_key            (d2i_of_void *)d2i_DSAPrivateKey
454# define dsa_d2i_public_key             (d2i_of_void *)d2i_DSAPublicKey
455# define dsa_d2i_key_params             (d2i_of_void *)d2i_DSAparams
456# define dsa_free                       (free_key_fn *)DSA_free
457# define dsa_check                      NULL
458
459static void *dsa_d2i_PKCS8(const unsigned char **der, long der_len,
460                           struct der2key_ctx_st *ctx)
461{
462    return der2key_decode_p8(der, der_len, ctx,
463                             (key_from_pkcs8_t *)ossl_dsa_key_from_pkcs8);
464}
465
466D2I_PUBKEY_NOCTX(dsa, ossl_d2i_DSA_PUBKEY)
467
468static void dsa_adjust(void *key, struct der2key_ctx_st *ctx)
469{
470    ossl_dsa_set0_libctx(key, PROV_LIBCTX_OF(ctx->provctx));
471}
472#endif
473
474/* ---------------------------------------------------------------------- */
475
476#ifndef OPENSSL_NO_EC
477# define ec_evp_type                    EVP_PKEY_EC
478# define ec_d2i_private_key             (d2i_of_void *)d2i_ECPrivateKey
479# define ec_d2i_public_key              NULL
480# define ec_d2i_key_params              (d2i_of_void *)d2i_ECParameters
481# define ec_free                        (free_key_fn *)EC_KEY_free
482
483static void *ec_d2i_PKCS8(const unsigned char **der, long der_len,
484                          struct der2key_ctx_st *ctx)
485{
486    return der2key_decode_p8(der, der_len, ctx,
487                             (key_from_pkcs8_t *)ossl_ec_key_from_pkcs8);
488}
489
490D2I_PUBKEY_NOCTX(ec, d2i_EC_PUBKEY)
491
492static int ec_check(void *key, struct der2key_ctx_st *ctx)
493{
494    /* We're trying to be clever by comparing two truths */
495    int ret = 0;
496    int sm2 = (EC_KEY_get_flags(key) & EC_FLAG_SM2_RANGE) != 0;
497
498    if (sm2)
499        ret = ctx->desc->evp_type == EVP_PKEY_SM2
500            || ctx->desc->evp_type == NID_X9_62_id_ecPublicKey;
501    else
502        ret = ctx->desc->evp_type != EVP_PKEY_SM2;
503
504    return ret;
505}
506
507static void ec_adjust(void *key, struct der2key_ctx_st *ctx)
508{
509    ossl_ec_key_set0_libctx(key, PROV_LIBCTX_OF(ctx->provctx));
510}
511
512# ifndef OPENSSL_NO_ECX
513/*
514 * ED25519, ED448, X25519, X448 only implement PKCS#8 and SubjectPublicKeyInfo,
515 * so no d2i functions to be had.
516 */
517
518static void *ecx_d2i_PKCS8(const unsigned char **der, long der_len,
519                           struct der2key_ctx_st *ctx)
520{
521    return der2key_decode_p8(der, der_len, ctx,
522                             (key_from_pkcs8_t *)ossl_ecx_key_from_pkcs8);
523}
524
525D2I_PUBKEY_NOCTX(ed25519, ossl_d2i_ED25519_PUBKEY)
526D2I_PUBKEY_NOCTX(ed448, ossl_d2i_ED448_PUBKEY)
527D2I_PUBKEY_NOCTX(x25519, ossl_d2i_X25519_PUBKEY)
528D2I_PUBKEY_NOCTX(x448, ossl_d2i_X448_PUBKEY)
529
530static void ecx_key_adjust(void *key, struct der2key_ctx_st *ctx)
531{
532    ossl_ecx_key_set0_libctx(key, PROV_LIBCTX_OF(ctx->provctx));
533}
534
535#  define ed25519_evp_type               EVP_PKEY_ED25519
536#  define ed25519_d2i_private_key        NULL
537#  define ed25519_d2i_public_key         NULL
538#  define ed25519_d2i_key_params         NULL
539#  define ed25519_d2i_PKCS8              ecx_d2i_PKCS8
540#  define ed25519_free                   (free_key_fn *)ossl_ecx_key_free
541#  define ed25519_check                  NULL
542#  define ed25519_adjust                 ecx_key_adjust
543
544#  define ed448_evp_type                 EVP_PKEY_ED448
545#  define ed448_d2i_private_key          NULL
546#  define ed448_d2i_public_key           NULL
547#  define ed448_d2i_key_params           NULL
548#  define ed448_d2i_PKCS8                ecx_d2i_PKCS8
549#  define ed448_free                     (free_key_fn *)ossl_ecx_key_free
550#  define ed448_check                    NULL
551#  define ed448_adjust                   ecx_key_adjust
552
553#  define x25519_evp_type                EVP_PKEY_X25519
554#  define x25519_d2i_private_key         NULL
555#  define x25519_d2i_public_key          NULL
556#  define x25519_d2i_key_params          NULL
557#  define x25519_d2i_PKCS8               ecx_d2i_PKCS8
558#  define x25519_free                    (free_key_fn *)ossl_ecx_key_free
559#  define x25519_check                   NULL
560#  define x25519_adjust                  ecx_key_adjust
561
562#  define x448_evp_type                  EVP_PKEY_X448
563#  define x448_d2i_private_key           NULL
564#  define x448_d2i_public_key            NULL
565#  define x448_d2i_key_params            NULL
566#  define x448_d2i_PKCS8                 ecx_d2i_PKCS8
567#  define x448_free                      (free_key_fn *)ossl_ecx_key_free
568#  define x448_check                     NULL
569#  define x448_adjust                    ecx_key_adjust
570# endif /* OPENSSL_NO_ECX */
571
572# ifndef OPENSSL_NO_SM2
573#  define sm2_evp_type                  EVP_PKEY_SM2
574#  define sm2_d2i_private_key           (d2i_of_void *)d2i_ECPrivateKey
575#  define sm2_d2i_public_key            NULL
576#  define sm2_d2i_key_params            (d2i_of_void *)d2i_ECParameters
577#  define sm2_d2i_PUBKEY                ec_d2i_PUBKEY
578#  define sm2_free                      (free_key_fn *)EC_KEY_free
579#  define sm2_check                     ec_check
580#  define sm2_adjust                    ec_adjust
581
582static void *sm2_d2i_PKCS8(const unsigned char **der, long der_len,
583                           struct der2key_ctx_st *ctx)
584{
585    return der2key_decode_p8(der, der_len, ctx,
586                             (key_from_pkcs8_t *)ossl_ec_key_from_pkcs8);
587}
588# endif
589
590#endif
591
592/* ---------------------------------------------------------------------- */
593
594#ifndef OPENSSL_NO_ML_KEM
595static void *
596ml_kem_d2i_PKCS8(const uint8_t **der, long der_len, struct der2key_ctx_st *ctx)
597{
598    ML_KEM_KEY *key;
599
600    key = ossl_ml_kem_d2i_PKCS8(*der, der_len, ctx->desc->evp_type,
601                                ctx->provctx, ctx->propq);
602    if (key != NULL)
603        *der += der_len;
604    return key;
605}
606
607static ossl_inline void *
608ml_kem_d2i_PUBKEY(const uint8_t **der, long der_len,
609                  struct der2key_ctx_st *ctx)
610{
611    ML_KEM_KEY *key;
612
613    key = ossl_ml_kem_d2i_PUBKEY(*der, der_len, ctx->desc->evp_type,
614                                 ctx->provctx, ctx->propq);
615    if (key != NULL)
616        *der += der_len;
617    return key;
618}
619
620# define ml_kem_512_evp_type                EVP_PKEY_ML_KEM_512
621# define ml_kem_512_d2i_private_key         NULL
622# define ml_kem_512_d2i_public_key          NULL
623# define ml_kem_512_d2i_key_params          NULL
624# define ml_kem_512_d2i_PUBKEY              ml_kem_d2i_PUBKEY
625# define ml_kem_512_d2i_PKCS8               ml_kem_d2i_PKCS8
626# define ml_kem_512_free                    (free_key_fn *)ossl_ml_kem_key_free
627# define ml_kem_512_check                   NULL
628# define ml_kem_512_adjust                  NULL
629
630# define ml_kem_768_evp_type                EVP_PKEY_ML_KEM_768
631# define ml_kem_768_d2i_private_key         NULL
632# define ml_kem_768_d2i_public_key          NULL
633# define ml_kem_768_d2i_key_params          NULL
634# define ml_kem_768_d2i_PUBKEY              ml_kem_d2i_PUBKEY
635# define ml_kem_768_d2i_PKCS8               ml_kem_d2i_PKCS8
636# define ml_kem_768_free                    (free_key_fn *)ossl_ml_kem_key_free
637# define ml_kem_768_check                   NULL
638# define ml_kem_768_adjust                  NULL
639
640# define ml_kem_1024_evp_type               EVP_PKEY_ML_KEM_1024
641# define ml_kem_1024_d2i_private_key        NULL
642# define ml_kem_1024_d2i_public_key         NULL
643# define ml_kem_1024_d2i_PUBKEY             ml_kem_d2i_PUBKEY
644# define ml_kem_1024_d2i_PKCS8              ml_kem_d2i_PKCS8
645# define ml_kem_1024_d2i_key_params         NULL
646# define ml_kem_1024_free                   (free_key_fn *)ossl_ml_kem_key_free
647# define ml_kem_1024_check                  NULL
648# define ml_kem_1024_adjust                 NULL
649
650#endif
651
652#ifndef OPENSSL_NO_SLH_DSA
653static void *
654slh_dsa_d2i_PKCS8(const uint8_t **der, long der_len, struct der2key_ctx_st *ctx)
655{
656    SLH_DSA_KEY *key = NULL, *ret = NULL;
657    OSSL_LIB_CTX *libctx = PROV_LIBCTX_OF(ctx->provctx);
658    PKCS8_PRIV_KEY_INFO *p8inf = NULL;
659    const unsigned char *p;
660    const X509_ALGOR *alg = NULL;
661    int plen, ptype;
662
663    if ((p8inf = d2i_PKCS8_PRIV_KEY_INFO(NULL, der, der_len)) == NULL
664        || !PKCS8_pkey_get0(NULL, &p, &plen, &alg, p8inf))
665        goto end;
666
667    /* Algorithm parameters must be absent. */
668    if ((X509_ALGOR_get0(NULL, &ptype, NULL, alg), ptype != V_ASN1_UNDEF)) {
669        ERR_raise_data(ERR_LIB_PROV, PROV_R_UNEXPECTED_KEY_PARAMETERS,
670                       "unexpected parameters with a PKCS#8 %s private key",
671                       ctx->desc->keytype_name);
672        goto end;
673    }
674    if (OBJ_obj2nid(alg->algorithm) != ctx->desc->evp_type)
675        goto end;
676    if ((key = ossl_slh_dsa_key_new(libctx, ctx->propq,
677                                    ctx->desc->keytype_name)) == NULL)
678        goto end;
679
680    if (!ossl_slh_dsa_set_priv(key, p, plen))
681        goto end;
682    ret = key;
683 end:
684    PKCS8_PRIV_KEY_INFO_free(p8inf);
685    if (ret == NULL)
686        ossl_slh_dsa_key_free(key);
687    return ret;
688}
689
690static ossl_inline void *slh_dsa_d2i_PUBKEY(const uint8_t **der, long der_len,
691                                            struct der2key_ctx_st *ctx)
692{
693    int ok = 0;
694    OSSL_LIB_CTX *libctx = PROV_LIBCTX_OF(ctx->provctx);
695    SLH_DSA_KEY *ret = NULL;
696    BARE_PUBKEY *spki = NULL;
697    const uint8_t *end = *der;
698    size_t len;
699
700    ret = ossl_slh_dsa_key_new(libctx, ctx->propq, ctx->desc->keytype_name);
701    if (ret == NULL)
702        return NULL;
703    len = ossl_slh_dsa_key_get_pub_len(ret);
704
705    /*-
706     * The DER ASN.1 encoding of SLH-DSA public keys prepends 18 bytes to the
707     * encoded public key (since the largest public key size is 64 bytes):
708     *
709     * - 2 byte outer sequence tag and length
710     * -  2 byte algorithm sequence tag and length
711     * -    2 byte algorithm OID tag and length
712     * -      9 byte algorithm OID
713     * -  2 byte bit string tag and length
714     * -    1 bitstring lead byte
715     *
716     * Check that we have the right OID, the bit string has no "bits left" and
717     * that we consume all the input exactly.
718     */
719    if (der_len != 18 + (long)len) {
720        ERR_raise_data(ERR_LIB_PROV, PROV_R_BAD_ENCODING,
721                       "unexpected %s public key length: %ld != %ld",
722                       ctx->desc->keytype_name, der_len,
723                       18 + (long)len);
724        goto err;
725    }
726
727    if ((spki = OPENSSL_zalloc(sizeof(*spki))) == NULL)
728        goto err;
729
730    /* The spki storage is freed on error */
731    if (ASN1_item_d2i_ex((ASN1_VALUE **)&spki, &end, der_len,
732                         ASN1_ITEM_rptr(BARE_PUBKEY), NULL, NULL) == NULL) {
733        ERR_raise_data(ERR_LIB_PROV, PROV_R_BAD_ENCODING,
734                       "malformed %s public key ASN.1 encoding",
735                       ossl_slh_dsa_key_get_name(ret));
736        goto err;
737    }
738
739    /* The spki structure now owns some memory */
740    if ((spki->pubkey->flags & 0x7) != 0 || end != *der + der_len) {
741        ERR_raise_data(ERR_LIB_PROV, PROV_R_BAD_ENCODING,
742                       "malformed %s public key ASN.1 encoding",
743                       ossl_slh_dsa_key_get_name(ret));
744        goto err;
745    }
746    if (OBJ_cmp(OBJ_nid2obj(ctx->desc->evp_type), spki->algor.oid) != 0) {
747        ERR_raise_data(ERR_LIB_PROV, PROV_R_BAD_ENCODING,
748                       "unexpected algorithm OID for an %s public key",
749                       ossl_slh_dsa_key_get_name(ret));
750        goto err;
751    }
752
753    if (!ossl_slh_dsa_set_pub(ret, spki->pubkey->data, spki->pubkey->length)) {
754        ERR_raise_data(ERR_LIB_PROV, PROV_R_BAD_ENCODING,
755                       "failed to parse %s public key from the input data",
756                       ossl_slh_dsa_key_get_name(ret));
757        goto err;
758    }
759    ok = 1;
760 err:
761    if (spki != NULL) {
762        ASN1_OBJECT_free(spki->algor.oid);
763        ASN1_BIT_STRING_free(spki->pubkey);
764        OPENSSL_free(spki);
765    }
766    if (!ok) {
767        ossl_slh_dsa_key_free(ret);
768        ret = NULL;
769    }
770    return ret;
771}
772
773# define slh_dsa_sha2_128s_evp_type        EVP_PKEY_SLH_DSA_SHA2_128S
774# define slh_dsa_sha2_128s_d2i_private_key NULL
775# define slh_dsa_sha2_128s_d2i_public_key  NULL
776# define slh_dsa_sha2_128s_d2i_key_params  NULL
777# define slh_dsa_sha2_128s_d2i_PKCS8       slh_dsa_d2i_PKCS8
778# define slh_dsa_sha2_128s_d2i_PUBKEY      slh_dsa_d2i_PUBKEY
779# define slh_dsa_sha2_128s_free            (free_key_fn *)ossl_slh_dsa_key_free
780# define slh_dsa_sha2_128s_check           NULL
781# define slh_dsa_sha2_128s_adjust          NULL
782
783# define slh_dsa_sha2_128f_evp_type        EVP_PKEY_SLH_DSA_SHA2_128F
784# define slh_dsa_sha2_128f_d2i_private_key NULL
785# define slh_dsa_sha2_128f_d2i_public_key  NULL
786# define slh_dsa_sha2_128f_d2i_key_params  NULL
787# define slh_dsa_sha2_128f_d2i_PKCS8       slh_dsa_d2i_PKCS8
788# define slh_dsa_sha2_128f_d2i_PUBKEY      slh_dsa_d2i_PUBKEY
789# define slh_dsa_sha2_128f_free            (free_key_fn *)ossl_slh_dsa_key_free
790# define slh_dsa_sha2_128f_check           NULL
791# define slh_dsa_sha2_128f_adjust          NULL
792
793# define slh_dsa_sha2_192s_evp_type        EVP_PKEY_SLH_DSA_SHA2_192S
794# define slh_dsa_sha2_192s_d2i_private_key NULL
795# define slh_dsa_sha2_192s_d2i_public_key  NULL
796# define slh_dsa_sha2_192s_d2i_key_params  NULL
797# define slh_dsa_sha2_192s_d2i_PKCS8       slh_dsa_d2i_PKCS8
798# define slh_dsa_sha2_192s_d2i_PUBKEY      slh_dsa_d2i_PUBKEY
799# define slh_dsa_sha2_192s_free            (free_key_fn *)ossl_slh_dsa_key_free
800# define slh_dsa_sha2_192s_check           NULL
801# define slh_dsa_sha2_192s_adjust          NULL
802
803# define slh_dsa_sha2_192f_evp_type        EVP_PKEY_SLH_DSA_SHA2_192F
804# define slh_dsa_sha2_192f_d2i_private_key NULL
805# define slh_dsa_sha2_192f_d2i_public_key  NULL
806# define slh_dsa_sha2_192f_d2i_key_params  NULL
807# define slh_dsa_sha2_192f_d2i_PKCS8       slh_dsa_d2i_PKCS8
808# define slh_dsa_sha2_192f_d2i_PUBKEY      slh_dsa_d2i_PUBKEY
809# define slh_dsa_sha2_192f_free            (free_key_fn *)ossl_slh_dsa_key_free
810# define slh_dsa_sha2_192f_check           NULL
811# define slh_dsa_sha2_192f_adjust          NULL
812
813# define slh_dsa_sha2_256s_evp_type        EVP_PKEY_SLH_DSA_SHA2_256S
814# define slh_dsa_sha2_256s_d2i_private_key NULL
815# define slh_dsa_sha2_256s_d2i_public_key  NULL
816# define slh_dsa_sha2_256s_d2i_key_params  NULL
817# define slh_dsa_sha2_256s_d2i_PKCS8       slh_dsa_d2i_PKCS8
818# define slh_dsa_sha2_256s_d2i_PUBKEY      slh_dsa_d2i_PUBKEY
819# define slh_dsa_sha2_256s_free            (free_key_fn *)ossl_slh_dsa_key_free
820# define slh_dsa_sha2_256s_check           NULL
821# define slh_dsa_sha2_256s_adjust          NULL
822
823# define slh_dsa_sha2_256f_evp_type        EVP_PKEY_SLH_DSA_SHA2_256F
824# define slh_dsa_sha2_256f_d2i_private_key NULL
825# define slh_dsa_sha2_256f_d2i_public_key  NULL
826# define slh_dsa_sha2_256f_d2i_key_params  NULL
827# define slh_dsa_sha2_256f_d2i_PKCS8       slh_dsa_d2i_PKCS8
828# define slh_dsa_sha2_256f_d2i_PUBKEY      slh_dsa_d2i_PUBKEY
829# define slh_dsa_sha2_256f_free            (free_key_fn *)ossl_slh_dsa_key_free
830# define slh_dsa_sha2_256f_check           NULL
831# define slh_dsa_sha2_256f_adjust          NULL
832
833# define slh_dsa_shake_128s_evp_type        EVP_PKEY_SLH_DSA_SHAKE_128S
834# define slh_dsa_shake_128s_d2i_private_key NULL
835# define slh_dsa_shake_128s_d2i_public_key  NULL
836# define slh_dsa_shake_128s_d2i_key_params  NULL
837# define slh_dsa_shake_128s_d2i_PKCS8       slh_dsa_d2i_PKCS8
838# define slh_dsa_shake_128s_d2i_PUBKEY      slh_dsa_d2i_PUBKEY
839# define slh_dsa_shake_128s_free            (free_key_fn *)ossl_slh_dsa_key_free
840# define slh_dsa_shake_128s_check           NULL
841# define slh_dsa_shake_128s_adjust          NULL
842
843# define slh_dsa_shake_128f_evp_type        EVP_PKEY_SLH_DSA_SHAKE_128F
844# define slh_dsa_shake_128f_d2i_private_key NULL
845# define slh_dsa_shake_128f_d2i_public_key  NULL
846# define slh_dsa_shake_128f_d2i_key_params  NULL
847# define slh_dsa_shake_128f_d2i_PKCS8       slh_dsa_d2i_PKCS8
848# define slh_dsa_shake_128f_d2i_PUBKEY      slh_dsa_d2i_PUBKEY
849# define slh_dsa_shake_128f_free            (free_key_fn *)ossl_slh_dsa_key_free
850# define slh_dsa_shake_128f_check           NULL
851# define slh_dsa_shake_128f_adjust          NULL
852
853# define slh_dsa_shake_192s_evp_type        EVP_PKEY_SLH_DSA_SHAKE_192S
854# define slh_dsa_shake_192s_d2i_private_key NULL
855# define slh_dsa_shake_192s_d2i_public_key  NULL
856# define slh_dsa_shake_192s_d2i_key_params  NULL
857# define slh_dsa_shake_192s_d2i_PKCS8       slh_dsa_d2i_PKCS8
858# define slh_dsa_shake_192s_d2i_PUBKEY      slh_dsa_d2i_PUBKEY
859# define slh_dsa_shake_192s_free            (free_key_fn *)ossl_slh_dsa_key_free
860# define slh_dsa_shake_192s_check           NULL
861# define slh_dsa_shake_192s_adjust          NULL
862
863# define slh_dsa_shake_192f_evp_type        EVP_PKEY_SLH_DSA_SHAKE_192F
864# define slh_dsa_shake_192f_d2i_private_key NULL
865# define slh_dsa_shake_192f_d2i_public_key  NULL
866# define slh_dsa_shake_192f_d2i_key_params  NULL
867# define slh_dsa_shake_192f_d2i_PKCS8       slh_dsa_d2i_PKCS8
868# define slh_dsa_shake_192f_d2i_PUBKEY      slh_dsa_d2i_PUBKEY
869# define slh_dsa_shake_192f_free            (free_key_fn *)ossl_slh_dsa_key_free
870# define slh_dsa_shake_192f_check           NULL
871# define slh_dsa_shake_192f_adjust          NULL
872
873# define slh_dsa_shake_256s_evp_type        EVP_PKEY_SLH_DSA_SHAKE_256S
874# define slh_dsa_shake_256s_d2i_private_key NULL
875# define slh_dsa_shake_256s_d2i_public_key  NULL
876# define slh_dsa_shake_256s_d2i_key_params  NULL
877# define slh_dsa_shake_256s_d2i_PKCS8       slh_dsa_d2i_PKCS8
878# define slh_dsa_shake_256s_d2i_PUBKEY      slh_dsa_d2i_PUBKEY
879# define slh_dsa_shake_256s_free            (free_key_fn *)ossl_slh_dsa_key_free
880# define slh_dsa_shake_256s_check           NULL
881# define slh_dsa_shake_256s_adjust          NULL
882
883# define slh_dsa_shake_256f_evp_type        EVP_PKEY_SLH_DSA_SHAKE_256F
884# define slh_dsa_shake_256f_d2i_private_key NULL
885# define slh_dsa_shake_256f_d2i_public_key  NULL
886# define slh_dsa_shake_256f_d2i_key_params  NULL
887# define slh_dsa_shake_256f_d2i_PKCS8       slh_dsa_d2i_PKCS8
888# define slh_dsa_shake_256f_d2i_PUBKEY      slh_dsa_d2i_PUBKEY
889# define slh_dsa_shake_256f_free            (free_key_fn *)ossl_slh_dsa_key_free
890# define slh_dsa_shake_256f_check           NULL
891# define slh_dsa_shake_256f_adjust          NULL
892#endif /* OPENSSL_NO_SLH_DSA */
893
894/* ---------------------------------------------------------------------- */
895
896#define rsa_evp_type                    EVP_PKEY_RSA
897#define rsa_d2i_private_key             (d2i_of_void *)d2i_RSAPrivateKey
898#define rsa_d2i_public_key              (d2i_of_void *)d2i_RSAPublicKey
899#define rsa_d2i_key_params              NULL
900#define rsa_free                        (free_key_fn *)RSA_free
901
902static void *rsa_d2i_PKCS8(const unsigned char **der, long der_len,
903                           struct der2key_ctx_st *ctx)
904{
905    return der2key_decode_p8(der, der_len, ctx,
906                             (key_from_pkcs8_t *)ossl_rsa_key_from_pkcs8);
907}
908
909static void *
910rsa_d2i_PUBKEY(const unsigned char **der, long der_len,
911               ossl_unused struct der2key_ctx_st *ctx)
912{
913    return d2i_RSA_PUBKEY(NULL, der, der_len);
914}
915
916static int rsa_check(void *key, struct der2key_ctx_st *ctx)
917{
918    int valid;
919
920    switch (RSA_test_flags(key, RSA_FLAG_TYPE_MASK)) {
921    case RSA_FLAG_TYPE_RSA:
922        valid = (ctx->desc->evp_type == EVP_PKEY_RSA);
923        break;
924    case RSA_FLAG_TYPE_RSASSAPSS:
925        valid = (ctx->desc->evp_type == EVP_PKEY_RSA_PSS);
926        break;
927    default:
928        /* Currently unsupported RSA key type */
929        valid = 0;
930    }
931
932    valid = (valid && ossl_rsa_check_factors(key));
933
934    return valid;
935}
936
937static void rsa_adjust(void *key, struct der2key_ctx_st *ctx)
938{
939    ossl_rsa_set0_libctx(key, PROV_LIBCTX_OF(ctx->provctx));
940}
941
942#define rsapss_evp_type                 EVP_PKEY_RSA_PSS
943#define rsapss_d2i_private_key          (d2i_of_void *)d2i_RSAPrivateKey
944#define rsapss_d2i_public_key           (d2i_of_void *)d2i_RSAPublicKey
945#define rsapss_d2i_key_params           NULL
946#define rsapss_d2i_PKCS8                rsa_d2i_PKCS8
947#define rsapss_d2i_PUBKEY               rsa_d2i_PUBKEY
948#define rsapss_free                     (free_key_fn *)RSA_free
949#define rsapss_check                    rsa_check
950#define rsapss_adjust                   rsa_adjust
951
952/* ---------------------------------------------------------------------- */
953
954#ifndef OPENSSL_NO_ML_DSA
955static void *
956ml_dsa_d2i_PKCS8(const uint8_t **der, long der_len, struct der2key_ctx_st *ctx)
957{
958    ML_DSA_KEY *key;
959
960    key = ossl_ml_dsa_d2i_PKCS8(*der, der_len, ctx->desc->evp_type,
961                                ctx->provctx, ctx->propq);
962    if (key != NULL)
963        *der += der_len;
964    return key;
965}
966
967static ossl_inline void * ml_dsa_d2i_PUBKEY(const uint8_t **der, long der_len,
968                                            struct der2key_ctx_st *ctx)
969{
970    ML_DSA_KEY *key;
971
972    key = ossl_ml_dsa_d2i_PUBKEY(*der, der_len, ctx->desc->evp_type,
973                                 ctx->provctx, ctx->propq);
974    if (key != NULL)
975        *der += der_len;
976    return key;
977}
978
979# define ml_dsa_44_evp_type                EVP_PKEY_ML_DSA_44
980# define ml_dsa_44_d2i_private_key         NULL
981# define ml_dsa_44_d2i_public_key          NULL
982# define ml_dsa_44_d2i_key_params          NULL
983# define ml_dsa_44_d2i_PUBKEY              ml_dsa_d2i_PUBKEY
984# define ml_dsa_44_d2i_PKCS8               ml_dsa_d2i_PKCS8
985# define ml_dsa_44_free                    (free_key_fn *)ossl_ml_dsa_key_free
986# define ml_dsa_44_check                   NULL
987# define ml_dsa_44_adjust                  NULL
988
989# define ml_dsa_65_evp_type                EVP_PKEY_ML_DSA_65
990# define ml_dsa_65_d2i_private_key         NULL
991# define ml_dsa_65_d2i_public_key          NULL
992# define ml_dsa_65_d2i_key_params          NULL
993# define ml_dsa_65_d2i_PUBKEY              ml_dsa_d2i_PUBKEY
994# define ml_dsa_65_d2i_PKCS8               ml_dsa_d2i_PKCS8
995# define ml_dsa_65_free                    (free_key_fn *)ossl_ml_dsa_key_free
996# define ml_dsa_65_check                   NULL
997# define ml_dsa_65_adjust                  NULL
998
999# define ml_dsa_87_evp_type               EVP_PKEY_ML_DSA_87
1000# define ml_dsa_87_d2i_private_key        NULL
1001# define ml_dsa_87_d2i_public_key         NULL
1002# define ml_dsa_87_d2i_PUBKEY             ml_dsa_d2i_PUBKEY
1003# define ml_dsa_87_d2i_PKCS8              ml_dsa_d2i_PKCS8
1004# define ml_dsa_87_d2i_key_params         NULL
1005# define ml_dsa_87_free                   (free_key_fn *)ossl_ml_dsa_key_free
1006# define ml_dsa_87_check                  NULL
1007# define ml_dsa_87_adjust                 NULL
1008
1009#endif
1010
1011/* ---------------------------------------------------------------------- */
1012
1013/*
1014 * The DO_ macros help define the selection mask and the method functions
1015 * for each kind of object we want to decode.
1016 */
1017#define DO_type_specific_keypair(keytype)               \
1018    "type-specific", keytype##_evp_type,                \
1019        ( OSSL_KEYMGMT_SELECT_KEYPAIR ),                \
1020        keytype##_d2i_private_key,                      \
1021        keytype##_d2i_public_key,                       \
1022        NULL,                                           \
1023        NULL,                                           \
1024        NULL,                                           \
1025        keytype##_check,                                \
1026        keytype##_adjust,                               \
1027        keytype##_free
1028
1029#define DO_type_specific_pub(keytype)                   \
1030    "type-specific", keytype##_evp_type,                \
1031        ( OSSL_KEYMGMT_SELECT_PUBLIC_KEY ),             \
1032        NULL,                                           \
1033        keytype##_d2i_public_key,                       \
1034        NULL,                                           \
1035        NULL,                                           \
1036        NULL,                                           \
1037        keytype##_check,                                \
1038        keytype##_adjust,                               \
1039        keytype##_free
1040
1041#define DO_type_specific_priv(keytype)                  \
1042    "type-specific", keytype##_evp_type,                \
1043        ( OSSL_KEYMGMT_SELECT_PRIVATE_KEY ),            \
1044        keytype##_d2i_private_key,                      \
1045        NULL,                                           \
1046        NULL,                                           \
1047        NULL,                                           \
1048        NULL,                                           \
1049        keytype##_check,                                \
1050        keytype##_adjust,                               \
1051        keytype##_free
1052
1053#define DO_type_specific_params(keytype)                \
1054    "type-specific", keytype##_evp_type,                \
1055        ( OSSL_KEYMGMT_SELECT_ALL_PARAMETERS ),         \
1056        NULL,                                           \
1057        NULL,                                           \
1058        keytype##_d2i_key_params,                       \
1059        NULL,                                           \
1060        NULL,                                           \
1061        keytype##_check,                                \
1062        keytype##_adjust,                               \
1063        keytype##_free
1064
1065#define DO_type_specific(keytype)                       \
1066    "type-specific", keytype##_evp_type,                \
1067        ( OSSL_KEYMGMT_SELECT_ALL ),                    \
1068        keytype##_d2i_private_key,                      \
1069        keytype##_d2i_public_key,                       \
1070        keytype##_d2i_key_params,                       \
1071        NULL,                                           \
1072        NULL,                                           \
1073        keytype##_check,                                \
1074        keytype##_adjust,                               \
1075        keytype##_free
1076
1077#define DO_type_specific_no_pub(keytype)                \
1078    "type-specific", keytype##_evp_type,                \
1079        ( OSSL_KEYMGMT_SELECT_PRIVATE_KEY               \
1080          | OSSL_KEYMGMT_SELECT_ALL_PARAMETERS ),       \
1081        keytype##_d2i_private_key,                      \
1082        NULL,                                           \
1083        keytype##_d2i_key_params,                       \
1084        NULL,                                           \
1085        NULL,                                           \
1086        keytype##_check,                                \
1087        keytype##_adjust,                               \
1088        keytype##_free
1089
1090#define DO_PrivateKeyInfo(keytype)                      \
1091    "PrivateKeyInfo", keytype##_evp_type,               \
1092        ( OSSL_KEYMGMT_SELECT_PRIVATE_KEY ),            \
1093        NULL,                                           \
1094        NULL,                                           \
1095        NULL,                                           \
1096        keytype##_d2i_PKCS8,                            \
1097        NULL,                                           \
1098        keytype##_check,                                \
1099        keytype##_adjust,                               \
1100        keytype##_free
1101
1102#define DO_SubjectPublicKeyInfo(keytype)                \
1103    "SubjectPublicKeyInfo", keytype##_evp_type,         \
1104        ( OSSL_KEYMGMT_SELECT_PUBLIC_KEY ),             \
1105        NULL,                                           \
1106        NULL,                                           \
1107        NULL,                                           \
1108        NULL,                                           \
1109        keytype##_d2i_PUBKEY,                           \
1110        keytype##_check,                                \
1111        keytype##_adjust,                               \
1112        keytype##_free
1113
1114#define DO_DH(keytype)                                  \
1115    "DH", keytype##_evp_type,                           \
1116        ( OSSL_KEYMGMT_SELECT_ALL_PARAMETERS ),         \
1117        NULL,                                           \
1118        NULL,                                           \
1119        keytype##_d2i_key_params,                       \
1120        NULL,                                           \
1121        NULL,                                           \
1122        keytype##_check,                                \
1123        keytype##_adjust,                               \
1124        keytype##_free
1125
1126#define DO_DHX(keytype)                                 \
1127    "DHX", keytype##_evp_type,                          \
1128        ( OSSL_KEYMGMT_SELECT_ALL_PARAMETERS ),         \
1129        NULL,                                           \
1130        NULL,                                           \
1131        keytype##_d2i_key_params,                       \
1132        NULL,                                           \
1133        NULL,                                           \
1134        keytype##_check,                                \
1135        keytype##_adjust,                               \
1136        keytype##_free
1137
1138#define DO_DSA(keytype)                                 \
1139    "DSA", keytype##_evp_type,                          \
1140        ( OSSL_KEYMGMT_SELECT_ALL ),                    \
1141        keytype##_d2i_private_key,                      \
1142        keytype##_d2i_public_key,                       \
1143        keytype##_d2i_key_params,                       \
1144        NULL,                                           \
1145        NULL,                                           \
1146        keytype##_check,                                \
1147        keytype##_adjust,                               \
1148        keytype##_free
1149
1150#define DO_EC(keytype)                                  \
1151    "EC", keytype##_evp_type,                           \
1152        ( OSSL_KEYMGMT_SELECT_PRIVATE_KEY               \
1153          | OSSL_KEYMGMT_SELECT_ALL_PARAMETERS ),       \
1154        keytype##_d2i_private_key,                      \
1155        NULL,                                           \
1156        keytype##_d2i_key_params,                       \
1157        NULL,                                           \
1158        NULL,                                           \
1159        keytype##_check,                                \
1160        keytype##_adjust,                               \
1161        keytype##_free
1162
1163#define DO_RSA(keytype)                                 \
1164    "RSA", keytype##_evp_type,                          \
1165        ( OSSL_KEYMGMT_SELECT_KEYPAIR ),                \
1166        keytype##_d2i_private_key,                      \
1167        keytype##_d2i_public_key,                       \
1168        NULL,                                           \
1169        NULL,                                           \
1170        NULL,                                           \
1171        keytype##_check,                                \
1172        keytype##_adjust,                               \
1173        keytype##_free
1174
1175/*
1176 * MAKE_DECODER is the single driver for creating OSSL_DISPATCH tables.
1177 * It takes the following arguments:
1178 *
1179 * keytype_name The implementation key type as a string.
1180 * keytype      The implementation key type.  This must correspond exactly
1181 *              to our existing keymgmt keytype names...  in other words,
1182 *              there must exist an ossl_##keytype##_keymgmt_functions.
1183 * type         The type name for the set of functions that implement the
1184 *              decoder for the key type.  This isn't necessarily the same
1185 *              as keytype.  For example, the key types ed25519, ed448,
1186 *              x25519 and x448 are all handled by the same functions with
1187 *              the common type name ecx.
1188 * kind         The kind of support to implement.  This translates into
1189 *              the DO_##kind macros above, to populate the keytype_desc_st
1190 *              structure.
1191 */
1192#define MAKE_DECODER(keytype_name, keytype, type, kind)                 \
1193    static const struct keytype_desc_st kind##_##keytype##_desc =       \
1194        { keytype_name, ossl_##keytype##_keymgmt_functions,             \
1195          DO_##kind(keytype) };                                         \
1196                                                                        \
1197    static OSSL_FUNC_decoder_newctx_fn kind##_der2##keytype##_newctx;   \
1198                                                                        \
1199    static void *kind##_der2##keytype##_newctx(void *provctx)           \
1200    {                                                                   \
1201        return der2key_newctx(provctx, &kind##_##keytype##_desc);       \
1202    }                                                                   \
1203    static int kind##_der2##keytype##_does_selection(void *provctx,     \
1204                                                     int selection)     \
1205    {                                                                   \
1206        return der2key_check_selection(selection,                       \
1207                                       &kind##_##keytype##_desc);       \
1208    }                                                                   \
1209    const OSSL_DISPATCH                                                 \
1210    ossl_##kind##_der_to_##keytype##_decoder_functions[] = {            \
1211        { OSSL_FUNC_DECODER_NEWCTX,                                     \
1212          (void (*)(void))kind##_der2##keytype##_newctx },              \
1213        { OSSL_FUNC_DECODER_FREECTX,                                    \
1214          (void (*)(void))der2key_freectx },                            \
1215        { OSSL_FUNC_DECODER_DOES_SELECTION,                             \
1216          (void (*)(void))kind##_der2##keytype##_does_selection },      \
1217        { OSSL_FUNC_DECODER_DECODE,                                     \
1218          (void (*)(void))der2key_decode },                             \
1219        { OSSL_FUNC_DECODER_EXPORT_OBJECT,                              \
1220          (void (*)(void))der2key_export_object },                      \
1221        { OSSL_FUNC_DECODER_SETTABLE_CTX_PARAMS,                        \
1222          (void (*)(void))der2key_settable_ctx_params },                \
1223        { OSSL_FUNC_DECODER_SET_CTX_PARAMS,                             \
1224          (void (*)(void))der2key_set_ctx_params },                     \
1225        OSSL_DISPATCH_END                                               \
1226    }
1227
1228#ifndef OPENSSL_NO_DH
1229MAKE_DECODER("DH", dh, dh, PrivateKeyInfo);
1230MAKE_DECODER("DH", dh, dh, SubjectPublicKeyInfo);
1231MAKE_DECODER("DH", dh, dh, type_specific_params);
1232MAKE_DECODER("DH", dh, dh, DH);
1233MAKE_DECODER("DHX", dhx, dhx, PrivateKeyInfo);
1234MAKE_DECODER("DHX", dhx, dhx, SubjectPublicKeyInfo);
1235MAKE_DECODER("DHX", dhx, dhx, type_specific_params);
1236MAKE_DECODER("DHX", dhx, dhx, DHX);
1237#endif
1238#ifndef OPENSSL_NO_DSA
1239MAKE_DECODER("DSA", dsa, dsa, PrivateKeyInfo);
1240MAKE_DECODER("DSA", dsa, dsa, SubjectPublicKeyInfo);
1241MAKE_DECODER("DSA", dsa, dsa, type_specific);
1242MAKE_DECODER("DSA", dsa, dsa, DSA);
1243#endif
1244#ifndef OPENSSL_NO_EC
1245MAKE_DECODER("EC", ec, ec, PrivateKeyInfo);
1246MAKE_DECODER("EC", ec, ec, SubjectPublicKeyInfo);
1247MAKE_DECODER("EC", ec, ec, type_specific_no_pub);
1248MAKE_DECODER("EC", ec, ec, EC);
1249# ifndef OPENSSL_NO_ECX
1250MAKE_DECODER("X25519", x25519, ecx, PrivateKeyInfo);
1251MAKE_DECODER("X25519", x25519, ecx, SubjectPublicKeyInfo);
1252MAKE_DECODER("X448", x448, ecx, PrivateKeyInfo);
1253MAKE_DECODER("X448", x448, ecx, SubjectPublicKeyInfo);
1254MAKE_DECODER("ED25519", ed25519, ecx, PrivateKeyInfo);
1255MAKE_DECODER("ED25519", ed25519, ecx, SubjectPublicKeyInfo);
1256MAKE_DECODER("ED448", ed448, ecx, PrivateKeyInfo);
1257MAKE_DECODER("ED448", ed448, ecx, SubjectPublicKeyInfo);
1258# endif
1259# ifndef OPENSSL_NO_SM2
1260MAKE_DECODER("SM2", sm2, ec, PrivateKeyInfo);
1261MAKE_DECODER("SM2", sm2, ec, SubjectPublicKeyInfo);
1262MAKE_DECODER("SM2", sm2, sm2, type_specific_no_pub);
1263# endif
1264#endif
1265#ifndef OPENSSL_NO_ML_KEM
1266MAKE_DECODER("ML-KEM-512", ml_kem_512, ml_kem_512, PrivateKeyInfo);
1267MAKE_DECODER("ML-KEM-512", ml_kem_512, ml_kem_512, SubjectPublicKeyInfo);
1268MAKE_DECODER("ML-KEM-768", ml_kem_768, ml_kem_768, PrivateKeyInfo);
1269MAKE_DECODER("ML-KEM-768", ml_kem_768, ml_kem_768, SubjectPublicKeyInfo);
1270MAKE_DECODER("ML-KEM-1024", ml_kem_1024, ml_kem_1024, PrivateKeyInfo);
1271MAKE_DECODER("ML-KEM-1024", ml_kem_1024, ml_kem_1024, SubjectPublicKeyInfo);
1272#endif
1273#ifndef OPENSSL_NO_SLH_DSA
1274MAKE_DECODER("SLH-DSA-SHA2-128s", slh_dsa_sha2_128s, slh_dsa, PrivateKeyInfo);
1275MAKE_DECODER("SLH-DSA-SHA2-128f", slh_dsa_sha2_128f, slh_dsa, PrivateKeyInfo);
1276MAKE_DECODER("SLH-DSA-SHA2-192s", slh_dsa_sha2_192s, slh_dsa, PrivateKeyInfo);
1277MAKE_DECODER("SLH-DSA-SHA2-192f", slh_dsa_sha2_192f, slh_dsa, PrivateKeyInfo);
1278MAKE_DECODER("SLH-DSA-SHA2-256s", slh_dsa_sha2_256s, slh_dsa, PrivateKeyInfo);
1279MAKE_DECODER("SLH-DSA-SHA2-256f", slh_dsa_sha2_256f, slh_dsa, PrivateKeyInfo);
1280MAKE_DECODER("SLH-DSA-SHAKE-128s", slh_dsa_shake_128s, slh_dsa, PrivateKeyInfo);
1281MAKE_DECODER("SLH-DSA-SHAKE-128f", slh_dsa_shake_128f, slh_dsa, PrivateKeyInfo);
1282MAKE_DECODER("SLH-DSA-SHAKE-192s", slh_dsa_shake_192s, slh_dsa, PrivateKeyInfo);
1283MAKE_DECODER("SLH-DSA-SHAKE-192f", slh_dsa_shake_192f, slh_dsa, PrivateKeyInfo);
1284MAKE_DECODER("SLH-DSA-SHAKE-256s", slh_dsa_shake_256s, slh_dsa, PrivateKeyInfo);
1285MAKE_DECODER("SLH-DSA-SHAKE-256f", slh_dsa_shake_256f, slh_dsa, PrivateKeyInfo);
1286
1287MAKE_DECODER("SLH-DSA-SHA2-128s", slh_dsa_sha2_128s, slh_dsa, SubjectPublicKeyInfo);
1288MAKE_DECODER("SLH-DSA-SHA2-128f", slh_dsa_sha2_128f, slh_dsa, SubjectPublicKeyInfo);
1289MAKE_DECODER("SLH-DSA-SHA2-192s", slh_dsa_sha2_192s, slh_dsa, SubjectPublicKeyInfo);
1290MAKE_DECODER("SLH-DSA-SHA2-192f", slh_dsa_sha2_192f, slh_dsa, SubjectPublicKeyInfo);
1291MAKE_DECODER("SLH-DSA-SHA2-256s", slh_dsa_sha2_256s, slh_dsa, SubjectPublicKeyInfo);
1292MAKE_DECODER("SLH-DSA-SHA2-256f", slh_dsa_sha2_256f, slh_dsa, SubjectPublicKeyInfo);
1293MAKE_DECODER("SLH-DSA-SHAKE-128s", slh_dsa_shake_128s, slh_dsa, SubjectPublicKeyInfo);
1294MAKE_DECODER("SLH-DSA-SHAKE-128f", slh_dsa_shake_128f, slh_dsa, SubjectPublicKeyInfo);
1295MAKE_DECODER("SLH-DSA-SHAKE-192s", slh_dsa_shake_192s, slh_dsa, SubjectPublicKeyInfo);
1296MAKE_DECODER("SLH-DSA-SHAKE-192f", slh_dsa_shake_192f, slh_dsa, SubjectPublicKeyInfo);
1297MAKE_DECODER("SLH-DSA-SHAKE-256s", slh_dsa_shake_256s, slh_dsa, SubjectPublicKeyInfo);
1298MAKE_DECODER("SLH-DSA-SHAKE-256f", slh_dsa_shake_256f, slh_dsa, SubjectPublicKeyInfo);
1299#endif /* OPENSSL_NO_SLH_DSA */
1300MAKE_DECODER("RSA", rsa, rsa, PrivateKeyInfo);
1301MAKE_DECODER("RSA", rsa, rsa, SubjectPublicKeyInfo);
1302MAKE_DECODER("RSA", rsa, rsa, type_specific_keypair);
1303MAKE_DECODER("RSA", rsa, rsa, RSA);
1304MAKE_DECODER("RSA-PSS", rsapss, rsapss, PrivateKeyInfo);
1305MAKE_DECODER("RSA-PSS", rsapss, rsapss, SubjectPublicKeyInfo);
1306
1307#ifndef OPENSSL_NO_ML_DSA
1308MAKE_DECODER("ML-DSA-44", ml_dsa_44, ml_dsa_44, PrivateKeyInfo);
1309MAKE_DECODER("ML-DSA-44", ml_dsa_44, ml_dsa_44, SubjectPublicKeyInfo);
1310MAKE_DECODER("ML-DSA-65", ml_dsa_65, ml_dsa_65, PrivateKeyInfo);
1311MAKE_DECODER("ML-DSA-65", ml_dsa_65, ml_dsa_65, SubjectPublicKeyInfo);
1312MAKE_DECODER("ML-DSA-87", ml_dsa_87, ml_dsa_87, PrivateKeyInfo);
1313MAKE_DECODER("ML-DSA-87", ml_dsa_87, ml_dsa_87, SubjectPublicKeyInfo);
1314#endif
1315