mirror of
https://github.com/serai-dex/serai.git
synced 2025-12-08 12:19:24 +00:00
Cleanup which makes transcript optional, only required for multisig
This commit is contained in:
@@ -120,7 +120,9 @@ impl Field for Scalar {
|
||||
fn one() -> Self { Self(DScalar::one()) }
|
||||
fn square(&self) -> Self { *self * self }
|
||||
fn double(&self) -> Self { *self + self }
|
||||
fn invert(&self) -> CtOption<Self> { CtOption::new(Self(self.0.invert()), Choice::from(1 as u8)) }
|
||||
fn invert(&self) -> CtOption<Self> {
|
||||
CtOption::new(Self(self.0.invert()), Choice::from(1 as u8))
|
||||
}
|
||||
fn sqrt(&self) -> CtOption<Self> { unimplemented!() }
|
||||
fn is_zero(&self) -> Choice { Choice::from(if self.0 == DScalar::zero() { 1 } else { 0 }) }
|
||||
fn cube(&self) -> Self { *self * self * self }
|
||||
@@ -137,7 +139,10 @@ impl PrimeField for Scalar {
|
||||
const CAPACITY: u32 = 252;
|
||||
fn from_repr(bytes: [u8; 32]) -> CtOption<Self> {
|
||||
let scalar = DScalar::from_canonical_bytes(bytes).map(|x| Scalar(x));
|
||||
CtOption::new(scalar.unwrap_or(Scalar::zero()), Choice::from(if scalar.is_some() { 1 } else { 0 }))
|
||||
CtOption::new(
|
||||
scalar.unwrap_or(Scalar::zero()),
|
||||
Choice::from(if scalar.is_some() { 1 } else { 0 })
|
||||
)
|
||||
}
|
||||
fn to_repr(&self) -> [u8; 32] { self.0.to_bytes() }
|
||||
|
||||
@@ -285,7 +290,9 @@ impl EdwardsPoint {
|
||||
}
|
||||
|
||||
pub struct EdwardsBasepointTable(pub DTable);
|
||||
pub const ED25519_BASEPOINT_TABLE: EdwardsBasepointTable = EdwardsBasepointTable(constants::ED25519_BASEPOINT_TABLE);
|
||||
pub const ED25519_BASEPOINT_TABLE: EdwardsBasepointTable = EdwardsBasepointTable(
|
||||
constants::ED25519_BASEPOINT_TABLE
|
||||
);
|
||||
|
||||
impl Deref for EdwardsBasepointTable {
|
||||
type Target = DTable;
|
||||
|
||||
@@ -54,8 +54,8 @@ pub trait Curve: Clone + Copy + PartialEq + Eq + Debug {
|
||||
fn generator_table() -> Self::T;
|
||||
|
||||
/// Multiexponentation function, presumably Straus or Pippenger
|
||||
/// This library does provide an implementation of Straus which should increase key generation
|
||||
/// performance by around 4x, also named multiexp_vartime, with the same API. However, if a more
|
||||
/// This library does forward an implementation of Straus which should increase key generation
|
||||
/// performance by around 4x, also named multiexp_vartime, with a similar API. However, if a more
|
||||
/// performant implementation is available, that should be used instead
|
||||
// This could also be written as -> Option<C::G> with None for not implemented
|
||||
fn multiexp_vartime(scalars: &[Self::F], points: &[Self::G]) -> Self::G;
|
||||
|
||||
@@ -16,7 +16,11 @@ pub trait Transcript {
|
||||
fn new(label: &'static [u8]) -> Self;
|
||||
fn append_message(&mut self, label: &'static [u8], message: &[u8]);
|
||||
fn challenge(&mut self, label: &'static [u8], len: usize) -> Vec<u8>;
|
||||
fn seeded_rng(&self, label: &'static [u8], additional_entropy: Option<[u8; 32]>) -> Self::SeededRng;
|
||||
fn seeded_rng(
|
||||
&self,
|
||||
label: &'static [u8],
|
||||
additional_entropy: Option<[u8; 32]>
|
||||
) -> Self::SeededRng;
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug)]
|
||||
@@ -40,15 +44,28 @@ impl<D: Digest> Transcript for DigestTranscript<D> {
|
||||
self.0.extend(label);
|
||||
|
||||
let mut challenge = Vec::with_capacity(len);
|
||||
challenge.extend(&D::new().chain_update(&self.0).chain_update(&0u64.to_le_bytes()).finalize());
|
||||
challenge.extend(
|
||||
&D::new()
|
||||
.chain_update(&self.0)
|
||||
.chain_update(&0u64.to_le_bytes()).finalize()
|
||||
);
|
||||
for i in 0 .. (len / challenge.len()) {
|
||||
challenge.extend(&D::new().chain_update(&self.0).chain_update(&u64::try_from(i).unwrap().to_le_bytes()).finalize());
|
||||
challenge.extend(
|
||||
&D::new()
|
||||
.chain_update(&self.0)
|
||||
.chain_update(&u64::try_from(i).unwrap().to_le_bytes())
|
||||
.finalize()
|
||||
);
|
||||
}
|
||||
challenge.truncate(len);
|
||||
challenge
|
||||
}
|
||||
|
||||
fn seeded_rng(&self, label: &'static [u8], additional_entropy: Option<[u8; 32]>) -> Self::SeededRng {
|
||||
fn seeded_rng(
|
||||
&self,
|
||||
label: &'static [u8],
|
||||
additional_entropy: Option<[u8; 32]>
|
||||
) -> Self::SeededRng {
|
||||
let mut transcript = DigestTranscript::<D>(self.0.clone(), PhantomData);
|
||||
if additional_entropy.is_some() {
|
||||
transcript.append_message(b"additional_entropy", &additional_entropy.unwrap());
|
||||
|
||||
Reference in New Issue
Block a user