/*---------------------------------------------------------------------- | NPT_TlsSessionImpl::Handshake +---------------------------------------------------------------------*/ NPT_Result NPT_TlsSessionImpl::Handshake() { if (m_SSL == NULL) { // we have not performed the handshake yet m_SSL = ssl_client_new(m_SSL_CTX, &m_StreamAdapter.m_Base, NULL, 0); } int result = ssl_handshake_status(m_SSL); return NPT_Tls_MapResult(result); }
/*---------------------------------------------------------------------- | NPT_TlsContextImpl::LoadKey +---------------------------------------------------------------------*/ NPT_Result NPT_TlsContextImpl::LoadKey(NPT_TlsKeyFormat key_format, const unsigned char* key_data, NPT_Size key_data_size, const char* password) { int object_type; switch (key_format) { case NPT_TLS_KEY_FORMAT_RSA_PRIVATE: object_type = SSL_OBJ_RSA_KEY; break; case NPT_TLS_KEY_FORMAT_PKCS8: object_type = SSL_OBJ_PKCS8; break; case NPT_TLS_KEY_FORMAT_PKCS12: object_type = SSL_OBJ_PKCS12; break; default: return NPT_ERROR_INVALID_PARAMETERS; } int result = ssl_obj_memory_load(m_SSL_CTX, object_type, key_data, key_data_size, password); return NPT_Tls_MapResult(result); }
/*---------------------------------------------------------------------- | NPT_TlsInputStream::Read +---------------------------------------------------------------------*/ NPT_Result NPT_TlsInputStream::Read(void* buffer, NPT_Size bytes_to_read, NPT_Size* bytes_read) { // setup default values if (bytes_read) *bytes_read = 0; // quick check for edge case if (bytes_to_read == 0) return NPT_SUCCESS; // read a new record if we don't have one cached if (m_RecordCacheData == NULL) { int ssl_result; do { ssl_result = ssl_read(m_Session->m_SSL, &m_RecordCacheData); } while (ssl_result == 0); if (ssl_result < 0) { return NPT_Tls_MapResult(ssl_result); } m_RecordCacheSize = ssl_result; } // we now have data in cache if (bytes_to_read > m_RecordCacheSize) { // read at most what's in the cache bytes_to_read = m_RecordCacheSize; } NPT_CopyMemory(buffer, m_RecordCacheData, bytes_to_read); if (bytes_read) *bytes_read = bytes_to_read; // update the record cache m_RecordCacheSize -= bytes_to_read; if (m_RecordCacheSize == 0) { // nothing left in the cache m_RecordCacheData = NULL; } else { // move the cache pointer m_RecordCacheData += bytes_to_read; } return NPT_SUCCESS; }
/*---------------------------------------------------------------------- | NPT_TlsOutputStream::Write +---------------------------------------------------------------------*/ NPT_Result NPT_TlsOutputStream::Write(const void* buffer, NPT_Size bytes_to_write, NPT_Size* bytes_written) { // setup default values if (bytes_written) *bytes_written = 0; // quick check for edge case if (bytes_to_write == 0) return NPT_SUCCESS; // write some data int ssl_result; do { ssl_result = ssl_write(m_Session->m_SSL, (const uint8_t*)buffer, bytes_to_write); } while (ssl_result == 0); if (ssl_result < 0) { return NPT_Tls_MapResult(ssl_result); } m_Position += ssl_result; if (bytes_written) *bytes_written = (NPT_Size)ssl_result; return NPT_SUCCESS; }