allow checking of Opaque Signed message data

This commit is contained in:
Karl-Heinz Zimmer 2002-04-27 05:32:39 +00:00
parent ffc9f44932
commit 996d48a95e
2 changed files with 50 additions and 8 deletions

View File

@ -1449,9 +1449,18 @@ struct SignatureMetaData {
/*! \ingroup groupSignAct /*! \ingroup groupSignAct
\brief Checks whether the signature of a message is \brief Checks whether the signature of a message is
valid. \c ciphertext specifies the signed message valid.
as it was received by the MUA, \c signaturetext is the
signature itself. \c cleartext must never be 0 but be a valid pointer.
If \c *cleartext > 0 then **cleartext specifies the message text
that was signed and \c signaturetext is the signature itself.
If \c *cleartext == 0 is an empty string then \c signaturetext is
supposed to contain an opaque signed message part. After checking the
data and verifying the signature the cleartext of the message will be
returned in \c cleartext. The user must free the respective memory
ocupied by *cleartext.
Depending on the configuration, MUAs might not need to use this. Depending on the configuration, MUAs might not need to use this.
If \c sigmeta is non-null, the If \c sigmeta is non-null, the
@ -1459,7 +1468,7 @@ struct SignatureMetaData {
contain meta information about the signature after the contain meta information about the signature after the
function call. function call.
*/ */
bool checkMessageSignature( const char* ciphertext, bool checkMessageSignature( char** cleartext,
const char* signaturetext, const char* signaturetext,
bool signatureIsBinary, bool signatureIsBinary,
int signatureLen, int signatureLen,

View File

@ -81,6 +81,7 @@
#define GPGMEPLUG_SIGN_FLAT_POSTFIX "" #define GPGMEPLUG_SIGN_FLAT_POSTFIX ""
#define __GPGMEPLUG_SIGNATURE_CODE_IS_BINARY false #define __GPGMEPLUG_SIGNATURE_CODE_IS_BINARY false
#endif #endif
#define __GPGMEPLUG_ERROR_CLEARTEXT_IS_ZERO "Error: Cannot run checkMessageSignature() with cleartext == 0"
/* definitions for encoding */ /* definitions for encoding */
#ifndef GPGMEPLUG_ENC_MAKE_MIME_OBJECT #ifndef GPGMEPLUG_ENC_MAKE_MIME_OBJECT
#define GPGMEPLUG_ENC_INCLUDE_CLEARTEXT false #define GPGMEPLUG_ENC_INCLUDE_CLEARTEXT false
@ -1028,7 +1029,7 @@ sig_status_to_string( GpgmeSigStat status )
} }
bool checkMessageSignature( const char* ciphertext, bool checkMessageSignature( char** cleartext,
const char* signaturetext, const char* signaturetext,
bool signatureIsBinary, bool signatureIsBinary,
int signatureLen, int signatureLen,
@ -1037,20 +1038,39 @@ bool checkMessageSignature( const char* ciphertext,
GpgmeCtx ctx; GpgmeCtx ctx;
GpgmeSigStat status; GpgmeSigStat status;
GpgmeData datapart, sigpart; GpgmeData datapart, sigpart;
char* rClear = 0;
size_t clearLen;
GpgmeError err; GpgmeError err;
GpgmeKey key; GpgmeKey key;
time_t created; time_t created;
int sig_idx = 0; int sig_idx = 0;
const char* statusStr; const char* statusStr;
const char* fpr; const char* fpr;
bool isOpaqueSigned;
if( !cleartext ) {
if( sigmeta ) {
sigmeta->status = malloc( strlen( __GPGMEPLUG_ERROR_CLEARTEXT_IS_ZERO ) + 1 );
if( sigmeta->status ) {
strcpy( sigmeta->status, __GPGMEPLUG_ERROR_CLEARTEXT_IS_ZERO );
sigmeta->status[ strlen( __GPGMEPLUG_ERROR_CLEARTEXT_IS_ZERO ) ] = '\0';
}
}
return false;
}
isOpaqueSigned = !*cleartext;
gpgme_new( &ctx ); gpgme_new( &ctx );
gpgme_set_protocol (ctx, GPGMEPLUG_PROTOCOL); gpgme_set_protocol (ctx, GPGMEPLUG_PROTOCOL);
gpgme_set_armor (ctx, signatureIsBinary ? 0 : 1); gpgme_set_armor (ctx, signatureIsBinary ? 0 : 1);
/* gpgme_set_textmode (ctx, signatureIsBinary ? 0 : 1); */ /* gpgme_set_textmode (ctx, signatureIsBinary ? 0 : 1); */
gpgme_data_new_from_mem( &datapart, ciphertext, if( isOpaqueSigned )
strlen( ciphertext ), 1 ); gpgme_data_new( &datapart );
else
gpgme_data_new_from_mem( &datapart, *cleartext,
strlen( *cleartext ), 1 );
gpgme_data_new_from_mem( &sigpart, gpgme_data_new_from_mem( &sigpart,
signaturetext, signaturetext,
@ -1060,7 +1080,20 @@ bool checkMessageSignature( const char* ciphertext,
1 ); 1 );
gpgme_op_verify( ctx, sigpart, datapart, &status ); 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( datapart );
gpgme_data_release( sigpart ); gpgme_data_release( sigpart );
/* Provide information in the sigmeta struct */ /* Provide information in the sigmeta struct */