# Makefile for libcryptomodule.a
#
# David A. McGrew
# Cisco Systems, Inc.

srcdir = .
top_srcdir = ..
top_builddir = ../


CC	= gcc
INCDIR	= -Iinclude -I$(srcdir)/include
DEFS	= -DHAVE_CONFIG_H
CPPFLAGS= 
CFLAGS	= -Wall -O4 -fexpensive-optimizations -funroll-loops
LIBS	= 
LDFLAGS	=  -L.
COMPILE = $(CC) $(DEFS) $(INCDIR) $(CPPFLAGS) $(CFLAGS)
CRYPTOLIB = -lcryptomodule

RANLIB	= ranlib

# EXE defines the suffix on executables - it's .exe for cygwin, and
# null on linux, bsd, and OS X and other OSes.  we define this so that
# `make clean` will work on the cygwin platform
EXE = 
# Random source.
RNG_OBJS = rand_source.o

ifdef ARCH
  DEFS += -D$(ARCH)=1
endif

ifdef sysname
  DEFS += -D$(sysname)=1
endif

.PHONY: dummy all runtest clean superclean

dummy : all runtest 

# test applications 

testapp = test/cipher_driver$(EXE) test/datatypes_driver$(EXE) \
	  test/stat_driver$(EXE) test/sha1_driver$(EXE) \
	  test/kernel_driver$(EXE) test/aes_calc$(EXE) test/rand_gen$(EXE) \
	  test/env$(EXE)

# data values used to test the aes_calc application for AES-128
k128=000102030405060708090a0b0c0d0e0f
p128=00112233445566778899aabbccddeeff
c128=69c4e0d86a7b0430d8cdb78070b4c55a


# data values used to test the aes_calc application for AES-256
k256=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f
p256=00112233445566778899aabbccddeeff
c256=8ea2b7ca516745bfeafc49904b496089


runtest: libcryptomodule.a $(testapp)
	test/env$(EXE) # print out information on the build environment
	@echo "running libcryptomodule test applications..."
	test `test/aes_calc $(k128) $(p128)` = $(c128)
	test `test/aes_calc $(k256) $(p256)` = $(c256)
	test/cipher_driver$(EXE) -v >/dev/null
	test/datatypes_driver$(EXE) -v >/dev/null
	test/stat_driver$(EXE) >/dev/null
	test/sha1_driver$(EXE) -v >/dev/null
	test/kernel_driver$(EXE) -v >/dev/null
	test/rand_gen$(EXE) -n 256 >/dev/null
	@echo "libcryptomodule test applications passed."

# libcryptomodule.a (the crypto engine) 

ciphers = cipher/cipher.o cipher/null_cipher.o      \
          cipher/aes.o cipher/aes_icm.o             \
          cipher/aes_cbc.o

hashes  = hash/null_auth.o hash/sha1.o \
          hash/hmac.o hash/auth.o

math    = math/datatypes.o math/stat.o

rng     = rng/$(RNG_OBJS) rng/rand_source.o rng/prng.o rng/ctr_prng.o

err     = kernel/err.o

kernel  = kernel/crypto_kernel.o  kernel/alloc.o   \
          kernel/key.o $(rng) $(err)

xfm     = ae_xfm/xfm.o

cryptobj =  $(ciphers) $(hashes) $(math) $(stat) $(kernel) $(xfm)

# the rule for making object files and test apps

%.o: %.c
	$(COMPILE) -c $< -o $@

%$(EXE): %.c libcryptomodule.a 
	$(COMPILE) $(LDFLAGS) $< -o $@ $(CRYPTOLIB) $(LIBS)

ifndef AR
  AR=ar
endif

# and the crypto module library itself

libcryptomodule.a: $(cryptobj) 
	$(AR) cr libcryptomodule.a $(cryptobj) 
	$(RANLIB) libcryptomodule.a

all: libcryptomodule.a $(testapp)

# housekeeping functions

clean:
	rm -f libcryptomodule.a
	rm -f $(testapp) *.o */*.o 
	for a in * .* */*; do if [ -f "$$a~" ] ; then rm $$a~; fi; done;
	rm -f `find . -name "*.[ch]~*~"`
	rm -rf latex

superclean: clean
	rm -f *core TAGS ktrace.out


# the target 'package' builds a compressed tar archive of the source code

distname = crypto-$(shell cat VERSION)

package: superclean
	cd ..; tar cvzf $(distname).tgz crypto/


# EOF
