ctr/
flavors.rs

1//! CTR mode flavors
2
3use cipher::{
4    generic_array::{ArrayLength, GenericArray},
5    Counter,
6};
7
8mod ctr128;
9mod ctr32;
10mod ctr64;
11
12pub use ctr128::{Ctr128BE, Ctr128LE};
13pub use ctr32::{Ctr32BE, Ctr32LE};
14pub use ctr64::{Ctr64BE, Ctr64LE};
15
16/// Trait implemented by different CTR flavors.
17pub trait CtrFlavor<B: ArrayLength<u8>> {
18    /// Inner representation of nonce.
19    type CtrNonce: Clone;
20    /// Backend numeric type
21    type Backend: Counter;
22    /// Flavor name
23    const NAME: &'static str;
24
25    /// Return number of remaining blocks.
26    ///
27    /// If result does not fit into `usize`, returns `None`.
28    fn remaining(cn: &Self::CtrNonce) -> Option<usize>;
29
30    /// Generate block for given `nonce` and current counter value.
31    fn next_block(cn: &mut Self::CtrNonce) -> GenericArray<u8, B>;
32
33    /// Generate block for given `nonce` and current counter value.
34    fn current_block(cn: &Self::CtrNonce) -> GenericArray<u8, B>;
35
36    /// Initialize from bytes.
37    fn from_nonce(block: &GenericArray<u8, B>) -> Self::CtrNonce;
38
39    /// Convert from a backend value
40    fn set_from_backend(cn: &mut Self::CtrNonce, v: Self::Backend);
41
42    /// Convert to a backend value
43    fn as_backend(cn: &Self::CtrNonce) -> Self::Backend;
44}