Expand description
A Rust implementation of ed25519 key generation, signing, and verification.
§Example
Creating an ed25519 signature on a message is simple.
First, we need to generate a Keypair
, which includes both public and
secret halves of an asymmetric key. To do so, we need a cryptographically
secure pseudorandom number generator (CSPRNG). For this example, we’ll use
the operating system’s builtin PRNG:
extern crate rand;
extern crate xpx_chain_crypto;
use rand::Rng;
use rand::rngs::OsRng;
use xpx_chain_crypto::Keypair;
use xpx_chain_crypto::Signature;
let mut csprng = OsRng{};
let keypair: Keypair = Keypair::generate(&mut csprng);
We can now use this keypair
to sign a message:
let message: &[u8] = b"ProximaX Limited.";
let signature: Signature = keypair.sign(message);
As well as to verify that this is, indeed, a valid signature on
that message
:
assert!(keypair.verify(message, &signature).is_ok());
Anyone else, given the public
half of the keypair
can also easily
verify this signature:
use xpx_chain_crypto::PublicKey;
let public_key: PublicKey = keypair.public;
assert!(public_key.verify(message, &signature).is_ok());
§Serialisation
PublicKey
s, SecretKey
s, Keypair
s, and Signature
s can be serialised
into byte-arrays by calling .to_bytes()
. It’s perfectly acceptible and
safe to transfer and/or store those bytes. (Of course, never transfer your
secret key to anyone else, since they will only need the public key to
verify your signatures!)
use xpx_chain_crypto::{PUBLIC_KEY_LENGTH, SECRET_KEY_LENGTH, KEYPAIR_LENGTH, SIGNATURE_LENGTH};
let public_key_bytes: [u8; PUBLIC_KEY_LENGTH] = public_key.to_bytes();
let secret_key_bytes: [u8; SECRET_KEY_LENGTH] = keypair.secret.to_bytes();
let keypair_bytes: [u8; KEYPAIR_LENGTH] = keypair.to_bytes();
let signature_bytes: [u8; SIGNATURE_LENGTH] = signature.to_bytes();
And similarly, decoded from bytes with ::from_bytes()
:
let public_key: PublicKey = PublicKey::from_bytes(&public_key_bytes)?;
let secret_key: SecretKey = SecretKey::from_bytes(&secret_key_bytes)?;
let keypair: Keypair = Keypair::from_bytes(&keypair_bytes)?;
let signature: Signature = Signature::from_bytes(&signature_bytes)?;
§Using Serde
If you prefer the bytes to be wrapped in another serialisation format, all
types additionally come with built-in serde support by
building rust-xpx-crypto
via:
$ cargo build --features="serde"
They can be then serialised into any of the wire formats which serde supports. For example, using bincode:
extern crate serde;
extern crate bincode;
use bincode::{serialize, Infinite};
let encoded_public_key: Vec<u8> = serialize(&public_key, Infinite).unwrap();
let encoded_signature: Vec<u8> = serialize(&signature, Infinite).unwrap();
After sending the encoded_public_key
and encoded_signature
, the
recipient may deserialise them and verify:
use bincode::{deserialize};
let message: &[u8] = b"This is a test of the tsunami alert system.";
let decoded_public_key: PublicKey = deserialize(&encoded_public_key).unwrap();
let decoded_signature: Signature = deserialize(&encoded_signature).unwrap();
let verified: bool = decoded_public_key.verify(&message, &decoded_signature).is_ok();
assert!(verified);
Structs§
- Ed25519
Block Cipher - Implementation of the block cipher for Ed25519.
- Expanded
Secret Key - An “expanded” secret key.
- Keypair
- An ed25519 keypair.
- Public
Key - An ed25519 public key.
- Secret
Key - An EdDSA secret key.
- Sha3_
512 - SHA-3-512 hash function.
- Signature
- An ed25519 signature.
- Signature
Error - Errors which may occur while processing signatures and keypairs.
Constants§
- EXPANDED_
SECRET_ KEY_ LENGTH - The length of an “expanded” ed25519 key,
ExpandedSecretKey
, in bytes. - KEYPAIR_
LENGTH - The length of an ed25519
Keypair
, in bytes. - PUBLIC_
KEY_ LENGTH - The length of an ed25519
PublicKey
, in bytes. - SECRET_
KEY_ LENGTH - The length of a ed25519
SecretKey
, in bytes. - SIGNATURE_
LENGTH - The length of a ed25519
Signature
, in bytes.
Functions§
- verify_
batch - Verify a batch of
signatures
onmessages
with their respectivepublic_keys
.