use core::ops::Add;
use rand_core::{CryptoRng, Rng};
use subtle::ConstantTimeEq;
use tari_utilities::{ByteArray, ByteArrayError};
use zeroize::{Zeroize, ZeroizeOnDrop};
pub trait SecretKey:
ByteArray + Clone + ConstantTimeEq + PartialEq + Eq + Add<Output = Self> + Default + Zeroize + ZeroizeOnDrop
{
const KEY_LEN: usize;
const WIDE_REDUCTION_LEN: usize;
fn key_length() -> usize {
Self::KEY_LEN
}
fn random<R: Rng + CryptoRng>(rng: &mut R) -> Self;
fn from_uniform_bytes(bytes: &[u8]) -> Result<Self, ByteArrayError>;
}
pub trait PublicKey:
ByteArray + ConstantTimeEq + PartialEq + Eq + Add<Output = Self> + Clone + PartialOrd + Ord + Default + Zeroize
{
const KEY_LEN: usize;
type K: SecretKey;
fn from_secret_key(k: &Self::K) -> Self;
fn key_length() -> usize {
Self::KEY_LEN
}
fn batch_mul(scalars: &[Self::K], points: &[Self]) -> Self;
fn random_keypair<R: Rng + CryptoRng>(rng: &mut R) -> (Self::K, Self) {
let k = Self::K::random(rng);
let pk = Self::from_secret_key(&k);
(k, pk)
}
}