Skip to content

Commit eceef8b

Browse files
committed
CASE: Support ICAC Optional in AddNocReq and AddTrusted RCA in CASE
1 parent dfd2f7e commit eceef8b

File tree

1 file changed

+30
-21
lines changed
  • rs-matter/src/data_model/sdm

1 file changed

+30
-21
lines changed

rs-matter/src/data_model/sdm/noc.rs

Lines changed: 30 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -186,7 +186,7 @@ struct NocResp<'a> {
186186
#[tlvargs(lifetime = "'a")]
187187
struct AddNocReq<'a> {
188188
noc_value: OctetStr<'a>,
189-
icac_value: OctetStr<'a>,
189+
icac_value: Option<OctetStr<'a>>,
190190
ipk_value: OctetStr<'a>,
191191
case_admin_subject: u64,
192192
vendor_id: u16,
@@ -358,13 +358,17 @@ impl<'a> NocCluster<'a> {
358358

359359
let noc = heapless::Vec::from_slice(r.noc_value.0).map_err(|_| NocStatus::InvalidNOC)?;
360360

361-
let icac = if !r.icac_value.0.is_empty() {
362-
let icac_cert = Cert::new(r.icac_value.0).map_err(|_| NocStatus::InvalidNOC)?;
363-
info!("Received ICAC as: {}", icac_cert);
361+
let icac = if let Some(icac_value) = r.icac_value {
362+
if !icac_value.0.is_empty() {
363+
let icac_cert = Cert::new(icac_value.0).map_err(|_| NocStatus::InvalidNOC)?;
364+
info!("Received ICAC as: {}", icac_cert);
364365

365-
let icac =
366-
heapless::Vec::from_slice(r.icac_value.0).map_err(|_| NocStatus::InvalidNOC)?;
367-
Some(icac)
366+
let icac =
367+
heapless::Vec::from_slice(icac_value.0).map_err(|_| NocStatus::InvalidNOC)?;
368+
Some(icac)
369+
} else {
370+
None
371+
}
368372
} else {
369373
None
370374
};
@@ -601,6 +605,20 @@ impl<'a> NocCluster<'a> {
601605
Ok(())
602606
}
603607

608+
fn add_rca_to_session_noc_data(exchange: &Exchange, data: &TLVElement) -> Result<(), Error> {
609+
exchange.with_session_mut(|sess| {
610+
let noc_data = sess.get_noc_data().ok_or(ErrorCode::NoSession)?;
611+
612+
let req = CommonReq::from_tlv(data).map_err(Error::map_invalid_command)?;
613+
info!("Received Trusted Cert:{:x?}", req.str);
614+
615+
noc_data.root_ca =
616+
heapless::Vec::from_slice(req.str.0).map_err(|_| ErrorCode::BufferTooSmall)?;
617+
618+
Ok(())
619+
})
620+
}
621+
604622
fn handle_command_addtrustedrootcert(
605623
&self,
606624
exchange: &Exchange,
@@ -613,21 +631,12 @@ impl<'a> NocCluster<'a> {
613631

614632
// This may happen on CASE or PASE. For PASE, the existence of NOC Data is necessary
615633
match exchange.with_session(|sess| Ok(sess.get_session_mode().clone()))? {
616-
SessionMode::Case(_) => error!("CASE: AddTrustedRootCert handling pending"), // For a CASE Session, we just return success for now,
634+
SessionMode::Case(_) => {
635+
// TODO - Updating the Trusted RCA of an existing Fabric
636+
Self::add_rca_to_session_noc_data(exchange, data)?;
637+
}
617638
SessionMode::Pase => {
618-
exchange.with_session_mut(|sess| {
619-
let noc_data = sess.get_noc_data().ok_or(ErrorCode::NoSession)?;
620-
621-
let req = CommonReq::from_tlv(data).map_err(Error::map_invalid_command)?;
622-
info!("Received Trusted Cert:{:x?}", req.str);
623-
624-
noc_data.root_ca = heapless::Vec::from_slice(req.str.0)
625-
.map_err(|_| ErrorCode::BufferTooSmall)?;
626-
627-
Ok(())
628-
})?;
629-
630-
// TODO
639+
Self::add_rca_to_session_noc_data(exchange, data)?;
631640
}
632641
_ => (),
633642
}

0 commit comments

Comments
 (0)