+++ /dev/null
-#
-# Copyright (C) 2010 OpenWrt.org
-#
-# This is free software, licensed under the GNU General Public License v2.
-# See /LICENSE for more information.
-#
-
-include $(TOPDIR)/rules.mk
-
-PKG_NAME:=crtmpserver
-PKG_SOURCE_DATE:=2015-10-04
-PKG_SOURCE_VERSION:=b866fffca37c3b967a8878499cd2b91aa2587f34
-PKG_RELEASE:=2
-
-PKG_SOURCE:=$(PKG_NAME)-$(PKG_SOURCE_DATE).tar.gz
-PKG_SOURCE_URL:=https://codeload.github.com/shiretu/crtmpserver/tar.gz/$(PKG_SOURCE_VERSION)?
-PKG_HASH:=3744bef060129fda6f7902eb64f566b0d5049864dc542b2882c550b083ef82aa
-PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_SOURCE_VERSION)
-
-PKG_MAINTAINER:=Thomas Heil <heil@terminal-consulting.de>
-PKG_LICENSE:=GPL-3.0
-PKG_LICENSE_FILES:=LICENSE
-
-PKG_BUILD_PARALLEL:=1
-
-include $(INCLUDE_DIR)/package.mk
-
-define Package/crtmpserver
- SECTION:=multimedia
- CATEGORY:=Multimedia
- DEPENDS:=+libstdcpp +libopenssl +liblua
- TITLE:=C++ RTMP Server
-endef
-
-define Package/crtmpserver/description
-C++ RTMP Server it is a high performance streaming server able to
-stream (live or recorded) in the following technologies:
- * To and from Flash (RTMP,RTMPE, RTMPS, RTMPT, RTMPTE)
- * To and from embedded devices: iPhone, Android
- * From surveillance cameras
- * IP-TV using MPEG-TS and RTSP/RTCP/RTP protocols
-
-Also, crtmpserver can be used as a high performance rendes-vous
-server. For example, it enables you to do:
- * Audio/Video conferencing
- * Online gaming
- * Online collaboration
- * Simple/complex chat applications
-endef
-
-define Package/crtmpserver/conffiles
-/etc/crtmpserver.lua
-endef
-
-# XXX: this hack handles the usr/bin vs bin difference of backfire and trunk
-TS_BASE:=$(wildcard $(TOOLCHAIN_DIR)/bin/$(TARGET_CC))
-TS_BASE:=$(dir $(if $(TS_BASE),$(TS_BASE),$(wildcard $(TOOLCHAIN_DIR)/usr/bin/$(TARGET_CC))))
-
-define Build/Configure
- (cd $(PKG_BUILD_DIR)/builders/make; \
- cp linux.mk linux-openwrt-uclibc.mk; \
- $(SED) 's,^TOOLCHAIN_BASE[[:space:]]*=.*,TOOLCHAIN_BASE=$(TS_BASE),' \
- -e 's,^TOOLCHAIN_PREFIX[[:space:]]*=.*,TOOLCHAIN_PREFIX=$(TARGET_CROSS),' \
- -e 's,^CCOMPILER[[:space:]]*=.*,CCOMPILER=$(TARGET_CC),' \
- -e 's,^CXXCOMPILER[[:space:]]*=.*,CXXCOMPILER=$(TARGET_CXX) -std=gnu++03,' \
- -e 's,^OPTIMIZATIONS[[:space:]]*=.*,OPTIMIZATIONS=-O2,' \
- -e 's,^SSL_BASE[[:space:]]*=.*,SSL_BASE=$(STAGING_DIR)/usr,' \
- linux-openwrt-uclibc.mk)
- (cd $(PKG_BUILD_DIR)/sources/common/include/; \
- echo '#define CRTMPSERVER_VERSION_RELEASE_NUMBER "$(PKG_VERSION)\n"' > version.h; \
- echo '#define CRTMPSERVER_VERSION_CODE_NAME "Git\n"' >> version.h)
-endef
-
-define Build/Compile
- +$(MAKE) $(PKG_JOBS) -C $(PKG_BUILD_DIR)/builders/make \
- PLATFORM=linux-openwrt-uclibc -Wno-error -j6
-endef
-
-define Package/crtmpserver/install
- $(INSTALL_DIR) $(1)/usr/bin
- $(INSTALL_BIN) $(PKG_BUILD_DIR)/builders/make/output/dynamic/crtmpserver $(1)/usr/bin/
- $(INSTALL_DIR) $(1)/usr/lib/crtmpserver
- $(CP) $(PKG_BUILD_DIR)/builders/make/output/dynamic/*.so $(1)/usr/lib/crtmpserver/
- $(foreach app,flvplayback samplefactory admin stresstest appselector vptests applestreamingclient proxypublish, \
- $(INSTALL_DIR) $(1)/usr/lib/crtmpserver/$(app); \
- $(INSTALL_BIN) $(PKG_BUILD_DIR)/builders/make/output/dynamic/applications/$(app)/lib$(app).so \
- $(1)/usr/lib/crtmpserver/$(app)/; \
- )
- $(INSTALL_DIR) $(1)/etc
- $(INSTALL_CONF) $(PKG_BUILD_DIR)/builders/make/output/dynamic/crtmpserver.lua $(1)/etc/
- $(INSTALL_DIR) $(1)/usr/share/crtmpserver/appselector
- $(INSTALL_DIR) $(1)/usr/share/crtmpserver/media
- $(INSTALL_DIR) $(1)/etc/init.d
- $(INSTALL_BIN) ./files/crtmpserver.init $(1)/etc/init.d/crtmpserver
-endef
-
-$(eval $(call BuildPackage,crtmpserver))
-
+++ /dev/null
---- a/sources/applications/applestreamingclient/include/protocols/aes/inboundaesprotocol.h
-+++ b/sources/applications/applestreamingclient/include/protocols/aes/inboundaesprotocol.h
-@@ -30,7 +30,7 @@ namespace app_applestreamingclient {
- private:
- IOBuffer _tempBuffer;
- IOBuffer _inputBuffer;
-- EVP_CIPHER_CTX _decContex;
-+ EVP_CIPHER_CTX *_decContex;
- bool _lastChunk;
- uint8_t *_pIV;
- uint8_t *_pKey;
---- a/sources/applications/applestreamingclient/src/protocols/aes/inboundaesprotocol.cpp
-+++ b/sources/applications/applestreamingclient/src/protocols/aes/inboundaesprotocol.cpp
-@@ -31,13 +31,12 @@ InboundAESProtocol::InboundAESProtocol()
- memset(_pIV, 0, 16);
- _pKey = new uint8_t[16];
- memset(_pKey, 0, 16);
-- memset(&_decContex, 0, sizeof (EVP_CIPHER_CTX));
-+ _decContex = EVP_CIPHER_CTX_new();
- _totalDecrypted = 0;
- }
-
- InboundAESProtocol::~InboundAESProtocol() {
-- EVP_CIPHER_CTX_cleanup(&_decContex);
-- memset(&_decContex, 0, sizeof (EVP_CIPHER_CTX));
-+ EVP_CIPHER_CTX_free(_decContex);
- delete[] _pIV;
- delete[] _pKey;
- }
-@@ -60,11 +59,9 @@ bool InboundAESProtocol::Initialize(Variant ¶meters) {
- _inputBuffer.IgnoreAll();
- _tempBuffer.IgnoreAll();
-
-- EVP_CIPHER_CTX_cleanup(&_decContex);
-- memset(&_decContex, 0, sizeof (EVP_CIPHER_CTX));
-- EVP_CIPHER_CTX_init(&_decContex);
-- EVP_DecryptInit_ex(&_decContex, EVP_aes_128_cbc(), NULL, _pKey, _pIV);
-- EVP_CIPHER_CTX_set_padding(&_decContex, 0);
-+ EVP_CIPHER_CTX_reset(_decContex);
-+ EVP_DecryptInit_ex(_decContex, EVP_aes_128_cbc(), NULL, _pKey, _pIV);
-+ EVP_CIPHER_CTX_set_padding(_decContex, 0);
-
- return true;
- }
-@@ -105,14 +102,14 @@ bool InboundAESProtocol::SignalInputData(IOBuffer &buffer) {
- int decryptedFinalSize = 0;
- uint32_t padding = 0;
-
-- EVP_DecryptUpdate(&_decContex, pTempData, &decryptedSize, GETIBPOINTER(buffer), safeSize);
-+ EVP_DecryptUpdate(_decContex, pTempData, &decryptedSize, GETIBPOINTER(buffer), safeSize);
- _totalDecrypted += decryptedSize;
-
- //6. Decrypt leftovers
- bool transferCompleted = false;
- if (((HTTPBufferProtocol *) GetFarProtocol())->TransferCompleted()) {
- transferCompleted = true;
-- EVP_DecryptFinal_ex(&_decContex,
-+ EVP_DecryptFinal_ex(_decContex,
- pTempData + decryptedSize,
- &decryptedFinalSize);
- _totalDecrypted += decryptedFinalSize;
---- a/sources/common/include/utils/misc/crypto.h
-+++ b/sources/common/include/utils/misc/crypto.h
-@@ -33,6 +33,7 @@
- #include <openssl/aes.h>
- #include <openssl/engine.h>
- #include <openssl/conf.h>
-+#include "utils/misc/libcrypto-compat.h"
-
- /*!
- @class DHWrapper
-@@ -83,7 +84,7 @@ public:
- bool CopySharedKey(uint8_t *pDst, int32_t dstLength);
- private:
- void Cleanup();
-- bool CopyKey(BIGNUM *pNum, uint8_t *pDst, int32_t dstLength);
-+ bool CopyKey(const BIGNUM *pNum, uint8_t *pDst, int32_t dstLength);
- };
-
- DLLEXP void InitRC4Encryption(uint8_t *secretKey, uint8_t *pubKeyIn, uint8_t *pubKeyOut,
---- /dev/null
-+++ b/sources/common/include/utils/misc/libcrypto-compat.h
-@@ -0,0 +1,26 @@
-+#ifndef LIBCRYPTO_COMPAT_H
-+#define LIBCRYPTO_COMPAT_H
-+
-+#include <openssl/opensslv.h>
-+#if OPENSSL_VERSION_NUMBER < 0x10100000L
-+
-+#include <openssl/bn.h>
-+#include <openssl/dh.h>
-+#include <openssl/evp.h>
-+#include <openssl/hmac.h>
-+
-+int DH_set0_pqg(DH *dh, BIGNUM *p, BIGNUM *q, BIGNUM *g);
-+void DH_get0_key(const DH *dh, const BIGNUM **pub_key, const BIGNUM **priv_key);
-+int DH_set_length(DH *dh, long length);
-+
-+EVP_MD_CTX *EVP_MD_CTX_new(void);
-+void EVP_MD_CTX_free(EVP_MD_CTX *ctx);
-+#define EVP_MD_CTX_reset EVP_MD_CTX_cleanup
-+
-+HMAC_CTX *HMAC_CTX_new(void);
-+void HMAC_CTX_free(HMAC_CTX *ctx);
-+#define HMAC_CTX_reset HMAC_CTX_cleanup
-+
-+#endif /* OPENSSL_VERSION_NUMBER */
-+
-+#endif /* LIBCRYPTO_COMPAT_H */
---- a/sources/common/src/utils/misc/crypto.cpp
-+++ b/sources/common/src/utils/misc/crypto.cpp
-@@ -35,6 +35,7 @@ DHWrapper::~DHWrapper() {
- }
-
- bool DHWrapper::Initialize() {
-+ BIGNUM *p = NULL, *g = NULL;
- Cleanup();
-
- //1. Create the DH
-@@ -46,42 +47,53 @@ bool DHWrapper::Initialize() {
- }
-
- //2. Create his internal p and g
-- _pDH->p = BN_new();
-- if (_pDH->p == NULL) {
-+ p = BN_new();
-+ if (p == NULL) {
- FATAL("Unable to create p");
-- Cleanup();
-- return false;
-+ goto return_error;
- }
-- _pDH->g = BN_new();
-- if (_pDH->g == NULL) {
-+ g = BN_new();
-+ if (g == NULL) {
- FATAL("Unable to create g");
-- Cleanup();
-- return false;
-+ goto return_error;
- }
-
- //3. initialize p, g and key length
-- if (BN_hex2bn(&_pDH->p, P1024) == 0) {
-+ if (BN_hex2bn(&p, P1024) == 0) {
- FATAL("Unable to parse P1024");
-- Cleanup();
-- return false;
-+ goto return_error;
- }
-- if (BN_set_word(_pDH->g, 2) != 1) {
-+ if (BN_set_word(g, 2) != 1) {
- FATAL("Unable to set g");
-- Cleanup();
-- return false;
-+ goto return_error;
-+ }
-+
-+ //4. Set internal p and g
-+ if (DH_set0_pqg(_pDH, p, NULL, g) != 1) {
-+ FATAL("Unable to set internal p and g");
-+ goto return_error;
- }
-+ p = g = NULL;
-
-- //4. Set the key length
-- _pDH->length = _bitsCount;
-+ //5. Set the key length
-+ if (DH_set_length(_pDH, _bitsCount) != 1) {
-+ FATAL("Unable to set length");
-+ goto return_error;
-+ }
-
-- //5. Generate private and public key
-+ //6. Generate private and public key
- if (DH_generate_key(_pDH) != 1) {
- FATAL("Unable to generate DH public/private keys");
-- Cleanup();
-- return false;
-+ goto return_error;
- }
-
- return true;
-+
-+return_error:
-+ if (p != NULL) BN_free(p);
-+ if (g != NULL) BN_free(g);
-+ Cleanup();
-+ return false;
- }
-
- bool DHWrapper::CopyPublicKey(uint8_t *pDst, int32_t dstLength) {
-@@ -90,7 +102,9 @@ bool DHWrapper::CopyPublicKey(uint8_t *pDst, int32_t dstLength) {
- return false;
- }
-
-- return CopyKey(_pDH->pub_key, pDst, dstLength);
-+ const BIGNUM *pub_key;
-+ DH_get0_key(_pDH, &pub_key, NULL);
-+ return CopyKey(pub_key, pDst, dstLength);
- }
-
- bool DHWrapper::CopyPrivateKey(uint8_t *pDst, int32_t dstLength) {
-@@ -99,7 +113,9 @@ bool DHWrapper::CopyPrivateKey(uint8_t *pDst, int32_t dstLength) {
- return false;
- }
-
-- return CopyKey(_pDH->priv_key, pDst, dstLength);
-+ const BIGNUM *priv_key;
-+ DH_get0_key(_pDH, NULL, &priv_key);
-+ return CopyKey(priv_key, pDst, dstLength);
- }
-
- bool DHWrapper::CreateSharedKey(uint8_t *pPeerPublicKey, int32_t length) {
-@@ -153,14 +169,6 @@ bool DHWrapper::CopySharedKey(uint8_t *pDst, int32_t dstLength) {
-
- void DHWrapper::Cleanup() {
- if (_pDH != NULL) {
-- if (_pDH->p != NULL) {
-- BN_free(_pDH->p);
-- _pDH->p = NULL;
-- }
-- if (_pDH->g != NULL) {
-- BN_free(_pDH->g);
-- _pDH->g = NULL;
-- }
- DH_free(_pDH);
- _pDH = NULL;
- }
-@@ -177,7 +185,7 @@ void DHWrapper::Cleanup() {
- }
- }
-
--bool DHWrapper::CopyKey(BIGNUM *pNum, uint8_t *pDst, int32_t dstLength) {
-+bool DHWrapper::CopyKey(const BIGNUM *pNum, uint8_t *pDst, int32_t dstLength) {
- int32_t keySize = BN_num_bytes(pNum);
- if ((keySize <= 0) || (dstLength <= 0) || (keySize > dstLength)) {
- FATAL("CopyPublicKey failed due to either invalid DH state or invalid call");
-@@ -197,20 +205,21 @@ void InitRC4Encryption(uint8_t *secretKey, uint8_t *pubKeyIn, uint8_t *pubKeyOut
- uint8_t digest[SHA256_DIGEST_LENGTH];
- unsigned int digestLen = 0;
-
-- HMAC_CTX ctx;
-- HMAC_CTX_init(&ctx);
-- HMAC_Init_ex(&ctx, secretKey, 128, EVP_sha256(), 0);
-- HMAC_Update(&ctx, pubKeyIn, 128);
-- HMAC_Final(&ctx, digest, &digestLen);
-- HMAC_CTX_cleanup(&ctx);
-+ HMAC_CTX *ctx;
-+ ctx = HMAC_CTX_new();
-+ if (ctx == NULL)
-+ return;
-+ HMAC_Init_ex(ctx, secretKey, 128, EVP_sha256(), 0);
-+ HMAC_Update(ctx, pubKeyIn, 128);
-+ HMAC_Final(ctx, digest, &digestLen);
-+ HMAC_CTX_reset(ctx);
-
- RC4_set_key(rc4keyOut, 16, digest);
-
-- HMAC_CTX_init(&ctx);
-- HMAC_Init_ex(&ctx, secretKey, 128, EVP_sha256(), 0);
-- HMAC_Update(&ctx, pubKeyOut, 128);
-- HMAC_Final(&ctx, digest, &digestLen);
-- HMAC_CTX_cleanup(&ctx);
-+ HMAC_Init_ex(ctx, secretKey, 128, EVP_sha256(), 0);
-+ HMAC_Update(ctx, pubKeyOut, 128);
-+ HMAC_Final(ctx, digest, &digestLen);
-+ HMAC_CTX_free(ctx);
-
- RC4_set_key(rc4keyIn, 16, digest);
- }
-@@ -220,14 +229,17 @@ string md5(string source, bool textResult) {
- }
-
- string md5(uint8_t *pBuffer, uint32_t length, bool textResult) {
-- EVP_MD_CTX mdctx;
-+ EVP_MD_CTX *mdctx;
- unsigned char md_value[EVP_MAX_MD_SIZE];
- unsigned int md_len;
-
-- EVP_DigestInit(&mdctx, EVP_md5());
-- EVP_DigestUpdate(&mdctx, pBuffer, length);
-- EVP_DigestFinal_ex(&mdctx, md_value, &md_len);
-- EVP_MD_CTX_cleanup(&mdctx);
-+ mdctx = EVP_MD_CTX_new();
-+ if (mdctx == NULL)
-+ return "";
-+ EVP_DigestInit(mdctx, EVP_md5());
-+ EVP_DigestUpdate(mdctx, pBuffer, length);
-+ EVP_DigestFinal_ex(mdctx, md_value, &md_len);
-+ EVP_MD_CTX_free(mdctx);
-
- if (textResult) {
- string result = "";
-@@ -259,12 +271,12 @@ void HMACsha256(const void *pData, uint32_t dataLength,
- const void *pKey, uint32_t keyLength, void *pResult) {
- unsigned int digestLen;
-
-- HMAC_CTX ctx;
-- HMAC_CTX_init(&ctx);
-- HMAC_Init_ex(&ctx, (unsigned char*) pKey, keyLength, EVP_sha256(), NULL);
-- HMAC_Update(&ctx, (unsigned char *) pData, dataLength);
-- HMAC_Final(&ctx, (unsigned char *) pResult, &digestLen);
-- HMAC_CTX_cleanup(&ctx);
-+ HMAC_CTX *ctx;
-+ ctx = HMAC_CTX_new();
-+ HMAC_Init_ex(ctx, (unsigned char*) pKey, keyLength, EVP_sha256(), NULL);
-+ HMAC_Update(ctx, (unsigned char *) pData, dataLength);
-+ HMAC_Final(ctx, (unsigned char *) pResult, &digestLen);
-+ HMAC_CTX_free(ctx);
-
- o_assert(digestLen == 32);
- }
-@@ -397,8 +409,8 @@ string unhex(const uint8_t *pBuffer, uint32_t length) {
- }
-
- void CleanupSSL() {
--#ifndef NO_SSL_ENGINE_CLEANUP
-- ERR_remove_state(0);
-+#if OPENSSL_VERSION_NUMBER < 0x10100000L
-+ ERR_remove_thread_state(NULL);
- ENGINE_cleanup();
- CONF_modules_unload(1);
- ERR_free_strings();
---- /dev/null
-+++ b/sources/common/src/utils/misc/libcrypto-compat.cpp
-@@ -0,0 +1,90 @@
-+/*
-+ * Copyright 2016 The OpenSSL Project Authors. All Rights Reserved.
-+ *
-+ * Licensed under the OpenSSL license (the "License"). You may not use
-+ * this file except in compliance with the License. You can obtain a copy
-+ * in the file LICENSE in the source distribution or at
-+ * https://www.openssl.org/source/license.html
-+ */
-+
-+#include "utils/misc/libcrypto-compat.h"
-+
-+#if OPENSSL_VERSION_NUMBER < 0x10100000L
-+
-+#include <string.h>
-+
-+static void *OPENSSL_zalloc(size_t num)
-+{
-+ void *ret = OPENSSL_malloc(num);
-+
-+ if (ret != NULL)
-+ memset(ret, 0, num);
-+ return ret;
-+}
-+
-+int DH_set0_pqg(DH *dh, BIGNUM *p, BIGNUM *q, BIGNUM *g)
-+{
-+ /* If the fields p and g in d are NULL, the corresponding input
-+ * parameters MUST be non-NULL. q may remain NULL.
-+ */
-+ if ((dh->p == NULL && p == NULL)
-+ || (dh->g == NULL && g == NULL))
-+ return 0;
-+
-+ if (p != NULL) {
-+ BN_free(dh->p);
-+ dh->p = p;
-+ }
-+ if (q != NULL) {
-+ BN_free(dh->q);
-+ dh->q = q;
-+ }
-+ if (g != NULL) {
-+ BN_free(dh->g);
-+ dh->g = g;
-+ }
-+
-+ if (q != NULL) {
-+ dh->length = BN_num_bits(q);
-+ }
-+
-+ return 1;
-+}
-+
-+void DH_get0_key(const DH *dh, const BIGNUM **pub_key, const BIGNUM **priv_key)
-+{
-+ if (pub_key != NULL)
-+ *pub_key = dh->pub_key;
-+ if (priv_key != NULL)
-+ *priv_key = dh->priv_key;
-+}
-+
-+int DH_set_length(DH *dh, long length)
-+{
-+ dh->length = length;
-+ return 1;
-+}
-+
-+EVP_MD_CTX *EVP_MD_CTX_new(void)
-+{
-+ return (EVP_MD_CTX *)OPENSSL_zalloc(sizeof(EVP_MD_CTX));
-+}
-+
-+void EVP_MD_CTX_free(EVP_MD_CTX *ctx)
-+{
-+ EVP_MD_CTX_cleanup(ctx);
-+ OPENSSL_free(ctx);
-+}
-+
-+HMAC_CTX *HMAC_CTX_new(void)
-+{
-+ return (HMAC_CTX *)OPENSSL_zalloc(sizeof(HMAC_CTX));
-+}
-+
-+void HMAC_CTX_free(HMAC_CTX *ctx)
-+{
-+ HMAC_CTX_cleanup(ctx);
-+ OPENSSL_free(ctx);
-+}
-+
-+#endif /* OPENSSL_VERSION_NUMBER */
---- a/sources/thelib/src/protocols/ssl/basesslprotocol.cpp
-+++ b/sources/thelib/src/protocols/ssl/basesslprotocol.cpp
-@@ -43,6 +43,7 @@ BaseSSLProtocol::~BaseSSLProtocol() {
- bool BaseSSLProtocol::Initialize(Variant ¶meters) {
- //1. Initialize the SSL library
- if (!_libraryInitialized) {
-+#if OPENSSL_VERSION_NUMBER < 0x10100000L
- //3. This is the first time we use the library. So we have to
- //initialize it first
- SSL_library_init();
-@@ -55,6 +56,7 @@ bool BaseSSLProtocol::Initialize(Variant ¶meters) {
- OpenSSL_add_all_algorithms();
- OpenSSL_add_all_ciphers();
- OpenSSL_add_all_digests();
-+#endif
-
- //initialize the random numbers generator
- InitRandGenerator();
-@@ -211,6 +213,7 @@ string BaseSSLProtocol::GetSSLErrors() {
-
- string BaseSSLProtocol::DumpBIO(BIO *pBIO) {
- string formatString;
-+#if OPENSSL_VERSION_NUMBER < 0x10100000L
- formatString = "method: %p\n";
- formatString += "callback: %p\n";
- formatString += "cb_arg: %p\n";
-@@ -240,6 +243,39 @@ string BaseSSLProtocol::DumpBIO(BIO *pBIO) {
- pBIO->references,
- (int64_t) pBIO->num_read,
- (int64_t) pBIO->num_write);
-+#else
-+// Some of these are problematic in openssl >= 1.1, since
-+// the BIO struct is opaque.
-+ formatString = "method: %s\n";
-+ formatString += "callback: %p\n";
-+ formatString += "cb_arg: %p\n";
-+ formatString += "init: %d\n";
-+ formatString += "shutdown: %d\n";
-+ formatString += "flags: %d\n";
-+ formatString += "retry_reason: %d\n";
-+ formatString += "num: %d\n";
-+ formatString += "ptr: %p\n";
-+ formatString += "next_bio: %p\n";
-+ formatString += "prev_bio: %s\n";
-+ formatString += "references: %s\n";
-+ formatString += "num_read: %"PRId64"\n";
-+ formatString += "num_write: %"PRId64;
-+ return format(STR(formatString),
-+ BIO_method_name(pBIO),
-+ BIO_get_callback(pBIO),
-+ BIO_get_callback_arg(pBIO),
-+ BIO_get_init(pBIO),
-+ BIO_get_shutdown(pBIO),
-+ BIO_get_flags(pBIO),
-+ BIO_get_retry_reason(pBIO),
-+ BIO_get_fd(pBIO, NULL),
-+ BIO_get_data(pBIO),
-+ BIO_next(pBIO),
-+ "unknown", //prev_bio
-+ "unknown", //references
-+ BIO_number_read(pBIO),
-+ BIO_number_written(pBIO));
-+#endif
- }
-
- void BaseSSLProtocol::InitRandGenerator() {
---- a/sources/thelib/src/protocols/ssl/outboundsslprotocol.cpp
-+++ b/sources/thelib/src/protocols/ssl/outboundsslprotocol.cpp
-@@ -33,7 +33,7 @@ bool OutboundSSLProtocol::InitGlobalContext(Variant ¶meters) {
- _pGlobalSSLContext = _pGlobalContexts[hash];
- if (_pGlobalSSLContext == NULL) {
- //2. prepare the global ssl context
-- _pGlobalSSLContext = SSL_CTX_new(TLSv1_method());
-+ _pGlobalSSLContext = SSL_CTX_new(SSLv23_method());
- if (_pGlobalSSLContext == NULL) {
- FATAL("Unable to create global SSL context");
- return false;