use std::collections::HashMap;
pub const AUTH_VERSION: &str = "0.1";
pub const AUTH_PROTOCOL_ID: &str = "auth message signature";
pub const CERTIFICATE_SIGNATURE_PROTOCOL: &str = "certificate signature";
pub const CERTIFICATE_FIELD_ENCRYPTION_PROTOCOL: &str = "certificate field encryption";
pub const SERVER_HMAC_PROTOCOL: &str = "server hmac";
pub const NONCE_SECURITY_LEVEL: u8 = 2;
#[derive(Clone, Debug, PartialEq)]
#[cfg_attr(feature = "network", derive(serde::Serialize, serde::Deserialize))]
pub enum MessageType {
#[cfg_attr(feature = "network", serde(rename = "initialRequest"))]
InitialRequest,
#[cfg_attr(feature = "network", serde(rename = "initialResponse"))]
InitialResponse,
#[cfg_attr(feature = "network", serde(rename = "certificateRequest"))]
CertificateRequest,
#[cfg_attr(feature = "network", serde(rename = "certificateResponse"))]
CertificateResponse,
#[cfg_attr(feature = "network", serde(rename = "general"))]
General,
}
#[derive(Clone, Debug, Default)]
#[cfg_attr(feature = "network", derive(serde::Serialize, serde::Deserialize))]
pub struct RequestedCertificateSet {
#[cfg_attr(feature = "network", serde(default))]
pub certifiers: Vec<String>,
#[cfg_attr(feature = "network", serde(default))]
pub types: HashMap<String, Vec<String>>,
}
impl RequestedCertificateSet {
pub fn is_empty(&self) -> bool {
self.types.is_empty()
}
pub fn keys(&self) -> impl Iterator<Item = &String> {
self.types.keys()
}
pub fn contains_key(&self, key: &str) -> bool {
self.types.contains_key(key)
}
pub fn get(&self, key: &str) -> Option<&Vec<String>> {
self.types.get(key)
}
pub fn insert(&mut self, key: String, fields: Vec<String>) {
self.types.insert(key, fields);
}
}
#[derive(Clone, Debug)]
#[cfg_attr(feature = "network", derive(serde::Serialize, serde::Deserialize))]
#[cfg_attr(feature = "network", serde(rename_all = "camelCase"))]
pub struct AuthMessage {
pub version: String,
pub message_type: MessageType,
pub identity_key: String,
#[cfg_attr(feature = "network", serde(skip_serializing_if = "Option::is_none"))]
pub nonce: Option<String>,
#[cfg_attr(feature = "network", serde(skip_serializing_if = "Option::is_none"))]
pub your_nonce: Option<String>,
#[cfg_attr(feature = "network", serde(skip_serializing_if = "Option::is_none"))]
pub initial_nonce: Option<String>,
#[cfg_attr(feature = "network", serde(skip_serializing_if = "Option::is_none"))]
pub certificates: Option<Vec<crate::wallet::interfaces::Certificate>>,
#[cfg_attr(feature = "network", serde(skip_serializing_if = "Option::is_none"))]
pub requested_certificates: Option<RequestedCertificateSet>,
#[cfg_attr(feature = "network", serde(skip_serializing_if = "Option::is_none"))]
pub payload: Option<Vec<u8>>,
#[cfg_attr(feature = "network", serde(skip_serializing_if = "Option::is_none"))]
pub signature: Option<Vec<u8>>,
}
#[derive(Clone, Debug)]
pub struct PeerSession {
pub session_nonce: String,
pub peer_identity_key: String,
pub peer_nonce: String,
pub is_authenticated: bool,
}