Provided by: openssl_3.5.0-2ubuntu1_amd64 bug

NAME

       EVP_PKEY-ML-KEM, EVP_KEYMGMT-ML-KEM, EVP_PKEY-ML-KEM-512, EVP_PKEY-ML-KEM-768, EVP_PKEY-ML-KEM-1024,
       EVP_KEYMGMT-ML-KEM-512, EVP_KEYMGMT-ML-KEM-768, EVP_KEYMGMT-ML-KEM-1024 - ML-KEM keytype and algorithm
       support

DESCRIPTION

       The ML-KEM-512, ML-KEM-768, and ML-KEM-1024 keytypes are implemented in OpenSSL's default and FIPS
       providers.

   Keygen Parameters
       No mandatory parameters are required for generating a key pair.  To set explicit parameters, use
       EVP_PKEY_CTX_set_params() after calling EVP_PKEY_keygen_init().

       "seed" (OSSL_PKEY_PARAM_ML_KEM_SEED) <octet string>
           Internally,  ML-KEM generates keys using a 64-byte random value (seed), which is the concatenation of
           the 32-byte d and z parameters described in FIPS 203.  This optional parameter can be used to  set  a
           pre-determined seed prior to keypair generation.

           Generated  keys  default  to retaining the seed used.  The seed is also by default retained when keys
           are loaded from PKCS#8 files in the seed format.  When available, the seed  parameter  is  also  used
           during  key  export  and  import,  with  keys  (by  default) regenerated from the seed even when also
           provided on import.  See "Provider configuration parameters" below for related controls.

           When the seed is retained, it is also available as a gettable parameter, and private  key  output  to
           PKCS#8  files  will  by  default include the seed.  When the seed was not initially known, or was not
           retained, PKCS#8 private key files will contain only the private key in FIPS 203 "dk" format.

       "properties" (OSSL_PKEY_PARAM_PROPERTIES) <UTF8 string>
           Sets properties  to  be  used  when  fetching  algorithm  implementations  used  for  ML-KEM  hashing
           operations.

           Use EVP_PKEY_CTX_set_params(3) after calling EVP_PKEY_keygen_init(3).

   Common parameters
       In  addition  to  the  common  parameters  that  all  keytypes  should  support  (see "Common Information
       Parameters" in provider-keymgmt(7)), ML-KEM keys keys support the parameters  listed  below.   These  are
       gettable using EVP_PKEY_get_octet_string_param(3) or EVP_PKEY_get_params(3).  They can be initialised via
       EVP_PKEY_fromdata(3),  and  are returned by EVP_PKEY_todata(3) given a suitable selection.  Once a public
       or private key is configured, it can no longer be modified, nor can another key component be added.

       "pub" (OSSL_PKEY_PARAM_PUB_KEY) <octet string>
           The public key value.

           This parameter is used when importing or exporting the public key value with the  EVP_PKEY_fromdata()
           and  EVP_PKEY_todata()  functions.  The key length and content is that of the FIPS 203 (Algorithm 16:
           ML-KEM.KeyGen_internal) ek public key for the given  ML-KEM  variant.   Initial  import  aside,  this
           parameter is otherwise only gettable.

       "priv" (OSSL_PKEY_PARAM_PRIV_KEY) <octet string>
           The private key value.

           This parameter is used when importing or exporting the private key value with the EVP_PKEY_fromdata()
           and  EVP_PKEY_todata()  functions.  The key length and content is that of the FIPS 203 (Algorithm 16:
           ML-KEM.KeyGen_internal) dk private key for the given ML-KEM  variant.   Initial  import  aside,  this
           parameter is otherwise only gettable.

       "encoded-pub-key" (OSSL_PKEY_PARAM_ENCODED_PUBLIC_KEY) <octet string>
           Used for getting and setting the encoding of a public key.  The key format is that of ek in FIPS 203,
           Algorithm  16:  ML-KEM.KeyGen_internal.   Updates  of  the public and private key components are only
           allowed on keys that are empty.  Once a public or private key component is set,  no  further  changes
           are allowed.  This parameter is gettable and settable (once only).

   Provider configuration parameters
       See  the  description  of  the -provparam option in openssl(1) to learn how to set provider configuration
       parameters in the command line tools.   See  OSSL_PROVIDER_add_conf_parameter(3)  to  learn  how  to  set
       provider configuration options programmatically.

       "ml-kem.import_pct_type" (OSSL_PKEY_PARAM_ML_KEM_IMPORT_PCT_TYPE) <UTF8 string>
           When  an  ML-KEM  key  is imported as an explict FIPS 203 dk decapsulation key, rather than a seed, a
           pairwise consistency test (PCT) is optionally performed.  By default, or when this parameter  is  set
           explicitly  to "random", the PCT is performed with a random entropy value for the encapsulation step.
           Setting the parameter to "fixed", still runs the test, but the encapsulation entropy is  a  fixed  32
           byte value.  Specifying any other value of the parameter, e.g. "none", skips the test.

       "ml-kem.retain_seed" (OSSL_PKEY_PARAM_ML_KEM_RETAIN_SEED) <UTF8 string>
           When  set  to  a  string representing a false boolean value (see OSSL_PROVIDER_conf_get_bool(3)), the
           seed will not be retained after key generation or key import from a seed value.  If the resulting key
           is then written to a PKCS#8 object, it will contain only the FIPS 203 "dk" key.

       "ml-kem.prefer_seed" (OSSL_PKEY_PARAM_ML_KEM_PREFER_SEED) <UTF8 string>
           When decoding PKCS#8 objects that contain both a seed and the FIPS 203 "dk" private key, the seed  is
           by  default  used  to  regenerate the key, and the companion key is ignored.  When this configuration
           parameter is set to a string representing a false boolean value (see OSSL_PROVIDER_conf_get_bool(3)),
           the seed is ignored (neither used to regenerate the key, nor retained), and the companion key is used
           instead.

       "ml-kem.input_formats" (OSSL_PKEY_PARAM_ML_KEM_INPUT_FORMATS) <UTF8 string>
           List of enabled private key input formats when parsing PKCS#8 objects.  List elements  are  separated
           by  commas  and/or spaces or tabs.  The list of enabled formats can be specified in the configuration
           file, as seen in the "EXAMPLES" section below, or the via the  -provparam  command-line  option  (see
           also OSSL_PROVIDER_add_conf_parameter(3)).

           Values  specified  on  the command-line override any configuration file settings.  By default all the
           supported formats are enabled.  The supported formats are:

           "seed-priv":
               This format represents PKCS#8 objects in which both the FIPS 203 64-byte  (d,  z)  seed  and  the
               decapsulation  key  dk  are  present  in the private key as part of the DER encoding of the ASN.1
               sequence:

                   ML-KEM-PrivateKey ::= CHOICE {
                     seed [0] IMPLICIT OCTET STRING (SIZE (64)),
                     expandedKey OCTET STRING (SIZE (1632 | 2400 | 3168)),
                     both SEQUENCE {
                       seed OCTET STRING (SIZE (64)),
                       expandedKey OCTET STRING (SIZE (1632 | 2400 | 3168)) } }

               If the "seed-priv" format is not included in the list, this format  will  not  be  recognised  on
               input.

           "seed-only":
               This  format  represents  PKCS#8  objects in which only the 64-byte (d, z) seed is present in the
               above sequence.  If the "seed-only" format is not included in the list, this format will  not  be
               recognised on input.

           "priv-only":
               This  format represents PKCS#8 objects in which only the FIPS 203 decapsulation key dk is present
               in the above sequence.  If the "priv-only" format is not included in the list, this  format  will
               not be recognised on input.

           "oqskeypair":
               This  format  represents  PKCS#8  objects  in which the private key is a DER encoding of an octet
               string containing the concatenaton of the FIPS 203 decapsulation key dk and the encapsulation key
               ek.  This encoding is used in some builds of the "oqsprovider".  If the  "oqskeypair"  format  is
               not included in the list, this format will not be recognised on input.

           "bare-seed":
               This format represents PKCS#8 objects in which the private key contains the 64-byte FIPS 204 seed
               (d,  z)  without any ASN.1 encapsulation.  If the "bare-seed" format is not included in the list,
               this format will not be recognised on input.

           "bare-priv":
               This  format  represents  PKCS#8  objects  in  which  the  private  key  contains  the  FIPS  204
               decapsulation  key dk without any ASN.1 encapsulation.  If the "bare-priv" format is not included
               in the list, this format will not be recognised on input.

       "ml-kem.output_formats" (OSSL_PKEY_PARAM_ML_KEM_OUTPUT_FORMATS) <UTF8 string>
           Ordered list of enabled private key output formats when writing  PKCS#8  files.   List  elements  are
           separated  by  commas,  spaces  or  tabs.   The  list  of  enabled  formats  can  be specified in the
           configuration file, as seen in the "EXAMPLES" section below, or the via the  -provparam  command-line
           option.

           This  supports the same set of formats as described under "ml-kem.input_formats" above.  The order in
           which elements are listed is important, the selected format will be the first one that is possible to
           output.  If the key seed is known, the first listed format will be selected.  If the key seed is  not
           known,  the  first  format  that omits the seed will be selected.  The default order is equivalent to
           "seed-priv" first and "priv-only" second, with both seed and key output when the seed  is  available,
           and just the key otherwise.  If "seed-only" is listed first, then the seed will be output without the
           key  when  available,  otherwise  the output will have just the key.  If "priv-only" is listed first,
           then just the key is output regardless of whether the seed  is  present.   The  legacy  "oqskeypair",
           "bare-seed" and "bare-priv" formats can also be output, by listing those first.

CONFORMING TO

       FIPS 203

EXAMPLES

       An EVP_PKEY context can be obtained by calling:

           EVP_PKEY_CTX *pctx =
               EVP_PKEY_CTX_new_from_name(NULL, "ML-KEM-768", NULL);

       An ML-KEM-768 key can be generated like this:

           pkey = EVP_PKEY_Q_keygen(NULL, NULL, "ML-KEM-768");

       An ML-KEM private key in seed format can be converted to a key in the FIPS 203 dk format by running:

           $ openssl pkey -provparam ml-kem.retain_seed=no \
               -in seed-only.pem -out priv-only.pem

       To generate an, e.g., ML-KEM-768 key, in FIPS 203 dk format, you can run:

           $ openssl genpkey -provparam ml-kem.retain_seed=no \
               -algorithm ml-kem-768 -out priv-only.pem

       If  you have a PKCS#8 file with both a seed and a key, and prefer to import the companion key rather than
       the seed, you can run:

           $ openssl pkey -provparam ml-kem.prefer_seed=no \
               -in seed-priv.pem -out priv-only.pem

       In the openssl.cnf file, this looks like:

           openssl_conf = openssl_init

           [openssl_init]
           providers = providers_sect

           # Can be referenced in one or more provider sections
           [ml_kem_sect]
           prefer_seed = yes
           retain_seed = yes
           # OQS legacy formats disabled
           input_formats = seed-priv, seed-only, priv-only
           # Output either the seed alone, or else the key alone
           output_formats = seed-only, priv-only

           [providers_sect]
           default = default_sect
           # Or perhaps just: base = default_sect
           base = base_sect

           [default_sect]
           ml-kem = ml_kem_sect

           [base_sect]
           ml-kem = ml_kem_sect

SEE ALSO

       openssl(1),        openssl-pkey(1),        openssl-genpkey(1),        EVP_KEYMGMT(3),        EVP_PKEY(3),
       EVP_PKEY_get_raw_private_key(3),   EVP_PKEY_get_raw_public_key(3),   EVP_PKEY_get1_encoded_public_key(3),
       OSSL_PROVIDER_add_conf_parameter(3), provider-keymgmt(7), EVP_KEM-ML-KEM(7)

HISTORY

       This functionality was added in OpenSSL 3.5.

COPYRIGHT

       Copyright 2024-2025 The OpenSSL Project Authors. All Rights Reserved.

       Licensed under the Apache License 2.0 (the "License").  You may not use this file  except  in  compliance
       with  the  License.   You  can  obtain  a  copy  in  the  file  LICENSE  in the source distribution or at
       <https://www.openssl.org/source/license.html>.

3.5.0                                              2025-06-04                              EVP_PKEY-ML-KEM(7SSL)