1#![cfg_attr(feature = "nightly", feature(test))]
2pub mod aes_hash;
10pub mod aes_rng;
11pub mod alloc;
12pub mod block;
13pub mod buf;
14pub mod rand_compat;
15pub mod random_oracle;
16#[cfg(feature = "tokio-rayon")]
17pub mod tokio_rayon;
18pub mod transpose;
19pub mod utils;
20
21pub use block::Block;
22
23#[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
32pub const AES_PAR_BLOCKS: usize = 9;
33#[cfg(target_arch = "aarch64")]
34pub const AES_PAR_BLOCKS: usize = 21;
36#[cfg(not(any(target_arch = "x86", target_arch = "x86_64", target_arch = "aarch64")))]
37pub const AES_PAR_BLOCKS: usize = 4;
39
40#[cfg(all(test, not(miri), target_feature = "aes"))]
41mod tests {
42 use aes::{
43 Aes128,
44 cipher::{
45 BlockCipherEncClosure, BlockCipherEncrypt, BlockSizeUser, KeyInit, ParBlocksSizeUser,
46 },
47 };
48
49 use crate::AES_PAR_BLOCKS;
50
51 #[test]
52 fn aes_par_block_size() {
53 use hybrid_array::typenum::Unsigned;
54
55 struct GetParBlockSize;
56 impl BlockSizeUser for GetParBlockSize {
57 type BlockSize = aes::cipher::array::sizes::U16;
58 }
59 impl BlockCipherEncClosure for GetParBlockSize {
60 fn call<B: aes::cipher::BlockCipherEncBackend<BlockSize = Self::BlockSize>>(
61 self,
62 _backend: &B,
63 ) {
64 assert_eq!(
65 AES_PAR_BLOCKS,
66 <<B as ParBlocksSizeUser>::ParBlocksSize as Unsigned>::USIZE,
68 );
69 }
70 }
71 let aes = Aes128::new(&Default::default());
72 aes.encrypt_with_backend(GetParBlockSize);
73 }
74}