use crate::Curve;
use array::{Array, typenum::Unsigned};
use bigint::{ArrayEncoding, ByteOrder, Encoding};
pub type FieldBytesSize<C> = <C as Curve>::FieldBytesSize;
pub type FieldBytes<C> = Array<u8, FieldBytesSize<C>>;
pub fn bytes_to_uint<C: Curve>(bytes: &FieldBytes<C>) -> C::Uint {
C::Uint::from_slice_truncated(bytes, modulus_bits::<C>(), C::FIELD_ENDIANNESS)
}
pub fn uint_to_bytes<C: Curve>(uint: &C::Uint) -> FieldBytes<C> {
let field_bytes_len = FieldBytesSize::<C>::USIZE;
let uint_bytes_len = <<C as Curve>::Uint as ArrayEncoding>::ByteSize::USIZE;
debug_assert!(field_bytes_len <= uint_bytes_len);
let mut field_bytes = FieldBytes::<C>::default();
match C::FIELD_ENDIANNESS {
ByteOrder::BigEndian => {
let offset = uint_bytes_len.saturating_sub(field_bytes_len);
field_bytes.copy_from_slice(&uint.to_be_byte_array()[offset..]);
}
ByteOrder::LittleEndian => {
field_bytes.copy_from_slice(&uint.to_le_byte_array()[..field_bytes_len]);
}
}
field_bytes
}
#[allow(clippy::cast_possible_truncation)]
const fn modulus_bits<C: Curve>() -> u32 {
(FieldBytesSize::<C>::USIZE * 8) as u32
}