use core::fmt::{Display, Formatter};
use core::ops::{Deref, DerefMut};
use serde::Deserialize;
use serde::Serialize;
use sha2::Sha256;
use crate::cipher::Stream;
use crate::group::edwards25519::curve::Curve;
use crate::group::edwards25519::scalar::Scalar;
use crate::group::Group;
use crate::group::HashFactory;
use crate::share::vss::suite::Suite;
use crate::sign::dss;
use crate::util;
use crate::util::key::Generator;
use crate::util::key::KeyError;
use crate::util::key::Suite as KeySuite;
use crate::{xof, Random, XOFFactory};
use super::Point;
#[derive(Clone, Copy, Debug, Default, Serialize, Deserialize)]
pub struct SuiteEd25519 {
curve: Curve,
}
impl SuiteEd25519 {
pub fn new_blake3_sha256_ed25519() -> SuiteEd25519 {
SuiteEd25519::default()
}
}
impl Deref for SuiteEd25519 {
type Target = Curve;
fn deref(&self) -> &Self::Target {
&self.curve
}
}
impl DerefMut for SuiteEd25519 {
fn deref_mut(&mut self) -> &mut Self::Target {
&mut self.curve
}
}
impl Generator<Scalar> for SuiteEd25519 {
fn new_key<S: crate::cipher::Stream>(
&self,
stream: &mut S,
) -> Result<Option<Scalar>, KeyError> {
self.curve.new_key(stream)
}
}
impl Display for SuiteEd25519 {
fn fmt(&self, f: &mut Formatter<'_>) -> core::fmt::Result {
write!(f, "{}", self.curve)
}
}
impl Group for SuiteEd25519 {
type POINT = Point;
fn scalar(&self) -> Scalar {
self.curve.scalar()
}
fn scalar_len(&self) -> usize {
self.curve.scalar_len()
}
fn point(&self) -> Point {
self.curve.point()
}
fn point_len(&self) -> usize {
self.curve.point_len()
}
fn is_prime_order(&self) -> Option<bool> {
self.curve.is_prime_order()
}
}
impl Random for SuiteEd25519 {
fn random_stream(&self) -> Box<dyn Stream> {
Box::<util::random::random_stream::RandStream>::default()
}
}
impl XOFFactory for SuiteEd25519 {
fn xof(&self, key: Option<&[u8]>) -> Box<dyn crate::XOF> {
Box::new(xof::blake3::Xof::new(key))
}
}
impl HashFactory for SuiteEd25519 {
type T = Sha256;
}
impl Suite for SuiteEd25519 {}
impl dss::Suite for SuiteEd25519 {}
impl KeySuite for SuiteEd25519 {}