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