use midnight_proofs::{
circuit::{Layouter, Value},
plonk::Error,
};
use crate::{
types::{AssignedByte, AssignedVector},
CircuitField,
};
pub trait Base64Instructions<F: CircuitField> {
fn decode_base64url(
&self,
layouter: &mut impl Layouter<F>,
b64url_input: &[AssignedByte<F>],
padded: bool,
) -> Result<Vec<AssignedByte<F>>, Error>;
fn decode_base64(
&self,
layouter: &mut impl Layouter<F>,
b64_input: &[AssignedByte<F>],
padded: bool,
) -> Result<Vec<AssignedByte<F>>, Error>;
}
#[derive(Debug, Clone)]
pub struct Base64Vec<F: CircuitField, const M: usize, const A: usize>(
pub(crate) AssignedVector<F, AssignedByte<F>, M, A>,
);
impl<F: CircuitField, const M: usize, const A: usize> From<Base64Vec<F, M, A>>
for AssignedVector<F, AssignedByte<F>, M, A>
{
fn from(value: Base64Vec<F, M, A>) -> Self {
value.0
}
}
pub trait Base64VarInstructions<F: CircuitField, const M: usize, const A: usize>:
Base64Instructions<F>
{
fn assign_var_base64(
&self,
layouter: &mut impl Layouter<F>,
value: Value<Vec<u8>>,
) -> Result<Base64Vec<F, M, A>, Error>;
fn base64_from_vec(
&self,
layouter: &mut impl Layouter<F>,
vec: &AssignedVector<F, AssignedByte<F>, M, A>,
) -> Result<Base64Vec<F, M, A>, Error>;
fn var_decode_base64url<const M_OUT: usize, const A_OUT: usize>(
&self,
layouter: &mut impl Layouter<F>,
b64url_input: &Base64Vec<F, M, A>,
) -> Result<AssignedVector<F, AssignedByte<F>, M_OUT, A_OUT>, Error>;
fn var_decode_base64<const M_OUT: usize, const A_OUT: usize>(
&self,
layouter: &mut impl Layouter<F>,
b64_input: &Base64Vec<F, M, A>,
) -> Result<AssignedVector<F, AssignedByte<F>, M_OUT, A_OUT>, Error>;
}