diff --git a/linuxkm/Kbuild b/linuxkm/Kbuild index c557c69fd..ab7211f04 100644 --- a/linuxkm/Kbuild +++ b/linuxkm/Kbuild @@ -1,16 +1,6 @@ -SHELL=/bin/bash - # libwolfssl Kbuild -# wolfcrypto asm provokes many objtool complaints: -# "call without frame pointer save/setup", -# "BP used as a scratch register", -# "indirect jump found in RETPOLINE build", -# and "is missing an ELF size annotation" -# see /usr/src/linux/tools/objtool/Documentation/stack-validation.txt -#OBJECT_FILES_NON_STANDARD := y - -obj-m := libwolfssl.o +SHELL=/bin/bash ifeq "$(WOLFSSL_OBJ_FILES)" "" $(error $$WOLFSSL_OBJ_FILES is unset.) @@ -20,6 +10,12 @@ ifeq "$(WOLFSSL_CFLAGS)" "" $(error $$WOLFSSL_CFLAGS is unset.) endif +obj-m := libwolfssl.o + +WOLFSSL_OBJ_TARGETS=$(patsubst %, $(obj)/%, $(WOLFSSL_OBJ_FILES)) + +$(obj)/linuxkm/module_exports.o: $(WOLFSSL_OBJ_TARGETS) + # this mechanism only works in kernel 5.x+ (fallback to hardcoded value) hostprogs := linuxkm/get_thread_size always-y := $(hostprogs) @@ -28,16 +24,16 @@ HOST_EXTRACFLAGS += $(NOSTDINC_FLAGS) $(LINUXINCLUDE) $(KBUILD_CFLAGS) -static # this rule is needed to get build to succeed in 4.x (get_thread_size still doesn't get built) $(obj)/linuxkm/get_thread_size: $(src)/linuxkm/get_thread_size.c -$(patsubst %, $(obj)/%, $(WOLFSSL_OBJ_FILES)): | $(obj)/linuxkm/get_thread_size +$(WOLFSSL_OBJ_TARGETS): | $(obj)/linuxkm/get_thread_size KERNEL_THREAD_STACK_SIZE=$(shell test -x $(obj)/linuxkm/get_thread_size && $(obj)/linuxkm/get_thread_size || echo 16384) MAX_STACK_FRAME_SIZE=$(shell echo $$(( $(KERNEL_THREAD_STACK_SIZE) / 4))) -libwolfssl-y := $(WOLFSSL_OBJ_FILES) +libwolfssl-y := $(WOLFSSL_OBJ_FILES) linuxkm/module_hooks.o linuxkm/module_exports.o ccflags-y = $(WOLFSSL_CFLAGS) -Wframe-larger-than=$(MAX_STACK_FRAME_SIZE) -mpreferred-stack-boundary=4 %/libwolfssl.mod.o: ccflags-y := -%/lkm_testcrypto.o: ccflags-y += -DNO_MAIN_DRIVER +%/test.o: ccflags-y += -DNO_MAIN_DRIVER asflags-y := $(WOLFSSL_ASFLAGS) @@ -45,3 +41,12 @@ asflags-y := $(WOLFSSL_ASFLAGS) # but they still irritate objtool: "unannotated intra-function call" and "BP used as a scratch register" %/aes_asm.o: OBJECT_FILES_NON_STANDARD := y %/aes_gcm_asm.o: OBJECT_FILES_NON_STANDARD := y + +# auto-generate the exported symbol list, leveraging the WOLFSSL_API visibility tags. +# exclude symbols that don't match wc_* or wolf*. +$(src)/linuxkm/module_exports.c: $(src)/linuxkm/module_exports.c.template $(WOLFSSL_OBJ_TARGETS) + @cp $< $@ + @readelf --symbols --wide $(WOLFSSL_OBJ_TARGETS) | awk '/^ *[0-9]+: /{if ($$8 !~ /^(wc_|wolf)/){next;} if (($$4 == "FUNC") && ($$5 == "GLOBAL") && ($$6 == "DEFAULT")) { print "EXPORT_SYMBOL(" $$8 ");"; }}' >> $@ + @echo 'EXPORT_SYMBOL(wolfcrypt_test);' >> $@ + +clean-files := module_exports.c diff --git a/linuxkm/Makefile b/linuxkm/Makefile index ea4805a9d..43b5c5c2f 100644 --- a/linuxkm/Makefile +++ b/linuxkm/Makefile @@ -10,14 +10,14 @@ ifndef SRC_TOP SRC_TOP=$(shell dirname $(MODULE_TOP)) endif -WOLFSSL_CFLAGS=-DHAVE_CONFIG_H -I$(SRC_TOP) -DBUILDING_WOLFSSL $(AM_CFLAGS) $(CFLAGS) -Wno-declaration-after-statement +WOLFSSL_CFLAGS=-DHAVE_CONFIG_H -I$(SRC_TOP) -DBUILDING_WOLFSSL $(AM_CFLAGS) $(CFLAGS) -Wno-declaration-after-statement -Wno-redundant-decls ifeq "$(KARCH)" "x86" WOLFSSL_CFLAGS+=-msse -mmmx -msse2 -mavx -mavx2 endif WOLFSSL_ASFLAGS=-DHAVE_CONFIG_H -I$(SRC_TOP) -DBUILDING_WOLFSSL $(AM_CCASFLAGS) $(CCASFLAGS) -WOLFSSL_OBJ_FILES=linuxkm/module_hooks.o $(patsubst %.lo, %.o, $(patsubst src/src_libwolfssl_la-%, src/%, $(patsubst src/libwolfssl_la-%, src/%, $(patsubst wolfcrypt/src/src_libwolfssl_la-%, wolfcrypt/src/%, $(src_libwolfssl_la_OBJECTS))))) +WOLFSSL_OBJ_FILES=$(patsubst %.lo, %.o, $(patsubst src/src_libwolfssl_la-%, src/%, $(patsubst src/libwolfssl_la-%, src/%, $(patsubst wolfcrypt/src/src_libwolfssl_la-%, wolfcrypt/src/%, $(src_libwolfssl_la_OBJECTS))))) ifeq "$(ENABLED_CRYPT_TESTS)" "yes" WOLFSSL_OBJ_FILES+=wolfcrypt/test/test.o diff --git a/linuxkm/module_exports.c.template b/linuxkm/module_exports.c.template new file mode 100644 index 000000000..55a7818aa --- /dev/null +++ b/linuxkm/module_exports.c.template @@ -0,0 +1,138 @@ +#ifdef HAVE_CONFIG_H + #include +#endif + +#include +#include +#include +#include +#ifndef NO_CRYPT_TEST +#include +#include +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#if defined(WC_NO_RNG) + #include +#else + #include +#endif +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#ifdef HAVE_ECC + #include +#endif +#ifdef HAVE_CURVE25519 + #include +#endif +#ifdef HAVE_ED25519 + #include +#endif +#ifdef HAVE_CURVE448 + #include +#endif +#ifdef HAVE_ED448 + #include +#endif +#if defined(HAVE_BLAKE2) || defined(HAVE_BLAKE2S) + #include +#endif +#ifdef WOLFSSL_SHA3 + #include +#endif +#ifdef HAVE_LIBZ + #include +#endif +#ifdef HAVE_PKCS7 + #include +#endif +#ifdef HAVE_FIPS + #include +#endif +#ifdef HAVE_SELFTEST + #include +#endif +#ifdef WOLFSSL_ASYNC_CRYPT + #include +#endif +#if defined(OPENSSL_EXTRA) || defined(DEBUG_WOLFSSL_VERBOSE) + #include +#endif +#ifdef WOLFSSL_IMX6_CAAM_BLOB + #include +#endif +#ifdef WOLF_CRYPTO_CB + #include + #ifdef HAVE_INTEL_QA_SYNC + #include + #endif + #ifdef HAVE_CAVIUM_OCTEON_SYNC + #include + #endif +#endif + +#ifdef _MSC_VER + /* 4996 warning to use MS extensions e.g., strcpy_s instead of strncpy */ + #pragma warning(disable: 4996) +#endif + +#ifdef OPENSSL_EXTRA + #ifndef WOLFCRYPT_ONLY + #include + #endif + #include + #include + #include + #include +#endif + +#if defined(NO_FILESYSTEM) + #if !defined(USE_CERT_BUFFERS_1024) && !defined(USE_CERT_BUFFERS_2048) && \ + !defined(USE_CERT_BUFFERS_3072) && !defined(USE_CERT_BUFFERS_4096) + #define USE_CERT_BUFFERS_2048 + #endif + #if !defined(USE_CERT_BUFFERS_256) + #define USE_CERT_BUFFERS_256 + #endif +#endif + +#if defined(WOLFSSL_CERT_GEN) && (defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES)) + #define ENABLE_ECC384_CERT_GEN_TEST +#endif + +#include + +#ifdef HAVE_NTRU + #include "libntruencrypt/ntru_crypto.h" +#endif +