aboutsummaryrefslogtreecommitdiffstats
path: root/src/vmime/net/tls
diff options
context:
space:
mode:
Diffstat (limited to 'src/vmime/net/tls')
-rw-r--r--src/vmime/net/tls/TLSSecuredConnectionInfos.cpp2
-rw-r--r--src/vmime/net/tls/TLSSecuredConnectionInfos.hpp2
-rw-r--r--src/vmime/net/tls/TLSSession.hpp4
-rw-r--r--src/vmime/net/tls/TLSSocket.hpp2
-rw-r--r--src/vmime/net/tls/gnutls/TLSSession_GnuTLS.cpp6
-rw-r--r--src/vmime/net/tls/gnutls/TLSSession_GnuTLS.hpp4
-rw-r--r--src/vmime/net/tls/gnutls/TLSSocket_GnuTLS.cpp6
-rw-r--r--src/vmime/net/tls/gnutls/TLSSocket_GnuTLS.hpp4
-rw-r--r--src/vmime/net/tls/openssl/TLSSession_OpenSSL.cpp6
-rw-r--r--src/vmime/net/tls/openssl/TLSSession_OpenSSL.hpp4
-rw-r--r--src/vmime/net/tls/openssl/TLSSocket_OpenSSL.cpp83
-rw-r--r--src/vmime/net/tls/openssl/TLSSocket_OpenSSL.hpp4
12 files changed, 88 insertions, 39 deletions
diff --git a/src/vmime/net/tls/TLSSecuredConnectionInfos.cpp b/src/vmime/net/tls/TLSSecuredConnectionInfos.cpp
index 4856e9af..45b9527e 100644
--- a/src/vmime/net/tls/TLSSecuredConnectionInfos.cpp
+++ b/src/vmime/net/tls/TLSSecuredConnectionInfos.cpp
@@ -38,7 +38,7 @@ namespace tls {
TLSSecuredConnectionInfos::TLSSecuredConnectionInfos
(const string& host, const port_t port,
- shared_ptr <TLSSession> tlsSession, shared_ptr <TLSSocket> tlsSocket)
+ const shared_ptr <TLSSession>& tlsSession, const shared_ptr <TLSSocket>& tlsSocket)
: m_host(host), m_port(port),
m_tlsSession(tlsSession), m_tlsSocket(tlsSocket)
{
diff --git a/src/vmime/net/tls/TLSSecuredConnectionInfos.hpp b/src/vmime/net/tls/TLSSecuredConnectionInfos.hpp
index e552d6f9..19e7a064 100644
--- a/src/vmime/net/tls/TLSSecuredConnectionInfos.hpp
+++ b/src/vmime/net/tls/TLSSecuredConnectionInfos.hpp
@@ -52,7 +52,7 @@ class VMIME_EXPORT TLSSecuredConnectionInfos : public securedConnectionInfos
public:
TLSSecuredConnectionInfos(const string& host, const port_t port,
- shared_ptr <TLSSession> tlsSession, shared_ptr <TLSSocket> tlsSocket);
+ const shared_ptr <TLSSession>& tlsSession, const shared_ptr <TLSSocket>& tlsSocket);
const string getHost() const;
port_t getPort() const;
diff --git a/src/vmime/net/tls/TLSSession.hpp b/src/vmime/net/tls/TLSSession.hpp
index 8951ffa4..83a1623c 100644
--- a/src/vmime/net/tls/TLSSession.hpp
+++ b/src/vmime/net/tls/TLSSession.hpp
@@ -57,7 +57,7 @@ public:
* @param props TLS properties for this session
* @return a new TLS session
*/
- static shared_ptr <TLSSession> create(shared_ptr <security::cert::certificateVerifier> cv, shared_ptr <TLSProperties> props);
+ static shared_ptr <TLSSession> create(const shared_ptr <security::cert::certificateVerifier>& cv, const shared_ptr <TLSProperties>& props);
/** Create a new socket that adds a TLS security layer around
* an existing socket. You should create only one socket
@@ -66,7 +66,7 @@ public:
* @param sok socket to wrap
* @return TLS socket wrapper
*/
- virtual shared_ptr <TLSSocket> getSocket(shared_ptr <socket> sok) = 0;
+ virtual shared_ptr <TLSSocket> getSocket(const shared_ptr <socket>& sok) = 0;
/** Get the object responsible for verifying certificates when
* using secured connections (TLS/SSL).
diff --git a/src/vmime/net/tls/TLSSocket.hpp b/src/vmime/net/tls/TLSSocket.hpp
index be27d1d0..75b80116 100644
--- a/src/vmime/net/tls/TLSSocket.hpp
+++ b/src/vmime/net/tls/TLSSocket.hpp
@@ -59,7 +59,7 @@ public:
* @param session TLS session
* @param sok socket to wrap
*/
- static shared_ptr <TLSSocket> wrap(shared_ptr <TLSSession> session, shared_ptr <socket> sok);
+ static shared_ptr <TLSSocket> wrap(const shared_ptr <TLSSession>& session, const shared_ptr <socket>& sok);
/** Starts a TLS handshake on this connection.
*
diff --git a/src/vmime/net/tls/gnutls/TLSSession_GnuTLS.cpp b/src/vmime/net/tls/gnutls/TLSSession_GnuTLS.cpp
index 2a6450eb..dccfb5ec 100644
--- a/src/vmime/net/tls/gnutls/TLSSession_GnuTLS.cpp
+++ b/src/vmime/net/tls/gnutls/TLSSession_GnuTLS.cpp
@@ -134,13 +134,13 @@ static TLSGlobal g_gnutlsGlobal;
// static
-shared_ptr <TLSSession> TLSSession::create(shared_ptr <security::cert::certificateVerifier> cv, shared_ptr <TLSProperties> props)
+shared_ptr <TLSSession> TLSSession::create(const shared_ptr <security::cert::certificateVerifier>& cv, const shared_ptr <TLSProperties>& props)
{
return make_shared <TLSSession_GnuTLS>(cv, props);
}
-TLSSession_GnuTLS::TLSSession_GnuTLS(shared_ptr <security::cert::certificateVerifier> cv, shared_ptr <TLSProperties> props)
+TLSSession_GnuTLS::TLSSession_GnuTLS(const shared_ptr <security::cert::certificateVerifier>& cv, const shared_ptr <TLSProperties>& props)
: m_certVerifier(cv), m_props(props)
{
int res;
@@ -274,7 +274,7 @@ TLSSession_GnuTLS::~TLSSession_GnuTLS()
}
-shared_ptr <TLSSocket> TLSSession_GnuTLS::getSocket(shared_ptr <socket> sok)
+shared_ptr <TLSSocket> TLSSession_GnuTLS::getSocket(const shared_ptr <socket>& sok)
{
return TLSSocket::wrap(dynamicCast <TLSSession>(shared_from_this()), sok);
}
diff --git a/src/vmime/net/tls/gnutls/TLSSession_GnuTLS.hpp b/src/vmime/net/tls/gnutls/TLSSession_GnuTLS.hpp
index 14172ee0..dd096ff3 100644
--- a/src/vmime/net/tls/gnutls/TLSSession_GnuTLS.hpp
+++ b/src/vmime/net/tls/gnutls/TLSSession_GnuTLS.hpp
@@ -52,11 +52,11 @@ class TLSSession_GnuTLS : public TLSSession
public:
- TLSSession_GnuTLS(shared_ptr <security::cert::certificateVerifier> cv, shared_ptr <TLSProperties> props);
+ TLSSession_GnuTLS(const shared_ptr <security::cert::certificateVerifier>& cv, const shared_ptr <TLSProperties>& props);
~TLSSession_GnuTLS();
- shared_ptr <TLSSocket> getSocket(shared_ptr <socket> sok);
+ shared_ptr <TLSSocket> getSocket(const shared_ptr <socket>& sok);
shared_ptr <security::cert::certificateVerifier> getCertificateVerifier();
diff --git a/src/vmime/net/tls/gnutls/TLSSocket_GnuTLS.cpp b/src/vmime/net/tls/gnutls/TLSSocket_GnuTLS.cpp
index 16dabb66..31753590 100644
--- a/src/vmime/net/tls/gnutls/TLSSocket_GnuTLS.cpp
+++ b/src/vmime/net/tls/gnutls/TLSSocket_GnuTLS.cpp
@@ -50,14 +50,14 @@ namespace tls {
// static
-shared_ptr <TLSSocket> TLSSocket::wrap(shared_ptr <TLSSession> session, shared_ptr <socket> sok)
+shared_ptr <TLSSocket> TLSSocket::wrap(const shared_ptr <TLSSession>& session, const shared_ptr <socket>& sok)
{
return make_shared <TLSSocket_GnuTLS>
(dynamicCast <TLSSession_GnuTLS>(session), sok);
}
-TLSSocket_GnuTLS::TLSSocket_GnuTLS(shared_ptr <TLSSession_GnuTLS> session, shared_ptr <socket> sok)
+TLSSocket_GnuTLS::TLSSocket_GnuTLS(const shared_ptr <TLSSession_GnuTLS>& session, const shared_ptr <socket>& sok)
: m_session(session), m_wrapped(sok), m_connected(false),
m_ex(NULL), m_status(0), m_errno(0)
{
@@ -143,7 +143,7 @@ shared_ptr <timeoutHandler> TLSSocket_GnuTLS::getTimeoutHandler()
}
-void TLSSocket_GnuTLS::setTracer(shared_ptr <net::tracer> tracer)
+void TLSSocket_GnuTLS::setTracer(const shared_ptr <net::tracer>& tracer)
{
m_wrapped->setTracer(tracer);
}
diff --git a/src/vmime/net/tls/gnutls/TLSSocket_GnuTLS.hpp b/src/vmime/net/tls/gnutls/TLSSocket_GnuTLS.hpp
index 931cb993..a1d78e99 100644
--- a/src/vmime/net/tls/gnutls/TLSSocket_GnuTLS.hpp
+++ b/src/vmime/net/tls/gnutls/TLSSocket_GnuTLS.hpp
@@ -50,7 +50,7 @@ class TLSSocket_GnuTLS : public TLSSocket
{
public:
- TLSSocket_GnuTLS(shared_ptr <TLSSession_GnuTLS> session, shared_ptr <socket> sok);
+ TLSSocket_GnuTLS(const shared_ptr <TLSSession_GnuTLS>& session, const shared_ptr <socket>& sok);
~TLSSocket_GnuTLS();
@@ -83,7 +83,7 @@ public:
shared_ptr <timeoutHandler> getTimeoutHandler();
- void setTracer(shared_ptr <net::tracer> tracer);
+ void setTracer(const shared_ptr <net::tracer>& tracer);
shared_ptr <net::tracer> getTracer();
private:
diff --git a/src/vmime/net/tls/openssl/TLSSession_OpenSSL.cpp b/src/vmime/net/tls/openssl/TLSSession_OpenSSL.cpp
index 7892de65..961f6517 100644
--- a/src/vmime/net/tls/openssl/TLSSession_OpenSSL.cpp
+++ b/src/vmime/net/tls/openssl/TLSSession_OpenSSL.cpp
@@ -46,13 +46,13 @@ static OpenSSLInitializer::autoInitializer openSSLInitializer;
// static
-shared_ptr <TLSSession> TLSSession::create(shared_ptr <security::cert::certificateVerifier> cv, shared_ptr <TLSProperties> props)
+shared_ptr <TLSSession> TLSSession::create(const shared_ptr <security::cert::certificateVerifier>& cv, const shared_ptr <TLSProperties>& props)
{
return make_shared <TLSSession_OpenSSL>(cv, props);
}
-TLSSession_OpenSSL::TLSSession_OpenSSL(shared_ptr <vmime::security::cert::certificateVerifier> cv, shared_ptr <TLSProperties> props)
+TLSSession_OpenSSL::TLSSession_OpenSSL(const shared_ptr <vmime::security::cert::certificateVerifier>& cv, const shared_ptr <TLSProperties>& props)
: m_sslctx(0), m_certVerifier(cv), m_props(props)
{
m_sslctx = SSL_CTX_new(SSLv23_client_method());
@@ -76,7 +76,7 @@ TLSSession_OpenSSL::~TLSSession_OpenSSL()
}
-shared_ptr <TLSSocket> TLSSession_OpenSSL::getSocket(shared_ptr <socket> sok)
+shared_ptr <TLSSocket> TLSSession_OpenSSL::getSocket(const shared_ptr <socket>& sok)
{
return TLSSocket::wrap(dynamicCast <TLSSession>(shared_from_this()), sok);
}
diff --git a/src/vmime/net/tls/openssl/TLSSession_OpenSSL.hpp b/src/vmime/net/tls/openssl/TLSSession_OpenSSL.hpp
index 5a2b60a8..c5c5da39 100644
--- a/src/vmime/net/tls/openssl/TLSSession_OpenSSL.hpp
+++ b/src/vmime/net/tls/openssl/TLSSession_OpenSSL.hpp
@@ -55,11 +55,11 @@ class TLSSession_OpenSSL : public TLSSession
public:
- TLSSession_OpenSSL(const shared_ptr <security::cert::certificateVerifier> cv, shared_ptr <TLSProperties> props);
+ TLSSession_OpenSSL(const shared_ptr <security::cert::certificateVerifier>& cv, const shared_ptr <TLSProperties>& props);
~TLSSession_OpenSSL();
- shared_ptr <TLSSocket> getSocket(shared_ptr <socket> sok);
+ shared_ptr <TLSSocket> getSocket(const shared_ptr <socket>& sok);
shared_ptr <security::cert::certificateVerifier> getCertificateVerifier();
diff --git a/src/vmime/net/tls/openssl/TLSSocket_OpenSSL.cpp b/src/vmime/net/tls/openssl/TLSSocket_OpenSSL.cpp
index a663f196..afc7e514 100644
--- a/src/vmime/net/tls/openssl/TLSSocket_OpenSSL.cpp
+++ b/src/vmime/net/tls/openssl/TLSSocket_OpenSSL.cpp
@@ -52,6 +52,8 @@ namespace tls {
static OpenSSLInitializer::autoInitializer openSSLInitializer;
+#if OPENSSL_VERSION_NUMBER < 0x10100000L
+
// static
BIO_METHOD TLSSocket_OpenSSL::sm_customBIOMethod =
{
@@ -67,16 +69,32 @@ BIO_METHOD TLSSocket_OpenSSL::sm_customBIOMethod =
0
};
+#define BIO_set_init(b, val) b->init = val
+#define BIO_set_data(b, val) b->ptr = val
+#define BIO_set_num(b, val) b->num = val
+#define BIO_set_flags(b, val) b->flags = val
+#define BIO_set_shutdown(b, val) b->shutdown = val
+#define BIO_get_init(b) b->init
+#define BIO_get_data(b) b->ptr
+#define BIO_get_shutdown(b) b->shutdown
+
+#else
+
+#define BIO_set_num(b, val)
+
+#endif
+
+
// static
-shared_ptr <TLSSocket> TLSSocket::wrap(shared_ptr <TLSSession> session, shared_ptr <socket> sok)
+shared_ptr <TLSSocket> TLSSocket::wrap(const shared_ptr <TLSSession>& session, const shared_ptr <socket>& sok)
{
return make_shared <TLSSocket_OpenSSL>
(dynamicCast <TLSSession_OpenSSL>(session), sok);
}
-TLSSocket_OpenSSL::TLSSocket_OpenSSL(shared_ptr <TLSSession_OpenSSL> session, shared_ptr <socket> sok)
+TLSSocket_OpenSSL::TLSSocket_OpenSSL(const shared_ptr <TLSSession_OpenSSL>& session, const shared_ptr <socket>& sok)
: m_session(session), m_wrapped(sok), m_connected(false), m_ssl(0), m_status(0), m_ex()
{
}
@@ -99,10 +117,41 @@ void TLSSocket_OpenSSL::createSSLHandle()
{
if (m_wrapped->isConnected())
{
+
+#if OPENSSL_VERSION_NUMBER < 0x10100000L
+
BIO* sockBio = BIO_new(&sm_customBIOMethod);
sockBio->ptr = this;
sockBio->init = 1;
+#else
+
+ BIO_METHOD* bioMeth = BIO_meth_new(BIO_TYPE_SOURCE_SINK | BIO_get_new_index(), "vmime::socket glue");
+
+ if (!bioMeth)
+ {
+ BIO_meth_free(bioMeth);
+ throw exceptions::tls_exception("BIO_meth_new() failed");
+ }
+
+ BIO_meth_set_write(bioMeth, TLSSocket_OpenSSL::bio_write);
+ BIO_meth_set_read(bioMeth, TLSSocket_OpenSSL::bio_read);
+ BIO_meth_set_puts(bioMeth, TLSSocket_OpenSSL::bio_puts);
+ BIO_meth_set_ctrl(bioMeth, TLSSocket_OpenSSL::bio_ctrl);
+ BIO_meth_set_create(bioMeth, TLSSocket_OpenSSL::bio_create);
+ BIO_meth_set_destroy(bioMeth, TLSSocket_OpenSSL::bio_destroy);
+
+ BIO* sockBio = BIO_new(bioMeth);
+ BIO_set_data(sockBio, this);
+ BIO_set_init(sockBio, 1);
+
+#endif
+
+ if (!sockBio)
+ {
+ throw exceptions::tls_exception("BIO_new() failed");
+ }
+
m_ssl = SSL_new(m_session->getContext());
if (!m_ssl)
@@ -193,7 +242,7 @@ shared_ptr <timeoutHandler> TLSSocket_OpenSSL::getTimeoutHandler()
}
-void TLSSocket_OpenSSL::setTracer(shared_ptr <net::tracer> tracer)
+void TLSSocket_OpenSSL::setTracer(const shared_ptr <net::tracer>& tracer)
{
m_wrapped->setTracer(tracer);
}
@@ -538,9 +587,9 @@ int TLSSocket_OpenSSL::bio_write(BIO* bio, const char* buf, int len)
if (buf == NULL || len <= 0)
return -1;
- TLSSocket_OpenSSL *sok = reinterpret_cast <TLSSocket_OpenSSL*>(bio->ptr);
+ TLSSocket_OpenSSL *sok = reinterpret_cast <TLSSocket_OpenSSL*>(BIO_get_data(bio));
- if (!bio->init || !sok)
+ if (!BIO_get_init(bio) || !sok)
return -1;
try
@@ -573,9 +622,9 @@ int TLSSocket_OpenSSL::bio_read(BIO* bio, char* buf, int len)
if (buf == NULL || len <= 0)
return -1;
- TLSSocket_OpenSSL *sok = reinterpret_cast <TLSSocket_OpenSSL*>(bio->ptr);
+ TLSSocket_OpenSSL *sok = reinterpret_cast <TLSSocket_OpenSSL*>(BIO_get_data(bio));
- if (!bio->init || !sok)
+ if (!BIO_get_init(bio) || !sok)
return -1;
try
@@ -621,12 +670,12 @@ long TLSSocket_OpenSSL::bio_ctrl(BIO* bio, int cmd, long num, void* /* ptr */)
case BIO_CTRL_GET_CLOSE:
- ret = bio->shutdown;
+ ret = BIO_get_shutdown(bio);
break;
case BIO_CTRL_SET_CLOSE:
- bio->shutdown = static_cast <int>(num);
+ BIO_set_shutdown(bio, static_cast <int>(num));
break;
case BIO_CTRL_PENDING:
@@ -654,10 +703,10 @@ long TLSSocket_OpenSSL::bio_ctrl(BIO* bio, int cmd, long num, void* /* ptr */)
// static
int TLSSocket_OpenSSL::bio_create(BIO* bio)
{
- bio->init = 0;
- bio->num = 0;
- bio->ptr = NULL;
- bio->flags = 0;
+ BIO_set_init(bio, 0);
+ BIO_set_num(bio, 0);
+ BIO_set_data(bio, NULL);
+ BIO_set_flags(bio, 0);
return 1;
}
@@ -669,11 +718,11 @@ int TLSSocket_OpenSSL::bio_destroy(BIO* bio)
if (bio == NULL)
return 0;
- if (bio->shutdown)
+ if (BIO_get_shutdown(bio))
{
- bio->ptr = NULL;
- bio->init = 0;
- bio->flags = 0;
+ BIO_set_data(bio, NULL);
+ BIO_set_init(bio, 0);
+ BIO_set_flags(bio, 0);
}
return 1;
diff --git a/src/vmime/net/tls/openssl/TLSSocket_OpenSSL.hpp b/src/vmime/net/tls/openssl/TLSSocket_OpenSSL.hpp
index 34324b8c..9f395051 100644
--- a/src/vmime/net/tls/openssl/TLSSocket_OpenSSL.hpp
+++ b/src/vmime/net/tls/openssl/TLSSocket_OpenSSL.hpp
@@ -54,7 +54,7 @@ class TLSSocket_OpenSSL : public TLSSocket
{
public:
- TLSSocket_OpenSSL(shared_ptr <TLSSession_OpenSSL> session, shared_ptr <socket> sok);
+ TLSSocket_OpenSSL(const shared_ptr <TLSSession_OpenSSL>& session, const shared_ptr <socket>& sok);
~TLSSocket_OpenSSL();
@@ -87,7 +87,7 @@ public:
shared_ptr <timeoutHandler> getTimeoutHandler();
- void setTracer(shared_ptr <net::tracer> tracer);
+ void setTracer(const shared_ptr <net::tracer>& tracer);
shared_ptr <net::tracer> getTracer();
private: