kyberlib 0.0.7

A robust, audit-friendly Rust implementation of FIPS 203 ML-KEM (the standardised CRYSTALS-Kyber post-quantum KEM).
Documentation
use crate::params::KYBER_Q;
use core::arch::x86_64::*;

pub const Q: i16 = KYBER_Q as i16;
pub const QINV: i16 = -3327; // q^-1 mod 2^16
pub const V: i16 = 20159; // floor(2^26/q + 0.5)
pub const FHI: i16 = 1441; // mont^2/128
pub const FLO: i16 = -10079; // qinv*FHI
pub const MONTSQHI: i16 = 1353; // mont^2
pub const MONTSQLO: i16 = 20553; // qinv*MONTSQHI
pub const MASK: i16 = 4095;
pub const SHIFT: i16 = 32;

pub const _16XQ: usize = 0;
pub const _16XQINV: usize = 16;
pub const _16XV: usize = 32;
pub const _16XFLO: usize = 48;
pub const _16XFHI: usize = 64;
pub const _16XMONTSQLO: usize = 80;
pub const _16XMONTSQHI: usize = 96;
pub const _16XMASK: usize = 112;
pub const _REVIDXB: usize = 128;
pub const _REVIDXD: usize = 144;
pub const _ZETAS_EXP: usize = 160;
pub const _16XSHIFT: usize = 624;

#[repr(C, align(32))]
pub union Qdata {
    pub coeffs: [i16; 640],
    pub vec: [__m256i; 40],
}

