INNER CODE UNIT · Rust
pk_decode
orion-rs/orion · src/hazardous/dsa/ml_dsa/internal/mod.rs:224
fn pk_decode<const K: usize>(pk: &[u8]) -> Result<([u8; 32], Vector<K>), UnknownCryptoError> {
if pk.len() != Self::PUBLIC_KEY_SIZE {
return Err(UnknownCryptoError);
}
let mut rho = [0u8; 32];
rho.copy_from_slice(&pk[..32]);
let mut t1 = Vector::<K>::zero();
for (idx, encpoly) in (0..Self::DIM_K).zip(pk[32..].chunks_exact(320)) {
for (fe, blk) in t1[idx]
.coefficients
.chunks_exact_mut(4)
.zip(encpoly.chunks_exact(5))
{
let c = |k: usize| blk[k] as u32;
fe[0].0 = (c(0) | (c(1) << 8)) & 0x3FF;