arnaucube
arnaucube/NovaPublic Self-hosted repository
Nova/src/gadgets/nonnative/mod.rs
src/gadgets/nonnative/mod.rsRaw
 1//! This module implements various gadgets necessary for doing non-native arithmetic
 2//! Code in this module is adapted from [bellman-bignat](https://github.com/alex-ozdemir/bellman-bignat), which is licenced under MIT
 3
 4use bellperson::SynthesisError;
 5use ff::PrimeField;
 6
 7trait OptionExt<T> {
 8  fn grab(&self) -> Result<&T, SynthesisError>;
 9  fn grab_mut(&mut self) -> Result<&mut T, SynthesisError>;
10}
11
12impl<T> OptionExt<T> for Option<T> {
13  fn grab(&self) -> Result<&T, SynthesisError> {
14    self.as_ref().ok_or(SynthesisError::AssignmentMissing)
15  }
16  fn grab_mut(&mut self) -> Result<&mut T, SynthesisError> {
17    self.as_mut().ok_or(SynthesisError::AssignmentMissing)
18  }
19}
20
21trait BitAccess {
22  fn get_bit(&self, i: usize) -> Option<bool>;
23}
24
25impl<Scalar: PrimeField> BitAccess for Scalar {
26  fn get_bit(&self, i: usize) -> Option<bool> {
27    if i as u32 >= Scalar::NUM_BITS {
28      return None;
29    }
30
31    let (byte_pos, bit_pos) = (i / 8, i % 8);
32    let byte = self.to_repr().as_ref()[byte_pos];
33    let bit = byte >> bit_pos & 1;
34    Some(bit == 1)
35  }
36}
37
38pub mod bignat;
39pub mod util;