15 #include "tlsgnutlsbase.h"
31 :
TLSBase( th, server ), m_session( new gnutls_session_t ), m_buf( 0 ), m_bufsize( 17000 )
33 m_buf = (
char*)calloc( m_bufsize + 1,
sizeof(
char ) );
57 std::string::size_type sum = 0;
60 ret = gnutls_record_send( *m_session, data.c_str() + sum, data.length() - sum );
63 while( ( ret == GNUTLS_E_AGAIN ) || ( ret == GNUTLS_E_INTERRUPTED ) || sum < data.length() );
74 return static_cast<int>( data.length() );
81 ret =
static_cast<int>( gnutls_record_recv( *m_session, m_buf, m_bufsize ) );
83 if( ret > 0 && m_handler )
101 gnutls_bye( *m_session, GNUTLS_SHUT_RDWR );
102 gnutls_db_remove_session( *m_session );
103 gnutls_credentials_clear( *m_session );
105 gnutls_deinit( *m_session );
112 m_session =
new gnutls_session_t;
123 int ret = gnutls_handshake( *m_session );
124 if( ret < 0 && gnutls_error_is_fatal( ret ) )
126 gnutls_perror( ret );
127 gnutls_db_remove_session( *m_session );
128 gnutls_deinit( *m_session );
134 else if( ret == GNUTLS_E_AGAIN )
149 #ifdef HAVE_GNUTLS_SESSION_CHANNEL_BINDING
158 #ifdef HAVE_GNUTLS_SESSION_CHANNEL_BINDING
161 rc = gnutls_session_channel_binding( *m_session, GNUTLS_CB_TLS_UNIQUE, &cb );
163 return std::string( (
char*)cb.data, cb.size );
169 ssize_t GnuTLSBase::pullFunc(
void* data,
size_t len )
171 ssize_t cpy = ( len > m_recvBuffer.length() ) ? ( m_recvBuffer.length() ) : ( len );
174 memcpy( data, (
const void*)m_recvBuffer.c_str(), cpy );
175 m_recvBuffer.erase( 0, cpy );
181 return GNUTLS_E_AGAIN;
185 ssize_t GnuTLSBase::pullFunc( gnutls_transport_ptr_t ptr,
void* data,
size_t len )
187 return static_cast<GnuTLSBase*
>( ptr )->pullFunc( data, len );
190 ssize_t GnuTLSBase::pushFunc(
const void* data,
size_t len )
198 ssize_t GnuTLSBase::pushFunc( gnutls_transport_ptr_t ptr,
const void* data,
size_t len )
200 return static_cast<GnuTLSBase*
>( ptr )->pushFunc( data, len );
205 #endif // HAVE_GNUTLS
virtual const std::string channelBinding() const
GnuTLSBase(TLSHandler *th, const std::string &server=EmptyString)
virtual void handleEncryptedData(const TLSBase *base, const std::string &data)=0
virtual int decrypt(const std::string &data)
virtual bool hasChannelBinding() const
An abstract base class for TLS implementations.
virtual void handleDecryptedData(const TLSBase *base, const std::string &data)=0
virtual bool encrypt(const std::string &data)
An interface that allows for interacting with TLS implementations derived from TLSBase.
const std::string EmptyString
virtual void handleHandshakeResult(const TLSBase *base, bool success, CertInfo &certinfo)=0