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// }