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    #[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}