use super::ser::{EpeeRead, EpeeWrite, Reader, write_vec};
use crate::crypto::{Point, Scalar};
use crate::error::Result;
#[derive(Clone, Debug)]
pub struct ClsagSig {
pub c: Scalar,
pub rg: Vec<Scalar>,
pub rx: Vec<Scalar>,
pub k1: Point,
pub k2: Point,
}
impl EpeeWrite for ClsagSig {
fn write_epee(&self, out: &mut Vec<u8>) {
self.c.write_epee(out);
write_vec(&self.rg, out);
write_vec(&self.rx, out);
self.k1.write_epee(out);
self.k2.write_epee(out);
}
}
impl EpeeRead for ClsagSig {
fn read_epee(r: &mut Reader<'_>) -> Result<Self> {
Ok(ClsagSig {
c: Scalar::read_epee(r)?,
rg: r.read_vec()?,
rx: r.read_vec()?,
k1: Point::read_epee(r)?,
k2: Point::read_epee(r)?,
})
}
}
#[derive(Clone, Debug)]
pub struct ZcSig {
pub pseudo_out_amount_commitment: Point,
pub pseudo_out_blinded_asset_id: Point,
pub ggx: ClsagSig,
}
impl EpeeWrite for ZcSig {
fn write_epee(&self, out: &mut Vec<u8>) {
self.pseudo_out_amount_commitment.write_epee(out);
self.pseudo_out_blinded_asset_id.write_epee(out);
self.ggx.write_epee(out);
}
}
impl EpeeRead for ZcSig {
fn read_epee(r: &mut Reader<'_>) -> Result<Self> {
Ok(ZcSig {
pseudo_out_amount_commitment: Point::read_epee(r)?,
pseudo_out_blinded_asset_id: Point::read_epee(r)?,
ggx: ClsagSig::read_epee(r)?,
})
}
}
#[derive(Clone, Debug)]
pub struct BppSignature {
pub lv: Vec<Point>,
pub rv: Vec<Point>,
pub a0: Point,
pub a: Point,
pub b: Point,
pub r: Scalar,
pub s: Scalar,
pub delta: Scalar,
}
impl EpeeWrite for BppSignature {
fn write_epee(&self, out: &mut Vec<u8>) {
write_vec(&self.lv, out);
write_vec(&self.rv, out);
self.a0.write_epee(out);
self.a.write_epee(out);
self.b.write_epee(out);
self.r.write_epee(out);
self.s.write_epee(out);
self.delta.write_epee(out);
}
}
impl EpeeRead for BppSignature {
fn read_epee(r: &mut Reader<'_>) -> Result<Self> {
Ok(BppSignature {
lv: r.read_vec()?,
rv: r.read_vec()?,
a0: Point::read_epee(r)?,
a: Point::read_epee(r)?,
b: Point::read_epee(r)?,
r: Scalar::read_epee(r)?,
s: Scalar::read_epee(r)?,
delta: Scalar::read_epee(r)?,
})
}
}
#[derive(Clone, Debug)]
pub struct UgAggProof {
pub amount_commitments_for_rp_agg: Vec<Point>,
pub y0s: Vec<Scalar>,
pub y1s: Vec<Scalar>,
pub c: Scalar,
}
impl EpeeWrite for UgAggProof {
fn write_epee(&self, out: &mut Vec<u8>) {
write_vec(&self.amount_commitments_for_rp_agg, out);
write_vec(&self.y0s, out);
write_vec(&self.y1s, out);
self.c.write_epee(out);
}
}
impl EpeeRead for UgAggProof {
fn read_epee(r: &mut Reader<'_>) -> Result<Self> {
Ok(UgAggProof {
amount_commitments_for_rp_agg: r.read_vec()?,
y0s: r.read_vec()?,
y1s: r.read_vec()?,
c: Scalar::read_epee(r)?,
})
}
}
#[derive(Clone, Debug)]
pub struct ZcOutsRangeProof {
pub bpp: BppSignature,
pub aggregation_proof: UgAggProof,
}
impl EpeeWrite for ZcOutsRangeProof {
fn write_epee(&self, out: &mut Vec<u8>) {
self.bpp.write_epee(out);
self.aggregation_proof.write_epee(out);
}
}
impl EpeeRead for ZcOutsRangeProof {
fn read_epee(r: &mut Reader<'_>) -> Result<Self> {
Ok(ZcOutsRangeProof {
bpp: BppSignature::read_epee(r)?,
aggregation_proof: UgAggProof::read_epee(r)?,
})
}
}
#[derive(Clone, Debug)]
pub struct BgeProof {
pub a: Point,
pub b: Point,
pub pk: Vec<Point>,
pub f: Vec<Scalar>,
pub y: Scalar,
pub z: Scalar,
}
impl EpeeWrite for BgeProof {
fn write_epee(&self, out: &mut Vec<u8>) {
self.a.write_epee(out);
self.b.write_epee(out);
write_vec(&self.pk, out);
write_vec(&self.f, out);
self.y.write_epee(out);
self.z.write_epee(out);
}
}
impl EpeeRead for BgeProof {
fn read_epee(r: &mut Reader<'_>) -> Result<Self> {
Ok(BgeProof {
a: Point::read_epee(r)?,
b: Point::read_epee(r)?,
pk: r.read_vec()?,
f: r.read_vec()?,
y: Scalar::read_epee(r)?,
z: Scalar::read_epee(r)?,
})
}
}
#[derive(Clone, Debug)]
pub struct ZcAssetSurjectionProof {
pub bge_proofs: Vec<BgeProof>,
}
impl EpeeWrite for ZcAssetSurjectionProof {
fn write_epee(&self, out: &mut Vec<u8>) {
write_vec(&self.bge_proofs, out);
}
}
impl EpeeRead for ZcAssetSurjectionProof {
fn read_epee(r: &mut Reader<'_>) -> Result<Self> {
Ok(ZcAssetSurjectionProof {
bge_proofs: r.read_vec()?,
})
}
}
#[derive(Clone, Debug)]
pub struct GenericDoubleSchnorrSig {
pub c: Scalar,
pub y0: Scalar,
pub y1: Scalar,
}
impl EpeeWrite for GenericDoubleSchnorrSig {
fn write_epee(&self, out: &mut Vec<u8>) {
self.c.write_epee(out);
self.y0.write_epee(out);
self.y1.write_epee(out);
}
}
impl EpeeRead for GenericDoubleSchnorrSig {
fn read_epee(r: &mut Reader<'_>) -> Result<Self> {
Ok(GenericDoubleSchnorrSig {
c: Scalar::read_epee(r)?,
y0: Scalar::read_epee(r)?,
y1: Scalar::read_epee(r)?,
})
}
}
#[derive(Clone, Debug)]
pub struct ZcBalanceProof {
pub dss: GenericDoubleSchnorrSig,
}
impl EpeeWrite for ZcBalanceProof {
fn write_epee(&self, out: &mut Vec<u8>) {
self.dss.write_epee(out);
}
}
impl EpeeRead for ZcBalanceProof {
fn read_epee(r: &mut Reader<'_>) -> Result<Self> {
Ok(ZcBalanceProof {
dss: GenericDoubleSchnorrSig::read_epee(r)?,
})
}
}