use crate::primitives::private_key::PrivateKey;
use crate::primitives::public_key::PublicKey;
use crate::primitives::symmetric_key::SymmetricKey;
use crate::wallet::cached_key_deriver::CachedKeyDeriver;
use crate::wallet::error::WalletError;
use crate::wallet::key_deriver::KeyDeriver;
use crate::wallet::types::{Counterparty, Protocol};
pub trait KeyDeriverApi: Send + Sync {
fn root_key(&self) -> &PrivateKey;
fn identity_key(&self) -> PublicKey;
fn derive_public_key(
&self,
protocol: &Protocol,
key_id: &str,
counterparty: &Counterparty,
for_self: bool,
) -> Result<PublicKey, WalletError>;
fn derive_private_key(
&self,
protocol: &Protocol,
key_id: &str,
counterparty: &Counterparty,
) -> Result<PrivateKey, WalletError>;
fn derive_symmetric_key(
&self,
protocol: &Protocol,
key_id: &str,
counterparty: &Counterparty,
) -> Result<SymmetricKey, WalletError>;
fn reveal_counterparty_secret(
&self,
counterparty: &Counterparty,
) -> Result<PublicKey, WalletError>;
fn reveal_specific_secret(
&self,
counterparty: &Counterparty,
protocol: &Protocol,
key_id: &str,
) -> Result<Vec<u8>, WalletError>;
fn identity_key_hex(&self) -> String {
self.identity_key().to_der_hex()
}
}
impl KeyDeriverApi for KeyDeriver {
fn root_key(&self) -> &PrivateKey {
KeyDeriver::root_key(self)
}
fn identity_key(&self) -> PublicKey {
KeyDeriver::identity_key(self)
}
fn derive_public_key(
&self,
protocol: &Protocol,
key_id: &str,
counterparty: &Counterparty,
for_self: bool,
) -> Result<PublicKey, WalletError> {
KeyDeriver::derive_public_key(self, protocol, key_id, counterparty, for_self)
}
fn derive_private_key(
&self,
protocol: &Protocol,
key_id: &str,
counterparty: &Counterparty,
) -> Result<PrivateKey, WalletError> {
KeyDeriver::derive_private_key(self, protocol, key_id, counterparty)
}
fn derive_symmetric_key(
&self,
protocol: &Protocol,
key_id: &str,
counterparty: &Counterparty,
) -> Result<SymmetricKey, WalletError> {
KeyDeriver::derive_symmetric_key(self, protocol, key_id, counterparty)
}
fn reveal_counterparty_secret(
&self,
counterparty: &Counterparty,
) -> Result<PublicKey, WalletError> {
KeyDeriver::reveal_counterparty_secret(self, counterparty)
}
fn reveal_specific_secret(
&self,
counterparty: &Counterparty,
protocol: &Protocol,
key_id: &str,
) -> Result<Vec<u8>, WalletError> {
KeyDeriver::reveal_specific_secret(self, counterparty, protocol, key_id)
}
fn identity_key_hex(&self) -> String {
KeyDeriver::identity_key_hex(self)
}
}
impl KeyDeriverApi for CachedKeyDeriver {
fn root_key(&self) -> &PrivateKey {
CachedKeyDeriver::root_key(self)
}
fn identity_key(&self) -> PublicKey {
CachedKeyDeriver::identity_key(self)
}
fn derive_public_key(
&self,
protocol: &Protocol,
key_id: &str,
counterparty: &Counterparty,
for_self: bool,
) -> Result<PublicKey, WalletError> {
CachedKeyDeriver::derive_public_key(self, protocol, key_id, counterparty, for_self)
}
fn derive_private_key(
&self,
protocol: &Protocol,
key_id: &str,
counterparty: &Counterparty,
) -> Result<PrivateKey, WalletError> {
CachedKeyDeriver::derive_private_key(self, protocol, key_id, counterparty)
}
fn derive_symmetric_key(
&self,
protocol: &Protocol,
key_id: &str,
counterparty: &Counterparty,
) -> Result<SymmetricKey, WalletError> {
CachedKeyDeriver::derive_symmetric_key(self, protocol, key_id, counterparty)
}
fn reveal_counterparty_secret(
&self,
counterparty: &Counterparty,
) -> Result<PublicKey, WalletError> {
CachedKeyDeriver::reveal_counterparty_secret(self, counterparty)
}
fn reveal_specific_secret(
&self,
counterparty: &Counterparty,
protocol: &Protocol,
key_id: &str,
) -> Result<Vec<u8>, WalletError> {
CachedKeyDeriver::reveal_specific_secret(self, counterparty, protocol, key_id)
}
fn identity_key_hex(&self) -> String {
CachedKeyDeriver::identity_key_hex(self)
}
}