52#ifndef QSC_KYBERBASE_AVX2_H
53#define QSC_KYBERBASE_AVX2_H
59QSC_CPLUSPLUS_ENABLED_START
66#if defined(QSC_SYSTEM_HAS_AVX2)
72#if defined(QSC_KYBER_S1K2P512)
74#elif defined(QSC_KYBER_S3K3P768)
76#elif defined(QSC_KYBER_S5K4P1024)
78#elif defined(QSC_KYBER_S6K5P1280)
81# error "The Kyber parameter set is invalid!"
88#define QSC_KYBER_N 256
94#define QSC_KYBER_Q 3329
100#define QSC_KYBER_ETA2 2
106#define QSC_KYBER_MSGBYTES 32
112#define QSC_KYBER_SYMBYTES 32
118#define QSC_KYBER_POLYBYTES 384
120#if (QSC_KYBER_K == 2)
121# define QSC_KYBER_POLYVECBASE_BYTES 320
122# define QSC_KYBER_POLYCOMPRESSED_BYTES 128
123# define QSC_KYBER_ETA1 3
124#elif (QSC_KYBER_K == 3)
125# define QSC_KYBER_POLYVECBASE_BYTES 320
126# define QSC_KYBER_POLYCOMPRESSED_BYTES 128
127# define QSC_KYBER_ETA1 2
128#elif (QSC_KYBER_K == 4)
129# define QSC_KYBER_POLYVECBASE_BYTES 352
130# define QSC_KYBER_POLYCOMPRESSED_BYTES 160
131# define QSC_KYBER_ETA1 2
132#elif (QSC_KYBER_K == 5)
133# define QSC_KYBER_POLYVECBASE_BYTES 352
134# define QSC_KYBER_POLYCOMPRESSED_BYTES 160
135# define QSC_KYBER_ETA1 2
142#define QSC_KYBER_POLYVEC_COMPRESSED_BYTES (QSC_KYBER_K * QSC_KYBER_POLYVECBASE_BYTES)
148#define QSC_KYBER_POLYVEC_BYTES (QSC_KYBER_K * QSC_KYBER_POLYBYTES)
154#define QSC_KYBER_INDCPA_PUBLICKEY_BYTES (QSC_KYBER_POLYVEC_BYTES + QSC_KYBER_SYMBYTES)
160#define QSC_KYBER_INDCPA_SECRETKEY_BYTES (QSC_KYBER_POLYVEC_BYTES)
166#define QSC_KYBER_INDCPA_BYTES (QSC_KYBER_POLYVEC_COMPRESSED_BYTES + QSC_KYBER_POLYCOMPRESSED_BYTES)
172#define QSC_KYBER_PUBLICKEY_BYTES (QSC_KYBER_INDCPA_PUBLICKEY_BYTES)
178#define QSC_KYBER_SECRETKEY_BYTES (QSC_KYBER_INDCPA_SECRETKEY_BYTES + QSC_KYBER_INDCPA_PUBLICKEY_BYTES + 2 * QSC_KYBER_SYMBYTES)
184#define QSC_KYBER_CIPHERTEXT_BYTES (QSC_KYBER_INDCPA_BYTES)
196bool qsc_kyber_avx2_decapsulate(uint8_t ss[QSC_KYBER_MSGBYTES],
const uint8_t ct[QSC_KYBER_CIPHERTEXT_BYTES],
197 const uint8_t sk[QSC_KYBER_SECRETKEY_BYTES]);
208bool qsc_kyber_avx2_encapsulate(uint8_t ct[QSC_KYBER_CIPHERTEXT_BYTES], uint8_t ss[QSC_KYBER_MSGBYTES],
209 const uint8_t pk[QSC_KYBER_PUBLICKEY_BYTES],
bool (*rng_generate)(uint8_t*,
size_t));
220void qsc_kyber_avx2_seeded_encapsulate(uint8_t ct[QSC_KYBER_CIPHERTEXT_BYTES], uint8_t ss[QSC_KYBER_MSGBYTES],
221 const uint8_t pk[QSC_KYBER_PUBLICKEY_BYTES],
const uint8_t m[QSC_KYBER_SYMBYTES]);
231bool qsc_kyber_avx2_generate_keypair(uint8_t pk[QSC_KYBER_PUBLICKEY_BYTES], uint8_t sk[QSC_KYBER_SECRETKEY_BYTES],
232 bool (*rng_generate)(uint8_t*,
size_t));
242void qsc_kyber_avx2_generate_seeded_keypair(uint8_t pk[QSC_KYBER_PUBLICKEY_BYTES], uint8_t sk[QSC_KYBER_SECRETKEY_BYTES],
243 uint8_t d[QSC_KYBER_SYMBYTES], uint8_t z[QSC_KYBER_SYMBYTES]);
247QSC_CPLUSPLUS_ENABLED_END
Contains common definitions for the Quantum Secure Cryptographic (QSC) library.