9 #include "io/opensslBIO.h"
10 #include "log/logger.hpp"
12 std::string toHexAndChecksum( const std::string& src ) {
15 ss << ':' << std::hex << std::setfill( '0' ) << std::uppercase;
18 ss << std::setw( 2 ) << ( ( ( uint32_t ) c ) & 0xFF );
22 ss << std::setw( 2 ) << ( ( ( uint32_t )( ~checksum ) ) & 0xFF );
27 void sendCommand( RecordHeader& head, const std::string& data, std::shared_ptr<OpensslBIO> bio ) {
30 logger::debugf( "Record payload length: %s", ss.str() );
31 if(data.size() > 0xFFFF){
32 logger::warn( "Data too big, need chunking" );
34 head.payloadLength = data.size();
36 s += head.packToString();
39 std::string res = toHexAndChecksum( s );
41 logger::debug( "FINE: RECORD output: ", res );
43 bio->write( res.data(), res.size() );
46 int32_t fromHexDigit( char c ) {
49 if( c >= '0' && c <= '9' ) {
53 if( c >= 'A' && c <= 'F' ) {
60 std::string parseCommand( RecordHeader& head, const std::string& input) {
61 logger::debug( "FINE: RECORD input: ", input );
63 int32_t dlen = ( input.size() - 2 ) / 2;
67 std::string str( std::max( dlen, RECORD_HEADER_SIZE ), 0 );
69 for( int i = 0; i < dlen; i++ ) {
72 digit = fromHexDigit( input[i * 2 + 1] );
76 digit = fromHexDigit( input[i * 2 + 2] );
83 head.unpackFromString( str.substr( 0, RECORD_HEADER_SIZE ) );
84 uint32_t len = head.payloadLength;
85 uint32_t expectedTotalLength = ( RECORD_HEADER_SIZE + len + 1 /*checksum*/ ) * 2 + 2;
86 std::string data = str.substr( RECORD_HEADER_SIZE, str.size() - RECORD_HEADER_SIZE );
88 if( expectedTotalLength != input.size() ) {
90 ss << "Expected: " << expectedTotalLength << ", Got: " << input.size();
91 logger::error( ss.str() );
92 throw "Error, invalid length";
94 if( checksum != -1 || error || dlen < RECORD_HEADER_SIZE ) {
95 throw "Error, invalid checksum";
104 int main( int argc, char* argv[] ) {
105 OpensslBIOWrapper *bio = new OpensslBIOWrapper(BIO_new_fd(0, 0));
106 std::string data = "halloPayload";
111 head.command_count = 0xA0B;
112 head.totalLength = 9;
113 sendCommand( head, data, std::shared_ptr<OpensslBIO>(bio) );
117 std::string c = parseCommand( head, ":0700010D0000000B0A0900000000000C0068616C6C6F5061796C6F6164E6\n" );
119 std::cout << "res: " << std::endl;
120 std::cout << head.payloadLength << std::endl;
121 std::cout << c << std::endl;
122 } catch( char const* c ) {
123 std::cout << "err: " << c << std::endl;