The Microsoft World.

The good news, to build SSLeay for the Microsft World

Windows 3.1 DLL's
perl Configure VC-WIN16
nmake -f ms\w31dll.mak

Windows NT/95 DLL's
perl Configure VC-WIN32
nmake -f ms\ntdll.mak

Now the bad news
All builds were done using Microsofts Visual C++ 1.52c and [45].x.
If you are a borland person, you are probably going to have to help me
finish the stuff in util/pl/BC*pl

All builds were made under Windows NT - this means long filenames, so
you may have problems under Windows 3.1 but probably not under 95.

Because file pointers don't work in DLL's under Windows 3.1 (well at
least stdin/stdout don't and I don't like having to differentiate
between these and other file pointers), I now use the BIO file-pointer
module, which needs to be linked into your application.  You can either
use the memory buffer BIO for IO, or compile bss_file.c into your
application, it is in the apps directory and is just a copy of
crypto/buffer/bss_file.c with #define APPS_WIN16 added.
I have not yet automated the makefile to automatically copy it into 'out'
for a win 3.1 build....

All callbacks passed into SSLeay for Windows 3.1 need to be of type
_far _loadds.

I don't support building with the pascal calling convention.

The DLL and static builds are large memory model.

To build static libraries for NT/95 or win 3.1

perl util/mk1mf.pl VC-WIN32 > mf-stat.nt
perl util/mk1mf.pl VC-WIN16 > mf-stat.w31
for DLL's
perl util/mk1mf.pl dll VC-WIN32	> mf-dll.nt
perl util/mk1mf.pl dll VC-WIN16 > mf-dll.w31

Again you will notice that if you dont have perl, you cannot do this.

Now the next importaint issue.  Running Configure!
I have small assember code files for critical big number library operation
in crypto/bn/asm.  There is, asm code, object files and uuencode
object files.  They are
x86nt32.asm	- 32bit flat memory model assember - suitable Win32
x86w16.asm	- 16bit assember - used in the msdos build.
x86w32.asm	- 32bit assember, win 3.1 segments, used for win16 build.

If you feel compelled to build the 16bit maths routines in the windows 3.1
build,
perl Configure VC-W31-16
perl util/mk1mf.pl dll VC-W31-16 > mf-dll.w31

If you hate assember and don't want anything to do with it,
perl util/mk1mf.pl no-asm VC-WIN16 > mf-dll.w31
will work for any of the makefile generations.

There are more options to mk1mf.pl but these all leave the temporary
files in 'tmp' and the output files in 'out' by default.

The NT build is done for console mode.

The Windows 3.1 version of SSLeay uses quickwin, the interface is ugly
but it is better than nothing.  If you want ugly, try doing anything
that involves getting a password.  I decided to be ugly instead of
echoing characters.  For Windows 3.1 I would just sugest using the
msdos version of the ssleay application for command line work.
The QuickWin build is primarily for testing.

For both NT and Windows 3.1, I have not written the code so that
s_client, s_server can take input from the keyboard.  You can happily
start applications up in separate windows, watch them handshake, and then sit
there for-ever.  I have not had the time to get this working, and I've
been able to test things from a unix box to the NT box :-).
Try running ssleay s_server on the windows box
(with either -cert ../apps/server.pem -www)
and run ssleay s_time from another window.
This often stuffs up on Windows 3.1, but I'm not worried since this is
probably a problem with my demo applications, not the libraries.

After a build of one of the version of microsoft SSLeay,
'cd ms' and then run 'test'.  This should check everything out and
even does a trial run of generating certificates.
'test.bat' requires that perl be install, you be in the ms directory
(not the test directory, thats for unix so stay out :-) and that the
build output directory be ../out 

On a last note, you will probably get division by zero errors and
stuff after a build.  This is due to your own inability to follow
instructions :-).

The reasons for the problem is probably one of the following.

1)	You did not run Configure.  This is critical for windows 3.1 when
	using assember.  The values in crypto/bn/bn.h must match the
	ones requred for the assember code.  (remember that if you
	edit crypto/bn/bn.h by hand, it will be clobered the next time
	you run Configure by the contents of crypto/bn/bn.org).
	SSLeay version -o will list the compile options.
	For VC-WIN32 you need bn(64,32) or bn(32,32)
	For VC-W31-32/VC-WIN16 you need bn(32,32)
	For VC-W31-16 you need bn(32,16) or bn(16,16)
	For VC-MSDOS you need bn(32,16) or bn(16,16).

	The first number will be 2 times bigger than the second if
	BN_LLONG is defined in bn.h and the size of the second number
	depends on the 'bits' defined at the start of bn.h.  Have a
	look, it's all reasonably clear.
	If you want to start messing with 8 bit builds and things like
	that, build without the assember by re-generating a makefile
	via 'perl util/mk1mf.pl no-asm'.
2)	You tried to build under MS-DOS or Windows 3.1 using the /G3
	option.  Don't.  It is buggy (thats why you just got that
	error) and unless you want to work out which optimising flag
	to turn off, I'm not going to help you :-).  I also noticed
	that code often ran slower when compiled with /G3.
3)	Under NT/95, malloc goes stupid.  You are probably linking with
	the wrong library, there are problems if you mix the threaded
	and non-threaded libraries (due to the DLL being staticly
	linked with one and the applicaion using another.

Well hopefully thats most of the MS issues handled, see you in ssl-users :-).

eric 30-Aug-1996

SSLeay 0.6.5
For Windows 95/NT, add CRYPTO_malloc_init() to your program before any
calls to the SSLeay libraries.  This function will insert callbacks so that
the SSLeay libraries will use the same malloc(), free() and realloc() as
your application so 'problem 3)' mentioned above will go away.

There is now DES assember for Windows NT/95.  The file is
crypto/des/asm/win32.asm and replaces crypto/des/des_enc.c in the build.

There is also Blowfish assember for Windows NT/95.  The file is
crypto/bf/asm/win32.asm and replaces crypto/bf/bf_enc.c in the build.

eric 25-Jun-1997

