Skip to content

Commit 725d191

Browse files
committed
Session: Include NoC CAT fields, and populate them from the CASE exchange
1 parent 315b7ed commit 725d191

File tree

7 files changed

+68
-15
lines changed

7 files changed

+68
-15
lines changed

matter/src/cert/mod.rs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -318,6 +318,18 @@ impl DistNames {
318318
}
319319
})
320320
}
321+
322+
fn u64_arr(&self, match_id: DnTags, output: &mut [u64]) {
323+
let mut out_index = 0;
324+
for (_, val) in self.dn.iter().filter(|(id, _)| *id == match_id as u8) {
325+
if let DistNameValue::Uint(a) = val {
326+
if out_index < output.len() {
327+
output[out_index] = *a;
328+
out_index += 1;
329+
}
330+
}
331+
}
332+
}
321333
}
322334

323335
const PRINTABLE_STR_THRESHOLD: u8 = 0x80;
@@ -543,6 +555,10 @@ impl Cert {
543555
self.subject.u64(DnTags::NodeId).ok_or(Error::NoNodeId)
544556
}
545557

558+
pub fn get_cat_ids(&self, output: &mut [u64]) {
559+
self.subject.u64_arr(DnTags::NocCat, output)
560+
}
561+
546562
pub fn get_fabric_id(&self) -> Result<u64, Error> {
547563
self.subject.u64(DnTags::FabricId).ok_or(Error::NoFabricId)
548564
}

