diff options
Diffstat (limited to 'openpgp/src/crypto/backend/cng/aead.rs')
-rw-r--r-- | openpgp/src/crypto/backend/cng/aead.rs | 11 |
1 files changed, 9 insertions, 2 deletions
diff --git a/openpgp/src/crypto/backend/cng/aead.rs b/openpgp/src/crypto/backend/cng/aead.rs index c714efbb..a3aaefb4 100644 --- a/openpgp/src/crypto/backend/cng/aead.rs +++ b/openpgp/src/crypto/backend/cng/aead.rs @@ -127,7 +127,7 @@ macro_rules! impl_aead { dst[src.len()..].copy_from_slice(&tag[..]); Ok(()) } - fn decrypt_verify(&mut self, _dst: &mut [u8], _src: &[u8], _digest: &[u8]) -> Result<()> { + fn decrypt_verify(&mut self, _dst: &mut [u8], _src: &[u8]) -> Result<()> { panic!("AEAD decryption called in the encryption context") } } @@ -141,7 +141,14 @@ macro_rules! impl_aead { fn encrypt_seal(&mut self, _dst: &mut [u8], _src: &[u8]) -> Result<()> { panic!("AEAD encryption called in the decryption context") } - fn decrypt_verify(&mut self, dst: &mut [u8], src: &[u8], digest: &[u8]) -> Result<()> { + fn decrypt_verify(&mut self, dst: &mut [u8], src: &[u8]) -> Result<()> { + debug_assert_eq!(dst.len() + self.digest_size(), src.len()); + + // Split src into ciphertext and digest. + let l = self.digest_size(); + let digest = &src[src.len().saturating_sub(l)..]; + let src = &src[..src.len().saturating_sub(l)]; + let len = core::cmp::min(dst.len(), src.len()); dst[..len].copy_from_slice(&src[..len]); self.decrypt_unauthenticated_hazmat(&mut dst[..len]); |