summaryrefslogtreecommitdiff
path: root/cryptest.nmake
blob: 56ffeb92fd60cfb13a7ad1986f3610c8afc54194 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
# cryptest.nmake - written and placed in public domain by Jeffrey Walton.
#                  Copyright assigned to the Crypto++ project.

# This makefile is used for testing and building cryptlib.lib and cryptest.exe
#  under nmake. Open a Visual Studio Developer Prompt and then run
#  "nmake /f cryptest.nmake". The build procedure will reveal not so readily
#  apparent problems under Microsoft ARM and Metro UI apps.

# The makefile is not intended for production use, though it may be used as a
#  starting point. For example, you can add switches like /MT and /MTd for
#  dynamic runtime linking against the Microsoft C++ Runtime libraries. If you
#  are building for Windows Phone or Windows Store, then you probably want to
#  remove /D_MBCS. The resulting cryptlib.lib may be suitable as a starting
#  point for a DLL project using Crypto++.

# You must also add /DCRYPTOPP_DEBUG or /DDEBUG if you want a debug build with
#  the library's assert. The library moved from Posix NDEBUG and assert() to
#  CRYPTOPP_ASSERT at 5.6.5 due to CVE-2016-7420. CRYPTOPP_ASSERT has the
#  additional benefit of using DebugBreak(), and the  program does not crash
#  while you are debugging it like would happen with Posix assert().

# The list of LIB_SRCS and TEST_SRCS was generated under Linux with
#  "make sources | fold -w74 -s". The list of LIB_OBJS and TEST_OBJS was
#  generated with "make sources | fold -w74 -s | sed 's|.cpp|.obj|g'". The
#  order of the first three object files are significant. See C++ Static
#  Initialization Order Fisaco on the Crypto++ wiki for details.

# You are free to add and remove files to the list. For example, you can remove
#  rdrand.asm build it using NASM, and then include the NASM object file
#  rdrand_x86.obj or rdrand_x64.obj.

###########################################################################################

# To test debug builds, use the following CXXFLAGS:
#   - /DDEBUG /D_DEBUG /Oi /Oy- /Od
# To test release builds, use the following CXXFLAGS:
#   - /DNDEBUG /D_NDEBUG /Oi /Oy /O2
# To test with static C++ runtime linking, use the following CXXFLAGS (default below):
#   - /MT (release) or /MTd (debug)
# To test with dynamic C++ runtime linking, use the following CXXFLAGS:
#   - /MD (release) or /MDd (debug)
# To test Desktop app, use the following CXXFLAGS:
#   - /DWINAPI_FAMILY=WINAPI_FAMILY_DESKTOP_APP
# To test Windows Store app, use the following CXXFLAGS:
#   - /DWINAPI_FAMILY=WINAPI_FAMILY_APP
# To test Windows Phone, use the following CXXFLAGS:
#   - /DWINAPI_FAMILY=WINAPI_FAMILY_PHONE_APP
# To test Surface RT (ARM tablet), use the following CXXFLAGS:
#   - /D_ARM_WINAPI_PARTITION_DESKTOP_SDK_AVAILABLE=1 /DWINAPI_FAMILY=WINAPI_FAMILY_DESKTOP_APP

###########################################################################################

