diff --git a/Cargo.lock b/Cargo.lock index 378e2db..6375653 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -189,9 +189,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.96" +version = "1.0.97" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b964d184e89d9b6b67dd2715bc8e74cf3107fb2b529990c90cf517326150bf4" +checksum = "dcfed56ad506cb2c684a14971b8861fdc3baaaae314b9e5f9bb532cbe3ba7a4f" [[package]] name = "asn1-rs" @@ -239,29 +239,49 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "81953c529336010edd6d8e358f886d9581267795c61b19475b71314bffa46d35" dependencies = [ "concurrent-queue", - "event-listener", + "event-listener 2.5.3", "futures-core", ] [[package]] name = "async-hid" -version = "0.1.0" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee27e1e8262ac695d1596f4c152d2b9132afcb691c493b74e0c847bb72861d15" +checksum = "a2f7f810c0db07bfd87a5620b903e569770484a1d3154d9a55e2975cbedcaa88" dependencies = [ "async-channel", - "async-lock", + "async-io", + "async-lock 2.8.0", + "atomic-waker", "bytes", "core-foundation 0.9.4", - "flume 0.10.14", "futures-core", "futures-lite", - "io-kit-sys 0.3.0", + "io-kit-sys", "log", "mach2", - "nix 0.26.4", - "tokio", - "windows 0.48.0", + "nix 0.27.1", + "static_assertions", + "windows", +] + +[[package]] +name = "async-io" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43a2b323ccce0a1d90b449fd71f2a06ca7faa7c54c2751f06c9bd851fc061059" +dependencies = [ + "async-lock 3.4.0", + "cfg-if", + "concurrent-queue", + "futures-io", + "futures-lite", + "parking", + "polling", + "rustix", + "slab", + "tracing", + "windows-sys 0.59.0", ] [[package]] @@ -270,7 +290,18 @@ version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "287272293e9d8c41773cec55e365490fe034813a2f172f502d6ddcf75b2f582b" dependencies = [ - "event-listener", + "event-listener 2.5.3", +] + +[[package]] +name = "async-lock" +version = "3.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff6e472cdea888a4bd64f342f09b3f50e1886d32afe8df3d663c01140b811b18" +dependencies = [ + "event-listener 5.4.0", + "event-listener-strategy", + "pin-project-lite", ] [[package]] @@ -285,13 +316,13 @@ dependencies = [ [[package]] name = "async-trait" -version = "0.1.86" +version = "0.1.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "644dd749086bf3771a2fbc5f256fdb982d53f011c7d5d560304eafeecebce79d" +checksum = "d556ec1359574147ec0c4fc5eb525f3f23263a592b1a9c07e0a75b427de55c97" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.99", ] [[package]] @@ -332,6 +363,12 @@ dependencies = [ "bytemuck", ] +[[package]] +name = "atomic-waker" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" + [[package]] name = "autocfg" version = "1.4.0" @@ -400,7 +437,7 @@ dependencies = [ "miniz_oxide", "object", "rustc-demangle", - "windows-targets 0.52.6", + "windows-targets", ] [[package]] @@ -458,7 +495,7 @@ dependencies = [ "regex", "rustc-hash 1.1.0", "shlex", - "syn 2.0.98", + "syn 2.0.99", "which", ] @@ -470,9 +507,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.8.0" +version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f68f53c83ab957f72c32642f3868eec03eb974d1fb82e453128456482613d36" +checksum = "5c8214115b7bf84099f1309324e63141d4c5d7cc26862f97a0a857dbefe165bd" [[package]] name = "bitmaps" @@ -495,25 +532,6 @@ dependencies = [ "wyz", ] -[[package]] -name = "ble-peripheral-rust" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b7c90f0c7063d14ce00099efedc6b71058ae04e2b66bf61cbd222807777f4f6" -dependencies = [ - "async-trait", - "bluer", - "futures", - "log", - "objc2", - "objc2-core-bluetooth", - "objc2-foundation", - "once_cell", - "tokio", - "uuid", - "windows 0.57.0", -] - [[package]] name = "block-buffer" version = "0.9.0" @@ -532,73 +550,6 @@ dependencies = [ "generic-array", ] -[[package]] -name = "block2" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c132eebf10f5cad5289222520a4a058514204aed6d791f1cf4fe8088b82d15f" -dependencies = [ - "objc2", -] - -[[package]] -name = "bluer" -version = "0.17.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9ef6a5cd82c14b67cb3ac18d6dc6d76e1a48e40afe7e4263a9e3a19a7ed4ffb" -dependencies = [ - "custom_debug", - "dbus", - "dbus-crossroads", - "dbus-tokio", - "displaydoc", - "futures", - "hex", - "lazy_static", - "libc", - "log", - "macaddr", - "nix 0.29.0", - "num-derive 0.4.2", - "num-traits", - "pin-project", - "serde", - "serde_json", - "strum 0.26.3", - "tokio", - "tokio-stream", - "uuid", -] - -[[package]] -name = "bluez-async" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "353dc0fbd494ab1d066ffdff16f07acbea46ca63f507e093c07fdf2408d84300" -dependencies = [ - "bitflags 2.8.0", - "bluez-generated", - "dbus", - "dbus-tokio", - "futures", - "itertools", - "log", - "serde", - "serde-xml-rs", - "thiserror 2.0.11", - "tokio", - "uuid", -] - -[[package]] -name = "bluez-generated" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9676783265eadd6f11829982792c6f303f3854d014edfba384685dcf237dd062" -dependencies = [ - "dbus", -] - [[package]] name = "bs58" version = "0.4.0" @@ -608,33 +559,6 @@ dependencies = [ "sha2 0.9.9", ] -[[package]] -name = "btleplug" -version = "0.11.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b668804e0728a09c83cd9b94c9e1176717ea5522e8a3cb3688c2ac9a5f6e137c" -dependencies = [ - "async-trait", - "bitflags 2.8.0", - "bluez-async", - "dashmap 6.1.0", - "dbus", - "futures", - "jni", - "jni-utils", - "log", - "objc2", - "objc2-core-bluetooth", - "objc2-foundation", - "once_cell", - "static_assertions", - "thiserror 2.0.11", - "tokio", - "tokio-stream", - "uuid", - "windows 0.57.0", -] - [[package]] name = "btree-range-map" version = "0.7.2" @@ -667,9 +591,9 @@ checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf" [[package]] name = "bytemuck" -version = "1.21.0" +version = "1.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef657dfab802224e671f5818e9a4935f9b1957ed18e58292690cc39e7a4092a3" +checksum = "b6b1fc10dbac614ebc03540c9dbd60e83887fda27794998c6528f1782047d540" [[package]] name = "byteorder" @@ -694,9 +618,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.2.15" +version = "1.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c736e259eea577f443d5c86c304f9f4ae0295c43f3ba05c21f1d66b5f06001af" +checksum = "be714c154be609ec7f5dad223a33bf1482fff90472de28f7362806e6d4832b8c" dependencies = [ "shlex", ] @@ -710,12 +634,6 @@ dependencies = [ "slab", ] -[[package]] -name = "cesu8" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" - [[package]] name = "cexpr" version = "0.6.0" @@ -750,9 +668,9 @@ checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" [[package]] name = "chrono" -version = "0.4.39" +version = "0.4.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e36cc9d416881d2e24f9a963be5fb1cd90966419ac844274161d10488b3e825" +checksum = "1a7964611d71df112cb1730f2ee67324fcf4d0fc6606acbbe9bfe06df124637c" dependencies = [ "android-tzdata", "iana-time-zone", @@ -760,7 +678,7 @@ dependencies = [ "num-traits", "serde", "wasm-bindgen", - "windows-targets 0.52.6", + "windows-link", ] [[package]] @@ -851,7 +769,7 @@ dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.99", ] [[package]] @@ -869,6 +787,12 @@ dependencies = [ "cc", ] +[[package]] +name = "cobs" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67ba02a97a2bd10f4b59b25c7973101c79642302776489e030cd13cdab09ed15" + [[package]] name = "colorchoice" version = "1.0.3" @@ -881,16 +805,6 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "337cdbf3f1a0e643b4a7d1a2ffa39d22342fb6ee25739b5cfb997c28b3586422" -[[package]] -name = "combine" -version = "4.6.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd" -dependencies = [ - "bytes", - "memchr", -] - [[package]] name = "concurrent-queue" version = "2.5.0" @@ -1091,29 +1005,7 @@ checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", -] - -[[package]] -name = "custom_debug" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2da7d1ad9567b3e11e877f1d7a0fa0360f04162f94965fc4448fbed41a65298e" -dependencies = [ - "custom_debug_derive", -] - -[[package]] -name = "custom_debug_derive" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a707ceda8652f6c7624f2be725652e9524c815bf3b9d55a0b2320be2303f9c11" -dependencies = [ - "darling", - "proc-macro2", - "quote", - "syn 2.0.98", - "synstructure 0.13.1", + "syn 2.0.99", ] [[package]] @@ -1137,7 +1029,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn 2.0.98", + "syn 2.0.99", ] [[package]] @@ -1148,34 +1040,7 @@ checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" dependencies = [ "darling_core", "quote", - "syn 2.0.98", -] - -[[package]] -name = "dashmap" -version = "5.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "978747c1d849a7d2ee5e8adc0159961c48fb7e5db2f06af6723b80123bb53856" -dependencies = [ - "cfg-if", - "hashbrown 0.14.5", - "lock_api", - "once_cell", - "parking_lot_core", -] - -[[package]] -name = "dashmap" -version = "6.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5041cc499144891f3790297212f32a74fb938e5136a14943f338ef9e0ae276cf" -dependencies = [ - "cfg-if", - "crossbeam-utils", - "hashbrown 0.14.5", - "lock_api", - "once_cell", - "parking_lot_core", + "syn 2.0.99", ] [[package]] @@ -1201,7 +1066,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "18e4fdb82bd54a12e42fb58a800dcae6b9e13982238ce2296dc3570b92148e1f" dependencies = [ "data-encoding", - "syn 2.0.98", + "syn 2.0.99", ] [[package]] @@ -1210,33 +1075,11 @@ version = "0.9.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1bb21987b9fb1613058ba3843121dd18b163b254d8a6e797e144cbac14d96d1b" dependencies = [ - "futures-channel", - "futures-util", "libc", "libdbus-sys", "winapi", ] -[[package]] -name = "dbus-crossroads" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a4c83437187544ba5142427746835061b330446ca8902eabd70e4afb8f76de0" -dependencies = [ - "dbus", -] - -[[package]] -name = "dbus-tokio" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "007688d459bc677131c063a3a77fb899526e17b7980f390b69644bdbc41fad13" -dependencies = [ - "dbus", - "libc", - "tokio", -] - [[package]] name = "decoded-char" version = "0.1.1" @@ -1275,7 +1118,7 @@ checksum = "8034092389675178f570469e6c3b0465d3d30b4505c294a6550db47f3c17ad18" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.99", ] [[package]] @@ -1317,7 +1160,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.99", ] [[package]] @@ -1381,7 +1224,7 @@ dependencies = [ "enum-ordinalize 4.3.0", "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.99", ] [[package]] @@ -1412,6 +1255,18 @@ dependencies = [ "zeroize", ] +[[package]] +name = "embedded-io" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef1a6892d9eef45c8fa6b9e0086428a2cca8491aca8f787c534a3d6d0bcb3ced" + +[[package]] +name = "embedded-io" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edd0f118536f44f5ccd48bcb8b111bdc3de888b58c74639dfb034a357d0f206d" + [[package]] name = "enum-as-inner" version = "0.6.1" @@ -1421,7 +1276,7 @@ dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.99", ] [[package]] @@ -1434,7 +1289,7 @@ dependencies = [ "num-traits", "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.99", ] [[package]] @@ -1454,7 +1309,7 @@ checksum = "0d28318a75d4aead5c4db25382e8ef717932d0346600cacae6357eb5941bc5ff" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.99", ] [[package]] @@ -1465,7 +1320,7 @@ checksum = "ba7795da175654fe16979af73f81f26a8ea27638d8d9823d317016888a63dc4c" dependencies = [ "num-traits", "quote", - "syn 2.0.98", + "syn 2.0.99", ] [[package]] @@ -1490,6 +1345,27 @@ version = "2.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" +[[package]] +name = "event-listener" +version = "5.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3492acde4c3fc54c845eaab3eed8bd00c7a7d881f78bfc801e43a93dec1331ae" +dependencies = [ + "concurrent-queue", + "parking", + "pin-project-lite", +] + +[[package]] +name = "event-listener-strategy" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c3e4e0dd3673c1139bf041f3008816d9cf2946bbfac2945c09e523b8d7b05b2" +dependencies = [ + "event-listener 5.4.0", + "pin-project-lite", +] + [[package]] name = "eyre" version = "0.6.12" @@ -1502,12 +1378,9 @@ dependencies = [ [[package]] name = "fastrand" -version = "1.9.0" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be" -dependencies = [ - "instant", -] +checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" [[package]] name = "fdeflate" @@ -1570,19 +1443,6 @@ dependencies = [ "miniz_oxide", ] -[[package]] -name = "flume" -version = "0.10.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1657b4441c3403d9f7b3409e47575237dac27b1b5726df654a6ecbf92f0f7577" -dependencies = [ - "futures-core", - "futures-sink", - "nanorand", - "pin-project", - "spin 0.9.8", -] - [[package]] name = "flume" version = "0.11.1" @@ -1665,17 +1525,15 @@ checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" [[package]] name = "futures-lite" -version = "1.13.0" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49a9d51ce47660b1e808d3c990b4709f2f415d928835a17dfd16991515c46bce" +checksum = "f5edaec856126859abb19ed65f39e90fea3a9574b9707f13539acf4abf7eb532" dependencies = [ "fastrand", "futures-core", "futures-io", - "memchr", "parking", "pin-project-lite", - "waker-fn", ] [[package]] @@ -1686,7 +1544,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.99", ] [[package]] @@ -1752,7 +1610,7 @@ dependencies = [ "cfg-if", "libc", "wasi 0.13.3+wasi-0.2.2", - "windows-targets 0.52.6", + "windows-targets", ] [[package]] @@ -1816,12 +1674,6 @@ dependencies = [ "ahash 0.8.11", ] -[[package]] -name = "hashbrown" -version = "0.14.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" - [[package]] name = "hashbrown" version = "0.15.2" @@ -1840,6 +1692,12 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" +[[package]] +name = "hermit-abi" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbf6a919d6cf397374f7dfeeea91d974c7c0a7221d0d0f4f20d859d329e53fcc" + [[package]] name = "hex" version = "0.4.3" @@ -1921,9 +1779,9 @@ dependencies = [ [[package]] name = "httparse" -version = "1.10.0" +version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2d708df4e7140240a16cd6ab0ab65c972d7433ab77819ea693fde9c43811e2a" +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" [[package]] name = "httpdate" @@ -1964,7 +1822,7 @@ dependencies = [ "rustls 0.23.23", "rustls-pki-types", "tokio", - "tokio-rustls 0.26.1", + "tokio-rustls 0.26.2", "tower-service", "webpki-roots", ] @@ -2126,7 +1984,7 @@ checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.99", ] [[package]] @@ -2214,9 +2072,9 @@ dependencies = [ [[package]] name = "indoc" -version = "2.0.5" +version = "2.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b248f5224d1d606005e02c97f5aa4e88eeb230488bcc03bc9ca4d7991399f2b5" +checksum = "f4c7245a08504955605670dbf141fceab975f15ca21570696aebe9d2e71576bd" [[package]] name = "infer" @@ -2245,16 +2103,6 @@ dependencies = [ "cfg-if", ] -[[package]] -name = "io-kit-sys" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b2d4429acc1deff0fbdece0325b4997bdb02b2c245ab7023fd5deca0f6348de" -dependencies = [ - "core-foundation-sys", - "mach2", -] - [[package]] name = "io-kit-sys" version = "0.4.1" @@ -2288,7 +2136,7 @@ dependencies = [ "num-traits", "reqwest", "serde", - "thiserror 2.0.11", + "thiserror 2.0.12", "tokio-util", ] @@ -2376,8 +2224,8 @@ dependencies = [ "sha2 0.10.8", "signature", "ssi-jwk", - "strum 0.24.1", - "strum_macros 0.24.3", + "strum", + "strum_macros", "thiserror 1.0.69", "time", "tracing", @@ -2407,9 +2255,9 @@ dependencies = [ [[package]] name = "itoa" -version = "1.0.14" +version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674" +checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" [[package]] name = "jiff" @@ -2423,41 +2271,6 @@ dependencies = [ "serde", ] -[[package]] -name = "jni" -version = "0.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6df18c2e3db7e453d3c6ac5b3e9d5182664d28788126d39b91f2d1e22b017ec" -dependencies = [ - "cesu8", - "combine", - "jni-sys", - "log", - "thiserror 1.0.69", - "walkdir", -] - -[[package]] -name = "jni-sys" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" - -[[package]] -name = "jni-utils" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "259e9f2c3ead61de911f147000660511f07ab00adeed1d84f5ac4d0386e7a6c4" -dependencies = [ - "dashmap 5.5.3", - "futures", - "jni", - "log", - "once_cell", - "static_assertions", - "uuid", -] - [[package]] name = "jpeg2k" version = "0.9.1" @@ -2821,7 +2634,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc2f4eb4bc735547cfed7c0a4922cbd04a4655978c09b54f1f7b228750664c34" dependencies = [ "cfg-if", - "windows-targets 0.52.6", + "windows-targets", ] [[package]] @@ -2871,7 +2684,7 @@ dependencies = [ "proc-macro2", "quote", "static-iref", - "syn 2.0.98", + "syn 2.0.99", "thiserror 1.0.69", ] @@ -2883,9 +2696,9 @@ checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" [[package]] name = "litemap" -version = "0.7.4" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ee93343901ab17bd981295f2cf0026d4ad018c7c31ba84549a4ddbb47a45104" +checksum = "23fb14cb19457329c82206317a5663005a4d404783dc74f4252769b0d5f42856" [[package]] name = "lock_api" @@ -2924,12 +2737,6 @@ version = "0.4.26" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "30bde2b3dc3671ae49d8e2e9f044c7c005836e7a023ee57cffa25ab82764bb9e" -[[package]] -name = "macaddr" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baee0bbc17ce759db233beb01648088061bf678383130602a298e6998eedb2d8" - [[package]] name = "mach2" version = "0.4.2" @@ -2954,43 +2761,12 @@ version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "47e1ffaa40ddd1f3ed91f717a33c8c0ee23fff369e3aa8772b9605cc1d22f4c3" -[[package]] -name = "mdl-verifier" -version = "0.1.0" -source = "git+https://github.com/Syfaro/mdl-verifier.git#229e8bba01598d83504ada85f43b8a7190b5f5da" -dependencies = [ - "ble-peripheral-rust", - "btleplug", - "ciborium", - "futures", - "hex", - "isomdl", - "nfc1", - "rand 0.9.0", - "strum 0.27.1", - "thiserror 2.0.11", - "tokio", - "tokio-stream", - "tokio-util", - "tracing", - "uuid", -] - [[package]] name = "memchr" version = "2.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" -[[package]] -name = "memoffset" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5de893c32cde5f383baa4c04c5d6dbdd735cfd4a794b0debdb2bb1b421da5ff4" -dependencies = [ - "autocfg", -] - [[package]] name = "mime" version = "0.3.17" @@ -3055,15 +2831,6 @@ dependencies = [ "data-encoding-macro", ] -[[package]] -name = "nanorand" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a51313c5820b0b02bd422f4b44776fbf47961755c74ce64afc73bfad10226c3" -dependencies = [ - "getrandom 0.2.15", -] - [[package]] name = "nfc1" version = "0.5.2" @@ -3098,8 +2865,17 @@ dependencies = [ "bitflags 1.3.2", "cfg-if", "libc", - "memoffset", - "pin-utils", +] + +[[package]] +name = "nix" +version = "0.27.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2eb04e9c688eff1c89d72b407f168cf79bb9e867a9d3323ed6c01519eb9cc053" +dependencies = [ + "bitflags 2.9.0", + "cfg-if", + "libc", ] [[package]] @@ -3108,7 +2884,7 @@ version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46" dependencies = [ - "bitflags 2.8.0", + "bitflags 2.9.0", "cfg-if", "cfg_aliases", "libc", @@ -3187,17 +2963,6 @@ dependencies = [ "syn 1.0.109", ] -[[package]] -name = "num-derive" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.98", -] - [[package]] name = "num-integer" version = "0.1.46" @@ -3257,52 +3022,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.98", -] - -[[package]] -name = "objc-sys" -version = "0.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdb91bdd390c7ce1a8607f35f3ca7151b65afc0ff5ff3b34fa350f7d7c7e4310" - -[[package]] -name = "objc2" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46a785d4eeff09c14c487497c162e92766fbb3e4059a71840cecc03d9a50b804" -dependencies = [ - "objc-sys", - "objc2-encode", -] - -[[package]] -name = "objc2-core-bluetooth" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a644b62ffb826a5277f536cf0f701493de420b13d40e700c452c36567771111" -dependencies = [ - "bitflags 2.8.0", - "objc2", - "objc2-foundation", -] - -[[package]] -name = "objc2-encode" -version = "4.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef25abbcd74fb2609453eb695bd2f860d389e457f67dc17cafc8b8cbc89d0c33" - -[[package]] -name = "objc2-foundation" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ee638a5da3799329310ad4cfa62fbf045d5f56e3ef5ba4149e7452dcf89d5a8" -dependencies = [ - "bitflags 2.8.0", - "block2", - "libc", - "objc2", + "syn 2.0.99", ] [[package]] @@ -3425,19 +3145,6 @@ version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" -[[package]] -name = "parking_lot_core" -version = "0.9.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" -dependencies = [ - "cfg-if", - "libc", - "redox_syscall", - "smallvec", - "windows-targets 0.52.6", -] - [[package]] name = "pathdiff" version = "0.2.3" @@ -3540,7 +3247,7 @@ dependencies = [ "phf_shared", "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.99", ] [[package]] @@ -3554,22 +3261,22 @@ dependencies = [ [[package]] name = "pin-project" -version = "1.1.9" +version = "1.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfe2e71e1471fe07709406bf725f710b02927c9c54b2b5b2ec0e8087d97c327d" +checksum = "677f1add503faace112b9f1373e43e9e054bfdd22ff1a63c1bc485eaec6a6a8a" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.9" +version = "1.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6e859e6e5bd50440ab63c47e3ebabc90f26251f7c73c3d3e837b74a1cc3fa67" +checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.99", ] [[package]] @@ -3618,9 +3325,9 @@ dependencies = [ [[package]] name = "pkg-config" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2" +checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" [[package]] name = "png" @@ -3635,6 +3342,21 @@ dependencies = [ "miniz_oxide", ] +[[package]] +name = "polling" +version = "3.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a604568c3202727d1507653cb121dbd627a58684eb09a820fd746bee38b4442f" +dependencies = [ + "cfg-if", + "concurrent-queue", + "hermit-abi", + "pin-project-lite", + "rustix", + "tracing", + "windows-sys 0.59.0", +] + [[package]] name = "polyval" version = "0.6.2" @@ -3662,6 +3384,18 @@ dependencies = [ "portable-atomic", ] +[[package]] +name = "postcard" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "170a2601f67cc9dba8edd8c4870b15f71a6a2dc196daec8c83f72b59dff628a8" +dependencies = [ + "cobs", + "embedded-io 0.4.0", + "embedded-io 0.6.1", + "serde", +] + [[package]] name = "powerfmt" version = "0.2.0" @@ -3688,12 +3422,12 @@ dependencies = [ [[package]] name = "prettyplease" -version = "0.2.29" +version = "0.2.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6924ced06e1f7dfe3fa48d57b9f74f55d8915f5036121bef647ef4b204895fac" +checksum = "f1ccf34da56fc294e7d4ccf69a85992b7dfb826b7cf57bac6a70bba3494cc08a" dependencies = [ "proc-macro2", - "syn 2.0.98", + "syn 2.0.99", ] [[package]] @@ -3751,9 +3485,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.93" +version = "1.0.94" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60946a68e5f9d28b0dc1c21bb8a97ee7d018a8b322fa57838ba31cc878e22d99" +checksum = "a31971752e70b8b2686d7e46ec17fb38dad4051d94024c88df49b667caea9c84" dependencies = [ "unicode-ident", ] @@ -3771,7 +3505,7 @@ dependencies = [ "rustc-hash 2.1.1", "rustls 0.23.23", "socket2", - "thiserror 2.0.11", + "thiserror 2.0.12", "tokio", "tracing", ] @@ -3790,7 +3524,7 @@ dependencies = [ "rustls 0.23.23", "rustls-pki-types", "slab", - "thiserror 2.0.11", + "thiserror 2.0.12", "tinyvec", "tracing", "web-time", @@ -3812,9 +3546,9 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.38" +version = "1.0.39" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e4dccaaaf89514f546c693ddc140f729f958c247918a13380cccc6078391acc" +checksum = "c1f1914ce909e1658d9907913b4b91947430c7d9be598b15a1912935b8c04801" dependencies = [ "proc-macro2", ] @@ -3843,8 +3577,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3779b94aeb87e8bd4e834cee3650289ee9e0d5677f976ecdb6d219e5f4f6cd94" dependencies = [ "rand_chacha 0.9.0", - "rand_core 0.9.2", - "zerocopy 0.8.20", + "rand_core 0.9.3", + "zerocopy 0.8.21", ] [[package]] @@ -3864,7 +3598,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" dependencies = [ "ppv-lite86", - "rand_core 0.9.2", + "rand_core 0.9.3", ] [[package]] @@ -3878,12 +3612,11 @@ dependencies = [ [[package]] name = "rand_core" -version = "0.9.2" +version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a509b1a2ffbe92afab0e55c8fd99dea1c280e8171bd2d88682bb20bc41cbc2c" +checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" dependencies = [ "getrandom 0.3.1", - "zerocopy 0.8.20", ] [[package]] @@ -3925,15 +3658,6 @@ dependencies = [ "thiserror 1.0.69", ] -[[package]] -name = "redox_syscall" -version = "0.5.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82b568323e98e49e2a0899dcee453dd679fae22d69adf9b11dd508d1549b7e2f" -dependencies = [ - "bitflags 2.8.0", -] - [[package]] name = "reg-interface" version = "0.4.0" @@ -3954,9 +3678,9 @@ dependencies = [ "isomdl", "jpeg2k", "jsonwebtoken", - "mdl-verifier", "nfc1", "open", + "postcard", "rand 0.9.0", "regex", "reqwest", @@ -4067,7 +3791,7 @@ dependencies = [ "serde_urlencoded", "sync_wrapper", "tokio", - "tokio-rustls 0.26.1", + "tokio-rustls 0.26.2", "tokio-util", "tower", "tower-service", @@ -4097,7 +3821,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ce4d759a4729a655ddfdbb3ff6e77fb9eadd902dae12319455557796e435d2a6" dependencies = [ "ahash 0.8.11", - "bitflags 2.8.0", + "bitflags 2.9.0", "instant", "no-std-compat", "num-traits", @@ -4117,7 +3841,7 @@ checksum = "a5a11a05ee1ce44058fa3d5961d05194fdbe3ad6b40f904af764d81b86450e6b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.99", ] [[package]] @@ -4173,7 +3897,7 @@ checksum = "e1568e15fab2d546f940ed3a21f48bbbd1c494c90c99c4481339364a497f94a9" dependencies = [ "async-tungstenite", "bytes", - "flume 0.11.1", + "flume", "futures-util", "http", "log", @@ -4229,7 +3953,7 @@ version = "0.38.44" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" dependencies = [ - "bitflags 2.8.0", + "bitflags 2.9.0", "errno", "libc", "linux-raw-sys", @@ -4308,15 +4032,15 @@ dependencies = [ [[package]] name = "rustversion" -version = "1.0.19" +version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7c45b9784283f1b2e7fb61b42047c2fd678ef0960d4f6f1eba131594cc369d4" +checksum = "eded382c5f5f786b989652c49544c4877d9f015cc22e145a5ea8ea66c2921cd2" [[package]] name = "ryu" -version = "1.0.19" +version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ea1a2d0a644769cc99faa24c3ad26b379b786fe7c36fd3c546254801650e6dd" +checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" [[package]] name = "ryu-js" @@ -4330,15 +4054,6 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "700de91d5fd6091442d00fdd9ee790af6d4f0f480562b0f5a1e8f59e90aafe73" -[[package]] -name = "same-file" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" -dependencies = [ - "winapi-util", -] - [[package]] name = "schannel" version = "0.1.27" @@ -4375,7 +4090,7 @@ version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" dependencies = [ - "bitflags 2.8.0", + "bitflags 2.9.0", "core-foundation 0.9.4", "core-foundation-sys", "libc", @@ -4394,9 +4109,9 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.25" +version = "1.0.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f79dfe2d285b0488816f30e700a7438c5a73d816b5b7d3ac72fbc48b0d185e03" +checksum = "56e6fa9c48d24d85fb3de5ad847117517440f6beceb7798af16b4a87d616b8d0" [[package]] name = "serde" @@ -4407,23 +4122,11 @@ dependencies = [ "serde_derive", ] -[[package]] -name = "serde-xml-rs" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb3aa78ecda1ebc9ec9847d5d3aba7d618823446a049ba2491940506da6e2782" -dependencies = [ - "log", - "serde", - "thiserror 1.0.69", - "xml-rs", -] - [[package]] name = "serde_bytes" -version = "0.11.15" +version = "0.11.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "387cc504cb06bb40a96c8e04e951fe01854cf6bc921053c954e4a606d9675c6a" +checksum = "364fec0df39c49a083c9a8a18a23a6bcfd9af130fe9fe321d18520a0d113e09e" dependencies = [ "serde", ] @@ -4436,7 +4139,7 @@ checksum = "f09503e191f4e797cb8aac08e9a4a4695c5edf6a2e70e376d961ddd5c969f82b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.99", ] [[package]] @@ -4452,9 +4155,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.139" +version = "1.0.140" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44f86c3acccc9c65b153fe1b85a3be07fe5515274ec9f0653b4a0875731c72a6" +checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" dependencies = [ "itoa", "memchr", @@ -4510,7 +4213,7 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.99", ] [[package]] @@ -4529,11 +4232,11 @@ version = "4.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5ecfc4858c2266c7695d8b8460bbd612fa81bd2e250f5f0dd16195e4b4f8b3d8" dependencies = [ - "bitflags 2.8.0", + "bitflags 2.9.0", "cfg-if", "core-foundation 0.10.0", "core-foundation-sys", - "io-kit-sys 0.4.1", + "io-kit-sys", "mach2", "nix 0.26.4", "scopeguard", @@ -4636,7 +4339,7 @@ checksum = "297f631f50729c8c99b84667867963997ec0b50f32b2a7dbcab828ef0541e8bb" dependencies = [ "num-bigint", "num-traits", - "thiserror 2.0.11", + "thiserror 2.0.12", "time", ] @@ -4764,9 +4467,9 @@ dependencies = [ [[package]] name = "ssi-contexts" -version = "0.1.9" +version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53b9b14b02742a39a37d33c79d5fc6b0db9656089eabb6b5dc554aa1ddf9aa69" +checksum = "5d0eda75b662bc3d7a9e751292c96a71a3d9bdcfb887e0b895032a5fd23c203e" [[package]] name = "ssi-core" @@ -4857,7 +4560,7 @@ dependencies = [ "linked-data", "multibase", "num-bigint", - "num-derive 0.3.3", + "num-derive", "num-traits", "p256", "rand 0.8.5", @@ -4913,7 +4616,7 @@ checksum = "3cc4068497ae43896d41174586dcdc2153a1af2c82856fb308bfaaddc28e5549" dependencies = [ "iref", "quote", - "syn 2.0.98", + "syn 2.0.99", ] [[package]] @@ -4932,7 +4635,7 @@ dependencies = [ "quote", "serde", "sha2 0.10.8", - "syn 2.0.98", + "syn 2.0.99", "thiserror 1.0.69", ] @@ -4954,24 +4657,6 @@ version = "0.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "063e6045c0e62079840579a7e47a355ae92f60eb74daaf156fb1e84ba164e63f" -[[package]] -name = "strum" -version = "0.26.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fec0f0aef304996cf250b31b5a10dee7980c85da9d759361292b8bca5a18f06" -dependencies = [ - "strum_macros 0.26.4", -] - -[[package]] -name = "strum" -version = "0.27.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f64def088c51c9510a8579e3c5d67c65349dcf755e5479ad3d010aa6454e2c32" -dependencies = [ - "strum_macros 0.27.1", -] - [[package]] name = "strum_macros" version = "0.24.3" @@ -4985,32 +4670,6 @@ dependencies = [ "syn 1.0.109", ] -[[package]] -name = "strum_macros" -version = "0.26.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c6bee85a5a24955dc440386795aa378cd9cf82acd5f764469152d2270e581be" -dependencies = [ - "heck 0.5.0", - "proc-macro2", - "quote", - "rustversion", - "syn 2.0.98", -] - -[[package]] -name = "strum_macros" -version = "0.27.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c77a8c5abcaf0f9ce05d62342b7d298c346515365c36b673df4ebe3ced01fde8" -dependencies = [ - "heck 0.5.0", - "proc-macro2", - "quote", - "rustversion", - "syn 2.0.98", -] - [[package]] name = "subtle" version = "2.6.1" @@ -5030,9 +4689,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.98" +version = "2.0.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36147f1a48ae0ec2b5b3bc5b537d267457555a10dc06f3dbc8cb11ba3006d3b1" +checksum = "e02e925281e18ffd9d640e234264753c43edc62d64b2d4cf898f1bc5e75f3fc2" dependencies = [ "proc-macro2", "quote", @@ -5068,7 +4727,7 @@ checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.99", ] [[package]] @@ -5097,11 +4756,11 @@ dependencies = [ [[package]] name = "thiserror" -version = "2.0.11" +version = "2.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d452f284b73e6d76dd36758a0c8684b1d5be31f92b89d07fd5822175732206fc" +checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708" dependencies = [ - "thiserror-impl 2.0.11", + "thiserror-impl 2.0.12", ] [[package]] @@ -5112,18 +4771,18 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.99", ] [[package]] name = "thiserror-impl" -version = "2.0.11" +version = "2.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26afc1baea8a989337eeb52b6e72a039780ce45c3edfcc9c5b9d112feeb173c2" +checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.99", ] [[package]] @@ -5188,9 +4847,9 @@ dependencies = [ [[package]] name = "tinyvec" -version = "1.8.1" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "022db8904dfa342efe721985167e9fcd16c29b226db4397ed752a761cfce81e8" +checksum = "09b3661f17e86524eccd4371ab0429194e0d7c008abb45f7a7495b1719463c71" dependencies = [ "tinyvec_macros", ] @@ -5219,7 +4878,7 @@ checksum = "2d2e76690929402faae40aebdda620a2c0e25dd6d3b9afe48867dfd95991f4bd" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.99", ] [[package]] @@ -5247,7 +4906,7 @@ checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.99", ] [[package]] @@ -5263,9 +4922,9 @@ dependencies = [ [[package]] name = "tokio-rustls" -version = "0.26.1" +version = "0.26.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f6d0975eaace0cf0fcadee4e4aaa5da15b5c079146f2cffb67c113be122bf37" +checksum = "8e727b36a1a0e8b74c376ac2211e40c2c8af09fb4013c60d910495810f008e9b" dependencies = [ "rustls 0.23.23", "tokio", @@ -5294,7 +4953,6 @@ dependencies = [ "futures-core", "pin-project-lite", "tokio", - "tokio-util", ] [[package]] @@ -5391,7 +5049,7 @@ checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.99", ] [[package]] @@ -5489,9 +5147,9 @@ dependencies = [ [[package]] name = "unicode-ident" -version = "1.0.17" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00e2473a93778eb0bad35909dff6a10d28e63f792f16ed15e404fca9d5eeedbe" +checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" [[package]] name = "unicode-xid" @@ -5576,9 +5234,9 @@ checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "uuid" -version = "1.14.0" +version = "1.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93d59ca99a559661b96bf898d8fce28ed87935fd2bea9f05983c1464dd6c71b1" +checksum = "e0f540e3240398cce6128b64ba83fdbdd86129c16a3aa1a3a252efd66eb3d587" dependencies = [ "atomic", "getrandom 0.3.1", @@ -5603,22 +5261,6 @@ version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" -[[package]] -name = "waker-fn" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "317211a0dc0ceedd78fb2ca9a44aed3d7b9b26f81870d485c07122b4350673b7" - -[[package]] -name = "walkdir" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" -dependencies = [ - "same-file", - "winapi-util", -] - [[package]] name = "want" version = "0.3.1" @@ -5665,7 +5307,7 @@ dependencies = [ "log", "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.99", "wasm-bindgen-shared", ] @@ -5700,7 +5342,7 @@ checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.99", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -5784,30 +5426,12 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" -[[package]] -name = "winapi-util" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" -dependencies = [ - "windows-sys 0.59.0", -] - [[package]] name = "winapi-x86_64-pc-windows-gnu" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" -[[package]] -name = "windows" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e686886bc078bc1b0b600cac0147aadb815089b6e4da64016cbd754b6342700f" -dependencies = [ - "windows-targets 0.48.5", -] - [[package]] name = "windows" version = "0.57.0" @@ -5815,7 +5439,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "12342cb4d8e3b046f3d80effd474a7a02447231330ef77d71daa6fbc40681143" dependencies = [ "windows-core 0.57.0", - "windows-targets 0.52.6", + "windows-targets", ] [[package]] @@ -5824,7 +5448,7 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" dependencies = [ - "windows-targets 0.52.6", + "windows-targets", ] [[package]] @@ -5836,7 +5460,7 @@ dependencies = [ "windows-implement", "windows-interface", "windows-result 0.1.2", - "windows-targets 0.52.6", + "windows-targets", ] [[package]] @@ -5847,7 +5471,7 @@ checksum = "9107ddc059d5b6fbfbffdfa7a7fe3e22a226def0b2608f72e9d552763d3e1ad7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.99", ] [[package]] @@ -5858,9 +5482,15 @@ checksum = "29bee4b38ea3cde66011baa44dba677c432a78593e202392d1e9070cf2a7fca7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.99", ] +[[package]] +name = "windows-link" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dccfd733ce2b1753b03b6d3c65edf020262ea35e20ccdf3e288043e6dd620e3" + [[package]] name = "windows-registry" version = "0.2.0" @@ -5869,7 +5499,7 @@ checksum = "e400001bb720a623c1c69032f8e3e4cf09984deec740f007dd2b03ec864804b0" dependencies = [ "windows-result 0.2.0", "windows-strings", - "windows-targets 0.52.6", + "windows-targets", ] [[package]] @@ -5878,7 +5508,7 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5e383302e8ec8515204254685643de10811af0ed97ea37210dc26fb0032647f8" dependencies = [ - "windows-targets 0.52.6", + "windows-targets", ] [[package]] @@ -5887,7 +5517,7 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1d1043d8214f791817bab27572aaa8af63732e11bf84aa21a45a78d6c317ae0e" dependencies = [ - "windows-targets 0.52.6", + "windows-targets", ] [[package]] @@ -5897,7 +5527,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10" dependencies = [ "windows-result 0.2.0", - "windows-targets 0.52.6", + "windows-targets", ] [[package]] @@ -5906,7 +5536,7 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ - "windows-targets 0.52.6", + "windows-targets", ] [[package]] @@ -5915,22 +5545,7 @@ version = "0.59.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" dependencies = [ - "windows-targets 0.52.6", -] - -[[package]] -name = "windows-targets" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" -dependencies = [ - "windows_aarch64_gnullvm 0.48.5", - "windows_aarch64_msvc 0.48.5", - "windows_i686_gnu 0.48.5", - "windows_i686_msvc 0.48.5", - "windows_x86_64_gnu 0.48.5", - "windows_x86_64_gnullvm 0.48.5", - "windows_x86_64_msvc 0.48.5", + "windows-targets", ] [[package]] @@ -5939,46 +5554,28 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" dependencies = [ - "windows_aarch64_gnullvm 0.52.6", - "windows_aarch64_msvc 0.52.6", - "windows_i686_gnu 0.52.6", + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", "windows_i686_gnullvm", - "windows_i686_msvc 0.52.6", - "windows_x86_64_gnu 0.52.6", - "windows_x86_64_gnullvm 0.52.6", - "windows_x86_64_msvc 0.52.6", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", ] -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" - [[package]] name = "windows_aarch64_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" -[[package]] -name = "windows_aarch64_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" - [[package]] name = "windows_aarch64_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" -[[package]] -name = "windows_i686_gnu" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" - [[package]] name = "windows_i686_gnu" version = "0.52.6" @@ -5991,48 +5588,24 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" -[[package]] -name = "windows_i686_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" - [[package]] name = "windows_i686_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" -[[package]] -name = "windows_x86_64_gnu" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" - [[package]] name = "windows_x86_64_gnu" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" - [[package]] name = "windows_x86_64_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" -[[package]] -name = "windows_x86_64_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" - [[package]] name = "windows_x86_64_msvc" version = "0.52.6" @@ -6064,7 +5637,7 @@ version = "0.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3268f3d866458b787f390cf61f4bbb563b922d091359f9608842999eaee3943c" dependencies = [ - "bitflags 2.8.0", + "bitflags 2.9.0", ] [[package]] @@ -6087,7 +5660,7 @@ checksum = "a198f414f083fb19fcc1bffcb0fa0cf46d33ccfa229adf248cac12c180e91609" dependencies = [ "async-tungstenite", "async_io_stream", - "bitflags 2.8.0", + "bitflags 2.9.0", "futures-core", "futures-io", "futures-sink", @@ -6122,12 +5695,6 @@ dependencies = [ "tls_codec", ] -[[package]] -name = "xml-rs" -version = "0.8.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5b940ebc25896e71dd073bad2dbaa2abfe97b0a391415e22ad1326d9c54e3c4" - [[package]] name = "xsd-types" version = "0.9.6" @@ -6168,7 +5735,7 @@ checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.99", "synstructure 0.13.1", ] @@ -6184,11 +5751,11 @@ dependencies = [ [[package]] name = "zerocopy" -version = "0.8.20" +version = "0.8.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dde3bb8c68a8f3f1ed4ac9221aad6b10cece3e60a8e2ea54a6a2dec806d0084c" +checksum = "dcf01143b2dd5d134f11f545cf9f1431b13b749695cb33bcce051e7568f99478" dependencies = [ - "zerocopy-derive 0.8.20", + "zerocopy-derive 0.8.21", ] [[package]] @@ -6199,38 +5766,38 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.99", ] [[package]] name = "zerocopy-derive" -version = "0.8.20" +version = "0.8.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eea57037071898bf96a6da35fd626f4f27e9cee3ead2a6c703cf09d472b2e700" +checksum = "712c8386f4f4299382c9abee219bee7084f78fb939d88b6840fcc1320d5f6da2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.99", ] [[package]] name = "zerofrom" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cff3ee08c995dee1859d998dea82f7374f2826091dd9cd47def953cae446cd2e" +checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" dependencies = [ "zerofrom-derive", ] [[package]] name = "zerofrom-derive" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "595eed982f7d355beb85837f651fa22e90b3c044842dc7f2c2842c086f295808" +checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.99", "synstructure 0.13.1", ] @@ -6251,7 +5818,7 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.99", ] [[package]] @@ -6273,7 +5840,7 @@ checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.99", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index 6dd7965..2b3a426 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -14,7 +14,7 @@ vendored = ["nfc1/vendored", "nfc1/drivers", "nfc1/default_drivers", "dbus/vendo [dependencies] aamva = { git = "https://github.com/Syfaro/aamva-rs.git", version = "0.1.0" } -async-hid = "0.1.0" +async-hid = "0.2.0" async-trait = "0.1.81" axum = { version = "0.8.1", default-features = false, features = ["http1", "tracing", "tokio"] } base64 = "0.22.1" @@ -28,9 +28,9 @@ ipp = { version = "5.2.0", default-features = false, features = ["async", "async isomdl = { git = "https://github.com/Syfaro/isomdl.git", branch = "handover-improvements", version = "0.1.0" } jpeg2k = { version = "0.9.1", features = ["image"] } jsonwebtoken = "9.3.0" -mdl-verifier = { git = "https://github.com/Syfaro/mdl-verifier.git" } nfc1 = { version = "0.5.2", default-features = false } open = "5.3.0" +postcard = { version = "1.1.1", default-features = false, features = ["alloc"] } rand = "0.9.0" regex = "1.11.1" reqwest = { version = "0.12.5", default-features = false, features = [ @@ -54,7 +54,7 @@ toml = "0.8.14" tracing = "0.1.40" tracing-subscriber = { version = "0.3.18", features = ["env-filter"] } url = "2.5.2" -uuid = "1.14.0" +uuid = "1.15.1" [target.'cfg(target_os = "linux")'.dependencies] dbus = { version = "0.9.7", optional = true } diff --git a/README.md b/README.md index f871d77..92519b1 100644 --- a/README.md +++ b/README.md @@ -23,9 +23,9 @@ enabled_decoders = ["aamva", "mdl", "shc", "url", "generic"] [decoder.mdl] input_name = "mdl" -timeout = 120 +path = "/dev/ttyACM0" +baud = 115200 certificates_path = "mdl-certificates" -nfc_connstring = "pn532_uart:/dev/ttyACM0" [decoder.mdl.request_elements."org.iso.18013.5.1"] given_name = false diff --git a/src/decoder/mdl.rs b/src/decoder/mdl.rs index b8e24e2..001b291 100644 --- a/src/decoder/mdl.rs +++ b/src/decoder/mdl.rs @@ -1,21 +1,38 @@ -use std::{collections::HashMap, ffi::OsStr, path::PathBuf}; +use std::{collections::HashMap, ffi::OsStr, path::PathBuf, sync::Arc, time::Duration}; use async_trait::async_trait; -use serde::Deserialize; -use tokio::{io::AsyncReadExt, sync::mpsc}; -use tracing::{debug, instrument}; +use eyre::OptionExt; +use isomdl::{ + definitions::{ + BleOptions, DeviceEngagement, + helpers::{ByteStr, NonEmptyMap, Tag24}, + session::Handover, + x509::trust_anchor::{PemTrustAnchor, TrustAnchorRegistry}, + }, + presentation::{authentication::ResponseAuthenticationOutcome, reader::SessionManager}, +}; +use postcard::accumulator::{CobsAccumulator, FeedResult}; +use serde::{Deserialize, Serialize}; +use tokio::{ + io::{AsyncReadExt, AsyncWriteExt}, + sync::{Mutex, mpsc}, + task::JoinHandle, +}; +use tokio_serial::{SerialPort, SerialPortBuilderExt, SerialStream}; +use tokio_util::sync::CancellationToken; +use tracing::{debug, trace, warn}; use crate::decoder::{Decoder, DecoderOutcome, DecoderType}; #[derive(Clone, Default, Debug, Deserialize)] pub struct MdlConfig { pub input_name: Option, - pub timeout: Option, + pub path: String, + pub baud: u32, #[serde(default)] pub extract_portraits: bool, pub request_elements: Option>>, pub certificates_path: Option, - pub nfc_connstring: Option, } impl MdlConfig { @@ -36,24 +53,328 @@ impl MdlConfig { } } -#[instrument(skip_all)] -pub async fn create_mdl_verifier(config: MdlConfig) -> eyre::Result { - let certs = load_certs(config.certificates_path).await?; - let requested_elements = config - .request_elements - .unwrap_or_else(MdlConfig::default_elements); +pub struct EspMdl { + requested_elements: NonEmptyMap>, + trust_anchor_registry: TrustAnchorRegistry, - let mut verifier = - mdl_verifier::MdlVerifier::new(certs, requested_elements, config.timeout.unwrap_or(120))?; + token: CancellationToken, + serial: Mutex, - if let Some(connstring) = config.nfc_connstring { - verifier.add_nfc_stream(connstring)?; + active_session: Mutex>, +} + +#[allow(dead_code)] +#[derive(Debug, Serialize)] +pub enum HostRequest { + Ping, + Ack, + StartBluetoothPeripheral { + service_uuid: [u8; 16], + ble_ident: [u8; 16], + payload: Vec, + }, + StartBluetoothCentral { + service_uuid: [u8; 16], + payload: Vec, + }, +} + +#[allow(dead_code)] +#[derive(Debug, Deserialize)] +pub enum DeviceResponse { + Ack, + NfcEngagementStarted { + uid: [u8; 4], + }, + NfcEngagementFailed { + uid: [u8; 4], + }, + NfcEngagementData { + uid: [u8; 4], + use_central: bool, + service_uuid: [u8; 16], + device_engagement: Vec, + handover_select: Vec, + handover_request: Option>, + }, + BleEngagementFailed { + service_uuid: [u8; 16], + }, + BleEngagementData { + service_uuid: [u8; 16], + payload: Vec, + complete: bool, + }, +} + +impl EspMdl { + pub async fn new(config: MdlConfig, token: CancellationToken) -> eyre::Result { + let certs = load_certs(config.certificates_path).await?; + let trust_anchor_registry = TrustAnchorRegistry::from_pem_certificates(certs) + .map_err(|err| eyre::eyre!("could not build trust registry: {err}"))?; + + let requested_elements = config + .request_elements + .unwrap_or_else(MdlConfig::default_elements); + let requested_elements = non_empty_requested_elements(requested_elements) + .ok_or_eyre("unable to use provided requested elements")?; + + let serial = tokio_serial::new(config.path, config.baud).open_native_async()?; + serial.clear(tokio_serial::ClearBuffer::All)?; + + Ok(Self { + requested_elements, + trust_anchor_registry, + token, + serial: Mutex::new(serial), + active_session: Mutex::new(None), + }) } - Ok(verifier) + pub fn create_input_task( + self: Arc, + tx: mpsc::Sender, + ) -> JoinHandle> { + tokio::task::spawn(async move { + let mut buf = [0u8; 4096]; + let mut cobs_buf: CobsAccumulator<4096> = CobsAccumulator::new(); + + let mut current_service_uuid: Option<[u8; 16]> = None; + let mut payload_chunks = Vec::new(); + + loop { + if self.token.is_cancelled() { + return Ok(()); + } + + let mut serial = self.serial.lock().await; + + while let Ok(Some(Ok(len))) = tokio::time::timeout( + Duration::from_millis(25), + self.token.run_until_cancelled(serial.read(&mut buf)), + ) + .await + { + if len == 0 { + break; + } + + let data = &buf[..len]; + trace!("got new data: {}", hex::encode(data)); + let mut window = data; + + 'cobs: while !window.is_empty() { + window = match cobs_buf.feed::(window) { + FeedResult::Consumed => break 'cobs, + FeedResult::OverFull(new_window) => { + warn!("overfull"); + new_window + } + FeedResult::DeserError(new_window) => { + warn!("deserialization issue"); + new_window + } + FeedResult::Success { data, remaining } => { + trace!("got device response: {data:?}"); + + match data { + DeviceResponse::Ack => { + warn!("got unexpected ack"); + } + DeviceResponse::NfcEngagementStarted { uid } => { + debug!("starting engagement with tag {}", hex::encode(uid)); + self.send_request(HostRequest::Ack, &mut serial).await?; + } + DeviceResponse::NfcEngagementFailed { uid } => { + debug!("engagement with tag failed {}", hex::encode(uid)); + self.send_request(HostRequest::Ack, &mut serial).await?; + } + DeviceResponse::NfcEngagementData { + use_central, + service_uuid, + device_engagement, + handover_select, + handover_request, + .. + } => { + let Ok(device_engagement) = + Tag24::::from_bytes( + device_engagement, + ) + else { + warn!("data was not device engagement"); + window = remaining; + continue; + }; + + self.send_request(HostRequest::Ack, &mut serial).await?; + + self.start_bluetooth_locked( + &mut serial, + device_engagement, + Handover::NFC( + ByteStr::from(handover_select), + handover_request.map(ByteStr::from), + ), + service_uuid, + !use_central, + ) + .await?; + } + DeviceResponse::BleEngagementFailed { mut service_uuid } => { + service_uuid.reverse(); + warn!( + "engagement with service failed {}", + uuid::Uuid::from_bytes(service_uuid) + ); + self.send_request(HostRequest::Ack, &mut serial).await?; + } + DeviceResponse::BleEngagementData { + service_uuid, + payload, + complete, + } => { + if current_service_uuid.is_some() + && current_service_uuid != Some(service_uuid) + { + warn!("service uuid changed!"); + payload_chunks.clear(); + } + + current_service_uuid = Some(service_uuid); + payload_chunks.extend_from_slice(&payload); + + self.send_request(HostRequest::Ack, &mut serial).await?; + + if complete { + if let Some((session_service_uuid, mut reader_sm)) = + self.active_session.lock().await.take() + { + if service_uuid != session_service_uuid { + warn!("service uuid changed from session!"); + } else { + let outcome = + reader_sm.handle_response(&payload_chunks); + tx.send(outcome).await?; + } + } + + current_service_uuid = None; + payload_chunks.clear(); + } + } + } + remaining + } + } + } + } + } + }) + } + + fn get_connection( + device_engagement_bytes: &Tag24, + ) -> Option<(bool, [u8; 16])> { + device_engagement_bytes + .clone() + .into_inner() + .device_retrieval_methods + .into_iter() + .flat_map(|methods| methods.into_inner()) + .filter_map(|method| match method { + isomdl::definitions::DeviceRetrievalMethod::BLE(ble) => Some(ble), + _ => None, + }) + .find_map(|ble| match ble { + BleOptions { + peripheral_server_mode: Some(peripheral_server_mode), + .. + } => Some((true, peripheral_server_mode.uuid.into_bytes())), + BleOptions { + central_client_mode: Some(central_client_mode), + .. + } => Some((false, central_client_mode.uuid.into_bytes())), + _ => None, + }) + } + + pub async fn start_bluetooth( + &self, + device_engagement_bytes: Tag24, + handover: Handover, + service_uuid: [u8; 16], + server: bool, + ) -> eyre::Result<()> { + let mut serial = self.serial.lock().await; + self.start_bluetooth_locked( + &mut serial, + device_engagement_bytes, + handover, + service_uuid, + server, + ) + .await + } + + async fn start_bluetooth_locked( + &self, + serial: &mut SerialStream, + device_engagement_bytes: Tag24, + handover: Handover, + mut service_uuid: [u8; 16], + server: bool, + ) -> eyre::Result<()> { + service_uuid.reverse(); + + let (reader_sm, session_request, ble_ident) = + SessionManager::establish_session_with_handover( + device_engagement_bytes, + self.requested_elements.clone(), + self.trust_anchor_registry.clone(), + handover, + ) + .map_err(|err| eyre::eyre!("failed to establish session: {err}"))?; + + let request = if server { + HostRequest::StartBluetoothCentral { + service_uuid, + payload: session_request, + } + } else { + HostRequest::StartBluetoothPeripheral { + service_uuid, + ble_ident, + payload: session_request, + } + }; + + *self.active_session.lock().await = Some((service_uuid, reader_sm)); + self.send_request(request, serial).await?; + + Ok(()) + } + + async fn send_request( + &self, + request: HostRequest, + serial: &mut SerialStream, + ) -> eyre::Result<()> { + let data = postcard::to_allocvec_cobs(&request)?; + trace!("sending request to esp: {}", hex::encode(&data)); + + for chunk in data.chunks(128) { + trace!("sending chunk: {}", hex::encode(chunk)); + serial.write_all(chunk).await?; + } + serial.flush().await?; + trace!("finished sending data to esp"); + + Ok(()) + } } -async fn load_certs(path: Option) -> eyre::Result> { +async fn load_certs(path: Option) -> eyre::Result> { let mut entries = tokio::fs::read_dir(path.unwrap_or_else(|| PathBuf::from("mdl-certificates"))).await?; @@ -67,19 +388,35 @@ async fn load_certs(path: Option) -> eyre::Result> { let mut file = tokio::fs::File::open(file.path()).await?; let mut data = String::new(); file.read_to_string(&mut data).await?; - certs.push(data); + certs.push(PemTrustAnchor { + purpose: isomdl::definitions::x509::trust_anchor::TrustPurpose::Iaca, + certificate_pem: data, + }); } Ok(certs) } +fn non_empty_requested_elements( + requested_elements: HashMap>, +) -> Option>> { + NonEmptyMap::maybe_new( + requested_elements + .into_iter() + .filter_map(|(namespace, elements)| { + NonEmptyMap::maybe_new(elements.into_iter().collect()).map(|map| (namespace, map)) + }) + .collect(), + ) +} + pub struct MdlDecoder { - qr_sender: mpsc::Sender, + esp_mdl: Arc, } impl MdlDecoder { - pub async fn new(qr_sender: mpsc::Sender) -> Self { - Self { qr_sender } + pub async fn new(esp_mdl: Arc) -> Self { + Self { esp_mdl } } } @@ -94,7 +431,22 @@ impl Decoder for MdlDecoder { return Ok(DecoderOutcome::Skipped); } - self.qr_sender.send(data.to_string()).await?; + trace!("got mdoc data: {data}"); + + let Ok(device_engagement_bytes) = Tag24::::from_qr_code_uri(data) else { + warn!("looked like mdoc url but could not be decoded"); + return Ok(DecoderOutcome::Skipped); + }; + + let Some((server, service_uuid)) = EspMdl::get_connection(&device_engagement_bytes) else { + warn!("no supported connection methods"); + return Ok(DecoderOutcome::Skipped); + }; + + self.esp_mdl + .start_bluetooth(device_engagement_bytes, Handover::QR, service_uuid, server) + .await?; + Ok(DecoderOutcome::Consumed) } } diff --git a/src/decoder/mod.rs b/src/decoder/mod.rs index 2118966..f1286fb 100644 --- a/src/decoder/mod.rs +++ b/src/decoder/mod.rs @@ -1,9 +1,11 @@ -use std::collections::{HashMap, HashSet}; +use std::{ + collections::{HashMap, HashSet}, + sync::Arc, +}; use async_trait::async_trait; use isomdl::presentation::authentication::ResponseAuthenticationOutcome; use serde::{Deserialize, Serialize}; -use tokio::sync::mpsc; use tracing::warn; pub mod mdl; @@ -120,7 +122,10 @@ pub struct DecoderManager { } impl DecoderManager { - pub async fn new(config: DecoderConfig, qr_sender: mpsc::Sender) -> eyre::Result { + pub async fn new( + config: DecoderConfig, + esp_mdl: Option>, + ) -> eyre::Result { let enabled_decoders = config.enabled_decoders.unwrap_or_else(|| { [DecoderType::Aamva, DecoderType::Url, DecoderType::Generic] .into_iter() @@ -134,8 +139,8 @@ impl DecoderManager { decoders.push(Box::new(AamvaDecoder)); } - if enabled_decoders.contains(&DecoderType::Mdl) { - decoders.push(Box::new(mdl::MdlDecoder::new(qr_sender).await)); + if let Some(esp_mdl) = esp_mdl { + decoders.push(Box::new(mdl::MdlDecoder::new(esp_mdl).await)); } if enabled_decoders.contains(&DecoderType::Shc) { diff --git a/src/input.rs b/src/input.rs index a67d6c2..099a0c9 100644 --- a/src/input.rs +++ b/src/input.rs @@ -5,7 +5,6 @@ use serde::Deserialize; use tap::Tap; use tokio::{io::AsyncReadExt, select, sync::mpsc, task::JoinHandle, time::interval}; use tokio_serial::{SerialPortBuilderExt, SerialStream}; -use tokio_stream::wrappers::ReceiverStream; use tokio_util::sync::CancellationToken; use tracing::{Instrument, debug, error, info, instrument, trace}; @@ -99,22 +98,11 @@ pub async fn create_stream( token: CancellationToken, tasks: &mut super::RunningTasks, decoders: Arc, - qr_rx: mpsc::Receiver, + esp_mdl: Option>, ) -> eyre::Result, decoder::DecodedDataContext)>> { let (data_tx, data_rx) = mpsc::channel(1); - if config - .decoder - .enabled_decoders - .as_ref() - .map(|decoders| decoders.contains(&decoder::DecoderType::Mdl)) - .unwrap_or_default() - { - let mut mdl_verifier = - decoder::mdl::create_mdl_verifier(config.decoder.mdl.clone()).await?; - - mdl_verifier.add_qr_stream(ReceiverStream::new(qr_rx)); - + if let Some(esp_mdl) = esp_mdl { let mdl_input_name = config .decoder .mdl @@ -122,34 +110,33 @@ pub async fn create_stream( .clone() .unwrap_or_else(|| "mdl".to_string()); - let mut rx = mdl_verifier.start(token.clone()).await?; + let (mdl_tx, mut mdl_rx) = mpsc::channel(1); + let mdl_task = esp_mdl.create_input_task(mdl_tx); + tasks.push(("mdl".to_string(), mdl_task)); + let data_tx_clone = data_tx.clone(); - let mdl_task = tokio::spawn(async move { - while let Some(event) = rx.recv().await { - match event { - mdl_verifier::VerifierEvent::AuthenticationOutcome(outcome) => { - if let Err(err) = data_tx_clone - .send(( - None, - decoder::DecodedDataContext { - input_name: mdl_input_name.clone(), - decoder_type: decoder::DecoderType::Mdl, - data: decoder::DecodedData::Mdl(outcome), - }, - )) - .await - { - error!("could not send verifier event: {err}"); - break; - } - } - other => trace!("got other mdl verifier event: {other:?}"), + + let mdl_process_task = tokio::spawn(async move { + while let Some(outcome) = mdl_rx.recv().await { + if let Err(err) = data_tx_clone + .send(( + None, + decoder::DecodedDataContext { + input_name: mdl_input_name.clone(), + decoder_type: decoder::DecoderType::Mdl, + data: decoder::DecodedData::Mdl(outcome), + }, + )) + .await + { + error!("could not send verifier event: {err}"); + break; } } Ok(()) }); - tasks.push(("mdl".to_string(), mdl_task)); + tasks.push(("mdl-process".to_string(), mdl_process_task)); } let mut input_rx = create_inputs(config.inputs, tasks, token.clone()).await?; diff --git a/src/main.rs b/src/main.rs index 0e3c4a7..74cfca5 100644 --- a/src/main.rs +++ b/src/main.rs @@ -67,10 +67,24 @@ async fn main() -> eyre::Result<()> { .await?; } - let (qr_tx, qr_rx) = mpsc::channel(1); let (action_tx, action_rx) = mpsc::channel(1); - let decoders = Arc::new(decoder::DecoderManager::new(config.decoder.clone(), qr_tx).await?); + let esp_mdl = if config + .decoder + .enabled_decoders + .as_ref() + .map(|decoders| decoders.contains(&decoder::DecoderType::Mdl)) + .unwrap_or_default() + { + Some(Arc::new( + decoder::mdl::EspMdl::new(config.decoder.mdl.clone(), token.clone()).await?, + )) + } else { + None + }; + + let decoders = + Arc::new(decoder::DecoderManager::new(config.decoder.clone(), esp_mdl.clone()).await?); let transform_manager = transform::TransformManager::new( config.transform.clone(), config.decoder.mdl.extract_portraits, @@ -89,7 +103,7 @@ async fn main() -> eyre::Result<()> { .await?; let input_stream = - input::create_stream(config, token.clone(), &mut tasks, decoders.clone(), qr_rx).await?; + input::create_stream(config, token.clone(), &mut tasks, decoders.clone(), esp_mdl).await?; tasks.push(( "input-stream".to_string(), tokio::spawn(process_input_stream(