use crate::{ bits::{boolean::Boolean, uint8::UInt8}, Vec, }; use algebra::Field; use r1cs_core::{ConstraintSystem, SynthesisError}; pub mod boolean; pub mod uint64; pub mod uint32; pub mod uint8; pub trait ToBitsGadget { fn to_bits>( &self, cs: CS, ) -> Result, SynthesisError>; /// Additionally checks if the produced list of booleans is 'valid'. fn to_bits_strict>( &self, cs: CS, ) -> Result, SynthesisError>; } impl ToBitsGadget for Boolean { fn to_bits>( &self, _: CS, ) -> Result, SynthesisError> { Ok(vec![self.clone()]) } fn to_bits_strict>( &self, _: CS, ) -> Result, SynthesisError> { Ok(vec![self.clone()]) } } impl ToBitsGadget for [Boolean] { fn to_bits>( &self, _cs: CS, ) -> Result, SynthesisError> { Ok(self.to_vec()) } fn to_bits_strict>( &self, _cs: CS, ) -> Result, SynthesisError> { Ok(self.to_vec()) } } impl ToBitsGadget for Vec { fn to_bits>( &self, _cs: CS, ) -> Result, SynthesisError> { Ok(self.clone()) } fn to_bits_strict>( &self, _cs: CS, ) -> Result, SynthesisError> { Ok(self.clone()) } } impl ToBitsGadget for [UInt8] { fn to_bits>( &self, _cs: CS, ) -> Result, SynthesisError> { let mut result = Vec::with_capacity(&self.len() * 8); for byte in self { result.extend_from_slice(&byte.into_bits_le()); } Ok(result) } fn to_bits_strict>( &self, cs: CS, ) -> Result, SynthesisError> { self.to_bits(cs) } } pub trait ToBytesGadget { fn to_bytes>( &self, cs: CS, ) -> Result, SynthesisError>; /// Additionally checks if the produced list of booleans is 'valid'. fn to_bytes_strict>( &self, cs: CS, ) -> Result, SynthesisError>; } impl ToBytesGadget for [UInt8] { fn to_bytes>( &self, _cs: CS, ) -> Result, SynthesisError> { Ok(self.to_vec()) } fn to_bytes_strict>( &self, cs: CS, ) -> Result, SynthesisError> { self.to_bytes(cs) } } impl<'a, ConstraintF: Field, T: 'a + ToBytesGadget> ToBytesGadget for &'a T { fn to_bytes>( &self, cs: CS, ) -> Result, SynthesisError> { (*self).to_bytes(cs) } fn to_bytes_strict>( &self, cs: CS, ) -> Result, SynthesisError> { self.to_bytes(cs) } } impl<'a, ConstraintF: Field> ToBytesGadget for &'a [UInt8] { fn to_bytes>( &self, _cs: CS, ) -> Result, SynthesisError> { Ok(self.to_vec()) } fn to_bytes_strict>( &self, cs: CS, ) -> Result, SynthesisError> { self.to_bytes(cs) } }