diff --git a/examples/onoff_light/src/main.rs b/examples/onoff_light/src/main.rs index aadf5f7..50ae775 100644 --- a/examples/onoff_light/src/main.rs +++ b/examples/onoff_light/src/main.rs @@ -39,7 +39,7 @@ fn main() { }; let dev_att = Box::new(dev_att::HardCodedDevAtt::new()); - let mut matter = core::Matter::new(&dev_info, dev_att, &comm_data).unwrap(); + let mut matter = core::Matter::new(&dev_info, dev_att, comm_data).unwrap(); let dm = matter.get_data_model(); { let mut node = dm.node.write().unwrap(); diff --git a/matter/src/core.rs b/matter/src/core.rs index 35b8648..41cf08c 100644 --- a/matter/src/core.rs +++ b/matter/src/core.rs @@ -26,7 +26,7 @@ use crate::{ interaction_model::InteractionModel, mdns::Mdns, pairing::print_pairing_code_and_qr, - secure_channel::core::SecureChannel, + secure_channel::{core::SecureChannel, pake::PaseMgr, spake2p::VerifierData}, transport, }; use std::sync::Arc; @@ -56,17 +56,12 @@ impl Matter { pub fn new( dev_det: &BasicInfoConfig, dev_att: Box, - dev_comm: &CommissioningData, + dev_comm: CommissioningData, ) -> Result, Error> { let mdns = Mdns::get()?; - mdns.set_values( - dev_det.vid, - dev_det.pid, - dev_comm.discriminator, - &dev_det.device_name, - ); + mdns.set_values(dev_det.vid, dev_det.pid, &dev_det.device_name); - print_pairing_code_and_qr(dev_det, dev_comm); + print_pairing_code_and_qr(dev_det, &dev_comm); let fabric_mgr = Arc::new(FabricMgr::new()?); let acl_mgr = Arc::new(AclMgr::new()?); diff --git a/matter/src/fabric.rs b/matter/src/fabric.rs index 1e91617..bb729ae 100644 --- a/matter/src/fabric.rs +++ b/matter/src/fabric.rs @@ -381,7 +381,7 @@ impl FabricMgr { pub fn set_label(&self, index: u8, label: String) -> Result<(), Error> { let index = index as usize; let mut mgr = self.inner.write()?; - if label != "" { + if !label.is_empty() { for i in 1..MAX_SUPPORTED_FABRICS { if let Some(fabric) = &mgr.fabrics[i] { if fabric.label == label { diff --git a/matter/src/mdns.rs b/matter/src/mdns.rs index 6f66db5..53d7a35 100644 --- a/matter/src/mdns.rs +++ b/matter/src/mdns.rs @@ -30,8 +30,6 @@ pub struct MdnsInner { vid: u16, /// Product ID pid: u16, - /// Discriminator - discriminator: u16, /// Device name device_name: String, } @@ -75,11 +73,10 @@ impl Mdns { /// Set mDNS service specific values /// Values like vid, pid, discriminator etc // TODO: More things like device-type etc can be added here - pub fn set_values(&self, vid: u16, pid: u16, discriminator: u16, device_name: &str) { + pub fn set_values(&self, vid: u16, pid: u16, device_name: &str) { let mut inner = self.inner.lock().unwrap(); inner.vid = vid; inner.pid = pid; - inner.discriminator = discriminator; inner.device_name = device_name.chars().take(32).collect(); } @@ -92,12 +89,12 @@ impl Mdns { ServiceMode::Commissioned => { sys_publish_service(name, "_matter._tcp", MATTER_PORT, &[]) } - ServiceMode::Commissionable => { + ServiceMode::Commissionable(discriminator) => { let inner = self.inner.lock().unwrap(); - let short = compute_short_discriminator(inner.discriminator); - let serv_type = format!("_matterc._udp,_S{},_L{}", short, inner.discriminator); + let short = compute_short_discriminator(discriminator); + let serv_type = format!("_matterc._udp,_S{},_L{}", short, discriminator); - let str_discriminator = format!("{}", inner.discriminator); + let str_discriminator = format!("{}", discriminator); let txt_kvs = [ ["D", &str_discriminator], ["CM", "1"], diff --git a/matter/src/pairing.rs b/matter/src/pairing.rs index 070fb0e..a5e8487 100644 --- a/matter/src/pairing.rs +++ b/matter/src/pairing.rs @@ -23,7 +23,7 @@ use verhoeff::Verhoeff; use crate::{ codec::base38, data_model::cluster_basic_information::BasicInfoConfig, error::Error, - CommissioningData, + secure_channel::spake2p::VerifierOption, CommissioningData, }; const LONG_BITS: usize = 12; @@ -130,10 +130,15 @@ fn compute_pairing_code(comm_data: &CommissioningData) -> String { let CommissioningData { discriminator, - passwd, + verifier, .. } = comm_data; + let passwd = match verifier.data { + VerifierOption::Password(pwd) => pwd, + VerifierOption::Verifier(_) => todo!(), + }; + let mut digits = String::new(); digits.push_str(&((VID_PID_PRESENT << 2) | (discriminator >> 10) as u8).to_string()); digits.push_str(&format!( @@ -233,6 +238,11 @@ fn generate_bit_set( return Err(Error::BufferTooSmall); }; + let passwd = match payload.comm_data.verifier.data { + VerifierOption::Password(pwd) => pwd, + VerifierOption::Verifier(_) => todo!(), + }; + const VERSION: u64 = 0; populate_bits( bits, @@ -285,7 +295,7 @@ fn generate_bit_set( populate_bits( bits, &mut offset, - payload.comm_data.passwd as u64, + passwd as u64, SETUP_PINCODE_FIELD_LENGTH_IN_BITS, total_payload_size_in_bits, )?; @@ -306,22 +316,22 @@ fn generate_bit_set( #[cfg(test)] mod tests { + use crate::secure_channel::spake2p::VerifierData; + use super::*; #[test] fn can_compute_pairing_code() { let comm_data = CommissioningData { - passwd: 123456, + verifier: VerifierData::new_with_pw(123456), discriminator: 250, - ..Default::default() }; let pairing_code = compute_pairing_code(&comm_data); assert_eq!(pairing_code, "00876800071"); let comm_data = CommissioningData { - passwd: 34567890, + verifier: VerifierData::new_with_pw(34567890), discriminator: 2976, - ..Default::default() }; let pairing_code = compute_pairing_code(&comm_data); assert_eq!(pairing_code, "26318621095"); @@ -332,9 +342,8 @@ mod tests { const QR_CODE: &str = "MT:YNJV7VSC00CMVH7SR00"; let comm_data = CommissioningData { - passwd: 34567890, + verifier: VerifierData::new_with_pw(34567890), discriminator: 2976, - ..Default::default() }; let dev_det = BasicInfoConfig { vid: 9050, diff --git a/matter/src/secure_channel/crypto_mbedtls.rs b/matter/src/secure_channel/crypto_mbedtls.rs index 7231f63..7ac4c5a 100644 --- a/matter/src/secure_channel/crypto_mbedtls.rs +++ b/matter/src/secure_channel/crypto_mbedtls.rs @@ -115,7 +115,7 @@ impl CryptoSpake2 for CryptoMbedTLS { } fn set_L(&mut self, l: &[u8]) -> Result<(), Error> { - self.L = EcPoint::from_binary(&mut self.group, l)?; + self.L = EcPoint::from_binary(&self.group, l)?; Ok(()) } diff --git a/matter/tests/common/im_engine.rs b/matter/tests/common/im_engine.rs index 923d499..b1a69de 100644 --- a/matter/tests/common/im_engine.rs +++ b/matter/tests/common/im_engine.rs @@ -106,14 +106,7 @@ impl ImEngine { // Only allow the standard peer node id of the IM Engine default_acl.add_subject(IM_ENGINE_PEER_ID).unwrap(); acl_mgr.add(default_acl).unwrap(); - let dm = DataModel::new( - dev_det, - dev_att, - fabric_mgr.clone(), - acl_mgr.clone(), - pase_mgr, - ) - .unwrap(); + let dm = DataModel::new(&dev_det, dev_att, fabric_mgr, acl_mgr.clone(), pase_mgr).unwrap(); { let mut d = dm.node.write().unwrap();