use crate::base::scalar::MontScalar;
use ark_ff::MontConfig;
#[derive(PartialEq, Eq, Copy, Clone)]
pub struct U256 {
pub low: u128,
pub high: u128,
}
impl U256 {
#[inline]
pub const fn from_words(low: u128, high: u128) -> Self {
U256 { low, high }
}
}
impl<T: MontConfig<4>> From<&MontScalar<T>> for U256 {
fn from(val: &MontScalar<T>) -> Self {
let buf: [u64; 4] = val.into();
let low: u128 = u128::from(buf[0]) | (u128::from(buf[1]) << 64);
let high: u128 = u128::from(buf[2]) | (u128::from(buf[3]) << 64);
U256::from_words(low, high)
}
}
impl<T: MontConfig<4>> From<&U256> for MontScalar<T> {
fn from(val: &U256) -> Self {
let bytes = [val.low.to_le_bytes(), val.high.to_le_bytes()].concat();
MontScalar::<T>::from_le_bytes_mod_order(&bytes)
}
}