2014-04-27 16:27:53 -04:00
|
|
|
|
|
|
|
// CallbackSslContext.h
|
|
|
|
|
|
|
|
// Declares the cCallbackSslContext class representing a SSL context wrapper that uses callbacks to read and write SSL peer data
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#pragma once
|
|
|
|
|
|
|
|
#include "SslContext.h"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class cCallbackSslContext :
|
|
|
|
public cSslContext
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
/** Interface used as a data sink for the SSL peer data. */
|
|
|
|
class cDataCallbacks
|
|
|
|
{
|
|
|
|
public:
|
2014-05-01 16:41:41 -04:00
|
|
|
// Force a virtual destructor in descendants:
|
|
|
|
virtual ~cDataCallbacks() {}
|
|
|
|
|
2014-04-27 16:27:53 -04:00
|
|
|
/** Called when PolarSSL wants to read encrypted data from the SSL peer.
|
|
|
|
The returned value is the number of bytes received, or a PolarSSL error on failure.
|
|
|
|
The implementation can return POLARSSL_ERR_NET_WANT_READ or POLARSSL_ERR_NET_WANT_WRITE to indicate
|
|
|
|
that there's currently no more data and that there might be more data in the future. In such cases the
|
|
|
|
SSL operation that invoked this call will terminate with the same return value, so that the owner is
|
|
|
|
notified of this condition and can potentially restart the operation later on. */
|
|
|
|
virtual int ReceiveEncrypted(unsigned char * a_Buffer, size_t a_NumBytes) = 0;
|
|
|
|
|
|
|
|
/** Called when PolarSSL wants to write encrypted data to the SSL peer.
|
|
|
|
The returned value is the number of bytes sent, or a PolarSSL error on failure.
|
|
|
|
The implementation can return POLARSSL_ERR_NET_WANT_READ or POLARSSL_ERR_NET_WANT_WRITE to indicate
|
|
|
|
that there's currently no more data and that there might be more data in the future. In such cases the
|
|
|
|
SSL operation that invoked this call will terminate with the same return value, so that the owner is
|
|
|
|
notified of this condition and can potentially restart the operation later on. */
|
|
|
|
virtual int SendEncrypted(const unsigned char * a_Buffer, size_t a_NumBytes) = 0;
|
|
|
|
} ;
|
|
|
|
|
|
|
|
|
|
|
|
/** Creates a new SSL context with no callbacks assigned */
|
|
|
|
cCallbackSslContext(void);
|
|
|
|
|
|
|
|
/** Creates a new SSL context with the specified callbacks */
|
|
|
|
cCallbackSslContext(cDataCallbacks & a_Callbacks);
|
|
|
|
|
|
|
|
protected:
|
|
|
|
/** The callbacks to use to send and receive SSL peer data */
|
|
|
|
cDataCallbacks * m_Callbacks;
|
|
|
|
|
|
|
|
// cSslContext overrides:
|
|
|
|
virtual int ReceiveEncrypted(unsigned char * a_Buffer, size_t a_NumBytes) override;
|
|
|
|
virtual int SendEncrypted(const unsigned char * a_Buffer, size_t a_NumBytes) override;
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|