2121.ONESHELL :
2222SHELL =bash
2323
24- all : libwolfssl.ko libwolfssl.ko.signed
24+ ifndef LIBWOLFSSL_NAME
25+ LIBWOLFSSL_NAME := libwolfssl
26+ endif
27+
28+ all : $(LIBWOLFSSL_NAME ) .ko $(LIBWOLFSSL_NAME ) .ko.signed
2529
2630ifndef MODULE_TOP
2731 MODULE_TOP =$(CURDIR )
@@ -147,8 +151,9 @@ GENERATE_RELOC_TAB := $(AWK) ' \
147151 n=0; \
148152 bad_relocs=0; \
149153 print "\# include <wolfssl/wolfcrypt/libwolfssl_sources.h>"; \
154+ print "\#include <wolfssl/wolfcrypt/memory.h>"; \
150155 printf("%s\n ", \
151- "WOLFSSL_LOCAL const struct wc_linuxkm_pie_reloc_tab_ent wc_linuxkm_pie_reloc_tab[] = { "); \
156+ "WOLFSSL_LOCAL const struct wc_reloc_table_ent wc_linuxkm_pie_reloc_tab[] = { "); \
152157 if ("SECTION_MAP" in ENVIRON) { \
153158 while (getline <ENVIRON["SECTION_MAP"] > 0) \
154159 section_map[$$1] = $$2; \
@@ -204,8 +209,10 @@ GENERATE_RELOC_TAB := $(AWK) ' \
204209 print >"/dev/stderr"; \
205210 exit(1); \
206211 } \
207- printf(" { .offset = 0x%xU, .dest_segment = %s, .reloc_type = WC_%s },\n", \
208- strtonum("0x" gensub("^0*","",1,$$1)), \
212+ printf(" { .offset = 0x%xU, .dest_offset = 0x%xU, .dest_addend = %+d, .dest_segment = %s, .reloc_type = WC_%s },\n", \
213+ strtonum("0x" $$1), \
214+ strtonum("0x" $$4), \
215+ $$6 strtonum("0x" $$7), \
209216 section_tag, reloc_type); \
210217 } \
211218 } \
@@ -214,8 +221,8 @@ GENERATE_RELOC_TAB := $(AWK) ' \
214221 print "Found " bad_relocs " unresolvable relocations." >"/dev/stderr"; \
215222 exit(1); \
216223 } \
217- print " { .offset = ~0U, .dest_segment = WC_R_SEG_NONE, .reloc_type = WC_R_NONE } };"; \
218- print "WOLFSSL_LOCAL const unsigned long wc_linuxkm_pie_reloc_tab_length = sizeof wc_linuxkm_pie_reloc_tab / sizeof wc_linuxkm_pie_reloc_tab[0];"; \
224+ print " { .offset = ~0U, .dest_offset = ~0U, .dest_addend = 0, . dest_segment = WC_R_SEG_NONE, .reloc_type = WC_R_NONE } };"; \
225+ print "WOLFSSL_LOCAL const unsigned int wc_linuxkm_pie_reloc_tab_length = (unsigned int)( sizeof wc_linuxkm_pie_reloc_tab / sizeof wc_linuxkm_pie_reloc_tab[0]) ;"; \
219226 }'
220227
221228ifeq "$(V ) " "1"
@@ -225,8 +232,8 @@ endif
225232# This rule is .PHONY because it doesn't actually build the module -- Kbuild
226233# does, and we always need to call Kbuild to enforce rebuild for dependencies
227234# and config changes.
228- .PHONY : libwolfssl .ko
229- libwolfssl .ko :
235+ .PHONY : $( LIBWOLFSSL_NAME ) .ko
236+ $( LIBWOLFSSL_NAME ) .ko :
230237 @set -e
231238 @[[ ' $(V)' == 1 ]] && { echo ' MODULE_TOP = "$(MODULE_TOP)"' ;
232239 echo ' SRC_TOP = "$(SRC_TOP)"' ;
303310endif
304311
305312.PHONY : module-update-fips-hash
306- module-update-fips-hash : libwolfssl .ko
313+ module-update-fips-hash : $( LIBWOLFSSL_NAME ) .ko
307314 @set -e
308315 @if test -z ' $(FIPS_HASH)' ; then echo ' $$FIPS_HASH is unset' >&2 ; exit 1; fi
309316 @if [[ ! ' $(FIPS_HASH)' =~ [0-9a-fA-F]{64} ]]; then echo ' $$FIPS_HASH is malformed' >&2 ; exit 1; fi
@@ -320,9 +327,64 @@ module-update-fips-hash: libwolfssl.ko
320327 if [[ ' $(FIPS_HASH)' == " $$ current_verifyCore" ]]; then echo ' Supplied FIPS_HASH matches existing verifyCore -- no update needed.' ; exit 0; fi ; \
321328 echo -n ' $(FIPS_HASH)' | dd bs=1 conv=notrunc of=" $<" seek=$$ verifyCore_offset count=64 status=none && \
322329 echo " FIPS verifyCore updated successfully." && \
323- if [[ -f libwolfssl.ko.signed ]]; then $( MAKE) -C . libwolfssl.ko.signed; fi
330+ if [[ -f '$(LIBWOLFSSL_NAME).ko.signed' ]]; then $(MAKE) -C . '$(LIBWOLFSSL_NAME).ko.signed'; fi
331+
332+
333+ # linuxkm-fips-hash implements offline (no-load) FIPS hash calculation and graft-in.
334+ #
335+ # libwolfssl.so is built from the same sources as the kernel module, with the
336+ # same FIPS setting, then used with linuxkm-fips-hash to calculate and overwrite
337+ # the hash in libwolfssl.ko. Finally, the module is [re]signed.
338+ #
339+ # Note that libwolfssl.so has to be built from a hierarchy of symlinks, to avoid
340+ # depending on changes/config in the source directory. Also, aside from
341+ # FIPS_FLAVOR, inherited configuration settings in the environment are cleansed.
342+
343+ libwolfssl-user-build/src/.libs/libwolfssl.so :
344+ @set -e
345+ @$(RM ) -rf ' $(MODULE_TOP)/libwolfssl-user-build'
346+ @mkdir ' $(MODULE_TOP)/libwolfssl-user-build'
347+ @cd ' $(MODULE_TOP)/libwolfssl-user-build'
348+ @pushd ' $(SRC_TOP)' > /dev/null
349+ @echo -n ' Populating tree of symlinks...'
350+ @readarray -d ' ' -t srcfiles < <( find examples src support tests testsuite wolfcrypt wolfssl configure * .in build-aux debian rpm scripts certs doc mcapi cmake linuxkm/* .[ch] \( -name options.h -o -name user_settings\* \) -prune -o \( ! -type d \) \( -name ' *.[chsSi]' -o -name configure -o -name ' *.in' -o -name \* .sh -o -path support/\* -o -path build-aux/\* -o -path debian/\* -o -path rpm/\* -o -path scripts/\* -o -path certs/\* -o -path doc/\* -o -path mcapi/\* -o -path cmake/\* \) -print0)
351+ @popd > /dev/null
352+ @for file in " $$ {srcfiles[@]}" ; do if [[ ! -e " $$ file" ]]; then mkdir -p " $$ (dirname " $$ file" )" && cp --no-dereference --symbolic-link --no-clobber ' $(SRC_TOP)' /" $$ file" " $$ file" ; fi ; done
353+ @echo ' done.'
354+ @echo ' __attribute__ ((visibility("default"))) extern const char coreKey[];' > user_settings.h
355+ @echo > user_settings_asm.h
356+ @echo -n ' Configuring libwolfssl.so...'
357+ @unset WOLFSSL_CFLAGS WOLFCRYPT_PIE_FILES ASFLAGS_FPUSIMD_ENABLE ASFLAGS_FPU_DISABLE_SIMD_ENABLE src_libwolfssl_la_OBJECTS WOLFSSL_ASFLAGS AM_CFLAGS WOLFSSL_OBJ_FILES ENABLED_LINUXKM_LKCAPI_REGISTER EXTRA_LDFLAGS CC LD
358+ @./configure --quiet --disable-jobserver --enable-cryptonly --enable-fips=" $$ FIPS_FLAVOR" CFLAGS=' -DWC_SYM_RELOC_TABLES_SUPPORT -DWOLFCRYPT_FIPS_CORE_DYNAMIC_HASH_VALUE -DWOLFSSL_USER_SETTINGS -DWOLFSSL_USER_SETTINGS_ASM'
359+ @echo ' done.'
360+ @echo -n ' Compiling and linking libwolfssl.so...'
361+ @$(MAKE ) > /dev/null
362+ @echo ' done.'
363+ @echo -n ' Fixing FIPS hash...'
364+ @userhash=$$(wolfcrypt/test/testwolfcrypt 2>&1 | sed -n -E 's/^hash = (.+ ) $$ /\1 /p' )
365+ @if [[ -z " $$ userhash" ]]; then echo ' FIPS hash not found!' >&2 ; exit 1; fi
366+ @find wolfcrypt/src -name ' *fips_test*o' -delete
367+ @$(MAKE ) EXTRA_CFLAGS=-DWOLFCRYPT_FIPS_CORE_HASH_VALUE=" $$ userhash"
368+ @echo ' done.'
369+
370+ linuxkm-fips-hash : libwolfssl-user-build/src/.libs/libwolfssl.so linuxkm-fips-hash.c
371+ @echo -n ' Compiling linuxkm-fips-hash...'
372+ # note direct invocation of cc -- we are compiling for the build host, not the target host.
373+ @cc -I'$(MODULE_TOP)/libwolfssl-user-build' -o linuxkm-fips-hash linuxkm/linuxkm-fips-hash.c -L '$(MODULE_TOP)/libwolfssl-user-build/src/.libs' -Wl,-rpath-link='$(MODULE_TOP)/libwolfssl-user-build/src/.libs' -Wl,-rpath='$(MODULE_TOP)/libwolfssl-user-build/src/.libs' -lwolfssl
374+ @echo ' done.'
375+
376+ .PHONY : module-with-matching-fips-hash
377+ module-with-matching-fips-hash : $(LIBWOLFSSL_NAME ) .ko linuxkm-fips-hash
378+ @set -e
379+ ./linuxkm-fips-hash-wrapper.sh " $<"
380+ $(MAKE ) -C . ' $(LIBWOLFSSL_NAME).ko.signed'
381+
382+ .PHONY : module-with-matching-fips-hash-no-sign
383+ module-with-matching-fips-hash-no-sign : $(LIBWOLFSSL_NAME ) .ko linuxkm-fips-hash
384+ @set -e
385+ ./linuxkm-fips-hash-wrapper.sh " $<"
324386
325- libwolfssl .ko.signed : libwolfssl .ko
387+ $( LIBWOLFSSL_NAME ) .ko.signed : $( LIBWOLFSSL_NAME ) .ko
326388ifdef FORCE_NO_MODULE_SIG
327389 @echo 'Skipping module signature operation because FORCE_NO_MODULE_SIG.'
328390else
@@ -371,6 +433,8 @@ clean:
371433 $(RM ) -rf ' $(MODULE_TOP)/linuxkm'
372434 $(RM ) -rf ' $(MODULE_TOP)/wolfcrypt'
373435 $(RM ) -rf ' $(MODULE_TOP)/src'
436+ $(RM ) -rf ' $(MODULE_TOP)/libwolfssl-user-build'
437+ $(RM ) -f ' $(MODULE_TOP)/linuxkm-fips-hash'
374438
375439.PHONY : check
376440check :
0 commit comments