magic_crypt/
traits.rs

1use alloc::{string::String, vec::Vec};
2#[cfg(feature = "std")]
3use std::io::{Read, Write};
4#[cfg(feature = "std")]
5use std::ops::Add;
6
7use base64::Engine;
8
9#[cfg(feature = "std")]
10use crate::generic_array::typenum::{IsGreaterOrEqual, PartialDiv, True, B1, U16, U4096};
11#[cfg(feature = "std")]
12use crate::generic_array::ArrayLength;
13use crate::MagicCryptError;
14
15/// Methods for `MagicCrypt` and `MagicCrypt<bits>` structs.
16pub trait MagicCryptTrait {
17    fn new<S: AsRef<[u8]>, V: AsRef<[u8]>>(key: S, iv: Option<V>) -> Self;
18
19    #[inline]
20    fn encrypt_str_to_base64<S: AsRef<str>>(&self, string: S) -> String {
21        self.encrypt_to_base64(string.as_ref())
22    }
23
24    #[inline]
25    fn encrypt_str_to_bytes<S: AsRef<str>>(&self, string: S) -> Vec<u8> {
26        self.encrypt_to_bytes(string.as_ref())
27    }
28
29    #[inline]
30    fn encrypt_bytes_to_base64<T: ?Sized + AsRef<[u8]>>(&self, bytes: &T) -> String {
31        self.encrypt_to_base64(bytes)
32    }
33
34    #[inline]
35    fn encrypt_bytes_to_bytes<T: ?Sized + AsRef<[u8]>>(&self, bytes: &T) -> Vec<u8> {
36        self.encrypt_to_bytes(bytes)
37    }
38
39    #[inline]
40    fn encrypt_to_base64<T: ?Sized + AsRef<[u8]>>(&self, data: &T) -> String {
41        base64::engine::general_purpose::STANDARD.encode(self.encrypt_to_bytes(data))
42    }
43
44    fn encrypt_to_bytes<T: ?Sized + AsRef<[u8]>>(&self, data: &T) -> Vec<u8>;
45
46    #[cfg(feature = "std")]
47    #[inline]
48    fn encrypt_reader_to_base64(&self, reader: &mut dyn Read) -> Result<String, MagicCryptError> {
49        self.encrypt_reader_to_bytes(reader)
50            .map(|bytes| base64::engine::general_purpose::STANDARD.encode(bytes))
51    }
52
53    #[cfg(feature = "std")]
54    fn encrypt_reader_to_bytes(&self, reader: &mut dyn Read) -> Result<Vec<u8>, MagicCryptError>;
55
56    #[cfg(feature = "std")]
57    fn encrypt_reader_to_writer(
58        &self,
59        reader: &mut dyn Read,
60        writer: &mut dyn Write,
61    ) -> Result<(), MagicCryptError> {
62        self.encrypt_reader_to_writer2::<U4096>(reader, writer)
63    }
64
65    #[cfg(feature = "std")]
66    fn encrypt_reader_to_writer2<
67        N: ArrayLength<u8> + PartialDiv<U16> + IsGreaterOrEqual<U16, Output = True>,
68    >(
69        &self,
70        reader: &mut dyn Read,
71        writer: &mut dyn Write,
72    ) -> Result<(), MagicCryptError>;
73
74    #[inline]
75    fn decrypt_base64_to_string<S: AsRef<str>>(
76        &self,
77        base64: S,
78    ) -> Result<String, MagicCryptError> {
79        Ok(String::from_utf8(self.decrypt_base64_to_bytes(base64)?)?)
80    }
81
82    #[inline]
83    fn decrypt_base64_to_bytes<S: AsRef<str>>(
84        &self,
85        base64: S,
86    ) -> Result<Vec<u8>, MagicCryptError> {
87        self.decrypt_bytes_to_bytes(
88            &base64::engine::general_purpose::STANDARD.decode(base64.as_ref())?,
89        )
90    }
91
92    fn decrypt_bytes_to_bytes<T: ?Sized + AsRef<[u8]>>(
93        &self,
94        bytes: &T,
95    ) -> Result<Vec<u8>, MagicCryptError>;
96
97    #[cfg(feature = "std")]
98    fn decrypt_reader_to_bytes(&self, reader: &mut dyn Read) -> Result<Vec<u8>, MagicCryptError>;
99
100    #[cfg(feature = "std")]
101    fn decrypt_reader_to_writer(
102        &self,
103        reader: &mut dyn Read,
104        writer: &mut dyn Write,
105    ) -> Result<(), MagicCryptError> {
106        self.decrypt_reader_to_writer2::<U4096>(reader, writer)
107    }
108
109    #[cfg(feature = "std")]
110    fn decrypt_reader_to_writer2<
111        N: ArrayLength<u8> + PartialDiv<U16> + IsGreaterOrEqual<U16, Output = True> + Add<B1>,
112    >(
113        &self,
114        reader: &mut dyn Read,
115        writer: &mut dyn Write,
116    ) -> Result<(), MagicCryptError>
117    where
118        <N as Add<B1>>::Output: ArrayLength<u8>;
119}