]> WPIA git - cassiopeia.git/blob - test/src/slipBioTest.cpp
8f967de73f47733967b7c3373cee803f939267a1
[cassiopeia.git] / test / src / slipBioTest.cpp
1 #include <iostream>
2 #include <cstring>
3
4 #include <boost/test/unit_test.hpp>
5
6 #include <openssl/ssl.h>
7 #include <openssl/err.h>
8
9 #include "io/bios.h"
10 #include "io/opensslBIO.h"
11 #include "io/slipBio.h"
12
13 class OpensslBIOVector : public OpensslBIO {
14 private:
15     std::vector<std::vector<char>> input;
16     std::vector<std::vector<char>>::iterator it, end;
17
18 public:
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() ) {
21     }
22
23     int write( const char* buf, int num );
24     int read( char* buf, int size );
25     long ctrl( int cmod, long arg1, void* arg2 );
26
27     static const char* getName();
28 };
29
30 int OpensslBIOVector::write( const char* buf, int num ) {
31     result.push_back( std::vector<char>( buf, buf + num ) );
32     return num;
33 }
34
35 int OpensslBIOVector::read( char* buf, int size ) {
36     if( it == end ) {
37         return -1;
38     }
39
40     if( ( unsigned int ) size < it->size() ) {
41         throw "Error, to small buffer";
42     }
43
44     std::copy( it->begin(), it->end(), buf );
45     auto result = it->size();
46     ++it;
47     return result;
48 }
49
50 long OpensslBIOVector::ctrl( int cmod, long arg1, void* arg2 ) {
51     ( void ) cmod;
52     ( void ) arg1;
53     ( void ) arg2;
54     return 0;
55 }
56
57 const char* OpensslBIOVector::getName() {
58     return "dummyBIO";
59 }
60
61 BOOST_AUTO_TEST_SUITE( TestSLIPBioWrapper )
62
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}};
65
66     OpensslBIOVector* data = new OpensslBIOVector( source );
67
68     char buf[4096];
69
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 );
75     }
76
77     BOOST_CHECK_EQUAL( data->read( buf, sizeof( buf ) ), -1 );
78
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() );
81     }
82
83     delete data;
84 }
85
86 BOOST_AUTO_TEST_CASE( TestSLIP ) {
87     std::vector<std::vector<char>> source = { {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 ) );
89     char buf[4096];
90     SlipBIO* slip = new SlipBIO( data );
91     int res = slip->read( buf, sizeof( buf ) );
92     BOOST_CHECK_EQUAL( res, 5 );
93     res = slip->read( buf, sizeof( buf ) );
94     BOOST_CHECK_EQUAL( res, 1 );
95     res = slip->read( buf, sizeof( buf ) );
96     BOOST_CHECK_EQUAL( res, 2 );
97
98     res = slip->read( buf, sizeof( buf ) );
99     BOOST_CHECK_EQUAL( res, 2 );
100     char res2[] = {1, ( char ) 0xc0};
101     BOOST_CHECK_EQUAL_COLLECTIONS( buf, buf + 2, res2, res2 + 2 );
102
103     res = slip->read( buf, sizeof( buf ) );
104     BOOST_CHECK_EQUAL( res, 2 );
105     char res3[] = {( char ) 0xdb, 2};
106     BOOST_CHECK_EQUAL_COLLECTIONS( buf, buf + 2, res3, res3 + 2 );
107     delete slip;
108 }
109
110 BOOST_AUTO_TEST_CASE( TestSSLThroughSLIP ) {
111     BIO* bio1, *bio2;
112     BOOST_REQUIRE_EQUAL( BIO_new_bio_pair( &bio1, 8096, &bio2, 8096 ), 1 );
113     BIO* slip1 = BIO_new( toBio<SlipBIO>() );
114     ( ( SlipBIO* )slip1->ptr )->setTarget( std::shared_ptr<OpensslBIO>( new OpensslBIOWrapper( std::shared_ptr<BIO>( bio1, BIO_free ) ) ) );
115     BIO* slip2 = BIO_new( toBio<SlipBIO>() );
116     ( ( SlipBIO* )slip2->ptr )->setTarget( std::shared_ptr<OpensslBIO>( new OpensslBIOWrapper( std::shared_ptr<BIO>( bio2, BIO_free ) ) ) );
117
118     auto meth = TLSv1_method();
119     auto c_ctx = SSL_CTX_new( meth );
120     auto s_ctx = SSL_CTX_new( meth );
121     //SSL_CTX_set_cipher_list(c_ctx, "ALL");
122     //SSL_CTX_set_cipher_list(s_ctx, "ALL");
123     SSL_CTX_use_certificate_file( s_ctx, "testdata/server.crt", SSL_FILETYPE_PEM );
124     SSL_CTX_use_PrivateKey_file( s_ctx, "testdata/server.key", SSL_FILETYPE_PEM );
125     auto c_ssl = SSL_new( c_ctx );
126     auto s_ssl = SSL_new( s_ctx );
127     auto c_bio = BIO_new( BIO_f_ssl() );
128     auto s_bio = BIO_new( BIO_f_ssl() );
129     SSL_set_connect_state( c_ssl );
130     SSL_set_bio( c_ssl, slip1, slip1 );
131     BIO_set_ssl( c_bio, c_ssl, BIO_NOCLOSE );
132
133     SSL_set_accept_state( s_ssl );
134     SSL_set_bio( s_ssl, slip2, slip2 );
135     BIO_set_ssl( s_bio, s_ssl, BIO_NOCLOSE );
136
137     char data[] = {1, 2, 3, 4, 5};
138     char data2[5];
139     //ERR_load_SSL_strings();
140     //ERR_load_crypto_strings();
141
142     int res = BIO_write( c_bio, data, 5 );
143     BOOST_CHECK_EQUAL( res, -1 );
144     res = BIO_read( s_bio, data2, sizeof( data2 ) );
145     BOOST_CHECK_EQUAL( res, -1 );
146
147     res = BIO_write( c_bio, data, 5 );
148     BOOST_CHECK_EQUAL( res, -1 );
149
150     res = BIO_read( s_bio, data2, sizeof( data2 ) );
151     BOOST_CHECK_EQUAL( res, -1 );
152     res = BIO_write( c_bio, data, 5 );
153     BOOST_CHECK_EQUAL( res, 5 );
154     res = BIO_read( s_bio, data2, sizeof( data2 ) );
155     BOOST_CHECK_EQUAL( res, 5 );
156     BOOST_CHECK_EQUAL_COLLECTIONS( data, data + 5, data2, data2 + 5 );
157
158     BIO_free( c_bio );
159     BIO_free( s_bio );
160
161     BIO_free( slip1 );
162     BIO_free( slip2 );
163     SSL_free( c_ssl );
164     SSL_free( s_ssl );
165
166     SSL_CTX_free( c_ctx );
167     SSL_CTX_free( s_ctx );
168 }
169
170 BOOST_AUTO_TEST_SUITE_END()