allow checking of Opaque Signed message data
This commit is contained in:
parent
ffc9f44932
commit
996d48a95e
@ -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,
|
||||||
|
@ -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 );
|
||||||
gpgme_data_release( datapart );
|
|
||||||
|
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 );
|
gpgme_data_release( sigpart );
|
||||||
|
|
||||||
/* Provide information in the sigmeta struct */
|
/* Provide information in the sigmeta struct */
|
||||||
|
Loading…
Reference in New Issue
Block a user