core: Extend decryption result with symkey_algo.
* src/gpgme.h.in (gpgme_op_decrypt_result_t): Add field 'symkey_algo'. * src/decrypt.c (release_op_data): Free SYMKEY_ALGO. (gpgme_op_decrypt_result): Make sure SYMKEY_ALGO is not NULL. (parse_decryption_info): New. (_gpgme_decrypt_status_handler): Parse DECRYPTION_INFO status. * src/conversion.c (_gpgme_cipher_algo_name): New. (_gpgme_cipher_mode_name): New. * tests/run-decrypt.c (print_result): Print SYMKEY_ALGO * src/util.h (_gpgme_map_gnupg_error): Remove obsolete prototype. -- Signed-off-by: Werner Koch <wk@gnupg.org>
This commit is contained in:
parent
3589da0500
commit
01435da498
1
NEWS
1
NEWS
@ -11,6 +11,7 @@ Noteworthy changes in version 1.10.1 (unreleased)
|
|||||||
gpgme_op_encrypt_sign_ext_start NEW.
|
gpgme_op_encrypt_sign_ext_start NEW.
|
||||||
GPGME_ENCRYPT_WANT_ADDRESS NEW.
|
GPGME_ENCRYPT_WANT_ADDRESS NEW.
|
||||||
gpgme_import_result_t EXTENDED: New field 'skipped_v3_keys'.
|
gpgme_import_result_t EXTENDED: New field 'skipped_v3_keys'.
|
||||||
|
gpgme_decrypt_result_t EXTENDED: New field 'symkey_algo'.
|
||||||
cpp: Key::locate NEW.
|
cpp: Key::locate NEW.
|
||||||
cpp: Data::toString NEW.
|
cpp: Data::toString NEW.
|
||||||
cpp: ImportResult::numV3KeysSkipped NEW.
|
cpp: ImportResult::numV3KeysSkipped NEW.
|
||||||
|
@ -5399,6 +5399,13 @@ You must not try to access this member of the struct unless
|
|||||||
or @code{gpgme_get_ctx_flag (ctx, "export-session-key")} returns true
|
or @code{gpgme_get_ctx_flag (ctx, "export-session-key")} returns true
|
||||||
(non-empty string).
|
(non-empty string).
|
||||||
|
|
||||||
|
@item char *symkey_algo
|
||||||
|
@since{1.11.0}
|
||||||
|
|
||||||
|
A string with the symmetric encryption algorithm and mode using the
|
||||||
|
format "<algo>.<mode>". Note that old non-MDC encryption mode of
|
||||||
|
OpenPGP is given as "PGPCFB".
|
||||||
|
|
||||||
@end table
|
@end table
|
||||||
@end deftp
|
@end deftp
|
||||||
|
|
||||||
|
@ -575,3 +575,49 @@ _gpgme_map_pk_algo (int algo, gpgme_protocol_t protocol)
|
|||||||
|
|
||||||
return algo;
|
return algo;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Return a string with a cipher algorithm. */
|
||||||
|
const char *
|
||||||
|
_gpgme_cipher_algo_name (int algo, gpgme_protocol_t protocol)
|
||||||
|
{
|
||||||
|
if (protocol == GPGME_PROTOCOL_OPENPGP)
|
||||||
|
{
|
||||||
|
/* The algo is given according to OpenPGP specs. */
|
||||||
|
switch (algo)
|
||||||
|
{
|
||||||
|
case 1: return "IDEA";
|
||||||
|
case 2: return "3DES";
|
||||||
|
case 3: return "CAST5";
|
||||||
|
case 4: return "BLOWFISH";
|
||||||
|
case 7: return "AES";
|
||||||
|
case 8: return "AES192";
|
||||||
|
case 9: return "AES256";
|
||||||
|
case 10: return "TWOFISH";
|
||||||
|
case 11: return "CAMELLIA128";
|
||||||
|
case 12: return "CAMELLIA192";
|
||||||
|
case 13: return "CAMELLIA256";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return "Unknown";
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Return a string with the cipher mode. */
|
||||||
|
const char *
|
||||||
|
_gpgme_cipher_mode_name (int algo, gpgme_protocol_t protocol)
|
||||||
|
{
|
||||||
|
if (protocol == GPGME_PROTOCOL_OPENPGP)
|
||||||
|
{
|
||||||
|
/* The algo is given according to OpenPGP specs. */
|
||||||
|
switch (algo)
|
||||||
|
{
|
||||||
|
case 0: return "CFB";
|
||||||
|
case 1: return "EAX";
|
||||||
|
case 2: return "OCB";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return "Unknown";
|
||||||
|
}
|
||||||
|
@ -69,14 +69,10 @@ release_op_data (void *hook)
|
|||||||
op_data_t opd = (op_data_t) hook;
|
op_data_t opd = (op_data_t) hook;
|
||||||
gpgme_recipient_t recipient = opd->result.recipients;
|
gpgme_recipient_t recipient = opd->result.recipients;
|
||||||
|
|
||||||
if (opd->result.unsupported_algorithm)
|
|
||||||
free (opd->result.unsupported_algorithm);
|
free (opd->result.unsupported_algorithm);
|
||||||
|
|
||||||
if (opd->result.file_name)
|
|
||||||
free (opd->result.file_name);
|
free (opd->result.file_name);
|
||||||
|
|
||||||
if (opd->result.session_key)
|
|
||||||
free (opd->result.session_key);
|
free (opd->result.session_key);
|
||||||
|
free (opd->result.symkey_algo);
|
||||||
|
|
||||||
while (recipient)
|
while (recipient)
|
||||||
{
|
{
|
||||||
@ -104,6 +100,17 @@ gpgme_op_decrypt_result (gpgme_ctx_t ctx)
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Make sure that SYMKEY_ALGO has a value. */
|
||||||
|
if (!opd->result.symkey_algo)
|
||||||
|
{
|
||||||
|
opd->result.symkey_algo = strdup ("?.?");
|
||||||
|
if (!opd->result.symkey_algo)
|
||||||
|
{
|
||||||
|
TRACE_SUC0 ("result=(null)");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (_gpgme_debug_trace ())
|
if (_gpgme_debug_trace ())
|
||||||
{
|
{
|
||||||
gpgme_recipient_t rcp;
|
gpgme_recipient_t rcp;
|
||||||
@ -263,6 +270,49 @@ parse_enc_to (char *args, gpgme_recipient_t *recp, gpgme_protocol_t protocol)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Parse the ARGS of a
|
||||||
|
* DECRYPTION_INFO <mdc_method> <sym_algo> [<aead_algo>]
|
||||||
|
* status. Returns 0 on success and updates the OPD.
|
||||||
|
*/
|
||||||
|
static gpgme_error_t
|
||||||
|
parse_decryption_info (char *args, op_data_t opd, gpgme_protocol_t protocol)
|
||||||
|
{
|
||||||
|
char *field[3];
|
||||||
|
int nfields;
|
||||||
|
char *args2;
|
||||||
|
int mdc, mode;
|
||||||
|
const char *algostr, *modestr;
|
||||||
|
|
||||||
|
if (!args)
|
||||||
|
return trace_gpg_error (GPG_ERR_INV_ENGINE);
|
||||||
|
|
||||||
|
args2 = strdup (args); /* Split modifies the input string. */
|
||||||
|
nfields = _gpgme_split_fields (args2, field, DIM (field));
|
||||||
|
if (nfields < 2)
|
||||||
|
{
|
||||||
|
free (args2);
|
||||||
|
return trace_gpg_error (GPG_ERR_INV_ENGINE); /* Required arg missing. */
|
||||||
|
}
|
||||||
|
|
||||||
|
mdc = atoi (field[0]);
|
||||||
|
algostr = _gpgme_cipher_algo_name (atoi (field[1]), protocol);
|
||||||
|
mode = nfields < 3? 0 : atoi (field[2]);
|
||||||
|
modestr = _gpgme_cipher_mode_name (mode, protocol);
|
||||||
|
|
||||||
|
free (args2);
|
||||||
|
|
||||||
|
free (opd->result.symkey_algo);
|
||||||
|
if (!mode && mdc != 2)
|
||||||
|
opd->result.symkey_algo = _gpgme_strconcat (algostr, ".PGPCFB", NULL);
|
||||||
|
else
|
||||||
|
opd->result.symkey_algo = _gpgme_strconcat (algostr, ".", modestr, NULL);
|
||||||
|
if (!opd->result.symkey_algo)
|
||||||
|
return gpg_error_from_syserror ();
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
gpgme_error_t
|
gpgme_error_t
|
||||||
_gpgme_decrypt_status_handler (void *priv, gpgme_status_code_t code,
|
_gpgme_decrypt_status_handler (void *priv, gpgme_status_code_t code,
|
||||||
char *args)
|
char *args)
|
||||||
@ -303,7 +353,9 @@ _gpgme_decrypt_status_handler (void *priv, gpgme_status_code_t code,
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case GPGME_STATUS_DECRYPTION_INFO:
|
case GPGME_STATUS_DECRYPTION_INFO:
|
||||||
/* Fixme: Provide a way to return the used symmetric algorithm. */
|
err = parse_decryption_info (args, opd, ctx->protocol);
|
||||||
|
if (err)
|
||||||
|
return err;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case GPGME_STATUS_DECRYPTION_OKAY:
|
case GPGME_STATUS_DECRYPTION_OKAY:
|
||||||
|
@ -1368,6 +1368,10 @@ struct _gpgme_op_decrypt_result
|
|||||||
/* A textual representation of the session key used to decrypt the
|
/* A textual representation of the session key used to decrypt the
|
||||||
* message, if available */
|
* message, if available */
|
||||||
char *session_key;
|
char *session_key;
|
||||||
|
|
||||||
|
/* A string with the symmetric encryption algorithm and mode using
|
||||||
|
* the format "<algo>.<mode>". */
|
||||||
|
char *symkey_algo;
|
||||||
};
|
};
|
||||||
typedef struct _gpgme_op_decrypt_result *gpgme_decrypt_result_t;
|
typedef struct _gpgme_op_decrypt_result *gpgme_decrypt_result_t;
|
||||||
|
|
||||||
|
@ -165,10 +165,11 @@ time_t _gpgme_parse_timestamp (const char *timestamp, char **endp);
|
|||||||
* on error or missing timestamp. */
|
* on error or missing timestamp. */
|
||||||
unsigned long _gpgme_parse_timestamp_ul (const char *timestamp);
|
unsigned long _gpgme_parse_timestamp_ul (const char *timestamp);
|
||||||
|
|
||||||
gpgme_error_t _gpgme_map_gnupg_error (char *err);
|
|
||||||
|
|
||||||
int _gpgme_map_pk_algo (int algo, gpgme_protocol_t protocol);
|
int _gpgme_map_pk_algo (int algo, gpgme_protocol_t protocol);
|
||||||
|
|
||||||
|
const char *_gpgme_cipher_algo_name (int algo, gpgme_protocol_t protocol);
|
||||||
|
const char *_gpgme_cipher_mode_name (int algo, gpgme_protocol_t protocol);
|
||||||
|
|
||||||
|
|
||||||
/*-- b64dec.c --*/
|
/*-- b64dec.c --*/
|
||||||
|
|
||||||
|
@ -59,6 +59,7 @@ print_result (gpgme_decrypt_result_t result)
|
|||||||
nonnull(result->unsupported_algorithm));
|
nonnull(result->unsupported_algorithm));
|
||||||
if (result->session_key)
|
if (result->session_key)
|
||||||
printf ("Session key: %s\n", result->session_key);
|
printf ("Session key: %s\n", result->session_key);
|
||||||
|
printf ("Symmetric algorithm: %s\n", result->symkey_algo);
|
||||||
|
|
||||||
for (recp = result->recipients; recp && recp->next; recp = recp->next)
|
for (recp = result->recipients; recp && recp->next; recp = recp->next)
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user