diff --git a/configure.ac b/configure.ac index 5d1357058..c27189148 100644 --- a/configure.ac +++ b/configure.ac @@ -1426,6 +1426,100 @@ AC_ARG_WITH([liboqs], ) +# Classic McEliece +AC_ARG_ENABLE([mceliece348864], + [AS_HELP_STRING([--enable-mceliece348864],[Enable mceliece348864 support (default: disabled)])], + [ ENABLED_MCELIECE348864=$enableval ], + [ ENABLED_MCELIECE348864=no ]) +AC_ARG_ENABLE([mceliece348864pc], + [AS_HELP_STRING([--enable-mceliece348864pc],[Enable mceliece348864pc support (default: disabled)])], + [ ENABLED_MCELIECE348864PC=$enableval ], + [ ENABLED_MCELIECE348864PC=no ]) +AC_ARG_ENABLE([mceliece460896], + [AS_HELP_STRING([--enable-mceliece460896],[Enable mceliece460896 support (default: disabled)])], + [ ENABLED_MCELIECE460896=$enableval ], + [ ENABLED_MCELIECE460896=no ]) +AC_ARG_ENABLE([mceliece460896pc], + [AS_HELP_STRING([--enable-mceliece460896pc],[Enable mceliece460896pc support (default: disabled)])], + [ ENABLED_MCELIECE460896PC=$enableval ], + [ ENABLED_MCELIECE460896PC=no ]) +AC_ARG_ENABLE([mceliece6688128], + [AS_HELP_STRING([--enable-mceliece6688128],[Enable mceliece6688128 support (default: disabled)])], + [ ENABLED_MCELIECE6688128=$enableval ], + [ ENABLED_MCELIECE6688128=no ]) +AC_ARG_ENABLE([mceliece6688128pc], + [AS_HELP_STRING([--enable-mceliece6688128pc],[Enable mceliece6688128pc support (default: disabled)])], + [ ENABLED_MCELIECE6688128PC=$enableval ], + [ ENABLED_MCELIECE6688128PC=no ]) +AC_ARG_ENABLE([mceliece6960119], + [AS_HELP_STRING([--enable-mceliece6960119],[Enable mceliece6960119 support (default: disabled)])], + [ ENABLED_MCELIECE6960119=$enableval ], + [ ENABLED_MCELIECE6960119=no ]) +AC_ARG_ENABLE([mceliece6960119pc], + [AS_HELP_STRING([--enable-mceliece6960119pc],[Enable mceliece6960119pc support (default: disabled)])], + [ ENABLED_MCELIECE6960119PC=$enableval ], + [ ENABLED_MCELIECE6960119PC=no ]) +AC_ARG_ENABLE([mceliece8192128], + [AS_HELP_STRING([--enable-mceliece8192128],[Enable mceliece8192128 support (default: disabled)])], + [ ENABLED_MCELIECE8192128=$enableval ], + [ ENABLED_MCELIECE8192128=no ]) +AC_ARG_ENABLE([mceliece8192128pc], + [AS_HELP_STRING([--enable-mceliece8192128pc],[Enable mceliece8192128pc support (default: disabled)])], + [ ENABLED_MCELIECE8192128PC=$enableval ], + [ ENABLED_MCELIECE8192128PC=no ]) + +AC_ARG_ENABLE([mceliece], + [AS_HELP_STRING([--enable-mceliece],[Enable mceliece non-pc support (default: disabled)])], + [ ENABLED_MCELIECE=$enableval ], + [ ENABLED_MCELIECE=no] + ) +AC_ARG_ENABLE([mceliece-full], + [AS_HELP_STRING([--enable-mceliece-full],[Enable mceliece pc and non-pc support (default: disabled)])], + [ ENABLED_MCELIECE_FULL=$enableval ], + [ ENABLED_MCELIECE_FULL=no] + ) + +# ENABLED_MCELIECE_BASE compiles subroutines shared by all McEliece sizes +ENABLED_MCELIECE_BASE=no + +test "$ENABLED_MCELIECE_FULL" = "yes" && ENABLED_MCELIECE348864PC=yes +test "$ENABLED_MCELIECE_FULL" = "yes" && ENABLED_MCELIECE460896PC=yes +test "$ENABLED_MCELIECE_FULL" = "yes" && ENABLED_MCELIECE6688128PC=yes +test "$ENABLED_MCELIECE_FULL" = "yes" && ENABLED_MCELIECE6960119PC=yes +test "$ENABLED_MCELIECE_FULL" = "yes" && ENABLED_MCELIECE8192128PC=yes +test "$ENABLED_MCELIECE_FULL" = "yes" && ENABLED_MCELIECE=yes +test "$ENABLED_MCELIECE" = "yes" && ENABLED_MCELIECE348864=yes +test "$ENABLED_MCELIECE" = "yes" && ENABLED_MCELIECE460896=yes +test "$ENABLED_MCELIECE" = "yes" && ENABLED_MCELIECE6688128=yes +test "$ENABLED_MCELIECE" = "yes" && ENABLED_MCELIECE6960119=yes +test "$ENABLED_MCELIECE" = "yes" && ENABLED_MCELIECE8192128=yes + +test "$ENABLED_MCELIECE348864" = "yes" && ENABLED_MCELIECE_BASE=yes +test "$ENABLED_MCELIECE348864PC" = "yes" && ENABLED_MCELIECE_BASE=yes +test "$ENABLED_MCELIECE460896" = "yes" && ENABLED_MCELIECE_BASE=yes +test "$ENABLED_MCELIECE460896PC" = "yes" && ENABLED_MCELIECE_BASE=yes +test "$ENABLED_MCELIECE6688128" = "yes" && ENABLED_MCELIECE_BASE=yes +test "$ENABLED_MCELIECE6688128PC" = "yes" && ENABLED_MCELIECE_BASE=yes +test "$ENABLED_MCELIECE6960119" = "yes" && ENABLED_MCELIECE_BASE=yes +test "$ENABLED_MCELIECE6960119PC" = "yes" && ENABLED_MCELIECE_BASE=yes +test "$ENABLED_MCELIECE8192128" = "yes" && ENABLED_MCELIECE_BASE=yes +test "$ENABLED_MCELIECE8192128PC" = "yes" && ENABLED_MCELIECE_BASE=yes + +test "$ENABLED_MCELIECE_BASE" = "yes" && test "$enable_shake256" = "" && enable_shake256=yes + +test "$ENABLED_MCELIECE348864" = "yes" && AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_HAVE_MCELIECE348864" +test "$ENABLED_MCELIECE348864PC" = "yes" && AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_HAVE_MCELIECE348864PC" +test "$ENABLED_MCELIECE460896" = "yes" && AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_HAVE_MCELIECE460896" +test "$ENABLED_MCELIECE460896PC" = "yes" && AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_HAVE_MCELIECE460896PC" +test "$ENABLED_MCELIECE6688128" = "yes" && AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_HAVE_MCELIECE6688128" +test "$ENABLED_MCELIECE6688128PC" = "yes" && AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_HAVE_MCELIECE6688128PC" +test "$ENABLED_MCELIECE6960119" = "yes" && AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_HAVE_MCELIECE6960119" +test "$ENABLED_MCELIECE6960119PC" = "yes" && AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_HAVE_MCELIECE6960119PC" +test "$ENABLED_MCELIECE8192128" = "yes" && AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_HAVE_MCELIECE8192128" +test "$ENABLED_MCELIECE8192128PC" = "yes" && AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_HAVE_MCELIECE8192128PC" +test "$ENABLED_MCELIECE_BASE" = "yes" && AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_HAVE_MCELIECE" + + # MLKEM # Used: # - SHA3, Shake128 and Shake256 @@ -10522,6 +10616,17 @@ AM_CONDITIONAL([BUILD_CURVE448],[test "x$ENABLED_CURVE448" = "xyes" || test "x$E AM_CONDITIONAL([BUILD_CURVE448_SMALL],[test "x$ENABLED_CURVE448_SMALL" = "xyes" || test "x$ENABLED_USERSETTINGS" = "xyes"]) AM_CONDITIONAL([BUILD_WC_LMS],[test "x$ENABLED_WC_LMS" != "xno" || test "x$ENABLED_USERSETTINGS" = "xyes"]) AM_CONDITIONAL([BUILD_WC_XMSS],[test "x$ENABLED_WC_XMSS" != "xno" || test "x$ENABLED_USERSETTINGS" = "xyes"]) +AM_CONDITIONAL([BUILD_MCELIECE],[test "x$ENABLED_MCELIECE_BASE" != "xno" || test "x$ENABLED_USERSETTINGS" = "xyes"]) +AM_CONDITIONAL([BUILD_MCELIECE348864],[test "x$ENABLED_MCELIECE348864" != "xno" || test "x$ENABLED_USERSETTINGS" = "xyes"]) +AM_CONDITIONAL([BUILD_MCELIECE348864PC],[test "x$ENABLED_MCELIECE348864PC" != "xno" || test "x$ENABLED_USERSETTINGS" = "xyes"]) +AM_CONDITIONAL([BUILD_MCELIECE460896],[test "x$ENABLED_MCELIECE460896" != "xno" || test "x$ENABLED_USERSETTINGS" = "xyes"]) +AM_CONDITIONAL([BUILD_MCELIECE460896PC],[test "x$ENABLED_MCELIECE460896PC" != "xno" || test "x$ENABLED_USERSETTINGS" = "xyes"]) +AM_CONDITIONAL([BUILD_MCELIECE6688128],[test "x$ENABLED_MCELIECE6688128" != "xno" || test "x$ENABLED_USERSETTINGS" = "xyes"]) +AM_CONDITIONAL([BUILD_MCELIECE6688128PC],[test "x$ENABLED_MCELIECE6688128PC" != "xno" || test "x$ENABLED_USERSETTINGS" = "xyes"]) +AM_CONDITIONAL([BUILD_MCELIECE6960119],[test "x$ENABLED_MCELIECE6960119" != "xno" || test "x$ENABLED_USERSETTINGS" = "xyes"]) +AM_CONDITIONAL([BUILD_MCELIECE6960119PC],[test "x$ENABLED_MCELIECE6960119PC" != "xno" || test "x$ENABLED_USERSETTINGS" = "xyes"]) +AM_CONDITIONAL([BUILD_MCELIECE8192128],[test "x$ENABLED_MCELIECE8192128" != "xno" || test "x$ENABLED_USERSETTINGS" = "xyes"]) +AM_CONDITIONAL([BUILD_MCELIECE8192128PC],[test "x$ENABLED_MCELIECE8192128PC" != "xno" || test "x$ENABLED_USERSETTINGS" = "xyes"]) AM_CONDITIONAL([BUILD_WC_MLKEM],[test "x$ENABLED_WC_MLKEM" != "xno" || test "x$ENABLED_USERSETTINGS" = "xyes"]) AM_CONDITIONAL([BUILD_DILITHIUM],[test "x$ENABLED_DILITHIUM" != "xno" || test "x$ENABLED_USERSETTINGS" = "xyes"]) AM_CONDITIONAL([BUILD_ECCSI],[test "x$ENABLED_ECCSI" = "xyes" || test "x$ENABLED_USERSETTINGS" = "xyes"]) @@ -11031,6 +11136,17 @@ echo " * XMSS wolfSSL impl: $ENABLED_WC_XMSS" if test "$ENABLED_LIBXMSS" = "yes"; then echo " * XMSS_ROOT: $XMSS_ROOT" fi +echo " * mceliece348864: $ENABLED_MCELIECE348864" +echo " * mceliece348864pc: $ENABLED_MCELIECE348864PC" +echo " * mceliece460896: $ENABLED_MCELIECE460896" +echo " * mceliece460896pc: $ENABLED_MCELIECE460896PC" +echo " * mceliece6688128: $ENABLED_MCELIECE6688128" +echo " * mceliece6688128pc: $ENABLED_MCELIECE6688128PC" +echo " * mceliece6960119: $ENABLED_MCELIECE6960119" +echo " * mceliece6960119pc: $ENABLED_MCELIECE6960119PC" +echo " * mceliece8192128: $ENABLED_MCELIECE8192128" +echo " * mceliece8192128pc: $ENABLED_MCELIECE8192128PC" +echo " * mceliece base: $ENABLED_MCELIECE_BASE" echo " * MLKEM: $ENABLED_MLKEM" echo " * MLKEM wolfSSL impl: $ENABLED_WC_MLKEM" echo " * DILITHIUM: $ENABLED_DILITHIUM" diff --git a/src/include.am b/src/include.am index 876ba7c65..754ac9a01 100644 --- a/src/include.am +++ b/src/include.am @@ -1211,6 +1211,52 @@ if BUILD_SAKKE src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/sakke.c endif +if BUILD_MCELIECE348864 +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/mceliece/wc_mceliece348864.c +endif +if BUILD_MCELIECE348864PC +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/mceliece/wc_mceliece348864pc.c +endif +if BUILD_MCELIECE460896 +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/mceliece/wc_mceliece460896.c +endif +if BUILD_MCELIECE460896PC +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/mceliece/wc_mceliece460896pc.c +endif +if BUILD_MCELIECE6688128 +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/mceliece/wc_mceliece6688128.c +endif +if BUILD_MCELIECE6688128PC +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/mceliece/wc_mceliece6688128pc.c +endif +if BUILD_MCELIECE6960119 +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/mceliece/wc_mceliece6960119.c +endif +if BUILD_MCELIECE6960119PC +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/mceliece/wc_mceliece6960119pc.c +endif +if BUILD_MCELIECE8192128 +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/mceliece/wc_mceliece8192128.c +endif +if BUILD_MCELIECE8192128PC +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/mceliece/wc_mceliece8192128pc.c +endif +if BUILD_MCELIECE +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/mceliece/int8_optblocker.c +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/mceliece/int16_optblocker.c +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/mceliece/int32_optblocker.c +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/mceliece/int64_optblocker.c +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/mceliece/uint8_optblocker.c +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/mceliece/uint16_optblocker.c +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/mceliece/uint32_optblocker.c +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/mceliece/uint64_optblocker.c +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/mceliece/randombytes.c +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/mceliece/wc_bitwrite16.c +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/mceliece/wc_sort_int16.c +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/mceliece/wc_sort_int32.c +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/mceliece/wc_sort_int64.c +endif + if BUILD_WC_MLKEM src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/wc_mlkem.c src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/wc_mlkem_poly.c diff --git a/wolfcrypt/benchmark/benchmark.c b/wolfcrypt/benchmark/benchmark.c index 7c7f4702a..2ae53f0b4 100644 --- a/wolfcrypt/benchmark/benchmark.c +++ b/wolfcrypt/benchmark/benchmark.c @@ -167,6 +167,9 @@ #ifdef HAVE_ED448 #include #endif +#ifdef WOLFSSL_HAVE_MCELIECE + #include +#endif #ifdef WOLFSSL_HAVE_MLKEM #include #ifdef WOLFSSL_WC_MLKEM @@ -725,6 +728,23 @@ #define BENCH_SAKKE 0x80000000 /* Post-Quantum Asymmetric algorithms. */ +#define BENCH_MCELIECE348864 0x00001000 +#define BENCH_MCELIECE348864PC 0x00002000 +#define BENCH_MCELIECE460896 0x00004000 +#define BENCH_MCELIECE460896PC 0x00008000 +#define BENCH_MCELIECE6688128 0x00010000 +#define BENCH_MCELIECE6688128PC 0x00020000 +#define BENCH_MCELIECE6960119 0x00040000 +#define BENCH_MCELIECE6960119PC 0x00080000 +#define BENCH_MCELIECE8192128 0x00100000 +#define BENCH_MCELIECE8192128PC 0x00200000 +#define BENCH_MCELIECE ( \ + BENCH_MCELIECE348864 | BENCH_MCELIECE348864PC \ + | BENCH_MCELIECE460896 | BENCH_MCELIECE460896PC \ + | BENCH_MCELIECE6688128 | BENCH_MCELIECE6688128PC \ + | BENCH_MCELIECE6960119 | BENCH_MCELIECE6960119PC \ + | BENCH_MCELIECE8192128 | BENCH_MCELIECE8192128PC \ + ) #define BENCH_KYBER512 0x00000020 #define BENCH_KYBER768 0x00000040 #define BENCH_KYBER1024 0x00000080 @@ -1124,7 +1144,8 @@ static const bench_pq_hash_sig_alg bench_pq_hash_sig_opt[] = { }; #endif /* BENCH_PQ_STATEFUL_HBS */ -#if defined(WOLFSSL_HAVE_MLKEM) || defined(HAVE_FALCON) || \ +#if defined(WOLFSSL_HAVE_MCELIECE) || \ + defined(WOLFSSL_HAVE_MLKEM) || defined(HAVE_FALCON) || \ defined(HAVE_DILITHIUM) || defined(HAVE_SPHINCS) /* The post-quantum-specific mapping of command line option to bit values and * OQS name. */ @@ -1139,6 +1160,19 @@ typedef struct bench_pq_alg { * options. */ static const bench_pq_alg bench_pq_asym_opt[] = { { "-pq", 0xffffffff }, +#ifdef WOLFSSL_HAVE_MCELIECE + { "-mceliece", BENCH_MCELIECE }, + { "-mceliece348864", BENCH_MCELIECE348864 }, + { "-mceliece348864pc", BENCH_MCELIECE348864PC }, + { "-mceliece460896", BENCH_MCELIECE460896 }, + { "-mceliece460896pc", BENCH_MCELIECE460896PC }, + { "-mceliece6688128", BENCH_MCELIECE6688128 }, + { "-mceliece6688128pc", BENCH_MCELIECE6688128PC }, + { "-mceliece6960119", BENCH_MCELIECE6960119 }, + { "-mceliece6960119pc", BENCH_MCELIECE6960119PC }, + { "-mceliece8192128", BENCH_MCELIECE8192128 }, + { "-mceliece8192128pc", BENCH_MCELIECE8192128PC }, +#endif #ifdef WOLFSSL_HAVE_MLKEM { "-kyber", BENCH_KYBER }, { "-kyber512", BENCH_KYBER512 }, @@ -1291,6 +1325,7 @@ static const char* bench_result_words1[][4] = { defined(HAVE_CURVE25519) || defined(HAVE_CURVE25519_SHARED_SECRET) || \ defined(HAVE_ED25519) || defined(HAVE_CURVE448) || \ defined(HAVE_CURVE448_SHARED_SECRET) || defined(HAVE_ED448) || \ + defined(WOLFSSL_HAVE_MCELIECE) || \ defined(WOLFSSL_HAVE_MLKEM) || defined(HAVE_DILITHIUM) static const char* bench_desc_words[][15] = { @@ -1754,6 +1789,7 @@ static const char* bench_result_words3[][5] = { || !defined(NO_DH) || defined(WOLFSSL_KEY_GEN) || defined(HAVE_ECC) \ || defined(HAVE_CURVE25519) || defined(HAVE_ED25519) \ || defined(HAVE_CURVE448) || defined(HAVE_ED448) \ + || defined(WOLFSSL_HAVE_MCELIECE) \ || defined(WOLFSSL_HAVE_MLKEM)) #define HAVE_LOCAL_RNG static THREAD_LS_T WC_RNG gRng; @@ -1766,6 +1802,7 @@ static const char* bench_result_words3[][5] = { defined(HAVE_CURVE448) || defined(HAVE_ED448) || \ defined(HAVE_ECC) || !defined(NO_DH) || \ !defined(NO_RSA) || defined(HAVE_SCRYPT) || \ + defined(WOLFSSL_HAVE_MCELIECE) || \ defined(WOLFSSL_HAVE_MLKEM) || defined(HAVE_DILITHIUM) || \ defined(WOLFSSL_HAVE_LMS) #define BENCH_ASYM @@ -1775,6 +1812,7 @@ static const char* bench_result_words3[][5] = { #if defined(HAVE_ECC) || !defined(NO_RSA) || !defined(NO_DH) || \ defined(HAVE_CURVE25519) || defined(HAVE_ED25519) || \ defined(HAVE_CURVE448) || defined(HAVE_ED448) || \ + defined(WOLFSSL_HAVE_MCELIECE) || \ defined(WOLFSSL_HAVE_MLKEM) || defined(HAVE_DILITHIUM) || \ defined(WOLFSSL_HAVE_LMS) static const char* bench_result_words2[][5] = { @@ -2745,6 +2783,7 @@ static void bench_stats_sym_finish(const char* desc, int useDeviceID, #if defined(HAVE_ECC) || !defined(NO_RSA) || !defined(NO_DH) || \ defined(HAVE_CURVE25519) || defined(HAVE_ED25519) || \ defined(HAVE_CURVE448) || defined(HAVE_ED448) || \ + defined(WOLFSSL_HAVE_MCELIECE) || \ defined(WOLFSSL_HAVE_MLKEM) || defined(HAVE_DILITHIUM) || \ defined(WOLFSSL_HAVE_LMS) static void bench_stats_asym_finish_ex(const char* algo, int strength, @@ -3691,6 +3730,47 @@ static void* benchmarks_do(void* args) } #endif +#ifdef WOLFSSL_HAVE_MCELIECE348864 + if (bench_all || (bench_pq_asym_algs & BENCH_MCELIECE348864)) + bench_mceliece348864(); +#endif +#ifdef WOLFSSL_HAVE_MCELIECE348864PC + if (bench_all || (bench_pq_asym_algs & BENCH_MCELIECE348864PC)) + bench_mceliece348864pc(); +#endif +#ifdef WOLFSSL_HAVE_MCELIECE460896 + if (bench_all || (bench_pq_asym_algs & BENCH_MCELIECE460896)) + bench_mceliece460896(); +#endif +#ifdef WOLFSSL_HAVE_MCELIECE460896PC + if (bench_all || (bench_pq_asym_algs & BENCH_MCELIECE460896PC)) + bench_mceliece460896pc(); +#endif +#ifdef WOLFSSL_HAVE_MCELIECE6688128 + if (bench_all || (bench_pq_asym_algs & BENCH_MCELIECE6688128)) + bench_mceliece6688128(); +#endif +#ifdef WOLFSSL_HAVE_MCELIECE6688128PC + if (bench_all || (bench_pq_asym_algs & BENCH_MCELIECE6688128PC)) + bench_mceliece6688128pc(); +#endif +#ifdef WOLFSSL_HAVE_MCELIECE6960119 + if (bench_all || (bench_pq_asym_algs & BENCH_MCELIECE6960119)) + bench_mceliece6960119(); +#endif +#ifdef WOLFSSL_HAVE_MCELIECE6960119PC + if (bench_all || (bench_pq_asym_algs & BENCH_MCELIECE6960119PC)) + bench_mceliece6960119pc(); +#endif +#ifdef WOLFSSL_HAVE_MCELIECE8192128 + if (bench_all || (bench_pq_asym_algs & BENCH_MCELIECE8192128)) + bench_mceliece8192128(); +#endif +#ifdef WOLFSSL_HAVE_MCELIECE8192128PC + if (bench_all || (bench_pq_asym_algs & BENCH_MCELIECE8192128PC)) + bench_mceliece8192128pc(); +#endif + #ifdef WOLFSSL_HAVE_MLKEM if (bench_all || (bench_pq_asym_algs & BENCH_KYBER)) { #ifndef WOLFSSL_NO_ML_KEM @@ -9653,6 +9733,8 @@ exit: } #endif /* !NO_DH && !WC_NO_RNG */ +#include "mceliece.i" + #ifdef WOLFSSL_HAVE_MLKEM static void bench_mlkem_keygen(int type, const char* name, int keySize, KyberKey* key) @@ -15170,7 +15252,8 @@ static void Usage(void) print_alg(bench_asym_opt[i].str, &line); for (i=0; bench_other_opt[i].str != NULL; i++) print_alg(bench_other_opt[i].str, &line); -#if defined(WOLFSSL_HAVE_MLKEM) || defined(HAVE_FALCON) || \ +#if defined(WOLFSSL_HAVE_MCELIECE) || \ + defined(WOLFSSL_HAVE_MLKEM) || defined(HAVE_FALCON) || \ defined(HAVE_DILITHIUM) || defined(HAVE_SPHINCS) for (i=0; bench_pq_asym_opt[i].str != NULL; i++) print_alg(bench_pq_asym_opt[i].str, &line); @@ -15453,7 +15536,8 @@ int wolfcrypt_benchmark_main(int argc, char** argv) optMatched = 1; } } - #if defined(WOLFSSL_HAVE_MLKEM) || defined(HAVE_FALCON) || \ + #if defined(WOLFSSL_HAVE_MCELIECE) || \ + defined(WOLFSSL_HAVE_MLKEM) || defined(HAVE_FALCON) || \ defined(HAVE_DILITHIUM) || defined(HAVE_SPHINCS) /* Known asymmetric post-quantum algorithms */ for (i=0; !optMatched && bench_pq_asym_opt[i].str != NULL; i++) { diff --git a/wolfcrypt/benchmark/benchmark.h b/wolfcrypt/benchmark/benchmark.h index 8103fd506..bc02df276 100644 --- a/wolfcrypt/benchmark/benchmark.h +++ b/wolfcrypt/benchmark/benchmark.h @@ -102,6 +102,16 @@ void bench_rsaKeyGen_size(int useDeviceID, word32 keySz); void bench_rsa(int useDeviceID); void bench_rsa_key(int useDeviceID, word32 keySz); void bench_dh(int useDeviceID); +void bench_mceliece348864(void); +void bench_mceliece348864pc(void); +void bench_mceliece460896(void); +void bench_mceliece460896pc(void); +void bench_mceliece6688128(void); +void bench_mceliece6688128pc(void); +void bench_mceliece6960119(void); +void bench_mceliece6960119pc(void); +void bench_mceliece8192128(void); +void bench_mceliece8192128pc(void); void bench_mlkem(int type); void bench_lms(void); void bench_xmss(int hash); diff --git a/wolfcrypt/benchmark/include.am b/wolfcrypt/benchmark/include.am index 22cecbdae..612ae90a7 100644 --- a/wolfcrypt/benchmark/include.am +++ b/wolfcrypt/benchmark/include.am @@ -28,3 +28,15 @@ EXTRA_DIST += wolfcrypt/benchmark/benchmark-VS2022.vcxproj EXTRA_DIST += wolfcrypt/benchmark/benchmark-VS2022.vcxproj.user EXTRA_DIST += wolfcrypt/benchmark/README.md DISTCLEANFILES+= wolfcrypt/benchmark/.libs/benchmark + +EXTRA_DIST += wolfcrypt/benchmark/mceliece.i +EXTRA_DIST += wolfcrypt/benchmark/mceliece348864.i +EXTRA_DIST += wolfcrypt/benchmark/mceliece348864pc.i +EXTRA_DIST += wolfcrypt/benchmark/mceliece460896.i +EXTRA_DIST += wolfcrypt/benchmark/mceliece460896pc.i +EXTRA_DIST += wolfcrypt/benchmark/mceliece6688128.i +EXTRA_DIST += wolfcrypt/benchmark/mceliece6688128pc.i +EXTRA_DIST += wolfcrypt/benchmark/mceliece6960119.i +EXTRA_DIST += wolfcrypt/benchmark/mceliece6960119pc.i +EXTRA_DIST += wolfcrypt/benchmark/mceliece8192128.i +EXTRA_DIST += wolfcrypt/benchmark/mceliece8192128pc.i diff --git a/wolfcrypt/test/include.am b/wolfcrypt/test/include.am index 4e059dfa6..3f0c8bb2d 100644 --- a/wolfcrypt/test/include.am +++ b/wolfcrypt/test/include.am @@ -32,3 +32,15 @@ EXTRA_DIST += wolfcrypt/test/test-VS2022.vcxproj.user EXTRA_DIST += wolfcrypt/test/README.md DISTCLEANFILES+= wolfcrypt/test/.libs/testwolfcrypt + +EXTRA_DIST += wolfcrypt/test/mceliece.i +EXTRA_DIST += wolfcrypt/test/mceliece348864.i +EXTRA_DIST += wolfcrypt/test/mceliece348864pc.i +EXTRA_DIST += wolfcrypt/test/mceliece460896.i +EXTRA_DIST += wolfcrypt/test/mceliece460896pc.i +EXTRA_DIST += wolfcrypt/test/mceliece6688128.i +EXTRA_DIST += wolfcrypt/test/mceliece6688128pc.i +EXTRA_DIST += wolfcrypt/test/mceliece6960119.i +EXTRA_DIST += wolfcrypt/test/mceliece6960119pc.i +EXTRA_DIST += wolfcrypt/test/mceliece8192128.i +EXTRA_DIST += wolfcrypt/test/mceliece8192128pc.i diff --git a/wolfcrypt/test/test.c b/wolfcrypt/test/test.c index 370720237..c2e9ccc3f 100644 --- a/wolfcrypt/test/test.c +++ b/wolfcrypt/test/test.c @@ -368,6 +368,9 @@ const byte const_byte_array[] = "A+Gd\0\0\0"; #ifdef HAVE_ED448 #include #endif +#ifdef WOLFSSL_HAVE_MCELIECE + #include +#endif #ifdef WOLFSSL_HAVE_MLKEM #include #ifdef WOLFSSL_WC_MLKEM @@ -725,6 +728,36 @@ WOLFSSL_TEST_SUBROUTINE wc_test_ret_t scrypt_test(void); #ifdef HAVE_ED448 WOLFSSL_TEST_SUBROUTINE wc_test_ret_t ed448_test(void); #endif +#ifdef WOLFSSL_HAVE_MCELIECE348864 + WOLFSSL_TEST_SUBROUTINE wc_test_ret_t mceliece348864_test(void); +#endif +#ifdef WOLFSSL_HAVE_MCELIECE348864PC + WOLFSSL_TEST_SUBROUTINE wc_test_ret_t mceliece348864pc_test(void); +#endif +#ifdef WOLFSSL_HAVE_MCELIECE460896 + WOLFSSL_TEST_SUBROUTINE wc_test_ret_t mceliece460896_test(void); +#endif +#ifdef WOLFSSL_HAVE_MCELIECE460896PC + WOLFSSL_TEST_SUBROUTINE wc_test_ret_t mceliece460896pc_test(void); +#endif +#ifdef WOLFSSL_HAVE_MCELIECE6688128 + WOLFSSL_TEST_SUBROUTINE wc_test_ret_t mceliece6688128_test(void); +#endif +#ifdef WOLFSSL_HAVE_MCELIECE6688128PC + WOLFSSL_TEST_SUBROUTINE wc_test_ret_t mceliece6688128pc_test(void); +#endif +#ifdef WOLFSSL_HAVE_MCELIECE6960119 + WOLFSSL_TEST_SUBROUTINE wc_test_ret_t mceliece6960119_test(void); +#endif +#ifdef WOLFSSL_HAVE_MCELIECE6960119PC + WOLFSSL_TEST_SUBROUTINE wc_test_ret_t mceliece6960119pc_test(void); +#endif +#ifdef WOLFSSL_HAVE_MCELIECE8192128 + WOLFSSL_TEST_SUBROUTINE wc_test_ret_t mceliece8192128_test(void); +#endif +#ifdef WOLFSSL_HAVE_MCELIECE8192128PC + WOLFSSL_TEST_SUBROUTINE wc_test_ret_t mceliece8192128pc_test(void); +#endif #ifdef WOLFSSL_HAVE_MLKEM WOLFSSL_TEST_SUBROUTINE wc_test_ret_t mlkem_test(void); #endif @@ -2344,6 +2377,67 @@ options: [-s max_relative_stack_bytes] [-m max_relative_heap_memory_bytes]\n\ PRIVATE_KEY_LOCK(); #endif +#ifdef WOLFSSL_HAVE_MCELIECE348864 + if ( (ret = mceliece348864_test()) != 0) + TEST_FAIL("MCELIECE348864 test failed!\n", ret); + else + TEST_PASS("MCELIECE348864 test passed!\n"); +#endif +#ifdef WOLFSSL_HAVE_MCELIECE348864PC + if ( (ret = mceliece348864pc_test()) != 0) + TEST_FAIL("MCELIECE348864PC test failed!\n", ret); + else + TEST_PASS("MCELIECE348864PC test passed!\n"); +#endif +#ifdef WOLFSSL_HAVE_MCELIECE460896 + if ( (ret = mceliece460896_test()) != 0) + TEST_FAIL("MCELIECE460896 test failed!\n", ret); + else + TEST_PASS("MCELIECE460896 test passed!\n"); +#endif +#ifdef WOLFSSL_HAVE_MCELIECE460896PC + if ( (ret = mceliece460896pc_test()) != 0) + TEST_FAIL("MCELIECE460896PC test failed!\n", ret); + else + TEST_PASS("MCELIECE460896PC test passed!\n"); +#endif +#ifdef WOLFSSL_HAVE_MCELIECE6688128 + if ( (ret = mceliece6688128_test()) != 0) + TEST_FAIL("MCELIECE6688128 test failed!\n", ret); + else + TEST_PASS("MCELIECE6688128 test passed!\n"); +#endif +#ifdef WOLFSSL_HAVE_MCELIECE6688128PC + if ( (ret = mceliece6688128pc_test()) != 0) + TEST_FAIL("MCELIECE6688128PC test failed!\n", ret); + else + TEST_PASS("MCELIECE6688128PC test passed!\n"); +#endif +#ifdef WOLFSSL_HAVE_MCELIECE6960119 + if ( (ret = mceliece6960119_test()) != 0) + TEST_FAIL("MCELIECE6960119 test failed!\n", ret); + else + TEST_PASS("MCELIECE6960119 test passed!\n"); +#endif +#ifdef WOLFSSL_HAVE_MCELIECE6960119PC + if ( (ret = mceliece6960119pc_test()) != 0) + TEST_FAIL("MCELIECE6960119PC test failed!\n", ret); + else + TEST_PASS("MCELIECE6960119PC test passed!\n"); +#endif +#ifdef WOLFSSL_HAVE_MCELIECE8192128 + if ( (ret = mceliece8192128_test()) != 0) + TEST_FAIL("MCELIECE8192128 test failed!\n", ret); + else + TEST_PASS("MCELIECE8192128 test passed!\n"); +#endif +#ifdef WOLFSSL_HAVE_MCELIECE8192128PC + if ( (ret = mceliece8192128pc_test()) != 0) + TEST_FAIL("MCELIECE8192128PC test failed!\n", ret); + else + TEST_PASS("MCELIECE8192128PC test passed!\n"); +#endif + #ifdef WOLFSSL_HAVE_MLKEM if ( (ret = mlkem_test()) != 0) TEST_FAIL("MLKEM test failed!\n", ret); @@ -38984,6 +39078,8 @@ WOLFSSL_TEST_SUBROUTINE wc_test_ret_t ed448_test(void) } #endif /* HAVE_ED448 */ +#include "mceliece.i" + #ifdef WOLFSSL_HAVE_MLKEM #ifdef WOLFSSL_WC_MLKEM /* OQS does not support KATs */ #if !defined(WOLFSSL_NO_KYBER512) && !defined(WOLFSSL_NO_ML_KEM_512) diff --git a/wolfcrypt/test/test.h b/wolfcrypt/test/test.h index bd4125b64..9cf8d2076 100644 --- a/wolfcrypt/test/test.h +++ b/wolfcrypt/test/test.h @@ -268,6 +268,36 @@ extern WOLFSSL_TEST_SUBROUTINE wc_test_ret_t scrypt_test(void); #ifdef HAVE_ED448 extern WOLFSSL_TEST_SUBROUTINE wc_test_ret_t ed448_test(void); #endif +#ifdef WOLFSSL_HAVE_MCELIECE348864 + extern WOLFSSL_TEST_SUBROUTINE wc_test_ret_t mceliece348864_test(void); +#endif +#ifdef WOLFSSL_HAVE_MCELIECE348864PC + extern WOLFSSL_TEST_SUBROUTINE wc_test_ret_t mceliece348864pc_test(void); +#endif +#ifdef WOLFSSL_HAVE_MCELIECE460896 + extern WOLFSSL_TEST_SUBROUTINE wc_test_ret_t mceliece460896_test(void); +#endif +#ifdef WOLFSSL_HAVE_MCELIECE460896PC + extern WOLFSSL_TEST_SUBROUTINE wc_test_ret_t mceliece460896pc_test(void); +#endif +#ifdef WOLFSSL_HAVE_MCELIECE6688128 + extern WOLFSSL_TEST_SUBROUTINE wc_test_ret_t mceliece6688128_test(void); +#endif +#ifdef WOLFSSL_HAVE_MCELIECE6688128PC + extern WOLFSSL_TEST_SUBROUTINE wc_test_ret_t mceliece6688128pc_test(void); +#endif +#ifdef WOLFSSL_HAVE_MCELIECE6960119 + extern WOLFSSL_TEST_SUBROUTINE wc_test_ret_t mceliece6960119_test(void); +#endif +#ifdef WOLFSSL_HAVE_MCELIECE6960119PC + extern WOLFSSL_TEST_SUBROUTINE wc_test_ret_t mceliece6960119pc_test(void); +#endif +#ifdef WOLFSSL_HAVE_MCELIECE8192128 + extern WOLFSSL_TEST_SUBROUTINE wc_test_ret_t mceliece8192128_test(void); +#endif +#ifdef WOLFSSL_HAVE_MCELIECE8192128PC + extern WOLFSSL_TEST_SUBROUTINE wc_test_ret_t mceliece8192128pc_test(void); +#endif #ifdef WOLFSSL_HAVE_MLKEM extern WOLFSSL_TEST_SUBROUTINE wc_test_ret_t mlkem_test(void); #endif diff --git a/wolfssl/wolfcrypt/include.am b/wolfssl/wolfcrypt/include.am index 3a28c4e17..f921f75db 100644 --- a/wolfssl/wolfcrypt/include.am +++ b/wolfssl/wolfcrypt/include.am @@ -74,6 +74,7 @@ nobase_include_HEADERS+= \ wolfssl/wolfcrypt/siphash.h \ wolfssl/wolfcrypt/cpuid.h \ wolfssl/wolfcrypt/cryptocb.h \ + wolfssl/wolfcrypt/mceliece.h \ wolfssl/wolfcrypt/mlkem.h \ wolfssl/wolfcrypt/wc_mlkem.h \ wolfssl/wolfcrypt/ext_mlkem.h \