From af4017132da70e43201448044bd6da7f79c6e51c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tobias=20Frauenschl=C3=A4ger?= Date: Wed, 20 Nov 2024 10:16:26 +0100 Subject: [PATCH] LMS fixes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Add support for CMake * Add support for Zephyr * Make sure the internal key state is properly handled in case a public key is imported into a reloaded private key. Signed-off-by: Tobias Frauenschläger --- CMakeLists.txt | 12 ++++++++++-- cmake/functions.cmake | 16 ++++++++++++++++ cmake/options.h.in | 8 ++++++++ wolfcrypt/src/wc_lms.c | 3 ++- zephyr/CMakeLists.txt | 2 ++ 5 files changed, 38 insertions(+), 3 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 4a9486c67..eb456a201 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -655,6 +655,16 @@ else() endif() endif() +# LMS +add_option(WOLFSSL_LMS + "Enable the wolfSSL LMS implementation (default: disabled)" + "no" "yes;no") + +# XMSS +add_option(WOLFSSL_XMSS + "Enable the wolfSSL XMSS implementation (default: disabled)" + "no" "yes;no") + # TODO: - Lean PSK # - Lean TLS # - Low resource @@ -668,8 +678,6 @@ endif() # - Atomic user record layer # - Public key callbacks # - Microchip/Atmel CryptoAuthLib -# - XMSS -# - LMS # - dual-certs # AES-CBC diff --git a/cmake/functions.cmake b/cmake/functions.cmake index 3c8832c2c..c36219400 100644 --- a/cmake/functions.cmake +++ b/cmake/functions.cmake @@ -208,6 +208,12 @@ function(generate_build_flags) set(BUILD_EXT_KYBER "yes" PARENT_SCOPE) set(BUILD_OQS_HELPER "yes" PARENT_SCOPE) endif() + if(WOLFSSL_LMS OR WOLFSSL_USER_SETTINGS) + set(BUILD_WC_LMS "yes" PARENT_SCOPE) + endif() + if(WOLFSSL_XMSS OR WOLFSSL_USER_SETTINGS) + set(BUILD_WC_XMSS "yes" PARENT_SCOPE) + endif() if(WOLFSSL_ARIA OR WOLFSSL_USER_SETTINGS) message(STATUS "ARIA functions.cmake found WOLFSSL_ARIA") # we cannot actually build, as we only have pre-compiled bin @@ -818,6 +824,16 @@ function(generate_lib_src_list LIB_SOURCES) list(APPEND LIB_SOURCES wolfcrypt/src/ext_kyber.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) + endif() + + if(BUILD_WC_XMSS) + list(APPEND LIB_SOURCES wolfcrypt/src/wc_xmss.c) + list(APPEND LIB_SOURCES wolfcrypt/src/wc_xmss_impl.c) + endif() + if(BUILD_LIBZ) list(APPEND LIB_SOURCES wolfcrypt/src/compress.c) endif() diff --git a/cmake/options.h.in b/cmake/options.h.in index 3a389dfef..13e56625c 100644 --- a/cmake/options.h.in +++ b/cmake/options.h.in @@ -382,6 +382,14 @@ extern "C" { #cmakedefine HAVE_ECC_KOBLITZ #undef HAVE_ECC_CDH #cmakedefine HAVE_ECC_CDH +#undef WOLFSSL_HAVE_LMS +#cmakedefine WOLFSSL_HAVE_LMS +#undef WOLFSSL_WC_LMS +#cmakedefine WOLFSSL_WC_LMS +#undef WOLFSSL_HAVE_XMSS +#cmakedefine WOLFSSL_HAVE_XMSS +#undef WOLFSSL_WC_XMSS +#cmakedefine WOLFSSL_WC_XMSS #ifdef __cplusplus } diff --git a/wolfcrypt/src/wc_lms.c b/wolfcrypt/src/wc_lms.c index 0b50a1ce1..faa69987d 100644 --- a/wolfcrypt/src/wc_lms.c +++ b/wolfcrypt/src/wc_lms.c @@ -1162,7 +1162,8 @@ int wc_LmsKey_ImportPubRaw(LmsKey* key, const byte* in, word32 inLen) if (ret == 0) { XMEMCPY(key->pub, in, inLen); - key->state = WC_LMS_STATE_VERIFYONLY; + if (key->state != WC_LMS_STATE_OK) + key->state = WC_LMS_STATE_VERIFYONLY; } return ret; diff --git a/zephyr/CMakeLists.txt b/zephyr/CMakeLists.txt index b13d9941a..7117beaeb 100644 --- a/zephyr/CMakeLists.txt +++ b/zephyr/CMakeLists.txt @@ -119,6 +119,8 @@ if(CONFIG_WOLFSSL) zephyr_library_sources(${ZEPHYR_CURRENT_MODULE_DIR}/wolfcrypt/src/wc_encrypt.c) zephyr_library_sources(${ZEPHYR_CURRENT_MODULE_DIR}/wolfcrypt/src/wc_kyber.c) zephyr_library_sources(${ZEPHYR_CURRENT_MODULE_DIR}/wolfcrypt/src/wc_kyber_poly.c) + zephyr_library_sources(${ZEPHYR_CURRENT_MODULE_DIR}/wolfcrypt/src/wc_lms.c) + zephyr_library_sources(${ZEPHYR_CURRENT_MODULE_DIR}/wolfcrypt/src/wc_lms_impl.c) zephyr_library_sources(${ZEPHYR_CURRENT_MODULE_DIR}/wolfcrypt/src/wc_pkcs11.c) zephyr_library_sources(${ZEPHYR_CURRENT_MODULE_DIR}/wolfcrypt/src/wc_port.c) zephyr_library_sources(${ZEPHYR_CURRENT_MODULE_DIR}/wolfcrypt/src/wolfevent.c)