]> WPIA git - cassiopeia.git/commitdiff
add: Plug things together so we can have TBSCertificates from the database
authorFelix Dörre <felix@dogcraft.de>
Wed, 24 Dec 2014 01:00:15 +0000 (02:00 +0100)
committerBenny Baumann <BenBE@geshi.org>
Sat, 24 Jan 2015 17:08:32 +0000 (18:08 +0100)
src/main.cpp
src/recordHandler.cpp
src/remoteSigner.cpp
src/simpleOpensslSigner.cpp
src/slipBio.cpp
src/sslUtil.cpp [new file with mode: 0644]
src/sslUtil.h [new file with mode: 0644]

index 072547de31f39f8616b5e4b29440fdfb9462886a..08008aba4ad0811f9f2ebc157bb2068f00ab603e 100644 (file)
@@ -9,6 +9,10 @@
 #include "mysql.h"
 #include "simpleOpensslSigner.h"
 #include "util.h"
+#include "bios.h"
+#include "slipBio.h"
+#include "remoteSigner.h"
+#include "sslUtil.h"
 
 #ifdef NO_DAEMON
 #define DAEMON false
@@ -33,17 +37,7 @@ 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;
-    bool once = false;
-
-    if( argc == 2 && std::string( "--once" ) == std::string( argv[1] ) ) {
-        once = true;
-    }
-
+int parseConfig() {
     std::ifstream config;
 
     if( DAEMON ) {
@@ -121,10 +115,35 @@ int main( int argc, const char* argv[] ) {
     }
 
     config.close();
-    return handlermain( argc, argv );
+
+    return 0;
+}
+
+int handlermain( int argc, const char* argv[] );
+
+int main( int argc, const char* argv[] ) {
+    ( void ) argc;
+    ( void ) argv;
+    bool once = false;
+
+    if( argc == 2 && std::string( "--once" ) == std::string( argv[1] ) ) {
+        once = true;
+    }
+
+    if( parseConfig() != 0 ) {
+        return -1;
+    }
+
+    if( argc == 0 ) {
+        return handlermain( argc, argv );
+    }
 
     std::shared_ptr<JobProvider> jp( new MySQLJobProvider( sqlHost, sqlUser, sqlPass, sqlDB ) );
-    std::shared_ptr<Signer> sign( new SimpleOpensslSigner() );
+    std::shared_ptr<BIO> b = openSerial( "/dev/ttyUSB0" );
+    std::shared_ptr<BIO> slip1( BIO_new( toBio<SlipBIO>() ), BIO_free );
+    ( ( SlipBIO* )slip1->ptr )->setTarget( std::shared_ptr<OpensslBIO>( new OpensslBIOWrapper( b ) ) );
+    std::shared_ptr<RemoteSigner> sign( new RemoteSigner( slip1, generateSSLContext( false ) ) );
+    // std::shared_ptr<Signer> sign( new SimpleOpensslSigner() );
 
     while( true ) {
         std::shared_ptr<Job> job = jp->fetchJob();
@@ -146,11 +165,14 @@ int main( int argc, const char* argv[] ) {
 
                 std::cout << "Found a CSR at '" << cert->csr << "' signing" << std::endl;
                 cert->csr_content = readFile( cert->csr );
+                std::cout << cert->csr_content << " content " << std::endl;
 
                 std::shared_ptr<SignedCertificate> res = sign->sign( cert );
+                std::cout << "did it!" << res->certificate << std::endl;
                 std::string fn = writeBackFile( atoi( job->target.c_str() ), res->certificate );
                 res->crt_name = fn;
                 jp->writeBack( job, res );
+                std::cout << "wrote back" << std::endl;
             } catch( const char* c ) {
                 std::cerr << "ERROR: " << c << std::endl;
                 return 2;
index 99428727bab890afcdb845ea887148d2ac14045c..0f6457217a81f6b2fe687b606ba3d66289f68825 100644 (file)
 #include "opensslBIO.h"
 #include "remoteSigner.h"
 #include "simpleOpensslSigner.h"
+#include "sslUtil.h"
 #include "slipBio.h"
 
-int gencb( int a, int b, BN_GENCB* g ) {
-    ( void ) a;
-    ( void ) b;
-    ( void ) g;
-
-    std::cout << ( a == 0 ? "." : "+" ) << std::flush;
-
-    return 1;
-}
-
-static int verify_callback( int preverify_ok, X509_STORE_CTX* ctx ) {
-    if( !preverify_ok ) {
-        std::cout << "Verification failed: " << preverify_ok << " because " << X509_STORE_CTX_get_error( ctx ) << std::endl;
-    }
-
-    return preverify_ok;
-}
-
-static std::shared_ptr<DH> dh_param;
-
-std::shared_ptr<SSL_CTX> generateSSLContext( bool server ) {
-    std::shared_ptr<SSL_CTX> ctx = std::shared_ptr<SSL_CTX>(
-        SSL_CTX_new( TLSv1_2_method() ),
-        []( SSL_CTX * p ) {
-            SSL_CTX_free( p );
-        } );
-
-    if( !SSL_CTX_set_cipher_list( ctx.get(), "HIGH:+CAMELLIA256:!eNull:!aNULL:!ADH:!MD5:-RSA+AES+SHA1:!RC4:!DES:!3DES:!SEED:!EXP:!AES128:!CAMELLIA128" ) ) {
-        throw "Cannot set cipher list. Your source is broken.";
-    }
-
-    SSL_CTX_set_verify( ctx.get(), SSL_VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT, verify_callback );
-    SSL_CTX_use_certificate_file( ctx.get(), server ? "keys/signer_server.crt" : "keys/signer_client.crt", SSL_FILETYPE_PEM );
-    SSL_CTX_use_PrivateKey_file( ctx.get(), server ? "keys/signer_server.key" : "keys/signer_client.key", SSL_FILETYPE_PEM );
-    SSL_CTX_load_verify_locations( ctx.get(), "keys/env.crt", 0 );
-
-    if( server ) {
-        STACK_OF( X509_NAME ) *names = SSL_load_client_CA_file( "keys/env.crt" );
-
-        if( names ) {
-            SSL_CTX_set_client_CA_list( ctx.get(), names );
-        } else {
-            // error
-        }
-
-        if( !dh_param ) {
-            FILE* paramfile = fopen( "dh_param.pem", "r" );
-
-            if( paramfile ) {
-                dh_param = std::shared_ptr<DH>( PEM_read_DHparams( paramfile, NULL, NULL, NULL ), DH_free );
-                fclose( paramfile );
-            } else {
-                dh_param = std::shared_ptr<DH>( DH_new(), DH_free );
-                std::cout << "Generating DH params" << std::endl;
-                BN_GENCB cb;
-                cb.ver = 2;
-                cb.arg = 0;
-                cb.cb.cb_2 = gencb;
-
-                if( !DH_generate_parameters_ex( dh_param.get(), 2048, 5, &cb ) ) {
-                    throw "DH generation failed";
-                }
-
-                std::cout << std::endl;
-                paramfile = fopen( "dh_param.pem", "w" );
-
-                if( paramfile ) {
-                    PEM_write_DHparams( paramfile, dh_param.get() );
-                    fclose( paramfile );
-                }
-            }
-        }
-
-        if( !SSL_CTX_set_tmp_dh( ctx.get(), dh_param.get() ) ) {
-            throw "Cannot set tmp dh.";
-        }
-    }
-
-    return ctx;
-}
-
 class RecordHandlerSession {
 public:
     uint32_t sessid;
@@ -119,9 +39,11 @@ public:
         this->signer = signer;
 
         ssl = SSL_new( ctx.get() );
-        std::shared_ptr<BIO> bio( BIO_new( BIO_f_ssl() ), [output]( BIO * p ) {
-            BIO_free( p );
-        } );
+        std::shared_ptr<BIO> 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 );
@@ -257,27 +179,6 @@ void DefaultRecordHandler::handle() {
     currentSession->work();
 }
 
-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;
-
-    cfsetispeed( &attr, B115200 );
-    cfsetospeed( &attr, B115200 );
-
-    if( tcsetattr( fileno( f ), TCSANOW, &attr ) ) {
-        throw "failed to get attrs";
-    }
-}
-
 int handlermain( int argc, const char* argv[] ) {
     ( void ) argc;
     ( void ) argv;
@@ -300,24 +201,14 @@ int handlermain( int argc, const char* argv[] ) {
 
     //---
 
-    SSL_library_init();
+    std::shared_ptr<int> 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 );
-
-        std::shared_ptr<BIO> b( BIO_new_fd( fileno( f ), 0 ), BIO_free );
+        std::shared_ptr<BIO> b = openSerial( "/dev/ttyUSB0" );
         std::shared_ptr<BIO> slip1( BIO_new( toBio<SlipBIO>() ), BIO_free );
         ( ( SlipBIO* )slip1->ptr )->setTarget( std::shared_ptr<OpensslBIO>( new OpensslBIOWrapper( b ) ) );
-        std::cout << "Initing tlsv1_2" << std::endl;
-        std::shared_ptr<SSL_CTX> ctx = generateSSLContext( false );
-        std::shared_ptr<RemoteSigner> sign( new RemoteSigner( slip1, ctx ) );
+        std::shared_ptr<RemoteSigner> sign( new RemoteSigner( slip1, generateSSLContext( false ) ) );
+
         std::shared_ptr<TBSCertificate> cert( new TBSCertificate() );
         cert->csr_type = "csr";
         cert->csr_content = data;
@@ -338,16 +229,7 @@ int handlermain( int argc, const char* argv[] ) {
         return 0;
     }
 
-    FILE* f = fopen( "/dev/ttyS0", "r+" );
-
-    if( !f ) {
-        std::cout << "Opening /dev/ttyS0 bio failed" << std::endl;
-        return -1;
-    }
-
-    setupSerial( f );
-
-    std::shared_ptr<BIO> conn( BIO_new_fd( fileno( f ), 0 ), BIO_free );
+    std::shared_ptr<BIO> conn = openSerial( "/dev/ttyS0" );
     std::shared_ptr<BIO> slip1( BIO_new( toBio<SlipBIO>() ), BIO_free );
 
     ( ( SlipBIO* )slip1->ptr )->setTarget( std::shared_ptr<OpensslBIO>( new OpensslBIOWrapper( conn ) ) );
index 3415dcf2427b23cc73edc73664c27fec432e5261..5d049034b5dc59e9511bb87596f9a2b1324a2f60 100644 (file)
@@ -28,7 +28,7 @@ std::shared_ptr<SignedCertificate> RemoteSigner::sign( std::shared_ptr<TBSCertif
     head.flags = 0;
     head.sessid = 13;
 
-    if( cert->csr_type == "csr" ) {
+    if( cert->csr_type == "CSR" ) {
         send( conn, head, RecordHeader::SignerCommand::SET_CSR, cert->csr_content );
     } else {
         std::cout << "Unknown csr_type: " << cert->csr_type;
index 0096d5ec0457f67ca4f42058fbb8778124753254..ac688e28952cd9d0a21691e843f8d5bbb1503aad 100644 (file)
 
 #include "X509.h"
 #include "util.h"
+#include "sslUtil.h"
 
 extern std::vector<Profile> profiles;
 
-std::shared_ptr<int> SimpleOpensslSigner::lib_ref(
-    new int( SSL_library_init() ),
-    []( int* ref ) {
-        delete ref;
-
-        EVP_cleanup();
-        CRYPTO_cleanup_all_ex_data();
-    } );
+std::shared_ptr<int> SimpleOpensslSigner::lib_ref = ssl_lib_ref;
 
 std::shared_ptr<X509> loadX509FromFile( std::string filename ) {
     FILE* f = fopen( filename.c_str(), "r" );
index ced5a6fb4639a6a6dafbcacb96b4055f993e4136..6fe1ec19f74b93ef371bd4b06e4bce88bb38e08a 100644 (file)
@@ -4,6 +4,8 @@
 
 #include <unistd.h>
 
+#define BUFFER_SIZE 8192
+
 char hexDigit( char c ) {
     if( c < 0 ) {
         return 'x';
@@ -33,7 +35,7 @@ std::string toHex( const char* buf, int len ) {
 }
 
 SlipBIO::SlipBIO() {
-    this->buffer = std::vector<char>( 4096 );
+    this->buffer = std::vector<char>( BUFFER_SIZE );
     this->decodeTarget = 0;
     this->decodePos = 0;
     this->rawPos = 0;
@@ -47,7 +49,7 @@ void SlipBIO::setTarget( std::shared_ptr<OpensslBIO> target ) {
 SlipBIO::SlipBIO( std::shared_ptr<OpensslBIO> target ) {
     this->target = target;
 
-    this->buffer = std::vector<char>( 4096 );
+    this->buffer = std::vector<char>( BUFFER_SIZE );
     this->decodeTarget = 0;
     this->decodePos = 0;
     this->rawPos = 0;
@@ -58,6 +60,7 @@ SlipBIO::SlipBIO( std::shared_ptr<OpensslBIO> target ) {
 SlipBIO::~SlipBIO() {}
 
 int SlipBIO::write( const char* buf, int num ) {
+    std::cout << "Out: " << toHex( buf, num ) << std::endl;
     int badOnes = 0;
 
     for( int i = 0; i < num; i++ ) {
diff --git a/src/sslUtil.cpp b/src/sslUtil.cpp
new file mode 100644 (file)
index 0000000..2a9de59
--- /dev/null
@@ -0,0 +1,133 @@
+#include "sslUtil.h"
+
+#include <sys/types.h>
+#include <termios.h>
+#include <unistd.h>
+#include <iostream>
+
+std::shared_ptr<int> ssl_lib_ref(
+    new int( SSL_library_init() ),
+    []( int* ref ) {
+        delete ref;
+
+        EVP_cleanup();
+        CRYPTO_cleanup_all_ex_data();
+    } );
+
+int gencb( int a, int b, BN_GENCB* g ) {
+    ( void ) a;
+    ( void ) b;
+    ( void ) g;
+    std::cout << ( a == 0 ? "." : "+" ) << std::flush;
+    return 1;
+}
+
+static int verify_callback( int preverify_ok, X509_STORE_CTX* ctx ) {
+    if( !preverify_ok ) {
+        //auto cert = X509_STORE_CTX_get_current_cert(ctx);
+        //BIO *o = BIO_new_fp(stdout,BIO_NOCLOSE);
+        //X509_print_ex(o, cert, XN_FLAG_COMPAT, X509_FLAG_COMPAT);
+        //BIO_free(o);
+
+        std::cout << "Verification failed: " << preverify_ok << " because " << X509_STORE_CTX_get_error( ctx ) << std::endl;
+    }
+
+    return preverify_ok;
+}
+
+static std::shared_ptr<DH> dh_param;
+
+std::shared_ptr<SSL_CTX> generateSSLContext( bool server ) {
+    std::shared_ptr<SSL_CTX> ctx = std::shared_ptr<SSL_CTX>( SSL_CTX_new( TLSv1_2_method() ), []( SSL_CTX * p ) {
+        SSL_CTX_free( p );
+    } );
+
+    if( !SSL_CTX_set_cipher_list( ctx.get(), "HIGH:+CAMELLIA256:!eNull:!aNULL:!ADH:!MD5:-RSA+AES+SHA1:!RC4:!DES:!3DES:!SEED:!EXP:!AES128:!CAMELLIA128" ) ) {
+        throw "Cannot set cipher list. Your source is broken.";
+    }
+
+    SSL_CTX_set_verify( ctx.get(), SSL_VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT, verify_callback );
+    SSL_CTX_use_certificate_file( ctx.get(), server ? "keys/signer_server.crt" : "keys/signer_client.crt", SSL_FILETYPE_PEM );
+    SSL_CTX_use_PrivateKey_file( ctx.get(), server ? "keys/signer_server.key" : "keys/signer_client.key", SSL_FILETYPE_PEM );
+    SSL_CTX_load_verify_locations( ctx.get(), "keys/ca.crt", 0 );
+
+    if( server ) {
+        STACK_OF( X509_NAME ) *names = SSL_load_client_CA_file( "keys/env.crt" );
+
+        if( names ) {
+            SSL_CTX_set_client_CA_list( ctx.get(), names );
+        } else {
+            // error
+        }
+
+        if( !dh_param ) {
+            FILE* paramfile = fopen( "dh_param.pem", "r" );
+
+            if( paramfile ) {
+                dh_param = std::shared_ptr<DH>( PEM_read_DHparams( paramfile, NULL, NULL, NULL ), DH_free );
+                fclose( paramfile );
+            } else {
+                dh_param = std::shared_ptr<DH>( DH_new(), DH_free );
+                std::cout << "Generating DH params" << std::endl;
+                BN_GENCB cb;
+                cb.ver = 2;
+                cb.arg = 0;
+                cb.cb.cb_2 = gencb;
+
+                if( !DH_generate_parameters_ex( dh_param.get(), 2048, 5, &cb ) ) {
+                    throw "DH generation failed";
+                }
+
+                std::cout << std::endl;
+                paramfile = fopen( "dh_param.pem", "w" );
+
+                if( paramfile ) {
+                    PEM_write_DHparams( paramfile, dh_param.get() );
+                    fclose( paramfile );
+                }
+            }
+        }
+
+        if( !SSL_CTX_set_tmp_dh( ctx.get(), dh_param.get() ) ) {
+            throw "Cannot set tmp dh.";
+        }
+    }
+
+    return ctx;
+}
+
+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;
+
+    cfsetispeed( &attr, B115200 );
+    cfsetospeed( &attr, B115200 );
+
+    if( tcsetattr( fileno( f ), TCSANOW, &attr ) ) {
+        throw "failed to get attrs";
+    }
+}
+
+std::shared_ptr<BIO> openSerial( const char* name ) {
+    FILE* f = fopen( name, "r+" );
+
+    if( !f ) {
+        std::cout << "Opening serial device failed" << std::endl;
+        return std::shared_ptr<BIO>();
+    }
+
+    setupSerial( f );
+
+    std::shared_ptr<BIO> b( BIO_new_fd( fileno( f ), 0 ), BIO_free );
+    return b;
+}
diff --git a/src/sslUtil.h b/src/sslUtil.h
new file mode 100644 (file)
index 0000000..3e4a277
--- /dev/null
@@ -0,0 +1,8 @@
+#pragma once
+#include <openssl/ssl.h>
+#include <memory>
+
+extern std::shared_ptr<int> ssl_lib_ref;
+
+std::shared_ptr<SSL_CTX> generateSSLContext( bool server );
+std::shared_ptr<BIO> openSerial( const char* name );