1# cryptest.nmake - written and placed in public domain by Jeffrey Walton. 2# Copyright assigned to the Crypto++ project. 3 4# This makefile is used for testing and building cryptlib.lib and cryptest.exe 5# under nmake. Open a Visual Studio Developer Prompt and then run 6# "nmake /f cryptest.nmake". The build procedure will reveal not so readily 7# apparent problems under Microsoft ARM and Metro UI apps. 8 9# The makefile is not intended for production use, though it may be used as a 10# starting point. For example, you can add switches like /MD and /MDd for 11# dynamic runtime linking against the Microsoft C++ Runtime libraries. If you 12# are building for Windows Phone or Windows Store, then you probably want to 13# remove /D_MBCS. The resulting cryptlib.lib may be suitable as a starting 14# point for a DLL project using Crypto++. 15 16# You must also add /DCRYPTOPP_DEBUG or /DDEBUG if you want a debug build with 17# the library's assert. The library moved from Posix NDEBUG and assert() to 18# CRYPTOPP_ASSERT at 5.6.5 due to CVE-2016-7420. CRYPTOPP_ASSERT has the 19# additional benefit of using DebugBreak(), and the program does not crash 20# while you are debugging it like would happen with Posix assert(). 21 22# There is mention of cryptopp.dll, CRYPTOPP_IMPORTS and CRYPTOPP_EXPORTS 23# below. They are for testing only. Attempting to produce a working DLL on 24# Windows fails. Too many missing symbols because cryptest.exe exercises 25# about 80% of the library, but CRYPTOPP_DLL is only used for FIPS algos. 26 27# The list of LIB_SRCS and TEST_SRCS was generated under Linux with 28# "make sources | fold -w73 -s". The list of LIB_OBJS and TEST_OBJS was 29# generated with "make sources | fold -w73 -s | sed 's|.cpp|.obj|g'". The 30# order of the first three object files are significant. See C++ Static 31# Initialization Order Fiasco on the Crypto++ wiki for details. 32 33# You are free to add and remove files to the list. For example, you can remove 34# rdrand.asm build it using NASM, and then include the NASM object file 35# rdrand_x86.obj or rdrand_x64.obj. 36 37########################################################################################### 38 39# To test debug builds, use the following CXXFLAGS: 40# - /DDEBUG /D_DEBUG /Oi /Oy- /Od 41# To test release builds, use the following CXXFLAGS: 42# - /DNDEBUG /D_NDEBUG /Oi /Oy /O2 43# To test with static C++ runtime linking, use the following CXXFLAGS: 44# - /MT (release) or /MTd (debug) 45# To test with dynamic C++ runtime linking, use the following CXXFLAGS: 46# - /MD (release) or /MDd (debug) 47# To test Desktop app, use the following CXXFLAGS: 48# - /DWINAPI_FAMILY=WINAPI_FAMILY_DESKTOP_APP 49# To test Windows Store app, use the following CXXFLAGS: 50# - /DWINAPI_FAMILY=WINAPI_FAMILY_APP 51# To test Windows Phone, use the following CXXFLAGS: 52# - /DWINAPI_FAMILY=WINAPI_FAMILY_PHONE_APP 53# To test Surface RT (ARM tablet), use the following CXXFLAGS: 54# - /D_ARM_WINAPI_PARTITION_DESKTOP_SDK_AVAILABLE=1 /DWINAPI_FAMILY=WINAPI_FAMILY_DESKTOP_APP 55 56########################################################################################### 57 58LIB_SRCS = \ 59 cryptlib.cpp cpu.cpp integer.cpp 3way.cpp adler32.cpp algebra.cpp \ 60 algparam.cpp allocate.cpp arc4.cpp aria.cpp aria_simd.cpp ariatab.cpp \ 61 asn.cpp authenc.cpp base32.cpp base64.cpp basecode.cpp bfinit.cpp \ 62 blake2.cpp blake2b_simd.cpp blake2s_simd.cpp blowfish.cpp blumshub.cpp \ 63 camellia.cpp cast.cpp casts.cpp cbcmac.cpp ccm.cpp chacha.cpp \ 64 chacha_avx.cpp chacha_simd.cpp chachapoly.cpp cham.cpp cham_simd.cpp \ 65 channels.cpp cmac.cpp crc.cpp crc_simd.cpp darn.cpp default.cpp des.cpp \ 66 dessp.cpp dh.cpp dh2.cpp dll.cpp donna_32.cpp donna_64.cpp donna_sse.cpp \ 67 dsa.cpp eax.cpp ec2n.cpp eccrypto.cpp ecp.cpp elgamal.cpp emsa2.cpp \ 68 eprecomp.cpp esign.cpp files.cpp filters.cpp fips140.cpp fipstest.cpp \ 69 gcm.cpp gcm_simd.cpp gf256.cpp gf2_32.cpp gf2n.cpp gf2n_simd.cpp \ 70 gfpcrypt.cpp gost.cpp gzip.cpp hc128.cpp hc256.cpp hex.cpp hight.cpp \ 71 hmac.cpp hrtimer.cpp ida.cpp idea.cpp iterhash.cpp kalyna.cpp \ 72 kalynatab.cpp keccak.cpp keccak_core.cpp keccak_simd.cpp lea.cpp \ 73 lea_simd.cpp lsh256.cpp lsh256_avx.cpp lsh256_sse.cpp lsh512.cpp \ 74 lsh512_avx.cpp lsh512_sse.cpp luc.cpp mars.cpp marss.cpp md2.cpp md4.cpp \ 75 md5.cpp misc.cpp modes.cpp mqueue.cpp mqv.cpp nbtheory.cpp oaep.cpp \ 76 osrng.cpp padlkrng.cpp panama.cpp pkcspad.cpp poly1305.cpp polynomi.cpp \ 77 pssr.cpp pubkey.cpp queue.cpp rabbit.cpp rabin.cpp randpool.cpp rc2.cpp \ 78 rc5.cpp rc6.cpp rdrand.cpp rdtables.cpp rijndael.cpp rijndael_simd.cpp \ 79 ripemd.cpp rng.cpp rsa.cpp rw.cpp safer.cpp salsa.cpp scrypt.cpp \ 80 seal.cpp seed.cpp serpent.cpp sha.cpp sha3.cpp sha_simd.cpp shacal2.cpp \ 81 shacal2_simd.cpp shake.cpp shark.cpp sharkbox.cpp simeck.cpp simon.cpp \ 82 simon128_simd.cpp skipjack.cpp sm3.cpp sm4.cpp sm4_simd.cpp \ 83 sosemanuk.cpp speck.cpp speck128_simd.cpp square.cpp squaretb.cpp \ 84 sse_simd.cpp strciphr.cpp tea.cpp tftables.cpp threefish.cpp tiger.cpp \ 85 tigertab.cpp ttmac.cpp tweetnacl.cpp twofish.cpp vmac.cpp wake.cpp \ 86 whrlpool.cpp xed25519.cpp xtr.cpp xtrcrypt.cpp xts.cpp zdeflate.cpp \ 87 zinflate.cpp zlib.cpp 88 89LIB_OBJS = \ 90 cryptlib.obj cpu.obj integer.obj 3way.obj adler32.obj algebra.obj \ 91 algparam.obj allocate.obj arc4.obj aria.obj aria_simd.obj ariatab.obj \ 92 asn.obj authenc.obj base32.obj base64.obj basecode.obj bfinit.obj \ 93 blake2.obj blake2b_simd.obj blake2s_simd.obj blowfish.obj blumshub.obj \ 94 camellia.obj cast.obj casts.obj cbcmac.obj ccm.obj chacha.obj \ 95 chacha_avx.obj chacha_simd.obj chachapoly.obj cham.obj cham_simd.obj \ 96 channels.obj cmac.obj crc.obj crc_simd.obj darn.obj default.obj des.obj \ 97 dessp.obj dh.obj dh2.obj dll.obj donna_32.obj donna_64.obj donna_sse.obj \ 98 dsa.obj eax.obj ec2n.obj eccrypto.obj ecp.obj elgamal.obj emsa2.obj \ 99 eprecomp.obj esign.obj files.obj filters.obj fips140.obj fipstest.obj \ 100 gcm.obj gcm_simd.obj gf256.obj gf2_32.obj gf2n.obj gf2n_simd.obj \ 101 gfpcrypt.obj gost.obj gzip.obj hc128.obj hc256.obj hex.obj hight.obj \ 102 hmac.obj hrtimer.obj ida.obj idea.obj iterhash.obj kalyna.obj \ 103 kalynatab.obj keccak.obj keccak_core.obj keccak_simd.obj lea.obj \ 104 lea_simd.obj lsh256.obj lsh256_avx.obj lsh256_sse.obj lsh512.obj \ 105 lsh512_avx.obj lsh512_sse.obj luc.obj mars.obj marss.obj md2.obj md4.obj \ 106 md5.obj misc.obj modes.obj mqueue.obj mqv.obj nbtheory.obj oaep.obj \ 107 osrng.obj padlkrng.obj panama.obj pkcspad.obj poly1305.obj polynomi.obj \ 108 pssr.obj pubkey.obj queue.obj rabbit.obj rabin.obj randpool.obj rc2.obj \ 109 rc5.obj rc6.obj rdrand.obj rdtables.obj rijndael.obj rijndael_simd.obj \ 110 ripemd.obj rng.obj rsa.obj rw.obj safer.obj salsa.obj scrypt.obj \ 111 seal.obj seed.obj serpent.obj sha.obj sha3.obj sha_simd.obj shacal2.obj \ 112 shacal2_simd.obj shake.obj shark.obj sharkbox.obj simeck.obj simon.obj \ 113 simon128_simd.obj skipjack.obj sm3.obj sm4.obj sm4_simd.obj \ 114 sosemanuk.obj speck.obj speck128_simd.obj square.obj squaretb.obj \ 115 sse_simd.obj strciphr.obj tea.obj tftables.obj threefish.obj tiger.obj \ 116 tigertab.obj ttmac.obj tweetnacl.obj twofish.obj vmac.obj wake.obj \ 117 whrlpool.obj xed25519.obj xtr.obj xtrcrypt.obj xts.obj zdeflate.obj \ 118 zinflate.obj zlib.obj 119 120ASM_OBJS = \ 121 rdrand-x86.obj rdrand-x64.obj rdseed-x86.obj rdseed-x64.obj x64masm.obj x64dll.obj 122 123TEST_SRCS = \ 124 test.cpp bench1.cpp bench2.cpp bench3.cpp datatest.cpp \ 125 dlltest.cpp fipsalgt.cpp validat0.cpp validat1.cpp validat2.cpp \ 126 validat3.cpp validat4.cpp validat5.cpp validat6.cpp validat7.cpp \ 127 validat8.cpp validat9.cpp validat10.cpp regtest1.cpp regtest2.cpp \ 128 regtest3.cpp regtest4.cpp 129 130TEST_OBJS = \ 131 test.obj bench1.obj bench2.obj bench3.obj datatest.obj \ 132 dlltest.obj fipsalgt.obj validat0.obj validat1.obj validat2.obj \ 133 validat3.obj validat4.obj validat5.obj validat6.obj validat7.obj \ 134 validat8.obj validat9.obj validat10.obj regtest1.obj regtest2.obj \ 135 regtest3.obj regtest4.obj 136 137CXX = cl.exe 138LD = link.exe 139AR = lib.exe 140RM = del 141RMDIR = rd 142 143# We may misdetect the environment on VS2005 or so. Uncomment as 144# needed to match the Developer Prompt environment. 145# PLATFORM = x86 146# PLATFORM = x64 147# PLATFORM = arm 148# PLATFORM = arm64 149 150# C4231 is needed for VS2008 and below. Lots of noise... 151CXXFLAGS = /nologo /W4 /wd4231 /wd4511 /wd4156 /D_MBCS /Zi /TP /GR /EHsc 152LDFLAGS = /nologo /SUBSYSTEM:CONSOLE /DEBUG 153ARFLAGS = /nologo 154LDLIBS = 155 156# Compiler debug build. 157# CXXFLAGS = $(CXXFLAGS) /DDEBUG /D_DEBUG /Oi /Oy- /Od /MTd 158# Compiler release build. 159CXXFLAGS = $(CXXFLAGS) /DNDEBUG /D_NDEBUG /Oi /Oy /O2 /MT 160# Linker debug build. 161# LDFLAGS = $(LDFLAGS) /DEBUG 162# Linker release build. 163LDFLAGS = $(LDFLAGS) /DEBUG /OPT:REF 164 165# Attempt to detect when <sdkddkver.h> and <winapifamily.h> are available 166# http://stackoverflow.com/q/40577415 ? 167!IF "$(WINDOWSSDKDIR)" != "" || "$(WINDOWSSDKLIBVERSION)" != "" 168CXXFLAGS = $(CXXFLAGS) /FI sdkddkver.h 169!ENDIF 170!IF "$(WINDOWSPHONEKITDIR)" != "" || "$(UNIVERSALCRTSDKDIR)" != "" || "$(UCRTVERSION)" != "" 171CXXFLAGS = $(CXXFLAGS) /FI winapifamily.h 172!ELSEIF "$(PLATFORM)" == "ARM" || "$(PLATFORM)" == "arm" || "$(PLATFORM)" == "ARM64" || "$(PLATFORM)" == "arm64" 173CXXFLAGS = $(CXXFLAGS) /FI winapifamily.h 174!ENDIF 175 176# Check for empty Platform and Processor 177!IF "$(PLATFORM)" == "" 178!IF "$(PROCESSOR_ARCHITECTURE)" == "x86" 179PLATFORM = x86 180!ELSEIF "$(PROCESSOR_ARCHITECTURE)" == "x64" || "$(PROCESSOR_ARCHITECTURE)" == "AMD64" 181PLATFORM = x64 182!ELSE 183!ERROR "Unknown platform" 184!ENDIF 185!ENDIF 186 187!MESSAGE 188!MESSAGE ****************************** 189!MESSAGE Platform is $(PLATFORM) 190!MESSAGE ****************************** 191!MESSAGE 192 193!IF "$(PLATFORM)" == "x86" || "$(PLATFORM)" == "X86" 194# CXXFLAGS = $(CXXFLAGS) /arch:SSE2 195# CXXFLAGS = $(CXXFLAGS) /DWINAPI_FAMILY=WINAPI_FAMILY_DESKTOP_APP 196# CXXFLAGS = $(CXXFLAGS) /DWINAPI_FAMILY=WINAPI_FAMILY_APP 197AS = ml.exe 198ASFLAGS = /nologo /D_M_X86 /W3 /Cx /Zi /safeseh 199LIB_SRCS = $(LIB_SRCS) rdrand.cpp rdrand.asm rdseed.asm 200LIB_OBJS = $(LIB_OBJS) rdrand-x86.obj rdseed-x86.obj 201LDFLAGS = $(LDFLAGS) /MACHINE:X86 202LDLIBS = $(LDLIBS) kernel32.lib 203RDRAND_OBJ = rdrand-x86.obj 204RDSEED_OBJ = rdseed-x86.obj 205!ENDIF 206 207# May need $(VCINSTALLDIR)\bin\amd64\ml64.exe 208!IF "$(PLATFORM)" == "x64" || "$(PLATFORM)" == "X64" || "$(PLATFORM)" == "amd64" 209# CXXFLAGS = $(CXXFLAGS) /arch:AVX2 210# CXXFLAGS = $(CXXFLAGS) /DWINAPI_FAMILY=WINAPI_FAMILY_DESKTOP_APP 211# CXXFLAGS = $(CXXFLAGS) /DWINAPI_FAMILY=WINAPI_FAMILY_APP 212AS = ml64.exe 213ASFLAGS = /nologo /D_M_X64 /W3 /Cx /Zi 214LIB_SRCS = $(LIB_SRCS) rdrand.cpp rdrand.asm rdseed.asm 215LIB_OBJS = $(LIB_OBJS) rdrand-x64.obj rdseed-x64.obj x64masm.obj x64dll.obj 216LDFLAGS = $(LDFLAGS) /MACHINE:X64 217LDLIBS = $(LDLIBS) kernel32.lib 218RDRAND_OBJ = rdrand-x64.obj 219RDSEED_OBJ = rdseed-x64.obj 220!ENDIF 221 222!IF "$(PLATFORM)" == "ARM" || "$(PLATFORM)" == "arm" || "$(PLATFORM)" == "ARM64" || "$(PLATFORM)" == "arm64" 223# CXXFLAGS = $(CXXFLAGS) /D_ARM_WINAPI_PARTITION_DESKTOP_SDK_AVAILABLE=1 /DWINAPI_FAMILY=WINAPI_FAMILY_DESKTOP_APP 224CXXFLAGS = $(CXXFLAGS) /DWINAPI_FAMILY=WINAPI_FAMILY_PHONE_APP 225LIB_SRCS = $(LIB_SRCS) neon_simd.cpp 226LIB_OBJS = $(LIB_OBJS) neon_simd.obj 227# CXXFLAGS = $(CXXFLAGS) /DWINAPI_FAMILY=WINAPI_FAMILY_APP 228# LDLIBS = $(LDLIBS) 229!ENDIF 230 231all: cryptest.exe 232 233# For testing cryptopp.dll and CRYPTOPP_IMPORTS 234#cryptest.exe: pch.pch cryptopp.lib $(TEST_OBJS) 235# $(LD) $(LDFLAGS) $(TEST_OBJS) cryptopp.lib $(LDLIBS) /out:$@ 236 237cryptest.exe: pch.pch cryptlib.lib $(TEST_OBJS) 238 $(LD) $(LDFLAGS) $(TEST_OBJS) cryptlib.lib $(LDLIBS) /out:$@ 239 240cryptlib.lib: $(LIB_OBJS) 241 $(AR) $(ARFLAGS) $(LIB_OBJS) /out:$@ 242 243cryptopp.dump: cryptlib.lib 244 dumpbin.exe /LINKERMEMBER cryptlib.lib /OUT:$@ 245 246cryptopp.map: $(LIB_OBJS) 247 $(LD) $(LDFLAGS) /DLL /MAP /MAPINFO:EXPORTS $(LIB_OBJS) 248 mv cryptlib.map cryptopp.map 249 250cryptopp.def: cryptopp.dump 251 dump2def.exe cryptopp.dump cryptopp.def 252 253# LD produces 3 output artifacts for cryptopp.dll 254cryptopp.dll cryptopp.lib cryptopp.exp: $(LIB_OBJS) cryptopp.def 255 $(LD) $(LDFLAGS) /DLL /DEF:cryptopp.def /IGNORE:4102 $(LIB_OBJS) $(LDLIBS) /out:cryptopp.dll 256 257clean :: 258 $(RM) /F /Q cryptest.exe cryptest.lib cryptest.exp pch.pch 2>nul 259clean :: 260 $(RM) /F /Q cryptlib.lib cryptlib.exp cryptlib.dll 2>nul 261clean :: 262 $(RM) /F /Q cryptopp.dll cryptopp.lib cryptopp.exp cryptopp.def 2>nul 263clean :: 264 $(RM) /F /Q pch.obj $(LIB_OBJS) $(ASM_OBJS) $(TEST_OBJS) *.pdb 2>nul 265 266distclean :: clean 267!IF EXIST ("$(USERNAME).sdf") 268 attrib -r -a -s -h "$(USERNAME).sdf" 2>nul 269 $(RM) /F /Q "$(USERNAME).sdf" 2>nul 270!ENDIF 271!IF EXIST ("$(USERNAME).suo") 272 attrib -r -a -s -h $(USERNAME).suo" 2>nul 273 $(RM) /F /Q $(USERNAME).suo" 2>nul 274!ENDIF 275!IF EXIST (Win32\) 276 $(RMDIR) Win32\ /q /s 2>nul 277!ENDIF 278!IF EXIST (x64\) 279 $(RMDIR) x64\ /q /s 2>nul 280!ENDIF 281!IF EXIST (ipch\) 282 $(RMDIR) ipch\ /q /s 2>nul 283!ENDIF 284 285# Precompiled header 286pch.pch: pch.h pch.cpp 287 $(CXX) $(CXXFLAGS) /Yc"pch.h" /Fp"pch.pch" /c pch.cpp 288 289# No precompiled headers 290iterhash.obj: iterhash.h iterhash.cpp 291 $(CXX) $(CXXFLAGS) /Y- /c iterhash.cpp 292dll.obj: dll.h dll.cpp 293 $(CXX) $(CXXFLAGS) /Y- /c dll.cpp 294rdrand.obj: rdrand.h rdrand.cpp 295 $(CXX) $(CXXFLAGS) /c rdrand.cpp 296 297# Built for x86/x64 298rdrand-x86.obj: rdrand.asm 299 $(AS) $(ASFLAGS) /Fo rdrand-x86.obj /c rdrand.asm 300rdrand-x64.obj: rdrand.asm 301 $(AS) $(ASFLAGS) /Fo rdrand-x64.obj /c rdrand.asm 302rdseed-x86.obj: rdseed.asm 303 $(AS) $(ASFLAGS) /Fo rdseed-x86.obj /c rdseed.asm 304rdseed-x64.obj: rdseed.asm 305 $(AS) $(ASFLAGS) /Fo rdseed-x64.obj /c rdseed.asm 306x64masm.obj: x64masm.asm 307 $(AS) $(ASFLAGS) /Fo x64masm.obj /c x64masm.asm 308x64dll.obj: x64dll.asm 309 $(AS) $(ASFLAGS) /Fo x64dll.obj /c x64dll.asm 310 311# For testing cryptopp.dll and CRYPTOPP_IMPORTS 312#CXXFLAGS_IMPORTS = /wd4275 /wd4251 /DCRYPTOPP_IMPORTS 313#test.obj: 314# $(CXX) $(CXXFLAGS) $(CXXFLAGS_IMPORTS) /c $? 315#datatest.obj: 316# $(CXX) $(CXXFLAGS) $(CXXFLAGS_IMPORTS) /c $? 317#fipstest.obj: 318# $(CXX) $(CXXFLAGS) $(CXXFLAGS_IMPORTS) /c $? 319#bench1.obj: 320# $(CXX) $(CXXFLAGS) $(CXXFLAGS_IMPORTS) /c $? 321#bench2.obj: 322# $(CXX) $(CXXFLAGS) $(CXXFLAGS_IMPORTS) /c $? 323#bench3.obj: 324# $(CXX) $(CXXFLAGS) $(CXXFLAGS_IMPORTS) /c $? 325#regtest1.obj: 326# $(CXX) $(CXXFLAGS) $(CXXFLAGS_IMPORTS) /c $? 327#regtest2.obj: 328# $(CXX) $(CXXFLAGS) $(CXXFLAGS_IMPORTS) /c $? 329#regtest3.obj: 330# $(CXX) $(CXXFLAGS) $(CXXFLAGS_IMPORTS) /c $? 331#regtest4.obj: 332# $(CXX) $(CXXFLAGS) $(CXXFLAGS_IMPORTS) /c $? 333#validat1.obj: 334# $(CXX) $(CXXFLAGS) $(CXXFLAGS_IMPORTS) /c $? 335#validat2.obj: 336# $(CXX) $(CXXFLAGS) $(CXXFLAGS_IMPORTS) /c $? 337#validat3.obj: 338# $(CXX) $(CXXFLAGS) $(CXXFLAGS_IMPORTS) /c $? 339#validat4.obj: 340# $(CXX) $(CXXFLAGS) $(CXXFLAGS_IMPORTS) /c $? 341#validat5.obj: 342# $(CXX) $(CXXFLAGS) $(CXXFLAGS_IMPORTS) /c $? 343#validat6.obj: 344# $(CXX) $(CXXFLAGS) $(CXXFLAGS_IMPORTS) /c $? 345#validat7.obj: 346# $(CXX) $(CXXFLAGS) $(CXXFLAGS_IMPORTS) /c $? 347#validat8.obj: 348# $(CXX) $(CXXFLAGS) $(CXXFLAGS_IMPORTS) /c $? 349#validat9.obj: 350# $(CXX) $(CXXFLAGS) $(CXXFLAGS_IMPORTS) /c $? 351#validat10.obj: 352# $(CXX) $(CXXFLAGS) $(CXXFLAGS_IMPORTS) /c $? 353 354# For testing cryptopp.dll and CRYPTOPP_EXPORTS 355#CXXFLAGS_EXPORTS = /wd4275 /wd4251 /DCXXFLAGS_EXPORTS 356#.cpp.obj: 357# $(CXX) $(CXXFLAGS) $(CXXFLAGS_EXPORTS) /c $< 358 359.cpp.obj: 360 $(CXX) $(CXXFLAGS) /c $< 361 362.asm.obj: 363 $(AS) $(ASFLAGS) /c $< 364