]> WPIA git - cassiopeia.git/commitdiff
add: Aim for initial interoperatibility with Gigi
authorFelix Dörre <felix@dogcraft.de>
Sun, 2 Nov 2014 00:42:59 +0000 (01:42 +0100)
committerBenny Baumann <BenBE@geshi.org>
Fri, 7 Nov 2014 22:53:04 +0000 (23:53 +0100)
src/X509.cpp
src/X509.h
src/database.h
src/main.cpp
src/mysql.cpp
src/mysql.h
src/signer.h
src/simpleOpensslSigner.cpp
src/simpleOpensslSigner.h

index 5d38e3cb241547561a1336b6281fafbed2330165..0278fb907912e358be48a1f9adbd42dd4ac6d5f3 100644 (file)
@@ -92,7 +92,7 @@ void X509Cert::setSerialNumber( int num ) {
     ASN1_INTEGER_set( target.get()->cert_info->serialNumber, num );
 }
 
-void X509Cert::setTimes( long before, long after ) {
+void X509Cert::setTimes( uint32_t before, uint32_t after ) {
     X509_gmtime_adj( X509_get_notBefore( target.get() ), before );
     X509_gmtime_adj( X509_get_notAfter( target.get() ), after );
 }
@@ -172,17 +172,19 @@ void X509Cert::setExtensions( std::shared_ptr<X509> caCert, std::vector<std::sha
     X509_EXTENSION_free( ext );
 }
 
-std::string X509Cert::sign( std::shared_ptr<EVP_PKEY> caKey ) {
+std::shared_ptr<SignedCertificate> X509Cert::sign( std::shared_ptr<EVP_PKEY> caKey ) {
     if( !X509_sign( target.get(), caKey.get(), EVP_sha512() ) ) {
         throw "Signing failed.";
     }
 
-    X509_print_fp( stdout, target.get() );
+    //X509_print_fp( stdout, target.get() );
 
     std::shared_ptr<BIO> mem = std::shared_ptr<BIO>( BIO_new( BIO_s_mem() ), BIO_free );
     PEM_write_bio_X509( mem.get(), target.get() );
     BUF_MEM* buf;
     BIO_get_mem_ptr( mem.get(), &buf );
-    std::string output( buf->data, buf->data + buf->length );
-    return output;
+    std::shared_ptr<SignedCertificate> res = std::shared_ptr<SignedCertificate>( new SignedCertificate() );
+    res->certificate = std::string( buf->data, buf->data + buf->length );
+    res->serial = ASN1_INTEGER_get( target.get()->cert_info->serialNumber );
+    return res;
 }
index 66165809a2afc2b8813a10e44b6b0803738708fc..db82dafd93d610135e16494bf78970f5b2622f22 100644 (file)
@@ -27,6 +27,6 @@ public:
     void setPubkeyFrom( std::shared_ptr<X509Req> r );
     void setSerialNumber( int num );
     void setExtensions( std::shared_ptr<X509> caCert, std::vector<std::shared_ptr<SAN>>& sans );
-    void setTimes( long before, long after );
-    std::string sign( std::shared_ptr<EVP_PKEY> caKey );
+    void setTimes( uint32_t before, uint32_t after );
+    std::shared_ptr<SignedCertificate> sign( std::shared_ptr<EVP_PKEY> caKey );
 };
index a80b73ed69f2703f9292329d90dd9a068f4b9ab8..e3a9516d137790fbaf683e37faae1af41a865bab 100644 (file)
@@ -28,9 +28,20 @@ struct TBSCertificate {
     std::vector<std::shared_ptr<SAN>> SANs;
 };
 
+struct SignedCertificate {
+    std::string certificate;
+    uint32_t serial;
+    uint32_t before;
+    uint32_t after;
+    std::string pkHash;
+    std::string certHash;
+    std::string crt_name;
+};
+
 class JobProvider {
 public:
     virtual std::shared_ptr<Job> fetchJob() = 0;
     virtual bool finishJob( std::shared_ptr<Job> job ) = 0;
     virtual std::shared_ptr<TBSCertificate> fetchTBSCert( std::shared_ptr<Job> job ) = 0;
+    virtual void writeBack( std::shared_ptr<Job> job, std::shared_ptr<SignedCertificate> res ) = 0;
 };
index 2d42e848461e2e34555d3b1f857003ed66cd5047..49baf9714d720ffd40abda6f87fb0699fe3fc0ec 100644 (file)
@@ -16,6 +16,8 @@
     with this program; if not, write to the Free Software Foundation, Inc.,
     51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  */
+#include <sys/stat.h>
+
 #include <iostream>
 #include <fstream>
 #include <streambuf>
 #include "mysql.h"
 #include "simpleOpensslSigner.h"
 
+std::string writeBackFile( uint32_t serial, std::string cert ) {
+    std::string filename = "keys";
+    mkdir( filename.c_str(), 0755 );
+    filename += "/crt";
+    mkdir( filename.c_str(), 0755 );
+    filename += "/" + std::to_string( serial / 1000 );
+    mkdir( filename.c_str(), 0755 );
+    filename += "/" + std::to_string( serial ) + ".crt";
+    std::ofstream file;
+    file.open( filename.c_str() );
+    file << cert.c_str();
+    file.close();
+    return filename;
+}
+
 int main( int argc, const char* argv[] ) {
     if( argc < 2 ) {
         std::cout << argv[0] << " password" << std::endl;
@@ -51,7 +68,11 @@ int main( int argc, const char* argv[] ) {
             std::cout << "Found a CSR at '" << cert->csr << "' signing" << std::endl;
             std::ifstream t( cert->csr );
             cert->csr_content = std::string( std::istreambuf_iterator<char>( t ), std::istreambuf_iterator<char>() );
-            sign->sign( cert );
+
+            std::shared_ptr<SignedCertificate> res = sign->sign( cert );
+            std::string fn = writeBackFile( res->serial, res->certificate );
+            res->crt_name = fn;
+            jp->writeBack( job, res );
         } catch( const char* c ) {
             std::cerr << c << std::endl;
             return 2;
index 66c24427411664c1aceb23605e5679aa63520611..67fc49ecc65bae1122a196242c41a2380e194ac8 100644 (file)
@@ -155,7 +155,7 @@ std::shared_ptr<Job> MySQLJobProvider::fetchJob() {
     return job;
 }
 
-std::string MySQLJobProvider::escape_string( const std::string & target ) {
+std::string MySQLJobProvider::escape_string( const std::string& target ) {
     if( !conn ) {
         throw "Not connected!";
     }
@@ -243,3 +243,17 @@ std::shared_ptr<TBSCertificate> MySQLJobProvider::fetchTBSCert( std::shared_ptr<
 
     return cert;
 }
+
+void MySQLJobProvider::writeBack( std::shared_ptr<Job> job, std::shared_ptr<SignedCertificate> res ) {
+    if( !conn ) {
+        throw "Error while writing back";
+    }
+
+    std::string q = "UPDATE certs SET crt_name='" + this->escape_string( res->crt_name ) + "', serial='" + this->escape_string( std::to_string( res->serial ) ) + "' WHERE id='" + this->escape_string( job->id ) + "' LIMIT 1";
+
+    // TODO write more thingies back
+
+    if( query( q ).first ) {
+        throw "Error while writing back";
+    }
+}
index 827a10a85f7d9230ae5ca6309bdc731ebf3ae99e..d72695762bc56b8136a07a1aebb1502155d72985 100644 (file)
@@ -33,4 +33,5 @@ public:
     std::shared_ptr<Job> fetchJob();
     bool finishJob( std::shared_ptr<Job> job );
     std::shared_ptr<TBSCertificate> fetchTBSCert( std::shared_ptr<Job> job );
+    void writeBack( std::shared_ptr<Job> job, std::shared_ptr<SignedCertificate> res );
 };
index f36cf485c13b00c3e216821e355d1551aabb8279..feef5da64bbafcb39a70e820e7cefcdd5531c1af 100644 (file)
@@ -6,5 +6,5 @@
 
 class Signer {
 public:
-    virtual void sign( std::shared_ptr<TBSCertificate> cert ) = 0;
+    virtual std::shared_ptr<SignedCertificate> sign( std::shared_ptr<TBSCertificate> cert ) = 0;
 };
index e38aeb1208c9986bd583b50b5ac41b5ec1c6bb83..01189958fd70986c6dc8e49f6a4ea785c38ecaa3 100644 (file)
@@ -66,7 +66,7 @@ std::shared_ptr<X509> SimpleOpensslSigner::caCert = loadX509FromFile( "assured.c
 
 std::shared_ptr<EVP_PKEY> SimpleOpensslSigner::caKey = loadPkeyFromFile( "assured.key" );
 
-void SimpleOpensslSigner::sign( std::shared_ptr<TBSCertificate> cert ) {
+std::shared_ptr<SignedCertificate> SimpleOpensslSigner::sign( std::shared_ptr<TBSCertificate> cert ) {
     if( !caKey ) {
         throw "CA-key not found";
     }
@@ -100,5 +100,7 @@ void SimpleOpensslSigner::sign( std::shared_ptr<TBSCertificate> cert ) {
 
     std::string output = c.sign( caKey );
 
-    std::cout << "Certificate:" << std::endl << output << std::endl;
+    std::shared_ptr<SignedCertificate> output = c.sign( caKey );
+
+    return output;
 }
index 586e6e29c5b83be183ccce8f3557c7f3f0784036..b2f245fd0a00221b648f4fcd0551f09704a1fd83 100644 (file)
@@ -10,5 +10,5 @@ private:
     static std::shared_ptr<EVP_PKEY> caKey;
     static std::shared_ptr<X509> caCert;
 public:
-    void sign( std::shared_ptr<TBSCertificate> cert );
+    std::shared_ptr<SignedCertificate> sign( std::shared_ptr<TBSCertificate> cert );
 };