Last active
February 16, 2023 10:02
-
-
Save gvanem/2f78e7234be572720f12faf9988aa892 to your computer and use it in GitHub Desktop.
GNU-makefile for Nettle + Hogweed (MSVC/clang-cl, x86/x64)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# | |
# 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 <[email protected]>" | |
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 | |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#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