use std::fmt::{self, Debug};
use std::hash::{Hash, Hasher};
use std::sync::Arc;
#[allow(deprecated)]
use tor_hscrypto::pk::HsClientIntroAuthKeypair;
use tor_hscrypto::pk::{HsClientDescEncKeypair, HsId};
use tor_keymgr::derive_deftly_template_KeySpecifier;
use derive_deftly::Deftly;
use derive_more::Constructor;
use tor_keymgr::KeySpecifier;
#[derive(Clone, Default)]
pub struct HsClientSecretKeys {
pub(crate) keys: Arc<ClientSecretKeyValues>,
}
impl Debug for HsClientSecretKeys {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
let mut d = f.debug_tuple("HsClientSecretKeys");
d.field(&Arc::as_ptr(&self.keys));
self.keys
.ks_hsc_desc_enc
.as_ref()
.map(|_| d.field(&"<desc_enc>"));
self.keys
.ks_hsc_intro_auth
.as_ref()
.map(|_| d.field(&"<intro_uath>"));
d.finish()
}
}
impl PartialEq for HsClientSecretKeys {
fn eq(&self, other: &Self) -> bool {
self.is_empty() && other.is_empty() || Arc::ptr_eq(&self.keys, &other.keys)
}
}
impl Eq for HsClientSecretKeys {}
impl Hash for HsClientSecretKeys {
fn hash<H: Hasher>(&self, state: &mut H) {
Arc::as_ptr(&self.keys).hash(state);
}
}
impl HsClientSecretKeys {
pub fn none() -> Self {
Self::default()
}
pub fn is_empty(&self) -> bool {
let ClientSecretKeyValues {
ks_hsc_desc_enc,
ks_hsc_intro_auth,
} = &*self.keys;
ks_hsc_desc_enc.is_none() && ks_hsc_intro_auth.is_none()
}
}
type ClientSecretKeyValues = HsClientSecretKeysBuilder;
#[derive(Default, Debug)]
pub struct HsClientSecretKeysBuilder {
pub(crate) ks_hsc_desc_enc: Option<HsClientDescEncKeypair>,
#[allow(deprecated)]
pub(crate) ks_hsc_intro_auth: Option<HsClientIntroAuthKeypair>,
}
impl HsClientSecretKeysBuilder {
pub fn ks_hsc_desc_enc(&mut self, ks: HsClientDescEncKeypair) -> &mut Self {
self.ks_hsc_desc_enc = Some(ks);
self
}
#[deprecated]
#[allow(deprecated)]
pub fn ks_hsc_intro_auth(&mut self, ks: HsClientIntroAuthKeypair) -> &mut Self {
self.ks_hsc_intro_auth = Some(ks);
self
}
pub fn build(self) -> Result<HsClientSecretKeys, tor_config::ConfigBuildError> {
Ok(HsClientSecretKeys {
keys: Arc::new(self),
})
}
}
#[derive(Deftly, PartialEq, Debug, Constructor)]
#[derive_deftly(KeySpecifier)]
#[deftly(prefix = "client")]
#[deftly(role = "KS_hsc_desc_enc")]
#[deftly(summary = "Descriptor decryption key")]
#[deftly(ctor_path = "HsClientDescEncKeypair")]
pub struct HsClientDescEncKeypairSpecifier {
pub(crate) hs_id: HsId,
}