# This file is dual-licensed. Choose whichever licence you want from # the two licences listed below. # # The first licence is a regular 2-clause BSD licence. The second licence # is the CC-0 from Creative Commons. It is intended to release Monocypher # to the public domain. The BSD licence serves as a fallback option. # # SPDX-License-Identifier: BSD-2-Clause OR CC0-1.0 # # ------------------------------------------------------------------------ # # Copyright (c) 2017-2019, Loup Vaillant # Copyright (c) 2017, 2019, Fabio Scotoni # All rights reserved. # # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are # met: # # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the # distribution. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT # HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # # ------------------------------------------------------------------------ # # Written in 2017-2019 by Loup Vaillant and Fabio Scotoni # # To the extent possible under law, the author(s) have dedicated all copyright # and related neighboring rights to this software to the public domain # worldwide. This software is distributed without any warranty. # # You should have received a copy of the CC0 Public Domain Dedication along # with this software. If not, see # CC=gcc -std=gnu99 # speed tests don't work with -std=cxx, they need the POSIX extensions CFLAGS= -pedantic -Wall -Wextra -O3 -march=native DESTDIR= PREFIX=usr/local LIBDIR=$(PREFIX)/lib INCLUDEDIR=$(PREFIX)/include PKGCONFIGDIR=$(LIBDIR)/pkgconfig MANDIR=$(PREFIX)/share/man/man3 SONAME=libmonocypher.so.3 VERSION=3.1.1 ifdef USE_ED25519 LINK_ED25519=lib/monocypher-ed25519.o INSTALL_ED25519=cp src/optional/monocypher-ed25519.h $(DESTDIR)/$(INCLUDEDIR) endif .PHONY: all library static-library dynamic-library \ install install-doc pkg-config-libhydrogen \ check test ctgrind \ speed speed-sodium speed-tweetnacl speed-hydrogen speed-c25519 \ clean uninstall \ dist all : library install: library src/monocypher.h monocypher.pc install-doc mkdir -p $(DESTDIR)/$(INCLUDEDIR) mkdir -p $(DESTDIR)/$(LIBDIR) mkdir -p $(DESTDIR)/$(PKGCONFIGDIR) cp -P lib/libmonocypher.a lib/libmonocypher.so* $(DESTDIR)/$(LIBDIR) cp src/monocypher.h $(DESTDIR)/$(INCLUDEDIR) $(INSTALL_ED25519) sed "s|PREFIX|$(PREFIX)|" monocypher.pc \ > $(DESTDIR)/$(PKGCONFIGDIR)/monocypher.pc install-doc: mkdir -p $(DESTDIR)/$(MANDIR) cp -PR doc/man/man3/*.3monocypher $(DESTDIR)/$(MANDIR) ifdef USE_ED25519 cp -PR doc/man/man3/optional/*.3monocypher $(DESTDIR)/$(MANDIR) endif pkg-config-libhydrogen: mkdir -p $(DESTDIR)/$(PKGCONFIGDIR) sed "s|PREFIX|$(PREFIX)|" tests/speed/libhydrogen.pc \ > $(DESTDIR)/$(PKGCONFIGDIR)/libhydrogen.pc library: static-library dynamic-library static-library : lib/libmonocypher.a dynamic-library: lib/libmonocypher.so lib/$(SONAME) clean: rm -rf lib/ rm -f *.out uninstall: rm -f $(DESTDIR)/$(LIBDIR)/libmonocypher.a rm -f $(DESTDIR)/$(LIBDIR)/libmonocypher.so* rm -f $(DESTDIR)/$(INCLUDEDIR)/monocypher.h rm -f $(DESTDIR)/$(INCLUDEDIR)/monocypher-ed25519.h rm -f $(DESTDIR)/$(PKGCONFIGDIR)/monocypher.pc rm -f $(DESTDIR)/$(MANDIR)/*.3monocypher check: test test : test.out test-legacy : test-legacy.out speed : speed.out speed-sodium : speed-sodium.out speed-tweetnacl: speed-tweetnacl.out speed-hydrogen : speed-hydrogen.out speed-c25519 : speed-c25519.out test test-legacy speed speed-sodium speed-tweetnacl speed-hydrogen speed-c25519: ./$< ctgrind: ctgrind.out valgrind ./ctgrind.out # Monocypher libraries lib/libmonocypher.a: lib/monocypher.o $(LINK_ED25519) ar cr $@ $^ lib/libmonocypher.so: lib/$(SONAME) @mkdir -p $(@D) ln -sf `basename $<` $@ lib/$(SONAME): lib/monocypher.o $(LINK_ED25519) @mkdir -p $(@D) $(CC) $(CFLAGS) $(LDFLAGS) -shared -Wl,-soname,$(SONAME) -o $@ $^ lib/monocypher-ed25519.o: src/optional/monocypher-ed25519.c \ src/optional/monocypher-ed25519.h lib/chacha20.o : src/deprecated/chacha20.c src/deprecated/chacha20.h lib/aead-incr.o : src/deprecated/aead-incr.c src/deprecated/aead-incr.h lib/monocypher.o: src/monocypher.c src/monocypher.h lib/monocypher.o lib/monocypher-ed25519.o lib/chacha20.o lib/aead-incr.o: @mkdir -p $(@D) $(CC) $(CFLAGS) -I src -I src/optional -fPIC -c -o $@ $< # Test & speed libraries TEST_COMMON = tests/utils.h src/monocypher.h src/optional/monocypher-ed25519.h TEST_LEGACY = $(TEST_COMMON) src/deprecated/chacha20.h src/deprecated/aead-incr.h SPEED = tests/speed lib/utils.o :tests/utils.c lib/test.o :tests/test.c $(TEST_COMMON) tests/vectors.h lib/test-legacy.o :tests/test-legacy.c $(TEST_LEGACY) tests/vectors.h lib/ctgrind.o :tests/ctgrind.c $(TEST_COMMON) lib/speed.o :$(SPEED)/speed.c $(TEST_COMMON) $(SPEED)/speed.h lib/speed-tweetnacl.o:$(SPEED)/speed-tweetnacl.c $(TEST_COMMON) $(SPEED)/speed.h lib/utils.o lib/test.o lib/test-legacy.o lib/speed.o: @mkdir -p $(@D) $(CC) $(CFLAGS) \ -I src -I src/optional -I tests \ -fPIC -c -o $@ $< lib/ctgrind.o: # suppress optimisations to maximise findings @mkdir -p $(@D) $(CC) $(CFLAGS) -O0 \ -I src -I src/optional -I tests \ -fPIC -c -o $@ $< lib/speed-tweetnacl.o: @mkdir -p $(@D) $(CC) $(CFLAGS) \ -I src -I src/optional -I tests -I tests/externals/tweetnacl \ -fPIC -c -o $@ $< lib/speed-sodium.o:$(SPEED)/speed-sodium.c $(TEST_COMMON) $(SPEED)/speed.h @mkdir -p $(@D) $(CC) $(CFLAGS) \ -I src -I src/optional -I tests \ `pkg-config --cflags libsodium` \ -fPIC -c -o $@ $< lib/speed-hydrogen.o:$(SPEED)/speed-hydrogen.c $(TEST_COMMON) $(SPEED)/speed.h @mkdir -p $(@D) $(CC) $(CFLAGS) \ -I src -I src/optional -I tests \ `pkg-config --cflags libhydrogen` \ -fPIC -c -o $@ $< C25519= c25519 edsign ed25519 morph25519 fprime f25519 sha512 C25519_H= $(patsubst %, tests/externals/c25519/%.h, $(C25519)) C25519_OBJECTS= $(patsubst %, lib/c25519/%.o, $(C25519)) lib/c25519/c25519.o : tests/externals/c25519/c25519.c $(C25519_H) lib/c25519/ed25519.o : tests/externals/c25519/ed25519.c $(C25519_H) lib/c25519/edsign.o : tests/externals/c25519/edsign.c $(C25519_H) lib/c25519/f25519.o : tests/externals/c25519/f25519.c $(C25519_H) lib/c25519/fprime.o : tests/externals/c25519/fprime.c $(C25519_H) lib/c25519/morph25519.o: tests/externals/c25519/morph25519.c $(C25519_H) lib/c25519/sha512.o : tests/externals/c25519/sha512.c $(C25519_H) $(C25519_OBJECTS): @mkdir -p $(@D) $(CC) $(CFLAGS) -I tests/externals/c25519/ -c -o $@ $< lib/speed-c25519.o:$(SPEED)/speed-c25519.c \ $(SPEED)/speed.h \ $(TEST_COMMON) \ $(C25519_HEADERS) @mkdir -p $(@D) $(CC) $(CFLAGS) -I tests -I tests/externals/c25519 -c -o $@ $< # test & speed executables TEST_OBJ= lib/utils.o lib/monocypher.o test.out : lib/test.o $(TEST_OBJ) lib/monocypher-ed25519.o test-legacy.out: lib/test-legacy.o $(TEST_OBJ) lib/chacha20.o lib/aead-incr.o ctgrind.out : lib/ctgrind.o $(TEST_OBJ) lib/monocypher-ed25519.o speed.out : lib/speed.o $(TEST_OBJ) lib/monocypher-ed25519.o test.out test-legacy.out speed.out: $(CC) $(CFLAGS) -I src -I src/optional -o $@ $^ ctgrind.out: $(CC) $(CFLAGS) -O0 -I src -I src/optional -o $@ $^ speed-sodium.out: lib/speed-sodium.o lib/utils.o $(CC) $(CFLAGS) -o $@ $^ \ `pkg-config --cflags libsodium` \ `pkg-config --libs libsodium` speed-hydrogen.out: lib/speed-hydrogen.o lib/utils.o $(CC) $(CFLAGS) -o $@ $^ \ `pkg-config --cflags libhydrogen` \ `pkg-config --libs libhydrogen` lib/tweetnacl.o: tests/externals/tweetnacl/tweetnacl.c \ tests/externals/tweetnacl/tweetnacl.h $(CC) $(CFLAGS) -c -o $@ $< speed-tweetnacl.out: lib/speed-tweetnacl.o lib/tweetnacl.o lib/utils.o speed-c25519.out : lib/speed-c25519.o $(C25519_OBJECTS) lib/utils.o speed-tweetnacl.out speed-c25519.out: $(CC) $(CFLAGS) -o $@ $^