X-Git-Url: https://code.wpia.club/?a=blobdiff_plain;f=src%2FremoteSigner.cpp;h=18ad28a70146c1b94268cda66092368deee1b976;hb=1788c672486234375c0758cd8c1c3f7f47273adb;hp=a17f515c566078f1be6b0425fc66f0eece7a57f6;hpb=e914bd7cac4990c3596bc21956943221a8e84d9b;p=cassiopeia.git diff --git a/src/remoteSigner.cpp b/src/remoteSigner.cpp index a17f515..18ad28a 100644 --- a/src/remoteSigner.cpp +++ b/src/remoteSigner.cpp @@ -2,10 +2,14 @@ #include +#include +#include + RemoteSigner::RemoteSigner( std::shared_ptr target, std::shared_ptr ctx ) { this->target = target; this->ctx = ctx; } + RemoteSigner::~RemoteSigner() { } @@ -13,7 +17,7 @@ void RemoteSigner::send( std::shared_ptr bio, RecordHeader& h head.command = ( uint16_t ) cmd; head.command_count++; head.totalLength = data.size(); - sendCommand( head, data, bio ); + sendCommand( head, data, bio, log ); } @@ -67,12 +71,14 @@ std::shared_ptr RemoteSigner::sign( std::shared_ptrread( buffer.data(), buffer.size() ); - if( length == -1 ) { - return std::shared_ptr(); + if( length <= 0 ) { + std::cout << "Error, no response data" << std::endl; + result = std::shared_ptr(); + break; } RecordHeader head; - std::string payload = parseCommand( head, std::string( buffer.data(), length ) ); + std::string payload = parseCommand( head, std::string( buffer.data(), length ), log ); switch( ( RecordHeader::SignerResult ) head.command ) { case RecordHeader::SignerResult::CERTIFICATE: @@ -89,6 +95,37 @@ std::shared_ptr RemoteSigner::sign( std::shared_ptr bios( BIO_new( BIO_s_mem() ), BIO_free ); + const char* buf = result->certificate.data(); + unsigned int len = result->certificate.size(); + + while( len > 0 ) { + int dlen = BIO_write( bios.get(), buf, len ); + + if( dlen <= 0 ) { + throw "Memory error."; + } + + len -= dlen; + buf += dlen; + } + + std::shared_ptr pem( PEM_read_bio_X509( bios.get(), NULL, 0, NULL ) ); + + if( !pem ) { + throw "Pem was not readable"; + } + + std::shared_ptr ser( ASN1_INTEGER_to_BN( pem->cert_info->serialNumber, NULL ), BN_free ); + std::shared_ptr serStr( + BN_bn2hex( ser.get() ), + []( char* p ) { + OPENSSL_free( p ); + } ); // OPENSSL_free is a macro... + result->serial = std::string( serStr.get() ); + } + if( !SSL_shutdown( ssl.get() ) && !SSL_shutdown( ssl.get() ) ) { // need to close the connection twice std::cout << "SSL shutdown failed" << std::endl; } @@ -96,3 +133,6 @@ std::shared_ptr RemoteSigner::sign( std::shared_ptr target ) { + this->log = target; +}