use multiaddr::{Multiaddr, Protocol};
use serde::{Deserialize, Serialize};
use tari_crypto::{
compressed_key::CompressedKey,
dhke::DiffieHellmanSharedSecret,
hash_domain,
keys::PublicKey,
ristretto::RistrettoPublicKey,
signatures::{CompressedSchnorrSignature, SchnorrSignature},
};
use tari_storage::lmdb_store::LMDBStore;
use crate::peer_manager::database::PeerDatabaseSql;
pub type CommsPublicKey = CompressedKey<RistrettoPublicKey>;
pub type UncompressedCommsPublicKey = RistrettoPublicKey;
pub type CommsSecretKey = <RistrettoPublicKey as PublicKey>::K;
pub type CommsDHKE = DiffieHellmanSharedSecret<RistrettoPublicKey>;
pub type Signature = SchnorrSignature<RistrettoPublicKey, CommsSecretKey>;
pub type CompressedSignature = CompressedSchnorrSignature<RistrettoPublicKey, CommsSecretKey>;
pub type CommsRng = rand::rngs::OsRng;
pub type CommsDataStore = LMDBStore;
pub type CommsDatabase = PeerDatabaseSql;
#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize)]
pub enum TransportProtocol {
Ipv4,
Ipv6,
Onion,
Memory,
}
impl TransportProtocol {
pub fn get_all() -> Vec<TransportProtocol> {
vec![
TransportProtocol::Ipv4,
TransportProtocol::Ipv6,
TransportProtocol::Onion,
TransportProtocol::Memory,
]
}
pub fn get_prefix(&self) -> &str {
match self {
TransportProtocol::Ipv4 => "/ip4",
TransportProtocol::Ipv6 => "/ip6",
TransportProtocol::Onion => "/onion",
TransportProtocol::Memory => "/memory",
}
}
}
impl From<Multiaddr> for TransportProtocol {
fn from(addr: Multiaddr) -> Self {
match addr.iter().next() {
Some(Protocol::Ip4(_)) => TransportProtocol::Ipv4,
Some(Protocol::Ip6(_)) => TransportProtocol::Ipv6,
Some(Protocol::Onion(_, _)) => TransportProtocol::Onion,
Some(Protocol::Onion3(_)) => TransportProtocol::Onion,
Some(Protocol::Memory(_)) => TransportProtocol::Memory,
_ => TransportProtocol::Ipv4,
}
}
}
impl From<&Multiaddr> for TransportProtocol {
fn from(addr: &Multiaddr) -> Self {
match addr.iter().next() {
Some(Protocol::Ip4(_)) => TransportProtocol::Ipv4,
Some(Protocol::Ip6(_)) => TransportProtocol::Ipv6,
Some(Protocol::Onion(_, _)) => TransportProtocol::Onion,
Some(Protocol::Onion3(_)) => TransportProtocol::Onion,
Some(Protocol::Memory(_)) => TransportProtocol::Memory,
_ => TransportProtocol::Ipv4,
}
}
}
impl From<&Multiaddr> for &TransportProtocol {
fn from(addr: &Multiaddr) -> Self {
match addr.iter().next() {
Some(Protocol::Ip4(_)) => &TransportProtocol::Ipv4,
Some(Protocol::Ip6(_)) => &TransportProtocol::Ipv6,
Some(Protocol::Onion(_, _)) => &TransportProtocol::Onion,
Some(Protocol::Onion3(_)) => &TransportProtocol::Onion,
Some(Protocol::Memory(_)) => &TransportProtocol::Memory,
_ => &TransportProtocol::Ipv4,
}
}
}
hash_domain!(CommsCoreHashDomain, "com.tari.comms.core", 0);