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")]
45 #[inline]
46 fn encrypt_reader_to_base64(&self, reader: &mut dyn Read) -> Result<String, MagicCryptError> {
47 self.encrypt_reader_to_bytes(reader)
48 .map(|bytes| base64::engine::general_purpose::STANDARD.encode(bytes))
49 }
50
51 #[cfg(feature = "std")]
52 fn encrypt_reader_to_bytes(&self, reader: &mut dyn Read) -> Result<Vec<u8>, MagicCryptError>;
53
54 #[cfg(feature = "std")]
55 fn encrypt_reader_to_writer(
56 &self,
57 reader: &mut dyn Read,
58 writer: &mut dyn Write,
59 ) -> Result<(), MagicCryptError> {
60 self.encrypt_reader_to_writer2::<U4096>(reader, writer)
61 }
62
63 #[cfg(feature = "std")]
64 fn encrypt_reader_to_writer2<
65 N: ArraySize + PartialDiv<U16> + IsGreaterOrEqual<U16, Output = True>,
66 >(
67 &self,
68 reader: &mut dyn Read,
69 writer: &mut dyn Write,
70 ) -> Result<(), MagicCryptError>;
71
72 #[inline]
73 fn decrypt_base64_to_string<S: AsRef<str>>(
74 &self,
75 base64: S,
76 ) -> Result<String, MagicCryptError> {
77 Ok(String::from_utf8(self.decrypt_base64_to_bytes(base64)?)?)
78 }
79
80 #[inline]
81 fn decrypt_base64_to_bytes<S: AsRef<str>>(
82 &self,
83 base64: S,
84 ) -> Result<Vec<u8>, MagicCryptError> {
85 self.decrypt_bytes_to_bytes(
86 &base64::engine::general_purpose::STANDARD.decode(base64.as_ref())?,
87 )
88 }
89
90 fn decrypt_bytes_to_bytes<T: ?Sized + AsRef<[u8]>>(
91 &self,
92 bytes: &T,
93 ) -> Result<Vec<u8>, MagicCryptError>;
94
95 #[cfg(feature = "std")]
96 fn decrypt_reader_to_bytes(&self, reader: &mut dyn Read) -> Result<Vec<u8>, MagicCryptError>;
97
98 #[cfg(feature = "std")]
99 fn decrypt_reader_to_writer(
100 &self,
101 reader: &mut dyn Read,
102 writer: &mut dyn Write,
103 ) -> Result<(), MagicCryptError> {
104 self.decrypt_reader_to_writer2::<U4096>(reader, writer)
105 }
106
107 #[cfg(feature = "std")]
108 fn decrypt_reader_to_writer2<
109 N: ArraySize + PartialDiv<U16> + IsGreaterOrEqual<U16, Output = True>,
110 >(
111 &self,
112 reader: &mut dyn Read,
113 writer: &mut dyn Write,
114 ) -> Result<(), MagicCryptError>;
115}