]> WPIA git - cassiopeia.git/blob - src/simpleOpensslSigner.cpp
e38aeb1208c9986bd583b50b5ac41b5ec1c6bb83
[cassiopeia.git] / src / simpleOpensslSigner.cpp
1 #include "simpleOpensslSigner.h"
2
3 #include <iostream>
4
5 #include <openssl/ssl.h>
6 #include <openssl/err.h>
7 #include <openssl/bio.h>
8 #include <openssl/bn.h>
9 #include <openssl/engine.h>
10 #include <openssl/x509v3.h>
11
12 #include "X509.h"
13
14 std::shared_ptr<int> SimpleOpensslSigner::lib_ref(
15     new int( SSL_library_init() ),
16     []( int* ref ) {
17         delete ref;
18
19         EVP_cleanup();
20         CRYPTO_cleanup_all_ex_data();
21     } );
22
23 std::shared_ptr<X509> loadX509FromFile( std::string filename ) {
24     FILE* f = fopen( filename.c_str(), "r" );
25
26     if( !f ) {
27         return std::shared_ptr<X509>();
28     }
29
30     X509* key = PEM_read_X509( f, NULL, NULL, 0 );
31     fclose( f );
32
33     if( !key ) {
34         return std::shared_ptr<X509>();
35     }
36
37     return std::shared_ptr<X509>(
38         key,
39         []( X509 * ref ) {
40             X509_free( ref );
41         } );
42 }
43
44 std::shared_ptr<EVP_PKEY> loadPkeyFromFile( std::string filename ) {
45     FILE* f = fopen( filename.c_str(), "r" );
46
47     if( !f ) {
48         return std::shared_ptr<EVP_PKEY>();
49     }
50
51     EVP_PKEY* key = PEM_read_PrivateKey( f, NULL, NULL, 0 );
52     fclose( f );
53
54     if( !key ) {
55         return std::shared_ptr<EVP_PKEY>();
56     }
57
58     return std::shared_ptr<EVP_PKEY>(
59         key,
60         []( EVP_PKEY * ref ) {
61             EVP_PKEY_free( ref );
62         } );
63 }
64
65 std::shared_ptr<X509> SimpleOpensslSigner::caCert = loadX509FromFile( "assured.crt" );
66
67 std::shared_ptr<EVP_PKEY> SimpleOpensslSigner::caKey = loadPkeyFromFile( "assured.key" );
68
69 void SimpleOpensslSigner::sign( std::shared_ptr<TBSCertificate> cert ) {
70     if( !caKey ) {
71         throw "CA-key not found";
72     }
73
74     std::shared_ptr<X509Req> req = X509Req::parse( cert->csr_content );
75
76     int i = req->verify();
77
78     if( i < 0 ) {
79         throw "Signature problems ... ";
80     } else if( i == 0 ) {
81         throw "Signature did not match";
82     } else {
83         std::cerr << "Signature ok" << std::endl;
84     }
85
86     // Construct the Certificate
87     X509Cert c = X509Cert();
88     std::shared_ptr<X509> retsh = std::shared_ptr<X509>( X509_new(), X509_free );
89     X509* ret = retsh.get();
90
91     if( !ret ) {
92         throw "Creating X509 failed.";
93     }
94
95     c.setIssuerNameFrom( caCert );
96     c.setPubkeyFrom( req );
97     c.setSerialNumber( 4711 );
98     c.setTimes( 0, 60 * 60 * 24 * 10 );
99     c.setExtensions( caCert, cert->SANs );
100
101     std::string output = c.sign( caKey );
102
103     std::cout << "Certificate:" << std::endl << output << std::endl;
104 }