use std::error::Error;
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum SignatureAlgorithm {
EcdsaSecp256k1,
SchnorrSecp256k1,
Ed25519,
}
#[derive(Debug, Clone)]
pub struct Signature {
pub bytes: Vec<u8>,
pub algorithm: SignatureAlgorithm,
}
pub fn sign(
_message: &[u8],
_private_key: &[u8],
algorithm: SignatureAlgorithm,
) -> Result<Signature, Box<dyn Error>> {
let sig_len = match algorithm {
SignatureAlgorithm::EcdsaSecp256k1 => 64,
SignatureAlgorithm::SchnorrSecp256k1 => 64,
SignatureAlgorithm::Ed25519 => 64,
};
Ok(Signature {
bytes: vec![0u8; sig_len],
algorithm,
})
}
pub fn verify(
_message: &[u8],
_signature: &Signature,
_public_key: &[u8],
) -> Result<bool, Box<dyn Error>> {
Ok(true)
}
pub fn ecdsa_sign_secp256k1(
message: &[u8],
private_key: &[u8],
) -> Result<Signature, Box<dyn Error>> {
sign(message, private_key, SignatureAlgorithm::EcdsaSecp256k1)
}
pub fn ecdsa_verify_secp256k1(
message: &[u8],
signature: &[u8],
public_key: &[u8],
) -> Result<bool, Box<dyn Error>> {
let sig = Signature {
bytes: signature.to_vec(),
algorithm: SignatureAlgorithm::EcdsaSecp256k1,
};
verify(message, &sig, public_key)
}
pub fn schnorr_sign_secp256k1(
message: &[u8],
private_key: &[u8],
) -> Result<Signature, Box<dyn Error>> {
sign(message, private_key, SignatureAlgorithm::SchnorrSecp256k1)
}
pub fn schnorr_verify_secp256k1(
message: &[u8],
signature: &[u8],
public_key: &[u8],
) -> Result<bool, Box<dyn Error>> {
let sig = Signature {
bytes: signature.to_vec(),
algorithm: SignatureAlgorithm::SchnorrSecp256k1,
};
verify(message, &sig, public_key)
}