arnaucube
arnaucube/testudoPublic Self-hosted repository
testudo/src/poseidon_transcript.rs
src/poseidon_transcript.rsRaw
 1use crate::group::{CompressedGroup, Fr};
 2
 3use super::scalar::Scalar;
 4use ark_bls12_377::Bls12_377 as I;
 5use ark_poly_commit::multilinear_pc::data_structures::Commitment;
 6use ark_serialize::CanonicalSerialize;
 7// use ark_r1cs_std::prelude::*;
 8use ark_sponge::{
 9    poseidon::{PoseidonParameters, PoseidonSponge},
10    CryptographicSponge,
11};
12
13#[derive(Clone)]
14/// TODO
15pub struct PoseidonTranscript {
16    sponge: PoseidonSponge<Fr>,
17    params: PoseidonParameters<Fr>,
18}
19
20impl PoseidonTranscript {
21    /// create a new transcript
22    pub fn new(params: &PoseidonParameters<Fr>) -> Self {
23        let sponge = PoseidonSponge::new(params);
24        PoseidonTranscript {
25            sponge,
26            params: params.clone(),
27        }
28    }
29
30    pub fn new_from_state(&mut self, challenge: &Scalar) {
31        self.sponge = PoseidonSponge::new(&self.params);
32        self.append_scalar(challenge);
33    }
34
35    pub fn append_u64(&mut self, x: u64) {
36        self.sponge.absorb(&x);
37    }
38
39    pub fn append_bytes(&mut self, x: &Vec<u8>) {
40        self.sponge.absorb(x);
41    }
42
43    pub fn append_scalar(&mut self, scalar: &Scalar) {
44        self.sponge.absorb(&scalar);
45    }
46
47    pub fn append_point(&mut self, point: &CompressedGroup) {
48        self.sponge.absorb(&point.0);
49    }
50
51    pub fn append_scalar_vector(&mut self, scalars: &[Scalar]) {
52        for scalar in scalars.iter() {
53            self.append_scalar(scalar);
54        }
55    }
56
57    pub fn challenge_scalar(&mut self) -> Scalar {
58        self.sponge.squeeze_field_elements(1).remove(0)
59    }
60
61    pub fn challenge_vector(&mut self, len: usize) -> Vec<Scalar> {
62        self.sponge.squeeze_field_elements(len)
63    }
64}
65
66pub trait AppendToPoseidon {
67    fn append_to_poseidon(&self, transcript: &mut PoseidonTranscript);
68}
69
70impl AppendToPoseidon for CompressedGroup {
71    fn append_to_poseidon(&self, transcript: &mut PoseidonTranscript) {
72        transcript.append_point(self);
73    }
74}
75
76impl AppendToPoseidon for Commitment<I> {
77    fn append_to_poseidon(&self, transcript: &mut PoseidonTranscript) {
78        let mut bytes = Vec::new();
79        self.serialize(&mut bytes).unwrap();
80        transcript.append_bytes(&bytes);
81    }
82}