X-Git-Url: https://code.wpia.club/?a=blobdiff_plain;f=src%2Fcrypto%2FCRL.cpp;h=41fbe8b6472464af1dbcfab4ed5aec66b7cf44bd;hb=e0713d1539887566e0ea7d85942c305ec727c9dd;hp=dd32670bcae8467bf4136c9c35187c7816dd7bdc;hpb=ab317a7803ad0ff688ab8fb452d13d8bdd09fd60;p=cassiopeia.git diff --git a/src/crypto/CRL.cpp b/src/crypto/CRL.cpp index dd32670..41fbe8b 100644 --- a/src/crypto/CRL.cpp +++ b/src/crypto/CRL.cpp @@ -1,9 +1,11 @@ #include "CRL.h" #include +#include +#include CRL::CRL( std::string path ) { - std::shared_ptr bio( BIO_new_file( path.c_str(), "r" ), free ); + std::shared_ptr bio( BIO_new_file( path.c_str(), "r" ), BIO_free ); crl = std::shared_ptr( PEM_read_bio_X509_CRL( bio.get(), 0, NULL, 0 ), X509_CRL_free ); if( !crl ) { @@ -14,41 +16,44 @@ CRL::CRL( std::string path ) { std::string CRL::revoke( std::string serial, std::string time ) { BIGNUM* serBN = 0; + 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 ); + logger::note("creating entry"); X509_REVOKED* rev = X509_REVOKED_new(); X509_REVOKED_set_serialNumber( rev, ser.get() ); if( time != "" ) { const unsigned char* data = ( unsigned char* )( time.data() ); - d2i_ASN1_UTCTIME( &rev->revocationDate, &data, time.size() ); + d2i_ASN1_TIME( &rev->revocationDate, &data, time.size() ); } else { X509_REVOKED_set_revocationDate( rev, tmptm.get() ); } X509_CRL_add0_revoked( crl.get(), rev ); - int len = i2d_ASN1_UTCTIME( tmptm.get(), NULL ); + int len = i2d_ASN1_TIME( tmptm.get(), NULL ); unsigned char* buffer = ( unsigned char* ) OPENSSL_malloc( len ); unsigned char* pos = buffer; - i2d_ASN1_UTCTIME( tmptm.get(), &pos ); + i2d_ASN1_TIME( tmptm.get(), &pos ); std::string rettime = std::string( ( char* ) buffer, len ); OPENSSL_free( buffer ); return rettime; @@ -59,25 +64,30 @@ 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"); X509_CRL_set_nextUpdate( crl.get(), tmptm.get() ); + logger::note("sorting"); // Sorting and signing X509_CRL_sort( crl.get() ); + logger::note("signing"); X509_CRL_sign( crl.get(), ca->caKey.get(), EVP_sha256() ); } @@ -99,15 +109,15 @@ 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_UTCTIME( crl->crl->lastUpdate, NULL ); - len += i2d_ASN1_UTCTIME( crl->crl->nextUpdate, NULL ); + len += i2d_ASN1_TIME( crl->crl->lastUpdate, NULL ); + len += i2d_ASN1_TIME( crl->crl->nextUpdate, 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_UTCTIME( crl->crl->lastUpdate, &pos ); - i2d_ASN1_UTCTIME( crl->crl->nextUpdate, &pos ); + i2d_ASN1_TIME( crl->crl->lastUpdate, &pos ); + i2d_ASN1_TIME( crl->crl->nextUpdate, &pos ); std::string res = std::string( ( char* ) buffer, len ); OPENSSL_free( buffer ); @@ -115,10 +125,25 @@ std::string CRL::getSignature() { } void CRL::setSignature( std::string signature ) { + X509_CRL_sort( crl.get() ); 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() + buffer - data ); - d2i_ASN1_UTCTIME( &crl->crl->lastUpdate, &buffer, signature.size() + buffer - data ); - d2i_ASN1_UTCTIME( &crl->crl->nextUpdate, &buffer, signature.size() + buffer - data ); + 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 ); +} + +bool CRL::needsResign() { + time_t current; + time( ¤t ); + current += 60 * 60;// 1 hour + auto time = X509_CRL_get_nextUpdate( crl.get() ); + + if( !time ) { + return true; + } + + int cmp = X509_cmp_time( time, ¤t ); + return cmp < 0; }