<DRAFT!>
			HOWTO keys

1. Introduction

Keys are the basis of public key algorithms and PKI.  Keys usually
come in pairs, with one half being the public key and the other half
being the private key.  With OpenSSL, the private key contains the
public key information as well, so a public key doesn't need to be
generated separately.

Public keys come in several flavors, using different cryptographic
algorithms.  The most popular ones associated with certificates are
RSA and ECDSA, and this HOWTO will show how to generate each of them.

2. To generate an RSA key

An RSA key can be used both for encryption and for signing.

Generating a key for the RSA algorithm is quite easy, all you have to
do is the following:

  openssl genrsa -aes256 -out privkey.pem 2048

With this variant, you will be prompted for a protecting password.  If
you don't want your key to be protected by a password, remove the flag
'-aes256' from the command line above.

The number 2048 is the size of the key, in bits.  Today, 2048 or
higher is recommended for RSA keys, as fewer amount of bits is
considered to be insecure.

3. To generate an EC key

An EC key can be used for either key agreement (ECDH), signing (ECDSA) or
key encapsulation (KEM) purposes.
(A key should only be used for one of these purposes)

An EC key can be generated by specifying a curve name such as P-256 using:

  openssl genpkey -algorithm EC -pkeyopt group:P-256 -aes256 -out private.key

With this variant, you will be prompted for a password to protect your key.
If you don't want your key to be protected by a password, remove the flag
'-aes256' from the command line above.

Each curve name is associated with a group of fixed parameters.
Curve names containing numbers lower than 256 are no longer considered
secure.

The NIST P-256 curve name (which is an alias for prime256v1), stands for
'X9.62/SECG curve over a 256-bit prime field'.

4. To generate a X25519 or X448 Key for Key Agreement

X25519, X448, Ed25519 and Ed448 are treated as distinct algorithms and not as
one of the EC curves listed with 'ecparam -list_curves' option.
Unlike other algorithms there are separate key types for signing and
key agreement.

You can use the following command to generate an X25519 key:

  openssl genpkey -algorithm X25519 -out xkey.pem

5. To generate a Ed25519 or Ed448 Key

An Ed25519 or Ed448 key can be used for signing and verification purposes.

You can use the following command to generate an Ed25519 key:
  openssl genpkey -algorithm Ed25519 -out xkey.pem

6. To generate an ML-DSA key

An ML-DSA key can be used for signing (and verification via the public key)
only.

Generating a key for the ML-DSA algorithm is a one-step process.

  openssl genpkey -algorithm ML-DSA-44 -out key.pem
  openssl genpkey -algorithm ML-DSA-65 -out key.pem
  openssl genpkey -algorithm ML-DSA-87 -out key.pem

See L<EVP_PKEY-ML-DSA(7)> for more detail.

7. To generate an ML-KEM key

An ML-KEM key can be used for decapsulation (and encapsulation via the public
key) only.

Generating a key for the ML-KEM algorithm is a one-step process.

  openssl genpkey -algorithm ML-KEM-512 -out key.pem
  openssl genpkey -algorithm ML-KEM-768 -out key.pem
  openssl genpkey -algorithm ML-KEM-1024 -out key.pem

See L<EVP_PKEY-ML-KEM(7)> for more detail.

8. NOTE

If you intend to use the key together with a server certificate,
it may be reasonable to avoid protecting it with a password, since
otherwise someone would have to type in the password every time the
server needs to access the key.

To generate keys using C code refer to the demos located in
https://github.com/openssl/openssl/blob/master/demos/pkey.
