ate_crypto/crypto/
initialization_vector.rs

1use crate::utils::vec_deserialize;
2use crate::utils::vec_serialize;
3use rand::RngCore;
4use serde::{Deserialize, Serialize};
5#[allow(unused_imports)]
6use tracing::{debug, error, info, instrument, span, trace, warn, Level};
7
8use super::*;
9
10/// Represents an initiailization vector used for both hash prefixing
11/// to create entropy and help prevent rainbow table attacks. These
12/// vectors are also used as the exchange medium during a key exchange
13/// so that two parties can established a shared secret key
14#[derive(Serialize, Deserialize, Debug, Clone, Hash, PartialEq, Eq, PartialOrd, Ord)]
15pub struct InitializationVector {
16    #[serde(serialize_with = "vec_serialize", deserialize_with = "vec_deserialize")]
17    pub bytes: Vec<u8>,
18}
19
20impl InitializationVector {
21    pub fn generate() -> InitializationVector {
22        let mut rng = RandomGeneratorAccessor::default();
23        let mut iv = InitializationVector {
24            bytes: vec![0 as u8; 16],
25        };
26        rng.fill_bytes(&mut iv.bytes);
27        iv
28    }
29    pub fn len(&self) -> usize {
30        self.bytes.len()
31    }
32    pub fn as_bytes<'a>(&'a self) -> &'a [u8] {
33        &self.bytes[..]
34    }
35}
36
37impl From<Vec<u8>> for InitializationVector {
38    fn from(bytes: Vec<u8>) -> InitializationVector {
39        InitializationVector { bytes }
40    }
41}
42
43impl From<&[u8]> for InitializationVector {
44    fn from(bytes: &[u8]) -> InitializationVector {
45        InitializationVector {
46            bytes: bytes.to_vec(),
47        }
48    }
49}
50
51impl From<&[u8; 16]> for InitializationVector {
52    fn from(bytes: &[u8; 16]) -> InitializationVector {
53        InitializationVector {
54            bytes: bytes.to_vec(),
55        }
56    }
57}
58
59impl std::fmt::Display for InitializationVector {
60    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
61        write!(f, "{}", hex::encode(&self.bytes[..]))
62    }
63}