#[cfg(feature = "hs-service")]
use tor_hscrypto::ops::HsMacKey;
use zeroize::Zeroizing;
pub(crate) const CIRC_BINDING_LEN: usize = 20;
#[derive(Clone)]
pub struct CircuitBinding(
)
Box<Zeroizing<[u8; CIRC_BINDING_LEN]>>,
);
impl From<[u8; CIRC_BINDING_LEN]> for CircuitBinding {
fn from(value: [u8; CIRC_BINDING_LEN]) -> Self {
Self(Box::new(Zeroizing::new(value)))
}
}
impl TryFrom<&[u8]> for CircuitBinding {
type Error = crate::Error;
fn try_from(value: &[u8]) -> Result<Self, Self::Error> {
let value: &[u8; CIRC_BINDING_LEN] = &value
.try_into()
.or(Err(Self::Error::InvalidKDFOutputLength))?;
Ok(Self::from(*value))
}
}
impl CircuitBinding {
#[cfg(feature = "hs-service")]
pub fn hs_mac(&self) -> HsMacKey<'_> {
HsMacKey::from(self.dangerously_into_bytes())
}
#[cfg(feature = "hs-service")]
fn dangerously_into_bytes(&self) -> &[u8] {
&(**self.0)[..]
}
}