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}