[][src]Crate ed25519_zebra

Zcash-flavored Ed25519 for use in Zebra.

Zcash uses Ed25519 for JoinSplit signatures with particular validation rules around edge cases in Ed25519 signatures. Ed25519, as specified in RFC8032, does not specify behaviour around these edge cases and so does not require conformant implementations to agree on whether a signature is valid. For most applications, these edge cases are irrelevant, but in Zcash, nodes must be able to reach consensus on which signatures would be valid, so these validation behaviors are consensus-critical.

Because the Ed25519 validation rules are consensus-critical for Zcash, Zebra requires an Ed25519 library that implements the Zcash-flavored validation rules specifically, and since it is unreasonable to expect an upstream dependency to maintain Zcash-specific behavior, this crate provides an Ed25519 implementation matching the Zcash consensus rules exactly.

Example

use std::convert::TryFrom;
use rand::thread_rng;
use ed25519_zebra::*;

let msg = b"Zcash";

// Generate a secret key and sign the message
let sk = SecretKey::new(thread_rng());
let sig = sk.sign(msg);

// Types can be converted to raw byte arrays with From/Into
let sig_bytes: [u8; 64] = sig.into();
let pk_bytes: [u8; 32] = PublicKey::from(&sk).into();

// Verify the signature
assert!(
    PublicKey::try_from(pk_bytes)
        .and_then(|pk| pk.verify(&sig_bytes.into(), msg))
        .is_ok()
);

Docs require the nightly feature until RFC 1990 lands.

Structs

PublicKey

A valid Ed25519 public key.

PublicKeyBytes

A refinement type for [u8; 32] indicating that the bytes represent an encoding of an Ed25519 public key.

SecretKey

An Ed25519 secret key.

Signature

An Ed25519 signature.

Enums

Error

An error related to Ed25519 signatures.