4 #include <boost/test/unit_test.hpp>
6 #include <openssl/ssl.h>
7 #include <openssl/err.h>
10 #include "io/opensslBIO.h"
11 #include "io/slipBio.h"
13 class OpensslBIOVector : public OpensslBIO {
15 std::vector<std::vector<char>> input;
16 std::vector<std::vector<char>>::iterator it, end;
19 std::vector<std::vector<char>> result = std::vector<std::vector<char>>();
20 OpensslBIOVector( std::vector<std::vector<char>> data ) : input( data ), it( input.begin() ), end( input.end() ) {
23 int write( const char* buf, int num );
24 int read( char* buf, int size );
25 long ctrl( int cmod, long arg1, void* arg2 );
27 static const char* getName();
30 int OpensslBIOVector::write( const char* buf, int num ) {
31 result.push_back( std::vector<char>( buf, buf + num ) );
35 int OpensslBIOVector::read( char* buf, int size ) {
40 if( ( unsigned int ) size < it->size() ) {
41 throw "Error, to small buffer";
44 std::copy( it->begin(), it->end(), buf );
45 auto result = it->size();
50 long OpensslBIOVector::ctrl( int cmod, long arg1, void* arg2 ) {
57 const char* OpensslBIOVector::getName() {
61 BOOST_AUTO_TEST_SUITE( TestSLIPBioWrapper )
63 BOOST_AUTO_TEST_CASE( TestMockup ) {
64 std::vector<std::vector<char>> source = {{1, 2}, {1, 2, 3}, {1, 2, 3, 4}, {1, 2, 3, 4, 5}};
66 OpensslBIOVector* data = new OpensslBIOVector( source );
70 for( auto it = source.begin(); it != source.end(); it++ ) {
71 auto len = data->read( buf, sizeof( buf ) );
72 BOOST_CHECK_EQUAL( len, it->size() );
73 BOOST_CHECK_EQUAL_COLLECTIONS( buf, buf + len, it->begin(), it->end() );
74 BOOST_CHECK_EQUAL( data->write( buf, len ), len );
77 BOOST_CHECK_EQUAL( data->read( buf, sizeof( buf ) ), -1 );
79 for( unsigned int i = 0; i < source.size(); i++ ) {
80 BOOST_CHECK_EQUAL_COLLECTIONS( data->result[i].begin(), data->result[i].end(), source[i].begin(), source[i].end() );
86 BOOST_AUTO_TEST_CASE( TestSLIP ) {
87 std::vector<std::vector<char>> source = { { (char) 0xc0 }, {1, 2, 3, 4, 5, ( char ) 0xc0, 1, ( char ) 0xc0}, {1, 2}, {( char ) 0xc0}, {1, ( char ) 0xdb}, {( char ) 0xdc}, {( char ) 0xc0, ( char )0xdb}, {( char ) 0xdd, 2}, {( char ) 0xc0}};
88 std::shared_ptr<OpensslBIOVector> data = std::shared_ptr<OpensslBIOVector>( new OpensslBIOVector( source ) );
90 SlipBIO* slip = new SlipBIO();
91 slip->setTarget(data, true);
92 int res = slip->read( buf, sizeof( buf ) );
93 BOOST_CHECK_EQUAL( res, 5 );
94 res = slip->read( buf, sizeof( buf ) );
95 BOOST_CHECK_EQUAL( res, 1 );
96 res = slip->read( buf, sizeof( buf ) );
97 BOOST_CHECK_EQUAL( res, 2 );
99 res = slip->read( buf, sizeof( buf ) );
100 BOOST_CHECK_EQUAL( res, 2 );
101 char res2[] = {1, ( char ) 0xc0};
102 BOOST_CHECK_EQUAL_COLLECTIONS( buf, buf + 2, res2, res2 + 2 );
104 res = slip->read( buf, sizeof( buf ) );
105 BOOST_CHECK_EQUAL( res, 2 );
106 char res3[] = {( char ) 0xdb, 2};
107 BOOST_CHECK_EQUAL_COLLECTIONS( buf, buf + 2, res3, res3 + 2 );
111 BOOST_AUTO_TEST_CASE( TestSSLThroughSLIP ) {
113 BOOST_REQUIRE_EQUAL( BIO_new_bio_pair( &bio1, 8096, &bio2, 8096 ), 1 );
114 BIO* slip1 = BIO_new( toBio<SlipBIO>() );
115 ( ( SlipBIO* )slip1->ptr )->setTarget( std::shared_ptr<OpensslBIO>( new OpensslBIOWrapper( std::shared_ptr<BIO>( bio1, BIO_free ) ) ), true );
116 BIO* slip2 = BIO_new( toBio<SlipBIO>() );
117 ( ( SlipBIO* )slip2->ptr )->setTarget( std::shared_ptr<OpensslBIO>( new OpensslBIOWrapper( std::shared_ptr<BIO>( bio2, BIO_free ) ) ), false );
119 auto meth = TLSv1_method();
120 auto c_ctx = SSL_CTX_new( meth );
121 auto s_ctx = SSL_CTX_new( meth );
122 //SSL_CTX_set_cipher_list(c_ctx, "ALL");
123 //SSL_CTX_set_cipher_list(s_ctx, "ALL");
124 SSL_CTX_use_certificate_file( s_ctx, "testdata/server.crt", SSL_FILETYPE_PEM );
125 SSL_CTX_use_PrivateKey_file( s_ctx, "testdata/server.key", SSL_FILETYPE_PEM );
126 auto c_ssl = SSL_new( c_ctx );
127 auto s_ssl = SSL_new( s_ctx );
128 auto c_bio = BIO_new( BIO_f_ssl() );
129 auto s_bio = BIO_new( BIO_f_ssl() );
130 SSL_set_connect_state( c_ssl );
131 SSL_set_bio( c_ssl, slip1, slip1 );
132 BIO_set_ssl( c_bio, c_ssl, BIO_NOCLOSE );
134 SSL_set_accept_state( s_ssl );
135 SSL_set_bio( s_ssl, slip2, slip2 );
136 BIO_set_ssl( s_bio, s_ssl, BIO_NOCLOSE );
138 char data[] = {1, 2, 3, 4, 5};
140 //ERR_load_SSL_strings();
141 //ERR_load_crypto_strings();
143 int res = BIO_write( c_bio, data, 5 );
144 BOOST_CHECK_EQUAL( res, -1 );
145 res = BIO_read( s_bio, data2, sizeof( data2 ) );
146 BOOST_CHECK_EQUAL( res, -1 );
148 res = BIO_write( c_bio, data, 5 );
149 BOOST_CHECK_EQUAL( res, -1 );
151 res = BIO_read( s_bio, data2, sizeof( data2 ) );
152 BOOST_CHECK_EQUAL( res, -1 );
153 res = BIO_write( c_bio, data, 5 );
154 BOOST_CHECK_EQUAL( res, 5 );
155 res = BIO_read( s_bio, data2, sizeof( data2 ) );
156 BOOST_CHECK_EQUAL( res, 5 );
157 BOOST_CHECK_EQUAL_COLLECTIONS( data, data + 5, data2, data2 + 5 );
167 SSL_CTX_free( c_ctx );
168 SSL_CTX_free( s_ctx );
171 BOOST_AUTO_TEST_SUITE_END()