X-Git-Url: https://code.wpia.club/?a=blobdiff_plain;f=src%2Fcrypto%2FCRL.cpp;h=f7aa6a5e2417a70af2ff8640f369a637b851ddcc;hb=3a45e813dfbb75ac7f9069b9799d2c5ac9e47140;hp=902cb6dfb409b1b3e72d618aa29428dbfc80cc5f;hpb=5b4921f43694eb12257750170253319ee8d62218;p=cassiopeia.git diff --git a/src/crypto/CRL.cpp b/src/crypto/CRL.cpp index 902cb6d..f7aa6a5 100644 --- a/src/crypto/CRL.cpp +++ b/src/crypto/CRL.cpp @@ -2,6 +2,7 @@ #include #include +#include CRL::CRL( std::string path ) { std::shared_ptr bio( BIO_new_file( path.c_str(), "r" ), BIO_free ); @@ -17,21 +18,21 @@ std::string CRL::revoke( std::string serial, std::string time ) { logger::note("parsing serial"); if( ! BN_hex2bn( &serBN, serial.c_str() ) ) { - throw "hex2bn malloc fail"; + throw std::runtime_error("hex2bn malloc fail"); } std::shared_ptr serBNP( serBN, BN_free ); std::shared_ptr ser( BN_to_ASN1_INTEGER( serBN, NULL ), ASN1_INTEGER_free ); if( !ser ) { - throw "BN Malloc fail"; + throw std::runtime_error("BN Malloc fail"); } logger::note("building current time"); std::shared_ptr tmptm( ASN1_TIME_new(), ASN1_TIME_free ); if( !tmptm ) { - throw "ASN1-Time Malloc fail"; + throw std::runtime_error("ASN1-Time Malloc fail"); } X509_gmtime_adj( tmptm.get(), 0 ); @@ -41,11 +42,9 @@ std::string CRL::revoke( std::string serial, std::string time ) { X509_REVOKED_set_serialNumber( rev, ser.get() ); if( time != "" ) { - const unsigned char* data = ( unsigned char* )( time.data() ); - d2i_ASN1_TIME( &rev->revocationDate, &data, time.size() ); - } else { - X509_REVOKED_set_revocationDate( rev, tmptm.get() ); + ASN1_TIME_set_string( tmptm.get(), time.data() ); } + X509_REVOKED_set_revocationDate( rev, tmptm.get() ); X509_CRL_add0_revoked( crl.get(), rev ); @@ -63,21 +62,21 @@ void CRL::sign( std::shared_ptr ca ) { std::shared_ptr tmptm( ASN1_TIME_new(), ASN1_TIME_free ); if( !tmptm ) { - throw "ASN1-Time Malloc fail"; + throw std::runtime_error("ASN1-Time Malloc fail"); } X509_gmtime_adj( tmptm.get(), 0 ); logger::note("setting issuer"); if( !X509_CRL_set_issuer_name( crl.get(), X509_get_subject_name( ca->ca.get() ) ) ) { - throw "Setting issuer failed"; + throw std::runtime_error("Setting issuer failed"); } logger::note("setting update"); X509_CRL_set_lastUpdate( crl.get(), tmptm.get() ); if( !X509_time_adj_ex( tmptm.get(), 1, 10, NULL ) ) { - throw "Updating time failed"; + throw std::runtime_error("Updating time failed"); } logger::note("setting next update"); @@ -106,17 +105,21 @@ std::string CRL::toString() { } std::string CRL::getSignature() { - int len = i2d_X509_ALGOR( crl->sig_alg, NULL ); - len += i2d_ASN1_BIT_STRING( crl->signature, NULL ); - len += i2d_ASN1_TIME( crl->crl->lastUpdate, NULL ); - len += i2d_ASN1_TIME( crl->crl->nextUpdate, NULL ); + const X509_ALGOR *palg; + const ASN1_BIT_STRING *psig; + + X509_CRL_get0_signature(crl.get(), &psig, &palg); + int len = i2d_X509_ALGOR( const_cast(palg), NULL ); + len += i2d_ASN1_BIT_STRING( const_cast(psig), NULL ); + len += i2d_ASN1_TIME( const_cast(X509_CRL_get0_lastUpdate(crl.get())), NULL ); + len += i2d_ASN1_TIME( const_cast(X509_CRL_get0_nextUpdate(crl.get())), NULL ); unsigned char* buffer = ( unsigned char* ) OPENSSL_malloc( len ); unsigned char* pos = buffer; - i2d_X509_ALGOR( crl->sig_alg, &pos ); - i2d_ASN1_BIT_STRING( crl->signature, &pos ); - i2d_ASN1_TIME( crl->crl->lastUpdate, &pos ); - i2d_ASN1_TIME( crl->crl->nextUpdate, &pos ); + i2d_X509_ALGOR( const_cast(palg), &pos ); + i2d_ASN1_BIT_STRING( const_cast(psig), &pos ); + i2d_ASN1_TIME( const_cast(X509_CRL_get0_lastUpdate(crl.get())), &pos ); + i2d_ASN1_TIME( const_cast(X509_CRL_get0_nextUpdate(crl.get())), &pos ); std::string res = std::string( ( char* ) buffer, len ); OPENSSL_free( buffer ); @@ -125,19 +128,33 @@ std::string CRL::getSignature() { void CRL::setSignature( std::string signature ) { X509_CRL_sort( crl.get() ); + X509_ALGOR *palg; + ASN1_BIT_STRING *psig; + // this is not intended use of the OPENSSL-API but API-limitations leave us with no other options. + X509_CRL_get0_signature(crl.get(), const_cast(&psig), const_cast(&palg)); + const unsigned char* data = ( unsigned char* )( signature.data() ); const unsigned char* buffer = data; - d2i_X509_ALGOR( &crl->sig_alg, &buffer, signature.size() ); - d2i_ASN1_BIT_STRING( &crl->signature, &buffer, signature.size() + data - buffer ); - d2i_ASN1_TIME( &crl->crl->lastUpdate, &buffer, signature.size() + data - buffer ); - d2i_ASN1_TIME( &crl->crl->nextUpdate, &buffer, signature.size() + data - buffer ); + X509_ALGOR *alg = d2i_X509_ALGOR( NULL, &buffer, signature.size() ); + ASN1_BIT_STRING *sig = d2i_ASN1_BIT_STRING( NULL, &buffer, signature.size() + data - buffer ); + ASN1_TIME *a1 = d2i_ASN1_TIME( NULL, &buffer, signature.size() + data - buffer ); + ASN1_TIME *a2 = d2i_ASN1_TIME( NULL, &buffer, signature.size() + data - buffer ); + *palg = *alg; + *psig = *sig; + X509_CRL_set1_lastUpdate( crl.get(), a1); + X509_CRL_set1_nextUpdate( crl.get(), a2); + + //X509_ALGOR_free(alg); + //ASN1_BIT_STRING_free(sig); + ASN1_TIME_free(a1); + ASN1_TIME_free(a2); } bool CRL::needsResign() { time_t current; time( ¤t ); current += 60 * 60;// 1 hour - auto time = X509_CRL_get_nextUpdate( crl.get() ); + auto time = X509_CRL_get0_nextUpdate( crl.get() ); if( !time ) { return true;