1 // SPDX-License-Identifier: MIT
2
3 #include <stdlib.h>
4
5 #include <oqs/kem_kyber.h>
6
7 #if defined(OQS_ENABLE_KEM_kyber_768_90s)
8
OQS_KEM_kyber_768_new()9 OQS_KEM *OQS_KEM_kyber_768_90s_new() {
10
11 OQS_KEM *kem = malloc(sizeof(OQS_KEM));
12 if (kem == NULL) {
13 return NULL;
14 }
15 kem->method_name = OQS_KEM_alg_kyber_768_90s;
16 kem->alg_version = "https://github.com/pq-crystals/kyber/commit/74cad307858b61e434490c75f812cb9b9ef7279b";
17
18 kem->claimed_nist_level = 3;
19 kem->ind_cca = true;
20
21 kem->length_public_key = OQS_KEM_kyber_768_90s_length_public_key;
22 kem->length_secret_key = OQS_KEM_kyber_768_90s_length_secret_key;
23 kem->length_ciphertext = OQS_KEM_kyber_768_90s_length_ciphertext;
24 kem->length_shared_secret = OQS_KEM_kyber_768_90s_length_shared_secret;
25
26 kem->keypair = OQS_KEM_kyber_768_90s_keypair;
27 kem->encaps = OQS_KEM_kyber_768_90s_encaps;
28 kem->decaps = OQS_KEM_kyber_768_90s_decaps;
29
30 return kem;
31 }
32
33 extern int pqcrystals_kyber768_90s_ref_keypair(uint8_t *pk, uint8_t *sk);
34 extern int pqcrystals_kyber768_90s_ref_enc(uint8_t *ct, uint8_t *ss, const uint8_t *pk);
35 extern int pqcrystals_kyber768_90s_ref_dec(uint8_t *ss, const uint8_t *ct, const uint8_t *sk);
36
37 #if defined(OQS_ENABLE_KEM_kyber_768_90s_avx2)
38 extern int pqcrystals_kyber768_90s_avx2_keypair(uint8_t *pk, uint8_t *sk);
39 extern int pqcrystals_kyber768_90s_avx2_enc(uint8_t *ct, uint8_t *ss, const uint8_t *pk);
40 extern int pqcrystals_kyber768_90s_avx2_dec(uint8_t *ss, const uint8_t *ct, const uint8_t *sk);
41 #endif
42
OQS_KEM_kyber_768_keypair(uint8_t * public_key,uint8_t * secret_key)43 OQS_API OQS_STATUS OQS_KEM_kyber_768_90s_keypair(uint8_t *public_key, uint8_t *secret_key) {
44 #if defined(OQS_ENABLE_KEM_kyber_768_90s_avx2)
45 #if defined(OQS_DIST_BUILD)
46 if (OQS_CPU_has_extension(OQS_CPU_EXT_AES) && OQS_CPU_has_extension(OQS_CPU_EXT_AVX2) && OQS_CPU_has_extension(OQS_CPU_EXT_BMI2) && OQS_CPU_has_extension(OQS_CPU_EXT_POPCNT)) {
47 #endif /* OQS_DIST_BUILD */
48 return (OQS_STATUS) pqcrystals_kyber768_90s_avx2_keypair(public_key, secret_key);
49 #if defined(OQS_DIST_BUILD)
50 } else {
51 return (OQS_STATUS) pqcrystals_kyber768_90s_ref_keypair(public_key, secret_key);
52 }
53 #endif /* OQS_DIST_BUILD */
54 #else
55 return (OQS_STATUS) pqcrystals_kyber768_90s_ref_keypair(public_key, secret_key);
56 #endif
57 }
58
OQS_KEM_kyber_768_encaps(uint8_t * ciphertext,uint8_t * shared_secret,const uint8_t * public_key)59 OQS_API OQS_STATUS OQS_KEM_kyber_768_90s_encaps(uint8_t *ciphertext, uint8_t *shared_secret, const uint8_t *public_key) {
60 #if defined(OQS_ENABLE_KEM_kyber_768_90s_avx2)
61 #if defined(OQS_DIST_BUILD)
62 if (OQS_CPU_has_extension(OQS_CPU_EXT_AES) && OQS_CPU_has_extension(OQS_CPU_EXT_AVX2) && OQS_CPU_has_extension(OQS_CPU_EXT_BMI2) && OQS_CPU_has_extension(OQS_CPU_EXT_POPCNT)) {
63 #endif /* OQS_DIST_BUILD */
64 return (OQS_STATUS) pqcrystals_kyber768_90s_avx2_enc(ciphertext, shared_secret, public_key);
65 #if defined(OQS_DIST_BUILD)
66 } else {
67 return (OQS_STATUS) pqcrystals_kyber768_90s_ref_enc(ciphertext, shared_secret, public_key);
68 }
69 #endif /* OQS_DIST_BUILD */
70 #else
71 return (OQS_STATUS) pqcrystals_kyber768_90s_ref_enc(ciphertext, shared_secret, public_key);
72 #endif
73 }
74
OQS_KEM_kyber_768_decaps(uint8_t * shared_secret,const uint8_t * ciphertext,const uint8_t * secret_key)75 OQS_API OQS_STATUS OQS_KEM_kyber_768_90s_decaps(uint8_t *shared_secret, const uint8_t *ciphertext, const uint8_t *secret_key) {
76 #if defined(OQS_ENABLE_KEM_kyber_768_90s_avx2)
77 #if defined(OQS_DIST_BUILD)
78 if (OQS_CPU_has_extension(OQS_CPU_EXT_AES) && OQS_CPU_has_extension(OQS_CPU_EXT_AVX2) && OQS_CPU_has_extension(OQS_CPU_EXT_BMI2) && OQS_CPU_has_extension(OQS_CPU_EXT_POPCNT)) {
79 #endif /* OQS_DIST_BUILD */
80 return (OQS_STATUS) pqcrystals_kyber768_90s_avx2_dec(shared_secret, ciphertext, secret_key);
81 #if defined(OQS_DIST_BUILD)
82 } else {
83 return (OQS_STATUS) pqcrystals_kyber768_90s_ref_dec(shared_secret, ciphertext, secret_key);
84 }
85 #endif /* OQS_DIST_BUILD */
86 #else
87 return (OQS_STATUS) pqcrystals_kyber768_90s_ref_dec(shared_secret, ciphertext, secret_key);
88 #endif
89 }
90
91 #endif
92