blob: ae4147838731a42d438a1f98e436653a319e7ad8 [file] [log] [blame]
// 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_SIG_alg_identifier(size_t i) {
// EDIT-WHEN-ADDING-SIG
const char *a[OQS_SIG_algs_length] = {
///// OQS_COPY_FROM_UPSTREAM_FRAGMENT_ALG_IDENTIFIER_START
OQS_SIG_alg_dilithium_2,
OQS_SIG_alg_dilithium_3,
OQS_SIG_alg_dilithium_5,
OQS_SIG_alg_ml_dsa_44_ipd,
OQS_SIG_alg_ml_dsa_44,
OQS_SIG_alg_ml_dsa_65_ipd,
OQS_SIG_alg_ml_dsa_65,
OQS_SIG_alg_ml_dsa_87_ipd,
OQS_SIG_alg_ml_dsa_87,
OQS_SIG_alg_falcon_512,
OQS_SIG_alg_falcon_1024,
OQS_SIG_alg_falcon_padded_512,
OQS_SIG_alg_falcon_padded_1024,
OQS_SIG_alg_sphincs_sha2_128f_simple,
OQS_SIG_alg_sphincs_sha2_128s_simple,
OQS_SIG_alg_sphincs_sha2_192f_simple,
OQS_SIG_alg_sphincs_sha2_192s_simple,
OQS_SIG_alg_sphincs_sha2_256f_simple,
OQS_SIG_alg_sphincs_sha2_256s_simple,
OQS_SIG_alg_sphincs_shake_128f_simple,
OQS_SIG_alg_sphincs_shake_128s_simple,
OQS_SIG_alg_sphincs_shake_192f_simple,
OQS_SIG_alg_sphincs_shake_192s_simple,
OQS_SIG_alg_sphincs_shake_256f_simple,
OQS_SIG_alg_sphincs_shake_256s_simple,///// OQS_COPY_FROM_UPSTREAM_FRAGMENT_ALG_IDENTIFIER_END
};
if (i >= OQS_SIG_algs_length) {
return NULL;
} else {
return a[i];
}
}
OQS_API int OQS_SIG_alg_count(void) {
return OQS_SIG_algs_length;
}
OQS_API int OQS_SIG_alg_is_enabled(const char *method_name) {
if (method_name == NULL) {
return 0;
}
if (0) {
///// OQS_COPY_FROM_UPSTREAM_FRAGMENT_ENABLED_CASE_START
} else if (0 == strcasecmp(method_name, OQS_SIG_alg_dilithium_2)) {
#ifdef OQS_ENABLE_SIG_dilithium_2
return 1;
#else
return 0;
#endif
} else if (0 == strcasecmp(method_name, OQS_SIG_alg_dilithium_3)) {
#ifdef OQS_ENABLE_SIG_dilithium_3
return 1;
#else
return 0;
#endif
} else if (0 == strcasecmp(method_name, OQS_SIG_alg_dilithium_5)) {
#ifdef OQS_ENABLE_SIG_dilithium_5
return 1;
#else
return 0;
#endif
} else if (0 == strcasecmp(method_name, OQS_SIG_alg_ml_dsa_44_ipd)) {
#ifdef OQS_ENABLE_SIG_ml_dsa_44_ipd
return 1;
#else
return 0;
#endif
} else if (0 == strcasecmp(method_name, OQS_SIG_alg_ml_dsa_44)) {
#ifdef OQS_ENABLE_SIG_ml_dsa_44
return 1;
#else
return 0;
#endif
} else if (0 == strcasecmp(method_name, OQS_SIG_alg_ml_dsa_65_ipd)) {
#ifdef OQS_ENABLE_SIG_ml_dsa_65_ipd
return 1;
#else
return 0;
#endif
} else if (0 == strcasecmp(method_name, OQS_SIG_alg_ml_dsa_65)) {
#ifdef OQS_ENABLE_SIG_ml_dsa_65
return 1;
#else
return 0;
#endif
} else if (0 == strcasecmp(method_name, OQS_SIG_alg_ml_dsa_87_ipd)) {
#ifdef OQS_ENABLE_SIG_ml_dsa_87_ipd
return 1;
#else
return 0;
#endif
} else if (0 == strcasecmp(method_name, OQS_SIG_alg_ml_dsa_87)) {
#ifdef OQS_ENABLE_SIG_ml_dsa_87
return 1;
#else
return 0;
#endif
} else if (0 == strcasecmp(method_name, OQS_SIG_alg_falcon_512)) {
#ifdef OQS_ENABLE_SIG_falcon_512
return 1;
#else
return 0;
#endif
} else if (0 == strcasecmp(method_name, OQS_SIG_alg_falcon_1024)) {
#ifdef OQS_ENABLE_SIG_falcon_1024
return 1;
#else
return 0;
#endif
} else if (0 == strcasecmp(method_name, OQS_SIG_alg_falcon_padded_512)) {
#ifdef OQS_ENABLE_SIG_falcon_padded_512
return 1;
#else
return 0;
#endif
} else if (0 == strcasecmp(method_name, OQS_SIG_alg_falcon_padded_1024)) {
#ifdef OQS_ENABLE_SIG_falcon_padded_1024
return 1;
#else
return 0;
#endif
} else if (0 == strcasecmp(method_name, OQS_SIG_alg_sphincs_sha2_128f_simple)) {
#ifdef OQS_ENABLE_SIG_sphincs_sha2_128f_simple
return 1;
#else
return 0;
#endif
} else if (0 == strcasecmp(method_name, OQS_SIG_alg_sphincs_sha2_128s_simple)) {
#ifdef OQS_ENABLE_SIG_sphincs_sha2_128s_simple
return 1;
#else
return 0;
#endif
} else if (0 == strcasecmp(method_name, OQS_SIG_alg_sphincs_sha2_192f_simple)) {
#ifdef OQS_ENABLE_SIG_sphincs_sha2_192f_simple
return 1;
#else
return 0;
#endif
} else if (0 == strcasecmp(method_name, OQS_SIG_alg_sphincs_sha2_192s_simple)) {
#ifdef OQS_ENABLE_SIG_sphincs_sha2_192s_simple
return 1;
#else
return 0;
#endif
} else if (0 == strcasecmp(method_name, OQS_SIG_alg_sphincs_sha2_256f_simple)) {
#ifdef OQS_ENABLE_SIG_sphincs_sha2_256f_simple
return 1;
#else
return 0;
#endif
} else if (0 == strcasecmp(method_name, OQS_SIG_alg_sphincs_sha2_256s_simple)) {
#ifdef OQS_ENABLE_SIG_sphincs_sha2_256s_simple
return 1;
#else
return 0;
#endif
} else if (0 == strcasecmp(method_name, OQS_SIG_alg_sphincs_shake_128f_simple)) {
#ifdef OQS_ENABLE_SIG_sphincs_shake_128f_simple
return 1;
#else
return 0;
#endif
} else if (0 == strcasecmp(method_name, OQS_SIG_alg_sphincs_shake_128s_simple)) {
#ifdef OQS_ENABLE_SIG_sphincs_shake_128s_simple
return 1;
#else
return 0;
#endif
} else if (0 == strcasecmp(method_name, OQS_SIG_alg_sphincs_shake_192f_simple)) {
#ifdef OQS_ENABLE_SIG_sphincs_shake_192f_simple
return 1;
#else
return 0;
#endif
} else if (0 == strcasecmp(method_name, OQS_SIG_alg_sphincs_shake_192s_simple)) {
#ifdef OQS_ENABLE_SIG_sphincs_shake_192s_simple
return 1;
#else
return 0;
#endif
} else if (0 == strcasecmp(method_name, OQS_SIG_alg_sphincs_shake_256f_simple)) {
#ifdef OQS_ENABLE_SIG_sphincs_shake_256f_simple
return 1;
#else
return 0;
#endif
} else if (0 == strcasecmp(method_name, OQS_SIG_alg_sphincs_shake_256s_simple)) {
#ifdef OQS_ENABLE_SIG_sphincs_shake_256s_simple
return 1;
#else
return 0;
#endif
///// OQS_COPY_FROM_UPSTREAM_FRAGMENT_ENABLED_CASE_END
} else {
return 0;
}
}
OQS_API OQS_SIG *OQS_SIG_new(const char *method_name) {
if (method_name == NULL) {
return NULL;
}
if (0) {
///// OQS_COPY_FROM_UPSTREAM_FRAGMENT_NEW_CASE_START
} else if (0 == strcasecmp(method_name, OQS_SIG_alg_dilithium_2)) {
#ifdef OQS_ENABLE_SIG_dilithium_2
return OQS_SIG_dilithium_2_new();
#else
return NULL;
#endif
} else if (0 == strcasecmp(method_name, OQS_SIG_alg_dilithium_3)) {
#ifdef OQS_ENABLE_SIG_dilithium_3
return OQS_SIG_dilithium_3_new();
#else
return NULL;
#endif
} else if (0 == strcasecmp(method_name, OQS_SIG_alg_dilithium_5)) {
#ifdef OQS_ENABLE_SIG_dilithium_5
return OQS_SIG_dilithium_5_new();
#else
return NULL;
#endif
} else if (0 == strcasecmp(method_name, OQS_SIG_alg_ml_dsa_44_ipd)) {
#ifdef OQS_ENABLE_SIG_ml_dsa_44_ipd
return OQS_SIG_ml_dsa_44_ipd_new();
#else
return NULL;
#endif
} else if (0 == strcasecmp(method_name, OQS_SIG_alg_ml_dsa_44)) {
#ifdef OQS_ENABLE_SIG_ml_dsa_44
return OQS_SIG_ml_dsa_44_new();
#else
return NULL;
#endif
} else if (0 == strcasecmp(method_name, OQS_SIG_alg_ml_dsa_65_ipd)) {
#ifdef OQS_ENABLE_SIG_ml_dsa_65_ipd
return OQS_SIG_ml_dsa_65_ipd_new();
#else
return NULL;
#endif
} else if (0 == strcasecmp(method_name, OQS_SIG_alg_ml_dsa_65)) {
#ifdef OQS_ENABLE_SIG_ml_dsa_65
return OQS_SIG_ml_dsa_65_new();
#else
return NULL;
#endif
} else if (0 == strcasecmp(method_name, OQS_SIG_alg_ml_dsa_87_ipd)) {
#ifdef OQS_ENABLE_SIG_ml_dsa_87_ipd
return OQS_SIG_ml_dsa_87_ipd_new();
#else
return NULL;
#endif
} else if (0 == strcasecmp(method_name, OQS_SIG_alg_ml_dsa_87)) {
#ifdef OQS_ENABLE_SIG_ml_dsa_87
return OQS_SIG_ml_dsa_87_new();
#else
return NULL;
#endif
} else if (0 == strcasecmp(method_name, OQS_SIG_alg_falcon_512)) {
#ifdef OQS_ENABLE_SIG_falcon_512
return OQS_SIG_falcon_512_new();
#else
return NULL;
#endif
} else if (0 == strcasecmp(method_name, OQS_SIG_alg_falcon_1024)) {
#ifdef OQS_ENABLE_SIG_falcon_1024
return OQS_SIG_falcon_1024_new();
#else
return NULL;
#endif
} else if (0 == strcasecmp(method_name, OQS_SIG_alg_falcon_padded_512)) {
#ifdef OQS_ENABLE_SIG_falcon_padded_512
return OQS_SIG_falcon_padded_512_new();
#else
return NULL;
#endif
} else if (0 == strcasecmp(method_name, OQS_SIG_alg_falcon_padded_1024)) {
#ifdef OQS_ENABLE_SIG_falcon_padded_1024
return OQS_SIG_falcon_padded_1024_new();
#else
return NULL;
#endif
} else if (0 == strcasecmp(method_name, OQS_SIG_alg_sphincs_sha2_128f_simple)) {
#ifdef OQS_ENABLE_SIG_sphincs_sha2_128f_simple
return OQS_SIG_sphincs_sha2_128f_simple_new();
#else
return NULL;
#endif
} else if (0 == strcasecmp(method_name, OQS_SIG_alg_sphincs_sha2_128s_simple)) {
#ifdef OQS_ENABLE_SIG_sphincs_sha2_128s_simple
return OQS_SIG_sphincs_sha2_128s_simple_new();
#else
return NULL;
#endif
} else if (0 == strcasecmp(method_name, OQS_SIG_alg_sphincs_sha2_192f_simple)) {
#ifdef OQS_ENABLE_SIG_sphincs_sha2_192f_simple
return OQS_SIG_sphincs_sha2_192f_simple_new();
#else
return NULL;
#endif
} else if (0 == strcasecmp(method_name, OQS_SIG_alg_sphincs_sha2_192s_simple)) {
#ifdef OQS_ENABLE_SIG_sphincs_sha2_192s_simple
return OQS_SIG_sphincs_sha2_192s_simple_new();
#else
return NULL;
#endif
} else if (0 == strcasecmp(method_name, OQS_SIG_alg_sphincs_sha2_256f_simple)) {
#ifdef OQS_ENABLE_SIG_sphincs_sha2_256f_simple
return OQS_SIG_sphincs_sha2_256f_simple_new();
#else
return NULL;
#endif
} else if (0 == strcasecmp(method_name, OQS_SIG_alg_sphincs_sha2_256s_simple)) {
#ifdef OQS_ENABLE_SIG_sphincs_sha2_256s_simple
return OQS_SIG_sphincs_sha2_256s_simple_new();
#else
return NULL;
#endif
} else if (0 == strcasecmp(method_name, OQS_SIG_alg_sphincs_shake_128f_simple)) {
#ifdef OQS_ENABLE_SIG_sphincs_shake_128f_simple
return OQS_SIG_sphincs_shake_128f_simple_new();
#else
return NULL;
#endif
} else if (0 == strcasecmp(method_name, OQS_SIG_alg_sphincs_shake_128s_simple)) {
#ifdef OQS_ENABLE_SIG_sphincs_shake_128s_simple
return OQS_SIG_sphincs_shake_128s_simple_new();
#else
return NULL;
#endif
} else if (0 == strcasecmp(method_name, OQS_SIG_alg_sphincs_shake_192f_simple)) {
#ifdef OQS_ENABLE_SIG_sphincs_shake_192f_simple
return OQS_SIG_sphincs_shake_192f_simple_new();
#else
return NULL;
#endif
} else if (0 == strcasecmp(method_name, OQS_SIG_alg_sphincs_shake_192s_simple)) {
#ifdef OQS_ENABLE_SIG_sphincs_shake_192s_simple
return OQS_SIG_sphincs_shake_192s_simple_new();
#else
return NULL;
#endif
} else if (0 == strcasecmp(method_name, OQS_SIG_alg_sphincs_shake_256f_simple)) {
#ifdef OQS_ENABLE_SIG_sphincs_shake_256f_simple
return OQS_SIG_sphincs_shake_256f_simple_new();
#else
return NULL;
#endif
} else if (0 == strcasecmp(method_name, OQS_SIG_alg_sphincs_shake_256s_simple)) {
#ifdef OQS_ENABLE_SIG_sphincs_shake_256s_simple
return OQS_SIG_sphincs_shake_256s_simple_new();
#else
return NULL;
#endif
///// OQS_COPY_FROM_UPSTREAM_FRAGMENT_NEW_CASE_END
// EDIT-WHEN-ADDING-SIG
} else {
return NULL;
}
}
OQS_API OQS_STATUS OQS_SIG_keypair(const OQS_SIG *sig, uint8_t *public_key, uint8_t *secret_key) {
if (sig == NULL || sig->keypair(public_key, secret_key) != OQS_SUCCESS) {
return OQS_ERROR;
} else {
return OQS_SUCCESS;
}
}
OQS_API OQS_STATUS OQS_SIG_sign(const OQS_SIG *sig, uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *secret_key) {
if (sig == NULL || sig->sign(signature, signature_len, message, message_len, secret_key) != OQS_SUCCESS) {
return OQS_ERROR;
} else {
return OQS_SUCCESS;
}
}
OQS_API OQS_STATUS OQS_SIG_verify(const OQS_SIG *sig, const uint8_t *message, size_t message_len, const uint8_t *signature, size_t signature_len, const uint8_t *public_key) {
if (sig == NULL || sig->verify(message, message_len, signature, signature_len, public_key) != OQS_SUCCESS) {
return OQS_ERROR;
} else {
return OQS_SUCCESS;
}
}
OQS_API void OQS_SIG_free(OQS_SIG *sig) {
OQS_MEM_insecure_free(sig);
}