|
|
|
@ -1,22 +1,25 @@
|
|
|
|
|
use getrandom::getrandom;
|
|
|
|
|
use std::fmt;
|
|
|
|
|
use std::{fmt, str};
|
|
|
|
|
use crate::cha::{
|
|
|
|
|
KEY_SIZE,
|
|
|
|
|
IV_SIZE,
|
|
|
|
|
};
|
|
|
|
|
use crate::ext::*;
|
|
|
|
|
|
|
|
|
|
#[derive(Debug, Clone, PartialEq, Eq, Hash, Copy)]
|
|
|
|
|
#[derive(Debug, Clone, PartialEq, Eq, Hash, Copy, Default)]
|
|
|
|
|
#[repr(transparent)]
|
|
|
|
|
pub struct Key([u8; KEY_SIZE]);
|
|
|
|
|
|
|
|
|
|
#[derive(Debug, Clone, PartialEq, Eq, Hash, Copy)]
|
|
|
|
|
#[derive(Debug, Clone, PartialEq, Eq, Hash, Copy, Default)]
|
|
|
|
|
#[repr(transparent)]
|
|
|
|
|
pub struct IV([u8; IV_SIZE]);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
impl Key
|
|
|
|
|
{
|
|
|
|
|
#[inline] pub fn from_bytes(k: [u8; KEY_SIZE]) -> Self
|
|
|
|
|
{
|
|
|
|
|
Self(k)
|
|
|
|
|
}
|
|
|
|
|
pub fn new() -> Self
|
|
|
|
|
{
|
|
|
|
|
let mut output = [0u8; KEY_SIZE];
|
|
|
|
@ -27,6 +30,11 @@ impl Key
|
|
|
|
|
|
|
|
|
|
impl IV
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
#[inline] pub fn from_bytes(k: [u8; IV_SIZE]) -> Self
|
|
|
|
|
{
|
|
|
|
|
Self(k)
|
|
|
|
|
}
|
|
|
|
|
pub fn new() -> Self
|
|
|
|
|
{
|
|
|
|
|
let mut output = [0u8; IV_SIZE];
|
|
|
|
@ -35,6 +43,23 @@ impl IV
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
impl From<[u8; KEY_SIZE]> for Key
|
|
|
|
|
{
|
|
|
|
|
#[inline] fn from(from: [u8; KEY_SIZE]) -> Self
|
|
|
|
|
{
|
|
|
|
|
Self(from)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
impl From<[u8; IV_SIZE]> for IV
|
|
|
|
|
{
|
|
|
|
|
fn from(from: [u8; IV_SIZE]) -> Self
|
|
|
|
|
{
|
|
|
|
|
Self(from)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
impl AsRef<[u8]> for Key
|
|
|
|
|
{
|
|
|
|
|
fn as_ref(&self) -> &[u8]
|
|
|
|
@ -85,7 +110,7 @@ impl fmt::Display for Key
|
|
|
|
|
{
|
|
|
|
|
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result
|
|
|
|
|
{
|
|
|
|
|
write!(f, "Key({})", self.0.iter().copied().into_hex())
|
|
|
|
|
write!(f, "{}", self.0.iter().copied().into_hex())
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -93,6 +118,34 @@ impl fmt::Display for IV
|
|
|
|
|
{
|
|
|
|
|
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result
|
|
|
|
|
{
|
|
|
|
|
write!(f, "Key({})", self.0.iter().copied().into_hex())
|
|
|
|
|
write!(f, "{}", self.0.iter().copied().into_hex())
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
impl str::FromStr for Key
|
|
|
|
|
{
|
|
|
|
|
type Err = base64::DecodeError;
|
|
|
|
|
|
|
|
|
|
fn from_str(s: &str) -> Result<Self, Self::Err> {
|
|
|
|
|
let mut buffer = Vec::with_capacity(KEY_SIZE);
|
|
|
|
|
base64::decode_config_buf(s.as_bytes(), base64::STANDARD, &mut buffer)?;
|
|
|
|
|
|
|
|
|
|
let mut this = Self::default();
|
|
|
|
|
this.0.copy_from_slice(&buffer[..]);
|
|
|
|
|
Ok(this)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
impl str::FromStr for IV
|
|
|
|
|
{
|
|
|
|
|
type Err = base64::DecodeError;
|
|
|
|
|
|
|
|
|
|
fn from_str(s: &str) -> Result<Self, Self::Err> {
|
|
|
|
|
let mut buffer = Vec::with_capacity(IV_SIZE);
|
|
|
|
|
base64::decode_config_buf(s.as_bytes(), base64::STANDARD, &mut buffer)?;
|
|
|
|
|
|
|
|
|
|
let mut this = Self::default();
|
|
|
|
|
this.0.copy_from_slice(&buffer[..]);
|
|
|
|
|
Ok(this)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|