diff options
author | Daiki Ueno <dueno@redhat.com> | 2019-10-01 18:15:19 +0200 |
---|---|---|
committer | Daiki Ueno <dueno@redhat.com> | 2019-10-06 09:00:37 +0200 |
commit | 6df0cf1c0ec727fc237a9b429684c8f2ef5d34b7 (patch) | |
tree | 5de2971b62312b8573c54f0c4befefed27d8d1bc /lib/crypto-api.c | |
parent | c684814cc456a9792a9183ce77d32d435f29e6b7 (diff) | |
download | gnutls-tmp-iov-fixes.tar.gz |
gnutls_aead_cipher_{en,de}cryptv2: write back cached data to bufferstmp-iov-fixes
Previously, those functions failed to write the output to the buffers
if the buffer length is not multiple of cipher block size. This makes
sure that the cached data is always flushed.
Signed-off-by: Daiki Ueno <dueno@redhat.com>
Diffstat (limited to 'lib/crypto-api.c')
-rw-r--r-- | lib/crypto-api.c | 18 |
1 files changed, 16 insertions, 2 deletions
diff --git a/lib/crypto-api.c b/lib/crypto-api.c index 41e759b74e..7308d7e7bb 100644 --- a/lib/crypto-api.c +++ b/lib/crypto-api.c @@ -1113,6 +1113,7 @@ gnutls_aead_cipher_encryptv2(gnutls_aead_cipher_hd_t handle, api_aead_cipher_hd_st *h = handle; ssize_t ret; uint8_t *p; + size_t len; ssize_t blocksize = handle->ctx_enc.e->blocksize; struct iov_iter_st iter; size_t _tag_size; @@ -1211,7 +1212,13 @@ gnutls_aead_cipher_encryptv2(gnutls_aead_cipher_hd_t handle, return gnutls_assert_val(ret); if (ret == 0) break; - ret = _gnutls_cipher_encrypt2(&handle->ctx_enc, p, ret, p, ret); + + len = ret; + ret = _gnutls_cipher_encrypt2(&handle->ctx_enc, p, len, p, len); + if (unlikely(ret < 0)) + return gnutls_assert_val(ret); + + ret = _gnutls_iov_iter_sync(&iter, p, len); if (unlikely(ret < 0)) return gnutls_assert_val(ret); } @@ -1253,6 +1260,7 @@ gnutls_aead_cipher_decryptv2(gnutls_aead_cipher_hd_t handle, api_aead_cipher_hd_st *h = handle; ssize_t ret; uint8_t *p; + size_t len; ssize_t blocksize = handle->ctx_enc.e->blocksize; struct iov_iter_st iter; uint8_t _tag[MAX_HASH_SIZE]; @@ -1342,7 +1350,13 @@ gnutls_aead_cipher_decryptv2(gnutls_aead_cipher_hd_t handle, return gnutls_assert_val(ret); if (ret == 0) break; - ret = _gnutls_cipher_decrypt2(&handle->ctx_enc, p, ret, p, ret); + + len = ret; + ret = _gnutls_cipher_decrypt2(&handle->ctx_enc, p, len, p, len); + if (unlikely(ret < 0)) + return gnutls_assert_val(ret); + + ret = _gnutls_iov_iter_sync(&iter, p, len); if (unlikely(ret < 0)) return gnutls_assert_val(ret); } |