1#ifndef QSC_DILITHIUM_AVX_H
2#define QSC_DILITHIUM_AVX_H
30#if defined(__WIN32__) || defined(__APPLE__)
31#define decorate(s) _##s
32#define _cdecl(s) decorate(s)
33#define cdecl(s) _cdecl(DILITHIUM_NAMESPACE(##s))
35#define cdecl(s) DILITHIUM_NAMESPACE(##s)
38#define ALIGNED_UINT8(N) \
41 __m256i vec[(N+31)/32]; \
44#define ALIGNED_INT32(N) \
47 __m256i vec[(N+7)/8]; \
51#define pqcrystals_dilithium2_PUBLICKEYBYTES 1312
52#define pqcrystals_dilithium2_SECRETKEYBYTES 2560
53#define pqcrystals_dilithium2_BYTES 2420
55#define pqcrystals_dilithium2_avx2_PUBLICKEYBYTES pqcrystals_dilithium2_PUBLICKEYBYTES
56#define pqcrystals_dilithium2_avx2_SECRETKEYBYTES pqcrystals_dilithium2_SECRETKEYBYTES
57#define pqcrystals_dilithium2_avx2_BYTES pqcrystals_dilithium2_BYTES
59int pqcrystals_dilithium2_avx2_keypair(uint8_t *pk, uint8_t *sk);
61int pqcrystals_dilithium2_avx2_signature(uint8_t *sig,
size_t *siglen,
62 const uint8_t *m,
size_t mlen,
63 const uint8_t *ctx,
size_t ctxlen,
66int pqcrystals_dilithium2_avx2(uint8_t *sm,
size_t *smlen,
67 const uint8_t *m,
size_t mlen,
68 const uint8_t *ctx,
size_t ctxlen,
71int pqcrystals_dilithium2_avx2_verify(
const uint8_t *sig,
size_t siglen,
72 const uint8_t *m,
size_t mlen,
73 const uint8_t *ctx,
size_t ctxlen,
76int pqcrystals_dilithium2_avx2_open(uint8_t *m,
size_t *mlen,
77 const uint8_t *sm,
size_t smlen,
78 const uint8_t *ctx,
size_t ctxlen,
82#define pqcrystals_dilithium3_PUBLICKEYBYTES 1952
83#define pqcrystals_dilithium3_SECRETKEYBYTES 4032
84#define pqcrystals_dilithium3_BYTES 3309
86#define pqcrystals_dilithium3_avx2_PUBLICKEYBYTES pqcrystals_dilithium3_PUBLICKEYBYTES
87#define pqcrystals_dilithium3_avx2_SECRETKEYBYTES pqcrystals_dilithium3_SECRETKEYBYTES
88#define pqcrystals_dilithium3_avx2_BYTES pqcrystals_dilithium3_BYTES
90int pqcrystals_dilithium3_avx2_keypair(uint8_t *pk, uint8_t *sk);
92int pqcrystals_dilithium3_avx2_signature(uint8_t *sig,
size_t *siglen,
93 const uint8_t *m,
size_t mlen,
94 const uint8_t *ctx,
size_t ctxlen,
97int pqcrystals_dilithium3_avx2(uint8_t *sm,
size_t *smlen,
98 const uint8_t *m,
size_t mlen,
99 const uint8_t *ctx,
size_t ctxlen,
102int pqcrystals_dilithium3_avx2_verify(
const uint8_t *sig,
size_t siglen,
103 const uint8_t *m,
size_t mlen,
104 const uint8_t *ctx,
size_t ctxlen,
107int pqcrystals_dilithium3_avx2_open(uint8_t *m,
size_t *mlen,
108 const uint8_t *sm,
size_t smlen,
109 const uint8_t *ctx,
size_t ctxlen,
113#define pqcrystals_dilithium5_PUBLICKEYBYTES 2592
114#define pqcrystals_dilithium5_SECRETKEYBYTES 4896
115#define pqcrystals_dilithium5_BYTES 4627
117#define pqcrystals_dilithium5_avx2_PUBLICKEYBYTES pqcrystals_dilithium5_PUBLICKEYBYTES
118#define pqcrystals_dilithium5_avx2_SECRETKEYBYTES pqcrystals_dilithium5_SECRETKEYBYTES
119#define pqcrystals_dilithium5_avx2_BYTES pqcrystals_dilithium5_BYTES
121int pqcrystals_dilithium5_avx2_keypair(uint8_t *pk, uint8_t *sk);
123int pqcrystals_dilithium5_avx2_signature(uint8_t *sig,
size_t *siglen,
124 const uint8_t *m,
size_t mlen,
125 const uint8_t *ctx,
size_t ctxlen,
128int pqcrystals_dilithium5_avx2(uint8_t *sm,
size_t *smlen,
129 const uint8_t *m,
size_t mlen,
130 const uint8_t *ctx,
size_t ctxlen,
133int pqcrystals_dilithium5_avx2_verify(
const uint8_t *sig,
size_t siglen,
134 const uint8_t *m,
size_t mlen,
135 const uint8_t *ctx,
size_t ctxlen,
138int pqcrystals_dilithium5_avx2_open(uint8_t *m,
size_t *mlen,
139 const uint8_t *sm,
size_t smlen,
140 const uint8_t *ctx,
size_t ctxlen,
145#define SHAKE128_RATE 168
146#define SHAKE256_RATE 136
147#define SHA3_256_RATE 136
148#define SHA3_512_RATE 72
156#define KeccakF_RoundConstants FIPS202_NAMESPACE(KeccakF_RoundConstants)
157extern const uint64_t KeccakF_RoundConstants[];
160void shake128_absorb(
keccak_state *state,
const uint8_t *in,
size_t inlen);
162void shake128_squeeze(uint8_t *out,
size_t outlen,
keccak_state *state);
163void shake128_absorb_once(
keccak_state *state,
const uint8_t *in,
size_t inlen);
164void shake128_squeezeblocks(uint8_t *out,
size_t nblocks,
keccak_state *state);
166void shake256_absorb(
keccak_state *state,
const uint8_t *in,
size_t inlen);
168void shake256_squeeze(uint8_t *out,
size_t outlen,
keccak_state *state);
169void shake256_absorb_once(
keccak_state *state,
const uint8_t *in,
size_t inlen);
170void shake256_squeezeblocks(uint8_t *out,
size_t nblocks,
keccak_state *state);
171void shake128(uint8_t *out,
size_t outlen,
const uint8_t *in,
size_t inlen);
172void shake256(uint8_t *out,
size_t outlen,
const uint8_t *in,
size_t inlen);
173void sha3_256(uint8_t h[32],
const uint8_t *in,
size_t inlen);
174void sha3_512(uint8_t h[64],
const uint8_t *in,
size_t inlen);
182void f1600x4(__m256i *s,
const uint64_t *rc);
183void shake128x4_absorb_once(
keccakx4_state *state,
const uint8_t *in0,
const uint8_t *in1,
const uint8_t *in2,
const uint8_t *in3,
size_t inlen);
184void shake128x4_squeezeblocks(uint8_t *out0, uint8_t *out1, uint8_t *out2, uint8_t *out3,
size_t nblocks,
keccakx4_state *state);
185void shake256x4_absorb_once(
keccakx4_state *state,
const uint8_t *in0,
const uint8_t *in1,
const uint8_t *in2,
const uint8_t *in3,
size_t inlen);
186void shake256x4_squeezeblocks(uint8_t *out0, uint8_t *out1, uint8_t *out2, uint8_t *out3,
size_t nblocks,
keccakx4_state *state);
187void shake128x4(uint8_t *out0, uint8_t *out1, uint8_t *out2, uint8_t *out3,
size_t outlen,
const uint8_t *in0,
const uint8_t *in1,
const uint8_t *in2,
const uint8_t *in3,
size_t inlen);
188void shake256x4(uint8_t *out0, uint8_t *out1, uint8_t *out2, uint8_t *out3,
size_t outlen,
const uint8_t *in0,
const uint8_t *in1,
const uint8_t *in2,
const uint8_t *in3,
size_t inlen);
192typedef ALIGNED_INT32(N) poly;
194void poly_reduce(poly *a);
195void poly_caddq(poly *a);
196void poly_add(poly *c,
const poly *a,
const poly *b);
197void poly_sub(poly *c,
const poly *a,
const poly *b);
198void poly_shiftl(poly *a);
199void poly_ntt(poly *a);
200void poly_invntt_tomont(poly *a);
201void poly_nttunpack(poly *a);
202void poly_pointwise_montgomery(poly *c,
const poly *a,
const poly *b);
203void poly_power2round(poly *a1, poly *a0,
const poly *a);
204void poly_decompose(poly *a1, poly *a0,
const poly *a);
205unsigned int poly_make_hint(uint8_t hint[N],
const poly *a0,
const poly *a1);
206void poly_use_hint(poly *b,
const poly *a,
const poly *h);
207int poly_chknorm(
const poly *a, int32_t B);
208void poly_uniform_preinit(poly *a, stream128_state *state);
209void poly_uniform(poly *a,
const uint8_t seed[SEEDBYTES], uint16_t nonce);
210void poly_uniform_eta_preinit(poly *a, stream256_state *state);
211void poly_uniform_eta(poly *a,
const uint8_t seed[CRHBYTES], uint16_t nonce);
212void poly_uniform_gamma1_preinit(poly *a, stream256_state *state);
213void poly_uniform_gamma1(poly *a,
const uint8_t seed[CRHBYTES], uint16_t nonce);
214void poly_challenge(poly *c,
const uint8_t seed[CTILDEBYTES]);
215void poly_uniform_4x(poly *a0, poly *a1, poly *a2, poly *a3,
const uint8_t seed[SEEDBYTES], uint16_t nonce0, uint16_t nonce1, uint16_t nonce2, uint16_t nonce3);
216void poly_uniform_eta_4x(poly *a0, poly *a1, poly *a2, poly *a3,
const uint8_t seed[CRHBYTES], uint16_t nonce0, uint16_t nonce1, uint16_t nonce2, uint16_t nonce3);
217void poly_uniform_gamma1_4x(poly *a0, poly *a1, poly *a2, poly *a3,
const uint8_t seed[CRHBYTES], uint16_t nonce0, uint16_t nonce1, uint16_t nonce2, uint16_t nonce3);
218void polyeta_pack(uint8_t r[POLYETA_PACKEDBYTES],
const poly *a);
219void polyeta_unpack(poly *r,
const uint8_t a[POLYETA_PACKEDBYTES]);
220void polyt1_pack(uint8_t r[POLYT1_PACKEDBYTES],
const poly *a);
221void polyt1_unpack(poly *r,
const uint8_t a[POLYT1_PACKEDBYTES]);
222void polyt0_pack(uint8_t r[POLYT0_PACKEDBYTES],
const poly *a);
223void polyt0_unpack(poly *r,
const uint8_t a[POLYT0_PACKEDBYTES]);
224void polyz_pack(uint8_t r[POLYZ_PACKEDBYTES],
const poly *a);
225void polyz_unpack(poly *r,
const uint8_t *a);
226void polyw1_pack(uint8_t *r,
const poly *a);
235void polyvecl_uniform_eta(
polyvecl *v,
const uint8_t seed[CRHBYTES], uint16_t nonce);
236void polyvecl_uniform_gamma1(
polyvecl *v,
const uint8_t seed[CRHBYTES], uint16_t nonce);
240void polyvecl_invntt_tomont(
polyvecl *v);
241void polyvecl_pointwise_poly_montgomery(
polyvecl *r,
const poly *a,
const polyvecl *v);
242void polyvecl_pointwise_acc_montgomery(poly *w,
const polyvecl *u,
const polyvecl *v);
243int polyvecl_chknorm(
const polyvecl *v, int32_t B);
250void polyveck_uniform_eta(
polyveck *v,
const uint8_t seed[CRHBYTES], uint16_t nonce);
258void polyveck_invntt_tomont(
polyveck *v);
259void polyveck_pointwise_poly_montgomery(
polyveck *r,
const poly *a,
const polyveck *v);
260int polyveck_chknorm(
const polyveck *v, int32_t B);
263unsigned int polyveck_make_hint(uint8_t *hint,
const polyveck *v0,
const polyveck *v1);
265void polyveck_pack_w1(uint8_t r[K*POLYW1_PACKEDBYTES],
const polyveck *w1);
266void polyvec_matrix_expand(
polyvecl mat[K],
const uint8_t rho[SEEDBYTES]);
268void polyvec_matrix_expand_row0(
polyvecl *rowa,
polyvecl *rowb,
const uint8_t rho[SEEDBYTES]);
269void polyvec_matrix_expand_row1(
polyvecl *rowa,
polyvecl *rowb,
const uint8_t rho[SEEDBYTES]);
270void polyvec_matrix_expand_row2(
polyvecl *rowa,
polyvecl *rowb,
const uint8_t rho[SEEDBYTES]);
271void polyvec_matrix_expand_row3(
polyvecl *rowa,
polyvecl *rowb,
const uint8_t rho[SEEDBYTES]);
272void polyvec_matrix_expand_row4(
polyvecl *rowa,
polyvecl *rowb,
const uint8_t rho[SEEDBYTES]);
273void polyvec_matrix_expand_row5(
polyvecl *rowa,
polyvecl *rowb,
const uint8_t rho[SEEDBYTES]);
274void polyvec_matrix_expand_row6(
polyvecl *rowa,
polyvecl *rowb,
const uint8_t rho[SEEDBYTES]);
275void polyvec_matrix_expand_row7(
polyvecl *rowa,
polyvecl *rowb,
const uint8_t rho[SEEDBYTES]);
280void ntt_avx(__m256i *a,
const __m256i *qdata);
281void invntt_avx(__m256i *a,
const __m256i *qdata);
282void nttunpack_avx(__m256i *a);
283void pointwise_avx(__m256i *c,
const __m256i *a,
const __m256i *b,
const __m256i *qdata);
284void pointwise_acc_avx(__m256i *c,
const __m256i *a,
const __m256i *b,
const __m256i *qdata);
Contains common definitions for the Quantum Secure Cryptographic (QSC) library.
Definition dilithium_avx.h:151
Definition dilithium_avx.h:178
Definition dilithium_avx.h:246
Definition dilithium_avx.h:231