LIB_SRCS = \
    cryptlib.cpp cpu.cpp integer.cpp 3way.cpp adler32.cpp algebra.cpp \
    algparam.cpp arc4.cpp aria-simd.cpp aria.cpp ariatab.cpp asn.cpp \
    authenc.cpp base32.cpp base64.cpp basecode.cpp bfinit.cpp blake2-simd.cpp \
    blake2.cpp blowfish.cpp blumshub.cpp camellia.cpp cast.cpp casts.cpp \
    cbcmac.cpp ccm.cpp chacha.cpp cham-simd.cpp cham.cpp channels.cpp \
    cmac.cpp crc-simd.cpp crc.cpp default.cpp des.cpp dessp.cpp dh.cpp \
    dh2.cpp dll.cpp dsa.cpp eax.cpp ec2n.cpp eccrypto.cpp ecp.cpp elgamal.cpp \
    emsa2.cpp eprecomp.cpp esign.cpp files.cpp filters.cpp fips140.cpp \
    fipstest.cpp gcm-simd.cpp gcm.cpp gf256.cpp gf2_32.cpp gf2n.cpp \
    gfpcrypt.cpp gost.cpp gzip.cpp hc128.cpp hc256.cpp hex.cpp hight.cpp \
    hmac.cpp hrtimer.cpp ida.cpp idea.cpp iterhash.cpp kalyna.cpp \
    kalynatab.cpp keccak.cpp keccakc.cpp lea-simd.cpp lea.cpp luc.cpp \
    mars.cpp marss.cpp md2.cpp md4.cpp md5.cpp misc.cpp modes.cpp mqueue.cpp \
    mqv.cpp nbtheory.cpp neon-simd.cpp oaep.cpp osrng.cpp padlkrng.cpp \
    panama.cpp pkcspad.cpp poly1305.cpp polynomi.cpp ppc-simd.cpp pssr.cpp \
    pubkey.cpp queue.cpp rabbit.cpp rabin.cpp randpool.cpp rc2.cpp rc5.cpp \
    rc6.cpp rdrand.cpp rdtables.cpp rijndael-simd.cpp rijndael.cpp ripemd.cpp \
    rng.cpp rsa.cpp rw.cpp safer.cpp salsa.cpp scrypt.cpp seal.cpp seed.cpp \
    serpent.cpp sha-simd.cpp sha.cpp sha3.cpp shacal2-simd.cpp shacal2.cpp \
    shark.cpp sharkbox.cpp simeck-simd.cpp simeck.cpp simon.cpp \
    simon128-simd.cpp simon64-simd.cpp skipjack.cpp sm3.cpp sm4-simd.cpp \
    sm4.cpp sosemanuk.cpp speck.cpp speck128-simd.cpp speck64-simd.cpp \
    square.cpp squaretb.cpp sse-simd.cpp strciphr.cpp tea.cpp tftables.cpp \
    threefish.cpp tiger.cpp tigertab.cpp ttmac.cpp tweetnacl.cpp twofish.cpp \
    vmac.cpp wake.cpp whrlpool.cpp xtr.cpp xtrcrypt.cpp zdeflate.cpp \
    zinflate.cpp zlib.cpp

LIB_OBJS = \
    cryptlib.obj cpu.obj integer.obj 3way.obj adler32.obj algebra.obj \
    algparam.obj arc4.obj aria-simd.obj aria.obj ariatab.obj asn.obj \
    authenc.obj base32.obj base64.obj basecode.obj bfinit.obj blake2-simd.obj \
    blake2.obj blowfish.obj blumshub.obj camellia.obj cast.obj casts.obj \
    cbcmac.obj ccm.obj chacha.obj cham-simd.obj cham.obj channels.obj \
    cmac.obj crc-simd.obj crc.obj default.obj des.obj dessp.obj dh.obj \
    dh2.obj dll.obj dsa.obj eax.obj ec2n.obj eccrypto.obj ecp.obj elgamal.obj \
    emsa2.obj eprecomp.obj esign.obj files.obj filters.obj fips140.obj \
    fipstest.obj gcm-simd.obj gcm.obj gf256.obj gf2_32.obj gf2n.obj \
    gfpcrypt.obj gost.obj gzip.obj hc128.obj hc256.obj hex.obj hight.obj \
    hmac.obj hrtimer.obj ida.obj idea.obj iterhash.obj kalyna.obj \
    kalynatab.obj keccak.obj keccakc.obj lea-simd.obj lea.obj luc.obj \
    mars.obj marss.obj md2.obj md4.obj md5.obj misc.obj modes.obj mqueue.obj \
    mqv.obj nbtheory.obj neon-simd.obj oaep.obj osrng.obj padlkrng.obj \
    panama.obj pkcspad.obj poly1305.obj polynomi.obj ppc-simd.obj pssr.obj \
    pubkey.obj queue.obj rabbit.obj rabin.obj randpool.obj rc2.obj rc5.obj \
    rc6.obj rdrand.obj rdtables.obj rijndael-simd.obj rijndael.obj ripemd.obj \
    rng.obj rsa.obj rw.obj safer.obj salsa.obj scrypt.obj seal.obj seed.obj \
    serpent.obj sha-simd.obj sha.obj sha3.obj shacal2-simd.obj shacal2.obj \
    shark.obj sharkbox.obj simeck-simd.obj simeck.obj simon.obj \
    simon128-simd.obj simon64-simd.obj skipjack.obj sm3.obj sm4-simd.obj \
    sm4.obj sosemanuk.obj speck.obj speck128-simd.obj speck64-simd.obj \
    square.obj squaretb.obj sse-simd.obj strciphr.obj tea.obj tftables.obj \
    threefish.obj tiger.obj tigertab.obj ttmac.obj tweetnacl.obj twofish.obj \
    vmac.obj wake.obj whrlpool.obj xtr.obj xtrcrypt.obj zdeflate.obj \
    zinflate.obj zlib.obj

