use ed25519_dalek::{Signature, Signer, SigningKey, Verifier, VerifyingKey};
use rand::rngs::OsRng;
use crate::HypercoreError;
#[derive(Debug, Clone)]
pub struct PartialKeypair {
pub public: VerifyingKey,
pub secret: Option<SigningKey>,
}
pub fn generate() -> SigningKey {
let mut csprng = OsRng;
SigningKey::generate(&mut csprng)
}
pub fn sign(signing_key: &SigningKey, msg: &[u8]) -> Signature {
signing_key.sign(msg)
}
pub fn verify(
public: &VerifyingKey,
msg: &[u8],
sig: Option<&Signature>,
) -> Result<(), HypercoreError> {
match sig {
None => Err(HypercoreError::InvalidSignature {
context: "No signature provided.".to_string(),
}),
Some(sig) => {
if public.verify(msg, sig).is_ok() {
Ok(())
} else {
Err(HypercoreError::InvalidSignature {
context: "Signature could not be verified.".to_string(),
})
}
}
}
}
#[test]
fn can_verify_messages() {
let signing_key = generate();
let from = b"hello";
let sig = sign(&signing_key, from);
verify(&signing_key.verifying_key(), from, Some(&sig)).unwrap();
verify(&signing_key.verifying_key(), b"oops", Some(&sig)).unwrap_err();
}