diff options
| author | Daniel Schadt <kingdread@gmx.de> | 2025-08-16 20:54:53 +0200 | 
|---|---|---|
| committer | Daniel Schadt <kingdread@gmx.de> | 2025-08-16 20:54:53 +0200 | 
| commit | 6bd93d13bf6fcc64c8671c938d0e719f8c83e673 (patch) | |
| tree | f3d33e5d96bbe8f540fc1da85d06f5de095de4b2 /src | |
| parent | 180f4b3817ee841391ccd83a9a9701e950833dfa (diff) | |
| download | zears-6bd93d13bf6fcc64c8671c938d0e719f8c83e673.tar.gz zears-6bd93d13bf6fcc64c8671c938d0e719f8c83e673.tar.bz2 zears-6bd93d13bf6fcc64c8671c938d0e719f8c83e673.zip  | |
rework encrypt to take IntoIterator<AsRef<[u8]>>
The trick is to use an intermediate enum which can either contain a
slice (the local tau block/nonce) or the passed in AsRef. This way, we
unify the two types.
Diffstat (limited to 'src')
| -rw-r--r-- | src/lib.rs | 22 | 
1 files changed, 18 insertions, 4 deletions
@@ -135,6 +135,20 @@ enum Mode {      Decipher,  } +enum SliceOrAsRef<'a, A> { +    Slice(&'a [u8]), +    AsRef(A), +} + +impl<'a, A: AsRef<[u8]>> AsRef<[u8]> for SliceOrAsRef<'a, A> { +    fn as_ref(&self) -> &[u8] { +        match self { +            SliceOrAsRef::Slice(x) => *x, +            SliceOrAsRef::AsRef(x) => x.as_ref(), +        } +    } +} +  /// AEZ encryption scheme.  ///  /// See the [module level documentation](index.html) for more information. @@ -335,7 +349,7 @@ fn append_auth(data_len: usize, buffer: &mut [u8]) {      }  } -fn encrypt<'t, A: AsRef<[u8]> + 't, T: IntoIterator<Item = &'t A>>( +fn encrypt<A: AsRef<[u8]>, T: IntoIterator<Item = A>>(      aez: &Aez,      nonce: &[u8],      ad: T, @@ -345,9 +359,9 @@ fn encrypt<'t, A: AsRef<[u8]> + 't, T: IntoIterator<Item = &'t A>>(      // We treat tau as bytes, but according to the spec, tau is actually in bits.      let tau_block = Block::from_int(tau as u128 * 8);      let tau_bytes = tau_block.bytes(); -    let tweaks = iter::once(&tau_bytes as &[_]) -        .chain(iter::once(nonce)) -        .chain(ad.into_iter().map(|r| r.as_ref())); +    let tweaks = iter::once(SliceOrAsRef::Slice(&tau_bytes)) +        .chain(iter::once(SliceOrAsRef::Slice(nonce))) +        .chain(ad.into_iter().map(SliceOrAsRef::AsRef));      assert!(buffer.len() >= tau as usize);      if buffer.len() == tau as usize {          // As aez_prf only xor's the input in, we have to clear the buffer first  | 
