diff --git a/CMakeLists.txt b/CMakeLists.txt index 663c3cf2cc9..50c603840d2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -625,6 +625,11 @@ add_option(WOLFSSL_OQS "Enable integration with the OQS (Open Quantum Safe) liboqs library (default: disabled)" "no" "yes;no") +# Falcon (provided via liboqs) +add_option(WOLFSSL_FALCON + "Enable Falcon post-quantum signatures via liboqs (default: disabled)" + "no" "yes;no") + # ML-KEM/Kyber add_option(WOLFSSL_MLKEM "Enable the wolfSSL PQ ML-KEM library (default: disabled)" @@ -632,13 +637,11 @@ add_option(WOLFSSL_MLKEM if (WOLFSSL_MLKEM) list(APPEND WOLFSSL_DEFINITIONS "-DWOLFSSL_HAVE_MLKEM") - list(APPEND WOLFSSL_DEFINITIONS "-DWOLFSSL_WC_MLKEM") list(APPEND WOLFSSL_DEFINITIONS "-DWOLFSSL_SHA3") list(APPEND WOLFSSL_DEFINITIONS "-DWOLFSSL_SHAKE128") list(APPEND WOLFSSL_DEFINITIONS "-DWOLFSSL_SHAKE256") set_wolfssl_definitions("WOLFSSL_HAVE_MLKEM" RESULT) - set_wolfssl_definitions("WOLFSSL_WC_MLKEM" RESULT) set_wolfssl_definitions("WOLFSSL_SHA3" RESULT) set_wolfssl_definitions("WOLFSSL_SHAKE128" RESULT) set_wolfssl_definitions("WOLFSSL_SHAKE256" RESULT) @@ -677,13 +680,11 @@ add_option(WOLFSSL_DILITHIUM if (WOLFSSL_DILITHIUM) list(APPEND WOLFSSL_DEFINITIONS "-DHAVE_DILITHIUM") - list(APPEND WOLFSSL_DEFINITIONS "-DWOLFSSL_WC_DILITHIUM") list(APPEND WOLFSSL_DEFINITIONS "-DWOLFSSL_SHA3") list(APPEND WOLFSSL_DEFINITIONS "-DWOLFSSL_SHAKE128") list(APPEND WOLFSSL_DEFINITIONS "-DWOLFSSL_SHAKE256") set_wolfssl_definitions("HAVE_DILITHIUM" RESULT) - set_wolfssl_definitions("WOLFSSL_WC_DILITHIUM" RESULT) set_wolfssl_definitions("WOLFSSL_SHA3" RESULT) set_wolfssl_definitions("WOLFSSL_SHAKE128" RESULT) set_wolfssl_definitions("WOLFSSL_SHAKE256" RESULT) @@ -733,6 +734,15 @@ if (WOLFSSL_EXPERIMENTAL) set_wolfssl_definitions("WOLFSSL_EXPERIMENTAL_SETTINGS" RESULT) + # Cross-validate WOLFSSL_OQS and WOLFSSL_FALCON: liboqs is only linked + # when a liboqs-backed algorithm (Falcon) is actually enabled. + if (WOLFSSL_FALCON AND NOT WOLFSSL_OQS) + message(FATAL_ERROR "WOLFSSL_FALCON requires WOLFSSL_OQS.") + endif() + if (WOLFSSL_OQS AND NOT WOLFSSL_FALCON) + message(FATAL_ERROR "WOLFSSL_OQS requires WOLFSSL_FALCON.") + endif() + # Checking for experimental feature: OQS message(STATUS "Looking for WOLFSSL_OQS") if (WOLFSSL_OQS) @@ -749,6 +759,7 @@ if (WOLFSSL_EXPERIMENTAL) set_wolfssl_definitions("HAVE_LIBOQS" RESULT) set_wolfssl_definitions("HAVE_TLS_EXTENSIONS" RESULT) set_wolfssl_definitions("OPENSSL_EXTRA" RESULT) + set_wolfssl_definitions("HAVE_FALCON" RESULT) else() message(STATUS "Checking OQS - not found") @@ -777,19 +788,15 @@ if (WOLFSSL_EXPERIMENTAL) message(STATUS "Warning: WOLFSSL_EXPERIMENTAL enabled, but no experimental features enabled.") endif() - # Sanity checks - if(WOLFSSL_OQS AND WOLFSSL_MLKEM) - message(FATAL_ERROR "Error: cannot enable both WOLFSSL_OQS and WOLFSSL_MLKEM at the same time.") - endif() - if(WOLFSSL_OQS AND WOLFSSL_DILITHIUM) - message(FATAL_ERROR "Error: cannot enable both WOLFSSL_OQS and WOLFSSL_DILITHIUM at the same time.") - endif() else() # Experimental mode not enabled, but were any experimental features enabled? Error out if so: message(STATUS "Looking for WOLFSSL_EXPERIMENTAL - not found") if (WOLFSSL_OQS) message(FATAL_ERROR "Error: WOLFSSL_OQS requires WOLFSSL_EXPERIMENTAL at this time.") endif() + if (WOLFSSL_FALCON) + message(FATAL_ERROR "Error: WOLFSSL_FALCON requires WOLFSSL_EXPERIMENTAL at this time.") + endif() endif() # LMS diff --git a/IDE/Espressif/ESP-IDF/examples/template/components/wolfssl/component.mk b/IDE/Espressif/ESP-IDF/examples/template/components/wolfssl/component.mk index 6b1c0529881..3b85dfa9e05 100644 --- a/IDE/Espressif/ESP-IDF/examples/template/components/wolfssl/component.mk +++ b/IDE/Espressif/ESP-IDF/examples/template/components/wolfssl/component.mk @@ -203,7 +203,6 @@ COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/ed25519.o COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/ed448.o COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/error.o COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/evp.o -# COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/ext_mlkem.o COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/ext_lms.o COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/ext_xmss.o COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/falcon.o diff --git a/IDE/Espressif/ESP-IDF/examples/template/components/wolfssl/include/user_settings.h b/IDE/Espressif/ESP-IDF/examples/template/components/wolfssl/include/user_settings.h index 0da0f637a9f..4e48738843f 100644 --- a/IDE/Espressif/ESP-IDF/examples/template/components/wolfssl/include/user_settings.h +++ b/IDE/Espressif/ESP-IDF/examples/template/components/wolfssl/include/user_settings.h @@ -215,7 +215,6 @@ #ifdef CONFIG_ESP_WOLFSSL_ENABLE_MLKEM /* Kyber typically needs a minimum 10K stack */ #define WOLFSSL_HAVE_MLKEM - #define WOLFSSL_WC_MLKEM #define WOLFSSL_SHAKE128 #define WOLFSSL_SHAKE256 @@ -234,7 +233,7 @@ #define WOLFSSL_NO_ML_KEM_768 #define NO_SESSION_CACHE #else - /* Only needed for older wolfssl versions, see mlkem.h */ + /* Only needed for older wolfssl versions, see wc_mlkem.h */ #define WOLFSSL_KYBER1024 /* optional alternative sizes: */ /* #define WOLFSSL_KYBER768 */ diff --git a/IDE/Espressif/ESP-IDF/examples/wolfssl_benchmark/components/wolfssl/component.mk b/IDE/Espressif/ESP-IDF/examples/wolfssl_benchmark/components/wolfssl/component.mk index 82a56d2a551..15939e4e589 100644 --- a/IDE/Espressif/ESP-IDF/examples/wolfssl_benchmark/components/wolfssl/component.mk +++ b/IDE/Espressif/ESP-IDF/examples/wolfssl_benchmark/components/wolfssl/component.mk @@ -203,7 +203,6 @@ COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/ed25519.o COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/ed448.o COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/error.o COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/evp.o -# COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/ext_mlkem.o COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/ext_lms.o COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/ext_xmss.o COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/falcon.o diff --git a/IDE/Espressif/ESP-IDF/examples/wolfssl_benchmark/components/wolfssl/include/user_settings.h b/IDE/Espressif/ESP-IDF/examples/wolfssl_benchmark/components/wolfssl/include/user_settings.h index 0da0f637a9f..4e48738843f 100644 --- a/IDE/Espressif/ESP-IDF/examples/wolfssl_benchmark/components/wolfssl/include/user_settings.h +++ b/IDE/Espressif/ESP-IDF/examples/wolfssl_benchmark/components/wolfssl/include/user_settings.h @@ -215,7 +215,6 @@ #ifdef CONFIG_ESP_WOLFSSL_ENABLE_MLKEM /* Kyber typically needs a minimum 10K stack */ #define WOLFSSL_HAVE_MLKEM - #define WOLFSSL_WC_MLKEM #define WOLFSSL_SHAKE128 #define WOLFSSL_SHAKE256 @@ -234,7 +233,7 @@ #define WOLFSSL_NO_ML_KEM_768 #define NO_SESSION_CACHE #else - /* Only needed for older wolfssl versions, see mlkem.h */ + /* Only needed for older wolfssl versions, see wc_mlkem.h */ #define WOLFSSL_KYBER1024 /* optional alternative sizes: */ /* #define WOLFSSL_KYBER768 */ diff --git a/IDE/Espressif/ESP-IDF/examples/wolfssl_client/components/wolfssl/component.mk b/IDE/Espressif/ESP-IDF/examples/wolfssl_client/components/wolfssl/component.mk index 6b1c0529881..3b85dfa9e05 100644 --- a/IDE/Espressif/ESP-IDF/examples/wolfssl_client/components/wolfssl/component.mk +++ b/IDE/Espressif/ESP-IDF/examples/wolfssl_client/components/wolfssl/component.mk @@ -203,7 +203,6 @@ COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/ed25519.o COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/ed448.o COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/error.o COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/evp.o -# COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/ext_mlkem.o COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/ext_lms.o COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/ext_xmss.o COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/falcon.o diff --git a/IDE/Espressif/ESP-IDF/examples/wolfssl_client/components/wolfssl/include/user_settings.h b/IDE/Espressif/ESP-IDF/examples/wolfssl_client/components/wolfssl/include/user_settings.h index 0da0f637a9f..4e48738843f 100644 --- a/IDE/Espressif/ESP-IDF/examples/wolfssl_client/components/wolfssl/include/user_settings.h +++ b/IDE/Espressif/ESP-IDF/examples/wolfssl_client/components/wolfssl/include/user_settings.h @@ -215,7 +215,6 @@ #ifdef CONFIG_ESP_WOLFSSL_ENABLE_MLKEM /* Kyber typically needs a minimum 10K stack */ #define WOLFSSL_HAVE_MLKEM - #define WOLFSSL_WC_MLKEM #define WOLFSSL_SHAKE128 #define WOLFSSL_SHAKE256 @@ -234,7 +233,7 @@ #define WOLFSSL_NO_ML_KEM_768 #define NO_SESSION_CACHE #else - /* Only needed for older wolfssl versions, see mlkem.h */ + /* Only needed for older wolfssl versions, see wc_mlkem.h */ #define WOLFSSL_KYBER1024 /* optional alternative sizes: */ /* #define WOLFSSL_KYBER768 */ diff --git a/IDE/Espressif/ESP-IDF/examples/wolfssl_client/main/client-tls.c b/IDE/Espressif/ESP-IDF/examples/wolfssl_client/main/client-tls.c index d3d7cd350b3..a2ef66cd227 100644 --- a/IDE/Espressif/ESP-IDF/examples/wolfssl_client/main/client-tls.c +++ b/IDE/Espressif/ESP-IDF/examples/wolfssl_client/main/client-tls.c @@ -41,8 +41,7 @@ #undef USE_WOLFSSL_ESP_SDK_WIFI #include -#if defined(WOLFSSL_WC_MLKEM) - #include +#if defined(WOLFSSL_HAVE_MLKEM) #include #endif #if defined(USE_CERT_BUFFERS_2048) || defined(USE_CERT_BUFFERS_1024) diff --git a/IDE/Espressif/ESP-IDF/examples/wolfssl_server/components/wolfssl/component.mk b/IDE/Espressif/ESP-IDF/examples/wolfssl_server/components/wolfssl/component.mk index 6b1c0529881..3b85dfa9e05 100644 --- a/IDE/Espressif/ESP-IDF/examples/wolfssl_server/components/wolfssl/component.mk +++ b/IDE/Espressif/ESP-IDF/examples/wolfssl_server/components/wolfssl/component.mk @@ -203,7 +203,6 @@ COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/ed25519.o COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/ed448.o COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/error.o COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/evp.o -# COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/ext_mlkem.o COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/ext_lms.o COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/ext_xmss.o COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/falcon.o diff --git a/IDE/Espressif/ESP-IDF/examples/wolfssl_server/components/wolfssl/include/user_settings.h b/IDE/Espressif/ESP-IDF/examples/wolfssl_server/components/wolfssl/include/user_settings.h index 0da0f637a9f..4e48738843f 100644 --- a/IDE/Espressif/ESP-IDF/examples/wolfssl_server/components/wolfssl/include/user_settings.h +++ b/IDE/Espressif/ESP-IDF/examples/wolfssl_server/components/wolfssl/include/user_settings.h @@ -215,7 +215,6 @@ #ifdef CONFIG_ESP_WOLFSSL_ENABLE_MLKEM /* Kyber typically needs a minimum 10K stack */ #define WOLFSSL_HAVE_MLKEM - #define WOLFSSL_WC_MLKEM #define WOLFSSL_SHAKE128 #define WOLFSSL_SHAKE256 @@ -234,7 +233,7 @@ #define WOLFSSL_NO_ML_KEM_768 #define NO_SESSION_CACHE #else - /* Only needed for older wolfssl versions, see mlkem.h */ + /* Only needed for older wolfssl versions, see wc_mlkem.h */ #define WOLFSSL_KYBER1024 /* optional alternative sizes: */ /* #define WOLFSSL_KYBER768 */ diff --git a/IDE/Espressif/ESP-IDF/examples/wolfssl_server/main/server-tls.c b/IDE/Espressif/ESP-IDF/examples/wolfssl_server/main/server-tls.c index ff77e5d97f2..5f3d153e88c 100644 --- a/IDE/Espressif/ESP-IDF/examples/wolfssl_server/main/server-tls.c +++ b/IDE/Espressif/ESP-IDF/examples/wolfssl_server/main/server-tls.c @@ -54,8 +54,7 @@ #error "Missing WOLFSSL_USER_SETTINGS in CMakeLists or Makefile:\ CFLAGS +=-DWOLFSSL_USER_SETTINGS" #endif -#if defined(WOLFSSL_WC_MLKEM) - #include +#if defined(WOLFSSL_HAVE_MLKEM) #include #endif #if defined(USE_CERT_BUFFERS_2048) || defined(USE_CERT_BUFFERS_1024) diff --git a/IDE/Espressif/ESP-IDF/examples/wolfssl_test/components/wolfssl/component.mk b/IDE/Espressif/ESP-IDF/examples/wolfssl_test/components/wolfssl/component.mk index 308aa3d4eb4..76cbea8e6a2 100644 --- a/IDE/Espressif/ESP-IDF/examples/wolfssl_test/components/wolfssl/component.mk +++ b/IDE/Espressif/ESP-IDF/examples/wolfssl_test/components/wolfssl/component.mk @@ -203,7 +203,6 @@ COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/ed25519.o COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/ed448.o COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/error.o COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/evp.o -# COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/ext_mlkem.o COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/ext_lms.o COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/ext_xmss.o COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/falcon.o diff --git a/IDE/Espressif/ESP-IDF/examples/wolfssl_test/components/wolfssl/include/user_settings.h b/IDE/Espressif/ESP-IDF/examples/wolfssl_test/components/wolfssl/include/user_settings.h index 0da0f637a9f..4e48738843f 100644 --- a/IDE/Espressif/ESP-IDF/examples/wolfssl_test/components/wolfssl/include/user_settings.h +++ b/IDE/Espressif/ESP-IDF/examples/wolfssl_test/components/wolfssl/include/user_settings.h @@ -215,7 +215,6 @@ #ifdef CONFIG_ESP_WOLFSSL_ENABLE_MLKEM /* Kyber typically needs a minimum 10K stack */ #define WOLFSSL_HAVE_MLKEM - #define WOLFSSL_WC_MLKEM #define WOLFSSL_SHAKE128 #define WOLFSSL_SHAKE256 @@ -234,7 +233,7 @@ #define WOLFSSL_NO_ML_KEM_768 #define NO_SESSION_CACHE #else - /* Only needed for older wolfssl versions, see mlkem.h */ + /* Only needed for older wolfssl versions, see wc_mlkem.h */ #define WOLFSSL_KYBER1024 /* optional alternative sizes: */ /* #define WOLFSSL_KYBER768 */ diff --git a/IDE/STM32Cube/STM32_Benchmarks.md b/IDE/STM32Cube/STM32_Benchmarks.md index 9737e0b95e5..47de679eca9 100644 --- a/IDE/STM32Cube/STM32_Benchmarks.md +++ b/IDE/STM32Cube/STM32_Benchmarks.md @@ -700,7 +700,6 @@ Tested on commit: fa9e122f1cca32513611f5a24de88d07aced015b #define GCM_TABLE_4BIT #define HAVE_DILITHIUM -#define WOLFSSL_WC_DILITHIUM #define WOLFSSL_DILITHIUM_SMALL #define WOLFSSL_ARMASM diff --git a/IDE/STM32Cube/default_conf.ftl b/IDE/STM32Cube/default_conf.ftl index 951e319baf9..b43888931eb 100644 --- a/IDE/STM32Cube/default_conf.ftl +++ b/IDE/STM32Cube/default_conf.ftl @@ -660,9 +660,6 @@ extern ${variable.value} ${variable.name}; #undef WOLFSSL_HAVE_MLKEM #define WOLFSSL_HAVE_MLKEM - #undef WOLFSSL_WC_MLKEM - #define WOLFSSL_WC_MLKEM - #undef WOLFSSL_NO_SHAKE128 #undef WOLFSSL_SHAKE128 #define WOLFSSL_SHAKE128 diff --git a/IDE/XCODE/wolfssl-FIPS.xcodeproj/project.pbxproj b/IDE/XCODE/wolfssl-FIPS.xcodeproj/project.pbxproj index c96018c5a8c..0115d351590 100644 --- a/IDE/XCODE/wolfssl-FIPS.xcodeproj/project.pbxproj +++ b/IDE/XCODE/wolfssl-FIPS.xcodeproj/project.pbxproj @@ -125,7 +125,6 @@ 700F0CF52A2FC11300755BA7 /* eccsi.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 700F0CDB2A2FC0D500755BA7 /* eccsi.h */; }; 700F0CF62A2FC11300755BA7 /* ed448.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 700F0CD22A2FC0D500755BA7 /* ed448.h */; }; 700F0CF72A2FC11300755BA7 /* ed25519.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 700F0CE12A2FC0D500755BA7 /* ed25519.h */; }; - 700F0CF82A2FC11300755BA7 /* ext_mlkem.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 700F0CD52A2FC0D500755BA7 /* ext_mlkem.h */; }; 700F0CF92A2FC11300755BA7 /* falcon.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 700F0CDD2A2FC0D500755BA7 /* falcon.h */; }; 700F0CFA2A2FC11300755BA7 /* fe_448.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 700F0CDE2A2FC0D500755BA7 /* fe_448.h */; }; 700F0CFB2A2FC11300755BA7 /* fe_operations.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 700F0CC72A2FC0D400755BA7 /* fe_operations.h */; }; @@ -147,7 +146,6 @@ 700F0D0B2A2FC11300755BA7 /* sp.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 700F0CD12A2FC0D500755BA7 /* sp.h */; }; 700F0D0C2A2FC11300755BA7 /* sphincs.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 700F0CEC2A2FC0D500755BA7 /* sphincs.h */; }; 700F0D0D2A2FC11300755BA7 /* srp.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 700F0CDC2A2FC0D500755BA7 /* srp.h */; }; - 700F0D0E2A2FC11300755BA7 /* wc_mlkem.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 700F0CD82A2FC0D500755BA7 /* wc_mlkem.h */; }; 700F0D0F2A2FC11300755BA7 /* wc_pkcs11.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 700F0CE82A2FC0D500755BA7 /* wc_pkcs11.h */; }; 700F0D102A2FC11300755BA7 /* wolfevent.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 700F0CD62A2FC0D500755BA7 /* wolfevent.h */; }; 700F0D112A2FC11300755BA7 /* wolfmath.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 700F0CEB2A2FC0D500755BA7 /* wolfmath.h */; }; @@ -285,7 +283,6 @@ 700F0CF52A2FC11300755BA7 /* eccsi.h in CopyFiles */, 700F0CF62A2FC11300755BA7 /* ed448.h in CopyFiles */, 700F0CF72A2FC11300755BA7 /* ed25519.h in CopyFiles */, - 700F0CF82A2FC11300755BA7 /* ext_mlkem.h in CopyFiles */, 700F0CF92A2FC11300755BA7 /* falcon.h in CopyFiles */, 700F0CFA2A2FC11300755BA7 /* fe_448.h in CopyFiles */, 700F0CFB2A2FC11300755BA7 /* fe_operations.h in CopyFiles */, @@ -307,7 +304,6 @@ 700F0D0B2A2FC11300755BA7 /* sp.h in CopyFiles */, 700F0D0C2A2FC11300755BA7 /* sphincs.h in CopyFiles */, 700F0D0D2A2FC11300755BA7 /* srp.h in CopyFiles */, - 700F0D0E2A2FC11300755BA7 /* wc_mlkem.h in CopyFiles */, 700F0D0F2A2FC11300755BA7 /* wc_pkcs11.h in CopyFiles */, 700F0D102A2FC11300755BA7 /* wolfevent.h in CopyFiles */, 700F0D112A2FC11300755BA7 /* wolfmath.h in CopyFiles */, @@ -563,7 +559,7 @@ 700F0CC92A2FC0D500755BA7 /* selftest.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = selftest.h; path = ../../wolfssl/wolfcrypt/selftest.h; sourceTree = ""; }; 700F0CCA2A2FC0D500755BA7 /* ge_operations.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ge_operations.h; path = ../../wolfssl/wolfcrypt/ge_operations.h; sourceTree = ""; }; 700F0CCB2A2FC0D500755BA7 /* async.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = async.h; path = ../../wolfssl/wolfcrypt/async.h; sourceTree = ""; }; - 700F0CCC2A2FC0D500755BA7 /* mlkem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = mlkem.h; path = ../../wolfssl/wolfcrypt/mlkem.h; sourceTree = ""; }; + 700F0CCC2A2FC0D500755BA7 /* mlkem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = mlkem.h; path = ../../wolfssl/wolfcrypt/wc_mlkem.h; sourceTree = ""; }; 700F0CCD2A2FC0D500755BA7 /* hpke.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = hpke.h; path = ../../wolfssl/wolfcrypt/hpke.h; sourceTree = ""; }; 700F0CCE2A2FC0D500755BA7 /* cpuid.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = cpuid.h; path = ../../wolfssl/wolfcrypt/cpuid.h; sourceTree = ""; }; 700F0CCF2A2FC0D500755BA7 /* fips.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = fips.h; path = ../../wolfssl/wolfcrypt/fips.h; sourceTree = ""; }; @@ -572,10 +568,8 @@ 700F0CD22A2FC0D500755BA7 /* ed448.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ed448.h; path = ../../wolfssl/wolfcrypt/ed448.h; sourceTree = ""; }; 700F0CD32A2FC0D500755BA7 /* curve448.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = curve448.h; path = ../../wolfssl/wolfcrypt/curve448.h; sourceTree = ""; }; 700F0CD42A2FC0D500755BA7 /* siphash.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = siphash.h; path = ../../wolfssl/wolfcrypt/siphash.h; sourceTree = ""; }; - 700F0CD52A2FC0D500755BA7 /* ext_mlkem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ext_mlkem.h; path = ../../wolfssl/wolfcrypt/ext_mlkem.h; sourceTree = ""; }; 700F0CD62A2FC0D500755BA7 /* wolfevent.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = wolfevent.h; path = ../../wolfssl/wolfcrypt/wolfevent.h; sourceTree = ""; }; 700F0CD72A2FC0D500755BA7 /* cmac.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = cmac.h; path = ../../wolfssl/wolfcrypt/cmac.h; sourceTree = ""; }; - 700F0CD82A2FC0D500755BA7 /* wc_mlkem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = wc_mlkem.h; path = ../../wolfssl/wolfcrypt/wc_mlkem.h; sourceTree = ""; }; 700F0CD92A2FC0D500755BA7 /* pkcs11.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = pkcs11.h; path = ../../wolfssl/wolfcrypt/pkcs11.h; sourceTree = ""; }; 700F0CDA2A2FC0D500755BA7 /* mem_track.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = mem_track.h; path = ../../wolfssl/wolfcrypt/mem_track.h; sourceTree = ""; }; 700F0CDB2A2FC0D500755BA7 /* eccsi.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = eccsi.h; path = ../../wolfssl/wolfcrypt/eccsi.h; sourceTree = ""; }; @@ -643,7 +637,6 @@ 700F0CDB2A2FC0D500755BA7 /* eccsi.h */, 700F0CD22A2FC0D500755BA7 /* ed448.h */, 700F0CE12A2FC0D500755BA7 /* ed25519.h */, - 700F0CD52A2FC0D500755BA7 /* ext_mlkem.h */, 700F0CDD2A2FC0D500755BA7 /* falcon.h */, 700F0CDE2A2FC0D500755BA7 /* fe_448.h */, 700F0CC72A2FC0D400755BA7 /* fe_operations.h */, @@ -665,7 +658,6 @@ 700F0CD12A2FC0D500755BA7 /* sp.h */, 700F0CEC2A2FC0D500755BA7 /* sphincs.h */, 700F0CDC2A2FC0D500755BA7 /* srp.h */, - 700F0CD82A2FC0D500755BA7 /* wc_mlkem.h */, 700F0CE82A2FC0D500755BA7 /* wc_pkcs11.h */, 700F0CD62A2FC0D500755BA7 /* wolfevent.h */, 700F0CEB2A2FC0D500755BA7 /* wolfmath.h */, diff --git a/IDE/XCODE/wolfssl.xcodeproj/project.pbxproj b/IDE/XCODE/wolfssl.xcodeproj/project.pbxproj index 1c5d65d1c5d..2481d83d166 100644 --- a/IDE/XCODE/wolfssl.xcodeproj/project.pbxproj +++ b/IDE/XCODE/wolfssl.xcodeproj/project.pbxproj @@ -256,7 +256,6 @@ 700F0C0D2A2FBC5100755BA7 /* eccsi.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 700F0BF72A2FBC1600755BA7 /* eccsi.h */; }; 700F0C0E2A2FBC5100755BA7 /* ed448.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 700F0BF82A2FBC1600755BA7 /* ed448.h */; }; 700F0C0F2A2FBC5100755BA7 /* ed25519.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 700F0BF42A2FBC1600755BA7 /* ed25519.h */; }; - 700F0C102A2FBC5100755BA7 /* ext_mlkem.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 700F0BF92A2FBC1600755BA7 /* ext_mlkem.h */; }; 700F0C112A2FBC5100755BA7 /* falcon.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 700F0C022A2FBC1600755BA7 /* falcon.h */; }; 700F0C122A2FBC5100755BA7 /* fe_448.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 700F0BEB2A2FBC1500755BA7 /* fe_448.h */; }; 700F0C132A2FBC5100755BA7 /* fe_operations.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 700F0BF62A2FBC1600755BA7 /* fe_operations.h */; }; @@ -277,7 +276,6 @@ 700F0C222A2FBC5100755BA7 /* sp.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 700F0BE92A2FBC1500755BA7 /* sp.h */; }; 700F0C232A2FBC5100755BA7 /* sphincs.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 700F0BE22A2FBC1500755BA7 /* sphincs.h */; }; 700F0C242A2FBC5100755BA7 /* srp.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 700F0BF32A2FBC1600755BA7 /* srp.h */; }; - 700F0C252A2FBC5100755BA7 /* wc_mlkem.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 700F0BFF2A2FBC1600755BA7 /* wc_mlkem.h */; }; 700F0C262A2FBC5100755BA7 /* wc_pkcs11.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 700F0BF52A2FBC1600755BA7 /* wc_pkcs11.h */; }; 700F0C272A2FBC5100755BA7 /* wolfevent.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 700F0BE62A2FBC1500755BA7 /* wolfevent.h */; }; 700F0C282A2FBC5100755BA7 /* kdf.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 6AC8513B272CB04F00F2B32A /* kdf.h */; }; @@ -622,7 +620,6 @@ 700F0C0D2A2FBC5100755BA7 /* eccsi.h in CopyFiles */, 700F0C0E2A2FBC5100755BA7 /* ed448.h in CopyFiles */, 700F0C0F2A2FBC5100755BA7 /* ed25519.h in CopyFiles */, - 700F0C102A2FBC5100755BA7 /* ext_mlkem.h in CopyFiles */, 700F0C112A2FBC5100755BA7 /* falcon.h in CopyFiles */, 700F0C122A2FBC5100755BA7 /* fe_448.h in CopyFiles */, 700F0C132A2FBC5100755BA7 /* fe_operations.h in CopyFiles */, @@ -643,7 +640,6 @@ 700F0C222A2FBC5100755BA7 /* sp.h in CopyFiles */, 700F0C232A2FBC5100755BA7 /* sphincs.h in CopyFiles */, 700F0C242A2FBC5100755BA7 /* srp.h in CopyFiles */, - 700F0C252A2FBC5100755BA7 /* wc_mlkem.h in CopyFiles */, 700F0C262A2FBC5100755BA7 /* wc_pkcs11.h in CopyFiles */, 700F0C272A2FBC5100755BA7 /* wolfevent.h in CopyFiles */, 700F0C282A2FBC5100755BA7 /* kdf.h in CopyFiles */, @@ -982,7 +978,7 @@ 700F0BE72A2FBC1500755BA7 /* ge_448.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ge_448.h; path = ../../wolfssl/wolfcrypt/ge_448.h; sourceTree = ""; }; 700F0BE82A2FBC1500755BA7 /* sp_int.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = sp_int.h; path = ../../wolfssl/wolfcrypt/sp_int.h; sourceTree = ""; }; 700F0BE92A2FBC1500755BA7 /* sp.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = sp.h; path = ../../wolfssl/wolfcrypt/sp.h; sourceTree = ""; }; - 700F0BEA2A2FBC1500755BA7 /* mlkem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = mlkem.h; path = ../../wolfssl/wolfcrypt/mlkem.h; sourceTree = ""; }; + 700F0BEA2A2FBC1500755BA7 /* mlkem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = mlkem.h; path = ../../wolfssl/wolfcrypt/wc_mlkem.h; sourceTree = ""; }; 700F0BEB2A2FBC1500755BA7 /* fe_448.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = fe_448.h; path = ../../wolfssl/wolfcrypt/fe_448.h; sourceTree = ""; }; 700F0BEC2A2FBC1500755BA7 /* pkcs12.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = pkcs12.h; path = ../../wolfssl/wolfcrypt/pkcs12.h; sourceTree = ""; }; 700F0BED2A2FBC1500755BA7 /* chacha20_poly1305.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = chacha20_poly1305.h; path = ../../wolfssl/wolfcrypt/chacha20_poly1305.h; sourceTree = ""; }; @@ -997,13 +993,11 @@ 700F0BF62A2FBC1600755BA7 /* fe_operations.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = fe_operations.h; path = ../../wolfssl/wolfcrypt/fe_operations.h; sourceTree = ""; }; 700F0BF72A2FBC1600755BA7 /* eccsi.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = eccsi.h; path = ../../wolfssl/wolfcrypt/eccsi.h; sourceTree = ""; }; 700F0BF82A2FBC1600755BA7 /* ed448.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ed448.h; path = ../../wolfssl/wolfcrypt/ed448.h; sourceTree = ""; }; - 700F0BF92A2FBC1600755BA7 /* ext_mlkem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ext_mlkem.h; path = ../../wolfssl/wolfcrypt/ext_mlkem.h; sourceTree = ""; }; 700F0BFA2A2FBC1600755BA7 /* sha3.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = sha3.h; path = ../../wolfssl/wolfcrypt/sha3.h; sourceTree = ""; }; 700F0BFB2A2FBC1600755BA7 /* signature.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = signature.h; path = ../../wolfssl/wolfcrypt/signature.h; sourceTree = ""; }; 700F0BFC2A2FBC1600755BA7 /* cmac.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = cmac.h; path = ../../wolfssl/wolfcrypt/cmac.h; sourceTree = ""; }; 700F0BFD2A2FBC1600755BA7 /* pkcs11.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = pkcs11.h; path = ../../wolfssl/wolfcrypt/pkcs11.h; sourceTree = ""; }; 700F0BFE2A2FBC1600755BA7 /* siphash.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = siphash.h; path = ../../wolfssl/wolfcrypt/siphash.h; sourceTree = ""; }; - 700F0BFF2A2FBC1600755BA7 /* wc_mlkem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = wc_mlkem.h; path = ../../wolfssl/wolfcrypt/wc_mlkem.h; sourceTree = ""; }; 700F0C002A2FBC1600755BA7 /* fips.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = fips.h; path = ../../wolfssl/wolfcrypt/fips.h; sourceTree = ""; }; 700F0C012A2FBC1600755BA7 /* ge_operations.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ge_operations.h; path = ../../wolfssl/wolfcrypt/ge_operations.h; sourceTree = ""; }; 700F0C022A2FBC1600755BA7 /* falcon.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = falcon.h; path = ../../wolfssl/wolfcrypt/falcon.h; sourceTree = ""; }; @@ -1153,7 +1147,6 @@ 700F0BF72A2FBC1600755BA7 /* eccsi.h */, 700F0BF82A2FBC1600755BA7 /* ed448.h */, 700F0BF42A2FBC1600755BA7 /* ed25519.h */, - 700F0BF92A2FBC1600755BA7 /* ext_mlkem.h */, 700F0C022A2FBC1600755BA7 /* falcon.h */, 700F0BEB2A2FBC1500755BA7 /* fe_448.h */, 700F0BF62A2FBC1600755BA7 /* fe_operations.h */, @@ -1174,7 +1167,6 @@ 700F0BE92A2FBC1500755BA7 /* sp.h */, 700F0BE22A2FBC1500755BA7 /* sphincs.h */, 700F0BF32A2FBC1600755BA7 /* srp.h */, - 700F0BFF2A2FBC1600755BA7 /* wc_mlkem.h */, 700F0BF52A2FBC1600755BA7 /* wc_pkcs11.h */, 700F0BE62A2FBC1500755BA7 /* wolfevent.h */, 5216465E1A8993770062516A /* aes.h */, diff --git a/INSTALL b/INSTALL index dc6e2908c1a..c97cc548658 100644 --- a/INSTALL +++ b/INSTALL @@ -250,16 +250,18 @@ Congratulations! You have just achieved a fully quantum-safe TLS 1.3 connection! - The following NIST Competition winning algorithms are supported: + The following NIST Competition winning algorithms are supported by the + native wolfSSL implementation: - ML-KEM (CRYSTALS-KYBER) (key encapsulation mechanism) - ML-DSA (CRYSTALS-Dilithium) (signature scheme) - The following NIST Competition winning algorithms were supported by our - liboqs integration. Support for their standardized specifications will - return when we write our own implementations. + Falcon (signature scheme) is still provided through liboqs integration. + To enable it, pass both --with-liboqs and --enable-falcon to configure + (CMake: -DWOLFSSL_OQS=yes -DWOLFSSL_FALCON=yes). Passing --with-liboqs + without --enable-falcon (or vice versa) is now an error. - - FALCON (signature scheme) - - SPHINCS+ (signature scheme) + SPHINCS+ is in the middle of being replaced with native SLH-DSA; see + PR #10261. Until that lands, SPHINCS+ continues to build via liboqs. The following NIST Competition Round 3 finalist algorithms were supported, but have been removed after 5.3.3 diff --git a/certs/falcon/bench_falcon_level1_key.der b/certs/falcon/bench_falcon_level1_key.der index 1ff376d0ef7..32d0e84e68e 100644 Binary files a/certs/falcon/bench_falcon_level1_key.der and b/certs/falcon/bench_falcon_level1_key.der differ diff --git a/certs/falcon/bench_falcon_level5_key.der b/certs/falcon/bench_falcon_level5_key.der index a0eaa2a3b79..15f25b19f69 100644 Binary files a/certs/falcon/bench_falcon_level5_key.der and b/certs/falcon/bench_falcon_level5_key.der differ diff --git a/cmake/functions.cmake b/cmake/functions.cmake index 1a5442ddfd2..959eee24c49 100644 --- a/cmake/functions.cmake +++ b/cmake/functions.cmake @@ -213,11 +213,12 @@ function(generate_build_flags) if(WOLFSSL_DILITHIUM OR WOLFSSL_USER_SETTINGS) set(BUILD_DILITHIUM "yes" PARENT_SCOPE) endif() - if(WOLFSSL_OQS OR WOLFSSL_USER_SETTINGS) + if(WOLFSSL_FALCON OR WOLFSSL_USER_SETTINGS) set(BUILD_FALCON "yes" PARENT_SCOPE) + set(BUILD_OQS_HELPER "yes" PARENT_SCOPE) + endif() + if(WOLFSSL_OQS OR WOLFSSL_USER_SETTINGS) set(BUILD_SPHINCS "yes" PARENT_SCOPE) - set(BUILD_DILITHIUM "yes" PARENT_SCOPE) - set(BUILD_EXT_MLKEM "yes" PARENT_SCOPE) set(BUILD_OQS_HELPER "yes" PARENT_SCOPE) endif() if(WOLFSSL_LMS OR WOLFSSL_USER_SETTINGS) @@ -1070,10 +1071,6 @@ function(generate_lib_src_list LIB_SOURCES) endif() endif() - if(BUILD_EXT_MLKEM) - list(APPEND LIB_SOURCES wolfcrypt/src/ext_mlkem.c) - endif() - if(BUILD_WC_LMS) list(APPEND LIB_SOURCES wolfcrypt/src/wc_lms.c) list(APPEND LIB_SOURCES wolfcrypt/src/wc_lms_impl.c) diff --git a/cmake/options.h.in b/cmake/options.h.in index 12ab8285e40..1fe054b276f 100644 --- a/cmake/options.h.in +++ b/cmake/options.h.in @@ -380,12 +380,8 @@ extern "C" { #cmakedefine WOLFSSL_EXPERIMENTAL_SETTINGS #undef WOLFSSL_HAVE_MLKEM #cmakedefine WOLFSSL_HAVE_MLKEM -#undef WOLFSSL_WC_MLKEM -#cmakedefine WOLFSSL_WC_MLKEM #undef WOLFSSL_TLS_NO_MLKEM_STANDALONE #cmakedefine WOLFSSL_TLS_NO_MLKEM_STANDALONE -#undef WOLFSSL_WC_DILITHIUM -#cmakedefine WOLFSSL_WC_DILITHIUM #undef NO_WOLFSSL_STUB #cmakedefine NO_WOLFSSL_STUB #undef HAVE_ECC_SECPR2 diff --git a/configure.ac b/configure.ac index 69f8501f04d..959b3343e90 100644 --- a/configure.ac +++ b/configure.ac @@ -1706,6 +1706,23 @@ AC_ARG_WITH([liboqs], ] ) +# Falcon (provided via liboqs) +AC_ARG_ENABLE([falcon], + [AS_HELP_STRING([--enable-falcon],[Enable Falcon post-quantum signatures via liboqs (default: disabled)])], + [ ENABLED_FALCON=$enableval ], + [ ENABLED_FALCON=no ]) + +if test "$ENABLED_FALCON" = "yes" && test "$ENABLED_LIBOQS" = "no"; then + AC_MSG_ERROR([--enable-falcon requires --with-liboqs.]) +fi +if test "$ENABLED_LIBOQS" = "yes" && test "$ENABLED_FALCON" != "yes"; then + AC_MSG_ERROR([--with-liboqs requires --enable-falcon.]) +fi + +if test "$ENABLED_FALCON" = "yes"; then + AM_CFLAGS="$AM_CFLAGS -DHAVE_FALCON" +fi + # MLKEM # Used: @@ -1851,13 +1868,9 @@ then AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_DILITHIUM_NO_VERIFY" fi - if test "$ENABLED_LIBOQS" = "no"; then - AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_WC_DILITHIUM" - AM_CCASFLAGS="$AM_CCASFLAGS -DWOLFSSL_WC_DILITHIUM" - test "$enable_sha3" = "" && enable_sha3=yes - test "$enable_shake128" = "" && enable_shake128=yes - test "$enable_shake256" = "" && enable_shake256=yes - fi + test "$enable_sha3" = "" && enable_sha3=yes + test "$enable_shake128" = "" && enable_shake128=yes + test "$enable_shake256" = "" && enable_shake256=yes ENABLED_CERTS=yes fi @@ -6830,7 +6843,6 @@ then fi fi -ENABLED_WC_MLKEM=no ENABLED_ML_KEM=unset ENABLED_MLKEM_MAKE_KEY=no ENABLED_MLKEM_ENCAPSULATE=no @@ -6900,12 +6912,6 @@ done if test "$ENABLED_MLKEM" != "no" then AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_HAVE_MLKEM" - # Use liboqs if specified. - if test "$ENABLED_LIBOQS" = "no"; then - ENABLED_WC_MLKEM=yes - AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_WC_MLKEM" - AM_CCASFLAGS="$AM_CCASFLAGS -DWOLFSSL_WC_MLKEM" - fi if test "$ENABLED_ORIGINAL" = "yes"; then AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_MLKEM_KYBER" @@ -6948,12 +6954,9 @@ then AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_MLKEM_NO_DECAPSULATE" fi - if test "$ENABLED_WC_MLKEM" = "yes" - then - test "$enable_sha3" = "" && enable_sha3=yes - test "$enable_shake128" = "" && enable_shake128=yes - test "$enable_shake256" = "" && enable_shake256=yes - fi + test "$enable_sha3" = "" && enable_sha3=yes + test "$enable_shake128" = "" && enable_shake128=yes + test "$enable_shake256" = "" && enable_shake256=yes fi AS_IF([ test "$ENABLED_MLKEM_STANDALONE" = "yes" && test "$ENABLED_ML_KEM" = "no" ],[AC_MSG_ERROR([ML-KEM as standalone TLS key exchange (non-hybrid) requires ML-KEM.])]) @@ -7709,12 +7712,12 @@ then AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_REQUIRE_FFDHE" fi -# TLS 1.3 Requires either ECC or (RSA/DH), or CURVE25519/ED25519 or CURVE448/ED448 or libOQS +# TLS 1.3 Requires either ECC or (RSA/DH), or CURVE25519/ED25519 or CURVE448/ED448 or ML-KEM if test "x$ENABLED_PSK" = "xno" && test "x$ENABLED_ECC" = "xno" && \ (test "x$ENABLED_RSA" = "xno" || test "x$ENABLED_DH" = "xno") && \ (test "x$ENABLED_CURVE25519" = "xno" || test "x$ENABLED_ED25519" = "xno") && \ (test "x$ENABLED_CURVE448" = "xno" || test "x$ENABLED_ED448" = "xno") && \ - test "x$ENABLED_LIBOQS" = "xno" + test "x$ENABLED_MLKEM" = "xno" then # disable TLS 1.3 ENABLED_TLS13=no @@ -11574,7 +11577,7 @@ AM_CONDITIONAL([BUILD_CURVE448_SMALL],[test "x$ENABLED_CURVE448_SMALL" = "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_WC_SLHDSA],[test "x$ENABLED_SLHDSA" != "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_WC_MLKEM],[test "x$ENABLED_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"]) AM_CONDITIONAL([BUILD_SAKKE],[test "x$ENABLED_SAKKE" = "xyes" || test "x$ENABLED_USERSETTINGS" = "xyes"]) @@ -12129,7 +12132,6 @@ echo " * XMSS_ROOT: $XMSS_ROOT" fi echo " * SLH-DSA $ENABLED_SLHDSA" echo " * MLKEM: $ENABLED_MLKEM" -echo " * MLKEM wolfSSL impl: $ENABLED_WC_MLKEM" echo " * DILITHIUM: $ENABLED_DILITHIUM" echo " * ECCSI $ENABLED_ECCSI" echo " * SAKKE $ENABLED_SAKKE" @@ -12190,6 +12192,7 @@ echo " * Public Key Callbacks: $ENABLED_PKCALLBACKS" echo " * libxmss: $ENABLED_LIBXMSS" echo " * liblms: $ENABLED_LIBLMS" echo " * liboqs: $ENABLED_LIBOQS" +echo " * Falcon (via liboqs): $ENABLED_FALCON" echo " * Whitewood netRandom: $ENABLED_WNR" echo " * Server Name Indication: $ENABLED_SNI" echo " * ALPN: $ENABLED_ALPN" diff --git a/examples/benchmark/tls_bench.c b/examples/benchmark/tls_bench.c index 85645224fdb..d0b799eb466 100644 --- a/examples/benchmark/tls_bench.c +++ b/examples/benchmark/tls_bench.c @@ -294,7 +294,7 @@ static struct group_info groups[] = { { WOLFSSL_FFDHE_4096, "FFDHE_4096" }, { WOLFSSL_FFDHE_6144, "FFDHE_6144" }, { WOLFSSL_FFDHE_8192, "FFDHE_8192" }, -#ifdef HAVE_PQC +#ifdef WOLFSSL_HAVE_MLKEM #ifndef WOLFSSL_NO_ML_KEM #ifndef WOLFSSL_TLS_NO_MLKEM_STANDALONE { WOLFSSL_ML_KEM_512, "ML_KEM_512" }, diff --git a/examples/client/client.c b/examples/client/client.c index dfcfe5942ba..1e920bf104d 100644 --- a/examples/client/client.c +++ b/examples/client/client.c @@ -417,7 +417,7 @@ static void SetKeyShare(WOLFSSL* ssl, int onlyKeyShare, int useX25519, } while (ret == WC_NO_ERR_TRACE(WC_PENDING_E)); #endif } - #ifdef HAVE_PQC + #ifdef WOLFSSL_HAVE_MLKEM if (onlyKeyShare == 0 || onlyKeyShare == 3) { if (usePqc) { int group = 0; @@ -1414,7 +1414,7 @@ static const char* client_usage_msg[][81] = { "-7 Set minimum downgrade protocol version [0-4] " " SSLv3(0) - TLS1.3(4)\n", /* 68 */ #endif -#ifdef HAVE_PQC +#ifdef WOLFSSL_HAVE_MLKEM "--pqc Key Share with specified post-quantum algorithm only:\n" #ifndef WOLFSSL_NO_ML_KEM " ML_KEM_512, ML_KEM_768, ML_KEM_1024,\n" @@ -1687,7 +1687,7 @@ static const char* client_usage_msg[][81] = { "-7 最小ダウングレード可能なプロトコルバージョンを設定します [0-4] " " SSLv3(0) - TLS1.3(4)\n", /* 68 */ #endif -#ifdef HAVE_PQC +#ifdef WOLFSSL_HAVE_MLKEM "--pqc post-quantum 名前付きグループとの鍵共有のみ:\n" #ifndef WOLFSSL_NO_ML_KEM " ML_KEM_512, ML_KEM_768, ML_KEM_1024,\n" @@ -1959,7 +1959,7 @@ static void Usage(void) printf("%s", msg[++msgid]); /* --wolfsentry-config */ #endif printf("%s", msg[++msgid]); /* -7 */ -#ifdef HAVE_PQC +#ifdef WOLFSSL_HAVE_MLKEM printf("%s", msg[++msgid]); /* --pqc */ #endif #ifdef WOLFSSL_SRTP @@ -2140,7 +2140,7 @@ THREAD_RETURN WOLFSSL_THREAD client_test(void* args) #ifndef NO_MULTIBYTE_PRINT { "ヘルプ", 0, 258 }, #endif -#if defined(HAVE_PQC) +#if defined(WOLFSSL_HAVE_MLKEM) { "pqc", 1, 259 }, #endif #ifdef WOLFSSL_SRTP @@ -3025,7 +3025,7 @@ THREAD_RETURN WOLFSSL_THREAD client_test(void* args) break; #endif -#if defined(HAVE_PQC) +#if defined(WOLFSSL_HAVE_MLKEM) case 259: { usePqc = 1; @@ -3235,7 +3235,7 @@ THREAD_RETURN WOLFSSL_THREAD client_test(void* args) err_sys("can't load whitewood net random config file"); #endif -#ifdef HAVE_PQC +#ifdef WOLFSSL_HAVE_MLKEM if (usePqc) { if (version == CLIENT_DOWNGRADE_VERSION || version == EITHER_DOWNGRADE_VERSION) diff --git a/examples/configs/user_settings_ca.h b/examples/configs/user_settings_ca.h index 73e1e06c2f8..7bc4e63c82b 100644 --- a/examples/configs/user_settings_ca.h +++ b/examples/configs/user_settings_ca.h @@ -149,7 +149,6 @@ extern "C" { #if 0 /* ML-DSA / Dilithium certificates */ #define WOLFSSL_EXPERIMENTAL_SETTINGS #define HAVE_DILITHIUM - #define WOLFSSL_WC_DILITHIUM #define WOLFSSL_SHAKE128 #define WOLFSSL_SHAKE256 #endif diff --git a/examples/configs/user_settings_espressif.h b/examples/configs/user_settings_espressif.h index 5f4e0b81d6b..bd2d4e726b5 100644 --- a/examples/configs/user_settings_espressif.h +++ b/examples/configs/user_settings_espressif.h @@ -215,7 +215,6 @@ #ifdef CONFIG_ESP_WOLFSSL_ENABLE_MLKEM /* Kyber typically needs a minimum 10K stack */ #define WOLFSSL_HAVE_MLKEM - #define WOLFSSL_WC_MLKEM #define WOLFSSL_SHAKE128 #define WOLFSSL_SHAKE256 @@ -234,7 +233,7 @@ #define WOLFSSL_NO_ML_KEM_768 #define NO_SESSION_CACHE #else - /* Only needed for older wolfssl versions, see mlkem.h */ + /* Only needed for older wolfssl versions, see wc_mlkem.h */ #define WOLFSSL_KYBER1024 /* optional alternative sizes: */ /* #define WOLFSSL_KYBER768 */ diff --git a/examples/configs/user_settings_platformio.h b/examples/configs/user_settings_platformio.h index df422306e71..3abaf6ff8e7 100644 --- a/examples/configs/user_settings_platformio.h +++ b/examples/configs/user_settings_platformio.h @@ -59,7 +59,6 @@ #if 0 /* Kyber typically needs a minimum 10K stack */ #define WOLFSSL_HAVE_MLKEM - #define WOLFSSL_WC_MLKEM #define WOLFSSL_SHA3 #endif diff --git a/examples/configs/user_settings_pq.h b/examples/configs/user_settings_pq.h index b207cbd95bb..a85bdaf69ea 100644 --- a/examples/configs/user_settings_pq.h +++ b/examples/configs/user_settings_pq.h @@ -88,7 +88,6 @@ extern "C" { /* ------------------------------------------------- */ #if 1 /* ML-DSA (FIPS 204) */ #define HAVE_DILITHIUM - #define WOLFSSL_WC_DILITHIUM #define DILITHIUM_LEVEL2 /* Level 2: ~128-bit security */ #define DILITHIUM_LEVEL3 /* Level 3: ~192-bit security */ #define DILITHIUM_LEVEL5 /* Level 5: ~256-bit security */ diff --git a/examples/configs/user_settings_stm32.h b/examples/configs/user_settings_stm32.h index 1084c9d180b..765e4375149 100644 --- a/examples/configs/user_settings_stm32.h +++ b/examples/configs/user_settings_stm32.h @@ -671,9 +671,6 @@ extern "C" { #undef WOLFSSL_HAVE_MLKEM #define WOLFSSL_HAVE_MLKEM - #undef WOLFSSL_WC_MLKEM - #define WOLFSSL_WC_MLKEM - #undef WOLFSSL_NO_SHAKE128 #undef WOLFSSL_SHAKE128 #define WOLFSSL_SHAKE128 diff --git a/examples/configs/user_settings_wolfboot_keytools.h b/examples/configs/user_settings_wolfboot_keytools.h index 8c44d3f0f7e..450f91b970a 100644 --- a/examples/configs/user_settings_wolfboot_keytools.h +++ b/examples/configs/user_settings_wolfboot_keytools.h @@ -117,7 +117,6 @@ extern "C" { #if 1 /* ML-DSA / Dilithium */ #define HAVE_DILITHIUM - #define WOLFSSL_WC_DILITHIUM /* Builds to FIPS 204 final standard by default. * Set to 1 for draft version. */ #if 0 /* FIPS 204 Draft */ diff --git a/examples/server/server.c b/examples/server/server.c index 25ae7851517..4030af72dff 100644 --- a/examples/server/server.c +++ b/examples/server/server.c @@ -704,7 +704,7 @@ static void SetKeyShare(WOLFSSL* ssl, int onlyKeyShare, int useX25519, #endif } else if (usePqc == 1) { - #ifdef HAVE_PQC + #ifdef WOLFSSL_HAVE_MLKEM groups[count] = 0; #ifndef WOLFSSL_NO_ML_KEM #if !defined(WOLFSSL_NO_ML_KEM_512) && \ @@ -1082,7 +1082,7 @@ static const char* server_usage_msg[][71] = { "-7 Set minimum downgrade protocol version [0-4] " " SSLv3(0) - TLS1.3(4)\n", /* 59 */ #endif -#ifdef HAVE_PQC +#ifdef WOLFSSL_HAVE_MLKEM "--pqc Key Share with specified post-quantum algorithm only:\n" #ifndef WOLFSSL_NO_ML_KEM " ML_KEM_512, ML_KEM_768, ML_KEM_1024,\n" @@ -1309,7 +1309,7 @@ static const char* server_usage_msg[][71] = { "-7 最小ダウングレード可能なプロトコルバージョンを設定します [0-4] " " SSLv3(0) - TLS1.3(4)\n", /* 59 */ #endif -#ifdef HAVE_PQC +#ifdef WOLFSSL_HAVE_MLKEM "--pqc post-quantum 名前付きグループとの鍵共有のみ:\n" #ifndef WOLFSSL_NO_ML_KEM " ML_KEM_512, ML_KEM_768, ML_KEM_1024," @@ -1510,7 +1510,7 @@ static void Usage(void) printf("%s", msg[++msgId]); /* --wolfsentry-config */ #endif printf("%s", msg[++msgId]); /* -7 */ -#ifdef HAVE_PQC +#ifdef WOLFSSL_HAVE_MLKEM printf("%s", msg[++msgId]); /* --pqc */ printf("%s", msg[++msgId]); /* --pqc options */ printf("%s", msg[++msgId]); /* more --pqc options */ @@ -1633,7 +1633,7 @@ THREAD_RETURN WOLFSSL_THREAD server_test(void* args) #ifndef NO_MULTIBYTE_PRINT { "ヘルプ", 0, 258 }, #endif -#if defined(HAVE_PQC) +#if defined(WOLFSSL_HAVE_MLKEM) { "pqc", 1, 259 }, #endif #ifdef WOLFSSL_SRTP @@ -2453,7 +2453,7 @@ THREAD_RETURN WOLFSSL_THREAD server_test(void* args) break; #endif -#ifdef HAVE_PQC +#ifdef WOLFSSL_HAVE_MLKEM case 259: { usePqc = 1; @@ -2688,7 +2688,7 @@ THREAD_RETURN WOLFSSL_THREAD server_test(void* args) "file"); #endif -#ifdef HAVE_PQC +#ifdef WOLFSSL_HAVE_MLKEM if (usePqc) { if (version == SERVER_DOWNGRADE_VERSION || version == EITHER_DOWNGRADE_VERSION) { diff --git a/gencertbuf.pl b/gencertbuf.pl index 6699c9f2adb..110465666db 100755 --- a/gencertbuf.pl +++ b/gencertbuf.pl @@ -147,14 +147,14 @@ ); #Falcon Post-Quantum Keys -#Used with HAVE_PQC +#Used with HAVE_FALCON my @fileList_falcon = ( ["certs/falcon/bench_falcon_level1_key.der", "bench_falcon_level1_key" ], ["certs/falcon/bench_falcon_level5_key.der", "bench_falcon_level5_key" ], ); #Sphincs+ Post-Quantum Keys -#Used with HAVE_PQC +#Used with HAVE_SPHINCS my @fileList_sphincs = ( ["certs/sphincs/bench_sphincs_fast_level1_key.der", "bench_sphincs_fast_level1_key" ], ["certs/sphincs/bench_sphincs_fast_level3_key.der", "bench_sphincs_fast_level3_key" ], diff --git a/linuxkm/module_exports.c.template b/linuxkm/module_exports.c.template index ad2f07cac95..a0a7afb988b 100644 --- a/linuxkm/module_exports.c.template +++ b/linuxkm/module_exports.c.template @@ -152,11 +152,8 @@ #endif #ifdef WOLFSSL_HAVE_MLKEM - #include -#ifdef WOLFSSL_WC_MLKEM #include #endif -#endif #if defined(WOLFSSL_HAVE_XMSS) #include #ifdef HAVE_LIBXMSS diff --git a/scripts/asn1_oid_sum.pl b/scripts/asn1_oid_sum.pl index 8c5200d2d38..321a803079c 100755 --- a/scripts/asn1_oid_sum.pl +++ b/scripts/asn1_oid_sum.pl @@ -201,6 +201,10 @@ sub print_header { #ifndef WOLF_CRYPT_OID_SUM_H #define WOLF_CRYPT_OID_SUM_H +/* Note for some CPUs smaller than 32 bit, the upper 16 bits of new OID + * values may be ignored. If collisions are encountered, consider WC_16BIT_CPU + * and/or WOLFSSL_OLD_OID_SUM to force smaller, old OID values. */ + " } @@ -290,8 +294,8 @@ sub print_footer { my @ed448 = ( 1, 3, 101, 113 ); my @x448 = ( 1, 3, 101, 111 ); my @dh = ( 1, 2, 840, 113549, 1, 3, 1 ); -my @falcon_1 = ( 1, 3, 9999, 3, 6 ); -my @falcon_5 = ( 1, 3, 9999, 3, 9 ); +my @falcon_1 = ( 1, 3, 9999, 3, 11 ); +my @falcon_5 = ( 1, 3, 9999, 3, 14 ); my @dilithium_2 = ( 1, 3, 6, 1, 4, 1, 2, 267, 12, 4, 4 ); my @dilithium_3 = ( 1, 3, 6, 1, 4, 1, 2, 267, 12, 6, 5 ); my @dilithium_5 = ( 1, 3, 6, 1, 4, 1, 2, 267, 12, 8, 7 ); @@ -319,7 +323,8 @@ sub print_footer { { name => "X448", oid => \@x448 }, { name => "DH", oid => \@dh }, { name => "FALCON_LEVEL1", oid => \@falcon_1 }, - { name => "FALCON_LEVEL5", oid => \@falcon_5 }, + { name => "FALCON_LEVEL5", oid => \@falcon_5, + oid_sum => 279 }, { name => "DILITHIUM_LEVEL2", oid => \@dilithium_2 }, { name => "DILITHIUM_LEVEL3", oid => \@dilithium_3 }, { name => "DILITHIUM_LEVEL5", oid => \@dilithium_5 }, @@ -1109,6 +1114,7 @@ sub print_footer { { name => "CTC_FALCON_LEVEL1", oid => \@falcon_1, same => 1 }, { name => "CTC_FALCON_LEVEL5", oid => \@falcon_5, + oid_sum => 279, same => 1 }, { name => "CTC_DILITHIUM_LEVEL2", oid => \@dilithium_2, same => 1 }, @@ -1149,6 +1155,7 @@ sub print_footer { my @p7t_compressed_data = ( 1, 2, 840, 113549, 1, 9, 16, 1, 9 ); my @p7t_firmware_pkg_data = ( 1, 2, 840, 113549, 1, 9, 16, 1, 16 ); my @p7t_auth_env_data = ( 1, 2, 840, 113549, 1, 9, 16, 1, 23 ); +my @p7t_encrypted_key_package = ( 2, 16, 840, 1, 101, 2, 1, 2, 78, 2 ); my @pkcs7_types = ( { name => "PKCS7_MSG", oid => \@p7t_pkcs7_msg }, @@ -1161,6 +1168,7 @@ sub print_footer { { name => "ENCRYPTED_DATA", oid => \@p7t_encrypted_data }, { name => "FIRMWARE_PKG_DATA", oid => \@p7t_firmware_pkg_data }, { name => "AUTH_ENVELOPED_DATA", oid => \@p7t_auth_env_data }, + { name => "ENCRYPTED_KEY_PACKAGE", oid => \@p7t_encrypted_key_package }, ); print_enum("PKCS7_TYPES", "", \@pkcs7_types, 32, 46); diff --git a/src/include.am b/src/include.am index c4f6b8a6739..b3784885f97 100644 --- a/src/include.am +++ b/src/include.am @@ -1587,9 +1587,7 @@ endif if BUILD_LIBOQS src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/falcon.c -src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/dilithium.c src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/sphincs.c -src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/ext_mlkem.c src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/liboqs/liboqs.c endif diff --git a/src/internal.c b/src/internal.c index 067dd1b04d0..e98e6cb998f 100644 --- a/src/internal.c +++ b/src/internal.c @@ -30779,9 +30779,9 @@ static int DecodePrivateKey_ex(WOLFSSL *ssl, byte keyType, const DerBuffer* key, /* Set start of data to beginning of buffer. */ idx = 0; /* Decode the key assuming it is a Falcon private key. */ - ret = wc_falcon_import_private_only(key->buffer, - key->length, - (falcon_key*)*hsKey); + ret = wc_Falcon_PrivateKeyDecode(key->buffer, &idx, + (falcon_key*)*hsKey, + key->length); if (ret == 0) { WOLFSSL_MSG("Using Falcon private key"); diff --git a/src/ssl.c b/src/ssl.c index 9b31e0038c8..f020ba206f3 100644 --- a/src/ssl.c +++ b/src/ssl.c @@ -3231,26 +3231,23 @@ static int isValidCurveGroup(word16 name) case WOLFSSL_ML_KEM_768: case WOLFSSL_ML_KEM_1024: #endif /* !WOLFSSL_TLS_NO_MLKEM_STANDALONE */ - #if defined(WOLFSSL_WC_MLKEM) || defined(HAVE_LIBOQS) - #ifdef WOLFSSL_PQC_HYBRIDS + #ifdef WOLFSSL_PQC_HYBRIDS case WOLFSSL_SECP384R1MLKEM1024: case WOLFSSL_X25519MLKEM768: case WOLFSSL_SECP256R1MLKEM768: - #endif /* WOLFSSL_PQC_HYBRIDS */ - #ifdef WOLFSSL_EXTRA_PQC_HYBRIDS + #endif /* WOLFSSL_PQC_HYBRIDS */ + #ifdef WOLFSSL_EXTRA_PQC_HYBRIDS case WOLFSSL_SECP256R1MLKEM512: case WOLFSSL_SECP384R1MLKEM768: case WOLFSSL_SECP521R1MLKEM1024: case WOLFSSL_X25519MLKEM512: case WOLFSSL_X448MLKEM768: - #endif /* WOLFSSL_EXTRA_PQC_HYBRIDS */ - #endif + #endif /* WOLFSSL_EXTRA_PQC_HYBRIDS */ #endif /* !WOLFSSL_NO_ML_KEM */ #ifdef WOLFSSL_MLKEM_KYBER case WOLFSSL_KYBER_LEVEL1: case WOLFSSL_KYBER_LEVEL3: case WOLFSSL_KYBER_LEVEL5: - #if defined(WOLFSSL_WC_MLKEM) || defined(HAVE_LIBOQS) case WOLFSSL_P256_KYBER_LEVEL1: case WOLFSSL_P384_KYBER_LEVEL3: case WOLFSSL_P521_KYBER_LEVEL5: @@ -3258,7 +3255,6 @@ static int isValidCurveGroup(word16 name) case WOLFSSL_X448_KYBER_LEVEL3: case WOLFSSL_X25519_KYBER_LEVEL3: case WOLFSSL_P256_KYBER_LEVEL3: - #endif #endif /* WOLFSSL_MLKEM_KYBER */ #endif return 1; @@ -10935,7 +10931,6 @@ const char* wolfSSL_get_curve_name(WOLFSSL* ssl) if (IsAtLeastTLSv1_3(ssl->version)) { switch (ssl->namedGroup) { #ifndef WOLFSSL_NO_ML_KEM -#if defined(WOLFSSL_WC_MLKEM) #ifndef WOLFSSL_NO_ML_KEM_512 case WOLFSSL_ML_KEM_512: return "ML_KEM_512"; @@ -10992,37 +10987,8 @@ const char* wolfSSL_get_curve_name(WOLFSSL* ssl) return "SecP521r1MLKEM1024"; #endif /* WOLFSSL_EXTRA_PQC_HYBRIDS */ #endif /* WOLFSSL_NO_ML_KEM_1024 */ -#elif defined(HAVE_LIBOQS) - case WOLFSSL_ML_KEM_512: - return "ML_KEM_512"; - case WOLFSSL_ML_KEM_768: - return "ML_KEM_768"; - case WOLFSSL_ML_KEM_1024: - return "ML_KEM_1024"; - case WOLFSSL_SECP256R1MLKEM512: - return "SecP256r1MLKEM512"; - case WOLFSSL_SECP384R1MLKEM768: - return "SecP384r1MLKEM768"; - case WOLFSSL_SECP256R1MLKEM768: - return "SecP256r1MLKEM768"; - case WOLFSSL_SECP521R1MLKEM1024: - return "SecP521r1MLKEM1024"; - case WOLFSSL_SECP384R1MLKEM1024: - return "SecP384r1MLKEM1024"; - #ifdef HAVE_CURVE25519 - case WOLFSSL_X25519MLKEM512: - return "X25519MLKEM512"; - case WOLFSSL_X25519MLKEM768: - return "X25519MLKEM768"; - #endif - #ifdef HAVE_CURVE448 - case WOLFSSL_X448MLKEM768: - return "X448MLKEM768"; - #endif -#endif /* WOLFSSL_WC_MLKEM */ #endif /* WOLFSSL_NO_ML_KEM */ #ifdef WOLFSSL_MLKEM_KYBER -#if defined(WOLFSSL_WC_MLKEM) #ifndef WOLFSSL_NO_KYBER512 case WOLFSSL_KYBER_LEVEL1: return "KYBER_LEVEL1"; @@ -11055,32 +11021,6 @@ const char* wolfSSL_get_curve_name(WOLFSSL* ssl) case WOLFSSL_P521_KYBER_LEVEL5: return "P521_KYBER_LEVEL5"; #endif -#elif defined (HAVE_LIBOQS) - case WOLFSSL_KYBER_LEVEL1: - return "KYBER_LEVEL1"; - case WOLFSSL_KYBER_LEVEL3: - return "KYBER_LEVEL3"; - case WOLFSSL_KYBER_LEVEL5: - return "KYBER_LEVEL5"; - case WOLFSSL_P256_KYBER_LEVEL1: - return "P256_KYBER_LEVEL1"; - case WOLFSSL_P384_KYBER_LEVEL3: - return "P384_KYBER_LEVEL3"; - case WOLFSSL_P256_KYBER_LEVEL3: - return "P256_KYBER_LEVEL3"; - case WOLFSSL_P521_KYBER_LEVEL5: - return "P521_KYBER_LEVEL5"; - #ifdef HAVE_CURVE25519 - case WOLFSSL_X25519_KYBER_LEVEL1: - return "X25519_KYBER_LEVEL1"; - case WOLFSSL_X25519_KYBER_LEVEL3: - return "X25519_KYBER_LEVEL3"; - #endif - #ifdef HAVE_CURVE448 - case WOLFSSL_X448_KYBER_LEVEL3: - return "X448_KYBER_LEVEL3"; - #endif -#endif /* WOLFSSL_WC_MLKEM */ #endif /* WOLFSSL_MLKEM_KYBER */ } } @@ -17197,7 +17137,7 @@ const WOLF_EC_NIST_NAME kNistCurves[] = { {CURVE_NAME("ML_KEM_512"), WOLFSSL_ML_KEM_512, WOLFSSL_ML_KEM_512}, {CURVE_NAME("ML_KEM_768"), WOLFSSL_ML_KEM_768, WOLFSSL_ML_KEM_768}, {CURVE_NAME("ML_KEM_1024"), WOLFSSL_ML_KEM_1024, WOLFSSL_ML_KEM_1024}, -#if (defined(WOLFSSL_WC_MLKEM) || defined(HAVE_LIBOQS)) && defined(HAVE_ECC) +#if defined(HAVE_ECC) #ifdef WOLFSSL_PQC_HYBRIDS {CURVE_NAME("SecP256r1MLKEM768"), WOLFSSL_SECP256R1MLKEM768, WOLFSSL_SECP256R1MLKEM768}, @@ -17224,7 +17164,7 @@ const WOLF_EC_NIST_NAME kNistCurves[] = { {CURVE_NAME("KYBER_LEVEL1"), WOLFSSL_KYBER_LEVEL1, WOLFSSL_KYBER_LEVEL1}, {CURVE_NAME("KYBER_LEVEL3"), WOLFSSL_KYBER_LEVEL3, WOLFSSL_KYBER_LEVEL3}, {CURVE_NAME("KYBER_LEVEL5"), WOLFSSL_KYBER_LEVEL5, WOLFSSL_KYBER_LEVEL5}, -#if (defined(WOLFSSL_WC_MLKEM) || defined(HAVE_LIBOQS)) && defined(HAVE_ECC) +#if defined(HAVE_ECC) {CURVE_NAME("P256_KYBER_LEVEL1"), WOLFSSL_P256_KYBER_LEVEL1, WOLFSSL_P256_KYBER_LEVEL1}, {CURVE_NAME("P384_KYBER_LEVEL3"), WOLFSSL_P384_KYBER_LEVEL3, diff --git a/src/ssl_load.c b/src/ssl_load.c index 04fecf2181b..a490a114428 100644 --- a/src/ssl_load.c +++ b/src/ssl_load.c @@ -825,16 +825,50 @@ static int ProcessBufferTryDecodeFalcon(WOLFSSL_CTX* ctx, WOLFSSL* ssl, /* Initialize Falcon key. */ ret = wc_falcon_init(key); if (ret == 0) { - /* Set up key to parse the format specified. */ - if ((*keyFormat == FALCON_LEVEL1k) || ((*keyFormat == 0) && - ((der->length == FALCON_LEVEL1_KEY_SIZE) || - (der->length == FALCON_LEVEL1_PRV_KEY_SIZE)))) { - ret = wc_falcon_set_level(key, 1); + byte level = 0; + word32 idx; + + if (*keyFormat == FALCON_LEVEL1k) { + level = 1; + } + else if (*keyFormat == FALCON_LEVEL5k) { + level = 5; } - else if ((*keyFormat == FALCON_LEVEL5k) || ((*keyFormat == 0) && - ((der->length == FALCON_LEVEL5_KEY_SIZE) || - (der->length == FALCON_LEVEL5_PRV_KEY_SIZE)))) { - ret = wc_falcon_set_level(key, 5); + + if (level != 0) { + /* Caller told us the level via the OID sum. */ + ret = wc_falcon_set_level(key, level); + if (ret == 0) { + idx = 0; + ret = wc_Falcon_PrivateKeyDecode(der->buffer, &idx, key, + der->length); + } + } + else if (*keyFormat == 0) { + /* Key format unknown. Try both levels; the expected OID inside + * wc_Falcon_PrivateKeyDecode rejects non-matching DER. */ + idx = 0; + if (wc_falcon_set_level(key, 1) == 0 && + wc_Falcon_PrivateKeyDecode(der->buffer, &idx, key, + der->length) == 0) { + level = 1; + } + else { + idx = 0; + if (wc_falcon_set_level(key, 5) == 0 && + wc_Falcon_PrivateKeyDecode(der->buffer, &idx, key, + der->length) == 0) { + level = 5; + } + } + if (level == 0) { + /* Not a Falcon key; let caller try another algorithm. */ + WOLFSSL_MSG("Not a Falcon key"); + wc_falcon_free(key); + XFREE(key, heap, DYNAMIC_TYPE_FALCON); + return 0; + } + ret = 0; } else { wc_falcon_free(key); @@ -843,38 +877,27 @@ static int ProcessBufferTryDecodeFalcon(WOLFSSL_CTX* ctx, WOLFSSL* ssl, } if (ret == 0) { - /* Decode as a Falcon private key. */ - ret = wc_falcon_import_private_only(der->buffer, der->length, key); - if (ret == 0) { - /* Get the minimum Falcon key size from SSL or SSL context object. - */ - int minKeySz = ssl ? ssl->options.minFalconKeySz : - ctx->minFalconKeySz; + /* Get the minimum Falcon key size from SSL or SSL context object. */ + int minKeySz = ssl ? ssl->options.minFalconKeySz : + ctx->minFalconKeySz; - /* Format is known. */ - if (*keyFormat == FALCON_LEVEL1k) { - *keyType = falcon_level1_sa_algo; - *keySize = FALCON_LEVEL1_KEY_SIZE; - } - else { - *keyType = falcon_level5_sa_algo; - *keySize = FALCON_LEVEL5_KEY_SIZE; - } - - /* Check that the size of the Falcon key is enough. */ - if (*keySize < minKeySz) { - WOLFSSL_MSG("Falcon private key too small"); - ret = FALCON_KEY_SIZE_E; - } + if (key->level == 1) { + *keyFormat = FALCON_LEVEL1k; + *keyType = falcon_level1_sa_algo; + *keySize = FALCON_LEVEL1_KEY_SIZE; } - /* Not a Falcon key but check whether we know what it is. */ - else if (*keyFormat == 0) { - WOLFSSL_MSG("Not a Falcon key"); - /* Format unknown so keep trying. */ - ret = 0; + else { + *keyFormat = FALCON_LEVEL5k; + *keyType = falcon_level5_sa_algo; + *keySize = FALCON_LEVEL5_KEY_SIZE; + } + + /* Check that the size of the Falcon key is enough. */ + if (*keySize < minKeySz) { + WOLFSSL_MSG("Falcon private key too small"); + ret = FALCON_KEY_SIZE_E; } - /* Free dynamically allocated data in key. */ wc_falcon_free(key); } else if ((ret == WC_NO_ERR_TRACE(ALGO_ID_E)) && (*keyFormat == 0)) { diff --git a/src/tls.c b/src/tls.c index 0f6fd90f78e..f8200669c92 100644 --- a/src/tls.c +++ b/src/tls.c @@ -76,7 +76,6 @@ * * Post-Quantum: * WOLFSSL_HAVE_MLKEM: Enable ML-KEM (Kyber) support default: off - * WOLFSSL_WC_MLKEM: Use wolfCrypt ML-KEM implementation default: off * WOLFSSL_MLKEM_KYBER: Use Kyber round 3 parameters default: off * WOLFSSL_KYBER512: Enable Kyber/ML-KEM-512 default: off * WOLFSSL_KYBER768: Enable Kyber/ML-KEM-768 default: off @@ -140,12 +139,7 @@ #include #endif #ifdef WOLFSSL_HAVE_MLKEM - #include -#ifdef WOLFSSL_WC_MLKEM #include -#elif defined(HAVE_LIBOQS) - #include -#endif #endif #if defined(WOLFSSL_RENESAS_TSIP_TLS) @@ -4567,12 +4561,6 @@ int TLSX_UseCertificateStatusRequestV2(TLSX** extensions, byte status_type, #if defined(HAVE_SUPPORTED_CURVES) || \ (defined(WOLFSSL_TLS13) && defined(HAVE_SUPPORTED_CURVES)) -/* Functions needed by TLSX_IsGroupSupported */ -#ifdef HAVE_LIBOQS -static int mlkem_id2type(int id, int *type); -static void findEccPqc(int *ecc, int *pqc, int *pqc_first, int group); -#endif - /* Returns whether this group is supported. * * namedGroup The named group to check. @@ -4688,7 +4676,6 @@ int TLSX_IsGroupSupported(int namedGroup) #endif #ifdef WOLFSSL_HAVE_MLKEM #ifndef WOLFSSL_NO_ML_KEM - #ifdef WOLFSSL_WC_MLKEM #ifndef WOLFSSL_NO_ML_KEM_512 #ifndef WOLFSSL_TLS_NO_MLKEM_STANDALONE case WOLFSSL_ML_KEM_512: @@ -4739,50 +4726,8 @@ int TLSX_IsGroupSupported(int namedGroup) case WOLFSSL_P521_ML_KEM_1024_OLD: break; #endif /* WOLFSSL_ML_KEM_USE_OLD_IDS && WOLFSSL_EXTRA_PQC_HYBRIDS */ - #elif defined(HAVE_LIBOQS) - case WOLFSSL_ML_KEM_512: - case WOLFSSL_ML_KEM_768: - case WOLFSSL_ML_KEM_1024: - { - int ret; - int id; - ret = mlkem_id2type(namedGroup, &id); - if (ret == WC_NO_ERR_TRACE(NOT_COMPILED_IN)) { - return 0; - } - - if (! ext_mlkem_enabled(id)) { - return 0; - } - break; - } - - case WOLFSSL_SECP256R1MLKEM512: - case WOLFSSL_SECP384R1MLKEM768: - case WOLFSSL_SECP256R1MLKEM768: - case WOLFSSL_SECP521R1MLKEM1024: - case WOLFSSL_SECP384R1MLKEM1024: - case WOLFSSL_X25519MLKEM512: - case WOLFSSL_X448MLKEM768: - case WOLFSSL_X25519MLKEM768: - { - int ret; - int id; - findEccPqc(NULL, &namedGroup, NULL, namedGroup); - ret = mlkem_id2type(namedGroup, &id); - if (ret == WC_NO_ERR_TRACE(NOT_COMPILED_IN)) { - return 0; - } - - if (! ext_mlkem_enabled(id)) { - return 0; - } - break; - } - #endif #endif /* WOLFSSL_NO_ML_KEM */ #ifdef WOLFSSL_MLKEM_KYBER - #ifdef WOLFSSL_WC_MLKEM #ifdef WOLFSSL_KYBER512 case WOLFSSL_KYBER_LEVEL1: case WOLFSSL_P256_KYBER_LEVEL1: @@ -4806,45 +4751,6 @@ int TLSX_IsGroupSupported(int namedGroup) case WOLFSSL_P521_KYBER_LEVEL5: #endif break; - #elif defined(HAVE_LIBOQS) - case WOLFSSL_KYBER_LEVEL1: - case WOLFSSL_KYBER_LEVEL3: - case WOLFSSL_KYBER_LEVEL5: - { - int ret; - int id; - ret = mlkem_id2type(namedGroup, &id); - if (ret == WC_NO_ERR_TRACE(NOT_COMPILED_IN)) { - return 0; - } - - if (! ext_mlkem_enabled(id)) { - return 0; - } - break; - } - case WOLFSSL_P256_KYBER_LEVEL1: - case WOLFSSL_P384_KYBER_LEVEL3: - case WOLFSSL_P256_KYBER_LEVEL3: - case WOLFSSL_P521_KYBER_LEVEL5: - case WOLFSSL_X25519_KYBER_LEVEL1: - case WOLFSSL_X448_KYBER_LEVEL3: - case WOLFSSL_X25519_KYBER_LEVEL3: - { - int ret; - int id; - findEccPqc(NULL, &namedGroup, NULL, namedGroup); - ret = mlkem_id2type(namedGroup, &id); - if (ret == WC_NO_ERR_TRACE(NOT_COMPILED_IN)) { - return 0; - } - - if (! ext_mlkem_enabled(id)) { - return 0; - } - break; - } - #endif #endif #endif /* WOLFSSL_HAVE_MLKEM */ default: @@ -8620,8 +8526,7 @@ static int TLSX_KeyShare_GenEccKey(WOLFSSL *ssl, KeyShareEntry* kse) #ifdef WOLFSSL_HAVE_MLKEM #if (defined(WOLFSSL_MLKEM_CACHE_A) || \ - (defined(HAVE_PKCS11) && defined(WOLFSSL_WC_MLKEM) && \ - !defined(NO_PKCS11_MLKEM))) && \ + (defined(HAVE_PKCS11) && !defined(NO_PKCS11_MLKEM))) && \ !defined(WOLFSSL_TLSX_PQC_MLKEM_STORE_PRIV_KEY) /* Store KyberKey object rather than private key bytes in key share entry. * Improves performance at cost of more dynamic memory being used. */ @@ -11358,10 +11263,6 @@ static int TLSX_KeyShare_GroupRank(const WOLFSSL* ssl, int group) numGroups = ssl->numGroups; } -#ifdef HAVE_LIBOQS - if (!TLSX_IsGroupSupported(group)) - return WOLFSSL_FATAL_ERROR; -#endif for (i = 0; i < numGroups; i++) { #if defined(WOLFSSL_ML_KEM_USE_OLD_IDS) && \ @@ -15875,11 +15776,7 @@ int TLSX_PopulateExtensions(WOLFSSL* ssl, byte isServer) namedGroup = preferredGroup[0]; for (i = 0; i < ssl->numGroups && !set; i++) { for (j = 0; preferredGroup[j] != WOLFSSL_NAMED_GROUP_INVALID; j++) { - if (preferredGroup[j] == ssl->group[i] -#ifdef HAVE_LIBOQS - && TLSX_IsGroupSupported(preferredGroup[j]) -#endif - ) { + if (preferredGroup[j] == ssl->group[i]) { namedGroup = ssl->group[i]; set = 1; break; @@ -15892,17 +15789,6 @@ int TLSX_PopulateExtensions(WOLFSSL* ssl, byte isServer) else { /* Choose the most preferred group. */ namedGroup = preferredGroup[0]; -#ifdef HAVE_LIBOQS - if (!TLSX_IsGroupSupported(namedGroup)) { - int i = 1; - for (;preferredGroup[i] != WOLFSSL_NAMED_GROUP_INVALID; - i++) { - if (TLSX_IsGroupSupported(preferredGroup[i])) - break; - } - namedGroup = preferredGroup[i]; - } -#endif } } else { diff --git a/src/tls13.c b/src/tls13.c index 824ad08b696..18011cb1732 100644 --- a/src/tls13.c +++ b/src/tls13.c @@ -8447,9 +8447,10 @@ static WC_INLINE void EncodeSigAlg(const WOLFSSL * ssl, byte hashAlgo, #define HYBRID_RSA3072_DILITHIUM_LEVEL2_SA_MINOR 0xA2 #define HYBRID_P384_DILITHIUM_LEVEL3_SA_MINOR 0xA4 #define HYBRID_P521_DILITHIUM_LEVEL5_SA_MINOR 0xA6 -#define HYBRID_P256_FALCON_LEVEL1_SA_MINOR 0xAF -#define HYBRID_RSA3072_FALCON_LEVEL1_SA_MINOR 0xB0 -#define HYBRID_P521_FALCON_LEVEL5_SA_MINOR 0xB2 +/* Falcon hybrid codepoints aligned with oqs-provider. */ +#define HYBRID_P256_FALCON_LEVEL1_SA_MINOR 0xD8 +#define HYBRID_RSA3072_FALCON_LEVEL1_SA_MINOR 0xD9 +#define HYBRID_P521_FALCON_LEVEL5_SA_MINOR 0xDB /* Custom defined ones for PQC first */ #define HYBRID_DILITHIUM_LEVEL2_P256_SA_MINOR 0xD1 diff --git a/tests/api.c b/tests/api.c index db7b595522e..def991ca453 100644 --- a/tests/api.c +++ b/tests/api.c @@ -169,7 +169,7 @@ #include #endif #if defined(WOLFSSL_HAVE_MLKEM) - #include + #include #endif #if defined(HAVE_PKCS7) #include @@ -1559,7 +1559,6 @@ static int test_dual_alg_ecdsa_mldsa(void) EXPECT_DECLS; #if defined(WOLFSSL_DUAL_ALG_CERTS) && defined(HAVE_DILITHIUM) && \ defined(HAVE_ECC) && !defined(WC_NO_RNG) && \ - defined(WOLFSSL_WC_DILITHIUM) && \ !defined(WOLFSSL_DILITHIUM_NO_MAKE_KEY) && \ !defined(WOLFSSL_DILITHIUM_NO_SIGN) && \ !defined(WOLFSSL_DILITHIUM_NO_VERIFY) && !defined(WOLFSSL_SMALL_STACK) @@ -35645,7 +35644,7 @@ static int test_DhAgree_rejects_p_minus_1(void) static int test_mldsa_verify_hash(void) { EXPECT_DECLS; -#if defined(HAVE_DILITHIUM) && defined(WOLFSSL_WC_DILITHIUM) && \ +#if defined(HAVE_DILITHIUM) && \ !defined(WOLFSSL_DILITHIUM_NO_MAKE_KEY) && \ !defined(WOLFSSL_DILITHIUM_NO_VERIFY) dilithium_key key; @@ -35863,7 +35862,7 @@ static int test_pkcs7_ori_oversized_oid(void) static int test_dilithium_hash(void) { EXPECT_DECLS; -#if defined(HAVE_DILITHIUM) && defined(WOLFSSL_WC_DILITHIUM) && \ +#if defined(HAVE_DILITHIUM) && \ !defined(WOLFSSL_DILITHIUM_NO_MAKE_KEY) && \ !defined(WOLFSSL_DILITHIUM_NO_VERIFY) dilithium_key key; diff --git a/tests/api/test_mldsa.c b/tests/api/test_mldsa.c index 9ebd027b969..779738c8f9d 100644 --- a/tests/api/test_mldsa.c +++ b/tests/api/test_mldsa.c @@ -37,7 +37,7 @@ #include -#if defined(HAVE_DILITHIUM) && defined(WOLFSSL_WC_DILITHIUM) && \ +#if defined(HAVE_DILITHIUM) && \ !defined(WOLFSSL_DILITHIUM_NO_VERIFY) && !defined(WOLFSSL_NO_ML_DSA_44) && \ defined(WOLFSSL_DILITHIUM_NO_CTX) static const byte ml_dsa_44_pub_key[] = { @@ -516,7 +516,7 @@ static const byte ml_dsa_44_good_sig[] = { int test_wc_dilithium(void) { EXPECT_DECLS; -#if defined(HAVE_DILITHIUM) && defined(WOLFSSL_WC_DILITHIUM) +#if defined(HAVE_DILITHIUM) dilithium_key* key; byte level; #if !defined(WOLFSSL_DILITHIUM_NO_MAKE_KEY) || \ @@ -694,7 +694,7 @@ int test_wc_dilithium_sign_pubonly_fails(void) { EXPECT_DECLS; #if !defined(HAVE_FIPS) || FIPS_VERSION3_GE(7,0,0) -#if defined(HAVE_DILITHIUM) && defined(WOLFSSL_WC_DILITHIUM) && \ +#if defined(HAVE_DILITHIUM) && \ !defined(WOLFSSL_DILITHIUM_NO_SIGN) && \ !defined(WOLFSSL_DILITHIUM_NO_MAKE_KEY) && \ !defined(WOLFSSL_DILITHIUM_NO_CTX) @@ -767,7 +767,7 @@ int test_wc_dilithium_sign_pubonly_fails(void) int test_wc_dilithium_make_key(void) { EXPECT_DECLS; -#if defined(HAVE_DILITHIUM) && defined(WOLFSSL_WC_DILITHIUM) && \ +#if defined(HAVE_DILITHIUM) && \ !defined(WOLFSSL_DILITHIUM_NO_MAKE_KEY) dilithium_key* key; WC_RNG rng; @@ -808,7 +808,7 @@ int test_wc_dilithium_make_key(void) int test_wc_dilithium_sign(void) { EXPECT_DECLS; -#if defined(HAVE_DILITHIUM) && defined(WOLFSSL_WC_DILITHIUM) && \ +#if defined(HAVE_DILITHIUM) && \ !defined(WOLFSSL_DILITHIUM_NO_SIGN) && defined(WOLFSSL_DILITHIUM_NO_CTX) dilithium_key* key; dilithium_key* importKey = NULL; @@ -971,7 +971,7 @@ int test_wc_dilithium_sign(void) int test_wc_dilithium_verify(void) { EXPECT_DECLS; -#if defined(HAVE_DILITHIUM) && defined(WOLFSSL_WC_DILITHIUM) && \ +#if defined(HAVE_DILITHIUM) && \ !defined(WOLFSSL_DILITHIUM_NO_VERIFY) && defined(WOLFSSL_DILITHIUM_NO_CTX) && \ (!defined(WOLFSSL_NO_ML_DSA_44) || !defined(WOLFSSL_DILITHIUM_NO_SIGN)) dilithium_key* key; @@ -1203,7 +1203,7 @@ int test_wc_dilithium_verify(void) int test_wc_dilithium_sign_vfy(void) { EXPECT_DECLS; -#if defined(HAVE_DILITHIUM) && defined(WOLFSSL_WC_DILITHIUM) && \ +#if defined(HAVE_DILITHIUM) && \ !defined(WOLFSSL_DILITHIUM_NO_MAKE_KEY) && \ !defined(WOLFSSL_DILITHIUM_NO_SIGN) && !defined(WOLFSSL_DILITHIUM_NO_VERIFY) dilithium_key* key; @@ -1303,7 +1303,7 @@ int test_wc_dilithium_sign_vfy(void) int test_wc_dilithium_check_key(void) { EXPECT_DECLS; -#if defined(HAVE_DILITHIUM) && defined(WOLFSSL_WC_DILITHIUM) && \ +#if defined(HAVE_DILITHIUM) && \ defined(WOLFSSL_DILITHIUM_CHECK_KEY) && \ !defined(WOLFSSL_DILITHIUM_NO_MAKE_KEY) dilithium_key* checkKey; @@ -1426,7 +1426,7 @@ int test_wc_dilithium_check_key(void) return EXPECT_RESULT(); } -#if defined(HAVE_DILITHIUM) && defined(WOLFSSL_WC_DILITHIUM) && \ +#if defined(HAVE_DILITHIUM) && \ defined(WOLFSSL_DILITHIUM_PUBLIC_KEY) static const unsigned char ml_dsa_public_der[] = { #ifndef WOLFSSL_NO_ML_DSA_44 @@ -2929,7 +2929,7 @@ static const unsigned char dilithium_public_der[] = { int test_wc_dilithium_public_der_decode(void) { EXPECT_DECLS; -#if defined(HAVE_DILITHIUM) && defined(WOLFSSL_WC_DILITHIUM) && \ +#if defined(HAVE_DILITHIUM) && \ defined(WOLFSSL_DILITHIUM_PUBLIC_KEY) dilithium_key* key; word32 idx = 0; @@ -2973,7 +2973,7 @@ int test_wc_dilithium_public_der_decode(void) int test_wc_dilithium_der(void) { EXPECT_DECLS; -#if defined(HAVE_DILITHIUM) && defined(WOLFSSL_WC_DILITHIUM) && \ +#if defined(HAVE_DILITHIUM) && \ !defined(WOLFSSL_DILITHIUM_NO_ASN1) && \ !defined(WOLFSSL_DILITHIUM_NO_MAKE_KEY) #define DILITHIUM_MAX_DER_SIZE 8192 @@ -3183,7 +3183,7 @@ int test_wc_dilithium_der(void) int test_wc_dilithium_make_key_from_seed(void) { EXPECT_DECLS; -#if defined(HAVE_DILITHIUM) && defined(WOLFSSL_WC_DILITHIUM) && \ +#if defined(HAVE_DILITHIUM) && \ !defined(WOLFSSL_DILITHIUM_NO_MAKE_KEY) dilithium_key* key; #ifndef WOLFSSL_NO_ML_DSA_44 @@ -7651,7 +7651,7 @@ int test_wc_dilithium_make_key_from_seed(void) int test_wc_dilithium_sig_kats(void) { EXPECT_DECLS; -#if defined(HAVE_DILITHIUM) && defined(WOLFSSL_WC_DILITHIUM) && \ +#if defined(HAVE_DILITHIUM) && \ !defined(WOLFSSL_DILITHIUM_NO_SIGN) && defined(WOLFSSL_DILITHIUM_NO_CTX) dilithium_key* key; #ifndef WOLFSSL_NO_ML_DSA_44 @@ -12465,7 +12465,7 @@ int test_wc_dilithium_sig_kats(void) int test_wc_dilithium_sign_ctx_kats(void) { EXPECT_DECLS; -#if defined(HAVE_DILITHIUM) && defined(WOLFSSL_WC_DILITHIUM) && \ +#if defined(HAVE_DILITHIUM) && \ !defined(WOLFSSL_DILITHIUM_NO_SIGN) dilithium_key* key; word32 sigLen; @@ -16696,7 +16696,7 @@ int test_wc_dilithium_sign_ctx_kats(void) XFREE(sig, NULL, DYNAMIC_TYPE_TMP_BUFFER); XFREE(key, NULL, DYNAMIC_TYPE_TMP_BUFFER); -#endif /* HAVE_DILITHIUM && WOLFSSL_WC_DILITHIUM && !WOLFSSL_DILITHIUM_NO_SIGN */ +#endif /* HAVE_DILITHIUM && !WOLFSSL_DILITHIUM_NO_SIGN */ return EXPECT_RESULT(); } @@ -16704,7 +16704,7 @@ int test_wc_dilithium_sign_ctx_kats(void) int test_wc_dilithium_verify_ctx_kats(void) { EXPECT_DECLS; -#if defined(HAVE_DILITHIUM) && defined(WOLFSSL_WC_DILITHIUM) && \ +#if defined(HAVE_DILITHIUM) && \ !defined(WOLFSSL_DILITHIUM_NO_VERIFY) dilithium_key* key; int res; @@ -20242,7 +20242,7 @@ int test_wc_dilithium_verify_ctx_kats(void) #endif /* !WOLFSSL_NO_ML_DSA_87 */ XFREE(key, NULL, DYNAMIC_TYPE_TMP_BUFFER); -#endif /* HAVE_DILITHIUM && WOLFSSL_WC_DILITHIUM && !WOLFSSL_DILITHIUM_NO_VERIFY */ +#endif /* HAVE_DILITHIUM && !WOLFSSL_DILITHIUM_NO_VERIFY */ return EXPECT_RESULT(); } @@ -20250,7 +20250,7 @@ int test_wc_dilithium_verify_ctx_kats(void) int test_wc_dilithium_verify_kats(void) { EXPECT_DECLS; -#if defined(HAVE_DILITHIUM) && defined(WOLFSSL_WC_DILITHIUM) && \ +#if defined(HAVE_DILITHIUM) && \ !defined(WOLFSSL_DILITHIUM_NO_VERIFY) && defined(WOLFSSL_DILITHIUM_NO_CTX) dilithium_key* key; int res; @@ -24523,7 +24523,7 @@ int test_wc_dilithium_verify_kats(void) } #if !defined(NO_ASN) && defined(HAVE_PKCS8) && \ - defined(HAVE_DILITHIUM) && defined(WOLFSSL_WC_DILITHIUM) && \ + defined(HAVE_DILITHIUM) && \ !defined(WOLFSSL_DILITHIUM_NO_MAKE_KEY) && \ !defined(WOLFSSL_DILITHIUM_NO_ASN1) && defined(WOLFSSL_ASN_TEMPLATE) static struct { @@ -24591,7 +24591,7 @@ int test_wc_Dilithium_PrivateKeyDecode_OpenSSL_form(void) EXPECT_DECLS; #if !defined(NO_ASN) && defined(HAVE_PKCS8) && \ - defined(HAVE_DILITHIUM) && defined(WOLFSSL_WC_DILITHIUM) && \ + defined(HAVE_DILITHIUM) && \ !defined(WOLFSSL_DILITHIUM_NO_MAKE_KEY) && \ !defined(WOLFSSL_DILITHIUM_NO_ASN1) && defined(WOLFSSL_ASN_TEMPLATE) @@ -24684,7 +24684,7 @@ int test_mldsa_pkcs8_import_OpenSSL_form(void) { EXPECT_DECLS; #if !defined(NO_ASN) && defined(HAVE_PKCS8) && \ - defined(HAVE_DILITHIUM) && defined(WOLFSSL_WC_DILITHIUM) && \ + defined(HAVE_DILITHIUM) && \ !defined(WOLFSSL_DILITHIUM_NO_MAKE_KEY) && \ !defined(WOLFSSL_DILITHIUM_NO_SIGN) && \ !defined(WOLFSSL_DILITHIUM_NO_ASN1) && defined(WOLFSSL_ASN_TEMPLATE) && \ @@ -24872,7 +24872,7 @@ int test_mldsa_pkcs8_export_import_wolfSSL_form(void) int test_wc_dilithium_encode_w1_large_values(void) { EXPECT_DECLS; -#if defined(HAVE_DILITHIUM) && defined(WOLFSSL_WC_DILITHIUM) && \ +#if defined(HAVE_DILITHIUM) && \ (!defined(WOLFSSL_DILITHIUM_NO_SIGN) || \ !defined(WOLFSSL_DILITHIUM_NO_VERIFY)) @@ -24984,7 +24984,7 @@ int test_wc_dilithium_encode_w1_large_values(void) } #endif /* !WOLFSSL_NO_ML_DSA_65 || !WOLFSSL_NO_ML_DSA_87 */ -#endif /* HAVE_DILITHIUM && WOLFSSL_WC_DILITHIUM && sign/verify */ +#endif /* HAVE_DILITHIUM && sign/verify */ return EXPECT_RESULT(); } diff --git a/tests/api/test_mlkem.c b/tests/api/test_mlkem.c index 4ff76604387..128ff430c5e 100644 --- a/tests/api/test_mlkem.c +++ b/tests/api/test_mlkem.c @@ -29,11 +29,8 @@ #endif #ifdef WOLFSSL_HAVE_MLKEM - #include -#ifdef WOLFSSL_WC_MLKEM #include #endif -#endif #include #include #include @@ -41,7 +38,7 @@ int test_wc_mlkem_make_key_kats(void) { EXPECT_DECLS; -#if defined(WOLFSSL_HAVE_MLKEM) && defined(WOLFSSL_WC_MLKEM) && \ +#if defined(WOLFSSL_HAVE_MLKEM) && \ !defined(WOLFSSL_NO_ML_KEM) && !defined(WOLFSSL_MLKEM_NO_MAKE_KEY) MlKemKey* key; #ifndef WOLFSSL_NO_ML_KEM_512 @@ -1496,7 +1493,7 @@ int test_wc_mlkem_make_key_kats(void) int test_wc_mlkem_encapsulate_kats(void) { EXPECT_DECLS; -#if defined(WOLFSSL_HAVE_MLKEM) && defined(WOLFSSL_WC_MLKEM) && \ +#if defined(WOLFSSL_HAVE_MLKEM) && \ !defined(WOLFSSL_NO_ML_KEM) && !defined(WOLFSSL_MLKEM_NO_ENCAPSULATE) MlKemKey* key; #ifndef WOLFSSL_NO_ML_KEM_512 @@ -2470,7 +2467,7 @@ int test_wc_mlkem_encapsulate_kats(void) int test_wc_mlkem_decapsulate_kats(void) { EXPECT_DECLS; -#if defined(WOLFSSL_HAVE_MLKEM) && defined(WOLFSSL_WC_MLKEM) && \ +#if defined(WOLFSSL_HAVE_MLKEM) && \ !defined(WOLFSSL_NO_ML_KEM) && !defined(WOLFSSL_MLKEM_NO_DECAPSULATE) MlKemKey* key; #ifndef WOLFSSL_NO_ML_KEM_512 @@ -3881,7 +3878,7 @@ int test_wc_mlkem_decapsulate_pubonly_fails(void) { EXPECT_DECLS; #if !defined(HAVE_FIPS) || FIPS_VERSION3_GE(7,0,0) -#if defined(WOLFSSL_HAVE_MLKEM) && defined(WOLFSSL_WC_MLKEM) && \ +#if defined(WOLFSSL_HAVE_MLKEM) && \ !defined(WOLFSSL_NO_ML_KEM) && !defined(WOLFSSL_MLKEM_NO_DECAPSULATE) && \ !defined(WOLFSSL_MLKEM_NO_ENCAPSULATE) && \ !defined(WOLFSSL_MLKEM_NO_MAKE_KEY) @@ -3956,7 +3953,7 @@ int test_wc_mlkem_decap_fo_reject(void) { EXPECT_DECLS; #if !defined(HAVE_FIPS) || FIPS_VERSION3_GE(7,0,0) -#if defined(WOLFSSL_HAVE_MLKEM) && defined(WOLFSSL_WC_MLKEM) && \ +#if defined(WOLFSSL_HAVE_MLKEM) && \ !defined(WOLFSSL_NO_ML_KEM) && !defined(WOLFSSL_MLKEM_NO_DECAPSULATE) && \ !defined(WOLFSSL_MLKEM_NO_ENCAPSULATE) && \ !defined(WOLFSSL_MLKEM_NO_MAKE_KEY) diff --git a/tests/suites.c b/tests/suites.c index dabc1f2756a..0da168ee1df 100644 --- a/tests/suites.c +++ b/tests/suites.c @@ -1127,7 +1127,7 @@ int SuiteTest(int argc, char** argv) goto exit; } #endif - #ifdef HAVE_PQC + #ifdef WOLFSSL_HAVE_MLKEM #ifndef WOLFSSL_TLS_NO_MLKEM_STANDALONE /* add TLSv13 pq standalone tests */ XSTRLCPY(argv0[1], "tests/test-tls13-pq-standalone.conf", sizeof(argv0[1])); @@ -1162,7 +1162,7 @@ int SuiteTest(int argc, char** argv) } #endif #endif - #if defined(HAVE_PQC) && defined(WOLFSSL_DTLS13) + #if defined(WOLFSSL_HAVE_MLKEM) && defined(WOLFSSL_DTLS13) #ifndef WOLFSSL_TLS_NO_MLKEM_STANDALONE /* add DTLSv13 pq standalone tests */ XSTRLCPY(argv0[1], "tests/test-dtls13-pq-standalone.conf", sizeof(argv0[1])); diff --git a/wolfcrypt/benchmark/benchmark.c b/wolfcrypt/benchmark/benchmark.c index 5d8e8efb898..8df48365eec 100644 --- a/wolfcrypt/benchmark/benchmark.c +++ b/wolfcrypt/benchmark/benchmark.c @@ -169,13 +169,7 @@ #include #endif #ifdef WOLFSSL_HAVE_MLKEM - #include - #ifdef WOLFSSL_WC_MLKEM - #include - #endif - #if defined(HAVE_LIBOQS) - #include - #endif + #include #endif #if defined(WOLFSSL_HAVE_LMS) && !defined(WOLFSSL_LMS_VERIFY_ONLY) #include @@ -14387,19 +14381,20 @@ void bench_falconKeySign(byte level) } if (ret == 0) { + word32 idx = 0; if (level == 1) { - ret = wc_falcon_import_private_key(bench_falcon_level1_key, - sizeof_bench_falcon_level1_key, - NULL, 0, &key); + ret = wc_Falcon_PrivateKeyDecode(bench_falcon_level1_key, &idx, + &key, + sizeof_bench_falcon_level1_key); } else { - ret = wc_falcon_import_private_key(bench_falcon_level5_key, - sizeof_bench_falcon_level5_key, - NULL, 0, &key); + ret = wc_Falcon_PrivateKeyDecode(bench_falcon_level5_key, &idx, + &key, + sizeof_bench_falcon_level5_key); } if (ret != 0) { - printf("wc_falcon_import_private_key failed %d\n", ret); + printf("wc_Falcon_PrivateKeyDecode failed %d\n", ret); } } diff --git a/wolfcrypt/src/asn.c b/wolfcrypt/src/asn.c index cbd2a9901b8..26c9d9bb6fe 100644 --- a/wolfcrypt/src/asn.c +++ b/wolfcrypt/src/asn.c @@ -4571,11 +4571,11 @@ static int ParseCRL_Extensions(DecodedCRL* dcrl, const byte* buf, word32* inOutI static const byte sigEd448Oid[] = {43, 101, 113}; #endif /* HAVE_ED448 */ #ifdef HAVE_FALCON - /* Falcon Level 1: 1 3 9999 3 6 */ - static const byte sigFalcon_Level1Oid[] = {43, 206, 15, 3, 6}; + /* Falcon Level 1: 1 3 9999 3 11 */ + static const byte sigFalcon_Level1Oid[] = {43, 206, 15, 3, 11}; - /* Falcon Level 5: 1 3 9999 3 9 */ - static const byte sigFalcon_Level5Oid[] = {43, 206, 15, 3, 9}; + /* Falcon Level 5: 1 3 9999 3 14 */ + static const byte sigFalcon_Level5Oid[] = {43, 206, 15, 3, 14}; #endif /* HAVE_FALCON */ #ifdef HAVE_DILITHIUM #ifdef WOLFSSL_DILITHIUM_FIPS204_DRAFT @@ -4659,11 +4659,11 @@ static int ParseCRL_Extensions(DecodedCRL* dcrl, const byte* buf, word32* inOutI static const byte keyDhOid[] = {42, 134, 72, 134, 247, 13, 1, 3, 1}; #endif /* !NO_DH */ #ifdef HAVE_FALCON - /* Falcon Level 1: 1 3 9999 3 6 */ - static const byte keyFalcon_Level1Oid[] = {43, 206, 15, 3, 6}; + /* Falcon Level 1: 1 3 9999 3 11 */ + static const byte keyFalcon_Level1Oid[] = {43, 206, 15, 3, 11}; - /* Falcon Level 5: 1 3 9999 3 9 */ - static const byte keyFalcon_Level5Oid[] = {43, 206, 15, 3, 9}; + /* Falcon Level 5: 1 3 9999 3 14 */ + static const byte keyFalcon_Level5Oid[] = {43, 206, 15, 3, 14}; #endif /* HAVE_FALCON */ #ifdef HAVE_DILITHIUM #ifdef WOLFSSL_DILITHIUM_FIPS204_DRAFT diff --git a/wolfcrypt/src/dilithium.c b/wolfcrypt/src/dilithium.c index 633d623f0b8..ce5683ee37c 100644 --- a/wolfcrypt/src/dilithium.c +++ b/wolfcrypt/src/dilithium.c @@ -27,8 +27,6 @@ * * HAVE_DILITHIUM Default: OFF * Enables the code in this file to be compiled. - * WOLFSSL_WC_DILITHIUM Default: OFF - * Compiles the wolfSSL implementation of dilithium. * * WOLFSSL_NO_ML_DSA_44 Default: OFF * Does not compile in parameter set ML-DSA-44 and any code specific to that @@ -144,10 +142,6 @@ #if defined(HAVE_DILITHIUM) -#ifdef HAVE_LIBOQS -#include -#endif - #include #include #include @@ -172,8 +166,6 @@ #endif #endif -#ifdef WOLFSSL_WC_DILITHIUM - #if defined(USE_INTEL_SPEEDUP) static cpuid_flags_t cpuid_flags = WC_CPUID_INITIALIZER; #endif @@ -10092,182 +10084,6 @@ static int dilithium_verify_ctx_hash(dilithium_key* key, const byte* ctx, } #endif /* WOLFSSL_DILITHIUM_NO_VERIFY */ -#elif defined(HAVE_LIBOQS) - -#ifndef WOLFSSL_DILITHIUM_NO_MAKE_KEY -static int oqs_dilithium_make_key(dilithium_key* key, WC_RNG* rng) -{ - int ret = 0; - OQS_SIG *oqssig = NULL; - - if (key->level == WC_ML_DSA_44) { - oqssig = OQS_SIG_new(OQS_SIG_alg_ml_dsa_44_ipd); - } - else if (key->level == WC_ML_DSA_65) { - oqssig = OQS_SIG_new(OQS_SIG_alg_ml_dsa_65_ipd); - } - else if (key->level == WC_ML_DSA_87) { - oqssig = OQS_SIG_new(OQS_SIG_alg_ml_dsa_87_ipd); - } - else { - ret = SIG_TYPE_E; - } - - -#ifdef WOLFSSL_DILITHIUM_DYNAMIC_KEYS - if (ret == 0) { - ret = dilithium_alloc_priv_buf(key); - } - if (ret == 0) { - ret = dilithium_alloc_pub_buf(key); - } -#endif - - if (ret == 0) { - ret = wolfSSL_liboqsRngMutexLock(rng); - if (ret == 0) { - if (OQS_SIG_keypair(oqssig, key->p, key->k) != OQS_SUCCESS) { - ret = BUFFER_E; - } - } - wolfSSL_liboqsRngMutexUnlock(); - } - if (ret == 0) { - key->prvKeySet = 1; - key->pubKeySet = 1; - } - - if (oqssig != NULL) { - OQS_SIG_free(oqssig); - } - - return ret; -} -#endif /* WOLFSSL_DILITHIUM_NO_MAKE_KEY */ - -#ifndef WOLFSSL_DILITHIUM_NO_SIGN -static int oqs_dilithium_sign_msg(const byte* msg, word32 msgLen, byte* sig, - word32 *sigLen, dilithium_key* key, WC_RNG* rng) -{ - int ret = 0; - OQS_SIG *oqssig = NULL; - size_t localOutLen = 0; - - if (!key->prvKeySet) { - ret = BAD_FUNC_ARG; - } - - if (ret == 0) { - if (key->level == WC_ML_DSA_44) { - oqssig = OQS_SIG_new(OQS_SIG_alg_ml_dsa_44_ipd); - } - else if (key->level == WC_ML_DSA_65) { - oqssig = OQS_SIG_new(OQS_SIG_alg_ml_dsa_65_ipd); - } - else if (key->level == WC_ML_DSA_87) { - oqssig = OQS_SIG_new(OQS_SIG_alg_ml_dsa_87_ipd); - } - else { - ret = SIG_TYPE_E; - } - } - - if ((ret == 0) && (oqssig == NULL)) { - ret = BUFFER_E; - } - - /* check and set up out length */ - if (ret == 0) { - if ((key->level == WC_ML_DSA_44) && - (*sigLen < ML_DSA_LEVEL2_SIG_SIZE)) { - *sigLen = ML_DSA_LEVEL2_SIG_SIZE; - ret = BUFFER_E; - } - else if ((key->level == WC_ML_DSA_65) && - (*sigLen < ML_DSA_LEVEL3_SIG_SIZE)) { - *sigLen = ML_DSA_LEVEL3_SIG_SIZE; - ret = BUFFER_E; - } - else if ((key->level == WC_ML_DSA_87) && - (*sigLen < ML_DSA_LEVEL5_SIG_SIZE)) { - *sigLen = ML_DSA_LEVEL5_SIG_SIZE; - ret = BUFFER_E; - } - localOutLen = *sigLen; - } - - if (ret == 0) { - ret = wolfSSL_liboqsRngMutexLock(rng); - if (ret == 0) { - if (OQS_SIG_sign(oqssig, sig, &localOutLen, msg, msgLen, key->k) - == OQS_ERROR) { - ret = BAD_FUNC_ARG; - } - } - if (ret == 0) { - *sigLen = (word32)localOutLen; - } - wolfSSL_liboqsRngMutexUnlock(); - } - - if (oqssig != NULL) { - OQS_SIG_free(oqssig); - } - return ret; -} -#endif - -#ifndef WOLFSSL_DILITHIUM_NO_VERIFY -static int oqs_dilithium_verify_msg(const byte* sig, word32 sigLen, - const byte* msg, word32 msgLen, int* res, dilithium_key* key) -{ - int ret = 0; - OQS_SIG *oqssig = NULL; - - if (!key->pubKeySet) { - ret = BAD_FUNC_ARG; - } - - if (ret == 0) { - if (key->level == WC_ML_DSA_44) { - oqssig = OQS_SIG_new(OQS_SIG_alg_ml_dsa_44_ipd); - } - else if (key->level == WC_ML_DSA_65) { - oqssig = OQS_SIG_new(OQS_SIG_alg_ml_dsa_65_ipd); - } - else if (key->level == WC_ML_DSA_87) { - oqssig = OQS_SIG_new(OQS_SIG_alg_ml_dsa_87_ipd); - } - else { - ret = SIG_TYPE_E; - } - } - - if ((ret == 0) && (oqssig == NULL)) { - ret = BUFFER_E; - } - - if ((ret == 0) && - (OQS_SIG_verify(oqssig, msg, msgLen, sig, sigLen, key->p) - == OQS_ERROR)) { - ret = SIG_VERIFY_E; - } - - if (ret == 0) { - *res = 1; - } - - if (oqssig != NULL) { - OQS_SIG_free(oqssig); - } - return ret; -} -#endif /* !WOLFSSL_DILITHIUM_NO_VERIFY */ - -#else - #error "No dilithium implementation chosen." -#endif - #ifndef WOLFSSL_DILITHIUM_NO_MAKE_KEY int wc_dilithium_make_key(dilithium_key* key, WC_RNG* rng) { @@ -10295,7 +10111,6 @@ int wc_dilithium_make_key(dilithium_key* key, WC_RNG* rng) #endif if (ret == 0) { -#ifdef WOLFSSL_WC_DILITHIUM /* Check the level or parameters have been set. */ if (key->params == NULL) { ret = BAD_STATE_E; @@ -10304,10 +10119,6 @@ int wc_dilithium_make_key(dilithium_key* key, WC_RNG* rng) /* Make the key. */ ret = dilithium_make_key(key, rng); } -#elif defined(HAVE_LIBOQS) - /* Make the key. */ - ret = oqs_dilithium_make_key(key, rng); -#endif } return ret; @@ -10323,7 +10134,6 @@ int wc_dilithium_make_key_from_seed(dilithium_key* key, const byte* seed) } if (ret == 0) { -#ifdef WOLFSSL_WC_DILITHIUM /* Check the level or parameters have been set. */ if (key->params == NULL) { ret = BAD_STATE_E; @@ -10332,10 +10142,6 @@ int wc_dilithium_make_key_from_seed(dilithium_key* key, const byte* seed) /* Make the key. */ ret = dilithium_make_key_from_seed(key, seed); } -#elif defined(HAVE_LIBOQS) - /* Make the key. */ - ret = NOT_COMPILED_IN; -#endif } return ret; @@ -10392,12 +10198,8 @@ int wc_dilithium_sign_ctx_msg(const byte* ctx, byte ctxLen, const byte* msg, if (ret == 0) { /* Sign message. */ - #ifdef WOLFSSL_WC_DILITHIUM ret = dilithium_sign_ctx_msg(key, rng, ctx, ctxLen, msg, msgLen, sig, sigLen); - #elif defined(HAVE_LIBOQS) - ret = oqs_dilithium_sign_msg(msg, msgLen, sig, sigLen, key, rng); - #endif } return ret; @@ -10446,11 +10248,7 @@ int wc_dilithium_sign_msg(const byte* msg, word32 msgLen, byte* sig, if (ret == 0) { /* Sign message. */ - #ifdef WOLFSSL_WC_DILITHIUM ret = dilithium_sign_msg(key, rng, msg, msgLen, sig, sigLen); - #elif defined(HAVE_LIBOQS) - ret = oqs_dilithium_sign_msg(msg, msgLen, sig, sigLen, key, rng); - #endif } return ret; @@ -10505,16 +10303,8 @@ int wc_dilithium_sign_ctx_hash(const byte* ctx, byte ctxLen, int hashAlg, if (ret == 0) { /* Sign message. */ - #ifdef WOLFSSL_WC_DILITHIUM ret = dilithium_sign_ctx_hash(key, rng, ctx, ctxLen, hashAlg, hash, hashLen, sig, sigLen); - #elif defined(HAVE_LIBOQS) - ret = NOT_COMPILED_IN; - (void)hashAlg; - (void)hash; - (void)hashLen; - (void)rng; - #endif } return ret; @@ -10551,14 +10341,8 @@ int wc_dilithium_sign_ctx_msg_with_seed(const byte* ctx, byte ctxLen, if (ret == 0) { /* Sign message. */ - #ifdef WOLFSSL_WC_DILITHIUM ret = dilithium_sign_ctx_msg_with_seed(key, seed, ctx, ctxLen, msg, msgLen, sig, sigLen); - #elif defined(HAVE_LIBOQS) - ret = NOT_COMPILED_IN; - (void)msgLen; - (void)seed; - #endif } return ret; @@ -10591,13 +10375,7 @@ int wc_dilithium_sign_msg_with_seed(const byte* msg, word32 msgLen, byte* sig, if (ret == 0) { /* Sign message. */ - #ifdef WOLFSSL_WC_DILITHIUM ret = dilithium_sign_msg_with_seed(key, seed, msg, msgLen, sig, sigLen); - #elif defined(HAVE_LIBOQS) - ret = NOT_COMPILED_IN; - (void)msgLen; - (void)seed; - #endif } return ret; @@ -10636,16 +10414,8 @@ int wc_dilithium_sign_ctx_hash_with_seed(const byte* ctx, byte ctxLen, if (ret == 0) { /* Sign message. */ - #ifdef WOLFSSL_WC_DILITHIUM ret = dilithium_sign_ctx_hash_with_seed(key, seed, ctx, ctxLen, hashAlg, hash, hashLen, sig, sigLen); - #elif defined(HAVE_LIBOQS) - ret = NOT_COMPILED_IN; - (void)hashAlg; - (void)hash; - (void)hashLen; - (void)seed; - #endif } return ret; @@ -10703,12 +10473,8 @@ int wc_dilithium_verify_ctx_msg(const byte* sig, word32 sigLen, const byte* ctx, if (ret == 0) { /* Verify message with signature. */ - #ifdef WOLFSSL_WC_DILITHIUM ret = dilithium_verify_ctx_msg(key, ctx, ctxLen, msg, msgLen, sig, sigLen, res); - #elif defined(HAVE_LIBOQS) - ret = oqs_dilithium_verify_msg(sig, sigLen, msg, msgLen, res, key); - #endif } return ret; @@ -10757,11 +10523,7 @@ int wc_dilithium_verify_msg(const byte* sig, word32 sigLen, const byte* msg, if (ret == 0) { /* Verify message with signature. */ - #ifdef WOLFSSL_WC_DILITHIUM ret = dilithium_verify_msg(key, msg, msgLen, sig, sigLen, res); - #elif defined(HAVE_LIBOQS) - ret = oqs_dilithium_verify_msg(sig, sigLen, msg, msgLen, res, key); - #endif } return ret; @@ -10816,16 +10578,8 @@ int wc_dilithium_verify_ctx_hash(const byte* sig, word32 sigLen, if (ret == 0) { /* Verify message with signature. */ - #ifdef WOLFSSL_WC_DILITHIUM ret = dilithium_verify_ctx_hash(key, ctx, ctxLen, hashAlg, hash, hashLen, sig, sigLen, res); - #elif defined(HAVE_LIBOQS) - ret = NOT_COMPILED_IN; - (void)sigLen; - (void)hashAlg; - (void)hash; - (void)hashLen; - #endif } return ret; @@ -10923,7 +10677,7 @@ int wc_dilithium_init_ex(dilithium_key* key, void* heap, int devId) key->heap = heap; } -#if defined(WOLFSSL_WC_DILITHIUM) && defined(USE_INTEL_SPEEDUP) +#if defined(USE_INTEL_SPEEDUP) cpuid_get_flags_ex(&cpuid_flags); #endif @@ -11017,7 +10771,6 @@ int wc_dilithium_set_level(dilithium_key* key, byte level) } if (ret == 0) { -#ifdef WOLFSSL_WC_DILITHIUM /* Get the parameters for level into key. */ ret = dilithium_get_params(level, &key->params); } @@ -11042,7 +10795,6 @@ int wc_dilithium_set_level(dilithium_key* key, byte level) key->pubVecSet = 0; #endif #endif -#endif /* WOLFSSL_WC_DILITHIUM */ #ifdef WOLFSSL_DILITHIUM_DYNAMIC_KEYS if (key->k != NULL) { @@ -11109,7 +10861,6 @@ void wc_dilithium_free(dilithium_key* key) /* always continue to software cleanup */ } #endif -#ifdef WOLFSSL_WC_DILITHIUM #ifndef WC_DILITHIUM_FIXED_ARRAY /* Dispose of cached items. */ #ifdef WC_DILITHIUM_CACHE_PUB_VECTORS @@ -11127,7 +10878,6 @@ void wc_dilithium_free(dilithium_key* key) /* Free the SHAKE-128/256 object. */ wc_Shake256_Free(&key->shake); #endif -#endif #ifdef WOLFSSL_DILITHIUM_DYNAMIC_KEYS if (key->k != NULL) { ForceZero(key->k, key->kSz); @@ -11378,7 +11128,6 @@ int wc_MlDsaKey_GetSigLen(MlDsaKey* key, int* len) int wc_dilithium_check_key(dilithium_key* key) { int ret = 0; -#ifdef WOLFSSL_WC_DILITHIUM const wc_dilithium_params* params = NULL; sword32* a = NULL; sword32* s1 = NULL; @@ -11504,32 +11253,6 @@ int wc_dilithium_check_key(dilithium_key* key) /* Dispose of allocated memory. */ XFREE(s1, key->heap, DYNAMIC_TYPE_DILITHIUM); } -#else - /* Validate parameter. */ - if (key == NULL) { - ret = BAD_FUNC_ARG; - } - if ((ret == 0) && (!key->prvKeySet)) { - ret = BAD_FUNC_ARG; - } - if ((ret == 0) && (!key->pubKeySet)) { - ret = PUBLIC_KEY_E; - } - - if (ret == 0) { - int i; - sword32 x = 0; - - /* Check the public seed is the same in private and public key. */ - for (i = 0; i < 32; i++) { - x |= key->p[i] ^ key->k[i]; - } - - if (x != 0) { - ret = PUBLIC_KEY_E; - } - } -#endif /* WOLFSSL_WC_DILITHIUM */ return ret; } #endif /* WOLFSSL_DILITHIUM_CHECK_KEY */ @@ -12274,7 +11997,7 @@ int wc_Dilithium_PrivateKeyDecode(const byte* input, word32* inOutIdx, if (ret == 0) { /* Generate a key pair if seed exists and decoded key pair is ignored */ if (seedLen != 0) { -#if defined(WOLFSSL_WC_DILITHIUM) && !defined(WOLFSSL_DILITHIUM_NO_MAKE_KEY) +#if !defined(WOLFSSL_DILITHIUM_NO_MAKE_KEY) if (seedLen == DILITHIUM_SEED_SZ) { ret = wc_dilithium_make_key_from_seed(key, seed); } @@ -12509,11 +12232,7 @@ int wc_Dilithium_PublicKeyDecode(const byte* input, word32* inOutIdx, ret = DecodeAsymKeyPublic_Assign(input, inOutIdx, inSz, &pubKey, &pubKeyLen, &keyType); - if (ret == 0 -#ifdef WOLFSSL_WC_DILITHIUM - && key->params == NULL -#endif - ) { + if (ret == 0 && key->params == NULL) { /* Set the security level based on the decoded key. */ ret = mapOidToSecLevel(keyType); if (ret > 0) { diff --git a/wolfcrypt/src/evp_pk.c b/wolfcrypt/src/evp_pk.c index 7767cb92f49..068bdf19bc6 100644 --- a/wolfcrypt/src/evp_pk.c +++ b/wolfcrypt/src/evp_pk.c @@ -448,8 +448,10 @@ static int d2iTryAltDhKey(WOLFSSL_EVP_PKEY** out, const unsigned char* mem, static int d2i_falcon_priv_key_level(falcon_key* falcon, byte level, const unsigned char* mem, long memSz) { + word32 idx = 0; return (wc_falcon_set_level(falcon, level) == 0) && - (wc_falcon_import_private_only(mem, (word32)memSz, falcon) == 0); + (wc_Falcon_PrivateKeyDecode(mem, &idx, falcon, + (word32)memSz) == 0); } /** diff --git a/wolfcrypt/src/ext_mlkem.c b/wolfcrypt/src/ext_mlkem.c deleted file mode 100644 index 91634f494f2..00000000000 --- a/wolfcrypt/src/ext_mlkem.c +++ /dev/null @@ -1,762 +0,0 @@ -/* ext_mlkem.c - * - * Copyright (C) 2006-2026 wolfSSL Inc. - * - * This file is part of wolfSSL. - * - * wolfSSL is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 3 of the License, or - * (at your option) any later version. - * - * wolfSSL is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA - */ - -#include - -#if defined(WOLFSSL_HAVE_MLKEM) && !defined(WOLFSSL_WC_MLKEM) -#include - -#ifdef NO_INLINE - #include -#else - #define WOLFSSL_MISC_INCLUDED - #include -#endif - -#if defined (HAVE_LIBOQS) - -#include - -static const char* OQS_ID2name(int id) { - switch (id) { - #ifndef WOLFSSL_NO_ML_KEM - case WC_ML_KEM_512: return OQS_KEM_alg_ml_kem_512; - case WC_ML_KEM_768: return OQS_KEM_alg_ml_kem_768; - case WC_ML_KEM_1024: return OQS_KEM_alg_ml_kem_1024; - #endif - #ifdef WOLFSSL_MLKEM_KYBER - case KYBER_LEVEL1: return OQS_KEM_alg_kyber_512; - case KYBER_LEVEL3: return OQS_KEM_alg_kyber_768; - case KYBER_LEVEL5: return OQS_KEM_alg_kyber_1024; - #endif - default: break; - } - return NULL; -} - -int ext_mlkem_enabled(int id) -{ - const char * name = OQS_ID2name(id); - return OQS_KEM_alg_is_enabled(name); -} -#endif - -/******************************************************************************/ -/* Initializer and cleanup functions. */ - -/** - * Initialize the Kyber key. - * - * @param [out] key Kyber key object to initialize. - * @param [in] type Type of key: KYBER512, KYBER768, KYBER1024. - * @param [in] heap Dynamic memory hint. - * @param [in] devId Device Id. - * @return 0 on success. - * @return BAD_FUNC_ARG when key is NULL or type is unrecognized. - * @return NOT_COMPILED_IN when key type is not supported. - */ -int wc_MlKemKey_Init(MlKemKey* key, int type, void* heap, int devId) -{ - int ret = 0; - - /* Validate key. */ - if (key == NULL) { - ret = BAD_FUNC_ARG; - } - if (ret == 0) { - /* Validate type. */ - switch (type) { -#ifndef WOLFSSL_NO_ML_KEM - case WC_ML_KEM_512: - #ifdef HAVE_LIBOQS - case WC_ML_KEM_768: - case WC_ML_KEM_1024: - #endif /* HAVE_LIBOQS */ -#endif -#ifdef WOLFSSL_MLKEM_KYBER - case KYBER_LEVEL1: - #ifdef HAVE_LIBOQS - case KYBER_LEVEL3: - case KYBER_LEVEL5: - #endif /* HAVE_LIBOQS */ -#endif - break; - default: - /* No other values supported. */ - ret = BAD_FUNC_ARG; - break; - } - } - if (ret == 0) { - /* Zero out all data. */ - XMEMSET(key, 0, sizeof(*key)); - - /* Keep type for parameters. */ - key->type = type; - -#ifdef WOLF_CRYPTO_CB - key->devCtx = NULL; - key->devId = devId; -#endif - } - - (void)heap; - (void)devId; - - return ret; -} - -/** - * Free the Kyber key object. - * - * @param [in, out] key Kyber key object to dispose of. - */ -int wc_MlKemKey_Free(MlKemKey* key) -{ - if (key != NULL) { - /* Ensure all private data is zeroed. */ - ForceZero(key, sizeof(*key)); - } - - return 0; -} - -/******************************************************************************/ -/* Data size getters. */ - -/** - * Get the size in bytes of encoded private key for the key. - * - * @param [in] key Kyber key object. - * @param [out] len Length of encoded private key in bytes. - * @return 0 on success. - * @return BAD_FUNC_ARG when key or len is NULL. - * @return NOT_COMPILED_IN when key type is not supported. - */ -int wc_MlKemKey_PrivateKeySize(MlKemKey* key, word32* len) -{ - int ret = 0; - - /* Validate parameters. */ - if ((key == NULL) || (len == NULL)) { - ret = BAD_FUNC_ARG; - } - -#ifdef HAVE_LIBOQS - /* NOTE: SHAKE and AES variants have the same length private key. */ - if (ret == 0) { - switch (key->type) { - #ifndef WOLFSSL_NO_ML_KEM - case WC_ML_KEM_512: - *len = OQS_KEM_ml_kem_512_length_secret_key; - break; - case WC_ML_KEM_768: - *len = OQS_KEM_ml_kem_768_length_secret_key; - break; - case WC_ML_KEM_1024: - *len = OQS_KEM_ml_kem_1024_length_secret_key; - break; - #endif - #ifdef WOLFSSL_MLKEM_KYBER - case KYBER_LEVEL1: - *len = OQS_KEM_kyber_512_length_secret_key; - break; - case KYBER_LEVEL3: - *len = OQS_KEM_kyber_768_length_secret_key; - break; - case KYBER_LEVEL5: - *len = OQS_KEM_kyber_1024_length_secret_key; - break; - #endif - default: - /* No other values supported. */ - ret = BAD_FUNC_ARG; - break; - } - } -#endif /* HAVE_LIBOQS */ - - return ret; -} - -/** - * Get the size in bytes of encoded public key for the key. - * - * @param [in] key Kyber key object. - * @param [out] len Length of encoded public key in bytes. - * @return 0 on success. - * @return BAD_FUNC_ARG when key or len is NULL. - * @return NOT_COMPILED_IN when key type is not supported. - */ -int wc_MlKemKey_PublicKeySize(MlKemKey* key, word32* len) -{ - int ret = 0; - - /* Validate parameters. */ - if ((key == NULL) || (len == NULL)) { - ret = BAD_FUNC_ARG; - } - -#ifdef HAVE_LIBOQS - /* NOTE: SHAKE and AES variants have the same length public key. */ - if (ret == 0) { - switch (key->type) { - #ifndef WOLFSSL_NO_ML_KEM - case WC_ML_KEM_512: - *len = OQS_KEM_ml_kem_512_length_public_key; - break; - case WC_ML_KEM_768: - *len = OQS_KEM_ml_kem_768_length_public_key; - break; - case WC_ML_KEM_1024: - *len = OQS_KEM_ml_kem_1024_length_public_key; - break; - #endif - #ifdef WOLFSSL_MLKEM_KYBER - case KYBER_LEVEL1: - *len = OQS_KEM_kyber_512_length_public_key; - break; - case KYBER_LEVEL3: - *len = OQS_KEM_kyber_768_length_public_key; - break; - case KYBER_LEVEL5: - *len = OQS_KEM_kyber_1024_length_public_key; - break; - #endif - default: - /* No other values supported. */ - ret = BAD_FUNC_ARG; - break; - } - } -#endif /* HAVE_LIBOQS */ - - return ret; -} - -/** - * Get the size in bytes of cipher text for key. - * - * @param [in] key Kyber key object. - * @param [out] len Length of cipher text in bytes. - * @return 0 on success. - * @return BAD_FUNC_ARG when key or len is NULL. - * @return NOT_COMPILED_IN when key type is not supported. - */ -int wc_MlKemKey_CipherTextSize(MlKemKey* key, word32* len) -{ - int ret = 0; - - /* Validate parameters. */ - if ((key == NULL) || (len == NULL)) { - ret = BAD_FUNC_ARG; - } - -#ifdef HAVE_LIBOQS - /* NOTE: SHAKE and AES variants have the same length ciphertext. */ - if (ret == 0) { - switch (key->type) { - #ifndef WOLFSSL_NO_ML_KEM - case WC_ML_KEM_512: - *len = OQS_KEM_ml_kem_512_length_ciphertext; - break; - case WC_ML_KEM_768: - *len = OQS_KEM_ml_kem_768_length_ciphertext; - break; - case WC_ML_KEM_1024: - *len = OQS_KEM_ml_kem_1024_length_ciphertext; - break; - #endif - #ifdef WOLFSSL_MLKEM_KYBER - case KYBER_LEVEL1: - *len = OQS_KEM_kyber_512_length_ciphertext; - break; - case KYBER_LEVEL3: - *len = OQS_KEM_kyber_768_length_ciphertext; - break; - case KYBER_LEVEL5: - *len = OQS_KEM_kyber_1024_length_ciphertext; - break; - #endif - default: - /* No other values supported. */ - ret = BAD_FUNC_ARG; - break; - } - } -#endif /* HAVE_LIBOQS */ - - return ret; -} - -/** - * Size of a shared secret in bytes. Always KYBER_SS_SZ. - * - * @param [in] key Kyber key object. Not used. - * @param [out] Size of the shared secret created with a Kyber key. - * @return 0 on success. - * @return 0 to indicate success. - */ -int wc_MlKemKey_SharedSecretSize(MlKemKey* key, word32* len) -{ - (void)key; - /* Validate parameters. */ - if (len == NULL) { - return BAD_FUNC_ARG; - } - - *len = KYBER_SS_SZ; - - return 0; -} - -/******************************************************************************/ -/* Cryptographic operations. */ - -/** - * Make a Kyber key object using a random number generator. - * - * NOTE: rng is ignored. OQS doesn't use our RNG. - * - * @param [in, out] key Kyber key ovject. - * @param [in] rng Random number generator. - * @return 0 on success. - * @return BAD_FUNC_ARG when key or rng is NULL. - * @return MEMORY_E when dynamic memory allocation failed. - */ -int wc_MlKemKey_MakeKey(MlKemKey* key, WC_RNG* rng) -{ - int ret = 0; -#ifdef HAVE_LIBOQS - const char* algName = NULL; - OQS_KEM *kem = NULL; -#endif - - /* Validate parameter. */ - if (key == NULL) { - return BAD_FUNC_ARG; - } - -#ifdef WOLF_CRYPTO_CB - #ifndef WOLF_CRYPTO_CB_FIND - if (key->devId != INVALID_DEVID) - #endif - { - ret = wc_CryptoCb_MakePqcKemKey(rng, WC_PQC_KEM_TYPE_KYBER, - key->type, key); - if (ret != WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE)) - return ret; - /* fall-through when unavailable */ - ret = 0; - } -#endif - -#ifdef HAVE_LIBOQS - if (ret == 0) { - algName = OQS_ID2name(key->type); - if (algName == NULL) { - ret = BAD_FUNC_ARG; - } - } - - if (ret == 0) { - kem = OQS_KEM_new(algName); - if (kem == NULL) { - ret = BAD_FUNC_ARG; - } - } - if (ret == 0) { - ret = wolfSSL_liboqsRngMutexLock(rng); - } - if (ret == 0) { - if (OQS_KEM_keypair(kem, key->pub, key->priv) != - OQS_SUCCESS) { - ret = BAD_FUNC_ARG; - } - } - wolfSSL_liboqsRngMutexUnlock(); - OQS_KEM_free(kem); -#endif /* HAVE_LIBOQS */ - - if (ret != 0) { - ForceZero(key, sizeof(*key)); - } - - return ret; -} - -/** - * Make a Kyber key object using random data. - * - * @param [in, out] key Kyber key ovject. - * @param [in] rng Random number generator. - * @return 0 on success. - * @return BAD_FUNC_ARG when key or rand is NULL. - * @return BUFFER_E when length is not KYBER_MAKEKEY_RAND_SZ. - * @return NOT_COMPILED_IN when key type is not supported. - * @return MEMORY_E when dynamic memory allocation failed. - */ -int wc_MlKemKey_MakeKeyWithRandom(MlKemKey* key, const unsigned char* rand, - int len) -{ - (void)rand; - (void)len; - /* OQS doesn't support external randomness. */ - return wc_MlKemKey_MakeKey(key, NULL); -} - -/** - * Encapsulate with random number generator and derive secret. - * - * @param [in] key Kyber key object. - * @param [out] ct Cipher text. - * @param [out] ss Shared secret generated. - * @param [in] rng Random number generator. - * @return 0 on success. - * @return BAD_FUNC_ARG when key, ct, ss or RNG is NULL. - * @return NOT_COMPILED_IN when key type is not supported. - * @return MEMORY_E when dynamic memory allocation failed. - */ -int wc_MlKemKey_Encapsulate(MlKemKey* key, unsigned char* ct, unsigned char* ss, - WC_RNG* rng) -{ - int ret = 0; -#ifdef WOLF_CRYPTO_CB - word32 ctlen = 0; -#endif -#ifdef HAVE_LIBOQS - const char * algName = NULL; - OQS_KEM *kem = NULL; -#endif - - (void)rng; - - /* Validate parameters. */ - if ((key == NULL) || (ct == NULL) || (ss == NULL)) { - ret = BAD_FUNC_ARG; - } - -#ifdef WOLF_CRYPTO_CB - if (ret == 0) { - ret = wc_MlKemKey_CipherTextSize(key, &ctlen); - } - if ((ret == 0) - #ifndef WOLF_CRYPTO_CB_FIND - && (key->devId != INVALID_DEVID) - #endif - ) { - ret = wc_CryptoCb_PqcEncapsulate(ct, ctlen, ss, KYBER_SS_SZ, rng, - WC_PQC_KEM_TYPE_KYBER, key); - if (ret != WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE)) - return ret; - /* fall-through when unavailable */ - ret = 0; - } -#endif - -#ifdef HAVE_LIBOQS - if (ret == 0) { - algName = OQS_ID2name(key->type); - if (algName == NULL) { - ret = BAD_FUNC_ARG; - } - } - if (ret == 0) { - kem = OQS_KEM_new(algName); - if (kem == NULL) { - ret = BAD_FUNC_ARG; - } - } - if (ret == 0) { - ret = wolfSSL_liboqsRngMutexLock(rng); - } - if (ret == 0) { - if (OQS_KEM_encaps(kem, ct, ss, key->pub) != OQS_SUCCESS) { - ret = BAD_FUNC_ARG; - } - } - wolfSSL_liboqsRngMutexUnlock(); - OQS_KEM_free(kem); -#endif /* HAVE_LIBOQS */ - - return ret; -} - -/** - * Encapsulate with random data and derive secret. - * - * @param [out] ct Cipher text. - * @param [out] ss Shared secret generated. - * @param [in] rand Random data. - * @param [in] len Random data. - * @return 0 on success. - * @return BAD_FUNC_ARG when key, ct, ss or RNG is NULL. - * @return BUFFER_E when len is not KYBER_ENC_RAND_SZ. - * @return NOT_COMPILED_IN when key type is not supported. - * @return MEMORY_E when dynamic memory allocation failed. - */ -int wc_MlKemKey_EncapsulateWithRandom(MlKemKey* key, unsigned char* ct, - unsigned char* ss, const unsigned char* rand, int len) -{ - (void)rand; - (void)len; - /* OQS doesn't support external randomness. */ - return wc_MlKemKey_Encapsulate(key, ct, ss, NULL); -} - -/** - * Decapsulate the cipher text to calculate the shared secret. - * - * Validates the cipher text by encapsulating and comparing with data passed in. - * - * @param [in] key Kyber key object. - * @param [out] ss Shared secret. - * @param [in] ct Cipher text. - * @param [in] len Length of cipher text. - * @return 0 on success. - * @return BAD_FUNC_ARG when key, ss or cr are NULL. - * @return NOT_COMPILED_IN when key type is not supported. - * @return BUFFER_E when len is not the length of cipher text for the key type. - * @return MEMORY_E when dynamic memory allocation failed. - */ -int wc_MlKemKey_Decapsulate(MlKemKey* key, unsigned char* ss, - const unsigned char* ct, word32 len) -{ - int ret = 0; - word32 ctlen = 0; -#ifdef HAVE_LIBOQS - const char * algName = NULL; - OQS_KEM *kem = NULL; -#endif - - /* Validate parameters. */ - if ((key == NULL) || (ss == NULL) || (ct == NULL)) { - ret = BAD_FUNC_ARG; - } - if (ret == 0) { - ret = wc_MlKemKey_CipherTextSize(key, &ctlen); - } - if ((ret == 0) && (len != ctlen)) { - ret = BUFFER_E; - } - -#ifdef WOLF_CRYPTO_CB - if ((ret == 0) - #ifndef WOLF_CRYPTO_CB_FIND - && (key->devId != INVALID_DEVID) - #endif - ) { - ret = wc_CryptoCb_PqcDecapsulate(ct, ctlen, ss, KYBER_SS_SZ, - WC_PQC_KEM_TYPE_KYBER, key); - if (ret != WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE)) - return ret; - /* fall-through when unavailable */ - ret = 0; - } -#endif - -#ifdef HAVE_LIBOQS - if (ret == 0) { - algName = OQS_ID2name(key->type); - if (algName == NULL) { - ret = BAD_FUNC_ARG; - } - } - if (ret == 0) { - kem = OQS_KEM_new(algName); - if (kem == NULL) { - ret = BAD_FUNC_ARG; - } - } - if (ret == 0) { - if (OQS_KEM_decaps(kem, ss, ct, key->priv) != OQS_SUCCESS) { - ret = BAD_FUNC_ARG; - } - } - - OQS_KEM_free(kem); -#endif /* HAVE_LIBOQS */ - - return ret; - -} - -/******************************************************************************/ -/* Encoding and decoding functions. */ - -/** - * Decode the private key. - * - * We store the whole thing in the private key buffer. Note this means we cannot - * do the encapsulation operation with the private key. But generally speaking - * this is never done. - * - * @param [in, out] key Kyber key object. - * @param [in] in Buffer holding encoded key. - * @param [in] len Length of data in buffer. - * @return 0 on success. - * @return BAD_FUNC_ARG when key or in is NULL. - * @return NOT_COMPILED_IN when key type is not supported. - * @return BUFFER_E when len is not the correct size. - */ -int wc_MlKemKey_DecodePrivateKey(MlKemKey* key, const unsigned char* in, - word32 len) -{ - int ret = 0; - word32 privLen = 0; - - /* Validate parameters. */ - if ((key == NULL) || (in == NULL)) { - ret = BAD_FUNC_ARG; - } - - if (ret == 0) { - ret = wc_MlKemKey_PrivateKeySize(key, &privLen); - } - - /* Ensure the data is the correct length for the key type. */ - if ((ret == 0) && (len != privLen)) { - ret = BUFFER_E; - } - - if (ret == 0) { - XMEMCPY(key->priv, in, privLen); - } - - return ret; -} - -/** - * Decode public key. - * - * We store the whole thing in the public key buffer. - * - * @param [in, out] key Kyber key object. - * @param [in] in Buffer holding encoded key. - * @param [in] len Length of data in buffer. - * @return 0 on success. - * @return BAD_FUNC_ARG when key or in is NULL. - * @return NOT_COMPILED_IN when key type is not supported. - * @return BUFFER_E when len is not the correct size. - */ -int wc_MlKemKey_DecodePublicKey(MlKemKey* key, const unsigned char* in, - word32 len) -{ - int ret = 0; - word32 pubLen = 0; - - /* Validate parameters. */ - if ((key == NULL) || (in == NULL)) { - ret = BAD_FUNC_ARG; - } - - if (ret == 0) { - ret = wc_MlKemKey_PublicKeySize(key, &pubLen); - } - - /* Ensure the data is the correct length for the key type. */ - if ((ret == 0) && (len != pubLen)) { - ret = BUFFER_E; - } - - if (ret == 0) { - XMEMCPY(key->pub, in, pubLen); - } - - return ret; -} - -/** - * Encode the private key. - * - * We stored it as a blob so we can just copy it over. - * - * @param [in] key Kyber key object. - * @param [out] out Buffer to hold data. - * @param [in] len Size of buffer in bytes. - * @return 0 on success. - * @return BAD_FUNC_ARG when key or out is NULL or private/public key not - * available. - * @return NOT_COMPILED_IN when key type is not supported. - */ -int wc_MlKemKey_EncodePrivateKey(MlKemKey* key, unsigned char* out, word32 len) -{ - int ret = 0; - unsigned int privLen = 0; - - if ((key == NULL) || (out == NULL)) { - ret = BAD_FUNC_ARG; - } - - if (ret == 0) { - ret = wc_MlKemKey_PrivateKeySize(key, &privLen); - } - - /* Check buffer is big enough for encoding. */ - if ((ret == 0) && (len != privLen)) { - ret = BUFFER_E; - } - - if (ret == 0) { - XMEMCPY(out, key->priv, privLen); - } - - return ret; -} - -/** - * Encode the public key. - * - * We stored it as a blob so we can just copy it over. - * - * @param [in] key Kyber key object. - * @param [out] out Buffer to hold data. - * @param [in] len Size of buffer in bytes. - * @return 0 on success. - * @return BAD_FUNC_ARG when key or out is NULL or public key not available. - * @return NOT_COMPILED_IN when key type is not supported. - */ -int wc_MlKemKey_EncodePublicKey(MlKemKey* key, unsigned char* out, word32 len) -{ - int ret = 0; - unsigned int pubLen = 0; - - if ((key == NULL) || (out == NULL)) { - ret = BAD_FUNC_ARG; - } - - if (ret == 0) { - ret = wc_MlKemKey_PublicKeySize(key, &pubLen); - } - - /* Check buffer is big enough for encoding. */ - if ((ret == 0) && (len != pubLen)) { - ret = BUFFER_E; - } - - if (ret == 0) { - XMEMCPY(out, key->pub, pubLen); - } - - return ret; -} - -#endif /* WOLFSSL_HAVE_MLKEM && !WOLFSSL_WC_MLKEM */ diff --git a/wolfcrypt/src/falcon.c b/wolfcrypt/src/falcon.c index 9a9e1eeebb8..8037265ebf2 100644 --- a/wolfcrypt/src/falcon.c +++ b/wolfcrypt/src/falcon.c @@ -23,7 +23,7 @@ /* Based on ed448.c and Reworked for Falcon by Anthony Hu. */ -#if defined(HAVE_PQC) && defined(HAVE_FALCON) +#if defined(HAVE_FALCON) #include @@ -437,132 +437,74 @@ int wc_falcon_import_public(const byte* in, word32 inLen, return 0; } -static int parse_private_key(const byte* priv, word32 privSz, - byte** out, word32 *outSz, - falcon_key* key) { - word32 idx = 0; - int ret = 0; - int length = 0; +/* Import a raw Falcon private key. + * + * priv [in] Raw private-key bytes (exactly FALCON_LEVELx_KEY_SIZE). + * privSz [in] Length of priv in bytes. + * key [in] Falcon key. key->level must already be set. + * returns BAD_FUNC_ARG when a parameter is NULL or privSz doesn't match + * the expected raw secret-key length, + * 0 otherwise. + * + * This is the raw-bytes import. To decode a DER/PKCS8 Falcon private key, + * use wc_Falcon_PrivateKeyDecode instead. + */ +int wc_falcon_import_private_only(const byte* priv, word32 privSz, + falcon_key* key) +{ + word32 expSz; - /* sanity check on arguments */ if ((priv == NULL) || (key == NULL)) { return BAD_FUNC_ARG; } - if ((key->level != 1) && (key->level != 5)) { - return BAD_FUNC_ARG; - } - - /* At this point, it is still a PKCS8 private key. */ - if ((ret = ToTraditionalInline(priv, &idx, privSz)) < 0) { - /* ignore error, did not have PKCS8 header */ - (void)ret; - } - - /* Now it is a octet_string(concat(priv,pub)) */ - if ((ret = GetOctetString(priv, &idx, &length, privSz)) < 0) { - return ret; + if (key->level == 1) { + expSz = FALCON_LEVEL1_KEY_SIZE; } - - *out = (byte *)priv + idx; - *outSz = privSz - idx; - - /* And finally it is concat(priv,pub). Key size check. */ - if ((key->level == 1) && (*outSz != FALCON_LEVEL1_KEY_SIZE + - FALCON_LEVEL1_PUB_KEY_SIZE)) { - return BAD_FUNC_ARG; + else if (key->level == 5) { + expSz = FALCON_LEVEL5_KEY_SIZE; } - else if ((key->level == 5) && (*outSz != FALCON_LEVEL5_KEY_SIZE + - FALCON_LEVEL5_PUB_KEY_SIZE)) { + else { return BAD_FUNC_ARG; } - return 0; -} - -/* Import a falcon private key from a byte array. - * - * priv [in] Array holding private key. - * privSz [in] Number of bytes of data in array. - * key [in] Falcon private key. - * returns BAD_FUNC_ARG when a parameter is NULL or privSz is less than - * FALCON_LEVEL1_KEY_SIZE, - * 0 otherwise. - */ -int wc_falcon_import_private_only(const byte* priv, word32 privSz, - falcon_key* key) -{ - int ret = 0; - byte *newPriv = NULL; - word32 newPrivSz = 0; - - if ((ret = parse_private_key(priv, privSz, &newPriv, &newPrivSz, key)) - != 0) { - return ret; + if (privSz != expSz) { + return BAD_FUNC_ARG; } - XMEMCPY(key->k, newPriv, newPrivSz); + XMEMCPY(key->k, priv, privSz); key->prvKeySet = 1; return 0; } -/* Import a falcon private and public keys from byte array(s). +/* Import a raw Falcon private + public key pair. + * + * priv [in] Raw private-key bytes (exactly FALCON_LEVELx_KEY_SIZE). + * privSz [in] Length of priv in bytes. + * pub [in] Raw public-key bytes (exactly FALCON_LEVELx_PUB_KEY_SIZE). + * pubSz [in] Length of pub in bytes. + * key [in] Falcon key. key->level must already be set. + * returns BAD_FUNC_ARG when a parameter is NULL or a length doesn't match + * the expected raw size, 0 otherwise. * - * priv [in] Array holding private key or private+public keys - * privSz [in] Number of bytes of data in private key array. - * pub [in] Array holding public key (or NULL). - * pubSz [in] Number of bytes of data in public key array (or 0). - * key [in] Falcon private/public key. - * returns BAD_FUNC_ARG when a required parameter is NULL or an invalid - * combination of keys/lengths is supplied, 0 otherwise. + * This is the raw-bytes import. To decode a DER/PKCS8 Falcon private key, + * use wc_Falcon_PrivateKeyDecode instead. */ int wc_falcon_import_private_key(const byte* priv, word32 privSz, const byte* pub, word32 pubSz, falcon_key* key) { - int ret = 0; - byte *newPriv = NULL; - word32 newPrivSz = 0; + int ret; - if ((ret = parse_private_key(priv, privSz, &newPriv, &newPrivSz, key)) - != 0) { - return ret; - } - - if (pub == NULL) { - if (pubSz != 0) { - return BAD_FUNC_ARG; - } - - if ((newPrivSz != FALCON_LEVEL1_PRV_KEY_SIZE) && - (newPrivSz != FALCON_LEVEL5_PRV_KEY_SIZE)) { - return BAD_FUNC_ARG; - } - - if (key->level == 1) { - pub = newPriv + FALCON_LEVEL1_KEY_SIZE; - pubSz = FALCON_LEVEL1_PUB_KEY_SIZE; - } - else if (key->level == 5) { - pub = newPriv + FALCON_LEVEL5_KEY_SIZE; - pubSz = FALCON_LEVEL5_PUB_KEY_SIZE; - } - } - else if ((pubSz != FALCON_LEVEL1_PUB_KEY_SIZE) && - (pubSz != FALCON_LEVEL5_PUB_KEY_SIZE)) { + if ((priv == NULL) || (pub == NULL) || (key == NULL)) { return BAD_FUNC_ARG; } - /* import public key */ ret = wc_falcon_import_public(pub, pubSz, key); - if (ret == 0) { - /* make the private key (priv + pub) */ - XMEMCPY(key->k, newPriv, newPrivSz); - key->prvKeySet = 1; + ret = wc_falcon_import_private_only(priv, privSz, key); } - return ret; } @@ -844,13 +786,8 @@ int wc_Falcon_PrivateKeyDecode(const byte* input, word32* inOutIdx, ret = DecodeAsymKey(input, inOutIdx, inSz, privKey, &privKeyLen, pubKey, &pubKeyLen, keytype); if (ret == 0) { - if (pubKeyLen == 0) { - ret = wc_falcon_import_private_key(input, inSz, NULL, 0, key); - } - else { - ret = wc_falcon_import_private_key(input, inSz, pubKey, - pubKeyLen, key); - } + ret = wc_falcon_import_private_key(privKey, privKeyLen, + pubKey, pubKeyLen, key); } XFREE(privKey, NULL, DYNAMIC_TYPE_TMP_BUFFER); @@ -955,12 +892,12 @@ int wc_Falcon_KeyToDer(falcon_key* key, byte* output, word32 inLen) if (key->level == 1) { return SetAsymKeyDer(key->k, FALCON_LEVEL1_KEY_SIZE, key->p, - FALCON_LEVEL1_KEY_SIZE, output, inLen, + FALCON_LEVEL1_PUB_KEY_SIZE, output, inLen, FALCON_LEVEL1k); } else if (key->level == 5) { return SetAsymKeyDer(key->k, FALCON_LEVEL5_KEY_SIZE, key->p, - FALCON_LEVEL5_KEY_SIZE, output, inLen, + FALCON_LEVEL5_PUB_KEY_SIZE, output, inLen, FALCON_LEVEL5k); } @@ -984,4 +921,4 @@ int wc_Falcon_PrivateKeyToDer(falcon_key* key, byte* output, word32 inLen) return BAD_FUNC_ARG; } -#endif /* HAVE_PQC && HAVE_FALCON */ +#endif /* HAVE_FALCON */ diff --git a/wolfcrypt/src/port/arm/armv8-32-mlkem-asm.S b/wolfcrypt/src/port/arm/armv8-32-mlkem-asm.S index 638a0310d12..2089663a2f1 100644 --- a/wolfcrypt/src/port/arm/armv8-32-mlkem-asm.S +++ b/wolfcrypt/src/port/arm/armv8-32-mlkem-asm.S @@ -30,7 +30,7 @@ #ifdef WOLFSSL_ARMASM #if !defined(__aarch64__) && !defined(WOLFSSL_ARMASM_THUMB2) #ifndef WOLFSSL_ARMASM_INLINE -#ifdef WOLFSSL_WC_MLKEM +#ifdef WOLFSSL_HAVE_MLKEM #ifndef __APPLE__ .text .type L_mlkem_arm32_ntt_zetas, %object @@ -8507,7 +8507,7 @@ L_mlkem_arm32_rej_uniform_done: lsr r0, r12, #1 pop {r4, r5, r6, r7, r8, pc} .size mlkem_arm32_rej_uniform,.-mlkem_arm32_rej_uniform -#endif /* WOLFSSL_WC_MLKEM */ +#endif /* WOLFSSL_HAVE_MLKEM */ #endif /* !__aarch64__ && !WOLFSSL_ARMASM_THUMB2 */ #endif /* WOLFSSL_ARMASM */ diff --git a/wolfcrypt/src/port/arm/armv8-32-mlkem-asm_c.c b/wolfcrypt/src/port/arm/armv8-32-mlkem-asm_c.c index 686fd9f8efd..78f85cef66f 100644 --- a/wolfcrypt/src/port/arm/armv8-32-mlkem-asm_c.c +++ b/wolfcrypt/src/port/arm/armv8-32-mlkem-asm_c.c @@ -49,7 +49,7 @@ #include -#ifdef WOLFSSL_WC_MLKEM +#ifdef WOLFSSL_HAVE_MLKEM XALIGNED(4) static const word16 L_mlkem_arm32_ntt_zetas[] = { 0x08ed, 0x0a0b, 0x0b9a, 0x0714, 0x05d5, 0x058e, 0x011f, 0x00ca, 0x0c56, 0x026e, 0x0629, 0x00b6, 0x03c2, 0x084f, 0x073f, 0x05bc, @@ -8663,7 +8663,7 @@ WC_OMIT_FRAME_POINTER unsigned int mlkem_arm32_rej_uniform(sword16* p, return (word32)(size_t)p; } -#endif /* WOLFSSL_WC_MLKEM */ +#endif /* WOLFSSL_HAVE_MLKEM */ #endif /* !__aarch64__ && !WOLFSSL_ARMASM_THUMB2 */ #endif /* WOLFSSL_ARMASM */ diff --git a/wolfcrypt/src/port/arm/armv8-mlkem-asm.S b/wolfcrypt/src/port/arm/armv8-mlkem-asm.S index 566e10fcdaf..2ee1506a7ed 100644 --- a/wolfcrypt/src/port/arm/armv8-mlkem-asm.S +++ b/wolfcrypt/src/port/arm/armv8-mlkem-asm.S @@ -45,7 +45,7 @@ #endif /* __APPLE__ */ L_mlkem_aarch64_consts: .short 0x0d01,0xf301,0x4ebf,0x0549,0x5049,0x0000,0x0000,0x0000 -#ifdef WOLFSSL_WC_MLKEM +#ifdef WOLFSSL_HAVE_MLKEM #ifndef __APPLE__ .text .section .rodata @@ -12024,7 +12024,7 @@ L_SHA3_shake256_blocksx3_seed_neon_begin: .size mlkem_shake256_blocksx3_seed_neon,.-mlkem_shake256_blocksx3_seed_neon #endif /* __APPLE__ */ #endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ -#endif /* WOLFSSL_WC_MLKEM */ +#endif /* WOLFSSL_HAVE_MLKEM */ #endif /* __aarch64__ */ #endif /* WOLFSSL_ARMASM */ diff --git a/wolfcrypt/src/port/arm/armv8-mlkem-asm_c.c b/wolfcrypt/src/port/arm/armv8-mlkem-asm_c.c index 6f7ba392a24..54a92c47fc1 100644 --- a/wolfcrypt/src/port/arm/armv8-mlkem-asm_c.c +++ b/wolfcrypt/src/port/arm/armv8-mlkem-asm_c.c @@ -36,7 +36,7 @@ XALIGNED(4) static const word16 L_mlkem_aarch64_consts[] = { #include -#ifdef WOLFSSL_WC_MLKEM +#ifdef WOLFSSL_HAVE_MLKEM XALIGNED(4) static const word16 L_mlkem_aarch64_zetas[] = { 0x08ed, 0x0a0b, 0x0b9a, 0x0714, 0x05d5, 0x058e, 0x011f, 0x00ca, 0x0c56, 0x026e, 0x0629, 0x00b6, 0x03c2, 0x084f, 0x073f, 0x05bc, @@ -11255,7 +11255,7 @@ void mlkem_shake256_blocksx3_seed_neon(word64* state, byte* seed) } #endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ -#endif /* WOLFSSL_WC_MLKEM */ +#endif /* WOLFSSL_HAVE_MLKEM */ #endif /* __aarch64__ */ #endif /* WOLFSSL_ARMASM */ #endif /* WOLFSSL_ARMASM_INLINE */ diff --git a/wolfcrypt/src/port/arm/thumb2-mlkem-asm.S b/wolfcrypt/src/port/arm/thumb2-mlkem-asm.S index 42cd8622f69..49b638a67cf 100644 --- a/wolfcrypt/src/port/arm/thumb2-mlkem-asm.S +++ b/wolfcrypt/src/port/arm/thumb2-mlkem-asm.S @@ -32,7 +32,7 @@ #ifndef WOLFSSL_ARMASM_INLINE .thumb .syntax unified -#ifdef WOLFSSL_WC_MLKEM +#ifdef WOLFSSL_HAVE_MLKEM #ifndef __APPLE__ .text .type L_mlkem_thumb2_ntt_zetas, %object @@ -3582,7 +3582,7 @@ L_mlkem_thumb2_rej_uniform_done: POP {r4, r5, r6, r7, r8, r9, r10, pc} /* Cycle Count = 225 */ .size mlkem_thumb2_rej_uniform,.-mlkem_thumb2_rej_uniform -#endif /* WOLFSSL_WC_MLKEM */ +#endif /* WOLFSSL_HAVE_MLKEM */ #endif /* WOLFSSL_ARMASM_THUMB2 */ #endif /* WOLFSSL_ARMASM */ diff --git a/wolfcrypt/src/port/arm/thumb2-mlkem-asm_c.c b/wolfcrypt/src/port/arm/thumb2-mlkem-asm_c.c index 5f45fc70518..30a403959c4 100644 --- a/wolfcrypt/src/port/arm/thumb2-mlkem-asm_c.c +++ b/wolfcrypt/src/port/arm/thumb2-mlkem-asm_c.c @@ -49,7 +49,7 @@ #include -#ifdef WOLFSSL_WC_MLKEM +#ifdef WOLFSSL_HAVE_MLKEM XALIGNED(4) static const word16 L_mlkem_thumb2_ntt_zetas[] = { 0x08ed, 0x0a0b, 0x0b9a, 0x0714, 0x05d5, 0x058e, 0x011f, 0x00ca, 0x0c56, 0x026e, 0x0629, 0x00b6, 0x03c2, 0x084f, 0x073f, 0x05bc, @@ -3884,7 +3884,7 @@ WC_OMIT_FRAME_POINTER unsigned int mlkem_thumb2_rej_uniform(sword16* p, return (word32)(size_t)p; } -#endif /* WOLFSSL_WC_MLKEM */ +#endif /* WOLFSSL_HAVE_MLKEM */ #endif /* WOLFSSL_ARMASM_THUMB2 */ #endif /* WOLFSSL_ARMASM */ diff --git a/wolfcrypt/src/sha3_asm.S b/wolfcrypt/src/sha3_asm.S index 387a42a4c86..a0dfc6b8a97 100644 --- a/wolfcrypt/src/sha3_asm.S +++ b/wolfcrypt/src/sha3_asm.S @@ -9928,7 +9928,7 @@ L_sha3_block_n_avx2_rounds: #ifndef __APPLE__ .size sha3_block_n_avx2,.-sha3_block_n_avx2 #endif /* __APPLE__ */ -#if defined(WOLFSSL_WC_MLKEM) || defined(WOLFSSL_WC_DILITHIUM) || defined(WOLFSSL_HAVE_SLHDSA) +#if defined(WOLFSSL_HAVE_MLKEM) || defined(HAVE_DILITHIUM) || defined(WOLFSSL_HAVE_SLHDSA) #ifndef __APPLE__ .text .globl sha3_blocksx4_avx2 @@ -20664,8 +20664,8 @@ _sha3_128_blocksx4_seed_avx2: #ifndef __APPLE__ .size sha3_128_blocksx4_seed_avx2,.-sha3_128_blocksx4_seed_avx2 #endif /* __APPLE__ */ -#endif /* defined(WOLFSSL_WC_MLKEM) || defined(WOLFSSL_WC_DILITHIUM) || defined(WOLFSSL_HAVE_SLHDSA) */ -#ifdef WOLFSSL_WC_MLKEM +#endif /* defined(WOLFSSL_HAVE_MLKEM) || defined(HAVE_DILITHIUM) || defined(WOLFSSL_HAVE_SLHDSA) */ +#ifdef WOLFSSL_HAVE_MLKEM #ifndef __APPLE__ .data #else @@ -26044,8 +26044,8 @@ _sha3_256_blocksx4_seed_avx2: #ifndef __APPLE__ .size sha3_256_blocksx4_seed_avx2,.-sha3_256_blocksx4_seed_avx2 #endif /* __APPLE__ */ -#endif /* WOLFSSL_WC_MLKEM */ -#ifdef WOLFSSL_WC_DILITHIUM +#endif /* WOLFSSL_HAVE_MLKEM */ +#ifdef HAVE_DILITHIUM #ifndef __APPLE__ .data #else @@ -31448,7 +31448,7 @@ _sha3_256_blocksx4_seed_64_avx2: #ifndef __APPLE__ .size sha3_256_blocksx4_seed_64_avx2,.-sha3_256_blocksx4_seed_64_avx2 #endif /* __APPLE__ */ -#endif /* WOLFSSL_WC_DILITHIUM */ +#endif /* HAVE_DILITHIUM */ #endif /* HAVE_INTEL_AVX2 */ #if defined(__linux__) && defined(__ELF__) diff --git a/wolfcrypt/src/sphincs.c b/wolfcrypt/src/sphincs.c index 587b99375e8..61d858e3e75 100644 --- a/wolfcrypt/src/sphincs.c +++ b/wolfcrypt/src/sphincs.c @@ -25,7 +25,7 @@ #include -#if defined(HAVE_PQC) && defined(HAVE_SPHINCS) +#if defined(HAVE_SPHINCS) #ifdef HAVE_LIBOQS #include @@ -1054,4 +1054,4 @@ int wc_Sphincs_PrivateKeyToDer(sphincs_key* key, byte* output, word32 inLen) return BAD_FUNC_ARG; } -#endif /* HAVE_PQC && HAVE_SPHINCS */ +#endif /* HAVE_SPHINCS */ diff --git a/wolfcrypt/src/wc_mldsa_asm.S b/wolfcrypt/src/wc_mldsa_asm.S index 52acb659dcd..7cf4b585697 100644 --- a/wolfcrypt/src/wc_mldsa_asm.S +++ b/wolfcrypt/src/wc_mldsa_asm.S @@ -47,7 +47,7 @@ #endif /* HAVE_INTEL_AVX2 */ #endif /* NO_AVX2_SUPPORT */ -#ifdef WOLFSSL_WC_DILITHIUM +#ifdef HAVE_DILITHIUM #ifdef HAVE_INTEL_AVX2 #ifndef __APPLE__ .data @@ -35284,7 +35284,7 @@ _wc_mldsa_poly_make_pos_avx2: .size wc_mldsa_poly_make_pos_avx2,.-wc_mldsa_poly_make_pos_avx2 #endif /* __APPLE__ */ #endif /* HAVE_INTEL_AVX2 */ -#endif /* WOLFSSL_WC_DILITHIUM */ +#endif /* HAVE_DILITHIUM */ #if defined(__linux__) && defined(__ELF__) .section .note.GNU-stack,"",%progbits diff --git a/wolfcrypt/src/wc_mlkem.c b/wolfcrypt/src/wc_mlkem.c index 74c4260a1cb..2cdd64a6b20 100644 --- a/wolfcrypt/src/wc_mlkem.c +++ b/wolfcrypt/src/wc_mlkem.c @@ -78,7 +78,6 @@ #undef WOLFSSL_RISCV_ASM #endif -#include #include #include #include @@ -116,7 +115,7 @@ #error "Cannot use dynamic key buffers without malloc" #endif -#ifdef WOLFSSL_WC_MLKEM +#ifdef WOLFSSL_HAVE_MLKEM #ifdef DEBUG_MLKEM void print_polys(const char* name, const sword16* a, int d1, int d2); @@ -2515,4 +2514,4 @@ int wc_MlKemKey_EncodePublicKey(MlKemKey* key, unsigned char* out, word32 len) return ret; } -#endif /* WOLFSSL_WC_MLKEM */ +#endif /* WOLFSSL_HAVE_MLKEM */ diff --git a/wolfcrypt/src/wc_mlkem_asm.S b/wolfcrypt/src/wc_mlkem_asm.S index 5eb503c1f53..7e69add1275 100644 --- a/wolfcrypt/src/wc_mlkem_asm.S +++ b/wolfcrypt/src/wc_mlkem_asm.S @@ -47,7 +47,7 @@ #endif /* HAVE_INTEL_AVX2 */ #endif /* NO_AVX2_SUPPORT */ -#ifdef WOLFSSL_WC_MLKEM +#ifdef WOLFSSL_HAVE_MLKEM #ifdef HAVE_INTEL_AVX2 #ifndef __APPLE__ .data @@ -15869,7 +15869,7 @@ _mlkem_redistribute_8_rand_avx2: .size mlkem_redistribute_8_rand_avx2,.-mlkem_redistribute_8_rand_avx2 #endif /* __APPLE__ */ #endif /* HAVE_INTEL_AVX2 */ -#endif /* WOLFSSL_WC_MLKEM */ +#endif /* WOLFSSL_HAVE_MLKEM */ #if defined(__linux__) && defined(__ELF__) .section .note.GNU-stack,"",%progbits diff --git a/wolfcrypt/src/wc_mlkem_poly.c b/wolfcrypt/src/wc_mlkem_poly.c index 8d768d4ca8c..1df80823cc2 100644 --- a/wolfcrypt/src/wc_mlkem_poly.c +++ b/wolfcrypt/src/wc_mlkem_poly.c @@ -34,7 +34,7 @@ /* Possible Kyber options: * - * WOLFSSL_WC_MLKEM Default: OFF + * WOLFSSL_HAVE_MLKEM Default: OFF * Enables this code, wolfSSL implementation, to be built. * * WOLFSSL_WC_ML_KEM_512 Default: OFF @@ -79,7 +79,7 @@ #include #include -#ifdef WOLFSSL_WC_MLKEM +#ifdef WOLFSSL_HAVE_MLKEM #ifdef NO_INLINE #include @@ -6114,4 +6114,4 @@ int mlkem_check_public(sword16* pub, int k) return ret; } -#endif /* WOLFSSL_WC_MLKEM */ +#endif /* WOLFSSL_HAVE_MLKEM */ diff --git a/wolfcrypt/src/wc_pkcs11.c b/wolfcrypt/src/wc_pkcs11.c index fbc394780a0..8c387eec6ff 100644 --- a/wolfcrypt/src/wc_pkcs11.c +++ b/wolfcrypt/src/wc_pkcs11.c @@ -69,23 +69,20 @@ #if defined(NO_PKCS11_MLDSA) && defined(HAVE_DILITHIUM) #undef HAVE_DILITHIUM #endif -#if defined(WOLFSSL_HAVE_MLKEM) && defined(WOLFSSL_WC_MLKEM) - #define HAVE_PKCS11_MLKEM -#endif -#if defined(NO_PKCS11_MLKEM) && defined(HAVE_PKCS11_MLKEM) - #undef HAVE_PKCS11_MLKEM +#if defined(NO_PKCS11_MLKEM) && defined(WOLFSSL_HAVE_MLKEM) + #undef WOLFSSL_HAVE_MLKEM #endif #if (defined(HAVE_ECC) && !defined(NO_PKCS11_ECDH)) || \ - defined(HAVE_PKCS11_MLKEM) + defined(WOLFSSL_HAVE_MLKEM) /* Pointer to false required for templates. */ static CK_BBOOL ckFalse = CK_FALSE; #endif #if !defined(NO_RSA) || defined(HAVE_ECC) || (!defined(NO_AES) && \ (defined(HAVE_AESGCM) || defined(HAVE_AES_CBC))) || \ !defined(NO_HMAC) || defined(HAVE_DILITHIUM) || \ - defined(HAVE_PKCS11_MLKEM) + defined(WOLFSSL_HAVE_MLKEM) /* Pointer to true required for templates. */ static CK_BBOOL ckTrue = CK_TRUE; #endif @@ -98,7 +95,7 @@ static CK_KEY_TYPE rsaKeyType = CKK_RSA; /* Pointer to EC key type required for templates. */ static CK_KEY_TYPE ecKeyType = CKK_EC; #endif -#if defined(HAVE_PKCS11_MLKEM) +#if defined(WOLFSSL_HAVE_MLKEM) /* Pointer to ML-KEM key type required for templates. */ static CK_KEY_TYPE mlkemKeyType = CKK_ML_KEM; #endif @@ -107,7 +104,7 @@ static CK_KEY_TYPE mlkemKeyType = CKK_ML_KEM; static CK_KEY_TYPE mldsaKeyType = CKK_ML_DSA; #endif #if !defined(NO_RSA) || defined(HAVE_ECC) || defined(HAVE_DILITHIUM) || \ - defined(HAVE_PKCS11_MLKEM) + defined(WOLFSSL_HAVE_MLKEM) /* Pointer to public key class required for templates. */ static CK_OBJECT_CLASS pubKeyClass = CKO_PUBLIC_KEY; /* Pointer to private key class required for templates. */ @@ -115,7 +112,7 @@ static CK_OBJECT_CLASS privKeyClass = CKO_PRIVATE_KEY; #endif #if (!defined(NO_AES) && (defined(HAVE_AESGCM) || defined(HAVE_AES_CBC))) || \ !defined(NO_HMAC) || (defined(HAVE_ECC) && !defined(NO_PKCS11_ECDH)) || \ - defined(HAVE_PKCS11_MLKEM) + defined(WOLFSSL_HAVE_MLKEM) /* Pointer to secret key class required for templates. */ static CK_OBJECT_CLASS secretKeyClass = CKO_SECRET_KEY; #endif @@ -1572,7 +1569,7 @@ static int Pkcs11CreateEccPrivateKey(CK_OBJECT_HANDLE* privateKey, } #endif -#ifdef HAVE_PKCS11_MLKEM +#ifdef WOLFSSL_HAVE_MLKEM /** * Create a PKCS#11 object containing the ML-KEM public key data. */ @@ -1772,7 +1769,7 @@ static int Pkcs11CreateMlKemPrivateKey(CK_OBJECT_HANDLE* privateKey, return ret; } -#endif /* HAVE_PKCS11_MLKEM */ +#endif /* WOLFSSL_HAVE_MLKEM */ #ifdef HAVE_DILITHIUM /** @@ -1949,7 +1946,7 @@ static int Pkcs11CreateMldsaPrivateKey(CK_OBJECT_HANDLE* privateKey, #if !defined(NO_RSA) || defined(HAVE_ECC) || (!defined(NO_AES) && \ (defined(HAVE_AESGCM) || defined(HAVE_AES_CBC))) || \ !defined(NO_HMAC) || defined(HAVE_DILITHIUM) || \ - defined(HAVE_PKCS11_MLKEM) + defined(WOLFSSL_HAVE_MLKEM) /** * Check if mechanism is available in session on token. * @@ -2191,7 +2188,7 @@ int wc_Pkcs11StoreKey(Pkcs11Token* token, int type, int clear, void* key) break; } #endif - #ifdef HAVE_PKCS11_MLKEM + #ifdef WOLFSSL_HAVE_MLKEM case PKCS11_KEY_TYPE_MLKEM: { MlKemKey* mlkemKey = (MlKemKey*)key; CK_MECHANISM_INFO mechInfo; @@ -2220,7 +2217,7 @@ int wc_Pkcs11StoreKey(Pkcs11Token* token, int type, int clear, void* key) } break; } - #endif /* HAVE_PKCS11_MLKEM */ + #endif /* WOLFSSL_HAVE_MLKEM */ #if defined(HAVE_DILITHIUM) case PKCS11_KEY_TYPE_MLDSA: { MlDsaKey* mldsaKey = (MlDsaKey*) key; @@ -4243,7 +4240,7 @@ static int Pkcs11EccDeletePrivKey(Pkcs11Session* session, ecc_key* key) } #endif -#ifdef HAVE_PKCS11_MLKEM +#ifdef WOLFSSL_HAVE_MLKEM /* Finds the first ML-KEM key matching the key type. */ static int Pkcs11FindMlKemKey(CK_OBJECT_HANDLE* handle, CK_OBJECT_CLASS keyClass, @@ -4747,7 +4744,7 @@ static int Pkcs11PqcKemDecapsulate(Pkcs11Session* session, wc_CryptoInfo* info) return ret; } -#endif /* HAVE_PKCS11_MLKEM */ +#endif /* WOLFSSL_HAVE_MLKEM */ #if defined(HAVE_DILITHIUM) /** @@ -6330,7 +6327,7 @@ int wc_Pkcs11_CryptoDevCb(int devId, wc_CryptoInfo* info, void* ctx) if (ret == 0) { if (info->algo_type == WC_ALGO_TYPE_PK) { #if !defined(NO_RSA) || defined(HAVE_ECC) || defined(HAVE_DILITHIUM) || \ - defined(HAVE_PKCS11_MLKEM) + defined(WOLFSSL_HAVE_MLKEM) switch (info->pk.type) { #ifndef NO_RSA case WC_PK_TYPE_RSA: @@ -6410,7 +6407,7 @@ int wc_Pkcs11_CryptoDevCb(int devId, wc_CryptoInfo* info, void* ctx) } break; #endif - #ifdef HAVE_PKCS11_MLKEM + #ifdef WOLFSSL_HAVE_MLKEM case WC_PK_TYPE_PQC_KEM_KEYGEN: ret = Pkcs11OpenSession(token, &session, readWrite); if (ret == 0) { @@ -6469,7 +6466,7 @@ int wc_Pkcs11_CryptoDevCb(int devId, wc_CryptoInfo* info, void* ctx) } #else ret = NOT_COMPILED_IN; -#endif /* !NO_RSA || HAVE_ECC || HAVE_DILITHIUM || HAVE_PKCS11_MLKEM */ +#endif /* !NO_RSA || HAVE_ECC || HAVE_DILITHIUM || WOLFSSL_HAVE_MLKEM */ } else if (info->algo_type == WC_ALGO_TYPE_CIPHER) { #ifndef NO_AES @@ -6603,7 +6600,7 @@ int wc_Pkcs11_CryptoDevCb(int devId, wc_CryptoInfo* info, void* ctx) } else #endif - #ifdef HAVE_PKCS11_MLKEM + #ifdef WOLFSSL_HAVE_MLKEM if (info->free.algo == WC_ALGO_TYPE_PK && info->free.type == WC_PK_TYPE_PQC_KEM_KEYGEN && info->free.subType == WC_PQC_KEM_TYPE_KYBER) { diff --git a/wolfcrypt/test/test.c b/wolfcrypt/test/test.c index f1f08eba69e..08ec8f616fb 100644 --- a/wolfcrypt/test/test.c +++ b/wolfcrypt/test/test.c @@ -389,14 +389,8 @@ static const byte const_byte_array[] = "A+Gd\0\0\0"; #include #endif #ifdef WOLFSSL_HAVE_MLKEM - #include -#ifdef WOLFSSL_WC_MLKEM #include #endif -#if defined(HAVE_LIBOQS) - #include -#endif -#endif #ifdef HAVE_DILITHIUM #include #endif @@ -43922,7 +43916,7 @@ WOLFSSL_TEST_SUBROUTINE wc_test_ret_t ed448_test(void) #endif /* HAVE_ED448 */ #ifdef WOLFSSL_HAVE_MLKEM -#ifdef WOLFSSL_WC_MLKEM /* OQS does not support KATs */ +#ifdef WOLFSSL_HAVE_MLKEM /* OQS does not support KATs */ #if !defined(WOLFSSL_NO_KYBER512) && !defined(WOLFSSL_NO_ML_KEM_512) static wc_test_ret_t mlkem512_kat(void) { @@ -48303,7 +48297,7 @@ static wc_test_ret_t mlkem1024_kat(void) return ret; } #endif /* !WOLFSSL_NO_KYBER1024 && !WOLFSSL_NO_ML_KEM_1024 */ -#endif /* WOLFSSL_WC_MLKEM */ +#endif /* WOLFSSL_HAVE_MLKEM */ WOLFSSL_TEST_SUBROUTINE wc_test_ret_t mlkem_test(void) { @@ -48344,7 +48338,7 @@ WOLFSSL_TEST_SUBROUTINE wc_test_ret_t mlkem_test(void) #endif #endif #endif -#if defined(WOLFSSL_WC_MLKEM) && !defined(WOLFSSL_NO_MALLOC) && \ +#if defined(WOLFSSL_HAVE_MLKEM) && !defined(WOLFSSL_NO_MALLOC) && \ !defined(WOLFSSL_MLKEM_NO_MAKE_KEY) MlKemKey *tmpKey = NULL; #endif @@ -48533,7 +48527,7 @@ WOLFSSL_TEST_SUBROUTINE wc_test_ret_t mlkem_test(void) if (XMEMCMP(priv, priv2, testData[i][2]) != 0) ERROR_OUT(WC_TEST_RET_ENC_I(i), out); -#if defined(WOLFSSL_WC_MLKEM) && !defined(WOLFSSL_NO_MALLOC) +#if defined(WOLFSSL_HAVE_MLKEM) && !defined(WOLFSSL_NO_MALLOC) tmpKey = wc_MlKemKey_New(testData[i][0], HEAP_HINT, devId); if (tmpKey == NULL) ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); @@ -48544,7 +48538,7 @@ WOLFSSL_TEST_SUBROUTINE wc_test_ret_t mlkem_test(void) #endif } -#ifdef WOLFSSL_WC_MLKEM +#ifdef WOLFSSL_HAVE_MLKEM #if !defined(WOLFSSL_NO_KYBER512) && !defined(WOLFSSL_NO_ML_KEM_512) ret = mlkem512_kat(); if (ret != 0) @@ -48560,7 +48554,7 @@ WOLFSSL_TEST_SUBROUTINE wc_test_ret_t mlkem_test(void) if (ret != 0) goto out; #endif -#endif /* WOLFSSL_WC_MLKEM */ +#endif /* WOLFSSL_HAVE_MLKEM */ out: @@ -52099,7 +52093,7 @@ WOLFSSL_TEST_SUBROUTINE wc_test_ret_t dilithium_test(void) } #ifndef WOLFSSL_NO_ML_DSA_44 -#ifdef WOLFSSL_WC_DILITHIUM +#ifdef HAVE_DILITHIUM #ifndef WOLFSSL_DILITHIUM_NO_VERIFY ret = dilithium_param_44_vfy_test(); if (ret != 0) @@ -52113,7 +52107,7 @@ WOLFSSL_TEST_SUBROUTINE wc_test_ret_t dilithium_test(void) #endif #endif #ifndef WOLFSSL_NO_ML_DSA_65 -#ifdef WOLFSSL_WC_DILITHIUM +#ifdef HAVE_DILITHIUM #ifndef WOLFSSL_DILITHIUM_NO_VERIFY ret = dilithium_param_65_vfy_test(); if (ret != 0) @@ -52127,7 +52121,7 @@ WOLFSSL_TEST_SUBROUTINE wc_test_ret_t dilithium_test(void) #endif #endif #ifndef WOLFSSL_NO_ML_DSA_87 -#ifdef WOLFSSL_WC_DILITHIUM +#ifdef HAVE_DILITHIUM #ifndef WOLFSSL_DILITHIUM_NO_VERIFY ret = dilithium_param_87_vfy_test(); if (ret != 0) @@ -67046,14 +67040,14 @@ static int myCryptoDevCb(int devIdArg, wc_CryptoInfo* info, void* ctx) if ((info->pk.pqc_kem_kg.type == WC_PQC_KEM_TYPE_KYBER) && (info->pk.pqc_kem_kg.key != NULL)) { MlKemKey* key = (MlKemKey*)info->pk.pqc_kem_kg.key; -#ifdef WOLFSSL_WC_MLKEM +#ifdef WOLFSSL_HAVE_MLKEM int hashDevId = key->hash.devId; int prfDevId = key->prf.devId; #endif /* set devId to invalid, so software is used */ key->devId = INVALID_DEVID; -#ifdef WOLFSSL_WC_MLKEM +#ifdef WOLFSSL_HAVE_MLKEM key->hash.devId = INVALID_DEVID; key->prf.devId = INVALID_DEVID; #endif @@ -67062,7 +67056,7 @@ static int myCryptoDevCb(int devIdArg, wc_CryptoInfo* info, void* ctx) /* reset devId */ key->devId = devIdArg; -#ifdef WOLFSSL_WC_MLKEM +#ifdef WOLFSSL_HAVE_MLKEM key->hash.devId = hashDevId; key->prf.devId = prfDevId; #endif @@ -67072,14 +67066,14 @@ static int myCryptoDevCb(int devIdArg, wc_CryptoInfo* info, void* ctx) if ((info->pk.pqc_encaps.type == WC_PQC_KEM_TYPE_KYBER) && (info->pk.pqc_encaps.key != NULL)) { MlKemKey* key = (MlKemKey*)info->pk.pqc_encaps.key; -#ifdef WOLFSSL_WC_MLKEM +#ifdef WOLFSSL_HAVE_MLKEM int hashDevId = key->hash.devId; int prfDevId = key->prf.devId; #endif /* set devId to invalid, so software is used */ key->devId = INVALID_DEVID; -#ifdef WOLFSSL_WC_MLKEM +#ifdef WOLFSSL_HAVE_MLKEM key->hash.devId = INVALID_DEVID; key->prf.devId = INVALID_DEVID; #endif @@ -67091,7 +67085,7 @@ static int myCryptoDevCb(int devIdArg, wc_CryptoInfo* info, void* ctx) /* reset devId */ key->devId = devIdArg; -#ifdef WOLFSSL_WC_MLKEM +#ifdef WOLFSSL_HAVE_MLKEM key->hash.devId = hashDevId; key->prf.devId = prfDevId; #endif @@ -67101,14 +67095,14 @@ static int myCryptoDevCb(int devIdArg, wc_CryptoInfo* info, void* ctx) if ((info->pk.pqc_decaps.type == WC_PQC_KEM_TYPE_KYBER) && (info->pk.pqc_decaps.key != NULL)) { MlKemKey* key = (MlKemKey*)info->pk.pqc_decaps.key; -#ifdef WOLFSSL_WC_MLKEM +#ifdef WOLFSSL_HAVE_MLKEM int hashDevId = key->hash.devId; int prfDevId = key->prf.devId; #endif /* set devId to invalid, so software is used */ key->devId = INVALID_DEVID; -#ifdef WOLFSSL_WC_MLKEM +#ifdef WOLFSSL_HAVE_MLKEM key->hash.devId = INVALID_DEVID; key->prf.devId = INVALID_DEVID; #endif @@ -67120,7 +67114,7 @@ static int myCryptoDevCb(int devIdArg, wc_CryptoInfo* info, void* ctx) /* reset devId */ key->devId = devIdArg; -#ifdef WOLFSSL_WC_MLKEM +#ifdef WOLFSSL_HAVE_MLKEM key->hash.devId = hashDevId; key->prf.devId = prfDevId; #endif @@ -67847,7 +67841,7 @@ static int myCryptoDevCb(int devIdArg, wc_CryptoInfo* info, void* ctx) if (info->free.subType == WC_PQC_KEM_TYPE_KYBER) { MlKemKey* mlkem = (MlKemKey*)info->free.obj; mlkem->devId = INVALID_DEVID; -#ifdef WOLFSSL_WC_MLKEM +#ifdef WOLFSSL_HAVE_MLKEM mlkem->hash.devId = INVALID_DEVID; mlkem->prf.devId = INVALID_DEVID; #endif diff --git a/wolfssl-VS2022.vcxproj b/wolfssl-VS2022.vcxproj index d5e13a39645..7bb1661a1b9 100644 --- a/wolfssl-VS2022.vcxproj +++ b/wolfssl-VS2022.vcxproj @@ -428,7 +428,6 @@ - diff --git a/wolfssl.vcproj b/wolfssl.vcproj index 02554722d2a..a35cff8c7a0 100644 --- a/wolfssl.vcproj +++ b/wolfssl.vcproj @@ -263,10 +263,6 @@ RelativePath=".\wolfcrypt\src\error.c" > - - diff --git a/wolfssl.vcxproj b/wolfssl.vcxproj index 58410b144a7..c0cab55b3b2 100644 --- a/wolfssl.vcxproj +++ b/wolfssl.vcxproj @@ -427,7 +427,6 @@ - diff --git a/wolfssl/certs_test.h b/wolfssl/certs_test.h index efd4c1bd288..3b01e501ace 100644 --- a/wolfssl/certs_test.h +++ b/wolfssl/certs_test.h @@ -3462,646 +3462,646 @@ static const unsigned char dh_key_der_4096[] = /* certs/falcon/bench_falcon_level1_key.der */ static const unsigned char bench_falcon_level1_key[] = { - 0x30, 0x82, 0x08, 0x96, 0x02, 0x01, 0x00, 0x30, 0x07, 0x06, - 0x05, 0x2B, 0xCE, 0x0F, 0x03, 0x01, 0x04, 0x82, 0x08, 0x86, - 0x04, 0x82, 0x08, 0x82, 0x59, 0xFC, 0x32, 0x7D, 0x04, 0x41, - 0x01, 0xEC, 0x41, 0x7B, 0x04, 0x1F, 0x7F, 0xFC, 0x30, 0xBF, - 0x08, 0x80, 0x41, 0x10, 0x3F, 0x81, 0xFB, 0xFF, 0xC6, 0x07, - 0xCF, 0xC6, 0x0C, 0x11, 0x79, 0xFC, 0x2F, 0xC1, 0xFB, 0xFF, - 0x40, 0x1F, 0xA1, 0x3F, 0x0B, 0xF1, 0xC3, 0x0F, 0xB0, 0x43, - 0xFC, 0x61, 0x40, 0x0C, 0x1E, 0xFE, 0x08, 0x5E, 0xBE, 0x00, - 0x41, 0x3D, 0x13, 0xA0, 0xC0, 0xDB, 0xCF, 0x80, 0xF0, 0x20, - 0x80, 0x1C, 0x5F, 0x07, 0x07, 0xBF, 0xC3, 0x18, 0x5E, 0x85, - 0x0C, 0x1F, 0xC7, 0xD8, 0x0F, 0x86, 0x04, 0x10, 0xC0, 0xFC, - 0x32, 0x7E, 0xEF, 0xEF, 0x81, 0xF0, 0x2F, 0xC1, 0x04, 0x0E, - 0xC3, 0xF3, 0xD1, 0x47, 0xF7, 0xE0, 0xC0, 0xF8, 0x40, 0x42, - 0x13, 0xED, 0x82, 0xF0, 0x3E, 0xFB, 0xFF, 0xE0, 0x00, 0xFF, - 0xFF, 0xFA, 0x1F, 0xF1, 0x3D, 0x03, 0xCF, 0xBA, 0xFC, 0x90, - 0x43, 0x0B, 0x6F, 0xC7, 0xEF, 0xDF, 0x02, 0xFF, 0xCF, 0x41, - 0x03, 0xDF, 0xC2, 0x1B, 0xDE, 0xF9, 0x00, 0x90, 0x03, 0xFC, - 0x20, 0xBD, 0x04, 0x10, 0x38, 0xEF, 0xF1, 0x07, 0xE8, 0x51, - 0x07, 0xF7, 0x9F, 0xC2, 0x14, 0x00, 0x04, 0x04, 0x00, 0x00, - 0x04, 0x0F, 0x3F, 0xFF, 0xFF, 0x7D, 0xE0, 0x2F, 0x00, 0xF7, - 0xC1, 0x83, 0xFF, 0xBF, 0x87, 0x03, 0xA0, 0xC4, 0xEF, 0xEF, - 0xFF, 0xFC, 0x00, 0xFE, 0x20, 0x6F, 0xBE, 0x14, 0x9F, 0x01, - 0x17, 0xAE, 0xFE, 0x08, 0x3F, 0x7A, 0x17, 0xFF, 0x80, 0x14, - 0x3E, 0xC2, 0x04, 0x1F, 0xFB, 0x08, 0x4F, 0x41, 0xFC, 0x41, - 0xC2, 0x0C, 0x20, 0x82, 0x03, 0xC2, 0x43, 0x20, 0x20, 0xF8, - 0x07, 0xFF, 0x7E, 0xF8, 0x3E, 0x81, 0xEF, 0xDE, 0xC3, 0x00, - 0x4F, 0x85, 0x03, 0xD0, 0x7E, 0xF8, 0x2F, 0x42, 0xDF, 0xB1, - 0x3E, 0xFB, 0xF1, 0x45, 0x0B, 0xF1, 0x41, 0x1B, 0xF0, 0xC0, - 0x03, 0xEF, 0x03, 0xEB, 0x9E, 0xFE, 0xE8, 0x21, 0x42, 0x14, - 0x4E, 0xC4, 0xFC, 0x3E, 0x00, 0xF3, 0xFF, 0xBC, 0x18, 0x40, - 0x87, 0x08, 0x51, 0x7D, 0x03, 0xFF, 0x42, 0x18, 0x00, 0x43, - 0xF8, 0x6F, 0x7F, 0xFC, 0x21, 0x05, 0xFB, 0xF0, 0xFA, 0x00, - 0x2F, 0xC2, 0x04, 0x00, 0x43, 0x1B, 0xE1, 0x07, 0xF0, 0x50, - 0x05, 0x00, 0x11, 0x41, 0xF4, 0x4E, 0xC9, 0x0B, 0xDF, 0xBD, - 0x20, 0xB0, 0x7B, 0x04, 0xE0, 0xFF, 0xF3, 0xEF, 0x3F, 0x20, - 0x5F, 0xC8, 0xFF, 0xF0, 0xFE, 0xFB, 0x9F, 0x3C, 0xFB, 0xFF, - 0xC1, 0x13, 0x51, 0x05, 0x03, 0xFF, 0x03, 0xFB, 0xE1, 0xBE, - 0x1B, 0xC0, 0x8B, 0x03, 0xF1, 0x7F, 0x10, 0x6E, 0x39, 0x08, - 0x3F, 0xC9, 0xFC, 0x40, 0x82, 0xFB, 0xE0, 0xBC, 0xF0, 0x21, - 0x03, 0xE4, 0x6F, 0x7E, 0xD8, 0x00, 0x81, 0xF8, 0x41, 0x46, - 0x07, 0xC0, 0x45, 0x24, 0x2F, 0x80, 0x0C, 0x3F, 0x05, 0x20, - 0x8F, 0x84, 0xF8, 0x6F, 0xFF, 0xEC, 0x30, 0x85, 0xFF, 0xF0, - 0xBD, 0xF4, 0x50, 0x87, 0x00, 0x3F, 0xC2, 0xFB, 0xC0, 0xC1, - 0x03, 0xEF, 0xB8, 0xFF, 0xFF, 0x45, 0x13, 0xBE, 0xC1, 0x03, - 0xC0, 0x40, 0x07, 0x90, 0x3E, 0xE0, 0x0E, 0xFD, 0xFB, 0xA0, - 0xFF, 0xF8, 0x0F, 0xC5, 0xFF, 0xFF, 0x43, 0xE3, 0xFF, 0x06, - 0x0F, 0xB0, 0x43, 0xF0, 0x90, 0x7B, 0xE7, 0xD1, 0x79, 0x07, - 0xDF, 0xFB, 0x03, 0xE0, 0x04, 0xF7, 0xD0, 0x45, 0xFF, 0xEF, - 0xBB, 0x20, 0x01, 0x42, 0xD0, 0x7E, 0xC3, 0x13, 0xEF, 0xC8, - 0x0B, 0x8E, 0xBE, 0xF8, 0x1F, 0xFE, 0xDF, 0xCF, 0xBE, 0x13, - 0xD1, 0xFC, 0x0C, 0x61, 0xC2, 0x04, 0x40, 0x01, 0x00, 0x2F, - 0xFC, 0x0B, 0xDF, 0x00, 0x14, 0x61, 0x02, 0xE4, 0x0F, 0x81, - 0xF0, 0x3F, 0x81, 0xFC, 0x00, 0x82, 0xF4, 0x21, 0x7E, 0x0B, - 0xF0, 0x48, 0x00, 0x00, 0x3A, 0xE8, 0x5F, 0x05, 0x17, 0xF0, - 0xC0, 0x00, 0x61, 0x39, 0xF8, 0x4F, 0x81, 0xEB, 0x5F, 0x06, - 0x08, 0x2F, 0xC0, 0x04, 0x1F, 0xFF, 0x0B, 0xBF, 0xBA, 0x0B, - 0xFF, 0x40, 0x07, 0xCF, 0x42, 0x10, 0x1F, 0x3D, 0xDB, 0xC0, - 0x85, 0x03, 0xD1, 0xC0, 0x04, 0x0F, 0x7E, 0x03, 0xBF, 0x81, - 0xF7, 0xD0, 0x7D, 0xE8, 0x1E, 0x00, 0x00, 0x31, 0x46, 0x04, - 0x21, 0x40, 0xF3, 0xBF, 0x05, 0x03, 0xD1, 0x40, 0xFB, 0xEE, - 0xFD, 0x03, 0xF0, 0xBA, 0xE7, 0xFE, 0xBD, 0xE8, 0x6F, 0xBC, - 0x07, 0xEF, 0x82, 0x0C, 0x40, 0x3F, 0x00, 0x20, 0x80, 0x0F, - 0xB1, 0x42, 0xFC, 0x10, 0x3F, 0x07, 0xEF, 0xBF, 0xF0, 0x1E, - 0x82, 0xFC, 0x3F, 0x80, 0x1C, 0x50, 0xC3, 0x13, 0xD0, 0xFC, - 0xEF, 0xEF, 0x7C, 0x0C, 0x6F, 0xBF, 0x1B, 0x90, 0xFF, 0x00, - 0x70, 0xC5, 0x04, 0x00, 0x03, 0xEF, 0x8F, 0x80, 0xF8, 0x00, - 0x7F, 0x04, 0x01, 0x41, 0xE8, 0x21, 0x43, 0x08, 0x9F, 0x44, - 0xF7, 0xF2, 0x7C, 0x0F, 0xC0, 0x3E, 0xEC, 0x4F, 0xFF, 0x00, - 0x31, 0x3E, 0x13, 0xEE, 0x40, 0xFB, 0xE0, 0xFA, 0xEB, 0xD0, - 0xBF, 0x04, 0x0F, 0x46, 0xFF, 0xE2, 0x7D, 0x03, 0xDE, 0x81, - 0xF4, 0x2F, 0xBD, 0x08, 0x0F, 0x42, 0xEF, 0xA0, 0x40, 0xF8, - 0x01, 0x41, 0xF3, 0xD1, 0x00, 0x00, 0x01, 0x00, 0x13, 0xB0, - 0x7E, 0xE7, 0xE0, 0x7F, 0x08, 0x2F, 0x3E, 0x03, 0xD2, 0xC3, - 0x23, 0x9F, 0xFF, 0x17, 0xEE, 0xBB, 0xF0, 0x2E, 0xBE, 0xFC, - 0x2F, 0x3F, 0xF4, 0x00, 0x48, 0xE3, 0xDE, 0x7B, 0x0B, 0xFF, - 0xC4, 0x04, 0x01, 0x02, 0xFF, 0xB1, 0x84, 0x00, 0x7E, 0xC5, - 0x08, 0x11, 0xBE, 0xF7, 0x90, 0xC5, 0xEF, 0xDE, 0x09, 0x0B, - 0xD0, 0x86, 0xEC, 0x4F, 0xFC, 0x0B, 0xA1, 0x06, 0xEC, 0x50, - 0xC3, 0xFF, 0xA1, 0x3D, 0x20, 0x4F, 0xFF, 0x13, 0x8F, 0x45, - 0xF3, 0xF0, 0x83, 0x04, 0x06, 0x09, 0xE4, 0xEB, 0xFA, 0xFD, - 0xD6, 0x04, 0x2A, 0x25, 0x0F, 0xF3, 0xE6, 0x10, 0xFD, 0xEB, - 0x0C, 0x0B, 0x0C, 0xF3, 0x1F, 0x06, 0x21, 0xFF, 0x2E, 0xDD, - 0xFA, 0xF3, 0xF1, 0x21, 0xEE, 0x1B, 0x06, 0xC6, 0x05, 0x21, - 0xF7, 0x07, 0xE1, 0x01, 0x19, 0x0D, 0xEE, 0xE2, 0xD2, 0x0F, - 0xF9, 0xEE, 0xEC, 0x13, 0xF3, 0xE5, 0x1C, 0xF6, 0xF4, 0xE5, - 0x09, 0xF0, 0x32, 0x09, 0x0D, 0xD4, 0x17, 0x1F, 0xE4, 0xDA, - 0xF7, 0x08, 0xD9, 0xD6, 0x01, 0xED, 0x07, 0xDD, 0xE4, 0x1A, - 0x09, 0x34, 0xE0, 0xFE, 0x0D, 0xD4, 0xF8, 0x03, 0xF8, 0xF6, - 0xFB, 0x1C, 0xDF, 0x11, 0x1C, 0x08, 0x13, 0x0F, 0xE8, 0xF5, - 0xFA, 0x19, 0x06, 0xEF, 0xFC, 0x09, 0x1B, 0x22, 0xED, 0x02, - 0xE6, 0x09, 0x04, 0xD8, 0xF5, 0x10, 0x02, 0x24, 0x15, 0x26, - 0xEA, 0xFA, 0x1D, 0x15, 0x09, 0xFD, 0xD1, 0x02, 0x0D, 0xF5, - 0xF7, 0xF4, 0x1E, 0x40, 0x0E, 0xFD, 0xEE, 0x19, 0x15, 0xF2, - 0xE6, 0xE5, 0xF0, 0xFC, 0x03, 0x07, 0x03, 0xFE, 0xFC, 0x03, - 0x09, 0xE8, 0xEF, 0xF9, 0xEF, 0xED, 0x0A, 0x07, 0x0A, 0x02, - 0x08, 0xD0, 0xEE, 0x1D, 0xD3, 0xF0, 0xB2, 0xEA, 0x07, 0xFA, - 0x39, 0x13, 0x18, 0xF4, 0xEA, 0xF5, 0x0A, 0xE6, 0xE1, 0x1E, - 0x0B, 0x14, 0xF3, 0x26, 0xDA, 0xEA, 0x18, 0xE6, 0x10, 0x06, - 0xFF, 0xE9, 0x08, 0xE9, 0x10, 0xD0, 0xF7, 0x08, 0xEE, 0xEF, - 0x05, 0xEB, 0xF5, 0x10, 0xD5, 0x12, 0x1F, 0xDF, 0xFF, 0xF5, - 0x33, 0x05, 0x31, 0xFD, 0x19, 0xF8, 0xEE, 0x2B, 0x08, 0x01, - 0x17, 0x0A, 0xF6, 0x21, 0xF7, 0x11, 0x00, 0x23, 0xFF, 0x03, - 0xD7, 0xEF, 0x16, 0xF5, 0xED, 0x0A, 0xF7, 0x00, 0x00, 0xDD, - 0xF8, 0x07, 0x0A, 0xF0, 0xFB, 0xF1, 0xCC, 0x11, 0x1F, 0xFC, - 0xE1, 0x03, 0x46, 0x01, 0x06, 0x0C, 0xE7, 0x36, 0x05, 0xDC, - 0xD1, 0x0A, 0x43, 0x09, 0x04, 0xF6, 0xFE, 0x09, 0x1F, 0x06, - 0xEB, 0xE7, 0x08, 0xFD, 0xDA, 0x0D, 0x23, 0xC6, 0x13, 0x30, - 0x02, 0x23, 0x03, 0xED, 0xE1, 0x0B, 0x12, 0x27, 0x1E, 0x1B, - 0x01, 0xF5, 0xF5, 0xF4, 0xED, 0xDC, 0xF7, 0x14, 0xF1, 0x3E, - 0x2F, 0x18, 0x04, 0x22, 0x08, 0x03, 0x1F, 0x0E, 0x19, 0xEB, - 0x21, 0xDC, 0xCE, 0xD2, 0x23, 0x14, 0xE3, 0x16, 0xF7, 0x29, - 0x0A, 0x0F, 0x04, 0xF7, 0xEF, 0x15, 0xFA, 0x30, 0xE7, 0xD3, - 0x13, 0x05, 0x0E, 0x06, 0x04, 0x11, 0xF9, 0x2D, 0x1C, 0xEF, - 0x0F, 0x03, 0x05, 0xF4, 0x09, 0xE7, 0xE3, 0xFC, 0x04, 0xED, - 0x15, 0xF2, 0x2F, 0xF1, 0xF9, 0x1D, 0x08, 0x46, 0xED, 0xF1, - 0x0C, 0xF9, 0x38, 0xEF, 0xE6, 0xEB, 0xD1, 0xDE, 0x04, 0xFD, - 0x1B, 0xFB, 0x30, 0xE5, 0xCD, 0xF6, 0xDE, 0xEA, 0x09, 0x00, - 0xE8, 0x0C, 0x27, 0x01, 0xC1, 0x2A, 0x05, 0xF4, 0xED, 0x11, - 0xF9, 0xF7, 0xFD, 0x0A, 0xD6, 0xF8, 0x03, 0x0C, 0x05, 0x16, - 0xFB, 0x1F, 0xEC, 0x13, 0x07, 0xF3, 0x04, 0xC6, 0x1E, 0x0A, - 0x01, 0x0A, 0x09, 0xDE, 0x0D, 0xDC, 0xDF, 0xD8, 0x0E, 0x25, - 0xDF, 0xC3, 0xF4, 0x0C, 0xE9, 0xE5, 0xEC, 0xE9, 0xEE, 0xEC, - 0x23, 0xF2, 0xEE, 0x17, 0xF7, 0x1D, 0xE4, 0x0D, 0x0E, 0x0E, - 0x0A, 0xF5, 0xFF, 0x0B, 0x0F, 0xF3, 0xF1, 0x18, 0x08, 0xEB, - 0x03, 0x01, 0x1E, 0xF7, 0xF2, 0x0E, 0xDF, 0xF8, 0xD3, 0xCB, - 0xFB, 0xFE, 0xEF, 0xED, 0x17, 0x24, 0xD9, 0x06, 0xF5, 0xDD, - 0xFF, 0xEF, 0x1E, 0xE7, 0xC6, 0xFB, 0x03, 0x14, 0x12, 0x00, - 0x1E, 0x2B, 0x2B, 0xEB, 0x0E, 0x2D, 0xE9, 0x17, 0x13, 0x05, - 0x2F, 0x23, 0xF5, 0xF6, 0xEE, 0xF1, 0xD3, 0xE3, 0xFC, 0xEC, - 0xE4, 0xFE, 0xEA, 0xFC, 0x05, 0x2E, 0x0E, 0xF6, 0x0F, 0xE5, - 0xEF, 0x08, 0xEF, 0x01, 0xE1, 0x09, 0x00, 0x81, 0xF2, 0x10, - 0x17, 0x97, 0x32, 0xA5, 0x89, 0x54, 0x64, 0xC7, 0x47, 0x1C, - 0x52, 0xBC, 0xBF, 0xF6, 0x8A, 0x47, 0x0A, 0x87, 0x1E, 0x61, - 0x92, 0xEF, 0x56, 0x48, 0x88, 0x88, 0xAF, 0x14, 0x0B, 0x88, - 0xBD, 0x82, 0xB8, 0x32, 0x62, 0xF4, 0xD7, 0x40, 0xAD, 0xA6, - 0xE9, 0x1A, 0x03, 0x44, 0x60, 0x71, 0x58, 0xC3, 0x76, 0x2A, - 0x8F, 0x5B, 0x9F, 0x24, 0x8A, 0x92, 0x4E, 0xC4, 0x99, 0x3D, - 0x39, 0x8B, 0x25, 0xEB, 0xDA, 0x39, 0x91, 0x21, 0x70, 0x2B, - 0x77, 0x63, 0x1C, 0xA9, 0xD6, 0xD5, 0x30, 0x26, 0x10, 0xCF, - 0x1D, 0xD8, 0x32, 0xB2, 0xE8, 0x5C, 0x88, 0x04, 0x11, 0x9E, - 0x7A, 0xB4, 0x6E, 0xF2, 0x4D, 0x78, 0x3C, 0xF1, 0xA7, 0xA5, - 0xF3, 0x98, 0xAA, 0x8A, 0x08, 0xED, 0x17, 0xCA, 0xA1, 0x9E, - 0x6B, 0xC6, 0xEB, 0x4D, 0x47, 0x7B, 0x04, 0x41, 0x1B, 0x19, - 0x61, 0x19, 0x0F, 0xB5, 0xAF, 0x02, 0xE8, 0x8A, 0x43, 0xB8, - 0xF9, 0xA6, 0x43, 0x5A, 0xEA, 0x1B, 0x94, 0x8A, 0xD2, 0x71, - 0x2B, 0x2F, 0x6A, 0xBF, 0x26, 0x5E, 0x84, 0xAC, 0x4F, 0x03, - 0x40, 0x0C, 0x68, 0xA4, 0x36, 0xE3, 0xFD, 0x0B, 0xD0, 0x31, - 0xD9, 0x58, 0xD3, 0xC2, 0x76, 0xA2, 0x25, 0x69, 0x59, 0x00, - 0xA8, 0x43, 0x12, 0x85, 0x69, 0x16, 0x24, 0x50, 0x15, 0x74, - 0x1B, 0x02, 0xB9, 0xC0, 0x7B, 0x81, 0x64, 0x7E, 0x63, 0xB7, - 0x16, 0x68, 0x49, 0x92, 0x60, 0x7B, 0xC0, 0xC4, 0xFB, 0x9E, - 0x7E, 0x23, 0x87, 0x81, 0x48, 0xD4, 0x5F, 0xAD, 0xDA, 0xA7, - 0xA3, 0x5C, 0x6C, 0x4E, 0x60, 0x43, 0xB4, 0x48, 0x5B, 0xD1, - 0x3C, 0xE4, 0x5C, 0x5A, 0x8A, 0x85, 0xBC, 0x76, 0xEC, 0xA5, - 0x40, 0x1E, 0x02, 0xFE, 0x06, 0x8D, 0x60, 0xD6, 0x37, 0x82, - 0x47, 0x22, 0xA5, 0x18, 0xA6, 0x62, 0x44, 0x08, 0x0D, 0xE2, - 0x46, 0xA6, 0x6C, 0xCB, 0x8D, 0x9B, 0xD5, 0xFA, 0x31, 0x4C, - 0xCF, 0x74, 0x6D, 0xAA, 0x93, 0x21, 0xEB, 0xA4, 0xC9, 0xB2, - 0x95, 0xFE, 0x42, 0x28, 0xE7, 0x1A, 0x3A, 0xB9, 0xA8, 0x9B, - 0x6D, 0x59, 0xFC, 0x38, 0xA6, 0xC9, 0xC6, 0x5D, 0xEC, 0xF2, - 0x1D, 0xF0, 0x64, 0x86, 0x63, 0x19, 0x93, 0x57, 0x71, 0xCF, - 0x85, 0xA5, 0x27, 0x43, 0xB3, 0x81, 0xF2, 0x14, 0x17, 0x05, - 0x2E, 0x26, 0xE2, 0x4C, 0xF3, 0xCB, 0x42, 0xC7, 0x23, 0x91, - 0xF2, 0x51, 0x54, 0xDB, 0x95, 0x6B, 0x26, 0x3F, 0xF0, 0xF3, - 0x29, 0xDE, 0x64, 0x59, 0x10, 0x5A, 0x70, 0x81, 0x96, 0x0D, - 0xD6, 0xBD, 0x9B, 0xBA, 0x52, 0xE4, 0x47, 0xB4, 0xC5, 0x81, - 0x4F, 0xA3, 0x1C, 0x53, 0x29, 0xBE, 0xF0, 0x0A, 0x19, 0xA8, - 0x79, 0x5A, 0x08, 0x17, 0x9B, 0x1C, 0x54, 0x0C, 0xDD, 0x9F, - 0xB0, 0xFE, 0xA2, 0xBD, 0x7E, 0xD1, 0x44, 0xFA, 0x6A, 0x19, - 0x15, 0x9B, 0xCA, 0x77, 0x24, 0x8A, 0xC4, 0x6F, 0x02, 0xBC, - 0x2C, 0x07, 0x1C, 0x6A, 0x69, 0x89, 0x9D, 0x84, 0xE9, 0x14, - 0xE1, 0x8E, 0x49, 0xA0, 0x1D, 0x76, 0x9F, 0x54, 0x49, 0x5E, - 0x42, 0x90, 0x1A, 0xE4, 0x2B, 0xF0, 0x36, 0xF6, 0xB7, 0x38, - 0x9A, 0xD3, 0xBB, 0x08, 0xFA, 0x96, 0xC9, 0xE8, 0xEF, 0x7E, - 0x79, 0xE9, 0xDE, 0xA5, 0xA6, 0x97, 0x15, 0x9E, 0xEA, 0xB4, - 0x8B, 0xC8, 0xA1, 0xB7, 0x50, 0x78, 0x04, 0x00, 0xFC, 0x13, - 0xF0, 0x96, 0xCC, 0x45, 0xC8, 0x74, 0x2B, 0xCA, 0x98, 0x7E, - 0x6C, 0x91, 0x22, 0x0B, 0x49, 0x07, 0xB6, 0xE0, 0x44, 0xD8, - 0x44, 0x4A, 0x0E, 0x65, 0x3F, 0x45, 0x90, 0x95, 0x59, 0x72, - 0xCD, 0xB3, 0xE7, 0x56, 0x65, 0x23, 0xB0, 0x9D, 0x13, 0x66, - 0x13, 0xCC, 0xB9, 0x96, 0xB9, 0xAD, 0x2B, 0x15, 0x48, 0xB3, - 0x84, 0xC2, 0x9D, 0xC3, 0xC8, 0x8C, 0x41, 0x32, 0xBE, 0x1A, - 0x98, 0xAE, 0xD8, 0x66, 0x5B, 0xA6, 0x4A, 0xA8, 0x75, 0xCC, - 0x58, 0x63, 0x34, 0xD6, 0x23, 0xDF, 0xA3, 0x72, 0x07, 0xA2, - 0x7B, 0xD5, 0x81, 0x14, 0xDB, 0x56, 0xF4, 0x07, 0x22, 0x0E, - 0x2C, 0x03, 0x9A, 0xB8, 0x48, 0x58, 0xB2, 0xE8, 0x21, 0x55, - 0x14, 0x2A, 0xA3, 0x45, 0x89, 0xCD, 0x29, 0x76, 0x3F, 0x0A, - 0x54, 0x60, 0x06, 0x94, 0x82, 0x53, 0x49, 0x5C, 0x92, 0x2E, - 0x0E, 0x7C, 0x10, 0x97, 0x35, 0x25, 0x22, 0xA7, 0x28, 0x24, - 0x30, 0x68, 0x2F, 0x46, 0x78, 0xD6, 0x55, 0xCA, 0xE3, 0x88, - 0x56, 0x94, 0x78, 0x4D, 0x66, 0x26, 0xD7, 0x9F, 0x7A, 0x36, - 0x23, 0x77, 0x35, 0xB0, 0x00, 0x25, 0xB0, 0x41, 0x67, 0x82, - 0xCC, 0x61, 0x3D, 0x26, 0x46, 0xC7, 0xB6, 0x95, 0xA5, 0x1F, - 0x49, 0x13, 0xB9, 0x7A, 0x91, 0x82, 0x99, 0x06, 0xAE, 0x01, - 0x45, 0xAE, 0x53, 0x1B, 0xE6, 0x51, 0x34, 0x96, 0x81, 0x62, - 0x06, 0xA9, 0x0E, 0x46, 0xB8, 0x18, 0x1E, 0xAF, 0x24, 0x54, - 0x89, 0x80, 0xE3, 0xD2, 0x11, 0x8D, 0xB7, 0x80, 0x31, 0x21, - 0xEF, 0x81, 0x9D, 0x22, 0x08, 0xE5, 0x0E, 0x3E, 0x9A, 0x8C, - 0xA4, 0xBA, 0xAB, 0x1A, 0xC9, 0x75, 0xD1, 0x6B, 0x16, 0x37, - 0x5B, 0x36, 0x12, 0x34, 0x06, 0xA6, 0xD7, 0x4B, 0x82, 0x35, - 0xC9, 0x64, 0xC3, 0x66, 0x4E, 0x66, 0x0F, 0x62, 0xA5, 0x2B, - 0x71, 0x8A, 0x23, 0x0A, 0xD1, 0x06, 0x94, 0xE1, 0x44, 0x8E, - 0x59, 0x41, 0x41, 0x09, 0xC9, 0x4D, 0xB7, 0x1D, 0xEE, 0x2E, - 0xB7, 0x35, 0x01, 0x89, 0x6B, 0xF4, 0xE2, 0xB1, 0xE7, 0x94, - 0xD3, 0x30, 0x34, 0xB8, 0x36, 0xA4, 0x59, 0xBE, 0x0E, 0xC9, - 0x49, 0x34, 0x70, 0x55, 0xDB, 0x87, 0x46, 0x2F, 0x68, 0xED, - 0x59, 0xB3, 0x7F, 0x2E, 0x0B, 0x8B, 0x90, 0x1F, 0x51, 0x3D, - 0x3E, 0xC2, 0xB5, 0x13, 0xCE, 0xAE, 0x6C, 0x56, 0x0D, 0x4A, - 0xAB, 0x99, 0x8B, 0x89, 0xEC, 0xBE, 0xCA, 0x02, 0x47, 0x6C, - 0xA8, 0x31, 0xEC, 0x98, 0xAA, 0xC1, 0xE1, 0x36, 0x22, 0x2E, - 0x81, 0xB0, 0xA2, 0xD2, 0x27, 0x49, 0xCF, 0x60, 0x9E, 0x8C, - 0xC3, 0xA0, 0x6E, 0x98, 0x8A, 0xF7, 0x2C, 0x36, 0x3B, 0x7E, - 0x25, 0x90, 0xD6, 0xC2, 0x70, 0x0C, 0xF5, 0xEC, 0x07, 0xA5, - 0xAE, 0x55, 0x64, 0x04, 0x03, 0xC3, 0x80, 0x55, 0x3C, 0x37, - 0x3E, 0xD1, 0x83, 0x7C, 0x2F, 0x11, 0x4C, 0xDE, 0xB8, 0x44, - 0xCA, 0x0F, 0xBF, 0x7B, 0x82, 0x2B, 0xB5, 0xD3, 0x10, 0x66, - 0x86, 0x8E, 0x39, 0xF6, 0x33, 0x9D, 0x0D, 0x70, 0xB0, 0x02, - 0x50, 0xC5, 0x0F, 0x27, 0x35, 0x2C, 0xEF, 0x53, 0x4E, 0x13, - 0x58, 0xB8, 0xA8, 0xC0, 0x4A, 0x95, 0x61, 0xFB, 0x48, 0x05, - 0xCB, 0xC9, 0x40, 0xD2, 0x3A, 0xBE, 0xA9, 0xB7, 0x78, 0x76, - 0x9F, 0x1E + 0x30, 0x82, 0x08, 0x9A, 0x02, 0x01, 0x00, 0x30, 0x07, 0x06, + 0x05, 0x2B, 0xCE, 0x0F, 0x03, 0x0B, 0x04, 0x82, 0x05, 0x05, + 0x04, 0x82, 0x05, 0x01, 0x59, 0x14, 0x11, 0x40, 0x0B, 0xD0, + 0x7F, 0xEC, 0x2D, 0x85, 0xF4, 0x0F, 0x43, 0x18, 0x21, 0x3F, + 0x0C, 0x10, 0x3D, 0xF4, 0x1E, 0x82, 0x10, 0x40, 0x88, 0x13, + 0xCF, 0xC1, 0xF7, 0xF1, 0x40, 0x03, 0xF0, 0x01, 0x00, 0x1F, + 0xC3, 0x04, 0x01, 0x3D, 0xEB, 0x9F, 0x86, 0x23, 0xB0, 0xBE, + 0xF4, 0x10, 0x82, 0xF8, 0x63, 0x4B, 0x08, 0x50, 0xC6, 0x04, + 0x00, 0x39, 0xF8, 0x10, 0x7E, 0xDF, 0x8F, 0xBE, 0xEC, 0x5F, + 0xBE, 0x08, 0x3F, 0x7E, 0x00, 0x10, 0x7D, 0xEC, 0x1F, 0x01, + 0x03, 0xE0, 0x39, 0x03, 0xFF, 0xBF, 0x23, 0xD2, 0xC2, 0xEC, + 0x70, 0x3D, 0x07, 0xED, 0x85, 0xFB, 0xE0, 0xBF, 0x27, 0xAE, + 0xBB, 0x10, 0xA0, 0xC0, 0xEF, 0xFF, 0x7E, 0x04, 0x1F, 0xC0, + 0xFF, 0xAF, 0x84, 0x27, 0xE0, 0x3F, 0xFF, 0x7F, 0x83, 0xFC, + 0x0E, 0xC4, 0xF0, 0x00, 0x82, 0xE3, 0xC1, 0xBF, 0x0C, 0x1F, + 0xC8, 0x0B, 0xA0, 0x00, 0x0C, 0x2F, 0x46, 0x03, 0xEF, 0xC3, + 0xF7, 0xCF, 0x40, 0x14, 0x10, 0x01, 0xFC, 0x00, 0x00, 0xF3, + 0x6F, 0x40, 0x0B, 0x80, 0x7F, 0x08, 0x1F, 0x7F, 0x0B, 0xB0, + 0x3C, 0xEF, 0xE0, 0xC5, 0xFF, 0xE0, 0x3E, 0x0B, 0xC0, 0x43, + 0xF4, 0x00, 0x40, 0x18, 0x3E, 0x00, 0xFF, 0xE0, 0x02, 0xF7, + 0xDF, 0x02, 0xEB, 0x9F, 0x85, 0x00, 0x5F, 0x40, 0x00, 0x5F, + 0x3D, 0x0B, 0xF0, 0x05, 0xFF, 0xDD, 0x40, 0x14, 0x3F, 0xC5, + 0x03, 0xB1, 0x3F, 0x0B, 0x81, 0x41, 0x04, 0x6F, 0x03, 0xFC, + 0x2E, 0xFF, 0x03, 0xDE, 0x80, 0xF4, 0x01, 0x7C, 0x04, 0x20, + 0x41, 0x17, 0xDF, 0xFA, 0xF4, 0x0D, 0xC0, 0xFC, 0x11, 0xC1, + 0x18, 0x4E, 0xC2, 0xE8, 0x3F, 0x04, 0x00, 0x01, 0xBE, 0xEF, + 0xB1, 0x7C, 0x10, 0xA0, 0x00, 0x0F, 0xFF, 0xBC, 0x0C, 0x2E, + 0x00, 0xEC, 0x4F, 0x84, 0xFB, 0xFD, 0x85, 0xF0, 0x10, 0x7B, + 0x14, 0x10, 0xC5, 0x0B, 0xF0, 0xBE, 0xF8, 0x4F, 0xF7, 0x0B, + 0xF0, 0xFD, 0x1B, 0x6F, 0xC2, 0xEC, 0x20, 0x41, 0xE8, 0x6F, + 0xFF, 0xF4, 0x30, 0x3D, 0xEB, 0xDF, 0x7C, 0xF0, 0x20, 0x45, + 0x00, 0x20, 0xB7, 0x04, 0x50, 0xFB, 0xF8, 0x7F, 0xBF, 0xE3, + 0xEF, 0xC4, 0xFB, 0xE1, 0x83, 0x0F, 0xD0, 0x39, 0xF4, 0x60, + 0x02, 0xEB, 0xF1, 0xBE, 0x23, 0x9F, 0x89, 0x07, 0xE0, 0x7F, + 0xFC, 0x21, 0xC3, 0x04, 0x5E, 0xFC, 0xEC, 0x72, 0xC2, 0x00, + 0x0F, 0x40, 0xF4, 0x00, 0xFF, 0xF3, 0xAF, 0xBF, 0x0C, 0x3F, + 0x84, 0xE4, 0x20, 0x81, 0xF4, 0x10, 0x38, 0x0C, 0x20, 0xBD, + 0x17, 0xBF, 0x80, 0x03, 0xBE, 0xBF, 0xF3, 0xE0, 0x83, 0x0F, + 0xD0, 0x3A, 0xFB, 0xB0, 0x00, 0xFC, 0x51, 0x41, 0x0C, 0x30, + 0xC4, 0x13, 0xC0, 0x3F, 0xFC, 0x60, 0x7A, 0x07, 0xD0, 0x7E, + 0x00, 0x10, 0x41, 0x04, 0x7F, 0xFD, 0xF8, 0x1E, 0x84, 0x08, + 0x5F, 0x3B, 0x14, 0x3E, 0xFA, 0x0C, 0x5E, 0x81, 0xF8, 0x0E, + 0x45, 0xFC, 0x2E, 0x85, 0xFF, 0xCF, 0x02, 0x07, 0xF0, 0x40, + 0x1B, 0xB1, 0x86, 0x00, 0x3F, 0xFA, 0xF0, 0x60, 0xFE, 0xEB, + 0xD0, 0x01, 0xEF, 0xEF, 0x05, 0xEC, 0x0E, 0xC2, 0x10, 0x5E, + 0x83, 0xFF, 0xFF, 0x42, 0xF7, 0xE2, 0x3E, 0xF8, 0x20, 0x43, + 0x18, 0x60, 0x44, 0xE3, 0xDF, 0xF9, 0xF3, 0xDF, 0x85, 0x0F, + 0xFF, 0xBE, 0x03, 0xA0, 0x02, 0x1B, 0xFD, 0x7C, 0xF7, 0xEF, + 0x86, 0x08, 0x41, 0x7F, 0x0B, 0xD1, 0x04, 0x03, 0xAF, 0x87, + 0x13, 0xF0, 0x41, 0x07, 0x7E, 0x04, 0x07, 0xF1, 0xFC, 0xF7, + 0xDE, 0x80, 0xF3, 0xB0, 0xFF, 0xF3, 0xEE, 0x7F, 0x14, 0x50, + 0xBB, 0x0C, 0x8F, 0x05, 0xEF, 0xBE, 0xFE, 0x0C, 0x20, 0x3F, + 0xF7, 0xFE, 0x80, 0xD0, 0x32, 0x7B, 0xF7, 0xD0, 0xFD, 0xFB, + 0x7F, 0x49, 0xFB, 0xE1, 0x02, 0x2F, 0xC1, 0x3C, 0x00, 0x01, + 0x41, 0x18, 0x2F, 0x7F, 0xEC, 0x40, 0x7C, 0x07, 0xFF, 0x33, + 0xF8, 0x00, 0x02, 0x08, 0x1F, 0x86, 0xEF, 0xE1, 0x86, 0xF8, + 0x70, 0x7B, 0x00, 0x3F, 0x40, 0xF3, 0xFE, 0xCD, 0x03, 0xE2, + 0x02, 0xF7, 0xBF, 0xBF, 0x04, 0x8F, 0xBD, 0xE8, 0x60, 0xB5, + 0xDC, 0x31, 0x01, 0x1C, 0x4E, 0x42, 0x0C, 0x30, 0xBB, 0x14, + 0x0F, 0xC1, 0xFF, 0x7F, 0x82, 0x08, 0x0F, 0xFF, 0xFC, 0x3F, + 0xBF, 0xFF, 0xED, 0xC0, 0xF0, 0x3F, 0x7D, 0xF8, 0x5F, 0x82, + 0x0B, 0xDF, 0x06, 0xF0, 0x4F, 0x7E, 0xEF, 0xE2, 0xFD, 0x03, + 0xD0, 0x88, 0x0B, 0xDE, 0xC9, 0xDC, 0x21, 0x41, 0xEC, 0x71, + 0x03, 0xEB, 0xDF, 0xC2, 0x1F, 0xE1, 0xBE, 0xEB, 0xF0, 0x43, + 0xFF, 0xF1, 0x3D, 0x14, 0x7F, 0x82, 0x1C, 0x4F, 0xC2, 0x10, + 0x10, 0xC4, 0x00, 0x20, 0xC3, 0x07, 0xAF, 0xBD, 0xE0, 0x1F, + 0xC1, 0x04, 0x00, 0xBC, 0xE0, 0x3E, 0xC0, 0xFF, 0xDF, 0xFF, + 0x13, 0xEF, 0x81, 0xF8, 0x1E, 0xFC, 0x08, 0x2F, 0x7E, 0x17, + 0xFF, 0xC0, 0x1B, 0xD0, 0x41, 0xF8, 0x0F, 0xC3, 0x08, 0x10, + 0x00, 0x04, 0x0D, 0xFE, 0xF4, 0x30, 0xBC, 0x08, 0x41, 0x81, + 0x10, 0x20, 0xC7, 0xF3, 0xF0, 0x43, 0x04, 0x6D, 0xC2, 0xEF, + 0xCE, 0x42, 0xFB, 0xE0, 0x3D, 0x2C, 0x2F, 0xF9, 0x14, 0x41, + 0xFB, 0xF8, 0x21, 0x3D, 0xE7, 0xBF, 0x7C, 0x10, 0x51, 0x02, + 0x0F, 0xC0, 0x88, 0x00, 0x0F, 0x7F, 0xEC, 0x70, 0x44, 0x17, + 0xC0, 0xFF, 0x0F, 0xCF, 0x7E, 0xEC, 0x0F, 0x7C, 0x1B, 0xEE, + 0x00, 0x03, 0xDF, 0xBF, 0x04, 0x0F, 0xC0, 0x0C, 0x20, 0xC6, + 0x10, 0x00, 0x02, 0x03, 0xED, 0x47, 0x08, 0x2F, 0xC4, 0x1B, + 0xC0, 0x82, 0x14, 0x2F, 0xC3, 0xFB, 0xEF, 0xF9, 0x23, 0xC0, + 0x42, 0x07, 0xB0, 0x80, 0xE8, 0x31, 0xB5, 0xEB, 0xBD, 0xFA, + 0xF7, 0xB0, 0xC3, 0xC8, 0x3C, 0xDE, 0x37, 0x0C, 0xE4, 0xCE, + 0xEE, 0x07, 0x02, 0x10, 0x01, 0xFA, 0xFC, 0x42, 0x06, 0x20, + 0x0F, 0xE0, 0x05, 0x04, 0x20, 0xF5, 0xF7, 0x06, 0x18, 0xFC, + 0xF7, 0x36, 0xE0, 0xE9, 0xF9, 0xF9, 0xF2, 0xF5, 0x0E, 0x02, + 0xD9, 0xCA, 0x00, 0x0A, 0x27, 0xDD, 0x3F, 0x10, 0x0D, 0xFD, + 0x0A, 0x02, 0x0A, 0x2B, 0xDD, 0x07, 0xCD, 0xEC, 0x10, 0x15, + 0x22, 0xEC, 0x03, 0xFD, 0x1F, 0xE3, 0xCB, 0x11, 0x20, 0xC9, + 0xE4, 0xED, 0xFD, 0x27, 0xF2, 0x02, 0xCF, 0xDD, 0xFE, 0xFC, + 0xF2, 0xED, 0x14, 0x15, 0xF9, 0x11, 0xEA, 0x1D, 0x14, 0x07, + 0x05, 0x12, 0xED, 0xD0, 0x05, 0x29, 0xF5, 0x00, 0x08, 0x1D, + 0xF3, 0x06, 0xFE, 0xD4, 0xED, 0xF3, 0x1A, 0xF0, 0xFA, 0xEB, + 0x02, 0x03, 0x13, 0xCC, 0x04, 0x0D, 0x0C, 0x14, 0x07, 0x17, + 0xDA, 0xC1, 0xF1, 0x1E, 0x29, 0x1C, 0x33, 0x0F, 0x16, 0x18, + 0x09, 0x08, 0xD1, 0x0B, 0x00, 0xF9, 0x0C, 0xDC, 0xC1, 0x33, + 0x16, 0x02, 0xDA, 0x07, 0xF8, 0x03, 0x40, 0xFA, 0xFE, 0x0A, + 0xDF, 0x0A, 0xE5, 0xF7, 0x15, 0xE8, 0x0B, 0x01, 0x1E, 0x29, + 0x0D, 0x11, 0xF2, 0x07, 0x24, 0x11, 0x08, 0xEF, 0x0C, 0xDF, + 0x26, 0xEA, 0xF1, 0xE2, 0xF0, 0xEA, 0xD7, 0xEB, 0xE4, 0x04, + 0x01, 0x0A, 0x11, 0xC3, 0xE8, 0x25, 0xD8, 0x1A, 0xE1, 0xF6, + 0x17, 0xF9, 0x10, 0x09, 0x11, 0x2C, 0x1A, 0x13, 0xEA, 0x21, + 0x0D, 0x12, 0x18, 0x19, 0x0F, 0x17, 0xD4, 0x28, 0xBB, 0xE4, + 0xFE, 0xCC, 0xE5, 0xFF, 0x2B, 0x16, 0xFE, 0x00, 0x1E, 0xDE, + 0xDE, 0x10, 0xEE, 0x13, 0x1A, 0xF9, 0x0D, 0xD7, 0x33, 0x21, + 0x0C, 0x08, 0xEF, 0x21, 0x0D, 0xFD, 0x07, 0xFD, 0x23, 0x55, + 0xEF, 0xFA, 0x05, 0xF5, 0xFC, 0x18, 0xF3, 0xEE, 0x14, 0x01, + 0xF5, 0xE3, 0xF6, 0x14, 0x20, 0xFA, 0xC0, 0xE0, 0x0E, 0xE5, + 0x1D, 0x15, 0x1C, 0x06, 0xE4, 0x0C, 0xFC, 0x14, 0x0B, 0x0D, + 0xFA, 0xF8, 0x0E, 0x21, 0x0E, 0xF8, 0xD7, 0xE2, 0xDC, 0x14, + 0xEF, 0x04, 0x16, 0xED, 0x07, 0xEC, 0xF2, 0xEE, 0xEA, 0xEE, + 0x18, 0xEA, 0x05, 0xF4, 0x1F, 0xEC, 0x11, 0x0F, 0xF0, 0x14, + 0xF9, 0xFF, 0xEF, 0xFC, 0x10, 0x31, 0x08, 0x22, 0xF2, 0xF5, + 0xFF, 0xF9, 0xF8, 0x01, 0x1F, 0xF9, 0x0D, 0xD6, 0x2D, 0xE6, + 0xF1, 0x09, 0xD5, 0x05, 0xE8, 0x08, 0x0C, 0x04, 0xE9, 0x15, + 0x13, 0xD3, 0xF5, 0x1E, 0x04, 0x2F, 0x1C, 0x0D, 0x06, 0x36, + 0x01, 0x18, 0xEE, 0xF8, 0xE9, 0x30, 0x09, 0x31, 0x1B, 0x16, + 0x28, 0xE8, 0x0D, 0xCB, 0xF5, 0xDA, 0xF7, 0xF7, 0xEE, 0xF1, + 0x01, 0x15, 0xEE, 0x02, 0xDE, 0x28, 0x19, 0x07, 0x1D, 0xF5, + 0x12, 0xEE, 0x14, 0xF6, 0x0F, 0x06, 0xED, 0x0A, 0x02, 0xEF, + 0xFE, 0x09, 0x32, 0xD7, 0xF2, 0xDE, 0xFD, 0xF8, 0x05, 0xF6, + 0xCE, 0xCF, 0xEC, 0x12, 0x0E, 0x1F, 0xEC, 0x0E, 0x08, 0xDF, + 0xF3, 0xF1, 0xE5, 0x15, 0x0A, 0xFA, 0xD9, 0x0E, 0x0A, 0x06, + 0x0F, 0x10, 0xD6, 0x25, 0x0D, 0x15, 0xE0, 0x07, 0x23, 0x0E, + 0xDC, 0x10, 0xF4, 0xED, 0xFA, 0xDB, 0xD7, 0xEA, 0xFA, 0x0D, + 0x09, 0xC9, 0x08, 0x2D, 0x02, 0xFF, 0xF0, 0xD3, 0x34, 0xEB, + 0x17, 0xE3, 0xF2, 0xD3, 0x14, 0xF3, 0x1A, 0x04, 0x03, 0x04, + 0xE2, 0xDC, 0x04, 0x1E, 0xE9, 0xF4, 0xC9, 0xCF, 0xFF, 0xE1, + 0xE9, 0x22, 0x0F, 0x06, 0x1C, 0xF1, 0x09, 0xF2, 0xFA, 0x1D, + 0xEA, 0xDF, 0x0C, 0x12, 0xF8, 0x18, 0x16, 0x0F, 0x13, 0x31, + 0xE4, 0x1A, 0x26, 0x0A, 0xF4, 0xF6, 0xE8, 0x32, 0xE7, 0xF7, + 0x09, 0x08, 0xFD, 0xEE, 0xF8, 0xE1, 0xED, 0xE8, 0xDB, 0xD5, + 0x19, 0xFD, 0xFF, 0x05, 0x0D, 0xF6, 0x11, 0xDF, 0x10, 0xF4, + 0x2D, 0xE6, 0xFD, 0xE8, 0xF9, 0x81, 0x82, 0x03, 0x81, 0x09, + 0x41, 0xFE, 0xD2, 0xB3, 0x3C, 0x2A, 0x2D, 0x66, 0xAE, 0x99, + 0x04, 0x61, 0xA6, 0x17, 0x8B, 0xF1, 0x9C, 0x82, 0xCE, 0x81, + 0x40, 0x60, 0xED, 0x66, 0xD0, 0x3A, 0x89, 0xFC, 0xBB, 0x8A, + 0xFE, 0xF0, 0x29, 0x82, 0xB6, 0x19, 0x22, 0x07, 0xC7, 0x07, + 0xA9, 0xBF, 0xAE, 0xD0, 0x86, 0x00, 0xF4, 0x04, 0x37, 0x37, + 0x78, 0x6E, 0x06, 0x39, 0xA6, 0xC5, 0x31, 0xC1, 0xB0, 0x10, + 0xEE, 0xAC, 0x07, 0x21, 0x70, 0x2F, 0x62, 0xFC, 0xEA, 0x1B, + 0x9E, 0x74, 0x6D, 0x56, 0xDC, 0x89, 0x8C, 0x8F, 0xA4, 0x15, + 0x93, 0xC2, 0x53, 0x28, 0x3E, 0x6D, 0x42, 0x7B, 0x03, 0x5E, + 0x41, 0x30, 0xC2, 0x50, 0x2A, 0x78, 0x8A, 0x59, 0x19, 0x3D, + 0xEF, 0x92, 0xD0, 0x68, 0xDE, 0x41, 0x44, 0x19, 0xA1, 0xF1, + 0x51, 0x5E, 0x64, 0x69, 0x3B, 0x26, 0x71, 0xC5, 0x10, 0x29, + 0xC6, 0xA8, 0x02, 0x4A, 0x23, 0xB6, 0x67, 0x04, 0x62, 0x27, + 0x02, 0x5E, 0x51, 0x65, 0xF8, 0x6D, 0xF0, 0x89, 0x99, 0xCE, + 0x44, 0x58, 0x81, 0x58, 0x8A, 0x93, 0xA7, 0x73, 0xC6, 0x60, + 0xCB, 0xFA, 0x00, 0x3A, 0xB9, 0x91, 0x33, 0x8B, 0x55, 0x4E, + 0x23, 0xBB, 0xDD, 0x83, 0x54, 0x90, 0x47, 0x62, 0x7B, 0xC4, + 0x2A, 0xA4, 0x14, 0x87, 0x70, 0x39, 0xC4, 0xD3, 0xE1, 0x88, + 0x90, 0x1C, 0x04, 0x69, 0x7B, 0xCA, 0x52, 0x48, 0xF7, 0x4C, + 0xCE, 0xA4, 0x0B, 0x64, 0x8F, 0xB1, 0x42, 0x0E, 0x9D, 0x46, + 0xE0, 0x50, 0xD0, 0x1A, 0x38, 0x85, 0xE9, 0x3B, 0x09, 0x27, + 0x05, 0x9A, 0x01, 0x13, 0x49, 0x4F, 0x51, 0xAF, 0xB9, 0x1E, + 0x89, 0xD3, 0xA9, 0xB2, 0x3B, 0x1D, 0xDF, 0x56, 0x41, 0x10, + 0xE8, 0x47, 0x5D, 0x2D, 0xB2, 0x0C, 0x1B, 0xDB, 0xA2, 0xE0, + 0x71, 0x23, 0x5D, 0x12, 0xD7, 0x00, 0xBE, 0x84, 0xA8, 0x0A, + 0xD6, 0x6A, 0x40, 0x78, 0x0B, 0x96, 0xD2, 0x1C, 0x19, 0x7A, + 0x55, 0x78, 0x48, 0x94, 0x95, 0x5E, 0x74, 0x59, 0xA5, 0xD3, + 0xFC, 0x16, 0x72, 0x46, 0xB2, 0xA9, 0x9A, 0x85, 0x6D, 0xB0, + 0xB9, 0x80, 0x4A, 0xB0, 0xC6, 0x6C, 0xA2, 0x5F, 0x20, 0xE8, + 0x80, 0x25, 0x81, 0x37, 0xAC, 0xB8, 0xFA, 0xA3, 0x68, 0x06, + 0xEE, 0x16, 0xE0, 0x81, 0x21, 0x81, 0x1B, 0x86, 0xB8, 0x80, + 0x50, 0x62, 0x2D, 0xDC, 0x71, 0x5A, 0xB9, 0xD3, 0xCA, 0xA3, + 0xA1, 0xAE, 0x5F, 0xFA, 0x29, 0x5A, 0x7C, 0x81, 0xC2, 0x9C, + 0xBD, 0x76, 0x48, 0x0D, 0x67, 0xE4, 0x20, 0x75, 0x3E, 0x22, + 0xDC, 0x41, 0xB7, 0x8E, 0x99, 0x38, 0xF7, 0xDE, 0xAB, 0xB1, + 0x70, 0x3D, 0x44, 0xDA, 0x0F, 0xDC, 0xD1, 0x19, 0x35, 0xD8, + 0xF9, 0x38, 0x4F, 0xF9, 0x2F, 0x90, 0xDE, 0x15, 0xD9, 0xC2, + 0x4A, 0xA8, 0xE8, 0x26, 0x88, 0x2B, 0x9F, 0x6D, 0x0A, 0xAE, + 0x3A, 0xE4, 0x90, 0x4F, 0x61, 0x60, 0xC1, 0xA9, 0xF2, 0xBD, + 0x1B, 0xDC, 0xA2, 0xB4, 0x6C, 0x38, 0xE2, 0x65, 0x57, 0x1C, + 0xF5, 0xCB, 0xD1, 0xAF, 0x5E, 0xE8, 0x1A, 0x96, 0xBE, 0x03, + 0xB8, 0xE2, 0x30, 0x8B, 0xF9, 0x5B, 0xDA, 0x16, 0xD2, 0xFF, + 0x5A, 0xC9, 0xFD, 0x0B, 0x4A, 0xED, 0xD7, 0x25, 0x6C, 0x3B, + 0xC1, 0x45, 0xAE, 0xD7, 0xA5, 0xF6, 0x67, 0x11, 0xE9, 0xE6, + 0xD8, 0x49, 0xBC, 0xC2, 0x5A, 0x58, 0x22, 0xF4, 0xAD, 0x7A, + 0xB1, 0x75, 0x2D, 0xEF, 0x0B, 0x5D, 0xD1, 0x94, 0x32, 0x72, + 0x5A, 0x4A, 0x6C, 0x35, 0x98, 0xB5, 0xE1, 0x04, 0xAC, 0x91, + 0xE9, 0xD5, 0x3A, 0x70, 0xA5, 0xE1, 0x87, 0x86, 0x4A, 0x50, + 0xE2, 0x17, 0x88, 0x9F, 0x46, 0x69, 0x3B, 0xE0, 0x55, 0x45, + 0x4D, 0x10, 0x09, 0x9B, 0x40, 0x61, 0x0A, 0x6F, 0x70, 0x96, + 0x53, 0x89, 0xAF, 0x0A, 0x5B, 0x59, 0xB7, 0xD3, 0x9B, 0x58, + 0xA7, 0x45, 0x32, 0x51, 0x51, 0x03, 0xE4, 0xD0, 0x59, 0x38, + 0xE4, 0x34, 0x3F, 0x28, 0x52, 0xAC, 0x15, 0x98, 0x06, 0x70, + 0x99, 0xB0, 0x6A, 0x8A, 0x87, 0x70, 0x6A, 0xC0, 0x26, 0x1C, + 0xA1, 0x2A, 0x26, 0x7D, 0x1C, 0x82, 0x00, 0x8C, 0xEC, 0x5A, + 0x52, 0x08, 0xB7, 0x5D, 0x05, 0xBE, 0x37, 0x90, 0x59, 0x91, + 0x87, 0xE6, 0x5E, 0x52, 0xE8, 0x84, 0xAD, 0x27, 0xB8, 0xD2, + 0x70, 0x5C, 0x54, 0x2F, 0x5A, 0xC5, 0x2F, 0x37, 0x59, 0x14, + 0x34, 0x6D, 0x60, 0xCD, 0xF8, 0x79, 0x6F, 0x44, 0x1D, 0x2E, + 0x31, 0x64, 0x9E, 0x9B, 0xD4, 0x35, 0x74, 0x2C, 0xE6, 0x27, + 0xE2, 0x8B, 0x7E, 0xF6, 0x9A, 0xC8, 0xC5, 0x1B, 0x6A, 0x39, + 0x15, 0xFF, 0x53, 0x41, 0x8D, 0xB5, 0x32, 0x49, 0x7B, 0xEB, + 0xFC, 0x4A, 0xD6, 0x7C, 0x4E, 0x50, 0x13, 0xD9, 0xD6, 0xE4, + 0x0B, 0x3E, 0x07, 0x48, 0xDE, 0xA8, 0xB5, 0xA2, 0xED, 0x8D, + 0x82, 0xE8, 0x6F, 0x45, 0x92, 0x65, 0x46, 0xD0, 0xBB, 0x25, + 0x4C, 0x72, 0x8A, 0xB6, 0x70, 0x30, 0x11, 0x9C, 0x72, 0x2E, + 0xC6, 0xD8, 0xA3, 0xC3, 0xCF, 0xAB, 0x56, 0x39, 0x34, 0x56, + 0xA8, 0x10, 0x4E, 0xC2, 0x8A, 0x59, 0xD4, 0x5B, 0xF1, 0x55, + 0x90, 0x9D, 0xB7, 0x83, 0x94, 0xE6, 0x09, 0x88, 0x9E, 0x4A, + 0x23, 0x2F, 0x50, 0x94, 0xC0, 0x01, 0x34, 0xBF, 0x9A, 0xDF, + 0x63, 0x62, 0xDC, 0xF0, 0x22, 0x23, 0xE1, 0x57, 0x7C, 0x7E, + 0x95, 0xB6, 0xCE, 0x34, 0x10, 0xA4, 0xD7, 0x06, 0x29, 0x83, + 0x18, 0x5D, 0x68, 0x8A, 0x13, 0x70, 0xAB, 0x91, 0x28, 0xEA, + 0x24, 0x98, 0x9D, 0xAC, 0x68, 0xBD, 0x24, 0xC7, 0xE2, 0x0C, + 0xE1, 0xFA, 0x10, 0xA9, 0xF1, 0x38, 0x9E, 0xE1, 0xB2, 0x4F, + 0x8D, 0x20, 0xEB, 0x0A, 0x9A, 0x72, 0xB5, 0xA9, 0xA6, 0x99, + 0x7A, 0xD8, 0x1B, 0x3A, 0x2A, 0xA1, 0xAA, 0x88, 0x07, 0x72, + 0x42, 0xD2, 0x4B, 0x91, 0xAA, 0x48, 0x72, 0x47, 0x30, 0xEE, + 0x3A, 0x7A, 0xE9, 0x84, 0x25, 0xE4, 0x54, 0x0B, 0xF4, 0x65, + 0x11, 0x2A, 0x8C, 0xDC, 0xF3, 0x42, 0x5B, 0xCE, 0x75, 0x70, + 0xF6, 0xE9, 0x66, 0xA8, 0x18, 0xA3, 0xB6, 0x93, 0x41, 0x06, + 0x63, 0x08, 0x1A, 0x19, 0x4F, 0xC8, 0xE6, 0xDE, 0x02, 0x15, + 0xEC, 0xD2, 0xE7, 0x30, 0x95, 0x46, 0x03, 0x71, 0xFA, 0xE2, + 0xD5, 0x28, 0xE2, 0x01, 0xFE, 0x1C, 0xF0, 0x78, 0x9B, 0xBD, + 0x3D, 0x14, 0xEF, 0xA7, 0xF9, 0x0E, 0x3A, 0x8C, 0x81, 0x7A, + 0x18, 0x90, 0xDD, 0xC1, 0x53, 0x69, 0x78, 0x87, 0x64, 0x50, + 0xFA, 0xA2, 0x0E, 0xBB, 0xF2, 0xB8, 0xDC, 0x5A, 0xA6, 0x58, + 0x7A, 0xDB, 0xFF, 0x92, 0x91, 0x14, 0x45, 0xC2, 0xEA, 0x2E, + 0xDA, 0x45, 0x1C, 0xC5, 0xF8, 0x46, 0xF3, 0x20, 0xD4, 0x40, + 0xED, 0x07, 0xD9, 0xA7, 0x00, 0xF6 }; #define sizeof_bench_falcon_level1_key (sizeof(bench_falcon_level1_key)) /* certs/falcon/bench_falcon_level5_key.der */ static const unsigned char bench_falcon_level5_key[] = { - 0x30, 0x82, 0x10, 0x16, 0x02, 0x01, 0x00, 0x30, 0x07, 0x06, - 0x05, 0x2B, 0xCE, 0x0F, 0x03, 0x04, 0x04, 0x82, 0x10, 0x06, - 0x04, 0x82, 0x10, 0x02, 0x5A, 0xDF, 0x13, 0xB0, 0x70, 0x81, - 0x21, 0x02, 0x3D, 0x7F, 0xFF, 0xD0, 0x47, 0xFE, 0x0F, 0xC2, - 0xE6, 0xC5, 0xFF, 0x9F, 0xDB, 0xF0, 0x0D, 0xE0, 0xFC, 0x43, - 0x07, 0xFE, 0x01, 0x80, 0x20, 0x00, 0xC3, 0xD0, 0x74, 0x3F, - 0x07, 0x41, 0xFF, 0xF7, 0x81, 0xEF, 0xFF, 0xF1, 0x10, 0x04, - 0x10, 0x4C, 0x32, 0x7C, 0x42, 0x30, 0x08, 0x42, 0x70, 0x45, - 0xFF, 0x3F, 0xCF, 0x07, 0x60, 0x00, 0x82, 0x00, 0x84, 0x01, - 0x20, 0x04, 0x00, 0x7B, 0xC0, 0x18, 0x42, 0x11, 0x00, 0x22, - 0x17, 0x46, 0x00, 0x70, 0x43, 0xDF, 0x82, 0x10, 0x0B, 0xDA, - 0x17, 0x01, 0xE0, 0x0B, 0xFF, 0xF7, 0xBD, 0xE0, 0x7C, 0x1E, - 0xF7, 0x7E, 0x40, 0x78, 0x1E, 0x17, 0xC5, 0xD0, 0x18, 0x3D, - 0x19, 0x3E, 0x31, 0x68, 0x3F, 0xF8, 0x87, 0xCF, 0xF8, 0x9F, - 0x37, 0x7F, 0xE0, 0x7B, 0xC0, 0xF1, 0x40, 0x1F, 0x04, 0x5F, - 0x08, 0x42, 0x2E, 0x03, 0xA5, 0xD8, 0x06, 0x52, 0xF0, 0x24, - 0x00, 0x01, 0xEF, 0xE8, 0x42, 0xE9, 0xBD, 0xF2, 0x9B, 0xBA, - 0x16, 0xFD, 0xCF, 0x83, 0x81, 0x08, 0x3F, 0xFE, 0x88, 0x40, - 0x01, 0xB0, 0x12, 0x8B, 0xA1, 0x10, 0xBD, 0xF1, 0x7C, 0x1F, - 0x18, 0x47, 0xC0, 0x13, 0xC1, 0xF7, 0x84, 0x00, 0x03, 0x5F, - 0xF8, 0x46, 0x21, 0xF8, 0x1D, 0x17, 0x80, 0x0F, 0x8B, 0xC0, - 0x0E, 0xC3, 0xEE, 0x87, 0xBE, 0xF0, 0xF4, 0x01, 0xEC, 0x1D, - 0xF7, 0xC6, 0x11, 0xF8, 0x1B, 0x18, 0x7F, 0xCE, 0xFF, 0xBA, - 0x10, 0x46, 0x3E, 0xF3, 0xFE, 0x31, 0x3E, 0x40, 0xFB, 0x80, - 0x18, 0x43, 0xD0, 0x04, 0xFE, 0x00, 0x70, 0x0E, 0x08, 0x3F, - 0xF7, 0xFE, 0x0F, 0x70, 0x22, 0xE7, 0x86, 0x20, 0x94, 0x3F, - 0x10, 0xF6, 0x4F, 0x80, 0x00, 0x17, 0x86, 0x3F, 0x6F, 0x41, - 0xE8, 0x44, 0x0F, 0x8B, 0xE3, 0xF0, 0x82, 0x2E, 0xEC, 0x00, - 0x20, 0xFE, 0x00, 0x78, 0x1B, 0x27, 0xF8, 0x10, 0x8F, 0xBD, - 0x17, 0x78, 0x5F, 0xE0, 0x04, 0xF8, 0xC2, 0x0F, 0xFB, 0xFE, - 0xF9, 0xF5, 0xF0, 0x8F, 0xC2, 0x01, 0x3D, 0xD1, 0x77, 0x61, - 0x10, 0xC4, 0x41, 0x04, 0x9F, 0x0E, 0xC9, 0x9F, 0xFF, 0xC3, - 0xD8, 0x7A, 0x00, 0x07, 0x61, 0xF0, 0x04, 0x0F, 0x6F, 0x61, - 0xE7, 0x78, 0x1E, 0xFF, 0xDD, 0x31, 0x02, 0x00, 0x84, 0x40, - 0xFF, 0x42, 0x00, 0xF8, 0x02, 0x10, 0xFE, 0x71, 0x7C, 0x41, - 0x37, 0xC2, 0x22, 0x83, 0x9B, 0xEF, 0xFD, 0xFF, 0x78, 0x5E, - 0xF8, 0x05, 0xD0, 0x73, 0xE3, 0xFF, 0x3E, 0x5E, 0xFC, 0x21, - 0x1F, 0xBC, 0x00, 0x07, 0xC2, 0xF0, 0xC2, 0x3E, 0x07, 0xE0, - 0x08, 0x02, 0x10, 0xFC, 0x63, 0xF0, 0x05, 0xFF, 0xEF, 0x7D, - 0x07, 0x86, 0x02, 0x07, 0xE5, 0x08, 0x46, 0x42, 0x0B, 0xA1, - 0xE7, 0xFD, 0xEF, 0x6C, 0x42, 0xF0, 0x04, 0x00, 0x84, 0x60, - 0xF9, 0x84, 0x1F, 0x0F, 0x98, 0xD8, 0xBF, 0xEF, 0x77, 0xC2, - 0x08, 0x41, 0xF1, 0xFB, 0xE0, 0x17, 0x7B, 0xED, 0x78, 0x5C, - 0x10, 0x42, 0x2F, 0x83, 0xDE, 0x50, 0xB6, 0x22, 0x07, 0xE3, - 0x10, 0x45, 0xE0, 0x7F, 0xA1, 0xE9, 0x00, 0x11, 0x7B, 0xE1, - 0xD8, 0xC4, 0x4E, 0xFF, 0xFF, 0x17, 0xFC, 0x31, 0x1B, 0xA2, - 0xF8, 0x41, 0xDF, 0x10, 0x3F, 0xE8, 0x3F, 0xFF, 0x87, 0xC2, - 0x1F, 0x44, 0x20, 0x83, 0xBF, 0x17, 0x02, 0x20, 0x04, 0x3B, - 0xF8, 0x01, 0xC0, 0x83, 0xE2, 0x30, 0x40, 0x5F, 0x80, 0x23, - 0x07, 0x83, 0xC0, 0xF0, 0x60, 0x00, 0xC4, 0x10, 0x08, 0x9F, - 0xE8, 0xBA, 0x2F, 0xFF, 0xE3, 0x0E, 0x41, 0xA3, 0x7C, 0x62, - 0x17, 0x7C, 0x0F, 0xFB, 0xC0, 0x07, 0x7D, 0xD2, 0xEC, 0x82, - 0xFF, 0x49, 0xB0, 0x74, 0x9F, 0x07, 0xFC, 0x5F, 0x14, 0x7F, - 0x17, 0x3C, 0x42, 0x08, 0x5C, 0xD9, 0x36, 0x50, 0xFB, 0xC1, - 0x09, 0x80, 0x41, 0x93, 0xE6, 0xF8, 0xBC, 0x11, 0x0C, 0x05, - 0x0E, 0x83, 0xBF, 0xFB, 0x9C, 0xF8, 0x3E, 0x20, 0x7C, 0x3F, - 0x09, 0x3E, 0x01, 0x8B, 0xA1, 0xFF, 0xFC, 0x3F, 0x00, 0x24, - 0x17, 0x82, 0x23, 0x7C, 0x3D, 0xD7, 0x76, 0x1F, 0x0C, 0x3E, - 0x1F, 0xFE, 0x22, 0xFF, 0xFE, 0xE0, 0x82, 0x00, 0x97, 0xC3, - 0xE0, 0x45, 0xD1, 0x06, 0xC2, 0x17, 0xF7, 0xEE, 0x7B, 0xA8, - 0x00, 0x84, 0x3F, 0xFF, 0x81, 0xF0, 0xB0, 0x11, 0xF4, 0x00, - 0x16, 0xB8, 0x5F, 0x7B, 0xDD, 0xEF, 0xC0, 0x3F, 0x08, 0x02, - 0x0F, 0xD1, 0xF0, 0x94, 0x42, 0xF0, 0x0D, 0xC0, 0x7C, 0x21, - 0x0F, 0xC6, 0x01, 0x7C, 0x7E, 0x0F, 0x01, 0xD1, 0x01, 0x01, - 0x1F, 0x39, 0xE0, 0x83, 0xDF, 0x07, 0x7E, 0x1F, 0x0B, 0xFB, - 0x2F, 0xC7, 0xE3, 0x70, 0x63, 0x1F, 0xC6, 0x10, 0x7C, 0x5E, - 0x00, 0x3E, 0x02, 0x98, 0x41, 0xF7, 0x84, 0x0F, 0xF4, 0x01, - 0x07, 0x05, 0xF0, 0x23, 0xBE, 0xF0, 0x46, 0x30, 0x83, 0xE0, - 0x00, 0x79, 0xDF, 0x0C, 0xE3, 0x0F, 0x44, 0x00, 0xFF, 0xDF, - 0xE8, 0xC4, 0x14, 0x13, 0xBF, 0x08, 0x7D, 0x92, 0x03, 0xE0, - 0x20, 0x03, 0x91, 0x10, 0xA1, 0xF1, 0x01, 0xCE, 0x73, 0x84, - 0xF7, 0xBA, 0x23, 0x68, 0x3F, 0xF0, 0x7C, 0x2D, 0x03, 0xFF, - 0x07, 0xBE, 0x3F, 0x7F, 0xD9, 0x10, 0x03, 0xC1, 0x03, 0xC2, - 0xEA, 0x0A, 0x1E, 0x00, 0x03, 0xF8, 0x46, 0x3E, 0xF8, 0x02, - 0x18, 0x44, 0x3F, 0x00, 0xA0, 0xF7, 0x3C, 0x0D, 0x73, 0xFF, - 0xEE, 0xC0, 0x30, 0x10, 0x5F, 0xFF, 0xCA, 0x3E, 0xF3, 0xE1, - 0xE9, 0x02, 0x0D, 0x77, 0xDF, 0xF8, 0xBF, 0xCF, 0xFC, 0x62, - 0xE8, 0xBE, 0x40, 0xF4, 0x01, 0x0E, 0xF9, 0xE1, 0x7B, 0xC1, - 0x18, 0x7C, 0x3F, 0xF7, 0xE4, 0x10, 0xC2, 0x20, 0x88, 0x41, - 0x1F, 0x0F, 0xFF, 0x0C, 0x45, 0x10, 0xFF, 0xCF, 0x7B, 0xA0, - 0xFF, 0x4B, 0xF0, 0x78, 0x39, 0x07, 0x84, 0x2F, 0x04, 0xBC, - 0xE8, 0x04, 0x0F, 0x00, 0x3E, 0xFF, 0xC1, 0xCF, 0x93, 0xFC, - 0xF0, 0x33, 0xCE, 0x80, 0x21, 0x01, 0x4B, 0xD1, 0xF7, 0x9B, - 0xD8, 0x44, 0x00, 0x8F, 0xC3, 0x37, 0x38, 0x12, 0x7F, 0xA0, - 0x09, 0x00, 0x22, 0x00, 0x7E, 0xF8, 0x44, 0x5F, 0x17, 0xFE, - 0xF8, 0x7C, 0x1F, 0x88, 0x82, 0x17, 0x36, 0x0F, 0x0C, 0x24, - 0x08, 0x39, 0x80, 0x6F, 0xC1, 0x10, 0x44, 0x1F, 0x9B, 0xFE, - 0x27, 0x03, 0xF2, 0x04, 0xBF, 0xE0, 0xCC, 0x0E, 0xFB, 0xC4, - 0x00, 0x40, 0x50, 0x74, 0x23, 0x17, 0xBE, 0x0F, 0x7C, 0xDB, - 0xE9, 0x00, 0x41, 0x80, 0xBF, 0x20, 0xF8, 0x00, 0x87, 0xFE, - 0x08, 0x3F, 0xFF, 0x00, 0x21, 0x18, 0x83, 0x50, 0xF7, 0xC2, - 0x09, 0x81, 0xC2, 0x07, 0x9D, 0x27, 0x83, 0xD0, 0x04, 0x1C, - 0xE8, 0x06, 0x41, 0xFC, 0x44, 0xD9, 0x3F, 0xFF, 0x04, 0x41, - 0x29, 0x80, 0x0B, 0x7F, 0xC0, 0xF0, 0x7C, 0x00, 0x77, 0xA2, - 0x08, 0xB7, 0xE0, 0xF7, 0xDD, 0xF7, 0xC7, 0xF1, 0x6B, 0xE1, - 0x00, 0x09, 0xF4, 0xFB, 0xDD, 0xF6, 0xC9, 0xE2, 0x0B, 0xE1, - 0x00, 0xB9, 0xDD, 0x78, 0x41, 0x18, 0xFF, 0xE1, 0xFC, 0x3F, - 0xF7, 0xBF, 0xE0, 0x93, 0xBD, 0x28, 0x4D, 0xFF, 0xF8, 0x01, - 0x00, 0x09, 0xDE, 0x88, 0x24, 0xE8, 0x85, 0xD0, 0x7B, 0x80, - 0xFF, 0xC2, 0x10, 0xF0, 0x5D, 0xEF, 0x7F, 0xFE, 0xF4, 0x1F, - 0x0F, 0xC2, 0x10, 0x84, 0x3D, 0xD7, 0x7C, 0x20, 0x80, 0x17, - 0xE8, 0x85, 0xED, 0x8C, 0x03, 0xD7, 0x85, 0xDE, 0xF4, 0x9E, - 0x00, 0x80, 0x01, 0x08, 0x03, 0x08, 0x3D, 0xFE, 0x08, 0x3F, - 0xE8, 0x08, 0x31, 0x08, 0x02, 0x06, 0xFF, 0xFE, 0x8C, 0xC0, - 0xF8, 0x40, 0x00, 0x14, 0x60, 0x06, 0xC2, 0x2C, 0x88, 0x01, - 0x30, 0x34, 0x20, 0x94, 0x5D, 0x17, 0x7F, 0xBF, 0x9B, 0x62, - 0xDF, 0xBE, 0x4F, 0xF4, 0x21, 0xFF, 0xC2, 0x30, 0x88, 0xA1, - 0xEF, 0x40, 0x00, 0xFC, 0x43, 0xF8, 0x3B, 0xAF, 0x78, 0x01, - 0xF0, 0x45, 0xEC, 0x8B, 0xFE, 0x10, 0x3A, 0x2F, 0xF7, 0xFF, - 0x08, 0x00, 0x21, 0x17, 0xBD, 0x07, 0xC2, 0x0E, 0xFC, 0x45, - 0x3F, 0xC1, 0xEE, 0xFB, 0x3A, 0xF0, 0xC1, 0xD1, 0x84, 0x5A, - 0xE8, 0x09, 0xC1, 0x78, 0x00, 0x0E, 0xF4, 0x1E, 0x7F, 0x3C, - 0x18, 0xC1, 0xDE, 0x88, 0xA2, 0x0F, 0x84, 0x10, 0x04, 0x7A, - 0x17, 0xBF, 0xC1, 0x74, 0x26, 0x18, 0x81, 0xFF, 0x6C, 0x3B, - 0x0F, 0xCC, 0x2F, 0x80, 0x1F, 0xF0, 0x3E, 0x10, 0x88, 0xBD, - 0xFE, 0xC9, 0xB0, 0x03, 0xFE, 0xF8, 0x3E, 0x21, 0xFC, 0xC2, - 0x3F, 0x80, 0x00, 0x8F, 0xE0, 0x1F, 0x85, 0xCE, 0x8B, 0xC5, - 0x0F, 0x41, 0xB1, 0x7F, 0x83, 0x09, 0x02, 0x3E, 0xFC, 0x21, - 0xE8, 0x7E, 0x22, 0x07, 0xA1, 0x38, 0x3D, 0xF0, 0x80, 0x3C, - 0x10, 0x44, 0x20, 0x0F, 0xDF, 0x0F, 0x7A, 0x01, 0x88, 0x00, - 0x0F, 0xFA, 0x0E, 0x73, 0xDF, 0xF0, 0x83, 0xD2, 0x7C, 0xDF, - 0xEE, 0xCC, 0x00, 0xF4, 0x43, 0x00, 0x3F, 0xFF, 0x00, 0x3D, - 0xFE, 0x83, 0xA0, 0xFC, 0x43, 0x07, 0x81, 0xED, 0xFC, 0x01, - 0x20, 0x42, 0x2F, 0x87, 0xFE, 0xF7, 0x47, 0xB1, 0x1B, 0xDE, - 0x10, 0x08, 0x10, 0x78, 0xBD, 0xE9, 0xB9, 0xCE, 0x7C, 0x9D, - 0x00, 0x36, 0x1F, 0xEF, 0xDE, 0xF7, 0x87, 0xD0, 0x87, 0xC4, - 0x0E, 0xB6, 0x8D, 0x8B, 0xE1, 0xF8, 0xCD, 0xDF, 0x0B, 0x3D, - 0x0F, 0xCF, 0xEE, 0x80, 0x01, 0x01, 0x3D, 0xE0, 0xFC, 0x62, - 0x29, 0x41, 0xF0, 0x07, 0xFF, 0xFF, 0x46, 0x61, 0x80, 0x1D, - 0x27, 0xFE, 0x1F, 0xF4, 0x3B, 0x0F, 0xFF, 0xCF, 0x8B, 0xFE, - 0xE8, 0x84, 0x4F, 0x84, 0x24, 0x0F, 0x1D, 0xFB, 0xDA, 0xFE, - 0x0E, 0x16, 0x10, 0x03, 0x15, 0xE6, 0xE3, 0xF8, 0xFF, 0xD8, - 0x4B, 0xC8, 0xE5, 0xF4, 0x26, 0x03, 0xDB, 0x2A, 0xFD, 0x05, - 0xE1, 0xEF, 0x0B, 0xFC, 0x20, 0xFB, 0x31, 0x11, 0x1C, 0x03, - 0x15, 0xE1, 0xD6, 0x0B, 0xDC, 0xF5, 0x12, 0xED, 0xEA, 0x28, - 0x20, 0xE5, 0x21, 0xDC, 0xE7, 0xDF, 0x05, 0xDE, 0xF4, 0xFF, - 0x1F, 0xEF, 0x4A, 0xE6, 0x15, 0x0A, 0x07, 0x06, 0xF7, 0xE6, - 0xEE, 0xEC, 0x00, 0xF0, 0x03, 0xFF, 0xBB, 0x0D, 0xFB, 0x35, - 0xE3, 0xF5, 0xE6, 0xEA, 0x26, 0x00, 0x0E, 0x10, 0xFB, 0xDA, - 0x1B, 0xD1, 0xEF, 0x09, 0x02, 0x03, 0x16, 0x1F, 0x06, 0xDC, - 0xF8, 0x25, 0x17, 0xE9, 0xEA, 0x0F, 0xD5, 0x15, 0x0B, 0xE3, - 0x04, 0x20, 0xF5, 0x09, 0xE9, 0x1A, 0xE8, 0x0F, 0xEB, 0xE4, - 0xE9, 0x36, 0x03, 0xF5, 0xFF, 0x42, 0xFD, 0xE7, 0xFA, 0xF7, - 0xD2, 0x19, 0xCA, 0xE8, 0x22, 0x00, 0xEE, 0xDB, 0x00, 0xFE, - 0x18, 0x19, 0x14, 0x0C, 0x0A, 0xD0, 0x14, 0x21, 0x2E, 0xFD, - 0x36, 0xED, 0xAE, 0x1B, 0x00, 0x15, 0xF4, 0x13, 0xDC, 0x12, - 0xCB, 0x0A, 0xD4, 0xDD, 0x01, 0xCB, 0xED, 0xC2, 0xE5, 0xF2, - 0xD7, 0x02, 0xEF, 0xDB, 0x1D, 0x2F, 0xE2, 0x20, 0x3A, 0xE4, - 0x25, 0x1B, 0x14, 0x18, 0xF5, 0x04, 0x06, 0x18, 0x0D, 0x39, - 0xFC, 0x06, 0xF9, 0x0A, 0x20, 0xE1, 0xF7, 0x2E, 0xFB, 0xE3, - 0xF2, 0x21, 0xF9, 0xD3, 0x04, 0x07, 0xF9, 0x0B, 0xFC, 0xFA, - 0x27, 0x05, 0xF8, 0x2A, 0xFA, 0x0B, 0xFB, 0xEF, 0xB9, 0x08, - 0xFE, 0x0C, 0x14, 0x05, 0xE2, 0xFA, 0xFD, 0xC9, 0x0C, 0xF4, - 0x38, 0xCD, 0xFA, 0xD6, 0xE4, 0x05, 0x05, 0x1E, 0xF8, 0x3B, - 0x2E, 0x0E, 0x16, 0x07, 0x2C, 0x10, 0xF3, 0x1B, 0xF1, 0x00, - 0x08, 0xF0, 0xC7, 0x14, 0xD7, 0xDD, 0x06, 0xC2, 0xF3, 0xFD, - 0x10, 0x05, 0x18, 0x24, 0xE6, 0xDD, 0x0A, 0xDC, 0xDB, 0xEE, - 0xFE, 0xF6, 0xF9, 0x19, 0x40, 0x0B, 0x2B, 0x37, 0x28, 0xC7, - 0xFD, 0xF7, 0x07, 0xD5, 0x0C, 0x0C, 0x01, 0xDC, 0x2B, 0xD8, - 0xFD, 0x0C, 0xD1, 0xFC, 0x12, 0xE8, 0x02, 0xDC, 0x05, 0xDA, - 0xEB, 0x00, 0x1C, 0xDC, 0xFF, 0x07, 0xF8, 0x0F, 0xC8, 0x13, - 0x06, 0x08, 0x03, 0xEC, 0x11, 0xE8, 0xFD, 0xFD, 0xFF, 0x0D, - 0xF2, 0xD8, 0xF7, 0xFF, 0xFB, 0x11, 0xF4, 0xE2, 0xE9, 0x07, - 0xE7, 0xF6, 0xE9, 0x53, 0x13, 0x33, 0xEE, 0x1C, 0x15, 0x13, - 0x00, 0x24, 0xFC, 0xEA, 0x09, 0x15, 0xEC, 0x28, 0xF5, 0x1F, - 0xDB, 0xE3, 0xFC, 0x02, 0xF9, 0x0C, 0x0D, 0x26, 0x05, 0xF6, - 0x04, 0x02, 0xE4, 0x2F, 0x02, 0xF1, 0xE9, 0xE6, 0xEC, 0x03, - 0xEA, 0x16, 0xFA, 0x09, 0x13, 0xF6, 0x29, 0xE7, 0x13, 0xFB, - 0xF9, 0xDD, 0x03, 0xF7, 0xD4, 0x0B, 0xE7, 0xF2, 0x24, 0x2C, - 0x24, 0x35, 0x02, 0xFE, 0x21, 0xE9, 0x20, 0x01, 0x2A, 0x10, - 0x01, 0x1F, 0x03, 0x28, 0x2D, 0x20, 0xF8, 0x10, 0x0A, 0x09, - 0xF5, 0x32, 0xD5, 0xF6, 0xE4, 0x1F, 0xF8, 0xF4, 0xD8, 0xF4, - 0xD8, 0x0A, 0x07, 0x16, 0x0A, 0xFD, 0x14, 0xF8, 0x22, 0xDC, - 0x03, 0xDD, 0xFA, 0xEB, 0xD3, 0xE4, 0x0D, 0x04, 0xF6, 0x1D, - 0x1E, 0xDF, 0xF6, 0x28, 0x25, 0x17, 0x0B, 0xCF, 0xF1, 0x14, - 0xD9, 0x17, 0xEB, 0x34, 0xF7, 0xEC, 0xCE, 0x20, 0x1E, 0xD5, - 0x20, 0x07, 0xEB, 0xE8, 0x13, 0x04, 0x3D, 0x07, 0xF7, 0xF8, - 0xFE, 0xF6, 0xEA, 0xE9, 0xEE, 0xD7, 0xEE, 0xFC, 0xEA, 0xFA, - 0xFB, 0xDA, 0x33, 0x0F, 0xED, 0x0B, 0x2B, 0x00, 0x1A, 0xED, - 0x12, 0xF4, 0x0D, 0x15, 0x14, 0xFB, 0xF0, 0xF4, 0x0F, 0x0C, - 0xEC, 0x27, 0x11, 0x13, 0xF0, 0x0E, 0x2D, 0xE5, 0x00, 0xD2, - 0x0F, 0xD5, 0xF5, 0xFA, 0xF3, 0x03, 0x00, 0xDB, 0x17, 0xDD, - 0x2C, 0xE8, 0xFE, 0xE7, 0x46, 0xF6, 0xEF, 0xFD, 0x1F, 0xFF, - 0x0F, 0xEF, 0xE7, 0xEE, 0x18, 0x02, 0x27, 0x2B, 0xFC, 0x2D, - 0xF6, 0x13, 0xFC, 0xFD, 0xBB, 0xF8, 0xEE, 0xDD, 0x12, 0x0D, - 0x01, 0x22, 0x2F, 0xF0, 0xF1, 0x1B, 0x0C, 0x09, 0xE7, 0x33, - 0xE5, 0xFF, 0xFA, 0xFC, 0x1E, 0x15, 0x08, 0xF2, 0xDA, 0xE3, - 0xF4, 0xEA, 0xEF, 0x29, 0x3A, 0x02, 0x0B, 0x1E, 0xF4, 0x46, - 0xC5, 0x1C, 0xBD, 0xFC, 0xE5, 0x05, 0x0E, 0x24, 0xF9, 0xDE, - 0xD6, 0x1B, 0x05, 0xFF, 0xD3, 0xF3, 0xF2, 0x0D, 0xF0, 0x03, - 0xF5, 0x19, 0xFE, 0xDB, 0x0B, 0x00, 0x02, 0xC5, 0x12, 0x04, - 0xED, 0x1A, 0xF0, 0x12, 0x1C, 0x28, 0x1F, 0xEF, 0xDD, 0xCB, - 0xFC, 0x02, 0xF2, 0xED, 0xD1, 0xEC, 0xE5, 0xCC, 0xFE, 0xF6, - 0x03, 0xEE, 0xDF, 0x3F, 0x0F, 0xFD, 0x04, 0x05, 0x32, 0x11, - 0x1C, 0xF2, 0xF0, 0x1E, 0x07, 0xEF, 0x07, 0x1E, 0x17, 0x15, - 0x04, 0x01, 0x03, 0xF7, 0xFA, 0x02, 0xD9, 0xEB, 0x19, 0xCD, - 0xEA, 0x2B, 0x22, 0xFD, 0xD7, 0x08, 0xF0, 0xF4, 0xF4, 0xF1, - 0x44, 0x09, 0xE5, 0x0B, 0xFE, 0xEE, 0x1F, 0x1A, 0xED, 0xFF, - 0xFB, 0x07, 0xFD, 0xF6, 0x1E, 0x1D, 0x02, 0xFF, 0xDA, 0x01, - 0x1E, 0xEE, 0x04, 0xD2, 0xDF, 0xDA, 0x0D, 0xFC, 0xFA, 0xF9, - 0xFE, 0x12, 0x0B, 0x42, 0x26, 0x0E, 0x00, 0xD9, 0xEF, 0x17, - 0x02, 0xD3, 0x1B, 0x03, 0xEB, 0xDE, 0x0C, 0x11, 0xFF, 0x0E, - 0x1D, 0xCD, 0xF9, 0xEF, 0x12, 0x0E, 0x0F, 0x03, 0xF7, 0x21, - 0x16, 0x1F, 0x11, 0xD9, 0x02, 0x01, 0xE4, 0x0D, 0xDB, 0x2D, - 0xD6, 0x16, 0xE0, 0xEE, 0x1D, 0xF7, 0xFA, 0xE8, 0x10, 0xF3, - 0x39, 0xF0, 0xEA, 0xEC, 0x2D, 0xCE, 0x22, 0xCE, 0x2C, 0xF8, - 0x1F, 0xEA, 0xFC, 0xD9, 0x28, 0x14, 0xFC, 0x22, 0x15, 0xE4, - 0xCF, 0x19, 0xFD, 0xE0, 0xEC, 0xEE, 0xFC, 0xEE, 0x0F, 0xE4, - 0x03, 0xF8, 0xDF, 0xF3, 0x12, 0xF3, 0xF1, 0xED, 0xEB, 0x14, - 0xD4, 0x4E, 0x0B, 0x25, 0xC8, 0x14, 0x01, 0x10, 0xFA, 0x18, - 0x12, 0x13, 0x0A, 0xE0, 0xED, 0xD7, 0x01, 0xD5, 0xF6, 0xDD, - 0xBC, 0x0C, 0xD9, 0xFC, 0xE1, 0x07, 0x06, 0xEE, 0xBD, 0x1F, - 0xEC, 0x1A, 0x22, 0x04, 0xFC, 0x18, 0xF2, 0xEA, 0x01, 0x0B, - 0xF6, 0xFA, 0x13, 0x26, 0x09, 0x07, 0xEC, 0x0B, 0x08, 0x0F, - 0xFE, 0x0E, 0xD2, 0x15, 0xB3, 0xE0, 0xD8, 0x34, 0xE3, 0xEC, - 0xF6, 0x21, 0xEB, 0x13, 0x01, 0xF3, 0x0B, 0x02, 0x07, 0xF7, - 0x0D, 0xF6, 0x2F, 0x22, 0xFE, 0x21, 0x1F, 0xE7, 0xFA, 0xFF, - 0x0F, 0x03, 0xFD, 0xE5, 0xE3, 0x0F, 0xF5, 0x08, 0xF6, 0xFF, - 0x02, 0x30, 0xE0, 0x21, 0xEC, 0x21, 0x3A, 0xF6, 0x1F, 0xF4, - 0x01, 0xCC, 0x0D, 0xD7, 0x1B, 0x24, 0x1F, 0x0F, 0x0D, 0xFB, - 0xFC, 0x16, 0x13, 0x1C, 0xE0, 0xEC, 0xED, 0xE9, 0x07, 0xE0, - 0xFC, 0xF1, 0xDB, 0x07, 0x23, 0xF9, 0x10, 0x08, 0xE4, 0xF7, - 0xF4, 0xEC, 0xCD, 0xE0, 0xF9, 0xCD, 0xF3, 0x13, 0x02, 0x05, - 0x0C, 0xF8, 0xFA, 0xFF, 0x14, 0xE3, 0x01, 0xEA, 0xFB, 0x04, - 0x2C, 0xF5, 0xF3, 0x10, 0x19, 0xE7, 0x03, 0xDC, 0x2A, 0xFB, - 0x06, 0x0B, 0x05, 0x3D, 0xE8, 0xD4, 0x2F, 0xFD, 0xDE, 0x14, - 0x19, 0xD5, 0xEE, 0xFA, 0x0D, 0x06, 0x0B, 0x41, 0x1F, 0xDA, - 0x0E, 0x1C, 0xF5, 0xEF, 0x36, 0x0A, 0x1E, 0x0F, 0x07, 0x0D, - 0x19, 0x03, 0xDA, 0xE2, 0x12, 0x1C, 0xEA, 0xF7, 0x13, 0xCE, - 0x27, 0x18, 0xD2, 0x04, 0xD5, 0xFB, 0xFD, 0xD7, 0xDF, 0xEB, - 0x1B, 0xFC, 0xFD, 0x16, 0xEB, 0x1B, 0xF1, 0xDD, 0x34, 0xD7, - 0x3D, 0x00, 0x24, 0x04, 0x19, 0xF5, 0x0E, 0x14, 0x1F, 0x06, - 0xE4, 0xEF, 0xCF, 0x17, 0xE2, 0x0D, 0x17, 0x06, 0xF7, 0x0A, - 0x21, 0xAA, 0xC5, 0xB8, 0x1B, 0x6C, 0xEB, 0x28, 0x70, 0x4A, - 0x9A, 0x80, 0x17, 0xDD, 0x39, 0xB2, 0xDA, 0x07, 0x9E, 0xC3, - 0xD2, 0x6C, 0xF1, 0x0F, 0x42, 0xB7, 0x48, 0xC4, 0x1A, 0x01, - 0xAD, 0x83, 0x05, 0x4D, 0x8A, 0x4D, 0x56, 0xBC, 0x10, 0x38, - 0x11, 0xD8, 0x6A, 0x34, 0x02, 0xF4, 0x8F, 0x86, 0x64, 0x70, - 0x92, 0xB7, 0xD5, 0xF5, 0xAD, 0x9B, 0x0A, 0x76, 0x8B, 0x42, - 0x39, 0xA0, 0x3B, 0x5F, 0xBA, 0x46, 0x27, 0xF3, 0x4C, 0xC7, - 0x7F, 0x78, 0xB5, 0xE3, 0xC2, 0x95, 0x67, 0x32, 0x3C, 0x28, - 0x88, 0x2A, 0xEE, 0x4F, 0x9E, 0xC2, 0xEC, 0xF5, 0xD7, 0xE2, - 0xA1, 0x4D, 0x9C, 0xB1, 0xC3, 0x64, 0x21, 0xD2, 0x19, 0xD8, - 0xA6, 0x33, 0x95, 0xC0, 0xD8, 0x07, 0x82, 0xC7, 0xB3, 0xC4, - 0x25, 0xCC, 0x24, 0xE8, 0xB7, 0xD2, 0xBA, 0x6F, 0x2B, 0x79, - 0x08, 0xF0, 0xF0, 0x47, 0x65, 0xEF, 0x46, 0x65, 0x46, 0xB9, - 0xD7, 0x0E, 0xC5, 0x52, 0x5C, 0x75, 0x5B, 0xDB, 0xA8, 0x39, - 0x99, 0x4A, 0xA8, 0x47, 0x08, 0xC9, 0xA8, 0x9F, 0x40, 0x1A, - 0x67, 0xFB, 0x46, 0x48, 0xB3, 0x82, 0x11, 0xF2, 0x66, 0xA2, - 0xF6, 0xBB, 0xCC, 0xC2, 0x08, 0xFA, 0xAF, 0x1F, 0x36, 0x10, - 0x9C, 0xF5, 0x5F, 0x6D, 0x54, 0x27, 0xB9, 0x80, 0x88, 0xF8, - 0x50, 0x5F, 0x90, 0x05, 0xC1, 0x94, 0xCA, 0xED, 0xAE, 0x59, - 0xE8, 0x76, 0x1A, 0x16, 0xDA, 0x88, 0xAA, 0x4D, 0xEA, 0xD5, - 0xB6, 0xD3, 0xA1, 0x13, 0x5C, 0xA2, 0x1A, 0x46, 0x47, 0xFC, - 0xB5, 0x4A, 0x47, 0x04, 0xD4, 0xEF, 0xBF, 0xBF, 0x61, 0xAC, - 0x91, 0x05, 0x59, 0xF6, 0x91, 0x3D, 0x98, 0x90, 0xEB, 0x1E, - 0x9A, 0x9D, 0x42, 0x9A, 0xD4, 0x10, 0x21, 0x61, 0x12, 0x66, - 0xE4, 0xDB, 0xC6, 0x06, 0x52, 0x77, 0x91, 0xA7, 0x01, 0x09, - 0x94, 0x92, 0x5D, 0xB5, 0x3C, 0x29, 0xA5, 0x4D, 0xEE, 0xBD, - 0xA6, 0xC8, 0xC7, 0x81, 0x8B, 0x93, 0x64, 0x6C, 0xD6, 0xA8, - 0xAC, 0x18, 0x3C, 0x5B, 0x48, 0x69, 0x77, 0xA9, 0x2E, 0x65, - 0xA2, 0xE6, 0x26, 0x73, 0xF7, 0x8A, 0x9E, 0x31, 0x56, 0xD6, - 0xE6, 0x2F, 0xCD, 0xDD, 0xBF, 0xF2, 0x31, 0xC6, 0x87, 0x2F, - 0xE6, 0x2C, 0x68, 0x4F, 0x79, 0xE4, 0xC2, 0x0A, 0x48, 0xFC, - 0x4D, 0xF4, 0xF8, 0x40, 0x85, 0x9C, 0xE1, 0x4C, 0x47, 0x4D, - 0x16, 0x88, 0xB5, 0xCA, 0x51, 0xBB, 0x6B, 0x12, 0x50, 0x37, - 0x6E, 0xBA, 0x06, 0x10, 0x0E, 0x5A, 0x9F, 0x9C, 0xB5, 0x0B, - 0x32, 0x81, 0x96, 0x1F, 0xC1, 0x24, 0xE8, 0x85, 0x6E, 0x3F, - 0xB9, 0xD8, 0xE4, 0x69, 0x30, 0x1A, 0xF3, 0x12, 0x98, 0x32, - 0xF2, 0xB8, 0x5F, 0xA1, 0xB4, 0x71, 0x0B, 0x19, 0x09, 0x22, - 0xD5, 0x84, 0x1A, 0x49, 0xE7, 0x10, 0x07, 0xDF, 0x68, 0x8D, - 0xFB, 0x02, 0xB0, 0x9E, 0xF4, 0x06, 0x36, 0x8C, 0x81, 0x70, - 0xD6, 0x5D, 0x31, 0x98, 0x5E, 0xC2, 0xF4, 0x5B, 0xDC, 0xA3, - 0x38, 0x7F, 0x82, 0x58, 0x48, 0x50, 0x51, 0x24, 0x2C, 0x80, - 0xE0, 0x1A, 0xAA, 0x8C, 0xDC, 0x4F, 0xD0, 0x21, 0x14, 0x6A, - 0xBD, 0x2C, 0x5D, 0x51, 0xFA, 0x94, 0x18, 0x89, 0x5C, 0x69, - 0xD9, 0xB5, 0x23, 0xCB, 0x00, 0x1C, 0x67, 0x27, 0x58, 0x62, - 0xE3, 0xB3, 0xD5, 0x6A, 0x57, 0xE8, 0x6C, 0x18, 0x60, 0xCA, - 0x20, 0x14, 0x3E, 0xA2, 0x76, 0xA6, 0xBC, 0xE9, 0x83, 0x3A, - 0x20, 0x2E, 0x61, 0x5E, 0xAB, 0x20, 0x1F, 0x0A, 0x32, 0x35, - 0x8E, 0x3B, 0x30, 0x4C, 0xEA, 0x74, 0xB8, 0x72, 0xC5, 0x95, - 0xD9, 0x4A, 0x36, 0xA0, 0x0D, 0xA1, 0x91, 0x64, 0x89, 0x21, - 0x73, 0xC8, 0x8D, 0x08, 0x0F, 0x12, 0xED, 0x85, 0x81, 0xAE, - 0xA1, 0xB8, 0x8B, 0xBF, 0x12, 0xDA, 0x30, 0xBB, 0x68, 0xA7, - 0xFA, 0xB7, 0xA8, 0x68, 0xC5, 0x97, 0xA2, 0xAD, 0x02, 0x01, - 0xE8, 0x11, 0x16, 0x51, 0xF9, 0x3A, 0x39, 0xE4, 0x56, 0x43, - 0x5D, 0xC9, 0xA7, 0x01, 0xB2, 0x14, 0x78, 0x85, 0x0B, 0x75, - 0x1D, 0x9A, 0x68, 0x0A, 0x9C, 0x77, 0x4A, 0xC0, 0xDD, 0xE4, - 0xB4, 0xDE, 0x46, 0x41, 0x8E, 0x00, 0x91, 0xF4, 0xC6, 0xDA, - 0xB9, 0xA1, 0x15, 0x64, 0xBC, 0x5A, 0x57, 0x82, 0xDA, 0xF3, - 0xB8, 0xEE, 0xDE, 0x69, 0x25, 0x30, 0x84, 0xE8, 0xFF, 0x5E, - 0xF2, 0x26, 0xF0, 0x41, 0x02, 0xE9, 0xAA, 0xA7, 0xA1, 0xA8, - 0x88, 0x6A, 0xC8, 0x6D, 0x06, 0x3E, 0x86, 0x6B, 0xA9, 0x39, - 0x28, 0x40, 0x55, 0xE4, 0xA9, 0x11, 0xDF, 0xE5, 0xB9, 0x98, - 0x2D, 0xF2, 0x36, 0x5E, 0xAC, 0x58, 0x54, 0x3A, 0x7C, 0xEA, - 0x77, 0x97, 0x00, 0x66, 0xD2, 0x9B, 0x53, 0x73, 0x4C, 0xC1, - 0x1F, 0xAC, 0xEE, 0x90, 0x6B, 0xC8, 0xE0, 0xBC, 0x9E, 0x7C, - 0xC1, 0x88, 0x1C, 0x90, 0x12, 0x55, 0xE5, 0x17, 0x14, 0xC0, - 0xBF, 0x2C, 0x31, 0xCC, 0x74, 0xEF, 0x50, 0xF3, 0xAA, 0xE4, - 0x91, 0x15, 0xE6, 0x68, 0x2A, 0x86, 0xE4, 0x39, 0x73, 0x11, - 0x93, 0x46, 0x41, 0x22, 0x4B, 0xDB, 0xA7, 0x84, 0x91, 0x6F, - 0x68, 0x8C, 0x05, 0x08, 0x69, 0xE3, 0x4F, 0x95, 0x5F, 0x3A, - 0x1A, 0xDA, 0x34, 0x4C, 0x44, 0x75, 0x1B, 0x5C, 0x09, 0xEB, - 0x2B, 0x6E, 0x9F, 0x18, 0x18, 0x2C, 0x3C, 0x87, 0x7C, 0xA8, - 0xEA, 0x7F, 0x4A, 0xB9, 0xB6, 0x6E, 0x67, 0x49, 0xCA, 0xA1, - 0x00, 0x77, 0xA6, 0x33, 0xE5, 0x2C, 0xC6, 0xED, 0x66, 0xF4, - 0x4E, 0xF4, 0x1F, 0xEB, 0xFD, 0x62, 0x5C, 0xAF, 0x10, 0x3D, - 0x8E, 0x2B, 0xAE, 0xF9, 0x46, 0xB6, 0xF6, 0x98, 0x35, 0x77, - 0xD0, 0x9C, 0x0A, 0xA9, 0x2C, 0xD7, 0x6F, 0x46, 0x42, 0x45, - 0x8B, 0xDF, 0xF7, 0x0A, 0x2C, 0xE6, 0x41, 0xC3, 0xEA, 0xAC, - 0x06, 0x30, 0xDA, 0xC9, 0xE7, 0x22, 0x29, 0x0B, 0x2C, 0x70, - 0x49, 0x5B, 0x05, 0x29, 0x48, 0x14, 0x32, 0xE6, 0x75, 0x6E, - 0x81, 0x35, 0xE4, 0xA0, 0xE2, 0x4C, 0x1E, 0x53, 0xB7, 0x36, - 0x19, 0xC1, 0xEF, 0x44, 0xE1, 0x2A, 0x49, 0xC8, 0x0B, 0xC0, - 0x43, 0xF6, 0x77, 0x54, 0xD6, 0x80, 0xE0, 0xE5, 0x23, 0x64, - 0x4A, 0xF0, 0x18, 0xBF, 0x91, 0x14, 0x71, 0x9A, 0x03, 0x77, - 0xF5, 0x52, 0x4E, 0xA0, 0xDC, 0xAB, 0x64, 0x7C, 0xD0, 0xE5, - 0x1D, 0x92, 0x4A, 0xDB, 0xE8, 0xD3, 0xF4, 0x01, 0xE0, 0xE6, - 0x1B, 0x77, 0x8D, 0x6B, 0x8F, 0xD2, 0x93, 0x0A, 0xE3, 0x5D, - 0x60, 0x1C, 0x19, 0xD5, 0xA8, 0x9B, 0xDE, 0x0F, 0x2C, 0xB2, - 0xF5, 0x2B, 0x3C, 0x1E, 0x50, 0x42, 0xB4, 0x54, 0xC9, 0x28, - 0xE4, 0x2F, 0x3D, 0xD0, 0x6B, 0x24, 0x13, 0x1B, 0xED, 0x85, - 0xA2, 0x0C, 0x95, 0x50, 0xD8, 0x5F, 0x73, 0x96, 0xA1, 0x64, - 0xEF, 0xA6, 0xE8, 0x65, 0x55, 0xF8, 0xA4, 0xF9, 0x54, 0x24, - 0x76, 0x05, 0xD7, 0xE5, 0x35, 0x98, 0xCD, 0x34, 0xE1, 0xF0, - 0x36, 0x27, 0x8C, 0x16, 0x1B, 0xB6, 0xE2, 0x73, 0xDA, 0x57, - 0xDD, 0x11, 0xE1, 0x15, 0x46, 0xD1, 0xC7, 0xA3, 0x2C, 0x9D, - 0xE2, 0xE5, 0xED, 0xAA, 0xB5, 0x70, 0xC5, 0xDD, 0x99, 0x77, - 0x0E, 0x50, 0x28, 0xF2, 0xBD, 0xF1, 0xEB, 0x16, 0xAA, 0xB4, - 0x99, 0xE8, 0x42, 0xAE, 0x81, 0x96, 0x99, 0x40, 0x0E, 0xF1, - 0x30, 0xA8, 0x5C, 0x65, 0x2C, 0x75, 0x21, 0xCA, 0xCC, 0x0E, - 0x95, 0x61, 0x04, 0x04, 0xD4, 0x43, 0x11, 0x7D, 0x8E, 0x21, - 0x84, 0x7A, 0x5B, 0xF7, 0x1D, 0xEA, 0xB6, 0xC8, 0x54, 0x02, - 0xE8, 0x95, 0x26, 0xC3, 0x51, 0xC2, 0x65, 0x14, 0xAB, 0xA9, - 0xBF, 0x43, 0x7E, 0x0E, 0x57, 0x68, 0xFC, 0x4D, 0xDA, 0x08, - 0xD4, 0x73, 0x38, 0x7C, 0x0A, 0xF4, 0x92, 0xA4, 0xD4, 0x6D, - 0x8D, 0xB8, 0xB7, 0xE8, 0xD2, 0x7D, 0x35, 0x4E, 0x44, 0xE2, - 0x84, 0xE0, 0xF0, 0x3D, 0xD0, 0x31, 0xB8, 0xED, 0xD4, 0x75, - 0x8C, 0x98, 0xED, 0x30, 0xBE, 0xD4, 0xDB, 0xA6, 0x02, 0x2C, - 0xEB, 0x9E, 0x6B, 0x83, 0xBE, 0x71, 0x25, 0x9A, 0x8C, 0xDC, - 0x5F, 0x86, 0x09, 0x33, 0x74, 0x32, 0x25, 0xD8, 0xA3, 0x29, - 0x21, 0x6A, 0xE6, 0x68, 0xDD, 0x82, 0x96, 0x87, 0x62, 0xE6, - 0x83, 0xFB, 0x85, 0xD9, 0x00, 0xC8, 0x32, 0x8B, 0xA8, 0x33, - 0x86, 0x2C, 0xE0, 0xDF, 0x1F, 0x76, 0x7D, 0x5C, 0xB1, 0x92, - 0xE3, 0x84, 0xDB, 0x73, 0xEC, 0x3D, 0x49, 0xEB, 0xD8, 0x62, - 0x4A, 0xEE, 0x2D, 0xA1, 0x13, 0xCA, 0x65, 0x7E, 0xBA, 0xAD, - 0x61, 0xEE, 0xA2, 0x8E, 0x23, 0x6E, 0xA7, 0x97, 0x75, 0x93, - 0x62, 0xBF, 0x40, 0x3E, 0x01, 0xE8, 0xE7, 0x40, 0x19, 0xEC, - 0x3F, 0xD2, 0xCE, 0x16, 0x5C, 0xB3, 0x08, 0x29, 0x48, 0xCE, - 0x42, 0x81, 0x59, 0x7A, 0x67, 0xB2, 0x03, 0xEB, 0xBC, 0x1E, - 0x45, 0x64, 0x8B, 0xED, 0xD0, 0xA5, 0x5C, 0x2D, 0xEA, 0xEA, - 0xB5, 0x2A, 0xF2, 0x39, 0x1A, 0x2C, 0xB4, 0x35, 0x4E, 0xC2, - 0xBB, 0x98, 0x66, 0x12, 0x8A, 0xC1, 0xE1, 0x26, 0xFE, 0x3C, - 0x48, 0x1E, 0x40, 0xE3, 0x58, 0x39, 0xFD, 0x33, 0x1B, 0xE9, - 0x91, 0x70, 0x60, 0xD0, 0x22, 0xD0, 0xD6, 0x7D, 0x20, 0x59, - 0x08, 0x84, 0x3B, 0x98, 0x99, 0xB5, 0x5C, 0x44, 0x19, 0xE8, - 0xA5, 0x99, 0x15, 0x61, 0x98, 0xE2, 0x4E, 0x62, 0x59, 0x97, - 0xF9, 0x61, 0x6B, 0xF0, 0x57, 0x89, 0x9F, 0xBD, 0x33, 0xBB, - 0xA9, 0x56, 0xB8, 0x5D, 0x3D, 0x6A, 0x10, 0x35, 0x41, 0xEE, - 0x40, 0xAC, 0xF2, 0xAA, 0x34, 0x6A, 0x09, 0xA0, 0x35, 0x83, - 0xD2, 0xAB, 0x24, 0xA1, 0x97, 0x70, 0xCE, 0xA1, 0xEE, 0x2F, - 0x0D, 0x5D, 0xC9, 0x3E, 0x8B, 0xF6, 0x25, 0xA9, 0xB5, 0xF8, - 0x2C, 0xE0, 0x69, 0x43, 0x08, 0x64, 0x19, 0xC5, 0x23, 0x20, - 0xEC, 0xD8, 0x04, 0x00, 0xA8, 0x86, 0x61, 0x00, 0x1F, 0x6E, - 0x5C, 0x9E, 0xDA, 0x61, 0x68, 0x87, 0x5F, 0xB1, 0x22, 0x49, - 0x7B, 0x17, 0x67, 0x7E, 0x51, 0x4A, 0xE1, 0x05, 0x1B, 0x31, - 0x39, 0xDD, 0x75, 0x42, 0x4C, 0xE1, 0x10, 0xBB, 0xB8, 0x08, - 0xA8, 0x0C, 0x90, 0xC3, 0x59, 0x90, 0xE2, 0x99, 0x83, 0x65, - 0xBC, 0x5D, 0xC4, 0x90, 0x87, 0x8B, 0xE4, 0xF3, 0x32, 0x39, - 0x9D, 0x46, 0xFF, 0x24, 0x60, 0x1F, 0x32, 0x49, 0xA9, 0x57, - 0x97, 0xF7, 0x8C, 0x59, 0x3E, 0x70, 0x09, 0x93, 0x4A, 0x0C, - 0xFC, 0x32, 0x51, 0x86, 0x41, 0x65, 0x04, 0x4D, 0xF7, 0x02, - 0xB2, 0x6A, 0xB1, 0xAA, 0x18, 0x6B, 0xA2, 0x05, 0xE9, 0xD7, - 0x59, 0xC2, 0x93, 0x51, 0x57, 0xC8, 0x42, 0x9A, 0x74, 0xBA, - 0x98, 0x51, 0x9E, 0xB9, 0xA7, 0x41, 0x81, 0x71, 0x54, 0x45, - 0x51, 0xBE, 0xC5, 0x72, 0x02, 0xEB, 0xA8, 0x97, 0x5B, 0x4E, - 0x25, 0xD0, 0x40, 0xD1, 0x45, 0x7D, 0x30, 0xBF, 0x44, 0xBE, - 0x1C, 0xE1, 0x4C, 0x9C, 0xDA, 0xA3, 0x54, 0xEC, 0xFF, 0x46, - 0x26, 0xE9, 0x97, 0x63, 0x82, 0x4F, 0xA6, 0x9A, 0xA0, 0xF3, - 0x89, 0x83, 0x8E, 0x49, 0xAE, 0x21, 0xF4, 0x5C, 0x6E, 0x0D, - 0x89, 0x08, 0xCA, 0x34, 0xCC, 0xC2, 0xC3, 0x47, 0x8C, 0xDC, - 0xC5, 0x9D, 0xA4, 0xAF, 0xA2, 0x0A, 0x75, 0x3A, 0x72, 0x8A, - 0x1D, 0xA0, 0x3A, 0xDA, 0x5B, 0x0F, 0x1A, 0xDC, 0x70, 0x21, - 0xC8, 0xE3, 0x3C, 0xD5, 0xCF, 0x48, 0x74, 0x49, 0xF9, 0x6E, - 0x8D, 0xD6, 0x9D, 0x8A, 0x9A, 0x32, 0x6B, 0xE0, 0x77, 0xA6, - 0x84, 0x54, 0xF5, 0xA3, 0x11, 0x55, 0xB7, 0xA0, 0xA8, 0xF3, - 0xBC, 0xED, 0xEC, 0x6F, 0xB8, 0xAF, 0xA3, 0xE4, 0xDC, 0x13, - 0xA4, 0x76, 0x63, 0x83, 0x92, 0xC4, 0xC6, 0x22, 0x20, 0x37, - 0x58, 0xA3, 0xAC, 0x63, 0x66, 0x88, 0x3B, 0xD8, 0xBA, 0xA4, - 0x06, 0x26, 0xBE, 0xA6, 0x23, 0x9E, 0xC0, 0xD1, 0x61, 0x5D, - 0xCF, 0x64, 0x34, 0x04, 0x4D, 0x05, 0x9C, 0xD2, 0x03, 0xE8, - 0xC8, 0x0B, 0x14, 0xBE, 0x47, 0x45, 0x1E, 0x1B, 0x04, 0x94, - 0xDA, 0xAD, 0x72, 0xCA, 0x1B, 0xE2, 0xB3, 0xC5, 0xA1, 0x69, - 0x45, 0x07, 0xED, 0x2E, 0xF9, 0x1A, 0xC3, 0x3C, 0xC7, 0xB5, - 0x1D, 0xD9, 0x85, 0x27, 0xB8, 0xD4, 0x91, 0x03, 0xD2, 0x35, - 0xF3, 0x5F, 0x5D, 0x3F, 0x3E, 0x56, 0x25, 0xBB, 0x37, 0x0C, - 0xDC, 0x48, 0x1D, 0xCF, 0x82, 0xFD, 0x24, 0xD0, 0xBF, 0xCA, - 0x69, 0x91, 0xC5, 0x8C, 0x7D, 0x7B, 0x78, 0x31, 0xBA, 0xC3, - 0x9F, 0x7C, 0x6E, 0x7D, 0x39, 0xF3, 0xEE, 0x46, 0x9C, 0x81, - 0xE5, 0xAA, 0xA8, 0xD7, 0x02, 0x17, 0x27, 0x94, 0xF8, 0xF1, - 0x54, 0x0A, 0xA2, 0x47, 0x3C, 0xE7, 0xA6, 0xA5, 0x00, 0x31, - 0x81, 0xA1, 0xE3, 0x86, 0xEF, 0x56, 0xE3, 0x36, 0x2C, 0x1F, - 0x86, 0xED, 0xD3, 0x6D, 0x05, 0xBA, 0x36, 0xF1, 0xF0, 0x2E, - 0x84, 0x9A, 0xFA, 0xA7, 0x09, 0x59, 0x14, 0x2B, 0x0A, 0xFC, - 0xC0, 0x16, 0x3E, 0xAA, 0x13, 0xAF, 0x25, 0x02, 0x4A, 0x97, - 0xD0, 0xAD, 0x7E, 0x2D, 0xC2, 0x4A, 0xFD, 0x1F, 0x2B, 0x4D, - 0x46, 0x60, 0x42, 0xB1, 0xAE, 0x12, 0x32, 0x5E, 0x23, 0x19, - 0x47, 0x4B, 0x23, 0x7C, 0x1A, 0xA2, 0xC6, 0x4F, 0x03, 0xBE, - 0x47, 0x95, 0x97, 0x86, 0xFF, 0x0E, 0xCC, 0x40, 0xB0, 0xCA, - 0x45, 0xE5, 0x14, 0x93, 0xA1, 0xD0, 0xC1, 0x37, 0xEE, 0x1E, - 0x13, 0x69, 0xB9, 0x8D, 0xE1, 0x86, 0xCC, 0xDD, 0x0D, 0xC2, - 0xED, 0xD3, 0x59, 0x13, 0x9D, 0xB5, 0xD0, 0x50, 0x68, 0x1A, - 0xA5, 0xA6 + 0x30, 0x82, 0x10, 0x1A, 0x02, 0x01, 0x00, 0x30, 0x07, 0x06, + 0x05, 0x2B, 0xCE, 0x0F, 0x03, 0x0E, 0x04, 0x82, 0x09, 0x05, + 0x04, 0x82, 0x09, 0x01, 0x5A, 0x1E, 0xC3, 0xF0, 0x77, 0xC2, + 0xE6, 0xC4, 0x3F, 0x1B, 0xC2, 0x19, 0x04, 0x22, 0xDC, 0x41, + 0xDF, 0x43, 0xB2, 0x87, 0xE0, 0x0F, 0x8D, 0xF3, 0x73, 0xBF, + 0xF1, 0x01, 0xFF, 0xFC, 0x05, 0x17, 0x4A, 0x40, 0x84, 0x62, + 0x20, 0xC0, 0x6F, 0x73, 0xE0, 0x1F, 0xFC, 0x1D, 0x0B, 0xFE, + 0x09, 0x44, 0x0E, 0x7B, 0xC1, 0x0F, 0xFC, 0x2F, 0x08, 0x5F, + 0x0F, 0x83, 0xFF, 0x83, 0xDF, 0x20, 0x8D, 0xE0, 0x70, 0x3F, + 0x17, 0xB7, 0xBF, 0x8B, 0xC1, 0x07, 0x43, 0xE1, 0x77, 0xC4, + 0x00, 0xC7, 0xF1, 0x7C, 0x5F, 0xE8, 0x01, 0xE1, 0x10, 0x40, + 0x08, 0xC2, 0x22, 0xFF, 0x85, 0xF9, 0x3C, 0x30, 0x8C, 0x1B, + 0x10, 0x82, 0x02, 0x9B, 0xFB, 0xF1, 0x3F, 0xA0, 0x80, 0x01, + 0x0F, 0xFC, 0x4E, 0x00, 0x39, 0x00, 0x3C, 0x40, 0x74, 0xA0, + 0xF7, 0x78, 0x10, 0x0F, 0xC1, 0x08, 0x87, 0xF0, 0x77, 0xDE, + 0x19, 0x01, 0xDF, 0x10, 0x7F, 0xE8, 0xB9, 0xF0, 0x08, 0x5E, + 0xF7, 0x85, 0xD1, 0x83, 0x44, 0xF7, 0xFF, 0xF0, 0x03, 0xC1, + 0xE8, 0xB9, 0xEE, 0x88, 0x3E, 0x10, 0x04, 0x6F, 0x7B, 0xBF, + 0xED, 0xFF, 0xCD, 0xF8, 0x21, 0x08, 0x46, 0x00, 0x77, 0xA2, + 0xFF, 0x80, 0x3E, 0x8F, 0xC0, 0x18, 0x45, 0xDE, 0x80, 0x5E, + 0x08, 0x3C, 0x00, 0x03, 0xE1, 0xFF, 0xF8, 0x5D, 0xF8, 0xFE, + 0xEF, 0x80, 0x2D, 0xF4, 0x04, 0x07, 0xF9, 0xCC, 0xF7, 0xA0, + 0xD0, 0x05, 0xC2, 0x93, 0xC1, 0x07, 0x86, 0x3E, 0x0B, 0xDE, + 0x08, 0x3A, 0x01, 0x80, 0x03, 0x18, 0x04, 0x10, 0xFC, 0x00, + 0x17, 0xF7, 0xD0, 0x0B, 0xE1, 0x1F, 0xC1, 0xF1, 0xEC, 0x5F, + 0x27, 0x00, 0x2F, 0x80, 0x01, 0xCF, 0x7C, 0x5E, 0x88, 0x01, + 0x10, 0x40, 0x12, 0x00, 0x40, 0x0F, 0x48, 0x30, 0x04, 0x24, + 0x08, 0x87, 0xE2, 0x90, 0x07, 0xE8, 0x00, 0x3F, 0x7F, 0x9E, + 0x18, 0x39, 0xCE, 0x8C, 0x44, 0x07, 0x76, 0x32, 0x74, 0xA0, + 0x2F, 0xC0, 0x2E, 0x88, 0x41, 0x18, 0x84, 0x11, 0x7B, 0xC3, + 0xE7, 0x87, 0xEE, 0x13, 0x9C, 0x08, 0x81, 0xFF, 0x78, 0x3F, + 0x00, 0x7D, 0xF0, 0x03, 0xFF, 0x18, 0xBA, 0x2E, 0x03, 0x9D, + 0x20, 0xB6, 0x5C, 0xF8, 0x01, 0x37, 0xFC, 0x00, 0x78, 0x40, + 0xFF, 0x3A, 0x2F, 0x88, 0xE3, 0xF7, 0x83, 0xC1, 0x8C, 0x1F, + 0x08, 0x00, 0x01, 0x07, 0xA0, 0x07, 0x42, 0x20, 0x0C, 0x1C, + 0x16, 0xC0, 0x31, 0x10, 0x5F, 0xD8, 0x3C, 0x30, 0x8B, 0xBC, + 0x09, 0x41, 0xE2, 0x7B, 0xDF, 0x17, 0xBE, 0x2D, 0x88, 0x04, + 0x09, 0x06, 0x1D, 0x8F, 0xE0, 0xF9, 0x3C, 0x60, 0x83, 0x9E, + 0xFF, 0xFC, 0x3F, 0x73, 0x9D, 0x18, 0xCA, 0x1E, 0xEC, 0x02, + 0xFF, 0xFD, 0xDF, 0xFC, 0x5A, 0x00, 0x00, 0x30, 0xFC, 0x21, + 0x07, 0xC3, 0xDF, 0x98, 0xA2, 0x27, 0x7D, 0xFF, 0x0B, 0xE2, + 0xF0, 0x83, 0xE0, 0x83, 0xC2, 0xEF, 0xBA, 0x92, 0x74, 0x05, + 0x0E, 0x87, 0xCC, 0x80, 0x20, 0x08, 0x79, 0xEF, 0x08, 0x07, + 0xE8, 0x01, 0xD0, 0xEF, 0x9E, 0x0F, 0xFC, 0x4F, 0x08, 0xA1, + 0x30, 0x87, 0xFD, 0x70, 0x3A, 0xE8, 0x91, 0xBE, 0xF8, 0x20, + 0x08, 0xB8, 0x1F, 0x7C, 0x83, 0xE1, 0x04, 0x00, 0x74, 0xBE, + 0x10, 0x80, 0x10, 0x84, 0x46, 0xFF, 0x81, 0xE0, 0x10, 0x60, + 0x07, 0x41, 0xF0, 0x03, 0xBD, 0x00, 0xC7, 0xDD, 0xF7, 0xA0, + 0xF8, 0x32, 0x2F, 0x87, 0x41, 0xF7, 0x82, 0x3D, 0x73, 0xC0, + 0xD9, 0x7F, 0xDF, 0x83, 0xE3, 0x17, 0x3A, 0x20, 0x88, 0x23, + 0x07, 0x3A, 0x20, 0x74, 0x9E, 0xF7, 0x3F, 0xF1, 0x80, 0x83, + 0xEF, 0xC0, 0x51, 0xEF, 0xC1, 0x08, 0x76, 0x0D, 0x0F, 0x84, + 0xF9, 0x76, 0x01, 0x08, 0x9D, 0xC8, 0x85, 0xE1, 0x74, 0x40, + 0x37, 0x84, 0x02, 0x7F, 0x61, 0xEF, 0x83, 0xCF, 0x87, 0xDF, + 0x0E, 0xBF, 0xCF, 0xFC, 0x7C, 0x09, 0x3E, 0x11, 0x84, 0x3F, + 0x29, 0x3E, 0x5F, 0x87, 0xBE, 0x10, 0x3B, 0xF1, 0x8B, 0xFE, + 0x19, 0x82, 0x40, 0x78, 0x9F, 0xFF, 0xFA, 0x31, 0x7F, 0x60, + 0x00, 0x8A, 0x0F, 0x00, 0x18, 0x01, 0x83, 0xA2, 0x0F, 0xC4, + 0xF9, 0x3B, 0xCD, 0x08, 0x64, 0xE0, 0x84, 0x1F, 0x0C, 0x3C, + 0x0F, 0x3E, 0x30, 0x84, 0x5D, 0x08, 0x3E, 0x0D, 0x07, 0xC3, + 0x20, 0x7D, 0xED, 0x83, 0xC5, 0x11, 0x3A, 0x0E, 0x88, 0x1A, + 0xE0, 0xBC, 0x2E, 0x03, 0xE0, 0x08, 0x06, 0x10, 0x08, 0x7A, + 0xF7, 0xF4, 0x0F, 0x03, 0x7E, 0x20, 0x01, 0xE0, 0x17, 0x7D, + 0xD8, 0x87, 0xE2, 0x88, 0x80, 0xF7, 0x7A, 0x1D, 0x08, 0xA0, + 0xE1, 0x78, 0x0F, 0x90, 0x21, 0x10, 0x85, 0xE0, 0x04, 0x83, + 0xE0, 0x05, 0xD0, 0x08, 0x5E, 0x00, 0x41, 0xFF, 0x7F, 0x80, + 0x4E, 0xFE, 0x11, 0x0F, 0xE6, 0x00, 0x3F, 0xE0, 0x0F, 0xE0, + 0xE8, 0x84, 0x5F, 0x88, 0x65, 0xE8, 0xC0, 0x00, 0xFC, 0x19, + 0x16, 0x40, 0x51, 0x87, 0xC0, 0x30, 0x3D, 0xE0, 0x70, 0xBE, + 0x08, 0x87, 0xE2, 0x90, 0xBE, 0x3F, 0x43, 0xCE, 0x94, 0x1E, + 0x29, 0x42, 0x00, 0x00, 0x3F, 0x30, 0x07, 0xFF, 0x04, 0x61, + 0xE8, 0x03, 0xCF, 0xF7, 0xBA, 0x08, 0x40, 0x2F, 0x77, 0xE2, + 0x18, 0x41, 0xF0, 0x08, 0x1D, 0xEF, 0xC2, 0x2E, 0x80, 0x03, + 0xF9, 0x7A, 0x0F, 0x1C, 0x5F, 0x00, 0x00, 0x20, 0x10, 0x20, + 0xF8, 0x02, 0x5F, 0x80, 0x44, 0xE0, 0x38, 0x4E, 0xFC, 0x20, + 0xF8, 0x02, 0x31, 0xFC, 0x5D, 0xEF, 0xC9, 0xFF, 0x0C, 0x03, + 0xF8, 0x3D, 0xB2, 0xF3, 0x9F, 0x20, 0x48, 0x0F, 0x04, 0x3F, + 0xFF, 0xF9, 0xF0, 0x70, 0x82, 0x08, 0xBC, 0x12, 0x74, 0x1F, + 0x07, 0x01, 0xE1, 0x04, 0x82, 0xF8, 0x77, 0xF1, 0x78, 0x81, + 0x07, 0x40, 0x21, 0xFC, 0xBD, 0x1F, 0xFE, 0x2E, 0x78, 0x60, + 0x17, 0xFF, 0xD1, 0x74, 0x62, 0xF7, 0x41, 0xF0, 0xFB, 0xC0, + 0x07, 0xC2, 0x31, 0x6C, 0x1F, 0xF8, 0x7F, 0xDF, 0x03, 0x62, + 0x27, 0xC2, 0x02, 0x7F, 0x82, 0x00, 0xBA, 0x6F, 0x7C, 0x80, + 0xE0, 0x01, 0xED, 0x9B, 0xDD, 0x19, 0x41, 0xFD, 0x8C, 0x5F, + 0x0E, 0xFE, 0x60, 0x88, 0x7F, 0xF8, 0x44, 0x41, 0xF8, 0x5F, + 0xD7, 0xBE, 0x12, 0xF4, 0x7E, 0xC8, 0xCA, 0x2C, 0xFC, 0x9D, + 0xEF, 0xBA, 0x3E, 0x88, 0xA3, 0xE7, 0x04, 0x30, 0x83, 0xD9, + 0x10, 0x84, 0x0F, 0x87, 0x9E, 0x10, 0x7B, 0xDF, 0xFC, 0x22, + 0xE0, 0x7A, 0x31, 0x78, 0x20, 0xD7, 0x48, 0x10, 0x08, 0x7E, + 0xF0, 0x7A, 0x12, 0x04, 0x24, 0x17, 0xC9, 0xEF, 0xFB, 0xBE, + 0x0E, 0xC3, 0xC0, 0x87, 0x9F, 0xFF, 0x42, 0x2E, 0x04, 0x3D, + 0x0F, 0xC5, 0xFF, 0x08, 0x81, 0x21, 0x48, 0x40, 0x10, 0x9B, + 0x0F, 0xC2, 0x10, 0x97, 0xBF, 0x30, 0x40, 0x1F, 0x88, 0x1D, + 0x17, 0x8C, 0x01, 0x00, 0x41, 0x08, 0x7C, 0x4F, 0xF3, 0xBF, + 0x07, 0x80, 0x02, 0x0F, 0xE0, 0xFF, 0x47, 0xBF, 0x84, 0x5F, + 0x01, 0x00, 0x0F, 0x74, 0x1E, 0xF0, 0x01, 0x80, 0x07, 0xA1, + 0xF7, 0x83, 0xFF, 0x81, 0x3F, 0x10, 0x88, 0x0F, 0xFC, 0x3E, + 0xFF, 0xBF, 0xB0, 0x90, 0x3B, 0xF1, 0x08, 0x20, 0xF7, 0xA0, + 0xF9, 0x47, 0xD0, 0xF8, 0x81, 0x1F, 0xFC, 0x00, 0xFC, 0x1C, + 0x1E, 0xC9, 0xDF, 0x98, 0x61, 0xD8, 0xBB, 0xF1, 0xF4, 0x82, + 0x00, 0xB7, 0xD0, 0xFF, 0xDB, 0x08, 0x81, 0xE0, 0x08, 0xC0, + 0xE0, 0x7F, 0xE0, 0xEC, 0x23, 0x00, 0x33, 0xF0, 0xF7, 0xFE, + 0xF8, 0xC7, 0xEF, 0x84, 0x41, 0x00, 0x49, 0xE0, 0x00, 0x5F, + 0xF6, 0xFC, 0x4E, 0x6C, 0x00, 0xF0, 0x00, 0x1F, 0x9B, 0xDF, + 0x10, 0x3C, 0x01, 0x00, 0xFF, 0x1E, 0xF5, 0xFF, 0x03, 0xC0, + 0xF0, 0x7D, 0xFE, 0x63, 0xE1, 0x08, 0xFD, 0xD1, 0x88, 0x60, + 0xF8, 0xBA, 0x51, 0x07, 0xBF, 0x18, 0x43, 0xD0, 0x83, 0xC1, + 0xF9, 0x85, 0xE0, 0x7C, 0x04, 0xFF, 0xC6, 0x01, 0x84, 0x05, + 0xFF, 0x3C, 0x30, 0x74, 0x1F, 0x01, 0x00, 0x22, 0x8F, 0xE1, + 0xF7, 0xC3, 0xDF, 0x7C, 0xDE, 0xC8, 0x46, 0x30, 0x87, 0xE5, + 0x00, 0xBB, 0xF0, 0x97, 0xC3, 0xE6, 0xBC, 0x20, 0x7F, 0xDE, + 0x17, 0x40, 0x1F, 0x03, 0xFB, 0xF7, 0xFC, 0x42, 0x87, 0x66, + 0xF8, 0xC8, 0x10, 0x0F, 0xFC, 0xF6, 0x02, 0x2F, 0xE0, 0x00, + 0xE7, 0x38, 0x13, 0x74, 0x7F, 0x27, 0x0E, 0x5C, 0xE8, 0x60, + 0x10, 0x83, 0xEE, 0x13, 0x9D, 0xF8, 0x42, 0x3F, 0x8C, 0x02, + 0x26, 0xFF, 0xF0, 0x80, 0x00, 0x10, 0x7A, 0x3F, 0xFB, 0xDB, + 0x08, 0x45, 0xF2, 0x08, 0x23, 0xC8, 0x3D, 0xED, 0x07, 0xBD, + 0xF0, 0x46, 0x40, 0x0B, 0x21, 0x18, 0xC1, 0xE0, 0x78, 0x5F, + 0x18, 0xB8, 0x31, 0x74, 0x20, 0x08, 0x07, 0xDF, 0xFC, 0x9C, + 0xFF, 0x06, 0x4E, 0x84, 0x7C, 0x0F, 0xFB, 0xB1, 0x04, 0x26, + 0xC9, 0x38, 0x0D, 0x7C, 0x5B, 0x17, 0xFE, 0x11, 0x80, 0x9F, + 0x07, 0x83, 0xFE, 0xFC, 0x82, 0x00, 0x43, 0xFF, 0xF0, 0x22, + 0xF8, 0x7B, 0xD1, 0x78, 0xA0, 0xF8, 0x87, 0xC0, 0x13, 0x67, + 0xF0, 0x00, 0x02, 0x1B, 0x3E, 0x10, 0x47, 0xE0, 0x07, 0xDE, + 0x17, 0x76, 0x30, 0x7B, 0xDD, 0x07, 0x7F, 0xF1, 0xF7, 0x9F, + 0xF7, 0xFE, 0x00, 0x13, 0xBC, 0x00, 0x01, 0xFE, 0xF4, 0x7D, + 0x38, 0xBC, 0x32, 0x83, 0xE3, 0x20, 0xBD, 0xE2, 0x7C, 0x22, + 0x00, 0x7C, 0x12, 0xF8, 0x42, 0xF0, 0x48, 0x4F, 0x78, 0x02, + 0x21, 0x7F, 0xD0, 0x73, 0xC4, 0x20, 0xBD, 0xE0, 0x00, 0x01, + 0x17, 0xC1, 0xC1, 0xFC, 0x43, 0xF7, 0xFC, 0x0E, 0x7B, 0xBC, + 0x10, 0x00, 0x21, 0x77, 0xDF, 0xF0, 0x12, 0xF7, 0xE0, 0xE5, + 0xE7, 0x12, 0xE5, 0x2C, 0xC2, 0x11, 0xD4, 0x03, 0xEE, 0x09, + 0x07, 0xFA, 0xCE, 0xC5, 0x0B, 0x0D, 0x1D, 0xF5, 0x39, 0xF5, + 0xD0, 0x17, 0xEC, 0xFF, 0xEC, 0xFA, 0xE9, 0xDF, 0x40, 0x0F, + 0x02, 0x11, 0xF2, 0x1A, 0x0D, 0xE2, 0xEA, 0x0F, 0xF5, 0x0E, + 0xFF, 0x02, 0xFC, 0x0E, 0xF6, 0xDE, 0x2F, 0x12, 0x2D, 0xEA, + 0xFF, 0x1F, 0xD5, 0xFB, 0x1D, 0x0D, 0x12, 0xB2, 0x08, 0x1F, + 0x08, 0x07, 0xEC, 0x1C, 0x15, 0xFD, 0xFA, 0x02, 0xF0, 0xFE, + 0x0D, 0xEC, 0xFF, 0xD1, 0xF3, 0x02, 0x0A, 0xEC, 0xF7, 0xE6, + 0x06, 0x0B, 0x4E, 0x2D, 0xFB, 0x17, 0x35, 0xEF, 0xD1, 0x0C, + 0xEC, 0x1C, 0x25, 0x01, 0x0A, 0xF4, 0x16, 0x22, 0xEA, 0x00, + 0x13, 0x05, 0x0F, 0xED, 0x0F, 0xFC, 0x02, 0x02, 0x31, 0xE2, + 0xEE, 0x16, 0x2C, 0xF0, 0x3F, 0x08, 0x01, 0xE9, 0x00, 0x29, + 0x0B, 0x13, 0x17, 0xE8, 0xE6, 0xDE, 0xE9, 0x1F, 0x09, 0xF6, + 0x0B, 0x0B, 0x20, 0xF2, 0xF8, 0x26, 0xFC, 0xFA, 0xE4, 0x16, + 0xFB, 0xF0, 0x05, 0xE9, 0x00, 0xEF, 0xE5, 0x0E, 0xF3, 0x0D, + 0x0E, 0xC7, 0x0E, 0x14, 0xEF, 0x03, 0xDC, 0x0B, 0x0F, 0xF2, + 0x38, 0xEF, 0xED, 0x13, 0x1D, 0x0E, 0x24, 0x0B, 0xE1, 0xC1, + 0xC4, 0xE1, 0x14, 0x05, 0x2E, 0xDA, 0x1C, 0x10, 0x10, 0xFC, + 0xF3, 0xF9, 0xFA, 0xFA, 0x02, 0x0D, 0xE7, 0xFE, 0xF3, 0x02, + 0xE9, 0x08, 0xFD, 0xD4, 0x41, 0x26, 0x2E, 0xE2, 0xD3, 0x24, + 0xFF, 0x00, 0x09, 0x23, 0xEC, 0xE8, 0x05, 0xEF, 0xE7, 0x02, + 0x13, 0x00, 0x12, 0x0E, 0xD4, 0xD6, 0x13, 0x31, 0xF9, 0x15, + 0x15, 0xC8, 0x01, 0x17, 0x2C, 0x27, 0x16, 0xD1, 0x07, 0x3F, + 0xF5, 0xEF, 0x0E, 0x00, 0xD0, 0x2B, 0x13, 0xE2, 0xF5, 0x0E, + 0x4C, 0xDF, 0x03, 0x07, 0xE8, 0xEA, 0x0D, 0x25, 0x01, 0xF0, + 0xFA, 0x0A, 0xFA, 0xDE, 0x01, 0xFB, 0x27, 0xFC, 0xEE, 0xEF, + 0xCB, 0x12, 0x1D, 0xE0, 0x00, 0xF8, 0xF0, 0xFA, 0xFF, 0xFE, + 0xFB, 0x0E, 0xD7, 0xD7, 0xD9, 0x01, 0x13, 0xE9, 0xED, 0xD9, + 0x18, 0xEF, 0xF9, 0xED, 0x0A, 0x06, 0xFB, 0xE5, 0x17, 0xD8, + 0xE8, 0x08, 0xFA, 0x1D, 0x0A, 0xFF, 0x22, 0x06, 0xF2, 0x1A, + 0x0A, 0xFD, 0xE4, 0xF3, 0xED, 0xF8, 0x18, 0xF3, 0x10, 0x0A, + 0x00, 0xE0, 0xF6, 0x12, 0xF2, 0xFC, 0x20, 0x28, 0xF7, 0x0C, + 0xFA, 0x18, 0x09, 0x01, 0xFB, 0xDE, 0x27, 0xF7, 0x33, 0xFA, + 0x0B, 0x2F, 0x1C, 0x24, 0x1B, 0xDD, 0x0D, 0x04, 0x14, 0xFC, + 0xFA, 0x22, 0xF1, 0x09, 0x2B, 0x06, 0x01, 0x0A, 0x15, 0x0D, + 0xCE, 0x0B, 0x22, 0xF9, 0x0D, 0x35, 0x14, 0xF7, 0xFC, 0x07, + 0xE4, 0xE4, 0xE3, 0x16, 0x0B, 0x20, 0xC1, 0x01, 0xEA, 0x17, + 0x21, 0xE0, 0x02, 0x12, 0xE9, 0x0B, 0x01, 0xF8, 0xED, 0x27, + 0xE9, 0xDF, 0x0B, 0xCC, 0x04, 0x21, 0x13, 0x0D, 0x20, 0x07, + 0x0F, 0x10, 0x13, 0x19, 0x24, 0x04, 0xFC, 0x01, 0xFC, 0xBF, + 0xC1, 0x0A, 0x2B, 0xFD, 0xF5, 0xF4, 0xFE, 0xEC, 0xFB, 0xF8, + 0x26, 0x03, 0xE0, 0xFE, 0x17, 0xFA, 0xDA, 0x19, 0x0C, 0xFD, + 0x05, 0x2D, 0xFA, 0xF0, 0x0D, 0x04, 0x11, 0xFB, 0xEC, 0x00, + 0xEA, 0x06, 0x06, 0xD6, 0xD0, 0xFB, 0xCF, 0xDF, 0x03, 0xFB, + 0x01, 0xD1, 0xEE, 0x14, 0xE6, 0xF8, 0x0C, 0x0F, 0xEC, 0x22, + 0x09, 0xC8, 0xD8, 0x2A, 0xFC, 0x04, 0x05, 0x17, 0x19, 0x05, + 0xDA, 0x27, 0x0E, 0xE1, 0xE2, 0x0B, 0x2D, 0xE8, 0xD8, 0xE5, + 0xE0, 0xF6, 0xEE, 0x1C, 0xC8, 0xE5, 0x17, 0xFD, 0x0C, 0x0D, + 0xF5, 0xEE, 0xE8, 0x1B, 0x0D, 0xFB, 0x09, 0xF0, 0xE9, 0x0A, + 0x2F, 0xDA, 0x05, 0xE5, 0xFE, 0x12, 0xEE, 0x0C, 0xFB, 0x29, + 0xF8, 0xE5, 0xEA, 0x1C, 0xF4, 0xFF, 0x0C, 0xFB, 0x1E, 0xD5, + 0x03, 0xF9, 0xFC, 0xF9, 0x21, 0xFC, 0xD4, 0xF8, 0x18, 0x04, + 0xE3, 0xF5, 0xE1, 0x14, 0xF8, 0x17, 0x26, 0xEA, 0x15, 0x00, + 0xEA, 0xF0, 0x03, 0xF7, 0x01, 0xE4, 0x4A, 0xFD, 0xF5, 0xE8, + 0x18, 0x29, 0xF8, 0x0E, 0xFD, 0xF2, 0x12, 0x0A, 0xE5, 0x06, + 0x34, 0x07, 0x14, 0xF7, 0xE9, 0xE1, 0x1B, 0xF0, 0xE4, 0x26, + 0x18, 0x09, 0x01, 0x0B, 0xE9, 0xE3, 0x0D, 0xD1, 0xF3, 0x27, + 0x10, 0xF5, 0x05, 0xFA, 0x15, 0xCB, 0xDB, 0x04, 0xF7, 0xF9, + 0x22, 0x11, 0x1F, 0x1F, 0x00, 0x0B, 0x0F, 0x0C, 0x03, 0xF9, + 0xF6, 0x0C, 0xDD, 0xFB, 0xFD, 0xDB, 0x1F, 0xF9, 0x09, 0xF5, + 0x1A, 0x14, 0xFB, 0x06, 0x17, 0xF3, 0x23, 0x10, 0xFF, 0x07, + 0xE8, 0xF4, 0x02, 0x01, 0xDF, 0x17, 0x22, 0xFB, 0xD5, 0x1A, + 0xE0, 0xF2, 0x02, 0xFB, 0xEF, 0xDD, 0xE8, 0x25, 0xEE, 0xED, + 0xCB, 0x09, 0x0E, 0xEF, 0x11, 0x0C, 0xBD, 0xDD, 0x1A, 0xF5, + 0x0A, 0xD5, 0x03, 0x1F, 0x1E, 0x1E, 0xD1, 0xF6, 0x0C, 0xE8, + 0xED, 0x0D, 0x13, 0xE8, 0x29, 0xF5, 0x0A, 0x2D, 0x04, 0xF3, + 0xF6, 0x15, 0xFB, 0xD8, 0xFC, 0xC7, 0xEA, 0x0A, 0x15, 0xE7, + 0xF2, 0x3D, 0x05, 0x1A, 0xF1, 0xFC, 0x14, 0x02, 0xDD, 0x26, + 0xF0, 0xEE, 0x02, 0x02, 0x08, 0x14, 0xED, 0x02, 0xD7, 0x0A, + 0x0F, 0x00, 0xFA, 0xFA, 0x0A, 0x05, 0xF9, 0x11, 0x0C, 0x1B, + 0x06, 0x0B, 0x2C, 0xDA, 0x13, 0x12, 0x0C, 0x0B, 0x29, 0xDD, + 0xF8, 0xD1, 0xF3, 0xFE, 0x23, 0x0D, 0xEB, 0xED, 0xF0, 0x0F, + 0x43, 0xC6, 0xD1, 0x01, 0xDB, 0x01, 0xE7, 0x13, 0xF2, 0xD9, + 0xF4, 0x0A, 0x0A, 0x04, 0xE6, 0x11, 0x36, 0x0B, 0xE0, 0x18, + 0xDE, 0xC4, 0x18, 0x05, 0x1A, 0xF4, 0xDC, 0xF6, 0x1B, 0xF8, + 0xFD, 0x02, 0x30, 0x1A, 0x1A, 0x0E, 0xEC, 0x07, 0x1B, 0xE8, + 0x30, 0x10, 0xF9, 0xE4, 0x05, 0x02, 0x05, 0x03, 0xEC, 0x07, + 0x0E, 0xFE, 0x0C, 0xEF, 0x05, 0xD6, 0xD1, 0x02, 0x18, 0xE0, + 0xE1, 0xCC, 0x12, 0xF6, 0xF6, 0xF3, 0x0D, 0x27, 0x0F, 0x37, + 0x3A, 0x1A, 0x0B, 0x1C, 0xC8, 0xDC, 0x06, 0x29, 0x04, 0x01, + 0xFC, 0x05, 0x1A, 0x23, 0xFD, 0xEF, 0x18, 0x36, 0x0E, 0x1D, + 0x06, 0xF2, 0xFC, 0x0D, 0x15, 0x1F, 0x2B, 0xD6, 0xE0, 0x18, + 0x10, 0xF4, 0x0C, 0x0B, 0x23, 0x15, 0x11, 0x05, 0xF1, 0x28, + 0xFA, 0xF2, 0x05, 0xEA, 0x13, 0xE0, 0xFB, 0x07, 0x0C, 0xF8, + 0x12, 0x29, 0xEE, 0x19, 0xD6, 0xE7, 0x15, 0xCD, 0xFF, 0x03, + 0x40, 0xEB, 0xF5, 0x1E, 0x0E, 0xE7, 0xE7, 0xF1, 0xFA, 0x23, + 0xF8, 0x18, 0x06, 0x10, 0xEF, 0x16, 0x05, 0x01, 0xEB, 0x21, + 0x08, 0xFF, 0xF9, 0xDA, 0xEE, 0x01, 0xF8, 0xE4, 0x10, 0xFC, + 0xDD, 0x19, 0xFE, 0xFA, 0xF2, 0xE0, 0x0E, 0x42, 0xFD, 0xDC, + 0x1B, 0xF2, 0xE2, 0xEF, 0x33, 0x0C, 0x0F, 0xDE, 0x03, 0xF6, + 0x1C, 0xDF, 0xD7, 0xD9, 0xF4, 0x08, 0xDD, 0xE8, 0xDB, 0xEE, + 0x1F, 0xF2, 0x26, 0xF3, 0x02, 0xF3, 0x2E, 0x07, 0x09, 0xFD, + 0xE8, 0x10, 0x03, 0x0B, 0xCC, 0x0A, 0xFB, 0x3D, 0xF9, 0xF1, + 0x04, 0xF0, 0x15, 0xFB, 0x13, 0xEF, 0xFC, 0xBB, 0x0D, 0xDC, + 0xE9, 0xE8, 0x01, 0xFD, 0xDB, 0x10, 0x08, 0x14, 0x08, 0xDB, + 0x14, 0xF9, 0x16, 0x1A, 0xEA, 0x22, 0xF6, 0xF3, 0x32, 0xEE, + 0x10, 0xF8, 0x06, 0x04, 0x05, 0xE6, 0xFF, 0x38, 0x0E, 0xF7, + 0x2E, 0xEB, 0xE0, 0xF6, 0x19, 0xEE, 0xD8, 0x1A, 0x26, 0x01, + 0x1A, 0x00, 0xF3, 0x0C, 0x1B, 0x30, 0x18, 0xF0, 0x1A, 0xF4, + 0xF8, 0x3D, 0xE9, 0xEF, 0xE4, 0xE9, 0x05, 0xC7, 0x06, 0xF5, + 0xFF, 0x11, 0x38, 0xF4, 0xF8, 0xEF, 0xE3, 0x19, 0x05, 0xD6, + 0xDE, 0xF9, 0xDD, 0xF0, 0x0D, 0x09, 0x0F, 0x0C, 0x1D, 0x81, + 0x82, 0x07, 0x01, 0x0A, 0x34, 0x51, 0x9B, 0x39, 0xF7, 0xA3, + 0x68, 0xBF, 0x74, 0x68, 0x56, 0x19, 0x2C, 0x01, 0x5F, 0xE1, + 0x67, 0x4B, 0x2C, 0x45, 0x3B, 0x10, 0xFD, 0x76, 0xB9, 0xF0, + 0x52, 0x58, 0x11, 0x89, 0xB3, 0xB4, 0x30, 0xD1, 0x85, 0x4C, + 0xC1, 0x27, 0xC0, 0xA1, 0x8D, 0x54, 0x09, 0xFC, 0xF5, 0xD4, + 0x6A, 0xDE, 0x2D, 0x18, 0x88, 0x00, 0x57, 0x2D, 0x9C, 0x3B, + 0x25, 0xAA, 0xC9, 0xFA, 0xA4, 0xE7, 0xC6, 0x38, 0xEC, 0xE2, + 0x86, 0x1F, 0xD0, 0x18, 0x5F, 0x20, 0xCF, 0xE3, 0xAA, 0x4C, + 0x9F, 0x68, 0x69, 0xE5, 0x10, 0x43, 0xD7, 0xA3, 0x28, 0x12, + 0x1E, 0xA2, 0xA6, 0xD1, 0xE1, 0x1D, 0x30, 0xAD, 0xF6, 0xDF, + 0x82, 0x63, 0x88, 0xBA, 0x73, 0xD3, 0x8B, 0xAE, 0x50, 0x68, + 0x26, 0x81, 0x1A, 0x2D, 0x1F, 0x29, 0x98, 0x25, 0x9E, 0xE0, + 0x71, 0x8D, 0x62, 0x35, 0xAD, 0x91, 0x7A, 0x85, 0x2F, 0x31, + 0xBD, 0x2D, 0x78, 0xD4, 0x26, 0x60, 0xBA, 0xA0, 0x5A, 0xE3, + 0xB0, 0xDB, 0x5A, 0xF7, 0x4F, 0x4E, 0xAB, 0x44, 0x2E, 0x4B, + 0xF8, 0x69, 0xB6, 0x53, 0x19, 0x49, 0xA4, 0x9F, 0x5B, 0x5E, + 0x2B, 0x59, 0x25, 0x15, 0xB2, 0x12, 0xED, 0x06, 0x92, 0x47, + 0x46, 0x35, 0xB1, 0xA6, 0x15, 0xF9, 0x6E, 0x1D, 0x75, 0x7F, + 0xA0, 0x1F, 0x55, 0x44, 0xCD, 0x9A, 0x1F, 0x0C, 0x1E, 0x90, + 0x59, 0x40, 0x9A, 0x55, 0x09, 0xE7, 0x41, 0x87, 0x98, 0x7C, + 0x0A, 0xE2, 0xA9, 0xB4, 0x8C, 0xE2, 0x0E, 0x3A, 0x28, 0x88, + 0x58, 0xF1, 0x91, 0x73, 0x02, 0x01, 0x6C, 0xE9, 0xF3, 0x0B, + 0x40, 0x0A, 0xD8, 0x91, 0x63, 0xF6, 0xA4, 0x5F, 0x82, 0x76, + 0x18, 0xB4, 0x2C, 0xC8, 0xF2, 0x3A, 0xAE, 0x77, 0x19, 0x30, + 0x16, 0x54, 0x4E, 0x82, 0x7F, 0x37, 0xF4, 0xC8, 0x01, 0x3D, + 0x65, 0xF8, 0xA8, 0x9D, 0x44, 0x93, 0x62, 0x85, 0x04, 0xAB, + 0xB0, 0x95, 0x34, 0xA7, 0xF5, 0x64, 0x1A, 0xD5, 0x2D, 0x91, + 0x45, 0x71, 0xE1, 0x26, 0xF5, 0xC8, 0xC7, 0x7F, 0x6E, 0xC5, + 0xB6, 0xE7, 0x9B, 0x41, 0x10, 0x44, 0x76, 0x9A, 0x7A, 0xCE, + 0x66, 0x84, 0x5E, 0xC6, 0x76, 0xBC, 0xC1, 0xDA, 0x63, 0x52, + 0x04, 0x1A, 0xC7, 0x51, 0x12, 0x86, 0xBD, 0xF3, 0xF3, 0xCF, + 0xEA, 0xD8, 0x5B, 0x6D, 0x70, 0xD9, 0x82, 0x59, 0x48, 0x21, + 0x58, 0x1E, 0xA8, 0xC9, 0xE1, 0x77, 0x28, 0x9A, 0x6C, 0x17, + 0x76, 0xDA, 0x55, 0x16, 0x82, 0xB3, 0xB0, 0x69, 0xE3, 0xAF, + 0x56, 0x15, 0x28, 0xC2, 0x6A, 0x15, 0xCF, 0x28, 0x5E, 0xBA, + 0x87, 0xDC, 0x13, 0x0D, 0x32, 0xA2, 0x80, 0x97, 0x9A, 0x84, + 0xFF, 0x5B, 0x2D, 0x63, 0x15, 0x58, 0x55, 0xB3, 0x7D, 0x46, + 0xD6, 0xFA, 0x02, 0x06, 0x9D, 0x98, 0xEA, 0x6E, 0x95, 0x37, + 0xE5, 0x39, 0x0D, 0x42, 0xBF, 0xC8, 0xF0, 0xDC, 0x5C, 0x12, + 0xB0, 0xC9, 0xF3, 0xE4, 0xA3, 0xE1, 0x76, 0x98, 0x0D, 0x17, + 0xF5, 0x0D, 0xBF, 0x7C, 0x1D, 0x89, 0x64, 0x04, 0x8C, 0x37, + 0x64, 0x9D, 0x43, 0x71, 0x94, 0x54, 0x16, 0x5A, 0xD2, 0x3B, + 0xD7, 0x8E, 0x4A, 0xAA, 0x5C, 0xB5, 0xE8, 0x05, 0x9B, 0xA5, + 0xB5, 0x95, 0xC5, 0x6D, 0xF2, 0xEB, 0x08, 0xCE, 0x4C, 0x86, + 0x53, 0xA7, 0xC3, 0x44, 0x40, 0x4D, 0x64, 0x4B, 0xE7, 0xF5, + 0x6C, 0x62, 0x31, 0x35, 0xC3, 0x12, 0x15, 0x2D, 0x9A, 0x88, + 0xE9, 0x24, 0x19, 0x6B, 0xC1, 0xCF, 0x0D, 0xB8, 0x15, 0x44, + 0x04, 0xC9, 0x28, 0x75, 0xCE, 0xC0, 0x26, 0x19, 0xDB, 0xC6, + 0x40, 0xF1, 0x80, 0x74, 0xE0, 0x62, 0x3E, 0x77, 0x86, 0xC1, + 0x32, 0x12, 0xC0, 0x44, 0x17, 0x49, 0x7A, 0xDA, 0x46, 0xE2, + 0xF8, 0x70, 0xC5, 0x59, 0x76, 0xBE, 0xDB, 0xBA, 0x4F, 0x1D, + 0x21, 0x42, 0x5E, 0x5B, 0xED, 0x5A, 0xFA, 0x44, 0x44, 0x66, + 0x8D, 0x5C, 0xA0, 0x22, 0xE2, 0xD7, 0x7D, 0x6E, 0xAD, 0x72, + 0x41, 0xF3, 0xE1, 0x28, 0xD9, 0x6A, 0x5A, 0xFA, 0x10, 0xAA, + 0x1C, 0xC3, 0x98, 0x64, 0x44, 0x35, 0x06, 0x21, 0x6C, 0x5C, + 0x8C, 0x24, 0x6C, 0x39, 0xC8, 0x06, 0xE4, 0x6C, 0x41, 0x59, + 0x0A, 0x8A, 0x8B, 0x73, 0xB7, 0x9C, 0x87, 0x74, 0xFD, 0xD0, + 0x88, 0xA6, 0x2C, 0x41, 0xD5, 0xC7, 0xC6, 0x55, 0x59, 0xEA, + 0xBB, 0x07, 0x83, 0x54, 0xDC, 0x8E, 0x4D, 0xB5, 0x5A, 0xA9, + 0x24, 0x73, 0x01, 0x62, 0x33, 0x78, 0x56, 0x46, 0x70, 0x97, + 0xF6, 0xC5, 0xA9, 0x9D, 0xA3, 0xB7, 0x5D, 0x4A, 0x71, 0xB3, + 0xB6, 0xA3, 0x64, 0xA8, 0xF5, 0x24, 0x77, 0x62, 0x19, 0x2F, + 0xA7, 0xD0, 0x3B, 0x50, 0x24, 0x28, 0x3E, 0x20, 0xF6, 0xA5, + 0x05, 0x8D, 0x40, 0x41, 0x27, 0x79, 0x13, 0xBB, 0x93, 0x48, + 0x76, 0x2E, 0x8C, 0xBC, 0xB7, 0xC6, 0xDC, 0x8A, 0xAD, 0xBD, + 0xB4, 0x82, 0x5D, 0x5C, 0xBE, 0x8A, 0x3C, 0x0D, 0x59, 0x81, + 0x82, 0x2E, 0x01, 0xFD, 0xFE, 0xCA, 0x3E, 0x4D, 0x9D, 0x6A, + 0xD5, 0x93, 0xB5, 0x84, 0x22, 0xFF, 0x08, 0x61, 0xF7, 0x80, + 0xAF, 0xDB, 0x7B, 0xBE, 0xD0, 0xB8, 0x68, 0xB6, 0x90, 0x4C, + 0xA9, 0xC4, 0x66, 0x35, 0x41, 0xA3, 0xA4, 0x0D, 0x94, 0x68, + 0x44, 0x0B, 0x91, 0x39, 0xA9, 0x05, 0xF8, 0xE6, 0xD9, 0x22, + 0xF0, 0x30, 0xDE, 0xE3, 0x18, 0xD9, 0xC5, 0x0F, 0xB5, 0x91, + 0x10, 0x52, 0xEB, 0x20, 0xED, 0x94, 0x2C, 0xC8, 0x6B, 0x0D, + 0xA1, 0x44, 0x63, 0x78, 0xFF, 0xD6, 0xAF, 0x8E, 0xE6, 0x01, + 0xD6, 0xB0, 0xF7, 0x8D, 0x67, 0x24, 0x99, 0x0E, 0x91, 0x48, + 0xA6, 0x0F, 0xB7, 0x24, 0xA4, 0x63, 0x34, 0x8B, 0x90, 0x3E, + 0xAB, 0x6A, 0xD7, 0x84, 0xB6, 0x29, 0xCF, 0xA6, 0x48, 0xF6, + 0xF1, 0xFF, 0x06, 0x9C, 0x27, 0xF4, 0x71, 0x67, 0xCF, 0xAB, + 0xD6, 0x6F, 0xC4, 0x63, 0x70, 0xA3, 0x2E, 0x66, 0x15, 0x3A, + 0x3F, 0xB8, 0x52, 0x6F, 0x9D, 0x83, 0x71, 0x22, 0x08, 0xE9, + 0xDC, 0xCE, 0xB0, 0xB9, 0x71, 0x30, 0x96, 0x8F, 0xB5, 0x8F, + 0x90, 0xBB, 0x62, 0xD2, 0xDE, 0xA7, 0xB3, 0x2E, 0x2D, 0x45, + 0xDA, 0x15, 0x6E, 0x43, 0x39, 0x6A, 0xB1, 0x65, 0xA7, 0x7D, + 0x48, 0xFA, 0xEB, 0xC6, 0x7A, 0x22, 0x16, 0x9B, 0xF9, 0xBB, + 0x15, 0x0E, 0xC6, 0x2A, 0x24, 0xDA, 0x5E, 0x24, 0xCB, 0xC6, + 0x28, 0x5D, 0x80, 0x04, 0x41, 0x15, 0x17, 0xCE, 0xB9, 0xB1, + 0x66, 0x17, 0x28, 0x91, 0x38, 0x26, 0x94, 0xAE, 0x54, 0x11, + 0xD9, 0xEC, 0x49, 0xFC, 0x5C, 0x7A, 0x13, 0xC7, 0x33, 0xBB, + 0x80, 0xC2, 0x64, 0x49, 0xC4, 0xFD, 0x69, 0xE9, 0x3B, 0xE4, + 0x20, 0x1F, 0x16, 0x1C, 0x1D, 0x44, 0xB9, 0x28, 0x03, 0x07, + 0x21, 0xC1, 0x07, 0xC9, 0x9E, 0x67, 0x43, 0x95, 0x1D, 0xBC, + 0x47, 0x9D, 0x84, 0xE2, 0x75, 0x8A, 0x4C, 0x96, 0xBC, 0x4C, + 0x33, 0x62, 0x9E, 0x81, 0x22, 0x84, 0x85, 0xE7, 0x70, 0x46, + 0x7B, 0xB7, 0xBE, 0xE0, 0xC5, 0x26, 0x01, 0x3D, 0x22, 0x3D, + 0xA7, 0x22, 0x80, 0x7A, 0xBF, 0xD5, 0x7D, 0x49, 0x0E, 0x2A, + 0x39, 0x79, 0xA9, 0x57, 0xE7, 0xFE, 0x30, 0x3E, 0x10, 0xE6, + 0x66, 0x16, 0x2E, 0xA3, 0x95, 0xA9, 0xD5, 0xBD, 0xAE, 0x33, + 0x70, 0xB6, 0x42, 0x20, 0x1F, 0x4E, 0xC5, 0x21, 0x26, 0x3C, + 0x14, 0x5B, 0xC1, 0x2C, 0x06, 0xA9, 0x59, 0xAB, 0x1A, 0x5D, + 0xDE, 0x67, 0x42, 0xBA, 0x73, 0x61, 0x4B, 0x16, 0x00, 0x29, + 0x3A, 0x4A, 0xBD, 0xE7, 0x2A, 0x92, 0x36, 0xD9, 0xA9, 0x18, + 0x0C, 0x3E, 0x0C, 0x50, 0x2B, 0xF6, 0x48, 0xDB, 0x2A, 0x0B, + 0x4E, 0x15, 0x7A, 0x6D, 0xA5, 0x0C, 0x54, 0xB6, 0x56, 0x9A, + 0xEF, 0x18, 0x48, 0x5B, 0x4C, 0x7C, 0xF2, 0x02, 0xDA, 0x81, + 0xB7, 0x90, 0xEE, 0xD5, 0x51, 0xA5, 0x25, 0x73, 0x4A, 0x83, + 0x5A, 0xE2, 0xCB, 0xEE, 0xAC, 0xD2, 0xE0, 0x84, 0x0E, 0x80, + 0xB2, 0x4C, 0xF1, 0x2F, 0x37, 0x99, 0xAD, 0xA4, 0x37, 0xEC, + 0xD0, 0xB1, 0x9C, 0xD8, 0xFD, 0x7E, 0x9A, 0x15, 0xB9, 0x47, + 0xEC, 0x2A, 0x32, 0x0E, 0x90, 0x63, 0xB7, 0xC0, 0x1F, 0x6C, + 0x48, 0x85, 0x41, 0x5E, 0xCE, 0x22, 0x68, 0xAD, 0x7D, 0xEA, + 0x9B, 0x99, 0x3D, 0x9B, 0xD6, 0xAC, 0x23, 0x20, 0x00, 0x54, + 0x7E, 0x72, 0x63, 0x66, 0x55, 0x2D, 0xCC, 0x27, 0x79, 0xE4, + 0x58, 0x61, 0xC0, 0xDE, 0x6A, 0xD8, 0x3B, 0x41, 0xD1, 0xA1, + 0x11, 0xAE, 0x21, 0x4A, 0xB3, 0x87, 0xDC, 0x45, 0xA2, 0x4D, + 0xC0, 0xE7, 0x28, 0xCF, 0x20, 0x89, 0xBA, 0xE8, 0xE3, 0x47, + 0x68, 0x84, 0x89, 0x95, 0x2B, 0xFA, 0x14, 0x5A, 0xB9, 0x2E, + 0x7C, 0xEE, 0x09, 0x6D, 0x8C, 0x02, 0xB5, 0xDC, 0xCF, 0x94, + 0xE4, 0xE8, 0xB0, 0x6E, 0xC4, 0x2A, 0x47, 0x26, 0x10, 0xC3, + 0xB3, 0xD6, 0xAE, 0x38, 0xAF, 0x22, 0x57, 0x26, 0x31, 0x7A, + 0xF7, 0x0D, 0x29, 0x5B, 0x40, 0xF9, 0x38, 0xA1, 0xCF, 0x95, + 0xD9, 0x71, 0xAC, 0x42, 0x74, 0x4D, 0x5E, 0xAD, 0x80, 0x36, + 0xAF, 0xA6, 0x63, 0xE2, 0x38, 0x81, 0x09, 0x2C, 0x50, 0x98, + 0x60, 0xE2, 0x19, 0x30, 0x72, 0x48, 0x88, 0xE1, 0x59, 0x6F, + 0x28, 0x13, 0xA6, 0x56, 0x90, 0x53, 0x51, 0xE8, 0x4B, 0x31, + 0xFC, 0x67, 0x14, 0x62, 0x2D, 0x9F, 0xBA, 0xED, 0x52, 0x0A, + 0x9A, 0x20, 0x8B, 0xAB, 0xF4, 0xA1, 0x9D, 0xB4, 0xE1, 0xDE, + 0x65, 0x1B, 0x6F, 0x97, 0x9E, 0x58, 0xEC, 0xB3, 0xEF, 0x1E, + 0x40, 0xAD, 0x22, 0x11, 0x89, 0x1D, 0xE2, 0x6D, 0xB8, 0x0C, + 0xAA, 0x82, 0x95, 0xE9, 0xDB, 0x94, 0x6E, 0xDA, 0x66, 0xBB, + 0x43, 0x89, 0x99, 0x36, 0x06, 0xB6, 0x60, 0xD3, 0x64, 0x56, + 0x32, 0x72, 0xE4, 0xEF, 0x2B, 0xF8, 0x83, 0x9E, 0x22, 0x88, + 0xEA, 0xC4, 0xAD, 0x49, 0x2C, 0x39, 0xF1, 0x65, 0x90, 0xF8, + 0x3A, 0x3A, 0x6F, 0x67, 0xFC, 0xE0, 0x40, 0x6F, 0x9A, 0xA1, + 0x84, 0x6F, 0x07, 0x1C, 0x04, 0x31, 0x52, 0xF6, 0x59, 0x9B, + 0xC1, 0x27, 0xD8, 0x6B, 0xA0, 0x94, 0xD8, 0x47, 0x9C, 0x80, + 0xB1, 0xCA, 0xC3, 0xC8, 0x8E, 0x9F, 0x62, 0x2E, 0x30, 0x1A, + 0x13, 0x60, 0x8B, 0xF0, 0x0C, 0x60, 0x29, 0x0F, 0x7A, 0xA1, + 0x0D, 0xFE, 0x60, 0x34, 0x14, 0x12, 0xA8, 0x51, 0x09, 0xE7, + 0x7E, 0x4C, 0x71, 0x87, 0x96, 0x81, 0x70, 0x7F, 0xDB, 0x6D, + 0x21, 0xBC, 0x80, 0x76, 0x00, 0x27, 0x56, 0x95, 0xF5, 0xA1, + 0x94, 0xF2, 0xC9, 0x95, 0x27, 0x26, 0x41, 0x67, 0xEE, 0x49, + 0x09, 0x89, 0xE0, 0xFF, 0x96, 0x22, 0xE1, 0x38, 0x05, 0xBE, + 0x89, 0xF0, 0xFE, 0x2F, 0x63, 0x2C, 0xC0, 0x43, 0x54, 0x9D, + 0x0B, 0x7E, 0xB7, 0xED, 0x66, 0x42, 0x45, 0x96, 0xC3, 0x5F, + 0x6D, 0x3A, 0x11, 0xF8, 0x56, 0x33, 0x8A, 0xE9, 0x48, 0x27, + 0x2B, 0x10, 0xEF, 0x7E, 0x82, 0x75, 0x70, 0xC5, 0x67, 0x0E, + 0x77, 0x9C, 0xBC, 0xD4, 0x58, 0xC2, 0x84, 0x11, 0xDC, 0xA3, + 0x90, 0x77, 0x43, 0x81, 0x77, 0xFC, 0x33, 0x18, 0xEB, 0x9F, + 0xEC, 0x18, 0x05, 0x83, 0x56, 0xBF, 0x2B, 0x51, 0x2A, 0x04, + 0xE6, 0x14, 0xA0, 0xE9, 0x89, 0x57, 0xD4, 0xFF, 0x63, 0xFA, + 0x62, 0x40, 0x37, 0x60, 0x1A, 0xE7, 0x67, 0x2F, 0x0A, 0x37, + 0x25, 0x93, 0xF2, 0x90, 0xC8, 0xA1, 0x3B, 0x2A, 0x0A, 0x4B, + 0xE9, 0x1A, 0x8D, 0xBD, 0x61, 0x5B, 0xF9, 0xD5, 0xDD, 0x0B, + 0x91, 0xCC, 0x79, 0xEB, 0xD2, 0x4A, 0xA6, 0x79, 0x06, 0x84, + 0xE6, 0x0A, 0xAB, 0xA5, 0x3E, 0x8E, 0xC7, 0xE4, 0x72, 0x51, + 0xCA, 0x90, 0x62, 0x07, 0x61, 0xDC, 0x2B, 0x18, 0x72, 0xE6, + 0x15, 0x54, 0x6F, 0x82, 0x29, 0x49, 0x5D, 0x0D, 0xE5, 0x4B, + 0xDC, 0x75, 0xB2, 0x56, 0x7B, 0x4B, 0x62, 0x8E, 0x04, 0x16, + 0xF6, 0x16, 0x55, 0x16, 0x10, 0xBD, 0x69, 0x81, 0x08, 0x00, + 0x79, 0xCB, 0x23, 0x02, 0x4A, 0x87, 0x34, 0x2B, 0x49, 0xC2, + 0x0B, 0xEC, 0x31, 0xC2, 0x0D, 0x65, 0x12, 0x55, 0xE8, 0x70, + 0x58, 0xD3, 0x08, 0xF9, 0x3E, 0x72, 0xA6, 0x79, 0x05, 0xA6, + 0x0A, 0x92, 0x4C, 0xE5, 0xAB, 0xB1, 0x2A, 0x76, 0x3B, 0xBD, + 0xDF, 0x25, 0xF4, 0x93, 0x8B, 0x74, 0x3D, 0x4D, 0x8A, 0x67, + 0x64, 0x2B, 0x7B, 0x84, 0xAD, 0x1A, 0xDD, 0x27, 0xF7, 0x8A, + 0x9E, 0x26, 0x22, 0x55, 0xDC, 0x43, 0x75, 0xAC, 0xAE, 0x61, + 0xD5, 0x15, 0xCF, 0xA0, 0x70, 0xAA, 0xE2, 0xB7, 0xA8, 0xA2, + 0x21, 0xC0, 0xBF, 0x28, 0xFD, 0xCA, 0x84, 0x79, 0x95, 0xB8, + 0x84, 0xB4, 0x05, 0xB9, 0xA0, 0x61, 0xFC, 0x32, 0x76, 0x68, + 0xED, 0x3C, 0x59, 0xBE, 0x90, 0x8A, 0xE7, 0x6C, 0x73, 0x71, + 0xC8, 0xD0, 0xC7, 0xE0, 0x6F, 0x4E, 0x04, 0x6E, 0x0B, 0x85, + 0x8C, 0x8F, 0x5C, 0x76, 0x83, 0x9A, 0xE9, 0x99, 0xC8, 0x16, + 0x02, 0x50, 0x03, 0xF4, 0x1E, 0x60, 0x38, 0x19, 0x0A, 0xC8, + 0xCF, 0x4E, 0xB9, 0x2D, 0x09, 0x5B, 0xDA, 0x6C, 0xEC, 0xA9, + 0x46, 0x8C, 0x1C, 0xA1, 0x1F, 0xDF, 0x38, 0x62, 0x52, 0xFE, + 0xC1, 0xFE, 0xD6, 0x03, 0x1F, 0xF5, 0x34, 0xF8, 0x15, 0x03, + 0x66, 0xB0, 0x2D, 0xF6, 0x64, 0xB3, 0x6B, 0x23, 0xA7, 0x92, + 0xDB, 0x71, 0xE3, 0xA4, 0xAB, 0x7A, 0x78, 0xCB, 0x08, 0x65, + 0x58, 0x13, 0x6F, 0x3D, 0x78, 0x92, 0xC4, 0x54, 0x16, 0x58, + 0x38, 0x27, 0xE6, 0x0F, 0xDA, 0x30 }; #define sizeof_bench_falcon_level5_key (sizeof(bench_falcon_level5_key)) diff --git a/wolfssl/internal.h b/wolfssl/internal.h index 9e89e64b0b3..0df1bd278e2 100644 --- a/wolfssl/internal.h +++ b/wolfssl/internal.h @@ -1767,9 +1767,9 @@ enum Misc { /* These values for falcon match what OQS has defined. */ FALCON_LEVEL1_SA_MAJOR = 0xFE, - FALCON_LEVEL1_SA_MINOR = 0xAE, + FALCON_LEVEL1_SA_MINOR = 0xD7, FALCON_LEVEL5_SA_MAJOR = 0xFE, - FALCON_LEVEL5_SA_MINOR = 0xB1, + FALCON_LEVEL5_SA_MINOR = 0xDA, /* these values for MLDSA (Dilithium) correspond to what is proposed in the * IETF. */ diff --git a/wolfssl/ssl.h b/wolfssl/ssl.h index 236515157b4..3d6efb726ce 100644 --- a/wolfssl/ssl.h +++ b/wolfssl/ssl.h @@ -1037,7 +1037,7 @@ enum SNICbReturn { /* Maximum master key length (SECRET_LEN) */ #define WOLFSSL_MAX_MASTER_KEY_LENGTH 48 /* Maximum number of groups that can be set */ -#ifdef HAVE_PQC +#ifdef WOLFSSL_HAVE_MLKEM #define WOLFSSL_MAX_GROUP_COUNT 36 #else #define WOLFSSL_MAX_GROUP_COUNT 10 @@ -4766,7 +4766,7 @@ enum { WOLFSSL_FFDHE_8192 = 260, WOLFSSL_FFDHE_END = 511, -#ifdef HAVE_PQC +#ifdef WOLFSSL_HAVE_MLKEM #ifdef WOLFSSL_MLKEM_KYBER /* Old code points to keep compatibility with Kyber Round 3. @@ -4816,7 +4816,7 @@ enum { WOLFSSL_X25519MLKEM512 = 12214, WOLFSSL_X448MLKEM768 = 12215, #endif /* WOLFSSL_NO_ML_KEM */ -#endif /* HAVE_PQC */ +#endif /* WOLFSSL_HAVE_MLKEM */ WOLF_ENUM_DUMMY_LAST_ELEMENT(SSL_H) }; diff --git a/wolfssl/wolfcrypt/cryptocb.h b/wolfssl/wolfcrypt/cryptocb.h index 710b522b9e7..a9fb827e597 100644 --- a/wolfssl/wolfcrypt/cryptocb.h +++ b/wolfssl/wolfcrypt/cryptocb.h @@ -78,12 +78,7 @@ #include #endif #ifdef WOLFSSL_HAVE_MLKEM - #include -#ifdef WOLFSSL_WC_MLKEM #include -#elif defined(HAVE_LIBOQS) - #include -#endif #endif #if defined(HAVE_DILITHIUM) #include diff --git a/wolfssl/wolfcrypt/dilithium.h b/wolfssl/wolfcrypt/dilithium.h index 07eee8c6a47..fdac7d82212 100644 --- a/wolfssl/wolfcrypt/dilithium.h +++ b/wolfssl/wolfcrypt/dilithium.h @@ -37,11 +37,6 @@ #if defined(HAVE_DILITHIUM) -#ifdef HAVE_LIBOQS -#include -#include -#endif - #if defined(WOLFSSL_DILITHIUM_NO_MAKE_KEY) && \ defined(WOLFSSL_DILITHIUM_NO_SIGN) && \ !defined(WOLFSSL_DILITHIUM_NO_VERIFY) && \ @@ -73,12 +68,10 @@ #define WOLFSSL_DILITHIUM_CHECK_KEY #endif -#ifdef WOLFSSL_WC_DILITHIUM - #include +#include #ifndef WOLFSSL_DILITHIUM_VERIFY_ONLY #include #endif -#endif #if defined(WC_DILITHIUM_CACHE_PRIV_VECTORS) && \ !defined(WC_DILITHIUM_CACHE_MATRIX_A) @@ -95,8 +88,6 @@ /* Macros Definitions */ -#ifdef WOLFSSL_WC_DILITHIUM - #ifndef WOLFSSL_DILITHIUM_ALIGNMENT #if defined(__arch64__) #define WOLFSSL_DILITHIUM_ALIGNMENT 8 @@ -589,100 +580,6 @@ #endif -#elif defined(HAVE_LIBOQS) - -#define DILITHIUM_LEVEL2_KEY_SIZE OQS_SIG_ml_dsa_44_ipd_length_secret_key -#define DILITHIUM_LEVEL2_SIG_SIZE OQS_SIG_ml_dsa_44_ipd_length_signature -#define DILITHIUM_LEVEL2_PUB_KEY_SIZE OQS_SIG_ml_dsa_44_ipd_length_public_key -#define DILITHIUM_LEVEL2_PRV_KEY_SIZE \ - (DILITHIUM_LEVEL2_PUB_KEY_SIZE+DILITHIUM_LEVEL2_KEY_SIZE) -/* Buffer sizes large enough to store exported DER encoded keys */ -#define DILITHIUM_LEVEL2_PUB_KEY_DER_SIZE 1334 -#define DILITHIUM_LEVEL2_PRV_KEY_DER_SIZE 2588 -#define DILITHIUM_LEVEL2_BOTH_KEY_DER_SIZE 3904 -/* PEM size with the header "-----BEGIN PRIVATE KEY-----" and - * the footer "-----END PRIVATE KEY-----" */ -#define DILITHIUM_LEVEL2_BOTH_KEY_PEM_SIZE 5344 - -#define DILITHIUM_LEVEL3_KEY_SIZE OQS_SIG_ml_dsa_65_ipd_length_secret_key -#define DILITHIUM_LEVEL3_SIG_SIZE OQS_SIG_ml_dsa_65_ipd_length_signature -#define DILITHIUM_LEVEL3_PUB_KEY_SIZE OQS_SIG_ml_dsa_65_ipd_length_public_key -#define DILITHIUM_LEVEL3_PRV_KEY_SIZE \ - (DILITHIUM_LEVEL3_PUB_KEY_SIZE+DILITHIUM_LEVEL3_KEY_SIZE) -/* Buffer sizes large enough to store exported DER encoded keys */ -#define DILITHIUM_LEVEL3_PUB_KEY_DER_SIZE 1974 -#define DILITHIUM_LEVEL3_PRV_KEY_DER_SIZE 4060 -#define DILITHIUM_LEVEL3_BOTH_KEY_DER_SIZE 6016 -/* PEM size with the header "-----BEGIN PRIVATE KEY-----" and - * the footer "-----END PRIVATE KEY-----" */ -#define DILITHIUM_LEVEL3_BOTH_KEY_PEM_SIZE 8204 - -#define DILITHIUM_LEVEL5_KEY_SIZE OQS_SIG_ml_dsa_87_ipd_length_secret_key -#define DILITHIUM_LEVEL5_SIG_SIZE OQS_SIG_ml_dsa_87_ipd_length_signature -#define DILITHIUM_LEVEL5_PUB_KEY_SIZE OQS_SIG_ml_dsa_87_ipd_length_public_key -#define DILITHIUM_LEVEL5_PRV_KEY_SIZE \ - (DILITHIUM_LEVEL5_PUB_KEY_SIZE+DILITHIUM_LEVEL5_KEY_SIZE) -/* Buffer sizes large enough to store exported DER encoded keys */ -#define DILITHIUM_LEVEL5_PUB_KEY_DER_SIZE 2614 -#define DILITHIUM_LEVEL5_PRV_KEY_DER_SIZE 4924 -#define DILITHIUM_LEVEL5_BOTH_KEY_DER_SIZE 7520 -/* PEM size with the header "-----BEGIN ML_DSA_LEVEL5 PRIVATE KEY-----" and - * the footer "-----END ML_DSA_LEVEL5 PRIVATE KEY-----" */ -#define DILITHIUM_LEVEL5_BOTH_KEY_PEM_SIZE 10267 - -#define ML_DSA_LEVEL2_KEY_SIZE OQS_SIG_ml_dsa_44_ipd_length_secret_key -#define ML_DSA_LEVEL2_SIG_SIZE OQS_SIG_ml_dsa_44_ipd_length_signature -#define ML_DSA_LEVEL2_PUB_KEY_SIZE OQS_SIG_ml_dsa_44_ipd_length_public_key -#define ML_DSA_LEVEL2_PRV_KEY_SIZE \ - (ML_DSA_LEVEL2_PUB_KEY_SIZE+ML_DSA_LEVEL2_KEY_SIZE) -/* Buffer sizes large enough to store exported DER encoded keys */ -#define ML_DSA_LEVEL2_PUB_KEY_DER_SIZE DILITHIUM_LEVEL2_PUB_KEY_DER_SIZE -#define ML_DSA_LEVEL2_PRV_KEY_DER_SIZE DILITHIUM_LEVEL2_PRV_KEY_DER_SIZE -#define ML_DSA_LEVEL2_BOTH_KEY_DER_SIZE DILITHIUM_LEVEL2_BOTH_KEY_DER_SIZE -/* PEM size with the header "-----BEGIN PRIVATE KEY-----" and - * the footer "-----END PRIVATE KEY-----" */ -#define ML_DSA_LEVEL2_BOTH_KEY_PEM_SIZE DILITHIUM_LEVEL2_BOTH_KEY_PEM_SIZE - -#define ML_DSA_LEVEL3_KEY_SIZE OQS_SIG_ml_dsa_65_ipd_length_secret_key -#define ML_DSA_LEVEL3_SIG_SIZE OQS_SIG_ml_dsa_65_ipd_length_signature -#define ML_DSA_LEVEL3_PUB_KEY_SIZE OQS_SIG_ml_dsa_65_ipd_length_public_key -#define ML_DSA_LEVEL3_PRV_KEY_SIZE \ - (ML_DSA_LEVEL3_PUB_KEY_SIZE+ML_DSA_LEVEL3_KEY_SIZE) -/* Buffer sizes large enough to store exported DER encoded keys */ -#define ML_DSA_LEVEL3_PUB_KEY_DER_SIZE DILITHIUM_LEVEL3_PUB_KEY_DER_SIZE -#define ML_DSA_LEVEL3_PRV_KEY_DER_SIZE DILITHIUM_LEVEL3_PRV_KEY_DER_SIZE -#define ML_DSA_LEVEL3_BOTH_KEY_DER_SIZE DILITHIUM_LEVEL3_BOTH_KEY_DER_SIZE -/* PEM size with the header "-----BEGIN PRIVATE KEY-----" and - * the footer "-----END PRIVATE KEY-----" */ -#define ML_DSA_LEVEL3_BOTH_KEY_PEM_SIZE DILITHIUM_LEVEL3_BOTH_KEY_PEM_SIZE - -#define ML_DSA_LEVEL5_KEY_SIZE OQS_SIG_ml_dsa_87_ipd_length_secret_key -#define ML_DSA_LEVEL5_SIG_SIZE OQS_SIG_ml_dsa_87_ipd_length_signature -#define ML_DSA_LEVEL5_PUB_KEY_SIZE OQS_SIG_ml_dsa_87_ipd_length_public_key -#define ML_DSA_LEVEL5_PRV_KEY_SIZE \ - (ML_DSA_LEVEL5_PUB_KEY_SIZE+ML_DSA_LEVEL5_KEY_SIZE) -/* Buffer sizes large enough to store exported DER encoded keys */ -#define ML_DSA_LEVEL5_PUB_KEY_DER_SIZE DILITHIUM_LEVEL5_PUB_KEY_DER_SIZE -#define ML_DSA_LEVEL5_PRV_KEY_DER_SIZE DILITHIUM_LEVEL5_PRV_KEY_DER_SIZE -#define ML_DSA_LEVEL5_BOTH_KEY_DER_SIZE DILITHIUM_LEVEL5_BOTH_KEY_DER_SIZE -/* PEM size with the header "-----BEGIN ML_DSA_LEVEL5 PRIVATE KEY-----" and - * the footer "-----END ML_DSA_LEVEL5 PRIVATE KEY-----" */ -#define ML_DSA_LEVEL5_BOTH_KEY_PEM_SIZE DILITHIUM_LEVEL5_BOTH_KEY_PEM_SIZE - -#define DILITHIUM_MAX_KEY_SIZE DILITHIUM_LEVEL5_KEY_SIZE -#define DILITHIUM_MAX_SIG_SIZE DILITHIUM_LEVEL5_SIG_SIZE -#define DILITHIUM_MAX_PUB_KEY_SIZE DILITHIUM_LEVEL5_PUB_KEY_SIZE -#define DILITHIUM_MAX_PRV_KEY_SIZE DILITHIUM_LEVEL5_PRV_KEY_SIZE -/* Buffer sizes large enough to store exported DER encoded keys */ -#define DILITHIUM_MAX_PUB_KEY_DER_SIZE DILITHIUM_LEVEL5_PUB_KEY_DER_SIZE -#define DILITHIUM_MAX_PRV_KEY_DER_SIZE DILITHIUM_LEVEL5_PRV_KEY_DER_SIZE -#define DILITHIUM_MAX_BOTH_KEY_DER_SIZE DILITHIUM_LEVEL5_BOTH_KEY_DER_SIZE -/* PEM size with the header "-----BEGIN ML_DSA_LEVEL5 PRIVATE KEY-----" and - * the footer "-----END ML_DSA_LEVEL5 PRIVATE KEY-----" */ -#define DILITHIUM_MAX_BOTH_KEY_PEM_SIZE DILITHIUM_LEVEL5_BOTH_KEY_PEM_SIZE - -#endif /* HAVE_LIBOQS */ - #ifdef WOLF_PRIVATE_KEY_ID #define DILITHIUM_MAX_ID_LEN 32 @@ -691,7 +588,6 @@ /* Structs */ -#ifdef WOLFSSL_WC_DILITHIUM typedef struct wc_dilithium_params { byte level; byte k; @@ -714,7 +610,6 @@ typedef struct wc_dilithium_params { word16 pkSz; word16 sigSz; } wc_dilithium_params; -#endif struct dilithium_key { byte pubKeySet; @@ -753,7 +648,6 @@ struct dilithium_key { const byte* k; #endif -#ifdef WOLFSSL_WC_DILITHIUM const wc_dilithium_params* params; wc_Shake shake; #ifndef WC_DILITHIUM_FIXED_ARRAY @@ -801,7 +695,6 @@ struct dilithium_key { byte block[DILITHIUM_GEN_C_BLOCK_BYTES]; #endif /* WOLFSSL_DILITHIUM_VERIFY_NO_MALLOC && * WOLFSSL_DILITHIUM_VERIFY_SMALL_MEM */ -#endif /* WOLFSSL_WC_DILITHIUM */ }; #ifndef WC_DILITHIUMKEY_TYPE_DEFINED diff --git a/wolfssl/wolfcrypt/ext_mlkem.h b/wolfssl/wolfcrypt/ext_mlkem.h deleted file mode 100644 index 02ac3bd2d73..00000000000 --- a/wolfssl/wolfcrypt/ext_mlkem.h +++ /dev/null @@ -1,74 +0,0 @@ -/* ext_mlkem.h - * - * Copyright (C) 2006-2026 wolfSSL Inc. - * - * This file is part of wolfSSL. - * - * wolfSSL is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 3 of the License, or - * (at your option) any later version. - * - * wolfSSL is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA - */ - -#ifndef EXT_KYBER_H -#define EXT_KYBER_H - -#ifdef WOLF_CRYPTO_CB - #include -#endif - -#ifdef WOLFSSL_HAVE_MLKEM -#include - -#if !defined(HAVE_LIBOQS) -#error "This code requires liboqs" -#endif - -#if defined(WOLFSSL_WC_MLKEM) -#error "This code is incompatible with wolfCrypt's implementation of Kyber." -#endif - -#if defined (HAVE_LIBOQS) - #include - - #ifndef WOLFSSL_NO_ML_KEM - #define EXT_KYBER_MAX_PRIV_SZ OQS_KEM_ml_kem_1024_length_secret_key - #define EXT_KYBER_MAX_PUB_SZ OQS_KEM_ml_kem_1024_length_public_key - #elif defined(WOLFSSL_MLKEM_KYBER) - #define EXT_KYBER_MAX_PRIV_SZ OQS_KEM_kyber_1024_length_secret_key - #define EXT_KYBER_MAX_PUB_SZ OQS_KEM_kyber_1024_length_public_key - #endif -#endif - -struct KyberKey { - /* Type of key: KYBER_LEVEL1 - * KYBER_LEVEL3 - * KYBER_LEVEL5 - * - * Note we don't save the variant (SHAKE vs AES) as that is decided at - * configuration time. */ - int type; - -#ifdef WOLF_CRYPTO_CB - void* devCtx; - int devId; -#endif - - byte priv[EXT_KYBER_MAX_PRIV_SZ]; - byte pub[EXT_KYBER_MAX_PUB_SZ]; -}; - -#if defined (HAVE_LIBOQS) -WOLFSSL_LOCAL int ext_mlkem_enabled(int id); -#endif -#endif /* WOLFSSL_HAVE_MLKEM */ -#endif /* EXT_KYBER_H */ diff --git a/wolfssl/wolfcrypt/falcon.h b/wolfssl/wolfcrypt/falcon.h index 06ded4d6c1e..e5a2ae3d38f 100644 --- a/wolfssl/wolfcrypt/falcon.h +++ b/wolfssl/wolfcrypt/falcon.h @@ -35,7 +35,7 @@ #include #endif -#if defined(HAVE_PQC) && defined(HAVE_FALCON) +#if defined(HAVE_FALCON) #ifdef HAVE_LIBOQS #include @@ -176,5 +176,5 @@ WOLFSSL_API int wc_Falcon_PublicKeyToDer(falcon_key* key, byte* output, } /* extern "C" */ #endif -#endif /* HAVE_PQC && HAVE_FALCON */ +#endif /* HAVE_FALCON */ #endif /* WOLF_CRYPT_FALCON_H */ diff --git a/wolfssl/wolfcrypt/include.am b/wolfssl/wolfcrypt/include.am index 1c23469d206..6281432b4a2 100644 --- a/wolfssl/wolfcrypt/include.am +++ b/wolfssl/wolfcrypt/include.am @@ -77,9 +77,7 @@ nobase_include_HEADERS+= \ wolfssl/wolfcrypt/siphash.h \ wolfssl/wolfcrypt/cpuid.h \ wolfssl/wolfcrypt/cryptocb.h \ - wolfssl/wolfcrypt/mlkem.h \ wolfssl/wolfcrypt/wc_mlkem.h \ - wolfssl/wolfcrypt/ext_mlkem.h \ wolfssl/wolfcrypt/sm2.h \ wolfssl/wolfcrypt/sm3.h \ wolfssl/wolfcrypt/sm4.h \ diff --git a/wolfssl/wolfcrypt/mlkem.h b/wolfssl/wolfcrypt/mlkem.h deleted file mode 100644 index 4c185482b87..00000000000 --- a/wolfssl/wolfcrypt/mlkem.h +++ /dev/null @@ -1,390 +0,0 @@ -/* mlkem.h - * - * Copyright (C) 2006-2026 wolfSSL Inc. - * - * This file is part of wolfSSL. - * - * wolfSSL is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 3 of the License, or - * (at your option) any later version. - * - * wolfSSL is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA - */ - -/*! - \file wolfssl/wolfcrypt/mlkem.h - */ - -#ifndef WOLF_CRYPT_MLKEM_H -#define WOLF_CRYPT_MLKEM_H - -#include -#include - -#ifdef WOLFSSL_HAVE_MLKEM - -/* Number of co-efficients in polynomial. */ -#define MLKEM_N 256 - -/* Define algorithm type when not excluded. */ -#ifndef WOLFSSL_NO_ML_KEM - #if !defined(WOLFSSL_NO_ML_KEM_512) - #define WOLFSSL_WC_ML_KEM_512 - #endif - #if !defined(WOLFSSL_NO_ML_KEM_768) - #define WOLFSSL_WC_ML_KEM_768 - #endif - #if !defined(WOLFSSL_NO_ML_KEM_1024) - #define WOLFSSL_WC_ML_KEM_1024 - #endif - - #if !defined(WOLFSSL_WC_ML_KEM_512) && !defined(WOLFSSL_WC_ML_KEM_768) && \ - !defined(WOLFSSL_WC_ML_KEM_1024) - #error "No ML-KEM key size chosen." - #endif -#endif - -#ifdef WOLFSSL_MLKEM_KYBER - #ifndef WOLFSSL_NO_KYBER512 - #define WOLFSSL_KYBER512 - #define WOLFSSL_WC_ML_KEM_512 - #endif - #ifndef WOLFSSL_NO_KYBER768 - #define WOLFSSL_KYBER768 - #define WOLFSSL_WC_ML_KEM_768 - #endif - #ifndef WOLFSSL_NO_KYBER1024 - #define WOLFSSL_KYBER1024 - #define WOLFSSL_WC_ML_KEM_1024 - #endif - - #if !defined(WOLFSSL_KYBER512) && !defined(WOLFSSL_KYBER768) && \ - !defined(WOLFSSL_KYBER1024) - #error "No Kyber key size chosen." - #endif -#endif - -/* Size of a polynomial vector based on dimensions. */ -#define MLKEM_POLY_VEC_SZ(k) ((k) * WC_ML_KEM_POLY_SIZE) -/* Size of a compressed polynomial based on bits per coefficient. */ -#define MLKEM_POLY_COMPRESSED_SZ(b) ((b) * (MLKEM_N / 8)) -/* Size of a compressed vector polynomial based on dimensions and bits per - * coefficient. */ -#define MLKEM_POLY_VEC_COMPRESSED_SZ(k, b) ((k) * ((b) * (MLKEM_N / 8))) - -#ifdef WOLFSSL_WC_ML_KEM_512 -#define WC_ML_KEM_512_K 2 -/* Size of a polynomial vector. */ -#define WC_ML_KEM_512_POLY_VEC_SZ MLKEM_POLY_VEC_SZ(WC_ML_KEM_512_K) -/* Size of a compressed polynomial based on bits per coefficient. */ -#define WC_ML_KEM_512_POLY_COMPRESSED_SZ MLKEM_POLY_COMPRESSED_SZ(4) -/* Size of a compressed vector polynomial based on dimensions and bits per - * coefficient. */ -#define WC_ML_KEM_512_POLY_VEC_COMPRESSED_SZ \ - MLKEM_POLY_VEC_COMPRESSED_SZ(WC_ML_KEM_512_K, 10) - -/* Public key size. */ -#define WC_ML_KEM_512_PUBLIC_KEY_SIZE \ - (WC_ML_KEM_512_POLY_VEC_SZ + WC_ML_KEM_SYM_SZ) -/* Private key size. */ -#define WC_ML_KEM_512_PRIVATE_KEY_SIZE \ - (WC_ML_KEM_512_POLY_VEC_SZ + WC_ML_KEM_512_PUBLIC_KEY_SIZE + \ - 2 * WC_ML_KEM_SYM_SZ) -/* Cipher text size. */ -#define WC_ML_KEM_512_CIPHER_TEXT_SIZE \ - (WC_ML_KEM_512_POLY_VEC_COMPRESSED_SZ + WC_ML_KEM_512_POLY_COMPRESSED_SZ) -#endif - -#ifdef WOLFSSL_WC_ML_KEM_768 -#define WC_ML_KEM_768_K 3 - -/* Size of a polynomial vector. */ -#define WC_ML_KEM_768_POLY_VEC_SZ MLKEM_POLY_VEC_SZ(WC_ML_KEM_768_K) -/* Size of a compressed polynomial based on bits per coefficient. */ -#define WC_ML_KEM_768_POLY_COMPRESSED_SZ MLKEM_POLY_COMPRESSED_SZ(4) -/* Size of a compressed vector polynomial based on dimensions and bits per - * coefficient. */ -#define WC_ML_KEM_768_POLY_VEC_COMPRESSED_SZ \ - MLKEM_POLY_VEC_COMPRESSED_SZ(WC_ML_KEM_768_K, 10) - -/* Public key size. */ -#define WC_ML_KEM_768_PUBLIC_KEY_SIZE \ - (WC_ML_KEM_768_POLY_VEC_SZ + WC_ML_KEM_SYM_SZ) -/* Private key size. */ -#define WC_ML_KEM_768_PRIVATE_KEY_SIZE \ - (WC_ML_KEM_768_POLY_VEC_SZ + WC_ML_KEM_768_PUBLIC_KEY_SIZE + \ - 2 * WC_ML_KEM_SYM_SZ) -/* Cipher text size. */ -#define WC_ML_KEM_768_CIPHER_TEXT_SIZE \ - (WC_ML_KEM_768_POLY_VEC_COMPRESSED_SZ + WC_ML_KEM_768_POLY_COMPRESSED_SZ) -#endif - -#ifdef WOLFSSL_WC_ML_KEM_1024 -#define WC_ML_KEM_1024_K 4 - -/* Size of a polynomial vector. */ -#define WC_ML_KEM_1024_POLY_VEC_SZ MLKEM_POLY_VEC_SZ(WC_ML_KEM_1024_K) -/* Size of a compressed polynomial based on bits per coefficient. */ -#define WC_ML_KEM_1024_POLY_COMPRESSED_SZ MLKEM_POLY_COMPRESSED_SZ(5) -/* Size of a compressed vector polynomial based on dimensions and bits per - * coefficient. */ -#define WC_ML_KEM_1024_POLY_VEC_COMPRESSED_SZ \ - MLKEM_POLY_VEC_COMPRESSED_SZ(WC_ML_KEM_1024_K, 11) - -/* Public key size. */ -#define WC_ML_KEM_1024_PUBLIC_KEY_SIZE \ - (WC_ML_KEM_1024_POLY_VEC_SZ + WC_ML_KEM_SYM_SZ) -/* Private key size. */ -#define WC_ML_KEM_1024_PRIVATE_KEY_SIZE \ - (WC_ML_KEM_1024_POLY_VEC_SZ + WC_ML_KEM_1024_PUBLIC_KEY_SIZE + \ - 2 * WC_ML_KEM_SYM_SZ) -/* Cipher text size. */ -#define WC_ML_KEM_1024_CIPHER_TEXT_SIZE \ - (WC_ML_KEM_1024_POLY_VEC_COMPRESSED_SZ + WC_ML_KEM_1024_POLY_COMPRESSED_SZ) -#endif - -#ifndef WC_ML_KEM_MAX_K -#ifdef WOLFSSL_WC_ML_KEM_1024 -#define WC_ML_KEM_MAX_K WC_ML_KEM_1024_K -#define WC_ML_KEM_MAX_PRIVATE_KEY_SIZE WC_ML_KEM_1024_PRIVATE_KEY_SIZE -#define WC_ML_KEM_MAX_PUBLIC_KEY_SIZE WC_ML_KEM_1024_PUBLIC_KEY_SIZE -#define WC_ML_KEM_MAX_CIPHER_TEXT_SIZE WC_ML_KEM_1024_CIPHER_TEXT_SIZE -#elif defined(WOLFSSL_WC_ML_KEM_768) -#define WC_ML_KEM_MAX_K WC_ML_KEM_768_K -#define WC_ML_KEM_MAX_PRIVATE_KEY_SIZE WC_ML_KEM_768_PRIVATE_KEY_SIZE -#define WC_ML_KEM_MAX_PUBLIC_KEY_SIZE WC_ML_KEM_768_PUBLIC_KEY_SIZE -#define WC_ML_KEM_MAX_CIPHER_TEXT_SIZE WC_ML_KEM_768_CIPHER_TEXT_SIZE -#elif defined(WOLFSSL_WC_ML_KEM_512) -#define WC_ML_KEM_MAX_K WC_ML_KEM_512_K -#define WC_ML_KEM_MAX_PRIVATE_KEY_SIZE WC_ML_KEM_512_PRIVATE_KEY_SIZE -#define WC_ML_KEM_MAX_PUBLIC_KEY_SIZE WC_ML_KEM_512_PUBLIC_KEY_SIZE -#define WC_ML_KEM_MAX_CIPHER_TEXT_SIZE WC_ML_KEM_512_CIPHER_TEXT_SIZE -#endif -#endif /* WC_ML_KEM_MAX_K */ - -#define KYBER_N MLKEM_N - -/* Size of a polynomial vector based on dimensions. */ -#define KYBER_POLY_VEC_SZ(k) ((k) * KYBER_POLY_SIZE) -/* Size of a compressed polynomial based on bits per coefficient. */ -#define KYBER_POLY_COMPRESSED_SZ(b) ((b) * (KYBER_N / 8)) -/* Size of a compressed vector polynomial based on dimensions and bits per - * coefficient. */ -#define KYBER_POLY_VEC_COMPRESSED_SZ(k, b) ((k) * ((b) * (KYBER_N / 8))) - - -/* Kyber-512 parameters */ -/* Number of polynomials in a vector and vectors in a matrix. */ -#define KYBER512_K 2 - -/* Size of a polynomial vector. */ -#define KYBER512_POLY_VEC_SZ KYBER_POLY_VEC_SZ(KYBER512_K) -/* Size of a compressed polynomial based on bits per coefficient. */ -#define KYBER512_POLY_COMPRESSED_SZ KYBER_POLY_COMPRESSED_SZ(4) -/* Size of a compressed vector polynomial based on dimensions and bits per - * coefficient. */ -#define KYBER512_POLY_VEC_COMPRESSED_SZ \ - KYBER_POLY_VEC_COMPRESSED_SZ(KYBER512_K, 10) - -/* Public key size. */ -#define KYBER512_PUBLIC_KEY_SIZE \ - (KYBER512_POLY_VEC_SZ + KYBER_SYM_SZ) -/* Private key size. */ -#define KYBER512_PRIVATE_KEY_SIZE \ - (KYBER512_POLY_VEC_SZ + KYBER512_PUBLIC_KEY_SIZE + 2 * KYBER_SYM_SZ) -/* Cipher text size. */ -#define KYBER512_CIPHER_TEXT_SIZE \ - (KYBER512_POLY_VEC_COMPRESSED_SZ + KYBER512_POLY_COMPRESSED_SZ) - -/* Kyber-768 parameters */ -/* Number of polynomials in a vector and vectors in a matrix. */ -#define KYBER768_K 3 - -/* Size of a polynomial vector. */ -#define KYBER768_POLY_VEC_SZ KYBER_POLY_VEC_SZ(KYBER768_K) -/* Size of a compressed polynomial based on bits per coefficient. */ -#define KYBER768_POLY_COMPRESSED_SZ KYBER_POLY_COMPRESSED_SZ(4) -/* Size of a compressed vector polynomial based on dimensions and bits per - * coefficient. */ -#define KYBER768_POLY_VEC_COMPRESSED_SZ \ - KYBER_POLY_VEC_COMPRESSED_SZ(KYBER768_K, 10) - -/* Public key size. */ -#define KYBER768_PUBLIC_KEY_SIZE \ - (KYBER768_POLY_VEC_SZ + KYBER_SYM_SZ) -/* Private key size. */ -#define KYBER768_PRIVATE_KEY_SIZE \ - (KYBER768_POLY_VEC_SZ + KYBER768_PUBLIC_KEY_SIZE + 2 * KYBER_SYM_SZ) -/* Cipher text size. */ -#define KYBER768_CIPHER_TEXT_SIZE \ - (KYBER768_POLY_VEC_COMPRESSED_SZ + KYBER768_POLY_COMPRESSED_SZ) - -/* Kyber-1024 parameters */ -/* Number of polynomials in a vector and vectors in a matrix. */ -#define KYBER1024_K 4 - -/* Size of a polynomial vector. */ -#define KYBER1024_POLY_VEC_SZ KYBER_POLY_VEC_SZ(KYBER1024_K) -/* Size of a compressed polynomial based on bits per coefficient. */ -#define KYBER1024_POLY_COMPRESSED_SZ KYBER_POLY_COMPRESSED_SZ(5) -/* Size of a compressed vector polynomial based on dimensions and bits per - * coefficient. */ -#define KYBER1024_POLY_VEC_COMPRESSED_SZ \ - KYBER_POLY_VEC_COMPRESSED_SZ(KYBER1024_K, 11) - -/* Public key size. */ -#define KYBER1024_PUBLIC_KEY_SIZE \ - (KYBER1024_POLY_VEC_SZ + KYBER_SYM_SZ) -/* Private key size. */ -#define KYBER1024_PRIVATE_KEY_SIZE \ - (KYBER1024_POLY_VEC_SZ + KYBER1024_PUBLIC_KEY_SIZE + 2 * KYBER_SYM_SZ) -/* Cipher text size. */ -#define KYBER1024_CIPHER_TEXT_SIZE \ - (KYBER1024_POLY_VEC_COMPRESSED_SZ + KYBER1024_POLY_COMPRESSED_SZ) - - -/* Maximum dimensions and sizes of supported key types. */ -#ifdef WOLFSSL_KYBER1024 -#define KYBER_MAX_K KYBER1024_K -#define KYBER_MAX_PRIVATE_KEY_SIZE KYBER1024_PRIVATE_KEY_SIZE -#define KYBER_MAX_PUBLIC_KEY_SIZE KYBER1024_PUBLIC_KEY_SIZE -#define KYBER_MAX_CIPHER_TEXT_SIZE KYBER1024_CIPHER_TEXT_SIZE -#elif defined(WOLFSSL_KYBER768) -#define KYBER_MAX_K KYBER768_K -#define KYBER_MAX_PRIVATE_KEY_SIZE KYBER768_PRIVATE_KEY_SIZE -#define KYBER_MAX_PUBLIC_KEY_SIZE KYBER768_PUBLIC_KEY_SIZE -#define KYBER_MAX_CIPHER_TEXT_SIZE KYBER768_CIPHER_TEXT_SIZE -#elif defined(WOLFSSL_KYBER512) -#define KYBER_MAX_K KYBER512_K -#define KYBER_MAX_PRIVATE_KEY_SIZE KYBER512_PRIVATE_KEY_SIZE -#define KYBER_MAX_PUBLIC_KEY_SIZE KYBER512_PUBLIC_KEY_SIZE -#define KYBER_MAX_CIPHER_TEXT_SIZE KYBER512_CIPHER_TEXT_SIZE -#endif - -#define KYBER_SYM_SZ WC_ML_KEM_SYM_SZ -#define KYBER_SS_SZ WC_ML_KEM_SS_SZ -#define KYBER_MAKEKEY_RAND_SZ WC_ML_KEM_MAKEKEY_RAND_SZ -#define KYBER_ENC_RAND_SZ WC_ML_KEM_ENC_RAND_SZ -#define KYBER_POLY_SIZE WC_ML_KEM_POLY_SIZE - - -enum { - /* Types of Kyber keys. */ - WC_ML_KEM_512 = 0, - WC_ML_KEM_768 = 1, - WC_ML_KEM_1024 = 2, - - MLKEM_KYBER = 0x10, - KYBER512 = 0 | MLKEM_KYBER, - KYBER768 = 1 | MLKEM_KYBER, - KYBER1024 = 2 | MLKEM_KYBER, - - KYBER_LEVEL1 = KYBER512, - KYBER_LEVEL3 = KYBER768, - KYBER_LEVEL5 = KYBER1024, - - /* Symmetric data size. */ - WC_ML_KEM_SYM_SZ = 32, - /* Shared secret size. */ - WC_ML_KEM_SS_SZ = 32, - /* Size of random required for making a key. */ - WC_ML_KEM_MAKEKEY_RAND_SZ = 2 * WC_ML_KEM_SYM_SZ, - /* Size of random required for encapsulation. */ - WC_ML_KEM_ENC_RAND_SZ = WC_ML_KEM_SYM_SZ, - - /* Encoded polynomial size. */ - WC_ML_KEM_POLY_SIZE = 384 -}; - -#ifdef WOLF_PRIVATE_KEY_ID - #define MLKEM_MAX_ID_LEN 32 - #define MLKEM_MAX_LABEL_LEN 32 -#endif - -/* Different structures for different implementations. */ -typedef struct MlKemKey MlKemKey; - - -#ifdef __cplusplus - extern "C" { -#endif - -WOLFSSL_API MlKemKey* wc_MlKemKey_New(int type, void* heap, int devId); -WOLFSSL_API int wc_MlKemKey_Delete(MlKemKey* key, MlKemKey** key_p); - -WOLFSSL_API int wc_MlKemKey_Init(MlKemKey* key, int type, void* heap, - int devId); -WOLFSSL_API int wc_MlKemKey_Free(MlKemKey* key); -#if defined(WOLF_PRIVATE_KEY_ID) && defined(WOLFSSL_WC_MLKEM) -WOLFSSL_API int wc_MlKemKey_Init_Id(MlKemKey* key, int type, - const unsigned char* id, int len, void* heap, int devId); -WOLFSSL_API int wc_MlKemKey_Init_Label(MlKemKey* key, int type, - const char* label, void* heap, int devId); -#endif - -WOLFSSL_API int wc_MlKemKey_MakeKey(MlKemKey* key, WC_RNG* rng); -WOLFSSL_API int wc_MlKemKey_MakeKeyWithRandom(MlKemKey* key, - const unsigned char* rand, int len); - -WOLFSSL_API int wc_MlKemKey_CipherTextSize(MlKemKey* key, word32* len); -WOLFSSL_API int wc_MlKemKey_SharedSecretSize(MlKemKey* key, word32* len); - -WOLFSSL_API int wc_MlKemKey_Encapsulate(MlKemKey* key, unsigned char* ct, - unsigned char* ss, WC_RNG* rng); -WOLFSSL_API int wc_MlKemKey_EncapsulateWithRandom(MlKemKey* key, - unsigned char* ct, unsigned char* ss, const unsigned char* rand, int len); -WOLFSSL_API int wc_MlKemKey_Decapsulate(MlKemKey* key, unsigned char* ss, - const unsigned char* ct, word32 len); - -WOLFSSL_API int wc_MlKemKey_DecodePrivateKey(MlKemKey* key, - const unsigned char* in, word32 len); -WOLFSSL_API int wc_MlKemKey_DecodePublicKey(MlKemKey* key, - const unsigned char* in, word32 len); - -WOLFSSL_API int wc_MlKemKey_PrivateKeySize(MlKemKey* key, word32* len); -WOLFSSL_API int wc_MlKemKey_PublicKeySize(MlKemKey* key, word32* len); -WOLFSSL_API int wc_MlKemKey_EncodePrivateKey(MlKemKey* key, unsigned char* out, - word32 len); -WOLFSSL_API int wc_MlKemKey_EncodePublicKey(MlKemKey* key, unsigned char* out, - word32 len); - - -#define KyberKey MlKemKey - -#define wc_KyberKey_Init(type, key, heap, devId) \ - wc_MlKemKey_Init(key, type, heap, devId) -#define wc_KyberKey_Free wc_MlKemKey_Free -#if defined(WOLF_PRIVATE_KEY_ID) && defined(WOLFSSL_WC_MLKEM) -#define wc_KyberKey_Init_Id wc_MlKemKey_Init_Id -#define wc_KyberKey_Init_Label wc_MlKemKey_Init_Label -#endif -#define wc_KyberKey_MakeKey wc_MlKemKey_MakeKey -#define wc_KyberKey_MakeKeyWithRandom wc_MlKemKey_MakeKeyWithRandom -#define wc_KyberKey_CipherTextSize wc_MlKemKey_CipherTextSize -#define wc_KyberKey_SharedSecretSize wc_MlKemKey_SharedSecretSize -#define wc_KyberKey_Encapsulate wc_MlKemKey_Encapsulate -#define wc_KyberKey_EncapsulateWithRandom wc_MlKemKey_EncapsulateWithRandom -#define wc_KyberKey_Decapsulate wc_MlKemKey_Decapsulate -#define wc_KyberKey_DecodePrivateKey wc_MlKemKey_DecodePrivateKey -#define wc_KyberKey_DecodePublicKey wc_MlKemKey_DecodePublicKey -#define wc_KyberKey_PrivateKeySize wc_MlKemKey_PrivateKeySize -#define wc_KyberKey_PublicKeySize wc_MlKemKey_PublicKeySize -#define wc_KyberKey_EncodePrivateKey wc_MlKemKey_EncodePrivateKey -#define wc_KyberKey_EncodePublicKey wc_MlKemKey_EncodePublicKey - - -#ifdef __cplusplus - } /* extern "C" */ -#endif - -#endif /* WOLFSSL_HAVE_MLKEM */ - -#endif /* WOLF_CRYPT_MLKEM_H */ diff --git a/wolfssl/wolfcrypt/oid_sum.h b/wolfssl/wolfcrypt/oid_sum.h index e1fbee5f44c..67090ac2fe1 100644 --- a/wolfssl/wolfcrypt/oid_sum.h +++ b/wolfssl/wolfcrypt/oid_sum.h @@ -180,10 +180,10 @@ enum Key_Sum { X448k = 255, /* 1.3.101.111 */ /* 0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x03,0x01 */ DHk = 647, /* 1.2.840.113549.1.3.1 */ - /* 0x2b,0xce,0x0f,0x03,0x06 */ - FALCON_LEVEL1k = 273, /* 1.3.9999.3.6 */ - /* 0x2b,0xce,0x0f,0x03,0x09 */ - FALCON_LEVEL5k = 276, /* 1.3.9999.3.9 */ + /* 0x2b,0xce,0x0f,0x03,0x0b */ + FALCON_LEVEL1k = 278, /* 1.3.9999.3.11 */ + /* 0x2b,0xce,0x0f,0x03,0x0e */ + FALCON_LEVEL5k = 279, /* 1.3.9999.3.14 */ /* 0x2b,0x06,0x01,0x04,0x01,0x02,0x82,0x0b,0x0c,0x04,0x04 */ DILITHIUM_LEVEL2k = 218, /* 1.3.6.1.4.1.2.267.12.4.4 */ /* 0x2b,0x06,0x01,0x04,0x01,0x02,0x82,0x0b,0x0c,0x06,0x05 */ @@ -233,10 +233,10 @@ enum Key_Sum { X448k = 0x7f9065d4, /* 1.3.101.111 */ /* 0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x03,0x01 */ DHk = 0x7ab67423, /* 1.2.840.113549.1.3.1 */ - /* 0x2b,0xce,0x0f,0x03,0x06 */ - FALCON_LEVEL1k = 0x7c0f312d, /* 1.3.9999.3.6 */ - /* 0x2b,0xce,0x0f,0x03,0x09 */ - FALCON_LEVEL5k = 0x7c0f3122, /* 1.3.9999.3.9 */ + /* 0x2b,0xce,0x0f,0x03,0x0b */ + FALCON_LEVEL1k = 0x7c0f3120, /* 1.3.9999.3.11 */ + /* 0x2b,0xce,0x0f,0x03,0x0e */ + FALCON_LEVEL5k = 0x7c0f3125, /* 1.3.9999.3.14 */ /* 0x2b,0x06,0x01,0x04,0x01,0x02,0x82,0x0b,0x0c,0x04,0x04 */ DILITHIUM_LEVEL2k = 0x707800d9, /* 1.3.6.1.4.1.2.267.12.4.4 */ /* 0x2b,0x06,0x01,0x04,0x01,0x02,0x82,0x0b,0x0c,0x06,0x05 */ @@ -1556,10 +1556,10 @@ enum Ctc_SigType { CTC_ED25519 = 256, /* 1.3.101.112 */ /* 0x2b,0x65,0x71 */ CTC_ED448 = 257, /* 1.3.101.113 */ - /* 0x2b,0xce,0x0f,0x03,0x06 */ - CTC_FALCON_LEVEL1 = 273, /* 1.3.9999.3.6 */ - /* 0x2b,0xce,0x0f,0x03,0x09 */ - CTC_FALCON_LEVEL5 = 276, /* 1.3.9999.3.9 */ + /* 0x2b,0xce,0x0f,0x03,0x0b */ + CTC_FALCON_LEVEL1 = 278, /* 1.3.9999.3.11 */ + /* 0x2b,0xce,0x0f,0x03,0x0e */ + CTC_FALCON_LEVEL5 = 279, /* 1.3.9999.3.14 */ /* 0x2b,0x06,0x01,0x04,0x01,0x02,0x82,0x0b,0x0c,0x04,0x04 */ CTC_DILITHIUM_LEVEL2 = 218, /* 1.3.6.1.4.1.2.267.12.4.4 */ /* 0x2b,0x06,0x01,0x04,0x01,0x02,0x82,0x0b,0x0c,0x06,0x05 */ @@ -1637,10 +1637,10 @@ enum Ctc_SigType { CTC_ED25519 = 0x7f8f65d4, /* 1.3.101.112 */ /* 0x2b,0x65,0x71 */ CTC_ED448 = 0x7f8e65d4, /* 1.3.101.113 */ - /* 0x2b,0xce,0x0f,0x03,0x06 */ - CTC_FALCON_LEVEL1 = 0x7c0f312d, /* 1.3.9999.3.6 */ - /* 0x2b,0xce,0x0f,0x03,0x09 */ - CTC_FALCON_LEVEL5 = 0x7c0f3122, /* 1.3.9999.3.9 */ + /* 0x2b,0xce,0x0f,0x03,0x0b */ + CTC_FALCON_LEVEL1 = 0x7c0f3120, /* 1.3.9999.3.11 */ + /* 0x2b,0xce,0x0f,0x03,0x0e */ + CTC_FALCON_LEVEL5 = 0x7c0f3125, /* 1.3.9999.3.14 */ /* 0x2b,0x06,0x01,0x04,0x01,0x02,0x82,0x0b,0x0c,0x04,0x04 */ CTC_DILITHIUM_LEVEL2 = 0x707800d9, /* 1.3.6.1.4.1.2.267.12.4.4 */ /* 0x2b,0x06,0x01,0x04,0x01,0x02,0x82,0x0b,0x0c,0x06,0x05 */ @@ -1690,7 +1690,7 @@ enum PKCS7_TYPES { FIRMWARE_PKG_DATA = 685, /* 1.2.840.113549.1.9.16.1.16 */ /* 0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x09,0x10,0x01,0x17 */ AUTH_ENVELOPED_DATA = 692, /* 1.2.840.113549.1.9.16.1.23 */ - /* 0x60,0x86,0x48,0x01,0x65,0x02,0x01,0x02,0x4E,0x02 */ + /* 0x60,0x86,0x48,0x01,0x65,0x02,0x01,0x02,0x4e,0x02 */ ENCRYPTED_KEY_PACKAGE = 489 /* 2.16.840.1.101.2.1.2.78.2 */ #else /* 0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x07 */ @@ -1713,8 +1713,8 @@ enum PKCS7_TYPES { FIRMWARE_PKG_DATA = 0x70a68a32, /* 1.2.840.113549.1.9.16.1.16 */ /* 0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x09,0x10,0x01,0x17 */ AUTH_ENVELOPED_DATA = 0x70a18a32, /* 1.2.840.113549.1.9.16.1.23 */ - /* 0x60,0x86,0x48,0x01,0x65,0x02,0x01,0x02,0x4E,0x02 */ - ENCRYPTED_KEY_PACKAGE = 0x034986B4 /* 2.16.840.1.101.2.1.2.78.2 */ + /* 0x60,0x86,0x48,0x01,0x65,0x02,0x01,0x02,0x4e,0x02 */ + ENCRYPTED_KEY_PACKAGE = 0x034986b4 /* 2.16.840.1.101.2.1.2.78.2 */ #endif }; diff --git a/wolfssl/wolfcrypt/settings.h b/wolfssl/wolfcrypt/settings.h index 63b66d92cdc..ea28cca3842 100644 --- a/wolfssl/wolfcrypt/settings.h +++ b/wolfssl/wolfcrypt/settings.h @@ -928,7 +928,6 @@ #ifdef CONFIG_ESP_WOLFSSL_ENABLE_MLKEM /* Kyber typically needs a minimum 10K stack */ #define WOLFSSL_HAVE_MLKEM - #define WOLFSSL_WC_MLKEM #define WOLFSSL_SHA3 #if defined(CONFIG_IDF_TARGET_ESP8266) /* With limited RAM, we'll disable some of the Kyber sizes: */ @@ -4560,30 +4559,14 @@ extern void uITRON4_free(void *p) ; #endif #endif -#ifdef WOLFSSL_HAVE_MLKEM -#define HAVE_PQC -#endif - -/* Enable Post-Quantum Cryptography if we have liboqs from the OpenQuantumSafe - * group */ -#ifdef HAVE_LIBOQS -#define HAVE_PQC -#define HAVE_FALCON -#ifndef HAVE_DILITHIUM - #define HAVE_DILITHIUM -#endif -#ifndef WOLFSSL_NO_SPHINCS - #define HAVE_SPHINCS -#endif -#ifndef WOLFSSL_HAVE_MLKEM - #define WOLFSSL_HAVE_MLKEM - #define WOLFSSL_KYBER512 - #define WOLFSSL_KYBER768 - #define WOLFSSL_KYBER1024 - #define WOLFSSL_WC_ML_KEM_512 - #define WOLFSSL_WC_ML_KEM_768 - #define WOLFSSL_WC_ML_KEM_1024 +/* Falcon is the only algorithm we still pull from liboqs, so the two options + * go together: Falcon cannot be built without liboqs, and enabling liboqs + * without Falcon leaves nothing for it to do. */ +#if defined(HAVE_LIBOQS) && !defined(HAVE_FALCON) +#error "HAVE_LIBOQS without HAVE_FALCON has no effect; enable Falcon or drop liboqs." #endif +#if defined(HAVE_FALCON) && !defined(HAVE_LIBOQS) +#error "HAVE_FALCON requires HAVE_LIBOQS (enable liboqs via --with-liboqs)." #endif #if (defined(HAVE_LIBOQS) || \ @@ -4595,26 +4578,22 @@ extern void uITRON4_free(void *p) ; #error Experimental settings without WOLFSSL_EXPERIMENTAL_SETTINGS #endif -#if defined(HAVE_PQC) && !defined(HAVE_LIBOQS) && !defined(WOLFSSL_HAVE_MLKEM) -#error Please do not define HAVE_PQC yourself. -#endif - /* If no malloc then make sure the valid Dilithium settings are used */ #if defined(HAVE_DILITHIUM) && defined(WOLFSSL_NO_MALLOC) #undef WOLFSSL_DILITHIUM_VERIFY_NO_MALLOC #define WOLFSSL_DILITHIUM_VERIFY_NO_MALLOC #endif -#if defined(HAVE_PQC) && defined(WOLFSSL_HAVE_MLKEM) && \ +#if defined(WOLFSSL_HAVE_MLKEM) && \ defined(WOLFSSL_DTLS13) && !defined(WOLFSSL_DTLS_CH_FRAG) #define WOLFSSL_DTLS_CH_FRAG -#warning "WOLFSSL_DTLS_CH_FRAG is enabled to support PQC in DTLS 1.3" +#warning "WOLFSSL_DTLS_CH_FRAG is enabled to support ML-KEM in DTLS 1.3" #endif #if !defined(WOLFSSL_DTLS13) && defined(WOLFSSL_DTLS_CH_FRAG) #error "WOLFSSL_DTLS_CH_FRAG only works with DTLS 1.3" #endif -#if defined(HAVE_PQC) && defined(WOLFSSL_HAVE_MLKEM) && \ +#if defined(WOLFSSL_HAVE_MLKEM) && \ !defined(WOLFSSL_NO_ML_KEM) && !defined(WOLFSSL_PQC_HYBRIDS) && \ defined(WOLFSSL_TLS_NO_MLKEM_STANDALONE) && !defined(WOLFCRYPT_ONLY) #error "Neither PQ/T hybrid combinations nor ML-KEM as standalone TLS key " \ @@ -4703,7 +4682,7 @@ extern void uITRON4_free(void *p) ; #if defined(WOLFSSL_SHA3) && \ ((defined(HAVE_FIPS) && FIPS_VERSION_LE(5,2)) || \ (defined(HAVE_SELFTEST) && \ - !defined(WOLFSSL_HAVE_MLKEM) && !defined(WOLFSSL_WC_DILITHIUM))) + !defined(WOLFSSL_HAVE_MLKEM) && !defined(HAVE_DILITHIUM))) #undef WOLFSSL_NO_SHAKE128 #define WOLFSSL_NO_SHAKE128 #undef WOLFSSL_NO_SHAKE256 diff --git a/wolfssl/wolfcrypt/sphincs.h b/wolfssl/wolfcrypt/sphincs.h index a14252278ef..a070baf6641 100644 --- a/wolfssl/wolfcrypt/sphincs.h +++ b/wolfssl/wolfcrypt/sphincs.h @@ -37,7 +37,7 @@ #include -#if defined(HAVE_PQC) && defined(HAVE_SPHINCS) +#if defined(HAVE_SPHINCS) #ifdef HAVE_LIBOQS #include @@ -163,5 +163,5 @@ WOLFSSL_API int wc_Sphincs_PublicKeyToDer(sphincs_key* key, byte* output, } /* extern "C" */ #endif -#endif /* HAVE_PQC && HAVE_SPHINCS */ +#endif /* HAVE_SPHINCS */ #endif /* WOLF_CRYPT_SPHINCS_H */ diff --git a/wolfssl/wolfcrypt/wc_mlkem.h b/wolfssl/wolfcrypt/wc_mlkem.h index 5735acdd98b..9ee90699f81 100644 --- a/wolfssl/wolfcrypt/wc_mlkem.h +++ b/wolfssl/wolfcrypt/wc_mlkem.h @@ -21,8 +21,7 @@ /*! \file wolfssl/wolfcrypt/wc_mlkem.h -*/ - + */ #ifndef WOLF_CRYPT_WC_MLKEM_H #define WOLF_CRYPT_WC_MLKEM_H @@ -30,10 +29,13 @@ #include #include #include -#include #ifdef WOLFSSL_HAVE_MLKEM +#ifdef __cplusplus + extern "C" { +#endif + #ifdef WOLFSSL_KYBER_NO_MAKE_KEY #define WOLFSSL_MLKEM_NO_MAKE_KEY #endif @@ -44,10 +46,292 @@ #define WOLFSSL_MLKEM_NO_DECAPSULATE #endif -#define MLKEM_NOINLINE WC_NO_INLINE +#define MLKEM_NOINLINE WC_NO_INLINE + +/* SHAKE128 rate. */ +#define XOF_BLOCK_SIZE 168 + +/* Modulus of co-efficients of polynomial. */ +#define MLKEM_Q 3329 + +/* Number of co-efficients in polynomial. */ +#define MLKEM_N 256 + +/* Define algorithm type when not excluded. */ +#ifndef WOLFSSL_NO_ML_KEM + #if !defined(WOLFSSL_NO_ML_KEM_512) + #define WOLFSSL_WC_ML_KEM_512 + #endif + #if !defined(WOLFSSL_NO_ML_KEM_768) + #define WOLFSSL_WC_ML_KEM_768 + #endif + #if !defined(WOLFSSL_NO_ML_KEM_1024) + #define WOLFSSL_WC_ML_KEM_1024 + #endif + + #if !defined(WOLFSSL_WC_ML_KEM_512) && !defined(WOLFSSL_WC_ML_KEM_768) && \ + !defined(WOLFSSL_WC_ML_KEM_1024) + #error "No ML-KEM key size chosen." + #endif +#endif + +#ifdef WOLFSSL_MLKEM_KYBER + #ifndef WOLFSSL_NO_KYBER512 + #define WOLFSSL_KYBER512 + #define WOLFSSL_WC_ML_KEM_512 + #endif + #ifndef WOLFSSL_NO_KYBER768 + #define WOLFSSL_KYBER768 + #define WOLFSSL_WC_ML_KEM_768 + #endif + #ifndef WOLFSSL_NO_KYBER1024 + #define WOLFSSL_KYBER1024 + #define WOLFSSL_WC_ML_KEM_1024 + #endif + + #if !defined(WOLFSSL_KYBER512) && !defined(WOLFSSL_KYBER768) && \ + !defined(WOLFSSL_KYBER1024) + #error "No Kyber key size chosen." + #endif +#endif + +/* Size of a polynomial vector based on dimensions. */ +#define MLKEM_POLY_VEC_SZ(k) ((k) * WC_ML_KEM_POLY_SIZE) +/* Size of a compressed polynomial based on bits per coefficient. */ +#define MLKEM_POLY_COMPRESSED_SZ(b) ((b) * (MLKEM_N / 8)) +/* Size of a compressed vector polynomial based on dimensions and bits per + * coefficient. */ +#define MLKEM_POLY_VEC_COMPRESSED_SZ(k, b) ((k) * ((b) * (MLKEM_N / 8))) + +#ifdef WOLFSSL_WC_ML_KEM_512 +#define WC_ML_KEM_512_K 2 +/* Number of bits of random to create noise from. */ +#define WC_ML_KEM_512_ETA1 MLKEM_CBD_ETA3 +/* Size of a polynomial vector. */ +#define WC_ML_KEM_512_POLY_VEC_SZ MLKEM_POLY_VEC_SZ(WC_ML_KEM_512_K) +/* Size of a compressed polynomial based on bits per coefficient. */ +#define WC_ML_KEM_512_POLY_COMPRESSED_SZ MLKEM_POLY_COMPRESSED_SZ(4) +/* Size of a compressed vector polynomial based on dimensions and bits per + * coefficient. */ +#define WC_ML_KEM_512_POLY_VEC_COMPRESSED_SZ \ + MLKEM_POLY_VEC_COMPRESSED_SZ(WC_ML_KEM_512_K, 10) + +/* Public key size. */ +#define WC_ML_KEM_512_PUBLIC_KEY_SIZE \ + (WC_ML_KEM_512_POLY_VEC_SZ + WC_ML_KEM_SYM_SZ) +/* Private key size. */ +#define WC_ML_KEM_512_PRIVATE_KEY_SIZE \ + (WC_ML_KEM_512_POLY_VEC_SZ + WC_ML_KEM_512_PUBLIC_KEY_SIZE + \ + 2 * WC_ML_KEM_SYM_SZ) +/* Cipher text size. */ +#define WC_ML_KEM_512_CIPHER_TEXT_SIZE \ + (WC_ML_KEM_512_POLY_VEC_COMPRESSED_SZ + WC_ML_KEM_512_POLY_COMPRESSED_SZ) +#endif + +#ifdef WOLFSSL_WC_ML_KEM_768 +#define WC_ML_KEM_768_K 3 +/* Number of bits of random to create noise from. */ +#define WC_ML_KEM_768_ETA1 MLKEM_CBD_ETA2 + +/* Size of a polynomial vector. */ +#define WC_ML_KEM_768_POLY_VEC_SZ MLKEM_POLY_VEC_SZ(WC_ML_KEM_768_K) +/* Size of a compressed polynomial based on bits per coefficient. */ +#define WC_ML_KEM_768_POLY_COMPRESSED_SZ MLKEM_POLY_COMPRESSED_SZ(4) +/* Size of a compressed vector polynomial based on dimensions and bits per + * coefficient. */ +#define WC_ML_KEM_768_POLY_VEC_COMPRESSED_SZ \ + MLKEM_POLY_VEC_COMPRESSED_SZ(WC_ML_KEM_768_K, 10) + +/* Public key size. */ +#define WC_ML_KEM_768_PUBLIC_KEY_SIZE \ + (WC_ML_KEM_768_POLY_VEC_SZ + WC_ML_KEM_SYM_SZ) +/* Private key size. */ +#define WC_ML_KEM_768_PRIVATE_KEY_SIZE \ + (WC_ML_KEM_768_POLY_VEC_SZ + WC_ML_KEM_768_PUBLIC_KEY_SIZE + \ + 2 * WC_ML_KEM_SYM_SZ) +/* Cipher text size. */ +#define WC_ML_KEM_768_CIPHER_TEXT_SIZE \ + (WC_ML_KEM_768_POLY_VEC_COMPRESSED_SZ + WC_ML_KEM_768_POLY_COMPRESSED_SZ) +#endif + +#ifdef WOLFSSL_WC_ML_KEM_1024 +#define WC_ML_KEM_1024_K 4 +/* Number of bits of random to create noise from. */ +#define WC_ML_KEM_1024_ETA1 MLKEM_CBD_ETA2 + +/* Size of a polynomial vector. */ +#define WC_ML_KEM_1024_POLY_VEC_SZ MLKEM_POLY_VEC_SZ(WC_ML_KEM_1024_K) +/* Size of a compressed polynomial based on bits per coefficient. */ +#define WC_ML_KEM_1024_POLY_COMPRESSED_SZ MLKEM_POLY_COMPRESSED_SZ(5) +/* Size of a compressed vector polynomial based on dimensions and bits per + * coefficient. */ +#define WC_ML_KEM_1024_POLY_VEC_COMPRESSED_SZ \ + MLKEM_POLY_VEC_COMPRESSED_SZ(WC_ML_KEM_1024_K, 11) + +/* Public key size. */ +#define WC_ML_KEM_1024_PUBLIC_KEY_SIZE \ + (WC_ML_KEM_1024_POLY_VEC_SZ + WC_ML_KEM_SYM_SZ) +/* Private key size. */ +#define WC_ML_KEM_1024_PRIVATE_KEY_SIZE \ + (WC_ML_KEM_1024_POLY_VEC_SZ + WC_ML_KEM_1024_PUBLIC_KEY_SIZE + \ + 2 * WC_ML_KEM_SYM_SZ) +/* Cipher text size. */ +#define WC_ML_KEM_1024_CIPHER_TEXT_SIZE \ + (WC_ML_KEM_1024_POLY_VEC_COMPRESSED_SZ + WC_ML_KEM_1024_POLY_COMPRESSED_SZ) +#endif + +#ifndef WC_ML_KEM_MAX_K +#ifdef WOLFSSL_WC_ML_KEM_1024 +#define WC_ML_KEM_MAX_K WC_ML_KEM_1024_K +#define WC_ML_KEM_MAX_PRIVATE_KEY_SIZE WC_ML_KEM_1024_PRIVATE_KEY_SIZE +#define WC_ML_KEM_MAX_PUBLIC_KEY_SIZE WC_ML_KEM_1024_PUBLIC_KEY_SIZE +#define WC_ML_KEM_MAX_CIPHER_TEXT_SIZE WC_ML_KEM_1024_CIPHER_TEXT_SIZE +#elif defined(WOLFSSL_WC_ML_KEM_768) +#define WC_ML_KEM_MAX_K WC_ML_KEM_768_K +#define WC_ML_KEM_MAX_PRIVATE_KEY_SIZE WC_ML_KEM_768_PRIVATE_KEY_SIZE +#define WC_ML_KEM_MAX_PUBLIC_KEY_SIZE WC_ML_KEM_768_PUBLIC_KEY_SIZE +#define WC_ML_KEM_MAX_CIPHER_TEXT_SIZE WC_ML_KEM_768_CIPHER_TEXT_SIZE +#elif defined(WOLFSSL_WC_ML_KEM_512) +#define WC_ML_KEM_MAX_K WC_ML_KEM_512_K +#define WC_ML_KEM_MAX_PRIVATE_KEY_SIZE WC_ML_KEM_512_PRIVATE_KEY_SIZE +#define WC_ML_KEM_MAX_PUBLIC_KEY_SIZE WC_ML_KEM_512_PUBLIC_KEY_SIZE +#define WC_ML_KEM_MAX_CIPHER_TEXT_SIZE WC_ML_KEM_512_CIPHER_TEXT_SIZE +#endif +#endif /* WC_ML_KEM_MAX_K */ + +#define KYBER_N MLKEM_N + +/* Size of a polynomial vector based on dimensions. */ +#define KYBER_POLY_VEC_SZ(k) ((k) * KYBER_POLY_SIZE) +/* Size of a compressed polynomial based on bits per coefficient. */ +#define KYBER_POLY_COMPRESSED_SZ(b) ((b) * (KYBER_N / 8)) +/* Size of a compressed vector polynomial based on dimensions and bits per + * coefficient. */ +#define KYBER_POLY_VEC_COMPRESSED_SZ(k, b) ((k) * ((b) * (KYBER_N / 8))) + + +/* Kyber-512 parameters */ +/* Number of polynomials in a vector and vectors in a matrix. */ +#define KYBER512_K 2 + +/* Size of a polynomial vector. */ +#define KYBER512_POLY_VEC_SZ KYBER_POLY_VEC_SZ(KYBER512_K) +/* Size of a compressed polynomial based on bits per coefficient. */ +#define KYBER512_POLY_COMPRESSED_SZ KYBER_POLY_COMPRESSED_SZ(4) +/* Size of a compressed vector polynomial based on dimensions and bits per + * coefficient. */ +#define KYBER512_POLY_VEC_COMPRESSED_SZ \ + KYBER_POLY_VEC_COMPRESSED_SZ(KYBER512_K, 10) + +/* Public key size. */ +#define KYBER512_PUBLIC_KEY_SIZE \ + (KYBER512_POLY_VEC_SZ + KYBER_SYM_SZ) +/* Private key size. */ +#define KYBER512_PRIVATE_KEY_SIZE \ + (KYBER512_POLY_VEC_SZ + KYBER512_PUBLIC_KEY_SIZE + 2 * KYBER_SYM_SZ) +/* Cipher text size. */ +#define KYBER512_CIPHER_TEXT_SIZE \ + (KYBER512_POLY_VEC_COMPRESSED_SZ + KYBER512_POLY_COMPRESSED_SZ) + +/* Kyber-768 parameters */ +/* Number of polynomials in a vector and vectors in a matrix. */ +#define KYBER768_K 3 + +/* Size of a polynomial vector. */ +#define KYBER768_POLY_VEC_SZ KYBER_POLY_VEC_SZ(KYBER768_K) +/* Size of a compressed polynomial based on bits per coefficient. */ +#define KYBER768_POLY_COMPRESSED_SZ KYBER_POLY_COMPRESSED_SZ(4) +/* Size of a compressed vector polynomial based on dimensions and bits per + * coefficient. */ +#define KYBER768_POLY_VEC_COMPRESSED_SZ \ + KYBER_POLY_VEC_COMPRESSED_SZ(KYBER768_K, 10) + +/* Public key size. */ +#define KYBER768_PUBLIC_KEY_SIZE \ + (KYBER768_POLY_VEC_SZ + KYBER_SYM_SZ) +/* Private key size. */ +#define KYBER768_PRIVATE_KEY_SIZE \ + (KYBER768_POLY_VEC_SZ + KYBER768_PUBLIC_KEY_SIZE + 2 * KYBER_SYM_SZ) +/* Cipher text size. */ +#define KYBER768_CIPHER_TEXT_SIZE \ + (KYBER768_POLY_VEC_COMPRESSED_SZ + KYBER768_POLY_COMPRESSED_SZ) + +/* Kyber-1024 parameters */ +/* Number of polynomials in a vector and vectors in a matrix. */ +#define KYBER1024_K 4 + +/* Size of a polynomial vector. */ +#define KYBER1024_POLY_VEC_SZ KYBER_POLY_VEC_SZ(KYBER1024_K) +/* Size of a compressed polynomial based on bits per coefficient. */ +#define KYBER1024_POLY_COMPRESSED_SZ KYBER_POLY_COMPRESSED_SZ(5) +/* Size of a compressed vector polynomial based on dimensions and bits per + * coefficient. */ +#define KYBER1024_POLY_VEC_COMPRESSED_SZ \ + KYBER_POLY_VEC_COMPRESSED_SZ(KYBER1024_K, 11) + +/* Public key size. */ +#define KYBER1024_PUBLIC_KEY_SIZE \ + (KYBER1024_POLY_VEC_SZ + KYBER_SYM_SZ) +/* Private key size. */ +#define KYBER1024_PRIVATE_KEY_SIZE \ + (KYBER1024_POLY_VEC_SZ + KYBER1024_PUBLIC_KEY_SIZE + 2 * KYBER_SYM_SZ) +/* Cipher text size. */ +#define KYBER1024_CIPHER_TEXT_SIZE \ + (KYBER1024_POLY_VEC_COMPRESSED_SZ + KYBER1024_POLY_COMPRESSED_SZ) + + +/* Maximum dimensions and sizes of supported key types. */ +#ifdef WOLFSSL_KYBER1024 +#define KYBER_MAX_K KYBER1024_K +#define KYBER_MAX_PRIVATE_KEY_SIZE KYBER1024_PRIVATE_KEY_SIZE +#define KYBER_MAX_PUBLIC_KEY_SIZE KYBER1024_PUBLIC_KEY_SIZE +#define KYBER_MAX_CIPHER_TEXT_SIZE KYBER1024_CIPHER_TEXT_SIZE +#elif defined(WOLFSSL_KYBER768) +#define KYBER_MAX_K KYBER768_K +#define KYBER_MAX_PRIVATE_KEY_SIZE KYBER768_PRIVATE_KEY_SIZE +#define KYBER_MAX_PUBLIC_KEY_SIZE KYBER768_PUBLIC_KEY_SIZE +#define KYBER_MAX_CIPHER_TEXT_SIZE KYBER768_CIPHER_TEXT_SIZE +#elif defined(WOLFSSL_KYBER512) +#define KYBER_MAX_K KYBER512_K +#define KYBER_MAX_PRIVATE_KEY_SIZE KYBER512_PRIVATE_KEY_SIZE +#define KYBER_MAX_PUBLIC_KEY_SIZE KYBER512_PUBLIC_KEY_SIZE +#define KYBER_MAX_CIPHER_TEXT_SIZE KYBER512_CIPHER_TEXT_SIZE +#endif + +#define KYBER_SYM_SZ WC_ML_KEM_SYM_SZ +#define KYBER_SS_SZ WC_ML_KEM_SS_SZ +#define KYBER_MAKEKEY_RAND_SZ WC_ML_KEM_MAKEKEY_RAND_SZ +#define KYBER_ENC_RAND_SZ WC_ML_KEM_ENC_RAND_SZ +#define KYBER_POLY_SIZE WC_ML_KEM_POLY_SIZE + enum { - /* Flags of Kyber keys. */ + WC_ML_KEM_512 = 0, + WC_ML_KEM_768 = 1, + WC_ML_KEM_1024 = 2, + + MLKEM_KYBER = 0x10, + KYBER512 = 0 | MLKEM_KYBER, + KYBER768 = 1 | MLKEM_KYBER, + KYBER1024 = 2 | MLKEM_KYBER, + + KYBER_LEVEL1 = KYBER512, + KYBER_LEVEL3 = KYBER768, + KYBER_LEVEL5 = KYBER1024, + + /* Symmetric data size. */ + WC_ML_KEM_SYM_SZ = 32, + /* Shared secret size. */ + WC_ML_KEM_SS_SZ = 32, + /* Size of random required for making a key. */ + WC_ML_KEM_MAKEKEY_RAND_SZ = 2 * WC_ML_KEM_SYM_SZ, + /* Size of random required for encapsulation. */ + WC_ML_KEM_ENC_RAND_SZ = WC_ML_KEM_SYM_SZ, + + /* Encoded polynomial size. */ + WC_ML_KEM_POLY_SIZE = 384, + + /* Flags of ML-KEM keys. */ MLKEM_FLAG_PRIV_SET = 0x0001, MLKEM_FLAG_PUB_SET = 0x0002, MLKEM_FLAG_BOTH_SET = 0x0003, @@ -66,33 +350,10 @@ enum { MLKEM_COMP_11BITS = 11 }; - -/* SHAKE128 rate. */ -#define XOF_BLOCK_SIZE 168 - -/* Modulus of co-efficients of polynomial. */ -#define MLKEM_Q 3329 - - -/* Kyber-512 parameters */ -#ifdef WOLFSSL_WC_ML_KEM_512 -/* Number of bits of random to create noise from. */ -#define WC_ML_KEM_512_ETA1 MLKEM_CBD_ETA3 -#endif /* WOLFSSL_WC_ML_KEM_512 */ - -/* Kyber-768 parameters */ -#ifdef WOLFSSL_WC_ML_KEM_768 -/* Number of bits of random to create noise from. */ -#define WC_ML_KEM_768_ETA1 MLKEM_CBD_ETA2 -#endif /* WOLFSSL_WC_ML_KEM_768 */ - -/* Kyber-1024 parameters */ -#ifdef WOLFSSL_WC_ML_KEM_1024 -/* Number of bits of random to create noise from. */ -#define WC_ML_KEM_1024_ETA1 MLKEM_CBD_ETA2 -#endif /* WOLFSSL_KYBER1024 */ - - +#ifdef WOLF_PRIVATE_KEY_ID + #define MLKEM_MAX_ID_LEN 32 + #define MLKEM_MAX_LABEL_LEN 32 +#endif /* The data type of the hash function. */ #define MLKEM_HASH_T wc_Sha3 @@ -101,7 +362,7 @@ enum { #define MLKEM_PRF_T wc_Shake /* ML-KEM key. */ -struct MlKemKey { +typedef struct MlKemKey { /* Type of key: WC_ML_KEM_512, WC_ML_KEM_768, WC_ML_KEM_1024 */ int type; #ifdef WOLFSSL_MLKEM_DYNAMIC_KEYS @@ -157,11 +418,72 @@ struct MlKemKey { sword16* a; #endif #endif -}; +} MlKemKey; -#ifdef __cplusplus - extern "C" { + +WOLFSSL_API MlKemKey* wc_MlKemKey_New(int type, void* heap, int devId); +WOLFSSL_API int wc_MlKemKey_Delete(MlKemKey* key, MlKemKey** key_p); + +WOLFSSL_API int wc_MlKemKey_Init(MlKemKey* key, int type, void* heap, + int devId); +WOLFSSL_API int wc_MlKemKey_Free(MlKemKey* key); +#if defined(WOLF_PRIVATE_KEY_ID) && defined(WOLFSSL_HAVE_MLKEM) +WOLFSSL_API int wc_MlKemKey_Init_Id(MlKemKey* key, int type, + const unsigned char* id, int len, void* heap, int devId); +WOLFSSL_API int wc_MlKemKey_Init_Label(MlKemKey* key, int type, + const char* label, void* heap, int devId); +#endif + +WOLFSSL_API int wc_MlKemKey_MakeKey(MlKemKey* key, WC_RNG* rng); +WOLFSSL_API int wc_MlKemKey_MakeKeyWithRandom(MlKemKey* key, + const unsigned char* rand, int len); + +WOLFSSL_API int wc_MlKemKey_CipherTextSize(MlKemKey* key, word32* len); +WOLFSSL_API int wc_MlKemKey_SharedSecretSize(MlKemKey* key, word32* len); + +WOLFSSL_API int wc_MlKemKey_Encapsulate(MlKemKey* key, unsigned char* ct, + unsigned char* ss, WC_RNG* rng); +WOLFSSL_API int wc_MlKemKey_EncapsulateWithRandom(MlKemKey* key, + unsigned char* ct, unsigned char* ss, const unsigned char* rand, int len); +WOLFSSL_API int wc_MlKemKey_Decapsulate(MlKemKey* key, unsigned char* ss, + const unsigned char* ct, word32 len); + +WOLFSSL_API int wc_MlKemKey_DecodePrivateKey(MlKemKey* key, + const unsigned char* in, word32 len); +WOLFSSL_API int wc_MlKemKey_DecodePublicKey(MlKemKey* key, + const unsigned char* in, word32 len); + +WOLFSSL_API int wc_MlKemKey_PrivateKeySize(MlKemKey* key, word32* len); +WOLFSSL_API int wc_MlKemKey_PublicKeySize(MlKemKey* key, word32* len); +WOLFSSL_API int wc_MlKemKey_EncodePrivateKey(MlKemKey* key, unsigned char* out, + word32 len); +WOLFSSL_API int wc_MlKemKey_EncodePublicKey(MlKemKey* key, unsigned char* out, + word32 len); + + +#define KyberKey MlKemKey + +#define wc_KyberKey_Init(type, key, heap, devId) \ + wc_MlKemKey_Init(key, type, heap, devId) +#define wc_KyberKey_Free wc_MlKemKey_Free +#if defined(WOLF_PRIVATE_KEY_ID) && defined(WOLFSSL_HAVE_MLKEM) +#define wc_KyberKey_Init_Id wc_MlKemKey_Init_Id +#define wc_KyberKey_Init_Label wc_MlKemKey_Init_Label #endif +#define wc_KyberKey_MakeKey wc_MlKemKey_MakeKey +#define wc_KyberKey_MakeKeyWithRandom wc_MlKemKey_MakeKeyWithRandom +#define wc_KyberKey_CipherTextSize wc_MlKemKey_CipherTextSize +#define wc_KyberKey_SharedSecretSize wc_MlKemKey_SharedSecretSize +#define wc_KyberKey_Encapsulate wc_MlKemKey_Encapsulate +#define wc_KyberKey_EncapsulateWithRandom wc_MlKemKey_EncapsulateWithRandom +#define wc_KyberKey_Decapsulate wc_MlKemKey_Decapsulate +#define wc_KyberKey_DecodePrivateKey wc_MlKemKey_DecodePrivateKey +#define wc_KyberKey_DecodePublicKey wc_MlKemKey_DecodePublicKey +#define wc_KyberKey_PrivateKeySize wc_MlKemKey_PrivateKeySize +#define wc_KyberKey_PublicKeySize wc_MlKemKey_PublicKeySize +#define wc_KyberKey_EncodePrivateKey wc_MlKemKey_EncodePrivateKey +#define wc_KyberKey_EncodePublicKey wc_MlKemKey_EncodePublicKey + WOLFSSL_LOCAL void mlkem_init(void); diff --git a/wrapper/CSharp/user_settings.h b/wrapper/CSharp/user_settings.h index 1dae86d2e0c..37b911c522b 100644 --- a/wrapper/CSharp/user_settings.h +++ b/wrapper/CSharp/user_settings.h @@ -89,12 +89,10 @@ /* Enable ML-KEM, ML-DSA */ #define HAVE_MLKEM -#define WOLFSSL_WC_MLKEM #define WOLFSSL_HAVE_MLKEM /* Required for PQC with DTLS 1.3 (auto-enabled in settings.h, explicit for clarity) */ #define WOLFSSL_DTLS_CH_FRAG #define HAVE_DILITHIUM -#define WOLFSSL_WC_DILITHIUM #define WOLFSSL_SHAKE128 #define WOLFSSL_SHAKE256 diff --git a/wrapper/CSharp/wolfssl.vcxproj b/wrapper/CSharp/wolfssl.vcxproj index a01d55d5a49..6bb50d9da08 100644 --- a/wrapper/CSharp/wolfssl.vcxproj +++ b/wrapper/CSharp/wolfssl.vcxproj @@ -308,7 +308,6 @@ - diff --git a/wrapper/rust/wolfssl-wolfcrypt/headers.h b/wrapper/rust/wolfssl-wolfcrypt/headers.h index 6db82daa5e9..719c2f01f0b 100644 --- a/wrapper/rust/wolfssl-wolfcrypt/headers.h +++ b/wrapper/rust/wolfssl-wolfcrypt/headers.h @@ -20,5 +20,5 @@ #include "wolfssl/wolfcrypt/aes.h" #include "wolfssl/wolfcrypt/pwdbased.h" #include "wolfssl/wolfcrypt/dilithium.h" -#include "wolfssl/wolfcrypt/mlkem.h" +#include "wolfssl/wolfcrypt/wc_mlkem.h" #include "wolfssl/wolfcrypt/wc_lms.h" diff --git a/zephyr/CMakeLists.txt b/zephyr/CMakeLists.txt index 35b8a765652..9b5ca2097c1 100644 --- a/zephyr/CMakeLists.txt +++ b/zephyr/CMakeLists.txt @@ -78,7 +78,6 @@ if(CONFIG_WOLFSSL) zephyr_library_sources(${ZEPHYR_CURRENT_MODULE_DIR}/wolfcrypt/src/ed25519.c) zephyr_library_sources(${ZEPHYR_CURRENT_MODULE_DIR}/wolfcrypt/src/ed448.c) zephyr_library_sources(${ZEPHYR_CURRENT_MODULE_DIR}/wolfcrypt/src/error.c) - zephyr_library_sources(${ZEPHYR_CURRENT_MODULE_DIR}/wolfcrypt/src/ext_mlkem.c) zephyr_library_sources(${ZEPHYR_CURRENT_MODULE_DIR}/wolfcrypt/src/falcon.c) zephyr_library_sources(${ZEPHYR_CURRENT_MODULE_DIR}/wolfcrypt/src/fe_448.c) zephyr_library_sources(${ZEPHYR_CURRENT_MODULE_DIR}/wolfcrypt/src/fe_low_mem.c) diff --git a/zephyr/user_settings.h b/zephyr/user_settings.h index cc333bdaaa7..05ec4fdccb1 100644 --- a/zephyr/user_settings.h +++ b/zephyr/user_settings.h @@ -337,7 +337,6 @@ extern "C" { /* PQC ML-KEM */ #if defined(CONFIG_WOLFSSL_MLKEM) #define WOLFSSL_HAVE_MLKEM - #define WOLFSSL_WC_MLKEM #define WOLFSSL_MLKEM_NO_LARGE_CODE #define WOLFSSL_MLKEM_SMALL #define WOLFSSL_MLKEM_MAKEKEY_SMALL_MEM