1 /* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
2  * SPDX-License-Identifier: Apache-2.0"
3  *
4  * Written by Nir Drucker, Shay Gueron and Dusan Kostic,
5  * AWS Cryptographic Algorithms Group.
6  */
7 
8 #pragma once
9 
10 #include "pq-crypto/s2n_pq.h"
11 #include "defs.h"
12 #include "types.h"
13 
14 void secure_set_bits_port(OUT pad_r_t *r,
15                           IN size_t    first_pos,
16                           IN const idx_t *wlist,
17                           IN size_t       w_size);
18 
19 // Compares wlist[ctr] to w[i] for all i < ctr.
20 // Returns 0 if wlist[ctr] is contained in wlist, returns 1 otherwise.
21 int is_new_port(IN const idx_t *wlist, IN const size_t ctr);
22 
23 #if defined(S2N_BIKE_R3_AVX2)
24 void secure_set_bits_avx2(OUT pad_r_t *r,
25                           IN size_t    first_pos,
26                           IN const idx_t *wlist,
27                           IN size_t       w_size);
28 
29 int is_new_avx2(IN const idx_t *wlist, IN const size_t ctr);
30 #endif
31 
32 #if defined(S2N_BIKE_R3_AVX512)
33 void secure_set_bits_avx512(OUT pad_r_t *r,
34                             IN size_t    first_pos,
35                             IN const idx_t *wlist,
36                             IN size_t       w_size);
37 int is_new_avx512(IN const idx_t *wlist, IN const size_t ctr);
38 #endif
39 
40 typedef struct sampling_ctx_st {
41   void (*secure_set_bits)(OUT pad_r_t *r,
42                           IN size_t    first_pos,
43                           IN const idx_t *wlist,
44                           IN size_t       w_size);
45   int (*is_new)(IN const idx_t *wlist, IN const size_t ctr);
46 } sampling_ctx;
47 
sampling_ctx_init(sampling_ctx * ctx)48 _INLINE_ void sampling_ctx_init(sampling_ctx *ctx)
49 {
50 #if defined(S2N_BIKE_R3_AVX512)
51   if(s2n_bike_r3_is_avx512_enabled()) {
52     ctx->secure_set_bits = secure_set_bits_avx512;
53     ctx->is_new          = is_new_avx512;
54   } else
55 #endif
56 #if defined(S2N_BIKE_R3_AVX2)
57   if(s2n_bike_r3_is_avx2_enabled()) {
58     ctx->secure_set_bits = secure_set_bits_avx2;
59     ctx->is_new          = is_new_avx2;
60   } else
61 #endif
62   {
63     ctx->secure_set_bits = secure_set_bits_port;
64     ctx->is_new          = is_new_port;
65   }
66 }
67