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
13pub 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 #[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 #[cfg(feature = "std")]
54 fn encrypt_reader_to_bytes(&self, reader: &mut dyn Read) -> Result<Vec<u8>, MagicCryptError>;
55
56 #[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 #[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 #[cfg(feature = "std")]
106 fn decrypt_reader_to_bytes(&self, reader: &mut dyn Read) -> Result<Vec<u8>, MagicCryptError>;
107
108 #[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 #[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}