1#![cfg_attr(not(feature = "std"), no_std)]
81
82extern crate alloc;
83
84mod ciphers;
85mod errors;
86mod functions;
87mod macros;
88mod secure_bit;
89mod traits;
90
91use alloc::vec::Vec;
92#[cfg(feature = "std")]
93use std::io::{Read, Write};
94
95#[cfg(feature = "std")]
96use array::ArraySize;
97#[cfg(feature = "std")]
98use array::typenum::{IsGreaterOrEqual, PartialDiv, True, U16};
99pub use cbc::cipher::array;
100pub use ciphers::{
101 aes128::MagicCrypt128, aes192::MagicCrypt192, aes256::MagicCrypt256, des64::MagicCrypt64,
102};
103pub use errors::MagicCryptError;
104pub use secure_bit::SecureBit;
105pub use traits::MagicCryptTrait;
106
107#[derive(Debug, Clone)]
108enum MagicCryptCipher {
109 DES64(MagicCrypt64),
110 AES128(MagicCrypt128),
111 AES192(MagicCrypt192),
112 AES256(MagicCrypt256),
113}
114
115#[derive(Debug, Clone)]
117pub struct MagicCrypt {
118 cipher: MagicCryptCipher,
119}
120
121impl MagicCrypt {
122 pub fn new<S: AsRef<[u8]>, V: AsRef<[u8]>>(
124 key: S,
125 bit: SecureBit,
126 iv: Option<V>,
127 ) -> MagicCrypt {
128 let cipher = match bit {
129 SecureBit::Bit64 => MagicCryptCipher::DES64(MagicCrypt64::new(key, iv)),
130 SecureBit::Bit128 => MagicCryptCipher::AES128(MagicCrypt128::new(key, iv)),
131 SecureBit::Bit192 => MagicCryptCipher::AES192(MagicCrypt192::new(key, iv)),
132 SecureBit::Bit256 => MagicCryptCipher::AES256(MagicCrypt256::new(key, iv)),
133 };
134
135 MagicCrypt {
136 cipher,
137 }
138 }
139}
140
141impl MagicCryptTrait for MagicCrypt {
142 #[inline]
143 fn new<S: AsRef<[u8]>, V: AsRef<[u8]>>(key: S, iv: Option<V>) -> MagicCrypt {
144 MagicCrypt::new(key, SecureBit::default(), iv)
145 }
146
147 #[inline]
148 fn encrypt_to_bytes<T: ?Sized + AsRef<[u8]>>(&self, data: &T) -> Vec<u8> {
149 match &self.cipher {
150 MagicCryptCipher::DES64(mc) => mc.encrypt_to_bytes(data),
151 MagicCryptCipher::AES128(mc) => mc.encrypt_to_bytes(data),
152 MagicCryptCipher::AES192(mc) => mc.encrypt_to_bytes(data),
153 MagicCryptCipher::AES256(mc) => mc.encrypt_to_bytes(data),
154 }
155 }
156
157 #[cfg(feature = "std")]
158 #[inline]
159 fn encrypt_reader_to_bytes(&self, reader: &mut dyn Read) -> Result<Vec<u8>, MagicCryptError> {
160 match &self.cipher {
161 MagicCryptCipher::DES64(mc) => mc.encrypt_reader_to_bytes(reader),
162 MagicCryptCipher::AES128(mc) => mc.encrypt_reader_to_bytes(reader),
163 MagicCryptCipher::AES192(mc) => mc.encrypt_reader_to_bytes(reader),
164 MagicCryptCipher::AES256(mc) => mc.encrypt_reader_to_bytes(reader),
165 }
166 }
167
168 #[cfg(feature = "std")]
169 #[inline]
170 fn encrypt_reader_to_writer2<
171 N: ArraySize + PartialDiv<U16> + IsGreaterOrEqual<U16, Output = True>,
172 >(
173 &self,
174 reader: &mut dyn Read,
175 writer: &mut dyn Write,
176 ) -> Result<(), MagicCryptError> {
177 match &self.cipher {
178 MagicCryptCipher::DES64(mc) => mc.encrypt_reader_to_writer2::<N>(reader, writer),
179 MagicCryptCipher::AES128(mc) => mc.encrypt_reader_to_writer2::<N>(reader, writer),
180 MagicCryptCipher::AES192(mc) => mc.encrypt_reader_to_writer2::<N>(reader, writer),
181 MagicCryptCipher::AES256(mc) => mc.encrypt_reader_to_writer2::<N>(reader, writer),
182 }
183 }
184
185 #[inline]
186 fn decrypt_bytes_to_bytes<T: ?Sized + AsRef<[u8]>>(
187 &self,
188 bytes: &T,
189 ) -> Result<Vec<u8>, MagicCryptError> {
190 match &self.cipher {
191 MagicCryptCipher::DES64(mc) => mc.decrypt_bytes_to_bytes(bytes),
192 MagicCryptCipher::AES128(mc) => mc.decrypt_bytes_to_bytes(bytes),
193 MagicCryptCipher::AES192(mc) => mc.decrypt_bytes_to_bytes(bytes),
194 MagicCryptCipher::AES256(mc) => mc.decrypt_bytes_to_bytes(bytes),
195 }
196 }
197
198 #[cfg(feature = "std")]
199 #[inline]
200 fn decrypt_reader_to_bytes(&self, reader: &mut dyn Read) -> Result<Vec<u8>, MagicCryptError> {
201 match &self.cipher {
202 MagicCryptCipher::DES64(mc) => mc.decrypt_reader_to_bytes(reader),
203 MagicCryptCipher::AES128(mc) => mc.decrypt_reader_to_bytes(reader),
204 MagicCryptCipher::AES192(mc) => mc.decrypt_reader_to_bytes(reader),
205 MagicCryptCipher::AES256(mc) => mc.decrypt_reader_to_bytes(reader),
206 }
207 }
208
209 #[cfg(feature = "std")]
210 #[inline]
211 fn decrypt_reader_to_writer2<
212 N: ArraySize + PartialDiv<U16> + IsGreaterOrEqual<U16, Output = True>,
213 >(
214 &self,
215 reader: &mut dyn Read,
216 writer: &mut dyn Write,
217 ) -> Result<(), MagicCryptError> {
218 match &self.cipher {
219 MagicCryptCipher::DES64(mc) => mc.decrypt_reader_to_writer2::<N>(reader, writer),
220 MagicCryptCipher::AES128(mc) => mc.decrypt_reader_to_writer2::<N>(reader, writer),
221 MagicCryptCipher::AES192(mc) => mc.decrypt_reader_to_writer2::<N>(reader, writer),
222 MagicCryptCipher::AES256(mc) => mc.decrypt_reader_to_writer2::<N>(reader, writer),
223 }
224 }
225}