This is a set of startup code for the DSO support, it's not yet linked into
authorGeoff Thorpe <geoff@openssl.org>
Tue, 4 Apr 2000 21:57:11 +0000 (21:57 +0000)
committerGeoff Thorpe <geoff@openssl.org>
Tue, 4 Apr 2000 21:57:11 +0000 (21:57 +0000)
the build process (an upcoming commit no doubt), and is very much *new*
code - what that means is that it compiles ok - usually. It certainly
doesn't mean it runs well or even properly yet. Please don't muck round
with this unless you're looking to help out and hunt bugs. :-)

Currently this code doesn't have any support for controlling the "load"
behaviour (eg. paths, filename translations, etc). That'll be handled
using DSO_ctrl() and various flags, once we work out a sensible set of
flags.

crypto/dso/Makefile.ssl [new file with mode: 0644]
crypto/dso/README [new file with mode: 0644]
crypto/dso/dso.h [new file with mode: 0644]
crypto/dso/dso_dl.c [new file with mode: 0644]
crypto/dso/dso_dlfcn.c [new file with mode: 0644]
crypto/dso/dso_err.c [new file with mode: 0644]
crypto/dso/dso_lib.c [new file with mode: 0644]
crypto/dso/dso_null.c [new file with mode: 0644]
crypto/dso/dso_openssl.c [new file with mode: 0644]
crypto/dso/dso_win32.c [new file with mode: 0644]

