Skip to content

Instantly share code, notes, and snippets.

@gvanem
Last active February 16, 2023 10:02
Show Gist options
  • Save gvanem/2f78e7234be572720f12faf9988aa892 to your computer and use it in GitHub Desktop.
Save gvanem/2f78e7234be572720f12faf9988aa892 to your computer and use it in GitHub Desktop.
GNU-makefile for Nettle + Hogweed (MSVC/clang-cl, x86/x64)
#
# Nettle + Hogweed Makefile for MSVC and clang-cl.
#
MAJOR_VERSION = 3
MINOR_VERSION = 8
PATCH_VERSION = 0
VERSION = $(MAJOR_VERSION).$(MINOR_VERSION)
MAKEFLAGS += --warn-undefined-variables
DATE = $(shell date +%d-%B-%Y)
PYTHON = py -3
#
# Options and roots:
#
USE_ASM_SRC ?= 1
USE_ASM_AES ?= 1
USE_ASTYLE ?= 1
USE_CLANG_FORMAT ?= 1
USE_FAT ?= 0
USE_HOGWEED ?= 1
USE_MINI_GMP ?= 0
USE_MP_COMPILE ?= 1
USE_OPENSSL ?= 0
USE_VERBOSE_TEST ?= 0
GMP_ROOT ?= f:/MinGW32/src/Math/gmp
OPENSSL_ROOT ?= f:/MinGW32/src/inet/Crypto/OpenSSL
INSTALL_ROOT = $(realpath $(VSINSTALLDIR))
MSVC_ROOT = $(realpath $(VCToolkitInstallDir))
#
# Nettle names:
#
NETTLE_STAT_LIB = lib/nettle-$(CPU).lib
NETTLE_IMP_LIB = lib/nettle_imp-$(CPU).lib
NETTLE_DLL = bin/nettle-$(CPU).dll
THIS_FILE = Makefile.Windows
MDEPEND = $(THIS_FILE)
define Usage
Usage: make -f $(THIS_FILE) <CPU=x86|x64> [CC=cl | clang-cl] <target(s)>
CC=cl: build with MSVC
CC=clang-cl: build with clang-cl
targets: all, clean, vclean, depend, doc, install, programs, tests, runtests
endef
ifeq ($(CC),cl)
RCFLAGS = -D_MSC_VER
else ifeq ($(CC),clang-cl)
RCFLAGS = -D__clang__
else
$(error $(Usage))
endif
#
# What to build:
#
TARGETS = $(NETTLE_STAT_LIB) \
$(NETTLE_IMP_LIB) \
$(NETTLE_DLL)
ifeq ($(CPU),x86)
uscore = _
BITS = 32
else ifeq ($(CPU),x64)
uscore =
BITS = 64
else
$(error Unsupported CPU='$(CPU)')
endif
ifeq ($(USE_FAT),1)
ifneq ($(USE_ASM_SRC),1)
$(error 'USE_FAT=1' and 'USE_ASM_SRC=0' is meaningless)
endif
ifneq ($(CPU),x64)
$(error 'USE_FAT=1' can only be used for 'x64')
endif
endif
c_to_exe = $(addprefix bin/, $(notdir $(1:.c=.exe)) )
c_to_obj = $(addprefix $(OBJ_DIR)/, $(notdir $(1:.c=.obj)) )
asm_to_obj = $(addprefix $(OBJ_DIR)/asm/, $(notdir $(1:.asm=.obj)) )
#
# Remove any 'CL' in env.
#
export CL=
OBJ_DIR = objects
CFLAGS = -nologo -MD -W3 -Zi -Ot -Gs0 -Oi -GF -GS-
CFLAGS += -FI./$(OBJ_DIR)/config.h \
-I. \
-I./testsuite \
-I./include \
-I./include/nettle \
-I./$(OBJ_DIR)
ifeq ($(CPU),x64)
CFLAGS += -arch:AVX2
else
CFLAGS += -arch:SSE2
endif
ifeq ($(CC),clang-cl)
CFLAGS += -fms-compatibility \
-ferror-limit=5
endif
CXXFLAGS = -TP -EHsc -std:c++20
LDFLAGS = -nologo -debug -incremental:no -verbose -map \
-machine:$(CPU) -nodefaultlib:uuid.lib
#
# Select the correct 'cl.exe' compiler and setup the
# correct LIBPATH w/o the 'vcvarsall.bat' non-sense.
#
# Visual-Studio 2017 (or later) with 'Windows-Kit' is required here:
#
ifeq ($(CC),cl)
_CC = $(MSVC_ROOT)/bin/HostX86/$(CPU)/cl.exe
else
#
# A 'clang-cl.bat' (on PATH) should look like this:
# @echo off
# setlocal
# set CL_32=f:\ProgramFiler\LLVM-14-32bit << install base of your 32-bit Clang
# set CL_64=f:\ProgramFiler\LLVM-14-64bit << ditto for 64-bit
# if %1. == -m32. (
# shift
# %CL_32%\bin\clang-cl.exe %*
# ) else if %1. == -m64. (
# shift
# %CL_64%\bin\clang-cl.exe %*
# ) else (
# clang-cl.exe %*
# )
#
_CC = clang-cl.bat -m$(BITS)
endif
#
# The path for the CRT library (msvcrt.lib):
#
LDFLAGS += -libpath:$(MSVC_ROOT)/lib/$(CPU)
#
# 'WindowsKits' root is in $(WindowsSdkDir) and
# 'WindowsKits' version is in $(WindowsSdkVer).
#
# Hence the User-Mode libraries for 'x86' are in:
# $(WindowsSdkDir)/Lib/$(WindowsSdkVer)/um/x86/
#
LDFLAGS += -libpath:$(realpath $(WindowsSdkDir)/Lib/$(WindowsSdkVer)/um/$(CPU))
#
# Ditto for the Universal CRT libraries: for 'x86' the UCRT libs are in:
# $(WindowsSdkDir)/Lib/$(WindowsSdkVer)/ucrt/x86/
#
LDFLAGS += -libpath:$(realpath $(WindowsSdkDir)/Lib/$(WindowsSdkVer)/ucrt/$(CPU))
RCFLAGS += -nologo
ECC_H_FILES = $(addprefix $(OBJ_DIR)/, \
ecc-secp192r1.h \
ecc-secp224r1.h \
ecc-secp256r1.h \
ecc-secp384r1.h \
ecc-secp521r1.h \
ecc-curve25519.h \
ecc-curve448.h \
ecc-gost-gc256b.h \
ecc-gost-gc512a.h)
GENERATED = $(addprefix include/nettle/, \
version.h \
nettle-stdint.h) \
\
$(addprefix $(OBJ_DIR)/, \
config.h \
check-for-unused-libs.py \
keymap.h \
rotors.h \
unistd.h \
sys/time.h \
desdata.exe \
eccdata.exe) \
\
$(ECC_H_FILES)
ifeq ($(USE_ASM_SRC),1)
GENERATED += $(OBJ_DIR)/asm/config.m4
endif
ifeq ($(USE_MINI_GMP),1)
CFLAGS += -DNETTLE_USE_MINI_GMP=1
NETTLE_C_SRC = mini-gmp.c
GMP_STAT_LIB =
GMP_IMP_LIB =
else
#
# GNU Multiprecision Library names:
#
GMP_STAT_LIB = $(GMP_ROOT)/lib/gmp-$(CPU).lib
GMP_IMP_LIB = $(GMP_ROOT)/lib/gmp_imp-$(CPU).lib
CFLAGS += -I$(GMP_ROOT)/include/$(CPU)
endif
vpath %.c testsuite tools
NETTLE_C_SRC += aes-decrypt-table.c \
aes-decrypt.c \
aes-encrypt-table.c \
aes-encrypt.c \
aes-invert-internal.c \
aes-set-decrypt-key.c \
aes-set-encrypt-key.c \
aes-set-key-internal.c \
aes128-meta.c \
aes128-set-decrypt-key.c \
aes128-set-encrypt-key.c \
aes192-meta.c \
aes192-set-decrypt-key.c \
aes192-set-encrypt-key.c \
aes256-meta.c \
aes256-set-decrypt-key.c \
aes256-set-encrypt-key.c \
arcfour.c \
arctwo-meta.c \
arctwo.c \
balloon-sha1.c \
balloon-sha256.c \
balloon-sha384.c \
balloon-sha512.c \
balloon.c \
base16-decode.c \
base16-encode.c \
base16-meta.c \
base64-decode.c \
base64-encode.c \
base64-meta.c \
base64url-decode.c \
base64url-encode.c \
base64url-meta.c \
bignum-random-prime.c \
bignum-random.c \
bignum.c \
blowfish-bcrypt.c \
blowfish.c \
buffer-init.c \
buffer.c \
camellia-absorb.c \
camellia-invert-key.c \
camellia-table.c \
camellia128-crypt.c \
camellia128-meta.c \
camellia128-set-decrypt-key.c \
camellia128-set-encrypt-key.c \
camellia192-meta.c \
camellia256-crypt.c \
camellia256-meta.c \
camellia256-set-decrypt-key.c \
camellia256-set-encrypt-key.c \
cast128-meta.c \
cast128.c \
cbc.c \
ccm-aes128.c \
ccm-aes192.c \
ccm-aes256.c \
ccm.c \
cfb.c \
chacha-core-internal.c \
chacha-crypt.c \
chacha-poly1305-meta.c \
chacha-poly1305.c \
chacha-set-key.c \
chacha-set-nonce.c \
cmac-aes128-meta.c \
cmac-aes128.c \
cmac-aes256-meta.c \
cmac-aes256.c \
cmac-des3-meta.c \
cmac-des3.c \
cmac.c \
cmac64.c \
cnd-copy.c \
cnd-memcpy.c \
ctr.c \
ctr16.c \
curve25519-eh-to-x.c \
curve25519-mul-g.c \
curve25519-mul.c \
curve448-eh-to-x.c \
curve448-mul-g.c \
curve448-mul.c \
der-iterator.c \
der2dsa.c \
der2rsa.c \
des.c \
des3.c \
dsa-compat-keygen.c \
dsa-compat.c \
dsa-gen-params.c \
dsa-hash.c \
dsa-keygen.c \
dsa-sha1-sign.c \
dsa-sha1-verify.c \
dsa-sha256-sign.c \
dsa-sha256-verify.c \
dsa-sign.c \
dsa-verify.c \
dsa.c \
dsa2sexp.c \
eax-aes128-meta.c \
eax-aes128.c \
eax.c \
ecc-a-to-j.c \
ecc-add-eh.c \
ecc-add-ehh.c \
ecc-add-jja.c \
ecc-add-jjj.c \
ecc-add-th.c \
ecc-add-thh.c \
ecc-curve25519.c \
ecc-curve448.c \
ecc-dup-eh.c \
ecc-dup-jj.c \
ecc-dup-th.c \
ecc-ecdsa-sign.c \
ecc-ecdsa-verify.c \
ecc-eh-to-a.c \
ecc-gost-gc256b.c \
ecc-gost-gc512a.c \
ecc-gostdsa-sign.c \
ecc-gostdsa-verify.c \
ecc-hash.c \
ecc-j-to-a.c \
ecc-mod-arith.c \
ecc-mod-inv.c \
ecc-mod.c \
ecc-mul-a-eh.c \
ecc-mul-a.c \
ecc-mul-g-eh.c \
ecc-mul-g.c \
ecc-mul-m.c \
ecc-nonsec-add-jjj.c \
ecc-pm1-redc.c \
ecc-point-mul-g.c \
ecc-point-mul.c \
ecc-point.c \
ecc-pp1-redc.c \
ecc-random.c \
ecc-scalar.c \
ecc-secp192r1.c \
ecc-secp224r1.c \
ecc-secp256r1.c \
ecc-secp384r1.c \
ecc-secp521r1.c \
ecc-size.c \
ecdsa-keygen.c \
ecdsa-sign.c \
ecdsa-verify.c \
ed25519-sha512-pubkey.c \
ed25519-sha512-sign.c \
ed25519-sha512-verify.c \
ed25519-sha512.c \
ed448-shake256-pubkey.c \
ed448-shake256-sign.c \
ed448-shake256-verify.c \
ed448-shake256.c \
eddsa-compress.c \
eddsa-decompress.c \
eddsa-expand.c \
eddsa-hash.c \
eddsa-pubkey.c \
eddsa-sign.c \
eddsa-verify.c \
gcm-aes.c \
gcm-aes128-meta.c \
gcm-aes128.c \
gcm-aes192-meta.c \
gcm-aes192.c \
gcm-aes256-meta.c \
gcm-aes256.c \
gcm-camellia128-meta.c \
gcm-camellia128.c \
gcm-camellia256-meta.c \
gcm-camellia256.c \
gcm-sm4-meta.c \
gcm-sm4.c \
gcm.c \
ghash-set-key.c \
ghash-update.c \
gmp-glue.c \
gost28147.c \
gostdsa-sign.c \
gostdsa-verify.c \
gostdsa-vko.c \
gosthash94-meta.c \
gosthash94.c \
hkdf.c \
hmac-gosthash94.c \
hmac-md5-meta.c \
hmac-md5.c \
hmac-ripemd160-meta.c \
hmac-ripemd160.c \
hmac-sha1-meta.c \
hmac-sha1.c \
hmac-sha224-meta.c \
hmac-sha224.c \
hmac-sha256-meta.c \
hmac-sha256.c \
hmac-sha384-meta.c \
hmac-sha384.c \
hmac-sha512-meta.c \
hmac-sha512.c \
hmac-sm3-meta.c \
hmac-sm3.c \
hmac-streebog-meta.c \
hmac-streebog.c \
hmac.c \
knuth-lfib.c \
md2-meta.c \
md2.c \
md4-meta.c \
md4.c \
md5-compat.c \
md5-meta.c \
md5.c \
memeql-sec.c \
memxor.c \
memxor3.c \
nettle-internal.c \
nettle-lookup-hash.c \
nettle-meta-aeads.c \
nettle-meta-armors.c \
nettle-meta-ciphers.c \
nettle-meta-hashes.c \
nettle-meta-macs.c \
nist-keywrap.c \
ocb-aes128.c \
ocb.c \
pbkdf2-hmac-gosthash94.c \
pbkdf2-hmac-sha1.c \
pbkdf2-hmac-sha256.c \
pbkdf2-hmac-sha384.c \
pbkdf2-hmac-sha512.c \
pbkdf2.c \
pgp-encode.c \
pkcs1-decrypt.c \
pkcs1-encrypt.c \
pkcs1-rsa-digest.c \
pkcs1-rsa-md5.c \
pkcs1-rsa-sha1.c \
pkcs1-rsa-sha256.c \
pkcs1-rsa-sha512.c \
pkcs1-sec-decrypt.c \
pkcs1.c \
poly1305-aes.c \
poly1305-internal.c \
poly1305-update.c \
pss-mgf1.c \
pss.c \
realloc.c \
ripemd160-compress.c \
ripemd160-meta.c \
ripemd160.c \
rsa-blind.c \
rsa-decrypt-tr.c \
rsa-decrypt.c \
rsa-encrypt.c \
rsa-keygen.c \
rsa-md5-sign-tr.c \
rsa-md5-sign.c \
rsa-md5-verify.c \
rsa-pkcs1-sign-tr.c \
rsa-pkcs1-sign.c \
rsa-pkcs1-verify.c \
rsa-pss-sha256-sign-tr.c \
rsa-pss-sha256-verify.c \
rsa-pss-sha512-sign-tr.c \
rsa-pss-sha512-verify.c \
rsa-sec-compute-root.c \
rsa-sec-decrypt.c \
rsa-sha1-sign-tr.c \
rsa-sha1-sign.c \
rsa-sha1-verify.c \
rsa-sha256-sign-tr.c \
rsa-sha256-sign.c \
rsa-sha256-verify.c \
rsa-sha512-sign-tr.c \
rsa-sha512-sign.c \
rsa-sha512-verify.c \
rsa-sign-tr.c \
rsa-sign.c \
rsa-verify.c \
rsa.c \
rsa2openpgp.c \
rsa2sexp.c \
salsa20-128-set-key.c \
salsa20-256-set-key.c \
salsa20-core-internal.c \
salsa20-crypt-internal.c \
salsa20-crypt.c \
salsa20-set-key.c \
salsa20-set-nonce.c \
salsa20r12-crypt.c \
sec-add-1.c \
sec-sub-1.c \
serpent-decrypt.c \
serpent-encrypt.c \
serpent-meta.c \
serpent-set-key.c \
sexp-format.c \
sexp-transport-format.c \
sexp-transport.c \
sexp.c \
sexp2bignum.c \
sexp2dsa.c \
sexp2rsa.c \
sha1-meta.c \
sha1.c \
sha224-meta.c \
sha256-meta.c \
sha256.c \
sha3-224-meta.c \
sha3-224.c \
sha3-256-meta.c \
sha3-256.c \
sha3-384-meta.c \
sha3-384.c \
sha3-512-meta.c \
sha3-512.c \
sha3-permute.c \
sha3.c \
sha384-meta.c \
sha512-224-meta.c \
sha512-256-meta.c \
sha512-compress.c \
sha512-meta.c \
sha512.c \
shake256.c \
siv-cmac-aes128.c \
siv-cmac-aes256.c \
siv-cmac.c \
siv-gcm-aes128.c \
siv-gcm-aes256.c \
siv-gcm.c \
siv-ghash-set-key.c \
siv-ghash-update.c \
sm3-meta.c \
sm3.c \
sm4-meta.c \
sm4.c \
streebog-meta.c \
streebog.c \
twofish-meta.c \
twofish.c \
umac-l2.c \
umac-l3.c \
umac-nh-n.c \
umac-nh.c \
umac-poly128.c \
umac-poly64.c \
umac-set-key.c \
umac128.c \
umac32.c \
umac64.c \
umac96.c \
version.c \
win32-missing.c \
write-be32.c \
write-le32.c \
write-le64.c \
xts-aes128.c \
xts-aes256.c \
xts.c \
yarrow256.c \
yarrow_key_event.c
#
# Unfinished:
#
ifeq ($(USE_FAT),1)
NETTLE_C_SRC += aes128-decrypt.c \
aes128-encrypt.c \
aes192-decrypt.c \
aes192-encrypt.c \
aes256-decrypt.c \
aes256-encrypt.c \
aes-decrypt-internal.c \
aes-encrypt-internal.c \
camellia-crypt-internal.c \
cbc-aes128-encrypt.c \
cbc-aes192-encrypt.c \
cbc-aes256-encrypt.c \
fat-x86_64.c
# NETTLE_ASM_SRC = $(addprefix x86_64/, \
# ecc-curve25519-modp.asm \
# ecc-curve448-modp.asm \
# sha512-compress.asm \
# umac-nh-n.asm)
NETTLE_ASM_SRC = $(addprefix x86_64/fat/, \
aes128-decrypt-2.asm \
aes128-encrypt-2.asm \
aes192-decrypt-2.asm \
aes192-encrypt-2.asm \
aes256-decrypt-2.asm \
aes256-encrypt-2.asm \
cbc-aes128-encrypt-2.asm \
cbc-aes192-encrypt-2.asm \
cbc-aes256-encrypt-2.asm \
cpuid.asm \
memxor-2.asm \
memxor.asm \
sha1-compress.asm \
sha256-compress-n-2.asm \
sha256-compress-n.asm)
else ifeq ($(CPU)-$(USE_ASM_SRC),x64-1)
NETTLE_ASM_SRC = $(addprefix x86_64/, \
camellia-crypt-internal.asm \
md5-compress.asm \
sha1-compress.asm \
sha256-compress-n.asm)
ifeq ($(USE_ASM_AES),1)
NETTLE_ASM_SRC += $(addprefix x86_64/aesni/, \
aes128-decrypt.asm \
aes128-encrypt.asm \
aes192-decrypt.asm \
aes192-encrypt.asm \
aes256-decrypt.asm \
aes256-encrypt.asm \
cbc-aes128-encrypt.asm \
cbc-aes192-encrypt.asm \
cbc-aes256-encrypt.asm)
else
NETTLE_C_SRC += aes128-decrypt.c \
aes128-encrypt.c \
aes192-decrypt.c \
aes192-encrypt.c \
aes256-decrypt.c \
aes256-encrypt.c \
aes-decrypt-internal.c \
aes-encrypt-internal.c \
camellia-crypt-internal.c \
cbc-aes128-encrypt.c \
cbc-aes192-encrypt.c \
cbc-aes256-encrypt.c
endif
else ifeq ($(CPU)-$(USE_ASM_SRC),x86-1)
NETTLE_ASM_SRC = $(addprefix x86/, \
aes-decrypt-internal.asm \
aes-encrypt-internal.asm \
camellia-crypt-internal.asm \
md5-compress.asm \
sha1-compress.asm)
NETTLE_C_SRC += aes128-decrypt.c \
aes128-encrypt.c \
aes192-decrypt.c \
aes192-encrypt.c \
aes256-decrypt.c \
aes256-encrypt.c \
cbc-aes128-encrypt.c \
cbc-aes192-encrypt.c \
cbc-aes256-encrypt.c \
sha256-compress-n.c
else
NETTLE_C_SRC += aes128-decrypt.c \
aes128-encrypt.c \
aes192-decrypt.c \
aes192-encrypt.c \
aes256-decrypt.c \
aes256-encrypt.c \
aes-decrypt-internal.c \
aes-encrypt-internal.c \
camellia-crypt-internal.c \
cbc-aes128-encrypt.c \
cbc-aes192-encrypt.c \
cbc-aes256-encrypt.c \
md5-compress.c \
sha1-compress.c \
sha256-compress-n.c
NETTLE_ASM_SRC =
endif
NETTLE_ASM_OBJ = $(call asm_to_obj, $(NETTLE_ASM_SRC))
NETTLE_C_OBJ = $(call c_to_obj, $(NETTLE_C_SRC))
NETTLE_OBJ = $(NETTLE_C_OBJ) \
$(NETTLE_ASM_OBJ)
TEST_SRC = $(addprefix testsuite/, \
aes-keywrap-test.c \
aes-test.c \
arcfour-test.c \
arctwo-test.c \
balloon-test.c \
base16-test.c \
base64-test.c \
bcrypt-test.c \
bignum-test.c \
blowfish-test.c \
buffer-test.c \
camellia-test.c \
cast128-test.c \
cbc-test.c \
ccm-test.c \
cfb-test.c \
chacha-poly1305-test.c \
chacha-test.c \
cmac-test.c \
cnd-memcpy-test.c \
ctr-test.c \
curve25519-dh-test.c \
curve448-dh-test.c \
des-test.c \
des3-test.c \
eax-test.c \
ed25519-test.c \
ed448-test.c \
gcm-test.c \
gosthash94-test.c \
hkdf-test.c \
hmac-test.c \
knuth-lfib-test.c \
md2-test.c \
md4-test.c \
md5-compat-test.c \
md5-test.c \
memxor-test.c \
meta-aead-test.c \
meta-armor-test.c \
meta-cipher-test.c \
meta-hash-test.c \
meta-mac-test.c \
ocb-test.c \
pkcs1-sec-decrypt-test.c \
pkcs1-test.c \
poly1305-test.c \
random-prime-test.c \
ripemd160-test.c \
rsa-sec-decrypt-test.c \
salsa20-test.c \
serpent-test.c \
sexp-format-test.c \
sexp-test.c \
sha224-test.c \
sha3-224-test.c \
sha3-256-test.c \
sha3-384-test.c \
sha3-512-test.c \
sha3-permute-test.c \
sha384-test.c \
sha512-224-test.c \
sha512-256-test.c \
sha512-test.c \
shake256-test.c \
siv-gcm-test.c \
sm3-test.c \
sm4-test.c \
streebog-test.c \
twofish-test.c \
umac-test.c \
xts-test.c \
yarrow-test.c)
ifeq ($(USE_HOGWEED),1)
TEST_SRC += $(addprefix testsuite/, \
dsa-test.c \
dsa-keygen-test.c \
ecc-dup-test.c \
ecc-add-test.c \
ecc-mod-arith-test.c \
ecc-mod-test.c \
ecc-modinv-test.c \
ecc-mul-a-test.c \
ecc-mul-g-test.c \
ecc-redc-test.c \
ecc-sqrt-test.c \
ecdh-test.c \
ecdsa-keygen-test.c \
ecdsa-sign-test.c \
ecdsa-verify-test.c \
eddsa-verify-test.c \
eddsa-compress-test.c \
eddsa-sign-test.c \
gostdsa-keygen-test.c \
gostdsa-sign-test.c \
gostdsa-verify-test.c \
gostdsa-vko-test.c \
rsa-compute-root-test.c \
rsa-encrypt-test.c \
rsa-keygen-test.c \
rsa-test.c \
rsa2sexp-test.c \
sexp2rsa-test.c \
sha1-test.c \
sha256-test.c)
endif
#
# The brain-dead pre-processing in MSVC does not handle this file.
#
ifneq ($(CC),cl)
TEST_SRC += testsuite/pbkdf2-test.c
endif
TEST_OBJ = $(call c_to_obj, $(TEST_SRC)) \
$(OBJ_DIR)/cxx-test.obj
TOOLS_SRC = getopt.c \
$(addprefix tools/, \
input.c \
misc.c \
nettle-hash.c \
nettle-lfib-stream.c \
nettle-pbkdf2.c \
output.c \
parse.c \
pkcs1-conv.c \
sexp-conv.c)
.SECONDARY: $(TEST_OBJ) \
$(addprefix $(OBJ_DIR)/examples_, \
base64enc.obj \
base16enc.obj \
base64dec.obj \
base16dec.obj)
$(OBJ_DIR)/pkcs1-conv.obj pkcs1-conv.i: EXTRA_CFLAGS = -DCOMPILING_PKCS1_CONV_C
$(OBJ_DIR)/sexp-conv.obj sexp-conv.i: EXTRA_CFLAGS = -DCOMPILING_SEXP_CONV_C
$(OBJ_DIR)/nettle-hash.obj nettle-hash.i: EXTRA_CFLAGS = -DCOMPILING_NETTLE_HASH_C -DSTRERROR=strerror
$(OBJ_DIR)/nettle-pbkdf2.obj nettle-pbkdf2.i: EXTRA_CFLAGS = -DCOMPILING_NETTLE_PBKDF2_C -DSTRERROR=strerror
$(OBJ_DIR)/ecc-mod-test.obj ecc-mod-test.i \
$(OBJ_DIR)/rsa-compute-root-test.obj rsa-compute-root-test.i \
$(OBJ_DIR)/testutils.obj testutils.i: EXTRA_CFLAGS = -DNEED_STRUCT_TIMEVAL
PROGRAMS_SRC = aesdata.c \
eccparams.c \
gcmdata.c \
sha-example.c \
shadata.c \
twofishdata.c
PROGRAMS_SRC += $(addprefix examples/, \
base16dec.c \
base16enc.c \
base64dec.c \
base64enc.c \
ecc-benchmark.c \
hogweed-benchmark.c \
nettle-benchmark.c \
random-prime.c \
rsa-decrypt.c \
rsa-encrypt.c \
rsa-keygen.c \
rsa-sign.c \
rsa-verify.c)
PROGRAMS = $(call c_to_exe, $(PROGRAMS_SRC))
PROGRAMS_OBJ = $(call c_to_obj, $(PROGRAMS_SRC))
TEST_PROGRAMS = $(call c_to_exe, $(TEST_SRC))
ifeq ($(USE_HOGWEED),1)
TEST_PROGRAMS += bin/cxx-test.exe
endif
PROGRAMS += bin/nettle-hash.exe \
bin/nettle-lfib-stream.exe \
bin/nettle-pbkdf2.exe \
bin/pkcs1-conv.exe \
bin/sexp-conv.exe
all: intro check_autotools $(GENERATED) copy_headers $(TARGETS) $(PROGRAMS) epilogue
gen: $(GENERATED)
asm: $(OBJ_DIR)/asm $(GENERATED) $(NETTLE_ASM_OBJ)
help:
$(info $(Usage))
intro:
$(call green_msg, Building Nettle library and programs.\e[0m Version $(BRIGHT_WHITE)$(VERSION).)
check_autotools:
ifneq ($(wildcard config.h),)
$(error A 'config.h' from a autotools run exist. Run 'make -f $(THIS_FILE) CC=$(CC) clean_autotools' first.)
endif
epilogue:
$(call green_msg, Welcome to Nettle. \
\nYou may now do $(BRIGHT_WHITE)make -f $(THIS_FILE) [install | tests | runtests | doc].)
PUBLIC_HEADERS = aes.h \
arcfour.h \
arctwo.h \
base16.h \
base64.h \
bignum.h \
camellia.h \
cbc.h \
ccm.h \
cfb.h \
chacha.h \
chacha-poly1305.h \
cmac.h \
curve448.h \
curve25519.h \
ctr.h \
des.h \
dsa.h \
ecc.h \
ecc-curve.h \
ecdsa.h \
eddsa.h \
hkdf.h \
hmac.h \
gcm.h \
gostdsa.h \
gosthash94.h \
macros.h \
md2.h \
md4.h \
md5.h \
memops.h \
memxor.h \
nettle-meta.h \
nettle-types.h \
pbkdf2.h \
pkcs1.h \
poly1305.h \
pss.h \
ripemd160.h \
rsa.h \
salsa20.h \
sha.h \
sha1.h \
sha2.h \
sha3.h \
siv-cmac.h \
siv-gcm.h \
sm3.h \
sm4.h \
streebog.h \
umac.h \
xts.h \
yarrow.h
copy_headers: | include/nettle
$(call copy_files, $(PUBLIC_HEADERS), include/nettle/)
bin lib include/nettle $(OBJ_DIR) $(OBJ_DIR)/asm $(OBJ_DIR)/sys:
mkdir --parents $@
$(CC).args: $(THIS_FILE)
$(call green_msg, All CFLAGS are in $@)
$(call make_resp_file, $@, -c $(CFLAGS))
$(CC)++.args: $(THIS_FILE)
$(call green_msg, All C++ flags are in $@)
$(call make_resp_file, $@, -c $(CXXFLAGS) $(CFLAGS))
$(OBJ_DIR)/config.h: $(THIS_FILE) | $(OBJ_DIR)
$(call Generate, $@, //)
$(file >> $@,$(CONFIG_H))
install: $(TARGETS)
cp --update $(NETTLE_DLL:.dll=.{dll,pdb}) $(INSTALL_ROOT)/bin
cp --update $(NETTLE_STAT_LIB) $(NETTLE_IMP_LIB) $(INSTALL_ROOT)/lib
$(NETTLE_STAT_LIB): $(NETTLE_OBJ) | lib
$(call create_static_lib, $@, $(NETTLE_OBJ))
$(NETTLE_IMP_LIB): $(NETTLE_DLL)
$(NETTLE_DLL): $(OBJ_DIR)/nettle.def $(NETTLE_STAT_LIB) $(OBJ_DIR)/nettle.res $(GMP_STAT_LIB) | bin lib
$(call link_DLL, $@, -def:$^, $(NETTLE_IMP_LIB))
$(OBJ_DIR)/nettle.def: $(NETTLE_STAT_LIB) $(MDEPEND)
$(call make_def_file, $@, $(NETTLE_DLL), $<)
$(OBJ_DIR)/nettle.res: $(OBJ_DIR)/nettle.rc
$(call make_res_file, $<, $@)
$(OBJ_DIR)/nettle.rc: $(MDEPEND)
$(call Generate, $@, //)
$(file >> $@,$(NETTLE_RC))
include/nettle/nettle-stdint.h: $(MDEPEND) | include/nettle
$(call Generate, $@, //)
@echo -en '#include <stdint.h>' \
'\n#include <sys/types.h>' \
'\n#include <malloc.h>\n' >> $@
include/nettle/version.h: version.h.in $(MDEPEND) | include/nettle
$(call Generate, $@, //)
sed -e 's/@MAJOR_VERSION@/$(MAJOR_VERSION)/' \
-e 's/@MINOR_VERSION@/$(MINOR_VERSION)/' \
-e 's/@NETTLE_USE_MINI_GMP@/$(USE_MINI_GMP)/' \
-e 's/@GMP_NUMB_BITS@/$(BITS)/' < $< >> $@
@echo
$(OBJ_DIR)/sys/time.h: $(OBJ_DIR)/sys $(MDEPEND)
$(call Generate, $@, //)
@echo -e '#include <time.h>' >> $@
$(OBJ_DIR)/unistd.h: $(MDEPEND)
$(call Generate, $@, //)
$(file >> $@, // Fake <$@> for MSVC/clang-cl)
$(file >> $@, #define __GNU_LIBRARY__)
$(OBJ_DIR)/desdata.exe: $(OBJ_DIR)/desdata.obj
$(call link_EXE, $@, $^)
$(OBJ_DIR)/eccdata.exe: $(OBJ_DIR)/eccdata.obj
$(call link_EXE, $@, $^)
./gold-bug.txt: testsuite/gold-bug.txt
cp --update $< $@
#
# '$(TEST_PROGRAMS)' rule
#
bin/%.exe: $(OBJ_DIR)/%.obj $(OBJ_DIR)/testutils.obj $(GMP_STAT_LIB) $(NETTLE_STAT_LIB)
$(call link_EXE, $@, $^)
#
# '$(PROGRAMS)' rule
#
bin/aesdata.exe: $(OBJ_DIR)/aesdata.obj $(GMP_STAT_LIB)
$(call link_EXE, $@, $^)
bin/eccparams.exe: $(OBJ_DIR)/eccparams.obj
$(call link_EXE, $@, $^)
bin/gcmdata.exe: $(OBJ_DIR)/gcmdata.obj $(NETTLE_STAT_LIB) $(GMP_STAT_LIB)
$(call link_EXE, $@, $^)
bin/sha-example.exe: $(OBJ_DIR)/sha-example.obj $(NETTLE_STAT_LIB) $(GMP_STAT_LIB)
$(call link_EXE, $@, $^)
bin/shadata.exe: $(OBJ_DIR)/shadata.obj $(NETTLE_STAT_LIB) $(GMP_STAT_LIB)
$(call link_EXE, $@, $^)
bin/twofishdata.exe: $(OBJ_DIR)/twofishdata.obj $(GMP_STAT_LIB)
$(call link_EXE, $@, $^)
GETOPT_OBJ = $(OBJ_DIR)/getopt.obj \
$(OBJ_DIR)/getopt1.obj
ifeq ($(USE_OPENSSL),1)
OPENSSL_LIB = $(OPENSSL_ROOT)/lib/libcrypto_imp-$(CPU).lib
OPENSSL_OBJ = $(OBJ_DIR)/examples_nettle-openssl.obj
nettle-openssl.i \
hogweed-benchmark.i \
$(OPENSSL_OBJ) \
$(OBJ_DIR)/examples_hogweed-benchmark.obj: EXTRA_CFLAGS += -I$(OPENSSL_ROOT)/include
else
OPENSSL_LIB =
OPENSSL_OBJ =
endif
bin/nettle-hash.exe: $(OBJ_DIR)/nettle-hash.obj $(OBJ_DIR)/misc.obj $(GETOPT_OBJ) $(NETTLE_STAT_LIB)
$(call link_EXE, $@, $^)
bin/nettle-lfib-stream.exe: $(OBJ_DIR)/nettle-lfib-stream.obj $(NETTLE_IMP_LIB)
$(call link_EXE, $@, $^)
bin/nettle-pbkdf2.exe: $(OBJ_DIR)/nettle-pbkdf2.obj $(OBJ_DIR)/misc.obj $(GETOPT_OBJ) $(NETTLE_IMP_LIB)
$(call link_EXE, $@, $^)
bin/pkcs1-conv.exe: $(OBJ_DIR)/pkcs1-conv.obj $(OBJ_DIR)/misc.obj $(GETOPT_OBJ) $(NETTLE_IMP_LIB) $(GMP_IMP_LIB)
$(call link_EXE, $@, $^)
sexp-conv_OBJ = $(addprefix $(OBJ_DIR)/, \
sexp-conv.obj \
input.obj \
misc.obj \
output.obj \
parse.obj) \
$(GETOPT_OBJ)
bin/sexp-conv.exe: $(sexp-conv_OBJ) $(NETTLE_STAT_LIB)
$(call link_EXE, $@, $^)
bin/cxx-test.exe: $(OBJ_DIR)/cxx-test.obj $(OBJ_DIR)/testutils.obj $(NETTLE_STAT_LIB) $(GMP_STAT_LIB)
$(call link_EXE, $@, $^)
bin/ecc-benchmark.exe: \
$(OBJ_DIR)/examples_ecc-benchmark.obj \
$(OBJ_DIR)/examples_timing.obj \
$(NETTLE_STAT_LIB) \
$(GMP_STAT_LIB)
$(call link_EXE, $@, $^)
bin/hogweed-benchmark.exe: \
$(OBJ_DIR)/examples_hogweed-benchmark.obj \
$(OBJ_DIR)/examples_timing.obj \
$(NETTLE_STAT_LIB) \
$(GMP_STAT_LIB) \
$(OPENSSL_LIB)
$(call link_EXE, $@, $^)
bin/nettle-benchmark.exe: \
$(OBJ_DIR)/examples_nettle-benchmark.obj \
$(OBJ_DIR)/examples_io.obj \
$(OBJ_DIR)/examples_timing.obj \
$(OPENSSL_OBJ) \
$(GETOPT_OBJ) \
$(NETTLE_STAT_LIB) \
$(GMP_STAT_LIB) \
$(OPENSSL_LIB)
$(call link_EXE, $@, $^)
bin/random-prime.exe: \
$(OBJ_DIR)/examples_random-prime.obj \
$(OBJ_DIR)/examples_io.obj \
$(GETOPT_OBJ) \
$(NETTLE_STAT_LIB) \
$(GMP_STAT_LIB)
$(call link_EXE, $@, $^)
bin/rsa-decrypt.exe: \
$(OBJ_DIR)/examples_rsa-decrypt.obj \
$(OBJ_DIR)/examples_io.obj \
$(OBJ_DIR)/examples_read_rsa_key.obj \
$(NETTLE_STAT_LIB) \
$(GMP_STAT_LIB)
$(call link_EXE, $@, $^)
bin/rsa-encrypt.exe: \
$(OBJ_DIR)/examples_rsa-encrypt.obj \
$(OBJ_DIR)/examples_io.obj \
$(OBJ_DIR)/examples_read_rsa_key.obj \
$(GETOPT_OBJ) \
$(NETTLE_STAT_LIB) \
$(GMP_STAT_LIB)
$(call link_EXE, $@, $^)
bin/rsa-keygen.exe: \
$(OBJ_DIR)/examples_rsa-keygen.obj \
$(OBJ_DIR)/examples_io.obj \
$(GETOPT_OBJ) \
$(NETTLE_STAT_LIB) \
$(GMP_STAT_LIB)
$(call link_EXE, $@, $^)
bin/rsa-sign.exe: \
$(OBJ_DIR)/examples_rsa-sign.obj \
$(OBJ_DIR)/examples_io.obj \
$(OBJ_DIR)/examples_read_rsa_key.obj \
$(GETOPT_OBJ) \
$(NETTLE_STAT_LIB) \
$(GMP_STAT_LIB)
$(call link_EXE, $@, $^)
bin/rsa-verify.exe: \
$(OBJ_DIR)/examples_rsa-verify.obj \
$(OBJ_DIR)/examples_io.obj \
$(OBJ_DIR)/examples_read_rsa_key.obj \
$(GETOPT_OBJ) \
$(NETTLE_STAT_LIB) \
$(GMP_STAT_LIB)
$(call link_EXE, $@, $^)
bin/%.exe: $(OBJ_DIR)/examples_%.obj \
$(OBJ_DIR)/examples_io.obj \
$(NETTLE_STAT_LIB) \
$(GMP_STAT_LIB)
$(call link_EXE, $@, $^)
#
# .c / .cxx -> obj rules:
#
ifeq ($(CC)-$(USE_MP_COMPILE),cl-1)
C_chunk_1 = $(wordlist 1, 100, $(NETTLE_C_SRC))
C_chunk_2 = $(wordlist 101, 200, $(NETTLE_C_SRC))
C_chunk_3 = $(wordlist 201, 300, $(NETTLE_C_SRC))
C_chunk_4 = $(wordlist 301, 400, $(NETTLE_C_SRC))
OBJ_chunk_1 = $(call c_to_obj, $(C_chunk_1))
OBJ_chunk_2 = $(call c_to_obj, $(C_chunk_2))
OBJ_chunk_3 = $(call c_to_obj, $(C_chunk_3))
OBJ_chunk_4 = $(call c_to_obj, $(C_chunk_4))
$(OBJ_chunk_1): $(C_chunk_1) | $(CC).args $(OBJ_DIR)
$(call C_compile_MP, $(C_chunk_1), C_chunk_1)
$(OBJ_chunk_2): $(C_chunk_2) | $(CC).args $(OBJ_DIR)
$(call C_compile_MP, $(C_chunk_2), C_chunk_2)
$(OBJ_chunk_3): $(C_chunk_3) | $(CC).args $(OBJ_DIR)
$(call C_compile_MP, $(C_chunk_3), C_chunk_3)
$(OBJ_chunk_4): $(C_chunk_4) | $(CC).args $(OBJ_DIR)
$(call C_compile_MP, $(C_chunk_4), C_chunk_4)
endif
$(OBJ_DIR)/examples_%.obj: examples/%.c | $(CC).args $(OBJ_DIR)
$(call C_compile, $@, $<)
$(OBJ_DIR)/%.obj: %.c | $(CC).args $(OBJ_DIR)
$(call C_compile, $@, $<)
$(OBJ_DIR)/%.obj: testsuite/%.cxx | $(CC)++.args $(OBJ_DIR)
$(call CXX_compile, $@, $<)
#
# Generate DES headers.
#
$(OBJ_DIR)/keymap.h: $(OBJ_DIR)/desdata.exe
$(call Generate, $@, //)
$(OBJ_DIR)/desdata.exe k >> $@
$(OBJ_DIR)/rotors.h: $(OBJ_DIR)/desdata.exe
$(call Generate, $@, //)
$(OBJ_DIR)/desdata.exe r >> $@
@echo
$(ECC_H_FILES): $(OBJ_DIR)/eccdata.exe
#
# Generate ECC (Eliptic Curve Crypto) files.
#
$(OBJ_DIR)/ecc-secp192r1.h: $(OBJ_DIR)/eccdata.exe
$(call generate_ecc, $@, secp192r1 8 6)
$(OBJ_DIR)/ecc-secp224r1.h: $(OBJ_DIR)/eccdata.exe
$(call generate_ecc, $@, secp224r1 16 7)
$(OBJ_DIR)/ecc-secp256r1.h: $(OBJ_DIR)/eccdata.exe
$(call generate_ecc, $@, secp256r1 11 6)
$(OBJ_DIR)/ecc-secp384r1.h: $(OBJ_DIR)/eccdata.exe
$(call generate_ecc, $@, secp384r1 32 6)
$(OBJ_DIR)/ecc-secp521r1.h: $(OBJ_DIR)/eccdata.exe
$(call generate_ecc, $@, secp521r1 44 6)
$(OBJ_DIR)/ecc-curve25519.h: $(OBJ_DIR)/eccdata.exe
$(call generate_ecc, $@, curve25519 11 6)
$(OBJ_DIR)/ecc-curve448.h: $(OBJ_DIR)/eccdata.exe
$(call generate_ecc, $@, curve448 38 6)
$(OBJ_DIR)/ecc-gost-gc256b.h: $(OBJ_DIR)/eccdata.exe
$(call generate_ecc, $@, gost_gc256b 11 6)
$(OBJ_DIR)/ecc-gost-gc512a.h: $(OBJ_DIR)/eccdata.exe
$(call generate_ecc, $@, gost_gc512a 43 6)
tests: $(TEST_PROGRAMS)
programs: $(PROGRAMS)
ifeq ($(USE_VERBOSE_TEST),1)
FAT_VERBOSE = export NETTLE_FAT_VERBOSE=1 ;
TEST_VERBOSE = -v
else
FAT_VERBOSE =
TEST_VERBOSE =
endif
#
# There should be only 1 failure in 'bin/rsa-keygen-test.exe -v':
#
# Private key: d=3021c4766ebb7d12adef616d4fc976f75e2b151355c366b7c234687711df838ee4ca01dbbfc1be23ad46f3a9c92e0fa90b9b9c5cea0492d90dbd00c77d513de65
# 2500faf20726f64d4f67cb08d0d79a06db45c18fb98f9af0d9add5d6d65d185772880c82353550f6da5f2c366c1731b53534b1773c0101449f80f0565fbbdd2a4fadc4b603188899
# 3b17296ae24ae2e70aba2e3285e34c69899cbd18e874e06a754c99f18826d50f0e2707057330407f8d8928a61fa91360dd4df7df157830ce64d0bf45a2954f8c52e5a2ab1ce0bfe2
# 7897690e2347dd938c22691e576ca10ba33a30a45d54c1e7fe8c9f75ad6143708b5371c98543dc91691
# p=f5d5956cde2577756f169bc2bc63b8413c70bcb5713ea719a7da4e4efb3094eec23d306317ee14de383d2842d6f60284e76f94a8fed53f27050d545a5c56938a156b0eeabf
# 06f5c6960a642e90e4d8c31c65a669a37ecdad3cd787daa96514976688564399ae94f1c23c0fed4e2f2c3bd01119413c2bf50a77c361b71d
# q=d505007ccb4552f0447a18990a5349153b9637a6b10931fbae5bcbe9426e8c6cc796340568630514e18eca6778837c786459619410f04fd1cdeebb872fb7f2c85f50316c4c
# f4bbcc58f6fb2df1a0723abdd365010ae7930e2d2807c6e2c07533e2adfc73a8c9976f4a1de213ec65e32339be8cd60a0be4fe11c60d8037
# a=d8e9a1f6a5e4d2d107aa896f972acfc117364c27a0283916a32a08dc470cbfa57e35fd849ca4e53c8bf9ba1cdbca02390871832bb3ad199ae6570e319cc4dc88e5b8d0ed3f
# 244245cfaed0ddcb2446ca463b92d5ae60d398db54c32a593b122b3c5a2dff697becd55107d1d1631a907102e1e91b7153f65487ca836555
# b=190fa5b4542645fe262c7b5d4c8244d5524de86df6b5c9a5239254398f584cc180e47e9739750fa81a8944fd1d3ca53b571993025c5881dc72948e885ff785f974a005d081
# 863436289586f658a976d9bbfac096b5fd205c055000ea38cb591529ba1db34108a8677221a220762a1ab8d99df27388b61af0b6cc01969d
# c=705567272f568ba46c62d8c25d9a5b688067e1673e3ec9263e4bf3675a2e3f858fdc3aa595a3f18b8ea46f4e9029658739d1b21fea03c87d63afd4d2cba8f998c4d0eb2b20
# 3f1702e620aea6d06ee74e3cf8405fbc3b5b94a697a36cccc4687fcf96f95894b7b0e8132a1bb9f5e93f5cd12d6815fc9792857bdc503991
#
# rsa-sha1 signature: 0
# Assert failed: testsuite/testutils.c:1379: mpz_cmp (signature, expected) == 0
#
run_tests runtests: $(TEST_PROGRAMS) | ./gold-bug.txt
@for f in $(TEST_PROGRAMS) ; do \
echo Running $$f: ; \
$(FAT_VERBOSE) ./$$f $(TEST_VERBOSE) ; \
if [ $$? -ne 0 ]; then \
echo -e " $(BRIGHT_RED)FAIL\e[0m" ; \
else \
echo -e " $(BRIGHT_GREEN)OKAY\e[0m" ; \
fi ; \
done
#
# Must run pdftex twice to get the table-of-contents right
#
PDFTEX = pdftex -quiet
doc:
$(call green_msg, Running pdftex first time...)
$(PDFTEX) nettle.texinfo
$(call green_msg, Running pdftex second time to create the Table of Content correctly...)
$(PDFTEX) nettle.texinfo
@echo
clean_doc:
rm -f nettle.aux nettle.cp nettle.fn nettle.ky nettle.log nettle.pdf nettle.pg nettle.toc nettle.tp nettle.vr
clean_asm:
rm -f $(OBJ_DIR)/asm/*
clean_autotools:
rm -fr autom4te.cache
rm -f *.o *.s *.d *.asm tools/*.o tools/*.d config.h config.h.in config.log config.m4 config.make \
config.status configure Makefile examples/Makefile testsuite/Makefile tools/Makefile
rm -f config.old config.tmp desdata.exe desdata.stamp ecc-curve25519.h ecc-curve448.h ecc-gost-gc256b.h \
ecc-gost-gc512a.h ecc-secp192r1.h ecc-secp224r1.h ecc-secp256r1.h ecc-secp384r1.h ecc-secp521r1.h \
eccdata.exe eccdata.stamp nettle.pc hogweed.pc keymap.h libhogweed.a libhogweed.map libhogweed.stamp \
libnettle.a libnettle.map libnettle.stamp machine.m4 rotors.h version.h nettle.html nettle.info \
tools/sexp-conv.exe unistd.h
clean: clean_doc
rm -f vc1*.pdb gold-bug.txt cl.args cl++.args clang-cl.args clang-cl++.args \
lib.args link.args link.tmp
rm -fr $(OBJ_DIR) include
realclean vclean: clean
rm -f .depend.Windows
rm -fr bin lib
$(OBJ_DIR)/asm/config.m4: config.m4.in $(MDEPEND) | $(OBJ_DIR)/asm
$(call Generate, $@, dnl)
sed -e 's|@srcdir@|.|' \
-e 's|@ASM_SYMBOL_PREFIX@|$(uscore)|' \
-e 's|@ASM_ELF_STYLE@|no|' \
-e 's|@ASM_COFF_STYLE@|yes|' \
-e 's|@ASM_TYPE_FUNCTION@|@function|' \
-e 's|@ASM_TYPE_PROGBITS@|@progbits|' \
-e 's|@ASM_ALIGN_LOG@|no|' \
-e 's|@ELFV2_ABI@|no|' \
-e 's|@W64_ABI@|yes|' \
-e 's|@ASM_MARK_NOEXEC_STACK@||' \
-e 's|@ASM_PPC_WANT_R_REGISTERS@|n/a|' \
-e 's|@ASM_RODATA@|.rdata|' \
-e 's|@ASM_WORDS_BIGENDIAN@|no|' \
-e 's|@ASM_X86_ENDBR@||' \
-e 's|@ASM_X86_MARK_CET_ALIGN@||' \
-e 's|@ASM_X86_MARK_CET@||' < $< >> $@
@echo
M4_ARGS = -Dsrcdir=. ./m4-utils.m4 ./asm.m4 $(OBJ_DIR)/asm/config.m4
AS_FLAGS = --$(BITS)
ifeq ($(CPU),x86)
AS_FLAGS += -march=pentium4+sse3
M4_ARGS += x86/machine.m4
else ifeq ($(USE_FAT),1)
AS_FLAGS += -march=k8+aes+sha+avx512_vnni
M4_ARGS += x86_64/machine.m4
else ifeq ($(USE_ASM_AES),1)
AS_FLAGS += -march=amdfam10+aes
M4_ARGS += x86_64/machine.m4
else
AS_FLAGS += -march=amdfam10+avx2
M4_ARGS += x86_64/machine.m4
endif
ifeq ($(CPU),x64)
ifeq ($(USE_ASM_AES),1)
$(OBJ_DIR)/asm/%.obj: x86_64/aesni/%.asm | $(OBJ_DIR)/asm
$(call assemble, $@, $<, $(M4_ARGS))
endif
ifeq ($(USE_FAT),1)
$(OBJ_DIR)/asm/%.obj: x86_64/fat/%.asm | $(OBJ_DIR)/asm
$(call assemble, $@, $<, $(M4_ARGS))
else
$(OBJ_DIR)/asm/%.obj: x86_64/%.asm | $(OBJ_DIR)/asm
$(call assemble, $@, $<, $(M4_ARGS))
endif
else
$(OBJ_DIR)/asm/%.obj: x86/%.asm | $(OBJ_DIR)/asm
$(call assemble, $@, $<, $(M4_ARGS))
endif
#
# Command to generate a nicer C preprocessed output with the help of
# '$(OBJ_DIR)/cpp-filter.py' and optionally 'astyle' or 'clang-format'.
#
ifeq ($(USE_ASTYLE),1)
C_FORMATER = | astyle
else ifeq ($(USE_CLANG_FORMAT),1)
C_FORMATER = | clang-format -style=Mozilla -assume-filename=c
else
C_FORMATER =
endif
EXTRA_CFLAGS ?=
%.i: %.c $(GENERATED) $(OBJ_DIR)/cpp-filter.py $(CC).args FORCE
$(_CC) -E @$(CC).args $(EXTRA_CFLAGS) $< | $(PYTHON) $(OBJ_DIR)/cpp-filter.py $(C_FORMATER) > $@
@echo
%.i: examples/%.c $(GENERATED) $(OBJ_DIR)/cpp-filter.py $(CC).args FORCE
$(_CC) -E @$(CC).args $(EXTRA_CFLAGS) $< | $(PYTHON) $(OBJ_DIR)/cpp-filter.py $(C_FORMATER) > $@
@echo
FORCE:
$(OBJ_DIR)/cpp-filter.py: $(THIS_FILE) | $(OBJ_DIR)
$(call Generate, $@, #)
$(file >> $@,if 1:)
$(file >> $@,$(CPP_FILTER_PY))
$(OBJ_DIR)/check-for-unused-libs.py: $(THIS_FILE) | $(OBJ_DIR)
$(call Generate, $@, #)
$(file >> $@,if 1:)
$(file >> $@,$(CHECK_FOR_UNUSED_LIBS_PY))
#
# GNU-make macros:
#
# The following codes used in macro 'colour_msg' assumes you have
# MSys/Cygwin's echo with colour support.
#
BRIGHT_RED = \e[1;31m
BRIGHT_GREEN = \e[1;32m
BRIGHT_WHITE = \e[1;37m
colour_msg = @echo -e "$(1)\e[0m"
green_msg = $(call colour_msg,$(BRIGHT_GREEN)$(strip $(1)))
white_msg = $(call colour_msg,$(BRIGHT_WHITE)$(strip $(1)))
EXTRA_CFLAGS ?=
define C_compile
$(_CC) @$(CC).args -Fo./$(strip $(1) $(EXTRA_CFLAGS) $(2))
@echo
endef
define C_compile_MP
$(call green_msg, Compiling $(words $(filter %.c, $(1))) files for$(BRIGHT_WHITE) $(2):)
$(_CC) -MP @$(CC).args $(strip -Fo./$(OBJ_DIR)\\ $(EXTRA_CFLAGS) $(1))
@echo
endef
define CXX_compile
$(_CC) @$(CC)++.args -Fo./$(strip $(1) $(EXTRA_CFLAGS) $(2))
@echo
endef
#
# 'm4.exe' and 'as.exe' are assumed to be on PATH:
#
# For reference, this is a Cygwin compile of .asm-files:
# m4 ./m4-utils.m4 ./asm.m4 config.m4 machine.m4 \
# x86_64/sha256-compress-n.asm > sha256-compress-n.s
# gcc -I. -g -O2 -ggdb3 -o sha256-compress-n.o -c sha256-compress-n.s
#
define assemble
$(call green_msg, Processing and assembling$(BRIGHT_WHITE)$(2) $(BRIGHT_GREEN)into$(BRIGHT_WHITE)$(1))
@echo '# Assembly output of $(2)' > $(OBJ_DIR)/asm/$(notdir $(2)).tmp
m4 $(3) $(2) >> $(OBJ_DIR)/asm/$(notdir $(2)).tmp
as $(AS_FLAGS) -o $(1) $(OBJ_DIR)/asm/$(notdir $(2)).tmp
@echo
endef
define link_EXE
$(call green_msg, Linking $(1))
$(call make_resp_file, link.args, $(LDFLAGS) $(2) kernel32.lib)
link -out:$(strip $(1)) @link.args > link.tmp
@cat link.tmp >> $(1:.exe=.map)
@$(PYTHON) $(OBJ_DIR)/check-for-unused-libs.py link.tmp
endef
define link_DLL
$(call green_msg, Linking $(1))
$(call make_resp_file, link.args, $(LDFLAGS) -dll -implib:$(strip $(3)) $(2))
link -out:$(strip $(1)) @link.args > link.tmp
@cat link.tmp >> $(1:.dll=.map)
@rm -f $(3:.lib=.exp)
@$(PYTHON) $(OBJ_DIR)/check-for-unused-libs.py link.tmp
endef
define create_static_lib
$(call green_msg, Creating static library $(1))
$(call make_resp_file, lib.args, $(2))
lib -nologo -out:$(strip $(1)) -machine:$(CPU) @lib.args
@echo
endef
define make_res_file
$(call green_msg, Creating $(1))
rc $(RCFLAGS) -fo $(2) $(1)
@echo
endef
define generate_ecc
$(call Generate, $(1), //)
$(OBJ_DIR)/eccdata.exe $(strip $(2) $(BITS) >> $(1))
@echo
endef
#
# Extract code symbols starting with:
# $(uscore)nettle_
# $(uscore)_nettle_
# $(uscore)mpz_
# $(uscore)mpn_
#
code_sybols = -e ' T $(uscore)nettle_' \
-e ' T $(uscore)_nettle_' \
-e ' T $(uscore)mpz_' \
-e ' T $(uscore)mpn_'
data_symbols = -e ' [BDCGR] $(uscore)nettle_'
extract_code = nm $(1) | grep $(code_sybols) | sed 's/^.* $(uscore)/ /'
extract_data = nm $(1) | grep $(data_symbols) | sed 's/^.* $(uscore)\([_a-zA-Z0-9]*\)/ \1 DATA/'
define make_def_file
$(call Generate, $(1),;)
@echo -ne ';\nLIBRARY $(notdir $(2))\n' \
'EXPORTS\n' >> $(1)
$(call extract_code, $(3)) | sort >> $(1)
$(call extract_data, $(3)) | sort >> $(1)
endef
#
# Make a response file if the cmdline limit can be very low.
# arg1, $(1): The name of the response file
# arg2, $(2): The content for the response file.
#
define make_resp_file
$(file > $(1))
$(foreach f, $(2), $(file >> $(1),$(strip $(f))) )
endef
define Warning
$(1)
$(1) DO NOT EDIT! This file was generated automatically
$(1) from $(realpath $(THIS_FILE))
$(1) at $(DATE). Edit that file instead.
$(1)
endef
define Generate
$(call green_msg, Generating $(1))
$(file > $(1),$(call Warning, $(2)))
endef
empty :=
space := $(empty) $(empty)
define copy_files
$(call green_msg, Updating these files into $(BRIGHT_WHITE)$(strip $(2)):)
@$(foreach f, $(1), echo '$(space) $(f)' ; )
@cp --update --preserve=timestamps $(sort $(1)) $(2)
@echo
endef
#
# The contents of '$(OBJ_DIR)/config.h':
#
define CONFIG_H
#define _CRT_SECURE_NO_WARNINGS
#define _CRT_NONSTDC_NO_WARNINGS
#define _CRT_OBSOLETE_NO_WARNINGS
#include <stdlib.h>
#include <malloc.h> /* alloca() in getopt.c */
#include <io.h> /* _setmode() in examples/rsa-*.c */
#include <time.h> /* 'struct timespec' in examples/timing.c */
/*
* Warning control:
*/
#if defined(__clang__)
#pragma clang diagnostic ignored "-Wdeprecated-non-prototype"
#elif defined(_MSC_VER)
#pragma warning (disable: 4018 4098 4146 4244 4267)
#if $(USE_OPENSSL)
#pragma warning (disable: 4996)
#endif
#endif
#ifndef WIN32 /* If not 'make depend' */
#define WIN32
#endif
#define GMP_NAIL_BITS 0
#define GMP_LIMB_BITS $(BITS)
#define WITH_CYCLE_COUNTER 1
#define WITH_PUBLIC_KEY 1
#define WITH_HOGWEED $(USE_HOGWEED)
#define WITH_OPENSSL $(USE_OPENSSL)
#define HAVE_ALLOCA 1
#define HAVE_INTTYPES_H 1
#define HAVE_MALLOC_H 1
#define HAVE_UNISTD_H 1 /* Not really */
#define HAVE_SECURE_GETENV 1
#define HAVE_STRERROR 1
#define HAVE_SYS_TYPES_H 1
#if $(USE_FAT) /* $$(USE_FAT) */
#define HAVE_NATIVE_memxor3 1
#define HAVE_NATIVE_aes_decrypt 1
#define HAVE_NATIVE_aes_encrypt 1
#define HAVE_NATIVE_aes128_decrypt 1
#define HAVE_NATIVE_aes128_encrypt 1
#define HAVE_NATIVE_aes128_invert_key 1
#define HAVE_NATIVE_aes192_decrypt 1
#define HAVE_NATIVE_aes192_encrypt 1
#define HAVE_NATIVE_aes192_set_decrypt_key 1
#define HAVE_NATIVE_aes256_decrypt 1
#define HAVE_NATIVE_aes256_encrypt 1
#define HAVE_NATIVE_aes256_invert_key 1
#define HAVE_NATIVE_aes256_set_decrypt_key 1
#define HAVE_NATIVE_aes256_set_encrypt_key 1
#define HAVE_NATIVE_cbc_aes128_encrypt 1
#define HAVE_NATIVE_cbc_aes192_encrypt 1
#define HAVE_NATIVE_cbc_aes256_encrypt 1
#define HAVE_NATIVE_chacha_core 1
#define HAVE_NATIVE_chacha_3core 1
#define HAVE_NATIVE_chacha_4core 1
#define HAVE_NATIVE_fat_chacha_2core 1
#define HAVE_NATIVE_ecc_curve25519_modp 1
#define HAVE_NATIVE_ecc_curve448_modp 1
#define HAVE_NATIVE_ecc_secp192r1_modp 1
#define HAVE_NATIVE_ecc_secp192r1_redc 1
#define HAVE_NATIVE_ecc_secp224r1_modp 1
#define HAVE_NATIVE_ecc_secp224r1_redc 1
#define HAVE_NATIVE_ecc_secp256r1_modp 1
#define HAVE_NATIVE_ecc_secp256r1_redc 1
#define HAVE_NATIVE_ecc_secp384r1_modp 1
#define HAVE_NATIVE_ecc_secp384r1_redc 1
#define HAVE_NATIVE_ecc_secp521r1_modp 1
#define HAVE_NATIVE_ecc_secp521r1_redc 1
#define HAVE_NATIVE_poly1305_set_key 1
#define HAVE_NATIVE_poly1305_block 1
#define HAVE_NATIVE_poly1305_digest 1
#define HAVE_NATIVE_poly1305_blocks 1
#define HAVE_NATIVE_fat_poly1305_blocks 1
#define HAVE_NATIVE_ghash_set_key 1
#define HAVE_NATIVE_ghash_update 1
#define HAVE_NATIVE_salsa20_core 1
#define HAVE_NATIVE_salsa20_2core 1
#define HAVE_NATIVE_fat_salsa20_2core 1
#define HAVE_NATIVE_sha1_compress 1
#define HAVE_NATIVE_sha256_compress_n 1
#define HAVE_NATIVE_sha512_compress 1
#define HAVE_NATIVE_sha3_permute 1
#define HAVE_NATIVE_umac_nh 1
#define HAVE_NATIVE_umac_nh_n 1
#endif
#define secure_getenv(e) getenv (e)
#ifdef _WIN64
#ifndef __x86_64__ /* MSVC */
#define __x86_64__
#endif
#define HAVE_NATIVE_64_BIT 1
#define SIZEOF_SIZE_T 8
#else
#ifndef __i386__ /* MSVC */
#define __i386__
#endif
#define HAVE_NATIVE_64_BIT 0
#define SIZEOF_SIZE_T 4
#endif
#if defined(__clang__)
#define SIZEOF_LONG __SIZEOF_LONG__ /* A built-in == 4 */
#define HAVE_BUILTIN_BSWAP64 1
#define HAVE_GCC_ATTRIBUTE 1
#define PRINTF_STYLE(_1, _2) __attribute__((format (printf, _1, _2)))
#define UNUSED __attribute__((unused))
#define NORETURN __attribute__((noreturn))
#else
#define SIZEOF_LONG 4
#define PRINTF_STYLE(_1, _2)
#define UNUSED
#define NORETURN
#endif
#if !defined(_SSIZE_T_DEFINED)
typedef intptr_t ssize_t;
#define _SSIZE_T_DEFINED 1
#endif
#if defined (COMPILING_PKCS1_CONV_C)
#define PACKAGE_STRING "pkcs1-conv (nettle $(VERSION))"
#elif defined (COMPILING_SEXP_CONV_C)
#define PACKAGE_STRING "sexp-conv (nettle $(VERSION))"
#elif defined (COMPILING_NETTLE_HASH_C)
#define PACKAGE_STRING "nettle-hash (nettle $(VERSION))"
#elif defined (COMPILING_NETTLE_PBKDF2_C)
#define PACKAGE_STRING "nettle-pbkdf2 (nettle $(VERSION))"
#endif
#if defined (NEED_STRUCT_TIMEVAL)
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <winsock2.h>
extern int gettimeofday (struct timeval *tv, void *tz);
#endif
/* Fake this in 'missing.c':
*/
#define HAVE_CLOCK_GETTIME 1
#define CLOCK_PROCESS_CPUTIME_ID 0
extern int clock_gettime (int clock_spec, struct timespec *now);
#define MINI_GMP_LIMB_TYPE long long
endef
#
# Generates a '$(OBJ_DIR)/nettle.rc' file.
#
define NETTLE_RC
#include <winver.h>
#define RC_VERSION $(MAJOR_VERSION),$(MINOR_VERSION),$(PATCH_VERSION),0
#define RC_VERSION_STR "$(MAJOR_VERSION).$(MINOR_VERSION).$(PATCH_VERSION).0"
VS_VERSION_INFO VERSIONINFO
FILEVERSION RC_VERSION
PRODUCTVERSION RC_VERSION
FILEFLAGSMASK 0x3F
FILEOS VOS__WINDOWS32
FILETYPE VFT_DLL
FILESUBTYPE 0x0L
FILEFLAGS 0
#if defined(__clang__)
#define RC_HOST "clang"
#elif defined(_MSC_VER)
#define RC_HOST "MSVC"
#else
#error "Unsupported compiler"
#endif
BEGIN
BLOCK "StringFileInfo"
BEGIN
BLOCK "040904b0"
BEGIN
VALUE "CompanyName", "nettle, http://www.lysator.liu.se/~nisse/nettle/"
VALUE "FileDescription", "Low-level cryptographic library (" RC_HOST ", $(CPU))"
VALUE "FileVersion", RC_VERSION_STR
VALUE "InternalName", "$(notdir $(NETTLE_DLL))"
VALUE "ProductVersion", "Features: Hogweed:$(USE_HOGWEED), Mini-GMP:$(USE_MINI_GMP), ASM:$(USE_ASM_SRC), AES-code:$(USE_ASM_AES), FAT:$(USE_FAT), OpenSSL:$(USE_OPENSSL)"
VALUE "LegalCopyright", "GNU Lesser General Public License (LGPL) version 2.1"
VALUE "Comments", "Built on $(DATE) by <gvanem@yahoo.no>"
END
END
BLOCK "VarFileInfo"
BEGIN
VALUE "Translation", 0x409, 1200
END
END
endef
define CPP_FILTER_PY
import sys, os
empty_lines = 0
while True:
line = sys.stdin.readline()
if not line:
break
line = line.rstrip()
if line == "":
empty_lines += 1
continue
#
# MSVC or clang-cl 'line' directive
#
if line.startswith("#line") or line.startswith("# "):
line = line.replace (r"\\", "/")
print (line)
#
# Print a newline after a functions or structs
#
if line == "}" or line == "};":
print ("")
print ("Removed %d empty lines." % empty_lines, file=sys.stderr)
endef
define CHECK_FOR_UNUSED_LIBS_PY
import os, sys
map_file = sys.argv[1]
ignore_libs = [ "oldnames.lib" ]
class State():
IDLE = 0
UNUSED = 1
class Colour():
RED = WHITE = RESET = ""
try:
from colorama import init, Fore, Style
init()
Colour.RED = Fore.RED + Style.BRIGHT
Colour.WHITE = Fore.WHITE + Style.BRIGHT
Colour.RESET = Style.RESET_ALL
except:
pass
def report (unused):
num = len(unused)
plural = [ "library", "libraries" ]
if num > 0:
print ("%s%d unused %s in %s:%s" % (Colour.RED, num, plural[num > 1], map_file, Colour.RESET))
for u in sorted(unused):
print (" " + u)
print ("%sDone%s\n" % (Colour.WHITE, Colour.RESET))
def process_map (state):
unused_libs = []
f = open (map_file, "rt")
lines = f.readlines()
f.close()
for l in lines:
l = l.strip()
if l == "Unused libraries:":
state = State.UNUSED
continue
if state == State.UNUSED:
if l == "":
break
if os.path.basename (l).lower() not in ignore_libs:
unused_libs.append (l)
return unused_libs
report (process_map(State.IDLE))
endef
#######################################################################################
DEP_REPLACE = sed -e 's/\(.*\)\.o: /\n$$(OBJ_DIR)\/\1.obj: /'
DEP_CFLAGS = -MM $(filter -I% -D%, $(CFLAGS))
ALL_SOURCES = $(NETTLE_C_SRC) $(PROGRAMS_SRC) $(TEST_SRC) $(TOOLS_SRC) \
examples/io.c examples/read_rsa_key.c examples/timing.c
depend: $(OBJ_DIR) $(GENERATED)
$(call green_msg, Generating depenencies for $(words $(ALL_SOURCES)) .c-files.)
$(file > .depend.Windows, $(call Warning, #))
gcc $(DEP_CFLAGS) $(ALL_SOURCES) | $(DEP_REPLACE) >> .depend.Windows
-include .depend.Windows
#define NEED_STRUCT_TIMEVAL
#include <stdint.h>
#include <assert.h>
#include <config.h>
/*
* Number of micro-seconds between the beginning of the Windows epoch
* (Jan. 1, 1601) and the Unix epoch (Jan. 1, 1970).
*/
#define DELTA_EPOCH_IN_USEC 11644473600000000Ui64
static uint64_t FILETIME_to_unix_epoch (const FILETIME *ft)
{
uint64_t res = (uint64_t) ft->dwHighDateTime << 32;
res |= ft->dwLowDateTime;
res /= 10; /* from 100 nano-sec periods to usec */
res -= DELTA_EPOCH_IN_USEC; /* from Win epoch to Unix epoch */
return (res);
}
int gettimeofday (struct timeval *tv, void *tz)
{
FILETIME ft;
uint64_t tim;
GetSystemTimePreciseAsFileTime (&ft);
tim = FILETIME_to_unix_epoch (&ft);
tv->tv_sec = (long) (tim / 1000000L);
tv->tv_usec = (long) (tim % 1000000L);
(void) tz;
return (0);
}
int clock_gettime (int clock_spec, struct timespec *now)
{
FILETIME cr_time, exit_time, krnl_time, usr_time;
uint64_t tim;
static HANDLE proc = INVALID_HANDLE_VALUE; /* open our process only once */
if (proc == INVALID_HANDLE_VALUE)
proc = OpenProcess (PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, GetCurrentProcessId());
assert (proc != INVALID_HANDLE_VALUE);
assert (clock_spec == CLOCK_PROCESS_CPUTIME_ID);
GetProcessTimes (proc, &cr_time, &exit_time, &krnl_time, &usr_time);
tim = FILETIME_to_unix_epoch (&usr_time);
now->tv_sec = (long) (tim / 1000000L);
now->tv_nsec = 1000 * (long) (tim % 1000000L);
return (0);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment