use alloc::vec;
use alloc::vec::Vec;
use crate::params::N;
use crate::poly::Poly;
pub fn byte_encode(p: &Poly, d: u32) -> Vec<u8> {
let d = d as usize;
let nbytes = 32 * d;
let mut out = vec![0u8; nbytes];
let mut bitpos = 0usize;
for i in 0..N {
let mut v = p.0[i] as u32;
v &= (1u32 << d) - 1;
for b in 0..d {
let bit = ((v >> b) & 1) as u8;
out[bitpos >> 3] |= bit << (bitpos & 7);
bitpos += 1;
}
}
out
}
pub fn byte_decode(bytes: &[u8], d: u32) -> Poly {
let d_us = d as usize;
assert_eq!(bytes.len(), 32 * d_us);
let mut p = [0u16; N];
let mut bitpos = 0usize;
for i in 0..N {
let mut v: u16 = 0;
for b in 0..d_us {
let bit = ((bytes[bitpos >> 3] >> (bitpos & 7)) & 1) as u16;
v |= bit << b;
bitpos += 1;
}
if d == 12 {
}
p[i] = v;
}
Poly(p)
}
pub fn message_to_poly(m: &[u8; 32]) -> Poly {
let mut p = [0u16; N];
for i in 0..N {
let bit = ((m[i >> 3] >> (i & 7)) & 1) as u16;
p[i] = bit * 1665;
}
Poly(p)
}
pub fn poly_to_message(p: &Poly) -> [u8; 32] {
let mut m = [0u8; 32];
for i in 0..N {
let v = crate::compress::compress_poly_fe_1(p.0[i]);
m[i >> 3] |= (v as u8) << (i & 7);
}
m
}