use zeroize::{Zeroize, ZeroizeOnDrop};
pub mod pre_hash {
#![allow(dead_code)]
pub const SHA2_224: [u8; 11] =
[0x06u8, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x04];
pub const SHA2_256: [u8; 11] =
[0x06u8, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x01];
pub const SHA2_384: [u8; 11] =
[0x06u8, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x02];
pub const SHA2_512: [u8; 11] =
[0x06u8, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x03];
pub const SHA2_512_224: [u8; 11] =
[0x06u8, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x05];
pub const SHA2_512_256: [u8; 11] =
[0x06u8, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x06];
pub const SHA3_224: [u8; 11] =
[0x06u8, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x07];
pub const SHA3_256: [u8; 11] =
[0x06u8, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x08];
pub const SHA3_384: [u8; 11] =
[0x06u8, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x09];
pub const SHA3_512: [u8; 11] =
[0x06u8, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x0A];
pub const SHAKE_128: [u8; 11] =
[0x06u8, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x0B];
pub const SHAKE_256: [u8; 11] =
[0x06u8, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x0C];
const DIGEST_LENS: [(&[u8], usize); 12] = [
(&SHA2_224, 28),
(&SHA2_256, 32),
(&SHA2_384, 48),
(&SHA2_512, 64),
(&SHA2_512_224, 28),
(&SHA2_512_256, 32),
(&SHA3_224, 28),
(&SHA3_256, 32),
(&SHA3_384, 48),
(&SHA3_512, 64),
(&SHAKE_128, 32),
(&SHAKE_256, 64),
];
pub(crate) fn digest_len(oid: &[u8]) -> Option<usize> {
DIGEST_LENS.iter().find(|(known, _)| *known == oid).map(|(_, len)| *len)
}
}
#[derive(Clone, Zeroize, ZeroizeOnDrop)]
#[repr(align(8))]
pub struct PrivateKey<const K: usize, const L: usize> {
pub(crate) rho: [u8; 32],
pub(crate) cap_k: [u8; 32],
pub(crate) tr: [u8; 64],
pub(crate) s_1_hat_mont: [T; L],
pub(crate) s_2_hat_mont: [T; K],
pub(crate) t_0_hat_mont: [T; K],
}
#[derive(Clone, Zeroize, ZeroizeOnDrop)]
#[repr(align(8))]
pub struct PublicKey<const K: usize, const L: usize> {
pub(crate) rho: [u8; 32],
pub(crate) tr: [u8; 64],
pub(crate) t1_d2_hat_mont: [T; K],
}
#[derive(Clone, Debug, PartialEq, Zeroize, ZeroizeOnDrop)]
#[repr(align(8))]
pub(crate) struct R(pub(crate) [i32; 256]);
pub(crate) const R0: R = R([0i32; 256]);
#[derive(Clone, Zeroize, ZeroizeOnDrop)]
#[repr(align(8))]
pub(crate) struct T(pub(crate) [i32; 256]);
pub(crate) const T0: T = T([0i32; 256]);
pub(crate) type Zq = i32;