use miden_core::field::{Algebra, PrimeCharacteristicRing};
use crate::{
logup::{Challenges, LookupMessage},
relations::BusId,
};
pub const POSEIDON2_IN_TAG_RATE0: u8 = 0;
pub const POSEIDON2_IN_TAG_RATE1: u8 = 1;
pub const POSEIDON2_IN_TAG_CAP: u8 = 2;
#[derive(Debug, Clone)]
pub struct Poseidon2InMsg<E> {
pub perm_seq_id: E,
pub tag: E,
pub c: [E; 4],
}
impl<E> Poseidon2InMsg<E>
where
E: PrimeCharacteristicRing,
{
pub fn rate0(perm_seq_id: E, chunk: [E; 4]) -> Self {
Self {
perm_seq_id,
tag: E::from_u8(POSEIDON2_IN_TAG_RATE0),
c: chunk,
}
}
pub fn rate1(perm_seq_id: E, chunk: [E; 4]) -> Self {
Self {
perm_seq_id,
tag: E::from_u8(POSEIDON2_IN_TAG_RATE1),
c: chunk,
}
}
pub fn cap(perm_seq_id: E, chunk: [E; 4]) -> Self {
Self {
perm_seq_id,
tag: E::from_u8(POSEIDON2_IN_TAG_CAP),
c: chunk,
}
}
}
impl<E, EF> LookupMessage<E, EF> for Poseidon2InMsg<E>
where
E: Algebra<E>,
EF: Algebra<E>,
{
fn encode(&self, challenges: &Challenges<EF>) -> EF {
let [c0, c1, c2, c3] = self.c.clone();
challenges.encode(
BusId::Poseidon2In as usize,
[self.perm_seq_id.clone(), self.tag.clone(), c0, c1, c2, c3],
)
}
}
#[derive(Debug, Clone)]
pub struct Poseidon2OutMsg<E> {
pub perm_seq_id: E,
pub digest: [E; 4],
}
impl<E, EF> LookupMessage<E, EF> for Poseidon2OutMsg<E>
where
E: Algebra<E>,
EF: Algebra<E>,
{
fn encode(&self, challenges: &Challenges<EF>) -> EF {
let [d0, d1, d2, d3] = self.digest.clone();
challenges.encode(BusId::Poseidon2Out as usize, [self.perm_seq_id.clone(), d0, d1, d2, d3])
}
}