Project import
diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..6390c5b --- /dev/null +++ b/Makefile
@@ -0,0 +1,76 @@ +# +# Copyright (c) 2011-2013 Nest Labs, Inc. +# All rights reserved. +# +# This document is the property of Nest. It is considered +# confidential and proprietary information. +# +# This document may not be reproduced or transmitted in any form, +# in whole or in part, without the express written permission of +# Nest. +# +# Description: +# + +include pre.mak + +TpsDir = sw/tps +NestlabsLibDir = sw/nestlabs + +ResultIncDir = $(call GenerateResultPaths,,openssl) +ResultLibDir = $(call GenerateResultPaths,,.) +BuildDir = $(CURDIR)/$(BuildDirectory) + +PolarsslIncDir = $(call GenerateResultPaths,,polarssl) + +NlEMallocResultsDir = $(NestlabsLibDir)/lib/nlemalloc +NlEMallocIncludeDir = include +NlEMallocLibraryDir = +NlEMallocIncludePath = $(BuildRoot)/$(NlEMallocResultsDir)/$(NlEMallocIncludeDir) + +# +# Third-party software frameworks +# + +CLibraryDir = $(TpsDir)/newlib +CLibraryIncludeDir = $(call GenerateResultPaths,$(CLibraryDir),usr/arm-none-eabi/include) +CLibraryLibDir = $(call GenerateResultPaths,$(CLibraryDir),usr/arm-none-eabi/lib) + +AllLibraries = \ + libemssl.a \ + libbn.a \ + libjpake.a \ + libecdsa.a \ + libec.a \ + libecdh.a \ + libpolarssl.a \ + libctrdrbg.a + +all: install-includes $(BuildDir) + $(MAKE) \ + BUILD_DIR="$(BuildDir)" \ + LINK="$(LD) $(LDFLAGS)" \ + CC="$(CC)" \ + CPPFLAGS="$(CPPOPTFLAGS) -I$(NlEMallocIncludePath) -I$(CLibraryIncludeDir)" \ + AR=$(AR) \ + BN_MONT_ASM_TYPE=$(TargetProcArch) \ + -f Makefile.emssl + cp $(foreach l,$(AllLibraries),$(BuildDirectory)/lib/$(l)) $(ResultLibDir) + +clean: + $(MAKE) BUILD_DIR="$(BuildDir)" -f Makefile.emssl $@ + +$(ResultIncDir): + $(MKDIR) -p $@ + +$(PolarsslIncDir): + $(MKDIR) -p $@ + +$(BuildDir): + $(MKDIR) -p $@ + +install-includes: $(ResultIncDir) $(PolarsslIncDir) + cp openssl/*.h $(ResultIncDir) + cp polarssl/*.h $(PolarsslIncDir) + +include post.mak
diff --git a/Makefile.config b/Makefile.config new file mode 100644 index 0000000..745d98c --- /dev/null +++ b/Makefile.config
@@ -0,0 +1,73 @@ +# Copyright 2010 by Nest Labs, Inc. All rights reserved. +# +# This program is confidential and proprietary to Nest Labs, Inc., +# and may not be reproduced, published or disclosed to others without +# company authorization. +# + +# the setup below is for gcc on a unix-like platform. + +BUILD_DIR ?= $(DEPTH).build +OBJ_DIR = $(BUILD_DIR)/objs +LIB_DIR = $(BUILD_DIR)/lib +BIN_DIR = $(BUILD_DIR)/bin + +OS_ARCH := $(shell uname -s | sed -e 's|/|_|g') + +ifeq ($(OS_ARCH),Darwin) +CC = @echo $@; gcc -Os -DNL_DARWIN +OPT_INCLUDE = /opt/local/include +OPT_LIB = /opt/local/lib +else +CC = @echo $@; gcc -DNL_LINUX -Os +OPT_INCLUDE = /usr/local/include +OPT_LIB = /usr/local/lib -L/usr/lib +endif + +#LINK = @echo $@; g++ -dead_strip +LINK = echo $@;gcc -Wl,--gc-sections + +ARCHIVE = @echo $@; ar -rucs + +RANLIB = ranlib + +#MAKE = make -s + +RM = rm -rf + +MKDIR = mkdir -p + +CP = cp + +WFLAGS = \ + -Wunused \ + -Wimplicit \ + -Wreturn-type \ + -Wparentheses \ + -Wformat \ + -Wchar-subscripts \ + -Wno-c++-compat \ + -Wsequence-point + +# -Wmissing-prototypes \ +# -pedantic \ + +CFLAGS = $(CPPFLAGS) \ + $(WFLAGS) \ + -ffunction-sections \ + -fdata-sections \ + -c \ + -g \ + $(DEFINES) \ + -I ./ \ + -I $(DEPTH) \ + -I $(OPT_INCLUDE) \ + -I $(DEPTH)include \ + -I $(DEPTH)openssl \ + -I $(DEPTH)polarssl \ + -I include \ + $(INCLUDES) + +LIBS = -L$(LIB_DIR) \ + -L$(OPT_LIB) \ +
diff --git a/Makefile.emssl b/Makefile.emssl new file mode 100644 index 0000000..0810003 --- /dev/null +++ b/Makefile.emssl
@@ -0,0 +1,46 @@ +# Copyright 2010 by Nest Labs, Inc. All rights reserved. +# +# This program is confidential and proprietary to Nest Labs, Inc., +# and may not be reproduced, published or disclosed to others without +# company authorization. +# + +# OBJ_DIR should be set by the user to the right directory, +# if necessary. + +#note that there are only dependencies on files within +#each subdirectory. if you change in file in one subdirectory +#nothing outside that directory will ever know about it. +#manage dependencies on your own. it's not that hard. +#and one final note, we are not generating shared libraries, so +#if you make a change in a component and rebuild it, you will also +#need to relink all executables. i should add a target to do just that. +#mmp + +DEPTH = ./ + +include $(DEPTH)Makefile.config + +.PHONY: libdir openssl polarssl + +all: libdir openssl polarssl + +libdir: + $(MKDIR) $(LIB_DIR) + $(MKDIR) $(BIN_DIR) + +openssl: + $(MAKE) BUILD_DIR=$(BUILD_DIR) -C $@ + +polarssl: + $(MAKE) BUILD_DIR=$(BUILD_DIR) -C $@ + +driver: + $(MAKE) BUILD_DIR=$(BUILD_DIR) -C $@ + +clean: + $(MAKE) BUILD_DIR=$(BUILD_DIR) -C openssl $@ + $(MAKE) BUILD_DIR=$(BUILD_DIR) -C polarssl $@ + $(MAKE) BUILD_DIR=$(BUILD_DIR) -C driver $@ + $(RM) $(LIB_DIR) + $(RM) $(BIN_DIR)
diff --git a/driver/Makefile b/driver/Makefile new file mode 100644 index 0000000..01d0e5c --- /dev/null +++ b/driver/Makefile
@@ -0,0 +1,53 @@ +# Copyright 2010 by Nest Labs, Inc. All rights reserved. +# +# This program is confidential and proprietary to Nest Labs, Inc., +# and may not be reproduced, published or disclosed to others without +# company authorization. +# + +DEPTH = ../ + +include $(DEPTH)Makefile.config + +OUTDIR = $(OBJ_DIR) +SRCDIR = ./ +INCDIR = ./ + +OBJECT_FILES = \ + security_driver + +HEADER_FILES = \ + +OBJECTS = $(OBJECT_FILES:%=$(OUTDIR)/%.o) +HEADERS = $(HEADER_FILES:%=$(INCDIR)/%.h) + +LIBRARY_DEPS = \ + $(LIB_DIR)/libbn.a \ + $(LIB_DIR)/libjpake.a \ + $(LIB_DIR)/libsha.a \ + $(LIB_DIR)/libec.a \ + $(LIB_DIR)/libecdh.a \ + $(LIB_DIR)/libaes.a \ + $(LIB_DIR)/libecdsa.a \ + $(LIB_DIR)/libemssl.a \ + $(LIB_DIR)/libctrdrbg.a \ + $(LIB_DIR)/libpolarssl.a + +all: $(OUTDIR) $(OUTDIR)/security_driver + +$(OUTDIR): + $(MKDIR) $(OUTDIR) + +clean: + $(RM) $(OUTDIR) + +$(OUTDIR)/%.o: $(SRCDIR)/%.c $(HEADERS) + $(CC) $(CFLAGS) $< -o $@ + +$(OUTDIR)/%.o: $(SRCDIR)/%.cpp $(HEADERS) + $(CC) $(CFLAGS) $< -o $@ + +$(OUTDIR)/security_driver: $(OUTDIR)/security_driver.o $(LIBRARY_DEPS) + $(LINK) $(OUTDIR)/security_driver.o $(LIBS) $(OCLIBS) -ljpake -lsha -lecdsa -lec -lecdh -lbn -lemssl -lctrdrbg -lpolarssl -laes -o $(OUTDIR)/security_driver + $(CP) $@ $(BIN_DIR) +
diff --git a/driver/security_driver.c b/driver/security_driver.c new file mode 100644 index 0000000..888118a --- /dev/null +++ b/driver/security_driver.c
@@ -0,0 +1,89 @@ +#include <stdio.h> +#include <string.h> +#include <openssl/ec.h> +#include <openssl/ecdsa.h> +#include <openssl/obj_mac.h> +#include <openssl/jpake.h> +#include <openssl/ecdh.h> +#include <polarssl/ctr_drbg.h> + +int entropy(void *closure, unsigned char *outentropy, size_t outsize) +{ + unsigned char *entropy; + int rval, idx; + +printf("hey, somebody wants entropy: %p, %d\n", outentropy, outsize); + do + { +#ifdef gPlatformGetRandomNumber + rval = (int)gPlatformGetRandomNumber(); +#else + rval = rand(); +#endif + + entropy = (unsigned char *)&rval; +printf("got some sweet entropy: %08x\n", rval); + + for (idx = 0; (idx < sizeof(int)) && (outsize > 0); idx++, outsize--) + *outentropy++ = *entropy++; + } + while (outsize > 0); + + return 0; +} + +ctr_drbg_context *gCTRDRBG_ctx = NULL; + +int main(int argc, char ** argv) +{ + int retval = 0; + int i; + +#ifdef gPlatformSetInputEntropy + gPlatformSetInputEntropy(seed); +#else + time_t tim; + + tim = time(NULL); + + srand(tim); +#endif + + // Force linker references to the necessary top-level functions. + + static void *functions[] = + { + (void *)ECDSA_do_sign, + (void *)ECDSA_do_verify, + + (void *)JPAKE_STEP1_init, + (void *)JPAKE_STEP1_generate, + (void *)JPAKE_STEP1_process, + (void *)JPAKE_STEP1_release, + (void *)JPAKE_STEP2_init, + (void *)JPAKE_STEP2_generate, + (void *)JPAKE_STEP2_process, + (void *)JPAKE_STEP2_release, + + (void *)ECDH_compute_key, + NULL + }; + + for (i = 0; functions[i] != NULL; i++) + printf("%p\n", functions[i]); + + ctr_drbg_context ctx; + +#ifdef DEBUG + ctr_drbg_self_test(1); +#endif + + retval = ctr_drbg_init(&ctx, entropy, NULL, NULL, 0); + + gCTRDRBG_ctx = &ctx; + + printf("returning: %d\n", retval); + + return retval; +} +
diff --git a/include/cryptlib.h b/include/cryptlib.h new file mode 100644 index 0000000..d26f963 --- /dev/null +++ b/include/cryptlib.h
@@ -0,0 +1,111 @@ +/* crypto/cryptlib.h */ +/* 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.] + */ + +#ifndef HEADER_CRYPTLIB_H +#define HEADER_CRYPTLIB_H + +#include <stdlib.h> +#include <string.h> + +#include "e_os.h" + +#ifdef OPENSSL_USE_APPLINK +#define BIO_FLAGS_UPLINK 0x8000 +#include "ms/uplink.h" +#endif + +#include <openssl/crypto.h> +#include <openssl/buffer.h> +#include <openssl/bio.h> +#include <openssl/err.h> +#include <openssl/opensslconf.h> + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef OPENSSL_SYS_VMS +#define X509_CERT_AREA OPENSSLDIR +#define X509_CERT_DIR OPENSSLDIR "/certs" +#define X509_CERT_FILE OPENSSLDIR "/cert.pem" +#define X509_PRIVATE_DIR OPENSSLDIR "/private" +#else +#define X509_CERT_AREA "SSLROOT:[000000]" +#define X509_CERT_DIR "SSLCERTS:" +#define X509_CERT_FILE "SSLCERTS:cert.pem" +#define X509_PRIVATE_DIR "SSLPRIVATE:" +#endif + +#define X509_CERT_DIR_EVP "SSL_CERT_DIR" +#define X509_CERT_FILE_EVP "SSL_CERT_FILE" + +/* size of string representations */ +#define DECIMAL_SIZE(type) ((sizeof(type)*8+2)/3+1) +#define HEX_SIZE(type) (sizeof(type)*2) + +void OPENSSL_cpuid_setup(void); +extern unsigned int OPENSSL_ia32cap_P[]; +void OPENSSL_showfatal(const char *fmta,...); +void *OPENSSL_stderr(void); +extern int OPENSSL_NONPIC_relocated; + +#ifdef __cplusplus +} +#endif + +#endif
diff --git a/include/e_os.h b/include/e_os.h new file mode 100644 index 0000000..79c1392 --- /dev/null +++ b/include/e_os.h
@@ -0,0 +1,734 @@ +/* e_os.h */ +/* 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.] + */ + +#ifndef HEADER_E_OS_H +#define HEADER_E_OS_H + +#include <openssl/opensslconf.h> + +#include <openssl/e_os2.h> +/* <openssl/e_os2.h> contains what we can justify to make visible + * to the outside; this file e_os.h is not part of the exported + * interface. */ + +#ifdef __cplusplus +extern "C" { +#endif + +/* Used to checking reference counts, most while doing perl5 stuff :-) */ +#ifdef REF_PRINT +#undef REF_PRINT +#define REF_PRINT(a,b) fprintf(stderr,"%08X:%4d:%s\n",(int)b,b->references,a) +#endif + +#ifndef DEVRANDOM +/* set this to a comma-separated list of 'random' device files to try out. + * My default, we will try to read at least one of these files */ +#define DEVRANDOM "/dev/urandom","/dev/random","/dev/srandom" +#endif +#ifndef DEVRANDOM_EGD +/* set this to a comma-seperated list of 'egd' sockets to try out. These + * sockets will be tried in the order listed in case accessing the device files + * listed in DEVRANDOM did not return enough entropy. */ +#define DEVRANDOM_EGD "/var/run/egd-pool","/dev/egd-pool","/etc/egd-pool","/etc/entropy" +#endif + +#if defined(OPENSSL_SYS_VXWORKS) +# define NO_SYS_PARAM_H +# define NO_CHMOD +# define NO_SYSLOG +#endif + +#if defined(OPENSSL_SYS_MACINTOSH_CLASSIC) +# if macintosh==1 +# ifndef MAC_OS_GUSI_SOURCE +# define MAC_OS_pre_X +# define NO_SYS_TYPES_H +# endif +# define NO_SYS_PARAM_H +# define NO_CHMOD +# define NO_SYSLOG +# undef DEVRANDOM +# define GETPID_IS_MEANINGLESS +# endif +#endif + +/******************************************************************** + The Microsoft section + ********************************************************************/ +/* The following is used because of the small stack in some + * Microsoft operating systems */ +#if defined(OPENSSL_SYS_MSDOS) && !defined(OPENSSL_SYSNAME_WIN32) +# define MS_STATIC static +#else +# define MS_STATIC +#endif + +#if defined(OPENSSL_SYS_WIN32) && !defined(WIN32) +# define WIN32 +#endif +#if defined(OPENSSL_SYS_WINDOWS) && !defined(WINDOWS) +# define WINDOWS +#endif +#if defined(OPENSSL_SYS_MSDOS) && !defined(MSDOS) +# define MSDOS +#endif + +#if defined(MSDOS) && !defined(GETPID_IS_MEANINGLESS) +# define GETPID_IS_MEANINGLESS +#endif + +#ifdef WIN32 +#define get_last_sys_error() GetLastError() +#define clear_sys_error() SetLastError(0) +#if !defined(WINNT) +#define WIN_CONSOLE_BUG +#endif +#else +#define get_last_sys_error() errno +#define clear_sys_error() errno=0 +#endif + +#if defined(WINDOWS) +#define get_last_socket_error() WSAGetLastError() +#define clear_socket_error() WSASetLastError(0) +#define readsocket(s,b,n) recv((s),(b),(n),0) +#define writesocket(s,b,n) send((s),(b),(n),0) +#elif defined(__DJGPP__) +#define WATT32 +#define get_last_socket_error() errno +#define clear_socket_error() errno=0 +#define closesocket(s) close_s(s) +#define readsocket(s,b,n) read_s(s,b,n) +#define writesocket(s,b,n) send(s,b,n,0) +#elif defined(MAC_OS_pre_X) +#define get_last_socket_error() errno +#define clear_socket_error() errno=0 +#define closesocket(s) MacSocket_close(s) +#define readsocket(s,b,n) MacSocket_recv((s),(b),(n),true) +#define writesocket(s,b,n) MacSocket_send((s),(b),(n)) +#elif defined(OPENSSL_SYS_VMS) +#define get_last_socket_error() errno +#define clear_socket_error() errno=0 +#define ioctlsocket(a,b,c) ioctl(a,b,c) +#define closesocket(s) close(s) +#define readsocket(s,b,n) recv((s),(b),(n),0) +#define writesocket(s,b,n) send((s),(b),(n),0) +#elif defined(OPENSSL_SYS_VXWORKS) +#define get_last_socket_error() errno +#define clear_socket_error() errno=0 +#define ioctlsocket(a,b,c) ioctl((a),(b),(int)(c)) +#define closesocket(s) close(s) +#define readsocket(s,b,n) read((s),(b),(n)) +#define writesocket(s,b,n) write((s),(char *)(b),(n)) +#elif defined(OPENSSL_SYS_BEOS_R5) +#define get_last_socket_error() errno +#define clear_socket_error() errno=0 +#define FIONBIO SO_NONBLOCK +#define ioctlsocket(a,b,c) setsockopt((a),SOL_SOCKET,(b),(c),sizeof(*(c))) +#define readsocket(s,b,n) recv((s),(b),(n),0) +#define writesocket(s,b,n) send((s),(b),(n),0) +#elif defined(OPENSSL_SYS_NETWARE) +#if defined(NETWARE_BSDSOCK) +#define get_last_socket_error() errno +#define clear_socket_error() errno=0 +#define closesocket(s) close(s) +#define ioctlsocket(a,b,c) ioctl(a,b,c) +#if defined(NETWARE_LIBC) +#define readsocket(s,b,n) recv((s),(b),(n),0) +#define writesocket(s,b,n) send((s),(b),(n),0) +#else +#define readsocket(s,b,n) recv((s),(char*)(b),(n),0) +#define writesocket(s,b,n) send((s),(char*)(b),(n),0) +#endif +#else +#define get_last_socket_error() WSAGetLastError() +#define clear_socket_error() WSASetLastError(0) +#define readsocket(s,b,n) recv((s),(b),(n),0) +#define writesocket(s,b,n) send((s),(b),(n),0) +#endif +#else +#define get_last_socket_error() errno +#define clear_socket_error() errno=0 +#define ioctlsocket(a,b,c) ioctl(a,b,c) +#define closesocket(s) close(s) +#define readsocket(s,b,n) read((s),(b),(n)) +#define writesocket(s,b,n) write((s),(b),(n)) +#endif + +#ifdef WIN16 /* never the case */ +# define MS_CALLBACK _far _loadds +# define MS_FAR _far +#else +# define MS_CALLBACK +# define MS_FAR +#endif + +#ifdef OPENSSL_NO_STDIO +# undef OPENSSL_NO_FP_API +# define OPENSSL_NO_FP_API +#endif + +#if (defined(WINDOWS) || defined(MSDOS)) + +# ifdef __DJGPP__ +# include <unistd.h> +# include <sys/stat.h> +# include <sys/socket.h> +# include <tcp.h> +# include <netdb.h> +# define _setmode setmode +# define _O_TEXT O_TEXT +# define _O_BINARY O_BINARY +# undef DEVRANDOM +# define DEVRANDOM "/dev/urandom\x24" +# endif /* __DJGPP__ */ + +# ifndef S_IFDIR +# define S_IFDIR _S_IFDIR +# endif + +# ifndef S_IFMT +# define S_IFMT _S_IFMT +# endif + +# if !defined(WINNT) && !defined(__DJGPP__) +# define NO_SYSLOG +# endif +# define NO_DIRENT + +# ifdef WINDOWS +# if !defined(_WIN32_WCE) && !defined(_WIN32_WINNT) + /* + * Defining _WIN32_WINNT here in e_os.h implies certain "discipline." + * Most notably we ought to check for availability of each specific + * routine with GetProcAddress() and/or guard NT-specific calls with + * GetVersion() < 0x80000000. One can argue that in latter "or" case + * we ought to /DELAYLOAD some .DLLs in order to protect ourselves + * against run-time link errors. This doesn't seem to be necessary, + * because it turned out that already Windows 95, first non-NT Win32 + * implementation, is equipped with at least NT 3.51 stubs, dummy + * routines with same name, but which do nothing. Meaning that it's + * apparently sufficient to guard "vanilla" NT calls with GetVersion + * alone, while NT 4.0 and above interfaces ought to be linked with + * GetProcAddress at run-time. + */ +# define _WIN32_WINNT 0x0400 +# endif +# if !defined(OPENSSL_NO_SOCK) && defined(_WIN32_WINNT) + /* + * Just like defining _WIN32_WINNT including winsock2.h implies + * certain "discipline" for maintaining [broad] binary compatibility. + * As long as structures are invariant among Winsock versions, + * it's sufficient to check for specific Winsock2 API availability + * at run-time [DSO_global_lookup is recommended]... + */ +# include <winsock2.h> +# include <ws2tcpip.h> + /* yes, they have to be #included prior to <windows.h> */ +# endif +# include <windows.h> +# include <stdio.h> +# include <stddef.h> +# include <errno.h> +# include <string.h> +# ifdef _WIN64 +# define strlen(s) _strlen31(s) +/* cut strings to 2GB */ +static unsigned int _strlen31(const char *str) + { + unsigned int len=0; + while (*str && len<0x80000000U) str++, len++; + return len&0x7FFFFFFF; + } +# endif +# include <malloc.h> +# if defined(_MSC_VER) && _MSC_VER<=1200 && defined(_MT) && defined(isspace) + /* compensate for bug in VC6 ctype.h */ +# undef isspace +# undef isdigit +# undef isalnum +# undef isupper +# undef isxdigit +# endif +# if defined(_MSC_VER) && !defined(_DLL) && defined(stdin) +# if _MSC_VER>=1300 +# undef stdin +# undef stdout +# undef stderr + FILE *__iob_func(); +# define stdin (&__iob_func()[0]) +# define stdout (&__iob_func()[1]) +# define stderr (&__iob_func()[2]) +# elif defined(I_CAN_LIVE_WITH_LNK4049) +# undef stdin +# undef stdout +# undef stderr + /* pre-1300 has __p__iob(), but it's available only in msvcrt.lib, + * or in other words with /MD. Declaring implicit import, i.e. + * with _imp_ prefix, works correctly with all compiler options, + * but without /MD results in LINK warning LNK4049: + * 'locally defined symbol "__iob" imported'. + */ + extern FILE *_imp___iob; +# define stdin (&_imp___iob[0]) +# define stdout (&_imp___iob[1]) +# define stderr (&_imp___iob[2]) +# endif +# endif +# endif +# include <io.h> +# include <fcntl.h> + +# ifdef OPENSSL_SYS_WINCE +# define OPENSSL_NO_POSIX_IO +# endif + +# if defined (__BORLANDC__) +# define _setmode setmode +# define _O_TEXT O_TEXT +# define _O_BINARY O_BINARY +# define _int64 __int64 +# define _kbhit kbhit +# endif + +# define EXIT(n) exit(n) +# define LIST_SEPARATOR_CHAR ';' +# ifndef X_OK +# define X_OK 0 +# endif +# ifndef W_OK +# define W_OK 2 +# endif +# ifndef R_OK +# define R_OK 4 +# endif +# define OPENSSL_CONF "openssl.cnf" +# define SSLEAY_CONF OPENSSL_CONF +# define NUL_DEV "nul" +# define RFILE ".rnd" +# ifdef OPENSSL_SYS_WINCE +# define DEFAULT_HOME "" +# else +# define DEFAULT_HOME "C:" +# endif + +#else /* The non-microsoft world */ + +# ifdef OPENSSL_SYS_VMS +# define VMS 1 + /* some programs don't include stdlib, so exit() and others give implicit + function warnings */ +# include <stdlib.h> +# if defined(__DECC) +# include <unistd.h> +# else +# include <unixlib.h> +# endif +# define OPENSSL_CONF "openssl.cnf" +# define SSLEAY_CONF OPENSSL_CONF +# define RFILE ".rnd" +# define LIST_SEPARATOR_CHAR ',' +# define NUL_DEV "NLA0:" + /* We don't have any well-defined random devices on VMS, yet... */ +# undef DEVRANDOM + /* We need to do this since VMS has the following coding on status codes: + + Bits 0-2: status type: 0 = warning, 1 = success, 2 = error, 3 = info ... + The important thing to know is that odd numbers are considered + good, while even ones are considered errors. + Bits 3-15: actual status number + Bits 16-27: facility number. 0 is considered "unknown" + Bits 28-31: control bits. If bit 28 is set, the shell won't try to + output the message (which, for random codes, just looks ugly) + + So, what we do here is to change 0 to 1 to get the default success status, + and everything else is shifted up to fit into the status number field, and + the status is tagged as an error, which I believe is what is wanted here. + -- Richard Levitte + */ +# define EXIT(n) do { int __VMS_EXIT = n; \ + if (__VMS_EXIT == 0) \ + __VMS_EXIT = 1; \ + else \ + __VMS_EXIT = (n << 3) | 2; \ + __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 + extern int GetThreadID(void); +/* # include <conio.h> */ + extern int kbhit(void); +# else +# include <screen.h> +# 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 +# define NO_SYS_PARAM_H +# endif +# ifdef OPENSSL_UNISTD +# include OPENSSL_UNISTD +# else +# include <unistd.h> +# endif +# ifndef NO_SYS_TYPES_H +# include <sys/types.h> +# endif +# if defined(NeXT) || defined(OPENSSL_SYS_NEWS4) +# define pid_t int /* pid_t is missing on NEXTSTEP/OPENSTEP + * (unless when compiling with -D_POSIX_SOURCE, + * which doesn't work for us) */ +# endif +# ifdef OPENSSL_SYS_NEWS4 /* setvbuf is missing on mips-sony-bsd */ +# define setvbuf(a, b, c, d) setbuffer((a), (b), (d)) + typedef unsigned long clock_t; +# endif +# ifdef OPENSSL_SYS_WIN32_CYGWIN +# include <io.h> +# include <fcntl.h> +# endif + +# define OPENSSL_CONF "openssl.cnf" +# define SSLEAY_CONF OPENSSL_CONF +# define RFILE ".rnd" +# define LIST_SEPARATOR_CHAR ':' +# define NUL_DEV "/dev/null" +# define EXIT(n) exit(n) +# endif + +# define SSLeay_getpid() getpid() + +#endif + + +/*************/ + +#ifdef USE_SOCKETS +# if defined(WINDOWS) || defined(MSDOS) + /* windows world */ + +# ifdef OPENSSL_NO_SOCK +# define SSLeay_Write(a,b,c) (-1) +# define SSLeay_Read(a,b,c) (-1) +# define SHUTDOWN(fd) close(fd) +# define SHUTDOWN2(fd) close(fd) +# elif !defined(__DJGPP__) +# if defined(_WIN32_WCE) && _WIN32_WCE<410 +# define getservbyname _masked_declaration_getservbyname +# endif +# if !defined(IPPROTO_IP) + /* winsock[2].h was included already? */ +# include <winsock.h> +# endif +# ifdef getservbyname +# undef getservbyname + /* this is used to be wcecompat/include/winsock_extras.h */ + struct servent* PASCAL getservbyname(const char*,const char*); +# endif + +# ifdef _WIN64 +/* + * Even though sizeof(SOCKET) is 8, it's safe to cast it to int, because + * the value constitutes an index in per-process table of limited size + * and not a real pointer. + */ +# define socket(d,t,p) ((int)socket(d,t,p)) +# define accept(s,f,l) ((int)accept(s,f,l)) +# 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 +# define SSLeay_Write(a,b,c) write_s(a,b,c,0) +# define SSLeay_Read(a,b,c) read_s(a,b,c) +# define SHUTDOWN(fd) close_s(fd) +# define SHUTDOWN2(fd) close_s(fd) +# endif + +# elif defined(MAC_OS_pre_X) + +# include "MacSocket.h" +# define SSLeay_Write(a,b,c) MacSocket_send((a),(b),(c)) +# define SSLeay_Read(a,b,c) MacSocket_recv((a),(b),(c),true) +# define SHUTDOWN(fd) MacSocket_close(fd) +# define SHUTDOWN2(fd) MacSocket_close(fd) + +# elif defined(OPENSSL_SYS_NETWARE) + /* NetWare uses the WinSock2 interfaces by default, but can be configured for BSD + */ +# if defined(NETWARE_BSDSOCK) +# include <sys/socket.h> +# include <netinet/in.h> +# include <sys/time.h> +# if defined(NETWARE_CLIB) +# include <sys/bsdskt.h> +# else +# include <sys/select.h> +# endif +# define INVALID_SOCKET (int)(~0) +# else +# 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 +# include <sys/param.h> +# endif +# ifdef OPENSSL_SYS_VXWORKS +# include <time.h> +# elif !defined(OPENSSL_SYS_MPE) +# include <sys/time.h> /* Needed under linux for FD_XXX */ +# endif + +# include <netdb.h> +# if defined(OPENSSL_SYS_VMS_NODECC) +# include <socket.h> +# include <in.h> +# include <inet.h> +# else +# include <sys/socket.h> +# ifdef FILIO_H +# include <sys/filio.h> /* Added for FIONBIO under unixware */ +# endif +# include <netinet/in.h> +# if !defined(OPENSSL_SYS_BEOS_R5) +# include <arpa/inet.h> +# endif +# endif + +# if defined(NeXT) || defined(_NEXT_SOURCE) +# include <sys/fcntl.h> +# include <sys/types.h> +# endif + +# ifdef OPENSSL_SYS_AIX +# include <sys/select.h> +# endif + +# ifdef __QNX__ +# include <sys/select.h> +# endif + +# if defined(sun) +# include <sys/filio.h> +# else +# ifndef VMS +# include <sys/ioctl.h> +# else + /* ioctl is only in VMS > 7.0 and when socketshr is not used */ +# if !defined(TCPIP_TYPE_SOCKETSHR) && defined(__VMS_VER) && (__VMS_VER > 70000000) +# include <sys/ioctl.h> +# endif +# endif +# endif + +# ifdef VMS +# include <unixio.h> +# if defined(TCPIP_TYPE_SOCKETSHR) +# include <socketshr.h> +# endif +# endif + +# define SSLeay_Read(a,b,c) read((a),(b),(c)) +# define SSLeay_Write(a,b,c) write((a),(b),(c)) +# define SHUTDOWN(fd) { shutdown((fd),0); closesocket((fd)); } +# define SHUTDOWN2(fd) { shutdown((fd),2); closesocket((fd)); } +# ifndef INVALID_SOCKET +# define INVALID_SOCKET (-1) +# endif /* INVALID_SOCKET */ +# endif + +/* Some IPv6 implementations are broken, disable them in known bad + * versions. + */ +# if !defined(OPENSSL_USE_IPV6) +# if defined(AF_INET6) && !defined(OPENSSL_SYS_BEOS_BONE) && !defined(NETWARE_CLIB) +# define OPENSSL_USE_IPV6 1 +# else +# define OPENSSL_USE_IPV6 0 +# endif +# endif + +#endif + +#if defined(sun) && !defined(__svr4__) && !defined(__SVR4) + /* include headers first, so our defines don't break it */ +#include <stdlib.h> +#include <string.h> + /* bcopy can handle overlapping moves according to SunOS 4.1.4 manpage */ +# define memmove(s1,s2,n) bcopy((s2),(s1),(n)) +# define strtoul(s,e,b) ((unsigned long int)strtol((s),(e),(b))) +extern char *sys_errlist[]; extern int sys_nerr; +# define strerror(errnum) \ + (((errnum)<0 || (errnum)>=sys_nerr) ? NULL : sys_errlist[errnum]) + /* Being signed SunOS 4.x memcpy breaks ASN1_OBJECT table lookup */ +#include "crypto/o_str.h" +# define memcmp OPENSSL_memcmp +#endif + +#ifndef OPENSSL_EXIT +# if defined(MONOLITH) && !defined(OPENSSL_C) +# define OPENSSL_EXIT(n) return(n) +# else +# define OPENSSL_EXIT(n) do { EXIT(n); return(n); } while(0) +# endif +#endif + +/***********************************************/ + +#define DG_GCC_BUG /* gcc < 2.6.3 on DGUX */ + +#ifdef sgi +#define IRIX_CC_BUG /* all version of IRIX I've tested (4.* 5.*) */ +#endif +#ifdef OPENSSL_SYS_SNI +#define IRIX_CC_BUG /* CDS++ up to V2.0Bsomething suffered from the same bug.*/ +#endif + +#if defined(OPENSSL_SYS_WINDOWS) +# define strcasecmp _stricmp +# define strncasecmp _strnicmp +#elif defined(OPENSSL_SYS_VMS) +/* VMS below version 7.0 doesn't have strcasecmp() */ +# include "o_str.h" +# define strcasecmp OPENSSL_strcasecmp +# define strncasecmp OPENSSL_strncasecmp +# define OPENSSL_IMPLEMENTS_strncasecmp +#elif defined(OPENSSL_SYS_OS2) && defined(__EMX__) +# define strcasecmp stricmp +# define strncasecmp strnicmp +#elif defined(OPENSSL_SYS_NETWARE) +# include <string.h> +# if defined(NETWARE_CLIB) +# define strcasecmp stricmp +# define strncasecmp strnicmp +# endif /* NETWARE_CLIB */ +#endif + +#if defined(OPENSSL_SYS_OS2) && defined(__EMX__) +# include <io.h> +# include <fcntl.h> +# define NO_SYSLOG +#endif + +/* vxworks */ +#if defined(OPENSSL_SYS_VXWORKS) +#include <ioLib.h> +#include <tickLib.h> +#include <sysLib.h> + +#define TTY_STRUCT int + +#define sleep(a) taskDelay((a) * sysClkRateGet()) + +#include <vxWorks.h> +#include <sockLib.h> +#include <taskLib.h> + +#define getpid taskIdSelf + +/* NOTE: these are implemented by helpers in database app! + * if the database is not linked, we need to implement them + * elswhere */ +struct hostent *gethostbyname(const char *name); +struct hostent *gethostbyaddr(const char *addr, int length, int type); +struct servent *getservbyname(const char *name, const char *proto); + +#endif +/* end vxworks */ + +/* beos */ +#if defined(OPENSSL_SYS_BEOS_R5) +#define SO_ERROR 0 +#define NO_SYS_UN +#define IPPROTO_IP 0 +#include <OS.h> +#endif + + +#ifdef __cplusplus +} +#endif + +#endif +