XMSS/XMSSMT hooks support: fix build.

This commit is contained in:
jordan
2023-10-09 10:13:32 -05:00
parent 33d4b331fb
commit f32c6a0d25
5 changed files with 110 additions and 13 deletions

View File

@ -401,10 +401,16 @@ We also have vcpkg ports for wolftpm, wolfmqtt and curl.
The patch may be found in the wolfssl-examples repo here:
pq/stateful_hash_sig/0001-Patch-to-support-xmss-reference-integration.patch
To build patched xmss-reference:
$ make xmss_lib.a
To build verify-only patched xmss-reference:
$ make xmss_verify_lib.a
Note that this patch adds wolfCrypt SHA256 hashing to xmss-reference, and
thus benefits from all the same asm speedups as wolfCrypt SHA hashing.
Depending on architecture you may build with --enable-intelasm, or
and --enable-armasm, and see 30-50% speedups in XMSS/XMSS^MT.
and --enable-armasm, and see 30-40% speedups in XMSS/XMSS^MT.
For full keygen, signing, verifying, and benchmarking support, build
wolfSSL with:

View File

@ -1201,10 +1201,32 @@ AC_ARG_WITH([libxmss],
AC_MSG_ERROR([libxmss isn't found.
If it's already installed, specify its path using --with-libxmss=/dir/])
fi
if test "$XMSS_VERIFY_ONLY" = "yes"; then
if test -e $trylibxmssdir/xmss_verify_lib.a; then
CPPFLAGS="$AM_CPPFLAGS -DHAVE_LIBXMSS -I$trylibxmssdir"
LIB_STATIC_ADD="$LIB_STATIC_ADD $trylibxmssdir/xmss_verify_lib.a"
enable_shared=no
enable_static=yes
libxmss_linked=yes
else
AC_MSG_ERROR([xmss_verify_lib.a isn't found.
If it's already installed, specify its path using --with-libxmss=/dir/])
fi
elif test -e $trylibxmssdir/xmss_lib.a; then
CPPFLAGS="$AM_CPPFLAGS -DHAVE_LIBXMSS -I$trylibxmssdir"
LIB_STATIC_ADD="$LIB_STATIC_ADD $trylibxmssdir/xmss_lib.a"
enable_shared=no
enable_static=yes
libxmss_linked=yes
else
AC_MSG_ERROR([libxmss isn't found.
If it's already installed, specify its path using --with-libxmss=/dir/])
fi
XMSS_ROOT=$trylibxmssdir
AC_MSG_RESULT([yes])
AM_CPPFLAGS="$CPPFLAGS"
AM_CFLAGS="$AM_CFLAGS -DHAVE_LIBXMSS -I$trylibxmssdir"
ENABLED_LIBXMSS="yes"
@ -1213,7 +1235,6 @@ AC_ARG_WITH([libxmss],
[XMSS_ROOT=""]
)
# LMS
AC_ARG_ENABLE([lms],
[AS_HELP_STRING([--enable-lms],[Enable stateful LMS/HSS signatures (default: disabled)])],
@ -9032,6 +9053,7 @@ AM_CONDITIONAL([BUILD_GE448], [test "x$ENABLED_GE448" = "xyes" || test "x$ENABLE
AM_CONDITIONAL([BUILD_CURVE448],[test "x$ENABLED_CURVE448" = "xyes" || test "x$ENABLED_USERSETTINGS" = "xyes"])
AM_CONDITIONAL([BUILD_CURVE448_SMALL],[test "x$ENABLED_CURVE448_SMALL" = "xyes" || test "x$ENABLED_USERSETTINGS" = "xyes"])
AM_CONDITIONAL([BUILD_WC_LMS],[test "x$ENABLED_WC_LMS" != "xno" || test "x$ENABLED_USERSETTINGS" = "xyes"])
AM_CONDITIONAL([BUILD_WC_XMSS],[test "x$ENABLED_WC_XMSS" != "xno" || test "x$ENABLED_USERSETTINGS" = "xyes"])
AM_CONDITIONAL([BUILD_WC_KYBER],[test "x$ENABLED_WC_KYBER" != "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"])

View File

@ -702,6 +702,10 @@ if BUILD_WC_LMS
src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/wc_lms.c
endif
if BUILD_WC_XMSS
src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/wc_xmss.c
endif
if BUILD_CURVE25519
src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/curve25519.c
endif
@ -809,14 +813,6 @@ endif
if BUILD_LIBXMSS
src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/ext_xmss.c
src_libwolfssl@LIBSUFFIX@_la_SOURCES += $(XMSS_ROOT)/params.c
src_libwolfssl@LIBSUFFIX@_la_SOURCES += $(XMSS_ROOT)/thash.c
src_libwolfssl@LIBSUFFIX@_la_SOURCES += $(XMSS_ROOT)/hash_address.c
src_libwolfssl@LIBSUFFIX@_la_SOURCES += $(XMSS_ROOT)/wots.c
src_libwolfssl@LIBSUFFIX@_la_SOURCES += $(XMSS_ROOT)/xmss.c
src_libwolfssl@LIBSUFFIX@_la_SOURCES += $(XMSS_ROOT)/xmss_core_fast.c
src_libwolfssl@LIBSUFFIX@_la_SOURCES += $(XMSS_ROOT)/xmss_commons.c
src_libwolfssl@LIBSUFFIX@_la_SOURCES += $(XMSS_ROOT)/utils.c
endif
if BUILD_LIBZ

View File

@ -26,6 +26,7 @@
#include <wolfssl/wolfcrypt/settings.h>
#include <wolfssl/wolfcrypt/error-crypt.h>
#include <wolfssl/wolfcrypt/logging.h>
#include <wolfssl/wolfcrypt/sha256.h>
#ifdef WOLFSSL_HAVE_XMSS
#include <wolfssl/wolfcrypt/ext_xmss.h>
@ -37,6 +38,63 @@
#include <wolfcrypt/src/misc.c>
#endif
#include <xmss_callbacks.h>
#ifndef WOLFSSL_XMSS_VERIFY_ONLY
static THREAD_LS_T WC_RNG * xmssRng = NULL;
/* RNG callback used by xmss.
* */
static int rng_cb(void * output, size_t length)
{
int ret = 0;
if (output == NULL || xmssRng == NULL) {
return -1;
}
if (length == 0) {
return 0;
}
ret = wc_RNG_GenerateBlock(xmssRng, output, (word32) length);
if (ret) {
WOLFSSL_MSG("error: xmss rng_cb failed");
return -1;
}
return 0;
}
#endif /* ifndef WOLFSSL_XMSS_VERIFY_ONLY */
/* SHA256 callback used by xmss.
* */
static int sha256_cb(const unsigned char *in, unsigned long long inlen,
unsigned char *out)
{
wc_Sha256 sha;
if (wc_InitSha256_ex(&sha, NULL, INVALID_DEVID) != 0) {
WOLFSSL_MSG("SHA256 Init failed");
return -1;
}
if (wc_Sha256Update(&sha, in, (word32) inlen) != 0) {
WOLFSSL_MSG("SHA256 Update failed");
return -1;
}
if (wc_Sha256Final(&sha, out) != 0) {
WOLFSSL_MSG("SHA256 Final failed");
wc_Sha256Free(&sha);
return -1;
}
wc_Sha256Free(&sha);
return 0;
}
/* Init an Xmss key.
*
* Call this before setting the parms of an Xmss key.
@ -119,6 +177,20 @@ static int wc_XmssKey_SetOid(XmssKey * key, uint32_t oid, int is_xmssmt)
return -1;
}
ret = xmss_set_sha_cb(sha256_cb);
if (ret != 0) {
WOLFSSL_MSG("error: xmss_set_sha_cb failed");
return -1;
}
#ifndef WOLFSSL_XMSS_VERIFY_ONLY
ret = xmss_set_rng_cb(rng_cb);
if (ret != 0) {
WOLFSSL_MSG("error: xmss_set_rng_cb failed");
return -1;
}
#endif
key->oid = oid;
key->is_xmssmt = is_xmssmt;
key->state = WC_XMSS_STATE_PARMSET;
@ -401,13 +473,15 @@ int wc_XmssKey_MakeKey(XmssKey* key, WC_RNG * rng)
return ret;
}
xmssRng = rng;
/* Finally make the secret public key pair. Immediately write it to NV
* storage and then clear from memory. */
if (key->is_xmssmt) {
ret = xmssmt_keypair(key->pk, key->sk, key->oid, rng);
ret = xmssmt_keypair(key->pk, key->sk, key->oid);
}
else {
ret = xmss_keypair(key->pk, key->sk, key->oid, rng);
ret = xmss_keypair(key->pk, key->sk, key->oid);
}
if (ret == 0) {

View File

@ -144,7 +144,6 @@ WOLFSSL_API int wc_XmssKey_ImportPubRaw(XmssKey * key, const byte * in,
word32 inLen);
WOLFSSL_API int wc_XmssKey_Verify(XmssKey * key, const byte * sig, word32 sigSz,
const byte * msg, int msgSz);
WOLFSSL_API const char * wc_XmssKey_RcToStr(enum wc_XmssRc lmsRc);
#ifdef __cplusplus
} /* extern "C" */
#endif