use bn::{pairing_batch, Group, Gt, G1, G2};
use crate::{
error::{Error, Result},
hash,
PrivateKey,
PublicKey,
PublicKeyG1,
Signature,
};
pub struct ECDSA;
impl ECDSA {
pub fn sign<T: AsRef<[u8]>>(message: T, private_key: &PrivateKey) -> Result<Signature> {
let hash_point = hash::hash_to_try_and_increment(message)?;
let g1_point = hash_point * private_key.into();
Ok(Signature(g1_point))
}
pub fn verify<T: AsRef<[u8]>>(message: T, signature: &Signature, public_key: &PublicKey) -> Result<()> {
let mut vals = Vec::new();
let hash_point = hash::hash_to_try_and_increment(message)?;
vals.push((hash_point, public_key.into()));
vals.push((signature.into(), -G2::one()));
let mul = pairing_batch(&vals);
if mul == Gt::one() {
Ok(())
} else {
Err(Error::VerificationFailed)
}
}
}
pub fn check_public_keys(public_key_g2: &PublicKey, public_key_g1: &PublicKeyG1) -> Result<()> {
let vals = vec![
(G1::one(), public_key_g2.into()),
(public_key_g1.into(), -G2::one()),
];
let mul = pairing_batch(&vals);
if mul == Gt::one() {
Ok(())
} else {
Err(Error::VerificationFailed)
}
}