TEST_SRCS = \
    test.cpp bench1.cpp bench2.cpp bench3.cpp datatest.cpp \
    dlltest.cpp fipsalgt.cpp validat0.cpp validat1.cpp validat2.cpp \
    validat3.cpp validat4.cpp validat5.cpp validat6.cpp validat7.cpp \
    validat8.cpp validat9.cpp validat10.cpp regtest1.cpp regtest2.cpp \
    regtest3.cpp regtest4.cpp

TEST_OBJS = \
    test.obj bench1.obj bench2.obj bench3.obj datatest.obj \
    dlltest.obj fipsalgt.obj validat0.obj validat1.obj validat2.obj \
    validat3.obj validat4.obj validat5.obj validat6.obj validat7.obj \
    validat8.obj validat9.obj validat10.obj regtest1.obj regtest2.obj \
    regtest3.obj regtest4.obj

CXX = cl.exe
LD = link.exe
AR = lib.exe
RM = del.exe

# C4231 is needed for VS2008 and below. Lots of noise...
CXXFLAGS = /nologo /W4 /wd4231 /wd4511 /wd4156 /D_MBCS /Zi /TP /GR /EHsc
LDFLAGS = /nologo /SUBSYSTEM:CONSOLE /DEBUG
ARFLAGS = /nologo
LDLIBS =

# Debug build.
# CXXFLAGS = $(CXXFLAGS) /DDEBUG /D_DEBUG /Oi /Oy- /Od /MTd
# Release build. Add /OPT:REF to linker
CXXFLAGS = $(CXXFLAGS) /DNDEBUG /D_NDEBUG /Oi /Oy /O2 /MT
LDFLAGS = $(LDFLAGS) /OPT:REF

# Attempt to detect when <sdkddkver.h> and <winapifamily.h> are available
#   http://stackoverflow.com/q/40577415 ?
!IF "$(WINDOWSSDKDIR)" != "" || "$(WINDOWSSDKLIBVERSION)" != ""
CXXFLAGS = $(CXXFLAGS) /FI sdkddkver.h
!ENDIF
!IF "$(WINDOWSPHONEKITDIR)" != "" || "$(UNIVERSALCRTSDKDIR)" != "" || "$(UCRTVERSION)" != ""
CXXFLAGS = $(CXXFLAGS) /FI winapifamily.h
!ELSEIF "$(PLATFORM)" == "ARM" || "$(PLATFORM)" == "arm" || "$(PLATFORM)" == "ARM64" || "$(PLATFORM)" == "arm64"
CXXFLAGS = $(CXXFLAGS) /FI winapifamily.h
!ENDIF

# Check for empty Platform and Processor
!IF "$(PLATFORM)" == ""
!IF "$(PROCESSOR_ARCHITECTURE)" == "x86"
PLATFORM = x86
!ELSEIF "$(PROCESSOR_ARCHITECTURE)" == "x64" || "$(PROCESSOR_ARCHITECTURE)" == "AMD64"
PLATFORM = x64
!ELSE
!ERROR "Unknown platform"
!ENDIF
!ENDIF

!MESSAGE
!MESSAGE ******************************
!MESSAGE Platform is $(PLATFORM)
!MESSAGE ******************************
!MESSAGE

