Skip to main content

magic_crypt/
traits.rs

1use alloc::{string::String, vec::Vec};
2#[cfg(feature = "std")]
3use std::io::{Read, Write};
4
5use base64::Engine;
6
7use crate::MagicCryptError;
8#[cfg(feature = "std")]
9use crate::array::ArraySize;
10#[cfg(feature = "std")]
11use crate::array::typenum::{IsGreaterOrEqual, PartialDiv, True, U16, U4096};
12
13/// Methods for `MagicCrypt` and `MagicCrypt<bits>` structs.
14pub trait MagicCryptTrait {
15    fn new<S: AsRef<[u8]>, V: AsRef<[u8]>>(key: S, iv: Option<V>) -> Self;
16
17    #[inline]
18    fn encrypt_str_to_base64<S: AsRef<str>>(&self, string: S) -> String {
19        self.encrypt_to_base64(string.as_ref())
20    }
21
22    #[inline]
23    fn encrypt_str_to_bytes<S: AsRef<str>>(&self, string: S) -> Vec<u8> {
24        self.encrypt_to_bytes(string.as_ref())
25    }
26
27    #[inline]
28    fn encrypt_bytes_to_base64<T: ?Sized + AsRef<[u8]>>(&self, bytes: &T) -> String {
29        self.encrypt_to_base64(bytes)
30    }
31
32    #[inline]
33    fn encrypt_bytes_to_bytes<T: ?Sized + AsRef<[u8]>>(&self, bytes: &T) -> Vec<u8> {
34        self.encrypt_to_bytes(bytes)
35    }
36
37    #[inline]
38    fn encrypt_to_base64<T: ?Sized + AsRef<[u8]>>(&self, data: &T) -> String {
39        base64::engine::general_purpose::STANDARD.encode(self.encrypt_to_bytes(data))
40    }
41
42    fn encrypt_to_bytes<T: ?Sized + AsRef<[u8]>>(&self, data: &T) -> Vec<u8>;
43
44    /// Read all input into memory and return its encrypted data as Base64.
45    #[cfg(feature = "std")]
46    #[inline]
47    fn encrypt_reader_to_base64(&self, reader: &mut dyn Read) -> Result<String, MagicCryptError> {
48        self.encrypt_reader_to_bytes(reader)
49            .map(|bytes| base64::engine::general_purpose::STANDARD.encode(bytes))
50    }
51
52    /// Read all input into memory and return its encrypted bytes.
53    #[cfg(feature = "std")]
54    fn encrypt_reader_to_bytes(&self, reader: &mut dyn Read) -> Result<Vec<u8>, MagicCryptError>;
55
56    /// Encrypt data in chunks with a 4096-byte buffer and flush the writer on success.
57    ///
58    /// If an error occurs, the writer may already contain part of the encrypted data.
59    #[cfg(feature = "std")]
60    fn encrypt_reader_to_writer(
61        &self,
62        reader: &mut dyn Read,
63        writer: &mut dyn Write,
64    ) -> Result<(), MagicCryptError> {
65        self.encrypt_reader_to_writer2::<U4096>(reader, writer)
66    }
67
68    /// Encrypt data in chunks with a buffer of `N` bytes and flush the writer on success.
69    ///
70    /// `N` must be at least 16 and a multiple of 16.
71    /// If an error occurs, the writer may already contain part of the encrypted data.
72    #[cfg(feature = "std")]
73    fn encrypt_reader_to_writer2<
74        N: ArraySize + PartialDiv<U16> + IsGreaterOrEqual<U16, Output = True>,
75    >(
76        &self,
77        reader: &mut dyn Read,
78        writer: &mut dyn Write,
79    ) -> Result<(), MagicCryptError>;
80
81    #[inline]
82    fn decrypt_base64_to_string<S: AsRef<str>>(
83        &self,
84        base64: S,
85    ) -> Result<String, MagicCryptError> {
86        Ok(String::from_utf8(self.decrypt_base64_to_bytes(base64)?)?)
87    }
88
89    #[inline]
90    fn decrypt_base64_to_bytes<S: AsRef<str>>(
91        &self,
92        base64: S,
93    ) -> Result<Vec<u8>, MagicCryptError> {
94        self.decrypt_bytes_to_bytes(
95            &base64::engine::general_purpose::STANDARD.decode(base64.as_ref())?,
96        )
97    }
98
99    fn decrypt_bytes_to_bytes<T: ?Sized + AsRef<[u8]>>(
100        &self,
101        bytes: &T,
102    ) -> Result<Vec<u8>, MagicCryptError>;
103
104    /// Read all input into memory and return its decrypted bytes.
105    #[cfg(feature = "std")]
106    fn decrypt_reader_to_bytes(&self, reader: &mut dyn Read) -> Result<Vec<u8>, MagicCryptError>;
107
108    /// Decrypt data in chunks with a 4096-byte buffer and flush the writer on success.
109    ///
110    /// If an error occurs, the writer may already contain part of the decrypted data.
111    #[cfg(feature = "std")]
112    fn decrypt_reader_to_writer(
113        &self,
114        reader: &mut dyn Read,
115        writer: &mut dyn Write,
116    ) -> Result<(), MagicCryptError> {
117        self.decrypt_reader_to_writer2::<U4096>(reader, writer)
118    }
119
120    /// Decrypt data in chunks with a buffer of `N` bytes and flush the writer on success.
121    ///
122    /// `N` must be at least 16 and a multiple of 16.
123    /// If an error occurs, the writer may already contain part of the decrypted data.
124    #[cfg(feature = "std")]
125    fn decrypt_reader_to_writer2<
126        N: ArraySize + PartialDiv<U16> + IsGreaterOrEqual<U16, Output = True>,
127    >(
128        &self,
129        reader: &mut dyn Read,
130        writer: &mut dyn Write,
131    ) -> Result<(), MagicCryptError>;
132}