X-Git-Url: https://code.wpia.club/?a=blobdiff_plain;f=src%2FrecordHandler.cpp;h=98991da454c08dc4a430dd9991dbb66f60540f41;hb=c3f5775ce88f4df732e5e803dab70ce395c5f504;hp=9edd6834fc8a93d40e6fd5c66d7d9cca62571041;hpb=e0272f77eded433ba3593621d84dc0b3e47f4098;p=cassiopeia.git diff --git a/src/recordHandler.cpp b/src/recordHandler.cpp index 9edd683..98991da 100644 --- a/src/recordHandler.cpp +++ b/src/recordHandler.cpp @@ -1,11 +1,11 @@ #include "recordHandler.h" -#include -#include #include #include #include #include +#include +#include #include @@ -14,9 +14,13 @@ #include "database.h" #include "record.h" #include "opensslBIO.h" +#include "remoteSigner.h" #include "simpleOpensslSigner.h" +#include "sslUtil.h" #include "slipBio.h" +extern std::vector profiles; + class RecordHandlerSession { public: uint32_t sessid; @@ -31,16 +35,20 @@ public: DefaultRecordHandler* parent; std::shared_ptr signer; - RecordHandlerSession( DefaultRecordHandler* parent, std::shared_ptr signer, std::shared_ptr ctx, BIO* output ) : + RecordHandlerSession( DefaultRecordHandler* parent, std::shared_ptr signer, std::shared_ptr ctx, std::shared_ptr output ) : tbs( new TBSCertificate() ) { this->parent = parent; this->signer = signer; ssl = SSL_new( ctx.get() ); - 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 ); + std::shared_ptr bio( + BIO_new( BIO_f_ssl() ), + [output]( BIO * p ) { + BIO_free( p ); + } ); + SSL_set_accept_state( ssl ); + SSL_set_bio( ssl, output.get(), output.get() ); + BIO_set_ssl( bio.get(), ssl, BIO_NOCLOSE ); io = std::shared_ptr( new OpensslBIOWrapper( bio ) ); } @@ -54,8 +62,11 @@ public: } void work() { + std::cout << "done" << std::endl; std::vector buffer( 2048, 0 ); + std::cout << "reading" << std::endl; int res = io->read( buffer.data(), buffer.capacity() ); + std::cout << "read" << std::endl; if( res <= 0 ) { parent->reset(); @@ -88,7 +99,7 @@ public: break; case RecordHeader::SignerCommand::SET_SIGNATURE_TYPE: - tbs->md = "sha256"; // TODO use content ;-) + tbs->md = data; break; case RecordHeader::SignerCommand::SET_PROFILE: @@ -146,14 +157,12 @@ public: } }; -DefaultRecordHandler::DefaultRecordHandler( std::shared_ptr signer, BIO* bio ) : +DefaultRecordHandler::DefaultRecordHandler( std::shared_ptr signer, std::shared_ptr bio ) : currentSession() { this->signer = signer; - ctx = std::shared_ptr( SSL_CTX_new( TLSv1_method() ), SSL_CTX_free ); - SSL_CTX_use_certificate_file( ctx.get(), "testdata/server.crt", SSL_FILETYPE_PEM ); - SSL_CTX_use_PrivateKey_file( ctx.get(), "testdata/server.key", SSL_FILETYPE_PEM ); + ctx = generateSSLContext( true ); this->bio = bio; } @@ -168,39 +177,15 @@ void DefaultRecordHandler::handle() { currentSession = std::shared_ptr( new RecordHandlerSession( this, signer, ctx, bio ) ); } + std::cout << "really allocated: " << currentSession << ";" << std::endl; 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::shared_ptr bio( new OpensslBIOWrapper( std::shared_ptr( BIO_new_fd( 0, 0 ), BIO_free ) ) ); std::string data = "-----BEGIN CERTIFICATE REQUEST-----\n" "MIIBSzCBtQIBADAMMQowCAYDVQQDDAFhMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCB\n" @@ -211,69 +196,49 @@ int handlermain( int argc, const char* argv[] ) { "/f49zIcVtUJuZuEwY6uDZQqfAm+8CLNpOCICH/Qw7YOe+s/Yw7a8rk5VqLtgxR4M\n" "z6DUeVL0zYFoLUxIje9yDU3pWmPvyVaBPdo0DguZwFMfiWwzhkUDeQgyeaiMvQA=\n" "-----END CERTIFICATE REQUEST-----"; + RecordHeader head; head.flags = 0; head.sessid = 13; //--- - SSL_library_init(); + std::shared_ptr ssl_lib = ssl_lib_ref; 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() ); + std::shared_ptr b = openSerial( "/dev/ttyUSB0" ); + std::shared_ptr slip1( BIO_new( toBio() ), BIO_free ); ( ( 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; - + std::shared_ptr sign( new RemoteSigner( slip1, generateSSLContext( false ) ) ); + + std::shared_ptr cert( new TBSCertificate() ); + cert->csr_type = "csr"; + cert->csr_content = data; + cert->md = "sha256"; + cert->profile = "1"; + std::shared_ptr ava( new AVA() ); + ava->name = "CN"; + ava->value = "Dummy user certificates"; + cert->AVAs.push_back( ava ); + std::shared_ptr san( new SAN() ); + san->type = "DNS"; + san->content = "n42.example.com"; + cert->SANs.push_back( san ); + + auto res = sign->sign( cert ); + std::cout << "log: " << res->log << std::endl; + std::cout << "cert things: " << res->certificate << std::endl; return 0; } - FILE* f = fopen( "/dev/ttyS0", "r+" ); + std::shared_ptr conn = openSerial( "/dev/ttyS0" ); + std::shared_ptr slip1( BIO_new( toBio() ), BIO_free ); - 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 { + DefaultRecordHandler* dh = new DefaultRecordHandler( std::shared_ptr( new SimpleOpensslSigner( profiles[0] ) ), slip1 ); + while( true ) { dh->handle(); }