5 kx #
5 kx # Argon2 reference source code package - reference C implementations
5 kx #
5 kx # Copyright 2015
5 kx # Daniel Dinu, Dmitry Khovratovich, Jean-Philippe Aumasson, and Samuel Neves
5 kx #
5 kx # You may use this work under the terms of a Creative Commons CC0 1.0
5 kx # License/Waiver or the Apache Public License 2.0, at your option. The terms of
5 kx # these licenses can be found at:
5 kx #
5 kx # - CC0 1.0 Universal : http://creativecommons.org/publicdomain/zero/1.0
5 kx # - Apache 2.0 : http://www.apache.org/licenses/LICENSE-2.0
5 kx #
5 kx # You should have received a copy of both of these licenses along with this
5 kx # software. If not, they may be obtained at the above URLs.
5 kx #
5 kx
5 kx RUN = argon2
5 kx BENCH = bench
5 kx GENKAT = genkat
5 kx ARGON2_VERSION ?= ZERO
5 kx
5 kx # installation parameters for staging area and final installation path
5 kx # Note; if Linux and not Debian/Ubuntu version also add lib override to make command-line
5 kx # for RedHat/Fedora, add: LIBRARY_REL=lib64
5 kx DESTDIR ?=
5 kx PREFIX ?= /usr
5 kx
5 kx # Increment on an ABI breaking change
5 kx ABI_VERSION = 1
5 kx
5 kx DIST = phc-winner-argon2
5 kx
5 kx SRC = src/argon2.c src/core.c src/blake2/blake2b.c src/thread.c src/encoding.c
5 kx SRC_RUN = src/run.c
5 kx SRC_BENCH = src/bench.c
5 kx SRC_GENKAT = src/genkat.c
5 kx OBJ = $(SRC:.c=.o)
5 kx
5 kx CFLAGS += -std=c89 -Iinclude -Isrc
5 kx
5 kx ifeq ($(NO_THREADS), 1)
5 kx CFLAGS += -DARGON2_NO_THREADS
5 kx else
5 kx CFLAGS += -pthread
5 kx endif
5 kx
5 kx CI_CFLAGS := $(CFLAGS) -Werror=declaration-after-statement -D_FORTIFY_SOURCE=2 \
5 kx -Wextra -Wno-type-limits -Werror -coverage -DTEST_LARGE_RAM
5 kx
5 kx $(info Building without optimizations)
5 kx SRC += src/ref.c
5 kx
5 kx BUILD_PATH := $(shell pwd)
5 kx KERNEL_NAME := $(shell uname -s)
5 kx MACHINE_NAME := $(shell uname -m)
5 kx
5 kx LIB_NAME = argon2
5 kx PC_NAME = lib$(LIB_NAME).pc
5 kx PC_SRC = $(PC_NAME).in
5 kx
5 kx ifeq ($(KERNEL_NAME), Linux)
5 kx LIB_EXT := so.$(ABI_VERSION)
5 kx LIB_CFLAGS := -shared -fPIC -fvisibility=hidden -DA2_VISCTL=1
5 kx SO_LDFLAGS := -Wl,-soname,lib$(LIB_NAME).$(LIB_EXT)
5 kx LINKED_LIB_EXT := so
5 kx PC_EXTRA_LIBS ?= -lrt -ldl
5 kx endif
5 kx ifeq ($(KERNEL_NAME), $(filter $(KERNEL_NAME),DragonFly FreeBSD NetBSD OpenBSD))
5 kx LIB_EXT := so
5 kx LIB_CFLAGS := -shared -fPIC
5 kx PC_EXTRA_LIBS ?=
5 kx endif
5 kx ifeq ($(KERNEL_NAME), Darwin)
5 kx LIB_EXT := $(ABI_VERSION).dylib
5 kx LIB_CFLAGS := -dynamiclib -install_name @rpath/lib$(LIB_NAME).$(LIB_EXT)
5 kx LINKED_LIB_EXT := dylib
5 kx PC_EXTRA_LIBS ?=
5 kx endif
5 kx ifeq ($(findstring CYGWIN, $(KERNEL_NAME)), CYGWIN)
5 kx LIB_EXT := dll
5 kx LIB_CFLAGS := -shared -Wl,--out-implib,lib$(LIB_NAME).$(LIB_EXT).a
5 kx PC_EXTRA_LIBS ?=
5 kx endif
5 kx ifeq ($(findstring MINGW, $(KERNEL_NAME)), MINGW)
5 kx LIB_EXT := dll
5 kx LIB_CFLAGS := -shared -Wl,--out-implib,lib$(LIB_NAME).$(LIB_EXT).a
5 kx PC_EXTRA_LIBS ?=
5 kx endif
5 kx ifeq ($(findstring MSYS, $(KERNEL_NAME)), MSYS)
5 kx LIB_EXT := dll
5 kx LIB_CFLAGS := -shared -Wl,--out-implib,lib$(LIB_NAME).$(LIB_EXT).a
5 kx PC_EXTRA_LIBS ?=
5 kx endif
5 kx ifeq ($(KERNEL_NAME), SunOS)
5 kx CC := gcc
5 kx CFLAGS += -D_REENTRANT
5 kx LIB_EXT := so
5 kx LIB_CFLAGS := -shared -fPIC
5 kx PC_EXTRA_LIBS ?=
5 kx endif
5 kx
5 kx ifeq ($(KERNEL_NAME), Linux)
5 kx ifeq ($(CC), clang)
5 kx CI_CFLAGS += -fsanitize=address -fsanitize=undefined
5 kx endif
5 kx endif
5 kx
5 kx LIB_SH := lib$(LIB_NAME).$(LIB_EXT)
5 kx LIB_ST := lib$(LIB_NAME).a
5 kx
5 kx ifdef LINKED_LIB_EXT
5 kx LINKED_LIB_SH := lib$(LIB_NAME).$(LINKED_LIB_EXT)
5 kx endif
5 kx
5 kx
5 kx LIBRARIES = $(LIB_SH) $(LIB_ST)
5 kx HEADERS = include/argon2.h
5 kx
5 kx INSTALL = install
5 kx
5 kx # relative paths for different OS
5 kx ifeq ($(KERNEL_NAME), $(filter $(KERNEL_NAME),DragonFly FreeBSD))
5 kx
5 kx # default for FreeBSD
5 kx BINARY_REL ?= bin
5 kx INCLUDE_REL ?= include
5 kx LIBRARY_REL ?= lib
5 kx PKGCONFIG_REL ?= libdata
5 kx
5 kx else ifeq ($(KERNEL_NAME)-$(MACHINE_NAME), Linux-x86_64)
5 kx
5 kx # default for Debian/Ubuntu x86_64
5 kx BINARY_REL ?= bin
5 kx INCLUDE_REL ?= include
5 kx LIBRARY_REL ?= lib/x86_64-linux-gnu
5 kx PKGCONFIG_REL ?= $(LIBRARY_REL)
5 kx
5 kx else
5 kx
5 kx # NetBSD, ... and Linux64/Linux32 variants that use plain lib directory
5 kx BINARY_REL ?= bin
5 kx INCLUDE_REL ?= include
5 kx LIBRARY_REL ?= lib
5 kx PKGCONFIG_REL ?= $(LIBRARY_REL)
5 kx
5 kx endif
5 kx
5 kx # absolute paths to staging area
5 kx INST_INCLUDE = $(DESTDIR)$(PREFIX)/$(INCLUDE_REL)
5 kx INST_LIBRARY = $(DESTDIR)$(PREFIX)/$(LIBRARY_REL)
5 kx INST_BINARY = $(DESTDIR)$(PREFIX)/$(BINARY_REL)
5 kx INST_PKGCONFIG = $(DESTDIR)$(PREFIX)/$(PKGCONFIG_REL)/pkgconfig
5 kx
5 kx # main target
5 kx .PHONY: all
5 kx all: $(RUN) libs
5 kx
5 kx .PHONY: libs
5 kx libs: $(LIBRARIES) $(PC_NAME)
5 kx
5 kx $(RUN): $(SRC) $(SRC_RUN)
5 kx $(CC) $(CFLAGS) $(LDFLAGS) $^ -o $@
5 kx
5 kx $(BENCH): $(SRC) $(SRC_BENCH)
5 kx $(CC) $(CFLAGS) $^ -o $@
5 kx
5 kx $(GENKAT): $(SRC) $(SRC_GENKAT)
5 kx $(CC) $(CFLAGS) $^ -o $@ -DGENKAT
5 kx
5 kx $(LIB_SH): $(SRC)
5 kx $(CC) $(CFLAGS) $(LIB_CFLAGS) $(LDFLAGS) $(SO_LDFLAGS) $^ -o $@
5 kx
5 kx $(LIB_ST): $(OBJ)
5 kx ar rcs $@ $^
5 kx
5 kx .PHONY: clean
5 kx clean:
5 kx rm -f '$(RUN)' '$(BENCH)' '$(GENKAT)'
5 kx rm -f '$(LIB_SH)' '$(LIB_ST)' kat-argon2* '$(PC_NAME)'
5 kx rm -f testcase
5 kx rm -rf *.dSYM
5 kx cd src/ && rm -f *.o
5 kx cd src/blake2/ && rm -f *.o
5 kx cd kats/ && rm -f kat-* diff* run_* make_*
5 kx
5 kx
5 kx # all substitutions to pc template
5 kx SED_COMMANDS = /^\#\#.*$$/d;
5 kx SED_COMMANDS += s\#@PREFIX@\#$(PREFIX)\#g;
5 kx SED_COMMANDS += s\#@EXTRA_LIBS@\#$(PC_EXTRA_LIBS)\#g;
5 kx SED_COMMANDS += s\#@UPSTREAM_VER@\#$(ARGON2_VERSION)\#g;
5 kx SED_COMMANDS += s\#@HOST_MULTIARCH@\#$(LIBRARY_REL)\#g;
5 kx SED_COMMANDS += s\#@INCLUDE@\#$(INCLUDE_REL)\#g;
5 kx
5 kx # substitute PREFIX and PC_EXTRA_LIBS into pkgconfig pc file
5 kx $(PC_NAME): $(PC_SRC)
5 kx sed '$(SED_COMMANDS)' < '$(PC_SRC)' > '$@'
5 kx
5 kx
5 kx .PHONY: dist
5 kx dist:
5 kx cd ..; \
5 kx tar -c --exclude='.??*' -z -f $(DIST)-`date "+%Y%m%d"`.tgz $(DIST)/*
5 kx
5 kx .PHONY: test
5 kx test: $(SRC) src/test.c
5 kx $(CC) $(CFLAGS) -Wextra -Wno-type-limits $^ -o testcase
5 kx @sh kats/test.sh
5 kx ./testcase
5 kx
5 kx .PHONY: testci
5 kx testci: $(SRC) src/test.c
5 kx $(CC) $(CI_CFLAGS) $^ -o testcase
5 kx @sh kats/test.sh
5 kx ./testcase
5 kx
5 kx
5 kx .PHONY: format
5 kx format:
5 kx clang-format -style="{BasedOnStyle: llvm, IndentWidth: 4}" \
5 kx -i include/*.h src/*.c src/*.h src/blake2/*.c src/blake2/*.h
5 kx
5 kx .PHONY: install
5 kx install: $(RUN) libs
5 kx $(INSTALL) -d $(INST_INCLUDE)
5 kx $(INSTALL) -m 0644 $(HEADERS) $(INST_INCLUDE)
5 kx $(INSTALL) -d $(INST_LIBRARY)
5 kx $(INSTALL) -m 0644 $(LIBRARIES) $(INST_LIBRARY)
5 kx ifdef LINKED_LIB_SH
5 kx cd $(INST_LIBRARY) && ln -s $(notdir $(LIB_SH) $(LINKED_LIB_SH))
5 kx endif
5 kx $(INSTALL) -d $(INST_BINARY)
5 kx $(INSTALL) $(RUN) $(INST_BINARY)
5 kx $(INSTALL) -d $(INST_PKGCONFIG)
5 kx $(INSTALL) -m 0644 $(PC_NAME) $(INST_PKGCONFIG)
5 kx
5 kx .PHONY: uninstall
5 kx uninstall:
5 kx cd $(INST_INCLUDE) && rm -f $(notdir $(HEADERS))
5 kx cd $(INST_LIBRARY) && rm -f $(notdir $(LIBRARIES) $(LINKED_LIB_SH))
5 kx cd $(INST_BINARY) && rm -f $(notdir $(RUN))
5 kx cd $(INST_PKG_CONFIG) && rm -f $(notdir $(PC_NAME))