1*ebfedea0SLionel Sambuc 2*ebfedea0SLionel Sambuc INSTALLATION ON THE WIN32 PLATFORM 3*ebfedea0SLionel Sambuc ---------------------------------- 4*ebfedea0SLionel Sambuc 5*ebfedea0SLionel Sambuc [Instructions for building for Windows CE can be found in INSTALL.WCE] 6*ebfedea0SLionel Sambuc [Instructions for building for Win64 can be found in INSTALL.W64] 7*ebfedea0SLionel Sambuc 8*ebfedea0SLionel Sambuc Here are a few comments about building OpenSSL for Win32 environments, 9*ebfedea0SLionel Sambuc such as Windows NT and Windows 9x. It should be noted though that 10*ebfedea0SLionel Sambuc Windows 9x are not ordinarily tested. Its mention merely means that we 11*ebfedea0SLionel Sambuc attempt to maintain certain programming discipline and pay attention 12*ebfedea0SLionel Sambuc to backward compatibility issues, in other words it's kind of expected 13*ebfedea0SLionel Sambuc to work on Windows 9x, but no regression tests are actually performed. 14*ebfedea0SLionel Sambuc 15*ebfedea0SLionel Sambuc On additional note newer OpenSSL versions are compiled and linked with 16*ebfedea0SLionel Sambuc Winsock 2. This means that minimum OS requirement was elevated to NT 4 17*ebfedea0SLionel Sambuc and Windows 98 [there is Winsock 2 update for Windows 95 though]. 18*ebfedea0SLionel Sambuc 19*ebfedea0SLionel Sambuc - you need Perl for Win32. Unless you will build on Cygwin, you will need 20*ebfedea0SLionel Sambuc ActiveState Perl, available from http://www.activestate.com/ActivePerl. 21*ebfedea0SLionel Sambuc 22*ebfedea0SLionel Sambuc - one of the following C compilers: 23*ebfedea0SLionel Sambuc 24*ebfedea0SLionel Sambuc * Visual C++ 25*ebfedea0SLionel Sambuc * Borland C 26*ebfedea0SLionel Sambuc * GNU C (Cygwin or MinGW) 27*ebfedea0SLionel Sambuc 28*ebfedea0SLionel Sambuc- Netwide Assembler, a.k.a. NASM, available from http://nasm.sourceforge.net/ 29*ebfedea0SLionel Sambuc is required if you intend to utilize assembler modules. Note that NASM 30*ebfedea0SLionel Sambuc is now the only supported assembler. 31*ebfedea0SLionel Sambuc 32*ebfedea0SLionel Sambuc If you are compiling from a tarball or a Git snapshot then the Win32 files 33*ebfedea0SLionel Sambuc may well be not up to date. This may mean that some "tweaking" is required to 34*ebfedea0SLionel Sambuc get it all to work. See the trouble shooting section later on for if (when?) 35*ebfedea0SLionel Sambuc it goes wrong. 36*ebfedea0SLionel Sambuc 37*ebfedea0SLionel Sambuc Visual C++ 38*ebfedea0SLionel Sambuc ---------- 39*ebfedea0SLionel Sambuc 40*ebfedea0SLionel Sambuc If you want to compile in the assembly language routines with Visual 41*ebfedea0SLionel Sambuc C++, then you will need already mentioned Netwide Assembler binary, 42*ebfedea0SLionel Sambuc nasmw.exe or nasm.exe, to be available on your %PATH%. 43*ebfedea0SLionel Sambuc 44*ebfedea0SLionel Sambuc Firstly you should run Configure with platform VC-WIN32: 45*ebfedea0SLionel Sambuc 46*ebfedea0SLionel Sambuc > perl Configure VC-WIN32 --prefix=c:\some\openssl\dir 47*ebfedea0SLionel Sambuc 48*ebfedea0SLionel Sambuc Where the prefix argument specifies where OpenSSL will be installed to. 49*ebfedea0SLionel Sambuc 50*ebfedea0SLionel Sambuc Next you need to build the Makefiles and optionally the assembly 51*ebfedea0SLionel Sambuc language files: 52*ebfedea0SLionel Sambuc 53*ebfedea0SLionel Sambuc - If you are using NASM then run: 54*ebfedea0SLionel Sambuc 55*ebfedea0SLionel Sambuc > ms\do_nasm 56*ebfedea0SLionel Sambuc 57*ebfedea0SLionel Sambuc - If you don't want to use the assembly language files at all then run: 58*ebfedea0SLionel Sambuc 59*ebfedea0SLionel Sambuc > perl Configure VC-WIN32 no-asm --prefix=c:/some/openssl/dir 60*ebfedea0SLionel Sambuc > ms\do_ms 61*ebfedea0SLionel Sambuc 62*ebfedea0SLionel Sambuc If you get errors about things not having numbers assigned then check the 63*ebfedea0SLionel Sambuc troubleshooting section: you probably won't be able to compile it as it 64*ebfedea0SLionel Sambuc stands. 65*ebfedea0SLionel Sambuc 66*ebfedea0SLionel Sambuc Then from the VC++ environment at a prompt do: 67*ebfedea0SLionel Sambuc 68*ebfedea0SLionel Sambuc > nmake -f ms\ntdll.mak 69*ebfedea0SLionel Sambuc 70*ebfedea0SLionel Sambuc If all is well it should compile and you will have some DLLs and 71*ebfedea0SLionel Sambuc executables in out32dll. If you want to try the tests then do: 72*ebfedea0SLionel Sambuc 73*ebfedea0SLionel Sambuc > nmake -f ms\ntdll.mak test 74*ebfedea0SLionel Sambuc 75*ebfedea0SLionel Sambuc 76*ebfedea0SLionel Sambuc To install OpenSSL to the specified location do: 77*ebfedea0SLionel Sambuc 78*ebfedea0SLionel Sambuc > nmake -f ms\ntdll.mak install 79*ebfedea0SLionel Sambuc 80*ebfedea0SLionel Sambuc Tweaks: 81*ebfedea0SLionel Sambuc 82*ebfedea0SLionel Sambuc There are various changes you can make to the Win32 compile 83*ebfedea0SLionel Sambuc environment. By default the library is not compiled with debugging 84*ebfedea0SLionel Sambuc symbols. If you use the platform debug-VC-WIN32 instead of VC-WIN32 85*ebfedea0SLionel Sambuc then debugging symbols will be compiled in. 86*ebfedea0SLionel Sambuc 87*ebfedea0SLionel Sambuc By default in 1.0.0 OpenSSL will compile builtin ENGINES into the 88*ebfedea0SLionel Sambuc separate shared librariesy. If you specify the "enable-static-engine" 89*ebfedea0SLionel Sambuc option on the command line to Configure the shared library build 90*ebfedea0SLionel Sambuc (ms\ntdll.mak) will compile the engines into libeay32.dll instead. 91*ebfedea0SLionel Sambuc 92*ebfedea0SLionel Sambuc The default Win32 environment is to leave out any Windows NT specific 93*ebfedea0SLionel Sambuc features. 94*ebfedea0SLionel Sambuc 95*ebfedea0SLionel Sambuc If you want to enable the NT specific features of OpenSSL (currently 96*ebfedea0SLionel Sambuc only the logging BIO) follow the instructions above but call the batch 97*ebfedea0SLionel Sambuc file do_nt.bat instead of do_ms.bat. 98*ebfedea0SLionel Sambuc 99*ebfedea0SLionel Sambuc You can also build a static version of the library using the Makefile 100*ebfedea0SLionel Sambuc ms\nt.mak 101*ebfedea0SLionel Sambuc 102*ebfedea0SLionel Sambuc 103*ebfedea0SLionel Sambuc Borland C++ builder 5 104*ebfedea0SLionel Sambuc --------------------- 105*ebfedea0SLionel Sambuc 106*ebfedea0SLionel Sambuc * Configure for building with Borland Builder: 107*ebfedea0SLionel Sambuc > perl Configure BC-32 108*ebfedea0SLionel Sambuc 109*ebfedea0SLionel Sambuc * Create the appropriate makefile 110*ebfedea0SLionel Sambuc > ms\do_nasm 111*ebfedea0SLionel Sambuc 112*ebfedea0SLionel Sambuc * Build 113*ebfedea0SLionel Sambuc > make -f ms\bcb.mak 114*ebfedea0SLionel Sambuc 115*ebfedea0SLionel Sambuc Borland C++ builder 3 and 4 116*ebfedea0SLionel Sambuc --------------------------- 117*ebfedea0SLionel Sambuc 118*ebfedea0SLionel Sambuc * Setup PATH. First must be GNU make then bcb4/bin 119*ebfedea0SLionel Sambuc 120*ebfedea0SLionel Sambuc * Run ms\bcb4.bat 121*ebfedea0SLionel Sambuc 122*ebfedea0SLionel Sambuc * Run make: 123*ebfedea0SLionel Sambuc > make -f bcb.mak 124*ebfedea0SLionel Sambuc 125*ebfedea0SLionel Sambuc GNU C (Cygwin) 126*ebfedea0SLionel Sambuc -------------- 127*ebfedea0SLionel Sambuc 128*ebfedea0SLionel Sambuc Cygwin implements a Posix/Unix runtime system (cygwin1.dll) on top of 129*ebfedea0SLionel Sambuc Win32 subsystem and provides a bash shell and GNU tools environment. 130*ebfedea0SLionel Sambuc Consequently, a make of OpenSSL with Cygwin is virtually identical to 131*ebfedea0SLionel Sambuc Unix procedure. It is also possible to create Win32 binaries that only 132*ebfedea0SLionel Sambuc use the Microsoft C runtime system (msvcrt.dll or crtdll.dll) using 133*ebfedea0SLionel Sambuc MinGW. MinGW can be used in the Cygwin development environment or in a 134*ebfedea0SLionel Sambuc standalone setup as described in the following section. 135*ebfedea0SLionel Sambuc 136*ebfedea0SLionel Sambuc To build OpenSSL using Cygwin: 137*ebfedea0SLionel Sambuc 138*ebfedea0SLionel Sambuc * Install Cygwin (see http://cygwin.com/) 139*ebfedea0SLionel Sambuc 140*ebfedea0SLionel Sambuc * Install Perl and ensure it is in the path. Both Cygwin perl 141*ebfedea0SLionel Sambuc (5.6.1-2 or newer) and ActivePerl work. 142*ebfedea0SLionel Sambuc 143*ebfedea0SLionel Sambuc * Run the Cygwin bash shell 144*ebfedea0SLionel Sambuc 145*ebfedea0SLionel Sambuc * $ tar zxvf openssl-x.x.x.tar.gz 146*ebfedea0SLionel Sambuc $ cd openssl-x.x.x 147*ebfedea0SLionel Sambuc 148*ebfedea0SLionel Sambuc To build the Cygwin version of OpenSSL: 149*ebfedea0SLionel Sambuc 150*ebfedea0SLionel Sambuc $ ./config 151*ebfedea0SLionel Sambuc [...] 152*ebfedea0SLionel Sambuc $ make 153*ebfedea0SLionel Sambuc [...] 154*ebfedea0SLionel Sambuc $ make test 155*ebfedea0SLionel Sambuc $ make install 156*ebfedea0SLionel Sambuc 157*ebfedea0SLionel Sambuc This will create a default install in /usr/local/ssl. 158*ebfedea0SLionel Sambuc 159*ebfedea0SLionel Sambuc To build the MinGW version (native Windows) in Cygwin: 160*ebfedea0SLionel Sambuc 161*ebfedea0SLionel Sambuc $ ./Configure mingw 162*ebfedea0SLionel Sambuc [...] 163*ebfedea0SLionel Sambuc $ make 164*ebfedea0SLionel Sambuc [...] 165*ebfedea0SLionel Sambuc $ make test 166*ebfedea0SLionel Sambuc $ make install 167*ebfedea0SLionel Sambuc 168*ebfedea0SLionel Sambuc Cygwin Notes: 169*ebfedea0SLionel Sambuc 170*ebfedea0SLionel Sambuc "make test" and normal file operations may fail in directories 171*ebfedea0SLionel Sambuc mounted as text (i.e. mount -t c:\somewhere /home) due to Cygwin 172*ebfedea0SLionel Sambuc stripping of carriage returns. To avoid this ensure that a binary 173*ebfedea0SLionel Sambuc mount is used, e.g. mount -b c:\somewhere /home. 174*ebfedea0SLionel Sambuc 175*ebfedea0SLionel Sambuc "bc" is not provided in older Cygwin distribution. This causes a 176*ebfedea0SLionel Sambuc non-fatal error in "make test" but is otherwise harmless. If 177*ebfedea0SLionel Sambuc desired and needed, GNU bc can be built with Cygwin without change. 178*ebfedea0SLionel Sambuc 179*ebfedea0SLionel Sambuc GNU C (MinGW/MSYS) 180*ebfedea0SLionel Sambuc ------------- 181*ebfedea0SLionel Sambuc 182*ebfedea0SLionel Sambuc * Compiler and shell environment installation: 183*ebfedea0SLionel Sambuc 184*ebfedea0SLionel Sambuc MinGW and MSYS are available from http://www.mingw.org/, both are 185*ebfedea0SLionel Sambuc required. Run the installers and do whatever magic they say it takes 186*ebfedea0SLionel Sambuc to start MSYS bash shell with GNU tools on its PATH. 187*ebfedea0SLionel Sambuc 188*ebfedea0SLionel Sambuc N.B. Since source tar-ball can contain symbolic links, it's essential 189*ebfedea0SLionel Sambuc that you use accompanying MSYS tar to unpack the source. It will 190*ebfedea0SLionel Sambuc either handle them in one way or another or fail to extract them, 191*ebfedea0SLionel Sambuc which does the trick too. Latter means that you may safely ignore all 192*ebfedea0SLionel Sambuc "cannot create symlink" messages, as they will be "re-created" at 193*ebfedea0SLionel Sambuc configure stage by copying corresponding files. Alternative programs 194*ebfedea0SLionel Sambuc were observed to create empty files instead, which results in build 195*ebfedea0SLionel Sambuc failure. 196*ebfedea0SLionel Sambuc 197*ebfedea0SLionel Sambuc * Compile OpenSSL: 198*ebfedea0SLionel Sambuc 199*ebfedea0SLionel Sambuc $ ./config 200*ebfedea0SLionel Sambuc [...] 201*ebfedea0SLionel Sambuc $ make 202*ebfedea0SLionel Sambuc [...] 203*ebfedea0SLionel Sambuc $ make test 204*ebfedea0SLionel Sambuc 205*ebfedea0SLionel Sambuc This will create the library and binaries in root source directory 206*ebfedea0SLionel Sambuc and openssl.exe application in apps directory. 207*ebfedea0SLionel Sambuc 208*ebfedea0SLionel Sambuc It is also possible to cross-compile it on Linux by configuring 209*ebfedea0SLionel Sambuc with './Configure --cross-compile-prefix=i386-mingw32- mingw ...'. 210*ebfedea0SLionel Sambuc 'make test' is naturally not applicable then. 211*ebfedea0SLionel Sambuc 212*ebfedea0SLionel Sambuc libcrypto.a and libssl.a are the static libraries. To use the DLLs, 213*ebfedea0SLionel Sambuc link with libeay32.a and libssl32.a instead. 214*ebfedea0SLionel Sambuc 215*ebfedea0SLionel Sambuc See troubleshooting if you get error messages about functions not 216*ebfedea0SLionel Sambuc having a number assigned. 217*ebfedea0SLionel Sambuc 218*ebfedea0SLionel Sambuc Installation 219*ebfedea0SLionel Sambuc ------------ 220*ebfedea0SLionel Sambuc 221*ebfedea0SLionel Sambuc If you used the Cygwin procedure above, you have already installed and 222*ebfedea0SLionel Sambuc can skip this section. For all other procedures, there's currently no real 223*ebfedea0SLionel Sambuc installation procedure for Win32. There are, however, some suggestions: 224*ebfedea0SLionel Sambuc 225*ebfedea0SLionel Sambuc - do nothing. The include files are found in the inc32/ subdirectory, 226*ebfedea0SLionel Sambuc all binaries are found in out32dll/ or out32/ depending if you built 227*ebfedea0SLionel Sambuc dynamic or static libraries. 228*ebfedea0SLionel Sambuc 229*ebfedea0SLionel Sambuc - do as is written in INSTALL.Win32 that comes with modssl: 230*ebfedea0SLionel Sambuc 231*ebfedea0SLionel Sambuc $ md c:\openssl 232*ebfedea0SLionel Sambuc $ md c:\openssl\bin 233*ebfedea0SLionel Sambuc $ md c:\openssl\lib 234*ebfedea0SLionel Sambuc $ md c:\openssl\include 235*ebfedea0SLionel Sambuc $ md c:\openssl\include\openssl 236*ebfedea0SLionel Sambuc $ copy /b inc32\openssl\* c:\openssl\include\openssl 237*ebfedea0SLionel Sambuc $ copy /b out32dll\ssleay32.lib c:\openssl\lib 238*ebfedea0SLionel Sambuc $ copy /b out32dll\libeay32.lib c:\openssl\lib 239*ebfedea0SLionel Sambuc $ copy /b out32dll\ssleay32.dll c:\openssl\bin 240*ebfedea0SLionel Sambuc $ copy /b out32dll\libeay32.dll c:\openssl\bin 241*ebfedea0SLionel Sambuc $ copy /b out32dll\openssl.exe c:\openssl\bin 242*ebfedea0SLionel Sambuc 243*ebfedea0SLionel Sambuc Of course, you can choose another device than c:. C: is used here 244*ebfedea0SLionel Sambuc because that's usually the first (and often only) harddisk device. 245*ebfedea0SLionel Sambuc Note: in the modssl INSTALL.Win32, p: is used rather than c:. 246*ebfedea0SLionel Sambuc 247*ebfedea0SLionel Sambuc 248*ebfedea0SLionel Sambuc Troubleshooting 249*ebfedea0SLionel Sambuc --------------- 250*ebfedea0SLionel Sambuc 251*ebfedea0SLionel Sambuc Since the Win32 build is only occasionally tested it may not always compile 252*ebfedea0SLionel Sambuc cleanly. If you get an error about functions not having numbers assigned 253*ebfedea0SLionel Sambuc when you run ms\do_ms then this means the Win32 ordinal files are not up to 254*ebfedea0SLionel Sambuc date. You can do: 255*ebfedea0SLionel Sambuc 256*ebfedea0SLionel Sambuc > perl util\mkdef.pl crypto ssl update 257*ebfedea0SLionel Sambuc 258*ebfedea0SLionel Sambuc then ms\do_XXX should not give a warning any more. However the numbers that 259*ebfedea0SLionel Sambuc get assigned by this technique may not match those that eventually get 260*ebfedea0SLionel Sambuc assigned in the Git tree: so anything linked against this version of the 261*ebfedea0SLionel Sambuc library may need to be recompiled. 262*ebfedea0SLionel Sambuc 263*ebfedea0SLionel Sambuc If you get errors about unresolved symbols there are several possible 264*ebfedea0SLionel Sambuc causes. 265*ebfedea0SLionel Sambuc 266*ebfedea0SLionel Sambuc If this happens when the DLL is being linked and you have disabled some 267*ebfedea0SLionel Sambuc ciphers then it is possible the DEF file generator hasn't removed all 268*ebfedea0SLionel Sambuc the disabled symbols: the easiest solution is to edit the DEF files manually 269*ebfedea0SLionel Sambuc to delete them. The DEF files are ms\libeay32.def ms\ssleay32.def. 270*ebfedea0SLionel Sambuc 271*ebfedea0SLionel Sambuc Another cause is if you missed or ignored the errors about missing numbers 272*ebfedea0SLionel Sambuc mentioned above. 273*ebfedea0SLionel Sambuc 274*ebfedea0SLionel Sambuc If you get warnings in the code then the compilation will halt. 275*ebfedea0SLionel Sambuc 276*ebfedea0SLionel Sambuc The default Makefile for Win32 halts whenever any warnings occur. Since VC++ 277*ebfedea0SLionel Sambuc has its own ideas about warnings which don't always match up to other 278*ebfedea0SLionel Sambuc environments this can happen. The best fix is to edit the file with the 279*ebfedea0SLionel Sambuc warning in and fix it. Alternatively you can turn off the halt on warnings by 280*ebfedea0SLionel Sambuc editing the CFLAG line in the Makefile and deleting the /WX option. 281*ebfedea0SLionel Sambuc 282*ebfedea0SLionel Sambuc You might get compilation errors. Again you will have to fix these or report 283*ebfedea0SLionel Sambuc them. 284*ebfedea0SLionel Sambuc 285*ebfedea0SLionel Sambuc One final comment about compiling applications linked to the OpenSSL library. 286*ebfedea0SLionel Sambuc If you don't use the multithreaded DLL runtime library (/MD option) your 287*ebfedea0SLionel Sambuc program will almost certainly crash because malloc gets confused -- the 288*ebfedea0SLionel Sambuc OpenSSL DLLs are statically linked to one version, the application must 289*ebfedea0SLionel Sambuc not use a different one. You might be able to work around such problems 290*ebfedea0SLionel Sambuc by adding CRYPTO_malloc_init() to your program before any calls to the 291*ebfedea0SLionel Sambuc OpenSSL libraries: This tells the OpenSSL libraries to use the same 292*ebfedea0SLionel Sambuc malloc(), free() and realloc() as the application. However there are many 293*ebfedea0SLionel Sambuc standard library functions used by OpenSSL that call malloc() internally 294*ebfedea0SLionel Sambuc (e.g. fopen()), and OpenSSL cannot change these; so in general you cannot 295*ebfedea0SLionel Sambuc rely on CRYPTO_malloc_init() solving your problem, and you should 296*ebfedea0SLionel Sambuc consistently use the multithreaded library. 297*ebfedea0SLionel Sambuc 298*ebfedea0SLionel Sambuc Linking your application 299*ebfedea0SLionel Sambuc ------------------------ 300*ebfedea0SLionel Sambuc 301*ebfedea0SLionel Sambuc If you link with static OpenSSL libraries [those built with ms/nt.mak], 302*ebfedea0SLionel Sambuc then you're expected to additionally link your application with 303*ebfedea0SLionel Sambuc WS2_32.LIB, ADVAPI32.LIB, GDI32.LIB and USER32.LIB. Those developing 304*ebfedea0SLionel Sambuc non-interactive service applications might feel concerned about linking 305*ebfedea0SLionel Sambuc with the latter two, as they are justly associated with interactive 306*ebfedea0SLionel Sambuc desktop, which is not available to service processes. The toolkit is 307*ebfedea0SLionel Sambuc designed to detect in which context it's currently executed, GUI, 308*ebfedea0SLionel Sambuc console app or service, and act accordingly, namely whether or not to 309*ebfedea0SLionel Sambuc actually make GUI calls. Additionally those who wish to 310*ebfedea0SLionel Sambuc /DELAYLOAD:GDI32.DLL and /DELAYLOAD:USER32.DLL and actually keep them 311*ebfedea0SLionel Sambuc off service process should consider implementing and exporting from 312*ebfedea0SLionel Sambuc .exe image in question own _OPENSSL_isservice not relying on USER32.DLL. 313*ebfedea0SLionel Sambuc E.g., on Windows Vista and later you could: 314*ebfedea0SLionel Sambuc 315*ebfedea0SLionel Sambuc __declspec(dllexport) __cdecl BOOL _OPENSSL_isservice(void) 316*ebfedea0SLionel Sambuc { DWORD sess; 317*ebfedea0SLionel Sambuc if (ProcessIdToSessionId(GetCurrentProcessId(),&sess)) 318*ebfedea0SLionel Sambuc return sess==0; 319*ebfedea0SLionel Sambuc return FALSE; 320*ebfedea0SLionel Sambuc } 321*ebfedea0SLionel Sambuc 322*ebfedea0SLionel Sambuc If you link with OpenSSL .DLLs, then you're expected to include into 323*ebfedea0SLionel Sambuc your application code small "shim" snippet, which provides glue between 324*ebfedea0SLionel Sambuc OpenSSL BIO layer and your compiler run-time. Look up OPENSSL_Applink 325*ebfedea0SLionel Sambuc reference page for further details. 326