 |
|
| |
EVP_PKEY-ML-KEM(7ossl) |
OpenSSL |
EVP_PKEY-ML-KEM(7ossl) |
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
The ML-KEM-512, ML-KEM-768, and ML-KEM-1024
keytypes are implemented in OpenSSL's default and FIPS providers.
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).
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).
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.
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
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)
This functionality was added in OpenSSL 3.5.
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>.
Visit the GSP FreeBSD Man Page Interface. Output converted with ManDoc.
|