alpine/
device.rs

1use crate::crypto::{identity::NodeCredentials, X25519KeyExchange};
2use crate::discovery::DiscoveryResponder;
3use crate::handshake::{HandshakeContext, HandshakeError, HandshakeTransport};
4use crate::messages::{CapabilitySet, DeviceIdentity};
5use crate::session::{AlnpSession, Ed25519Authenticator};
6
7/// Minimal device-side server skeleton that wires discovery + handshake together.
8pub struct DeviceServer {
9    pub identity: DeviceIdentity,
10    pub mac_address: String,
11    pub capabilities: CapabilitySet,
12    pub credentials: NodeCredentials,
13}
14
15impl DeviceServer {
16    /// Build a discovery responder that signs replies with the device credentials.
17    pub fn discovery_responder(&self) -> DiscoveryResponder {
18        DiscoveryResponder {
19            identity: self.identity.clone(),
20            mac_address: self.mac_address.clone(),
21            capabilities: self.capabilities.clone(),
22            signer: self.credentials.signing.clone(),
23        }
24    }
25
26    /// Accept an inbound session using the provided transport.
27    pub async fn accept<T: HandshakeTransport + Send>(
28        &self,
29        transport: &mut T,
30    ) -> Result<AlnpSession, HandshakeError> {
31        let authenticator = Ed25519Authenticator::new(self.credentials.clone());
32        let key_exchange = X25519KeyExchange::new();
33        AlnpSession::accept(
34            self.identity.clone(),
35            self.capabilities.clone(),
36            authenticator,
37            key_exchange,
38            HandshakeContext::default(),
39            transport,
40        )
41        .await
42    }
43}