diff --git a/crypto/dso/Makefile.ssl b/crypto/dso/Makefile.ssl
new file mode 100644 (file)
index 0000000..0909db2
--- /dev/null
@@ -0,0 +1,116 @@
+#
+# SSLeay/crypto/dso/Makefile
+#
+
+DIR=   dso
+TOP=   ../..
+CC=    cc
+INCLUDES= -I.. -I../../include
+CFLAG=-g
+INSTALL_PREFIX=
+OPENSSLDIR=     /usr/local/ssl
+INSTALLTOP=/usr/local/ssl
+MAKE=          make -f Makefile.ssl
+MAKEDEPEND=    $(TOP)/util/domd $(TOP)
+MAKEFILE=      Makefile.ssl
+AR=            ar r
+
+CFLAGS= $(INCLUDES) $(CFLAG)
+
+GENERAL=Makefile
+TEST=
+APPS=
+
+LIB=$(TOP)/libcrypto.a
+LIBSRC= dso_dl.c dso_dlfcn.c dso_err.c dso_lib.c dso_null.c \
+       dso_openssl.c dso_win32.c
+LIBOBJ= dso_dl.o dso_dlfcn.o dso_err.o dso_lib.o dso_null.o \
+       dso_openssl.o dso_win32.o
+
+SRC= $(LIBSRC)
+
+EXHEADER= dso.h
+HEADER=        $(EXHEADER)
+
+ALL=    $(GENERAL) $(SRC) $(HEADER)
+
+top:
+       (cd ../..; $(MAKE) DIRS=crypto SDIRS=$(DIR) sub_all)
+
+all:   lib
+
+lib:   $(LIBOBJ)
+       $(AR) $(LIB) $(LIBOBJ)
+       $(RANLIB) $(LIB)
+       @touch lib
+
+files:
+       $(PERL) $(TOP)/util/files.pl Makefile.ssl >> $(TOP)/MINFO
+
+links:
+       @$(TOP)/util/point.sh Makefile.ssl Makefile
+       @$(PERL) $(TOP)/util/mklink.pl ../../include/openssl $(EXHEADER)
+       @$(PERL) $(TOP)/util/mklink.pl ../../test $(TEST)
+       @$(PERL) $(TOP)/util/mklink.pl ../../apps $(APPS)
+
+install:
+       @for i in $(EXHEADER) ; \
+       do  \
+       (cp $$i $(INSTALL_PREFIX)$(INSTALLTOP)/include/openssl/$$i; \
+       chmod 644 $(INSTALL_PREFIX)$(INSTALLTOP)/include/openssl/$$i ); \
+       done;
+
+tags:
+       ctags $(SRC)
+
+tests:
+
+lint:
+       lint -DLINT $(INCLUDES) $(SRC)>fluff
+
+depend:
+       $(MAKEDEPEND) $(INCLUDES) $(DEPFLAG) $(PROGS) $(LIBSRC)
+
+dclean:
+       $(PERL) -pe 'if (/^# DO NOT DELETE THIS LINE/) {print; exit(0);}' $(MAKEFILE) >Makefile.new
+       mv -f Makefile.new $(MAKEFILE)
+
+clean:
+       rm -f *.o */*.o *.obj lib tags core .pure .nfs* *.old *.bak fluff
+
+# DO NOT DELETE THIS LINE -- make depend depends on it.
+
+dso_dlfcn.o: ../../include/openssl/bio.h ../../include/openssl/buffer.h
+dso_dlfcn.o: ../../include/openssl/crypto.h ../../include/openssl/dso.h
+dso_dlfcn.o: ../../include/openssl/e_os.h ../../include/openssl/e_os2.h
+dso_dlfcn.o: ../../include/openssl/err.h ../../include/openssl/opensslconf.h
+dso_dlfcn.o: ../../include/openssl/opensslv.h ../../include/openssl/safestack.h
+dso_dlfcn.o: ../../include/openssl/stack.h ../cryptlib.h
+dso_err.o: ../../include/openssl/crypto.h ../../include/openssl/dso.h
+dso_err.o: ../../include/openssl/err.h ../../include/openssl/opensslv.h
+dso_err.o: ../../include/openssl/safestack.h ../../include/openssl/stack.h
+dso_lib.o: ../../include/openssl/bio.h ../../include/openssl/buffer.h
+dso_lib.o: ../../include/openssl/crypto.h ../../include/openssl/dso.h
+dso_lib.o: ../../include/openssl/e_os.h ../../include/openssl/e_os2.h
+dso_lib.o: ../../include/openssl/err.h ../../include/openssl/opensslconf.h
+dso_lib.o: ../../include/openssl/opensslv.h ../../include/openssl/safestack.h
+dso_lib.o: ../../include/openssl/stack.h ../cryptlib.h
+dso_null.o: ../../include/openssl/bio.h ../../include/openssl/buffer.h
+dso_null.o: ../../include/openssl/crypto.h ../../include/openssl/dso.h
+dso_null.o: ../../include/openssl/e_os.h ../../include/openssl/e_os2.h
+dso_null.o: ../../include/openssl/err.h ../../include/openssl/opensslconf.h
+dso_null.o: ../../include/openssl/opensslv.h ../../include/openssl/safestack.h
+dso_null.o: ../../include/openssl/stack.h ../cryptlib.h
+dso_openssl.o: ../../include/openssl/bio.h ../../include/openssl/buffer.h
+dso_openssl.o: ../../include/openssl/crypto.h ../../include/openssl/dso.h
+dso_openssl.o: ../../include/openssl/e_os.h ../../include/openssl/e_os2.h
+dso_openssl.o: ../../include/openssl/err.h ../../include/openssl/opensslconf.h
+dso_openssl.o: ../../include/openssl/opensslv.h
+dso_openssl.o: ../../include/openssl/safestack.h ../../include/openssl/stack.h
+dso_openssl.o: ../cryptlib.h
+dso_win32.o: ../../include/openssl/bio.h ../../include/openssl/buffer.h
+dso_win32.o: ../../include/openssl/crypto.h ../../include/openssl/dso.h
+dso_win32.o: ../../include/openssl/e_os.h ../../include/openssl/e_os2.h
+dso_win32.o: ../../include/openssl/err.h ../../include/openssl/opensslconf.h
+dso_win32.o: ../../include/openssl/opensslv.h ../../include/openssl/safestack.h
+dso_win32.o: ../../include/openssl/stack.h ../cryptlib.h
diff --git a/crypto/dso/README b/crypto/dso/README
new file mode 100644 (file)
index 0000000..5a9b86f
--- /dev/null
@@ -0,0 +1,22 @@
+TODO
+----
+
+Get a fix on how the paths should be handled. For now, flags == 0
+and this is currently just passing strings directly onto the
+underlying system calls and letting them do what they want with
+the paths. However, it may be desirable to implement flags that
+control the way the loading is performed (or attempted), and I
+invisage that DSO_ctrl() will be used to control this.
+
+NOTES
+-----
+
+I've checked out HPUX (well, version 11 at least) and shl_t is
+a pointer type so it's safe to use in the way it has been in
+dso_dl.c. On the other hand, HPUX11 support dlfcn too and
+according to their man page, prefer developers to move to that.
+I'll leave Richard's changes there as I guess dso_dl is needed
+for HPUX10.20.
+
+[G-T]
+
diff --git a/crypto/dso/dso.h b/crypto/dso/dso.h
new file mode 100644 (file)
index 0000000..5f86eb3
--- /dev/null
@@ -0,0 +1,191 @@
+/* dso.h */
+/* Written by Geoff Thorpe (geoff@geoffthorpe.net) for the OpenSSL
+ * project 2000.
+ */
+/* ====================================================================
+ * Copyright (c) 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
+ *    licensing@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).
+ *
+ */
+
+#ifndef HEADER_DSO_H
+#define HEADER_DSO_H
+
+#include <openssl/crypto.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+typedef struct dso_st DSO;
+
+typedef struct dso_meth_st
+       {
+       const char *name;
+       /* Loads a shared library */
+       int (*dso_load)(DSO *dso, char *filename);
+       /* Unloads a shared library */
+       int (*dso_unload)(DSO *dso);
+       /* Binds a function, variable, or whatever */
+       int (*dso_bind)(DSO *dso, char *symname, void **symptr);
+
+/* I don't think this would actually be used in any circumstances. */
+#if 0
+       /* Unbinds a symbol */
+       int (*dso_unbind)(DSO *dso, char *symname, void *symptr);
+#endif
+
+       int (*init)(DSO *dso);
+       int (*finish)(DSO *dso);
+       } DSO_METHOD;
+
+/**********************************************************************/
+/* The low-level handle type used to refer to a loaded shared library */
+
+struct dso_st
+       {
+       DSO_METHOD *meth;
+       /* Standard dlopen uses a (void *). Win32 uses a HANDLE. VMS
+        * doesn't use anything but will need to cache the filename
+        * for use in the dso_bind handler. All in all, let each
+        * method control its own destiny. "Handles" and such go in
+        * a STACK. */
+       STACK *meth_data;
+       int references;
+       int flags;
+       /* For use by applications etc ... use this for your bits'n'pieces,
+        * don't touch meth_data! */
+       CRYPTO_EX_DATA ex_data;
+       };
+
+
+DSO *  DSO_new(void);
+DSO *  DSO_new_method(DSO_METHOD *method);
+int    DSO_free(DSO *dso);
+int    DSO_flags(DSO *dso);
+int    DSO_up(DSO *dso);
+
+void DSO_set_default_method(DSO_METHOD *meth);
+DSO_METHOD *DSO_get_default_method(void);
+DSO_METHOD *DSO_get_method(DSO *dso);
+DSO_METHOD *DSO_set_method(DSO *dso, DSO_METHOD *meth);
+
+/* The all-singing all-dancing load function, you normally pass NULL
+ * for the last two parameters. Use DSO_up and DSO_free for reference
+ * count handling. */
+DSO *DSO_load(DSO *dso, char *filename, DSO_METHOD *meth);
+
+/* This function binds to a function, variable, whatever inside a
+ * shared library. */
+void *DSO_bind(DSO *dso, char *symname);
+
+/* This method is the default, but will beg, borrow, or steal whatever
+ * method should be the default on any particular platform (including
+ * DSO_METH_null() if necessary). */
+DSO_METHOD *DSO_METHOD_openssl(void);
+
+/* This method is defined for all platforms - if a platform has no
+ * DSO support then this will be the only method! */
+DSO_METHOD *DSO_METHOD_null(void);
+
+/* If DSO_DLFCN is defined, the standard dlfcn.h-style functions
+ * (dlopen, dlclose, dlsym, etc) will be used and incorporated into
+ * this method. If not, this method will return NULL. */
+DSO_METHOD *DSO_METHOD_dlfcn(void);
+
+/* If DSO_DL is defined, the standard dl.h-style functions (shl_load, 
+ * shl_unload, shl_findsym, etc) will be used and incorporated into
+ * this method. If not, this method will return NULL. */
+DSO_METHOD *DSO_METHOD_dl(void);
+
+/* If WIN32 is defined, use DLLs. If not, return NULL. */
+DSO_METHOD *DSO_METHOD_win32(void);
+
+void ERR_load_DSO_strings(void);
+
+/* BEGIN ERROR CODES */
+/* The following lines are auto generated by the script mkerr.pl. Any changes
+ * made after this point may be overwritten when the script is next run.
+ */
+
+/* Error codes for the DSO functions. */
+
+/* Function codes. */
+#define DSO_F_DLFCN_BIND                                100
+#define DSO_F_DLFCN_LOAD                                101
+#define DSO_F_DLFCN_UNLOAD                              102
+#define DSO_F_DL_BIND                                   103
+#define DSO_F_DL_LOAD                                   104
+#define DSO_F_DL_UNLOAD                                         105
+#define DSO_F_DSO_BIND                                  106
+#define DSO_F_DSO_FREE                                  107
+#define DSO_F_DSO_LOAD                                  108
+#define DSO_F_DSO_NEW_METHOD                            109
+#define DSO_F_DSO_UP                                    110
+#define DSO_F_WIN32_BIND                                111
+#define DSO_F_WIN32_LOAD                                112
+#define DSO_F_WIN32_UNLOAD                              113
+
+/* Reason codes. */
+#define DSO_R_FINISH_FAILED                             100
+#define DSO_R_LOAD_FAILED                               101
+#define DSO_R_NULL_HANDLE                               102
+#define DSO_R_STACK_ERROR                               103
+#define DSO_R_SYM_FAILURE                               104
+#define DSO_R_UNLOAD_FAILED                             105
+#define DSO_R_UNSUPPORTED                               106
+
+#ifdef  __cplusplus
+}
+#endif
+#endif
+
diff --git a/crypto/dso/dso_dl.c b/crypto/dso/dso_dl.c
new file mode 100644 (file)
index 0000000..4792edf
--- /dev/null
@@ -0,0 +1,182 @@
+/* dso_dl.c */
+/* Written by Richard Levitte (levitte@openssl.org) for the OpenSSL
+ * project 2000.
+ */
+/* ====================================================================
+ * Copyright (c) 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
+ *    licensing@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 <stdio.h>
+#include "cryptlib.h"
+#include <openssl/dso.h>
+
+#ifndef DSO_DL
+DSO_METHOD *DSO_METHOD_dl(void)
+       {
+       return NULL;
+       }
+#else
+
+#include <dl.h>
+
+static int dl_load(DSO *dso, char *filename);
+static int dl_unload(DSO *dso);
+static int dl_bind(DSO *dso, char *symname, void **symptr);
+#if 0
+static int dl_unbind(DSO *dso, char *symname, void *symptr);
+static int dl_init(DSO *dso);
+static int dl_finish(DSO *dso);
+#endif
+
+static DSO_METHOD dso_meth_dl = {
+       "OpenSSL 'dl' shared library method",
+       dl_load,
+       dl_unload,
+       dl_bind,
+/* For now, "unbind" doesn't exist */
+#if 0
+       NULL, /* unbind */
+#endif
+       NULL, /* init */
+       NULL  /* finish */
+       };
+
+DSO_METHOD *DSO_METHOD_dl(void)
+       {
+       return(&dso_meth_dl);
+       }
+
+/* For this DSO_METHOD, our meth_data STACK will contain;
+ * (i) the handle (shl_t) returned from shl_load().
+ * NB: I checked on HPUX11 and shl_t is itself a pointer
+ * type so the cast is safe.
+ */
+
+static int dl_load(DSO *dso, char *filename)
+       {
+       shl_t ptr;
+
+       ptr = shl_load(filename, BIND_IMMEDIATE, NULL);
+       if(ptr == NULL)
+               {
+               DSOerr(DSO_F_DL_LOAD,DSO_R_LOAD_FAILED);
+               return(0);
+               }
+       if(!sk_push(dso->meth_data, (char *)ptr))
+               {
+               DSOerr(DSO_F_DL_LOAD,DSO_R_STACK_ERROR);
+               shl_unload(ptr);
+               return(0);
+               }
+       return(1);
+       }
+
+static int dl_unload(DSO *dso)
+       {
+       shl_t ptr;
+       if(dso == NULL)
+               {
+               DSOerr(DSO_F_DL_UNLOAD,ERR_R_PASSED_NULL_PARAMETER);
+               return(0);
+               }
+       if(sk_num(dso->meth_data) < 1)
+               {
+               DSOerr(DSO_F_DL_UNLOAD,DSO_R_STACK_ERROR);
+               return(0);
+               }
+       /* Is this statement legal? */
+       ptr = (shl_t)sk_pop(dso->meth_data);
+       if(ptr == NULL)
+               {
+               DSOerr(DSO_F_DL_UNLOAD,DSO_R_NULL_HANDLE);
+               /* Should push the value back onto the stack in
+                * case of a retry. */
+               sk_push(dso->meth_data, (char *)ptr);
+               return(0);
+               }
+       shl_unload(ptr);
+       return(1);
+       }
+
+static int dl_bind(DSO *dso, char *symname, void **symptr)
+       {
+       shl_t ptr;
+       void *sym;
+
+       if((dso == NULL) || (symptr == NULL) || (symname == NULL))
+               {
+               DSOerr(DSO_F_DL_BIND,ERR_R_PASSED_NULL_PARAMETER);
+               return(0);
+               }
+       if(sk_num(dso->meth_data) < 1)
+               {
+               DSOerr(DSO_F_DL_BIND,DSO_R_STACK_ERROR);
+               return(0);
+               }
+       /* Is this actually legal? */
+       ptr = (shl_t)sk_value(dso->meth_data, sk_num(dso->meth_data) - 1);
+       if(ptr == NULL)
+               {
+               DSOerr(DSO_F_DL_BIND,DSO_R_NULL_HANDLE);
+               return(0);
+               }
+       if (shl_findsym(ptr, symname, TYPE_UNDEFINED, &sym) < 0)
+               {
+               DSOerr(DSO_F_DL_BIND,DSO_R_SYM_FAILURE);
+               return(0);
+               }
+       *symptr = sym;
+       return(1);
+       }
+
+#endif /* DSO_DL */
diff --git a/crypto/dso/dso_dlfcn.c b/crypto/dso/dso_dlfcn.c
new file mode 100644 (file)
index 0000000..e9741c5
--- /dev/null
@@ -0,0 +1,179 @@
+/* dso_dlfcn.c */
+/* Written by Geoff Thorpe (geoff@geoffthorpe.net) for the OpenSSL
+ * project 2000.
+ */
+/* ====================================================================
+ * Copyright (c) 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
+ *    licensing@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 <stdio.h>
+#include "cryptlib.h"
+#include <openssl/dso.h>
+
+#ifndef DSO_DLFCN
+DSO_METHOD *DSO_METHOD_dlfcn(void)
+       {
+       return NULL;
+       }
+#else
+
+#include <dlfcn.h>
+
+static int dlfcn_load(DSO *dso, char *filename);
+static int dlfcn_unload(DSO *dso);
+static int dlfcn_bind(DSO *dso, char *symname, void **symptr);
+#if 0
+static int dlfcn_unbind(DSO *dso, char *symname, void *symptr);
+static int dlfcn_init(DSO *dso);
+static int dlfcn_finish(DSO *dso);
+#endif
+
+static DSO_METHOD dso_meth_dlfcn = {
+       "OpenSSL 'dlfcn' shared library method",
+       dlfcn_load,
+       dlfcn_unload,
+       dlfcn_bind,
+/* For now, "unbind" doesn't exist */
+#if 0
+       NULL, /* unbind */
+#endif
+       NULL, /* init */
+       NULL  /* finish */
+       };
+
+DSO_METHOD *DSO_METHOD_dlfcn(void)
+       {
+       return(&dso_meth_dlfcn);
+       }
+
+/* For this DSO_METHOD, our meth_data STACK will contain;
+ * (i) the handle (void*) returned from dlopen().
+ */
+
+static int dlfcn_load(DSO *dso, char *filename)
+       {
+       void *ptr;
+
+       ptr = dlopen(filename, RTLD_NOW);
+       if(ptr == NULL)
+               {
+               DSOerr(DSO_F_DLFCN_LOAD,DSO_R_LOAD_FAILED);
+               return(0);
+               }
+       if(!sk_push(dso->meth_data, (char *)ptr))
+               {
+               DSOerr(DSO_F_DLFCN_LOAD,DSO_R_STACK_ERROR);
+               dlclose(ptr);
+               return(0);
+               }
+       return(1);
+       }
+
+static int dlfcn_unload(DSO *dso)
+       {
+       void *ptr;
+       if(dso == NULL)
+               {
+               DSOerr(DSO_F_DLFCN_UNLOAD,ERR_R_PASSED_NULL_PARAMETER);
+               return(0);
+               }
+       if(sk_num(dso->meth_data) < 1)
+               {
+               DSOerr(DSO_F_DLFCN_UNLOAD,DSO_R_STACK_ERROR);
+               return(0);
+               }
+       ptr = (void *)sk_pop(dso->meth_data);
+       if(ptr == NULL)
+               {
+               DSOerr(DSO_F_DLFCN_UNLOAD,DSO_R_NULL_HANDLE);
+               /* Should push the value back onto the stack in
+                * case of a retry. */
+               sk_push(dso->meth_data, (char *)ptr);
+               return(0);
+               }
+       /* For now I'm not aware of any errors associated with dlclose() */
+       dlclose(ptr);
+       return(1);
+       }
+
+static int dlfcn_bind(DSO *dso, char *symname, void **symptr)
+       {
+       void *ptr, *sym;
+
+       if((dso == NULL) || (symptr == NULL) || (symname == NULL))
+               {
+               DSOerr(DSO_F_DLFCN_BIND,ERR_R_PASSED_NULL_PARAMETER);
+               return(0);
+               }
+       if(sk_num(dso->meth_data) < 1)
+               {
+               DSOerr(DSO_F_DLFCN_BIND,DSO_R_STACK_ERROR);
+               return(0);
+               }
+       ptr = (void *)sk_value(dso->meth_data, sk_num(dso->meth_data) - 1);
+       if(ptr == NULL)
+               {
+               DSOerr(DSO_F_DLFCN_BIND,DSO_R_NULL_HANDLE);
+               return(0);
+               }
+       sym = dlsym(ptr, symname);
+       if(sym == NULL)
+               {
+               DSOerr(DSO_F_DLFCN_BIND,DSO_R_SYM_FAILURE);
+               return(0);
+               }
+       *symptr = sym;
+       return(1);
+       }
+
+#endif /* DSO_DLFCN */
diff --git a/crypto/dso/dso_err.c b/crypto/dso/dso_err.c
new file mode 100644 (file)
index 0000000..efe3226
--- /dev/null
@@ -0,0 +1,113 @@
+/* crypto/dso/dso_err.c */
+/* ====================================================================
+ * Copyright (c) 1999 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).
+ *
+ */
+
+/* NOTE: this file was auto generated by the mkerr.pl script: any changes
+ * made to it will be overwritten when the script next updates this file,
+ * only reason strings will be preserved.
+ */
+
+#include <stdio.h>
+#include <openssl/err.h>
+#include <openssl/dso.h>
+
+/* BEGIN ERROR CODES */
+#ifndef NO_ERR
+static ERR_STRING_DATA DSO_str_functs[]=
+       {
+{ERR_PACK(0,DSO_F_DLFCN_BIND,0),       "DLFCN_BIND"},
+{ERR_PACK(0,DSO_F_DLFCN_LOAD,0),       "DLFCN_LOAD"},
+{ERR_PACK(0,DSO_F_DLFCN_UNLOAD,0),     "DLFCN_UNLOAD"},
+{ERR_PACK(0,DSO_F_DL_BIND,0),  "DL_BIND"},
+{ERR_PACK(0,DSO_F_DL_LOAD,0),  "DL_LOAD"},
+{ERR_PACK(0,DSO_F_DL_UNLOAD,0),        "DL_UNLOAD"},
+{ERR_PACK(0,DSO_F_DSO_BIND,0), "DSO_bind"},
+{ERR_PACK(0,DSO_F_DSO_FREE,0), "DSO_free"},
+{ERR_PACK(0,DSO_F_DSO_LOAD,0), "DSO_load"},
+{ERR_PACK(0,DSO_F_DSO_NEW_METHOD,0),   "DSO_new_method"},
+{ERR_PACK(0,DSO_F_DSO_UP,0),   "DSO_up"},
+{ERR_PACK(0,DSO_F_WIN32_BIND,0),       "WIN32_BIND"},
+{ERR_PACK(0,DSO_F_WIN32_LOAD,0),       "WIN32_LOAD"},
+{ERR_PACK(0,DSO_F_WIN32_UNLOAD,0),     "WIN32_UNLOAD"},
+{0,NULL}
+       };
+
+static ERR_STRING_DATA DSO_str_reasons[]=
+       {
+{DSO_R_FINISH_FAILED                     ,"cleanup method function failed"},
+{DSO_R_LOAD_FAILED                       ,"could not load the shared library"},
+{DSO_R_NULL_HANDLE                       ,"a null shared library handle was used"},
+{DSO_R_STACK_ERROR                       ,"the meth_data stack is corrupt"},
+{DSO_R_SYM_FAILURE                       ,"could not bind to the requested symbol name"},
+{DSO_R_UNLOAD_FAILED                     ,"could not unload the shared library"},
+{DSO_R_UNSUPPORTED                       ,"functionality not supported"},
+{0,NULL}
+       };
+
+#endif
+
+void ERR_load_DSO_strings(void)
+       {
+       static int init=1;
+
+       if (init)
+               {
+               init=0;
+#ifndef NO_ERR
+               ERR_load_strings(ERR_LIB_DSO,DSO_str_functs);
+               ERR_load_strings(ERR_LIB_DSO,DSO_str_reasons);
+#endif
+
+               }
+       }
diff --git a/crypto/dso/dso_lib.c b/crypto/dso/dso_lib.c
new file mode 100644 (file)
index 0000000..acaac27
--- /dev/null
@@ -0,0 +1,251 @@
+/* dso_lib.c */
+/* Written by Geoff Thorpe (geoff@geoffthorpe.net) for the OpenSSL
+ * project 2000.
+ */
+/* ====================================================================
+ * Copyright (c) 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
+ *    licensing@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 <stdio.h>
+#include <openssl/crypto.h>
+#include "cryptlib.h"
+#include <openssl/dso.h>
+
+static DSO_METHOD *default_DSO_meth = NULL;
+
+DSO *DSO_new(void)
+       {
+       return(DSO_new_method(NULL));
+       }
+
+void DSO_set_default_method(DSO_METHOD *meth)
+       {
+       default_DSO_meth = meth;
+       }
+
+DSO_METHOD *DSO_get_default_method(void)
+       {
+       return(default_DSO_meth);
+       }
+
+DSO_METHOD *DSO_get_method(DSO *dso)
+       {
+       return(dso->meth);
+       }
+
+DSO_METHOD *DSO_set_method(DSO *dso, DSO_METHOD *meth)
+       {
+       DSO_METHOD *mtmp;
+       mtmp = dso->meth;
+       dso->meth = meth;
+       return(mtmp);
+       }
+
+DSO *DSO_new_method(DSO_METHOD *meth)
+       {
+       DSO *ret;
+
+       if(default_DSO_meth == NULL)
+               /* We default to DSO_METH_openssl() which in turn defaults
+                * to stealing the "best available" method. Will fallback
+                * to DSO_METH_null() in the worst case. */
+               default_DSO_meth = DSO_METHOD_openssl();
+       ret = (DSO *)Malloc(sizeof(DSO));
+       if(ret == NULL)
+               {
+               DSOerr(DSO_F_DSO_NEW_METHOD,ERR_R_MALLOC_FAILURE);
+               return(NULL);
+               }
+       memset(ret, 0, sizeof(DSO));
+       ret->meth_data = sk_new(NULL);
+       if((ret->meth_data = sk_new(NULL)) == NULL)
+               {
+               /* sk_new doesn't generate any errors so we do */
+               DSOerr(DSO_F_DSO_NEW_METHOD,ERR_R_MALLOC_FAILURE);
+               Free(ret);
+               return(NULL);
+               }
+       if(meth == NULL)
+               ret->meth = default_DSO_meth;
+       else
+               ret->meth = meth;
+       ret->references = 1;
+       if((ret->meth->init != NULL) && !ret->meth->init(ret))
+               {
+               Free(ret);
+               ret=NULL;
+               }
+       return(ret);
+       }
+
+int DSO_free(DSO *dso)
+       {
+        int i;
+       if(dso == NULL)
+               {
+               DSOerr(DSO_F_DSO_FREE,ERR_R_PASSED_NULL_PARAMETER);
+               return(0);
+               }
+       i=CRYPTO_add(&dso->references,-1,CRYPTO_LOCK_DSO);
+#ifdef REF_PRINT
+       REF_PRINT("DSO",dso);
+#endif
+       if(i > 0) return(1);
+#ifdef REF_CHECK
+       if(i < 0)
+               {
+               fprintf(stderr,"DSO_free, bad reference count\n");
+               abort();
+               }
+#endif
+
+       if((dso->meth->dso_unload != NULL) && !dso->meth->dso_unload(dso))
+               {
+               DSOerr(DSO_F_DSO_FREE,DSO_R_UNLOAD_FAILED);
+               return(0);
+               }
+       if((dso->meth->finish != NULL) && !dso->meth->finish(dso))
+               {
+               DSOerr(DSO_F_DSO_FREE,DSO_R_FINISH_FAILED);
+               return(0);
+               }
+       
+       sk_free(dso->meth_data);
+       Free(dso);
+       return(1);
+       }
+
+int DSO_flags(DSO *dso)
+       {
+       return((dso == NULL) ? 0 : dso->flags);
+       }
+
+
+int DSO_up(DSO *dso)
+       {
+       if (dso == NULL)
+               {
+               DSOerr(DSO_F_DSO_UP,ERR_R_PASSED_NULL_PARAMETER);
+               return(0);
+               }
+
+       CRYPTO_add(&dso->references,1,CRYPTO_LOCK_DSO);
+       return(1);
+       }
+
+DSO *DSO_load(DSO *dso, char *filename, DSO_METHOD *meth)
+       {
+       DSO *ret;
+       int allocated = 0;
+
+       if(filename == NULL)
+               {
+               DSOerr(DSO_F_DSO_LOAD,ERR_R_PASSED_NULL_PARAMETER);
+               return(NULL);
+               }
+       if(dso == NULL)
+               {
+               ret = DSO_new_method(meth);
+               if(ret == NULL)
+                       {
+                       DSOerr(DSO_F_DSO_LOAD,ERR_R_MALLOC_FAILURE);
+                       return(NULL);
+                       }
+               allocated = 1;
+               }
+       else
+               ret = dso;
+       if(ret->meth->dso_load == NULL)
+               {
+               DSOerr(DSO_F_DSO_LOAD,DSO_R_UNSUPPORTED);
+               if(allocated)
+                       DSO_free(ret);
+               return(NULL);
+               }
+       if(!ret->meth->dso_load(ret, filename))
+               {
+               DSOerr(DSO_F_DSO_LOAD,DSO_R_LOAD_FAILED);
+               if(allocated)
+                       DSO_free(ret);
+               return(NULL);
+               }
+       /* Load succeeded */
+       return(ret);
+       }
+
+void *DSO_bind(DSO *dso, char *symname)
+       {
+       void *ret = NULL;
+
+       if((dso == NULL) || (symname == NULL))
+               {
+               DSOerr(DSO_F_DSO_BIND,ERR_R_PASSED_NULL_PARAMETER);
+               return(NULL);
+               }
+       if(dso->meth->dso_bind == NULL)
+               {
+               DSOerr(DSO_F_DSO_BIND,DSO_R_UNSUPPORTED);
+               return(NULL);
+               }
+       if(!dso->meth->dso_bind(dso, symname, &ret))
+               {
+               DSOerr(DSO_F_DSO_BIND,DSO_R_SYM_FAILURE);
+               return(NULL);
+               }
+       /* Success */
+       return(ret);
+       }
diff --git a/crypto/dso/dso_null.c b/crypto/dso/dso_null.c
new file mode 100644 (file)
index 0000000..ee6a31e
--- /dev/null
@@ -0,0 +1,83 @@
+/* dso_null.c */
+/* Written by Geoff Thorpe (geoff@geoffthorpe.net) for the OpenSSL
+ * project 2000.
+ */
+/* ====================================================================
+ * Copyright (c) 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
+ *    licensing@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).
+ *
+ */
+
+/* This "NULL" method is provided as the fallback for systems that have
+ * no appropriate support for "shared-libraries". */
+
+#include <stdio.h>
+#include "cryptlib.h"
+#include <openssl/dso.h>
+
+static DSO_METHOD dso_meth_null = {
+       "NULL shared library method",
+       NULL, /* load */
+       NULL, /* unload */
+       NULL, /* bind */
+/* For now, "unbind" doesn't exist */
+#if 0
+       NULL, /* unbind */
+#endif
+       NULL, /* init */
+       NULL  /* finish */
+       };
+
+DSO_METHOD *DSO_METHOD_null(void)
+       {
+       return(&dso_meth_null);
+       }
+
diff --git a/crypto/dso/dso_openssl.c b/crypto/dso/dso_openssl.c
new file mode 100644 (file)
index 0000000..fb12572
--- /dev/null
@@ -0,0 +1,79 @@
+/* dso_openssl.c */
+/* Written by Geoff Thorpe (geoff@geoffthorpe.net) for the OpenSSL
+ * project 2000.
+ */
+/* ====================================================================
+ * Copyright (c) 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
+ *    licensing@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 <stdio.h>
+#include "cryptlib.h"
+#include <openssl/dso.h>
+
+/* We just pinch the method from an appropriate "default" method. */
+
+DSO_METHOD *DSO_METHOD_openssl(void)
+       {
+#ifdef DEF_DSO_METHOD
+       return(DEF_DSO_METHOD());
+#elif defined(DSO_DLFCN)
+       return(DSO_METHOD_dlfcn());
+#elif defined(DSO_DL)
+       return(DSO_METHOD_dl());
+#elif defined(DSO_WIN32)
+       return(DSO_METHOD_win32());
+#else
+       return(DSO_METHOD_null());
+#endif
+       }
+
diff --git a/crypto/dso/dso_win32.c b/crypto/dso/dso_win32.c
new file mode 100644 (file)
index 0000000..f04cb58
--- /dev/null
@@ -0,0 +1,193 @@
+/* dso_win32.c */
+/* Written by Geoff Thorpe (geoff@geoffthorpe.net) for the OpenSSL
+ * project 2000.
+ */
+/* ====================================================================
+ * Copyright (c) 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
+ *    licensing@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 <stdio.h>
+#include "cryptlib.h"
+#include <openssl/dso.h>
+
+#ifndef WIN32
+DSO_METHOD *DSO_METHOD_win32(void)
+       {
+       return NULL;
+       }
+#else
+
+static int win32_load(DSO *dso, char *filename);
+static int win32_unload(DSO *dso);
+static int win32_bind(DSO *dso, char *symname, void **symptr);
+#if 0
+static int win32_unbind(DSO *dso, char *symname, void *symptr);
+static int win32_init(DSO *dso);
+static int win32_finish(DSO *dso);
+#endif
+
+static DSO_METHOD dso_meth_win32 = {
+       "OpenSSL 'win32' shared library method",
+       win32_load,
+       win32_unload,
+       win32_bind,
+/* For now, "unbind" doesn't exist */
+#if 0
+       NULL, /* unbind */
+#endif
+       NULL, /* init */
+       NULL  /* finish */
+       };
+
+DSO_METHOD *DSO_METHOD_win32(void)
+       {
+       return(&dso_meth_win32);
+       }
+
+/* For this DSO_METHOD, our meth_data STACK will contain;
+ * (i) a pointer to the handle (HINSTANCE) returned from
+ *      LoadLibrary(), and copied.
+ */
+
+static int win32_load(DSO *dso, char *filename)
+       {
+       HINSTANCE h, *p;
+
+       h = LoadLibrary(filename);
+       if(h == NULL)
+               {
+               DSOerr(DSO_F_WIN32_LOAD,DSO_R_LOAD_FAILED);
+               return(0);
+               }
+       p = (HINSTANCE *)Malloc(sizeof(HINSTANCE));
+       if(p == NULL)
+               {
+               DSOerr(DSO_F_WIN32_LOAD,ERR_R_MALLOC_FAILURE);
+               FreeLibrary(h);
+               return(0);
+               }
+       *p = h;
+       if(!sk_push(dso->meth_data, (char *)p))
+               {
+               DSOerr(DSO_F_WIN32_LOAD,DSO_R_STACK_ERROR);
+               FreeLibrary(h);
+               Free(p);
+               return(0);
+               }
+       return(1);
+       }
+
+static int win32_unload(DSO *dso)
+       {
+       HINSTANCE *p;
+       if(dso == NULL)
+               {
+               DSOerr(DSO_F_WIN32_UNLOAD,ERR_R_PASSED_NULL_PARAMETER);
+               return(0);
+               }
+       if(sk_num(dso->meth_data) < 1)
+               {
+               DSOerr(DSO_F_WIN32_UNLOAD,DSO_R_STACK_ERROR);
+               return(0);
+               }
+       p = (HINSTANCE *)sk_pop(dso->meth_data);
+       if(p == NULL)
+               {
+               DSOerr(DSO_F_WIN32_UNLOAD,DSO_R_NULL_HANDLE);
+               return(0);
+               }
+       if(!FreeLibrary(p))
+               {
+               DSOerr(DSO_F_WIN32_UNLOAD,DSO_R_UNLOAD_FAILED);
+               /* We should push the value back onto the stack in
+                * case of a retry. */
+               sk_push(dso->meth_data, (char *)p);
+               return(0);
+               }
+       /* Cleanup */
+       Free(p);
+       return(1);
+       }
+
+static int win32_bind(DSO *dso, char *symname, void **symptr)
+       {
+       HINSTANCE *ptr;
+       void *sym;
+
+       if((dso == NULL) || (symptr == NULL) || (symname == NULL))
+               {
+               DSOerr(DSO_F_WIN32_BIND,ERR_R_PASSED_NULL_PARAMETER);
+               return(0);
+               }
+       if(sk_num(dso->meth_data) < 1)
+               {
+               DSOerr(DSO_F_WIN32_BIND,DSO_R_STACK_ERROR);
+               return(0);
+               }
+       ptr = (HINSTANCE *)sk_value(dso->meth_data, sk_num(dso->meth_data) - 1);
+       if(ptr == NULL)
+               {
+               DSOerr(DSO_F_WIN32_BIND,DSO_R_NULL_HANDLE);
+               return(0);
+               }
+       sym = GetProcAddress(*ptr, symname);
+       if(sym == NULL)
+               {
+               DSOerr(DSO_F_WIN32_BIND,DSO_R_SYM_FAILURE);
+               return(0);
+               }
+       *symptr = sym;
+       return(1);
+       }
+
+#endif /* WIN32 */