!IF "$(PLATFORM)" == "x86" || "$(PLATFORM)" == "X86"
# CXXFLAGS = $(CXXFLAGS) /arch:SSE2
# CXXFLAGS = $(CXXFLAGS) /DWINAPI_FAMILY=WINAPI_FAMILY_DESKTOP_APP
# CXXFLAGS = $(CXXFLAGS) /DWINAPI_FAMILY=WINAPI_FAMILY_APP
AS = ml.exe
ASFLAGS = /nologo /D_M_X86 /W3 /Cx /Zi /safeseh
LIB_SRCS = $(LIB_SRCS) rdrand.cpp rdrand.asm
LIB_OBJS = $(LIB_OBJS) rdrand-x86.obj
LDFLAGS = $(LDFLAGS) /MACHINE:X86
LDLIBS = $(LDLIBS) kernel32.lib
!ENDIF

# May need $(VCINSTALLDIR)\bin\amd64\ml64.exe
!IF "$(PLATFORM)" == "x64" || "$(PLATFORM)" == "X64" || "$(PLATFORM)" == "amd64"
# CXXFLAGS = $(CXXFLAGS) /arch:AVX2
# CXXFLAGS = $(CXXFLAGS) /DWINAPI_FAMILY=WINAPI_FAMILY_DESKTOP_APP
# CXXFLAGS = $(CXXFLAGS) /DWINAPI_FAMILY=WINAPI_FAMILY_APP
AS = ml64.exe
ASFLAGS = /nologo /D_M_X64 /W3 /Cx /Zi
LIB_SRCS = $(LIB_SRCS) rdrand.cpp rdrand.asm
LIB_OBJS = $(LIB_OBJS) rdrand-x64.obj x64masm.obj x64dll.obj
LDFLAGS = $(LDFLAGS) /MACHINE:X64
LDLIBS = $(LDLIBS) kernel32.lib
!ENDIF

# We still don't know what we need for ARM64 on Windows. ARM64 and arm64 may be incorrect
!IF "$(PLATFORM)" == "ARM" || "$(PLATFORM)" == "arm" || "$(PLATFORM)" == "ARM64" || "$(PLATFORM)" == "arm64"
# CXXFLAGS = $(CXXFLAGS) /D_ARM_WINAPI_PARTITION_DESKTOP_SDK_AVAILABLE=1 /DWINAPI_FAMILY=WINAPI_FAMILY_DESKTOP_APP
CXXFLAGS = $(CXXFLAGS) /DWINAPI_FAMILY=WINAPI_FAMILY_PHONE_APP
LIB_SRCS = $(LIB_SRCS) neon-simd.cpp
LIB_OBJS = $(LIB_OBJS) neon-simd.obj
# CXXFLAGS = $(CXXFLAGS) /DWINAPI_FAMILY=WINAPI_FAMILY_APP
# LDLIBS = $(LDLIBS)
!ENDIF

all: cryptest.exe

cryptest.exe: pch.pch cryptlib.lib $(TEST_OBJS)
	$(LD) $(LDFLAGS) $(TEST_OBJS) cryptlib.lib $(LDLIBS) /out:$@

cryptlib.lib: $(LIB_OBJS)
	$(AR) $(ARFLAGS) $(LIB_OBJS) /out:$@

clean:
	$(RM) /F /Q pch.pch $(LIB_OBJS) pch.obj rdrand-x86.obj rdrand-x64.obj x64masm.obj x64dll.obj cryptlib.lib $(TEST_OBJS) cryptest.exe *.pdb

# Precompiled header
pch.pch: pch.h pch.cpp
	$(CXX) $(CXXFLAGS) /Yc"pch.h" /Fp"pch.pch" /c pch.cpp

# No precompiled headers
iterhash.obj:
	$(CXX) $(CXXFLAGS) /Y- /c iterhash.cpp
dll.obj:
	$(CXX) $(CXXFLAGS) /Y- /c dll.cpp
rdrand.obj:
	$(CXX) $(CXXFLAGS) /c rdrand.cpp

# Built for x86/x64
rdrand-x86.obj:
	$(AS) $(ASFLAGS) /Fo rdrand-x86.obj /c rdrand.asm
rdrand-x64.obj:
	$(AS) $(ASFLAGS) /Fo rdrand-x64.obj /c rdrand.asm
x64masm.obj:
	$(AS) $(ASFLAGS) /Fo x64masm.obj /c x64masm.asm
x64dll.obj:
	$(AS) $(ASFLAGS) /Fo x64dll.obj /c x64dll.asm

.cpp.obj:
	$(CXX) $(CXXFLAGS) /c $<

.asm.obj:
	$(AS) $(ASFLAGS) /c $<