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
15pub 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}