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}