@@ -186,7 +186,7 @@ struct NocResp<'a> {
186
186
#[ tlvargs( lifetime = "'a" ) ]
187
187
struct AddNocReq < ' a > {
188
188
noc_value : OctetStr < ' a > ,
189
- icac_value : OctetStr < ' a > ,
189
+ icac_value : Option < OctetStr < ' a > > ,
190
190
ipk_value : OctetStr < ' a > ,
191
191
case_admin_subject : u64 ,
192
192
vendor_id : u16 ,
@@ -358,13 +358,17 @@ impl<'a> NocCluster<'a> {
358
358
359
359
let noc = heapless:: Vec :: from_slice ( r. noc_value . 0 ) . map_err ( |_| NocStatus :: InvalidNOC ) ?;
360
360
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) ;
364
365
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
+ }
368
372
} else {
369
373
None
370
374
} ;
@@ -601,6 +605,20 @@ impl<'a> NocCluster<'a> {
601
605
Ok ( ( ) )
602
606
}
603
607
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
+
604
622
fn handle_command_addtrustedrootcert (
605
623
& self ,
606
624
exchange : & Exchange ,
@@ -613,21 +631,12 @@ impl<'a> NocCluster<'a> {
613
631
614
632
// This may happen on CASE or PASE. For PASE, the existence of NOC Data is necessary
615
633
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
+ }
617
638
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) ?;
631
640
}
632
641
_ => ( ) ,
633
642
}
0 commit comments