summaryrefslogtreecommitdiff
path: root/lib/liboqs/src/kem/kem.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/liboqs/src/kem/kem.c')
-rw-r--r--lib/liboqs/src/kem/kem.c457
1 files changed, 457 insertions, 0 deletions
diff --git a/lib/liboqs/src/kem/kem.c b/lib/liboqs/src/kem/kem.c
new file mode 100644
index 000000000..97a79025a
--- /dev/null
+++ b/lib/liboqs/src/kem/kem.c
@@ -0,0 +1,457 @@
+// SPDX-License-Identifier: MIT
+
+#include <assert.h>
+#include <stdlib.h>
+#if defined(_WIN32)
+#include <string.h>
+#define strcasecmp _stricmp
+#else
+#include <strings.h>
+#endif
+
+#include <oqs/oqs.h>
+
+OQS_API const char *OQS_KEM_alg_identifier(size_t i) {
+ // EDIT-WHEN-ADDING-KEM
+ const char *a[OQS_KEM_algs_length] = {
+ OQS_KEM_alg_bike_l1,
+ OQS_KEM_alg_bike_l3,
+ OQS_KEM_alg_bike_l5,
+ ///// OQS_COPY_FROM_UPSTREAM_FRAGMENT_ALG_IDENTIFIER_START
+ OQS_KEM_alg_classic_mceliece_348864,
+ OQS_KEM_alg_classic_mceliece_348864f,
+ OQS_KEM_alg_classic_mceliece_460896,
+ OQS_KEM_alg_classic_mceliece_460896f,
+ OQS_KEM_alg_classic_mceliece_6688128,
+ OQS_KEM_alg_classic_mceliece_6688128f,
+ OQS_KEM_alg_classic_mceliece_6960119,
+ OQS_KEM_alg_classic_mceliece_6960119f,
+ OQS_KEM_alg_classic_mceliece_8192128,
+ OQS_KEM_alg_classic_mceliece_8192128f,
+ OQS_KEM_alg_hqc_128,
+ OQS_KEM_alg_hqc_192,
+ OQS_KEM_alg_hqc_256,
+ OQS_KEM_alg_kyber_512,
+ OQS_KEM_alg_kyber_768,
+ OQS_KEM_alg_kyber_1024,
+ OQS_KEM_alg_kyber_512_90s,
+ OQS_KEM_alg_kyber_768_90s,
+ OQS_KEM_alg_kyber_1024_90s,
+ ///// OQS_COPY_FROM_UPSTREAM_FRAGMENT_ALG_IDENTIFIER_END
+ OQS_KEM_alg_ntruprime_sntrup761,
+ OQS_KEM_alg_frodokem_640_aes,
+ OQS_KEM_alg_frodokem_640_shake,
+ OQS_KEM_alg_frodokem_976_aes,
+ OQS_KEM_alg_frodokem_976_shake,
+ OQS_KEM_alg_frodokem_1344_aes,
+ OQS_KEM_alg_frodokem_1344_shake,
+ };
+ if (i >= OQS_KEM_algs_length) {
+ return NULL;
+ } else {
+ return a[i];
+ }
+}
+
+OQS_API int OQS_KEM_alg_count(void) {
+ return OQS_KEM_algs_length;
+}
+
+OQS_API int OQS_KEM_alg_is_enabled(const char *method_name) {
+ if (method_name == NULL) {
+ return 0;
+ } else if (0 == strcasecmp(method_name, OQS_KEM_alg_bike_l1)) {
+#ifdef OQS_ENABLE_KEM_bike_l1
+ return 1;
+#else
+ return 0;
+#endif
+ } else if (0 == strcasecmp(method_name, OQS_KEM_alg_bike_l3)) {
+#ifdef OQS_ENABLE_KEM_bike_l3
+ return 1;
+#else
+ return 0;
+#endif
+ } else if (0 == strcasecmp(method_name, OQS_KEM_alg_bike_l5)) {
+#ifdef OQS_ENABLE_KEM_bike_l5
+ return 1;
+#else
+ return 0;
+#endif
+ ///// OQS_COPY_FROM_UPSTREAM_FRAGMENT_ENABLED_CASE_START
+ } else if (0 == strcasecmp(method_name, OQS_KEM_alg_classic_mceliece_348864)) {
+#ifdef OQS_ENABLE_KEM_classic_mceliece_348864
+ return 1;
+#else
+ return 0;
+#endif
+ } else if (0 == strcasecmp(method_name, OQS_KEM_alg_classic_mceliece_348864f)) {
+#ifdef OQS_ENABLE_KEM_classic_mceliece_348864f
+ return 1;
+#else
+ return 0;
+#endif
+ } else if (0 == strcasecmp(method_name, OQS_KEM_alg_classic_mceliece_460896)) {
+#ifdef OQS_ENABLE_KEM_classic_mceliece_460896
+ return 1;
+#else
+ return 0;
+#endif
+ } else if (0 == strcasecmp(method_name, OQS_KEM_alg_classic_mceliece_460896f)) {
+#ifdef OQS_ENABLE_KEM_classic_mceliece_460896f
+ return 1;
+#else
+ return 0;
+#endif
+ } else if (0 == strcasecmp(method_name, OQS_KEM_alg_classic_mceliece_6688128)) {
+#ifdef OQS_ENABLE_KEM_classic_mceliece_6688128
+ return 1;
+#else
+ return 0;
+#endif
+ } else if (0 == strcasecmp(method_name, OQS_KEM_alg_classic_mceliece_6688128f)) {
+#ifdef OQS_ENABLE_KEM_classic_mceliece_6688128f
+ return 1;
+#else
+ return 0;
+#endif
+ } else if (0 == strcasecmp(method_name, OQS_KEM_alg_classic_mceliece_6960119)) {
+#ifdef OQS_ENABLE_KEM_classic_mceliece_6960119
+ return 1;
+#else
+ return 0;
+#endif
+ } else if (0 == strcasecmp(method_name, OQS_KEM_alg_classic_mceliece_6960119f)) {
+#ifdef OQS_ENABLE_KEM_classic_mceliece_6960119f
+ return 1;
+#else
+ return 0;
+#endif
+ } else if (0 == strcasecmp(method_name, OQS_KEM_alg_classic_mceliece_8192128)) {
+#ifdef OQS_ENABLE_KEM_classic_mceliece_8192128
+ return 1;
+#else
+ return 0;
+#endif
+ } else if (0 == strcasecmp(method_name, OQS_KEM_alg_classic_mceliece_8192128f)) {
+#ifdef OQS_ENABLE_KEM_classic_mceliece_8192128f
+ return 1;
+#else
+ return 0;
+#endif
+ } else if (0 == strcasecmp(method_name, OQS_KEM_alg_hqc_128)) {
+#ifdef OQS_ENABLE_KEM_hqc_128
+ return 1;
+#else
+ return 0;
+#endif
+ } else if (0 == strcasecmp(method_name, OQS_KEM_alg_hqc_192)) {
+#ifdef OQS_ENABLE_KEM_hqc_192
+ return 1;
+#else
+ return 0;
+#endif
+ } else if (0 == strcasecmp(method_name, OQS_KEM_alg_hqc_256)) {
+#ifdef OQS_ENABLE_KEM_hqc_256
+ return 1;
+#else
+ return 0;
+#endif
+ } else if (0 == strcasecmp(method_name, OQS_KEM_alg_kyber_512)) {
+#ifdef OQS_ENABLE_KEM_kyber_512
+ return 1;
+#else
+ return 0;
+#endif
+ } else if (0 == strcasecmp(method_name, OQS_KEM_alg_kyber_768)) {
+#ifdef OQS_ENABLE_KEM_kyber_768
+ return 1;
+#else
+ return 0;
+#endif
+ } else if (0 == strcasecmp(method_name, OQS_KEM_alg_kyber_1024)) {
+#ifdef OQS_ENABLE_KEM_kyber_1024
+ return 1;
+#else
+ return 0;
+#endif
+ } else if (0 == strcasecmp(method_name, OQS_KEM_alg_kyber_512_90s)) {
+#ifdef OQS_ENABLE_KEM_kyber_512_90s
+ return 1;
+#else
+ return 0;
+#endif
+ } else if (0 == strcasecmp(method_name, OQS_KEM_alg_kyber_768_90s)) {
+#ifdef OQS_ENABLE_KEM_kyber_768_90s
+ return 1;
+#else
+ return 0;
+#endif
+ } else if (0 == strcasecmp(method_name, OQS_KEM_alg_kyber_1024_90s)) {
+#ifdef OQS_ENABLE_KEM_kyber_1024_90s
+ return 1;
+#else
+ return 0;
+#endif
+ ///// OQS_COPY_FROM_UPSTREAM_FRAGMENT_ENABLED_CASE_END
+ } else if (0 == strcasecmp(method_name, OQS_KEM_alg_ntruprime_sntrup761)) {
+#ifdef OQS_ENABLE_KEM_ntruprime_sntrup761
+ return 1;
+#else
+ return 0;
+#endif
+ } else if (0 == strcasecmp(method_name, OQS_KEM_alg_frodokem_640_aes)) {
+#ifdef OQS_ENABLE_KEM_frodokem_640_aes
+ return 1;
+#else
+ return 0;
+#endif
+ } else if (0 == strcasecmp(method_name, OQS_KEM_alg_frodokem_640_shake)) {
+#ifdef OQS_ENABLE_KEM_frodokem_640_shake
+ return 1;
+#else
+ return 0;
+#endif
+ } else if (0 == strcasecmp(method_name, OQS_KEM_alg_frodokem_976_aes)) {
+#ifdef OQS_ENABLE_KEM_frodokem_976_aes
+ return 1;
+#else
+ return 0;
+#endif
+ } else if (0 == strcasecmp(method_name, OQS_KEM_alg_frodokem_976_shake)) {
+#ifdef OQS_ENABLE_KEM_frodokem_976_shake
+ return 1;
+#else
+ return 0;
+#endif
+ } else if (0 == strcasecmp(method_name, OQS_KEM_alg_frodokem_1344_aes)) {
+#ifdef OQS_ENABLE_KEM_frodokem_1344_aes
+ return 1;
+#else
+ return 0;
+#endif
+ } else if (0 == strcasecmp(method_name, OQS_KEM_alg_frodokem_1344_shake)) {
+#ifdef OQS_ENABLE_KEM_frodokem_1344_shake
+ return 1;
+#else
+ return 0;
+#endif
+ // EDIT-WHEN-ADDING-KEM
+ } else {
+ return 0;
+ }
+}
+
+OQS_API OQS_KEM *OQS_KEM_new(const char *method_name) {
+ if (method_name == NULL) {
+ return NULL;
+ }
+ if (0 == strcasecmp(method_name, OQS_KEM_alg_bike_l1)) {
+#ifdef OQS_ENABLE_KEM_bike_l1
+ return OQS_KEM_bike_l1_new();
+#else
+ return NULL;
+#endif
+ } else if (0 == strcasecmp(method_name, OQS_KEM_alg_bike_l3)) {
+#ifdef OQS_ENABLE_KEM_bike_l3
+ return OQS_KEM_bike_l3_new();
+#else
+ return NULL;
+#endif
+ } else if (0 == strcasecmp(method_name, OQS_KEM_alg_bike_l5)) {
+#ifdef OQS_ENABLE_KEM_bike_l5
+ return OQS_KEM_bike_l5_new();
+#else
+ return NULL;
+#endif
+ ///// OQS_COPY_FROM_UPSTREAM_FRAGMENT_NEW_CASE_START
+ } else if (0 == strcasecmp(method_name, OQS_KEM_alg_classic_mceliece_348864)) {
+#ifdef OQS_ENABLE_KEM_classic_mceliece_348864
+ return OQS_KEM_classic_mceliece_348864_new();
+#else
+ return NULL;
+#endif
+ } else if (0 == strcasecmp(method_name, OQS_KEM_alg_classic_mceliece_348864f)) {
+#ifdef OQS_ENABLE_KEM_classic_mceliece_348864f
+ return OQS_KEM_classic_mceliece_348864f_new();
+#else
+ return NULL;
+#endif
+ } else if (0 == strcasecmp(method_name, OQS_KEM_alg_classic_mceliece_460896)) {
+#ifdef OQS_ENABLE_KEM_classic_mceliece_460896
+ return OQS_KEM_classic_mceliece_460896_new();
+#else
+ return NULL;
+#endif
+ } else if (0 == strcasecmp(method_name, OQS_KEM_alg_classic_mceliece_460896f)) {
+#ifdef OQS_ENABLE_KEM_classic_mceliece_460896f
+ return OQS_KEM_classic_mceliece_460896f_new();
+#else
+ return NULL;
+#endif
+ } else if (0 == strcasecmp(method_name, OQS_KEM_alg_classic_mceliece_6688128)) {
+#ifdef OQS_ENABLE_KEM_classic_mceliece_6688128
+ return OQS_KEM_classic_mceliece_6688128_new();
+#else
+ return NULL;
+#endif
+ } else if (0 == strcasecmp(method_name, OQS_KEM_alg_classic_mceliece_6688128f)) {
+#ifdef OQS_ENABLE_KEM_classic_mceliece_6688128f
+ return OQS_KEM_classic_mceliece_6688128f_new();
+#else
+ return NULL;
+#endif
+ } else if (0 == strcasecmp(method_name, OQS_KEM_alg_classic_mceliece_6960119)) {
+#ifdef OQS_ENABLE_KEM_classic_mceliece_6960119
+ return OQS_KEM_classic_mceliece_6960119_new();
+#else
+ return NULL;
+#endif
+ } else if (0 == strcasecmp(method_name, OQS_KEM_alg_classic_mceliece_6960119f)) {
+#ifdef OQS_ENABLE_KEM_classic_mceliece_6960119f
+ return OQS_KEM_classic_mceliece_6960119f_new();
+#else
+ return NULL;
+#endif
+ } else if (0 == strcasecmp(method_name, OQS_KEM_alg_classic_mceliece_8192128)) {
+#ifdef OQS_ENABLE_KEM_classic_mceliece_8192128
+ return OQS_KEM_classic_mceliece_8192128_new();
+#else
+ return NULL;
+#endif
+ } else if (0 == strcasecmp(method_name, OQS_KEM_alg_classic_mceliece_8192128f)) {
+#ifdef OQS_ENABLE_KEM_classic_mceliece_8192128f
+ return OQS_KEM_classic_mceliece_8192128f_new();
+#else
+ return NULL;
+#endif
+ } else if (0 == strcasecmp(method_name, OQS_KEM_alg_hqc_128)) {
+#ifdef OQS_ENABLE_KEM_hqc_128
+ return OQS_KEM_hqc_128_new();
+#else
+ return NULL;
+#endif
+ } else if (0 == strcasecmp(method_name, OQS_KEM_alg_hqc_192)) {
+#ifdef OQS_ENABLE_KEM_hqc_192
+ return OQS_KEM_hqc_192_new();
+#else
+ return NULL;
+#endif
+ } else if (0 == strcasecmp(method_name, OQS_KEM_alg_hqc_256)) {
+#ifdef OQS_ENABLE_KEM_hqc_256
+ return OQS_KEM_hqc_256_new();
+#else
+ return NULL;
+#endif
+ } else if (0 == strcasecmp(method_name, OQS_KEM_alg_kyber_512)) {
+#ifdef OQS_ENABLE_KEM_kyber_512
+ return OQS_KEM_kyber_512_new();
+#else
+ return NULL;
+#endif
+ } else if (0 == strcasecmp(method_name, OQS_KEM_alg_kyber_768)) {
+#ifdef OQS_ENABLE_KEM_kyber_768
+ return OQS_KEM_kyber_768_new();
+#else
+ return NULL;
+#endif
+ } else if (0 == strcasecmp(method_name, OQS_KEM_alg_kyber_1024)) {
+#ifdef OQS_ENABLE_KEM_kyber_1024
+ return OQS_KEM_kyber_1024_new();
+#else
+ return NULL;
+#endif
+ } else if (0 == strcasecmp(method_name, OQS_KEM_alg_kyber_512_90s)) {
+#ifdef OQS_ENABLE_KEM_kyber_512_90s
+ return OQS_KEM_kyber_512_90s_new();
+#else
+ return NULL;
+#endif
+ } else if (0 == strcasecmp(method_name, OQS_KEM_alg_kyber_768_90s)) {
+#ifdef OQS_ENABLE_KEM_kyber_768_90s
+ return OQS_KEM_kyber_768_90s_new();
+#else
+ return NULL;
+#endif
+ } else if (0 == strcasecmp(method_name, OQS_KEM_alg_kyber_1024_90s)) {
+#ifdef OQS_ENABLE_KEM_kyber_1024_90s
+ return OQS_KEM_kyber_1024_90s_new();
+#else
+ return NULL;
+#endif
+ ///// OQS_COPY_FROM_UPSTREAM_FRAGMENT_NEW_CASE_END
+ } else if (0 == strcasecmp(method_name, OQS_KEM_alg_ntruprime_sntrup761)) {
+#ifdef OQS_ENABLE_KEM_ntruprime_sntrup761
+ return OQS_KEM_ntruprime_sntrup761_new();
+#else
+ return NULL;
+#endif
+ } else if (0 == strcasecmp(method_name, OQS_KEM_alg_frodokem_640_aes)) {
+#ifdef OQS_ENABLE_KEM_frodokem_640_aes
+ return OQS_KEM_frodokem_640_aes_new();
+#else
+ return NULL;
+#endif
+ } else if (0 == strcasecmp(method_name, OQS_KEM_alg_frodokem_640_shake)) {
+#ifdef OQS_ENABLE_KEM_frodokem_640_shake
+ return OQS_KEM_frodokem_640_shake_new();
+#else
+ return NULL;
+#endif
+ } else if (0 == strcasecmp(method_name, OQS_KEM_alg_frodokem_976_aes)) {
+#ifdef OQS_ENABLE_KEM_frodokem_976_aes
+ return OQS_KEM_frodokem_976_aes_new();
+#else
+ return NULL;
+#endif
+ } else if (0 == strcasecmp(method_name, OQS_KEM_alg_frodokem_976_shake)) {
+#ifdef OQS_ENABLE_KEM_frodokem_976_shake
+ return OQS_KEM_frodokem_976_shake_new();
+#else
+ return NULL;
+#endif
+ } else if (0 == strcasecmp(method_name, OQS_KEM_alg_frodokem_1344_aes)) {
+#ifdef OQS_ENABLE_KEM_frodokem_1344_aes
+ return OQS_KEM_frodokem_1344_aes_new();
+#else
+ return NULL;
+#endif
+ } else if (0 == strcasecmp(method_name, OQS_KEM_alg_frodokem_1344_shake)) {
+#ifdef OQS_ENABLE_KEM_frodokem_1344_shake
+ return OQS_KEM_frodokem_1344_shake_new();
+#else
+ return NULL;
+#endif
+ // EDIT-WHEN-ADDING-KEM
+ } else {
+ return NULL;
+ }
+}
+
+OQS_API OQS_STATUS OQS_KEM_keypair(const OQS_KEM *kem, uint8_t *public_key, uint8_t *secret_key) {
+ if (kem == NULL) {
+ return OQS_ERROR;
+ } else {
+ return kem->keypair(public_key, secret_key);
+ }
+}
+
+OQS_API OQS_STATUS OQS_KEM_encaps(const OQS_KEM *kem, uint8_t *ciphertext, uint8_t *shared_secret, const uint8_t *public_key) {
+ if (kem == NULL) {
+ return OQS_ERROR;
+ } else {
+ return kem->encaps(ciphertext, shared_secret, public_key);
+ }
+}
+
+OQS_API OQS_STATUS OQS_KEM_decaps(const OQS_KEM *kem, uint8_t *shared_secret, const uint8_t *ciphertext, const uint8_t *secret_key) {
+ if (kem == NULL) {
+ return OQS_ERROR;
+ } else {
+ return kem->decaps(shared_secret, ciphertext, secret_key);
+ }
+}
+
+OQS_API void OQS_KEM_free(OQS_KEM *kem) {
+ OQS_MEM_insecure_free(kem);
+}