zkhash/fields/
utils.rs

1use ark_ff::{PrimeField};
2// use rand::{thread_rng, Rng};
3// use sha3::digest::XofReader;
4// use std::cmp::min;
5// use core::num::ParseIntError;
6
7use hex::FromHex;
8
9pub fn from_hex<F: PrimeField>(s: &str) -> F {
10    let a = Vec::from_hex(&s[2..]).expect("Invalid Hex String");
11    F::from_be_bytes_mod_order(&a as &[u8])
12}
13
14pub fn random_scalar<F: PrimeField>() -> F {
15    let mut rng = ark_std::rand::thread_rng();
16    F::rand(&mut rng)
17}
18
19pub fn random_scalar_without_0<F: PrimeField>() -> F {
20    loop {
21        let element = random_scalar::<F>();
22        if !element.is_zero() {
23            return element;
24        }
25    }
26}
27
28//-----------------------------------------------------------------------------
29// pub fn from_u64<F: PrimeField>(val: u64) -> F {
30//     F::from_repr(F::Repr::from(val)).unwrap()
31// }
32
33// pub fn random_scalar_rng<F: PrimeField, R: Rng>(allow_zero: bool, rng: &mut R) -> F {
34//     loop {
35//         let s = F::rand(rng);
36//         if allow_zero || s != F::zero() {
37//             return s;
38//         }
39//     }
40// }
41
42// pub fn random_scalar<F: PrimeField>(allow_zero: bool) -> F {
43//     loop {
44//         let s = F::rand(&mut thread_rng());
45//         if allow_zero || s != F::zero() {
46//             return s;
47//         }
48//     }
49// }
50
51// pub fn into_limbs<F: PrimeField>(val: &F) -> Vec<u64> {
52//     val.into_repr().as_ref().to_owned()
53// }
54
55// pub fn from_limbs<F: PrimeField>(repr: &[u64]) -> F {
56//     let mut tmp = F::Repr::default();
57//     tmp.as_mut().copy_from_slice(repr);
58//     F::from_repr(tmp).unwrap()
59// }
60
61// fn from_limbs_with_error<F: PrimeField>(repr: &[u64]) -> F {
62//     let mut tmp = F::Repr::default();
63//     tmp.as_mut().copy_from_slice(repr);
64//     F::from_repr(tmp)
65// }
66
67// pub fn field_element_from_shake<F: PrimeField>(reader: &mut dyn XofReader) -> F {
68//     let bytes = f64::ceil(F::MODULUS_BIT_SIZE as f64 / 8f64) as usize;
69//     let mut words = f64::ceil(bytes as f64 / 8f64) as usize;
70//     if F::MODULUS_BIT_SIZE == 64 { // Quick and dirty fix for Goldilocks
71//         words = 2;
72//     }
73    
74//     let mod_ = F::NUM_BITS % 8;
75//     let mask = if mod_ == 0 { 0xFF } else { (1u8 << mod_) - 1 };
76//     let mut buf = vec![0u8; bytes];
77//     let mut word_buf = vec![0u64; words];
78
79//     let len = buf.len();
80//     loop {
81//         reader.read(&mut buf);
82//         buf[len - 1] &= mask;
83//         for i in 0..words {
84//             let mut byte_array = [0u8; 8];
85//             for j in i * 8..min((i + 1) * 8, len) {
86//                 byte_array[j - i * 8] = buf[j];
87//             }
88//             word_buf[i] = u64::from_le_bytes(byte_array);
89//         }
90//         let res = from_limbs_with_error::<F>(&word_buf);
91//         if let Ok(el) = res {
92//             return el;
93//         }
94//     }
95// }
96
97// pub fn field_element_from_shake_without_0<F: PrimeField>(reader: &mut dyn XofReader) -> F {
98//     loop {
99//         let element = field_element_from_shake::<F>(reader);
100//         if !element.is_zero() {
101//             return element;
102//         }
103//     }
104// }