Digital signatures
A digital signature verifies the authenticity of a message and provides non-repudiation. This means any change to the message causes signature verification to fail, you know who signed the message, and someone cannot deny having signed a message.
Signing is done using a private key. The associated public key can then be publicly shared to allow others to verify signatures.
Private keys MUST NOT be shared. They MUST remain secret.
Generally, avoid using signatures with encryption and instead rely on authenticated key exchange. You can find out more here.
Fills a span with a randomly generated private key and another span with the associated public key.
Ed25519.GenerateKeyPair(Span<byte> publicKey, Span<byte> privateKey)
publicKey
has a length not equal to PublicKeySize
.privateKey
has a length not equal to PrivateKeySize
.Unable to generate key pair.
Fills a span with a private key generated using a random seed and another span with the associated public key.
Ed25519.GenerateKeyPair(Span<byte> publicKey, Span<byte> privateKey, ReadOnlySpan<byte> seed)
publicKey
has a length not equal to PublicKeySize
.privateKey
has a length not equal to PrivateKeySize
.seed
has a length not equal to SeedSize
.Unable to generate key pair from seed.
Fills a span with the public key computed from a private key.
Ed25519.ComputePublicKey(Span<byte> publicKey, ReadOnlySpan<byte> privateKey)
publicKey
has a length not equal to PublicKeySize
.privateKey
has a length not equal to PrivateKeySize
.Unable to compute public key from private key.
Fills a span with the signature for a message signed using a private key.
Ed25519.Sign(Span<byte> signature, ReadOnlySpan<byte> message, ReadOnlySpan<byte> privateKey)
signature
has a length not equal to SignatureSize
.privateKey
has a length not equal to PrivateKeySize
.Unable to compute signature.
Determines if a signature is valid for a message and public key. It returns
true
if the signature is valid and false
otherwise.Ed25519.Verify(ReadOnlySpan<byte> signature, ReadOnlySpan<byte> message, ReadOnlySpan<byte> publicKey)
signature
has a length not equal to SignatureSize
.publicKey
has a length not equal to PublicKeySize
.IncrementalEd25519ph.Finalize()
fills a span with the signature for a chunked message signed using a private key.IncrementalEd25519ph.FinalizeAndVerify()
determines if a signature is valid for a chunked message and public key. It returns true
if the signature is valid and false
otherwise.using var ed25519ph = new IncrementalEd25519ph();
ed25519ph.Update(ReadOnlySpan<byte> message1);
ed25519ph.Update(ReadOnlySpan<byte> message2);
// sign
ed25519ph.Finalize(Span<byte> signature, ReadOnlySpan<byte> privateKey);
// or verify
bool valid = ed25519ph.FinalizeAndVerify(ReadOnlySpan<byte> signature, ReadOnlySpan<byte> publicKey)
This should only be used when the message is too large to fit into memory because prehashing is theoretically weaker than regular signing.
signature
has a length not equal to SignatureSize
.privateKey
has a length not equal to PrivateKeySize
.publicKey
has a length not equal to PublicKeySize
.The signature could not be computed/verified.
Cannot update after finalizing or finalize twice.
These are used for validation and/or save you defining your own constants.
public const int PublicKeySize = 32;
public const int PrivateKeySize = 64;
public const int SignatureSize = 64;
public const int SeedSize = 32;
If you want to use BLAKE2b for prehashing instead of Ed25519ph, which uses SHA-512 internally, you can hash a domain separation constant (e.g. the protocol name) concatenated with the message and sign the 512-bit hash.
Ed25519 is vulnerable to fault attacks. Techniques like causing voltage glitches on a chip (e.g. on an Arduino) can be used to recover the secret key and create valid signatures.
This should generally not concern you as it's mostly relevant for embedded devices and requires physical or remote access to the device. Furthermore, most countermeasures are ineffective. Prehashing or hedged signatures can help but will not prevent all attacks.
Last modified 1d ago