umsh_node/
channel.rs

1use alloc::string::String;
2
3use umsh_core::{ChannelId, ChannelKey};
4use umsh_crypto::{
5    CryptoEngine,
6    software::{SoftwareAes, SoftwareSha256},
7};
8
9/// A channel descriptor — holds the key, derived ID, and display name.
10///
11/// Not bound to any node. Create via [`Channel::named`] (key derived from name)
12/// or [`Channel::private`] (key independent of name).
13#[derive(Clone)]
14pub struct Channel {
15    key: ChannelKey,
16    channel_id: ChannelId,
17    name: String,
18}
19
20impl core::fmt::Debug for Channel {
21    fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
22        f.debug_struct("Channel")
23            .field("channel_id", &self.channel_id)
24            .field("name", &self.name)
25            .finish()
26    }
27}
28
29impl Channel {
30    /// Create a named channel whose key is derived from the name.
31    ///
32    /// Uses the same derivation as the MAC layer's `add_named_channel`.
33    pub fn named(name: &str) -> Self {
34        let crypto = CryptoEngine::new(SoftwareAes, SoftwareSha256);
35        let key = crypto.derive_named_channel_key(name);
36        let channel_id = crypto.derive_channel_id(&key);
37
38        Self {
39            key,
40            channel_id,
41            name: String::from(name),
42        }
43    }
44
45    /// Create a private channel with an explicit key.
46    ///
47    /// The name is for display only — it does not affect the key.
48    pub fn private(key: ChannelKey, name: &str) -> Self {
49        let crypto = CryptoEngine::new(SoftwareAes, SoftwareSha256);
50        let channel_id = crypto.derive_channel_id(&key);
51
52        Self {
53            key,
54            channel_id,
55            name: String::from(name),
56        }
57    }
58
59    /// The channel's display name.
60    pub fn name(&self) -> &str {
61        &self.name
62    }
63
64    /// The derived 2-byte channel ID (used for routing/filtering).
65    pub fn channel_id(&self) -> &ChannelId {
66        &self.channel_id
67    }
68
69    /// The full symmetric channel key.
70    pub fn key(&self) -> &ChannelKey {
71        &self.key
72    }
73}
74
75impl PartialEq for Channel {
76    fn eq(&self, other: &Self) -> bool {
77        self.key.0 == other.key.0
78    }
79}
80
81impl Eq for Channel {}