# # Copyright (c) 2012-2019, Intel Corporation # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: # # * Redistributions of source code must retain the above copyright notice, # this list of conditions and the following disclaimer. # * Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # * Neither the name of Intel Corporation nor the names of its contributors # may be used to endorse or promote products derived from this software # without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE # DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR # SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER # CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, # OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # LIB = libIPSec_MB SHARED ?= y IMB_HDR = intel-ipsec-mb.h # Detect library version IMB_VERSION = $(shell grep -e "IMB_VERSION_STR" $(IMB_HDR) | cut -d'"' -f2) ifeq ($(IMB_VERSION),) $(error "Failed to detect library version!") endif VERSION = $(shell echo $(IMB_VERSION) | cut -d. -f1-3) SO_VERSION = $(shell echo $(VERSION) | cut -d. -f1) PREFIX ?= /usr LIB_INSTALL_DIR ?= $(PREFIX)/lib HDR_DIR ?= $(PREFIX)/include MAN_DIR ?= $(PREFIX)/man/man7 MAN1 = libipsec-mb.7 MAN2 = libipsec-mb-dev.7 NOLDCONFIG ?= n USE_YASM ?= n YASM ?= yasm NASM ?= nasm OBJ_DIR = obj INCLUDE_DIRS := include . no-aesni INCLUDES := $(foreach i,$(INCLUDE_DIRS),-I $i) CC ?= gcc CFLAGS := -DLINUX $(EXTRA_CFLAGS) $(INCLUDES) \ -W -Wall -Wextra -Wmissing-declarations -Wpointer-arith \ -Wcast-qual -Wundef -Wwrite-strings \ -Wformat -Wformat-security \ -Wunreachable-code -Wmissing-noreturn -Wsign-compare -Wno-endif-labels \ -Wstrict-prototypes -Wmissing-prototypes -Wold-style-definition \ -fno-strict-overflow -fno-delete-null-pointer-checks -fwrapv ASM_INCLUDE_DIRS := . YASM_INCLUDES := $(foreach i,$(ASM_INCLUDE_DIRS),-I $i) YASM_FLAGS := -f x64 -f elf64 -X gnu -g dwarf2 -DLINUX -D__linux__ $(YASM_INCLUDES) NASM_INCLUDES := $(foreach i,$(ASM_INCLUDE_DIRS),-I$i/) NASM_FLAGS := -felf64 -Xgnu -gdwarf -DLINUX -D__linux__ $(NASM_INCLUDES) ifeq ($(DEBUG),y) CFLAGS += -g -DDEBUG OPT = -O0 LDFLAGS += -g else OPT = -O3 CFLAGS += -fstack-protector -D_FORTIFY_SOURCE=2 endif ifeq ($(SAFE_DATA),y) CFLAGS += -DSAFE_DATA NASM_FLAGS += -DSAFE_DATA YASM_FLAGS += -DSAFE_DATA endif ifeq ($(SAFE_PARAM),y) CFLAGS += -DSAFE_PARAM NASM_FLAGS += -DSAFE_PARAM YASM_FLAGS += -DSAFE_PARAM endif ifneq ($(SAFE_LOOKUP),n) CFLAGS += -DSAFE_LOOKUP NASM_FLAGS += -DSAFE_LOOKUP YASM_FLAGS += -DSAFE_LOOKUP endif # prevent SIMD optimizations for non-aesni modules CFLAGS_NO_SIMD = $(CFLAGS) -O1 CFLAGS += $(OPT) # Set architectural optimizations for GCC/CC ifeq ($(CC),$(filter $(CC),gcc cc)) GCC_VERSION = $(shell $(CC) -dumpversion | cut -d. -f1) GCC_GE_V5 = $(shell [ $(GCC_VERSION) -ge 5 ] && echo true) ifeq ($(GCC_GE_V5),true) OPT_SSE = -march=nehalem -maes OPT_AVX = -march=sandybridge -maes OPT_AVX2 = -march=haswell -maes OPT_AVX512 = -march=broadwell OPT_NOAESNI = -march=nehalem endif endif # so or static build ifeq ($(SHARED),y) CFLAGS += -fPIC LIBNAME = $(LIB).so.$(VERSION) LIBPERM = 0755 LDFLAGS += -z noexecstack -z relro -z now else # SPDK crypto needs shared but -fPIC so to make it clear what # we are doing, we just comment out the CFLAGS below and # explicitly set them in our relevant makefile. #CFLAGS += -fPIE LIBNAME = $(LIB).a LIBPERM = 0644 LDFLAGS += -g endif # warning messages SAFE_PARAM_MSG1="SAFE_PARAM option not set." SAFE_PARAM_MSG2="Input parameters will not be checked." SAFE_DATA_MSG1="SAFE_DATA option not set." SAFE_DATA_MSG2="Stack and registers containing sensitive information, \ such keys or IV will not be cleared \ at the end of function calls." SAFE_LOOKUP_MSG1="SAFE_LOOKUP option not set." SAFE_LOOKUP_MSG2="Lookups which depend on sensitive information \ are not guaranteed to be done in constant time." ifeq ($(GCM_BIG_DATA),y) CFLAGS += -DGCM_BIG_DATA NASM_FLAGS += -DGCM_BIG_DATA YASM_FLAGS += -DGCM_BIG_DATA endif # # List of C modules (any origin) # c_lib_objs := \ mb_mgr_avx.o \ mb_mgr_avx2.o \ mb_mgr_avx512.o \ mb_mgr_sse.o \ mb_mgr_sse_no_aesni.o \ alloc.o \ aes_xcbc_expand_key.o \ md5_one_block.o \ sha_one_block.o \ des_key.o \ des_basic.o \ version.o \ cpu_feature.o \ aesni_emu.o \ kasumi_avx.o \ kasumi_iv.o \ kasumi_sse.o \ zuc_sse_top.o \ zuc_avx_top.o \ zuc_iv.o \ snow3g_sse.o \ snow3g_sse_no_aesni.o \ snow3g_avx.o \ snow3g_avx2.o \ snow3g_tables.o \ snow3g_iv.o # # List of ASM modules (root directory/common) # asm_generic_lib_objs := \ aes_keyexp_128.o \ aes_keyexp_192.o \ aes_keyexp_256.o \ aes_cmac_subkey_gen.o \ save_xmms.o \ clear_regs_mem_fns.o \ const.o \ aes128_ecbenc_x3.o \ zuc_common.o \ wireless_common.o \ constant_lookup.o # # List of ASM modules (no-aesni directory) # asm_noaesni_lib_objs := \ aes128_cbc_dec_by4_sse_no_aesni.o \ aes192_cbc_dec_by4_sse_no_aesni.o \ aes256_cbc_dec_by4_sse_no_aesni.o \ aes_cbc_enc_128_x4_no_aesni.o \ aes_cbc_enc_192_x4_no_aesni.o \ aes_cbc_enc_256_x4_no_aesni.o \ aes128_cntr_by4_sse_no_aesni.o \ aes192_cntr_by4_sse_no_aesni.o \ aes256_cntr_by4_sse_no_aesni.o \ aes_ecb_by4_sse_no_aesni.o \ aes128_cntr_ccm_by4_sse_no_aesni.o \ pon_sse_no_aesni.o \ aes_cfb_128_sse_no_aesni.o \ aes128_cbc_mac_x4_no_aesni.o \ aes_xcbc_mac_128_x4_no_aesni.o \ mb_mgr_aes_flush_sse_no_aesni.o \ mb_mgr_aes_submit_sse_no_aesni.o \ mb_mgr_aes192_flush_sse_no_aesni.o \ mb_mgr_aes192_submit_sse_no_aesni.o \ mb_mgr_aes256_flush_sse_no_aesni.o \ mb_mgr_aes256_submit_sse_no_aesni.o \ mb_mgr_aes_cmac_submit_flush_sse_no_aesni.o \ mb_mgr_aes_ccm_auth_submit_flush_sse_no_aesni.o \ mb_mgr_aes_xcbc_flush_sse_no_aesni.o \ mb_mgr_aes_xcbc_submit_sse_no_aesni.o # # List of ASM modules (sse directory) # asm_sse_lib_objs := \ aes128_cbc_dec_by4_sse.o \ aes192_cbc_dec_by4_sse.o \ aes256_cbc_dec_by4_sse.o \ aes_cbc_enc_128_x4.o \ aes_cbc_enc_192_x4.o \ aes_cbc_enc_256_x4.o \ pon_sse.o \ aes128_cntr_by4_sse.o \ aes192_cntr_by4_sse.o \ aes256_cntr_by4_sse.o \ aes_ecb_by4_sse.o \ aes128_cntr_ccm_by4_sse.o \ aes_cfb_128_sse.o \ aes128_cbc_mac_x4.o \ aes_xcbc_mac_128_x4.o \ md5_x4x2_sse.o \ sha1_mult_sse.o \ sha1_one_block_sse.o \ sha224_one_block_sse.o \ sha256_one_block_sse.o \ sha384_one_block_sse.o \ sha512_one_block_sse.o \ sha512_x2_sse.o \ sha_256_mult_sse.o \ sha1_ni_x2_sse.o \ sha256_ni_x2_sse.o \ zuc_sse.o \ mb_mgr_aes_flush_sse.o \ mb_mgr_aes_submit_sse.o \ mb_mgr_aes192_flush_sse.o \ mb_mgr_aes192_submit_sse.o \ mb_mgr_aes256_flush_sse.o \ mb_mgr_aes256_submit_sse.o \ mb_mgr_aes_cmac_submit_flush_sse.o \ mb_mgr_aes_ccm_auth_submit_flush_sse.o \ mb_mgr_aes_xcbc_flush_sse.o \ mb_mgr_aes_xcbc_submit_sse.o \ mb_mgr_hmac_md5_flush_sse.o \ mb_mgr_hmac_md5_submit_sse.o \ mb_mgr_hmac_flush_sse.o \ mb_mgr_hmac_submit_sse.o \ mb_mgr_hmac_sha_224_flush_sse.o \ mb_mgr_hmac_sha_224_submit_sse.o \ mb_mgr_hmac_sha_256_flush_sse.o \ mb_mgr_hmac_sha_256_submit_sse.o \ mb_mgr_hmac_sha_384_flush_sse.o \ mb_mgr_hmac_sha_384_submit_sse.o \ mb_mgr_hmac_sha_512_flush_sse.o \ mb_mgr_hmac_sha_512_submit_sse.o \ mb_mgr_hmac_flush_ni_sse.o \ mb_mgr_hmac_submit_ni_sse.o \ mb_mgr_hmac_sha_224_flush_ni_sse.o \ mb_mgr_hmac_sha_224_submit_ni_sse.o \ mb_mgr_hmac_sha_256_flush_ni_sse.o \ mb_mgr_hmac_sha_256_submit_ni_sse.o # # List of ASM modules (avx directory) # asm_avx_lib_objs := \ aes_cbc_enc_128_x8.o \ aes_cbc_enc_192_x8.o \ aes_cbc_enc_256_x8.o \ aes128_cbc_dec_by8_avx.o \ aes192_cbc_dec_by8_avx.o \ aes256_cbc_dec_by8_avx.o \ pon_avx.o \ aes128_cntr_by8_avx.o \ aes192_cntr_by8_avx.o \ aes256_cntr_by8_avx.o \ aes128_cntr_ccm_by8_avx.o \ aes_ecb_by4_avx.o \ aes_cfb_128_avx.o \ aes128_cbc_mac_x8.o \ aes_xcbc_mac_128_x8.o \ md5_x4x2_avx.o \ sha1_mult_avx.o \ sha1_one_block_avx.o \ sha224_one_block_avx.o \ sha256_one_block_avx.o \ sha_256_mult_avx.o \ sha384_one_block_avx.o \ sha512_one_block_avx.o \ sha512_x2_avx.o \ zuc_avx.o \ mb_mgr_aes_flush_avx.o \ mb_mgr_aes_submit_avx.o \ mb_mgr_aes192_flush_avx.o \ mb_mgr_aes192_submit_avx.o \ mb_mgr_aes256_flush_avx.o \ mb_mgr_aes256_submit_avx.o \ mb_mgr_aes_cmac_submit_flush_avx.o\ mb_mgr_aes_ccm_auth_submit_flush_avx.o \ mb_mgr_aes_xcbc_flush_avx.o \ mb_mgr_aes_xcbc_submit_avx.o \ mb_mgr_hmac_md5_flush_avx.o \ mb_mgr_hmac_md5_submit_avx.o \ mb_mgr_hmac_flush_avx.o \ mb_mgr_hmac_submit_avx.o \ mb_mgr_hmac_sha_224_flush_avx.o \ mb_mgr_hmac_sha_224_submit_avx.o \ mb_mgr_hmac_sha_256_flush_avx.o \ mb_mgr_hmac_sha_256_submit_avx.o \ mb_mgr_hmac_sha_384_flush_avx.o \ mb_mgr_hmac_sha_384_submit_avx.o \ mb_mgr_hmac_sha_512_flush_avx.o \ mb_mgr_hmac_sha_512_submit_avx.o # # List of ASM modules (avx2 directory) # asm_avx2_lib_objs := \ md5_x8x2_avx2.o \ sha1_x8_avx2.o \ sha256_oct_avx2.o \ sha512_x4_avx2.o \ mb_mgr_hmac_md5_flush_avx2.o \ mb_mgr_hmac_md5_submit_avx2.o \ mb_mgr_hmac_flush_avx2.o \ mb_mgr_hmac_submit_avx2.o \ mb_mgr_hmac_sha_224_flush_avx2.o \ mb_mgr_hmac_sha_224_submit_avx2.o \ mb_mgr_hmac_sha_256_flush_avx2.o \ mb_mgr_hmac_sha_256_submit_avx2.o \ mb_mgr_hmac_sha_384_flush_avx2.o \ mb_mgr_hmac_sha_384_submit_avx2.o \ mb_mgr_hmac_sha_512_flush_avx2.o \ mb_mgr_hmac_sha_512_submit_avx2.o # # List of ASM modules (avx512 directory) # asm_avx512_lib_objs := \ sha1_x16_avx512.o \ sha256_x16_avx512.o \ sha512_x8_avx512.o \ des_x16_avx512.o \ cntr_vaes_avx512.o \ aes_cbc_dec_vaes_avx512.o \ aes_cbc_enc_vaes_avx512.o \ mb_mgr_aes_submit_avx512.o \ mb_mgr_aes_flush_avx512.o \ mb_mgr_aes192_submit_avx512.o \ mb_mgr_aes192_flush_avx512.o \ mb_mgr_aes256_submit_avx512.o \ mb_mgr_aes256_flush_avx512.o \ mb_mgr_hmac_flush_avx512.o \ mb_mgr_hmac_submit_avx512.o \ mb_mgr_hmac_sha_224_flush_avx512.o \ mb_mgr_hmac_sha_224_submit_avx512.o \ mb_mgr_hmac_sha_256_flush_avx512.o \ mb_mgr_hmac_sha_256_submit_avx512.o \ mb_mgr_hmac_sha_384_flush_avx512.o \ mb_mgr_hmac_sha_384_submit_avx512.o \ mb_mgr_hmac_sha_512_flush_avx512.o \ mb_mgr_hmac_sha_512_submit_avx512.o \ mb_mgr_des_avx512.o # # GCM object file lists # c_gcm_objs := gcm.o asm_noaesni_gcm_objs := \ gcm128_sse_no_aesni.o gcm192_sse_no_aesni.o gcm256_sse_no_aesni.o asm_sse_gcm_objs := \ gcm128_sse.o gcm192_sse.o gcm256_sse.o asm_avx_gcm_objs := \ gcm128_avx_gen2.o gcm192_avx_gen2.o gcm256_avx_gen2.o asm_avx2_gcm_objs := \ gcm128_avx_gen4.o gcm192_avx_gen4.o gcm256_avx_gen4.o asm_avx512_gcm_objs := \ gcm128_vaes_avx512.o gcm192_vaes_avx512.o gcm256_vaes_avx512.o \ gcm128_avx512.o gcm192_avx512.o gcm256_avx512.o # # build object files lists for GCM and NO-GCM variants # ifeq ($(NO_GCM), y) CFLAGS += -DNO_GCM asm_obj_files := $(asm_generic_lib_objs) $(asm_noaesni_lib_objs) \ $(asm_sse_lib_objs) $(asm_avx_lib_objs) \ $(asm_avx2_lib_objs) $(asm_avx512_lib_objs) c_obj_files := $(c_lib_objs) else asm_obj_files := $(asm_generic_lib_objs) \ $(asm_noaesni_lib_objs) $(asm_noaesni_gcm_objs) \ $(asm_sse_lib_objs) $(asm_sse_gcm_objs) \ $(asm_avx_lib_objs) $(asm_avx_gcm_objs) \ $(asm_avx2_lib_objs) $(asm_avx2_gcm_objs) \ $(asm_avx512_lib_objs) $(asm_avx512_gcm_objs) c_obj_files := $(c_lib_objs) $(c_gcm_objs) endif # # aggregate all objects files together and prefix with OBJDIR # lib_obj_files := $(asm_obj_files) $(c_obj_files) target_obj_files := $(lib_obj_files:%=$(OBJ_DIR)/%) # # create a list of dependency files for assembly modules # create a list of dependency files for c modules then # prefix these with OBJDIR # asm_dep_files := $(asm_obj_files:%.o=%.d) c_dep_files := $(c_obj_files:%.o=%.d) c_dep_target_files := $(c_dep_files:%=$(OBJ_DIR)/%) # # aggregate all dependency files together and prefix with OBJDIR # dep_files := $(asm_dep_files) $(c_dep_files) dep_target_files := $(dep_files:%=$(OBJ_DIR)/%) all: $(LIBNAME) $(LIBNAME): $(target_obj_files) ifeq ($(SHARED),y) $(CC) -shared -Wl,-soname,$(LIB).so.$(SO_VERSION) -o $(LIBNAME) $^ -lc ln -f -s $(LIBNAME) $(LIB).so.$(SO_VERSION) ln -f -s $(LIB).so.$(SO_VERSION) $(LIB).so else $(AR) -qcs $@ $^ endif ifneq ($(SAFE_PARAM), y) @echo "NOTE:" $(SAFE_PARAM_MSG1) $(SAFE_PARAM_MSG2) endif ifneq ($(SAFE_DATA), y) @echo "NOTE:" $(SAFE_DATA_MSG1) $(SAFE_DATA_MSG2) endif ifeq ($(SAFE_LOOKUP), n) @echo "NOTE:" $(SAFE_LOOKUP_MSG1) $(SAFE_LOOKUP_MSG2) endif .PHONY: install install: $(LIBNAME) install -d $(HDR_DIR) install -m 0644 $(IMB_HDR) $(HDR_DIR) install -d $(LIB_INSTALL_DIR) install -s -m $(LIBPERM) $(LIBNAME) $(LIB_INSTALL_DIR) install -d $(MAN_DIR) install -m 0444 $(MAN1) $(MAN_DIR) install -m 0444 $(MAN2) $(MAN_DIR) ifeq ($(SHARED),y) cd $(LIB_INSTALL_DIR); \ ln -f -s $(LIB).so.$(VERSION) $(LIB).so.$(SO_VERSION); \ ln -f -s $(LIB).so.$(SO_VERSION) $(LIB).so ifneq ($(NOLDCONFIG),y) ldconfig endif endif .PHONY: uninstall uninstall: $(LIBNAME) -rm -f $(HDR_DIR)/$(IMB_HDR) -rm -f $(LIB_INSTALL_DIR)/$(LIBNAME) -rm -f $(MAN_DIR)/$(MAN1) -rm -f $(MAN_DIR)/$(MAN2) ifeq ($(SHARED),y) -rm -f $(LIB_INSTALL_DIR)/$(LIB).so.$(SO_VERSION) -rm -f $(LIB_INSTALL_DIR)/$(LIB).so endif .PHONY: build_c_dep_target_files build_c_dep_target_files: $(c_dep_target_files) $(target_obj_files): | $(OBJ_DIR) build_c_dep_target_files $(dep_target_files): | $(OBJ_DIR) # # dependency file build recipies # $(OBJ_DIR)/%.d:%.c $(CC) -MM -MP -MF $@ $(CFLAGS) $< $(OBJ_DIR)/%.d:sse/%.c $(CC) -MM -MP -MF $@ $(CFLAGS) $< $(OBJ_DIR)/%.d:avx/%.c $(CC) -MM -MP -MF $@ $(CFLAGS) $< $(OBJ_DIR)/%.d:avx2/%.c $(CC) -MM -MP -MF $@ $(CFLAGS) $< $(OBJ_DIR)/%.d:avx512/%.c $(CC) -MM -MP -MF $@ $(CFLAGS) $< $(OBJ_DIR)/%.d:no-aesni/%.c $(CC) -MM -MP -MF $@ $(CFLAGS) $< # # object file build recipies # $(OBJ_DIR)/%.o:%.c $(CC) -c $(CFLAGS) $< -o $@ $(OBJ_DIR)/%.o:%.asm ifeq ($(USE_YASM),y) $(YASM) $(YASM_FLAGS) $< -o $@ else $(NASM) -MD $(@:.o=.d) -MT $@ -o $@ $(NASM_FLAGS) $< endif $(OBJ_DIR)/%.o:sse/%.c $(CC) $(OPT_SSE) -c $(CFLAGS) $< -o $@ $(OBJ_DIR)/%.o:sse/%.asm ifeq ($(USE_YASM),y) $(YASM) $(YASM_FLAGS) $< -o $@ else $(NASM) -MD $(@:.o=.d) -MT $@ -o $@ $(NASM_FLAGS) $< endif $(OBJ_DIR)/%.o:avx/%.c $(CC) $(OPT_AVX) -c $(CFLAGS) $< -o $@ $(OBJ_DIR)/%.o:avx/%.asm ifeq ($(USE_YASM),y) $(YASM) $(YASM_FLAGS) $< -o $@ else $(NASM) -MD $(@:.o=.d) -MT $@ -o $@ $(NASM_FLAGS) $< endif $(OBJ_DIR)/%.o:avx2/%.c $(CC) $(OPT_AVX2) -c $(CFLAGS) $< -o $@ $(OBJ_DIR)/%.o:avx2/%.asm ifeq ($(USE_YASM),y) $(YASM) $(YASM_FLAGS) $< -o $@ else $(NASM) -MD $(@:.o=.d) -MT $@ -o $@ $(NASM_FLAGS) $< endif $(OBJ_DIR)/%.o:avx512/%.c $(CC) $(OPT_AVX512) -c $(CFLAGS) $< -o $@ $(OBJ_DIR)/%.o:avx512/%.asm ifeq ($(USE_YASM),y) $(YASM) $(YASM_FLAGS) $< -o $@ else $(NASM) -MD $(@:.o=.d) -MT $@ -o $@ $(NASM_FLAGS) $< endif $(OBJ_DIR)/%.o:include/%.asm ifeq ($(USE_YASM),y) $(YASM) $(YASM_FLAGS) $< -o $@ else $(NASM) -MD $(@:.o=.d) -MT $@ -o $@ $(NASM_FLAGS) $< endif $(OBJ_DIR)/%.o:no-aesni/%.c $(CC) $(OPT_NOAESNI) -c $(CFLAGS_NO_SIMD) $< -o $@ $(OBJ_DIR)/%.o:no-aesni/%.asm ifeq ($(USE_YASM),y) $(YASM) $(YASM_FLAGS) $< -o $@ else $(NASM) -MD $(@:.o=.d) -MT $@ -o $@ $(NASM_FLAGS) $< endif $(OBJ_DIR): mkdir $(OBJ_DIR) .PHONY: TAGS TAGS: find ./ -name '*.[ch]' | etags - find ./ -name '*.asm' | etags -a - find ./ -name '*.inc' | etags -a - .PHONY: clean clean: rm -Rf $(target_obj_files) rm -Rf $(dep_target_files) rm -f $(LIB).a $(LIB).so* .PHONY: help help: @echo "Available build options:" @echo "DEBUG=n (default)" @echo " - this option will produce library not fit for debugging" @echo "SHARED=y (default)" @echo " - this option will produce shared library" @echo "DEBUG=y - this option will produce library fit for debugging" @echo "SHARED=n - this option will produce static library" @echo "SAFE_DATA=n (default)" @echo " - Sensitive data not cleared from registers and memory" @echo " at operation end" @echo "SAFE_DATA=y" @echo " - Sensitive data cleared from registers and memory" @echo " at operation end" @echo "SAFE_PARAM=n (default)" @echo " - API input parameters not checked" @echo "SAFE_PARAM=y" @echo " - API input parameters checked" @echo "SAFE_LOOKUP=n" @echo " - Lookups depending on sensitive data might not be constant time" @echo "SAFE_LOOKUP=y (default)" @echo " - Lookups depending on sensitive data are constant time" @echo "GCM_BIG_DATA=n (default)" @echo " - Smaller GCM key structure with good performance level (VAES)" @echo " for packet processing applications (buffers size < 2K)" @echo " - 8 ghash keys used on SSE, AVX, AVX2 and AVX512" @echo " - 48 ghash keys used on AVX512 with VAES and VPCLMULQDQ" @echo "GCM_BIG_DATA=y" @echo " - Better performing VAES GCM on big buffers using more ghash keys." @echo " This option results in a much bigger gcm_key structure (>2K)." @echo " It only takes effect on platforms with VAES and VPCLMULQDQ." CHECKPATCH ?= checkpatch.pl # checkpatch ignore settings: # SPACING - produces false positives with tyepdefs and * # CONSTANT_COMPARISON - forbids defensive programming technique # USE_FUNC - produces false positives for Windows target # INITIALISED_STATIC, LEADING_SPACE, SPLIT_STRING, CODE_INDENT, # PREFER_ALIGNED, UNSPECIFIED_INT, ARRAY_SIZE, GLOBAL_INITIALISERS, # NEW_TYPEDEFS, AVOID_EXTERNS, COMPLEX_MACRO, BLOCK_COMMENT_STYLE # - found obsolete in this project # # NOTE: these flags cannot be broken into multiple lines due to # spaces injected by make CHECKPATCH_FLAGS = --no-tree --no-signoff --emacs --no-color --ignore CODE_INDENT,INITIALISED_STATIC,LEADING_SPACE,SPLIT_STRING,UNSPECIFIED_INT,ARRAY_SIZE,BLOCK_COMMENT_STYLE,GLOBAL_INITIALISERS,NEW_TYPEDEFS,AVOID_EXTERNS,COMPLEX_MACRO,PREFER_ALIGNED,USE_FUNC,CONSTANT_COMPARISON,SPACING %.c_style_check : %.c $(CHECKPATCH) $(CHECKPATCH_FLAGS) -f $< %.h_style_check : %.h $(CHECKPATCH) $(CHECKPATCH_FLAGS) -f $< %.asm_style_check : %.asm $(CHECKPATCH) $(CHECKPATCH_FLAGS) -f $< %.inc_style_check : %.inc $(CHECKPATCH) $(CHECKPATCH_FLAGS) -f $< SOURCES_DIRS := . sse avx avx2 avx512 include no-aesni SOURCES := $(foreach dir,$(SOURCES_DIRS),$(wildcard $(dir)/*.[ch]) $(wildcard $(dir)/*.asm) $(wildcard $(dir)/*.inc)) SOURCES_STYLE := $(foreach infile,$(SOURCES),$(infile)_style_check) .PHONY: style style: $(SOURCES_STYLE) # if target not clean or rinse then make dependencies ifneq ($(MAKECMDGOALS),clean) ifneq ($(MAKECMDGOALS),style) -include $(dep_target_files) endif endif