X-Git-Url: https://code.wpia.club/?a=blobdiff_plain;ds=sidebyside;f=src%2FX509.cpp;h=92d7773f22f4cbff36b0b5cb4a179f030018087a;hb=7a72391242e316a16992e0874a118999486afb87;hp=19901e41b0c19b38d322f744722c3e2b703df0ef;hpb=59e3ff1a00dbe5c819ea6f34f86b03b2912b71c5;p=cassiopeia.git diff --git a/src/X509.cpp b/src/X509.cpp index 19901e4..92d7773 100644 --- a/src/X509.cpp +++ b/src/X509.cpp @@ -103,6 +103,20 @@ X509Cert::X509Cert() { if( !X509_set_version( c, 2 ) ) { throw "Setting X509-version to 3 failed"; } + + X509_NAME* subjectP = X509_NAME_new(); + + if( !subjectP ) { + throw "malloc failure"; + } + + subject = std::shared_ptr( subjectP, X509_NAME_free ); +} + +void X509Cert::addRDN( int nid, std::string data ) { + if( ! X509_NAME_add_entry_by_NID( subject.get(), nid, MBSTRING_UTF8, ( unsigned char* )const_cast( data.data() ), data.size(), -1, 0 ) ) { + throw "malloc failure"; + } } void X509Cert::setIssuerNameFrom( std::shared_ptr caCert ) { @@ -170,6 +184,10 @@ void X509Cert::setExtensions( std::shared_ptr caCert, std::vector gens = std::shared_ptr( sk_GENERAL_NAME_new_null(), []( GENERAL_NAMES * ref ) { @@ -203,8 +221,26 @@ void X509Cert::setExtensions( std::shared_ptr caCert, std::vector X509Cert::sign( std::shared_ptr caKey ) { - if( !X509_sign( target.get(), caKey.get(), EVP_sha512() ) ) { +std::shared_ptr X509Cert::sign( std::shared_ptr caKey, std::string signAlg ) { + if( !X509_set_subject_name( target.get(), subject.get() ) ) { + throw "error setting subject"; + } + + const EVP_MD* md; + + if( signAlg == "sha512" ) { + md = EVP_sha512(); + } else if( signAlg == "sha384" ) { + md = EVP_sha384(); + } else if( signAlg == "sha256" ) { + md = EVP_sha256(); + } else if( signAlg == "sha1" ) { + md = EVP_sha1(); + } else { + throw "Unknown md-type"; + } + + if( !X509_sign( target.get(), caKey.get(), md ) ) { throw "Signing failed."; }