use chrono::Utc;
use ed25519_dalek::{Signature, Verifier, VerifyingKey};
use uuid::{Timestamp, Uuid};
use crate::error::CorpFinanceError;
use crate::CorpFinanceResult;
use super::types::FederatedSession;
pub fn open_session(peer_id: &str) -> FederatedSession {
FederatedSession {
session_id: Uuid::new_v7(Timestamp::now(uuid::NoContext)),
peer_id: peer_id.to_string(),
opened_at: Utc::now(),
closed_at: None,
payload_count: 0,
}
}
pub fn close_session(session: &mut FederatedSession) {
if session.closed_at.is_none() {
session.closed_at = Some(Utc::now());
}
}
pub fn record_payload(session: &mut FederatedSession) {
session.payload_count = session.payload_count.saturating_add(1);
}
pub fn open_authenticated_session(
peer_id: &str,
nonce: &[u8],
challenge_signature: &[u8; 64],
peer_public_key: &VerifyingKey,
) -> CorpFinanceResult<FederatedSession> {
let sig = Signature::from_bytes(challenge_signature);
peer_public_key
.verify(nonce, &sig)
.map_err(|_| CorpFinanceError::InvalidInput {
field: "challenge_signature".into(),
reason: format!("ed25519 verify failed for peer '{}'", peer_id),
})?;
Ok(open_session(peer_id))
}