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
7pub struct DeviceServer {
9 pub identity: DeviceIdentity,
10 pub mac_address: String,
11 pub capabilities: CapabilitySet,
12 pub credentials: NodeCredentials,
13}
14
15impl DeviceServer {
16 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 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}