From e0272f77eded433ba3593621d84dc0b3e47f4098 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Felix=20D=C3=B6rre?= Date: Fri, 19 Dec 2014 16:09:16 +0100 Subject: [PATCH] add: sample communication over serial line --- src/main.cpp | 3 + src/recordHandler.cpp | 131 ++++++++++++++++++++++++++++++++++++++++-- src/slipBio.cpp | 24 +++++++- 3 files changed, 151 insertions(+), 7 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index f4c98a7..072547d 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -33,6 +33,8 @@ std::string writeBackFile( uint32_t serial, std::string cert ) { return filename; } +int handlermain( int argc, const char* argv[] ); + int main( int argc, const char* argv[] ) { ( void ) argc; ( void ) argv; @@ -119,6 +121,7 @@ int main( int argc, const char* argv[] ) { } config.close(); + return handlermain( argc, argv ); std::shared_ptr jp( new MySQLJobProvider( sqlHost, sqlUser, sqlPass, sqlDB ) ); std::shared_ptr sign( new SimpleOpensslSigner() ); diff --git a/src/recordHandler.cpp b/src/recordHandler.cpp index c9949a4..9edd683 100644 --- a/src/recordHandler.cpp +++ b/src/recordHandler.cpp @@ -1,5 +1,12 @@ #include "recordHandler.h" +#include +#include +#include +#include +#include +#include + #include #include @@ -7,6 +14,8 @@ #include "database.h" #include "record.h" #include "opensslBIO.h" +#include "simpleOpensslSigner.h" +#include "slipBio.h" class RecordHandlerSession { public: @@ -28,10 +37,10 @@ public: this->signer = signer; ssl = SSL_new( ctx.get() ); - BIO* bio = BIO_new( BIO_f_ssl() ); - SSL_set_accept_state( ssl ); - SSL_set_bio( ssl, output, output ); - BIO_set_ssl( bio, ssl, BIO_NOCLOSE ); + BIO* bio = output;//BIO_new( BIO_f_ssl() ); + //SSL_set_accept_state( ssl ); + //SSL_set_bio( ssl, output, output ); + //BIO_set_ssl( bio, ssl, BIO_NOCLOSE ); io = std::shared_ptr( new OpensslBIOWrapper( bio ) ); } @@ -155,8 +164,122 @@ void DefaultRecordHandler::reset() { void DefaultRecordHandler::handle() { if( !currentSession ) { + std::cout << "session allocated" << std::endl; currentSession = std::shared_ptr( new RecordHandlerSession( this, signer, ctx, bio ) ); } currentSession->work(); } + +int count = 0; +void send( std::shared_ptr bio, RecordHeader& head, RecordHeader::SignerCommand cmd, std::string data ) { + head.command = ( uint16_t ) cmd; + head.command_count++; + head.totalLength = data.size(); + sendCommand( head, data, bio ); +} + +void setupSerial( FILE* f ) { + struct termios attr; + + if( tcgetattr( fileno( f ), &attr ) ) { + throw "failed to get attrs"; + } + + attr.c_iflag &= ~( IGNBRK | BRKINT | PARMRK | ISTRIP | INLCR | IGNCR | ICRNL | IXON ); + attr.c_oflag &= ~OPOST; + attr.c_lflag &= ~( ECHO | ECHONL | ICANON | ISIG | IEXTEN ); + attr.c_cflag &= ~( CSIZE | PARENB ); + attr.c_cflag |= CS8; + + if( tcsetattr( fileno( f ), TCSANOW, &attr ) ) { + throw "failed to get attrs"; + } +} + +int handlermain( int argc, const char* argv[] ) { + ( void ) argc; + ( void ) argv; + std::shared_ptr bio( new OpensslBIOWrapper( BIO_new_fd( 0, 0 ) ) ); + std::string data = + "-----BEGIN CERTIFICATE REQUEST-----\n" + "MIIBSzCBtQIBADAMMQowCAYDVQQDDAFhMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCB\n" + "iQKBgQDerBEpIShJlx3zzl4AOS1NcwEg4iAWknQeTtI8B5dnk+l5HkOdTxqeehZn\n" + "iZnuIuYXA+JWmoECg/w69+N5zw2BabelgK3cSvRqycwPEU/gceGJZTaBfkkN0hBk\n" + "rpXDiLSlox5oeR150MrsHvVc+W2e+0jW1tuhz4QLzn8/uI/toQIDAQABoAAwDQYJ\n" + "KoZIhvcNAQELBQADgYEATQU5VrgQAkvpCvIwRUyjj9YAa9E014tNY0jMcBdv95fy\n" + "/f49zIcVtUJuZuEwY6uDZQqfAm+8CLNpOCICH/Qw7YOe+s/Yw7a8rk5VqLtgxR4M\n" + "z6DUeVL0zYFoLUxIje9yDU3pWmPvyVaBPdo0DguZwFMfiWwzhkUDeQgyeaiMvQA=\n" + "-----END CERTIFICATE REQUEST-----"; + RecordHeader head; + head.flags = 0; + head.sessid = 13; + + //--- + + SSL_library_init(); + + if( argc >= 2 ) { + FILE* f = fopen( "/dev/ttyUSB0", "r+" ); + + if( !f ) { + std::cout << "Opening /dev/ttyUSB0 bio failed" << std::endl; + return -1; + } + + setupSerial( f ); + + BIO* b = BIO_new_fd( fileno( f ), 0 ); + BIO* slip1 = BIO_new( toBio() ); + ( ( SlipBIO* )slip1->ptr )->setTarget( std::shared_ptr( new OpensslBIOWrapper( b ) ) ); + std::shared_ptr conn( new OpensslBIOWrapper( slip1 ) ); + send( conn, head, RecordHeader::SignerCommand::SET_CSR, data ); + send( conn, head, RecordHeader::SignerCommand::SET_SIGNATURE_TYPE, "sha256" ); + send( conn, head, RecordHeader::SignerCommand::SET_PROFILE, "1" ); + send( conn, head, RecordHeader::SignerCommand::ADD_AVA, "CN,commonName" ); + send( conn, head, RecordHeader::SignerCommand::ADD_SAN, "DNS,*.example.com" ); + send( conn, head, RecordHeader::SignerCommand::SIGN, "" ); + send( conn, head, RecordHeader::SignerCommand::LOG_SAVED, "" ); + std::vector buffer( 2048 * 4 ); + + for( int i = 0; i < 2; i++ ) { + try { + int length = BIO_read( slip1, buffer.data(), buffer.size() ); + RecordHeader head; + std::string payload = parseCommand( head, std::string( buffer.data(), length ) ); + std::cout << "Data: " << std::endl << payload << std::endl; + } catch( const char* msg ) { + std::cout << msg << std::endl; + return -1; + } + } + + std::cout << "sent things" << std::endl; + + return 0; + } + + FILE* f = fopen( "/dev/ttyS0", "r+" ); + + if( !f ) { + std::cout << "Opening /dev/ttyS0 bio failed" << std::endl; + return -1; + } + + setupSerial( f ); + + BIO* conn = BIO_new_fd( fileno( f ), 0 ); + BIO* slip1 = BIO_new( toBio() ); + ( ( SlipBIO* )slip1->ptr )->setTarget( std::shared_ptr( new OpensslBIOWrapper( conn ) ) ); + DefaultRecordHandler* dh = new DefaultRecordHandler( std::shared_ptr( new SimpleOpensslSigner() ), slip1 ); + + try { + while( true ) { + dh->handle(); + } + } catch( char const* ch ) { + std::cout << "Exception: " << ch << std::endl; + } + + return 0; +} diff --git a/src/slipBio.cpp b/src/slipBio.cpp index f796341..5baae77 100644 --- a/src/slipBio.cpp +++ b/src/slipBio.cpp @@ -2,6 +2,8 @@ #include +#include + char hexDigit( char c ) { if( c < 0 ) { return 'x'; @@ -92,10 +94,25 @@ int SlipBIO::write( const char* buf, int num ) { } targetPtr[j++] = ( char )0xC0; + int sent = 0; + + while( sent < j ) { + + errno = 0; + int dlen = target->write( targetPtr + sent, std::min( 1024, j - sent ) ); + + if( dlen < 0 ) { + throw "Error, target write failed"; + } else if( dlen == 0 ) { + // sleep + usleep( 50000 ); + } + + if( errno != 0 ) { + perror( "Error" ); + } - if( target->write( targetPtr, j ) != j ) { - std::cout << "sent " << j << std::endl; - throw "Error, target write failed"; + sent += dlen; } return num; @@ -143,6 +160,7 @@ long SlipBIO::ctrl( int cmod, long arg1, void* arg2 ) { ( void ) cmod; ( void ) arg1; ( void ) arg2; + std::cout << "SLIP crtl: " << cmod << std::endl; return target->ctrl( cmod, arg1, arg2 ); } -- 2.47.3