=pod =head1 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 =head1 DESCRIPTION The B, B, and B keytypes are implemented in OpenSSL's default and FIPS providers. =head2 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(). =over 4 =item "seed" (B) Internally, ML-KEM generates keys using a 64-byte random value (seed), which is the concatenation of the 32-byte I and I 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 B 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 L below for related controls. When the seed is retained, it is also available as a B parameter, and private key output to B files will by default include the seed. When the seed was not initially known, or was not retained, B private key files will contain only the private key in FIPS 203 C format. =item "properties" (B) Sets properties to be used when fetching algorithm implementations used for ML-KEM hashing operations. Use L after calling L. =back =head2 Common parameters In addition to the common parameters that all keytypes should support (see L), B keys keys support the parameters listed below. These are gettable using L or L. They can be initialised via L, and are returned by L given a suitable I. Once a public or private key is configured, it can no longer be modified, nor can another key component be added. =over 4 =item "pub" (B) 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: B) B public key for the given ML-KEM variant. Initial import aside, this parameter is otherwise only gettable. =item "priv" (B) 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: B) B private key for the given ML-KEM variant. Initial import aside, this parameter is otherwise only gettable. =item "encoded-pub-key" (B) Used for getting and setting the encoding of a public key. The key format is that of B in FIPS 203, Algorithm 16: B. 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). =back =head2 Provider configuration parameters See the description of the B<-provparam> option in L to learn how to set provider configuration parameters in the command line tools. See L to learn how to set provider configuration options programmatically. =over 4 =item C (B) When an B key is imported as an explict FIPS 203 B decapsulation key, rather than a seed, a pairwise consistency test (PCT) is optionally performed. By default, or when this parameter is set explicitly to C, the PCT is performed with a random entropy value for the encapsulation step. Setting the parameter to C, still runs the test, but the encapsulation entropy is a fixed 32 byte value. Specifying any other value of the parameter, e.g. C, skips the test. =item C (B) When set to a string representing a false boolean value (see L), 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 C key. =item C (B) When decoding PKCS#8 objects that contain both a seed and the FIPS 203 C 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 L), the seed is ignored (neither used to regenerate the key, nor retained), and the companion key is used instead. =item C (B) 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 L section below, or the via the B<-provparam> command-line option (see also L). Values specified on the command-line override any configuration file settings. By default all the supported formats are enabled. The supported formats are: =over 4 =item C: This format represents B objects in which both the FIPS 203 64-byte B<(d, z)> seed and the decapsulation key B 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 C format is not included in the list, this format will not be recognised on input. =item C: This format represents B objects in which only the 64-byte B<(d, z)> seed is present in the above sequence. If the C format is not included in the list, this format will not be recognised on input. =item C: This format represents B objects in which only the FIPS 203 decapsulation key B is present in the above sequence. If the C format is not included in the list, this format will not be recognised on input. =item C: This format represents B objects in which the private key is a DER encoding of an octet string containing the concatenaton of the FIPS 203 decapsulation key B and the encapsulation key B. This encoding is used in some builds of the C. If the C format is not included in the list, this format will not be recognised on input. =item C: This format represents B objects in which the private key contains the 64-byte FIPS 204 seed B<(d, z)> without any ASN.1 encapsulation. If the C format is not included in the list, this format will not be recognised on input. =item C: This format represents B objects in which the private key contains the FIPS 204 decapsulation key B without any ASN.1 encapsulation. If the C format is not included in the list, this format will not be recognised on input. =back =item C (B) Ordered list of enabled private key output formats when writing B 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 L section below, or the via the B<-provparam> command-line option. This supports the same set of formats as described under C 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 C first and C second, with both seed and key output when the seed is available, and just the key otherwise. If C is listed first, then the seed will be output without the key when available, otherwise the output will have just the key. If C is listed first, then just the key is output regardless of whether the seed is present. The legacy C, C and C formats can also be output, by listing those first. =back =head1 CONFORMING TO =over 4 =item FIPS 203 =back =head1 EXAMPLES An B context can be obtained by calling: EVP_PKEY_CTX *pctx = EVP_PKEY_CTX_new_from_name(NULL, "ML-KEM-768", NULL); An B key can be generated like this: pkey = EVP_PKEY_Q_keygen(NULL, NULL, "ML-KEM-768"); An B private key in seed format can be converted to a key in the FIPS 203 B format by running: $ openssl pkey -provparam ml-kem.retain_seed=no \ -in seed-only.pem -out priv-only.pem To generate an, e.g., B key, in FIPS 203 B format, you can run: $ openssl genpkey -provparam ml-kem.retain_seed=no \ -algorithm ml-kem-768 -out priv-only.pem If you have a B 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 B 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 =head1 SEE ALSO L, L, L, L, L, L, L, L, L, L, L =head1 HISTORY This functionality was added in OpenSSL 3.5. =head1 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 L. =cut