summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xConfigure18
-rw-r--r--INSTALL6
-rw-r--r--INSTALL.NW437
-rw-r--r--Netware/build.bat204
-rw-r--r--Netware/cpy_tests.bat112
-rw-r--r--Netware/do_tests.pl585
-rw-r--r--Netware/globals.txt254
-rw-r--r--Netware/readme.txt19
-rw-r--r--Netware/set_env.bat90
-rw-r--r--apps/apps.c13
-rw-r--r--apps/apps.h2
-rw-r--r--apps/ca.c2
-rw-r--r--apps/s_apps.h3
-rw-r--r--apps/s_client.c8
-rw-r--r--apps/s_server.c16
-rw-r--r--apps/s_socket.c38
-rw-r--r--apps/s_time.c18
-rw-r--r--apps/speed.c43
-rw-r--r--crypto/bf/bf_opts.c3
-rw-r--r--crypto/bf/bfspeed.c3
-rw-r--r--crypto/bf/bftest.c3
-rw-r--r--crypto/bio/b_sock.c33
-rw-r--r--crypto/bio/bss_file.c15
-rw-r--r--crypto/bio/bss_log.c2
-rw-r--r--crypto/bio/bss_sock.c2
-rw-r--r--crypto/bn/exptest.c3
-rw-r--r--crypto/buffer/buffer.h3
-rw-r--r--crypto/cast/cast_spd.c3
-rw-r--r--crypto/cast/castopts.c3
-rw-r--r--crypto/des/des_opts.c4
-rw-r--r--crypto/des/destest.c3
-rw-r--r--crypto/des/speed.c4
-rw-r--r--crypto/dh/dhtest.c6
-rw-r--r--crypto/dsa/dsatest.c3
-rw-r--r--crypto/idea/idea_spd.c3
-rw-r--r--crypto/idea/ideatest.c3
-rw-r--r--crypto/md2/md2test.c3
-rw-r--r--crypto/md32_common.h2
-rw-r--r--crypto/md5/md5test.c4
-rw-r--r--crypto/mdc2/mdc2test.c3
-rw-r--r--crypto/perlasm/x86asm.pl8
-rw-r--r--crypto/perlasm/x86mwasm_nw.pl363
-rw-r--r--crypto/perlasm/x86nasm_nw.pl364
-rw-r--r--crypto/rand/Makefile.ssl4
-rw-r--r--crypto/rand/rand_egd.c2
-rw-r--r--crypto/rand/rand_nw.c171
-rw-r--r--crypto/rand/rand_unix.c3
-rw-r--r--crypto/rand/randtest.c3
-rw-r--r--crypto/rc2/rc2speed.c3
-rw-r--r--crypto/rc2/rc2test.c3
-rw-r--r--crypto/rc4/rc4speed.c3
-rw-r--r--crypto/rc4/rc4test.c3
-rw-r--r--crypto/rc5/rc5speed.c3
-rw-r--r--crypto/rsa/rsa_test.c3
-rw-r--r--crypto/sha/sha1test.c4
-rw-r--r--crypto/sha/shatest.c5
-rw-r--r--crypto/threads/mttest.c115
-rw-r--r--crypto/threads/netware.bat79
-rw-r--r--crypto/tmdiff.c16
-rw-r--r--crypto/ui/ui_openssl.c10
-rw-r--r--crypto/uid.c2
-rw-r--r--e_os.h36
-rw-r--r--e_os2.h6
-rw-r--r--engines/e_aep.c4
-rw-r--r--ssl/ssltest.c3
-rwxr-xr-xutil/mk1mf.pl11
-rw-r--r--util/pl/netware.pl327
67 files changed, 3490 insertions, 43 deletions
diff --git a/Configure b/Configure
index bc7d5d4891..fa96c762f7 100755
--- a/Configure
+++ b/Configure
@@ -519,6 +519,12 @@ my %table=(
"Cygwin", "gcc:-DTERMIOS -DL_ENDIAN -fomit-frame-pointer -O3 -march=i486 -Wall:::CYGWIN32::BN_LLONG ${x86_gcc_des} ${x86_gcc_opts}:${x86_out_asm}:win32:cygwin-shared:::.dll",
"debug-Cygwin", "gcc:-DTERMIOS -DL_ENDIAN -march=i486 -Wall -DBN_DEBUG -DREF_CHECK -DCONF_DEBUG -DBN_CTX_DEBUG -DCRYPTO_MDEBUG -DOPENSSL_NO_ASM -g -Wformat -Wshadow -Wmissing-prototypes -Wmissing-declarations -Werror:::CYGWIN32::::win32:cygwin-shared:::.dll",
+# NetWare from David Ward (dsward@novell.com) - requires MetroWerks NLM development tools
+# netware-clib => legacy CLib c-runtime support
+"netware-clib", "mwccnlm:::::${x86_gcc_opts}:::",
+# netware-libc => LibC/NKS support
+"netware-libc", "mwccnlm:::::BN_LLONG ${x86_gcc_opts}:::",
+
# DJGPP
"DJGPP", "gcc:-I/dev/env/WATT_ROOT/inc -DTERMIOS -DL_ENDIAN -fomit-frame-pointer -O2 -Wall:::MSDOS:-L/dev/env/WATT_ROOT/lib -lwatt:BN_LLONG ${x86_gcc_des} ${x86_gcc_opts}::::::::::",
@@ -570,8 +576,8 @@ my %table=(
);
-my @WinTargets=qw(VC-NT VC-CE VC-WIN32 VC-WIN16 VC-W31-16 VC-W31-32 VC-MSDOS
- BC-32 BC-16 Mingw32 OS2-EMX);
+my @MK1MF_Builds=qw(VC-NT VC-CE VC-WIN32 VC-WIN16 VC-W31-16 VC-W31-32 VC-MSDOS
+ BC-32 BC-16 Mingw32 OS2-EMX netware-clib netware-libc);
my $idx = 0;
my $idx_cc = $idx++;
@@ -940,7 +946,7 @@ print "Configuring for $target\n";
&usage if (!defined($table{$target}));
-my $IsWindows=scalar grep /^$target$/,@WinTargets;
+my $IsMK1MF=scalar grep /^$target$/,@MK1MF_Builds;
$exe_ext=".exe" if ($target eq "Cygwin");
$exe_ext=".exe" if ($target eq "DJGPP");
@@ -954,7 +960,7 @@ $openssldir=$prefix . "/ssl" if $openssldir eq "";
$openssldir=$prefix . "/" . $openssldir if $openssldir !~ /(^\/|^[a-zA-Z]:[\\\/])/;
-print "IsWindows=$IsWindows\n";
+print "IsMK1MF=$IsMK1MF\n";
my @fields = split(/\s*:\s*/,$table{$target} . ":" x 30 , -1);
my $cc = $fields[$idx_cc];
@@ -1502,7 +1508,7 @@ print "RC2 uses u$type[$rc2_int]\n" if $rc2_int != $def_int;
print "BF_PTR used\n" if $bf_ptr == 1;
print "BF_PTR2 used\n" if $bf_ptr == 2;
-if($IsWindows) {
+if($IsMK1MF) {
open (OUT,">crypto/buildinf.h") || die "Can't open buildinf.h";
printf OUT <<EOF;
#ifndef MK1MF_BUILD
@@ -1544,7 +1550,7 @@ EOF
}
# create the ms/version32.rc file if needed
-if ($IsWindows) {
+if ($IsMK1MF) {
my ($v1, $v2, $v3, $v4);
if ($version_num =~ /(^[0-9a-f]{1})([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})/i) {
$v1=hex $1;
diff --git a/INSTALL b/INSTALL
index 1c3f3c3fe9..1a1628f19b 100644
--- a/INSTALL
+++ b/INSTALL
@@ -2,8 +2,10 @@
INSTALLATION ON THE UNIX PLATFORM
---------------------------------
- [Installation on DOS (with djgpp), Windows, OpenVMS and MacOS (before MacOS X)
- is described in INSTALL.DJGPP, INSTALL.W32, INSTALL.VMS and INSTALL.MacOS.
+ [Installation on DOS (with djgpp), Windows, OpenVMS, MacOS (before MacOS X)
+ and NetWare is described in INSTALL.DJGPP, INSTALL.W32, INSTALL.VMS,
+ INSTALL.MacOS and INSTALL.NW.
+
This document describes installation on operating systems in the Unix
family.]
diff --git a/INSTALL.NW b/INSTALL.NW
new file mode 100644
index 0000000000..22718f774b
--- /dev/null
+++ b/INSTALL.NW
@@ -0,0 +1,437 @@
+
+INSTALLATION ON THE NETWARE PLATFORM
+------------------------------------
+
+Notes about building OpenSSL for NetWare.
+
+
+BUILD PLATFORM:
+---------------
+The build scripts (batch files, perl scripts, etc) have been developed and
+tested on W2K. The scripts should run fine on other Windows
+platforms (NT, Win9x, WinXP) but they haven't been tested. They may require
+some modifications.
+
+
+Supported NetWare Platforms - NetWare 5.x, NetWare 6.x:
+------------------------------------------
+OpenSSL uses the WinSock interfaces introduced in NetWare 5. Therefore,
+previous versions of NetWare, 4.x and 3.x, are not supported.
+
+On NetWare there are two c-runtime libraries. There is the legacy CLIB
+interfaces and the newer LibC interfaces. Being ANSI-C libraries, the
+functionality in CLIB and LibC is similar but the LibC interfaces are built
+using Novell Kernal Services (NKS) which is designed to leverage
+multi-processor environments.
+
+The NetWare port of OpenSSL can configured to build using CLIB or LibC. The
+CLIB build was developed and tested using NetWare 5.0 sp6.0a. The LibC
+build was developed and tested using the NetWare 6.0 FCS.
+
+The necessary LibC functionality ships with NetWare 6. However, earlier
+NetWare 5.x versions will require updates in order to run the OpenSSL LibC
+build.
+
+
+REQUIRED TOOLS:
+---------------
+Based upon the configuration and build options used, some or all of the
+following tools may be required:
+
+
+* Perl for Win32 - required (http://www.activestate.com/ActivePerl)
+ Used to run the various perl scripts on the build platform.
+
+
+* Perl 5.8.0 for NetWare v3.20 (or later) - required
+ (http://developer.novell.com) Used to run the test script on NetWare
+ after building.
+
+
+* Metrowerks CodeWarrior PDK 2.1 (or later) for NetWare - required:
+ Provides command line tools used for building.
+
+ Tools:
+ mwccnlm.exe - C/C++ Compiler for NetWare
+ mwldnlm.exe - Linker for NetWare
+ mwasmnlm.exe - x86 assembler for NetWare (if using assembly option)
+
+
+* Assemblers - optional:
+ If you intend to build using the assembly options you will need an
+ assembler. Work has been completed to support two assemblers, Metrowerks
+ and NASM. However, during development, a bug was found in the Metrowerks
+ assembler which generates incorrect code. Until this problem is fixed,
+ the Metrowerks assembler cannot be used.
+
+ mwasmnlm.exe - Metrowerks x86 assembler - part of CodeWarrior tools.
+ (version 2.2 Built Aug 23, 1999 - not useable due to code
+ generation bug)
+
+ nasmw.exe - Netwide Assembler NASM
+ version 0.98 was used in development and testing
+
+* Make Tool - required:
+ In order to build you will need a make tool. Two make tools are
+ supported, GNU make (gmake.exe) or Microsoft nmake.exe.
+
+ gmake.exe - GNU make for Windows (version 3.75 used for development)
+ http://www.gnu.org/software/make/make.html
+
+ nmake.exe - Microsoft make (Version 6.00.8168.0 used for development)
+
+
+* Novell Developer Kit (NDK) - required: (http://developer.novell.com)
+
+ CLIB - BUILDS:
+
+ WinSock2 Developer Components for NetWare:
+ For initial development, the October 27, 2000 version was used.
+ However, future versions should also work.
+
+ NOTE: The WinSock2 components include headers & import files for
+ NetWare, but you will also need the winsock2.h and supporting
+ headers (pshpack4.h, poppack.h, qos.h) delivered in the
+ Microsoft SDK. Note: The winsock2.h support headers may change
+ with various versions of winsock2.h. Check the dependencies
+ section on the NDK WinSock2 download page for the latest
+ information on dependencies.
+
+
+ NLM and NetWare libraries for C (including CLIB and XPlat):
+ If you are going to build a CLIB version of OpenSSL, you will
+ need the CLIB headers and imports. The March, 2001 NDK release or
+ later is recommended.
+
+ Earlier versions should work but haven't been tested. In recent
+ versions the import files have been consolidated and function
+ names moved. This means you may run into link problems
+ (undefined symbols) when using earlier versions. The functions
+ are available in earlier versions, but you will have to modifiy
+ the make files to include additional import files (see
+ openssl\util\pl\netware.pl).
+
+
+ LIBC - BUILDS:
+
+ Libraries for C (LibC) - LibC headers and import files
+ If you are going to build a LibC version of OpenSSL, you will
+ need the LibC headers and imports. The March 14, 2002 NDK release or
+ later is required.
+
+ NOTE: The LibC SDK includes the necessary WinSock2 support. It
+ It is not necessary to download the WinSock2 Developer when building
+ for LibC.
+
+
+BUILDING:
+---------
+Before building, you will need to set a few environment variables. You can
+set them manually or you can modify the "netware\set_env.bat" file.
+
+The set_env.bat file is a template you can use to set up the path
+and environment variables you will need to build. Modify the
+various lines to point to YOUR tools and run set_env.bat.
+
+ netware\set_env.bat [target]
+
+ target - "netware-clib" - CLib NetWare build
+ - "netware-libc" - LibC NetWare build
+
+If you don't use set_env.bat, you will need to set up the following
+environment variables:
+
+ path - Set path to point to the tools you will use.
+
+ MWCIncludes - The location of the NDK include files.
+
+ CLIB ex: set MWCIncludes=c:\ndk\nwsdk\include\nlm
+ LibC ex: set MWCIncludes=c:\ndk\libc\include
+
+ PRELUDE - The absolute path of the prelude object to link with. For
+ a CLIB build it is recommended you use the "nwpre.obj" file shipped
+ with the Metrowerks PDK for NetWare. For a LibC build you should
+ use the "libcpre.o" file delivered with the LibC NDK components.
+
+ CLIB ex: set PRELUDE=c:\codewar\novell support\metrowerks support\
+ libraries\runtime\nwpre.obj
+
+ LibC ex: set PRELUDE=c:\ndk\libc\imports\libcpre.o
+
+ IMPORTS - The locaton of the NDK import files.
+
+ CLIB ex: set IMPORTS=c:\ndk\nwsdk\imports
+ LibC ex: set IMPORTS=c:\ndk\libc\imports
+
+
+In order to build, you need to run the Perl scripts to configure the build
+process and generate a make file. There is a batch file,
+"netware\build.bat", to automate the process.
+
+Build.bat runs the build configuration scripts and generates a make file.
+If an assembly option is specified, it also runs the scripts to generate
+the assembly code. Always run build.bat from the "openssl" directory.
+
+ netware\build [target] [debug opts] [assembly opts] [configure opts]
+
+ target - "netware-clib" - CLib NetWare build
+ - "netware-libc" - LibC NetWare build
+
+ debug opts - "debug" - build debug
+
+ assembly opts - "nw-mwasm" - use Metrowerks assembler
+ "nw-nasm" - use NASM assembler
+ "no-asm" - don't use assembly
+
+ configure opts- all unrecognized arguments are passed to the
+ perl configure script
+
+ examples:
+
+ CLIB build, debug, without assembly:
+ netware\build.bat netware-clib debug no-asm
+
+ LibC build, non-debug, using NASM assembly:
+ netware\build.bat netware-libc nw-nasm
+
+Running build.bat generates a make file to be processed by your make
+tool (gmake or nmake):
+
+ CLIB ex: gmake -f netware\nlm_clib.mak
+ LibC ex: gmake -f netware\nlm_libc.mak
+
+
+You can also run the build scripts manually if you do not want to use the
+build.bat file. Run the following scripts in the "\openssl"
+subdirectory (in the order listed below):
+
+ perl configure no-asm [other config opts] [netware-clib|netware-libc]
+ configures no assembly build for specified netware environment
+ (CLIB or LibC).
+
+ perl util\mkfiles.pl >MINFO
+ generates a listing of source files (used by mk1mf)
+
+ perl util\mk1mf.pl no-asm [other config opts] [netware-clib|netware-libc >netware\nlm.mak
+ generates the makefile for NetWare
+
+ gmake -f netware\nlm.mak
+ build with the make tool (nmake.exe also works)
+
+NOTE: If you are building using the assembly option, you must also run the
+various Perl scripts to generate the assembly files. See build.bat
+for an example of running the various assembly scripts. You must use the
+"no-asm" option to build without assembly. The configure and mk1mf scripts
+also have various other options. See the scripts for more information.
+
+
+The output from the build is placed in the following directories:
+
+ CLIB Debug build:
+ out_nw_clib.dbg - static libs & test nlm(s)
+ tmp_nw_clib.dbg - temporary build files
+ outinc_nw_clib - necessary include files
+
+ CLIB Non-debug build:
+ out_nw_clib - static libs & test nlm(s)
+ tmp_nw_clib - temporary build files
+ outinc_nw_clib - necesary include files
+
+ LibC Debug build:
+ out_nw_libc.dbg - static libs & test nlm(s)
+ tmp_nw_libc.dbg - temporary build files
+ outinc_nw_libc - necessary include files
+
+ LibC Non-debug build:
+ out_nw_libc - static libs & test nlm(s)
+ tmp_nw_libc - temporary build files
+ outinc_nw_libc - necesary include files
+
+
+TESTING:
+--------
+The build process creates the OpenSSL static libs ( crypto.lib, ssl.lib,
+rsaglue.lib ) and several test programs. You should copy the test programs
+to your NetWare server and run the tests.
+
+The batch file "netware\cpy_tests.bat" will copy all the necessary files
+to your server for testing. In order to run the batch file, you need a
+drive mapped to your target server. It will create an "OpenSSL" directory
+on the drive and copy the test files to it. CAUTION: If a directory with the
+name of "OpenSSL" already exists, it will be deleted.
+
+To run cpy_tests.bat:
+
+ netware\cpy_tests [output directory] [NetWare drive]
+
+ output directory - "out_nw_clib.dbg", "out_nw_libc", etc.
+ NetWare drive - drive letter of mapped drive
+
+ CLIB ex: netware\cpy_tests out_nw_clib m:
+ LibC ex: netware\cpy_tests out_nw_libc m:
+
+
+The Perl script, "do_tests.pl", in the "OpenSSL" directory on the server
+should be used to execute the tests. Before running the script, make sure
+your SEARCH PATH includes the "OpenSSL" directory. For example, if you
+copied the files to the "sys:" volume you use the command:
+
+ SEARCH ADD SYS:\OPENSSL
+
+
+To run do_tests.pl type (at the console prompt):
+
+ perl \openssl\do_tests.pl [options]
+
+ options:
+ -p - pause after executing each test
+
+The do_tests.pl script generates a log file "\openssl\test_out\tests.log"
+which should be reviewed for errors. Any errors will be denoted by the word
+"ERROR" in the log.
+
+NOTE: Currently (11/2002), the LibC test nlms report an error while loading
+ when launched from the perl script (do_tests.pl). The problems are
+ being addressed by the LibC development team and should be fixed in the
+ next release. Until the problems are corrected, the LibC test nlms
+ will have to be executed manually.
+
+
+DEVELOPING WITH THE OPENSSL SDK:
+--------------------------------
+Now that everything is built and tested, you are ready to use the OpenSSL
+libraries in your development.
+
+There is no real installation procedure, just copy the static libs and
+headers to your build location. The libs (crypto.lib & ssl.lib) are
+located in the appropriate "out_nw_XXXX" directory
+(out_nw_clib, out_nw_libc, etc).
+
+The headers are located in the appropriate "outinc_nw_XXX" directory
+(outinc_nw_clib, outinc_nw_libc).
+
+One suggestion is to create the following directory
+structure for the OpenSSL SDK:
+
+ \openssl
+ |- bin
+ | |- openssl.nlm
+ | |- (other tests you want)
+ |
+ |- lib
+ | | - crypto.lib
+ | | - ssl.lib
+ |
+ |- include
+ | | - openssl
+ | | | - (all the headers in "outinc_nw\openssl")
+
+
+The program "openssl.nlm" can be very useful. It has dozens of
+options and you may want to keep it handy for debugging, testing, etc.
+
+When building your apps using OpenSSL, define "NETWARE". It is needed by
+some of the OpenSSL headers. One way to do this is with a compile option,
+for example "-DNETWARE".
+
+
+
+NOTES:
+------
+
+Resource leaks in Tests
+------------------------
+Some OpenSSL tests do not clean up resources and NetWare reports
+the resource leaks when the tests unload. If this really bugs you,
+you can stop the messages by setting the developer option off at the console
+prompt (set developer option = off). Or better yet, fix the tests to
+clean up the resources!
+
+
+Multi-threaded Development
+---------------------------
+The NetWare version of OpenSSL is thread-safe however, multi-threaded
+applications must provide the necessary locking function callbacks. This
+is described in doc\threads.doc. The file "openssl\crypto\threads\mttest.c"
+is a multi-threaded test program and demonstrates the locking functions.
+
+
+What is openssl2.nlm?
+---------------------
+The openssl program has numerous options and can be used for many different
+things. Many of the options operate in an interactive mode requiring the
+user to enter data. Because of this, a default screen is created for the
+program. However, when running the test script it is not desirable to
+have a seperate screen. Therefore, the build also creates openssl2.nlm.
+Openssl2.nlm is functionally identical but uses the console screen.
+Openssl2 can be used when a non-interactive mode is desired.
+
+NOTE: There are may other possibilities (command line options, etc)
+which could have been used to address the screen issue. The openssl2.nlm
+option was chosen because it impacted only the build not the code.
+
+
+Why only static libraries?
+--------------------------
+Globals, globals, and more globals. The OpenSSL code uses many global
+variables that are allocated and initialized when used for the first time.
+
+On NetWare, most applications (at least historically) run in the kernel.
+When running in the kernel, there is one instance of global variables.
+For regular application type NLM(s) this isn't a problem because they are
+the only ones using the globals. However, for a library NLM (an NLM which
+exposes functions and has no threads of execution), the globals cause
+problems. Applications could inadvertently step on each other if they
+change some globals. Even worse, the first application that triggers a
+global to be allocated and initialized has the allocated memory charged to
+itself. Now when that application unloads, NetWare will clean up all the
+applicaton's memory. The global pointer variables inside OpenSSL now
+point to freed memory. An abend waiting to happen!
+
+To work correctly in the kernel, library NLM(s) that use globals need to
+provide a set of globals (instance data) for each application. Another
+option is to require the library only be loaded in a protected address
+space along with the application using it.
+
+Modifying the OpenSSL code to provide a set of globals (instance data) for
+each application isn't technically difficult, but due to the large number
+globals it would require substantial code changes and it wasn't done. Hence,
+the build currently only builds static libraries which are then linked
+into each application.
+
+NOTE: If you are building a library NLM that uses the OpenSSL static
+libraries, you will still have to deal with the global variable issue.
+This is because when you link in the OpenSSL code you bring in all the
+globals. One possible solution for the global pointer variables is to
+register memory functions with OpenSSL which allocate memory and charge it
+to your library NLM (see the function CRYPTO_set_mem_functions). However,
+be aware that now all memory allocated by OpenSSL is charged to your NLM.
+
+
+CodeWarrior Tools and W2K
+---------------------------
+There have been problems reported with the CodeWarrior Linker
+(mwldnlm.exe) in the PDK 2.1 for NetWare when running on Windows 2000. The
+problems cause the link step to fail. The only work around is to obtain an
+updated linker from Metrowerks. It is expected Metrowerks will release
+PDK 3.0 (in beta testing at this time - May, 2001) in the near future which
+will fix these problems.
+
+
+Makefile "vclean"
+------------------
+The generated makefile has a "vclean" target which cleans up the build
+directories. If you have been building successfully and suddenly
+experience problems, use "vclean" (gmake -f netware\nlm.mak vclean) and retry.
+
+
+"Undefined Symbol" Linker errors
+--------------------------------
+There have been linker errors reported when doing a CLIB build. The problems
+occur because some versions of the CLIB SDK import files inadvertently
+left out some symbols. One symbol in particular is "_lrotl". The missing
+functions are actually delivered in the binaries, but they were left out of
+the import files. The issues should be fixed in the September 2001 release
+of the NDK. If you experience the problems you can temporarily
+work around it by manually adding the missing symbols to your version of
+"clib.imp".
diff --git a/Netware/build.bat b/Netware/build.bat
new file mode 100644
index 0000000000..ee73da4dff
--- /dev/null
+++ b/Netware/build.bat
@@ -0,0 +1,204 @@
+@echo off
+
+rem ========================================================================
+rem Batch file to automate building OpenSSL for NetWare.
+rem
+rem usage:
+rem build [target] [debug opts] [assembly opts] [configure opts]
+rem
+rem target - "netware-clib" - CLib NetWare build
+rem - "netware-libc" - LibC NKS NetWare build
+rem
+rem debug opts - "debug" - build debug
+rem
+rem assembly opts - "nw-mwasm" - use Metrowerks assembler
+rem "nw-nasm" - use NASM assembler
+rem "no-asm" - don't use assembly
+rem
+rem configure opts- all unrecognized arguments are passed to the
+rem perl configure script
+rem
+rem If no arguments are specified the default is to build non-debug with
+rem no assembly. NOTE: there is no default BLD_TARGET.
+rem
+
+
+
+rem No assembly is the default - Uncomment section below to change
+rem the assembler default
+set ASM_MODE=
+set ASSEMBLER=
+set NO_ASM=no-asm
+
+rem Uncomment to default to the Metrowerks assembler
+rem set ASM_MODE=nw-mwasm
+rem set ASSEMBLER=Metrowerks
+rem set NO_ASM=
+
+rem Uncomment to default to the NASM assembler
+rem set ASM_MODE=nw-nasm
+rem set ASSEMBLER=NASM
+rem set NO_ASM=
+
+rem No default Bld target
+set BLD_TARGET=no_target
+rem set BLD_TARGET=netware-clib
+rem set BLD_TARGET=netware-libc
+
+
+rem Default to build non-debug
+set DEBUG=
+
+rem Uncomment to default to debug build
+rem set DEBUG=debug
+
+
+set CONFIG_OPTS=
+set ARG_PROCESSED=NO
+
+
+rem Process command line args
+:opts
+if "a%1" == "a" goto endopt
+if "%1" == "no-asm" set NO_ASM=no-asm
+if "%1" == "no-asm" set ARG_PROCESSED=YES
+if "%1" == "debug" set DEBUG=debug
+if "%1" == "debug" set ARG_PROCESSED=YES
+if "%1" == "nw-nasm" set ASM_MODE=nw-nasm
+if "%1" == "nw-nasm" set ASSEMBLER=NASM
+if "%1" == "nw-nasm" set NO_ASM=
+if "%1" == "nw-nasm" set ARG_PROCESSED=YES
+if "%1" == "nw-mwasm" set ASM_MODE=nw-mwasm
+if "%1" == "nw-mwasm" set ASSEMBLER=Metrowerks
+if "%1" == "nw-mwasm" set NO_ASM=
+if "%1" == "nw-mwasm" set ARG_PROCESSED=YES
+if "%1" == "netware-clib" set BLD_TARGET=netware-clib
+if "%1" == "netware-clib" set ARG_PROCESSED=YES
+if "%1" == "netware-libc" set BLD_TARGET=netware-libc
+if "%1" == "netware-libc" set ARG_PROCESSED=YES
+
+rem If we didn't recognize the argument, consider it an option for config
+if "%ARG_PROCESSED%" == "NO" set CONFIG_OPTS=%CONFIG_OPTS% %1
+if "%ARG_PROCESSED%" == "YES" set ARG_PROCESSED=NO
+
+shift
+goto opts
+:endopt
+
+rem make sure a valid BLD_TARGET was specified
+if "%BLD_TARGET%" == "no_target" goto no_target
+
+rem build the nlm make file name which includes target and debug info
+set NLM_MAKE=
+if "%BLD_TARGET%" == "netware-clib" set NLM_MAKE=netware\nlm_clib
+if "%BLD_TARGET%" == "netware-libc" set NLM_MAKE=netware\nlm_libc
+if "%DEBUG%" == "" set NLM_MAKE=%NLM_MAKE%.mak
+if "%DEBUG%" == "debug" set NLM_MAKE=%NLM_MAKE%_dbg.mak
+
+if "%NO_ASM%" == "no-asm" set ASM_MODE=
+if "%NO_ASM%" == "no-asm" set ASSEMBLER=
+if "%NO_ASM%" == "no-asm" set CONFIG_OPTS=%CONFIG_OPTS% no-asm
+if "%NO_ASM%" == "no-asm" goto do_config
+
+
+rem ==================================================
+echo Generating x86 for %ASSEMBLER% assembler
+
+echo Bignum
+cd crypto\bn\asm
+perl x86.pl %ASM_MODE% > bn-nw.asm
+cd ..\..\..
+
+echo DES
+cd crypto\des\asm
+perl des-586.pl %ASM_MODE% > d-nw.asm
+cd ..\..\..
+
+echo "crypt(3)"
+
+cd crypto\des\asm
+perl crypt586.pl %ASM_MODE% > y-nw.asm
+cd ..\..\..
+
+echo Blowfish
+
+cd crypto\bf\asm
+perl bf-586.pl %ASM_MODE% > b-nw.asm
+cd ..\..\..
+
+echo CAST5
+cd crypto\cast\asm
+perl cast-586.pl %ASM_MODE% > c-nw.asm
+cd ..\..\..
+
+echo RC4
+cd crypto\rc4\asm
+perl rc4-586.pl %ASM_MODE% > r4-nw.asm
+cd ..\..\..
+
+echo MD5
+cd crypto\md5\asm
+perl md5-586.pl %ASM_MODE% > m5-nw.asm
+cd ..\..\..
+
+echo SHA1
+cd crypto\sha\asm
+perl sha1-586.pl %ASM_MODE% > s1-nw.asm
+cd ..\..\..
+
+echo RIPEMD160
+cd crypto\ripemd\asm
+perl rmd-586.pl %ASM_MODE% > rm-nw.asm
+cd ..\..\..
+
+echo RC5\32
+cd crypto\rc5\asm
+perl rc5-586.pl %ASM_MODE% > r5-nw.asm
+cd ..\..\..
+
+rem ===============================================================
+rem
+:do_config
+
+echo .
+echo configure options: %CONFIG_OPTS% %BLD_TARGET%
+echo .
+perl configure %CONFIG_OPTS% %BLD_TARGET%
+
+perl util\mkfiles.pl >MINFO
+
+echo .
+echo mk1mf.pl options: %DEBUG% %ASM_MODE% %CONFIG_OPTS% %BLD_TARGET%
+echo .
+perl util\mk1mf.pl %DEBUG% %ASM_MODE% %CONFIG_OPTS% %BLD_TARGET% >%NLM_MAKE%
+
+echo The makefile "%NLM_MAKE%" has been created use your maketool to
+echo build (ex: gmake -f %NLM_MAKE%)
+goto end
+
+rem ===============================================================
+rem
+:no_target
+echo .
+echo . No build target specified!!!
+echo .
+echo . usage: build [target] [debug opts] [assembly opts] [configure opts]
+echo .
+echo . target - "netware-clib" - CLib NetWare build
+echo . - "netware-libc" - LibC NKS NetWare build
+echo .
+echo . debug opts - "debug" - build debug
+echo .
+echo . assembly opts - "nw-mwasm" - use Metrowerks assembler
+echo . "nw-nasm" - use NASM assembler
+echo . "no-asm" - don't use assembly
+echo .
+echo . configure opts- all unrecognized arguments are passed to the
+echo . perl configure script
+echo .
+echo . If no debug or assembly opts are specified the default is to build
+echo . non-debug without assembly
+echo .
+
+
+:end
diff --git a/Netware/cpy_tests.bat b/Netware/cpy_tests.bat
new file mode 100644
index 0000000000..c2f07c00c7
--- /dev/null
+++ b/Netware/cpy_tests.bat
@@ -0,0 +1,112 @@
+@echo off
+
+rem Batch file to copy OpenSSL stuff to a NetWare server for testing
+
+rem This batch file will create an "opensssl" directory at the root of the
+rem specified NetWare drive and copy the required files to run the tests.
+rem It should be run from inside the "openssl\netware" subdirectory.
+
+rem Usage:
+rem cpy_tests.bat <test subdirectory> <NetWare drive>
+rem <test subdirectory> - out_nw.dbg | out_nw
+rem <NetWare drive> - any mapped drive letter
+rem
+rem example ( copy from debug build to m: dirve ):
+rem cpy_tests.bat out_nw.dbg m:
+rem
+rem CAUTION: If a directory named OpenSSL exists on the target drive
+rem it will be deleted first.
+
+
+if "%1" == "" goto usage
+if "%2" == "" goto usage
+
+rem Assume running in \openssl directory unless cpy_tests.bat exists then
+rem it must be the \openssl\netware directory
+set loc=.
+if exist cpy_tests.bat set loc=..
+
+rem make sure the local build subdirectory specified is valid
+if not exist %loc%\%1\NUL goto invalid_dir
+
+rem make sure target drive is valid
+if not exist %2\NUL goto invalid_drive
+
+rem If an OpenSSL directory exists on the target drive, remove it
+if exist %2\openssl\NUL goto remove_openssl
+goto do_copy
+
+:remove_openssl
+echo .
+echo OpenSSL directory exists on %2 - it will be removed!
+pause
+rmdir %2\openssl /s /q
+
+:do_copy
+rem make an "openssl" directory and others at the root of the NetWare drive
+mkdir %2\openssl
+mkdir %2\openssl\test_out
+mkdir %2\openssl\apps
+mkdir %2\openssl\certs
+mkdir %2\openssl\test
+
+
+rem copy the test nlms
+copy %loc%\%1\*.nlm %2\openssl\
+
+rem copy the test perl script
+copy %loc%\netware\do_tests.pl %2\openssl\
+
+rem copy the certs directory stuff
+xcopy %loc%\certs\*.* %2\openssl\certs\ /s
+
+rem copy the test directory stuff
+copy %loc%\test\CAss.cnf %2\openssl\test\
+copy %loc%\test\Uss.cnf %2\openssl\test\
+copy %loc%\test\pkcs7.pem %2\openssl\test\
+copy %loc%\test\pkcs7-1.pem %2\openssl\test\
+copy %loc%\test\testcrl.pem %2\openssl\test\
+copy %loc%\test\testp7.pem %2\openssl\test\
+copy %loc%\test\testreq2.pem %2\openssl\test\
+copy %loc%\test\testrsa.pem %2\openssl\test\
+copy %loc%\test\testsid.pem %2\openssl\test\
+copy %loc%\test\testx509.pem %2\openssl\test\
+copy %loc%\test\v3-cert1.pem %2\openssl\test\
+copy %loc%\test\v3-cert2.pem %2\openssl\test\
+
+rem copy the apps directory stuff
+copy %loc%\apps\client.pem %2\openssl\apps\
+copy %loc%\apps\server.pem %2\openssl\apps\
+copy %loc%\apps\openssl.cnf %2\openssl\apps\
+
+echo .
+echo Tests copied
+echo Run the test script at the console by typing:
+echo "Perl \openssl\do_tests.pl"
+echo .
+echo Make sure the Search path includes the OpenSSL subdirectory
+
+goto end
+
+:invalid_dir
+echo.
+echo Invalid build directory specified: %1
+echo.
+goto usage
+
+:invalid_drive
+echo.
+echo Invalid drive: %2
+echo.
+goto usage
+
+:usage
+echo.
+echo usage: cpy_tests.bat [test subdirectory] [NetWare drive]
+echo [test subdirectory] - out_nw_clib.dbg, out_nw_libc.dbg, etc.
+echo [NetWare drive] - any mapped drive letter
+echo.
+echo example: cpy_test out_nw_clib.dbg M:
+echo (copy from clib debug build area to M: drive)
+
+:end
diff --git a/Netware/do_tests.pl b/Netware/do_tests.pl
new file mode 100644
index 0000000000..f4e11272d3
--- /dev/null
+++ b/Netware/do_tests.pl
@@ -0,0 +1,585 @@
+# perl script to run OpenSSL tests
+
+
+my $base_path = "\\openssl";
+
+my $output_path = "$base_path\\test_out";
+my $cert_path = "$base_path\\certs";
+my $test_path = "$base_path\\test";
+my $app_path = "$base_path\\apps";
+
+my $tmp_cert = "$output_path\\cert.tmp";
+my $OpenSSL_config = "$app_path\\openssl.cnf";
+my $log_file = "$output_path\\tests.log";
+
+my $pause = 0;
+
+
+# process the command line args to see if they wanted us to pause
+# between executing each command
+foreach $i (@ARGV)
+{
+ if ($i =~ /^-p$/)
+ { $pause=1; }
+}
+
+
+
+main();
+
+
+############################################################################
+sub main()
+{
+ # delete all the output files in the output directory
+ unlink <$output_path\\*.*>;
+
+ # open the main log file
+ open(OUT, ">$log_file") || die "unable to open $log_file\n";
+
+
+ algorithm_tests();
+ encryption_tests();
+ pem_tests();
+ verify_tests();
+ ssl_tests();
+ ca_tests();
+
+ close(OUT);
+
+ print("\nCompleted running tests.\n\n");
+ print("Check log file for errors: $log_file\n");
+}
+
+############################################################################
+sub algorithm_tests
+{
+ my $i;
+ my $outFile;
+ my @tests = ( rsa_test, destest, ideatest, bftest, shatest, sha1test,
+ md5test, dsatest, md2test, mdc2test, rc2test, rc4test, randtest,
+ dhtest, exptest );
+
+ print( "\nRUNNING CRYPTO ALGORITHM TESTS:\n\n");
+
+ print( OUT "\n========================================================\n");
+ print( OUT "CRYPTO ALGORITHM TESTS:\n\n");
+
+ foreach $i (@tests)
+ {
+ $outFile = "$output_path\\$i.out";
+ system("$i > $outFile");
+ log_desc("Test: $i\.nlm:");
+ log_output("", $outFile );
+ }
+}
+
+############################################################################
+sub encryption_tests
+{
+ my $i;
+ my $outFile;
+ my @enc_tests = ( "enc", "rc4", "des-cfb", "des-ede-cfb", "des-ede3-cfb",
+ "des-ofb", "des-ede-ofb", "des-ede3-ofb",
+ "des-ecb", "des-ede", "des-ede3", "des-cbc",
+ "des-ede-cbc", "des-ede3-cbc", "idea-ecb", "idea-cfb",
+ "idea-ofb", "idea-cbc", "rc2-ecb", "rc2-cfb",
+ "rc2-ofb", "rc2-cbc", "bf-ecb", "bf-cfb",
+ "bf-ofb", "bf-cbc" );
+
+ my $input = "$base_path\\do_tests.pl";
+ my $cipher = "$output_path\\cipher.out";
+ my $clear = "$output_path\\clear.out";
+
+ print( "\nRUNNING ENCRYPTION & DECRYPTION TESTS:\n\n");
+
+ print( OUT "\n========================================================\n");
+ print( OUT "FILE ENCRYPTION & DECRYPTION TESTS:\n\n");
+
+ foreach $i (@enc_tests)
+ {
+ log_desc("Testing: $i");
+
+ # do encryption
+ $outFile = "$output_path\\enc.out";
+ system("openssl2 $i -e -bufsize 113 -k test -in $input -out $cipher > $outFile" );
+ log_output("Encrypting: $input --> $cipher", $outFile);
+
+ # do decryption
+ $outFile = "$output_path\\dec.out";
+ system("openssl2 $i -d -bufsize 157 -k test -in $cipher -out $clear > $outFile");
+ log_output("Decrypting: $cipher --> $clear", $outFile);
+
+ # compare files
+ $x = compare_files( $input, $clear, 1);
+ if ( $x == 0 )
+ {
+ print( "SUCCESS - files match: $input, $clear\n");
+ print( OUT "SUCCESS - files match: $input, $clear\n");
+ }
+ else
+ {
+ print( "ERROR: files don't match\n");
+ print( OUT "ERROR: files don't match\n");
+ }
+
+ do_wait();
+
+ # Now do the same encryption but use Base64
+
+ # do encryption B64
+ $outFile = "$output_path\\B64enc.out";
+ system("openssl2 $i -a -e -bufsize 113 -k test -in $input -out $cipher > $outFile");
+ log_output("Encrypting(B64): $cipher --> $clear", $outFile);
+
+ # do decryption B64
+ $outFile = "$output_path\\B64dec.out";
+ system("openssl2 $i -a -d -bufsize 157 -k test -in $cipher -out $clear > $outFile");
+ log_output("Decrypting(B64): $cipher --> $clear", $outFile);
+
+ # compare files
+ $x = compare_files( $input, $clear, 1);
+ if ( $x == 0 )
+ {
+ print( "SUCCESS - files match: $input, $clear\n");
+ print( OUT "SUCCESS - files match: $input, $clear\n");
+ }
+ else
+ {
+ print( "ERROR: files don't match\n");
+ print( OUT "ERROR: files don't match\n");
+ }
+
+ do_wait();
+
+ } # end foreach
+
+ # delete the temporary files
+ unlink($cipher);
+ unlink($clear);
+}
+
+
+############################################################################
+sub pem_tests
+{
+ my $i;
+ my $tmp_out;
+ my $outFile = "$output_path\\pem.out";
+
+ my %pem_tests = (
+ "crl" => "testcrl.pem",
+ "pkcs7" => "testp7.pem",
+ "req" => "testreq2.pem",
+ "rsa" => "testrsa.pem",
+ "x509" => "testx509.pem",
+ "x509" => "v3-cert1.pem",
+ "sess_id" => "testsid.pem" );
+
+
+ print( "\nRUNNING PEM TESTS:\n\n");
+
+ print( OUT "\n========================================================\n");
+ print( OUT "PEM TESTS:\n\n");
+
+ foreach $i (keys(%pem_tests))
+ {
+ log_desc( "Testing: $i");
+
+ my $input = "$test_path\\$pem_tests{$i}";
+
+ $tmp_out = "$output_path\\$pem_tests{$i}";
+
+ if ($i ne "req" )
+ {
+ system("openssl2 $i -in $input -out $tmp_out > $outFile");
+ log_output( "openssl2 $i -in $input -out $tmp_out", $outFile);
+ }
+ else
+ {
+ system("openssl2 $i -in $input -out $tmp_out -config $OpenSSL_config > $outFile");
+ log_output( "openssl2 $i -in $input -out $tmp_out -config $OpenSSL_config", $outFile );
+ }
+
+ $x = compare_files( $input, $tmp_out);
+ if ( $x == 0 )
+ {
+ print( "SUCCESS - files match: $input, $tmp_out\n");
+ print( OUT "SUCCESS - files match: $input, $tmp_out\n");
+ }
+ else
+ {
+ print( "ERROR: files don't match\n");
+ print( OUT "ERROR: files don't match\n");
+ }
+ do_wait();
+
+ } # end foreach
+}
+
+
+############################################################################
+sub verify_tests
+{
+ my $i;
+ my $outFile = "$output_path\\verify.out";
+
+ my @cert_files = <$cert_path\\*.pem>;
+
+ print( "\nRUNNING VERIFY TESTS:\n\n");
+
+ print( OUT "\n========================================================\n");
+ print( OUT "VERIFY TESTS:\n\n");
+
+ make_tmp_cert_file();
+
+ foreach $i (@cert_files)
+ {
+ system("openssl2 verify -CAfile $tmp_cert $i >$outFile");
+ log_desc("Verifying cert: $i");
+ log_output("openssl2 verify -CAfile $tmp_cert $i", $outFile);
+ }
+}
+
+
+############################################################################
+sub ssl_tests
+{
+ my $outFile = "$output_path\\ssl_tst.out";
+
+ print( "\nRUNNING SSL TESTS:\n\n");
+
+ print( OUT "\n========================================================\n");
+ print( OUT "SSL TESTS:\n\n");
+
+ make_tmp_cert_file();
+
+ system("ssltest -ssl2 >$outFile");
+ log_desc("Testing sslv2:");
+ log_output("ssltest -ssl2", $outFile);
+
+ system("ssltest -ssl2 -server_auth -CAfile $tmp_cert >$outFile");
+ log_desc("Testing sslv2 with server authentication:");
+ log_output("ssltest -ssl2 -server_auth -CAfile $tmp_cert", $outFile);
+
+ system("ssltest -ssl2 -client_auth -CAfile $tmp_cert >$outFile");
+ log_desc("Testing sslv2 with client authentication:");
+ log_output("ssltest -ssl2 -client_auth -CAfile $tmp_cert", $outFile);
+
+ system("ssltest -ssl2 -server_auth -client_auth -CAfile $tmp_cert >$outFile");
+ log_desc("Testing sslv2 with both client and server authentication:");
+ log_output("ssltest -ssl2 -server_auth -client_auth -CAfile $tmp_cert", $outFile);
+
+ system("ssltest -ssl3 >$outFile");
+ log_desc("Testing sslv3:");
+ log_output("ssltest -ssl3", $outFile);
+
+ system("ssltest -ssl3 -server_auth -CAfile $tmp_cert >$outFile");
+ log_desc("Testing sslv3 with server authentication:");
+ log_output("ssltest -ssl3 -server_auth -CAfile $tmp_cert", $outFile);
+
+ system("ssltest -ssl3 -client_auth -CAfile $tmp_cert >$outFile");
+ log_desc("Testing sslv3 with client authentication:");
+ log_output("ssltest -ssl3 -client_auth -CAfile $tmp_cert", $outFile);
+
+ system("ssltest -ssl3 -server_auth -client_auth -CAfile $tmp_cert >$outFile");
+ log_desc("Testing sslv3 with both client and server authentication:");
+ log_output("ssltest -ssl3 -server_auth -client_auth -CAfile $tmp_cert", $outFile);
+
+ system("ssltest >$outFile");
+ log_desc("Testing sslv2/sslv3:");
+ log_output("ssltest", $outFile);
+
+ system("ssltest -server_auth -CAfile $tmp_cert >$outFile");
+ log_desc("Testing sslv2/sslv3 with server authentication:");
+ log_output("ssltest -server_auth -CAfile $tmp_cert", $outFile);
+
+ system("ssltest -client_auth -CAfile $tmp_cert >$outFile");
+ log_desc("Testing sslv2/sslv3 with client authentication:");
+ log_output("ssltest -client_auth -CAfile $tmp_cert", $outFile);
+
+ system("ssltest -server_auth -client_auth -CAfile $tmp_cert >$outFile");
+ log_desc("Testing sslv2/sslv3 with both client and server authentication:");
+ log_output("ssltest -server_auth -client_auth -CAfile $tmp_cert", $outFile);
+
+ system("ssltest -bio_pair -ssl2 >$outFile");
+ log_desc("Testing sslv2 via BIO pair:");
+ log_output("ssltest -bio_pair -ssl2", $outFile);
+
+ system("ssltest -bio_pair -dhe1024dsa -v >$outFile");
+ log_desc("Testing sslv2/sslv3 with 1024 bit DHE via BIO pair:");
+ log_output("ssltest -bio_pair -dhe1024dsa -v", $outFile);
+
+ system("ssltest -bio_pair -ssl2 -server_auth -CAfile $tmp_cert >$outFile");
+ log_desc("Testing sslv2 with server authentication via BIO pair:");
+ log_output("ssltest -bio_pair -ssl2 -server_auth -CAfile $tmp_cert", $outFile);
+
+ system("ssltest -bio_pair -ssl2 -client_auth -CAfile $tmp_cert >$outFile");
+ log_desc("Testing sslv2 with client authentication via BIO pair:");
+ log_output("ssltest -bio_pair -ssl2 -client_auth -CAfile $tmp_cert", $outFile);
+
+ system("ssltest -bio_pair -ssl2 -server_auth -client_auth -CAfile $tmp_cert >$outFile");
+ log_desc("Testing sslv2 with both client and server authentication via BIO pair:");
+ log_output("ssltest -bio_pair -ssl2 -server_auth -client_auth -CAfile $tmp_cert", $outFile);
+
+ system("ssltest -bio_pair -ssl3 >$outFile");
+ log_desc("Testing sslv3 via BIO pair:");
+ log_output("ssltest -bio_pair -ssl3", $outFile);
+
+ system("ssltest -bio_pair -ssl3 -server_auth -CAfile $tmp_cert >$outFile");
+ log_desc("Testing sslv3 with server authentication via BIO pair:");
+ log_output("ssltest -bio_pair -ssl3 -server_auth -CAfile $tmp_cert", $outFile);
+
+ system("ssltest -bio_pair -ssl3 -client_auth -CAfile $tmp_cert >$outFile");
+ log_desc("Testing sslv3 with client authentication via BIO pair:");
+ log_output("ssltest -bio_pair -ssl3 -client_auth -CAfile $tmp_cert", $outFile);
+
+ system("ssltest -bio_pair -ssl3 -server_auth -client_auth -CAfile $tmp_cert >$outFile");
+ log_desc("Testing sslv3 with both client and server authentication via BIO pair:");
+ log_output("ssltest -bio_pair -ssl3 -server_auth -client_auth -CAfile $tmp_cert", $outFile);
+
+ system("ssltest -bio_pair >$outFile");
+ log_desc("Testing sslv2/sslv3 via BIO pair:");
+ log_output("ssltest -bio_pair", $outFile);
+
+ system("ssltest -bio_pair -server_auth -CAfile $tmp_cert >$outFile");
+ log_desc("Testing sslv2/sslv3 with server authentication via BIO pair:");
+ log_output("ssltest -bio_pair -server_auth -CAfile $tmp_cert", $outFile);
+
+ system("ssltest -bio_pair -client_auth -CAfile $tmp_cert >$outFile");
+ log_desc("Testing sslv2/sslv3 with client authentication via BIO pair:");
+ log_output("ssltest -bio_pair -client_auth -CAfile $tmp_cert", $outFile);
+
+ system("ssltest -bio_pair -server_auth -client_auth -CAfile $tmp_cert >$outFile");
+ log_desc("Testing sslv2/sslv3 with both client and server authentication via BIO pair:");
+ log_output("ssltest -bio_pair -server_auth -client_auth -CAfile $tmp_cert", $outFile);
+}
+
+
+############################################################################
+sub ca_tests
+{
+ my $outFile = "$output_path\\ca_tst.out";
+
+ my($CAkey) = "$output_path\\keyCA.ss";
+ my($CAcert) = "$output_path\\certCA.ss";
+ my($CAserial) = "$output_path\\certCA.srl";
+ my($CAreq) = "$output_path\\reqCA.ss";
+ my($CAreq2) = "$output_path\\req2CA.ss";
+
+ my($CAconf) = "$test_path\\CAss.cnf";
+
+ my($Uconf) = "$test_path\\Uss.cnf";
+
+ my($Ukey) = "$output_path\\keyU.ss";
+ my($Ureq) = "$output_path\\reqU.ss";
+ my($Ucert) = "$output_path\\certU.ss";
+
+ print( "\nRUNNING CA TESTS:\n\n");
+
+ print( OUT "\n========================================================\n");
+ print( OUT "CA TESTS:\n");
+
+ system("openssl2 req -config $CAconf -out $CAreq -keyout $CAkey -new >$outFile");
+ log_desc("Make a certificate request using req:");
+ log_output("openssl2 req -config $CAconf -out $CAreq -keyout $CAkey -new", $outFile);
+
+ system("openssl2 x509 -CAcreateserial -in $CAreq -days 30 -req -out $CAcert -signkey $CAkey >$outFile");
+ log_desc("Convert the certificate request into a self signed certificate using x509:");
+ log_output("openssl2 x509 -CAcreateserial -in $CAreq -days 30 -req -out $CAcert -signkey $CAkey", $outFile);
+
+ system("openssl2 x509 -in $CAcert -x509toreq -signkey $CAkey -out $CAreq2 >$outFile");
+ log_desc("Convert a certificate into a certificate request using 'x509':");
+ log_output("openssl2 x509 -in $CAcert -x509toreq -signkey $CAkey -out $CAreq2", $outFile);
+
+ system("openssl2 req -config $OpenSSL_config -verify -in $CAreq -noout >$outFile");
+ log_output("openssl2 req -config $OpenSSL_config -verify -in $CAreq -noout", $outFile);
+
+ system("openssl2 req -config $OpenSSL_config -verify -in $CAreq2 -noout >$outFile");
+ log_output( "openssl2 req -config $OpenSSL_config -verify -in $CAreq2 -noout", $outFile);
+
+ system("openssl2 verify -CAfile $CAcert $CAcert >$outFile");
+ log_output("openssl2 verify -CAfile $CAcert $CAcert", $outFile);
+
+ system("openssl2 req -config $Uconf -out $Ureq -keyout $Ukey -new >$outFile");
+ log_desc("Make another certificate request using req:");
+ log_output("openssl2 req -config $Uconf -out $Ureq -keyout $Ukey -new", $outFile);
+
+ system("openssl2 x509 -CAcreateserial -in $Ureq -days 30 -req -out $Ucert -CA $CAcert -CAkey $CAkey -CAserial $CAserial >$outFile");
+ log_desc("Sign certificate request with the just created CA via x509:");
+ log_output("openssl2 x509 -CAcreateserial -in $Ureq -days 30 -req -out $Ucert -CA $CAcert -CAkey $CAkey -CAserial $CAserial", $outFile);
+
+ system("openssl2 verify -CAfile $CAcert $Ucert >$outFile");
+ log_output("openssl2 verify -CAfile $CAcert $Ucert", $outFile);
+
+ system("openssl2 x509 -subject -issuer -startdate -enddate -noout -in $Ucert >$outFile");
+ log_desc("Certificate details");
+ log_output("openssl2 x509 -subject -issuer -startdate -enddate -noout -in $Ucert", $outFile);
+
+ print(OUT "-- \n");
+ print(OUT "The generated CA certificate is $CAcert\n");
+ print(OUT "The generated CA private key is $CAkey\n");
+ print(OUT "The current CA signing serial number is in $CAserial\n");
+
+ print(OUT "The generated user certificate is $Ucert\n");
+ print(OUT "The generated user private key is $Ukey\n");
+ print(OUT "--\n");
+}
+
+############################################################################
+sub log_output( $ $ )
+{
+ my( $desc, $file ) = @_;
+ my($error) = 0;
+ my($key);
+ my($msg);
+
+ if ($desc)
+ {
+ print("$desc\n");
+ print(OUT "$desc\n");
+ }
+
+ # loop waiting for test program to complete
+ while ( stat($file) == 0)
+ { print(". "); sleep(1); }
+
+
+ # copy test output to log file
+ open(IN, "<$file");
+ while (<IN>)
+ {
+ print(OUT $_);
+ if ( $_ =~ /ERROR/ )
+ {
+ $error = 1;
+ }
+ }
+ # close and delete the temporary test output file
+ close(IN);
+ unlink($file);
+
+ if ( $error == 0 )
+ {
+ $msg = "Test Succeeded";
+ }
+ else
+ {
+ $msg = "Test Failed";
+ }
+
+ print(OUT "$msg\n");
+
+ if ($pause)
+ {
+ print("$msg - press ENTER to continue...");
+ $key = getc;
+ print("\n");
+ }
+
+ # Several of the testing scripts run a loop loading the
+ # same NLM with different options.
+ # On slow NetWare machines there appears to be some delay in the
+ # OS actually unloading the test nlms and the OS complains about.
+ # the NLM already being loaded. This additional pause is to
+ # to help provide a little more time for unloading before trying to
+ # load again.
+ sleep(1);
+}
+
+
+############################################################################
+sub log_desc( $ )
+{
+ my( $desc ) = @_;
+
+ print("\n");
+ print("$desc\n");
+
+ print(OUT "\n");
+ print(OUT "$desc\n");
+ print(OUT "======================================\n");
+}
+
+############################################################################
+sub compare_files( $ $ $ )
+{
+ my( $file1, $file2, $binary ) = @_;
+ my( $n1, $n2, $b1, $b2 );
+ my($ret) = 1;
+
+ open(IN0, $file1) || die "\nunable to open $file1\n";
+ open(IN1, $file2) || die "\nunable to open $file2\n";
+
+ if ($binary)
+ {
+ binmode IN0;
+ binmode IN1;
+ }
+
+ for (;;)
+ {
+ $n1 = read(IN0, $b1, 512);
+ $n2 = read(IN1, $b2, 512);
+
+ if ($n1 != $n2) {last;}
+ if ($b1 != $b2) {last;}
+
+ if ($n1 == 0)
+ {
+ $ret = 0;
+ last;
+ }
+ }
+ close(IN0);
+ close(IN1);
+ return($ret);
+}
+
+############################################################################
+sub do_wait()
+{
+ my($key);
+
+ if ($pause)
+ {
+ print("Press ENTER to continue...");
+ $key = getc;
+ print("\n");
+ }
+}
+
+
+############################################################################
+sub make_tmp_cert_file()
+{
+ my @cert_files = <$cert_path\\*.pem>;
+
+ # delete the file if it already exists
+ unlink($tmp_cert);
+
+ open( TMP_CERT, ">$tmp_cert") || die "\nunable to open $tmp_cert\n";
+
+ print("building temporary cert file\n");
+
+ # create a temporary cert file that contains all the certs
+ foreach $i (@cert_files)
+ {
+ open( IN_CERT, $i ) || die "\nunable to open $i\n";
+
+ for(;;)
+ {
+ $n = sysread(IN_CERT, $data, 1024);
+
+ if ($n == 0)
+ {
+ close(IN_CERT);
+ last;
+ };
+
+ syswrite(TMP_CERT, $data, $n);
+ }
+ }
+
+ close( TMP_CERT );
+}
diff --git a/Netware/globals.txt b/Netware/globals.txt
new file mode 100644
index 0000000000..fe05d390cf
--- /dev/null
+++ b/Netware/globals.txt
@@ -0,0 +1,254 @@
+An initial review of the OpenSSL code was done to determine how many
+global variables where present. The idea was to determine the amount of
+work required to pull the globals into an instance data structure in
+order to build a Library NLM for NetWare. This file contains the results
+of the review. Each file is listed along with the globals in the file.
+The initial review was done very quickly so this list is probably
+not a comprehensive list.
+
+
+cryptlib.c
+===========================================
+
+static STACK *app_locks=NULL;
+
+static STACK_OF(CRYPTO_dynlock) *dyn_locks=NULL;
+
+static void (MS_FAR *locking_callback)(int mode,int type,
+ const char *file,int line)=NULL;
+static int (MS_FAR *add_lock_callback)(int *pointer,int amount,
+ int type,const char *file,int line)=NULL;
+static unsigned long (MS_FAR *id_callback)(void)=NULL;
+static struct CRYPTO_dynlock_value *(MS_FAR *dynlock_create_callback)
+ (const char *file,int line)=NULL;
+static void (MS_FAR *dynlock_lock_callback)(int mode,
+ struct CRYPTO_dynlock_value *l, const char *file,int line)=NULL;
+static void (MS_FAR *dynlock_destroy_callback)(struct CRYPTO_dynlock_value *l,
+ const char *file,int line)=NULL;
+
+
+mem.c
+===========================================
+static int allow_customize = 1; /* we provide flexible functions for */
+static int allow_customize_debug = 1;/* exchanging memory-related functions at
+
+/* may be changed as long as `allow_customize' is set */
+static void *(*malloc_locked_func)(size_t) = malloc;
+static void (*free_locked_func)(void *) = free;
+static void *(*malloc_func)(size_t) = malloc;
+static void *(*realloc_func)(void *, size_t)= realloc;
+static void (*free_func)(void *) = free;
+
+/* use default functions from mem_dbg.c */
+static void (*malloc_debug_func)(void *,int,const char *,int,int)
+ = CRYPTO_dbg_malloc;
+static void (*realloc_debug_func)(void *,void *,int,const char *,int,int)
+ = CRYPTO_dbg_realloc;
+static void (*free_debug_func)(void *,int) = CRYPTO_dbg_free;
+static void (*set_debug_options_func)(long) = CRYPTO_dbg_set_options;
+static long (*get_debug_options_func)(void) = CRYPTO_dbg_get_options;
+
+
+mem_dbg.c
+===========================================
+static int mh_mode=CRYPTO_MEM_CHECK_OFF;
+static unsigned long order = 0; /* number of memory requests */
+static LHASH *mh=NULL; /* hash-table of memory requests (address as key) */
+
+static LHASH *amih=NULL; /* hash-table with those app_mem_info_st's */
+static long options = /* extra information to be recorded */
+static unsigned long disabling_thread = 0;
+
+
+err.c
+===========================================
+static LHASH *error_hash=NULL;
+static LHASH *thread_hash=NULL;
+
+several files have routines with static "init" to track if error strings
+ have been loaded ( may not want seperate error strings for each process )
+ The "init" variable can't be left "global" because the error has is a ptr
+ that is malloc'ed. The malloc'ed error has is dependant on the "init"
+ vars.
+
+ files:
+ pem_err.c
+ cpt_err.c
+ pk12err.c
+ asn1_err.c
+ bio_err.c
+ bn_err.c
+ buf_err.c
+ comp_err.c
+ conf_err.c
+ cpt_err.c
+ dh_err.c
+ dsa_err.c
+ dso_err.c
+ evp_err.c
+ obj_err.c
+ pkcs7err.c
+ rand_err.c
+ rsa_err.c
+ rsar_err.c
+ ssl_err.c
+ x509_err.c
+ v3err.c
+ err.c
+
+These file have similar "init" globals but they are for other stuff not
+error strings:
+
+ bn_lib.c
+ ecc_enc.c
+ s23_clnt.c
+ s23_meth.c
+ s23_srvr.c
+ s2_clnt.c
+ s2_lib.c
+ s2_meth.c
+ s2_srvr.c
+ s3_clnt.c
+ s3_lib.c
+ s3_srvr.c
+ t1_clnt.c
+ t1_meth.c
+ t1_srvr.c
+
+rand_lib.c
+===========================================
+static RAND_METHOD *rand_meth= &rand_ssleay_meth;
+
+md_rand.c
+===========================================
+static int state_num=0,state_index=0;
+static unsigned char state[STATE_SIZE+MD_DIGEST_LENGTH];
+static unsigned char md[MD_DIGEST_LENGTH];
+static long md_count[2]={0,0};
+static double entropy=0;
+static int initialized=0;
+
+/* This should be set to 1 only when ssleay_rand_add() is called inside
+ an already locked state, so it doesn't try to lock and thereby cause
+ a hang. And it should always be reset back to 0 before unlocking. */
+static int add_do_not_lock=0;
+
+obj_dat.c
+============================================
+static int new_nid=NUM_NID;
+static LHASH *added=NULL;
+
+b_sock.c
+===========================================
+static unsigned long BIO_ghbn_hits=0L;
+static unsigned long BIO_ghbn_miss=0L;
+static struct ghbn_cache_st
+ {
+ char name[129];
+ struct hostent *ent;
+ unsigned long order;
+ } ghbn_cache[GHBN_NUM];
+
+static int wsa_init_done=0;
+
+
+bio_lib.c
+===========================================
+static STACK_OF(CRYPTO_EX_DATA_FUNCS) *bio_meth=NULL;
+static int bio_meth_num=0;
+
+
+bn_lib.c
+========================================
+static int bn_limit_bits=0;
+static int bn_limit_num=8; /* (1<<bn_limit_bits) */
+static int bn_limit_bits_low=0;
+static int bn_limit_num_low=8; /* (1<<bn_limit_bits_low) */
+static int bn_limit_bits_high=0;
+static int bn_limit_num_high=8; /* (1<<bn_limit_bits_high) */
+static int bn_limit_bits_mont=0;
+static int bn_limit_num_mont=8; /* (1<<bn_limit_bits_mont) */
+
+conf_lib.c
+========================================
+static CONF_METHOD *default_CONF_method=NULL;
+
+dh_lib.c
+========================================
+static DH_METHOD *default_DH_method;
+static int dh_meth_num = 0;
+static STACK_OF(CRYPTO_EX_DATA_FUNCS) *dh_meth = NULL;
+
+dsa_lib.c
+========================================
+static DSA_METHOD *default_DSA_method;
+static int dsa_meth_num = 0;
+static STACK_OF(CRYPTO_EX_DATA_FUNCS) *dsa_meth = NULL;
+
+dso_lib.c
+========================================
+static DSO_METHOD *default_DSO_meth = NULL;
+
+rsa_lib.c
+========================================
+static RSA_METHOD *default_RSA_meth=NULL;
+static int rsa_meth_num=0;
+static STACK_OF(CRYPTO_EX_DATA_FUNCS) *rsa_meth=NULL;
+
+x509_trs.c
+=======================================
+static int (*default_trust)(int id, X509 *x, int flags) = obj_trust;
+static STACK_OF(X509_TRUST) *trtable = NULL;
+
+x509_req.c
+=======================================
+static int *ext_nids = ext_nid_list;
+
+o_names.c
+======================================
+static LHASH *names_lh=NULL;
+static STACK_OF(NAME_FUNCS) *name_funcs_stack;
+static int free_type;
+static int names_type_num=OBJ_NAME_TYPE_NUM;
+
+
+th-lock.c - NEED to add support for locking for NetWare
+==============================================
+static long *lock_count;
+(other platform specific globals)
+
+x_x509.c
+==============================================
+static int x509_meth_num = 0;
+static STACK_OF(CRYPTO_EX_DATA_FUNCS) *x509_meth = NULL;
+
+
+evp_pbe.c
+============================================
+static STACK *pbe_algs;
+
+evp_key.c
+============================================
+static char prompt_string[80];
+
+ssl_ciph.c
+============================================
+static STACK_OF(SSL_COMP) *ssl_comp_methods=NULL;
+
+ssl_lib.c
+=============================================
+static STACK_OF(CRYPTO_EX_DATA_FUNCS) *ssl_meth=NULL;
+static STACK_OF(CRYPTO_EX_DATA_FUNCS) *ssl_ctx_meth=NULL;
+static int ssl_meth_num=0;
+static int ssl_ctx_meth_num=0;
+
+ssl_sess.c
+=============================================
+static int ssl_session_num=0;
+static STACK_OF(CRYPTO_EX_DATA_FUNCS) *ssl_session_meth=NULL;
+
+x509_vfy.c
+============================================
+static STACK_OF(CRYPTO_EX_DATA_FUNCS) *x509_store_ctx_method=NULL;
+static int x509_store_ctx_num=0;
+
diff --git a/Netware/readme.txt b/Netware/readme.txt
new file mode 100644
index 0000000000..a5b5faae33
--- /dev/null
+++ b/Netware/readme.txt
@@ -0,0 +1,19 @@
+
+Contents of the openssl\netware directory
+==========================================
+
+Regular files:
+
+readme.txt - this file
+do_tests.pl - perl script used to run the OpenSSL tests on NetWare
+cpy_tests.bat - batch to to copy test stuff to NetWare server
+build.bat - batch file to help with builds
+set_env.bat - batch file to help setup build environments
+globals.txt - results of initial code review to identify OpenSSL global variables
+
+
+The following files are generated by the various scripts. They are
+recreated each time and it is okay to delete them.
+
+*.def - command files used by Metrowerks linker
+*.mak - make files generated by mk1mf.pl
diff --git a/Netware/set_env.bat b/Netware/set_env.bat
new file mode 100644
index 0000000000..67a4725b09
--- /dev/null
+++ b/Netware/set_env.bat
@@ -0,0 +1,90 @@
+@echo off
+
+rem ========================================================================
+rem Batch file to assist in setting up the necessary enviroment for
+rem building OpenSSL for NetWare.
+rem
+rem usage:
+rem set_env [target]
+rem
+rem target - "netware-clib" - Clib build
+rem - "netware-libc" - LibC build
+rem
+rem
+
+if "a%1" == "a" goto usage
+
+set LIBC_BUILD=
+set CLIB_BUILD=
+
+if "%1" == "netware-clib" set CLIB_BUILD=Y
+if "%1" == "netware-clib" set LIBC_BUILD=
+
+if "%1" == "netware-libc" set LIBC_BUILD=Y
+if "%1" == "netware-libc" set CLIB_BUILD=
+
+rem Location of tools (compiler, linker, etc)
+set TOOLS=d:\i_drive\tools
+
+rem If Perl for Win32 is not already in your path, add it here
+set PERL_PATH=
+
+rem Define path to the Metrowerks command line tools
+rem ( compiler, assembler, linker)
+set METROWERKS_PATH=%TOOLS%\codewar\pdk_21\tools\command line tools
+rem set METROWERKS_PATH=%TOOLS%\codewar\PDK_40\Other Metrowerks Tools\Command Line Tools
+
+rem If using gnu make define path to utility
+set GNU_MAKE_PATH=%TOOLS%\gnu
+
+rem If using ms nmake define path to nmake
+set MS_NMAKE_PATH=%TOOLS%\msvc\600\bin
+
+rem If using NASM assembler define path
+set NASM_PATH=%TOOLS%\nasm
+
+rem Update path to include tool paths
+set path=%path%;%METROWERKS_PATH%
+if not "%GNU_MAKE_PATH%" == "" set path=%path%;%GNU_MAKE_PATH%
+if not "%MS_NMAKE_PATH%" == "" set path=%path%;%MS_NMAKE_PATH%
+if not "%NASM_PATH%" == "" set path=%path%;%NASM_PATH%
+if not "%PERL_PATH%" == "" set path=%path%;%PERL_PATH%
+
+rem Set MWCIncludes to location of Novell NDK includes
+if "%LIBC_BUILD%" == "Y" set MWCIncludes=%TOOLS%\ndk\libc\include;%TOOLS%\ndk\libc\include\winsock;.\engines
+if "%CLIB_BUILD%" == "Y" set MWCIncludes=%TOOLS%\ndk\nwsdk\include\nlm;.\engines
+set include=
+
+rem Set Imports to location of Novell NDK import files
+if "%LIBC_BUILD%" == "Y" set IMPORTS=%TOOLS%\ndk\libc\imports
+if "%CLIB_BUILD%" == "Y" set IMPORTS=%TOOLS%\ndk\nwsdk\imports
+
+rem Set PRELUDE to the absolute path of the prelude object to link with in
+rem the Metrowerks NetWare PDK - NOTE: for Clib builds "nwpre.obj" is
+rem recommended, for LibC NKS builds libcpre.o must be used
+if "%LIBC_BUILD%" == "Y" set PRELUDE=%TOOLS%\ndk\libc\imports\libcpre.o
+if "%CLIB_BUILD%" == "Y" set PRELUDE=%TOOLS%\codewar\pdk_21\novell support\metrowerks support\libraries\runtime\nwpre.obj
+
+
+if "%LIBC_BUILD%" == "Y" echo Enviroment configured for LibC build
+if "%LIBC_BUILD%" == "Y" echo use "netware\build.bat netware-libc ..."
+
+if "%CLIB_BUILD%" == "Y" echo Enviroment configured for CLib build
+if "%CLIB_BUILD%" == "Y" echo use "netware\build.bat netware-clib ..."
+goto end
+
+:usage
+rem ===============================================================
+echo .
+echo . No target build specified!
+echo .
+echo . usage: set_env [target]
+echo .
+echo . target - "netware-clib" - Clib build
+echo . - "netware-libc" - LibC build
+echo .
+
+
+
+:end
+
diff --git a/apps/apps.c b/apps/apps.c
index 62fa21d5d0..0014cb5367 100644
--- a/apps/apps.c
+++ b/apps/apps.c
@@ -250,7 +250,7 @@ int str2fmt(char *s)
return(FORMAT_UNDEF);
}
-#if defined(OPENSSL_SYS_MSDOS) || defined(OPENSSL_SYS_WIN32) || defined(OPENSSL_SYS_WIN16)
+#if defined(OPENSSL_SYS_MSDOS) || defined(OPENSSL_SYS_WIN32) || defined(OPENSSL_SYS_WIN16) || defined(OPENSSL_SYS_NETWARE)
void program_name(char *in, char *out, int size)
{
int i,n;
@@ -269,12 +269,23 @@ void program_name(char *in, char *out, int size)
if (p == NULL)
p=in;
n=strlen(p);
+
+#if defined(OPENSSL_SYS_NETWARE)
+ /* strip off trailing .nlm if present. */
+ if ((n > 4) && (p[n-4] == '.') &&
+ ((p[n-3] == 'n') || (p[n-3] == 'N')) &&
+ ((p[n-2] == 'l') || (p[n-2] == 'L')) &&
+ ((p[n-1] == 'm') || (p[n-1] == 'M')))
+ n-=4;
+#else
/* strip off trailing .exe if present. */
if ((n > 4) && (p[n-4] == '.') &&
((p[n-3] == 'e') || (p[n-3] == 'E')) &&
((p[n-2] == 'x') || (p[n-2] == 'X')) &&
((p[n-1] == 'e') || (p[n-1] == 'E')))
n-=4;
+#endif
+
if (n > size-1)
n=size-1;
diff --git a/apps/apps.h b/apps/apps.h
index 0d50a94774..107001057e 100644
--- a/apps/apps.h
+++ b/apps/apps.h
@@ -162,7 +162,9 @@ extern BIO *bio_err;
#endif
+#ifndef OPENSSL_SYS_NETWARE
#include <signal.h>
+#endif
#ifdef SIGPIPE
#define do_pipe_sig() signal(SIGPIPE,SIG_IGN)
diff --git a/apps/ca.c b/apps/ca.c
index 15211b8443..19d51477ae 100644
--- a/apps/ca.c
+++ b/apps/ca.c
@@ -83,7 +83,7 @@
# else
# include <unixlib.h>
# endif
-# elif !defined(OPENSSL_SYS_VXWORKS) && !defined(OPENSSL_SYS_WINDOWS)
+# elif !defined(OPENSSL_SYS_VXWORKS) && !defined(OPENSSL_SYS_WINDOWS) && !defined(OPENSSL_SYS_NETWARE)
# include <sys/file.h>
# endif
#endif
diff --git a/apps/s_apps.h b/apps/s_apps.h
index 66b6edd442..f4c85aa81f 100644
--- a/apps/s_apps.h
+++ b/apps/s_apps.h
@@ -108,8 +108,9 @@
* Hudson (tjh@cryptsoft.com).
*
*/
-
+#if !defined(OPENSSL_SYS_NETWARE) /* conflicts with winsock2 stuff on netware */
#include <sys/types.h>
+#endif
#include <openssl/opensslconf.h>
#if defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_MSDOS)
diff --git a/apps/s_client.c b/apps/s_client.c
index 294aad8b59..43934d87bc 100644
--- a/apps/s_client.c
+++ b/apps/s_client.c
@@ -256,7 +256,7 @@ int MAIN(int argc, char **argv)
char *engine_id=NULL;
ENGINE *e=NULL;
#endif
-#if defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_MSDOS)
+#if defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_MSDOS) || defined(OPENSSL_SYS_NETWARE)
struct timeval tv;
#endif
@@ -640,7 +640,7 @@ re_start:
if (!ssl_pending)
{
-#if !defined(OPENSSL_SYS_WINDOWS) && !defined(OPENSSL_SYS_MSDOS)
+#if !defined(OPENSSL_SYS_WINDOWS) && !defined(OPENSSL_SYS_MSDOS) && !defined(OPENSSL_SYS_NETWARE)
if (tty_on)
{
if (read_tty) FD_SET(fileno(stdin),&readfds);
@@ -770,7 +770,7 @@ re_start:
goto shut;
}
}
-#if defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_MSDOS)
+#if defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_MSDOS) || defined(OPENSSL_SYS_NETWARE)
/* Assume Windows/DOS can always write */
else if (!ssl_pending && write_tty)
#else
@@ -857,6 +857,8 @@ printf("read=%d pending=%d peek=%d\n",k,SSL_pending(con),SSL_peek(con,zbuf,10240
#else
else if ((_kbhit()) || (WAIT_OBJECT_0 == WaitForSingleObject(GetStdHandle(STD_INPUT_HANDLE), 0)))
#endif
+#elif defined (OPENSSL_SYS_NETWARE)
+ else if (_kbhit())
#else
else if (FD_ISSET(fileno(stdin),&readfds))
#endif
diff --git a/apps/s_server.c b/apps/s_server.c
index 9b8fe570cc..c342a2ba66 100644
--- a/apps/s_server.c
+++ b/apps/s_server.c
@@ -124,13 +124,17 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
-#include <sys/types.h>
+
#include <sys/stat.h>
#include <openssl/e_os2.h>
#ifdef OPENSSL_NO_STDIO
#define APPS_WIN16
#endif
+#if !defined(OPENSSL_SYS_NETWARE) /* conflicts with winsock2 stuff on netware */
+#include <sys/types.h>
+#endif
+
/* With IPv6, it looks like Digital has mixed up the proper order of
recursive header file inclusion, resulting in the compiler complaining
that u_int isn't defined, but only if _POSIX_C_SOURCE is defined, which
@@ -997,7 +1001,7 @@ static int sv_body(char *hostname, int s, unsigned char *context)
unsigned long l;
SSL *con=NULL;
BIO *sbio;
-#if defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_MSDOS)
+#if defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_MSDOS) || defined(OPENSSL_SYS_NETWARE)
struct timeval tv;
#endif
@@ -1071,7 +1075,7 @@ static int sv_body(char *hostname, int s, unsigned char *context)
if (!read_from_sslcon)
{
FD_ZERO(&readfds);
-#if !defined(OPENSSL_SYS_WINDOWS) && !defined(OPENSSL_SYS_MSDOS)
+#if !defined(OPENSSL_SYS_WINDOWS) && !defined(OPENSSL_SYS_MSDOS) && !defined(OPENSSL_SYS_NETWARE)
FD_SET(fileno(stdin),&readfds);
#endif
FD_SET(s,&readfds);
@@ -1081,7 +1085,7 @@ static int sv_body(char *hostname, int s, unsigned char *context)
* the compiler: if you do have a cast then you can either
* go for (int *) or (void *).
*/
-#if defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_MSDOS)
+#if defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_MSDOS) || defined(OPENSSL_SYS_NETWARE)
/* Under DOS (non-djgpp) and Windows we can't select on stdin: only
* on sockets. As a workaround we timeout the select every
* second and check for any keypress. In a proper Windows
@@ -1501,7 +1505,9 @@ static int www_body(char *hostname, int s, unsigned char *context)
else
{
BIO_printf(bio_s_out,"read R BLOCK\n");
-#if !defined(OPENSSL_SYS_MSDOS) && !defined(__DJGPP__)
+#if defined(OPENSSL_SYS_NETWARE)
+ delay(1000);
+#elif !defined(OPENSSL_SYS_MSDOS) && !defined(__DJGPP__)
sleep(1);
#endif
continue;
diff --git a/apps/s_socket.c b/apps/s_socket.c
index 9a696d5f93..ff8c282a1e 100644
--- a/apps/s_socket.c
+++ b/apps/s_socket.c
@@ -88,7 +88,7 @@ typedef unsigned int u_int;
#ifndef OPENSSL_NO_SOCK
static struct hostent *GetHostByName(char *name);
-#ifdef OPENSSL_SYS_WINDOWS
+#if defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_NETWARE)
static void ssl_sock_cleanup(void);
#endif
static int ssl_sock_init(void);
@@ -104,6 +104,10 @@ static int host_ip(char *str, unsigned char ip[4]);
#define SOCKET_PROTOCOL IPPROTO_TCP
#endif
+#ifdef OPENSSL_SYS_NETWARE
+static int wsa_init_done=0;
+#endif
+
#ifdef OPENSSL_SYS_WINDOWS
static struct WSAData wsa_state;
static int wsa_init_done=0;
@@ -152,6 +156,15 @@ static void ssl_sock_cleanup(void)
WSACleanup();
}
}
+#elif defined(OPENSSL_SYS_NETWARE)
+static void sock_cleanup(void)
+ {
+ if (wsa_init_done)
+ {
+ wsa_init_done=0;
+ WSACleanup();
+ }
+ }
#endif
static int ssl_sock_init(void)
@@ -187,6 +200,27 @@ static int ssl_sock_init(void)
SetWindowLong(topWnd,GWL_WNDPROC,(LONG)lpTopHookProc);
#endif /* OPENSSL_SYS_WIN16 */
}
+#elif defined(OPENSSL_SYS_NETWARE)
+ WORD wVerReq;
+ WSADATA wsaData;
+ int err;
+
+ if (!wsa_init_done)
+ {
+
+# ifdef SIGINT
+ signal(SIGINT,(void (*)(int))sock_cleanup);
+# endif
+
+ wsa_init_done=1;
+ wVerReq = MAKEWORD( 2, 0 );
+ err = WSAStartup(wVerReq,&wsaData);
+ if (err != 0)
+ {
+ BIO_printf(bio_err,"unable to start WINSOCK2, error code=%d\n",err);
+ return(0);
+ }
+ }
#endif /* OPENSSL_SYS_WINDOWS */
return(1);
}
@@ -348,7 +382,7 @@ redoit:
ret=accept(acc_sock,(struct sockaddr *)&from,(void *)&len);
if (ret == INVALID_SOCKET)
{
-#ifdef OPENSSL_SYS_WINDOWS
+#if defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_NETWARE)
i=WSAGetLastError();
BIO_printf(bio_err,"accept error %d\n",i);
#else
diff --git a/apps/s_time.c b/apps/s_time.c
index 1ad16cd607..1134020d2a 100644
--- a/apps/s_time.c
+++ b/apps/s_time.c
@@ -85,7 +85,7 @@
#include OPENSSL_UNISTD
#endif
-#if !defined(OPENSSL_SYS_MSDOS) && !defined(OPENSSL_SYS_VXWORKS) && (!defined(OPENSSL_SYS_VMS) || defined(__DECC))
+#if !defined(OPENSSL_SYS_NETWARE) && !defined(OPENSSL_SYS_MSDOS) && !defined(OPENSSL_SYS_VXWORKS) && (!defined(OPENSSL_SYS_VMS) || defined(__DECC))
#define TIMES
#endif
@@ -105,7 +105,7 @@
#undef TIMES
#endif
-#if !defined(TIMES) && !defined(OPENSSL_SYS_VXWORKS)
+#if !defined(TIMES) && !defined(OPENSSL_SYS_VXWORKS) && !defined(OPENSSL_SYS_NETWARE)
#include <sys/timeb.h>
#endif
@@ -384,6 +384,20 @@ static double tm_Time_F(int s)
ret=((double)(tend.tms_utime-tstart.tms_utime))/HZ;
return((ret == 0.0)?1e-6:ret);
}
+#elif defined(OPENSSL_SYS_NETWARE)
+ static clock_t tstart,tend;
+
+ if (s == START)
+ {
+ tstart=clock();
+ return(0);
+ }
+ else
+ {
+ tend=clock();
+ ret=(double)((double)(tend)-(double)(tstart));
+ return((ret < 0.001)?0.001:ret);
+ }
#elif defined(OPENSSL_SYS_VXWORKS)
{
static unsigned long tick_start, tick_end;
diff --git a/apps/speed.c b/apps/speed.c
index d9dd1b65d7..d15b06e241 100644
--- a/apps/speed.c
+++ b/apps/speed.c
@@ -88,7 +88,7 @@
#include <stdio.h>
#include <stdlib.h>
-#include <signal.h>
+
#include <string.h>
#include <math.h>
#include "apps.h"
@@ -104,6 +104,10 @@
#include OPENSSL_UNISTD
#endif
+#ifndef OPENSSL_SYS_NETWARE
+#include <signal.h>
+#endif
+
#if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(OPENSSL_SYS_MACOSX)
# define USE_TOD
#elif !defined(OPENSSL_SYS_MSDOS) && !defined(OPENSSL_SYS_VXWORKS) && (!defined(OPENSSL_SYS_VMS) || defined(__DECC))
@@ -113,6 +117,12 @@
# define TIMEB
#endif
+#if defined(OPENSSL_SYS_NETWARE)
+#undef TIMES
+#undef TIMEB
+#include <time.h>
+#endif
+
#ifndef _IRIX
# include <time.h>
#endif
@@ -137,7 +147,7 @@
#include <sys/timeb.h>
#endif
-#if !defined(TIMES) && !defined(TIMEB) && !defined(USE_TOD) && !defined(OPENSSL_SYS_VXWORKS)
+#if !defined(TIMES) && !defined(TIMEB) && !defined(USE_TOD) && !defined(OPENSSL_SYS_VXWORKS) && !defined(OPENSSL_SYS_NETWARE)
#error "It seems neither struct tms nor struct timeb is supported in this platform!"
#endif
@@ -236,7 +246,7 @@
# endif
#endif
-#if !defined(OPENSSL_SYS_VMS) && !defined(OPENSSL_SYS_WINDOWS) && !defined(OPENSSL_SYS_MACINTOSH_CLASSIC) && !defined(OPENSSL_SYS_OS2)
+#if !defined(OPENSSL_SYS_VMS) && !defined(OPENSSL_SYS_WINDOWS) && !defined(OPENSSL_SYS_MACINTOSH_CLASSIC) && !defined(OPENSSL_SYS_OS2) && !defined(OPENSSL_SYS_NETWARE)
# define HAVE_FORK 1
#endif
@@ -298,6 +308,32 @@ static SIGRETTYPE sig_done(int sig)
#define START 0
#define STOP 1
+#if defined(OPENSSL_SYS_NETWARE)
+
+ /* for NetWare the best we can do is use clock() which returns the
+ * time, in hundredths of a second, since the NLM began executing
+ */
+static double Time_F(int s)
+ {
+ double ret;
+
+ static clock_t tstart,tend;
+
+ if (s == START)
+ {
+ tstart=clock();
+ return(0);
+ }
+ else
+ {
+ tend=clock();
+ ret=(double)((double)(tend)-(double)(tstart));
+ return((ret < 0.001)?0.001:ret);
+ }
+ }
+
+#else
+
static double Time_F(int s)
{
double ret;
@@ -406,6 +442,7 @@ static double Time_F(int s)
# endif
#endif
}
+#endif /* if defined(OPENSSL_SYS_NETWARE) */
static const int KDF1_SHA1_len = 20;
diff --git a/crypto/bf/bf_opts.c b/crypto/bf/bf_opts.c
index 171dada2ca..1721bb99b4 100644
--- a/crypto/bf/bf_opts.c
+++ b/crypto/bf/bf_opts.c
@@ -69,7 +69,10 @@
#include OPENSSL_UNISTD_IO
OPENSSL_DECLARE_EXIT
+#ifndef OPENSSL_SYS_NETWARE
#include <signal.h>
+#endif
+
#ifndef _IRIX
#include <time.h>
#endif
diff --git a/crypto/bf/bfspeed.c b/crypto/bf/bfspeed.c
index f346af64f3..c41ef3b403 100644
--- a/crypto/bf/bfspeed.c
+++ b/crypto/bf/bfspeed.c
@@ -69,7 +69,10 @@
#include OPENSSL_UNISTD_IO
OPENSSL_DECLARE_EXIT
+#ifndef OPENSSL_SYS_NETWARE
#include <signal.h>
+#endif
+
#ifndef _IRIX
#include <time.h>
#endif
diff --git a/crypto/bf/bftest.c b/crypto/bf/bftest.c
index 14bc4d7c8b..97e6634d37 100644
--- a/crypto/bf/bftest.c
+++ b/crypto/bf/bftest.c
@@ -278,6 +278,9 @@ int main(int argc, char *argv[])
else
ret=test();
+#ifdef OPENSSL_SYS_NETWARE
+ if (ret) printf("ERROR: %d\n", ret);
+#endif
EXIT(ret);
return(0);
}
diff --git a/crypto/bio/b_sock.c b/crypto/bio/b_sock.c
index c501008028..d619bcf995 100644
--- a/crypto/bio/b_sock.c
+++ b/crypto/bio/b_sock.c
@@ -79,7 +79,7 @@
#define MAX_LISTEN 32
#endif
-#ifdef OPENSSL_SYS_WINDOWS
+#if defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_NETWARE)
static int wsa_init_done=0;
#endif
@@ -473,6 +473,31 @@ int BIO_sock_init(void)
if (sock_init())
return (-1);
#endif
+
+#if defined(OPENSSL_SYS_NETWARE)
+ WORD wVerReq;
+ WSADATA wsaData;
+ int err;
+
+ if (!wsa_init_done)
+ {
+
+# ifdef SIGINT
+ signal(SIGINT,(void (*)(int))BIO_sock_cleanup);
+# endif
+
+ wsa_init_done=1;
+ wVerReq = MAKEWORD( 2, 0 );
+ err = WSAStartup(wVerReq,&wsaData);
+ if (err != 0)
+ {
+ SYSerr(SYS_F_WSASTARTUP,err);
+ BIOerr(BIO_F_BIO_SOCK_INIT,BIO_R_WSASTARTUP);
+ return(-1);
+ }
+ }
+#endif
+
return(1);
}
@@ -487,6 +512,12 @@ void BIO_sock_cleanup(void)
#endif
WSACleanup();
}
+#elif defined(OPENSSL_SYS_NETWARE)
+ if (wsa_init_done)
+ {
+ wsa_init_done=0;
+ WSACleanup();
+ }
#endif
}
diff --git a/crypto/bio/bss_file.c b/crypto/bio/bss_file.c
index 1f9bd3312a..774bc5a7e7 100644
--- a/crypto/bio/bss_file.c
+++ b/crypto/bio/bss_file.c
@@ -218,6 +218,13 @@ static long MS_CALLBACK file_ctrl(BIO *b, int cmd, long num, void *ptr)
_setmode(fd,_O_TEXT);
else
_setmode(fd,_O_BINARY);
+#elif defined(OPENSSL_SYS_NETWARE) && defined(NETWARE_CLIB)
+ /* Under CLib there are differences in file modes
+ */
+ if (num & BIO_FP_TEXT)
+ _setmode(fileno((FILE *)ptr),O_TEXT);
+ else
+ _setmode(fileno((FILE *)ptr),O_BINARY);
#elif defined(OPENSSL_SYS_MSDOS)
{
int fd = fileno((FILE*)ptr);
@@ -270,7 +277,13 @@ static long MS_CALLBACK file_ctrl(BIO *b, int cmd, long num, void *ptr)
else
strcat(p,"t");
#endif
- fp=fopen(ptr,p);
+#if defined(OPENSSL_SYS_NETWARE)
+ if (!(num & BIO_FP_TEXT))
+ strcat(p,"b");
+ else
+ strcat(p,"t");
+#endif
+fp=fopen(ptr,p);
if (fp == NULL)
{
SYSerr(SYS_F_FOPEN,get_last_sys_error());
diff --git a/crypto/bio/bss_log.c b/crypto/bio/bss_log.c
index 1eb678cac0..6360dbc820 100644
--- a/crypto/bio/bss_log.c
+++ b/crypto/bio/bss_log.c
@@ -78,6 +78,8 @@
# include <starlet.h>
#elif defined(__ultrix)
# include <sys/syslog.h>
+#elif defined(OPENSSL_SYS_NETWARE)
+# define NO_SYSLOG
#elif (!defined(MSDOS) || defined(WATT32)) && !defined(OPENSSL_SYS_VXWORKS) && !defined(NO_SYSLOG)
# include <syslog.h>
#endif
diff --git a/crypto/bio/bss_sock.c b/crypto/bio/bss_sock.c
index 7207a1fb87..472dd75821 100644
--- a/crypto/bio/bss_sock.c
+++ b/crypto/bio/bss_sock.c
@@ -246,7 +246,7 @@ int BIO_sock_non_fatal_error(int err)
{
switch (err)
{
-#if defined(OPENSSL_SYS_WINDOWS)
+#if defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_NETWARE)
# if defined(WSAEWOULDBLOCK)
case WSAEWOULDBLOCK:
# endif
diff --git a/crypto/bn/exptest.c b/crypto/bn/exptest.c
index b09cf88705..37aec55b89 100644
--- a/crypto/bn/exptest.c
+++ b/crypto/bn/exptest.c
@@ -181,6 +181,9 @@ int main(int argc, char *argv[])
err:
ERR_load_crypto_strings();
ERR_print_errors(out);
+#ifdef OPENSSL_SYS_NETWARE
+ printf("ERROR\n");
+#endif
EXIT(1);
return(1);
}
diff --git a/crypto/buffer/buffer.h b/crypto/buffer/buffer.h
index 164f8aa6ee..7f557c21c3 100644
--- a/crypto/buffer/buffer.h
+++ b/crypto/buffer/buffer.h
@@ -64,7 +64,10 @@ extern "C" {
#endif
#include <stddef.h>
+
+#if !defined(NO_SYS_TYPES_H)
#include <sys/types.h>
+#endif
typedef struct buf_mem_st
{
diff --git a/crypto/cast/cast_spd.c b/crypto/cast/cast_spd.c
index 76abf50d98..d650af475c 100644
--- a/crypto/cast/cast_spd.c
+++ b/crypto/cast/cast_spd.c
@@ -69,7 +69,10 @@
#include OPENSSL_UNISTD_IO
OPENSSL_DECLARE_EXIT
+#ifndef OPENSSL_SYS_NETWARE
#include <signal.h>
+#endif
+
#ifndef _IRIX
#include <time.h>
#endif
diff --git a/crypto/cast/castopts.c b/crypto/cast/castopts.c
index 1b858d153b..33b2c7b06f 100644
--- a/crypto/cast/castopts.c
+++ b/crypto/cast/castopts.c
@@ -69,7 +69,10 @@
#include OPENSSL_UNISTD_IO
OPENSSL_DECLARE_EXIT
+#ifndef OPENSSL_SYS_NETWARE
#include <signal.h>
+#endif
+
#ifndef _IRIX
#include <time.h>
#endif
diff --git a/crypto/des/des_opts.c b/crypto/des/des_opts.c
index 79278b920e..2df82962c5 100644
--- a/crypto/des/des_opts.c
+++ b/crypto/des/des_opts.c
@@ -71,7 +71,11 @@
#include <io.h>
extern void exit();
#endif
+
+#ifndef OPENSSL_SYS_NETWARE
#include <signal.h>
+#endif
+
#ifndef _IRIX
#include <time.h>
#endif
diff --git a/crypto/des/destest.c b/crypto/des/destest.c
index 788f552c88..4584cf3004 100644
--- a/crypto/des/destest.c
+++ b/crypto/des/destest.c
@@ -821,6 +821,9 @@ plain[8+4], plain[8+5], plain[8+6], plain[8+7]);
printf("fast crypt error, %s should be yA1Rp/1hZXIJk\n",str);
err=1;
}
+#ifdef OPENSSL_SYS_NETWARE
+ if (err) printf("ERROR: %d\n", err);
+#endif
printf("\n");
return(err);
}
diff --git a/crypto/des/speed.c b/crypto/des/speed.c
index 48fc1d49fc..1616f4b7c9 100644
--- a/crypto/des/speed.c
+++ b/crypto/des/speed.c
@@ -69,7 +69,11 @@
#include OPENSSL_UNISTD_IO
OPENSSL_DECLARE_EXIT
+#ifndef OPENSSL_SYS_NETWARE
#include <signal.h>
+#define crypt(c,s) (des_crypt((c),(s)))
+#endif
+
#ifndef _IRIX
#include <time.h>
#endif
diff --git a/crypto/dh/dhtest.c b/crypto/dh/dhtest.c
index 492fbeefa2..1b193649d3 100644
--- a/crypto/dh/dhtest.c
+++ b/crypto/dh/dhtest.c
@@ -197,9 +197,9 @@ err:
if(b != NULL) DH_free(b);
if(a != NULL) DH_free(a);
BIO_free(out);
- CRYPTO_cleanup_all_ex_data();
- ERR_remove_state(0);
- CRYPTO_mem_leaks_fp(stderr);
+#ifdef OPENSSL_SYS_NETWARE
+ if (ret) printf("ERROR: %d\n", ret);
+#endif
EXIT(ret);
return(ret);
}
diff --git a/crypto/dsa/dsatest.c b/crypto/dsa/dsatest.c
index 1dbda6801b..ccc456eab7 100644
--- a/crypto/dsa/dsatest.c
+++ b/crypto/dsa/dsatest.c
@@ -221,6 +221,9 @@ end:
BIO_free(bio_err);
bio_err = NULL;
}
+#ifdef OPENSSL_SYS_NETWARE
+ if (!ret) printf("ERROR\n");
+#endif
EXIT(!ret);
return(0);
}
diff --git a/crypto/idea/idea_spd.c b/crypto/idea/idea_spd.c
index 48ffaff520..699353e871 100644
--- a/crypto/idea/idea_spd.c
+++ b/crypto/idea/idea_spd.c
@@ -69,7 +69,10 @@
#include OPENSSL_UNISTD_IO
OPENSSL_DECLARE_EXIT
+#ifndef OPENSSL_SYS_NETWARE
#include <signal.h>
+#endif
+
#ifndef _IRIX
#include <time.h>
#endif
diff --git a/crypto/idea/ideatest.c b/crypto/idea/ideatest.c
index 98f805d72a..e6ffc7025e 100644
--- a/crypto/idea/ideatest.c
+++ b/crypto/idea/ideatest.c
@@ -169,6 +169,9 @@ int main(int argc, char *argv[])
else
printf("ok\n");
+#ifdef OPENSSL_SYS_NETWARE
+ if (err) printf("ERROR: %d\n", err);
+#endif
EXIT(err);
return(err);
}
diff --git a/crypto/md2/md2test.c b/crypto/md2/md2test.c
index 9c1e28b6ce..13cbec4ab0 100644
--- a/crypto/md2/md2test.c
+++ b/crypto/md2/md2test.c
@@ -124,6 +124,9 @@ int main(int argc, char *argv[])
R++;
P++;
}
+#ifdef OPENSSL_SYS_NETWARE
+ if (err) printf("ERROR: %d\n", err);
+#endif
EXIT(err);
}
diff --git a/crypto/md32_common.h b/crypto/md32_common.h
index 511e5b2aa6..0cdc06e31e 100644
--- a/crypto/md32_common.h
+++ b/crypto/md32_common.h
@@ -184,6 +184,8 @@
# elif defined(__MWERKS__)
# if defined(__POWERPC__)
# define ROTATE(a,n) __rlwinm(a,n,0,31)
+# elif defined(OPENSSL_SYSNAME_NETWARE)
+# define ROTATE(a,n) _lrotl(a,n)
# elif defined(__MC68K__)
/* Motorola specific tweak. <appro@fy.chalmers.se> */
# define ROTATE(a,n) ( n<24 ? __rol(a,n) : __ror(a,32-n) )
diff --git a/crypto/md5/md5test.c b/crypto/md5/md5test.c
index bfd62629ed..667b6be344 100644
--- a/crypto/md5/md5test.c
+++ b/crypto/md5/md5test.c
@@ -120,6 +120,10 @@ int main(int argc, char *argv[])
R++;
P++;
}
+
+#ifdef OPENSSL_SYS_NETWARE
+ if (err) printf("ERROR: %d\n", err);
+#endif
EXIT(err);
return(0);
}
diff --git a/crypto/mdc2/mdc2test.c b/crypto/mdc2/mdc2test.c
index c9abe99d92..017b31add2 100644
--- a/crypto/mdc2/mdc2test.c
+++ b/crypto/mdc2/mdc2test.c
@@ -140,6 +140,9 @@ int main(int argc, char *argv[])
printf("pad2 - ok\n");
EVP_MD_CTX_cleanup(&c);
+#ifdef OPENSSL_SYS_NETWARE
+ if (ret) printf("ERROR: %d\n", ret);
+#endif
EXIT(ret);
return(ret);
}
diff --git a/crypto/perlasm/x86asm.pl b/crypto/perlasm/x86asm.pl
index 1cb96e914a..f9c7c37aca 100644
--- a/crypto/perlasm/x86asm.pl
+++ b/crypto/perlasm/x86asm.pl
@@ -18,7 +18,7 @@ sub main'asm_init
($type,$fn,$i386)=@_;
$filename=$fn;
- $elf=$cpp=$sol=$aout=$win32=$gaswin=0;
+ $elf=$cpp=$sol=$aout=$win32=$gaswin=$netware=0;
if ( ($type eq "elf"))
{ $elf=1; require "x86unix.pl"; }
elsif ( ($type eq "a.out"))
@@ -33,6 +33,10 @@ sub main'asm_init
{ $win32=1; require "x86ms.pl"; }
elsif ( ($type eq "win32n"))
{ $win32=1; require "x86nasm.pl"; }
+ elsif ( ($type eq "nw-nasm"))
+ { $netware=1; require "x86nasm_nw.pl"; }
+ elsif ( ($type eq "nw-mwasm"))
+ { $netware=1; require "x86mwasm_nw.pl"; }
else
{
print STDERR <<"EOF";
@@ -43,6 +47,8 @@ Pick one target type from
cpp - format so x86unix.cpp can be used
win32 - Windows 95/Windows NT
win32n - Windows 95/Windows NT NASM format
+ nw-nasm - NetWare NASM format
+ nw-mwasm- NetWare Metrowerks Assembler
EOF
exit(1);
}
diff --git a/crypto/perlasm/x86mwasm_nw.pl b/crypto/perlasm/x86mwasm_nw.pl
new file mode 100644
index 0000000000..7a691851c2
--- /dev/null
+++ b/crypto/perlasm/x86mwasm_nw.pl
@@ -0,0 +1,363 @@
+#!/usr/local/bin/perl
+
+# x86 CodeWarrior assembler for NetWare
+
+# This file is a slightly modified version of x86nasm.pl. The Metrowerks
+# compiler for NetWare doesn't prefix symbols with an underscore.
+#
+
+$label="L000";
+
+%lb=( 'eax', 'al',
+ 'ebx', 'bl',
+ 'ecx', 'cl',
+ 'edx', 'dl',
+ 'ax', 'al',
+ 'bx', 'bl',
+ 'cx', 'cl',
+ 'dx', 'dl',
+ );
+
+%hb=( 'eax', 'ah',
+ 'ebx', 'bh',
+ 'ecx', 'ch',
+ 'edx', 'dh',
+ 'ax', 'ah',
+ 'bx', 'bh',
+ 'cx', 'ch',
+ 'dx', 'dh',
+ );
+
+sub main'asm_init_output
+{
+ @out=();
+ &comment("NetWare: assembly for CodeWarrior assembler (mwasmnlm)");
+}
+sub main'asm_get_output { return(@out); }
+sub main'get_labels { return(@labels); }
+
+sub main'external_label
+{
+ push(@labels,@_);
+ foreach (@_) {
+ push(@out, ".extern\t$_\n");
+ }
+}
+
+sub main'LB
+ {
+ (defined($lb{$_[0]})) || die "$_[0] does not have a 'low byte'\n";
+ return($lb{$_[0]});
+ }
+
+sub main'HB
+ {
+ (defined($hb{$_[0]})) || die "$_[0] does not have a 'high byte'\n";
+ return($hb{$_[0]});
+ }
+
+sub main'BP
+ {
+ &get_mem("BYTE",@_);
+ }
+
+sub main'DWP
+ {
+ &get_mem("DWORD",@_);
+ }
+
+sub main'BC
+ {
+ return "@_";
+ }
+
+sub main'DWC
+ {
+ return "@_";
+ }
+
+sub main'stack_push
+ {
+ my($num)=@_;
+ $stack+=$num*4;
+ &main'sub("esp",$num*4);
+ }
+
+sub main'stack_pop
+ {
+ my($num)=@_;
+ $stack-=$num*4;
+ &main'add("esp",$num*4);
+ }
+
+sub get_mem
+ {
+ my($size,$addr,$reg1,$reg2,$idx)=@_;
+ my($t,$post);
+ my($ret)="$size PTR [";
+ $addr =~ s/^\s+//;
+ if ($addr =~ /^(.+)\+(.+)$/)
+ {
+ $reg2=&conv($1);
+ $addr="$2";
+ }
+ elsif ($addr =~ /^[_a-zA-Z]/)
+ {
+ $addr="$addr";
+ }
+
+ if ($addr =~ /^.+\-.+$/) { $addr="($addr)"; }
+
+ $reg1="$regs{$reg1}" if defined($regs{$reg1});
+ $reg2="$regs{$reg2}" if defined($regs{$reg2});
+ if (($addr ne "") && ($addr ne 0))
+ {
+ if ($addr !~ /^-/)
+ { $ret.="${addr}+"; }
+ else { $post=$addr; }
+ }
+ if ($reg2 ne "")
+ {
+ $t="";
+ $t="*$idx" if ($idx != 0);
+ $reg1="+".$reg1 if ("$reg1$post" ne "");
+ $ret.="$reg2$t$reg1$post]";
+ }
+ else
+ {
+ $ret.="$reg1$post]"
+ }
+ $ret =~ s/\+\]/]/; # in case $addr was the only argument
+ return($ret);
+ }
+
+sub main'mov { &out2("mov",@_); }
+sub main'movb { &out2("mov",@_); }
+sub main'and { &out2("and",@_); }
+sub main'or { &out2("or",@_); }
+sub main'shl { &out2("shl",@_); }
+sub main'shr { &out2("shr",@_); }
+sub main'xor { &out2("xor",@_); }
+sub main'xorb { &out2("xor",@_); }
+sub main'add { &out2("add",@_); }
+sub main'adc { &out2("adc",@_); }
+sub main'sub { &out2("sub",@_); }
+sub main'rotl { &out2("rol",@_); }
+sub main'rotr { &out2("ror",@_); }
+sub main'exch { &out2("xchg",@_); }
+sub main'cmp { &out2("cmp",@_); }
+sub main'lea { &out2("lea",@_); }
+sub main'mul { &out1("mul",@_); }
+sub main'div { &out1("div",@_); }
+sub main'dec { &out1("dec",@_); }
+sub main'inc { &out1("inc",@_); }
+sub main'jmp { &out1("jmp",@_); }
+sub main'jmp_ptr { &out1p("jmp",@_); }
+
+sub main'je { &out1("je ",@_); }
+sub main'jle { &out1("jle ",@_); }
+sub main'jz { &out1("jz ",@_); }
+sub main'jge { &out1("jge ",@_); }
+sub main'jl { &out1("jl ",@_); }
+sub main'ja { &out1("ja ",@_); }
+sub main'jae { &out1("jae ",@_); }
+sub main'jb { &out1("jb ",@_); }
+sub main'jbe { &out1("jbe ",@_); }
+sub main'jc { &out1("jc ",@_); }
+sub main'jnc { &out1("jnc ",@_); }
+sub main'jnz { &out1("jnz ",@_); }
+sub main'jne { &out1("jne ",@_); }
+sub main'jno { &out1("jno ",@_); }
+
+sub main'push { &out1("push",@_); $stack+=4; }
+sub main'pop { &out1("pop",@_); $stack-=4; }
+sub main'bswap { &out1("bswap",@_); &using486(); }
+sub main'not { &out1("not",@_); }
+sub main'call { &out1("call",$_[0]); }
+sub main'ret { &out0("ret"); }
+sub main'nop { &out0("nop"); }
+
+sub out2
+ {
+ my($name,$p1,$p2)=@_;
+ my($l,$t);
+
+ push(@out,"\t$name\t");
+ $t=&conv($p1).",";
+ $l=length($t);
+ push(@out,$t);
+ $l=4-($l+9)/8;
+ push(@out,"\t" x $l);
+ push(@out,&conv($p2));
+ push(@out,"\n");
+ }
+
+sub out0
+ {
+ my($name)=@_;
+
+ push(@out,"\t$name\n");
+ }
+
+sub out1
+ {
+ my($name,$p1)=@_;
+ my($l,$t);
+ push(@out,"\t$name\t".&conv($p1)."\n");
+ }
+
+sub conv
+ {
+ my($p)=@_;
+ $p =~ s/0x([0-9A-Fa-f]+)/0$1h/;
+ return $p;
+ }
+
+sub using486
+ {
+ return if $using486;
+ $using486++;
+ grep(s/\.386/\.486/,@out);
+ }
+
+sub main'file
+ {
+ push(@out, ".section .text\n");
+ }
+
+sub main'function_begin
+ {
+ my($func,$extra)=@_;
+
+ push(@labels,$func);
+ my($tmp)=<<"EOF";
+.global $func
+$func:
+ push ebp
+ push ebx
+ push esi
+ push edi
+EOF
+ push(@out,$tmp);
+ $stack=20;
+ }
+
+sub main'function_begin_B
+ {
+ my($func,$extra)=@_;
+ my($tmp)=<<"EOF";
+.global $func
+$func:
+EOF
+ push(@out,$tmp);
+ $stack=4;
+ }
+
+sub main'function_end
+ {
+ my($func)=@_;
+
+ my($tmp)=<<"EOF";
+ pop edi
+ pop esi
+ pop ebx
+ pop ebp
+ ret
+EOF
+ push(@out,$tmp);
+ $stack=0;
+ %label=();
+ }
+
+sub main'function_end_B
+ {
+ $stack=0;
+ %label=();
+ }
+
+sub main'function_end_A
+ {
+ my($func)=@_;
+
+ my($tmp)=<<"EOF";
+ pop edi
+ pop esi
+ pop ebx
+ pop ebp
+ ret
+EOF
+ push(@out,$tmp);
+ }
+
+sub main'file_end
+ {
+ }
+
+sub main'wparam
+ {
+ my($num)=@_;
+
+ return(&main'DWP($stack+$num*4,"esp","",0));
+ }
+
+sub main'swtmp
+ {
+ return(&main'DWP($_[0]*4,"esp","",0));
+ }
+
+# Should use swtmp, which is above esp. Linix can trash the stack above esp
+#sub main'wtmp
+# {
+# my($num)=@_;
+#
+# return(&main'DWP(-(($num+1)*4),"esp","",0));
+# }
+
+sub main'comment
+ {
+ foreach (@_)
+ {
+ push(@out,"\t; $_\n");
+ }
+ }
+
+sub main'label
+ {
+ if (!defined($label{$_[0]}))
+ {
+ $label{$_[0]}="${label}${_[0]}";
+ $label++;
+ }
+ return($label{$_[0]});
+ }
+
+sub main'set_label
+ {
+ if (!defined($label{$_[0]}))
+ {
+ $label{$_[0]}="${label}${_[0]}";
+ $label++;
+ }
+ push(@out,"$label{$_[0]}:\n");
+ }
+
+sub main'data_word
+ {
+ push(@out,"\t.long\t$_[0]\n");
+ }
+
+sub out1p
+ {
+ my($name,$p1)=@_;
+ my($l,$t);
+
+ push(@out,"\t$name\t ".&conv($p1)."\n");
+ }
+
+sub main'picmeup
+ {
+ local($dst,$sym)=@_;
+ &main'lea($dst,&main'DWP($sym));
+ }
+
+sub main'blindpop { &out1("pop",@_); }
diff --git a/crypto/perlasm/x86nasm_nw.pl b/crypto/perlasm/x86nasm_nw.pl
new file mode 100644
index 0000000000..e64766cf03
--- /dev/null
+++ b/crypto/perlasm/x86nasm_nw.pl
@@ -0,0 +1,364 @@
+#!/usr/local/bin/perl
+
+# x86 nasm assembler for NetWare
+
+# This file is a slightly modified version of x86nasm.pl. The Metrowerks
+# compiler for NetWare doesn't prefix symbols with an underscore.
+#
+
+$label="L000";
+
+%lb=( 'eax', 'al',
+ 'ebx', 'bl',
+ 'ecx', 'cl',
+ 'edx', 'dl',
+ 'ax', 'al',
+ 'bx', 'bl',
+ 'cx', 'cl',
+ 'dx', 'dl',
+ );
+
+%hb=( 'eax', 'ah',
+ 'ebx', 'bh',
+ 'ecx', 'ch',
+ 'edx', 'dh',
+ 'ax', 'ah',
+ 'bx', 'bh',
+ 'cx', 'ch',
+ 'dx', 'dh',
+ );
+
+sub main'asm_init_output
+{
+ @out=();
+ &comment("NetWare: assembly for NASM assembler (nasmw)");
+}
+sub main'asm_get_output { return(@out); }
+sub main'get_labels { return(@labels); }
+
+sub main'external_label
+{
+ push(@labels,@_);
+ foreach (@_) {
+ push(@out, "extern\t$_\n");
+ }
+}
+
+sub main'LB
+ {
+ (defined($lb{$_[0]})) || die "$_[0] does not have a 'low byte'\n";
+ return($lb{$_[0]});
+ }
+
+sub main'HB
+ {
+ (defined($hb{$_[0]})) || die "$_[0] does not have a 'high byte'\n";
+ return($hb{$_[0]});
+ }
+
+sub main'BP
+ {
+ &get_mem("BYTE",@_);
+ }
+
+sub main'DWP
+ {
+ &get_mem("DWORD",@_);
+ }
+
+sub main'BC
+ {
+ return "BYTE @_";
+ }
+
+sub main'DWC
+ {
+ return "DWORD @_";
+ }
+
+sub main'stack_push
+ {
+ my($num)=@_;
+ $stack+=$num*4;
+ &main'sub("esp",$num*4);
+ }
+
+sub main'stack_pop
+ {
+ my($num)=@_;
+ $stack-=$num*4;
+ &main'add("esp",$num*4);
+ }
+
+sub get_mem
+ {
+ my($size,$addr,$reg1,$reg2,$idx)=@_;
+ my($t,$post);
+ my($ret)="[";
+ $addr =~ s/^\s+//;
+ if ($addr =~ /^(.+)\+(.+)$/)
+ {
+ $reg2=&conv($1);
+ $addr="$2";
+ }
+ elsif ($addr =~ /^[_a-zA-Z]/)
+ {
+ $addr="$addr";
+ }
+
+ if ($addr =~ /^.+\-.+$/) { $addr="($addr)"; }
+
+ $reg1="$regs{$reg1}" if defined($regs{$reg1});
+ $reg2="$regs{$reg2}" if defined($regs{$reg2});
+ if (($addr ne "") && ($addr ne 0))
+ {
+ if ($addr !~ /^-/)
+ { $ret.="${addr}+"; }
+ else { $post=$addr; }
+ }
+ if ($reg2 ne "")
+ {
+ $t="";
+ $t="*$idx" if ($idx != 0);
+ $reg1="+".$reg1 if ("$reg1$post" ne "");
+ $ret.="$reg2$t$reg1$post]";
+ }
+ else
+ {
+ $ret.="$reg1$post]"
+ }
+ $ret =~ s/\+\]/]/; # in case $addr was the only argument
+ return($ret);
+ }
+
+sub main'mov { &out2("mov",@_); }
+sub main'movb { &out2("mov",@_); }
+sub main'and { &out2("and",@_); }
+sub main'or { &out2("or",@_); }
+sub main'shl { &out2("shl",@_); }
+sub main'shr { &out2("shr",@_); }
+sub main'xor { &out2("xor",@_); }
+sub main'xorb { &out2("xor",@_); }
+sub main'add { &out2("add",@_); }
+sub main'adc { &out2("adc",@_); }
+sub main'sub { &out2("sub",@_); }
+sub main'rotl { &out2("rol",@_); }
+sub main'rotr { &out2("ror",@_); }
+sub main'exch { &out2("xchg",@_); }
+sub main'cmp { &out2("cmp",@_); }
+sub main'lea { &out2("lea",@_); }
+sub main'mul { &out1("mul",@_); }
+sub main'div { &out1("div",@_); }
+sub main'dec { &out1("dec",@_); }
+sub main'inc { &out1("inc",@_); }
+sub main'jmp { &out1("jmp",@_); }
+sub main'jmp_ptr { &out1p("jmp",@_); }
+
+# This is a bit of a kludge: declare all branches as NEAR.
+sub main'je { &out1("je NEAR",@_); }
+sub main'jle { &out1("jle NEAR",@_); }
+sub main'jz { &out1("jz NEAR",@_); }
+sub main'jge { &out1("jge NEAR",@_); }
+sub main'jl { &out1("jl NEAR",@_); }
+sub main'ja { &out1("ja NEAR",@_); }
+sub main'jae { &out1("jae NEAR",@_); }
+sub main'jb { &out1("jb NEAR",@_); }
+sub main'jbe { &out1("jbe NEAR",@_); }
+sub main'jc { &out1("jc NEAR",@_); }
+sub main'jnc { &out1("jnc NEAR",@_); }
+sub main'jnz { &out1("jnz NEAR",@_); }
+sub main'jne { &out1("jne NEAR",@_); }
+sub main'jno { &out1("jno NEAR",@_); }
+
+sub main'push { &out1("push",@_); $stack+=4; }
+sub main'pop { &out1("pop",@_); $stack-=4; }
+sub main'bswap { &out1("bswap",@_); &using486(); }
+sub main'not { &out1("not",@_); }
+sub main'call { &out1("call",$_[0]); }
+sub main'ret { &out0("ret"); }
+sub main'nop { &out0("nop"); }
+
+sub out2
+ {
+ my($name,$p1,$p2)=@_;
+ my($l,$t);
+
+ push(@out,"\t$name\t");
+ $t=&conv($p1).",";
+ $l=length($t);
+ push(@out,$t);
+ $l=4-($l+9)/8;
+ push(@out,"\t" x $l);
+ push(@out,&conv($p2));
+ push(@out,"\n");
+ }
+
+sub out0
+ {
+ my($name)=@_;
+
+ push(@out,"\t$name\n");
+ }
+
+sub out1
+ {
+ my($name,$p1)=@_;
+ my($l,$t);
+ push(@out,"\t$name\t".&conv($p1)."\n");
+ }
+
+sub conv
+ {
+ my($p)=@_;
+ $p =~ s/0x([0-9A-Fa-f]+)/0$1h/;
+ return $p;
+ }
+
+sub using486
+ {
+ return if $using486;
+ $using486++;
+ grep(s/\.386/\.486/,@out);
+ }
+
+sub main'file
+ {
+ push(@out, "segment .text\n");
+ }
+
+sub main'function_begin
+ {
+ my($func,$extra)=@_;
+
+ push(@labels,$func);
+ my($tmp)=<<"EOF";
+global $func
+$func:
+ push ebp
+ push ebx
+ push esi
+ push edi
+EOF
+ push(@out,$tmp);
+ $stack=20;
+ }
+
+sub main'function_begin_B
+ {
+ my($func,$extra)=@_;
+ my($tmp)=<<"EOF";
+global $func
+$func:
+EOF
+ push(@out,$tmp);
+ $stack=4;
+ }
+
+sub main'function_end
+ {
+ my($func)=@_;
+
+ my($tmp)=<<"EOF";
+ pop edi
+ pop esi
+ pop ebx
+ pop ebp
+ ret
+EOF
+ push(@out,$tmp);
+ $stack=0;
+ %label=();
+ }
+
+sub main'function_end_B
+ {
+ $stack=0;
+ %label=();
+ }
+
+sub main'function_end_A
+ {
+ my($func)=@_;
+
+ my($tmp)=<<"EOF";
+ pop edi
+ pop esi
+ pop ebx
+ pop ebp
+ ret
+EOF
+ push(@out,$tmp);
+ }
+
+sub main'file_end
+ {
+ }
+
+sub main'wparam
+ {
+ my($num)=@_;
+
+ return(&main'DWP($stack+$num*4,"esp","",0));
+ }
+
+sub main'swtmp
+ {
+ return(&main'DWP($_[0]*4,"esp","",0));
+ }
+
+# Should use swtmp, which is above esp. Linix can trash the stack above esp
+#sub main'wtmp
+# {
+# my($num)=@_;
+#
+# return(&main'DWP(-(($num+1)*4),"esp","",0));
+# }
+
+sub main'comment
+ {
+ foreach (@_)
+ {
+ push(@out,"\t; $_\n");
+ }
+ }
+
+sub main'label
+ {
+ if (!defined($label{$_[0]}))
+ {
+ $label{$_[0]}="\$${label}${_[0]}";
+ $label++;
+ }
+ return($label{$_[0]});
+ }
+
+sub main'set_label
+ {
+ if (!defined($label{$_[0]}))
+ {
+ $label{$_[0]}="${label}${_[0]}";
+ $label++;
+ }
+ push(@out,"$label{$_[0]}:\n");
+ }
+
+sub main'data_word
+ {
+ push(@out,"\tDD\t$_[0]\n");
+ }
+
+sub out1p
+ {
+ my($name,$p1)=@_;
+ my($l,$t);
+
+ push(@out,"\t$name\t ".&conv($p1)."\n");
+ }
+
+sub main'picmeup
+ {
+ local($dst,$sym)=@_;
+ &main'lea($dst,&main'DWP($sym));
+ }
+
+sub main'blindpop { &out1("pop",@_); }
diff --git a/crypto/rand/Makefile.ssl b/crypto/rand/Makefile.ssl
index 3065234e21..0f7899c267 100644
--- a/crypto/rand/Makefile.ssl
+++ b/crypto/rand/Makefile.ssl
@@ -24,9 +24,9 @@ APPS=
LIB=$(TOP)/libcrypto.a
LIBSRC=md_rand.c randfile.c rand_lib.c rand_err.c rand_egd.c \
- rand_win.c rand_unix.c rand_os2.c
+ rand_win.c rand_unix.c rand_os2.c rand_nw.c
LIBOBJ=md_rand.o randfile.o rand_lib.o rand_err.o rand_egd.o \
- rand_win.o rand_unix.o rand_os2.o
+ rand_win.o rand_unix.o rand_os2.o rand_nw.o
SRC= $(LIBSRC)
diff --git a/crypto/rand/rand_egd.c b/crypto/rand/rand_egd.c
index 1f168221e3..8e1efc15a5 100644
--- a/crypto/rand/rand_egd.c
+++ b/crypto/rand/rand_egd.c
@@ -94,7 +94,7 @@
* RAND_egd() is a wrapper for RAND_egd_bytes() with numbytes=255.
*/
-#if defined(OPENSSL_SYS_WIN32) || defined(OPENSSL_SYS_VMS) || defined(OPENSSL_SYS_MSDOS) || defined(OPENSSL_SYS_VXWORKS)
+#if defined(OPENSSL_SYS_WIN32) || defined(OPENSSL_SYS_VMS) || defined(OPENSSL_SYS_MSDOS) || defined(OPENSSL_SYS_VXWORKS) || defined(OPENSSL_SYS_NETWARE)
int RAND_query_egd_bytes(const char *path, unsigned char *buf, int bytes)
{
return(-1);
diff --git a/crypto/rand/rand_nw.c b/crypto/rand/rand_nw.c
new file mode 100644
index 0000000000..0ff884783e
--- /dev/null
+++ b/crypto/rand/rand_nw.c
@@ -0,0 +1,171 @@
+/* crypto/rand/rand_win.c */
+/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
+ * All rights reserved.
+ *
+ * This package is an SSL implementation written
+ * by Eric Young (eay@cryptsoft.com).
+ * The implementation was written so as to conform with Netscapes SSL.
+ *
+ * This library is free for commercial and non-commercial use as long as
+ * the following conditions are aheared to. The following conditions
+ * apply to all code found in this distribution, be it the RC4, RSA,
+ * lhash, DES, etc., code; not just the SSL code. The SSL documentation
+ * included with this distribution is covered by the same copyright terms
+ * except that the holder is Tim Hudson (tjh@cryptsoft.com).
+ *
+ * Copyright remains Eric Young's, and as such any Copyright notices in
+ * the code are not to be removed.
+ * If this package is used in a product, Eric Young should be given attribution
+ * as the author of the parts of the library used.
+ * This can be in the form of a textual message at program startup or
+ * in documentation (online or textual) provided with the package.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * "This product includes cryptographic software written by
+ * Eric Young (eay@cryptsoft.com)"
+ * The word 'cryptographic' can be left out if the rouines from the library
+ * being used are not cryptographic related :-).
+ * 4. If you include any Windows specific code (or a derivative thereof) from
+ * the apps directory (application code) you must include an acknowledgement:
+ * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
+ *
+ * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * The licence and distribution terms for any publically available version or
+ * derivative of this code cannot be changed. i.e. this code cannot simply be
+ * copied and put under another distribution licence
+ * [including the GNU Public Licence.]
+ */
+/* ====================================================================
+ * Copyright (c) 1998-2000 The OpenSSL Project. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. All advertising materials mentioning features or use of this
+ * software must display the following acknowledgment:
+ * "This product includes software developed by the OpenSSL Project
+ * for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
+ *
+ * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
+ * endorse or promote products derived from this software without
+ * prior written permission. For written permission, please contact
+ * openssl-core@openssl.org.
+ *
+ * 5. Products derived from this software may not be called "OpenSSL"
+ * nor may "OpenSSL" appear in their names without prior written
+ * permission of the OpenSSL Project.
+ *
+ * 6. Redistributions of any form whatsoever must retain the following
+ * acknowledgment:
+ * "This product includes software developed by the OpenSSL Project
+ * for use in the OpenSSL Toolkit (http://www.openssl.org/)"
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
+ * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+ * OF THE POSSIBILITY OF SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This product includes cryptographic software written by Eric Young
+ * (eay@cryptsoft.com). This product includes software written by Tim
+ * Hudson (tjh@cryptsoft.com).
+ *
+ */
+
+#include "cryptlib.h"
+#include <openssl/rand.h>
+#include "rand_lcl.h"
+
+#if defined (OPENSSL_SYS_NETWARE)
+
+#if defined(NETWARE_LIBC)
+#include <nks\thread.h>
+#endif
+
+extern long RunningProcess;
+
+ /* the FAQ indicates we need to provide at least 20 bytes (160 bits) of seed
+ */
+int RAND_poll(void)
+{
+ unsigned long l;
+ unsigned long tsc;
+ int i;
+
+ /* There are several options to gather miscellaneous data
+ * but for now we will loop checking the time stamp counter (rdtsc) and
+ * the SuperHighResolutionTimer. Each iteration will collect 8 bytes
+ * of data but it is treated as only 1 byte of entropy. The call to
+ * ThreadSwitchWithDelay() will introduce additional variability into
+ * the data returned by rdtsc.
+ *
+ * Applications can agument the seed material by adding additional
+ * stuff with RAND_add() and should probably do so.
+ */
+ l = GetProcessSwitchCount();
+ RAND_add(&l,sizeof(l),1);
+
+ l=RunningProcess;
+ RAND_add(&l,sizeof(l),1);
+
+ for( i=2; i<ENTROPY_NEEDED; i++)
+ {
+ asm
+ {
+ rdtsc
+ mov tsc, eax
+ }
+ RAND_add(&tsc, sizeof(tsc), 1);
+
+ l = GetSuperHighResolutionTimer();
+ RAND_add(&l, sizeof(l), 0);
+
+# if defined(NETWARE_LIBC)
+ NXThreadYield();
+# else /* NETWARE_CLIB */
+ ThreadSwitchWithDelay();
+# endif
+ }
+
+ return 1;
+}
+
+#endif
+
diff --git a/crypto/rand/rand_unix.c b/crypto/rand/rand_unix.c
index a776e52243..8b4c483312 100644
--- a/crypto/rand/rand_unix.c
+++ b/crypto/rand/rand_unix.c
@@ -108,6 +108,7 @@
* Hudson (tjh@cryptsoft.com).
*
*/
+#include <stdio.h>
#define USE_SOCKETS
#include "e_os.h"
@@ -115,7 +116,7 @@
#include <openssl/rand.h>
#include "rand_lcl.h"
-#if !(defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_WIN32) || defined(OPENSSL_SYS_VMS) || defined(OPENSSL_SYS_OS2) || defined(OPENSSL_SYS_VXWORKS))
+#if !(defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_WIN32) || defined(OPENSSL_SYS_VMS) || defined(OPENSSL_SYS_OS2) || defined(OPENSSL_SYS_VXWORKS) || defined(OPENSSL_SYS_NETWARE))
#include <sys/types.h>
#include <sys/time.h>
diff --git a/crypto/rand/randtest.c b/crypto/rand/randtest.c
index 701932e6ee..ef057c2c31 100644
--- a/crypto/rand/randtest.c
+++ b/crypto/rand/randtest.c
@@ -211,6 +211,9 @@ int main()
printf("test 4 done\n");
err:
err=((err)?1:0);
+#ifdef OPENSSL_SYS_NETWARE
+ if (err) printf("ERROR: %d\n", err);
+#endif
EXIT(err);
return(err);
}
diff --git a/crypto/rc2/rc2speed.c b/crypto/rc2/rc2speed.c
index 47d34b444e..b16e6e2ed1 100644
--- a/crypto/rc2/rc2speed.c
+++ b/crypto/rc2/rc2speed.c
@@ -69,7 +69,10 @@
#include OPENSSL_UNISTD_IO
OPENSSL_DECLARE_EXIT
+#ifndef OPENSSL_SYS_NETWARE
#include <signal.h>
+#endif
+
#ifndef _IRIX
#include <time.h>
#endif
diff --git a/crypto/rc2/rc2test.c b/crypto/rc2/rc2test.c
index b67bafb49f..0e117436bb 100644
--- a/crypto/rc2/rc2test.c
+++ b/crypto/rc2/rc2test.c
@@ -205,6 +205,9 @@ int main(int argc, char *argv[])
printf("ok\n");
#endif
+#ifdef OPENSSL_SYS_NETWARE
+ if (err) printf("ERROR: %d\n", err);
+#endif
EXIT(err);
return(err);
}
diff --git a/crypto/rc4/rc4speed.c b/crypto/rc4/rc4speed.c
index ced98c52df..0ebd38123d 100644
--- a/crypto/rc4/rc4speed.c
+++ b/crypto/rc4/rc4speed.c
@@ -69,7 +69,10 @@
#include OPENSSL_UNISTD_IO
OPENSSL_DECLARE_EXIT
+#ifndef OPENSSL_SYS_NETWARE
#include <signal.h>
+#endif
+
#ifndef _IRIX
#include <time.h>
#endif
diff --git a/crypto/rc4/rc4test.c b/crypto/rc4/rc4test.c
index b9d8f20975..18154025eb 100644
--- a/crypto/rc4/rc4test.c
+++ b/crypto/rc4/rc4test.c
@@ -197,6 +197,9 @@ int main(int argc, char *argv[])
}
}
printf("done\n");
+#ifdef OPENSSL_SYS_NETWARE
+ if (err) printf("ERROR: %d\n", err);
+#endif
EXIT(err);
return(0);
}
diff --git a/crypto/rc5/rc5speed.c b/crypto/rc5/rc5speed.c
index 7d490d5b77..8e363be535 100644
--- a/crypto/rc5/rc5speed.c
+++ b/crypto/rc5/rc5speed.c
@@ -69,7 +69,10 @@
#include OPENSSL_UNISTD_IO
OPENSSL_DECLARE_EXIT
+#ifndef OPENSSL_SYS_NETWARE
#include <signal.h>
+#endif
+
#ifndef _IRIX
#include <time.h>
#endif
diff --git a/crypto/rsa/rsa_test.c b/crypto/rsa/rsa_test.c
index 924e9ad1f6..236842a634 100644
--- a/crypto/rsa/rsa_test.c
+++ b/crypto/rsa/rsa_test.c
@@ -312,6 +312,9 @@ int main(int argc, char *argv[])
CRYPTO_mem_leaks_fp(stderr);
+#ifdef OPENSSL_SYS_NETWARE
+ if (err) printf("ERROR: %d\n", err);
+#endif
return err;
}
#endif
diff --git a/crypto/sha/sha1test.c b/crypto/sha/sha1test.c
index 4f2e4ada2d..cddd598f22 100644
--- a/crypto/sha/sha1test.c
+++ b/crypto/sha/sha1test.c
@@ -157,6 +157,10 @@ int main(int argc, char *argv[])
}
else
printf("test 3 ok\n");
+
+#ifdef OPENSSL_SYS_NETWARE
+ if (err) printf("ERROR: %d\n", err);
+#endif
EXIT(err);
EVP_MD_CTX_cleanup(&c);
return(0);
diff --git a/crypto/sha/shatest.c b/crypto/sha/shatest.c
index 5d2b1d3b1a..0e026c1245 100644
--- a/crypto/sha/shatest.c
+++ b/crypto/sha/shatest.c
@@ -157,7 +157,10 @@ int main(int argc, char *argv[])
}
else
printf("test 3 ok\n");
- EVP_MD_CTX_cleanup(&c);
+
+#ifdef OPENSSL_SYS_NETWARE
+ if (err) printf("ERROR: %d\n", err);
+#endif
EXIT(err);
return(0);
}
diff --git a/crypto/threads/mttest.c b/crypto/threads/mttest.c
index 54d598565d..d0e088218b 100644
--- a/crypto/threads/mttest.c
+++ b/crypto/threads/mttest.c
@@ -77,6 +77,12 @@
#ifdef PTHREADS
#include <pthread.h>
#endif
+#ifdef OPENSSL_SYS_NETWARE
+#if !defined __int64
+# define __int64 long long
+#endif
+#include <nwmpk.h>
+#endif
#include <openssl/lhash.h>
#include <openssl/crypto.h>
#include <openssl/buffer.h>
@@ -86,8 +92,18 @@
#include <openssl/err.h>
#include <openssl/rand.h>
+#ifdef OPENSSL_NO_FP_API
+#define APPS_WIN16
+#include "../buffer/bss_file.c"
+#endif
+
+#ifdef OPENSSL_SYS_NETWARE
+#define TEST_SERVER_CERT "/openssl/apps/server.pem"
+#define TEST_CLIENT_CERT "/openssl/apps/client.pem"
+#else
#define TEST_SERVER_CERT "../../apps/server.pem"
#define TEST_CLIENT_CERT "../../apps/client.pem"
+#endif
#define MAX_THREAD_NUMBER 100
@@ -100,10 +116,18 @@ void irix_locking_callback(int mode,int type,char *file,int line);
void solaris_locking_callback(int mode,int type,char *file,int line);
void win32_locking_callback(int mode,int type,char *file,int line);
void pthreads_locking_callback(int mode,int type,char *file,int line);
+void netware_locking_callback(int mode,int type,char *file,int line);
unsigned long irix_thread_id(void );
unsigned long solaris_thread_id(void );
unsigned long pthreads_thread_id(void );
+unsigned long netware_thread_id(void );
+
+#if defined(OPENSSL_SYS_NETWARE)
+static MPKMutex *lock_cs;
+static MPKSema ThreadSem;
+static long *lock_count;
+#endif
BIO *bio_err=NULL;
BIO *bio_stdout=NULL;
@@ -383,6 +407,9 @@ int ndoit(SSL_CTX *ssl_ctx[2])
SSL_free((SSL *)ctx[2]);
SSL_free((SSL *)ctx[3]);
}
+# ifdef OPENSSL_SYS_NETWARE
+ MPKSemaphoreSignal(ThreadSem);
+# endif
return(0);
}
@@ -626,6 +653,9 @@ int doit(char *ctx[4])
}
if ((done & S_DONE) && (done & C_DONE)) break;
+# if defined(OPENSSL_SYS_NETWARE)
+ ThreadSwitchWithDelay();
+# endif
}
SSL_set_shutdown(c_ssl,SSL_SENT_SHUTDOWN|SSL_RECEIVED_SHUTDOWN);
@@ -1093,3 +1123,88 @@ unsigned long pthreads_thread_id(void)
+#ifdef OPENSSL_SYS_NETWARE
+
+void thread_setup(void)
+{
+ int i;
+
+ lock_cs=OPENSSL_malloc(CRYPTO_num_locks() * sizeof(MPKMutex));
+ lock_count=OPENSSL_malloc(CRYPTO_num_locks() * sizeof(long));
+ for (i=0; i<CRYPTO_num_locks(); i++)
+ {
+ lock_count[i]=0;
+ lock_cs[i]=MPKMutexAlloc("OpenSSL mutex");
+ }
+
+ ThreadSem = MPKSemaphoreAlloc("OpenSSL mttest semaphore", 0 );
+
+ CRYPTO_set_id_callback((unsigned long (*)())netware_thread_id);
+ CRYPTO_set_locking_callback((void (*)())netware_locking_callback);
+}
+
+void thread_cleanup(void)
+{
+ int i;
+
+ CRYPTO_set_locking_callback(NULL);
+
+ fprintf(stdout,"thread_cleanup\n");
+
+ for (i=0; i<CRYPTO_num_locks(); i++)
+ {
+ MPKMutexFree(lock_cs[i]);
+ fprintf(stdout,"%8ld:%s\n",lock_count[i],CRYPTO_get_lock_name(i));
+ }
+ OPENSSL_free(lock_cs);
+ OPENSSL_free(lock_count);
+
+ MPKSemaphoreFree(ThreadSem);
+
+ fprintf(stdout,"done cleanup\n");
+}
+
+void netware_locking_callback(int mode, int type, char *file, int line)
+{
+ if (mode & CRYPTO_LOCK)
+ {
+ MPKMutexLock(lock_cs[type]);
+ lock_count[type]++;
+ }
+ else
+ MPKMutexUnlock(lock_cs[type]);
+}
+
+void do_threads(SSL_CTX *s_ctx, SSL_CTX *c_ctx)
+{
+ SSL_CTX *ssl_ctx[2];
+ int i;
+ ssl_ctx[0]=s_ctx;
+ ssl_ctx[1]=c_ctx;
+
+ for (i=0; i<thread_number; i++)
+ {
+ BeginThread( (void(*)(void*))ndoit, NULL, THREAD_STACK_SIZE,
+ (void*)ssl_ctx);
+ ThreadSwitchWithDelay();
+ }
+
+ printf("reaping\n");
+
+ /* loop until all threads have signaled the semaphore */
+ for (i=0; i<thread_number; i++)
+ {
+ MPKSemaphoreWait(ThreadSem);
+ }
+ printf("netware threads done (%d,%d)\n",
+ s_ctx->references,c_ctx->references);
+}
+
+unsigned long netware_thread_id(void)
+{
+ unsigned long ret;
+
+ ret=(unsigned long)GetThreadID();
+ return(ret);
+}
+#endif /* NETWARE */
diff --git a/crypto/threads/netware.bat b/crypto/threads/netware.bat
new file mode 100644
index 0000000000..0b3eca3caf
--- /dev/null
+++ b/crypto/threads/netware.bat
@@ -0,0 +1,79 @@
+@echo off
+rem batch file to build multi-thread test ( mttest.nlm )
+
+rem command line arguments:
+rem debug => build using debug settings
+
+rem
+rem After building, copy mttest.nlm to the server and run it, you'll probably
+rem want to redirect stdout and stderr. An example command line would be
+rem "mttest.nlm -thread 20 -loops 10 -CAfile \openssl\apps\server.pem >mttest.out 2>mttest.err"
+rem
+
+del mttest.nlm
+
+set BLD_DEBUG=
+set CFLAGS=
+set LFLAGS=
+set LIBS=
+
+if "%1" == "DEBUG" set BLD_DEBUG=YES
+if "%1" == "debug" set BLD_DEBUG=YES
+
+if "%MWCIncludes%" == "" goto inc_error
+if "%PRELUDE%" == "" goto prelude_error
+if "%IMPORTS%" == "" goto imports_error
+
+set CFLAGS=-c -I..\..\outinc_nw -nosyspath -DOPENSSL_SYS_NETWARE -opt off -g -sym internal -maxerrors 20
+
+if "%BLD_DEBUG%" == "YES" set LIBS=..\..\out_nw.dbg\ssl.lib ..\..\out_nw.dbg\crypto.lib
+if "%BLD_DEBUG%" == "" set LIBS=..\..\out_nw\ssl.lib ..\..\out_nw\crypto.lib
+
+set LFLAGS=-msgstyle gcc -zerobss -stacksize 32768 -nostdlib -sym internal
+
+rem generate command file for metrowerks
+echo.
+echo Generating Metrowerks command file: mttest.def
+echo # dynamically generated command file for metrowerks build > mttest.def
+echo IMPORT @%IMPORTS%\clib.imp >> mttest.def
+echo IMPORT @%IMPORTS%\threads.imp >> mttest.def
+echo IMPORT @%IMPORTS%\ws2nlm.imp >> mttest.def
+echo IMPORT GetProcessSwitchCount >> mttest.def
+echo MODULE clib >> mttest.def
+
+rem compile
+echo.
+echo Compiling mttest.c
+mwccnlm.exe mttest.c %CFLAGS%
+if errorlevel 1 goto end
+
+rem link
+echo.
+echo Linking mttest.nlm
+mwldnlm.exe %LFLAGS% -screenname mttest -commandfile mttest.def mttest.o "%PRELUDE%" %LIBS% -o mttest.nlm
+if errorlevel 1 goto end
+
+goto end
+
+:inc_error
+echo.
+echo Environment variable MWCIncludes is not set - see install.nw
+goto end
+
+:prelude_error
+echo.
+echo Environment variable PRELUDE is not set - see install.nw
+goto end
+
+:imports_error
+echo.
+echo Environment variable IMPORTS is not set - see install.nw
+goto end
+
+
+:end
+set BLD_DEBUG=
+set CFLAGS=
+set LFLAGS=
+set LIBS=
+
diff --git a/crypto/tmdiff.c b/crypto/tmdiff.c
index cbec38e178..1c6e052ac9 100644
--- a/crypto/tmdiff.c
+++ b/crypto/tmdiff.c
@@ -72,7 +72,11 @@
# define TIMES
#endif
-#ifndef _IRIX
+#ifdef OPENSSL_SYS_NETWARE
+#undef TIMES
+#endif
+
+#if !defined(_IRIX) || defined (OPENSSL_SYS_NETWARE)
# include <time.h>
#endif
#ifdef TIMES
@@ -94,7 +98,7 @@
#include <sys/param.h>
#endif
-#if !defined(TIMES) && !defined(OPENSSL_SYS_VXWORKS)
+#if !defined(TIMES) && !defined(OPENSSL_SYS_VXWORKS) && !defined(OPENSSL_SYS_NETWARE)
#include <sys/timeb.h>
#endif
@@ -129,6 +133,8 @@ struct ms_tm
# ifdef OPENSSL_SYS_WIN32
HANDLE thread_id;
FILETIME ms_win32;
+# elif defined (OPENSSL_SYS_NETWARE)
+ clock_t ms_clock;
# else
# ifdef OPENSSL_SYS_VXWORKS
unsigned long ticks;
@@ -170,6 +176,8 @@ void ms_time_get(MS_TM *tm)
#else
# ifdef OPENSSL_SYS_WIN32
GetThreadTimes(tm->thread_id,&tmpa,&tmpb,&tmpc,&(tm->ms_win32));
+# elif defined (OPENSSL_SYS_NETWARE)
+ tm->ms_clock = clock();
# else
# ifdef OPENSSL_SYS_VXWORKS
tm->ticks = tickGet();
@@ -203,6 +211,8 @@ double ms_time_diff(MS_TM *a, MS_TM *b)
lb+=b->ms_win32.dwLowDateTime;
ret=((double)(lb-la))/1e7;
}
+# elif defined (OPENSSL_SYS_NETWARE)
+ ret= (double)(b->ms_clock - a->ms_clock);
# else
# ifdef OPENSSL_SYS_VXWORKS
ret = (double)(b->ticks - a->ticks) / (double)sysClkRateGet();
@@ -228,6 +238,8 @@ int ms_time_cmp(const MS_TM *a, const MS_TM *b)
# ifdef OPENSSL_SYS_WIN32
d =(b->ms_win32.dwHighDateTime&0x000fffff)*10+b->ms_win32.dwLowDateTime/1e7;
d-=(a->ms_win32.dwHighDateTime&0x000fffff)*10+a->ms_win32.dwLowDateTime/1e7;
+# elif defined (OPENSSL_SYS_NETWARE)
+ d= (double)(b->ms_clock - a->ms_clock);
# else
# ifdef OPENSSL_SYS_VXWORKS
d = (b->ticks - a->ticks);
diff --git a/crypto/ui/ui_openssl.c b/crypto/ui/ui_openssl.c
index ce1cb1dfcd..fad17024a0 100644
--- a/crypto/ui/ui_openssl.c
+++ b/crypto/ui/ui_openssl.c
@@ -202,6 +202,12 @@
#undef SGTTY
#endif
+#if defined(OPENSSL_SYS_NETWARE)
+#undef TERMIOS
+#undef TERMIO
+#undef SGTTY
+#endif
+
#ifdef TERMIOS
# include <termios.h>
# define TTY_STRUCT struct termios
@@ -250,7 +256,7 @@ struct IOSB {
typedef int sig_atomic_t;
#endif
-#if defined(OPENSSL_SYS_MACINTOSH_CLASSIC) || defined(MAC_OS_GUSI_SOURCE)
+#if defined(OPENSSL_SYS_MACINTOSH_CLASSIC) || defined(MAC_OS_GUSI_SOURCE) || defined(OPENSSL_SYS_NETWARE)
/*
* This one needs work. As a matter of fact the code is unoperational
* and this is only a trick to get it compiled.
@@ -463,7 +469,7 @@ static int open_console(UI *ui)
CRYPTO_w_lock(CRYPTO_LOCK_UI);
is_a_tty = 1;
-#if defined(OPENSSL_SYS_MACINTOSH_CLASSIC) || defined(OPENSSL_SYS_VXWORKS)
+#if defined(OPENSSL_SYS_MACINTOSH_CLASSIC) || defined(OPENSSL_SYS_VXWORKS) || defined(OPENSSL_SYS_NETWARE)
tty_in=stdin;
tty_out=stderr;
#else
diff --git a/crypto/uid.c b/crypto/uid.c
index 73205a4baa..b1fd52bada 100644
--- a/crypto/uid.c
+++ b/crypto/uid.c
@@ -65,7 +65,7 @@ int OPENSSL_issetugid(void)
return issetugid();
}
-#elif defined(OPENSSL_SYS_WIN32) || defined(OPENSSL_SYS_VXWORKS)
+#elif defined(OPENSSL_SYS_WIN32) || defined(OPENSSL_SYS_VXWORKS) || defined(OPENSSL_SYS_NETWARE)
int OPENSSL_issetugid(void)
{
diff --git a/e_os.h b/e_os.h
index 6b75bbe15e..aae3c79b84 100644
--- a/e_os.h
+++ b/e_os.h
@@ -321,6 +321,26 @@ extern "C" {
__VMS_EXIT |= 0x10000000; \
exit(__VMS_EXIT); } while(0)
# define NO_SYS_PARAM_H
+
+# elif defined(OPENSSL_SYS_NETWARE)
+# include <fcntl.h>
+# include <unistd.h>
+# define NO_SYS_TYPES_H
+# undef DEVRANDOM
+# ifdef NETWARE_CLIB
+# define getpid GetThreadID
+# endif
+# define NO_SYSLOG
+# define _setmode setmode
+# define _kbhit kbhit
+# define _O_TEXT O_TEXT
+# define _O_BINARY O_BINARY
+# define OPENSSL_CONF "openssl.cnf"
+# define SSLEAY_CONF OPENSSL_CONF
+# define RFILE ".rnd"
+# define LIST_SEPARATOR_CHAR ';'
+# define EXIT(n) { if (n) printf("ERROR: %d\n", (int)n); exit(n); }
+
# else
/* !defined VMS */
# ifdef OPENSSL_SYS_MPE
@@ -393,6 +413,19 @@ extern HINSTANCE _hInstance;
# define SHUTDOWN(fd) MacSocket_close(fd)
# define SHUTDOWN2(fd) MacSocket_close(fd)
+# elif defined(OPENSSL_SYS_NETWARE)
+ /* NetWare uses the WinSock2 interfaces
+ */
+# if defined(NETWARE_CLIB)
+# include <ws2nlm.h>
+# elif defined(NETWARE_LIBC)
+# include <novsock2.h>
+# endif
+# define SSLeay_Write(a,b,c) send((a),(b),(c),0)
+# define SSLeay_Read(a,b,c) recv((a),(b),(c),0)
+# define SHUTDOWN(fd) { shutdown((fd),0); closesocket(fd); }
+# define SHUTDOWN2(fd) { shutdown((fd),2); closesocket(fd); }
+
# else
# ifndef NO_SYS_PARAM_H
@@ -521,6 +554,9 @@ extern char *sys_errlist[]; extern int sys_nerr;
#elif defined(OPENSSL_SYS_OS2) && defined(__EMX__)
# define strcasecmp stricmp
# define strncasecmp strnicmp
+#elif defined(OPENSSL_SYS_NETWARE) && defined(NETWARE_CLIB)
+# define strcasecmp stricmp
+# define strncasecmp strnicmp
#else
# ifdef NO_STRINGS_H
int strcasecmp();
diff --git a/e_os2.h b/e_os2.h
index 4fd6c62ace..ecfc6c5d4e 100644
--- a/e_os2.h
+++ b/e_os2.h
@@ -76,6 +76,12 @@ extern "C" {
# define OPENSSL_SYS_MACINTOSH_CLASSIC
#endif
+/* ----------------------- NetWare ----------------------------------------- */
+#if defined(NETWARE) || defined(OPENSSL_SYSNAME_NETWARE)
+# undef OPENSSL_SYS_UNIX
+# define OPENSSL_SYS_NETWARE
+#endif
+
/* ---------------------- Microsoft operating systems ---------------------- */
/* The 16 bit environments are pretty straightforward */
diff --git a/engines/e_aep.c b/engines/e_aep.c
index 8e10bb7760..5083c80ef8 100644
--- a/engines/e_aep.c
+++ b/engines/e_aep.c
@@ -852,7 +852,11 @@ static AEP_RV aep_get_connection(AEP_CONNECTION_HNDL_PTR phConnection)
CRYPTO_w_lock(CRYPTO_LOCK_ENGINE);
+#ifndef NETWARE_CLIB
curr_pid = getpid();
+#else
+ curr_pid = GetThreadID();
+#endif
/*Check if this is the first time this is being called from the current
process*/
diff --git a/ssl/ssltest.c b/ssl/ssltest.c
index 5aadfa51d0..68eb654572 100644
--- a/ssl/ssltest.c
+++ b/ssl/ssltest.c
@@ -157,6 +157,9 @@
#elif defined(OPENSSL_SYS_WINCE)
# define TEST_SERVER_CERT "\\OpenSSL\\server.pem"
# define TEST_CLIENT_CERT "\\OpenSSL\\client.pem"
+#elif defined(OPENSSL_SYS_NETWARE)
+# define TEST_SERVER_CERT "\\openssl\\apps\\server.pem"
+# define TEST_CLIENT_CERT "\\openssl\\apps\\client.pem"
#else
# define TEST_SERVER_CERT "../apps/server.pem"
# define TEST_CLIENT_CERT "../apps/client.pem"
diff --git a/util/mk1mf.pl b/util/mk1mf.pl
index d85a20a605..4d370720aa 100755
--- a/util/mk1mf.pl
+++ b/util/mk1mf.pl
@@ -39,6 +39,8 @@ $infile="MINFO";
"ultrix-mips","DEC mips ultrix",
"FreeBSD","FreeBSD distribution",
"OS2-EMX", "EMX GCC OS/2",
+ "netware-clib", "CodeWarrior for NetWare - CLib",
+ "netware-libc", "CodeWarrior for NetWare - LibC",
"default","cc under unix",
);
@@ -69,6 +71,8 @@ and [options] can be one of
no-engine - No engine
no-hw - No hw
nasm - Use NASM for x86 asm
+ nw-nasm - Use NASM x86 asm for NetWare
+ nw-mwasm - Use Metrowerks x86 asm for NetWare
gaswin - Use GNU as with Mingw32
no-socks - No socket code
no-err - No error strings
@@ -198,6 +202,11 @@ elsif ($platform eq "OS2-EMX")
$wc=1;
require 'OS2-EMX.pl';
}
+elsif (($platform eq "netware-clib") || ($platform eq "netware-libc"))
+ {
+ $LIBC=1 if $platform eq "netware-libc";
+ require 'netware.pl';
+ }
else
{
require "unix.pl";
@@ -928,6 +937,8 @@ sub read_options
elsif (/^no-aes$/) { $no_aes=1; }
elsif (/^no-asm$/) { $no_asm=1; }
elsif (/^nasm$/) { $nasm=1; }
+ elsif (/^nw-nasm$/) { $nw_nasm=1; }
+ elsif (/^nw-mwasm$/) { $nw_mwasm=1; }
elsif (/^gaswin$/) { $gaswin=1; }
elsif (/^no-ssl2$/) { $no_ssl2=1; }
elsif (/^no-ssl3$/) { $no_ssl3=1; }
diff --git a/util/pl/netware.pl b/util/pl/netware.pl
new file mode 100644
index 0000000000..233612a911
--- /dev/null
+++ b/util/pl/netware.pl
@@ -0,0 +1,327 @@
+# Metrowerks Codewarrior for NetWare
+#
+
+# The import files and other misc imports needed to link
+if ($LIBC)
+{
+ @import_files = ("libc.imp", "ws2nlm.imp");
+ @module_files = ("libc");
+}
+else
+{
+ # clib build
+ @import_files = ("clib.imp", "ws2nlm.imp");
+ @module_files = ("clib");
+}
+@misc_imports = ("GetProcessSwitchCount", "RunningProcess",
+ "GetSuperHighResolutionTimer" );
+
+# The "IMPORTS" environment variable must be set and point to the location
+# where import files (*.imp) can be found.
+# Example: set IMPORTS=c:\ndk\nwsdk\imports
+$import_path = $ENV{"IMPORTS"} || die ("IMPORTS environment variable not set\n");
+
+
+# The "PRELUDE" environment variable must be set and point to the location
+# and name of the prelude source to link with ( nwpre.obj is recommended ).
+# Example: set PRELUDE=c:\codewar\novell support\metrowerks support\libraries\runtime\nwpre.obj
+$prelude = $ENV{"PRELUDE"} || die ("PRELUDE environment variable not set\n");
+
+#$ssl= "ssleay32";
+#$crypto="libeay32";
+
+$o='\\\\';
+$cp='copy >nul:';
+$rm='del';
+
+# C compiler
+$cc="mwccnlm";
+
+# Linker
+$link="mwldnlm";
+
+# librarian
+$mklib="mwldnlm";
+
+# assembler
+if ($nw_nasm)
+{
+ $asm="nasmw -s -f coff";
+ $afile="-o ";
+ $asm.=" -g" if $debug;
+}
+elsif ($nw_mwasm)
+{
+ $asm="mwasmnlm -maxerrors 20";
+ $afile="-o ";
+ $asm.=" -g" if $debug;
+}
+elsif ($nw_masm)
+{
+# masm assembly settings - it should be possible to use masm but haven't
+# got it working.
+# $asm='ml /Cp /coff /c /Cx';
+# $asm.=" /Zi" if $debug;
+# $afile='/Fo';
+ die("Support for masm assembler not yet functional\n");
+}
+else
+{
+ $asm="";
+ $afile="";
+}
+
+
+
+# compile flags
+#
+# NOTES: Several c files in the crypto subdirectory include headers from
+# their local directories. Metrowerks wouldn't find these h files
+# without adding individual include directives as compile flags
+# or modifying the c files. Instead of adding individual include
+# paths for each subdirectory a recursive include directive
+# is used ( -ir crypto ).
+#
+# Turned off the "possible" warnings ( -w nopossible ). Metrowerks
+# complained a lot about various stuff. May want to turn back
+# on for further development.
+$cflags="-ir crypto -msgstyle gcc -align 4 -processor pentium \\
+ -char unsigned -w on -w nolargeargs -w nopossible -w nounusedarg \\
+ -w noimplicitconv -relax_pointers -nosyspath -DL_ENDIAN \\
+ -DOPENSSL_SYSNAME_NETWARE -U_WIN32 -maxerrors 20 ";
+
+# link flags
+$lflags="-msgstyle gcc -zerobss -stacksize 32768 -nostdlib -sym internal ";
+
+
+# additional flags based upon debug | non-debug
+if ($debug)
+{
+ $cflags.=" -opt off -g -sym internal -DDEBUG";
+}
+else
+{
+# CodeWarrior compiler has a problem with optimizations for floating
+# points - no optimizations until further investigation
+# $cflags.=" -opt all";
+}
+
+# If LibC build add in NKS_LIBC define and set the entry/exit
+# routines - The default entry/exit routines are for CLib and don't exist
+# in LibC
+if ($LIBC)
+{
+ $cflags.=" -DNETWARE_LIBC";
+ $lflags.=" -entry _LibCPrelude -exit _LibCPostlude -flags pseudopreemption";
+}
+else
+{
+ $cflags.=" -DNETWARE_CLIB";
+ $lflags.=" -entry _Prelude -exit _Stop";
+}
+
+
+# linking stuff
+# for the output directories use the mk1mf.pl values with "_nw" appended
+if ($shlib)
+{
+ if ($LIBC)
+ {
+ $out_def.="_nw_libc_nlm";
+ $tmp_def.="_nw_libc_nlm";
+ $inc_def.="_nw_libc_nlm";
+ }
+ else # NETWARE_CLIB
+ {
+ $out_def.="_nw_clib_nlm";
+ $tmp_def.="_nw_clib_nlm";
+ $inc_def.="_nw_clib_nlm";
+ }
+}
+else
+{
+ $libp=".lib";
+ $shlibp=".lib";
+ $lib_flags="-nodefaults -type library";
+ if ($LIBC)
+ {
+ $out_def.="_nw_libc";
+ $tmp_def.="_nw_libc";
+ $inc_def.="_nw_libc";
+ }
+ else # NETWARE_CLIB
+ {
+ $out_def.="_nw_clib";
+ $tmp_def.="_nw_clib";
+ $inc_def.="_nw_clib";
+ }
+}
+
+# used by mk1mf.pl
+$obj='.obj';
+$ofile='-o ';
+$efile='';
+$exep='.nlm';
+$ex_libs='';
+
+if (!$no_asm)
+{
+ $bn_asm_obj="crypto${o}bn${o}asm${o}bn-nw.obj";
+ $bn_asm_src="crypto${o}bn${o}asm${o}bn-nw.asm";
+ $des_enc_obj="crypto${o}des${o}asm${o}d-nw.obj crypto${o}des${o}asm${o}y-nw.obj";
+ $des_enc_src="crypto${o}des${o}asm${o}d-nw.asm crypto${o}des${o}asm${o}y-nw.asm";
+ $bf_enc_obj="crypto${o}bf${o}asm${o}b-nw.obj";
+ $bf_enc_src="crypto${o}bf${o}asm${o}b-nw.asm";
+ $cast_enc_obj="crypto${o}cast${o}asm${o}c-nw.obj";
+ $cast_enc_src="crypto${o}cast${o}asm${o}c-nw.asm";
+ $rc4_enc_obj="crypto${o}rc4${o}asm${o}r4-nw.obj";
+ $rc4_enc_src="crypto${o}rc4${o}asm${o}r4-nw.asm";
+ $rc5_enc_obj="crypto${o}rc5${o}asm${o}r5-nw.obj";
+ $rc5_enc_src="crypto${o}rc5${o}asm${o}r5-nw.asm";
+ $md5_asm_obj="crypto${o}md5${o}asm${o}m5-nw.obj";
+ $md5_asm_src="crypto${o}md5${o}asm${o}m5-nw.asm";
+ $sha1_asm_obj="crypto${o}sha${o}asm${o}s1-nw.obj";
+ $sha1_asm_src="crypto${o}sha${o}asm${o}s1-nw.asm";
+ $rmd160_asm_obj="crypto${o}ripemd${o}asm${o}rm-nw.obj";
+ $rmd160_asm_src="crypto${o}ripemd${o}asm${o}rm-nw.asm";
+ $cflags.=" -DBN_ASM -DMD5_ASM -DSHA1_ASM -DRMD160_ASM";
+}
+else
+{
+ $bn_asm_obj='';
+ $bn_asm_src='';
+ $des_enc_obj='';
+ $des_enc_src='';
+ $bf_enc_obj='';
+ $bf_enc_src='';
+ $cast_enc_obj='';
+ $cast_enc_src='';
+ $rc4_enc_obj='';
+ $rc4_enc_src='';
+ $rc5_enc_obj='';
+ $rc5_enc_src='';
+ $md5_asm_obj='';
+ $md5_asm_src='';
+ $sha1_asm_obj='';
+ $sha1_asm_src='';
+ $rmd160_asm_obj='';
+ $rmd160_asm_src='';
+}
+
+# create the *.def linker command files in \openssl\netware\ directory
+sub do_def_file
+{
+ # strip off the leading path
+ my($target) = bname(@_);
+ my($def_file);
+ my($mod_file);
+ my($i);
+
+ if ($target =~ /(.*).nlm/)
+ {
+ $target = $1;
+ }
+
+ # special case for openssl - the mk1mf.pl defines E_EXE = openssl
+ if ($target =~ /E_EXE/)
+ {
+ $target = "openssl";
+ }
+
+ # Note: originally tried to use full path ( \openssl\netware\$target.def )
+ # Metrowerks linker choked on this with an assertion failure. bug???
+ #
+ $def_file = "netware\\$target.def";
+
+ open(DEF_OUT, ">$def_file") || die("unable to open file $def_file\n");
+
+ print( DEF_OUT "# command file generated by netware.pl for Metrowerks build\n" );
+ print( DEF_OUT "#\n");
+ print( DEF_OUT "DESCRIPTION \"$target\"\n");
+
+ foreach $i (@misc_imports)
+ {
+ print( DEF_OUT "IMPORT $i\n");
+ }
+
+ foreach $i (@import_files)
+ {
+ print( DEF_OUT "IMPORT \@$import_path\\$i\n");
+ }
+
+ foreach $i (@module_files)
+ {
+ print( DEF_OUT "MODULE $i\n");
+ }
+
+ close(DEF_OUT);
+ return($def_file);
+}
+
+sub do_lib_rule
+{
+ my($objs,$target,$name,$shlib)=@_;
+ my($ret);
+
+ $ret.="$target: $objs\n";
+ if (!$shlib)
+ {
+ $ret.="\t\@echo Building Lib: $name\n";
+ $ret.="\t\$(MKLIB) $lib_flags -o $target $objs\n";
+ $ret.="\t\@echo .\n"
+ }
+ else
+ {
+ die( "Building as NLM not currently supported!" );
+ }
+
+ $ret.="\n";
+ return($ret);
+}
+
+sub do_link_rule
+{
+ my($target,$files,$dep_libs,$libs)=@_;
+ my($ret);
+ my($def_file);
+
+ $def_file = do_def_file($target);
+
+ # special case for openssl - the mk1mf.pl defines E_EXE = openssl
+
+ # NOTE: When building the test nlms no screen name is given
+ # which causes the console screen to be used. By using the console
+ # screen there is no "<press any key to continue>" message which
+ # requires user interaction. The test script ( tests.pl ) needs to be
+ # able to run the tests without requiring user interaction.
+ #
+ # However, the sample program "openssl.nlm" is used by the tests and is
+ # a interactive sample so a screen is desired when not be run by the
+ # tests. To solve the problem, two versions of the program are built:
+ # openssl2 - no screen used by tests
+ # openssl - default screen - use for normal interactive modes
+ #
+ if ($target =~ /E_EXE/)
+ {
+ my($target2) = $target;
+
+ $target2 =~ s/\(E_EXE\)/\(E_EXE\)2/;
+
+ $ret.="$target: $files $dep_libs\n";
+
+ # openssl
+ $ret.="\t\$(LINK) \$(LFLAGS) -screenname openssl -commandfile $def_file $files \"$prelude\" $libs -o $target\n";
+ # openssl2
+ $ret.="\t\$(LINK) \$(LFLAGS) -commandfile $def_file $files \"$prelude\" $libs -o $target2\n";
+ }
+ else
+ {
+ $ret.="$target: $files $dep_libs\n";
+ $ret.="\t\$(LINK) \$(LFLAGS) -commandfile $def_file $files \"$prelude\" $libs -o $target\n";
+ }
+
+ $ret.="\n";
+ return($ret);
+}
+
+1;