diff options
-rw-r--r-- | src/openssl.c | 274 |
1 files changed, 202 insertions, 72 deletions
diff --git a/src/openssl.c b/src/openssl.c index fd7d28e..a34a8cf 100644 --- a/src/openssl.c +++ b/src/openssl.c @@ -30,25 +30,34 @@ #include <limits.h> /* INT_MAX INT_MIN LLONG_MAX LLONG_MIN UCHAR_MAX ULLONG_MAX */ #include <stdint.h> /* uintptr_t */ #include <string.h> /* memset(3) strerror_r(3) */ -#include <strings.h> /* strcasecmp(3) */ #include <math.h> /* INFINITY fabs(3) floor(3) frexp(3) fmod(3) round(3) isfinite(3) */ #include <time.h> /* struct tm time_t strptime(3) time(2) */ #include <ctype.h> /* isdigit(3), isxdigit(3), tolower(3) */ #include <errno.h> /* ENOMEM ENOTSUP EOVERFLOW errno */ #include <assert.h> /* assert */ -#include <sys/types.h> /* ssize_t pid_t */ -#include <sys/time.h> /* struct timeval gettimeofday(2) */ #include <sys/stat.h> /* struct stat stat(2) */ -#include <sys/socket.h> /* AF_INET AF_INET6 */ -#include <sys/resource.h> /* RUSAGE_SELF struct rusage getrusage(2) */ -#include <sys/utsname.h> /* struct utsname uname(3) */ +#ifdef _WIN32 +#include <winsock2.h> /* AF_INET, AF_INET6 */ +#include <inaddr.h> /* struct in_addr, struct in6_addr */ +#include <ws2tcpip.h> /* inet_pton */ +#include <wincrypt.h> /* CryptAcquireContext(), CryptGenRandom(), CryptReleaseContext() */ +#include <windows.h> /* CreateMutex(), GetLastError(), GetModuleHandleEx(), GetProcessTimes(), InterlockedCompareExchangePointer() */ +#define EXPORT __declspec (dllexport) +#else +#include <arpa/inet.h> /* inet_pton(3) */ +#include <dlfcn.h> /* dladdr(3) dlopen(3) */ #include <fcntl.h> /* O_RDONLY O_CLOEXEC open(2) */ -#include <unistd.h> /* close(2) getpid(2) */ #include <netinet/in.h> /* struct in_addr struct in6_addr */ -#include <arpa/inet.h> /* inet_pton(3) */ #include <pthread.h> /* pthread_mutex_init(3) pthread_mutex_lock(3) pthread_mutex_unlock(3) */ -#include <dlfcn.h> /* dladdr(3) dlopen(3) */ +#include <sys/resource.h> /* RUSAGE_SELF struct rusage getrusage(2) */ +#include <sys/socket.h> /* AF_INET AF_INET6 */ +#include <sys/time.h> /* struct timeval gettimeofday(2) */ +#include <sys/types.h> /* ssize_t pid_t */ +#include <sys/utsname.h> /* struct utsname uname(3) */ +#include <unistd.h> /* close(2) getpid(2) */ +#define EXPORT +#endif #if __APPLE__ #include <mach/mach_time.h> /* mach_absolute_time() */ @@ -480,7 +489,16 @@ #undef MIN #define MIN(a, b) (((a) < (b))? (a) : (b)) +#ifdef _WIN32 +#if !defined(S_ISDIR) && defined(_S_IFDIR) && defined(_S_IFDIR) +#define S_ISDIR(m) (((m) & _S_IFDIR) == _S_IFDIR) +#endif + +#define stricmp(a, b) _stricmp((a), (b)) +#else +#include <strings.h> /* strcasecmp(3) */ #define stricmp(a, b) strcasecmp((a), (b)) +#endif #define strieq(a, b) (!stricmp((a), (b))) #define xtolower(c) tolower((unsigned char)(c)) @@ -552,8 +570,9 @@ static void *prepsimple(lua_State *L, const char *tname, int (*gc)(lua_State *)) return p; } /* prepsimple() */ +#define EXPAND( x ) x #define prepsimple_(a, b, c, ...) prepsimple((a), (b), (c)) -#define prepsimple(...) prepsimple_(__VA_ARGS__, 0, 0) +#define prepsimple(...) EXPAND( prepsimple_(__VA_ARGS__, 0, 0) ) static void *checksimple(lua_State *L, int index, const char *tname) { @@ -797,7 +816,12 @@ static const char *aux_strerror_r(int error, char *dst, size_t lim) { static const char unknown[] = "Unknown error: "; size_t n; -#if STRERROR_R_CHAR_P +#if _WIN32 + errno_t rv = strerror_s(dst, lim, error); + + if (rv) + return dst; +#elif STRERROR_R_CHAR_P char *rv = strerror_r(error, dst, lim); if (rv != NULL) @@ -970,7 +994,13 @@ NOTUSED static auxtype_t auxL_getref(lua_State *L, auxref_t ref) { static int auxL_testoption(lua_State *L, int index, const char *def, const char *const *optlist, _Bool nocase) { const char *optname = (def)? luaL_optstring(L, index, def) : luaL_checkstring(L, index); - int (*optcmp)() = (nocase)? &strcasecmp : &strcmp; + int (*optcmp)() = (nocase)? +#ifdef _WIN32 + &_stricmp +#else + &strcasecmp +#endif + : &strcmp; int i; for (i = 0; optlist[i]; i++) { @@ -1033,7 +1063,7 @@ static void auxL_pushunsigned(lua_State *L, auxL_Unsigned i) { } /* auxL_pushunsigned() */ #define auxL_checkinteger_(a, b, c, d, ...) auxL_checkinteger((a), (b), (c), (d)) -#define auxL_checkinteger(...) auxL_checkinteger_(__VA_ARGS__, auxL_IntegerMin, auxL_IntegerMax, 0) +#define auxL_checkinteger(...) EXPAND( auxL_checkinteger_(__VA_ARGS__, auxL_IntegerMin, auxL_IntegerMax, 0) ) static auxL_Integer (auxL_checkinteger)(lua_State *L, int index, auxL_Integer min, auxL_Integer max) { auxL_Integer i; @@ -1052,14 +1082,14 @@ static auxL_Integer (auxL_checkinteger)(lua_State *L, int index, auxL_Integer mi } /* auxL_checkinteger() */ #define auxL_optinteger_(a, b, c, d, e, ...) auxL_optinteger((a), (b), (c), (d), (e)) -#define auxL_optinteger(...) auxL_optinteger_(__VA_ARGS__, auxL_IntegerMin, auxL_IntegerMax, 0) +#define auxL_optinteger(...) EXPAND( auxL_optinteger_(__VA_ARGS__, auxL_IntegerMin, auxL_IntegerMax, 0)) static auxL_Integer (auxL_optinteger)(lua_State *L, int index, auxL_Integer def, auxL_Integer min, auxL_Integer max) { return (lua_isnoneornil(L, index))? def : auxL_checkinteger(L, index, min, max); } /* auxL_optinteger() */ #define auxL_checkunsigned_(a, b, c, d, ...) auxL_checkunsigned((a), (b), (c), (d)) -#define auxL_checkunsigned(...) auxL_checkunsigned_(__VA_ARGS__, auxL_UnsignedMin, auxL_UnsignedMax, 0) +#define auxL_checkunsigned(...) EXPAND( auxL_checkunsigned_(__VA_ARGS__, auxL_UnsignedMin, auxL_UnsignedMax, 0)) static auxL_Unsigned (auxL_checkunsigned)(lua_State *L, int index, auxL_Unsigned min, auxL_Unsigned max) { auxL_Unsigned i; @@ -1079,7 +1109,7 @@ static auxL_Unsigned (auxL_checkunsigned)(lua_State *L, int index, auxL_Unsigned } /* auxL_checkunsigned() */ #define auxL_optunsigned_(a, b, c, d, e, ...) auxL_optunsigned((a), (b), (c), (d), (e)) -#define auxL_optunsigned(...) auxL_optunsigned_(__VA_ARGS__, auxL_UnsignedMin, auxL_UnsignedMax, 0) +#define auxL_optunsigned(...) EXPAND( auxL_optunsigned_(__VA_ARGS__, auxL_UnsignedMin, auxL_UnsignedMax, 0) ) static auxL_Unsigned (auxL_optunsigned)(lua_State *L, int index, auxL_Unsigned def, auxL_Unsigned min, auxL_Unsigned max) { return (lua_isnoneornil(L, index))? def : auxL_checkunsigned(L, index, min, max); @@ -1206,7 +1236,7 @@ static _Bool auxL_newclass(lua_State *L, const char *name, const auxL_Reg *metho } /* auxL_newclass() */ #define auxL_addclass(L, ...) \ - (auxL_newclass((L), __VA_ARGS__), lua_pop((L), 1)) + EXPAND( (auxL_newclass((L), __VA_ARGS__), lua_pop((L), 1)) ) static int auxL_swaptable(lua_State *L, int index) { index = lua_absindex(L, index); @@ -1281,10 +1311,12 @@ static const char *auxL_pusherror(lua_State *L, int error, const char *fun) { } else { return lua_pushfstring(L, "%s:%d:%s", file, line, txt); } +#if HAVE_DLADDR } else if (error == auxL_EDYLD) { const char *const fmt = (fun)? "%s: %s" : "%.0s%s"; return lua_pushfstring(L, fmt, (fun)? fun : "", dlerror()); +#endif } else { const char *const fmt = (fun)? "%s: %s" : "%.0s%s"; @@ -1325,7 +1357,15 @@ static const EVP_MD *auxL_optdigest(lua_State *L, int index, EVP_PKEY *key, cons */ /* dl_anchor must not be called from multiple threads at once */ static int dl_anchor(void) { -#if HAVE_DLADDR +#if _WIN32 + EXPORT extern int luaopen__openssl(lua_State *); + + HMODULE dummy; + if (!GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_PIN|GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS, (void *)&luaopen__openssl, &dummy)) + return GetLastError(); + + return 0; +#elif HAVE_DLADDR extern int luaopen__openssl(lua_State *); static void *anchor; Dl_info info; @@ -1376,7 +1416,7 @@ static struct { #endif #if !HAVE_DH_GET0_KEY -#define DH_get0_key(...) compat_DH_get0_key(__VA_ARGS__) +#define DH_get0_key(...) EXPAND( compat_DH_get0_key(__VA_ARGS__) ) static void compat_DH_get0_key(const DH *d, const BIGNUM **pub_key, const BIGNUM **priv_key) { if (pub_key) @@ -1387,7 +1427,7 @@ static void compat_DH_get0_key(const DH *d, const BIGNUM **pub_key, const BIGNUM #endif #if !HAVE_DH_GET0_PQG -#define DH_get0_pqg(...) compat_DH_get0_pqg(__VA_ARGS__) +#define DH_get0_pqg(...) EXPAND( compat_DH_get0_pqg(__VA_ARGS__) ) static void compat_DH_get0_pqg(const DH *d, const BIGNUM **p, const BIGNUM **q, const BIGNUM **g) { if (p) @@ -1400,7 +1440,7 @@ static void compat_DH_get0_pqg(const DH *d, const BIGNUM **p, const BIGNUM **q, #endif #if !HAVE_DH_SET0_KEY -#define DH_set0_key(...) compat_DH_set0_key(__VA_ARGS__) +#define DH_set0_key(...) EXPAND( compat_DH_set0_key(__VA_ARGS__) ) static void compat_DH_set0_key(DH *d, BIGNUM *pub_key, BIGNUM *priv_key) { if (pub_key) @@ -1411,7 +1451,7 @@ static void compat_DH_set0_key(DH *d, BIGNUM *pub_key, BIGNUM *priv_key) { #endif #if !HAVE_DH_SET0_PQG -#define DH_set0_pqg(...) compat_DH_set0_pqg(__VA_ARGS__) +#define DH_set0_pqg(...) EXPAND( compat_DH_set0_pqg(__VA_ARGS__) ) static void compat_DH_set0_pqg(DH *d, BIGNUM *p, BIGNUM *q, BIGNUM *g) { if (p) @@ -1424,7 +1464,7 @@ static void compat_DH_set0_pqg(DH *d, BIGNUM *p, BIGNUM *q, BIGNUM *g) { #endif #if !HAVE_DSA_GET0_KEY -#define DSA_get0_key(...) compat_DSA_get0_key(__VA_ARGS__) +#define DSA_get0_key(...) EXPAND( compat_DSA_get0_key(__VA_ARGS__) ) static void compat_DSA_get0_key(const DSA *d, const BIGNUM **pub_key, const BIGNUM **priv_key) { if (pub_key) @@ -1435,7 +1475,7 @@ static void compat_DSA_get0_key(const DSA *d, const BIGNUM **pub_key, const BIGN #endif #if !HAVE_DSA_GET0_PQG -#define DSA_get0_pqg(...) compat_DSA_get0_pqg(__VA_ARGS__) +#define DSA_get0_pqg(...) EXPAND( compat_DSA_get0_pqg(__VA_ARGS__) ) static void compat_DSA_get0_pqg(const DSA *d, const BIGNUM **p, const BIGNUM **q, const BIGNUM **g) { if (p) @@ -1448,7 +1488,7 @@ static void compat_DSA_get0_pqg(const DSA *d, const BIGNUM **p, const BIGNUM **q #endif #if !HAVE_DSA_SET0_KEY -#define DSA_set0_key(...) compat_DSA_set0_key(__VA_ARGS__) +#define DSA_set0_key(...) EXPAND( compat_DSA_set0_key(__VA_ARGS__) ) static void compat_DSA_set0_key(DSA *d, BIGNUM *pub_key, BIGNUM *priv_key) { if (pub_key) @@ -1459,7 +1499,7 @@ static void compat_DSA_set0_key(DSA *d, BIGNUM *pub_key, BIGNUM *priv_key) { #endif #if !HAVE_DSA_SET0_PQG -#define DSA_set0_pqg(...) compat_DSA_set0_pqg(__VA_ARGS__) +#define DSA_set0_pqg(...) EXPAND( compat_DSA_set0_pqg(__VA_ARGS__) ) static void compat_DSA_set0_pqg(DSA *d, BIGNUM *p, BIGNUM *q, BIGNUM *g) { if (p) @@ -1517,7 +1557,7 @@ static int compat_EVP_PKEY_base_id(EVP_PKEY *key) { #if !HAVE_EVP_PKEY_GET_DEFAULT_DIGEST_NID #define EVP_PKEY_get_default_digest_nid(...) \ - compat_EVP_PKEY_get_default_digest_nid(__VA_ARGS__) + EXPAND( compat_EVP_PKEY_get_default_digest_nid(__VA_ARGS__) ) static int compat_EVP_PKEY_get_default_digest_nid(EVP_PKEY *key, int *nid) { switch (EVP_PKEY_base_id(key)) { @@ -1598,7 +1638,7 @@ static HMAC_CTX *compat_HMAC_CTX_new(void) { #endif #if !HAVE_RSA_GET0_CRT_PARAMS -#define RSA_get0_crt_params(...) compat_RSA_get0_crt_params(__VA_ARGS__) +#define RSA_get0_crt_params(...) EXPAND( compat_RSA_get0_crt_params(__VA_ARGS__) ) static void compat_RSA_get0_crt_params(const RSA *r, const BIGNUM **dmp1, const BIGNUM **dmq1, const BIGNUM **iqmp) { if (dmp1) @@ -1611,7 +1651,7 @@ static void compat_RSA_get0_crt_params(const RSA *r, const BIGNUM **dmp1, const #endif #if !HAVE_RSA_GET0_FACTORS -#define RSA_get0_factors(...) compat_RSA_get0_factors(__VA_ARGS__) +#define RSA_get0_factors(...) EXPAND( compat_RSA_get0_factors(__VA_ARGS__) ) static void compat_RSA_get0_factors(const RSA *r, const BIGNUM **p, const BIGNUM **q) { if (p) @@ -1622,7 +1662,7 @@ static void compat_RSA_get0_factors(const RSA *r, const BIGNUM **p, const BIGNUM #endif #if !HAVE_RSA_GET0_KEY -#define RSA_get0_key(...) compat_RSA_get0_key(__VA_ARGS__) +#define RSA_get0_key(...) EXPAND( compat_RSA_get0_key(__VA_ARGS__) ) static void compat_RSA_get0_key(const RSA *r, const BIGNUM **n, const BIGNUM **e, const BIGNUM **d) { if (n) @@ -1635,7 +1675,7 @@ static void compat_RSA_get0_key(const RSA *r, const BIGNUM **n, const BIGNUM **e #endif #if !HAVE_RSA_SET0_CRT_PARAMS -#define RSA_set0_crt_params(...) compat_RSA_set0_crt_params(__VA_ARGS__) +#define RSA_set0_crt_params(...) EXPAND( compat_RSA_set0_crt_params(__VA_ARGS__) ) static void compat_RSA_set0_crt_params(RSA *r, BIGNUM *dmp1, BIGNUM *dmq1, BIGNUM *iqmp) { if (dmp1) @@ -1648,7 +1688,7 @@ static void compat_RSA_set0_crt_params(RSA *r, BIGNUM *dmp1, BIGNUM *dmq1, BIGNU #endif #if !HAVE_RSA_SET0_FACTORS -#define RSA_set0_factors(...) compat_RSA_set0_factors(__VA_ARGS__) +#define RSA_set0_factors(...) EXPAND( compat_RSA_set0_factors(__VA_ARGS__) ) static void compat_RSA_set0_factors(RSA *r, BIGNUM *p, BIGNUM *q) { if (p) @@ -1659,7 +1699,7 @@ static void compat_RSA_set0_factors(RSA *r, BIGNUM *p, BIGNUM *q) { #endif #if !HAVE_RSA_SET0_KEY -#define RSA_set0_key(...) compat_RSA_set0_key(__VA_ARGS__) +#define RSA_set0_key(...) EXPAND( compat_RSA_set0_key(__VA_ARGS__) ) static void compat_RSA_set0_key(RSA *r, BIGNUM *n, BIGNUM *e, BIGNUM *d) { if (n) @@ -1672,7 +1712,7 @@ static void compat_RSA_set0_key(RSA *r, BIGNUM *n, BIGNUM *e, BIGNUM *d) { #endif #if !HAVE_SSL_GET_CLIENT_RANDOM -#define SSL_get_client_random(...) compat_SSL_get_client_random(__VA_ARGS__) +#define SSL_get_client_random(...) EXPAND( compat_SSL_get_client_random(__VA_ARGS__) ) static size_t compat_SSL_get_client_random(const SSL *ssl, unsigned char *out, size_t outlen) { if (outlen == 0) return sizeof(ssl->s3->client_random); @@ -1684,7 +1724,7 @@ static size_t compat_SSL_get_client_random(const SSL *ssl, unsigned char *out, s #endif #if !HAVE_SSL_CLIENT_VERSION -#define SSL_client_version(...) compat_SSL_client_version(__VA_ARGS__) +#define SSL_client_version(...) EXPAND( compat_SSL_client_version(__VA_ARGS__) ) static int compat_SSL_client_version(const SSL *ssl) { return ssl->client_version; @@ -1708,7 +1748,7 @@ static int compat_SSL_set1_param(SSL *ssl, X509_VERIFY_PARAM *vpm) { #endif #if !HAVE_SSL_UP_REF -#define SSL_up_ref(...) compat_SSL_up_ref(__VA_ARGS__) +#define SSL_up_ref(...) EXPAND( compat_SSL_up_ref(__VA_ARGS__) ) static int compat_SSL_up_ref(SSL *ssl) { /* our caller should already have had a proper reference */ @@ -1874,7 +1914,7 @@ static void compat_init_X509_STORE_onfree(void *store, void *data NOTUSED, CRYPT } /* compat_init_X509_STORE_onfree() */ #if !HAVE_X509_STORE_UP_REF -#define X509_STORE_up_ref(...) compat_X509_STORE_up_ref(__VA_ARGS__) +#define X509_STORE_up_ref(...) EXPAND( compat_X509_STORE_up_ref(__VA_ARGS__) ) static int compat_X509_STORE_up_ref(X509_STORE *crt) { /* our caller should already have had a proper reference */ @@ -1886,7 +1926,7 @@ static int compat_X509_STORE_up_ref(X509_STORE *crt) { #endif #if !HAVE_X509_UP_REF -#define X509_up_ref(...) compat_X509_up_ref(__VA_ARGS__) +#define X509_up_ref(...) EXPAND( compat_X509_up_ref(__VA_ARGS__) ) static int compat_X509_up_ref(X509 *crt) { /* our caller should already have had a proper reference */ @@ -2289,7 +2329,7 @@ static void initall(lua_State *L); * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ -int luaopen__openssl_compat(lua_State *L) { +EXPORT int luaopen__openssl_compat(lua_State *L) { initall(L); lua_newtable(L); @@ -2486,7 +2526,7 @@ static const auxL_IntegerReg ssleay_version[] = { { NULL, 0 }, }; -int luaopen__openssl(lua_State *L) { +EXPORT int luaopen__openssl(lua_State *L) { size_t i; auxL_newlib(L, ossl_globals, 0); @@ -2552,7 +2592,7 @@ static BIGNUM *bn_dup_nil(lua_State *L, const BIGNUM *src) { #define checkbig_(a, b, c, ...) checkbig((a), (b), (c)) -#define checkbig(...) checkbig_(__VA_ARGS__, &(_Bool){ 0 }, 0) +#define checkbig(...) EXPAND( checkbig_(__VA_ARGS__, &(_Bool){ 0 }, 0) ) static BIGNUM *(checkbig)(lua_State *, int, _Bool *); @@ -3153,7 +3193,7 @@ static const auxL_Reg bn_globals[] = { { NULL, NULL }, }; -int luaopen__openssl_bignum(lua_State *L) { +EXPORT int luaopen__openssl_bignum(lua_State *L) { initall(L); auxL_newlib(L, bn_globals, 0); @@ -4504,7 +4544,7 @@ static const auxL_IntegerReg pk_rsa_pad_opts[] = { { NULL, 0 }, }; -int luaopen__openssl_pkey(lua_State *L) { +EXPORT int luaopen__openssl_pkey(lua_State *L) { initall(L); auxL_newlib(L, pk_globals, 0); @@ -4517,7 +4557,7 @@ int luaopen__openssl_pkey(lua_State *L) { /* * Deprecated module name. */ -int luaopen__openssl_pubkey(lua_State *L) { +EXPORT int luaopen__openssl_pubkey(lua_State *L) { return luaopen__openssl_pkey(L); } /* luaopen__openssl_pubkey() */ @@ -4693,7 +4733,7 @@ static const auxL_Reg ecg_globals[] = { #endif /* OPENSSL_NO_EC */ -int luaopen__openssl_ec_group(lua_State *L) { +EXPORT int luaopen__openssl_ec_group(lua_State *L) { #ifndef OPENSSL_NO_EC initall(L); @@ -4900,7 +4940,7 @@ static const auxL_Reg xn_globals[] = { { NULL, NULL }, }; -int luaopen__openssl_x509_name(lua_State *L) { +EXPORT int luaopen__openssl_x509_name(lua_State *L) { initall(L); auxL_newlib(L, xn_globals, 0); @@ -5154,7 +5194,7 @@ static const auxL_Reg gn_globals[] = { { NULL, NULL }, }; -int luaopen__openssl_x509_altname(lua_State *L) { +EXPORT int luaopen__openssl_x509_altname(lua_State *L) { initall(L); auxL_newlib(L, gn_globals, 0); @@ -5456,7 +5496,7 @@ static const auxL_IntegerReg xe_textopts[] = { { NULL, 0 }, }; -int luaopen__openssl_x509_extension(lua_State *L) { +EXPORT int luaopen__openssl_x509_extension(lua_State *L) { initall(L); auxL_newlib(L, xe_globals, 0); @@ -6508,7 +6548,7 @@ static const auxL_Reg xc_globals[] = { { NULL, NULL }, }; -int luaopen__openssl_x509_cert(lua_State *L) { +EXPORT int luaopen__openssl_x509_cert(lua_State *L) { initall(L); auxL_newlib(L, xc_globals, 0); @@ -6815,7 +6855,7 @@ static const auxL_Reg xr_globals[] = { { NULL, NULL }, }; -int luaopen__openssl_x509_csr(lua_State *L) { +EXPORT int luaopen__openssl_x509_csr(lua_State *L) { initall(L); auxL_newlib(L, xr_globals, 0); @@ -7234,7 +7274,7 @@ static const auxL_Reg xx_globals[] = { { NULL, NULL }, }; -int luaopen__openssl_x509_crl(lua_State *L) { +EXPORT int luaopen__openssl_x509_crl(lua_State *L) { initall(L); auxL_newlib(L, xx_globals, 0); @@ -7392,7 +7432,7 @@ static const auxL_Reg xl_globals[] = { { NULL, NULL }, }; -int luaopen__openssl_x509_chain(lua_State *L) { +EXPORT int luaopen__openssl_x509_chain(lua_State *L) { initall(L); auxL_newlib(L, xl_globals, 0); @@ -7586,7 +7626,7 @@ static const auxL_Reg xs_globals[] = { { NULL, NULL }, }; -int luaopen__openssl_x509_store(lua_State *L) { +EXPORT int luaopen__openssl_x509_store(lua_State *L) { initall(L); auxL_newlib(L, xs_globals, 0); @@ -7665,7 +7705,7 @@ static const auxL_Reg stx_globals[] = { { NULL, NULL }, }; -int luaopen__openssl_x509_store_context(lua_State *L) { +EXPORT int luaopen__openssl_x509_store_context(lua_State *L) { initall(L); auxL_newlib(L, stx_globals, 0); @@ -7838,7 +7878,7 @@ static const auxL_Reg p12_globals[] = { { NULL, NULL }, }; -int luaopen__openssl_pkcs12(lua_State *L) { +EXPORT int luaopen__openssl_pkcs12(lua_State *L) { initall(L); auxL_newlib(L, p12_globals, 0); @@ -8551,7 +8591,7 @@ static const auxL_IntegerReg sx_option[] = { { NULL, 0 }, }; -int luaopen__openssl_ssl_context(lua_State *L) { +EXPORT int luaopen__openssl_ssl_context(lua_State *L) { initall(L); auxL_newlib(L, sx_globals, 0); @@ -9098,7 +9138,7 @@ static const auxL_IntegerReg ssl_version[] = { }; -int luaopen__openssl_ssl(lua_State *L) { +EXPORT int luaopen__openssl_ssl(lua_State *L) { initall(L); auxL_newlib(L, ssl_globals, 0); @@ -9366,7 +9406,7 @@ static const auxL_IntegerReg xp_inherit_flags[] = { { NULL, 0 } }; -int luaopen__openssl_x509_verify_param(lua_State *L) { +EXPORT int luaopen__openssl_x509_verify_param(lua_State *L) { initall(L); auxL_newlib(L, xp_globals, 0); @@ -9478,7 +9518,7 @@ static const auxL_Reg md_globals[] = { { NULL, NULL }, }; -int luaopen__openssl_digest(lua_State *L) { +EXPORT int luaopen__openssl_digest(lua_State *L) { initall(L); auxL_newlib(L, md_globals, 0); @@ -9590,7 +9630,7 @@ static const auxL_Reg hmac_globals[] = { { NULL, NULL }, }; -int luaopen__openssl_hmac(lua_State *L) { +EXPORT int luaopen__openssl_hmac(lua_State *L) { initall(L); auxL_newlib(L, hmac_globals, 0); @@ -9797,7 +9837,7 @@ static const auxL_Reg cipher_globals[] = { { NULL, NULL }, }; -int luaopen__openssl_cipher(lua_State *L) { +EXPORT int luaopen__openssl_cipher(lua_State *L) { initall(L); auxL_newlib(L, cipher_globals, 0); @@ -9884,7 +9924,7 @@ static const auxL_Reg or_globals[] = { { NULL, NULL }, }; -int luaopen__openssl_ocsp_response(lua_State *L) { +EXPORT int luaopen__openssl_ocsp_response(lua_State *L) { initall(L); auxL_newlib(L, or_globals, 0); @@ -9956,7 +9996,7 @@ static const auxL_IntegerReg ob_verify_flags[] = { { NULL, 0 }, }; -int luaopen__openssl_ocsp_basic(lua_State *L) { +EXPORT int luaopen__openssl_ocsp_basic(lua_State *L) { initall(L); auxL_newlib(L, ob_globals, 0); @@ -9972,7 +10012,11 @@ int luaopen__openssl_ocsp_basic(lua_State *L) { * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ struct randL_state { +#ifdef _WIN32 + DWORD pid; +#else pid_t pid; +#endif }; /* struct randL_state */ static struct randL_state *randL_getstate(lua_State *L) { @@ -9992,6 +10036,31 @@ static int randL_stir(struct randL_state *st, unsigned rqstd) { int error; unsigned char data[256]; +#ifdef _WIN32 + HCRYPTPROV hCryptProv; + BOOL ok; + + if (!CryptAcquireContext(&hCryptProv, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT)) { + error = GetLastError(); + goto error; + } + while (count < rqstd) { + ok = CryptGenRandom(hCryptProv, sizeof data, (BYTE*)data); + if (!ok) { + CryptReleaseContext(hCryptProv, 0); + error = GetLastError(); + goto error; + } + + RAND_seed(data, sizeof data); + + count += sizeof data; + } + + CryptReleaseContext(hCryptProv, 0); + + st->pid = GetCurrentProcessId(); +#else #if HAVE_ARC4RANDOM_BUF while (count < rqstd) { size_t n = MIN(rqstd - count, sizeof data); @@ -10043,8 +10112,10 @@ static int randL_stir(struct randL_state *st, unsigned rqstd) { int fd = open("/dev/urandom", O_RDONLY); #endif - if (fd == -1) - goto syserr; + if (fd == -1) { + error = errno; + goto error; + } while (count < rqstd) { ssize_t n = read(fd, data, MIN(rqstd - count, sizeof data)); @@ -10074,16 +10145,21 @@ static int randL_stir(struct randL_state *st, unsigned rqstd) { } st->pid = getpid(); +#endif /* _WIN32 */ return 0; -syserr: - error = errno; error:; struct { - struct timeval tv; +#ifdef _WIN32 + DWORD pid; + SYSTEMTIME tv; + FILETIME ftCreation, ftExit, ftKernel, ftUser; +#else pid_t pid; + struct timeval tv; struct rusage ru; struct utsname un; +#endif uintptr_t aslr; #if defined __APPLE__ uint64_t mt; @@ -10092,10 +10168,16 @@ error:; #endif } junk; - gettimeofday(&junk.tv, NULL); +#ifdef _WIN32 + junk.pid = GetCurrentProcessId(); + GetSystemTime(&junk.tv); + GetProcessTimes(GetCurrentProcess(), &junk.ftCreation, &junk.ftExit, &junk.ftKernel, &junk.ftUser); +#else junk.pid = getpid(); + gettimeofday(&junk.tv, NULL); getrusage(RUSAGE_SELF, &junk.ru); uname(&junk.un); +#endif junk.aslr = (uintptr_t)&strcpy ^ (uintptr_t)&randL_stir; #if defined __APPLE__ junk.mt = mach_absolute_time(); @@ -10117,14 +10199,22 @@ error:; RAND_add(&junk, sizeof junk, 0.1); +#ifdef _WIN32 + st->pid = GetCurrentProcessId(); +#else st->pid = getpid(); +#endif return error; } /* randL_stir() */ static void randL_checkpid(struct randL_state *st) { +#ifdef _WIN32 + if (st->pid != GetCurrentProcessId()) +#else if (st->pid != getpid()) +#endif (void)randL_stir(st, 16); } /* randL_checkpid() */ @@ -10307,7 +10397,7 @@ static const auxL_Reg rand_globals[] = { { NULL, NULL }, }; -int luaopen__openssl_rand(lua_State *L) { +EXPORT int luaopen__openssl_rand(lua_State *L) { struct randL_state *st; initall(L); @@ -10355,7 +10445,7 @@ static const auxL_Reg des_globals[] = { { NULL, NULL }, }; -int luaopen__openssl_des(lua_State *L) { +EXPORT int luaopen__openssl_des(lua_State *L) { initall(L); auxL_newlib(L, des_globals, 0); @@ -10373,15 +10463,27 @@ int luaopen__openssl_des(lua_State *L) { * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ static struct { +#if _WIN32 + HANDLE *lock; +#else pthread_mutex_t *lock; +#endif int nlock; } mt_state; static void mt_lock(int mode, int type, const char *file NOTUSED, int line NOTUSED) { if (mode & CRYPTO_LOCK) +#if _WIN32 + WaitForSingleObject(mt_state.lock[type], INFINITE); +#else pthread_mutex_lock(&mt_state.lock[type]); +#endif else +#if _WIN32 + ReleaseMutex(mt_state.lock[type]); +#else pthread_mutex_unlock(&mt_state.lock[type]); +#endif } /* mt_lock() */ /* @@ -10407,6 +10509,8 @@ static unsigned long mt_gettid(void) { return id; #elif __NetBSD__ return _lwp_self(); +#elif _WIN32 + return GetCurrentThreadId(); #else /* * pthread_t is an integer on Solaris and Linux, an unsigned integer @@ -10436,9 +10540,18 @@ static int mt_init(void) { } for (i = 0; i < mt_state.nlock; i++) { +#if _WIN32 + if (!(mt_state.lock[i] = CreateMutex(NULL, FALSE, NULL))) { + error = GetLastError(); +#else if ((error = pthread_mutex_init(&mt_state.lock[i], NULL))) { +#endif while (i > 0) { +#if _WIN32 + CloseHandle(mt_state.lock[--i]); +#else pthread_mutex_destroy(&mt_state.lock[--i]); +#endif } free(mt_state.lock); @@ -10470,11 +10583,24 @@ epilog: static void initall(lua_State *L) { - static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; static int initssl; int error = 0; +#if _WIN32 + static volatile HANDLE mutex = NULL; + if (mutex == NULL) { + HANDLE p; + if (!(p = CreateMutex(NULL, FALSE, NULL))) + auxL_error(L, GetLastError(), "openssl.init"); + if (InterlockedCompareExchangePointer((PVOID*)&mutex, (PVOID)p, NULL) != NULL) + CloseHandle(p); + } + if (WaitForSingleObject(mutex, INFINITE) == WAIT_FAILED) + auxL_error(L, GetLastError(), "openssl.init"); +#else + static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; pthread_mutex_lock(&mutex); +#endif #if !OPENSSL_PREREQ(1,1,0) if (!error) @@ -10501,7 +10627,11 @@ static void initall(lua_State *L) { if (!error) error = ex_init(); +#if _WIN32 + ReleaseMutex(mutex); +#else pthread_mutex_unlock(&mutex); +#endif if (error) auxL_error(L, error, "openssl.init"); |