mirror of
git://git.gnupg.org/gnupg.git
synced 2025-01-03 12:11:33 +01:00
gpg: Print a warning for too much data encrypted with 3DES et al.
* g10/filter.h (cipher_filter_context_t): Remove unused filed 'create_mdc'. Turn field 'header' into a bit field. Add new fields 'short_blklen_warn' and 'short_blklen_count'. * g10/cipher.c (write_header): Print a warning if MDC is not used. (cipher_filter): Print a warning for long messages encrypted with a short block length algorithm. -- Note that to test this warning in a reliable way compression needs to be disabled. Signed-off-by: Werner Koch <wk@gnupg.org>
This commit is contained in:
parent
b5333e13cb
commit
416cf9e9be
26
g10/cipher.c
26
g10/cipher.c
@ -64,6 +64,11 @@ write_header (cipher_filter_context_t *cfx, iobuf_t a)
|
|||||||
if (DBG_HASHING)
|
if (DBG_HASHING)
|
||||||
gcry_md_debug (cfx->mdc_hash, "creatmdc");
|
gcry_md_debug (cfx->mdc_hash, "creatmdc");
|
||||||
}
|
}
|
||||||
|
else if (!opt.no_mdc_warn)
|
||||||
|
{
|
||||||
|
log_info ("WARNING: "
|
||||||
|
"encrypting without integrity protection is dangerous\n");
|
||||||
|
}
|
||||||
|
|
||||||
write_status_printf (STATUS_BEGIN_ENCRYPTION, "%d %d",
|
write_status_printf (STATUS_BEGIN_ENCRYPTION, "%d %d",
|
||||||
ed.mdc_method, cfx->dek->algo);
|
ed.mdc_method, cfx->dek->algo);
|
||||||
@ -91,7 +96,6 @@ write_header (cipher_filter_context_t *cfx, iobuf_t a)
|
|||||||
BUG();
|
BUG();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* log_hexdump ("thekey", cfx->dek->key, cfx->dek->keylen); */
|
/* log_hexdump ("thekey", cfx->dek->key, cfx->dek->keylen); */
|
||||||
gcry_cipher_setkey (cfx->cipher_hd, cfx->dek->key, cfx->dek->keylen);
|
gcry_cipher_setkey (cfx->cipher_hd, cfx->dek->key, cfx->dek->keylen);
|
||||||
gcry_cipher_setiv (cfx->cipher_hd, NULL, 0);
|
gcry_cipher_setiv (cfx->cipher_hd, NULL, 0);
|
||||||
@ -101,7 +105,11 @@ write_header (cipher_filter_context_t *cfx, iobuf_t a)
|
|||||||
gcry_cipher_encrypt (cfx->cipher_hd, temp, nprefix+2, NULL, 0);
|
gcry_cipher_encrypt (cfx->cipher_hd, temp, nprefix+2, NULL, 0);
|
||||||
gcry_cipher_sync (cfx->cipher_hd);
|
gcry_cipher_sync (cfx->cipher_hd);
|
||||||
iobuf_write (a, temp, nprefix+2);
|
iobuf_write (a, temp, nprefix+2);
|
||||||
cfx->header = 1;
|
|
||||||
|
cfx->short_blklen_warn = (blocksize < 16);
|
||||||
|
cfx->short_blklen_count = nprefix+2;
|
||||||
|
|
||||||
|
cfx->wrote_header = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -122,11 +130,23 @@ cipher_filter (void *opaque, int control, iobuf_t a, byte *buf, size_t *ret_len)
|
|||||||
else if (control == IOBUFCTRL_FLUSH) /* encrypt */
|
else if (control == IOBUFCTRL_FLUSH) /* encrypt */
|
||||||
{
|
{
|
||||||
log_assert (a);
|
log_assert (a);
|
||||||
if (!cfx->header)
|
if (!cfx->wrote_header)
|
||||||
write_header (cfx, a);
|
write_header (cfx, a);
|
||||||
if (cfx->mdc_hash)
|
if (cfx->mdc_hash)
|
||||||
gcry_md_write (cfx->mdc_hash, buf, size);
|
gcry_md_write (cfx->mdc_hash, buf, size);
|
||||||
gcry_cipher_encrypt (cfx->cipher_hd, buf, size, NULL, 0);
|
gcry_cipher_encrypt (cfx->cipher_hd, buf, size, NULL, 0);
|
||||||
|
if (cfx->short_blklen_warn)
|
||||||
|
{
|
||||||
|
cfx->short_blklen_count += size;
|
||||||
|
if (cfx->short_blklen_count > (150 * 1024 * 1024))
|
||||||
|
{
|
||||||
|
log_info ("WARNING: encrypting more than %d MiB with algorithm "
|
||||||
|
"%s should be avoided\n", 150,
|
||||||
|
openpgp_cipher_algo_name (cfx->dek->algo));
|
||||||
|
cfx->short_blklen_warn = 0; /* Don't show again. */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
rc = iobuf_write (a, buf, size);
|
rc = iobuf_write (a, buf, size);
|
||||||
}
|
}
|
||||||
else if (control == IOBUFCTRL_FREE)
|
else if (control == IOBUFCTRL_FREE)
|
||||||
|
@ -92,10 +92,11 @@ typedef struct {
|
|||||||
DEK *dek;
|
DEK *dek;
|
||||||
u32 datalen;
|
u32 datalen;
|
||||||
gcry_cipher_hd_t cipher_hd;
|
gcry_cipher_hd_t cipher_hd;
|
||||||
int header;
|
unsigned int wrote_header : 1;
|
||||||
|
unsigned int short_blklen_warn : 1;
|
||||||
|
unsigned long short_blklen_count;
|
||||||
gcry_md_hd_t mdc_hash;
|
gcry_md_hd_t mdc_hash;
|
||||||
byte enchash[20];
|
byte enchash[20];
|
||||||
int create_mdc; /* flag will be set by the cipher filter */
|
|
||||||
} cipher_filter_context_t;
|
} cipher_filter_context_t;
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user