# info > EVP_SIGNATURE-ED25519

---
type: CommandReference
command: EVP_SIGNATURE-ED25519
mode: man
section: 7SSL
source: man-pages
---

## Quick Reference
- Generate new Ed25519 key: `EVP_PKEY_CTX *pctx = EVP_PKEY_CTX_new_id(EVP_PKEY_ED25519, NULL); EVP_PKEY_keygen_init(pctx); EVP_PKEY_keygen(pctx, &pkey);`
- Import raw Ed25519 private key: `EVP_PKEY *pkey = EVP_PKEY_new_raw_private_key(EVP_PKEY_ED25519, NULL, privkey, 32);`
- Initialize signing context (digest must be NULL): `EVP_DigestSignInit(md_ctx, NULL, NULL, NULL, pkey);`
- One-shot sign a message: `EVP_DigestSign(md_ctx, sig, &siglen, msg, msglen);`
- Verify a signature: `EVP_DigestVerifyInit(md_ctx, NULL, NULL, NULL, pubkey); EVP_DigestVerify(md_ctx, sig, siglen, msg, msglen);`
- Benchmark Ed25519 performance: `openssl speed ed25519`

## Name
EVP_PKEY Ed25519 and Ed448 support — PureEdDSA key generation, signing, and verification.

## Synopsis
c
#include <openssl/evp.h>

// One-shot sign
int EVP_DigestSignInit(EVP_MD_CTX *ctx, EVP_PKEY_CTX **pctx,
                       const EVP_MD *type, ENGINE *e, EVP_PKEY *pkey);
int EVP_DigestSign(EVP_MD_CTX *ctx, unsigned char *sig, size_t *siglen,
                   const unsigned char *tbs, size_t tbslen);

// One-shot verify
int EVP_DigestVerifyInit(EVP_MD_CTX *ctx, EVP_PKEY_CTX **pctx,
                         const EVP_MD *type, ENGINE *e, EVP_PKEY *pkey);
int EVP_DigestVerify(EVP_MD_CTX *ctx, const unsigned char *sig, size_t siglen,
                     const unsigned char *tbs, size_t tbslen);
- The `type` parameter **must** be `NULL` in `EVP_DigestSignInit()` and `EVP_DigestVerifyInit()` (PureEdDSA uses no pre-hashing).
- Streaming via `EVP_DigestUpdate()` is **not** supported; use the one-shot functions above.

## Signature Parameters
- `"algorithm-id"` (`OSSL_SIGNATURE_PARAM_ALGORITHM_ID`) — retrievable `octet string` using `EVP_PKEY_CTX_get_params()`. No user-settable parameters.

## Examples
Sign a message using an Ed25519 or Ed448 key:
c
void do_sign(EVP_PKEY *ed_key, unsigned char *msg, size_t msg_len)
{
    size_t sig_len;
    unsigned char *sig = NULL;
    EVP_MD_CTX *md_ctx = EVP_MD_CTX_new();

    EVP_DigestSignInit(md_ctx, NULL, NULL, NULL, ed_key);
    /* Calculate required signature size by passing a NULL buffer */
    EVP_DigestSign(md_ctx, NULL, &sig_len, msg, msg_len);
    sig = OPENSSL_zalloc(sig_len);

    EVP_DigestSign(md_ctx, sig, &sig_len, msg, msg_len);
    /* use signature ... */
    OPENSSL_free(sig);
    EVP_MD_CTX_free(md_ctx);
}
## See Also
- [EVP_PKEY-X25519(7)](http://localhost/phpMan.php/man/EVPPKEY-X25519/7/markdown) — X25519/X448 key management
- [provider-signature(7)](http://localhost/phpMan.php/man/provider-signature/7/markdown) — signature provider parameters
- [EVP_DigestSignInit(3)](http://localhost/phpMan.php/man/EVPDigestSignInit/3/markdown)
- [EVP_DigestVerifyInit(3)](http://localhost/phpMan.php/man/EVPDigestVerifyInit/3/markdown)
- [EVP_PKEY_new_raw_private_key(3)](http://localhost/phpMan.php/man/EVPPKEYnewrawprivatekey/3/markdown)
- [EVP_PKEY_new_raw_public_key(3)](http://localhost/phpMan.php/man/EVPPKEYnewrawpublickey/3/markdown)
- [openssl-speed(1)](http://localhost/phpMan.php/man/openssl-speed/1/markdown)