#
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.

# NOTE: any ifdefs in this file must be defined on the gmake command line
# (if anywhere).  They cannot come from Makefile or config.mk

CORE_DEPTH = ../..

MODULE = nss

# copied from Linux.mk. We have a chicken and egg issue here. We need to set
# Library name before we call the platform code in coreconf, but we need to
# Pick up the automatic setting of FREEBL_LOWHASH before we  can set the
# Library name... so for now we mimic the code in Linux.mk to get the
# automatic setting early...
#
# On Linux 2.6 or later, build libfreebl3.so with no NSPR and libnssutil3.so
# dependencies by default.  Set FREEBL_NO_DEPEND to 0 in the environment to
# override this.
#
#
include $(CORE_DEPTH)/coreconf/arch.mk
ifeq ($(OS_ARCH),Linux)
ifneq ($(OS_TARGET),Android)
ifeq (2.6,$(firstword $(sort 2.6 $(OS_RELEASE))))
ifndef FREEBL_NO_DEPEND
FREEBL_NO_DEPEND = 1
FREEBL_LOWHASH = 1
endif
endif
endif
endif


LIBRARY_NAME = freebl
LIBRARY_VERSION = 3

ifdef FREEBL_CHILD_BUILD
  ifdef USE_ABI32_INT32
    LIBRARY_NAME = freebl_32int
  endif
  ifdef USE_ABI32_INT64
    LIBRARY_NAME = freebl_32int64
  endif
  ifdef USE_ABI32_FPU
    LIBRARY_NAME = freebl_32fpu
  endif
  ifdef USE_ABI64_INT
    LIBRARY_NAME = freebl_64int
  endif
  ifdef USE_ABI64_FPU
    LIBRARY_NAME = freebl_64fpu
  endif
  ifdef FREEBL_LOWHASH
    LIBRARY_NAME = freeblpriv
  endif
  ifdef USE_STUB_BUILD
    # for the stub build, reset name to the default (from freeblpriv)
    LIBRARY_NAME = freebl
  endif
endif

# if the library name contains _, we prefix the version with _
ifneq (,$(findstring _,$(LIBRARY_NAME)))
  LIBRARY_VERSION := _$(LIBRARY_VERSION)
endif

MAPFILE = $(OBJDIR)/$(LIBRARY_NAME).def

SOFTOKEN_LIBRARY_VERSION = 3

DEFINES += -DSHLIB_SUFFIX=\"$(DLL_SUFFIX)\" -DSHLIB_PREFIX=\"$(DLL_PREFIX)\" \
	-DSHLIB_VERSION=\"$(LIBRARY_VERSION)\" \
	-DSOFTOKEN_SHLIB_VERSION=\"$(SOFTOKEN_LIBRARY_VERSION)\"

REQUIRES =

EXPORTS = \
	blapit.h \
	shsign.h \
	ecl-exp.h \
	$(LOWHASH_EXPORTS) \
	$(NULL)

PRIVATE_EXPORTS = \
	cmac.h \
	alghmac.h \
	blake2b.h \
	blapi.h \
	chacha20poly1305.h \
	hmacct.h \
	secmpi.h \
	secrng.h \
	ec.h \
	ecl.h \
	ecl-curve.h \
	eclt.h \
	$(NULL)

MPI_HDRS = mpi-config.h mpi.h mpi-priv.h mplogic.h mpprime.h logtab.h mp_gf2m.h
MPI_SRCS = mpprime.c mpmontg.c mplogic.c mpi.c mp_gf2m.c


ECL_HDRS = ecl-exp.h ecl.h ecp.h ecl-priv.h
ECL_SRCS = ecl.c ecl_mult.c ecl_gf.c \
	ecp_aff.c ecp_jac.c ecp_mont.c \
	ec_naf.c ecp_jm.c ecp_256.c ecp_384.c ecp_521.c \
	ecp_256_32.c ecp_25519.c ecp_secp384r1.c ecp_secp521r1.c
SHA_SRCS = sha_fast.c
MPCPU_SRCS = mpcpucache.c
VERIFIED_SRCS = $(NULL)

CSRCS = \
	freeblver.c \
	ldvector.c \
	sysrand.c \
	$(SHA_SRCS) \
	md2.c \
	md5.c \
	sha512.c \
	cmac.c \
	alghmac.c \
	rawhash.c \
	arcfour.c \
	arcfive.c \
	crypto_primitives.c \
	blake2b.c \
	desblapi.c \
	des.c \
	drbg.c \
	chacha20poly1305.c \
	cts.c \
	ctr.c \
	blinit.c \
	fipsfreebl.c \
	gcm.c \
	hmacct.c \
	rijndael.c \
	aeskeywrap.c \
	camellia.c \
	dh.c \
	ec.c \
	ecdecode.c \
	pqg.c \
	dsa.c \
	rsa.c \
	rsapkcs.c \
	shvfy.c \
	tlsprfalg.c \
	jpake.c \
	$(MPI_SRCS) \
	$(MPCPU_SRCS) \
	$(ECL_SRCS) \
	$(VERIFIED_SRCS) \
	$(STUBS_SRCS) \
	$(LOWHASH_SRCS) \
	$(EXTRA_SRCS) \
	$(NULL)

ifndef NSS_DISABLE_DEPRECATED_SEED
	CSRCS += deprecated/seed.c
endif

ifndef NSS_DISABLE_DEPRECATED_RC2
	CSRCS += deprecated/alg2268.c
endif

ALL_CSRCS := $(CSRCS)

ALL_HDRS =  \
	cmac.h \
	alghmac.h \
	blake2b.h \
	blapi.h \
	blapit.h \
	des.h \
	ec.h \
	loader.h \
	rijndael.h \
	camellia.h \
	secmpi.h \
	sha_fast.h \
	sha256.h \
	shsign.h \
	vis_proto.h \
	seed.h \
	$(NULL)


ifdef AES_GEN_VAL
DEFINES += -DRIJNDAEL_GENERATE_VALUES
else
ifdef AES_GEN_VAL_M
DEFINES += -DRIJNDAEL_GENERATE_VALUES_MACRO
else
DEFINES += -DRIJNDAEL_INCLUDE_TABLES
endif
endif
