1use alloc::vec::Vec;
4use rand_core::{CryptoRng, RngCore};
5
6pub trait Group {
9 type Scalar;
11
12 type Element;
14
15 type TranscriptHash;
17
18 fn name() -> &'static str;
20
21 fn const_m() -> Self::Element;
23
24 fn const_n() -> Self::Element;
26
27 fn const_s() -> Self::Element;
29
30 fn hash_to_scalar(s: &[u8]) -> Self::Scalar;
32
33 fn random_scalar<T>(cspring: &mut T) -> Self::Scalar
35 where
36 T: RngCore + CryptoRng;
37
38 fn scalar_neg(s: &Self::Scalar) -> Self::Scalar;
40
41 fn element_to_bytes(e: &Self::Element) -> Vec<u8>;
43
44 fn bytes_to_element(b: &[u8]) -> Option<Self::Element>;
46
47 fn element_length() -> usize;
49
50 fn basepoint_mult(s: &Self::Scalar) -> Self::Element;
52
53 fn scalarmult(e: &Self::Element, s: &Self::Scalar) -> Self::Element;
55
56 fn add(a: &Self::Element, b: &Self::Element) -> Self::Element;
58}