52#ifndef QSC_KYBERBASE_H
53#define QSC_KYBERBASE_H
59QSC_CPLUSPLUS_ENABLED_START
65#if defined(QSC_KYBER_S1K2P512)
67#elif defined(QSC_KYBER_S3K3P768)
69#elif defined(QSC_KYBER_S5K4P1024)
71#elif defined(QSC_KYBER_S6K5P1280)
74# error "The Kyber parameter set is invalid!"
81#define QSC_KYBER_N 256
87#define QSC_KYBER_Q 3329
93#define QSC_KYBER_ETA2 2
99#define QSC_KYBER_MSGBYTES 32ULL
105#define QSC_KYBER_SYMBYTES 32ULL
111#define QSC_KYBER_POLYBYTES 384ULL
113#if (QSC_KYBER_K == 2)
114# define QSC_KYBER_POLYCOMPRESSED_BYTES 128
115# define QSC_KYBER_POLYVECBASE_BYTES 320
116# define QSC_KYBER_ETA1 3
117#elif (QSC_KYBER_K == 3)
118# define QSC_KYBER_POLYCOMPRESSED_BYTES 128
119# define QSC_KYBER_POLYVECBASE_BYTES 320
120# define QSC_KYBER_ETA1 2
121#elif (QSC_KYBER_K == 4)
122# define QSC_KYBER_POLYCOMPRESSED_BYTES 160
123# define QSC_KYBER_POLYVECBASE_BYTES 352
124# define QSC_KYBER_ETA1 2
125#elif (QSC_KYBER_K == 5)
126# define QSC_KYBER_POLYCOMPRESSED_BYTES 160
127# define QSC_KYBER_POLYVECBASE_BYTES 352
128# define QSC_KYBER_ETA1 2
135#define QSC_KYBER_POLYVEC_COMPRESSED_BYTES (QSC_KYBER_K * QSC_KYBER_POLYVECBASE_BYTES)
141#define QSC_KYBER_POLYVEC_BYTES (QSC_KYBER_K * QSC_KYBER_POLYBYTES)
147#define QSC_KYBER_INDCPA_PUBLICKEY_BYTES (QSC_KYBER_POLYVEC_BYTES + QSC_KYBER_SYMBYTES)
153#define QSC_KYBER_INDCPA_SECRETKEY_BYTES (QSC_KYBER_POLYVEC_BYTES)
159#define QSC_KYBER_INDCPA_BYTES (QSC_KYBER_POLYVEC_COMPRESSED_BYTES + QSC_KYBER_POLYCOMPRESSED_BYTES)
165#define QSC_KYBER_PUBLICKEY_BYTES (QSC_KYBER_INDCPA_PUBLICKEY_BYTES)
171#define QSC_KYBER_SECRETKEY_BYTES (QSC_KYBER_INDCPA_SECRETKEY_BYTES + QSC_KYBER_INDCPA_PUBLICKEY_BYTES + 2 * QSC_KYBER_SYMBYTES)
177#define QSC_KYBER_CIPHERTEXT_BYTES (QSC_KYBER_INDCPA_BYTES)
189bool qsc_kyber_ref_decapsulate(uint8_t ss[QSC_KYBER_MSGBYTES],
const uint8_t ct[QSC_KYBER_CIPHERTEXT_BYTES],
190 const uint8_t sk[QSC_KYBER_SECRETKEY_BYTES]);
201bool qsc_kyber_ref_encapsulate(uint8_t ct[QSC_KYBER_CIPHERTEXT_BYTES], uint8_t ss[QSC_KYBER_MSGBYTES],
202 const uint8_t pk[QSC_KYBER_PUBLICKEY_BYTES],
bool (*rng_generate)(uint8_t*,
size_t));
213void qsc_kyber_ref_seeded_encapsulate(uint8_t ct[QSC_KYBER_CIPHERTEXT_BYTES], uint8_t ss[QSC_KYBER_MSGBYTES],
214 const uint8_t pk[QSC_KYBER_PUBLICKEY_BYTES],
const uint8_t m[QSC_KYBER_SYMBYTES]);
224bool qsc_kyber_ref_generate_keypair(uint8_t pk[QSC_KYBER_PUBLICKEY_BYTES], uint8_t sk[QSC_KYBER_SECRETKEY_BYTES],
225 bool (*rng_generate)(uint8_t*,
size_t));
236void qsc_kyber_ref_generate_seeded_keypair(uint8_t pk[QSC_KYBER_PUBLICKEY_BYTES], uint8_t sk[QSC_KYBER_SECRETKEY_BYTES],
237 uint8_t d[QSC_KYBER_SYMBYTES], uint8_t z[QSC_KYBER_SYMBYTES]);
239QSC_CPLUSPLUS_ENABLED_END
Contains common definitions for the Quantum Secure Cryptographic (QSC) library.