gpg: Hard fail on a missing MDC even for legacy algorithms.
authorWerner Koch <wk@gnupg.org>
Tue, 15 May 2018 10:33:03 +0000 (12:33 +0200)
committerWerner Koch <wk@gnupg.org>
Tue, 15 May 2018 10:38:17 +0000 (12:38 +0200)
* g10/mainproc.c (proc_encrypted): Require an MDC or AEAD
* tests/openpgp/defs.scm (create-gpghome): Use --ignore-mdc-error to
allow testing with the current files.

Signed-off-by: Werner Koch <wk@gnupg.org>
doc/gpg.texi
g10/mainproc.c
tests/openpgp/defs.scm

index 7b142cc..544ed18 100644 (file)
@@ -3230,10 +3230,11 @@ to ignore CRC errors.
 @item --ignore-mdc-error
 @opindex ignore-mdc-error
 This option changes a MDC integrity protection failure into a warning.
-This can be useful if a message is partially corrupt, but it is
-necessary to get as much data as possible out of the corrupt message.
-However, be aware that a MDC protection failure may also mean that the
-message was tampered with intentionally by an attacker.
+It is required to decrypt old messages which did not use an MDC.  It
+may also be useful if a message is partially garbled, but it is
+necessary to get as much data as possible out of that garbled message.
+Be aware that a missing or failed MDC can be an indication of an
+attack.  Use with caution.
 
 @item --allow-weak-digest-algos
 @opindex allow-weak-digest-algos
index ea3721a..a991203 100644 (file)
@@ -738,15 +738,12 @@ proc_encrypted (CTX c, PACKET *pkt)
   else if (!result
            && !opt.ignore_mdc_error
            && !pkt->pkt.encrypted->mdc_method
-           && !pkt->pkt.encrypted->aead_algo
-           && openpgp_cipher_get_algo_blklen (c->dek->algo) != 8
-           && c->dek->algo != CIPHER_ALGO_TWOFISH)
-    {
-      /* The message has been decrypted but has no MDC despite that a
-         modern cipher (blocklength != 64 bit, except for Twofish) is
-         used and the option to ignore MDC errors is not used: To
-         avoid attacks changing an MDC message to a non-MDC message,
-         we fail here.  */
+           && !pkt->pkt.encrypted->aead_algo)
+    {
+      /* The message has been decrypted but does not carry an MDC or
+       * uses AEAD encryption.  --ignore-mdc-error has also not been
+       * used.  To avoid attacks changing an MDC message to a non-MDC
+       * message, we fail here.  */
       log_error (_("WARNING: message was not integrity protected\n"));
       if (opt.verbose > 1)
         log_info ("decryption forced to fail\n");
index afd69a0..186efe0 100644 (file)
                "no-auto-key-retrieve"
                "no-auto-key-locate"
               "allow-weak-digest-algos"
+               "ignore-mdc-error"
               (if have-opt-always-trust
                   "no-auto-check-trustdb" "#no-auto-check-trustdb")
               (string-append "agent-program "