mirror of
git://git.gnupg.org/gnupg.git
synced 2025-04-13 22:21:09 +02:00
gpg: Verify multiple detached signatures with different hash algos.
* g10/mainproc.c (proc_tree): Loose check. Enable all algos. Signed-off-by: Werner Koch <wk@gnupg.org>
This commit is contained in:
parent
ece9ade4b4
commit
8fced66be3
@ -2359,11 +2359,16 @@ proc_tree (CTX c, kbnode_t node)
|
|||||||
for (; n1; (n1 = find_next_kbnode(n1, PKT_SIGNATURE)))
|
for (; n1; (n1 = find_next_kbnode(n1, PKT_SIGNATURE)))
|
||||||
{
|
{
|
||||||
/* We can't currently handle multiple signatures of
|
/* We can't currently handle multiple signatures of
|
||||||
different classes or digests (we'd pretty much have
|
* different classes (we'd pretty much have to run a
|
||||||
to run a different hash context for each), but if
|
* different hash context for each), but if they are all
|
||||||
they are all the same, make an exception. */
|
* the same and it is detached signature, we make an
|
||||||
|
* exception. Note that the old code also disallowed
|
||||||
|
* multiple signatures if the digest algorithms are
|
||||||
|
* different. We softened this restriction only for
|
||||||
|
* detached signatures, to be on the safe side. */
|
||||||
if (n1->pkt->pkt.signature->sig_class != class
|
if (n1->pkt->pkt.signature->sig_class != class
|
||||||
|| n1->pkt->pkt.signature->digest_algo != hash)
|
|| (c->any.data
|
||||||
|
&& n1->pkt->pkt.signature->digest_algo != hash))
|
||||||
{
|
{
|
||||||
multiple_ok = 0;
|
multiple_ok = 0;
|
||||||
log_info (_("WARNING: multiple signatures detected. "
|
log_info (_("WARNING: multiple signatures detected. "
|
||||||
@ -2385,6 +2390,17 @@ proc_tree (CTX c, kbnode_t node)
|
|||||||
if (rc)
|
if (rc)
|
||||||
goto detached_hash_err;
|
goto detached_hash_err;
|
||||||
|
|
||||||
|
if (multiple_ok)
|
||||||
|
{
|
||||||
|
/* If we have and want to handle multiple signatures we
|
||||||
|
* need to enable all hash algorithms for the context. */
|
||||||
|
for (n1 = node; (n1 = find_next_kbnode (n1, PKT_SIGNATURE)); )
|
||||||
|
if (!openpgp_md_test_algo (n1->pkt->pkt.signature->digest_algo))
|
||||||
|
gcry_md_enable (c->mfx.md,
|
||||||
|
map_md_openpgp_to_gcry
|
||||||
|
(n1->pkt->pkt.signature->digest_algo));
|
||||||
|
}
|
||||||
|
|
||||||
if (RFC2440 || RFC4880)
|
if (RFC2440 || RFC4880)
|
||||||
; /* Strict RFC mode. */
|
; /* Strict RFC mode. */
|
||||||
else if (sig->digest_algo == DIGEST_ALGO_SHA1
|
else if (sig->digest_algo == DIGEST_ALGO_SHA1
|
||||||
@ -2392,7 +2408,9 @@ proc_tree (CTX c, kbnode_t node)
|
|||||||
&& sig->sig_class == 0x01)
|
&& sig->sig_class == 0x01)
|
||||||
{
|
{
|
||||||
/* Enable a workaround for a pgp5 bug when the detached
|
/* Enable a workaround for a pgp5 bug when the detached
|
||||||
* signature has been created in textmode. */
|
* signature has been created in textmode. Note that we
|
||||||
|
* do not implement this for multiple signatures with
|
||||||
|
* different hash algorithms. */
|
||||||
rc = gcry_md_open (&c->mfx.md2, sig->digest_algo, 0);
|
rc = gcry_md_open (&c->mfx.md2, sig->digest_algo, 0);
|
||||||
if (rc)
|
if (rc)
|
||||||
goto detached_hash_err;
|
goto detached_hash_err;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user