You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

75 lines
1.7 KiB

use crate::group::{CompressedGroup, Fr};
use super::scalar::Scalar;
// use ark_r1cs_std::prelude::*;
use ark_sponge::{
constraints::CryptographicSpongeVar,
poseidon::{PoseidonParameters, PoseidonSponge},
CryptographicSponge,
};
#[derive(Clone)]
/// TODO
pub struct PoseidonTranscript {
sponge: PoseidonSponge<Fr>,
params: PoseidonParameters<Fr>,
}
impl PoseidonTranscript {
/// create a new transcript
pub fn new(params: &PoseidonParameters<Fr>) -> Self {
let sponge = PoseidonSponge::new(params);
PoseidonTranscript {
sponge: sponge,
params: params.clone(),
}
}
pub fn new_from_state(&mut self, challenge: &Scalar) {
self.sponge = PoseidonSponge::new(&self.params);
self.append_scalar(&challenge);
}
pub fn append_u64(&mut self, x: u64) {
self.sponge.absorb(&x);
}
pub fn append_bytes(&mut self, x: &Vec<u8>) {
self.sponge.absorb(x);
}
pub fn append_scalar(&mut self, scalar: &Scalar) {
self.sponge.absorb(&scalar);
}
pub fn append_point(&mut self, point: &CompressedGroup) {
self.sponge.absorb(&point.0);
}
pub fn append_scalar_vector(&mut self, scalars: &Vec<Scalar>) {
for scalar in scalars.iter() {
self.append_scalar(&scalar);
}
}
pub fn challenge_scalar(&mut self) -> Scalar {
let scalar = self.sponge.squeeze_field_elements(1).remove(0);
scalar
}
pub fn challenge_vector(&mut self, len: usize) -> Vec<Scalar> {
let challenges = self.sponge.squeeze_field_elements(len);
challenges
}
}
pub trait AppendToPoseidon {
fn append_to_poseidon(&self, transcript: &mut PoseidonTranscript);
}
impl AppendToPoseidon for CompressedGroup {
fn append_to_poseidon(&self, transcript: &mut PoseidonTranscript) {
transcript.append_point(self);
}
}