summaryrefslogtreecommitdiffstats
path: root/openpgp/src/crypto/backend/cng/aead.rs
diff options
context:
space:
mode:
Diffstat (limited to 'openpgp/src/crypto/backend/cng/aead.rs')
-rw-r--r--openpgp/src/crypto/backend/cng/aead.rs35
1 files changed, 25 insertions, 10 deletions
diff --git a/openpgp/src/crypto/backend/cng/aead.rs b/openpgp/src/crypto/backend/cng/aead.rs
index aaa9c854..a7b87613 100644
--- a/openpgp/src/crypto/backend/cng/aead.rs
+++ b/openpgp/src/crypto/backend/cng/aead.rs
@@ -10,11 +10,22 @@ use win_crypto_ng::symmetric::{BlockCipherKey, Aes};
use win_crypto_ng::symmetric::block_cipher::generic_array::{GenericArray, ArrayLength};
use win_crypto_ng::symmetric::block_cipher::generic_array::typenum::{U128, U192, U256};
-trait GenericArrayExt {
+trait GenericArrayExt<T, N: ArrayLength<T>> {
const LEN: usize;
+
+ /// Like [`GenericArray::from_slice`], but fallible.
+ fn try_from_slice(slice: &[T]) -> Result<&GenericArray<T, N>> {
+ if slice.len() == Self::LEN {
+ Ok(GenericArray::from_slice(slice))
+ } else {
+ Err(Error::InvalidArgument(
+ format!("Invalid slice length, want {}, got {}",
+ Self::LEN, slice.len())).into())
+ }
+ }
}
-impl<T, N: ArrayLength<T>> GenericArrayExt for GenericArray<T, N> {
+impl<T, N: ArrayLength<T>> GenericArrayExt<T, N> for GenericArray<T, N> {
const LEN: usize = N::USIZE;
}
@@ -30,8 +41,8 @@ impl AEADAlgorithm {
match self {
AEADAlgorithm::EAX => match sym_algo {
| SymmetricAlgorithm::AES128 => {
- let key = GenericArray::from_slice(key);
- let nonce = GenericArray::from_slice(nonce);
+ let key = GenericArray::try_from_slice(key)?;
+ let nonce = GenericArray::try_from_slice(nonce)?;
Ok(match op {
CipherOp::Encrypt =>
Box::new(EaxOnline::<BlockCipherKey<Aes, U128>, Encrypt>::with_key_and_nonce(key, nonce)),
@@ -40,8 +51,8 @@ impl AEADAlgorithm {
})
}
SymmetricAlgorithm::AES192 => {
- let key = GenericArray::from_slice(key);
- let nonce = GenericArray::from_slice(nonce);
+ let key = GenericArray::try_from_slice(key)?;
+ let nonce = GenericArray::try_from_slice(nonce)?;
Ok(match op {
CipherOp::Encrypt =>
Box::new(EaxOnline::<BlockCipherKey<Aes, U192>, Encrypt>::with_key_and_nonce(key, nonce)),
@@ -50,8 +61,8 @@ impl AEADAlgorithm {
})
}
SymmetricAlgorithm::AES256 => {
- let key = GenericArray::from_slice(key);
- let nonce = GenericArray::from_slice(nonce);
+ let key = GenericArray::try_from_slice(key)?;
+ let nonce = GenericArray::try_from_slice(nonce)?;
Ok(match op {
CipherOp::Encrypt =>
Box::new(EaxOnline::<BlockCipherKey<Aes, U256>, Encrypt>::with_key_and_nonce(key, nonce)),
@@ -71,7 +82,9 @@ macro_rules! impl_aead {
$(
impl Aead for EaxOnline<$type, Encrypt> {
fn update(&mut self, ad: &[u8]) { self.update_assoc(ad) }
- fn digest_size(&self) -> usize { <eax::Tag as GenericArrayExt>::LEN }
+ fn digest_size(&self) -> usize {
+ <eax::Tag as GenericArrayExt<_, _>>::LEN
+ }
fn digest(&mut self, digest: &mut [u8]) {
let tag = self.tag_clone();
digest[..tag.len()].copy_from_slice(&tag[..]);
@@ -90,7 +103,9 @@ macro_rules! impl_aead {
$(
impl Aead for EaxOnline<$type, Decrypt> {
fn update(&mut self, ad: &[u8]) { self.update_assoc(ad) }
- fn digest_size(&self) -> usize { <eax::Tag as GenericArrayExt>::LEN }
+ fn digest_size(&self) -> usize {
+ <eax::Tag as GenericArrayExt<_, _>>::LEN
+ }
fn digest(&mut self, digest: &mut [u8]) {
let tag = self.tag_clone();
digest[..tag.len()].copy_from_slice(&tag[..]);