From 8420e63e123260b0df9ab94a26b50f864eeeae8c Mon Sep 17 00:00:00 2001 From: Dan Draper Date: Fri, 8 Aug 2025 22:10:30 +1000 Subject: [PATCH] feat: implement Decrypt and Encrypt traits for Equatable type fixes #36 --- packages/aead/src/decrypt.rs | 23 ++++++++++++++++++++++- packages/aead/src/encrypt.rs | 19 ++++++++++++++++++- 2 files changed, 40 insertions(+), 2 deletions(-) diff --git a/packages/aead/src/decrypt.rs b/packages/aead/src/decrypt.rs index 23f2dd7..405e82b 100644 --- a/packages/aead/src/decrypt.rs +++ b/packages/aead/src/decrypt.rs @@ -1,5 +1,5 @@ use crate::{aad::IntoAad, cipher::Unspecified, Cipher, LocalCipherText}; -use vitaminc_protected::{Controlled, Protected}; +use vitaminc_protected::{Controlled, Equatable, Protected}; use zeroize::Zeroize; pub trait Decrypt: Sized { @@ -97,3 +97,24 @@ where Ok(Protected::init_from_inner(inner)) } } + +impl Decrypt for Equatable +where + Self: Controlled, + as Controlled>::Inner: Decrypt, +{ + type Encrypted = < as Controlled>::Inner as Decrypt>::Encrypted; + + fn decrypt_with_aad<'a, C, A>( + encrypted: Self::Encrypted, + cipher: &C, + aad: A, + ) -> Result + where + C: Cipher, + A: IntoAad<'a>, + { + let inner = as Controlled>::Inner::decrypt_with_aad(encrypted, cipher, aad)?; + Ok(Equatable::init_from_inner(inner)) + } +} diff --git a/packages/aead/src/encrypt.rs b/packages/aead/src/encrypt.rs index 6da401c..d9a9ee6 100644 --- a/packages/aead/src/encrypt.rs +++ b/packages/aead/src/encrypt.rs @@ -3,7 +3,7 @@ use crate::{ cipher::{Cipher, Unspecified}, LocalCipherText, }; -use vitaminc_protected::{Controlled, Protected}; +use vitaminc_protected::{Controlled, Equatable, Protected}; use zeroize::Zeroize; pub trait Encrypt: Sized { @@ -97,6 +97,23 @@ where } } +impl Encrypt for Equatable +where + Self: Controlled, + as Controlled>::Inner: Encrypt, +{ + type Encrypted = < as Controlled>::Inner as Encrypt>::Encrypted; + + fn encrypt_with_aad<'a, C, A>(self, cipher: &C, aad: A) -> Result + where + C: Cipher, + A: IntoAad<'a>, + Self: 'a, + { + self.risky_unwrap().encrypt_with_aad(cipher, aad) + } +} + #[cfg(test)] mod tests { use super::*;