rustpq 0.3.0

Pure Rust post-quantum cryptography suite - ML-KEM, ML-DSA, and more
Documentation
pub const N: usize = 256;
pub const Q: i32 = 8380417;
pub const QINV: i32 = 58728449;
pub const D: usize = 13;
pub const SEEDBYTES: usize = 32;
pub const TRBYTES: usize = 64;

pub trait Params {
    const K: usize;
    const L: usize;
    const ETA: usize;
    const TAU: usize;
    const BETA: usize;
    const GAMMA1: usize;
    const GAMMA2: usize;
    const OMEGA: usize;

    const POLYT1_PACKEDBYTES: usize;
    const POLYT0_PACKEDBYTES: usize;
    const POLYVECH_PACKEDBYTES: usize;
    const POLYZ_PACKEDBYTES: usize;
    const POLYW1_PACKEDBYTES: usize;
    const POLYETA_PACKEDBYTES: usize;

    const CRYPTO_PUBLICKEYBYTES: usize;
    const CRYPTO_SECRETKEYBYTES: usize;
    const CRYPTO_BYTES: usize;
}

#[allow(non_camel_case_types)]
pub struct ML_DSA_44;

impl Params for ML_DSA_44 {
    const K: usize = 4;
    const L: usize = 4;
    const ETA: usize = 2;
    const TAU: usize = 39;
    const BETA: usize = 78;
    const GAMMA1: usize = 1 << 17;
    const GAMMA2: usize = (Q as usize - 1) / 88;
    const OMEGA: usize = 80;

    const POLYT1_PACKEDBYTES: usize = 320;
    const POLYT0_PACKEDBYTES: usize = 416;
    const POLYVECH_PACKEDBYTES: usize = Self::OMEGA + Self::K;
    const POLYZ_PACKEDBYTES: usize = 576;
    const POLYW1_PACKEDBYTES: usize = 192;
    const POLYETA_PACKEDBYTES: usize = 96;

    const CRYPTO_PUBLICKEYBYTES: usize = SEEDBYTES + Self::K * Self::POLYT1_PACKEDBYTES;
    const CRYPTO_SECRETKEYBYTES: usize = 2 * SEEDBYTES
        + TRBYTES
        + Self::L * Self::POLYETA_PACKEDBYTES
        + Self::K * Self::POLYETA_PACKEDBYTES
        + Self::K * Self::POLYT0_PACKEDBYTES;
    const CRYPTO_BYTES: usize =
        SEEDBYTES + Self::L * Self::POLYZ_PACKEDBYTES + Self::POLYVECH_PACKEDBYTES;
}

#[allow(non_camel_case_types)]
pub struct ML_DSA_65;

impl Params for ML_DSA_65 {
    const K: usize = 6;
    const L: usize = 5;
    const ETA: usize = 4;
    const TAU: usize = 49;
    const BETA: usize = 196;
    const GAMMA1: usize = 1 << 19;
    const GAMMA2: usize = (Q as usize - 1) / 32;
    const OMEGA: usize = 55;

    const POLYT1_PACKEDBYTES: usize = 320;
    const POLYT0_PACKEDBYTES: usize = 416;
    const POLYVECH_PACKEDBYTES: usize = Self::OMEGA + Self::K;
    const POLYZ_PACKEDBYTES: usize = 640;
    const POLYW1_PACKEDBYTES: usize = 128;
    const POLYETA_PACKEDBYTES: usize = 128;

    const CRYPTO_PUBLICKEYBYTES: usize = SEEDBYTES + Self::K * Self::POLYT1_PACKEDBYTES;
    const CRYPTO_SECRETKEYBYTES: usize = 2 * SEEDBYTES
        + TRBYTES
        + Self::L * Self::POLYETA_PACKEDBYTES
        + Self::K * Self::POLYETA_PACKEDBYTES
        + Self::K * Self::POLYT0_PACKEDBYTES;
    const CRYPTO_BYTES: usize =
        SEEDBYTES + Self::L * Self::POLYZ_PACKEDBYTES + Self::POLYVECH_PACKEDBYTES;
}

#[allow(non_camel_case_types)]
pub struct ML_DSA_87;

impl Params for ML_DSA_87 {
    const K: usize = 8;
    const L: usize = 7;
    const ETA: usize = 2;
    const TAU: usize = 60;
    const BETA: usize = 120;
    const GAMMA1: usize = 1 << 19;
    const GAMMA2: usize = (Q as usize - 1) / 32;
    const OMEGA: usize = 75;

    const POLYT1_PACKEDBYTES: usize = 320;
    const POLYT0_PACKEDBYTES: usize = 416;
    const POLYVECH_PACKEDBYTES: usize = Self::OMEGA + Self::K;
    const POLYZ_PACKEDBYTES: usize = 640;
    const POLYW1_PACKEDBYTES: usize = 128;
    const POLYETA_PACKEDBYTES: usize = 96;

    const CRYPTO_PUBLICKEYBYTES: usize = SEEDBYTES + Self::K * Self::POLYT1_PACKEDBYTES;
    const CRYPTO_SECRETKEYBYTES: usize = 2 * SEEDBYTES
        + TRBYTES
        + Self::L * Self::POLYETA_PACKEDBYTES
        + Self::K * Self::POLYETA_PACKEDBYTES
        + Self::K * Self::POLYT0_PACKEDBYTES;
    const CRYPTO_BYTES: usize =
        SEEDBYTES + Self::L * Self::POLYZ_PACKEDBYTES + Self::POLYVECH_PACKEDBYTES;
}