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;
 4
 5// use ark_r1cs_std::prelude::*;
 6use ark_sponge::{
 7  poseidon::{PoseidonParameters, PoseidonSponge},
 8  CryptographicSponge,
 9};
10
11#[derive(Clone)]
12/// TODO
13pub struct PoseidonTranscript {
14  sponge: PoseidonSponge<Fr>,
15  params: PoseidonParameters<Fr>,
16}
17
18impl PoseidonTranscript {
19  /// create a new transcript
20  pub fn new(params: &PoseidonParameters<Fr>) -> Self {
21    let sponge = PoseidonSponge::new(params);
22    PoseidonTranscript {
23      sponge,
24      params: params.clone(),
25    }
26  }
27
28  pub fn new_from_state(&mut self, challenge: &Scalar) {
29    self.sponge = PoseidonSponge::new(&self.params);
30    self.append_scalar(challenge);
31  }
32
33  pub fn append_u64(&mut self, x: u64) {
34    self.sponge.absorb(&x);
35  }
36
37  pub fn append_bytes(&mut self, x: &Vec<u8>) {
38    self.sponge.absorb(x);
39  }
40
41  pub fn append_scalar(&mut self, scalar: &Scalar) {
42    self.sponge.absorb(&scalar);
43  }
44
45  pub fn append_point(&mut self, point: &CompressedGroup) {
46    self.sponge.absorb(&point.0);
47  }
48
49  pub fn append_scalar_vector(&mut self, scalars: &[Scalar]) {
50    for scalar in scalars.iter() {
51      self.append_scalar(scalar);
52    }
53  }
54
55  pub fn challenge_scalar(&mut self) -> Scalar {
56    self.sponge.squeeze_field_elements(1).remove(0)
57  }
58
59  pub fn challenge_vector(&mut self, len: usize) -> Vec<Scalar> {
60    self.sponge.squeeze_field_elements(len)
61  }
62}
63
64pub trait AppendToPoseidon {
65  fn append_to_poseidon(&self, transcript: &mut PoseidonTranscript);
66}
67
68impl AppendToPoseidon for CompressedGroup {
69  fn append_to_poseidon(&self, transcript: &mut PoseidonTranscript) {
70    transcript.append_point(self);
71  }
72}