mirror of
https://github.com/arnaucube/ark-r1cs-std.git
synced 2026-01-23 12:13:48 +01:00
Change default to_bits and to_bytes functions to the safe versions
This commit is contained in:
@@ -802,6 +802,7 @@ impl<ConstraintF: Field> ConditionalEqGadget<ConstraintF> for Boolean {
|
||||
}
|
||||
|
||||
impl<ConstraintF: Field> ToBytesGadget<ConstraintF> for Boolean {
|
||||
/// Outputs `1u8` if `self` is true, and `0u8` otherwise.
|
||||
fn to_bytes<CS: ConstraintSystem<ConstraintF>>(
|
||||
&self,
|
||||
_cs: CS,
|
||||
@@ -813,14 +814,6 @@ impl<ConstraintF: Field> ToBytesGadget<ConstraintF> for Boolean {
|
||||
let byte = UInt8 { bits, value };
|
||||
Ok(vec![byte])
|
||||
}
|
||||
|
||||
/// Additionally checks if the produced list of booleans is 'valid'.
|
||||
fn to_bytes_strict<CS: ConstraintSystem<ConstraintF>>(
|
||||
&self,
|
||||
cs: CS,
|
||||
) -> Result<Vec<UInt8>, SynthesisError> {
|
||||
self.to_bytes(cs)
|
||||
}
|
||||
}
|
||||
|
||||
impl<ConstraintF: PrimeField> CondSelectGadget<ConstraintF> for Boolean {
|
||||
|
||||
@@ -11,16 +11,24 @@ pub mod uint64;
|
||||
pub mod uint8;
|
||||
|
||||
pub trait ToBitsGadget<ConstraintF: Field> {
|
||||
/// Outputs the canonical bit-wise representation of `self`.
|
||||
///
|
||||
/// This is the correct default for 99% of use cases.
|
||||
fn to_bits<CS: ConstraintSystem<ConstraintF>>(
|
||||
&self,
|
||||
cs: CS,
|
||||
) -> Result<Vec<Boolean>, SynthesisError>;
|
||||
|
||||
/// Additionally checks if the produced list of booleans is 'valid'.
|
||||
fn to_bits_strict<CS: ConstraintSystem<ConstraintF>>(
|
||||
/// Outputs a possibly non-unique bit-wise representation of `self`.
|
||||
///
|
||||
/// If you're not absolutely certain that your usecase can get away with a
|
||||
/// non-canonical representation, please use `self.to_bits(cs)` instead.
|
||||
fn to_non_unique_bits<CS: ConstraintSystem<ConstraintF>>(
|
||||
&self,
|
||||
cs: CS,
|
||||
) -> Result<Vec<Boolean>, SynthesisError>;
|
||||
) -> Result<Vec<Boolean>, SynthesisError> {
|
||||
self.to_bits(cs)
|
||||
}
|
||||
}
|
||||
|
||||
impl<ConstraintF: Field> ToBitsGadget<ConstraintF> for Boolean {
|
||||
@@ -30,13 +38,6 @@ impl<ConstraintF: Field> ToBitsGadget<ConstraintF> for Boolean {
|
||||
) -> Result<Vec<Boolean>, SynthesisError> {
|
||||
Ok(vec![self.clone()])
|
||||
}
|
||||
|
||||
fn to_bits_strict<CS: ConstraintSystem<ConstraintF>>(
|
||||
&self,
|
||||
_: CS,
|
||||
) -> Result<Vec<Boolean>, SynthesisError> {
|
||||
Ok(vec![self.clone()])
|
||||
}
|
||||
}
|
||||
|
||||
impl<ConstraintF: Field> ToBitsGadget<ConstraintF> for [Boolean] {
|
||||
@@ -46,14 +47,8 @@ impl<ConstraintF: Field> ToBitsGadget<ConstraintF> for [Boolean] {
|
||||
) -> Result<Vec<Boolean>, SynthesisError> {
|
||||
Ok(self.to_vec())
|
||||
}
|
||||
|
||||
fn to_bits_strict<CS: ConstraintSystem<ConstraintF>>(
|
||||
&self,
|
||||
_cs: CS,
|
||||
) -> Result<Vec<Boolean>, SynthesisError> {
|
||||
Ok(self.to_vec())
|
||||
}
|
||||
}
|
||||
|
||||
impl<ConstraintF: Field> ToBitsGadget<ConstraintF> for Vec<Boolean> {
|
||||
fn to_bits<CS: ConstraintSystem<ConstraintF>>(
|
||||
&self,
|
||||
@@ -61,13 +56,6 @@ impl<ConstraintF: Field> ToBitsGadget<ConstraintF> for Vec<Boolean> {
|
||||
) -> Result<Vec<Boolean>, SynthesisError> {
|
||||
Ok(self.clone())
|
||||
}
|
||||
|
||||
fn to_bits_strict<CS: ConstraintSystem<ConstraintF>>(
|
||||
&self,
|
||||
_cs: CS,
|
||||
) -> Result<Vec<Boolean>, SynthesisError> {
|
||||
Ok(self.clone())
|
||||
}
|
||||
}
|
||||
|
||||
impl<ConstraintF: Field> ToBitsGadget<ConstraintF> for [UInt8] {
|
||||
@@ -81,26 +69,27 @@ impl<ConstraintF: Field> ToBitsGadget<ConstraintF> for [UInt8] {
|
||||
}
|
||||
Ok(result)
|
||||
}
|
||||
|
||||
fn to_bits_strict<CS: ConstraintSystem<ConstraintF>>(
|
||||
&self,
|
||||
cs: CS,
|
||||
) -> Result<Vec<Boolean>, SynthesisError> {
|
||||
self.to_bits(cs)
|
||||
}
|
||||
}
|
||||
|
||||
pub trait ToBytesGadget<ConstraintF: Field> {
|
||||
/// Outputs a canonical byte-wise representation of `self`.
|
||||
///
|
||||
/// This is the correct default for 99% of use cases.
|
||||
fn to_bytes<CS: ConstraintSystem<ConstraintF>>(
|
||||
&self,
|
||||
cs: CS,
|
||||
) -> Result<Vec<UInt8>, SynthesisError>;
|
||||
|
||||
/// Additionally checks if the produced list of booleans is 'valid'.
|
||||
fn to_bytes_strict<CS: ConstraintSystem<ConstraintF>>(
|
||||
/// Outputs a possibly non-unique byte decomposition of `self`.
|
||||
///
|
||||
/// If you're not absolutely certain that your usecase can get away with a
|
||||
/// non-canonical representation, please use `self.to_bytes(cs)` instead.
|
||||
fn to_non_unique_bytes<CS: ConstraintSystem<ConstraintF>>(
|
||||
&self,
|
||||
cs: CS,
|
||||
) -> Result<Vec<UInt8>, SynthesisError>;
|
||||
) -> Result<Vec<UInt8>, SynthesisError> {
|
||||
self.to_bytes(cs)
|
||||
}
|
||||
}
|
||||
|
||||
impl<ConstraintF: Field> ToBytesGadget<ConstraintF> for [UInt8] {
|
||||
@@ -110,13 +99,6 @@ impl<ConstraintF: Field> ToBytesGadget<ConstraintF> for [UInt8] {
|
||||
) -> Result<Vec<UInt8>, SynthesisError> {
|
||||
Ok(self.to_vec())
|
||||
}
|
||||
|
||||
fn to_bytes_strict<CS: ConstraintSystem<ConstraintF>>(
|
||||
&self,
|
||||
cs: CS,
|
||||
) -> Result<Vec<UInt8>, SynthesisError> {
|
||||
self.to_bytes(cs)
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a, ConstraintF: Field, T: 'a + ToBytesGadget<ConstraintF>> ToBytesGadget<ConstraintF>
|
||||
@@ -128,13 +110,6 @@ impl<'a, ConstraintF: Field, T: 'a + ToBytesGadget<ConstraintF>> ToBytesGadget<C
|
||||
) -> Result<Vec<UInt8>, SynthesisError> {
|
||||
(*self).to_bytes(cs)
|
||||
}
|
||||
|
||||
fn to_bytes_strict<CS: ConstraintSystem<ConstraintF>>(
|
||||
&self,
|
||||
cs: CS,
|
||||
) -> Result<Vec<UInt8>, SynthesisError> {
|
||||
self.to_bytes(cs)
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a, ConstraintF: Field> ToBytesGadget<ConstraintF> for &'a [UInt8] {
|
||||
@@ -144,11 +119,4 @@ impl<'a, ConstraintF: Field> ToBytesGadget<ConstraintF> for &'a [UInt8] {
|
||||
) -> Result<Vec<UInt8>, SynthesisError> {
|
||||
Ok(self.to_vec())
|
||||
}
|
||||
|
||||
fn to_bytes_strict<CS: ConstraintSystem<ConstraintF>>(
|
||||
&self,
|
||||
cs: CS,
|
||||
) -> Result<Vec<UInt8>, SynthesisError> {
|
||||
self.to_bytes(cs)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -306,13 +306,6 @@ impl<ConstraintF: Field> ToBytesGadget<ConstraintF> for UInt32 {
|
||||
|
||||
Ok(bytes)
|
||||
}
|
||||
|
||||
fn to_bytes_strict<CS: ConstraintSystem<ConstraintF>>(
|
||||
&self,
|
||||
cs: CS,
|
||||
) -> Result<Vec<UInt8>, SynthesisError> {
|
||||
self.to_bytes(cs)
|
||||
}
|
||||
}
|
||||
|
||||
impl PartialEq for UInt32 {
|
||||
|
||||
@@ -310,13 +310,6 @@ impl<ConstraintF: Field> ToBytesGadget<ConstraintF> for UInt64 {
|
||||
|
||||
Ok(bytes)
|
||||
}
|
||||
|
||||
fn to_bytes_strict<CS: ConstraintSystem<ConstraintF>>(
|
||||
&self,
|
||||
cs: CS,
|
||||
) -> Result<Vec<UInt8>, SynthesisError> {
|
||||
self.to_bytes(cs)
|
||||
}
|
||||
}
|
||||
|
||||
impl PartialEq for UInt64 {
|
||||
|
||||
Reference in New Issue
Block a user