EVP_PKEY-X25519(7ossl)

πŸ“¦ version 14.5, in freebsd 14.5

πŸ’œ EVP_PKEY-X25519 β€” the X25519 / X448 / ED25519 / ED448 glow-up guide ✨

okay so bestie, welcome to the 7ossl girlies' corner of the OpenSSL docs πŸ’… this one is all about the EVP_PKEY keytypes and algorithm support for X25519, X448, ED25519 and ED448, and the EVP_KEYMGMT side of the same four 🌸


πŸŽ€ NAME πŸŽ€

EVP_PKEY-X25519, EVP_PKEY-X448, EVP_PKEY-ED25519, EVP_PKEY-ED448, EVP_KEYMGMT-X25519, EVP_KEYMGMT-X448, EVP_KEYMGMT-ED25519, EVP_KEYMGMT-ED448 β€” all of these are literally the "EVP_PKEY X25519, X448, ED25519 and ED448 keytype and algorithm support" page 🫢


✨ DESCRIPTION ✨

So the X25519, X448, ED25519 and ED448 keytypes are implemented in OpenSSL's default and FIPS providers, no cap πŸ‘‘ and those implementations support the associated key, which contains the public key pub and the private key priv πŸ”₯

🚨 heads up babes: no additional parameters can be set during key generation. that's just how it is, periodt πŸ’€

🌈 Common X25519, X448, ED25519 and ED448 parameters

on top of the common parameters that all keytypes should support (peep "Common parameters" in provider-keymgmt(7)), these keytypes also support the following πŸ’–

  • "group" (OSSL_PKEY_PARAM_GROUP_NAME) <UTF8 string> β€” bestie this one is only supported by X25519 and X448 πŸ¦‹ the group name must be "x25519" or "x448" respectively for those algorithms. it's only present for consistency with other key exchange algorithms and is typically not needed, so like… lowkey optional vibes πŸ™ˆ
  • "pub" (OSSL_PKEY_PARAM_PUB_KEY) <octet string> β€” the public key value ✨
  • "priv" (OSSL_PKEY_PARAM_PRIV_KEY) <octet string> β€” the private key value πŸ”
  • "encoded-pub-key" (OSSL_PKEY_PARAM_ENCODED_PUBLIC_KEY) <octet string> β€” used for getting and setting the encoding of a public key for the X25519 and X448 key types 🌸 public keys are expected be encoded in a format as defined by RFC7748 (yes, the manpage says "expected be", we're keeping it exactly like that, character for character, that's the rule πŸ’…).

🌟 ED25519 and ED448 parameters

  • "mandatory-digest" (OSSL_PKEY_PARAM_MANDATORY_DIGEST) <UTF8 string> β€” the empty string, signifying that no digest may be specified πŸ’€ that's it, that's the whole parameter.

πŸ¦‹ CONFORMING TO πŸ¦‹

iconic standards behaviour, we love to see it πŸ‘‘


πŸ’… EXAMPLES πŸ’…

an EVP_PKEY context can be obtained by calling β€” here's the whole squad 🫢:

EVP_PKEY_CTX *pctx =
    EVP_PKEY_CTX_new_from_name(NULL, "X25519", NULL);

EVP_PKEY_CTX *pctx =
    EVP_PKEY_CTX_new_from_name(NULL, "X448", NULL);

EVP_PKEY_CTX *pctx =
    EVP_PKEY_CTX_new_from_name(NULL, "ED25519", NULL);

EVP_PKEY_CTX *pctx =
    EVP_PKEY_CTX_new_from_name(NULL, "ED448", NULL);

and an X25519 key can be generated like this ✨:

pkey = EVP_PKEY_Q_keygen(NULL, NULL, "X25519");

an X448, ED25519, or ED448 key can be generated likewise, fr fr 🌈


🌸 SEE ALSO 🌸

go read these next bestie, they're all connected iykyk:


Copyright 2020-2021 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>. πŸŽ€


mwah πŸ’‹ that's the whole page β€” sourced from OpenSSL 3.0.21, dated 2026-06-09, and it's the EVP_PKEY-X25519(7ossl) manpage. go slay your key exchange bestie πŸ¦‹βœ¨

πŸ“¦ where this page comes from