diff options
author | Jussi Kivilinna <jussi.kivilinna@iki.fi> | 2013-11-19 23:26:27 +0200 |
---|---|---|
committer | Jussi Kivilinna <jussi.kivilinna@iki.fi> | 2013-11-20 18:37:24 +0200 |
commit | 32a2da9abc91394b23cf565c1c833fa964394083 (patch) | |
tree | 3a452c86187e6fdbfdf61968bdbed91749162d33 /cipher/cipher-gcm.c | |
parent | 018f08354b1b116672e82f9ce942884b288aaf9e (diff) | |
download | libgcrypt-32a2da9abc91394b23cf565c1c833fa964394083.tar.gz |
GCM: Add clearing and checking of marks.tag
* cipher/cipher-gcm.c (_gcry_cipher_gcm_encrypt)
(_gcry_cipher_gcm_decrypt, _gcry_cipher_gcm_authenticate): Make sure
that tag has not been finalized yet.
(_gcry_cipher_gcm_setiv): Clear 'marks.tag'.
--
Signed-off-by: Jussi Kivilinna <jussi.kivilinna@iki.fi>
Diffstat (limited to 'cipher/cipher-gcm.c')
-rw-r--r-- | cipher/cipher-gcm.c | 7 |
1 files changed, 7 insertions, 0 deletions
diff --git a/cipher/cipher-gcm.c b/cipher/cipher-gcm.c index cf666ab8..124fe3e8 100644 --- a/cipher/cipher-gcm.c +++ b/cipher/cipher-gcm.c @@ -844,6 +844,8 @@ _gcry_cipher_gcm_encrypt (gcry_cipher_hd_t c, return GPG_ERR_BUFFER_TOO_SHORT; if (c->u_mode.gcm.datalen_over_limits) return GPG_ERR_INV_LENGTH; + if (c->marks.tag) + return GPG_ERR_INV_STATE; if (!c->marks.iv) _gcry_cipher_gcm_setiv (c, zerobuf, GCRY_GCM_BLOCK_LEN); @@ -878,6 +880,8 @@ _gcry_cipher_gcm_decrypt (gcry_cipher_hd_t c, return GPG_ERR_BUFFER_TOO_SHORT; if (c->u_mode.gcm.datalen_over_limits) return GPG_ERR_INV_LENGTH; + if (c->marks.tag) + return GPG_ERR_INV_STATE; if (!c->marks.iv) _gcry_cipher_gcm_setiv (c, zerobuf, GCRY_GCM_BLOCK_LEN); @@ -905,6 +909,8 @@ _gcry_cipher_gcm_authenticate (gcry_cipher_hd_t c, return GPG_ERR_CIPHER_ALGO; if (c->u_mode.gcm.datalen_over_limits) return GPG_ERR_INV_LENGTH; + if (c->marks.tag) + return GPG_ERR_INV_STATE; if (!c->marks.iv) _gcry_cipher_gcm_setiv (c, zerobuf, GCRY_GCM_BLOCK_LEN); @@ -980,6 +986,7 @@ _gcry_cipher_gcm_setiv (gcry_cipher_hd_t c, const byte *iv, size_t ivlen) c->unused = 0; c->marks.iv = 1; + c->marks.tag = 0; return 0; } |