27 const auto q0 = _mm512_loadu_si512(QS);
28 const auto q1 = _mm512_loadu_si512(QS + 64);
29 const auto q2 = _mm512_loadu_si512(QS + 128);
30 const auto q3 = _mm512_loadu_si512(QS + 192);
32 const auto bytemask = _mm512_set1_epi32(0xFF);
33 const auto idx = _mm512_and_si512(_mm512_srli_epi32(W.
raw(), N * 8), bytemask);
36 const __m512i lo = _mm512_permutex2var_epi8(q0, idx, q1);
37 const __m512i hi = _mm512_permutex2var_epi8(q2, idx, q3);
40 return _mm512_mask_blend_epi8(_mm512_movepi8_mask(idx), lo, hi);
43BOTAN_FN_ISA_AVX512_GFNI
46 alignas(64)
constexpr uint8_t MDS_PRE_SHUFFLE[64] = {
47 0, 4, 8, 12, 16, 20, 24, 28, 0, 4, 8, 12, 16, 20, 24, 28,
48 0, 4, 8, 12, 16, 20, 24, 28, 0, 4, 8, 12, 16, 20, 24, 28,
49 32, 36, 40, 44, 48, 52, 56, 60, 32, 36, 40, 44, 48, 52, 56, 60,
50 32, 36, 40, 44, 48, 52, 56, 60, 32, 36, 40, 44, 48, 52, 56, 60,
53 alignas(64)
constexpr uint8_t MDS_POST_SHUFFLE[64] = {
54 0, 8, 16, 24, 1, 9, 17, 25, 2, 10, 18, 26, 3, 11, 19, 27,
55 4, 12, 20, 28, 5, 13, 21, 29, 6, 14, 22, 30, 7, 15, 23, 31,
56 32, 40, 48, 56, 33, 41, 49, 57, 34, 42, 50, 58, 35, 43, 51, 59,
57 36, 44, 52, 60, 37, 45, 53, 61, 38, 46, 54, 62, 39, 47, 55, 63,
61 const __m512i pre = _mm512_permutexvar_epi8(_mm512_load_si512(MDS_PRE_SHUFFLE), q);
62 const __m512i transformed = _mm512_gf2p8affine_epi64_epi8(pre, mds_gfni, 0);
63 return SIMD_16x32(_mm512_permutexvar_epi8(_mm512_load_si512(MDS_POST_SHUFFLE), transformed));
66BOTAN_FN_ISA_AVX512_GFNI
68 constexpr uint64_t GFNI_ID = 0x0102040810204080;
69 constexpr uint64_t GFNI_5B = 0x050B162953A24182;
70 constexpr uint64_t GFNI_EF = 0x070F1F3972E3C183;
72 const __m512i MDS0 = _mm512_set_epi64(GFNI_EF, GFNI_EF, GFNI_5B, GFNI_ID, GFNI_EF, GFNI_EF, GFNI_5B, GFNI_ID);
73 const __m512i MDS1 = _mm512_set_epi64(GFNI_ID, GFNI_5B, GFNI_EF, GFNI_EF, GFNI_ID, GFNI_5B, GFNI_EF, GFNI_EF);
74 const __m512i MDS2 = _mm512_set_epi64(GFNI_EF, GFNI_ID, GFNI_EF, GFNI_5B, GFNI_EF, GFNI_ID, GFNI_EF, GFNI_5B);
75 const __m512i MDS3 = _mm512_set_epi64(GFNI_5B, GFNI_EF, GFNI_ID, GFNI_5B, GFNI_5B, GFNI_EF, GFNI_ID, GFNI_5B);
77 const auto r0 = apply_mds(lookup_sbox<0>(W, QS), MDS0);
78 const auto r1 = apply_mds(lookup_sbox<1>(W, QS + 256), MDS1);
79 const auto r2 = apply_mds(lookup_sbox<2>(W, QS + 512), MDS2);
80 const auto r3 = apply_mds(lookup_sbox<3>(W, QS + 768), MDS3);
82 return (r0 ^ r1 ^ r2 ^ r3);
87BOTAN_FN_ISA_AVX512_GFNI
103BOTAN_FN_ISA_AVX512_GFNI