X-Git-Url: https://code.wpia.club/?a=blobdiff_plain;f=src%2FX509.cpp;h=92d7773f22f4cbff36b0b5cb4a179f030018087a;hb=7a72391242e316a16992e0874a118999486afb87;hp=9219e394bc8a1f06897252ea2c0a670cbd38e66d;hpb=b51ce6dd5f8941c0f5d5670ac7ee2fed94eeb601;p=cassiopeia.git diff --git a/src/X509.cpp b/src/X509.cpp index 9219e39..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 ) { @@ -119,8 +133,8 @@ void X509Cert::setPubkeyFrom( std::shared_ptr req ) { } } -void X509Cert::setSerialNumber( int num ) { - ASN1_INTEGER_set( target.get()->cert_info->serialNumber, num ); +void X509Cert::setSerialNumber( BIGNUM* num ) { + BN_to_ASN1_INTEGER( num , target->cert_info->serialNumber ); } void X509Cert::setTimes( uint32_t before, uint32_t after ) { @@ -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."; } @@ -216,6 +252,10 @@ std::shared_ptr X509Cert::sign( std::shared_ptr caK BIO_get_mem_ptr( mem.get(), &buf ); std::shared_ptr res = std::shared_ptr( new SignedCertificate() ); res->certificate = std::string( buf->data, buf->data + buf->length ); - res->serial = ASN1_INTEGER_get( target.get()->cert_info->serialNumber ); + BIGNUM* ser = ASN1_INTEGER_to_BN( target->cert_info->serialNumber, NULL ); + char* serStr = BN_bn2hex( ser ); + res->serial = std::string( serStr ); + OPENSSL_free( serStr ); + BN_free( ser ); return res; }