pub const MAX_SP800185_FIXED_OUTPUT_BYTES: usize = 1024;
pub fn left_encode(val: u64, buf: &mut [u8; 9]) -> &[u8] {
buf.fill(0);
let n = if val == 0 {
1usize
} else {
(64usize - val.leading_zeros() as usize).div_ceil(8)
};
buf[0] = n as u8;
for i in 0..n {
let shift = (n - 1 - i) * 8;
buf[1 + i] = ((val >> shift) & 0xFF) as u8;
}
&buf[..(n + 1)]
}
pub fn right_encode(val: u64, buf: &mut [u8; 9]) -> &[u8] {
buf.fill(0);
let n = if val == 0 {
1usize
} else {
(64usize - val.leading_zeros() as usize).div_ceil(8)
};
for (i, out) in buf.iter_mut().take(n).enumerate() {
let shift = (n - 1 - i) * 8;
*out = ((val >> shift) & 0xFF) as u8;
}
buf[n] = n as u8;
&buf[..(n + 1)]
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_left_encode() {
let mut buf = [0u8; 9];
let result = left_encode(0, &mut buf);
assert_eq!(result, &[1, 0]);
let result = left_encode(1, &mut buf);
assert_eq!(result, &[1, 1]);
let result = left_encode(255, &mut buf);
assert_eq!(result, &[1, 255]);
let result = left_encode(256, &mut buf);
assert_eq!(result, &[2, 1, 0]);
}
#[test]
fn test_right_encode() {
let mut buf = [0u8; 9];
let result = right_encode(0, &mut buf);
assert_eq!(result, &[0, 1]);
let result = right_encode(1, &mut buf);
assert_eq!(result, &[1, 1]);
let result = right_encode(255, &mut buf);
assert_eq!(result, &[255, 1]);
let result = right_encode(256, &mut buf);
assert_eq!(result, &[1, 0, 2]);
}
}