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}