From e4a615aa76a03707e2aca7371f47960475412ac1 Mon Sep 17 00:00:00 2001 From: Boog900 <54e72d8a-345f-4599-bd90-c6b9bc7d0ec5@aleeas.com> Date: Fri, 23 Jun 2023 23:29:43 +0100 Subject: [PATCH] update MLSAG, ss2_elements will always be 2 --- coins/monero/generators/src/lib.rs | 1 + coins/monero/src/ringct/borromean.rs | 6 +++--- coins/monero/src/ringct/mlsag/mod.rs | 16 +++++++--------- coins/monero/src/ringct/mod.rs | 17 +++++------------ coins/monero/src/serialize.rs | 6 +++--- 5 files changed, 19 insertions(+), 27 deletions(-) diff --git a/coins/monero/generators/src/lib.rs b/coins/monero/generators/src/lib.rs index 2e297222..7bfa0efc 100644 --- a/coins/monero/generators/src/lib.rs +++ b/coins/monero/generators/src/lib.rs @@ -11,6 +11,7 @@ use sha3::{Digest, Keccak256}; use curve25519_dalek::edwards::{EdwardsPoint as DalekPoint, CompressedEdwardsY}; use curve25519_dalek::scalar::Scalar; +use std_shims::vec::Vec; use group::{Group, GroupEncoding}; use dalek_ff_group::EdwardsPoint; diff --git a/coins/monero/src/ringct/borromean.rs b/coins/monero/src/ringct/borromean.rs index 51352070..a3da7f65 100644 --- a/coins/monero/src/ringct/borromean.rs +++ b/coins/monero/src/ringct/borromean.rs @@ -29,8 +29,8 @@ pub struct BorroSig { impl BorroSig { pub fn read(r: &mut R) -> io::Result { Ok(BorroSig { - s0: read_64_array(read_bytes, r)?, - s1: read_64_array(read_bytes, r)?, + s0: read_array(read_bytes, r)?, + s1: read_array(read_bytes, r)?, ee: read_bytes(r)?, }) } @@ -53,7 +53,7 @@ pub struct RangeSig { impl RangeSig { pub fn read(r: &mut R) -> io::Result { - Ok(RangeSig { asig: BorroSig::read(r)?, Ci: read_64_array(read_point, r)? }) + Ok(RangeSig { asig: BorroSig::read(r)?, Ci: read_array(read_point, r)? }) } pub fn write(&self, w: &mut W) -> io::Result<()> { self.asig.write(w)?; diff --git a/coins/monero/src/ringct/mlsag/mod.rs b/coins/monero/src/ringct/mlsag/mod.rs index 6256dec1..d7c2f1de 100644 --- a/coins/monero/src/ringct/mlsag/mod.rs +++ b/coins/monero/src/ringct/mlsag/mod.rs @@ -9,14 +9,14 @@ use curve25519_dalek::edwards::EdwardsPoint; use crate::{hash_to_scalar, serialize::*}; use crate::ringct::hash_to_point; -/// MLSAG signature, as used in Monero. +/// MgSig part of MLSAG, as used in Monero. #[derive(Clone, PartialEq, Eq, Debug)] -pub struct Mlsag { - pub ss: Vec>, +pub struct MgSig { + pub ss: Vec<[Scalar; 2]>, pub cc: Scalar, } -impl Mlsag { +impl MgSig { pub fn write(&self, w: &mut W) -> io::Result<()> { for ss in self.ss.iter() { write_raw_vec(write_scalar, ss, w)?; @@ -24,11 +24,9 @@ impl Mlsag { write_scalar(&self.cc, w) } - pub fn read(mixins: usize, ss2_elements: usize, r: &mut R) -> io::Result { - Ok(Mlsag { - ss: (0 .. mixins) - .map(|_| read_raw_vec(read_scalar, ss2_elements, r)) - .collect::>()?, + pub fn read(mixins: usize, r: &mut R) -> io::Result { + Ok(MgSig { + ss: (0 .. mixins).map(|_| read_array(read_scalar, r)).collect::>()?, cc: read_scalar(r)?, }) } diff --git a/coins/monero/src/ringct/mod.rs b/coins/monero/src/ringct/mod.rs index 0ef6dc4c..cf57692f 100644 --- a/coins/monero/src/ringct/mod.rs +++ b/coins/monero/src/ringct/mod.rs @@ -20,7 +20,7 @@ pub mod bulletproofs; use crate::{ Protocol, serialize::*, - ringct::{clsag::Clsag, mlsag::Mlsag, bulletproofs::Bulletproofs, borromean::RangeSig}, + ringct::{clsag::Clsag, mlsag::MgSig, bulletproofs::Bulletproofs, borromean::RangeSig}, }; /// Generate a key image for a given key. Defined as `x * hash_to_point(xG)`. @@ -197,17 +197,10 @@ impl RctPrunable { ) -> io::Result { Ok(match rct_type { 0 => RctPrunable::Null, - 1 => RctPrunable::Borromean { + 1 | 2 => RctPrunable::Borromean { range_sigs: read_raw_vec(RangeSig::read, outputs, r)?, - mlsags: vec![Mlsag::read(decoys[0], 1 + decoys.len(), r)?], - simple: false, - }, - 2 => RctPrunable::Borromean { - range_sigs: read_raw_vec(RangeSig::read, outputs, r)?, - mlsags: (0 .. decoys.len()) - .map(|o| Mlsag::read(decoys[o], 2, r)) - .collect::>()?, - simple: true, + mlsags: decoys.iter().map(|d| MgSig::read(*d, r)).collect::>()?, + simple: rct_type == 2, }, 3 | 4 => RctPrunable::BulletProof { bulletproofs: read_raw_vec( @@ -219,7 +212,7 @@ impl RctPrunable { }, r, )?, - mlsags: decoys.iter().map(|d| Mlsag::read(*d, 2, r)).collect::>()?, + mlsags: decoys.iter().map(|d| MgSig::read(*d, r)).collect::>()?, pseudo_outs: read_raw_vec(read_point, decoys.len(), r)?, v2: rct_type == 4, }, diff --git a/coins/monero/src/serialize.rs b/coins/monero/src/serialize.rs index e1b7528d..11e8175a 100644 --- a/coins/monero/src/serialize.rs +++ b/coins/monero/src/serialize.rs @@ -145,9 +145,9 @@ pub(crate) fn read_vec io::Result>( read_raw_vec(f, read_varint(r)?.try_into().unwrap(), r) } -pub(crate) fn read_64_array io::Result>( +pub(crate) fn read_array io::Result>( f: F, r: &mut R, -) -> io::Result<[T; 64]> { - (0 .. 64).map(|_| f(r)).collect::>>().map(|vec| vec.try_into().unwrap()) +) -> io::Result<[T; N]> { + (0 .. N).map(|_| f(r)).collect::>>().map(|vec| vec.try_into().unwrap()) }