use super::super::utils::*;
use crate::bellman::pairing::ff::*;
pub const SHA256_CHOOSE_BASE: u64 = 7;
pub const SHA256_MAJORITY_SHEDULER_BASE: u64 = 4;
pub const CH_BIT_TABLE: [u64; SHA256_CHOOSE_BASE as usize] = [
0, 0, 0, 1, 0, 1, 1, ];
pub fn ch_u64_normalizer(n: u64) -> u64 {
assert!(n < (SHA256_CHOOSE_BASE as u64));
CH_BIT_TABLE[n as usize]
}
pub fn ch_ff_normalizer<Fr: PrimeField>(fr: Fr) -> Fr {
let bit_table: [u64; SHA256_CHOOSE_BASE as usize] = [0, 0, 0, 1, 0, 1, 1];
let base = SHA256_CHOOSE_BASE;
general_normalizer(fr, &bit_table[..], base)
}
pub const MAJ_BIT_TABLE: [u64; SHA256_MAJORITY_SHEDULER_BASE as usize] = [
0, 0, 1, 1, ];
pub fn maj_u64_normalizer(n: u64) -> u64 {
assert!(n < (SHA256_MAJORITY_SHEDULER_BASE as u64));
MAJ_BIT_TABLE[n as usize]
}
pub fn maj_ff_normalizer<Fr: PrimeField>(fr: Fr) -> Fr {
let bit_table: [u64; SHA256_MAJORITY_SHEDULER_BASE as usize] = [0, 0, 1, 1];
let base = SHA256_MAJORITY_SHEDULER_BASE;
general_normalizer(fr, &bit_table[..], base)
}
pub fn ch_xor_ff_normalizer<Fr: PrimeField>(fr: Fr) -> Fr {
let bit_table: [u64; SHA256_CHOOSE_BASE as usize] = [0, 1, 0, 1, 0, 1, 0];
let base = SHA256_CHOOSE_BASE;
general_normalizer(fr, &bit_table[..], base)
}
pub fn maj_and_sheduler_xor_ff_normalizer<Fr: PrimeField>(fr: Fr) -> Fr {
let bit_table: [u64; SHA256_MAJORITY_SHEDULER_BASE as usize] = [0, 1, 0, 1];
let base = SHA256_MAJORITY_SHEDULER_BASE;
general_normalizer(fr, &bit_table[..], base)
}