From a58efc1d5f0a92ecf63a4ae122ee7757e1ac903a Mon Sep 17 00:00:00 2001 From: Karl-Heinz Zimmer Date: Thu, 12 Sep 2002 11:02:02 +0000 Subject: [PATCH] Bugfix #1276 (equals KDE bug #43868). Make sure to update kde/kdenetwork/libkdenetwork and kde/kdenetwork/kmail. --- gpgmeplug/cryptplug.h | 19 ++-- gpgmeplug/gpgmeplug.c | 220 +++++++++++++++++++++++++++++------------- 2 files changed, 163 insertions(+), 76 deletions(-) diff --git a/gpgmeplug/cryptplug.h b/gpgmeplug/cryptplug.h index e1a613d..325a62a 100644 --- a/gpgmeplug/cryptplug.h +++ b/gpgmeplug/cryptplug.h @@ -1702,11 +1702,11 @@ bool encryptAndSignMessage( const char* cleartext, \c true, otherwise \c false. */ -bool decryptMessage( const char* ciphertext, - bool cipherIsBinary, - int cipherLen, +bool decryptMessage( const char* ciphertext, + bool cipherIsBinary, + int cipherLen, const char** cleartext, - const char* certificate, + const char* certificate, int* errId, char** errTxt ); @@ -1721,10 +1721,15 @@ bool decryptMessage( const char* ciphertext, object pointed to will contain meta information about the signature after the function call. */ -bool decryptAndCheckMessage( const char* ciphertext, +bool decryptAndCheckMessage( const char* ciphertext, + bool cipherIsBinary, + int cipherLen, const char** cleartext, - const char* certificate, - struct SignatureMetaData* sigmeta ); + const char* certificate, + bool* signatureFound, + struct SignatureMetaData* sigmeta, + int* errId, + char** errTxt ); /*! \ingroup groupCertAct diff --git a/gpgmeplug/gpgmeplug.c b/gpgmeplug/gpgmeplug.c index fe456ff..4dab9ef 100644 --- a/gpgmeplug/gpgmeplug.c +++ b/gpgmeplug/gpgmeplug.c @@ -1712,10 +1712,6 @@ bool decryptMessage( const char* ciphertext, return bOk; } -bool decryptAndCheckMessage( const char* ciphertext, - const char** cleartext, const char* certificate, - struct SignatureMetaData* sigmeta ){ return true; } - const char* requestCertificateDialog(){ return 0; } @@ -2530,74 +2526,21 @@ sig_status_to_string( GpgmeSigStat status ) } -bool checkMessageSignature( char** cleartext, - const char* signaturetext, - bool signatureIsBinary, - int signatureLen, - struct SignatureMetaData* sigmeta ) +void obtain_signature_information( GpgmeCtx * ctx, + GpgmeSigStat status, + struct SignatureMetaData* sigmeta ) { - GpgmeCtx ctx; - GpgmeSigStat status; - unsigned long sumGPGME; - SigStatusFlags sumPlug; - GpgmeData datapart, sigpart; - char* rClear = 0; - size_t clearLen; GpgmeError err; GpgmeKey key; + const char* statusStr; + const char* fpr; + unsigned long sumGPGME; + SigStatusFlags sumPlug; time_t created; struct DnPair* a; int sig_idx=0; int UID_idx=0; - const char* statusStr; - const char* fpr; - bool isOpaqueSigned; - if( !cleartext ) { - if( sigmeta ) - storeNewCharPtr( &sigmeta->status, - __GPGMEPLUG_ERROR_CLEARTEXT_IS_ZERO ); - - return false; - } - - isOpaqueSigned = !*cleartext; - - gpgme_new( &ctx ); - gpgme_set_protocol (ctx, GPGMEPLUG_PROTOCOL); - gpgme_set_armor (ctx, signatureIsBinary ? 0 : 1); - /* gpgme_set_textmode (ctx, signatureIsBinary ? 0 : 1); */ - - if( isOpaqueSigned ) - gpgme_data_new( &datapart ); - else - gpgme_data_new_from_mem( &datapart, *cleartext, - strlen( *cleartext ), 1 ); - - gpgme_data_new_from_mem( &sigpart, - signaturetext, - signatureIsBinary - ? signatureLen - : strlen( signaturetext ), - 1 ); - - gpgme_op_verify( ctx, sigpart, datapart, &status ); - - if( isOpaqueSigned ) { - rClear = gpgme_data_release_and_get_mem( datapart, &clearLen ); - *cleartext = malloc( clearLen + 1 ); - if( *cleartext ) { - if( clearLen ) - strncpy(*cleartext, rClear, clearLen ); - (*cleartext)[clearLen] = '\0'; - } - free( rClear ); - } - else - gpgme_data_release( datapart ); - - gpgme_data_release( sigpart ); - /* Provide information in the sigmeta struct */ /* the status string */ statusStr = sig_status_to_string( status ); @@ -2609,7 +2552,7 @@ bool checkMessageSignature( char** cleartext, ; /* nothing to do, is already 0 */ /* Extended information for any number of signatures. */ - fpr = gpgme_get_sig_status( ctx, sig_idx, &status, &created ); + fpr = gpgme_get_sig_status( *ctx, sig_idx, &status, &created ); sigmeta->extended_info = 0; while( fpr != NULL ) { struct tm* ctime_val; @@ -2635,7 +2578,7 @@ bool checkMessageSignature( char** cleartext, } /* the extended signature verification status */ - sumGPGME = gpgme_get_sig_ulong_attr( ctx, + sumGPGME = gpgme_get_sig_ulong_attr( *ctx, sig_idx, GPGME_ATTR_SIG_SUMMARY, 0 ); @@ -2659,7 +2602,7 @@ bool checkMessageSignature( char** cleartext, sigmeta->extended_info[sig_idx].validity = GPGME_VALIDITY_UNKNOWN; - err = gpgme_get_sig_key (ctx, sig_idx, &key); + err = gpgme_get_sig_key (*ctx, sig_idx, &key); if ( err == GPGME_No_Error) { const char* attr_string; @@ -2765,13 +2708,152 @@ bool checkMessageSignature( char** cleartext, break; /* if allocation fails once, it isn't likely to succeed the next time either */ - fpr = gpgme_get_sig_status (ctx, ++sig_idx, &status, &created); + fpr = gpgme_get_sig_status (*ctx, ++sig_idx, &status, &created); } sigmeta->extended_info_count = sig_idx; - sigmeta->nota_xml = gpgme_get_notation( ctx ); + sigmeta->nota_xml = gpgme_get_notation( *ctx ); sigmeta->status_code = status; +} + + +bool checkMessageSignature( char** cleartext, + const char* signaturetext, + bool signatureIsBinary, + int signatureLen, + struct SignatureMetaData* sigmeta ) +{ + GpgmeCtx ctx; + GpgmeSigStat status; + GpgmeData datapart, sigpart; + char* rClear = 0; + size_t clearLen; + bool isOpaqueSigned; + + if( !cleartext ) { + if( sigmeta ) + storeNewCharPtr( &sigmeta->status, + __GPGMEPLUG_ERROR_CLEARTEXT_IS_ZERO ); + + return false; + } + isOpaqueSigned = !*cleartext; + + gpgme_new( &ctx ); + gpgme_set_protocol (ctx, GPGMEPLUG_PROTOCOL); + gpgme_set_armor (ctx, signatureIsBinary ? 0 : 1); + /* gpgme_set_textmode (ctx, signatureIsBinary ? 0 : 1); */ + + if( isOpaqueSigned ) + gpgme_data_new( &datapart ); + else + gpgme_data_new_from_mem( &datapart, *cleartext, + strlen( *cleartext ), 1 ); + + gpgme_data_new_from_mem( &sigpart, + signaturetext, + signatureIsBinary + ? signatureLen + : strlen( signaturetext ), + 1 ); + + gpgme_op_verify( ctx, sigpart, datapart, &status ); + + if( isOpaqueSigned ) { + rClear = gpgme_data_release_and_get_mem( datapart, &clearLen ); + *cleartext = malloc( clearLen + 1 ); + if( *cleartext ) { + if( clearLen ) + strncpy(*cleartext, rClear, clearLen ); + (*cleartext)[clearLen] = '\0'; + } + free( rClear ); + } + else + gpgme_data_release( datapart ); + + gpgme_data_release( sigpart ); + + obtain_signature_information( &ctx, status, sigmeta ); + gpgme_release( ctx ); return ( status == GPGME_SIG_STAT_GOOD ); } + +bool decryptAndCheckMessage( const char* ciphertext, + bool cipherIsBinary, + int cipherLen, + const char** cleartext, + const char* certificate, + bool* signatureFound, + struct SignatureMetaData* sigmeta, + int* errId, + char** errTxt ) +{ + GpgmeCtx ctx; + GpgmeError err; + GpgmeSigStat sigstatus; + GpgmeData gCiphertext, gPlaintext; + size_t rCLen = 0; + char* rCiph = 0; + bool bOk = false; + + if( !ciphertext ) + return false; + + err = gpgme_new (&ctx); + gpgme_set_protocol (ctx, GPGMEPLUG_PROTOCOL); + + gpgme_set_armor (ctx, cipherIsBinary ? 0 : 1); + /* gpgme_set_textmode (ctx, cipherIsBinary ? 0 : 1); */ + + /* + gpgme_data_new_from_mem( &gCiphertext, ciphertext, + 1+strlen( ciphertext ), 1 ); */ + gpgme_data_new_from_mem( &gCiphertext, + ciphertext, + cipherIsBinary + ? cipherLen + : strlen( ciphertext ), + 1 ); + + gpgme_data_new( &gPlaintext ); + + err = gpgme_op_decrypt_verify( ctx, gCiphertext, gPlaintext, &sigstatus ); + gpgme_data_release( gCiphertext ); + if( err ) { + fprintf( stderr, "\ngpgme_op_decrypt_verify() returned this error code: %i\n\n", err ); + if( errId ) + *errId = err; + if( errTxt ) { + const char* _errTxt = gpgme_strerror( err ); + *errTxt = malloc( strlen( _errTxt ) + 1 ); + if( *errTxt ) + strcpy(*errTxt, _errTxt ); + } + gpgme_data_release( gPlaintext ); + gpgme_release( ctx ); + return bOk; + } + + rCiph = gpgme_data_release_and_get_mem( gPlaintext, &rCLen ); + + *cleartext = malloc( rCLen + 1 ); + if( *cleartext ) { + if( rCLen ) { + bOk = true; + strncpy((char*)*cleartext, rCiph, rCLen ); + } + ((char*)(*cleartext))[rCLen] = 0; + } + free( rCiph ); + + if( signatureFound ) + *signatureFound = sigstatus != GPGME_SIG_STAT_NONE; + if( sigmeta && sigstatus != GPGME_SIG_STAT_NONE ) + obtain_signature_information( &ctx, sigstatus, sigmeta ); + + gpgme_release( ctx ); + return bOk; +} -- 2.26.2