matter/src/data_model/core.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -221,7 +221,7 @@ impl DataModel {
221221
match sess.get_session_mode() {
222222
SessionMode::Case(c) => {
223223
let subject = AccessorSubjects::new(sess.get_peer_node_id().unwrap_or_default());
224-
Accessor::new(c, subject, AuthMode::Case, self.acl_mgr.clone())
224+
Accessor::new(c.fab_idx, subject, AuthMode::Case, self.acl_mgr.clone())
225225
}
226226
SessionMode::Pase => Accessor::new(
227227
0,

matter/src/data_model/sdm/failsafe.rs

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -89,10 +89,15 @@ impl FailSafe {
8989
match c.noc_state {
9090
NocState::NocNotRecvd => return Err(Error::Invalid),
9191
NocState::AddNocRecvd(idx) | NocState::UpdateNocRecvd(idx) => {
92-
if SessionMode::Case(idx) != session_mode {
93-
error!(
94-
"Received disarm in separate session from previous Add/Update NOC"
95-
);
92+
if let SessionMode::Case(c) = session_mode {
93+
if c.fab_idx != idx {
94+
error!(
95+
"Received disarm in separate session from previous Add/Update NOC"
96+
);
97+
return Err(Error::Invalid);
98+
}
99+
} else {
100+
error!("Received disarm in a non-CASE session");
96101
return Err(Error::Invalid);
97102
}
98103
}

matter/src/data_model/sdm/noc.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -248,11 +248,11 @@ impl NocCluster {
248248
.map_err(|_| IMStatusCode::InvalidDataType)?;
249249

250250
let (result, fab_idx) =
251-
if let SessionMode::Case(fab_idx) = cmd_req.trans.session.get_session_mode() {
252-
if self.fabric_mgr.set_label(fab_idx, label).is_err() {
253-
(NocStatus::LabelConflict, fab_idx)
251+
if let SessionMode::Case(c) = cmd_req.trans.session.get_session_mode() {
252+
if self.fabric_mgr.set_label(c.fab_idx, label).is_err() {
253+
(NocStatus::LabelConflict, c.fab_idx)
254254
} else {
255-
(NocStatus::Ok, fab_idx)
255+
(NocStatus::Ok, c.fab_idx)
256256
}
257257
} else {
258258
// Update Fabric Label not allowed

matter/src/secure_channel/case.rs

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ use crate::{
3333
network::Address,
3434
proto_demux::{ProtoCtx, ResponseRequired},
3535
queue::{Msg, WorkQ},
36-
session::{CloneData, SessionMode},
36+
session::{CaseDetails, CloneData, NocCatIds, SessionMode},
3737
},
3838
utils::writebuf::WriteBuf,
3939
};
@@ -155,13 +155,16 @@ impl Case {
155155
}
156156

157157
// Only now do we add this message to the TT Hash
158+
let mut peer_catids: NocCatIds = Default::default();
159+
initiator_noc.get_cat_ids(&mut peer_catids);
158160
case_session.tt_hash.update(ctx.rx.as_borrow_slice())?;
159161
let clone_data = Case::get_session_clone_data(
160162
fabric.ipk.op_key(),
161163
fabric.get_node_id(),
162164
initiator_noc.get_node_id()?,
163165
ctx.exch_ctx.sess.get_peer_addr(),
164166
&case_session,
167+
&peer_catids,
165168
)?;
166169
// Queue a transport mgr request to add a new session
167170
WorkQ::get()?.sync_send(Msg::NewSession(clone_data))?;
@@ -281,6 +284,7 @@ impl Case {
281284
peer_nodeid: u64,
282285
peer_addr: Address,
283286
case_session: &CaseSession,
287+
peer_catids: &NocCatIds,
284288
) -> Result<CloneData, Error> {
285289
let mut session_keys = [0_u8; 3 * crypto::SYMM_KEY_LEN_BYTES];
286290
Case::get_session_keys(
@@ -296,7 +300,10 @@ impl Case {
296300
case_session.peer_sessid,
297301
case_session.local_sessid,
298302
peer_addr,
299-
SessionMode::Case(case_session.local_fabric_idx as u8),
303+
SessionMode::Case(CaseDetails::new(
304+
case_session.local_fabric_idx as u8,
305+
peer_catids,
306+
)),
300307
);
301308

302309
clone_data.dec_key.copy_from_slice(&session_keys[0..16]);

matter/src/transport/session.rs

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,12 +37,28 @@ use super::{
3737
packet::{Packet, PacketPool},
3838
};
3939

40+
pub const MAX_CAT_IDS_PER_NOC: usize = 3;
4041
const MATTER_AES128_KEY_SIZE: usize = 16;
4142

43+
#[derive(Debug, Default, Copy, Clone, PartialEq)]
44+
pub struct CaseDetails {
45+
pub fab_idx: u8,
46+
pub cat_ids: [u64; MAX_CAT_IDS_PER_NOC],
47+
}
48+
49+
impl CaseDetails {
50+
pub fn new(fab_idx: u8, cat_ids: &[u64; MAX_CAT_IDS_PER_NOC]) -> Self {
51+
Self {
52+
fab_idx,
53+
cat_ids: *cat_ids,
54+
}
55+
}
56+
}
57+
4258
#[derive(Debug, PartialEq, Copy, Clone)]
4359
pub enum SessionMode {
4460
// The Case session will capture the local fabric index
45-
Case(u8),
61+
Case(CaseDetails),
4662
Pase,
4763
PlainText,
4864
}
@@ -53,6 +69,8 @@ impl Default for SessionMode {
5369
}
5470
}
5571

72+
pub type NocCatIds = [u64; MAX_CAT_IDS_PER_NOC];
73+
5674
#[derive(Debug)]
5775
pub struct Session {
5876
peer_addr: Address,
@@ -188,9 +206,16 @@ impl Session {
188206
self.peer_nodeid
189207
}
190208

209+
pub fn get_peer_cat_ids(&self) -> Option<&NocCatIds> {
210+
match &self.mode {
211+
SessionMode::Case(a) => Some(&a.cat_ids),
212+
_ => None,
213+
}
214+
}
215+
191216
pub fn get_local_fabric_idx(&self) -> Option<u8> {
192217
match self.mode {
193-
SessionMode::Case(a) => Some(a),
218+
SessionMode::Case(a) => Some(a.fab_idx),
194219
_ => None,
195220
}
196221
}

matter/tests/common/im_engine.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,14 +32,14 @@ use matter::{
3232
secure_channel::pake::PaseMgr,
3333
tlv::{TLVWriter, TagType, ToTLV},
3434
transport::packet::Packet,
35-
transport::proto_demux::HandleProto,
3635
transport::{
3736
exchange::{self, Exchange, ExchangeCtx},
3837
network::Address,
3938
packet::PacketPool,
4039
proto_demux::ProtoCtx,
4140
session::{CloneData, SessionMgr, SessionMode},
4241
},
42+
transport::{proto_demux::HandleProto, session::CaseDetails},
4343
utils::writebuf::WriteBuf,
4444
};
4545
use std::{
@@ -146,7 +146,7 @@ impl ImEngine {
146146
std::net::IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)),
147147
5542,
148148
)),
149-
SessionMode::Case(1),
149+
SessionMode::Case(CaseDetails::new(1, &Default::default())),
150150
);
151151
let sess_idx = sess_mgr.clone_session(&clone_data).unwrap();
152152
let sess = sess_mgr.get_session_handle(sess_idx);

0 commit comments

Comments
 (0)