diff --git a/rs-matter/src/cert/mod.rs b/rs-matter/src/cert/mod.rs index 9e03a52..5821c07 100644 --- a/rs-matter/src/cert/mod.rs +++ b/rs-matter/src/cert/mod.rs @@ -215,7 +215,7 @@ fn encode_extension_end(w: &mut dyn CertConsumer) -> Result<(), Error> { w.end_seq() } -#[derive(FromTLV, ToTLV, Default, Debug)] +#[derive(ToTLV, Default, Debug)] #[tlvargs(lifetime = "'a", start = 1, datatype = "list")] struct Extensions<'a> { basic_const: Option, @@ -272,6 +272,56 @@ impl<'a> Extensions<'a> { } } +impl<'a> crate::tlv::FromTLV<'a> for Extensions<'a> { + fn from_tlv(t: &TLVElement<'a>) -> Result { + let tlv_iter = t + .confirm_list()? + .enter() + .ok_or_else(|| Error::new(ErrorCode::Invalid))?; + let mut extensions = Extensions::default(); + for item in tlv_iter { + if item.check_ctx_tag(1u8) { + if extensions.basic_const.is_none() { + extensions.basic_const = Option::from_tlv(&item)?; + } else { + return Err(Error::new(ErrorCode::InvalidData)); + } + } else if item.check_ctx_tag(2u8) { + if extensions.key_usage.is_none() { + extensions.key_usage = Option::from_tlv(&item)?; + } else { + return Err(Error::new(ErrorCode::InvalidData)); + } + } else if item.check_ctx_tag(3u8) { + if extensions.ext_key_usage.is_none() { + extensions.ext_key_usage = Option::from_tlv(&item)?; + } else { + return Err(Error::new(ErrorCode::InvalidData)); + } + } else if item.check_ctx_tag(4u8) { + if extensions.subj_key_id.is_none() { + extensions.subj_key_id = Option::from_tlv(&item)?; + } else { + return Err(Error::new(ErrorCode::InvalidData)); + } + } else if item.check_ctx_tag(5u8) { + if extensions.auth_key_id.is_none() { + extensions.auth_key_id = Option::from_tlv(&item)?; + } else { + return Err(Error::new(ErrorCode::InvalidData)); + } + } else if item.check_ctx_tag(6u8) { + if extensions.future_extensions.is_none() { + extensions.future_extensions = Option::from_tlv(&item)?; + } else { + return Err(Error::new(ErrorCode::InvalidData)); + } + } + } + Ok(extensions) + } +} + #[derive(FromPrimitive, Copy, Clone)] enum DnTags { CommonName = 1,