pub const QDATA: Qdata = Qdata {
    coeffs: [
        Q, Q, Q, Q, Q, Q, Q, Q, Q, Q, Q, Q, Q, Q, Q, Q, QINV, QINV,
        QINV, QINV, QINV, QINV, QINV, QINV, QINV, QINV, QINV, QINV,
        QINV, QINV, QINV, QINV, V, V, V, V, V, V, V, V, V, V, V, V, V,
        V, V, V, FLO, FLO, FLO, FLO, FLO, FLO, FLO, FLO, FLO, FLO, FLO,
        FLO, FLO, FLO, FLO, FLO, FHI, FHI, FHI, FHI, FHI, FHI, FHI,
        FHI, FHI, FHI, FHI, FHI, FHI, FHI, FHI, FHI, MONTSQLO,
        MONTSQLO, MONTSQLO, MONTSQLO, MONTSQLO, MONTSQLO, MONTSQLO,
        MONTSQLO, MONTSQLO, MONTSQLO, MONTSQLO, MONTSQLO, MONTSQLO,
        MONTSQLO, MONTSQLO, MONTSQLO, MONTSQHI, MONTSQHI, MONTSQHI,
        MONTSQHI, MONTSQHI, MONTSQHI, MONTSQHI, MONTSQHI, MONTSQHI,
        MONTSQHI, MONTSQHI, MONTSQHI, MONTSQHI, MONTSQHI, MONTSQHI,
        MONTSQHI, MASK, MASK, MASK, MASK, MASK, MASK, MASK, MASK, MASK,
        MASK, MASK, MASK, MASK, MASK, MASK, MASK, 3854, 3340, 2826,
        2312, 1798, 1284, 770, 256, 3854, 3340, 2826, 2312, 1798, 1284,
        770, 256, 7, 0, 6, 0, 5, 0, 4, 0, 3, 0, 2, 0, 1, 0, 0, 0,
        31498, 31498, 31498, 31498, -758, -758, -758, -758, 5237, 5237,
        5237, 5237, 1397, 1397, 1397, 1397, 14745, 14745, 14745, 14745,
        14745, 14745, 14745, 14745, 14745, 14745, 14745, 14745, 14745,
        14745, 14745, 14745, -359, -359, -359, -359, -359, -359, -359,
        -359, -359, -359, -359, -359, -359, -359, -359, -359, 13525,
        13525, 13525, 13525, 13525, 13525, 13525, 13525, -12402,
        -12402, -12402, -12402, -12402, -12402, -12402, -12402, 1493,
        1493, 1493, 1493, 1493, 1493, 1493, 1493, 1422, 1422, 1422,
        1422, 1422, 1422, 1422, 1422, -20907, -20907, -20907, -20907,
        27758, 27758, 27758, 27758, -3799, -3799, -3799, -3799, -15690,
        -15690, -15690, -15690, -171, -171, -171, -171, 622, 622, 622,
        622, 1577, 1577, 1577, 1577, 182, 182, 182, 182, -5827, -5827,
        17363, 17363, -26360, -26360, -29057, -29057, 5571, 5571,
        -1102, -1102, 21438, 21438, -26242, -26242, 573, 573, -1325,
        -1325, 264, 264, 383, 383, -829, -829, 1458, 1458, -1602,
        -1602, -130, -130, -5689, -6516, 1496, 30967, -23565, 20179,
        20710, 25080, -12796, 26616, 16064, -12442, 9134, -650, -25986,
        27837, 1223, 652, -552, 1015, -1293, 1491, -282, -1544, 516,
        -8, -320, -666, -1618, -1162, 126, 1469, -335, -11477, -32227,
        20494, -27738, 945, -14883, 6182, 32010, 10631, 29175, -28762,
        -18486, 17560, -14430, -5276, -1103, 555, -1251, 1550, 422,
        177, -291, 1574, -246, 1159, -777, -602, -1590, -872, 418,
        -156, 11182, 13387, -14233, -21655, 13131, -4587, 23092, 5493,
        -32502, 30317, -18741, 12639, 20100, 18525, 19529, -12619, 430,
        843, 871, 105, 587, -235, -460, 1653, 778, -147, 1483, 1119,
        644, 349, 329, -75, 787, 787, 787, 787, 787, 787, 787, 787,
        787, 787, 787, 787, 787, 787, 787, 787, -1517, -1517, -1517,
        -1517, -1517, -1517, -1517, -1517, -1517, -1517, -1517, -1517,
        -1517, -1517, -1517, -1517, 28191, 28191, 28191, 28191, 28191,
        28191, 28191, 28191, -16694, -16694, -16694, -16694, -16694,
        -16694, -16694, -16694, 287, 287, 287, 287, 287, 287, 287, 287,
        202, 202, 202, 202, 202, 202, 202, 202, 10690, 10690, 10690,
        10690, 1358, 1358, 1358, 1358, -11202, -11202, -11202, -11202,
        31164, 31164, 31164, 31164, 962, 962, 962, 962, -1202, -1202,
        -1202, -1202, -1474, -1474, -1474, -1474, 1468, 1468, 1468,
        1468, -28073, -28073, 24313, 24313, -10532, -10532, 8800, 8800,
        18426, 18426, 8859, 8859, 26675, 26675, -16163, -16163, -681,
        -681, 1017, 1017, 732, 732, 608, 608, -1542, -1542, 411, 411,
        -205, -205, -1571, -1571, 19883, -28250, -15887, -8898, -28309,
        9075, -30199, 18249, 13426, 14017, -29156, -12757, 16832, 4311,
        -24155, -17915, -853, -90, -271, 830, 107, -1421, -247, -951,
        -398, 961, -1508, -725, 448, -1065, 677, -1275, -31183, 25435,
        -7382, 24391, -20927, 10946, 24214, 16989, 10335, -7934,
        -22502, 10906, 31636, 28644, 23998, -17422, 817, 603, 1322,
        -1465, -1215, 1218, -874, -1187, -1185, -1278, -1510, -870,
        -108, 996, 958, 1522, 20297, 2146, 15355, -32384, -6280,
        -14903, -11044, 14469, -21498, -20198, 23210, -17442, -23860,
        -20257, 7756, 23132, 1097, 610, -1285, 384, -136, -1335, 220,
        -1659, -1530, 794, -854, 478, -308, 991, -1460, 1628, SHIFT,
        SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, SHIFT,
        SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, SHIFT,
    ],
};