├── .gitignore ├── homekit ├── src │ ├── lib.rs │ └── advertise.rs └── Cargo.toml ├── rustfmt.toml ├── nostd_srp ├── src │ ├── lib.rs │ └── tests.rs └── Cargo.toml ├── rust-toolchain.toml ├── Cargo.toml ├── washmon ├── memory.x ├── Cargo.toml ├── build.rs └── src │ └── main.rs ├── .cargo └── config.toml ├── README.md ├── LICENSE └── Cargo.lock /.gitignore: -------------------------------------------------------------------------------- 1 | /target 2 | **/*.rs.bk 3 | **/*.snap.new 4 | -------------------------------------------------------------------------------- /homekit/src/lib.rs: -------------------------------------------------------------------------------- 1 | #![no_std] 2 | 3 | pub mod advertise; 4 | -------------------------------------------------------------------------------- /rustfmt.toml: -------------------------------------------------------------------------------- 1 | wrap_comments = true 2 | imports_granularity = "One" 3 | -------------------------------------------------------------------------------- /nostd_srp/src/lib.rs: -------------------------------------------------------------------------------- 1 | #![no_std] 2 | 3 | pub fn foo() {} 4 | 5 | #[cfg(test)] 6 | mod tests; 7 | -------------------------------------------------------------------------------- /rust-toolchain.toml: -------------------------------------------------------------------------------- 1 | [toolchain] 2 | channel = "stable" 3 | profile = "default" 4 | targets = ["thumbv7em-none-eabi"] 5 | -------------------------------------------------------------------------------- /nostd_srp/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "nostd_srp" 3 | version = "0.1.0" 4 | edition = "2021" 5 | 6 | [dependencies] 7 | 8 | [dev-dependencies] 9 | srp = "0.6.0" 10 | sha2 = "0.10.8" 11 | -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | [workspace] 2 | resolver = "2" 3 | members = ["homekit", "nostd_srp", "washmon"] 4 | 5 | [profile.dev] 6 | opt-level = "s" 7 | 8 | [profile.release] 9 | opt-level = "s" 10 | debug = 2 11 | lto = true 12 | codegen-units = 1 13 | -------------------------------------------------------------------------------- /homekit/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "homekit" 3 | version = "0.1.0" 4 | edition = "2021" 5 | 6 | [dependencies] 7 | byteorder = { version = "1.5.0", default-features = false } 8 | nrf-softdevice = { version = "0.1.0", features = ["ble-peripheral"] } 9 | -------------------------------------------------------------------------------- /washmon/memory.x: -------------------------------------------------------------------------------- 1 | MEMORY 2 | { 3 | /* NOTE 1 K = 1 KiBi = 1024 bytes */ 4 | /* NRF52832 with Softdevice S113 7.x */ 5 | FLASH : ORIGIN = 0x00000000 + 0x1C000, LENGTH = 512K - 0x1C000 6 | RAM : ORIGIN = 0x20000000 + 0x6e28, LENGTH = 64K - 0x6e28 7 | } 8 | -------------------------------------------------------------------------------- /.cargo/config.toml: -------------------------------------------------------------------------------- 1 | [target.'cfg(all(target_arch = "arm", target_os = "none"))'] 2 | # replace nRF82840_xxAA with your chip as listed in `probe-rs chip list` 3 | runner = "probe-rs run --chip nRF52832_xxAA" 4 | 5 | [build] 6 | target = "thumbv7em-none-eabi" 7 | 8 | [env] 9 | DEFMT_LOG = "trace" 10 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # HomeKit 2 | 3 | > `no_std` HomeKit Accessory Protocol implementation for embedded Rust 4 | 5 | [![Build Status](https://travis-ci.org/chocol4te/homekit.svg?branch=master)](https://travis-ci.org/chocol4te/homekit) 6 | [![Dependabot Status](https://api.dependabot.com/badges/status?host=github&repo=chocol4te/homekit)](https://dependabot.com) 7 | 8 | ## Usage 9 | 10 | ``` 11 | $ probe-rs download --verify --format hex --chip nRF52832_xxAA s113_nrf52_7.2.0_softdevice.hex 12 | $ cargo r -r 13 | ``` 14 | 15 | ## Contributing 16 | 17 | Issues and PRs very welcome :) 18 | 19 | ## License 20 | 21 | Mozilla Public License Version 2.0 ([LICENSE](LICENSE) or https://www.mozilla.org/en-US/MPL/2.0/) 22 | -------------------------------------------------------------------------------- /washmon/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "washmon" 3 | version = "0.1.0" 4 | edition = "2021" 5 | 6 | [dependencies] 7 | cortex-m = { version = "0.7.6", features = ["inline-asm", "critical-section-single-core"] } 8 | cortex-m-rt = "0.7.0" 9 | 10 | embassy-executor = {version = "0.5.0", features = ["task-arena-size-32768", "arch-cortex-m", "executor-thread", "executor-interrupt", "defmt", "integrated-timers"] } 11 | embassy-time = { version = "0.3.0", features = ["defmt"] } 12 | embassy-nrf = { version = "0.1.0",features = ["defmt", "nrf52832", "time-driver-rtc1", "gpiote", "unstable-pac", "time"] } 13 | nrf-softdevice = { version = "0.1.0", features = ["defmt", "ble-peripheral", "nrf52832", "s113"] } 14 | 15 | defmt = "0.3.6" 16 | defmt-rtt = "0.4.0" 17 | panic-probe = { version = "0.3.1", features = ["print-defmt"] } 18 | 19 | homekit = { path = "../homekit" } 20 | -------------------------------------------------------------------------------- /washmon/build.rs: -------------------------------------------------------------------------------- 1 | //! This build script copies the `memory.x` file from the crate root into 2 | //! a directory where the linker can always find it at build time. 3 | //! For many projects this is optional, as the linker always searches the 4 | //! project root directory -- wherever `Cargo.toml` is. However, if you 5 | //! are using a workspace or have a more complicated build setup, this 6 | //! build script becomes required. Additionally, by requesting that 7 | //! Cargo re-run the build script whenever `memory.x` is changed, 8 | //! updating `memory.x` ensures a rebuild of the application with the 9 | //! new memory settings. 10 | 11 | use std::{env, fs::File, io::Write, path::PathBuf}; 12 | 13 | fn main() { 14 | // Put `memory.x` in our output directory and ensure it's 15 | // on the linker search path. 16 | let out = &PathBuf::from(env::var_os("OUT_DIR").unwrap()); 17 | File::create(out.join("memory.x")) 18 | .unwrap() 19 | .write_all(include_bytes!("memory.x")) 20 | .unwrap(); 21 | println!("cargo:rustc-link-search={}", out.display()); 22 | 23 | // By default, Cargo will re-run a build script whenever 24 | // any file in the project changes. By specifying `memory.x` 25 | // here, we ensure the build script is only re-run when 26 | // `memory.x` is changed. 27 | println!("cargo:rerun-if-changed=memory.x"); 28 | 29 | println!("cargo:rustc-link-arg-bins=--nmagic"); 30 | println!("cargo:rustc-link-arg-bins=-Tlink.x"); 31 | println!("cargo:rustc-link-arg-bins=-Tdefmt.x"); 32 | } 33 | -------------------------------------------------------------------------------- /washmon/src/main.rs: -------------------------------------------------------------------------------- 1 | #![no_std] 2 | #![no_main] 3 | 4 | use { 5 | core::mem, 6 | defmt::info, 7 | defmt_rtt as _, 8 | embassy_executor::Spawner, 9 | embassy_nrf::{ 10 | gpio::{Level, Output, OutputDrive}, 11 | interrupt::Priority, 12 | peripherals::P0_14, 13 | }, 14 | embassy_time::Timer, 15 | homekit::advertise, 16 | nrf_softdevice::{ 17 | ble::{ 18 | advertisement_builder::{LegacyAdvertisementBuilder, LegacyAdvertisementPayload}, 19 | peripheral, 20 | }, 21 | raw, Softdevice, 22 | }, 23 | panic_probe as _, 24 | }; 25 | 26 | #[embassy_executor::task] 27 | async fn softdevice_task(sd: &'static Softdevice) -> ! { 28 | sd.run().await 29 | } 30 | 31 | #[embassy_executor::task] 32 | async fn advertiser_task(sd: &'static Softdevice) -> ! { 33 | let mut config = peripheral::Config::default(); 34 | config.interval = 50; 35 | 36 | let adv_data = homekit::advertise::AdvertiseData::new( 37 | advertise::Interval::_501_1250MS, 38 | advertise::PairingStatus::NotPaired, 39 | 1234, 40 | advertise::AccessoryCategory::Sensor, 41 | 1, 42 | 1, 43 | ) 44 | .as_payload(); 45 | 46 | // but we can put it in the scan data 47 | // so the full name is visible once connected 48 | let scan_data: LegacyAdvertisementPayload = LegacyAdvertisementBuilder::new() 49 | .full_name("Hello, Rust!") 50 | .build(); 51 | 52 | let adv = peripheral::NonconnectableAdvertisement::ScannableUndirected { 53 | adv_data: &adv_data, 54 | scan_data: &scan_data, 55 | }; 56 | 57 | loop { 58 | peripheral::advertise(sd, adv, &config).await.unwrap(); 59 | } 60 | } 61 | 62 | #[embassy_executor::task] 63 | async fn blinker(mut led: Output<'static, P0_14>) -> ! { 64 | loop { 65 | led.set_high(); 66 | Timer::after_millis(500).await; 67 | 68 | led.set_low(); 69 | Timer::after_millis(500).await; 70 | } 71 | } 72 | 73 | #[embassy_executor::main] 74 | async fn main(spawner: Spawner) { 75 | info!("starting"); 76 | 77 | // 0 is Highest. Lower prio number can preempt higher prio number 78 | // Softdevice has reserved priorities 0, 1 and 4 79 | let mut config = embassy_nrf::config::Config::default(); 80 | config.gpiote_interrupt_priority = Priority::P2; 81 | config.time_interrupt_priority = Priority::P2; 82 | let peripherals = embassy_nrf::init(config); 83 | 84 | let led = Output::new(peripherals.P0_14, Level::High, OutputDrive::Standard); 85 | spawner.spawn(blinker(led)).unwrap(); 86 | 87 | let sd = init_softdevice(); 88 | spawner.spawn(softdevice_task(sd)).unwrap(); 89 | spawner.spawn(advertiser_task(sd)).unwrap(); 90 | } 91 | 92 | fn init_softdevice() -> &'static mut Softdevice { 93 | let config = nrf_softdevice::Config { 94 | clock: Some(raw::nrf_clock_lf_cfg_t { 95 | source: raw::NRF_CLOCK_LF_SRC_RC as u8, 96 | rc_ctiv: 16, 97 | rc_temp_ctiv: 2, 98 | accuracy: raw::NRF_CLOCK_LF_ACCURACY_500_PPM as u8, 99 | }), 100 | conn_gap: Some(raw::ble_gap_conn_cfg_t { 101 | conn_count: 6, 102 | event_length: 24, 103 | }), 104 | conn_gatt: Some(raw::ble_gatt_conn_cfg_t { att_mtu: 256 }), 105 | gatts_attr_tab_size: Some(raw::ble_gatts_cfg_attr_tab_size_t { 106 | attr_tab_size: raw::BLE_GATTS_ATTR_TAB_SIZE_DEFAULT, 107 | }), 108 | gap_role_count: Some(raw::ble_gap_cfg_role_count_t { 109 | adv_set_count: 1, 110 | periph_role_count: 3, 111 | }), 112 | gap_device_name: Some(raw::ble_gap_cfg_device_name_t { 113 | p_value: b"HelloRust" as *const u8 as _, 114 | current_len: 9, 115 | max_len: 9, 116 | write_perm: unsafe { mem::zeroed() }, 117 | _bitfield_1: raw::ble_gap_cfg_device_name_t::new_bitfield_1( 118 | raw::BLE_GATTS_VLOC_STACK as u8, 119 | ), 120 | }), 121 | ..Default::default() 122 | }; 123 | 124 | Softdevice::enable(&config) 125 | } 126 | -------------------------------------------------------------------------------- /homekit/src/advertise.rs: -------------------------------------------------------------------------------- 1 | use { 2 | byteorder::{self, ByteOrder}, 3 | nrf_softdevice::ble::advertisement_builder::{ 4 | AdvertisementDataType, LegacyAdvertisementBuilder, LegacyAdvertisementPayload, 5 | }, 6 | }; 7 | 8 | pub struct AdvertiseData([u8; 17]); 9 | 10 | impl<'a, 'b> AdvertiseData 11 | where 12 | 'a: 'b, 13 | { 14 | pub fn new( 15 | interval: Interval, 16 | pair_status: PairingStatus, 17 | device_id: u64, 18 | accessory_category: AccessoryCategory, 19 | global_state_number: u16, 20 | configuration_number: u8, 21 | ) -> Self { 22 | let mut inner = [0u8; 17]; 23 | 24 | // CoID of Apple, Inc. 25 | inner[0] = 0x4C; 26 | inner[1] = 0x00; 27 | 28 | // Type (HomeKit) 29 | inner[2] = 0x06; 30 | 31 | // Advertising Interval and Length 32 | inner[3] = interval.value(); 33 | 34 | // Status Flags 35 | inner[4] = pair_status.value(); 36 | 37 | // 48-bit Device ID 38 | byteorder::BigEndian::write_u48(&mut inner[5..12], device_id); 39 | 40 | // Accessory Category Identifier 41 | byteorder::BigEndian::write_u16(&mut inner[11..13], accessory_category.value()); 42 | 43 | // Global State Number 44 | byteorder::BigEndian::write_u16(&mut inner[13..15], global_state_number); 45 | 46 | // Configuration Number 47 | inner[15] = configuration_number; 48 | 49 | // Compatible Version 50 | inner[16] = 0x02; 51 | 52 | Self(inner) 53 | } 54 | 55 | pub fn as_slice(&self) -> &[u8] { 56 | self.0.as_slice() 57 | } 58 | 59 | pub fn as_payload(&self) -> LegacyAdvertisementPayload { 60 | LegacyAdvertisementBuilder::new() 61 | .raw( 62 | AdvertisementDataType::MANUFACTURER_SPECIFIC_DATA, 63 | self.as_slice(), 64 | ) 65 | .build() 66 | } 67 | } 68 | 69 | pub enum Interval { 70 | _10_25MS, 71 | _26_100MS, 72 | _101_300MS, 73 | _301_500MS, 74 | _501_1250MS, 75 | _1251_2500MS, 76 | _2500MS, 77 | } 78 | 79 | impl Interval { 80 | fn value(&self) -> u8 { 81 | match *self { 82 | Interval::_10_25MS => 0x2D, 83 | Interval::_26_100MS => 0x4D, 84 | Interval::_101_300MS => 0x6D, 85 | Interval::_301_500MS => 0x8D, 86 | Interval::_501_1250MS => 0xAD, 87 | Interval::_1251_2500MS => 0xCD, 88 | Interval::_2500MS => 0xED, 89 | } 90 | } 91 | } 92 | 93 | pub enum PairingStatus { 94 | Paired, 95 | NotPaired, 96 | } 97 | 98 | impl PairingStatus { 99 | fn value(&self) -> u8 { 100 | match *self { 101 | PairingStatus::Paired => 0b0, 102 | PairingStatus::NotPaired => 0b1, 103 | } 104 | } 105 | } 106 | 107 | pub enum AccessoryCategory { 108 | Other, 109 | Bridge, 110 | Fan, 111 | Garage, 112 | Lightbulb, 113 | DoorLock, 114 | Outlet, 115 | Switch, 116 | Thermostat, 117 | Sensor, 118 | SecuritySystem, 119 | Door, 120 | Window, 121 | WindowCovering, 122 | ProgrammableSwitch, 123 | RangeExtender, 124 | IPCamera, 125 | VideoDoorBell, 126 | AirPurifier, 127 | Reserved, 128 | } 129 | 130 | impl AccessoryCategory { 131 | fn value(&self) -> u16 { 132 | match *self { 133 | AccessoryCategory::Other => 1, 134 | AccessoryCategory::Bridge => 2, 135 | AccessoryCategory::Fan => 3, 136 | AccessoryCategory::Garage => 4, 137 | AccessoryCategory::Lightbulb => 5, 138 | AccessoryCategory::DoorLock => 6, 139 | AccessoryCategory::Outlet => 7, 140 | AccessoryCategory::Switch => 8, 141 | AccessoryCategory::Thermostat => 9, 142 | AccessoryCategory::Sensor => 10, 143 | AccessoryCategory::SecuritySystem => 11, 144 | AccessoryCategory::Door => 12, 145 | AccessoryCategory::Window => 13, 146 | AccessoryCategory::WindowCovering => 14, 147 | AccessoryCategory::ProgrammableSwitch => 15, 148 | AccessoryCategory::RangeExtender => 16, 149 | AccessoryCategory::IPCamera => 17, 150 | AccessoryCategory::VideoDoorBell => 18, 151 | AccessoryCategory::AirPurifier => 19, 152 | AccessoryCategory::Reserved => 65535, 153 | } 154 | } 155 | } 156 | -------------------------------------------------------------------------------- /nostd_srp/src/tests.rs: -------------------------------------------------------------------------------- 1 | use sha2::Sha512; 2 | use srp::client::SrpClient; 3 | use srp::groups::G_3072; 4 | 5 | // not needed as provided by G_3072 6 | const MODULUS: &[u8] = &[ 7 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC9, 0x0F, 0xDA, 0xA2, 0x21, 0x68, 0xC2, 0x34, 8 | 0xC4, 0xC6, 0x62, 0x8B, 0x80, 0xDC, 0x1C, 0xD1, 0x29, 0x02, 0x4E, 0x08, 0x8A, 0x67, 0xCC, 0x74, 9 | 0x02, 0x0B, 0xBE, 0xA6, 0x3B, 0x13, 0x9B, 0x22, 0x51, 0x4A, 0x08, 0x79, 0x8E, 0x34, 0x04, 0xDD, 10 | 0xEF, 0x95, 0x19, 0xB3, 0xCD, 0x3A, 0x43, 0x1B, 0x30, 0x2B, 0x0A, 0x6D, 0xF2, 0x5F, 0x14, 0x37, 11 | 0x4F, 0xE1, 0x35, 0x6D, 0x6D, 0x51, 0xC2, 0x45, 0xE4, 0x85, 0xB5, 0x76, 0x62, 0x5E, 0x7E, 0xC6, 12 | 0xF4, 0x4C, 0x42, 0xE9, 0xA6, 0x37, 0xED, 0x6B, 0x0B, 0xFF, 0x5C, 0xB6, 0xF4, 0x06, 0xB7, 0xED, 13 | 0xEE, 0x38, 0x6B, 0xFB, 0x5A, 0x89, 0x9F, 0xA5, 0xAE, 0x9F, 0x24, 0x11, 0x7C, 0x4B, 0x1F, 0xE6, 14 | 0x49, 0x28, 0x66, 0x51, 0xEC, 0xE4, 0x5B, 0x3D, 0xC2, 0x00, 0x7C, 0xB8, 0xA1, 0x63, 0xBF, 0x05, 15 | 0x98, 0xDA, 0x48, 0x36, 0x1C, 0x55, 0xD3, 0x9A, 0x69, 0x16, 0x3F, 0xA8, 0xFD, 0x24, 0xCF, 0x5F, 16 | 0x83, 0x65, 0x5D, 0x23, 0xDC, 0xA3, 0xAD, 0x96, 0x1C, 0x62, 0xF3, 0x56, 0x20, 0x85, 0x52, 0xBB, 17 | 0x9E, 0xD5, 0x29, 0x07, 0x70, 0x96, 0x96, 0x6D, 0x67, 0x0C, 0x35, 0x4E, 0x4A, 0xB0, 0x98, 0x04, 18 | 0xF1, 0x74, 0x6C, 0x08, 0xCA, 0x18, 0x21, 0x7C, 0x32, 0x90, 0x5E, 0x46, 0x2E, 0x36, 0xCE, 0x3B, 19 | 0xE3, 0x9E, 0x77, 0x2C, 0x18, 0x0E, 0x86, 0x03, 0x9B, 0x27, 0x83, 0xA2, 0xEC, 0x07, 0xA2, 0x8F, 20 | 0xB5, 0xC5, 0x5D, 0xF0, 0x6F, 0x4C, 0x52, 0xC9, 0xDE, 0x2B, 0xCB, 0xF6, 0x95, 0x58, 0x17, 0x18, 21 | 0x39, 0x95, 0x49, 0x7C, 0xEA, 0x95, 0x6A, 0xE5, 0x15, 0xD2, 0x26, 0x18, 0x98, 0xFA, 0x05, 0x10, 22 | 0x15, 0x72, 0x8E, 0x5A, 0x8A, 0xAA, 0xC4, 0x2D, 0xAD, 0x33, 0x17, 0x0D, 0x04, 0x50, 0x7A, 0x33, 23 | 0xA8, 0x55, 0x21, 0xAB, 0xDF, 0x1C, 0xBA, 0x64, 0xEC, 0xFB, 0x85, 0x04, 0x58, 0xDB, 0xEF, 0x0A, 24 | 0x8A, 0xEA, 0x71, 0x57, 0x5D, 0x06, 0x0C, 0x7D, 0xB3, 0x97, 0x0F, 0x85, 0xA6, 0xE1, 0xE4, 0xC7, 25 | 0xAB, 0xF5, 0xAE, 0x8C, 0xDB, 0x09, 0x33, 0xD7, 0x1E, 0x8C, 0x94, 0xE0, 0x4A, 0x25, 0x61, 0x9D, 26 | 0xCE, 0xE3, 0xD2, 0x26, 0x1A, 0xD2, 0xEE, 0x6B, 0xF1, 0x2F, 0xFA, 0x06, 0xD9, 0x8A, 0x08, 0x64, 27 | 0xD8, 0x76, 0x02, 0x73, 0x3E, 0xC8, 0x6A, 0x64, 0x52, 0x1F, 0x2B, 0x18, 0x17, 0x7B, 0x20, 0x0C, 28 | 0xBB, 0xE1, 0x17, 0x57, 0x7A, 0x61, 0x5D, 0x6C, 0x77, 0x09, 0x88, 0xC0, 0xBA, 0xD9, 0x46, 0xE2, 29 | 0x08, 0xE2, 0x4F, 0xA0, 0x74, 0xE5, 0xAB, 0x31, 0x43, 0xDB, 0x5B, 0xFC, 0xE0, 0xFD, 0x10, 0x8E, 30 | 0x4B, 0x82, 0xD1, 0x20, 0xA9, 0x3A, 0xD2, 0xCA, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 31 | ]; 32 | const GENERATOR: u8 = 0x05; 33 | const B_PRIVATE: &[u8] = &[ 34 | 0xE4, 0x87, 0xCB, 0x59, 0xD3, 0x1A, 0xC5, 0x50, 0x47, 0x1E, 0x81, 0xF0, 0x0F, 0x69, 0x28, 0xE0, 35 | 0x1D, 0xDA, 0x08, 0xE9, 0x74, 0xA0, 0x04, 0xF4, 0x9E, 0x61, 0xF5, 0xD1, 0x05, 0x28, 0x4D, 0x20, 36 | ]; 37 | 38 | // Input data 39 | const USERNAME: &str = "alice"; 40 | const PASSWORD: &str = "password123"; 41 | const A_PRIVATE: &[u8] = &[ 42 | 0x60, 0x97, 0x55, 0x27, 0x03, 0x5C, 0xF2, 0xAD, 0x19, 0x89, 0x80, 0x6F, 0x04, 0x07, 0x21, 0x0B, 43 | 0xC8, 0x1E, 0xDC, 0x04, 0xE2, 0x76, 0x2A, 0x56, 0xAF, 0xD5, 0x29, 0xDD, 0xDA, 0x2D, 0x43, 0x93, 44 | ]; 45 | const A_PUBLIC: &[u8] = &[ 46 | 0xFA, 0xB6, 0xF5, 0xD2, 0x61, 0x5D, 0x1E, 0x32, 0x35, 0x12, 0xE7, 0x99, 0x1C, 0xC3, 0x74, 0x43, 47 | 0xF4, 0x87, 0xDA, 0x60, 0x4C, 0xA8, 0xC9, 0x23, 0x0F, 0xCB, 0x04, 0xE5, 0x41, 0xDC, 0xE6, 0x28, 48 | 0x0B, 0x27, 0xCA, 0x46, 0x80, 0xB0, 0x37, 0x4F, 0x17, 0x9D, 0xC3, 0xBD, 0xC7, 0x55, 0x3F, 0xE6, 49 | 0x24, 0x59, 0x79, 0x8C, 0x70, 0x1A, 0xD8, 0x64, 0xA9, 0x13, 0x90, 0xA2, 0x8C, 0x93, 0xB6, 0x44, 50 | 0xAD, 0xBF, 0x9C, 0x00, 0x74, 0x5B, 0x94, 0x2B, 0x79, 0xF9, 0x01, 0x2A, 0x21, 0xB9, 0xB7, 0x87, 51 | 0x82, 0x31, 0x9D, 0x83, 0xA1, 0xF8, 0x36, 0x28, 0x66, 0xFB, 0xD6, 0xF4, 0x6B, 0xFC, 0x0D, 0xDB, 52 | 0x2E, 0x1A, 0xB6, 0xE4, 0xB4, 0x5A, 0x99, 0x06, 0xB8, 0x2E, 0x37, 0xF0, 0x5D, 0x6F, 0x97, 0xF6, 53 | 0xA3, 0xEB, 0x6E, 0x18, 0x20, 0x79, 0x75, 0x9C, 0x4F, 0x68, 0x47, 0x83, 0x7B, 0x62, 0x32, 0x1A, 54 | 0xC1, 0xB4, 0xFA, 0x68, 0x64, 0x1F, 0xCB, 0x4B, 0xB9, 0x8D, 0xD6, 0x97, 0xA0, 0xC7, 0x36, 0x41, 55 | 0x38, 0x5F, 0x4B, 0xAB, 0x25, 0xB7, 0x93, 0x58, 0x4C, 0xC3, 0x9F, 0xC8, 0xD4, 0x8D, 0x4B, 0xD8, 56 | 0x67, 0xA9, 0xA3, 0xC1, 0x0F, 0x8E, 0xA1, 0x21, 0x70, 0x26, 0x8E, 0x34, 0xFE, 0x3B, 0xBE, 0x6F, 57 | 0xF8, 0x99, 0x98, 0xD6, 0x0D, 0xA2, 0xF3, 0xE4, 0x28, 0x3C, 0xBE, 0xC1, 0x39, 0x3D, 0x52, 0xAF, 58 | 0x72, 0x4A, 0x57, 0x23, 0x0C, 0x60, 0x4E, 0x9F, 0xBC, 0xE5, 0x83, 0xD7, 0x61, 0x3E, 0x6B, 0xFF, 59 | 0xD6, 0x75, 0x96, 0xAD, 0x12, 0x1A, 0x87, 0x07, 0xEE, 0xC4, 0x69, 0x44, 0x95, 0x70, 0x33, 0x68, 60 | 0x6A, 0x15, 0x5F, 0x64, 0x4D, 0x5C, 0x58, 0x63, 0xB4, 0x8F, 0x61, 0xBD, 0xBF, 0x19, 0xA5, 0x3E, 61 | 0xAB, 0x6D, 0xAD, 0x0A, 0x18, 0x6B, 0x8C, 0x15, 0x2E, 0x5F, 0x5D, 0x8C, 0xAD, 0x4B, 0x0E, 0xF8, 62 | 0xAA, 0x4E, 0xA5, 0x00, 0x88, 0x34, 0xC3, 0xCD, 0x34, 0x2E, 0x5E, 0x0F, 0x16, 0x7A, 0xD0, 0x45, 63 | 0x92, 0xCD, 0x8B, 0xD2, 0x79, 0x63, 0x93, 0x98, 0xEF, 0x9E, 0x11, 0x4D, 0xFA, 0xAA, 0xB9, 0x19, 64 | 0xE1, 0x4E, 0x85, 0x09, 0x89, 0x22, 0x4D, 0xDD, 0x98, 0x57, 0x6D, 0x79, 0x38, 0x5D, 0x22, 0x10, 65 | 0x90, 0x2E, 0x9F, 0x9B, 0x1F, 0x2D, 0x86, 0xCF, 0xA4, 0x7E, 0xE2, 0x44, 0x63, 0x54, 0x65, 0xF7, 66 | 0x10, 0x58, 0x42, 0x1A, 0x01, 0x84, 0xBE, 0x51, 0xDD, 0x10, 0xCC, 0x9D, 0x07, 0x9E, 0x6F, 0x16, 67 | 0x04, 0xE7, 0xAA, 0x9B, 0x7C, 0xF7, 0x88, 0x3C, 0x7D, 0x4C, 0xE1, 0x2B, 0x06, 0xEB, 0xE1, 0x60, 68 | 0x81, 0xE2, 0x3F, 0x27, 0xA2, 0x31, 0xD1, 0x84, 0x32, 0xD7, 0xD1, 0xBB, 0x55, 0xC2, 0x8A, 0xE2, 69 | 0x1F, 0xFC, 0xF0, 0x05, 0xF5, 0x75, 0x28, 0xD1, 0x5A, 0x88, 0x88, 0x1B, 0xB3, 0xBB, 0xB7, 0xFE, 70 | ]; 71 | const B_PUBLIC: &[u8] = &[ 72 | 0x40, 0xF5, 0x70, 0x88, 0xA4, 0x82, 0xD4, 0xC7, 0x73, 0x33, 0x84, 0xFE, 0x0D, 0x30, 0x1F, 0xDD, 73 | 0xCA, 0x90, 0x80, 0xAD, 0x7D, 0x4F, 0x6F, 0xDF, 0x09, 0xA0, 0x10, 0x06, 0xC3, 0xCB, 0x6D, 0x56, 74 | 0x2E, 0x41, 0x63, 0x9A, 0xE8, 0xFA, 0x21, 0xDE, 0x3B, 0x5D, 0xBA, 0x75, 0x85, 0xB2, 0x75, 0x58, 75 | 0x9B, 0xDB, 0x27, 0x98, 0x63, 0xC5, 0x62, 0x80, 0x7B, 0x2B, 0x99, 0x08, 0x3C, 0xD1, 0x42, 0x9C, 76 | 0xDB, 0xE8, 0x9E, 0x25, 0xBF, 0xBD, 0x7E, 0x3C, 0xAD, 0x31, 0x73, 0xB2, 0xE3, 0xC5, 0xA0, 0xB1, 77 | 0x74, 0xDA, 0x6D, 0x53, 0x91, 0xE6, 0xA0, 0x6E, 0x46, 0x5F, 0x03, 0x7A, 0x40, 0x06, 0x25, 0x48, 78 | 0x39, 0xA5, 0x6B, 0xF7, 0x6D, 0xA8, 0x4B, 0x1C, 0x94, 0xE0, 0xAE, 0x20, 0x85, 0x76, 0x15, 0x6F, 79 | 0xE5, 0xC1, 0x40, 0xA4, 0xBA, 0x4F, 0xFC, 0x9E, 0x38, 0xC3, 0xB0, 0x7B, 0x88, 0x84, 0x5F, 0xC6, 80 | 0xF7, 0xDD, 0xDA, 0x93, 0x38, 0x1F, 0xE0, 0xCA, 0x60, 0x84, 0xC4, 0xCD, 0x2D, 0x33, 0x6E, 0x54, 81 | 0x51, 0xC4, 0x64, 0xCC, 0xB6, 0xEC, 0x65, 0xE7, 0xD1, 0x6E, 0x54, 0x8A, 0x27, 0x3E, 0x82, 0x62, 82 | 0x84, 0xAF, 0x25, 0x59, 0xB6, 0x26, 0x42, 0x74, 0x21, 0x59, 0x60, 0xFF, 0xF4, 0x7B, 0xDD, 0x63, 83 | 0xD3, 0xAF, 0xF0, 0x64, 0xD6, 0x13, 0x7A, 0xF7, 0x69, 0x66, 0x1C, 0x9D, 0x4F, 0xEE, 0x47, 0x38, 84 | 0x26, 0x03, 0xC8, 0x8E, 0xAA, 0x09, 0x80, 0x58, 0x1D, 0x07, 0x75, 0x84, 0x61, 0xB7, 0x77, 0xE4, 85 | 0x35, 0x6D, 0xDA, 0x58, 0x35, 0x19, 0x8B, 0x51, 0xFE, 0xEA, 0x30, 0x8D, 0x70, 0xF7, 0x54, 0x50, 86 | 0xB7, 0x16, 0x75, 0xC0, 0x8C, 0x7D, 0x83, 0x02, 0xFD, 0x75, 0x39, 0xDD, 0x1F, 0xF2, 0xA1, 0x1C, 87 | 0xB4, 0x25, 0x8A, 0xA7, 0x0D, 0x23, 0x44, 0x36, 0xAA, 0x42, 0xB6, 0xA0, 0x61, 0x5F, 0x3F, 0x91, 88 | 0x5D, 0x55, 0xCC, 0x3B, 0x96, 0x6B, 0x27, 0x16, 0xB3, 0x6E, 0x4D, 0x1A, 0x06, 0xCE, 0x5E, 0x5D, 89 | 0x2E, 0xA3, 0xBE, 0xE5, 0xA1, 0x27, 0x0E, 0x87, 0x51, 0xDA, 0x45, 0xB6, 0x0B, 0x99, 0x7B, 0x0F, 90 | 0xFD, 0xB0, 0xF9, 0x96, 0x2F, 0xEE, 0x4F, 0x03, 0xBE, 0xE7, 0x80, 0xBA, 0x0A, 0x84, 0x5B, 0x1D, 91 | 0x92, 0x71, 0x42, 0x17, 0x83, 0xAE, 0x66, 0x01, 0xA6, 0x1E, 0xA2, 0xE3, 0x42, 0xE4, 0xF2, 0xE8, 92 | 0xBC, 0x93, 0x5A, 0x40, 0x9E, 0xAD, 0x19, 0xF2, 0x21, 0xBD, 0x1B, 0x74, 0xE2, 0x96, 0x4D, 0xD1, 93 | 0x9F, 0xC8, 0x45, 0xF6, 0x0E, 0xFC, 0x09, 0x33, 0x8B, 0x60, 0xB6, 0xB2, 0x56, 0xD8, 0xCA, 0xC8, 94 | 0x89, 0xCC, 0xA3, 0x06, 0xCC, 0x37, 0x0A, 0x0B, 0x18, 0xC8, 0xB8, 0x86, 0xE9, 0x5D, 0xA0, 0xAF, 95 | 0x52, 0x35, 0xFE, 0xF4, 0x39, 0x30, 0x20, 0xD2, 0xB7, 0xF3, 0x05, 0x69, 0x04, 0x75, 0x90, 0x42, 96 | ]; 97 | // Salt s 98 | const SALT: &[u8] = &[ 99 | 0xBE, 0xB2, 0x53, 0x79, 0xD1, 0xA8, 0x58, 0x1E, 0xB5, 0xA7, 0x27, 0x67, 0x3A, 0x24, 0x41, 0xEE, 100 | ]; 101 | 102 | // expected output data 103 | const EXPECTED_VERIFIER: &[u8] = &[ 104 | 0x9B, 0x5E, 0x06, 0x17, 0x01, 0xEA, 0x7A, 0xEB, 0x39, 0xCF, 0x6E, 0x35, 0x19, 0x65, 0x5A, 0x85, 105 | 0x3C, 0xF9, 0x4C, 0x75, 0xCA, 0xF2, 0x55, 0x5E, 0xF1, 0xFA, 0xF7, 0x59, 0xBB, 0x79, 0xCB, 0x47, 106 | 0x70, 0x14, 0xE0, 0x4A, 0x88, 0xD6, 0x8F, 0xFC, 0x05, 0x32, 0x38, 0x91, 0xD4, 0xC2, 0x05, 0xB8, 107 | 0xDE, 0x81, 0xC2, 0xF2, 0x03, 0xD8, 0xFA, 0xD1, 0xB2, 0x4D, 0x2C, 0x10, 0x97, 0x37, 0xF1, 0xBE, 108 | 0xBB, 0xD7, 0x1F, 0x91, 0x24, 0x47, 0xC4, 0xA0, 0x3C, 0x26, 0xB9, 0xFA, 0xD8, 0xED, 0xB3, 0xE7, 109 | 0x80, 0x77, 0x8E, 0x30, 0x25, 0x29, 0xED, 0x1E, 0xE1, 0x38, 0xCC, 0xFC, 0x36, 0xD4, 0xBA, 0x31, 110 | 0x3C, 0xC4, 0x8B, 0x14, 0xEA, 0x8C, 0x22, 0xA0, 0x18, 0x6B, 0x22, 0x2E, 0x65, 0x5F, 0x2D, 0xF5, 111 | 0x60, 0x3F, 0xD7, 0x5D, 0xF7, 0x6B, 0x3B, 0x08, 0xFF, 0x89, 0x50, 0x06, 0x9A, 0xDD, 0x03, 0xA7, 112 | 0x54, 0xEE, 0x4A, 0xE8, 0x85, 0x87, 0xCC, 0xE1, 0xBF, 0xDE, 0x36, 0x79, 0x4D, 0xBA, 0xE4, 0x59, 113 | 0x2B, 0x7B, 0x90, 0x4F, 0x44, 0x2B, 0x04, 0x1C, 0xB1, 0x7A, 0xEB, 0xAD, 0x1E, 0x3A, 0xEB, 0xE3, 114 | 0xCB, 0xE9, 0x9D, 0xE6, 0x5F, 0x4B, 0xB1, 0xFA, 0x00, 0xB0, 0xE7, 0xAF, 0x06, 0x86, 0x3D, 0xB5, 115 | 0x3B, 0x02, 0x25, 0x4E, 0xC6, 0x6E, 0x78, 0x1E, 0x3B, 0x62, 0xA8, 0x21, 0x2C, 0x86, 0xBE, 0xB0, 116 | 0xD5, 0x0B, 0x5B, 0xA6, 0xD0, 0xB4, 0x78, 0xD8, 0xC4, 0xE9, 0xBB, 0xCE, 0xC2, 0x17, 0x65, 0x32, 117 | 0x6F, 0xBD, 0x14, 0x05, 0x8D, 0x2B, 0xBD, 0xE2, 0xC3, 0x30, 0x45, 0xF0, 0x38, 0x73, 0xE5, 0x39, 118 | 0x48, 0xD7, 0x8B, 0x79, 0x4F, 0x07, 0x90, 0xE4, 0x8C, 0x36, 0xAE, 0xD6, 0xE8, 0x80, 0xF5, 0x57, 119 | 0x42, 0x7B, 0x2F, 0xC0, 0x6D, 0xB5, 0xE1, 0xE2, 0xE1, 0xD7, 0xE6, 0x61, 0xAC, 0x48, 0x2D, 0x18, 120 | 0xE5, 0x28, 0xD7, 0x29, 0x5E, 0xF7, 0x43, 0x72, 0x95, 0xFF, 0x1A, 0x72, 0xD4, 0x02, 0x77, 0x17, 121 | 0x13, 0xF1, 0x68, 0x76, 0xDD, 0x05, 0x0A, 0xE5, 0xB7, 0xAD, 0x53, 0xCC, 0xB9, 0x08, 0x55, 0xC9, 122 | 0x39, 0x56, 0x64, 0x83, 0x58, 0xAD, 0xFD, 0x96, 0x64, 0x22, 0xF5, 0x24, 0x98, 0x73, 0x2D, 0x68, 123 | 0xD1, 0xD7, 0xFB, 0xEF, 0x10, 0xD7, 0x80, 0x34, 0xAB, 0x8D, 0xCB, 0x6F, 0x0F, 0xCF, 0x88, 0x5C, 124 | 0xC2, 0xB2, 0xEA, 0x2C, 0x3E, 0x6A, 0xC8, 0x66, 0x09, 0xEA, 0x05, 0x8A, 0x9D, 0xA8, 0xCC, 0x63, 125 | 0x53, 0x1D, 0xC9, 0x15, 0x41, 0x4D, 0xF5, 0x68, 0xB0, 0x94, 0x82, 0xDD, 0xAC, 0x19, 0x54, 0xDE, 126 | 0xC7, 0xEB, 0x71, 0x4F, 0x6F, 0xF7, 0xD4, 0x4C, 0xD5, 0xB8, 0x6F, 0x6B, 0xD1, 0x15, 0x81, 0x09, 127 | 0x30, 0x63, 0x7C, 0x01, 0xD0, 0xF6, 0x01, 0x3B, 0xC9, 0x74, 0x0F, 0xA2, 0xC6, 0x33, 0xBA, 0x89, 128 | ]; 129 | const EXPECTED_PREMASTER_SECRET: &[u8] = &[ 130 | 0xF1, 0x03, 0x6F, 0xEC, 0xD0, 0x17, 0xC8, 0x23, 0x9C, 0x0D, 0x5A, 0xF7, 0xE0, 0xFC, 0xF0, 0xD4, 131 | 0x08, 0xB0, 0x09, 0xE3, 0x64, 0x11, 0x61, 0x8A, 0x60, 0xB2, 0x3A, 0xAB, 0xBF, 0xC3, 0x83, 0x39, 132 | 0x72, 0x68, 0x23, 0x12, 0x14, 0xBA, 0xAC, 0xDC, 0x94, 0xCA, 0x1C, 0x53, 0xF4, 0x42, 0xFB, 0x51, 133 | 0xC1, 0xB0, 0x27, 0xC3, 0x18, 0xAE, 0x23, 0x8E, 0x16, 0x41, 0x4D, 0x60, 0xD1, 0x88, 0x1B, 0x66, 134 | 0x48, 0x6A, 0xDE, 0x10, 0xED, 0x02, 0xBA, 0x33, 0xD0, 0x98, 0xF6, 0xCE, 0x9B, 0xCF, 0x1B, 0xB0, 135 | 0xC4, 0x6C, 0xA2, 0xC4, 0x7F, 0x2F, 0x17, 0x4C, 0x59, 0xA9, 0xC6, 0x1E, 0x25, 0x60, 0x89, 0x9B, 136 | 0x83, 0xEF, 0x61, 0x13, 0x1E, 0x6F, 0xB3, 0x0B, 0x71, 0x4F, 0x4E, 0x43, 0xB7, 0x35, 0xC9, 0xFE, 137 | 0x60, 0x80, 0x47, 0x7C, 0x1B, 0x83, 0xE4, 0x09, 0x3E, 0x4D, 0x45, 0x6B, 0x9B, 0xCA, 0x49, 0x2C, 138 | 0xF9, 0x33, 0x9D, 0x45, 0xBC, 0x42, 0xE6, 0x7C, 0xE6, 0xC0, 0x2C, 0x24, 0x3E, 0x49, 0xF5, 0xDA, 139 | 0x42, 0xA8, 0x69, 0xEC, 0x85, 0x57, 0x80, 0xE8, 0x42, 0x07, 0xB8, 0xA1, 0xEA, 0x65, 0x01, 0xC4, 140 | 0x78, 0xAA, 0xC0, 0xDF, 0xD3, 0xD2, 0x26, 0x14, 0xF5, 0x31, 0xA0, 0x0D, 0x82, 0x6B, 0x79, 0x54, 141 | 0xAE, 0x8B, 0x14, 0xA9, 0x85, 0xA4, 0x29, 0x31, 0x5E, 0x6D, 0xD3, 0x66, 0x4C, 0xF4, 0x71, 0x81, 142 | 0x49, 0x6A, 0x94, 0x32, 0x9C, 0xDE, 0x80, 0x05, 0xCA, 0xE6, 0x3C, 0x2F, 0x9C, 0xA4, 0x96, 0x9B, 143 | 0xFE, 0x84, 0x00, 0x19, 0x24, 0x03, 0x7C, 0x44, 0x65, 0x59, 0xBD, 0xBB, 0x9D, 0xB9, 0xD4, 0xDD, 144 | 0x14, 0x2F, 0xBC, 0xD7, 0x5E, 0xEF, 0x2E, 0x16, 0x2C, 0x84, 0x30, 0x65, 0xD9, 0x9E, 0x8F, 0x05, 145 | 0x76, 0x2C, 0x4D, 0xB7, 0xAB, 0xD9, 0xDB, 0x20, 0x3D, 0x41, 0xAC, 0x85, 0xA5, 0x8C, 0x05, 0xBD, 146 | 0x4E, 0x2D, 0xBF, 0x82, 0x2A, 0x93, 0x45, 0x23, 0xD5, 0x4E, 0x06, 0x53, 0xD3, 0x76, 0xCE, 0x8B, 147 | 0x56, 0xDC, 0xB4, 0x52, 0x7D, 0xDD, 0xC1, 0xB9, 0x94, 0xDC, 0x75, 0x09, 0x46, 0x3A, 0x74, 0x68, 148 | 0xD7, 0xF0, 0x2B, 0x1B, 0xEB, 0x16, 0x85, 0x71, 0x4C, 0xE1, 0xDD, 0x1E, 0x71, 0x80, 0x8A, 0x13, 149 | 0x7F, 0x78, 0x88, 0x47, 0xB7, 0xC6, 0xB7, 0xBF, 0xA1, 0x36, 0x44, 0x74, 0xB3, 0xB7, 0xE8, 0x94, 150 | 0x78, 0x95, 0x4F, 0x6A, 0x8E, 0x68, 0xD4, 0x5B, 0x85, 0xA8, 0x8E, 0x4E, 0xBF, 0xEC, 0x13, 0x36, 151 | 0x8E, 0xC0, 0x89, 0x1C, 0x3B, 0xC8, 0x6C, 0xF5, 0x00, 0x97, 0x88, 0x01, 0x78, 0xD8, 0x61, 0x35, 152 | 0xE7, 0x28, 0x72, 0x34, 0x58, 0x53, 0x88, 0x58, 0xD7, 0x15, 0xB7, 0xB2, 0x47, 0x40, 0x62, 0x22, 153 | 0xC1, 0x01, 0x9F, 0x53, 0x60, 0x3F, 0x01, 0x69, 0x52, 0xD4, 0x97, 0x10, 0x08, 0x58, 0x82, 0x4C, 154 | ]; 155 | 156 | // still need to figure out how these are used: 157 | // random scrambling paramter (u) 158 | const RANDOM_SCRAMBLE: &[u8] = &[ 159 | 0x03, 0xAE, 0x5F, 0x3C, 0x3F, 0xA9, 0xEF, 0xF1, 0xA5, 0x0D, 0x7D, 0xBB, 0x8D, 0x2F, 0x60, 0xA1, 160 | 0xEA, 0x66, 0xEA, 0x71, 0x2D, 0x50, 0xAE, 0x97, 0x6E, 0xE3, 0x46, 0x41, 0xA1, 0xCD, 0x0E, 0x51, 161 | 0xC4, 0x68, 0x3D, 0xA3, 0x83, 0xE8, 0x59, 0x5D, 0x6C, 0xB5, 0x6A, 0x15, 0xD5, 0xFB, 0xC7, 0x54, 162 | 0x3E, 0x07, 0xFB, 0xDD, 0xD3, 0x16, 0x21, 0x7E, 0x01, 0xA3, 0x91, 0xA1, 0x8E, 0xF0, 0x6D, 0xFF, 163 | ]; 164 | const SESSION_KEY: &[u8] = &[ 165 | 0x5C, 0xBC, 0x21, 0x9D, 0xB0, 0x52, 0x13, 0x8E, 0xE1, 0x14, 0x8C, 0x71, 0xCD, 0x44, 0x98, 0x96, 166 | 0x3D, 0x68, 0x25, 0x49, 0xCE, 0x91, 0xCA, 0x24, 0xF0, 0x98, 0x46, 0x8F, 0x06, 0x01, 0x5B, 0xEB, 167 | 0x6A, 0xF2, 0x45, 0xC2, 0x09, 0x3F, 0x98, 0xC3, 0x65, 0x1B, 0xCA, 0x83, 0xAB, 0x8C, 0xAB, 0x2B, 168 | 0x58, 0x0B, 0xBF, 0x02, 0x18, 0x4F, 0xEF, 0xDF, 0x26, 0x14, 0x2F, 0x73, 0xDF, 0x95, 0xAC, 0x50, 169 | ]; 170 | 171 | #[test] 172 | fn homekit_test_vectors() { 173 | let client = SrpClient::::new(&G_3072); 174 | 175 | let a_pub = client.compute_public_ephemeral(A_PRIVATE); 176 | assert_eq!(A_PUBLIC, a_pub); 177 | 178 | let verifier = client 179 | .process_reply( 180 | A_PRIVATE, 181 | USERNAME.as_bytes(), 182 | PASSWORD.as_bytes(), 183 | SALT, 184 | B_PUBLIC, 185 | ) 186 | .unwrap(); 187 | assert_eq!(EXPECTED_PREMASTER_SECRET, verifier.key()); 188 | 189 | assert_eq!( 190 | EXPECTED_VERIFIER, 191 | client.compute_verifier(USERNAME.as_bytes(), PASSWORD.as_bytes(), SALT) 192 | ); 193 | 194 | // verifier.verify_server(SESSION_KEY).unwrap(); 195 | 196 | // should ge ne ra te: 197 | 198 | // verifier v 199 | 200 | // pr em as ter secret (S) 201 | 202 | // session key (K) 203 | } 204 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Mozilla Public License Version 2.0 2 | ================================== 3 | 4 | 1. Definitions 5 | -------------- 6 | 7 | 1.1. "Contributor" 8 | means each individual or legal entity that creates, contributes to 9 | the creation of, or owns Covered Software. 10 | 11 | 1.2. "Contributor Version" 12 | means the combination of the Contributions of others (if any) used 13 | by a Contributor and that particular Contributor's Contribution. 14 | 15 | 1.3. "Contribution" 16 | means Covered Software of a particular Contributor. 17 | 18 | 1.4. "Covered Software" 19 | means Source Code Form to which the initial Contributor has attached 20 | the notice in Exhibit A, the Executable Form of such Source Code 21 | Form, and Modifications of such Source Code Form, in each case 22 | including portions thereof. 23 | 24 | 1.5. "Incompatible With Secondary Licenses" 25 | means 26 | 27 | (a) that the initial Contributor has attached the notice described 28 | in Exhibit B to the Covered Software; or 29 | 30 | (b) that the Covered Software was made available under the terms of 31 | version 1.1 or earlier of the License, but not also under the 32 | terms of a Secondary License. 33 | 34 | 1.6. "Executable Form" 35 | means any form of the work other than Source Code Form. 36 | 37 | 1.7. "Larger Work" 38 | means a work that combines Covered Software with other material, in 39 | a separate file or files, that is not Covered Software. 40 | 41 | 1.8. "License" 42 | means this document. 43 | 44 | 1.9. "Licensable" 45 | means having the right to grant, to the maximum extent possible, 46 | whether at the time of the initial grant or subsequently, any and 47 | all of the rights conveyed by this License. 48 | 49 | 1.10. "Modifications" 50 | means any of the following: 51 | 52 | (a) any file in Source Code Form that results from an addition to, 53 | deletion from, or modification of the contents of Covered 54 | Software; or 55 | 56 | (b) any new file in Source Code Form that contains any Covered 57 | Software. 58 | 59 | 1.11. "Patent Claims" of a Contributor 60 | means any patent claim(s), including without limitation, method, 61 | process, and apparatus claims, in any patent Licensable by such 62 | Contributor that would be infringed, but for the grant of the 63 | License, by the making, using, selling, offering for sale, having 64 | made, import, or transfer of either its Contributions or its 65 | Contributor Version. 66 | 67 | 1.12. "Secondary License" 68 | means either the GNU General Public License, Version 2.0, the GNU 69 | Lesser General Public License, Version 2.1, the GNU Affero General 70 | Public License, Version 3.0, or any later versions of those 71 | licenses. 72 | 73 | 1.13. "Source Code Form" 74 | means the form of the work preferred for making modifications. 75 | 76 | 1.14. "You" (or "Your") 77 | means an individual or a legal entity exercising rights under this 78 | License. For legal entities, "You" includes any entity that 79 | controls, is controlled by, or is under common control with You. For 80 | purposes of this definition, "control" means (a) the power, direct 81 | or indirect, to cause the direction or management of such entity, 82 | whether by contract or otherwise, or (b) ownership of more than 83 | fifty percent (50%) of the outstanding shares or beneficial 84 | ownership of such entity. 85 | 86 | 2. License Grants and Conditions 87 | -------------------------------- 88 | 89 | 2.1. Grants 90 | 91 | Each Contributor hereby grants You a world-wide, royalty-free, 92 | non-exclusive license: 93 | 94 | (a) under intellectual property rights (other than patent or trademark) 95 | Licensable by such Contributor to use, reproduce, make available, 96 | modify, display, perform, distribute, and otherwise exploit its 97 | Contributions, either on an unmodified basis, with Modifications, or 98 | as part of a Larger Work; and 99 | 100 | (b) under Patent Claims of such Contributor to make, use, sell, offer 101 | for sale, have made, import, and otherwise transfer either its 102 | Contributions or its Contributor Version. 103 | 104 | 2.2. Effective Date 105 | 106 | The licenses granted in Section 2.1 with respect to any Contribution 107 | become effective for each Contribution on the date the Contributor first 108 | distributes such Contribution. 109 | 110 | 2.3. Limitations on Grant Scope 111 | 112 | The licenses granted in this Section 2 are the only rights granted under 113 | this License. No additional rights or licenses will be implied from the 114 | distribution or licensing of Covered Software under this License. 115 | Notwithstanding Section 2.1(b) above, no patent license is granted by a 116 | Contributor: 117 | 118 | (a) for any code that a Contributor has removed from Covered Software; 119 | or 120 | 121 | (b) for infringements caused by: (i) Your and any other third party's 122 | modifications of Covered Software, or (ii) the combination of its 123 | Contributions with other software (except as part of its Contributor 124 | Version); or 125 | 126 | (c) under Patent Claims infringed by Covered Software in the absence of 127 | its Contributions. 128 | 129 | This License does not grant any rights in the trademarks, service marks, 130 | or logos of any Contributor (except as may be necessary to comply with 131 | the notice requirements in Section 3.4). 132 | 133 | 2.4. Subsequent Licenses 134 | 135 | No Contributor makes additional grants as a result of Your choice to 136 | distribute the Covered Software under a subsequent version of this 137 | License (see Section 10.2) or under the terms of a Secondary License (if 138 | permitted under the terms of Section 3.3). 139 | 140 | 2.5. Representation 141 | 142 | Each Contributor represents that the Contributor believes its 143 | Contributions are its original creation(s) or it has sufficient rights 144 | to grant the rights to its Contributions conveyed by this License. 145 | 146 | 2.6. Fair Use 147 | 148 | This License is not intended to limit any rights You have under 149 | applicable copyright doctrines of fair use, fair dealing, or other 150 | equivalents. 151 | 152 | 2.7. Conditions 153 | 154 | Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted 155 | in Section 2.1. 156 | 157 | 3. Responsibilities 158 | ------------------- 159 | 160 | 3.1. Distribution of Source Form 161 | 162 | All distribution of Covered Software in Source Code Form, including any 163 | Modifications that You create or to which You contribute, must be under 164 | the terms of this License. You must inform recipients that the Source 165 | Code Form of the Covered Software is governed by the terms of this 166 | License, and how they can obtain a copy of this License. You may not 167 | attempt to alter or restrict the recipients' rights in the Source Code 168 | Form. 169 | 170 | 3.2. Distribution of Executable Form 171 | 172 | If You distribute Covered Software in Executable Form then: 173 | 174 | (a) such Covered Software must also be made available in Source Code 175 | Form, as described in Section 3.1, and You must inform recipients of 176 | the Executable Form how they can obtain a copy of such Source Code 177 | Form by reasonable means in a timely manner, at a charge no more 178 | than the cost of distribution to the recipient; and 179 | 180 | (b) You may distribute such Executable Form under the terms of this 181 | License, or sublicense it under different terms, provided that the 182 | license for the Executable Form does not attempt to limit or alter 183 | the recipients' rights in the Source Code Form under this License. 184 | 185 | 3.3. Distribution of a Larger Work 186 | 187 | You may create and distribute a Larger Work under terms of Your choice, 188 | provided that You also comply with the requirements of this License for 189 | the Covered Software. If the Larger Work is a combination of Covered 190 | Software with a work governed by one or more Secondary Licenses, and the 191 | Covered Software is not Incompatible With Secondary Licenses, this 192 | License permits You to additionally distribute such Covered Software 193 | under the terms of such Secondary License(s), so that the recipient of 194 | the Larger Work may, at their option, further distribute the Covered 195 | Software under the terms of either this License or such Secondary 196 | License(s). 197 | 198 | 3.4. Notices 199 | 200 | You may not remove or alter the substance of any license notices 201 | (including copyright notices, patent notices, disclaimers of warranty, 202 | or limitations of liability) contained within the Source Code Form of 203 | the Covered Software, except that You may alter any license notices to 204 | the extent required to remedy known factual inaccuracies. 205 | 206 | 3.5. Application of Additional Terms 207 | 208 | You may choose to offer, and to charge a fee for, warranty, support, 209 | indemnity or liability obligations to one or more recipients of Covered 210 | Software. However, You may do so only on Your own behalf, and not on 211 | behalf of any Contributor. You must make it absolutely clear that any 212 | such warranty, support, indemnity, or liability obligation is offered by 213 | You alone, and You hereby agree to indemnify every Contributor for any 214 | liability incurred by such Contributor as a result of warranty, support, 215 | indemnity or liability terms You offer. You may include additional 216 | disclaimers of warranty and limitations of liability specific to any 217 | jurisdiction. 218 | 219 | 4. Inability to Comply Due to Statute or Regulation 220 | --------------------------------------------------- 221 | 222 | If it is impossible for You to comply with any of the terms of this 223 | License with respect to some or all of the Covered Software due to 224 | statute, judicial order, or regulation then You must: (a) comply with 225 | the terms of this License to the maximum extent possible; and (b) 226 | describe the limitations and the code they affect. Such description must 227 | be placed in a text file included with all distributions of the Covered 228 | Software under this License. Except to the extent prohibited by statute 229 | or regulation, such description must be sufficiently detailed for a 230 | recipient of ordinary skill to be able to understand it. 231 | 232 | 5. Termination 233 | -------------- 234 | 235 | 5.1. The rights granted under this License will terminate automatically 236 | if You fail to comply with any of its terms. However, if You become 237 | compliant, then the rights granted under this License from a particular 238 | Contributor are reinstated (a) provisionally, unless and until such 239 | Contributor explicitly and finally terminates Your grants, and (b) on an 240 | ongoing basis, if such Contributor fails to notify You of the 241 | non-compliance by some reasonable means prior to 60 days after You have 242 | come back into compliance. Moreover, Your grants from a particular 243 | Contributor are reinstated on an ongoing basis if such Contributor 244 | notifies You of the non-compliance by some reasonable means, this is the 245 | first time You have received notice of non-compliance with this License 246 | from such Contributor, and You become compliant prior to 30 days after 247 | Your receipt of the notice. 248 | 249 | 5.2. If You initiate litigation against any entity by asserting a patent 250 | infringement claim (excluding declaratory judgment actions, 251 | counter-claims, and cross-claims) alleging that a Contributor Version 252 | directly or indirectly infringes any patent, then the rights granted to 253 | You by any and all Contributors for the Covered Software under Section 254 | 2.1 of this License shall terminate. 255 | 256 | 5.3. In the event of termination under Sections 5.1 or 5.2 above, all 257 | end user license agreements (excluding distributors and resellers) which 258 | have been validly granted by You or Your distributors under this License 259 | prior to termination shall survive termination. 260 | 261 | ************************************************************************ 262 | * * 263 | * 6. Disclaimer of Warranty * 264 | * ------------------------- * 265 | * * 266 | * Covered Software is provided under this License on an "as is" * 267 | * basis, without warranty of any kind, either expressed, implied, or * 268 | * statutory, including, without limitation, warranties that the * 269 | * Covered Software is free of defects, merchantable, fit for a * 270 | * particular purpose or non-infringing. The entire risk as to the * 271 | * quality and performance of the Covered Software is with You. * 272 | * Should any Covered Software prove defective in any respect, You * 273 | * (not any Contributor) assume the cost of any necessary servicing, * 274 | * repair, or correction. This disclaimer of warranty constitutes an * 275 | * essential part of this License. No use of any Covered Software is * 276 | * authorized under this License except under this disclaimer. * 277 | * * 278 | ************************************************************************ 279 | 280 | ************************************************************************ 281 | * * 282 | * 7. Limitation of Liability * 283 | * -------------------------- * 284 | * * 285 | * Under no circumstances and under no legal theory, whether tort * 286 | * (including negligence), contract, or otherwise, shall any * 287 | * Contributor, or anyone who distributes Covered Software as * 288 | * permitted above, be liable to You for any direct, indirect, * 289 | * special, incidental, or consequential damages of any character * 290 | * including, without limitation, damages for lost profits, loss of * 291 | * goodwill, work stoppage, computer failure or malfunction, or any * 292 | * and all other commercial damages or losses, even if such party * 293 | * shall have been informed of the possibility of such damages. This * 294 | * limitation of liability shall not apply to liability for death or * 295 | * personal injury resulting from such party's negligence to the * 296 | * extent applicable law prohibits such limitation. Some * 297 | * jurisdictions do not allow the exclusion or limitation of * 298 | * incidental or consequential damages, so this exclusion and * 299 | * limitation may not apply to You. * 300 | * * 301 | ************************************************************************ 302 | 303 | 8. Litigation 304 | ------------- 305 | 306 | Any litigation relating to this License may be brought only in the 307 | courts of a jurisdiction where the defendant maintains its principal 308 | place of business and such litigation shall be governed by laws of that 309 | jurisdiction, without reference to its conflict-of-law provisions. 310 | Nothing in this Section shall prevent a party's ability to bring 311 | cross-claims or counter-claims. 312 | 313 | 9. Miscellaneous 314 | ---------------- 315 | 316 | This License represents the complete agreement concerning the subject 317 | matter hereof. If any provision of this License is held to be 318 | unenforceable, such provision shall be reformed only to the extent 319 | necessary to make it enforceable. Any law or regulation which provides 320 | that the language of a contract shall be construed against the drafter 321 | shall not be used to construe this License against a Contributor. 322 | 323 | 10. Versions of the License 324 | --------------------------- 325 | 326 | 10.1. New Versions 327 | 328 | Mozilla Foundation is the license steward. Except as provided in Section 329 | 10.3, no one other than the license steward has the right to modify or 330 | publish new versions of this License. Each version will be given a 331 | distinguishing version number. 332 | 333 | 10.2. Effect of New Versions 334 | 335 | You may distribute the Covered Software under the terms of the version 336 | of the License under which You originally received the Covered Software, 337 | or under the terms of any subsequent version published by the license 338 | steward. 339 | 340 | 10.3. Modified Versions 341 | 342 | If you create software not governed by this License, and you want to 343 | create a new license for such software, you may create and use a 344 | modified version of this License if you rename the license and remove 345 | any references to the name of the license steward (except to note that 346 | such modified license differs from this License). 347 | 348 | 10.4. Distributing Source Code Form that is Incompatible With Secondary 349 | Licenses 350 | 351 | If You choose to distribute Source Code Form that is Incompatible With 352 | Secondary Licenses under the terms of this version of the License, the 353 | notice described in Exhibit B of this License must be attached. 354 | 355 | Exhibit A - Source Code Form License Notice 356 | ------------------------------------------- 357 | 358 | This Source Code Form is subject to the terms of the Mozilla Public 359 | License, v. 2.0. If a copy of the MPL was not distributed with this 360 | file, You can obtain one at http://mozilla.org/MPL/2.0/. 361 | 362 | If it is not possible or desirable to put the notice in a particular 363 | file, then You may include the notice in a location (such as a LICENSE 364 | file in a relevant directory) where a recipient would be likely to look 365 | for such a notice. 366 | 367 | You may add additional accurate notices of copyright ownership. 368 | 369 | Exhibit B - "Incompatible With Secondary Licenses" Notice 370 | --------------------------------------------------------- 371 | 372 | This Source Code Form is "Incompatible With Secondary Licenses", as 373 | defined by the Mozilla Public License, v. 2.0. 374 | -------------------------------------------------------------------------------- /Cargo.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Cargo. 2 | # It is not intended for manual editing. 3 | version = 3 4 | 5 | [[package]] 6 | name = "Inflector" 7 | version = "0.11.4" 8 | source = "registry+https://github.com/rust-lang/crates.io-index" 9 | checksum = "fe438c63458706e03479442743baae6c88256498e6431708f6dfc520a26515d3" 10 | dependencies = [ 11 | "lazy_static", 12 | "regex", 13 | ] 14 | 15 | [[package]] 16 | name = "aho-corasick" 17 | version = "1.1.3" 18 | source = "registry+https://github.com/rust-lang/crates.io-index" 19 | checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" 20 | dependencies = [ 21 | "memchr", 22 | ] 23 | 24 | [[package]] 25 | name = "autocfg" 26 | version = "1.3.0" 27 | source = "registry+https://github.com/rust-lang/crates.io-index" 28 | checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" 29 | 30 | [[package]] 31 | name = "az" 32 | version = "1.2.1" 33 | source = "registry+https://github.com/rust-lang/crates.io-index" 34 | checksum = "7b7e4c2464d97fe331d41de9d5db0def0a96f4d823b8b32a2efd503578988973" 35 | 36 | [[package]] 37 | name = "bare-metal" 38 | version = "0.2.5" 39 | source = "registry+https://github.com/rust-lang/crates.io-index" 40 | checksum = "5deb64efa5bd81e31fcd1938615a6d98c82eafcbcd787162b6f63b91d6bac5b3" 41 | dependencies = [ 42 | "rustc_version", 43 | ] 44 | 45 | [[package]] 46 | name = "bitfield" 47 | version = "0.13.2" 48 | source = "registry+https://github.com/rust-lang/crates.io-index" 49 | checksum = "46afbd2983a5d5a7bd740ccb198caf5b82f45c40c09c0eed36052d91cb92e719" 50 | 51 | [[package]] 52 | name = "bitflags" 53 | version = "1.3.2" 54 | source = "registry+https://github.com/rust-lang/crates.io-index" 55 | checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" 56 | 57 | [[package]] 58 | name = "block-buffer" 59 | version = "0.10.4" 60 | source = "registry+https://github.com/rust-lang/crates.io-index" 61 | checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" 62 | dependencies = [ 63 | "generic-array", 64 | ] 65 | 66 | [[package]] 67 | name = "bytemuck" 68 | version = "1.15.0" 69 | source = "registry+https://github.com/rust-lang/crates.io-index" 70 | checksum = "5d6d68c57235a3a081186990eca2867354726650f42f7516ca50c28d6281fd15" 71 | 72 | [[package]] 73 | name = "byteorder" 74 | version = "1.5.0" 75 | source = "registry+https://github.com/rust-lang/crates.io-index" 76 | checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" 77 | 78 | [[package]] 79 | name = "cfg-if" 80 | version = "1.0.0" 81 | source = "registry+https://github.com/rust-lang/crates.io-index" 82 | checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" 83 | 84 | [[package]] 85 | name = "cortex-m" 86 | version = "0.7.7" 87 | source = "registry+https://github.com/rust-lang/crates.io-index" 88 | checksum = "8ec610d8f49840a5b376c69663b6369e71f4b34484b9b2eb29fb918d92516cb9" 89 | dependencies = [ 90 | "bare-metal", 91 | "bitfield", 92 | "critical-section", 93 | "embedded-hal 0.2.7", 94 | "volatile-register", 95 | ] 96 | 97 | [[package]] 98 | name = "cortex-m-rt" 99 | version = "0.7.4" 100 | source = "registry+https://github.com/rust-lang/crates.io-index" 101 | checksum = "2722f5b7d6ea8583cffa4d247044e280ccbb9fe501bed56552e2ba48b02d5f3d" 102 | dependencies = [ 103 | "cortex-m-rt-macros", 104 | ] 105 | 106 | [[package]] 107 | name = "cortex-m-rt-macros" 108 | version = "0.7.0" 109 | source = "registry+https://github.com/rust-lang/crates.io-index" 110 | checksum = "f0f6f3e36f203cfedbc78b357fb28730aa2c6dc1ab060ee5c2405e843988d3c7" 111 | dependencies = [ 112 | "proc-macro2", 113 | "quote", 114 | "syn 1.0.109", 115 | ] 116 | 117 | [[package]] 118 | name = "cpufeatures" 119 | version = "0.2.12" 120 | source = "registry+https://github.com/rust-lang/crates.io-index" 121 | checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" 122 | dependencies = [ 123 | "libc", 124 | ] 125 | 126 | [[package]] 127 | name = "critical-section" 128 | version = "1.1.2" 129 | source = "registry+https://github.com/rust-lang/crates.io-index" 130 | checksum = "7059fff8937831a9ae6f0fe4d658ffabf58f2ca96aa9dec1c889f936f705f216" 131 | 132 | [[package]] 133 | name = "crunchy" 134 | version = "0.2.2" 135 | source = "registry+https://github.com/rust-lang/crates.io-index" 136 | checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" 137 | 138 | [[package]] 139 | name = "crypto-common" 140 | version = "0.1.6" 141 | source = "registry+https://github.com/rust-lang/crates.io-index" 142 | checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" 143 | dependencies = [ 144 | "generic-array", 145 | "typenum", 146 | ] 147 | 148 | [[package]] 149 | name = "darling" 150 | version = "0.13.4" 151 | source = "registry+https://github.com/rust-lang/crates.io-index" 152 | checksum = "a01d95850c592940db9b8194bc39f4bc0e89dee5c4265e4b1807c34a9aba453c" 153 | dependencies = [ 154 | "darling_core 0.13.4", 155 | "darling_macro 0.13.4", 156 | ] 157 | 158 | [[package]] 159 | name = "darling" 160 | version = "0.20.8" 161 | source = "registry+https://github.com/rust-lang/crates.io-index" 162 | checksum = "54e36fcd13ed84ffdfda6f5be89b31287cbb80c439841fe69e04841435464391" 163 | dependencies = [ 164 | "darling_core 0.20.8", 165 | "darling_macro 0.20.8", 166 | ] 167 | 168 | [[package]] 169 | name = "darling_core" 170 | version = "0.13.4" 171 | source = "registry+https://github.com/rust-lang/crates.io-index" 172 | checksum = "859d65a907b6852c9361e3185c862aae7fafd2887876799fa55f5f99dc40d610" 173 | dependencies = [ 174 | "fnv", 175 | "ident_case", 176 | "proc-macro2", 177 | "quote", 178 | "strsim", 179 | "syn 1.0.109", 180 | ] 181 | 182 | [[package]] 183 | name = "darling_core" 184 | version = "0.20.8" 185 | source = "registry+https://github.com/rust-lang/crates.io-index" 186 | checksum = "9c2cf1c23a687a1feeb728783b993c4e1ad83d99f351801977dd809b48d0a70f" 187 | dependencies = [ 188 | "fnv", 189 | "ident_case", 190 | "proc-macro2", 191 | "quote", 192 | "strsim", 193 | "syn 2.0.60", 194 | ] 195 | 196 | [[package]] 197 | name = "darling_macro" 198 | version = "0.13.4" 199 | source = "registry+https://github.com/rust-lang/crates.io-index" 200 | checksum = "9c972679f83bdf9c42bd905396b6c3588a843a17f0f16dfcfa3e2c5d57441835" 201 | dependencies = [ 202 | "darling_core 0.13.4", 203 | "quote", 204 | "syn 1.0.109", 205 | ] 206 | 207 | [[package]] 208 | name = "darling_macro" 209 | version = "0.20.8" 210 | source = "registry+https://github.com/rust-lang/crates.io-index" 211 | checksum = "a668eda54683121533a393014d8692171709ff57a7d61f187b6e782719f8933f" 212 | dependencies = [ 213 | "darling_core 0.20.8", 214 | "quote", 215 | "syn 2.0.60", 216 | ] 217 | 218 | [[package]] 219 | name = "defmt" 220 | version = "0.3.6" 221 | source = "registry+https://github.com/rust-lang/crates.io-index" 222 | checksum = "3939552907426de152b3c2c6f51ed53f98f448babd26f28694c95f5906194595" 223 | dependencies = [ 224 | "bitflags", 225 | "defmt-macros", 226 | ] 227 | 228 | [[package]] 229 | name = "defmt-macros" 230 | version = "0.3.7" 231 | source = "registry+https://github.com/rust-lang/crates.io-index" 232 | checksum = "18bdc7a7b92ac413e19e95240e75d3a73a8d8e78aa24a594c22cbb4d44b4bbda" 233 | dependencies = [ 234 | "defmt-parser", 235 | "proc-macro-error", 236 | "proc-macro2", 237 | "quote", 238 | "syn 2.0.60", 239 | ] 240 | 241 | [[package]] 242 | name = "defmt-parser" 243 | version = "0.3.4" 244 | source = "registry+https://github.com/rust-lang/crates.io-index" 245 | checksum = "ff4a5fefe330e8d7f31b16a318f9ce81000d8e35e69b93eae154d16d2278f70f" 246 | dependencies = [ 247 | "thiserror", 248 | ] 249 | 250 | [[package]] 251 | name = "defmt-rtt" 252 | version = "0.4.0" 253 | source = "registry+https://github.com/rust-lang/crates.io-index" 254 | checksum = "609923761264dd99ed9c7d209718cda4631c5fe84668e0f0960124cbb844c49f" 255 | dependencies = [ 256 | "critical-section", 257 | "defmt", 258 | ] 259 | 260 | [[package]] 261 | name = "digest" 262 | version = "0.10.7" 263 | source = "registry+https://github.com/rust-lang/crates.io-index" 264 | checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" 265 | dependencies = [ 266 | "block-buffer", 267 | "crypto-common", 268 | ] 269 | 270 | [[package]] 271 | name = "document-features" 272 | version = "0.2.8" 273 | source = "registry+https://github.com/rust-lang/crates.io-index" 274 | checksum = "ef5282ad69563b5fc40319526ba27e0e7363d552a896f0297d54f767717f9b95" 275 | dependencies = [ 276 | "litrs", 277 | ] 278 | 279 | [[package]] 280 | name = "embassy-embedded-hal" 281 | version = "0.1.0" 282 | source = "registry+https://github.com/rust-lang/crates.io-index" 283 | checksum = "eca4a9380d03e61063067b8239f67d2fa9f108ede7c46b4273804f6b79e59a1d" 284 | dependencies = [ 285 | "defmt", 286 | "embassy-futures", 287 | "embassy-sync", 288 | "embassy-time", 289 | "embedded-hal 0.2.7", 290 | "embedded-hal 1.0.0", 291 | "embedded-hal-async", 292 | "embedded-storage", 293 | "embedded-storage-async", 294 | "nb 1.1.0", 295 | ] 296 | 297 | [[package]] 298 | name = "embassy-executor" 299 | version = "0.5.0" 300 | source = "registry+https://github.com/rust-lang/crates.io-index" 301 | checksum = "ec648daedd2143466eff4b3e8002024f9f6c1de4ab7666bb679688752624c925" 302 | dependencies = [ 303 | "cortex-m", 304 | "critical-section", 305 | "defmt", 306 | "document-features", 307 | "embassy-executor-macros", 308 | "embassy-time-driver", 309 | "embassy-time-queue-driver", 310 | ] 311 | 312 | [[package]] 313 | name = "embassy-executor-macros" 314 | version = "0.4.1" 315 | source = "registry+https://github.com/rust-lang/crates.io-index" 316 | checksum = "ad454accf80050e9cf7a51e994132ba0e56286b31f9317b68703897c328c59b5" 317 | dependencies = [ 318 | "darling 0.20.8", 319 | "proc-macro2", 320 | "quote", 321 | "syn 2.0.60", 322 | ] 323 | 324 | [[package]] 325 | name = "embassy-futures" 326 | version = "0.1.1" 327 | source = "registry+https://github.com/rust-lang/crates.io-index" 328 | checksum = "1f878075b9794c1e4ac788c95b728f26aa6366d32eeb10c7051389f898f7d067" 329 | 330 | [[package]] 331 | name = "embassy-hal-internal" 332 | version = "0.1.0" 333 | source = "registry+https://github.com/rust-lang/crates.io-index" 334 | checksum = "a0ec47cf8bab914018d4bd2b4f0aaeb46e4f52ab1e7985df88aeef2c6eda5aed" 335 | dependencies = [ 336 | "cortex-m", 337 | "critical-section", 338 | "defmt", 339 | "num-traits", 340 | ] 341 | 342 | [[package]] 343 | name = "embassy-nrf" 344 | version = "0.1.0" 345 | source = "registry+https://github.com/rust-lang/crates.io-index" 346 | checksum = "2faba661a13ac3417714ef23aa191af65941586dee692dbffe76ff7d3529321b" 347 | dependencies = [ 348 | "cfg-if", 349 | "cortex-m", 350 | "cortex-m-rt", 351 | "critical-section", 352 | "defmt", 353 | "document-features", 354 | "embassy-embedded-hal", 355 | "embassy-hal-internal", 356 | "embassy-sync", 357 | "embassy-time", 358 | "embassy-time-driver", 359 | "embassy-usb-driver", 360 | "embedded-hal 0.2.7", 361 | "embedded-hal 1.0.0", 362 | "embedded-hal-async", 363 | "embedded-io", 364 | "embedded-io-async", 365 | "embedded-storage", 366 | "embedded-storage-async", 367 | "fixed", 368 | "nrf52805-pac", 369 | "nrf52810-pac", 370 | "nrf52811-pac", 371 | "nrf52820-pac", 372 | "nrf52832-pac", 373 | "nrf52833-pac", 374 | "nrf52840-pac", 375 | "nrf5340-app-pac", 376 | "nrf5340-net-pac", 377 | "nrf9160-pac", 378 | "rand_core", 379 | ] 380 | 381 | [[package]] 382 | name = "embassy-sync" 383 | version = "0.5.0" 384 | source = "registry+https://github.com/rust-lang/crates.io-index" 385 | checksum = "dd938f25c0798db4280fcd8026bf4c2f48789aebf8f77b6e5cf8a7693ba114ec" 386 | dependencies = [ 387 | "cfg-if", 388 | "critical-section", 389 | "defmt", 390 | "embedded-io-async", 391 | "futures-util", 392 | "heapless", 393 | ] 394 | 395 | [[package]] 396 | name = "embassy-time" 397 | version = "0.3.0" 398 | source = "registry+https://github.com/rust-lang/crates.io-index" 399 | checksum = "a9c844070d9f80dc66ee739299183312baee2e1cdeb6e90b4ea2af44f4676da5" 400 | dependencies = [ 401 | "cfg-if", 402 | "critical-section", 403 | "defmt", 404 | "document-features", 405 | "embassy-time-driver", 406 | "embassy-time-queue-driver", 407 | "embedded-hal 0.2.7", 408 | "embedded-hal 1.0.0", 409 | "embedded-hal-async", 410 | "futures-util", 411 | "heapless", 412 | ] 413 | 414 | [[package]] 415 | name = "embassy-time-driver" 416 | version = "0.1.0" 417 | source = "registry+https://github.com/rust-lang/crates.io-index" 418 | checksum = "6e0c214077aaa9206958b16411c157961fb7990d4ea628120a78d1a5a28aed24" 419 | dependencies = [ 420 | "document-features", 421 | ] 422 | 423 | [[package]] 424 | name = "embassy-time-queue-driver" 425 | version = "0.1.0" 426 | source = "registry+https://github.com/rust-lang/crates.io-index" 427 | checksum = "f1177859559ebf42cd24ae7ba8fe6ee707489b01d0bf471f8827b7b12dcb0bc0" 428 | 429 | [[package]] 430 | name = "embassy-usb-driver" 431 | version = "0.1.0" 432 | source = "registry+https://github.com/rust-lang/crates.io-index" 433 | checksum = "4fc247028eae04174b6635104a35b1ed336aabef4654f5e87a8f32327d231970" 434 | dependencies = [ 435 | "defmt", 436 | ] 437 | 438 | [[package]] 439 | name = "embedded-hal" 440 | version = "0.2.7" 441 | source = "registry+https://github.com/rust-lang/crates.io-index" 442 | checksum = "35949884794ad573cf46071e41c9b60efb0cb311e3ca01f7af807af1debc66ff" 443 | dependencies = [ 444 | "nb 0.1.3", 445 | "void", 446 | ] 447 | 448 | [[package]] 449 | name = "embedded-hal" 450 | version = "1.0.0" 451 | source = "registry+https://github.com/rust-lang/crates.io-index" 452 | checksum = "361a90feb7004eca4019fb28352a9465666b24f840f5c3cddf0ff13920590b89" 453 | 454 | [[package]] 455 | name = "embedded-hal-async" 456 | version = "1.0.0" 457 | source = "registry+https://github.com/rust-lang/crates.io-index" 458 | checksum = "0c4c685bbef7fe13c3c6dd4da26841ed3980ef33e841cddfa15ce8a8fb3f1884" 459 | dependencies = [ 460 | "embedded-hal 1.0.0", 461 | ] 462 | 463 | [[package]] 464 | name = "embedded-io" 465 | version = "0.6.1" 466 | source = "registry+https://github.com/rust-lang/crates.io-index" 467 | checksum = "edd0f118536f44f5ccd48bcb8b111bdc3de888b58c74639dfb034a357d0f206d" 468 | 469 | [[package]] 470 | name = "embedded-io-async" 471 | version = "0.6.1" 472 | source = "registry+https://github.com/rust-lang/crates.io-index" 473 | checksum = "3ff09972d4073aa8c299395be75161d582e7629cd663171d62af73c8d50dba3f" 474 | dependencies = [ 475 | "embedded-io", 476 | ] 477 | 478 | [[package]] 479 | name = "embedded-storage" 480 | version = "0.3.1" 481 | source = "registry+https://github.com/rust-lang/crates.io-index" 482 | checksum = "a21dea9854beb860f3062d10228ce9b976da520a73474aed3171ec276bc0c032" 483 | 484 | [[package]] 485 | name = "embedded-storage-async" 486 | version = "0.4.1" 487 | source = "registry+https://github.com/rust-lang/crates.io-index" 488 | checksum = "1763775e2323b7d5f0aa6090657f5e21cfa02ede71f5dc40eead06d64dcd15cc" 489 | dependencies = [ 490 | "embedded-storage", 491 | ] 492 | 493 | [[package]] 494 | name = "fixed" 495 | version = "1.27.0" 496 | source = "registry+https://github.com/rust-lang/crates.io-index" 497 | checksum = "2fc715d38bea7b5bf487fcd79bcf8c209f0b58014f3018a7a19c2b855f472048" 498 | dependencies = [ 499 | "az", 500 | "bytemuck", 501 | "half", 502 | "typenum", 503 | ] 504 | 505 | [[package]] 506 | name = "fnv" 507 | version = "1.0.7" 508 | source = "registry+https://github.com/rust-lang/crates.io-index" 509 | checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" 510 | 511 | [[package]] 512 | name = "futures" 513 | version = "0.3.30" 514 | source = "registry+https://github.com/rust-lang/crates.io-index" 515 | checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" 516 | dependencies = [ 517 | "futures-channel", 518 | "futures-core", 519 | "futures-io", 520 | "futures-sink", 521 | "futures-task", 522 | "futures-util", 523 | ] 524 | 525 | [[package]] 526 | name = "futures-channel" 527 | version = "0.3.30" 528 | source = "registry+https://github.com/rust-lang/crates.io-index" 529 | checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" 530 | dependencies = [ 531 | "futures-core", 532 | "futures-sink", 533 | ] 534 | 535 | [[package]] 536 | name = "futures-core" 537 | version = "0.3.30" 538 | source = "registry+https://github.com/rust-lang/crates.io-index" 539 | checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" 540 | 541 | [[package]] 542 | name = "futures-io" 543 | version = "0.3.30" 544 | source = "registry+https://github.com/rust-lang/crates.io-index" 545 | checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" 546 | 547 | [[package]] 548 | name = "futures-sink" 549 | version = "0.3.30" 550 | source = "registry+https://github.com/rust-lang/crates.io-index" 551 | checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" 552 | 553 | [[package]] 554 | name = "futures-task" 555 | version = "0.3.30" 556 | source = "registry+https://github.com/rust-lang/crates.io-index" 557 | checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" 558 | 559 | [[package]] 560 | name = "futures-util" 561 | version = "0.3.30" 562 | source = "registry+https://github.com/rust-lang/crates.io-index" 563 | checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" 564 | dependencies = [ 565 | "futures-core", 566 | "futures-sink", 567 | "futures-task", 568 | "pin-project-lite", 569 | "pin-utils", 570 | ] 571 | 572 | [[package]] 573 | name = "generic-array" 574 | version = "0.14.7" 575 | source = "registry+https://github.com/rust-lang/crates.io-index" 576 | checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" 577 | dependencies = [ 578 | "typenum", 579 | "version_check", 580 | ] 581 | 582 | [[package]] 583 | name = "half" 584 | version = "2.4.1" 585 | source = "registry+https://github.com/rust-lang/crates.io-index" 586 | checksum = "6dd08c532ae367adf81c312a4580bc67f1d0fe8bc9c460520283f4c0ff277888" 587 | dependencies = [ 588 | "cfg-if", 589 | "crunchy", 590 | ] 591 | 592 | [[package]] 593 | name = "hash32" 594 | version = "0.3.1" 595 | source = "registry+https://github.com/rust-lang/crates.io-index" 596 | checksum = "47d60b12902ba28e2730cd37e95b8c9223af2808df9e902d4df49588d1470606" 597 | dependencies = [ 598 | "byteorder", 599 | ] 600 | 601 | [[package]] 602 | name = "heapless" 603 | version = "0.8.0" 604 | source = "registry+https://github.com/rust-lang/crates.io-index" 605 | checksum = "0bfb9eb618601c89945a70e254898da93b13be0388091d42117462b265bb3fad" 606 | dependencies = [ 607 | "hash32", 608 | "stable_deref_trait", 609 | ] 610 | 611 | [[package]] 612 | name = "homekit" 613 | version = "0.1.0" 614 | dependencies = [ 615 | "byteorder", 616 | "nrf-softdevice", 617 | ] 618 | 619 | [[package]] 620 | name = "ident_case" 621 | version = "1.0.1" 622 | source = "registry+https://github.com/rust-lang/crates.io-index" 623 | checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" 624 | 625 | [[package]] 626 | name = "lazy_static" 627 | version = "1.4.0" 628 | source = "registry+https://github.com/rust-lang/crates.io-index" 629 | checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" 630 | 631 | [[package]] 632 | name = "libc" 633 | version = "0.2.154" 634 | source = "registry+https://github.com/rust-lang/crates.io-index" 635 | checksum = "ae743338b92ff9146ce83992f766a31066a91a8c84a45e0e9f21e7cf6de6d346" 636 | 637 | [[package]] 638 | name = "litrs" 639 | version = "0.4.1" 640 | source = "registry+https://github.com/rust-lang/crates.io-index" 641 | checksum = "b4ce301924b7887e9d637144fdade93f9dfff9b60981d4ac161db09720d39aa5" 642 | 643 | [[package]] 644 | name = "memchr" 645 | version = "2.7.2" 646 | source = "registry+https://github.com/rust-lang/crates.io-index" 647 | checksum = "6c8640c5d730cb13ebd907d8d04b52f55ac9a2eec55b440c8892f40d56c76c1d" 648 | 649 | [[package]] 650 | name = "nb" 651 | version = "0.1.3" 652 | source = "registry+https://github.com/rust-lang/crates.io-index" 653 | checksum = "801d31da0513b6ec5214e9bf433a77966320625a37860f910be265be6e18d06f" 654 | dependencies = [ 655 | "nb 1.1.0", 656 | ] 657 | 658 | [[package]] 659 | name = "nb" 660 | version = "1.1.0" 661 | source = "registry+https://github.com/rust-lang/crates.io-index" 662 | checksum = "8d5439c4ad607c3c23abf66de8c8bf57ba8adcd1f129e699851a6e43935d339d" 663 | 664 | [[package]] 665 | name = "nostd_srp" 666 | version = "0.1.0" 667 | dependencies = [ 668 | "sha2", 669 | "srp", 670 | ] 671 | 672 | [[package]] 673 | name = "nrf-softdevice" 674 | version = "0.1.0" 675 | source = "registry+https://github.com/rust-lang/crates.io-index" 676 | checksum = "225a21d963b2382617dbbff5953dc8c6c43fe56db5c5155f4d20a30c50c2766d" 677 | dependencies = [ 678 | "cortex-m", 679 | "cortex-m-rt", 680 | "defmt", 681 | "embassy-futures", 682 | "embassy-sync", 683 | "embedded-storage", 684 | "embedded-storage-async", 685 | "fixed", 686 | "futures", 687 | "heapless", 688 | "nrf-softdevice-macro", 689 | "nrf-softdevice-s113", 690 | "nrf52832-pac", 691 | "num_enum", 692 | ] 693 | 694 | [[package]] 695 | name = "nrf-softdevice-macro" 696 | version = "0.1.0" 697 | source = "registry+https://github.com/rust-lang/crates.io-index" 698 | checksum = "3af0752f2f12e202fa29f5a8d2f6dcc8a421c7a7e368d9dab7feb6bfe24ff0e9" 699 | dependencies = [ 700 | "Inflector", 701 | "darling 0.13.4", 702 | "proc-macro2", 703 | "quote", 704 | "syn 1.0.109", 705 | "uuid", 706 | ] 707 | 708 | [[package]] 709 | name = "nrf-softdevice-s113" 710 | version = "0.1.2" 711 | source = "registry+https://github.com/rust-lang/crates.io-index" 712 | checksum = "a31dd9e5c307932d1db1dea42642e161c8c9575cbe02d14de5a16b9691d76087" 713 | 714 | [[package]] 715 | name = "nrf52805-pac" 716 | version = "0.12.2" 717 | source = "registry+https://github.com/rust-lang/crates.io-index" 718 | checksum = "a2da657648039d59f4de6bc31b948dd3a5d03b32529a4d5d19d9e2dd9d4bfa6c" 719 | dependencies = [ 720 | "cortex-m", 721 | "cortex-m-rt", 722 | "vcell", 723 | ] 724 | 725 | [[package]] 726 | name = "nrf52810-pac" 727 | version = "0.12.2" 728 | source = "registry+https://github.com/rust-lang/crates.io-index" 729 | checksum = "c26b12d5af17a9f4bb9a06ca9a1f814bca3d67bc8715b23f8dc230b09a227666" 730 | dependencies = [ 731 | "cortex-m", 732 | "cortex-m-rt", 733 | "vcell", 734 | ] 735 | 736 | [[package]] 737 | name = "nrf52811-pac" 738 | version = "0.12.2" 739 | source = "registry+https://github.com/rust-lang/crates.io-index" 740 | checksum = "4179b2a7ed0b2fd5e109d0fab9b4fc55b3936b2a4916a9306d22e5bc8dc1fd8f" 741 | dependencies = [ 742 | "cortex-m", 743 | "cortex-m-rt", 744 | "vcell", 745 | ] 746 | 747 | [[package]] 748 | name = "nrf52820-pac" 749 | version = "0.12.2" 750 | source = "registry+https://github.com/rust-lang/crates.io-index" 751 | checksum = "e4791cff995e6419a5ad1aebc3b3c9539d79125ca85eb5bfd2cff9b470b81071" 752 | dependencies = [ 753 | "cortex-m", 754 | "cortex-m-rt", 755 | "vcell", 756 | ] 757 | 758 | [[package]] 759 | name = "nrf52832-pac" 760 | version = "0.12.2" 761 | source = "registry+https://github.com/rust-lang/crates.io-index" 762 | checksum = "0242b685c9c15648fb803e155628f42ace457478b2cb930868f40cae2db925e0" 763 | dependencies = [ 764 | "cortex-m", 765 | "cortex-m-rt", 766 | "vcell", 767 | ] 768 | 769 | [[package]] 770 | name = "nrf52833-pac" 771 | version = "0.12.2" 772 | source = "registry+https://github.com/rust-lang/crates.io-index" 773 | checksum = "10e1358255b360cdc816dd7b6ef81be8c8499c0998277e5249bed222bd0f5241" 774 | dependencies = [ 775 | "cortex-m", 776 | "cortex-m-rt", 777 | "vcell", 778 | ] 779 | 780 | [[package]] 781 | name = "nrf52840-pac" 782 | version = "0.12.2" 783 | source = "registry+https://github.com/rust-lang/crates.io-index" 784 | checksum = "30713f36f1be02e5bc9abefa30eae4a1f943d810f199d4923d3ad062d1be1b3d" 785 | dependencies = [ 786 | "cortex-m", 787 | "cortex-m-rt", 788 | "vcell", 789 | ] 790 | 791 | [[package]] 792 | name = "nrf5340-app-pac" 793 | version = "0.12.2" 794 | source = "registry+https://github.com/rust-lang/crates.io-index" 795 | checksum = "7c88824573cd150fe9f27c1a48cea31a8cb24d3322df488875775143618c087a" 796 | dependencies = [ 797 | "cortex-m", 798 | "cortex-m-rt", 799 | "vcell", 800 | ] 801 | 802 | [[package]] 803 | name = "nrf5340-net-pac" 804 | version = "0.12.2" 805 | source = "registry+https://github.com/rust-lang/crates.io-index" 806 | checksum = "e5c03e44df22fe5888109fe42e523162c7059adf4d30860f4f73ecc8b1fc16fe" 807 | dependencies = [ 808 | "cortex-m", 809 | "cortex-m-rt", 810 | "vcell", 811 | ] 812 | 813 | [[package]] 814 | name = "nrf9160-pac" 815 | version = "0.12.2" 816 | source = "registry+https://github.com/rust-lang/crates.io-index" 817 | checksum = "7344d74afb5684e00c48d175cad9619f36d629cfb0687d33b4d1bb86fba688f4" 818 | dependencies = [ 819 | "cortex-m", 820 | "cortex-m-rt", 821 | "vcell", 822 | ] 823 | 824 | [[package]] 825 | name = "num-bigint" 826 | version = "0.4.5" 827 | source = "registry+https://github.com/rust-lang/crates.io-index" 828 | checksum = "c165a9ab64cf766f73521c0dd2cfdff64f488b8f0b3e621face3462d3db536d7" 829 | dependencies = [ 830 | "num-integer", 831 | "num-traits", 832 | ] 833 | 834 | [[package]] 835 | name = "num-integer" 836 | version = "0.1.46" 837 | source = "registry+https://github.com/rust-lang/crates.io-index" 838 | checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" 839 | dependencies = [ 840 | "num-traits", 841 | ] 842 | 843 | [[package]] 844 | name = "num-traits" 845 | version = "0.2.19" 846 | source = "registry+https://github.com/rust-lang/crates.io-index" 847 | checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" 848 | dependencies = [ 849 | "autocfg", 850 | ] 851 | 852 | [[package]] 853 | name = "num_enum" 854 | version = "0.7.2" 855 | source = "registry+https://github.com/rust-lang/crates.io-index" 856 | checksum = "02339744ee7253741199f897151b38e72257d13802d4ee837285cc2990a90845" 857 | dependencies = [ 858 | "num_enum_derive", 859 | ] 860 | 861 | [[package]] 862 | name = "num_enum_derive" 863 | version = "0.7.2" 864 | source = "registry+https://github.com/rust-lang/crates.io-index" 865 | checksum = "681030a937600a36906c185595136d26abfebb4aa9c65701cefcaf8578bb982b" 866 | dependencies = [ 867 | "proc-macro2", 868 | "quote", 869 | "syn 2.0.60", 870 | ] 871 | 872 | [[package]] 873 | name = "panic-probe" 874 | version = "0.3.1" 875 | source = "registry+https://github.com/rust-lang/crates.io-index" 876 | checksum = "aa6fa5645ef5a760cd340eaa92af9c1ce131c8c09e7f8926d8a24b59d26652b9" 877 | dependencies = [ 878 | "cortex-m", 879 | "defmt", 880 | ] 881 | 882 | [[package]] 883 | name = "pin-project-lite" 884 | version = "0.2.14" 885 | source = "registry+https://github.com/rust-lang/crates.io-index" 886 | checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" 887 | 888 | [[package]] 889 | name = "pin-utils" 890 | version = "0.1.0" 891 | source = "registry+https://github.com/rust-lang/crates.io-index" 892 | checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" 893 | 894 | [[package]] 895 | name = "proc-macro-error" 896 | version = "1.0.4" 897 | source = "registry+https://github.com/rust-lang/crates.io-index" 898 | checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" 899 | dependencies = [ 900 | "proc-macro-error-attr", 901 | "proc-macro2", 902 | "quote", 903 | "syn 1.0.109", 904 | "version_check", 905 | ] 906 | 907 | [[package]] 908 | name = "proc-macro-error-attr" 909 | version = "1.0.4" 910 | source = "registry+https://github.com/rust-lang/crates.io-index" 911 | checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" 912 | dependencies = [ 913 | "proc-macro2", 914 | "quote", 915 | "version_check", 916 | ] 917 | 918 | [[package]] 919 | name = "proc-macro2" 920 | version = "1.0.81" 921 | source = "registry+https://github.com/rust-lang/crates.io-index" 922 | checksum = "3d1597b0c024618f09a9c3b8655b7e430397a36d23fdafec26d6965e9eec3eba" 923 | dependencies = [ 924 | "unicode-ident", 925 | ] 926 | 927 | [[package]] 928 | name = "quote" 929 | version = "1.0.36" 930 | source = "registry+https://github.com/rust-lang/crates.io-index" 931 | checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" 932 | dependencies = [ 933 | "proc-macro2", 934 | ] 935 | 936 | [[package]] 937 | name = "rand_core" 938 | version = "0.6.4" 939 | source = "registry+https://github.com/rust-lang/crates.io-index" 940 | checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" 941 | 942 | [[package]] 943 | name = "regex" 944 | version = "1.10.4" 945 | source = "registry+https://github.com/rust-lang/crates.io-index" 946 | checksum = "c117dbdfde9c8308975b6a18d71f3f385c89461f7b3fb054288ecf2a2058ba4c" 947 | dependencies = [ 948 | "aho-corasick", 949 | "memchr", 950 | "regex-automata", 951 | "regex-syntax", 952 | ] 953 | 954 | [[package]] 955 | name = "regex-automata" 956 | version = "0.4.6" 957 | source = "registry+https://github.com/rust-lang/crates.io-index" 958 | checksum = "86b83b8b9847f9bf95ef68afb0b8e6cdb80f498442f5179a29fad448fcc1eaea" 959 | dependencies = [ 960 | "aho-corasick", 961 | "memchr", 962 | "regex-syntax", 963 | ] 964 | 965 | [[package]] 966 | name = "regex-syntax" 967 | version = "0.8.3" 968 | source = "registry+https://github.com/rust-lang/crates.io-index" 969 | checksum = "adad44e29e4c806119491a7f06f03de4d1af22c3a680dd47f1e6e179439d1f56" 970 | 971 | [[package]] 972 | name = "rustc_version" 973 | version = "0.2.3" 974 | source = "registry+https://github.com/rust-lang/crates.io-index" 975 | checksum = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" 976 | dependencies = [ 977 | "semver", 978 | ] 979 | 980 | [[package]] 981 | name = "semver" 982 | version = "0.9.0" 983 | source = "registry+https://github.com/rust-lang/crates.io-index" 984 | checksum = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" 985 | dependencies = [ 986 | "semver-parser", 987 | ] 988 | 989 | [[package]] 990 | name = "semver-parser" 991 | version = "0.7.0" 992 | source = "registry+https://github.com/rust-lang/crates.io-index" 993 | checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" 994 | 995 | [[package]] 996 | name = "sha2" 997 | version = "0.10.8" 998 | source = "registry+https://github.com/rust-lang/crates.io-index" 999 | checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" 1000 | dependencies = [ 1001 | "cfg-if", 1002 | "cpufeatures", 1003 | "digest", 1004 | ] 1005 | 1006 | [[package]] 1007 | name = "srp" 1008 | version = "0.6.0" 1009 | source = "registry+https://github.com/rust-lang/crates.io-index" 1010 | checksum = "4cdd40049b29ab1315ccba7ffcf1eece8162982eab14edfac3cf2c2ffab18193" 1011 | dependencies = [ 1012 | "digest", 1013 | "generic-array", 1014 | "lazy_static", 1015 | "num-bigint", 1016 | "subtle", 1017 | ] 1018 | 1019 | [[package]] 1020 | name = "stable_deref_trait" 1021 | version = "1.2.0" 1022 | source = "registry+https://github.com/rust-lang/crates.io-index" 1023 | checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" 1024 | 1025 | [[package]] 1026 | name = "strsim" 1027 | version = "0.10.0" 1028 | source = "registry+https://github.com/rust-lang/crates.io-index" 1029 | checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" 1030 | 1031 | [[package]] 1032 | name = "subtle" 1033 | version = "2.5.0" 1034 | source = "registry+https://github.com/rust-lang/crates.io-index" 1035 | checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" 1036 | 1037 | [[package]] 1038 | name = "syn" 1039 | version = "1.0.109" 1040 | source = "registry+https://github.com/rust-lang/crates.io-index" 1041 | checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" 1042 | dependencies = [ 1043 | "proc-macro2", 1044 | "quote", 1045 | "unicode-ident", 1046 | ] 1047 | 1048 | [[package]] 1049 | name = "syn" 1050 | version = "2.0.60" 1051 | source = "registry+https://github.com/rust-lang/crates.io-index" 1052 | checksum = "909518bc7b1c9b779f1bbf07f2929d35af9f0f37e47c6e9ef7f9dddc1e1821f3" 1053 | dependencies = [ 1054 | "proc-macro2", 1055 | "quote", 1056 | "unicode-ident", 1057 | ] 1058 | 1059 | [[package]] 1060 | name = "thiserror" 1061 | version = "1.0.59" 1062 | source = "registry+https://github.com/rust-lang/crates.io-index" 1063 | checksum = "f0126ad08bff79f29fc3ae6a55cc72352056dfff61e3ff8bb7129476d44b23aa" 1064 | dependencies = [ 1065 | "thiserror-impl", 1066 | ] 1067 | 1068 | [[package]] 1069 | name = "thiserror-impl" 1070 | version = "1.0.59" 1071 | source = "registry+https://github.com/rust-lang/crates.io-index" 1072 | checksum = "d1cd413b5d558b4c5bf3680e324a6fa5014e7b7c067a51e69dbdf47eb7148b66" 1073 | dependencies = [ 1074 | "proc-macro2", 1075 | "quote", 1076 | "syn 2.0.60", 1077 | ] 1078 | 1079 | [[package]] 1080 | name = "typenum" 1081 | version = "1.17.0" 1082 | source = "registry+https://github.com/rust-lang/crates.io-index" 1083 | checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" 1084 | 1085 | [[package]] 1086 | name = "unicode-ident" 1087 | version = "1.0.12" 1088 | source = "registry+https://github.com/rust-lang/crates.io-index" 1089 | checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" 1090 | 1091 | [[package]] 1092 | name = "uuid" 1093 | version = "1.8.0" 1094 | source = "registry+https://github.com/rust-lang/crates.io-index" 1095 | checksum = "a183cf7feeba97b4dd1c0d46788634f6221d87fa961b305bed08c851829efcc0" 1096 | 1097 | [[package]] 1098 | name = "vcell" 1099 | version = "0.1.3" 1100 | source = "registry+https://github.com/rust-lang/crates.io-index" 1101 | checksum = "77439c1b53d2303b20d9459b1ade71a83c716e3f9c34f3228c00e6f185d6c002" 1102 | 1103 | [[package]] 1104 | name = "version_check" 1105 | version = "0.9.4" 1106 | source = "registry+https://github.com/rust-lang/crates.io-index" 1107 | checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" 1108 | 1109 | [[package]] 1110 | name = "void" 1111 | version = "1.0.2" 1112 | source = "registry+https://github.com/rust-lang/crates.io-index" 1113 | checksum = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" 1114 | 1115 | [[package]] 1116 | name = "volatile-register" 1117 | version = "0.2.2" 1118 | source = "registry+https://github.com/rust-lang/crates.io-index" 1119 | checksum = "de437e2a6208b014ab52972a27e59b33fa2920d3e00fe05026167a1c509d19cc" 1120 | dependencies = [ 1121 | "vcell", 1122 | ] 1123 | 1124 | [[package]] 1125 | name = "washmon" 1126 | version = "0.1.0" 1127 | dependencies = [ 1128 | "cortex-m", 1129 | "cortex-m-rt", 1130 | "defmt", 1131 | "defmt-rtt", 1132 | "embassy-executor", 1133 | "embassy-nrf", 1134 | "embassy-time", 1135 | "homekit", 1136 | "nrf-softdevice", 1137 | "panic-probe", 1138 | ] 1139 | --------------------------------------------------------------------------------