Project import generated by Copybara. GitOrigin-RevId: f70580d4e9be3db690b9b6bdfb8e253a496b0ecd Change-Id: I88739121e946b84d3268a4fb62731070c76b309d
diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..d8f642c --- /dev/null +++ b/.dockerignore
@@ -0,0 +1,14 @@ +** + +!nearby/.cargo +!nearby/connections/ +!nearby/crypto/ +!nearby/presence/ +nearby/presence/cmake-build +!nearby/scripts/ +!nearby/src/ +!nearby/Cargo.lock +!nearby/Cargo.toml +!nearby/deny.toml +!nearby/rustfmt.toml +!third_party
diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..caccb04 --- /dev/null +++ b/.gitmodules
@@ -0,0 +1,3 @@ +[submodule "third_party/abseil-cpp"] + path = third_party/abseil-cpp + url = https://github.com/abseil/abseil-cpp.git
diff --git a/nearby/Dockerfile b/Dockerfile similarity index 94% rename from nearby/Dockerfile rename to Dockerfile index cd60ac8..00dffc7 100644 --- a/nearby/Dockerfile +++ b/Dockerfile
@@ -34,25 +34,23 @@ # Must use 0.64.0, as version >= 0.65.0 removes the option "--size_t-is-usize", an option # used by boringssl when generating rust bindings RUN cargo install bindgen-cli --version 0.64.0 +RUN cargo install wasm-pack --color never 2>&1 RUN rustup toolchain add nightly # boringssl build wants go RUN curl -L https://go.dev/dl/go1.20.2.linux-amd64.tar.gz | tar -C /usr/local -xz ENV PATH="$PATH:/usr/local/go/bin" -# when the image runs build and test everything to ensure env is setup correctly -CMD ["cargo", "run", "--", "check-everything"] - # needed for boringssl git operations RUN git config --global user.email "docker@example.com" RUN git config --global user.name "NP Docker" -RUN mkdir -p /google/nearby +RUN mkdir -p /google +COPY . /google + WORKDIR /google/nearby # prefetch dependencies so later build steps don't re-download on source changes -COPY Cargo.toml Cargo.lock ./ RUN cargo prefetch --lockfile Cargo.lock -# copy repo into workdir of docker containter -COPY . . - +# when the image runs build and test everything to ensure env is setup correctly +CMD ["cargo", "run", "--", "check-everything"]
diff --git a/nearby/.dockerignore b/nearby/.dockerignore deleted file mode 100644 index 8bd0a19..0000000 --- a/nearby/.dockerignore +++ /dev/null
@@ -1,17 +0,0 @@ -/.idea -/.git -/target -/.dockerignore -/.gitignore - -/presence/_deps -/presence/ldt_np_adv_ffi/target -/presence/*/fuzz/target -/presence/*/fuzz/corpus -/presence/cmake-build -/connections/ukey2/*/fuzz/target -/connections/ukey2/*/fuzz/corpus -/crypto/crypto_provider_boringssl/target - -**/CMakeCache.txt -**/CMakeFiles
diff --git a/nearby/Cargo.lock b/nearby/Cargo.lock index 63c63ac..76582bf 100644 --- a/nearby/Cargo.lock +++ b/nearby/Cargo.lock
@@ -3,10 +3,13 @@ version = 3 [[package]] -name = "Inflector" -version = "0.11.4" +name = "addr2line" +version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe438c63458706e03479442743baae6c88256498e6431708f6dfc520a26515d3" +checksum = "f4fa78e18c64fce05e902adecd7a5eed15a5e0a3439f7b0e169f0252214865e3" +dependencies = [ + "gimli", +] [[package]] name = "adler" @@ -27,9 +30,9 @@ [[package]] name = "aes" -version = "0.8.2" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "433cfd6710c9986c576a25ca913c39d66a6474107b406f34f91d4a8923395241" +checksum = "ac1f845298e95f983ff1944b728ae08b8cebab80d684f0a832ed0fc74dfa27e2" dependencies = [ "cfg-if", "cipher", @@ -52,19 +55,21 @@ ] [[package]] -name = "aho-corasick" -version = "0.7.20" +name = "ahash" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc936419f96fa211c1b9166887b38e5e40b19958e5b895be7c1f93adec7071ac" +checksum = "2c99f64d1e06488f620f932677e24bc6e2897582980441ae90a671415bd7ec2f" dependencies = [ - "memchr", + "cfg-if", + "once_cell", + "version_check", ] [[package]] name = "aho-corasick" -version = "1.0.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67fc08ce920c31afb70f013dcce1bfc3a3195de6a228474e45e1f145b36f8d04" +checksum = "43f6cb1bf222025340178f382c426f13757b2960e89779dfcb319c32542a5a41" dependencies = [ "memchr", ] @@ -76,6 +81,12 @@ checksum = "250f629c0161ad8107cf89319e990051fae62832fd343083bea452d93e2205fd" [[package]] +name = "allocator-api2" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0942ffc6dcaadf03badf6e6a2d0228460359d5e34b57ccdc720b7382dfbd5ec5" + +[[package]] name = "android-tzdata" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -113,15 +124,15 @@ [[package]] name = "anstyle" -version = "1.0.0" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41ed9a86bf92ae6580e0a31281f65a1b1d867c0cc68d5346e2ae128dddfa6a7d" +checksum = "3a30da5c5f2d5e72842e00bcb57657162cdabef0931f40e2deb9b4140440cecd" [[package]] name = "anstyle-parse" -version = "0.2.0" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e765fd216e48e067936442276d1d57399e37bce53c264d6fefbe298080cb57ee" +checksum = "938874ff5980b03a87c5524b3ae5b59cf99b1d6bc836848df7bc5ada9643c333" dependencies = [ "utf8parse", ] @@ -147,9 +158,9 @@ [[package]] name = "anyhow" -version = "1.0.71" +version = "1.0.72" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c7d0618f0e0b7e8ff11427422b64564d5fb0be1940354bfe2e0529b18a9d9b8" +checksum = "3b13c32d80ecc7ab747b80c3784bce54ee8a7a0cc4fbda9bf4cda2cf6fe90854" [[package]] name = "array_ref" @@ -177,6 +188,21 @@ checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" [[package]] +name = "backtrace" +version = "0.3.68" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4319208da049c43661739c5fade2ba182f09d1dc2299b32298d3a31692b17e12" +dependencies = [ + "addr2line", + "cc", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", +] + +[[package]] name = "base16ct" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -190,9 +216,9 @@ [[package]] name = "base64" -version = "0.21.0" +version = "0.21.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4a4ddaa51a5bc52a6948f74c06d20aaaddb71924eab79b8c97a8c556e942d6a" +checksum = "604178f6c5c21f02dc555784810edfb88d34ac2c73b2eae109655649ee73ce3d" [[package]] name = "base64ct" @@ -207,6 +233,12 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] +name = "bitflags" +version = "2.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "630be753d4e58660abd17930c71b647fe46c27ea6b63cc59e1e3851406972e42" + +[[package]] name = "blake2" version = "0.10.6" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -245,9 +277,9 @@ [[package]] name = "bstr" -version = "1.5.0" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a246e68bb43f6cd9db24bea052a53e40405417c5fb372e3d1a8a7f770a564ef5" +checksum = "6798148dccfbff0fae41c7574d2fa8f1ef3492fba0face179de5d8d447d67b05" dependencies = [ "memchr", "serde", @@ -258,9 +290,9 @@ version = "0.1.0" dependencies = [ "anyhow", - "base64 0.21.0", + "base64 0.21.2", "chrono", - "clap 4.2.7", + "clap 4.3.19", "crossbeam", "env_logger", "globset", @@ -273,13 +305,14 @@ "thiserror", "tinytemplate", "walkdir", + "which", ] [[package]] name = "bumpalo" -version = "3.12.2" +version = "3.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c6ed94e98ecff0c12dd1b04c15ec0d7d9458ca8fe806cea6f12954efe74c63b" +checksum = "a3e2c3daef883ecc1b5d58c15adae93470a91d425f3532ba1695849656af3fc1" [[package]] name = "byteorder" @@ -381,7 +414,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ea181bf566f71cb9a5d17a59e1871af638180a18fb0035c92ae62b705207123" dependencies = [ - "bitflags", + "bitflags 1.3.2", "clap_lex 0.2.4", "indexmap", "textwrap", @@ -389,9 +422,9 @@ [[package]] name = "clap" -version = "4.2.7" +version = "4.3.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34d21f9bf1b425d2968943631ec91202fe5e837264063503708b83013f8fc938" +checksum = "5fd304a20bff958a57f04c4e96a2e7594cc4490a0e809cbd48bb6437edaa452d" dependencies = [ "clap_builder", "clap_derive", @@ -400,27 +433,26 @@ [[package]] name = "clap_builder" -version = "4.2.7" +version = "4.3.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "914c8c79fb560f238ef6429439a30023c862f7a28e688c58f7203f12b29970bd" +checksum = "01c6a3f08f1fe5662a35cfe393aec09c4df95f60ee93b7556505260f75eee9e1" dependencies = [ "anstream", "anstyle", - "bitflags", - "clap_lex 0.4.1", + "clap_lex 0.5.0", "strsim", ] [[package]] name = "clap_derive" -version = "4.2.0" +version = "4.3.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9644cd56d6b87dbe899ef8b053e331c0637664e9e21a33dfcdc36093f5c5c4" +checksum = "54a9bb5758fc5dfe728d1019941681eccaf0cf8a4189b692a0ee2f2ecf90a050" dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.15", + "syn 2.0.28", ] [[package]] @@ -434,9 +466,9 @@ [[package]] name = "clap_lex" -version = "0.4.1" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a2dd5a6fe8c6e3502f568a6353e5273bbb15193ad9a89e457b9970798efbea1" +checksum = "2da6da31387c7e4ef160ffab6d5e7f00c42626fe39aea70a7b0f1773f7dd6c1b" [[package]] name = "colorchoice" @@ -456,9 +488,9 @@ [[package]] name = "const-oid" -version = "0.9.2" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "520fbf3c07483f94e3e3ca9d0cfd913d7718ef2483d2cfd91c0d9e91474ab913" +checksum = "795bc6e66a8e340f075fcf6227e417a2dc976b92b91f3cdc778bb858778b6747" [[package]] name = "core-foundation-sys" @@ -468,9 +500,9 @@ [[package]] name = "cpufeatures" -version = "0.2.7" +version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e4c1eaa2012c47becbbad2ab175484c2a84d1185b566fb2cc5b8707343dfe58" +checksum = "a17b76ff3a4162b0b27f354a0c87015ddad39d35f9c0c36607a3bdd175dde1f1" dependencies = [ "libc", ] @@ -557,9 +589,9 @@ [[package]] name = "crossbeam-epoch" -version = "0.9.14" +version = "0.9.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46bd5f3f85273295a9d14aedfb86f6aadbff6d8f5295c4a9edb08e819dcf5695" +checksum = "ae211234986c545741a7dc064309f67ee1e5ad243d0e48335adc0484d960bcc7" dependencies = [ "autocfg", "cfg-if", @@ -580,9 +612,9 @@ [[package]] name = "crossbeam-utils" -version = "0.8.15" +version = "0.8.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c063cd8cc95f5c377ed0d4b49a4b21f632396ff690e8470c29b3359b346984b" +checksum = "5a22b2d63d4d1dc0b7f1b6b2747dd0088008a9be28b6ddf0b1e7d335e3037294" dependencies = [ "cfg-if", ] @@ -653,7 +685,7 @@ "hex-literal", "openssl", "ouroboros", - "rstest", + "rstest 0.17.0", ] [[package]] @@ -699,7 +731,7 @@ "hex-literal", "rand", "rand_ext", - "rstest", + "rstest 0.17.0", "rstest_reuse", "test_helper", "wycheproof", @@ -716,24 +748,37 @@ [[package]] name = "curve25519-dalek" -version = "4.0.0-rc.2" +version = "4.0.0-rc.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03d928d978dbec61a1167414f5ec534f24bea0d7a0d24dd9b6233d3d8223e585" +checksum = "436ace70fc06e06f7f689d2624dc4e2f0ea666efb5aa704215f7249ae6e047a7" dependencies = [ "cfg-if", + "cpufeatures", + "curve25519-dalek-derive", "digest", "fiat-crypto", - "packed_simd_2", "platforms", + "rustc_version", "subtle", "zeroize", ] [[package]] -name = "der" -version = "0.7.5" +name = "curve25519-dalek-derive" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05e58dffcdcc8ee7b22f0c1f71a69243d7c2d9ad87b5a14361f2424a1565c219" +checksum = "83fdaf97f4804dcebfa5862639bc9ce4121e82140bec2a987ac5140294865b5b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.28", +] + +[[package]] +name = "der" +version = "0.7.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c7ed52955ce76b1554f509074bb357d3fb8ac9b51288a65a3fd480d1dfba946" dependencies = [ "const-oid", "zeroize", @@ -758,9 +803,9 @@ [[package]] name = "digest" -version = "0.10.6" +version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8168378f4e5023e7218c89c891c0fd8ecdb5e5e4f18cb78f38cf245dd021e76f" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ "block-buffer", "crypto-common", @@ -779,9 +824,9 @@ [[package]] name = "ed25519-dalek" -version = "2.0.0-rc.2" +version = "2.0.0-rc.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "798f704d128510932661a3489b08e3f4c934a01d61c5def59ae7b8e48f19665a" +checksum = "faa8e9049d5d72bfc12acbc05914731b5322f79b5e2f195e9f2d705fca22ab4c" dependencies = [ "curve25519-dalek", "ed25519", @@ -793,15 +838,15 @@ [[package]] name = "either" -version = "1.8.1" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fcaabb2fef8c910e7f4c7ce9f67a1283a1715879a7c230ca9d6d1ae31f16d91" +checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" [[package]] name = "elliptic-curve" -version = "0.13.4" +version = "0.13.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75c71eaa367f2e5d556414a8eea812bc62985c879748d6403edabd9cb03f16e7" +checksum = "968405c8fdc9b3bf4df0a6638858cc0b52462836ab6b1c87377785dd09cf1c0b" dependencies = [ "base16ct", "crypto-bigint", @@ -840,9 +885,9 @@ [[package]] name = "errno" -version = "0.3.1" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4bcfec3a70f97c962c307b2d2c56e358cf1d00b558d74262b5f929ee8cc7e73a" +checksum = "6b30f669a7961ef1631673d2766cc92f52d64f7ef354d4fe0ddfd30ed52f0f4f" dependencies = [ "errno-dragonfly", "libc", @@ -861,12 +906,9 @@ [[package]] name = "fastrand" -version = "1.9.0" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be" -dependencies = [ - "instant", -] +checksum = "6999dc1837253364c2ebb0704ba97994bd874e8f195d665c50b7548f6ea92764" [[package]] name = "ff" @@ -980,7 +1022,7 @@ dependencies = [ "proc-macro2", "quote", - "syn 2.0.15", + "syn 2.0.28", ] [[package]] @@ -1032,9 +1074,9 @@ [[package]] name = "getrandom" -version = "0.2.9" +version = "0.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c85e1d9ab2eadba7e5040d4e09cbd6d072b76a557ad64e797c2cb9d4da21d7e4" +checksum = "be4136b2a15dd319360be1c07d9933517ccf0be8f16bf62a3bee4f0d618df427" dependencies = [ "cfg-if", "libc", @@ -1042,12 +1084,18 @@ ] [[package]] -name = "globset" -version = "0.4.10" +name = "gimli" +version = "0.27.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "029d74589adefde59de1a0c4f4732695c32805624aec7b68d91503d4dba79afc" +checksum = "b6c80984affa11d98d1b88b66ac8853f143217b399d3c74116778ff8fdb4ed2e" + +[[package]] +name = "globset" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aca8bbd8e0707c1887a8bbb7e6b40e228f251ff5d62c8220a4a7a53c73aff006" dependencies = [ - "aho-corasick 0.7.20", + "aho-corasick", "bstr", "fnv", "log", @@ -1067,9 +1115,9 @@ [[package]] name = "h2" -version = "0.3.19" +version = "0.3.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d357c7ae988e7d2182f7d7871d0b963962420b0678b0997ce7de72001aeab782" +checksum = "97ec8491ebaf99c8eaa73058b045fe58073cd6be7f596ac993ced0b0a0c01049" dependencies = [ "bytes", "fnv", @@ -1091,12 +1139,34 @@ checksum = "eabb4a44450da02c90444cf74558da904edde8fb4e9035a9a6a4e15445af0bd7" [[package]] +name = "handle_map" +version = "0.1.0" +dependencies = [ + "criterion", + "crypto_provider", + "hashbrown 0.14.0", + "lock_api", + "portable-atomic", + "spin 0.9.8", +] + +[[package]] name = "hashbrown" version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" [[package]] +name = "hashbrown" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c6201b9ff9fd90a5a3bac2e56a830d0caa509576f0e503818ee82c181b3437a" +dependencies = [ + "ahash", + "allocator-api2", +] + +[[package]] name = "hdrhistogram" version = "7.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -1127,18 +1197,9 @@ [[package]] name = "hermit-abi" -version = "0.2.6" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee512640fe35acbfb4bb779db6f0d80704c2cacfa2e39b601ef3e3f47d1ae4c7" -dependencies = [ - "libc", -] - -[[package]] -name = "hermit-abi" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fed44880c466736ef9a5c5b5facefb5ed0785676d0c02d612db14e54f0d84286" +checksum = "443144c8cdadd93ebf52ddb4056d257f5b52c04d3c804e657d19eb73fc33668b" [[package]] name = "hex" @@ -1148,9 +1209,9 @@ [[package]] name = "hex-literal" -version = "0.3.4" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ebdb29d2ea9ed0083cd8cece49bbd968021bd99b0849edb4a9a7ee0fdf6a4e0" +checksum = "6fe2267d4ed49bc07b63801559be28c718ea06c4738b7a03c94df7386d2cde46" [[package]] name = "hkdf" @@ -1212,9 +1273,9 @@ [[package]] name = "hyper" -version = "0.14.26" +version = "0.14.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab302d72a6f11a3b910431ff93aae7e773078c769f0a3ef15fb9ec692ed147d4" +checksum = "ffb1cfd654a8219eaef89881fdb3bb3b1cdc5fa75ded05d6933b2b382e395468" dependencies = [ "bytes", "futures-channel", @@ -1236,10 +1297,11 @@ [[package]] name = "hyper-rustls" -version = "0.24.0" +version = "0.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0646026eb1b3eea4cd9ba47912ea5ce9cc07713d105b1a14698f4e6433d348b7" +checksum = "8d78e1e73ec14cf7375674f74d7dde185c8206fd9dea6fb6295e8a98098aaa97" dependencies = [ + "futures-util", "http", "hyper", "rustls", @@ -1287,10 +1349,16 @@ checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" dependencies = [ "autocfg", - "hashbrown", + "hashbrown 0.12.3", ] [[package]] +name = "init_with" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0175f63815ce00183bf755155ad0cb48c65226c5d17a724e369c25418d2b7699" + +[[package]] name = "inout" version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -1301,39 +1369,18 @@ ] [[package]] -name = "instant" -version = "0.1.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "io-lifetimes" -version = "1.0.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c66c74d2ae7e79a5a8f7ac924adbe38ee42a859c6539ad869eb51f0b52dc220" -dependencies = [ - "hermit-abi 0.3.1", - "libc", - "windows-sys 0.48.0", -] - -[[package]] name = "ipnet" -version = "2.7.2" +version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12b6ee2129af8d4fb011108c73d99a1b83a85977f23b82460c0ae2e25bb4b57f" +checksum = "28b29a3cd74f0f4598934efe3aeba42bae0eb4680554128851ebbecb02af14e6" [[package]] name = "is-terminal" -version = "0.4.7" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adcf93614601c8129ddf72e2d5633df827ba6551541c6d8c59520a371475be1f" +checksum = "cb0889898416213fab133e1d33a0e5858a48177452750691bde3666d0fdbaf8b" dependencies = [ - "hermit-abi 0.3.1", - "io-lifetimes", + "hermit-abi 0.3.2", "rustix", "windows-sys 0.48.0", ] @@ -1349,9 +1396,9 @@ [[package]] name = "itoa" -version = "1.0.6" +version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "453ad9f582a441959e5f0d088b02ce04cfe8d51a8eaf077f12ac6d3e94164ca6" +checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" [[package]] name = "jni" @@ -1377,9 +1424,9 @@ [[package]] name = "js-sys" -version = "0.3.62" +version = "0.3.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68c16e1bfd491478ab155fd8b4896b86f9ede344949b641e61501e07c2b8b4d5" +checksum = "c5f195fe497f702db0f318b07fdd68edb16955aed830df8363d837542f8f935a" dependencies = [ "wasm-bindgen", ] @@ -1399,9 +1446,9 @@ dependencies = [ "aes", "anyhow", - "base64 0.21.0", + "base64 0.21.2", "blake2", - "clap 4.2.7", + "clap 4.3.19", "criterion", "crypto_provider", "crypto_provider_default", @@ -1426,7 +1473,7 @@ dependencies = [ "anyhow", "array_view", - "base64 0.21.0", + "base64 0.21.2", "criterion", "crypto_provider", "crypto_provider_default", @@ -1466,21 +1513,15 @@ [[package]] name = "libc" -version = "0.2.144" +version = "0.2.147" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b00cc1c228a6782d0f076e7b232802e0c5689d41bb5df366f2a6b6621cfdfe1" - -[[package]] -name = "libm" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fc7aa29613bd6a620df431842069224d8bc9011086b1db4c0e0cd47fa03ec9a" +checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3" [[package]] name = "linux-raw-sys" -version = "0.3.7" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ece97ea872ece730aed82664c424eb4c8291e1ff2480247ccf7409044bc6479f" +checksum = "09fc20d2ca12cb9f044c93e3bd6d32d523e6e2ec3db4f7b2939cd99026ecd3f0" [[package]] name = "lock_adapter" @@ -1491,9 +1532,9 @@ [[package]] name = "lock_api" -version = "0.4.9" +version = "0.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "435011366fe56583b16cf956f9df0095b405b82d76425bc8981c0e22e60ec4df" +checksum = "c1cc9717a20b1bb222f333e6a92fd32f7d8a18ddc5a3191a11af45dcbf4dcd16" dependencies = [ "autocfg", "scopeguard", @@ -1501,12 +1542,9 @@ [[package]] name = "log" -version = "0.4.17" +version = "0.4.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" -dependencies = [ - "cfg-if", -] +checksum = "b06a4cde4c0f271a446782e3eff8de789548ce57dbc8eca9292c27f4a42004b4" [[package]] name = "memchr" @@ -1516,9 +1554,9 @@ [[package]] name = "memoffset" -version = "0.8.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d61c719bcfbcf5d62b3a09efa6088de8c54bc0bfcd3ea7ae39fcc186108b8de1" +checksum = "5a634b1c61a95585bd15607c6ab0c4e5b226e695ff2800ba0cdccddf208c406c" dependencies = [ "autocfg", ] @@ -1566,6 +1604,56 @@ ] [[package]] +name = "np_adv" +version = "0.1.0" +dependencies = [ + "anyhow", + "array_view", + "criterion", + "crypto_provider", + "crypto_provider_default", + "hex", + "init_with", + "lazy_static", + "ldt", + "ldt_np_adv", + "nom", + "np_ed25519", + "np_hkdf", + "rand", + "rand_ext", + "serde_json", + "sink", + "strum", + "strum_macros", + "test_helper", + "tinyvec", + "xts_aes", +] + +[[package]] +name = "np_ed25519" +version = "0.1.0" +dependencies = [ + "array_view", + "crypto_provider", + "sink", + "tinyvec", +] + +[[package]] +name = "np_ffi_core" +version = "0.1.0" +dependencies = [ + "array_view", + "crypto_provider", + "crypto_provider_default", + "handle_map", + "np_adv", + "spin 0.9.8", +] + +[[package]] name = "np_hkdf" version = "0.1.0" dependencies = [ @@ -1605,28 +1693,37 @@ [[package]] name = "num-traits" -version = "0.2.15" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" +checksum = "f30b0abd723be7e2ffca1272140fac1a2f084c77ec3e123c192b66af1ee9e6c2" dependencies = [ "autocfg", ] [[package]] name = "num_cpus" -version = "1.15.0" +version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fac9e2da13b5eb447a6ce3d392f23a29d8694bff781bf03a16cd9ac8697593b" +checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" dependencies = [ - "hermit-abi 0.2.6", + "hermit-abi 0.3.2", "libc", ] [[package]] -name = "once_cell" -version = "1.17.1" +name = "object" +version = "0.31.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7e5500299e16ebb147ae15a00a942af264cf3688f47923b8fc2cd5858f23ad3" +checksum = "8bda667d9f2b5051b8833f59f3bf748b28ef54f850f4fcb389a252aa383866d1" +dependencies = [ + "memchr", +] + +[[package]] +name = "once_cell" +version = "1.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" [[package]] name = "oorandom" @@ -1642,11 +1739,11 @@ [[package]] name = "openssl" -version = "0.10.52" +version = "0.10.55" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01b8574602df80f7b85fdfc5392fa884a4e3b3f4f35402c070ab34c3d3f78d56" +checksum = "345df152bc43501c5eb9e4654ff05f794effb78d4efe3d53abc158baddc0703d" dependencies = [ - "bitflags", + "bitflags 1.3.2", "cfg-if", "foreign-types", "libc", @@ -1663,14 +1760,14 @@ dependencies = [ "proc-macro2", "quote", - "syn 2.0.15", + "syn 2.0.28", ] [[package]] name = "openssl-sys" -version = "0.9.87" +version = "0.9.90" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e17f59264b2809d77ae94f0e1ebabc434773f370d6ca667bd223ea10e06cc7e" +checksum = "374533b0e45f3a7ced10fcaeccca020e66656bc03dac384f852e4e5a7a8104a6" dependencies = [ "bssl-sys", "cc", @@ -1681,31 +1778,32 @@ [[package]] name = "os_str_bytes" -version = "6.5.0" +version = "6.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ceedf44fb00f2d1984b0bc98102627ce622e083e49a5bacdb3e514fa4238e267" +checksum = "4d5d9eb14b174ee9aa2ef96dc2b94637a2d4b6e7cb873c7e171f0c20c6cf3eac" [[package]] name = "ouroboros" -version = "0.15.6" +version = "0.17.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1358bd1558bd2a083fed428ffeda486fbfb323e698cdda7794259d592ca72db" +checksum = "e2ba07320d39dfea882faa70554b4bd342a5f273ed59ba7c1c6b4c840492c954" dependencies = [ "aliasable", "ouroboros_macro", + "static_assertions", ] [[package]] name = "ouroboros_macro" -version = "0.15.6" +version = "0.17.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f7d21ccd03305a674437ee1248f3ab5d4b1db095cf1caf49f1713ddf61956b7" +checksum = "ec4c6225c69b4ca778c0aea097321a64c421cf4577b331c61b229267edabb6f8" dependencies = [ - "Inflector", + "heck", "proc-macro-error", "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.28", ] [[package]] @@ -1725,16 +1823,6 @@ ] [[package]] -name = "packed_simd_2" -version = "0.3.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1914cd452d8fccd6f9db48147b29fd4ae05bea9dc5d9ad578509f72415de282" -dependencies = [ - "cfg-if", - "libm", -] - -[[package]] name = "percent-encoding" version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -1742,9 +1830,9 @@ [[package]] name = "pin-project-lite" -version = "0.2.9" +version = "0.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116" +checksum = "4c40d25201921e5ff0c862a505c6557ea88568a4e3ace775ab55e93f2f4f9d57" [[package]] name = "pin-utils" @@ -1776,9 +1864,9 @@ [[package]] name = "plotters" -version = "0.3.4" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2538b639e642295546c50fcd545198c9d64ee2a38620a628724a3b266d5fbf97" +checksum = "d2c224ba00d7cadd4d5c660deaf2098e5e80e07846537c51f9cfa4be50c1fd45" dependencies = [ "num-traits", "plotters-backend", @@ -1789,24 +1877,24 @@ [[package]] name = "plotters-backend" -version = "0.3.4" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "193228616381fecdc1224c62e96946dfbc73ff4384fba576e052ff8c1bea8142" +checksum = "9e76628b4d3a7581389a35d5b6e2139607ad7c75b17aed325f210aa91f4a9609" [[package]] name = "plotters-svg" -version = "0.3.3" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9a81d2759aae1dae668f783c308bc5c8ebd191ff4184aaa1b37f65a6ae5a56f" +checksum = "38f6d39893cca0701371e3c27294f09797214b86f1fb951b89ade8ec04e2abab" dependencies = [ "plotters-backend", ] [[package]] name = "polyval" -version = "0.6.0" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ef234e08c11dfcb2e56f79fd70f6f2eb7f025c0ce2333e82f4f0518ecad30c6" +checksum = "d52cff9d1d4dee5fe6d03729099f4a310a41179e0a10dbf542039873f2e826fb" dependencies = [ "cfg-if", "cpufeatures", @@ -1815,6 +1903,12 @@ ] [[package]] +name = "portable-atomic" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f32154ba0af3a075eefa1eda8bb414ee928f62303a54ea85b8d6638ff1a6ee9e" + +[[package]] name = "ppv-lite86" version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -1822,9 +1916,9 @@ [[package]] name = "primeorder" -version = "0.13.1" +version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf8d3875361e28f7753baefef104386e7aa47642c93023356d97fdef4003bfb5" +checksum = "3c2fcef82c0ec6eefcc179b978446c399b3cdf73c392c35604e399eee6df1ee3" dependencies = [ "elliptic-curve", ] @@ -1855,9 +1949,9 @@ [[package]] name = "proc-macro2" -version = "1.0.56" +version = "1.0.66" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b63bdb0cd06f1f4dedf69b254734f9b45af66e4a031e42a7480257d9898b435" +checksum = "18fb31db3f9bddb2ea821cde30a9f70117e3f119938b5ee630b7403aa6e2ead9" dependencies = [ "unicode-ident", ] @@ -1915,9 +2009,9 @@ [[package]] name = "quote" -version = "1.0.27" +version = "1.0.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f4f29d145265ec1c483c7c654450edde0bfe043d3938d6972630663356d9500" +checksum = "50f3b39ccfb720540debaa0164757101c08ecb8d326b15358ce76a62c7e85965" dependencies = [ "proc-macro2", ] @@ -2013,25 +2107,37 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" dependencies = [ - "bitflags", + "bitflags 1.3.2", ] [[package]] name = "regex" -version = "1.8.1" +version = "1.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af83e617f331cc6ae2da5443c602dfa5af81e517212d9d611a5b3ba1777b5370" +checksum = "b2eae68fc220f7cf2532e4494aded17545fce192d59cd996e0fe7887f4ceb575" dependencies = [ - "aho-corasick 1.0.1", + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7b6d6190b7594385f61bd3911cd1be99dfddcfc365a4160cc2ab5bff4aed294" +dependencies = [ + "aho-corasick", "memchr", "regex-syntax", ] [[package]] name = "regex-syntax" -version = "0.7.1" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5996294f19bd3aae0453a862ad728f60e6600695733dd5df01da90c54363a3c" +checksum = "e5ea92a5b6195c6ef2a0295ea818b312502c6fc94dde986c5553242e18fd4ce2" [[package]] name = "reqwest" @@ -2039,7 +2145,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cde824a14b7c14f85caff81225f411faacc04a2013f41670f41443742b1c1c55" dependencies = [ - "base64 0.21.0", + "base64 0.21.2", "bytes", "encoding_rs", "futures-core", @@ -2095,7 +2201,17 @@ dependencies = [ "futures", "futures-timer", - "rstest_macros", + "rstest_macros 0.16.0", + "rustc_version", +] + +[[package]] +name = "rstest" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de1bb486a691878cd320c2f0d319ba91eeaa2e894066d8b5f8f117c000e9d962" +dependencies = [ + "rstest_macros 0.17.0", "rustc_version", ] @@ -2114,6 +2230,20 @@ ] [[package]] +name = "rstest_macros" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "290ca1a1c8ca7edb7c3283bd44dc35dd54fdec6253a3912e201ba1072018fca8" +dependencies = [ + "cfg-if", + "proc-macro2", + "quote", + "rustc_version", + "syn 1.0.109", + "unicode-ident", +] + +[[package]] name = "rstest_reuse" version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -2126,6 +2256,12 @@ ] [[package]] +name = "rustc-demangle" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" + +[[package]] name = "rustc_version" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -2136,13 +2272,12 @@ [[package]] name = "rustix" -version = "0.37.19" +version = "0.38.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acf8729d8542766f1b2cf77eb034d52f40d375bb8b615d0b147089946e16613d" +checksum = "0a962918ea88d644592894bc6dc55acc6c0956488adcebbfb6e273506b7fd6e5" dependencies = [ - "bitflags", + "bitflags 2.3.3", "errno", - "io-lifetimes", "libc", "linux-raw-sys", "windows-sys 0.48.0", @@ -2150,9 +2285,9 @@ [[package]] name = "rustls" -version = "0.21.2" +version = "0.21.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e32ca28af694bc1bbf399c33a516dbdf1c90090b8ab23c2bc24f834aa2247f5f" +checksum = "79ea77c539259495ce8ca47f53e66ae0330a8819f67e23ac96ca02f50e7b7d36" dependencies = [ "log", "ring", @@ -2162,28 +2297,34 @@ [[package]] name = "rustls-pemfile" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d194b56d58803a43635bdc398cd17e383d6f71f9182b9a192c127ca42494a59b" +checksum = "2d3987094b1d07b653b7dfdc3f70ce9a1da9c51ac18c1b06b662e4f9a0e9f4b2" dependencies = [ - "base64 0.21.0", + "base64 0.21.2", ] [[package]] name = "rustls-webpki" -version = "0.100.1" +version = "0.101.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6207cd5ed3d8dca7816f8f3725513a34609c0c765bf652b8c3cb4cfd87db46b" +checksum = "513722fd73ad80a71f72b61009ea1b584bcfa1483ca93949c8f290298837fa59" dependencies = [ "ring", "untrusted", ] [[package]] -name = "ryu" -version = "1.0.13" +name = "rustversion" +version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f91339c0467de62360649f8d3e185ca8de4224ff281f66000de5eb2a77a79041" +checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4" + +[[package]] +name = "ryu" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741" [[package]] name = "same-file" @@ -2196,9 +2337,9 @@ [[package]] name = "scopeguard" -version = "1.1.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] name = "sct" @@ -2212,9 +2353,9 @@ [[package]] name = "sec1" -version = "0.7.2" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0aec48e813d6b90b15f0b8948af3c63483992dee44c03e9930b3eebdabe046e" +checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" dependencies = [ "base16ct", "der", @@ -2225,35 +2366,35 @@ [[package]] name = "semver" -version = "1.0.17" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bebd363326d05ec3e2f532ab7660680f3b02130d780c299bca73469d521bc0ed" +checksum = "b0293b4b29daaf487284529cc2f5675b8e57c61f70167ba415a463651fd6a918" [[package]] name = "serde" -version = "1.0.162" +version = "1.0.179" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71b2f6e1ab5c2b98c05f0f35b236b22e8df7ead6ffbf51d7808da7f8817e7ab6" +checksum = "0a5bf42b8d227d4abf38a1ddb08602e229108a517cd4e5bb28f9c7eaafdce5c0" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.162" +version = "1.0.179" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2a0814352fd64b58489904a44ea8d90cb1a91dcb6b4f5ebabc32c8318e93cb6" +checksum = "741e124f5485c7e60c03b043f79f320bff3527f4bbf12cf3831750dc46a0ec2c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.15", + "syn 2.0.28", ] [[package]] name = "serde_json" -version = "1.0.96" +version = "1.0.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "057d394a50403bcac12672b2b18fb387ab6d289d957dab67dd201875391e52f1" +checksum = "076066c5f1078eac5b722a31827a8832fe108bed65dfa75e233c89f8206e976c" dependencies = [ "itoa", "ryu", @@ -2274,9 +2415,9 @@ [[package]] name = "sha2" -version = "0.10.6" +version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82e6b795fe2e3b1e845bafcb27aa35405c4d47cdfc92af5fc8d3002f76cebdc0" +checksum = "479fb9d862239e610720565ca91403019f2f00410f1864c5aa7479b950a76ed8" dependencies = [ "cfg-if", "cpufeatures", @@ -2296,6 +2437,13 @@ checksum = "5e1788eed21689f9cf370582dfc467ef36ed9c707f073528ddafa8d83e3b8500" [[package]] +name = "sink" +version = "0.1.0" +dependencies = [ + "tinyvec", +] + +[[package]] name = "slab" version = "0.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -2340,16 +2488,41 @@ ] [[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + +[[package]] name = "strsim" version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" [[package]] -name = "subtle" -version = "2.4.1" +name = "strum" +version = "0.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" +checksum = "063e6045c0e62079840579a7e47a355ae92f60eb74daaf156fb1e84ba164e63f" + +[[package]] +name = "strum_macros" +version = "0.24.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e385be0d24f186b4ce2f9982191e7101bb737312ad61c1f2f984f34bcf85d59" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "rustversion", + "syn 1.0.109", +] + +[[package]] +name = "subtle" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" [[package]] name = "syn" @@ -2364,9 +2537,9 @@ [[package]] name = "syn" -version = "2.0.15" +version = "2.0.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a34fcf3e8b60f57e6a14301a2e916d323af98b0ea63c599441eec8558660c822" +checksum = "04361975b3f5e348b2189d8dc55bc942f278b2d482a6a0365de5bdd62d351567" dependencies = [ "proc-macro2", "quote", @@ -2375,15 +2548,15 @@ [[package]] name = "tempfile" -version = "3.5.0" +version = "3.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9fbec84f381d5795b08656e4912bec604d162bff9291d6189a78f4c8ab87998" +checksum = "5486094ee78b2e5038a6382ed7645bc084dc2ec433426ca4c3cb61e2007b8998" dependencies = [ "cfg-if", "fastrand", "redox_syscall", "rustix", - "windows-sys 0.45.0", + "windows-sys 0.48.0", ] [[package]] @@ -2411,22 +2584,22 @@ [[package]] name = "thiserror" -version = "1.0.40" +version = "1.0.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "978c9a314bd8dc99be594bc3c175faaa9794be04a5a5e153caba6915336cebac" +checksum = "611040a08a0439f8248d1990b111c95baa9c704c805fa1f62104b39655fd7f90" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.40" +version = "1.0.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9456a42c5b0d803c8cd86e73dd7cc9edd429499f37a3550d286d5e86720569f" +checksum = "090198534930841fab3a5d1bb637cde49e339654e606195f8d9c76eeb081dc96" dependencies = [ "proc-macro2", "quote", - "syn 2.0.15", + "syn 2.0.28", ] [[package]] @@ -2456,11 +2629,12 @@ [[package]] name = "tokio" -version = "1.28.2" +version = "1.29.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94d7b1cfd2aa4011f2de74c2c4c63665e27a71006b0a192dcd2710272e73dfa2" +checksum = "532826ff75199d5833b9d2c5fe410f29235e25704ee5f0ef599fb51c21f4a4da" dependencies = [ "autocfg", + "backtrace", "bytes", "libc", "mio", @@ -2559,7 +2733,7 @@ "crypto_provider_rustcrypto", "nom", "rand", - "rstest", + "rstest 0.16.0", "ukey2_proto", "ukey2_rs", ] @@ -2601,7 +2775,7 @@ "log", "num-bigint", "rand", - "rstest", + "rstest 0.16.0", "sha2", "ukey2_proto", ] @@ -2610,7 +2784,7 @@ name = "ukey2_shell" version = "0.1.0" dependencies = [ - "clap 4.2.7", + "clap 4.3.19", "crypto_provider_rustcrypto", "ukey2_connections", "ukey2_rs", @@ -2624,9 +2798,9 @@ [[package]] name = "unicode-ident" -version = "1.0.8" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5464a87b239f13a63a501f2701565754bae92d243d4bb7eb12f6d57d2269bf4" +checksum = "301abaae475aa91687eb82514b328ab47a211a533026cb25fc3e519b86adfc3c" [[package]] name = "unicode-normalization" @@ -2639,9 +2813,9 @@ [[package]] name = "universal-hash" -version = "0.5.0" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d3160b73c9a19f7e2939a2fdad446c57c1bbbbf4d919d3213ff1267a580d8b5" +checksum = "fc1de2c688dc15305988b563c3854064043356019f97a4b46276fe734c4f07ea" dependencies = [ "crypto-common", "subtle", @@ -2709,9 +2883,9 @@ [[package]] name = "wasm-bindgen" -version = "0.2.85" +version = "0.2.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b6cb788c4e39112fbe1822277ef6fb3c55cd86b95cb3d3c4c1c9597e4ac74b4" +checksum = "7706a72ab36d8cb1f80ffbf0e071533974a60d0a308d01a5d0375bf60499a342" dependencies = [ "cfg-if", "wasm-bindgen-macro", @@ -2719,24 +2893,24 @@ [[package]] name = "wasm-bindgen-backend" -version = "0.2.85" +version = "0.2.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35e522ed4105a9d626d885b35d62501b30d9666283a5c8be12c14a8bdafe7822" +checksum = "5ef2b6d3c510e9625e5fe6f509ab07d66a760f0885d858736483c32ed7809abd" dependencies = [ "bumpalo", "log", "once_cell", "proc-macro2", "quote", - "syn 2.0.15", + "syn 2.0.28", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.35" +version = "0.4.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "083abe15c5d88556b77bdf7aef403625be9e327ad37c62c4e4129af740168163" +checksum = "c02dbc21516f9f1f04f187958890d7e6026df8d16540b7ad9492bc34a67cea03" dependencies = [ "cfg-if", "js-sys", @@ -2746,9 +2920,9 @@ [[package]] name = "wasm-bindgen-macro" -version = "0.2.85" +version = "0.2.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "358a79a0cb89d21db8120cbfb91392335913e4890665b1a7981d9e956903b434" +checksum = "dee495e55982a3bd48105a7b947fd2a9b4a8ae3010041b9e0faab3f9cd028f1d" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -2756,28 +2930,28 @@ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.85" +version = "0.2.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4783ce29f09b9d93134d41297aded3a712b7b979e9c6f28c32cb88c973a94869" +checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.15", + "syn 2.0.28", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.85" +version = "0.2.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a901d592cafaa4d711bc324edfaff879ac700b19c3dfd60058d2b445be2691eb" +checksum = "ca6ad05a4870b2bf5fe995117d3728437bd27d7cd5f06f13c17443ef369775a1" [[package]] name = "web-sys" -version = "0.3.62" +version = "0.3.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16b5f940c7edfdc6d12126d98c9ef4d1b3d470011c47c76a6581df47ad9ba721" +checksum = "9b85cbef8c220a6abc02aefd892dfc0fc23afb1c6a426316ec33253a3877249b" dependencies = [ "js-sys", "wasm-bindgen", @@ -2850,7 +3024,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e686886bc078bc1b0b600cac0147aadb815089b6e4da64016cbd754b6342700f" dependencies = [ - "windows-targets 0.48.0", + "windows-targets 0.48.1", ] [[package]] @@ -2868,7 +3042,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" dependencies = [ - "windows-targets 0.48.0", + "windows-targets 0.48.1", ] [[package]] @@ -2888,9 +3062,9 @@ [[package]] name = "windows-targets" -version = "0.48.0" +version = "0.48.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b1eb6f0cd7c80c79759c929114ef071b87354ce476d9d94271031c0497adfd5" +checksum = "05d4b17490f70499f20b9e791dcf6a299785ce8af4d709018206dc5b4953e95f" dependencies = [ "windows_aarch64_gnullvm 0.48.0", "windows_aarch64_msvc 0.48.0", @@ -3008,9 +3182,9 @@ [[package]] name = "x25519-dalek" -version = "2.0.0-rc.2" +version = "2.0.0-rc.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fabd6e16dd08033932fc3265ad4510cc2eab24656058a6dcb107ffe274abcc95" +checksum = "ec7fae07da688e17059d5886712c933bb0520f15eff2e09cfa18e30968f4e63a" dependencies = [ "curve25519-dalek", "rand_core 0.6.4", @@ -3033,7 +3207,7 @@ "aes", "anyhow", "array_ref", - "base64 0.21.0", + "base64 0.21.2", "crypto_provider", "crypto_provider_default", "hex",
diff --git a/nearby/Cargo.toml b/nearby/Cargo.toml index fe44353..361628a 100644 --- a/nearby/Cargo.toml +++ b/nearby/Cargo.toml
@@ -12,34 +12,46 @@ "crypto/crypto_provider_openssl", "crypto/crypto_provider_rustcrypto", "crypto/crypto_provider_stubs", + "crypto/crypto_provider_test", "crypto/crypto_provider_default", "crypto/rand_core_05_adapter", "presence/array_view", + "presence/handle_map", "presence/ldt", "presence/ldt_np_adv", "presence/ldt_np_jni", "presence/ldt_tbc", + "presence/np_adv", + "presence/np_ed25519", + "presence/np_ffi_core", "presence/np_hkdf", "presence/rand_ext", + "presence/sink", "presence/test_helper", "presence/xts_aes", ] # TODO: remove ldt_np_adv_ffi once support for no_std + alloc no longer requires nightly # TODO: remove boringssl once we figure out a better plan for integrating the build system -exclude = ["presence/ldt_np_adv_ffi", "crypto/crypto_provider_boringssl"] +# TODO: remove np_c_ffi once cbindgen no longer requires nightly +exclude = [ + "presence/ldt_np_adv_ffi", + "crypto/crypto_provider_boringssl", + "presence/np_c_ffi", +] [workspace.dependencies] # local crates array_ref = { path = "presence/array_ref" } array_view = { path = "presence/array_view" } crypto_provider = { path = "crypto/crypto_provider" } -crypto_provider_default = {path = "crypto/crypto_provider_default", default-features=false} +crypto_provider_default = { path = "crypto/crypto_provider_default", default-features = false } crypto_provider_openssl = { path = "crypto/crypto_provider_openssl" } crypto_provider_rustcrypto = { path = "crypto/crypto_provider_rustcrypto" } crypto_provider_stubs = { path = "crypto/crypto_provider_stubs" } crypto_provider_test = { path = "crypto/crypto_provider_test" } lock_adapter = { path = "connections/ukey2/lock_adapter" } +handle_map = { path = "presence/handle_map" } rand_core_05_adapter = { path = "crypto/rand_core_05_adapter" } rand_ext = { path = "presence/rand_ext" } test_helper = { path = "presence/test_helper" } @@ -49,51 +61,65 @@ ldt = { path = "presence/ldt" } ldt_np_adv = { path = "presence/ldt_np_adv" } ldt_tbc = { path = "presence/ldt_tbc" } +np_adv = { path = "presence/np_adv" } +np_ed25519 = { path = "presence/np_ed25519" } +np_ffi_core = { path = "presence/np_ffi_core" } +sink = { path = "presence/sink" } # from crates.io rand = { version = "0.8.5", default-features = false } rand_core = "0.6.4" rand_pcg = "0.3.1" -sha2 = { version = "0.10.2", default-features = false } +sha2 = { version = "0.10.6", default-features = false } aes = "0.8.2" cbc = { version = "0.1.2", features = ["alloc", "block-padding"] } ctr = "0.9.1" +hashbrown = "0.14.0" hkdf = "0.12.3" hmac = "0.12.1" -ed25519-dalek = { version = "2.0.0-rc.2", default-features = false } +ed25519-dalek = { version = "2.0.0-rc.3", default-features = false } ed25519 = "2.2.0" aes-gcm = "0.10.1" hex = "0.4.3" -serde_json = { version = "1.0.91", features = ["alloc"], default-features = false } +serde_json = { version = "1.0.96", features = [ + "alloc", +], default-features = false } base64 = "0.21.0" -x25519-dalek = { version = "2.0.0-rc.2", default-features = false } -subtle = { version = "2.4.1", default-features = false } +x25519-dalek = { version = "2.0.0-rc.3", default-features = false } +subtle = { version = "2.5.0", default-features = false } rand_chacha = { version = "0.3.1", default-features = false } -p256 = { version = "0.13.0", default-features = false } -sec1 = "0.7.1" +p256 = { version = "0.13.2", default-features = false } +sec1 = "0.7.2" +portable-atomic = "1.3.2" protobuf = "3.2.0" protobuf-codegen = "3.2.0" jni = "0.21.1" -spin = "0.9.8" +lock_api = "0.4.9" +spin = { version = "0.9.8", features = ["once", "lock_api", "rwlock"] } anyhow = "1.0.64" log = "0.4.17" env_logger = "0.10.0" criterion = { version = "0.4.0", features = ["html_reports"] } clap = { version = "4.0.25", features = ["derive"] } lazy_static = { version = "1.4.0", features = ["spin_no_std"] } -hex-literal = "0.3.4" +hex-literal = "0.4.1" openssl = "0.10.48" cfg-if = "1.0.0" blake2 = "0.10.4" hdrhistogram = "7.5.0" regex = "1.7.0" +tokio = { version = "1.20.3", features = ["full"] } xts-mode = "0.5.1" -rstest = "0.16.0" +rstest = { version = "0.17.0", default-features = false } rstest_reuse = "0.5.0" wycheproof = "0.4.0" chrono = { version = "0.4.24", default-features = false, features = ["clock"] } tempfile = "3.5.0" thiserror = "1.0.40" +tinyvec = {version = "1.6.0", features = ["rustc_1_55"]} +mlua = "0.8.8" +strum = "0.24.1" +strum_macros = "0.24.2" [workspace.package] version = "0.1.0" @@ -109,6 +135,16 @@ # fat vs thin: thin compiles a lot faster, and doesn't seem any slower. lto = "thin" +# build profile optimized for size +[profile.release-min-size] +inherits = "release" +panic = "abort" +codegen-units = 1 +lto = true +# z optimizes for size +opt-level = "z" +strip = true + [package] name = "build-scripts" version.workspace = true @@ -120,7 +156,10 @@ anyhow.workspace = true shell-escape = "0.1.5" owo-colors = "3.5.0" -reqwest = { version = "0.11.17", default-features = false, features = ["blocking", "rustls-tls"] } +reqwest = { version = "0.11.17", default-features = false, features = [ + "blocking", + "rustls-tls", +] } semver = "1.0.17" base64.workspace = true walkdir = "2.3.3" @@ -131,7 +170,7 @@ thiserror.workspace = true log.workspace = true env_logger.workspace = true +which = "4.4.0" [dev-dependencies] tempfile.workspace = true -
diff --git a/nearby/README.md b/nearby/README.md index 85387a0..86db67d 100644 --- a/nearby/README.md +++ b/nearby/README.md
@@ -35,7 +35,7 @@ First install Docker then build and run the image: ``` -sudo docker build -t nearby_rust:v1.0 . +sudo docker build -t nearby_rust:v1.0 .. sudo docker run --rm -it nearby_rust:v1.0 ```
diff --git a/nearby/connections/ukey2/ukey2_c_ffi/cpp/CMakeLists.txt b/nearby/connections/ukey2/ukey2_c_ffi/cpp/CMakeLists.txt index 3c6f0db..c1247eb 100644 --- a/nearby/connections/ukey2/ukey2_c_ffi/cpp/CMakeLists.txt +++ b/nearby/connections/ukey2/ukey2_c_ffi/cpp/CMakeLists.txt
@@ -29,14 +29,19 @@ BINARY_DIR "${CMAKE_SOURCE_DIR}/ukey2_c_ffi" INSTALL_COMMAND "") -# GoogleTest requires at least C++14 -set(CMAKE_CXX_STANDARD 14) -add_compile_options(-Wall -Werror -Wextra -Wimplicit-fallthrough -Wextra-semi - -Wno-missing-field-initializers -Wno-unused-parameter -Wno-psabi - -Wno-unneeded-internal-declaration - -Wno-ignored-pragma-optimize - -Wno-bitfield-constant-conversion -Wno-deprecated-this-capture -Wshadow - -Wsign-compare) +# required for designated initializers on MSVC +set(CMAKE_CXX_STANDARD 20) + +if(UNIX) + add_compile_options(-Wall -Werror -Wextra -Wimplicit-fallthrough -Wextra-semi + -Wno-missing-field-initializers -Wno-unused-parameter -Wno-psabi + -Wno-unneeded-internal-declaration + -Wno-ignored-pragma-optimize + -Wno-bitfield-constant-conversion -Wno-deprecated-this-capture -Wshadow + -Wsign-compare) +elseif(MSVC) + add_compile_options(-W4 -MD) +endif() include(FetchContent) FetchContent_Declare( @@ -52,10 +57,29 @@ ukey2_ffi.h ukey2_bindings.h) -target_link_libraries(ffi_test - "${CMAKE_SOURCE_DIR}/../../../../target/release/libukey2_c_ffi${CMAKE_SHARED_LIBRARY_SUFFIX}" - GTest::gtest_main - dl pthread) +set(ukey2_c_ffi_FILENAME "${CMAKE_SHARED_LIBRARY_PREFIX}ukey2_c_ffi${CMAKE_SHARED_LIBRARY_SUFFIX}") + +if(UNIX) + target_link_libraries( + ffi_test + "${CMAKE_SOURCE_DIR}/../../../../target/release/${ukey2_c_ffi_FILENAME}" + GTest::gtest_main + dl pthread + ) +elseif(MSVC) + # MSVC requires linking to a static lib, which rust kindly generates + target_link_libraries( + ffi_test + "${CMAKE_SOURCE_DIR}/../../../../target/release/${ukey2_c_ffi_FILENAME}${CMAKE_STATIC_LIBRARY_SUFFIX}" + GTest::gtest_main + ) + # MSVC requires that the dynamic lib be visible to the binary, and copying to the binary dir is an easy way to do that + get_target_property(ffi_test_BINARY_DIR ffi_test BINARY_DIR) + add_custom_command( + TARGET ffi_test POST_BUILD + COMMAND "${CMAKE_COMMAND}" -E copy "${CMAKE_SOURCE_DIR}/../../../../target/release/${ukey2_c_ffi_FILENAME}" "${ffi_test_BINARY_DIR}/." + ) +endif() include(GoogleTest) gtest_discover_tests(ffi_test)
diff --git a/nearby/connections/ukey2/ukey2_connections/fuzz/Cargo.lock b/nearby/connections/ukey2/ukey2_connections/fuzz/Cargo.lock index 2e61f80..4a00416 100644 --- a/nearby/connections/ukey2/ukey2_connections/fuzz/Cargo.lock +++ b/nearby/connections/ukey2/ukey2_connections/fuzz/Cargo.lock
@@ -4,9 +4,9 @@ [[package]] name = "aead" -version = "0.5.1" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c192eb8f11fc081b0fe4259ba5af04217d4e0faddd02417310a927911abd7c8" +checksum = "d122413f284cf2d62fb1b7db97e02edb8cda96d769b16e443a4f6195e35662b0" dependencies = [ "bytes", "crypto-common", @@ -15,9 +15,9 @@ [[package]] name = "aes" -version = "0.8.2" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "433cfd6710c9986c576a25ca913c39d66a6474107b406f34f91d4a8923395241" +checksum = "ac1f845298e95f983ff1944b728ae08b8cebab80d684f0a832ed0fc74dfa27e2" dependencies = [ "cfg-if", "cipher", @@ -41,9 +41,9 @@ [[package]] name = "aho-corasick" -version = "0.7.20" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc936419f96fa211c1b9166887b38e5e40b19958e5b895be7c1f93adec7071ac" +checksum = "43f6cb1bf222025340178f382c426f13757b2960e89779dfcb319c32542a5a41" dependencies = [ "memchr", ] @@ -56,9 +56,9 @@ [[package]] name = "anyhow" -version = "1.0.70" +version = "1.0.72" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7de8ce5e0f9f8d88245311066a578d72b7af3e7088f32783804676302df237e4" +checksum = "3b13c32d80ecc7ab747b80c3784bce54ee8a7a0cc4fbda9bf4cda2cf6fe90854" [[package]] name = "arbitrary" @@ -109,18 +109,18 @@ [[package]] name = "block-padding" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a90ec2df9600c28a01c56c4784c9207a96d2451833aeceb8cc97e4c9548bb78" +checksum = "a8894febbff9f758034a5b8e12d87918f56dfc64a8e1fe757d65e29041538d93" dependencies = [ "generic-array", ] [[package]] name = "bumpalo" -version = "3.12.1" +version = "3.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b1ce199063694f33ffb7dd4e0ee620741495c32833cde5aa08f02a0bf96f0c8" +checksum = "a3e2c3daef883ecc1b5d58c15adae93470a91d425f3532ba1695849656af3fc1" [[package]] name = "bytes" @@ -160,9 +160,9 @@ [[package]] name = "ciborium" -version = "0.2.0" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0c137568cc60b904a7724001b35ce2630fd00d5d84805fbb608ab89509d788f" +checksum = "effd91f6c78e5a4ace8a5d3c0b6bfaec9e2baaef55f3efc00e45fb2e477ee926" dependencies = [ "ciborium-io", "ciborium-ll", @@ -171,15 +171,15 @@ [[package]] name = "ciborium-io" -version = "0.2.0" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "346de753af073cc87b52b2083a506b38ac176a44cfb05497b622e27be899b369" +checksum = "cdf919175532b369853f5d5e20b26b43112613fd6fe7aee757e35f7a44642656" [[package]] name = "ciborium-ll" -version = "0.2.0" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "213030a2b5a4e0c0892b6652260cf6ccac84827b83a85a534e178e3906c4cf1b" +checksum = "defaa24ecc093c77630e6c15e17c51f5e187bf35ee514f4e2d67baaa96dae22b" dependencies = [ "ciborium-io", "half", @@ -197,9 +197,9 @@ [[package]] name = "clap" -version = "3.2.24" +version = "3.2.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eef2b3ded6a26dfaec672a742c93c8cf6b689220324da509ec5caa20de55dc83" +checksum = "4ea181bf566f71cb9a5d17a59e1871af638180a18fb0035c92ae62b705207123" dependencies = [ "bitflags", "clap_lex", @@ -218,15 +218,15 @@ [[package]] name = "const-oid" -version = "0.9.2" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "520fbf3c07483f94e3e3ca9d0cfd913d7718ef2483d2cfd91c0d9e91474ab913" +checksum = "795bc6e66a8e340f075fcf6227e417a2dc976b92b91f3cdc778bb858778b6747" [[package]] name = "cpufeatures" -version = "0.2.5" +version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28d997bd5e24a5928dd43e46dc529867e207907fe0b239c3477d924f7f2ca320" +checksum = "a17b76ff3a4162b0b27f354a0c87015ddad39d35f9c0c36607a3bdd175dde1f1" dependencies = [ "libc", ] @@ -290,9 +290,9 @@ [[package]] name = "crossbeam-epoch" -version = "0.9.14" +version = "0.9.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46bd5f3f85273295a9d14aedfb86f6aadbff6d8f5295c4a9edb08e819dcf5695" +checksum = "ae211234986c545741a7dc064309f67ee1e5ad243d0e48335adc0484d960bcc7" dependencies = [ "autocfg", "cfg-if", @@ -303,18 +303,18 @@ [[package]] name = "crossbeam-utils" -version = "0.8.15" +version = "0.8.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c063cd8cc95f5c377ed0d4b49a4b21f632396ff690e8470c29b3359b346984b" +checksum = "5a22b2d63d4d1dc0b7f1b6b2747dd0088008a9be28b6ddf0b1e7d335e3037294" dependencies = [ "cfg-if", ] [[package]] name = "crypto-bigint" -version = "0.5.1" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c2538c4e68e52548bacb3e83ac549f903d44f011ac9d5abb5e132e67d0808f7" +checksum = "cf4c2f4e1afd912bc40bfd6fed5d9dc1f288e0ba01bfcc835cc5bc3eb13efe15" dependencies = [ "generic-array", "rand_core", @@ -372,23 +372,36 @@ [[package]] name = "curve25519-dalek" -version = "4.0.0-rc.2" +version = "4.0.0-rc.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03d928d978dbec61a1167414f5ec534f24bea0d7a0d24dd9b6233d3d8223e585" +checksum = "436ace70fc06e06f7f689d2624dc4e2f0ea666efb5aa704215f7249ae6e047a7" dependencies = [ "cfg-if", + "cpufeatures", + "curve25519-dalek-derive", "digest", "fiat-crypto", - "packed_simd_2", "platforms", + "rustc_version", "subtle", ] [[package]] -name = "der" -version = "0.7.1" +name = "curve25519-dalek-derive" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc906908ea6458456e5eaa160a9c08543ec3d1e6f71e2235cedd660cb65f9df0" +checksum = "83fdaf97f4804dcebfa5862639bc9ce4121e82140bec2a987ac5140294865b5b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.26", +] + +[[package]] +name = "der" +version = "0.7.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c7ed52955ce76b1554f509074bb357d3fb8ac9b51288a65a3fd480d1dfba946" dependencies = [ "const-oid", "zeroize", @@ -396,9 +409,9 @@ [[package]] name = "derive-getters" -version = "0.2.0" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c5905670fd9c320154f3a4a01c9e609733cd7b753f3c58777ab7d5ce26686b3" +checksum = "0122f262bf9c9a367829da84f808d9fb128c10ef283bbe7b0922a77cf07b2747" dependencies = [ "proc-macro2", "quote", @@ -407,20 +420,20 @@ [[package]] name = "derive_arbitrary" -version = "1.3.0" +version = "1.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3cdeb9ec472d588e539a818b2dee436825730da08ad0017c4b1a17676bdc8b7" +checksum = "53e0efad4403bfc52dc201159c4b842a246a14b98c64b55dfd0f2d89729dfeb8" dependencies = [ "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.26", ] [[package]] name = "digest" -version = "0.10.6" +version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8168378f4e5023e7218c89c891c0fd8ecdb5e5e4f18cb78f38cf245dd021e76f" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ "block-buffer", "crypto-common", @@ -438,9 +451,9 @@ [[package]] name = "ed25519-dalek" -version = "2.0.0-rc.2" +version = "2.0.0-rc.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "798f704d128510932661a3489b08e3f4c934a01d61c5def59ae7b8e48f19665a" +checksum = "faa8e9049d5d72bfc12acbc05914731b5322f79b5e2f195e9f2d705fca22ab4c" dependencies = [ "curve25519-dalek", "ed25519", @@ -456,9 +469,9 @@ [[package]] name = "elliptic-curve" -version = "0.13.2" +version = "0.13.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ea5a92946e8614bb585254898bb7dd1ddad241ace60c52149e3765e34cc039d" +checksum = "968405c8fdc9b3bf4df0a6638858cc0b52462836ab6b1c87377785dd09cf1c0b" dependencies = [ "base16ct", "crypto-bigint", @@ -475,13 +488,13 @@ [[package]] name = "errno" -version = "0.2.8" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f639046355ee4f37944e44f60642c6f3a7efa3cf6b78c78a0d989a8ce6c396a1" +checksum = "4bcfec3a70f97c962c307b2d2c56e358cf1d00b558d74262b5f929ee8cc7e73a" dependencies = [ "errno-dragonfly", "libc", - "winapi", + "windows-sys", ] [[package]] @@ -521,9 +534,9 @@ [[package]] name = "generic-array" -version = "0.14.6" +version = "0.14.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bff49e947297f3312447abdca79f45f4738097cc82b06e72054d2223f601f1b9" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" dependencies = [ "typenum", "version_check", @@ -532,9 +545,9 @@ [[package]] name = "getrandom" -version = "0.2.8" +version = "0.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c05aeb6a22b8f62540c194aac980f2115af067bfe15a0734d7277a768d396b31" +checksum = "be4136b2a15dd319360be1c07d9933517ccf0be8f16bf62a3bee4f0d618df427" dependencies = [ "cfg-if", "libc", @@ -575,18 +588,9 @@ [[package]] name = "hermit-abi" -version = "0.2.6" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee512640fe35acbfb4bb779db6f0d80704c2cacfa2e39b601ef3e3f47d1ae4c7" -dependencies = [ - "libc", -] - -[[package]] -name = "hermit-abi" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fed44880c466736ef9a5c5b5facefb5ed0785676d0c02d612db14e54f0d84286" +checksum = "443144c8cdadd93ebf52ddb4056d257f5b52c04d3c804e657d19eb73fc33668b" [[package]] name = "hkdf" @@ -637,13 +641,13 @@ [[package]] name = "io-lifetimes" -version = "1.0.9" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09270fd4fa1111bc614ed2246c7ef56239a3063d5be0d1ec3b589c505d400aeb" +checksum = "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2" dependencies = [ - "hermit-abi 0.3.1", + "hermit-abi 0.3.2", "libc", - "windows-sys 0.45.0", + "windows-sys", ] [[package]] @@ -657,9 +661,9 @@ [[package]] name = "itoa" -version = "1.0.6" +version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "453ad9f582a441959e5f0d088b02ce04cfe8d51a8eaf077f12ac6d3e94164ca6" +checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" [[package]] name = "jobserver" @@ -672,9 +676,9 @@ [[package]] name = "js-sys" -version = "0.3.61" +version = "0.3.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "445dde2150c55e483f3d8416706b97ec8e8237c307e5b7b4b8dd15e6af2a0730" +checksum = "c5f195fe497f702db0f318b07fdd68edb16955aed830df8363d837542f8f935a" dependencies = [ "wasm-bindgen", ] @@ -687,9 +691,9 @@ [[package]] name = "libc" -version = "0.2.140" +version = "0.2.147" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99227334921fae1a979cf0bfdfcc6b3e5ce376ef57e16fb6fb3ea2ed6095f80c" +checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3" [[package]] name = "libfuzzer-sys" @@ -703,25 +707,16 @@ ] [[package]] -name = "libm" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fc7aa29613bd6a620df431842069224d8bc9011086b1db4c0e0cd47fa03ec9a" - -[[package]] name = "linux-raw-sys" -version = "0.1.4" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f051f77a7c8e6957c0696eac88f26b0117e54f52d3fc682ab19397a8812846a4" +checksum = "ef53942eb7bf7ff43a617b3e2c1c4a5ecf5944a7c1bc12d7ee39bbb15e5c1519" [[package]] name = "log" -version = "0.4.17" +version = "0.4.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" -dependencies = [ - "cfg-if", -] +checksum = "b06a4cde4c0f271a446782e3eff8de789548ce57dbc8eca9292c27f4a42004b4" [[package]] name = "memchr" @@ -731,9 +726,9 @@ [[package]] name = "memoffset" -version = "0.8.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d61c719bcfbcf5d62b3a09efa6088de8c54bc0bfcd3ea7ae39fcc186108b8de1" +checksum = "5a634b1c61a95585bd15607c6ab0c4e5b226e695ff2800ba0cdccddf208c406c" dependencies = [ "autocfg", ] @@ -786,19 +781,19 @@ [[package]] name = "num_cpus" -version = "1.15.0" +version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fac9e2da13b5eb447a6ce3d392f23a29d8694bff781bf03a16cd9ac8697593b" +checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" dependencies = [ - "hermit-abi 0.2.6", + "hermit-abi 0.3.2", "libc", ] [[package]] name = "once_cell" -version = "1.17.1" +version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7e5500299e16ebb147ae15a00a942af264cf3688f47923b8fc2cd5858f23ad3" +checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" [[package]] name = "oorandom" @@ -814,31 +809,21 @@ [[package]] name = "os_str_bytes" -version = "6.5.0" +version = "6.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ceedf44fb00f2d1984b0bc98102627ce622e083e49a5bacdb3e514fa4238e267" +checksum = "4d5d9eb14b174ee9aa2ef96dc2b94637a2d4b6e7cb873c7e171f0c20c6cf3eac" [[package]] name = "p256" -version = "0.13.0" +version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7270da3e5caa82afd3deb054cc237905853813aea3859544bc082c3fe55b8d47" +checksum = "c9863ad85fa8f4460f9c48cb909d38a0d689dba1f6f6988a5e3e0d31071bcd4b" dependencies = [ "elliptic-curve", "primeorder", ] [[package]] -name = "packed_simd_2" -version = "0.3.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1914cd452d8fccd6f9db48147b29fd4ae05bea9dc5d9ad578509f72415de282" -dependencies = [ - "cfg-if", - "libm", -] - -[[package]] name = "platforms" version = "3.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -846,9 +831,9 @@ [[package]] name = "plotters" -version = "0.3.4" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2538b639e642295546c50fcd545198c9d64ee2a38620a628724a3b266d5fbf97" +checksum = "d2c224ba00d7cadd4d5c660deaf2098e5e80e07846537c51f9cfa4be50c1fd45" dependencies = [ "num-traits", "plotters-backend", @@ -859,24 +844,24 @@ [[package]] name = "plotters-backend" -version = "0.3.4" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "193228616381fecdc1224c62e96946dfbc73ff4384fba576e052ff8c1bea8142" +checksum = "9e76628b4d3a7581389a35d5b6e2139607ad7c75b17aed325f210aa91f4a9609" [[package]] name = "plotters-svg" -version = "0.3.3" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9a81d2759aae1dae668f783c308bc5c8ebd191ff4184aaa1b37f65a6ae5a56f" +checksum = "38f6d39893cca0701371e3c27294f09797214b86f1fb951b89ade8ec04e2abab" dependencies = [ "plotters-backend", ] [[package]] name = "polyval" -version = "0.6.0" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ef234e08c11dfcb2e56f79fd70f6f2eb7f025c0ce2333e82f4f0518ecad30c6" +checksum = "d52cff9d1d4dee5fe6d03729099f4a310a41179e0a10dbf542039873f2e826fb" dependencies = [ "cfg-if", "cpufeatures", @@ -892,18 +877,18 @@ [[package]] name = "primeorder" -version = "0.13.0" +version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7613fdcc0831c10060fa69833ea8fa2caa94b6456f51e25356a885b530a2e3d0" +checksum = "3c2fcef82c0ec6eefcc179b978446c399b3cdf73c392c35604e399eee6df1ee3" dependencies = [ "elliptic-curve", ] [[package]] name = "proc-macro2" -version = "1.0.56" +version = "1.0.66" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b63bdb0cd06f1f4dedf69b254734f9b45af66e4a031e42a7480257d9898b435" +checksum = "18fb31db3f9bddb2ea821cde30a9f70117e3f119938b5ee630b7403aa6e2ead9" dependencies = [ "unicode-ident", ] @@ -961,9 +946,9 @@ [[package]] name = "quote" -version = "1.0.26" +version = "1.0.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4424af4bf778aae2051a77b60283332f386554255d722233d09fbfc7e30da2fc" +checksum = "5fe8a65d69dd0808184ebb5f836ab526bb259db23c657efa38711b1072ee47f0" dependencies = [ "proc-macro2", ] @@ -1022,18 +1007,30 @@ [[package]] name = "redox_syscall" -version = "0.2.16" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" +checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" dependencies = [ "bitflags", ] [[package]] name = "regex" -version = "1.7.3" +version = "1.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b1f693b24f6ac912f4893ef08244d70b6067480d2f1a46e950c9691e6749d1d" +checksum = "b2eae68fc220f7cf2532e4494aded17545fce192d59cd996e0fe7887f4ceb575" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39354c10dd07468c2e73926b23bb9c2caca74c5501e38a35da70406f1d923310" dependencies = [ "aho-corasick", "memchr", @@ -1042,29 +1039,38 @@ [[package]] name = "regex-syntax" -version = "0.6.29" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" +checksum = "e5ea92a5b6195c6ef2a0295ea818b312502c6fc94dde986c5553242e18fd4ce2" + +[[package]] +name = "rustc_version" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" +dependencies = [ + "semver", +] [[package]] name = "rustix" -version = "0.36.11" +version = "0.37.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db4165c9963ab29e422d6c26fbc1d37f15bace6b2810221f9d925023480fcf0e" +checksum = "4d69718bf81c6127a49dc64e44a742e8bb9213c0ff8869a22c308f84c1d4ab06" dependencies = [ "bitflags", "errno", "io-lifetimes", "libc", "linux-raw-sys", - "windows-sys 0.45.0", + "windows-sys", ] [[package]] name = "ryu" -version = "1.0.13" +version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f91339c0467de62360649f8d3e185ca8de4224ff281f66000de5eb2a77a79041" +checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741" [[package]] name = "same-file" @@ -1077,15 +1083,15 @@ [[package]] name = "scopeguard" -version = "1.1.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] name = "sec1" -version = "0.7.1" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48518a2b5775ba8ca5b46596aae011caa431e6ce7e4a67ead66d92f08884220e" +checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" dependencies = [ "base16ct", "der", @@ -1095,30 +1101,36 @@ ] [[package]] -name = "serde" -version = "1.0.160" +name = "semver" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb2f3770c8bce3bcda7e149193a069a0f4365bda1fa5cd88e03bca26afc1216c" +checksum = "b0293b4b29daaf487284529cc2f5675b8e57c61f70167ba415a463651fd6a918" + +[[package]] +name = "serde" +version = "1.0.171" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30e27d1e4fd7659406c492fd6cfaf2066ba8773de45ca75e855590f856dc34a9" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.160" +version = "1.0.171" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "291a097c63d8497e00160b166a967a4a79c64f3facdd01cbd7502231688d77df" +checksum = "389894603bd18c46fa56231694f8d827779c0951a667087194cf9de94ed24682" dependencies = [ "proc-macro2", "quote", - "syn 2.0.13", + "syn 2.0.26", ] [[package]] name = "serde_json" -version = "1.0.96" +version = "1.0.103" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "057d394a50403bcac12672b2b18fb387ab6d289d957dab67dd201875391e52f1" +checksum = "d03b412469450d4404fe8499a268edd7f8b79fecb074b0d812ad64ca21f4031b" dependencies = [ "itoa", "ryu", @@ -1127,9 +1139,9 @@ [[package]] name = "sha2" -version = "0.10.6" +version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82e6b795fe2e3b1e845bafcb27aa35405c4d47cdfc92af5fc8d3002f76cebdc0" +checksum = "479fb9d862239e610720565ca91403019f2f00410f1864c5aa7479b950a76ed8" dependencies = [ "cfg-if", "cpufeatures", @@ -1144,9 +1156,9 @@ [[package]] name = "subtle" -version = "2.4.1" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" +checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" [[package]] name = "syn" @@ -1161,9 +1173,9 @@ [[package]] name = "syn" -version = "2.0.13" +version = "2.0.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c9da457c5285ac1f936ebd076af6dac17a61cfe7826f2076b4d015cf47bc8ec" +checksum = "45c3457aacde3c65315de5031ec191ce46604304d2446e803d71ade03308d970" dependencies = [ "proc-macro2", "quote", @@ -1172,15 +1184,16 @@ [[package]] name = "tempfile" -version = "3.4.0" +version = "3.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af18f7ae1acd354b992402e9ec5864359d693cd8a79dcbef59f76891701c1e95" +checksum = "31c0432476357e58790aaa47a8efb0c5138f137343f3b5f23bd36a27e3b0a6d6" dependencies = [ + "autocfg", "cfg-if", "fastrand", "redox_syscall", "rustix", - "windows-sys 0.42.0", + "windows-sys", ] [[package]] @@ -1191,22 +1204,22 @@ [[package]] name = "thiserror" -version = "1.0.40" +version = "1.0.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "978c9a314bd8dc99be594bc3c175faaa9794be04a5a5e153caba6915336cebac" +checksum = "a35fc5b8971143ca348fa6df4f024d4d55264f3468c71ad1c2f365b0a4d58c42" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.40" +version = "1.0.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9456a42c5b0d803c8cd86e73dd7cc9edd429499f37a3550d286d5e86720569f" +checksum = "463fe12d7993d3b327787537ce8dd4dfa058de32fc2b195ef3cde03dc4771e8f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.13", + "syn 2.0.26", ] [[package]] @@ -1272,15 +1285,15 @@ [[package]] name = "unicode-ident" -version = "1.0.8" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5464a87b239f13a63a501f2701565754bae92d243d4bb7eb12f6d57d2269bf4" +checksum = "301abaae475aa91687eb82514b328ab47a211a533026cb25fc3e519b86adfc3c" [[package]] name = "universal-hash" -version = "0.5.0" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d3160b73c9a19f7e2939a2fdad446c57c1bbbbf4d919d3213ff1267a580d8b5" +checksum = "fc1de2c688dc15305988b563c3854064043356019f97a4b46276fe734c4f07ea" dependencies = [ "crypto-common", "subtle", @@ -1310,9 +1323,9 @@ [[package]] name = "wasm-bindgen" -version = "0.2.84" +version = "0.2.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31f8dcbc21f30d9b8f2ea926ecb58f6b91192c17e9d33594b3df58b2007ca53b" +checksum = "7706a72ab36d8cb1f80ffbf0e071533974a60d0a308d01a5d0375bf60499a342" dependencies = [ "cfg-if", "wasm-bindgen-macro", @@ -1320,24 +1333,24 @@ [[package]] name = "wasm-bindgen-backend" -version = "0.2.84" +version = "0.2.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95ce90fd5bcc06af55a641a86428ee4229e44e07033963a2290a8e241607ccb9" +checksum = "5ef2b6d3c510e9625e5fe6f509ab07d66a760f0885d858736483c32ed7809abd" dependencies = [ "bumpalo", "log", "once_cell", "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.26", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.84" +version = "0.2.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c21f77c0bedc37fd5dc21f897894a5ca01e7bb159884559461862ae90c0b4c5" +checksum = "dee495e55982a3bd48105a7b947fd2a9b4a8ae3010041b9e0faab3f9cd028f1d" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -1345,28 +1358,28 @@ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.84" +version = "0.2.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2aff81306fcac3c7515ad4e177f521b5c9a15f2b08f4e32d823066102f35a5f6" +checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b" dependencies = [ "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.26", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.84" +version = "0.2.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" +checksum = "ca6ad05a4870b2bf5fe995117d3728437bd27d7cd5f06f13c17443ef369775a1" [[package]] name = "web-sys" -version = "0.3.61" +version = "0.3.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e33b99f4b23ba3eec1a53ac264e35a755f00e966e0065077d6027c0f575b0b97" +checksum = "9b85cbef8c220a6abc02aefd892dfc0fc23afb1c6a426316ec33253a3877249b" dependencies = [ "js-sys", "wasm-bindgen", @@ -1416,33 +1429,18 @@ [[package]] name = "windows-sys" -version = "0.42.0" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7" -dependencies = [ - "windows_aarch64_gnullvm", - "windows_aarch64_msvc", - "windows_i686_gnu", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_gnullvm", - "windows_x86_64_msvc", -] - -[[package]] -name = "windows-sys" -version = "0.45.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" dependencies = [ "windows-targets", ] [[package]] name = "windows-targets" -version = "0.42.2" +version = "0.48.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" +checksum = "05d4b17490f70499f20b9e791dcf6a299785ce8af4d709018206dc5b4953e95f" dependencies = [ "windows_aarch64_gnullvm", "windows_aarch64_msvc", @@ -1455,51 +1453,51 @@ [[package]] name = "windows_aarch64_gnullvm" -version = "0.42.2" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" +checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc" [[package]] name = "windows_aarch64_msvc" -version = "0.42.2" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" +checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3" [[package]] name = "windows_i686_gnu" -version = "0.42.2" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" +checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241" [[package]] name = "windows_i686_msvc" -version = "0.42.2" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" +checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00" [[package]] name = "windows_x86_64_gnu" -version = "0.42.2" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" +checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1" [[package]] name = "windows_x86_64_gnullvm" -version = "0.42.2" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" +checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953" [[package]] name = "windows_x86_64_msvc" -version = "0.42.2" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" +checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" [[package]] name = "x25519-dalek" -version = "2.0.0-rc.2" +version = "2.0.0-rc.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fabd6e16dd08033932fc3265ad4510cc2eab24656058a6dcb107ffe274abcc95" +checksum = "ec7fae07da688e17059d5886712c933bb0520f15eff2e09cfa18e30968f4e63a" dependencies = [ "curve25519-dalek", "rand_core", @@ -1507,6 +1505,6 @@ [[package]] name = "zeroize" -version = "1.5.7" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c394b5bd0c6f669e7275d9c20aa90ae064cb22e75a1cad54e1b34088034b149f" +checksum = "2a0956f1ba7c7909bfb66c2e9e4124ab6f6482560f6628b5aaeba39207c9aad9"
diff --git a/nearby/crypto/crypto_provider_boringssl/Cargo.lock b/nearby/crypto/crypto_provider_boringssl/Cargo.lock index 7d097a6..14402c1 100644 --- a/nearby/crypto/crypto_provider_boringssl/Cargo.lock +++ b/nearby/crypto/crypto_provider_boringssl/Cargo.lock
@@ -3,12 +3,6 @@ version = 3 [[package]] -name = "autocfg" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" - -[[package]] name = "base64" version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -61,101 +55,6 @@ ] [[package]] -name = "futures" -version = "0.3.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23342abe12aba583913b2e62f22225ff9c950774065e4bfb61a19cd9770fec40" -dependencies = [ - "futures-channel", - "futures-core", - "futures-executor", - "futures-io", - "futures-sink", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-channel" -version = "0.3.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "955518d47e09b25bbebc7a18df10b81f0c766eaf4c4f1cccef2fca5f2a4fb5f2" -dependencies = [ - "futures-core", - "futures-sink", -] - -[[package]] -name = "futures-core" -version = "0.3.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4bca583b7e26f571124fe5b7561d49cb2868d79116cfa0eefce955557c6fee8c" - -[[package]] -name = "futures-executor" -version = "0.3.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccecee823288125bd88b4d7f565c9e58e41858e47ab72e8ea2d64e93624386e0" -dependencies = [ - "futures-core", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-io" -version = "0.3.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fff74096e71ed47f8e023204cfd0aa1289cd54ae5430a9523be060cdb849964" - -[[package]] -name = "futures-macro" -version = "0.3.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.15", -] - -[[package]] -name = "futures-sink" -version = "0.3.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f43be4fe21a13b9781a69afa4985b0f6ee0e1afab2c6f454a8cf30e2b2237b6e" - -[[package]] -name = "futures-task" -version = "0.3.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76d3d132be6c0e6aa1534069c705a74a5997a356c0dc2f86a47765e5617c5b65" - -[[package]] -name = "futures-timer" -version = "3.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e64b03909df88034c26dc1547e8970b91f98bdb65165d6a4e9110d94263dbb2c" - -[[package]] -name = "futures-util" -version = "0.3.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26b01e40b772d54cf6c6d721c1d1abd0647a0106a12ecaa1c186273392a69533" -dependencies = [ - "futures-channel", - "futures-core", - "futures-io", - "futures-macro", - "futures-sink", - "futures-task", - "memchr", - "pin-project-lite", - "pin-utils", - "slab", -] - -[[package]] name = "getrandom" version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -174,9 +73,9 @@ [[package]] name = "hex-literal" -version = "0.3.4" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ebdb29d2ea9ed0083cd8cece49bbd968021bd99b0849edb4a9a7ee0fdf6a4e0" +checksum = "6fe2267d4ed49bc07b63801559be28c718ea06c4738b7a03c94df7386d2cde46" [[package]] name = "itoa" @@ -200,24 +99,6 @@ ] [[package]] -name = "memchr" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" - -[[package]] -name = "pin-project-lite" -version = "0.2.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116" - -[[package]] -name = "pin-utils" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" - -[[package]] name = "ppv-lite86" version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -292,21 +173,19 @@ [[package]] name = "rstest" -version = "0.16.0" +version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b07f2d176c472198ec1e6551dc7da28f1c089652f66a7b722676c2238ebc0edf" +checksum = "de1bb486a691878cd320c2f0d319ba91eeaa2e894066d8b5f8f117c000e9d962" dependencies = [ - "futures", - "futures-timer", "rstest_macros", "rustc_version", ] [[package]] name = "rstest_macros" -version = "0.16.0" +version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7229b505ae0706e64f37ffc54a9c163e11022a6636d58fe1f3f52018257ff9f7" +checksum = "290ca1a1c8ca7edb7c3283bd44dc35dd54fdec6253a3912e201ba1072018fca8" dependencies = [ "cfg-if", "proc-macro2", @@ -381,15 +260,6 @@ ] [[package]] -name = "slab" -version = "0.4.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6528351c9bc8ab22353f9d776db39a20288e8d6c37ef8cfe3317cf875eecfc2d" -dependencies = [ - "autocfg", -] - -[[package]] name = "syn" version = "1.0.109" source = "registry+https://github.com/rust-lang/crates.io-index"
diff --git a/nearby/crypto/crypto_provider_openssl/Cargo.toml b/nearby/crypto/crypto_provider_openssl/Cargo.toml index ef4a009..84d4380 100644 --- a/nearby/crypto/crypto_provider_openssl/Cargo.toml +++ b/nearby/crypto/crypto_provider_openssl/Cargo.toml
@@ -10,7 +10,7 @@ openssl.workspace = true cfg-if.workspace = true -ouroboros = "0.15.5" +ouroboros = "0.17.0" [features] default = []
diff --git a/nearby/crypto/crypto_provider_test/fuzz/Cargo.lock b/nearby/crypto/crypto_provider_test/fuzz/Cargo.lock index f65c18d..9e1d140 100644 --- a/nearby/crypto/crypto_provider_test/fuzz/Cargo.lock +++ b/nearby/crypto/crypto_provider_test/fuzz/Cargo.lock
@@ -3,12 +3,6 @@ version = 3 [[package]] -name = "Inflector" -version = "0.11.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe438c63458706e03479442743baae6c88256498e6431708f6dfc520a26515d3" - -[[package]] name = "aead" version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -21,9 +15,9 @@ [[package]] name = "aes" -version = "0.8.2" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "433cfd6710c9986c576a25ca913c39d66a6474107b406f34f91d4a8923395241" +checksum = "ac1f845298e95f983ff1944b728ae08b8cebab80d684f0a832ed0fc74dfa27e2" dependencies = [ "cfg-if", "cipher", @@ -132,15 +126,15 @@ [[package]] name = "const-oid" -version = "0.9.2" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "520fbf3c07483f94e3e3ca9d0cfd913d7718ef2483d2cfd91c0d9e91474ab913" +checksum = "795bc6e66a8e340f075fcf6227e417a2dc976b92b91f3cdc778bb858778b6747" [[package]] name = "cpufeatures" -version = "0.2.7" +version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e4c1eaa2012c47becbbad2ab175484c2a84d1185b566fb2cc5b8707343dfe58" +checksum = "a17b76ff3a4162b0b27f354a0c87015ddad39d35f9c0c36607a3bdd175dde1f1" dependencies = [ "libc", ] @@ -245,23 +239,36 @@ [[package]] name = "curve25519-dalek" -version = "4.0.0-rc.2" +version = "4.0.0-rc.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03d928d978dbec61a1167414f5ec534f24bea0d7a0d24dd9b6233d3d8223e585" +checksum = "436ace70fc06e06f7f689d2624dc4e2f0ea666efb5aa704215f7249ae6e047a7" dependencies = [ "cfg-if", + "cpufeatures", + "curve25519-dalek-derive", "digest", "fiat-crypto", - "packed_simd_2", "platforms", + "rustc_version", "subtle", ] [[package]] -name = "der" -version = "0.7.5" +name = "curve25519-dalek-derive" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05e58dffcdcc8ee7b22f0c1f71a69243d7c2d9ad87b5a14361f2424a1565c219" +checksum = "83fdaf97f4804dcebfa5862639bc9ce4121e82140bec2a987ac5140294865b5b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.26", +] + +[[package]] +name = "der" +version = "0.7.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c7ed52955ce76b1554f509074bb357d3fb8ac9b51288a65a3fd480d1dfba946" dependencies = [ "const-oid", "zeroize", @@ -269,20 +276,20 @@ [[package]] name = "derive_arbitrary" -version = "1.3.0" +version = "1.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3cdeb9ec472d588e539a818b2dee436825730da08ad0017c4b1a17676bdc8b7" +checksum = "53e0efad4403bfc52dc201159c4b842a246a14b98c64b55dfd0f2d89729dfeb8" dependencies = [ "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.26", ] [[package]] name = "digest" -version = "0.10.6" +version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8168378f4e5023e7218c89c891c0fd8ecdb5e5e4f18cb78f38cf245dd021e76f" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ "block-buffer", "crypto-common", @@ -300,9 +307,9 @@ [[package]] name = "ed25519-dalek" -version = "2.0.0-rc.2" +version = "2.0.0-rc.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "798f704d128510932661a3489b08e3f4c934a01d61c5def59ae7b8e48f19665a" +checksum = "faa8e9049d5d72bfc12acbc05914731b5322f79b5e2f195e9f2d705fca22ab4c" dependencies = [ "curve25519-dalek", "ed25519", @@ -312,9 +319,9 @@ [[package]] name = "elliptic-curve" -version = "0.13.4" +version = "0.13.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75c71eaa367f2e5d556414a8eea812bc62985c879748d6403edabd9cb03f16e7" +checksum = "968405c8fdc9b3bf4df0a6638858cc0b52462836ab6b1c87377785dd09cf1c0b" dependencies = [ "base16ct", "crypto-bigint", @@ -373,9 +380,9 @@ [[package]] name = "getrandom" -version = "0.2.9" +version = "0.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c85e1d9ab2eadba7e5040d4e09cbd6d072b76a557ad64e797c2cb9d4da21d7e4" +checksum = "be4136b2a15dd319360be1c07d9933517ccf0be8f16bf62a3bee4f0d618df427" dependencies = [ "cfg-if", "libc", @@ -394,6 +401,12 @@ ] [[package]] +name = "heck" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" + +[[package]] name = "hkdf" version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -432,9 +445,9 @@ [[package]] name = "libc" -version = "0.2.144" +version = "0.2.147" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b00cc1c228a6782d0f076e7b232802e0c5689d41bb5df366f2a6b6621cfdfe1" +checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3" [[package]] name = "libfuzzer-sys" @@ -448,16 +461,10 @@ ] [[package]] -name = "libm" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fc7aa29613bd6a620df431842069224d8bc9011086b1db4c0e0cd47fa03ec9a" - -[[package]] name = "once_cell" -version = "1.17.1" +version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7e5500299e16ebb147ae15a00a942af264cf3688f47923b8fc2cd5858f23ad3" +checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" [[package]] name = "opaque-debug" @@ -467,9 +474,9 @@ [[package]] name = "openssl" -version = "0.10.52" +version = "0.10.55" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01b8574602df80f7b85fdfc5392fa884a4e3b3f4f35402c070ab34c3d3f78d56" +checksum = "345df152bc43501c5eb9e4654ff05f794effb78d4efe3d53abc158baddc0703d" dependencies = [ "bitflags", "cfg-if", @@ -488,14 +495,14 @@ dependencies = [ "proc-macro2", "quote", - "syn 2.0.16", + "syn 2.0.26", ] [[package]] name = "openssl-sys" -version = "0.9.87" +version = "0.9.90" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e17f59264b2809d77ae94f0e1ebabc434773f370d6ca667bd223ea10e06cc7e" +checksum = "374533b0e45f3a7ced10fcaeccca020e66656bc03dac384f852e4e5a7a8104a6" dependencies = [ "cc", "libc", @@ -505,25 +512,26 @@ [[package]] name = "ouroboros" -version = "0.15.6" +version = "0.17.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1358bd1558bd2a083fed428ffeda486fbfb323e698cdda7794259d592ca72db" +checksum = "b4361ddfdd108bddc19367ba805a3a43773d8bc3e407ac30e6c364cd264dd52e" dependencies = [ "aliasable", "ouroboros_macro", + "static_assertions", ] [[package]] name = "ouroboros_macro" -version = "0.15.6" +version = "0.17.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f7d21ccd03305a674437ee1248f3ab5d4b1db095cf1caf49f1713ddf61956b7" +checksum = "2b81e113ed913910f05ef45c9344f67588fe6395f92d906eedf9ee5d54279922" dependencies = [ - "Inflector", + "heck", "proc-macro-error", "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.26", ] [[package]] @@ -537,16 +545,6 @@ ] [[package]] -name = "packed_simd_2" -version = "0.3.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1914cd452d8fccd6f9db48147b29fd4ae05bea9dc5d9ad578509f72415de282" -dependencies = [ - "cfg-if", - "libm", -] - -[[package]] name = "pkg-config" version = "0.3.27" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -560,9 +558,9 @@ [[package]] name = "polyval" -version = "0.6.0" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ef234e08c11dfcb2e56f79fd70f6f2eb7f025c0ce2333e82f4f0518ecad30c6" +checksum = "d52cff9d1d4dee5fe6d03729099f4a310a41179e0a10dbf542039873f2e826fb" dependencies = [ "cfg-if", "cpufeatures", @@ -578,9 +576,9 @@ [[package]] name = "primeorder" -version = "0.13.1" +version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf8d3875361e28f7753baefef104386e7aa47642c93023356d97fdef4003bfb5" +checksum = "3c2fcef82c0ec6eefcc179b978446c399b3cdf73c392c35604e399eee6df1ee3" dependencies = [ "elliptic-curve", ] @@ -611,18 +609,18 @@ [[package]] name = "proc-macro2" -version = "1.0.56" +version = "1.0.66" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b63bdb0cd06f1f4dedf69b254734f9b45af66e4a031e42a7480257d9898b435" +checksum = "18fb31db3f9bddb2ea821cde30a9f70117e3f119938b5ee630b7403aa6e2ead9" dependencies = [ "unicode-ident", ] [[package]] name = "quote" -version = "1.0.27" +version = "1.0.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f4f29d145265ec1c483c7c654450edde0bfe043d3938d6972630663356d9500" +checksum = "5fe8a65d69dd0808184ebb5f836ab526bb259db23c657efa38711b1072ee47f0" dependencies = [ "proc-macro2", ] @@ -656,10 +654,19 @@ ] [[package]] -name = "sec1" -version = "0.7.2" +name = "rustc_version" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0aec48e813d6b90b15f0b8948af3c63483992dee44c03e9930b3eebdabe046e" +checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" +dependencies = [ + "semver", +] + +[[package]] +name = "sec1" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" dependencies = [ "base16ct", "der", @@ -669,10 +676,16 @@ ] [[package]] -name = "sha2" -version = "0.10.6" +name = "semver" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82e6b795fe2e3b1e845bafcb27aa35405c4d47cdfc92af5fc8d3002f76cebdc0" +checksum = "b0293b4b29daaf487284529cc2f5675b8e57c61f70167ba415a463651fd6a918" + +[[package]] +name = "sha2" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "479fb9d862239e610720565ca91403019f2f00410f1864c5aa7479b950a76ed8" dependencies = [ "cfg-if", "cpufeatures", @@ -686,10 +699,16 @@ checksum = "5e1788eed21689f9cf370582dfc467ef36ed9c707f073528ddafa8d83e3b8500" [[package]] -name = "subtle" -version = "2.4.1" +name = "static_assertions" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + +[[package]] +name = "subtle" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" [[package]] name = "syn" @@ -698,15 +717,14 @@ checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" dependencies = [ "proc-macro2", - "quote", "unicode-ident", ] [[package]] name = "syn" -version = "2.0.16" +version = "2.0.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6f671d4b5ffdb8eadec19c0ae67fe2639df8684bd7bc4b83d986b8db549cf01" +checksum = "45c3457aacde3c65315de5031ec191ce46604304d2446e803d71ade03308d970" dependencies = [ "proc-macro2", "quote", @@ -721,15 +739,15 @@ [[package]] name = "unicode-ident" -version = "1.0.8" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5464a87b239f13a63a501f2701565754bae92d243d4bb7eb12f6d57d2269bf4" +checksum = "301abaae475aa91687eb82514b328ab47a211a533026cb25fc3e519b86adfc3c" [[package]] name = "universal-hash" -version = "0.5.0" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d3160b73c9a19f7e2939a2fdad446c57c1bbbbf4d919d3213ff1267a580d8b5" +checksum = "fc1de2c688dc15305988b563c3854064043356019f97a4b46276fe734c4f07ea" dependencies = [ "crypto-common", "subtle", @@ -755,9 +773,9 @@ [[package]] name = "x25519-dalek" -version = "2.0.0-rc.2" +version = "2.0.0-rc.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fabd6e16dd08033932fc3265ad4510cc2eab24656058a6dcb107ffe274abcc95" +checksum = "ec7fae07da688e17059d5886712c933bb0520f15eff2e09cfa18e30968f4e63a" dependencies = [ "curve25519-dalek", "rand_core",
diff --git a/nearby/presence/CMakeLists.txt b/nearby/presence/CMakeLists.txt index 6fdeed6..2b4b66e 100644 --- a/nearby/presence/CMakeLists.txt +++ b/nearby/presence/CMakeLists.txt
@@ -12,27 +12,72 @@ # See the License for the specific language governing permissions and # limitations under the License. -cmake_minimum_required(VERSION 3.0) +cmake_minimum_required(VERSION 3.14) -project(ldt) +project(NearbyProtocol) -set(CMAKE_C_FLAGS_DEBUG "-g -DDEBUG") -set(CMAKE_CXX_FLAGS_DEBUG "-g -DDEBUG") +# required for designated initializers on MSVC +set(CMAKE_CXX_STANDARD 17) -add_compile_options(-Wall -g -O1 -Wno-deprecated -Wno-deprecated-declarations) +# root directory of repo +set(BETO_CORE_ROOT ${CMAKE_SOURCE_DIR}/../..) + +# location of external third_party dependencies +set(THIRD_PARTY_DIR ${BETO_CORE_ROOT}/third_party) + +set(CMAKE_C_FLAGS_DEBUG "-DDEBUG") +set(CMAKE_CXX_FLAGS_DEBUG "-DDEBUG") +if (UNIX) + set(CMAKE_C_FLAGS_DEBUG "-g ${CMAKE_C_FLAGS_DEBUG}") + set(CMAKE_CXX_FLAGS_DEBUG "-g ${CMAKE_C_FLAGS_DEBUG}") +endif () + +if (UNIX) + add_compile_options(-Wall -Wextra -Wimplicit-fallthrough -Wextra-semi + -Wno-missing-field-initializers -Wno-unused-parameter -Wno-psabi + -Wshadow + -Wsign-compare) +elseif (MSVC) + add_compile_options(-W4 -O1) +endif () find_package(OpenSSL REQUIRED) -if ( OPENSSL_FOUND ) +if (OPENSSL_FOUND) message(STATUS "OpenSSL Found: ${OPENSSL_VERSION}") message(STATUS "OpenSSL Include: ${OPENSSL_INCLUDE_DIR}") message(STATUS "OpenSSL Libraries: ${OPENSSL_LIBRARIES}") -endif() +endif () +if (ENABLE_TESTS) + message(STATUS "Enabling workspace wide tests") + + # Setup GoogleTest + include(FetchContent) + FetchContent_Declare( + googletest + GIT_REPOSITORY https://github.com/google/googletest.git + GIT_TAG release-1.12.1 + ) + FetchContent_MakeAvailable(googletest) + enable_testing() + include(GoogleTest) + + # Find GoogleBenchmark + find_package(benchmark REQUIRED) + + # Setup jsoncpp + set(JSONCPP_DIR ${THIRD_PARTY_DIR}/jsoncpp) + include_directories(${JSONCPP_DIR}) + add_library( + jsoncpp + ${JSONCPP_DIR}/jsoncpp.cpp + ) +endif () + +add_subdirectory(np_cpp_ffi) add_subdirectory(ldt_np_c_sample) if (ENABLE_FUZZ) message(STATUS "Building fuzzers") add_subdirectory(ldt_np_adv_ffi_fuzz) -endif() - - +endif ()
diff --git a/nearby/presence/README.md b/nearby/presence/README.md index 8f38f7d..fe63af1 100644 --- a/nearby/presence/README.md +++ b/nearby/presence/README.md
@@ -5,17 +5,20 @@ See the appendix below for more details on XTS and LDT. ## Project structure -*Note all new crates follow the convention of using underscore `_` instead of hyphen `-` in crate names + +*Note all new crates follow the convention of using underscore `_` instead of +hyphen `-` in crate names ### `ldt` An implementation of [`LDT`](https://luca-giuzzi.unibs.it/corsi/Support/papers-cryptography/1619-2007-NIST-Submission.pdf) - which can use `xts-aes` as its tweakable block cipher. +which can use `xts-aes` as its tweakable block cipher. - ### `ldt_tbc` +### `ldt_tbc` -The Tweakable Block Cipher traits for use in LDT. These traits have implementations in the `xts_aes` +The Tweakable Block Cipher traits for use in LDT. These traits have +implementations in the `xts_aes` ### `ldt_np_adv` @@ -24,24 +27,27 @@ ### `ldt_np_adv_ffi` -C API for rust library, currently exposes C/C++ clients the needed API's to use the NP specific LDT rust implementation. -For an example of how to integrate with these API's see program in `ldt_np_c_sample` +C API for rust library, currently exposes C/C++ clients the needed API's to use +the NP specific LDT rust implementation. +For an example of how to integrate with these API's see program +in `ldt_np_c_sample` ### `ldt_np_c_sample` -Sample c program which provides its own OpenSSL based AES implementation to encrypt data through the LDT rust implementation +Sample c program which provides its own OpenSSL based AES implementation to +encrypt data through the LDT rust implementation An example of how to interface with the `ldt_np_adv_ffi` API's ### `np_hkdf` -The Key Derivation functions used for creating keys used by nearby presence from a key_seed +The Key Derivation functions used for creating keys used by nearby presence from +a key_seed ### `xts_aes` An implementation of [`XTS-AES`](https://luca-giuzzi.unibs.it/corsi/Support/papers-cryptography/1619-2007-NIST-Submission.pdf) - ## Setup for MacOS local development Dependencies: @@ -50,37 +56,51 @@ brew install protobuf rapidjson google-benchmark ``` -We depend on OpenSSL of version at least 3.0.5 being installed on your machine to build the fuzzers, for macOS run: +We depend on OpenSSL of version at least 3.0.5 being installed on your machine +to build the fuzzers, for macOS run: ``` brew install openssl@3 ``` -Your build system may still be picking up an older version so you will have to symlink to the brew installed version: +Your build system may still be picking up an older version so you will have to +symlink to the brew installed version: + ``` brew link --force openssl ``` -The in-box version of Clang which comes from XCode developer tools does not have a fuzzer runtime so we will have to use our own +The in-box version of Clang which comes from XCode developer tools does not have +a fuzzer runtime so we will have to use our own + ``` brew install llvm ``` -then to override the default version it needs to come before it in $PATH. first find your path: + +then to override the default version it needs to come before it in $PATH. first +find your path: + ``` $(brew --prefix llvm)/bin ``` + then add this to the beginning of your path + ``` echo 'export PATH="/opt/homebrew/opt/llvm/bin:$PATH"' >> ~/.bash_profile export PATH="/opt/homebrew/opt/llvm/bin:$PATH" ``` + verify success with: + ``` clang --version ``` + it should display the path to the homebrew version and not the xcode version. Some other dependencies you may need include: + ``` brew install ninja bindgen ``` @@ -117,7 +137,9 @@ ``` ### `ldt_np_c_sample` -From the root directory run the following commands to build and run the C sample. + +From the root directory run the following commands to build and run the C +sample. ``` mkdir -p cmake-build && cd cmake-build @@ -127,7 +149,9 @@ ``` ### `ldt_np_c_sample/tests` -Test cases for the ldt_np_adv_ffi C API which are built alongside the sample, use the following commands to run the tests, from root of repo: + +Test cases for the ldt_np_adv_ffi C API which are built alongside the sample, +use the following commands to run the tests, from root of repo: ``` mkdir -p cmake-build && cd cmake-build @@ -135,7 +159,9 @@ make cd ldt_np_c_sample/tests && ctest ``` -you can then view the output of the tests in `ldt_np_c_sample/tests/Testing/Temporary/LastTest.log` + +you can then view the output of the tests +in `ldt_np_c_sample/tests/Testing/Temporary/LastTest.log` To run the benchmarks: @@ -155,7 +181,15 @@ ### C -Build w/ cmake as per `ldt_np_c_sample` instructions. Fuzzers will be in `np_ffi_fuzz` in the build directory. +Build cmake project with `-DENABLE_FUZZ=true`<br> +Fuzz targets will be output to the build dir for:<br> + +- `ldt_np_adv_ffi_fuzz`<br> +- `np_cpp_ffi/fuzz` + - To run `fuzzer_np_cpp_deserialize` + use: `./fuzzer_np_cpp_deserialize -max_len=255 corpus` + - The `corpus` directory provides seed data to help the fuzzer generate + more relevant data to input ## Cross-compilation for Android @@ -198,15 +232,20 @@ - In your `adb shell`, run the benchmark - `./ldt_scan-... --bench` + ### Building min-sized release cross-compiled for Android -- Copy and paste the following into your `~/.cargo/config.toml`, replacing with a path to your NDK and Host OS + +- Copy and paste the following into your `~/.cargo/config.toml`, replacing with + a path to your NDK and Host OS + ``` [target.aarch64-linux-android] # Replace this with a path to your ndk version and the prebuilt toolchain for your Host OS linker = "Library/Android/sdk/ndk/23.2.8568313/toolchains/llvm/prebuilt/darwin-x86_64/bin/aarch64-linux-android21-clang" ``` + - then run: -`cargo +nightly build -Z build-std=core,alloc -Z build-std-features=panic_immediate_abort --target aarch64-linux-android --profile release-min-size` + `cargo +nightly build -Z build-std=core,alloc -Z build-std-features=panic_immediate_abort --target aarch64-linux-android --profile release-min-size` ## Appendix
diff --git a/nearby/presence/array_view/src/lib.rs b/nearby/presence/array_view/src/lib.rs index 9ba21b1..c57e959 100644 --- a/nearby/presence/array_view/src/lib.rs +++ b/nearby/presence/array_view/src/lib.rs
@@ -45,6 +45,10 @@ } impl<T, const N: usize> ArrayView<T, N> { + /// Destructures this ArrayView into a (length, payload) pair. + pub fn into_raw_parts(self) -> (usize, [T; N]) { + (self.len, self.array) + } /// A version of [`ArrayView#try_from_array`] which panics if `len > buffer.len()`, /// suitable for usage in `const` contexts. pub const fn const_from_array(array: [T; N], len: usize) -> ArrayView<T, N> {
diff --git a/nearby/presence/handle_map/Cargo.toml b/nearby/presence/handle_map/Cargo.toml new file mode 100644 index 0000000..8f00bf7 --- /dev/null +++ b/nearby/presence/handle_map/Cargo.toml
@@ -0,0 +1,19 @@ +[package] +name = "handle_map" +version.workspace = true +edition.workspace = true +publish.workspace = true + +[dependencies] +hashbrown.workspace = true +lock_api.workspace = true +portable-atomic.workspace = true +spin.workspace = true +crypto_provider.workspace = true + +[dev-dependencies] +criterion.workspace = true + +[[bench]] +name = "benches" +harness = false
diff --git a/nearby/presence/handle_map/benches/benches.rs b/nearby/presence/handle_map/benches/benches.rs new file mode 100644 index 0000000..f1ee427 --- /dev/null +++ b/nearby/presence/handle_map/benches/benches.rs
@@ -0,0 +1,330 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +use criterion::{black_box, criterion_group, criterion_main, Criterion}; +use handle_map::*; +use std::sync::Arc; +use std::thread; +use std::time::{Duration, Instant}; + +// For the sake of these benchmarks, we just want +// to be able to allocate an almost-arbitrary number of handles +// if needed by the particular benchmark. +const MAX_ACTIVE_HANDLES: u32 = u32::MAX - 1; + +// The default number of threads+shards to use +// in multi-threaded benchmarks, chosen +// to represent a typical multi-threaded use-case. +const DEFAULT_SHARDS_AND_THREADS: u8 = 8; + +/// We're using u8's for the wrapped object type to deliberately ignore +/// costs related to accessing the underlying data - we just care about +/// benchmarking handle-map operations. +type BenchHandleMap = HandleMap<u8>; + +fn build_handle_map(num_shards: u8) -> BenchHandleMap { + let dimensions = HandleMapDimensions { num_shards, max_active_handles: MAX_ACTIVE_HANDLES }; + HandleMap::with_dimensions(dimensions) +} + +/// Benchmark for repeated reads on a single thread +fn single_threaded_read_benchmark(c: &mut Criterion) { + // The number of shards should not matter much here. + let handle_map = build_handle_map(8); + // Pre-populate the map with a single handle. + let handle = handle_map.allocate(|| 0xFF).unwrap(); + let handle_map_ref = &handle_map; + // Perform repeated reads + c.bench_function("single-threaded reads", |b| { + b.iter(|| { + let guard = handle_map_ref.get(black_box(handle)).unwrap(); + black_box(*guard) + }) + }); +} + +/// Benchmark for repeated writes on a single thread +fn single_threaded_write_benchmark(c: &mut Criterion) { + // The number of shards should not matter much here. + let handle_map = build_handle_map(8); + // Pre-populate the map with a single handle. + let handle = handle_map.allocate(|| 0xFF).unwrap(); + let handle_map_ref = &handle_map; + // Perform repeated writes + c.bench_function("single-threaded writes", |b| { + b.iter(|| { + let mut guard = handle_map_ref.get_mut(black_box(handle)).unwrap(); + *guard *= black_box(0); + }) + }); +} + +/// Benchmark for repeated allocations on a single thread +#[allow(unused_must_use)] +fn single_threaded_allocate_benchmark(c: &mut Criterion) { + // The number of shards here is chosen to be quasi-reasonable. + // Realistically, performance will fluctuate somewhat with this + // due to the difference in the number of internal hash-map collisions, + // but ultimately we only care about the asymptotic behavior. + let handle_map = build_handle_map(8); + let handle_map_ref = &handle_map; + // Perform repeated allocations + c.bench_function("single-threaded allocations", |b| { + b.iter(|| { + handle_map_ref.allocate(|| black_box(0xEE)); + }) + }); +} + +/// Benchmark for repeated allocation->deallocation on a single thread +/// starting from an empty map. +#[allow(unused_must_use)] +fn single_threaded_allocate_deallocate_near_empty_benchmark(c: &mut Criterion) { + // The number of shards should not matter much here. + let handle_map = build_handle_map(8); + let handle_map_ref = &handle_map; + // Perform repeated allocation/deallocation pairs + c.bench_function("single-threaded allocate/deallocate pairs (empty init state)", |b| { + b.iter(|| { + let handle = handle_map_ref.allocate(|| black_box(0xDD)).unwrap(); + handle_map_ref.deallocate(handle); + }) + }); +} + +/// Benchmark for repeated allocation->deallocation starting +/// from a map with a thousand elements per shard. +#[allow(unused_must_use)] +fn single_threaded_allocate_deallocate_one_thousand_benchmark(c: &mut Criterion) { + let handle_map = build_handle_map(8); + for _ in 0..(8 * 1000) { + handle_map.allocate(|| black_box(0xFF)).unwrap(); + } + let handle_map_ref = &handle_map; + + // Perform repeated allocation/deallocation pairs + c.bench_function( + "single-threaded allocate/deallocate pairs (init one thousand elements per shard)", + |b| { + b.iter(|| { + let handle = handle_map_ref.allocate(|| black_box(0xDD)).unwrap(); + handle_map_ref.deallocate(handle); + }) + }, + ); +} + +/// Benchmark for repeated allocation->deallocation starting +/// from a map with a million elements per shard. +#[allow(unused_must_use)] +fn single_threaded_allocate_deallocate_one_million_benchmark(c: &mut Criterion) { + let handle_map = build_handle_map(8); + for _ in 0..(8 * 1000000) { + handle_map.allocate(|| black_box(0xFF)).unwrap(); + } + let handle_map_ref = &handle_map; + + // Perform repeated allocation/deallocation pairs + c.bench_function( + "single-threaded allocate/deallocate pairs (init one million elements per shard)", + |b| { + b.iter(|| { + let handle = handle_map_ref.allocate(|| black_box(0xDD)).unwrap(); + handle_map_ref.deallocate(handle); + }) + }, + ); +} + +/// Helper function for creating a multi-threaded benchmark +/// with the set number of threads. Untimed Initialization of state +/// should occur prior to this call. This method will repeatedly +/// execute the benchmark code on all threads +fn bench_multithreaded<F>(name: &str, num_threads: u8, benchable_fn_ref: Arc<F>, c: &mut Criterion) +where + F: Fn() + Send + Sync + 'static, +{ + c.bench_function(name, move |b| { + b.iter_custom(|iters| { + // The returned results from the threads will be their timings + let mut join_handles = Vec::new(); + for _ in 0..num_threads { + let benchable_fn_ref_clone = benchable_fn_ref.clone(); + let join_handle = thread::spawn(move || { + let start = Instant::now(); + for _ in 0..iters { + benchable_fn_ref_clone(); + } + start.elapsed() + }); + join_handles.push(join_handle); + } + //Threads spawned, now collect the results + let mut total_duration = Duration::from_nanos(0); + for join_handle in join_handles { + let thread_duration = join_handle.join().unwrap(); + total_duration += thread_duration; + } + total_duration /= num_threads as u32; + total_duration + }) + }); +} + +/// Defines a number of reads/writes to perform [relative +/// to other operations performed in a given test] +#[derive(Debug, Clone, Copy)] +struct ReadWriteCount { + num_reads: usize, + num_writes: usize, +} + +const READS_ONLY: ReadWriteCount = ReadWriteCount { num_reads: 4, num_writes: 0 }; + +const READ_LEANING: ReadWriteCount = ReadWriteCount { num_reads: 3, num_writes: 1 }; + +const BALANCED: ReadWriteCount = ReadWriteCount { num_reads: 2, num_writes: 2 }; + +const WRITE_LEANING: ReadWriteCount = ReadWriteCount { num_reads: 1, num_writes: 3 }; + +const WRITES_ONLY: ReadWriteCount = ReadWriteCount { num_reads: 0, num_writes: 4 }; + +const READ_WRITE_COUNTS: [ReadWriteCount; 5] = + [READS_ONLY, READ_LEANING, BALANCED, WRITE_LEANING, WRITES_ONLY]; + +/// Benchmarks a repeated allocate/[X writes]/[Y reads]/deallocate workflow across +/// the default number of threads and shards. +fn lifecycle_read_and_write_multithreaded(per_object_rw_count: ReadWriteCount, c: &mut Criterion) { + let name = format!( + "lifecycle_read_and_write_multithreaded(reads/object: {}, writes/object:{})", + per_object_rw_count.num_reads, per_object_rw_count.num_writes + ); + // We need an Arc to be able to pass this off to `bench_multithreaded`. + let handle_map = Arc::new(build_handle_map(DEFAULT_SHARDS_AND_THREADS)); + bench_multithreaded( + &name, + DEFAULT_SHARDS_AND_THREADS, + Arc::new(move || { + let handle = handle_map.allocate(|| black_box(0xFF)).unwrap(); + for _ in 0..per_object_rw_count.num_writes { + let mut write_guard = handle_map.get_mut(handle).unwrap(); + *write_guard *= black_box(1); + } + for _ in 0..per_object_rw_count.num_reads { + let read_guard = handle_map.get_mut(handle).unwrap(); + black_box(*read_guard); + } + handle_map.deallocate(handle).unwrap(); + }), + c, + ); +} + +fn lifecycle_benchmarks(c: &mut Criterion) { + for read_write_count in READ_WRITE_COUNTS { + // Using 8 separate shards to roughly match the number of active threads. + lifecycle_read_and_write_multithreaded(read_write_count, c); + } +} + +/// Benchmarks repeated cycles of accessing the given number of distinct objects, each +/// with the given number of reads and writes across the given number of threads. +fn read_and_write_contention_multithreaded( + num_threads: u8, + num_distinct_objects: u32, + per_object_rw_count: ReadWriteCount, + c: &mut Criterion, +) { + let name = format!("read_and_write_contention_multithreaded(threads: {}, objects: {}, reads/object: {}, writes/object:{})", + num_threads, num_distinct_objects, per_object_rw_count.num_reads, per_object_rw_count.num_writes); + // Default to 8 shards, ultimately doesn't matter much since we only ever access a few shards. + // This needs to be `'static` in order to pass a ref off to `bench_multithreaded`. + let handle_map = Arc::new(build_handle_map(8)); + let mut handles = Vec::new(); + for i in 0..num_distinct_objects { + let handle = handle_map.allocate(|| i as u8).unwrap(); + handles.push(handle); + } + + bench_multithreaded( + &name, + num_threads, + Arc::new(move || { + // Deliberately performing all writes first, with + // the goal of getting staggered timings from + // all of the threads for subsequent iterations. + // We also perform reads and writes across all objects + // in batches to get something resembling uniform access. + for _ in 0..per_object_rw_count.num_writes { + for handle in handles.iter() { + let mut write_guard = handle_map.get_mut(*handle).unwrap(); + *write_guard *= black_box(1); + } + } + for _ in 0..per_object_rw_count.num_reads { + for handle in handles.iter() { + let read_guard = handle_map.get(*handle).unwrap(); + black_box(*read_guard); + } + } + }), + c, + ); +} + +fn read_write_contention_benchmarks(c: &mut Criterion) { + for num_threads in [2, 4, 8].iter() { + for num_distinct_objects in [1u32, 2u32, 4u32].iter() { + if num_distinct_objects >= &(*num_threads as u32) { + continue; + } + for read_write_count in READ_WRITE_COUNTS { + read_and_write_contention_multithreaded( + *num_threads, + *num_distinct_objects, + read_write_count, + c, + ); + } + } + } +} + +/// Benchmarks allocation (starting from empty) for the default number of shards and threads +fn allocator_contention_benchmark(c: &mut Criterion) { + let name = "allocator_contention_multithreaded"; + // We need an Arc to pass this off to `bench_multithreaded` + let handle_map = Arc::new(build_handle_map(DEFAULT_SHARDS_AND_THREADS)); + bench_multithreaded( + name, + DEFAULT_SHARDS_AND_THREADS, + Arc::new(move || { + handle_map.allocate(|| black_box(0xFF)).unwrap(); + }), + c, + ); +} + +criterion_group!( + benches, + single_threaded_read_benchmark, + single_threaded_write_benchmark, + single_threaded_allocate_benchmark, + single_threaded_allocate_deallocate_near_empty_benchmark, + single_threaded_allocate_deallocate_one_thousand_benchmark, + single_threaded_allocate_deallocate_one_million_benchmark, + lifecycle_benchmarks, + read_write_contention_benchmarks, + allocator_contention_benchmark, +); +criterion_main!(benches);
diff --git a/nearby/presence/handle_map/src/lib.rs b/nearby/presence/handle_map/src/lib.rs new file mode 100644 index 0000000..745aec4 --- /dev/null +++ b/nearby/presence/handle_map/src/lib.rs
@@ -0,0 +1,608 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +//! A thread-safe implementation of a map for managing object handles, +//! a safer alternative to raw pointers for FFI interop. +#![cfg_attr(not(test), no_std)] +#![forbid(unsafe_code)] +#![deny(missing_docs)] +extern crate alloc; +extern crate core; + +use alloc::boxed::Box; +use alloc::vec::Vec; +use core::ops::{Deref, DerefMut}; +use core::sync::atomic::Ordering; +use hashbrown::hash_map::EntryRef; +use portable_atomic::{AtomicU32, AtomicU64}; +use spin::lock_api::*; + +#[cfg(test)] +mod tests; + +/// A RAII read lock guard for an object in a [`HandleMap`] +/// pointed-to by a given [`Handle`]. When this struct is +/// dropped, the underlying read lock on the associated +/// shard will be dropped. +pub struct ObjectReadGuard<'a, T> { + guard: lock_api::MappedRwLockReadGuard<'a, spin::RwLock<()>, T>, +} + +impl<'a, T> Deref for ObjectReadGuard<'a, T> { + type Target = T; + + fn deref(&self) -> &Self::Target { + self.guard.deref() + } +} + +/// A RAII read-write lock guard for an object in a [`HandleMap`] +/// pointed-to by a given [`Handle`]. When this struct is +/// dropped, the underlying read-write lock on the associated +/// shard will be dropped. +pub struct ObjectReadWriteGuard<'a, T> { + guard: lock_api::MappedRwLockWriteGuard<'a, spin::RwLock<()>, T>, +} + +impl<'a, T> Deref for ObjectReadWriteGuard<'a, T> { + type Target = T; + + fn deref(&self) -> &Self::Target { + self.guard.deref() + } +} + +impl<'a, T> DerefMut for ObjectReadWriteGuard<'a, T> { + fn deref_mut(&mut self) -> &mut Self::Target { + self.guard.deref_mut() + } +} + +/// FFI-transmissible structure expressing the dimensions +/// (max # of allocatable slots, number of shards) of a handle-map +/// to be used upon initialization. +#[repr(C)] +#[derive(Clone, Copy)] +pub struct HandleMapDimensions { + /// The number of shards which are employed + /// by the associated handle-map. + pub num_shards: u8, + /// The maximum number of active handles which may be + /// stored within the associated handle-map. + pub max_active_handles: u32, +} + +/// Trait for marker structs containing information about a +/// given [`SingletonHandleMap`], including the underlying +/// object type and the dimensions of the map. +/// Used primarily to enforce type-level constraints +/// on `SingletoneHandleMap`s, including +/// ensuring that they are truly singletons. +pub trait SingletonHandleMapInfo { + /// The underlying kind of object pointed-to by handles + /// derived from the associated handle-map. + type Object: Send + Sync; + + /// Gets the dimensions of the corresponding handle-map. + fn dimensions(&self) -> HandleMapDimensions; + + /// Gets a static reference to the global handle-map + fn get_handle_map() -> &'static HandleMap<Self::Object>; +} + +/// An individual handle to be given out by a [`HandleMap`]. +/// This representation is untyped, and just a wrapper +/// around a handle-id, in contrast to implementors of `HandleLike`. +#[derive(Clone, Copy, PartialEq, Eq, Hash)] +pub struct Handle { + handle_id: u64, +} + +impl From<&Handle> for Handle { + fn from(handle: &Handle) -> Self { + *handle + } +} + +impl Handle { + /// Constructs a handle wrapping the given ID. + /// + /// No validity checks are done on the wrapped ID + /// to ensure that the given ID is active in + /// any specific handle-map, and the type + /// of the handle is not represented. + /// + /// As a result, this method is only useful for + /// allowing access to handles from an FFI layer. + pub fn from_id(handle_id: u64) -> Self { + Self { handle_id } + } + /// Gets the ID for this handle. + /// + /// Since the underlying handle is un-typed,` + /// this method is only suitable for + /// transmitting handles across an FFI layer. + pub fn get_id(&self) -> u64 { + self.handle_id + } + /// Derives the shard index from the handle id + fn get_shard_index(&self, num_shards: u8) -> usize { + (self.handle_id % (num_shards as u64)) as usize + } +} + +/// Error raised when attempting to allocate into a full handle-map. +#[derive(Debug)] +pub struct HandleMapFullError; + +/// Internal error enum for failed allocations into a given shard. +enum ShardAllocationError<T, F: FnOnce() -> T> { + /// Error for when the entry for the handle is occupied, + /// in which case we spit out the object-provider to try again + /// with a new handle-id. + EntryOccupied(F), + /// Error for when we would exceed the maximum number of allocations. + ExceedsAllocationLimit, +} + +/// Error raised when the entry for a given [`Handle`] doesn't exist. +#[derive(Debug)] +pub struct HandleNotPresentError; + +/// Wrapper around a `HandleMap` which is specifically tailored for maintaining +/// a global singleton `'static` reference to a handle-map. +/// The wrapper handles initialization of the singleton in a const-context +/// and subsequent accesses to ensure that the underlying map is always +/// initialized upon attempts to access it. +pub struct SingletonHandleMap<I: SingletonHandleMapInfo> { + info: I, + wrapped: spin::once::Once<HandleMap<I::Object>, spin::relax::Spin>, +} + +impl<I: SingletonHandleMapInfo> SingletonHandleMap<I> { + /// Constructs a new global handle-map using the given + /// singleton handle-map info. This method is callable + /// from a `const`-context to allow it to be used to initialize + /// `static` variables. + pub const fn with_info(info: I) -> Self { + Self { info, wrapped: spin::once::Once::new() } + } + /// Initialize the handle-map if it's not already initialized, + /// and return a reference to the result. + pub fn get(&self) -> &HandleMap<I::Object> { + self.wrapped.call_once(|| { + let dimensions = self.info.dimensions(); + HandleMap::with_dimensions(dimensions) + }) + } +} + +/// A thread-safe mapping from "handle"s [like pointers, but safer] +/// to underlying structures, supporting allocations, reads, writes, +/// and deallocations of objects behind handles. +pub struct HandleMap<T: Send + Sync> { + /// The dimensions of this handle-map + dimensions: HandleMapDimensions, + + /// The individually-lockable "shards" of the handle-map, + /// among which the keys will be roughly uniformly-distributed. + handle_map_shards: Box<[HandleMapShard<T>]>, + + /// An atomically-incrementing counter which tracks the + /// next handle ID which allocations will attempt to use. + new_handle_id_counter: AtomicU64, + + /// An atomic integer roughly tracking the number of + /// currently-outstanding allocated entries in this + /// handle-map among all [`HandleMapShard`]s. + outstanding_allocations_counter: AtomicU32, +} + +impl<T: Send + Sync> HandleMap<T> { + /// Creates a new handle-map with the given `HandleMapDimensions`. + pub fn with_dimensions(dimensions: HandleMapDimensions) -> Self { + let mut handle_map_shards = Vec::with_capacity(dimensions.num_shards as usize); + for _ in 0..dimensions.num_shards { + handle_map_shards.push(HandleMapShard::default()); + } + let handle_map_shards = handle_map_shards.into_boxed_slice(); + Self { + dimensions, + handle_map_shards, + new_handle_id_counter: AtomicU64::new(0), + outstanding_allocations_counter: AtomicU32::new(0), + } + } +} + +impl<T: Send + Sync> HandleMap<T> { + /// Allocates a new object within the given handle-map, returning + /// a handle to the location it was stored at. This operation + /// may fail if attempting to allocate over the `dimensions.max_active_handles` + /// limit imposed on the handle-map, in which case this method + /// will return a `HandleMapFullError`. + pub fn allocate( + &self, + initial_value_provider: impl FnOnce() -> T, + ) -> Result<Handle, HandleMapFullError> { + let mut initial_value_provider = initial_value_provider; + loop { + // Increment the new-handle-ID counter using relaxed memory ordering, + // since the only invariant that we want to enforce is that concurrently-running + // threads always get distinct new handle-ids. + let new_handle_id = self.new_handle_id_counter.fetch_add(1, Ordering::Relaxed); + let new_handle = Handle::from_id(new_handle_id); + let shard_index = new_handle.get_shard_index(self.dimensions.num_shards); + + // Now, check the shard to see if we can actually allocate into it. + let shard_allocate_result = self.handle_map_shards[shard_index].try_allocate( + new_handle, + initial_value_provider, + &self.outstanding_allocations_counter, + self.dimensions.max_active_handles, + ); + match shard_allocate_result { + Ok(_) => { + return Ok(new_handle); + } + Err(ShardAllocationError::ExceedsAllocationLimit) => { + return Err(HandleMapFullError); + } + Err(ShardAllocationError::EntryOccupied(thrown_back_provider)) => { + // We need to do the whole thing again with a new ID + initial_value_provider = thrown_back_provider; + } + } + } + } + + /// Gets a read-only reference to an object within the given handle-map, + /// if the given handle is present. Otherwise, returns [`HandleNotPresentError`]. + pub fn get(&self, handle: Handle) -> Result<ObjectReadGuard<T>, HandleNotPresentError> { + let shard_index = handle.get_shard_index(self.dimensions.num_shards); + self.handle_map_shards[shard_index].get(handle) + } + + /// Gets a read+write reference to an object within the given handle-map, + /// if the given handle is present. Otherwise, returns [`HandleNotPresentError`]. + pub fn get_mut( + &self, + handle: Handle, + ) -> Result<ObjectReadWriteGuard<T>, HandleNotPresentError> { + let shard_index = handle.get_shard_index(self.dimensions.num_shards); + self.handle_map_shards[shard_index].get_mut(handle) + } + + /// Removes the object pointed to by the given handle in + /// the handle-map, returning the removed object if it + /// exists. Otherwise, returns [`HandleNotPresentError`]. + pub fn deallocate(&self, handle: Handle) -> Result<T, HandleNotPresentError> { + let shard_index = handle.get_shard_index(self.dimensions.num_shards); + self.handle_map_shards[shard_index] + .deallocate(handle, &self.outstanding_allocations_counter) + } + + /// Gets the actual number of elements stored in the entire map. + /// Only suitable for single-threaded sections of tests. + #[cfg(test)] + pub(crate) fn len(&self) -> usize { + self.handle_map_shards.iter().map(|s| s.len()).sum() + } + + /// Sets the new-handle-id counter to the given value. + /// Only suitable for tests. + #[cfg(test)] + pub(crate) fn set_new_handle_id_counter(&mut self, value: u64) { + self.new_handle_id_counter = AtomicU64::new(value); + } +} + +// Bunch o' type aliases to make talking about them much easier in the shard code. +type ShardMapType<T> = hashbrown::HashMap<Handle, T>; +type ShardReadWriteLock<T> = RwLock<ShardMapType<T>>; +type ShardReadGuard<'a, T> = RwLockReadGuard<'a, ShardMapType<T>>; +type ShardUpgradableReadGuard<'a, T> = RwLockUpgradableReadGuard<'a, ShardMapType<T>>; +type ShardReadWriteGuard<'a, T> = RwLockWriteGuard<'a, ShardMapType<T>>; + +/// An individual handle-map shard, which is ultimately +/// just a hash-map behind a lock. +pub(crate) struct HandleMapShard<T: Send + Sync> { + data: RwLock<ShardMapType<T>>, +} + +impl<T: Send + Sync> Default for HandleMapShard<T> { + fn default() -> Self { + Self { data: RwLock::new(hashbrown::HashMap::new()) } + } +} + +impl<T: Send + Sync> HandleMapShard<T> { + fn get(&self, handle: Handle) -> Result<ObjectReadGuard<T>, HandleNotPresentError> { + let map_read_guard = ShardReadWriteLock::<T>::read(&self.data); + let read_only_map_ref = map_read_guard.deref(); + if read_only_map_ref.contains_key(&handle) { + let object_read_guard = ShardReadGuard::<T>::map(map_read_guard, move |map_ref| { + // We know that the entry exists, since we've locked the + // shard and already checked that it exists prior to + // handing out this new, mapped read-lock. + map_ref.get(&handle).unwrap() + }); + Ok(ObjectReadGuard { guard: object_read_guard }) + } else { + // Auto-drop the read guard, and return an error + Err(HandleNotPresentError) + } + } + /// Gets a read-write guard on the entire shard map if an entry for the given + /// handle exists, but if not, yield [`HandleNotPresentError`]. + fn get_read_write_guard_if_entry_exists( + &self, + handle: Handle, + ) -> Result<ShardReadWriteGuard<T>, HandleNotPresentError> { + // Start with an upgradable read lock and then upgrade to a write lock. + // By doing this, we prevent new readers from entering (see `spin` documentation) + let map_upgradable_read_guard = ShardReadWriteLock::<T>::upgradable_read(&self.data); + let read_only_map_ref = map_upgradable_read_guard.deref(); + if read_only_map_ref.contains_key(&handle) { + // If we know that the entry exists, and we're currently + // holding a read-lock, we know that we're safe to request + // an upgrade to a write lock, since only one write or + // upgradable read lock can be outstanding at any one time. + let map_read_write_guard = + ShardUpgradableReadGuard::<T>::upgrade(map_upgradable_read_guard); + Ok(map_read_write_guard) + } else { + // Auto-drop the read guard, we don't need to allow a write. + Err(HandleNotPresentError) + } + } + + fn get_mut(&self, handle: Handle) -> Result<ObjectReadWriteGuard<T>, HandleNotPresentError> { + let map_read_write_guard = self.get_read_write_guard_if_entry_exists(handle)?; + // Expose only the pointed-to object with a mapped read-write guard + let object_read_write_guard = + ShardReadWriteGuard::<T>::map(map_read_write_guard, move |map_ref| { + // Already checked that the entry exists while holding the lock + map_ref.get_mut(&handle).unwrap() + }); + Ok(ObjectReadWriteGuard { guard: object_read_write_guard }) + } + fn deallocate( + &self, + handle: Handle, + outstanding_allocations_counter: &AtomicU32, + ) -> Result<T, HandleNotPresentError> { + let mut map_read_write_guard = self.get_read_write_guard_if_entry_exists(handle)?; + // We don't need to worry about double-decrements, since the above call + // got us an upgradable read guard for our read, which means it's the only + // outstanding upgradeable guard on the shard. See `spin` documentation. + // Remove the pointed-to object from the map, and return it, + // releasing the lock when the guard goes out of scope. + let removed_object = map_read_write_guard.deref_mut().remove(&handle).unwrap(); + // Decrement the allocations counter. Release ordering because we want + // to ensure that clearing the map entry never gets re-ordered to after when + // this counter gets decremented. + outstanding_allocations_counter.sub(1, Ordering::Release); + Ok(removed_object) + } + + fn try_allocate<F>( + &self, + handle: Handle, + object_provider: F, + outstanding_allocations_counter: &AtomicU32, + max_active_handles: u32, + ) -> Result<(), ShardAllocationError<T, F>> + where + F: FnOnce() -> T, + { + // Use an upgradeable read guard -> write guard to provide greater fairness + // toward writers (see `spin` documentation) + let map_upgradable_read_guard = ShardReadWriteLock::<T>::upgradable_read(&self.data); + let mut map_read_write_guard = + ShardUpgradableReadGuard::<T>::upgrade(map_upgradable_read_guard); + match map_read_write_guard.entry_ref(&handle) { + EntryRef::Occupied(_) => { + // We've already allocated for that handle-id, so yield + // the object provider back to the caller. + Err(ShardAllocationError::EntryOccupied(object_provider)) + } + EntryRef::Vacant(vacant_entry) => { + // An entry is open, but we haven't yet checked the allocations count. + // Try to increment the total allocations count atomically. + // Use acquire ordering on a successful bump, because we don't want + // to invoke the allocation closure before we have a guaranteed slot. + // On the other hand, upon failure, we don't care about ordering + // of surrounding operations, and so we use a relaxed ordering there. + let allocation_count_bump_result = outstanding_allocations_counter.fetch_update( + Ordering::Acquire, + Ordering::Relaxed, + |old_total_allocations| { + if old_total_allocations >= max_active_handles { + None + } else { + Some(old_total_allocations + 1) + } + }, + ); + match allocation_count_bump_result { + Ok(_) => { + // We're good to actually allocate + let object = object_provider(); + vacant_entry.insert(object); + Ok(()) + } + Err(_) => { + // The allocation would cause us to exceed the allowed allocations, + // so release all locks and error. + Err(ShardAllocationError::ExceedsAllocationLimit) + } + } + } + } + } + /// Gets the actual number of elements stored in this shard. + /// Only suitable for single-threaded sections of tests. + #[cfg(test)] + fn len(&self) -> usize { + let guard = ShardReadWriteLock::<T>::read(&self.data); + guard.deref().len() + } +} + +/// Externally-facing trait for things which behave like handle-map handles +/// with a globally-defined handle-map for the type. +pub trait HandleLike: Sized { + /// The underlying object type pointed-to by this handle + type Object: Send + Sync; + + /// Tries to allocate a new handle using the given provider + /// to construct the underlying stored object as a new + /// entry into the global handle table for this type. + fn allocate( + initial_value_provider: impl FnOnce() -> Self::Object, + ) -> Result<Self, HandleMapFullError>; + + /// Gets a RAII read-guard on the contents behind this handle. + fn get(&self) -> Result<ObjectReadGuard<Self::Object>, HandleNotPresentError>; + + /// Gets a RAII read-write guard on the contents behind this handle. + fn get_mut(&self) -> Result<ObjectReadWriteGuard<Self::Object>, HandleNotPresentError>; + + /// Deallocates the contents behind this handle. + fn deallocate(self) -> Result<Self::Object, HandleNotPresentError>; +} + +#[macro_export] +/// `declare_handle_map! { handle_module_name, handle_type_name, wrapped_type, +/// map_dimension_provider }` +/// +/// Declares a new public module with name `handle_module_name` which includes a new type +/// `handle_type_name` which is `#[repr(C)]` and represents FFI-accessible handles +/// to values of type `wrapped_type`. +/// +/// Internal to the generated module, a new static `SingletonHandleMap` is created, where the +/// maximum number of active handles and the number of shards are given by +/// the dimensions returned by evaluation of the `map_dimension_provider` expression. +/// +/// Note: `map_dimension_provider` will be evaluated within the defined module's scope, +/// so you will likely need to use `super` to refer to definitions in the enclosing scope. +/// +/// # Example +/// The following code defines an FFI-safe type `StringHandle` which references +/// the `String` data-type, and uses it to define a (contrived) +/// function `sample` which will print "Hello World". +/// +/// ``` +/// mod sample { +/// use core::ops::Deref; +/// use handle_map::{declare_handle_map, HandleMapDimensions, HandleLike}; +/// +/// fn get_string_handle_map_dimensions() -> HandleMapDimensions { +/// HandleMapDimensions { +/// num_shards: 8, +/// max_active_handles: 100, +/// } +/// } +/// +/// declare_handle_map! { string_handle, StringHandle, String, +/// super::get_string_handle_map_dimensions() } +/// +/// use string_handle::StringHandle; +/// +/// fn sample() { +/// // Note: this method could panic if there are +/// // more than 99 outstanding handles. +/// +/// // Allocate a new string-handle pointing to the string "Hello" +/// let handle = StringHandle::allocate(|| { "Hello".to_string() }).unwrap(); +/// { +/// // Obtain a write-guard on the contents of our handle +/// let mut handle_write_guard = handle.get_mut().unwrap(); +/// handle_write_guard.push_str(" World"); +/// // Write guard is auto-dropped at the end of this block. +/// } +/// { +/// // Obtain a read-guard on the contents of our handle. +/// // Note that we had to ensure that the write-guard was +/// // dropped prior to doing this, or else execution +/// // could potentially hang. +/// let handle_read_guard = handle.get().unwrap(); +/// println!("{}", handle_read_guard.deref()); +/// } +/// // Clean up the data behind the created handle +/// handle.deallocate().unwrap(); +/// } +/// } +/// ``` +macro_rules! declare_handle_map { + ($handle_module_name:ident, $handle_type_name:ident, $wrapped_type:ty, + $map_dimension_provider:expr) => { + #[doc = concat!("Macro-generated (via `handle_map::declare_handle_map!`) module", + " which defines the `", stringify!($handle_module_name), "::", + stringify!($handle_type_name), "` FFI-transmissible handle type ", + " which references values of type `", stringify!($wrapped_type), "`.")] + pub mod $handle_module_name { + use $crate::SingletonHandleMapInfo; + + struct SingletonInfo; + + static GLOBAL_HANDLE_MAP: $crate::SingletonHandleMap<SingletonInfo> = + $crate::SingletonHandleMap::with_info(SingletonInfo); + + impl $crate::SingletonHandleMapInfo for SingletonInfo { + type Object = $wrapped_type; + + fn dimensions(&self) -> $crate::HandleMapDimensions { + $map_dimension_provider + } + fn get_handle_map() -> &'static $crate::HandleMap<$wrapped_type> { + GLOBAL_HANDLE_MAP.get() + } + } + + #[doc = concat!("A `#[repr(C)]` handle to a value of type `", + stringify!($wrapped_type), "`.")] + #[repr(C)] + #[derive(Clone, Copy, PartialEq, Eq)] + pub struct $handle_type_name { + handle_id: u64, + } + + impl $handle_type_name { + fn get_as_handle(&self) -> $crate::Handle { + $crate::Handle::from_id(self.handle_id) + } + } + impl $crate::HandleLike for $handle_type_name { + type Object = $wrapped_type; + fn allocate(initial_value_provider: impl FnOnce() -> $wrapped_type, + ) -> Result<Self, $crate::HandleMapFullError> { + SingletonInfo::get_handle_map().allocate(initial_value_provider) + .map(|derived_handle| Self { + handle_id: derived_handle.get_id(), + }) + } + fn get(&self) -> Result<$crate::ObjectReadGuard<$wrapped_type>, $crate::HandleNotPresentError> { + SingletonInfo::get_handle_map().get(self.get_as_handle()) + } + fn get_mut(&self) -> Result<$crate::ObjectReadWriteGuard<$wrapped_type>, $crate::HandleNotPresentError> { + SingletonInfo::get_handle_map().get_mut(self.get_as_handle()) + } + fn deallocate(self) -> Result<$wrapped_type, $crate::HandleNotPresentError> { + SingletonInfo::get_handle_map().deallocate(self.get_as_handle()) + } + } + } + } +}
diff --git a/nearby/presence/handle_map/src/tests.rs b/nearby/presence/handle_map/src/tests.rs new file mode 100644 index 0000000..d97657f --- /dev/null +++ b/nearby/presence/handle_map/src/tests.rs
@@ -0,0 +1,288 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +use crate::*; + +use hashbrown::HashSet; +use std::sync::Arc; +use std::thread; + +// Maximum number of active handles used across all tests +// Chosen to be divisible by the number of active threads +const MAX_ACTIVE_HANDLES: u32 = NUM_ACTIVE_THREADS * MAX_ACTIVE_HANDLES_PER_THREAD; + +const MAX_ACTIVE_HANDLES_PER_THREAD: u32 = 16384; + +// Deliberately picking a low number of shards so that we +// are more likely to discover conflicts between threads. +const NUM_SHARDS: u8 = 4; + +// Deliberately picking a higher number of threads. +const NUM_ACTIVE_THREADS: u32 = 8; + +const DEFAULT_DIMENSIONS: HandleMapDimensions = + HandleMapDimensions { num_shards: NUM_SHARDS, max_active_handles: MAX_ACTIVE_HANDLES }; + +fn build_handle_map<T: Send + Sync>() -> HandleMap<T> { + HandleMap::with_dimensions(DEFAULT_DIMENSIONS) +} + +/// Performs the same testing function for each thread +fn test_for_each_thread<F>(test_function_ref: Arc<F>, num_repetitions_per_thread: usize) +where + F: Fn() + Send + Sync + 'static, +{ + let mut join_handles = Vec::new(); + for _ in 0..NUM_ACTIVE_THREADS { + let test_function_clone = test_function_ref.clone(); + let join_handle = thread::spawn(move || { + for _ in 0..num_repetitions_per_thread { + test_function_clone(); + } + }); + join_handles.push(join_handle); + } + for join_handle in join_handles { + join_handle.join().unwrap() + } +} + +/// Tests the consistency of reads from the same handle across +/// multiple threads. +#[test] +fn test_read_consistency_same_address() { + let num_repetitions_per_thread = 10000; + let handle_map = build_handle_map::<String>(); + let handle = handle_map.allocate(|| "hello".to_string()).expect("Allocation shouldn't fail"); + let test_fn = Arc::new(move || { + let value_ref = handle_map.get(handle).expect("Getting shouldn't fail"); + assert_eq!("hello", value_ref.deref()); + }); + test_for_each_thread(test_fn, num_repetitions_per_thread); +} + +/// Tests overloading the table with allocations to ensure +/// that when all is said and done, we still haven't exceeded +/// the allocations limit. +#[test] +#[allow(unused_must_use)] +fn test_overload_with_allocations() { + let num_repetitions_per_thread = 2 * MAX_ACTIVE_HANDLES_PER_THREAD as usize; + let handle_map = build_handle_map::<u8>(); + + let handle_map_function_ref = Arc::new(handle_map); + let handle_map_post_function_ref = handle_map_function_ref.clone(); + + let test_fn = Arc::new(move || { + handle_map_function_ref.allocate(|| 0xFF); + }); + test_for_each_thread(test_fn, num_repetitions_per_thread); + + let actual_num_active_handles = handle_map_post_function_ref.len(); + assert_eq!(MAX_ACTIVE_HANDLES as usize, actual_num_active_handles); +} + +/// Tests deallocations and allocations near the allocation limit. +#[test] +#[allow(unused_must_use)] +fn test_overload_allocations_deallocations() { + let num_repetitions_per_thread = 10000; + + //Pre-fill the map so that there's only one available entry. + let handle_map = build_handle_map::<u8>(); + for i in 0..(MAX_ACTIVE_HANDLES - 1) { + handle_map.allocate(|| (i % 256) as u8); + } + + let handle_map_function_ref = Arc::new(handle_map); + let handle_map_post_function_ref = handle_map_function_ref.clone(); + + let test_fn = Arc::new(move || { + let allocation_result = handle_map_function_ref.allocate(|| 0xFF); + if let Ok(handle) = allocation_result { + handle_map_function_ref.deallocate(handle).unwrap(); + } + }); + test_for_each_thread(test_fn, num_repetitions_per_thread); + + // No matter what happened above, we should have the same number + // of handles as when we started, because every successful allocation + // should have been paired with a successful deallocation. + let actual_num_active_handles = handle_map_post_function_ref.len(); + assert_eq!((MAX_ACTIVE_HANDLES - 1) as usize, actual_num_active_handles); + + //Verify that we still have space for one more entry after all that. + handle_map_post_function_ref.allocate(|| 0xEE).unwrap(); +} + +/// Tests the progress of allocate/read/write/read/deallocate +/// to independent handles across multiple threads. +#[test] +fn test_full_lifecycle_independent_handles() { + let num_repetitions_per_thread = 10000; + let handle_map = build_handle_map::<String>(); + let test_fn = Arc::new(move || { + let handle = + handle_map.allocate(|| "Hello".to_string()).expect("Allocation shouldn't fail"); + { + let value_ref = handle_map.get(handle).expect("Getting the value shouldn't fail"); + assert_eq!("Hello", &*value_ref); + }; + { + let mut value_mut_ref = + handle_map.get_mut(handle).expect("Mutating the value shouldn't fail"); + value_mut_ref.deref_mut().push_str(" World!"); + }; + { + let value_ref = handle_map + .get(handle) + .expect("Getting the value after modification shouldn't fail"); + assert_eq!("Hello World!", &*value_ref); + }; + let removed = handle_map.deallocate(handle).expect("Deallocation shouldn't fail"); + assert_eq!("Hello World!", removed); + }); + test_for_each_thread(test_fn, num_repetitions_per_thread); +} + +/// Tests the consistency of reads+writes to the same handle, +/// where threads modify and read different parts of an +/// underlying structure. +#[test] +fn test_consistency_of_same_handle_multithreaded_modifications() { + let num_repetitions_per_thread = 10000; + let handle_map = Arc::new(build_handle_map::<(String, String)>()); + let handle = handle_map + .allocate(|| ("A".to_string(), "B".to_string())) + .expect("Allocation shouldn't fail"); + + let handle_map_second_ref = handle_map.clone(); + + let join_handle_a = thread::spawn(move || { + for i in 1..num_repetitions_per_thread { + { + let value_ref = + handle_map.get(handle).expect("Getting the value from thread A shouldn't fail"); + let value = &value_ref.0; + assert_eq!(i, value.len()); + } + { + let mut value_mut_ref = handle_map + .get_mut(handle) + .expect("Mutating the value from thread A shouldn't fail"); + value_mut_ref.0.push('A'); + } + } + }); + + let join_handle_b = thread::spawn(move || { + for i in 1..num_repetitions_per_thread { + { + let value_ref = handle_map_second_ref + .get(handle) + .expect("Getting the value from thread B shouldn't fail"); + let value = &value_ref.1; + assert_eq!(i, value.len()); + } + { + let mut value_mut_ref = handle_map_second_ref + .get_mut(handle) + .expect("Mutating the value from thread B shouldn't fail"); + value_mut_ref.1.push('B'); + } + } + }); + + join_handle_a.join().unwrap(); + join_handle_b.join().unwrap(); +} + +/// Multi-threaded test to ensure that when attempting +/// to allocate over handle IDs which are already allocated, +/// all threads eventually get distinct, unused handle IDs +/// for their own allocations. +#[test] +fn test_non_overwriting_old_handles() { + let mut all_handles: HashSet<Handle> = HashSet::new(); + let num_repetitions_per_thread = 100; + let mut handle_map = build_handle_map::<u8>(); + for _ in 0..(num_repetitions_per_thread * NUM_ACTIVE_THREADS) { + let handle = handle_map.allocate(|| 0xFF).expect("Initial allocations shouldn't fail"); + all_handles.insert(handle); + } + // Reset the new-handle-id counter + handle_map.set_new_handle_id_counter(0); + + let handle_map = Arc::new(handle_map); + + let mut thread_handles: Vec<thread::JoinHandle<Vec<Handle>>> = Vec::new(); + for _ in 0..NUM_ACTIVE_THREADS { + let handle_map_reference = handle_map.clone(); + let thread_handle = thread::spawn(move || { + let mut handles = Vec::new(); + for i in 0..num_repetitions_per_thread { + let handle = handle_map_reference + .allocate(move || (i % 256) as u8) + .expect("No allocation should fail"); + handles.push(handle); + } + handles + }); + thread_handles.push(thread_handle); + } + for thread_handle in thread_handles { + let handles: Vec<Handle> = thread_handle.join().expect("Individual threads shouldn't fail"); + for handle in handles { + let was_distinct = all_handles.insert(handle); + assert!(was_distinct); + } + } +} + +#[test] +fn test_id_wraparound() { + let mut handle_map = build_handle_map::<u8>(); + handle_map.set_new_handle_id_counter(u64::MAX); + handle_map.allocate(|| 0xAB).expect("Counter wrap-around allocation should not fail"); + handle_map.allocate(|| 0xCD).expect("Post-counter-wrap-around allocation should not fail"); +} + +#[test] +fn test_deallocate_unallocated_handle() { + let handle_map = build_handle_map::<usize>(); + let handle = handle_map.allocate(|| 2).expect("Allocation shouldn't fail"); + let deallocated = handle_map.deallocate(handle).expect("Deallocation shouldn't fail"); + assert_eq!(2, deallocated); + let double_deallocate_result = handle_map.deallocate(handle); + assert!(double_deallocate_result.is_err()); +} + +#[test] +fn test_get_unallocated_handle() { + let handle_map = build_handle_map::<u8>(); + let handle = handle_map.allocate(|| 0xFE).expect("Allocation shouldn't fail"); + let deallocated = handle_map.deallocate(handle).expect("Deallocation shouldn't fail"); + assert_eq!(0xFE, deallocated); + let read_result = handle_map.get(handle); + assert!(read_result.is_err()); +} + +#[test] +fn test_get_mut_unallocated_handle() { + let handle_map = build_handle_map::<(usize, usize, usize)>(); + let handle = handle_map.allocate(|| (1, 2, 3)).expect("Allocation shouldn't fail"); + let deallocated = handle_map.deallocate(handle).expect("Deallocation shouldn't fail"); + assert_eq!((1, 2, 3), deallocated); + let get_mut_result = handle_map.get_mut(handle); + assert!(get_mut_result.is_err()); +}
diff --git a/nearby/presence/ldt/fuzz/Cargo.lock b/nearby/presence/ldt/fuzz/Cargo.lock index 285bbca..767108f 100644 --- a/nearby/presence/ldt/fuzz/Cargo.lock +++ b/nearby/presence/ldt/fuzz/Cargo.lock
@@ -4,9 +4,9 @@ [[package]] name = "aead" -version = "0.5.1" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c192eb8f11fc081b0fe4259ba5af04217d4e0faddd02417310a927911abd7c8" +checksum = "d122413f284cf2d62fb1b7db97e02edb8cda96d769b16e443a4f6195e35662b0" dependencies = [ "bytes", "crypto-common", @@ -15,9 +15,9 @@ [[package]] name = "aes" -version = "0.8.2" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "433cfd6710c9986c576a25ca913c39d66a6474107b406f34f91d4a8923395241" +checksum = "ac1f845298e95f983ff1944b728ae08b8cebab80d684f0a832ed0fc74dfa27e2" dependencies = [ "cfg-if", "cipher", @@ -69,9 +69,9 @@ [[package]] name = "block-padding" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a90ec2df9600c28a01c56c4784c9207a96d2451833aeceb8cc97e4c9548bb78" +checksum = "a8894febbff9f758034a5b8e12d87918f56dfc64a8e1fe757d65e29041538d93" dependencies = [ "generic-array", ] @@ -118,24 +118,24 @@ [[package]] name = "const-oid" -version = "0.9.2" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "520fbf3c07483f94e3e3ca9d0cfd913d7718ef2483d2cfd91c0d9e91474ab913" +checksum = "795bc6e66a8e340f075fcf6227e417a2dc976b92b91f3cdc778bb858778b6747" [[package]] name = "cpufeatures" -version = "0.2.5" +version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28d997bd5e24a5928dd43e46dc529867e207907fe0b239c3477d924f7f2ca320" +checksum = "a17b76ff3a4162b0b27f354a0c87015ddad39d35f9c0c36607a3bdd175dde1f1" dependencies = [ "libc", ] [[package]] name = "crypto-bigint" -version = "0.5.1" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c2538c4e68e52548bacb3e83ac549f903d44f011ac9d5abb5e132e67d0808f7" +checksum = "cf4c2f4e1afd912bc40bfd6fed5d9dc1f288e0ba01bfcc835cc5bc3eb13efe15" dependencies = [ "generic-array", "rand_core", @@ -193,23 +193,36 @@ [[package]] name = "curve25519-dalek" -version = "4.0.0-rc.2" +version = "4.0.0-rc.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03d928d978dbec61a1167414f5ec534f24bea0d7a0d24dd9b6233d3d8223e585" +checksum = "436ace70fc06e06f7f689d2624dc4e2f0ea666efb5aa704215f7249ae6e047a7" dependencies = [ "cfg-if", + "cpufeatures", + "curve25519-dalek-derive", "digest", "fiat-crypto", - "packed_simd_2", "platforms", + "rustc_version", "subtle", ] [[package]] -name = "der" -version = "0.7.1" +name = "curve25519-dalek-derive" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc906908ea6458456e5eaa160a9c08543ec3d1e6f71e2235cedd660cb65f9df0" +checksum = "83fdaf97f4804dcebfa5862639bc9ce4121e82140bec2a987ac5140294865b5b" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "der" +version = "0.7.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c7ed52955ce76b1554f509074bb357d3fb8ac9b51288a65a3fd480d1dfba946" dependencies = [ "const-oid", "zeroize", @@ -217,9 +230,9 @@ [[package]] name = "derive_arbitrary" -version = "1.3.0" +version = "1.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3cdeb9ec472d588e539a818b2dee436825730da08ad0017c4b1a17676bdc8b7" +checksum = "53e0efad4403bfc52dc201159c4b842a246a14b98c64b55dfd0f2d89729dfeb8" dependencies = [ "proc-macro2", "quote", @@ -228,9 +241,9 @@ [[package]] name = "digest" -version = "0.10.6" +version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8168378f4e5023e7218c89c891c0fd8ecdb5e5e4f18cb78f38cf245dd021e76f" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ "block-buffer", "crypto-common", @@ -248,9 +261,9 @@ [[package]] name = "ed25519-dalek" -version = "2.0.0-rc.2" +version = "2.0.0-rc.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "798f704d128510932661a3489b08e3f4c934a01d61c5def59ae7b8e48f19665a" +checksum = "faa8e9049d5d72bfc12acbc05914731b5322f79b5e2f195e9f2d705fca22ab4c" dependencies = [ "curve25519-dalek", "ed25519", @@ -260,9 +273,9 @@ [[package]] name = "elliptic-curve" -version = "0.13.2" +version = "0.13.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ea5a92946e8614bb585254898bb7dd1ddad241ace60c52149e3765e34cc039d" +checksum = "968405c8fdc9b3bf4df0a6638858cc0b52462836ab6b1c87377785dd09cf1c0b" dependencies = [ "base16ct", "crypto-bigint", @@ -295,9 +308,9 @@ [[package]] name = "generic-array" -version = "0.14.6" +version = "0.14.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bff49e947297f3312447abdca79f45f4738097cc82b06e72054d2223f601f1b9" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" dependencies = [ "typenum", "version_check", @@ -306,9 +319,9 @@ [[package]] name = "getrandom" -version = "0.2.8" +version = "0.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c05aeb6a22b8f62540c194aac980f2115af067bfe15a0734d7277a768d396b31" +checksum = "be4136b2a15dd319360be1c07d9933517ccf0be8f16bf62a3bee4f0d618df427" dependencies = [ "cfg-if", "libc", @@ -391,9 +404,9 @@ [[package]] name = "libc" -version = "0.2.140" +version = "0.2.147" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99227334921fae1a979cf0bfdfcc6b3e5ce376ef57e16fb6fb3ea2ed6095f80c" +checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3" [[package]] name = "libfuzzer-sys" @@ -407,16 +420,10 @@ ] [[package]] -name = "libm" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fc7aa29613bd6a620df431842069224d8bc9011086b1db4c0e0cd47fa03ec9a" - -[[package]] name = "once_cell" -version = "1.17.1" +version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7e5500299e16ebb147ae15a00a942af264cf3688f47923b8fc2cd5858f23ad3" +checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" [[package]] name = "opaque-debug" @@ -426,25 +433,15 @@ [[package]] name = "p256" -version = "0.13.0" +version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7270da3e5caa82afd3deb054cc237905853813aea3859544bc082c3fe55b8d47" +checksum = "c9863ad85fa8f4460f9c48cb909d38a0d689dba1f6f6988a5e3e0d31071bcd4b" dependencies = [ "elliptic-curve", "primeorder", ] [[package]] -name = "packed_simd_2" -version = "0.3.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1914cd452d8fccd6f9db48147b29fd4ae05bea9dc5d9ad578509f72415de282" -dependencies = [ - "cfg-if", - "libm", -] - -[[package]] name = "platforms" version = "3.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -452,9 +449,9 @@ [[package]] name = "polyval" -version = "0.6.0" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ef234e08c11dfcb2e56f79fd70f6f2eb7f025c0ce2333e82f4f0518ecad30c6" +checksum = "d52cff9d1d4dee5fe6d03729099f4a310a41179e0a10dbf542039873f2e826fb" dependencies = [ "cfg-if", "cpufeatures", @@ -470,27 +467,27 @@ [[package]] name = "primeorder" -version = "0.13.0" +version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7613fdcc0831c10060fa69833ea8fa2caa94b6456f51e25356a885b530a2e3d0" +checksum = "3c2fcef82c0ec6eefcc179b978446c399b3cdf73c392c35604e399eee6df1ee3" dependencies = [ "elliptic-curve", ] [[package]] name = "proc-macro2" -version = "1.0.53" +version = "1.0.66" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba466839c78239c09faf015484e5cc04860f88242cff4d03eb038f04b4699b73" +checksum = "18fb31db3f9bddb2ea821cde30a9f70117e3f119938b5ee630b7403aa6e2ead9" dependencies = [ "unicode-ident", ] [[package]] name = "quote" -version = "1.0.26" +version = "1.0.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4424af4bf778aae2051a77b60283332f386554255d722233d09fbfc7e30da2fc" +checksum = "5fe8a65d69dd0808184ebb5f836ab526bb259db23c657efa38711b1072ee47f0" dependencies = [ "proc-macro2", ] @@ -524,10 +521,19 @@ ] [[package]] -name = "sec1" -version = "0.7.1" +name = "rustc_version" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48518a2b5775ba8ca5b46596aae011caa431e6ce7e4a67ead66d92f08884220e" +checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" +dependencies = [ + "semver", +] + +[[package]] +name = "sec1" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" dependencies = [ "base16ct", "der", @@ -537,10 +543,16 @@ ] [[package]] -name = "sha2" -version = "0.10.6" +name = "semver" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82e6b795fe2e3b1e845bafcb27aa35405c4d47cdfc92af5fc8d3002f76cebdc0" +checksum = "b0293b4b29daaf487284529cc2f5675b8e57c61f70167ba415a463651fd6a918" + +[[package]] +name = "sha2" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "479fb9d862239e610720565ca91403019f2f00410f1864c5aa7479b950a76ed8" dependencies = [ "cfg-if", "cpufeatures", @@ -555,15 +567,15 @@ [[package]] name = "subtle" -version = "2.4.1" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" +checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" [[package]] name = "syn" -version = "1.0.109" +version = "2.0.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +checksum = "45c3457aacde3c65315de5031ec191ce46604304d2446e803d71ade03308d970" dependencies = [ "proc-macro2", "quote", @@ -578,15 +590,15 @@ [[package]] name = "unicode-ident" -version = "1.0.8" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5464a87b239f13a63a501f2701565754bae92d243d4bb7eb12f6d57d2269bf4" +checksum = "301abaae475aa91687eb82514b328ab47a211a533026cb25fc3e519b86adfc3c" [[package]] name = "universal-hash" -version = "0.5.0" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d3160b73c9a19f7e2939a2fdad446c57c1bbbbf4d919d3213ff1267a580d8b5" +checksum = "fc1de2c688dc15305988b563c3854064043356019f97a4b46276fe734c4f07ea" dependencies = [ "crypto-common", "subtle", @@ -606,9 +618,9 @@ [[package]] name = "x25519-dalek" -version = "2.0.0-rc.2" +version = "2.0.0-rc.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fabd6e16dd08033932fc3265ad4510cc2eab24656058a6dcb107ffe274abcc95" +checksum = "ec7fae07da688e17059d5886712c933bb0520f15eff2e09cfa18e30968f4e63a" dependencies = [ "curve25519-dalek", "rand_core", @@ -625,6 +637,6 @@ [[package]] name = "zeroize" -version = "1.5.7" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c394b5bd0c6f669e7275d9c20aa90ae064cb22e75a1cad54e1b34088034b149f" +checksum = "2a0956f1ba7c7909bfb66c2e9e4124ab6f6482560f6628b5aaeba39207c9aad9"
diff --git a/nearby/presence/ldt_np_adv/fuzz/Cargo.lock b/nearby/presence/ldt_np_adv/fuzz/Cargo.lock index 92f2deb..5050ad0 100644 --- a/nearby/presence/ldt_np_adv/fuzz/Cargo.lock +++ b/nearby/presence/ldt_np_adv/fuzz/Cargo.lock
@@ -4,9 +4,9 @@ [[package]] name = "aead" -version = "0.5.1" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c192eb8f11fc081b0fe4259ba5af04217d4e0faddd02417310a927911abd7c8" +checksum = "d122413f284cf2d62fb1b7db97e02edb8cda96d769b16e443a4f6195e35662b0" dependencies = [ "bytes", "crypto-common", @@ -15,9 +15,9 @@ [[package]] name = "aes" -version = "0.8.2" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "433cfd6710c9986c576a25ca913c39d66a6474107b406f34f91d4a8923395241" +checksum = "ac1f845298e95f983ff1944b728ae08b8cebab80d684f0a832ed0fc74dfa27e2" dependencies = [ "cfg-if", "cipher", @@ -73,9 +73,9 @@ [[package]] name = "block-padding" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a90ec2df9600c28a01c56c4784c9207a96d2451833aeceb8cc97e4c9548bb78" +checksum = "a8894febbff9f758034a5b8e12d87918f56dfc64a8e1fe757d65e29041538d93" dependencies = [ "generic-array", ] @@ -122,24 +122,24 @@ [[package]] name = "const-oid" -version = "0.9.2" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "520fbf3c07483f94e3e3ca9d0cfd913d7718ef2483d2cfd91c0d9e91474ab913" +checksum = "795bc6e66a8e340f075fcf6227e417a2dc976b92b91f3cdc778bb858778b6747" [[package]] name = "cpufeatures" -version = "0.2.5" +version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28d997bd5e24a5928dd43e46dc529867e207907fe0b239c3477d924f7f2ca320" +checksum = "a17b76ff3a4162b0b27f354a0c87015ddad39d35f9c0c36607a3bdd175dde1f1" dependencies = [ "libc", ] [[package]] name = "crypto-bigint" -version = "0.5.1" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c2538c4e68e52548bacb3e83ac549f903d44f011ac9d5abb5e132e67d0808f7" +checksum = "cf4c2f4e1afd912bc40bfd6fed5d9dc1f288e0ba01bfcc835cc5bc3eb13efe15" dependencies = [ "generic-array", "rand_core", @@ -197,23 +197,36 @@ [[package]] name = "curve25519-dalek" -version = "4.0.0-rc.2" +version = "4.0.0-rc.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03d928d978dbec61a1167414f5ec534f24bea0d7a0d24dd9b6233d3d8223e585" +checksum = "436ace70fc06e06f7f689d2624dc4e2f0ea666efb5aa704215f7249ae6e047a7" dependencies = [ "cfg-if", + "cpufeatures", + "curve25519-dalek-derive", "digest", "fiat-crypto", - "packed_simd_2", "platforms", + "rustc_version", "subtle", ] [[package]] -name = "der" -version = "0.7.1" +name = "curve25519-dalek-derive" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc906908ea6458456e5eaa160a9c08543ec3d1e6f71e2235cedd660cb65f9df0" +checksum = "83fdaf97f4804dcebfa5862639bc9ce4121e82140bec2a987ac5140294865b5b" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "der" +version = "0.7.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c7ed52955ce76b1554f509074bb357d3fb8ac9b51288a65a3fd480d1dfba946" dependencies = [ "const-oid", "zeroize", @@ -221,9 +234,9 @@ [[package]] name = "derive_arbitrary" -version = "1.3.0" +version = "1.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3cdeb9ec472d588e539a818b2dee436825730da08ad0017c4b1a17676bdc8b7" +checksum = "53e0efad4403bfc52dc201159c4b842a246a14b98c64b55dfd0f2d89729dfeb8" dependencies = [ "proc-macro2", "quote", @@ -232,9 +245,9 @@ [[package]] name = "digest" -version = "0.10.6" +version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8168378f4e5023e7218c89c891c0fd8ecdb5e5e4f18cb78f38cf245dd021e76f" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ "block-buffer", "crypto-common", @@ -252,9 +265,9 @@ [[package]] name = "ed25519-dalek" -version = "2.0.0-rc.2" +version = "2.0.0-rc.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "798f704d128510932661a3489b08e3f4c934a01d61c5def59ae7b8e48f19665a" +checksum = "faa8e9049d5d72bfc12acbc05914731b5322f79b5e2f195e9f2d705fca22ab4c" dependencies = [ "curve25519-dalek", "ed25519", @@ -264,9 +277,9 @@ [[package]] name = "elliptic-curve" -version = "0.13.2" +version = "0.13.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ea5a92946e8614bb585254898bb7dd1ddad241ace60c52149e3765e34cc039d" +checksum = "968405c8fdc9b3bf4df0a6638858cc0b52462836ab6b1c87377785dd09cf1c0b" dependencies = [ "base16ct", "crypto-bigint", @@ -299,9 +312,9 @@ [[package]] name = "generic-array" -version = "0.14.6" +version = "0.14.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bff49e947297f3312447abdca79f45f4738097cc82b06e72054d2223f601f1b9" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" dependencies = [ "typenum", "version_check", @@ -310,9 +323,9 @@ [[package]] name = "getrandom" -version = "0.2.8" +version = "0.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c05aeb6a22b8f62540c194aac980f2115af067bfe15a0734d7277a768d396b31" +checksum = "be4136b2a15dd319360be1c07d9933517ccf0be8f16bf62a3bee4f0d618df427" dependencies = [ "cfg-if", "libc", @@ -409,9 +422,9 @@ [[package]] name = "libc" -version = "0.2.140" +version = "0.2.147" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99227334921fae1a979cf0bfdfcc6b3e5ce376ef57e16fb6fb3ea2ed6095f80c" +checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3" [[package]] name = "libfuzzer-sys" @@ -425,12 +438,6 @@ ] [[package]] -name = "libm" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fc7aa29613bd6a620df431842069224d8bc9011086b1db4c0e0cd47fa03ec9a" - -[[package]] name = "np_hkdf" version = "0.1.0" dependencies = [ @@ -441,9 +448,9 @@ [[package]] name = "once_cell" -version = "1.17.1" +version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7e5500299e16ebb147ae15a00a942af264cf3688f47923b8fc2cd5858f23ad3" +checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" [[package]] name = "opaque-debug" @@ -453,25 +460,15 @@ [[package]] name = "p256" -version = "0.13.0" +version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7270da3e5caa82afd3deb054cc237905853813aea3859544bc082c3fe55b8d47" +checksum = "c9863ad85fa8f4460f9c48cb909d38a0d689dba1f6f6988a5e3e0d31071bcd4b" dependencies = [ "elliptic-curve", "primeorder", ] [[package]] -name = "packed_simd_2" -version = "0.3.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1914cd452d8fccd6f9db48147b29fd4ae05bea9dc5d9ad578509f72415de282" -dependencies = [ - "cfg-if", - "libm", -] - -[[package]] name = "platforms" version = "3.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -479,9 +476,9 @@ [[package]] name = "polyval" -version = "0.6.0" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ef234e08c11dfcb2e56f79fd70f6f2eb7f025c0ce2333e82f4f0518ecad30c6" +checksum = "d52cff9d1d4dee5fe6d03729099f4a310a41179e0a10dbf542039873f2e826fb" dependencies = [ "cfg-if", "cpufeatures", @@ -497,27 +494,27 @@ [[package]] name = "primeorder" -version = "0.13.0" +version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7613fdcc0831c10060fa69833ea8fa2caa94b6456f51e25356a885b530a2e3d0" +checksum = "3c2fcef82c0ec6eefcc179b978446c399b3cdf73c392c35604e399eee6df1ee3" dependencies = [ "elliptic-curve", ] [[package]] name = "proc-macro2" -version = "1.0.53" +version = "1.0.66" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba466839c78239c09faf015484e5cc04860f88242cff4d03eb038f04b4699b73" +checksum = "18fb31db3f9bddb2ea821cde30a9f70117e3f119938b5ee630b7403aa6e2ead9" dependencies = [ "unicode-ident", ] [[package]] name = "quote" -version = "1.0.26" +version = "1.0.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4424af4bf778aae2051a77b60283332f386554255d722233d09fbfc7e30da2fc" +checksum = "5fe8a65d69dd0808184ebb5f836ab526bb259db23c657efa38711b1072ee47f0" dependencies = [ "proc-macro2", ] @@ -551,10 +548,19 @@ ] [[package]] -name = "sec1" -version = "0.7.1" +name = "rustc_version" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48518a2b5775ba8ca5b46596aae011caa431e6ce7e4a67ead66d92f08884220e" +checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" +dependencies = [ + "semver", +] + +[[package]] +name = "sec1" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" dependencies = [ "base16ct", "der", @@ -564,10 +570,16 @@ ] [[package]] -name = "sha2" -version = "0.10.6" +name = "semver" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82e6b795fe2e3b1e845bafcb27aa35405c4d47cdfc92af5fc8d3002f76cebdc0" +checksum = "b0293b4b29daaf487284529cc2f5675b8e57c61f70167ba415a463651fd6a918" + +[[package]] +name = "sha2" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "479fb9d862239e610720565ca91403019f2f00410f1864c5aa7479b950a76ed8" dependencies = [ "cfg-if", "cpufeatures", @@ -582,15 +594,15 @@ [[package]] name = "subtle" -version = "2.4.1" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" +checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" [[package]] name = "syn" -version = "1.0.109" +version = "2.0.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +checksum = "45c3457aacde3c65315de5031ec191ce46604304d2446e803d71ade03308d970" dependencies = [ "proc-macro2", "quote", @@ -605,15 +617,15 @@ [[package]] name = "unicode-ident" -version = "1.0.8" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5464a87b239f13a63a501f2701565754bae92d243d4bb7eb12f6d57d2269bf4" +checksum = "301abaae475aa91687eb82514b328ab47a211a533026cb25fc3e519b86adfc3c" [[package]] name = "universal-hash" -version = "0.5.0" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d3160b73c9a19f7e2939a2fdad446c57c1bbbbf4d919d3213ff1267a580d8b5" +checksum = "fc1de2c688dc15305988b563c3854064043356019f97a4b46276fe734c4f07ea" dependencies = [ "crypto-common", "subtle", @@ -633,9 +645,9 @@ [[package]] name = "x25519-dalek" -version = "2.0.0-rc.2" +version = "2.0.0-rc.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fabd6e16dd08033932fc3265ad4510cc2eab24656058a6dcb107ffe274abcc95" +checksum = "ec7fae07da688e17059d5886712c933bb0520f15eff2e09cfa18e30968f4e63a" dependencies = [ "curve25519-dalek", "rand_core", @@ -652,6 +664,6 @@ [[package]] name = "zeroize" -version = "1.5.7" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c394b5bd0c6f669e7275d9c20aa90ae064cb22e75a1cad54e1b34088034b149f" +checksum = "2a0956f1ba7c7909bfb66c2e9e4124ab6f6482560f6628b5aaeba39207c9aad9"
diff --git a/nearby/presence/ldt_np_adv_ffi/.cargo/config-boringssl.toml b/nearby/presence/ldt_np_adv_ffi/.cargo/config-boringssl.toml index f5ab7fa..5a4a047 100644 --- a/nearby/presence/ldt_np_adv_ffi/.cargo/config-boringssl.toml +++ b/nearby/presence/ldt_np_adv_ffi/.cargo/config-boringssl.toml
@@ -1,3 +1,3 @@ paths = [ "../../../boringssl-build/boringssl/rust/bssl-crypto", -] \ No newline at end of file +]
diff --git a/nearby/presence/ldt_np_adv_ffi/Cargo.lock b/nearby/presence/ldt_np_adv_ffi/Cargo.lock index e58cea8..1d13887 100644 --- a/nearby/presence/ldt_np_adv_ffi/Cargo.lock +++ b/nearby/presence/ldt_np_adv_ffi/Cargo.lock
@@ -3,12 +3,6 @@ version = 3 [[package]] -name = "Inflector" -version = "0.11.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe438c63458706e03479442743baae6c88256498e6431708f6dfc520a26515d3" - -[[package]] name = "aead" version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -21,9 +15,9 @@ [[package]] name = "aes" -version = "0.8.2" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "433cfd6710c9986c576a25ca913c39d66a6474107b406f34f91d4a8923395241" +checksum = "ac1f845298e95f983ff1944b728ae08b8cebab80d684f0a832ed0fc74dfa27e2" dependencies = [ "cfg-if", "cipher", @@ -144,24 +138,24 @@ [[package]] name = "const-oid" -version = "0.9.2" +version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "520fbf3c07483f94e3e3ca9d0cfd913d7718ef2483d2cfd91c0d9e91474ab913" +checksum = "6340df57935414636969091153f35f68d9f00bbc8fb4a9c6054706c213e6c6bc" [[package]] name = "cpufeatures" -version = "0.2.6" +version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "280a9f2d8b3a38871a3c8a46fb80db65e5e5ed97da80c4d08bf27fb63e35e181" +checksum = "03e69e28e9f7f77debdedbaafa2866e1de9ba56df55a8bd7cfc724c25a09987c" dependencies = [ "libc", ] [[package]] name = "crypto-bigint" -version = "0.5.1" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c2538c4e68e52548bacb3e83ac549f903d44f011ac9d5abb5e132e67d0808f7" +checksum = "cf4c2f4e1afd912bc40bfd6fed5d9dc1f288e0ba01bfcc835cc5bc3eb13efe15" dependencies = [ "generic-array", "rand_core", @@ -246,24 +240,37 @@ [[package]] name = "curve25519-dalek" -version = "4.0.0-rc.2" +version = "4.0.0-rc.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03d928d978dbec61a1167414f5ec534f24bea0d7a0d24dd9b6233d3d8223e585" +checksum = "436ace70fc06e06f7f689d2624dc4e2f0ea666efb5aa704215f7249ae6e047a7" dependencies = [ "cfg-if", + "cpufeatures", + "curve25519-dalek-derive", "digest", "fiat-crypto", - "packed_simd_2", "platforms", + "rustc_version", "subtle", "zeroize", ] [[package]] -name = "der" -version = "0.7.3" +name = "curve25519-dalek-derive" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82b10af9f9f9f2134a42d3f8aa74658660f2e0234b0eb81bd171df8aa32779ed" +checksum = "83fdaf97f4804dcebfa5862639bc9ce4121e82140bec2a987ac5140294865b5b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.22", +] + +[[package]] +name = "der" +version = "0.7.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c7ed52955ce76b1554f509074bb357d3fb8ac9b51288a65a3fd480d1dfba946" dependencies = [ "const-oid", "zeroize", @@ -271,9 +278,9 @@ [[package]] name = "digest" -version = "0.10.6" +version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8168378f4e5023e7218c89c891c0fd8ecdb5e5e4f18cb78f38cf245dd021e76f" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ "block-buffer", "crypto-common", @@ -292,9 +299,9 @@ [[package]] name = "ed25519-dalek" -version = "2.0.0-rc.2" +version = "2.0.0-rc.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "798f704d128510932661a3489b08e3f4c934a01d61c5def59ae7b8e48f19665a" +checksum = "faa8e9049d5d72bfc12acbc05914731b5322f79b5e2f195e9f2d705fca22ab4c" dependencies = [ "curve25519-dalek", "ed25519", @@ -306,9 +313,9 @@ [[package]] name = "elliptic-curve" -version = "0.13.3" +version = "0.13.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22cdacd4d6ed3f9b98680b679c0e52a823b8a2c7a97358d508fe247f2180c282" +checksum = "968405c8fdc9b3bf4df0a6638858cc0b52462836ab6b1c87377785dd09cf1c0b" dependencies = [ "base16ct", "crypto-bigint", @@ -367,9 +374,9 @@ [[package]] name = "getrandom" -version = "0.2.9" +version = "0.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c85e1d9ab2eadba7e5040d4e09cbd6d072b76a557ad64e797c2cb9d4da21d7e4" +checksum = "be4136b2a15dd319360be1c07d9933517ccf0be8f16bf62a3bee4f0d618df427" dependencies = [ "cfg-if", "libc", @@ -388,6 +395,12 @@ ] [[package]] +name = "heck" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" + +[[package]] name = "hkdf" version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -472,9 +485,9 @@ [[package]] name = "libc" -version = "0.2.141" +version = "0.2.147" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3304a64d199bb964be99741b7a14d26972741915b3649639149b2479bb46f4b5" +checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3" [[package]] name = "libc_alloc" @@ -483,16 +496,10 @@ checksum = "6a090348b66d90d8507e30f0d2bd88e5a5c454bd1733fc6d617cbc3471bf69ea" [[package]] -name = "libm" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fc7aa29613bd6a620df431842069224d8bc9011086b1db4c0e0cd47fa03ec9a" - -[[package]] name = "lock_api" -version = "0.4.9" +version = "0.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "435011366fe56583b16cf956f9df0095b405b82d76425bc8981c0e22e60ec4df" +checksum = "c1cc9717a20b1bb222f333e6a92fd32f7d8a18ddc5a3191a11af45dcbf4dcd16" dependencies = [ "autocfg", "scopeguard", @@ -509,9 +516,9 @@ [[package]] name = "once_cell" -version = "1.17.1" +version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7e5500299e16ebb147ae15a00a942af264cf3688f47923b8fc2cd5858f23ad3" +checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" [[package]] name = "opaque-debug" @@ -521,9 +528,9 @@ [[package]] name = "openssl" -version = "0.10.49" +version = "0.10.55" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d2f106ab837a24e03672c59b1239669a0596406ff657c3c0835b6b7f0f35a33" +checksum = "345df152bc43501c5eb9e4654ff05f794effb78d4efe3d53abc158baddc0703d" dependencies = [ "bitflags", "cfg-if", @@ -542,14 +549,14 @@ dependencies = [ "proc-macro2", "quote", - "syn 2.0.13", + "syn 2.0.22", ] [[package]] name = "openssl-sys" -version = "0.9.84" +version = "0.9.90" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a20eace9dc2d82904039cb76dcf50fb1a0bba071cfd1629720b5d6f1ddba0fa" +checksum = "374533b0e45f3a7ced10fcaeccca020e66656bc03dac384f852e4e5a7a8104a6" dependencies = [ "cc", "libc", @@ -559,48 +566,39 @@ [[package]] name = "ouroboros" -version = "0.15.6" +version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1358bd1558bd2a083fed428ffeda486fbfb323e698cdda7794259d592ca72db" +checksum = "d813b7b31a82efae94bd30ffaac09aec85efc18db2d5ec3aead1a220ee954351" dependencies = [ "aliasable", "ouroboros_macro", + "static_assertions", ] [[package]] name = "ouroboros_macro" -version = "0.15.6" +version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f7d21ccd03305a674437ee1248f3ab5d4b1db095cf1caf49f1713ddf61956b7" +checksum = "5a56f651b4dd45ae3ac3d260ced32eaf0620cddaae5f26c69b554a9016594726" dependencies = [ - "Inflector", + "heck", "proc-macro-error", "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.22", ] [[package]] name = "p256" -version = "0.13.0" +version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7270da3e5caa82afd3deb054cc237905853813aea3859544bc082c3fe55b8d47" +checksum = "c9863ad85fa8f4460f9c48cb909d38a0d689dba1f6f6988a5e3e0d31071bcd4b" dependencies = [ "elliptic-curve", "primeorder", ] [[package]] -name = "packed_simd_2" -version = "0.3.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1914cd452d8fccd6f9db48147b29fd4ae05bea9dc5d9ad578509f72415de282" -dependencies = [ - "cfg-if", - "libm", -] - -[[package]] name = "panic-abort" version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -618,9 +616,9 @@ [[package]] name = "pkg-config" -version = "0.3.26" +version = "0.3.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ac9a59f73473f1b8d852421e59e64809f025994837ef743615c6d0c5b305160" +checksum = "26072860ba924cbfa98ea39c8c19b4dd6a4a25423dbdf219c1eca91aa0cf6964" [[package]] name = "platforms" @@ -630,9 +628,9 @@ [[package]] name = "polyval" -version = "0.6.0" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ef234e08c11dfcb2e56f79fd70f6f2eb7f025c0ce2333e82f4f0518ecad30c6" +checksum = "d52cff9d1d4dee5fe6d03729099f4a310a41179e0a10dbf542039873f2e826fb" dependencies = [ "cfg-if", "cpufeatures", @@ -648,9 +646,9 @@ [[package]] name = "primeorder" -version = "0.13.0" +version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7613fdcc0831c10060fa69833ea8fa2caa94b6456f51e25356a885b530a2e3d0" +checksum = "3c2fcef82c0ec6eefcc179b978446c399b3cdf73c392c35604e399eee6df1ee3" dependencies = [ "elliptic-curve", ] @@ -681,18 +679,18 @@ [[package]] name = "proc-macro2" -version = "1.0.56" +version = "1.0.63" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b63bdb0cd06f1f4dedf69b254734f9b45af66e4a031e42a7480257d9898b435" +checksum = "7b368fba921b0dce7e60f5e04ec15e565b3303972b42bcfde1d0713b881959eb" dependencies = [ "unicode-ident", ] [[package]] name = "quote" -version = "1.0.26" +version = "1.0.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4424af4bf778aae2051a77b60283332f386554255d722233d09fbfc7e30da2fc" +checksum = "573015e8ab27661678357f27dc26460738fd2b6c86e46f386fde94cb5d913105" dependencies = [ "proc-macro2", ] @@ -728,6 +726,15 @@ ] [[package]] +name = "rustc_version" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" +dependencies = [ + "semver", +] + +[[package]] name = "scopeguard" version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -735,9 +742,9 @@ [[package]] name = "sec1" -version = "0.7.1" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48518a2b5775ba8ca5b46596aae011caa431e6ce7e4a67ead66d92f08884220e" +checksum = "f0aec48e813d6b90b15f0b8948af3c63483992dee44c03e9930b3eebdabe046e" dependencies = [ "base16ct", "der", @@ -747,16 +754,22 @@ ] [[package]] -name = "serde" -version = "1.0.159" +name = "semver" +version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c04e8343c3daeec41f58990b9d77068df31209f2af111e059e9fe9646693065" +checksum = "bebd363326d05ec3e2f532ab7660680f3b02130d780c299bca73469d521bc0ed" + +[[package]] +name = "serde" +version = "1.0.164" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e8c8cf938e98f769bc164923b06dce91cea1751522f46f8466461af04c9027d" [[package]] name = "sha2" -version = "0.10.6" +version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82e6b795fe2e3b1e845bafcb27aa35405c4d47cdfc92af5fc8d3002f76cebdc0" +checksum = "479fb9d862239e610720565ca91403019f2f00410f1864c5aa7479b950a76ed8" dependencies = [ "cfg-if", "cpufeatures", @@ -786,19 +799,25 @@ [[package]] name = "spki" -version = "0.7.1" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37a5be806ab6f127c3da44b7378837ebf01dadca8510a0e572460216b228bd0e" +checksum = "9d1e996ef02c474957d681f1b05213dfb0abab947b446a62d37770b23500184a" dependencies = [ "base64ct", "der", ] [[package]] -name = "subtle" -version = "2.4.1" +name = "static_assertions" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + +[[package]] +name = "subtle" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" [[package]] name = "syn" @@ -807,15 +826,14 @@ checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" dependencies = [ "proc-macro2", - "quote", "unicode-ident", ] [[package]] name = "syn" -version = "2.0.13" +version = "2.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c9da457c5285ac1f936ebd076af6dac17a61cfe7826f2076b4d015cf47bc8ec" +checksum = "2efbeae7acf4eabd6bcdcbd11c92f45231ddda7539edc7806bd1a04a03b24616" dependencies = [ "proc-macro2", "quote", @@ -830,15 +848,15 @@ [[package]] name = "unicode-ident" -version = "1.0.8" +version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5464a87b239f13a63a501f2701565754bae92d243d4bb7eb12f6d57d2269bf4" +checksum = "b15811caf2415fb889178633e7724bad2509101cde276048e013b9def5e51fa0" [[package]] name = "universal-hash" -version = "0.5.0" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d3160b73c9a19f7e2939a2fdad446c57c1bbbbf4d919d3213ff1267a580d8b5" +checksum = "fc1de2c688dc15305988b563c3854064043356019f97a4b46276fe734c4f07ea" dependencies = [ "crypto-common", "subtle", @@ -864,9 +882,9 @@ [[package]] name = "x25519-dalek" -version = "2.0.0-rc.2" +version = "2.0.0-rc.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fabd6e16dd08033932fc3265ad4510cc2eab24656058a6dcb107ffe274abcc95" +checksum = "ec7fae07da688e17059d5886712c933bb0520f15eff2e09cfa18e30968f4e63a" dependencies = [ "curve25519-dalek", "rand_core",
diff --git a/nearby/presence/ldt_np_adv_ffi/deny.toml b/nearby/presence/ldt_np_adv_ffi/deny.toml index 07381d1..ca51e11 100644 --- a/nearby/presence/ldt_np_adv_ffi/deny.toml +++ b/nearby/presence/ldt_np_adv_ffi/deny.toml
@@ -79,6 +79,7 @@ "MIT", "Apache-2.0", "BSD-3-Clause", + "Unicode-DFS-2016", ] # List of explicitly disallowed licenses # See https://spdx.org/licenses/ for list of possible licenses
diff --git a/nearby/presence/ldt_np_adv_ffi_fuzz/CMakeLists.txt b/nearby/presence/ldt_np_adv_ffi_fuzz/CMakeLists.txt index 3282533..2144811 100644 --- a/nearby/presence/ldt_np_adv_ffi_fuzz/CMakeLists.txt +++ b/nearby/presence/ldt_np_adv_ffi_fuzz/CMakeLists.txt
@@ -15,10 +15,10 @@ cmake_minimum_required(VERSION 3.0) # libfuzzer needs clang -SET (CMAKE_C_COMPILER "clang") +SET(CMAKE_C_COMPILER "clang") include_directories( - ${CMAKE_SOURCE_DIR}/ldt_np_adv_ffi/include/) + ${CMAKE_SOURCE_DIR}/ldt_np_adv_ffi/include/) # enable fuzzer with ASAN # Can't use MSAN since EVP_KDF_fetch seems to read uninitialized memory, maybe on purpose? @@ -26,22 +26,22 @@ # we need at least version 3.0.5 for the core.h header used in the fuzzers find_package(OpenSSL 3.0.5 REQUIRED) -if ( OPENSSL_FOUND ) +if (OPENSSL_FOUND) message(STATUS "OpenSSL Found: ${OPENSSL_VERSION}") message(STATUS "OpenSSL Include: ${OPENSSL_INCLUDE_DIR}") message(STATUS "OpenSSL Libraries: ${OPENSSL_LIBRARIES}") -endif() +endif () add_executable(fuzzer_decrypt_bad_mac src/fuzzer_decrypt_bad_mac.c) target_link_libraries(fuzzer_decrypt_bad_mac - optimized "${CMAKE_SOURCE_DIR}/ldt_np_adv_ffi/target/release/${CMAKE_STATIC_LIBRARY_PREFIX}ldt_np_adv_ffi${CMAKE_STATIC_LIBRARY_SUFFIX}" - debug "${CMAKE_SOURCE_DIR}/ldt_np_adv_ffi/target/debug/${CMAKE_STATIC_LIBRARY_PREFIX}ldt_np_adv_ffi${CMAKE_STATIC_LIBRARY_SUFFIX}" - dl pthread -fsanitize=fuzzer,address) + optimized "${CMAKE_SOURCE_DIR}/ldt_np_adv_ffi/target/release/${CMAKE_STATIC_LIBRARY_PREFIX}ldt_np_adv_ffi${CMAKE_STATIC_LIBRARY_SUFFIX}" + debug "${CMAKE_SOURCE_DIR}/ldt_np_adv_ffi/target/debug/${CMAKE_STATIC_LIBRARY_PREFIX}ldt_np_adv_ffi${CMAKE_STATIC_LIBRARY_SUFFIX}" + dl pthread -fsanitize=fuzzer,address) target_link_libraries(fuzzer_decrypt_bad_mac OpenSSL::SSL) add_executable(fuzzer_decrypt_correct_mac src/fuzzer_decrypt_correct_mac.c) target_link_libraries(fuzzer_decrypt_correct_mac - optimized "${CMAKE_SOURCE_DIR}/ldt_np_adv_ffi/target/release/${CMAKE_STATIC_LIBRARY_PREFIX}ldt_np_adv_ffi${CMAKE_STATIC_LIBRARY_SUFFIX}" - debug "${CMAKE_SOURCE_DIR}/ldt_np_adv_ffi/target/debug/${CMAKE_STATIC_LIBRARY_PREFIX}ldt_np_adv_ffi${CMAKE_STATIC_LIBRARY_SUFFIX}" - dl pthread -fsanitize=fuzzer,address) + optimized "${CMAKE_SOURCE_DIR}/ldt_np_adv_ffi/target/release/${CMAKE_STATIC_LIBRARY_PREFIX}ldt_np_adv_ffi${CMAKE_STATIC_LIBRARY_SUFFIX}" + debug "${CMAKE_SOURCE_DIR}/ldt_np_adv_ffi/target/debug/${CMAKE_STATIC_LIBRARY_PREFIX}ldt_np_adv_ffi${CMAKE_STATIC_LIBRARY_SUFFIX}" + dl pthread -fsanitize=fuzzer,address) target_link_libraries(fuzzer_decrypt_correct_mac OpenSSL::SSL)
diff --git a/nearby/presence/ldt_np_c_sample/CMakeLists.txt b/nearby/presence/ldt_np_c_sample/CMakeLists.txt index 4341c3e..588078a 100644 --- a/nearby/presence/ldt_np_c_sample/CMakeLists.txt +++ b/nearby/presence/ldt_np_c_sample/CMakeLists.txt
@@ -12,8 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -cmake_minimum_required(VERSION 3.0) - include_directories( ${CMAKE_SOURCE_DIR}/ldt_np_adv_ffi/include/ ${CMAKE_SOURCE_DIR}/ldt_np_c_sample/) @@ -28,13 +26,28 @@ BINARY_DIR "${CMAKE_SOURCE_DIR}/ldt_np_adv_ffi" INSTALL_COMMAND "") -add_executable(sample main.c) -target_link_libraries(sample +add_executable(ldt_c_sample main.c) +target_link_libraries( + ldt_c_sample optimized "${CMAKE_SOURCE_DIR}/ldt_np_adv_ffi/target/release/${CMAKE_STATIC_LIBRARY_PREFIX}ldt_np_adv_ffi${CMAKE_STATIC_LIBRARY_SUFFIX}" debug "${CMAKE_SOURCE_DIR}/ldt_np_adv_ffi/target/debug/${CMAKE_STATIC_LIBRARY_PREFIX}ldt_np_adv_ffi${CMAKE_STATIC_LIBRARY_SUFFIX}" - dl pthread) + OpenSSL::SSL +) + +if(UNIX) + target_link_libraries( + ldt_c_sample + dl pthread + ) +elseif(MSVC) + target_link_libraries( + ldt_c_sample + bcrypt ntdll userenv ws2_32 + ) +endif() + if(ENABLE_TESTS) - message(STATUS "Building tests") + message(STATUS "Enabling ldt tests") add_subdirectory(tests) endif()
diff --git a/nearby/presence/ldt_np_c_sample/tests/CMakeLists.txt b/nearby/presence/ldt_np_c_sample/tests/CMakeLists.txt index 2f0818d..6edfd63 100644 --- a/nearby/presence/ldt_np_c_sample/tests/CMakeLists.txt +++ b/nearby/presence/ldt_np_c_sample/tests/CMakeLists.txt
@@ -12,67 +12,56 @@ # See the License for the specific language governing permissions and # limitations under the License. -cmake_minimum_required(VERSION 3.14) - -# GoogleTest requires at least C++14 -set(CMAKE_CXX_STANDARD 14) -add_compile_options(-Wall -Wextra -Wimplicit-fallthrough -Wextra-semi - -Wno-missing-field-initializers -Wno-unused-parameter -Wno-psabi - -Wno-unneeded-internal-declaration - -Wno-ignored-pragma-optimize - -Wno-bitfield-constant-conversion -Wno-deprecated-this-capture -Wshadow - -Wsign-compare) - -include(FetchContent) -FetchContent_Declare( - googletest - GIT_REPOSITORY https://github.com/google/googletest.git - GIT_TAG release-1.12.1 -) -FetchContent_MakeAvailable(googletest) -enable_testing() - - -find_package(benchmark REQUIRED) -add_compile_options(-fsanitize=address) - file(COPY ${CMAKE_SOURCE_DIR}/ldt_np_adv/resources/test/np_adv_test_vectors.json DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) -set(JSONCPP_DIR ${CMAKE_SOURCE_DIR}/../../third_party/jsoncpp) -include_directories(${JSONCPP_DIR}) - -add_library( - jsoncpp - ${JSONCPP_DIR}/jsoncpp.cpp -) - add_executable( - np_ffi_tests - np_ffi_tests.cc -) - -add_executable( - benchmarks - benchmarks.cc + ldt_ffi_tests + ldt_ffi_tests.cc ) target_link_libraries( - benchmarks - "${CMAKE_SOURCE_DIR}/ldt_np_adv_ffi/target/release/${CMAKE_STATIC_LIBRARY_PREFIX}ldt_np_adv_ffi${CMAKE_STATIC_LIBRARY_SUFFIX}" - OpenSSL::SSL - benchmark::benchmark - dl pthread -fsanitize=address -) - -target_link_libraries( - np_ffi_tests + ldt_ffi_tests "${CMAKE_SOURCE_DIR}/ldt_np_adv_ffi/target/release/${CMAKE_STATIC_LIBRARY_PREFIX}ldt_np_adv_ffi${CMAKE_STATIC_LIBRARY_SUFFIX}" jsoncpp GTest::gtest_main OpenSSL::SSL - dl pthread -fsanitize=address +) +if(UNIX) + target_link_libraries( + ldt_ffi_tests + dl pthread -fsanitize=address + ) +elseif(MSVC) + target_link_libraries( + ldt_ffi_tests + bcrypt ntdll userenv ws2_32 + ) +endif() + +gtest_discover_tests(ldt_ffi_tests) + +# Benchmarks +add_executable( + ldt_benchmarks + ldt_benchmarks.cc ) -include(GoogleTest) -gtest_discover_tests(np_ffi_tests) +target_link_libraries( + ldt_benchmarks + "${CMAKE_SOURCE_DIR}/ldt_np_adv_ffi/target/release/${CMAKE_STATIC_LIBRARY_PREFIX}ldt_np_adv_ffi${CMAKE_STATIC_LIBRARY_SUFFIX}" + benchmark::benchmark + OpenSSL::SSL +) + +if(UNIX) + target_link_libraries( + ldt_benchmarks + dl pthread -fsanitize=address + ) +elseif(MSVC) + target_link_libraries( + ldt_benchmarks + bcrypt ntdll userenv ws2_32 + ) +endif()
diff --git a/nearby/presence/ldt_np_c_sample/tests/benchmarks.cc b/nearby/presence/ldt_np_c_sample/tests/ldt_benchmarks.cc similarity index 100% rename from nearby/presence/ldt_np_c_sample/tests/benchmarks.cc rename to nearby/presence/ldt_np_c_sample/tests/ldt_benchmarks.cc
diff --git a/nearby/presence/ldt_np_c_sample/tests/ldt_ffi_tests.cc b/nearby/presence/ldt_np_c_sample/tests/ldt_ffi_tests.cc new file mode 100644 index 0000000..e66af65 --- /dev/null +++ b/nearby/presence/ldt_np_c_sample/tests/ldt_ffi_tests.cc
@@ -0,0 +1,300 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include <gtest/gtest.h> +#include <json/json.h> + +extern "C" { +#include "np_ldt.h" +} + +#include <algorithm> +#include <fstream> + +// TODO: get multi threaded tests working on windows +#ifndef _WIN32 +#include <pthread.h> +#endif + +#ifdef LDT_TEST_VECTORS +static const char *PATH_TO_DATA_FILE = LDT_TEST_VECTORS; +#else +static const char *PATH_TO_DATA_FILE = "np_adv_test_vectors.json"; +#endif +static const uint8_t KEY_SEED_BYTES[] = { + 204, 219, 36, 137, 233, 252, 172, 66, 179, 147, 72, 184, 148, 30, 209, 154, + 29, 54, 14, 117, 224, 152, 200, 193, 94, 107, 28, 194, 182, 32, 205, 57}; +static const uint8_t KNOWN_HMAC_BYTES[] = { + 223, 185, 10, 31, 155, 31, 226, 141, 24, 187, 204, + 165, 34, 64, 181, 204, 44, 203, 95, 141, 82, 137, + 163, 203, 100, 235, 53, 65, 202, 97, 75, 180}; +static const uint8_t TEST_DATA_BYTES[] = {205, 104, 63, 225, 161, 209, 248, + 70, 84, 61, 10, 19, 212, 174, + 164, 0, 64, 200, 214, 123}; + +static NpLdtSalt salt = {{12, 15}}; + +static NpLdtEncryptHandle create_enc_handle_from_test_key() { + NpLdtKeySeed key_seed; + memcpy(key_seed.bytes, KEY_SEED_BYTES, 32); + + return NpLdtEncryptCreate(key_seed); +} + +static NpLdtDecryptHandle create_dec_handle_from_test_key() { + NpLdtKeySeed key_seed; + memcpy(key_seed.bytes, KEY_SEED_BYTES, 32); + + NpMetadataKeyHmac known_hmac; + memcpy(known_hmac.bytes, KNOWN_HMAC_BYTES, 32); + + return NpLdtDecryptCreate(key_seed, known_hmac); +} + +static void hex_string_to_bytes(const char *hexString, uint8_t *out, + size_t len) { + for (size_t count = 0; count < len; count++) { + sscanf(hexString, "%2hhx", &out[count]); // NOLINT(cert-err34-c) + hexString += 2; + } +} + +static void bytes_to_hex_string(uint8_t *data, char *out, size_t len) { + std::stringstream ss; + ss << std::hex; + for (size_t i = 0; i < len; ++i) + ss << std::setw(2) << std::setfill('0') << (int)data[i]; + + std::string result = ss.str(); + transform(result.begin(), result.end(), result.begin(), ::toupper); + strcpy(out, result.c_str()); +} + +// Run through JSON data with test cases generated by Rust tests. +// Using generated data for now because the C layer does not have the ability +// to generate the ldt_key and hmac_key from a key_seed, this is an +// implementation detail of the rust ldt library +TEST(LdtFfiTests, TestJsonData) { + Json::Value root; + Json::Reader reader; + std::ifstream test(PATH_TO_DATA_FILE); + bool parsingSuccessful = reader.parse(test, root, false); + if (!parsingSuccessful) { + std::cout << reader.getFormattedErrorMessages() << "\n"; + } + ASSERT_TRUE(root.size() == 1000); + + for (const auto &v : root) { + auto key_seed = v["key_seed"].asCString(); + auto metadata_key_hmac = v["metadata_key_hmac"].asCString(); + auto adv_salt = v["adv_salt"].asCString(); + auto plaintext = v["plaintext"].asCString(); + auto ciphertext = v["ciphertext"].asCString(); + + NpLdtKeySeed np_key_seed; + auto len = strlen(key_seed) / 2; + hex_string_to_bytes(key_seed, np_key_seed.bytes, len); + ASSERT_EQ(len, 32); + + NpMetadataKeyHmac known_hmac; + len = strlen(metadata_key_hmac) / 2; + hex_string_to_bytes(metadata_key_hmac, known_hmac.bytes, len); + ASSERT_EQ(len, 32); + + NpLdtEncryptHandle enc_handle = NpLdtEncryptCreate(np_key_seed); + ASSERT_TRUE(enc_handle.handle != 0); + + NpLdtSalt salt_data; + len = strlen(adv_salt) / 2; + hex_string_to_bytes(adv_salt, salt_data.bytes, len); + ASSERT_TRUE(len == 2); + + len = strlen(plaintext) / 2; + auto buffer = (uint8_t *)malloc(len); + hex_string_to_bytes(plaintext, buffer, len); + NP_LDT_RESULT result = NpLdtEncrypt(enc_handle, buffer, len, salt_data); + ASSERT_EQ(result, NP_LDT_SUCCESS); + + char *output = (char *)malloc(strlen(plaintext) + 1); + bytes_to_hex_string(buffer, output, len); + ASSERT_EQ(strcmp(output, ciphertext), 0); + + NpLdtDecryptHandle dec_handle = NpLdtDecryptCreate(np_key_seed, known_hmac); + ASSERT_TRUE(dec_handle.handle != 0); + + result = NpLdtDecryptAndVerify(dec_handle, buffer, len, salt_data); + ASSERT_EQ(result, NP_LDT_SUCCESS); + + result = NpLdtEncryptClose(enc_handle); + ASSERT_EQ(result, NP_LDT_SUCCESS); + + result = NpLdtDecryptClose(dec_handle); + ASSERT_EQ(result, NP_LDT_SUCCESS); + + bytes_to_hex_string(buffer, output, len); + ASSERT_EQ(strcmp(output, plaintext), 0); + free(buffer); + free(output); + } + test.close(); +} + +TEST(LdtFfiTests, TestValidLength) { + auto plaintext = (uint8_t *)malloc(20 * sizeof(uint8_t)); + memcpy(plaintext, TEST_DATA_BYTES, 20); + + NpLdtEncryptHandle enc_handle = create_enc_handle_from_test_key(); + ASSERT_TRUE(enc_handle.handle != 0); + + NP_LDT_RESULT result = NpLdtEncrypt(enc_handle, plaintext, 20, salt); + ASSERT_EQ(result, NP_LDT_SUCCESS); + + NpLdtDecryptHandle dec_handle = create_dec_handle_from_test_key(); + + result = NpLdtDecryptAndVerify(dec_handle, plaintext, 20, salt); + ASSERT_EQ(result, NP_LDT_SUCCESS); + free(plaintext); +} + +TEST(LdtFfiTests, TestEncryptInvalidLength) { + auto plaintext = (uint8_t *)malloc(32 * sizeof(uint8_t)); + memcpy(plaintext, TEST_DATA_BYTES, 20); + + NpLdtEncryptHandle enc_handle = create_enc_handle_from_test_key(); + ASSERT_TRUE(enc_handle.handle != 0); + + NP_LDT_RESULT result = NpLdtEncrypt(enc_handle, plaintext, 32, salt); + ASSERT_EQ(result, NP_LDT_ERROR_INVALID_LENGTH); + + result = NpLdtEncrypt(enc_handle, plaintext, 15, salt); + ASSERT_EQ(result, NP_LDT_ERROR_INVALID_LENGTH); + free(plaintext); +} + +TEST(LdtFfiTests, TestDecryptInvalidLength) { + auto plaintext = (uint8_t *)malloc(32 * sizeof(uint8_t)); + memcpy(plaintext, TEST_DATA_BYTES, 20); + + NpLdtDecryptHandle dec_handle = create_dec_handle_from_test_key(); + ASSERT_TRUE(dec_handle.handle != 0); + + NP_LDT_RESULT result = NpLdtDecryptAndVerify(dec_handle, plaintext, 32, salt); + ASSERT_EQ(result, NP_LDT_ERROR_INVALID_LENGTH); + + result = NpLdtDecryptAndVerify(dec_handle, plaintext, 15, salt); + ASSERT_EQ(result, NP_LDT_ERROR_INVALID_LENGTH); + free(plaintext); +} + +// We want to make sure no decryption is performed when the hmac is invalid +TEST(LdtFfiTests, TestDecryptMacMismatch) { + char test_text[] = "this text should not change!"; + auto plaintext = (uint8_t *)malloc(30 * sizeof(char)); + memcpy(plaintext, test_text, 29); + + NpLdtDecryptHandle dec_handle = create_dec_handle_from_test_key(); + ASSERT_TRUE(dec_handle.handle != 0); + + NP_LDT_RESULT result = NpLdtDecryptAndVerify(dec_handle, plaintext, 24, salt); + ASSERT_EQ(result, NP_LDT_ERROR_MAC_MISMATCH); + + ASSERT_EQ(strcmp((char *)plaintext, test_text), 0); + free(plaintext); +} + +TEST(LdtFfiTests, TestInvalidHandle) { + auto plaintext = (uint8_t *)malloc(20 * sizeof(uint8_t)); + memcpy(plaintext, TEST_DATA_BYTES, 20); + + NP_LDT_RESULT result = + NpLdtEncrypt(NpLdtEncryptHandle{1234}, plaintext, 20, salt); + ASSERT_EQ(result, NP_LDT_INVALID_HANDLE); + + result = NpLdtDecryptAndVerify(NpLdtDecryptHandle{1234}, plaintext, 20, salt); + ASSERT_EQ(result, NP_LDT_INVALID_HANDLE); + free(plaintext); + + result = NpLdtEncryptClose(NpLdtEncryptHandle{1234}); + ASSERT_EQ(result, NP_LDT_INVALID_HANDLE); + + result = NpLdtDecryptClose(NpLdtDecryptHandle{1234}); + ASSERT_EQ(result, NP_LDT_INVALID_HANDLE); +} + +#ifndef _WIN32 +pthread_mutex_t my_mutex = PTHREAD_MUTEX_INITIALIZER; +pthread_cond_t cond = PTHREAD_COND_INITIALIZER; + +void *worker_thread(void *arg) { + (void)arg; + pthread_mutex_lock(&my_mutex); + + pthread_cond_wait(&cond, &my_mutex); + pthread_mutex_unlock(&my_mutex); + + auto plaintext = (uint8_t *)malloc(20 * sizeof(uint8_t)); + memcpy(plaintext, TEST_DATA_BYTES, 20); + + NpLdtEncryptHandle enc_handle = create_enc_handle_from_test_key(); + if (enc_handle.handle == 0) { + printf("Error creating handle in thread!"); + free(plaintext); + exit(2); + } + + NP_LDT_RESULT result = NpLdtEncrypt(enc_handle, plaintext, 20, salt); + if (result != NP_LDT_SUCCESS) { + printf("Error in encrypt in thread!"); + free(plaintext); + exit(2); + } + + NpLdtDecryptHandle dec_handle = create_dec_handle_from_test_key(); + if (dec_handle.handle == 0) { + printf("Error creating handle in thread!"); + free(plaintext); + exit(2); + } + result = NpLdtDecryptAndVerify(dec_handle, plaintext, 20, salt); + if (result != NP_LDT_SUCCESS) { + printf("Error in decrypt in thread!"); + free(plaintext); + exit(2); + } + + free(plaintext); + pthread_exit(nullptr); +} + +TEST(LdtFfiTests, MultiThreadedTests) { + int i, num_threads = 100; + pthread_t tid[num_threads]; + memset(tid, 0, num_threads * sizeof(pthread_t)); + + // Create the threads + for (i = 0; i < num_threads; i++) + ASSERT_EQ(pthread_create(&tid[i], nullptr, worker_thread, (void *)&tid[i]), + 0); + + // give time for all threads to lock + sleep(1); + + // unleash the threads! + pthread_cond_broadcast(&cond); + + // Wait for them all to finish and check the status + for (i = 0; i < num_threads; i++) + ASSERT_EQ(pthread_join(tid[i], nullptr), 0); +} +#endif
diff --git a/nearby/presence/ldt_np_c_sample/tests/np_ffi_tests.cc b/nearby/presence/ldt_np_c_sample/tests/np_ffi_tests.cc deleted file mode 100644 index 6359e7e..0000000 --- a/nearby/presence/ldt_np_c_sample/tests/np_ffi_tests.cc +++ /dev/null
@@ -1,308 +0,0 @@ -// Copyright 2022 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#include <gtest/gtest.h> -#include <json/json.h> - -extern "C" { -#include "np_ldt.h" -} - -#include <algorithm> -#include <fstream> - -// TODO: get multi threaded tests working on windows -#ifndef _WIN32 -#include <pthread.h> -#endif - -using namespace std; - -#ifdef LDT_TEST_VECTORS -static const char* PATH_TO_DATA_FILE = LDT_TEST_VECTORS; -#else -static const char* PATH_TO_DATA_FILE = "np_adv_test_vectors.json"; -#endif -static const uint8_t KEY_SEED_BYTES[] = {204, 219, 36, 137, 233, 252, 172, 66, 179, 147, 72, 184, 148, 30, 209, 154, 29, 54, 14, 117, 224, 152, 200, 193, 94, 107, 28, 194, 182, 32, 205, 57}; -static const uint8_t KNOWN_HMAC_BYTES[] = {223, 185, 10, 31, 155, 31, 226, 141, 24, 187, 204, 165, 34, 64, 181, 204, 44, 203, 95, 141, 82, 137, 163, 203, 100, 235, 53, 65, 202, 97, 75, 180}; -static const uint8_t TEST_DATA_BYTES[] = {205, 104, 63, 225, 161, 209, 248, 70, 84, 61, 10, 19, 212, 174, 164, 0, 64, 200, 214, 123}; - -static NpLdtSalt salt = { - {12, 15} -}; - -static NpLdtEncryptHandle create_enc_handle_from_test_key () -{ - NpLdtKeySeed key_seed; - memcpy(key_seed.bytes, KEY_SEED_BYTES, 32); - - return NpLdtEncryptCreate(key_seed); -} - -static NpLdtDecryptHandle create_dec_handle_from_test_key () -{ - NpLdtKeySeed key_seed; - memcpy(key_seed.bytes, KEY_SEED_BYTES, 32); - - NpMetadataKeyHmac known_hmac; - memcpy(known_hmac.bytes, KNOWN_HMAC_BYTES, 32); - - return NpLdtDecryptCreate(key_seed, known_hmac); -} - -static void hex_string_to_bytes(const char * hexString, uint8_t * out, size_t len) -{ - for (size_t count = 0; count < len; count++) { - sscanf(hexString, "%2hhx", &out[count]); - hexString += 2; - } -} - -static void bytes_to_hex_string(uint8_t * data, char * out, int len) -{ - std::stringstream ss; - ss << std::hex; - for(int i=0;i<len;++i) - ss << std::setw(2) << std::setfill('0') << (int)data[i]; - - string result = ss.str(); - transform(result.begin(), result.end(), result.begin(), ::toupper); - strcpy(out, result.c_str()); -} - -// Run through JSON data with test cases generated by Rust tests. -// Using generated data for now because the C layer does not have the ability -// to generate the ldt_key and hmac_key from a key_seed, this is an implementation -// detail of the rust ldt library -TEST(NpFfiTests, TestJsonData) { - Json::Value root; - Json::Reader reader; - std::ifstream test(PATH_TO_DATA_FILE); - bool parsingSuccessful = reader.parse( test, root, false ); - if ( !parsingSuccessful ) - { - std::cout << reader.getFormattedErrorMessages() - << "\n"; - } - ASSERT_TRUE(root.size() == 1000); - - for (Json::Value::ArrayIndex i = 0; i < root.size(); i++) { - const Json::Value& v = root[i]; - auto key_seed = v["key_seed"].asCString(); - auto metadata_key_hmac = v["metadata_key_hmac"].asCString(); - auto adv_salt = v["adv_salt"].asCString(); - auto plaintext = v["plaintext"].asCString(); - auto ciphertext = v["ciphertext"].asCString(); - - NpLdtKeySeed np_key_seed; - int len = strlen(key_seed)/2; - hex_string_to_bytes(key_seed, np_key_seed.bytes, len); - ASSERT_EQ(len, 32); - - NpMetadataKeyHmac known_hmac; - len = strlen(metadata_key_hmac)/2; - hex_string_to_bytes(metadata_key_hmac, known_hmac.bytes, len); - ASSERT_EQ(len, 32); - - NpLdtEncryptHandle enc_handle = NpLdtEncryptCreate(np_key_seed); - ASSERT_TRUE(enc_handle.handle != 0); - - NpLdtSalt saltdata; - len = strlen(adv_salt)/2; - hex_string_to_bytes(adv_salt, saltdata.bytes, len); - ASSERT_TRUE(len == 2); - - len = strlen(plaintext)/2; - uint8_t* buffer = (uint8_t*)malloc(len); - hex_string_to_bytes(plaintext, buffer, len); - NP_LDT_RESULT result = NpLdtEncrypt(enc_handle, buffer, len, saltdata); - ASSERT_EQ(result, NP_LDT_SUCCESS); - - char output[strlen(plaintext) + 1]; - bytes_to_hex_string(buffer, output, len); - ASSERT_EQ(strcmp(output, ciphertext), 0); - - NpLdtDecryptHandle dec_handle = NpLdtDecryptCreate(np_key_seed, known_hmac); - ASSERT_TRUE(dec_handle.handle != 0); - - result = NpLdtDecryptAndVerify(dec_handle, buffer, len, saltdata); - ASSERT_EQ(result, NP_LDT_SUCCESS); - - result = NpLdtEncryptClose(enc_handle); - ASSERT_EQ(result, NP_LDT_SUCCESS); - - result = NpLdtDecryptClose(dec_handle); - ASSERT_EQ(result, NP_LDT_SUCCESS); - - bytes_to_hex_string(buffer, output, len); - ASSERT_EQ( strcmp(output, plaintext), 0); - free(buffer); - } - test.close(); -} - -TEST(NpFfiTests, TestValidLength) -{ - uint8_t* plaintext = (uint8_t*) malloc(20 * sizeof(uint8_t)); - memcpy(plaintext, TEST_DATA_BYTES, 20); - - NpLdtEncryptHandle enc_handle = create_enc_handle_from_test_key(); - ASSERT_TRUE(enc_handle.handle != 0); - - NP_LDT_RESULT result = NpLdtEncrypt(enc_handle, plaintext, 20, salt); - ASSERT_EQ(result, NP_LDT_SUCCESS); - - NpLdtDecryptHandle dec_handle = create_dec_handle_from_test_key(); - - result = NpLdtDecryptAndVerify(dec_handle, plaintext, 20, salt); - ASSERT_EQ(result, NP_LDT_SUCCESS); - free(plaintext); -} - -TEST(NpFfiTests, TestEncryptInvalidLength) -{ - uint8_t* plaintext = (uint8_t*) malloc(32 * sizeof(uint8_t)); - memcpy(plaintext, TEST_DATA_BYTES, 20); - - NpLdtEncryptHandle enc_handle = create_enc_handle_from_test_key(); - ASSERT_TRUE(enc_handle.handle != 0); - - NP_LDT_RESULT result = NpLdtEncrypt(enc_handle, plaintext, 32, salt); - ASSERT_EQ(result, NP_LDT_ERROR_INVALID_LENGTH); - - result = NpLdtEncrypt(enc_handle, plaintext, 15, salt); - ASSERT_EQ(result, NP_LDT_ERROR_INVALID_LENGTH); - free(plaintext); -} - -TEST(NpFfiTests, TestDecryptInvalidLength) -{ - uint8_t* plaintext = (uint8_t*) malloc(32 * sizeof(uint8_t)); - memcpy(plaintext, TEST_DATA_BYTES, 20); - - NpLdtDecryptHandle dec_handle = create_dec_handle_from_test_key(); - ASSERT_TRUE(dec_handle.handle != 0); - - NP_LDT_RESULT result = NpLdtDecryptAndVerify(dec_handle, plaintext, 32, salt); - ASSERT_EQ(result, NP_LDT_ERROR_INVALID_LENGTH); - - result = NpLdtDecryptAndVerify(dec_handle, plaintext, 15, salt); - ASSERT_EQ(result, NP_LDT_ERROR_INVALID_LENGTH); - free(plaintext); -} - -// We want to make sure no decryption is performed when the hmac is invalid -TEST(NpFfiTests, TestDecryptMacMismatch) -{ - char test_text[] = "this text should not change!"; - uint8_t* plaintext = (uint8_t*) malloc(30 * sizeof(char)); - memcpy(plaintext, test_text, 29); - - NpLdtDecryptHandle dec_handle = create_dec_handle_from_test_key(); - ASSERT_TRUE(dec_handle.handle != 0); - - NP_LDT_RESULT result = NpLdtDecryptAndVerify(dec_handle, plaintext, 24, salt); - ASSERT_EQ(result, NP_LDT_ERROR_MAC_MISMATCH); - - ASSERT_EQ(strcmp((char *)plaintext, test_text), 0); - free(plaintext); -} - -TEST(NpFfiTests, TestInvalidHandle) -{ - uint8_t* plaintext = (uint8_t*) malloc(20 * sizeof(uint8_t)); - memcpy(plaintext, TEST_DATA_BYTES, 20); - - NP_LDT_RESULT result = NpLdtEncrypt(NpLdtEncryptHandle{1234}, plaintext, 20, salt); - ASSERT_EQ(result, NP_LDT_INVALID_HANDLE); - - result = NpLdtDecryptAndVerify(NpLdtDecryptHandle{1234}, plaintext, 20, salt); - ASSERT_EQ(result, NP_LDT_INVALID_HANDLE); - free(plaintext); - - result = NpLdtEncryptClose(NpLdtEncryptHandle{1234}); - ASSERT_EQ(result, NP_LDT_INVALID_HANDLE); - - result = NpLdtDecryptClose(NpLdtDecryptHandle{1234}); - ASSERT_EQ(result, NP_LDT_INVALID_HANDLE); -} - -#ifndef _WIN32 -pthread_mutex_t my_mutex = PTHREAD_MUTEX_INITIALIZER; -pthread_cond_t cond = PTHREAD_COND_INITIALIZER; - -void *worker_thread(void *arg) -{ - (void) arg; - pthread_mutex_lock(&my_mutex); - - pthread_cond_wait(&cond, &my_mutex); - pthread_mutex_unlock(&my_mutex); - - uint8_t* plaintext = (uint8_t*) malloc(20 * sizeof(uint8_t)); - memcpy(plaintext, TEST_DATA_BYTES, 20); - - NpLdtEncryptHandle enc_handle = create_enc_handle_from_test_key(); - if (enc_handle.handle == 0){ - printf("Error creating handle in thread!"); - free(plaintext); - exit(2); - } - - NP_LDT_RESULT result = NpLdtEncrypt(enc_handle, plaintext, 20, salt); - if (result != NP_LDT_SUCCESS){ - printf("Error in encrypt in thread!"); - free(plaintext); - exit(2); - } - - NpLdtDecryptHandle dec_handle = create_dec_handle_from_test_key(); - if (dec_handle.handle == 0){ - printf("Error creating handle in thread!"); - free(plaintext); - exit(2); - } - result = NpLdtDecryptAndVerify(dec_handle, plaintext, 20, salt); - if (result != NP_LDT_SUCCESS){ - printf("Error in decrypt in thread!"); - free(plaintext); - exit(2); - } - - free(plaintext); - pthread_exit(NULL); -} - -TEST(NpFfiTests, MultiThreadedTests) -{ - int i, num_threads = 100; - pthread_t tid[num_threads]; - memset(tid, 0, num_threads * sizeof(pthread_t)); - - // Create the threads - for (i = 0; i < num_threads; i++) - ASSERT_EQ(pthread_create(&tid[i], NULL, worker_thread, (void *)&tid[i]), - 0); - - // give time for all threads to lock - sleep(1); - - // unleash the threads! - pthread_cond_broadcast(&cond); - - // Wait for them all to finish and check the status - for (i = 0; i < num_threads; i++) - ASSERT_EQ(pthread_join(tid[i], NULL), 0); -} -#endif
diff --git a/nearby/presence/ldt_np_jni/src/lib.rs b/nearby/presence/ldt_np_jni/src/lib.rs index 6415a4f..8f7958e 100644 --- a/nearby/presence/ldt_np_jni/src/lib.rs +++ b/nearby/presence/ldt_np_jni/src/lib.rs
@@ -235,7 +235,9 @@ .try_into() .map_err(|_| { // resuscitate the Box so that its drop can run, otherwise we would leak on error - unsafe { Box::from_raw(pointer) }; + unsafe { + let _ = Box::from_raw(pointer); + } }) // Now that we know the pointer fits in 64 bits, can cast u64 to i64/jlong. .map(|ptr_64: u64| ptr_64 as jlong)
diff --git a/nearby/presence/np_adv/Cargo.toml b/nearby/presence/np_adv/Cargo.toml new file mode 100644 index 0000000..4c8aff5 --- /dev/null +++ b/nearby/presence/np_adv/Cargo.toml
@@ -0,0 +1,42 @@ +[package] +name = "np_adv" +version.workspace = true +edition.workspace = true +publish.workspace = true + +[dependencies] +array_view = { path = "../array_view" } +ldt_np_adv.workspace = true +ldt.workspace = true +np_hkdf.workspace = true +np_ed25519.workspace = true +xts_aes.workspace = true +crypto_provider.workspace = true +strum.workspace = true +strum_macros.workspace = true +nom = { version = "7.1.1", features = ["alloc"] } +lazy_static.workspace = true +sink.workspace = true +tinyvec.workspace = true +rand.workspace = true + +[features] +default = [] +devtools = [] +testing = [] + +[dev-dependencies] +hex.workspace = true +rand_ext = { path = "../rand_ext" } +init_with = "1.1.0" +serde_json.workspace = true +anyhow.workspace = true +test_helper = { path = "../test_helper" } +criterion.workspace = true +crypto_provider_default = {workspace = true, features = ["std", "rustcrypto"]} +np_ed25519 = {workspace = true, features = ["std"]} +sink = {workspace = true, features = ["std"]} + +[[bench]] +name = "deser_adv" +harness = false
diff --git a/nearby/presence/np_adv/benches/deser_adv.rs b/nearby/presence/np_adv/benches/deser_adv.rs new file mode 100644 index 0000000..9699ebf --- /dev/null +++ b/nearby/presence/np_adv/benches/deser_adv.rs
@@ -0,0 +1,422 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +use core::marker::PhantomData; +use criterion::{black_box, criterion_group, criterion_main, Bencher, Criterion}; +use crypto_provider::{CryptoProvider, CryptoRng}; +use crypto_provider_default::CryptoProviderImpl; +use ldt_np_adv::{LdtEncrypterXtsAes128, LegacySalt}; + +use np_adv::{ + credential::{simple::*, source::*, v0::*, v1::*}, + de_type::EncryptedIdentityDataElementType, + deserialize_advertisement, deserialize_v0_advertisement, deserialize_v1_advertisement, + extended::{ + data_elements::{GenericDataElement, TxPowerDataElement}, + deserialize::VerificationMode, + serialize::{ + AdvBuilder as ExtendedAdvBuilder, MicEncrypted, SectionBuilder, SectionIdentity, + SignedEncrypted, + }, + }, + legacy::{ + actions::{ActionBits, ActionsDataElement}, + serialize::{AdvBuilder as LegacyAdvBuilder, LdtIdentity}, + }, + shared_data::{ContextSyncSeqNum, TxPower}, + PublicIdentity, +}; +use rand::{Rng as _, SeedableRng as _}; +use strum::IntoEnumIterator; + +pub fn deser_adv_v1_encrypted(c: &mut Criterion) { + let mut crypto_rng = <CryptoProviderImpl as CryptoProvider>::CryptoRng::new(); + + for crypto_type in CryptoMaterialType::iter() { + for &identity_type in &[VerificationMode::Mic, VerificationMode::Signature] { + for &num_identities in &[10, 100, 1000] { + for &num_sections in &[1, 2] { + // measure worst-case performance -- the correct identities will be the last + // num_sections of the identities to be tried + c.bench_function( + &format!( + "Deser V1 encrypted: crypto={crypto_type:?}/mode={identity_type:?}/ids={num_identities}/sections={num_sections}" + ), + |b| { + let identities = (0..num_identities) + .map(|_| V1Identity::random(&mut crypto_rng)) + .collect::<Vec<_>>(); + + let mut adv_builder = ExtendedAdvBuilder::new(); + + // take the first n identities, one section per identity + for identity in identities.iter().take(num_sections) { + let hkdf = np_hkdf::NpKeySeedHkdf::<CryptoProviderImpl>::new( + &identity.key_seed, + ); + match identity_type { + VerificationMode::Mic => { + let mut sb = adv_builder + .section_builder(MicEncrypted::new_random_salt( + &mut crypto_rng, + EncryptedIdentityDataElementType::Private, + &identity.extended_metadata_key, + &hkdf, + )) + .unwrap(); + + add_des(&mut sb); + sb.add_to_advertisement(); + } + VerificationMode::Signature => { + let mut sb = adv_builder + .section_builder(SignedEncrypted::new_random_salt( + &mut crypto_rng, + EncryptedIdentityDataElementType::Private, + &identity.extended_metadata_key, + &identity.key_pair, + &hkdf, + )) + .unwrap(); + + add_des(&mut sb); + sb.add_to_advertisement(); + } + } + } + + let adv = adv_builder.into_advertisement(); + + match crypto_type { + CryptoMaterialType::MinFootprint => run_with_v1_creds::< + MinimumFootprintV1CryptoMaterial, + CryptoProviderImpl, + >( + b, identities, adv.as_slice() + ), + CryptoMaterialType::Precalculated => { + run_with_v1_creds::< + PrecalculatedV1CryptoMaterial, + CryptoProviderImpl, + >( + b, identities, adv.as_slice() + ) + } + } + }, + ); + } + } + } + } +} + +pub fn deser_adv_v1_plaintext(c: &mut Criterion) { + let _rng = rand::rngs::StdRng::from_entropy(); + + for &num_sections in &[1, 2, 5, 8] { + // measure worst-case performance -- the correct identities will be the last + // num_sections of the identities to be tried + c.bench_function(&format!("Deser V1 plaintext: sections={num_sections}"), |b| { + let mut adv_builder = ExtendedAdvBuilder::new(); + + // take the first n identities, one section per identity + for _ in 0..num_sections { + let mut sb = adv_builder.section_builder(PublicIdentity::default()).unwrap(); + + add_des(&mut sb); + sb.add_to_advertisement(); + } + + let adv = adv_builder.into_advertisement(); + + run_with_v1_creds::<MinimumFootprintV1CryptoMaterial, CryptoProviderImpl>( + b, + vec![], + adv.as_slice(), + ) + }); + } +} + +pub fn deser_adv_v0_encrypted(c: &mut Criterion) { + let mut rng = rand::rngs::StdRng::from_entropy(); + for crypto_type in CryptoMaterialType::iter() { + for &num_identities in &[10, 100, 1000] { + // measure worst-case performance -- the correct identities will be the last + // num_sections of the identities to be tried + c.bench_function( + &format!("Deser V0 encrypted: crypto={crypto_type:?}/ids={num_identities}"), + |b| { + let identities = (0..num_identities) + .map(|_| V0Identity::random(&mut rng)) + .collect::<Vec<_>>(); + + let identity = &identities[0]; + let hkdf = + np_hkdf::NpKeySeedHkdf::<CryptoProviderImpl>::new(&identity.key_seed); + + let mut adv_builder = + LegacyAdvBuilder::new(LdtIdentity::<CryptoProviderImpl>::new( + EncryptedIdentityDataElementType::Private, + LegacySalt::from(rng.gen::<[u8; 2]>()), + identity.legacy_metadata_key, + LdtEncrypterXtsAes128::<CryptoProviderImpl>::new( + &hkdf.legacy_ldt_key(), + ), + )); + + let mut action_bits = ActionBits::default(); + action_bits.set_action(ContextSyncSeqNum::try_from(3).unwrap()); + adv_builder.add_data_element(ActionsDataElement::from(action_bits)).unwrap(); + + let adv = adv_builder.into_advertisement().unwrap(); + + match crypto_type { + CryptoMaterialType::MinFootprint => run_with_v0_creds::< + MinimumFootprintV0CryptoMaterial, + CryptoProviderImpl, + >( + b, identities, adv.as_slice() + ), + CryptoMaterialType::Precalculated => run_with_v0_creds::< + PrecalculatedV0CryptoMaterial, + CryptoProviderImpl, + >( + b, identities, adv.as_slice() + ), + } + }, + ); + } + } +} + +type DefaultV0Credential = np_adv::credential::simple::SimpleV0Credential< + np_adv::credential::v0::MinimumFootprintV0CryptoMaterial, + (), +>; +type DefaultV1Credential = np_adv::credential::simple::SimpleV1Credential< + np_adv::credential::v1::MinimumFootprintV1CryptoMaterial, + (), +>; +type DefaultBothCredentialSource = + np_adv::credential::source::OwnedBothCredentialSource<DefaultV0Credential, DefaultV1Credential>; + +pub fn deser_adv_v0_plaintext(c: &mut Criterion) { + let mut adv_builder = LegacyAdvBuilder::new(PublicIdentity::default()); + + let mut action_bits = ActionBits::default(); + action_bits.set_action(ContextSyncSeqNum::try_from(3).unwrap()); + adv_builder.add_data_element(ActionsDataElement::from(action_bits)).unwrap(); + let adv = adv_builder.into_advertisement().unwrap(); + + let cred_source: DefaultBothCredentialSource = DefaultBothCredentialSource::new_empty(); + + for &num_advs in &[1, 10, 100, 1000] { + c.bench_function( + format!("Deser V0 plaintext with {num_advs} advertisements").as_str(), + |b| { + b.iter(|| { + for _ in 0..num_advs { + black_box( + deserialize_advertisement::<_, _, _, _, CryptoProviderImpl>( + black_box(adv.as_slice()), + black_box(&cred_source), + ) + .expect("Should succeed"), + ); + } + }) + }, + ); + } +} + +/// Benchmark decrypting a V0 advertisement with credentials built from the reversed list of +/// identities +fn run_with_v0_creds<M, C>(b: &mut Bencher, identities: Vec<V0Identity<C>>, adv: &[u8]) +where + M: V0CryptoMaterialExt, + C: CryptoProvider, +{ + let mut creds = identities + .into_iter() + .map(|i| { + let hkdf = np_hkdf::NpKeySeedHkdf::<C>::new(&i.key_seed); + SimpleV0Credential::new( + M::build_cred::<C>( + i.key_seed, + hkdf.legacy_metadata_key_hmac_key().calculate_hmac(&i.legacy_metadata_key), + ), + i.key_seed, + ) + }) + .collect::<Vec<_>>(); + + // reverse the identities so that we're scanning to the end of the + // cred source for predictably bad performance + creds.reverse(); + + let cred_source = SliceCredentialSource::new(&creds); + b.iter(|| { + black_box(deserialize_v0_advertisement::<_, _, C>(adv, &cred_source).map(|_| 0_u8).unwrap()) + }); +} + +/// Benchmark decrypting a V1 advertisement with credentials built from the reversed list of +/// identities +fn run_with_v1_creds<M, C>(b: &mut Bencher, identities: Vec<V1Identity<C>>, adv: &[u8]) +where + M: V1CryptoMaterialExt, + C: CryptoProvider, +{ + let mut creds = identities + .into_iter() + .map(|i| { + let hkdf = np_hkdf::NpKeySeedHkdf::<C>::new(&i.key_seed); + SimpleV1Credential::new( + M::build_cred::<C>( + i.key_seed, + hkdf.extended_unsigned_metadata_key_hmac_key() + .calculate_hmac(&i.extended_metadata_key), + hkdf.extended_signed_metadata_key_hmac_key() + .calculate_hmac(&i.extended_metadata_key), + i.key_pair.public(), + ), + i.key_seed, + ) + }) + .collect::<Vec<_>>(); + + // reverse the identities so that we're scanning to the end of the + // cred source for predictably bad performance + creds.reverse(); + + let cred_source = SliceCredentialSource::new(&creds); + b.iter(|| { + black_box(deserialize_v1_advertisement::<_, _, C>(adv, &cred_source).map(|_| 0_u8).unwrap()) + }); +} +fn add_des<I: SectionIdentity>(sb: &mut SectionBuilder<I>) { + sb.add_de_res(|_| TxPower::try_from(17).map(TxPowerDataElement::from)).unwrap(); + sb.add_de_res(|_| GenericDataElement::try_from(100_u32.into(), &[0; 10])).unwrap(); +} +criterion_group!( + benches, + deser_adv_v1_encrypted, + deser_adv_v1_plaintext, + deser_adv_v0_encrypted, + deser_adv_v0_plaintext +); +criterion_main!(benches); + +struct V0Identity<C: CryptoProvider> { + key_seed: [u8; 32], + legacy_metadata_key: [u8; 14], + _marker: PhantomData<C>, +} + +impl<C: CryptoProvider> V0Identity<C> { + /// Generate a new identity with random crypto material + fn random<R: rand::Rng + rand::CryptoRng>(rng: &mut R) -> Self { + Self { key_seed: rng.gen(), legacy_metadata_key: rng.gen(), _marker: PhantomData } + } +} + +struct V1Identity<C: CryptoProvider> { + key_seed: [u8; 32], + extended_metadata_key: [u8; 16], + key_pair: np_ed25519::KeyPair<C>, +} + +impl<C: CryptoProvider> V1Identity<C> { + /// Generate a new identity with random crypto material + fn random(rng: &mut C::CryptoRng) -> Self { + Self { + key_seed: rng.gen(), + extended_metadata_key: rng.gen(), + key_pair: np_ed25519::KeyPair::<C>::generate(), + } + } +} + +#[derive(strum_macros::EnumIter, Debug)] +enum CryptoMaterialType { + MinFootprint, + Precalculated, +} + +// if we get confident this is a valid shared way, could move this to the main trait +trait V0CryptoMaterialExt: V0CryptoMaterial { + fn build_cred<C: CryptoProvider>( + key_seed: [u8; 32], + legacy_metadata_key_hmac: [u8; 32], + ) -> Self; +} + +trait V1CryptoMaterialExt: V1CryptoMaterial { + fn build_cred<C: CryptoProvider>( + key_seed: [u8; 32], + unsigned_metadata_key_hmac: [u8; 32], + signed_metadata_key_hmac: [u8; 32], + pub_key: np_ed25519::PublicKey<C>, + ) -> Self; +} + +impl V0CryptoMaterialExt for MinimumFootprintV0CryptoMaterial { + fn build_cred<C: CryptoProvider>( + key_seed: [u8; 32], + legacy_metadata_key_hmac: [u8; 32], + ) -> Self { + Self::new(key_seed, legacy_metadata_key_hmac) + } +} + +impl V0CryptoMaterialExt for PrecalculatedV0CryptoMaterial { + fn build_cred<C: CryptoProvider>( + key_seed: [u8; 32], + legacy_metadata_key_hmac: [u8; 32], + ) -> Self { + Self::new::<C>(&key_seed, legacy_metadata_key_hmac) + } +} + +impl V1CryptoMaterialExt for MinimumFootprintV1CryptoMaterial { + fn build_cred<C: CryptoProvider>( + key_seed: [u8; 32], + unsigned_metadata_key_hmac: [u8; 32], + signed_metadata_key_hmac: [u8; 32], + pub_key: np_ed25519::PublicKey<C>, + ) -> Self { + Self::new(key_seed, unsigned_metadata_key_hmac, signed_metadata_key_hmac, pub_key) + } +} + +impl V1CryptoMaterialExt for PrecalculatedV1CryptoMaterial { + fn build_cred<C: CryptoProvider>( + key_seed: [u8; 32], + unsigned_metadata_key_hmac: [u8; 32], + signed_metadata_key_hmac: [u8; 32], + pub_key: np_ed25519::PublicKey<C>, + ) -> Self { + let min_foot = MinimumFootprintV1CryptoMaterial::new( + key_seed, + unsigned_metadata_key_hmac, + signed_metadata_key_hmac, + pub_key, + ); + min_foot.to_precalculated::<C>() + } +}
diff --git a/nearby/presence/np_adv/resources/test/mic-encrypted-test-vectors.json b/nearby/presence/np_adv/resources/test/mic-encrypted-test-vectors.json new file mode 100644 index 0000000..a7834ec --- /dev/null +++ b/nearby/presence/np_adv/resources/test/mic-encrypted-test-vectors.json
@@ -0,0 +1,2295 @@ +[ + { + "adv_header_byte": "20", + "aes_key": "F3DB017C70E08EC5178C92F3AEA0C362", + "data_elements": [ + { + "contents": "CF75D23EDA8F6E4A23", + "de_type": 383 + }, + { + "contents": "731B76151735869205CC41", + "de_type": 73 + }, + { + "contents": "7C2A8DE86B2CBB997703", + "de_type": 228 + }, + { + "contents": "99F5163DCA0BB9BE89755A6C5AB321", + "de_type": 446 + } + ], + "encoded_section": "6D91100056F596D16E1F87B107EE86102FFC6D5E9002F00C41CDDF533667362CD14AC54A9388FA3D30AA7CA6603071B8B0FA19BF582479F773F1C7D0EADF98E98B9447139F244D571B780475ACD9CB248F33B2C085925213360732D44081C27CA6EB40BD8A626BC776D88C5FDB09", + "identity_type": "trusted", + "key_seed": "F0ED9126768CE7DC685FF74932AC5A876442C4E42359A43F720A575142A45043", + "metadata_key": "45795EE4C6533A830886E2C5885EB9E5", + "nonce": "40E95D525FAEA1C1FEE39A8E", + "section_mic_hmac_key": "A22386E85112EF883218A5B75669B7102E017E9AA149F408A079F60B1D14B4F4", + "section_salt": "56F596D16E1F87B107EE86102FFC6D5E" + }, + { + "adv_header_byte": "20", + "aes_key": "F076F2B4FA1F3704DDC4EC5CD60C4657", + "data_elements": [ + { + "contents": "B62889", + "de_type": 72 + }, + { + "contents": "68FDB8895CB7ABCF18390616113107B73321A905D22FDB99", + "de_type": 175 + }, + { + "contents": "D5A173DC337EFA759D443C50F14F25AC18A06D44C4", + "de_type": 354 + } + ], + "encoded_section": "6D911000CB9C39FAF5D89CEF1FD7E313DC2F95D79004919332D945C714DE3B58B0762E7F9378D80F35D0DE1E8BD321656B270EA3379F029FB09E44AAFB091B0678A0AB69B055CCE5C2F576EAE52DAC0D6C11FD6A878ABF337B9647FF259ED24F5687641E8ED13A612810F22EC240", + "identity_type": "provisioned", + "key_seed": "907E34F78FBC8CA40FCA224C12B95BA2C4A0148BA0D19BDADEE1798579EF7D35", + "metadata_key": "B524D8ABD8E7DCFD13CE922F2FD9EFAC", + "nonce": "AD0AC7BE3A89262786A55139", + "section_mic_hmac_key": "690542812A39DB48DD638AED6021A250767F79604C638E361A8F7F5FE92C5E40", + "section_salt": "CB9C39FAF5D89CEF1FD7E313DC2F95D7" + }, + { + "adv_header_byte": "20", + "aes_key": "B9549633BA2531AEF16D592815C12269", + "data_elements": [ + { + "contents": "BA", + "de_type": 79 + }, + { + "contents": "796F131D0D034508", + "de_type": 141 + }, + { + "contents": "0245", + "de_type": 522 + } + ], + "encoded_section": "48911000897E4DB6C940976334871B64811D8379900416AC9B5760E31F037634EED3B9C81AEF75B5134E7065DCEFF8CF3197BD2242BE4E29384125B35FB9A4BB7D4D1A650F1E30DBA3", + "identity_type": "provisioned", + "key_seed": "E66AECA540D070C5E430CE461A3E209F0650AAF3E69CC79C20935DEA3D468A46", + "metadata_key": "B2AC31CB7B88B7FA165B5E41AE706E04", + "nonce": "E3CB89790FEA866E19F4926A", + "section_mic_hmac_key": "EE72E920E379F06879BD8AED8EF9BF8D5903E5CF94A83815929260521F84C17C", + "section_salt": "897E4DB6C940976334871B64811D8379" + }, + { + "adv_header_byte": "20", + "aes_key": "088B6339D6D727E797DD1EA3EAC999B3", + "data_elements": [ + { + "contents": "DDCCC496B0BE050B7607", + "de_type": 850 + } + ], + "encoded_section": "429110008F292492B012ACE2C0EF4F25E0901F9490022CF669461319C1165AA131A7BF2835C97FC3ECD77522FB93CE0675D0313D7AB03E230DBE46E286192CD451E9FF", + "identity_type": "trusted", + "key_seed": "CB61506281210764CE5E3504BF3A41AF69196369375BFE16245B0CA19421650D", + "metadata_key": "B9696864507A1DC2EF99DF5441AD25EF", + "nonce": "9CC88703DA8A3C82DA5DF32D", + "section_mic_hmac_key": "8DE5B98089EEEAB5ABB079EE0C6C8F37289CFCDA74B81BE4F3599EA7F10B3A3C", + "section_salt": "8F292492B012ACE2C0EF4F25E0901F94" + }, + { + "adv_header_byte": "20", + "aes_key": "142EF4EFAA03C54D43958647B4A9053A", + "data_elements": [ + { + "contents": "B8E42416CD4B3281EE2EDB1B36B89DFD17D35C46B354D6", + "de_type": 441 + }, + { + "contents": "72787349FDC162A25D13BA", + "de_type": 664 + }, + { + "contents": "E0A29FC658F199AFF9", + "de_type": 308 + }, + { + "contents": "8859EB742D3B433BD0F992285B9EEAA1", + "de_type": 319 + } + ], + "encoded_section": "7C911000DFCC6FC56956B0D99F2F29682117B0759004E48F8DE2D74AC7FEAFBEA42F808B4DCE7D17F2841097DA561701AF9F365BA4F702A4CA79D40F6F88C383487B6524BFACDDF294D2DE20CCD7B2BF3A765598144323933CEAD4C1A5C6522A867A5BFDF562A43C537A50A3987AB4F9AE446043117F7A20E1C41B398F", + "identity_type": "provisioned", + "key_seed": "311F871B4605A04B3310C13D7297AEE745EE105A5D116D05B114A39C2DE27B85", + "metadata_key": "18C51BF65C261CFB2F8106AA4C8476B6", + "nonce": "1F562F760A35CE9445D40B28", + "section_mic_hmac_key": "6F25A84CB39DACD4B9DC7BB4354EE7BB268FBB559121D0F530BE2FDC212C7478", + "section_salt": "DFCC6FC56956B0D99F2F29682117B075" + }, + { + "adv_header_byte": "20", + "aes_key": "0C3C901C96C81D5822A42886F20E4D24", + "data_elements": [ + { + "contents": "", + "de_type": 437 + } + ], + "encoded_section": "38911000B3AF643914DD58250EF9795F77B0FA3B90018EACECB07EEC9E2E72550CB8C373FB6EDA5F1CAF378E19C6207AE3C6F7CDA7E1321B56", + "identity_type": "private", + "key_seed": "39739EA99CFB0EF8200B08C12213FB3370A4DFB58CEADA17764FBCA9FC05B914", + "metadata_key": "A1F9BE98BF2BE21F318FF60776ECF594", + "nonce": "E067B8B38B20F64D35EE4B1C", + "section_mic_hmac_key": "DB710921FA3969941C33329A0FC10AED0EB49A7BEA627ABBAB6E4BBBF6886478", + "section_salt": "B3AF643914DD58250EF9795F77B0FA3B" + }, + { + "adv_header_byte": "20", + "aes_key": "0DFF79575A76A69E5545F23F2D568BF5", + "data_elements": [ + { + "contents": "8D530D2FF57D6A089257EEA03F2643CCF76DF103", + "de_type": 739 + }, + { + "contents": "88E7ABACA5E9", + "de_type": 563 + }, + { + "contents": "9CA636C900FFAEB51060B40D1E60D751840CA3", + "de_type": 831 + }, + { + "contents": "8AC0EC13CB0B", + "de_type": 944 + }, + { + "contents": "4FD1B972DDA8376DF7181799B3AEC3D4FA3875CDA0B9F2A244085CDD72", + "de_type": 263 + } + ], + "encoded_section": "94911000A089A545FC2F1E048CCFEFF6FC7530BA9002D0BA12200150BF15A06427841CC00E9CC99FC3032DDB93D46A96DEC5F92DD89849328418BB27225CA77542A2BBDE1896CF76D0143EA351786BC3DB40228363971552E8CB5BF440F6B6569B610D0F09B6E6B46922D86E1DB35A2AE0507A10268AD4077867FF55C7286971DB6BF27D01B68BEF04B9FE12FF660A0ECE154D2B27", + "identity_type": "trusted", + "key_seed": "5CE70AB764EE544F6A9B48791033EDB78D6541368BE2A02C41C93BEE27645D15", + "metadata_key": "29F72458A212E09F3E13A14D927CBB97", + "nonce": "C6002C4E093E3ACD57A0DA8A", + "section_mic_hmac_key": "BF94C21240800483EE76C69F94D1E7E867EFC9AB11CE74E672C936634C0F7883", + "section_salt": "A089A545FC2F1E048CCFEFF6FC7530BA" + }, + { + "adv_header_byte": "20", + "aes_key": "048C8515B3970ACA7E06DD671E758AB7", + "data_elements": [ + { + "contents": "672D400589BB794E2A33DE53A62FF97458DAC28DF015F304CE9EBCE8CF", + "de_type": 502 + }, + { + "contents": "C2D9DC3F76FC72BE4BF7D3AFF43B1041B0BC93512BF73ADA95EDC4", + "de_type": 692 + }, + { + "contents": "B010CC19D7FB", + "de_type": 129 + } + ], + "encoded_section": "7C91100095FFF79474626138B7A9200A474C449F900259C6F85AD235549231775D62E7E710EA91D16662378B15BD5C34B7D14543BB5F289B37E17599C0AF6572A0630356ECA030870CAE9697E92FA9BB0632BE009F643C018B1571592CB0750C158BE299806D0673779B000E047CF4E4D8BD732544EDE5C6CBB4F71E05", + "identity_type": "trusted", + "key_seed": "9F52A2F6A5F571B558151E84D8965C427733005A6CD580E66B5C398443BB7479", + "metadata_key": "4C95AE9955DE9A3684F52B00461035BF", + "nonce": "33CA4805B89AE4F80DB67BE3", + "section_mic_hmac_key": "4BC7E7FC685A2E3D9EC90B20014586C986E3054B456EC2851E6606AEDC3955EA", + "section_salt": "95FFF79474626138B7A9200A474C449F" + }, + { + "adv_header_byte": "20", + "aes_key": "4C9F52374665C592601F5B2BD404B94A", + "data_elements": [ + { + "contents": "91EAFB7D", + "de_type": 663 + }, + { + "contents": "22027014F8D43A605E0C179A1E144A3058D7C024359E7A42B83DBA9B0F", + "de_type": 163 + }, + { + "contents": "0830ACBE1994FB", + "de_type": 291 + } + ], + "encoded_section": "669110005723CCC591C04732B131D258FB5C9A219002E345F42E0D2D02EF57D890EE70F4A95BFE4C9651BF6E2067BD6707820636D5E484F9D519029D86290ECC42C846AF1D0C8D03BD155D791F47637F9F698A8B9D71E261712DE1F1219ED87F7F2045BC240A41", + "identity_type": "trusted", + "key_seed": "1D02A26B11FB561BD54036A1FA2B325E74D226CA72428C391650E5249B40E0E9", + "metadata_key": "702C35764676569F45279BE0BA2F941D", + "nonce": "08838921E1C57E275B554B1E", + "section_mic_hmac_key": "163F7952B1866F16C0E5CD3CA950D786E53F04C7CEEBA1946AD76C16185F52FD", + "section_salt": "5723CCC591C04732B131D258FB5C9A21" + }, + { + "adv_header_byte": "20", + "aes_key": "A3034AE0322F5E77ED6B21B5E5368108", + "data_elements": [ + { + "contents": "537F96FD94E13BE589F0141145CFC0EEC4F86FBDB2", + "de_type": 571 + }, + { + "contents": "D301FFB24B5B", + "de_type": 541 + }, + { + "contents": "EA95F07C25B75C04E1B2B8731F6A55BA379FB141", + "de_type": 51 + }, + { + "contents": "2EFD3101E2311BBB108F0A7503907EAF0C2EAAA60CDA8D33A294C4CEACE0", + "de_type": 729 + }, + { + "contents": "B0", + "de_type": 411 + } + ], + "encoded_section": "91911000DE2A89ED98474AF3E41E48487E8AEBDE90014C18BCB9F9AAC5C11A1BE00A10A5DCD2C49A74BEBAF0FE72FD5053B9DF8B9976C80BE0DCE8FEE83F1BFA9A89EB176CA48EE4ED5D15C6CDAD6B9E41187AA6316D7BFD8E454A53971AC00836F7AB0771FF0534050037D49C6AEB18CF9F8590E5CDEE2FBC330FCDC640C63F0735B7E3F02FE61A0496EF976A158AD3455D", + "identity_type": "private", + "key_seed": "959D2F3CAB8EE4A2DEB0255C03762CF5D39EB919300420E75A089050FB025E20", + "metadata_key": "EF5E9A0867560E52AE1F05FCA7E48D29", + "nonce": "23B64C2B1724E5AE9528FCD4", + "section_mic_hmac_key": "2F1B12002184860A496B2DF7FB743401BA8E8BC5F22F661BAD69335E99DB8A19", + "section_salt": "DE2A89ED98474AF3E41E48487E8AEBDE" + }, + { + "adv_header_byte": "20", + "aes_key": "15AB0E1BF3C908D5A92C9A52158DAC00", + "data_elements": [], + "encoded_section": "35911000172C7E49FB61097603390278AA4B48F8900477935610288681FDC9B7250022F01CFA66E59183F392C5C2485D8240ABC96D15", + "identity_type": "provisioned", + "key_seed": "C1FE7DD8760BDC37EEED65E07FF3F9DB9B2DA247260038675679921566A4466C", + "metadata_key": "D84140E3576B04F8D9290744C62D20A1", + "nonce": "A8FD0BF085BA1C3E8A23FC0C", + "section_mic_hmac_key": "3BBF201D9180707DDF5DA4321B477A2D0CFEFC00D72EE560F0E41B5178315366", + "section_salt": "172C7E49FB61097603390278AA4B48F8" + }, + { + "adv_header_byte": "20", + "aes_key": "2C8D685B3ED53CA46D6A6AC126596C84", + "data_elements": [ + { + "contents": "E95043396FF5CE7FEA272F1E9D8A", + "de_type": 359 + } + ], + "encoded_section": "46911000B9EB78D15B9493668E3506DD9E7A2DEC9001884E76187E89CB0107A5090D664508854DCF8722E98904E6BB57422710F3CBB3271A743BAE59467EED31F62B714060F040", + "identity_type": "private", + "key_seed": "0C43A03CC43B6536086910E73F4499C368BE47235FEA439124005FD91047C8DD", + "metadata_key": "6B8DFEAC098F9DD035F14843C3196CC8", + "nonce": "920205C1FC28E58575E08D47", + "section_mic_hmac_key": "5FE0D08732D5615AE4447E726DEAB0083D9458E66DAE596377DDC103C34A4442", + "section_salt": "B9EB78D15B9493668E3506DD9E7A2DEC" + }, + { + "adv_header_byte": "20", + "aes_key": "C56F4750DBCFE87ADD8E2159B3EB5646", + "data_elements": [ + { + "contents": "148ADAFBA927A9A3D361CB34792A1FD1311A", + "de_type": 16 + }, + { + "contents": "37215F", + "de_type": 776 + }, + { + "contents": "5B75B7A4044E3100635709818ECB099706", + "de_type": 563 + }, + { + "contents": "4A70F7FE36FC", + "de_type": 49 + } + ], + "encoded_section": "6B91100010510FF96F9DE71AFB125A00637D9A159002692F0CA5C9AD242760DFCCB7F9E445AB0545ABDD91DBB4E6A7DCAE21ABF58D01CC3C1B95AF9442EDF2FA1ED5C551FABF071981137AFB04F4B67F13D43CAA959F53819A4B90913C7CD4B945665E74898BDEEA50939FA6", + "identity_type": "trusted", + "key_seed": "18D77C2D69389B38F6430DECF46D34893C188EDF6F57E306BD159A441D602D68", + "metadata_key": "0DFE12776B497E72E415E41625C4A2A4", + "nonce": "A25A744723723AB492153CE9", + "section_mic_hmac_key": "B1BC6C3AC220AF74BAC5EA8A85692095575FA6C2172ED9E66669114164BF55E1", + "section_salt": "10510FF96F9DE71AFB125A00637D9A15" + }, + { + "adv_header_byte": "20", + "aes_key": "3BDA27AEC19E0135552AD5ABB02C45D2", + "data_elements": [ + { + "contents": "92F73CEBBE55EFF2391445A2B96299155B78", + "de_type": 984 + }, + { + "contents": "8C4615561E9CF7589FA8E6F7B57893025DF55C", + "de_type": 919 + }, + { + "contents": "DDF6FEBA14ABB1B094A277D361A8C70B988E1010534FAFDF25", + "de_type": 676 + }, + { + "contents": "8650458E65DE07BFFCD2EC46E0D4D05609A66D9AB777FA341EFE3280A5AC", + "de_type": 784 + } + ], + "encoded_section": "9D911000D86DFF361F5567606CCBAD126A86C01390028E06467447060E4E27C066C5B7F8B785D2476A0FFACC9C85C1E2211B7609D8A4A2C7036F982F923D1DFCF0161B60A3AA5DE2287B909FABE3E902EF1CCD45AB7D9CACE4FAB3C05CB9A00FCC5AD93E9E3B2B31A2ECC226D2209BF24FC7D13D0AE53C912D03DF47F1A4C132BF949C555E8D35436011B852DDB228F4964483F820DA360FFC9506087F99", + "identity_type": "trusted", + "key_seed": "A6915F7F275F268563F06B70294DE268F4C8FE2ED64831049F5071DD2D7AFF7F", + "metadata_key": "29B703C99077654D9EC2BD86066D3CC5", + "nonce": "ED125BA0057DCFEB89ED7190", + "section_mic_hmac_key": "1B8F822A197030498D51E0F2E4B9C7C306074D7C83C73CAE508D2FFA46EB743A", + "section_salt": "D86DFF361F5567606CCBAD126A86C013" + }, + { + "adv_header_byte": "20", + "aes_key": "9E629E04812454CB600A54C8837CC057", + "data_elements": [ + { + "contents": "C1B396A29B6967ECF8673E009B2E7F94C4DECD7FA20C176EA0AD98B9", + "de_type": 253 + }, + { + "contents": "3FFEC56E8DB922CD8C5AB5E47452E571", + "de_type": 605 + } + ], + "encoded_section": "67911000229151F0CBA214F520EFDBF30FB4DA43900287511210A4AF78894FA1DEE707C412015D271BEE2789F49BB5DC67D44E5B9E58B6421F4C834D13F29940800D31315840591BD869F1C2D2887914627DE54D90AA254C6CE1699AA9CA7198ADD71BDC46D91117", + "identity_type": "trusted", + "key_seed": "1C9A55E064B78E94CB6B070F433CA94D21CB3318E048A7A2CAA83FF958419794", + "metadata_key": "1A240C90D7E260458660C8B07F991AE6", + "nonce": "2BEB4BC7C05434ABBA19E538", + "section_mic_hmac_key": "050D12FF03D51C57EC4AE018EDC1896C38226E1A0481362E415CCB28F5A01B5D", + "section_salt": "229151F0CBA214F520EFDBF30FB4DA43" + }, + { + "adv_header_byte": "20", + "aes_key": "8C996EFAD07DDDED26DFDF98812CA923", + "data_elements": [ + { + "contents": "B7C019E21BDE02221C04A4", + "de_type": 43 + } + ], + "encoded_section": "42911000D1662A41EA8D74EEDE6BE6686D41414E90029CE0D1823D6C861F9B05C79235D6C1CB99634640B9BA98F7B3C72B67F242E2E40E36C937F671A88D63FF97C4C4", + "identity_type": "trusted", + "key_seed": "2027245C1810377C3846FFC4F33A46FD5F55BEFBB13C9EB07D7D5AD3CFAB48B4", + "metadata_key": "9F4AD9EDF0A6CAAD2E9E99871E4CE52C", + "nonce": "A71E97EBB5FEF5C10118B443", + "section_mic_hmac_key": "3BEFA04D9C10EC14E050D8106803C71F788E338E191EDFA21FC2029FE1A90922", + "section_salt": "D1662A41EA8D74EEDE6BE6686D41414E" + }, + { + "adv_header_byte": "20", + "aes_key": "AE8C6F011FE35C9C96FE8EBDE339A41F", + "data_elements": [ + { + "contents": "607A867B3B29B89041F9", + "de_type": 979 + }, + { + "contents": "5E799499", + "de_type": 25 + }, + { + "contents": "92CB515B79EDD5E37C12C6B5864DF420AF7DDE1B5919331DA7", + "de_type": 577 + } + ], + "encoded_section": "649110008A4AF96D2B686F8C79E0133C7A1300D39001533E4A9492889398E4BEA2572B455C201BE24382C5D0FCEF256113AA7541173BBC6A2B9AFC3CB2A133424BA12055069603174E36F3407444B5FBFA5BFAE8C8B6BD893AB31B9D869105014A931AEA10", + "identity_type": "private", + "key_seed": "F728E206C88A47D4C5063BBF54C218435A04B921E3D0E2774572D88024076D7E", + "metadata_key": "CD8451667D7BBD7EB4CD5E456ECF8167", + "nonce": "3F7D4273CDA786C66C557ADC", + "section_mic_hmac_key": "82B0C8B8007802CE1CCF367F07830FDAD2401C8EB5849613602E568E634DAFB4", + "section_salt": "8A4AF96D2B686F8C79E0133C7A1300D3" + }, + { + "adv_header_byte": "20", + "aes_key": "9078B570449046A4C6FD9246ABE3E17E", + "data_elements": [ + { + "contents": "381690D8CB5DE6CB", + "de_type": 724 + }, + { + "contents": "905EB45FAD", + "de_type": 144 + }, + { + "contents": "969FEFE0", + "de_type": 302 + }, + { + "contents": "75202C93DD512023EFD3EBF3", + "de_type": 742 + } + ], + "encoded_section": "5E911000F765D4EE37755137F6B7AF43D4ECF2CB9002361BF7AEC5BEA9E0F9790E737E559951EB09254D0B4304A81E21FF7C9B463A8AF4D29B35B6B909C255286B707B85F028D277148C6A82877695FF915BD0602946C37F4AAF6C1C315B98", + "identity_type": "trusted", + "key_seed": "DD3AB1ADE4D985E6D6E67F2FE19DD6A75A9F5B4560CD3C05FAFF8A88C283AB3F", + "metadata_key": "D53DBD8613161F1527385E5F27FEE124", + "nonce": "D30A2D8CEFAB8C91E0B1799D", + "section_mic_hmac_key": "EDFA40290EB30E6669C551947A061A587843CCE47F4620E51ABA239AB79AA739", + "section_salt": "F765D4EE37755137F6B7AF43D4ECF2CB" + }, + { + "adv_header_byte": "20", + "aes_key": "C2FF97FBAB946B17D2BD0CA0712FA7DB", + "data_elements": [ + { + "contents": "B0F9DF275D2D5A37C95B9CC9AB", + "de_type": 114 + } + ], + "encoded_section": "44911000EB645DE61C9BB4C40BC585AABA223BAA9004B40CE842866C9F317B5C429C501392E13495FA18E48C34BDABF4152C8E98E90ED1AFD11BCABD4EF60CBA9347FB0120", + "identity_type": "provisioned", + "key_seed": "CAB68F8D497B54A0B25EE602EDC659B8C12F9E9E49EC8FC2C2487E8FA955E606", + "metadata_key": "CDCE54153DA53A283DBF35F0D456FBDF", + "nonce": "D7FA723581DFA37F8CD7F284", + "section_mic_hmac_key": "EECDEE6DCC125C40BD1002DFBAA77C8D5F16D6A9D152E6524A13E213F5CDA36A", + "section_salt": "EB645DE61C9BB4C40BC585AABA223BAA" + }, + { + "adv_header_byte": "20", + "aes_key": "BD5FFED9F8FF99EFD9276BAE103C8520", + "data_elements": [ + { + "contents": "A9F592F1DCA1C71CCF03CC0310DF337C9A", + "de_type": 683 + }, + { + "contents": "E18AD6552B4C", + "de_type": 277 + } + ], + "encoded_section": "52911000A798801A6B6BB3B3CE199A04C6D39C749002F4A793DDD478205BE47B9D5A3D02821CFECD82A205E596D82F1CA5F52DFD12D2F160C20332DD75B56CFF48AFC079B80AB8151D3FC020D71FF03A220692", + "identity_type": "trusted", + "key_seed": "9DA9C8ADB2F20D379E5C103E92D60D4ACC946AD0DC57B08E71A6CAF174DE27FD", + "metadata_key": "32044EF9F7B354E253E7206AC19172BC", + "nonce": "FD61DCBF349648F6BCAD5FF7", + "section_mic_hmac_key": "CEF13D97D862C57A7CC2ED89FA453B5F331A39B46EF3DAED677C6354FCF41A99", + "section_salt": "A798801A6B6BB3B3CE199A04C6D39C74" + }, + { + "adv_header_byte": "20", + "aes_key": "AB8FC3047B5D459C0FE3A8D32DA1D396", + "data_elements": [ + { + "contents": "70E9867134E018A407BFFA11681FE66225551030", + "de_type": 694 + } + ], + "encoded_section": "4C911000F340B13BAF10C096314AD12554265BA69004D98C2427C11201067AAA42C262F78315F0FBD68F03CA256E74CD74CC39E3B0399E41E8DC766AB30241498364F94C204BA6F1D12C66C752", + "identity_type": "provisioned", + "key_seed": "9E50221DB4D19E3E2E6E0D61F2FE4FD765B0AB77D795B8BF9DEE945C9258D90F", + "metadata_key": "E59AB0FB0471EDE9516038F2B830FC8D", + "nonce": "D547910B27183848271E093E", + "section_mic_hmac_key": "0C67958E203428FCD8B023C2C97BEFD62A64E72DC0F3F9078AE494DA235E4E80", + "section_salt": "F340B13BAF10C096314AD12554265BA6" + }, + { + "adv_header_byte": "20", + "aes_key": "5E155066D56083328A063FBD5AFBF1CE", + "data_elements": [ + { + "contents": "B2E8AD80552E7D", + "de_type": 638 + }, + { + "contents": "EBA00821E05107D40E6B3CAB8E86027D497F34670527D1D6", + "de_type": 337 + }, + { + "contents": "549E6C2D1425", + "de_type": 826 + } + ], + "encoded_section": "63911000A847D51D7D049D481D63F14F4A8D01099002FC5925A9E42B41321E56021A3D01157DC10E00CFF86A66638C7313814DF85E2E050AC4235DE9634416B34AAEC4419D9F50D49952742723228FA5CC8A8981C6E5E71904FE5FDAD5111C3C81C88E65", + "identity_type": "trusted", + "key_seed": "BE5027936C60695FF4EA18AC1F81078221C50A8C22C98F36C9A5877D369E4000", + "metadata_key": "1B43759002C9095970DB092A0086FECF", + "nonce": "CCA806551E3DE4A2C7015C4F", + "section_mic_hmac_key": "B8C388D47A6B125B3E637DBE4281824A170687F5D596510B94A95DFBD0420A5F", + "section_salt": "A847D51D7D049D481D63F14F4A8D0109" + }, + { + "adv_header_byte": "20", + "aes_key": "BA3816EAD76DAC246880A27F137D4CC2", + "data_elements": [ + { + "contents": "3909A77A6295", + "de_type": 706 + }, + { + "contents": "A360F1", + "de_type": 563 + }, + { + "contents": "9B77E78C7CB64198BC2E5E676080B8652C88A3F1A71B5B62CC5B87", + "de_type": 496 + }, + { + "contents": "DD4080284EEF0BFBA61283376C7A", + "de_type": 129 + }, + { + "contents": "D3", + "de_type": 362 + } + ], + "encoded_section": "7791100034A1CA42CE8D750265DD13710E6AA8F390024301C25BBA38E693BCF7834E08B62F4B4569EC8704250959F6EEE5971C2E25BB63EF65C1CA1B20917A433DAA9379ADB3773F463BC8A81A938CB83EA4E1BBF4CB1A4409D38E9511B4660A5C5458337CCBD98AA3E3A41D88C98ED0A9D8AE27F28206D0", + "identity_type": "trusted", + "key_seed": "7052FBAFC59D8ED636F51F254C3E8D2429604C2A58A3A0A27C54C2D83B4D4353", + "metadata_key": "0230CE096D5CBE15B55F65F270D0D411", + "nonce": "51FD2C7EBA743483252DA523", + "section_mic_hmac_key": "C1941723E73EE200B78932065A479E2380FBEE95082846C9FEEDA9D35C13E84E", + "section_salt": "34A1CA42CE8D750265DD13710E6AA8F3" + }, + { + "adv_header_byte": "20", + "aes_key": "3F7BAA4E9ADF649F68504D2BADC49E59", + "data_elements": [ + { + "contents": "C7CD03AABE413B68D38D5528B8", + "de_type": 784 + }, + { + "contents": "BA87E5F9338B888B0ADCE8C80BFFE11D2467303431", + "de_type": 902 + } + ], + "encoded_section": "5D911000D22DBB4DD6D440F26183BD13D0C3DF6A9004AA523D21ABBF464C0DD1166437AF2EE5159310A4E2C500A84A7824DA48C2DB85C9BC79B60DA83EE61EDFBA617008A7340431E5B7ECB19E7F140D6F0D7E22589A51AAE13A00780820", + "identity_type": "provisioned", + "key_seed": "1E2D99F50E548FC49590D5E6C066B4DC955EF40DDEE79167EC359E551048E1D1", + "metadata_key": "83D500F6D6106BC3C2B17AE408023E91", + "nonce": "4A9AED02A25AF38FB2E2E2F7", + "section_mic_hmac_key": "B29B84CFF65C3EE4616A502AC61C029C706D6B1EDD39EDF4D76EA5A84453BF5E", + "section_salt": "D22DBB4DD6D440F26183BD13D0C3DF6A" + }, + { + "adv_header_byte": "20", + "aes_key": "5BA9C6F943DAF529109F4B100F49D597", + "data_elements": [], + "encoded_section": "35911000C739C6227A353DD9B0EB277131E35DCF900469ED27AFB7C387B5475E150CD81AEC4884892FD73C27B796E7685D75C10A7F71", + "identity_type": "provisioned", + "key_seed": "1344FE8EFB2E14874FEB0571343BBA222C0FD904204BBA55ED94F0CD28C26FB7", + "metadata_key": "DB1BAE09B154172E09141BFFE4CF561D", + "nonce": "108AA9D4432E50BCDECCBD6C", + "section_mic_hmac_key": "2E20757E70673D996C6D58E403A0F87CDE24F7EE3038C17FE07D435B44093CD5", + "section_salt": "C739C6227A353DD9B0EB277131E35DCF" + }, + { + "adv_header_byte": "20", + "aes_key": "39CD401AE8F611D1651E0FDD59BA8F45", + "data_elements": [ + { + "contents": "F4658B8BCCCF49B7AB79", + "de_type": 564 + }, + { + "contents": "C9F2A6B90E08CC", + "de_type": 988 + }, + { + "contents": "820BE5C34A2CC3E9", + "de_type": 870 + }, + { + "contents": "0F02CD73", + "de_type": 573 + } + ], + "encoded_section": "5E911000E6CBCB218624EE2DC2DBABAB38F837769002F43D65267B214BF792B14655201C57B346BF233AEA5FD07FC5163FE7D1659F6A8DB901B503D26320F94D3B25EC2647F294BAD0748EEE05FE24F42CFA240062F74715FAF8CB6873C017", + "identity_type": "trusted", + "key_seed": "D72CDA23016D822CFE1E5294916DC83CF98EC2ADAE9121F80803386DC5CF6E78", + "metadata_key": "47001AE1B7E542147BF57D1C62F22F9E", + "nonce": "B677F8EEF05E5C4FD69BC645", + "section_mic_hmac_key": "CD8F4F64EB964FF7E0EFE036347DD0007A1A763B3001F02361CCC3A680C368FF", + "section_salt": "E6CBCB218624EE2DC2DBABAB38F83776" + }, + { + "adv_header_byte": "20", + "aes_key": "194ED59DCF4144A697CD1AD63E33A3B4", + "data_elements": [ + { + "contents": "D5156EF7CAD1096B1EBE82E0", + "de_type": 777 + } + ], + "encoded_section": "44911000032224758D14BA41AF92F6D88A501E2C9002C7D754757898C9E34AA838CDFBAF155B30084E02BE29B58C33ACC954F941842FC053B0ADD4CA9F3D3618EDBA2CDA81", + "identity_type": "trusted", + "key_seed": "F77600BA15BA4C8B396C8A0C3B8ABECF2B064A045E583BECD39116C572E7AD12", + "metadata_key": "DB7F42852277D6552C91815416FCBF72", + "nonce": "5A2D8E75D0B7634F06D7325A", + "section_mic_hmac_key": "862D13102D1431D175E2E8B6ED0D30D99C6E43EFED3FCA6D14CFD8AEA3BBE15B", + "section_salt": "032224758D14BA41AF92F6D88A501E2C" + }, + { + "adv_header_byte": "20", + "aes_key": "3337A6A8FC085CDCD20C3F46E78E7AB5", + "data_elements": [ + { + "contents": "70D83068132E37C88B72A4EE79D173537E8F", + "de_type": 277 + } + ], + "encoded_section": "4A91100013D9056CD070347F927B0F615DDFEC549004C7894D8A1B5608C1EC182CC0AB86375EEBFE92E0A4EF6878AAFBCB637738E21F4EA1C9F76D65EB4AE29BC86CE43C9F49859C66F2FB", + "identity_type": "provisioned", + "key_seed": "1507CD75F60429CB9E63C4D4A09FEAC92E772223D9E95838E8784AE1969F3E7A", + "metadata_key": "481E466127EF90D5C53596E8552EC52E", + "nonce": "F7A694ED8C95C9D7A755D82B", + "section_mic_hmac_key": "F7355B49456F6C57FE860ACCE4A711214D71D5F08B574E5BA37E165B52000A36", + "section_salt": "13D9056CD070347F927B0F615DDFEC54" + }, + { + "adv_header_byte": "20", + "aes_key": "FBB1328618CCD896CC70AF937CAE8281", + "data_elements": [ + { + "contents": "467333809F3B", + "de_type": 952 + }, + { + "contents": "50CE12F4FF7B16B5643EF1C66368DF27DEDF3CEC9B24A3", + "de_type": 300 + }, + { + "contents": "08443858DD0A", + "de_type": 124 + }, + { + "contents": "E873C2B86B0C5A28624DBBFDE0AE3D22D03EABBF5BA71EAD", + "de_type": 448 + }, + { + "contents": "F1447D2F9281DBEE34476C48B22351E8F27CB782A10A29FA69E5ADCB3EBE", + "de_type": 399 + } + ], + "encoded_section": "9C911000E33DCEF3193A00CA24590E41CB1607C79004439EFC4200D70EB58A7579DEBD80F04B5E8002A076C37A1D6510BA493BBD60569363F1FC3FC5A379DFEF1BDE620330DA1C8D06AB062EB96C92762FE17DD96776B35D13CA41488C1C83F2FFE0D0EF5262B632D856D10CB666762BA5CA742A0E9E95C9931779E319C7854ABE32BE0480D1FA754E1EEBEB1521C148FBF4A70F3185091CB04D57884A", + "identity_type": "provisioned", + "key_seed": "D30C0A924112C23C73BAC89EC03E7F9EB81E26916553AB6556C1240C20EC37B5", + "metadata_key": "308A7C574957C93A9B3E6CEA175AB263", + "nonce": "5D0946C2808A4C895626EF0B", + "section_mic_hmac_key": "8421457116D650DB88EB790AFB90AD99C53EFE2F875528CA25ADAA615F35D9CE", + "section_salt": "E33DCEF3193A00CA24590E41CB1607C7" + }, + { + "adv_header_byte": "20", + "aes_key": "E03DF6ABB87D6F554B5BEC78A7E8B0FF", + "data_elements": [ + { + "contents": "B94A3080F25FE185C6C36E9A21405519666684E0847BF36DD115A926", + "de_type": 503 + }, + { + "contents": "", + "de_type": 415 + } + ], + "encoded_section": "5791100094339CFAA454A5D2E977F38C35E2844D9002E15B4F8862B4A3E4D5FCDDEC6FC36567A1E9A6EC6E2CAAC28CC1C72CC81CB4E190AD8C8C1997EDA2A8391662DC44D4D5B818959ACC574FA1CF7E99645C4DF138B587", + "identity_type": "trusted", + "key_seed": "6B1BDAC7E669C8EF0847707AC2365C0D3864B31D6F13C088D4630CAE016B520F", + "metadata_key": "A50CC2AEFD3369D7D1DA0F0D0E537F19", + "nonce": "0C4819136C0E397ABDD9E354", + "section_mic_hmac_key": "A1FC278429196727FCF080260972AC6BAE2670C7383C2E297D1721428168F8C8", + "section_salt": "94339CFAA454A5D2E977F38C35E2844D" + }, + { + "adv_header_byte": "20", + "aes_key": "D79C9AC03BE4012DC980193BFD6B9844", + "data_elements": [], + "encoded_section": "35911000711C9EC86B8A068AF07B7FE5C85CC9D39004D54FC742603A383E4F153DBB7462EA99ACDCA8E5B667784D8DDB99FE360DABB7", + "identity_type": "provisioned", + "key_seed": "6FC2E3B1B4E9D1A97ADE86D36D78F377C5AF881DE70D981C8553DB86D830F617", + "metadata_key": "FFC3763940BF40D4C90C1C9F1A108195", + "nonce": "5FB63D89B5C5D0A2908B0A62", + "section_mic_hmac_key": "3F353E77278CAC09E16D0F86B6723510700210D5C8A73E6EEF04921FDDE689F1", + "section_salt": "711C9EC86B8A068AF07B7FE5C85CC9D3" + }, + { + "adv_header_byte": "20", + "aes_key": "CDD28EF3B99341DA9DE1C30C254E4430", + "data_elements": [ + { + "contents": "99CE21E4964A6A7C14E6BF387369", + "de_type": 361 + } + ], + "encoded_section": "46911000E9FF177F159C1A081403717389F200EA9004505BB69C948A0A4849FEA66E702DB7500BC961E0151EAD701AA1BA69C29A1E2B363678656DB7E72D4A98AA28A8894CE84B", + "identity_type": "provisioned", + "key_seed": "A2A3EBFA3847569FDC2713784A56CD71A1DEAABE14190EC0B86AF832EEBBDD59", + "metadata_key": "4432862698BC0A055C41E6219F86C655", + "nonce": "64C1217301A32C5B82B94358", + "section_mic_hmac_key": "C78D782F47CBEC0D0F0470DEC491B8808A6C08E71F5C325E0B359551AE38ACA4", + "section_salt": "E9FF177F159C1A081403717389F200EA" + }, + { + "adv_header_byte": "20", + "aes_key": "F2912200A19661C7B3256F2ED8D635E1", + "data_elements": [ + { + "contents": "7321", + "de_type": 467 + }, + { + "contents": "", + "de_type": 743 + }, + { + "contents": "B58EA8527B77EB7DBF5CF9D10748D743DF6E8F37D8", + "de_type": 592 + } + ], + "encoded_section": "5591100029FDA91C6673EE9F5E81041BE492146890026FF0F473F33B7DE9BFA2EA578382EBCBE4227D5570F2365433A6A4751FD10BA87D17552C9315E4ECA5A45D4EA4F20AC118D0CF61A0E0E49E90C9658FF4D1CC6E", + "identity_type": "trusted", + "key_seed": "FD7967CD290B0ACCA1FB012C6B17FADB54CC062A92E4E3F095B6221265606BC3", + "metadata_key": "7485DC8BD4A36F721112C2947751F068", + "nonce": "CF3A08D31D6DB3F85ABFAEFC", + "section_mic_hmac_key": "DE0AB90DC2E5437C201A96A529552965E9113AE01E76E225E906DB2C854C4F74", + "section_salt": "29FDA91C6673EE9F5E81041BE4921468" + }, + { + "adv_header_byte": "20", + "aes_key": "425A003859115F90D385DED38FC3138A", + "data_elements": [ + { + "contents": "FF1E4283ACD7", + "de_type": 592 + }, + { + "contents": "FBE130FC8F63BD7012", + "de_type": 224 + }, + { + "contents": "7DEDF0BFF3CAAB7C6EEB72A4F7B906AC50A92F6E27F0C0BE5DA402D6E1", + "de_type": 740 + }, + { + "contents": "B3929F152C596C0BEF4233703F00B6621C1FF3A358F3C86DCFB16B72", + "de_type": 312 + }, + { + "contents": "0F5043C11D1C467CCDCB83DCE0BE43AC1D94DD5611", + "de_type": 891 + } + ], + "encoded_section": "A1911000D3F3AF795C519468EFC23F73081ADE8E9001D17E0B80D5304A3B3078ABD224B53EEFF7BC4D82C69097FE3731085ADE750593E3267702827CB9CD176EE205CCE43458E2AED220AABE1587FF7FEEFA571B629E2A205D207044EA651809B9F5C9102C35E0368A0C22CEA27DAF899A987DD40352EDA04C8DDC7ABB3B6F279C7779162B472543393F37A9EE4A9A6F1E6ED3EC8E46551715F1F254A13E0604C71E", + "identity_type": "private", + "key_seed": "CBD5BDDC7DF1CF4DE8C67B8C5D8B3936E4370BD2FB8674BDD032DAB651935098", + "metadata_key": "85F9B7DC74148374E28EE18DEB067DDC", + "nonce": "64822DF95082DD9FAC3ABF49", + "section_mic_hmac_key": "DCE1733FCC2792C2FC5E717B60BF387A153B202A6FF51896D67849A33D700BCD", + "section_salt": "D3F3AF795C519468EFC23F73081ADE8E" + }, + { + "adv_header_byte": "20", + "aes_key": "7B1388703BC7E6A02BC3FD5ADA646469", + "data_elements": [ + { + "contents": "7D62FA053E4F6358FFE38CC63265B5C631", + "de_type": 618 + } + ], + "encoded_section": "499110000FB390BC9AC7F8533F693FC4F1C9BD6A9004BF6D2926E7409C8B991DDF484AF4F056C15513C85442EF6D8CA694BDCCDA70B5ED790BFBF4F026113C0E71CFDE64EAB674438D7A", + "identity_type": "provisioned", + "key_seed": "2B56B30BAF8A4D98B8D2D6DBBA920C7E58CC2A308BCBEBC2444E695CDB84DB9D", + "metadata_key": "F9B398674610A9887928F01BFF47348C", + "nonce": "CA88F80E008C85191F0368E2", + "section_mic_hmac_key": "61032327C90BA52D7AE489911943770F4ADC0CBFF70B3C1FCC6C8CCF684D11DE", + "section_salt": "0FB390BC9AC7F8533F693FC4F1C9BD6A" + }, + { + "adv_header_byte": "20", + "aes_key": "C131B7DDCCBF6B9D6697A73183BB9C2D", + "data_elements": [], + "encoded_section": "35911000D6A73EDFDB9C58847962A374CD39EF8E9004564B9DA3B33DE90A04DB8E09C9F74E39B3974D254418BD31BEDAF2079776203B", + "identity_type": "provisioned", + "key_seed": "619CDE7F5C7F48C2A728740F73ED8BED80DBC75A8F80A210B7787A3CA7D99894", + "metadata_key": "894C9EB0A0CD63439D7D38D98271886C", + "nonce": "988D2E9390677C9D60D253C7", + "section_mic_hmac_key": "B9ECF2780619E5BB483F7E67D47D5F6C453260B05B1C6C8B9DE3A1AA200E859E", + "section_salt": "D6A73EDFDB9C58847962A374CD39EF8E" + }, + { + "adv_header_byte": "20", + "aes_key": "471C247B67E71991EEA742A60395E761", + "data_elements": [], + "encoded_section": "35911000AF15F574B747192E9BD4F216FA1B4B7790046EBE5844F9C2B310D203E1F7B096319C81C5F10A0173AA6130BBFFDE2C335BA2", + "identity_type": "provisioned", + "key_seed": "AC53B58E3C5655CFC99E96EDA60B6356B91878707EBBB72C58B40372067F2654", + "metadata_key": "B3C7283A417F10365A58239881EA3357", + "nonce": "36F08B54F7A71C96317A1379", + "section_mic_hmac_key": "C873EDA6670390B6576A70192A1CC51663DC71878502344B4E89570B4DEB8CCB", + "section_salt": "AF15F574B747192E9BD4F216FA1B4B77" + }, + { + "adv_header_byte": "20", + "aes_key": "FE9F6FB58671E09A1A982B395153F5AA", + "data_elements": [ + { + "contents": "3EF87149ABACBBE77A658C12AF57C5CC23549860", + "de_type": 886 + }, + { + "contents": "2FA53563", + "de_type": 266 + }, + { + "contents": "07", + "de_type": 504 + }, + { + "contents": "D174D239EA526214B9F3DFA561C2E67AEB39CB5E8E45006EF7", + "de_type": 727 + } + ], + "encoded_section": "73911000996E2F8D9CA965F32EB4884BFF25EB659002555A82FC0FCC2977E3F47AE4C3ED20652D644EF87BA79F9C7A4D0CEFFF756F6F3EA21275055C45685B915A6CF3500FEB68C62D6DB778D6037719D08E1CE1A47A60BFA574B92458EA9853CA12C6085EDC5B3357767D033BB8BD858C6C45F4", + "identity_type": "trusted", + "key_seed": "797A0E23E450BD746F50A900291EDF12A427207E9345F1ECA7F247754D4E3778", + "metadata_key": "EE52E516F455BF41B9FE45B525300D80", + "nonce": "8032538D846F75783A371130", + "section_mic_hmac_key": "7B1519118268CFD05BE2529648964A31267DE90B31858A541E3B6FA5B5A5BA48", + "section_salt": "996E2F8D9CA965F32EB4884BFF25EB65" + }, + { + "adv_header_byte": "20", + "aes_key": "259CA266C07D24489E2320751FFACA50", + "data_elements": [ + { + "contents": "1293957F338220C0DFCF99BB988D4B10A2", + "de_type": 588 + }, + { + "contents": "A66E4E117DE27225", + "de_type": 527 + }, + { + "contents": "A371A89597B5908CF70EB5CD70", + "de_type": 348 + }, + { + "contents": "EF8C4B", + "de_type": 893 + } + ], + "encoded_section": "6A911000CE373177E0843767D3CBDE3EE36AF17190041C77A0D1B5A6D84E23CEA79D55760F47327519B09C00EF56BA591D952D09BF7649316ABEAA1DB8CBBA6C60CB9800B14CAA592DC6BE015529375E516D04DB3364041E1CD3C4545F053AE220D2AC5D9A1D8F15A18A5C", + "identity_type": "provisioned", + "key_seed": "0C8BB4BAD43C47257EFE360BD5D5DBE4896E84694141ED2BFEC0489578B217EC", + "metadata_key": "0F57379CD24569CF8D875802667F8018", + "nonce": "2537E78DBA5A7038AD729338", + "section_mic_hmac_key": "FC12ECFFC1AA17039E7B4D5671BD50D23427170DE99771C2560D50630AAB4FDC", + "section_salt": "CE373177E0843767D3CBDE3EE36AF171" + }, + { + "adv_header_byte": "20", + "aes_key": "75678439AC49152DF67381CC8EE0C97D", + "data_elements": [ + { + "contents": "AAF565A6056E72F5701175", + "de_type": 900 + }, + { + "contents": "", + "de_type": 882 + }, + { + "contents": "1BE514ACA5DB37", + "de_type": 958 + }, + { + "contents": "4E37988B6C6BEA4DB361B0ABA2BB437B4AD2A36629E927A798C952DD", + "de_type": 994 + }, + { + "contents": "7A7051FB81E50D6E053F5485690060BB125BF0B564C25E8141F18A96", + "de_type": 502 + } + ], + "encoded_section": "8E9110008CF745CF3EF5643BF08137D12572917690017A062343BD2CA81B100320E63F160D60C0E4FA222E7E8D2DDEEF54E8DB3E6F1FB8ED544B20CCC68B7325C41E13169FF9243D361927D8B8D70CB9BAD2BF8D144A7E7181AD04B286370859944B00B285A07237C9B7C06ECA02F133C1ADB18676DB418CB0F625548CEE8D1EC557723967A2DBE6B6FDE4266E810D", + "identity_type": "private", + "key_seed": "B2289A540886CA52A77D25F5130E9772E28FCE89F62ECC13606D63DCEE99DA3F", + "metadata_key": "982AE1A57B20C2386179D149B6EF266F", + "nonce": "80CD1289986D617F60412E98", + "section_mic_hmac_key": "7568EA434871461F5D6FC2DD811AFD04A037DDA922D703E0C62B59BE3FD8463B", + "section_salt": "8CF745CF3EF5643BF08137D125729176" + }, + { + "adv_header_byte": "20", + "aes_key": "7BB7CE9DD41A841A3D5A7EFD4C320177", + "data_elements": [ + { + "contents": "AFD0D457BF0EA8EB58FB", + "de_type": 663 + }, + { + "contents": "2E252A7580FA1B62063666B69F3C6332E4B8F9707C7A21E9E02950D9C5", + "de_type": 817 + }, + { + "contents": "B60A909ED57A8DE3A7860923B92A7D5F6A8D", + "de_type": 800 + }, + { + "contents": "B6C8C14C3304DA", + "de_type": 874 + }, + { + "contents": "44359C8173B6FB9A92391A0EAE5C6CED3795595BF808E685FEA3800C", + "de_type": 41 + } + ], + "encoded_section": "9F9110007C40D5971CAF5E56EA8BF03ACE6BD22D90029D30A51708C5EF060F6B2302BBAFF4C86DD795B8E6C90593DF259C7456F78C3C538BB0F15EDF17939A6C167B07648A62BBEDC503DBAE8861E36C6D465288149E9E99BC0514AE21D81EE7A68420BED4EC65D36A625CAB083EF8AA67EBBEAE047778D2B1A6DBF17FF25BC013B70582694E68E21E45C2537CE508A82751F5079DA2D24255E6800D7B48241B", + "identity_type": "trusted", + "key_seed": "ED15F635173F72E83E0FECAE6051EE847DC187452B21CD45FAB6695D6B46FB6A", + "metadata_key": "FA3B46AB691AAA00B09C9CD962E3811C", + "nonce": "40AB25BE3D15124FDD3852C2", + "section_mic_hmac_key": "EA130B96787E966323391209C412448E67E2554BFC79E1D0A4C1D8F28D29840C", + "section_salt": "7C40D5971CAF5E56EA8BF03ACE6BD22D" + }, + { + "adv_header_byte": "20", + "aes_key": "09E7B0FA69B5C2148852706F8C5F82BD", + "data_elements": [ + { + "contents": "8C43E3E02909D0E210F56F35F3A53ABDB0", + "de_type": 153 + }, + { + "contents": "45", + "de_type": 747 + }, + { + "contents": "EABB820A273B4051E4", + "de_type": 653 + }, + { + "contents": "", + "de_type": 828 + }, + { + "contents": "640DA947E4BA04CC0C40BE9FA8DA6819E90ADFAB03675A24BC2D66E541", + "de_type": 780 + } + ], + "encoded_section": "7C91100049432641BB8252194672F33CAECB191190047289517226E7FBBDE5818FD68CEAE9209FF8BAA41136E4807358253C75094411B689D301DC04E3516A85D40B21DF0700D7B92EC91D1EEA36287C7705A61105847DD7D8A428E634D74A99BE9AD6EAA73D38FE8F69CE611C48AB50D989C8E64F6E8E01A44AD1A5B2", + "identity_type": "provisioned", + "key_seed": "B169199CF07A1D54ED407BF64823FF86996412B093B8484B37834D8924EF93D4", + "metadata_key": "9E2A47BDDF6F1B9BEA356760D0F3E69C", + "nonce": "1BFD42F51287EB2A9F5E1F4A", + "section_mic_hmac_key": "3BC6B7E8D9F2574AFDB2475C7446292E50BD425D7C29210ACBB02926A8BF3446", + "section_salt": "49432641BB8252194672F33CAECB1911" + }, + { + "adv_header_byte": "20", + "aes_key": "3895442EB8CDC0F81A3C413255B87845", + "data_elements": [ + { + "contents": "8A78F02365C12DF7959D96CD0DC8D50C000230D7500F2773BF92", + "de_type": 791 + }, + { + "contents": "6494FA1960D6F8", + "de_type": 709 + }, + { + "contents": "DF5B46AF34309403DE697850F22EB80BEB", + "de_type": 10 + }, + { + "contents": "5BB5A41FF36679", + "de_type": 284 + } + ], + "encoded_section": "79911000543133A572BF9818330781F72566EBA39001945FCDA195E5DD57E890340E1145DDB3E7F29F61570FFC84C816A65BECF670144691E6DEED393F745D1C2FCA8F81A02EB783E970DFF3182D3A0DA22DC6046EFA6AA8311E1B7A9B9B3397B1C7F2DA32F5AF4A59698565FEB006903A3A2BB2AA774E65DDA3", + "identity_type": "private", + "key_seed": "41A397419E6A7A9BAC80625800C7C5CFC5A9E38D334423670A10C95B46385944", + "metadata_key": "6DF6268ABB94ED2B7572647828350E37", + "nonce": "3FFCA5B7F335F4080095078A", + "section_mic_hmac_key": "8E01172131A0E1AF5B2E800FBB4F6B941561F6A25326CCE3FF8549C87F059B75", + "section_salt": "543133A572BF9818330781F72566EBA3" + }, + { + "adv_header_byte": "20", + "aes_key": "FE335C4919EB054F5D03A0F3659BB5ED", + "data_elements": [], + "encoded_section": "35911000CF8C1FF97CECF7F829F6C8A71E77CD779004792DD541DC78082D871E1191261E74A3B8E20A809244EC191525C631BB404865", + "identity_type": "provisioned", + "key_seed": "354C47FE5F08043C0739F02C7C491A5CDC2ADEEABE5C95CA26EF56D3301F32F0", + "metadata_key": "0CBB7E1212820A68D7DA2C386E9CA368", + "nonce": "D0CF770C2DF7104179F8FEA3", + "section_mic_hmac_key": "D94E767398418969D4D7F94690A8BCBE3E5D7F85990B958A83FF465E723CA19B", + "section_salt": "CF8C1FF97CECF7F829F6C8A71E77CD77" + }, + { + "adv_header_byte": "20", + "aes_key": "ACD71592FCB1FD6C6D8ED46C23769315", + "data_elements": [ + { + "contents": "C8A12CCC17EE72A7AB87A19A", + "de_type": 38 + }, + { + "contents": "2A0E63613F23C6B46B0C7FA2F22112381E62F5B1E9", + "de_type": 129 + }, + { + "contents": "80F038E4063FBDCD0612FE767119359E", + "de_type": 564 + }, + { + "contents": "4DA8FAC9B8994DB6", + "de_type": 3 + } + ], + "encoded_section": "789110000F3ABCDAB5986222DDFCBBB8FF38566C900428609F59EC9E471AA93544E7103F645AC96E4FAFC86CDD5CDA58B682D3FFFA015B6578E6C2E1C21AA406B7175401D3FCE1ABBE909A2A50C0804D4E1A8CAE5E27B1BED0823246EA34539ADC01915175F58B47E44680672B72EF54451DD632977507326C", + "identity_type": "provisioned", + "key_seed": "23DFBD6B52C3B59B254DB98D406E8479C25020C1DFA630A8BD2C89F88080C615", + "metadata_key": "379389FFDDE6252B5130D231D63472DD", + "nonce": "15F7BCC7074470D3F1CFB56D", + "section_mic_hmac_key": "BBD2B93E7B2477438E34C1205D0BCE0B365A7BC302EDB5CF0F82B6894603E24D", + "section_salt": "0F3ABCDAB5986222DDFCBBB8FF38566C" + }, + { + "adv_header_byte": "20", + "aes_key": "BF15896C0DB200DAE1115AC614084DA2", + "data_elements": [ + { + "contents": "B874CE053E51E004F52641A7CFB2D3B0FD74B7DBE178776A671A0DAE2F", + "de_type": 302 + }, + { + "contents": "913E81800F04456267ABA9E4782859A4E1C7F9BA7E9F", + "de_type": 115 + }, + { + "contents": "803EF3051156701AB4EDAEF5FCB355594348E96537E5EC0571BE99", + "de_type": 353 + }, + { + "contents": "CE22", + "de_type": 749 + }, + { + "contents": "8BF83F936CA560AF25B8E0FD2C", + "de_type": 140 + } + ], + "encoded_section": "A09110000909CE4451ADA9FEAE94AFC32F74DA8C9002500BEFA6439AF0E094408096D11836FF233FD696C45B67FC5FE377CA37A7156D30C7747C04731ED487D679E79747AEAB7B9264C1F02FF4B3B56A6282FF1BA99927C50B6CB9A5AD8300C58F0DA8D189F7B891E3165A3951B9587FCEAD411774E3C191ED51D02878659572425B45D0098395AC66421C05B5B7984A66B82115AB609678A5B2E8B109BB1DE8AE", + "identity_type": "trusted", + "key_seed": "D32BF06FA8E93B413768C8F0CD5422EC87FD4F07A83471240BA220E36153FA02", + "metadata_key": "1FE225A34E0798FF526E8B55F10AD9AC", + "nonce": "B54225F9D30F237B635A51E4", + "section_mic_hmac_key": "CE683F20EFFEBF4F062DA3EEDB52DDE50B32C8D63BF2B8A5551EDDD354940500", + "section_salt": "0909CE4451ADA9FEAE94AFC32F74DA8C" + }, + { + "adv_header_byte": "20", + "aes_key": "5C0FF3E5206B0B714A43B06D56DA4CD8", + "data_elements": [ + { + "contents": "B83154F8BF3A58B9F7F622486850E19C9798FF7B0D2B57DF1ADB", + "de_type": 604 + }, + { + "contents": "2855D0AD4AA6C16ABB392AA9EFD8A0973235E86129F8CD652F1F", + "de_type": 362 + }, + { + "contents": "8744051612F79A9F05D48FEEF1F276B6039B4EA57B", + "de_type": 639 + } + ], + "encoded_section": "87911000DB30A3E8AB8EB0FFE1A3C1C32107E97F900229702D3456ED474EB3634E1123F78A5EE68795E469986D32E140F7768372A49544565B77EDC858130D8F31885D21142238E6160BFBC4AA1E2C16617029B098225727DBE761B39D8C4F3A9B81DD79320B786B8A73AB12495BDCA873416489EFA679DBCF4D890CB24953E193DC729A7FB13CD7", + "identity_type": "trusted", + "key_seed": "CBD84DE224729EC23993EC958BA5EC191C55984C7565A37C202C66BC2F496DC5", + "metadata_key": "E2C1CC17E5DA3035D3A4A9D67B696A8F", + "nonce": "1769E6807F6DD41EED99365E", + "section_mic_hmac_key": "3B760F5F10A764D965E928C2EC75BF3C185BC1E60F1BC25E3A4F2A23B08275C9", + "section_salt": "DB30A3E8AB8EB0FFE1A3C1C32107E97F" + }, + { + "adv_header_byte": "20", + "aes_key": "EF4525C9E148E35CE5B6B1ED3EC7F397", + "data_elements": [], + "encoded_section": "35911000F37AF80B78106073DEE5B3E89CBE817690015242E1B8F8D5B0AD1A98BB81C0B7AA6E2F08129AA0AC99057C4EF93D009FACBD", + "identity_type": "private", + "key_seed": "45E271D048743BAF708F32EAC2E0C37B0AD50DC468268F45FA5A00F273710BC8", + "metadata_key": "D5BB4FEA17C7E817338B14C4D01F95AA", + "nonce": "9EB99045CCBB3943C3C85689", + "section_mic_hmac_key": "94142F9B2D08B819B2681AA5A8532AA239FA5D248DE1400308218E1171A19B2E", + "section_salt": "F37AF80B78106073DEE5B3E89CBE8176" + }, + { + "adv_header_byte": "20", + "aes_key": "D7B12DF79375EAD42C400EC4B32C845F", + "data_elements": [ + { + "contents": "5EC3", + "de_type": 27 + }, + { + "contents": "9E9931D907110614B32CD6406AD1F2EB87A10F09B7E8E787112EED", + "de_type": 473 + }, + { + "contents": "D832A59D", + "de_type": 739 + }, + { + "contents": "F9A4AB6E8C79AA9949", + "de_type": 326 + }, + { + "contents": "DA3460FC544F1F95", + "de_type": 983 + } + ], + "encoded_section": "759110009631F8139C4DBED9E68452694DDFC8839004ECDED2D0BE3DF39682EB8C2218A08B11479557857995B61401E0F13ACAAD078B464F1BC371BF9374A4AC12E24E92258EB2020E02A85BBB90568AB3BF976B36BECEC7BA4D0925816AD13747288FA4FF6F5533C22E342606A7B9929FA0A5672FAB", + "identity_type": "provisioned", + "key_seed": "869972ED54E5B68EF1C466213667435B7C08EBDDFB74F685ED7E16CADB6BD315", + "metadata_key": "4B943DF47FA8A1A5ED1983F6BA680BF1", + "nonce": "0A885C98D19D59923D1D4CE8", + "section_mic_hmac_key": "0FF1627C891D82AD29699A9382972D0D134EC708C71ABBB25F117C50E7564E7A", + "section_salt": "9631F8139C4DBED9E68452694DDFC883" + }, + { + "adv_header_byte": "20", + "aes_key": "D99D1918B0ECB9895C5079AC3708F8DB", + "data_elements": [ + { + "contents": "9504B53F3858406A21CDB1A8E6E4726EE54D26EF868A1CD0FB3FB6", + "de_type": 354 + }, + { + "contents": "", + "de_type": 219 + }, + { + "contents": "E68CCEB0AEEAD509B8D936D690940E628CB3446E7A5AD4", + "de_type": 570 + }, + { + "contents": "27C89F3446D81FA865168C6942", + "de_type": 663 + }, + { + "contents": "A7B1EAF81C107EE58AC4433F9B2F9194A1C5B3B31F7DBD775E8C", + "de_type": 854 + } + ], + "encoded_section": "9D9110007E27BC504F56BB2720C62A72226B8C369004EF6CDC81805C1A1B8C3689B047217487EF72A690D9EE8B7DB36DE15EBAF6746CD77D0E9C979344B10045AA56EFEC9ACE8DCB27C444163CEFE58CD7DB8F33F3BFB3F34483F7EDA5D0BDF0DFDCD63AD61AC00E548B445F480EE3F2B5F7CBC8646CB6C916CEBB660725C6735F7105F9FBFA765E51EE242D53E97F79F4FD2151590529DE523296437B2B", + "identity_type": "provisioned", + "key_seed": "C50E2225963721E5B6EFCE5B1A228B14BDD2BA34AA67E7225550B081BAD88726", + "metadata_key": "062D3B665FE311167539CBC5BEAB9BFE", + "nonce": "E35AE35D209210B3880DAAA4", + "section_mic_hmac_key": "80C63B2ACF7CF9FAC9852D0208BD4797B5DCDEF5A3F4BA561D07FD2ABEED9F03", + "section_salt": "7E27BC504F56BB2720C62A72226B8C36" + }, + { + "adv_header_byte": "20", + "aes_key": "905119285260089FF9BE8FF6CC825E02", + "data_elements": [ + { + "contents": "C7773F175A4EE4", + "de_type": 167 + } + ], + "encoded_section": "3F9110002F823378B9F59BBDE54978A162E849E09001CA8F84780BF04A3EA8FBE518141707B75121CDAFB8F0E4A24D354D5775AD46CD6E698AD77AC066B5250F", + "identity_type": "private", + "key_seed": "4D8C6CD25657A64D6A4FC29AA77B921362224AA73F33A03B48A547BAE062F80F", + "metadata_key": "0E77A2EF879199FCDB210192BA8F61BD", + "nonce": "71FCB2AE5A7E75EA035E4C2F", + "section_mic_hmac_key": "4C314CD5B4BA1DA13BA002B6F8B5B23B83E52A3151E8D3188B18A9116D393FB5", + "section_salt": "2F823378B9F59BBDE54978A162E849E0" + }, + { + "adv_header_byte": "20", + "aes_key": "58242E8A9A5B025E720AA40BA1CB864D", + "data_elements": [ + { + "contents": "786DF190FA", + "de_type": 989 + }, + { + "contents": "C35CCE593DFC7F1B67D9FDB6DEB00A", + "de_type": 8 + }, + { + "contents": "CD5807FFDB0B16362997F91B45C3F1", + "de_type": 736 + }, + { + "contents": "AE7B1B9F94", + "de_type": 485 + } + ], + "encoded_section": "6891100064EDA38990FF5640000A6F909B9B4C339004B2D2CAA61055C3A3B5B633A6864D112D20D55DD235B254BD1B4DDE1ED246B422D549F6ED9EBA4E61B144AE199F41786257AFABFF2D09F5ED1D551AA90897424C7DE78D9F4211352DFC23D15FA49BAF2AA3160C", + "identity_type": "provisioned", + "key_seed": "930ABBE8D4AA0392A66E624A958254C607E161BDB8F63C4DB39E049C200AA63B", + "metadata_key": "06190C656B704517A79EBE4A713C90D1", + "nonce": "08746932375AFD8D733B8CCF", + "section_mic_hmac_key": "E9018DBA2F5D458EBF7F765F5E0A291DC789BF054BDD7F21ABB08F3C9CE0C068", + "section_salt": "64EDA38990FF5640000A6F909B9B4C33" + }, + { + "adv_header_byte": "20", + "aes_key": "2E74FA5A2A52433667B756AB26FCD187", + "data_elements": [ + { + "contents": "A60BC355C90F28BC4939E07D1CE8FDA9F3BFBC190219B42A0396EBA4F4C0", + "de_type": 59 + }, + { + "contents": "5D789F74C3EDE4BC72D2E79DE9AAF8", + "de_type": 990 + } + ], + "encoded_section": "6791100074C764F6E930524EF16015CE7D9861A090016D3B7274B511B5F2C9F5A18052F777C5F86FA997CE3BC22C9C6C9A5CA085DBE6488B2A78C6A73EC270656AEACCB923F608AE77568EA51827AE96FF9E6CE819A78E0A4EB2C5CA3B4970BD181F397E3E98EE7B", + "identity_type": "private", + "key_seed": "2AF41D8404581C2831B893C7DB59D544B64CFB736BFABC81A01C1875066EC279", + "metadata_key": "CAAFC39835637CF21D4B75303E2CC3AA", + "nonce": "22231C84688BAF0FB9538C9F", + "section_mic_hmac_key": "795A1998284D2DFE1A0E29D8118E10D830AFE527DC341E2654B88F2C1EB1B06A", + "section_salt": "74C764F6E930524EF16015CE7D9861A0" + }, + { + "adv_header_byte": "20", + "aes_key": "7B2C7A448A3450294EDC49709E51BA60", + "data_elements": [ + { + "contents": "E1CF16D6B5287453B1", + "de_type": 956 + } + ], + "encoded_section": "4191100052105E2C85C91460D02A73EEF05F82709002CFD75D43FD7EEBFBB78A62325C09B1C96593C0ED6CA278F49AF34804167F948B99611B4C536AE40E3B74243E", + "identity_type": "trusted", + "key_seed": "E685FFAC5E3BAAF679C7991522FB5A6CEC3F100597766673D2746868D929D360", + "metadata_key": "6E6DBC6DD5DC80171A5B0DCD03F1BD90", + "nonce": "5677F857950960AC98F055B4", + "section_mic_hmac_key": "F47EFE70DD21595388F4747DC599502C15BDE2199335DF51DE8F50A3E6858EE0", + "section_salt": "52105E2C85C91460D02A73EEF05F8270" + }, + { + "adv_header_byte": "20", + "aes_key": "640ED142DA551CC82073E01140C9F6FF", + "data_elements": [ + { + "contents": "CC848267E64EE36BD16459", + "de_type": 1 + }, + { + "contents": "13C03AE9514CEEA49B840E14C3D8FABB", + "de_type": 287 + } + ], + "encoded_section": "55911000B89F5B7D2D1679457B14537AA5D43AB79001E4AE76D2D7376A024CFAE9AF27D5D51D4409BBE5B1F0ADCE4EA97CA14545F965091703432E7238CD345852880A893E18B154A85EC8F2B0C80B28C20376224BC8", + "identity_type": "private", + "key_seed": "757A5313F590A0A3CB7880514176C98223D8D89B6C366F0A9C3E614A95667FD3", + "metadata_key": "8E48AB97578B936E9DEF574317F5643A", + "nonce": "2F4D288A2F3C29654024DF64", + "section_mic_hmac_key": "87973F076C0DA1706FBFA208CF3680032F72EFD30A1F35DBDD720FEDB5A73FAA", + "section_salt": "B89F5B7D2D1679457B14537AA5D43AB7" + }, + { + "adv_header_byte": "20", + "aes_key": "25B113A142425E28DBF10262674CCB91", + "data_elements": [ + { + "contents": "2DC3DFB78F9FEDA6140EFFF49EA5CDB1587B3B", + "de_type": 38 + } + ], + "encoded_section": "4A911000BD6BA0CD360D3ECEAC02350FFA2287AE90048C31FDA2D808BABB89DEDDC545DEDF43A15DC84FBAF251F8553C3ADA164CD855C3392347333E6ED803F1B35A04CB2DE8491B0AD57C", + "identity_type": "provisioned", + "key_seed": "B94AF2DE34B622260AB6EB5A28897241EF07FD726FF6B46B09AB855B74BCCE21", + "metadata_key": "12188B3AAA6203B3D7B7FFF944B28C03", + "nonce": "27D5AA6EB9343720C99B48A4", + "section_mic_hmac_key": "F36CE020CBD605AB0D5A58EEFC5B13041B3E8EE37FCD23DA8768D05B7E969217", + "section_salt": "BD6BA0CD360D3ECEAC02350FFA2287AE" + }, + { + "adv_header_byte": "20", + "aes_key": "86BEC41ABB2C0615E293D625F5A5CC21", + "data_elements": [ + { + "contents": "796D434C2A64E6542A6E8A182C29A6C0A0D10CFBE5", + "de_type": 697 + }, + { + "contents": "B166F37A451DE048DFFE08768C22CC9E16161DE1FC111BE153E74567A3AF", + "de_type": 786 + }, + { + "contents": "15F72C03BCD436FB515626CC4D45B007465E01F99F141A06C2452D08C031", + "de_type": 75 + } + ], + "encoded_section": "8E911000D67B70722D003E7D47A47A965DDC27EA9002BC3C5974EFF692C78D91B4BC70B183AC34AB08D6774A186DB2EAE6518C429EF6EE80C853B3F36AFF69463401AB265A7841C55974F8307B351ACD0AFC676A7F8E3B6785354E8C8341AC1D159B3449674AB3FC1664DC6A98CBE7B365D5F29CCD0945B37F3DA5B15711A1554A8D20DE4E9C36F89AE8CDC0529F18", + "identity_type": "trusted", + "key_seed": "8D0769C53264F0E56940C303DC296FD0FAC215BB638670FDE74C2D254EC351B6", + "metadata_key": "6E402856AB9B61F6C85EE44427DC3B78", + "nonce": "76315884D2C7B9F90A9E40BF", + "section_mic_hmac_key": "E87538BF29EE50BAE15333A281438C3A5776A0544CC3AB1EF84612ED7D59D40D", + "section_salt": "D67B70722D003E7D47A47A965DDC27EA" + }, + { + "adv_header_byte": "20", + "aes_key": "F22B4181441945D8B70988072189C682", + "data_elements": [], + "encoded_section": "35911000324C90A945FF9A8AECA1AC7F71C9B7FB900106FABFF1B5D76193C4196B7CE59C3AAA8D2FD16CCFA6CF09E8C226BD7604AC56", + "identity_type": "private", + "key_seed": "BD5DE9F03A2FAA422C470AFC4F151615F326CBE3E60828C0ECF68CF1215BB760", + "metadata_key": "60FEAF935A8ADA1C80FECDDB8F4290A8", + "nonce": "74FF9C6FC9B74DBC58D80EEC", + "section_mic_hmac_key": "83F5E26CDD98C91D084CD544BAC0EB6C79F3B79B388575973C75F76C66671427", + "section_salt": "324C90A945FF9A8AECA1AC7F71C9B7FB" + }, + { + "adv_header_byte": "20", + "aes_key": "48543F7CDFE13F94F1FF50E76088C2AE", + "data_elements": [ + { + "contents": "9AB990FC7EF63FC213AE08BC81C35EEF8AAE8DF403E17839D9F25C30C7CA", + "de_type": 731 + }, + { + "contents": "2D33ADC55687CC6D516326D3083A01DF79F7C20347BE2BA49726", + "de_type": 652 + } + ], + "encoded_section": "7391100008FF6026C41A8392B3401F690B0FA3E3900456BD090474095981D8D630D9AC342F4DBB5653D8CC96BB884B960AAF63A142323A4C41B7B287DE61D6724BAE3BD0C9692357BAB8A84265443B452CC632A26228824ED3B278FEA3E89BAB1F849DC2D59B92F7923D886E39B641A0824C5754", + "identity_type": "provisioned", + "key_seed": "80D21E28838910DF3318A81884493AD8B3156E22B9EC94DF8E440963D1E6BB0E", + "metadata_key": "F588CA28D3A30ADB81E4CF0F154FC445", + "nonce": "E3C19711F434B76AB66ED99E", + "section_mic_hmac_key": "5C093723FBC9061053CBE302658A97A8641724524D38B88FA576563153E43944", + "section_salt": "08FF6026C41A8392B3401F690B0FA3E3" + }, + { + "adv_header_byte": "20", + "aes_key": "EC4C02761EBCE92561D9876B86277ABD", + "data_elements": [], + "encoded_section": "35911000812086DBDE127B30D0A49750706EFA7090023EAC44AC52CC19411C1EB8A3B054D3A4DA29BA7AB1F48B2B66D53A0E89BEEA81", + "identity_type": "trusted", + "key_seed": "F905BB1C2C53DE72F94DF4E6D2B06BFB56BE0B64FB9388FA64D0532ECBB2EA91", + "metadata_key": "3FA740734AB4B08F591E7A1678684145", + "nonce": "7DFB4025DEE53AAB242382E4", + "section_mic_hmac_key": "C606528062B1FC77C27EEF4A4C3C2DE18672B5334A4505036F0F7D8E3FED343A", + "section_salt": "812086DBDE127B30D0A49750706EFA70" + }, + { + "adv_header_byte": "20", + "aes_key": "08BF72906B4385228E63E345F18A05C0", + "data_elements": [ + { + "contents": "9EC2961EB5315850F02F", + "de_type": 332 + }, + { + "contents": "75A55F90EBBF", + "de_type": 89 + }, + { + "contents": "5B1B5253D80289F8F01BE72974EEBDC3ED", + "de_type": 204 + } + ], + "encoded_section": "5E9110007EAF5B0AF95F689E81F61A051D316FD49002DB318ECF2B751DB740797728EA96E14ADCE0B2BB27EBFC6D45312379906D6494808D7E9C8BA6242B4A02C4C23223112D77B94131BB9BE739661753C158001AF9CD0EDF73B899AA266F", + "identity_type": "trusted", + "key_seed": "EB8F85BE87A0A9347B3CBECE969B008A57FFEF6E4E8A95F734893EE710B27FE7", + "metadata_key": "825022A58B49C829B9B524E12AF0E160", + "nonce": "B5143876982CFC9AC88966E4", + "section_mic_hmac_key": "F649D8AF765E2E31FB870480932F4952FFCA19301F2FAFCBDB992928268BC8D5", + "section_salt": "7EAF5B0AF95F689E81F61A051D316FD4" + }, + { + "adv_header_byte": "20", + "aes_key": "6FA3188C366D18061138ECE126A97BFA", + "data_elements": [], + "encoded_section": "359110006B869584D8B9A2617A3911586E08679290028283D6FFC57D5D5FC3690502E95413F8BF29DF7EA841527BBBE6DE1C918E5B35", + "identity_type": "trusted", + "key_seed": "4ABD1D1549B74AEECA657499EDEFA7701D724FF427142DFA2ACA1A087455E339", + "metadata_key": "32152EC7E3BD86FB1D19DB1136E934EC", + "nonce": "5F7C76D24DCFE9E61B909C2D", + "section_mic_hmac_key": "89CC3C25CDCE4A6D36EDABF94C225087C455DA885AA113254AB3A71DAB0F27E4", + "section_salt": "6B869584D8B9A2617A3911586E086792" + }, + { + "adv_header_byte": "20", + "aes_key": "46C102A2CFEB44FD44236234AC618374", + "data_elements": [ + { + "contents": "2DAED2D919", + "de_type": 752 + }, + { + "contents": "69642A6B9FA86810", + "de_type": 907 + }, + { + "contents": "C9133E66C06507782EFCA12CFD2255DD2AC3CCFE568E5B", + "de_type": 75 + }, + { + "contents": "11917BC9DB942E", + "de_type": 253 + }, + { + "contents": "B772136AF949D06B3C74EECB6A2877B73140CF7BD459", + "de_type": 741 + } + ], + "encoded_section": "84911000D5B533CD04983822338C7E4679ABF0069004CB79ABFEA568754DF58A73D97993AE327F22F6EA434A49AA5D12110FB08F88A77C3EA795B49DFE542046BE6FF89B46146088D770CA8D4E221D73BEECB978974A7E3A2B29C0FE7002230356778F0AB6BBFC45279E08D93657B5D857EE9915A3343FDFAD5ED96C886E225EE77AABAB71", + "identity_type": "provisioned", + "key_seed": "B45EA904C8AD8040870C0C5996E7D6474109D43A1ED77CFD4EC5A0909ED8537D", + "metadata_key": "F27F824E7A676B87F008B914C697F731", + "nonce": "A9D31F3FC180A643BFD2393B", + "section_mic_hmac_key": "C57B68D19F0C0467792E61C6129CAEFC41C9BC017CFDBF3ECECFE053247C86B4", + "section_salt": "D5B533CD04983822338C7E4679ABF006" + }, + { + "adv_header_byte": "20", + "aes_key": "E76311EA2FA2BD5E23ADDD81EEB7035C", + "data_elements": [ + { + "contents": "F0A613ACBCA74BE6A2B1EBFD40C52E0D66E5AB04", + "de_type": 294 + } + ], + "encoded_section": "4C911000CC0BB7E46499CF0636B26F05408554E39004020E9465725DE7A884C5B175C90015562B2F9B106F9F1AEC608425109ECAC0513AD32D14354CE552859514849D19D6BB59CE2D0EF9A0F9", + "identity_type": "provisioned", + "key_seed": "CC9A75CC75BB1D230A75AE87B6AA6D14E08ECD864C90DFA2C144DA62AA2FDA4F", + "metadata_key": "D1FA24F308946E26486C02AB69CACDFF", + "nonce": "DDA1727B363F44B3A00AC548", + "section_mic_hmac_key": "1FFE447BB7A8331E0AB04BD9E920759CE433094711AAE085EED90F11AAB04DB9", + "section_salt": "CC0BB7E46499CF0636B26F05408554E3" + }, + { + "adv_header_byte": "20", + "aes_key": "E670DF92DE550C7D16A47FF544AEB0A6", + "data_elements": [ + { + "contents": "5297CB087EF89FF30B412ED7FBFE9B", + "de_type": 536 + }, + { + "contents": "C6C348BA415CB959EE2B51B43DAF200076890AD49B044F5F847728", + "de_type": 555 + } + ], + "encoded_section": "65911000FAF0B973AAED0ADA284F65A67CC775A6900191A4765553BDA369F32677FF10F57E0793B4FC72165819EB2E38975021A78E8367C4BC9A94E846F6A04ACCE516355A0A93938147C6908509D1599D7EA96A377B7ECB31F81BA98D8AA01CED9617C410D6", + "identity_type": "private", + "key_seed": "238046E9C80693E551BF4F3E7E563FDB8FC7EF319A4E3405D603DAA10BFA0AF2", + "metadata_key": "BB080335533CFA2002C3FB861236215D", + "nonce": "30A968C64C6D236C78A202D7", + "section_mic_hmac_key": "20309013BDC66CF400D5E221109AB10CF0E742555D8713BBB332648E3897E847", + "section_salt": "FAF0B973AAED0ADA284F65A67CC775A6" + }, + { + "adv_header_byte": "20", + "aes_key": "236A98706211AAF9BE9FF085882ACD8E", + "data_elements": [ + { + "contents": "6D6AC5C8256B7859373EB86A68E7F9", + "de_type": 748 + }, + { + "contents": "ED06337DA3ACC11B7BD86A0D315DA7A4EF", + "de_type": 703 + }, + { + "contents": "1639315FF6AAAA4B", + "de_type": 855 + }, + { + "contents": "785FD18ABF9AEDED7D3D407144A7BCE2F34444", + "de_type": 738 + } + ], + "encoded_section": "7C911000F1B2D3FF697FEA61F1D24313BA24DFB09004BA73F0D4A7915365382ABF284BBB970F4F4FD77A6B3F48CE433EDF5679495A60CC803BACE3039072420D0FE9C1CBB529280C72864F31A3523FE98BBD39AC48E3A47524E57BC2259AD362901721E8EB8FE1F563C6C3EFF3374A277553D9D41732D44A4CB97BFE1F", + "identity_type": "provisioned", + "key_seed": "2D8D09BB3E1DFAB0611039A1BAF74D5258343FA303332251F86EA7D1FCCBA814", + "metadata_key": "158E2E60C7F45BB9D6487B4BB3984DEE", + "nonce": "9592919D3E310674BFDC2E9E", + "section_mic_hmac_key": "69D008503467933362AFA9AAEB534D22839A8946A0A2AC717553CD50ECBD5D44", + "section_salt": "F1B2D3FF697FEA61F1D24313BA24DFB0" + }, + { + "adv_header_byte": "20", + "aes_key": "52A4E397E30CD9CC7494F1FB77E608AA", + "data_elements": [ + { + "contents": "8C3E52853DF5586EBD", + "de_type": 413 + } + ], + "encoded_section": "41911000BC844E7B944BEB5585FAAB4B71443FE990044489F0D699085E6ECDBC45D5A180550578468BF5FCAF01E7AAFC8612A47B5B8BB81A82E844D8EF05E4B223B5", + "identity_type": "provisioned", + "key_seed": "4975391685B7E23B969FD2EAF9ADAFFDA9E54345F6C978691019DFE171CF1AEE", + "metadata_key": "ABBCF6913AF3396D4698A3D3ED9C844C", + "nonce": "6DBC8A54F98C20F59D424BBD", + "section_mic_hmac_key": "7DA38D6F5976FA186530C3259FC16951302C45E1A182A5B856778AC15D261A63", + "section_salt": "BC844E7B944BEB5585FAAB4B71443FE9" + }, + { + "adv_header_byte": "20", + "aes_key": "81775F391E97501F10A06ACF2C1E1E8A", + "data_elements": [ + { + "contents": "E0E9135120FB76345D7F8649D99DCF21082B", + "de_type": 209 + }, + { + "contents": "A8930F2B30AD1020C7719732557A115B73", + "de_type": 702 + }, + { + "contents": "8F573C102D81EAD9DC", + "de_type": 608 + } + ], + "encoded_section": "6A9110005135798EFB48BFB42A2542E5EC84F8BE90024EDE7FBED7BE6DB4BF57CCAF6B79B42AD2AE82EF17209B1118B1B9BC30E3DC7EE47CC74BE402A40786226E6662CF3C582AECFEDB6BD9FDD87CD780D34B7CC7708714ABD30875A945E6592FC178421FE73B85293353", + "identity_type": "trusted", + "key_seed": "CEB5046E0E41EA2D087D6BB2584FC8F5AC4AE70C3F262AFA2FE83BEFC6A7F96C", + "metadata_key": "09F8FB1D817845D11CE0DD441FB6E6B5", + "nonce": "70D102E7E612845E49DC9A32", + "section_mic_hmac_key": "600AF01CC5117CB4AC58D49609CA3235EA0ADAC22B68D6FEA6973397744E7100", + "section_salt": "5135798EFB48BFB42A2542E5EC84F8BE" + }, + { + "adv_header_byte": "20", + "aes_key": "F3293976BEB4E1EA2904909A54A90D0B", + "data_elements": [ + { + "contents": "AEA9748A963B21DDDC0B", + "de_type": 82 + } + ], + "encoded_section": "41911000CCFD0A49D64FB8913DB3533CD842618F90020B1F2BE6DFF4647003A4CD20BEC2045A9BC3557018B6D8D1DDF5BAF68CBB0043BFE6F7F3A16914E72473574C", + "identity_type": "trusted", + "key_seed": "F7AB19164021C53FD3F406A4F4617A396FBB0B2083680D6A70F0FA93ACE0F337", + "metadata_key": "43CAC734B4E59E6410B789DCA22E05B6", + "nonce": "14B2E4D0A4BE88CD3AEEB9FF", + "section_mic_hmac_key": "6D816BF43B74326FE8A2A88B37CE383F8B46D0C126454936586F027EC60C489D", + "section_salt": "CCFD0A49D64FB8913DB3533CD842618F" + }, + { + "adv_header_byte": "20", + "aes_key": "375B33A2656E245BB1ECD330174673A4", + "data_elements": [ + { + "contents": "54A8E89BD5EEA62D46C39CEE1D60ED4733976A", + "de_type": 596 + }, + { + "contents": "", + "de_type": 599 + }, + { + "contents": "05286DB66919D9F031C704E925CBF68E6B8E", + "de_type": 766 + }, + { + "contents": "95B7B05F119963240B933C337C6FA9B6", + "de_type": 336 + } + ], + "encoded_section": "76911000AB7FA706A14892CDC9CED6E9C13C028D9002D26550BE730945C1CA0C220A658856FA14430A49D45BCEEDE10DD1CAFD274BE5FD828116B8E3E3D71A3F679486A30D832958AD1B2E1415BF7F111BF4F6CCF94634C904B46F5FB2482F8520F7EA10061C018B6C24891AFE186B8144EFB4981D1E79", + "identity_type": "trusted", + "key_seed": "D93D2A387F132BE81714405D487F9323099CD7089ED80FE06DBD5F19B9479AC4", + "metadata_key": "C249909E8C874421F56B5D5FD883F6D0", + "nonce": "3608D422560EBDF764ECC44F", + "section_mic_hmac_key": "ED742AAFE3D39273AC51EC4E94A7E5AD3EFE52D36E61F96ACD446F2A9C77618C", + "section_salt": "AB7FA706A14892CDC9CED6E9C13C028D" + }, + { + "adv_header_byte": "20", + "aes_key": "9911435E27099CC033ADA0B809A9BA61", + "data_elements": [], + "encoded_section": "35911000DB8B02B57082EB58CC198556EBED435E9004A72315469AD264409CF53387374629C4683B4C7D198CCFFA95ABA332D9EAD095", + "identity_type": "provisioned", + "key_seed": "DE3FF3C256080ACA31DCE848A0EF6DE573A584AC3FDF00011207692CBFC71AED", + "metadata_key": "A59DB751175865B4DB9CE9F5791D48E2", + "nonce": "22CEE3D3F35609F5B04F2681", + "section_mic_hmac_key": "88118CAA46862E8B57E83C23387C88F232BF22E5772D80E9EC15B75DA160F25F", + "section_salt": "DB8B02B57082EB58CC198556EBED435E" + }, + { + "adv_header_byte": "20", + "aes_key": "78237E429DEB7FF64A0CF0390C6B5AB5", + "data_elements": [], + "encoded_section": "3591100092F6C10DFBB105F88D53E46103584A369001CEBC52E442697CE7C0439351600F775089647E153AA0A20B8E0446CF188523A9", + "identity_type": "private", + "key_seed": "3343E7EAA3F48E39F01E5E8BDD5082E6DC4FA5A75E4FA570E717EDECAA9D26C2", + "metadata_key": "65D3B6A2568AE0425F06C2E1A5F75F61", + "nonce": "B44EB10C11D792A4474CD363", + "section_mic_hmac_key": "FA58129EF913C31E017D2583EF3C53A6921C4C05F1F46DFAA29644E1AC8D13F1", + "section_salt": "92F6C10DFBB105F88D53E46103584A36" + }, + { + "adv_header_byte": "20", + "aes_key": "718BB6207F09ABF1767C88964995A316", + "data_elements": [ + { + "contents": "41B733343BE9A40195965F3BE53A9E8DA772F91D", + "de_type": 38 + }, + { + "contents": "CB88998C5B3ADC6834216F607769", + "de_type": 644 + }, + { + "contents": "E2974A19DE611A27FF0AF9D27042B8073563FD2119C828CE", + "de_type": 587 + }, + { + "contents": "4FE69B", + "de_type": 58 + }, + { + "contents": "16A152105C8A1CF879C2838EA6CF4CC9", + "de_type": 494 + } + ], + "encoded_section": "8F91100054D79FCDA215B6D37188275A6D71B49C9002E7ED4C98D0689465F88315C5E1E4CB1C994AF90E6DB73F55D62E14F5F6102EAEC722DD4B819BA652CDA67523910FBF4AD135A678F170DF68642B9A3E651817C280D56CB333C492B7B7C6EEC2718D16DEE888255E9470E50548CFDD8EF3FA1BE96BE3FC9206AF1E806AB72D7CEB2556A84DED90BFB26C7473D6A3", + "identity_type": "trusted", + "key_seed": "87AF0A342940CCE0D8A7C250CEC581D677776EFE684FE7A461538D306F79595F", + "metadata_key": "ADC6D21008E6C6F9C6140DD2CA7A2D74", + "nonce": "DEA185B8030CB125ACCD1991", + "section_mic_hmac_key": "0B96048E575A8DDE941E0BFCC9AF72673B9E59D0EEE1D410EA3B5D7059D8CE43", + "section_salt": "54D79FCDA215B6D37188275A6D71B49C" + }, + { + "adv_header_byte": "20", + "aes_key": "AD321D407A23FC1F3DEA4AFBFCE666D8", + "data_elements": [ + { + "contents": "DE6102C7908322A68E36094307406EFE", + "de_type": 130 + }, + { + "contents": "D811C6749B", + "de_type": 979 + } + ], + "encoded_section": "50911000EEF15DD154F1CBB12B876AB7E4C28C519001BADA4DD563CC46E682BE16A078D5AE079DB587A78C9BD6BB37621F9F8EA5B7FB490D6857D3C3D3BCCABDF00E85438DB6227C002BFA7291D54E5FF9", + "identity_type": "private", + "key_seed": "9B702205F66C701BAE43D0EDDF8C3EAD92C80A3A8583C3397E7A3371758011EF", + "metadata_key": "FF0BEBFC2C42168A47B3474D3439772F", + "nonce": "D225BF85D21A4C34FE6B6AA8", + "section_mic_hmac_key": "9CE75F27AC9E99BEA41587BFFB701F9D59793C68127183BA3BA38D219DBFDD1F", + "section_salt": "EEF15DD154F1CBB12B876AB7E4C28C51" + }, + { + "adv_header_byte": "20", + "aes_key": "D62FF5F858D26914C62F3C93ABD608D0", + "data_elements": [ + { + "contents": "72FFD6C3F4B1B90771A08D281085", + "de_type": 817 + }, + { + "contents": "A4F94F7BEFD75D29A53C2ACDC0A908C2F5AA0768", + "de_type": 618 + }, + { + "contents": "0FBBAC5329C023", + "de_type": 729 + } + ], + "encoded_section": "6791100097FF92E30C6B6E08B416A150E2099C2C9004A34006E38EDAD68F7BBA8294E12E9F92DF7A91259AFC5B813BE7A4FD8601959912E5B2CFBACA99A2460EC2CC0F6DE999F47A7580B9F0CEA2E0F882836864E82CEC3DF6F890269AABF65852CB9CF026D85452", + "identity_type": "provisioned", + "key_seed": "393F3DAA73636DE22AF63B869FFC970C1DAE302372E51F35BAC421F3C354B666", + "metadata_key": "CA8F91CB3DA7A5A37E33F851D93EBEAF", + "nonce": "A521F5DAA92BF1C1654569ED", + "section_mic_hmac_key": "67AADDFA3C1E18B279906DB7987D29EDFEA643D678FA1AB4987A0A1D610005B0", + "section_salt": "97FF92E30C6B6E08B416A150E2099C2C" + }, + { + "adv_header_byte": "20", + "aes_key": "EF85681E26EF87C8D2A1A3EE56FEAD2A", + "data_elements": [ + { + "contents": "C24BDBD7E3697F223F1621217A9C36DC9394EC33", + "de_type": 335 + }, + { + "contents": "C1", + "de_type": 14 + }, + { + "contents": "E4231F2308EB41", + "de_type": 902 + } + ], + "encoded_section": "5891100037E9D4686030FBAC57D3FE42D92B096490014DBC20227A7388E74D0961E8674691D101607D944F8AAD12C950188603894DA02D5FA3698A54DC40598F44313F297CDCCBC1DC14CD32D267267747B0B125D91A89A557", + "identity_type": "private", + "key_seed": "4A289EAEC36BE20656071FE87F8A55155D8A893815038B9ABCBAD3E72DB0C8AC", + "metadata_key": "C0450DFCC6AB17837C56EEDBE57D62A8", + "nonce": "A9FA4AB4C0929CF2CDEDDF34", + "section_mic_hmac_key": "8D45B9467DF17FE0943F155851C70CCEA0555BD59453503FF6A861F9011EF853", + "section_salt": "37E9D4686030FBAC57D3FE42D92B0964" + }, + { + "adv_header_byte": "20", + "aes_key": "BAC1BE39B5BE69F29396EF5CC41402B9", + "data_elements": [ + { + "contents": "AF9A279790C0EB79F07F700C1CED8CAF60B72F", + "de_type": 101 + }, + { + "contents": "14F153F824", + "de_type": 463 + } + ], + "encoded_section": "529110008ED27B5A64F8584EE798DA971BB3890290023D54202AA267D540AD159401DD2CC11E1F387FC4F90C9BA19D810C095D415CDF08EEC637B9CB2DF1259229CB2F02F894D63404B428C9AA33BDA7507601", + "identity_type": "trusted", + "key_seed": "9AAF4E2D596A7B4CA21DF9312AFD43A63FA8FA727DD60273072C4C4C0D472E3C", + "metadata_key": "5F68164865C2DFB852C81375C3D3D5E6", + "nonce": "4F23D7E91CB8E22BD3712FC1", + "section_mic_hmac_key": "0BF5C29B16B353256F793BBB4F1C8C52597D3F1C2EFA9D61EA46CDFDE84797C7", + "section_salt": "8ED27B5A64F8584EE798DA971BB38902" + }, + { + "adv_header_byte": "20", + "aes_key": "68A9C01E867B79A4CF5C2B9B0A5AF91C", + "data_elements": [ + { + "contents": "AE6F1048CD", + "de_type": 505 + }, + { + "contents": "092DCE72E9C606136151791CACA850F34040EB06480609", + "de_type": 524 + } + ], + "encoded_section": "57911000E8C86E9B41DF4F3B937952F49BC6738B900232D03070C79D80DDE8C1E0999B4434DD06A23FCF22CCD7DCA29E5074665F99831137706D16C0200B8B4598365543AD4BD647A682DD8D226897C1EB8F43C443DBD6F8", + "identity_type": "trusted", + "key_seed": "580ACE8B6CDE7180BD4AD61F486AB6AF65F04174A9E10C982CA1BE480E27085B", + "metadata_key": "E850D26EF14BBB1E7B3D1A5F64A50353", + "nonce": "2DD94E374A847EE945DCDEDE", + "section_mic_hmac_key": "597E20CCB0FF2807C1B8217F21115FB753F67303B79DC679094D7105C5EE8A16", + "section_salt": "E8C86E9B41DF4F3B937952F49BC6738B" + }, + { + "adv_header_byte": "20", + "aes_key": "CC5210E1AA93721F6A77C03B0F1460F9", + "data_elements": [ + { + "contents": "31B8D3BD3DAD8D7EA787EBBAAD32", + "de_type": 105 + }, + { + "contents": "52CD1D16C9C10292F325BD", + "de_type": 679 + }, + { + "contents": "9AA553097F55186B693EF9F811255D4F9E33012D", + "de_type": 70 + } + ], + "encoded_section": "69911000B0B06E5BCBFB897F867D1A98860C88819001968D65E73BFDB4A9C8D0CBCFD94F0AFF86A172DBA041C9B4819B60AE15C84ABF10167323F72BCE73348C948BADCACA60B31C01DF54A03A41FFA1CB83B1724E34BA74D43D17956AEBD6F5E9411F6D801A30C545F5", + "identity_type": "private", + "key_seed": "BB1C67EC1220D0A1CD718868B6DFF75A45F535D79358AD7417E98F584A520850", + "metadata_key": "5E11BC73AFA36ABB0FA9D177F470772C", + "nonce": "10C1E9BEAA44D044A6A52DA8", + "section_mic_hmac_key": "8F47EFD6981006EC099088AA42864E13399300C42A22D67FE00540745BC434D7", + "section_salt": "B0B06E5BCBFB897F867D1A98860C8881" + }, + { + "adv_header_byte": "20", + "aes_key": "636CF984B555E396E1ABE06B45A0DC9A", + "data_elements": [ + { + "contents": "26124A707B14872CE3CCA803962D1E8E", + "de_type": 356 + }, + { + "contents": "5BE121EE1535F68B384B2048", + "de_type": 191 + } + ], + "encoded_section": "5791100091150893740502FC52626D5C1FE1D97B9004D692F649B521B08446966B43B3A0E2853FC66A18FD044B2D9FA619580671AF9A093BC9C29AC2285193C8377E231E4E378A0EB12B69F309BBED412881C06054211F79", + "identity_type": "provisioned", + "key_seed": "9F10722920D514FCD00582382A3D744B7513089C4ED4F0F762E62F079817EADA", + "metadata_key": "CED359A792C26F42583568633F362936", + "nonce": "AC3820DF4711726BD92A95E3", + "section_mic_hmac_key": "73CFEDBC2C7DCC199778704504D8406E69DEF3850E9E556E65264FA5C0F72049", + "section_salt": "91150893740502FC52626D5C1FE1D97B" + }, + { + "adv_header_byte": "20", + "aes_key": "BB72B0AF2C215797791F4813246EEAAA", + "data_elements": [ + { + "contents": "B560FB4055782B29002780C1C79A92C3AB5C94BBFE1D30", + "de_type": 704 + }, + { + "contents": "D9D67201EFBBC989BC73CB82CE5A54BA30270BCBCD16C3D918C46C8FBA", + "de_type": 759 + } + ], + "encoded_section": "6F911000C4FC89ADEB54417C2145D31AFE590E67900479850A6176A11C5005C1B816084BBBC8E1B96A5E84FA83927CFE3F85B13CA15C78C4E487AF94942D9527A4EE40FCE291F8A4076FF3285DBC70EB2AE12076384B309C9DB593EF97E5952F1A878E9357C5215EC4CA7382A07821CE", + "identity_type": "provisioned", + "key_seed": "4F5BCFCBCE781EBD9353546FEFDAB4123548E63980050C1FB2FEBE745EFDEFFC", + "metadata_key": "18CE930F2687B1C72063C2B147ACBD0C", + "nonce": "09C9C088DEE34D597B83255B", + "section_mic_hmac_key": "3BD3CBD58CE94F98266BE570B2897F0C0CDBC8900AFB76E0699315F0132C8D5E", + "section_salt": "C4FC89ADEB54417C2145D31AFE590E67" + }, + { + "adv_header_byte": "20", + "aes_key": "9BBC179545C4C8661833BFEFE25E4478", + "data_elements": [], + "encoded_section": "3591100018CA84AD571B443615D490F5A1AB791E900287C25FBD0A1AA47A74D7960394D449914CF5F364A1DBBFEC57B7447A38AD0152", + "identity_type": "trusted", + "key_seed": "0B5BD58A7DB4DAB27EAB2B71CE802751442437C426E163735196EBDD9EEC98A4", + "metadata_key": "21E42F417AA748179A50406477891087", + "nonce": "22A25ECB407B6DC73A8BCE1F", + "section_mic_hmac_key": "35857C6B5BFBA20A9012E81B452C95D5F62B7D429C9F250F6FC8C96EEFDAD338", + "section_salt": "18CA84AD571B443615D490F5A1AB791E" + }, + { + "adv_header_byte": "20", + "aes_key": "29912DF85FEE4E2802F3CC758240C118", + "data_elements": [ + { + "contents": "20EC521C467D60C62519AFEFFAB2989DA34F609D7348CB0648", + "de_type": 881 + }, + { + "contents": "7CDFF605A49D2327C04C9523E972", + "de_type": 339 + } + ], + "encoded_section": "6291100096874E513BB028EA8D3147662E898C929004510A31F7EEE22BBAA1A676F50D87B736D02CF8AD40A2FC01F73D61050AF86BDD26889F66B6C7811E98013B10549BA699C5B0FF6B97BC95CA461512A91C6CD748A847E8A06250284F89D8768282", + "identity_type": "provisioned", + "key_seed": "BDBB0B95B3F933B91F05CC9ECED4DD468E3174109DEB7A4F0783C40F39E20761", + "metadata_key": "A97FB828B07A9D327D5567152634D0D4", + "nonce": "F8BD43493933BD842C97F146", + "section_mic_hmac_key": "32031801363FBE1A50288A6A9B0756EAA7CC2D653CA0B2AAF345CC13884DD2CE", + "section_salt": "96874E513BB028EA8D3147662E898C92" + }, + { + "adv_header_byte": "20", + "aes_key": "5D161A5D965DE072EC72B7EAAC295469", + "data_elements": [ + { + "contents": "2499FFB9C498F2", + "de_type": 884 + }, + { + "contents": "941AFF758DD7D3B66EF8321874A7834A7E7F51BB284122405EE0", + "de_type": 463 + }, + { + "contents": "74C7CF3DF00CA35B", + "de_type": 435 + }, + { + "contents": "E07BAF5D40CA3AE208E6BDAFF05B4F9E0112559EC495", + "de_type": 2 + }, + { + "contents": "58E1ADF13A6F2383CCDE989D6CEB02EE47F1F3", + "de_type": 396 + } + ], + "encoded_section": "9591100066B9B5E27075D2EAFB9B4E2E4159CA659002025D80ECE442E6A3D7F5DF17BEE9E8AA64D2904E04D09898D04EEB323B64C9AC0DC4F9FA55ECD3B7D58DEB3D9FD72FE1D8A213CCD6DFE89D053B106AE0F7A41844294DDAFB6E22A35F6F5A1251CAE0829609A463D966DC5C2BAEBD166B166CEBF5E3471EE3EAE4DFB5A594C0C64ECDBB00D301299F9782000628F11738B95006", + "identity_type": "trusted", + "key_seed": "5AEE4779ADDC954FAABA8C967AF32BAF74DA2E3790FF77750F20A10C300C66E9", + "metadata_key": "5819227E20E94984AF636A055E65EDF1", + "nonce": "627AF9F6E80A568473F0D41B", + "section_mic_hmac_key": "97182D1562F3DAC1911CBE791388036D5826EFC5BD2C9B7729555BC39D6300B9", + "section_salt": "66B9B5E27075D2EAFB9B4E2E4159CA65" + }, + { + "adv_header_byte": "20", + "aes_key": "8EF15FC5E15B86747BD2390DFD8D8FF4", + "data_elements": [ + { + "contents": "5F99290FC42275AC698492E2263094B80F692233DB0DF8644B", + "de_type": 845 + } + ], + "encoded_section": "51911000474A64D6CC5E1B015636E3CAF848E92D90029797772EBCF190224F6B5193FC0573554FD8D1B7C2B8DFB0C2344080EC5DE79A14650738DB3E375AB1F2416A0E091F2DADD7710C6731F9D2F4BC1ACF", + "identity_type": "trusted", + "key_seed": "3807E53D0E4A6A3C131FE2D9A12F3A17C9A81E206DD2403424D079986548F36D", + "metadata_key": "649BF41A962338BDCAFB3D6EFB39F30C", + "nonce": "11EFABF3B773890FD705DC45", + "section_mic_hmac_key": "BC9DE8BEFBFBFCEED8132F0E74A7FAE68CCF1F3259B42670C074355E57771EC6", + "section_salt": "474A64D6CC5E1B015636E3CAF848E92D" + }, + { + "adv_header_byte": "20", + "aes_key": "D87966196010EEDAE937B516E77C110B", + "data_elements": [ + { + "contents": "D72414FDE144", + "de_type": 693 + }, + { + "contents": "89B82594CDEB3253E8BE54402F4EB47427FA", + "de_type": 139 + }, + { + "contents": "59F5D560DCB71A1A9AB340270EFCCC791F60ED3E5C16C9", + "de_type": 361 + }, + { + "contents": "5E8317B7EF6B2304CE733AF9AA4303", + "de_type": 347 + }, + { + "contents": "6B46914ACC05AC520CD86D64D95EF8B0E3B52684AC19C7", + "de_type": 217 + } + ], + "encoded_section": "99911000550E90767EA297708A890EB778F86F42900194407433CAFDBC096242CBB630D9EFF2428967372331DA563029EE56D7736DB1C6B0F4171C6AACC70B165A1D7079B7213A484AC56B751F106EA890EE1F44B1DD84B03340FF64DE0D86EDF6E3C266B6E29F973D7DA9EA80DA5504E23FA9DEFB13DF26D97D8AC03B102233E7A400716212664A1A66A04360810288591BBC53D82755D0B7F4", + "identity_type": "private", + "key_seed": "5E128361F047F517713A5E7A9FBDFCBB8A65431B0FD54CEA276C15AA38738D00", + "metadata_key": "6219FC039F504E84C27E0C30A7922D50", + "nonce": "219ED909CC34B1C57EB81FED", + "section_mic_hmac_key": "80144AD3F7356F4D118216C943ADE3CE6A4C1CA1AC36CCEFD81AF75222A0C277", + "section_salt": "550E90767EA297708A890EB778F86F42" + }, + { + "adv_header_byte": "20", + "aes_key": "ED1872743ABF1CE1C54B5924D8B523C9", + "data_elements": [ + { + "contents": "1EFD8A5E7097C3EA66A30F3F6EC8", + "de_type": 8 + }, + { + "contents": "70AA1FBCAEAF957AF9C114", + "de_type": 741 + }, + { + "contents": "727C6DA4BC51406D03", + "de_type": 628 + }, + { + "contents": "C80BCC953AFBD14D003F9C18", + "de_type": 905 + }, + { + "contents": "B3EC6F94CA366939C934FA84052FD4", + "de_type": 357 + } + ], + "encoded_section": "8091100002C4DA8D1B21BAE28B3F9A0EB5693E8F900493FCDCCF43EBF7EF19D4476026AE4F5241FE0162977FB70B8E376CEE57BC2A866306A3787F61E88D954EAF7060BCE7A3023C7683CD7EB4F9D15A14147EAF9FE39A0BF9863BCFFEF8F4F2E8AE52F06651E06E94F809CE32E06DC15434A3A3D7AF4E42BBF88EB53E9197D489", + "identity_type": "provisioned", + "key_seed": "3DBF4DD4A42D6FE76568BF430BC73BC5772762941753D48A76134021D17123C7", + "metadata_key": "B6B17BEBEA55CFA5B610047C599FDCB4", + "nonce": "9E2B3708BC702B007B2B49E8", + "section_mic_hmac_key": "F0E7F12DF72F3EF40DE46181DD19D3E673AEE02757529C53F3F6DF9F8AAEF663", + "section_salt": "02C4DA8D1B21BAE28B3F9A0EB5693E8F" + }, + { + "adv_header_byte": "20", + "aes_key": "74300AD75CB40E2D6CC26BF7C3EE29E6", + "data_elements": [ + { + "contents": "506CEBFF222CD35C949137A3A47D6FAD9620", + "de_type": 439 + } + ], + "encoded_section": "4A9110007816B4ED58791237D1053F88CD8B7B859001D1EBFF70B960E79E6DFA6A89359F991816C253BB5B09AA2E98748E101D8BB2D18D4043847E353F85C82A586B92D5E7F0DC03E6CD14", + "identity_type": "private", + "key_seed": "8CE98EB290087656B04E4996CBF4007E92E653CAE71AF06D479B96D45B83447B", + "metadata_key": "81A2696BD7D21903EE2D63D2C4C44E4C", + "nonce": "CDCBF3E9E0E3EA002A004AFE", + "section_mic_hmac_key": "48966839EED698298B8544D0FABBB3E8009D9D67CE88CEB6F29B1FBFAEFB7C47", + "section_salt": "7816B4ED58791237D1053F88CD8B7B85" + }, + { + "adv_header_byte": "20", + "aes_key": "256EC73F1FAF17723C9B5C6062749FF7", + "data_elements": [], + "encoded_section": "359110007897264056B8ED625680B2F5124C30A890045D4D46423E9067DF2DFD36F3718282724748E10C6E16DA2C039F9C30D9FF6054", + "identity_type": "provisioned", + "key_seed": "D458DDE6E939B3C03B8CA27BE7D624D70F3777FB31C8278152C3C0161269A228", + "metadata_key": "76BCF4EB8C12033E8BF0534B8A6AAF4A", + "nonce": "1451BFC0DA68DCB2E0FCB937", + "section_mic_hmac_key": "DDAF42B3C3AC34F3E8F2C882568213E333A91F0A049E79AF52E98669048CA81A", + "section_salt": "7897264056B8ED625680B2F5124C30A8" + }, + { + "adv_header_byte": "20", + "aes_key": "1599363CAC85444B80B2BD6F32B44889", + "data_elements": [], + "encoded_section": "35911000D8624D1EC90B225B457D22AF6D8B4F799004990761D38053D068BBE94F66F9968E14BB793A96B05BA0F4716C0A7814D331B0", + "identity_type": "provisioned", + "key_seed": "7CF0C36D0E587661503F8F70B8F3A06AEA7B6352E843387F353CA8355EB92ADB", + "metadata_key": "A54230D1BAD378D531DB91F517D11568", + "nonce": "D25B10F1899F9A9C56648C1E", + "section_mic_hmac_key": "C1A07E6C0ECA629D1ABB6CF5D6175F97E97637756561930B256BB6891012A830", + "section_salt": "D8624D1EC90B225B457D22AF6D8B4F79" + }, + { + "adv_header_byte": "20", + "aes_key": "3EB28DFBFF8CB955CC44F68B0085F70E", + "data_elements": [ + { + "contents": "8511547C881A7F7036FA2009F904BF", + "de_type": 42 + }, + { + "contents": "7C4430D434907C017DACFD336A161E70C10815B6", + "de_type": 284 + }, + { + "contents": "15C1124EF76C2D9BB61C", + "de_type": 132 + }, + { + "contents": "3E3B0BFE93189B50", + "de_type": 694 + } + ], + "encoded_section": "759110007F2CB662B15FBA6D7C18AB52889B266D9004CB724FEF84FE55FCB1A2B571C77EE17C930A5F6606F40EC38F4241A6B287A8B1EB443F7C013B34B3113D193F884B120F0AA415452FFAAA0B40B78DD80A09858F2068537D2AC8F8DF750509B9D52A4B9B39F10C2CFC42A9B90FC762945BC31CAD", + "identity_type": "provisioned", + "key_seed": "547C965E115345BADE7FA439398A1618870F0392671DEDE9944FCC693DBE32B4", + "metadata_key": "C55B065D5B03C633C7546FFE3043FB8B", + "nonce": "888A5C195BCC1327C7DA9E7A", + "section_mic_hmac_key": "F672CB3E86B8E87B727CB0814C7AE096C3E7C7EE2398D1581847C26951486BBA", + "section_salt": "7F2CB662B15FBA6D7C18AB52889B266D" + }, + { + "adv_header_byte": "20", + "aes_key": "A952EA928E55FAE45B612EFBB2E92897", + "data_elements": [ + { + "contents": "A39AD60114B4E470CD6E5B1981F6D94FDF21E386A957B3", + "de_type": 11 + }, + { + "contents": "30309360211C7E94BC8B3692BCE38EE888ECF197C594C3D07D", + "de_type": 10 + }, + { + "contents": "66DF42C0A9CC3385053676451C23276C1CB169D74DDB1C46A6EDE2C89707", + "de_type": 610 + }, + { + "contents": "550E675F587E", + "de_type": 554 + } + ], + "encoded_section": "939110008F8202EF37CD727B74948F6A5205650390045048FB340FCBE272C4D667BD6691E08084C56D24D168EE7C6B3AD228DF31ADD89B1627C7511ADF1E12882ACECB1C05B49539F332C01F0C2778F039A5727864A5FA46F9030820D06D961123CBDED94746017E6B2224D43BB304D590F12343258BDCF84F691600B58C18025956190BD91D359B1654D5862590962E89FC3541", + "identity_type": "provisioned", + "key_seed": "D75311C9FD54732B0D1D58E8C13D69582675936BC2D4B948E4DA8B8FD4E4EC19", + "metadata_key": "44A8ED043D7B7A04048C04871D04BF28", + "nonce": "39A11C1233C3887D0FE2FF95", + "section_mic_hmac_key": "0370E5CD2CA4944C5633BDB505F471ED4ABD6F9E0803BD57669BF1A096FBFAF4", + "section_salt": "8F8202EF37CD727B74948F6A52056503" + }, + { + "adv_header_byte": "20", + "aes_key": "375CC4495D0E6037B4A269A5A4EA302C", + "data_elements": [ + { + "contents": "E51613F10B7423784CB6E3FF2E58", + "de_type": 683 + }, + { + "contents": "ECBD79DDFA8130DCDEF28AD2AF40C6A8DBB16B2972", + "de_type": 264 + }, + { + "contents": "9FD18CDBD2FC1FBAF9B317FF280956", + "de_type": 617 + }, + { + "contents": "8871908BB20E8F", + "de_type": 918 + }, + { + "contents": "DD8DA6F96A3751", + "de_type": 721 + } + ], + "encoded_section": "84911000C7A3432633031353A946F0684CFCFEBD90012BD99B1A635B8CB01DDBBDB46AFE8742B053F93A65C75293797C523784EAE07488134AE32476E0F698D440C3A0A389DB48B6846E2D42A89584741285C09301225752A1A5C8152E010337BBA3ECB3C15D6893C2B2CEAB1FB452D50E5990EA1C9B007C08642769AF82551F3FFA44040B", + "identity_type": "private", + "key_seed": "D948351CA86C11F94DFA31FC2B86C7EBD32251E770E243B287D5C03630A7A4B4", + "metadata_key": "0F37FFFBB8B3BF85BE6B4A5D7AE60C37", + "nonce": "5A8953196DB0C6B086052AC9", + "section_mic_hmac_key": "6A6CE54F7E0FCB42716786C56294DB3FF4839464EB6D6DDE3037015BF42591CD", + "section_salt": "C7A3432633031353A946F0684CFCFEBD" + }, + { + "adv_header_byte": "20", + "aes_key": "2276BD761EED06699E8A4C1B005226C8", + "data_elements": [ + { + "contents": "09D7C7411219259A530E4207", + "de_type": 202 + }, + { + "contents": "E6206D70CB69117E5B0CFC6484E5A9F6E6", + "de_type": 335 + }, + { + "contents": "124F723ABCB0F46AC2D9904E49F29C72F6A37A6F1C", + "de_type": 173 + }, + { + "contents": "F03BE2BA870E9DDDE0A20C37F7C3C513418FC8595CC2D9", + "de_type": 162 + } + ], + "encoded_section": "8A9110006FD81C4F4977A61EA77802E4AE331B1B90044590EF69F794BECCA20B04E1A5794A8FE0BE6B353BAE140B8A37594A011AA936FCD209E03D522D1C147E321147E9B33735F2CA413B5C945091EC1AB92537B781F26714EAB879BF33E801BE58488C11306DD259B63B1F05FC146871978B17CACF8AEF88D021782A6DB7112D4C930FCA66626E69140B", + "identity_type": "provisioned", + "key_seed": "B3E1C7E5933E243B2457C3493F6C62D88640DF85591E1A370EBB5ED1A7E87DDE", + "metadata_key": "584C3B455D31A6EB73CA6286A6D1D677", + "nonce": "7C59A6FBC27521B60FDE3D85", + "section_mic_hmac_key": "4FC402F911776BD4BA7E1B934A76823AAEB91AEAE70F229149737AD2446C8721", + "section_salt": "6FD81C4F4977A61EA77802E4AE331B1B" + }, + { + "adv_header_byte": "20", + "aes_key": "ABD1E3B92ECCC94887008F9712C8B92E", + "data_elements": [ + { + "contents": "53AA992BF504934429F0D55BCA57E7E4DD02BF1C51", + "de_type": 77 + }, + { + "contents": "37", + "de_type": 41 + } + ], + "encoded_section": "4F911000117F8B155FCF545D9DDE2E2404BF08579001181FAA51DA6430295D27D32A8894FC80977F9FBB2260C5F335DF5E2985B1E9DF677F8DF40E3DD10180E31FD4A1E640AA81AD2D59ED29C73E0DD9", + "identity_type": "private", + "key_seed": "BAE413A1CB297D1B55956EF2E3D47463B15721D83113EB265CDE9742DE57D1E2", + "metadata_key": "E118EB2F2448E831DCB2F01211D4E299", + "nonce": "641B644EC4576653B4ECE6BE", + "section_mic_hmac_key": "7001ACCF2A6FE829E333351CF9500F0EC9F144AC2432E2D4E65BA205B5A2A083", + "section_salt": "117F8B155FCF545D9DDE2E2404BF0857" + }, + { + "adv_header_byte": "20", + "aes_key": "0B886C679F8368F71B69095633FD827A", + "data_elements": [ + { + "contents": "C57A03111A582D033BA2F0BBF50F0698BC008461C715", + "de_type": 648 + }, + { + "contents": "0C95F385C694E2BC55C219B0086BA9F8B64C0633", + "de_type": 415 + }, + { + "contents": "C9826C977F5D51", + "de_type": 246 + }, + { + "contents": "B88067D984", + "de_type": 989 + }, + { + "contents": "98C5E507657F0B36CAF5D0EB02A5B30F1087", + "de_type": 663 + } + ], + "encoded_section": "8C911000AD6BDCEEB60CC9801003D4F71FB8AF0F90049916A86D88CC6C404111A7D9075FFC0C699303B2BB1CDC7492495C139069B609E02C45F3F2F5D1F11C5CC45EAA610AE5F9A3085D638A8D774E060572A9E8E276FDC2B9EAFFAF23469097068D9F2AA77BCB5F548EF636B8BEF3C02495DB690858EA8A13C78501E64C54D05155EA488719C539D7B9060048", + "identity_type": "provisioned", + "key_seed": "B323DB96EBC1CBB190E305EBE290EF7E600D3D3E7D23688DC2C8C23B4EFC7A4B", + "metadata_key": "6436A7FA7D38F566B85179BFF2E4DA68", + "nonce": "43B0153AB9B6FFB0DA670B28", + "section_mic_hmac_key": "88BBCFCEB5CFAB8C69C5C978C8C21758ADE72E557C108CDF780367F6456C85B4", + "section_salt": "AD6BDCEEB60CC9801003D4F71FB8AF0F" + }, + { + "adv_header_byte": "20", + "aes_key": "E4E6282E18B2700912371FD299648904", + "data_elements": [ + { + "contents": "6E", + "de_type": 875 + }, + { + "contents": "3E7F165B8725499C73A790", + "de_type": 547 + } + ], + "encoded_section": "4791100001BF56D7253FE9F2388222BE2B414EB49004A2C3ACCC4EEFD9949E6470223F1085EEF12CA22DBF4E5A9DA978E44AF3E93F6142BE9270F59E188FEF58BBAC3BDCE8413351", + "identity_type": "provisioned", + "key_seed": "CFF5A7B58AD3CF1BF200E0874E1E404E0B8EC0BCE8812F1FFD4537E2330BF4F2", + "metadata_key": "C048921E6EE411AD4698E29A54BC6B4D", + "nonce": "8D23F89851021F5141478E33", + "section_mic_hmac_key": "1988C5772B660124148F05733A326F0F0C29DC301F2989294312F41C56292A59", + "section_salt": "01BF56D7253FE9F2388222BE2B414EB4" + }, + { + "adv_header_byte": "20", + "aes_key": "78DECA4E98143AB700746AACAE4CC14E", + "data_elements": [ + { + "contents": "F42C1F5B9E2060A6D4CDA7A2963F44A524BFFD5F0F2D69F3322DCF4B93E3", + "de_type": 359 + } + ], + "encoded_section": "56911000FE30CCFEF9FADE459409BCA8286268B79002DC0290C23BD3C7F0DCD8443EABD050919255A3755D0F5EBCBA7B540DA11DF0E844207B803710FBE088BE18847F5406B7711DBC583711B7930508B0B06F801CA9AA", + "identity_type": "trusted", + "key_seed": "F44873C8E1AC0DC8D63BC7CE805E543BA8A73CB83DF807B608246E14CFCCE5D7", + "metadata_key": "D0CB13BBC77450B18573A000E0E4B324", + "nonce": "D97378F4DF5B4D5249845D4E", + "section_mic_hmac_key": "11A63498ACF2C0D60AFEE3AD00117129582FFD6D50D3CA4A21CD3330BAF0B2C0", + "section_salt": "FE30CCFEF9FADE459409BCA8286268B7" + }, + { + "adv_header_byte": "20", + "aes_key": "99CA428E9B70F3A4F34CCE2EA3FFD1C6", + "data_elements": [ + { + "contents": "95651D83B5B463A0B4D7C3BF97C1CDFD9A2853DD216D", + "de_type": 842 + }, + { + "contents": "B1E32F", + "de_type": 633 + }, + { + "contents": "B44550D17D11C579DDE453A78F8E68", + "de_type": 764 + } + ], + "encoded_section": "6691100074678AA45A5827136A450437EE29F5E39004B94F1326A3CE7BDCA34AC253366FE37E6849758193586827933D9E096053DC06102448287A436069815904A0F3895C825ED3538CB827DF1B153E833F11DD926D4E5A45CD20EA0FE3FDB21A587C6C77638B", + "identity_type": "provisioned", + "key_seed": "71A3A2B3B223F84BE6E8595208384B34D0379E898137A3B5DC4F18C71502CACF", + "metadata_key": "8998FDB14463108B5A5F66FE289D13BF", + "nonce": "AFE96D0E4FF65C1734F9F99B", + "section_mic_hmac_key": "2222BA7F416FFEB9B14B07D5D2522EDDF0D2E82CB116D23699566520035BC6E7", + "section_salt": "74678AA45A5827136A450437EE29F5E3" + }, + { + "adv_header_byte": "20", + "aes_key": "3C5965394479133B2B0CDA3474935C12", + "data_elements": [ + { + "contents": "4C5DE6A43F855833418B23DE6E4C0AB9B8A6D1C581F15A683D", + "de_type": 831 + }, + { + "contents": "1AE2D41BF9064E056C22712044707CEA3EFAF26964D83E684D33CE", + "de_type": 355 + } + ], + "encoded_section": "6F911000BE86E394E730BAE02E2A22E8B54CF1A4900408EB6891543847E08002B13233D680C89B22F57320B4890E87533A2B4DFC30021206330351F378D93A7CE5051655B1EC84F8F4F68DBB327EDD4E0DA4948323F1B931733AA4D28F06238FF3622178015BB5C709094AC23A3E448D", + "identity_type": "provisioned", + "key_seed": "CFBB3B4D111CDF95E4AA9642D5D6C1611B8522D6F76C7B1F23C09DCE58133FE2", + "metadata_key": "3BFA93FB827970E4CD401DD9903ABF19", + "nonce": "2CFBAEDFFF07C80511FE4B1B", + "section_mic_hmac_key": "16B7AD3BB2B10A5B5D64ACEB9733BEDC6D0FD351E5D12AB36FF5FB283DEDF3F4", + "section_salt": "BE86E394E730BAE02E2A22E8B54CF1A4" + } +] \ No newline at end of file
diff --git a/nearby/presence/np_adv/src/credential/mod.rs b/nearby/presence/np_adv/src/credential/mod.rs new file mode 100644 index 0000000..a138f0b --- /dev/null +++ b/nearby/presence/np_adv/src/credential/mod.rs
@@ -0,0 +1,85 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! Credential types used in deserialization. +//! +//! While simple implementations are provided to get started with, there is likely opportunity for +//! efficiency gains with implementations tailored to suit (e.g. caching a few hot credentials +//! rather than reading from disk every time, etc). + +use core::fmt::Debug; +use crypto_provider::CryptoProvider; + +use self::{ + simple::{SimpleV0Credential, SimpleV1Credential}, + source::OwnedBothCredentialSource, + v0::MinimumFootprintV0CryptoMaterial, + v1::MinimumFootprintV1CryptoMaterial, +}; + +pub mod simple; +pub mod source; +pub mod v0; +pub mod v1; + +/// A credential which has an associated [`MatchedCredential`] +pub trait MatchableCredential { + /// The [MatchedCredential] provided by this [`MatchableCredential`]. + type Matched<'m>: MatchedCredential<'m> + where + Self: 'm; + + /// Returns the subset of credential data that should be associated with a successfully + /// decrypted advertisement or advertisement section. + fn matched(&self) -> Self::Matched<'_>; +} + +/// Convenient type-level function for referring to the match data for a [`MatchableCredential`]. +pub type MatchedCredFromCred<'s, C> = <C as MatchableCredential>::Matched<'s>; + +/// The portion of a credential's data to be bundled with the advertisement content it was used to +/// decrypt. +/// +/// As it is `Debug` and `Eq`, implementors should not hold any cryptographic material to avoid +/// accidental logging, timing side channels on comparison, etc, or should use custom impls of +/// those traits rather than deriving them. +pub trait MatchedCredential<'m>: Debug + PartialEq + Eq {} + +/// A V0 credential containing some [`v0::V0CryptoMaterial`] +pub trait V0Credential: MatchableCredential { + /// The [v0::V0CryptoMaterial] provided by this V0Credential impl. + type CryptoMaterial: v0::V0CryptoMaterial; + + /// Returns the crypto material associated with the credential. + /// + /// Used to decrypted encrypted advertisement content. + fn crypto_material(&self) -> &Self::CryptoMaterial; +} + +/// A V1 credential containing some [`v1::V1CryptoMaterial`] +pub trait V1Credential: MatchableCredential { + /// The [v1::V1CryptoMaterial] provided by this Credential impl. + type CryptoMaterial: v1::V1CryptoMaterial; + + /// Returns the crypto material associated with the credential. + /// + /// Used to decrypt encrypted advertisement content. + fn crypto_material(&self) -> &Self::CryptoMaterial; +} + +/// An owned credential store that contains minimum footprint crypto materials +pub type MinimumFootprintCredentialSource<T> = OwnedBothCredentialSource< + SimpleV0Credential<MinimumFootprintV0CryptoMaterial, T>, + SimpleV1Credential<MinimumFootprintV1CryptoMaterial, T>, +>;
diff --git a/nearby/presence/np_adv/src/credential/simple.rs b/nearby/presence/np_adv/src/credential/simple.rs new file mode 100644 index 0000000..6ea2436 --- /dev/null +++ b/nearby/presence/np_adv/src/credential/simple.rs
@@ -0,0 +1,148 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! Simple implementations of credentials. These can be combined with the provided crypto material +//! implementations to have a working credential type. +//! +//! ```rust +//! use np_adv::credential::{ +//! simple::SimpleV0Credential, +//! v0::MinimumFootprintV0CryptoMaterial, +//! }; +//! type MyV0Credential = SimpleV0Credential<MinimumFootprintV0CryptoMaterial, ()>; +//! ``` + +use core::fmt::Debug; + +use super::*; +use super::{v0::*, v1::*}; + +/// A simple implementation of [`V0Credential`] that wraps a [`V0CryptoMaterial`] and some `T` data that +/// will be exposed via the [`MatchedCredential`]. +pub struct SimpleV0Credential<C, T> +where + C: V0CryptoMaterial, + T: Debug + Eq, +{ + material: C, + match_data: T, +} + +impl<C, T> SimpleV0Credential<C, T> +where + C: V0CryptoMaterial, + T: Debug + Eq, +{ + /// Construct a new credential. + /// + /// `material` will be returned by [V0Credential::crypto_material]. + /// `match_data` will be returned by [SimpleV0Credential::matched], wrapped in [SimpleMatchedCredential]. + pub fn new(material: C, match_data: T) -> Self { + Self { material, match_data } + } +} + +impl<C, T> MatchableCredential for SimpleV0Credential<C, T> +where + C: V0CryptoMaterial, + T: Debug + Eq, +{ + type Matched<'m> = SimpleMatchedCredential<'m, T> where Self: 'm; + + fn matched(&'_ self) -> Self::Matched<'_> { + SimpleMatchedCredential { data: &self.match_data } + } +} + +impl<C, T> V0Credential for SimpleV0Credential<C, T> +where + C: V0CryptoMaterial, + T: Debug + Eq, +{ + type CryptoMaterial = C; + + fn crypto_material(&self) -> &Self::CryptoMaterial { + &self.material + } +} + +/// A simple implementation of [V1Credential] that wraps a [V1CryptoMaterial] and some `T` data that +/// will be exposed via the [MatchedCredential]. +pub struct SimpleV1Credential<C, T> +where + C: V1CryptoMaterial, + T: Debug + Eq, +{ + material: C, + match_data: T, +} + +impl<C, T> SimpleV1Credential<C, T> +where + C: V1CryptoMaterial, + T: Debug + Eq, +{ + /// Construct a new credential. + /// + /// `material` will be returned by [V1Credential::crypto_material]. + /// `match_data` will be returned by [SimpleV1Credential::matched], wrapped in [SimpleMatchedCredential]. + pub fn new(material: C, match_data: T) -> Self { + Self { material, match_data } + } +} + +impl<C, T> MatchableCredential for SimpleV1Credential<C, T> +where + C: V1CryptoMaterial, + T: Debug + Eq, +{ + type Matched<'m> = SimpleMatchedCredential<'m, T> where Self: 'm; + + fn matched(&'_ self) -> Self::Matched<'_> { + SimpleMatchedCredential { data: &self.match_data } + } +} + +impl<C, T> V1Credential for SimpleV1Credential<C, T> +where + C: V1CryptoMaterial, + T: Debug + Eq, +{ + type CryptoMaterial = C; + + fn crypto_material(&self) -> &Self::CryptoMaterial { + &self.material + } +} + +/// The [MatchedCredential] used by [SimpleV0Credential] +/// and by [SimpleV1Credential]. +#[derive(Debug, PartialEq, Eq)] +pub struct SimpleMatchedCredential<'m, T: Debug + PartialEq + Eq> { + data: &'m T, +} + +impl<'m, T: Debug + PartialEq + Eq> SimpleMatchedCredential<'m, T> { + /// Construct a new instance that wraps `data`. + pub fn new(data: &'m T) -> Self { + Self { data } + } + + /// Returns the underlying matched credential data. + pub fn matched_data(&self) -> &'m T { + self.data + } +} + +impl<'m, T: Debug + PartialEq + Eq> MatchedCredential<'m> for SimpleMatchedCredential<'m, T> {}
diff --git a/nearby/presence/np_adv/src/credential/source.rs b/nearby/presence/np_adv/src/credential/source.rs new file mode 100644 index 0000000..e102b7e --- /dev/null +++ b/nearby/presence/np_adv/src/credential/source.rs
@@ -0,0 +1,150 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! Traits defining sources for credentials. These are used in the deserialization path to provide +//! the credentials to try. [`SliceCredentialSource`] and [`OwnedCredentialSource`] implementations +//! are also defined in this module. + +use super::*; +use alloc::vec::Vec; + +/// A source of credentials to try when decrypting advertisements, +/// which really just wraps an iterator over a given credential type. +pub trait CredentialSource<C: MatchableCredential> { + /// The iterator type produced that emits credentials + type Iterator<'a>: Iterator<Item = &'a C> + where + Self: 'a, + C: 'a; + + /// Iterate over the available credentials + fn iter(&self) -> Self::Iterator<'_>; +} + +/// Trait for combined credential sources able to yield credential sources for both V0 and V1. +pub trait BothCredentialSource<C0, C1> +where + C0: V0Credential, + C1: V1Credential, +{ + /// The type of the underlying credential-source for v0 credentials + type V0Source: CredentialSource<C0>; + /// The type of the underlying credential-source for v1 credentials + type V1Source: CredentialSource<C1>; + + /// Gets a source for v0 credentials maintained by this `BothCredentialSource`. + fn v0(&self) -> &Self::V0Source; + + /// Gets a source for v1 credentials maintained by this `BothCredentialSource`. + fn v1(&self) -> &Self::V1Source; + + /// Convenient function alias to [`self.v0().iter()`] for iterating + /// over v0 credentials. + fn iter_v0(&self) -> <Self::V0Source as CredentialSource<C0>>::Iterator<'_> { + self.v0().iter() + } + + /// Convenient function alias to the [`CredentialSource<C1>#iter()`] for iterating + /// over v0 credentials. + fn iter_v1(&self) -> <Self::V1Source as CredentialSource<C1>>::Iterator<'_> { + self.v1().iter() + } +} + +/// A simple [CredentialSource] that just iterates over a provided slice of credentials +pub struct SliceCredentialSource<'c, C: MatchableCredential> { + credentials: &'c [C], +} + +impl<'c, C: MatchableCredential> SliceCredentialSource<'c, C> { + /// Construct the credential source from the provided credentials. + pub fn new(credentials: &'c [C]) -> Self { + Self { credentials } + } +} + +impl<'c, C: MatchableCredential> CredentialSource<C> for SliceCredentialSource<'c, C> { + type Iterator<'i> = core::slice::Iter<'i, C> + where Self: 'i; + + fn iter(&'_ self) -> Self::Iterator<'_> { + self.credentials.iter() + } +} + +/// A simple credential source which owns all of its credentials. +pub struct OwnedCredentialSource<C: MatchableCredential> { + credentials: Vec<C>, +} + +impl<C: MatchableCredential> OwnedCredentialSource<C> { + /// Constructs an owned credential source from the given credentials + pub fn new(credentials: Vec<C>) -> Self { + Self { credentials } + } +} + +impl<C: MatchableCredential> CredentialSource<C> for OwnedCredentialSource<C> { + type Iterator<'i> = core::slice::Iter<'i, C> + where Self: 'i; + + fn iter(&'_ self) -> Self::Iterator<'_> { + self.credentials.iter() + } +} + +/// An owned credential source for both v0 and v1 credentials, +pub struct OwnedBothCredentialSource<C0, C1> +where + C0: V0Credential, + C1: V1Credential, +{ + v0_source: OwnedCredentialSource<C0>, + v1_source: OwnedCredentialSource<C1>, +} + +impl<C0, C1> OwnedBothCredentialSource<C0, C1> +where + C0: V0Credential, + C1: V1Credential, +{ + /// Creates a new `OwnedBothCredentialSource` from credential-lists + /// for both V0 and V1 + pub fn new(v0_credentials: Vec<C0>, v1_credentials: Vec<C1>) -> Self { + let v0_source = OwnedCredentialSource::new(v0_credentials); + let v1_source = OwnedCredentialSource::new(v1_credentials); + Self { v0_source, v1_source } + } + + /// Creates a new credential source that is empty. + pub fn new_empty() -> Self { + Self::new(Vec::new(), Vec::new()) + } +} + +impl<C0, C1> BothCredentialSource<C0, C1> for OwnedBothCredentialSource<C0, C1> +where + C0: V0Credential, + C1: V1Credential, +{ + type V0Source = OwnedCredentialSource<C0>; + type V1Source = OwnedCredentialSource<C1>; + + fn v0(&self) -> &Self::V0Source { + &self.v0_source + } + fn v1(&self) -> &Self::V1Source { + &self.v1_source + } +}
diff --git a/nearby/presence/np_adv/src/credential/v0.rs b/nearby/presence/np_adv/src/credential/v0.rs new file mode 100644 index 0000000..e2d1b5d --- /dev/null +++ b/nearby/presence/np_adv/src/credential/v0.rs
@@ -0,0 +1,80 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! Cryptographic materials for v0 advertisement-format credentials. + +use super::*; + +/// Cryptographic material for an individual NP credential used to decrypt v0 advertisements. +// Space-time tradeoffs: +// - LDT keys (64b) take about 1.4us. +pub trait V0CryptoMaterial { + /// Returns an LDT NP advertisement cipher built with the provided `Aes` + fn ldt_adv_cipher<C: CryptoProvider>(&self) -> ldt_np_adv::LdtNpAdvDecrypterXtsAes128<C>; +} + +/// A [`V0CryptoMaterial`] that minimizes memory footprint at the expense of CPU time when +/// providing derived key material +pub struct MinimumFootprintV0CryptoMaterial { + key_seed: [u8; 32], + legacy_metadata_key_hmac: [u8; 32], +} + +impl MinimumFootprintV0CryptoMaterial { + /// Construct an [MinimumFootprintV0CryptoMaterial] from the provided identity data. + pub fn new(key_seed: [u8; 32], legacy_metadata_key_hmac: [u8; 32]) -> Self { + Self { key_seed, legacy_metadata_key_hmac } + } +} + +impl V0CryptoMaterial for MinimumFootprintV0CryptoMaterial { + fn ldt_adv_cipher<C: CryptoProvider>(&self) -> ldt_np_adv::LdtNpAdvDecrypterXtsAes128<C> { + let hkdf = np_hkdf::NpKeySeedHkdf::new(&self.key_seed); + ldt_np_adv::build_np_adv_decrypter( + &hkdf.legacy_ldt_key(), + self.legacy_metadata_key_hmac, + hkdf.legacy_metadata_key_hmac_key(), + ) + } +} + +/// [`V0CryptoMaterial`] that minimizes CPU time when providing key material at +/// the expense of occupied memory. +pub struct PrecalculatedV0CryptoMaterial { + pub(crate) legacy_ldt_key: ldt::LdtKey<xts_aes::XtsAes128Key>, + pub(crate) legacy_metadata_key_hmac: [u8; 32], + pub(crate) legacy_metadata_key_hmac_key: [u8; 32], +} + +impl PrecalculatedV0CryptoMaterial { + /// Construct a new instance from the provided credential material. + pub fn new<C: CryptoProvider>(key_seed: &[u8; 32], legacy_metadata_key_hmac: [u8; 32]) -> Self { + let hkdf = np_hkdf::NpKeySeedHkdf::<C>::new(key_seed); + Self { + legacy_ldt_key: hkdf.legacy_ldt_key(), + legacy_metadata_key_hmac, + legacy_metadata_key_hmac_key: *hkdf.legacy_metadata_key_hmac_key().as_bytes(), + } + } +} + +impl V0CryptoMaterial for PrecalculatedV0CryptoMaterial { + fn ldt_adv_cipher<C: CryptoProvider>(&self) -> ldt_np_adv::LdtNpAdvDecrypterXtsAes128<C> { + ldt_np_adv::build_np_adv_decrypter( + &self.legacy_ldt_key, + self.legacy_metadata_key_hmac, + self.legacy_metadata_key_hmac_key.into(), + ) + } +}
diff --git a/nearby/presence/np_adv/src/credential/v1.rs b/nearby/presence/np_adv/src/credential/v1.rs new file mode 100644 index 0000000..4b134e4 --- /dev/null +++ b/nearby/presence/np_adv/src/credential/v1.rs
@@ -0,0 +1,288 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! Cryptographic materials for v1 advertisement-format credentials. + +use core::borrow::Borrow; +use crypto_provider::{aes::Aes128Key, ed25519, CryptoProvider}; +use np_hkdf::UnsignedSectionKeys; + +/// Cryptographic materials necessary for determining whether or not +/// a given V1 advertisement section matches an identity. +/// Per the construction of the V1 specification, this is also +/// the information necessary to decrypt the raw byte contents +/// of an encrypted V1 section. +#[derive(Clone)] +pub struct SectionIdentityResolutionMaterial { + /// The AES key for decrypting section ciphertext + pub(crate) aes_key: Aes128Key, + /// The metadata key HMAC key for deriving and verifying the identity metadata + /// key HMAC against the expected value. + pub(crate) metadata_key_hmac_key: [u8; 32], + /// The expected metadata key HMAC to check against for an identity match. + pub(crate) expected_metadata_key_hmac: [u8; 32], +} + +/// Cryptographic materials necessary for determining whether or not +/// a given V1 signed advertisement section matches an identity. +#[derive(Clone)] +pub struct SignedSectionIdentityResolutionMaterial(SectionIdentityResolutionMaterial); + +impl SignedSectionIdentityResolutionMaterial { + #[cfg(test)] + pub(crate) fn from_raw(raw: SectionIdentityResolutionMaterial) -> Self { + Self(raw) + } + pub(crate) fn as_raw_resolution_material(&self) -> &SectionIdentityResolutionMaterial { + &self.0 + } + pub(crate) fn from_hkdf_and_expected_metadata_key_hmac<C: CryptoProvider>( + hkdf: &np_hkdf::NpKeySeedHkdf<C>, + expected_metadata_key_hmac: [u8; 32], + ) -> Self { + Self(SectionIdentityResolutionMaterial { + aes_key: hkdf.extended_signed_section_aes_key(), + metadata_key_hmac_key: *hkdf.extended_signed_metadata_key_hmac_key().as_bytes(), + expected_metadata_key_hmac, + }) + } +} + +/// Cryptographic materials necessary for determining whether or not +/// a given V1 MIC advertisement section matches an identity. +#[derive(Clone)] +pub struct UnsignedSectionIdentityResolutionMaterial(SectionIdentityResolutionMaterial); + +impl UnsignedSectionIdentityResolutionMaterial { + #[cfg(test)] + pub(crate) fn from_raw(raw: SectionIdentityResolutionMaterial) -> Self { + Self(raw) + } + pub(crate) fn as_raw_resolution_material(&self) -> &SectionIdentityResolutionMaterial { + &self.0 + } + pub(crate) fn from_hkdf_and_expected_metadata_key_hmac<C: CryptoProvider>( + hkdf: &np_hkdf::NpKeySeedHkdf<C>, + expected_metadata_key_hmac: [u8; 32], + ) -> Self { + Self(SectionIdentityResolutionMaterial { + aes_key: UnsignedSectionKeys::aes_key(hkdf), + metadata_key_hmac_key: *hkdf.extended_unsigned_metadata_key_hmac_key().as_bytes(), + expected_metadata_key_hmac, + }) + } +} + +/// Crypto materials for V1 signed sections which are not employed in identity resolution, +/// but may be necessary to verify a signed section. +#[derive(Clone)] +pub struct SignedSectionVerificationMaterial { + /// The np_ed25519 public key to be + /// used for signature verification of signed sections. + pub(crate) pub_key: ed25519::RawPublicKey, +} + +impl SignedSectionVerificationMaterial { + /// Gets the np_ed25519 public key for the given identity, + /// used for signature verification of signed sections. + pub(crate) fn signature_verification_public_key<C: CryptoProvider>( + &self, + ) -> np_ed25519::PublicKey<C> { + np_ed25519::PublicKey::from_bytes(&self.pub_key).expect("Should only contain valid keys") + } +} + +/// Crypto materials for V1 unsigned sections which are not employed in identity resolution, +/// but may be necessary to fully decrypt an unsigned section. +#[derive(Clone)] +pub struct UnsignedSectionVerificationMaterial { + /// The MIC HMAC key for verifying the integrity of unsigned sections. + pub(crate) mic_hmac_key: [u8; 32], +} + +impl UnsignedSectionVerificationMaterial { + /// Returns the MIC HMAC key for unsigned sections + pub(crate) fn mic_hmac_key<C: CryptoProvider>(&self) -> np_hkdf::NpHmacSha256Key<C> { + self.mic_hmac_key.into() + } +} + +// Space-time tradeoffs: +// - Calculating an HKDF from the key seed costs about 2us on a gLinux laptop, and occupies 80b. +// - Calculating an AES (16b) or HMAC (32b) key from the HKDF costs about 700ns. +// The right tradeoff may also vary by use case. For frequently used identities we should +// probably pre-calculate everything. For occasionally used ones, or ones that are loaded from +// disk, used once, and discarded, we might want to precalculate on a separate thread or the +// like. +// The AES key and metadata key HMAC key are the most frequently used ones, as the MIC HMAC key +// is only used on the matching identity, not all identities. + +/// Cryptographic material for an individual NP credential used to decrypt and verify v1 sections. +pub trait V1CryptoMaterial { + /// The return type of `Self::signed_identity_resolution_material`, which is some + /// data-type which allows borrowing `SignedSectionIdentityResolutionMaterial` + type SignedIdentityResolverReference<'a>: Borrow<SignedSectionIdentityResolutionMaterial> + where + Self: 'a; + /// The return type of `Self::unsigned_identity_resolution_material`, which is some + /// data-type which allows borrowing `UnsignedSectionIdentityResolutionMaterial` + type UnsignedIdentityResolverReference<'a>: Borrow<UnsignedSectionIdentityResolutionMaterial> + where + Self: 'a; + + /// Constructs or references the identity resolution material for signed sections + fn signed_identity_resolution_material<C: CryptoProvider>( + &self, + ) -> Self::SignedIdentityResolverReference<'_>; + + /// Constructs or references the identity resolution material for unsigned sections + fn unsigned_identity_resolution_material<C: CryptoProvider>( + &self, + ) -> Self::UnsignedIdentityResolverReference<'_>; + + /// Constructs or copies non-identity-resolution deserialization material for signed + /// sections. + /// + /// Note: We mandate "copies" here due to the relatively small size of verification-only crypto + /// materials (32 bytes). + fn signed_verification_material<C: CryptoProvider>(&self) -> SignedSectionVerificationMaterial; + + /// Constructs or copies non-identity-resolution deserialization material for unsigned + /// sections. + /// + /// Note: We mandate "copies" here due to the relatively small size of verification-only crypto + /// materials (32 bytes). + fn unsigned_verification_material<C: CryptoProvider>( + &self, + ) -> UnsignedSectionVerificationMaterial; + + /// Constructs pre-calculated crypto material out of this crypto-material. + fn to_precalculated<C: CryptoProvider>(self) -> PrecalculatedV1CryptoMaterial + where + Self: Sized, + { + let signed_identity_resolution_material = + self.signed_identity_resolution_material::<C>().borrow().clone(); + let unsigned_identity_resolution_material = + self.unsigned_identity_resolution_material::<C>().borrow().clone(); + let signed_verification_material = self.signed_verification_material::<C>(); + let unsigned_verification_material = self.unsigned_verification_material::<C>(); + PrecalculatedV1CryptoMaterial { + signed_identity_resolution_material, + unsigned_identity_resolution_material, + signed_verification_material, + unsigned_verification_material, + } + } +} + +/// [`V1CryptoMaterial`] that minimizes CPU time when providing key material at +/// the expense of occupied memory +pub struct PrecalculatedV1CryptoMaterial { + pub(crate) signed_identity_resolution_material: SignedSectionIdentityResolutionMaterial, + pub(crate) unsigned_identity_resolution_material: UnsignedSectionIdentityResolutionMaterial, + pub(crate) signed_verification_material: SignedSectionVerificationMaterial, + pub(crate) unsigned_verification_material: UnsignedSectionVerificationMaterial, +} + +impl V1CryptoMaterial for PrecalculatedV1CryptoMaterial { + type SignedIdentityResolverReference<'a> = &'a SignedSectionIdentityResolutionMaterial + where Self: 'a; + type UnsignedIdentityResolverReference<'a> = &'a UnsignedSectionIdentityResolutionMaterial + where Self: 'a; + + fn signed_identity_resolution_material<C: CryptoProvider>( + &self, + ) -> Self::SignedIdentityResolverReference<'_> { + &self.signed_identity_resolution_material + } + fn unsigned_identity_resolution_material<C: CryptoProvider>( + &self, + ) -> Self::UnsignedIdentityResolverReference<'_> { + &self.unsigned_identity_resolution_material + } + fn signed_verification_material<C: CryptoProvider>(&self) -> SignedSectionVerificationMaterial { + self.signed_verification_material.clone() + } + fn unsigned_verification_material<C: CryptoProvider>( + &self, + ) -> UnsignedSectionVerificationMaterial { + self.unsigned_verification_material.clone() + } +} + +/// [`V1CryptoMaterial`] that minimizes memory footprint at the expense of CPU +/// time when providing derived key material. +pub struct MinimumFootprintV1CryptoMaterial { + key_seed: [u8; 32], + expected_unsigned_metadata_key_hmac: [u8; 32], + expected_signed_metadata_key_hmac: [u8; 32], + pub_key: ed25519::RawPublicKey, +} + +impl MinimumFootprintV1CryptoMaterial { + /// Construct an [MinimumFootprintV1CryptoMaterial] from the provided identity data. + pub fn new<C: CryptoProvider>( + key_seed: [u8; 32], + expected_unsigned_metadata_key_hmac: [u8; 32], + expected_signed_metadata_key_hmac: [u8; 32], + pub_key: np_ed25519::PublicKey<C>, + ) -> Self { + Self { + key_seed, + expected_unsigned_metadata_key_hmac, + expected_signed_metadata_key_hmac, + pub_key: pub_key.to_bytes(), + } + } +} + +impl V1CryptoMaterial for MinimumFootprintV1CryptoMaterial { + type SignedIdentityResolverReference<'a> = SignedSectionIdentityResolutionMaterial + where Self: 'a; + type UnsignedIdentityResolverReference<'a> = UnsignedSectionIdentityResolutionMaterial + where Self: 'a; + + fn signed_identity_resolution_material<C: CryptoProvider>( + &self, + ) -> Self::SignedIdentityResolverReference<'_> { + let hkdf = np_hkdf::NpKeySeedHkdf::<C>::new(&self.key_seed); + SignedSectionIdentityResolutionMaterial::from_hkdf_and_expected_metadata_key_hmac( + &hkdf, + self.expected_signed_metadata_key_hmac, + ) + } + + fn unsigned_identity_resolution_material<C: CryptoProvider>( + &self, + ) -> Self::UnsignedIdentityResolverReference<'_> { + let hkdf = np_hkdf::NpKeySeedHkdf::<C>::new(&self.key_seed); + UnsignedSectionIdentityResolutionMaterial::from_hkdf_and_expected_metadata_key_hmac( + &hkdf, + self.expected_unsigned_metadata_key_hmac, + ) + } + + fn signed_verification_material<C: CryptoProvider>(&self) -> SignedSectionVerificationMaterial { + SignedSectionVerificationMaterial { pub_key: self.pub_key } + } + + fn unsigned_verification_material<C: CryptoProvider>( + &self, + ) -> UnsignedSectionVerificationMaterial { + let hkdf = np_hkdf::NpKeySeedHkdf::<C>::new(&self.key_seed); + let mic_hmac_key = *UnsignedSectionKeys::hmac_key(&hkdf).as_bytes(); + UnsignedSectionVerificationMaterial { mic_hmac_key } + } +}
diff --git a/nearby/presence/np_adv/src/de_type.rs b/nearby/presence/np_adv/src/de_type.rs new file mode 100644 index 0000000..90c86e1 --- /dev/null +++ b/nearby/presence/np_adv/src/de_type.rs
@@ -0,0 +1,88 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! DE types that are shared across v0 and v1. + +// The same ids are used for v0/legacy and v1/extended +const IDENTITY_DE_TYPES_BY_CODE: [Option<IdentityDataElementType>; 5] = [ + // no need for more elements since identity types are at indices 1-4 + None, // 0b0000 + Some(IdentityDataElementType::Private), // 0b0001 + Some(IdentityDataElementType::Trusted), // 0b0010 + Some(IdentityDataElementType::Public), // 0b0011 + Some(IdentityDataElementType::Provisioned), // 0b0100 +]; + +/// DE types for special DEs that contain other DEs and consume the entire payload of the +/// advertisement. +/// +/// Shared between V0 and V1. +/// +/// Must not overlap with [PlainDataElementType]. +#[derive(strum_macros::EnumIter, Debug, Clone, Copy, PartialEq, Eq)] +#[allow(clippy::enum_variant_names)] +pub(crate) enum IdentityDataElementType { + Private, + Trusted, + Public, + Provisioned, +} + +impl IdentityDataElementType { + pub(crate) fn as_encrypted_identity_de_type(&self) -> Option<EncryptedIdentityDataElementType> { + match self { + IdentityDataElementType::Private => Some(EncryptedIdentityDataElementType::Private), + IdentityDataElementType::Trusted => Some(EncryptedIdentityDataElementType::Trusted), + IdentityDataElementType::Public => None, + IdentityDataElementType::Provisioned => { + Some(EncryptedIdentityDataElementType::Provisioned) + } + } + } + + /// Type codes for identity DEs are shared between versions 0 and 1. + pub(crate) fn shared_type_code(&self) -> u8 { + match self { + IdentityDataElementType::Private => 0b0001, + IdentityDataElementType::Trusted => 0b0010, + IdentityDataElementType::Public => 0b0011, + IdentityDataElementType::Provisioned => 0b0100, + } + } + + pub(crate) fn from_shared_type_code(code: u8) -> Option<Self> { + IDENTITY_DE_TYPES_BY_CODE.get(code as usize).and_then(|o| *o) + } +} + +/// The identity DE types that support encryption. +#[derive(strum_macros::EnumIter, Debug, Clone, Copy, PartialEq, Eq)] +pub enum EncryptedIdentityDataElementType { + /// An identity that's shared with other devices where a user has signed in to their identity provider + Private, + /// An identity shared via some trust designation (e.g. starred contacts) + Trusted, + /// An identity established via a p2p link between two specific devices + Provisioned, +} + +impl EncryptedIdentityDataElementType { + pub(crate) fn as_identity_data_element_type(&self) -> IdentityDataElementType { + match self { + EncryptedIdentityDataElementType::Private => IdentityDataElementType::Private, + EncryptedIdentityDataElementType::Trusted => IdentityDataElementType::Trusted, + EncryptedIdentityDataElementType::Provisioned => IdentityDataElementType::Provisioned, + } + } +}
diff --git a/nearby/presence/np_adv/src/deser_v0_tests.rs b/nearby/presence/np_adv/src/deser_v0_tests.rs new file mode 100644 index 0000000..fa94b89 --- /dev/null +++ b/nearby/presence/np_adv/src/deser_v0_tests.rs
@@ -0,0 +1,281 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +use rand::{seq::SliceRandom as _, SeedableRng as _}; + +extern crate std; + +use crate::{ + credential::{ + simple::{SimpleMatchedCredential, SimpleV0Credential}, + source::SliceCredentialSource, + v0::MinimumFootprintV0CryptoMaterial, + }, + de_type::EncryptedIdentityDataElementType, + deserialize_v0_advertisement, + legacy::{ + actions::{ActionBits, ActionsDataElement, ToActionElement}, + data_elements::DataElement, + deserialize::PlainDataElement, + serialize::{AdvBuilder, Identity, LdtIdentity}, + BLE_ADV_SVC_CONTENT_LEN, + }, + shared_data::ContextSyncSeqNum, + CredentialSource, NoIdentity, PlaintextIdentityMode, PublicIdentity, V0AdvContents, + V0Credential, +}; +use array_view::ArrayView; +use core::marker::PhantomData; +use crypto_provider::CryptoProvider; +use crypto_provider_default::CryptoProviderImpl; +use ldt_np_adv::{LdtEncrypterXtsAes128, LegacySalt}; +use std::{prelude::rust_2021::*, vec}; +use strum::IntoEnumIterator as _; + +#[test] +fn v0_all_identities_resolvable() { + let mut rng = rand::rngs::StdRng::from_entropy(); + for _ in 0..100 { + let identities = (0..100).map(|_| TestIdentity::random(&mut rng)).collect::<Vec<_>>(); + + let (adv, adv_config) = adv_random_identity(&mut rng, &identities); + + let creds = identities.iter().map(|i| i.credential()).collect::<Vec<_>>(); + let cred_source = SliceCredentialSource::new(&creds); + + let contents = deser_v0::<_, _, CryptoProviderImpl>(&cred_source, adv.as_slice()); + + assert_adv_equals(&adv_config, &contents); + } +} + +#[test] +fn v0_only_non_matching_identities_available() { + let mut rng = rand::rngs::StdRng::from_entropy(); + for _ in 0..100 { + let identities = (0..100).map(|_| TestIdentity::random(&mut rng)).collect::<Vec<_>>(); + + let (adv, adv_config) = adv_random_identity(&mut rng, &identities); + + let creds = identities + .iter() + .filter(|i| { + // remove identity used, if any + !adv_config.identity.map(|sci| sci.key_seed == i.key_seed).unwrap_or(false) + }) + .map(|i| i.credential()) + .collect::<Vec<_>>(); + let cred_source = SliceCredentialSource::new(&creds); + + let contents = deser_v0::<_, _, CryptoProviderImpl>(&cred_source, adv.as_slice()); + + match adv_config.identity { + // we ended up generating plaintext, so it's fine + None => assert_adv_equals(&adv_config, &contents), + Some(_) => { + // we generated an encrypted adv, but didn't include the credential + assert_eq!(V0AdvContents::NoMatchingCredentials, contents); + } + } + } +} + +#[test] +fn v0_no_creds_available_error_if_encrypted() { + let mut rng = rand::rngs::StdRng::from_entropy(); + for _ in 0..100 { + let identities = (0..100).map(|_| TestIdentity::random(&mut rng)).collect::<Vec<_>>(); + + let (adv, adv_config) = adv_random_identity(&mut rng, &identities); + + let creds = Vec::<SimpleV0Credential<MinimumFootprintV0CryptoMaterial, [u8; 32]>>::new(); + let cred_source = SliceCredentialSource::new(&creds); + + let contents = deser_v0::<_, _, CryptoProviderImpl>(&cred_source, adv.as_slice()); + + match adv_config.identity { + // we ended up generating plaintext, so it's fine + None => assert_adv_equals(&adv_config, &contents), + Some(_) => { + // we generated an encrypted adv, but didn't include the credential + assert_eq!(V0AdvContents::NoMatchingCredentials, contents); + } + } + } +} + +fn assert_adv_equals<'m>( + adv_config: &AdvConfig, + adv: &V0AdvContents<'m, SimpleMatchedCredential<'m, [u8; 32]>>, +) { + match adv_config.identity { + None => match adv { + V0AdvContents::Plaintext(p) => { + let mut action_bits = ActionBits::default(); + action_bits.set_action(ContextSyncSeqNum::try_from(3).unwrap()); + let de = ActionsDataElement::from(action_bits); + + assert_eq!(adv_config.plaintext_mode.unwrap(), p.identity()); + assert_eq!( + vec![&PlainDataElement::Actions(de)], + p.data_elements().collect::<Vec<_>>() + ) + } + _ => panic!("should be a plaintext adv"), + }, + Some(_) => match adv { + V0AdvContents::Decrypted(wmc) => { + assert!(adv_config.plaintext_mode.is_none()); + + // different generic type param, so can't re-use the DE from above + let mut action_bits = ActionBits::default(); + action_bits.set_action(ContextSyncSeqNum::try_from(3).unwrap()); + let de = ActionsDataElement::from(action_bits); + + assert_eq!( + vec![&PlainDataElement::Actions(de)], + wmc.contents().data_elements().collect::<Vec<_>>() + ); + assert_eq!( + adv_config.identity.unwrap().identity_type, + wmc.contents().identity_type() + ); + assert_eq!( + &adv_config.identity.unwrap().legacy_metadata_key, + wmc.contents().metadata_key() + ); + } + _ => panic!("should be an encrypted adv"), + }, + } +} + +fn deser_v0<'s, C, S, P>( + cred_source: &'s S, + adv: &[u8], +) -> V0AdvContents<'s, SimpleMatchedCredential<'s, [u8; 32]>> +where + C: V0Credential<Matched<'s> = SimpleMatchedCredential<'s, [u8; 32]>> + 's, + S: CredentialSource<C>, + P: CryptoProvider, +{ + deserialize_v0_advertisement::<C, S, P>(adv, cred_source).unwrap() +} + +/// Populate an advertisement with a randomly chosen identity and a DE +fn adv_random_identity<'a, R: rand::Rng>( + mut rng: &mut R, + identities: &'a Vec<TestIdentity<CryptoProviderImpl>>, +) -> (ArrayView<u8, { BLE_ADV_SVC_CONTENT_LEN }>, AdvConfig<'a>) { + let identity = identities.choose(&mut rng).unwrap(); + match rng.gen_range(0_u8..=2) { + 0 => { + let mut adv_builder = AdvBuilder::new(NoIdentity::default()); + add_de(&mut adv_builder); + + ( + adv_builder.into_advertisement().unwrap(), + AdvConfig::new(None, Some(PlaintextIdentityMode::None)), + ) + } + 1 => { + let mut adv_builder = AdvBuilder::new(PublicIdentity::default()); + add_de(&mut adv_builder); + + ( + adv_builder.into_advertisement().unwrap(), + AdvConfig::new(None, Some(PlaintextIdentityMode::Public)), + ) + } + 2 => { + let mut adv_builder = AdvBuilder::new(LdtIdentity::<CryptoProviderImpl>::new( + identity.identity_type, + LegacySalt::from(rng.gen::<[u8; 2]>()), + identity.legacy_metadata_key, + LdtEncrypterXtsAes128::<CryptoProviderImpl>::new(&identity.hkdf().legacy_ldt_key()), + )); + add_de(&mut adv_builder); + + (adv_builder.into_advertisement().unwrap(), AdvConfig::new(Some(identity), None)) + } + + _ => unreachable!(), + } +} + +fn add_de<I>(adv_builder: &mut AdvBuilder<I>) +where + I: Identity, + ActionsDataElement<I::Flavor>: DataElement, + ContextSyncSeqNum: ToActionElement<I::Flavor>, +{ + let mut action_bits = ActionBits::default(); + action_bits.set_action(ContextSyncSeqNum::try_from(3).unwrap()); + let de = ActionsDataElement::from(action_bits); + adv_builder.add_data_element(de).unwrap(); +} + +struct TestIdentity<C: CryptoProvider> { + identity_type: EncryptedIdentityDataElementType, + key_seed: [u8; 32], + legacy_metadata_key: [u8; 14], + _marker: PhantomData<C>, +} + +impl<C: CryptoProvider> TestIdentity<C> { + /// Generate a new identity with random crypto material + fn random<R: rand::Rng + rand::CryptoRng>(rng: &mut R) -> Self { + Self { + identity_type: *EncryptedIdentityDataElementType::iter() + .collect::<Vec<_>>() + .choose(rng) + .unwrap(), + key_seed: rng.gen(), + legacy_metadata_key: rng.gen(), + _marker: PhantomData, + } + } + + /// Returns a credential using crypto material from this identity + fn credential(&self) -> SimpleV0Credential<MinimumFootprintV0CryptoMaterial, [u8; 32]> { + let hkdf = self.hkdf(); + SimpleV0Credential::new( + MinimumFootprintV0CryptoMaterial::new( + self.key_seed, + hkdf.legacy_metadata_key_hmac_key().calculate_hmac(&self.legacy_metadata_key), + ), + self.key_seed, + ) + } + + fn hkdf(&self) -> np_hkdf::NpKeySeedHkdf<C> { + np_hkdf::NpKeySeedHkdf::new(&self.key_seed) + } +} + +struct AdvConfig<'a> { + /// `Some` iff an encrypted identity should be used + identity: Option<&'a TestIdentity<CryptoProviderImpl>>, + /// `Some` iff `identity` is `None` + plaintext_mode: Option<PlaintextIdentityMode>, +} + +impl<'a> AdvConfig<'a> { + fn new( + identity: Option<&'a TestIdentity<CryptoProviderImpl>>, + plaintext_mode: Option<PlaintextIdentityMode>, + ) -> Self { + Self { identity, plaintext_mode } + } +}
diff --git a/nearby/presence/np_adv/src/deser_v1_tests.rs b/nearby/presence/np_adv/src/deser_v1_tests.rs new file mode 100644 index 0000000..b59b18b --- /dev/null +++ b/nearby/presence/np_adv/src/deser_v1_tests.rs
@@ -0,0 +1,486 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +use core::marker::PhantomData; +use rand::{rngs::StdRng, seq::SliceRandom as _, Rng as _, SeedableRng as _}; + +extern crate std; + +use crate::{ + credential::{ + simple::{SimpleMatchedCredential, SimpleV1Credential}, + source::SliceCredentialSource, + v1::MinimumFootprintV1CryptoMaterial, + }, + de_type::EncryptedIdentityDataElementType, + deserialize_v1_advertisement, + extended::{ + data_elements::GenericDataElement, + deserialize::VerificationMode, + serialize::{ + AdvBuilder, EncodedAdvertisement, MicEncrypted, SectionBuilder, SectionIdentity, + SignedEncrypted, + }, + }, + AdvDeserializationError, AdvDeserializationErrorDetailsHazmat, CredentialSource, + PlaintextIdentityMode, PublicIdentity, Section, V1AdvContents, V1Credential, + V1DeserializedSection, +}; +use crypto_provider::{CryptoProvider, CryptoRng}; +use std::{collections, prelude::rust_2021::*, vec}; +use strum::IntoEnumIterator as _; + +use crypto_provider_default::CryptoProviderImpl; + +#[test] +fn v1_all_identities_resolvable_mix_plaintext_ciphertext() { + let mut rng = StdRng::from_entropy(); + for _ in 0..100 { + let identities = (0..100) + .map(|_| TestIdentity::<CryptoProviderImpl>::random(&mut rng)) + .collect::<Vec<_>>(); + + let mut adv_builder = AdvBuilder::new(); + let section_configs = fill_adv(&mut rng, &identities, &mut adv_builder); + let adv = adv_builder.into_advertisement(); + let creds = identities.iter().map(|i| i.credential()).collect::<Vec<_>>(); + let cred_source = SliceCredentialSource::new(&creds); + // check if the section header would be 0 or if the section is empty + match section_configs.is_empty() { + true => { + let v1_error = deser_v1_error::<_, _, CryptoProviderImpl>(&cred_source, adv); + assert_eq!( + v1_error, + AdvDeserializationError::ParseError { + details_hazmat: + AdvDeserializationErrorDetailsHazmat::AdvertisementDeserializeError + } + ); //assert a adv deserialization error + } + false => { + let v1_contents = deser_v1::<_, _, CryptoProviderImpl>(&cred_source, adv); + assert_eq!(0, v1_contents.invalid_sections_count()); + assert_eq!(section_configs.len(), v1_contents.sections.len()); + for (section_config, section) in + section_configs.iter().zip(v1_contents.sections.iter()) + { + assert_section_equals(section_config, section); + } + } + } + } +} + +#[test] +fn v1_only_non_matching_identities_available_mix_plaintext_ciphertext() { + let mut rng = StdRng::from_entropy(); + for _ in 0..100 { + let identities = (0..100) + .map(|_| TestIdentity::<CryptoProviderImpl>::random(&mut rng)) + .collect::<Vec<_>>(); + + let mut adv_builder = AdvBuilder::new(); + let section_configs = fill_adv(&mut rng, &identities, &mut adv_builder); + let adv = adv_builder.into_advertisement(); + let creds = identities + .iter() + .filter(|i| { + // remove all identities used in sections + !section_configs + .iter() + .any(|sc| sc.identity.map(|sci| sci.key_seed == i.key_seed).unwrap_or(false)) + }) + .map(|i| i.credential()) + .collect::<Vec<_>>(); + let cred_source = SliceCredentialSource::new(&creds); + // check if the section header would be 0 + match section_configs.is_empty() { + true => { + let v1_error = deser_v1_error::<_, _, CryptoProviderImpl>(&cred_source, adv); + assert_eq!( + v1_error, + AdvDeserializationError::ParseError { + details_hazmat: + AdvDeserializationErrorDetailsHazmat::AdvertisementDeserializeError + } + ); //assert a adv deserialization error + } + false => { + let v1_contents = deser_v1::<_, _, CryptoProviderImpl>(&cred_source, adv); + // all encrypted identity sections are invalid + let encrypted_section_count = + section_configs.iter().filter(|sc| sc.identity.is_some()).count(); + assert_eq!(encrypted_section_count, v1_contents.invalid_sections_count()); + assert_eq!( + section_configs.len() - encrypted_section_count, + v1_contents.sections.len() + ); + for (section_config, section) in section_configs + .iter() + // skip encrypted sections + .filter(|sc| sc.identity.is_none()) + .zip(v1_contents.sections.iter()) + { + assert_section_equals(section_config, section); + } + } + } + } +} + +#[test] +fn v1_no_creds_available_mix_plaintext_ciphertext() { + let mut rng = StdRng::from_entropy(); + for _ in 0..100 { + let identities = (0..100).map(|_| TestIdentity::random(&mut rng)).collect::<Vec<_>>(); + + let mut adv_builder = AdvBuilder::new(); + let section_configs = + fill_adv::<StdRng, CryptoProviderImpl>(&mut rng, &identities, &mut adv_builder); + let adv = adv_builder.into_advertisement(); + let cred_source: SliceCredentialSource< + '_, + SimpleV1Credential<MinimumFootprintV1CryptoMaterial, [u8; 32]>, + > = SliceCredentialSource::new(&[]); + // check if the section header would be 0 + match section_configs.is_empty() { + true => { + let v1_error = deser_v1_error::<_, _, CryptoProviderImpl>(&cred_source, adv); + assert_eq!( + v1_error, + AdvDeserializationError::ParseError { + details_hazmat: + AdvDeserializationErrorDetailsHazmat::AdvertisementDeserializeError + } + ); //assert a adv deserialization error + } + false => { + let v1_contents = deser_v1::<_, _, CryptoProviderImpl>(&cred_source, adv); + // all encrypted identity sections are invalid + let encrypted_section_count = + section_configs.iter().filter(|sc| sc.identity.is_some()).count(); + assert_eq!(encrypted_section_count, v1_contents.invalid_sections_count()); + assert_eq!( + section_configs.len() - encrypted_section_count, + v1_contents.sections.len() + ); + + for (section_config, section) in section_configs + .iter() + // skip encrypted sections + .filter(|sc| sc.identity.is_none()) + .zip(v1_contents.sections.iter()) + { + assert_section_equals(section_config, section); + } + } + } + } +} + +#[test] +fn v1_only_some_matching_identities_available_mix_plaintext_ciphertext() { + let mut rng = StdRng::from_entropy(); + for _ in 0..100 { + let identities = (0..100) + .map(|_| TestIdentity::<CryptoProviderImpl>::random(&mut rng)) + .collect::<Vec<_>>(); + + let mut adv_builder = AdvBuilder::new(); + let section_configs = fill_adv(&mut rng, &identities, &mut adv_builder); + let adv = adv_builder.into_advertisement(); + // identities used in sections, which may be used in multiple sections too + let identities_to_remove: collections::HashSet<_> = identities + .iter() + .filter(|i| { + let identity_used = section_configs + .iter() + .any(|sc| sc.identity.map(|sci| sci.key_seed == i.key_seed).unwrap_or(false)); + + // only remove half the identities that were used + identity_used && rng.gen() + }) + .map(|i| i.key_seed) + .collect(); + + let creds = identities + .iter() + .filter(|i| !identities_to_remove.contains(&i.key_seed)) + .map(|i| i.credential()) + .collect::<Vec<_>>(); + let cred_source = SliceCredentialSource::new(&creds); + // check if the section header would be 0 + match section_configs.is_empty() { + true => { + let v1_error = deser_v1_error::<_, _, CryptoProviderImpl>(&cred_source, adv); + assert_eq!( + v1_error, + AdvDeserializationError::ParseError { + details_hazmat: + AdvDeserializationErrorDetailsHazmat::AdvertisementDeserializeError + } + ); //assert a adv deserialization error + } + false => { + let v1_contents = deser_v1::<_, _, CryptoProviderImpl>(&cred_source, adv); + + let affected_sections: Vec<_> = section_configs + .iter() + .filter(|sc| { + sc.identity + .map(|sci| identities_to_remove.iter().any(|ks| &sci.key_seed == ks)) + .unwrap_or(false) + }) + .collect(); + + assert_eq!(affected_sections.len(), v1_contents.invalid_sections_count()); + assert_eq!( + section_configs.len() - affected_sections.len(), + v1_contents.sections.len() + ); + + for (section_config, section) in section_configs + .iter() + // skip sections w/ removed identities + .filter(|sc| { + sc.identity + .map(|i| !identities_to_remove.contains(&i.key_seed)) + .unwrap_or(true) + }) + .zip(v1_contents.sections.iter()) + { + assert_section_equals(section_config, section); + } + } + } + } +} + +fn assert_section_equals<'m, C: CryptoProvider>( + section_config: &SectionConfig<C>, + section: &V1DeserializedSection<'m, SimpleMatchedCredential<'m, [u8; 32]>>, +) { + match section_config.identity { + None => match section { + V1DeserializedSection::Plaintext(p) => { + assert!(section_config.verification_mode.is_none()); + + assert_eq!(section_config.plaintext_mode.unwrap(), p.identity()); + assert_eq!( + section_config.data_elements, + p.data_elements().map(|de| de.into()).collect::<Vec<_>>() + ) + } + V1DeserializedSection::Decrypted(_) => panic!("no id, but decrypted section"), + }, + Some(_) => match section { + V1DeserializedSection::Plaintext(_) => panic!("id, but plaintext section"), + V1DeserializedSection::Decrypted(wmc) => { + assert!(section_config.plaintext_mode.is_none()); + + assert_eq!( + section_config.data_elements, + wmc.contents().data_elements().map(|de| de.into()).collect::<Vec<_>>() + ); + assert_eq!( + section_config.identity.unwrap().identity_type, + wmc.contents().identity_type() + ); + assert_eq!( + §ion_config.identity.unwrap().extended_metadata_key, + wmc.contents().metadata_key() + ); + assert_eq!( + section_config.verification_mode.unwrap(), + wmc.contents().verification_mode() + ); + } + }, + } +} + +fn deser_v1_error<'s, C, S, P>( + cred_source: &'s S, + adv: EncodedAdvertisement, +) -> AdvDeserializationError +where + C: V1Credential<Matched<'s> = SimpleMatchedCredential<'s, [u8; 32]>> + 's, + S: CredentialSource<C>, + P: CryptoProvider, +{ + let v1_contents = match deserialize_v1_advertisement::<C, S, P>(adv.as_slice(), cred_source) { + Err(e) => e, + _ => panic!("Expecting an error!"), + }; + v1_contents +} + +fn deser_v1<'s, C, S, P>( + cred_source: &'s S, + adv: EncodedAdvertisement, +) -> V1AdvContents<'s, SimpleMatchedCredential<'s, [u8; 32]>> +where + C: V1Credential<Matched<'s> = SimpleMatchedCredential<'s, [u8; 32]>> + 's, + S: CredentialSource<C>, + P: CryptoProvider, +{ + deserialize_v1_advertisement::<C, S, P>(adv.as_slice(), cred_source).unwrap() +} +/// Populate a random number of sections with randomly chosen identities and random DEs +fn fill_adv<'a, R: rand::Rng, C: CryptoProvider>( + mut rng: &mut R, + identities: &'a Vec<TestIdentity<C>>, + adv_builder: &mut AdvBuilder, +) -> Vec<SectionConfig<'a, C>> { + let mut expected = Vec::new(); + let mut salt_rng = C::CryptoRng::new(); + // build sections + for _ in 0..rng.gen_range(0..=6) { + let chosen_index = rng.gen_range(0..identities.len()); + let identity = &identities[chosen_index]; + let res = match rng.gen_range(1_u8..=3) { + 1 => adv_builder.section_builder(PublicIdentity::default()).map(|s| { + SectionConfig::new( + None, + Some(PlaintextIdentityMode::Public), + None, + add_des(s, &mut rng), + ) + }), + 2 => adv_builder + .section_builder(MicEncrypted::new_random_salt( + &mut salt_rng, + identity.identity_type, + &identity.extended_metadata_key, + &identity.hkdf(), + )) + .map(|s| { + SectionConfig::new( + Some(identity), + None, + Some(VerificationMode::Mic), + add_des(s, &mut rng), + ) + }), + 3 => adv_builder + .section_builder(SignedEncrypted::new_random_salt( + &mut salt_rng, + identity.identity_type, + &identity.extended_metadata_key, + &identity.key_pair, + &identity.hkdf(), + )) + .map(|s| { + SectionConfig::new( + Some(identity), + None, + Some(VerificationMode::Signature), + add_des(s, &mut rng), + ) + }), + _ => unreachable!(), + }; + match res { + Ok(tuple) => expected.push(tuple), + Err(_) => { + // couldn't fit that section; maybe another smaller section will fit + continue; + } + } + } + expected +} +struct TestIdentity<C: CryptoProvider> { + identity_type: EncryptedIdentityDataElementType, + key_seed: [u8; 32], + extended_metadata_key: [u8; 16], + key_pair: np_ed25519::KeyPair<C>, + marker: PhantomData<C>, +} +impl<C: CryptoProvider> TestIdentity<C> { + /// Generate a new identity with random crypto material + fn random<R: rand::Rng + rand::CryptoRng>(rng: &mut R) -> Self { + Self { + identity_type: *EncryptedIdentityDataElementType::iter() + .collect::<Vec<_>>() + .choose(rng) + .unwrap(), + key_seed: rng.gen(), + extended_metadata_key: rng.gen(), + key_pair: np_ed25519::KeyPair::<C>::generate(), + marker: PhantomData, + } + } + /// Returns a credential using crypto material from this identity + fn credential(&self) -> SimpleV1Credential<MinimumFootprintV1CryptoMaterial, [u8; 32]> { + let hkdf = self.hkdf(); + SimpleV1Credential::new( + MinimumFootprintV1CryptoMaterial::new( + self.key_seed, + hkdf.extended_unsigned_metadata_key_hmac_key() + .calculate_hmac(&self.extended_metadata_key), + hkdf.extended_signed_metadata_key_hmac_key() + .calculate_hmac(&self.extended_metadata_key), + self.key_pair.public(), + ), + self.key_seed, + ) + } + fn hkdf(&self) -> np_hkdf::NpKeySeedHkdf<C> { + np_hkdf::NpKeySeedHkdf::<C>::new(&self.key_seed) + } +} +/// Add several DEs with random types and contents +fn add_des<I: SectionIdentity, R: rand::Rng>( + mut sb: SectionBuilder<I>, + rng: &mut R, +) -> Vec<GenericDataElement> { + let mut des = Vec::new(); + for _ in 0..rng.gen_range(0..=2) { + // not worried about multi byte type encoding here, so just sticking with what can sometimes + // fit in the 1-byte header, and isn't an identity element + let de_type = rng.gen_range(10_u32..=20); + // covers lengths that fit or don't fit in 3 bits (1 byte header) + let de_len = rng.gen_range(0..=10); + let mut de_data = vec![0; de_len]; + rng.fill(&mut de_data[..]); + let de = GenericDataElement::try_from(de_type.into(), &de_data).unwrap(); + if sb.add_de(|_| de.clone()).is_err() { + // no more room in the section + break; + } + des.push(de); + } + sb.add_to_advertisement(); + des +} +struct SectionConfig<'a, C: CryptoProvider> { + /// `Some` iff an encrypted identity should be used + identity: Option<&'a TestIdentity<C>>, + /// `Some` iff `identity` is `None` + plaintext_mode: Option<PlaintextIdentityMode>, + /// `Some` iff `identity` is `Some` + verification_mode: Option<VerificationMode>, + data_elements: Vec<GenericDataElement>, +} +impl<'a, C: CryptoProvider> SectionConfig<'a, C> { + pub fn new( + identity: Option<&'a TestIdentity<C>>, + plaintext_mode: Option<PlaintextIdentityMode>, + verification_mode: Option<VerificationMode>, + data_elements: Vec<GenericDataElement>, + ) -> Self { + Self { identity, plaintext_mode, verification_mode, data_elements } + } +}
diff --git a/nearby/presence/np_adv/src/extended/data_elements/mod.rs b/nearby/presence/np_adv/src/extended/data_elements/mod.rs new file mode 100644 index 0000000..2058be1 --- /dev/null +++ b/nearby/presence/np_adv/src/extended/data_elements/mod.rs
@@ -0,0 +1,305 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! V1 data elements. +//! +//! Commonly used DEs have dedicated types (e.g. [TxPowerDataElement], etc), but if another DE is +//! needed, [GenericDataElement] will allow constructing any type of DE. + +use crate::extended::{ + de_type::DeType, + deserialize::DataElement, + serialize::{DeHeader, SingleTypeDataElement, WriteDataElement}, + DeLength, ENCRYPTION_INFO_DE_TYPE, MAX_DE_LEN, +}; +use crate::shared_data::*; +use array_view::ArrayView; +use sink::Sink; + +#[cfg(test)] +mod tests; + +/// A general purpose data element for use cases that don't fit into an existing DE type. +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct GenericDataElement { + de_type: DeType, + data: ArrayView<u8, MAX_DE_LEN>, +} + +impl GenericDataElement { + /// Construct a `GenericDataElement` from the provided input. + /// + /// `de_type`: the DE type + /// `data`: the DE contents, length <= 127 + pub fn try_from(de_type: DeType, data: &[u8]) -> Result<Self, GenericDataElementError> { + ArrayView::try_from_slice(data) + .ok_or(GenericDataElementError::DataTooLong) + .map(|data| Self { de_type, data }) + } +} + +/// Errors that can occur constructing a [GenericDataElement] +#[derive(Debug, PartialEq, Eq)] +pub enum GenericDataElementError { + /// The DE data is too long + DataTooLong, +} + +impl WriteDataElement for GenericDataElement { + fn de_header(&self) -> DeHeader { + DeHeader::new(self.de_type, self.data.len().try_into().expect("length <= max DE len")) + } + + fn write_de_contents<S: Sink<u8>>(&self, sink: &mut S) -> Option<()> { + sink.try_extend_from_slice(self.data.as_slice()) + } +} + +/// Convert a deserialized DE into one you can serialize +impl<'a> From<DataElement<'a>> for GenericDataElement { + fn from(de: DataElement<'a>) -> Self { + Self::try_from(de.de_type(), de.contents()) + .expect("Deserialized DE must have a valid length") + } +} + +/// Advertising power +#[derive(Clone)] +pub struct TxPowerDataElement { + tx_power: TxPower, +} + +impl From<TxPower> for TxPowerDataElement { + fn from(tx_power: TxPower) -> Self { + Self { tx_power } + } +} + +impl SingleTypeDataElement for TxPowerDataElement { + const DE_TYPE: DeType = DeType::const_from(0x05); +} + +impl WriteDataElement for TxPowerDataElement { + fn de_header(&self) -> DeHeader { + DeHeader::new(Self::DE_TYPE, 1_u8.try_into().expect("1 is a valid length")) + } + + fn write_de_contents<S: Sink<u8>>(&self, sink: &mut S) -> Option<()> { + sink.try_push(self.tx_power.as_i8() as u8) + } +} + +/// List of actions +pub struct ActionsDataElement { + actions: tinyvec::ArrayVec<[u8; MAX_DE_LEN]>, +} + +impl ActionsDataElement { + /// Returns `Some` if the actions will fit in a DE, `None` otherwise + pub fn try_from_actions(actions: &[u8]) -> Result<Self, ActionsDataElementError> { + let mut de = Self { actions: tinyvec::ArrayVec::new() }; + + de.actions + .try_extend_from_slice(actions) + .map(|_| de) + .ok_or(ActionsDataElementError::ActionsTooLong) + } +} + +impl SingleTypeDataElement for ActionsDataElement { + const DE_TYPE: DeType = DeType::const_from(0x06); +} + +impl WriteDataElement for ActionsDataElement { + fn de_header(&self) -> DeHeader { + DeHeader::new(Self::DE_TYPE, self.actions.len().try_into().expect("always <= max length")) + } + + fn write_de_contents<S: Sink<u8>>(&self, sink: &mut S) -> Option<()> { + sink.try_extend_from_slice(&self.actions) + } +} + +/// Errors that can occur constructing an [ActionsDataElement]. +#[derive(Debug, PartialEq, Eq)] +pub enum ActionsDataElementError { + /// Too many action bytes. + ActionsTooLong, +} + +pub(crate) const SIGNATURE_ENCRYPTION_SCHEME: u8 = 0b00001000; +pub(crate) const MIC_ENCRYPTION_SCHEME: u8 = 0b00000000; + +/// Determines whether a signature or mic encryption scheme is used +pub(crate) struct EncryptionInfoDataElement { + /// First byte is bESSSSRRR where SSSS is the encryption scheme, rest are the salt + pub info: [u8; 17], +} + +impl SingleTypeDataElement for EncryptionInfoDataElement { + const DE_TYPE: DeType = ENCRYPTION_INFO_DE_TYPE; +} + +impl EncryptionInfoDataElement { + pub(crate) fn serialize(&self) -> [u8; 19] { + let mut buffer = [0_u8; 19]; + buffer[0..2].copy_from_slice(self.de_header().serialize().as_slice()); + buffer[2..19].copy_from_slice(&self.info); + buffer + } + + fn de_header(&self) -> DeHeader { + DeHeader::new( + Self::DE_TYPE, + DeLength { + len: self.info.len().try_into().expect("encryption info is a valid length"), + }, + ) + } + + /// Constructs the signature encryption scheme variant + pub fn signature(salt_bytes: &[u8; 16]) -> Self { + Self::new(SIGNATURE_ENCRYPTION_SCHEME, salt_bytes) + } + + /// Constructs the mic encryption scheme variant + pub fn mic(salt_bytes: &[u8; 16]) -> Self { + Self::new(MIC_ENCRYPTION_SCHEME, salt_bytes) + } + + fn new(scheme: u8, salt_bytes: &[u8; 16]) -> Self { + let mut sig_info = [0_u8; 17]; + sig_info[0] = scheme; + sig_info[1..].copy_from_slice(salt_bytes); + Self { info: sig_info } + } +} + +/// Context sync sequence number +pub struct ContextSyncSeqNumDataElement { + num: ContextSyncSeqNum, +} + +impl From<ContextSyncSeqNum> for ContextSyncSeqNumDataElement { + fn from(num: ContextSyncSeqNum) -> Self { + Self { num } + } +} + +impl SingleTypeDataElement for ContextSyncSeqNumDataElement { + const DE_TYPE: DeType = DeType::const_from(0x13); +} + +impl WriteDataElement for ContextSyncSeqNumDataElement { + fn de_header(&self) -> DeHeader { + DeHeader::new(Self::DE_TYPE, 1_u8.try_into().expect("1 is a valid length")) + } + + fn write_de_contents<S: Sink<u8>>(&self, sink: &mut S) -> Option<()> { + sink.try_push(self.num.as_u8()) + } +} + +/// Connectivity info +pub struct ConnectivityInfoDataElement { + // TODO len + info: ArrayView<u8, 24>, +} + +impl ConnectivityInfoDataElement { + /// Construct connectivity info for bluetooth. + pub fn bluetooth(svc_id: [u8; 4], mac: [u8; 6]) -> Self { + let mut array = [0; 24]; + array[0] = 0x1; // bluetooth + array[1..5].copy_from_slice(&svc_id); + array[5..11].copy_from_slice(&mac); + + Self { info: ArrayView::try_from_array(array, 11).expect("length is fixed") } + } + + /// Construct connectivity info for mDNS. + // TODO port type, bssid + pub fn mdns(ip: [u8; 4], port: u8) -> Self { + let mut array = [0; 24]; + array[0] = 0x2; // mdns + array[1..5].copy_from_slice(&ip); + array[5] = port; + + Self { info: ArrayView::try_from_array(array, 6).expect("length is fixed") } + } + + /// Construct connectivity info for WiFi Direct. + pub fn wifi_direct(ssid: [u8; 10], password: [u8; 10], freq: [u8; 2], port: u8) -> Self { + let mut array = [0; 24]; + array[0] = 0x3; // wifi direct + array[1..11].copy_from_slice(&ssid); + array[11..21].copy_from_slice(&password); + array[21..23].copy_from_slice(&freq); + array[23] = port; + + Self { info: ArrayView::try_from_array(array, 24).expect("length is fixed") } + } +} + +impl SingleTypeDataElement for ConnectivityInfoDataElement { + const DE_TYPE: DeType = DeType::const_from(0x11); +} + +impl WriteDataElement for ConnectivityInfoDataElement { + fn de_header(&self) -> DeHeader { + DeHeader::new( + Self::DE_TYPE, + self.info.len().try_into().expect("conn info is a valid length"), + ) + } + + fn write_de_contents<S: Sink<u8>>(&self, sink: &mut S) -> Option<()> { + sink.try_extend_from_slice(self.info.as_slice()) + } +} + +/// Connectivity capabilities +pub struct ConnectivityCapabilityDataElement { + // TODO len + capability: ArrayView<u8, 7>, +} + +impl ConnectivityCapabilityDataElement { + /// Construct connectivity capabilities for WiFi Direct. + pub fn wifi_direct(supported_freqs: [u8; 3], connected_freqs: [u8; 3]) -> Self { + let mut array = [0; 7]; + array[0] = 0x2; // wifi direct + array[1..4].copy_from_slice(&supported_freqs); + array[4..7].copy_from_slice(&connected_freqs); + + Self { capability: ArrayView::try_from_array(array, 7).expect("length is fixed") } + } +} + +impl SingleTypeDataElement for ConnectivityCapabilityDataElement { + const DE_TYPE: DeType = DeType::const_from(0x12); +} + +impl WriteDataElement for ConnectivityCapabilityDataElement { + fn de_header(&self) -> DeHeader { + DeHeader::new( + Self::DE_TYPE, + self.capability.len().try_into().expect("capability is a valid length"), + ) + } + + fn write_de_contents<S: Sink<u8>>(&self, sink: &mut S) -> Option<()> { + sink.try_extend_from_slice(self.capability.as_slice()) + } +}
diff --git a/nearby/presence/np_adv/src/extended/data_elements/tests.rs b/nearby/presence/np_adv/src/extended/data_elements/tests.rs new file mode 100644 index 0000000..a8938b0 --- /dev/null +++ b/nearby/presence/np_adv/src/extended/data_elements/tests.rs
@@ -0,0 +1,183 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +extern crate std; + +use super::*; +use crate::{ + extended::serialize::{section_tests::SectionBuilderExt, AdvBuilder}, + shared_data::TxPower, + PublicIdentity, +}; + +#[test] +fn serialize_tx_power_de() { + let mut adv_builder = AdvBuilder::new(); + let mut section_builder = adv_builder.section_builder(PublicIdentity::default()).unwrap(); + + section_builder.add_de_res(|_| TxPower::try_from(3_i8).map(TxPowerDataElement::from)).unwrap(); + + assert_eq!( + &[ + 3, // section header + 0x03, // public identity + 0x15, // len 1 type 0x05 + 3 + ], + section_builder.into_section().as_slice() + ); +} + +#[test] +fn serialize_actions_de_empty() { + let mut adv_builder = AdvBuilder::new(); + let mut section_builder = adv_builder.section_builder(PublicIdentity::default()).unwrap(); + + section_builder.add_de_res(|_| ActionsDataElement::try_from_actions(&[])).unwrap(); + + assert_eq!( + &[ + 2, // section header + 0x03, // public identity + 0x06, // len 0 type 0x06 + ], + section_builder.into_section().as_slice() + ); +} + +#[test] +fn serialize_actions_de_non_empty() { + let mut adv_builder = AdvBuilder::new(); + let mut section_builder = adv_builder.section_builder(PublicIdentity::default()).unwrap(); + + section_builder + .add_de_res(|_| ActionsDataElement::try_from_actions(&[1, 1, 2, 3, 5, 8])) + .unwrap(); + + assert_eq!( + &[ + 8, // section header + 0x03, // public identity + 0x66, // len 6 type 0x06 + 1, 1, 2, 3, 5, 8 // fibonacci, of course + ], + section_builder.into_section().as_slice() + ); +} + +#[test] +fn serialize_context_sync_seq_num_de() { + let mut adv_builder = AdvBuilder::new(); + let mut section_builder = adv_builder.section_builder(PublicIdentity::default()).unwrap(); + + section_builder + .add_de_res(|_| ContextSyncSeqNum::try_from(3).map(ContextSyncSeqNumDataElement::from)) + .unwrap(); + + assert_eq!( + &[ + 4, // section header + 0x03, // public identity + 0x81, 0x13, // len 1 type 0x13 + 3, // seq num + ], + section_builder.into_section().as_slice() + ); +} + +#[test] +fn serialize_connectivity_info_de_bluetooth() { + let mut adv_builder = AdvBuilder::new(); + let mut section_builder = adv_builder.section_builder(PublicIdentity::default()).unwrap(); + + section_builder.add_de(|_| ConnectivityInfoDataElement::bluetooth([1; 4], [2; 6])).unwrap(); + + assert_eq!( + &[ + 14, // section header + 0x03, // public identity + 0x8B, 0x11, // len 11 type 0x11 + 1, // connectivity type + 1, 1, 1, 1, // svc id + 2, 2, 2, 2, 2, 2 // mac + ], + section_builder.into_section().as_slice() + ); +} + +#[test] +fn serialize_connectivity_info_de_mdns() { + let mut adv_builder = AdvBuilder::new(); + let mut section_builder = adv_builder.section_builder(PublicIdentity::default()).unwrap(); + + section_builder.add_de(|_| ConnectivityInfoDataElement::mdns([1; 4], 2)).unwrap(); + + assert_eq!( + &[ + 9, // section header + 0x03, // public identity + 0x86, 0x11, // len 11 type 0x11 + 2, // connectivity type + 1, 1, 1, 1, // svc id + 2 // port + ], + section_builder.into_section().as_slice() + ); +} + +#[test] +fn serialize_connectivity_info_de_wifi_direct() { + let mut adv_builder = AdvBuilder::new(); + let mut section_builder = adv_builder.section_builder(PublicIdentity::default()).unwrap(); + + section_builder + .add_de(|_| ConnectivityInfoDataElement::wifi_direct([1; 10], [2; 10], [3; 2], 4)) + .unwrap(); + + assert_eq!( + &[ + 27, // section header + 0x03, // public identity + 0x98, 0x11, // len 24 type 0x11 + 3, // connectivity type + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // ssid + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, // password + 3, 3, // freq + 4 // port + ], + section_builder.into_section().as_slice() + ); +} + +#[test] +fn serialize_connectivity_capabilities_de_wifi_direct() { + let mut adv_builder = AdvBuilder::new(); + let mut section_builder = adv_builder.section_builder(PublicIdentity::default()).unwrap(); + + section_builder + .add_de(|_| ConnectivityCapabilityDataElement::wifi_direct([1; 3], [2; 3])) + .unwrap(); + + assert_eq!( + &[ + 10, // section header + 0x03, // public identity + 0x87, 0x12, // len 7 type 0x12 + 2, // connectivity type + 1, 1, 1, // supported + 2, 2, 2, // connected + ], + section_builder.into_section().as_slice() + ); +}
diff --git a/nearby/presence/np_adv/src/extended/de_type.rs b/nearby/presence/np_adv/src/extended/de_type.rs new file mode 100644 index 0000000..105d15e --- /dev/null +++ b/nearby/presence/np_adv/src/extended/de_type.rs
@@ -0,0 +1,143 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! V1 DE type types +use crate::de_type::{EncryptedIdentityDataElementType, IdentityDataElementType}; + +/// Data element types for extended advertisements +#[derive(Debug, PartialEq, Eq, Clone, Copy, Hash)] +pub struct DeType { + // 4 billion type codes should be enough for anybody + code: u32, +} + +impl DeType { + /// A `const` equivalent to `From<u32>` since trait methods can't yet be const. + pub(crate) const fn const_from(value: u32) -> Self { + Self { code: value } + } + + /// Returns the type as a u32 + pub fn as_u32(&self) -> u32 { + self.code + } +} + +impl From<u8> for DeType { + fn from(value: u8) -> Self { + DeType { code: value as u32 } + } +} + +impl From<u32> for DeType { + fn from(value: u32) -> Self { + DeType { code: value } + } +} + +pub(crate) trait ExtendedDataElementType: Sized { + /// A type code for use in the DE header. + fn type_code(&self) -> DeType; + /// Returns the matching type for the code, else `None` + fn from_type_code(de_type: DeType) -> Option<Self>; +} + +impl ExtendedDataElementType for IdentityDataElementType { + fn type_code(&self) -> DeType { + DeType::from(self.shared_type_code()) + } + + fn from_type_code(de_type: DeType) -> Option<Self> { + de_type.code.try_into().ok().and_then(Self::from_shared_type_code) + } +} + +impl ExtendedDataElementType for EncryptedIdentityDataElementType { + fn type_code(&self) -> DeType { + DeType::from(self.as_identity_data_element_type().shared_type_code()) + } + + fn from_type_code(code: DeType) -> Option<Self> { + IdentityDataElementType::from_type_code(code) + .and_then(|idet| idet.as_encrypted_identity_de_type()) + } +} + +#[cfg(test)] +mod tests { + extern crate std; + + use super::*; + use std::{collections, fmt}; + + #[test] + fn identity_type_codes_are_consistent() { + de_type_codes_are_consistent::<IdentityDataElementType>() + } + + #[test] + fn encrypted_identity_type_codes_are_consistent() { + de_type_codes_are_consistent::<EncryptedIdentityDataElementType>() + } + + #[test] + fn identity_type_codes_are_distinct() { + de_distinct_type_codes::<IdentityDataElementType>() + } + + #[test] + fn encrypted_identity_type_codes_are_distinct() { + de_distinct_type_codes::<EncryptedIdentityDataElementType>() + } + + #[test] + fn identity_no_accidentally_mapped_type_codes() { + de_no_accidentally_mapped_type_codes::<IdentityDataElementType>() + } + + #[test] + fn encrypted_identity_no_accidentally_mapped_type_codes() { + de_no_accidentally_mapped_type_codes::<EncryptedIdentityDataElementType>() + } + + fn de_type_codes_are_consistent< + D: PartialEq + fmt::Debug + ExtendedDataElementType + strum::IntoEnumIterator, + >() { + for det in D::iter() { + let actual = D::from_type_code(det.type_code()); + assert_eq!(Some(det), actual) + } + } + + fn de_distinct_type_codes< + D: PartialEq + fmt::Debug + ExtendedDataElementType + strum::IntoEnumIterator, + >() { + let codes = D::iter().map(|det| det.type_code()).collect::<collections::HashSet<_>>(); + assert_eq!(codes.len(), D::iter().count()); + } + + fn de_no_accidentally_mapped_type_codes< + D: PartialEq + fmt::Debug + ExtendedDataElementType + strum::IntoEnumIterator, + >() { + let codes = D::iter().map(|det| det.type_code()).collect::<collections::HashSet<_>>(); + // not going to try all 4 billion possibilities, but we can make an effort + for possible_code in 0_u32..100_000 { + if codes.contains(&possible_code.into()) { + continue; + } + + assert_eq!(None, D::from_type_code(possible_code.into())); + } + } +}
diff --git a/nearby/presence/np_adv/src/extended/deserialize/encrypted_section/mic_decrypt_tests.rs b/nearby/presence/np_adv/src/extended/deserialize/encrypted_section/mic_decrypt_tests.rs new file mode 100644 index 0000000..d112ead --- /dev/null +++ b/nearby/presence/np_adv/src/extended/deserialize/encrypted_section/mic_decrypt_tests.rs
@@ -0,0 +1,426 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +extern crate std; + +use super::*; +use crate::extended::data_elements::TxPowerDataElement; +use crate::extended::serialize::{SingleTypeDataElement, WriteDataElement}; +use crate::shared_data::TxPower; +use crate::{ + credential::{simple::SimpleV1Credential, v1::MinimumFootprintV1CryptoMaterial}, + de_type::EncryptedIdentityDataElementType, + extended::{ + deserialize::{ + encrypted_section::MicEncryptedSectionDeserializationError, + parse_sections, + test_stubs::{HkdfCryptoMaterial, IntermediateSectionExt}, + CiphertextSection, OffsetDataElement, RawV1Salt, + }, + serialize::{AdvBuilder, CapacityLimitedVec, MicEncrypted}, + }, + parse_adv_header, AdvHeader, Section, +}; +use crypto_provider_default::CryptoProviderImpl; +use np_hkdf::v1_salt::DataElementOffset; +use sink::Sink; +use std::{prelude::rust_2021::*, vec}; + +#[test] +fn deserialize_mic_encrypted_correct_keys() { + let metadata_key = [1; 16]; + let key_seed = [2; 32]; + let raw_salt = RawV1Salt([3; 16]); + let section_salt = V1Salt::<CryptoProviderImpl>::from(raw_salt); + let identity_type = EncryptedIdentityDataElementType::Private; + let key_seed_hkdf = np_hkdf::NpKeySeedHkdf::<CryptoProviderImpl>::new(&key_seed); + let mut adv_builder = AdvBuilder::new(); + + let mut section_builder = adv_builder + .section_builder(MicEncrypted::new_for_testing( + identity_type, + V1Salt::from(*section_salt.as_array_ref()), + &metadata_key, + &key_seed_hkdf, + )) + .unwrap(); + + let txpower_de = TxPowerDataElement::from(TxPower::try_from(5).unwrap()); + section_builder.add_de(|_| txpower_de.clone()).unwrap(); + section_builder.add_to_advertisement(); + + let adv = adv_builder.into_advertisement(); + + let (remaining, header) = parse_adv_header(adv.as_slice()).unwrap(); + + let adv_header = if let AdvHeader::V1(h) = header { + h + } else { + panic!("incorrect header"); + }; + + let sections = parse_sections(&adv_header, remaining).unwrap(); + assert_eq!(1, sections.len()); + + let section = sections.into_iter().next().unwrap(); + let enc_section = section.as_ciphertext().unwrap(); + let keypair = np_ed25519::KeyPair::<CryptoProviderImpl>::generate(); + + // deserializing to Section works + let credential = SimpleV1Credential::new( + MinimumFootprintV1CryptoMaterial::new::<CryptoProviderImpl>( + key_seed, + key_seed_hkdf.extended_unsigned_metadata_key_hmac_key().calculate_hmac(&metadata_key), + key_seed_hkdf.extended_signed_metadata_key_hmac_key().calculate_hmac(&metadata_key), + keypair.public(), + ), + (), + ); + let section = enc_section.try_deserialize::<_, CryptoProviderImpl>(&credential).unwrap(); + + assert_eq!( + DecryptedSection::new( + EncryptedIdentityDataElementType::Private, + VerificationMode::Mic, + metadata_key, + raw_salt, + SectionContents { + section_header: 19 // encryption info de + + 2 // de header + + 16 // metadata key + + 2 // de contents + + 16, // mic hmac tag + // battery DE + de_data: ArrayView::try_from_slice(&[5]).unwrap(), + data_elements: vec![OffsetDataElement { + offset: 2.into(), + de_type: 0x05_u8.into(), + start_of_contents: 0, + contents_len: 1 + }] + } + ), + section + ); + + assert_eq!( + vec![(DataElementOffset::from(2_usize), TxPowerDataElement::DE_TYPE, vec![5_u8])], + section + .data_elements() + .map(|de| (de.offset(), de.de_type(), de.contents().to_vec())) + .collect::<Vec<_>>() + ); + + let contents = if let CiphertextSection::MicEncryptedIdentity(contents) = &enc_section { + contents + } else { + panic!("incorrect flavor"); + }; + + let mut encryption_info_bytes = [0_u8; 19]; + encryption_info_bytes[0..2].copy_from_slice(&[0x91, 0x10]); + encryption_info_bytes[2] = 0x00; + encryption_info_bytes[3..].copy_from_slice(section_salt.as_slice()); + + let ciphertext_end = adv.as_slice().len() - 16; + assert_eq!( + &MicEncryptedSection { + section_header: 19 // encryption info de + + 2 // de header + + 16 // metadata key + + 2 // de contents + + 16, // mic hmac tag + adv_header: &adv_header, + encryption_info: EncryptionInfo { bytes: encryption_info_bytes }, + identity: EncryptedIdentityMetadata { + header_bytes: [0x90, 0x1], + offset: 1.into(), + identity_type: EncryptedIdentityDataElementType::Private, + }, + all_ciphertext: &adv.as_slice()[1 + 1 + 19 + 2..ciphertext_end], + mic: SectionMic { mic: adv.as_slice()[ciphertext_end..].try_into().unwrap() } + }, + contents + ); + + // plaintext is correct + { + let crypto_material = MinimumFootprintV1CryptoMaterial::new::<CryptoProviderImpl>( + key_seed, + key_seed_hkdf.extended_unsigned_metadata_key_hmac_key().calculate_hmac(&metadata_key), + key_seed_hkdf.extended_signed_metadata_key_hmac_key().calculate_hmac(&metadata_key), + keypair.public(), + ); + let identity_resolution_material = + crypto_material.unsigned_identity_resolution_material::<CryptoProviderImpl>(); + let verification_material = + crypto_material.unsigned_verification_material::<CryptoProviderImpl>(); + + let decrypted = contents + .try_decrypt::<CryptoProviderImpl>( + &identity_resolution_material, + &verification_material, + ) + .unwrap(); + + let mut expected = metadata_key.as_slice().to_vec(); + // battery de + expected.extend_from_slice(txpower_de.clone().de_header().serialize().as_slice()); + txpower_de.write_de_contents(&mut expected); + + assert_eq!(&expected, decrypted.as_slice()); + } +} + +#[test] +fn deserialize_mic_encrypted_incorrect_aes_key_error() { + // bad aes key -> bad metadata key plaintext + do_bad_deserialize_params::<CryptoProviderImpl>( + MicEncryptedSectionDeserializationError::MetadataKeyMacMismatch, + Some([0xFF; 16].into()), + None, + None, + None, + ); +} + +#[test] +fn deserialize_mic_encrypted_incorrect_metadata_key_hmac_key_error() { + // bad metadata key hmac key -> bad calculated metadata key mac + do_bad_deserialize_params::<CryptoProviderImpl>( + MicEncryptedSectionDeserializationError::MetadataKeyMacMismatch, + None, + Some([0xFF; 32].into()), + None, + None, + ); +} + +#[test] +fn deserialize_mic_encrypted_incorrect_mic_hmac_key_error() { + // bad mic hmac key -> bad calculated mic + do_bad_deserialize_params::<CryptoProviderImpl>( + MicEncryptedSectionDeserializationError::MicMismatch, + None, + None, + Some([0xFF; 32].into()), + None, + ); +} + +#[test] +fn deserialize_mic_encrypted_incorrect_expected_metadata_key_hmac_error() { + // bad expected metadata key mac + do_bad_deserialize_params::<CryptoProviderImpl>( + MicEncryptedSectionDeserializationError::MetadataKeyMacMismatch, + None, + None, + None, + Some([0xFF; 32]), + ); +} + +#[test] +fn deserialize_mic_encrypted_incorrect_salt_error() { + // bad salt -> bad iv -> bad metadata key plaintext + do_bad_deserialize_tampered( + MicEncryptedSectionDeserializationError::MetadataKeyMacMismatch, + |_| {}, + |adv| adv[23..39].copy_from_slice(&[0xFF; 16]), + ); +} + +#[test] +fn deserialize_mic_encrypted_de_that_wont_parse() { + // add an extra byte to the section, leading it to try to parse a DE that doesn't exist + do_bad_deserialize_tampered( + MicEncryptedSectionDeserializationError::DeParseError, + |sec| sec.try_push(0xFF).unwrap(), + |_| {}, + ); +} + +#[test] +fn deserialize_mic_encrypted_tampered_mic_error() { + // flip the a bit in the first MIC byte + do_bad_deserialize_tampered( + MicEncryptedSectionDeserializationError::MicMismatch, + |_| {}, + |adv| { + let mic_start = adv.len() - 16; + adv[mic_start] ^= 0x01 + }, + ); +} + +#[test] +fn deserialize_mic_encrypted_tampered_payload_error() { + // flip the last payload bit + do_bad_deserialize_tampered( + MicEncryptedSectionDeserializationError::MicMismatch, + |_| {}, + |adv| *adv.last_mut().unwrap() ^= 0x01, + ); +} + +/// Attempt a decryption that will fail when using the provided parameters for decryption only. +/// `None` means use the correct value for that parameter. +fn do_bad_deserialize_params<C: CryptoProvider>( + error: MicEncryptedSectionDeserializationError, + aes_key: Option<crypto_provider::aes::Aes128Key>, + metadata_key_hmac_key: Option<np_hkdf::NpHmacSha256Key<C>>, + mic_hmac_key: Option<np_hkdf::NpHmacSha256Key<C>>, + expected_metadata_key_hmac: Option<[u8; 32]>, +) { + let metadata_key = [1; 16]; + let key_seed = [2; 32]; + let section_salt: V1Salt<C> = [3; 16].into(); + let identity_type = EncryptedIdentityDataElementType::Private; + let key_seed_hkdf = np_hkdf::NpKeySeedHkdf::new(&key_seed); + + let mut adv_builder = AdvBuilder::new(); + + let mut section_builder = adv_builder + .section_builder(MicEncrypted::new_for_testing( + identity_type, + section_salt, + &metadata_key, + &key_seed_hkdf, + )) + .unwrap(); + + section_builder.add_de(|_| TxPowerDataElement::from(TxPower::try_from(7).unwrap())).unwrap(); + + section_builder.add_to_advertisement(); + + let adv = adv_builder.into_advertisement(); + + let (remaining, header) = parse_adv_header(adv.as_slice()).unwrap(); + + let v1_header = if let AdvHeader::V1(h) = header { + h + } else { + panic!("incorrect header"); + }; + + let sections = parse_sections(&v1_header, remaining).unwrap(); + assert_eq!(1, sections.len()); + + let section = sections.into_iter().next().unwrap(); + let enc_section = section.as_ciphertext().unwrap(); + let contents = if let CiphertextSection::MicEncryptedIdentity(contents) = &enc_section { + contents + } else { + panic!("incorrect flavor"); + }; + + let unsigned_identity_resolution_material = SectionIdentityResolutionMaterial { + aes_key: aes_key.unwrap_or_else(|| np_hkdf::UnsignedSectionKeys::aes_key(&key_seed_hkdf)), + metadata_key_hmac_key: *metadata_key_hmac_key + .unwrap_or_else(|| key_seed_hkdf.extended_unsigned_metadata_key_hmac_key()) + .as_bytes(), + expected_metadata_key_hmac: expected_metadata_key_hmac.unwrap_or_else(|| { + key_seed_hkdf.extended_unsigned_metadata_key_hmac_key().calculate_hmac(&metadata_key) + }), + }; + let identity_resolution_material = + UnsignedSectionIdentityResolutionMaterial::from_raw(unsigned_identity_resolution_material); + + let verification_material = UnsignedSectionVerificationMaterial { + mic_hmac_key: *mic_hmac_key + .unwrap_or_else(|| np_hkdf::UnsignedSectionKeys::hmac_key(&key_seed_hkdf)) + .as_bytes(), + }; + + assert_eq!( + error, + contents + .try_deserialize::<C>(&identity_resolution_material, &verification_material) + .unwrap_err() + ); +} + +fn do_bad_deserialize_tampered< + S: Fn(&mut CapacityLimitedVec<u8, NP_ADV_MAX_SECTION_LEN>), + A: Fn(&mut Vec<u8>), +>( + expected_error: MicEncryptedSectionDeserializationError, + mangle_section: S, + mangle_adv: A, +) { + let metadata_key = [1; 16]; + let key_seed = [2; 32]; + let section_salt: V1Salt<CryptoProviderImpl> = [3; 16].into(); + let identity_type = EncryptedIdentityDataElementType::Private; + let key_seed_hkdf = np_hkdf::NpKeySeedHkdf::new(&key_seed); + + let mut adv_builder = AdvBuilder::new(); + + let mut section_builder = adv_builder + .section_builder(MicEncrypted::new_for_testing( + identity_type, + section_salt, + &metadata_key, + &key_seed_hkdf, + )) + .unwrap(); + + section_builder.add_de(|_| TxPowerDataElement::from(TxPower::try_from(7).unwrap())).unwrap(); + + mangle_section(&mut section_builder.section); + + section_builder.add_to_advertisement(); + + let adv = adv_builder.into_advertisement(); + let mut adv_mut = adv.as_slice().to_vec(); + mangle_adv(&mut adv_mut); + + let (remaining, header) = parse_adv_header(&adv_mut).unwrap(); + + let v1_header = if let AdvHeader::V1(h) = header { + h + } else { + panic!("incorrect header"); + }; + + let sections = parse_sections(&v1_header, remaining).unwrap(); + assert_eq!(1, sections.len()); + + let section = sections.into_iter().next().unwrap(); + let enc_section = section.as_ciphertext().unwrap(); + let contents = if let CiphertextSection::MicEncryptedIdentity(contents) = &enc_section { + contents + } else { + panic!("incorrect flavor"); + }; + + // generate a random key pair since we need _some_ public key + let key_pair = np_ed25519::KeyPair::<CryptoProviderImpl>::generate(); + + let crypto_material = HkdfCryptoMaterial::new(&key_seed, &metadata_key, key_pair.public()); + let identity_resolution_material = + crypto_material.unsigned_identity_resolution_material::<CryptoProviderImpl>(); + let verification_material = + crypto_material.unsigned_verification_material::<CryptoProviderImpl>(); + + assert_eq!( + expected_error, + contents + .try_deserialize::<CryptoProviderImpl>( + &identity_resolution_material, + &verification_material, + ) + .unwrap_err() + ); +}
diff --git a/nearby/presence/np_adv/src/extended/deserialize/encrypted_section/mod.rs b/nearby/presence/np_adv/src/extended/deserialize/encrypted_section/mod.rs new file mode 100644 index 0000000..ad305f5 --- /dev/null +++ b/nearby/presence/np_adv/src/extended/deserialize/encrypted_section/mod.rs
@@ -0,0 +1,293 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +use crate::{ + credential::v1::*, + extended::{ + deserialize::{ + parse_non_identity_des, DecryptedSection, EncryptedIdentityMetadata, EncryptionInfo, + SectionContents, SectionMic, VerificationMode, + }, + section_signature_payload::*, + to_array_view, METADATA_KEY_LEN, NP_ADV_MAX_SECTION_LEN, + }, + V1Header, NP_SVC_UUID, +}; +use array_view::ArrayView; +use crypto_provider::{ + aes::ctr::{AesCtr, AesCtrNonce, NonceAndCounter, AES_CTR_NONCE_LEN}, + hmac::Hmac, + CryptoProvider, +}; +use np_hkdf::v1_salt::V1Salt; + +#[cfg(test)] +mod mic_decrypt_tests; +#[cfg(test)] +mod signature_decrypt_tests; + +#[derive(PartialEq, Eq, Debug)] +pub(crate) struct SignatureEncryptedSection<'a> { + pub(crate) section_header: u8, + pub(crate) adv_header: &'a V1Header, + pub(crate) encryption_info: EncryptionInfo, + pub(crate) identity: EncryptedIdentityMetadata, + /// All ciphertext (Contents of identity DE + all DEs) + /// Length must be in `[METADATA_KEY_LEN, NP_ADV_MAX_SECTION_LEN]`. + pub(crate) all_ciphertext: &'a [u8], +} + +impl<'a> SignatureEncryptedSection<'a> { + /// Decrypt the ciphertext and check that the first [METADATA_KEY_LEN] bytes match the expected HMAC. + /// The remaining data is not verified. + /// + /// Returns `Ok` if the section was an identity match. + /// Otherwise, returns `Err`. + pub(crate) fn try_decrypt<P: CryptoProvider>( + &self, + identity_resolution_material: &SignedSectionIdentityResolutionMaterial, + ) -> Result<ArrayView<u8, NP_ADV_MAX_SECTION_LEN>, SignatureEncryptedSectionDeserializationError> + { + let salt: V1Salt<P> = self.encryption_info.salt().into(); + let (mut buf, mut cipher) = try_decrypt_metadata_key_prefix::<P>( + self.all_ciphertext, + salt.derive(Some(self.identity.offset)).expect("AES-CTR nonce is a valid HKDF size"), + identity_resolution_material.as_raw_resolution_material(), + ) + .ok_or(SignatureEncryptedSectionDeserializationError::MetadataKeyMacMismatch)?; + + // decrypt everything else + cipher.decrypt(&mut buf[METADATA_KEY_LEN..]); + + Ok(to_array_view(buf)) + } + + /// Try deserializing into a [Section]. + /// + /// Returns an error if the credential is incorrect or if the section data is malformed. + pub(crate) fn try_deserialize<P>( + &self, + identity_resolution_material: &SignedSectionIdentityResolutionMaterial, + verification_material: &SignedSectionVerificationMaterial, + ) -> Result<DecryptedSection, SignatureEncryptedSectionDeserializationError> + where + P: CryptoProvider, + { + let raw_salt = self.encryption_info.salt(); + let salt: V1Salt<P> = raw_salt.into(); + let plaintext = self.try_decrypt::<P>(identity_resolution_material)?; + + // won't panic: plaintext length is at least METADATA_KEY_LEN + let (metadata_key, remaining) = plaintext.as_slice().split_at(METADATA_KEY_LEN); + let metadata_key = + metadata_key.try_into().expect("slice is the same length as the desired array"); + + if remaining.len() < crypto_provider::ed25519::SIGNATURE_LENGTH { + return Err(SignatureEncryptedSectionDeserializationError::SignatureMissing); + } + + // should not panic due to above check + let (non_identity_des, sig) = + remaining.split_at(remaining.len() - crypto_provider::ed25519::SIGNATURE_LENGTH); + + // de offset 2 because of leading encryption info and identity DEs + let (_, ref_des) = parse_non_identity_des(2)(non_identity_des) + .map_err(|_| SignatureEncryptedSectionDeserializationError::DeParseError)?; + + // All implementations only check for 64 bytes, and this will always result in a 64 byte signature. + let expected_signature = + np_ed25519::Signature::<P>::try_from(sig).expect("Signature is always 64 bytes."); + + let nonce = salt + .derive::<{ AES_CTR_NONCE_LEN }>(Some(self.identity.offset)) + .expect("AES-CTR nonce is a valid HKDF length"); + + // all other plaintext, except for the signature. + // Won't panic because we know we just parsed the sig de from this, + // and we're using the as-parsed lengths + let remainder = &plaintext.as_slice()[..plaintext.len() - sig.len()]; + + let section_signature_payload = SectionSignaturePayload::from_deserialized_parts( + self.adv_header.header_byte, + self.section_header, + &self.encryption_info.bytes, + &nonce, + self.identity.header_bytes, + remainder, + ); + + let public_key = verification_material.signature_verification_public_key(); + + section_signature_payload.verify(&expected_signature, &public_key).map_err(|e| { + // Length of the payload should fit in the signature verification buffer. + debug_assert!(e != np_ed25519::SignatureVerificationError::PayloadTooBig); + + SignatureEncryptedSectionDeserializationError::SignatureMismatch + })?; + + Ok(DecryptedSection::new( + self.identity.identity_type, + VerificationMode::Signature, + metadata_key, + raw_salt, + SectionContents::new(self.section_header, &ref_des), + )) + } +} + +/// Should not be exposed publicly as it's too detailed. +#[derive(Debug, PartialEq, Eq)] +pub(crate) enum SignatureEncryptedSectionDeserializationError { + /// The decrypted metadata key did not have the right MAC + MetadataKeyMacMismatch, + /// The provided signature did not match the calculated signature + SignatureMismatch, + /// The provided signature is missing + SignatureMissing, + /// Decrypted DEs could not be parsed, possibly because the ciphertext was tampered with, as + /// DE parsing has to be done before the signature is verified + DeParseError, +} + +#[derive(PartialEq, Eq, Debug)] +pub(crate) struct MicEncryptedSection<'a> { + pub(crate) section_header: u8, + pub(crate) adv_header: &'a V1Header, + pub(crate) encryption_info: EncryptionInfo, + pub(crate) mic: SectionMic, + pub(crate) identity: EncryptedIdentityMetadata, + /// All ciphertext (Contents of identity DE + all DEs). + /// Length must be in `[METADATA_KEY_LEN, NP_ADV_MAX_SECTION_LEN]`. + pub(crate) all_ciphertext: &'a [u8], +} + +impl<'a> MicEncryptedSection<'a> { + /// Attempt to decrypt and verify the encrypted portion of the section with the provided + /// precalculated cryptographic material for an MIC-encrypted section. + /// + /// If successful, returns a buffer containing the decrypted plaintext. + pub(crate) fn try_decrypt<P: CryptoProvider>( + &self, + identity_resolution_material: &UnsignedSectionIdentityResolutionMaterial, + verification_material: &UnsignedSectionVerificationMaterial, + ) -> Result<ArrayView<u8, NP_ADV_MAX_SECTION_LEN>, MicEncryptedSectionDeserializationError> + { + let salt: V1Salt<P> = self.encryption_info.salt().into(); + let nonce = + salt.derive(Some(self.identity.offset)).expect("AES-CTR nonce is a valid HKDF size"); + + let (mut buf, mut cipher) = try_decrypt_metadata_key_prefix::<P>( + self.all_ciphertext, + nonce, + identity_resolution_material.as_raw_resolution_material(), + ) + .ok_or(MicEncryptedSectionDeserializationError::MetadataKeyMacMismatch)?; + + // if mic is ok, the section was generated by someone holding at least the shared credential + let mut mic_hmac = verification_material.mic_hmac_key::<P>().build_hmac(); + mic_hmac.update(&NP_SVC_UUID); + mic_hmac.update(&[self.adv_header.header_byte]); + mic_hmac.update(&[self.section_header]); + mic_hmac.update(&self.encryption_info.bytes); + mic_hmac.update(&nonce); + mic_hmac.update(&self.identity.header_bytes); + mic_hmac.update(self.all_ciphertext); + mic_hmac + // adv only contains first 16 bytes of HMAC + .verify_truncated_left(&self.mic.mic) + .map_err(|_e| MicEncryptedSectionDeserializationError::MicMismatch)?; + + // decrypt everything else + cipher.decrypt(&mut buf[METADATA_KEY_LEN..]); + + Ok(to_array_view(buf)) + } + + /// Try deserializing into a [Section]. + /// + /// Returns an error if the credential is incorrect or if the section data is malformed. + pub(crate) fn try_deserialize<P>( + &self, + identity_resolution_material: &UnsignedSectionIdentityResolutionMaterial, + verification_material: &UnsignedSectionVerificationMaterial, + ) -> Result<DecryptedSection, MicEncryptedSectionDeserializationError> + where + P: CryptoProvider, + { + let plaintext = + self.try_decrypt::<P>(identity_resolution_material, verification_material)?; + // won't panic: plaintext is at least METADATA_KEY_LEN long + let (metadata_key, remaining_des) = plaintext.as_slice().split_at(METADATA_KEY_LEN); + let metadata_key = + metadata_key.try_into().expect("slice is the same length as the desired array"); + // offset 2 for encryption info and identity DEs + let (_, ref_des) = parse_non_identity_des(2)(remaining_des) + .map_err(|_| MicEncryptedSectionDeserializationError::DeParseError)?; + + Ok(DecryptedSection::new( + self.identity.identity_type, + VerificationMode::Mic, + metadata_key, + self.encryption_info.salt(), + SectionContents::new(self.section_header, &ref_des), + )) + } +} + +/// Should not be exposed publicly as it's too detailed. +#[derive(Debug, PartialEq, Eq)] +pub(crate) enum MicEncryptedSectionDeserializationError { + /// Plaintext metadata key did not have the expected MAC + MetadataKeyMacMismatch, + /// Calculated MIC did not match MIC from section + MicMismatch, + /// Parsing of decrypted DEs failed + DeParseError, +} + +/// Decrypt a ciphertext buffer whose first [METADATA_KEY_LEN] bytes of plaintext are, maybe, the +/// metadata key for an NP identity. +/// +/// Returns `Some` if decrypting the first [METADATA_KEY_LEN] bytes produces plaintext whose HMAC +/// matches the expected MAC. Only the first [METADATA_KEY_LEN] bytes are decrypted. The cipher is +/// returned along with the buffer as it is in the appropriate state to continue decrypting the +/// remaining ciphertext. +/// +/// Returns `None` if the plaintext does not match the expected HMAC. +/// +/// # Panics +/// +/// Panics if `ciphertext`'s length is not in `[METADATA_KEY_LEN, NP_ADV_MAX_SECTION_LEN]`. +#[allow(clippy::type_complexity)] +fn try_decrypt_metadata_key_prefix<C: CryptoProvider>( + ciphertext: &[u8], + nonce: AesCtrNonce, + identity_resolution_material: &SectionIdentityResolutionMaterial, +) -> Option<(tinyvec::ArrayVec<[u8; NP_ADV_MAX_SECTION_LEN]>, C::AesCtr128)> { + assert!(ciphertext.len() <= NP_ADV_MAX_SECTION_LEN); + let mut decrypt_buf = tinyvec::ArrayVec::<[u8; NP_ADV_MAX_SECTION_LEN]>::new(); + let aes_key = &identity_resolution_material.aes_key; + let mut cipher = C::AesCtr128::new(aes_key, NonceAndCounter::from_nonce(nonce)); + + decrypt_buf.extend_from_slice(ciphertext); + cipher.decrypt(&mut decrypt_buf[..METADATA_KEY_LEN]); + + let metadata_key_hmac_key: np_hkdf::NpHmacSha256Key<C> = + identity_resolution_material.metadata_key_hmac_key.into(); + let expected_metadata_key_hmac = identity_resolution_material.expected_metadata_key_hmac; + metadata_key_hmac_key + .verify_hmac(&decrypt_buf[..METADATA_KEY_LEN], expected_metadata_key_hmac) + .ok() + .map(|_| (decrypt_buf, cipher)) +}
diff --git a/nearby/presence/np_adv/src/extended/deserialize/encrypted_section/signature_decrypt_tests.rs b/nearby/presence/np_adv/src/extended/deserialize/encrypted_section/signature_decrypt_tests.rs new file mode 100644 index 0000000..b78cad9 --- /dev/null +++ b/nearby/presence/np_adv/src/extended/deserialize/encrypted_section/signature_decrypt_tests.rs
@@ -0,0 +1,512 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +extern crate std; + +use crate::extended::data_elements::TxPowerDataElement; +use crate::extended::deserialize::{DecryptedSection, EncryptionInfo, RawV1Salt}; +use crate::shared_data::TxPower; +use crate::{ + credential::v1::*, + de_type::EncryptedIdentityDataElementType, + extended::{ + deserialize::{ + encrypted_section::{ + SignatureEncryptedSection, SignatureEncryptedSectionDeserializationError, + }, + parse_sections, + test_stubs::IntermediateSectionExt, + CiphertextSection, EncryptedIdentityMetadata, OffsetDataElement, SectionContents, + VerificationMode, + }, + section_signature_payload::*, + serialize::{ + AdvBuilder, CapacityLimitedVec, SignedEncrypted, SingleTypeDataElement, + WriteDataElement, + }, + NP_ADV_MAX_SECTION_LEN, + }, + parse_adv_header, AdvHeader, Section, +}; +use array_view::ArrayView; +use crypto_provider::{aes::ctr::AesCtrNonce, CryptoProvider}; +use crypto_provider_default::CryptoProviderImpl; +use np_hkdf::v1_salt; +use np_hkdf::v1_salt::V1Salt; +use sink::Sink; +use std::{prelude::rust_2021::*, vec}; + +type KeyPair = np_ed25519::KeyPair<CryptoProviderImpl>; + +#[test] +fn deserialize_signature_encrypted_correct_keys() { + let metadata_key = [1; 16]; + let key_seed = [2; 32]; + let raw_salt = RawV1Salt([3; 16]); + let section_salt = V1Salt::<CryptoProviderImpl>::from(raw_salt); + let identity_type = EncryptedIdentityDataElementType::Private; + let key_seed_hkdf = np_hkdf::NpKeySeedHkdf::<CryptoProviderImpl>::new(&key_seed); + let key_pair = KeyPair::generate(); + + let mut adv_builder = AdvBuilder::new(); + + let mut section_builder = adv_builder + .section_builder(SignedEncrypted::new( + identity_type, + V1Salt::from(*section_salt.as_array_ref()), + &metadata_key, + &key_pair, + &key_seed_hkdf, + )) + .unwrap(); + + let txpower_de = TxPowerDataElement::from(TxPower::try_from(7).unwrap()); + section_builder.add_de(|_| txpower_de.clone()).unwrap(); + + section_builder.add_to_advertisement(); + + let adv = adv_builder.into_advertisement(); + + let (remaining, header) = parse_adv_header(adv.as_slice()).unwrap(); + + let adv_header = if let AdvHeader::V1(h) = header { + h + } else { + panic!("incorrect header"); + }; + + let sections = parse_sections(&adv_header, remaining).unwrap(); + assert_eq!(1, sections.len()); + + let section = sections.into_iter().next().unwrap(); + let enc_section = section.as_ciphertext().unwrap(); + let contents = if let CiphertextSection::SignatureEncryptedIdentity(contents) = &enc_section { + contents + } else { + panic!("incorrect flavor"); + }; + + let mut encryption_info_bytes = [0_u8; 19]; + encryption_info_bytes[0..2].copy_from_slice(&[0x91, 0x10]); + encryption_info_bytes[2] = 0x08; + encryption_info_bytes[3..].copy_from_slice(section_salt.as_slice()); + + let section_len = 19 + 2 + 16 + 2 + 64; + assert_eq!( + &SignatureEncryptedSection { + section_header: section_len, + adv_header: &adv_header, + encryption_info: EncryptionInfo { bytes: encryption_info_bytes }, + identity: EncryptedIdentityMetadata { + header_bytes: [0x90, 0x1], + offset: 1.into(), + identity_type: EncryptedIdentityDataElementType::Private, + }, + // adv header + salt + section header + encryption info + identity header + all_ciphertext: &adv.as_slice()[1 + 1 + 19 + 2..], + }, + contents + ); + + // plaintext is correct + { + let crypto_material = MinimumFootprintV1CryptoMaterial::new::<CryptoProviderImpl>( + key_seed, + key_seed_hkdf.extended_unsigned_metadata_key_hmac_key().calculate_hmac(&metadata_key), + key_seed_hkdf.extended_signed_metadata_key_hmac_key().calculate_hmac(&metadata_key), + key_pair.public(), + ); + let signed_identity_resolution_material = + crypto_material.signed_identity_resolution_material::<CryptoProviderImpl>(); + let decrypted = contents + .try_decrypt::<CryptoProviderImpl>(&signed_identity_resolution_material) + .unwrap(); + + let mut expected = metadata_key.as_slice().to_vec(); + // battery de + expected.extend_from_slice(txpower_de.de_header().serialize().as_slice()); + txpower_de.write_de_contents(&mut expected); + + let nonce: AesCtrNonce = section_salt.derive(Some(1.into())).unwrap(); + + let mut encryption_info = vec![0x91, 0x10, 0x08]; + encryption_info.extend_from_slice(section_salt.as_slice()); + let encryption_info: [u8; EncryptionInfo::TOTAL_DE_LEN] = + encryption_info.try_into().unwrap(); + + let sig_payload = SectionSignaturePayload::from_deserialized_parts( + 0x20, + section_len, + &encryption_info, + &nonce, + [0x90, 0x1], + &expected, + ); + + expected.extend_from_slice(&sig_payload.sign(&key_pair).to_bytes()); + + assert_eq!(&expected, decrypted.as_slice()); + } + + // deserialization to Section works + { + let crypto_material = MinimumFootprintV1CryptoMaterial::new::<CryptoProviderImpl>( + key_seed, + key_seed_hkdf.extended_unsigned_metadata_key_hmac_key().calculate_hmac(&metadata_key), + key_seed_hkdf.extended_signed_metadata_key_hmac_key().calculate_hmac(&metadata_key), + key_pair.public(), + ); + let signed_identity_resolution_material = + crypto_material.signed_identity_resolution_material::<CryptoProviderImpl>(); + let signed_verification_material = + crypto_material.signed_verification_material::<CryptoProviderImpl>(); + + let section = contents + .try_deserialize::<CryptoProviderImpl>( + &signed_identity_resolution_material, + &signed_verification_material, + ) + .unwrap(); + + assert_eq!( + DecryptedSection::new( + EncryptedIdentityDataElementType::Private, + VerificationMode::Signature, + metadata_key, + raw_salt, + SectionContents { + section_header: 19 + 2 + 16 + 1 + 1 + 64, + // battery DE + de_data: ArrayView::try_from_slice(&[7]).unwrap(), + data_elements: vec![OffsetDataElement { + offset: 2.into(), + de_type: 0x05_u8.into(), + start_of_contents: 0, + contents_len: 1, + }], + }, + ), + section + ); + + assert_eq!( + vec![( + v1_salt::DataElementOffset::from(2_usize), + TxPowerDataElement::DE_TYPE, + vec![7u8] + )], + section + .data_elements() + .map(|de| (de.offset(), de.de_type(), de.contents().to_vec())) + .collect::<Vec<_>>() + ); + } +} + +#[test] +fn deserialize_signature_encrypted_incorrect_aes_key_error() { + // bad aes key -> bad metadata key plaintext + do_bad_deserialize_params::<CryptoProviderImpl>( + SignatureEncryptedSectionDeserializationError::MetadataKeyMacMismatch, + Some([0xFF; 16].into()), + None, + None, + None, + ); +} + +#[test] +fn deserialize_signature_encrypted_incorrect_metadata_key_hmac_key_error() { + // bad metadata key hmac key -> bad calculated metadata key mac + do_bad_deserialize_params::<CryptoProviderImpl>( + SignatureEncryptedSectionDeserializationError::MetadataKeyMacMismatch, + None, + Some([0xFF; 32].into()), + None, + None, + ); +} + +#[test] +fn deserialize_signature_encrypted_incorrect_expected_metadata_key_hmac_error() { + // bad expected metadata key mac + do_bad_deserialize_params::<CryptoProviderImpl>( + SignatureEncryptedSectionDeserializationError::MetadataKeyMacMismatch, + None, + None, + Some([0xFF; 32]), + None, + ); +} + +#[test] +fn deserialize_signature_encrypted_incorrect_pub_key_error() { + // a random pub key will lead to signature mismatch + do_bad_deserialize_params::<CryptoProviderImpl>( + SignatureEncryptedSectionDeserializationError::SignatureMismatch, + None, + None, + None, + Some(KeyPair::generate().public()), + ); +} + +#[test] +fn deserialize_signature_encrypted_incorrect_salt_error() { + // bad salt -> bad iv -> bad metadata key plaintext + do_bad_deserialize_tampered( + SignatureEncryptedSectionDeserializationError::MetadataKeyMacMismatch, + None, + |_| {}, + |adv_mut| adv_mut[5..21].copy_from_slice(&[0xFF; 16]), + ) +} + +#[test] +fn deserialize_signature_encrypted_tampered_signature_error() { + do_bad_deserialize_tampered( + SignatureEncryptedSectionDeserializationError::SignatureMismatch, + None, + |_| {}, + // flip a bit in the middle of the signature + |adv_mut| { + let len = adv_mut.len(); + adv_mut[len - 30] ^= 0x1 + }, + ) +} + +#[test] +fn deserialize_signature_encrypted_tampered_ciphertext_error() { + do_bad_deserialize_tampered( + SignatureEncryptedSectionDeserializationError::SignatureMismatch, + None, + |_| {}, + // flip a bit outside of the signature + |adv_mut| { + let len = adv_mut.len(); + adv_mut[len - 1 - 64] ^= 0x1 + }, + ) +} + +#[test] +fn deserialize_signature_encrypted_missing_signature_de_error() { + let section_len = 19 + 2 + 16 + 1 + 1; + do_bad_deserialize_tampered( + SignatureEncryptedSectionDeserializationError::SignatureMissing, + Some(section_len), + |_| {}, + |adv_mut| { + // chop off signature DE + adv_mut.truncate(adv_mut.len() - 64); + // fix section length + adv_mut[1] = section_len; + }, + ) +} + +#[test] +fn deserialize_signature_encrypted_des_wont_parse() { + do_bad_deserialize_tampered( + SignatureEncryptedSectionDeserializationError::DeParseError, + Some(19 + 2 + 16 + 1 + 1 + 64 + 1), + // add an impossible DE + |section| section.try_push(0xFF).unwrap(), + |_| {}, + ) +} + +/// Attempt a deserialization that will fail when using the provided parameters for decryption only. +/// `None` means use the correct value for that parameter. +fn do_bad_deserialize_params<C: CryptoProvider>( + error: SignatureEncryptedSectionDeserializationError, + aes_key: Option<crypto_provider::aes::Aes128Key>, + metadata_key_hmac_key: Option<np_hkdf::NpHmacSha256Key<C>>, + expected_metadata_key_hmac: Option<[u8; 32]>, + pub_key: Option<np_ed25519::PublicKey<C>>, +) { + let metadata_key = [1; 16]; + let key_seed = [2; 32]; + let section_salt: v1_salt::V1Salt<C> = [3; 16].into(); + let identity_type = EncryptedIdentityDataElementType::Private; + let key_seed_hkdf = np_hkdf::NpKeySeedHkdf::new(&key_seed); + let key_pair = np_ed25519::KeyPair::<C>::generate(); + + let mut adv_builder = AdvBuilder::new(); + + let mut section_builder = adv_builder + .section_builder(SignedEncrypted::new( + identity_type, + section_salt, + &metadata_key, + &key_pair, + &key_seed_hkdf, + )) + .unwrap(); + + section_builder.add_de_res(|_| TxPower::try_from(2).map(TxPowerDataElement::from)).unwrap(); + + section_builder.add_to_advertisement(); + + let adv = adv_builder.into_advertisement(); + + let (remaining, header) = parse_adv_header(adv.as_slice()).unwrap(); + + let v1_header = if let AdvHeader::V1(h) = header { + h + } else { + panic!("incorrect header"); + }; + + let sections = parse_sections(&v1_header, remaining).unwrap(); + assert_eq!(1, sections.len()); + + let section = sections.into_iter().next().unwrap(); + let enc_section = section.as_ciphertext().unwrap(); + let contents = if let CiphertextSection::SignatureEncryptedIdentity(contents) = &enc_section { + contents + } else { + panic!("incorrect flavor"); + }; + + let signed_identity_resolution_material = + SignedSectionIdentityResolutionMaterial::from_raw(SectionIdentityResolutionMaterial { + aes_key: aes_key.unwrap_or_else(|| key_seed_hkdf.extended_signed_section_aes_key()), + + metadata_key_hmac_key: *metadata_key_hmac_key + .unwrap_or_else(|| key_seed_hkdf.extended_signed_metadata_key_hmac_key()) + .as_bytes(), + expected_metadata_key_hmac: expected_metadata_key_hmac.unwrap_or_else(|| { + key_seed_hkdf.extended_signed_metadata_key_hmac_key().calculate_hmac(&metadata_key) + }), + }); + + let signed_verification_material = SignedSectionVerificationMaterial { + pub_key: pub_key.unwrap_or_else(|| key_pair.public()).to_bytes(), + }; + + assert_eq!( + error, + contents + .try_deserialize::<C>( + &signed_identity_resolution_material, + &signed_verification_material, + ) + .unwrap_err() + ); +} + +/// Run a test that mangles the advertisement contents before attempting to deserialize. +/// +/// Since the advertisement is ciphertext, only changes outside +fn do_bad_deserialize_tampered< + A: Fn(&mut Vec<u8>), + S: Fn(&mut CapacityLimitedVec<u8, NP_ADV_MAX_SECTION_LEN>), +>( + expected_error: SignatureEncryptedSectionDeserializationError, + expected_section_len: Option<u8>, + mangle_section: S, + mangle_adv_contents: A, +) { + let metadata_key = [1; 16]; + let key_seed = [2; 32]; + let section_salt: v1_salt::V1Salt<CryptoProviderImpl> = [3; 16].into(); + let identity_type = EncryptedIdentityDataElementType::Private; + let key_seed_hkdf = np_hkdf::NpKeySeedHkdf::new(&key_seed); + let key_pair = KeyPair::generate(); + + let mut adv_builder = AdvBuilder::new(); + + let mut section_builder = adv_builder + .section_builder(SignedEncrypted::new( + identity_type, + section_salt, + &metadata_key, + &key_pair, + &key_seed_hkdf, + )) + .unwrap(); + + section_builder.add_de_res(|_| TxPower::try_from(2).map(TxPowerDataElement::from)).unwrap(); + + mangle_section(&mut section_builder.section); + + section_builder.add_to_advertisement(); + + let adv = adv_builder.into_advertisement(); + let mut adv_mut = adv.as_slice().to_vec(); + mangle_adv_contents(&mut adv_mut); + + let (remaining, header) = parse_adv_header(&adv_mut).unwrap(); + + let adv_header = if let AdvHeader::V1(h) = header { + h + } else { + panic!("incorrect header"); + }; + + let sections = parse_sections(&adv_header, remaining).unwrap(); + assert_eq!(1, sections.len()); + + let section = sections.into_iter().next().unwrap(); + let enc_section = section.as_ciphertext().unwrap(); + let contents = if let CiphertextSection::SignatureEncryptedIdentity(contents) = &enc_section { + contents + } else { + panic!("incorrect flavor"); + }; + + let mut encryption_info_bytes = [0_u8; 19]; + encryption_info_bytes[0..2].copy_from_slice(&[0x91, 0x10]); + encryption_info_bytes[2] = 0x08; + encryption_info_bytes[3..].copy_from_slice(&adv_mut[5..21]); + + let section_len = 19 + 2 + 16 + 2 + 64; + assert_eq!( + &SignatureEncryptedSection { + section_header: expected_section_len.unwrap_or(section_len), + adv_header: &adv_header, + encryption_info: EncryptionInfo { bytes: encryption_info_bytes }, + identity: EncryptedIdentityMetadata { + header_bytes: [0x90, 0x1], + offset: 1.into(), + identity_type: EncryptedIdentityDataElementType::Private, + }, + all_ciphertext: &adv_mut[1 + 1 + 19 + 2..], + }, + contents + ); + + let crypto_material = MinimumFootprintV1CryptoMaterial::new::<CryptoProviderImpl>( + key_seed, + key_seed_hkdf.extended_unsigned_metadata_key_hmac_key().calculate_hmac(&metadata_key), + key_seed_hkdf.extended_signed_metadata_key_hmac_key().calculate_hmac(&metadata_key), + key_pair.public(), + ); + let identity_resolution_material = + crypto_material.signed_identity_resolution_material::<CryptoProviderImpl>(); + let verification_material = + crypto_material.signed_verification_material::<CryptoProviderImpl>(); + + assert_eq!( + expected_error, + contents + .try_deserialize::<CryptoProviderImpl>( + &identity_resolution_material, + &verification_material, + ) + .unwrap_err() + ); +}
diff --git a/nearby/presence/np_adv/src/extended/deserialize/mod.rs b/nearby/presence/np_adv/src/extended/deserialize/mod.rs new file mode 100644 index 0000000..1829ad6 --- /dev/null +++ b/nearby/presence/np_adv/src/extended/deserialize/mod.rs
@@ -0,0 +1,835 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! Deserialization for V1 advertisement contents + +extern crate alloc; + +use alloc::vec::Vec; +use core::array::TryFromSliceError; +use core::borrow::Borrow; +use core::slice; + +use nom::{branch, bytes, combinator, error, multi, number, sequence}; +use strum::IntoEnumIterator as _; + +use array_view::ArrayView; +use crypto_provider::CryptoProvider; +use np_hkdf::v1_salt::{self, V1Salt}; + +use crate::extended::NP_V1_ADV_MAX_SECTION_COUNT; +use crate::{ + credential::{v1::*, V1Credential}, + de_type::{EncryptedIdentityDataElementType, IdentityDataElementType}, + extended::{ + data_elements::{MIC_ENCRYPTION_SCHEME, SIGNATURE_ENCRYPTION_SCHEME}, + de_type::{DeType, ExtendedDataElementType as _}, + deserialize::encrypted_section::{ + MicEncryptedSection, MicEncryptedSectionDeserializationError, + SignatureEncryptedSection, SignatureEncryptedSectionDeserializationError, + }, + to_array_view, DeLength, ENCRYPTION_INFO_DE_TYPE, METADATA_KEY_LEN, NP_ADV_MAX_SECTION_LEN, + }, + PlaintextIdentityMode, V1Header, +}; + +mod encrypted_section; + +#[cfg(test)] +mod parse_tests; + +#[cfg(test)] +mod section_tests; + +#[cfg(test)] +mod test_stubs; + +/// Parse into [IntermediateSection]s, exposing the underlying parsing errors. +/// Consumes all of `adv_body`. +pub(crate) fn parse_sections<'a, 'h: 'a>( + adv_header: &'h V1Header, + adv_body: &'a [u8], +) -> Result<Vec<IntermediateSection<'a>>, nom::Err<error::Error<&'a [u8]>>> { + combinator::all_consuming(multi::many_m_n( + 1, + NP_V1_ADV_MAX_SECTION_COUNT, + IntermediateSection::parser_with_header(adv_header), + ))(adv_body) + .map(|(_rem, sections)| sections) +} + +/// A partially processed section that hasn't been decrypted (if applicable) yet. +#[derive(PartialEq, Eq, Debug)] +// sections are large because they have a stack allocated buffer for the whole section +#[allow(clippy::large_enum_variant)] +pub(crate) enum IntermediateSection<'a> { + /// A section that was not encrypted, e.g. a public identity or no-identity section. + Plaintext(PlaintextSection), + /// A section whose contents were encrypted, e.g. a private identity section. + Ciphertext(CiphertextSection<'a>), +} + +impl<'a> IntermediateSection<'a> { + fn parser_with_header( + adv_header: &'a V1Header, + ) -> impl Fn(&'a [u8]) -> nom::IResult<&[u8], IntermediateSection> { + move |adv_body| { + let (remaining, section_contents_len) = + combinator::verify(number::complete::u8, |sec_len| { + *sec_len as usize <= NP_ADV_MAX_SECTION_LEN && *sec_len as usize > 0 + })(adv_body)?; + + // Section structure possibilities: + // - Public Identity DE, all other DEs + // - No identity DE, all other DEs (including Salt, excluding identity DEs) + // - Encryption information, non-public Identity header, ciphertext + // - MIC, encryption information, non-public Identity header, ciphertext + + let parse_public_identity = combinator::map( + // 1 starting offset because of public identity before it + sequence::tuple((PublicIdentity::parse, parse_non_identity_des(1))), + // move closure to copy section_len into scope + move |(_identity, des)| { + IntermediateSection::Plaintext(PlaintextSection::new( + PlaintextIdentityMode::Public, + SectionContents::new(/* section_header */ section_contents_len, &des), + )) + }, + ); + + // 0 starting offset because there's no identity DE + let parse_no_identity_de = combinator::map(parse_non_identity_des(0), move |des| { + IntermediateSection::Plaintext(PlaintextSection::new( + PlaintextIdentityMode::None, + SectionContents::new(/* section_header */ section_contents_len, &des), + )) + }); + + let parse_encrypted_identity = combinator::map( + sequence::tuple(( + EncryptionInfo::parse_signature, + combinator::verify( + combinator::consumed(sequence::tuple(( + EncryptedIdentityMetadata::parser_at_offset( + v1_salt::DataElementOffset::from(1), + ), + combinator::rest, + ))), + // should be trivially true since section length was checked above, + // but this is an invariant for EncryptedSection, so we double check + |(identity_and_ciphertext, _tuple)| { + (METADATA_KEY_LEN..=NP_ADV_MAX_SECTION_LEN) + .contains(&identity_and_ciphertext.len()) + }, + ), + )), + move |(encryption_info, (identity_and_ciphertext, (identity, _des_ciphertext)))| { + // skip identity de header -- rest of that de is ciphertext + let to_skip = identity.header_bytes.len(); + IntermediateSection::Ciphertext(CiphertextSection::SignatureEncryptedIdentity( + SignatureEncryptedSection { + section_header: section_contents_len, + adv_header, + encryption_info, + identity, + all_ciphertext: &identity_and_ciphertext[to_skip..], + }, + )) + }, + ); + + let parse_mic_encrypted_identity = combinator::map( + sequence::tuple(( + EncryptionInfo::parse_mic, + combinator::verify( + combinator::consumed(sequence::tuple(( + EncryptedIdentityMetadata::parser_at_offset( + v1_salt::DataElementOffset::from(1), + ), + combinator::rest, + ))), + // Should be trivially true since section length was checked above, + // but this is an invariant for MicEncryptedSection, so we double check. + // Also verify that there is enough space at the end to contain a valid-length MIC. + |(identity_ciphertext_and_mic, _tuple)| { + (METADATA_KEY_LEN + SectionMic::CONTENTS_LEN..=NP_ADV_MAX_SECTION_LEN) + .contains(&identity_ciphertext_and_mic.len()) + }, + ), + )), + move |( + encryption_info, + (identity_ciphertext_and_mic, (identity, _ciphertext_and_mic)), + )| { + // should not panic since we have already ensured a valid length + let (identity_and_ciphertext, mic) = identity_ciphertext_and_mic + .split_at(identity_ciphertext_and_mic.len() - SectionMic::CONTENTS_LEN); + // skip identity de header -- rest of that de is ciphertext + let to_skip = identity.header_bytes.len(); + IntermediateSection::Ciphertext(CiphertextSection::MicEncryptedIdentity( + MicEncryptedSection { + section_header: section_contents_len, + adv_header, + mic: mic.try_into().unwrap_or_else(|_| { + panic!("{} is a valid length", SectionMic::CONTENTS_LEN) + }), + encryption_info, + identity, + all_ciphertext: &identity_and_ciphertext[to_skip..], + }, + )) + }, + ); + + combinator::map_parser( + bytes::complete::take(section_contents_len), + // guarantee we consume all of the section (not all of the adv body) + combinator::all_consuming(branch::alt(( + parse_mic_encrypted_identity, + parse_encrypted_identity, + parse_public_identity, + parse_no_identity_de, + ))), + )(remaining) + } + } +} + +#[derive(PartialEq, Eq, Debug)] +struct SectionContents { + section_header: u8, + de_data: ArrayView<u8, NP_ADV_MAX_SECTION_LEN>, + data_elements: Vec<OffsetDataElement>, +} + +impl SectionContents { + fn new(section_header: u8, data_elements: &[RefDataElement]) -> Self { + let (data_elements, de_data) = convert_data_elements(data_elements); + + Self { section_header, de_data, data_elements } + } + + fn data_elements(&'_ self) -> DataElements<'_> { + DataElements { de_iter: self.data_elements.iter(), de_data: &self.de_data } + } +} + +/// An iterator over data elements in a V1 section +// A concrete type to make it easy to refer to in return types where opaque types aren't available. +pub struct DataElements<'a> { + de_iter: slice::Iter<'a, OffsetDataElement>, + de_data: &'a ArrayView<u8, NP_ADV_MAX_SECTION_LEN>, +} + +impl<'a> Iterator for DataElements<'a> { + type Item = DataElement<'a>; + + fn next(&mut self) -> Option<Self::Item> { + self.de_iter.next().map(|de| DataElement { de_data: self.de_data, de }) + } +} + +/// A section deserialized from a V1 advertisement. +pub trait Section { + /// The iterator type used to iterate over data elements + type Iterator<'a>: Iterator<Item = DataElement<'a>> + where + Self: 'a; + + /// Iterator over the data elements in a section, except for any DEs related to resolving the + /// identity or otherwise validating the payload (e.g. MIC, Signature, any identity DEs like + /// Private Identity). + fn data_elements(&'_ self) -> Self::Iterator<'_>; +} + +/// A plaintext section deserialized from a V1 advertisement. +#[derive(PartialEq, Eq, Debug)] +pub struct PlaintextSection { + identity: PlaintextIdentityMode, + contents: SectionContents, +} + +impl PlaintextSection { + fn new(identity: PlaintextIdentityMode, contents: SectionContents) -> Self { + Self { identity, contents } + } + + /// The identity mode for the section. + /// + /// Since plaintext sections do not use encryption, they cannot be matched to a single identity, + /// and only have a mode (no identity or public). + pub fn identity(&self) -> PlaintextIdentityMode { + self.identity + } +} + +impl Section for PlaintextSection { + type Iterator<'a> = DataElements<'a> where Self: 'a; + + fn data_elements(&'_ self) -> Self::Iterator<'_> { + self.contents.data_elements() + } +} + +/// A byte buffer the size of a V1 salt. +#[derive(Copy, Clone, Debug, PartialEq, Eq)] +pub struct RawV1Salt([u8; 16]); + +impl RawV1Salt { + /// Returns the raw salt bytes as a vec. + #[cfg(feature = "devtools")] + pub fn to_vec(&self) -> Vec<u8> { + self.0.to_vec() + } +} + +impl<C: CryptoProvider> From<RawV1Salt> for V1Salt<C> { + fn from(raw_salt: RawV1Salt) -> Self { + raw_salt.0.into() + } +} + +/// The decrypted contents of a ciphertext section. +#[derive(Debug, PartialEq, Eq)] +pub struct DecryptedSection { + identity_type: EncryptedIdentityDataElementType, + verification_mode: VerificationMode, + metadata_key: [u8; METADATA_KEY_LEN], + salt: RawV1Salt, + contents: SectionContents, +} + +impl DecryptedSection { + fn new( + identity_type: EncryptedIdentityDataElementType, + verification_mode: VerificationMode, + metadata_key: [u8; 16], + salt: RawV1Salt, + contents: SectionContents, + ) -> Self { + Self { identity_type, verification_mode, metadata_key, salt, contents } + } + + /// The type of identity DE used in the section. + pub fn identity_type(&self) -> EncryptedIdentityDataElementType { + self.identity_type + } + + /// The verification mode used in the section. + pub fn verification_mode(&self) -> VerificationMode { + self.verification_mode + } + + /// The decrypted metadata key from the identity DE. + pub fn metadata_key(&self) -> &[u8; 16] { + &self.metadata_key + } + + /// The salt used for decryption of this advertisement. + pub fn salt(&self) -> RawV1Salt { + self.salt + } +} + +impl Section for DecryptedSection { + type Iterator<'a> = DataElements<'a> where Self: 'a; + + fn data_elements(&'_ self) -> Self::Iterator<'_> { + self.contents.data_elements() + } +} + +#[derive(PartialEq, Eq, Debug)] +pub(crate) enum CiphertextSection<'a> { + SignatureEncryptedIdentity(SignatureEncryptedSection<'a>), + MicEncryptedIdentity(MicEncryptedSection<'a>), +} + +impl<'a> CiphertextSection<'a> { + pub(crate) fn try_deserialize<'c, C, P>( + &'a self, + credential: &'c C, + ) -> Result<DecryptedSection, SectionDeserializeError> + where + C: V1Credential, + P: CryptoProvider, + { + let crypto_material = credential.crypto_material(); + match self { + Self::SignatureEncryptedIdentity(contents) => { + let identity_resolution_material = + crypto_material.signed_identity_resolution_material::<P>(); + let verification_material = crypto_material.signed_verification_material::<P>(); + + contents + .try_deserialize::<P>( + identity_resolution_material.borrow(), + &verification_material, + ) + .map_err(|e| match e { + SignatureEncryptedSectionDeserializationError::MetadataKeyMacMismatch + | SignatureEncryptedSectionDeserializationError::SignatureMismatch => { + SectionDeserializeError::IncorrectCredential + } + SignatureEncryptedSectionDeserializationError::SignatureMissing + | SignatureEncryptedSectionDeserializationError::DeParseError => { + SectionDeserializeError::ParseError + } + }) + } + Self::MicEncryptedIdentity(contents) => { + let identity_resolution_material = + crypto_material.unsigned_identity_resolution_material::<P>(); + let verification_material = crypto_material.unsigned_verification_material::<P>(); + + contents + .try_deserialize::<P>( + identity_resolution_material.borrow(), + &verification_material, + ) + .map_err(|e| match e { + MicEncryptedSectionDeserializationError::MetadataKeyMacMismatch + | MicEncryptedSectionDeserializationError::MicMismatch => { + SectionDeserializeError::IncorrectCredential + } + MicEncryptedSectionDeserializationError::DeParseError => { + SectionDeserializeError::ParseError + } + }) + } + } + } +} + +/// Errors that can occur when deserializing an advertisement +#[derive(Debug, PartialEq, Eq)] +pub enum SectionDeserializeError { + /// The credential supplied did not match the section's identity data + IncorrectCredential, + /// Section data is malformed + ParseError, +} + +/// Returns a parser function that parses data elements whose type is not one of the known identity +/// DE types, and whose offsets start from the provided `starting_offset`. +/// +/// Consumes all input. +fn parse_non_identity_des( + starting_offset: usize, +) -> impl Fn(&[u8]) -> nom::IResult<&[u8], Vec<RefDataElement>> { + move |input: &[u8]| { + combinator::map_opt( + combinator::all_consuming(multi::many0(combinator::verify( + ProtoDataElement::parse, + |de| IdentityDataElementType::iter().all(|t| t.type_code() != de.header.de_type), + ))), + |proto_des| { + proto_des + .into_iter() + .enumerate() + .map(|(offset, pde)| starting_offset.checked_add(offset).map(|sum| (sum, pde))) + .map(|res| { + res.map(|(offset, pde)| { + pde.into_data_element(v1_salt::DataElementOffset::from(offset)) + }) + }) + .collect::<Option<Vec<_>>>() + }, + )(input) + } +} + +/// Deserialize-specific version of a DE header that incorporates the header length. +/// This is needed for encrypted identities that need to construct a slice of everything in the +/// section following the identity DE header. +#[derive(Debug, PartialEq, Eq, Clone)] +pub(crate) struct DeHeader { + /// The original bytes of the header, at most 6 bytes long (1 byte len, 5 bytes type) + pub(crate) header_bytes: ArrayView<u8, 6>, + pub(crate) de_type: DeType, + pub(crate) contents_len: DeLength, +} + +impl DeHeader { + pub(crate) fn parse(input: &[u8]) -> nom::IResult<&[u8], DeHeader> { + // 1-byte header: 0b0LLLTTTT + let parse_single_byte_de_header = + combinator::map_opt::<&[u8], _, DeHeader, error::Error<&[u8]>, _, _>( + combinator::consumed(combinator::map_res( + combinator::verify(number::complete::u8, |&b| !hi_bit_set(b)), + |b| { + // L bits + let len = (b >> 4) & 0x07; + // T bits + let de_type = ((b & 0x0F) as u32).into(); + + len.try_into().map(|l| (l, de_type)) + }, + )), + |(header_bytes, (len, de_type))| { + ArrayView::try_from_slice(header_bytes).map(|header_bytes| DeHeader { + header_bytes, + contents_len: len, + de_type, + }) + }, + ); + + // multi-byte headers: 0b1LLLLLLL (0b1TTTTTTT)* 0b0TTTTTTT + // leading 1 in first byte = multibyte format + // leading 1 in subsequent bytes = there is at least 1 more type bytes + // leading 0 = this is the last header byte + // 127-bit length, effectively infinite type bit length + + // It's conceivable to have non-canonical extended type sequences where 1 or more leading + // bytes don't have any bits set (other than the marker hi bit), thereby contributing nothing + // to the final value. + // To prevent that, we require that either there be only 1 type byte, or that the first of the + // multiple type bytes must have a value bit set. It's OK to have no value bits in subsequent + // type bytes. + + let parse_ext_de_header = combinator::map_opt( + combinator::consumed(sequence::pair( + // length byte w/ leading 1 + combinator::map_res( + combinator::verify(number::complete::u8::<&[u8], _>, |&b| hi_bit_set(b)), + // snag the lower 7 bits + |b| (b & 0x7F).try_into(), + ), + branch::alt(( + // 1 type byte case + combinator::recognize( + // 0-hi-bit type code byte + combinator::verify(number::complete::u8, |&b| !hi_bit_set(b)), + ), + // multiple type byte case: leading type byte must have at least 1 value bit + combinator::recognize(sequence::tuple(( + // hi bit and at least 1 value bit, otherwise it would be non-canonical + combinator::verify(number::complete::u8, |&b| { + hi_bit_set(b) && (b & 0x7F != 0) + }), + // 0-3 1-hi-bit type code bytes with any bit pattern. Max is 3 since two 7 + // bit type chunks are processed before and after this, for a total of 5, + // and that's as many 7-bit chunks as are needed to support a 32-bit type. + bytes::complete::take_while_m_n(0, 3, hi_bit_set), + // final 0-hi-bit type code byte + combinator::verify(number::complete::u8, |&b| !hi_bit_set(b)), + ))), + )), + )), + |(header_bytes, (len, type_bytes))| { + // snag the low 7 bits of each type byte and accumulate + + type_bytes + .iter() + .fold(Some(0_u32), |accum, b| { + accum.and_then(|n| n.checked_shl(7)).map(|n| n + ((b & 0x7F) as u32)) + }) + .and_then(|type_code| { + ArrayView::try_from_slice(header_bytes).map(|header_bytes| DeHeader { + header_bytes, + contents_len: len, + de_type: type_code.into(), + }) + }) + }, + ); + + branch::alt((parse_single_byte_de_header, parse_ext_de_header))(input) + } +} + +/// An intermediate stage in parsing a [DataElement] that lacks `offset`. +#[derive(Debug, PartialEq, Eq)] +struct ProtoDataElement<'d> { + header: DeHeader, + /// `len()` must equal `header.contents_len` + contents: &'d [u8], +} + +impl<'d> ProtoDataElement<'d> { + fn parse(input: &[u8]) -> nom::IResult<&[u8], ProtoDataElement> { + let (remaining, header) = DeHeader::parse(input)?; + let len = header.contents_len; + combinator::map(bytes::complete::take(len.as_usize()), move |slice| { + let header_clone = header.clone(); + ProtoDataElement { header: header_clone, contents: slice } + })(remaining) + } + + fn into_data_element(self, offset: v1_salt::DataElementOffset) -> RefDataElement<'d> { + RefDataElement { + offset, + header_len: self.header.header_bytes.len().try_into().expect("header is <= 6 bytes"), + de_type: self.header.de_type, + contents: self.contents, + } + } +} + +/// A data element that holds a slice reference for its contents +#[derive(Debug, PartialEq, Eq)] +pub(crate) struct RefDataElement<'d> { + pub(crate) offset: v1_salt::DataElementOffset, + pub(crate) header_len: u8, + pub(crate) de_type: DeType, + pub(crate) contents: &'d [u8], +} + +/// A deserialized data element in a section. +/// +/// The DE has been processed to the point of exposing a DE type and its contents as a `&[u8]`, but +/// no DE-type-specific processing has been performed. +#[derive(Debug)] +pub struct DataElement<'a> { + de_data: &'a ArrayView<u8, NP_ADV_MAX_SECTION_LEN>, + de: &'a OffsetDataElement, +} + +impl<'a> DataElement<'a> { + /// The offset of the DE in its containing Section. + /// + /// Used with the section salt to derive per-DE salt. + pub fn offset(&self) -> v1_salt::DataElementOffset { + self.de.offset + } + /// The type of the DE + pub fn de_type(&self) -> DeType { + self.de.de_type + } + /// The contents of the DE + pub fn contents(&self) -> &[u8] { + &self.de_data.as_slice() + [self.de.start_of_contents..self.de.start_of_contents + self.de.contents_len] + } +} + +/// The level of integrity protection in an encrypted section +#[derive(Clone, Copy, PartialEq, Eq, Debug)] +pub enum VerificationMode { + /// A symmetric MIC (message integrity code aka message authentication code) was verified. + /// + /// Since this is a symmetric operation, holders of the key material needed to verify a MIC + /// can also forge MICs. + Mic, + /// An asymmetric signature was verified. + /// + /// Since this is an asymmetric operation, only the holder of the private key can generate + /// signatures, so it offers a stronger level of authenticity protection than [Self::Mic]. + Signature, +} + +/// The identity used to successfully decrypt and validate an encrypted section +#[derive(Clone, PartialEq, Eq, Debug)] +pub struct EncryptedSectionIdentity { + identity_type: EncryptedIdentityDataElementType, + validation_mode: VerificationMode, + metadata_key: [u8; METADATA_KEY_LEN], +} + +impl EncryptedSectionIdentity { + /// The type of identity DE used in the section + pub fn identity_type(&self) -> EncryptedIdentityDataElementType { + self.identity_type + } + /// The validation mode used when decrypting and verifying the section + pub fn verification_mode(&self) -> VerificationMode { + self.validation_mode + } + /// The decrypted metadata key from the section's identity DE + pub fn metadata_key(&self) -> &[u8; METADATA_KEY_LEN] { + &self.metadata_key + } +} + +/// A DE that designates its contents via offset and length to avoid self-referential slices. +#[derive(Debug, PartialEq, Eq)] +struct OffsetDataElement { + offset: v1_salt::DataElementOffset, + de_type: DeType, + start_of_contents: usize, + contents_len: usize, +} + +/// Convert data elements from holding slices to holding offsets and lengths to avoid +/// lifetime woes. +/// This entails some data copying, so if it causes noticeable perf issues we can revisit +/// it, but it is likely to be much cheaper than decryption. +/// +/// # Panics +/// +/// Will panic if handed more data elements than fit in one section. This is only possible if +/// generating data elements from a source other than parsing a section. +fn convert_data_elements( + elements: &[RefDataElement], +) -> (Vec<OffsetDataElement>, ArrayView<u8, NP_ADV_MAX_SECTION_LEN>) { + let mut buf = tinyvec::ArrayVec::new(); + + ( + elements + .iter() + .map(|de| { + let current_len = buf.len(); + // won't overflow because these DEs originally came from a section, and now + // we're packing only their contents without DE headers + buf.extend_from_slice(de.contents); + OffsetDataElement { + offset: de.offset, + de_type: de.de_type, + start_of_contents: current_len, + contents_len: de.contents.len(), + } + }) + .collect(), + to_array_view(buf), + ) +} + +#[derive(PartialEq, Eq, Debug, Clone)] +pub(crate) struct EncryptionInfo { + pub bytes: [u8; 19], +} + +impl EncryptionInfo { + // 2-byte header, 1-byte encryption scheme, 16-byte salt + pub(crate) const TOTAL_DE_LEN: usize = 19; + const CONTENTS_LEN: usize = 17; + const ENCRYPTION_INFO_SCHEME_MASK: u8 = 0b01111000; + + fn parse_signature(input: &[u8]) -> nom::IResult<&[u8], EncryptionInfo> { + Self::parser_for_scheme(SIGNATURE_ENCRYPTION_SCHEME)(input) + } + + fn parse_mic(input: &[u8]) -> nom::IResult<&[u8], EncryptionInfo> { + Self::parser_for_scheme(MIC_ENCRYPTION_SCHEME)(input) + } + + fn parser_for_scheme( + expected_scheme: u8, + ) -> impl Fn(&[u8]) -> nom::IResult<&[u8], EncryptionInfo> { + move |input| { + combinator::map_res( + combinator::consumed(combinator::map_parser( + combinator::map( + combinator::verify(ProtoDataElement::parse, |de| { + de.header.de_type == ENCRYPTION_INFO_DE_TYPE + && de.contents.len() == Self::CONTENTS_LEN + }), + |de| de.contents, + ), + sequence::tuple(( + combinator::verify(number::complete::be_u8, |scheme: &u8| { + expected_scheme == (Self::ENCRYPTION_INFO_SCHEME_MASK & scheme) + }), + bytes::complete::take(16_usize), + )), + )), + |(bytes, _contents)| bytes.try_into(), + )(input) + } + } + + fn salt(&self) -> RawV1Salt { + // should never panic + RawV1Salt(self.bytes[Self::TOTAL_DE_LEN - 16..].try_into().ok().unwrap()) + } +} + +impl TryFrom<&[u8]> for EncryptionInfo { + type Error = TryFromSliceError; + + fn try_from(value: &[u8]) -> Result<Self, Self::Error> { + value.try_into().map(|fixed_bytes: [u8; 19]| Ok(Self { bytes: fixed_bytes }))? + } +} + +#[derive(PartialEq, Eq, Debug)] +pub(crate) struct SectionMic { + mic: [u8; 16], +} + +impl SectionMic { + // 16-byte metadata key + pub(crate) const CONTENTS_LEN: usize = 16; +} + +impl From<[u8; 16]> for SectionMic { + fn from(value: [u8; 16]) -> Self { + SectionMic { mic: value } + } +} + +impl TryFrom<&[u8]> for SectionMic { + type Error = TryFromSliceError; + + fn try_from(value: &[u8]) -> Result<Self, Self::Error> { + let fixed_bytes: [u8; SectionMic::CONTENTS_LEN] = value.try_into()?; + Ok(Self { mic: fixed_bytes }) + } +} + +#[derive(PartialEq, Eq, Debug)] +struct PublicIdentity; + +impl PublicIdentity { + fn parse(input: &[u8]) -> nom::IResult<&[u8], PublicIdentity> { + combinator::map( + combinator::verify(DeHeader::parse, |deh| { + deh.de_type == IdentityDataElementType::Public.type_code() + && deh.contents_len.as_usize() == 0 + }), + |_| PublicIdentity, + )(input) + } +} + +/// Parsed form of an encrypted identity DE before its contents are decrypted. +/// Metadata key is stored in the enclosing section. +#[derive(PartialEq, Eq, Debug)] +pub(crate) struct EncryptedIdentityMetadata { + pub(crate) offset: v1_salt::DataElementOffset, + /// The original DE header from the advertisement. + /// Encrypted identity should always be a len=2 header. + pub(crate) header_bytes: [u8; 2], + pub(crate) identity_type: EncryptedIdentityDataElementType, +} + +impl EncryptedIdentityMetadata { + // 2-byte header, 16-byte metadata key + pub(crate) const TOTAL_DE_LEN: usize = 18; + + /// Returns a parser function that parses an [EncryptedIdentity] using the provided DE `offset`. + fn parser_at_offset( + offset: v1_salt::DataElementOffset, + ) -> impl Fn(&[u8]) -> nom::IResult<&[u8], EncryptedIdentityMetadata> { + move |input| { + combinator::map_opt(ProtoDataElement::parse, |de| { + EncryptedIdentityDataElementType::from_type_code(de.header.de_type).and_then( + |identity_type| { + de.header.header_bytes.as_slice().try_into().ok().and_then(|header_bytes| { + de.contents.try_into().ok().map(|_metadata_key_ciphertext: [u8; 16]| { + // ensure the ciphertext is the right size, then discard + EncryptedIdentityMetadata { header_bytes, offset, identity_type } + }) + }) + }, + ) + })(input) + } + } +} + +fn hi_bit_set(b: u8) -> bool { + b & 0x80 > 0 +}
diff --git a/nearby/presence/np_adv/src/extended/deserialize/parse_tests.rs b/nearby/presence/np_adv/src/extended/deserialize/parse_tests.rs new file mode 100644 index 0000000..f3b8258 --- /dev/null +++ b/nearby/presence/np_adv/src/extended/deserialize/parse_tests.rs
@@ -0,0 +1,724 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +extern crate std; + +use super::*; +use crate::extended::deserialize::encrypted_section::{ + MicEncryptedSection, SignatureEncryptedSection, +}; +use std::vec; + +#[test] +fn parse_adv_ext_no_identity() { + // 2 sections, 2 DEs each + let mut adv_body = vec![]; + // section + adv_body.push(9); + // de 1 byte header, type 5, len 5 + adv_body.extend_from_slice(&[0x55, 0x01, 0x02, 0x03, 0x04, 0x05]); + // de 2 byte header, type 6, len 1 + adv_body.extend_from_slice(&[0x81, 0x06, 0x01]); + + // section + adv_body.push(11); + // de 3 byte header, len 4 + adv_body.extend_from_slice(&[0x84, 0xC3, 0x03, 0x01, 0x02, 0x03, 0x04]); + // de 1 byte header, type 8, len 3 + adv_body.extend_from_slice(&[0x38, 0x01, 0x02, 0x03]); + + assert_eq!( + Ok(vec![ + PlaintextSection::new( + PlaintextIdentityMode::None, + SectionContents::new( + 9, + &[ + // 1 byte header, len 5 + RefDataElement { + offset: 0_usize.into(), + header_len: 1, + de_type: 5_u8.into(), + contents: &[0x01, 0x02, 0x03, 0x04, 0x05] + }, + // 2 byte header, len 1 + RefDataElement { + offset: 1_usize.into(), + header_len: 2, + de_type: 6_u8.into(), + contents: &[0x01] + } + ] + ) + ) + .into(), + PlaintextSection::new( + PlaintextIdentityMode::None, + SectionContents::new( + 11, + &[ + // 3 byte header, len 4 + RefDataElement { + offset: 0_usize.into(), + header_len: 3, + de_type: 0b0000_0000_0000_0000_0010_0001_1000_0011_u32.into(), + contents: &[0x01, 0x02, 0x03, 0x04] + }, + // 1 byte header, len 3 + RefDataElement { + offset: 1_usize.into(), + header_len: 1, + de_type: 8_u8.into(), + contents: &[0x01, 0x02, 0x03] + } + ] + ) + ) + .into() + ]), + parse_sections(&V1Header { header_byte: 0x20 }, &adv_body) + ); +} + +#[test] +fn parse_adv_ext_public_identity() { + // 2 sections, 3 DEs each + let mut adv_body = vec![]; + // section + adv_body.push(10); + // public identity + adv_body.push(0x03); + // de 1 byte header, type 5, len 5 + adv_body.extend_from_slice(&[0x55, 0x01, 0x02, 0x03, 0x04, 0x05]); + // de 2 byte header, type 6, len 1 + adv_body.extend_from_slice(&[0x81, 0x06, 0x01]); + + // section + adv_body.push(12); + // public identity + adv_body.push(0x03); + // de 3 byte header, len 4 + adv_body.extend_from_slice(&[0x84, 0xC3, 0x03, 0x01, 0x02, 0x03, 0x04]); + // de 1 byte header, type 8, len 3 + adv_body.extend_from_slice(&[0x38, 0x01, 0x02, 0x03]); + + assert_eq!( + Ok(vec![ + PlaintextSection::new( + PlaintextIdentityMode::Public, + SectionContents::new( + 10, + &[ + // 1 byte header, len 5 + RefDataElement { + offset: 1_usize.into(), + header_len: 1, + de_type: 5_u8.into(), + contents: &[0x01, 0x02, 0x03, 0x04, 0x05], + }, + // 2 byte header, len 1 + RefDataElement { + offset: 2_usize.into(), + header_len: 2, + de_type: 6_u8.into(), + contents: &[0x01], + }, + ], + ) + ) + .into(), + PlaintextSection::new( + PlaintextIdentityMode::Public, + SectionContents::new( + 12, + &[ + // 3 byte header, len 4 + RefDataElement { + offset: 1_usize.into(), + header_len: 3, + de_type: 0b0000_0000_0000_0000_0010_0001_1000_0011_u32.into(), + contents: &[0x01, 0x02, 0x03, 0x04], + }, + // 1 byte header, len 3 + RefDataElement { + offset: 2_usize.into(), + header_len: 1, + de_type: 8_u8.into(), + contents: &[0x01, 0x02, 0x03], + }, + ], + ) + ) + .into(), + ]), + parse_sections(&V1Header { header_byte: 0x20 }, &adv_body) + ); +} + +#[test] +fn parse_adv_ext_identity() { + // 3 sections + let mut adv_body = vec![]; + // section - 48 bytes total + adv_body.push(19 + 18 + 10); + // encryption info -- 2 + 1 + 16x 0x11 + adv_body.extend_from_slice(&[ + 0x91, 0x10, // header + 0x08, // scheme (signature) + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, // salt + ]); + // private identity -- 2 + 16x 0x33 + adv_body.extend_from_slice(&[ + 0x90, 0x01, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, + 0x33, 0x33, 0x33, + ]); + // 10 bytes of 0xFF ciphertext + adv_body.extend_from_slice(&[0xFF; 10]); + + // section - 49 bytes total + adv_body.push(19 + 18 + 11); + // encryption info -- 2 + 1 + 16x 0x11 + adv_body.extend_from_slice(&[ + 0x91, 0x10, // header + 0x08, // scheme (signature) + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, // salt + ]); + // trusted identity -- 2 + 16x 0x55 + adv_body.extend_from_slice(&[ + 0x90, 0x02, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, + 0x55, 0x55, 0x55, + ]); + // 11 bytes of 0xFF ciphertext + adv_body.extend_from_slice(&[0xFF; 11]); + + // section - 50 bytes total + adv_body.push(19 + 18 + 12); + // encryption info -- 2 + 1 + 16x 0x11 + adv_body.extend_from_slice(&[ + 0x91, 0x10, // header + 0x08, // scheme (signature) + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, // salt + ]); + // provisioned identity -- 2 + 16x 0x77 + adv_body.extend_from_slice(&[ + 0x90, 0x04, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, + ]); + // 12 bytes of 0xFF ciphertext + adv_body.extend_from_slice(&[0xFF; 12]); + + let adv_header = V1Header { header_byte: 0x20 }; + let encryption_info = EncryptionInfo { + bytes: [ + 0x91, 0x10, // header bytes + 0x08, // scheme (signature) + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, + ], + }; + assert_eq!( + Ok(vec![ + SignatureEncryptedSection { + section_header: 47, + adv_header: &adv_header, + encryption_info: encryption_info.clone(), + identity: EncryptedIdentityMetadata { + header_bytes: [0x90, 0x01], + offset: 1_usize.into(), + identity_type: EncryptedIdentityDataElementType::Private, + }, + // skip section header + encryption info + identity header -> end of section + all_ciphertext: &adv_body[1 + 19 + 2..48], + } + .into(), + SignatureEncryptedSection { + section_header: 48, + adv_header: &adv_header, + encryption_info: encryption_info.clone(), + identity: EncryptedIdentityMetadata { + header_bytes: [0x90, 0x02], + offset: 1_usize.into(), + identity_type: EncryptedIdentityDataElementType::Trusted, + }, + all_ciphertext: &adv_body[48 + 1 + 19 + 2..97], + } + .into(), + SignatureEncryptedSection { + section_header: 49, + adv_header: &adv_header, + encryption_info, + identity: EncryptedIdentityMetadata { + header_bytes: [0x90, 0x04], + offset: 1_usize.into(), + identity_type: EncryptedIdentityDataElementType::Provisioned, + }, + all_ciphertext: &adv_body[97 + 1 + 19 + 2..], + } + .into() + ]), + parse_sections(&adv_header, &adv_body) + ); +} + +#[test] +fn parse_adv_ext_mic_identity() { + // 3 sections + let mut adv_body = vec![]; + // section - 64 bytes total + adv_body.push(19 + 18 + 10 + 16); + // encryption info -- 2 + 1 + 16x 0x11 + adv_body.extend_from_slice(&[ + 0x91, 0x10, // header + 0x00, // scheme (mic) + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, // salt + ]); + // private identity -- 2 + 16x 0x55 + adv_body.extend_from_slice(&[ + 0x90, 0x01, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, + 0x55, 0x55, 0x55, + ]); + // 10 bytes of 0xFF ciphertext + adv_body.extend_from_slice(&[0xFF; 10]); + // mic - 16x 0x33 + adv_body.extend_from_slice(&[ + 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, + 0x33, + ]); + + // section - 65 bytes total + adv_body.push(19 + 18 + 11 + 16); + // encryption info -- 2 + 1 + 16x 0x11 + adv_body.extend_from_slice(&[ + 0x91, 0x10, // header + 0x00, // scheme (mic) + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, // salt + ]); + // trusted identity -- 2 + 16x 0x77 + adv_body.extend_from_slice(&[ + 0x90, 0x02, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, + ]); + // 11 bytes of 0xFF ciphertext + adv_body.extend_from_slice(&[0xFF; 11]); + // mic - 16x 0x66 + adv_body.extend_from_slice(&[ + 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, + 0x66, + ]); + + // section - 66 bytes total + adv_body.push(19 + 18 + 12 + 16); + // encryption info -- 2 + 1 + 16x 0x11 + adv_body.extend_from_slice(&[ + 0x91, 0x10, // header + 0x00, // scheme (mic) + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, // salt + ]); + // provisioned identity -- 2 + 16x 0xAA + adv_body.extend_from_slice(&[ + 0x90, 0x04, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, + 0xAA, 0xAA, 0xAA, + ]); + // 12 bytes of 0xFF ciphertext + adv_body.extend_from_slice(&[0xFF; 12]); + // mic - 16x 0x99 + adv_body.extend_from_slice(&[ + 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, + 0x99, + ]); + + let adv_header = V1Header { header_byte: 0x20 }; + let encryption_info = EncryptionInfo { + bytes: [ + 0x91, 0x10, // header bytes + 0x00, // scheme (mic) + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, + ], + }; + assert_eq!( + Ok(vec![ + MicEncryptedSection { + section_header: 63, + adv_header: &adv_header, + mic: SectionMic::from([0x33; 16]), + encryption_info: encryption_info.clone(), + identity: EncryptedIdentityMetadata { + header_bytes: [0x90, 0x01], + offset: 1_usize.into(), + identity_type: EncryptedIdentityDataElementType::Private, + }, + // skip section header + encryption info + identity header -> end of ciphertext + all_ciphertext: &adv_body[1 + 19 + 2..64 - 16], + } + .into(), + MicEncryptedSection { + section_header: 64, + adv_header: &adv_header, + mic: SectionMic::from([0x66; 16]), + encryption_info: encryption_info.clone(), + identity: EncryptedIdentityMetadata { + header_bytes: [0x90, 0x02], + offset: 1_usize.into(), + identity_type: EncryptedIdentityDataElementType::Trusted, + }, + all_ciphertext: &adv_body[64 + 1 + 19 + 2..129 - 16], + } + .into(), + MicEncryptedSection { + section_header: 65, + adv_header: &adv_header, + mic: SectionMic::from([0x99; 16]), + encryption_info, + identity: EncryptedIdentityMetadata { + header_bytes: [0x90, 0x04], + offset: 1_usize.into(), + identity_type: EncryptedIdentityDataElementType::Provisioned, + }, + all_ciphertext: &adv_body[129 + 1 + 19 + 2..195 - 16], + } + .into(), + ]), + parse_sections(&adv_header, &adv_body) + ); +} + +#[test] +fn public_identity_not_first_de_error() { + let mut adv_body = vec![]; + + // section + adv_body.push(3 + 1); + // misc other DE + adv_body.extend_from_slice(&[0x81, 0x70, 0xFF]); + // public identity after another DE + adv_body.push(0x03); + + assert_eq!( + Err(nom::Err::Error(error::Error { + input: &adv_body[4..], + // Eof because all_consuming is used to ensure complete section is parsed + code: error::ErrorKind::Eof + })), + parse_sections(&V1Header { header_byte: 0x20 }, &adv_body) + ); +} + +#[test] +fn public_identity_after_public_identity_error() { + let mut adv_body = vec![]; + + // section + adv_body.push(1 + 3 + 1); + // public identity after another DE + adv_body.push(0x03); + // misc other DE + adv_body.extend_from_slice(&[0x81, 0x70, 0xFF]); + // public identity after another DE + adv_body.push(0x03); + + assert_eq!( + Err(nom::Err::Error(error::Error { + // since we use many1, the parser consumes the first byte and returns the remaining in the error + input: &adv_body[1..], + // Eof because all_consuming is used to ensure complete section is parsed + code: error::ErrorKind::Eof + })), + parse_sections(&V1Header { header_byte: 0x20 }, &adv_body) + ); +} + +#[test] +fn salt_public_identity_error() { + let mut adv_body = vec![]; + // section + adv_body.push(3 + 1 + 3); + // salt - 1 + 2x 0x22 (invalid: must be first DE) + adv_body.extend_from_slice(&[0x20, 0x22, 0x22]); + // public identity + adv_body.push(0x03); + // misc other DE + adv_body.extend_from_slice(&[0x81, 0x70, 0xFF]); + + assert_eq!( + Err(nom::Err::Error(error::Error { + input: &adv_body[4..], + // Eof because all_consuming is used to ensure complete section is parsed + code: error::ErrorKind::Eof + })), + parse_sections(&V1Header { header_byte: 0x20 }, &adv_body) + ); +} + +#[test] +fn salt_mic_public_identity_error() { + let mut adv_body = vec![]; + // section + adv_body.push(3 + 18 + 1 + 3); + // salt - 1 + 2x 0x22 (invalid: must be first DE) + adv_body.extend_from_slice(&[0x20, 0x22, 0x22]); + // mic - 2 + 16x 0x33 + adv_body.extend_from_slice(&[ + 0x90, 0x13, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, + 0x33, 0x33, 0x33, + ]); + // public identity + adv_body.push(0x03); + // misc other DE + adv_body.extend_from_slice(&[0x81, 0x70, 0xFF]); + + assert_eq!( + Err(nom::Err::Error(error::Error { + input: &adv_body[22..], + // Eof because all_consuming is used to ensure complete section is parsed + code: error::ErrorKind::Eof + })), + parse_sections(&V1Header { header_byte: 0x20 }, &adv_body) + ); +} + +#[test] +fn parse_de_with_1_byte_header() { + let data = [0x51, 0x01, 0x02, 0x03, 0x04, 0x05, 0xFF, 0xFF]; + assert_eq!( + Ok(( + &data[6..], + ProtoDataElement { + header: DeHeader { + de_type: 1_u8.into(), + header_bytes: ArrayView::try_from_slice(&[0x51]).unwrap(), + contents_len: 5_u8.try_into().unwrap() + }, + contents: &data[1..6] + } + )), + ProtoDataElement::parse(&data) + ); +} + +#[test] +fn parse_de_with_2_byte_header() { + let data = [0x85, 0x01, 0x01, 0x02, 0x03, 0x04, 0x05, 0xFF, 0xFF]; + assert_eq!( + Ok(( + &data[7..], + ProtoDataElement { + header: DeHeader { + de_type: 1_u8.into(), + header_bytes: ArrayView::try_from_slice(&[0x85, 0x01]).unwrap(), + contents_len: 5_u8.try_into().unwrap() + }, + contents: &data[2..7] + } + )), + ProtoDataElement::parse(&data) + ); +} + +#[test] +fn parse_de_with_3_byte_header() { + let data = [0x85, 0xC1, 0x41, 0x01, 0x02, 0x03, 0x04, 0x05, 0xFF, 0xFF]; + assert_eq!( + Ok(( + &data[8..], + ProtoDataElement { + header: DeHeader { + header_bytes: ArrayView::try_from_slice(&[0x85, 0xC1, 0x41]).unwrap(), + contents_len: 5_u8.try_into().unwrap(), + de_type: 0b0000_0000_0000_0000_0010_0000_1100_0001_u32.into(), + }, + contents: &data[3..8] + } + )), + ProtoDataElement::parse(&data) + ); +} + +#[test] +fn parse_de_header_1_byte() { + let data = [0x51, 0xFF, 0xFF]; + assert_eq!( + Ok(( + &data[1..], + DeHeader { + de_type: 1_u8.into(), + contents_len: 5_u8.try_into().unwrap(), + header_bytes: ArrayView::try_from_slice(&[0x51]).unwrap(), + } + )), + DeHeader::parse(&data) + ); +} + +#[test] +fn parse_de_header_2_bytes() { + let data = [0x83, 0x01, 0xFF, 0xFF]; + assert_eq!( + Ok(( + &data[2..], + DeHeader { + de_type: 1_u8.into(), + contents_len: 3_u8.try_into().unwrap(), + header_bytes: ArrayView::try_from_slice(&[0x83, 0x01]).unwrap(), + } + )), + DeHeader::parse(&data) + ); +} + +#[test] +fn parse_de_header_3_bytes() { + let data = [0x83, 0xC1, 0x41, 0xFF, 0xFF]; + assert_eq!( + Ok(( + &data[3..], + DeHeader { + de_type: 0b0000_0000_0000_0000_0010_0000_1100_0001_u32.into(), + contents_len: 3_u8.try_into().unwrap(), + header_bytes: ArrayView::try_from_slice(&[0x83, 0xC1, 0x41]).unwrap(), + } + )), + DeHeader::parse(&data) + ); +} + +#[test] +fn parse_de_header_4_bytes() { + let data = [0x83, 0xC1, 0xC1, 0x41, 0xFF, 0xFF]; + assert_eq!( + Ok(( + &data[4..], + DeHeader { + de_type: 0b0000_0000_0001_0000_0110_0000_1100_0001_u32.into(), + contents_len: 3_u8.try_into().unwrap(), + header_bytes: ArrayView::try_from_slice(&[0x83, 0xC1, 0xC1, 0x41]).unwrap(), + } + )), + DeHeader::parse(&data) + ); +} + +#[test] +fn parse_section_length_overrun() { + // section of length 0xF0 - legal but way longer than 3 + let input = [0xF0, 0x01, 0x02, 0x03]; + assert_eq!( + nom::Err::Error(error::Error { + // attempted to read section contents + input: &input.as_slice()[1..], + code: error::ErrorKind::Eof + }), + IntermediateSection::parser_with_header(&V1Header { header_byte: 0x20 })(&input) + .unwrap_err() + ); +} + +#[test] +fn parse_de_single_byte_header_length_overrun() { + // length 7, type 0x03 + let input = [0b0111_0011, 0x01, 0x02]; + assert_eq!( + nom::Err::Error(error::Error { + // attempted to read DE contents + input: &input.as_slice()[1..], + code: error::ErrorKind::Eof + }), + ProtoDataElement::parse(&input).unwrap_err() + ); +} + +#[test] +fn parse_de_multi_byte_header_length_overrun() { + // length 7, type 0x0F + let input = [0b1000_0111, 0x0F, 0x01, 0x02]; + assert_eq!( + nom::Err::Error(error::Error { + // attempted to read DE contents + input: &input.as_slice()[2..], + code: error::ErrorKind::Eof + }), + ProtoDataElement::parse(&input).unwrap_err() + ); +} + +#[test] +fn parse_de_header_non_canonical_multi_byte() { + // length 1, type 1 + // first byte of type doesn't have any bits in it so it contributes nothing + let input = [0b1000_0001, 0b1000_0000, 0b0000_0001]; + assert_eq!( + nom::Err::Error(error::Error { + // attempted to read first type byte + input: &input.as_slice()[1..], + code: error::ErrorKind::Verify + }), + DeHeader::parse(&input).unwrap_err() + ); +} + +#[test] +fn parse_section_length_zero() { + // Section length of 0 - should return a verification error + let input = [0x00]; + assert_eq!( + nom::Err::Error(error::Error { + // attempted to read section contents + input: input.as_slice(), + code: error::ErrorKind::Verify + }), + IntermediateSection::parser_with_header(&V1Header { header_byte: 0x20 })(&input) + .unwrap_err() + ); +} + +#[test] +fn parse_empty_section() { + // empty section - should return an EOF error + let input = []; + assert_eq!( + nom::Err::Error(error::Error { + // attempted to read section contents + input: input.as_slice(), + code: error::ErrorKind::Eof + }), + IntermediateSection::parser_with_header(&V1Header { header_byte: 0x20 })(&input) + .unwrap_err() + ); +} + +// for convenient .into() in expected test data + +impl<'a> From<SignatureEncryptedSection<'a>> for IntermediateSection<'a> { + fn from(s: SignatureEncryptedSection<'a>) -> Self { + IntermediateSection::Ciphertext(CiphertextSection::SignatureEncryptedIdentity(s)) + } +} + +impl<'a> From<MicEncryptedSection<'a>> for IntermediateSection<'a> { + fn from(s: MicEncryptedSection<'a>) -> Self { + IntermediateSection::Ciphertext(CiphertextSection::MicEncryptedIdentity(s)) + } +} + +impl<'a> From<PlaintextSection> for IntermediateSection<'a> { + fn from(s: PlaintextSection) -> Self { + IntermediateSection::Plaintext(s) + } +}
diff --git a/nearby/presence/np_adv/src/extended/deserialize/section_tests.rs b/nearby/presence/np_adv/src/extended/deserialize/section_tests.rs new file mode 100644 index 0000000..7199031 --- /dev/null +++ b/nearby/presence/np_adv/src/extended/deserialize/section_tests.rs
@@ -0,0 +1,672 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +extern crate std; + +use super::*; +use crate::{ + credential::{ + simple::SimpleV1Credential, + source::{CredentialSource, SliceCredentialSource}, + MatchableCredential, V1Credential, + }, + extended::{ + data_elements::GenericDataElement, + deserialize::{ + convert_data_elements, + test_stubs::{HkdfCryptoMaterial, IntermediateSectionExt}, + OffsetDataElement, + }, + serialize::{ + self, AdvBuilder, MicEncrypted, SectionBuilder, SignedEncrypted, WriteDataElement, + }, + MAX_DE_LEN, + }, + parse_adv_header, AdvHeader, PublicIdentity, +}; +use crypto_provider::{CryptoProvider, CryptoRng}; +use crypto_provider_default::CryptoProviderImpl; +use rand::{seq::SliceRandom as _, Rng as _, SeedableRng as _}; +use std::prelude::rust_2021::*; +use std::vec; + +type KeyPair = np_ed25519::KeyPair<CryptoProviderImpl>; + +#[test] +fn deserialize_public_identity_section() { + do_deserialize_section_unencrypted::<PublicIdentity>( + PublicIdentity::default(), + PlaintextIdentityMode::Public, + 1, + 1, + ); +} + +// due to lifetime issues, this is somewhat challenging to share with the 90% identical signature +// test, but if someone feels like putting in the tinkering to make it happen, please do +#[test] +fn deserialize_mic_encrypted_rand_identities_finds_correct_one() { + let mut rng = rand::rngs::StdRng::from_entropy(); + let mut crypto_rng = <CryptoProviderImpl as CryptoProvider>::CryptoRng::new(); + for _ in 0..100 { + let identities = (0..100).map(|_| (rng.gen(), KeyPair::generate())).collect::<Vec<_>>(); + + let chosen_index = rng.gen_range(0..identities.len()); + let (chosen_key_seed, _chosen_key_pair) = &identities[chosen_index]; + + // share a metadata key to emphasize that we're _only_ using the identity to + // differentiate + let metadata_key: [u8; 16] = rng.gen(); + + let creds = identities + .iter() + .enumerate() + .map(|(index, (key_seed, key_pair))| { + SimpleV1Credential::new( + HkdfCryptoMaterial::new(key_seed, &metadata_key, key_pair.public()), + index, + ) + }) + .collect::<Vec<_>>(); + let cred_source = SliceCredentialSource::new(&creds); + + let identity_type = + *EncryptedIdentityDataElementType::iter().collect::<Vec<_>>().choose(&mut rng).unwrap(); + + let mut adv_builder = AdvBuilder::new(); + + let hkdf = np_hkdf::NpKeySeedHkdf::<CryptoProviderImpl>::new(chosen_key_seed); + let mut section_builder = adv_builder + .section_builder(MicEncrypted::new_random_salt( + &mut crypto_rng, + identity_type, + &metadata_key, + &hkdf, + )) + .unwrap(); + + let (expected_de_data, expected_des, orig_des) = + fill_section_random_des(&mut rng, &mut section_builder, 2); + + section_builder.add_to_advertisement(); + + let adv = adv_builder.into_advertisement(); + + let (remaining, header) = parse_adv_header(adv.as_slice()).unwrap(); + + let v1_header = if let AdvHeader::V1(h) = header { + h + } else { + panic!("incorrect header"); + }; + + let sections = parse_sections(&v1_header, remaining).unwrap(); + assert_eq!(1, sections.len()); + let (section, cred) = try_deserialize_all_creds::<_, _, CryptoProviderImpl>( + sections[0].as_ciphertext().unwrap(), + &cred_source, + ) + .unwrap() + .unwrap(); + + assert_eq!(&chosen_index, cred.matched_data()); + + assert_eq!(section.identity_type(), identity_type); + assert_eq!(section.verification_mode(), VerificationMode::Mic); + assert_eq!(section.metadata_key(), &metadata_key); + assert_eq!( + section.contents, + SectionContents { + section_header: (19 + 2 + 16 + total_de_len(&orig_des) + 16) as u8, + de_data: ArrayView::try_from_slice(expected_de_data.as_slice()).unwrap(), + data_elements: expected_des, + } + ); + assert_eq!( + section + .data_elements() + .map(|de| GenericDataElement::try_from(de.de_type(), de.contents()).unwrap()) + .collect::<Vec<_>>(), + orig_des + ); + } +} + +#[test] +fn deserialize_signature_encrypted_rand_identities_finds_correct_one() { + let mut rng = rand::rngs::StdRng::from_entropy(); + let mut crypto_rng = <CryptoProviderImpl as CryptoProvider>::CryptoRng::new(); + for _ in 0..100 { + let identities = (0..100).map(|_| (rng.gen(), KeyPair::generate())).collect::<Vec<_>>(); + + let chosen_index = rng.gen_range(0..identities.len()); + let (chosen_key_seed, chosen_key_pair) = &identities[chosen_index]; + + // share a metadata key to emphasize that we're _only_ using the identity to + // differentiate + let metadata_key: [u8; 16] = rng.gen(); + + let creds = identities + .iter() + .enumerate() + .map(|(index, (key_seed, key_pair))| { + let hkdf = np_hkdf::NpKeySeedHkdf::<CryptoProviderImpl>::new(key_seed); + let unsigned = + hkdf.extended_unsigned_metadata_key_hmac_key().calculate_hmac(&metadata_key); + let signed = + hkdf.extended_signed_metadata_key_hmac_key().calculate_hmac(&metadata_key); + SimpleV1Credential::new( + HkdfCryptoMaterial { + hkdf: *key_seed, + expected_unsigned_metadata_key_hmac: unsigned, + expected_signed_metadata_key_hmac: signed, + pub_key: key_pair.public().to_bytes(), + }, + index, + ) + }) + .collect::<Vec<_>>(); + let cred_source = SliceCredentialSource::new(&creds); + + let identity_type = + *EncryptedIdentityDataElementType::iter().collect::<Vec<_>>().choose(&mut rng).unwrap(); + + let mut adv_builder = AdvBuilder::new(); + + let hkdf = np_hkdf::NpKeySeedHkdf::<CryptoProviderImpl>::new(chosen_key_seed); + let mut section_builder = adv_builder + .section_builder(SignedEncrypted::new_random_salt( + &mut crypto_rng, + identity_type, + &metadata_key, + chosen_key_pair, + &hkdf, + )) + .unwrap(); + + let (expected_de_data, expected_des, orig_des) = + fill_section_random_des(&mut rng, &mut section_builder, 2); + + section_builder.add_to_advertisement(); + + let adv = adv_builder.into_advertisement(); + + let (remaining, header) = parse_adv_header(adv.as_slice()).unwrap(); + + let v1_header = if let AdvHeader::V1(h) = header { + h + } else { + panic!("incorrect header"); + }; + + let sections = parse_sections(&v1_header, remaining).unwrap(); + assert_eq!(1, sections.len()); + let (section, cred) = try_deserialize_all_creds::<_, _, CryptoProviderImpl>( + sections[0].as_ciphertext().unwrap(), + &cred_source, + ) + .unwrap() + .unwrap(); + + assert_eq!(&chosen_index, cred.matched_data()); + + assert_eq!(section.identity_type(), identity_type); + assert_eq!(section.verification_mode(), VerificationMode::Signature); + assert_eq!(section.metadata_key(), &metadata_key); + assert_eq!( + section.contents, + SectionContents { + section_header: (19 + 2 + 16 + 64 + total_de_len(&orig_des)) as u8, + de_data: ArrayView::try_from_slice(expected_de_data.as_slice()).unwrap(), + data_elements: expected_des, + } + ); + assert_eq!( + section + .data_elements() + .map(|de| GenericDataElement::try_from(de.de_type(), de.contents()).unwrap()) + .collect::<Vec<_>>(), + orig_des + ); + } +} + +#[test] +fn deserialize_encrypted_no_matching_identities_finds_nothing() { + let mut rng = rand::rngs::StdRng::from_entropy(); + let mut crypto_rng = <CryptoProviderImpl as CryptoProvider>::CryptoRng::new(); + for _ in 0..100 { + let signed = rng.gen(); + let mut identities = (0..100).map(|_| (rng.gen(), KeyPair::generate())).collect::<Vec<_>>(); + + let chosen_index = rng.gen_range(0..identities.len()); + // remove so they won't be found later + let (chosen_key_seed, chosen_key_pair) = identities.remove(chosen_index); + + // share a metadata key to emphasize that we're _only_ using the identity to + // differentiate + let metadata_key: [u8; 16] = rng.gen(); + + let credentials = identities + .iter() + .enumerate() + .map(|(index, (key_seed, key_pair))| { + SimpleV1Credential::new( + HkdfCryptoMaterial::new(key_seed, &metadata_key, key_pair.public()), + index, + ) + }) + .collect::<Vec<_>>(); + let cred_source = SliceCredentialSource::new(&credentials); + + let identity_type = + *EncryptedIdentityDataElementType::iter().collect::<Vec<_>>().choose(&mut rng).unwrap(); + + let mut adv_builder = AdvBuilder::new(); + + let hkdf = np_hkdf::NpKeySeedHkdf::<CryptoProviderImpl>::new(&chosen_key_seed); + + // awkward split because SectionIdentity isn't object-safe, so we can't just have a + // Box<dyn SectionIdentity> and use that in one code path + if signed { + let identity = SignedEncrypted::new_random_salt( + &mut crypto_rng, + identity_type, + &metadata_key, + &chosen_key_pair, + &hkdf, + ); + let mut section_builder = adv_builder.section_builder(identity).unwrap(); + let _ = fill_section_random_des(&mut rng, &mut section_builder, 2); + section_builder.add_to_advertisement(); + } else { + let identity = + MicEncrypted::new_random_salt(&mut crypto_rng, identity_type, &metadata_key, &hkdf); + let mut section_builder = adv_builder.section_builder(identity).unwrap(); + let _ = fill_section_random_des(&mut rng, &mut section_builder, 2); + section_builder.add_to_advertisement(); + }; + + let adv = adv_builder.into_advertisement(); + let (remaining, header) = parse_adv_header(adv.as_slice()).unwrap(); + let v1_header = if let AdvHeader::V1(h) = header { + h + } else { + panic!("incorrect header"); + }; + + let sections = parse_sections(&v1_header, remaining).unwrap(); + assert_eq!(1, sections.len()); + + assert!(try_deserialize_all_creds::<_, _, CryptoProviderImpl>( + sections[0].as_ciphertext().unwrap(), + &cred_source + ) + .unwrap() + .is_none()); + } +} + +#[test] +fn convert_data_elements_empty() { + let orig_des = vec![]; + + let (des, data) = convert_data_elements(&orig_des); + + assert_eq!(Vec::<OffsetDataElement>::new(), des); + assert_eq!(&Vec::<u8>::new(), data.as_slice()); +} + +#[test] +fn convert_data_elements_just_fits() { + // this is actually longer than any real section's worth of DEs could be since we aren't putting + // DE headers in the array + let orig_data = vec![0x33; 1000]; + + let orig_des = vec![ + RefDataElement { + offset: 2.into(), + header_len: 2, + de_type: 100_u32.into(), + contents: &orig_data[0..10], + }, + RefDataElement { + offset: 3.into(), + header_len: 2, + de_type: 101_u32.into(), + contents: &orig_data[10..100], + }, + RefDataElement { + offset: 4.into(), + header_len: 2, + de_type: 102_u32.into(), + contents: &orig_data[100..NP_ADV_MAX_SECTION_LEN], + }, + ]; + + let (des, data) = convert_data_elements(&orig_des); + + assert_eq!( + &[ + OffsetDataElement { + offset: 2.into(), + de_type: 100_u32.into(), + start_of_contents: 0, + contents_len: 10 + }, + OffsetDataElement { + offset: 3.into(), + de_type: 101_u32.into(), + start_of_contents: 10, + contents_len: 90 + }, + OffsetDataElement { + offset: 4.into(), + de_type: 102_u32.into(), + start_of_contents: 100, + contents_len: NP_ADV_MAX_SECTION_LEN - 100, + }, + ], + &des[..] + ); + assert_eq!(&[0x33; NP_ADV_MAX_SECTION_LEN], data.as_slice()); +} + +#[test] +#[should_panic] +fn convert_data_elements_doesnt_fit_panic() { + let orig_data = vec![0x33; 1000]; + let orig_des = vec![ + RefDataElement { + offset: 2.into(), + header_len: 2, + de_type: 100_u32.into(), + contents: &orig_data[0..10], + }, + // impossibly large DE + RefDataElement { + offset: 3.into(), + header_len: 2, + de_type: 101_u32.into(), + contents: &orig_data[10..500], + }, + ]; + + let _ = convert_data_elements(&orig_des); +} + +#[test] +fn section_des_expose_correct_data() { + let mut orig_data = Vec::new(); + orig_data.resize(130, 0); + for (index, byte) in orig_data.iter_mut().enumerate() { + *byte = index as u8; + } + + let orig_des = vec![ + OffsetDataElement { + offset: 2.into(), + de_type: 100_u32.into(), + start_of_contents: 0, + contents_len: 10, + }, + OffsetDataElement { + offset: 3.into(), + de_type: 101_u32.into(), + start_of_contents: 10, + contents_len: 90, + }, + OffsetDataElement { + offset: 4.into(), + de_type: 102_u32.into(), + start_of_contents: 100, + contents_len: 30, + }, + ]; + + let section = SectionContents { + section_header: 99, + de_data: ArrayView::try_from_slice(&orig_data).unwrap(), + data_elements: orig_des, + }; + + // extract out the parts of the DE we care about + let des = section + .data_elements() + .map(|de| (de.offset(), de.de_type(), de.contents().to_vec())) + .collect::<Vec<_>>(); + assert_eq!( + vec![ + (2.into(), 100_u32.into(), orig_data[0..10].to_vec()), + (3.into(), 101_u32.into(), orig_data[10..100].to_vec()), + (4.into(), 102_u32.into(), orig_data[100..].to_vec()) + ], + des + ); +} + +#[test] +fn do_deserialize_zero_section_header() { + let mut adv: tinyvec::ArrayVec<[u8; 254]> = tinyvec::ArrayVec::new(); + adv.push(0x20); // V1 Advertisement + adv.push(0x00); // Section header of 0 + let (remaining, header) = parse_adv_header(adv.as_slice()).unwrap(); + let v1_header = if let AdvHeader::V1(h) = header { + h + } else { + panic!("incorrect header"); + }; + parse_sections(&v1_header, remaining).expect_err("Expected an error"); +} + +#[test] +fn do_deserialize_empty_section() { + let adv_builder = AdvBuilder::new(); + let adv = adv_builder.into_advertisement(); + let (remaining, header) = parse_adv_header(adv.as_slice()).unwrap(); + let v1_header = if let AdvHeader::V1(h) = header { + h + } else { + panic!("incorrect header"); + }; + parse_sections(&v1_header, remaining).expect_err("Expected an error"); +} + +#[test] +fn do_deserialize_max_number_of_sections() { + let adv_builder = build_dummy_advertisement_sections(NP_V1_ADV_MAX_SECTION_COUNT); + let adv = adv_builder.into_advertisement(); + let (remaining, header) = parse_adv_header(adv.as_slice()).unwrap(); + + let v1_header = if let AdvHeader::V1(h) = header { + h + } else { + panic!("incorrect header"); + }; + + let sections = parse_sections(&v1_header, remaining).unwrap(); + assert_eq!(NP_V1_ADV_MAX_SECTION_COUNT, sections.len()); +} + +#[test] +fn try_deserialize_over_max_number_of_sections() { + let adv_builder = build_dummy_advertisement_sections(NP_V1_ADV_MAX_SECTION_COUNT); + let mut adv = adv_builder.into_advertisement().as_slice().to_vec(); + + // Push an extra section + adv.extend_from_slice( + [ + 0x01, // Section header + 0x03, // Public identity + ] + .as_slice(), + ); + + let (remaining, header) = parse_adv_header(&adv).unwrap(); + + let v1_header = if let AdvHeader::V1(h) = header { + h + } else { + panic!("incorrect header"); + }; + parse_sections(&v1_header, remaining) + .expect_err("Expected an error because number of sections is over 16"); +} + +pub(crate) fn random_de<R: rand::Rng>(rng: &mut R) -> GenericDataElement { + let mut array = [0_u8; MAX_DE_LEN]; + rng.fill(&mut array[..]); + let data: ArrayView<u8, MAX_DE_LEN> = + ArrayView::try_from_array(array, rng.gen_range(0..=MAX_DE_LEN)).unwrap(); + // skip the first few DEs that Google uses + GenericDataElement::try_from(rng.gen_range(20_u32..1000).into(), data.as_slice()).unwrap() +} + +fn do_deserialize_section_unencrypted<I: serialize::SectionIdentity>( + identity: I, + expected_identity: PlaintextIdentityMode, + prefix_len: usize, + de_offset: usize, +) { + let mut rng = rand::rngs::StdRng::from_entropy(); + + let mut adv_builder = AdvBuilder::new(); + let mut section_builder = adv_builder.section_builder(identity).unwrap(); + + let (expected_de_data, expected_des, orig_des) = + fill_section_random_des(&mut rng, &mut section_builder, de_offset); + + section_builder.add_to_advertisement(); + + let adv = adv_builder.into_advertisement(); + + let (remaining, header) = parse_adv_header(adv.as_slice()).unwrap(); + + let v1_header = if let AdvHeader::V1(h) = header { + h + } else { + panic!("incorrect header"); + }; + + let sections = parse_sections(&v1_header, remaining).unwrap(); + assert_eq!(1, sections.len()); + let section = sections[0].as_plaintext().unwrap(); + + assert_eq!( + &PlaintextSection { + identity: expected_identity, + contents: SectionContents { + section_header: (prefix_len + total_de_len(&orig_des)) as u8, + de_data: ArrayView::try_from_slice(expected_de_data.as_slice()).unwrap(), + data_elements: expected_des, + } + }, + section + ); + assert_eq!( + section + .contents + .data_elements() + .map(|de| GenericDataElement::try_from(de.de_type(), de.contents()).unwrap()) + .collect::<Vec<_>>(), + orig_des + ); +} + +fn fill_section_random_des<R: rand::Rng, I: serialize::SectionIdentity>( + mut rng: &mut R, + section_builder: &mut SectionBuilder<I>, + de_offset: usize, +) -> (Vec<u8>, Vec<OffsetDataElement>, Vec<GenericDataElement>) { + let mut expected_de_data = vec![]; + let mut expected_des = vec![]; + let mut orig_des = vec![]; + + for index in 0..rng.gen_range(1..10) { + let de = random_de(&mut rng); + + let de_clone = de.clone(); + if section_builder.add_de(|_| de_clone).is_err() { + break; + } + + let orig_len = expected_de_data.len(); + de.write_de_contents(&mut expected_de_data).unwrap(); + let contents_len = expected_de_data.len() - orig_len; + + expected_des.push(OffsetDataElement { + offset: (index as usize + de_offset).into(), + de_type: de.de_header().de_type, + contents_len, + start_of_contents: orig_len, + }); + orig_des.push(de); + } + (expected_de_data, expected_des, orig_des) +} + +fn total_de_len(des: &[GenericDataElement]) -> usize { + des.iter() + .map(|de| { + let mut buf = vec![]; + de.write_de_contents(&mut buf); + de.de_header().serialize().len() + buf.len() + }) + .sum() +} + +type TryDeserOutput<'c, C> = Option<(DecryptedSection, <C as MatchableCredential>::Matched<'c>)>; + +/// Returns: +/// - `Ok(Some)` if a matching credential was found +/// - `Ok(None)` if no matching credential was found, or if `cred_source` provides no credentials +/// - `Err` if an error occurred. +fn try_deserialize_all_creds<'c, C, S, P>( + section: &CiphertextSection, + cred_source: &'c S, +) -> Result<TryDeserOutput<'c, C>, BatchSectionDeserializeError> +where + C: V1Credential, + S: CredentialSource<C>, + P: CryptoProvider, +{ + for c in cred_source.iter() { + match section.try_deserialize::<C, P>(c) { + Ok(s) => return Ok(Some((s, c.matched()))), + Err(e) => match e { + SectionDeserializeError::IncorrectCredential => continue, + SectionDeserializeError::ParseError => { + return Err(BatchSectionDeserializeError::ParseError) + } + }, + } + } + + Ok(None) +} + +fn build_dummy_advertisement_sections(number_of_sections: usize) -> AdvBuilder { + let mut adv_builder = AdvBuilder::new(); + for _ in 0..number_of_sections { + let section_builder = adv_builder.section_builder(PublicIdentity::default()).unwrap(); + section_builder.add_to_advertisement(); + } + adv_builder +} + +#[derive(Debug, PartialEq, Eq)] +enum BatchSectionDeserializeError { + /// Advertisement data is malformed + ParseError, +}
diff --git a/nearby/presence/np_adv/src/extended/deserialize/test_stubs.rs b/nearby/presence/np_adv/src/extended/deserialize/test_stubs.rs new file mode 100644 index 0000000..437b997 --- /dev/null +++ b/nearby/presence/np_adv/src/extended/deserialize/test_stubs.rs
@@ -0,0 +1,115 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +extern crate std; + +use crypto_provider::{ed25519, CryptoProvider}; +use np_hkdf::{NpKeySeedHkdf, UnsignedSectionKeys}; +use std::prelude::rust_2021::*; + +use crate::{ + credential::v1::*, + extended::deserialize::{CiphertextSection, PlaintextSection}, + IntermediateSection, +}; + +pub(crate) struct HkdfCryptoMaterial { + pub(crate) hkdf: [u8; 32], + pub(crate) expected_unsigned_metadata_key_hmac: [u8; 32], + pub(crate) expected_signed_metadata_key_hmac: [u8; 32], + pub(crate) pub_key: ed25519::RawPublicKey, +} + +impl HkdfCryptoMaterial { + pub(crate) fn new<C: CryptoProvider>( + hkdf_key_seed: &[u8; 32], + metadata_key: &[u8; 16], + pub_key: np_ed25519::PublicKey<C>, + ) -> Self { + let hkdf = NpKeySeedHkdf::<C>::new(hkdf_key_seed); + let unsigned = + hkdf.extended_unsigned_metadata_key_hmac_key().calculate_hmac(metadata_key.as_slice()); + let signed = + hkdf.extended_signed_metadata_key_hmac_key().calculate_hmac(metadata_key.as_slice()); + Self { + hkdf: *hkdf_key_seed, + expected_unsigned_metadata_key_hmac: unsigned, + expected_signed_metadata_key_hmac: signed, + pub_key: pub_key.to_bytes(), + } + } +} + +impl HkdfCryptoMaterial { + fn hkdf<C: CryptoProvider>(&self) -> NpKeySeedHkdf<C> { + NpKeySeedHkdf::<C>::new(&self.hkdf) + } +} + +impl V1CryptoMaterial for HkdfCryptoMaterial { + type SignedIdentityResolverReference<'a> = SignedSectionIdentityResolutionMaterial + where Self: 'a; + type UnsignedIdentityResolverReference<'a> = UnsignedSectionIdentityResolutionMaterial + where Self: 'a; + + fn signed_identity_resolution_material<C: CryptoProvider>( + &self, + ) -> Self::SignedIdentityResolverReference<'_> { + SignedSectionIdentityResolutionMaterial::from_hkdf_and_expected_metadata_key_hmac::<C>( + &self.hkdf::<C>(), + self.expected_signed_metadata_key_hmac, + ) + } + fn unsigned_identity_resolution_material<C: CryptoProvider>( + &self, + ) -> Self::UnsignedIdentityResolverReference<'_> { + UnsignedSectionIdentityResolutionMaterial::from_hkdf_and_expected_metadata_key_hmac::<C>( + &self.hkdf::<C>(), + self.expected_unsigned_metadata_key_hmac, + ) + } + fn signed_verification_material<C: CryptoProvider>(&self) -> SignedSectionVerificationMaterial { + SignedSectionVerificationMaterial { pub_key: self.pub_key } + } + + fn unsigned_verification_material<C: CryptoProvider>( + &self, + ) -> UnsignedSectionVerificationMaterial { + let mic_hmac_key = *UnsignedSectionKeys::hmac_key(&self.hkdf::<C>()).as_bytes(); + UnsignedSectionVerificationMaterial { mic_hmac_key } + } +} + +pub(crate) trait IntermediateSectionExt { + /// Returns `Some` if `self` is `Plaintext` + fn as_plaintext(&self) -> Option<&PlaintextSection>; + /// Returns `Some` if `self` is `Ciphertext` + fn as_ciphertext(&self) -> Option<&CiphertextSection>; +} + +impl<'a> IntermediateSectionExt for IntermediateSection<'a> { + fn as_plaintext(&self) -> Option<&PlaintextSection> { + match self { + IntermediateSection::Plaintext(s) => Some(s), + IntermediateSection::Ciphertext(_) => None, + } + } + + fn as_ciphertext(&self) -> Option<&CiphertextSection> { + match self { + IntermediateSection::Plaintext(_) => None, + IntermediateSection::Ciphertext(s) => Some(s), + } + } +}
diff --git a/nearby/presence/np_adv/src/extended/mod.rs b/nearby/presence/np_adv/src/extended/mod.rs new file mode 100644 index 0000000..c2f485e --- /dev/null +++ b/nearby/presence/np_adv/src/extended/mod.rs
@@ -0,0 +1,90 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! V1 advertisement support. +use crate::extended::de_type::DeType; +use crate::DeLengthOutOfRange; +use array_view::ArrayView; + +pub mod data_elements; +pub mod de_type; +pub mod deserialize; +pub mod section_signature_payload; +pub mod serialize; + +/// Maximum size of an NP advertisement, including the adv header +pub const BLE_ADV_SVC_CONTENT_LEN: usize = 254 + // length and type bytes for svc data TLV + - 1 - 1 + // NP UUID + - 2; + +/// Maximum number of sections in an advertisement +pub const NP_V1_ADV_MAX_SECTION_COUNT: usize = 8; + +/// Maximum size of a NP section, including its header byte +pub const NP_ADV_MAX_SECTION_LEN: usize = BLE_ADV_SVC_CONTENT_LEN + // adv header byte + - 1; + +/// Max V1 DE length (7 bit length field). +pub(crate) const MAX_DE_LEN: usize = 127; + +const METADATA_KEY_LEN: usize = 16; + +/// Length of a DE's content -- must be in `[0, 127]` +#[derive(Debug, PartialEq, Eq, Clone, Copy)] +pub struct DeLength { + len: u8, +} + +impl DeLength { + /// A convenient constant for zero length. + pub const ZERO: DeLength = DeLength { len: 0 }; + + fn as_usize(&self) -> usize { + self.len as usize + } +} + +impl TryFrom<u8> for DeLength { + type Error = DeLengthOutOfRange; + + fn try_from(value: u8) -> Result<Self, Self::Error> { + if value as usize <= MAX_DE_LEN { + Ok(Self { len: value }) + } else { + Err(DeLengthOutOfRange {}) + } + } +} + +impl TryFrom<usize> for DeLength { + type Error = DeLengthOutOfRange; + + fn try_from(value: usize) -> Result<Self, Self::Error> { + value.try_into().map_err(|_e| DeLengthOutOfRange).and_then(|num: u8| num.try_into()) + } +} + +/// Convert a tinyvec into an equivalent ArrayView +fn to_array_view<T, const N: usize>(vec: tinyvec::ArrayVec<[T; N]>) -> ArrayView<T, N> +where + [T; N]: tinyvec::Array, +{ + let len = vec.len(); + ArrayView::try_from_array(vec.into_inner(), len).expect("len is from original vec") +} + +pub(crate) const ENCRYPTION_INFO_DE_TYPE: DeType = DeType::const_from(0x10);
diff --git a/nearby/presence/np_adv/src/extended/section_signature_payload.rs b/nearby/presence/np_adv/src/extended/section_signature_payload.rs new file mode 100644 index 0000000..2b0ebe5 --- /dev/null +++ b/nearby/presence/np_adv/src/extended/section_signature_payload.rs
@@ -0,0 +1,142 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! V1 advertisement section np_ed25519 signature payload +//! after the included context bytes, and utilities for +//! performing signatures and signature verification. + +use crate::extended::deserialize::EncryptionInfo; +use crate::NP_SVC_UUID; +use crypto_provider::{aes::ctr::AesCtrNonce, CryptoProvider}; +use sink::{Sink, SinkWriter}; + +/// A struct representing the necessary contents +/// of an v1 advertisement section np_ed25519 signature payload which +/// come after the context prefix (shared among all advs). +pub(crate) struct SectionSignaturePayload<'a> { + /// Advertisement header byte + adv_header_byte: u8, + /// Header byte for the v1 section being signed + section_header: u8, + /// Reference to the complete contents of the [`EncryptionInfo`] DE. + encryption_info: &'a [u8; EncryptionInfo::TOTAL_DE_LEN], + /// Reference to the derived salt (IV) for the section + nonce_ref: &'a AesCtrNonce, + /// Reference to all remaining information after the derived salt, but + /// not including the signature itself [which gets tacked onto the end]. + after_iv_info: AfterIVInfo<'a>, +} + +/// Representation of the plaintext information in an advertisement +/// signature payload which comes after the derived salt +enum AfterIVInfo<'a> { + /// Reference to a raw byte array containing all information + /// to be included in the signature payload after the derived salt, + /// and before the signature itself. + Raw(&'a [u8]), + /// References to the plaintext identity DE header and the rest + /// of the section plaintext after that (includes the plaintext + /// identity DE payload). + IdentityHeaderThenRaw([u8; 2], &'a [u8]), +} + +const ADV_SIGNATURE_CONTEXT: np_ed25519::SignatureContext = { + match np_ed25519::SignatureContext::from_string_bytes("Advertisement Signed Section") { + Ok(x) => x, + Err(_) => panic!(), + } +}; + +impl<'a> SectionSignaturePayload<'a> { + /// Construct a section signature payload using parts typically found during + /// serialization of advertisements. + pub(crate) fn from_serialized_parts( + adv_header_byte: u8, + section_header: u8, + encryption_info: &'a [u8; EncryptionInfo::TOTAL_DE_LEN], + nonce_ref: &'a AesCtrNonce, + raw_after_iv_info: &'a [u8], + ) -> Self { + Self { + adv_header_byte, + section_header, + encryption_info, + nonce_ref, + after_iv_info: AfterIVInfo::Raw(raw_after_iv_info), + } + } + + /// Construct a section signature payload using parts typically found during + /// deserialization of advertisements. + pub(crate) fn from_deserialized_parts( + adv_header_byte: u8, + section_header: u8, + encryption_info: &'a [u8; EncryptionInfo::TOTAL_DE_LEN], + nonce_ref: &'a AesCtrNonce, + identity_header: [u8; 2], + raw_after_identity_header_info: &'a [u8], + ) -> Self { + Self { + adv_header_byte, + section_header, + encryption_info, + nonce_ref, + after_iv_info: AfterIVInfo::IdentityHeaderThenRaw( + identity_header, + raw_after_identity_header_info, + ), + } + } + + /// Generates a signature for this section signing payload using + /// the given Ed25519 key-pair. + pub(crate) fn sign<C: CryptoProvider>( + self, + key_pair: &np_ed25519::KeyPair<C>, + ) -> np_ed25519::Signature<C> { + key_pair + .sign_with_context(&ADV_SIGNATURE_CONTEXT, self) + .expect("section signature payloads should fit in signature buffer") + } + /// Verifies a signature for this section signing payload using + /// the given Ed25519 public key. + pub(crate) fn verify<C: CryptoProvider>( + self, + signature: &np_ed25519::Signature<C>, + public_key: &np_ed25519::PublicKey<C>, + ) -> Result<(), np_ed25519::SignatureVerificationError> { + public_key.verify_signature_with_context(&ADV_SIGNATURE_CONTEXT, self, signature) + } +} + +impl<'a> SinkWriter for SectionSignaturePayload<'a> { + type DataType = u8; + + fn write_payload<S: Sink<u8> + ?Sized>(self, sink: &mut S) -> Option<()> { + sink.try_extend_from_slice(&NP_SVC_UUID)?; + sink.try_push(self.adv_header_byte)?; + sink.try_push(self.section_header)?; + sink.try_extend_from_slice(self.encryption_info)?; + sink.try_extend_from_slice(self.nonce_ref)?; + + // identity DE and the rest of the DEs except for the suffix + match self.after_iv_info { + AfterIVInfo::Raw(s) => sink.try_extend_from_slice(s), + AfterIVInfo::IdentityHeaderThenRaw(identity_header, s) => { + sink.try_extend_from_slice(&identity_header)?; + sink.try_extend_from_slice(s) + } + } + } +}
diff --git a/nearby/presence/np_adv/src/extended/serialize/adv_tests.rs b/nearby/presence/np_adv/src/extended/serialize/adv_tests.rs new file mode 100644 index 0000000..47804ea --- /dev/null +++ b/nearby/presence/np_adv/src/extended/serialize/adv_tests.rs
@@ -0,0 +1,183 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +extern crate std; +use super::*; +use crate::extended::serialize::section_tests::{fill_section_builder, DummyDataElement}; +use np_hkdf::v1_salt::DataElementOffset; +use std::{prelude::rust_2021::*, vec}; + +#[test] +fn adv_encode_no_salt() { + let mut adv_builder = AdvBuilder::new(); + + let mut no_identity_section_builder = + adv_builder.section_builder(PublicIdentity::default()).unwrap(); + no_identity_section_builder + .add_de(|_| DummyDataElement { de_type: 20_u32.into(), data: vec![] }) + .unwrap(); + + no_identity_section_builder.add_to_advertisement(); + + let mut public_identity_section_builder = + adv_builder.section_builder(PublicIdentity::default()).unwrap(); + public_identity_section_builder + .add_de(|_| DummyDataElement { de_type: 30_u32.into(), data: vec![] }) + .unwrap(); + + public_identity_section_builder.add_to_advertisement(); + + assert_eq!( + &[ + 0x20, // adv header + 0x3, // section header + 0x3, // public identity + 0x80, 20, // de header + 0x3, // section header + 0x3, // public identity + 0x80, 30, // de header + ], + adv_builder.into_advertisement().as_slice() + ) +} + +#[test] +fn adv_encode_with_salt() { + let mut adv_builder = AdvBuilder::new(); + + let mut no_identity_section_builder = + adv_builder.section_builder(PublicIdentity::default()).unwrap(); + no_identity_section_builder + .add_de(|_| DummyDataElement { de_type: 20_u32.into(), data: vec![] }) + .unwrap(); + + no_identity_section_builder.add_to_advertisement(); + + let mut public_identity_section_builder = + adv_builder.section_builder(PublicIdentity::default()).unwrap(); + public_identity_section_builder + .add_de(|_| DummyDataElement { de_type: 30_u32.into(), data: vec![] }) + .unwrap(); + + public_identity_section_builder.add_to_advertisement(); + + let mut expected = vec![ + 0x20, // adv header + ]; + expected.extend_from_slice(&[ + 0x3, // section header + 0x3, // public identity + 0x80, 20, // de header + 0x3, // section header + 0x3, // public identity + 0x80, 30, // de header + ]); + assert_eq!(expected, adv_builder.into_advertisement().as_slice()) +} + +#[test] +fn adding_any_allowed_section_length_always_works_for_single_section() { + // up to section len - 1 to leave room for section header + for section_contents_len in 0..NP_ADV_MAX_SECTION_LEN - 1 { + let mut adv_builder = AdvBuilder::new(); + let mut section_builder = adv_builder.section_builder(PublicIdentity::default()).unwrap(); + fill_section_builder(section_contents_len, &mut section_builder); + + section_builder.add_to_advertisement(); + + let adv = adv_builder.into_advertisement(); + assert_eq!( + section_contents_len + 1 + 1 + 1, // adv and section headers and identity + adv.as_slice().len(), + "adv: {:?}\nsection contents len: {}", + adv.as_slice(), + section_contents_len + ); + } +} + +#[test] +fn adding_any_allowed_section_length_always_works_for_two_sections() { + // leave room for both section header bytes and the public identities + for section_1_contents_len in 0..=NP_ADV_MAX_SECTION_LEN - 4 { + // leave room for both section headers + public identities + section 1 contents + for section_2_contents_len in 0..=NP_ADV_MAX_SECTION_LEN - section_1_contents_len - 4 { + let mut adv_builder = AdvBuilder::new(); + + let mut section_1_builder = + adv_builder.section_builder(PublicIdentity::default()).unwrap(); + fill_section_builder(section_1_contents_len, &mut section_1_builder); + section_1_builder.add_to_advertisement(); + + let mut section_2_builder = + adv_builder.section_builder(PublicIdentity::default()).unwrap(); + fill_section_builder(section_2_contents_len, &mut section_2_builder); + section_2_builder.add_to_advertisement(); + + let adv = adv_builder.into_advertisement(); + assert_eq!( + section_1_contents_len + section_2_contents_len + 1 + 4, // adv and section headers + adv.as_slice().len(), + "adv: {:?}\nsection 1 contents len: {}, section 2 contents len: {}", + adv.as_slice(), + section_1_contents_len, + section_2_contents_len, + ); + } + } +} + +#[test] +fn building_capacity_0_section_works() { + let mut adv_builder = AdvBuilder::new(); + + let mut section_builder = adv_builder.section_builder(PublicIdentity::default()).unwrap(); + + // leave room for two section headers and the public identities + fill_section_builder(NP_ADV_MAX_SECTION_LEN - 4, &mut section_builder); + section_builder.add_to_advertisement(); + + let section_builder = adv_builder.section_builder(PublicIdentity::default()).unwrap(); + // The section header and the public identity + assert_eq!(2, section_builder.section.capacity); + assert_eq!(2, section_builder.section.len()); + section_builder.add_to_advertisement(); + + assert_eq!(BLE_ADV_SVC_CONTENT_LEN, adv_builder.into_advertisement().as_slice().len()); +} + +/// A placeholder identity with a huge prefix +#[derive(Default, PartialEq, Eq, Debug)] +struct EnormousIdentity {} + +impl SectionIdentity for EnormousIdentity { + const PREFIX_LEN: usize = 200; + const SUFFIX_LEN: usize = 0; + const INITIAL_DE_OFFSET: DataElementOffset = DataElementOffset::ZERO; + + fn postprocess( + &mut self, + _adv_header_byte: u8, + _section_header: u8, + _section_contents: &mut [u8], + ) { + panic!("should never be called, just used for its huge prefix") + } + + type DerivedSalt = (); + + fn de_salt(&self, _de_offset: DataElementOffset) -> Self::DerivedSalt { + panic!("should never be called, just used for its huge prefix") + } +}
diff --git a/nearby/presence/np_adv/src/extended/serialize/de_header_tests.rs b/nearby/presence/np_adv/src/extended/serialize/de_header_tests.rs new file mode 100644 index 0000000..eda8b69 --- /dev/null +++ b/nearby/presence/np_adv/src/extended/serialize/de_header_tests.rs
@@ -0,0 +1,122 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +use super::*; +use crate::extended::deserialize; +use core::cmp; +use rand_ext::rand; +use rand_ext::rand::{distributions, Rng as _}; + +#[test] +fn de_header_1_byte_0s() { + let hdr = DeHeader { de_type: 0_u32.into(), len: 0_u8.try_into().unwrap() }; + + assert_eq!(&[0x00], hdr.serialize().as_slice()); +} + +#[test] +fn de_header_1_byte_max() { + let hdr = DeHeader { de_type: 15_u32.into(), len: 7_u8.try_into().unwrap() }; + + assert_eq!(&[0x7F], hdr.serialize().as_slice()); +} + +#[test] +fn de_header_2_byte_len_too_big() { + let hdr = DeHeader { de_type: 15_u32.into(), len: 8_u8.try_into().unwrap() }; + + assert_eq!(&[0x88, 0x0F], hdr.serialize().as_slice()); +} + +#[test] +fn de_header_2_byte_type_too_big() { + let hdr = DeHeader { de_type: 16_u32.into(), len: 7_u8.try_into().unwrap() }; + + assert_eq!(&[0x87, 0x10], hdr.serialize().as_slice()); +} + +#[test] +fn de_header_max() { + let hdr = DeHeader { de_type: u32::MAX.into(), len: 127_u8.try_into().unwrap() }; + assert_eq!( + // first type byte has 3x 0 bits because there are 35 total bits in 5 chunks of 7 bits, but + // only 32 bits to start with + &[0xFF, 0x8F, 0xFF, 0xFF, 0xFF, 0x7F], + hdr.serialize().as_slice() + ); +} + +#[test] +fn de_header_special_values() { + for de_type in [0_u32, 1, 15, 16, u32::MAX - 1, u32::MAX].iter().map(|t| DeType::from(*t)) { + for len in [0_u8, 1, 7, 8, 126, 127].iter().map(|l| DeLength::try_from(*l).unwrap()) { + let hdr = DeHeader { de_type, len }; + let buf = hdr.serialize(); + let header_len = expected_header_len(hdr); + + assert_eq!(header_len as usize, buf.len()); + + let (_, deser) = deserialize::DeHeader::parse(buf.as_slice()).unwrap(); + + assert_eq!( + deserialize::DeHeader { de_type, contents_len: len, header_bytes: buf }, + deser + ) + } + } +} + +#[test] +fn de_header_random_roundtrip() { + let mut rng = rand_ext::seeded_rng(); + + for _ in 0..100_000 { + let hdr = DeHeader { de_type: rng.gen(), len: rng.gen() }; + let buf = hdr.serialize(); + let header_len = expected_header_len(hdr); + + assert_eq!(header_len as usize, buf.len()); + let (_, deser) = deserialize::DeHeader::parse(buf.as_slice()).unwrap(); + + assert_eq!( + deserialize::DeHeader { + de_type: hdr.de_type, + contents_len: hdr.len, + header_bytes: buf + }, + deser + ) + } +} + +fn expected_header_len(hdr: DeHeader) -> u8 { + if hdr.de_type.as_u32() <= 15 && hdr.len.len <= 7 { + 1 + } else { + // at least one type byte to handle the type = 0 case + 1_u8 + cmp::max(1, (32 - hdr.de_type.as_u32().leading_zeros() as u8 + 6) / 7) + } +} + +impl distributions::Distribution<DeLength> for distributions::Standard { + fn sample<R: rand::Rng + ?Sized>(&self, rng: &mut R) -> DeLength { + DeLength::try_from(rng.gen_range(0_u8..128)).unwrap() + } +} + +impl distributions::Distribution<DeType> for distributions::Standard { + fn sample<R: rand::Rng + ?Sized>(&self, rng: &mut R) -> DeType { + rng.gen::<u32>().into() + } +}
diff --git a/nearby/presence/np_adv/src/extended/serialize/mod.rs b/nearby/presence/np_adv/src/extended/serialize/mod.rs new file mode 100644 index 0000000..6cedd1e --- /dev/null +++ b/nearby/presence/np_adv/src/extended/serialize/mod.rs
@@ -0,0 +1,865 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! Serialization support for V1 advertisements. +//! +//! # Examples +//! +//! Serialize some DEs without an adv salt: +//! +//! ``` +//! use np_adv::{ +//! extended::{data_elements::*, serialize::*, de_type::DeType }, +//! PublicIdentity +//! }; +//! use np_adv::shared_data::TxPower; +//! +//! // no section identities or DEs need salt in this example +//! let mut adv_builder = AdvBuilder::new(); +//! let mut section_builder = adv_builder.section_builder(PublicIdentity::default()).unwrap(); +//! +//! section_builder.add_de(|_salt| TxPowerDataElement::from(TxPower::try_from(3).unwrap())).unwrap(); +//! +//! // add some other DE with type = 1000 +//! section_builder.add_de_res(|_salt| +//! GenericDataElement::try_from( DeType::from(1000_u32), &[10, 11, 12, 13]) +//! ).unwrap(); +//! +//! section_builder.add_to_advertisement(); +//! +//! assert_eq!( +//! &[ +//! 0x20, // adv header +//! 10, // section header +//! 0x03, // public identity +//! 0x15, 3, // tx power +//! 0x84, 0x87, 0x68, 10, 11, 12, 13, // other DE +//! ], +//! adv_builder.into_advertisement().as_slice() +//! ); +//! ``` +//! +//! Serialize some DEs in an adv with an encrypted section: +//! +//! ``` +//! use np_adv::{ +//! de_type::EncryptedIdentityDataElementType, +//! extended::{data_elements::*, serialize::*, de_type::DeType }, +//! }; +//! use rand::{Rng as _, SeedableRng as _}; +//! use crypto_provider::{CryptoProvider, CryptoRng}; +//! use crypto_provider_default::CryptoProviderImpl; +//! use np_adv::shared_data::TxPower; +//! +//! let mut adv_builder = AdvBuilder::new(); +//! +//! // these would come from the credential//! +//! let mut rng = <CryptoProviderImpl as CryptoProvider>::CryptoRng::new(); +//! let metadata_key: [u8; 16] = rng.gen(); +//! let key_seed: [u8; 32] = rng.gen(); +//! // use your preferred crypto impl +//! let key_seed_hkdf = np_hkdf::NpKeySeedHkdf::<CryptoProviderImpl>::new(&key_seed); +//! +//! let mut section_builder = adv_builder.section_builder(MicEncrypted::new_random_salt( +//! &mut rng, +//! EncryptedIdentityDataElementType::Private, +//! &metadata_key, +//! &key_seed_hkdf, +//! )).unwrap(); +//! +//! section_builder.add_de(|_salt| TxPowerDataElement::from(TxPower::try_from(3).unwrap())).unwrap(); +//! +//! // add some other DE with type = 1000 +//! section_builder.add_de_res(|salt| +//! GenericDataElement::try_from( +//! DeType::from(1000_u32), +//! &do_fancy_crypto(salt.derive::<16>().expect("16 is a valid HKDF length"))) +//! ).unwrap(); +//! +//! section_builder.add_to_advertisement(); +//! +//! // can't assert much about this since most of it is random +//! assert_eq!( +//! 0x20, // adv header +//! adv_builder.into_advertisement().as_slice()[0] +//! ); +//! +//! // A hypothetical function that uses the per-DE derived salt to do something like encrypt or +//! // otherwise scramble data +//! fn do_fancy_crypto(derived_salt: [u8; 16]) -> [u8; 16] { +//! // flipping bits is just a nonsense example, do something real here +//! derived_salt.iter().map(|b| !b) +//! .collect::<Vec<_>>() +//! .try_into().expect("array sizes match") +//! } +//! ``` +use crate::extended::NP_V1_ADV_MAX_SECTION_COUNT; +use crate::{ + de_type::{EncryptedIdentityDataElementType, IdentityDataElementType}, + extended::{ + data_elements::EncryptionInfoDataElement, + de_type::{DeType, ExtendedDataElementType}, + deserialize::{EncryptedIdentityMetadata, EncryptionInfo, SectionMic}, + section_signature_payload::*, + to_array_view, DeLength, BLE_ADV_SVC_CONTENT_LEN, NP_ADV_MAX_SECTION_LEN, + }, + DeLengthOutOfRange, PublicIdentity, NP_SVC_UUID, +}; +use array_view::ArrayView; +use core::fmt; +use core::marker::PhantomData; +use crypto_provider::{ + aes::{ + ctr::{AesCtr, AesCtrNonce, NonceAndCounter}, + Aes128Key, + }, + hmac::Hmac, + CryptoProvider, CryptoRng, +}; +use np_hkdf::v1_salt; +use np_hkdf::v1_salt::{DataElementOffset, V1Salt}; +use sink::Sink; + +#[cfg(test)] +pub(crate) mod adv_tests; +#[cfg(test)] +mod de_header_tests; +#[cfg(test)] +pub(crate) mod section_tests; +#[cfg(test)] +mod test_vectors; + +/// Builder for V1 advertisements. +#[derive(Debug)] +pub struct AdvBuilder { + /// Contains the adv header byte + adv: tinyvec::ArrayVec<[u8; BLE_ADV_SVC_CONTENT_LEN]>, + section_count: usize, +} + +impl AdvBuilder { + /// Build an [AdvBuilder]. + pub fn new() -> AdvBuilder { + let mut adv = tinyvec::ArrayVec::new(); + // version 1, 0bVVVRRRRR + adv.push(0b00100000); + + AdvBuilder { adv, section_count: 0 } + } + + /// Create a section builder. + /// + /// Returns `Err` if there isn't room in the advertisement for the section at its minimum length + /// with its chosen identity. + /// + /// The builder will not accept more DEs than can fit given the space already used in the + /// advertisement by previous sections, if any. + /// + /// Once the builder is populated, add it to the originating advertisement with + /// [SectionBuilder.add_to_advertisement]. + pub fn section_builder<I: SectionIdentity>( + &mut self, + identity: I, + ) -> Result<SectionBuilder<I>, AddSectionError> { + // section header and identity prefix + let prefix_len = 1 + I::PREFIX_LEN; + let minimum_section_len = prefix_len + I::SUFFIX_LEN; + // the max overall len available to the section + let available_len = self.adv.capacity() - self.adv.len(); + + if available_len < minimum_section_len { + return Err(AddSectionError::InsufficientAdvSpace); + } + + if self.section_count >= NP_V1_ADV_MAX_SECTION_COUNT { + return Err(AddSectionError::MaxSectionCountExceeded); + } + + let mut section = tinyvec::ArrayVec::new(); + // placeholder for section header and identity prefix + section.resize(prefix_len, 0); + + Ok(SectionBuilder { + section: CapacityLimitedVec { + vec: section, + // won't underflow: checked above + capacity: available_len - I::SUFFIX_LEN, + }, + identity, + adv_builder: self, + next_de_offset: I::INITIAL_DE_OFFSET, + }) + } + + /// Convert the builder into an encoded advertisement. + pub fn into_advertisement(self) -> EncodedAdvertisement { + EncodedAdvertisement { adv: to_array_view(self.adv) } + } + + /// Add the section, which must have come from a SectionBuilder generated from this, into this + /// advertisement. + fn add_section(&mut self, section: EncodedSection) { + self.adv + .try_extend_from_slice(section.as_slice()) + .expect("section capacity enforced in the section builder"); + self.section_count += 1; + } + + fn header_byte(&self) -> u8 { + self.adv[0] + } +} + +impl Default for AdvBuilder { + fn default() -> Self { + Self::new() + } +} + +/// Errors that can occur when adding a section to an advertisement +#[derive(Debug, PartialEq, Eq)] +pub enum AddSectionError { + /// The advertisement doesn't have enough space to hold the minimum size of the section + InsufficientAdvSpace, + /// The advertisement can only hold a maximum of NP_V1_ADV_MAX_SECTION_COUNT number of sections + MaxSectionCountExceeded, +} + +/// Derived salt for an individual data element. +pub struct DeSalt<C: CryptoProvider> { + salt: V1Salt<C>, + de_offset: DataElementOffset, +} + +impl<C: CryptoProvider> DeSalt<C> { + /// Derive salt of the requested length. + /// + /// The length must be a valid HKDF-SHA256 length. + pub fn derive<const N: usize>(&self) -> Option<[u8; N]> { + self.salt.derive(Some(self.de_offset)) + } +} + +/// An encoded NP V1 advertisement, starting with the NP advertisement header byte. +#[derive(Debug, PartialEq, Eq)] +pub struct EncodedAdvertisement { + adv: ArrayView<u8, BLE_ADV_SVC_CONTENT_LEN>, +} + +impl EncodedAdvertisement { + /// Returns the advertisement as a slice. + pub fn as_slice(&self) -> &[u8] { + self.adv.as_slice() + } +} + +/// The encoded form of an advertisement section +type EncodedSection = ArrayView<u8, NP_ADV_MAX_SECTION_LEN>; + +/// Accumulates data elements and encodes them into a section. +#[derive(Debug)] +pub struct SectionBuilder<'a, I: SectionIdentity> { + /// Contains the section header, the identity-specified overhead, and any DEs added + pub(crate) section: CapacityLimitedVec<u8, NP_ADV_MAX_SECTION_LEN>, + identity: I, + /// mut ref to enforce only one active section builder at a time + adv_builder: &'a mut AdvBuilder, + next_de_offset: DataElementOffset, +} + +impl<'a, I: SectionIdentity> SectionBuilder<'a, I> { + /// Add this builder to the advertisement that created it. + pub fn add_to_advertisement(self) { + let adv_builder = self.adv_builder; + adv_builder.add_section(Self::build_section( + self.section.into_inner(), + self.identity, + adv_builder, + )) + } + + /// Add a data element to the section with a closure that returns a `Result`. + /// + /// The provided `build_de` closure will be invoked with the derived salt for this DE. + pub fn add_de_res<W: WriteDataElement, E, F: FnOnce(I::DerivedSalt) -> Result<W, E>>( + &mut self, + build_de: F, + ) -> Result<(), AddDataElementError<E>> { + let writer = build_de(self.identity.de_salt(self.next_de_offset)) + .map_err(AddDataElementError::BuildDeError)?; + + let orig_len = self.section.len(); + // since we own the writer, and it's immutable, no race risk writing header w/ len then + // the contents as long as it's not simply an incorrect impl + let de_header = writer.de_header(); + let content_len = self + .section + .try_extend_from_slice(de_header.serialize().as_slice()) + .ok_or(AddDataElementError::InsufficientSectionSpace) + .and_then(|_| { + let after_header_len = self.section.len(); + writer + .write_de_contents(&mut self.section) + .ok_or(AddDataElementError::InsufficientSectionSpace) + .map(|_| self.section.len() - after_header_len) + }) + .map_err(|e| { + // if anything went wrong, truncate any partial writes (e.g. just the header) + self.section.truncate(orig_len); + e + })?; + + if content_len != de_header.len.as_usize() { + panic!( + "Buggy WriteDataElement impl: header len {}, actual written len {}", + de_header.len.as_usize(), + content_len + ); + } + + self.next_de_offset = self.next_de_offset.incremented(); + + Ok(()) + } + + /// Add a data element to the section with a closure that returns the data element directly. + /// + /// The provided `build_de` closure will be invoked with the derived salt for this DE. + pub fn add_de<W: WriteDataElement, F: FnOnce(I::DerivedSalt) -> W>( + &mut self, + build_de: F, + ) -> Result<(), AddDataElementError<()>> { + self.add_de_res(|derived_salt| Ok::<_, ()>(build_de(derived_salt))) + } + + /// Convert a section builder's contents into an encoded section. + /// + /// Implemented without self to avoid partial-move issues. + fn build_section( + mut section_contents: tinyvec::ArrayVec<[u8; NP_ADV_MAX_SECTION_LEN]>, + mut identity: I, + adv_builder: &AdvBuilder, + ) -> EncodedSection { + // there is space because the capacity for DEs was restricted to allow it + section_contents.resize(section_contents.len() + I::SUFFIX_LEN, 0); + + section_contents[0] = section_contents + .len() + .try_into() + .ok() + .and_then(|len: u8| len.checked_sub(1)) + .expect("section length is always <=255 and non-negative"); + + identity.postprocess( + adv_builder.header_byte(), + section_contents[0], + &mut section_contents[1..], + ); + + to_array_view(section_contents) + } +} + +/// Errors for adding a DE to a section +#[derive(Debug, PartialEq, Eq)] +pub enum AddDataElementError<E> { + /// An error occurred when invoking the DE builder closure. + BuildDeError(E), + /// Too much data to fit into the section + InsufficientSectionSpace, +} + +/// The identity used for an individual section. +pub trait SectionIdentity { + /// How much space needs to be reserved for this identity's prefix bytes after the section + /// header and before other DEs + const PREFIX_LEN: usize; + + /// How much space needs to be reserved after the DEs + const SUFFIX_LEN: usize; + + /// The DE offset to use for any DEs added to the section + const INITIAL_DE_OFFSET: DataElementOffset; + + /// Postprocess the contents of the section (the data after the section header byte), which will + /// start with [Self::PREFIX_LEN] bytes set aside for the identity's use, and similarly end with + /// [Self::SUFFIX_LEN] bytes, with DEs (if any) in the middle. + fn postprocess(&mut self, adv_header_byte: u8, section_header: u8, section_contents: &mut [u8]); + + /// The type of derived salt produced for a DE sharing a section with this identity. + type DerivedSalt; + + /// Produce a `Self::Output` salt for a DE. + fn de_salt(&self, de_offset: DataElementOffset) -> Self::DerivedSalt; +} + +impl SectionIdentity for PublicIdentity { + /// 1 byte of public identity DE header + const PREFIX_LEN: usize = 1; + const SUFFIX_LEN: usize = 0; + /// Room for the public DE + const INITIAL_DE_OFFSET: DataElementOffset = DataElementOffset::ZERO.incremented(); + + fn postprocess( + &mut self, + _adv_header_byte: u8, + _section_header: u8, + section_contents: &mut [u8], + ) { + section_contents[0..1].copy_from_slice( + DeHeader { len: DeLength::ZERO, de_type: IdentityDataElementType::Public.type_code() } + .serialize() + .as_slice(), + ) + } + + type DerivedSalt = (); + + fn de_salt(&self, _de_offset: DataElementOffset) -> Self::DerivedSalt {} +} + +/// Encrypts the data elements and protects integrity with a MIC using key material derived from +/// an NP identity. +pub struct MicEncrypted<'a, C: CryptoProvider> { + identity_type: EncryptedIdentityDataElementType, + salt: V1Salt<C>, + identity_payload: &'a [u8; 16], + aes_key: Aes128Key, + mic_hmac_key: np_hkdf::NpHmacSha256Key<C>, +} + +impl<'a, C: CryptoProvider> MicEncrypted<'a, C> { + /// Build a [MicEncrypted] from the provided identity info with a random salt. + pub fn new_random_salt( + rng: &mut C::CryptoRng, + identity_type: EncryptedIdentityDataElementType, + identity_payload: &'a [u8; 16], + keys: &impl np_hkdf::UnsignedSectionKeys<C>, + ) -> Self { + let salt: V1Salt<C> = rng.gen::<[u8; 16]>().into(); + Self::new(identity_type, salt, identity_payload, keys) + } + + /// Build a [MicEncrypted] from the provided identity info. + fn new( + identity_type: EncryptedIdentityDataElementType, + salt: V1Salt<C>, + identity_payload: &'a [u8; 16], + keys: &impl np_hkdf::UnsignedSectionKeys<C>, + ) -> Self { + MicEncrypted { + identity_type, + salt, + identity_payload, + aes_key: keys.aes_key(), + mic_hmac_key: keys.hmac_key(), + } + } + + /// Build a [MicEncrypted] from the provided identity info. Exposed outside of this crate for + /// testing purposes only. + #[cfg(any(test, feature = "testing"))] + pub fn new_for_testing( + identity_type: EncryptedIdentityDataElementType, + salt: V1Salt<C>, + identity_payload: &'a [u8; 16], + keys: &impl np_hkdf::UnsignedSectionKeys<C>, + ) -> Self { + Self::new(identity_type, salt, identity_payload, keys) + } +} + +impl<'a, C: CryptoProvider> SectionIdentity for MicEncrypted<'a, C> { + const PREFIX_LEN: usize = + EncryptionInfo::TOTAL_DE_LEN + EncryptedIdentityMetadata::TOTAL_DE_LEN; + /// Length of mic + const SUFFIX_LEN: usize = SectionMic::CONTENTS_LEN; + /// Room for the mic, encryption info, and identity DEs + const INITIAL_DE_OFFSET: DataElementOffset = + DataElementOffset::ZERO.incremented().incremented(); + + fn postprocess( + &mut self, + adv_header_byte: u8, + section_header: u8, + section_contents: &mut [u8], + ) { + // prefix byte layout: + // 0-18: Encryption Info DE (header + scheme + salt) + // 19-20: Identity DE header + // 21-36: Identity DE contents (metadata key) + + // Encryption Info DE + let encryption_info_bytes = EncryptionInfoDataElement::mic( + self.salt.as_slice().try_into().expect("Salt should be 16 bytes"), + ) + .serialize(); + section_contents[0..19].copy_from_slice(&encryption_info_bytes); + + // Identity DE + let identity_header = identity_de_header(self.identity_type, self.identity_payload); + section_contents[19..21].copy_from_slice(identity_header.serialize().as_slice()); + section_contents[21..37].copy_from_slice(self.identity_payload); + + // DE offset for identity is 1: Encryption Info DE, Identity DE, then other DEs + let nonce: AesCtrNonce = self + .de_salt(v1_salt::DataElementOffset::from(1)) + .derive() + .expect("AES-CTR nonce is a valid HKDF length"); + + let mut cipher = C::AesCtr128::new(&self.aes_key, NonceAndCounter::from_nonce(nonce)); + + let ciphertext_end = section_contents.len() - SectionMic::CONTENTS_LEN; + + // encrypt just the part that should be ciphertext: identity DE contents and subsequent DEs + cipher.encrypt(&mut section_contents[21..ciphertext_end]); + + // calculate MAC per the spec + let mut section_hmac = self.mic_hmac_key.build_hmac(); + // svc uuid + section_hmac.update(NP_SVC_UUID.as_slice()); + // adv header + section_hmac.update(&[adv_header_byte]); + // section header + section_hmac.update(&[section_header]); + // encryption info + section_hmac.update(&encryption_info_bytes); + // derived salt + section_hmac.update(&nonce); + // identity header + ciphertext + section_hmac.update(§ion_contents[19..ciphertext_end]); + + let mic: [u8; 32] = section_hmac.finalize(); + + // write truncated MIC + section_contents[ciphertext_end..].copy_from_slice(&mic[..SectionMic::CONTENTS_LEN]); + } + + type DerivedSalt = DeSalt<C>; + + fn de_salt(&self, de_offset: DataElementOffset) -> Self::DerivedSalt { + DeSalt { salt: V1Salt::from(*self.salt.as_array_ref()), de_offset } + } +} + +/// Encrypts the data elements and protects integrity with an np_ed25519 signature +/// using key material derived from an NP identity. +pub struct SignedEncrypted<'a, C: CryptoProvider> { + identity_type: EncryptedIdentityDataElementType, + salt: V1Salt<C>, + metadata_key: &'a [u8; 16], + key_pair: &'a np_ed25519::KeyPair<C>, + aes_key: Aes128Key, + _marker: PhantomData<C>, +} + +impl<'a, C: CryptoProvider> SignedEncrypted<'a, C> { + /// Build a [SignedEncrypted] from the provided identity material with a random salt. + pub fn new_random_salt( + rng: &mut C::CryptoRng, + identity_type: EncryptedIdentityDataElementType, + metadata_key: &'a [u8; 16], + key_pair: &'a np_ed25519::KeyPair<C>, + key_seed_hkdf: &np_hkdf::NpKeySeedHkdf<C>, + ) -> Self { + let salt: V1Salt<C> = rng.gen::<[u8; 16]>().into(); + Self::new(identity_type, salt, metadata_key, key_pair, key_seed_hkdf) + } + + /// Build a [SignedEncrypted] from the provided identity material. + pub(crate) fn new( + identity_type: EncryptedIdentityDataElementType, + salt: V1Salt<C>, + metadata_key: &'a [u8; 16], + key_pair: &'a np_ed25519::KeyPair<C>, + key_seed_hkdf: &np_hkdf::NpKeySeedHkdf<C>, + ) -> Self { + Self { + identity_type, + salt, + metadata_key, + key_pair, + aes_key: key_seed_hkdf.extended_signed_section_aes_key(), + _marker: Default::default(), + } + } +} + +impl<'a, C: CryptoProvider> SectionIdentity for SignedEncrypted<'a, C> { + const PREFIX_LEN: usize = + EncryptionInfo::TOTAL_DE_LEN + EncryptedIdentityMetadata::TOTAL_DE_LEN; + /// Ed25519 signature + const SUFFIX_LEN: usize = crypto_provider::ed25519::SIGNATURE_LENGTH; + /// Room for the encryption info and identity DEs + const INITIAL_DE_OFFSET: DataElementOffset = + DataElementOffset::ZERO.incremented().incremented(); + + fn postprocess( + &mut self, + adv_header_byte: u8, + section_header: u8, + section_contents: &mut [u8], + ) { + let encryption_info_bytes = EncryptionInfoDataElement::signature( + self.salt.as_slice().try_into().expect("Salt should be 16 bytes"), + ) + .serialize(); + section_contents[0..19].copy_from_slice(&encryption_info_bytes); + + let identity_header = identity_de_header(self.identity_type, self.metadata_key); + section_contents[19..21].copy_from_slice(identity_header.serialize().as_slice()); + section_contents[21..37].copy_from_slice(self.metadata_key); + + let nonce: AesCtrNonce = self + .de_salt(v1_salt::DataElementOffset::from(1)) + .derive() + .expect("AES-CTR nonce is a valid HKDF length"); + + let (before_sig, sig) = + section_contents.split_at_mut(section_contents.len() - Self::SUFFIX_LEN); + let (encryption_info, after_encryption_info) = + before_sig.split_at(EncryptionInfo::TOTAL_DE_LEN); + + let encryption_info: &[u8; EncryptionInfo::TOTAL_DE_LEN] = + encryption_info.try_into().unwrap(); + + // we need to sign the 16-byte IV, which doesn't have to actually fit in the adv, but we + // don't need a bigger buffer here since we won't be including the 66 bytes for the sig + + // header. + // If the stack usage ever becomes a problem, we can investigate pre hashing for the + // signature. + let nonce_ref = &nonce; + let section_signature_payload = SectionSignaturePayload::from_serialized_parts( + adv_header_byte, + section_header, + encryption_info, + nonce_ref, + after_encryption_info, + ); + + let signature = section_signature_payload.sign(self.key_pair); + + sig[0..64].copy_from_slice(&signature.to_bytes()); + + let mut cipher = C::AesCtr128::new(&self.aes_key, NonceAndCounter::from_nonce(nonce)); + + // encrypt just the part that should be ciphertext: identity DE contents and subsequent DEs + cipher.encrypt(&mut section_contents[21..]); + } + + type DerivedSalt = DeSalt<C>; + + fn de_salt(&self, de_offset: DataElementOffset) -> Self::DerivedSalt { + DeSalt { salt: V1Salt::from(*self.salt.as_array_ref()), de_offset } + } +} + +/// For DE structs that only implement one DE type, rather than multi-type impls. +pub trait SingleTypeDataElement { + /// The DE type for the DE. + const DE_TYPE: DeType; +} + +/// Writes data for a V1 DE into a provided buffer. +/// +/// V1 data elements can be hundreds of bytes, so we ideally wouldn't even stack allocate a buffer +/// big enough for that, hence an abstraction that writes into an existing buffer. +pub trait WriteDataElement { + /// Returns the DE header that will be serialized into the section. + fn de_header(&self) -> DeHeader; + /// Write just the contents of the DE, returning `Some` if all contents could be written and + /// `None` otherwise. + fn write_de_contents<S: Sink<u8>>(&self, sink: &mut S) -> Option<()>; +} + +// convenience impl for &W +impl<W: WriteDataElement> WriteDataElement for &W { + fn de_header(&self) -> DeHeader { + (*self).de_header() + } + + fn write_de_contents<S: Sink<u8>>(&self, sink: &mut S) -> Option<()> { + (*self).write_de_contents(sink) + } +} + +/// Serialization-specific representation of a DE header +#[derive(Debug, PartialEq, Eq, Clone, Copy)] +pub struct DeHeader { + /// The length of the content of the DE + len: DeLength, + pub(crate) de_type: DeType, +} + +impl DeHeader { + /// Build a DeHeader from the provided type and length + pub fn new(de_type: DeType, len: DeLength) -> Self { + DeHeader { de_type, len } + } + + /// Serialize the DE header as per the V1 DE header format: + /// - 1 byte form for length <= 3 bits, type <= 4 bits: `0LLLTTTT` + /// - multi byte form: `0b1LLLLLLL [0b1TTTTTTT ...] 0b0TTTTTTT` + /// - the shortest possible encoding must be used (no empty prefix type bytes) + /// + /// We assume that a 32-bit de type is sufficient, which would take at most 5 7-bit chunks to + /// encode, resulting in a total length of 6 bytes with the initial length byte. + pub(crate) fn serialize(&self) -> ArrayView<u8, 6> { + let mut buffer = [0; 6]; + let de_type = self.de_type.as_u32(); + let hi_bit = 0x80_u8; + let len = self.len.len; + if len < 8 && de_type < 16 { + buffer[0] = len << 4 | de_type as u8; + ArrayView::try_from_array(buffer, 1).expect("1 is a valid length") + } else { + // length w/ extended bit + buffer[0] = hi_bit | len; + + // expand to a u64 so we can represent all 5 7-bit chunks of a u32, shifted so that + // it fills the top 5 * 7 = 35 bits after the high bit, which is left unset so that + // the MSB can be interpreted as a 7-bit chunk with an unset high bit. + let mut type64 = (de_type as u64) << (64 - 35 - 1); + let mut remaining_chunks = 5; + let mut chunks_written = 0; + // write 7 bit chunks, skipping leading 0 chunks + while remaining_chunks > 0 { + let chunk = type64.to_be_bytes()[0]; + remaining_chunks -= 1; + + // shift 7 more bits up, leaving the high bit unset + type64 = (type64 << 7) & (u64::MAX >> 1); + + if chunks_written == 0 && chunk == 0 { + // skip leading all-zero chunks + continue; + } + + buffer[1 + chunks_written] = chunk; + chunks_written += 1; + } + if chunks_written > 0 { + // fill in high bits for all but the last + for byte in buffer[1..chunks_written].iter_mut() { + *byte |= hi_bit; + } + + ArrayView::try_from_array(buffer, 1 + chunks_written).expect("length is at most 6") + } else { + // type byte is a leading 0 bit w/ 0 type, so use the existing 0 byte + ArrayView::try_from_array(buffer, 2).expect("2 is a valid length") + } + } + } +} + +fn identity_de_header( + id_type: EncryptedIdentityDataElementType, + metadata_key: &[u8; 16], +) -> DeHeader { + DeHeader { + de_type: id_type.type_code(), + len: metadata_key + .len() + .try_into() + .map_err(|_e| DeLengthOutOfRange) + .and_then(|len: u8| len.try_into()) + .expect("metadata key is a valid DE length"), + } +} + +/// A wrapper around a fixed-size tinyvec that can have its capacity further constrained to handle +/// dynamic size limits. +#[derive(Debug)] +pub(crate) struct CapacityLimitedVec<T, const N: usize> +where + T: fmt::Debug + Clone, + [T; N]: tinyvec::Array + fmt::Debug, + <[T; N] as tinyvec::Array>::Item: fmt::Debug + Clone, +{ + /// constraint on the occupied space in `vec`. + /// Invariant: `vec.len() <= constraint` and `vec.capacity() >= capacity`. + capacity: usize, + vec: tinyvec::ArrayVec<[T; N]>, +} + +impl<T, const N: usize> CapacityLimitedVec<T, N> +where + T: fmt::Debug + Clone, + [T; N]: tinyvec::Array + fmt::Debug, + <[T; N] as tinyvec::Array>::Item: fmt::Debug + Clone, +{ + pub(crate) fn len(&self) -> usize { + self.vec.len() + } + + fn capacity(&self) -> usize { + self.capacity + } + + fn truncate(&mut self, len: usize) { + self.vec.truncate(len); + } + + fn into_inner(self) -> tinyvec::ArrayVec<[T; N]> { + self.vec + } +} + +impl<T, const N: usize> Sink<<[T; N] as tinyvec::Array>::Item> for CapacityLimitedVec<T, N> +where + T: fmt::Debug + Clone, + [T; N]: tinyvec::Array + fmt::Debug, + <[T; N] as tinyvec::Array>::Item: fmt::Debug + Clone, +{ + fn try_extend_from_slice(&mut self, items: &[<[T; N] as tinyvec::Array>::Item]) -> Option<()> { + if items.len() > (self.capacity() - self.len()) { + return None; + } + // won't panic: just checked the length + self.vec.extend_from_slice(items); + Some(()) + } + + fn try_push(&mut self, item: <[T; N] as tinyvec::Array>::Item) -> Option<()> { + if self.len() == self.capacity() { + // already full + None + } else { + self.vec.push(item); + Some(()) + } + } +} + +impl<T, const N: usize> AsRef<[<[T; N] as tinyvec::Array>::Item]> for CapacityLimitedVec<T, N> +where + T: fmt::Debug + Clone, + [T; N]: tinyvec::Array + fmt::Debug, + <[T; N] as tinyvec::Array>::Item: fmt::Debug + Clone, +{ + fn as_ref(&self) -> &[<[T; N] as tinyvec::Array>::Item] { + self.vec.as_slice() + } +} +impl<T, const N: usize> AsMut<[<[T; N] as tinyvec::Array>::Item]> for CapacityLimitedVec<T, N> +where + T: fmt::Debug + Clone, + [T; N]: tinyvec::Array + fmt::Debug, + <[T; N] as tinyvec::Array>::Item: fmt::Debug + Clone, +{ + fn as_mut(&mut self) -> &mut [<[T; N] as tinyvec::Array>::Item] { + self.vec.as_mut_slice() + } +}
diff --git a/nearby/presence/np_adv/src/extended/serialize/section_tests.rs b/nearby/presence/np_adv/src/extended/serialize/section_tests.rs new file mode 100644 index 0000000..af11076 --- /dev/null +++ b/nearby/presence/np_adv/src/extended/serialize/section_tests.rs
@@ -0,0 +1,860 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +extern crate std; + +use super::*; +use crate::extended::serialize::AddSectionError::MaxSectionCountExceeded; +use crate::{ + extended::data_elements::{ContextSyncSeqNumDataElement, GenericDataElement}, + shared_data::ContextSyncSeqNum, +}; +use crypto_provider::aes::ctr::AES_CTR_NONCE_LEN; +use crypto_provider_default::CryptoProviderImpl; +use np_hkdf::v1_salt::V1Salt; +use rand::rngs::StdRng; +use rand::{prelude::SliceRandom as _, Rng as _, SeedableRng as _}; +use std::{prelude::rust_2021::*, vec}; +use strum::IntoEnumIterator as _; + +type KeyPair = np_ed25519::KeyPair<CryptoProviderImpl>; + +#[test] +fn public_identity_section_empty() { + let mut adv_builder = AdvBuilder::new(); + let section_builder = adv_builder.section_builder(PublicIdentity::default()).unwrap(); + + assert_eq!(&[1_u8, 0x03], section_builder.into_section().as_slice()); +} + +#[test] +fn mic_encrypted_identity_section_empty() { + do_mic_encrypted_identity_fixed_key_material_test::<DummyDataElement>(&[]); +} + +#[test] +fn mic_encrypted_identity_section_random_des() { + let mut rng = StdRng::from_entropy(); + let mut crypto_rng = <CryptoProviderImpl as CryptoProvider>::CryptoRng::new(); + + for _ in 0..1_000 { + let num_des = rng.gen_range(1..=5); + + let extra_des = (0..num_des) + .map(|_| { + let de_len = rng.gen_range(0..=30); + DummyDataElement { + de_type: rng.gen_range(0_u32..=u32::MAX).into(), + data: rand_ext::random_vec_rc(&mut rng, de_len), + } + }) + .collect::<Vec<_>>(); + + let metadata_key = rng.gen(); + let key_seed = rng.gen(); + let identity_type = + *EncryptedIdentityDataElementType::iter().collect::<Vec<_>>().choose(&mut rng).unwrap(); + let key_seed_hkdf = np_hkdf::NpKeySeedHkdf::<CryptoProviderImpl>::new(&key_seed); + + let mut adv_builder = AdvBuilder::new(); + + let mut section_builder = adv_builder + .section_builder(MicEncrypted::new_random_salt( + &mut crypto_rng, + identity_type, + &metadata_key, + &key_seed_hkdf, + )) + .unwrap(); + let section_salt = + V1Salt::<CryptoProviderImpl>::from(*section_builder.identity.salt.as_array_ref()); + + for de in extra_des.iter() { + section_builder.add_de(|_| de).unwrap(); + } + + // length 53: 19 for encryption info, 18 for identity, 16 for MIC + let section_length = 53 + + extra_des + .iter() + .map(|de| { + de.de_header().serialize().len() as u8 + de.de_header().len.as_usize() as u8 + }) + .sum::<u8>(); + + let encryption_info = [ + &[ + 0x91, 0x10, // header + 0x00, // scheme (mic) + ], + section_salt.as_slice(), + ] + .concat(); + + let identity_de_header = + DeHeader { len: 16_u8.try_into().unwrap(), de_type: identity_type.type_code() }; + + let mut hmac = np_hkdf::UnsignedSectionKeys::hmac_key(&key_seed_hkdf).build_hmac(); + // just to be sure, we'll construct our test hmac all in one update() call + let mut hmac_input = vec![]; + hmac_input.extend_from_slice(NP_SVC_UUID.as_slice()); + hmac_input.push(0b00100000); // v1 + + // section header + hmac_input.push(section_length); + hmac_input.extend_from_slice(&encryption_info); + let nonce = section_salt.derive::<{ AES_CTR_NONCE_LEN }>(Some(1.into())).unwrap(); + hmac_input.extend_from_slice(nonce.as_slice()); + + hmac_input.extend_from_slice(identity_de_header.serialize().as_slice()); + + let mut cipher = <CryptoProviderImpl as CryptoProvider>::AesCtr128::new( + &np_hkdf::UnsignedSectionKeys::aes_key(&key_seed_hkdf), + NonceAndCounter::from_nonce(nonce), + ); + let mut plaintext = metadata_key.as_slice().to_vec(); + + for de in extra_des { + plaintext.extend_from_slice(de.de_header().serialize().as_slice()); + de.write_de_contents(&mut plaintext); + } + + cipher.encrypt(&mut plaintext); + let ciphertext = plaintext; + + hmac_input.extend_from_slice(&ciphertext); + + hmac.update(&hmac_input); + let mic = hmac.finalize(); + + let mut expected = vec![]; + expected.push(section_length); + expected.extend_from_slice(&encryption_info); + expected.extend_from_slice(identity_de_header.serialize().as_slice()); + expected.extend_from_slice(&ciphertext); + expected.extend_from_slice(&mic[..16]); + + assert_eq!(&expected, section_builder.into_section().as_slice()); + } +} + +#[test] +fn signature_encrypted_identity_section_empty() { + do_signature_encrypted_identity_fixed_key_material_test::<DummyDataElement>(&[]); +} + +#[test] +fn signature_encrypted_identity_section_random_des() { + let mut rng = StdRng::from_entropy(); + let mut crypto_rng = <CryptoProviderImpl as CryptoProvider>::CryptoRng::new(); + + for _ in 0..1_000 { + let num_des = rng.gen_range(1..=5); + + let metadata_key = rng.gen(); + let key_seed = rng.gen(); + let identity_type = + *EncryptedIdentityDataElementType::iter().collect::<Vec<_>>().choose(&mut rng).unwrap(); + let key_seed_hkdf = np_hkdf::NpKeySeedHkdf::<CryptoProviderImpl>::new(&key_seed); + + let mut adv_builder = AdvBuilder::new(); + let key_pair = KeyPair::generate(); + + let mut section_builder = adv_builder + .section_builder(SignedEncrypted::new_random_salt( + &mut crypto_rng, + identity_type, + &metadata_key, + &key_pair, + &key_seed_hkdf, + )) + .unwrap(); + let section_salt = + V1Salt::<CryptoProviderImpl>::from(*section_builder.identity.salt.as_array_ref()); + + let extra_des = (0..num_des) + .map(|_| { + let de_len = rng.gen_range(0..=30); + DummyDataElement { + de_type: rng.gen_range(0_u32..=u32::MAX).into(), + data: rand_ext::random_vec_rc(&mut rng, de_len), + } + }) + // the DEs might not all fit; keep those that do + .filter_map(|de| section_builder.add_de(|_| de.clone()).ok().map(|_| de)) + .collect::<Vec<_>>(); + + // 19 for encryption info, 18 for identity, 64 for signature + let section_length = 19 + + 18 + + 64 + + extra_des + .iter() + .map(|de| { + de.de_header().serialize().len() as u8 + de.de_header().len.as_usize() as u8 + }) + .sum::<u8>(); + + let encryption_info = [ + &[ + 0x91, 0x10, // header + 0x08, // scheme (signature) + ], + section_salt.as_slice(), + ] + .concat(); + let encryption_info: [u8; EncryptionInfo::TOTAL_DE_LEN] = + encryption_info.try_into().unwrap(); + + let identity_de_header = + DeHeader { len: 16_u8.try_into().unwrap(), de_type: identity_type.type_code() }; + let identity_de_header: [u8; 2] = + identity_de_header.serialize().as_slice().try_into().unwrap(); + + let nonce = section_salt.derive::<{ AES_CTR_NONCE_LEN }>(Some(1.into())).unwrap(); + + let mut plaintext = metadata_key.as_slice().to_vec(); + + for de in extra_des { + plaintext.extend_from_slice(de.de_header().serialize().as_slice()); + de.write_de_contents(&mut plaintext); + } + + let sig_payload = SectionSignaturePayload::from_deserialized_parts( + 0x20, + section_length, + &encryption_info, + &nonce, + identity_de_header, + &plaintext, + ); + + plaintext.extend_from_slice(&sig_payload.sign(&key_pair).to_bytes()); + + <CryptoProviderImpl as CryptoProvider>::AesCtr128::new( + &key_seed_hkdf.extended_signed_section_aes_key(), + NonceAndCounter::from_nonce(nonce), + ) + .encrypt(&mut plaintext); + let ciphertext = plaintext; + + let mut expected = vec![section_length]; + expected.extend_from_slice(&encryption_info); + expected.extend_from_slice(&identity_de_header); + expected.extend_from_slice(&ciphertext); + + assert_eq!(&expected, section_builder.into_section().as_slice()); + } +} + +#[test] +fn section_builder_too_full_doesnt_advance_de_index() { + let mut crypto_rng = <CryptoProviderImpl as CryptoProvider>::CryptoRng::new(); + + let mut adv_builder = AdvBuilder::new(); + + let key_seed = [22; 32]; + let key_seed_hkdf = np_hkdf::NpKeySeedHkdf::<CryptoProviderImpl>::new(&key_seed); + let metadata_key = [33; 16]; + let mut section_builder = adv_builder + .section_builder(MicEncrypted::new_random_salt( + &mut crypto_rng, + EncryptedIdentityDataElementType::Trusted, + &metadata_key, + &key_seed_hkdf, + )) + .unwrap(); + let salt = V1Salt::<CryptoProviderImpl>::from(*section_builder.identity.salt.as_array_ref()); + + section_builder + .add_de(|de_salt| DummyDataElement { + de_type: 100_u32.into(), + data: de_salt.derive::<100>().unwrap().to_vec(), + }) + .unwrap(); + + // this write won't advance the de offset or the internal section buffer length + assert_eq!( + AddDataElementError::InsufficientSectionSpace, + section_builder + .add_de(|de_salt| DummyDataElement { + de_type: 101_u32.into(), + data: de_salt.derive::<100>().unwrap().to_vec(), + }) + .unwrap_err() + ); + + section_builder + .add_de(|de_salt| DummyDataElement { + de_type: 102_u32.into(), + data: de_salt.derive::<10>().unwrap().to_vec(), + }) + .unwrap(); + + section_builder.add_to_advertisement(); + + let mut expected = vec![]; + // metadata key + expected.extend_from_slice(&metadata_key); + // de header + expected.extend_from_slice(&[0x80 + 100, 100]); + // section 0 de 2 + expected.extend_from_slice(&salt.derive::<100>(Some(2.into())).unwrap()); + // de header + expected.extend_from_slice(&[0x80 + 10, 102]); + // section 0 de 3 + expected.extend_from_slice(&salt.derive::<10>(Some(3.into())).unwrap()); + + let mut cipher = <CryptoProviderImpl as CryptoProvider>::AesCtr128::new( + &np_hkdf::UnsignedSectionKeys::aes_key(&key_seed_hkdf), + NonceAndCounter::from_nonce(salt.derive(Some(1.into())).unwrap()), + ); + + cipher.encrypt(&mut expected); + + let adv_bytes = adv_builder.into_advertisement(); + // ignoring the MIC, etc, since that's tested elsewhere + let ciphertext_end = adv_bytes.as_slice().len() - 16; + assert_eq!(&expected, &adv_bytes.as_slice()[1 + 1 + 19 + 2..ciphertext_end]) +} + +#[test] +fn section_de_fits_exactly() { + // leave room for initial filler section's header and the identities + for section_contents_capacity in 1..NP_ADV_MAX_SECTION_LEN - 3 { + let mut adv_builder = AdvBuilder::new(); + + // fill up space to produce desired capacity + let mut section_builder = adv_builder.section_builder(PublicIdentity::default()).unwrap(); + // leave space for adv header, 2 section headers, the section identities, and desired second section capacity + fill_section_builder( + BLE_ADV_SVC_CONTENT_LEN - 1 - 2 - 2 - section_contents_capacity, + &mut section_builder, + ); + section_builder.add_to_advertisement(); + + let mut section_builder = adv_builder.section_builder(PublicIdentity::default()).unwrap(); + + // fill it almost full + fill_section_builder(section_contents_capacity - 1, &mut section_builder); + + assert_eq!( + 1, + section_builder.section.capacity() - section_builder.section.len(), + "capacity: {section_contents_capacity}" + ); + + // can't add a 2 byte DE + assert_eq!( + Err(AddDataElementError::InsufficientSectionSpace), + section_builder.add_de_res(|_| GenericDataElement::try_from(1_u32.into(), &[0xFF])), + "capacity: {section_contents_capacity}" + ); + + // can add a 1 byte DE + section_builder.add_de_res(|_| GenericDataElement::try_from(1_u32.into(), &[])).unwrap(); + } +} + +#[test] +fn section_builder_build_de_error_doesnt_advance_de_index() { + let mut crypto_rng = <CryptoProviderImpl as CryptoProvider>::CryptoRng::new(); + + let mut adv_builder = AdvBuilder::new(); + + let key_seed = [22; 32]; + let key_seed_hkdf = np_hkdf::NpKeySeedHkdf::<CryptoProviderImpl>::new(&key_seed); + let metadata_key = [33; 16]; + let mut section_builder = adv_builder + .section_builder(MicEncrypted::new_random_salt( + &mut crypto_rng, + EncryptedIdentityDataElementType::Trusted, + &metadata_key, + &key_seed_hkdf, + )) + .unwrap(); + let salt = V1Salt::<CryptoProviderImpl>::from(*section_builder.identity.salt.as_array_ref()); + + section_builder + .add_de(|de_salt| DummyDataElement { + de_type: 100_u32.into(), + data: de_salt.derive::<100>().unwrap().to_vec(), + }) + .unwrap(); + + assert_eq!( + AddDataElementError::BuildDeError(()), + section_builder.add_de_res(|_| Err::<DummyDataElement, _>(())).unwrap_err() + ); + + section_builder + .add_de(|de_salt| DummyDataElement { + de_type: 103_u32.into(), + data: de_salt.derive::<10>().unwrap().to_vec(), + }) + .unwrap(); + + section_builder.add_to_advertisement(); + + let mut expected = vec![]; + // metadata key + expected.extend_from_slice(&metadata_key); + // de header + expected.extend_from_slice(&[0x80 + 100, 100]); + // section 0 de 2 + expected.extend_from_slice(&salt.derive::<100>(Some(2.into())).unwrap()); + // de header + expected.extend_from_slice(&[0x80 + 10, 103]); + // section 0 de 3 + expected.extend_from_slice(&salt.derive::<10>(Some(3.into())).unwrap()); + + let mut cipher = <CryptoProviderImpl as CryptoProvider>::AesCtr128::new( + &np_hkdf::UnsignedSectionKeys::aes_key(&key_seed_hkdf), + NonceAndCounter::from_nonce(salt.derive(Some(1.into())).unwrap()), + ); + + cipher.encrypt(&mut expected); + + let adv_bytes = adv_builder.into_advertisement(); + // ignoring the MIC, etc, since that's tested elsewhere + let ciphertext_end = adv_bytes.as_slice().len() - 16; + assert_eq!(&expected, &adv_bytes.as_slice()[1 + 1 + 19 + 2..ciphertext_end]) +} + +#[test] +fn add_multiple_de_correct_de_offsets_mic_encrypted_identity() { + let mut crypto_rng = <CryptoProviderImpl as CryptoProvider>::CryptoRng::new(); + + let mut adv_builder = AdvBuilder::new(); + + let key_seed = [22; 32]; + let key_seed_hkdf = np_hkdf::NpKeySeedHkdf::<CryptoProviderImpl>::new(&key_seed); + let metadata_key = [33; 16]; + let mut section_builder = adv_builder + .section_builder(MicEncrypted::new_random_salt( + &mut crypto_rng, + EncryptedIdentityDataElementType::Trusted, + &metadata_key, + &key_seed_hkdf, + )) + .unwrap(); + let salt = V1Salt::<CryptoProviderImpl>::from(*section_builder.identity.salt.as_array_ref()); + + section_builder + .add_de(|de_salt| DummyDataElement { + de_type: 64_u32.into(), + data: de_salt.derive::<16>().unwrap().to_vec(), + }) + .unwrap(); + section_builder + .add_de(|de_salt| DummyDataElement { + de_type: 65_u32.into(), + data: de_salt.derive::<16>().unwrap().to_vec(), + }) + .unwrap(); + + section_builder.add_to_advertisement(); + + let mut expected = vec![]; + // metadata key + expected.extend_from_slice(&metadata_key); + // de header + expected.extend_from_slice(&[0x90, 0x40]); + // section 0 de 2 + expected.extend_from_slice(&salt.derive::<16>(Some(2.into())).unwrap()); + // de header + expected.extend_from_slice(&[0x90, 0x41]); + // section 0 de 3 + expected.extend_from_slice(&salt.derive::<16>(Some(3.into())).unwrap()); + + let mut cipher = <CryptoProviderImpl as CryptoProvider>::AesCtr128::new( + &np_hkdf::UnsignedSectionKeys::aes_key(&key_seed_hkdf), + NonceAndCounter::from_nonce(salt.derive(Some(1.into())).unwrap()), + ); + + cipher.encrypt(&mut expected); + + let adv_bytes = adv_builder.into_advertisement(); + // ignoring the MIC, etc, since that's tested elsewhere + let ciphertext_end = adv_bytes.as_slice().len() - 16; + assert_eq!(&expected, &adv_bytes.as_slice()[1 + 1 + 19 + 2..ciphertext_end]) +} + +#[test] +fn add_multiple_de_correct_de_offsets_signature_encrypted_identity() { + let mut crypto_rng = <CryptoProviderImpl as CryptoProvider>::CryptoRng::new(); + + let mut adv_builder = AdvBuilder::new(); + + let key_seed = [22; 32]; + let key_seed_hkdf = np_hkdf::NpKeySeedHkdf::<CryptoProviderImpl>::new(&key_seed); + let metadata_key = [33; 16]; + let key_pair = KeyPair::generate(); + let mut section_builder = adv_builder + .section_builder(SignedEncrypted::new_random_salt( + &mut crypto_rng, + EncryptedIdentityDataElementType::Trusted, + &metadata_key, + &key_pair, + &key_seed_hkdf, + )) + .unwrap(); + let salt = V1Salt::<CryptoProviderImpl>::from(*section_builder.identity.salt.as_array_ref()); + + section_builder + .add_de(|de_salt| DummyDataElement { + de_type: 64_u32.into(), + data: de_salt.derive::<16>().unwrap().to_vec(), + }) + .unwrap(); + section_builder + .add_de(|de_salt| DummyDataElement { + de_type: 65_u32.into(), + data: de_salt.derive::<16>().unwrap().to_vec(), + }) + .unwrap(); + + section_builder.add_to_advertisement(); + + let mut expected = vec![]; + // metadata key + expected.extend_from_slice(&metadata_key); + // de header + expected.extend_from_slice(&[0x90, 0x40]); + // section 0 de 2 + expected.extend_from_slice(&salt.derive::<16>(Some(2.into())).unwrap()); + // de header + expected.extend_from_slice(&[0x90, 0x41]); + // section 0 de 3 + expected.extend_from_slice(&salt.derive::<16>(Some(3.into())).unwrap()); + + <CryptoProviderImpl as CryptoProvider>::AesCtr128::new( + &key_seed_hkdf.extended_signed_section_aes_key(), + NonceAndCounter::from_nonce(salt.derive(Some(1.into())).unwrap()), + ) + .encrypt(&mut expected); + + let adv_bytes = adv_builder.into_advertisement(); + // ignoring the signature since that's tested elsewhere + assert_eq!( + &expected, + // adv header + salt + section header + encryption info + identity header + &adv_bytes.as_slice()[1 + 1 + 19 + 2..adv_bytes.as_slice().len() - 64] + ) +} + +#[test] +fn signature_encrypted_section_de_lengths_allow_room_for_suffix() { + let mut crypto_rng = <CryptoProviderImpl as CryptoProvider>::CryptoRng::new(); + + let mut adv_builder = AdvBuilder::new(); + + let key_seed = [22; 32]; + let key_seed_hkdf = np_hkdf::NpKeySeedHkdf::<CryptoProviderImpl>::new(&key_seed); + let metadata_key = [33; 16]; + let key_pair = KeyPair::generate(); + let mut section_builder = adv_builder + .section_builder(SignedEncrypted::new_random_salt( + &mut crypto_rng, + EncryptedIdentityDataElementType::Trusted, + &metadata_key, + &key_pair, + &key_seed_hkdf, + )) + .unwrap(); + + // section header + identity + signature + let max_total_de_len = NP_ADV_MAX_SECTION_LEN - 1 - 2 - 16 - 2 - 64; + + // take up 100 bytes to put us within 1 DE of the limit + section_builder + .add_de(|_| DummyDataElement { de_type: 100_u32.into(), data: vec![0; 98] }) + .unwrap(); + + // one byte too many won't fit + assert_eq!( + AddDataElementError::InsufficientSectionSpace, + section_builder + .add_de(|_| DummyDataElement { + de_type: 100_u32.into(), + data: vec![0; max_total_de_len - 100 - 1] + }) + .unwrap_err() + ); + + // but this will, as it allows 2 bytes for this DE's header + assert_eq!( + AddDataElementError::InsufficientSectionSpace, + section_builder + .add_de(|_| DummyDataElement { + de_type: 100_u32.into(), + data: vec![0; max_total_de_len - 100 - 2] + }) + .unwrap_err() + ); +} + +#[test] +fn serialize_max_number_of_sections() { + let mut adv_builder = AdvBuilder::new(); + for _ in 0..NP_V1_ADV_MAX_SECTION_COUNT { + let mut section_builder = adv_builder.section_builder(PublicIdentity::default()).unwrap(); + section_builder.add_de(|_| context_sync_de(1)).unwrap(); + section_builder.add_to_advertisement(); + } + assert_eq!( + adv_builder.section_builder(PublicIdentity::default()).unwrap_err(), + MaxSectionCountExceeded + ); +} + +fn do_mic_encrypted_identity_fixed_key_material_test<W: WriteDataElement>(extra_des: &[W]) { + let metadata_key = [1; 16]; + let key_seed = [2; 32]; + let adv_header_byte = 0b00100000; + let section_salt: V1Salt<CryptoProviderImpl> = [3; 16].into(); + let identity_type = EncryptedIdentityDataElementType::Private; + let key_seed_hkdf = np_hkdf::NpKeySeedHkdf::<CryptoProviderImpl>::new(&key_seed); + + let mut adv_builder = AdvBuilder::new(); + + let mut section_builder = adv_builder + .section_builder(MicEncrypted::new( + identity_type, + V1Salt::from(*section_salt.as_array_ref()), + &metadata_key, + &key_seed_hkdf, + )) + .unwrap(); + + for de in extra_des { + section_builder.add_de(|_| de).unwrap(); + } + + // length 53: 19 for encryption info, 18 for identity, 16 for MIC + let section_length = 53 + + extra_des + .iter() + .map(|de| de.de_header().serialize().len() as u8 + de.de_header().len.as_usize() as u8) + .sum::<u8>(); + + let encryption_info = [ + &[ + 0x91, 0x10, // header + 0x00, // scheme (mic) + ], + section_salt.as_slice(), + ] + .concat(); + + let identity_de_header = + DeHeader { len: 16_u8.try_into().unwrap(), de_type: identity_type.type_code() }; + + let mut hmac = np_hkdf::UnsignedSectionKeys::hmac_key(&key_seed_hkdf).build_hmac(); + // just to be sure, we'll construct our test hmac all in one update() call + let mut hmac_input = vec![]; + hmac_input.extend_from_slice(NP_SVC_UUID.as_slice()); + hmac_input.push(adv_header_byte); + // section header + hmac_input.push(section_length); + hmac_input.extend_from_slice(&encryption_info); + let nonce = section_salt.derive::<{ AES_CTR_NONCE_LEN }>(Some(1.into())).unwrap(); + hmac_input.extend_from_slice(nonce.as_slice()); + + hmac_input.extend_from_slice(identity_de_header.serialize().as_slice()); + + let mut cipher = <CryptoProviderImpl as CryptoProvider>::AesCtr128::new( + &np_hkdf::UnsignedSectionKeys::aes_key(&key_seed_hkdf), + NonceAndCounter::from_nonce(nonce), + ); + let mut plaintext = metadata_key.as_slice().to_vec(); + + for de in extra_des { + plaintext.extend_from_slice(de.de_header().serialize().as_slice()); + de.write_de_contents(&mut plaintext); + } + + cipher.encrypt(&mut plaintext); + let ciphertext = plaintext; + + hmac_input.extend_from_slice(&ciphertext); + + hmac.update(&hmac_input); + let mic = hmac.finalize(); + + let mut expected = vec![]; + expected.push(section_length); + expected.extend_from_slice(&encryption_info); + expected.extend_from_slice(identity_de_header.serialize().as_slice()); + expected.extend_from_slice(&ciphertext); + expected.extend_from_slice(&mic[..16]); + + assert_eq!(&expected, section_builder.into_section().as_slice()); +} + +fn do_signature_encrypted_identity_fixed_key_material_test<W: WriteDataElement>(extra_des: &[W]) { + let metadata_key = [1; 16]; + let key_seed = [2; 32]; + let adv_header_byte = 0b00100000; + let section_salt: V1Salt<CryptoProviderImpl> = [3; 16].into(); + let identity_type = EncryptedIdentityDataElementType::Private; + let key_seed_hkdf = np_hkdf::NpKeySeedHkdf::<CryptoProviderImpl>::new(&key_seed); + let key_pair = KeyPair::generate(); + + let mut adv_builder = AdvBuilder::new(); + + let mut section_builder = adv_builder + .section_builder(SignedEncrypted::new( + identity_type, + V1Salt::from(*section_salt.as_array_ref()), + &metadata_key, + &key_pair, + &key_seed_hkdf, + )) + .unwrap(); + + for de in extra_des { + section_builder.add_de(|_| de).unwrap(); + } + + // 19 for encryption info, 18 for identity, 64 for sig + let section_length = 19 + + 18 + + 64 + + extra_des + .iter() + .map(|de| de.de_header().serialize().len() as u8 + de.de_header().len.as_usize() as u8) + .sum::<u8>(); + + let encryption_info = [ + &[ + 0x91, 0x10, // header + 0x08, // scheme (signature) + ], + section_salt.as_slice(), + ] + .concat(); + let encryption_info: [u8; EncryptionInfo::TOTAL_DE_LEN] = encryption_info.try_into().unwrap(); + + let identity_de_header = + DeHeader { len: 16_u8.try_into().unwrap(), de_type: identity_type.type_code() }; + let identity_de_header: [u8; 2] = identity_de_header.serialize().as_slice().try_into().unwrap(); + + let mut plaintext = metadata_key.as_slice().to_vec(); + + for de in extra_des { + plaintext.extend_from_slice(de.de_header().serialize().as_slice()); + de.write_de_contents(&mut plaintext); + } + + let nonce = section_salt.derive(Some(1.into())).unwrap(); + + let sig_payload = SectionSignaturePayload::from_deserialized_parts( + adv_header_byte, + section_length, + &encryption_info, + &nonce, + identity_de_header, + &plaintext, + ); + + plaintext.extend_from_slice(&sig_payload.sign(&key_pair).to_bytes()); + + <CryptoProviderImpl as CryptoProvider>::AesCtr128::new( + &key_seed_hkdf.extended_signed_section_aes_key(), + NonceAndCounter::from_nonce(nonce), + ) + .encrypt(&mut plaintext); + let ciphertext = plaintext; + + let mut expected = vec![section_length]; + + expected.extend_from_slice(&encryption_info); + expected.extend_from_slice(&identity_de_header); + expected.extend_from_slice(&ciphertext); + + assert_eq!(&expected, section_builder.into_section().as_slice()); +} + +/// Write `section_contents_len` bytes of DE and header into `section_builder` +pub(crate) fn fill_section_builder<I: SectionIdentity>( + section_contents_len: usize, + section_builder: &mut SectionBuilder<I>, +) { + // DEs can only go up to 127, so we'll need multiple for long sections + for _ in 0..(section_contents_len / 100) { + let de_contents = vec![0x33; 98]; + section_builder + .add_de_res(|_| GenericDataElement::try_from(100_u32.into(), &de_contents)) + .unwrap(); + } + + let remainder_len = section_contents_len % 100; + match remainder_len { + 0 => { + // leave remainder empty + } + 1 => { + // 1 byte header + section_builder + .add_de_res(|_| GenericDataElement::try_from(3_u32.into(), &[])) + .unwrap(); + } + 2 => { + // 2 byte header + section_builder + .add_de_res(|_| GenericDataElement::try_from(100_u32.into(), &[])) + .unwrap(); + } + _ => { + // 2 byte header + contents as needed + // leave room for section and DE headers + let de_contents = vec![0x44; remainder_len - 2]; + section_builder + .add_de_res(|_| GenericDataElement::try_from(100_u32.into(), &de_contents)) + .unwrap(); + } + } +} + +#[derive(Clone)] +pub(crate) struct DummyDataElement { + pub(crate) de_type: DeType, + pub(crate) data: Vec<u8>, +} + +impl WriteDataElement for DummyDataElement { + fn de_header(&self) -> DeHeader { + DeHeader { de_type: self.de_type, len: self.data.len().try_into().unwrap() } + } + + fn write_de_contents<S: Sink<u8>>(&self, sink: &mut S) -> Option<()> { + sink.try_extend_from_slice(&self.data) + } +} + +fn context_sync_de(num: u8) -> ContextSyncSeqNumDataElement { + ContextSyncSeqNumDataElement::from(ContextSyncSeqNum::try_from(num).unwrap()) +} + +pub(crate) trait SectionBuilderExt { + fn into_section(self) -> EncodedSection; +} + +impl<'a, I: SectionIdentity> SectionBuilderExt for SectionBuilder<'a, I> { + /// Convenience method for tests + fn into_section(self) -> EncodedSection { + Self::build_section(self.section.into_inner(), self.identity, self.adv_builder) + } +}
diff --git a/nearby/presence/np_adv/src/extended/serialize/test_vectors.rs b/nearby/presence/np_adv/src/extended/serialize/test_vectors.rs new file mode 100644 index 0000000..9f7aa5c --- /dev/null +++ b/nearby/presence/np_adv/src/extended/serialize/test_vectors.rs
@@ -0,0 +1,192 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +extern crate std; + +use crate::{ + de_type::EncryptedIdentityDataElementType, + extended::serialize::{ + section_tests::{DummyDataElement, SectionBuilderExt}, + AdvBuilder, MicEncrypted, + }, +}; +use anyhow::anyhow; +use crypto_provider::{aes::ctr::AES_CTR_NONCE_LEN, aes::AesKey}; +use crypto_provider_default::CryptoProviderImpl; +use np_hkdf::v1_salt; +use np_hkdf::v1_salt::V1Salt; +use rand_ext::rand::{prelude::SliceRandom as _, Rng as _, SeedableRng as _}; +use serde_json::json; +use std::{fs, io::Read as _, prelude::rust_2021::*, println}; +use strum::IntoEnumIterator as _; +use test_helper::extract_key_array; + +#[test] +fn mic_encrypted_test_vectors() -> Result<(), anyhow::Error> { + let full_path = test_helper::get_data_file( + "presence/np_adv/resources/test/mic-encrypted-test-vectors.json", + ); + let mut file = fs::File::open(full_path)?; + let mut data = String::new(); + file.read_to_string(&mut data)?; + + let test_cases = match serde_json::de::from_str(&data)? { + serde_json::Value::Array(a) => a, + _ => return Err(anyhow!("bad json")), + }; + + for tc in test_cases { + { + let key_seed = extract_key_array::<32>(&tc, "key_seed"); + let metadata_key = extract_key_array::<16>(&tc, "metadata_key"); + let adv_header_byte = extract_key_array::<1>(&tc, "adv_header_byte")[0]; + let section_salt = v1_salt::V1Salt::<CryptoProviderImpl>::from( + extract_key_array::<16>(&tc, "section_salt"), + ); + let identity_type = tc["identity_type"].as_str().map(identity_type_from_label).unwrap(); + let data_elements = tc["data_elements"] + .as_array() + .unwrap() + .iter() + .map(|json_de| DummyDataElement { + data: hex::decode(json_de["contents"].as_str().unwrap()).unwrap(), + de_type: (json_de["de_type"].as_u64().unwrap() as u32).into(), + }) + .collect::<Vec<_>>(); + + let hkdf = np_hkdf::NpKeySeedHkdf::new(&key_seed); + + assert_eq!( + extract_key_array::<16>(&tc, "aes_key").as_slice(), + np_hkdf::UnsignedSectionKeys::aes_key(&hkdf).as_slice() + ); + assert_eq!( + extract_key_array::<32>(&tc, "section_mic_hmac_key").as_slice(), + np_hkdf::UnsignedSectionKeys::hmac_key(&hkdf).as_bytes() + ); + assert_eq!( + extract_key_array::<{ AES_CTR_NONCE_LEN }>(&tc, "nonce").as_slice(), + section_salt.derive::<{ AES_CTR_NONCE_LEN }>(Some(1.into())).unwrap() + ); + + // make an adv builder in the configuration we need + let mut adv_builder = AdvBuilder::new(); + assert_eq!(adv_header_byte, adv_builder.header_byte()); + + let mut section_builder = adv_builder + .section_builder(MicEncrypted::new( + identity_type, + section_salt, + &metadata_key, + &hkdf, + )) + .unwrap(); + + for de in data_elements { + section_builder.add_de(|_| de).unwrap(); + } + + assert_eq!( + hex::decode(tc["encoded_section"].as_str().unwrap()).unwrap(), + section_builder.into_section().as_slice() + ); + } + } + + Ok(()) +} + +#[ignore] +#[test] +fn gen_mic_encrypted_test_vectors() { + let mut rng = rand::rngs::StdRng::from_entropy(); + + let mut array = Vec::<serde_json::Value>::new(); + + for _ in 0..100 { + let num_des = rng.gen_range(0..=5); + + let extra_des = (0..num_des) + .map(|_| { + let de_len = rng.gen_range(0..=30); + DummyDataElement { + de_type: rng.gen_range(0_u32..=1_000).into(), + data: rand_ext::random_vec_rc(&mut rng, de_len), + } + }) + .collect::<Vec<_>>(); + + let metadata_key = rng.gen(); + let key_seed = rng.gen(); + let adv_header_byte = 0b00100000; + let identity_type = + *EncryptedIdentityDataElementType::iter().collect::<Vec<_>>().choose(&mut rng).unwrap(); + + let key_seed_hkdf = np_hkdf::NpKeySeedHkdf::<CryptoProviderImpl>::new(&key_seed); + + let mut adv_builder = AdvBuilder::new(); + + let section_salt = v1_salt::V1Salt::<CryptoProviderImpl>::from(rng.gen::<[u8; 16]>()); + let mut section_builder = adv_builder + .section_builder(MicEncrypted::new( + identity_type, + V1Salt::from(*section_salt.as_array_ref()), + &metadata_key, + &key_seed_hkdf, + )) + .unwrap(); + + for de in extra_des.iter() { + section_builder.add_de(|_| de).unwrap(); + } + + let nonce = section_salt.derive::<{ AES_CTR_NONCE_LEN }>(Some(1.into())).unwrap(); + + array + .push(json!({ + "key_seed": hex::encode_upper(key_seed), + "metadata_key": hex::encode_upper(metadata_key), + "adv_header_byte": hex::encode_upper([adv_header_byte]), + "section_salt": hex::encode_upper(section_salt.as_slice()), + "identity_type": identity_type_label(identity_type), + "data_elements": extra_des.iter().map(|de| json!({ + "de_type": de.de_type.as_u32(), + "contents": hex::encode_upper(&de.data) + })).collect::<Vec<_>>(), + "aes_key": hex::encode_upper(np_hkdf::UnsignedSectionKeys::aes_key(&key_seed_hkdf).as_slice()), + "nonce": hex::encode_upper(nonce), + "section_mic_hmac_key": hex::encode_upper(np_hkdf::UnsignedSectionKeys::hmac_key(&key_seed_hkdf).as_bytes()), + "encoded_section": hex::encode_upper(section_builder.into_section().as_slice()) + })); + } + + println!("{}", serde_json::ser::to_string_pretty(&array).unwrap()); +} + +fn identity_type_label(t: EncryptedIdentityDataElementType) -> &'static str { + match t { + EncryptedIdentityDataElementType::Private => "private", + EncryptedIdentityDataElementType::Trusted => "trusted", + EncryptedIdentityDataElementType::Provisioned => "provisioned", + } +} + +fn identity_type_from_label(label: &str) -> EncryptedIdentityDataElementType { + match label { + "private" => EncryptedIdentityDataElementType::Private, + "trusted" => EncryptedIdentityDataElementType::Trusted, + "provisioned" => EncryptedIdentityDataElementType::Provisioned, + _ => panic!("unknown label: {}", label), + } +}
diff --git a/nearby/presence/np_adv/src/header_parse_tests.rs b/nearby/presence/np_adv/src/header_parse_tests.rs new file mode 100644 index 0000000..2da1b4a --- /dev/null +++ b/nearby/presence/np_adv/src/header_parse_tests.rs
@@ -0,0 +1,58 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +use super::*; + +extern crate std; + +use nom::error; + +#[test] +fn parse_header_v0() { + let (_, header) = parse_adv_header(&[0x00]).unwrap(); + assert_eq!(AdvHeader::V0, header); +} + +#[test] +fn parse_header_v0_nonzero_reserved() { + let input = &[0x01]; + assert_eq!( + nom::Err::Error(error::Error { input: input.as_slice(), code: error::ErrorKind::Verify }), + parse_adv_header(input).unwrap_err() + ); +} + +#[test] +fn parse_header_v1_nonzero_reserved() { + let input = &[0x30]; + assert_eq!( + nom::Err::Error(error::Error { input: input.as_slice(), code: error::ErrorKind::Verify }), + parse_adv_header(input).unwrap_err() + ); +} + +#[test] +fn parse_header_bad_version() { + let input = &[0x80]; + assert_eq!( + nom::Err::Error(error::Error { input: input.as_slice(), code: error::ErrorKind::Verify }), + parse_adv_header(input).unwrap_err() + ); +} + +#[test] +fn parse_header_v1() { + let (_, header) = parse_adv_header(&[0x20]).unwrap(); + assert_eq!(AdvHeader::V1(V1Header { header_byte: 0x20 }), header); +}
diff --git a/nearby/presence/np_adv/src/legacy/actions/macros.rs b/nearby/presence/np_adv/src/legacy/actions/macros.rs new file mode 100644 index 0000000..ecafeb3 --- /dev/null +++ b/nearby/presence/np_adv/src/legacy/actions/macros.rs
@@ -0,0 +1,138 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/// Create a struct holding a `bool`. +macro_rules! boolean_element_struct { + ($type_name:ident) => { + #[derive(Debug)] + #[allow(missing_docs)] + pub struct $type_name { + enabled: bool, + } + }; +} + +/// Create a `From<bool>` impl for a struct made with [boolean_element_struct]. +macro_rules! boolean_element_struct_from_bool { + ($type_name:ident) => { + impl From<bool> for $type_name { + fn from(value: bool) -> Self { + $type_name { enabled: value } + } + } + }; +} + +/// The guts of an ActionElement impl +macro_rules! boolean_element_action_element_impl_shared { + ($type_name:ident, $index:expr) => { + const HIGH_BIT_INDEX: u32 = $index; + const BITS_LEN: u32 = 1; + const ACTION_TYPE: $crate::legacy::actions::ActionType = + $crate::legacy::actions::ActionType::$type_name; + }; +} + +/// Create a struct w/ From<bool> and ActionElement impls. +/// Use `plaintext_only`, `ciphertext_only`, or `plaintext_and_ciphertext` to create appropriate +/// impls. +macro_rules! boolean_element { + ($type_name:ident, $index:expr, plaintext_only) => { + $crate::legacy::actions::macros::boolean_element_struct!($type_name); + $crate::legacy::actions::macros::boolean_element_struct_from_bool!($type_name); + + impl $crate::legacy::actions::ActionElement for $type_name { + $crate::legacy::actions::macros::boolean_element_action_element_impl_shared!( + $type_name, $index + ); + + fn supports_flavor(flavor: $crate::legacy::PacketFlavorEnum) -> bool { + match flavor { + $crate::legacy::PacketFlavorEnum::Plaintext => true, + $crate::legacy::PacketFlavorEnum::Ciphertext => false, + } + } + } + + $crate::legacy::actions::macros::boolean_element_to_plaintext_element!($type_name); + }; + ($type_name:ident, $index:expr, ciphertext_only) => { + $crate::legacy::actions::macros::boolean_element_struct!($type_name); + $crate::legacy::actions::macros::boolean_element_struct_from_bool!($type_name); + + impl $crate::legacy::actions::ActionElement for $type_name { + $crate::legacy::actions::macros::boolean_element_action_element_impl_shared!( + $type_name, $index + ); + + fn supports_flavor(flavor: $crate::legacy::PacketFlavorEnum) -> bool { + match flavor { + $crate::legacy::PacketFlavorEnum::Plaintext => false, + $crate::legacy::PacketFlavorEnum::Ciphertext => true, + } + } + } + + $crate::legacy::actions::macros::boolean_element_to_encrypted_element!($type_name); + }; + ($type_name:ident, $index:expr, plaintext_and_ciphertext) => { + $crate::legacy::actions::macros::boolean_element_struct!($type_name); + $crate::legacy::actions::macros::boolean_element_struct_from_bool!($type_name); + + impl $crate::legacy::actions::ActionElement for $type_name { + $crate::legacy::actions::macros::boolean_element_action_element_impl_shared!( + $type_name, $index + ); + + fn supports_flavor(flavor: $crate::legacy::PacketFlavorEnum) -> bool { + match flavor { + $crate::legacy::PacketFlavorEnum::Plaintext => true, + $crate::legacy::PacketFlavorEnum::Ciphertext => true, + } + } + } + + $crate::legacy::actions::macros::boolean_element_to_plaintext_element!($type_name); + $crate::legacy::actions::macros::boolean_element_to_encrypted_element!($type_name); + }; +} + +/// Create a [ToActionElement<Encrypted>] impl with the given index and length 1. +macro_rules! boolean_element_to_encrypted_element { + ( $type_name:ident) => { + impl $crate::legacy::actions::ToActionElement<$crate::legacy::Ciphertext> for $type_name { + fn bits(&self) -> u8 { + self.enabled as u8 + } + } + }; +} + +/// Create a [ToActionElement<Plaintext>] impl with the given index and length 1. +macro_rules! boolean_element_to_plaintext_element { + ( $type_name:ident) => { + impl $crate::legacy::actions::ToActionElement<$crate::legacy::Plaintext> for $type_name { + fn bits(&self) -> u8 { + self.enabled as u8 + } + } + }; +} + +// expose macros to the rest of the crate without macro_export's behavior of exporting at crate root +pub(crate) use { + boolean_element, boolean_element_action_element_impl_shared, boolean_element_struct, + boolean_element_struct_from_bool, boolean_element_to_encrypted_element, + boolean_element_to_plaintext_element, +};
diff --git a/nearby/presence/np_adv/src/legacy/actions/mod.rs b/nearby/presence/np_adv/src/legacy/actions/mod.rs new file mode 100644 index 0000000..353848e --- /dev/null +++ b/nearby/presence/np_adv/src/legacy/actions/mod.rs
@@ -0,0 +1,442 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! The "Actions" data element and associated types. +//! +//! This DE is somewhat more complex than other DEs. Whether or not it supports a particular flavor +//! depends on the actions set, so it has to be treated as two separate types based on which +//! flavor type parameter is used. +use crate::{ + legacy::{ + data_elements::{DataElement, DataElementDeserializeError}, + de_type::{DataElementType, PlainDataElementType}, + serialize::{DataElementBundle, ToDataElementBundle}, + Ciphertext, PacketFlavor, PacketFlavorEnum, Plaintext, + }, + shared_data::ContextSyncSeqNum, +}; +#[cfg(feature = "devtools")] +use core::ops::Range; +use core::{marker, num, ops}; +use nom::{bytes, combinator, error}; +use strum::IntoEnumIterator as _; + +mod macros; +#[cfg(test)] +pub(crate) mod tests; + +/// Actions DE. +/// Only as many DE payload bytes will be present as needed to represent all set bits that are encoded, +/// with a lower bound of 1 byte in the special case of no set action bits, and an upper bound +/// of 3 bytes occupied by the DE payload. +#[derive(Debug, PartialEq, Eq)] +pub struct ActionsDataElement<F: PacketFlavor> { + action: ActionBits<F>, +} + +impl<F: PacketFlavor> ActionsDataElement<F> { + /// Returns the actions bits as a u32. The upper limit of an actions field is 3 bytes, + /// so the last bytes of this u32 will always be 0 + pub fn as_u32(self) -> u32 { + self.action.bits + } + + /// Return whether a boolean action type is set in this data element, or `None` if the given + /// action type does not represent a boolean. + pub fn has_action(&self, action_type: &ActionType) -> Option<bool> { + (action_type.bits_len() == 1).then_some(self.action.bits_for_type(action_type) != 0) + } + + /// Return the context sync sequence number. + pub fn context_sync_seq_num(&self) -> ContextSyncSeqNum { + ContextSyncSeqNum::try_from(self.action.bits_for_type(&ActionType::ContextSyncSeqNum) as u8) + .expect("Masking with ActionType::ContextSyncSeqNum should always be in range") + } +} + +pub(crate) const ACTIONS_MAX_LEN: usize = 3; + +impl<F> ActionsDataElement<F> +where + F: PacketFlavor, + ActionsDataElement<F>: DataElement, +{ + pub(crate) const ACTIONS_LEN: ops::RangeInclusive<usize> = (1..=ACTIONS_MAX_LEN); + + /// Generic deserialize, not meant to be called directly -- use [DataElement] impls instead. + fn deserialize(de_contents: &[u8]) -> Result<Self, DataElementDeserializeError> { + combinator::all_consuming::<&[u8], _, error::Error<&[u8]>, _>(combinator::map( + bytes::complete::take_while_m_n(0, ACTIONS_MAX_LEN, |_| true), + |bytes: &[u8]| { + let mut action_bytes = [0_u8; 4]; + action_bytes[..bytes.len()].copy_from_slice(bytes); + u32::from_be_bytes(action_bytes) + }, + ))(de_contents) + .map_err(|_| DataElementDeserializeError::DeserializeError { + de_type: Self::DE_TYPE_VARIANT, + }) + .map(|(_remaining, actions)| actions) + .and_then(|action_bits_num| { + let action = ActionBits::try_from(action_bits_num).map_err(|e| { + DataElementDeserializeError::FlavorNotSupported { + de_type: Self::DE_TYPE_VARIANT, + flavor: e.flavor, + } + })?; + Ok(Self { action }) + }) + } +} + +impl<F: PacketFlavor> From<ActionBits<F>> for ActionsDataElement<F> { + fn from(action: ActionBits<F>) -> Self { + Self { action } + } +} + +impl<F: PacketFlavor> ToDataElementBundle<F> for ActionsDataElement<F> { + fn to_de_bundle(&self) -> DataElementBundle<F> { + let action_byte_len = self.action.bytes_used(); + let slice = &self.action.bits.to_be_bytes()[..action_byte_len]; + + DataElementBundle::try_from(PlainDataElementType::Actions, slice) + .expect("Length < max DE size") + } +} + +impl DataElement for ActionsDataElement<Plaintext> { + const DE_TYPE_VARIANT: DataElementType = DataElementType::Actions; + + fn supports_flavor(flavor: PacketFlavorEnum) -> bool { + match flavor { + PacketFlavorEnum::Plaintext => true, + PacketFlavorEnum::Ciphertext => false, + } + } + + fn deserialize<F: PacketFlavor>( + de_contents: &[u8], + ) -> Result<Self, DataElementDeserializeError> { + match F::ENUM_VARIANT { + PacketFlavorEnum::Plaintext => ActionsDataElement::deserialize(de_contents), + PacketFlavorEnum::Ciphertext => Err(DataElementDeserializeError::FlavorNotSupported { + de_type: DataElementType::Actions, + flavor: F::ENUM_VARIANT, + }), + } + } +} + +impl DataElement for ActionsDataElement<Ciphertext> { + const DE_TYPE_VARIANT: DataElementType = DataElementType::Actions; + + fn supports_flavor(flavor: PacketFlavorEnum) -> bool { + match flavor { + PacketFlavorEnum::Plaintext => false, + PacketFlavorEnum::Ciphertext => true, + } + } + + fn deserialize<F: PacketFlavor>( + de_contents: &[u8], + ) -> Result<Self, DataElementDeserializeError> { + match F::ENUM_VARIANT { + PacketFlavorEnum::Plaintext => Err(DataElementDeserializeError::FlavorNotSupported { + de_type: DataElementType::Actions, + flavor: F::ENUM_VARIANT, + }), + PacketFlavorEnum::Ciphertext => ActionsDataElement::deserialize(de_contents), + } + } +} + +/// Container for the 24 bits defined for "actions" (feature flags and the like). +/// This internally stores a u32, but only the 24 highest bits of this +/// field will actually ever be populated. +#[derive(Debug, PartialEq, Eq, Clone, Copy)] +pub struct ActionBits<F: PacketFlavor> { + bits: u32, + // marker for element type + flavor: marker::PhantomData<F>, +} + +impl<F: PacketFlavor> Default for ActionBits<F> { + fn default() -> Self { + ActionBits { + bits: 0, // no bits set + flavor: marker::PhantomData, + } + } +} + +/// At least one action doesn't support the required flavor +#[derive(PartialEq, Eq, Debug)] +pub struct FlavorNotSupported { + flavor: PacketFlavorEnum, +} + +lazy_static::lazy_static! { + /// All bits for plaintext action types: 1 where a plaintext action could have a bit, 0 elsewhere. + static ref ALL_PLAINTEXT_ELEMENT_BITS: u32 = ActionType::iter() + .filter(|t| t.supports_flavor(PacketFlavorEnum::Plaintext)) + .map(|t| t.all_bits()) + .fold(0_u32, |accum, bits| accum | bits); +} + +lazy_static::lazy_static! { + /// All bits for ciphertext action types: 1 where a ciphertext action could have a bit, 0 elsewhere. + static ref ALL_CIPHERTEXT_ELEMENT_BITS: u32 = ActionType::iter() + .filter(|t| t.supports_flavor(PacketFlavorEnum::Ciphertext)) + .map(|t| t.all_bits()) + .fold(0_u32, |accum, bits| accum | bits); +} + +impl<F: PacketFlavor> ActionBits<F> { + /// Tries to create ActionBits from a u32, returning error in the event a specific bit is set for + /// an unsupported flavor + pub fn try_from(value: u32) -> Result<Self, FlavorNotSupported> { + let ok_bits: u32 = match F::ENUM_VARIANT { + PacketFlavorEnum::Plaintext => *ALL_PLAINTEXT_ELEMENT_BITS, + PacketFlavorEnum::Ciphertext => *ALL_CIPHERTEXT_ELEMENT_BITS, + }; + + // no bits set beyond what's allowed for this flavor + if value | ok_bits == ok_bits { + Ok(Self { bits: value, flavor: marker::PhantomData }) + } else { + Err(FlavorNotSupported { flavor: F::ENUM_VARIANT }) + } + } + + /// Set the bits for the provided element. + /// Bits outside the range set by the action will be unaffected. + pub fn set_action<E: ToActionElement<F>>(&mut self, to_element: E) { + let element = to_element.to_action_element(); + let len = element.len.get(); + + // validate that the element is not horribly broken + debug_assert!(len + element.index <= 32); + // must not have bits set past the high `len` bits + debug_assert_eq!(0, element.bits >> (8 - len)); + + // 0-extend to u32 + let byte_extended = element.bits as u32; + // Shift so that the high bit is at the desired index. + // Won't overflow since length > 0. + let bits_in_position = byte_extended << (32 - len - element.index); + + // We want to effectively clear out the bits already in place, so we don't want to just |=. + // Instead, we construct a u32 with all 1s above and below the relevant bits and &=, so that + // if the new bits are 0, the stored bits will be cleared. + + // avoid overflow when index = 0 -- need zero 1 bits to the left in that case + let left_1s = u32::MAX.checked_shl(32 - element.index).unwrap_or(0); + // avoid underflow when index + len = 32 -- zero 1 bits to the right + let right_1s = u32::MAX.checked_shr(element.index + len).unwrap_or(0); + let mask = left_1s | right_1s; + let bits_for_other_actions = self.bits & mask; + self.bits = bits_for_other_actions | bits_in_position; + } + + /// How many bytes (1-3) are needed to represent the set bits, starting from the most + /// significant bit. The lower bound of 1 is because the unique special case of + /// an actions field of all zeroes is required by the spec to occupy exactly one byte. + pub(crate) fn bytes_used(&self) -> usize { + let bits_used = 32 - self.bits.trailing_zeros(); + let raw_count = (bits_used as usize + 7) / 8; + if raw_count == 0 { + 1 // Uncommon case - should only be hit for all-zero action bits + } else { + raw_count + } + } + + /// Return the bits for a given action type as the low bits in the returned u32. + /// + /// For example, when extracting the bits `B` from `0bXXXXXXXXXXBBBBBBXXXXXXXXXXXXXXXX`, the + /// return value will be `0b00000000000000000000000000BBBBBB`. + pub fn bits_for_type(&self, action_type: &ActionType) -> u32 { + self.bits << action_type.high_bit_index() >> (32 - action_type.bits_len()) + } +} + +/// The encoded form of an individual action element. +#[derive(Debug, Clone, Copy)] +pub struct ActionElementBits<F: PacketFlavor> { + /// Offset from the high bit in `ActionBits.bits`, which would be bit 0 of byte 0 of the big-endian + /// representation. + /// Must leave enough room for `len` bits in a u32; that is, `index + len <= 32`. + index: u32, + /// Number of bits used. + /// `len + index <= 32` must be true. + len: num::NonZeroU32, + /// Returns the bits to set as the lower `len` bits of the byte. + bits: u8, + /// Marker for whether it can be used in plaintext or encrypted data elements. + flavor: marker::PhantomData<F>, +} + +/// Core trait for an individual action +pub trait ActionElement { + /// The offset from the high bit in the eventual bit sequence of all actions. + /// See [ActionElementBits.index]. + /// + /// Each implementation must have a non-overlapping sequence of bits defined by + /// `HIGH_BIT_INDEX` and `BITS_LEN` w.r.t every other implementation. + const HIGH_BIT_INDEX: u32; + /// The number of high bits in a `u8` that should be used when assembling the complete + /// action bit vector. + /// + /// Must be >0. + const BITS_LEN: u32; + /// Forces implementations to have a matching enum variant so the enum can be kept up to date. + const ACTION_TYPE: ActionType; + + /// Returns whether or not this action supports the provided `flavor`. + /// + /// Must match the implementations of [ToActionElement]. + fn supports_flavor(flavor: PacketFlavorEnum) -> bool; + + /// Returns true if the bits for this element are all zero, or if the flavor is supported. + fn action_is_supported_or_not_set(bits: u32, flavor: PacketFlavorEnum) -> bool { + let shifted = bits << Self::HIGH_BIT_INDEX; + let masked = shifted & (!(u32::MAX >> Self::BITS_LEN)); + + (masked == 0) || Self::supports_flavor(flavor) + } +} + +/// An analog of `Into` tailored to converting structs modeling specific action elements into the +/// representation needed by [ActionBits]. +pub trait ToActionElement<F: PacketFlavor>: ActionElement { + /// Convert the high-level representation of an element into the literal bits needed. + fn to_action_element(&self) -> ActionElementBits<F> { + ActionElementBits { + index: Self::HIGH_BIT_INDEX, + len: Self::BITS_LEN.try_into().expect("all elements must have nonzero len"), + bits: self.bits(), + flavor: marker::PhantomData, + } + } + + /// Returns the bits that should be set starting at `Self::INDEX`. + /// + /// Must not have more than the low `len()` bits set. + fn bits(&self) -> u8; +} + +/// Provides a way to iterate over all action types. +#[derive(Clone, Copy, strum_macros::EnumIter, PartialEq, Eq, Hash, Debug)] +#[allow(missing_docs)] +pub enum ActionType { + ContextSyncSeqNum, + ActiveUnlock, + NearbyShare, + InstantTethering, + PhoneHub, + Finder, + FastPairSass, + PresenceManager, +} + +impl ActionType { + /// A u32 with all possible bits for this action type set + const fn all_bits(&self) -> u32 { + (u32::MAX << (32_u32 - self.bits_len())) >> self.high_bit_index() + } + + /// Get the range of the bits occupied used by this bit index. For example, if the action type + /// uses the 5th and 6th bits, the returned range will be (5..7). + /// (0 is the index of the most significant bit). + #[cfg(feature = "devtools")] + pub const fn bits_range_for_devtools(&self) -> Range<u32> { + let high_bit_index = self.high_bit_index(); + high_bit_index..high_bit_index + self.bits_len() + } + + const fn high_bit_index(&self) -> u32 { + match self { + ActionType::ContextSyncSeqNum => ContextSyncSeqNum::HIGH_BIT_INDEX, + ActionType::ActiveUnlock => ActiveUnlock::HIGH_BIT_INDEX, + ActionType::NearbyShare => NearbyShare::HIGH_BIT_INDEX, + ActionType::InstantTethering => InstantTethering::HIGH_BIT_INDEX, + ActionType::PhoneHub => PhoneHub::HIGH_BIT_INDEX, + ActionType::Finder => Finder::HIGH_BIT_INDEX, + ActionType::FastPairSass => FastPairSass::HIGH_BIT_INDEX, + ActionType::PresenceManager => PresenceManager::HIGH_BIT_INDEX, + } + } + + const fn bits_len(&self) -> u32 { + match self { + ActionType::ContextSyncSeqNum => ContextSyncSeqNum::BITS_LEN, + ActionType::ActiveUnlock => ActiveUnlock::BITS_LEN, + ActionType::NearbyShare => NearbyShare::BITS_LEN, + ActionType::InstantTethering => InstantTethering::BITS_LEN, + ActionType::PhoneHub => PhoneHub::BITS_LEN, + ActionType::Finder => Finder::BITS_LEN, + ActionType::FastPairSass => FastPairSass::BITS_LEN, + ActionType::PresenceManager => PresenceManager::BITS_LEN, + } + } + + pub(crate) fn supports_flavor(&self, flavor: PacketFlavorEnum) -> bool { + match self { + ActionType::ContextSyncSeqNum => ContextSyncSeqNum::supports_flavor(flavor), + ActionType::ActiveUnlock => ActiveUnlock::supports_flavor(flavor), + ActionType::NearbyShare => NearbyShare::supports_flavor(flavor), + ActionType::InstantTethering => InstantTethering::supports_flavor(flavor), + ActionType::PhoneHub => PhoneHub::supports_flavor(flavor), + ActionType::Finder => Finder::supports_flavor(flavor), + ActionType::FastPairSass => FastPairSass::supports_flavor(flavor), + ActionType::PresenceManager => PresenceManager::supports_flavor(flavor), + } + } +} + +impl ActionElement for ContextSyncSeqNum { + const HIGH_BIT_INDEX: u32 = 0; + const BITS_LEN: u32 = 4; + const ACTION_TYPE: ActionType = ActionType::ContextSyncSeqNum; + + fn supports_flavor(flavor: PacketFlavorEnum) -> bool { + match flavor { + PacketFlavorEnum::Plaintext => true, + PacketFlavorEnum::Ciphertext => true, + } + } +} + +impl ToActionElement<Plaintext> for ContextSyncSeqNum { + fn bits(&self) -> u8 { + self.as_u8() + } +} + +impl ToActionElement<Ciphertext> for ContextSyncSeqNum { + fn bits(&self) -> u8 { + self.as_u8() + } +} + +// enabling an element for public adv requires privacy approval due to fingerprinting risk + +macros::boolean_element!(ActiveUnlock, 8, ciphertext_only); +macros::boolean_element!(NearbyShare, 9, plaintext_and_ciphertext); +macros::boolean_element!(InstantTethering, 10, ciphertext_only); +macros::boolean_element!(PhoneHub, 11, ciphertext_only); +macros::boolean_element!(PresenceManager, 12, ciphertext_only); +macros::boolean_element!(Finder, 13, plaintext_only); +macros::boolean_element!(FastPairSass, 14, plaintext_only);
diff --git a/nearby/presence/np_adv/src/legacy/actions/tests.rs b/nearby/presence/np_adv/src/legacy/actions/tests.rs new file mode 100644 index 0000000..2e3fda0 --- /dev/null +++ b/nearby/presence/np_adv/src/legacy/actions/tests.rs
@@ -0,0 +1,378 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +extern crate std; + +use crate::legacy::{ + actions::*, serialize::ToDataElementBundle, Ciphertext, PacketFlavorEnum, Plaintext, +}; +use std::collections; + +#[test] +fn set_context_sync_works() { + let mut actions = ActionBits::<Plaintext>::default(); + + actions.set_action(ContextSyncSeqNum::try_from(15).unwrap()); + assert_eq_hex(0xF0000000, actions.bits); + + assert_eq!(actions.bits_for_type(&ActionType::ContextSyncSeqNum), 15); +} + +#[test] +fn set_context_sync_doesnt_clobber_neighboring_bit() { + let mut actions = ActionBits::<Plaintext>::default(); + + // set bit just below + actions.bits |= 0x8000000; + + actions.set_action(ContextSyncSeqNum::try_from(15).unwrap()); + assert_eq_hex(0xF8000000, actions.bits); + + assert_eq!(actions.bits_for_type(&ActionType::ContextSyncSeqNum), 15); +} + +#[test] +fn unset_context_sync_works() { + let mut actions = ActionBits::<Plaintext> { + // all 1s + bits: u32::MAX, + ..Default::default() + }; + + actions.set_action(ContextSyncSeqNum::try_from(0).unwrap()); + assert_eq_hex(0x0FFFFFFF, actions.bits); + + assert_eq!(actions.bits_for_type(&ActionType::ContextSyncSeqNum), 0); +} + +#[test] +fn set_ns_works() { + let mut actions = ActionBits::<Plaintext>::default(); + + actions.set_action(NearbyShare::from(true)); + assert_eq_hex(0x00400000, actions.bits); + + assert_eq!(actions.bits_for_type(&ActionType::NearbyShare), 1); + assert_eq!(actions.bits_for_type(&ActionType::ActiveUnlock), 0); + assert_eq!(actions.bits_for_type(&ActionType::InstantTethering), 0); +} + +#[test] +fn set_ns_doesnt_clobber_others() { + let mut actions = ActionBits::<Plaintext>::default(); + + // set neighboring bits + actions.bits |= 0x00120000; + + actions.set_action(NearbyShare::from(true)); + assert_eq_hex(0x00520000, actions.bits); + + assert_eq!(actions.bits_for_type(&ActionType::NearbyShare), 1); + assert_eq!(actions.bits_for_type(&ActionType::PhoneHub), 1); + assert_eq!(actions.bits_for_type(&ActionType::FastPairSass), 1); +} + +#[test] +fn unset_ns_works() { + let mut actions = ActionBits::<Plaintext> { + // all 1s + bits: u32::MAX, + ..Default::default() + }; + + actions.set_action(NearbyShare::from(false)); + assert_eq_hex(0xFFBFFFFF, actions.bits); +} + +#[test] +fn set_last_bit_works() { + let mut actions = ActionBits::<Plaintext>::default(); + + actions.set_action(LastBit::from(true)); + assert_eq_hex(0x0100, actions.bits); +} + +#[test] +fn set_last_bit_doesnt_clobber_others() { + let mut actions = ActionBits::<Plaintext>::default(); + + // set neighboring bits + actions.bits |= 0x200; + + actions.set_action(LastBit::from(true)); + assert_eq_hex(0x300, actions.bits); +} + +#[test] +fn unset_last_bit_works() { + let mut actions = ActionBits::<Plaintext> { + // all 1s + bits: u32::MAX, + ..Default::default() + }; + + actions.set_action(LastBit::from(false)); + assert_eq_hex(0xFFFFFEFF, actions.bits); +} + +#[test] +fn bytes_used_works() { + let mut actions = ActionBits::<Plaintext>::default(); + + // Special-case: All-zeroes should lead to a single byte being used. + assert_eq!(1, actions.bytes_used()); + + actions.set_action(ContextSyncSeqNum::try_from(3).unwrap()); + assert_eq!(1, actions.bytes_used()); + + actions.set_action(NearbyShare::from(true)); + assert_eq!(2, actions.bytes_used()); + + actions.set_action(LastBit::from(true)); + assert_eq!(3, actions.bytes_used()); + + actions.set_action(LastBit::from(false)); + assert_eq!(2, actions.bytes_used()); +} + +#[test] +fn write_de_empty_actions() { + // The special case of no action bits set should still occupy one byte [of all zeroes]. + let de = ActionsDataElement::<Plaintext>::from(ActionBits::default()).to_de_bundle(); + + assert_eq!(&[0x00], de.contents_as_slice()); +} + +#[test] +fn write_de_one_action_byte() { + let mut action = ActionBits::default(); + action.set_action(ContextSyncSeqNum::try_from(7).unwrap()); + let de = ActionsDataElement::<Plaintext>::from(action).to_de_bundle(); + + assert_eq!(&[0x70], de.contents_as_slice()); +} + +#[test] +fn write_de_three_action_bytes() { + let mut action = ActionBits::default(); + action.set_action(LastBit::from(true)); + let de = ActionsDataElement::<Plaintext>::from(action).to_de_bundle(); + + assert_eq!(&[0, 0, 1], de.contents_as_slice()); +} + +#[test] +fn write_de_all_plaintext_actions() { + let mut action = all_plaintext_actions(); + action.set_action(LastBit::from(true)); + let de = ActionsDataElement::<Plaintext>::from(action).to_de_bundle(); + + // byte 0: context sync + // byte 1: nearby share, finder, fp sass + // byte 2: last bit + assert_eq!(&[0x90, 0x46, 0x01], de.contents_as_slice()); +} + +#[test] +fn write_de_all_encrypted_actions() { + let mut action = all_ciphertext_actions(); + action.set_action(LastBit::from(true)); + let de = ActionsDataElement::<Ciphertext>::from(action).to_de_bundle(); + + // byte 1: context sync num = 9, 4 unused bits + // byte 2: active unlock, nearby share, instant tethering, phone hub, + // presence manager, last 3 bits unused + // byte 3: last bit + assert_eq!(&[0x90, 0xF8, 0x01], de.contents_as_slice()); +} + +#[test] +fn action_element_nonzero_len() { + for t in ActionType::iter() { + assert!(t.bits_len() > 0); + } +} + +#[test] +fn action_element_bits_dont_overlap() { + let type_to_bits = + ActionType::iter().map(|t| (t, t.all_bits())).collect::<collections::HashMap<_, _>>(); + + for t in ActionType::iter() { + let bits = type_to_bits.get(&t).unwrap(); + + for (_, other_bits) in type_to_bits.iter().filter(|(other_type, _)| t != **other_type) { + assert_eq!(0, bits & other_bits, "type {t:?}"); + } + } +} + +#[test] +fn action_type_all_bits() { + assert_eq!(0xF0000000, ActionType::ContextSyncSeqNum.all_bits()); + assert_eq!(0x00800000, ActionType::ActiveUnlock.all_bits()); + assert_eq!(0x00020000, ActionType::FastPairSass.all_bits()); +} + +#[test] +fn action_type_all_bits_in_per_type_masks() { + for t in ActionType::iter().filter(|t| t.supports_flavor(PacketFlavorEnum::Plaintext)) { + assert_eq!(t.all_bits(), t.all_bits() & *ALL_PLAINTEXT_ELEMENT_BITS); + } + for t in ActionType::iter().filter(|t| t.supports_flavor(PacketFlavorEnum::Ciphertext)) { + assert_eq!(t.all_bits(), t.all_bits() & *ALL_CIPHERTEXT_ELEMENT_BITS); + } +} + +#[test] +fn action_bits_try_from_flavor_mismatch_plaintext() { + assert_eq!( + FlavorNotSupported { flavor: PacketFlavorEnum::Plaintext }, + ActionBits::<Plaintext>::try_from(ActionType::PresenceManager.all_bits()).unwrap_err() + ); + assert_eq!( + 0xF0000000, + ActionBits::<Plaintext>::try_from(ActionType::ContextSyncSeqNum.all_bits()).unwrap().bits + ); +} + +#[test] +fn action_bits_try_from_flavor_mismatch_ciphertext() { + assert_eq!( + FlavorNotSupported { flavor: PacketFlavorEnum::Ciphertext }, + ActionBits::<Ciphertext>::try_from(ActionType::Finder.all_bits()).unwrap_err() + ); + assert_eq!( + 0xF0000000, + ActionBits::<Ciphertext>::try_from(ActionType::ContextSyncSeqNum.all_bits()).unwrap().bits + ); +} + +#[test] +fn actions_de_deser_plaintext_with_ciphertext_action() { + assert_eq!( + DataElementDeserializeError::FlavorNotSupported { + de_type: DataElementType::Actions, + flavor: PacketFlavorEnum::Plaintext + }, + <ActionsDataElement<Plaintext> as DataElement>::deserialize::<Plaintext>(&[ + // active unlock bit set + 0x00, 0x80, 0x00, + ]) + .unwrap_err() + ); +} + +#[test] +fn actions_de_deser_ciphertext_with_plaintext_action() { + assert_eq!( + DataElementDeserializeError::FlavorNotSupported { + de_type: DataElementType::Actions, + flavor: PacketFlavorEnum::Ciphertext + }, + <ActionsDataElement<Ciphertext> as DataElement>::deserialize::<Ciphertext>(&[ + // Finder bit set + 0x00, 0x00, 0x80, + ]) + .unwrap_err() + ); +} + +#[test] +fn context_sync_seq_num_works() { + let mut action_bits = ActionBits::<Plaintext>::default(); + action_bits.set_action(ContextSyncSeqNum::try_from(15).unwrap()); + let action_de = ActionsDataElement::from(action_bits); + assert_eq!(15, action_de.context_sync_seq_num().as_u8()); +} + +#[test] +fn context_sync_seq_num_default_zero() { + let action_bits = ActionBits::<Plaintext>::default(); + let action_de = ActionsDataElement::from(action_bits); + assert_eq!(0, action_de.context_sync_seq_num().as_u8()); +} + +#[test] +fn has_action_plaintext_works() { + let mut action_bits = ActionBits::<Plaintext>::default(); + action_bits.set_action(ContextSyncSeqNum::try_from(15).unwrap()); + action_bits.set_action(NearbyShare::from(true)); + let action_de = ActionsDataElement::from(action_bits); + assert_eq!(action_de.has_action(&ActionType::NearbyShare), Some(true)); + assert_eq!(action_de.has_action(&ActionType::ActiveUnlock), Some(false)); + assert_eq!(action_de.has_action(&ActionType::PhoneHub), Some(false)); +} + +#[test] +fn has_action_encrypted_works() { + let mut action_bits = ActionBits::<Ciphertext>::default(); + action_bits.set_action(ContextSyncSeqNum::try_from(15).unwrap()); + action_bits.set_action(NearbyShare::from(true)); + action_bits.set_action(ActiveUnlock::from(true)); + let action_de = ActionsDataElement::from(action_bits); + assert_eq!(action_de.has_action(&ActionType::NearbyShare), Some(true)); + assert_eq!(action_de.has_action(&ActionType::ActiveUnlock), Some(true)); + assert_eq!(action_de.has_action(&ActionType::PhoneHub), Some(false)); + assert_eq!(action_de.has_action(&ActionType::ContextSyncSeqNum), None); +} + +// hypothetical action using the last bit +#[derive(Debug)] +struct LastBit { + enabled: bool, +} +impl From<bool> for LastBit { + fn from(value: bool) -> Self { + LastBit { enabled: value } + } +} +impl ActionElement for LastBit { + const HIGH_BIT_INDEX: u32 = 23; + const BITS_LEN: u32 = 1; + + // don't want to add a variant for this test only type + const ACTION_TYPE: ActionType = ActionType::ActiveUnlock; + + fn supports_flavor(_flavor: PacketFlavorEnum) -> bool { + true + } +} + +macros::boolean_element_to_plaintext_element!(LastBit); +macros::boolean_element_to_encrypted_element!(LastBit); + +fn assert_eq_hex(expected: u32, actual: u32) { + assert_eq!(expected, actual, "{expected:#010X} != {actual:#010X}"); +} + +pub(crate) fn all_plaintext_actions() -> ActionBits<Plaintext> { + let mut action = ActionBits::default(); + action.set_action(ContextSyncSeqNum::try_from(9).unwrap()); + action.set_action(NearbyShare::from(true)); + action.set_action(Finder::from(true)); + action.set_action(FastPairSass::from(true)); + action +} + +pub(crate) fn all_ciphertext_actions() -> ActionBits<Ciphertext> { + let mut action = ActionBits::default(); + action.set_action(ContextSyncSeqNum::try_from(9).unwrap()); + action.set_action(ActiveUnlock::from(true)); + action.set_action(NearbyShare::from(true)); + action.set_action(InstantTethering::from(true)); + action.set_action(PhoneHub::from(true)); + action.set_action(PresenceManager::from(true)); + action +}
diff --git a/nearby/presence/np_adv/src/legacy/data_elements.rs b/nearby/presence/np_adv/src/legacy/data_elements.rs new file mode 100644 index 0000000..e9c2308 --- /dev/null +++ b/nearby/presence/np_adv/src/legacy/data_elements.rs
@@ -0,0 +1,109 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! V0 data elements and core trait impls. +use crate::legacy::{ + de_type::{DataElementType, PlainDataElementType}, + serialize::{DataElementBundle, ToDataElementBundle}, + PacketFlavor, PacketFlavorEnum, +}; +use crate::shared_data::*; + +/// Core behavior for data elements. +/// +/// See also [ToDataElementBundle] for flavor-specific, infallible serialization. +pub trait DataElement: Sized { + /// The corresponding DataElementType variant. + const DE_TYPE_VARIANT: DataElementType; + + /// Return true if the DE supports serialization and deserialization for the provided flavor. + fn supports_flavor(flavor: PacketFlavorEnum) -> bool; + + /// Returns `Err` if the flavor is not supported or if parsing fails. + /// + /// `<F>` is the flavor of the packet being deserialized. + fn deserialize<F: PacketFlavor>( + de_contents: &[u8], + ) -> Result<Self, DataElementDeserializeError>; +} + +/// Errors possible when deserializing a DE +#[derive(Debug, PartialEq, Eq, Clone, Copy)] +pub enum DataElementDeserializeError { + /// The data element doesn't support the [PacketFlavor] of the advertisement packet. + FlavorNotSupported { + /// The DE type attempting to be deserialized + de_type: DataElementType, + /// The flavor that was not supported + flavor: PacketFlavorEnum, + }, + /// The data element couldn't be deserialized from the supplied data. + DeserializeError { + /// The DE type attempting to be deserialized + de_type: DataElementType, + }, +} + +/// Data element holding a [TxPower]. +#[derive(Debug, PartialEq, Eq)] +pub struct TxPowerDataElement { + tx_power: TxPower, +} + +impl TxPowerDataElement { + /// Gets the underlying Tx Power value + pub fn tx_power_value(&self) -> i8 { + self.tx_power.as_i8() + } +} + +impl From<TxPower> for TxPowerDataElement { + fn from(tx_power: TxPower) -> Self { + Self { tx_power } + } +} + +impl<F: PacketFlavor> ToDataElementBundle<F> for TxPowerDataElement { + fn to_de_bundle(&self) -> DataElementBundle<F> { + let tx_power = self.tx_power.as_i8(); + DataElementBundle::try_from( + PlainDataElementType::TxPower, + tx_power.to_be_bytes().as_slice(), + ) + .expect("Length < max DE size") + } +} + +impl DataElement for TxPowerDataElement { + const DE_TYPE_VARIANT: DataElementType = DataElementType::TxPower; + + fn supports_flavor(flavor: PacketFlavorEnum) -> bool { + match flavor { + PacketFlavorEnum::Plaintext => true, + PacketFlavorEnum::Ciphertext => true, + } + } + fn deserialize<F: PacketFlavor>( + de_contents: &[u8], + ) -> Result<Self, DataElementDeserializeError> { + de_contents + .try_into() + .ok() + .and_then(|arr: [u8; 1]| TxPower::try_from(i8::from_be_bytes(arr)).ok()) + .map(|tx_power| Self { tx_power }) + .ok_or(DataElementDeserializeError::DeserializeError { + de_type: DataElementType::TxPower, + }) + } +}
diff --git a/nearby/presence/np_adv/src/legacy/de_type/mod.rs b/nearby/presence/np_adv/src/legacy/de_type/mod.rs new file mode 100644 index 0000000..5c7ebfa --- /dev/null +++ b/nearby/presence/np_adv/src/legacy/de_type/mod.rs
@@ -0,0 +1,355 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! V0 data element types. +//! +//! In V0, there are only 16 DE types total, and parsing unknown types is not possible, so we can +//! represent all known DE types in enums without needing to handle the "unknown type" case. + +use crate::{ + de_type::IdentityDataElementType, + legacy::{ + actions::ActionsDataElement, + data_elements::{DataElement as _, TxPowerDataElement}, + Ciphertext, PacketFlavorEnum, Plaintext, NP_MAX_DE_CONTENT_LEN, + }, + DeLengthOutOfRange, +}; +use core::ops; +use ldt_np_adv::NP_LEGACY_METADATA_KEY_LEN; +use strum_macros::EnumIter; + +#[cfg(test)] +mod tests; + +/// A V0 DE type in `[0, 15]`. +#[derive(Debug, PartialEq, Eq, Hash)] +pub(crate) struct DeTypeCode { + /// The code used in a V0 adv header + code: u8, +} + +impl DeTypeCode { + /// Returns a u8 in `[0, 15`]. + pub(crate) fn as_u8(&self) -> u8 { + self.code + } +} + +#[derive(Debug, PartialEq, Eq, Clone, Copy)] +pub(crate) struct DeTypeCodeOutOfRange; + +impl TryFrom<u8> for DeTypeCode { + type Error = DeTypeCodeOutOfRange; + + fn try_from(value: u8) -> Result<Self, Self::Error> { + if value < 16 { + Ok(Self { code: value }) + } else { + Err(DeTypeCodeOutOfRange) + } + } +} + +/// The actual length of a DE, not the encoded representation. +/// +/// See [DeEncodedLength] for the encoded length. +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] +pub(crate) struct DeActualLength { + /// Invariant: <= `NP_MAX_DE_CONTENT_LEN`. + len: u8, +} + +impl DeActualLength { + pub(crate) const ZERO: DeActualLength = DeActualLength { len: 0 }; + + pub(crate) fn as_usize(&self) -> usize { + self.len as usize + } +} + +impl TryFrom<u8> for DeActualLength { + type Error = DeLengthOutOfRange; + + fn try_from(value: u8) -> Result<Self, Self::Error> { + if (value as usize) <= NP_MAX_DE_CONTENT_LEN { + Ok(Self { len: value }) + } else { + Err(DeLengthOutOfRange) + } + } +} + +impl TryFrom<usize> for DeActualLength { + type Error = DeLengthOutOfRange; + + fn try_from(value: usize) -> Result<Self, Self::Error> { + if value <= NP_MAX_DE_CONTENT_LEN { + Ok(Self { len: value as u8 }) + } else { + Err(DeLengthOutOfRange) + } + } +} + +/// The encoded length of a DE, not the actual length of the DE contents. +/// +/// See [DeActualLength] for the length of the contents. +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] +pub(crate) struct DeEncodedLength { + /// Invariant: `len <= 0x0F` (15, aka 4 bits) + len: u8, +} + +impl DeEncodedLength { + /// Returns a u8 in `[0, 15]` + pub(crate) fn as_u8(&self) -> u8 { + self.len + } + + /// Returns a usize in `[0, 15]` + pub(crate) fn as_usize(&self) -> usize { + self.len as usize + } +} + +impl TryFrom<u8> for DeEncodedLength { + type Error = DeLengthOutOfRange; + + fn try_from(value: u8) -> Result<Self, Self::Error> { + if value < 16 { + Ok(Self { len: value }) + } else { + Err(DeLengthOutOfRange) + } + } +} + +/// DE types for normal DEs (not an identity). +/// +/// May be contained in identity DEs (see [IdentityDataElementType]). Must not overlap with +/// [IdentityDataElementType]. +#[derive(EnumIter, Debug, Clone, Copy, PartialEq, Eq)] +pub(crate) enum PlainDataElementType { + TxPower, + Actions, +} + +impl PlainDataElementType { + pub(crate) fn as_generic_de_type(&self) -> DataElementType { + match self { + PlainDataElementType::TxPower => DataElementType::TxPower, + PlainDataElementType::Actions => DataElementType::Actions, + } + } + + pub(crate) fn supports_flavor(&self, flavor: PacketFlavorEnum) -> bool { + match self { + PlainDataElementType::Actions => { + // Actions is effectively two different DEs based on which actions it can + // contain, so we have to check them separately. The Plaintext one obviously + // supports plaintext, and vice versa, so we could just say `true` here, but we + // spell it out to be consistent with the other DE types. + match flavor { + PacketFlavorEnum::Plaintext => { + ActionsDataElement::<Plaintext>::supports_flavor(flavor) + } + PacketFlavorEnum::Ciphertext => { + ActionsDataElement::<Ciphertext>::supports_flavor(flavor) + } + } + } + PlainDataElementType::TxPower => TxPowerDataElement::supports_flavor(flavor), + } + } +} + +/// Corresponds to the different implementations of [DataElement]. +/// +/// It's intended for use cases that don't care if a DE is a plain or identity DE. Every variant +/// corresponds to either a [PlainDataElementType] or a [IdentityDataElementType]. +#[derive(EnumIter, Debug, Clone, Copy, PartialEq, Eq)] +#[allow(missing_docs)] +#[doc(hidden)] +pub enum DataElementType { + PrivateIdentity, + TrustedIdentity, + PublicIdentity, + ProvisionedIdentity, + TxPower, + Actions, +} + +const DE_TYPES_BY_CODE: [Option<DataElementType>; 16] = [ + None, // 0b0000 + Some(DataElementType::PrivateIdentity), // 0b0001 + Some(DataElementType::TrustedIdentity), // 0b0010 + Some(DataElementType::PublicIdentity), // 0b0011 + Some(DataElementType::ProvisionedIdentity), // 0b0100 + Some(DataElementType::TxPower), // 0b0101 + Some(DataElementType::Actions), // 0b0110 + None, // 0b0111 + None, // 0b1000 + None, // 0b1001 + None, // 0b1010 + None, // 0b1011 + None, // 0b1100 + None, // 0b1101 + None, // 0b1110 + None, // 0b1111 +]; + +impl DataElementType { + /// Salt + key + at least 2 bytes of DE to make LDT ciphertext min length + const VALID_ENCRYPTED_IDENTITY_DE_ACTUAL_LEN: ops::RangeInclusive<usize> = + (2 + NP_LEGACY_METADATA_KEY_LEN + 2..=NP_MAX_DE_CONTENT_LEN); + const VALID_ENCRYPTED_IDENTITY_DE_HEADER_LEN: ops::RangeInclusive<usize> = (2..=6); + + /// If there is a corresponding [ContainerDataElementType], returns it, otherwise None. + pub(crate) fn try_as_identity_de_type(&self) -> Option<IdentityDataElementType> { + match self { + DataElementType::PrivateIdentity => Some(IdentityDataElementType::Private), + DataElementType::TrustedIdentity => Some(IdentityDataElementType::Trusted), + DataElementType::PublicIdentity => Some(IdentityDataElementType::Public), + DataElementType::ProvisionedIdentity => Some(IdentityDataElementType::Provisioned), + DataElementType::TxPower | DataElementType::Actions => None, + } + } + + /// If there is a corresponding [PlainDataElementType], returns it, otherwise None. + pub(crate) fn try_as_plain_de_type(&self) -> Option<PlainDataElementType> { + match self { + DataElementType::TxPower => Some(PlainDataElementType::TxPower), + DataElementType::Actions => Some(PlainDataElementType::Actions), + DataElementType::PrivateIdentity + | DataElementType::TrustedIdentity + | DataElementType::PublicIdentity + | DataElementType::ProvisionedIdentity => None, + } + } + + /// Returns the matching type for the code, else `None` + pub(crate) fn from_type_code(de_type: DeTypeCode) -> Option<Self> { + DE_TYPES_BY_CODE.get(de_type.as_u8() as usize).and_then(|o| *o) + } + + /// A type code in `[0,15]` for use in the high bits of the DE header byte. + pub(crate) fn type_code(&self) -> DeTypeCode { + match self { + DataElementType::PrivateIdentity => IdentityDataElementType::Private.shared_type_code(), + DataElementType::TrustedIdentity => IdentityDataElementType::Trusted.shared_type_code(), + DataElementType::PublicIdentity => IdentityDataElementType::Public.shared_type_code(), + DataElementType::ProvisionedIdentity => { + IdentityDataElementType::Provisioned.shared_type_code() + } + DataElementType::TxPower => 0b0101, + DataElementType::Actions => 0b0110, + } + .try_into() + .expect("hardcoded type codes are valid") + } + + /// Convert the actual DE length to the encoded length included in the header. + /// + /// Returns `Err` if the actual length is invalid for the type, or the corresponding encoded length is out of range. + pub(crate) fn encoded_len_for_actual_len( + &self, + actual_len: DeActualLength, + ) -> Result<DeEncodedLength, DeLengthOutOfRange> { + match self { + // TODO 0-length provisioned + DataElementType::PrivateIdentity + | DataElementType::TrustedIdentity + | DataElementType::ProvisionedIdentity => { + if !Self::VALID_ENCRYPTED_IDENTITY_DE_ACTUAL_LEN.contains(&actual_len.as_usize()) { + Err(DeLengthOutOfRange) + } else { + actual_len + .len + .checked_sub(16) + .ok_or(DeLengthOutOfRange) + .and_then(|n| n.try_into()) + } + } + DataElementType::PublicIdentity => { + if actual_len.len != 0 { + Err(DeLengthOutOfRange) + } else { + actual_len.len.try_into() + } + } + DataElementType::TxPower => { + if actual_len.len != 1 { + Err(DeLengthOutOfRange) + } else { + actual_len.len.try_into() + } + } + DataElementType::Actions => { + // doesn't matter which variant is used + if !ActionsDataElement::<Plaintext>::ACTIONS_LEN.contains(&actual_len.as_usize()) { + Err(DeLengthOutOfRange) + } else { + actual_len.len.try_into() + } + } + } + } + + /// Convert the length in the header to the actual DE length. + /// + /// Returns `Err` if the encoded length is invalid for the type, or the corresponding actual length is out of range. + pub(crate) fn actual_len_for_encoded_len( + &self, + header_len: DeEncodedLength, + ) -> Result<DeActualLength, DeLengthOutOfRange> { + match self { + DataElementType::PrivateIdentity + | DataElementType::TrustedIdentity + // TODO provisioned 0 length + | DataElementType::ProvisionedIdentity => { + if !Self::VALID_ENCRYPTED_IDENTITY_DE_HEADER_LEN.contains(&header_len.as_usize()) { + Err(DeLengthOutOfRange) + } else { + header_len + .len + .checked_add(16) + .ok_or(DeLengthOutOfRange) + .and_then(|n| n.try_into()) + } + } + DataElementType::PublicIdentity => { + if header_len.len != 0 { + Err(DeLengthOutOfRange) + } else { + header_len.len.try_into() + } + } + DataElementType::TxPower => { + if header_len.len != 1 { + Err(DeLengthOutOfRange) + } else { + header_len.len.try_into() + } + } + DataElementType::Actions => { + if !ActionsDataElement::<Plaintext>::ACTIONS_LEN.contains(&header_len.as_usize()) { + Err(DeLengthOutOfRange) + } else { + header_len.len.try_into() + } + } + } + } +}
diff --git a/nearby/presence/np_adv/src/legacy/de_type/tests.rs b/nearby/presence/np_adv/src/legacy/de_type/tests.rs new file mode 100644 index 0000000..59075aa --- /dev/null +++ b/nearby/presence/np_adv/src/legacy/de_type/tests.rs
@@ -0,0 +1,112 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +extern crate std; + +use super::*; +use crate::legacy::serialize::id_de_type_as_generic_de_type; +use std::{collections, vec::Vec}; +use strum::IntoEnumIterator as _; + +#[test] +fn no_plain_vs_identity_type_overlap() { + let plain_types = + PlainDataElementType::iter().map(|t| t.as_generic_de_type()).collect::<Vec<_>>(); + let identity_types = + IdentityDataElementType::iter().map(id_de_type_as_generic_de_type).collect::<Vec<_>>(); + + for plain_de_type in plain_types.iter() { + assert!(!identity_types.iter().any(|i| i == plain_de_type)); + assert_eq!(None, plain_de_type.try_as_identity_de_type()); + } + + for id_de_type in identity_types.iter() { + assert!(!plain_types.iter().any(|p| p == id_de_type)); + assert_eq!(None, id_de_type.try_as_plain_de_type()); + } +} + +#[test] +fn generic_type_is_either_plain_or_identity() { + let generic_types = DataElementType::iter().collect::<Vec<_>>(); + + for g in generic_types.iter() { + let total = g.try_as_identity_de_type().map(|_| 1).unwrap_or(0) + + g.try_as_plain_de_type().map(|_| 1).unwrap_or(0); + + assert_eq!(1, total); + } +} + +#[test] +fn generic_de_type_codes_are_consistent() { + for det in DataElementType::iter() { + let actual = DataElementType::from_type_code(det.type_code()); + assert_eq!(Some(det), actual) + } +} + +#[test] +fn generic_de_distinct_type_codes() { + let codes = + DataElementType::iter().map(|det| det.type_code()).collect::<collections::HashSet<_>>(); + assert_eq!(codes.len(), DataElementType::iter().count()); +} + +#[test] +fn generic_de_no_accidentally_mapped_type_codes() { + let codes = + DataElementType::iter().map(|det| det.type_code()).collect::<collections::HashSet<_>>(); + for possible_code in 0..=15 { + if codes.contains(&possible_code.try_into().unwrap()) { + continue; + } + + assert_eq!(None, DataElementType::from_type_code(possible_code.try_into().unwrap())); + } +} + +#[test] +fn actions_de_length_zero_rejected() { + let encoded = DeEncodedLength::try_from(0).unwrap(); + let maybe_actual_len = DataElementType::Actions.actual_len_for_encoded_len(encoded); + assert_eq!(Err(DeLengthOutOfRange), maybe_actual_len); +} + +#[test] +fn de_length_actual_encoded_round_trip() { + for de_type in DataElementType::iter() { + // for all possible lengths, calculate actual -> encoded and the inverse + let actual_to_encoded = (0_u8..=255) + .filter_map(|num| num.try_into().ok()) + .filter_map(|actual: DeActualLength| { + de_type.encoded_len_for_actual_len(actual).ok().map(|encoded| (actual, encoded)) + }) + .collect::<collections::HashMap<_, _>>(); + + let encoded_to_actual = (0_u8..=255) + .filter_map(|num| num.try_into().ok()) + .filter_map(|encoded: DeEncodedLength| { + de_type.actual_len_for_encoded_len(encoded).ok().map(|actual| (encoded, actual)) + }) + .collect::<collections::HashMap<_, _>>(); + + // ensure the two maps are inverses of each other + assert_eq!( + actual_to_encoded, + encoded_to_actual.into_iter().map(|(encoded, actual)| (actual, encoded)).collect(), + "de type: {de_type:?}" + ); + } +}
diff --git a/nearby/presence/np_adv/src/legacy/deserialize/mod.rs b/nearby/presence/np_adv/src/legacy/deserialize/mod.rs new file mode 100644 index 0000000..3119f48 --- /dev/null +++ b/nearby/presence/np_adv/src/legacy/deserialize/mod.rs
@@ -0,0 +1,416 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! V0 data element deserialization. +//! +//! This module only deals with the _contents_ of an advertisement, not the advertisement header. + +extern crate alloc; + +use crate::{ + de_type::EncryptedIdentityDataElementType, + legacy::{ + actions, + data_elements::{DataElement, *}, + de_type::{DataElementType, DeEncodedLength, DeTypeCode, PlainDataElementType}, + Ciphertext, PacketFlavor, Plaintext, NP_MAX_DE_CONTENT_LEN, + }, + PlaintextIdentityMode, +}; +use alloc::vec::Vec; +use crypto_provider::CryptoProvider; +use ldt_np_adv::{LegacySalt, NP_LEGACY_METADATA_KEY_LEN}; +use nom::{bytes, combinator, multi, number, sequence}; + +#[cfg(test)] +mod tests; + +/// Deserialize an advertisement into data elements (if plaintext) or an identity type and +/// ciphertext. +pub(crate) fn deserialize_adv_contents<C: CryptoProvider>( + input: &[u8], +) -> Result<IntermediateAdvContents, AdvDeserializeError> { + parse_raw_adv_contents::<C>(input).and_then(|raw_adv| match raw_adv { + RawAdvertisement::Plaintext(parc) => parc + .try_deserialize() + .map(IntermediateAdvContents::Plaintext) + .map_err(AdvDeserializeError::DataElementDeserializeError), + RawAdvertisement::Ciphertext(eac) => Ok(IntermediateAdvContents::Ciphertext(eac)), + }) +} + +/// Parse an advertisement's contents to the level of raw data elements (i.e no decryption, +/// no per-type deserialization, etc). +/// +/// Consumes the entire input. +fn parse_raw_adv_contents<C: CryptoProvider>( + input: &[u8], +) -> Result<RawAdvertisement, AdvDeserializeError> { + let (_, data_elements) = parse_data_elements(input) + .map_err(|_e| AdvDeserializeError::AdvertisementDeserializeError)?; + + if let Some(identity_de_type) = + data_elements.first().and_then(|de| de.de_type.try_as_identity_de_type()) + { + match identity_de_type.as_encrypted_identity_de_type() { + Some(encrypted_de_type) => { + if data_elements.len() == 1 { + match encrypted_de_type { + // TODO handle length=0 provisioned identity DEs + EncryptedIdentityDataElementType::Private + | EncryptedIdentityDataElementType::Trusted + | EncryptedIdentityDataElementType::Provisioned => { + combinator::map( + parse_encrypted_identity_de_contents, + |(salt, payload)| { + RawAdvertisement::Ciphertext(EncryptedAdvContents { + identity_type: encrypted_de_type, + salt_padder: ldt_np_adv::salt_padder::<16, C>(salt), + salt, + ciphertext: payload, + }) + }, + )(data_elements[0].contents) + .map(|(_rem, contents)| contents) + .map_err(|_e| AdvDeserializeError::AdvertisementDeserializeError) + } + } + } else { + Err(AdvDeserializeError::TooManyTopLevelDataElements) + } + } + // It's an identity de, but not encrypted, so it must be public, and the rest must be + // plain + None => plain_data_elements(&data_elements[1..]).map(|pdes| { + RawAdvertisement::Plaintext(PlaintextAdvRawContents { + identity_type: PlaintextIdentityMode::Public, + data_elements: pdes, + }) + }), + } + } else { + plain_data_elements(&data_elements).map(|pde| { + RawAdvertisement::Plaintext(PlaintextAdvRawContents { + identity_type: PlaintextIdentityMode::None, + data_elements: pde, + }) + }) + } +} + +/// Legacy advertisement parsing errors +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub(crate) enum AdvDeserializeError { + /// Parsing the overall advertisement or DE structure failed + AdvertisementDeserializeError, + /// Deserializing an individual DE from its DE contents failed + DataElementDeserializeError(DataElementDeserializeError), + /// Must not have any other top level data elements if there is an encrypted identity DE + TooManyTopLevelDataElements, + /// Must not have an identity DE inside an identity DE + InvalidDataElementHierarchy, +} + +/// Parse an advertisement's contents into raw DEs. +/// +/// Consumes the entire input. +fn parse_data_elements(adv_contents: &[u8]) -> nom::IResult<&[u8], Vec<RawDataElement>> { + combinator::all_consuming(multi::many0(parse_de))(adv_contents) +} + +/// Parse an individual DE into its header and contents. +fn parse_de(input: &[u8]) -> nom::IResult<&[u8], RawDataElement> { + let (remaining, (de_type, actual_len)) = + combinator::map_opt(number::complete::u8, |de_header| { + // header: LLLLTTTT + let len = de_header >> 4; + let de_type = de_header & 0x0F; + DeTypeCode::try_from(de_type).ok().and_then(DataElementType::from_type_code).and_then( + |de_type| { + len.try_into() + .ok() + .and_then(|len: DeEncodedLength| { + de_type.actual_len_for_encoded_len(len).ok() + }) + .map(|len| (de_type, len)) + }, + ) + })(input)?; + + combinator::map(bytes::complete::take(actual_len.as_usize()), move |contents| RawDataElement { + de_type, + contents, + })(remaining) +} + +/// Returns `Err`` if any DEs are not of a plain DE type. +fn plain_data_elements<'d, D: AsRef<[RawDataElement<'d>]>>( + data_elements: D, +) -> Result<Vec<RawPlainDataElement<'d>>, AdvDeserializeError> { + data_elements + .as_ref() + .iter() + .map(|de| { + de.de_type + .try_as_plain_de_type() + .map(|de_type| RawPlainDataElement { de_type, contents: de.contents }) + }) + .collect::<Option<Vec<_>>>() + .ok_or(AdvDeserializeError::InvalidDataElementHierarchy) +} + +/// Parse legacy encrypted identity DEs (private, trusted, provisioned) into salt and ciphertext +/// (encrypted metadata key and at least 2 bytes of DEs). +/// +/// Consumes the entire input. +fn parse_encrypted_identity_de_contents( + de_contents: &[u8], +) -> nom::IResult<&[u8], (ldt_np_adv::LegacySalt, &[u8])> { + combinator::all_consuming(sequence::tuple(( + // 2-byte salt + combinator::map( + combinator::map_res(bytes::complete::take(2_usize), |slice: &[u8]| slice.try_into()), + |arr: [u8; 2]| arr.into(), + ), + // 14-byte encrypted metadata key plus encrypted DEs, which must together be at least 16 + // bytes (AES block size), and at most a full DE minus the size of the salt. + bytes::complete::take_while_m_n(16_usize, NP_MAX_DE_CONTENT_LEN - 2, |_| true), + )))(de_contents) +} + +/// A data element with content length determined and validated per its type's length rules, but +/// no further decoding performed. +#[derive(Debug, PartialEq, Eq)] +struct RawDataElement<'d> { + de_type: DataElementType, + contents: &'d [u8], +} + +/// An advertisement broken down into data elements, but before decryption or mapping to higher +/// level DE representations. +#[derive(Debug, PartialEq, Eq)] +enum RawAdvertisement<'d> { + Plaintext(PlaintextAdvRawContents<'d>), + Ciphertext(EncryptedAdvContents<'d>), +} + +/// A plaintext advertisement's content in raw DEs but without further deserialization. +#[derive(Debug, PartialEq, Eq)] +struct PlaintextAdvRawContents<'d> { + identity_type: PlaintextIdentityMode, + data_elements: Vec<RawPlainDataElement<'d>>, +} + +impl<'d> PlaintextAdvRawContents<'d> { + /// Deserialize the DE contents into per-DE-type structures. + /// + /// Returns `Some` if each DE's contents can be successfully deserialized, otherwise `None`. + fn try_deserialize(&self) -> Result<PlaintextAdvContents, DataElementDeserializeError> { + self.data_elements + .iter() + .map(|de| de.try_deserialize::<Plaintext>()) + .collect::<Result<Vec<_>, _>>() + .map(|des| PlaintextAdvContents { + identity_type: self.identity_type, + data_elements: des, + }) + } +} + +/// A "plain" data element (not a container) without parsing the content. +#[derive(Debug, PartialEq, Eq)] +pub(crate) struct RawPlainDataElement<'d> { + de_type: PlainDataElementType, + contents: &'d [u8], +} + +impl<'d> RawPlainDataElement<'d> { + /// Deserialize into a [PlainDataElement] to expose DE-type-specific data representations. + /// + /// Returns `None` if the contents of the raw DE can't be deserialized into the corresponding + /// DE's representation. + fn try_deserialize<F>(&self) -> Result<PlainDataElement<F>, DataElementDeserializeError> + where + F: PacketFlavor, + actions::ActionsDataElement<F>: DataElement, + { + match self.de_type { + PlainDataElementType::Actions => { + actions::ActionsDataElement::deserialize::<F>(self.contents) + .map(PlainDataElement::Actions) + } + PlainDataElementType::TxPower => { + TxPowerDataElement::deserialize::<F>(self.contents).map(PlainDataElement::TxPower) + } + } + } +} + +/// Contents of an encrypted advertisement before decryption. +#[derive(Debug, PartialEq, Eq)] +pub(crate) struct EncryptedAdvContents<'d> { + identity_type: EncryptedIdentityDataElementType, + /// Salt from the advertisement, converted into a padder. + /// Pre-calculated so it's only derived once across multiple decrypt attempts. + salt_padder: ldt::XorPadder<{ crypto_provider::aes::BLOCK_SIZE }>, + /// The salt instance used for encryption of this advertisement. + salt: LegacySalt, + /// Ciphertext containing the metadata key and any data elements + ciphertext: &'d [u8], +} + +impl<'d> EncryptedAdvContents<'d> { + /// Try decrypting with an identity's LDT cipher and deserializing the resulting data elements. + /// + /// Returns the decrypted data if decryption and verification succeeded and the resulting DEs could be parsed + /// successfully, otherwise `Err`. + pub(crate) fn try_decrypt<C: CryptoProvider>( + &self, + cipher: &ldt_np_adv::LdtNpAdvDecrypterXtsAes128<C>, + ) -> Result<DecryptedAdvContents, DecryptError> { + let plaintext = cipher + .decrypt_and_verify(self.ciphertext, &self.salt_padder) + .map_err(|_e| DecryptError::DecryptOrVerifyError)?; + + // plaintext starts with 14 bytes of metadata key, then DEs. + + let (remaining, metadata_key) = combinator::map_res( + bytes::complete::take(NP_LEGACY_METADATA_KEY_LEN), + |slice: &[u8]| slice.try_into(), + )(plaintext.as_slice()) + .map_err(|_e: nom::Err<nom::error::Error<&[u8]>>| { + DecryptError::DeserializeError(AdvDeserializeError::AdvertisementDeserializeError) + })?; + + let (_remaining, raw_des) = combinator::all_consuming(parse_data_elements)(remaining) + .map_err(|_e| { + DecryptError::DeserializeError(AdvDeserializeError::AdvertisementDeserializeError) + })?; + + plain_data_elements(&raw_des)? + .into_iter() + .map(|de| de.try_deserialize()) + .collect::<Result<Vec<_>, _>>() + .map_err(|e| { + DecryptError::DeserializeError(AdvDeserializeError::DataElementDeserializeError(e)) + }) + .map(|data_elements| { + DecryptedAdvContents::new( + self.identity_type, + metadata_key, + self.salt, + data_elements, + ) + }) + } +} + +/// Errors that can occur decrypting encrypted advertisements. +#[derive(Debug, PartialEq, Eq, Clone, Copy)] +pub(crate) enum DecryptError { + /// Decrypting or verifying the advertisement ciphertext failed + DecryptOrVerifyError, + /// Decrypting succeeded, but deserializing from the plaintext failed + DeserializeError(AdvDeserializeError), +} + +impl From<AdvDeserializeError> for DecryptError { + fn from(e: AdvDeserializeError) -> Self { + DecryptError::DeserializeError(e) + } +} + +/// All v0 normal DE types with deserialized contents. +#[derive(Debug, PartialEq, Eq)] +#[allow(missing_docs)] +pub enum PlainDataElement<F: PacketFlavor> { + Actions(actions::ActionsDataElement<F>), + TxPower(TxPowerDataElement), +} + +/// The contents of a plaintext advertisement after deserializing DE contents +#[derive(Debug, PartialEq, Eq)] +pub struct PlaintextAdvContents { + identity_type: PlaintextIdentityMode, + data_elements: Vec<PlainDataElement<Plaintext>>, +} + +impl PlaintextAdvContents { + /// Returns the identity type used for the advertisement + pub fn identity(&self) -> PlaintextIdentityMode { + self.identity_type + } + /// Returns the deserialized data elements + pub fn data_elements(&self) -> impl Iterator<Item = &PlainDataElement<Plaintext>> { + self.data_elements.iter() + } + /// Destructures this V0 plaintext advertisement + /// into just the contained data elements + pub fn to_data_elements(self) -> Vec<PlainDataElement<Plaintext>> { + self.data_elements + } +} + +/// Contents of an encrypted advertisement after decryption and deserializing DEs. +#[derive(Debug, PartialEq, Eq)] +pub struct DecryptedAdvContents { + identity_type: EncryptedIdentityDataElementType, + metadata_key: [u8; NP_LEGACY_METADATA_KEY_LEN], + salt: LegacySalt, + data_elements: Vec<PlainDataElement<Ciphertext>>, +} + +impl DecryptedAdvContents { + /// Returns a new DecryptedAdvContents with the provided contents. + fn new( + identity_type: EncryptedIdentityDataElementType, + metadata_key: [u8; NP_LEGACY_METADATA_KEY_LEN], + salt: LegacySalt, + data_elements: Vec<PlainDataElement<Ciphertext>>, + ) -> Self { + Self { identity_type, metadata_key, salt, data_elements } + } + + /// The type of identity DE used in the advertisement. + pub fn identity_type(&self) -> EncryptedIdentityDataElementType { + self.identity_type + } + + /// The decrypted metadata key from the identity DE. + pub fn metadata_key(&self) -> &[u8; 14] { + &self.metadata_key + } + + /// Iterator over the data elements in an advertisement, except for any DEs related to resolving + /// the identity or otherwise validating the payload (e.g. any identity DEs like Private + /// Identity). + pub fn data_elements(&self) -> impl Iterator<Item = &PlainDataElement<Ciphertext>> { + self.data_elements.iter() + } + + /// The salt used for decryption of this advertisement. + pub fn salt(&self) -> LegacySalt { + self.salt + } +} + +/// The contents of an advertisement after plaintext DEs, if any, have been deserialized, but +/// before any decryption is done. +#[derive(Debug, PartialEq, Eq)] +pub(crate) enum IntermediateAdvContents<'d> { + /// Plaintext advertisements + Plaintext(PlaintextAdvContents), + /// Ciphertext advertisements + Ciphertext(EncryptedAdvContents<'d>), +}
diff --git a/nearby/presence/np_adv/src/legacy/deserialize/tests.rs b/nearby/presence/np_adv/src/legacy/deserialize/tests.rs new file mode 100644 index 0000000..b577cd9 --- /dev/null +++ b/nearby/presence/np_adv/src/legacy/deserialize/tests.rs
@@ -0,0 +1,815 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +extern crate std; + +use super::*; +use crate::legacy::actions::{ActionBits, ActionsDataElement}; +use crate::shared_data::TxPower; +use crate::{ + de_type::IdentityDataElementType, + legacy::{ + actions, + de_type::DeActualLength, + random_data_elements::{random_de_ciphertext, random_de_plaintext}, + serialize::{ + encode_de_header_actual_len, id_de_type_as_generic_de_type, AdvBuilder, + DataElementBundle, Identity, LdtIdentity, ToDataElementBundle as _, + }, + PacketFlavorEnum, BLE_ADV_SVC_CONTENT_LEN, + }, + parse_adv_header, shared_data, AdvHeader, NoIdentity, PublicIdentity, +}; +use array_view::ArrayView; +use crypto_provider_default::CryptoProviderImpl; +use init_with::InitWith as _; +use ldt_np_adv::LdtEncrypterXtsAes128; +use nom::error; +use rand_ext::rand::{prelude::SliceRandom, Rng as _}; +use std::vec; +use strum::IntoEnumIterator as _; + +#[test] +fn parse_empty_raw_adv() { + let data_elements = parse_raw_adv_contents::<CryptoProviderImpl>(&[]).unwrap(); + assert_eq!( + RawAdvertisement::Plaintext(PlaintextAdvRawContents { + identity_type: PlaintextIdentityMode::None, + data_elements: Vec::new() + }), + data_elements + ); +} + +#[test] +fn parse_raw_adv_1_de_short_no_identity() { + // battery uses the header length as is + let adv = parse_raw_adv_contents::<CryptoProviderImpl>(&[0x36, 0x01, 0x02, 0x03]).unwrap(); + assert_eq!( + RawAdvertisement::Plaintext(PlaintextAdvRawContents { + identity_type: PlaintextIdentityMode::None, + data_elements: vec![RawPlainDataElement { + de_type: PlainDataElementType::Actions, + contents: &[0x01, 0x02, 0x03] + }], + }), + adv + ); +} + +#[test] +fn parse_raw_adv_1_de_long_private_identity() { + // 3 bytes of payload after metadata key + let adv = parse_raw_adv_contents::<CryptoProviderImpl>(&[ + 0x31, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, + 0x0F, 0x10, 0x11, 0x12, 0x13, + ]) + .unwrap(); + assert_eq!( + RawAdvertisement::Ciphertext(EncryptedAdvContents { + identity_type: EncryptedIdentityDataElementType::Private, + salt_padder: ldt_np_adv::salt_padder::<16, CryptoProviderImpl>( + ldt_np_adv::LegacySalt::from([0x01, 0x02]) + ), + salt: ldt_np_adv::LegacySalt::from([0x01, 0x02]), + ciphertext: &[ + 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, + 0x11, 0x12, 0x13 + ] + }), + adv + ); +} + +#[test] +fn parse_raw_adv_3_de_public_identity() { + let adv = parse_raw_adv_contents::<CryptoProviderImpl>(&[ + 0x03, // public identity + 0x15, 0x05, // tx power 5 + 0x36, 0x11, 0x12, 0x13, // actions + ]) + .unwrap(); + assert_eq!( + RawAdvertisement::Plaintext(PlaintextAdvRawContents { + identity_type: PlaintextIdentityMode::Public, + data_elements: vec![ + RawPlainDataElement { de_type: PlainDataElementType::TxPower, contents: &[0x05] }, + RawPlainDataElement { + de_type: PlainDataElementType::Actions, + contents: &[0x11, 0x12, 0x13] + } + ], + }), + adv + ); +} + +#[test] +fn parse_raw_adv_0_de_public_identity() { + let adv = parse_raw_adv_contents::<CryptoProviderImpl>(&[ + 0x03, // public identity + ]) + .unwrap(); + assert_eq!( + RawAdvertisement::Plaintext(PlaintextAdvRawContents { + identity_type: PlaintextIdentityMode::Public, + data_elements: vec![], + }), + adv + ); +} + +#[test] +fn parse_raw_adv_1_de_length_overrun() { + // battery uses the header length as is + let input = &[0xFB, 0x01, 0x02, 0x03]; + assert_eq!( + nom::Err::Error(error::Error { input: input.as_slice(), code: error::ErrorKind::Eof }), + parse_data_elements(input).unwrap_err() + ); +} + +#[test] +fn parse_raw_adv_public_identity_containing_public_identity() { + let input = &[ + 0x03, // public identity + 0x03, // another public identity + 0x15, 0x03, // tx power de + ]; + assert_eq!( + AdvDeserializeError::InvalidDataElementHierarchy, + parse_raw_adv_contents::<CryptoProviderImpl>(input).unwrap_err() + ); +} + +#[test] +fn parse_raw_adv_no_identity_containing_public_identity() { + let input = &[ + 0x15, 0x03, // tx power de + 0x03, // public identity -- since it's not the first, this is a no identity adv + 0x15, 0x03, // tx power de + ]; + assert_eq!( + AdvDeserializeError::InvalidDataElementHierarchy, + parse_raw_adv_contents::<CryptoProviderImpl>(input).unwrap_err() + ); +} + +#[test] +fn parse_raw_adv_1_de_long_private_identity_with_another_top_level_de() { + let input = &[ + 0x31, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, + 0x0F, 0x10, 0x11, 0x12, 0x13, // private identity + 0x15, 0x03, // tx power de + ]; + assert_eq!( + AdvDeserializeError::TooManyTopLevelDataElements, + parse_raw_adv_contents::<CryptoProviderImpl>(input).unwrap_err() + ); +} + +#[test] +fn parse_raw_adv_private_identity_ciphertext_min_length() { + let short_input = &[ + // private identity w/ salt, len = 1 + 0x11, 0x10, 0x11, // 15 ciphertext bytes, + 2 salt = 17 total + 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, + ]; + assert_eq!( + AdvDeserializeError::AdvertisementDeserializeError, + parse_raw_adv_contents::<CryptoProviderImpl>(short_input).unwrap_err() + ); + + let ok_input = &[ + // private identity w/ salt + 0x21, 0x10, 0x11, // 16 ciphertext bytes, 18 bytes total de len, encoded len 2 + 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, + 0x2F, + ]; + assert_eq!( + RawAdvertisement::Ciphertext(EncryptedAdvContents { + identity_type: EncryptedIdentityDataElementType::Private, + salt: [0x10, 0x11].into(), + salt_padder: ldt_np_adv::salt_padder::<16, CryptoProviderImpl>([0x10, 0x11].into()), + ciphertext: &ok_input[3..] + }), + parse_raw_adv_contents::<CryptoProviderImpl>(ok_input).unwrap() + ); +} + +#[test] +fn parse_raw_adv_private_identity_ciphertext_too_long() { + let long_input = &[ + // private identity w/ salt, len = 7 + 0x71, 0x10, 0x11, // 21 ciphertext bytes, + 2 salt + 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, + 0x2F, 0x30, 0x31, 0x32, 0x33, 0x34, + ]; + assert_eq!( + AdvDeserializeError::AdvertisementDeserializeError, + parse_raw_adv_contents::<CryptoProviderImpl>(long_input).unwrap_err() + ); + + // removing 1 byte makes it work + let ok_input = &[ + // private identity w/ salt, len = 6 + 0x61, 0x10, 0x11, // 20 ciphertext bytes, + 2 salt + 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, + 0x2F, 0x30, 0x31, 0x32, 0x33, + ]; + assert_eq!( + RawAdvertisement::Ciphertext(EncryptedAdvContents { + identity_type: EncryptedIdentityDataElementType::Private, + salt_padder: ldt_np_adv::salt_padder::<16, CryptoProviderImpl>([0x10, 0x11].into()), + salt: [0x10, 0x11].into(), + ciphertext: &ok_input[3..] + }), + parse_raw_adv_contents::<CryptoProviderImpl>(ok_input).unwrap() + ); +} + +/// Test method body that creates an array, deserializes it into a DE, serializes it, +/// and asserts that the same bytes are produced. +/// +/// Evaluates to the deserialized DE. +macro_rules! de_roundtrip_test { + ($de_type:ty, $type_variant:ident, $de_variant:ident, $flavor:ty, $bytes:expr) => {{ + let parsed_de_enum = parse_plain_de::<$flavor>(PlainDataElementType::$type_variant, $bytes); + if let PlainDataElement::$de_variant(de) = parsed_de_enum { + let expected = <$de_type>::deserialize::<$flavor>($bytes).unwrap(); + assert_eq!(expected, de); + + let de_bundle: DataElementBundle<$flavor> = de.to_de_bundle(); + assert_eq!($bytes, de_bundle.contents_as_slice()); + + de + } else { + panic!("Unexpected variant: {:?}", parsed_de_enum); + } + }}; +} + +#[test] +fn actions_de_contents_roundtrip_plaintext() { + let actions = actions::tests::all_plaintext_actions(); + let bundle = actions::ActionsDataElement::from(actions).to_de_bundle(); + + de_roundtrip_test!( + actions::ActionsDataElement::<Plaintext>, + Actions, + Actions, + Plaintext, + bundle.contents_as_slice() + ); +} + +#[test] +fn actions_de_contents_roundtrip_ciphertext() { + let actions = actions::tests::all_ciphertext_actions(); + let bundle = actions::ActionsDataElement::from(actions).to_de_bundle(); + + de_roundtrip_test!( + actions::ActionsDataElement::<Ciphertext>, + Actions, + Actions, + Ciphertext, + bundle.contents_as_slice() + ); +} + +#[test] +fn tx_power_de_contents_roundtrip_plaintext() { + let tx = shared_data::TxPower::try_from(-10).unwrap(); + let bundle: DataElementBundle<Plaintext> = TxPowerDataElement::from(tx).to_de_bundle(); + + de_roundtrip_test!(TxPowerDataElement, TxPower, TxPower, Plaintext, bundle.contents_as_slice()); +} + +#[test] +fn tx_power_de_contents_roundtrip_ciphertext() { + let tx = shared_data::TxPower::try_from(-10).unwrap(); + let bundle: DataElementBundle<Ciphertext> = TxPowerDataElement::from(tx).to_de_bundle(); + + de_roundtrip_test!( + TxPowerDataElement, + TxPower, + TxPower, + Ciphertext, + bundle.contents_as_slice() + ); +} + +#[test] +fn parse_de_invalid_de_len_error() { + let input = &[ + // bogus 6-byte battery de -- only allows length = 3 + 0x6B, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, + ]; + + assert_eq!( + nom::Err::Error(error::Error { input: input.as_slice(), code: error::ErrorKind::MapOpt }), + parse_de(&input[..]).unwrap_err() + ); +} + +#[test] +fn plain_data_elements_matches_plain_des() { + assert_eq!( + vec![ + RawPlainDataElement { de_type: PlainDataElementType::TxPower, contents: &[0x01] }, + RawPlainDataElement { de_type: PlainDataElementType::Actions, contents: &[0x02] } + ], + plain_data_elements(&[ + RawDataElement { de_type: DataElementType::TxPower, contents: &[0x01] }, + RawDataElement { de_type: DataElementType::Actions, contents: &[0x02] } + ]) + .unwrap() + ); +} + +#[test] +fn plain_data_elements_rejects_identity_de_error() { + for idet in IdentityDataElementType::iter() { + assert_eq!( + AdvDeserializeError::InvalidDataElementHierarchy, + plain_data_elements(&[ + RawDataElement { de_type: DataElementType::TxPower, contents: &[0x01] }, + RawDataElement { de_type: id_de_type_as_generic_de_type(idet), contents: &[0x02] } + ]) + .unwrap_err() + ); + } +} + +#[test] +fn parse_encrypted_identity_contents_too_short_error() { + // 2 byte salt + 15 byte ciphertext: 1 too short + let input = <[u8; 17]>::init_with_indices(|i| i as u8); + assert_eq!( + nom::Err::Error(error::Error { input: &input[2..], code: error::ErrorKind::TakeWhileMN }), + parse_encrypted_identity_de_contents(&input).unwrap_err() + ); +} + +#[test] +fn parse_encrypted_identity_contents_ok() { + // 2 byte salt + minimum 16 byte ciphertext + let input = <[u8; 18]>::init_with_indices(|i| i as u8); + assert_eq!( + ([].as_slice(), (ldt_np_adv::LegacySalt::from([0, 1]), &input[2..])), + parse_encrypted_identity_de_contents(&input).unwrap() + ); +} + +#[test] +fn plaintext_random_adv_contents_round_trip_public() { + plaintext_random_adv_contents_round_trip(PublicIdentity::default, PlaintextIdentityMode::Public) +} + +#[test] +fn plaintext_random_adv_contents_round_trip_no_identity() { + plaintext_random_adv_contents_round_trip(NoIdentity::default, PlaintextIdentityMode::None) +} + +#[test] +fn ciphertext_random_adv_contents_round_trip() { + let mut rng = rand_ext::seeded_rng(); + let de_types: Vec<PlainDataElementType> = PlainDataElementType::iter() + .filter(|t| t.supports_flavor(PacketFlavorEnum::Ciphertext)) + .collect(); + let identity_de_types: Vec<EncryptedIdentityDataElementType> = + EncryptedIdentityDataElementType::iter().collect(); + + for _ in 0..10_000 { + let mut des = Vec::new(); + + let identity_type = *identity_de_types.choose(&mut rng).unwrap(); + let key_seed: [u8; 32] = rng.gen(); + let salt: ldt_np_adv::LegacySalt = rng.gen::<[u8; 2]>().into(); + let metadata_key: [u8; NP_LEGACY_METADATA_KEY_LEN] = rng.gen(); + let hkdf = np_hkdf::NpKeySeedHkdf::<CryptoProviderImpl>::new(&key_seed); + let ldt_key = hkdf.legacy_ldt_key(); + let metadata_key_hmac: [u8; 32] = + hkdf.legacy_metadata_key_hmac_key().calculate_hmac(&metadata_key); + let cipher = ldt_np_adv::build_np_adv_decrypter_from_key_seed(&hkdf, metadata_key_hmac); + let mut builder = AdvBuilder::new(LdtIdentity::<CryptoProviderImpl>::new( + identity_type, + salt, + metadata_key, + LdtEncrypterXtsAes128::<CryptoProviderImpl>::new(&ldt_key), + )); + + loop { + let de_type = *de_types.choose(&mut rng).unwrap(); + let (de, bundle) = random_de_ciphertext(de_type, &mut rng).unwrap(); + + if builder.add_data_element(bundle.clone()).ok().is_none() { + // out of room + if des.is_empty() { + // need at least one, so try again + continue; + } else { + // there's at least one so proceed to serialization + break; + } + } + + des.push(de); + } + + let serialized = builder.into_advertisement().unwrap(); + let (remaining, header) = parse_adv_header(serialized.as_slice()).unwrap(); + let parsed_adv = deserialize_adv_contents::<CryptoProviderImpl>(remaining).unwrap(); + + assert_eq!(AdvHeader::V0, header); + if let IntermediateAdvContents::Ciphertext(eac) = parsed_adv { + assert_eq!( + EncryptedAdvContents { + identity_type, + salt_padder: ldt_np_adv::salt_padder::<16, CryptoProviderImpl>(salt), + salt, + // skip adv header, de header, salt + ciphertext: &serialized.as_slice()[4..] + }, + eac + ); + + assert_eq!( + DecryptedAdvContents { identity_type, metadata_key, salt, data_elements: des }, + eac.try_decrypt(&cipher).unwrap() + ) + } else { + panic!("Unexpected variant: {:?}", parsed_adv); + } + } +} + +#[test] +fn decrypt_and_deserialize_ciphertext_adv_canned() { + let key_seed = [0x11_u8; 32]; + let salt: ldt_np_adv::LegacySalt = [0x22; 2].into(); + let metadata_key: [u8; NP_LEGACY_METADATA_KEY_LEN] = [0x33; NP_LEGACY_METADATA_KEY_LEN]; + + let hkdf = np_hkdf::NpKeySeedHkdf::<CryptoProviderImpl>::new(&key_seed); + let ldt_key = hkdf.legacy_ldt_key(); + let metadata_key_hmac: [u8; 32] = + hkdf.legacy_metadata_key_hmac_key().calculate_hmac(&metadata_key); + let cipher = ldt_np_adv::build_np_adv_decrypter_from_key_seed(&hkdf, metadata_key_hmac); + let mut builder = AdvBuilder::new(LdtIdentity::<CryptoProviderImpl>::new( + EncryptedIdentityDataElementType::Private, + salt, + metadata_key, + LdtEncrypterXtsAes128::<CryptoProviderImpl>::new(&ldt_key), + )); + + let tx = shared_data::TxPower::try_from(3).unwrap(); + builder.add_data_element(TxPowerDataElement::from(tx)).unwrap(); + + let serialized = builder.into_advertisement().unwrap(); + + assert_eq!( + &[ + 0x0, // adv header + 0x21, // private DE + 0x22, 0x22, // salt + // ciphertext + 0x85, 0xBF, 0xA8, 0x83, 0x58, 0x7C, 0x50, 0xCF, 0x98, 0x38, 0xA7, 0x8A, 0xC0, 0x1C, + 0x96, 0xF9 + ], + serialized.as_slice() + ); + + let (remaining, header) = parse_adv_header(serialized.as_slice()).unwrap(); + assert_eq!(AdvHeader::V0, header); + + let parsed_adv = deserialize_adv_contents::<CryptoProviderImpl>(remaining).unwrap(); + if let IntermediateAdvContents::Ciphertext(eac) = parsed_adv { + assert_eq!( + EncryptedAdvContents { + identity_type: EncryptedIdentityDataElementType::Private, + salt_padder: ldt_np_adv::salt_padder::<16, CryptoProviderImpl>(salt), + salt, + // skip adv header, de header, salt + ciphertext: &serialized.as_slice()[4..] + }, + eac + ); + + assert_eq!( + DecryptedAdvContents { + identity_type: EncryptedIdentityDataElementType::Private, + metadata_key, + salt, + data_elements: vec![PlainDataElement::TxPower(TxPowerDataElement::from( + TxPower::try_from(3).unwrap() + ))], + }, + eac.try_decrypt(&cipher).unwrap() + ) + } else { + panic!("Unexpected variant: {:?}", parsed_adv); + } +} + +#[test] +fn decrypt_and_deserialize_plaintext_adv_canned() { + let mut builder = AdvBuilder::new(PublicIdentity::default()); + + let actions = ActionBits::default(); + builder.add_data_element(ActionsDataElement::from(actions)).unwrap(); + + let serialized = builder.into_advertisement().unwrap(); + + assert_eq!( + &[ + 0x0, // adv header + 0x03, // public DE + 0x16, 0x00 // actions + ], + serialized.as_slice() + ); + + let (remaining, header) = parse_adv_header(serialized.as_slice()).unwrap(); + assert_eq!(AdvHeader::V0, header); + + let parsed_adv = deserialize_adv_contents::<CryptoProviderImpl>(remaining).unwrap(); + if let IntermediateAdvContents::Plaintext(parc) = parsed_adv { + assert_eq!( + PlaintextAdvContents { + identity_type: PlaintextIdentityMode::Public, + data_elements: vec![PlainDataElement::Actions(ActionsDataElement::from( + ActionBits::default() + ))], + }, + parc + ) + } else { + panic!("Unexpected variant: {:?}", parsed_adv); + } +} + +#[test] +fn decrypt_with_wrong_key_seed_error() { + let salt = ldt_np_adv::LegacySalt::from([0x22; 2]); + let metadata_key: [u8; NP_LEGACY_METADATA_KEY_LEN] = [0x33; NP_LEGACY_METADATA_KEY_LEN]; + let correct_key_seed = [0x11_u8; 32]; + + let (adv_content, correct_cipher) = + build_ciphertext_adv_contents(salt, &metadata_key, correct_key_seed); + let eac = parse_ciphertext_adv_contents(&correct_cipher, &adv_content.as_slice()[1..]); + + // wrong key seed doesn't work (derives wrong ldt key, wrong hmac key) + let wrong_key_seed_cipher = { + let key_seed = [0x22_u8; 32]; + + let hkdf = np_hkdf::NpKeySeedHkdf::<CryptoProviderImpl>::new(&key_seed); + let metadata_key_hmac: [u8; 32] = + hkdf.legacy_metadata_key_hmac_key().calculate_hmac(&metadata_key); + ldt_np_adv::build_np_adv_decrypter_from_key_seed(&hkdf, metadata_key_hmac) + }; + + assert_eq!( + DecryptError::DecryptOrVerifyError, + eac.try_decrypt(&wrong_key_seed_cipher,).unwrap_err() + ); +} + +#[test] +fn decrypt_with_wrong_hmac_key_error() { + let salt = ldt_np_adv::LegacySalt::from([0x22; 2]); + let metadata_key: [u8; NP_LEGACY_METADATA_KEY_LEN] = [0x33; NP_LEGACY_METADATA_KEY_LEN]; + let correct_key_seed = [0x11_u8; 32]; + + let (adv_content, correct_cipher_config) = + build_ciphertext_adv_contents(salt, &metadata_key, correct_key_seed); + let eac = parse_ciphertext_adv_contents(&correct_cipher_config, &adv_content.as_slice()[1..]); + + let wrong_hmac_key_cipher = { + let hkdf = np_hkdf::NpKeySeedHkdf::<CryptoProviderImpl>::new(&[0x10_u8; 32]); + let metadata_key_hmac: [u8; 32] = + hkdf.legacy_metadata_key_hmac_key().calculate_hmac(&metadata_key); + + ldt_np_adv::build_np_adv_decrypter_from_key_seed(&hkdf, metadata_key_hmac) + }; + + assert_eq!( + DecryptError::DecryptOrVerifyError, + eac.try_decrypt::<CryptoProviderImpl>(&wrong_hmac_key_cipher,).unwrap_err() + ); +} + +#[test] +fn decrypt_with_wrong_hmac_error() { + let salt = ldt_np_adv::LegacySalt::from([0x22; 2]); + let metadata_key: [u8; NP_LEGACY_METADATA_KEY_LEN] = [0x33; NP_LEGACY_METADATA_KEY_LEN]; + let correct_key_seed = [0x11_u8; 32]; + + let (adv_content, correct_cipher_config) = + build_ciphertext_adv_contents(salt, &metadata_key, correct_key_seed); + let eac = parse_ciphertext_adv_contents(&correct_cipher_config, &adv_content.as_slice()[1..]); + + let wrong_hmac_key_cipher = { + let hkdf = np_hkdf::NpKeySeedHkdf::<CryptoProviderImpl>::new(&correct_key_seed); + + ldt_np_adv::build_np_adv_decrypter_from_key_seed(&hkdf, [0x77; 32]) + }; + + assert_eq!( + DecryptError::DecryptOrVerifyError, + eac.try_decrypt(&wrong_hmac_key_cipher,).unwrap_err() + ); +} + +#[test] +fn decrypt_and_deserialize_ciphertext_with_public_adv_inside_error() { + let key_seed = [0x11_u8; 32]; + let salt: ldt_np_adv::LegacySalt = [0x22; 2].into(); + let metadata_key: [u8; NP_LEGACY_METADATA_KEY_LEN] = [0x33; NP_LEGACY_METADATA_KEY_LEN]; + + let hkdf = np_hkdf::NpKeySeedHkdf::<CryptoProviderImpl>::new(&key_seed); + let ldt_key = hkdf.legacy_ldt_key(); + let metadata_key_hmac: [u8; 32] = + hkdf.legacy_metadata_key_hmac_key().calculate_hmac(&metadata_key); + let cipher = ldt_np_adv::build_np_adv_decrypter_from_key_seed(&hkdf, metadata_key_hmac); + + let mut plaintext = vec![]; + plaintext.extend_from_slice(&metadata_key); + + let txpower_de = TxPowerDataElement::from(TxPower::try_from(5).unwrap()); + + plaintext.push( + encode_de_header_actual_len(DataElementType::TxPower, 1u8.try_into().unwrap()).unwrap(), + ); + + let plaintext_de_bundle: DataElementBundle<Plaintext> = txpower_de.to_de_bundle(); + plaintext.extend_from_slice(plaintext_de_bundle.contents_as_slice()); + // forge an otherwise impossible to express public identity + plaintext.push( + encode_de_header_actual_len(DataElementType::PublicIdentity, DeActualLength::ZERO).unwrap(), + ); + + assert_eq!(17, plaintext.len()); + + let ldt = LdtEncrypterXtsAes128::<CryptoProviderImpl>::new(&ldt_key); + ldt.encrypt(&mut plaintext, &ldt_np_adv::salt_padder::<16, CryptoProviderImpl>(salt)).unwrap(); + let ciphertext = plaintext; + + let mut adv = vec![]; + adv.push(0x00); // adv header + adv.push( + encode_de_header_actual_len( + DataElementType::PrivateIdentity, + (2 + ciphertext.len()).try_into().unwrap(), + ) + .unwrap(), + ); // private DE + adv.extend_from_slice(&[0x22; 2]); // salt + adv.extend_from_slice(&ciphertext); + + let parsed_adv = deserialize_adv_contents::<CryptoProviderImpl>(&adv[1..]).unwrap(); + if let IntermediateAdvContents::Ciphertext(eac) = parsed_adv { + assert_eq!( + DecryptError::DeserializeError(AdvDeserializeError::InvalidDataElementHierarchy), + eac.try_decrypt(&cipher).unwrap_err() + ) + } else { + panic!("Unexpected variant: {:?}", parsed_adv); + } +} + +fn build_ciphertext_adv_contents<C: CryptoProvider>( + salt: ldt_np_adv::LegacySalt, + metadata_key: &[u8; 14], + correct_key_seed: [u8; 32], +) -> (ArrayView<u8, { BLE_ADV_SVC_CONTENT_LEN }>, ldt_np_adv::LdtNpAdvDecrypterXtsAes128<C>) { + let hkdf = np_hkdf::NpKeySeedHkdf::<C>::new(&correct_key_seed); + let ldt_key = hkdf.legacy_ldt_key(); + + let metadata_key_hmac: [u8; 32] = + hkdf.legacy_metadata_key_hmac_key().calculate_hmac(metadata_key.as_slice()); + + let correct_cipher = ldt_np_adv::build_np_adv_decrypter_from_key_seed(&hkdf, metadata_key_hmac); + + let mut builder = AdvBuilder::new(LdtIdentity::<CryptoProviderImpl>::new( + EncryptedIdentityDataElementType::Private, + salt, + *metadata_key, + LdtEncrypterXtsAes128::<CryptoProviderImpl>::new(&ldt_key), + )); + builder.add_data_element(TxPowerDataElement::from(TxPower::try_from(3).unwrap())).unwrap(); + (builder.into_advertisement().unwrap(), correct_cipher) +} + +fn parse_ciphertext_adv_contents<'b>( + cipher: &ldt_np_adv::LdtNpAdvDecrypterXtsAes128<CryptoProviderImpl>, + adv_content: &'b [u8], +) -> EncryptedAdvContents<'b> { + let eac = match deserialize_adv_contents::<CryptoProviderImpl>(adv_content).unwrap() { + IntermediateAdvContents::Plaintext(_) => panic!(), + // quick confirmation that we did get something + IntermediateAdvContents::Ciphertext(eac) => eac, + }; + + // correct cipher works + assert!(eac.try_decrypt(cipher).is_ok()); + + eac +} + +/// Construct the serialized DE and parse it +fn parse_plain_de<F>(de_type: PlainDataElementType, contents: &[u8]) -> PlainDataElement<F> +where + F: PacketFlavor, + actions::ActionsDataElement<F>: DataElement, +{ + let mut buf = vec![]; + buf.push( + encode_de_header_actual_len( + de_type.as_generic_de_type(), + contents.len().try_into().unwrap(), + ) + .unwrap(), + ); + buf.extend_from_slice(contents); + + let raw_de = combinator::all_consuming(parse_de)(&buf).map(|(_remaining, de)| de).unwrap(); + + let plain_des = plain_data_elements(&[raw_de]).unwrap(); + assert_eq!(1, plain_des.len()); + plain_des.first().unwrap().try_deserialize().unwrap() +} + +fn plaintext_random_adv_contents_round_trip<I: Identity<Flavor = Plaintext>, F: Fn() -> I>( + mk_identity: F, + identity_type: PlaintextIdentityMode, +) { + let mut rng = rand_ext::seeded_rng(); + let de_types: Vec<PlainDataElementType> = PlainDataElementType::iter() + .filter(|t| t.supports_flavor(PacketFlavorEnum::Plaintext)) + .collect(); + + for _ in 0..10_000 { + let mut de_tuples = Vec::new(); + let mut builder = AdvBuilder::new(mk_identity()); + + loop { + let de_type = *de_types.choose(&mut rng).unwrap(); + let (de, bundle) = random_de_plaintext(de_type, &mut rng).unwrap(); + + if builder.add_data_element(bundle.clone()).ok().is_none() { + // out of room + break; + } + + de_tuples.push((de, de_type, bundle)); + } + + let serialized = builder.into_advertisement().unwrap(); + + let (_rem, header) = + combinator::all_consuming(parse_adv_header)(&serialized.as_slice()[..1]).unwrap(); + let parsed_adv = + parse_raw_adv_contents::<CryptoProviderImpl>(&serialized.as_slice()[1..]).unwrap(); + + assert_eq!(AdvHeader::V0, header); + if let RawAdvertisement::Plaintext(parc) = parsed_adv { + assert_eq!( + PlaintextAdvRawContents { + identity_type, + data_elements: de_tuples + .iter() + .map(|(_de, de_type, bundle)| RawPlainDataElement { + de_type: *de_type, + contents: bundle.contents_as_slice(), + }) + .collect() + }, + parc + ); + + assert_eq!( + PlaintextAdvContents { + identity_type, + data_elements: de_tuples + .into_iter() + .map(|(de, _de_type, _bundle)| de) + .collect(), + }, + parc.try_deserialize().unwrap() + ) + } else { + panic!("Unexpected variant: {:?}", parsed_adv); + } + } +}
diff --git a/nearby/presence/np_adv/src/legacy/mod.rs b/nearby/presence/np_adv/src/legacy/mod.rs new file mode 100644 index 0000000..0eb035d --- /dev/null +++ b/nearby/presence/np_adv/src/legacy/mod.rs
@@ -0,0 +1,66 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! V0 advertisement support. + +use core::fmt; + +pub mod actions; +pub mod data_elements; +pub mod de_type; +pub mod deserialize; +pub mod serialize; + +#[cfg(test)] +mod random_data_elements; + +/// Advertisement capacity after 5 bytes of BLE header and 2 bytes of svc UUID are reserved from a +/// 31-byte advertisement +pub const BLE_ADV_SVC_CONTENT_LEN: usize = 24; +/// Maximum possible DE content: packet size minus 2 for adv header & DE header +const NP_MAX_DE_CONTENT_LEN: usize = BLE_ADV_SVC_CONTENT_LEN - 2; + +/// Marker type to allow disambiguating between plaintext and encrypted packets at compile time. +/// +/// See also [PacketFlavorEnum] for when runtime flavor checks are more suitable. +pub trait PacketFlavor: fmt::Debug + Clone + Copy { + /// The corresponding [PacketFlavorEnum] variant. + const ENUM_VARIANT: PacketFlavorEnum; +} + +/// Marker type for plaintext packets (public identity and no identity). +#[derive(Debug, PartialEq, Eq, Clone, Copy)] +pub struct Plaintext; + +impl PacketFlavor for Plaintext { + const ENUM_VARIANT: PacketFlavorEnum = PacketFlavorEnum::Plaintext; +} + +/// Marker type for ciphertext packets (private, trusted, and provisioned identity). +#[derive(Debug, PartialEq, Eq, Clone, Copy)] +pub struct Ciphertext; + +impl PacketFlavor for Ciphertext { + const ENUM_VARIANT: PacketFlavorEnum = PacketFlavorEnum::Ciphertext; +} + +/// An enum version of the implementors of [PacketFlavor] for use cases where runtime checking is +/// a better fit than compile time checking. +#[derive(Debug, Clone, Copy, strum_macros::EnumIter, PartialEq, Eq)] +pub enum PacketFlavorEnum { + /// Corresponds to [Plaintext]. + Plaintext, + /// Corresponds to [Ciphertext]. + Ciphertext, +}
diff --git a/nearby/presence/np_adv/src/legacy/random_data_elements.rs b/nearby/presence/np_adv/src/legacy/random_data_elements.rs new file mode 100644 index 0000000..f416ffe --- /dev/null +++ b/nearby/presence/np_adv/src/legacy/random_data_elements.rs
@@ -0,0 +1,170 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +extern crate std; + +use crate::{ + legacy::{ + actions::*, + data_elements::*, + de_type::PlainDataElementType, + deserialize::PlainDataElement, + serialize::{DataElementBundle, ToDataElementBundle}, + Ciphertext, PacketFlavor, PacketFlavorEnum, Plaintext, + }, + shared_data::{ContextSyncSeqNum, TxPower}, +}; +use rand_ext::rand::{self, distributions, prelude::SliceRandom as _}; +use std::prelude::rust_2021::*; +use strum::IntoEnumIterator; + +impl distributions::Distribution<ActionsDataElement<Plaintext>> for distributions::Standard { + fn sample<R: rand::Rng + ?Sized>(&self, rng: &mut R) -> ActionsDataElement<Plaintext> { + let mut available_actions = ActionType::iter() + .filter(|at| at.supports_flavor(PacketFlavorEnum::Plaintext)) + .collect::<Vec<_>>(); + available_actions.shuffle(rng); + + // choose some of the available actions. + let selected_actions: &[ActionType] = + &available_actions[0..rng.gen_range(0..available_actions.len())]; + + let mut bits = ActionBits::default(); + + for a in selected_actions { + match a { + ActionType::ContextSyncSeqNum => { + bits.set_action(ContextSyncSeqNum::try_from(rng.gen_range(0..=15)).unwrap()) + } + // generating boolean actions with `true` since we already did our random selection + // of which actions to use above + ActionType::NearbyShare => bits.set_action(NearbyShare::from(true)), + ActionType::Finder => bits.set_action(Finder::from(true)), + ActionType::FastPairSass => bits.set_action(FastPairSass::from(true)), + ActionType::ActiveUnlock + | ActionType::PresenceManager + | ActionType::InstantTethering + | ActionType::PhoneHub => unreachable!("not plaintext actions"), + } + } + + ActionsDataElement::from(bits) + } +} +impl distributions::Distribution<ActionsDataElement<Ciphertext>> for distributions::Standard { + fn sample<R: rand::Rng + ?Sized>(&self, rng: &mut R) -> ActionsDataElement<Ciphertext> { + let mut available_actions = ActionType::iter() + .filter(|at| at.supports_flavor(PacketFlavorEnum::Ciphertext)) + .collect::<Vec<_>>(); + available_actions.shuffle(rng); + + // choose some of the available actions + let selected_actions: &[ActionType] = + &available_actions[0..rng.gen_range(0..available_actions.len())]; + + let mut bits = ActionBits::default(); + + for a in selected_actions { + match a { + ActionType::ContextSyncSeqNum => { + bits.set_action(ContextSyncSeqNum::try_from(rng.gen_range(0..=15)).unwrap()) + } + ActionType::ActiveUnlock => bits.set_action(ActiveUnlock::from(true)), + // generating boolean actions with `true` since we already did our random selection + // of which actions to use above + ActionType::NearbyShare => bits.set_action(NearbyShare::from(true)), + ActionType::PresenceManager => bits.set_action(PresenceManager::from(true)), + ActionType::InstantTethering => bits.set_action(InstantTethering::from(true)), + ActionType::PhoneHub => bits.set_action(PhoneHub::from(true)), + ActionType::Finder | ActionType::FastPairSass => { + unreachable!("not ciphertext actions") + } + } + } + + ActionsDataElement::from(bits) + } +} + +impl distributions::Distribution<TxPower> for distributions::Standard { + fn sample<R: rand::Rng + ?Sized>(&self, rng: &mut R) -> TxPower { + let tx_power: i8 = rng.gen_range(-100..=20); + TxPower::try_from(tx_power).unwrap() + } +} + +impl distributions::Distribution<TxPowerDataElement> for distributions::Standard { + fn sample<R: rand::Rng + ?Sized>(&self, rng: &mut R) -> TxPowerDataElement { + let tx_power: TxPower = self.sample(rng); + TxPowerDataElement::from(tx_power) + } +} + +/// Generate a random instance of the requested DE and return it wrapped in [PlainDataElement] along +/// with its bundle representation. +pub(crate) fn rand_de_and_bundle<F, D, E, R>( + to_enum: E, + rng: &mut R, +) -> (PlainDataElement<F>, DataElementBundle<F>) +where + F: PacketFlavor, + D: ToDataElementBundle<F>, + E: Fn(D) -> PlainDataElement<F>, + R: rand::Rng, + distributions::Standard: distributions::Distribution<D>, +{ + let de = rng.gen::<D>(); + let bundle = de.to_de_bundle(); + (to_enum(de), bundle) +} + +/// Generate a random instance of the requested de type, or `None` if that type does not support +/// plaintext. +pub(crate) fn random_de_plaintext<R>( + de_type: PlainDataElementType, + rng: &mut R, +) -> Option<(PlainDataElement<Plaintext>, DataElementBundle<Plaintext>)> +where + R: rand::Rng, +{ + let opt = match de_type { + PlainDataElementType::TxPower => Some(rand_de_and_bundle(PlainDataElement::TxPower, rng)), + PlainDataElementType::Actions => Some(rand_de_and_bundle(PlainDataElement::Actions, rng)), + }; + + // make sure flavor support is consistent + assert_eq!(opt.is_some(), de_type.supports_flavor(PacketFlavorEnum::Plaintext)); + + opt +} + +/// Generate a random instance of the requested de type, or `None` if that type does not support +/// ciphertext. +pub(crate) fn random_de_ciphertext<R>( + de_type: PlainDataElementType, + rng: &mut R, +) -> Option<(PlainDataElement<Ciphertext>, DataElementBundle<Ciphertext>)> +where + R: rand::Rng, +{ + let opt = match de_type { + PlainDataElementType::TxPower => Some(rand_de_and_bundle(PlainDataElement::TxPower, rng)), + PlainDataElementType::Actions => Some(rand_de_and_bundle(PlainDataElement::Actions, rng)), + }; + + // make sure flavor support is consistent + assert_eq!(opt.is_some(), de_type.supports_flavor(PacketFlavorEnum::Ciphertext)); + + opt +}
diff --git a/nearby/presence/np_adv/src/legacy/serialize/mod.rs b/nearby/presence/np_adv/src/legacy/serialize/mod.rs new file mode 100644 index 0000000..38e46e1 --- /dev/null +++ b/nearby/presence/np_adv/src/legacy/serialize/mod.rs
@@ -0,0 +1,402 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! Serialization for V0 advertisements. +//! +//! # Examples +//! +//! Serializing a plaintext advertisement: +//! +//! ``` +//! use np_adv::{legacy::{data_elements::*, serialize::*}, shared_data::*, PublicIdentity}; +//! use np_adv::shared_data::TxPower; +//! +//! let mut builder = AdvBuilder::new(PublicIdentity::default()); +//! builder +//! .add_data_element(TxPowerDataElement::from(TxPower::try_from(3).expect("3 is a valid TxPower value"))) +//! .unwrap(); +//! let packet = builder.into_advertisement().unwrap(); +//! assert_eq!( +//! &[ +//! 0x00, // Adv Header +//! 0x03, // Public DE header +//! 0x15, 0x03, // tx power de +//! ], +//! packet.as_slice() +//! ); +//! ``` +//! +//! Serializing an encrypted advertisement: +//! +//! ``` +//! use np_adv::{shared_data::*, de_type::*, legacy::{de_type::*, data_elements::*, serialize::*}}; +//! use crypto_provider::CryptoProvider; +//! use crypto_provider_default::CryptoProviderImpl; +//! use ldt_np_adv::{salt_padder, LegacySalt, LdtEncrypterXtsAes128}; +//! +//! // Generate these from proper CSPRNGs -- using fixed data here +//! let metadata_key = [0x33; 14]; +//! let salt = LegacySalt::from([0x01, 0x02]); +//! let key_seed = [0x44; 32]; +//! let ldt_enc = LdtEncrypterXtsAes128::<CryptoProviderImpl>::new( +//! &np_hkdf::NpKeySeedHkdf::<CryptoProviderImpl>::new(&key_seed).legacy_ldt_key() +//! ); +//! +//! let mut builder = AdvBuilder::new(LdtIdentity::<CryptoProviderImpl>::new( +//! EncryptedIdentityDataElementType::Private, +//! salt, +//! metadata_key, +//! ldt_enc, +//! )); +//! +//! builder +//! .add_data_element(TxPowerDataElement::from(TxPower::try_from(3).expect("3 is a valid TxPower value"))) +//! .unwrap(); +//! +//! let packet = builder.into_advertisement().unwrap(); +//! ``` +use crate::{ + de_type::{EncryptedIdentityDataElementType, IdentityDataElementType}, + legacy::{ + de_type::{DataElementType, DeActualLength, DeEncodedLength, PlainDataElementType}, + Ciphertext, PacketFlavor, Plaintext, BLE_ADV_SVC_CONTENT_LEN, NP_MAX_DE_CONTENT_LEN, + }, + DeLengthOutOfRange, NoIdentity, PublicIdentity, +}; +use array_view::ArrayView; +use core::{convert, fmt, marker}; +use crypto_provider::CryptoProvider; +use ldt_np_adv::NP_LEGACY_METADATA_KEY_LEN; + +#[cfg(test)] +mod tests; + +/// An identity used in serializing an advertisement. +pub trait Identity: fmt::Debug { + /// The flavor of packet this identity produces + type Flavor: PacketFlavor; + /// The error returned if postprocessing fails + type Error: fmt::Debug; + /// How much space needs to be reserved for this identity's prefix bytes + const OVERHEAD_LEN: usize; + + /// Perform identity-specific manipulation to the serialized DEs to produce the final + /// advertisement format. + /// + /// `buf` is `OVERHEAD_LEN` bytes set aside for the identity's use, followed by all of the DEs + /// added to a packet. It does not include the NP top level header. + /// + /// Returns `Ok` if postprocessing was successful and the packet is finished, or `Err` if + /// postprocessing failed and the packet should be discarded. + fn postprocess(&self, buf: &mut [u8]) -> Result<(), Self::Error>; +} + +lazy_static::lazy_static! { + // Avoid either a panic-able code path or an error case that never happens by precalculating. + static ref PUBLIC_IDENTITY_DE_HEADER: u8 = + encode_de_header_actual_len(DataElementType::PublicIdentity, DeActualLength::ZERO).unwrap(); +} + +impl Identity for PublicIdentity { + type Flavor = Plaintext; + type Error = convert::Infallible; + // 1 byte for public DE header (0 content) + const OVERHEAD_LEN: usize = 1; + + fn postprocess(&self, buf: &mut [u8]) -> Result<(), Self::Error> { + buf[0] = *PUBLIC_IDENTITY_DE_HEADER; + + Ok(()) + } +} + +impl Identity for NoIdentity { + type Flavor = Plaintext; + type Error = convert::Infallible; + // No DE header + const OVERHEAD_LEN: usize = 0; + + fn postprocess(&self, _buf: &mut [u8]) -> Result<(), Self::Error> { + Ok(()) + } +} + +/// Identity used for encrypted packets (private, trusted, provisioned) that encrypts other DEs +/// (as well as the metadata key). +pub struct LdtIdentity<C: CryptoProvider> { + de_type: EncryptedIdentityDataElementType, + salt: ldt_np_adv::LegacySalt, + metadata_key: [u8; NP_LEGACY_METADATA_KEY_LEN], + ldt_enc: ldt_np_adv::LdtEncrypterXtsAes128<C>, + // keep C parameter alive for when A disappears into it + _crypto_provider: marker::PhantomData<C>, +} + +// Exclude sensitive members +impl<C: CryptoProvider> fmt::Debug for LdtIdentity<C> { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!(f, "LdtIdentity {{ de_type: {:?}, salt: {:X?} }}", self.de_type, self.salt) + } +} + +impl<C: CryptoProvider> LdtIdentity<C> { + /// Build an `LdtIdentity` for the provided identity, salt, metadata key, and ldt. + pub fn new( + de_type: EncryptedIdentityDataElementType, + salt: ldt_np_adv::LegacySalt, + metadata_key: [u8; NP_LEGACY_METADATA_KEY_LEN], + ldt_enc: ldt_np_adv::LdtEncrypterXtsAes128<C>, + ) -> LdtIdentity<C> { + LdtIdentity { de_type, salt, metadata_key, ldt_enc, _crypto_provider: marker::PhantomData } + } +} + +impl<C: CryptoProvider> Identity for LdtIdentity<C> { + type Flavor = Ciphertext; + type Error = LdtPostprocessError; + // Identity DE header + salt + metadata key + const OVERHEAD_LEN: usize = 17; + + fn postprocess(&self, buf: &mut [u8]) -> Result<(), LdtPostprocessError> { + let de_type = self.de_type.as_identity_data_element_type(); + // there's space for the identity DE header byte, but we don't count that in the DE length + let actual_len: DeActualLength = buf + .len() + .checked_sub(1) + .ok_or(LdtPostprocessError::InvalidLength) + .and_then(|len| len.try_into().map_err(|_e| LdtPostprocessError::InvalidLength))?; + // header + buf[0] = encode_de_header_actual_len(id_de_type_as_generic_de_type(de_type), actual_len) + .map_err(|_e| LdtPostprocessError::InvalidLength)?; + buf[1..3].copy_from_slice(self.salt.bytes().as_slice()); + buf[3..17].copy_from_slice(&self.metadata_key); + + // encrypt everything after DE header and salt + self.ldt_enc.encrypt(&mut buf[3..], &ldt_np_adv::salt_padder::<16, C>(self.salt)).map_err( + |e| match e { + // too short, not enough DEs -- should be caught by length validation above, though + ldt::LdtError::InvalidLength(_) => LdtPostprocessError::InvalidLength, + }, + ) + } +} + +/// Something went wrong, or preconditions were not met, during identity postprocessing. +#[derive(Debug, PartialEq, Eq, Clone, Copy)] +pub enum LdtPostprocessError { + /// The minimum size (2 bytes) or maximum size (6 bytes) of DE payload was not met + InvalidLength, +} + +/// Accumulates DEs, then massages the serialized DEs with the configured identity to produce +/// the final advertisement. +#[derive(Debug)] +pub struct AdvBuilder<I: Identity> { + /// The first byte is for the adv header, then the next I::OVERHEAD_LEN bytes are set aside for + /// use by [Identity::postprocess]. + buffer: [u8; BLE_ADV_SVC_CONTENT_LEN], + /// How much of the buffer is consumed. + /// Always <= buffer length + len: usize, + identity: I, +} + +impl<I: Identity> AdvBuilder<I> { + /// Create an empty AdvBuilder with the provided identity. + pub fn new(identity: I) -> AdvBuilder<I> { + // adv header + identity overhead + let len = 1 + I::OVERHEAD_LEN; + // check for broken identities + assert!(len < BLE_ADV_SVC_CONTENT_LEN); + AdvBuilder { + // conveniently the first byte is already 0, which is the correct header for v0. + // 3 bit version (000 since this is version 0), 5 bit reserved (also all 0) + buffer: [0; BLE_ADV_SVC_CONTENT_LEN], + len, + identity, + } + } + + /// Add the data element to the packet buffer, if there is space. + pub fn add_data_element<B: ToDataElementBundle<I::Flavor>>( + &mut self, + data_element: B, + ) -> Result<(), AddDataElementError> { + let remaining = self.buffer.len() - self.len; + let bundle = data_element.to_de_bundle(); + // length including header byte + let de_slice = bundle.contents_as_slice(); + let de_total_len = 1 + de_slice.len(); + if remaining < de_total_len { + return Err(AddDataElementError::InsufficientAdvSpace); + } + + // header + self.buffer[self.len] = + encode_de_header(bundle.de_type.as_generic_de_type(), bundle.encoded_len); + self.len += 1; + // de contents + self.buffer[self.len..self.len + de_slice.len()].copy_from_slice(de_slice); + self.len += de_slice.len(); + Ok(()) + } + + /// Return the finished advertisement (adv header + DEs), or `None` if the adv could not be + /// built. + pub fn into_advertisement( + mut self, + ) -> Result<ArrayView<u8, BLE_ADV_SVC_CONTENT_LEN>, I::Error> { + // encrypt, if applicable + self.identity + // skip adv header for postprocessing + .postprocess(&mut self.buffer[1..self.len]) + .map(|_| ArrayView::try_from_array(self.buffer, self.len).expect("len is always valid")) + } +} + +/// Errors that can occur for [AdvBuilder.add_data_element]. +#[derive(Debug, PartialEq, Eq)] +pub enum AddDataElementError { + /// The provided DE can't fit in the remaining space + InsufficientAdvSpace, +} + +/// The serialized form of a data element. +#[derive(Clone, Debug)] +pub struct DataElementBundle<F: PacketFlavor> { + de_type: PlainDataElementType, + /// Data element payload + data: DePayload, + /// The header-encoded form of `data`'s length + encoded_len: DeEncodedLength, + /// Type marker for whether this DE can be used in encrypted or plaintext packets. + flavor: marker::PhantomData<F>, +} + +impl<F: PacketFlavor> DataElementBundle<F> { + /// Returns `Err` if the provided `data` or requested [PacketFlavor] are not valid for + /// `de_type`. + pub(crate) fn try_from( + de_type: PlainDataElementType, + data: &[u8], + ) -> Result<DataElementBundle<F>, DeBundleError> { + if !de_type.supports_flavor(F::ENUM_VARIANT) { + return Err(DeBundleError::InvalidFlavor); + } + + let mut buffer = [0; NP_MAX_DE_CONTENT_LEN]; + buffer + .get_mut(0..data.len()) + .map(|dest| dest.copy_from_slice(data)) + .ok_or(DeBundleError::InvalidLength)?; + + let payload: DePayload = ArrayView::try_from_array(buffer, data.len()) + .expect("data already copied into buffer") + .into(); + + // get the encoded length now so we know the length is valid for the DE type + let encoded_len = de_type + .as_generic_de_type() + .encoded_len_for_actual_len(payload.len()) + .map_err(|_| DeBundleError::InvalidLength)?; + + Ok(DataElementBundle { de_type, data: payload, encoded_len, flavor: marker::PhantomData }) + } + + /// The data contained in the DE, excluding the header byte + pub(crate) fn contents_as_slice(&self) -> &[u8] { + self.data.as_slice() + } +} + +/// Errors that can occur when building a [DataElementBundle] +#[derive(Debug, PartialEq, Eq)] +pub(crate) enum DeBundleError { + /// The DE type does not support the requested flavor + InvalidFlavor, + /// The data is too long to fit in a DE, or is invalid for the DE type + InvalidLength, +} + +/// Implemented by higher-level types that represent data elements. +pub trait ToDataElementBundle<F: PacketFlavor> { + /// Serialize `self` into the impl-specific byte encoding used for that DE type. + fn to_de_bundle(&self) -> DataElementBundle<F>; +} + +// for cases where it's more convenient to already have a DataElementBundle than a DE +impl<F: PacketFlavor> ToDataElementBundle<F> for DataElementBundle<F> { + fn to_de_bundle(&self) -> DataElementBundle<F> { + Self { + de_type: self.de_type, + data: self.data.clone(), + encoded_len: self.encoded_len, + flavor: marker::PhantomData, + } + } +} + +// Biggest size a DE could possibly be is the entire payload +#[derive(Clone, PartialEq, Eq, Debug)] +struct DePayload { + payload: ArrayView<u8, { NP_MAX_DE_CONTENT_LEN }>, +} + +impl DePayload { + /// The actual length of the payload + fn len(&self) -> DeActualLength { + self.payload + .len() + .try_into() + .expect("Payload is an array of the max size which always has a valid length") + } + + fn as_slice(&self) -> &[u8] { + self.payload.as_slice() + } +} + +impl From<ArrayView<u8, { NP_MAX_DE_CONTENT_LEN }>> for DePayload { + fn from(array: ArrayView<u8, { NP_MAX_DE_CONTENT_LEN }>) -> Self { + Self { payload: array } + } +} + +/// Encode a DE type and length into a DE header byte. +pub(crate) fn encode_de_header(de_type: DataElementType, header_len: DeEncodedLength) -> u8 { + // 4 high bits are length, 4 low bits are type + (header_len.as_u8() << 4) | de_type.type_code().as_u8() +} + +/// Encode a DE type and length into a DE header byte. +pub(crate) fn encode_de_header_actual_len( + de_type: DataElementType, + header_len: DeActualLength, +) -> Result<u8, DeLengthOutOfRange> { + de_type + .encoded_len_for_actual_len(header_len) + // 4 high bits are length, 4 low bits are type + .map(|len| encode_de_header(de_type, len)) +} + +pub(crate) fn id_de_type_as_generic_de_type( + id_de_type: IdentityDataElementType, +) -> DataElementType { + match id_de_type { + IdentityDataElementType::Private => DataElementType::PrivateIdentity, + IdentityDataElementType::Trusted => DataElementType::TrustedIdentity, + IdentityDataElementType::Public => DataElementType::PublicIdentity, + IdentityDataElementType::Provisioned => DataElementType::ProvisionedIdentity, + } +}
diff --git a/nearby/presence/np_adv/src/legacy/serialize/tests.rs b/nearby/presence/np_adv/src/legacy/serialize/tests.rs new file mode 100644 index 0000000..192b8f4 --- /dev/null +++ b/nearby/presence/np_adv/src/legacy/serialize/tests.rs
@@ -0,0 +1,169 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +extern crate std; + +use crate::legacy::actions::FastPairSass; +use crate::legacy::actions::NearbyShare; +use crate::{ + de_type::EncryptedIdentityDataElementType, + legacy::{actions::*, data_elements::*, serialize::*}, + shared_data::TxPower, +}; +use crypto_provider_default::CryptoProviderImpl; +use ldt_np_adv::{salt_padder, LdtEncrypterXtsAes128, LegacySalt}; +use std::vec; + +#[test] +fn public_identity_packet_serialization() { + let mut builder = AdvBuilder::new(PublicIdentity::default()); + + let tx_power = TxPower::try_from(3).unwrap(); + let mut action = ActionBits::default(); + action.set_action(NearbyShare::from(true)); + builder.add_data_element(TxPowerDataElement::from(tx_power)).unwrap(); + builder.add_data_element(ActionsDataElement::from(action)).unwrap(); + + let packet = builder.into_advertisement().unwrap(); + assert_eq!( + &[ + 0x00, // Adv Header + 0x03, // Public DE header + 0x15, 0x03, // Tx Power DE with value 3 + 0x26, 0x00, 0x40, // Actions DE w/ bit 9 + ], + packet.as_slice() + ); +} + +#[test] +fn no_identity_packet_serialization() { + let mut builder = AdvBuilder::new(NoIdentity::default()); + + let tx_power = TxPower::try_from(3).unwrap(); + let mut action = ActionBits::default(); + action.set_action(NearbyShare::from(true)); + builder.add_data_element(TxPowerDataElement::from(tx_power)).unwrap(); + builder.add_data_element(ActionsDataElement::from(action)).unwrap(); + + let packet = builder.into_advertisement().unwrap(); + assert_eq!( + &[ + 0x00, // Adv Header + 0x15, 0x03, // Tx Power DE with value 3 + 0x26, 0x00, 0x40, // Actions DE w/ bit 9 + ], + packet.as_slice() + ); +} + +#[test] +fn packet_limits_capacity() { + let mut builder = AdvBuilder::new(PublicIdentity::default()); + // 2 + 1 left out of 24 payload bytes + builder.len = 21; + let mut bits = ActionBits::default(); + bits.set_action(NearbyShare::from(true)); + bits.set_action(FastPairSass::from(true)); + + assert_eq!(Ok(()), builder.add_data_element(ActionsDataElement::from(bits))); + + // too small for 2+ 1 DE + builder.len = 22; + assert_eq!( + Err(AddDataElementError::InsufficientAdvSpace), + builder.add_data_element(ActionsDataElement::from(bits)) + ); +} + +#[test] +fn ldt_packet_serialization() { + // don't care about the HMAC since we're not decrypting + let hkdf = np_hkdf::NpKeySeedHkdf::<CryptoProviderImpl>::new(&[0; 32]); + let ldt = LdtEncrypterXtsAes128::<CryptoProviderImpl>::new(&hkdf.legacy_ldt_key()); + let metadata_key = [0x33; 14]; + let salt = LegacySalt::from([0x01, 0x02]); + + let mut ciphertext = vec![]; + ciphertext.extend_from_slice(&metadata_key); + // tx power & action DEs + ciphertext.extend_from_slice(&[0x15, 0x03, 0x26, 0x00, 0x10]); + ldt.encrypt(&mut ciphertext, &salt_padder::<16, CryptoProviderImpl>(salt)).unwrap(); + + let mut builder = AdvBuilder::new(LdtIdentity::<CryptoProviderImpl>::new( + EncryptedIdentityDataElementType::Private, + salt, + metadata_key, + ldt, + )); + + let tx_power = TxPower::try_from(3).unwrap(); + let mut action = ActionBits::default(); + action.set_action(PhoneHub::from(true)); + builder.add_data_element(TxPowerDataElement::from(tx_power)).unwrap(); + builder.add_data_element(ActionsDataElement::from(action)).unwrap(); + + let packet = builder.into_advertisement().unwrap(); + // header + let mut expected = vec![0x00]; + // private header with five bytes after it + expected.push(0x51); + expected.extend_from_slice(salt.bytes()); + expected.extend_from_slice(&ciphertext); + assert_eq!(&expected, packet.as_slice()); +} + +#[test] +fn ldt_packet_cant_encrypt_without_des() { + let metadata_key = [0x33; 14]; + let salt = LegacySalt::from([0x01, 0x02]); + + let builder = AdvBuilder::new(LdtIdentity::<CryptoProviderImpl>::new( + EncryptedIdentityDataElementType::Private, + salt, + metadata_key, + LdtEncrypterXtsAes128::<CryptoProviderImpl>::new( + &np_hkdf::NpKeySeedHkdf::<CryptoProviderImpl>::new(&[0xFE; 32]).legacy_ldt_key(), + ), + )); + + // not enough ciphertext + assert_eq!(Err(LdtPostprocessError::InvalidLength), builder.into_advertisement()); +} + +#[test] +fn nearby_share_action() { + let mut builder = AdvBuilder::new(PublicIdentity::default()); + + let mut action = ActionBits::default(); + action.set_action(NearbyShare::from(true)); + + let actions_de = ActionsDataElement::from(action); + builder.add_data_element(actions_de).unwrap(); + + let tx_power_de = TxPowerDataElement::from(TxPower::try_from(-100).unwrap()); + builder.add_data_element(tx_power_de).unwrap(); + + assert_eq!( + &[ + 0x00, // version 0 + 0x03, // public identity + 0x26, // length 2, DE type 6 for actions + 0x00, 0x40, // bit 9 is active + 0x15, // length 1, DE type 5 for tx power + 0x9C, // tx power of -100 + ], + builder.into_advertisement().unwrap().as_slice() + ); +}
diff --git a/nearby/presence/np_adv/src/lib.rs b/nearby/presence/np_adv/src/lib.rs new file mode 100644 index 0000000..a6a155e --- /dev/null +++ b/nearby/presence/np_adv/src/lib.rs
@@ -0,0 +1,534 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +//! Serialization and deserialization for v0 (legacy) and v1 (extended) Nearby Presence +//! advertisements. +//! +//! See `tests/examples_v0.rs` and `tests/examples_v1.rs` for some tests that show common +//! deserialization scenarios. + +#![no_std] +#![forbid(unsafe_code)] +#![deny(missing_docs)] + +extern crate alloc; +extern crate core; +use crate::{ + credential::{ + source::{BothCredentialSource, CredentialSource}, + v0::V0CryptoMaterial, + MatchedCredFromCred, MatchedCredential, V0Credential, V1Credential, + }, + extended::deserialize::{ + parse_sections, CiphertextSection, DataElements, DecryptedSection, IntermediateSection, + PlaintextSection, Section, SectionDeserializeError, + }, + legacy::deserialize::{ + DecryptError, DecryptedAdvContents, IntermediateAdvContents, PlaintextAdvContents, + }, +}; +use alloc::vec::Vec; +#[cfg(feature = "devtools")] +use array_view::ArrayView; +use core::{fmt::Debug, marker}; +use crypto_provider::CryptoProvider; +#[cfg(feature = "devtools")] +use extended::NP_ADV_MAX_SECTION_LEN; +use legacy::{data_elements::DataElementDeserializeError, deserialize::AdvDeserializeError}; +use nom::{combinator, number}; +pub mod credential; +pub mod de_type; +#[cfg(test)] +mod deser_v0_tests; +#[cfg(test)] +mod deser_v1_tests; +pub mod extended; +#[cfg(test)] +mod header_parse_tests; +pub mod legacy; +pub mod shared_data; +/// Canonical form of NP's service UUID. +/// +/// Note that UUIDs are encoded in BT frames in little-endian order, so these bytes may need to be +/// reversed depending on the host BT API. +pub const NP_SVC_UUID: [u8; 2] = [0xFC, 0xF1]; + +/// Parse, deserialize, decrypt, and validate a complete NP advertisement (the entire contents of +/// the service data for the NP UUID). +pub fn deserialize_advertisement<'s, C0, C1, M, S, P>( + adv: &[u8], + cred_source: &'s S, +) -> Result<DeserializedAdvertisement<'s, M>, AdvDeserializationError> +where + C0: V0Credential<Matched<'s> = M> + 's, + C1: V1Credential<Matched<'s> = M> + 's, + M: MatchedCredential<'s>, + S: BothCredentialSource<C0, C1>, + P: CryptoProvider, +{ + let (remaining, header) = + parse_adv_header(adv).map_err(|_e| AdvDeserializationError::HeaderParseError)?; + match header { + AdvHeader::V1(header) => { + deser_decrypt_v1::<C1, S::V1Source, P>(cred_source.v1(), remaining, header) + .map(DeserializedAdvertisement::V1) + } + AdvHeader::V0 => deser_decrypt_v0::<C0, S::V0Source, P>(cred_source.v0(), remaining) + .map(DeserializedAdvertisement::V0), + } +} + +/// Parse, deserialize, decrypt, and validate a complete V0 NP advertisement (the entire contents +/// of the service data for the NP UUID). If the advertisement version header does not match V0, +/// this method will return an [`AdvDeserializationError::HeaderParseError`] +pub fn deserialize_v0_advertisement<'s, C, S, P>( + adv: &[u8], + cred_source: &'s S, +) -> Result<V0AdvertisementContents<'s, C>, AdvDeserializationError> +where + C: V0Credential, + S: CredentialSource<C>, + P: CryptoProvider, +{ + let (remaining, header) = + parse_adv_header(adv).map_err(|_e| AdvDeserializationError::HeaderParseError)?; + + match header { + AdvHeader::V0 => deser_decrypt_v0::<C, S, P>(cred_source, remaining), + AdvHeader::V1(_) => Err(AdvDeserializationError::HeaderParseError), + } +} + +/// Parse, deserialize, decrypt, and validate a complete V1 NP advertisement (the entire contents +/// of the service data for the NP UUID). If the advertisement version header does not match V1, +/// this method will return an [`AdvDeserializationError::HeaderParseError`] +pub fn deserialize_v1_advertisement<'s, C, S, P>( + adv: &[u8], + cred_source: &'s S, +) -> Result<V1AdvertisementContents<'s, C>, AdvDeserializationError> +where + C: V1Credential, + S: CredentialSource<C>, + P: CryptoProvider, +{ + let (remaining, header) = + parse_adv_header(adv).map_err(|_e| AdvDeserializationError::HeaderParseError)?; + + match header { + AdvHeader::V0 => Err(AdvDeserializationError::HeaderParseError), + AdvHeader::V1(header) => deser_decrypt_v1::<C, S, P>(cred_source, remaining, header), + } +} + +type V1AdvertisementContents<'s, C> = V1AdvContents<'s, MatchedCredFromCred<'s, C>>; + +/// The encryption scheme used for a V1 advertisement. +#[derive(Debug, Clone, PartialEq, Eq)] +pub enum V1EncryptionScheme { + /// Indicates MIC-based encryption and verification. + Mic, + /// Indicates signature-based encryption and verification. + Signature, +} + +/// Error in decryption operations for `deser_decrypt_v1_section_bytes_for_dev_tools`. +#[cfg(feature = "devtools")] +#[derive(Debug, Clone)] +pub enum AdvDecryptionError { + /// Cannot decrypt because the input section is not encrypted. + InputNotEncrypted, + /// Error parsing the given section. + ParseError, + /// No suitable credential found to decrypt the given section. + NoMatchingCredentials, +} + +/// Decrypt, but do not further deserialize the v1 bytes, intended for developer tooling uses only. +/// Production uses should use [deserialize_v1_advertisement] instead, which deserializes to a +/// structured format and provides extra type safety. +#[cfg(feature = "devtools")] +pub fn deser_decrypt_v1_section_bytes_for_dev_tools<S, V1, P>( + cred_source: &S, + header_byte: u8, + section_bytes: &[u8], +) -> Result<(ArrayView<u8, NP_ADV_MAX_SECTION_LEN>, V1EncryptionScheme), AdvDecryptionError> +where + S: CredentialSource<V1>, + V1: V1Credential, + P: CryptoProvider, +{ + let header = V1Header { header_byte }; + let int_sections = + parse_sections(&header, section_bytes).map_err(|_| AdvDecryptionError::ParseError)?; + let cipher_section = match &int_sections[0] { + IntermediateSection::Plaintext(_) => Err(AdvDecryptionError::InputNotEncrypted)?, + IntermediateSection::Ciphertext(section) => section, + }; + + use crate::credential::v1::V1CryptoMaterial; + use core::borrow::Borrow; + + for cred in cred_source.iter() { + let crypto_material = cred.crypto_material(); + + match cipher_section { + CiphertextSection::SignatureEncryptedIdentity(encrypted_section) => { + let identity_resolution_material = + crypto_material.signed_identity_resolution_material::<P>(); + match encrypted_section.try_decrypt::<P>(identity_resolution_material.borrow()) { + Ok(plaintext) => return Ok((plaintext, V1EncryptionScheme::Signature)), + Err(_) => continue, + } + } + CiphertextSection::MicEncryptedIdentity(encrypted_section) => { + let identity_resolution_material = + crypto_material.unsigned_identity_resolution_material::<P>(); + let verification_material = crypto_material.unsigned_verification_material::<P>(); + match encrypted_section + .try_decrypt::<P>(identity_resolution_material.borrow(), &verification_material) + { + Ok(plaintext) => return Ok((plaintext, V1EncryptionScheme::Mic)), + Err(_) => continue, + } + } + } + } + Err(AdvDecryptionError::NoMatchingCredentials) +} + +/// Deserialize and decrypt the contents of a v1 adv after the version header +fn deser_decrypt_v1<'s, C, S, P>( + cred_source: &'s S, + remaining: &[u8], + header: V1Header, +) -> Result<V1AdvertisementContents<'s, C>, AdvDeserializationError> +where + C: V1Credential, + S: CredentialSource<C>, + P: CryptoProvider, +{ + let int_sections = + parse_sections(&header, remaining).map_err(|_| AdvDeserializationError::ParseError { + details_hazmat: AdvDeserializationErrorDetailsHazmat::AdvertisementDeserializeError, + })?; + let mut sections = Vec::new(); + let mut to_decrypt = Vec::new(); + // keep track of ordering for later sorting + for (idx, s) in int_sections.into_iter().enumerate() { + match s { + IntermediateSection::Plaintext(p) => { + sections.push((idx, V1DeserializedSection::Plaintext(p))) + } + IntermediateSection::Ciphertext(c) => to_decrypt.push((idx, c)), + } + } + let mut invalid_sections = 0; + // Hot loop + // We assume that iterating credentials is more expensive than iterating sections + for cred in cred_source.iter() { + let mut i = 0; + while i < to_decrypt.len() { + let (section_idx, c): &(usize, CiphertextSection) = &to_decrypt[i]; + match c.try_deserialize::<C, P>(cred) { + Ok(s) => { + sections.push(( + *section_idx, + V1DeserializedSection::Decrypted(WithMatchedCredential::new( + cred.matched(), + s, + )), + )); + // we don't care about maintaining order, so use O(1) remove + to_decrypt.swap_remove(i); + // don't advance i -- it now points to a new element + } + Err(e) => match e { + SectionDeserializeError::IncorrectCredential => { + // keep it around to try with another credential + i += 1; + } + SectionDeserializeError::ParseError => { + // the credential worked, but the section itself was bogus, so drop + // it + invalid_sections += 1; + to_decrypt.swap_remove(i); + } + }, + } + } + if to_decrypt.is_empty() { + // no need to consider the remaining credentials + break; + } + } + invalid_sections += to_decrypt.len(); + // decryption may produce sections out of order + sections.sort_by_key(|(idx, _section)| *idx); + Ok(V1AdvContents::new(sections.into_iter().map(|(_idx, s)| s).collect(), invalid_sections)) +} + +type V0AdvertisementContents<'s, C> = V0AdvContents<'s, MatchedCredFromCred<'s, C>>; + +/// Deserialize and decrypt the contents of a v0 adv after the version header +fn deser_decrypt_v0<'s, C, S, P>( + cred_source: &'s S, + remaining: &[u8], +) -> Result<V0AdvertisementContents<'s, C>, AdvDeserializationError> +where + C: V0Credential, + S: CredentialSource<C>, + P: CryptoProvider, +{ + let contents = legacy::deserialize::deserialize_adv_contents::<P>(remaining)?; + return match contents { + IntermediateAdvContents::Plaintext(p) => Ok(V0AdvContents::Plaintext(p)), + IntermediateAdvContents::Ciphertext(c) => { + for cred in cred_source.iter() { + let cm = cred.crypto_material(); + let ldt = cm.ldt_adv_cipher::<P>(); + match c.try_decrypt(&ldt) { + Ok(c) => { + return Ok(V0AdvContents::Decrypted(WithMatchedCredential::new( + cred.matched(), + c, + ))) + } + Err(e) => match e { + DecryptError::DecryptOrVerifyError => continue, + DecryptError::DeserializeError(e) => { + return Err(e.into()); + } + }, + } + } + Ok(V0AdvContents::NoMatchingCredentials) + } + }; +} +/// Parse a NP advertisement header. +/// +/// This can be used on all versions of advertisements since it's the header that determines the +/// version. +/// +/// Returns a `nom::IResult` with the parsed header and the remaining bytes of the advertisement. +fn parse_adv_header(adv: &[u8]) -> nom::IResult<&[u8], AdvHeader> { + // header bits: VVVxxxxx + let (remaining, (header_byte, version, _low_bits)) = combinator::verify( + // splitting a byte at a bit boundary to take lower 5 bits + combinator::map(number::complete::u8, |byte| (byte, byte >> 5, byte & 0x1F)), + |&(_header_byte, version, low_bits)| match version { + // reserved bits, for any version, must be zero + PROTOCOL_VERSION_LEGACY | PROTOCOL_VERSION_EXTENDED => low_bits == 0, + _ => false, + }, + )(adv)?; + match version { + PROTOCOL_VERSION_LEGACY => Ok((remaining, AdvHeader::V0)), + PROTOCOL_VERSION_EXTENDED => Ok((remaining, AdvHeader::V1(V1Header { header_byte }))), + _ => unreachable!(), + } +} +#[derive(Debug, PartialEq, Eq, Clone)] +pub(crate) enum AdvHeader { + V0, + V1(V1Header), +} +/// An NP advertisement with its header parsed. +#[derive(Debug, PartialEq, Eq)] +pub enum DeserializedAdvertisement<'m, M: MatchedCredential<'m>> { + /// V0 header has all reserved bits, so there is no data to represent other than the version + /// itself. + V0(V0AdvContents<'m, M>), + /// V1 advertisement + V1(V1AdvContents<'m, M>), +} +/// The contents of a deserialized and decrypted V1 advertisement. +#[derive(Debug, PartialEq, Eq)] +pub struct V1AdvContents<'m, M: MatchedCredential<'m>> { + sections: Vec<V1DeserializedSection<'m, M>>, + invalid_sections: usize, +} +impl<'m, M: MatchedCredential<'m>> V1AdvContents<'m, M> { + fn new(sections: Vec<V1DeserializedSection<'m, M>>, invalid_sections: usize) -> Self { + Self { sections, invalid_sections } + } + /// Destructures this V1 advertisement into just the sections + /// which could be successfully deserialized and decrypted + pub fn into_valid_sections(self) -> Vec<V1DeserializedSection<'m, M>> { + self.sections + } + /// The sections that could be successfully deserialized and decrypted + pub fn sections(&self) -> impl Iterator<Item = &V1DeserializedSection<M>> { + self.sections.iter() + } + /// The number of sections that could not be parsed or decrypted. + pub fn invalid_sections_count(&self) -> usize { + self.invalid_sections + } +} +/// Advertisement content that was either already plaintext or has been decrypted. +#[derive(Debug, PartialEq, Eq)] +pub enum V0AdvContents<'m, M: MatchedCredential<'m>> { + /// Contents of an originally plaintext advertisement + Plaintext(PlaintextAdvContents), + /// Contents that was ciphertext in the original advertisement, and has been decrypted + /// with the credential in the [MatchedCredential] + Decrypted(WithMatchedCredential<'m, M, DecryptedAdvContents>), + /// The advertisement was encrypted, but no credentials matched + NoMatchingCredentials, +} +/// Advertisement content that was either already plaintext or has been decrypted. +#[derive(Debug, PartialEq, Eq)] +pub enum V1DeserializedSection<'m, M: MatchedCredential<'m>> { + /// Section that was plaintext in the original advertisement + Plaintext(PlaintextSection), + /// Section that was ciphertext in the original advertisement, and has been decrypted + /// with the credential in the [MatchedCredential] + Decrypted(WithMatchedCredential<'m, M, DecryptedSection>), +} +impl<'m, M> Section for V1DeserializedSection<'m, M> +where + M: MatchedCredential<'m>, +{ + type Iterator<'d> = DataElements<'d> where Self: 'd; + fn data_elements(&'_ self) -> Self::Iterator<'_> { + match self { + V1DeserializedSection::Plaintext(p) => p.data_elements(), + V1DeserializedSection::Decrypted(d) => d.contents.data_elements(), + } + } +} +/// Decrypted advertisement content with the [MatchedCredential] from the credential that decrypted +/// it. +#[derive(Debug, PartialEq, Eq)] +pub struct WithMatchedCredential<'m, M: MatchedCredential<'m>, T> { + matched: M, + contents: T, + // the compiler sees 'm as unused + marker: marker::PhantomData<&'m ()>, +} +impl<'m, M: MatchedCredential<'m>, T> WithMatchedCredential<'m, M, T> { + fn new(matched: M, contents: T) -> Self { + Self { matched, contents, marker: marker::PhantomData } + } + /// Credential data for the credential that decrypted the content. + pub fn matched_credential(&self) -> &M { + &self.matched + } + /// The decrypted advertisement content. + pub fn contents(&self) -> &T { + &self.contents + } +} +/// Data in a V1 advertisement header. +#[derive(Debug, PartialEq, Eq, Clone)] +pub(crate) struct V1Header { + header_byte: u8, +} +const PROTOCOL_VERSION_LEGACY: u8 = 0; +const PROTOCOL_VERSION_EXTENDED: u8 = 1; + +/// Errors that can occur during advertisement deserialization. +#[derive(PartialEq)] +pub enum AdvDeserializationError { + /// The advertisement header could not be parsed + HeaderParseError, + /// The advertisement content could not be parsed + ParseError { + /// Potentially hazardous details about deserialization errors. Read the documentation for + /// [AdvDeserializationErrorDetailsHazmat] before using this field. + details_hazmat: AdvDeserializationErrorDetailsHazmat, + }, +} + +impl Debug for AdvDeserializationError { + fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { + match self { + AdvDeserializationError::HeaderParseError => write!(f, "HeaderParseError"), + AdvDeserializationError::ParseError { .. } => write!(f, "ParseError"), + } + } +} + +/// Potentially hazardous details about deserialization errors. These error information can +/// potentially expose side-channel information about the plaintext of the advertisements and/or +/// the keys used to decrypt them. For any place that you avoid exposing the keys directly +/// (e.g. across FFIs, print to log, etc), avoid exposing these error details as well. +#[derive(PartialEq)] +pub enum AdvDeserializationErrorDetailsHazmat { + /// Parsing the overall advertisement or DE structure failed + AdvertisementDeserializeError, + /// Deserializing an individual DE from its DE contents failed + V0DataElementDeserializeError(DataElementDeserializeError), + /// Must not have any other top level data elements if there is an encrypted identity DE + TooManyTopLevelDataElements, + /// Must not have an identity DE inside an identity DE + InvalidDataElementHierarchy, +} + +impl From<AdvDeserializeError> for AdvDeserializationError { + fn from(err: AdvDeserializeError) -> Self { + match err { + AdvDeserializeError::AdvertisementDeserializeError => { + AdvDeserializationError::ParseError { + details_hazmat: + AdvDeserializationErrorDetailsHazmat::AdvertisementDeserializeError, + } + } + AdvDeserializeError::DataElementDeserializeError(e) => { + AdvDeserializationError::ParseError { + details_hazmat: + AdvDeserializationErrorDetailsHazmat::V0DataElementDeserializeError(e), + } + } + AdvDeserializeError::TooManyTopLevelDataElements => { + AdvDeserializationError::ParseError { + details_hazmat: + AdvDeserializationErrorDetailsHazmat::TooManyTopLevelDataElements, + } + } + AdvDeserializeError::InvalidDataElementHierarchy => { + AdvDeserializationError::ParseError { + details_hazmat: + AdvDeserializationErrorDetailsHazmat::InvalidDataElementHierarchy, + } + } + } + } +} + +/// DE length is out of range (e.g. > 4 bits for encoded V0, > max DE size for actual V0, >127 for +/// V1) or invalid for the relevant DE type. +#[derive(Debug, PartialEq, Eq)] +pub struct DeLengthOutOfRange; + +/// The identity mode for a deserialized plaintext section or advertisement. +#[derive(PartialEq, Eq, Debug, Clone, Copy)] +pub enum PlaintextIdentityMode { + /// No identity DE was present in the section + None, + /// A "Public Identity" DE was present in the section + Public, +} + +/// A "public identity" -- a nonspecific "empty identity". +/// +/// Used when serializing V0 advertisements or V1 sections. +#[derive(Default, Debug)] +pub struct PublicIdentity {} + +/// The lack of any identity information whatsoever, which is distinct from [PublicIdentity]. +/// +/// Used when serializing V0 advertisements or V1 sections. +#[derive(Default, Debug)] +pub struct NoIdentity {}
diff --git a/nearby/presence/np_adv/src/shared_data.rs b/nearby/presence/np_adv/src/shared_data.rs new file mode 100644 index 0000000..b511ed2 --- /dev/null +++ b/nearby/presence/np_adv/src/shared_data.rs
@@ -0,0 +1,77 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! Data types shared between V0 and V1 advertisements + +/// Power in dBm, calibrated as per +/// [Eddystone](https://github.com/google/eddystone/tree/master/eddystone-uid#tx-power) +#[derive(Debug, PartialEq, Eq, Clone)] +pub struct TxPower { + /// Power in `[-100, 20]` + power: i8, +} + +impl TxPower { + /// Power in `[-100, 20]` + pub fn as_i8(&self) -> i8 { + self.power + } +} + +impl TryFrom<i8> for TxPower { + type Error = TxPowerOutOfRange; + + fn try_from(value: i8) -> Result<Self, Self::Error> { + if !(-100..=20).contains(&value) { + Err(TxPowerOutOfRange) + } else { + Ok(TxPower { power: value }) + } + } +} + +/// Tx power was out of the valid range `[-100, 20]`. +#[derive(Debug)] +pub struct TxPowerOutOfRange; + +/// MDP's context sync number, used to inform other devices that they have stale context. +#[derive(Debug, PartialEq, Eq, Clone, Copy)] +pub struct ContextSyncSeqNum { + /// 4-bit sequence + num: u8, +} + +impl ContextSyncSeqNum { + /// Returns the context seq num as a u8 + pub fn as_u8(&self) -> u8 { + self.num + } +} + +impl TryFrom<u8> for ContextSyncSeqNum { + type Error = ContextSyncSeqNumOutOfRange; + + fn try_from(value: u8) -> Result<Self, Self::Error> { + // must only have low nibble + if value > 0x0F { + Err(ContextSyncSeqNumOutOfRange) + } else { + Ok(ContextSyncSeqNum { num: value }) + } + } +} + +/// Seq num must be in `[0-15]`. +#[derive(Debug)] +pub struct ContextSyncSeqNumOutOfRange;
diff --git a/nearby/presence/np_adv/test.json b/nearby/presence/np_adv/test.json new file mode 100644 index 0000000..953eebf --- /dev/null +++ b/nearby/presence/np_adv/test.json
@@ -0,0 +1,24122 @@ +[ + { + "adv_header_byte": "30", + "adv_salt": "8CDE04CBC59C9134F37B1FFBCF5C1136", + "aes_key": "0C04AAE1338E928EA903CAF2FD806749", + "data_elements": [ + { + "contents": "3DF2D0883246D50B5C981ADB", + "de_type": 163 + }, + { + "contents": "5628511D93E01312D69F5484", + "de_type": 317 + }, + { + "contents": "C255FFF1D4F8501E3467B084BDD124DF26", + "de_type": 721 + } + ], + "encoded_section": "69901356E7F8215A0B45D559EFD0EE88A6398B911000C807A0FFE7C79ABD61B1862AFBD097AF9001D042A9F585F02B4DE34C7412A717A08034ECDC1862BB599B6CD7CD3F95D191135555C01A0D1A71EBF2593213E9439552D625736E024EADFA950BA7B78D6AD844AD0A", + "identity_type": "private", + "iv": "2170459EF8C3E6DB3BFB808B62A5D03E", + "key_seed": "43A340DE5AFC350888FB696FC77D8CB0467668F18E7EDCB8CC3AC2F59F075ACB", + "metadata_key": "593580A4B65DEF1E6B117C8055CB6257", + "section_mic_hmac_key": "CDB8526FA8BEC42B51495EEA23F347B2F8E07A757DF63FE9C5C9100E8EB39435", + "section_salt": "C807A0FFE7C79ABD61B1862AFBD097AF" + }, + { + "adv_header_byte": "30", + "adv_salt": "8630E9D33F2AB78558BB4AF5C09F4C9E", + "aes_key": "E9FE3EF4069698F338256E23AAC08029", + "data_elements": [ + { + "contents": "C70548D64F0D131D8551D3C2B3", + "de_type": 448 + }, + { + "contents": "E4EAA94038A8B4A0D46C83695DABC05262C7DA5ED2395B673527C5C337", + "de_type": 859 + } + ], + "encoded_section": "6790134C7B6E97BE50C21ADAEE4D5EC611313B911000A6C0ECE0A9D25663F329C6C218D07CB59004603C46143E88C0F872F341BE2C06FB4DF9ECF1A970CAFBCD5315C9D8389770E627D3C913690256AA8BD753910DBB4FEA57E8AC5125E5B906CA0E0DF17081F34D", + "identity_type": "provisioned", + "iv": "39201C314CBC2D3F88EE094E627E7ADC", + "key_seed": "83FEF3C4A9E58DAA566F19AECC7C9CEE6EA4BA37F360EE8A40A26FBB99938F4B", + "metadata_key": "90A529D185FE0105D76179ED5AC841C8", + "section_mic_hmac_key": "8466111DFC334299442A84F91E3F6616C1023F2A29C72670C483F2445C18B75A", + "section_salt": "A6C0ECE0A9D25663F329C6C218D07CB5" + }, + { + "adv_header_byte": "30", + "adv_salt": "6FB3720F743A68E6474B1459990DFAC6", + "aes_key": "A2E0437B429330BF82B8BA3B2B762770", + "data_elements": [ + { + "contents": "13851601256B24E7", + "de_type": 404 + }, + { + "contents": "82FAAF4977AE0B80EAAC", + "de_type": 81 + }, + { + "contents": "C9B19F78DDF6FD66AA623267E9656C2E1EEB9F0F8253B1041626", + "de_type": 152 + }, + { + "contents": "EFD96E20D81B0ACD", + "de_type": 474 + }, + { + "contents": "2120F35E2B9EB9D5027BDC", + "de_type": 264 + } + ], + "encoded_section": "8490137D769DEFAA2E8B1BCD01332139B1F4F99110008F7DCA2DC4146183C14177A6F847468B90043E07B7A107CC2C88A183F2D8D5A6C4A6119DFCB0603F251F3994F0468C56F2014A98BEF0881B342F28E7E83B89EBB28E2E54D88B0AAFEB4FDE73F8C8D918E818ED997A0CFB3ED6344189D0A06F4FDD3F780FC6E87421578FF68B06E6E0", + "identity_type": "provisioned", + "iv": "52A7C3FC58494668CB193C7C583AB583", + "key_seed": "D0B97B7B4CB8CF85A9E707ADD592E017BD7B3964F59801EA9A08DEB3E8A3EA47", + "metadata_key": "6AF91918569B21EC14C90B099284EEED", + "section_mic_hmac_key": "EA04A0F8FF46882A8B759E7E9D53CAAF2D847C393B5A47F6AA4284DA1BF8CF11", + "section_salt": "8F7DCA2DC4146183C14177A6F847468B" + }, + { + "adv_header_byte": "30", + "adv_salt": "6F144BE070388B857B001873992CA0EF", + "aes_key": "0165985CBCA678350F250112E1354FCE", + "data_elements": [ + { + "contents": "B6D2CE67C704514BB9F370812B470A56BA4BDD", + "de_type": 164 + }, + { + "contents": "49DCA454994B399B9914768E457F", + "de_type": 701 + }, + { + "contents": "FBD41AC2FCBB9B47F6B04863B8139AE83A9AF049A137F2A766", + "de_type": 466 + }, + { + "contents": "73A400CB6E36EB45BD1AE7", + "de_type": 172 + }, + { + "contents": "1113B990D3D4B31D4CEEFB849F8CAFD01A82968A61", + "de_type": 725 + } + ], + "encoded_section": "A09013988012579D82091B81D39640A1F4B47891100077789262A428CFE712797C28D85A644A90021BBE826D956C08B86149427A8EFA6D801523C348FA78AF09433AF1A947269D58CDCA26055838209A01615CB0FFD9C55234D2EF9805FCB1FF8ED66137B2DE6A8C34F57F6FAC98645D1C482E851C77BFB1ACBB5A22E2CA297BAD14CAD0C08E4C8424C7A6E683C7EE8392A091DD9217DD6E5396D3644F01EF3CAE", + "identity_type": "trusted", + "iv": "7BAE887BD9B8BE99864343D585848A63", + "key_seed": "70CC58965C36307BE580E2793ACDC8D792FCFE8B17392B4F0B7A6ABC31D3CF02", + "metadata_key": "E503087FCE974FEDCC3290C2ABC2AF15", + "section_mic_hmac_key": "173560AC7513A51677C06801D39CE68B2E32F6BA7C02364800EF73AE27916ACC", + "section_salt": "77789262A428CFE712797C28D85A644A" + }, + { + "adv_header_byte": "30", + "adv_salt": "BD864BCB86CC4FAFA1DF15D05C693F70", + "aes_key": "B7A853164A7D88165F7044725DE648FC", + "data_elements": [ + { + "contents": "B6A9A4926FEDFDE5D8D870BA06144690", + "de_type": 175 + }, + { + "contents": "B8C403AC879A7EBB6D69458D", + "de_type": 720 + } + ], + "encoded_section": "5990139BE32BB50428F39C6510AB0BCAE0A4519110002542EBE3983FF77643536AF98A47BDFE9001D2EFF80C4D9A6391063A16F2E989F5C02424E527596A15A5E2424EEA7317214FEEC57E1C28E1F47C8BE40C43839BD6CC2EE1", + "identity_type": "private", + "iv": "F1411FAE6BBB7AF0F798EF7898C1A026", + "key_seed": "15C3A38E12E82DE3D05867A72C09259B2F163E0F7E2B900013FD9589E4FCB08B", + "metadata_key": "BEF599A91BB40E6A3A12D69AA8AA40D5", + "section_mic_hmac_key": "B268F77855AAFA3A0AEC62CEF115FAF98C4616536512F7AD13EBAA17CC36237E", + "section_salt": "2542EBE3983FF77643536AF98A47BDFE" + }, + { + "adv_header_byte": "30", + "adv_salt": "C4112B2B6BC0C275800AF30E221E029A", + "aes_key": "CB3E8DA92E33B125E206698CCDDB4E17", + "data_elements": [ + { + "contents": "99A2BBD12EA3D487BA35A47215", + "de_type": 374 + }, + { + "contents": "3B4AD8B0AC9370A0DBECE41039A7C136D66AE40E251A274483E1E04B", + "de_type": 322 + }, + { + "contents": "3B5465ABD3AB9E51E37FE1825D19EBCB6D75", + "de_type": 882 + }, + { + "contents": "C3303DEB37C1CBF6F2D83CF60B5AAE7343", + "de_type": 508 + }, + { + "contents": "5AC15AF945563810514171B4D3CF13EB7CD056ED84CC4AD84E5C8C", + "de_type": 734 + } + ], + "encoded_section": "AD9013C80618AEF0E93826CCBB9F1FC3CA1D2E911000BA4390D760820DE7D19BDD18E12105A99001E4F5385E499355B62DC8EB87A3B4B44BF0A799A099FF59F83CF7042DC080D469575ECB02FD8DC04FB60539411A4142E3386DDB945F456D90F6104B6D5893E7697CCB294A98597A07EDA2FA2A1B5C92DC85F720DCCC7B4F25639F1A8E912041148020E7EF5DBFDB6455C1DEF20F9B7A14218826843B218FA12FEC92D0AC0C0664304BF11B3962", + "identity_type": "private", + "iv": "E39A28DAC41BAE56D9C38A90DE18970E", + "key_seed": "F8956985D12A7454C239C35BD7F5B98FED6987FE6097F27888DC942E9B4F5BAE", + "metadata_key": "0DFAB0A1A5C1F1FB82F4E19C387EF630", + "section_mic_hmac_key": "D52D92CED4F96F98A96CDE0CBCBA70D22D695FE28A792490C9EC8AD3D7C512E4", + "section_salt": "BA4390D760820DE7D19BDD18E12105A9" + }, + { + "adv_header_byte": "30", + "adv_salt": "C8281FAD7EBE43124AD3E52A64BDFC08", + "aes_key": "37FEED11494EC97655A7CDFAAFA0B332", + "data_elements": [ + { + "contents": "2FEB5C0E9CB50EA61479D2", + "de_type": 182 + }, + { + "contents": "", + "de_type": 76 + }, + { + "contents": "EDFE252EC0AF1BCF3203E68626BD87DC210591FB4087E5", + "de_type": 186 + }, + { + "contents": "F3B28EE0AA3540", + "de_type": 53 + } + ], + "encoded_section": "6A901326C139F9297299F3291C4C5449667C1E9110001C4A655CE96B261144D0DC30EEB06E819001ED20997FF72B0145678564A0823492B38F82A2908345E56312025794BFAB4154F007A7B8B672F38D5D78E5E201BB839A44D8E5819E8EE1563FF02619DBB4F3179D5719", + "identity_type": "private", + "iv": "6DD5002B0EC75F051EC1C94C9C5BD7DC", + "key_seed": "4E462ABDDDE34121284FE9958F24C16DBA38929E38A34F2019783CDAD5E08706", + "metadata_key": "AFEB6946137C5F406D7849DBC57AEA66", + "section_mic_hmac_key": "8C3FF0042FD0E1C4145EFCD9A7A84D636B6A58BE736B10AF391C72DB7B4CE6B7", + "section_salt": "1C4A655CE96B261144D0DC30EEB06E81" + }, + { + "adv_header_byte": "30", + "adv_salt": "E64361FB1C8C7325B408FAEE1E49547A", + "aes_key": "7BBC46B2F18B3D283060D0A697FD11CD", + "data_elements": [ + { + "contents": "9E4B0F0E1E5F8B4A48E6E85204B7B761BB77C2B8E9D87A", + "de_type": 398 + }, + { + "contents": "4DA86FD08563540F21F4D25BC7B6C8FFE5D0C256F695231A9758CB", + "de_type": 536 + }, + { + "contents": "0EF79DA8BA03209867C317EE62ED67FE793C10338A07C7509E5B394A", + "de_type": 892 + }, + { + "contents": "E5282DD8F645D9C437993F0B64E1C0126B51", + "de_type": 44 + } + ], + "encoded_section": "A2901389A25CC355CD62CBE4A5003ACDF8EE059110002E283829FBEBE221CF9A1F91C1B0BD1D900171AB8293D624A4D2BE56FDE47583BBD8845F3855B25932CD6A1DCA7098797D301AFBFCF9A4A8A806E391C54F110D1B9D80A21CB9769249E819530E57270E20135F0406FC4C0BB0BBFB5EF126993AEE724E98B9E92A5B6992F8298B8C4FDC7D631588EAB84DD79BD92555DCD93E5FACC5EC36EB8B9F8DF0AB62F718", + "identity_type": "private", + "iv": "A926171CE5153CBD347A51C9978CE93F", + "key_seed": "F36B60BF6F555557AA212FC62B5C02A13C9C2BA4DF41EDD5A72F16AE66D236AD", + "metadata_key": "BB668D0081DBF606A285AD033DE92814", + "section_mic_hmac_key": "91908BF2F777B922CC1CC476A770C7FCAECCE0DE0B2A8F95FE44D507024B93A2", + "section_salt": "2E283829FBEBE221CF9A1F91C1B0BD1D" + }, + { + "adv_header_byte": "30", + "adv_salt": "9DB5D8E94ABD7216DABD6C8F66C5F52F", + "aes_key": "75EB4826F32F9F8B7328CB265FDE141A", + "data_elements": [], + "encoded_section": "379013542EB74608EA671B4B9C539D5DAC9E0B911000371E5AA6A854D8B34632AF62FB16F9E39002958BD9049E4B9D49DB40BFB15A1DEB0C", + "identity_type": "trusted", + "iv": "FE2F66ADC508DBE090043C56A1D4CC2F", + "key_seed": "5694BC71EA736D6F1C9F9CB3F7359AF337754178D62E0CB2C8305813F7334036", + "metadata_key": "D7DF4817E2E00574C1CF3B5BA51411C3", + "section_mic_hmac_key": "B6CF96993547CD0B865BA29ACD9E7989CCA2A2CCFD940E81C97A613423F34D2B", + "section_salt": "371E5AA6A854D8B34632AF62FB16F9E3" + }, + { + "adv_header_byte": "30", + "adv_salt": "815CAF890EB0DEA3D861BE22C7BE8485", + "aes_key": "34D85A4581FF6A69DBBD8CD74D881E2A", + "data_elements": [ + { + "contents": "8E976835BD38B761F8F5C5E3", + "de_type": 175 + } + ], + "encoded_section": "469013F70BA8EF34F0B010A6EDFF3E02486FFB91100057434E8D7DA6137D885EE4B43DA850B09001367A8D04108F605A363DDE7A55DBC6D28C92FE23A27E7D70FF072A469793CD", + "identity_type": "private", + "iv": "0F43CBDBB69194C72762C45B8A959AE2", + "key_seed": "9DCDB616C7824FE6E29EDEE371A1F019AB9035DEA6A2FAEED01086EB7C7BA56E", + "metadata_key": "386504600FDC6BB6D29B931F997569C3", + "section_mic_hmac_key": "40CCE5D2E8BD439CE407FADC7D03C1E5E3EE7BDB2AE09C3DAEEDBCD383994AAC", + "section_salt": "57434E8D7DA6137D885EE4B43DA850B0" + }, + { + "adv_header_byte": "30", + "adv_salt": "20AA489B07F54A47398F0D452085BA80", + "aes_key": "70E8FE98FC7B2F2BAF0F571C5A6CA285", + "data_elements": [ + { + "contents": "895FC4C4D7C5327B823935153EE5", + "de_type": 603 + } + ], + "encoded_section": "489013E548BFD8D8BF4BABE9BBA791575D88F0911000EA0BC8652F833AA286C9B67BDBEEFFDD90012C035FA41FD24BC9E2154A4A746EC39BD898F5AC0D626F6FDC9EC1625F4A6E0278", + "identity_type": "private", + "iv": "27675AE693055520D818FA2DF75BA1DD", + "key_seed": "7BE2B5351B3AF721D834EFC7D92EDCFBB356CD30C149CFF13FFA6BB9E9EB4E9E", + "metadata_key": "C51BF8A84C682176009DAFC96E45E52A", + "section_mic_hmac_key": "63BB6F972081FE41233CC4657536A17D3DA9AC374FCCAAE4A390FBB9467E6B10", + "section_salt": "EA0BC8652F833AA286C9B67BDBEEFFDD" + }, + { + "adv_header_byte": "30", + "adv_salt": "E7BF03DDA652D45DE79BEC7C63C52888", + "aes_key": "DEC78F8DAAD1135EDA4BA73CA2EDDE93", + "data_elements": [ + { + "contents": "CA", + "de_type": 831 + }, + { + "contents": "0681689828FE001F46FB", + "de_type": 640 + }, + { + "contents": "A0", + "de_type": 925 + }, + { + "contents": "6EF5787D1B7E", + "de_type": 821 + } + ], + "encoded_section": "559013122F1A904EE013BF5054BD17CB565C7B911000BA917BAFABA916680B68E584D7B3C74F9002124726B3336C5A2E714BDA406F4ECAE6942867CFB87D060B7CA2B90E553A7980483C575AA8F669191B6652D622FF", + "identity_type": "trusted", + "iv": "5623FFAEE945A52FED893932E2C2831B", + "key_seed": "EB421B623B6601022B06C3B84A805B0BECB369AC96BDDB227D35F720BB88E54D", + "metadata_key": "481736D7E51E562209CB88D5098D7AB8", + "section_mic_hmac_key": "73839ABE23D964F432D5109E0FD1AF2B7458ACA6C4FC8C81B00F17697ADC7140", + "section_salt": "BA917BAFABA916680B68E584D7B3C74F" + }, + { + "adv_header_byte": "30", + "adv_salt": "C4F478C39E6822FD65B039A579058329", + "aes_key": "942E583271C5BAB68F5A289F13B4AD3D", + "data_elements": [ + { + "contents": "6740DA0B7D7422B46668B2A4748EF1723D4740177B561E28", + "de_type": 25 + }, + { + "contents": "57673A8C3CA46CFBA015193726BA9D1B87C155F230", + "de_type": 157 + }, + { + "contents": "966C4FDAFD61602A93A588FCC9E9", + "de_type": 997 + } + ], + "encoded_section": "7A9013E8068D3273AD4073892EC5B38DFE7A85911000F20408CF4792B57C5EAB5F364D498024900485D9D787000902A41BF9B32EBE0B9BC5457E424445793F00C68FF17BA783444CED2BC3DF3E7FD930C5D53A8FF8A279DBD838FEA95D0DB5047C90A20128D099424453872597B42EC79617D8460C78EFCDD06166", + "identity_type": "provisioned", + "iv": "97A725CAFF2ECB63466FC4FE92F1D93F", + "key_seed": "3B1148D64481A45A5ED6A0C71204CE9EFBBBFB24772F4376D14A60809095A80C", + "metadata_key": "E356AB5D0B7B4A162CFFB3DC9200B03E", + "section_mic_hmac_key": "622F90CBC74C39F7E270CCFEDC73CC2501A788B6233CE65018C90D315EB1B5BC", + "section_salt": "F20408CF4792B57C5EAB5F364D498024" + }, + { + "adv_header_byte": "30", + "adv_salt": "E3E029E6CCC13E76F6537200F6FE6609", + "aes_key": "13395363678EB859D922B0AC513D569D", + "data_elements": [ + { + "contents": "E88903", + "de_type": 1 + }, + { + "contents": "9177F23C1703", + "de_type": 498 + } + ], + "encoded_section": "449013DAEF852821B69637E7ECB1814AA11E6E911000C35F60118757A8DC6AC94A3145568E2C900258CBCB74090D6AEB5721940B6889ED4C3C225551A6693E6011097D84BD", + "identity_type": "trusted", + "iv": "FECC334DA28A05283126BB74D6D86328", + "key_seed": "836FC0759CA3CBB83B1DC440AAC7EA8832723A1804CCF55FA82B3DE62CF6EF94", + "metadata_key": "108F487561268EC3E2139081F2C18B93", + "section_mic_hmac_key": "1FAB84D97BFBBA1E719918D561F9F49A7190014740FDD66FD6521884BF997D91", + "section_salt": "C35F60118757A8DC6AC94A3145568E2C" + }, + { + "adv_header_byte": "30", + "adv_salt": "ED9AB8CBA38B0378A57060CAEEB7DC37", + "aes_key": "85016D4CE263E72594660319A4008F5C", + "data_elements": [], + "encoded_section": "37901315D82A68468424FC66C3F583A599E184911000484C4A72DC77F3D141DFD0251501313C900421DAA8789829C8B74D5A81CD5E003B97", + "identity_type": "provisioned", + "iv": "91A3EBC0493D70CC75CD52A15EDE7EE1", + "key_seed": "DC9A2935DA138DBA468602F58BA4C10B2CA2073931C2CD76EB89BE9E0C62EC35", + "metadata_key": "6B7B939EC1DFD9DFB28A5AF4834D9837", + "section_mic_hmac_key": "A37F2450D25ECFEB5F5BA3B902280E75A8CD266E134AFA52489EC23247D191A0", + "section_salt": "484C4A72DC77F3D141DFD0251501313C" + }, + { + "adv_header_byte": "30", + "adv_salt": "AA01BEF21050FC2F2E10253E8D1C1976", + "aes_key": "EC5750863DC5A63EE6C924204FDA7434", + "data_elements": [ + { + "contents": "C9FB1F10A5EECEB78957471B0E9F5DD4F6B378", + "de_type": 843 + }, + { + "contents": "4E43DF33AFBCD1D9659E19B0A90FCB04634B", + "de_type": 419 + }, + { + "contents": "4F3484030125E7350D12E9663A", + "de_type": 51 + }, + { + "contents": "", + "de_type": 39 + }, + { + "contents": "7604411E964954B0FC27", + "de_type": 233 + } + ], + "encoded_section": "809013E0B47E9EE5B8805FAE10443E6B5463BF911000DB703DF2D395F42E99EA0544CF85C1F790025E4F401EDB54B36B8CBE582AA5BD19FE4C2671F43DAA3F4E1A060E06AE4A7922BB500BF7E27485959C1A3129450249D0909ABE0F1C34BCED066AFF0140262A2007FA37F2617803C68B429540B65383073558874972F06DE286", + "identity_type": "trusted", + "iv": "9B68EF8ED1D81A8E00D41A8EDF863F8B", + "key_seed": "1D03BFEAD804837303B5363C8F089C79B3FAEC4D566803A636C8C566180D9587", + "metadata_key": "3F72F934C211CFBDE074CCB0A54DCD50", + "section_mic_hmac_key": "331F932E99A5D100F95C6DA9ABBDE9486649FA13D9F40B6075C678B1FD02E42F", + "section_salt": "DB703DF2D395F42E99EA0544CF85C1F7" + }, + { + "adv_header_byte": "30", + "adv_salt": "75A2C0202C54B148B3A8325523E39AC4", + "aes_key": "62C0EBC73039A209769197670BA21D32", + "data_elements": [ + { + "contents": "1053D13B0CD897", + "de_type": 913 + }, + { + "contents": "08D336BE6750FAADCC063556753748C6D80E7BFE3AA5016139DC9EE23054", + "de_type": 385 + }, + { + "contents": "CA9FA19B1A1D2662477670DBAC88B27E484B45A21A4EB0", + "de_type": 78 + }, + { + "contents": "150352672FC7AD44BA4F3AD0AE8F1FB86B342072982DCA44D8C028", + "de_type": 246 + } + ], + "encoded_section": "9990130900396AEDFDC487B3C663EED8CEB672911000607C74788B6319F4BEB5D1B4CB02D7BD900118F1E3D46294A4BA21D910380DE516BE171072179B90364446BA39519AA03E30382BAD7560A891FFB6F72D1F17D6C6385762460985DCBBBF3C890F8AAE57BE0BBBA483917D4CCA0A6837669F7B00D710D0CC2E760E3E0B4903CDCF5AC83DE4CC1995FB93278C9E0EE2667A93387B1ADBA08C", + "identity_type": "private", + "iv": "F2C95E5EC2FA105C282643BA7C800549", + "key_seed": "4B6810C7997D7DDE597C9268442CE989762AAD10290801679FF4594198DEA08B", + "metadata_key": "83562D42E58C363E0E48127F1B3897B2", + "section_mic_hmac_key": "43A0F588C743498AB2FC9BCEB915A1BCD353E02B9AB75CB952A6430C4D6C9062", + "section_salt": "607C74788B6319F4BEB5D1B4CB02D7BD" + }, + { + "adv_header_byte": "30", + "adv_salt": "212440B8E8D36B2CC1327699BFC93206", + "aes_key": "6A2AD6F934FAFA71982F6C4AA26A4F56", + "data_elements": [], + "encoded_section": "379013D5557C5A6CE2CAF81CE036A91EF70A3E9110009DC45FD603A6B020B509B8D9BFC969DB90041218B5589E2AB40D4B0B82061756E4DB", + "identity_type": "provisioned", + "iv": "F72C452B0E570EB5B9DE952C4791095A", + "key_seed": "47B2C609DC4A2F6785197E6EA791FEAFF65BA00A43E5A18A677933ED15386ADA", + "metadata_key": "8F209D0C0585905DF5DE92BD3B654667", + "section_mic_hmac_key": "D9FA303E247451D08056ADF12DBDD9EC49332E3AC4CA3E301069728FE0063569", + "section_salt": "9DC45FD603A6B020B509B8D9BFC969DB" + }, + { + "adv_header_byte": "30", + "adv_salt": "433465189236D09078373B8ED0CCCCAC", + "aes_key": "E43BC17300BCFBEB25108453100382C2", + "data_elements": [], + "encoded_section": "379013A40450E97B1E7F305B04EEA1CC6C6FF7911000858846A0F9FD9E2E0611D97BF2EF06469002A3D2D64941BB2C16BE63E6233FA8BBD9", + "identity_type": "trusted", + "iv": "5FFB8A197BE6260CBE3EF3F5A69D6F9A", + "key_seed": "950084CE1A17C18014492E2D819E1A4A8918E418B5D793D41CE40AC01962AB45", + "metadata_key": "F3105517DA032D58D69A3604C768A207", + "section_mic_hmac_key": "81F142D0B4A95BBF07A155889C7B253A70BE5AD20EBEE9E38B730A9201FADD47", + "section_salt": "858846A0F9FD9E2E0611D97BF2EF0646" + }, + { + "adv_header_byte": "30", + "adv_salt": "AE407D2A8A6A0F933972D7926F06C555", + "aes_key": "6684D1C9DA338DD00813CE3BACA74FDF", + "data_elements": [ + { + "contents": "BA4B31050C802CCFD9F9", + "de_type": 261 + }, + { + "contents": "A07F15", + "de_type": 533 + }, + { + "contents": "3D59A78F9181304C3974C28F99BA56FC", + "de_type": 680 + }, + { + "contents": "BF97709E54F7", + "de_type": 452 + } + ], + "encoded_section": "6690134F1022868C775755B32E82021EA423C39110001F7DE96605E9315D3517A53C620C9DFD900485ED9FED88BAEA7D0F7F2649C5C60EF3A8B1985EAC9CA0670D89222827DA233F046290021C3D90C872AAA85B5DAA376E3EF6359C0B865FBDCB1DE9AC211D91", + "identity_type": "provisioned", + "iv": "7CB6244938A943AE0C2223EE5478D9F0", + "key_seed": "2DF4F998B4046363F13903E444563666752112E7A50CCA849AA20A1B632BA11C", + "metadata_key": "81D88DAABD6499A41CC39A0B69C88149", + "section_mic_hmac_key": "2579AC31B40E6259D86560A179396A8C8D2460B065479AD84D1672A8E6AAF100", + "section_salt": "1F7DE96605E9315D3517A53C620C9DFD" + }, + { + "adv_header_byte": "30", + "adv_salt": "6BEFDA99ED6531BCC16097D12D8E054F", + "aes_key": "5EAB15A140D70A229BB83A187E9F02CB", + "data_elements": [ + { + "contents": "0F0E43C4406FA2936FA381", + "de_type": 236 + }, + { + "contents": "08C74C0A5E82AB", + "de_type": 569 + }, + { + "contents": "B739FE96118484", + "de_type": 911 + } + ], + "encoded_section": "5990133C1C7C478A9872741B2CACDCE6EF85F59110005F03C93641025F2C7C9AFE7A14A9CCD590040783A8D0F38BBB63558E4FD0359A1ED0479EB554E8FB8D695366CEAC447857027FF727D304764FE2A2033DC87C56017725F3", + "identity_type": "provisioned", + "iv": "3DBA7081144B735EA26C11843C84939A", + "key_seed": "A6E1BBB65242EF0297CFD3F36A26E92131DF8AE1124785A313A03CBA129A5708", + "metadata_key": "B756D4BB650054A9B555F945179AC0BF", + "section_mic_hmac_key": "672FD0220AD1CE18CB5C2865E369343213F98286F70F932B6864E77878042155", + "section_salt": "5F03C93641025F2C7C9AFE7A14A9CCD5" + }, + { + "adv_header_byte": "30", + "adv_salt": "936F85512A5DA1B653FB8A2DCF27EBF9", + "aes_key": "212B797347439C09143EDEE8D49D1145", + "data_elements": [ + { + "contents": "4C46272C464F1F327ABA", + "de_type": 300 + }, + { + "contents": "90DFEBBD2FD42483D8", + "de_type": 576 + }, + { + "contents": "9C67", + "de_type": 590 + }, + { + "contents": "54EE", + "de_type": 237 + } + ], + "encoded_section": "5A9013FEC4DE90AE4B04DB998D69D7B9DAB3B6911000071925257522B40B840ADEA964E0F8549002A053445506418A7BF78DB30EAF544AC34AD6F4B2298373091CF13DB14519C86BEA5E5241124929BC2DF6F87314D8C22DE90D9A", + "identity_type": "trusted", + "iv": "2575BE3DB96C9E3EB6C7635C6F6B0E7A", + "key_seed": "F57E01ED4A19496DC227DE1B016B09C1EBE135D484ED8B80DD00C6EC31ED5B5D", + "metadata_key": "DEC2CABDD66E55B71A83AFC163D7FADB", + "section_mic_hmac_key": "4D01BAE5168047AD89DA9A7126549672887F9CDDA5442E356BED3D6B00AAEBFD", + "section_salt": "071925257522B40B840ADEA964E0F854" + }, + { + "adv_header_byte": "30", + "adv_salt": "7E7DA96580420BA0D659EC43121322D8", + "aes_key": "A8FB66F215BC84C5FE083146B193AB8D", + "data_elements": [ + { + "contents": "FFB586B557659859", + "de_type": 397 + }, + { + "contents": "4263", + "de_type": 671 + }, + { + "contents": "E0886DD5892A663968BF0F850FDBC48C32E2C0C1268AD368AA794D", + "de_type": 612 + } + ], + "encoded_section": "65901376D02BAAF38EA4CB4BDD1C73BC3871AC91100051AEC209767B8CAA7980A3BD7C3FAFF29001AF29552C93754001FD0D837E2314FDCAAB5F3F83221EBEAA38EE14E5DEB24E81B4DD949B42A0A8AF3FA573DFD9B28FF81902561D21E508C845551668B4A9", + "identity_type": "private", + "iv": "17EBA64E62386CD3B3A3DFCAA57C8990", + "key_seed": "598D2245CA116C288DD7F884902FD6966A3EAE9F42C0836BE31CE29C29AE3EF8", + "metadata_key": "05686049146A99EB4A1FE87216DCAB1B", + "section_mic_hmac_key": "6FA0EF16D9CAA4AC317B88DC23341FDB92AF5B2B4EBAB09202AB3CA30C38CB75", + "section_salt": "51AEC209767B8CAA7980A3BD7C3FAFF2" + }, + { + "adv_header_byte": "30", + "adv_salt": "4E5974753C765E7C366AE0ABD13B6032", + "aes_key": "B33B94CD44650B66F7ADBC2EE729BB6E", + "data_elements": [ + { + "contents": "86DD5BAF9A7C3DDD8447254F3203CA9E", + "de_type": 588 + }, + { + "contents": "AD60D51F76FB590E2E783C7120C160E0DC15543848D74BD898BF21", + "de_type": 887 + }, + { + "contents": "46F5356343E961455A3F74", + "de_type": 584 + } + ], + "encoded_section": "7690133360E0A798FBD58AC2C9E37CEA3A383E911000FE2C7ED573CD9CBA19F2AA6AFDD623299001A71787DF83BE1DE49338E1ACF15530E60197A15D7D3007AC410A6D443BBE7F7694D2B54E3FF5BDB62ABF52F85A5180C014FB86A8DE0315F7CF97F2FEA63E21EAB45758898AD526D9AB8B38726E9315", + "identity_type": "private", + "iv": "06E07BBF2D5201688926629511421FDA", + "key_seed": "66E4D540348E429F58155175C858A8BD1E7CB0999B49781D348A321AA6138173", + "metadata_key": "48A307411309490BED28B84E99A5557E", + "section_mic_hmac_key": "1BBC012E6C6D7955641BC6D4D06550739840EAA718C15AD3A19816957E58528C", + "section_salt": "FE2C7ED573CD9CBA19F2AA6AFDD62329" + }, + { + "adv_header_byte": "30", + "adv_salt": "74CB68B7EA1E95E04B832182154B0A91", + "aes_key": "B022EAFEFB9FF1B5C2F98A40B9ACC3D4", + "data_elements": [ + { + "contents": "7E37E828730AB3F87C1EB99B8E", + "de_type": 787 + }, + { + "contents": "9135DA70E02D2232DED4F3F5568A0371", + "de_type": 420 + }, + { + "contents": "C89D3EC94DD71F", + "de_type": 236 + }, + { + "contents": "07F52CFFDEF1D58177543155723441BEDF06D3", + "de_type": 980 + }, + { + "contents": "CEE968AC8F1B700C2BB3019A4E9472CA7E", + "de_type": 169 + } + ], + "encoded_section": "8E90134F49609F3C0B6286BCD6BB68D9F4E24E91100052CAF10EC936B174958042A90C112E5B9001ECDBEFA0B57D0456BF272B7A1D20269C96F6B666647AC239FAED67E348F463D9B7DF48FAF7A27BD87A9CF5E6B66F7AEE194A485F76350003AFFDEE337DDFCA1DA36D0CC1BE171B72A48C70809218513429B567E3465E8FF5E2033367E102CA20AAC3F702B0DC1A", + "identity_type": "private", + "iv": "A5C0BD5B8496CED016A2AF10A6F91FB1", + "key_seed": "BFBC7FF2263EBED86F9C96A09FC127CE977C9239CC08316F8287B00DBD0B3498", + "metadata_key": "A832A816BD5B77EDA8EECCA1EBABB014", + "section_mic_hmac_key": "710B9F30D232D15E9DE12974DA748A32F65D122AD460B292ABAFB60338BBB60E", + "section_salt": "52CAF10EC936B174958042A90C112E5B" + }, + { + "adv_header_byte": "30", + "adv_salt": "BCCA0E7341FBF76B2B5F5BA041CF1E5A", + "aes_key": "D12B503A2F126AF19D0AF97566785ABF", + "data_elements": [ + { + "contents": "64749203BD66A2F9ECBBE0D588092B4354", + "de_type": 19 + }, + { + "contents": "C163763F7A4D635495BD26B704AA19D140DAA82EC06DDAC118", + "de_type": 908 + }, + { + "contents": "60B0B36271380D99A2A25F", + "de_type": 222 + }, + { + "contents": "796D6F2B775593F100B9", + "de_type": 760 + }, + { + "contents": "3A0B8533F323DE0B7C2B5DE29F34DF3D265C6CE5190AA0F958811D", + "de_type": 994 + } + ], + "encoded_section": "9F90136082051F8CBEAA0CCBC6113961AF0C93911000B90142AFBFD356D46AC2B2720D1F8481900205E87BF19BCF1B2CFCED4986FC2A31A121106BDD978C20BC7E027FD26CB2AA0052C1DBB34B42F03C324129015E97C6FE9694ACE4FD254641272F6873CA455E6863D3025F03D209F1C554D250F0EF5BDC10CDCD01CF4831D8C9F30EB2586D41A2CC2D6CDECF4F42AAC02C1B985BE84A98831A26B00B27596A", + "identity_type": "trusted", + "iv": "4765E55F52DA037253303C93F66A6DCD", + "key_seed": "50CA1651529AAF0D0E3874C19E7EE47519CBEEB16DB1A7EF99F69315502A02C6", + "metadata_key": "70AEC06B61DD252B459F5BE7FC72F7E8", + "section_mic_hmac_key": "598AC0D450A9FDAD2DD86DAFDA3011B9179E56DE268CBD38AB8B9B9726B0B2D0", + "section_salt": "B90142AFBFD356D46AC2B2720D1F8481" + }, + { + "adv_header_byte": "30", + "adv_salt": "2C14A845A98E4C0EC1D3D37E7770C558", + "aes_key": "A68054A9CC008CCE3091CECA4B305A11", + "data_elements": [ + { + "contents": "DCB2B2ABBEAB26EA71BB01D24C", + "de_type": 12 + }, + { + "contents": "E3109D", + "de_type": 799 + }, + { + "contents": "EA153371A83C3827DE52AF886B3ABDDC5601", + "de_type": 223 + }, + { + "contents": "358C051EF89D4B2A70A66557C0E40523E07CEE5D702602A63301", + "de_type": 466 + }, + { + "contents": "1E3264B6EDF37242534C9123818D649D38695C4AB285727F7AB64D6D33FE", + "de_type": 662 + } + ], + "encoded_section": "9F90134CFBFA0A7E0F1D95CE9E7DDE4D9D0F119110007C677DA19284373DF76BF8DC23F62A2C90018ED6D11D434C81E0813AE27A8A08FED219D8D2D509FBE4D738C507D35AF118126F68CD7A0CBDB12D6416E38172D47F328DD389DB4AFD0D27028366DF30755D45C06DA90E6A00EE097C5354215144CF3C39D600112B8853736303B3D5589D9690891FD597AFB197D8272C0FF4C4774BB0EE0E8BBD16981621", + "identity_type": "private", + "iv": "0BCB734C4A958CAA0BD6818BFC616225", + "key_seed": "52E8480972975E4BA2FE7605453EA8349E9BC5A94E29540433F860556F01884C", + "metadata_key": "8FC6598BCE8ADD3790D7EBDAF49D0103", + "section_mic_hmac_key": "ECCEEA279B282C887A23EC16580BE97CDD50135DEA36DCAB5DF44156A29C1607", + "section_salt": "7C677DA19284373DF76BF8DC23F62A2C" + }, + { + "adv_header_byte": "30", + "adv_salt": "229EEACD212DC405EE4811F9A977F2CF", + "aes_key": "B650D65C7FBB23472BB72579A77181E7", + "data_elements": [], + "encoded_section": "379013D438766EAF4C661EDD88BAA0FCB42A1E911000855BD2F01023E6A57B6E71DD49DAA2AE90041D6AFAB5B808B58855F9C7AA4F4D7EE8", + "identity_type": "provisioned", + "iv": "9902444F8F3857B3E0BEA260972F28B6", + "key_seed": "80897CE9046AAA4A739B63E163EB437BCFF71E3E3653B6EF46E3C6AA06D7A121", + "metadata_key": "34683AD177E872DCBD2A5E7E63EE0A3B", + "section_mic_hmac_key": "BAB117F9C1BD11C895F4602EE9EF166CFDB9267B3954B5CB5D84D4737676E3E5", + "section_salt": "855BD2F01023E6A57B6E71DD49DAA2AE" + }, + { + "adv_header_byte": "30", + "adv_salt": "2A0C8512737C3A026EA6F37CB99230EC", + "aes_key": "9E758D2B63DDD9875440E40B527116E7", + "data_elements": [ + { + "contents": "EB02C160F935EC11145161E1CE4018A85DC6C6B87E", + "de_type": 947 + }, + { + "contents": "", + "de_type": 273 + }, + { + "contents": "513989E8F256F4BB4833E9", + "de_type": 980 + } + ], + "encoded_section": "60901342D70D1E94399CE4FFC098059653E5939110001D9723326BB9045D0FA8AD2D055AB7E290013A4BC24317039BC6F6742EDF1BE1FF740DDA42AA9D246BFDB1004EE8CCADE443AEDB88834895F0E1DE5C71512B93FB850303B6C36838EBADFC", + "identity_type": "private", + "iv": "A498D9B0ABD9DF7BAE1C56730B8EE99D", + "key_seed": "007973A9512305072C4B09ADE63EE2B1473CC8800EE101C3B15B7601A53CA570", + "metadata_key": "7D44DCD6C2EAC7C368BF131C16F56757", + "section_mic_hmac_key": "FE60C7116D645B0830D381EF145EEF0D76CED5639BDD5BE55BD6796495102AE7", + "section_salt": "1D9723326BB9045D0FA8AD2D055AB7E2" + }, + { + "adv_header_byte": "30", + "adv_salt": "AA5C563E4C1823D73563F7C3706AFDB3", + "aes_key": "C999C60B91C13F5DFAF5217C0D5B5C34", + "data_elements": [ + { + "contents": "A5A7EBAC14D1B41520E40AC51864A16754521D4A7E54F92A7D", + "de_type": 88 + } + ], + "encoded_section": "52901375BA880AD3ED961F78870D04157CE0E6911000EE361CB440B15CE82D93E0C1DA85A9379004C2FF0F23A2FF140F44ADBE468A1A74B9F702645EB8D1D9A8BE0BC82F88D404479CE665DFF4AE98007DC791", + "identity_type": "provisioned", + "iv": "538C25B23A3C86BCDA97A0CFD35A6FC6", + "key_seed": "ED88849FC0BDA24F6E40D9DE41DA1E13D489B4532491DC76DF1FA6B2119AACB7", + "metadata_key": "FB3E3B0DC3A793B84A8BAA8B76C66339", + "section_mic_hmac_key": "8B61AC0A77B70BD562BECA6B9EC68D3AE19A43F75E7C20DCBBB772E72335031F", + "section_salt": "EE361CB440B15CE82D93E0C1DA85A937" + }, + { + "adv_header_byte": "30", + "adv_salt": "619C4C8EF05A933823C2D65A31B92B00", + "aes_key": "9A57A7F7C65D4129320E88946A9DC223", + "data_elements": [ + { + "contents": "CE0E4BE0690C0A5BF044", + "de_type": 831 + }, + { + "contents": "BCA982D5431D61B73230868E555B97C3464366E2A4267F64", + "de_type": 200 + }, + { + "contents": "C82659D54B9B19F6C502A2", + "de_type": 338 + }, + { + "contents": "45B4B7C9A022B79136DE", + "de_type": 197 + } + ], + "encoded_section": "7A90136D731B5176129F207201B4A5D0F6673A91100096D3507A4EC35496932F887BD27700429002BD18C7C64DBAFDF85D34F178917F923C0656AB4C77BD56DA1FDFD011885B997312645D52617E2F428FAA6CBD6CFE285AC1713EFAC1A641DAA3856D5F455D08BCDFE7F308E22A41706C5556B5E8996955934EC0", + "identity_type": "trusted", + "iv": "8D39404C79316D7EA939A237B0DA32A8", + "key_seed": "25C985FC227F539121AA167BFA906D05760D8AEFF52102154CBC785FDBD64514", + "metadata_key": "14318D2A0E05B5E1A77A50CDEABFA81F", + "section_mic_hmac_key": "123A5EAAE2B67C4169444F1235E071BBD36804622722A7DCAB1A321F22507A81", + "section_salt": "96D3507A4EC35496932F887BD2770042" + }, + { + "adv_header_byte": "30", + "adv_salt": "ADA623A6380A3F4522EE69542E99D25E", + "aes_key": "331F18CC2ECBE380C1590D5DBCB4E970", + "data_elements": [ + { + "contents": "0174A015", + "de_type": 588 + }, + { + "contents": "9D5A034F0AFBAF", + "de_type": 17 + }, + { + "contents": "E0AAFAD94D19113E64B96863147869E9859DE50FDE4270216231B3184D", + "de_type": 99 + }, + { + "contents": "F24EB6B5AEB4FEA479F5083B7F028FA4B5B8D4DA82AE263A34", + "de_type": 356 + }, + { + "contents": "F8911686E780BA27D8516A00999512CFA3BDA6B6", + "de_type": 955 + } + ], + "encoded_section": "9990132880845C490110E6A5557732B923E92D911000621BC78DBCDEABAF66E6D1402BC169059001AB11D8A9FF159246AF50E950BD8E400E4D615242ABF1080B0B75A379AA4368ACDBCA95F2010F3841D150725F8A670CA3FFE83412241EDF6EC0C12D1A5CB71D15F9C121E2B378017E5D61F6C1036A8B25790B193380C3897B66D488FA4DA297E39DBB71D3F430B4035F7EBF539DF3F5296380", + "identity_type": "private", + "iv": "C98BFAFEF62296B28CD51297CF787F52", + "key_seed": "86109574BBFC42BC1D620F4EA1018967D9B48E655E5C6DFEC0FB6773CCA774E8", + "metadata_key": "8D07E48C35FB78B8A5513345B3C40C9A", + "section_mic_hmac_key": "70AD2654896DB69E49246717749BA8FE8262F0A9EEBEF5D947BCB5253224BE17", + "section_salt": "621BC78DBCDEABAF66E6D1402BC16905" + }, + { + "adv_header_byte": "30", + "adv_salt": "397D6D6B5613F8AC2FAEA44797C0A638", + "aes_key": "632129B34E30FEC65D800EA6BE5F7A61", + "data_elements": [ + { + "contents": "796EE13738E80BD71145D729", + "de_type": 756 + }, + { + "contents": "1D7E9E3DF4EBC7615F0923B7C6352829DDD5E4E295F9695E3E75", + "de_type": 960 + }, + { + "contents": "C9308827A08A7B53E73C3D8FB9DDC3A9C61E50425623FFF66B7DAB5FA9", + "de_type": 391 + }, + { + "contents": "3740A8AA731F460FCBF8D08E17437A92EEBE2554CA90D8E5B063165D199A", + "de_type": 666 + } + ], + "encoded_section": "A490134F9B86D148E83C40F686AEA68DECE504911000FFB3EB0B6BBD03AACDE886D4B64963A790046E990FA420DBE8370E20B582D0F390FC2EB3B4027A44D55BE09DF6AED7C73280D7B271397917B220A8E81422893C7FD705E02ED8A0D672DEF820343A46C18FF08611639060A1324C24DEFC5B4E8BCE9F9CBAF58E48EAC6DCFE80A916FB7CDE7582422D06E9287896BF6F4211D2395A5028690E94F6CC2136252D8A7105", + "identity_type": "provisioned", + "iv": "5276C1A1ED1B081D2A2A6F5DEA96F665", + "key_seed": "D95BE815CD7B0FD68B3E7446B8B2D79E348D548C6183AAA1BC4AEA344738987D", + "metadata_key": "25302242FB45A172D3B3FF58EBB4068C", + "section_mic_hmac_key": "CF8906BE97A01B93944A42FB2DB4610CD87BD1678F8C88F0486D9BC527FC41C4", + "section_salt": "FFB3EB0B6BBD03AACDE886D4B64963A7" + }, + { + "adv_header_byte": "30", + "adv_salt": "AF24B060AFFEAC233E864603EE00A9CD", + "aes_key": "D93AAFC5986BC8683E27129BE1E82563", + "data_elements": [], + "encoded_section": "379013E9112895D9EA079C03219B88C45A925D91100033555799B45F9C4B35FC02644ED660DA90026A0D952277833EE72223017DD0D09AF3", + "identity_type": "trusted", + "iv": "768BFD528B829A1EBA49204A0CCB4B02", + "key_seed": "970EB18227C61CEC00A2A05F5263593CB7C0495397DD0F533DE7CFDA67180147", + "metadata_key": "122A3B297DC2A96CDB5B3BBB05D6B536", + "section_mic_hmac_key": "2192C8F4C87ECD29422DF7A686A1EE7DA0943B83F89D81442550BD786F1F648B", + "section_salt": "33555799B45F9C4B35FC02644ED660DA" + }, + { + "adv_header_byte": "30", + "adv_salt": "82B9B8A6DE7077940685F5FAA7DF422F", + "aes_key": "7BFD4D7DF1E0E9C478A06570E9B9CD94", + "data_elements": [ + { + "contents": "ADB48AB0F67DA8D5A9618BA4253EAAE7D39E310D5BD37BC56AFCF41F", + "de_type": 461 + }, + { + "contents": "9A86354A04BF30E00DBE8C414A9FB24C86C8EEB7FC83E460", + "de_type": 936 + } + ], + "encoded_section": "71901316B26D715D337B501770721CCBE8D13B9110002C99BBEA9A300BAA95863AB8AB9A9BD39001FF44AFBB9D1C0A28266B562AE0E7B38C1BDA2D66BC2DEED15F33F3034E934A9D7FF8E3718F68A23361EB574956A6D723F38EE0575D4A922AD0DB7DCECAE52CF2C44BB26E1E71DC16BCAE", + "identity_type": "private", + "iv": "7718D52D9D5CC851A7B2C047E8E56916", + "key_seed": "2C2905CFE0366D03717F4F8084FEBD30602C7CB22BAE0F5E8AC4902C762AC880", + "metadata_key": "35E0C0C417D995CC800143D9A392B94A", + "section_mic_hmac_key": "A8AC22011356C040DDDD1830F1881474FAE157EDF4D0129D5DC616244F495E51", + "section_salt": "2C99BBEA9A300BAA95863AB8AB9A9BD3" + }, + { + "adv_header_byte": "30", + "adv_salt": "D49E9CD1D20A4B4F340A593D6BCD93A9", + "aes_key": "A8BD4420579EA3F0F63C1BC03F9F6893", + "data_elements": [ + { + "contents": "3B986384C79F675F", + "de_type": 650 + }, + { + "contents": "", + "de_type": 640 + }, + { + "contents": "40EB0279736AAA9A100E2C26941448AE2277AB", + "de_type": 990 + }, + { + "contents": "", + "de_type": 470 + }, + { + "contents": "91318CF7EE4B2E35241F", + "de_type": 694 + } + ], + "encoded_section": "6B9013DDCFA87C6ECA5D9778AE29ED4AFDE2FE911000182084A74C01395449B1A065B30D8080900433A6E91CED224E8632C5205DBE49C3C810CC5A826F3F058111AF85E8729E0900EDEAFE67BA46EBDD09A8D9390F47EF040498143310AB8776ECAC80461AFD91D2A5318B82", + "identity_type": "provisioned", + "iv": "134179E764FCE0DF7ADA95F934D30276", + "key_seed": "BDF4556FC6C4D53488D013E20A98C17524875EAD68B64ED0BE9E0EB9DA2B7BBB", + "metadata_key": "F4DC6D1E64678F9606BDF71B0EA52BB9", + "section_mic_hmac_key": "96D8CA32AD841897F0AE2C292B9359E901760A16B9FEA999490FA1CC80C944E5", + "section_salt": "182084A74C01395449B1A065B30D8080" + }, + { + "adv_header_byte": "30", + "adv_salt": "F6A8AA713174F7D9C61E5328D2FBC88A", + "aes_key": "C2221BD4696591A3CEB7806807E54F5B", + "data_elements": [ + { + "contents": "BA4C375C376640ACC08AA1864AF3BE5AEB9A59", + "de_type": 667 + }, + { + "contents": "54F3E1E4DDDA", + "de_type": 390 + }, + { + "contents": "3F3851F502FC37945B512B2DA0398A6AF6299C08DF21A49A", + "de_type": 664 + }, + { + "contents": "BF39F68C7BECA2FA6D4A56E4F01589339D619761", + "de_type": 425 + }, + { + "contents": "53B006EABB64D1206347779AEC7E47CC", + "de_type": 177 + } + ], + "encoded_section": "9B9013E2396E53181A2D3263100883209CC1C2911000A30816D0EE95944953EAED4DF1C8E2069004407CB081B3ECF537ECDC12A2C42A866F9CAD0593863B3C5FB9425336A46BEC045CA6EFEC8439DAAF4C7107C4A09A5678FF4787379C733C9D71E520F141F7E1C9D048E2C6C56C0B7E1AE04A11CBB9EC7DAD91F8B8B3A783DCAB0CBE44B354B19F2D205E3550BE0CA3E25FB15F8368D0AD060D1BDC", + "identity_type": "provisioned", + "iv": "49DDF471C624612F805C254CACC512DF", + "key_seed": "9B73B7B20095CE1A1B91186605AFA5C48463E2A93E1F3163AAA0DC4ABA51D273", + "metadata_key": "7755D72850CB417465414B8AD50BC492", + "section_mic_hmac_key": "E15A4CC4DC3E2E1AFFEE0D584E82999BDC30D6BEC9C1143A236A4354598E69FD", + "section_salt": "A30816D0EE95944953EAED4DF1C8E206" + }, + { + "adv_header_byte": "30", + "adv_salt": "B7820F847BAB14663F5B9729C770A903", + "aes_key": "ED1C41116C53D174E700C90465D29FB8", + "data_elements": [ + { + "contents": "40980514A48D57566E6CEDBC1F13125EBF242B6BE09C", + "de_type": 982 + }, + { + "contents": "31CC3F9A09A2163C86581D7A795A2C7D3BE9AFD63F00D797A4", + "de_type": 304 + }, + { + "contents": "6D85FA25468C5164AF6E8D7A5CCFE94DD7759B684850E0D007", + "de_type": 633 + }, + { + "contents": "191D0F07EF", + "de_type": 686 + } + ], + "encoded_section": "90901336A6FD32C63BAB8221AA293FA3979ADA9110004FBD36EB5BE03713867E3B3B06A4B53C9004C4F0B8515D402330041A6614E4BA859F1A6444377518C0289C14D01EDEE0939FA2BE910809ECEBDD265B2E89B26C60B42428084CA567C85EB2B76C8035DD8B8787E94AB3C760DBD281CD84D0C8CF8F281E486096E34230F0DE44456677971EDCC5A2F5DA4E0ACFBD94", + "identity_type": "provisioned", + "iv": "C157C8C8BAF421A7020E0F5AD4399A7C", + "key_seed": "0D5FD7A0EB16F50FB1C3CBB0ED4EFEB3C022AC15566F7481FBD9DFADF9BFE596", + "metadata_key": "26294EA549B9B814C43F866176D22280", + "section_mic_hmac_key": "676112EF0807098F45519595990076B83DFCBD0E55B9414225990D9A6046FCD7", + "section_salt": "4FBD36EB5BE03713867E3B3B06A4B53C" + }, + { + "adv_header_byte": "30", + "adv_salt": "4A8D0B8F6B7F9E6221EDCAB57C36BFEF", + "aes_key": "B9A82BE9DF86E2FCD72839955485B828", + "data_elements": [ + { + "contents": "2B0FE4B16D2740AF13A500", + "de_type": 209 + }, + { + "contents": "BBB807A186D2C3F87855", + "de_type": 999 + }, + { + "contents": "8A34F77DD5A61121C4917A48AA085776ABE1", + "de_type": 323 + }, + { + "contents": "ABC7CC", + "de_type": 138 + }, + { + "contents": "7A5C43A5C1B70C0403E055FCDFE81A5297DA1FD729C47776DC5D5F", + "de_type": 499 + } + ], + "encoded_section": "8B901302D13FE7AC33AFF3924F23BB90E9D53891100058FD054F518764F7FFA68EDC5E76897C9002C8019C9BDB34ED694F527F1A74A171D4DB910B76FD198A047FF0A723356BCAC3F103689FC91F58B627B3E1E761849E237D9F28D154025D4153CA2D22555EF4351328FB3B9473CD12972BB2B2EACBB1B8612525B21BF117E283394DF7A464BFF56D7CE298", + "identity_type": "trusted", + "iv": "8BD5C8CF29932090561C480D4AEB8E36", + "key_seed": "321AF261DCA753BEE3CBAF5D7DE64DCBFB04C0585F7FA27D20D11CC0059712D9", + "metadata_key": "F0BE3BEB618DA219C8DF306367CD47F4", + "section_mic_hmac_key": "00F983CFCF9D1F0F4E8D74A6FA26E6F8A13E7EC53388C10E81EF31FFECAEEE87", + "section_salt": "58FD054F518764F7FFA68EDC5E76897C" + }, + { + "adv_header_byte": "30", + "adv_salt": "C7BA44249D8BFABFAB9B54F90B12F222", + "aes_key": "A56D794C950BB5A50D04EDB2699B967E", + "data_elements": [ + { + "contents": "773856891169289C79ACE48945E05618FC738071", + "de_type": 799 + } + ], + "encoded_section": "4E9013B45A17060677E85EA10D75DDE8C12D3C911000CADE7094733167FAC6390816307D14159004DE8DE98CF28805D142425AE5F24F616AAB3BF83AD109A4F753E55F37D7AC1E6FCF6534806D9740", + "identity_type": "provisioned", + "iv": "BD0CD0756F90453E808F180E923758EC", + "key_seed": "E0440C8BB83D2E4A5ADFD1B123A1D55AE0C78ED8F14C14DD9CF1AA5B3CF3D650", + "metadata_key": "5CA211769EFD29892C0058779633355F", + "section_mic_hmac_key": "36CE6C896028CCE6845B791384FFE622B9E8774F12F44C00CF410FDD543D7EE1", + "section_salt": "CADE7094733167FAC6390816307D1415" + }, + { + "adv_header_byte": "30", + "adv_salt": "EC717CB0D92304E7C8A5886A78DB5034", + "aes_key": "7E9A8C8DE80E37F263D24E3DDF281A86", + "data_elements": [ + { + "contents": "34E5A87FF8650308", + "de_type": 954 + }, + { + "contents": "FB132CF4999537D6DBECC9CE4D88BC0E0C66437891091F49E137569E20C0", + "de_type": 277 + } + ], + "encoded_section": "639013E9DEC88D9D254BAF7E818338DB5B69699110006B1150D7267D5DA8573E97C7DE07E1A89004FBAA70C03E33206A3417BD94DB9CF1B17A1C2B7968732BE4326A647FE22B4F2CEFF689ADAA4B278FA37931CB60D22363385B4816C4736F2A05A6EE28", + "identity_type": "provisioned", + "iv": "9D13A28391F3EC75EAB2C424E505FD99", + "key_seed": "CC5C727CB341CB25BC5AEFBC7D49177263FB4978B4E4E5186BABE100E5F3212D", + "metadata_key": "6616F3E1AB67EEAAB018CAF0368EE6EB", + "section_mic_hmac_key": "BB1DA65CC10CE54179F3E39CED7BC4A00CDE225FE15A11E2A0B26A01C2EF00AE", + "section_salt": "6B1150D7267D5DA8573E97C7DE07E1A8" + }, + { + "adv_header_byte": "30", + "adv_salt": "F817848433DAE38015DA750CED78183B", + "aes_key": "020009EC448EF1E4CEB74B078296868E", + "data_elements": [ + { + "contents": "5946AA9A7E7F78583A2593221E", + "de_type": 819 + }, + { + "contents": "F3FCAA87BBFFBB6DAC6D", + "de_type": 396 + }, + { + "contents": "7616F64C32BEB7A3", + "de_type": 848 + } + ], + "encoded_section": "5F9013C1CEAC79565703663F399E1968C2470D9110007BD86A32FF05C5A3467AC4770AD53060900405E742BD974A141B76639EDE0CF231F727BD196A8C863E60EB8B78E51632632F66AC501B2AC22B50F5EC417B9140C81BD8DA0070E2381DAF", + "identity_type": "provisioned", + "iv": "69D2FD8DE211E9C5BB873A2D7D2B6CB9", + "key_seed": "A0334C2F26179EF4E774DCB7CD5A391CC98BFF20B494B723245929CF735448DF", + "metadata_key": "9851F80BA3762814A9E72D468DEBFA61", + "section_mic_hmac_key": "15D84B9D02BDE9C0C9DA6AC3EC67292ACD5D8630CCEF4641DB19DD4CC8D895C5", + "section_salt": "7BD86A32FF05C5A3467AC4770AD53060" + }, + { + "adv_header_byte": "30", + "adv_salt": "E40CA7C0648E07D9192133CC75F0615E", + "aes_key": "28081717F56B17979C8FA959D1705DEA", + "data_elements": [ + { + "contents": "3684845D716D939E", + "de_type": 119 + }, + { + "contents": "5947145E79893A962656DB4C59AD50EEAD01F1", + "de_type": 727 + }, + { + "contents": "5978AE5D485DCFFB9867D2F0", + "de_type": 641 + }, + { + "contents": "962B9E9370A4C36C43FEEC0528002B35ECC2ED", + "de_type": 938 + }, + { + "contents": "EB29C1", + "de_type": 186 + } + ], + "encoded_section": "829013293A19BEAE341B678E05CA9E75DBA8BC91100057B76CE356A06E76CFA8BB68D107FDC39004037C94F1AFD8F33D737F2064155467C3207485B5F71525974A812736FB82850AB38C76D001D5E5CD0B4328D0671D515BD3A96875EE561D2771F74DB2AFAF4EFABB0F0F12B7A17E237FB068C81260B34C1A1BAF706519F3803E23C0", + "identity_type": "provisioned", + "iv": "40F169746958A56E53FED40BF97B2393", + "key_seed": "D49D918900133822B62FD10A29B94E6BE3A2292AD816F2E70BDBC54D028FE522", + "metadata_key": "D4AE0FE4DCC55363A8466CF3B4F51435", + "section_mic_hmac_key": "1D49C1AD9F730E0160754250778275FFD5799B819699A89B58EF2B3A41903A8B", + "section_salt": "57B76CE356A06E76CFA8BB68D107FDC3" + }, + { + "adv_header_byte": "30", + "adv_salt": "757EE18FCEFF081F4652936C61C98FA4", + "aes_key": "402C0F4BDF07820EDD02DB5D70184906", + "data_elements": [ + { + "contents": "16023C5646467C0D21089216EBCD2C5413BCEF76CE991FCF661FC4D0C699", + "de_type": 362 + } + ], + "encoded_section": "589013F1FC637B2DE2561AD1B961848A1C31DE91100012709EC52C322E758DD1D4B3347B16299001DBD653A91D6CFA3EB9D465D9633FBD9D86F1ABE4C9CD01BA0EF5AC6DDFD32AD069F6A6AFA8B424DE31F9D096DDF88B5517", + "identity_type": "private", + "iv": "94F193ED7C3685CBF02FBCAC1BD8AB90", + "key_seed": "01466D478F60FB0CA89BE406E370ED7BF41C0BDC1B4E3C00A21D639968FAEC72", + "metadata_key": "55850F8341492920ABD7B9F783E48899", + "section_mic_hmac_key": "969F5321DEDA0678199C25C7FD9428994949F8553438F227114C2E2E2DC84599", + "section_salt": "12709EC52C322E758DD1D4B3347B1629" + }, + { + "adv_header_byte": "30", + "adv_salt": "42BBB939A0B851EBB455B0B9CC6CA629", + "aes_key": "3A239E17B2D8469E47B47F8AD8026A61", + "data_elements": [ + { + "contents": "A85630426C2034091E33C8805C8470161D9E03FBE5FFC6DA16", + "de_type": 1000 + }, + { + "contents": "", + "de_type": 680 + }, + { + "contents": "22B766878655BAE8D17D60104A", + "de_type": 203 + } + ], + "encoded_section": "66901361BFCCAF1C31DC52F1BCBDE2CA129C719110008D11CCCA32A98B153EAE11A9A82D5B8B90011EE1A3D2126B9947D2B7738A2AAFDFE4AB95B394A7152262808E7E30B50085DAEFD42870EE6C929F3D694215247C54659972A9EDBEFA4504FC8A8E44174522", + "identity_type": "private", + "iv": "B4592168B5F6432ED7AA739A5EFD1BEA", + "key_seed": "B80CF25126E7DF740A3C7A4C3F070220ECED0A230C46D4166786B7924A3EB873", + "metadata_key": "AEC4D47281DFB8882A751CD4D30AC338", + "section_mic_hmac_key": "8505CF64E272040C22176713164AB15E9A59595E77793D79E4FA517901E5619E", + "section_salt": "8D11CCCA32A98B153EAE11A9A82D5B8B" + }, + { + "adv_header_byte": "30", + "adv_salt": "7FA90676A637142CF7CB5C912AC1F98F", + "aes_key": "DA5F3DD4DA5B5420500EB8F9CAF9807B", + "data_elements": [], + "encoded_section": "3790139616C2562B842335B3474F07B4D10A81911000F24039339EF2187F8D6958E05AAE8D2B9002DA1F8883F7B4BD72A21F62487E578D60", + "identity_type": "trusted", + "iv": "F24D530E53213A55CF5A6DE13E8BDEF6", + "key_seed": "217B43E5524A922F4BA6D492809942BB9021143D3337961443AF613301210AB0", + "metadata_key": "83202E063706BD296D9F1E4A7F1C7951", + "section_mic_hmac_key": "234DA6C4D3E64D80479D48A109F449C888A444DB541E0CDF9E6ED02303C82A84", + "section_salt": "F24039339EF2187F8D6958E05AAE8D2B" + }, + { + "adv_header_byte": "30", + "adv_salt": "67D52BBE900B7D4B9C3689669C4574BE", + "aes_key": "CF50974C04B44AF21E8DA91AB769E3C5", + "data_elements": [], + "encoded_section": "3790134F982E377F44CCE5EDD47A02E14D0074911000EC29B4AC8612C65A3910C4F542341B169002F16B78F5F6A227EB47469338E73B5591", + "identity_type": "trusted", + "iv": "DCA9FA6379C1592FCBF87CF2C356022C", + "key_seed": "BB1C2824578A27C5BD463EEA37C51DBF8380C9C418DA31629EFB9BC3E2E1E5AF", + "metadata_key": "F716A36DE6F63EF6280780B52950B263", + "section_mic_hmac_key": "36DB68165CFBE7D58747A358D101CA6BCFEEFF26F6071452017AFEDB64EF411E", + "section_salt": "EC29B4AC8612C65A3910C4F542341B16" + }, + { + "adv_header_byte": "30", + "adv_salt": "A8166ADB4DAE7D4B20347694120671F9", + "aes_key": "ABD91B9CED37FF55564836110D6582FE", + "data_elements": [ + { + "contents": "E5ED8A82CCC764F7A2223F9C6D4701FB4E", + "de_type": 485 + }, + { + "contents": "30A7FADE0C23C8528D5CF2043572EAB8D6981184", + "de_type": 430 + }, + { + "contents": "2697", + "de_type": 607 + }, + { + "contents": "C8052125E93A57796DC2FE0A560176FA099D06309581D8CF0349DCD63D", + "de_type": 175 + }, + { + "contents": "E7D9B6F5BF4B0A7321F2A3BB4CFA955BB0723229527586F2D8AFD286", + "de_type": 802 + } + ], + "encoded_section": "A6901329A398A67801759F9CA6A0FE27829740911000B048311CB6B2A4B7CE2518E1CD9356239002F002B86EE8DE89899528BB9568107ADE1966E76715DFF2DCBD3149DEEFA21EDFB4FCC9E4BD0099887239950EAA3AE6245C379A2EA7A2010F82B5966FD9BD4791D3B9281A622EE0C21C089EB54F342574EE043B87CC8C9CDC920EFA3C1026B277E34B6D8A19A9A54F8E4D7461781F87F64B697AEAAFDE058D2D68A0600E6FF3", + "identity_type": "trusted", + "iv": "ED7F17674307775199068DBF510647C7", + "key_seed": "D0BCE2863FDBABA82CBA792D89EA4DB95642305B5967BC96C22D5936E155CE1C", + "metadata_key": "6993BBC4A4D2A05F8938EF1CA65CB545", + "section_mic_hmac_key": "6E7BB863EB3E1B0026872D4487C94E020D0BD53572D65D7C0D6C860A8D6D0479", + "section_salt": "B048311CB6B2A4B7CE2518E1CD935623" + }, + { + "adv_header_byte": "30", + "adv_salt": "EE774E050991C3C3C9021112F6F6EC06", + "aes_key": "AE6E6D8F193D0262BC994CF38FA772DB", + "data_elements": [ + { + "contents": "442095408DF056", + "de_type": 170 + }, + { + "contents": "85CA4D8451F85564A337E66E3D", + "de_type": 101 + } + ], + "encoded_section": "50901385B9A090D6F00D94495AC0F8196830709110006141474D448BDE019B1ACCD97B5898A29001B076A9F616D35B3F67A9324816D2268BC4F1884707102D3D23202C966E0647ED7FAB056222AD712CE5", + "identity_type": "private", + "iv": "069306DBC724AD554F5241390602AA31", + "key_seed": "9CC25445803440DBF96652CC28DA5AFA1735953DCA314BB7EC9FC1C11C3E4DD1", + "metadata_key": "541C17F0B1EFF90F37B511C84CB01D06", + "section_mic_hmac_key": "6E7AC64E36AC9A870E06118382D82BC2B47D35820715A53DD9954F4BE868517D", + "section_salt": "6141474D448BDE019B1ACCD97B5898A2" + }, + { + "adv_header_byte": "30", + "adv_salt": "D51174BCF89730FA639EF480EB430A8F", + "aes_key": "DA6B7E261E3C36E6FCF07C079887B799", + "data_elements": [ + { + "contents": "7E03CE74C8591B567A1EDA2A366C7E", + "de_type": 734 + }, + { + "contents": "66ABCE0999131CDE50E7C35DB2D8BE895D9938E4E658D37B9A4601", + "de_type": 511 + } + ], + "encoded_section": "679013CAFCD53B1A04DDA344493191C7EAC7B99110004A952640E5B79A89A0655B00CF018DAC900446881055D48B06AA711F6C8DC456BAACAC13BFF4D46C5A85AC0102A2DC9BF94DC1F012EE6198AA698214B30A1414C363E1020F23A4822AE91A04BA2FE48AD10E", + "identity_type": "provisioned", + "iv": "07F3DB13F74CCEBDB585C022ED0F4B56", + "key_seed": "33B0E0FBAB31D8FE35848E2F78C9D5390DD11ED65F7E4BA39C71D748E92438C7", + "metadata_key": "D695C5430C16E9EA343D065570644C0E", + "section_mic_hmac_key": "93952E5EEE989B740674ADE0A44A2C64D6A4CF9AFBA3446C07967C14FF5F72DC", + "section_salt": "4A952640E5B79A89A0655B00CF018DAC" + }, + { + "adv_header_byte": "30", + "adv_salt": "774C0D533FE66410BDD55592E3036A0F", + "aes_key": "18AE71C0EE69346777AB7B1E8C253B3B", + "data_elements": [], + "encoded_section": "3790135D1CB9ACA8C85EBA088DAEEB5F7B2F0F911000B88681185AA3C583D44424B27FE983BD9001D1435474765A6D46A2E1DB20190EC0B5", + "identity_type": "private", + "iv": "DD2B97D25158EEDC1E23AE53BFAFC480", + "key_seed": "58339EC9EAC03D85F9E049005AFC9CB869C91E42AD1579F9B483A94AF53AEF85", + "metadata_key": "3849D3FB177823CF145390B303471646", + "section_mic_hmac_key": "9514FBB9156CFFA72FB2B0D83B2E1A7F8F12E1089A54B602A1B6E1954BA75500", + "section_salt": "B88681185AA3C583D44424B27FE983BD" + }, + { + "adv_header_byte": "30", + "adv_salt": "2A4628CF753A8EA365C9B865A1882111", + "aes_key": "A155E6D506D2F148E0AB36A972E814BC", + "data_elements": [ + { + "contents": "8C77898782AFDD3BBB5415BD", + "de_type": 639 + }, + { + "contents": "7B0C5D7023C73B8522C9EA75", + "de_type": 903 + }, + { + "contents": "9CDB06ED0CA5436E486401F2BD230C0BFB4C", + "de_type": 421 + }, + { + "contents": "B7841BAB20AA8DFFAFDBE875C19C0479189092AB", + "de_type": 914 + }, + { + "contents": "7DBC5D", + "de_type": 13 + } + ], + "encoded_section": "859013018B2B85208E151D0AE32ACE1338E72C9110005F4F13AE0A18955384461083CBDD4808900253E05D4D34C0F0AE7B49116B244A88D9A46A108C9CC629BB2425C7FFA06C65B8776B3F14DB40950B88A64CB748A51F9774EB4D520DEAB00ACCEA9B8C21BBCD78DE99503D58C3180C74D9975717039336048301DA335326C27A515D26BA18", + "identity_type": "trusted", + "iv": "D19E93815AF20322A04DA98F0C71E960", + "key_seed": "EFAE9C42B2580C7BD3B6F72022C14514C52214F90B4592AE55DBA17AECC21CA9", + "metadata_key": "D8DA27FC09648F9A7B03CE89C6C0E73B", + "section_mic_hmac_key": "C9B288EA8BD044EF4F94D580F71B5411A511D4BF8731FAA43760FFE5854D690B", + "section_salt": "5F4F13AE0A18955384461083CBDD4808" + }, + { + "adv_header_byte": "30", + "adv_salt": "63C164C01739526FDFF320C932DF63AA", + "aes_key": "6571AF72F4E833E632EA672CD1ED748F", + "data_elements": [ + { + "contents": "E3590FC9ED1455080A7F9141290E3A7A86CF07E56EC946", + "de_type": 158 + }, + { + "contents": "DCEC6A40CE44EBB393E18282D6EC2942AF3E4C0ECA67ECD01CD450", + "de_type": 331 + }, + { + "contents": "E7", + "de_type": 627 + }, + { + "contents": "550A", + "de_type": 213 + } + ], + "encoded_section": "7890135C8416F66FBF8296AFC54C0B51DD9D54911000C730E6814F61380EFAEF16F4AC12251B9002290C795417F652150706F2122E017A644903C036E3A38349C982CA8A03D481CAC715B9B95F40189FE7470117B3D7097D8DF2B09187190A285B937C7CAB276D0801AE6B224F710CBB80585C3A66EDF99293", + "identity_type": "trusted", + "iv": "23C8041707E666CDD9B92CE4E16390C6", + "key_seed": "E54B5923FBCAC75CF05EBA91DF3C5A62DEF8A88671EAE2D9261C30FD83245BB4", + "metadata_key": "DB91F1262351AD353C9CEF87EC701A18", + "section_mic_hmac_key": "0A44BEDF00C054D356FEC008D901B583FC99CECB4DD06FF16BABD31C7595312F", + "section_salt": "C730E6814F61380EFAEF16F4AC12251B" + }, + { + "adv_header_byte": "30", + "adv_salt": "D6A2EAD0DBDFF521DB943F9164E9ABF5", + "aes_key": "BD03B9DA72C3E8AFC6C0E7E62F02D66E", + "data_elements": [ + { + "contents": "FB62FA28DE416B3FF7C32CDE250E503A38AC512010D9A11E21ED08", + "de_type": 580 + }, + { + "contents": "5B6053833E7DA425451F", + "de_type": 86 + } + ], + "encoded_section": "619013B8C630B2133545FF1C0C09F167B63A769110005DBAE9CE6653D2E2B9466DE1F81BE8BA90022F5C1D5F8C8B84AE9E2988700331EC43097F2B12FC61E105086BCDF84D27411E91717096B8EFDA92630445AE4D2F984A2863C71CBA45AC3290A8", + "identity_type": "trusted", + "iv": "E82975873E9953E02212AF85698F56A9", + "key_seed": "88F7698955CC78F3019EA531FB78FB1DB904390B04C10F42F19257F35001FA89", + "metadata_key": "66E54B6B9FB695DBD3CA8C66C5FDF514", + "section_mic_hmac_key": "C739EE6C7D4FDF5A76FADA66C0872E628EE444761679A4005F45F01CD1A748CC", + "section_salt": "5DBAE9CE6653D2E2B9466DE1F81BE8BA" + }, + { + "adv_header_byte": "30", + "adv_salt": "BAF192B97D33369E018E81BC50AC8F7A", + "aes_key": "325B3B524F9BF9100439F3089DA3C7FA", + "data_elements": [ + { + "contents": "B0", + "de_type": 856 + } + ], + "encoded_section": "3B901356FF1D5E7200783B9778078D010BA13D9110001FC604425A47F60D3C1CC80624EC40139004A2EB00B81AE9CE42819E6CBB1CDA25BC43B99433", + "identity_type": "provisioned", + "iv": "5BC3D50F1BBEC06A2B6B68DA3D21075B", + "key_seed": "449CF830F890204B2D836B34548904080906F492D5CF84FC0C2C82D782CAB553", + "metadata_key": "79C0215D30C0B475C608D77C570B4CE8", + "section_mic_hmac_key": "6B3F15514E22EE373A70F39F81516BE169F8AF5458E35CBB3C5B60AC036A6E64", + "section_salt": "1FC604425A47F60D3C1CC80624EC4013" + }, + { + "adv_header_byte": "30", + "adv_salt": "719A721598179D4D4B26E2ADC7E3C50F", + "aes_key": "ABADECB605978F38B860C1AC618EF22E", + "data_elements": [ + { + "contents": "2B481F57DBA2E4528AADB3F65A2E0A10FD912A517252F49806DC", + "de_type": 452 + }, + { + "contents": "7EDA82863D", + "de_type": 366 + }, + { + "contents": "8A8868E25778C9D2DBF3E428", + "de_type": 541 + } + ], + "encoded_section": "6B9013B2C0BE2B338651F83C9DEE9FF7A5E9B3911000320082AFF78C58B12275134DD71800779002E109918D72EB73A7CF12E71CB578633A99BBE624409264B989AD42AD9FF7386B107AB874BE50CEDC6C193CC56FB20F9986CF982065C0867E248B792655F223FB1B99B268", + "identity_type": "trusted", + "iv": "EACEF787A9AA0D378B47AF7B7BAACC41", + "key_seed": "8C96ADE771F0EC82E8A65EAB09768E0D2779DC80D10AC3A93C69EDADA363C9D6", + "metadata_key": "980207617795323129DA7B883489A471", + "section_mic_hmac_key": "878F73081377F28C1DCD6BA7A3C9CCDB12B2F9D0577D37F2217558C7D5B560B7", + "section_salt": "320082AFF78C58B12275134DD7180077" + }, + { + "adv_header_byte": "30", + "adv_salt": "898AF84E18B19268BF0066E1B843DB2A", + "aes_key": "D18AA5914985AE77CE2FCE7552F09B46", + "data_elements": [ + { + "contents": "4615409B344399237B3ABDB8F670E5B8655C8EF5449E5DE40A9A015E197A", + "de_type": 851 + }, + { + "contents": "3D6EBF61130ADEE935CA18BFEFECD70BD2F9C05F276F52860E6C", + "de_type": 516 + }, + { + "contents": "9E", + "de_type": 916 + } + ], + "encoded_section": "79901393C3CD52AE720625794E99D501168018911000B225FB4D96E5A2AD5966E0201447323F9002B0CE58BA8230AE27D19688FCA438C5C94AAD5E60F0750EB7F63D98739E51CDCC0AEFF8E374AD8CA4B87E671B1163F8075511F02B94493CE489C0BFD6626FFCD80A78A99F869E6D048D89A29D7EE9DC94572B", + "identity_type": "trusted", + "iv": "0F973AE8405A878AAF91F3F3030CCDB5", + "key_seed": "FC64BAB5EBFD28BCC2DF64A332591AC18E67D4F0D8D04B09D15BE99F992BD0F6", + "metadata_key": "2817DC0D3018C8208062F9F09F0217C5", + "section_mic_hmac_key": "DFAB6D5BBC1AEEDC067EC644D7AB15D0A0FBBFA0FF766A45BC6AE217B00C1A76", + "section_salt": "B225FB4D96E5A2AD5966E0201447323F" + }, + { + "adv_header_byte": "30", + "adv_salt": "6CA09CF038262F0B86AFC0F196F079A1", + "aes_key": "DC35D7E7C27384B92F1F218AA96E5815", + "data_elements": [ + { + "contents": "F11DD7ACEED992", + "de_type": 439 + }, + { + "contents": "19CA080B4B458E94D3973AEBE5", + "de_type": 120 + }, + { + "contents": "", + "de_type": 973 + }, + { + "contents": "138501DB6DF8DE97", + "de_type": 122 + } + ], + "encoded_section": "5D901335901EB3DFE18DDCC333E258CEBC67A6911000C453204CA5BF1BE8A080F58E1E046BDB90013A59DFC6058F6E641E7F6BCE6B71D94D022FF601B5D7CB45AE24E902357B8AB7332484AFB64A5EE9B2D654B67879279632B8226CD83A", + "identity_type": "private", + "iv": "C4013A2D4DCC401351902092CA23D50E", + "key_seed": "9C31224BE4354E49AFB6CCD5EE02E4CD13A1E57ABE9FD2CE2501A039B51E6425", + "metadata_key": "7A67555F40D8FA75031A57BFCA376901", + "section_mic_hmac_key": "32FA238989BD8A58E646578F6ABF19C7A49B10F8A626BBAA984C7163A6129896", + "section_salt": "C453204CA5BF1BE8A080F58E1E046BDB" + }, + { + "adv_header_byte": "30", + "adv_salt": "1AD93C4DB2AA2956308F6B40D2227DE4", + "aes_key": "702409CD2C1478EA23213540CAD5A499", + "data_elements": [ + { + "contents": "A104DBE9FC480BD7403A4F2488AA305DB6CDC31C85923D7F71B751", + "de_type": 441 + }, + { + "contents": "3AC2773587350DE26099CF", + "de_type": 827 + }, + { + "contents": "320622", + "de_type": 969 + } + ], + "encoded_section": "699013A36C4D395FF98F721DECC40BC9CE7A96911000687BD81DC1D918FE6F5EA0EA6871D83590016D763DF756CE03623E713A3A5CEFC54FB9A77EDA7C91BA0072023850ABE73DE6F6E4CA176F830D0E0A33FA5D169D172F2B50ECC62C75A95C5A9BACBE4FAB29A3DB7A", + "identity_type": "private", + "iv": "AF815000B11B4D2338590EE859E43B26", + "key_seed": "BCF8775858AF8BB34B9296C2B9CB9604AA68CEAF0E015FC23F88F60CA73E0EC1", + "metadata_key": "22AD97286075323B5D9C97A18C8516C2", + "section_mic_hmac_key": "E59A1CB6BD1ADF2BF24F4C657428105B097C70A80EE4F707ED96551FE4FE834C", + "section_salt": "687BD81DC1D918FE6F5EA0EA6871D835" + }, + { + "adv_header_byte": "30", + "adv_salt": "CF0F5C6FF715661FDD243EEFCC3DF000", + "aes_key": "465940811F2D7624AF1BC24ECF583A31", + "data_elements": [ + { + "contents": "ED5B2856E0", + "de_type": 480 + }, + { + "contents": "5C9037389AE1E052391238AFA847305B8D52F177ACF119F8F5958475C1DD", + "de_type": 458 + }, + { + "contents": "F1207137", + "de_type": 42 + }, + { + "contents": "9EA01A", + "de_type": 627 + } + ], + "encoded_section": "6C901358A772231DD98A3887EE3F43DBADB5219110002BC0BF28D21A7964B7F0993AE4F5B0EB90013C3E4A659C9FF925633BE6B56F540526D0F5ECDCA82350FE06A01B7DF9180909C186D3892E87DFE229957C59982999EE546326D04870BA1F7D953C8F4E7BC2A62F0940C9C1", + "identity_type": "private", + "iv": "668CB07C7E17BBC9C738DB7DDE67F0B8", + "key_seed": "D86A2754D9774433632916979DA1EBB2D15DEBE68568D976D6F611E7767C6CD4", + "metadata_key": "7D9BBF1CBA464E5B3D3E1132C99C3D2D", + "section_mic_hmac_key": "16C2939D01D4B63ADDBC2CE217C412B1DB240E79171BDF904BF90A2F0E5DD55D", + "section_salt": "2BC0BF28D21A7964B7F0993AE4F5B0EB" + }, + { + "adv_header_byte": "30", + "adv_salt": "A4F08E8443AAE40F4E7DAC88701D0A61", + "aes_key": "E32648F00DE2B1472DF2AC0C21D46D41", + "data_elements": [ + { + "contents": "67ADC5EFF86C7C6823C644A2", + "de_type": 245 + }, + { + "contents": "A2FE5429988C99F4608621F625D2", + "de_type": 446 + }, + { + "contents": "CDD480DE03360DAE07242D23F079", + "de_type": 236 + }, + { + "contents": "66517DDF7ABCB8577D19413F67E25F", + "de_type": 307 + } + ], + "encoded_section": "7A90138693FA8FDE6BC60CA1E4714073108989911000C10DC9C0C4A68B9018C3488D10740CBB90044E395EF33AEC517158560D95A90F95FD4F901983D6F8FFDDB7B22CA5054BADD29B844F5E589C81D03EB39FC74D0E88B8D6D708CB0A8A8073FEBC2DC580146760537167FD194907D3DE050A6CD1807E2A7B2BC9", + "identity_type": "provisioned", + "iv": "40B3E8038361FDC0CA520885C4BA45EE", + "key_seed": "12CA6E10625D8A743F3980FF5B82786D1E11A0B2E7095D1C60B6500947C7A80F", + "metadata_key": "47D63E40F400537213FA6C39741EA95A", + "section_mic_hmac_key": "C2DC1307FFA2E742682513F21A7F585D155EB98549978992A6561DA4F9C2779D", + "section_salt": "C10DC9C0C4A68B9018C3488D10740CBB" + }, + { + "adv_header_byte": "30", + "adv_salt": "7F3B4AC49A6859D7121614C35F5B54B0", + "aes_key": "A0E754DDBDC126DED5C2E5BD3ED151A8", + "data_elements": [], + "encoded_section": "379013F66D7FA47F0BF107AF009FBD4FD70BD3911000FD6B5B75A82F46AD1EE3944D6229D1059004094FD3464A10B7EBB9FD171DB106A835", + "identity_type": "provisioned", + "iv": "5F212B399449367351A9BE5E8CC87ACD", + "key_seed": "687577B839C89F80ABB09A60CB09330F201F7E109C18AABCF5B7CE3ACCEB7C9D", + "metadata_key": "9190921467B2FCFC928327A128A00D5D", + "section_mic_hmac_key": "EE0BE709ACDA6445F99E7F9709367F1970CC0FF034BB9BAB2525B06838192DE4", + "section_salt": "FD6B5B75A82F46AD1EE3944D6229D105" + }, + { + "adv_header_byte": "30", + "adv_salt": "1D2E3A430DA547BCCC40814B7CB98093", + "aes_key": "EB9DE857753B905D9DAD3D6D68B97845", + "data_elements": [ + { + "contents": "7D25", + "de_type": 960 + } + ], + "encoded_section": "3C90138C32DC48034E13962C03225C7CCC98E19110001F9ECD3C6A5399AE4A22D21D04D50F3D90022E75DADE997D7635B4AB53D54DB577263C8E60D0F7", + "identity_type": "trusted", + "iv": "DE93D4114DE77843376E66C9C1FED8C8", + "key_seed": "FF1AD1F98E7A02BFD970E2E6D969E4BAB06F89AAE1D901C5158ECEA444EE7569", + "metadata_key": "0A83D4CB8541829EB4E13989DEE85722", + "section_mic_hmac_key": "336BE3349032B9BE9AC4E030B439CA29C22300C39C29A768E5429DFDD59CB347", + "section_salt": "1F9ECD3C6A5399AE4A22D21D04D50F3D" + }, + { + "adv_header_byte": "30", + "adv_salt": "95EF9550DD4E6DAB348F32EC6ACE9ACE", + "aes_key": "9282028C74EA00E0A695AA0127941CD4", + "data_elements": [ + { + "contents": "014FD0938269F334", + "de_type": 26 + }, + { + "contents": "B419499BCF2AD0B5", + "de_type": 732 + }, + { + "contents": "998BF95EF3754B4684BA80", + "de_type": 84 + }, + { + "contents": "61BB19", + "de_type": 525 + }, + { + "contents": "E911B16D15B9D70D53BCD3B27705427D11C34D8EC29011A6FC33A1205D", + "de_type": 9 + } + ], + "encoded_section": "7E9013F9317F3EF17F72D0E6E671B482D48FE8911000A5E06CFDFE69CCD42F56062A56578B739004E967DC13B2AEFE2F508828E75102BA7D102B73D8563823F379ACE502595F925B51489A8A865904136429350CA3FC0E80475D5EF603BFBBF13483E718CC349627424499020BA3738BF25127BCF7FB6122FFA582FC9D4806", + "identity_type": "provisioned", + "iv": "0B48A691BEE1A64AC8D64656A4C6E8F5", + "key_seed": "BAC80598D5D058B07BAB96DD55772405A2E8A8F533907534D9A0E3FAA9F30F8A", + "metadata_key": "F759E495DD16BC4B4536A72A4FD88C2E", + "section_mic_hmac_key": "A69B4595E2EF8D19BDD30DB2B3A6C6890840D061A2516C12B9C137832906B7FD", + "section_salt": "A5E06CFDFE69CCD42F56062A56578B73" + }, + { + "adv_header_byte": "30", + "adv_salt": "70F3562E36D87A53735B298C8920DCCE", + "aes_key": "2A04329E89E63A6EEE1E5B9FE26FF072", + "data_elements": [ + { + "contents": "E26993B71A36032D7B6BD3BE1DFC1A916A6BFDE486468C", + "de_type": 619 + }, + { + "contents": "4E4B6D3471BA6DE8958649F7A8F3F2D1D8B858BACA4F9D737E622F", + "de_type": 159 + }, + { + "contents": "0C30D8A9B7F50CE9EC", + "de_type": 992 + }, + { + "contents": "D682BEFA334E31CC3D253BC9B8F9E7", + "de_type": 379 + } + ], + "encoded_section": "8D90137C433C789FC67F116E0B42170BBE1A2C911000ACC738CA77736DA78E61AE2F8BFD56EF90029BDCB44AB171091ADCABA9B4C47698F06A60E7785AE6EB868FA0D3508C4028357D558423ABD64E685A53B84E7CEFBA04B41B7AFE9701E27C2A655BB0FD8E4BACEED81D020887BDEAD433D10A2ECC65781E33C048D8FB20599660EF16CA4964D39E1775E80970", + "identity_type": "trusted", + "iv": "1AA5C3111877402AB12DF3A5D98BE228", + "key_seed": "23FE203BEE209B85F8FBFF96FFD45C5CBBBA541638C875E7D3E882407E75BF0A", + "metadata_key": "9D984FDB62E86B53E9D7DF7A14C9961F", + "section_mic_hmac_key": "3D5C46804EE11C44B04E69BD02A26FC9F8140A98E0BF5B6B28601D9BA19223AE", + "section_salt": "ACC738CA77736DA78E61AE2F8BFD56EF" + }, + { + "adv_header_byte": "30", + "adv_salt": "E17588ABD3AE8E7D6C334D1B0AF92891", + "aes_key": "EC4481D436C1713129486151E496D152", + "data_elements": [], + "encoded_section": "3790139A5DA17E993C1658DBFA6658604A3001911000D08F272BBAB54B86764CDE901B979BE09002B897890E043267F8EE1F98C5F9BBDD30", + "identity_type": "trusted", + "iv": "251B33B9AF829B6ED1ABDA627054F6F7", + "key_seed": "EAEC6309BB2C6EFFBCB0C2BE01F11E4F90F5E7B8887E818D5AC1D4A7DB57069A", + "metadata_key": "F542D812841B2DD775BBB4A8410C492E", + "section_mic_hmac_key": "F67EF00325C91A6AB801927DA0B6796DD8DC33C90329FA717824EE7E180C1760", + "section_salt": "D08F272BBAB54B86764CDE901B979BE0" + }, + { + "adv_header_byte": "30", + "adv_salt": "2345A6D584F3974CF098E8C192904039", + "aes_key": "4DB8F7C88764BB94D3A3ABE8A1F8AA20", + "data_elements": [ + { + "contents": "FBD07BACA069E273FABEB5458519AC66", + "de_type": 270 + } + ], + "encoded_section": "4A9013928EE6E8ECEFE0F28379CF5C9032291991100098A4C16E5FDCB9E737355B6BF7EAB38D90028A111BA84A1E974CF9DEB93971DA7789A71713E4BFAEB4AC83415674B15BAB0CF85A89", + "identity_type": "trusted", + "iv": "212CD8997AAA9236F1FDA4DB9BD918A7", + "key_seed": "67E2C8B99AAEE6CFD7809BF4BE4439021C1917798195E90C095AB601C718CE52", + "metadata_key": "F1FEE18C49BA92C3F2F65E445A273F17", + "section_mic_hmac_key": "76ED254493D473BDC8188E855AE215771406C7EAD2655C0699E1408905F39146", + "section_salt": "98A4C16E5FDCB9E737355B6BF7EAB38D" + }, + { + "adv_header_byte": "30", + "adv_salt": "F9AC3BDFBD989B3B7B99227F4A75895E", + "aes_key": "F4A4A68E314433E1525A20A7CE56CF0D", + "data_elements": [ + { + "contents": "8953B51DCADD4B6DDAE1F254D6FF075F023EE782962BA2E5EC3F", + "de_type": 51 + }, + { + "contents": "3B90B29DDDB595115F94", + "de_type": 474 + }, + { + "contents": "3AE3DC2B64E42DEE4591D3017A373707622603E768FF", + "de_type": 420 + }, + { + "contents": "606367570FAEE5", + "de_type": 567 + }, + { + "contents": "8058E4", + "de_type": 400 + } + ], + "encoded_section": "899013F28C4419C0F39FEF91816ED59BB640CF9110008A20C8F8A8F8066BCC1BE4A65AC5792A900117084AF29AE92FD19FA96EBE5C8A2A42563981458E841FB326A570E844CB1C9DF86C5ECD71E381212CA1AB349CBAB6E08E587987A237010D73012F12DA01137A6DB31DC714AC92A7E6ABD3D25D66DDD4A3F017E36180B1BC81BE906A37A7E5847306", + "identity_type": "private", + "iv": "001886333197146B65A467C6A5ADABD0", + "key_seed": "9FD56F525349238F02680E5213FA5A0976841E232787AF705FBCBC9B20064E11", + "metadata_key": "688DE85D9D408FA2DE99A56F603BA664", + "section_mic_hmac_key": "496FC8B5DDFF85EA5AFB6257048F16A63C38E6B1B0B6880B6DC982AC06F61F5C", + "section_salt": "8A20C8F8A8F8066BCC1BE4A65AC5792A" + }, + { + "adv_header_byte": "30", + "adv_salt": "82BA44E40EE515F4EDB7BD0835B26BCA", + "aes_key": "E63C191EBB567BB2A374A6C5CA7789B9", + "data_elements": [ + { + "contents": "936AD5B9E6439EFB69339392A4FD2913", + "de_type": 897 + }, + { + "contents": "BB64D6B15EE9AAA7A2A4E90CD9D3D7DFF853855652F3C314", + "de_type": 128 + } + ], + "encoded_section": "659013898A83F5E4A7D3DB3F24B83BBAF8FF0C911000A9BAAB812351BFBC259E10C891B67FB490020580A146D32401847A52599D99C1059DFC1B9E2C00E18BE478924C134C5EF2FCB007EF712EDB4C8A69389EA6AAE580B3A3D549891C657768EE03112B204B", + "identity_type": "trusted", + "iv": "A40BE5CD2ED5BB0EBB4725421B8DCAC5", + "key_seed": "3A2C30261D095C238E882B56F8D8CD61B607E7386D35FE3DF3C577A501D583B2", + "metadata_key": "39DB2F2278DB54194F32AF85B1E78C21", + "section_mic_hmac_key": "DDBDFB689EFB7F278636DAA76509101635BD2F29F5374C2FE5FF61C0BC7777A8", + "section_salt": "A9BAAB812351BFBC259E10C891B67FB4" + }, + { + "adv_header_byte": "30", + "adv_salt": "A8B3C773BB49A28374AB878083EF4DD0", + "aes_key": "A7AE16ABAAB4F23FE69F81219078B6B3", + "data_elements": [ + { + "contents": "941B67D98B", + "de_type": 482 + }, + { + "contents": "B56226DF686EE11F00F46D8EAC2FA6B3", + "de_type": 124 + }, + { + "contents": "1DAEF38ACABF3F7F72E0C36D95CE462F", + "de_type": 451 + }, + { + "contents": "C5AE1183996F56207CB46CCF9292D5FE2076EC2FC7DCB8BC5B5C", + "de_type": 200 + } + ], + "encoded_section": "8190131E760FF2E9791B7C00259DE6622D097B9110008F7B71C5430C84A4A66BA8D98FB94F4B900234D15FEF96C1A3789732CCB516DA820979DAC80D2385402A65AE0C15A2234225C44833EB9FF44685B5C5F63331C9A54DD49754676E9A9EFA33BC008618F6FF6EFDA711690EB21B15E1FDD560000C2914756DE9B3ED6F3E26972B", + "identity_type": "trusted", + "iv": "A3F606AB7B1C0576ECD16E9FE421CDD9", + "key_seed": "9B041D4F0C1EF90F3FA1F40CC00F8E2B5F76237D87E8A3532B59953F72C44806", + "metadata_key": "654C72908F7B826008996F7F055E37BA", + "section_mic_hmac_key": "9F368D4991C333653B18B8E47BC2228B4B8AF094D9B0CFAAB697EAA4BDDD0EDB", + "section_salt": "8F7B71C5430C84A4A66BA8D98FB94F4B" + }, + { + "adv_header_byte": "30", + "adv_salt": "3FF717A2F51020F0A8E7EEF5A58FF598", + "aes_key": "6B159573A0B1AD7A064F2B0C7E112009", + "data_elements": [ + { + "contents": "170495D7E094775F3FE95D8B687AEED4201D2565013BB6D143B4368AB3", + "de_type": 261 + } + ], + "encoded_section": "579013C0015142640B5256342482B97540A7F3911000391F6DD321079B0843F5D827A33F72FC9004DC8B35CA45AA35A6FBD7B3775EE4A1E612928B2B6F7915B574AF3B76C69D151D7B6948E811B99489CC62D223399F4007", + "identity_type": "provisioned", + "iv": "DB8D8BB540FE93482C143E02B46DBB41", + "key_seed": "2A25270DBE2575BF55DCA0EAE26CFBF9B57CD40F4F3676A108C187C20D4A6F26", + "metadata_key": "970D974CABAEDE9ECFE8B1A9CC874879", + "section_mic_hmac_key": "405D13A8D5CD5035A191FDB35DD6D3EEB16ACDD4253098B9DF5626EDD56F7329", + "section_salt": "391F6DD321079B0843F5D827A33F72FC" + }, + { + "adv_header_byte": "30", + "adv_salt": "C604ED2EC8A3D1C29EC5A827AE9EDDA2", + "aes_key": "52795E8FBEF4F5EB97CC11774B1B3C3B", + "data_elements": [ + { + "contents": "3E", + "de_type": 834 + }, + { + "contents": "682F12CA13A8346A46FF", + "de_type": 549 + }, + { + "contents": "11DD9D8544F5BF2CA35D580E223AD090D48C62E3085AB6CFF4A756", + "de_type": 194 + }, + { + "contents": "A949786794EB5D", + "de_type": 543 + } + ], + "encoded_section": "70901355836184F4627B8EC7B78B6BB25D230A911000B462B56430FA636C4A6077DAE3E8490C90014B885213D89DC53C660697E09A405EEF027A56F667D32250711FB9AF57E6B173293D4EC62278A5047EE2D95D71CF8297D0BB81882856A9C03855BE2759368C3B68A19E2B7D4926DDF6", + "identity_type": "private", + "iv": "9FB083D020CF0194A51614C38F4CB78E", + "key_seed": "BB328C2C3773B18C637890F7F307C4D5EE297251BD0A3F101061B7C7DDE4436B", + "metadata_key": "2044D85EFE05830A56C3828A60E1B22F", + "section_mic_hmac_key": "9296C374AAF9CFC2E968F9D212EA9FAA10E7CA1712E740F8C423F58377DEBEA6", + "section_salt": "B462B56430FA636C4A6077DAE3E8490C" + }, + { + "adv_header_byte": "30", + "adv_salt": "E4AE638B1788F6A4A7AE8A95A170217D", + "aes_key": "F86260862227268C0AC94B2821714BEE", + "data_elements": [ + { + "contents": "095F42586EFFA90A02AD1377438DC0FB442F8BC36B084071A340", + "de_type": 991 + }, + { + "contents": "21D38A40C8F0CC8CD37E8B99E395", + "de_type": 663 + }, + { + "contents": "0610976CBF91C272697FF6F3DF90CDBF", + "de_type": 331 + }, + { + "contents": "C46F54", + "de_type": 806 + } + ], + "encoded_section": "7E901310E81093792AB0299A1F5B9AAEDC438A911000FE1897EC2C7F696F9A12BA2E3AB8FF109001BD9694097F3C01B81BBAE58DC0AE45DCEEE6725DEF44E95C4651F50683E6E1452ECE362EB210B8F69E64C2147D7ACCB82C7A8FFBB1872CFB90BD33A33CB73837084C658664373AB183EFDE54555E374E0282DBE99F4FA4", + "identity_type": "private", + "iv": "0B8F21A0532C5CC2183796C8116C1AB2", + "key_seed": "144F46384687F7622633B6BF79597124B6602947F71FE56D358D8255FE706F75", + "metadata_key": "FBA8A028F20EDC2617B4EFF42F1B6449", + "section_mic_hmac_key": "6842368E240421D08BB41E23656533362CC290661EF54E887756D7BDE52E90A6", + "section_salt": "FE1897EC2C7F696F9A12BA2E3AB8FF10" + }, + { + "adv_header_byte": "30", + "adv_salt": "21D9EBBF5909A89E702560D71E29B2C4", + "aes_key": "81CA1370B0438486CCDB17555BB775B0", + "data_elements": [ + { + "contents": "111FCD56D62B43", + "de_type": 52 + }, + { + "contents": "C15A18724AC7E528B46E9E35F7554B1209E7F902A60333061B5381", + "de_type": 424 + } + ], + "encoded_section": "5E9013D9B742F3C9077E30BF514C324378A6A6911000074399230FFE3522BF65A0E4DCCEEF149002A212E54AD7F78EE74E021C037C9C0B3A4493EE50C04B6BD43D728CCD62DF48707D3D3503E56426ED0CEC9DC87AC7FC6596B8DC23D4E10B", + "identity_type": "trusted", + "iv": "BD67CFC964A067113164BA2579085C26", + "key_seed": "63FB25167C581FE8ADE6766A9CBB04B2D734564EA92161E6DF67C3776B7589E7", + "metadata_key": "93081F4B0D4644A3EEFB094ACADCDB72", + "section_mic_hmac_key": "B01F9FFC04A6ABDFA23B54EE3A0855251B07ECBA387FAC32783C2D1E31502187", + "section_salt": "074399230FFE3522BF65A0E4DCCEEF14" + }, + { + "adv_header_byte": "30", + "adv_salt": "376F7973FB47B8DE4EFBB10BA01B4CAD", + "aes_key": "AC46F566457606055B133DAA5632FDA9", + "data_elements": [ + { + "contents": "4FABE07C139A4BB10FED0547", + "de_type": 717 + }, + { + "contents": "B0A28EBF12", + "de_type": 337 + }, + { + "contents": "2EC51325F981AF5E505025CF2432078896A5A4C5079CC2AF4067C5A9", + "de_type": 565 + }, + { + "contents": "B50C", + "de_type": 246 + } + ], + "encoded_section": "72901355710202686237786A7FAB75ED3F998E91100094670B48A85C57471200A7A15C35EF2D90044551AD5E4D9C0F656F0D5A1EF39F021CF714060E5F72C5E4165827B2D33B39A68AD8E0B747C2FCB223D61B51C4CD32C0C14273A496135AD4459FC8615EF2D076B9942FB9D6A3F6A39F8152", + "identity_type": "provisioned", + "iv": "1F042222693F97550BC695DE068B0F27", + "key_seed": "B7CCCD49D67B3D822F0EB6389CD28D0D0F709EBCE75A1D41CF78BDAB9C649F8E", + "metadata_key": "D484AF3D402DCE7C7765AFE667044B4E", + "section_mic_hmac_key": "9D04723E57927BB0E47023BFFFB73D7ACD3A75807E62C48D34D81F47DCD2213C", + "section_salt": "94670B48A85C57471200A7A15C35EF2D" + }, + { + "adv_header_byte": "30", + "adv_salt": "633A93C20610A1F816E80581D99A8B3E", + "aes_key": "4371A9D1A3EB70A57E84488A54E24687", + "data_elements": [ + { + "contents": "AD8C2BC724A8477BCDABB0118A33D84A98C8807FB87D9CEF9FCAA3D1", + "de_type": 853 + }, + { + "contents": "01B3970FC3FDD7E7ED030AD7AAF1AD72863B93FA61", + "de_type": 658 + }, + { + "contents": "8780D33466F56DB455D0D46E24CC32AE0695308F2F63BC6548B4", + "de_type": 728 + }, + { + "contents": "8F76", + "de_type": 45 + }, + { + "contents": "94F61429E70AEF3E8003487BAB3AE1D6319FC95FD097672D626F", + "de_type": 65 + } + ], + "encoded_section": "AB9013195BA9A9F3767992302308D00CC1C1EE911000D293112ABD9E9E2DE6C9580BFBF3EEC590047F67987EF7E1FA205D9F59BFD255EF665258B5DA63CDD2CA567DA31D331C085AAB47056FB34C5637C13EC88A08BD9D7D96250A8CE4B314B4FAA00870BBCB5F2B060BE6492B524821708BD765303EB55C2C3DE721F34C3249BDD36AE5595B6AD9E9BAE6925E0BBEFEF7D5400A5BB802BD8F96D54B15C2F0A4E672174CEA6E0EE5C2030648", + "identity_type": "provisioned", + "iv": "EF05D22E05D50648CE4B24BAB3070391", + "key_seed": "63626EA34F2C9B87028C0977809D2F7768E73DD48D9D4BC4E9A8AA6AB63E51CF", + "metadata_key": "A028CF69452B18E0B48C12F43A92BFFC", + "section_mic_hmac_key": "CC71E5A17B3F67FC8293349047F85966CC1D2107A6C9A868904CE012FF6D1EB7", + "section_salt": "D293112ABD9E9E2DE6C9580BFBF3EEC5" + }, + { + "adv_header_byte": "30", + "adv_salt": "A2FAFCF0C3D4653B115D3C2BE07661CB", + "aes_key": "D3F0BD209D67F0C6793F151852DEBD06", + "data_elements": [ + { + "contents": "82A3CE3347A4", + "de_type": 831 + }, + { + "contents": "F3AAF8D0", + "de_type": 633 + } + ], + "encoded_section": "4790130DB30D981DE33703A0264019ADBDA644911000B76D1505FDE3A6DB5745C79C2ED803CA9001486C1A884EB0CACB9ADF1F0D7FF508AB81EE16696136F0FA512B4FD6C6A16B9E", + "identity_type": "private", + "iv": "A35D9428CEF6CA021B52076EA6DCB262", + "key_seed": "CA2DD34D998FEE70368831DD2798E0F1936A589B1C1A5B60FA3D0A4C8D4E0FF4", + "metadata_key": "599B29224832981BD60E11082FC157C3", + "section_mic_hmac_key": "5095030D99F2E81933347E8311CE3391BD1FB3C0B5F9397915FD1ACBC0B1494B", + "section_salt": "B76D1505FDE3A6DB5745C79C2ED803CA" + }, + { + "adv_header_byte": "30", + "adv_salt": "FE6A04FEB87E30414222FE02FC1DED3C", + "aes_key": "AD143FFF025A7B908F3028F255017A0F", + "data_elements": [ + { + "contents": "B41FFF16CE", + "de_type": 692 + }, + { + "contents": "C5EE2285043F76FF038B30EF5EC3888A9D9EEFAF6EF2C4A7F1", + "de_type": 275 + }, + { + "contents": "4F22FC1B2C68EFEA", + "de_type": 389 + } + ], + "encoded_section": "669013AF4FE79DE836E8BAC2A418D44693F4EC9110005DE51155F2A2EE8C7E16026723F4B81E900295FCF7C7A95DA0AADD01DF2EF798AC707CB88138553B4DECBF061D353A6206561B4756BEBFB3536AF66EC01D29C4842F1522AC4894BE7B69927FA6DE2F5B7F", + "identity_type": "trusted", + "iv": "983E35C1E9170FF4EB62F9C900BFDE14", + "key_seed": "3894FC2EE542091EBD73841E9C92E846682B47EE41ABC7BFC9A6CFB9C7EC4282", + "metadata_key": "0C17FCFFDA6B8AB386C3D801A33DDC7E", + "section_mic_hmac_key": "310376D63A925F217B048D0E4C6908764C80444503F89A3AA1763951A33FCAFB", + "section_salt": "5DE51155F2A2EE8C7E16026723F4B81E" + }, + { + "adv_header_byte": "30", + "adv_salt": "CEB2DB3907DA1426F9AEE8AAD33216DC", + "aes_key": "33F5AB96D76920C2F144DE4962D862ED", + "data_elements": [ + { + "contents": "0E094C04A66FF6909AD423192740", + "de_type": 511 + } + ], + "encoded_section": "48901337DBFB04B30BCF0A8422AEED7BE57B73911000636EAA5C104EB02DDC7F6EE4968AD387900179756A7F8E031AA7411DC75308F251B330B7FE2D754B5E999D9DB499716B48AE6E", + "identity_type": "private", + "iv": "79A3FE62EBD753E71B1445F203F5F781", + "key_seed": "B2B7DDAC8583B3D6E27434EE969DEBA37C310AC0764D86B202280244015F4D4B", + "metadata_key": "4E807DECBB61C3EF3A3530264B354C38", + "section_mic_hmac_key": "50A2AF48A3375502973C8E59A22E83359F137EE2391724F8CEA70E71D7DA9FD8", + "section_salt": "636EAA5C104EB02DDC7F6EE4968AD387" + }, + { + "adv_header_byte": "30", + "adv_salt": "C8581CCA00A9614D0A2F3F513490ADC2", + "aes_key": "9B6D1622C67BFCD29AC65E8A5B503A9D", + "data_elements": [ + { + "contents": "A1AF", + "de_type": 717 + } + ], + "encoded_section": "3C9013926DC8C5AB1FAD70EA31134CAFD3EDA9911000ACBE394BCE0BA06BEBA61EE1737000CA9004A9631597C4C3F54FB2DE97D60CB38982950678FB41", + "identity_type": "provisioned", + "iv": "82EAD32BC4E1860FD17E049036F408A2", + "key_seed": "F6B2520AAEB47FCC56D10059ACB35A41937374E73497583FC997CD9643E2E0D2", + "metadata_key": "312D0D394B55AF6328C2527FA2754E92", + "section_mic_hmac_key": "077FE6345CE01680AACD3CD7514C8B248F35325D8EDDA3BB4AE284D01068340B", + "section_salt": "ACBE394BCE0BA06BEBA61EE1737000CA" + }, + { + "adv_header_byte": "30", + "adv_salt": "A8936F1979C158886EA3687E6802647A", + "aes_key": "C123C7A271606C99EB7F65A90594DB01", + "data_elements": [ + { + "contents": "503EB3", + "de_type": 360 + }, + { + "contents": "DCEEE7F22896FC9B32B55C34A0FEBD5443F897062EDF", + "de_type": 693 + } + ], + "encoded_section": "569013AF54CE1D3CBE08F7711B3755799477B3911000546E3934E379D2D397491FE39A9C82FB90028608200CA18E4F6256DDE1C34367161B23C14E639155B0D9A24AD8EDAC13316CBBB6F45BFE2DC243C9259D8E66ED46", + "identity_type": "trusted", + "iv": "5BCD15EE9166022B1383FA6733B14C25", + "key_seed": "21E6F589CF96987FE3A3CB4FBF3EAF56F057D19B1E95A312AC51A43C4F810A0A", + "metadata_key": "13E4BB8217379D14813705DD1D830EB7", + "section_mic_hmac_key": "0349739276968E6FCFFE70B6CA646BE03C7BA2A905B676C37AC67C9174C5023B", + "section_salt": "546E3934E379D2D397491FE39A9C82FB" + }, + { + "adv_header_byte": "30", + "adv_salt": "1BD514F1002291FC8579AAF845DF2230", + "aes_key": "DD4891029D9730B48DE4C95DC2B32849", + "data_elements": [ + { + "contents": "2DD2428876819B13D3", + "de_type": 842 + } + ], + "encoded_section": "4390131A15BD6E7E99C7DF950BA8486CE47426911000A3C9342FBF29A1B56D1BF70A126385899004066176CFC62D6CDBA8BDABF873C1B76C928C16281576D8EC953B356C", + "identity_type": "provisioned", + "iv": "DBC1EC47C39EED7FC5BACFCBD3E50F33", + "key_seed": "119A29D81C336C1450B9A52B08D5FA1C82BEA2F7EA53EADBDC786F17EA5174EC", + "metadata_key": "A11144C257937AA9AB72AF4D400943AE", + "section_mic_hmac_key": "77495025D48B3D4BA26ABCB62AC9489A8CF1EEEA8540E85B22F44F6F70302EBE", + "section_salt": "A3C9342FBF29A1B56D1BF70A12638589" + }, + { + "adv_header_byte": "30", + "adv_salt": "7CB42CD67E6B64297634ED57EE9A84FC", + "aes_key": "80748A341D96F6CF336DF1A491AB1DB6", + "data_elements": [ + { + "contents": "96DA066AD9185B22D2E69A26F2D47377", + "de_type": 529 + }, + { + "contents": "8C54B317A75F31CF50FC60B0FC7E1BC16E", + "de_type": 943 + }, + { + "contents": "63FB812B761B5EA081E0E7743F2BFDCFBCF360083F3C46", + "de_type": 638 + }, + { + "contents": "26", + "de_type": 4 + } + ], + "encoded_section": "7A90132D1AB37039B085A7A9C70BE256B8094A9110001CA7C89408F3F729EAFB6FF60C3AFD049004AE29327125D2A449F33B1E6A8A7AABF9FF1B96CCE102DA7B3D0D8F9F828163A7D7BF775250D2C8EBD9C2DFE30CBE79A1AD0F5D3F40868351D67A6D0D4BDB8EE0408FB6E59CA2C19EC94D81A05DC10B685D26B4", + "identity_type": "provisioned", + "iv": "14C33DEE0CD9255F91CB3DB918642ADD", + "key_seed": "E0C0046701BC9386E772D494429939639AF9845521C2718C1ADCC28BACDBFFBA", + "metadata_key": "B16130046B39490E2360E8249AEBA2F5", + "section_mic_hmac_key": "77D4D3388B0329728C3D684A0513235BFDF00100185824A42A29F1833081B293", + "section_salt": "1CA7C89408F3F729EAFB6FF60C3AFD04" + }, + { + "adv_header_byte": "30", + "adv_salt": "D3B33E595721C50D2105135754F892D4", + "aes_key": "6759279E5AF9E480F163DE933C79D7CA", + "data_elements": [ + { + "contents": "5A", + "de_type": 459 + }, + { + "contents": "876A88BB07E3", + "de_type": 919 + }, + { + "contents": "650357", + "de_type": 366 + }, + { + "contents": "3965C8AACA7BE822FD421DCDD5416DEF11A5ED", + "de_type": 182 + } + ], + "encoded_section": "609013E4263C83FBE154EBE9B418C8E1F92A2E9110001C68B664FC0B6735A00A9C32DAC328FE90023E487DCF351F9A4B55726B5324627617478B27454D994520BE41E126B4F0FC225770EECBCE400FDA160986F267A97446F5EE178DB730669B5C", + "identity_type": "trusted", + "iv": "FC06614343EE9CF8E5A4D06EB3594318", + "key_seed": "5F6F3840D07D9C758A5D3FA6CF48325B79DCA9357C30DEA1E35AD885916612A4", + "metadata_key": "7C701457BE076B13A91CB3033AADA84F", + "section_mic_hmac_key": "0964A5F27C3EE5BC3CB8DD22F71FCE6F30C9B15BB4DACDF2D04FC5EA4F909881", + "section_salt": "1C68B664FC0B6735A00A9C32DAC328FE" + }, + { + "adv_header_byte": "30", + "adv_salt": "C4A0B5B35DBA6225783403F4DE018659", + "aes_key": "473B79E267C0D84E4412A4093255563D", + "data_elements": [ + { + "contents": "33B53C95303F25", + "de_type": 993 + } + ], + "encoded_section": "419013AAFF2B02E2B22C8C7AB49138C7BBBD129110000517504587FC306540BE7FE50F18898F900444C2F40376DAC920EBFA282D8EFF436D9A36B53B58D5BD48ED08", + "identity_type": "provisioned", + "iv": "7CD1649D9693811DA48B34243B254D09", + "key_seed": "FC839072ED4097D2EE824442D37A0F95B80BE907398E946F0085ACF1709B5013", + "metadata_key": "F62052D0301C5441B3A568D4294A8523", + "section_mic_hmac_key": "282471379DA6B963F2436B4AE2C5FC3348826856CDC1FB0F8253115B208F8B2D", + "section_salt": "0517504587FC306540BE7FE50F18898F" + }, + { + "adv_header_byte": "30", + "adv_salt": "93CC5E3BEDD29966EBFE44F20068ABD0", + "aes_key": "0E7C22653A3C4E73E38247BD04BBA53B", + "data_elements": [ + { + "contents": "AE8F1926F17DC55FDA14D4D112FF57872DCE3C90D5", + "de_type": 532 + } + ], + "encoded_section": "4F9013DD23F4E8CEE064993278A409CED7F59D91100024B889D2BAC8DFE8490B8DB914A2C6179002B9CCEADF1CCCE30FF715B151BF3376ADBA9A4C086F89C357AD894C88A85EE085EF3E4A11802A2A78", + "identity_type": "trusted", + "iv": "3EC81F59D1FCB6D4F75A7027CE96B1A4", + "key_seed": "0C290657B22EAA068CC79DE1762BD7AE049F34DC9801C029C183C20B7641E2C3", + "metadata_key": "9D8BBD240583337C47347E2E3527305C", + "section_mic_hmac_key": "C8887D8C621FB6A6FDFB0BCC033014D68EE1D6E4B3587EA4BE7DDE9F3981C430", + "section_salt": "24B889D2BAC8DFE8490B8DB914A2C617" + }, + { + "adv_header_byte": "30", + "adv_salt": "C5CBBCC948D1D87B9AFD66807377E695", + "aes_key": "8A9C73FDE45E8AACA4CD44F6DD70418B", + "data_elements": [ + { + "contents": "9A2BC2BCFEA2", + "de_type": 48 + } + ], + "encoded_section": "3F9013A5F912E862C431DAFC9EC3B5E8E7A958911000F7F65F4A4F260B1A6FEB1A59AD18C1139004F28E1460E2D4086FEF3182AE2343658F4D6A362C6F3D7A3E", + "identity_type": "provisioned", + "iv": "2D897492AACFDE004CC854FB0837712C", + "key_seed": "7EA6A1B03842D637543676B12E61F6D9F1C60C9FE015E30D53AEF8D698F317C2", + "metadata_key": "EB718446E9F62D1D5E1C71FE9DA626C9", + "section_mic_hmac_key": "3B4CFB52E8711CE0B1154C45AD7C1A05C36F26307463C4DB5AD8A584EBB74487", + "section_salt": "F7F65F4A4F260B1A6FEB1A59AD18C113" + }, + { + "adv_header_byte": "30", + "adv_salt": "65A047E0391416283B7306BDCBD0DB41", + "aes_key": "E5AC27A9E1CFD23C71098444F5FEAFB6", + "data_elements": [ + { + "contents": "FE46A0590767816BEBF65CD0A06F0248F6060C86C6552155942B12", + "de_type": 53 + }, + { + "contents": "04DB45", + "de_type": 573 + }, + { + "contents": "4120206B315914CFE259150DCC0643146D86", + "de_type": 269 + } + ], + "encoded_section": "6F90134653404B3A826DA5D63380AE51571889911000434EDD9F18AE06EBB1887589C846F4E19002F724DF5E9B4A15ABDD0C93D42FBA6E44D5B0C564A2364B59B4F8AF594071B81F429CEA6A6A97D2808C57378A1660A528C7813D9FE4AF8E6A8A82C2F0EBD3CF4D95E4DEBF15C2EB22", + "identity_type": "trusted", + "iv": "940185F0052AE8B5655BEF6A900141CE", + "key_seed": "725E4D87BD5610F4BE9F424729C7BC6F3B89C7A5FBB5FB976A405BAEC28865C7", + "metadata_key": "5529FCAEF9E42680CC37BCF7A52CB571", + "section_mic_hmac_key": "1072211CFEE4A9B080F5CE4A682975C8C702B0D25FFB50ED39673238EF61AAD6", + "section_salt": "434EDD9F18AE06EBB1887589C846F4E1" + }, + { + "adv_header_byte": "30", + "adv_salt": "11B8A815C96272426FE670EBD95F2A74", + "aes_key": "9CC50A2EB9DC906838B319D6F635B290", + "data_elements": [ + { + "contents": "CF8CA8F97258BDAA03C9F47FE93C73628555F7B7188DD071", + "de_type": 863 + }, + { + "contents": "50DDF94F9A90AF06402A8EE4E5E0440C068557", + "de_type": 140 + }, + { + "contents": "FD530CD016", + "de_type": 560 + }, + { + "contents": "3EC44909478F", + "de_type": 565 + }, + { + "contents": "9322306E45BE", + "de_type": 259 + } + ], + "encoded_section": "829013111DE9F4FC976D1FCB172FF6475BC43C9110000DA35B02A62A0DFD3EEEF6F0C95B67169002D299BC5DEACAF00803395A88EBC7286257F4B34EED000A0D84C2B5697992CD343E351FC180BAB101781C0002BEBF9FAF4332F2D568B6E928BD2F3C990094FF1EF912B8EBC584A544FF6D769A320755F673C8F82964AE77516FB951", + "identity_type": "trusted", + "iv": "8AAC6F64AF5CD7541A317ED78BDDB48A", + "key_seed": "BB9F80C0E138923EBB663EFC182D0643EB8B9C4A58A98D58C3837AACBB2752C8", + "metadata_key": "F9A2A06EB5CAF1152BF79B6E21E842AA", + "section_mic_hmac_key": "4095220E1316503E17A6FDE2D4E6CDF34BEFC40685288156F7446D5068CFA9BC", + "section_salt": "0DA35B02A62A0DFD3EEEF6F0C95B6716" + }, + { + "adv_header_byte": "30", + "adv_salt": "2A4808B2F62685B5F55475AB574E7E26", + "aes_key": "AEC76AC229D0DE42E296D372873706DD", + "data_elements": [ + { + "contents": "A8CBB6C27EE05402885DDF07B4B192AA53C304C6", + "de_type": 822 + } + ], + "encoded_section": "4E901339AEC7384257FE89C3AAEB488B1E2D289110006ADF613C2421616F31B9639D876AC2B99002EFD645D79149ABCBBB2BAB3C0B00BBD1720EAF50BC23D78FA75B236C51B304C40863AD3FC62F6C", + "identity_type": "trusted", + "iv": "AB8EB79353453909672FF436216919D1", + "key_seed": "50201DD1C8E2AC7B1A62572253D3B22E09BC1F9ED9B3B435CC4A4C3A654771C8", + "metadata_key": "BF749E18C5E02BEE9705A1E2A8EDAF8E", + "section_mic_hmac_key": "3DC9AAA970DB8BF9EDDF51BC73AA81AED4227BEFE5B4FB374D33464C9B1C845E", + "section_salt": "6ADF613C2421616F31B9639D876AC2B9" + }, + { + "adv_header_byte": "30", + "adv_salt": "1F59D9660522D8FBA3B16883F70F11C9", + "aes_key": "370A64FE5AD9B1FB602447BF4BF9D514", + "data_elements": [ + { + "contents": "F67DBEA2F3E590F21C3A313915", + "de_type": 734 + }, + { + "contents": "7E112C", + "de_type": 336 + }, + { + "contents": "56D3B96A1D91F0CF57", + "de_type": 138 + }, + { + "contents": "00EE1F", + "de_type": 336 + } + ], + "encoded_section": "5F901339F817C69D4CF580D378EE7E242984BD911000A71C128E5EBBB0E4FDF891F77639D1E490010D5F79F998BDD9BDF1F7BC2EFECC5EE2F9F994830D2FBA0C803101745C51A41E07AA18ABD1312F3D56CF58841BA20A60D7FE34E36DB0F27B", + "identity_type": "private", + "iv": "B092FA4BCCA953F068CC959747D83639", + "key_seed": "692463627EBDE72CAF060DBA5FDD40E032568C3B81C9DFE4B20DC148D32F7035", + "metadata_key": "71DF47545B930AF7861785B2A0519571", + "section_mic_hmac_key": "9FDD7949219C0824705B41969A6B0B39564EB3C376A443F740F9F3983CD9B3F4", + "section_salt": "A71C128E5EBBB0E4FDF891F77639D1E4" + }, + { + "adv_header_byte": "30", + "adv_salt": "BE2BAFF188D27B3DEBB76D55424CF7A8", + "aes_key": "11519220C41A2431E087DA954F82DD2A", + "data_elements": [ + { + "contents": "AC894032C14D4442280719211CDA8F42A8FC90497439B5A14529", + "de_type": 146 + } + ], + "encoded_section": "5490139DD2CF23FADFFE0C94A6E8E327F720A7911000B38B64D0469A8468D3CAA65B8BB04228900224C6C7A8B2C73344F312ED7FCFF642112C0E3F95526AEBB29729E203C85BC3D9AFCF3050772AF4D320820A0883", + "identity_type": "trusted", + "iv": "069FD992E0C1DE2F9D197CC3D0342099", + "key_seed": "FD4AA1F19FAA7BC4F26ED6AF2153079A6D9F6BF4F144C95E609947E620E07BDE", + "metadata_key": "C092C09E74DAD832EA8DD576E23BF873", + "section_mic_hmac_key": "F721743C7C61BDBC19597A30DF414CE7EA3D9BE816140712FC23440F473F1DEB", + "section_salt": "B38B64D0469A8468D3CAA65B8BB04228" + }, + { + "adv_header_byte": "30", + "adv_salt": "77549089D6D3867FA06DA36615503637", + "aes_key": "AF5B34E65AD38943EFBCC3B3870CFA0E", + "data_elements": [], + "encoded_section": "3790139B1BECE4655A5CB45B6D3A30BFE6730B9110001F22305A25CC405B049D1131AA3B46559002410D700D2FE5856E61E834BADD1FF8DA", + "identity_type": "trusted", + "iv": "5714AD90F45BAD10E57F8C79C0D16BED", + "key_seed": "71F4BEA99646F1706EA4A84397EB43CE6B44E381874992EF972617EB640B3A36", + "metadata_key": "53A2FBE800F5224390B2F5417E7F9C1D", + "section_mic_hmac_key": "600452BABA57916415DF1C59CEC4E50D72E1BC14B9DBA7842BDC4A3AAAE81384", + "section_salt": "1F22305A25CC405B049D1131AA3B4655" + }, + { + "adv_header_byte": "30", + "adv_salt": "AA4A1FB44833A27A2820C26ED4EDA010", + "aes_key": "C1F9AF7702938F9DADD7257B4478BFAC", + "data_elements": [ + { + "contents": "7AED34", + "de_type": 407 + }, + { + "contents": "7784760988FFAC4996", + "de_type": 189 + } + ], + "encoded_section": "49901306DC71C77895654B6FA9840DF88823F5911000026B34871390A27E60707AA4CBEE91A190025B45B3472ECEB8587465A76CD0C08AB383049E0E095AFE3EA26DB78E9DD412A1E1BF", + "identity_type": "trusted", + "iv": "4883588693CA0745A10C85CF49823C55", + "key_seed": "75295A1F3E2689CA79744BB328404DB873F3C4BDECCE9FE9C2781494B59D96EB", + "metadata_key": "4F1AC34364D0257D3CA00300DFB1F1F8", + "section_mic_hmac_key": "AC27EC75005A294F6A63263B6B4B15981A6FC481B65646FF315A9FD7E1C72468", + "section_salt": "026B34871390A27E60707AA4CBEE91A1" + }, + { + "adv_header_byte": "30", + "adv_salt": "078DDE8D05FD1B537A238D6645219040", + "aes_key": "2766ADE6816F4045B273D4E1CBAEF9E5", + "data_elements": [ + { + "contents": "6EBC1F8D58C1565541E9F64D5460BB5C0A95ED1DFC9E29FBBB", + "de_type": 808 + }, + { + "contents": "3135E9387E084FCC35B173C0E9F9AB", + "de_type": 347 + }, + { + "contents": "DB92249A54ABB93E6797CA85039FA215647FB4", + "de_type": 21 + }, + { + "contents": "79288DD2716427CA78A9194491", + "de_type": 721 + }, + { + "contents": "73EDF5", + "de_type": 529 + } + ], + "encoded_section": "90901373F65B3C85D86824F42F83B84048C6229110009E38512BAFDF12A3783C75D6C694F62790015B99A08B9D7A88AF8172BFBEE70CAE42260C83F0F60F06B79C125D77323EB12D7F5FD27ED9B916562485B9C9DC9E2DFF08F5B19FCF7CF8CFFEB6B99D95AB5D5EA00384953D3A053681FA63BB86B565B479EB49282780CE91FBA3C2976BC7F7B945BCC3E8A59A6C7F55", + "identity_type": "private", + "iv": "EF43F76400A48297E2B662EDDF34027C", + "key_seed": "4EF8A2BA84737FB0150841C23EC25D43C47FF933FA9AB2C5927D5B507C87EA2D", + "metadata_key": "378AD8906BDB267835B3C09C96A19575", + "section_mic_hmac_key": "A7C12070CDA75EBCBC890C8F85E21D6069C91006B0350065806CC188E5409CCA", + "section_salt": "9E38512BAFDF12A3783C75D6C694F627" + }, + { + "adv_header_byte": "30", + "adv_salt": "95BE8BAF31EC4BB917CC3A2C7FB03DD4", + "aes_key": "212A4DB3EDB93B86E38661EAB32D3899", + "data_elements": [ + { + "contents": "", + "de_type": 657 + }, + { + "contents": "46CD03FCCE18F7504C5C855CF189298CB67858A974ADB18500437642", + "de_type": 190 + }, + { + "contents": "3676B5CE1A207A", + "de_type": 142 + }, + { + "contents": "28383F354FEADE799572E4D15C96B4F6F0", + "de_type": 145 + } + ], + "encoded_section": "7790135ECAF5AAE1BA1C64EE01424B51C2867D911000CDD06ECFAAA6F2401AD94229ACCA991590048D658DFC9B60B28E0997C8D85E975BA9D0B823487BA20A7C004379A82C97193F06260554E7B6D51C198EF01120BFD7284EC9963828D910D83D90812C2772E3357505FAC4036F483231B41124A3A8DBF2", + "identity_type": "provisioned", + "iv": "4B39E2AC421BF39FF32CB77ADA2A7923", + "key_seed": "653C200BFC98321AF11AD97638B4088CDF44F10D20996A2E39B6AA52628D81E0", + "metadata_key": "9328E95CDBAEB26EF1D330AB07A34FEC", + "section_mic_hmac_key": "10D58DADD334BB6D030EC8703174E882455E4C6626AA29BF6032013EB5CCAC41", + "section_salt": "CDD06ECFAAA6F2401AD94229ACCA9915" + }, + { + "adv_header_byte": "30", + "adv_salt": "7A7BC9104E4F6277DB44B83EC568D7A2", + "aes_key": "1E4B737CF0D3DE9B0AB7B23C62E19000", + "data_elements": [ + { + "contents": "82C5DC605CC0B0C534A07204CF6EE9800C258F5876A2BB4D67BE97FA", + "de_type": 53 + }, + { + "contents": "0BAA5558", + "de_type": 865 + }, + { + "contents": "", + "de_type": 15 + } + ], + "encoded_section": "5D901316F449431385886874B56F21C6EF076D911000CF9BB4939F48BC5B870C1274DB7FE0EF90029BCFE0E6FB66D97C97B97146DC9923FF872C1C82F9E6D58075046BD6EAAC9BC620B1087C9766192D38AA2B9B02D703637EF7434C1F95", + "identity_type": "trusted", + "iv": "5EDF27336329967B430B8BBC6511B3AF", + "key_seed": "6EEA708F4D7A23E95A290D0F7C7C2C1FABCCB06E2BEDDAB673FCF52531CB9949", + "metadata_key": "D58071E30F1F4F280A52547C0D940B6B", + "section_mic_hmac_key": "748BB640722F4197BE2AB67B25D10B13D0463BDA9651A7A09D072B29B678034B", + "section_salt": "CF9BB4939F48BC5B870C1274DB7FE0EF" + }, + { + "adv_header_byte": "30", + "adv_salt": "6B2784661C35BE0A3E429A2C6964C55C", + "aes_key": "B7A7DD23E0BA11F990A724517482CDE2", + "data_elements": [], + "encoded_section": "379013D9B173EADBD3B3B83EFDA96221945EF591100013800CD344B3A2AE1F5013E1DFAD3CB090046474715969917E830F5BE55D47CFF831", + "identity_type": "provisioned", + "iv": "4A91BFEB38EDE9B000D0E68B1789117C", + "key_seed": "4272E95BD5A3F9E55FCAF98D88C776F3F43860BA57169089F0F43923F9743AD6", + "metadata_key": "D5513C47ECE8FC6A0544F3F67055C101", + "section_mic_hmac_key": "34C33FCC3774716A479B5A1B646C375BB563B045C8E1B020594E0C6CC637B402", + "section_salt": "13800CD344B3A2AE1F5013E1DFAD3CB0" + }, + { + "adv_header_byte": "30", + "adv_salt": "129B711CE9903C07E3C79E0C66953083", + "aes_key": "018DF0C4092B2887012CC0E3FA06138D", + "data_elements": [ + { + "contents": "36166C05E659A86C25318FF5", + "de_type": 486 + }, + { + "contents": "C9113E4284307544D5452CF918", + "de_type": 207 + }, + { + "contents": "113DF414AC6D1ED5005B46712D2C585BDC195F836C545B4C9D63B8E3F7", + "de_type": 59 + }, + { + "contents": "DB7FEE8E34B1106ECFC83CD95F05", + "de_type": 278 + } + ], + "encoded_section": "8690132D01834FE1F90892354A8D60F469D69A911000723A408BDAF7D502315A69861DBE19359001E5557F8FFBBA84A06E145068D2B755EF7C628F44909A90F69A26ACE41CC47C7A5CDB5ED9276B167EAAF20B92CBE3FDAD487F587119D70BC069CFB0709ABEDA42D6C799F4BAF2A0FE359CC18BC2C8CF16937F30BD382B6D5EA6590E94366134", + "identity_type": "private", + "iv": "A804F89694F4348DE72BE6DA40146DE2", + "key_seed": "3A3D0F62E7DB4E7B35A2BED010905C168A5BF029F93487B4B70FE06DBFD8F336", + "metadata_key": "6A4DECAE9A088A4100B25933DE8CE454", + "section_mic_hmac_key": "965B4BFCCC2FB9473AB9E3BCC41A5DD7C74311C9A8E54F6E59D7644D2686388F", + "section_salt": "723A408BDAF7D502315A69861DBE1935" + }, + { + "adv_header_byte": "30", + "adv_salt": "E0CA1AA3AF1191E3819741B3DEFFAFDE", + "aes_key": "1D5E8EDC48783BA37E4B1799FABB4ABE", + "data_elements": [ + { + "contents": "7FDFE51E7ACA9FD4E4D768319A58337D53CDE7B59C0C13D39C91", + "de_type": 315 + }, + { + "contents": "066D6DC387C291", + "de_type": 697 + } + ], + "encoded_section": "5E9013C567A94B8DEB58041FA6003F6984B55E9110004FA8AEFE32E28F03CA08C323146179A8900481AB869FF38C4A4AC07EBA8593D4078D298254845195108E6EDC6A46E534309A92E2C2EE6B7E585F2F80192B922F7A1B1E27205153D5A8", + "identity_type": "provisioned", + "iv": "1A49425E07C48D0C622000F534815E10", + "key_seed": "E3A4AC9730A13980D92CD512ECA0E6FB9C005C05DD4EC6CF1B16AB10BE9BF0EE", + "metadata_key": "6EFD60E02792E27FF514484A55667047", + "section_mic_hmac_key": "D1E5D811FB30478207868A6B7F75BC379740BC5FE2D67928A9BF1C27287F5729", + "section_salt": "4FA8AEFE32E28F03CA08C323146179A8" + }, + { + "adv_header_byte": "30", + "adv_salt": "4370155ACF139B1128FB84304A5528CA", + "aes_key": "2F204AEAFF274885B403599787146CFF", + "data_elements": [], + "encoded_section": "3790136E72A2B54E54872677EB0711B10EC0F6911000CD2155E85F2D8011E7CC8A841B84663B90043BD0BFF11972D8A321CC2FEA6CDD5D3D", + "identity_type": "provisioned", + "iv": "5899873C8E3AA02A04117D7944F99F79", + "key_seed": "9117DBFBC2B7828BD194A841123189D3EFAE7883292BE6D930D5DC654DE163E6", + "metadata_key": "2A711976FD8AA71BA52B4E0C159B57EA", + "section_mic_hmac_key": "E62B18C7ADA86D2F488DFEB4F44226604EBB71CA197B52611CBC971436E4F416", + "section_salt": "CD2155E85F2D8011E7CC8A841B84663B" + }, + { + "adv_header_byte": "30", + "adv_salt": "E1396C2167C2EA23035DDE7F637A22E7", + "aes_key": "DF1174BCE2216174DB0591EF868BCC00", + "data_elements": [ + { + "contents": "C47031946FBC56732583D99C55B6E1B7521BF87FD7", + "de_type": 142 + }, + { + "contents": "BE62881EC8915D5545B185E4", + "de_type": 854 + }, + { + "contents": "847F051E569E3050817AE714F1CFBC836A", + "de_type": 460 + }, + { + "contents": "F5A734560E04909565F8EE8D110FCF79CCE8441355DB69E248324AC1648B", + "de_type": 674 + } + ], + "encoded_section": "9390137EFF576731E303EC0E67FA37528CF42D9110009AF304AEC06D6F647D0A6E7F9496F1EF900287E198A1643D026A2A57FB2CC6BB455BD96E7BFFA40AE2E0F9BFEBE079F650D4D224D6E94A45361D5E07FB6B1F607E183CC2740C4219AB4C920CF3E07894945D049586FF2C414ECB417B5A09BFFF01767922EDE5660AA194C03678B4956DF45C18C6D98272A2E20FA9C89F2B", + "identity_type": "trusted", + "iv": "2F57A532E27C6BB9EFAADD309841DCB9", + "key_seed": "F1B9E7ED359076DBA893F8BCCE52A92DED14DBDBF49FF9AC463049AB69D6E69F", + "metadata_key": "C2681503C3157A0ECA4ABF5BC029ADC9", + "section_mic_hmac_key": "2533F7CA4EB0FA17F8F5EA530CFC482EFDDF3E7E17C7634BADAF773AB0FDC314", + "section_salt": "9AF304AEC06D6F647D0A6E7F9496F1EF" + }, + { + "adv_header_byte": "30", + "adv_salt": "C033469A194C17D236D3799F6F810289", + "aes_key": "D583C2344A2A9FFFA466F6636DEDCECD", + "data_elements": [ + { + "contents": "ED3C30FB7E039894503CCBF3372AE73F62E6BA062DC86BA80D5C", + "de_type": 321 + }, + { + "contents": "56A50CF71ECD4A4D6F8C657A3ED1044F4EB9E8ACB5B67928", + "de_type": 329 + }, + { + "contents": "5C249B18B1A02CE7C5E369D4768F374C94F96FB97EF7E20C566B", + "de_type": 781 + }, + { + "contents": "11914865B2C8E598C7ED5BDDC4009B7552F7B8", + "de_type": 392 + }, + { + "contents": "5E8574C9496DB164C59CBD836C60", + "de_type": 421 + } + ], + "encoded_section": "B39013058AE9E776265CFBF3FEA5B70CE54268911000FE248957483BBFB171D44B82FFF83FBE900179E4BBF07C901D822A2D5DC2540F5D6B7B32E8150931481CA5299DDFCA680E80EF5554527CF0BB2A857809C703A7594CF02E853D3A713F1C5729A4B37493F64998A0DCD4526C5E1618DE6D16B4307D7843DCFCA192300FF4756FC138BA4B2E157A6D2B5EBEC21DB497053C9717F18250C715CA28DA39F9C1F0C0FBC213AC70DC09308014136458565B01A59E", + "identity_type": "private", + "iv": "2BB4BDD29DAC7BF3D31AF7575D4373BC", + "key_seed": "82E084D15CD7B6C70978DE7DE19596B673CF3EE29A36A32B713496FD67F6F0A7", + "metadata_key": "ABF22A200F57CB114D5BEFFD477200A7", + "section_mic_hmac_key": "95AB213F52D4E447B6FA5CC544650DDEFB78F285502122175C2F5A103EAD2243", + "section_salt": "FE248957483BBFB171D44B82FFF83FBE" + }, + { + "adv_header_byte": "30", + "adv_salt": "D9B6B1F0A69B7B9FE27E8F80069567C0", + "aes_key": "C84D0EFD9E47A5D90640A9D7088C5021", + "data_elements": [ + { + "contents": "09E6F8330E760D01400A2CFA", + "de_type": 572 + }, + { + "contents": "D2B4", + "de_type": 911 + }, + { + "contents": "761F7E", + "de_type": 72 + } + ], + "encoded_section": "509013BACCDFD8DB04ECC45DA02B6F1463200C9110006BE4250FD8E960F073C28F3C812DD785900480B27E5A6720404EDD1A03BD7FE9ED984422FE604E77EFA797683D4C65FF1848E25775431C5CBC0D0F", + "identity_type": "provisioned", + "iv": "568C52B6699A1EFE8632D2AA7CA08F1E", + "key_seed": "D80152B000A2814B443ECCC3D861C7480435D9A4AE7C76B354627BE49B903022", + "metadata_key": "235F082A46F70C6D07D056CD8302E590", + "section_mic_hmac_key": "77249D32B9918E829AB8EE9AB7F1690521BFE9444D8E1C6631D0F3CA0E7A97B0", + "section_salt": "6BE4250FD8E960F073C28F3C812DD785" + }, + { + "adv_header_byte": "30", + "adv_salt": "9622F4D79E9333730B78B9BC45D018D8", + "aes_key": "EBB969EA5208D59DC720981E0D7165B2", + "data_elements": [ + { + "contents": "8910331A35E52B5CEDF5475C", + "de_type": 49 + }, + { + "contents": "C44C8D", + "de_type": 1000 + }, + { + "contents": "58AA13", + "de_type": 182 + }, + { + "contents": "FFA1715C6158", + "de_type": 988 + }, + { + "contents": "C738C7E2", + "de_type": 195 + } + ], + "encoded_section": "6190131EBFEC19E821203A81CBA5997277B45391100018A3D32C6D68ECCE86C2636223BC415590041D5D7AF03942C18470CD2FB24DE76784722AD38725E712ADBDF3C681731E6A071438027266CF94D0DCF8B6977AF5EF09433D569ECD90BDC280C1", + "identity_type": "provisioned", + "iv": "2E0E4A900067722E740C48782D2727F4", + "key_seed": "34CA6A5E14C31E2B58FD467CA282371F135FC0E6488219FEEC3D194361416ED3", + "metadata_key": "1534AC915B12F7B14CFEC07E905B70B4", + "section_mic_hmac_key": "D1B3305F817AB4E6EDA0079FF3B8CA3E7466641381F5D38F31D4DD6336A97C42", + "section_salt": "18A3D32C6D68ECCE86C2636223BC4155" + }, + { + "adv_header_byte": "30", + "adv_salt": "B456A45D23A5C23B3FC7D4FCC2E17915", + "aes_key": "0793945D13EB6A7D4F00A59FC158C557", + "data_elements": [ + { + "contents": "AF", + "de_type": 339 + } + ], + "encoded_section": "3B9013DBC90F36C9F1FF8E9371E022326D96C8911000D1988E9F53E270167134FE84104498EE9002A2C66A9C2629C64B6F3CF8EA1BD17FA32F63DD11", + "identity_type": "trusted", + "iv": "B44C9675A36625470E2D7A5A381596E0", + "key_seed": "5E555C4138D5A22C3A975EF93D7C88FBB90B32618661D9EF2A66B14E19E1169C", + "metadata_key": "81744A6BBE8C683D7D720AF41783148E", + "section_mic_hmac_key": "6E96EBA658E9B9630FC00A38353E4B124102370FD3ED8183ADF0D746326AD0EB", + "section_salt": "D1988E9F53E270167134FE84104498EE" + }, + { + "adv_header_byte": "30", + "adv_salt": "865DB128D0ED615465C4AF33ED747467", + "aes_key": "83F6665949CEA0499C06623CE213A83B", + "data_elements": [ + { + "contents": "648059EC9A6D7DBA28F98FAD7AEEC6532CE97E6BFF447DEF", + "de_type": 114 + }, + { + "contents": "6E640399BB35A3B4306409C94E87FC01", + "de_type": 668 + }, + { + "contents": "A93CB545FAB30A4742664D4149", + "de_type": 830 + }, + { + "contents": "A3232B62A0E5C5AF352A143BAAE7C285A135A7D4EA5D61", + "de_type": 853 + } + ], + "encoded_section": "8E90138829246CDB07510CF107652C06222C6E911000668D1D8BCC2E706445B18633C2B2A6E99002285B7692049B38967A46FAAAC9E3B962F961FE806B1FF948E425BA1A82F01DCC601E4AF2000370385A54669989A6D2845E984A850B9FA9FBB5CEA3A4FFD736DBAF48FB432EE5BB8D3F696604B4E133E0543D383D46966C1D47265E1EAFF9FB5D9EEC945343CBB6", + "identity_type": "trusted", + "iv": "D300ED57F1F0333ED617F9A48A54D00E", + "key_seed": "E8CEAB1757CFB2ACB155DD5BBE2A45EBC383B29CC512CD445BA0D4B323F3D50D", + "metadata_key": "BE82E42542AAED90F4D6ED5B276C9865", + "section_mic_hmac_key": "21EFE7D3CEC8D334C1F5CFDBE2EDD1E3F9B164D8949D629F21348FCFFE479B3C", + "section_salt": "668D1D8BCC2E706445B18633C2B2A6E9" + }, + { + "adv_header_byte": "30", + "adv_salt": "7C9D65E47B5C2E0CFA5E700CAE8565D3", + "aes_key": "9652732429DBDC4E2E1991C0C86D0399", + "data_elements": [ + { + "contents": "603A05EB6CDE557F2181CE8F5C8DE566F7AD9A4EBEB2", + "de_type": 755 + }, + { + "contents": "916FD503DE6BFDA7FB44FCAC3AC2D01E5F9737401235A13BC3965C9660", + "de_type": 197 + } + ], + "encoded_section": "7090134C8A120B8D74F21503A3F4A924CDC7E59110001C3CF25827D6B07C3DA29410FB3E65889001DE17683402ED39894A9F8D8D73A1379C3177626B72CC7E228915BA9E59842F22EC52A4F12DE1C87B505E41B7F197448F7208E9CCDE7B332E7362B1EDDA249FEA891DA5E428BA7F3B8A", + "identity_type": "private", + "iv": "D9839CC6B5FA3B7F43F0359AAB386887", + "key_seed": "048EB4D544BC85B8026222BB3BF8E829BA5A1D9732B000747C831471D8F584F2", + "metadata_key": "98B4B953B6639A1E2E9C264A98BB0247", + "section_mic_hmac_key": "A84D8352E99395F20F3B254C761D0647E4CE0D0F5E731F1F02A32D63F721B4E5", + "section_salt": "1C3CF25827D6B07C3DA29410FB3E6588" + }, + { + "adv_header_byte": "30", + "adv_salt": "396496EE83B2146F12878D5AECFA7945", + "aes_key": "701449FA0ED699CB50D88C55F912595F", + "data_elements": [ + { + "contents": "3D46DBD04F9E743F41453ACAF24A", + "de_type": 797 + }, + { + "contents": "EDA9FF21CF420BB69ACDFCB00E088703575C", + "de_type": 220 + } + ], + "encoded_section": "5D9013ECEDE0D46A9124E3C806AC962EF9EC6591100037B25A8B910D21BEC099277838BE0E4B900425DE05F6E9A7D84E24D37D2F7A4307188B1F1E4086A13339E08BB3FD2EB4347B2C3063C09619BEEB61AC53A22B95FEF1EE53A1B8BCB0", + "identity_type": "provisioned", + "iv": "04D50AADBF5216FEE365473AC14EFF04", + "key_seed": "4ED429772F3805E33E327BF674F122DB7E906C7295C6094808E1E775EE2AC748", + "metadata_key": "F5BB3CF730A57E58B11EAAB014887EBC", + "section_mic_hmac_key": "8B6143DD499724FE80FF2A1CD6186E62D7C8D583265147D222D13BE276EA5B76", + "section_salt": "37B25A8B910D21BEC099277838BE0E4B" + }, + { + "adv_header_byte": "30", + "adv_salt": "7E8AE3C9278DEAAB44A0549F62B2AF72", + "aes_key": "BCA92DE9B6063961D1F84ECA0C7F6C93", + "data_elements": [ + { + "contents": "2CAB785B1AFCD27B65CE80FDD46ED10B10290AB73C307F67EB", + "de_type": 542 + }, + { + "contents": "C74E88BE9C94", + "de_type": 979 + }, + { + "contents": "6DF7B3CD8E17AB4EC4BC118E66622D75", + "de_type": 321 + }, + { + "contents": "23B264B671089BF640B146674E", + "de_type": 287 + }, + { + "contents": "D8526CAB4734644BBFB165AFF944B3DE", + "de_type": 396 + } + ], + "encoded_section": "92901352EDBA6D632939142BBC95D1B5F6F3B5911000BFF4B3C12EE83E3D7E4D8D334B07650490047DD8DD4231311B1DB06638CBB34F60AB25275FFA10D6C82C325EB5607166A808122420D469489946DD0ED9FF8011AA5F665A5BD3260D64248A48EE3C212CF15EF03DB424536E1AB2CCE9826A89CC0F597C747787A078D98D614D33A71AB3BD1A8F06E6A85EAD38875BB7B0", + "identity_type": "provisioned", + "iv": "B2938060C2FB3A233E0B0441629A5D54", + "key_seed": "A9C66A81FA32BF7736824A6052703C683CDAB0690363FEBB064EC5BF5EAE2D85", + "metadata_key": "14F59D0003905680A8E6A3F9F03710EE", + "section_mic_hmac_key": "D34BC3D1F158A7340C574C280BFF773A087BFB40DA47AD5C9D59781A5CD6B9FF", + "section_salt": "BFF4B3C12EE83E3D7E4D8D334B076504" + }, + { + "adv_header_byte": "30", + "adv_salt": "58D90C3496D916C45B1F9629D196FE3E", + "aes_key": "3F254DF7C078D8B9BE085F49D44FCE1A", + "data_elements": [ + { + "contents": "DAAC6DB1", + "de_type": 269 + }, + { + "contents": "20B5", + "de_type": 92 + } + ], + "encoded_section": "4290135841F4D3C484D6F0F42B623604D620519110002E6A604207A7F9600BA8826B040124D29001A9A00D43983AEF2049A5CC3D6139B73A1FC6DF1F28DA3B526D64A3", + "identity_type": "private", + "iv": "A2F7257D7DBBB78925E177FBB9F3E6A6", + "key_seed": "5D9A4B660496D7408099AD3AF204A372D5E1B90B5DA37B518FABA1FC72EB29ED", + "metadata_key": "E483E747549C5E8FF2E43903A508FF7D", + "section_mic_hmac_key": "006E79B19C1D3EB14ADA776B34A4D7601ABF822FD8E69A1BE6F354245E4FEF69", + "section_salt": "2E6A604207A7F9600BA8826B040124D2" + }, + { + "adv_header_byte": "30", + "adv_salt": "2EA5530CA0FDCA0E3D26F54B36C63756", + "aes_key": "C944C8581944D3A7B2145C20572A48BD", + "data_elements": [ + { + "contents": "87", + "de_type": 543 + }, + { + "contents": "624BD963E5CD706B8CEA97FFE4F19FEB72164DEC299F657830EE771F40", + "de_type": 38 + }, + { + "contents": "1F73", + "de_type": 693 + }, + { + "contents": "0E690425BDF2F9697C793C79D9A4B31BA621D37550295D8DEA1650", + "de_type": 455 + } + ], + "encoded_section": "7D901303D613B4D65DBD34B0C37617F6403DAE911000A90775A9B65F4CEC0DC078F9EC5AE2EB900165055500DB14C4C9DF1475CB2947DAC616B755A1DC498623CBD1E5876A143201343233A2795172250398353EA567A343F7545CFF7D0D47CC7FA7C78040C5AD20AA8A802F2D5931EE0C69B984A697B56C19A71AE99BB9", + "identity_type": "private", + "iv": "8CB642644013FC19152A421C7AA99747", + "key_seed": "160F89D53618D964B47995A7DDB753A8A5E48A1C3252E469E57AE50C1CAEB0BD", + "metadata_key": "5CE66B8C2BEE9225C1AB9CC4C80A166F", + "section_mic_hmac_key": "F22F3AB674F0F89BE488643EF7D0AF9B0DC35E89EADE13A9D1563250970962B6", + "section_salt": "A90775A9B65F4CEC0DC078F9EC5AE2EB" + }, + { + "adv_header_byte": "30", + "adv_salt": "1D51D1DA179BF1915279BF30DE1F4B03", + "aes_key": "BCEBEE8528219B39A7950E3D66C9B154", + "data_elements": [ + { + "contents": "50528FD9150AD0773ADB5E08436CAD30C30FDA", + "de_type": 592 + }, + { + "contents": "C44A41", + "de_type": 561 + }, + { + "contents": "561F383B33C5EEBDABBDA184A1A4605A82", + "de_type": 814 + } + ], + "encoded_section": "67901398BBC302C18E49799FA9EEBE11B8FBF1911000C2261F071C3C3CACB7699B63CD49EA1F900142DF2A9BFB0F1A01DEC1A14194866B92A2374755F6DFC853AD50A93FD547E6BFE9FBDEF421A6A18B3D882669EAAE1E4A4C4379BF01D5B44003CA2A66BA38CEB4", + "identity_type": "private", + "iv": "E7FC9AA29E2E9B3025EF3BBF9D18E508", + "key_seed": "28CCFC888CCB929D63843492569B71440F998A36D7F006F7E724F777B5B6EBB5", + "metadata_key": "AEC3202A86B1814AE764DD7C97BA19AA", + "section_mic_hmac_key": "7443E143DD31C1C97B1BF6E1932D9FC76E5796BE5D2B088062FA5958F4E2ECDA", + "section_salt": "C2261F071C3C3CACB7699B63CD49EA1F" + }, + { + "adv_header_byte": "30", + "adv_salt": "B33B26F42720F3F275CAFFE124CD7B60", + "aes_key": "B6BF74F4EA862207D56E4B42492C3CF5", + "data_elements": [], + "encoded_section": "3790135B9259B281BE3914623875BF9E184F98911000C3391346E87D492348FBE56098116AF89002D57C10A9667412E9067FB677AB7A26CA", + "identity_type": "trusted", + "iv": "45217E0F0C06D7B7918C468D9F0CF490", + "key_seed": "175D317E4277BD3F2EDC5F019D5EE8617624648F818058FBA3D605EE3666DC14", + "metadata_key": "B92E7217A6255FD283368724DAC465DD", + "section_mic_hmac_key": "CB3E7306030B4707AAC625998DD40082CB446835BED1A2B78DE401CAEB39D842", + "section_salt": "C3391346E87D492348FBE56098116AF8" + }, + { + "adv_header_byte": "30", + "adv_salt": "872CE0191545242D5BF00528AB6C7091", + "aes_key": "8032D6560A386D2B603442FE39BA3C7F", + "data_elements": [ + { + "contents": "629E6EF672C12AB58DE63B36856CF2EA31E8B9AB20", + "de_type": 508 + }, + { + "contents": "74C4F6C190C2", + "de_type": 354 + }, + { + "contents": "53C627E2262407A36E657CB2D4BE0F4254F68754752D7F76EDEA38BEB0", + "de_type": 585 + }, + { + "contents": "9FCFCD14189045E1EA71527C23E0", + "de_type": 36 + } + ], + "encoded_section": "889013BA20D5744F0A5B0D208F3FE3875B284D911000FE0E258981EF48CE93EBC213AF3008509001345EBC4DB96528D67C20FEB41E9D7546D0146497B05D4701A172C2B41AED376F0450242A7F99BE6C14749DC04AAD3C3F2FA1E2531C1B7723D1D8651D0360252A83CC256B1001FB12EA9977FBF620BF8D461649F3F0171A3A457F84660A0B61CB9F", + "identity_type": "private", + "iv": "B31619F16E2A96F0C1834F1CD39193EB", + "key_seed": "9B06F9933F5497ED81E7115DFADFC68121B611E0AEC678B4DF8DD3CB4BAEE49A", + "metadata_key": "5C8F5F80BB667FAD70D156F07AC0C375", + "section_mic_hmac_key": "98FAC07C93E48317E374F2C0AA92E9794BDCE4C9323684D245EF332F0A032D28", + "section_salt": "FE0E258981EF48CE93EBC213AF300850" + }, + { + "adv_header_byte": "30", + "adv_salt": "086B1E981485B9E1899F0EC60EB9E83D", + "aes_key": "AE86A76940D9517BC921B369256E4DDA", + "data_elements": [ + { + "contents": "E0D97D47C6C09CD6A1DB96F46DBBD02BB351713DF1F2B0", + "de_type": 882 + }, + { + "contents": "FC3BD546F065A256DC995A5FD110C59F231A47A65CAF7020C7D582E0E6", + "de_type": 867 + } + ], + "encoded_section": "7190130F2D843A93FC1F1CBBECF81D2A1C6FC0911000495249EE8F8F7ECDCE556774EF54D8B590045C25EAAEDA1187C4C0786320BB35C0FAB443CF096A783348E054BD52DE5D813AFFC6E9E04F9119B64BFDF45ED2D9C410CBDD53B9E6B0056F89AEEAC6702F71FF0F1A03E872EA10D42028", + "identity_type": "provisioned", + "iv": "15CA63A0FB423A4345E9E1C6B9A5702F", + "key_seed": "3DDFBC62D50D8068946200951BF0019D32100459E073453DCB6AD714BBB239B8", + "metadata_key": "88E6A925FF482DFDBEF5286BE14362E0", + "section_mic_hmac_key": "C0AAF2B1691A87BF9585A47B1C43F73D15657247D75AA873CB27DC2717A16956", + "section_salt": "495249EE8F8F7ECDCE556774EF54D8B5" + }, + { + "adv_header_byte": "30", + "adv_salt": "4AA9E6490E510E2078D1C0C3C39A8FE2", + "aes_key": "00B42CF723FFB9E400D6E279979133A7", + "data_elements": [ + { + "contents": "7EDDDB47C2233581E9E08E", + "de_type": 172 + }, + { + "contents": "29FF84", + "de_type": 411 + }, + { + "contents": "465EEA463E31B716E8F836EF7AA2F4F3841FC0DB6397C2", + "de_type": 297 + }, + { + "contents": "E547C85EC74056696A", + "de_type": 916 + }, + { + "contents": "115F4417", + "de_type": 682 + } + ], + "encoded_section": "78901348721D68E725F93B39C9A8583F2A65179110000941A104B100C80468194C862B7044DB9004D6BDEE7AA257D998A85D7415504BF0A40A6748CBF0B55C1EA5F7D5D2B9D0D48052FCE5A679E9BABA967262CE798ACF31397983254EF161DCCAC8789DFD88D052C33592CA3682E9DC143104E4506C0CF0F1", + "identity_type": "provisioned", + "iv": "F9428E5DFFEE82FC83DA408FAD488BA6", + "key_seed": "DC69ED874663A6D1321BD38B4FBDE1469EF8033DA98BFA2ED613C62BDEAC381C", + "metadata_key": "EE6FDA87A6449B99DB62777CDAB5A388", + "section_mic_hmac_key": "E227F098FB6C323970409D263B84AF7F8CDB64BA4D5F13DE8AE304534DE8B2A1", + "section_salt": "0941A104B100C80468194C862B7044DB" + }, + { + "adv_header_byte": "30", + "adv_salt": "AB93EA96A6733359BAD13F6BBCBF7B61", + "aes_key": "A52EF583D412622DA1C23480D23A385D", + "data_elements": [ + { + "contents": "29DB99B161DA96A74C67E613", + "de_type": 62 + }, + { + "contents": "714F915FE037AF3F5CB8", + "de_type": 420 + }, + { + "contents": "06F14F79DE3048918C71D3", + "de_type": 843 + }, + { + "contents": "D522C29C", + "de_type": 635 + } + ], + "encoded_section": "679013C6C4FC258307EFA7BCB4439224E74253911000AC7EDAD03EA393EFAE096E5CEFB2CE65900449CEC3FDE6A1D76BAAA872A48CDEC69967A588F62B2BB08A7F9171FAAB1DC49C863FEBEFFCBB817EC29D18DE97FBCAC780743BC6A83E9B5F508B25EC0E51EFFB", + "identity_type": "provisioned", + "iv": "51A074E8F49F530A81C6ECEA74E8CDCF", + "key_seed": "1522F314EAA2926513648D2B83271A75BFEBAAD5387061BE1230F1D8EDC66652", + "metadata_key": "E758C77E18404342F1376AC800912CDF", + "section_mic_hmac_key": "0F67209BF8099626E6B190676AA37C880BCFF6FB3276D2F9E0A831DB10E4781D", + "section_salt": "AC7EDAD03EA393EFAE096E5CEFB2CE65" + }, + { + "adv_header_byte": "30", + "adv_salt": "095CA3F2D80C77F0418F84F670BFE4DD", + "aes_key": "E98006F8F0DBC0CC557E88A28C8BFCC2", + "data_elements": [ + { + "contents": "42DF097BBAED32E65BDAD093BB844FF43E4AC0350B7936287FD513A3", + "de_type": 462 + }, + { + "contents": "856C428A8B8613E12BEDA66CC0B14F80E4AE91625DFB55", + "de_type": 846 + }, + { + "contents": "5722372800A0436D655ABCCE6E1AFC666D996774BB8F5749633D", + "de_type": 434 + }, + { + "contents": "B4", + "de_type": 989 + }, + { + "contents": "17C86D", + "de_type": 843 + } + ], + "encoded_section": "97901310C6A1E0973AA6302F83F5AE781EF3479110009D8967ED6923306F238BB3006CDA188D9001041B76BACDB753CFFBE885494E2B902326FCC7B845B95EB51BF31D16FDB3B8F1A31165528F6B88DC94C53FD7BE2034E003BD25E0258E27874EC2A30DEF2CB678D1D2B3155A6801CF086B3CC55E9777C651643D5ABC9E09397E8760C20DAA9749047403B15F28F2ECE9504BD5E926697B", + "identity_type": "private", + "iv": "8BD95493B557D0D6BEE013DF112FB494", + "key_seed": "37CBFD8DB4C74643FE9E7DB197BCB40CCD42B5F18E9F2B7D992F3E85FA23E11E", + "metadata_key": "FFE4710FD8DE1B837916E1876A10EA14", + "section_mic_hmac_key": "51F1387A1CD7B6E8FA54715C4D49B041B88B1EC083BFE9196EF4C3159ED8B240", + "section_salt": "9D8967ED6923306F238BB3006CDA188D" + }, + { + "adv_header_byte": "30", + "adv_salt": "D627C02EC7A9E006CB069B3BD4087015", + "aes_key": "DE628F5616A31A91575202E224BF8654", + "data_elements": [ + { + "contents": "CE3B7D68CEC6826B", + "de_type": 768 + }, + { + "contents": "4B98C12698675C54D6BFFA3284320DA49C", + "de_type": 307 + }, + { + "contents": "6C472F7D1F024972817EBF5D9CFBFDE075C093A2C147460E4E34407E78", + "de_type": 501 + }, + { + "contents": "01D2ECEF31D5DC0647092519E4B01200DC", + "de_type": 579 + }, + { + "contents": "6E88C150DDC8756487059C8509B830ECE39A6650B9A50E795E96C8E48B4E", + "de_type": 7 + } + ], + "encoded_section": "AA90130868EE3BB2CC54975E92D446C82484A1911000973274E6978EEB00588121FF8F3D27239001954DEF19883BF50F4EC920B26896C66CA5E39D8CCADCEC933FEF576ABBF18F03128EC12C963F80262C6B34F00F850047928D6C145AC20B109AFECB4CF1964254EBCB825846E26C4C1F9D25B68B86955F4AB0C176BB905BCF2DFFD31CB7DF833FEA3BC9FB1E7ACA47E0A4F2469A3DF5AC4A4182C1E20E84EE649F09FDE92FDF7B4DEF91", + "identity_type": "private", + "iv": "6917AB8BD905BB352E8079F1F88931DC", + "key_seed": "DE1289A8ED8D1DF4BDF85AB82ED562ACFFA82F00634CDA0A87DE125DC862B0DE", + "metadata_key": "DB5CAFC921FD2A72293660D037EC29B0", + "section_mic_hmac_key": "DB3248777D235AC436DD5D78A6601B8391D75E9D13FEDFCC95E5A7EF5E1D5793", + "section_salt": "973274E6978EEB00588121FF8F3D2723" + }, + { + "adv_header_byte": "30", + "adv_salt": "95C2D7868282E5790EBDDCC89759B4C1", + "aes_key": "CD7F86C35D2BD47F9DF1F0929CDF7123", + "data_elements": [], + "encoded_section": "3790138A13FBFBECC148589176B2F090064A779110003FE8296502CF32A8202018AFC04A52159004B1DCE781C276A9FC00F5380DC9399063", + "identity_type": "provisioned", + "iv": "413A5B6B45F312FDF51C8DAAECF692F0", + "key_seed": "21C30C7548CC08332F259C493F122582C9D2CE04E2E3F22E715F9EDCB12D7100", + "metadata_key": "2AECD34AD9CC88413723844F52128EB3", + "section_mic_hmac_key": "D31EB890A1B0AC8F46E70771ED9F20D0FA173F33613BEC221A9502FA131B07D3", + "section_salt": "3FE8296502CF32A8202018AFC04A5215" + }, + { + "adv_header_byte": "30", + "adv_salt": "E96C90F3BE79939E8784E2DC5B31BDFE", + "aes_key": "775282A7208DBB1E7F6605D293E01569", + "data_elements": [ + { + "contents": "A40AE87570892CED908675E9B1", + "de_type": 353 + }, + { + "contents": "C003", + "de_type": 516 + } + ], + "encoded_section": "4C901368AC6D32D83AE84E55E96F8D2AF048B89110001B662351BB4DEF5C1AA42CDB493A8B36900133373940E3DE0962AAC26099DEF282AEE69427FEAB5A78CFC17FAB668BE3863DD7E13207E5", + "identity_type": "private", + "iv": "957E38A6D3C646EF05B80926BAC32F8F", + "key_seed": "FFEAF2E7E81186AA1F7546BF64C02F19B713424698C2D27230B0C18D0FA88778", + "metadata_key": "76052E1B1E33C77A468457355A7A480C", + "section_mic_hmac_key": "171933B371C424F5B76BA421F60FCAF87DDA0B96E37278E25F336724BE96573C", + "section_salt": "1B662351BB4DEF5C1AA42CDB493A8B36" + }, + { + "adv_header_byte": "30", + "adv_salt": "7134809DD3BCC616EC1193B90257A9CD", + "aes_key": "4F8BFC75339A3481169241E6142BD16E", + "data_elements": [ + { + "contents": "813D3DB42909EEB672E0068FFF5D5C11FF27862ED0A7B49C2DF69A1096BC", + "de_type": 368 + } + ], + "encoded_section": "589013C03A5C09B42E407DFBEF97C62255E63691100075B3832C1FDAE86E2FC3F936C7FA33E4900412099B1DFDD67635F1F0F5EDA28912BF4EC1876FDDFEF75B39246E62447E0AE9BF9C0D5DA26B1C71B0A995CB31D31E2B06", + "identity_type": "provisioned", + "iv": "87A512B81D64F5E12678BA49BBE8827E", + "key_seed": "56ABD8D2A0121F6B2036F5995FB901C671902708CE8F122F9FA2EEEDA76B60A4", + "metadata_key": "E2D1095A39383B17B22D89AD524A2503", + "section_mic_hmac_key": "3F04EABBB85B4DDDBC2EE93DB5DC9E5748E086829E0A933E5484A2828309C7A1", + "section_salt": "75B3832C1FDAE86E2FC3F936C7FA33E4" + }, + { + "adv_header_byte": "30", + "adv_salt": "04822A3F914BEB02DE158387544B33B7", + "aes_key": "9E61F07423A43898F2B2BD793AE78265", + "data_elements": [ + { + "contents": "573A24E1C0", + "de_type": 73 + }, + { + "contents": "5737FA2542C8DA3B14D5AF59E185EC", + "de_type": 145 + }, + { + "contents": "B3D90DD4027492BBD8F6A03869891466D2F7", + "de_type": 517 + } + ], + "encoded_section": "6590132A1E9626DA0DB9A7149FC698FF5A112A911000A5516EE85A8E5F68A7A20CD1AD0F4D8E900151BCBC864AA670083AC7607F17733752559F4B7A02ADBCFCCF538935D532EA7429ED06742544428A52A88BBFBF205D7E1E16D64EF0449E9F70CB8697AC1B", + "identity_type": "private", + "iv": "C1B1581BE83D958184B1F20B62878655", + "key_seed": "434D7F1E6F20E72E968B6967177C7172E89F20605C6A0CEECB940DED13C73417", + "metadata_key": "E31B56FB8461D5D0C9CB4D65029B27F0", + "section_mic_hmac_key": "D7B91FDAD07753CB972FCB2300055E27CF54F56F1B5C208126917ACB4B98B40E", + "section_salt": "A5516EE85A8E5F68A7A20CD1AD0F4D8E" + }, + { + "adv_header_byte": "30", + "adv_salt": "3BDCCBBD6FAEA4D81F0C38846EDB0007", + "aes_key": "2009340BB233CF0120BC7B9D43FF6EA6", + "data_elements": [ + { + "contents": "9321C26068C444C77A4C", + "de_type": 568 + }, + { + "contents": "5610C34A4873EE4AEA0D64E07AF9F0805EDB22", + "de_type": 616 + } + ], + "encoded_section": "5A9013BC4CF26CB67978FB671CC8C30360E7F691100000CCB08A96F8FFEE613C18F090085B059001A1F803A6ECEDA8A6D891CA8D93D521231DF5C635EBA09165E8E53EB8A5577299D4F9BE41035EA3C9E9E43A7CF32D44D4DD7BC8", + "identity_type": "private", + "iv": "4B3E5E0EC2C11AB77F1B5F0F282B1549", + "key_seed": "ED165FB36D9788873B3C2AB86363A5FCE5728FDBFA33798E8242A27ABB4E314D", + "metadata_key": "E207E837B797DCD4B7ACB5F58312805F", + "section_mic_hmac_key": "C9EED4F111AD3783F9F497CE8EBE2591277DCADF8C96A4E4E31648C62C31154F", + "section_salt": "00CCB08A96F8FFEE613C18F090085B05" + }, + { + "adv_header_byte": "30", + "adv_salt": "4E7FB1A6499207FA6E81670CEB1A517F", + "aes_key": "ACBD147D71B379B5788ED1708E5AAB0D", + "data_elements": [ + { + "contents": "F33836DB6662BEA48A083FEFB086714D", + "de_type": 544 + }, + { + "contents": "008185A991906A5F1E2F45358097F39258", + "de_type": 503 + }, + { + "contents": "A887EB3A5A5DDD3E234CFD84860E570D769BEBDD", + "de_type": 401 + }, + { + "contents": "7FEC120653B2C2F4430F1D4E", + "de_type": 285 + }, + { + "contents": "6C55DC27D312CEF55DE857C7", + "de_type": 614 + } + ], + "encoded_section": "9390139C09EE9AF9FD231DE8BBAB6A3006E327911000BB8C90B1631FA5349DBE93A8F8089D829004A288A109B78774698FD5CFD572F82AE470B5DB59FC33E58AA8D84517653DB8FFE57FA6DC1584B21D29FB3B744BC763DEC891B42CBBF2162E5634FD2AF6ABBB98E8A222E1F86DB6E92F9E79613D133EE7324A21F78F9F024EDF1BE8C5CC21A1330DE313169D2130088FA49904", + "identity_type": "provisioned", + "iv": "4D83F30109D4707667D1BAABF2BA1312", + "key_seed": "1CD41F0D8F60C95335ECC8B03AECDA964413DFA25F51950A867F86A91E4206BB", + "metadata_key": "CE44E301C09D5B72BA4D077648431CF7", + "section_mic_hmac_key": "8607BFB5EA7F4CEEE160990667025D950511D4D909A1ADCBBEB8D6F87E9B2F2B", + "section_salt": "BB8C90B1631FA5349DBE93A8F8089D82" + }, + { + "adv_header_byte": "30", + "adv_salt": "ED8F34826D86C32F70C23B1B7A4B931A", + "aes_key": "489A79206A9D1A6778D00DB2A49A6BA0", + "data_elements": [], + "encoded_section": "379013ACB36757EB46FC893FABF338BBC613D0911000FFBC4E258FF5E9F7D2E3BB3B6B0C03C69002DA9B70F9A96DAAEA10B5DD919D09267B", + "identity_type": "trusted", + "iv": "0FF0CAC823EC377E5757B4DE2E57EA4A", + "key_seed": "D38C6B417FCB3755D9EB0813204623F4D6D15CD26949DFD5639A905C4C58DBBD", + "metadata_key": "BA5D7A52C4E2F3B7BE99BF65507ADB9B", + "section_mic_hmac_key": "5002DC45274213683ED0C9D8364625DB71326B85DB9B7370F4462D54A94527D7", + "section_salt": "FFBC4E258FF5E9F7D2E3BB3B6B0C03C6" + }, + { + "adv_header_byte": "30", + "adv_salt": "7505C20263B4515F9CB242EED923D870", + "aes_key": "665A4ED25C48BBCD326496615C99D4EF", + "data_elements": [], + "encoded_section": "37901355742976F9F16F16C040E5D6ECF4882E91100095564CA7F1E190FC5EE16F47CCF6C23390013538A67CCE880536A01C72FF44A360A0", + "identity_type": "private", + "iv": "D6BE377B90522E1975AA152F05AC1714", + "key_seed": "D1D38E6F7A3C498D1CE230C517F2980757908842DC5156207BEBCE1090091671", + "metadata_key": "0A2CF8E7C024A0973C504D339D272277", + "section_mic_hmac_key": "A6E7D3BA8BE08EF7DEE3F254B9FA1BA00EAC09FDAE80FB3594A7F45BD20D03D5", + "section_salt": "95564CA7F1E190FC5EE16F47CCF6C233" + }, + { + "adv_header_byte": "30", + "adv_salt": "EA8E64EDDB1675A292FB90F2BA2412CC", + "aes_key": "30F49692078E22708DC9576A3D30B872", + "data_elements": [ + { + "contents": "91F9F257617B60E1", + "de_type": 29 + }, + { + "contents": "926A971187C6A8743030B07C43C7F92AC3", + "de_type": 144 + }, + { + "contents": "F86E6E5010AC0B38CD920ECBA177745EB482C8C550CC55835C0C4B03", + "de_type": 855 + }, + { + "contents": "FAEC19832C3B80EC7D3D54893B7D8A197AE10BEA0942C77B1860E009E784", + "de_type": 666 + } + ], + "encoded_section": "95901373ABB9225851815BD480DA08FA8E6D25911000229044FA21CC77C05DE710EE2B6D8903900444EA1F1D35B55D569CCBEDA5F7A130C9733885E75A3E64CB291A1FB898AA1D38ADFA7F54FC82C99CAD3FF8BFAF84E1A629EF64CC44C42A6EB46848C1C484521C3DB5424E9A1373A5B6B61E04B4E9D1CDCF8895A83BB87E3A227105E86461B6A688D9017998EF9037C71724622127", + "identity_type": "provisioned", + "iv": "B50D2E6EAF29D66713CFD26E4684BCBF", + "key_seed": "DAF73BE7AE7DDB8534853BB9AFD81B9A0F84990C601800F064E785AC4E655E85", + "metadata_key": "3F7EBA8DE8D0F68019C31AACAF5261F0", + "section_mic_hmac_key": "6E85868E853E08E194206FFC05E20676767CC9919ED9D83EFDFF045CBDE41127", + "section_salt": "229044FA21CC77C05DE710EE2B6D8903" + }, + { + "adv_header_byte": "30", + "adv_salt": "ADAB88DD84C90EC093A37DBD22747F09", + "aes_key": "70E5FCF2EA88CD2F7E195CF371F91614", + "data_elements": [], + "encoded_section": "379013F3E7199AA4111F9CF619FF98EFE320779110007302B6AB9A8C6635C582F17B5C3A0C0C9004AE7E83243075B04693077AE9E27EB88E", + "identity_type": "provisioned", + "iv": "4406E6C3D68D6ABD808E34740D9E8D33", + "key_seed": "9DE259395C1D23114C8FF35253E3B2FD3FF1CD43FE56C35A9A13636E5A88E4FC", + "metadata_key": "2D61B2E8816F45A67189DC8CC7247768", + "section_mic_hmac_key": "CE942B542959217EF710089A1AF55AD6422DE8D0E57E67CE9E3A2F71E68C3FA2", + "section_salt": "7302B6AB9A8C6635C582F17B5C3A0C0C" + }, + { + "adv_header_byte": "30", + "adv_salt": "93C14952EC8743C5ABA14B9E3CD2A212", + "aes_key": "92A48E1409E79E488DE6F3EFB23E8637", + "data_elements": [ + { + "contents": "9B8E20ECDFBA7BD59E1115FE", + "de_type": 678 + }, + { + "contents": "1A875433F13FDAECE0BC0F3DF535F1EEE4B48519A5F09094", + "de_type": 456 + }, + { + "contents": "DB29429B7B5EC416E915AF6199C7799B580C8AF38FDD2CA0B978061857", + "de_type": 71 + }, + { + "contents": "9A3C1C6FCBFA243767F11F699FBB05C45E0B", + "de_type": 676 + } + ], + "encoded_section": "959013DBEDC73C45241D9A454F0C6A9FCB95FE91100060F06A98234891C9EC864EF4C451528090013CFA5840B3F51C06556DC68F28B66C20F000A26CA532D3E66410933BFE1A27F9BD731DADB297BF8D2410821546727456C472E78C2236559A6A19C98C1112955B8E2EBA08F99CCEFFFB79C84294BF3E110D48EDE4C46AEE3B68DBEF75C21B9E899F1B780153C7BCDCF063698B7BB6", + "identity_type": "private", + "iv": "7B5C65A46F927A75E810DC5BF783DF87", + "key_seed": "2D88999EBC4AD1D16AFB3F6956C25843E701958CE6456DA83F2108CF03D1E055", + "metadata_key": "844CCA7389ECBD8B35A9570B59100971", + "section_mic_hmac_key": "632ACEA290B0CFD3A4404D9FF8C0544E2D2734358F2F12C62280DABB6A50CD5D", + "section_salt": "60F06A98234891C9EC864EF4C4515280" + }, + { + "adv_header_byte": "30", + "adv_salt": "31D8F19C7BA1B4815280B53E4C848B73", + "aes_key": "F5A28DFA51BF40D655E31AD80FD3A00D", + "data_elements": [ + { + "contents": "B835", + "de_type": 317 + }, + { + "contents": "0E", + "de_type": 505 + }, + { + "contents": "87E0ECED60A5F831AD115AE163ACD38DD2334F0C2C", + "de_type": 724 + } + ], + "encoded_section": "58901345C41F264D52643107E9FA58DBA9B42591100025E0D336AA3C2B471BD678673723E5CA90014031003378B065A86FB1CBEEFA7194AE280FD23FE579BE5DC32DD905686D0E706C6893BA092D4FB7960F9D296026A3EFDA", + "identity_type": "private", + "iv": "D61308A82CDC546B11B0B1FC341BF594", + "key_seed": "040A634AABD48B4660C06ABFEC3FCD61ECE2D52BA2A5E434E8D9477A654CE176", + "metadata_key": "36A1D6F085BCD1378E14173389DB0956", + "section_mic_hmac_key": "A0862AED0DEBD64349EC492BD7E8ACA6F7D874D24DFC983AE1F287D06F147B23", + "section_salt": "25E0D336AA3C2B471BD678673723E5CA" + }, + { + "adv_header_byte": "30", + "adv_salt": "09C377FC67DAC5FA8D0C7E1077618F01", + "aes_key": "D7AC2B958F079D386B0B392BF01F537E", + "data_elements": [ + { + "contents": "01F59AE40EAAA786B7C46D8B5C2E1CF22A7927D79566", + "de_type": 254 + } + ], + "encoded_section": "509013153E5C4EAD84B8372B09243DD7F8E90891100064F6BB71376AC822BD1EB434AFB7CD6A9001E4317B766820FEDA9F298B00E0CC0C1BA0F863130C35C146C86C683DF5D53D67E28733C55C3BCBFED5", + "identity_type": "private", + "iv": "CCA05AFA378ED7E3B6E33DEBCFBF204B", + "key_seed": "E224F6BA2E99537502A84B96F633F5E8F2020772A7298A359C860212261FBC8C", + "metadata_key": "FE01B6AEDE1A55184EB6477E1E0EC794", + "section_mic_hmac_key": "A47DC26C0806F40C5A322E13CB35735CC128C1DEE916EB60DA5BFA0A39F2F661", + "section_salt": "64F6BB71376AC822BD1EB434AFB7CD6A" + }, + { + "adv_header_byte": "30", + "adv_salt": "EDD2C2498BFB7A5CC6C86DCF37816EF1", + "aes_key": "B638E541BF8E9E4D3F8CAB0D9C43E637", + "data_elements": [ + { + "contents": "53BEABE818B66A0648BBC5634C", + "de_type": 583 + }, + { + "contents": "15B95BBF16", + "de_type": 965 + }, + { + "contents": "A72D1FB5F1FCA1FCDB6BD086B1AB05984A2CBAC020F65EA3DCE95ECC8E82", + "de_type": 617 + }, + { + "contents": "BEDBEB964295D2487E60521A0B779C41C92D001865F636E6D188", + "de_type": 611 + }, + { + "contents": "4698F885A5C7385C57CCB1", + "de_type": 524 + } + ], + "encoded_section": "9B90133F363F1A9D391313EDCB62DC7AA6FDAE91100007942426FD3FFCE7249E32B5F9E1484D900298AA6A9DF9942745B0947DA0AA8DB7E48C35BE7A0E4A439696CBF426A0091045DDD1C04A3205A048DF546DE43851CC0686DE448A75CEA658D7D6092FAF23BF29CBD23D5F5ED23F974838B625C25D73F8E5BD6ABB82860479288BB7D7D0978779F30A9071FCF6EFE1392E1FEE30F696D95FED120D", + "identity_type": "trusted", + "iv": "6B4203747F8A557FCE61C1E19010B25F", + "key_seed": "1590AE9CF009E4B80464AAFBFCAAD6BC46EBDDAA6E628A422A1B4249F4FA830F", + "metadata_key": "1935DBB80CC48394742FB7C36B028FAC", + "section_mic_hmac_key": "71D7A4B4FE0AF5B94EA90A46FC83E860689BA4396E20B502B0D4864EA65BCCAA", + "section_salt": "07942426FD3FFCE7249E32B5F9E1484D" + }, + { + "adv_header_byte": "30", + "adv_salt": "935B3FFA8B8135594E8527503826B3D2", + "aes_key": "93E2CBB2A2EBF1A3AEDB88002066B1A4", + "data_elements": [ + { + "contents": "2E4398A194FCB5AB5D16115ECCFC8DF14F", + "de_type": 641 + }, + { + "contents": "C1EA5737", + "de_type": 754 + }, + { + "contents": "B29CCCE545D2C871", + "de_type": 110 + }, + { + "contents": "6EA75755FC7744088E0F7B362E41237279C4FE285F5C635F07D3CF752607", + "de_type": 973 + }, + { + "contents": "874045A5D8A7AA4E81B9EE2882373798DD9ECB95A34E11", + "de_type": 733 + } + ], + "encoded_section": "979013EA6D1A285718D881780D442828F059B99110001DCB8556D111B113078C24BA2F06257A90028982A17443826EBF908DDC14E2E9453E86613E316703C30041097712D0D411DF102061D68772BD9E8C2092DE956BA65B2E07D9B0A7B17923D252DFB126135175629DD89BF5C96D17EB260EDF8A3D5B81D553CDA272E2DE310635BC84C3954F2A0793434C18915A2C3116A46BD0B858BA", + "identity_type": "trusted", + "iv": "1B9858676FA1CEB84951BFC4467F1C8B", + "key_seed": "CAF5566753E37F13983777EDAAA48A37A6571043DF2006AEF7D119B7AF42CDB0", + "metadata_key": "F253A8C6D3DBF176DD97993A3374EE11", + "section_mic_hmac_key": "ED5EC19C2A28BD1AF19B1AFF30EA766510474865A3F7F1A202C54F8B4F381B78", + "section_salt": "1DCB8556D111B113078C24BA2F06257A" + }, + { + "adv_header_byte": "30", + "adv_salt": "4E0560D260CF64013CD1C5CC2E650168", + "aes_key": "A3BDBB9EAF2B23B5B4FF966CE7145FCC", + "data_elements": [ + { + "contents": "1FE258CEA28507442694EB54141E014514673A8BC93C", + "de_type": 794 + }, + { + "contents": "43B8336BA71888E38BCAAE61CE2A14800F8391BE83AD3084", + "de_type": 752 + }, + { + "contents": "E1D434ADA8FDE1F7D4DAC388C51B119ED88A3BBB15176E5C2B4D4F", + "de_type": 681 + }, + { + "contents": "05A7198CF43DE4", + "de_type": 195 + } + ], + "encoded_section": "9390130807BD8B1CD2AEEF80505B5DD980558A911000235636B0516C0EBF29BFEA053BA6F2AA9001E8C847964A02279AB5856888A436078FBEE7524388992EDAD6505EA5910375D473D171744D84BE74C660D2E11F39587D329E1E9179FEB630C8282FDEF0943D8A1C05C27CEAB78D3F2E4840F84C0E111DE4488459DE4476D9EE8F50350B123B54057D3672B664AA442F43E812", + "identity_type": "private", + "iv": "8E5A00D0BE05A48A2BA357E27C2A67C0", + "key_seed": "E90D5815F43501F8DC7DADE9C1FF1E8B42893B9CF708DF00B7C7852C5A4132DC", + "metadata_key": "EDEB59B65043C9D70892DE01B1FAE8BB", + "section_mic_hmac_key": "DEB63991F7F5B2C38BE71212E5F29C6EAA5030154229B40D1369EECBE2D4B44F", + "section_salt": "235636B0516C0EBF29BFEA053BA6F2AA" + }, + { + "adv_header_byte": "30", + "adv_salt": "5B1529C4EF462754DC819B8A7A990368", + "aes_key": "85EFE96F8D4DE137F7742C19A794CFA3", + "data_elements": [ + { + "contents": "11DFFC1867A923A6F11B76237535D43A", + "de_type": 507 + }, + { + "contents": "24", + "de_type": 689 + }, + { + "contents": "987A00093A8A9BFA2BBFD82D5822586699A7B76899C3CA21B80AA95413", + "de_type": 341 + }, + { + "contents": "816761B857BFB83A8EB308A3", + "de_type": 313 + } + ], + "encoded_section": "7D9013904699D605A53254C2CF00ECC73CB8E6911000F2EAAC8EE7A9ECAC553E0E8EA6E370369002917F7D53E0000B7D92469C691DC007DDD552F7EF633EC0ECD760CE5A2A5551F2B3EA3B9FF460BA6CB1AC699693216AE065736771BAB5DBFC447BDFD3A0486F7E891703FD14D140190E06692A5C0E4601F0A11CCE364D", + "identity_type": "trusted", + "iv": "5AE06EF1A9B235583770B28C6F519692", + "key_seed": "8CB9FDA44549F1764F0FEDD6C7EC01D2D861BEB2F8314ED90C4780AF46140765", + "metadata_key": "4099FB6F91A2857E338956FE29D1A1BA", + "section_mic_hmac_key": "C98F2D369EB883C1758AE560E8A1E093C2978F0322E39F8F9EF2723257C7E73A", + "section_salt": "F2EAAC8EE7A9ECAC553E0E8EA6E37036" + }, + { + "adv_header_byte": "30", + "adv_salt": "6AC9566CE6E59CA80D112ABFEC45D36F", + "aes_key": "B8E9265C2F748123F5B9F751A7A2D03B", + "data_elements": [], + "encoded_section": "379013A8BA2217F87C377CFB1EDB0276E64980911000FDAAC5F8B202E266DF331B4D9B46FE4D90011536961048D58AC961B34A4EEB49CDF2", + "identity_type": "private", + "iv": "B005B7623A86312314C0C0D7FCBC3F2D", + "key_seed": "C8A695C2B0FBD7385393A196CCBD82493358E3BE62E1CC7BF2C71186DA29F5D4", + "metadata_key": "8E5B6E18F6AD98F4150A32FD656B0C08", + "section_mic_hmac_key": "EFBFE5124202575DDAD381003750174824B77800E8707A9CAEE7804E3A63EF16", + "section_salt": "FDAAC5F8B202E266DF331B4D9B46FE4D" + }, + { + "adv_header_byte": "30", + "adv_salt": "A7AE7921CC86A87A8C75811E6A9E03A6", + "aes_key": "250B08B04A835AAFB9E6076FE700799A", + "data_elements": [ + { + "contents": "C6B28E20E9790237477E", + "de_type": 504 + }, + { + "contents": "28606C895F0801DE3F0ABC9EE5D131CDDBEFB3A344D6", + "de_type": 396 + }, + { + "contents": "7127F17814E2EFB43948", + "de_type": 537 + }, + { + "contents": "3082C7", + "de_type": 705 + } + ], + "encoded_section": "709013C4A2A5BF3547013BBA1B383831D1BCE091100036E0549437A58C8096108736E2E54F839002C5F3CFF2372998337EBB3B98F98ECD208A00A91C9C03D46423D1282994D4AE2AE73612F111C2107AB19ED220A1C50DF885BE240BFFF7BA40FC735FF5159D92C1C36BDE1A3E8DECE91D", + "identity_type": "trusted", + "iv": "FF91837F451EDF3D18A22D3321C100B0", + "key_seed": "37279E81EB85F4A82ACB0A83D1E35C175878673E5991CA8CA24DBC718459BBAD", + "metadata_key": "4D47D647A7586385837A57466C13DA37", + "section_mic_hmac_key": "176D917352650AA00449B407739BD411141689F7D493E0FB4DE373F6EB227D09", + "section_salt": "36E0549437A58C8096108736E2E54F83" + }, + { + "adv_header_byte": "30", + "adv_salt": "31CAFA91829553CE7076258C50ABA254", + "aes_key": "39055F82C293C2F814D14BB7082021A4", + "data_elements": [ + { + "contents": "138DB57FC84A2A9FF858980497BD66AD07B3D35861D398", + "de_type": 908 + }, + { + "contents": "F1AC596899642AB4A3224A33E3F4BEB89567D138A00897", + "de_type": 97 + }, + { + "contents": "F33377C511B8F1A14E", + "de_type": 994 + } + ], + "encoded_section": "769013A24F473D02C870D82B5A2C492367719791100093084927BDC539B7664A642EE828FBCE900473352C75BD958A2419FE4C5177410E191C38BE4D8B0B21783969B4FBF28D572EC372B59CC8C5BA0E38D9278308403C87CFFFDABBBAEBCAB827E53AF03E87A4E5F443604A7DC6DC78DBDDF0542CE645", + "identity_type": "provisioned", + "iv": "DD57E44D3F0D0F3DDD0201BAD985A27C", + "key_seed": "6E931D385053BA0B12BBD523DCC73B3B4E67551C3F5E2B4DB28D1F877CEE5266", + "metadata_key": "74DA1C3C2C26438FA854D14D71B8E385", + "section_mic_hmac_key": "DBC7B9EB0B1B3B982AB762BD1AB304184D1400952590DDB7D0D04E1C394ED3C3", + "section_salt": "93084927BDC539B7664A642EE828FBCE" + }, + { + "adv_header_byte": "30", + "adv_salt": "C49F4B14FB613C049B9F05EB9CE7879E", + "aes_key": "CF327AB0B447A7AF29CA225D0C66BF88", + "data_elements": [ + { + "contents": "EA", + "de_type": 603 + }, + { + "contents": "4BFE2D10A8F98339DA94AC7FD972892BE0F7F94C112C2F9018D6", + "de_type": 512 + } + ], + "encoded_section": "58901345F54B3BB7D5FA01A970B7F3DE3035239110005BD59D6B596E746EB47FFAB378E67610900142AF5B387E46C1D390817ADAE02E9776069475827A331978DBE74C0B598B62EFD874514FD69C4A497DF102F7E7D28E2C15", + "identity_type": "private", + "iv": "49CE2D4CDDD1FE4C7F55FC3188137869", + "key_seed": "62748144FB2FB8F3D1D26B7E29407D49E03EFD9152E00668A8D4CC98B33C1C6C", + "metadata_key": "BDA4A1BB532F0F3759B50CC5FBB7FF0D", + "section_mic_hmac_key": "92915252B41A8BAC323ED59D919DE01B1983FEF1232D5D3A49618998A334AEC4", + "section_salt": "5BD59D6B596E746EB47FFAB378E67610" + }, + { + "adv_header_byte": "30", + "adv_salt": "50478F0C95C5ADFF1E22DBC94040F350", + "aes_key": "5C24804ECE27E5BA68E99847F7F885AA", + "data_elements": [ + { + "contents": "EEBFBE7C8584ED74277C8B3E2B502ACEBF24B267DE6D894B", + "de_type": 194 + } + ], + "encoded_section": "52901366A0670E47B7DC095DCF73102FDC73E69110007B56EC0A6BABDB182C71BB10F5F08D279001B9D91DAABDBFE394958F6E84E6CD12D44D75C23DF167B985A9192F31C1086D9764E1F18B9B0510E5B85C8E", + "identity_type": "private", + "iv": "FB5AAAE3EACB3C7010D00F3F5D2C3BDA", + "key_seed": "ACA00C1D38AB3622FC6476156686D8C3546B5D7DE0D35CB2E577838779F26FEF", + "metadata_key": "F13BAF19DEAB019E02548A01243255FF", + "section_mic_hmac_key": "D5B4C8E5CBE16DEC491C3D0B361CE588EBC197E0F8C07B66E45C620DBCF0BFAB", + "section_salt": "7B56EC0A6BABDB182C71BB10F5F08D27" + }, + { + "adv_header_byte": "30", + "adv_salt": "B09E7223DB55CA715A7CDBAD5996A263", + "aes_key": "5A08C9A027433AA95DB2853BDA25B1CC", + "data_elements": [ + { + "contents": "4D49B84727526D565B651F", + "de_type": 191 + }, + { + "contents": "F5B14E3F786C1DF52258DD7B7E5240A7707EAA887484A166AC4E54", + "de_type": 408 + }, + { + "contents": "A3ED876A074183595073A43A689030", + "de_type": 910 + } + ], + "encoded_section": "759013C7D3F5BC51A900A5862D9C97C6420421911000742D8D5C8DE82797022EA2DBA6D1D34D9004ACA1B9AF6447CE5086B439B1BAEAECDCFBC67943ED19B7FE2AEEBE927C13A54A0CFF804BD8F6B6273D3750CAD751DE373DCDFFF91B61F4F4BC31F8931DD6B89073E2C00B353709314955E535856C", + "identity_type": "provisioned", + "iv": "6A4EC7D7D1DF376EFD6C30D4752FD4FE", + "key_seed": "B7FBE1F1586D2B63C20CB1153D7204A8CE46AF139AE5ABF1E2473727EF014DBB", + "metadata_key": "FF8E365F1C10EE5D9289E6E2A3431604", + "section_mic_hmac_key": "FFE968EAFBFAC3D8464618A92DEB901E018E5AD5DC3E4CCD2AFE7765B97E4208", + "section_salt": "742D8D5C8DE82797022EA2DBA6D1D34D" + }, + { + "adv_header_byte": "30", + "adv_salt": "90D4B993DDD10894C7DE4892AA9205F3", + "aes_key": "73BAC41B294391FD5D5288BFC9903EF5", + "data_elements": [ + { + "contents": "27F554F5A7C415247701F0FC053C47F0EB0F055075E60B56", + "de_type": 291 + } + ], + "encoded_section": "5290135D9848ABB456C6795F5FDF8A0D2671739110008C9B682EE5FE5EB5CE1BD9870CD71A9990043229E5C5C36B418090ED95DDBF6CC97A05C02E2DEEB8080D6B4B9DADB45B6FC5A20FCBB7CC08B5ECC2909D", + "identity_type": "provisioned", + "iv": "7695C534D867D68F7C1932B112715819", + "key_seed": "6975C61D58BA24A1B4EE54ADDD2C442B98EB26E46A705F388DB5E2ED510B4B28", + "metadata_key": "D17E6640A3CA07E378F7065697EA5991", + "section_mic_hmac_key": "F96908B8BF76281EDB7BBD7ED61C717F9696F1D86A35A08EAE230403A1107554", + "section_salt": "8C9B682EE5FE5EB5CE1BD9870CD71A99" + }, + { + "adv_header_byte": "30", + "adv_salt": "68815B831AA0916F568E55263A7A48B2", + "aes_key": "5EBE57C4F71896FC3D6C0F1234CFE4C8", + "data_elements": [ + { + "contents": "2D2EF51996D21B2E51463AF39E92", + "de_type": 266 + }, + { + "contents": "B5B3289B121AE9D357AFE47D5E824F60", + "de_type": 506 + }, + { + "contents": "CD3BA06429D31778484A63DFE622C417FC91017592E7B2A9999BB95F", + "de_type": 605 + }, + { + "contents": "D75A6907BAA74620FA2085", + "de_type": 41 + } + ], + "encoded_section": "879013A6C5D0E432008BA653FF7129A306A3EC911000EA1BB84D74CCE63FC6E8A7BAA4D0E8BE9001A66002D08581D42781E1B71D02A14371C531338D6A14F22495832CB9F5ECA5BF022B9E62D6A72168A5889635871DEC3B4BF993A31FA6D88D147BF16E48B99F9F78D7433C9FE0D8900F2B64CFDF5C5B54AD9BDC2AEA6A53CC6AF84FE9AAF59193", + "identity_type": "private", + "iv": "C35B01B06E5D277079BA8AD9DBC8F362", + "key_seed": "F0C3EF794389DDA400ADC8FAA947DD95143F6607B459C306BDAAA576F465E52C", + "metadata_key": "AF790FA02EABFB6819FFF681B9DF902B", + "section_mic_hmac_key": "71A8D29B91A31FF5FDDAA7C80D68F46CFBBC16402B57282E74129BC4B17499D3", + "section_salt": "EA1BB84D74CCE63FC6E8A7BAA4D0E8BE" + }, + { + "adv_header_byte": "30", + "adv_salt": "4A9A6B72387F31CDE7DEE4E7E406DFF6", + "aes_key": "B3591F7BBEBCFC4D19A43572B2BBBCF5", + "data_elements": [ + { + "contents": "287900DBF7C6EF207125FA0402", + "de_type": 126 + }, + { + "contents": "3DB9807390DD723B2BE6D68E83DF7C2770667A585BAAFDFC6B60F23B6DDC", + "de_type": 914 + } + ], + "encoded_section": "6790137F9988226CFB15EA43A400BD295BDFCB911000642FBA603E7E92B57E9AE3A01C2A4067900198D788FD01113B8A8C929309797B3A7297B90D01EECEF4B43E92B07E402D59F4C898D6DB4567499719BB98EEF2FDF3949CE4345E58D410B47377BA3A76EF5946", + "identity_type": "private", + "iv": "85FCE66A5FA02412A1234692C64896BA", + "key_seed": "2CC2199AD55B6F938E243F37DA6ACE29254ED61B0B37B0304329430A2A76E0D0", + "metadata_key": "631559C94CC2789DE04E60E2ACA530E6", + "section_mic_hmac_key": "9A892BFBCF0FD28F4E5A8F4C5758870EFE840BA65BBBD08F47BE62CF648FCC10", + "section_salt": "642FBA603E7E92B57E9AE3A01C2A4067" + }, + { + "adv_header_byte": "30", + "adv_salt": "3B58BD1E258028DC7224E170E5D91527", + "aes_key": "A74001E2A3666357CAAC0E33C1855E10", + "data_elements": [ + { + "contents": "12A3E1127075B64AE49D7BA96E1C1B", + "de_type": 739 + }, + { + "contents": "A234A52C0FEA5B1BCCC9BF31ABE4", + "de_type": 956 + }, + { + "contents": "8F", + "de_type": 184 + }, + { + "contents": "07D259", + "de_type": 483 + }, + { + "contents": "8CF495883089242BFDD53B4564044BE87A18AB4C27F3506A", + "de_type": 646 + } + ], + "encoded_section": "7F90134E199204C2471A9115FF2C632668284D91100075629F4391815BD952FB3733BE9FD5ED90029DB3CCDF47466BCF742E415F1B2808173977D02F7174626840312C0AE5F9460BB6D9896D1C906C783523FE087FC586B3CDBD3837F712E2754A920C13760D62AD1407E0FDF94E5A10A0F6B6435DB107288AA0E8DE89F61C41", + "identity_type": "trusted", + "iv": "ED3E7F6915FBA4453344C5B6E412C564", + "key_seed": "1846D5BA042D86730983D0AAF49EA0AB2B83BEB46A36ED91FB14A9EF471FE246", + "metadata_key": "E0FD1F3EEBC6BBA6FE654CECD49DB39A", + "section_mic_hmac_key": "91BC8A5166C8148062C2CEDFC69EFFFCF988181F45B5B0594999ABD9A6A1D293", + "section_salt": "75629F4391815BD952FB3733BE9FD5ED" + }, + { + "adv_header_byte": "30", + "adv_salt": "6980A6133FD8A5C51F3C733F504318F2", + "aes_key": "2114E6476D43B88B62350530B2B5E255", + "data_elements": [ + { + "contents": "78D82AC0B53E7EE9DB8E175A4F4C8E3FF309", + "de_type": 238 + }, + { + "contents": "DC40997B9DC9FCE9D3A685B4", + "de_type": 949 + } + ], + "encoded_section": "5B901364A48CB28EEFCE542E48C436C6E5C9F9911000D88F6109B3C4201C37D0BBCF905E844F9004C5199C455C3382BAAE410F855270883316438EF9A3A4B9F4AA0146A64D40287EE6570800272C4DA3CBD9E8E6855AF2B117E45550", + "identity_type": "provisioned", + "iv": "2677516D425DE7E57AA134A908F6FA77", + "key_seed": "2446CFBD94DE790A7817A3B309B6578724F386F8699C9E60F64E843F1E6F41BE", + "metadata_key": "F6619D96FAB75B632E6DB605E17C804E", + "section_mic_hmac_key": "467BC68954AA7C5F2E3BC686A88A219025CB25E054A00A51BA7A22F9A8EB85B0", + "section_salt": "D88F6109B3C4201C37D0BBCF905E844F" + }, + { + "adv_header_byte": "30", + "adv_salt": "5755CEF6FE6FD55A41FA44CABD97741F", + "aes_key": "E8708156531B7A958D952DE7627847BB", + "data_elements": [ + { + "contents": "23C735", + "de_type": 355 + } + ], + "encoded_section": "3D9013409B507183829B924D89F0CDB0114D6B9110005BB6431511D93263B7DB812C5C3169FA90010A0D93D550F4B038870E73551CCC98CACB4BFB4A37AD", + "identity_type": "private", + "iv": "4190244089F66CA5612739960D6B6265", + "key_seed": "A0B97402658B7EB8A9CE7FA833B06BE4113813C5DF44BB4CDD2A1026623CE93E", + "metadata_key": "27EA5EDBB15D6D851213D99E85394969", + "section_mic_hmac_key": "CBA9B0CE3E1538B7599EB74522BD58E3D6B30CDE7047123EAB8E6C837D3A86C0", + "section_salt": "5BB6431511D93263B7DB812C5C3169FA" + }, + { + "adv_header_byte": "30", + "adv_salt": "D12CA4BC0DF622B6F2A6C38F244ECA88", + "aes_key": "FE420A08BE520C56C373D90506399368", + "data_elements": [ + { + "contents": "2B284B656DFE764CCE6BD0B8A8DC69FFE06A60A0", + "de_type": 982 + }, + { + "contents": "36636E1715B38A596BCC68ABEE73CFAF34EA87B634386C02", + "de_type": 537 + }, + { + "contents": "5BF461ED52EF4F04EB97039F41300BD52529363361208E673FF097D5E9", + "de_type": 49 + }, + { + "contents": "22E82E947110CD667295C59CABFD9CD0340C6F950AB0", + "de_type": 665 + } + ], + "encoded_section": "A19013E8415BF7F48BAAE5E2349E6AF8C46097911000AEF9DA74479EEAC0C4E65E88E8E8FFE49001A158884B1C0FDBE25B9BFF7F48E3501E1CE87D4BB0C4EDE04ECBE90ED47B150732C022C9666FDF3E7315F74B7776FC5CC9A7E16CA18E90869D563005189D665167689E5DD8BFF6C5C08A8F2EA8025E8BF9C360E5B11918C31F682542595396B18CB98C0F6F2C4B1B7304864F165D897D17CD113D95B5927CD4D2", + "identity_type": "private", + "iv": "36217155A9B1C113637F5B31A0D52462", + "key_seed": "D77AB260151CD044C7B2AAB6E05FBC8E91F36BA08D99DD9DA9B6672CCFB80622", + "metadata_key": "D98AE815017F1CCD49B73838CF47C569", + "section_mic_hmac_key": "1C58860A31C39611669FD41F05F3DB0E5FB3841796071415958EFD3873F6134C", + "section_salt": "AEF9DA74479EEAC0C4E65E88E8E8FFE4" + }, + { + "adv_header_byte": "30", + "adv_salt": "2F7824830FE99F6CEFCEFF4E8DAF9306", + "aes_key": "B8C0F18B36A2C4CDFF83C57209CA0877", + "data_elements": [], + "encoded_section": "3790138347AEC84C563EF86AF3A100CB5C2028911000D26AE3AED6E647BD9318ED7324A032609004420C7090DAC986AC7383E0B07C7D0218", + "identity_type": "provisioned", + "iv": "B20E80EACF53908799869F1431A64093", + "key_seed": "89C8925B2181AC409D718497B652931F78526AEEF0F0D29B16A94CEC57D1C5B7", + "metadata_key": "7D40A615D28BD9CABF573DC1990929E7", + "section_mic_hmac_key": "8082F293C5E89429553A6F138CB27C283BDC31F342E0049F6871D614B4E0672A", + "section_salt": "D26AE3AED6E647BD9318ED7324A03260" + }, + { + "adv_header_byte": "30", + "adv_salt": "50835FC1D56A351C460893484BB405D0", + "aes_key": "5A5B7EBD7ED56C23D8B6F82912BDAC08", + "data_elements": [ + { + "contents": "6CC2B418F4BCBA2E3C334BC068E5", + "de_type": 371 + }, + { + "contents": "7D0C99B63FC2F485D42A56", + "de_type": 361 + }, + { + "contents": "5DA48C5C3DCD", + "de_type": 659 + }, + { + "contents": "", + "de_type": 95 + }, + { + "contents": "3780B32198E3", + "de_type": 965 + } + ], + "encoded_section": "6A9013522A8B8B0C6E757ED4C020BCE2FA2876911000C7C5CC64D2848A6F5E9B06024AF7CF7490010553DC253CA3A8379FAF58AFC20732CDA0D2D6F1D16B659C6DFA077FB83412170B8A58A249F77F5AEB8D72AA86D3C93F64631650ADDFC8C12FE570B139123F8348B1CB", + "identity_type": "private", + "iv": "8C1907865989C82AC1E7C94F46ADC1F2", + "key_seed": "4108AC4D0FFDFA538E12F709EB5EE2EC58107D42CCC21743E35C4366C8A6E037", + "metadata_key": "B569E2A8F95000A5D8616779A1EAB30B", + "section_mic_hmac_key": "7B4E3B5C475E1C8FB665FF5942256874C076B8305992371CDA125A3CE0289D25", + "section_salt": "C7C5CC64D2848A6F5E9B06024AF7CF74" + }, + { + "adv_header_byte": "30", + "adv_salt": "B63F775898D49530F53F98C8736B4AD7", + "aes_key": "1B2DA0F7C59B3FF7DB2E82675228D075", + "data_elements": [ + { + "contents": "039C353B728226EABC1C9BB92C", + "de_type": 805 + }, + { + "contents": "BE5252DD4308972B310168F705", + "de_type": 936 + }, + { + "contents": "35EB21FBC97D47937000F4EC2FF4960751502BC7980B1B3D31", + "de_type": 579 + }, + { + "contents": "759DF16D57824FA1F519774AFE9966", + "de_type": 906 + } + ], + "encoded_section": "8590138E794DDD1F90AA00C804A1D55D74199B9110000C181E2D488AC2E6382460989CCFD4A79001EB8A74FFF9481D0F8537BDA5E83313389FA2EFE7CFFD063AE79E634FFF0690390AF5D99664325FE479E22B30E672E3A1C9FA7C51C10023DA9D3934B8E2B5E7B302F7D924B5A3841CFFCB5E4173084EB27D0AF3135DC5CD7BD0CC13817AF7", + "identity_type": "private", + "iv": "ED7A001999A7212E0F8D0A8BBF06F0DA", + "key_seed": "D8C605A919DBCA02E857A0E787D643B68252650909FBBC4F92B621C0825DEE63", + "metadata_key": "C967056677B2FE105F418127AB4C9BED", + "section_mic_hmac_key": "76DA9B9114E01E24DACA9B02E6EA5BBBDEDE38A8CF33001989B421B67D73D5F6", + "section_salt": "0C181E2D488AC2E6382460989CCFD4A7" + }, + { + "adv_header_byte": "30", + "adv_salt": "2DEC4BAFFCF3310DBE0F3413788D397F", + "aes_key": "E519A2D987D271CF5D3EBFB41C42302E", + "data_elements": [ + { + "contents": "F8F7F2291376122477777F1C028B89957234FD1B4D8FBF", + "de_type": 294 + }, + { + "contents": "664104580D04F0299BFA7EA1E379B5140E891DB347F49FE31F58E1", + "de_type": 873 + }, + { + "contents": "8798DB136C098E7EED7A1D", + "de_type": 383 + }, + { + "contents": "3351FB9BE8807FC9D78EE332A0", + "de_type": 685 + }, + { + "contents": "A6F525066B3624AD7ED50466EE08AC9EF6141EFBF0451F87AE8277DF9CF9", + "de_type": 827 + } + ], + "encoded_section": "AE9013D653FD5F4549F54B1911CAF49FF594F1911000CF4D14BE750B5BA5E49644317DEBD84590015F4C834B18AAE2AA790AC546C1BD9EFBB4FBDC4054A9E5BDFA9E3DFA77C9EA9DDFC714ED34337541979D845D155D15F5EBEA4D7E577172FE9DABFC8EA60B659BF27BC9EA813FD1C6EB693D28F11B35FC1B55CAAD3FACF09A30C6AECBC39FA1F95B6359AD3E7D5135C57B2823637768F51C0608BDC8362E6057A074F6C6A74E34C5CABF14CA7CA1", + "identity_type": "private", + "iv": "A9FE4C8782689FC14D8BCFBD33F242AA", + "key_seed": "E4398DC2A8F536C4250186EC57BB080E3905C0DE7136E5E6684A94DF38020DD3", + "metadata_key": "8286CB1DD719F554E9CA70EF5BB78182", + "section_mic_hmac_key": "52BD0E9C4C000F837DF8A80D471D145A9625B8F118641FE81B5CCF958F3F35B3", + "section_salt": "CF4D14BE750B5BA5E49644317DEBD845" + }, + { + "adv_header_byte": "30", + "adv_salt": "C2308865C3D290C95E557AEB1189623C", + "aes_key": "E8BF8FAA9C15279F3C712FDC28EA9E1F", + "data_elements": [ + { + "contents": "AF0F38B4A0EE47BCE5B3F0AAF54D", + "de_type": 27 + }, + { + "contents": "6B2E9F0DF07EB6D9877DE3E238059802D9D04315E0D6C4AFC8DA", + "de_type": 337 + }, + { + "contents": "FA8917EF757AC107B1DD4C", + "de_type": 903 + } + ], + "encoded_section": "7290138C4539BDC8F8AE4C73FC0ED661D0030A91100007DB45B2A020CD435ACE131E78F8595F9001C20DFF6C112B8F2F9130961C3C0A1B8121F539E238D4ADE2C865A086CC93D56D69D2BF38310ADEFE69AD2FD2679A4203E67D8472A329F52C07E85EFF4684F4113CD7C304090D02494B42F6", + "identity_type": "private", + "iv": "DA52FF1A543C36D4DCB573EED3492B02", + "key_seed": "2AD3751078D15056347708E40974A33C922CC41CC28FDDF988F2E2A5A2239A86", + "metadata_key": "FD7BC17ABBE3AE00CB69C5B13AF815A6", + "section_mic_hmac_key": "B01C2D3C9C7F049E5F6B994286E4ED7A767AD9727DB0FDE9E0604CD09C5E6EFE", + "section_salt": "07DB45B2A020CD435ACE131E78F8595F" + }, + { + "adv_header_byte": "30", + "adv_salt": "0E6250F5E1063FFD5625E4899B7EC23C", + "aes_key": "82B4EFBC00345E53944B62098AC4741E", + "data_elements": [ + { + "contents": "84BB", + "de_type": 108 + }, + { + "contents": "754F4890235008945EB5DDA0C5794514", + "de_type": 296 + }, + { + "contents": "817310F380A4523BA475A885AC", + "de_type": 534 + } + ], + "encoded_section": "5E9013257C860C9FE68D13E448BE77AC156B6A91100073EB2D1A7B9A79694383A83819BA58C19002980493534B01BE7A4C0D57A3B7C279037B65AC33424C40D9ED3D3ED5CCAAAA3387F19EF03CEDA947228D791FA10E21C394650A6DECAA80", + "identity_type": "trusted", + "iv": "7B7ABAED849E8CB85465909BB1008A27", + "key_seed": "39FAF4627996D3A4E86A2609345F8CCFBE215FA4959EE8CDEFA7C7ED76F0F063", + "metadata_key": "D5CE99E6634247D8D39A6F9FC822F098", + "section_mic_hmac_key": "4A8284901D526E778AE208C2A347A49FB10CC2A27E1CED6CF06E1629D5D6A8ED", + "section_salt": "73EB2D1A7B9A79694383A83819BA58C1" + }, + { + "adv_header_byte": "30", + "adv_salt": "73267BDA51FFF82F035394D3EF80D6CB", + "aes_key": "3D76734B202CDAB569B4AA364BDD8C38", + "data_elements": [ + { + "contents": "2C4473F60CB71FDC87628B247D3DDCE92B0638", + "de_type": 432 + }, + { + "contents": "2D130F6710326FE796AA4A73ECB006B595BD3EE95433AD3CA014", + "de_type": 327 + }, + { + "contents": "88799981CADB882884B4C47884D0944B8B37045F31", + "de_type": 884 + }, + { + "contents": "B2BE3EAF7781B27C26D1C1DED2D503", + "de_type": 326 + }, + { + "contents": "8DE982C8211A0DB37462DF80908A", + "de_type": 957 + } + ], + "encoded_section": "A59013DD5CB96E28C1A8F5DD5FEC82CB88BE639110007C5463B073E37C64784907BEBE5BBDEF90021514E83EE8FEF5010680B26A5530A8FDD2A2EDFCF02D32FC9F74DE8654F3816A4E9B62D75A7C768B2D247C127C2016A0F2EA412B31A9B75D74DB39BC47617A87C767C3F7E134FD14E3051635789B5C8B29EB1F4DCC60CFC947589904C336DC786AF79471140DD27C5C4808749AEDCCF2DB7848B30022B64A53FC2365DA27", + "identity_type": "trusted", + "iv": "CEC5679AEB9A51471B5D4681A305DD04", + "key_seed": "6F3DB15F4DF627B06073393BAE946B216F91AE6FE5B3CDBF13FF7EC6641A464E", + "metadata_key": "0162EF842711DBF3B94E4D471EF750AE", + "section_mic_hmac_key": "5529B07938C0FE667CB13099BBBEDAD33B2FA644FEFE54C02B5923CF6A8AA2B7", + "section_salt": "7C5463B073E37C64784907BEBE5BBDEF" + }, + { + "adv_header_byte": "30", + "adv_salt": "8F6E3B41929E4835D8A92894E01D3370", + "aes_key": "1E7D6DC597401B8495A444FC0DF6BA1E", + "data_elements": [ + { + "contents": "426A68378FBD50DAED7B3FB1E90B", + "de_type": 275 + }, + { + "contents": "A915A4A2D2DBD35A71628777FC2454B2", + "de_type": 860 + }, + { + "contents": "44AC7C57E6F86C622909FA47E9", + "de_type": 956 + }, + { + "contents": "20F924FEB103DD50F1A1387EEFAE248676929FB54D48B1E465AE45DF05", + "de_type": 25 + } + ], + "encoded_section": "8A90130A637967EDD9E12ED105059ED73AFBC69110002FD7D90E8EE16536DC7C67F3E60A010D90023894E74272B0D304BCB3E9DF7FC43C807AAFBD40A77D397D77611BCBA2EAB0DDCDB669DEFD729738A57FFD70703EC2B9695A2A37BF34C0DED20B89D6BC2F8F42711A79429C95A4A0E2E190E8BC6FDC6C7A61ABC01BA824D0CEDB71884F62A33D906D9F", + "identity_type": "trusted", + "iv": "5DD25A67393B6865442B019CFDB5DF8C", + "key_seed": "EF233E0B6A8EC2808EF6FE4C625A6FC21809031077F4C3AF242E4B437D8CAF32", + "metadata_key": "6E4695C00A4D71156E1F33ED864069C7", + "section_mic_hmac_key": "AC752138D071EEBE9D679C8FC065416E93AE38BFCC21C4F313155F29B827D906", + "section_salt": "2FD7D90E8EE16536DC7C67F3E60A010D" + }, + { + "adv_header_byte": "30", + "adv_salt": "87150E19C730DBF9A86B9E12160CE5D3", + "aes_key": "C66FD1768C38128B074B1F8EF5D796EC", + "data_elements": [ + { + "contents": "73", + "de_type": 429 + }, + { + "contents": "E6381B5087F9", + "de_type": 492 + } + ], + "encoded_section": "449013E5B8AE1079C8E1B92B68F9546E149847911000EF0F6F02489A17DBEAB359CE6006C8C09002451233A8A062D0578F6040C49FE712945A45FECFE12A899C112ADEFF99", + "identity_type": "trusted", + "iv": "AE5502584C0BF952B7CCF3A06D79FB4B", + "key_seed": "4C90F913AB9E4AB30DB8EC14CEDABA184990B8630D6E72E3EC55DA678F647567", + "metadata_key": "84C0A99DDE5671E33E2916B2C6635A97", + "section_mic_hmac_key": "2F96B9CFBB5F2DA7B16B79E2A51B49F8983319461C5E782DC80DE00A36CCB650", + "section_salt": "EF0F6F02489A17DBEAB359CE6006C8C0" + }, + { + "adv_header_byte": "30", + "adv_salt": "AF2F88F8670B45CC12E1F0BB195537E8", + "aes_key": "057F34718269CBD6CEE1F96A2281FF4E", + "data_elements": [ + { + "contents": "788CB56081AD4BF210B3D2BF2AE24354FC967C426C0D457BF5", + "de_type": 419 + }, + { + "contents": "8F48AFD689E68D180BC9", + "de_type": 231 + }, + { + "contents": "7306BEAFEB639848A3B9006FC5049BC2C570FE64F15F56F5A0B01F47", + "de_type": 416 + }, + { + "contents": "042BCBD8C26AEF494B0262B0203F8C862A3B36BAC14A419BE1AD", + "de_type": 390 + } + ], + "encoded_section": "9C9013BE62CCCE821A4AB67616B63F417CD90D9110009F2AD41A47D93BCD76F3269EB9ADDE3F900160304961426D9B4BFC017C3599287A4B1509319EF24436CB3E3DDC8A5392E1A8AA714B880956F63F1085F709F1483A3200848F85E8BBC7255F0F878D7FDD472D1FE7664AA5849AA65D890CC229D08AC669C863793A678E9D03B7887856953EF9876DE62D09BFC10B0970C1828D7E00CF9FF05FDE6F", + "identity_type": "private", + "iv": "00CAED3CFA112DE322DD39A9D46B1057", + "key_seed": "6CF216D98ABC54B3D01EAF03E690AA8F705D853D1A409C98AAFB64AB5DB8B777", + "metadata_key": "3AEF7BBF65BB6397D331899133978ADE", + "section_mic_hmac_key": "4A3B921039E9959F13555CFF983C7FFEFB4C2EB3F8009280814C77E18F2C4E0E", + "section_salt": "9F2AD41A47D93BCD76F3269EB9ADDE3F" + }, + { + "adv_header_byte": "30", + "adv_salt": "7794B8D1AB196CA8AC2105A839BCD4A8", + "aes_key": "0ADF3A9468C4E726C4DB2A608549EE98", + "data_elements": [ + { + "contents": "CB1B557B230D", + "de_type": 585 + }, + { + "contents": "7DBBD4ABC8B4E7589BE1D51921022C026D3D9B95", + "de_type": 531 + }, + { + "contents": "DA2FC203F623B7EB1D", + "de_type": 544 + }, + { + "contents": "2474FDC7BF11E245A27F94E7ED426428CCB3", + "de_type": 437 + }, + { + "contents": "3EE60DA7CBAE5B47FE578E49FEFB1A221F08B825", + "de_type": 650 + } + ], + "encoded_section": "8F90137E678458819B7DC2C5F15AF080B953859110002CDE4D9F6C04C8FE5FDB6C5E32FE2CCC90025D8153CCCA9FB64C5FB097FA5E89BC09E1C5814AD60F68CCFD49AF6FB93D7D5F9A6032BE33FC6B1C250E5AAA4D26D7D73C334E84411E72B9D486E133675636E3574B0C8B5C43CBB8240F59C0CD41D90F886DDF0BA9177BE3CB9FED65F79FBD0018B8032567A6D069", + "identity_type": "trusted", + "iv": "1894035341D848E48F9A51C823863216", + "key_seed": "91506AB916B8A078A6DDE8B0BE901CE7AF4696136DE8D7DE45CF849F7270AC5F", + "metadata_key": "6EC956F9A4E19C08DFE8D4A622325516", + "section_mic_hmac_key": "0F4C9028DF6BE7AADA4E075A6BA1DD00677087758012415836160F2057ACD8A1", + "section_salt": "2CDE4D9F6C04C8FE5FDB6C5E32FE2CCC" + }, + { + "adv_header_byte": "30", + "adv_salt": "26EF54C5E545BAFE7E3FE21889954F4B", + "aes_key": "067B439C57F9DE70894D5719B7DB2B35", + "data_elements": [], + "encoded_section": "379013080E311384411FF6770D2B94AC7ACE169110001FEFA67CEE0923857B10DD52D0B34E71900450893BB7FEACC5728EEDDF1D26ABC6A7", + "identity_type": "provisioned", + "iv": "7EED03455676377622DA473E4F16F32A", + "key_seed": "DED047531F38D53F63678999DBE4BDEFD7B784848EBB7E002F96458E93504118", + "metadata_key": "3BEDA0C2BC240C647A331E616CC299AB", + "section_mic_hmac_key": "C64D36914AAE044A5615D8C61DE6EFE50B28A276550B62F2CE5085A1189616DF", + "section_salt": "1FEFA67CEE0923857B10DD52D0B34E71" + }, + { + "adv_header_byte": "30", + "adv_salt": "1F519C5224D33911C941374BC65E28D4", + "aes_key": "0BE9E36BBA46D40FFEEA09B8F0D5F5C8", + "data_elements": [], + "encoded_section": "3790130CA72F7349FE92C154A357B63BCA5350911000F93678548B2DA382420B7D5B5C7ABFA19001315D8C73AAB7AF4B00B43FF2E33BECC8", + "identity_type": "private", + "iv": "9057DD64AD863A184C580C3AC515EF1C", + "key_seed": "6C2ADF30FFE6F8DB97F237FA6563503EBED4A6877A7A90F4453C927C5C46A965", + "metadata_key": "2A9DCA48AF9238C08F03CBEBAADB5F36", + "section_mic_hmac_key": "E8E29CA7B172FE28485E42B6038344EB3850A3B4FDC0526A3FFDCE2B658588C7", + "section_salt": "F93678548B2DA382420B7D5B5C7ABFA1" + }, + { + "adv_header_byte": "30", + "adv_salt": "C1576CC52ACA6AEE4E6D72D158321A1A", + "aes_key": "AA5444E04F5A5D4CD410584D05BC77C0", + "data_elements": [ + { + "contents": "", + "de_type": 425 + } + ], + "encoded_section": "3A9013E14E5F87EFDCDF15AC1D1B4DCDB691E09110004B1A66BA4FD083871ED0239BADD179979004C17822C5F498155EB82DC5852D9A67BF6E66F1", + "identity_type": "provisioned", + "iv": "509D22CF33947815509F6D320B155E69", + "key_seed": "E42FC4857670BE08A3D4A3A2E7CBBBE2C720CC04CCC411247AB51CD36D87FA3B", + "metadata_key": "BD1150EB7D9B06D0FB9688D424143BF7", + "section_mic_hmac_key": "0E3917077E4EBF69E843FD7BB0B38765B9BEC3C55D4DDAB58A5FBD74B586622F", + "section_salt": "4B1A66BA4FD083871ED0239BADD17997" + }, + { + "adv_header_byte": "30", + "adv_salt": "377BC9095D04B301058A806B59A57F57", + "aes_key": "5B7C325293C552B1B1286B3F5A988FDA", + "data_elements": [ + { + "contents": "BE2875720FDD655D", + "de_type": 392 + }, + { + "contents": "76E75061", + "de_type": 901 + }, + { + "contents": "A6DCBCB08EE974DA3C2677054843F1E3BDC74894A82BDD3ED8E8F231B3", + "de_type": 989 + }, + { + "contents": "F6C0F899C87F7B6F2ADA4CB6AC54F679D871", + "de_type": 891 + } + ], + "encoded_section": "7E9013D5DEDED151C0BF96D220B3AAFA310EBD91100046C9B3269C4FAA4938C3BE157869EACA90015CD656AB893D2F34D12B52C9212BA6E26191D2054AD777025E72D552876D7F603193F642B9A0AAAAA8F327AEA1C88760EB9968177017593879A486601E2A9FCA7B9AD3F4E3761177516CA335BE2C0F250DB498656A4681", + "identity_type": "private", + "iv": "9BF1FF6714915AAFE0ACFC6AFB53B67C", + "key_seed": "80F614A0EBB5AB849CCC3343443DBD9560983BF83E7F699E742CD736F7C86CC4", + "metadata_key": "BF0EB0030D8626F493C9F89271E63EA1", + "section_mic_hmac_key": "D32162D8264CD760B9C3FB677C389333D77FBD6AC51BE51FBD11354B4F04151F", + "section_salt": "46C9B3269C4FAA4938C3BE157869EACA" + }, + { + "adv_header_byte": "30", + "adv_salt": "BC027A216DD34B788B55394D74F2ACF6", + "aes_key": "F4500F319B2E1A064448EFD061A1A869", + "data_elements": [ + { + "contents": "51CDB7E7020C96926D5B015EF6AFC86FAD", + "de_type": 209 + }, + { + "contents": "A8", + "de_type": 16 + }, + { + "contents": "6CCC0F2F8660", + "de_type": 145 + }, + { + "contents": "1A6A8EF8B495F771C4BFADF39CFB37", + "de_type": 602 + }, + { + "contents": "FA7D", + "de_type": 393 + } + ], + "encoded_section": "6E90133436164C4FE9F77A9C7A4331E5670A3191100028BE87A539716E6151518CD624233C80900258DB4E150403902E214CA9BCC5B8DF6F2A79CE406C90817577C0B3ED6D873AB480CC6989346F6893AA42C6F4EB5B83044F3FB86E41B035A7DE509DD369B86297394170886D61A1", + "identity_type": "trusted", + "iv": "0B7F0AF24D63480085FCF7948C1825BB", + "key_seed": "F058BC14D7150596F7251F711B065981E786691012EBC6032D16DD5EA125975F", + "metadata_key": "CC6B26C79E16DD81D63644043D76A92F", + "section_mic_hmac_key": "6012E0F51DC90446DCD3BDF0701CD4C3A5C9750318C2BE597AFE5EF2E0FDFCBF", + "section_salt": "28BE87A539716E6151518CD624233C80" + }, + { + "adv_header_byte": "30", + "adv_salt": "1A08F7A48EA6CBEC743CF81FC6D56821", + "aes_key": "D97C644C27E58A5A498EA72243B4A95C", + "data_elements": [ + { + "contents": "AEC98CDC9931D9FA7B", + "de_type": 273 + }, + { + "contents": "0C0C0EF256DA68", + "de_type": 380 + }, + { + "contents": "D3FA7A86", + "de_type": 877 + }, + { + "contents": "EDD68F83E5679FD3AC94D4C2429CF0315E", + "de_type": 68 + }, + { + "contents": "500D0CFF89F6", + "de_type": 67 + } + ], + "encoded_section": "6F9013DEB0470A1F0FA8A932BFA955957CBC0691100078E0F69271423A55D3CE7B9BAB03CA979004A1F0A1F01FDCC777695FA1905956FC2C0B2E0ECCE69A1DF5B30E799BF694545A488742FCA43945D42FF4A4D85375F6A70A580DD6C262AB36D7EAD41B29960339ED26DA7BA7422477", + "identity_type": "provisioned", + "iv": "AE5AD7C635F64E56905AA85E0F9B3B82", + "key_seed": "CAB76C82AB54159962AF8F8A9E0A6DD4C9B50C5F177EE962D20809A4F547A270", + "metadata_key": "1E7A975F40C89469B15AC5375E4373BF", + "section_mic_hmac_key": "AE063C8CFE9CE240A12A366F41D2A4B4A8A8BF6A1C423E8B70B3B47D15CD6A5D", + "section_salt": "78E0F69271423A55D3CE7B9BAB03CA97" + }, + { + "adv_header_byte": "30", + "adv_salt": "3D2CBD32D735A997DA15835EFBFA7373", + "aes_key": "00FB26A966AEA71F4F3F81EFF6E5829E", + "data_elements": [], + "encoded_section": "379013B611C34F3E2A898D28DFF2CAF8F00DEE911000BAC5A68FFDDEF9369C1C0BC7CC3720309001B9E0939D28E54DEE710832446AA1307C", + "identity_type": "private", + "iv": "2A71513622E51E6F2108327F7097E087", + "key_seed": "F3BA939307B540A9669FCF4BBA080D1ACB6CEE90C507BF68A4E6AA370D7D984D", + "metadata_key": "DA78623C0201AE798FFC6E8F80F84884", + "section_mic_hmac_key": "7F14654F8045636DB98447C3BBF86EE7A1956CDFB14CE500A7D8F98C15A43011", + "section_salt": "BAC5A68FFDDEF9369C1C0BC7CC372030" + }, + { + "adv_header_byte": "30", + "adv_salt": "77ADB3A8157794B68D57E93BF8859870", + "aes_key": "4F6EF047DDC92999AD39D14F5E9E8EC0", + "data_elements": [ + { + "contents": "4479FC904BF6F8", + "de_type": 306 + }, + { + "contents": "C97FAB7582641A84D1D8FA", + "de_type": 403 + }, + { + "contents": "785BDB2AECFE00", + "de_type": 132 + }, + { + "contents": "34EB7B5DD6FF9A7C75", + "de_type": 660 + } + ], + "encoded_section": "659013283C8CA35E4ABDC728046AC5E81C10BC911000479E4DBF68E781F32D60231F00FADA7B90012B74C5F9D7D1ACA3B1FDB3BE49719E5B9FB7005799CDED08ED36939500614AFE7585F03593DD5A9C6F9D58A2D508BC234C4471D86AF173D7FDFEF2023448", + "identity_type": "private", + "iv": "3DCB029A083103E2C7C69763285546A2", + "key_seed": "8951296E131C87D3A0A8F8A6E3F91B507A9FC625F2209CFC470E09AB7ECBAEB4", + "metadata_key": "E621F60D8C3E75309AC74418E87493D5", + "section_mic_hmac_key": "7BB1F0E37007179FFF5E50DA154C0AB6DC07FB15A3A8C2B9CB80FB0B22A3A366", + "section_salt": "479E4DBF68E781F32D60231F00FADA7B" + }, + { + "adv_header_byte": "30", + "adv_salt": "5523CC0A3ACAB8E002C5B03E4808D625", + "aes_key": "A93EAD18C04AF23BA0B446769ED0D4AF", + "data_elements": [ + { + "contents": "57CB2931FF", + "de_type": 736 + }, + { + "contents": "3BCC86FA67D655249461AA5516BB1059579B79", + "de_type": 61 + }, + { + "contents": "7ABEF8CE6D3F04A289C51F3FEEC213AEBB27F491B29F2812F9", + "de_type": 660 + }, + { + "contents": "857393CDE700048F7929F87E700697268B389A526F5B4B", + "de_type": 849 + }, + { + "contents": "DD1F9B8FC82DC694DCE9B17CE1FF", + "de_type": 903 + } + ], + "encoded_section": "9B9013BFBF9B27EAFBBF9603C2ACA1B8D00B51911000A3C249C74FC22AFC978CE2AB76F99ADC900178863494C9773EF2ED49036A65ADF8B0FCB15AFE7E05523E02D4CA7347DB21D17F63773ECD2FDAD8FEE232AC5B3C3D3EBEFA8DDBD922DEB36CF1CD53C74B55B976651149CD3E192EE54750B4CC7C0108890C5B620F308407DDE2D9E61DDC47286033EC1ACCF7ACAB012F26C116AE0A1F4BA35611", + "identity_type": "private", + "iv": "ABF1E4825C9043D121C73EF13E7093BE", + "key_seed": "811D8AB3E0A91917EEFFE6A65492B725DB16CEF6AC605EC55A719CF855FF4821", + "metadata_key": "D0E00E77083797F00688A8B8432BA577", + "section_mic_hmac_key": "B1913208DA43E67D32EBD684C9E51C730CA7EA852C57A61B7EC3B6D296327E7F", + "section_salt": "A3C249C74FC22AFC978CE2AB76F99ADC" + }, + { + "adv_header_byte": "30", + "adv_salt": "7B9E42554FB00BFC2CAA42EEBAF748E1", + "aes_key": "A93E1B7DC96488FC144480BB65A01C57", + "data_elements": [], + "encoded_section": "3790138A7CF75B48199BCD5F84CE324A50434591100083E5B4BC98CDA2E4DB2A784724360B57900214878DA8B2CF9E53C4506769CF1E4376", + "identity_type": "trusted", + "iv": "9779E069B6FA6140944F01A97D4BC89C", + "key_seed": "BE0D17E6FD478876E8B9BB74BA9EB382D38D2B98637A318D609A377CA7B83480", + "metadata_key": "5595C8B32A8E9C4C83D565DE60F704AE", + "section_mic_hmac_key": "7DE7B0C7C21CD1CE05291A17EB174ED90CA69598DD3085DAD647D6FE71A0E0CB", + "section_salt": "83E5B4BC98CDA2E4DB2A784724360B57" + }, + { + "adv_header_byte": "30", + "adv_salt": "660D2523BFEC72D9DFA03CFCB4094237", + "aes_key": "EC158E6BDA8C755EDFA4E7E40E38469D", + "data_elements": [ + { + "contents": "CBDCAACFC2C1898E42CB7A27D4661011705D60C5F32DA720C800", + "de_type": 965 + }, + { + "contents": "8F661004B6A92E32BECD006F274BABC1ACC2D3A90FACB1FFA87EDB06", + "de_type": 710 + }, + { + "contents": "626C92A5FDA9B4E1", + "de_type": 188 + } + ], + "encoded_section": "7E9013F4C1C954AF5D56967CDC2892BD9A9D019110002204CAA1D9652AF0E2DB758DDA67ED3490016FB87E2EE1E01DE9673E1EB155582A33E799954ED39A22240BFC01E566CFBF7B6D67BE1DB06FB422AA106DA95983C2D230A1BE5C31D12A15F84FA7F580532B15AC0376768035A69094E530B9050A99028721CF9BCFC70C", + "identity_type": "private", + "iv": "8ECF0A26DDE36F8B649DECA07753D512", + "key_seed": "5C7C830B694068C1EE51EF76A04D99C195B8A1836095698FDED6934FE84DCED1", + "metadata_key": "3257B5AECD39C702BB9D5DF3D8A3F617", + "section_mic_hmac_key": "045161FB09CE9C68B8F4F79F8ED355A581305F8B9E92503C1274FAEB0F333BEA", + "section_salt": "2204CAA1D9652AF0E2DB758DDA67ED34" + }, + { + "adv_header_byte": "30", + "adv_salt": "941BAB785F65055B50D126F54845E785", + "aes_key": "36AC7BB4C245CD5A4E082AB5820EFC91", + "data_elements": [ + { + "contents": "2B78D10F49303E6870D7D466267F6FE2CD3FFF2545", + "de_type": 355 + } + ], + "encoded_section": "4F901362962B873249BBE0926B653C83801D70911000AB6695F933776370BBC72AC0856836489001E7C16A69C4CFD200DFB8F7B42153F8A70A967EC5E42D4D2EFD82CA7DB23BA8CDFFF0921EBD24343F", + "identity_type": "private", + "iv": "C08AEFE2C72088FA9684354784D5B33D", + "key_seed": "B20D5B6D74823D69BC64FD37C1298865DE0C23FAB71DACCF4BD83CC5AA4A6F87", + "metadata_key": "643E478373531F6F17E71D77550A819D", + "section_mic_hmac_key": "4130AA9A3A6E3B0AB872AF92A125F5673A4CBCF6528884520AB8E8A239D93660", + "section_salt": "AB6695F933776370BBC72AC085683648" + }, + { + "adv_header_byte": "30", + "adv_salt": "455F57E0747AE27EC84FF60FBDAD21C9", + "aes_key": "10A3829309D3BB339971100F42811992", + "data_elements": [ + { + "contents": "003457", + "de_type": 798 + }, + { + "contents": "6F479F21", + "de_type": 728 + }, + { + "contents": "B815202D9A4B1DFE2A29282156288A", + "de_type": 592 + }, + { + "contents": "F9CDED3294668BB0FD17353C62DF3B78FD85DD", + "de_type": 311 + }, + { + "contents": "7A8C86FBBFC0A452B1B6D1CCCD05D5B3C0D3D519", + "de_type": 641 + } + ], + "encoded_section": "8390137EFDF8FBCA2BE02D60FDA5CDC52DFDEC911000F9AB6616323C5ACE5C8BBC2F57A4AB0F90012AC5B5D47CBD499393205125BBA713DD97759656839106EA68290A930C46FD260E464B447024CC6554323EE4569315B65BCF8838C238A98F5D07BD4D2545DB255A91C9B878E54B5FA09F97C265623A26B01052F91797C11F9B6B36D6", + "identity_type": "private", + "iv": "F32FB41CBA0C981CB22F0EF3E128EA1B", + "key_seed": "2876E980A8F706B04EE8BC575F7F37E79118170235F478E82333F5592FB95A4F", + "metadata_key": "B7657539A88CA716DABF9DB888FE80C4", + "section_mic_hmac_key": "078EF4BA19AD750FF10E9234E6F176F4CCD372371D1A1D3F22CE054FA7C8369F", + "section_salt": "F9AB6616323C5ACE5C8BBC2F57A4AB0F" + }, + { + "adv_header_byte": "30", + "adv_salt": "D2DB2DB9A8BCF5AEF392BF7F8EDB59EB", + "aes_key": "89A33186987B8B2D38B8DAF629F6BB21", + "data_elements": [ + { + "contents": "53DB5DDC34D45ADFE541BF69", + "de_type": 875 + }, + { + "contents": "832E", + "de_type": 697 + }, + { + "contents": "1E44D10B600CF4E81ED44BD76A4431B6C23805C1D3AD9DD9", + "de_type": 666 + } + ], + "encoded_section": "669013E6A1661A04FF0FB79DA17C60495D887F911000426F9B2D45B1019868EA8D7A205A98C990015C3B65037A20CD24E568C61253296917152A7BBD973F3D7372E2207E3E95AA20F8B0E1BEEF741BCA197680E124C9DE12AC5015FB0094F3157A3176ECC58565", + "identity_type": "private", + "iv": "52FD9A08C2A4744A0ED4DF7DF5A1965B", + "key_seed": "1E1C95D178D5D3721482E1AB313BB1CC17CD81107270466954FCBB0AFAE33245", + "metadata_key": "8C9E4E3F1616569227DD78E8524FA000", + "section_mic_hmac_key": "08A59583A45FF4E63BD51BB22C22049438A228AB48E59DE4180CC9B13F48EF92", + "section_salt": "426F9B2D45B1019868EA8D7A205A98C9" + }, + { + "adv_header_byte": "30", + "adv_salt": "D61322B59881683F4CA689625954B4BA", + "aes_key": "C5D0F13868492D25CCD7A9ACBB0821CF", + "data_elements": [ + { + "contents": "F0D028E4A63FCF08590FE7AA1F78290A952D058A44E483AD", + "de_type": 255 + } + ], + "encoded_section": "5290133934FA6C6ED6A147EC05881A8DBC9B9C911000D154AA47D8B433C113D44CE491BD27C99001B754FF6A6FAF35E8981928F2129E687D75C7D8A44A4BC54F0A5EAD534A0E8D814D20B27456D3B4DF49DC40", + "identity_type": "private", + "iv": "39D3563760AC6862EC2BE2D078617533", + "key_seed": "9A8AC70E3C17AA4920C892C557DFF22DE933A5225517A506A4A2DA31AE8D13D1", + "metadata_key": "E3FD32B1669F4BC7CD8A270537729FAB", + "section_mic_hmac_key": "E66F30B485A5F04FF29CCB6FA9354EEFD9519EEC7BFDBFB867FEB3151D6F9A2F", + "section_salt": "D154AA47D8B433C113D44CE491BD27C9" + }, + { + "adv_header_byte": "30", + "adv_salt": "8A71F9A833292722EB3AC152EF9E3C2E", + "aes_key": "D6C3FE4169BA5C1F7DD5E31A69DE04C7", + "data_elements": [], + "encoded_section": "379013091C3653AF02D4CD451FD1CC61DD194E911000D08DFCA5EADA20717FD66C7001A13AB89004F7BB3F2D2ECE19D69359C262107426D3", + "identity_type": "provisioned", + "iv": "D2F89CDEC85C3065FE1855983963A687", + "key_seed": "D3A4F31DF78BB537F4319E42EAC800AB91E2A4E0A4860BFDD8F24C38CB24A82B", + "metadata_key": "9FCAF36AF47A83C352D8D4DA69C6F3F6", + "section_mic_hmac_key": "14F18D13ADF4C22190EF457CE51A6575BAB65698EFD94FBE18CA227D5386E358", + "section_salt": "D08DFCA5EADA20717FD66C7001A13AB8" + }, + { + "adv_header_byte": "30", + "adv_salt": "B56527D15C00EA6C1F64191500E82B17", + "aes_key": "6A43BCE02D294DAB0096FBF48E31B9BE", + "data_elements": [ + { + "contents": "4634BF3FD479C9804459313CEA", + "de_type": 340 + } + ], + "encoded_section": "4790133CBE647AE20CBC397A25F52A5B56C936911000A59F02BDE2106CF82A01787C33DF2A089004A05865B1C3F0DDB00C3434147F19F333F1796D784CFD0FA34DD93E3136BA3414", + "identity_type": "provisioned", + "iv": "3B1A323410690A2F02B5259796488D38", + "key_seed": "3AF4E5F9F468FC934D60EB5B64FE42E73F995ADF8530734194AC832AC71BD742", + "metadata_key": "8A76F8A2C4C7D2FF7B656DAFAF4D251B", + "section_mic_hmac_key": "0635464DCB6685C1D8CD3340BB3E81A1247AFF24A980B5E6690DECDC45854B75", + "section_salt": "A59F02BDE2106CF82A01787C33DF2A08" + }, + { + "adv_header_byte": "30", + "adv_salt": "BB563222EE04AC29FF7A04090A36481C", + "aes_key": "95C44DA79C172EA55314090F38767175", + "data_elements": [ + { + "contents": "D75B5DDB4C68A3EA5441964A4D", + "de_type": 322 + }, + { + "contents": "37B4C50550C810B4C812417DEB4199026C9355", + "de_type": 351 + } + ], + "encoded_section": "5D90135D599966D1D25825A58E1CABF51DEF0D911000C01337053877FEEE2433C8675EABA35D9004C3AB83900533AADA9D91C0B11245FE4C8FFEFA907B7F99C9EEA4DD312A7FDA8E24AB21207B8A383DE2F4FF33FC95873FDF96B3303D11", + "identity_type": "provisioned", + "iv": "17815F8BD9BFF92671528C5F612433BE", + "key_seed": "AA1CE89203994182C1FF59E97EEE5E15337C4FC31EBCEA71B890BA95CD103B7A", + "metadata_key": "FF7FF9290BBD363B0D43B3158D234AC4", + "section_mic_hmac_key": "3FFC5928A11FBE71404CC8CBB4BA8BAE630CDE5421E3165598B0404E72475196", + "section_salt": "C01337053877FEEE2433C8675EABA35D" + }, + { + "adv_header_byte": "30", + "adv_salt": "FFB446A0CC75E485DC5F7D16E3B40C5A", + "aes_key": "489063A42F9BCD0D45A9A2E19A414039", + "data_elements": [ + { + "contents": "62F1CF47D18470AEB527B7F6775296CC6EFE09", + "de_type": 177 + }, + { + "contents": "5ACEF1AA889FDF113138CDAE", + "de_type": 498 + }, + { + "contents": "34AE", + "de_type": 271 + } + ], + "encoded_section": "6190136C2A97611B8AD5309E3CAB84A3CF565F9110005AD8B5A464405396CF27B92E3318855B9002C9BC281DB61BB7A2B2C669121E354A6D749B4F8891943647B28F0183FB7D0070AF55DF680EBD14987C99345BF20FC263B30FB8ADDD031444FA2D", + "identity_type": "trusted", + "iv": "D79BA5933791B503075CFC01E0FB7712", + "key_seed": "730687FF006CAEE1C0A66A01E54D4A7CF50BEB7A2D7536C0C4AEAB53E00F1513", + "metadata_key": "1401AE3D42B1A7EEE03E608B06B44F01", + "section_mic_hmac_key": "0270565C4972225F54D2DE44ADA82F04A11FB206EE8016554CE2E34150CBD41D", + "section_salt": "5AD8B5A464405396CF27B92E3318855B" + }, + { + "adv_header_byte": "30", + "adv_salt": "AF42F66B6003BD6524B54DA8D2252AC4", + "aes_key": "12383F430FBF68B10F14C36E22CE44C7", + "data_elements": [], + "encoded_section": "3790132E7185611C4A574D7A958EF281ECDC9F911000AB00F549C0723FF724278B0E94281421900254511D764D856B3D86F6921C0B69BA63", + "identity_type": "trusted", + "iv": "02BC7DD34BA8A194DEB6394D367379A3", + "key_seed": "EAF9F8E130E1D639D765601C07BB3926936B173EAAC71351D43EDF767CCC7155", + "metadata_key": "3CED07F3973098FEEC050DAA89D1BAB8", + "section_mic_hmac_key": "5599A5813A1058AECC22B1B3DB8A24CE041AE2F6A287A7886C7131C67DCA6F8C", + "section_salt": "AB00F549C0723FF724278B0E94281421" + }, + { + "adv_header_byte": "30", + "adv_salt": "25670EC81D48FF31F8771189AA170F3B", + "aes_key": "5461131B01024CAA85D6F3F04C747EA2", + "data_elements": [ + { + "contents": "70F812A1C77562795B634A15", + "de_type": 752 + }, + { + "contents": "4A7098AB14408AA7A49E737FBBB777F0", + "de_type": 512 + }, + { + "contents": "132D64D069C144AA18E7515196547AD6E971", + "de_type": 313 + }, + { + "contents": "07F0E91FA7CEF471AF7E42C74DEFE8AB692B1B5FECD68E4EDDE089", + "de_type": 278 + } + ], + "encoded_section": "8C9013A42FDE96C60F5F6E2292A1ACD8538E71911000C655B6AD55A141DDDDC8CA239D12944990047F71A803B61F1EEBC3D498E2916784FFA19ABBA694831D36F6E272FF47788F91DDCDDBCE7922E6410EB61D510D257B0A5BF1A89A2C5567300C40D27FA1F76D6C6D1F9DA88844E5B390D02F9A29FAEAF08E5A0401A824D58BE5489B6F272381628C0CE5D552", + "identity_type": "provisioned", + "iv": "BE73A8FB567E9F85D0AB30D9EF198482", + "key_seed": "5FBAB9B4DA6E55AB6A28DB0CFC1848B4B1A2A740176A41779A2B0CA53C85E0C8", + "metadata_key": "5A0FC8681CCFD973AFFC3A8A343F875D", + "section_mic_hmac_key": "01BD476EF165370B6064C3C61ADB7EB35C28E6AA661DE67AE23DEFD9BF0C62F6", + "section_salt": "C655B6AD55A141DDDDC8CA239D129449" + }, + { + "adv_header_byte": "30", + "adv_salt": "1698A0A2CBC569C04A8ECE5934215D84", + "aes_key": "67EEB4455EAB868F8530E5CC19A6D3CF", + "data_elements": [ + { + "contents": "3F598536EC1EE56157FAC56036CA37D2FBD91CEC62CF817655879F6C6FD7", + "de_type": 699 + } + ], + "encoded_section": "58901366D5FF91CA1E85781CB65F9F44A6A915911000D09661823870EA098CD4B79528F570549002B623382EE2174931E09C30B1EF4966869EB8E162A0B91F6299A507A566090E48B276A0AA84B82A02C9388E1572A5749905", + "identity_type": "trusted", + "iv": "E685B253F5DBECDE5E299677701C3C52", + "key_seed": "6F12AA77CA2C0963B48CA6117D5AA7971BD017CB4DCABA81A94027F92A478D36", + "metadata_key": "E91B270B0C39EE00A7445A9FEA85589A", + "section_mic_hmac_key": "A4D97829E2F5B49AA35B36C8FF77301335A033C6B4BB97987D119B0116A24E80", + "section_salt": "D09661823870EA098CD4B79528F57054" + }, + { + "adv_header_byte": "30", + "adv_salt": "81CC782D7A1DD2CDC0AB810AB984643D", + "aes_key": "B0EB8589C9401F28FC0C26469D89A63B", + "data_elements": [ + { + "contents": "D90FCFF0DAD5588D662E8A7486AEC74A9422", + "de_type": 382 + }, + { + "contents": "707B", + "de_type": 231 + }, + { + "contents": "6A6AA7D74F5FD3FC85A3", + "de_type": 733 + }, + { + "contents": "230C99B60765E1753C29C065FD9F9B7F512CA13613F1", + "de_type": 47 + } + ], + "encoded_section": "7690130FB4E3079CDF302AB7752B12365B7DEA91100088A69F0ECC5AD36DCB48C315F22D302C9002FDE9D76DCF16CDE15E6497EFA632888F9CC783729E139D9B5A54CAF585BDCD3DE00C43748F971D6E8B945DD0A63A53ECC8405AD75DD96ED285EDB30010951E7D995334F0D562E5D5A96B7B69C99180", + "identity_type": "trusted", + "iv": "3F139EBD60CEE2DEFABCBE5D8C03CC33", + "key_seed": "C97A976A77C57D2A16038BF394B1ABCBCF2CB1535CAC921B837418C75FFED5A6", + "metadata_key": "253F314C26118C9FF2156BD6B103CF12", + "section_mic_hmac_key": "1C2FE36935B0D3B8B54F8F7ADA894CF63D60E34C4E43E3BEEE457239D9CFA090", + "section_salt": "88A69F0ECC5AD36DCB48C315F22D302C" + }, + { + "adv_header_byte": "30", + "adv_salt": "3F68DECEB46FC2B26A80632B9F0BC551", + "aes_key": "AAB3D40BA404341AB33B80C75A455956", + "data_elements": [ + { + "contents": "06A9EDAFCD584B6E38788637216971", + "de_type": 671 + }, + { + "contents": "2108A76D", + "de_type": 220 + }, + { + "contents": "E1AFEA550370A4D8", + "de_type": 302 + }, + { + "contents": "B089AF93656690E7F5D458574E009638064A02ADDD", + "de_type": 606 + } + ], + "encoded_section": "73901363D824CD389AB1B5405A4084503F93F591100018C01A505928C235EC10AF668DB40FB390020577FABC21B8AD30907FEEE2AA7B75F0DD28EFCBC3A42056D1AAA57CEDC6BC99DDE47E5481C4AED0104EA28B805A32D55C06605488536113061524D6E8D3E082EFCFE9EA04C60E6205DFEA60", + "identity_type": "trusted", + "iv": "D24223CF7DD83A7A535C1C8C475F8069", + "key_seed": "6AB190C93E00BE55D327A52A7D6E2A6B55EA6BC42F4B4758DF942A0FEE5527C0", + "metadata_key": "0911EE2B4CE448C904D7EA949BFE7924", + "section_mic_hmac_key": "AB82958BB658137045E64CAB0BF661E3E93D0CD7E9E09F8C5094832C3F324770", + "section_salt": "18C01A505928C235EC10AF668DB40FB3" + }, + { + "adv_header_byte": "30", + "adv_salt": "16F428987093EF4C71103F7DAAB954D7", + "aes_key": "B654E0BC4980FBAEB1A7BFF6016EEEE4", + "data_elements": [], + "encoded_section": "37901338DF36C24A081C8C465579F807AE0D719110003EEF9CADA88DB5EA3CC0A49B3594282F900164F64D69E7941A231ED4B5655C92A27D", + "identity_type": "private", + "iv": "A08E3CAD668107A8797F8679F356AF13", + "key_seed": "E2C7557906E3BC6E94E7CE260E8AA2C1381629F7BCDE83BF6EBD249FAC95E085", + "metadata_key": "8C974F54F1D47E4E6076477FB073244B", + "section_mic_hmac_key": "5C1D2E2FFB430890D90C0A9D98C3E39F8CCE5C0F7134AA5C01E83F876C1B6147", + "section_salt": "3EEF9CADA88DB5EA3CC0A49B3594282F" + }, + { + "adv_header_byte": "30", + "adv_salt": "A6ABE19EA26BB9FE65BBC1F644681FBF", + "aes_key": "8DCCD08E61E8BF6B3E29907C8FC4A48A", + "data_elements": [], + "encoded_section": "3790132CEE5446EF5E2D00BFDAA9BB01F11E6791100081833175A7ABCE8DC548433B6ABFEAC99001C4782C58F1F77A879FDB53B0D7DA71BE", + "identity_type": "private", + "iv": "89DD6857CF308FF28B8F20AD6121D2FB", + "key_seed": "BC9EBF601245D8B4FFB331D0DEEAFF5EB2F4D255B27CA6F589FFE244D7F8BA61", + "metadata_key": "CE7B6849F29274DA2B5153DA263EB715", + "section_mic_hmac_key": "77EABC4A9722507E888315D75AFCEADDAAE374D29D8482C32B49E4DE797AD72B", + "section_salt": "81833175A7ABCE8DC548433B6ABFEAC9" + }, + { + "adv_header_byte": "30", + "adv_salt": "DBC312045F0B91D01D69B4C7D64CA84E", + "aes_key": "8AF7683D5C00432FF70F5C0F21B62ED0", + "data_elements": [ + { + "contents": "8C33E56E140674BC4DE6B6E6503B665690A0A5", + "de_type": 962 + }, + { + "contents": "52A891F8F72BD3D53F300F6DF78386EEF406", + "de_type": 809 + }, + { + "contents": "E4B5E9A863195AEC5A1F58940287190C21F4EED5A114F9877D", + "de_type": 424 + } + ], + "encoded_section": "7E9013AFEE4868B269521650E527FD6505254091100016B2164140F3A7D4D99588A1F07BB6829001627CA78389F5EB99D9DCF985143E7064B51264680CE657B458350306830F5330349B5943199B49D65CA4FAE46097C0FE5784578C7B937D17650DB5D7F9BB64518ECA0900F6537B0A1A9D9B09D72AAD18F927E8CE44B48B", + "identity_type": "private", + "iv": "EFFD6E65CE5969A045DC17F469C55D21", + "key_seed": "CF1BB3DCBDD1B4B1854312571D0D9E4CD3E51CB66886F8101DBA51454DAB3B43", + "metadata_key": "7712D6C6361462BB68F275E64847F92B", + "section_mic_hmac_key": "5976A38A5FC248E579FAA97C4AD81B01EDDB181D787DA79C55C6A5B2A3043320", + "section_salt": "16B2164140F3A7D4D99588A1F07BB682" + }, + { + "adv_header_byte": "30", + "adv_salt": "6EE5BA8B14844183D1C587D61EA65F06", + "aes_key": "8C770833C8746D89219288A5F1C77A29", + "data_elements": [ + { + "contents": "4EE9017827E633A83A1F3DF3727636D33D68F25F096F", + "de_type": 70 + }, + { + "contents": "8E501147C6", + "de_type": 700 + } + ], + "encoded_section": "5790134F8715DC2D2DD29001712938C4AC092A911000E5BE413F286D53CEB80C4C43A77C8F429001A090B0006FBA8B3AC2B4E6D8749565A555C2823BACBD6BEA07F06CD282865CDD8DFB9AA1EA9CAC5ECB512E94EAA509FF", + "identity_type": "private", + "iv": "8AC60B5B6C4BF4DA33864292D1A49040", + "key_seed": "256E590E325B44B0145FD955AA40CFE7AC01B57FBCEC373C94F17E1B9BBDFF20", + "metadata_key": "0B9043CF8075D46F3E0FC946A79A18D9", + "section_mic_hmac_key": "D3479310DD4C5AAB4263C51FA03D1F8593365098868C23A374211FCDE1908DC0", + "section_salt": "E5BE413F286D53CEB80C4C43A77C8F42" + }, + { + "adv_header_byte": "30", + "adv_salt": "D941C60088DD645313DFADB182C82558", + "aes_key": "E9919CDC3C08848B22D3C9AF7834E623", + "data_elements": [ + { + "contents": "9BB7ED5BF7DC448BB3", + "de_type": 330 + }, + { + "contents": "D4539A5B30220667E3A4C193", + "de_type": 950 + }, + { + "contents": "57CB6A30E9BE0B44E14D42C6A9DF1F40F78E5A72CCAE8DCE6ED20E8B8D87", + "de_type": 94 + }, + { + "contents": "21EA5370D8F897F0C836F9C0D7D8D20D9031B6AE", + "de_type": 220 + }, + { + "contents": "1ADF486290D5EA500318FF", + "de_type": 121 + } + ], + "encoded_section": "969013A9786ABE6D8971BD5514FDFA8CF2AC559110001142426FD9F8AC8E04980A76C8873DA1900263DC49F57C111C30ADA31DC772A46B34F87451042E48206D7BCEAA5D1C5511C413D77CEFEE13355DA1535D628BD04516B2983741CBB4266ECCC6252142347B8113956A28B3094390F7799F541BAB5FE11D7C3DE41C546B090467648933DAB1D5D4939B75B75C9BFA68FD0640EC3FD0", + "identity_type": "trusted", + "iv": "4C74A83C4F3D310530BC20A76606169A", + "key_seed": "6CFB25BD6F1AD54702025AA20976E8CC36E5125EFCF766339E9FF00608383FD5", + "metadata_key": "B6623EF31E56177E5E2FA2D34EF08217", + "section_mic_hmac_key": "1B6CE9263DCF22995C99D2E8328D6FACDC3B3729A0B2E8EEE4992C6231B5992D", + "section_salt": "1142426FD9F8AC8E04980A76C8873DA1" + }, + { + "adv_header_byte": "30", + "adv_salt": "AD17F621C4099C16E1364DF5EAAD46E9", + "aes_key": "4162A567DD3D59242D948EC4388D3BA0", + "data_elements": [ + { + "contents": "D1AC9D", + "de_type": 319 + }, + { + "contents": "AF10369D76F126F65771B19AEBF8CB7063AFDDAF", + "de_type": 568 + }, + { + "contents": "8EEB01E953A7DBD9FAE4543BAF174901D9946C89422B007F22", + "de_type": 659 + } + ], + "encoded_section": "709013BF382460F591A5AF35356E3138DE8BBE911000F008A0E0C87CEC6F7481FAEE41DE2972900492A0930FDADCC989A95DA24F2BECB1F0120086D7B4BCD531450DF307DB40F1B3B6E2A2BEFB0F2A158EDA479565E941CEF4DD226E05EA5A377DC6BAD5C4DF31346DB5887886E07D1F5A", + "identity_type": "provisioned", + "iv": "E2E2D8C0EAECB4E929DFDAC68E4A87CC", + "key_seed": "6A41B3A483120C6592A27A6DA224A2CE97A3630D7380BA9B492B7670C2DCA431", + "metadata_key": "84B633DF772A8582F240990C6505CFFC", + "section_mic_hmac_key": "6DD9ECC46CBBD6FFEB27625580412AA19C944BB3EE91E7BDC856B7DEE375FE6A", + "section_salt": "F008A0E0C87CEC6F7481FAEE41DE2972" + }, + { + "adv_header_byte": "30", + "adv_salt": "EBDFB8A3FA70511CED2FD2BAC79AEA0C", + "aes_key": "6A02B7B1B88FCF1141E10889BD473530", + "data_elements": [ + { + "contents": "78071178", + "de_type": 776 + }, + { + "contents": "49A8B73C22BDABDBF1", + "de_type": 36 + }, + { + "contents": "E34B4BA2CF", + "de_type": 205 + } + ], + "encoded_section": "51901367AA7D0CEB9619E38E3BC8FF5C259F59911000282ED516C9E632397B697EC6D5C023189001E888308F07AF62FEEC9F6AF1492CF04DE123DE408A607131F4454B1439A68F73D2FD5624B674550A37F3", + "identity_type": "private", + "iv": "FF4CC7BD41CE43FFD5B10FB55AC1C4E8", + "key_seed": "2860FE966BB48A14B70CC4D212BA76776EE122D2A3C58A45001060CDCFBEBC25", + "metadata_key": "A87D121E726F9D661E37F5829450D07F", + "section_mic_hmac_key": "EED14F69A5D27D0ACDB1A1FDFF1D5FED2FE02A60F0597F60376092286816EB42", + "section_salt": "282ED516C9E632397B697EC6D5C02318" + }, + { + "adv_header_byte": "30", + "adv_salt": "CF919F4B960D6466F6140686D0FA9252", + "aes_key": "E64125AAA9FDAC6241981F9DD418A55E", + "data_elements": [ + { + "contents": "59C49F092732737FF5AEE11EEAA22EF01B0F8E8438D0BE8D8EFF99AF", + "de_type": 472 + }, + { + "contents": "", + "de_type": 38 + }, + { + "contents": "05F2391B9C27F2F93B4F90090D588DF3B94B1E", + "de_type": 920 + }, + { + "contents": "E088646F209D208B75C2", + "de_type": 573 + } + ], + "encoded_section": "7B90137043A1380AAFA41C6CBE5A04DE25FF85911000C42674BE68576F2D75F9993288D240939004EB40F863F87FC7F36AAF85EB09F252C69D551F07DCACC4364B7D1470BD606DB9EB51F3EBF8721B9DF168910D7287029C237EDEDE9D4C07046349A46B7BB4ED83742649EC807874B64F3F34DD6F079C749D2C527A", + "identity_type": "provisioned", + "iv": "CB56304CEDF311EF61555C248ED67AFB", + "key_seed": "C7CA3CF04F910C2F618556A302B2AA4B21AD9C6D33B623B8D55D250468B92DD8", + "metadata_key": "70A8E9692001AAA64431EABDF02BCDA8", + "section_mic_hmac_key": "FD97007887547EE99A2BC7160E149E08A91C640BB285B5B80B3E18B3A87E7A60", + "section_salt": "C42674BE68576F2D75F9993288D24093" + }, + { + "adv_header_byte": "30", + "adv_salt": "B7D3C684246A638889A81C2A50D9CA69", + "aes_key": "3C90071725C2D7C73AF1A21FFC7DCE1D", + "data_elements": [ + { + "contents": "8D580692F89B5EA1E3CA4154F0CDC018E0", + "de_type": 812 + }, + { + "contents": "C9E79F183FA7E85C6A93B992E99A10D3B9FC39", + "de_type": 160 + }, + { + "contents": "DB1462A10152", + "de_type": 248 + }, + { + "contents": "83067D1B116DE15914D21DAEEBBA563D9B11C7263399C97C91F267A9", + "de_type": 67 + } + ], + "encoded_section": "889013120757F626EFF3FA706F5F7D9258F969911000C82A55BEE9331ADFEAF004B1F8411BEA9002269BFA035A00CFF999E7A24EEA0BDA41AF2435C3000FB78786E40EA307FF724CAF0E107ECC03677F508CFF053E269BEF7C643AE9FB379142A28C8B526720D5C02C616293082B34C65ED08F6D0A9B040A4A19907709AC21CF3C887546F6D4830DBE", + "identity_type": "trusted", + "iv": "8D1D26E68602B0801C1BA240B64AB2AC", + "key_seed": "0E7F40995A8CB111A533A7D3D37855140BE8A688302F897B91EE118209F89E0B", + "metadata_key": "44724015014CA24A6AD976E039AF5254", + "section_mic_hmac_key": "67861314F763C77B267EB38601ABC850E44635BB29A5E015A9BF97AD02B11887", + "section_salt": "C82A55BEE9331ADFEAF004B1F8411BEA" + }, + { + "adv_header_byte": "30", + "adv_salt": "2275164A24418E8253458C856948175A", + "aes_key": "FCDA486D97B17E4B73B64FCB6AC2E512", + "data_elements": [ + { + "contents": "62A5892D", + "de_type": 200 + } + ], + "encoded_section": "3E90133D01BB959195FB48361985459C950BF1911000EE19D4FD43C4A26C45CCC2F73391D2B790018D15AE13971DFDBC5C660CE316817A9AE8DBD7388C7FD3", + "identity_type": "private", + "iv": "5F5F397CA6FE206A01324ECB021E3229", + "key_seed": "E62A5DFC2D220D5A60C44680C620B02EE4B967CA42C0662143C9301CE3647489", + "metadata_key": "69F403CDA27C235769E0B517D73371B2", + "section_mic_hmac_key": "336592D0479F0A275CE32751290E25373CCCC3DEF8A76D2E1E19EFEC29652BA6", + "section_salt": "EE19D4FD43C4A26C45CCC2F73391D2B7" + }, + { + "adv_header_byte": "30", + "adv_salt": "D37D8224BCB2A88E8A32373B761C5ECE", + "aes_key": "299ECDF8023A36C8961C3847B7865F23", + "data_elements": [ + { + "contents": "B2C987A7B7", + "de_type": 461 + }, + { + "contents": "5B5275A30550D0451989E8CCB707F4BB4E1FD7E4067559", + "de_type": 660 + } + ], + "encoded_section": "59901351BC1AD8D62AD25E038519C98478075591100067A626FD764561B80156B43BBE18FE2290015BFCAA16FADD4E137A681CF88C1AFFE67981CA680202D1EFEF1539610538D8B2093E92A2C90B89CDA487E480ACA010EC5696", + "identity_type": "private", + "iv": "84E53FE82B267ECCA4C338365D976371", + "key_seed": "D054FA0157A869AB9D6ABB5966714E4699E3120582643226CCFD8172DFEDDBB3", + "metadata_key": "3BEB83127D47BFFBE32C9CB76F2F95BD", + "section_mic_hmac_key": "A41BBD631F9F0DAB81C18776F6877DEAD586AA8C2822E14910DAD1256FEF741E", + "section_salt": "67A626FD764561B80156B43BBE18FE22" + }, + { + "adv_header_byte": "30", + "adv_salt": "C7053AA74A4BA2AE0F70F44E089D29D1", + "aes_key": "65F1F9E585E540072E2DE478FE1AD76A", + "data_elements": [ + { + "contents": "1A6312AB5101EC2B51494185A33F7F7CA3D3AA6A52F9BCA5", + "de_type": 27 + }, + { + "contents": "626A45FD", + "de_type": 163 + }, + { + "contents": "2AC1B1D049847CFEDD3EA121A0EF", + "de_type": 805 + } + ], + "encoded_section": "69901379404B1053D12C1265E80377181C80079110001D9694EAFC36DEAD331B1AF01E6FAA569004F2611593ABA4DF715ABB0A60045DE939CCFF012A67BE7120EB8622F467C40A55A438E9FAC305C7F3DD3D7F1575561AF3B80071400A1E23474E4FE5A753060054AFC7", + "identity_type": "provisioned", + "iv": "BBED73E1526356DC7465518B78F1789A", + "key_seed": "4FF6F2ED889471ADE07505655C61FC55A296E2A781ED23D697FEC64C46F7BFE8", + "metadata_key": "02EB04450E5882DAD40B9C11E74ED571", + "section_mic_hmac_key": "BD2564C4DF163F2CFA403BB08891432ED59C1DAFAA05014FDD02DB19006E41F1", + "section_salt": "1D9694EAFC36DEAD331B1AF01E6FAA56" + }, + { + "adv_header_byte": "30", + "adv_salt": "2DDB3F10CE6908DE4064A6EADAA44CB1", + "aes_key": "D71B858543B064C2FA1C226CED9715D4", + "data_elements": [ + { + "contents": "3C79B5CCA08F604A35179CF79E27EE4088EAF9284082C9B9C6E5A6E3", + "de_type": 98 + }, + { + "contents": "6147", + "de_type": 603 + }, + { + "contents": "A5327E05BDBCCBF609037A6A47ABC084", + "de_type": 684 + }, + { + "contents": "FDD029D869BC2792F863D0A330B26BA567F312", + "de_type": 660 + } + ], + "encoded_section": "83901346D8A7AD53629FBFB4554D2893B59A3E911000193EF4A81E23010C50F7AB9D66E7B1F99001D4BBBA69FE1C5DA04ABF63E88F73FE4AEDA30C5D6AEF3F2E38F53427C49EE027B70FEAFD31011161C5F054CC6D4A916EE183785B7384149E601390215DFC3815E502695076125919A5D0A396C7769222A3E1CB02D660F4FF07F695F2", + "identity_type": "private", + "iv": "24B30EF97AD89F61F32199637B14D984", + "key_seed": "AFF8A5868B46113882EDCBAFFB25259BDB083CF55DDD4EE8CEA0BBF5A8E20783", + "metadata_key": "54ACE29DAB4432CA8456C3606A3A3285", + "section_mic_hmac_key": "F69C1B262B9E5E9E937CE8396D019326A61FA1598383147B8864197F7E1748D8", + "section_salt": "193EF4A81E23010C50F7AB9D66E7B1F9" + }, + { + "adv_header_byte": "30", + "adv_salt": "3B652C1DFA6EA396CD6299D7C2F1FC99", + "aes_key": "C74B97594BAC6BCB81E06F3860424E34", + "data_elements": [ + { + "contents": "29ABB0E895D880", + "de_type": 996 + }, + { + "contents": "68E69922B69FE5381A0B6FD2B3", + "de_type": 210 + }, + { + "contents": "1AA391EC93E13CB834A47EBB0D3C", + "de_type": 457 + } + ], + "encoded_section": "629013C84639CCD7C09FB779FF9746B0D86675911000CDEC9DF81798E081266AA31A02A495F09002AEBB7F8E231C56ECEE3CFE99FBD91140E8BD6E472F819590F8C4407D808E44117A9E6450CEC6AEA3421C3CF6C3A17D76F4BED944670B334DF6ACF8", + "identity_type": "trusted", + "iv": "B202A0324BDF0E7D7D79A0FABD70C00B", + "key_seed": "8211EFA73C0465A1C10B9518F949E4A9E51D9844F8A714E96AF4020A7BDC03F3", + "metadata_key": "90634220E3FBAE89FFA4415C6717013B", + "section_mic_hmac_key": "AFC6C865E7CE529D7BA7137EA854E27BB97DC12411B15FC5D2CF5661705DF098", + "section_salt": "CDEC9DF81798E081266AA31A02A495F0" + }, + { + "adv_header_byte": "30", + "adv_salt": "3A807B550B6F46E1AE79A6963B4EF980", + "aes_key": "B267961F7035BA20C9ACC38375A8B8BA", + "data_elements": [ + { + "contents": "883DDF57", + "de_type": 378 + }, + { + "contents": "5D7C88A0669FB0", + "de_type": 65 + }, + { + "contents": "B735EF9C0366D2BD9A208B7DE02C2F6316739CDAE55A161AC5", + "de_type": 883 + } + ], + "encoded_section": "639013EA03F4EEC56AB81C3840FE707CD0EFBB911000C7A6D417E567FF06D8580DEDB22B6AD790012869A0017974950F3D3AE671F0B17C46335580B531F54DFEFE20792D26A9CBC80E562100C19F01B6AB91652AE86A1DA3BAA1B1BAB6C6142806A518A6", + "identity_type": "private", + "iv": "0F1F6DEE9C4E6ABFCA411807FC543D4F", + "key_seed": "2AE4038986ABFB4F994675F74257DBA4D1421BB7FC26EBD550902478326516C1", + "metadata_key": "0442ABDF1AB578F04E9828DD59C89747", + "section_mic_hmac_key": "BDFCD117EF5E7BE2DE8DD21889827C98D3F04E1DF008171A7F780F364FEE870C", + "section_salt": "C7A6D417E567FF06D8580DEDB22B6AD7" + }, + { + "adv_header_byte": "30", + "adv_salt": "776476995C0D81CC3EB4BF74DA38DAE8", + "aes_key": "F7B37CECCCB3A565FE1CA8003E320EB1", + "data_elements": [ + { + "contents": "BFE38787DFC2F2E3D6E3B3C87F815EEA76D65A215C71", + "de_type": 171 + }, + { + "contents": "FDEC8C66519082CD2A451946464B59", + "de_type": 236 + }, + { + "contents": "9E90", + "de_type": 49 + }, + { + "contents": "3572D5AC806B58595850066B1725445CB8", + "de_type": 327 + }, + { + "contents": "BF3ABE62A330", + "de_type": 696 + } + ], + "encoded_section": "8390131C77D267901CBF78476EF0C05DDC63C591100044DD945128151D3723FEB2519B34EC1D9004652B4B46B0FE74A2B003FB8DE0B02E064E02544FBD3F094FA6D08F17BC432C0E33DC15EE29ECCEADAFA28E6D97942CEAACB9CA570F7C8E18EDF12CDAA49D314049FBEC0D3986BE84CC8D7E5D5D6F4375A5C24980753F106F6DCB2544", + "identity_type": "provisioned", + "iv": "15CD9E5FBF435001DF27D9AC024E5168", + "key_seed": "3F81DB1789AE3442A9D41D4E812CB79D5956A9AC3144B0915DFCE60F0F81FFC3", + "metadata_key": "4DBCE7E27EC36E0D440AB84EA5F8BB43", + "section_mic_hmac_key": "30DE6D9065BC10A08AA0E19A128FEDA88875C36F07B91F83B03E4224E8A74513", + "section_salt": "44DD945128151D3723FEB2519B34EC1D" + }, + { + "adv_header_byte": "30", + "adv_salt": "ECA254EFD9254459DBDBE5273EA5F20F", + "aes_key": "0BC0403DF4AF8576D78A3BB0D4FDCC07", + "data_elements": [ + { + "contents": "2F00BEF93EA080BEEAA53211087262B08F", + "de_type": 387 + }, + { + "contents": "5A90C81267154FCE624E6CEA5DEA28F2680EF8513A", + "de_type": 446 + } + ], + "encoded_section": "63901363C6D2E7FE3933E6E8C471788DF819C09110008B835CBB4228316A6BB5B90E18A8129490011E6DDE87751A08BDD4CE6EFD8793A3904FC0F36CC6BB1EF5EEA2E31100FE6E7E9A46F882E749F96E2C0661E5840221A3B8A51F54FAB65E9210C9FCB2", + "identity_type": "private", + "iv": "DB42DEB1413B50415B6A102990A829EB", + "key_seed": "D19CECB68227395C94499B9CC6894791C0E82E27127CD7682E7DBD8F9490F767", + "metadata_key": "7D38C494CC9126F3A5BD9628E79753E6", + "section_mic_hmac_key": "D3B48E774D5ACDB850D28528416D9082C05293E9D8D3D1899995BCA079813485", + "section_salt": "8B835CBB4228316A6BB5B90E18A81294" + }, + { + "adv_header_byte": "30", + "adv_salt": "D40604809AE5414A69F499F9A2084923", + "aes_key": "43DA76D20A53C5710A6C8F0F23BE369D", + "data_elements": [ + { + "contents": "6870D2577C383B1AF270", + "de_type": 377 + }, + { + "contents": "807C81B75BE63B70659AE0BF8CF98D", + "de_type": 468 + } + ], + "encoded_section": "569013339274CBE7D243DB20B292B6B966C0D291100030135510DBAFDA8C02CE0B4B744849CC9004EBA03D2B32850AC067301E495DAF062BB6A8F42DD991AC4DB31CAECA481B4EE1C2C26420AE65E5C90E732CFDD1DB56", + "identity_type": "provisioned", + "iv": "D2ED05465CCD69AF9831D0BCEE567D33", + "key_seed": "43F86EBB5F1440944C76F2C1EEC4EA165CD42A18E4DDEED0CA71F3B02545C5A0", + "metadata_key": "21E1FFA752F642FD002CF75F03582A03", + "section_mic_hmac_key": "8D6D65F4C2F58AC8158EF41A66B55AAA11748E33D0E7AA767650575CD25707A3", + "section_salt": "30135510DBAFDA8C02CE0B4B744849CC" + }, + { + "adv_header_byte": "30", + "adv_salt": "926C1D3213E846D408D5CDE85933B335", + "aes_key": "9F95537E5023A014C7F72E7CEB7D4464", + "data_elements": [ + { + "contents": "57CAAFB0DDACEEFAF44DBA2DED57871F9B515547", + "de_type": 928 + } + ], + "encoded_section": "4E901348A78A9E475F21CCDD2623E5AE795ED6911000A053D3FD557046F3B2EFF163A286FFAD90044495EAA257D8CB317317797423C05C60FA98796BE873025FC53D7E00BBA1DEAFE8836981267613", + "identity_type": "provisioned", + "iv": "99D1B79A79B7F1E4847C100368EC5125", + "key_seed": "43D16F607338CC46B1C8FF4BE147FCB700E0B2511657B6F9FF01DDBC2D3A342A", + "metadata_key": "D68EA89AD98D6D24E8B7B82AB7536740", + "section_mic_hmac_key": "32F44768525E151F19138193CDB98D65A034F25E801F6C8F33A82B30FA4D0E73", + "section_salt": "A053D3FD557046F3B2EFF163A286FFAD" + }, + { + "adv_header_byte": "30", + "adv_salt": "F864FB2EEE7E1ED4DF98C3467E48B8C3", + "aes_key": "CC29A730AAE43BD7F30415E1A051A488", + "data_elements": [ + { + "contents": "C6DC7C08", + "de_type": 253 + } + ], + "encoded_section": "3E90137833ACE50465F931877DB7D7AFB960D7911000D27E59EA9C470CA9F69FFAD69B551F6C90022F92AE5F85FDF07BD21B155FCB131B2E5E9CECEB47E6A4", + "identity_type": "trusted", + "iv": "275F908574FBD8A2275047C81C121CD7", + "key_seed": "D2B7827360775208AF3BB8E7490C3C6D5028FFB96EE975FC5734E38222B9ADDF", + "metadata_key": "234339063D81600FF7474FF6211ADEDD", + "section_mic_hmac_key": "7ADB9CA113BCD62008945F73FA7994733668E83A8AB7B9CA91070BBC7815437C", + "section_salt": "D27E59EA9C470CA9F69FFAD69B551F6C" + }, + { + "adv_header_byte": "30", + "adv_salt": "09CAA0D1CD15329ADC186D389540E0FB", + "aes_key": "7FBE39B5E000B0D4D4310F86C0C77257", + "data_elements": [ + { + "contents": "CF5A0E6FC4323ED2962E29A32620F94D", + "de_type": 22 + }, + { + "contents": "5FA1", + "de_type": 475 + }, + { + "contents": "F925E11BAE8107FCA842E3FF3DEDA2B457492AFC00", + "de_type": 7 + }, + { + "contents": "2EF99B", + "de_type": 436 + } + ], + "encoded_section": "6B90139ABB3280E93847008026A21A68DD8389911000410866079E5D5895F00BEF4E871EDB07900213C71635A353B960F1FFF8C887A29746EC545860C2F7A2C9E648FDCA182ED91B9898F8040A51988D57DE0072219221CD042F325A0D7F5E3729F2A57A7264137EDA44A505", + "identity_type": "trusted", + "iv": "068DAEEF03EA46D6FC6CD92C3380A259", + "key_seed": "D1FBE8A8B1F0A0CCADF811DA6E544082D29F06086D81D2292B8C6E74D9D5DF1E", + "metadata_key": "1AFE5CC550D16DE87D2B0FF7E6819703", + "section_mic_hmac_key": "F1C2416FE95371BDE2A956F01F87E4EE9846559BD49E595E7CF12B94B12112A8", + "section_salt": "410866079E5D5895F00BEF4E871EDB07" + }, + { + "adv_header_byte": "30", + "adv_salt": "B52500F5E788EC0D9F202750CAC085F2", + "aes_key": "AFC28DEB740608CEF6933F762B5DC760", + "data_elements": [ + { + "contents": "CC71059E41408063", + "de_type": 815 + } + ], + "encoded_section": "42901380AED3DA4C95EB79F4EE45542D6E0DE4911000E4028B093A498111783EB7DD8699C93D9001A6F9A9F7B35C4BD33BB58A778EE44DED05555AFCEF345B8D569079", + "identity_type": "private", + "iv": "23C6574F20E50D4F213492150AC24286", + "key_seed": "91D3A91830E1799A07EDB05207CEBA50D0028C33A90B491BEC4FDB2125865278", + "metadata_key": "92C66C8FE82E8DBD7E8BA7674E9C6D62", + "section_mic_hmac_key": "7CAA4DC585DA1048AA5D8C6E651593F69CE6271C01908D4029BE1AB88225223A", + "section_salt": "E4028B093A498111783EB7DD8699C93D" + }, + { + "adv_header_byte": "30", + "adv_salt": "F0F4AD67EBA779F535AEDC38D65A50FA", + "aes_key": "C4D22667103D39080515F16B399C2B1E", + "data_elements": [ + { + "contents": "BBCE", + "de_type": 736 + } + ], + "encoded_section": "3C901312715A779B6C3D834913F48E32201929911000317B2985660C6467DEA5DF915C1B01EB9004472D6C62E2DA0443EC06282742414A522F6BB01D1E", + "identity_type": "provisioned", + "iv": "D603605B1B5BBC279CB53CB62864755E", + "key_seed": "72CEC520E533E54D5A1ABE67BE9EDB9D24467FA17223625EC4F9270492D4A112", + "metadata_key": "1CEA77C0C5AE8B84845B85C7B74019D3", + "section_mic_hmac_key": "653ADDF62F68AED4759E0C3502FC0DE4B2090880EF84863E28B682064F67C519", + "section_salt": "317B2985660C6467DEA5DF915C1B01EB" + }, + { + "adv_header_byte": "30", + "adv_salt": "4B6F7D8078261461839557F775072AC7", + "aes_key": "D33613E0E705E3BAF1AB414E7B8B371A", + "data_elements": [ + { + "contents": "4A570A844770D914B0535BCFEFD79151C420E51AA33CA9", + "de_type": 449 + }, + { + "contents": "DF", + "de_type": 488 + }, + { + "contents": "5AB21ECD1526FB43A2E6414C23C7", + "de_type": 597 + } + ], + "encoded_section": "66901382C6BDC0EF1DBBAA998D10EBEC81B61D911000BEB184901DA4A24184AEE1C55976EF7790015B749B64DF8A580F02266F611E8C8C7D4BDC033D3CE18C4945CD0769FA01B9D6DD8FF07789C44510A075008C8C802ACF280233C71C1ABD3BE2599087F83A62", + "identity_type": "private", + "iv": "B9F7A23E2F58C8D71C60140FD2E3BBE7", + "key_seed": "BA82C25F8A56CAD3684A3F58D67C7A86B4945E30D802589ADEEBD5C3D511C0C4", + "metadata_key": "F2DCCC3A2933263D82ED2B297E474826", + "section_mic_hmac_key": "4EE3CFB20981FC63CB453B5E132E5F2288FB721FC1AB883F4E76E6BBBB80C836", + "section_salt": "BEB184901DA4A24184AEE1C55976EF77" + }, + { + "adv_header_byte": "30", + "adv_salt": "D8E5FDD20871FD58731256D0CB62C5A2", + "aes_key": "81F7ACCB7AC20D054E182DF743F2AB1D", + "data_elements": [ + { + "contents": "A6E35C990A736F98F18D46BB8B45BF506CDA38175F", + "de_type": 563 + }, + { + "contents": "", + "de_type": 685 + }, + { + "contents": "874AB6FD2685235570223B8385", + "de_type": 470 + }, + { + "contents": "6108D0C9F1B5E5CB8FB07EB6416867AFB020BE19", + "de_type": 655 + }, + { + "contents": "6EA64895FF65D99FDB904123E5F27EC2F0E9A97AAEE6B538C49B26F8C473", + "de_type": 351 + } + ], + "encoded_section": "9A90137ADF3C84DEBC92F97B49EA4834A4EBE4911000B1E4987063CEB1317DE77C59EB0EABD8900431D8888C02834CB45FE988BF006D1432BF8DB613C713F2F96ED4D664CFDDABEC4319489E16C0007A21759E65CB769F8C96B83998C249F827B6FD8556000D46CD64428BFB6866834ED512101F88D059230260245D767036C70C233D0AB7C08B551D85419007BDEB71A0B1E33189FACB8C9B9F65", + "identity_type": "provisioned", + "iv": "FAB7B8F8457C545C22003AC5688B99A6", + "key_seed": "D9066D7E1EC8750F01AA286D6C0EDFFED57F08E546D4BCBC37F11E1884D2737F", + "metadata_key": "2847567D7BB29F859D0A6BC885863F05", + "section_mic_hmac_key": "A2040734F9568DB02016A4F637352BA3E9170A92EC7320BE2806396ED4827FE9", + "section_salt": "B1E4987063CEB1317DE77C59EB0EABD8" + }, + { + "adv_header_byte": "30", + "adv_salt": "AFDD41BE6280A05A4A182FDDBD8556BC", + "aes_key": "1DA3396BF0DDA834C815856E590D10B1", + "data_elements": [ + { + "contents": "9B41A639FC2D04D26CC0D9EAEE9D214C127C481DED57FBEC2950852964", + "de_type": 261 + }, + { + "contents": "F3E90E9164C65F910F9AFC0D3D91107C46A0A18882A25C6B35", + "de_type": 797 + }, + { + "contents": "181DB352E5D07F6195FE073994C661459C171C9F109CBD715ABDEE7D", + "de_type": 733 + }, + { + "contents": "53161D8FB05C583C438417F60CD2C593088AE431304F3BEFF1E5B937", + "de_type": 26 + } + ], + "encoded_section": "B0901306299081577F1C9415828166669B1282911000818F17425C86B46D19F4314DC23929F09004EE71DC1AA65D63AA0CD9DE7385172A9753FE6A42CB6EE3A75F4852C60B9081648278D22C0A2E6708BB2E4949086D1EFD6E4CFED85A6405F8B1CAA3C3DD14DF4160D4D590345D89AC83E27AFAB4C16238740466504647BCFEBD3B97DB4E0E94CAA14965A1C1F20C6589C7AA7E0F7B1B22678432254FEC8D79A0029DE579A4F35A1DD424468BD60E00F8", + "identity_type": "provisioned", + "iv": "D6C941E5267C2582F6BB2979EDB74CB3", + "key_seed": "EA39241FCDF3BD8D9C8F1D804A9C415F255924EA22EB3259B9EA106F84CA7A04", + "metadata_key": "1EB0839E25260819532489218DAF085D", + "section_mic_hmac_key": "724CC97DB96191B388126C7AD9192181B6DD813C09AC9101073C4189297D7450", + "section_salt": "818F17425C86B46D19F4314DC23929F0" + }, + { + "adv_header_byte": "30", + "adv_salt": "08EFA9C40E0A0036570392CD33DB1F45", + "aes_key": "56C7B28E8595C1A33D39AB4F8B140F29", + "data_elements": [ + { + "contents": "C69770", + "de_type": 273 + }, + { + "contents": "ABE13AA30EC88530", + "de_type": 592 + }, + { + "contents": "D53E9C2881E7EEF2", + "de_type": 940 + }, + { + "contents": "A720A74DB9EDEC417C2C55A064353336D8EB0F3AA7B3", + "de_type": 443 + } + ], + "encoded_section": "6C90135C7B1B79CD9BD45F21FB487249C913FE91100003081F0A5D56CC9F2C4A87EADDE0070C9004792D26E35675BF2F6FBC982F307C53936F49AF1AF5D87945942B78A15F8BBCC14021660FC4F8E4B00DAE05757A14C346EF08660F04A2F1BA65FD0E48190779C3C0689BAB3A", + "identity_type": "provisioned", + "iv": "61E889286F4D0CEEBBC96D05B3742610", + "key_seed": "A4AFF6856A7095C4B9DABDB1515C4407FAB5B905D0D58D798BD812842FED8CA8", + "metadata_key": "9FB8CC22E26477665685F51D727B2E09", + "section_mic_hmac_key": "1A637F0C06551F322E26314D9642C2DC7ACC72C9DD953A548B0B5F4E4EDB76CC", + "section_salt": "03081F0A5D56CC9F2C4A87EADDE0070C" + }, + { + "adv_header_byte": "30", + "adv_salt": "37AC5ACFB5D9A0305EA7BB5CDA443D11", + "aes_key": "E6D6BDD49482D54AE9C5AB69142256AB", + "data_elements": [], + "encoded_section": "37901372E83A536FE8DCE79BBB6DF0FC4095599110008E387F351A94036BFA085A8F6864730A9004464EEE74741C2C2629FE91C5502736DF", + "identity_type": "provisioned", + "iv": "B137733181B7AB2C833C606028FB6B22", + "key_seed": "F6D27F4E02DAC7253E0907998FF49D7A39391439377AB5EBE1F0137C336A85B8", + "metadata_key": "FA450266B083FBC3EB2C8692E7F5DBA6", + "section_mic_hmac_key": "DB503A7C3D87F83AA4C66220C24657F84518AF6140D55CCDC1EE611A3C20984C", + "section_salt": "8E387F351A94036BFA085A8F6864730A" + }, + { + "adv_header_byte": "30", + "adv_salt": "F7E19D646D39679C29404EE3B6A34048", + "aes_key": "5E08BDDDBAC3331F8D8446C868788EF8", + "data_elements": [ + { + "contents": "01F8CE76B237517269F2CDEA51F7B8", + "de_type": 445 + }, + { + "contents": "DA9EB0A51417DD89A87E69E1B3116DAB", + "de_type": 636 + }, + { + "contents": "9B6FBF25E22A186B2F1367BA94A80D880D647179BC392A4A68B4E4DB90", + "de_type": 635 + } + ], + "encoded_section": "7C901342E89E1476F32CE4BDA127349115775C91100064F1AABAFC1A089A905BC9C5B4AE2854900149E174A599134E70CDACDFF18247C44F80F02090E0AF6DDAD80132F4843EC9FF8CB591D31FAA203E9AFE269A7F76A7E08AA0035AC8359CBC7D74DB6B6612CA9BBC657D9BD9B1F6615050A3D8A690C7AFFAFA67F7EA", + "identity_type": "private", + "iv": "1ABCBB904C64337AAB7BED61676CDE36", + "key_seed": "A004861A769F72CC50175CF18E439570E9ECEC2C784AF1B05B2EC10B40E05901", + "metadata_key": "8A5B72CB0CD76DFACC878DC16F43896B", + "section_mic_hmac_key": "6AB27792A42D0A05941D5D1431346BE6B5F245A6F137FF63E8C101CC545C9E0B", + "section_salt": "64F1AABAFC1A089A905BC9C5B4AE2854" + }, + { + "adv_header_byte": "30", + "adv_salt": "034796B51E627F2138D8A4FB86959B34", + "aes_key": "036A24D477FEE94B8906821BFB6CF3BC", + "data_elements": [ + { + "contents": "28DF05F4C663510E51CE9C01EC46117A1C", + "de_type": 524 + } + ], + "encoded_section": "4B9013F9761369F75CFDCC25753E3962A266679110006E553201E38251B2EDC4E36504D7D7BD900185791665A709E7D80D9B1D7C4FF9C51E0A486C6AE1B9C63B0D233D845580067782694D81", + "identity_type": "private", + "iv": "2C13274C3949E9003F13C503E031E9B7", + "key_seed": "88C9ED0E90F51DCA3C12A6AD22F4639B8B8E7C276F98E94164837BD2C45C341C", + "metadata_key": "DE936A57C9D6BCAF001EC964B6C5EA04", + "section_mic_hmac_key": "70514EF46B1EE66FF24179E86CADE9551893991E76A99E8D10C70D2297F760E5", + "section_salt": "6E553201E38251B2EDC4E36504D7D7BD" + }, + { + "adv_header_byte": "30", + "adv_salt": "46184E36FEF285DC6E4F57A9C01538C2", + "aes_key": "A200BAF46DC86EE97B8FE5EEDB22CB4A", + "data_elements": [ + { + "contents": "632D326CE5387E432410DE871CC167BB760657E21D", + "de_type": 421 + }, + { + "contents": "F36E9E2F130BC0254E4799F473D372C3486919", + "de_type": 130 + }, + { + "contents": "DEC218926E9C715196096355C86AE17311DC256F49", + "de_type": 172 + }, + { + "contents": "06DA3BDE65C616FC1F", + "de_type": 348 + }, + { + "contents": "50F9FD", + "de_type": 319 + } + ], + "encoded_section": "8F9013FC2BEC7FB7E301EA360D6B3C0A0FAC6A911000DEF111A18B8FA9C6C326D4054421021090013023A39CD835BB827B0477272151FE970F97748FA2B575EF993BBF6175CAE761A96E3F9FB81C92A9AA6D9B06A19A5C3A88D601D1A67CC00C5E926A7CEB87EF0BAF0FC4F3B8A0925184D187CA130D900364D10122CA3CDBC30A6639B580198D459B88773B50F2EAB0", + "identity_type": "private", + "iv": "45EF8ACF1EA3FA8F1E19CBDE20594893", + "key_seed": "068098719BD63AAB986B7EA1D5881F6963A30AAA9C2E80E40059BAA15F0662FD", + "metadata_key": "B1D87DB284A2982EAA53C596995FCE88", + "section_mic_hmac_key": "258571568C4C153AE5597025CD6DC193B300B6A2FEB89A24682E7934414D5DFD", + "section_salt": "DEF111A18B8FA9C6C326D40544210210" + }, + { + "adv_header_byte": "30", + "adv_salt": "0DE15B10175F1DFF2628C70D0AED6B46", + "aes_key": "E90504071197BE226CD357D5E1AFBA84", + "data_elements": [ + { + "contents": "A2531C952A42C417BB18C97ABEBF39505DBF6730C079B7D7", + "de_type": 497 + }, + { + "contents": "D0F28E7F9B6967A9199BC8B7D02399E87CD4C29995", + "de_type": 239 + }, + { + "contents": "", + "de_type": 210 + }, + { + "contents": "493816D45767C5A9", + "de_type": 684 + } + ], + "encoded_section": "789013F48A6170B368DC90652516A11336D98F9110001F72FEC00A10F48A24F0BDC9E209A86090016DE45596DDD682BDB0CB6D432842C6653E61E074800DB1AD134A2D06A0F9EA32A67D3A000C3CCF76E2F12D59EC4C570A1796ED6DACA5428E45C9A071BB382DC283D4E67F77D5624D4F8DF9C8192ED8967C", + "identity_type": "private", + "iv": "628959806C6FD40FB815F90B8E383C92", + "key_seed": "38B809FA67BF591F2FC3ED5E89FF69196E8CEDBB2C70A5C4214FFDF0C6720A89", + "metadata_key": "683AAC0A90779BD7E8E6102C59C33CFF", + "section_mic_hmac_key": "9F76A1AFC8EC596D5C12E7B2703DAAB5C2147A3F152CEDD5569C004568545419", + "section_salt": "1F72FEC00A10F48A24F0BDC9E209A860" + }, + { + "adv_header_byte": "30", + "adv_salt": "A66D131470862B0A800CF36CCAF21F9B", + "aes_key": "A4E365EA6FC7E436B0803863A359E74F", + "data_elements": [ + { + "contents": "37F6CB293369D0AE08C0CF498F725063BC941429D4748D88C1F5A8", + "de_type": 440 + } + ], + "encoded_section": "559013340F4D1F8D98CCC159758FEFFCA24CB99110001549A78B42DC99D25E0FA7D7DAB336E0900461A9ADB4F53BC3EA94A61A8C9486F83C5A94D311D481D1E1C4B98FADD358CEF1E8C9E48997577EE881358BF6C720", + "identity_type": "provisioned", + "iv": "2E46CC58F90B1F259763DF87D28CFB5B", + "key_seed": "866216209CC3BA31A0CD00FE866C661906FD82FFFA1AF1FDDFE05CB3FE5D160E", + "metadata_key": "6E43E73A2F75C729FFC5EE5FFBD37BE0", + "section_mic_hmac_key": "386FC2463C51822E0D2E18CF7A0CBCA1A2259F0F97DBD49AF0CF76A070BDC5E1", + "section_salt": "1549A78B42DC99D25E0FA7D7DAB336E0" + }, + { + "adv_header_byte": "30", + "adv_salt": "DDDF41B6ADF98A34F574AD71850DE058", + "aes_key": "B737AA1DDDF85031F002DBE5C45F3E20", + "data_elements": [], + "encoded_section": "3790135EA759302F33AEF062217EBF5A4B65E99110009BFAE224D28BDDB0C9CC5D46415FC3A09001084F44EB87F5634E839BEE652E071D6C", + "identity_type": "private", + "iv": "10C16D86C9E0BE1F6347112C21D5FB8E", + "key_seed": "E6582A2C793283D86BE936BC765C9EB0512329DA8952DA2D43DC010F82ABDE73", + "metadata_key": "860157134E0A0D7293D61B43F2587D9B", + "section_mic_hmac_key": "2506BB15AF3D9F480145093EFCC12190B38AF4BF2645C2120B4BD2CDE4F40C28", + "section_salt": "9BFAE224D28BDDB0C9CC5D46415FC3A0" + }, + { + "adv_header_byte": "30", + "adv_salt": "628478EA2295D16F6B27D99F0A27D544", + "aes_key": "78D9C68A8B7E0EA68509955971559804", + "data_elements": [ + { + "contents": "4933BDAFCB68075E6CC5A5423F4C", + "de_type": 795 + } + ], + "encoded_section": "48901379A1BB27F73791D000D5228DF7C135D991100081BA33E21FE4ABED1A04C9D95BC2D6B49001FEFD2CC7172F6DA36547950D23EFD1F9B487B44DF40F4E3EC3F0DB2C10C86272AD", + "identity_type": "private", + "iv": "93505D7F5898E41D69F7EA457DE34D54", + "key_seed": "0C8434F9786244C9AC393011DF523CDCBF30DD322487316CA06424819AD2BC67", + "metadata_key": "2129E9F8F1D9A4599073E55B273AE84F", + "section_mic_hmac_key": "1F04FFA93D7247CD23DAD80C54D3A02C0F6805F05D593A7F1969729E2B66E149", + "section_salt": "81BA33E21FE4ABED1A04C9D95BC2D6B4" + }, + { + "adv_header_byte": "30", + "adv_salt": "6636A8179A7539B6C145AB036ABC61DB", + "aes_key": "52871CCD3C531DB8ED5E0CD2B9408382", + "data_elements": [ + { + "contents": "4AF0AB96E0D92C99E994BFCE92BE3294658B36", + "de_type": 653 + }, + { + "contents": "4950FA0E9C1DD840913D09DFC7801DD66057D63E42B231E7", + "de_type": 35 + } + ], + "encoded_section": "6790138403EE19A982413945659E727142CBDA91100060ADDDBBA5581E0492927FEDA1839F849001858A8DB882908AB6E59B43DD60DD864E39280BADE1F2263C2BFDB26294F6DD996C7EC2DBB9966A9E022C78D8B31C8A94D77E708F405B40AD605E35EAA7AD2B6B", + "identity_type": "private", + "iv": "6FCFFA1DD673BD46A33DCAD5D78A0818", + "key_seed": "435D4CFBFD90B09EB4FCB8618F4F3126B3941B90CC7781365ACA74B7C2419339", + "metadata_key": "720D20F73E7ED7BD2CFA70320D90CB4E", + "section_mic_hmac_key": "22C29F385E3F714233A8934D6D44C0F3F1FF950C26AF4786B49A3EC81A71C98A", + "section_salt": "60ADDDBBA5581E0492927FEDA1839F84" + }, + { + "adv_header_byte": "30", + "adv_salt": "C19D8AFBE64F931379D7EBF939CC24A1", + "aes_key": "9EFA45E698A339160EA80DF0ECF36499", + "data_elements": [], + "encoded_section": "379013B9692752CF3F41AAC03CA730A6AFC85C91100061DD84CFC18E2CBBBAB60CEB86ABE6D690013AAD9F2BF775CB780D9D8E13858974E0", + "identity_type": "private", + "iv": "BEB8CB30E6ADB86DEA9E572D0583A578", + "key_seed": "27A648DE4BFFF66325913B794954218B87ED3D79662BE80BC4AA978B26878ECC", + "metadata_key": "5DBFC0AE842BFC1347055279953E9BC6", + "section_mic_hmac_key": "9DF3EB07A1D92235053FE039F478DD9CB6A554F79CCE713C5C813019099ACE9E", + "section_salt": "61DD84CFC18E2CBBBAB60CEB86ABE6D6" + }, + { + "adv_header_byte": "30", + "adv_salt": "7466F38050B9EEB5A0B483CB30465DC9", + "aes_key": "EEB41F887877D842CC4EAAA67F83610E", + "data_elements": [ + { + "contents": "5E96DC1DBC05740A894EDA", + "de_type": 560 + } + ], + "encoded_section": "459013D0902F2AB5972B41BC0ACAD9B2261DB6911000E35AA601D5935057BFCF03242D9BBA329001F2F956F617516A1DAA125A88C54E29A596932F5579E7D6D834E3B879E6AE", + "identity_type": "private", + "iv": "77EEB2974146266D349B9088200A5905", + "key_seed": "92B2AE2BE975A24FDA5C81265161B32E9C3AB9766B0DC2D0B30A4FFF8B996572", + "metadata_key": "3A4EE38FEE87B6F7B68270402F9E3958", + "section_mic_hmac_key": "2E0ACBD90AA030C11B3784BC17D59DE09E11094317E45FFA4169516A3DBE7C49", + "section_salt": "E35AA601D5935057BFCF03242D9BBA32" + }, + { + "adv_header_byte": "30", + "adv_salt": "8122FF813F37EEFC5DDF551646A94693", + "aes_key": "788ADD1E00191939A9782119A5E2094B", + "data_elements": [ + { + "contents": "710E0E6A6762C48EB92508787416BFCA6F", + "de_type": 714 + }, + { + "contents": "24C9CC8AA0E42CD275", + "de_type": 396 + }, + { + "contents": "29867AE4823526C2E11B419C62", + "de_type": 632 + }, + { + "contents": "6E5B1B035D83BA417C8ED1FFD0571C24F4C0E9EAB9342F852FDA", + "de_type": 596 + }, + { + "contents": "1A515A8766EF2E", + "de_type": 702 + } + ], + "encoded_section": "8E90131E8C489B1336454D3128B130C4134236911000F46F979A1B7FD0A2A5C73E3243A8FAA6900483E4723D8227881FF2C1F5945F3C894A7772752A61B67F9B5735667C9C1B06665CDA3BAF634A498B9B5F401D0DE765E0C3C6A51755C948CC3C196A7B4C79CBC2F95A4D968B060E08FD8170F96B8C13E48FD125BB6080672950A8359D6F1CC7DDA17A3642F19C54", + "identity_type": "provisioned", + "iv": "D27F64127716122FCD1CAA9208F77EE9", + "key_seed": "BDB0A9567EBF4EA0C328570726D21525495553082AA9CDA9E5D64AF80F45E64E", + "metadata_key": "65504F6C8B7E976ACE5E952FC5FED4BD", + "section_mic_hmac_key": "B6593C39E6D71521EBC7CF3AFD16E1E6C949CCFE6C94139B93213D443C4A7A95", + "section_salt": "F46F979A1B7FD0A2A5C73E3243A8FAA6" + }, + { + "adv_header_byte": "30", + "adv_salt": "307E6BFCF6A782B991CC2A749B09636C", + "aes_key": "6DBEAF71EE0D2A9DA8AC1029F2DC4345", + "data_elements": [ + { + "contents": "CEB40AC198172437DE1BB258C1FA08291A70B949500E30BF", + "de_type": 199 + }, + { + "contents": "7CEA871566BD69B35E3A775D9DD09AFD0B", + "de_type": 458 + }, + { + "contents": "FF2D5A9236A40ABEDA2FD0847FFA45532475", + "de_type": 957 + } + ], + "encoded_section": "7B9013ADEE4B07E8BCBF39E2EE45BCB9936BA4911000866FF3E8F11D08BB28FC9A2164C3452490020D0C51AC4563D2DC3CB268190F86800DD0CE78B2F4F0133A4F91C1A4487E068364F8FE0F99246BCC25632D849D0FE3E736800381E2344F29D37AA35301B9F0BFD37E8C41DA3F53748103C55EBB0C4948C5EF306F", + "identity_type": "trusted", + "iv": "59BDFB301F008CC7E84C962512E1210A", + "key_seed": "F37001F68E3C17DA62CB445F3BC5FBBE1B0830EC43DD07D578A4E4AB93A97BF9", + "metadata_key": "B18E09134D29AC36E182306B8E741109", + "section_mic_hmac_key": "EEF9ED52B0AB9B2B9B98E4BC115730A79D864479BF14ECDF01F8A22AD23C4EE3", + "section_salt": "866FF3E8F11D08BB28FC9A2164C34524" + }, + { + "adv_header_byte": "30", + "adv_salt": "BFCF368DFA6337A5BA78CF4B60B08E3A", + "aes_key": "7B27B37D2C56F0B288D61271E9F697A5", + "data_elements": [ + { + "contents": "AD849E", + "de_type": 717 + }, + { + "contents": "F58E9B4BF3EB58DC7F", + "de_type": 556 + }, + { + "contents": "34AB62E364A56D0517E902AF49", + "de_type": 839 + }, + { + "contents": "885B928824E57AD5D4FD8A70A59A78", + "de_type": 483 + }, + { + "contents": "03EA0136C4685295DA9A77EDE4A8C1E9EDF7871B", + "de_type": 671 + } + ], + "encoded_section": "829013B346FEBBCF63B0EAB3803D13636BA71391100071DB218D918D828C92E0204CFF4B611E90019CFF0B8A1B3FE54FE239B42BC4796958C108B1C88A768B734BBE536CFC6610873D309DC76A67AC9E17767D6190361A3F6C2CF17B58FF16A9FDC2C500A183F07FBF578CE7A0308800E9B98EE9D42405320EEE6B6016B0B05C96E6C8", + "identity_type": "private", + "iv": "C53DB4F70A67DE7DF7307CA6171F3BD2", + "key_seed": "5E2B18C1833B41338025453418B8B8395C11EFE691C8EA7E763AD464DA64EB76", + "metadata_key": "B23210152FEECCD9598793E38B2CEDDB", + "section_mic_hmac_key": "EA04B6A0DC8DF1B4703A0F3C1B2CB76FE339295CBC5C34ED626D8CA9998EE78F", + "section_salt": "71DB218D918D828C92E0204CFF4B611E" + }, + { + "adv_header_byte": "30", + "adv_salt": "DED5FE514596D4F6FDC651F4401A1285", + "aes_key": "21350A13179CD8E8DE946AF344533A28", + "data_elements": [ + { + "contents": "7D4DBE88BB3F4D56AD861F", + "de_type": 73 + }, + { + "contents": "F95B18F59E", + "de_type": 982 + }, + { + "contents": "02D2A88797C6763C73BE592A2AA8C4B9236F9D", + "de_type": 832 + }, + { + "contents": "6AF8E9C04E1C42", + "de_type": 91 + }, + { + "contents": "111046E7", + "de_type": 187 + } + ], + "encoded_section": "729013E6D0C9F2B312B4FBC87905D44CD5E75A911000B55AD57B5E62C64382DF184E318BFE5690013F8096D9AA8FE721FED8E1732C0CA8A385307A136AEC083D2C1D73EA7113137B23A3B2B001EA0724492396E0282A267BE561B1528F994AEC04DA56119BD003808B010FD2F692A3801C03B1", + "identity_type": "private", + "iv": "D4C3B01CA68065A08589F17A43EF28F5", + "key_seed": "4FF752A463D1E2C0D678C24320449F18FCD0746909FCE6FDC1B516D72A7C1CC9", + "metadata_key": "7388750D8003EE00CC5F84E1409B12F4", + "section_mic_hmac_key": "939E08A95A08847810EE6BE0708474DCF4404FDE883B6378CAB938B76E8BD12D", + "section_salt": "B55AD57B5E62C64382DF184E318BFE56" + }, + { + "adv_header_byte": "30", + "adv_salt": "CD9E10B9F020174B29E5AD90E0E7084F", + "aes_key": "141D0AECF29D4ABE5B4D665284700976", + "data_elements": [], + "encoded_section": "37901351EBC383C07087BF0D7C785964C144CC911000E40E382B6E96BD40764C5F0D5415D0279002D1951D7B47B5F5853EC55EDA09251A97", + "identity_type": "trusted", + "iv": "6D1D36994AB7C4A0EDF441816A844237", + "key_seed": "247D236C67F1F56D1ACD8817170F45C500530BB9D122900272CC2E8A30A89359", + "metadata_key": "39B3703CC7908B83CF3B53A3238565EA", + "section_mic_hmac_key": "21EB0469854E8E7DB1904AA28BDAD5869B325E8E6B116E216B327A0DF9B70DF7", + "section_salt": "E40E382B6E96BD40764C5F0D5415D027" + }, + { + "adv_header_byte": "30", + "adv_salt": "03A133AE87140BE18A3EB46B94941E52", + "aes_key": "9589F697EB5E5F3D2C1683B41215C4FA", + "data_elements": [ + { + "contents": "FFA5C5", + "de_type": 787 + }, + { + "contents": "30EC973D18D69C314A4DB86B47B73786D996EE5BDD1EFD7056", + "de_type": 739 + }, + { + "contents": "97D8216B95BC62D8B6A24918CF8F0B6EF86BA3189A0D3A75CA4CE0EC8BFE", + "de_type": 704 + } + ], + "encoded_section": "7A9013CA7679919FE47E62BD141812222962C9911000538B7CD44D330EDE7EB3810E2976BE3B9004B8F73A0634838BA4090A034F8AF96FF12A174C058DD82300D11D28D86109FD09F788CAB9E55D989073D594FAAFA7AE3D67456CB956D78996FEF9D0B9519D60BF25B383AA1559495B7EFD3D903BE11F816659DD", + "identity_type": "provisioned", + "iv": "2CF79EA2D302D0652647EE01347F48C9", + "key_seed": "C9BC1C391B0EFCFCD4B29D9C159DF75D040C4383251F2918B5675A149A6413B9", + "metadata_key": "74C107B8323774F37E4E2A54503915F6", + "section_mic_hmac_key": "E52B5B1FB65F064CAA5F7602FD57755AF4E2615FB78019B51541FB7EECF535BE", + "section_salt": "538B7CD44D330EDE7EB3810E2976BE3B" + }, + { + "adv_header_byte": "30", + "adv_salt": "3AE4359592BF7F201084BB24660C771C", + "aes_key": "B8773C17826A4385B9284B3589766262", + "data_elements": [ + { + "contents": "DC71AAC54ECB1B47647F31E69C394FC4AED39298C6", + "de_type": 62 + }, + { + "contents": "EC2D", + "de_type": 37 + }, + { + "contents": "C79A5EDAA0A03DBC18678509", + "de_type": 107 + }, + { + "contents": "74F8", + "de_type": 677 + }, + { + "contents": "1E3926BA0B", + "de_type": 957 + } + ], + "encoded_section": "6D9013E5E33AAF3D46ECD6E7ACDC59462B6BD491100016C31481FBDA8F5298370904482F6B0D9002CECC579F805F85B4FDF7CD77CAAFFC9F702C00F4EAFDBDD6A7B88A6F41CC4D299135CE06E2A1F852818F6E08D69AF50CE298BE2F506FEBFBE601E97F17A324501BBBBEDEEAE8", + "identity_type": "trusted", + "iv": "6142669F10695320E11C7EA40B354D1F", + "key_seed": "32A9BAE8DE4585B275D88FB2E96D02B59BF865964276A9C6C3E847953AAE090F", + "metadata_key": "23347E850700388424B419DBDBCAC33C", + "section_mic_hmac_key": "3F2036BBAAE4896B8DD2D61A0F698D61613B4BE0B4F19660B6BEB71294B46817", + "section_salt": "16C31481FBDA8F5298370904482F6B0D" + }, + { + "adv_header_byte": "30", + "adv_salt": "6D656A4E2FC03D80DC3B6513FA2F6F99", + "aes_key": "9E24A3900D6E56EACAF9A3F141FC042D", + "data_elements": [ + { + "contents": "DA8064399B756E", + "de_type": 292 + }, + { + "contents": "ACA505B2F1", + "de_type": 97 + }, + { + "contents": "00E6055661B70886AD75E59AB2D35846", + "de_type": 461 + } + ], + "encoded_section": "5B90137BA9E7F1BF772CEF94B3DDE2E8F230E7911000FE36015D37F6E2747DD1786609B9805790013F0F6B3758EA34EDDF61606E0A6FF7E98129DDFAC299DD07D45094A490496F3C4C479C0DDE225303DE62051B03CD6E59080B259C", + "identity_type": "private", + "iv": "F48F5053B7CBB0D2278CE266444D173A", + "key_seed": "3A0DDABFB9F1B1289651514C2F2BFA4E5907BFB05A34320064EF1D3DEC357CC2", + "metadata_key": "3A2FD2BE39A37010435F2EC8567BAA0B", + "section_mic_hmac_key": "9EF5C5CFFE0C3EEC958D358164165AFAF42350E0A7E930A8D6052C334BF4C3F2", + "section_salt": "FE36015D37F6E2747DD1786609B98057" + }, + { + "adv_header_byte": "30", + "adv_salt": "980AFFFE379C22B79DE841EDCECEED5E", + "aes_key": "CA4B0DE90665264505C4CD89237FC2BF", + "data_elements": [ + { + "contents": "C871A9B1", + "de_type": 695 + }, + { + "contents": "4F174A736E938697E7A4EE944DE19CD2921EFC1456CE9A5E48EDC9A058", + "de_type": 921 + }, + { + "contents": "8451A82242DCD1E5E990A47E2B710B", + "de_type": 792 + }, + { + "contents": "ED", + "de_type": 822 + } + ], + "encoded_section": "749013335E6ED7B39E6DAC22789B547DE11CEB911000A11F350D23470D8D6714C4C5025E7ED690045992C6A6AB032F0743FB9C5C76DA9D27BE1B7896DA8473DA5305E1EDEBA7FF83B153DEE304349FBE73B34E47291F64350A2A8CF88250291CBEE24A62FEE68799E245C09AC54A1C01314CBE10AD", + "identity_type": "provisioned", + "iv": "FBF7F6587930B12B75185D427824D820", + "key_seed": "01AFED11D971E1477C49247EFA03A233971ED579A3D54BD6EA1F735E1DACFA69", + "metadata_key": "06878DE1EAF8F6CECDF30CFB61C4A20F", + "section_mic_hmac_key": "57B4D6F98948B6EADF732619716977F377438B038ED51BBBE9DEA245F660A799", + "section_salt": "A11F350D23470D8D6714C4C5025E7ED6" + }, + { + "adv_header_byte": "30", + "adv_salt": "142D92DF381FB02ADA5BFBBDB3194225", + "aes_key": "EF29932C9885D543FFEC36215E5C7D8C", + "data_elements": [], + "encoded_section": "37901306A47A102A3519418B25A673A5F52904911000297D7D672519392F14F37525A0A77E1E9002C478C7D3D651D54D047F7D8DA3EEA47F", + "identity_type": "trusted", + "iv": "753CC945341DCF47B1AC1615D664131E", + "key_seed": "C7F29427E4BDF07FFB51959101758A7034EA2A2E3441E719DFC10633AA1532E8", + "metadata_key": "F5CB77F80D986B392A01A036D807050E", + "section_mic_hmac_key": "39F6B1ADF27329472F39BCAEA60B1A75B68C8CF921FE68DE7A0CB5280A0A7565", + "section_salt": "297D7D672519392F14F37525A0A77E1E" + }, + { + "adv_header_byte": "30", + "adv_salt": "9CED41C417A0C7A7D1A660CDAD238B3C", + "aes_key": "1B214359E8F6A0A67001E9763902678C", + "data_elements": [ + { + "contents": "33", + "de_type": 916 + }, + { + "contents": "33D198321B338170A869F5085BB5C78B0551E2A5223599B1A684", + "de_type": 423 + }, + { + "contents": "46C92249B50D", + "de_type": 801 + } + ], + "encoded_section": "619013CD128065A30C39221D969E1F403884AD91100045A40C690EB4CE8A31994874C36EE462900281E30F108565FFA512ED054F474331ADD12B4F12F9C772B5951C86183268ABC15B171D58A35B3491EF58AB10CAAB690F816686CC6EA03EA6BF55", + "identity_type": "trusted", + "iv": "9D7191BB69D4CFEFA0C02406AEE9DA24", + "key_seed": "2E54E9BEE7263BEDEF24DF26B14D0568D3122209AC5242CB266E7AC650B82FE5", + "metadata_key": "55A4DC9840046632FCF02F5A3D8A21FD", + "section_mic_hmac_key": "7AB0218829879A7518E725ADDC26869198DF9A790D6F59E1A813B8F0E0D83747", + "section_salt": "45A40C690EB4CE8A31994874C36EE462" + }, + { + "adv_header_byte": "30", + "adv_salt": "D9EA401291CA51C522CAB05537839268", + "aes_key": "2A29ABFD0A8B0B9DBBD433BC6FBF2694", + "data_elements": [ + { + "contents": "D65B4F2CD54532FF49DCF70BAE60834255889E4C0B84EA00A597", + "de_type": 897 + }, + { + "contents": "", + "de_type": 672 + }, + { + "contents": "4381B746F456521012706DABA9E514", + "de_type": 247 + } + ], + "encoded_section": "6990132DF63F223549475A6E9136749C83E4AA911000384273880FCA6E5CC28BEBDE3F02D7009001D4155F568EB768FDB8983007689B9F0BDC070243F3C1397F7DB5D70A2EDB97A39DFEE8D55A8AA282A599849FEC4AF90A61A54A01D407DA6CF9AA89C8492164483C13", + "identity_type": "private", + "iv": "9FCE9E12716169DABB86DDC631CEBBC5", + "key_seed": "D12E1DB0961229C72F7A1F9FD2E03A575B304EB3CBC77D6787D2A00D76348A29", + "metadata_key": "39437BD0EDF1F0AE69E6C168EC28910B", + "section_mic_hmac_key": "3FB5E39551A2434E164547A99C8572C213DEDAA602680E7573453FAF22C2D892", + "section_salt": "384273880FCA6E5CC28BEBDE3F02D700" + }, + { + "adv_header_byte": "30", + "adv_salt": "52E5DC1D919E92A17EC425D120EE446B", + "aes_key": "1070D36A68639C052708BDD149C76B0D", + "data_elements": [ + { + "contents": "0691E0D075CE0152FAA8BC5ECE77F1FD8715A0", + "de_type": 193 + }, + { + "contents": "6748926F6E2859A23BC42442C9A67286DE92581E8CB6C438C934522AC6D5", + "de_type": 452 + }, + { + "contents": "C05DC7EAE1890C046D11C3A09F", + "de_type": 18 + }, + { + "contents": "750A482F94219F642DAE0BB5731CBC8D429831078788BD23C97ABE9C", + "de_type": 410 + }, + { + "contents": "50C92B13EFB267255543274EF78B39E26E13C4B4F41CB9FC0C5132F1", + "de_type": 947 + } + ], + "encoded_section": "BB901336682108499C15E3C9A3E960E1F0BA779110002BC1ED01E66270117CAA0CD05F05809890046D989D2205B8E302C5466A2316960D9A353C986CC3CEC221D254C1CF319898253B6EFEE1C58519F6DE75054473AD0B52AA87A8B589505B46AA814B222ECCBC43B52461DEF067D9A1D5BC34AFC835B04268E040DCCD08BDF7ED3B752D5CBB69C098DD782514EA0D4B085BFCFEC4A6DE1004304986AB4CCFA7ACE721070AAB913E3A1570A80638905137012669EDA49034BC143CA2", + "identity_type": "provisioned", + "iv": "638C93531115E6D017707DE649B22BFD", + "key_seed": "6114574A94E6D39027823764C6CEFFBC698CF543C7FFDD43E649CC447A84C1C4", + "metadata_key": "B27C10EBBE24E783576D83E48C9318EF", + "section_mic_hmac_key": "912A9018303053335B666556024E27E0DED70D189846A2FD0946DBCE9C5DF1B5", + "section_salt": "2BC1ED01E66270117CAA0CD05F058098" + }, + { + "adv_header_byte": "30", + "adv_salt": "8E7A8AD9FEB5AD035C6915F3978DCD52", + "aes_key": "4CD663AC711C40F5E58CCBBB5612D69F", + "data_elements": [ + { + "contents": "1733D5DE", + "de_type": 202 + }, + { + "contents": "6F7CDC83033D", + "de_type": 849 + }, + { + "contents": "5CDC08111E0B1D094075ABCF883D89DA6E193CC7781A30", + "de_type": 291 + }, + { + "contents": "78", + "de_type": 295 + } + ], + "encoded_section": "6590133E0D7409282A63D00B1043F3FDBC8962911000B9E781A89DC0DC26E307F2DB5AE84E859002079E2F53C842642D1766655B3CD0F95B8EEF98FBFEE2B6551EEDDD58AEFF4EEE8B1184BE4DD778D241C7D19A23F45F33B182D6F2E3D4B214189BDC3E07E9", + "identity_type": "trusted", + "iv": "AAFB4982D1299671CBA1E5169690CDCE", + "key_seed": "1C0AA7DE5CE402F06C25EBEBFA297A7B8CCD03AE2747C549ACD657BC10A6617B", + "metadata_key": "4F8EE08FF29009BACF5DF132DFD9FAC7", + "section_mic_hmac_key": "57457810563B685ED78C42BAA44DFA37C84037B6D733079E5BF408BF8DAA63F4", + "section_salt": "B9E781A89DC0DC26E307F2DB5AE84E85" + }, + { + "adv_header_byte": "30", + "adv_salt": "F368D766AD577D0FA2BA4EAD2AA71F16", + "aes_key": "1ACB9732F1E49D43B9F2F6DE5F9EA426", + "data_elements": [ + { + "contents": "AED88C9593D7026A7E5FBD645A6CC0", + "de_type": 756 + }, + { + "contents": "29366161EA3148D44306A03FD2B1B9B64C9D54BE45AD", + "de_type": 966 + } + ], + "encoded_section": "6290131DDD462C802488F8FCB53337F0E295B5911000F6FCA1B3F6B059B23F66D8C4EA051C6C9002C816881A036092A98D6E2C43B56997B3418206577AE5FBD2ED140513DB563765F8BC8F24373A34598CE965F612E6973213F68D8725BF8687E7C0E0", + "identity_type": "trusted", + "iv": "AA80F0C2853387D57352DA38D31DE2C6", + "key_seed": "F191675B85BE363A41115825E9F96AE944B1BB30A4F44B5BF264607F23ED1D03", + "metadata_key": "1463A91940AA85E20E4C102FB214B062", + "section_mic_hmac_key": "7448C6F70050A2F6807F37A50CE846D85570164633904F6988DBCDEE309BA469", + "section_salt": "F6FCA1B3F6B059B23F66D8C4EA051C6C" + }, + { + "adv_header_byte": "30", + "adv_salt": "A8F73F308C8040F875068751AC07146F", + "aes_key": "4ACCA77F6443A997EC976E8DF29BF045", + "data_elements": [ + { + "contents": "B4206451A977B5C7229B3706C7A9ADB5F1A2", + "de_type": 397 + }, + { + "contents": "56357AB9D8F59AC35C31B4A33719", + "de_type": 768 + }, + { + "contents": "E4E7555166", + "de_type": 650 + } + ], + "encoded_section": "6590139B75C6E2F93374031891CB7F183D1DA5911000ACB22E5B30D0DBBAF07D77E81CF008949002CB361E9901B9D970AAF01C9C930078BB28E92B29E27979BCC204CC7E57B37D2A092B33A50FB2F58E104AF02590F8F81AD33F181D7E85F6CCD8E6D65D4414", + "identity_type": "trusted", + "iv": "784701EF2AE2B9C7B1656B6F24958EC8", + "key_seed": "A7FD06108A6EC755ACAEC565266DA3FEC76F5CF8AEC4F29279FA144BCA3FD6DA", + "metadata_key": "E09B7C55C7B8349092D91225F448EA53", + "section_mic_hmac_key": "6ED015FC8D0B189DC70E4BD1E8F88E688F25A796E6746035FF22D0554F821365", + "section_salt": "ACB22E5B30D0DBBAF07D77E81CF00894" + }, + { + "adv_header_byte": "30", + "adv_salt": "E576698436DEB6610A845CF01D163105", + "aes_key": "83226FF4A58EC6DD7E6662BBA5D73F52", + "data_elements": [ + { + "contents": "BE5023", + "de_type": 476 + }, + { + "contents": "7EE00AC9BEBFC7C3C7D4CCE6F44E", + "de_type": 426 + }, + { + "contents": "71EF3EEFC6E87B1B92", + "de_type": 192 + } + ], + "encoded_section": "5A9013F92DE8DEABABF71EDBEE8EB0BCDAADFA9110001D54B5EA6F822E53B05665A0162703EA9002AB621DAC7D9F5733D7BA7EE8934A3ED4C31CD45C0D582B0A5F7CAF5E87CF7CDE253F4CAF4DF1441BB1A46B43C45D688A870AB0", + "identity_type": "trusted", + "iv": "C2400D4299944D6C1488DCF1E22D6C06", + "key_seed": "79D29D153C585EA5E90C3B79529B16FFDAB71BC5A04AF937E790545AE9928DA0", + "metadata_key": "5D7452C2BA345F191BF6AE6FDF6C563E", + "section_mic_hmac_key": "79900D2FE4048CA7833B859F37FBDCC0B15F7171C80DBA0B1885285696975A1E", + "section_salt": "1D54B5EA6F822E53B05665A0162703EA" + }, + { + "adv_header_byte": "30", + "adv_salt": "4768B89F8A7E384991F18A0495BFEA04", + "aes_key": "7547BC2888B8E5542CEE7A3F3C5222AF", + "data_elements": [ + { + "contents": "E3A9", + "de_type": 870 + }, + { + "contents": "3BE13855A3139F39614D0FDD428930B89082B2432BC9446EA11C", + "de_type": 8 + }, + { + "contents": "93147F162D3D03E6B280D73646F2F2DE8550F029E4A0475EBEFC1D61", + "de_type": 47 + }, + { + "contents": "D4C4C08E4626E9C9938060448D2DF71E5923", + "de_type": 203 + }, + { + "contents": "2C955691391A", + "de_type": 984 + } + ], + "encoded_section": "949013BED9D332000D6028E9BE7FF8D5D9662991100026BF874FD30958064B7FDE50DC5273249002EF9D3A6DB0E2E9F377CA7ADE125F20C814A7314F4DB049E59DFCF842AC9C3A0CDE83E86BE477EC0945CD68D713C355886BF6EBFD0B4ED3E1F130059F0D536690144269E0E575CD11ACBF81624828907DCDF86CA826D7CBF3311FE1201C677DBF3ADD1ABDBAF3F6B3435A5D6EAB", + "identity_type": "trusted", + "iv": "8A114B142A29B0A8FBEC8D802FCC9565", + "key_seed": "7D5D6E5B68DF9E882D754A65671ABD44CE108669284BD684CCF6CEF2C2EF0FB4", + "metadata_key": "9D8B48CDBE1FF6BB72F17A12043F41E5", + "section_mic_hmac_key": "8D6A740A35A73FE7F878D2921B3D960BAF0A3486AC0C9A8819E424B1F030AC3A", + "section_salt": "26BF874FD30958064B7FDE50DC527324" + }, + { + "adv_header_byte": "30", + "adv_salt": "F28906CA902C635D308F902E45DD2E48", + "aes_key": "8706D4875D9BEFE21A3804E22B9ED548", + "data_elements": [ + { + "contents": "A84365F157E64CB62F", + "de_type": 509 + }, + { + "contents": "00B4A0D8FDB5521E004F7C38139C984657", + "de_type": 628 + }, + { + "contents": "8030144ED75B3228FDA5437A5B278EBEB81FEE8F9BFADD2D", + "de_type": 343 + }, + { + "contents": "F533F70043C57E4A829DDE726DAEF9DD7D19", + "de_type": 397 + } + ], + "encoded_section": "879013829B3FB9CEEFC0DF72E63F15AEF50421911000F4F886D3942FF01D3363FADE908CBA20900179CCD98A4373FE7DFDD4B86DAB02F51D3B9E496075E671296CAFBC5F734874DCC4392FE89EB640208C8190D0BA0DC376190FBC329D495D4C8AFA2F6743C88947A5F618F7F5B938D389734CEAC2D74DE84FB58B2F1DC8557F53A0191F9C0F7767", + "identity_type": "private", + "iv": "D91919E5DA29C49D3A27EB7004C3A3A2", + "key_seed": "8EAF75EBA0A679B7FC0745B9A3A151467037141B8960B3CFD153873489ADE1D6", + "metadata_key": "F8B965AEF3130CB5B1EDF79BD3B380DD", + "section_mic_hmac_key": "CDDF228D36AB57418939E4B225AD5E940A66099B1673E9C72617C817EC65FD85", + "section_salt": "F4F886D3942FF01D3363FADE908CBA20" + }, + { + "adv_header_byte": "30", + "adv_salt": "F07F58FCDFDB03D86254EF18C7ED9F5A", + "aes_key": "212FBB8DB7A61540976A129092DDC6A3", + "data_elements": [ + { + "contents": "507444EB19C5A2F5AB0408A7B1C9FB6B722485864B7FED", + "de_type": 517 + }, + { + "contents": "340127475FEF88C37C16738A27767280A60265E9ED7C00F7", + "de_type": 419 + }, + { + "contents": "459F7AB3EC821FF2FC5E3271D76CD4B927C7DE9283DA3D1F58B6", + "de_type": 907 + } + ], + "encoded_section": "899013359EADDA79D6D36D643040E2F246FF5691100088BDA9DB826E3AF39A28BD3DA6D11DCE900162FB285CFC9832A941DA01960F1D23CF4C3B6B16D419D9128C57D4791005DB0CEB59681013CAFB837D214C1B0254DEC08CEEA521C4B63E0691E22197BFB77A63E5B404A6C59A5C8106C03C9E64555264AF6995235AFCB618796984136391294C9908", + "identity_type": "private", + "iv": "5AF941CA9794322BC9567FDCEA50EE5F", + "key_seed": "063078D957BA49F5766C90098FACE0A30FA35A51E25EDFAA85A718A10C3E7DEF", + "metadata_key": "C92F572CCC40BBDF3908F3E0463113FE", + "section_mic_hmac_key": "893438116FE775A831B08322B6A69563A8CCB89BF0D0E1B072F9938B2F1E53E6", + "section_salt": "88BDA9DB826E3AF39A28BD3DA6D11DCE" + }, + { + "adv_header_byte": "30", + "adv_salt": "A3DEF8B9B61DEC75C9D78AD7D305A942", + "aes_key": "B88BB7EAAD96923279AD8895FDED98F3", + "data_elements": [ + { + "contents": "2BF8EB8F1B59A8A6BA8411C989B45CE02489926496131DD2A1", + "de_type": 620 + } + ], + "encoded_section": "5390137966542D2D7E1BB1B1CC4A69D4611B2B911000E895C370737AED915CE90F8886219DC490023E6EE711BADFC9627B0C800710236B909316CA48CC9975AAAB452A50852576114CA2040B2E46607C1453837E", + "identity_type": "trusted", + "iv": "31951BDF7F8295133ED6F0ACC391148A", + "key_seed": "8D101AA09D57A75F449D3E2FD7DEAE6BFE2732B8650057B906687BE5273267FE", + "metadata_key": "E360E68E7237460157062D59F02667AE", + "section_mic_hmac_key": "B0229F3856F27C706D246C0A9825CFB5A8A42F943213DD297DF6C9161B01537C", + "section_salt": "E895C370737AED915CE90F8886219DC4" + }, + { + "adv_header_byte": "30", + "adv_salt": "D9FDC10E7DD4CEE9E6DDC58E32010C56", + "aes_key": "13BD95BDB3765C222D83F09E7709B4CC", + "data_elements": [ + { + "contents": "C34DABECB5407708", + "de_type": 745 + }, + { + "contents": "B74FFA6EC993AFF7188E480EFAE2B5716CAC6D94BA01A6E295", + "de_type": 893 + } + ], + "encoded_section": "5E9013C6528C5F67233A0621D667CDA9647C8B9110004FEBAAA8799785F0596398269E32B38D9004005AE0E84461B3A20D959FE3BEA15F943AA33F119D493B02089D7D3BA9441428B675702D1E218A838A546A4ECA06621081AF4A649467EC", + "identity_type": "provisioned", + "iv": "74BCB96F895B5DDC9846D24C91CA1ADA", + "key_seed": "8DB972FF69EDFE8ADA506F8F4EE6A594F5693A3702C8387D0B19FBA6285FD3E3", + "metadata_key": "99C123B1D364F1879AEED1E415AA2A73", + "section_mic_hmac_key": "FD1423E5F7DA04EA60CAE11C985935089218744423CC43B3097F1AAD90F197BA", + "section_salt": "4FEBAAA8799785F0596398269E32B38D" + }, + { + "adv_header_byte": "30", + "adv_salt": "86EFC69A56E5757AB62A058D5554CD89", + "aes_key": "159ACE5A180AC4E017D4451EA22FAE2B", + "data_elements": [ + { + "contents": "CCC0D2FDE58D59143764A6F1805538AEACE1B9B4765D8AC26D0B96", + "de_type": 575 + } + ], + "encoded_section": "559013C0A81EEC39B1B937912A6CE13ED810C79110000D4B9B8A8C4EED41C8621ABC440648CF900104798C555D077454425379DDE878641DCC3C7B6BDF25F1A1E6ED6D58D0CBA6BCDFB8069B6964894A6679C2A51D3D", + "identity_type": "private", + "iv": "24F1D1D3D8E4FFA7AB4B424DEFBCE37D", + "key_seed": "D637DB7EDCC17C5CE28A181364497144C75064BF385DAEC9ECBE88C4733DC522", + "metadata_key": "C8D76EBDD7E6D70B1368BAD74E63D830", + "section_mic_hmac_key": "A74FF6ED127426FB488F765F3D4FB28627F8430C15249C32719A4011A3C49929", + "section_salt": "0D4B9B8A8C4EED41C8621ABC440648CF" + }, + { + "adv_header_byte": "30", + "adv_salt": "54B49E29E6C813A6AB600E4FC5B37E1E", + "aes_key": "7F2AB782AEDECD14B491B2A8582AE47C", + "data_elements": [ + { + "contents": "E372", + "de_type": 535 + }, + { + "contents": "59C944D70BEA1D61D2B148C437F0BD845A6DD9", + "de_type": 452 + }, + { + "contents": "028BA7012BDEC80C4408BB13B6", + "de_type": 60 + }, + { + "contents": "F239F4", + "de_type": 695 + }, + { + "contents": "AE8259558B908BAEA271AF1F6E7AA9AE2C8FBBC285B601AE7B", + "de_type": 383 + } + ], + "encoded_section": "8390139CB02E72EB97CACCF9A78057EE5CBB309110006A4AE76AEE22009E704B7BD28FE8B2B1900279183874B6909CA5B47A0A86DD6182DAA730343CE2371932D34189949A26ED2DD187AC7575922178E8444DB225910D31030B992DCD92AEAF97563272CAA76CD1558DB0B684B62F740E85794CEF78EACEA7058B4831760BE43B970A2E", + "identity_type": "trusted", + "iv": "58DD2660273A4248EE13A8C1AD2C5184", + "key_seed": "C4634E111562A719DA2BB9EB976735028B2ECEDE1ABE15ADDA7CD3157B233D1D", + "metadata_key": "566DDB44E374E986BA026292C0EA365F", + "section_mic_hmac_key": "5EF675045878EFD2070A5A9798BD142A6C34978E9DF077E79BB8A68A4177FD35", + "section_salt": "6A4AE76AEE22009E704B7BD28FE8B2B1" + }, + { + "adv_header_byte": "30", + "adv_salt": "501218BE1988D66E80E7EF243937E186", + "aes_key": "6BE6B27C8417AAFBE97B75179DAFA7FB", + "data_elements": [ + { + "contents": "8E3197168683F9454DE6DB69F69E94EA3F5A8F61695068C520781441C0", + "de_type": 229 + }, + { + "contents": "25D1", + "de_type": 764 + }, + { + "contents": "FAE449BA2F60AE991245DB", + "de_type": 519 + }, + { + "contents": "08976D80D1EF3AF9E7EBFA2C5FAE", + "de_type": 126 + }, + { + "contents": "3410", + "de_type": 40 + } + ], + "encoded_section": "7E901311389A9F657FB9CDF7216FCC6FDCB5C1911000ADF1D2506EAC7BA9C0E2E598762A41E390018EF9292BFD0E3B84847F8B3AAC77E5C20E9F9C8B5DE8B0C389E7BDFA1847AC7EBC51267223EF07CFB0DDF9F6F11B9A7C346D5C081AD766F7330072EFE978E18ED4D7E22F5E724FF86504EA9C3B2F615ED7E6A73989C029", + "identity_type": "private", + "iv": "4334EDBE069FE9E747E594070B35865C", + "key_seed": "D8791426EFA31574B5323D3468CC282EBD37B522C10B0254B75900D545549C68", + "metadata_key": "EEA46B5BE346C68C6B9D2FF155B847B9", + "section_mic_hmac_key": "36586A0A4B1A9EFF83B9D2C27288B2EC000F5A729D845039CB4C4E2E25D050CD", + "section_salt": "ADF1D2506EAC7BA9C0E2E598762A41E3" + }, + { + "adv_header_byte": "30", + "adv_salt": "6F7E74F849A9CA7DC6EFEB3C4E185CD2", + "aes_key": "3E0BD976A1EC7956BD5A218B15CA1B88", + "data_elements": [], + "encoded_section": "3790130111305FC43F978EFA9FA71298D70A3E911000482B018116837E1A30C802D1FDB1D5E1900434436C965FDF5AB2C0A9794A5F1E438F", + "identity_type": "provisioned", + "iv": "8CE2936C0F96EB822A07C82B25CA86E0", + "key_seed": "5CE432AAE1CA1837C7ED7EFB8ED5B8202DEE8F3D33404A2BD800691E60AC84DE", + "metadata_key": "60F06359C33E56E540F0D562F6D795E1", + "section_mic_hmac_key": "9756EC3F8B6D24028B7578FAEDAC3E00F01EC763B58705AFCD3C406CC8E2CB9E", + "section_salt": "482B018116837E1A30C802D1FDB1D5E1" + }, + { + "adv_header_byte": "30", + "adv_salt": "B7D6F035E98A76528AC824E633BCF35E", + "aes_key": "855A405A9B896759D95909C8C01D85ED", + "data_elements": [ + { + "contents": "A9AF7437A71199911EFBC7F467ACE00B3068C2", + "de_type": 54 + }, + { + "contents": "BB4F94CBBE7AE4", + "de_type": 206 + }, + { + "contents": "4D3A907AEA42D758A8A8F3469F106BE9", + "de_type": 34 + }, + { + "contents": "D65F6C8BA7CE3B27AC2B2719BA42575144", + "de_type": 639 + } + ], + "encoded_section": "7C90134E69BAA34FCC557E20B36B17747D03369110003E74770F2C3BFC7824E73C395259941490022DC2535A7F643CDEA3AE4B0F0C6EF90B575E93CBBF59D9D6B71462FBA784B35C7C36060F51A0FE48AE363A6EC3CE8AB49D9C1C1313C173694407489A8B70CA26A3BD4C099C54AD65D7425835D44949728C287A2359", + "identity_type": "trusted", + "iv": "1A27663FC7C2377EF8D2C5186C1FC4A9", + "key_seed": "64AC1AF89078CCC339162EBD5DED72869833D1952CA107DB18AC60A825F1B53C", + "metadata_key": "9D5934F8E0592C5D89895210409C8A41", + "section_mic_hmac_key": "257F10EC7FFC7A37AE8002AC855DAEDB519FF790BB018AB37C07B3C95FA43B84", + "section_salt": "3E74770F2C3BFC7824E73C3952599414" + }, + { + "adv_header_byte": "30", + "adv_salt": "5F4055051684020E65946E512C943EEE", + "aes_key": "2E4C09B79D85D06810D3098DC1851254", + "data_elements": [], + "encoded_section": "3790135F9E24B4FFB9D55DC0C402783C77A352911000DC13DEBE3C218E84F7B6BF1A5EE5F99790011059D0BFCCD933671F56E42FE6EFFA15", + "identity_type": "private", + "iv": "EE7A0DEC1B5D713DF6F6FDEBBB2BFD96", + "key_seed": "AE002F1AE69DA6D9E55CE9698288B1A24649A79EC710AC0EA25FA2ACEEC513C7", + "metadata_key": "8102DD3A02B8CBC1139B5CAF2E1D73EC", + "section_mic_hmac_key": "0645A1FF34AFF1BA9649FA6289B1614F437149CD7D365604EC23650C4990BCFE", + "section_salt": "DC13DEBE3C218E84F7B6BF1A5EE5F997" + }, + { + "adv_header_byte": "30", + "adv_salt": "65274318E96A5F3C8F853A0140948CA9", + "aes_key": "A2AB55C2875BC6E1A5C6524613D979F8", + "data_elements": [ + { + "contents": "E1365D118F175446B5", + "de_type": 109 + }, + { + "contents": "6FD06861E3", + "de_type": 537 + }, + { + "contents": "75B17DA591EE83", + "de_type": 876 + } + ], + "encoded_section": "54901395DF3F04E4A427202405C00CEB8517909110008555384C43C1617A30BCF72E5F4BDFB49004F86629CAAB13685CF011DEE82DF4F262F18C02E125C649BB23BD45920E75158EA9070F51274096B90CE869ACC3", + "identity_type": "provisioned", + "iv": "21A90C0A73430152D69C286DE55FE6CA", + "key_seed": "D544199BCE9630C3A38FA486B24337076B81862E1EF002CDCF3F47D2F4F01312", + "metadata_key": "5890FFFB39DC0CAEC2CD1DC14D8CB75D", + "section_mic_hmac_key": "6D897F4D0C20E588E90887DA70802A1D1AF3566423DB51B7D461A67F1C47FA59", + "section_salt": "8555384C43C1617A30BCF72E5F4BDFB4" + }, + { + "adv_header_byte": "30", + "adv_salt": "1F4709A197E6740270684FAD01BB82D7", + "aes_key": "34574FCAB952B550B440E2640175B9E6", + "data_elements": [ + { + "contents": "9186", + "de_type": 495 + } + ], + "encoded_section": "3C901331255D9705F45F7E9517B88F8F638FC291100079F10183D40E8C82C058C764B953DA829004CB302F29874367F55323ECCAF05172CA35D7FC6D6D", + "identity_type": "provisioned", + "iv": "947390D6150675057CCEA6FD5718F0BE", + "key_seed": "7AF2D95F589FC38F0B6F85DF707C22EB88F763BB671E1CB970B193AC44D4BCE4", + "metadata_key": "4CCF453BB6EBE955C870535451F6C69A", + "section_mic_hmac_key": "4473C6534983305DE8102EA9118C4735929E70E0544A1EA512560B21FCB48F1F", + "section_salt": "79F10183D40E8C82C058C764B953DA82" + }, + { + "adv_header_byte": "30", + "adv_salt": "96C04195E083ED70F192E617E1D76783", + "aes_key": "AEB96E57873EB15A971A619B5FE4EB80", + "data_elements": [ + { + "contents": "6FC6CB1C012F258C24A6A57A7926E27F5A830A34A367", + "de_type": 382 + } + ], + "encoded_section": "509013410BA26E4CACF5CF673D585B58D0F3FC911000446BA66C82AFB4E9C11CB66EEA6DEE009001F4E644F392CA55B8341671E0AAC030DF17CF0EA76EDF81F2EF4C0CB1336BE6CE9D27DC8D8A4A29E735", + "identity_type": "private", + "iv": "891CE2EDBC65C4B0D16DF9F624DBB82A", + "key_seed": "3D9AB03EC3F93120532D2E778D3C2BF4DA9315896076277F2873A31E4FD5F52C", + "metadata_key": "CFF78360D994C96E284EBEED93EA4BA2", + "section_mic_hmac_key": "21BBCAC3997CA4151E9A097276A550A0F483AB80B38134DC980C94B9A5271A6B", + "section_salt": "446BA66C82AFB4E9C11CB66EEA6DEE00" + }, + { + "adv_header_byte": "30", + "adv_salt": "CC96FC6587992A00059BF3E0DA2289DB", + "aes_key": "AF54E2E9237E76444AAAB77B58C5446C", + "data_elements": [], + "encoded_section": "379013D8315BBD994D5A670BA6F780F2F028BA911000C755346DFEC27ECCDA898324E69CFB4B9001A9B1E0D2CB309713FC58CB798396531B", + "identity_type": "private", + "iv": "B60129EA4D27D57E45CD421948D742C6", + "key_seed": "807DD8CF77569513B6ECBC68ED9B08E5B9475FF6607732141FAEC638A8DD28BB", + "metadata_key": "5481564D04DD0017AE4179A82AF221A9", + "section_mic_hmac_key": "73FFAAF7157A3AE517296592E0B8D13E506DEEC834FE1206ABAA050A9FEE92FC", + "section_salt": "C755346DFEC27ECCDA898324E69CFB4B" + }, + { + "adv_header_byte": "30", + "adv_salt": "7963E5F18FA7E59600E6F25FA4930837", + "aes_key": "FCBEC40F3C80A09B60135334EE7DA35F", + "data_elements": [ + { + "contents": "2EF5EFF372E4702B096C5B858328F410579E1E008EF2E275D6EA", + "de_type": 692 + }, + { + "contents": "BAFCA28BFF", + "de_type": 398 + }, + { + "contents": "7E468799B29D34E1914D34B97B4AFBBE", + "de_type": 966 + } + ], + "encoded_section": "6F90134BF4B2FA7735A0143B1B24205E3408F8911000B1236CD7CBD12702AFECBE9635A14A48900263C48BBFAB388B046AADED238F69E1F9A7BE917E59BFBCA2CA3B2C191C787A8C3139DBAE0B72FCEE19B98E0D9C261DA6907D9561B53B735561603F687041709A1913BF7925139044", + "identity_type": "trusted", + "iv": "79447B6043F287557A38B57CB6D7279B", + "key_seed": "52895D125C5472A019409B363AF56DAAF368CA65B24E76E891500A8C3A324F81", + "metadata_key": "C3BD8D140D94E6945DC06DAAAA211DC4", + "section_mic_hmac_key": "C35368464E906272C5B9B8C782E9F88A8AE3AB9474742AD6F770FAE52BCB88D8", + "section_salt": "B1236CD7CBD12702AFECBE9635A14A48" + }, + { + "adv_header_byte": "30", + "adv_salt": "7A0C1DF60064EF2276AE5C8F6E773415", + "aes_key": "4AD58F3983D0B6326C71F9AAF86CD10B", + "data_elements": [ + { + "contents": "205DD11E927B089869B334A9C59D75032B498C8B26270EE984AB", + "de_type": 916 + } + ], + "encoded_section": "549013603FFB31E477AC33FCEC9446E9C1E230911000B4DDA6DCF6B60042BAF08C824B9C9F2990019D5D07E65857011663A028155D02FF6E932BB511C55C1E2730444597E2AAD904948C7BAF9CFD59D59973745C1D", + "identity_type": "private", + "iv": "AAEA80FB40CF47A6266A06730EC30156", + "key_seed": "90152000F437AF07947A71307DFC0618E116E9AA2AB8988722818AF41CDB59D1", + "metadata_key": "BDF2BDE3B7905DF7CF58590982B89E52", + "section_mic_hmac_key": "AB7A1DD69A86B1BEBC2DE6100FBE90AB1C943D5695633CFB48AAE2FC961EE093", + "section_salt": "B4DDA6DCF6B60042BAF08C824B9C9F29" + }, + { + "adv_header_byte": "30", + "adv_salt": "2F4226AAB45A2040B831D40B0EBA4407", + "aes_key": "1222E1C06D6E81FF2AE737DC583C0737", + "data_elements": [ + { + "contents": "C02B48E3A60445D37BF70DF40C44CC320203B03EA1F04994", + "de_type": 866 + }, + { + "contents": "", + "de_type": 984 + }, + { + "contents": "D402CD4FD797FF62E8D7AE", + "de_type": 37 + }, + { + "contents": "AAA43BF1A7AA06F9B2F63D52787D1A7AC58D557F", + "de_type": 916 + }, + { + "contents": "77B0DE2AEDC7048163", + "de_type": 621 + } + ], + "encoded_section": "85901322B04151D900C31B678DCA782E1E6323911000D57CCB532F3318CCB7BF62288C95AB1C9001D7E937561EC6F7FC16952EC2A7E0898E9976D0028A3A31B6BF858AF26AAB5A1E7A4F36A5588F8F28A4CA3CA8EA4404494575ABCE0A97E8360771F784C26226019DED4E8FB6EE3A96750B9B934A09E28668C6992E8F50D3B794DC6AF2513D", + "identity_type": "private", + "iv": "1ADEEB6BE822DDC74F93D2362A2B0441", + "key_seed": "82AFE392779367A6D4B3787AE009922456277EBC7FE04447BC2D1162778FAD11", + "metadata_key": "9BDDC51177CD3D9311F1D17661490B86", + "section_mic_hmac_key": "16342C46DF929343DB72EA520ED728F49F3E50BDFFCE1CF291C3697620133BC0", + "section_salt": "D57CCB532F3318CCB7BF62288C95AB1C" + }, + { + "adv_header_byte": "30", + "adv_salt": "CAC0617E69DE77A280ABE6A5F3E624EB", + "aes_key": "77FE9A2730A3B80F387BBD0589358B33", + "data_elements": [ + { + "contents": "A6A3C4AE4BDF8941", + "de_type": 417 + } + ], + "encoded_section": "429013C0975C03854C80B4E07AE4CA3076AE42911000EA332A8D5BCA0D6314BDC58F1D09498290024FB2DCBD1FC2137DD2C4FAE1B9A76B2B307B72B1C97D8322DFE749", + "identity_type": "trusted", + "iv": "0CCD2727784E9E5B84D45D62A93E8957", + "key_seed": "EA3D228C2BEB0E89B3C9B28A17D2BEC7F763376D8455DC991C33FB3CD9CCCE7F", + "metadata_key": "528A7422DECDD593FD1ADC1755835C08", + "section_mic_hmac_key": "18216F8A0F08FC18F8694B2658CC0B1F391BFC3E82B6F8B24E321BD6371971C9", + "section_salt": "EA332A8D5BCA0D6314BDC58F1D094982" + }, + { + "adv_header_byte": "30", + "adv_salt": "623AB1FBEEF5D3827676D5F2A39FED9C", + "aes_key": "AEFD0C18567BCB6348CB3A0B0D40567D", + "data_elements": [ + { + "contents": "", + "de_type": 971 + }, + { + "contents": "DB43DA9E48BDF35056FB18CA10F46359BD1A30A20D5655482FC3976EB92A", + "de_type": 729 + }, + { + "contents": "97652C8CA93C33047BA67FBB", + "de_type": 766 + }, + { + "contents": "D6525FFF50D38FBEE9", + "de_type": 487 + }, + { + "contents": "1866ADC89365521D269D6FF6A1972629DCDC", + "de_type": 421 + } + ], + "encoded_section": "8B9013137611183EB9AAA3F69202645FA0DCC09110000BE535680DC0F532EA22C2F75B8A066C9004BDDE3F2ACBAC8630F0A35CE5A424AF735799E14DADCA023F6200522E83069F8ADE4786A502D31EA079439238D5A9590B1227C5CAA9CE01579FEA21D1DBECDF0D95691CCA2FC601B27D5696CF25128DDFD16CCCAA5C96675488611E407310D067851CE7C6", + "identity_type": "provisioned", + "iv": "DA1292F56F9B309A57103588C56F0B86", + "key_seed": "20232B2934D61F4254E1B430C941D99408046EDA864CAE9CC1F30B003DA3F15C", + "metadata_key": "958125E98D4CCE39EB85BB7A1799EE11", + "section_mic_hmac_key": "B2AC01EDB57C1E96D629F9DF9B299A97C7A8078AE389FD3C4CD495C17E9C04D3", + "section_salt": "0BE535680DC0F532EA22C2F75B8A066C" + }, + { + "adv_header_byte": "30", + "adv_salt": "274851FCCE9C7A4AEF4AE64A5CDF1B35", + "aes_key": "096944332E1C31DBE39227572D5E4FA3", + "data_elements": [ + { + "contents": "6E64A76F629EDE6983839536E6746048F9407203", + "de_type": 828 + } + ], + "encoded_section": "4E9013B4E77EEA1D31017802F64F86FAEF7E31911000BED45389016B48EF6F638B053B3EAB3690021297C8C1D17FDD132207ADA56F2E1DB48EFCC6972936EC031E5A1C12EE25BC554477A6838C8273", + "identity_type": "trusted", + "iv": "1F4EACA3D2A66B67B8100E7FD56858A9", + "key_seed": "4B40631EA3307B8B03B324AE583A624B14A3846AD22A98AA8A6476CE18B72519", + "metadata_key": "856BA488B5E3073FE98F90EC7D43D9FD", + "section_mic_hmac_key": "89252A2B55F7FC94ED83D11D1901E8354EF6A832522A61E77DF2100FA5B40E85", + "section_salt": "BED45389016B48EF6F638B053B3EAB36" + }, + { + "adv_header_byte": "30", + "adv_salt": "0EC0CD8BC147F50646909D6EC4CC2134", + "aes_key": "D4342D083B5848972862E5244EFD574C", + "data_elements": [ + { + "contents": "61538E97", + "de_type": 674 + }, + { + "contents": "142298DD27C29352869DBD73AE86918E77E0", + "de_type": 321 + }, + { + "contents": "B04E54", + "de_type": 64 + }, + { + "contents": "08BDEC39FBEB13292A5317B91CDC", + "de_type": 546 + }, + { + "contents": "AE3883A3D67D64CFA5B52195337D40B768695A28036AA392F25A9B302816", + "de_type": 255 + } + ], + "encoded_section": "8A9013C70296B62647E222527D694A181E0B3C911000E66DDE309D386AED3A9E6F4F4E72AC2D900476583A491A2BB7D5B11ED5D5D40D40427D285AAA7C31BF39774FB2333DAD5E8428A8728BF4619A5F3E1F646C9C637412FCB7E60BD95712CDC6DBBCA7A64509C4CF24A63615566468376BCB88515DC32CBE4462ABF2A5B902AF44CCAA8034D1B98DA864", + "identity_type": "provisioned", + "iv": "C8A684AD4924F67F2BB34B665F767260", + "key_seed": "0B21B7F5AFA2FD60F417160706E110DAD08D558B7F873A7145E2F5846B30EE14", + "metadata_key": "9AFEEF6AC49A69F403F130619CA3C015", + "section_mic_hmac_key": "EBC37528F0E1D39DDFEB12F6229FF778D381BFD32C22EDF0A22AB350036560FF", + "section_salt": "E66DDE309D386AED3A9E6F4F4E72AC2D" + }, + { + "adv_header_byte": "30", + "adv_salt": "107DE67CF73BF73111A7D273F220324F", + "aes_key": "C909F88E99316114E33AA6727A466458", + "data_elements": [ + { + "contents": "8EFDC86CCC6C78EB", + "de_type": 542 + }, + { + "contents": "AAA1E33F8F43B229EB8189E8", + "de_type": 551 + }, + { + "contents": "54E27639599792ED49", + "de_type": 92 + }, + { + "contents": "72C8", + "de_type": 187 + } + ], + "encoded_section": "6190139BDEA29D9DC86B46F9D2BBCDA4366F1E91100088D8F556CD3AF2EA81FB25030F2C782B900230E146653F1669A7ACFDF87FCD45399FC47FED90B8920E5C85A2B5ED2E31FBA1EBABB429881EAAC9CDBAD9B7B529A7AE7756AF294C1F46800357", + "identity_type": "trusted", + "iv": "F42D4010A9B9750FA68C39E1E7293CAE", + "key_seed": "6433B38B99F099F8291F1AC0E46556F0110E50A48F622C7ADAE2F70FDDD13A00", + "metadata_key": "433F040898968971CD78BA25C93FAF72", + "section_mic_hmac_key": "2D3DAD9FC1AFD294EE70B0F00D78E57ED025932D5EAED1E85F5DA314C4372F8A", + "section_salt": "88D8F556CD3AF2EA81FB25030F2C782B" + }, + { + "adv_header_byte": "30", + "adv_salt": "23DB2534F86E837128D4B5867BE7B9D7", + "aes_key": "FF021E596C3FB19F91E10975989481D7", + "data_elements": [ + { + "contents": "092500E2322279050831D86A9D0C412D262AF1", + "de_type": 889 + } + ], + "encoded_section": "4D901361744616A9DF4D232AD6583E68EC94E491100045112DE3235917ABAE281CBB93473C8C9004A8CA160F322458CD3FFA1BE531D8FCD0009177A286DB8E8D4BDF1A77962A55FE3AE696EB057D", + "identity_type": "provisioned", + "iv": "EFFEF8C52517139FA621AC011CDAB4BE", + "key_seed": "9A62A13579CCEF2E7654D15F2A1BFAABB99E94396396BA14B5D488488BBC454B", + "metadata_key": "5CEC4B1BA12D44BB925EE396A95149B5", + "section_mic_hmac_key": "3C093A169750EEEF1645B87A283453DB15D44FA8FE8E6D36885E5E079736E0DF", + "section_salt": "45112DE3235917ABAE281CBB93473C8C" + }, + { + "adv_header_byte": "30", + "adv_salt": "1FB79ABE6FB18715F8DDA68BD6B15373", + "aes_key": "0BAF583B5891233D33BA6B74D5E422B5", + "data_elements": [ + { + "contents": "0D611B00EF235E26", + "de_type": 578 + }, + { + "contents": "6DE7D6C995", + "de_type": 500 + }, + { + "contents": "310C2C3FA8E0702122BA85A3427A256F065CE1EAEDC1B9F7D4F04F13F1", + "de_type": 579 + }, + { + "contents": "3F1A1AF9FB1A3B409C278ED4098EA6CF87E02457F525", + "de_type": 947 + } + ], + "encoded_section": "8390138D06F7CEA300F4FAA9EAFF32BDDB833F911000911991BF08A3D1BBEA49C971CD66D43190049130C7E781DB24A1E2C7255DF0FF30DA65DCC1AEF1188EC72B1D6ACD5B6E42E904B513B03DEA16D250F9B146741427C0FE6E29624849A488542A956CEACBAE834CDB227CB06520F4453A08C795A729852015823C3F540167A6B9B6C6", + "identity_type": "provisioned", + "iv": "C0073097AE5243E3E6861876E66B6C42", + "key_seed": "04A20B7ED383D59B567CF62F30B25564D6509736B9141C273B638EB3A111EBE2", + "metadata_key": "E6B382E4B38BEC2DF51C9084B2A1484A", + "section_mic_hmac_key": "2DB0DCBCB00F8B684C3876EBC116C87B388F8E4EC2E4169536E5C34E2524DF60", + "section_salt": "911991BF08A3D1BBEA49C971CD66D431" + }, + { + "adv_header_byte": "30", + "adv_salt": "6E07E0694343C77F296426DD6E13D64E", + "aes_key": "1ABAD934592B2D7736D998BAC1194ECA", + "data_elements": [ + { + "contents": "DB8A57783224CF9C", + "de_type": 267 + } + ], + "encoded_section": "4290138A4D553E3BCB5789F1E01ACF4D8D7955911000D0E797023C8E23832AF2DE31413FECA59001B98036E2FAF383E70C58D8A5DCDCC5C7B528D95B9238054791D51C", + "identity_type": "private", + "iv": "57B0B15DF8CED13A80F93751E71DE9AC", + "key_seed": "B593545C0D736C1BFAB6E76CA49AB7DD942229C6E8B781B468ABD7C60ACBCB97", + "metadata_key": "90687B3B2AA61278792878E85A897B9A", + "section_mic_hmac_key": "FFA3F38A2550890AFF05E718065CC2A4AFE5EFC392122B4D0B12CA96AE3ABF58", + "section_salt": "D0E797023C8E23832AF2DE31413FECA5" + }, + { + "adv_header_byte": "30", + "adv_salt": "962353CB1C07FAF6686149577DCC75DB", + "aes_key": "E9007665D3AF271921E87A78F657A08D", + "data_elements": [ + { + "contents": "DD845D55", + "de_type": 566 + }, + { + "contents": "00E752395426921A92C74AA1560976DA2AE78C9D33", + "de_type": 290 + }, + { + "contents": "CFE5A4F631D430593C281AF3371C862120623F7AC4", + "de_type": 179 + } + ], + "encoded_section": "6E90138E7F8FE7DD8A3FBCF4B8077EF8542315911000F36F9FB7D32C243DF950E4B059E15F9190014A5AFF2BA024EEE91B2A86D089FB84084BF6D938B4B23C220B8C47E388A344199E965D14EB2524F47A4BB2ED0A2BECB01B63071D79034984E9A386C256902483D60EA4B5A1AB78", + "identity_type": "private", + "iv": "83B1FD00052754192029CB2F83E4297F", + "key_seed": "CCA7390D51E680A3B3072F1C9E70064FF16DD44C9D62A37B248C73FD833AC660", + "metadata_key": "523BB1997FAC71B83F2B60F42589EE95", + "section_mic_hmac_key": "0EE49B03E4B64FC2B250B0D2C4612D020494181E761B23ABFE594F97040CEF24", + "section_salt": "F36F9FB7D32C243DF950E4B059E15F91" + }, + { + "adv_header_byte": "30", + "adv_salt": "B67BF6F1252F5E0EF8816F15D301A39F", + "aes_key": "43407D6D91B96435811F30A50BE54FA0", + "data_elements": [ + { + "contents": "0235ABB510F05341", + "de_type": 824 + }, + { + "contents": "CA9166B5", + "de_type": 12 + }, + { + "contents": "1FDEC6B16D164A545D8B64995C00", + "de_type": 38 + } + ], + "encoded_section": "579013B31D8FF7387C6F88EA6FE4E1EF24DA329110004C349BCC1D0FA5EF838F76A707E05F8F9002ACFCF23B0B23FF24956B6407E513CB77D0D7B1884C904DF788AD961EC5FC1BADD31E34E027C38199C5476203E4CA0FAE", + "identity_type": "trusted", + "iv": "5AEBFCFFA3004CCAEE5DDFF854D820C0", + "key_seed": "E1B8FF062302C677E36789FCE15BF3CA6C1436D6A0B78E5D3B241F946678ABD7", + "metadata_key": "DD3F2168FAB2123B9450F54E86B66A11", + "section_mic_hmac_key": "BE20035F0C2A7E3BBCB38D949A8CBE3F3F1929D5658501B05BA0A14177EB1982", + "section_salt": "4C349BCC1D0FA5EF838F76A707E05F8F" + }, + { + "adv_header_byte": "30", + "adv_salt": "683691EE3E8A8E95F4787967AC569B94", + "aes_key": "4B42E071DEA02B52101DB6E24B78FA20", + "data_elements": [ + { + "contents": "993E9EBC3173EA199AF4BDF4626FB2FF1AE7FFC46C5DEF", + "de_type": 21 + }, + { + "contents": "6D16", + "de_type": 274 + } + ], + "encoded_section": "5590130DFDF1B79474D9F039992B840380FD319110000E05D59BD69C24AB85016E9CBF7513F39001E420DB5C31A3BDD1FE0E64CC581F32309E4F949318B591E46A84742D6E0AB75086EDFAD1D098CE4C78421F02775A", + "identity_type": "private", + "iv": "F35FF701EC37712BDC76295C2D1895F6", + "key_seed": "2496DFF7490AF44C61EF3D47167BA33E22B738B68C5D24EDEA6D9087BC4F0758", + "metadata_key": "CA1F7C7043728303F66ECE50ABA40834", + "section_mic_hmac_key": "00DED9280F77E5541D670B81449E4EEE65A2003D6933A1EB4F2C20BCC8453899", + "section_salt": "0E05D59BD69C24AB85016E9CBF7513F3" + }, + { + "adv_header_byte": "30", + "adv_salt": "196DC4CE0B019790D86640A73F7ABE96", + "aes_key": "8338D017A81A7041C6D4FF4F533046CB", + "data_elements": [ + { + "contents": "445F36A981DE5A534274F1B8CBAD2954CF66016F275A3A", + "de_type": 500 + }, + { + "contents": "8A1215636ECAE1EFED9182A21900224066DCAFFAF0F9D42CA05D79", + "de_type": 608 + }, + { + "contents": "4B605D68943C67774567CB69957D827DDDCF7F2A280BE76CC6", + "de_type": 652 + }, + { + "contents": "EA46EDA7D7586C247F8101FEF4DDB2", + "de_type": 523 + } + ], + "encoded_section": "9D90137836767DD16EB5D181B94393B7C9C4D49110005AA5A767B7C8F390E7B84598F1E6ECEA9001F907A884F970AA1379060520D3DC2C794766F852A608DED6EDA2BB11652C88B605D333829E95E4CDDA7F2EA77AEF23BD32B61F4DF8D2994458286871792C64F6D9BFB9DC6DB688719294349997D166BFC2CA7EF0C6ECB78C8E6ABE95404372904758CBEA1E5C7805E2DC10FA9FC6A28233C0569FD0A8", + "identity_type": "private", + "iv": "D977A2029F9F9599DD109B5F935234EE", + "key_seed": "DAF58A433FD1C92223C83A1D458C16A6D791C35B6D233A5B0802CD73481F6730", + "metadata_key": "A3611E071012852B91B390F2EAD716B0", + "section_mic_hmac_key": "1B677F76106044CF24E36F00B46DE7F48FC244D3CF907DECE2B2F39216579EDD", + "section_salt": "5AA5A767B7C8F390E7B84598F1E6ECEA" + }, + { + "adv_header_byte": "30", + "adv_salt": "A6DF7A7591C801A5C966CA40B18C959D", + "aes_key": "7AAEB3A3D128791FEE4FD4872BE02E6D", + "data_elements": [], + "encoded_section": "379013F742C6E278A2ED6465DB07BEB12CFE50911000C7F758AF24AA696D1CB7D0A9D65C582E90043FA1230A35535BE33302A53CBA4418AC", + "identity_type": "provisioned", + "iv": "B445034001A0F499175F3C9EB0AE92DA", + "key_seed": "39C904DF3BEEA18AFEB7BE38D6B8E6069401DEAA759330C9DC25C4BE112CB5A3", + "metadata_key": "0ABF633959D782380E4E947D27A805AA", + "section_mic_hmac_key": "54AD001651F4FEE64341F38E740DBB8FF123F756D68FDEC00E8B7912B13CED89", + "section_salt": "C7F758AF24AA696D1CB7D0A9D65C582E" + }, + { + "adv_header_byte": "30", + "adv_salt": "88705DD1C65299C03EA7AA7496559581", + "aes_key": "5651F9236F827EFFC434AD9F005D28D5", + "data_elements": [ + { + "contents": "45040FF6A5CDA9835F818B484CB70A07B9EF939F", + "de_type": 875 + }, + { + "contents": "908557DCC7A672E4559E4280BFE4B0DF7CBB9033D57420F140A2B585E2DE", + "de_type": 418 + } + ], + "encoded_section": "6F90135B57ABF5DF4973307BAB1DB3C4AA6C80911000D91CE3FF1521638C0EBFB1C24543DA3B9004642281555CFA95167B0E6158D7F0EF0D5BD41FBE8A2DDC73B00B17998905773562C1BE381A66298FADDCF372204D30794F124C34FF7139623F41E957E4AF81A7379BE160E3B23135", + "identity_type": "provisioned", + "iv": "7FB08290F4083C8C63DD2DC495C1EB45", + "key_seed": "EC1290EF880DE14D1AE6D5B0F5A835DCB8DDEB83B7991C7FEA02F738A7C0C94C", + "metadata_key": "52C1C131236DC4C9DBEF317D1266471F", + "section_mic_hmac_key": "9695F74C29EA748DD4457C18285F53555A358F759EB1183889B4A15320A846F1", + "section_salt": "D91CE3FF1521638C0EBFB1C24543DA3B" + }, + { + "adv_header_byte": "30", + "adv_salt": "F4DC0B55884950152C6F0C5C01475956", + "aes_key": "FAF30D19065FBD5D679D78E7C7EA0B92", + "data_elements": [ + { + "contents": "5EBE58BB8F41ABFE605EFB39B48A4E7861EC80EC", + "de_type": 455 + }, + { + "contents": "FE52251B3CE9AD42F9A3ECC5A213D742F37415", + "de_type": 207 + }, + { + "contents": "85C6D2468DDC1B42286E73284C03C718DD3E1FC5FD3050", + "de_type": 556 + } + ], + "encoded_section": "7E901315CF56AAA74A2A4F82F00092990E8814911000743CD7DAFB42FC38076A13E7E1F4177990044F324B65EF22A2272B929464CD7DC2C2D75872E649A1D7DEFE164D58E07B41F473505815C0BC34702A02C0E4F113866170FD1B15EB58D7994E0D33A206C0C44A2F092679874A1D1674EAEAAFD99E0FC19E6F744E0A7347", + "identity_type": "provisioned", + "iv": "FB564977E2D99426D140FD689871A2BC", + "key_seed": "A62634BC57E141BEFC2564C14B48325117363328C53CDA48F814D4807048B48B", + "metadata_key": "574603EF40BA6009E312223A51E8E2E0", + "section_mic_hmac_key": "86ABC6D41CEF55446F03A0952E90F664718C4822451D24A3FC27E2898C84EB40", + "section_salt": "743CD7DAFB42FC38076A13E7E1F41779" + }, + { + "adv_header_byte": "30", + "adv_salt": "53234126DBD29BAF6097EC8D34317852", + "aes_key": "84425FEC4A06780FE396F9DD6040DEA0", + "data_elements": [ + { + "contents": "6ACFE4B438C70672D7AB", + "de_type": 986 + } + ], + "encoded_section": "44901360C0D9E68524187C1C25A4716FE61009911000B5E48CB9F2C2281E5195D2D12ABD09169002C39DB32F9F0C574E62CB199AFA336A185270C735884423B5B93B0DDFC7", + "identity_type": "trusted", + "iv": "D9119243F3D9CADDE86862B5ACEF8CD3", + "key_seed": "92A8C510E73A47699B0C22ABD2914EC022E9AC8B797E993DC4C6255EF66BE228", + "metadata_key": "39EA512E22B067754A318A3CCA5964C9", + "section_mic_hmac_key": "12BCBCEE50AD4DF7923CF35B1AB83583A1F4E502748556DF89A646200C3732FF", + "section_salt": "B5E48CB9F2C2281E5195D2D12ABD0916" + }, + { + "adv_header_byte": "30", + "adv_salt": "CEE234610E9993DC98C3D370D26F3DF7", + "aes_key": "51D4F92C953723A8BA9288131BEFFB59", + "data_elements": [ + { + "contents": "3B1748685E7204CD0AC2500BB88742F69E53", + "de_type": 467 + } + ], + "encoded_section": "4C901383131BCC9CB08EC986EEFF6504BA974D9110008FF0CEDF1640457BEF1F5CDA7D58BAF5900483D0B4BA6B8D9B80C5C9E12480C55424936562E3C68999DF6C4FC8256C9A0B17808194DB2A", + "identity_type": "provisioned", + "iv": "98603F701E96147E49F0A3F8C4174589", + "key_seed": "6532ABB7061C073E531A655B8F49D1D2311AEFF08E26F15B3CD5EF6AD3A960E2", + "metadata_key": "20F0584320BFF42FC597A41280E5BAC9", + "section_mic_hmac_key": "02101BA95A03412345F3552A5C163744CB1B4B1EAA3232E2CEABB4C862AF141E", + "section_salt": "8FF0CEDF1640457BEF1F5CDA7D58BAF5" + }, + { + "adv_header_byte": "30", + "adv_salt": "81A1175E23E1EC7240337AFAD6BC7EB7", + "aes_key": "FEDFAF2A6E7FC0E21A91E59BF8B332DA", + "data_elements": [], + "encoded_section": "379013A99129E69382B3F3FF02558A9A25CD15911000A7CF353E32FB509A39BF6698EAA646BC9001C2A2D18471E1D05CE78FB1967ED58068", + "identity_type": "private", + "iv": "3CB4F19740A089755A2925ABA96D2237", + "key_seed": "3B1D9789DE417E14DE7F5FF6AE8BE7DB5CB6617453BDD7FD1A216DEE5531D68B", + "metadata_key": "E5D8C1873FBC970ABDA794974C2FB35C", + "section_mic_hmac_key": "687C291B4FD7331659D26806502AE31343D972AE2E6E7AB83D647AA57C22FAA6", + "section_salt": "A7CF353E32FB509A39BF6698EAA646BC" + }, + { + "adv_header_byte": "30", + "adv_salt": "3002A18B6213325D185827101B8FEB1D", + "aes_key": "CA1C7AF04A4FD83E87A9E9E730289BF9", + "data_elements": [ + { + "contents": "8699B5A78970A2427D55BD82D4", + "de_type": 656 + }, + { + "contents": "DCDAE8E9DF3EBFA2C6094F42E6C87791ED", + "de_type": 517 + }, + { + "contents": "F0B0161E1BE7ADBE7B8B72CB09CF4ECD8B7BA0859856F8FE24", + "de_type": 288 + }, + { + "contents": "B30B", + "de_type": 56 + } + ], + "encoded_section": "7B90132C905FBB2C863EB4079E8B7BAD34C5839110003682E85568AAE0E82863BAD2FADA6FDD9002F9EA810B398843E60BB488546F7BE02E1B50043AD29711AACF37D90F6E1DF855915265AE4B2A4F8CB2253B76F8ED0E828288F2D47F06106F01A00C8F07333054F7EB00AC58C060BAF7F3BA9BCE4C6F031F9A93A9", + "identity_type": "trusted", + "iv": "B2B61B37788EAA1C5A3068450C9E7C63", + "key_seed": "EA552C43BFFF78260A603EE8B1C72EECA8297D7373D60BE107F83AB7C147D7D0", + "metadata_key": "E748E53B8B84D6D63DB643073B39ECB5", + "section_mic_hmac_key": "0E9B918DD78A73505AC657B398BB35861E5A69907965F1BF5D3306B59AB12A7C", + "section_salt": "3682E85568AAE0E82863BAD2FADA6FDD" + }, + { + "adv_header_byte": "30", + "adv_salt": "F88AC9429FFC97BD5D9191F120126A01", + "aes_key": "1D105B146BD337AA7EFA523A71C9E1AB", + "data_elements": [ + { + "contents": "00C5DF062D335BD726CACBC7A0B67B0B", + "de_type": 620 + } + ], + "encoded_section": "4A9013DA781FD242A7193FCE5BD9F370AC8C309110008D1CDE6542BCF8E73879AC69688FF55990049CFE71AED546CA5745D7C06F4E689A5D8319E344654EC9495226DB8024DEE4182A8F08", + "identity_type": "provisioned", + "iv": "68DE89B24537AA1B093F7FA14AEA7D49", + "key_seed": "A6845D869AEDD2ED427829ADEB09807A8A5300A2675344EAECE93BEFEA0A6701", + "metadata_key": "2B83AEA0BE02DB20AAFD114A9C33D1C9", + "section_mic_hmac_key": "D5E0B90E46BBE6913978A5213BE51F2C9B9D9628FD986C96A5A82E1DEA8E073E", + "section_salt": "8D1CDE6542BCF8E73879AC69688FF559" + }, + { + "adv_header_byte": "30", + "adv_salt": "0DF16EC423548F3D0B47CD91150015E7", + "aes_key": "4C28452111DFF26A316FD05F3E3004A7", + "data_elements": [], + "encoded_section": "3790132CC5741EAB8595660B062128880D944291100091B18AAB56D0B536F1791EE8D2C9FC1C9002A188B363001A99AEF63B8F1E5E0CC9B0", + "identity_type": "trusted", + "iv": "5FE3E1280133A66360FEF6157D65A3E4", + "key_seed": "E030711E2C294C058D619E45659774C93E40067CE130DB3AD1B883FBC8E3B95F", + "metadata_key": "75FC79BC1F5F4A71F3919FD3A658B8E2", + "section_mic_hmac_key": "86756856EA5D1111E0D45443BC003A04D28D46FA3D9D06C19CF3BDD207CE17E3", + "section_salt": "91B18AAB56D0B536F1791EE8D2C9FC1C" + }, + { + "adv_header_byte": "30", + "adv_salt": "D2CB7EFD8AC55A4B7782291095063735", + "aes_key": "E53A8922160B243CEBE1723E102DF96D", + "data_elements": [ + { + "contents": "90E198FFA1A1771232A470B41C3618551F808B37619364450C82D0", + "de_type": 57 + }, + { + "contents": "AA3536B6255F1E330F33A40BFC23BF0BE08BFDE03B278FAB353B55BF", + "de_type": 475 + }, + { + "contents": "ABA930A2B7EA27DDAFF5", + "de_type": 520 + }, + { + "contents": "CB27A674F14A84E844A2DEE7CBFF32C1ED", + "de_type": 333 + } + ], + "encoded_section": "9490135104FB10A397689EB08C2D4E9BBB0C1E911000979A8AFA25DB21F7EC13D146CFC1410F900460CB56ABE59BB2DC4C6C17EDB2CA9BA8D3214665237A16FE0A4124A3C5465CFCBCFAC32C1DE41A9D42B99C8D8D36EC9D3653CE7F286A0907AE9A8D270E3DEE03F7442D7DA18075C6620D6292861C1FD97902A798F643343DA5F9879B71FE88D1D6514F1B41E9A209748FD124F0", + "identity_type": "provisioned", + "iv": "4C1351CC073E7B86D90BF026FF0807FE", + "key_seed": "91980B5B07EF7D557FA8F5E60411D2A0F2F449E1F9FA2631250BD86E5C8B0142", + "metadata_key": "8104BB265F6A7B5B61C316DB48EF06E1", + "section_mic_hmac_key": "0DF5F3A00DB4D6AFCF99FB6826F9DC765C289B7937587D1461D825FE4D6FAF41", + "section_salt": "979A8AFA25DB21F7EC13D146CFC1410F" + }, + { + "adv_header_byte": "30", + "adv_salt": "B184B09431BC6D20C3CBD8D108EC4E2C", + "aes_key": "4EF35CEA87B3BE66A3C3D72A64E4CA2A", + "data_elements": [ + { + "contents": "F02092", + "de_type": 129 + } + ], + "encoded_section": "3D9013AA922B9D3EEB866D6046657CC594A33D9110002A4E2A1E8DA81FEDF04B8250BA2383A89004B6DC8634A6410E0FD602D04433BC254A51A050D6419E", + "identity_type": "provisioned", + "iv": "5ECC70A88EB4E67063D4E0F57831F4F4", + "key_seed": "098C5CF53518E9D1F2F2D8D0AC948B9B8CCDEA905F999934824429C0426E34F5", + "metadata_key": "7D82E485F54A2C30295125C2A1984EE8", + "section_mic_hmac_key": "E8881B4E5CF4A053EEB38D0D8B18C7853E2001926A46471B75B864B23DECE677", + "section_salt": "2A4E2A1E8DA81FEDF04B8250BA2383A8" + }, + { + "adv_header_byte": "30", + "adv_salt": "47452213CC5FDC391929EEE09F724D0C", + "aes_key": "24274A9E54725581BEA8C3AD99D6FB45", + "data_elements": [ + { + "contents": "55", + "de_type": 280 + }, + { + "contents": "C5E7F5858DE92DDC1EF5A8", + "de_type": 403 + }, + { + "contents": "D111", + "de_type": 802 + } + ], + "encoded_section": "4E90137CD48DFFAF75C3050516CB8439CE77D0911000C7E763251945F46C637602F94E61A62590029B749B79A1E7192F10EE205ABD363E48F834C31AACD41E39E7B104C201C6D805EF464DD0C5AD59", + "identity_type": "trusted", + "iv": "FC666787DA6880BF68AD87F281129436", + "key_seed": "16376750ABB42AAE45961441C9251B3006EB249781EBF712994AD8E297BFB3FB", + "metadata_key": "BC8BA065EBBFD5F28D57B63473F648DC", + "section_mic_hmac_key": "D050DE0A2C557BDF173F3820B540F059F4F902A963D23AB07A27E97341433925", + "section_salt": "C7E763251945F46C637602F94E61A625" + }, + { + "adv_header_byte": "30", + "adv_salt": "397E5C2A10FEFD98E9764BB2850F9F70", + "aes_key": "B86A8C3BEBB410A7CA7937C27982E5A5", + "data_elements": [ + { + "contents": "4C84393779DD47BB70185D28196CE896331EAB", + "de_type": 999 + }, + { + "contents": "2DAE45BCA9D994FA2F8642E698B26E", + "de_type": 224 + }, + { + "contents": "6CC6616B25874F1670FA2664C467A442CAF6DA681FFA8B", + "de_type": 588 + } + ], + "encoded_section": "7990132E1215A7A422203DE07796127DB3749791100050120AFB3D493DB82A96A0EBAEDD595B9002290C00E97BAC5F0AE286B2F1B3EB9C9F65554CA39D2F0BEA8DC26C3C3FF3877C260EAB0C966B6D187F472E076B43ED87238C272FE87723A973DE2746FC47707E4646665461E0CCEF8D72E5AC6E410B53D4D4", + "identity_type": "trusted", + "iv": "671819F4C129CEA59570A45E40042DE8", + "key_seed": "42FAC575479AF4CF414FD25107A31CAEB82E876F63F2AE64F158B1193C1CE4C3", + "metadata_key": "75A7213D0E26DF12A237EA4969C2EA7A", + "section_mic_hmac_key": "0A42A390A90B39228144B934135AC7F799CF4FBB70BD8414F1687C8530F94931", + "section_salt": "50120AFB3D493DB82A96A0EBAEDD595B" + }, + { + "adv_header_byte": "30", + "adv_salt": "BDDEC437FBD471B4309CEA1E0151736B", + "aes_key": "56B2E5280671CEBDB46B21FDEAFDA8EE", + "data_elements": [], + "encoded_section": "379013AF79FB24D9AEBD4EDB9BCC1B15E3A610911000AC735789ABF3C926FE9787D8124F26039004EB9FD655DDA7116ABF7A20E5D0BDA234", + "identity_type": "provisioned", + "iv": "BD94284A1DED0703E49EB2A616033C17", + "key_seed": "D972FC64B93F5C9942A0ABC8646EE78A152FBB8BC0704F52FDDC48B7FF56CBB8", + "metadata_key": "A392A526A7068B94B1E3E25A0429F56A", + "section_mic_hmac_key": "922DBDD6A4F8865AD9824AD8FC62B30AAD2F8BDB93D3BCDEAACC3305E32A19E2", + "section_salt": "AC735789ABF3C926FE9787D8124F2603" + }, + { + "adv_header_byte": "30", + "adv_salt": "3A9B77465966324AC9F3290D2369987F", + "aes_key": "7E5CBD3F2102129DB706C8EE75A333EF", + "data_elements": [ + { + "contents": "847502E89C450B3FCE072D156090AD6C52B2D8", + "de_type": 645 + }, + { + "contents": "761BBA3496528070633DE149451D9AD4E3558F7476", + "de_type": 537 + }, + { + "contents": "AE9C840B555C", + "de_type": 582 + }, + { + "contents": "F4703CA172", + "de_type": 113 + }, + { + "contents": "DD2959D22A5E", + "de_type": 365 + } + ], + "encoded_section": "7E9013F9BDA274AABFD8D976598D24C4DF68339110009D4C783A6ED077F63A108F3558B4FE919001677C1A3E9ECD221759776116DF4219E28E1D79E7A658B09286A4A54EABD817A44B57078452B9E6957E7B49D0D73FB94970474298DA5CB0C6C2908BF42578F79E5EC1992A89A39264D9B49F1B5F559DA0F6C6D9314E8516", + "identity_type": "private", + "iv": "CC837603730CF2CFC59BE454DBF623BA", + "key_seed": "282A075FC7CF3101EE966ACAC968FE4841AF6C4531A5F2655E301C611FA6F075", + "metadata_key": "2DB58866CCCD71AB219184D30AFB8ECE", + "section_mic_hmac_key": "1A735D24B9F9C6A3ED6D2C01C9D797EE696EFDE44D92D2E7AC9C01BE5E18C915", + "section_salt": "9D4C783A6ED077F63A108F3558B4FE91" + }, + { + "adv_header_byte": "30", + "adv_salt": "62CCD10524DAC73729C1C47D671A9B35", + "aes_key": "6B3EA1B46FAD6834DDC93E9C98BF83DA", + "data_elements": [ + { + "contents": "B29B0EA86E6A724DCCAD1FAF", + "de_type": 68 + }, + { + "contents": "FB4B7ED6", + "de_type": 380 + }, + { + "contents": "87E233EA396E891F9DD432C299", + "de_type": 36 + }, + { + "contents": "ADFB0CEED7C144A0C6EEA37805ADD5D906F9D24009", + "de_type": 584 + }, + { + "contents": "75167BC12CE8255FEC4FDABECD6C", + "de_type": 650 + } + ], + "encoded_section": "84901321304B13B0CE78A9C654EA01BE27EC87911000356CC7D48B00218080567F86C8C226B59002B265CCC13ED42B84041556DD88578525CE07A7AC025EACA3F2F55D0F8A26C3F2A8B63D8B00173466BF45EE5F56CE1B3BA5A388238E532DBD0CE43823A12591752022676716BBBA2696C01A2E07367068170CEA04E4D675821C3AA19184", + "identity_type": "trusted", + "iv": "DE1A81AF6B53D4D1D4D50534FEE5254C", + "key_seed": "38A92224674C6F2BE57B36D8A191E576633DF9BA3D76DD32F70D72D415878DCB", + "metadata_key": "C140E14318193C8ADFEC1D2CBFA8213A", + "section_mic_hmac_key": "BE625934853E588137352DFC9C3574A129F96C993C4221C8990D91FB635B4F67", + "section_salt": "356CC7D48B00218080567F86C8C226B5" + }, + { + "adv_header_byte": "30", + "adv_salt": "3E4E649CF35F5DD9CB2AC8E02E80445D", + "aes_key": "07A72FF7D07703E075A69D477BAF0177", + "data_elements": [ + { + "contents": "9A68B1D0835C59498A7B483199", + "de_type": 698 + }, + { + "contents": "514E4A96E7057DD993624378D31FFA9CECF7E7B08BA9B4C73F", + "de_type": 405 + }, + { + "contents": "36364E971DCE98A7C23B164608BD1D4A410B79CFF32CACDD", + "de_type": 584 + }, + { + "contents": "6D6653D73680A3DF70FC0A0B098913CA93879CAFBC1845DA745E", + "de_type": 331 + }, + { + "contents": "15DD526DC963112361A3", + "de_type": 865 + } + ], + "encoded_section": "A89013CC1FFAF0DB58D146DFD9B332AAE9C0F29110001730E6F86D0561262F4E315CBAFF7A9790025D2C78819ECA218C6938BAF148CB6A981A2D0884BE9EF00D8E5680E2636626FCA4B60503C6C524ACAD4306DCCCF2BB36DE37EED4B651E8C4992C87E3EEDF4E8E6C1BA2298791412E1275FF53DFE8C771C880D127D47815972F804EF4CB42CB7C8B73A89CFDFADF42BE03DB2F21F1D92EC5DCDF46E58C17A6A3FC5F92BCF001819E", + "identity_type": "trusted", + "iv": "F869FF07F98E32C0AD55CEF91658D60D", + "key_seed": "5D1E0AB8AF70BD4F1F5E7AC632B46F0D3976CD3409D96D6336FFC71E0D0B1A39", + "metadata_key": "4745EB0C29D3829EA920471E4CF7FA2B", + "section_mic_hmac_key": "A542C3B2AD831E3212C0A66B8F78C7F1D4AE757BCC53E59EB57677DCD3B2289A", + "section_salt": "1730E6F86D0561262F4E315CBAFF7A97" + }, + { + "adv_header_byte": "30", + "adv_salt": "0E7BD813499926A0801C92B1929A3591", + "aes_key": "CF5EAFF5A6CF1C2D8D38957F9E572031", + "data_elements": [], + "encoded_section": "37901304FF4DE46CD91B9856A4E7F1BBD4C17391100006366EBDDDB9BDC2F6571EB0EE6D56079002C75CC331866205C21DC58413AEA40526", + "identity_type": "trusted", + "iv": "04A19C41665D6BEB5815BFFC82D2F20F", + "key_seed": "A2C54EBB8A466BDCC870DC0F024B654CDF6065B7982FF161DB4309726E8A9FEA", + "metadata_key": "40D555232C844D0DB6AC3D8B67C2106C", + "section_mic_hmac_key": "1B5B2EA645019085A538706A3639AFB2EF7F9DCE0262A9D156DE539C5887A246", + "section_salt": "06366EBDDDB9BDC2F6571EB0EE6D5607" + }, + { + "adv_header_byte": "30", + "adv_salt": "A904A75B1FE8745F8A7487D6A1F266C4", + "aes_key": "299B6E8D83C5F4C5FA5D7191776D5B74", + "data_elements": [ + { + "contents": "9D8ACA4EEE438F77F1ECF161C93E79C2", + "de_type": 25 + } + ], + "encoded_section": "4990138B48C8DA765DA321BF9E7F74E018BCCD911000D5DCA899C05920FBA96B57FD6BC22BA29004E9045654EA86C9EFF8533142B7EF6AA31D947E6A37AA8BEAF9C4072DFDA603495A11", + "identity_type": "provisioned", + "iv": "F7C11436DE1634CB790BFEFAE15A83E7", + "key_seed": "C2DE50F20E7A123F3221A92B1BDAE0BCC707FC399081324F41A2CD10D6E9DB19", + "metadata_key": "2561C501E52AD7DDDD24E5578A2BD779", + "section_mic_hmac_key": "510E4C8F9ED86CCDF0EB2F6E1282A8AD8087431F380602848EFAD4FA30A46662", + "section_salt": "D5DCA899C05920FBA96B57FD6BC22BA2" + }, + { + "adv_header_byte": "30", + "adv_salt": "3A9E993AA4BC248E9A7B18624A78A94D", + "aes_key": "0CF2C9FE3C3CD3B9A51293022090179F", + "data_elements": [], + "encoded_section": "37901393A3A8C7855ACB50AB3802D631C9C1F191100049DD85316190F271FC5BB2F620EEF235900225DD3667C9BD35154CD7B85A46923769", + "identity_type": "trusted", + "iv": "C3A5CDB16311D0A0FD03C473522159EF", + "key_seed": "213E324AD5D67474CB40E6F49657F14EE29D80CFEDC37794DEAE1485807056AB", + "metadata_key": "8B87195CD4A305E6383792D307FA7002", + "section_mic_hmac_key": "4826260A12292DE75684A3CC1020AC5F7D8F469BF7B7EFC3A9351FC22BAD1CC1", + "section_salt": "49DD85316190F271FC5BB2F620EEF235" + }, + { + "adv_header_byte": "30", + "adv_salt": "9B07AE29D7E24466EDAB0C5C73C14BDC", + "aes_key": "07C40F75E92319B0204F538597F215D2", + "data_elements": [ + { + "contents": "F22339BFB847E90ED663BF729597FA326FA5F62AEF5F6C5A9FB3", + "de_type": 403 + } + ], + "encoded_section": "549013564A1558904D7ECE81BCD9C42924A30591100005233215A686F5A39C58599759C1A43F900274A22947028C3BB7FAE0C8534773058C000D1C97B23B36A2670BDC8F618CEB1AFF283597F687C9112D84AA87A2", + "identity_type": "trusted", + "iv": "FA40033D2CD29E29AD8C494507B1612F", + "key_seed": "F9D1973B9579CAA560918B5AEBFF76FA48AD3DC1E0051569330F4D44F2998A0D", + "metadata_key": "AFB9AF8982A61787B90548314BAB69BA", + "section_mic_hmac_key": "AE7047E264D302914C648144850D03551C69C6F92EC92263B0942F4115DDD4E4", + "section_salt": "05233215A686F5A39C58599759C1A43F" + }, + { + "adv_header_byte": "30", + "adv_salt": "AA66A68B0A3E886BD9F44096E51B4D5E", + "aes_key": "316B88C5751E2FCD16B56AD488855D6F", + "data_elements": [ + { + "contents": "3C10A90C59A5B3AB5B927DC7AE03D4A0EFC634808E12A7AD40465EBCB5", + "de_type": 483 + }, + { + "contents": "F8A58360070B908E24356B895258022AADEEE54B6ACA714AFCF7C349", + "de_type": 88 + }, + { + "contents": "A082", + "de_type": 230 + }, + { + "contents": "2E", + "de_type": 484 + }, + { + "contents": "67B2DDE6", + "de_type": 116 + } + ], + "encoded_section": "849013BCCCC132898E376863C442E9D8411187911000FB535FD638820271787F1073F7886A1790020977D491E02CBE4C40A898A2B0132274D0213C6922DC3C44998456DEAD435761A0368FBC64137FFF54A12F6620BE0F06E71D2BBAF4317948F67907E841EEDE7DBEEC5EA81AF57D7A9C69390865382019406815C5CC1A747EC60A74FCDD", + "identity_type": "trusted", + "iv": "3D7C449B089A03FEC65839104E037743", + "key_seed": "6C82B15F2C059B5835E16ABFD28FEAF239E1A6E57AAD960CB852488196620D8D", + "metadata_key": "9955C2F5670EF9CB149A40EAC4A3A3E1", + "section_mic_hmac_key": "B19CA117C40072B06E08437F1DD8F48ED95C857460627636E99E04D3958F5E87", + "section_salt": "FB535FD638820271787F1073F7886A17" + }, + { + "adv_header_byte": "30", + "adv_salt": "8C90321F97287B8A091727E2083D892D", + "aes_key": "409C8416E73CDE13637F2E461F74A4BB", + "data_elements": [ + { + "contents": "BF7419DB336DB433E3", + "de_type": 71 + }, + { + "contents": "C7437F5427AF382361526C55B748240F486BECD95871", + "de_type": 173 + }, + { + "contents": "FB6A6EDF9FDB3F", + "de_type": 778 + } + ], + "encoded_section": "6590135BF61E4E7A9A3C8B73569D2C23DE591C9110009759D1DB407678D65A146AFD04322D7A9002915E8088FE74A7EA709194BB7E82B3CA9D4A67118CB3CEB441029EA23771ED3FB2B5F2077913AB93D66731AD972BA9B6DFBFE8420AC29D36AD7619E8741F", + "identity_type": "trusted", + "iv": "48F689048B5CA464B88E0C399ED506A0", + "key_seed": "FF7801A75633E88D16C9DA1732FDDD7662C9B1F484E904B53C1171069A0C25C5", + "metadata_key": "C34841270E8866200C48012EA3CAD332", + "section_mic_hmac_key": "B393831A2B040BDFC47CE74F8192998613BA5874343AEF5241B6914809AEA3AF", + "section_salt": "9759D1DB407678D65A146AFD04322D7A" + }, + { + "adv_header_byte": "30", + "adv_salt": "4680C0AB3A162A977F1C57FD6ADD5D6F", + "aes_key": "ABD9FDE4027238879ACC0E31B1DC8A2F", + "data_elements": [ + { + "contents": "2CAB91011DE905C17B63F3ADDAC747F301C0775F1B06256F0DEF", + "de_type": 580 + }, + { + "contents": "98C4592D01DE564D0360A35C983D16A9200FBD625394BCB770FE927F", + "de_type": 345 + }, + { + "contents": "AC22AE18E6DFF87F2441616A3CCFEA17DB0262E00C5A", + "de_type": 116 + }, + { + "contents": "5AF4697ECF2E9560DAC164049C4C39C08E8038E8C7C5111D096737FE12", + "de_type": 505 + } + ], + "encoded_section": "AB9013A9E3A860FA238886DFF136BAC79FAE34911000D56769B70F704174E61314E11917885090011AAB5050921F7F0C7EA625DF749AD07909D6B5200976E5F635FA2BFDB181F4D0FA37891826DF9F37580457EB33017A35964559778C9EC2839033159CA8426821731FE0798DAD92825ADF33234AD09F3133A6DB08F90A87FAF7ADC7D149EC4F65D29E5E8C677DA82642B290E287C48D6DD8DC76B1EDB530DAAC4F1BED596F2FAE1C5800D2", + "identity_type": "private", + "iv": "D88E5CD358B6FDE88C0BDA86B4C07FA9", + "key_seed": "FBE039E8BE5927062F30F03F84D8C8F3EA8405E02AD071A5464764457B2CA67D", + "metadata_key": "8B6C89F2D5ACB0DD38EB8969A8AFCEA7", + "section_mic_hmac_key": "FB915D2EAC4E6D75ACA0FFF189B2B4CA9092970C105D455A9850B9D492DD8322", + "section_salt": "D56769B70F704174E61314E119178850" + }, + { + "adv_header_byte": "30", + "adv_salt": "99EA2AB3143DE296D87275E3796EA726", + "aes_key": "B5369D466D6D66216E050B46C9626E9F", + "data_elements": [], + "encoded_section": "3790133258DA52075DC6CF650B3F7487D0991A9110002174376D9188577E3AD67895F40932219001E35CAFE972108A18170DCC16E8EC167A", + "identity_type": "private", + "iv": "620B7155C2DACCD4E172A0948B739392", + "key_seed": "4963C0F1DC3A169ED67E6D81873F3D8AB7C56776FEE18E8E24B227951D98F67B", + "metadata_key": "8AC856F31EDAD3C1D3B3ABFE13C69367", + "section_mic_hmac_key": "11EF3FB260DA29B8A761F75D3D1DD5258FF416466FEDEF1498754AD7B4F8F3FC", + "section_salt": "2174376D9188577E3AD67895F4093221" + }, + { + "adv_header_byte": "30", + "adv_salt": "6EFE58B2D4AFF119286E71653FFAFF55", + "aes_key": "1827305AC9AACA2A8BB69F7C721D9AEE", + "data_elements": [ + { + "contents": "A51A7BFB530482EE1A59FC50F9A29741189B68A6AE939F", + "de_type": 549 + }, + { + "contents": "6B5F83744DDE1AA1C365C2480782B682866505D7549709", + "de_type": 717 + } + ], + "encoded_section": "6B901339002EA6193FAD09FDF604C4E349E59E911000699CF720707E6FA5CE226F88AF8BAFED9001E27EA2E4CCD2461B944DCEB37E4B4B63B5F711F1A9C5DCF9A41A192CA9C5ADB735391DD0443C3C955489CF2AD75226E8EA1357595655BDB3E3601E7B33E5D8066B3F37A7", + "identity_type": "private", + "iv": "D364E25A638A624590BE1FA2F096594D", + "key_seed": "B5E64F3EEAB9749EBA831D592F1E9FC5AB925C3C5E0CEA6E129C6B8B8B4C342D", + "metadata_key": "5027B1E2C7F8CB8A2D11ED67C651EE3E", + "section_mic_hmac_key": "92BC5538046351A15ECC14E24E3982932E910A143E5D28F9DBB38340FA03DCF1", + "section_salt": "699CF720707E6FA5CE226F88AF8BAFED" + }, + { + "adv_header_byte": "30", + "adv_salt": "1BCD64B4EED1893C32BEF93DD9C971B3", + "aes_key": "DF5A125BB90A2D17FBEDF9B7C989D191", + "data_elements": [ + { + "contents": "E8F6BC0AA73516D2AB139F6FB8C9E48BB6F580EB70D3AC91", + "de_type": 87 + } + ], + "encoded_section": "519013835800D943EF3DC1B88575BC5477D0B5911000B7CFA8B2DB92728DA2812D9C0EDCD07590012BBEF78BFE3208F7DDF21AF44FF0DD82D580026F9F770A5E9F40C02C24C2E36456528561D0009C2B26E6", + "identity_type": "private", + "iv": "919E1A3794638BF621ECFA33E8A6DF57", + "key_seed": "03678FFD5CBA3537E25A891FAA50484AC0AB58A7D035D8DBBCB351D8643BB57A", + "metadata_key": "D2D13AC88CAB6E55984166209D685D96", + "section_mic_hmac_key": "2E0D2D30096D2F381F6C14F8393BC8DF670B3E975FA2BC937C10976F47BA5CFA", + "section_salt": "B7CFA8B2DB92728DA2812D9C0EDCD075" + }, + { + "adv_header_byte": "30", + "adv_salt": "57CAA17E3435CEE5F8CDDD11F8C71927", + "aes_key": "FB555F776983D6EF70245A2A74330862", + "data_elements": [ + { + "contents": "4D3378D9DAC41CEEB8BB45129747FCCCB813B17E1E046C319A6A", + "de_type": 687 + } + ], + "encoded_section": "5490135808863DB438BC813BB23FF000567C7F91100040EB6E953C154ED8BA7B70AF72AA84D290048B21A3E3351576DD8C0DF85AA924B4F0CD3BE49C8844E49ED2F1F4852480C165BA80DEB502D0BBFDABB448FD07", + "identity_type": "provisioned", + "iv": "122941F68AA7A85356610AB70E8F7347", + "key_seed": "77BAB0D78ABC0316711301212D5429493421B2F32FD219C784512871C37891E1", + "metadata_key": "55E20264C236C78308649B3A717CDF5D", + "section_mic_hmac_key": "9299E65289E576D14465C3782E08EDFA71F7F0C4B96DF5D9A027A20C09D44F32", + "section_salt": "40EB6E953C154ED8BA7B70AF72AA84D2" + }, + { + "adv_header_byte": "30", + "adv_salt": "918EC773233875D9A8F95ECBAD0F1FDC", + "aes_key": "9C727238CA3610D54D119E718CD06BBF", + "data_elements": [ + { + "contents": "62F33A8DC96064763369", + "de_type": 146 + }, + { + "contents": "692DB5463436975E424A40014D6B7453611B22431310", + "de_type": 87 + }, + { + "contents": "36EC94C156296D1A90", + "de_type": 121 + }, + { + "contents": "9F399BC4", + "de_type": 102 + } + ], + "encoded_section": "6D9013C4073FE83CA7F9FEEDE4564CA14A7D3A9110008AA71BBFDDBD5BDFE769C6AA971E20F690020F902663091D7F10A3326C4D6B7AE0CE21D0C7958477125C301C53AA265F8A0B76B38BE77C63049ACD8FABDFE029010F95D25F182016A122C041FDCFD2A36878BD53F608C7C1", + "identity_type": "trusted", + "iv": "8161FE7F58DD7CB51C94E893C3E77E37", + "key_seed": "7689440ED67C78632C580EB736AD5409C5B70833835188FCFEF762CA0ABA64C7", + "metadata_key": "CEE36091D48B6A6933349BAAEDB06D3D", + "section_mic_hmac_key": "A6C8112D9A7DD48D4AF3531A38C820AC7FD247231F4F433E8B11238B7EA5156A", + "section_salt": "8AA71BBFDDBD5BDFE769C6AA971E20F6" + }, + { + "adv_header_byte": "30", + "adv_salt": "DB711D39B427852337FA71D91CF55BC5", + "aes_key": "A81B8FC02A525DCB4C2ED8CDDF285900", + "data_elements": [], + "encoded_section": "379013129BADABE83AB0218BA8A7AFA43684A19110009DE7738771FABFE6960860DEB9DBC4879004259342BAC650F527B4A5A74597FC93FE", + "identity_type": "provisioned", + "iv": "B504D33DE1BB8832C1EE8AC54297D743", + "key_seed": "ED24BBB04F28035C8765F7FCC5F1453E85D4781DD1640F498A9619D56ADFCA55", + "metadata_key": "16E55700FF5D1BD29430088C8A23C42F", + "section_mic_hmac_key": "10B0CAA2CE15EDEE6A19C905EEDBC6F8C082C77AE22A83DAE646614B1AED0493", + "section_salt": "9DE7738771FABFE6960860DEB9DBC487" + }, + { + "adv_header_byte": "30", + "adv_salt": "15ABF702A2921EC4DA6280535C861765", + "aes_key": "22CAA40B3717F99A3FA4B2A1E7055588", + "data_elements": [ + { + "contents": "6064E54E", + "de_type": 130 + }, + { + "contents": "B513C3896B41F8954528634301C2D8", + "de_type": 319 + }, + { + "contents": "1337431F91509A4888A9F8853595A5546D1256650020D6BF151A0763D534", + "de_type": 276 + } + ], + "encoded_section": "7190136F47402C06F69E2F7BF935775D518D1191100026443E2A7BB7B32D564103572A0CAE959002A855F03507F04308929B2E733D645113B958A3DEB579A55DEF36E35F3B62FA005BB752019A3556269FB98D95644DDDD59CE945E8E9C5B9CEA3057392DFC1C1B818EE361431C2E0C6E3C8", + "identity_type": "trusted", + "iv": "253F2EF0C8214125C7A3E1D209E540E7", + "key_seed": "F82F3CE7CC922B30FE16EACE6B79D0BC9ECA63849C981B97FA704A23CF9AC8B7", + "metadata_key": "63DA0B806E8F3FDADACCFC2312159E4D", + "section_mic_hmac_key": "B3B26A8FD11B78B0AE02C2F6C0B7196539CB880B46059BADF89752BB504CB95A", + "section_salt": "26443E2A7BB7B32D564103572A0CAE95" + }, + { + "adv_header_byte": "30", + "adv_salt": "1CABC21DB1C0C240529AC3ADB636F5D1", + "aes_key": "2F97C4674DF327D354244B462E131D1E", + "data_elements": [ + { + "contents": "3A8A8E0EA56B61160E614B6125C829", + "de_type": 828 + }, + { + "contents": "40A3AA30E70403F1B8CFD4D830", + "de_type": 267 + }, + { + "contents": "5D51B6", + "de_type": 335 + }, + { + "contents": "81D0363DE104", + "de_type": 110 + } + ], + "encoded_section": "679013332ED64969A6D47284A3DEEDAFC7DAE19110009301091AC070334AF39D4CABBE2E483C90044E44E6E6C66C28D442F35A77230D9B10B07ED47776CC060B127913850E739C8FBEB68F9296788975DA87970ABB72936522DD38FA9093C98EF5E501B3D30D1658", + "identity_type": "provisioned", + "iv": "18685A3BE2ECB910DD222B30E86E51E6", + "key_seed": "DBFFECF4EF406EA2C2EBF09122890602CF3F8C1423E72694F437ABE9A82A33B6", + "metadata_key": "7AC9AC9E384723D87516CC941478E97F", + "section_mic_hmac_key": "C30AD5035C7291B24097C6E6E34CDE7922C49A0850A2BB51A902C9F8428DC220", + "section_salt": "9301091AC070334AF39D4CABBE2E483C" + }, + { + "adv_header_byte": "30", + "adv_salt": "18E66C02947BCD1286672E1283BDB6BC", + "aes_key": "1578A1F187076139B90136E77F5325B4", + "data_elements": [ + { + "contents": "2C4D33C31E849376984F5DE450BE7BB9", + "de_type": 838 + }, + { + "contents": "73EED2D77B81D9148ACB2086BF5CA2076E8AB12A8E415E9063E3F7", + "de_type": 870 + }, + { + "contents": "4C5B", + "de_type": 222 + }, + { + "contents": "993987B210C00D832A84D6C2", + "de_type": 786 + }, + { + "contents": "0B292F6A1F2C4E7DA470", + "de_type": 158 + } + ], + "encoded_section": "899013A4E785DB6CFC84659689C9721A0681C59110006A298D4CFE290BC52CE0399AEA97C85290042D4C1056B7D2A834275E94A129445B1D230D19CC4DFEB321DED2C89D5565F5D2F3FBE7296E0A8B1391D0C17CB73871CA9DEEE1E1856DED3B5E4944B5473963DF10C107D0260FB71335C4C6CA0132465C56393F7E2B317ED72CEFD4FD4E4C4EF7F025", + "identity_type": "provisioned", + "iv": "D00CCF4974F89E0EA8E4AEA7B8B6A4E4", + "key_seed": "3EEEC66412789D30B844E8BAB2DD02F80DA4B193058C1F094B7F00C1CAEBFE31", + "metadata_key": "D2BD10BCC3E0A1341A1E5CB881FC46CA", + "section_mic_hmac_key": "07783CFD28D58E0E7E7A58A427BD526F8A23CCDB6D476C893A6577BFC8ABB9D9", + "section_salt": "6A298D4CFE290BC52CE0399AEA97C852" + }, + { + "adv_header_byte": "30", + "adv_salt": "EEA784B50903BB1F3867A3309D3BB38A", + "aes_key": "F1584E98535678BA37B4B88C1A1DAD6B", + "data_elements": [ + { + "contents": "B065975A23", + "de_type": 776 + }, + { + "contents": "97D0D8C01773B81CBB85D4654D48F679E3", + "de_type": 64 + } + ], + "encoded_section": "529013FAB685D2A4E8D074AF6CC499253657A09110005BCF7C32DB1AB7213B08D65BEB96C64090043C30F732BA2C311688F57CCCEEBF13239AA81DFC7AB291C3C348B1FC0188CD137DC2199FED907A60AE4E89", + "identity_type": "provisioned", + "iv": "2417AC781347135F7C4AC5E3FF5610D3", + "key_seed": "A4C8D1AE27A88EE937949D1DDE2C4812AA80B3B1325E85057DBAB45B89890E92", + "metadata_key": "98A2EF99CDCF4366703D6CA384F606B4", + "section_mic_hmac_key": "818E8767FA4D512C0A422AAC5298D9E6C492AA82728538F3E8563D48113667D9", + "section_salt": "5BCF7C32DB1AB7213B08D65BEB96C640" + }, + { + "adv_header_byte": "30", + "adv_salt": "9FFCDC2887E86DD97B1CD7CC7C926E61", + "aes_key": "12C10DFCA2552603C1FDE479C2F70930", + "data_elements": [ + { + "contents": "43D56D17A8F5E03D91BCF4E8C3701AAC", + "de_type": 233 + }, + { + "contents": "DD441A6FD3736A718759ADCECDE1", + "de_type": 388 + }, + { + "contents": "FE2437CBB6710097203765E501C075A7BB84D0DE6BD7", + "de_type": 319 + } + ], + "encoded_section": "749013BD1B29276423429D5C32272760B00E74911000A69871C2D73E23EF30656C35210BC89190029822466D8A6CB94523F1F44D254C56B91C690540A37F233A1AE710FC4543D795BA11ECDC085FDB87B25BAE832933A76BFED60786C41FC80AB6303E572681F54EDF82F395336E6B5BB2F525D963", + "identity_type": "trusted", + "iv": "B7C4C6B5D46933E315576FB563020BF5", + "key_seed": "6F549E0C976D9C561F18C3B7E2A11E1DE9CDBB3F5D961C8D897C4D62D7237D5D", + "metadata_key": "3CE3E026CFBC07F235AE24EA5D5488C3", + "section_mic_hmac_key": "D669B98BC3C5408BCBDFCF32F721B5958F42F8D0121B4CF506D250F7E9193564", + "section_salt": "A69871C2D73E23EF30656C35210BC891" + }, + { + "adv_header_byte": "30", + "adv_salt": "18FB5256D82A557D54A999C1A04077D5", + "aes_key": "BCB3BA61D328D7EFB9438222D888AF99", + "data_elements": [ + { + "contents": "AF5BC7C723B9708DE8AE0F997685FFC56598015F233DBF1E", + "de_type": 978 + } + ], + "encoded_section": "529013AFEA8B9B0A8FF8674527A31C8D5513D191100056E5750F6C377F9375156905EB02B0FA900403BC01343DA39F80CAB2AF188CC4D9EECFABE9CDBF75E32FA15F5BEC5AC24C1BF393C1C245415B38FA5C82", + "identity_type": "provisioned", + "iv": "C2337185C26056CE4441225DFE7060CE", + "key_seed": "3E54A3C0661B47A2B56B69385D57F404B59CDAF04806F5CD5E08C42AD1798316", + "metadata_key": "57D1F6D82B6598012DC38DF4102E9D49", + "section_mic_hmac_key": "02D21B6BAFC774F8225F653E3FA74CA072DEE643C20AF9AD115C0F656F0A8F7C", + "section_salt": "56E5750F6C377F9375156905EB02B0FA" + }, + { + "adv_header_byte": "30", + "adv_salt": "3534341126EEDD02268A7CF907032A29", + "aes_key": "941672BC6294A5FC9E6AC03BAEE156A5", + "data_elements": [ + { + "contents": "ECE25FB7FE3EDCEEE8", + "de_type": 642 + }, + { + "contents": "CAB4AF", + "de_type": 177 + }, + { + "contents": "FB38F904FB0A925E59AB186C824D1D121A", + "de_type": 81 + }, + { + "contents": "32E132145BF7683C7095FD150387", + "de_type": 990 + }, + { + "contents": "0C6369F4074A8980786BB4", + "de_type": 338 + } + ], + "encoded_section": "7B901388065746E077EC8D797B0F0FF690A0F69110008B5B67D02A2EDE80F9E163D2BBC2C82E90049D2356AD8289D2ACBD6BDFD6AD70D136CA59E15E92B5D2D9AD3D1EA16E97828F9C722C6F32937EE2CFE7E3C922E9A969BFB73BD10F1F6E83AA574DF3B638EA680838FF779235BF394F6ADE59208709F6FCA13DA6", + "identity_type": "provisioned", + "iv": "17F834E108A1E530E9C6DC04CE6B4658", + "key_seed": "DC2133269CF982E3FA4D23A8A3D7ED820B8C708C44037FE6D84DDEC982B4C971", + "metadata_key": "F785519027C49D46E817F41766D90C39", + "section_mic_hmac_key": "DAC78E12E6374EAA18B9DAA80A771A75969D0C6C343200000C0C32281796A829", + "section_salt": "8B5B67D02A2EDE80F9E163D2BBC2C82E" + }, + { + "adv_header_byte": "30", + "adv_salt": "9A85F942FCF43F69C7574D1CD2A0D0F2", + "aes_key": "0E0534CB941D842104C642B8A1F18A70", + "data_elements": [ + { + "contents": "DBD9D02102C6ABFEE1E045959BD444", + "de_type": 556 + }, + { + "contents": "CF6DFA9CC175A07C269B84B190BCA7A1", + "de_type": 330 + }, + { + "contents": "319BE819", + "de_type": 775 + }, + { + "contents": "8F6E2B78FCAF4B5CE5D246F94621ABC50DB3B19C7B98D570C85818B8", + "de_type": 958 + } + ], + "encoded_section": "829013E659F7589D9F22BF2F1E35BF3E6978F59110004BC4FDBDA1E0D06770F14BF61545244B900233E4203AAB4515AC6A71CC634449CFC1DFD064491ADD2C14E9E378C9E2098D434177D5549DA4D0EB463B520545ACD12D4805CEE4B52D218CEB5667F770833B5B64EDE4EFB737ABCBE830B68090E53965ACB5242A660E83CB82F558", + "identity_type": "trusted", + "iv": "DA6BF37D65F973CA1A00522E49BC32C9", + "key_seed": "54C796907B5F73DA86CF7C183276E8FB928EC324D625DD57859A986635668117", + "metadata_key": "ECD687DD1F9FF1CD096D76E6034F6F9A", + "section_mic_hmac_key": "6DADAB8D9E47EB85161A5159FE728B9F74842B24584FF530D98584C0F6B265B7", + "section_salt": "4BC4FDBDA1E0D06770F14BF61545244B" + }, + { + "adv_header_byte": "30", + "adv_salt": "9A5D74B1191EDFD5C9FFB3693DED74D9", + "aes_key": "C86DB754655DE997EC3B092B814A9D08", + "data_elements": [ + { + "contents": "B24E8C398A097EB6DB8070", + "de_type": 122 + }, + { + "contents": "FF8934664FEA786A", + "de_type": 959 + }, + { + "contents": "0496A8", + "de_type": 491 + }, + { + "contents": "290027D82CF848264ABC51B38B9F50301A2BE901B1865A", + "de_type": 917 + }, + { + "contents": "BB57846504B148C0D3D06CB420F09EDC69", + "de_type": 518 + } + ], + "encoded_section": "8390130089ED0335A7EFC59F0CF825677AF8629110003BC66A7E83C34665E8148E8F405DD6B19004D3446E2F9CCA273520BEE5910B42717AC24D55486EF1D4496F38B97F29F7ABB26ACB299A32164F4FBBD64DBD128650D6C4487B681812C9B810D559F1DF7A2E619A9A2486EC27B55F48A49DB4D3A5EA3BC486BD5359EA31CC1E1E101B", + "identity_type": "provisioned", + "iv": "9FCCBD881DDFB881671D7C7F7F1FB16A", + "key_seed": "48C3FB983526200C3940D06E401D1E447353B058DD3C4A1F518B9CD8F045B31C", + "metadata_key": "449A2DCCC6E26F9AFBB91071ABE75193", + "section_mic_hmac_key": "F57B9C5889C41E7D404CA50D39992A03DDD9D7348FBF57C9A8B5867A01219571", + "section_salt": "3BC66A7E83C34665E8148E8F405DD6B1" + }, + { + "adv_header_byte": "30", + "adv_salt": "B9B184BAC61B4F93DFC9C3067F371D17", + "aes_key": "CF403FA1E7BE86B53AF114A1B0D9C426", + "data_elements": [ + { + "contents": "B051C4367A69BF4878", + "de_type": 528 + } + ], + "encoded_section": "439013E664890A3457FCFD7EEA5AB752B14D2991100097E8397B9ED7E8E71313D8D606145444900402DC632F0AFED33FC49DCC6693C993BBF5040BCE4A4D0900C1076958", + "identity_type": "provisioned", + "iv": "F46A38E8A66A6D683FC6B94C6C04640E", + "key_seed": "BC6F5B315462737EC913FC8716950B18BDAC5D2D7CE7B62E987736D9C8A51D00", + "metadata_key": "4132EBD8503194CDFFA3DB4A9CF4E9F5", + "section_mic_hmac_key": "77646D5AFD46271C0B3E18910808CBAB5F5B196B0C7F4363A719C58FFDA9863C", + "section_salt": "97E8397B9ED7E8E71313D8D606145444" + }, + { + "adv_header_byte": "30", + "adv_salt": "E5934BA045805A7421A56BA0D4CB8F9B", + "aes_key": "888368B6CCCA3B33D5A6FA3CFDB8D12B", + "data_elements": [ + { + "contents": "D6CA9F03DBF64CA2B9439E2AF8672702F81E82B4", + "de_type": 767 + }, + { + "contents": "6937CEC064BCA1095885872E", + "de_type": 993 + }, + { + "contents": "746A7794E1520BF389F1", + "de_type": 968 + }, + { + "contents": "DEEE6D20B58534F9C1BA4D746648CE", + "de_type": 645 + }, + { + "contents": "", + "de_type": 190 + } + ], + "encoded_section": "7F9013ADC90DB7AB8EC54F721AC09BF0A8E89E9110001FFA28EE4F6B26C093F26CD48274E4749004CBC23042E5B3B7E471C006FF749F88E3212AD450377C64170A389DE0A1D02C4F37AF61AE5374AC0B38C772117A1AC53D6C19CE24488A51C292B903548563A6F09ADE9742B311215D27EA48C7EBFD970179AF4C509A7A528B", + "identity_type": "provisioned", + "iv": "C666D37611C02A62008EC134E0043096", + "key_seed": "065262498762C06838CB80F57356EF74A34649A8B256444C31D0EAB095B48038", + "metadata_key": "424141E8B96A7A3B35DF2F27CBE572AD", + "section_mic_hmac_key": "E4AC63DB35CBEB6526D701F511D6F93C0EAC5AAEEE8E15511F560952D60BE443", + "section_salt": "1FFA28EE4F6B26C093F26CD48274E474" + }, + { + "adv_header_byte": "30", + "adv_salt": "8B09B5CC8D452AED21A27051C4212C03", + "aes_key": "20CB5F8E502A5C231631433D3EA74C3A", + "data_elements": [ + { + "contents": "FDFA36FDC1E841BE8CB8CF9F786927EB3C875ACA8782A40F64CF87", + "de_type": 994 + }, + { + "contents": "C217151453818FA83E", + "de_type": 302 + }, + { + "contents": "CEC2831E815B7741DA4AE1B430191A52A9AB542623796986904825A9F29F", + "de_type": 375 + }, + { + "contents": "61106F238FAC929705D579362ED8F0654FFBECB7B3", + "de_type": 882 + } + ], + "encoded_section": "9A9013AD9DD460657404924554D5ABA137FCE1911000FC40CDC9F0268A4359DAAD8CC738FBAE9001B4A4E4F36C74E4630E303CF82CC7389673E052C09E190A6EE06D066956B4DE265F30D6BB6A1FFB90C7B0AB0E988DBCD6890AD54EDB925700587ED26438093EC7522F59C4D96DC3A05D57BED63FC0FDDE6921918B0401ADF02DE8A5015FD893589AD840C2D9A883970D73D4E78252E108E952CC", + "identity_type": "private", + "iv": "3AF0046E60E52B687DA9B405B04EE4C9", + "key_seed": "187A06076F56E434B68E0198E97AD9A3DEE2B8330921232770A7081304A5A197", + "metadata_key": "20D24EE641F15A53359F2173BF22D6E7", + "section_mic_hmac_key": "92281B4C5EF9136F18CE22F5B052F0782AC51DE3872A56AEA4BB5EA9BD6F02F4", + "section_salt": "FC40CDC9F0268A4359DAAD8CC738FBAE" + }, + { + "adv_header_byte": "30", + "adv_salt": "1980BDCD7189D278FDCABE4B5A1606F0", + "aes_key": "E6AC160A241743BD2F26D4A0613D370B", + "data_elements": [], + "encoded_section": "379013EE631DD1C657D166AC8350CB989079D2911000452D2E63C89D362EE8D6B4C81675EF5D90012FE7D7BE11D828247000351610FCA587", + "identity_type": "private", + "iv": "F86E064E37573CE05667B8CF12753CB1", + "key_seed": "80BFAC30C797B1AD69B178398369D8DEE740D9020AAFE9AA25A7E30E82C6150F", + "metadata_key": "C4D4EEDFDA9C4A7F8A605B6AC7BE644E", + "section_mic_hmac_key": "60CA863FF6016A0BB84CA68A347B1E20B94CED09D9D0FF8F8AACD72CA9D5AA06", + "section_salt": "452D2E63C89D362EE8D6B4C81675EF5D" + }, + { + "adv_header_byte": "30", + "adv_salt": "CE3637F7C9AD29DC4903BBCE71B3EDF7", + "aes_key": "283D03C921033734F5FC72BDBF2CC23B", + "data_elements": [ + { + "contents": "B9D0AAEF", + "de_type": 758 + }, + { + "contents": "13E90EA2DE8A3B96E136541945E1D14A54D07038940ABB3FAD225AF3", + "de_type": 983 + } + ], + "encoded_section": "5D9013F16575E13C3E78AFED9CD58FA081D9DB9110000ED633E1509B9C35BB340C85E69F20409002CE471E855E16C0CD3B96A38178D8ECDA75CF3128C160846194A450B3991578950E8CCD5021E3EF114EB46E4E412602DE3E762B0CE436", + "identity_type": "trusted", + "iv": "4A371511BC88F24D6FCADCE37088F34B", + "key_seed": "FE21995688DB34483CDE840FD00F9A96CC425AB8E6775500C108430EC0E823D8", + "metadata_key": "64C0230DC2C5593746B2B0CE14AF63E3", + "section_mic_hmac_key": "72108A75932EE23C133B987C0E818D81822E004E67F1B47DE6F9C1DB088264DA", + "section_salt": "0ED633E1509B9C35BB340C85E69F2040" + }, + { + "adv_header_byte": "30", + "adv_salt": "B162D1322B5D26249649CB969B4F8102", + "aes_key": "E92585DAC5D7F4662EEA29655E50A4CE", + "data_elements": [ + { + "contents": "A9EFEEF17500ABA6053E234D49F9", + "de_type": 176 + }, + { + "contents": "29EF333A49CF43E20C253605AA083893D2", + "de_type": 459 + }, + { + "contents": "2FA4FB0EA60274A5CACFA47E4B", + "de_type": 504 + }, + { + "contents": "83A7CB21AA6B3A1923F7382E4FCBB313D3E7E61DAFAD3E7EEF32CB3EF93C", + "de_type": 313 + } + ], + "encoded_section": "8D901309D5FE388C56BD4E5F6322943FC3A048911000F5C76DF48CEC6BD8CAE990AE8BE181C79001A92EE39ECD5870537FF134794D9F747F6DE78C4512B3F087F0637BCB1B7EE8A0539D82E806149FC2B0D7F76FE39D9C4D820F714CEA248E808605929CA89FDDFDAADFAF87CB1EB88690382E08185623C09585E5489C21B5941F607AEC56E2CC36DEF0244846A8", + "identity_type": "private", + "iv": "BB9EE514C99F0518104C87999D49A754", + "key_seed": "AC4EC8D356CF255D5AE8B9FA0B792CEAFE7947F8559AF2723AC8B966579FC0DC", + "metadata_key": "4576F651F9196F707DCE4E1F599D0783", + "section_mic_hmac_key": "8BFCAD24C2D370096D0E954E9A3363C8C0B239729D5B0A45E9B093A6A377B2A9", + "section_salt": "F5C76DF48CEC6BD8CAE990AE8BE181C7" + }, + { + "adv_header_byte": "30", + "adv_salt": "5B297B4DEAA667E3D6FB370EC0BF95F3", + "aes_key": "99F1560561D5A887142C3C55D312DD52", + "data_elements": [ + { + "contents": "5C2CE141B3E5A889599146", + "de_type": 37 + }, + { + "contents": "1848600B2D546BCFBBF6C7C8705D", + "de_type": 192 + }, + { + "contents": "57DC2206B48105B60FA3C8BBF187A500", + "de_type": 487 + }, + { + "contents": "7C3D131E2C31", + "de_type": 195 + } + ], + "encoded_section": "7190131A58CC7F4415B7BF7472C0F89D5AC2E391100084075A84F9CB2D02F54F96F87F1A163E9004C6AEC8AE7B9D25088001CEC6C53AE2D4FC8FFA1615483B6AE2DE6FDA409B13F33028543707A88A02A2C462CB81AFFFC81B3655BD8D733A13F133BE4138D8DCBBFA21E7FD4B72CFB66E63", + "identity_type": "provisioned", + "iv": "8B28D0A8180C17783E7653EEBAC132BF", + "key_seed": "577AD6CFCFE8E1C3ACBE1993BFAA7FA05F81EAC8AC1E83C7E0198DAEBA7FD1F4", + "metadata_key": "73BB407DA49FC66BB9C315EA94EDF8BC", + "section_mic_hmac_key": "995E2E8ED0F4F4C1CDC5D13DF3C903B149EBD84F41E4D088A801A8B9396EE8F3", + "section_salt": "84075A84F9CB2D02F54F96F87F1A163E" + }, + { + "adv_header_byte": "30", + "adv_salt": "EA6DED68CF0959239D11427F74FE997B", + "aes_key": "9FFFC08CB431531D60DBE654D099E048", + "data_elements": [ + { + "contents": "539C2665DD42B55FB0E9", + "de_type": 658 + } + ], + "encoded_section": "449013ECAADB35F533CF451CBF0B38EC937432911000D32DB501E334CAB82F79520F3C892DB79004E7750EE5BDC44BF9BF13543DF92F315E25D7E54780C7A2623492AA0175", + "identity_type": "provisioned", + "iv": "023DD3C725AE97C27DC0788CC095B6E7", + "key_seed": "9EE6A42100524DD1D112A596D5405581586D40BA87C77DD85F8A6AB92EB9E1FD", + "metadata_key": "AA74890853C6C5BF4EAB72B38C5E2C2A", + "section_mic_hmac_key": "3B6C00CF957CD21086DABBB8FE4042307ABFFDDECA6D3CEB512F81C1F133F6F1", + "section_salt": "D32DB501E334CAB82F79520F3C892DB7" + }, + { + "adv_header_byte": "30", + "adv_salt": "AAC3A533A7C2AB440C26A8183F71CE3F", + "aes_key": "8B68336A07D6283B517488B995AABE65", + "data_elements": [], + "encoded_section": "379013954DFB4D6B1382D53F3D36B4521E1647911000C6ADAE90AF6B99E17D60C8613C5BA3F490044466909ED06184090A9DBCF69FDFF46F", + "identity_type": "provisioned", + "iv": "42DF51FB3C37AC171470D60D4E2F04CF", + "key_seed": "7C3FB67838916AB0E4F7BF68FE8A28C509A2A15BB3240BC8AB6CC3F99F52705B", + "metadata_key": "393F240A2C6F9EC4AFA756425A9CC2AF", + "section_mic_hmac_key": "AFA33F6D9DACC54E13B4F5248468F614561745ED8A0F29CD0F2E430873D9CE2C", + "section_salt": "C6ADAE90AF6B99E17D60C8613C5BA3F4" + }, + { + "adv_header_byte": "30", + "adv_salt": "81C6585DC0B3B9D152F79A23DB1C8882", + "aes_key": "E97F5929B62C0A82220838B588728F26", + "data_elements": [ + { + "contents": "72B7", + "de_type": 536 + }, + { + "contents": "1DC3", + "de_type": 937 + }, + { + "contents": "97CA765CF7E2E2C48B42330799F54489C934EB912308FA958DD04703", + "de_type": 387 + } + ], + "encoded_section": "60901338E7ADD6C6548D813C99134BA15D9A5D91100022EB17486F7CD2CBA6E39434537B2F57900207BFB512D4879502860E54B41669139A48DD0E42BDC66FDDF265ACA9CAA359F1E4CB1482A3D506646B21698F37317D0564F842CD44919FD767", + "identity_type": "trusted", + "iv": "BB11AC5F4D37033EC99BCF8E6779C7B7", + "key_seed": "11F86BFFAA9B66C77616DD6B32C63A6C81C50541BE9EF6E04AF0F953895036B0", + "metadata_key": "AC3C67CAA7794A04DD94CF515419466F", + "section_mic_hmac_key": "60B2EB5CF45F6600ECEC676CD76A4604B744E166B5935BF4C5C750634AD081D5", + "section_salt": "22EB17486F7CD2CBA6E39434537B2F57" + }, + { + "adv_header_byte": "30", + "adv_salt": "00511EF933CA6DC0EEDCB94B38987087", + "aes_key": "0ADAF776AF20958595ABCB87A10E984F", + "data_elements": [ + { + "contents": "1A464229DF04C31CCC08944B21D55EEBE9C1BE489B1790", + "de_type": 339 + }, + { + "contents": "BD56E1750AB74F38437A7EDD986E21", + "de_type": 92 + }, + { + "contents": "B0668FAA2F6BFDF67FD9033B8D0675680BC452D2FBD29D4F288B93C2", + "de_type": 768 + }, + { + "contents": "9E5C09A349090B3CF9B575821F0CE393462D", + "de_type": 850 + }, + { + "contents": "655C5910AD15C62A126D2FAF109A26", + "de_type": 399 + } + ], + "encoded_section": "A890132778CBA5093DE49E4CDF829C83BBC8B0911000FED627BBA15D95068F43ACFDF42D2426900157609145B639C9C92C2A81A0717C11219DFCBCE7DD6B6A80146CA785EC92DE677C43AB269672AFF27FBFE8A4A34EA6E4DBD5C1A53E8836BC8149E27A59A449E6752025DD324A5FBEFE17DC2EB8C0CEFA651F949CA334A0E3FBF9657C5B0C8C9CC819BF2C85EE8BE5813819372E1308CEF54567F70B8F6534A008CE0D407ECDA3D9", + "identity_type": "private", + "iv": "EFB9C48ADED0FBA9B2F10E7799B1BC11", + "key_seed": "05BA0D78A0AF7D0FC55A4B640C8573C74115E6BFB35CF849EC024CE0E5ABA91E", + "metadata_key": "4D0EDEF4A062C6A83A925F727C997C68", + "section_mic_hmac_key": "C3F3B8305FF694E5BE8EAAA0752CD8DA61D3E6BD544AE2DED8663F4B34ABF95E", + "section_salt": "FED627BBA15D95068F43ACFDF42D2426" + }, + { + "adv_header_byte": "30", + "adv_salt": "95758969EAEFE0163C295B1733BEBDFD", + "aes_key": "08B89985AB9371EE8A7C749FA10D7965", + "data_elements": [ + { + "contents": "42F3FAF94ED0FB40C070", + "de_type": 906 + }, + { + "contents": "2870FEE3B66905C1C865B578458847CAF0F8AF67", + "de_type": 827 + }, + { + "contents": "555387D04F9A2CCA92EE39E54408ED6F2E", + "de_type": 767 + } + ], + "encoded_section": "6F901375D05E0E76CDDBB5ECC6637172CAA0FA911000A1939F4A327A3FE2596522A22DB6C5A59001E0EB6C5B53D04DC02C32041E4880E4D65D84151A34F27CA74E7005C9BB2CC12BA2B343395FE847997119EA78AB0C1AC5B3F643A538C4FDD3BDA97B1872BF596AF0B0A59832B2D648", + "identity_type": "private", + "iv": "2ECC3361C8C791708F4C7B8C39C15D79", + "key_seed": "DA612AD55892DC4C53B80590D940929D72984DFF5A5F6F03DC23DF8E8533B512", + "metadata_key": "B1CAB6C41D016206FB92AD7B4DDE8B4C", + "section_mic_hmac_key": "3D75FC10EA014EA03A511D12A3001062354C69FD19910D31F7931635417D9350", + "section_salt": "A1939F4A327A3FE2596522A22DB6C5A5" + }, + { + "adv_header_byte": "30", + "adv_salt": "EA6000111B7177C842D94B678C834DDF", + "aes_key": "0FCEDA0332ACD49A195ABB867E6BAA1B", + "data_elements": [ + { + "contents": "CEABACE7D381A232FC75805204E7270B700D5B4FC2D8BD", + "de_type": 672 + }, + { + "contents": "9AD36A4438B590412E41CAD870CC8BA2CA27315D", + "de_type": 178 + }, + { + "contents": "CE20C944EC92910AA9878C", + "de_type": 587 + } + ], + "encoded_section": "7690133D110BD2D3C885F07437DDE3630C5D7E911000A4E404D0D8DFCC6F1EADFCCFF09E925E9001F6AA807E5AB71B59EC053660E13A15739A1BEABDFAA147D3285CD42CC0AD05CC1541D234FDE1FE6F5B0387CB7421B3212218FB7135516304295DF97339562FABAAB5D3D86107F5F7E8BABF6D23DAEF", + "identity_type": "private", + "iv": "A9DCBFC679102BB70F88C434A62BCB58", + "key_seed": "FB9B3394FA19B352B121F5176DC2BDE9DE6901F8A3C47AE297527EF13DF6061E", + "metadata_key": "1B044AFCC875CC44C5305B79FFD030BD", + "section_mic_hmac_key": "A9BEE21E360D0E27366461547D779FE698A82E16E40C2D20413DAC39E851C75A", + "section_salt": "A4E404D0D8DFCC6F1EADFCCFF09E925E" + }, + { + "adv_header_byte": "30", + "adv_salt": "EFB53470C08C0623EB392B698DA54733", + "aes_key": "560C8CA057D94CF4EF794E192324F93D", + "data_elements": [ + { + "contents": "668992", + "de_type": 643 + }, + { + "contents": "13DA", + "de_type": 684 + }, + { + "contents": "0644943798483CDE51287D117570D6B1879BE0B677D86D7FDA9E502E", + "de_type": 838 + }, + { + "contents": "8DE3050FB50AEAFE8825211569FD59526395E0FE71F9464EFD0032D945F8", + "de_type": 659 + }, + { + "contents": "8CC01BB0BB481C4C355440B4A65D3611345B036268B913", + "de_type": 578 + } + ], + "encoded_section": "9C90131E6B368314CBA81922DF93F3FB58882391100028EBFFEF24B6C89067BB31A550C043319001A26FBBE8A1AD2304583A63C804B269F163BCE88B8D89377B7CD26A0DBF6D331A12C84759AE583C7F7FEA4194BDDD77154DF89BA4B4E024E13E9AED6FA0B7FB27D467EA2A568B5C3324354AAD300CEB8C987E98E31234178DFD263E04027E4B8F0BC0EF53E5D77F45CBBA26B95E88D1036BA7BFCE96", + "identity_type": "private", + "iv": "F9F2984CE55D17978DA1F074305C9C96", + "key_seed": "BF601538B31CFC67922FF6BF44150DF8DACE1485BC93284F4166B11EFAA5344F", + "metadata_key": "5DFD83B4E657AA2BCD8A0373490573C5", + "section_mic_hmac_key": "470CF61CF85A1249F42A5CB24EC08AAB431E1DF4EC0B0391751B313C36715ACF", + "section_salt": "28EBFFEF24B6C89067BB31A550C04331" + }, + { + "adv_header_byte": "30", + "adv_salt": "AFAF84AACEF8881F848E7B85C7539880", + "aes_key": "CBD54146C955B6C8F00BA1D38269EA98", + "data_elements": [ + { + "contents": "FECDB0E0EA56B7ACE68A83", + "de_type": 120 + }, + { + "contents": "0B733BA3", + "de_type": 781 + } + ], + "encoded_section": "4B9013524EAED100DC3E32D41005234B543740911000EFBBAA34F6A5D2CCB39DFCF9C89714DF90025EDD541786FA33A58E7132F55209DBEF9242C353BB72CDD1550FF0026E18AC166956E6FF", + "identity_type": "trusted", + "iv": "413D670613BA8E8838386AA10F29C898", + "key_seed": "91165D9E35460BAE2E80856F736CA95A1CB0DDBDE92E6F55B2B0592E976A8030", + "metadata_key": "3999C8B72B85830A4F46CC24C0CEFEC0", + "section_mic_hmac_key": "3B4E66850E50DDB2376FD26E0B6506F2144DE3E4C9FF0F0ED3A2A95AA2B2CE4D", + "section_salt": "EFBBAA34F6A5D2CCB39DFCF9C89714DF" + }, + { + "adv_header_byte": "30", + "adv_salt": "437431D701ECBD564CE91F04AD002790", + "aes_key": "B7DBA314333C96D6E7420CC20C3BDB7D", + "data_elements": [ + { + "contents": "08F45E72C77E4F763109", + "de_type": 522 + }, + { + "contents": "4BCFD9294127CEFA59C6E3B17F5F", + "de_type": 246 + }, + { + "contents": "A0AA932C07DC7D06E224D95EC31C4AEA2BEC4AD37A66DD", + "de_type": 459 + } + ], + "encoded_section": "6F9013074F186DD7876DD0F5374206C65F523E91100050205EFE1CBB39FD3572899E4A9FAADB9004544DE8447ED37AB18AE43746E06D5331A4102428F2EE7CFF71482BC080EB01EFD1A42970BE9132663CF654846A92370CF909076D780976F02BCB93F4B739ABD92FC18DC1DBE28EDA", + "identity_type": "provisioned", + "iv": "F2DA6B13367A1D956592B937986DCADA", + "key_seed": "CC5669D6AB653BA0D76496518A8BEB80C904747724CF21ABFE711EF4E66C1717", + "metadata_key": "CD38133DCF3BE5E85AD5152614EBCC70", + "section_mic_hmac_key": "A5696785B14A4D7352246FFAA8926DA57C2D47B5E8FD9CAD3DEA52BE766122EE", + "section_salt": "50205EFE1CBB39FD3572899E4A9FAADB" + }, + { + "adv_header_byte": "30", + "adv_salt": "C90A438A50E93F2464F0EE55291F2472", + "aes_key": "783982C76051896CF3879D01AD48E82B", + "data_elements": [ + { + "contents": "DE3D9E2E05876097FA1D8C", + "de_type": 129 + }, + { + "contents": "D066B484718CB966E1F4BE4B3DD52C712077A3", + "de_type": 145 + }, + { + "contents": "1A8F96D8CFC568DE5FA81E2E25B21F", + "de_type": 162 + }, + { + "contents": "8E1B11FA0970BB66441B5D9EE43569EF92D9A93D9443F868", + "de_type": 296 + } + ], + "encoded_section": "8890134276D816E4465BD410B3B16E1D9E7D5991100023F02B2A00F1E5E9A1ED089BC433715F90042013AD595A1742D2EED91B031F13E399FDF21F4B491120694D72ED8E822B87C7C13CC13019BB1672281428A2F2ABDA6FEEA9661AC3179C926B3A51A3C529040BBE048DCBAB14D4DCE8093CD66015BA0E77B61B922E20325F51799611608E694330", + "identity_type": "provisioned", + "iv": "213A6CA4A300251C8E06F982E3ABCE8B", + "key_seed": "E5C922600165DE89DE7441F0312C7B5F977D674631C91D6046227C6A56B1E21E", + "metadata_key": "3CA2053EF6F21F47E9FAFD974B23C5C6", + "section_mic_hmac_key": "5ECE1E81AFAFCE2FA416FC9DBBEAEBEB154F1C6A956CF2B32A0795E7438C7975", + "section_salt": "23F02B2A00F1E5E9A1ED089BC433715F" + }, + { + "adv_header_byte": "30", + "adv_salt": "DE17942EEA2F8A64B88FA1BF6DEC9995", + "aes_key": "17BCEBB9A4A9490F404AEF55D5729ECC", + "data_elements": [ + { + "contents": "A039F67CF7F3", + "de_type": 399 + }, + { + "contents": "E9CE7BC13F8EC91D4A7B2DD9AA389F472F5090E17DF4FB99546AD8A73E85", + "de_type": 470 + }, + { + "contents": "71F962A82E4C980D", + "de_type": 494 + } + ], + "encoded_section": "6C901356238CA02CB62DF82AAA695B9F99C76E91100067859E665050534B84E37961D658822790025D988421412F895E343CA8EEAADEE1CF2E12DE25EB2C2DD52B2368A7C2451CDF00DBA31B44801576BD6AF8B6D689EF232C4250C363ABEF30F39E6276FC9FCC28A33A83287B", + "identity_type": "trusted", + "iv": "842B1A1F3A3102058F7575310293CD3E", + "key_seed": "F5E1B94291A9CEDE059BD01045DAAE8E7BF8F9B4DCFD98C816F14D17E5AAAC3B", + "metadata_key": "9CFF8F87781CD2434DB335C063DA7EFB", + "section_mic_hmac_key": "96EA7A011BD46B42FED04395B7554816A3770C9627EA8140A954C834E6D95788", + "section_salt": "67859E665050534B84E37961D6588227" + }, + { + "adv_header_byte": "30", + "adv_salt": "EEC4ABA003D9CAA5E225EE938E59A88A", + "aes_key": "A3ECB264388150FF04523DE0CA4AF3FF", + "data_elements": [ + { + "contents": "5844574BA986DBBC3FB734C6A0E1FA9D5117CF282C06C47E6CD568CBFB", + "de_type": 826 + } + ], + "encoded_section": "57901396739698F47EEA126FA41FFEAF83526B911000A1C40F8D2851B55CE81385810F82C8999002889342B7DD12A80AE6337FDE0EE82E22533592B5E902E6763AAA274863B2CE7B4621AD059338821618D09ACC1481A060", + "identity_type": "trusted", + "iv": "6F7CE3865CC971472C29270AE628765F", + "key_seed": "FB21E795C55BD93DD87F63107ACC78ED61E9E17DE0EA81C9A6300BA63F1B369C", + "metadata_key": "35D70D76E387E1BCA4D02CC6BFBA51C2", + "section_mic_hmac_key": "3EDBCF936225088A78F30EFA4825982F6EE29398679AB1661C1F365D47538EC4", + "section_salt": "A1C40F8D2851B55CE81385810F82C899" + }, + { + "adv_header_byte": "30", + "adv_salt": "40DD0AE6AE5E4181F03C8A77CD35D51B", + "aes_key": "016F45AB063A9098880BD35B56F93324", + "data_elements": [ + { + "contents": "75192B40B7328370B88E0983A13901EB57AB1522A4646850D869CD", + "de_type": 851 + }, + { + "contents": "6A21620BDC9E", + "de_type": 810 + }, + { + "contents": "6F1BCC7D79A2C824CD4417A720A7C470C2EFA8E901E643E8B4", + "de_type": 502 + } + ], + "encoded_section": "7A90139875296CA1A492DC5433EC0C158390D291100016C8B52E762259821BB72DDCA26B7B4B90022BA2F6C9F36284CA3BD06F8F1C7316988CE9C1461EFD1081A9C6F88C03039DF4C3798990FD9CB1B7535582A27E091340D56BBBCC6251D716F0F64208893548ABFB4B8CEC8273B1B9E188A528783672B31188C7", + "identity_type": "trusted", + "iv": "E4D5AB6C234F20EFBEFDB8D47694BBA8", + "key_seed": "604C1B551B481F1A897F85DEC2F35DDCDC7C5AF74CE2B45B8680F76EA13DC626", + "metadata_key": "CBE00FD5F6CAEE0428F8AC2EBBB876B0", + "section_mic_hmac_key": "DE57E2DBDD55226FA52611244EDF1FD974C633EE264AC51EC09AC1F9E192F60E", + "section_salt": "16C8B52E762259821BB72DDCA26B7B4B" + }, + { + "adv_header_byte": "30", + "adv_salt": "493740337B758DD54FEDCDBBAD59FDEF", + "aes_key": "2CC6A4D0D81ACF8B800C71D3883DB5AA", + "data_elements": [ + { + "contents": "E05DA93367830FBFF2A5A06D84DA99A681101A994B5AB5CD", + "de_type": 299 + } + ], + "encoded_section": "5290139E7281721A0C71BFE961E2BB6EE3EE169110002DAF1ED3BCCFA03A33C8A12EDD6A774090043E221E6BE16A640381C047CA79D446940E7159C2D63E49730A006BC0B71019200340F11B7BF4B6AA8F80F1", + "identity_type": "provisioned", + "iv": "CD540D1F885B93C6019EBC6B1AEC866F", + "key_seed": "DA6F8D036A011F4EF959EEEB64DD7DD7BDF1E30F0EAE672B49D8A68E6D175BED", + "metadata_key": "EBD30CAA381AFB2446A295F1E33A205C", + "section_mic_hmac_key": "8728D6EB04D094F213ED25E9DE0C797856C5CB6378061EA7A7E0DC5F801DCDFE", + "section_salt": "2DAF1ED3BCCFA03A33C8A12EDD6A7740" + }, + { + "adv_header_byte": "30", + "adv_salt": "6B6C93C92DCEA4FDFB0EE6F40BE8DA9C", + "aes_key": "19BAB81AAD722A2E0CB0E1FC5A14A854", + "data_elements": [ + { + "contents": "7580DFFCE3D30EDD2DB5AC5F18C4AA8E8D", + "de_type": 370 + }, + { + "contents": "EF1E4F25CD5A8888CD41F0237A75EDDB9801E706578EA0619C", + "de_type": 207 + }, + { + "contents": "FD9E1EA36172D0F5EF", + "de_type": 761 + }, + { + "contents": "3FE5D2D5B86DC22E2BBC14612748CE40507CED56B0ABE2", + "de_type": 822 + }, + { + "contents": "8C7B1B818C82412946EC964A4AFCEC5D77F2E49AE42F247CA419", + "de_type": 628 + } + ], + "encoded_section": "AA9013CA08132660CA46BEE4E55FFBF82D98F1911000EC8314769B664C86461B6EA9E12773969001D9853FBE75F68B42B3E95C7D5B3E08DAF0585FE8292777E631F36ED2E0E0A639C821F5AE2786DBE51893D9DF92C68EF63E01F735F69790B7847ED685E3D4851F53D672EA63164B84322A49DDA9BE84427590959F035A608D964F3C49D6BED8E446AF319FBAA9BCC749199BC14CC3B0F5D74E1E6BBF6517A41FEEE61B5112A968883EDD", + "identity_type": "private", + "iv": "147048CD988E7F8643E32E2449ECCA07", + "key_seed": "61D23B0B31E7D1C9A401378119A082952523D5A3ADD9D2C56EB29D695F8EDFBE", + "metadata_key": "40ACD53A2B51E6F0C26CBED7D58B2D0D", + "section_mic_hmac_key": "CBCD4D44B600248C33BD5BF177E470EED36A1295E9F2E7813D3BD827001A2EF8", + "section_salt": "EC8314769B664C86461B6EA9E1277396" + }, + { + "adv_header_byte": "30", + "adv_salt": "80E94BB8F2BF0314AD27A08808A81E8E", + "aes_key": "D48A2B9E344DC5E13A29F40C4F4B0BAD", + "data_elements": [ + { + "contents": "32DACC08BD9CAC4BEFF141E364D6D9B408EAAF", + "de_type": 840 + }, + { + "contents": "F2379E76F0E1972ABE60536A9B004F93F0F6229E", + "de_type": 693 + }, + { + "contents": "", + "de_type": 482 + } + ], + "encoded_section": "6790138854BC068046A9DC6438D9AE0A6707A09110002FA6884A260B808CCEC3C12E058DE4219001B1313868C07F461355998AA9C33D1625542C04A413FC422FDD8BECE20E4EBD8157ABA83E0FE1EEF9D471266DC5EBB50B910DB51086D3AB261A0C64EAB6E1199B", + "identity_type": "private", + "iv": "09E7564C426DEC118EE479ACA32437E0", + "key_seed": "AF6DF5E99E86E3CD676BCECCA7295E1313B989E329F4540A9FAD643A0F1ABE51", + "metadata_key": "C064817D63652D0DD19F5A6ACD6BDE17", + "section_mic_hmac_key": "0E01561E7D972FC6EDE73397C102E4062644EEC472F6DC93FFA93AEAE66DCD6D", + "section_salt": "2FA6884A260B808CCEC3C12E058DE421" + }, + { + "adv_header_byte": "30", + "adv_salt": "0873B091BF980929D63B07E49841EA92", + "aes_key": "360F5E0D4F6F7F0D293B7C17B02629EA", + "data_elements": [ + { + "contents": "13E936", + "de_type": 684 + }, + { + "contents": "151804DFB79EF7222A24A5701D87E68208480E", + "de_type": 606 + }, + { + "contents": "80D6BDDCFBD6B69BC93D93D53C", + "de_type": 492 + } + ], + "encoded_section": "639013DDE68E24EE100BC81DE740B78E1CCF98911000AC07A89E68FF59661FE04EF27BAA690C9004A89E30884E4411C87AFCDF22A2AE9DFD4358D0990799ECD6D36A392C3C2F382C4056A2029A15D0C6812B5854F70C369A2F942262DE9729FBA65E79FE", + "identity_type": "provisioned", + "iv": "136FA42D9B2B99B94F546C2C7E449F74", + "key_seed": "F11C412BCBA4EC9352B8503D40CC8263F8910C07ABAF1BD91F7058EF6D8145EB", + "metadata_key": "64E6F3A83672ED26CB920D57705CE772", + "section_mic_hmac_key": "2C1630C0416F925EC56A27E00FD6824259447F4718C8100EBFCE6E2E592E1D9C", + "section_salt": "AC07A89E68FF59661FE04EF27BAA690C" + }, + { + "adv_header_byte": "30", + "adv_salt": "2B72A7EE969EC60FDAEC5744A282CA4C", + "aes_key": "47A4A0C53E8BF557955DE007FBC442DD", + "data_elements": [ + { + "contents": "C36CB8CC680B4B33EA02671DF361BEA7BF", + "de_type": 411 + }, + { + "contents": "6B97B27BDDDD6494FCAB9389B244", + "de_type": 429 + }, + { + "contents": "3024307E3A7DB9BFB1BAE994A324960889F4FBB9B147B6C0EA45ED9CB7A9", + "de_type": 370 + }, + { + "contents": "F9A393167AA68988D465C5D2CF1CAD56", + "de_type": 502 + } + ], + "encoded_section": "9090136B6CD3A51BF4E8F1B05CE8EEA8A990F3911000F16B5FD28A6DA1856DDB813CBAEC800C900441E630201EC8BDBE9513A703235C64F1DCF0C6D9834310A132BB3BAFA165197DF0F0F1006AA34CF11BFD0186C9C20474029FF28E3F80BD3D4E28435AC1730F4F012AE7E12E4B260C114A645E60DF99E0E29F4C6CF94FF1712176DE6C55A9CB340354954A855D178664", + "identity_type": "provisioned", + "iv": "46B8EBE1F9E5813B4C1B6E0C2582AB6C", + "key_seed": "99324A5E7EAC85B893713A8A71B791F414AECEDA4718E972BAAF5C09C94B4E04", + "metadata_key": "540C5DD8EEF491F8E2DDC5D4277D32C2", + "section_mic_hmac_key": "8D660846F1432E8E440689560D543DD3533238ED0D71B70F5E7E61A509FC7604", + "section_salt": "F16B5FD28A6DA1856DDB813CBAEC800C" + }, + { + "adv_header_byte": "30", + "adv_salt": "7D48E37E2858A787F24D7ADCDEC6B4F8", + "aes_key": "0A887E550738FEDE515876E254B32262", + "data_elements": [ + { + "contents": "2479050EEB", + "de_type": 377 + }, + { + "contents": "819CE61E221A075010D5306CC7F29BB848A7DBDE1CF044", + "de_type": 438 + }, + { + "contents": "73FA1B3A7FF53255786C2C206501040278A66515021557CD", + "de_type": 906 + } + ], + "encoded_section": "74901383D8F28210514557CD5238BD75B0004891100055505B97347C3937A4A25E8EF11E19C29001417D67B71ABDF30298BD1958110886A41360A6C45AA9D02B9F92DB44FA632CBF1437D182C83159AC936C13CC75403A5148A34CEC6AFDD77FDF6127A57C584C9715224B26F646038A21B02647AE", + "identity_type": "private", + "iv": "19F9D2CDE3659048AE4151D6175039BF", + "key_seed": "8DA828527A20965322074BA930562586E6463DEE6D45E788F18D66D42EB73AD2", + "metadata_key": "0011F0F2FC05ACA4E1251189DA36D627", + "section_mic_hmac_key": "B2F4D66EB2C40A21EED774F25B5E8B7C9B7A6BD4DFFDA446DBE766047D32AAFE", + "section_salt": "55505B97347C3937A4A25E8EF11E19C2" + }, + { + "adv_header_byte": "30", + "adv_salt": "31FB9D5AB71199BD3D5A5108CF837244", + "aes_key": "4A55292BFFA7C78A73FE80786C9ABEF0", + "data_elements": [ + { + "contents": "9A", + "de_type": 692 + }, + { + "contents": "ED6453FA7D5A41DFFA12CA200D301C75661C", + "de_type": 772 + } + ], + "encoded_section": "50901323EDF88A11D2105770DB1A1ABF5FEC3F9110009AF3A095E594F715D19B7D83511B49219004C7E360A866771654C1D7E3A58FF19045AF2BE397E964EBDD97C959F54316D0F91B61A2E508D5D4EEED", + "identity_type": "provisioned", + "iv": "1E787E4FAE77DE57752F91B18558A915", + "key_seed": "8C34BFAF25C9C03A5B69EFE1952B394E9ABE8326B25B51260094A712B34D004B", + "metadata_key": "FE52B2D64213A21002B8C7B956010B5A", + "section_mic_hmac_key": "D81C4340E189DD4964D0C19F4A57551233074991CD1AE1D48EFD8138B89C5BEF", + "section_salt": "9AF3A095E594F715D19B7D83511B4921" + }, + { + "adv_header_byte": "30", + "adv_salt": "CB2018262182E6D33BA5AEFB0CBBE143", + "aes_key": "10B52CC57509D02CE36E78220DD10359", + "data_elements": [ + { + "contents": "308DE91BDEC2875E", + "de_type": 808 + }, + { + "contents": "85C2A96A3D4831F7BD91A8CE97F32ECA38602F5B7AAFCA8E56932F", + "de_type": 143 + } + ], + "encoded_section": "60901348D690B04EFA3BDF4C3E8DD74A70B2C491100089BFA018D4593699A057C59303FDFE159001E8683BAAA53B40C1F61575F920F120AB62C9011FA9625A8AD44FF8014C65004A6AB6EED92C54C298AED9D6C5786557B2652923E4B162EDD974", + "identity_type": "private", + "iv": "15094DE55EF692E976BDB1EB2E745CB1", + "key_seed": "4D3212178C679CC76E36E4EFD849D100876E4C5C736EE0B01E151B5E35E587D0", + "metadata_key": "17DB670A98FF3B44602C3F65108464DD", + "section_mic_hmac_key": "447DA33BE77C14468DE40322000D3776B80F7C4C7B86FE52477BADD157B552EE", + "section_salt": "89BFA018D4593699A057C59303FDFE15" + }, + { + "adv_header_byte": "30", + "adv_salt": "47861A7A891274B6D1655A79F98921A7", + "aes_key": "9FEB0CE8CF647F32689CFE9E28ADBCF5", + "data_elements": [ + { + "contents": "9479B8564C4C861081E6D40EA07313E136A03B205A37292A9F", + "de_type": 767 + }, + { + "contents": "20FB6D81898875FB84B96904690ED4D15C3CD5C6F17B1B5BBB08", + "de_type": 958 + }, + { + "contents": "23880B754346286380FD62670369A54B", + "de_type": 970 + }, + { + "contents": "32891E939A61CA6F8CA86CFD4BC1B3F1629927", + "de_type": 871 + }, + { + "contents": "335F55B4E34382BF37EBC5A21CA9624E", + "de_type": 669 + } + ], + "encoded_section": "AC9013204837C358B2A875405D09FBD7B3992B9110007BECADE8EA1435CDBEDBB18E469114CD90045863BDF633745EA129538D9B3BF1263E6B09ED55748179F0FBECA95B8AA38C87CF1DC3EA24AC9955EC83759B362C2A1DF7FA8D251A5F294D9BDF349819D535EE4C752BC42C555C0DED91CA4AF570787FB68A0702BAA497BFB342030E81B8816B76B8D79F380A80EF0B4F96CBB9194D5961198F675C06279040BE4523B520B17A323E342059", + "identity_type": "provisioned", + "iv": "C55BA6CDFD4A092E9D94E5A89F1AE2C0", + "key_seed": "28D860FDABC254A35234D5E56C8F072CCE1A5D1CCF76524FD9E9805DB350C23F", + "metadata_key": "B9D69EB1576E56E08FCDABB5FB775F60", + "section_mic_hmac_key": "949A61FE8DB02C341BC58D96B84585433522ED90E57D604684380A8A2FB46F9B", + "section_salt": "7BECADE8EA1435CDBEDBB18E469114CD" + }, + { + "adv_header_byte": "30", + "adv_salt": "242B4AC6DBBC48533D80BF1FF9A4BF08", + "aes_key": "1964275B07A2CDE782A915674B2C3B30", + "data_elements": [ + { + "contents": "B0593CB5472B608EE74D7AAF4483E3BFBB6EC807D36B2D7C3FF2177F", + "de_type": 378 + } + ], + "encoded_section": "569013168E3FBABE4BD7F9026CB85EFA63BDE8911000CAABF68BB9EA843F3160944F444553419002B2A9BC48B3ED25A01FFA491A2AF4EF727511880B33161D0EA013F792EE3C0E468C3F265030A1B29240F37A7538D111", + "identity_type": "trusted", + "iv": "98B3F79C48E45D75E4FC709E41D150A7", + "key_seed": "AB5F98D672AFA5DBEDD0E7805FC1B4ABE971B54CF02DC2E543267FAD43B35882", + "metadata_key": "448C2CAFA3490A9746664729BB8931F2", + "section_mic_hmac_key": "63938C028CFC2E53E88F94C2646B8CA4785423173A512051B50D02D2704751FB", + "section_salt": "CAABF68BB9EA843F3160944F44455341" + }, + { + "adv_header_byte": "30", + "adv_salt": "FD0B85F4098C82550A9EC6DA9D240983", + "aes_key": "89CF85C86296167F6F1CEFD3C5A4E4F1", + "data_elements": [], + "encoded_section": "379013540CC96A83E31A5086D355E221B7B4DC911000092281802DC11AD81D24A85EB69CFB689002BA7E7247677B83453C745F87E64F4474", + "identity_type": "trusted", + "iv": "6302C0AB71F4F52B8D7D57088A495AFB", + "key_seed": "B5DFAA6C34894DD3C1371C2D525CD1040228261883DF3C71C446EDA72203921D", + "metadata_key": "1B17E9776E56ECA0EF359DF062118638", + "section_mic_hmac_key": "5C681440F84C62B8A7342600E73987E8E883A629B0B9791B26F53673D830E072", + "section_salt": "092281802DC11AD81D24A85EB69CFB68" + }, + { + "adv_header_byte": "30", + "adv_salt": "4C2EBCD9668E6E1D431E059EDD16D0B7", + "aes_key": "EC3A1D6A13083AAFD8DEDAE93F24FE23", + "data_elements": [ + { + "contents": "BD9F8933F20E3D83BAA4537CE0B99A8E21", + "de_type": 898 + }, + { + "contents": "A7F0B8AB76E1F886AF2F54B4C8EA991B", + "de_type": 433 + }, + { + "contents": "2C8F580D0FE48B", + "de_type": 265 + }, + { + "contents": "7FA7C5C31A427B669C3B923BF5E06A74586691", + "de_type": 780 + } + ], + "encoded_section": "7E90137F75593A7313AEA3845F542E199694AF911000C229127841779C7A5C4295D5969988F0900400A4D8B0D35EDE45A79C0578B7F93A687E7BD4E8B16F53545FBE12C6A99CD768961DF08D544D978C5E2CF6352BD2E2332181D46C4196BC0CC9AAAAA01DC2E32DE9D7F41480769306C071113EDDED0EC4C1E56353E2DBE0", + "identity_type": "provisioned", + "iv": "DA2728120E5CD3EB3AB342BB30E97EB6", + "key_seed": "C644228C08EB7994A9A2F594C73B5A6C60D7D35D6DCB5CC02BD356CEAF43B0F3", + "metadata_key": "5DFE12C82CE8EC51C896FF3A05C99A8C", + "section_mic_hmac_key": "92C128F03A968B4E386393F1A92FD7D5330A1354BFCEAB5CC3546913D799B338", + "section_salt": "C229127841779C7A5C4295D5969988F0" + }, + { + "adv_header_byte": "30", + "adv_salt": "1CAF5E2F6922816F4DFEEDD6EF50E3B0", + "aes_key": "05BCDFA12204C89B560461D8D0FE199F", + "data_elements": [], + "encoded_section": "3790135F8E313E539461B0909160F59361A52B9110001DFB04A1D36A2D1246395348A3DC32B690012EBBABD8762AF1563969C0A4C0944756", + "identity_type": "private", + "iv": "33953147560A0CE8D874DBE2E43ACE03", + "key_seed": "826FC403B24CD2C2C09615C7615519DF4F307F825FBFB6F9FED666C30009E00F", + "metadata_key": "27045092CED412FED90E2830E2885062", + "section_mic_hmac_key": "CCABF9B74F78DB6DD3D0D52AFA0A682CE02CD0A922BF6DB9C30FCF6AE0C32AA2", + "section_salt": "1DFB04A1D36A2D1246395348A3DC32B6" + }, + { + "adv_header_byte": "30", + "adv_salt": "1EF0DF08D58298A0E357D58C46A37EB7", + "aes_key": "048A4B2AA3DDE111E4BA17205E03C662", + "data_elements": [ + { + "contents": "010756998EB5D06CD09797872B98F792BED2FF8DFDC5", + "de_type": 314 + }, + { + "contents": "2D49F47794A626D6136EC1B131DFBEE037DA81FF", + "de_type": 805 + }, + { + "contents": "3233E2AD33C84C20EE5C873647FF2C973F33C2EE2F", + "de_type": 198 + }, + { + "contents": "F801D66076A8D735EC95383F07DE6E61", + "de_type": 151 + }, + { + "contents": "61FE63986EC6C8AE1DEC1D60", + "de_type": 74 + } + ], + "encoded_section": "A090135F57C94D2A4431B25F9E82466B7F7F75911000135861848398D4D2D008FB8F23BA28609001597090AD434166B89B3C1D0E8C9D519026C80588D401F0FE4C1024A011246A8C34EFCB98FE65AF5E9143ED806F38AEC55CBEC4E5331527A788F61DBFDE946500BA9CAA2363F2652B11421D386DC1CDC7491DCD16544DE410447903729849F858AB6AC3A538E2C7A08A26DD39D4FEDEB03A89000214260E53DF", + "identity_type": "private", + "iv": "E824A7EB69FFBDDC98410CA5AB2B2ADC", + "key_seed": "7E5E71048A74C3408127CE6A9F9AE1E2C6BB9328824165310E7AB1F2C46268CF", + "metadata_key": "7F11E9659E1ABCE558A04E7072106314", + "section_mic_hmac_key": "9BD45B87E27D82FBF6C663E8D208F1C033A9751F7C6A1FA7AA9BD3DBAE9C920E", + "section_salt": "135861848398D4D2D008FB8F23BA2860" + }, + { + "adv_header_byte": "30", + "adv_salt": "56745800DD04412A18EF2923C2C1E5C5", + "aes_key": "B9CCB0BD14721C95C4B8A82343B0DC69", + "data_elements": [ + { + "contents": "3210F9990AE69BCE70A95FD0", + "de_type": 546 + }, + { + "contents": "4311BACC1959CB4110506351FC8282D2340D", + "de_type": 710 + }, + { + "contents": "ECB77BF5070098A9CA3B5476FA51289575431A", + "de_type": 699 + }, + { + "contents": "456E941BF4E877C7C0D3AE3194184576B38648", + "de_type": 943 + } + ], + "encoded_section": "8790132B1F4D078DABBB8B2F7F1AA4B2CE000C91100043713488CD976125D5C9021673B54BD49002DFCA02F508566D9987015A4B9EA57B18348BB3BD0673AF96D26EC99CBD8F3710AD07925C202D19CEA07E2A3E174737A01A87BD7BB64E07668D0F73704A3B07D3AE1658C07351FD670EA94CF4F2255C2245B6776B348613C593373C419E33BF97", + "identity_type": "trusted", + "iv": "E9F160D212F5F23E6E0C7395A49A8E17", + "key_seed": "3FA2A3D35B24B6E8BD5CD626AA7B3BFA7C3B4BF09CDDE290728DCEC2F3C4D0FA", + "metadata_key": "5926F8FA508EBAF60496AFD11B60B167", + "section_mic_hmac_key": "936442541778732A30D1A91F94FC0F18AF5DFF9E328C37594578316656B47723", + "section_salt": "43713488CD976125D5C9021673B54BD4" + }, + { + "adv_header_byte": "30", + "adv_salt": "A987A4F50BFD7B25C8A49901CF43A052", + "aes_key": "A5595C267A34F4870597DBBD4827DA38", + "data_elements": [ + { + "contents": "33118B478C00918923C55B1DC54A31C5BF790066C778B7", + "de_type": 933 + }, + { + "contents": "3882AA0EBE9E8D", + "de_type": 402 + }, + { + "contents": "578FCB48E206B3D6C98EAC841DE9D1AC69D43023E62AD6", + "de_type": 610 + }, + { + "contents": "728D9B96470AE5B5ADF38A1A9A4215C031970DB045DCE4E2BF", + "de_type": 779 + } + ], + "encoded_section": "9190131C0606B17B45C8BE9367B22C9B395B76911000EF7232F8A53316C10FB9B12BDBF874C290019BDC987EE78BE56EFB2B4DA056A45DE88D0B51BB0BCEA3D5D16437415CBB54912083E236626B501B8892CDD61FC154F5FDD5B6603E0AC315345B0B66C9ECF7A1C73735771D014ABB59AC6F08E89E47D78248067B5D01EB5D86227C029BCC2BB0E6BB44FF9BE8B4C9F6D3", + "identity_type": "private", + "iv": "CBCBD0C1CFF1E1A93AA4A851A0A412CE", + "key_seed": "26FEC8FD9564D289B5D8F52A5D92F3374D16F03EA56BE5F4D7598CE444605B3D", + "metadata_key": "7A37107DFD235BC0A8A94FD05AA69EF8", + "section_mic_hmac_key": "4AF863F5A51CA185E843E04C8ECBA614DE86D229BDE71D113E280FF688AD0A6A", + "section_salt": "EF7232F8A53316C10FB9B12BDBF874C2" + }, + { + "adv_header_byte": "30", + "adv_salt": "B177C937AD0440B365E3C3CED0B4ECF5", + "aes_key": "7D40AF7575970745C5A0F7D70E3385A4", + "data_elements": [], + "encoded_section": "37901300CA2C36D77EEB66F56395B5F88615F1911000190E5E624C8AF7EE88442E6F45D52FDE9002379C9C52C7E36620BA82C76E9F9C833E", + "identity_type": "trusted", + "iv": "FA5F5B43D79163347C5CEBE72EB7D1A7", + "key_seed": "C26723C79C5316A9AD2DA3F33FEAE4A2E88A2A1135E1DE408ACC7EBBC97DA81D", + "metadata_key": "4917FB622BBA8489B507FEC52AB3E689", + "section_mic_hmac_key": "E0624BAD763E837D01A7DC8475A6D4BD032BF029DA06117674E1E46B41FD59E6", + "section_salt": "190E5E624C8AF7EE88442E6F45D52FDE" + }, + { + "adv_header_byte": "30", + "adv_salt": "FA2D6DC34EE5F2448477514FA147A69D", + "aes_key": "0E1EE274831F71B301A6E8DD14D07B5D", + "data_elements": [], + "encoded_section": "379013409E9C337F0F080FA88218EDB7D662DA911000F54BBAAC999D3077F2358E0F5D6F6E189002CAF808A29DABEE53046F9E213AF03D3A", + "identity_type": "trusted", + "iv": "AFAA0446DB0D21D787121C963804CECB", + "key_seed": "26F4220C4937B3B3E8A07F53D536205F49A00890B97A10065CAFC190FC2D94B5", + "metadata_key": "E6D25ACEFE69AE468697686404908507", + "section_mic_hmac_key": "3772B9EE7DBFD9EAF93856E0ADAF7893EAE501B0AA4319634CC71396051E3D0B", + "section_salt": "F54BBAAC999D3077F2358E0F5D6F6E18" + }, + { + "adv_header_byte": "30", + "adv_salt": "A6280B06DBAACBF7D349965D5BC89A29", + "aes_key": "87E8362317FD13D66B3CBD2BA7945474", + "data_elements": [ + { + "contents": "6F38BC6C3C51A12F811B2995", + "de_type": 995 + } + ], + "encoded_section": "469013DF0934F5F3F9B6112BAFE9E4247E6E469110001714054198B85EB13501CCFB5238EDE09001516776B88AA711D867D8E555AB751386189FD0EA6AB0B46AE6FBE32F00BC32", + "identity_type": "private", + "iv": "14CAD16E8873456B63116AD8D44A1DDD", + "key_seed": "795C911C94D65CF52423B7FC80A1238AD2B368E9B63B84EE68B96C254BA9EBA1", + "metadata_key": "387D38DB6B421C87D9730E68378C6A66", + "section_mic_hmac_key": "527195983F0A34F82CC68E7CD179E0E76A715C42221BB028807E09633EBFA556", + "section_salt": "1714054198B85EB13501CCFB5238EDE0" + }, + { + "adv_header_byte": "30", + "adv_salt": "B93D5B221DA6B6630432D05971BD097D", + "aes_key": "D145D00B76039023095EFCA293AE5C31", + "data_elements": [ + { + "contents": "B85F85569E8BA916DBD401A29DA12D246B9CC1B8A5E1443FAB343099", + "de_type": 276 + }, + { + "contents": "2B31FE53220530EE7237618120", + "de_type": 912 + }, + { + "contents": "016008F70522603B5E4F6B76344F3D52C5A57B39E4038AF8A8F42A", + "de_type": 602 + }, + { + "contents": "B14882D90E5C4690F09CF3E945", + "de_type": 318 + }, + { + "contents": "FA4E574D4E2E615A3FFD2D185AEAF145B2D71925C152A6", + "de_type": 822 + } + ], + "encoded_section": "AE901319824BDD1F5E974F6DCFDB43A2CF01E9911000B7B0B621D9724F0DF78391C91EA696C390013DF4B00F304BB7398762286C53648CFFC8255329F55930F1897E2C263298D50D3742A38F2FACCA2AD4DEC504F26B0807F402526FB44C656303A5B2C2FDDC0F66E986C1A4622D795D2F69FA1D7897BFD3C51B0C73B41A0FADD795C81A929126AF23142944F6B7D4E8555A23013398C47010884C0F528304A648B5CFCF48DF789BCBB9EF14D2A894", + "identity_type": "private", + "iv": "EDCD3E09ECC33CC0428B84B84A306290", + "key_seed": "F4DFBB6FEAF8AC93BAD4732CDB320B6E862122646F848E275919104C2D42A873", + "metadata_key": "BFE267A05480880B72716BE7339D871C", + "section_mic_hmac_key": "B8B176BDAFBE2009FAA4061560DECA5E315497E163390EF339DB071B15FB4B95", + "section_salt": "B7B0B621D9724F0DF78391C91EA696C3" + }, + { + "adv_header_byte": "30", + "adv_salt": "E12D7AB4AD24788123EBE401FCFE0361", + "aes_key": "B9B30EA4622A6F9D8AD6F0E55BA4B942", + "data_elements": [ + { + "contents": "3051CF22ED9D25", + "de_type": 618 + } + ], + "encoded_section": "4190132465A472C19E1132D6920D85859C462D9110002A68F093B202AEE3BA5C5920E1CFD169900148079856121A9BD3EE0EE241012343707145363A5036B2FD221B", + "identity_type": "private", + "iv": "A8B13B39231EA9901D765FAA4D903CA9", + "key_seed": "F401092F0C5FE27E56C9A156F3758F00785479106A65D15BAE8A71EE0D74882A", + "metadata_key": "A13B7F9FC15F2BC3CE3DA2FE7A12B8F1", + "section_mic_hmac_key": "109B276D0832C380BEB445EE69833504C4C1C36336ED29FD5A968275539D06C4", + "section_salt": "2A68F093B202AEE3BA5C5920E1CFD169" + }, + { + "adv_header_byte": "30", + "adv_salt": "4A44E437E8CB79A4D9CD8B36C741598F", + "aes_key": "9DF76674041561AECBE242B96765159F", + "data_elements": [ + { + "contents": "6DA30D675509E1A51259DEDA2F11E5B3BF23A8FD", + "de_type": 639 + }, + { + "contents": "87DCB0D2DC1A", + "de_type": 247 + }, + { + "contents": "7B59DEB0A3127B05BB534C71E77E35918E83DF59", + "de_type": 589 + }, + { + "contents": "", + "de_type": 101 + } + ], + "encoded_section": "70901391E265F35A1E0577B27E896855A176F4911000BD2435F6F73228A37BC92F68AA6A147B90019E7DD0615640A2FE79D4239B6A943831D7C153CE9563FB645E396005A037F61F5F3F9D85A9F028D370A22BE88A7DEF734208CE97931054D7D6002432993830428EABA280091229CA39", + "identity_type": "private", + "iv": "4C0F11065C0D0A50281895D599B113E7", + "key_seed": "F3D388C12E7FACB9A9A10D71841128E5AA5B62203C4D9288CEF583FD0C973281", + "metadata_key": "36BE0AAEB9570FC44C86D948C112D2C9", + "section_mic_hmac_key": "6C082598D6635262737FDCD8CF2C84F0564A88B0619C46B1087BF10C19D3DF60", + "section_salt": "BD2435F6F73228A37BC92F68AA6A147B" + }, + { + "adv_header_byte": "30", + "adv_salt": "AEA8992BCF56D8C977B4F23CD035215E", + "aes_key": "FDBDC8FC03D9D4BD00E02D7E95BC806F", + "data_elements": [ + { + "contents": "29FD64AA2AF020C8C1DA859D8F", + "de_type": 274 + } + ], + "encoded_section": "479013F445F2D544BA05B19A3476E945DFE97D91100072C4FF46E7236884EA75F40693BFF42E90048B3C5601202F9764171E03FC75A45120BFE756EAFF35D3CE64EA5C749E93FA52", + "identity_type": "provisioned", + "iv": "48F82C64D3B561EC02F68C129E705F7C", + "key_seed": "3B1B53F1A643F064C11C5FC0289D3AC60314493366D5286899B4398A579F5D64", + "metadata_key": "B1CEED2817D2815495A72C8BBB856EA0", + "section_mic_hmac_key": "B4155D5CEBB91D838092A22CE031FC3A18C751BD1C93277781EBD05EFBEA5449", + "section_salt": "72C4FF46E7236884EA75F40693BFF42E" + }, + { + "adv_header_byte": "30", + "adv_salt": "7844FD878C399C26ABC3F5898F1EEE7B", + "aes_key": "26EFB718B9B26B32C37DDBCEF467D023", + "data_elements": [ + { + "contents": "F17E9BF1E3F0713D0F30F2D160", + "de_type": 538 + }, + { + "contents": "D18840BFB3F67A8CA354755541827C27BA67804B9379D966", + "de_type": 121 + } + ], + "encoded_section": "619013AEF9942B3FCE71119B0158F3B5CEFFC19110002D3887C9CC4BF9B5678676E908D6B65390010ECA727C2BEB2D8BE03CF1AF18057D68A28F3C87E05EFB8C46FD8F70E81C44BEA67C5B744AC821302A345A2A078260A815FE69088127C8B377B8", + "identity_type": "private", + "iv": "849FBD20C4DEE438141A13D97554D787", + "key_seed": "5162B090AA207D037425C2D3A1627A01009FCBE33076984181B26E948630B08F", + "metadata_key": "792BAA366C23A2878F7D5376867E03A6", + "section_mic_hmac_key": "1235C37B0CA4D707242A8DC6CCD79F80AA9DA1462E6AE7729F3C2680F38C3D5C", + "section_salt": "2D3887C9CC4BF9B5678676E908D6B653" + }, + { + "adv_header_byte": "30", + "adv_salt": "F42DCC02D50640A2F658B83FB4E7CCC7", + "aes_key": "616EF3104C743DEF83DDB73A4054469A", + "data_elements": [ + { + "contents": "03383E9297", + "de_type": 260 + }, + { + "contents": "9462914DA98DB75E09", + "de_type": 412 + }, + { + "contents": "1DE476", + "de_type": 421 + } + ], + "encoded_section": "519013D4E125FE1E65626076AFFDAD82D5BF889110007F4552E79D984C742B9DADB5F74E95189004D3AC96826BB9BEFC0F1E79081B62A2FE3B1E9ADB08AB470AE6F93E8B7A809190D6312B28EC8D81AA0801", + "identity_type": "provisioned", + "iv": "D7A0BC0D7FE96922460BA73213646E9D", + "key_seed": "3ED27ED5664D454F921BCCD0869CE1CC7B3BB85E7585375DCB33FB0650EF779D", + "metadata_key": "EB3C8E526E6D9235391E827F2C6E231B", + "section_mic_hmac_key": "BC311E65AD6DD040501783F1664655BABE513E3B907292CAFF9BE29FFFF4A448", + "section_salt": "7F4552E79D984C742B9DADB5F74E9518" + }, + { + "adv_header_byte": "30", + "adv_salt": "362715986AEF2115C1E99FB44EFA1C75", + "aes_key": "C59A28A212B4FCDAC1E16462C5B1D165", + "data_elements": [], + "encoded_section": "379013A2A1BA7A82B6F9CDA55E5FCCAD4257AE911000B55714FC13B8BD3C6B8C0A7C668F1BBB900270E9E6041661BF6F78C6AB5322EBEB23", + "identity_type": "trusted", + "iv": "0D644B9401404857EE408775BC5A52A4", + "key_seed": "1568B68A9D59E4C9482EB671122CACB6663B00DE1215CB0FDF68A5B32E186478", + "metadata_key": "54A22FF50922686A95E211D724463375", + "section_mic_hmac_key": "46281BECBD442DFB726A2AAF39230B5EFE5018E343BC551B2E48A5750E83D8F2", + "section_salt": "B55714FC13B8BD3C6B8C0A7C668F1BBB" + }, + { + "adv_header_byte": "30", + "adv_salt": "505CECCB0BBF804F3680A901A0A84A21", + "aes_key": "4CC11507027A2925184A972BDDED37ED", + "data_elements": [ + { + "contents": "0F4726CABAA7A44D817F00", + "de_type": 319 + } + ], + "encoded_section": "4590133CEA393A75D831272811392FAF4A3545911000D776BD1C0C14FEFD55DC62B967C2318190041F745F67713849A775058D883A469627A056A7C207EED34AB4CE3B710878", + "identity_type": "provisioned", + "iv": "BED30BD783D7571B1564D14C3759997E", + "key_seed": "BD9A88F8FA79FEA622C56138525FEA07EFBF53800B3AE4CDE7C6CA69B2A0D9A0", + "metadata_key": "2BE32D599D847EEF1023E437601655D7", + "section_mic_hmac_key": "01D5077099F1BB11915BF29E3CFA7DEB563386EC878CA136DD6F0D1813ECFC2A", + "section_salt": "D776BD1C0C14FEFD55DC62B967C23181" + }, + { + "adv_header_byte": "30", + "adv_salt": "6C295D404B8FC5E3737BDF1FD586EB54", + "aes_key": "333AC5989888D159B59BEE541183F1B4", + "data_elements": [ + { + "contents": "", + "de_type": 376 + }, + { + "contents": "0EC58152447FB55294C763C5310B90C4B1BDBDBA", + "de_type": 897 + } + ], + "encoded_section": "5190131DC5A94934AB3C124656E7E19C9D6D74911000D77197B01CECE72E38B7055E1B2A4E9190028EA817F765B15EFE6F9B1273E5164FAF6082E6F6CD317DC41D9C1DF860C7F17D7E205EE1D4ABBEA59EAD", + "identity_type": "trusted", + "iv": "380397FC7FC735D90D60C40DE97D64BE", + "key_seed": "58FE4D29790740442D5A1BD2ABB189DFC42B41E4507A0517E061063AA1BFF5E1", + "metadata_key": "E4FDCED3B8BA98A09E195E2521274AF2", + "section_mic_hmac_key": "22E7FBE87FE2B9FD4D24A0F8A6EF7603DA4AAFE314655DC486D46A197F95DABD", + "section_salt": "D77197B01CECE72E38B7055E1B2A4E91" + }, + { + "adv_header_byte": "30", + "adv_salt": "9B60494234512A3C9B6A5D72533BB7A2", + "aes_key": "8924A8A345E22836490AD4494DB516BF", + "data_elements": [ + { + "contents": "FAB3FD79DE4BC47D2C14B8B99E", + "de_type": 615 + }, + { + "contents": "3479BDDCE860", + "de_type": 667 + }, + { + "contents": "18D959580DA781", + "de_type": 786 + }, + { + "contents": "615DB667E6E281BB9A3641", + "de_type": 610 + } + ], + "encoded_section": "689013C05D97E98B3B8BB1E3DC27D55ED975259110008EE527EE8F974D8E0D0B5B3A665965A090027C5BF2D01D8AED7FA473E8B2DAFED89D2EED05E3D6065A114F2530D30AC5FEB37A439A32AF1D037C6C8EDD5B12505354D0FED97E72C125E079EAAEDCB44CC22355", + "identity_type": "trusted", + "iv": "8602AFBB2A34225261DC074174B8E670", + "key_seed": "CBAFC7E710BE96D3F94FF216AA7F2933E66B1F7C5A57DBAD6E79564DB908CF06", + "metadata_key": "0A8E7FD1F928402D5ECD50BD80D10A66", + "section_mic_hmac_key": "3099BF02D5FD168EC01E036738BFB8E30BC0FB4AD407AE3A08F8D8239F64F54A", + "section_salt": "8EE527EE8F974D8E0D0B5B3A665965A0" + }, + { + "adv_header_byte": "30", + "adv_salt": "3FCD698F9489E37EBD7F6A4D3224C33A", + "aes_key": "F99653068BD2A63FB36578720F9F63C4", + "data_elements": [ + { + "contents": "ADBD7E7559", + "de_type": 555 + }, + { + "contents": "48125DBEEC95494C0577757CBADE", + "de_type": 909 + }, + { + "contents": "E7AFB7E6690AA0FE3747EBE2F251B606A034A4D817B5", + "de_type": 14 + } + ], + "encoded_section": "689013BB941D4C7CE5BC91FB3D4E6041E4AC9F911000ECBAF5C243C3B5BB209210D84B821A2A9002926509475302C3EC09089E68268572F1525C6382809682E9FF8EB06701D647A5AD7B8038E06C851B7A76FFE98403A5C7DB36893D5CF95FC349E98A177FE6C90CDD", + "identity_type": "trusted", + "iv": "D237427573873BBD2A6B372FB9284963", + "key_seed": "90D41DF3F409B5A2C6895CC449ED835C3C70E509551F8524DAE13F3F4E42A429", + "metadata_key": "86FCB812E49A140B17C7803C51121583", + "section_mic_hmac_key": "853B7A9AF337E2EBF2805550EE36447233D006CECB4E4BF7D4085C875F1497CD", + "section_salt": "ECBAF5C243C3B5BB209210D84B821A2A" + }, + { + "adv_header_byte": "30", + "adv_salt": "0AD3C84FC7C58D3037142AF41852CD42", + "aes_key": "85571EBC9483AF47E86FBAEC31C8F2C5", + "data_elements": [ + { + "contents": "D133239451", + "de_type": 901 + }, + { + "contents": "6C2762576EFDFB6F86A41D4FBFED", + "de_type": 422 + }, + { + "contents": "4510C7CEA7E09A03E0B7AE2EBACE9177BA7B1D46AD94256574", + "de_type": 922 + }, + { + "contents": "DFDAF2", + "de_type": 207 + }, + { + "contents": "C5335141F74C8E52E4F2230872366E83D2678B8C373D03987665C5528EAA", + "de_type": 844 + } + ], + "encoded_section": "939013013988FEF35F4BCD059C3077FEB6E19791100091327AAC510808996400403A8CF444DC9002A0A7721297142DF288D8AF4E70874CBCFF74B11FA183925FE595C24F1E676AA8D158EA2605B283FC22951A389C097CF4DFEE6CAEB829CE8C387E3826C59499AA6FE04BAB5726249A4DB982986B1FDB3BAA5772D7EBDC16ACCBE061AB6914C61DA1F98B8ABFEE3360633E106A", + "identity_type": "trusted", + "iv": "82B513DD8F4CA0CE7C5E0E4889E860FA", + "key_seed": "5A29295C59212A429AB6EA78F278EAF3ED825F57AB0D2A129F52CC277B1B1CC8", + "metadata_key": "EC7EDC4ACB3143F6427A9519FDBA9416", + "section_mic_hmac_key": "80D950334DC3B27A0260AFE2ABAAB53C5E3C1EE022289A4A81D8933620814D90", + "section_salt": "91327AAC510808996400403A8CF444DC" + }, + { + "adv_header_byte": "30", + "adv_salt": "C6C90D3B1F749744590F016A23507912", + "aes_key": "5921AACC16814BC770EACE04A011DEDF", + "data_elements": [], + "encoded_section": "379013C51A5B8064CCC91CBF70A7BDDE6A35B1911000CB58CD4EF7644C8AAE7BCF0E9123BD119002B868633C18CF476A943747630391F0B4", + "identity_type": "trusted", + "iv": "7D48634F169987CC2E53CE148B93BFF1", + "key_seed": "77691B80B2C0CA3BAD73653F05B84C0C31704FE6BCDA1551B055B1286F805F86", + "metadata_key": "0820719A54E2A8D41FCCBE04F6A19116", + "section_mic_hmac_key": "A9AB5A8E48AFA1C80E86E9764088305C75F440B1CCFABFA9BBAB981966EDC225", + "section_salt": "CB58CD4EF7644C8AAE7BCF0E9123BD11" + }, + { + "adv_header_byte": "30", + "adv_salt": "AA5AEF76D88EB7A98704D6F786978A79", + "aes_key": "D0B5E2F53665D4A49213F8E3CBD17238", + "data_elements": [ + { + "contents": "", + "de_type": 130 + }, + { + "contents": "008A8A351B53EB339B92051ED484AF78D7", + "de_type": 212 + }, + { + "contents": "EA", + "de_type": 970 + }, + { + "contents": "61305021F575FEC5427EE4E5F007CC548C7D3DF098", + "de_type": 496 + }, + { + "contents": "819984253481F9F903BF58DA2CD7E426E11C681DB803", + "de_type": 526 + } + ], + "encoded_section": "839013C5B60ED430A58C53A974CBA2B932B7DF9110002ADC62BC5A15E27A5D040BD13364457A90029A1C3316152852BF28F18AD8EA58D79CD5CD5460B1F6FDBF6A6DE7982068DBEF5A3F0DDCA5DC1AE558681667C1E896DED773B85E637CFD76AB97C02B7476D058AE259383001072DA55A825E8D9AD8B52640C2C17938D087A7C2C5376", + "identity_type": "trusted", + "iv": "F11001063B0781ACC0C9A56FD606E2DA", + "key_seed": "321B859773DD3BD05F2CA1B0EB5A8B2D50A2CF4800DABB6137B80E0B9E77C53B", + "metadata_key": "9F67F3ED285AA4A2065101F5170DC3F6", + "section_mic_hmac_key": "38CB19DA21A127986862AD06AE17603FAD6FFF450BEC8915C71765995E3C9E1A", + "section_salt": "2ADC62BC5A15E27A5D040BD13364457A" + }, + { + "adv_header_byte": "30", + "adv_salt": "85033540DAB893A56198E6C61D126215", + "aes_key": "FA3F91590A9FAE50C85DC060118F34BF", + "data_elements": [ + { + "contents": "C1BD30E9571DFD4A46CE538674AEC77965", + "de_type": 302 + }, + { + "contents": "E0F4F75A38F47A611824C3C7C36D66EF4F66F7B386ED5055586875", + "de_type": 357 + }, + { + "contents": "45531A11802F333B", + "de_type": 496 + }, + { + "contents": "4884A8F995F73A415EA5AE2554B5", + "de_type": 935 + } + ], + "encoded_section": "8590139CA7E3ED77C285D887178284CD648077911000D916BE31B39EB0B2C3C8627643F4064C9002352CC9CF57BCF7235F98A537B7DB5615B5DAB258536C24D51FFF0170A18125ECFA058FB63858701B8E98F1B8757F7A95194C86776C49C517F8D30868299BA3221D66BF197D6416A1CCE5044CBBA2EF9D42EA5DABCD618FB117B75E948A18", + "identity_type": "trusted", + "iv": "8B5180935197933E61C2A44911D15A10", + "key_seed": "8E6C7E27B061CB997479DE0B6369D0D06A74EA34B3CCE46E4C8E184D2F5670A9", + "metadata_key": "42018C7AC5101C0258523EF8C7F0A568", + "section_mic_hmac_key": "5583258D33DBCEBDD9E51458998869791B41A2F08F182F70B1E3291D42F82E25", + "section_salt": "D916BE31B39EB0B2C3C8627643F4064C" + }, + { + "adv_header_byte": "30", + "adv_salt": "D3AA4C688EA0AD1918F1C9D71C75562A", + "aes_key": "580E68ACEADCF22076DFF033AE22E2C6", + "data_elements": [ + { + "contents": "EBE2B615", + "de_type": 8 + }, + { + "contents": "CD5A0B2223F0E8D0F2C927261AA127", + "de_type": 597 + }, + { + "contents": "254D8F45F8E5265C7CA01CB5EBE36D2F5E", + "de_type": 980 + }, + { + "contents": "CB749F9F2474F2E1431C822E853FAD78854FF8D2D869E13E", + "de_type": 82 + } + ], + "encoded_section": "7C9013EAD8F6468C5270D4F1F91C2FF6E4D795911000DB917CEFE3F87ABD3C6FE091FE7080169002CD415457D2264207614B3AD25C4684BD245F66E24FF1D32DAB7A5CF5E08EB4E4BFCD04485F639B90758CA40BFC86FB226273E95315E6640032AD8F42F5D6EAAB52D22E3067FF073AA6721FF5075A35E9892785157D", + "identity_type": "trusted", + "iv": "7CB9B3466AC81FA752E73027C9E7DC1E", + "key_seed": "F8649F5B5D4C6482A42BCA722751F19356663FCA5C79D85D635893696BF2ACA1", + "metadata_key": "DBF7DBD16D60B0AE863E8EAFEE60A8C9", + "section_mic_hmac_key": "A5D6A3FD29C470C7C27916035F632C5DCAD89CD7312132C6FF3941E8CDEAF515", + "section_salt": "DB917CEFE3F87ABD3C6FE091FE708016" + }, + { + "adv_header_byte": "30", + "adv_salt": "EB6BF655A2E80D1AF8D36AED56B6A486", + "aes_key": "17F445E7EA205A56027250C0346A2E71", + "data_elements": [ + { + "contents": "014E6E7BB0D40BC7FCBF9BD3", + "de_type": 977 + }, + { + "contents": "A66F701F2B9A8451EB925DD5DFFB18273FD156", + "de_type": 400 + }, + { + "contents": "0B730FD3630237F45E3C6EA47F8EE72A69108C94BE72", + "de_type": 922 + }, + { + "contents": "AF35622DF4032B16BC69AA13859D54A3CE8A8EA0A637FD7B", + "de_type": 873 + } + ], + "encoded_section": "90901303C3DADA1F1918061D9922E9F5508C449110006F4653653712F88848A16560CB9D4B289004814FF4D9FFA580804263DA2EADEAA12FEC181D131B19E561E2D3811571C796B15B584E6DF5C7B5809A3C61DAAEFBA0496D897583A8A8CF84CF5727911411A9B075C3F4F2ABF2565F7991C893638FD68729C425610B61FAAB5CFF4CDF3E4E7971C8C6DAF7BB92D08D30", + "identity_type": "provisioned", + "iv": "189A717116D2613604B3E642AE28A02C", + "key_seed": "706710F7D3107D9B7DE125A04EB20972E73151AB942360289B3BA4F23F7BB3A2", + "metadata_key": "9D3E61673F1406C976DB176EBE07B535", + "section_mic_hmac_key": "5907214C4AB21EEC7F1ADFF46C72E2F7D4141F5D7FA3D4A31B4E698530499066", + "section_salt": "6F4653653712F88848A16560CB9D4B28" + }, + { + "adv_header_byte": "30", + "adv_salt": "D78B7D217B2BAD5FABACC1946ABEBB4C", + "aes_key": "DDE0A6C66AC49FEA60647AAA0F51B3AD", + "data_elements": [ + { + "contents": "7DE71497790F3C87A6B1", + "de_type": 591 + }, + { + "contents": "73168472EB83D78006B65795611C22B92E8C99", + "de_type": 797 + }, + { + "contents": "6FA0E9114BBD4F65224DE85910F489C4AE20BD64AB2184C32ACCAB", + "de_type": 266 + }, + { + "contents": "DC41AE5DE9B12057ADFCDA797B077BEFE31DD0352B", + "de_type": 666 + }, + { + "contents": "45E2BF06FD93AD81D32E391A18F6ED10939FB5D598925F060413E0C9", + "de_type": 864 + } + ], + "encoded_section": "AF901361D877AB393135E03356064C028A5FE0911000573A6F5FB7DE8D281C473C3ADACA77FB9001EC4FEE7B442EBE106D892C85074695F12CFC7F7D03C692EB54BD467D8473F76D6C3F62AD849A82E3D4F0E2FC9B15AF8604C435C11880EC4690DED0BA67FD4D7ABD258E281C094F695843C59174BC5C59EC82C93D72BD9E9DACD4A8DCBF4B36DCE9F849A729A832325F85C097122E08CFA360CC073F8022F10C7B76E1FA8D67E0732A33DFE0259EA4", + "identity_type": "private", + "iv": "0BFF6C36B9AD3D46241C48C045404441", + "key_seed": "B595F2E119E405069858063A2D71A34C08CAEF8842CACFF2841103C33476B8BF", + "metadata_key": "81EFCD94E99E534D60F2189BAC02854B", + "section_mic_hmac_key": "F03A05B7EE67BF56BC9539D8102D174B556D970122EC292EA0AB6BFDB8E36A1B", + "section_salt": "573A6F5FB7DE8D281C473C3ADACA77FB" + }, + { + "adv_header_byte": "30", + "adv_salt": "CBD7C88BB7E820DEA7629856F507C7AB", + "aes_key": "F7D24E7DF3FB39E4C01D50213CA4427E", + "data_elements": [ + { + "contents": "B5427785105E6E551E41111DB9A5", + "de_type": 941 + }, + { + "contents": "27B605AB2C3FA4B3F91BCE5D3968A289", + "de_type": 241 + } + ], + "encoded_section": "5B9013FF3841C3001F80A54E975483DB6C5D74911000F896663B53DF517B14CBF9A3A99BEB60900264CF1670CD3161CC7A9E07274C49BC76F0F30169FDE2C493E0E572AB011E1DFC60F52CA98E495C0F21BC81A5634B35D55B3A89E2", + "identity_type": "trusted", + "iv": "3F18203F323E679A3F665D4D7AB780CB", + "key_seed": "7C4425B244F0C63E398983EBACE4C33BE1DF8904348ADD1731379EDC614820F5", + "metadata_key": "CA10051ACA62C5408E9AD33AC0B6D62E", + "section_mic_hmac_key": "B923EC80759AA88B679B309AE389AD81B113BD3AD7ADFB1582575683E717CC35", + "section_salt": "F896663B53DF517B14CBF9A3A99BEB60" + }, + { + "adv_header_byte": "30", + "adv_salt": "BE0D6935B5CBCE532B644EBAEB0CB4DC", + "aes_key": "09F96BCC2EDE21309F12AF572473394B", + "data_elements": [ + { + "contents": "76", + "de_type": 700 + }, + { + "contents": "83BFD32351F59A0C6C0886AFC296BD48C1E442AAA8CFEFCD1AFEBE91654D", + "de_type": 673 + } + ], + "encoded_section": "5C90132605C5751F7E217A7E36D2C846C5DF8891100004FF20FC90A2D3B71931FA83687E046090045D73462C825BE89AACA4AD1EF3CDC4C5A6E3C257787693C51547CD927B09438CDECDC82610E04A0ECB445512CCD10A98ED7547A975", + "identity_type": "provisioned", + "iv": "0914932394906428A0D76EE9D518875D", + "key_seed": "67FDE8780AA1EEFA293EE8897234FE2C0D5DB854BF6A3215609DC44A601D448F", + "metadata_key": "E77492D379A619F8A40D54D91A5DBED5", + "section_mic_hmac_key": "F84CC8323ACBFA67420AB61721F4039EB2859FA694DD8C9FA15A9A5C5CE6365F", + "section_salt": "04FF20FC90A2D3B71931FA83687E0460" + }, + { + "adv_header_byte": "30", + "adv_salt": "0CE7F59C7D7A29C744084A1E346B308D", + "aes_key": "2740097F0EE9541B3FE75A1580500594", + "data_elements": [ + { + "contents": "B3CC25", + "de_type": 323 + }, + { + "contents": "39E0F88DCD564592199E1D2F582BA79D054C292C6DBDAA0343", + "de_type": 501 + } + ], + "encoded_section": "5990139E6B783FB0F70C3902C8A67B9019BBDD911000E3240073A3AB269A8AA57F0122D70EC490024E4CEAC73CE78AA7C17623FEA674A0F892D0DB5FD0DB28392CBDD7FE48F675E5946FC44FEAB8CD4683CAA251AA2084098657", + "identity_type": "trusted", + "iv": "3CDFAE3DA464D67F574AFDBBF69161B4", + "key_seed": "31F9C997DAE4B7C28566810532ED77A9BDA311E0357161B3933F6116C0E3AAD6", + "metadata_key": "DB75222950D33438C7D8BFC500EFE5CF", + "section_mic_hmac_key": "BAFA2EF3A4EC8A7EEF7B2E2EC74EB8C89D51D7589D5B316EE19388755639839B", + "section_salt": "E3240073A3AB269A8AA57F0122D70EC4" + }, + { + "adv_header_byte": "30", + "adv_salt": "73EB253EB94944B28A0929DB906F3965", + "aes_key": "B528A116686C84C53B6A71680E846ECD", + "data_elements": [ + { + "contents": "F561F2FC", + "de_type": 347 + }, + { + "contents": "729617D310A7107E6B62763A15E8", + "de_type": 436 + }, + { + "contents": "26F23C2652A0978220A0CD", + "de_type": 679 + }, + { + "contents": "BA2CA34BF2F0FCCB4FE3C4FD0D8911F3E5E01837D810ADBB63F091B96D", + "de_type": 487 + } + ], + "encoded_section": "7D9013FD4ED421EBA8A62819978D7E11C4292C911000880D39B609325E05472E3C5D8C6999AE9004358528DA38735AC35115FBCE268A37BF76F6FA4A2E2FB9C39F97E92EE39799487B4137A8D7EB669ABFCC1A46970CE5ABF8D0EF13085463535C4F871184E000260ACB47D637BE03A8FE21D3A302487A51DD89AAB1BCD9", + "identity_type": "provisioned", + "iv": "320152979988F1BEC69DBE6A55447602", + "key_seed": "492F19D4AEB5EA017282ADB13CF7BF4D5A271B78F75AD1BA202B5E3EADFDAAF4", + "metadata_key": "956FB218D86E0B1022B9D9EF9557E0DB", + "section_mic_hmac_key": "A1FE43F2B654C7609E652267C50E47E5006B9ADA95AA6FE9CE74C0A7688CE14F", + "section_salt": "880D39B609325E05472E3C5D8C6999AE" + }, + { + "adv_header_byte": "30", + "adv_salt": "4DE153E88AE9F55EA216E8460C5B4AB3", + "aes_key": "437A29371741838743A218D22C151D97", + "data_elements": [], + "encoded_section": "379013EA44AEE04512C910A2DD265ADFA11056911000BBE190D2D9010D8B82EB6885F11888B8900494CB0BE562B2A7D547945AE25C11ACD0", + "identity_type": "provisioned", + "iv": "0D790B1F58DC583F71CC470CF2639578", + "key_seed": "E6A5B4A42797FD2443733A51FE08E0E20A97142163D82E17AED64395E2E25A1D", + "metadata_key": "EBE57E72E39DFF45F46CDC67406C79C0", + "section_mic_hmac_key": "2E2E7B8051FA5A344F74D36B3881951D476E291DA95F619AE54FDBA38F23E7B5", + "section_salt": "BBE190D2D9010D8B82EB6885F11888B8" + }, + { + "adv_header_byte": "30", + "adv_salt": "F6B8A28AA97515625D1BC8744ABF581C", + "aes_key": "F4FD755476BFB54A67D333FDE5F21D38", + "data_elements": [ + { + "contents": "11E6C336306364DF2C6FFE3C44296C238FBE80A7C39660", + "de_type": 553 + }, + { + "contents": "F895D8637D37F08C2FBD63460CC66EC79D61DC7814A8317DD9", + "de_type": 142 + }, + { + "contents": "023536380CB2B465115601F0549C1E225ED0DDDCC1A5757CE504348EB006", + "de_type": 426 + }, + { + "contents": "90163807A994663D6BA798C051E17A4FFE136343F70CEC", + "de_type": 711 + }, + { + "contents": "34C1D3B746DBE55C999FE970A78892E4312154893D", + "de_type": 686 + } + ], + "encoded_section": "C0901358E24D5D9BCCB5631A933692B53ACC60911000041BF71ED6F92D89A7437595D5870FC490025408C683AD58FA66667A80D6B9A16201FE80656CD7F160DAE3A0E5D6C56059E87075977DFF54C593082FCD681599A8BEF62A9152700490EAC32F0A230A4EE201096056827AFF77B0E691B83E0ACA71195C60C372A7063A662D750D1EAF2B97BF3B7BEA594B7E25A2C0449AC9001C4CD601E5329D30994932854A78B8678AABC7AE2CD0A40590EDF91F91C0CD4BC5658543887CA9CB9E36EB0D", + "identity_type": "trusted", + "iv": "A55C04DE4370A9539D0054FEB77CBB41", + "key_seed": "A0F4708912E13265DC407CB2E58EBA265C246741CFA5AC92C5F45003E9DC3D73", + "metadata_key": "0755F41DE31C1DA14183BCE6ED2A793E", + "section_mic_hmac_key": "45DD4376D86A64ACF88C521BEC32316AD023B10200514E6C1200E364FDBB1C89", + "section_salt": "041BF71ED6F92D89A7437595D5870FC4" + }, + { + "adv_header_byte": "30", + "adv_salt": "80B55AAFF717D29EE2150527E786FC22", + "aes_key": "89D2E5C6EF19C4798B18A5AC956BA8A8", + "data_elements": [ + { + "contents": "C925910705C708716C2A2E2FB9B7", + "de_type": 746 + }, + { + "contents": "7441B7", + "de_type": 798 + }, + { + "contents": "5616AF27BC9705EA841EE82D8A8CE2A4E4F4BE51D4", + "de_type": 284 + } + ], + "encoded_section": "6690131B198CEAE84F43E5333491064B8C72D19110005A8BC686BC40CFD016A6549C3E3220A79001E09548FC1B654C438A8B9949692224C81D87813B39830B110F4B5FE0F9D58BCEB7CCEDF442B77A17839F79F00A0AD51DAC75D63B7B137949665C55C8EEFDBF", + "identity_type": "private", + "iv": "C87B5050A21E0BEF4DF28C8E2E86B9E2", + "key_seed": "62127F82AA866333831B924405D6AD1B36112C39901CA63820FF8CAFD841184C", + "metadata_key": "863325C4DECDBF4CC7BBFFF32518528C", + "section_mic_hmac_key": "5E35357D5B711AE75EBEB698D5FD818E165687A6C941F545EA7A54486433D521", + "section_salt": "5A8BC686BC40CFD016A6549C3E3220A7" + }, + { + "adv_header_byte": "30", + "adv_salt": "5CE67FEBA4AED76BB9C04DEA24F5121D", + "aes_key": "CD9B63EE81CCBC1A6FED8AB873DA6F9C", + "data_elements": [ + { + "contents": "0E0FCD76BDCF900F512961B856A7A8177BD66FFBDB33F4F5F44459B009B9", + "de_type": 153 + }, + { + "contents": "C45B234AAC5688FC4196", + "de_type": 952 + }, + { + "contents": "CECEA9E54D144A541D", + "de_type": 299 + }, + { + "contents": "A5837AEB6B56F1C33168919FCCCA914D7668DA65107E", + "de_type": 583 + } + ], + "encoded_section": "8A90130DF91C2EA62A4347A347AB4FFFAC68BB911000AABDF7BE435EF0A8DC2F5ECD0099C2169004FED4F8ABDB95DE277D5EA8CC2CDE85DA2089ECFD798827F8F757DEDB8EDEA4EE5A53A41316D8D3DB792007477A232506EDB88E6E15434D52978B671850915B0B4E91713CA3584FBC1E92581FEB81750D378A6E0D51835A8F3CA203DE4272FE41F2230F", + "identity_type": "provisioned", + "iv": "6AD1D35AF9DCFA8846CE08139586BE4D", + "key_seed": "3EB0A1FC103DE614F09A1A555E9F83A7B80B87712014B0CAD6C4ED25F52B9B33", + "metadata_key": "488C3EF28CAAB88A94CD82AE8EDFF615", + "section_mic_hmac_key": "2B44CC0286E9B946662DAFCA116AE8AC7464625D20BA4972F9CD5E09A226957D", + "section_salt": "AABDF7BE435EF0A8DC2F5ECD0099C216" + }, + { + "adv_header_byte": "30", + "adv_salt": "B9DEA2501303F34F7BAAF91B3FF6FDFB", + "aes_key": "6EF9C4550455F6B122A9842E4FF9563F", + "data_elements": [ + { + "contents": "59E50862FE4633D3ECF91C3EDB72270FCBB5", + "de_type": 286 + } + ], + "encoded_section": "4C9013D4619FC79CC7834813D1C2A27ABF790E9110000F0469848994E26F09CA0C6C440462749004F0A1A5CB662AE19B307355144B85F4EAF30056D216F9D2C0DE09D233F4C85B3A39BDB355E7", + "identity_type": "provisioned", + "iv": "EFBEDF6DCF3B97786CABF592BAF9F5D6", + "key_seed": "F0EE8773F58564994D1F3BA077E7A3990228BBEA25A527ECEC620A62279F0319", + "metadata_key": "FD3B6FF7375FFFF1CC29FFEAF9A4C2EB", + "section_mic_hmac_key": "7123A128F2D15A893EB34A5114774DE3D49285942274ED8F5F3FE198D58F3110", + "section_salt": "0F0469848994E26F09CA0C6C44046274" + }, + { + "adv_header_byte": "30", + "adv_salt": "8D8E8645D7B0FD0E9E36ECE388CC4F6B", + "aes_key": "CE9FFE75B22C96DA0FA83BC6AE435B4A", + "data_elements": [ + { + "contents": "4C84EA9E7ABBE9805FDA1AE32592092F414A", + "de_type": 446 + }, + { + "contents": "E2013312F6", + "de_type": 100 + }, + { + "contents": "7647A9C883BD", + "de_type": 427 + }, + { + "contents": "", + "de_type": 434 + }, + { + "contents": "9A48A6A9C9FCACC1E8BC284FCF5A368125", + "de_type": 953 + } + ], + "encoded_section": "739013765C4523E0C5459C2573E009ADD07AEE911000B52AEE3E5778873503DB2A7374157D499002C6032636BCCE82535DE0210C953C742AD0E29C1E270461E7C0D27DD7C81E402CBE795FA9F76971E0138E2533D0D47ADE1F673E73FB92A528A0BA6557AAEAB58AC529D3568B70625AEEB89E06", + "identity_type": "trusted", + "iv": "26E8F98BEE4A9526EA91AA37D9290E4A", + "key_seed": "C3F16DFE3A2C64284BF2ECC6CE660B8245B60CAF9C6BB378EC85AB0D2FBE70EE", + "metadata_key": "653436D31BEBCBB3B1A13D9118541883", + "section_mic_hmac_key": "2B3BD1A84191B22159C5FB85BD543C3673357A0F35AE67C6850E59CBE30AA17A", + "section_salt": "B52AEE3E5778873503DB2A7374157D49" + }, + { + "adv_header_byte": "30", + "adv_salt": "034097967DC080A36D23F899968F81FC", + "aes_key": "FC52BBC65CB4A29005CDBC12244BB6EE", + "data_elements": [ + { + "contents": "E911676F5B4E9F61", + "de_type": 566 + }, + { + "contents": "", + "de_type": 455 + } + ], + "encoded_section": "459013C48F03E367BD6F91F0B051FB2D8791F3911000C713EC5C07873E7CD62C20B0DBCC23AD900203A6EDBA4B5584A004D3241D12A40A7D6249D1D9530358F146EC5843C68E", + "identity_type": "trusted", + "iv": "D2564B7B324F39EC38CA5B83BF40FE80", + "key_seed": "B0F6316F4E5AF9E14F4D2E0D83FF526A2FC1C243058E6388BC5DF379438AF84A", + "metadata_key": "2E0E3C928A480081465B77B49A94DD56", + "section_mic_hmac_key": "556C7EC0D6D6B7039D48F792BA144CBEACFCC0DBADFA48216F164BAEC8D63590", + "section_salt": "C713EC5C07873E7CD62C20B0DBCC23AD" + }, + { + "adv_header_byte": "30", + "adv_salt": "0BC6ED4E4FAD31DE8B82828233A12365", + "aes_key": "3FEF727B599B4459455003A24642403F", + "data_elements": [], + "encoded_section": "3790134EF72ABDD3AFCBE1EE92620E4DA93B7291100041A9598B504C6C06A001007085FA9E0190018DDABDE4D015767D58FC48D349221A74", + "identity_type": "private", + "iv": "ECABC8AC7BA091020DC32E9ABD83EA8D", + "key_seed": "EC81188441C84DC2ABDB353BD825AFEE28068F397BD3E69DD9A1F51E5968CE7E", + "metadata_key": "D22BD70DD5645FD54109C0EF7BD0230C", + "section_mic_hmac_key": "B5B3BD02791CF9B92F1C14CCD4DEBEAC2DA75B7B1E09F9621358BAFDFA90BC66", + "section_salt": "41A9598B504C6C06A001007085FA9E01" + }, + { + "adv_header_byte": "30", + "adv_salt": "BF047090110BE62932CD9AEEA0A52C48", + "aes_key": "074D26AD25D20FB1036B4249E2E65B8F", + "data_elements": [ + { + "contents": "C6A2397CF77000BBD2EBE6823B067AB8DBCA0B286C5CCFE016F1C4DD", + "de_type": 268 + } + ], + "encoded_section": "569013EC3001BC38635A32132EA9F28B7384A59110001C583A0044B9A78DB388334F9CC28A6990047EE274D8D6CD6FF1A0C80003FEE139C37C699B106C421F4B6A2CC6519D742A54C5858A398EF3F71D3F41EE45CD0B66", + "identity_type": "provisioned", + "iv": "5FE0E2D415A4FAA3BCB05F7916A8DE70", + "key_seed": "D963624712D4A0EF3595BB91D3AD2544BDB5CEEE55BCD98BDFD6338616138018", + "metadata_key": "8DC8B52AFCC6441510745EBD7B64088D", + "section_mic_hmac_key": "0086E6595B16AE4D2DF1F4F0392D7454659FE056469DCC4A77F97CF03FA64580", + "section_salt": "1C583A0044B9A78DB388334F9CC28A69" + }, + { + "adv_header_byte": "30", + "adv_salt": "70F216A7594C3FF0E50939B5F220FE79", + "aes_key": "F01E3A52411A7B1FED0BD6E66293A36D", + "data_elements": [ + { + "contents": "7405920409", + "de_type": 27 + } + ], + "encoded_section": "3E9013725A39A695F3E9F46AD197C21A99C2D7911000470C1930342C821B79454E20E5AB565B9001CC0690B842E78B7D6B78BEBD4211D467553DC5EDDBA2AB", + "identity_type": "private", + "iv": "0FAF61AA59E9CBFEDF4980C75B398AA9", + "key_seed": "179D0580612390420788D334FD020577FE02C7BD687DC505D187D79F08043268", + "metadata_key": "50780E0D785234C8EBF3AD1DB5C75B78", + "section_mic_hmac_key": "4B1B5D53E4470367C14FBFE4F7125B93600BB28C06C92793E1C64EA61627D5C1", + "section_salt": "470C1930342C821B79454E20E5AB565B" + }, + { + "adv_header_byte": "30", + "adv_salt": "B3BFD568BC29834E2E7F3464E5C51A4B", + "aes_key": "FB487D058A744D7651D78F35E65719B7", + "data_elements": [ + { + "contents": "DF9EF9CB0BFB15675BBB5538BEAD105177B941FC3D686B", + "de_type": 797 + }, + { + "contents": "7D24B6A84E", + "de_type": 884 + } + ], + "encoded_section": "5990139FC1B788D94802986DBAEDA37EDBA2AF9110006BEF387F51D62868738ADD58FDE218249002E262DBF23D1632384B901434E093C6998AB986226C99C8F7F6B3F9380322ECFD251D8B8BCBC6F9D2F197CD856C2BFCA6799B", + "identity_type": "trusted", + "iv": "D1646EED1BE182D8F658BBA68FF28CD0", + "key_seed": "0DD1FE126C5BAFC3E252D7DA0594D99F343A912E0621148915369B386348172F", + "metadata_key": "12E52DC79FFF5748E238F667C4CCCFE1", + "section_mic_hmac_key": "B5B5BE70DA1B6E67300A257C9568D1D777263CCE944001D4571F86966237C266", + "section_salt": "6BEF387F51D62868738ADD58FDE21824" + }, + { + "adv_header_byte": "30", + "adv_salt": "043890F126BF8FD56249E2C73E59800E", + "aes_key": "F372FC7CB4D3900FBB9C6B41921ECC89", + "data_elements": [ + { + "contents": "14BB8E9B7B", + "de_type": 389 + }, + { + "contents": "0988FF91EFBA62AE84619FE5A71978B457EC739AE265D455856CFE", + "de_type": 392 + }, + { + "contents": "EFB5AA412C20472C54F22CA84AFA", + "de_type": 369 + }, + { + "contents": "2A6E32C24C3CD0AB1CABD0010F49A94664BE81399CF39DE9C8D225DFC67E", + "de_type": 408 + } + ], + "encoded_section": "8F901394A25D3684C8351BA133D7935CF78FCE911000E97B66077075042EEFEDE4ED8B42744F9004BD060A6FE04F67326A3316058E3A354F32195D06920642A21D1F38DB9DAC8BFAEC958C457F0B5DE19626033705374CF5BBF3A4E2AB1C1197A411DAC42B636511827FB43F9BB83D28E1FB5F3F359DEAC8E6D4EEDCFE8496C6A27EC348C2778E1BD004BCFC5A154FAF", + "identity_type": "provisioned", + "iv": "16339A85CD833FB55944A135968EA806", + "key_seed": "E7C4E1D06521AAD6962A498287BAE9EE92361BE1FC7DF062564D0107649F6FFD", + "metadata_key": "B23F3EF58B4E7CCBC098C105B9D50E01", + "section_mic_hmac_key": "C37C26624B9F567661B253E21D89336D23C21ECC122FB83359DFE86203685E45", + "section_salt": "E97B66077075042EEFEDE4ED8B42744F" + }, + { + "adv_header_byte": "30", + "adv_salt": "C063C2D07532B482BFDEBD663EDC8265", + "aes_key": "78886059E7F87F6478A15B1CCEB129C3", + "data_elements": [], + "encoded_section": "3790135199391E9E94DE46457DEFA2423C3BA6911000DD4628D624F0B29D1B9E298F42873FAA9004F3675D66D5129706C9DF1FF21F4ECBC7", + "identity_type": "provisioned", + "iv": "25A3BF84A38B4DC18D6DC400D33D85C9", + "key_seed": "6465DFE7C9EA8D4F1BAC260D41067AFE04D5F1417A8A2BE49FC8498C98675331", + "metadata_key": "D786EC2AF4CEAD98F381671FB41224B6", + "section_mic_hmac_key": "8131F5C4D353A851B8763D5A92396040F06246EAA72F1F6DE549E2D35A35B57A", + "section_salt": "DD4628D624F0B29D1B9E298F42873FAA" + }, + { + "adv_header_byte": "30", + "adv_salt": "C94BA491AB602859E1F82F97DC7E31E0", + "aes_key": "F61ABA231C3721C2BD49328F3D090AB3", + "data_elements": [ + { + "contents": "6C1BAB85BB39D714EE", + "de_type": 738 + }, + { + "contents": "28CE85B2A00672F37691D02111DFD1BFC21D", + "de_type": 105 + }, + { + "contents": "16A72D416A0D6851BB0CA8CDC2B07848B6A06A", + "de_type": 225 + } + ], + "encoded_section": "6D9013C6D572F4EC76769832B2F2F3AC584A599110002556D8F2392B4790EA6FA9B70B18D3AC9001E64E58B31B1F9DA5DEED6593631E650F2B9C4FFF9C5105ABA3332D06A64436DD5B2DD2F3ED517E533889DE660536562FC3A0546FCEFBA559E85DEE0684134A3DC15C472539A7", + "identity_type": "private", + "iv": "EF82962F49EA98E5C08EB77194A2DD03", + "key_seed": "ABCB15E7264D97216AC3352B5BE3DB9678F9DFF1C5C9F62F8C911BB7D83DCC04", + "metadata_key": "6EC93C5286500B4D7E15754A4125AC6C", + "section_mic_hmac_key": "55B357AF96262F52A3F2DADF540144862D66F19D734277102308554E4A803C63", + "section_salt": "2556D8F2392B4790EA6FA9B70B18D3AC" + }, + { + "adv_header_byte": "30", + "adv_salt": "845E8EC3A0A25B2298E6431A91E189BD", + "aes_key": "54D20D731E4FF2CA206D66C95313ED43", + "data_elements": [ + { + "contents": "C6CC76056F0FAB3CEB159B6C76EA0A", + "de_type": 781 + } + ], + "encoded_section": "499013628E1C5A4B6BEEF1429B72C20D781CED9110009C067D1D8A1AABCCEACAE28F4441548B9004B8409502A72B1873614B1D9C3EF45B1610D462314B0FC36CDA1CAD8BB9EA670B76F3", + "identity_type": "provisioned", + "iv": "1AF8A3DB82F8E98F43EFD67273112AD3", + "key_seed": "723EB47D34E9D5F54CD657EA4B91BEDEC4508F5423940653B13CA3F9C0E5D0F1", + "metadata_key": "399A68C6D9EBD1C7136879DFFB4BB661", + "section_mic_hmac_key": "E42B114BDACD69D449050F295B9F8E1989927928C3DEFFC2C4B1B712156EC7CA", + "section_salt": "9C067D1D8A1AABCCEACAE28F4441548B" + }, + { + "adv_header_byte": "30", + "adv_salt": "23240D3B2662A867CAC09B37002EC151", + "aes_key": "7A6059F6D0A60CAADE7FADADF8A6DC28", + "data_elements": [ + { + "contents": "", + "de_type": 946 + }, + { + "contents": "7C190D653583EE", + "de_type": 324 + } + ], + "encoded_section": "4490131EEB5DA191A2CFBF9FE477A71C5B16AC91100023AAF945414E18B7B2DFA5CD8F56E1889004C3139ACE2449BBFBF8A129F85AB3959B7BADCD320FD0F0E5D14981B986", + "identity_type": "provisioned", + "iv": "AA2A519687C28CCF377AFC1E31A5CD8B", + "key_seed": "532906986C81E3D60E295AC315B7C414C3CE4CD64654AA7940223E5B0366A38A", + "metadata_key": "6B3994E58566DC0822C91AD7A9233DE9", + "section_mic_hmac_key": "2621946D28448B0FE1D49F42F14DBB771D036981A8BF60D68183E48F1370CE68", + "section_salt": "23AAF945414E18B7B2DFA5CD8F56E188" + }, + { + "adv_header_byte": "30", + "adv_salt": "1BF5D55B85DFE348E916009BFD94E23E", + "aes_key": "BBDCE9CD6AC6B4D05A30F0FFD12FCA85", + "data_elements": [], + "encoded_section": "379013C80B6B02142DDD201B73820ADF0B2E34911000A321FFAC8CD880B256A741A077BD1C4F9004894461CD30CFCB9D823BA848BB442098", + "identity_type": "provisioned", + "iv": "1125CA91BCA3D2C39E84F864736D3243", + "key_seed": "C06F738CE619A69F7C35F0853EE53BE4567F1AB96CF2DE1D42271BBD4A3FBE25", + "metadata_key": "9BBD434403D6B68CA9D0B2ECBE1391D6", + "section_mic_hmac_key": "072FCC113795FD057E811E3573E219B3F4F01C886808E060B2D8CBFFD05E2A39", + "section_salt": "A321FFAC8CD880B256A741A077BD1C4F" + }, + { + "adv_header_byte": "30", + "adv_salt": "8FFF31D9E05C67B63EFE52C70B562B2D", + "aes_key": "69C6A32CEE99AC1D008C633D0322AFA7", + "data_elements": [ + { + "contents": "775E02A1DD5313C05333CA56BF884A55C3C4A9", + "de_type": 997 + }, + { + "contents": "EE659244BCC7E04720E5D5C3633793B3A2F1801127960F4E846C800B17", + "de_type": 303 + } + ], + "encoded_section": "6D9013167EBF9EFA9F7450FC14B8B4755652999110005A21C2E9033C4D92E3D0E343265854A99002617AC1869E187111E631A2E97C28F8179C94488578C3798499A6D1FCE3CF60D4A0265F81DC3CA0F43C49B70E8E00F7AAB6BE5E28175C99E4E868BEA0239098E94DFE43C3D830", + "identity_type": "trusted", + "iv": "EC1631F0E9992D01661973E10CAA0598", + "key_seed": "D304FF6EFEF40CB4745AD0C2112348A40F5BC04D3D91EBC2A55783A2F8869F82", + "metadata_key": "9EB2E5F2B16FE3803E28A17ACB2E9A56", + "section_mic_hmac_key": "64449AD305C717B9BC1C186F0BA4B8415CB93C34EC52608A7173EB512FD55EF0", + "section_salt": "5A21C2E9033C4D92E3D0E343265854A9" + }, + { + "adv_header_byte": "30", + "adv_salt": "B9D3A1A05CBF5F5E1F69C7E362BFF3D3", + "aes_key": "7A609D1D39BAE76BA999840CD3FDA233", + "data_elements": [ + { + "contents": "64A1E6D6457FADD30243A34640CB96D018D8", + "de_type": 759 + }, + { + "contents": "8E7893F12DDF3CAE263C8231E284580D78", + "de_type": 433 + }, + { + "contents": "8EA89C3191D3", + "de_type": 979 + }, + { + "contents": "726840E37DBCC2F0D910874214C21C", + "de_type": 516 + }, + { + "contents": "72F6BC7F5BB01EDDFC7892", + "de_type": 165 + } + ], + "encoded_section": "899013B1B9AD2D96FD2C5F6C56A2AB23C6549A911000B4CFAF758BA05C70F0086695B8654E719001E317BFEE6A2A6D5DAE263832DC0A0357E3346EAFA060BEF5A39ABA906872C947DEBCAD36F176043900199327F70F11104B1E80438127A3EFAA37B2FC3B8E800ECA8FEB295316C6D3276F428119CD6BD748E5DAAF5774D51FCA31E5193AE9BC5BE3BC", + "identity_type": "private", + "iv": "F786B13173BD39A7BD5DEDECB2C6F86B", + "key_seed": "FC09B7FB045850F61BAF9F55BF5BD22944884C77EF5ABCDB29C98E9957760AD8", + "metadata_key": "F7F75BB418B3BDE041DB96A09A16B777", + "section_mic_hmac_key": "F08A8BF5C5B1E23F20301843ADBC149B886BCB75F017886AF29F123D686818AB", + "section_salt": "B4CFAF758BA05C70F0086695B8654E71" + }, + { + "adv_header_byte": "30", + "adv_salt": "020BC589FF43EBC8F13AE2E43BBD7658", + "aes_key": "8F3E597366BF11B9B9AF34C266085D81", + "data_elements": [ + { + "contents": "A08381B564B135F3322D33E64262AF5A6FD68A085B6908B5602602084C5E", + "de_type": 89 + }, + { + "contents": "9A76EAC96F1758FED565E92354C68AF267536BE3522D8D932EE5", + "de_type": 303 + }, + { + "contents": "FE73D94D1454A2BDA8F978490437A2BF36C2E72BF6487D5733B2E29F67", + "de_type": 907 + } + ], + "encoded_section": "949013E74B20DEE21DBA2ED1608245C1510777911000A0EF20B9AB805B7746172E5C1CB9A42D9002C03E4EFEB9EBA55E204FEC5F7DC17B6021EE9C652A15486FD70278DE23455D858971C649F749BD2B072A3B573F12F841087ED3516549ACC27BBA69A8C39C36A33739760829F1815F782C784294E64BBE2A3B42EF1752F177BAEB5871E6F913B958F8E11E23DC292A20BADD025E", + "identity_type": "trusted", + "iv": "F9282C23FE33849259D66A40165A895F", + "key_seed": "88EAA2A88210FCD0A7C7A5B5F55583BEEA33324FCBD8F2530F7E8EF3D499A823", + "metadata_key": "81FD9DE2086417EE30A0A49B89CED2A4", + "section_mic_hmac_key": "E6954F5FBAFD6C29F2387CFE59C53D49B355501FF14351445F3685BDBB85C64E", + "section_salt": "A0EF20B9AB805B7746172E5C1CB9A42D" + }, + { + "adv_header_byte": "30", + "adv_salt": "A022D2A91854E61C50C482B8CE339FEF", + "aes_key": "84109A4F76D0C313388D16CBE43CC8DA", + "data_elements": [ + { + "contents": "E4E2A0D0943301F980E26F", + "de_type": 718 + }, + { + "contents": "AD9C95407E", + "de_type": 733 + }, + { + "contents": "E8", + "de_type": 49 + } + ], + "encoded_section": "509013F3745670932BBB42D2C70A6D17C94DFE911000B39AD48FE7075F779F82D4E60C333F029001D708D6C505181C687C84F36F2A3169DFBD020DF19D5BB72AC8741EF60610A7B174A2FEBDDD22C9C7F3", + "identity_type": "private", + "iv": "D1E556A9A5AA49009D49E19983DBA615", + "key_seed": "7727741471C2E6CCEFE4EC70253B8788D228A3FE618117C6E76EF5E3309D2231", + "metadata_key": "E1569AA98E6BDB4D6DC9A5BD46195ABA", + "section_mic_hmac_key": "D461D7A01671D7F83124856867DC04B96F62EC0E4DFBF70CE9CAB556972531D9", + "section_salt": "B39AD48FE7075F779F82D4E60C333F02" + }, + { + "adv_header_byte": "30", + "adv_salt": "A7C810623229157F1FAB904377B695CF", + "aes_key": "5EB951C2968A33F2E7903255731EA4D9", + "data_elements": [ + { + "contents": "39973FEFF2D8D62FE6C27BE3AF9B227662461635BB", + "de_type": 97 + } + ], + "encoded_section": "4E90137D2063093EB07801E876E8716FE29D95911000CCD6600A1D0FAAAE97C25B5140102A33900435DC34F63BE56B05BC152597764EF8048746085FD4D12E96EE6A3BC13BF1A4E3BA669EBC3F8EC6", + "identity_type": "provisioned", + "iv": "9D738D7B215640FC45EA0AD04FDA685C", + "key_seed": "98BF712F93903FFFEC4E0EDC656D07CFC78D0ACDBE0607EF19A2A1ADBF4173A9", + "metadata_key": "9D83C372D120920E197FE972404E1C5D", + "section_mic_hmac_key": "A65DC4805D1B2611ED71FF80FC7D40384E3ABC352C533422DCD5299228179FB5", + "section_salt": "CCD6600A1D0FAAAE97C25B5140102A33" + }, + { + "adv_header_byte": "30", + "adv_salt": "70BC4889A9135FEF8558DC85DA869313", + "aes_key": "2F78A0C2E0A662A6AFB80C6170329DD5", + "data_elements": [ + { + "contents": "4FDBB2F43A4B80C48905A081D73F0AD23407A50A96FB872ECD365C654A", + "de_type": 5 + }, + { + "contents": "238F48BB7F230CA3231C0B8800F7", + "de_type": 463 + }, + { + "contents": "7D77BB7E5EE7DF8D11DEDABAF5", + "de_type": 493 + } + ], + "encoded_section": "779013CD09FA4E2906A1B0497103C8B958A4B19110003848C27BB68D7751BD109AA798A5A1FF900111FFDEB247F0705D5D6FD0CD158A38EF11B40163ACEC63E1279BABC6736F3F940CACCDB6600BCBD5652625ED21844D854F0BF2467E5EBE5DF2FC8BE2CA6D6A18A5B60337D94F0E57EAF8B2E3EF417901", + "identity_type": "private", + "iv": "177479EC161C64F5B9015DCB22DEDDD2", + "key_seed": "067F5D95027B2A7BFF1C653CAC3040EA4DCA805369AA6EDEA735899CD2BCA30F", + "metadata_key": "67E79ACFB7EF2C6FA6357C154450DEC2", + "section_mic_hmac_key": "63F5C63B2306E218536A099BA9EBFD0EB16FDE66D04E8B917608F0CB39BFECE6", + "section_salt": "3848C27BB68D7751BD109AA798A5A1FF" + }, + { + "adv_header_byte": "30", + "adv_salt": "0B62C9D1874CB2A9361CD266ACFE0943", + "aes_key": "3D59EBB776EFA1803E495CAA387DB727", + "data_elements": [], + "encoded_section": "3790131F6A24505B1F4420A388289F7F2BC22D9110008C40367DF7D629BC40F5D01CC680C53F900181FB9E16124D32FC426C1C4E4B2ECFE5", + "identity_type": "private", + "iv": "D7A366700B7C0223230E9E9677361443", + "key_seed": "3A4856049F6612A949BCC3647B5BAF36F9D71D0FDE813B824D5BCE2182B5FDF6", + "metadata_key": "9BAD67AA712DF9C5639C1D2398125C40", + "section_mic_hmac_key": "9D2C92937531075FD9D09129497BEF9111C0375C6302A80BBA61F0BA5CFC81D8", + "section_salt": "8C40367DF7D629BC40F5D01CC680C53F" + }, + { + "adv_header_byte": "30", + "adv_salt": "7DDCD2740B158A2EDB7842390C73B169", + "aes_key": "BE02546B3D28D0CAFFA8600033802837", + "data_elements": [ + { + "contents": "D095D2747F4A2EDE1623963AB0B48A2649E60C0255A11200044BBE", + "de_type": 885 + } + ], + "encoded_section": "559013245407838E530FF4CA8D651DE3F4EBB79110003D4B11380D6AF601B651492FACECEA0B9002434F17846C767176E501E462F1E88F6256AE42BAA69F62FF748B1F10704C5ED834105F6CC1374C2A53C200BF8EA5", + "identity_type": "trusted", + "iv": "C6247D6BD8C642673B8FA1C533A9263F", + "key_seed": "35CBFBDEFA43F8AD872C6EAF8C743076EFA7F938EC2B3D02FD034A6045536605", + "metadata_key": "0359B617E2D475D366F7B2046DCB7383", + "section_mic_hmac_key": "99DE9888F8AD547E181420DFE74D8412E13836BEA0DED59264102E68033BD0B3", + "section_salt": "3D4B11380D6AF601B651492FACECEA0B" + }, + { + "adv_header_byte": "30", + "adv_salt": "E644DE907183C18EB11F7B4A9C5D0725", + "aes_key": "4CFECD89D5D364E176F67F127F1FB0D8", + "data_elements": [ + { + "contents": "A630BDB220762910", + "de_type": 443 + }, + { + "contents": "E10F32B0", + "de_type": 298 + }, + { + "contents": "6482387D8BBAD195CD", + "de_type": 918 + }, + { + "contents": "1BE384D2FE8053FE99", + "de_type": 555 + } + ], + "encoded_section": "6190136FB3B3D8620CB4D3928F608BFBCC069D911000D48208F2E81A395B338FAB5BAE6C760A900459356113E165F119D38778927C6790DC5146415F4F254995E2EB98BD322DD85C4AE24D1F0CF4B0C26C46A06E5B72851A6ABD1D3EAA170A13F5A0", + "identity_type": "provisioned", + "iv": "8F553BBD4CBFF05A75898D3D39462728", + "key_seed": "64ECEB1A3107369944DFFD3FFB9BB33D5177269BD7EDC99034888AAB415CF7B3", + "metadata_key": "A6327CBE37966B45B0047F3B6D2387EF", + "section_mic_hmac_key": "D3BB8A8AA1510F67E77EAFE45F79E4685F26D90E5044AF2EC02FE104CB06C0BF", + "section_salt": "D48208F2E81A395B338FAB5BAE6C760A" + }, + { + "adv_header_byte": "30", + "adv_salt": "F3BF8CE4146FEB417CCBEFF0575B6816", + "aes_key": "F7298D234884DBB39C5326BE9CE58BC5", + "data_elements": [ + { + "contents": "1BEC46DF0FFE5BE99BBED7306A", + "de_type": 533 + }, + { + "contents": "", + "de_type": 224 + }, + { + "contents": "EEEC", + "de_type": 899 + }, + { + "contents": "82BB76BD6A80BF3A737E72086E8E992490971CA48C9A8B7220FF90", + "de_type": 458 + }, + { + "contents": "55E08CD9F499CF88B5778CD24C71C22B8933750C89", + "de_type": 940 + } + ], + "encoded_section": "85901373651DA9F5520F901CB346E81A93BD0B911000536258509CB9BA353DABBFE54FA4826B9001485BDE12ABF28AEFAC16677B0520D2E545CB2237FF8822E97EDBEEE819385C1B09F12B982B0B2E2C0FB579F5294CAAD96D2DFBAA0DA210D867665F12A1F0576520BE4B11929C4FCA001D5AD95ED181FB8CF17BE130AC553C59F8E688AEF6", + "identity_type": "private", + "iv": "17FBACA04AE79C76C41CD2B82CD59C11", + "key_seed": "A5BCB398B80D10B1FD2423DA6F342D113AEB13C34668E640A968A8733EFC942A", + "metadata_key": "70E737B2D129BD7E2DF862F71B2E369E", + "section_mic_hmac_key": "6E3223166BF4E3A185BECDDD34CEB6D8C9D3A9E698AC5B8864B83423E825F10A", + "section_salt": "536258509CB9BA353DABBFE54FA4826B" + }, + { + "adv_header_byte": "30", + "adv_salt": "61013AED46837E354AA29735E8CE2453", + "aes_key": "DE2D317CB7AA56B32B262326965F8A9D", + "data_elements": [ + { + "contents": "E8AB270D18C57B0ADC1CB3DC4C7449DA", + "de_type": 335 + } + ], + "encoded_section": "4A9013192B45282D4FA290760B781F1613535591100075C506260F5D61EE14504C42FA5FAE13900479BCB215EE244D3C5BEA6A61E13FBFF3B3D49A9573819FD6929BECB1D8BE0DE085D6FF", + "identity_type": "provisioned", + "iv": "D8B19C28725DB25449B16530FBDECE2A", + "key_seed": "A2D7FA151A0EE90ECEBA6D4F4BF7E85A2C1CDCE93D705CF59AC6A10D2C098240", + "metadata_key": "8E9063E9449722E3852DE6C07E799974", + "section_mic_hmac_key": "1F9DE18CC2C895DB4D880DE858CE05A5708B2FA9B8D3C69D208A966D5B066D4A", + "section_salt": "75C506260F5D61EE14504C42FA5FAE13" + }, + { + "adv_header_byte": "30", + "adv_salt": "05690CCA9ABE110947D18BB479062B32", + "aes_key": "DA0D102B8953A994B76B1719C0041647", + "data_elements": [ + { + "contents": "161AE3D8B65862FE5AFC2D03CDD680F5", + "de_type": 268 + } + ], + "encoded_section": "4A901385B1AC6803247FC7614C67F32266B3D591100079AECBDFB7F3F4301BFC7D23602E11329001FB8EC97CD186A2D2ED230FFE2A5288D7C82FF3C0E7317BE06C93C0453756B23A423135", + "identity_type": "private", + "iv": "83DDD162BE71C736E65BDE8181DF7A81", + "key_seed": "75BCE8199AE92DC7A3DE9EA798E10186ADCE6473ECB78562F185CA6F3E8E98F1", + "metadata_key": "A455F115BA43C061EED4320B1C4498FB", + "section_mic_hmac_key": "BD92C0272C1D2CB10BB6506C8C721BCB0B54EA71EC83C8213698C7228CE3AD1F", + "section_salt": "79AECBDFB7F3F4301BFC7D23602E1132" + }, + { + "adv_header_byte": "30", + "adv_salt": "E23B4C0D7BFB6FD8E6E0DA3261F9A3D6", + "aes_key": "1768A8ACB8EC354B0FCD2ABAAEC64760", + "data_elements": [ + { + "contents": "23004D740BE1EE3B4B5A8DA3426480", + "de_type": 756 + }, + { + "contents": "EA0303D125", + "de_type": 669 + }, + { + "contents": "7541304A", + "de_type": 83 + } + ], + "encoded_section": "579013390C93D780F8096F0D413AF90C632988911000814D8033C76A6E1B6B008F2E3D460D2C9001E94C0EAE1E10ED82B94C0A7ACE66BBE7BDB943A9BA6C1F2EEEB493A823DCDDEAD974FD717F8490E9B48EA52393E343CB", + "identity_type": "private", + "iv": "B5FB42C3108C8AE313ED69685648CAB8", + "key_seed": "29A23FD4ED5E66BCAC1ABFBA0E9FB6FC0059A6354C42936C4599A355AE3AC76D", + "metadata_key": "5A814D128ADA2D20663F759F0232DF46", + "section_mic_hmac_key": "2C69B4EED4E52D3EFBBAF37E9749E2C1660B73A951A75198191F82AFCEA2191E", + "section_salt": "814D8033C76A6E1B6B008F2E3D460D2C" + }, + { + "adv_header_byte": "30", + "adv_salt": "1839D2C3BA13C005F5C45F0BDA96ACB2", + "aes_key": "A030D853E042AF8055935DF441217CED", + "data_elements": [ + { + "contents": "2376F195FB1505C80FDE28394E2E398E2902A3CC84F9AD09FD221D10F0", + "de_type": 53 + }, + { + "contents": "99", + "de_type": 181 + }, + { + "contents": "4A4C47C2A18D15F2E4D1A89C1D4EF686C9CC40C1BC057C2CD1", + "de_type": 45 + }, + { + "contents": "C7BCADDBC0EAB47E6D22F5A11B59398E7354B1448FE9CCFD229A", + "de_type": 814 + }, + { + "contents": "FB62CE7C1BC06EB95602F99308D0393E10C833", + "de_type": 433 + } + ], + "encoded_section": "A8901383E429525E34D29E92BD41227C23F2259110008265D5A57D3486212EF93FBE297FA43F90014E2A55BD81FAE9BD3FD32E7D6CA34D0840ABB8E12CF3BBD435270889D2E9B4286DB13CBCD73441D3433DDB05265FB5C691D77CFDC464121E194262F852EBF42CB2150CCAB45F4080AB5CD824BD0AED6EBB82EA5A26B26FD7B03B7F6E2459F48B6FABFFBAD719787564A505FBAAA90C5BFEE1FFCD39EF97847DB321CA2198E722B9", + "identity_type": "private", + "iv": "AEA7A390C40F8095ACEA1D8ACEDF3D12", + "key_seed": "C1C16A9F6FE7E6C00A780ED9A2BC1C487F9268805B474D3A1FFDC74FAC8B4E11", + "metadata_key": "6B2A826AF6C92F037F6FD7B91BCE34F4", + "section_mic_hmac_key": "39FBA69424E69CC24A79B0F09FA447BD5165511FD98631380A8B261F683A3C6C", + "section_salt": "8265D5A57D3486212EF93FBE297FA43F" + }, + { + "adv_header_byte": "30", + "adv_salt": "BAD2528C1B7CB990D7AD3DCDCE3A23DE", + "aes_key": "DAEB2E5F4394BE918AF351E93D7A77D1", + "data_elements": [ + { + "contents": "1597B826140F36A5953776AFA20014CA8CFBDE245C91A34D92C1", + "de_type": 53 + }, + { + "contents": "06D2005AEE6B77C800743724DF", + "de_type": 439 + } + ], + "encoded_section": "639013E912574072B31B6DAECF1F281DB12A539110009BCEC0F8CE3CA49BCB70A4A232293DD99001DC051CFFD8482B3B4ADA0075EB65E1E16DF2E1136C057CD58A1045527F080A6F16497C198E95951DF5C4D854E167E80A1E5D0D2E62C1B3996095CB63", + "identity_type": "private", + "iv": "876E6DB1FAE9D6AC1498605E2D69D5B8", + "key_seed": "33A85E4AB836104AA7F44CA998500558FCAFC256B2977A1F1C8511785DA10B08", + "metadata_key": "49E5B24F9AB621DA9F7F7F2884A1C25F", + "section_mic_hmac_key": "C3F6790A2B82BA0B17EA93FAF612E4CD3D11451A4D28765F843B73D7EF7B4293", + "section_salt": "9BCEC0F8CE3CA49BCB70A4A232293DD9" + }, + { + "adv_header_byte": "30", + "adv_salt": "2A6447AA427EE701C9AA690F9984AEF6", + "aes_key": "8873AABC9EA3D48F6EEA776A7E15A0EB", + "data_elements": [ + { + "contents": "D9B0253A3E1BE351", + "de_type": 903 + }, + { + "contents": "BEA6C715E6A06EC584526533", + "de_type": 5 + } + ], + "encoded_section": "509013165A35A8BC76B529EEDE11257C4C929E91100040F88999F3934B36602BB79919F5EEB59001A6E1A6C4527EA8EE03C10B0E2FA65C0836BA3E179E5A8122A0C01CC4D63FB3BE89FB9E47C75EEDF481", + "identity_type": "private", + "iv": "0B977324602019C876020687AC0FD0F2", + "key_seed": "EBD257397FD934222D84245BC1EA73A7D14BC02B82D2AD05E789FA92FB021796", + "metadata_key": "4366982F4848A99069342C098FA0D5E1", + "section_mic_hmac_key": "CE5958CD6416383EA202CA5AF15B0E810BFCD99488AB311A17A895A5AD3C105A", + "section_salt": "40F88999F3934B36602BB79919F5EEB5" + }, + { + "adv_header_byte": "30", + "adv_salt": "1AA084C1AF2A39928A561D1E9013CDD1", + "aes_key": "9278ABB20D9C47298A0BB81C3BAA05C3", + "data_elements": [ + { + "contents": "A1042FF05E80458B9F79", + "de_type": 926 + }, + { + "contents": "4EB0D1BB7E711C9DB588F1ED5AFE54AE46A361B0547FA3C0", + "de_type": 299 + }, + { + "contents": "F382", + "de_type": 220 + }, + { + "contents": "DCECB4FA5BC7E7D72AA132127D27D43370480F1AB952E654ECD08ED5B28B", + "de_type": 911 + } + ], + "encoded_section": "859013225389037B2722F8D27F2226F1449ACB911000AE062EE145A8CF45329EC95736762C939001BF95DC4B5B20BC1696BFF79264BF8CE88760D1BA0834E103C9C3DD35111224F93A46DDA193BCE22C3FFF0DEABD66C91933B5EA8B9D9DA8B8C8430FD8C4C9ADED4FBF843A3206D0CD4C2CF4258CC4C47FBFBB68C7A6D3E463C3D3BC2045F2", + "identity_type": "private", + "iv": "C789264887CAAAC20C0A84CAE6C16A6D", + "key_seed": "9C0E8A9E88EBAABFC8620322B4DC189D17AFB01B7FDE0BEB5027AB67B36D58F8", + "metadata_key": "602E08A242159621ECCBCF62A1BB77B2", + "section_mic_hmac_key": "B9DA231118DFFE6E168A4561180D096196D7460CE3E39ADF400958A411E91F11", + "section_salt": "AE062EE145A8CF45329EC95736762C93" + }, + { + "adv_header_byte": "30", + "adv_salt": "618DAAB745E83D398987853966EB8D73", + "aes_key": "60BEC13C1D8742EA4711CCE37F8AFA57", + "data_elements": [ + { + "contents": "A01201A2AAED58EBB95DA45C", + "de_type": 941 + } + ], + "encoded_section": "469013F52ED257572229C484BEDA18270EA33A91100030A663A6FFE15F76DD3F29F84018F96A9002DBD150672794658EEE0B4D1324CAD3D9937518A48F7722287A7C4F15B16363", + "identity_type": "trusted", + "iv": "3D850D530781D998CFF408E7EDC5BA43", + "key_seed": "48F03D01564000EFB7BC8EECF1328FC6489327A7C79AE7CD4C190B5C41ABB61F", + "metadata_key": "1CED23D2582A5320DDC1C9A75F79535A", + "section_mic_hmac_key": "4D96D070171E81DABA26D6F55BC91CB938B694AB4D6AFF7AC324BCE2A36BAD7D", + "section_salt": "30A663A6FFE15F76DD3F29F84018F96A" + }, + { + "adv_header_byte": "30", + "adv_salt": "F24BF18270E7EFC7882FD7300BCCC0CE", + "aes_key": "6237B593C1E95DA0E71B42F390B79E3A", + "data_elements": [ + { + "contents": "5A0FB6BC7788", + "de_type": 347 + } + ], + "encoded_section": "4090130BCE2E9C111E02B7CB33EAEFA76C1F189110009AE61B57A56E074D46354A6C28A6600B900291D225FD9D6DED94B1AE1A8DE03F95D14DBE075885CC06AD4B", + "identity_type": "trusted", + "iv": "9EEF6EB4A585A899C07623A06B6EDE18", + "key_seed": "053E32D215D9706EB8BA952E5C2D520754349EB64BA594780F1D04883FC20B69", + "metadata_key": "2E3EC7648FC3F6C1B64FE4BC64363DF2", + "section_mic_hmac_key": "709572F18493C4CFA68B26676369A9A17FF660AADEAF01A6D3C9FEF62BA7B65B", + "section_salt": "9AE61B57A56E074D46354A6C28A6600B" + }, + { + "adv_header_byte": "30", + "adv_salt": "141C71DBCD57779A9010CD756A76E381", + "aes_key": "7EC0F06C9555C817D80506D742CAE986", + "data_elements": [ + { + "contents": "A3DA78C3A46A6465AAC28A7180F4AF3CED356195F59C354442", + "de_type": 848 + }, + { + "contents": "6FB0", + "de_type": 612 + }, + { + "contents": "5E86B240E0DA2EDD9FF1EEE13D08BF747F", + "de_type": 593 + }, + { + "contents": "3D5E1FFA8D17363A09EA3419E74ACAF8E530BEBFD2E5383435BA96E5E93D", + "de_type": 602 + }, + { + "contents": "629C", + "de_type": 535 + } + ], + "encoded_section": "929013AED254BBC1126C996810D72CF962DE3F911000CC9DD44EEF9A16CCA9A5A353EB3F6C099004F512A3DF26EB3A448559BC668546BBC5E39939B408595D81DB2C9BCB22BF44105D4FC74069E211F76B1B5947632BAC38E032303C1E0BC15115DE5BFE6C5C64BBF75D7527DF0C1FDC42186D3B4E8A0B11F444E74E8455A8F32A792603FF5D06BDFBF4095FC8C3F19F2DC148", + "identity_type": "provisioned", + "iv": "1F3348A80250E67C0439DB33713640D3", + "key_seed": "B8F2BB87A76D6B19C9666E5AF7DD06F0965DAC56CD5E18D500660D621B6806C0", + "metadata_key": "791697B259A389A16454F472C26B07B9", + "section_mic_hmac_key": "5F025042B03F8AF6FEFB3F0ED5D572D80D15189DC8ECCD27CF4EEF05F4A57F00", + "section_salt": "CC9DD44EEF9A16CCA9A5A353EB3F6C09" + }, + { + "adv_header_byte": "30", + "adv_salt": "0DC36EABCD58AD31FD3414A5A79D856D", + "aes_key": "B7FCF0EFA53B3230297545213C0524B5", + "data_elements": [ + { + "contents": "64BE90FC09B580EE", + "de_type": 299 + }, + { + "contents": "D9CE2C829CD03EA10E4EBE3ED32CF9F03848E2ECE7CAC2B5F062FAE306", + "de_type": 637 + } + ], + "encoded_section": "629013586179ED9F640B114F3A74EAAFDA169E9110004F5F28DE93C71BD513CEAF1317690AC59002FD14A70AF3805F6DDA65F7309408708224077D83A630F4A6A28ED8F14F1E32072981D91CCC3AF19A091791B44927EA10A30EE18F261D3A902A5608", + "identity_type": "trusted", + "iv": "B841EB2BAAE284E872A3A2423601F00F", + "key_seed": "131324FEF7EAB54FCBA0F40F92167DD7334863AB7DFFA93D1B2E05FDBF7F30B2", + "metadata_key": "C39F84EF9D0EB94DDC0F35B032CFE945", + "section_mic_hmac_key": "3FBB040970723C36D6DAEBCC475E95F100D5CA410C938B7C7552FAC69DDB7E13", + "section_salt": "4F5F28DE93C71BD513CEAF1317690AC5" + }, + { + "adv_header_byte": "30", + "adv_salt": "2F7A899B44F390B8C32AC3FFBA8536CA", + "aes_key": "C757CD4202E253D64F6ADD70D6802F76", + "data_elements": [ + { + "contents": "E13B9414F8E4DC48F9E41F1ECEDE", + "de_type": 873 + } + ], + "encoded_section": "489013F3E95BAC1CAFF7A986116C838955CA039110001F2D1152B9AC95ECDAD02511DC5ECC8790046AAC45B087398FC2276B1D1015032072B5AA69854873AF49A2F9D24711D6759A4F", + "identity_type": "provisioned", + "iv": "C697367BA74524CAB1168BFBF2922854", + "key_seed": "2730B32C6DCBEE3DAA66CBDAE3BF9E42890B4E0B46C57D0700D58081814CA0D5", + "metadata_key": "24AE50DE045D1238B2E0AF3EDE2E5C9F", + "section_mic_hmac_key": "052A829770EC3DE369B2A4504D75DAAF28577A7F4638B0356EC924B23C91C5E7", + "section_salt": "1F2D1152B9AC95ECDAD02511DC5ECC87" + }, + { + "adv_header_byte": "30", + "adv_salt": "A229253DEE5642D1A341465C48F81501", + "aes_key": "954B9BC25FA0947752A02707A1D72848", + "data_elements": [ + { + "contents": "8F35A5BBDC9C1C", + "de_type": 193 + }, + { + "contents": "8894D592508CD3611F906F8AC44F706B1517F0B5980E268B99A0", + "de_type": 124 + }, + { + "contents": "", + "de_type": 795 + }, + { + "contents": "55DA51", + "de_type": 902 + } + ], + "encoded_section": "669013C3BC7FE06F86785FEC6BB8D3EC2DF618911000DB52438878F9EADE488682807B3F9A009004BD9E07EDF91224F3EB734D17F3999A99C8262B2C91BBA94505C3DD67852AA19C7A748D56165A5399846D368009F6BA3131ED227A75A7D0BEDEC8FCB729FF26", + "identity_type": "provisioned", + "iv": "1C797DF15F0945FD31FB2CDE94CE2F44", + "key_seed": "B965BEC0EFAB1BF93ACBEC55D5FEDD7A9E4E35D68ED782E805445792B8FC8630", + "metadata_key": "0A51D7C3CBB8920ECE2C18C16103FF5A", + "section_mic_hmac_key": "1B403F3B1542CCC670E677988496CAC0EC233748D4D488BE8C64D6DAD9E97DA5", + "section_salt": "DB52438878F9EADE488682807B3F9A00" + }, + { + "adv_header_byte": "30", + "adv_salt": "0214D0382281CA031DCC305A1170C4A4", + "aes_key": "3AAF3FAF8B3ADE10CBECDAD2C0F9D9DD", + "data_elements": [], + "encoded_section": "3790137A79252A76378480754C9935BEEAC40E911000E697F979481D94C83D143D416EF15B0B90023C2D0EA174FE7B0F748EB3A897F86CBA", + "identity_type": "trusted", + "iv": "08AB0C2EF3B3DCEEFE63E345EDE819B8", + "key_seed": "236811C3C81857B831C028B6828F2E28AB948405B391377895BCC1011A82D87B", + "metadata_key": "8F3FB1BBD7CC2596188C022C816BEEEF", + "section_mic_hmac_key": "AAB0A17B5A667805AC94E43D775FFEBCF4832CF67F7839D8B60FC6C739C2A9AE", + "section_salt": "E697F979481D94C83D143D416EF15B0B" + }, + { + "adv_header_byte": "30", + "adv_salt": "F6579933CDF9D9BDA0ACE32E7EF5718D", + "aes_key": "C939D6AA33F9BB4FE73AFABA9DB89CC7", + "data_elements": [ + { + "contents": "51C2163162B4A1ED861DE57103CFB2C8CB4DEC24B75710563AF3C0", + "de_type": 969 + }, + { + "contents": "BC465AB618F9A89C2D6DCCE131DC68B3CFD45ABFE9B3A898F5B21EC3", + "de_type": 386 + }, + { + "contents": "99", + "de_type": 51 + } + ], + "encoded_section": "77901388ED01CF901FB3C6740072CAE51AF8BE9110003A898F8BE6FC92035BAEC946D5CA2141900175BE48A38808002A983A169C804D96B80CDDE4849FA6CFF66B6955B8F60194B29566F29DC113B5A7DAC4EDEB369BE2B93C9CC3D605AE3FFE7CA863B9F9089B4477A1E591DAEC0F1FBBB2ABB65445E71B", + "identity_type": "private", + "iv": "D07741F4556EDB80F156377E05D86AC7", + "key_seed": "6EF6407596F397D8752C31399ECFD94165EEFAB886385098A7D2E62A0D322D65", + "metadata_key": "7005FC4F95DD57D7CBBA8286480EC221", + "section_mic_hmac_key": "D68F4EEA77F4A3A812BED734FBC151E6B564984E5BA51BE94F018B0F0E0A40A4", + "section_salt": "3A898F8BE6FC92035BAEC946D5CA2141" + }, + { + "adv_header_byte": "30", + "adv_salt": "93A2A5408CB92C828DC2706D184B93B5", + "aes_key": "483CE8FA0C97190150C89044D0A3B562", + "data_elements": [ + { + "contents": "B74426C4B81CD14DDC66B5D81F5048F35645CC49D784BF1901DB", + "de_type": 540 + }, + { + "contents": "ECFD9C9D59E8B557A961482F3CD9CAE1EC82445E", + "de_type": 684 + }, + { + "contents": "16CE37BBB3AB", + "de_type": 907 + } + ], + "encoded_section": "749013EB2EC9939D0B5AD346C488C81AB2B7A59110003FB7A780A3D390141179A24BA5E348749004D79AE3EAA467DCDB6924035AA6B730BA38A3BA0DBAB8FADCAEBC40EE87FB03DAAE8D04D7F09A98C5DD245BF1993145D63CE6F39A2F2A954850DB8CA9B9927F3B8B7A0FB3D7F2FDF967C4A77C1E", + "identity_type": "provisioned", + "iv": "1B2672F3752153E4719D4D50F75B32EF", + "key_seed": "809959218AEE024135CF2F9D03A1BCAE95334C91241679F27D0E4BD6AE2D7A9A", + "metadata_key": "AB90DAB8B389AAB3B96925579A583559", + "section_mic_hmac_key": "F324525CD2C3407588B22B71BF7B879ECAF343FFA9860876D584BFF14594E621", + "section_salt": "3FB7A780A3D390141179A24BA5E34874" + }, + { + "adv_header_byte": "30", + "adv_salt": "4CF830D5D5BD08C26F4BE1EA5B97A4C0", + "aes_key": "F66E71F797BEEBFB0150F2C7F4C4ACD7", + "data_elements": [ + { + "contents": "F16C3CEE603F93", + "de_type": 538 + }, + { + "contents": "F65E08453918E6910CAFBF87155D9B7D8E020B816BE6F064A76C2FFA3BEA", + "de_type": 728 + } + ], + "encoded_section": "6290139D6BDADE8B80272A9C4DFA705CC8CD38911000FE1EC77402715D1928D59BC1A69DA35D9001E45533C131CE90457E1433650E9993DF71D74E3B90D98B1B2B7AFBECB6EBFB479C58E7AEC3EE3F689AFAA7515CDA6C06546883365168066BAD9371", + "identity_type": "private", + "iv": "7C7BE58937B2383F8EA9C91B1D8ACD8E", + "key_seed": "1E368F539AADA86EB50185328B05D9D859ACCB951D70AE6BCEFCDED587598484", + "metadata_key": "9BF76E47E18DEC4135F95D65CCC5AD5D", + "section_mic_hmac_key": "1A7880A4B012784166BB7BE7AD91425AEB6E10DA105FDE534824B10FB1F01B3F", + "section_salt": "FE1EC77402715D1928D59BC1A69DA35D" + }, + { + "adv_header_byte": "30", + "adv_salt": "42BCF8C051CF5BC8D61B1C61865A3D0E", + "aes_key": "7A7B9705EA9E3E6BD24E89A8B5EC5629", + "data_elements": [], + "encoded_section": "3790131EEB4FFCF3E322EC21209253D804E5F2911000EA5BCAD5F2FF77DB2C44939BEB5D1DF590045CC1115031BBEF4F64F4D7200CD7EFED", + "identity_type": "provisioned", + "iv": "48345860EA2F626260C6BB20B166B245", + "key_seed": "C61CA661BE7F95C09DEDD5E5B3AD5EEB7C83D5023B95CE53F5AC471FD7A88817", + "metadata_key": "2D8F7FD76DBFD36FC69923CB084C2ACC", + "section_mic_hmac_key": "DAD99FBEBCD2787C70637F3163FE6D98B3F12DBC5D3D68ABCFD48D7AC7FDF563", + "section_salt": "EA5BCAD5F2FF77DB2C44939BEB5D1DF5" + }, + { + "adv_header_byte": "30", + "adv_salt": "A8C7424675FA2E7091A36C6E61AFDA42", + "aes_key": "6B31245D4D06FA075F0FE3B368DE594F", + "data_elements": [ + { + "contents": "7527234E872383C3816F", + "de_type": 48 + }, + { + "contents": "31CDE714BFDB05AEACB81C2ACE", + "de_type": 272 + }, + { + "contents": "AD37A2754F3B9B", + "de_type": 772 + }, + { + "contents": "1DDCF4", + "de_type": 461 + } + ], + "encoded_section": "6390136E1F6E5E79E07AAABFC71A1ADDC6855E911000B729ACD6ACEE902D62B36C16CA11B8F69001B5E54164389AD739445D291F8BB668F7D5F486336BE306D2E7537088CB34FF31793C482E1AA770D33E0EBCA3FA909F635EE801E8804D85EAB562B0A4", + "identity_type": "private", + "iv": "667E4FF1F49AB32EC02271C50F00BBCB", + "key_seed": "11E0919824E99AFA212ED1EE264C0CEE2079394A139A2A4E4E0480390224AA2C", + "metadata_key": "AE5E4C5CBF11AB13A15F2ABB45C3AA28", + "section_mic_hmac_key": "900B1BA0E694FDBC069672601E3FB6A7E1ABF57DCA900F43D366A2D433BE694B", + "section_salt": "B729ACD6ACEE902D62B36C16CA11B8F6" + }, + { + "adv_header_byte": "30", + "adv_salt": "9561280F565350C87CFC48E0E922D70A", + "aes_key": "0FBDD950CB6A77E49DE3DA873E05BB4D", + "data_elements": [ + { + "contents": "57EB419A6FDA6E141E64C96DA56184", + "de_type": 157 + }, + { + "contents": "B7F29895592845FD1F68F04F50E21FFAC6E0745B495D4D33", + "de_type": 725 + }, + { + "contents": "96CFCA71DD4AE920DB33", + "de_type": 63 + }, + { + "contents": "9A186713837F3023FDA2ADFCA7ADBA5F", + "de_type": 802 + }, + { + "contents": "8295CE8455A32E12E72A1A3EE445F3A7ABB33F552E28E8AF3B49", + "de_type": 650 + } + ], + "encoded_section": "A0901301554DEAA33ECF529285855175B4075F911000F1B7A762DD991286560F50C190AEE84C900410A344196A44F2872D97E4A52C86D4705A0154AA77B0B6A8CBC8BE5707D232C64F3A58123494FD117DCA5F66289BAA6C1342A3C0139362180E4BC01D739BD9AA658244621615B70C03A47B547C3AD84D84AFFA59633EDC39CF23B84A40AEFAAA1F4EF584BC9F8C62E177641EAF8D2D3B5B72E70F5610EDDD66", + "identity_type": "provisioned", + "iv": "233ABC3B5240F3277A8A3D9B77736EB8", + "key_seed": "B3903A0B6F65A51C04C61F33DEAF2E4E2F8D9593C0418A08B5DEAE1B4B5083CD", + "metadata_key": "C20215BF9D23940621D1243DAF4EC38F", + "section_mic_hmac_key": "2189BED3EEB1C7F254F0148D32B6977850DC2393C6D569DC58F32AF838DA075B", + "section_salt": "F1B7A762DD991286560F50C190AEE84C" + }, + { + "adv_header_byte": "30", + "adv_salt": "EBC1A6EFA2ED8CDA77BAF544E4D904A4", + "aes_key": "65E3A98AF7B85AC0781A211CC6FC72E5", + "data_elements": [ + { + "contents": "3945EAF5EF2E084E1F", + "de_type": 46 + }, + { + "contents": "12E6F96050FACED899537AE8A6", + "de_type": 997 + } + ], + "encoded_section": "529013BAD0AC44AFA4063EB49BA6CF34A8C03F911000774CFDF9430D5C16D57FEDCC76C727E29004BCB33E582FD7A3C616E6701A38DF24A61E13FC2680162A038B6419348DC7639F9DDA362DDF9A6545387A1A", + "identity_type": "provisioned", + "iv": "AAE212B6EAA3AA96187816E6FA3B50B2", + "key_seed": "310998B2C7F6D69281748342083D74ED44885D73C8873E97C0A00C866332A49D", + "metadata_key": "8897F642A09797D2D710391CE3F9A679", + "section_mic_hmac_key": "74D664F756163C18681A9CBE553DEF5E0B17C040E3E3B265CBD3DBB3A931FA18", + "section_salt": "774CFDF9430D5C16D57FEDCC76C727E2" + }, + { + "adv_header_byte": "30", + "adv_salt": "540624C3D336F7667597EEA1FD0CC48B", + "aes_key": "CA3CC08E1C4FB3974D9DE0A9FAD09077", + "data_elements": [ + { + "contents": "5467F818B3EEB029B82D47A14A4E6451DD58EAA0030EF12E14", + "de_type": 565 + } + ], + "encoded_section": "53901331A52875544D7A7D299A2D6BD3EB0D86911000EDC8ABEC4C7FE7D3A91094D9727CA4D690019C8DA9BEA8B990C4BC1F6F464675F74AD38BFB28C419904C514A9A1E22BFA28285D757D66DF54C47B115E01F", + "identity_type": "private", + "iv": "60998CDF9DD4FC9271DDC24FD00BF4E5", + "key_seed": "563B6F117F7191C693688B2C98794AA4B1219C581D2932A7636338E4CA8D995B", + "metadata_key": "E6ACE435015C0967BEEBC7525C84A68B", + "section_mic_hmac_key": "568C17091F1FA841D94361047719BAF85ADDF57B13C190BF3D2801A5B229CB5A", + "section_salt": "EDC8ABEC4C7FE7D3A91094D9727CA4D6" + }, + { + "adv_header_byte": "30", + "adv_salt": "1BC71DB7C830793A62D4A1D64A194DC3", + "aes_key": "F00505EF81341DD41628D319A51CB9AE", + "data_elements": [ + { + "contents": "72FC3313D216E421D5283686FA", + "de_type": 166 + }, + { + "contents": "835C0734", + "de_type": 332 + }, + { + "contents": "", + "de_type": 236 + }, + { + "contents": "6076F43AF0A453CB8D740CF39EC6", + "de_type": 789 + }, + { + "contents": "195A1FBE7A2D24A4C51D6796BCFEF82C298B3EE3F8B6B96FA53CF83D", + "de_type": 102 + } + ], + "encoded_section": "809013BBFC5FEA8BAD0095718AD322503E917E91100061E7C6ED035A4567FFE6C83A52560A759001DA6B1C2FE7F73DAC214C4074DAD30A2099CFC96A89754C6643189C43AD82BC5999F79228BE9B2812A94F38A569194DB4AD2F0867CFE968BA6B993F8AC07E026C21B57D8AA2B4CC0CE6CF0C940191842F5D4F7E1FE9EC9194B3", + "identity_type": "private", + "iv": "C49795F17B8BA9676DBB69DEE5608FA6", + "key_seed": "9E55B64D97D55AD785A2D5CFF54FC31D8C2A10423F03AA4F41CA007BF5774179", + "metadata_key": "96332ABC07154AAD77CB7C037C364D8F", + "section_mic_hmac_key": "32C65336074D2DA5CB55280E59DBE181987F1631936DFE783CAB584B52276517", + "section_salt": "61E7C6ED035A4567FFE6C83A52560A75" + }, + { + "adv_header_byte": "30", + "adv_salt": "173A13ABE2FF18D2F7109239F401FB21", + "aes_key": "333CD8634CB7451F95519C052CBDF152", + "data_elements": [], + "encoded_section": "379013096CBC2B8A796E245980C1862ACC387091100082E5BA46988B576F8618B5B352BB5AC990028EC4EB4825905EECE11DD62509238E2C", + "identity_type": "trusted", + "iv": "54E19448030FCEFB036FA3A918EECD42", + "key_seed": "F677983EE2A9987F61F7DA6B886866362469221DC726518FDDA105CEC41563BA", + "metadata_key": "D468CD1134E0BE76ABC05A5526F18EE5", + "section_mic_hmac_key": "42A1576B2B917F654B6230579B98D0BA1B999EBAE10F99EA920878A3C15DD211", + "section_salt": "82E5BA46988B576F8618B5B352BB5AC9" + }, + { + "adv_header_byte": "30", + "adv_salt": "0600099A02ECCCDA983A853EA87B40CE", + "aes_key": "F8361A483C7259A77A4B9F7BCC18CF4E", + "data_elements": [ + { + "contents": "0B1D4CD6D6D51CAC90BC02A63137AA3DC785E9ACDC08297B54AB0456", + "de_type": 152 + }, + { + "contents": "EA8FCBA28B2CA1FFAC4B2C880398B79C7D6CD79AD24EAB3A9F0C01", + "de_type": 789 + }, + { + "contents": "2B18E586B9BF45BACE62A8B8EDA7", + "de_type": 913 + } + ], + "encoded_section": "85901302F968F6E1833E28F19F63391E02600E91100006F9E19728E0AAF75BE4634A1F8D7C679001DD5679B2068AF5DC2837E39A3B7140DED6261AAA8A19A8FD604F9B3C50805488C86DF7FA5C7A42443B73C78696A212057B7A6B2E3CFE277B29A3A5A5CC6C441F78C4E2644F4DBB5A6214820B3D184477CDB3F54442D0045C5C81953FB6C3", + "identity_type": "private", + "iv": "4ED9F6DDCCA5759F3290615269114852", + "key_seed": "A82F0B67DA493625BE38FAD39EA6116A78505439EB85294438EC967E0BB92974", + "metadata_key": "7EBAC6AB7C2E3EFE20C185415935BA36", + "section_mic_hmac_key": "93689F1002288DC64C2CA81A3ABCE1CF4CBA0AA1F2F1DABC39277D57E9C9199C", + "section_salt": "06F9E19728E0AAF75BE4634A1F8D7C67" + }, + { + "adv_header_byte": "30", + "adv_salt": "FEE965C5BD73B49EFD8B3D0AD98D823A", + "aes_key": "F3085A213CC43098896781968F34CF93", + "data_elements": [ + { + "contents": "C9E41D4978E8", + "de_type": 328 + }, + { + "contents": "7A984B285B2F5D5DFC1CBA0B0C23CBF62C", + "de_type": 950 + }, + { + "contents": "D5BD48E7EA000500FB4D", + "de_type": 325 + } + ], + "encoded_section": "619013B68441665A2CD396B8174905412BAF759110006EB5F5B21043BE04D6972AFBB86D172490014D74B48E16FD27458628305F62BB5EEDBFF77533E1C8263FAD5376C7D167245435D48B7D1EBB91E89A39D7D5061EAA1150E40B73D7542B2C5109", + "identity_type": "private", + "iv": "B4A43F5693F7467CB19116D40367BD3C", + "key_seed": "12FEE160551F2297D799E1571A8046AE738C4916ADF58AB6E8BC5283B9DF5A9A", + "metadata_key": "C42AE1BD877C17986AA1A9F062866318", + "section_mic_hmac_key": "208087A638859B6A21F491E525C97D8AF2C1C19945DC8C84227DD2330F89812F", + "section_salt": "6EB5F5B21043BE04D6972AFBB86D1724" + }, + { + "adv_header_byte": "30", + "adv_salt": "E6AF288C6E7479E495EB7FD64E6A311C", + "aes_key": "3BBB312D4C50E6220418CA88645FD3C3", + "data_elements": [], + "encoded_section": "3790135ADB592FC4E3261881C033CA13B722039110005CFCC4E76959DE69A46A26110CE5F5DF9004717A64A5F01E52B35C3229F3EAF20B46", + "identity_type": "provisioned", + "iv": "D93C814B4EB98D9D9A65D00AC707FEEB", + "key_seed": "67C74FD2F407B1F2168B9AF4072CAE89C5CE31E5CABE1AF1C318652C16234309", + "metadata_key": "C4AFF7489F452F80EFF17D0C1ECB7591", + "section_mic_hmac_key": "8F5EDB51B470611B53995F6D852A38302EA98584053DF49D5283CD62FA873885", + "section_salt": "5CFCC4E76959DE69A46A26110CE5F5DF" + }, + { + "adv_header_byte": "30", + "adv_salt": "49BFBD2B9DA62843694633F892D4AF90", + "aes_key": "DF226FD90BD7B42958EAE9B73D9F3107", + "data_elements": [ + { + "contents": "F0A7E8D6B009594814B97DFB5C3052AC0255ADE9B6AEED6BFB25A670A4F1", + "de_type": 525 + }, + { + "contents": "984EA937", + "de_type": 72 + }, + { + "contents": "537A4993C8A09B85C312", + "de_type": 6 + }, + { + "contents": "F2B65846498D58ED36F7", + "de_type": 56 + } + ], + "encoded_section": "76901353D6074DF5E26C64A67DCEA4B54F4FE591100089522D3D4E82B879A6E227EABB6F5BF490021152819FE7C31E3AD6BFF55EA31B88B904DAC0687D0ACB304C7120D4ECE40AA347B7CC2FAEA00536233297D2976D13BDB1349CE159477020DC0541FC247FAB7E675E6746872058906C27EE206830B1", + "identity_type": "trusted", + "iv": "363DE09F4423704E05DA5D1A603F88EF", + "key_seed": "F7E644C0B35E3639F0759DD3459A4E81A7B5B1467D9E27782C9D58473F7D2303", + "metadata_key": "20B6032091C7B497C9C715B44A680055", + "section_mic_hmac_key": "AC7F9AEAC350B2BC7835A6953CBF050FAD9B1C761CFF5BDB1E766AF51DC97E6C", + "section_salt": "89522D3D4E82B879A6E227EABB6F5BF4" + }, + { + "adv_header_byte": "30", + "adv_salt": "9AC61514FCC5ABD76F8B6A60FFF0CB23", + "aes_key": "65A5B1C977CE2B71E137FBB66464E4C6", + "data_elements": [ + { + "contents": "AC018897D3B2098C96B4B2D04B18356AFDBE76873E902686", + "de_type": 433 + }, + { + "contents": "E6268BD9E23FBD9F54E89A33A9B953387C0875D16FAE", + "de_type": 859 + }, + { + "contents": "CAA87F4364C08B57BBD4", + "de_type": 524 + }, + { + "contents": "14300A4595500DEB37", + "de_type": 734 + }, + { + "contents": "54C2A5437292", + "de_type": 606 + } + ], + "encoded_section": "8D9013578908536364B9F6141A96126731958C9110008FB91F1844A5A3601A18CA350436446F9002F172ECEAAFD2E24578444D8CA68C014E1BF6722524A2750B1A9E5F4CA3340EB3D4647E45E35F69C330C0918FE002C922F30018934D9CA78F81A41FE035CADF61D135281371ED2B022E532D29D9853BAAF17D7A66AE0EB5DFFF9E66799D98C36DA0EC17BF7971", + "identity_type": "trusted", + "iv": "E4F6D7F01E683F03820110FE9B9070C2", + "key_seed": "471763E7BB628F2107F6AF8F71DD0429FF9012C7BE7EC58C72F5C6CDE1C3C880", + "metadata_key": "949F830445560E2C7E0E156F2044EAAC", + "section_mic_hmac_key": "03D47D91A1AF8EC0141E699BAD459E2EE7F86F9B91A5386DB8D0D2218BA13E8B", + "section_salt": "8FB91F1844A5A3601A18CA350436446F" + }, + { + "adv_header_byte": "30", + "adv_salt": "B796C0B874B37A965A635AACB0305B1F", + "aes_key": "E000F49E7E5F8307D27A471E27875CE8", + "data_elements": [ + { + "contents": "211B11FE2C7B3F8A8907468866B92695234B9C06C56ACA1E7EF5118061", + "de_type": 336 + }, + { + "contents": "2CE435BB39131E9603EA734E8FEE299F26BF598EA5C2F0FFA518DB2C92E0", + "de_type": 228 + }, + { + "contents": "DAE3FC39546D53AD1A3A", + "de_type": 470 + }, + { + "contents": "9A2A563675DD8BFA71C9BE13C479DB4DE2544FB97004", + "de_type": 266 + } + ], + "encoded_section": "9E9013F0451460F5EC18035FDFCC9B233FDCA29110003DD4F4235AB965B797DEE44EF0A0360B9001BEC49A84632B991E0A5501A56ED3D9709C189FAEEF2445DC131AEC2343D7071A578293B76D3F849B80C372268123838CA9FC2B0E14A41992CF2AC92DAD1299FA67225BE71F479FFA312946AE18774AF353C3C14C346A04F24747E6582F7C528AA1E49E9E03370D053B2D95178AD336A42367AB578EA993", + "identity_type": "private", + "iv": "0778412CA588FD3D607A36B1BBA305FA", + "key_seed": "63212ABDE0EA4E8542FD2403A0091CF53460C2CBD7BBFE6A434D24D6B871BEEE", + "metadata_key": "F61E19A50DE9B1E486865A0498D4ED59", + "section_mic_hmac_key": "5E754AED53501C62B51B214B3E21E8C1A39D0B8F1EF47FADCEE9C7391A437F36", + "section_salt": "3DD4F4235AB965B797DEE44EF0A0360B" + }, + { + "adv_header_byte": "30", + "adv_salt": "08F6F482433E821BF057DA969070B210", + "aes_key": "E17992E3DDE2E17996BF2D26B284BF2B", + "data_elements": [ + { + "contents": "E01D05404D", + "de_type": 656 + }, + { + "contents": "DBB677B7AD69380E50712C", + "de_type": 651 + }, + { + "contents": "2983A0843D5DAB0CC087BD5572E983CE13C3F059", + "de_type": 515 + }, + { + "contents": "DB40E040A436133BE734C5855B", + "de_type": 515 + } + ], + "encoded_section": "7490131512D60F63CD579B350AE46C619240C59110006CB2D3074DA5611D18E7200EA58D4D2A90010804A23809C9E79F68830337C1561EF95B58C35AF60D256BF58BC367C7C3CC923AE044959E8766170ECF6E24971DB1FFEAC71D76C7592C53B40B5D594BEEB51423C72512C50124951928ED0B15", + "identity_type": "private", + "iv": "E51C069184919CB5C41DF3A1973A12EF", + "key_seed": "3AFF0BDBA428B3E7A75CACF64B960384ED52F6055B53DDC869411C00CE3DFB33", + "metadata_key": "C7FF94EFD6BA7F4D49753C9C51F24C32", + "section_mic_hmac_key": "23FFEB85772F286F363ED40589D9069BB0CFBAD80C0F4709F2D7EA4D53AFD56C", + "section_salt": "6CB2D3074DA5611D18E7200EA58D4D2A" + }, + { + "adv_header_byte": "30", + "adv_salt": "E01A36923644F0AD58157CDDEE3D6E57", + "aes_key": "28A7CB11218C9DD608B4C8A3BAE62AA5", + "data_elements": [ + { + "contents": "4713D017ECA392781333", + "de_type": 890 + }, + { + "contents": "FAE2DEA46755BE0C6E0BC28C8587", + "de_type": 406 + }, + { + "contents": "CCDFAEAF820F69BE029967700E8D4EFA20", + "de_type": 192 + } + ], + "encoded_section": "699013B733E709907E9B73EEECE403065285699110005A8F6B53799B2B96F01116C7EA43B24D9004C0CCEF4A0B0ECBE91A422DD0ED9680D23781E95311D3C78E5C154F71BC726E679AC9BB60314D4DE9B19994A6831286FA0A22B438098A7D10FDC1060F7354D0B4D6F3", + "identity_type": "provisioned", + "iv": "304D96C4F8C3E724140E327EB02BE4FA", + "key_seed": "4D76E8957C3244719D51B9433DF83AAB034452817E76DE43F5428B948592F061", + "metadata_key": "E158F1E40D3224565939655BC879DB05", + "section_mic_hmac_key": "1CBFDF042B635283167190A9E19DBA9D5EB04492AFDC9D4AECF9FD3DEA2FE78C", + "section_salt": "5A8F6B53799B2B96F01116C7EA43B24D" + }, + { + "adv_header_byte": "30", + "adv_salt": "093EA5DB990DD969FA4C4EAC9FD04300", + "aes_key": "C42479C9A8EF89FE3A3A83C323E39075", + "data_elements": [ + { + "contents": "C5CEE03E05232CEB2706FCC52D8582E15D6E0309E39BEB1049", + "de_type": 376 + } + ], + "encoded_section": "539013CAA95A7BBAE1DACC4C1493F1631714F39110007D6EAD457D2F7C96C246A361CE6D51F890029BFF6C5561F0D23FA684E8B3C5B67190B0E869847A48A703596DEE74C063E03C3796B437DF451F2E580E070D", + "identity_type": "trusted", + "iv": "3C508F99B78AB555A8FCCB86D451C384", + "key_seed": "9CC130089BC7A521C459F6951588707D1C39464D4FC5F83DE02A388DD9B9CFF6", + "metadata_key": "8E22B372F7843A39842E9C99A095222B", + "section_mic_hmac_key": "BB1185F021C79BA0B12496AB407BAC3B925D6C0D3E0FFB3D2489F110436C3725", + "section_salt": "7D6EAD457D2F7C96C246A361CE6D51F8" + }, + { + "adv_header_byte": "30", + "adv_salt": "0D3999FA6D616562631A00DFA536DA4B", + "aes_key": "106EDF096A5A90718645B2350FB47A8B", + "data_elements": [ + { + "contents": "", + "de_type": 913 + }, + { + "contents": "0439E4BC4E416859331F994B7A7967E242692162F0A90DC74A", + "de_type": 572 + }, + { + "contents": "3E46E2", + "de_type": 133 + }, + { + "contents": "C4D2B7F9B3404DAFC46AC58BC4F69525FC63290AB1C752B04B19349E", + "de_type": 248 + }, + { + "contents": "70D3E5634D", + "de_type": 544 + } + ], + "encoded_section": "8390132CCE2783ADBF25B7605743CC2B5D735491100048186B398DF4CAD231B9A47C00BD02E29004AB47CF0C18763A5271A3CB987B200905499C2BB25ED2F511D33457321E221A4996DE183BD314F1EFAE36BC4AFAC00E3FE61E822D6A0C90E4964E39F50E0584ACD334757BCB7B150E9569E2F9B9E66ED9F09E1DACDC4B9300D8FD0D7B", + "identity_type": "provisioned", + "iv": "727C01C9645EE10F343B1F653FA8A03C", + "key_seed": "4CDA79980B1DF514C24C2A80C54C97B1DD2ACE9146FFE02B8D02317D7DC7FD33", + "metadata_key": "A4BBF9DDA5775F84FFC6E7A700B85F40", + "section_mic_hmac_key": "09863C0F71491893C00F06B6A38F5605951379845B88997B4C2FD7AE03BEEE05", + "section_salt": "48186B398DF4CAD231B9A47C00BD02E2" + }, + { + "adv_header_byte": "30", + "adv_salt": "5F0DB8BAB212C01A15D1276C8111EB75", + "aes_key": "FD0804A8059A889D6462E272E40736DD", + "data_elements": [ + { + "contents": "3AE626A64BCE", + "de_type": 913 + }, + { + "contents": "081BA24B63DB458284FBD02292F412DF67C22EA5", + "de_type": 664 + }, + { + "contents": "4EDD5AE85FBAD3B50947", + "de_type": 414 + }, + { + "contents": "FE5636FE49CC9B62F3F6F7F3D234D1C2814CD2", + "de_type": 252 + } + ], + "encoded_section": "7A9013E2817D9D32C943EA7A07C69CB39C1F13911000CBCD80EA37EF7103BD971F1769362A6D9004B5D90F3F4B85363C35BFB1C5F2D33A6C32211C91023263539D31E4101561FA16843E7099B3ACE21CC285A818E5B121A53B8DC0C12AE39B07A1312A3E8DAB1854D32A11BF3AD661BD02FB69107D00509D5ABE30", + "identity_type": "provisioned", + "iv": "C85ED610C5284B60E85EE2EB65D824CA", + "key_seed": "50CC7E8BB70A560801376BE9507637A2E0DABB2C27C57ABBD4C6655996B310FC", + "metadata_key": "8AFB53C6D5AB8A8E040D6C43925ED79C", + "section_mic_hmac_key": "5EDBF3A1B90AC15F795203F2B7A62B8202C365C8DDD12125CA04492C666D5029", + "section_salt": "CBCD80EA37EF7103BD971F1769362A6D" + }, + { + "adv_header_byte": "30", + "adv_salt": "4ABE96318E942D913EFEF38CE35EACA8", + "aes_key": "00CF98EE0A1B419B7F940F74FF10EE6E", + "data_elements": [], + "encoded_section": "379013F61D7E6303A40196D23DFCD2FD4AF8B19110003BD8AA188D8F355F6611B84C94D418BA9004FFB8BBB535C1A7E1DBF8A12938BCE857", + "identity_type": "provisioned", + "iv": "7251E4AE74A6EB8322818F09A004A0BF", + "key_seed": "0D13BBE27EBFE4514ACD491F0E66FC7BB7A115D79B73296EA83036EA681EE1C3", + "metadata_key": "238B7E260087E6974BF1001BD92CE7FE", + "section_mic_hmac_key": "4D70D13E0DB450B18F9B90584E9089EF8D8B0B21C1F28017AC0D542EE0201DEE", + "section_salt": "3BD8AA188D8F355F6611B84C94D418BA" + }, + { + "adv_header_byte": "30", + "adv_salt": "72037D0250C97CC1C26E0E715934B7F4", + "aes_key": "C96ADC6223409E5BDEB7AF3262EFB102", + "data_elements": [], + "encoded_section": "3790132EF73EEECCE1F32344D242781918B3D6911000D508D8EE1CB7B5B4457C34EAA1408D619002BA08D2ED7C5853A1C7D3661639BFFF3C", + "identity_type": "trusted", + "iv": "372B94248EC23F30A455DF27F397EE0B", + "key_seed": "C1DE01E9F5C668EED6E11935D5306F7610CD174CB883353086456D5D9689C611", + "metadata_key": "FCC9F9A491F6763794895FC2E8F5DA13", + "section_mic_hmac_key": "C62A4103BDAB300378CC50CE8F28DAE28D78D3C1F07219B2E1DE73FDCF606332", + "section_salt": "D508D8EE1CB7B5B4457C34EAA1408D61" + }, + { + "adv_header_byte": "30", + "adv_salt": "4F0B46BD474614611D7A9D1BA9DE0C03", + "aes_key": "C5DDEC1F35F8B6974302D062297B6792", + "data_elements": [ + { + "contents": "E772DE467CD7896B78A062401310DF60A12164085D31EA7B", + "de_type": 783 + } + ], + "encoded_section": "529013276DFA6BA513BEBCAB169691B61FD79191100093F60AA548031530136472E90FA8B2989001B948AFF95F6998BA8C8D95BC5B75710DE26D6A391A649AE60DBF82DA9AF2F8B01CDEF8018F226FE575B342", + "identity_type": "private", + "iv": "68F95B82D9FD1727831B1A18ECBC0F07", + "key_seed": "16120AD8398950406E4A12D5133D3C8F71D961E051B0970CAA8F8FAEEC187F83", + "metadata_key": "035A86F026FE0A595C1955FB1ACE685B", + "section_mic_hmac_key": "842116F8CB1EE997C7FECC683959AB4CD8EE3EC9C61152DE56F2BD2446A8F5E4", + "section_salt": "93F60AA548031530136472E90FA8B298" + }, + { + "adv_header_byte": "30", + "adv_salt": "CD771B262EC5CA3A5C0D0FB4B4D0A9F1", + "aes_key": "073C363B4DFA35C507EBBE01F75D4ACD", + "data_elements": [ + { + "contents": "A510D052E5CDFE9B7F96A7076213D0D996D24E4D99", + "de_type": 220 + }, + { + "contents": "B0C476C075412AB26C51E6C0B8A01DB179F42A", + "de_type": 651 + }, + { + "contents": "A382A1DC37", + "de_type": 961 + }, + { + "contents": "BBA6CD7F93C8F950C7E3", + "de_type": 630 + }, + { + "contents": "EA45D2338F1A82639512EFD7A3DAF1716FD9279B32EED2", + "de_type": 448 + } + ], + "encoded_section": "9490137FDA79A6A4413EF091B89DF894715D0F911000207A4ACED9DD7DF5469BA445D82C4A509004574B862AF8A5F1ABE9B7160D138C98870F4424CA9370D51712D0396D87644A2EDA5077AD5174F0FA4FA9F10B9B9E303D5CCEF3A36BA46D97F655644F44B747ADC2EC2164AB66CCE1502BDFA2FF38CF44D9B059DA0CC220246444E388020982B1267420374E3CF50BCF15FEA821", + "identity_type": "provisioned", + "iv": "8CE19168A15D76869969155EC24DB3F2", + "key_seed": "2B685F1252FBFB847B415DA3AC973CCB495EE32463325C507A28319AF15FEFDE", + "metadata_key": "7D65245E7BE0CB380D42E4D080C4B30E", + "section_mic_hmac_key": "3B54D8A9281273639E19E939070E13E81625D2C1FD16186BA429D58CA37205F7", + "section_salt": "207A4ACED9DD7DF5469BA445D82C4A50" + }, + { + "adv_header_byte": "30", + "adv_salt": "55893FCB8F8DF622FD6A289A05C4148C", + "aes_key": "BF693BE1C25DBBEE6008755AE5E49920", + "data_elements": [ + { + "contents": "33FD1BA6021EBCA4E5C7495D8E91578CC469D1E17551FF", + "de_type": 155 + }, + { + "contents": "0C14A55F473712E28050FD40E3CEE43A070CE813FA4C8F5C6C77CBF0", + "de_type": 997 + } + ], + "encoded_section": "7090132ED1930BFB257B03FA14ADAE1B5C1D729110008C160E1D28A6D285D1DF356D50D4F79F9004769BA4CAE9955FDCF71B8BF9846D197E1959FFD62CAC6EC095FB709B140711B403EABDAFA3310E083886EBFA539F176EC7629D0A1B1EBC066CE5BE3244EB27542291E3E807F607F93B", + "identity_type": "provisioned", + "iv": "925B767E05ACDB3C182AF1B7052AD119", + "key_seed": "6043699A67E42BBFE23654CCA2ABCA973462107F14A3D255C6CE66FDED3BA8E6", + "metadata_key": "B182B23DF37C3FAB1127F1EC02EFC99F", + "section_mic_hmac_key": "47632D7EC5E8F44736F91AA12B9C6B57D099B9F23CBC3EF022C49F17DCD31BB0", + "section_salt": "8C160E1D28A6D285D1DF356D50D4F79F" + }, + { + "adv_header_byte": "30", + "adv_salt": "B9A1E1F915254078F13383BEDA83CE1B", + "aes_key": "B2A38645ED7EB5C3CE73102FF9D2CF97", + "data_elements": [ + { + "contents": "87818B3613A5D1AC040D", + "de_type": 304 + }, + { + "contents": "0CBF84397369C1", + "de_type": 98 + }, + { + "contents": "FE3972", + "de_type": 286 + }, + { + "contents": "4B", + "de_type": 269 + } + ], + "encoded_section": "57901317514DDE22C7FA254E649536313E839B911000511A20E6594D496C588FEBBB9AAD242190017E66D43A84690796346F8436D0D8E8DE6F146D44C4AA622E9D739903FE39010B1BB3D07923199CFE45AF3E75ABD549B6", + "identity_type": "private", + "iv": "8FC1F2CC1AA763E1A5AE5B1A46BE72D2", + "key_seed": "8952E7BC0784A56739DFDFED452B9AEA99AF09D12A28E38DC923AB85A02F7AB6", + "metadata_key": "D9AF7A2E6CD1AA70B9689C5FBCD4D7B1", + "section_mic_hmac_key": "8A6D496379762DAFBF4409AA7526B7970A137210934D1F1419AF9B05283535E8", + "section_salt": "511A20E6594D496C588FEBBB9AAD2421" + }, + { + "adv_header_byte": "30", + "adv_salt": "64B1CC633B622BA54618467268F0BCF5", + "aes_key": "57BC65DF5020C32CFF6B29055E11CC62", + "data_elements": [ + { + "contents": "", + "de_type": 492 + }, + { + "contents": "370234107E41CF0DB00FC2DB6F95D5FE6F2669B8", + "de_type": 979 + }, + { + "contents": "0E7AA3067932410963858A7A0C03095826A2C1CFF616DD0A30", + "de_type": 484 + }, + { + "contents": "EDE7BB01C66E6AC77A372C5E0E99402D55BD", + "de_type": 909 + } + ], + "encoded_section": "8290130FAB943DD3C3FFEBDF9EDBB19642A59E9110002FEE3F3C4DD0B38D2E90140654CF7555900497853980DAD64238E6974BB2DAE98D4DCFBCA0E2AFC6AD543A33EF8EE42F6DE0506A9B186A1FE02C409568362512C59DC04280B396E9FF8D4C4C2A3897412B290DB2076E1AA52580A11CB7463BE3FF3F0419A9D8E36079EE2CC38A", + "identity_type": "provisioned", + "iv": "8F5ABC9AA8000BE5F0185BBD0CB40B2E", + "key_seed": "FADBB185CBB88DE7D922282131A346D72869243A50911622E2EF1D5BD9F1015B", + "metadata_key": "5A7E3BABCFE50EF8B3CCBE8BB9741768", + "section_mic_hmac_key": "1D5E78BBAC91A6AA8738425112A23966439DCAE1D69161476501A605F4AFBC94", + "section_salt": "2FEE3F3C4DD0B38D2E90140654CF7555" + }, + { + "adv_header_byte": "30", + "adv_salt": "E5E46A2DA8C6DC22A69B3779CB44B1B6", + "aes_key": "D93ECA4F58BE626EE2B2584024D567ED", + "data_elements": [ + { + "contents": "57186FD96B3B2A1B5099984E316AF34AD8F827A941AB", + "de_type": 289 + }, + { + "contents": "4F8EE606B8EE6567D40A3591485AB09B", + "de_type": 761 + } + ], + "encoded_section": "639013F8605F4B7039EC7A0A92AE8839FEB15C91100073134AE922D5968E2AF8A54EEEE2E96E90019135A873371D039ED8BCF8D0E559F20B5A023516DB58A0FDA54F3B0AF0C3CB066277978EFBD3053F406ED380348DA8E0F365349D03349178A4CA5902", + "identity_type": "private", + "iv": "3ED5CCF399311A8CE0A94E9498F32454", + "key_seed": "C141FD581082AE08005BE0FE63B430D320CB1E6816E508CCE92D9E4487D97A88", + "metadata_key": "11EA53BA87F3632C176F7B6B7AFA42FC", + "section_mic_hmac_key": "3B60B3FCD92A91A83030C1F33B54242AD1A55699E6721016C8B3E9B95CBA7158", + "section_salt": "73134AE922D5968E2AF8A54EEEE2E96E" + }, + { + "adv_header_byte": "30", + "adv_salt": "1AC4700BBC34FFCF56FE27722FDDAF8C", + "aes_key": "06FEC5659E272340991B55911FC8CEB8", + "data_elements": [ + { + "contents": "8013EED9499B4FB30FE42FA2D25F73C62E30E0C13E4C1756629C87", + "de_type": 276 + }, + { + "contents": "D5F7EA0C7C5C2D3EFEAD2DA54C8854019E8508188CBAC37A1255", + "de_type": 254 + }, + { + "contents": "319793E7DCFBE4", + "de_type": 95 + } + ], + "encoded_section": "7B90139E98AEFF088AAF2045661ED346D04613911000822C36C3F54743E8CCBB518C3E8A392D9002AEA2EEE26E1B161066AD737160B1815C36AF220A2BA8D8286A710BBAA1851A390F83083CDD47F4485A0D27D1ECCE811C16B614DE6AAE0854FC3C3F1DF2C1918D810CA3C926BED1062B00942B19759C4825C14085", + "identity_type": "trusted", + "iv": "B0238742AD552F78DC3F34B588EB1DAB", + "key_seed": "EE1B60A84CAAAC77DD6FD1B0A5770D58F2D65EF0D7284B0077E6AE18EEDDC910", + "metadata_key": "384A5B50211EF272A2A5C2DD917D9E4A", + "section_mic_hmac_key": "EB2659D6BC3B0E72645864BE08C039AD8E9BA70B6D26C5C49939BE6D4D007D86", + "section_salt": "822C36C3F54743E8CCBB518C3E8A392D" + }, + { + "adv_header_byte": "30", + "adv_salt": "688AB25983A9C40466E16ADC513ABAE3", + "aes_key": "709696F50854B468C9BBE0D3DDA9E26E", + "data_elements": [], + "encoded_section": "3790130D25512946BAE13F6E96DC89DFF0BB789110000322EC17288B60620CD9539AA9CD6B99900209B744C0B195BEDFB06D3DED5103CF0D", + "identity_type": "trusted", + "iv": "5C3D8F194A93E04EB34E7E59B3767F2E", + "key_seed": "8033F31A3FB892D45877E3398B8DD3444CB2E251EBC6B0D50C9C218384BCB792", + "metadata_key": "E0DB32B9221DD82283C29EEC5F782E0F", + "section_mic_hmac_key": "DC156CF79131E25E00AAAEA3BCFCB044C4E1066F84D7E07CCCA5E846E2E44156", + "section_salt": "0322EC17288B60620CD9539AA9CD6B99" + }, + { + "adv_header_byte": "30", + "adv_salt": "ECCEBEA1B1C11B3D5888C3E163EABDE1", + "aes_key": "1CCECFEEDCA3385145ED977B3AE8AEA7", + "data_elements": [], + "encoded_section": "379013FFB104D3791419F3C3E265B1C0A0FC56911000804E5C3901A32B9C8EEF076790D48E329004BA0FE90EBFB6C81ECA3D0551E6CE469B", + "identity_type": "provisioned", + "iv": "95D7DAB8C760196851972252AAC93D75", + "key_seed": "FA8D1357B505B8CD83B94B9D11A1D1EC33A1964F2D95D4F6BEF9D958921D58F7", + "metadata_key": "4018D81F725B848799F4B2682A494819", + "section_mic_hmac_key": "AFB505B132A0B25DEE858DA00379D267045E19BA3739311A01569BFB24662A1A", + "section_salt": "804E5C3901A32B9C8EEF076790D48E32" + }, + { + "adv_header_byte": "30", + "adv_salt": "61CDB5B59D3DAF922471F816010577B5", + "aes_key": "05F8C6D879D6F0CD30C79C10892E5509", + "data_elements": [ + { + "contents": "0B36121960993A4FF30D3F84CD32B8CABF", + "de_type": 765 + }, + { + "contents": "4FC94B", + "de_type": 122 + }, + { + "contents": "0345E7", + "de_type": 331 + }, + { + "contents": "BD882C86", + "de_type": 64 + } + ], + "encoded_section": "5C901310D1179AE506FFBD55FB2F356E2F8B7B9110001437F875D102645621739E078680E1B390020CA5C46CEA1767F34848E4E702E94FC9607CAFF41AEE7253BA7976724E461327BF2CC028BA1709C0DF368CD08D8DA6B4BB9F48D0AC", + "identity_type": "trusted", + "iv": "97681895B3DBB45117F05275011522EA", + "key_seed": "8AC64ED6DE2150104B510FE6DD2A49C744CBC4733D5DEA36BEE78170375701FA", + "metadata_key": "D7A9DFF5ECB1F4F785F929BBB097CE42", + "section_mic_hmac_key": "D05EF6C19FBEC3DAC6AA35992FDDAF2D69DBF56CD43D6E406597F01CFA212C23", + "section_salt": "1437F875D102645621739E078680E1B3" + }, + { + "adv_header_byte": "30", + "adv_salt": "6B659D0B21836653EFDDD806AF70C39B", + "aes_key": "1399E5BD319D9D09DE5CDEB4C62E52C7", + "data_elements": [], + "encoded_section": "3790133A73A266945AB5E75E37AA0E4712B7F0911000AE4C670CDA23AF45ED828FAE7E41843F900281FE9EEE78132A0A54E5434BDBAE9062", + "identity_type": "trusted", + "iv": "F46E135C5AAE51FD7DAF53E6CCCB1113", + "key_seed": "36CCC67956A6F1364CAA0B7DDE0CE6CFCB53118C140A74A05A76B2A4C13369DD", + "metadata_key": "1A4D878971F8F57335B5A002C861F202", + "section_mic_hmac_key": "A0DD0937541A8ED002593C07BDA8351A9450073F748DB427FD57517FF1AFDA05", + "section_salt": "AE4C670CDA23AF45ED828FAE7E41843F" + }, + { + "adv_header_byte": "30", + "adv_salt": "FADB2D052C1C1C27CB44E1A944104714", + "aes_key": "6B0C0385579C8A4EA0D91C928907B6F2", + "data_elements": [ + { + "contents": "2F556D2609FB6A2053A998A91A", + "de_type": 577 + } + ], + "encoded_section": "479013AC0A1D0434D93670BA9C9E2CA4B5091D9110001CAF1A47003F980443B9E56B4980731D9004AB942B3607465541F191028EDEEC77069FF9D15D5F2DCE9FB8CB930F2BE41723", + "identity_type": "provisioned", + "iv": "70ADD8C102E04C438C17F623252033F5", + "key_seed": "5CA287810D59C030C8CC8E9AE4FA3B446FC363D0E09E229194FAD91781A7F196", + "metadata_key": "9716BAD8F56242A3925CED10C4583901", + "section_mic_hmac_key": "F82A3B7F6B516694C1AC37DE73BFA8E170C6C23B759C1BEA0616710350AE641D", + "section_salt": "1CAF1A47003F980443B9E56B4980731D" + }, + { + "adv_header_byte": "30", + "adv_salt": "6DB6728F2572B9138DF53B200CD8E30B", + "aes_key": "9986ED53BA3786C54562944C5633D59A", + "data_elements": [ + { + "contents": "A094756B831AC0F2309FE373E4952C5899ED54DFEFB5", + "de_type": 295 + }, + { + "contents": "A3AFF2F5E05A0DB339CD73AD20AF8E3F34E0D4E9D5", + "de_type": 457 + } + ], + "encoded_section": "68901398BF6715F57B6BE9A1449634DDFBD298911000D70B75C90790F143E006F97C963933769004FBC0E23ECF8951689315A48912CF86B7D85E7919A42C8AF123F862374840F2A94A89054731060F3336C723FFE54CE1366BED63741EFF3209FB1C8CC66A5F45EAAE", + "identity_type": "provisioned", + "iv": "6F05B19E3297E8DE48A6B8ED9597469E", + "key_seed": "21D64EA0D529E3C695348D2130CE0D970FF226D913AD85D544BD8BEA7BF7C3A0", + "metadata_key": "24F2B33454E620FEA4DC86EE10C90693", + "section_mic_hmac_key": "1EA011BF9B8063BDE3E95256E1A30994F9959AD3A80815E54801FE1A278AF1DD", + "section_salt": "D70B75C90790F143E006F97C96393376" + }, + { + "adv_header_byte": "30", + "adv_salt": "E7ACA2839BC4C6A7ECA4351B5B4F4D83", + "aes_key": "6E674BDEE405F4DE0EF583E2F7649A37", + "data_elements": [ + { + "contents": "08AC57735F3F1316", + "de_type": 580 + }, + { + "contents": "185169B0BD105E2CE86FA692CA800858C23770F6A16CD57851FC361DFA", + "de_type": 351 + }, + { + "contents": "20E1D14615FDCFB630EB3293D3", + "de_type": 692 + }, + { + "contents": "09290387F31B81C684B8D92C5B", + "de_type": 209 + } + ], + "encoded_section": "82901317F1B6491210D57AC3ABF4A33C2E4E43911000327D3D22CEE3A22CA4EEE65584907D619001BE43CD470A29DB32BFFACF5DBE8F63E501FA2FB82107C7D69B26348FF76A96644DB1E9A41592348404289395A150FDE6E76E7EF186E35EAF0E4572E07F1A4A093EDC149AB0C7022CBFCD84625A56EEFE9F3091E5263B23D051A28E", + "identity_type": "private", + "iv": "F2E05B8E1B5D670B361A240EA8CE4C17", + "key_seed": "5BCD7AF92667A3FE3B5C1F6F60372ECB5D1DF8E564E880FE523E3EA878C34ECB", + "metadata_key": "DF80721C303A49EFF2EA2AAC271F7CDE", + "section_mic_hmac_key": "2AEFC8097B0182AECE54F5CCA2FA741652BCDA820D0465CE573017E950CBD89F", + "section_salt": "327D3D22CEE3A22CA4EEE65584907D61" + }, + { + "adv_header_byte": "30", + "adv_salt": "99A12E831E51DDCEF24924B1975C0589", + "aes_key": "594BCE537928BBC2259C658BA8294F79", + "data_elements": [ + { + "contents": "6D1735B3D6221CEF5727CCD86EB799FE9EF05A", + "de_type": 6 + }, + { + "contents": "", + "de_type": 289 + }, + { + "contents": "10B7B4667BA4EF81315DB3D16127A4F0D9A63457", + "de_type": 99 + } + ], + "encoded_section": "659013FEDFB8B589D781F1EBA87BAF95B8FCB79110004EABCD4E5E6C9A575FC314EA1F9165AE9004C06AEB6AC5B16BD435D7E69748BA6977DBAAB9A6E1A7B0CDBF4975CF2DC4A48C154726F5214A4D3A78D750BD49C97C0493042074ADE2BE34E86EBE25C1ED", + "identity_type": "provisioned", + "iv": "C9339EF9AE4B3F518B1BD4313FA73C79", + "key_seed": "2456DB0645CFFB37C50F85C1A0E4B3B3D62592B305DA2409D29222993FBD8DD6", + "metadata_key": "6C65E9861EA62C009260583C667568F7", + "section_mic_hmac_key": "52400F51B5CF34C2FBD9281AFDB2964EE49ABFFF2AAC1AD9FFBF931DA7B2D362", + "section_salt": "4EABCD4E5E6C9A575FC314EA1F9165AE" + }, + { + "adv_header_byte": "30", + "adv_salt": "878AACD95530B43C7913E501C8C4ACEE", + "aes_key": "341A08C911C28E10C9938C1CB0DF998F", + "data_elements": [ + { + "contents": "79AD383E5AC871E91A471ACC", + "de_type": 343 + }, + { + "contents": "C77A72121DB14B812CF89D5D", + "de_type": 218 + } + ], + "encoded_section": "559013C3FA6A34319D21F0113A710161E774CB911000132290FAEFE4EB99C181B96B5076979990010E92F2BF8F3565A81C24082EB66420FD2D32F18669221F3EE9C5B23722845ECE0C11FC261180613DCE38D704EB91", + "identity_type": "private", + "iv": "92AEEEF801E75B6C451EBA001AFEF5FF", + "key_seed": "DB24DC46E2C2864BA42A405F8C19F782A9B4A8AFC8F69F7F7025A1CBE2BB968E", + "metadata_key": "18BF8290AB02AAD2100F28455E585FB3", + "section_mic_hmac_key": "7707AF050E3902074823EBF13FD3D36B64E2435BF116C00ACE0BB85A7CE59AE9", + "section_salt": "132290FAEFE4EB99C181B96B50769799" + }, + { + "adv_header_byte": "30", + "adv_salt": "DF0A3C777D4847C4EE6956A868840BC4", + "aes_key": "B09A907BD200E651C42C517BB92A38F2", + "data_elements": [ + { + "contents": "7C30A6D0913132E43E6303A90005DB", + "de_type": 346 + } + ], + "encoded_section": "4990136D86B8E26F22B175A2AEBDF6A520BF00911000C3CFBE28CE663F1BAACBAE369DCA6F7D9004B31F7A82993A384A7246B91E008B10DF5AE74B2E10809F089F3B0894C5B958D6ECA6", + "identity_type": "provisioned", + "iv": "00140D6DC0C9AE914E6EE880792BE76F", + "key_seed": "28C7233E1CABC3F5473F5B0F839133288FD4ACFB12C57CAFA92A6E56E9019822", + "metadata_key": "4A3A0B294F19898858F13AAFEFDDEE15", + "section_mic_hmac_key": "565E24A4C9C335FF6A36E420C84A2F4EA1E85610D246DAC5D0A0F2C8D40DCF98", + "section_salt": "C3CFBE28CE663F1BAACBAE369DCA6F7D" + }, + { + "adv_header_byte": "30", + "adv_salt": "48FB067349EA60A5548283F90D3FC74E", + "aes_key": "2D0054A2730B07075A868BA34305C0CA", + "data_elements": [ + { + "contents": "4FB6BDA26FA11EB8EDFE6C6A", + "de_type": 155 + }, + { + "contents": "7870B1EE4FBD", + "de_type": 79 + }, + { + "contents": "F398B6D9B6328776C81B4FBD", + "de_type": 914 + } + ], + "encoded_section": "5D90136AF14091CA00746306320474998A13DA9110003A9ABD9A4070DDAB398E95FB7F0E109A9004A8C4C17761B322D5EA37EF8E74F5497FD847156677DA00782677C144630049AFCB9CCBCC4C080548925A4926EBC9D13AD07F5E49962C", + "identity_type": "provisioned", + "iv": "8FF9284343646DA8172A83EFCCD1C15F", + "key_seed": "970E15EBA91441149A67E61DCE78BE67F995B606D2E76B02E9158E47E5142D72", + "metadata_key": "63862AAA507FF1AC7AB3E2F1B7597AFD", + "section_mic_hmac_key": "6BFEF95375643FFF9AAAA64B2FFB240E69A282B489FA6F23A0EAF8EE6C85747B", + "section_salt": "3A9ABD9A4070DDAB398E95FB7F0E109A" + }, + { + "adv_header_byte": "30", + "adv_salt": "833CB4935E9649B7AED0AF5AD62D9B6A", + "aes_key": "34867395BC36729AFA0E9651E17C16A9", + "data_elements": [], + "encoded_section": "3790131F3EAC01B28C1C974B040BCFEF38D838911000FE231478D02A9EC3AEAFB5EEAFD225459004252827D70ADAAC287267DD67A23ED9A6", + "identity_type": "provisioned", + "iv": "35902BD9F63C59083E5F15E541D6C89B", + "key_seed": "DE13251FC20C24143C5D1A3C1616030CBA3517EE9CB63416E169F86E5623C028", + "metadata_key": "A160EC6E23F3FA1C5155A3A8E982C28E", + "section_mic_hmac_key": "DA0632A39F94B40803FE3F706E0B7B5DBAED011230ACE7C4A00B90117B90F2F6", + "section_salt": "FE231478D02A9EC3AEAFB5EEAFD22545" + }, + { + "adv_header_byte": "30", + "adv_salt": "271CBA3E2DE6311E84785053F08F6A34", + "aes_key": "48CFF76E51AC2C0956D41E9AD2D6B013", + "data_elements": [ + { + "contents": "193684EB59862957D04183996B", + "de_type": 157 + }, + { + "contents": "3AB0E211CEE972C99EFE4022E1074C41663269", + "de_type": 56 + }, + { + "contents": "", + "de_type": 411 + } + ], + "encoded_section": "5F9013B3D962B848554F750E23CE1DC503E29491100091AE51980C7684B16CA8C6D9F720C04790012581715CE9199E34170E21325A55D058820D62926B2671BA7CC37F6F90CD346310ED13CDA9003482DCC640C6516B93809FA6FE07218C6328", + "identity_type": "private", + "iv": "680126038E0D0C959C6F92CADF2B4DB7", + "key_seed": "70B633AFC7B05E5B54E499BD8F4556AAF5DECCD7A86DE04C45B4C3001EB24F80", + "metadata_key": "F8DF70B871DE7BB917ECFB0704A62685", + "section_mic_hmac_key": "D183ACB6D00F733F06179CAEFBECE5F4E0E5D690BBEF15A69904C143E4AB610B", + "section_salt": "91AE51980C7684B16CA8C6D9F720C047" + }, + { + "adv_header_byte": "30", + "adv_salt": "52748CCA266DA944279BC16D0482E73C", + "aes_key": "44FF93170DA4A5EF9E35B21C2AC6E228", + "data_elements": [ + { + "contents": "C3C03A02A3035C52D2BD8DB044", + "de_type": 952 + }, + { + "contents": "A8B3082EAD2495", + "de_type": 459 + }, + { + "contents": "D8F8770CD2FD961BE8F25B9B289B624E0D5EB550C558947A", + "de_type": 200 + }, + { + "contents": "BEE10F2031F41820F1B544709A29ED49E54809B3", + "de_type": 831 + } + ], + "encoded_section": "839013100E58C7B0532D0ADFB41365B1A17827911000C755590B2F4894B1A5E48B0EBBF85A609004F74B503EF23735022525F4B920D6062FD791FB022FD24E687230D9864BEA2BB77119A3E96A5300B6A0703DC38A9F994E33ECDA1AFBDD0661930046C2F71D4CDECB25AE9D0FDBDA76D940119A557F4D1F552749690B30FDEB83F47108", + "identity_type": "provisioned", + "iv": "B386766CF3AECCE511F55D365BA53040", + "key_seed": "A4C01D2CEC164CD21C90FE0F05A6416F08A336DFFA5915EBBE3399F375E4E726", + "metadata_key": "A94A8413AF4BBB6A7F208BA3728CF664", + "section_mic_hmac_key": "A8AA56603BAF8162878DAF90AAAE3F2284AF34411328502FBF9BD05942239EBE", + "section_salt": "C755590B2F4894B1A5E48B0EBBF85A60" + }, + { + "adv_header_byte": "30", + "adv_salt": "5E4896E304E68E96A3B6EDD820E5F206", + "aes_key": "0573815A1D7E41DD84EFFE7BBB0A414B", + "data_elements": [ + { + "contents": "CD459496304C08D118AD", + "de_type": 758 + } + ], + "encoded_section": "449013FFD6666622A2DA34A2C275880506157F9110009874A69F2464B9DE4FF74F919CAC9D3890020A50F225CD2764D259A371F025387AECD2E84F2064417D98B96411449A", + "identity_type": "trusted", + "iv": "4F7C4F082F3718D52BA2A3222293DD19", + "key_seed": "4F2E1F3AD51A20DC3918600AD08D4D0BAF6B64E429F68D125AAF667BC17A725A", + "metadata_key": "CD1CB9AAD1597C77759AAD87938A9C36", + "section_mic_hmac_key": "DFCF245574F4751BB2A5DF4A84EE02D3E3D70ABD8FE987092B0F59ACCF2552AF", + "section_salt": "9874A69F2464B9DE4FF74F919CAC9D38" + }, + { + "adv_header_byte": "30", + "adv_salt": "F270C1808AE8861C06BE51C246839671", + "aes_key": "6711054A1EC414B5715B8AD33EC563BB", + "data_elements": [ + { + "contents": "BB1EE72B358621", + "de_type": 690 + }, + { + "contents": "6CE1D344EB4F1641AE8AC5F9E2EAACC01E7C8FDC3D81AD77B2CCA371", + "de_type": 983 + } + ], + "encoded_section": "609013E5F1F076FA559ED8A4CB17EC6D61EC6A911000EB93F9F5A15960A048CD6F8B8B6B58649001AD39CBA67C832FF3B377139EAD4E352D5BCF8E71974E4951DED2DB9918398D6AABF0DECCBE8E37224FE601F5CFFC705C5F227BCD511411796B", + "identity_type": "private", + "iv": "6723B26C84532019D6265FB1D9219387", + "key_seed": "5827EDF50C9C538E05C59270334EA25A707BAA6AECF563A6228C9A645DB95259", + "metadata_key": "E5034530CD6FE12AE1B8D9FA2BD772D4", + "section_mic_hmac_key": "D6EF9EE9456896020F182EE408581EF01B10CAF8A534693586E7F6A9A23A28BB", + "section_salt": "EB93F9F5A15960A048CD6F8B8B6B5864" + }, + { + "adv_header_byte": "30", + "adv_salt": "8389121A80436B19156632AC51695A13", + "aes_key": "6A5E04C19CC54841180722029D13F7C5", + "data_elements": [], + "encoded_section": "3790139684BDB26A1EB70A15B98EFB09D5111B911000FB98AABA968E22288FA299ACB4E405749002AAD65BA2AA0A63AB971C5722229B9C47", + "identity_type": "trusted", + "iv": "BEC2A53243D6F2707722FA034A317A68", + "key_seed": "1E700C710D7280FA6AC7439E403EDD5DE0257782DFD687BD323B57111DB15EEA", + "metadata_key": "8EF84C05AD7E87AA76F2D3F57FD231B5", + "section_mic_hmac_key": "AE770F2EBE85476AB97BAC70CAAF7F0B2D411DD01211E4F13855583E16EF211D", + "section_salt": "FB98AABA968E22288FA299ACB4E40574" + }, + { + "adv_header_byte": "30", + "adv_salt": "EAAEF0F0BD203FF07EE43BE082FFE487", + "aes_key": "5A8F6E1A06CF11AD9966D7DE70680E78", + "data_elements": [ + { + "contents": "8D985C3C5BD7", + "de_type": 335 + }, + { + "contents": "ED8D6C68F03FA51B2F79759A78E8", + "de_type": 158 + }, + { + "contents": "15010A88EF1368AF73", + "de_type": 634 + }, + { + "contents": "04BBDC82881BC0AE", + "de_type": 964 + }, + { + "contents": "8FD5", + "de_type": 526 + } + ], + "encoded_section": "6D90131F37122E6A01D9C8138CE142E9DE94FC9110006828E400EA55AC14C4AE3747AA7050FA900149BAB83CE2166727ABACAFBA637FAC4DE8F17FAB063D51BE286E68116796A8DECA3BFEBC98014CDEC2FB60D7E712C84057360216D6B9C222EBB6A6F1602D6AD41557BF75B28D", + "identity_type": "private", + "iv": "8A4C13A101DE46A8E1A4B39A7D458400", + "key_seed": "F4CA2D5D0F233F02D75BF99566E87F46887F3B57BC224D44B5C6CE2CA0B8F1F7", + "metadata_key": "673471840A043D3029819713668DFAE9", + "section_mic_hmac_key": "B1FB222C74B0ABDD529D06926D60C8685B5304B8FBE8491C38FB8A3DABAC9B2F", + "section_salt": "6828E400EA55AC14C4AE3747AA7050FA" + }, + { + "adv_header_byte": "30", + "adv_salt": "9BC7CFB71D191BECC444808364D813C4", + "aes_key": "51518AE5E163D9D8D5416A193537ED76", + "data_elements": [ + { + "contents": "4E18846D", + "de_type": 712 + }, + { + "contents": "4820CB3C92CAD5B8542AAE9A36", + "de_type": 832 + }, + { + "contents": "B5D2F1B6CD8A17DE1B03FC670CC9808FBCB4020B7BAE8FDCCD922961", + "de_type": 739 + } + ], + "encoded_section": "6D90137D76CF1A4074CDE63F8C6C0329155D58911000F27909C892E859590581882380B7F73B9002FA6E25428FF322E54F5CBF0BA057B844E3391F0F719F4ABD296FCF239D824E940EF2B31760698498E6579D200686A63E33C766C109BAE6C2C7171305EF8D7D05B56A4E628771", + "identity_type": "trusted", + "iv": "CFED21D898A59168C5FB57F3A86AB6FC", + "key_seed": "5189E43E665A66541461FCB1DD460196AE5F64EFB70F344E5B00E6533566AB35", + "metadata_key": "C3C0CFA6645E1AF45DDEF7B3D1F74751", + "section_mic_hmac_key": "7F4EFFC52343AB47D1EC9C234841BED7BA67A772CC238A9AC005847361718BEB", + "section_salt": "F27909C892E859590581882380B7F73B" + }, + { + "adv_header_byte": "30", + "adv_salt": "EFC325741A620CDF60ACE605C3356BE1", + "aes_key": "BB076A02A36F6D81B206B1C9C8236EE9", + "data_elements": [ + { + "contents": "EE2C53A7B84776BCBE", + "de_type": 322 + }, + { + "contents": "3D831323FF7DD1D925C629564D92C87D7ACC5FF526BB2A0B5FAC9132", + "de_type": 610 + }, + { + "contents": "B38D897E0829B179A5FD66CDE9D5B5B0D574E04008", + "de_type": 240 + } + ], + "encoded_section": "7A9013444AA5DE765AF1E12CF47CE2C37B6227911000249EB7CE39639EDB7AA5680B7445ACCD9004D0230E8B8D679112F9F650A8E4779C93FDF8F26AD5B381729C15F83A07808F094528BD326047036689E5DD4A92DE1B57DB883720D93E4CCA65058635AE9612A8E48DF6A8BD372262E06328D5FC5456FA168186", + "identity_type": "provisioned", + "iv": "BDC3752E0380EF0CCC465A207B36AC33", + "key_seed": "C855E8921027426AAFE3C38593C328834BC1DEB79007F68455F336A0AA2E6979", + "metadata_key": "249DAC8BD2E0A6D705BF4D5729A6B9E0", + "section_mic_hmac_key": "848CCE3F38671B20F910FB919492E1E80051AA4C9AE7FED49B71D4E60C8EDBD7", + "section_salt": "249EB7CE39639EDB7AA5680B7445ACCD" + }, + { + "adv_header_byte": "30", + "adv_salt": "6C45308E14C984650D43BCF505BC65F5", + "aes_key": "D1A76910387CF7AAB6CE4A0EF807FE49", + "data_elements": [ + { + "contents": "AEADF60EEF2311B4FE8111065D40435AB79809469B08FC5FEE", + "de_type": 674 + } + ], + "encoded_section": "53901393F3F5E4C94F10F460E9B79E4A8488F191100020F961FC32DAAFA88DBDD328319AEB7F90019FB4153E082B763922CEF5EFE91F357D2E83421DB3CD2AB47308C127A33A7079611224B3763E863656848939", + "identity_type": "private", + "iv": "C0E2E91FB0D154BF04CE881789D11166", + "key_seed": "7D4DAB11FB6FC7BE19BC0D9A56936874E83966C5F58686C9AB533FB3A6F3F2B3", + "metadata_key": "7682862834A4910F038FC5CDE1A7BB7A", + "section_mic_hmac_key": "244E6405668A612CC41EF88DB5D046256AD61698DB7E5D9CC632BDAEC18351C0", + "section_salt": "20F961FC32DAAFA88DBDD328319AEB7F" + }, + { + "adv_header_byte": "30", + "adv_salt": "49716F792B5B2446878F04B9B080DF27", + "aes_key": "3FF2428CC19EB164069991144389B867", + "data_elements": [ + { + "contents": "953F0048B02C14E8BA62C721240D68D90001B4DD0E897705", + "de_type": 401 + }, + { + "contents": "0775542388275325E3FA4DD2FFBBCFB429BA51CA4775F8A342B67030A3", + "de_type": 395 + }, + { + "contents": "E0246D98751CEEC87A2A86866D06EF", + "de_type": 165 + } + ], + "encoded_section": "84901324809B6938CB9ABF43A1A28BE74FF373911000C05F2D1681AE6F6689FF8989B0CFBAEF900160F98F0EDFCB8E41846F503B92280E0BE2FC3E1D261CD9A2204AFBC3276A639296B87C27C143969FD3FFE020918D8FB9CA5846E095566F27EF8F45442B3BD2ACB637C8360D82172A970BE0574ABABD5D34F0EF773D4FA68982B24F8A8D", + "identity_type": "private", + "iv": "CA0256A71F1F8248F4E5804C5C80C42B", + "key_seed": "32F7B3C74E59251702FAE6CA0DDBC4D4DCCE002F82F064A92093EF0E0DFD96CA", + "metadata_key": "5AAA3B579A426D773E975C442A0D24DD", + "section_mic_hmac_key": "B3F114BA4764A3CDA2A0DE54E53F0747324DB0DAC3EE19C338FD5898948E7121", + "section_salt": "C05F2D1681AE6F6689FF8989B0CFBAEF" + }, + { + "adv_header_byte": "30", + "adv_salt": "8F3ACF2B400ED33574CCB9AC82B7FF80", + "aes_key": "CCC54BB5C42A61F4F50820F1D64C601A", + "data_elements": [ + { + "contents": "C4878BE538", + "de_type": 696 + }, + { + "contents": "5081C9BA7B0F06", + "de_type": 10 + }, + { + "contents": "E009C8169E51A37B7544A8EC8A1E6085C345D3350D7ADF", + "de_type": 400 + } + ], + "encoded_section": "61901380D74E5F857F77C6324B0DEB8271F2F5911000535996FE591823883E8F94C9528142FB90029EFAF31276DE796DF3843E4C08FE5DA982EB047A4E932F1C689DB334E0DF51EC92622CFFE9AC50711E45207EA4493A88A6A2EA36741D6BE76801", + "identity_type": "trusted", + "iv": "6BA59F3930B610C64F9A97F9254130CA", + "key_seed": "A9F58DCCA97743D648C98BF39AEEC09D1042794054924AA10B601CDBAAFDA1F7", + "metadata_key": "E18C1EB3D52ADD20D13E6F5CD7253F36", + "section_mic_hmac_key": "B9336123B29683DCAF5421E6A934369E3D587749147C3D3A9C65DAA2FCA4FD5F", + "section_salt": "535996FE591823883E8F94C9528142FB" + }, + { + "adv_header_byte": "30", + "adv_salt": "D906139BD4F5F0D43588F1E463870ED7", + "aes_key": "659E7E26B7350532979241C71A794A47", + "data_elements": [], + "encoded_section": "3790133051C1E0D286C009937A41FBEF966F4A911000E9B18B58534EBE29990D03A38305EEED9001A3F393753D761A490BD4204C22B88D18", + "identity_type": "private", + "iv": "652B4283066AAFDED606DF9F74BD40A2", + "key_seed": "92F464D53AC339F4CCABEDEA6C123D36319ADD612EDBE6674D1CD8673AB4B591", + "metadata_key": "6AF8037879F253615782CD0A041EB12C", + "section_mic_hmac_key": "AA4229BA575F5800F32326FE1981C126F79755D1F6B07BA91670B3E2C4178B55", + "section_salt": "E9B18B58534EBE29990D03A38305EEED" + }, + { + "adv_header_byte": "30", + "adv_salt": "D1DDA0E7AA3E69AE2F3370D6E15F4062", + "aes_key": "600F6D5E91AF5302CE554A57A7EBCA42", + "data_elements": [ + { + "contents": "769BC18B3624C9C3F9538B96F668E73E7E53D36B16", + "de_type": 199 + } + ], + "encoded_section": "4F90139FEEE459BE5B388C727B8A576E4C93619110004892C57DF0FF7BAEABC88477F349C4A79004AE6E76B72576ABD71FD6EFCA914797AC69C80AAC2283EFFEE9DB9A784D7518FD45A71BE14AEFCFD9", + "identity_type": "provisioned", + "iv": "1E805BEA0FDA0095E961BE043176F24B", + "key_seed": "1B19E9B42F8262E9ECB505D43A949363ED484EAD3D8B802C19B826C40C293778", + "metadata_key": "E6BC1FF04AAC597D5116A868BF0107A2", + "section_mic_hmac_key": "3B15004ADC3A4F59DFFC423D292165746C76969A40F763043F5F009EB38E5B6F", + "section_salt": "4892C57DF0FF7BAEABC88477F349C4A7" + }, + { + "adv_header_byte": "30", + "adv_salt": "F02914E89D274DECC66DF2B3C188328A", + "aes_key": "8E89A5C199B8E077FF0C020C9E5FD1D8", + "data_elements": [ + { + "contents": "087FFF3F2F", + "de_type": 934 + }, + { + "contents": "447FF6BE8D5D86F7C59001FBFC19E00E", + "de_type": 163 + }, + { + "contents": "AD33", + "de_type": 695 + }, + { + "contents": "", + "de_type": 114 + } + ], + "encoded_section": "59901386E81CDE1667FBFDD7799D04920C706F911000279EE983242C291A41DA61962A3C6E229004E3973DC6CC11CB4B4853FE0A72D9DFA304E37D1D01517B31771AEE26680F9AB271BE747FB639A5F5BFDB4C701534F7C7E083", + "identity_type": "provisioned", + "iv": "B1B0129B8F410981FF08A1E07765FE25", + "key_seed": "37C6B00660E3E82EF5176F7164828F5501D19B08EE50FA8B5426BC87EFC6BEA7", + "metadata_key": "60C8892135BE25252CB238940AC460A4", + "section_mic_hmac_key": "8491D901EBD1B5E3C23828A7B8C830FE557F6D238CE41296A14A97C0A26BE21E", + "section_salt": "279EE983242C291A41DA61962A3C6E22" + }, + { + "adv_header_byte": "30", + "adv_salt": "4F655495958DA3AC2438FADC76CAA469", + "aes_key": "48017698AA818DF52A218956255D1184", + "data_elements": [ + { + "contents": "D21415A59D61C37A431C94CA3D1B12", + "de_type": 223 + } + ], + "encoded_section": "499013BD809616651CB4C0FA14C3FED9EEA8199110008F1695AE141F457D323BFE9FBDB4A646900164E3DB751CD22313B6EFC2BB28D064CE99C04F4377CFBB39666CE7F6B35822CEAF23", + "identity_type": "private", + "iv": "2279F7D60A8ACFC3400EAB7D479DB51A", + "key_seed": "971782B7DFE1FA2F6D6F2C76AC4C6CBCC2BF05AC1CFBD19882E484D07D90A467", + "metadata_key": "658C560090654FE1648E9939A51BA9A6", + "section_mic_hmac_key": "AB9431C41C87442A332416CCE3074BAC1C330F923AA07E57CEED68592C0208E4", + "section_salt": "8F1695AE141F457D323BFE9FBDB4A646" + }, + { + "adv_header_byte": "30", + "adv_salt": "ED33675F04F139BE2E7BE9417679089B", + "aes_key": "D169E3E3EF2ACCAE3CEEB84523649232", + "data_elements": [ + { + "contents": "138081B628B974A24C1CA904B706ECFC64ED8B256833B9F3", + "de_type": 487 + }, + { + "contents": "2BA4C7", + "de_type": 311 + } + ], + "encoded_section": "58901346E74CA333752A4F091A53F7BB6A1E6391100017C25D290070B12CA99F7B188DBA2C009004462896554342784C49B6A736DBB42FA93EA55CA27E9BECF238D8D76E39AFEF0EF3809225ACD1338A7C3802DEADBBC38303", + "identity_type": "provisioned", + "iv": "5CA7E4BB4CB64ACC75FE3D7ECA59B5F1", + "key_seed": "BC53A14CA7C5A41C1459A17DE84DA7EA69C9B4B3BF412CD1B7F735C86FD026FB", + "metadata_key": "6B2D533F3E784395DA8EA4D104A9A5A6", + "section_mic_hmac_key": "D6831E0EB880B6EBB5EC3B5A6178589CCD4CFE42C1D2C0982039674966809A1E", + "section_salt": "17C25D290070B12CA99F7B188DBA2C00" + }, + { + "adv_header_byte": "30", + "adv_salt": "EEE3952D89F58C16D86CF2A0D676264F", + "aes_key": "EE4D226F72FAD340CB5969026B5009F1", + "data_elements": [], + "encoded_section": "3790135CBA17D59F867DD8152D6A15D42C059E9110005F9D9CF54AF1C87EA73CF0539B878E559001DDF4CB6AD10039706AC555E84E731BB6", + "identity_type": "private", + "iv": "960DD7B569F6084D311B14EA5EABA4AF", + "key_seed": "CA471364CBACA719FD0FFBBB46AF040A9B77BADC1C5DD45671DAD16658908CCA", + "metadata_key": "BC7545E167CE62D60E04709FE54A0EFE", + "section_mic_hmac_key": "AD60A30FD4927631B4BE521BB0BF8EF4805993AE122CB68B749D39A6051D2156", + "section_salt": "5F9D9CF54AF1C87EA73CF0539B878E55" + }, + { + "adv_header_byte": "30", + "adv_salt": "DF5649D8C88520FA5B4C48C0D156FC6F", + "aes_key": "83B0F91866C953759BA6C220B17BBF79", + "data_elements": [ + { + "contents": "E712F3058923F793652BD04D42D44A38371F7A29027D4E6AF3F2", + "de_type": 184 + }, + { + "contents": "8EEEC3B2BCFAC213A2A95EA3EC5596DC8BB30D52B3D095CA", + "de_type": 546 + }, + { + "contents": "2C4B5138B3D520FD9D3799CEE77A57CE28", + "de_type": 125 + }, + { + "contents": "4F039D61E7908BC515E127542C4F69393593BF9015E8821E52FF", + "de_type": 550 + }, + { + "contents": "12159E47", + "de_type": 107 + } + ], + "encoded_section": "A59013C0DA8CF829FDFEC39AF1136EB83F1930911000F16D6B2A76966AE53ACF6792DFBC41C5900139D1D9C42A158ABA72D040B5B379308734C4AA5345EC3FBE04EBD2543A38E50551C82BADC8BC9A8150450F68E3DC4DDC1F7EDFC9A48BFA00985F334AC8B072423E38BEA3C91A1C7E59DDFF1D74948A17DF9FC3B25DD3E61B3882CFB3734646FEE24D60A03D329BCA50BF5E6EB8AC4C377DE637D0971CEE502419683DADBD", + "identity_type": "private", + "iv": "C56E5DC162716C9EF3CEAC49C0F115B8", + "key_seed": "CA4F0FCDE67D6A691236FE32B43802AAA785519E4108415A4B9384FAE6220F25", + "metadata_key": "5DCE8108DB324CDEAF9C4DA6C5652CE5", + "section_mic_hmac_key": "435152983E08E498549369CBB3845599399E0C3BAE7A6AEB530CF9BF74F94F43", + "section_salt": "F16D6B2A76966AE53ACF6792DFBC41C5" + }, + { + "adv_header_byte": "30", + "adv_salt": "F6C8A813A71E37E62E7B4A383DE9CE03", + "aes_key": "28F700FF1E657FA5B93060B77CF3F673", + "data_elements": [ + { + "contents": "7B25F39E00B7B165", + "de_type": 588 + }, + { + "contents": "4407E542845E25D8C5F651C54A6325DB08D31CD01C0A39CE68F6A63521", + "de_type": 397 + } + ], + "encoded_section": "62901319919D6F5709324CD2F3E6C38393AE8C9110001A35A3E9A1EF41933CE4934C5576B4AA90028C72D7952DBA1254D1A6F28B061A89EB461FBB771E1291C35270DBDB7F4F344E527F4F419D80D9D8F37ADDBCB0300061DCEE9DC4A49295C9CAEBC9", + "identity_type": "trusted", + "iv": "E9C4F94C776EA7100BF8FCF029EAC9A5", + "key_seed": "691BB699B3A533E919AC8F2592FBF465ADFA3232A7102CDAB4A2BFAF18D39216", + "metadata_key": "D19E7F2C3EDD021E38F7EB3668A30D21", + "section_mic_hmac_key": "9166DE19913527B22E2D285A5623FBE27843DEDA9BF75CA21AAC1D7A925BAE71", + "section_salt": "1A35A3E9A1EF41933CE4934C5576B4AA" + }, + { + "adv_header_byte": "30", + "adv_salt": "E03BD15C47BE63457ADA2CAA38F8C01D", + "aes_key": "E57DD2A12514B1A31EE3031299B69BAC", + "data_elements": [ + { + "contents": "E1DACD22961D862FE8B7A8DBF8DF3014ABDBB06525C3", + "de_type": 408 + }, + { + "contents": "00982ADF65DCAC4218EAF676347CA52607D55CA9334F", + "de_type": 600 + } + ], + "encoded_section": "699013EBFB56D27710D376E2F78AE5314B6EE99110002E9A05B98DC81FA726BBE0B25ED6616E9004943E813F9E1C01E8C8987A3C7C2A612A27C011AB3BD5134E60593FE73B0950C777D4FD02A1220ECA13213A10769B4456DB92139D8A06AE5A33CD1EB07D629BAD3581", + "identity_type": "provisioned", + "iv": "18A7EE60B7F063FC35EC9A051432A276", + "key_seed": "854812FA5DD5336B82417C854DE3C21D55EB81CC503D395D36160429743EFA17", + "metadata_key": "FBBA049407A1FB50BD32B42FD1FC5227", + "section_mic_hmac_key": "2B1B6926BC2FE1A4789F6FF28C1B1E208BBB7B9A831B7665FDF07FE5CC932974", + "section_salt": "2E9A05B98DC81FA726BBE0B25ED6616E" + }, + { + "adv_header_byte": "30", + "adv_salt": "C565D587CAB49EFA12AC6F0A2DD13227", + "aes_key": "432B9F04E0F4F71190D9CCB3DA261AE1", + "data_elements": [], + "encoded_section": "379013DEC89828681CFEB999004464A2DAEA7A911000533B00CF247DD1C3271AC6EBBA2DEFBD9004309005A18C6BB3D59BB078853CC5A98C", + "identity_type": "provisioned", + "iv": "46696325A36A170F95E6D3258A08B04F", + "key_seed": "15740DD5FCD0FF3547B15163C6041E1D8DD9DE508BDFF02042B0BA37F11C10B7", + "metadata_key": "C6D054B984ECCE9241E8F5C7F95A788B", + "section_mic_hmac_key": "52EFEE44663018C3D495F0726D8AFF9BF451607C491D8982E709AC57C9253A8C", + "section_salt": "533B00CF247DD1C3271AC6EBBA2DEFBD" + }, + { + "adv_header_byte": "30", + "adv_salt": "A2F7DFEEE2E3E735EF73F8E75D9CE4F6", + "aes_key": "14A2DC3915F43E95AE53A541DB6A20A5", + "data_elements": [ + { + "contents": "1F819F1441E9818AD0AAC4B083840D81AC", + "de_type": 743 + }, + { + "contents": "FF547347B5FC33DEE1BC21109492E5B254231ED5CEA88445ED5F7892A2", + "de_type": 822 + } + ], + "encoded_section": "6B9013659512ED18290B6C5F4DE46EAB3E54AA91100043B1749F94745222204B1E9AFF8C086890017EA654267AA0447CFE19880DEC1916CAA03546DAF407913D33465D78F90FE9C982F101EDB98C030024372AC65278A26D644A99BBC06860B81E8E46F97280A7A9496919AF", + "identity_type": "private", + "iv": "0B79362274A4ED6B0A2DDC9B3A3D0C4B", + "key_seed": "EE2EF449A38CE4C5AC6F70F3592DAF53E0EFFDC3FAD5A8D35914A301123C65C7", + "metadata_key": "18D9E6C0B7CC34DAA3FBF27255ED25CA", + "section_mic_hmac_key": "99F5025A9BEF0E77912BE3A814A87DB26C75A86092AE4DFC0409F2E7CE1A61BC", + "section_salt": "43B1749F94745222204B1E9AFF8C0868" + }, + { + "adv_header_byte": "30", + "adv_salt": "9250734FC0AC255D11341B94703240A6", + "aes_key": "14E0C14BFE51E3E2D9C17E46617A7254", + "data_elements": [ + { + "contents": "7AD8D89A3BAFE604CE90BA870FBAE5061E596406D3492A", + "de_type": 773 + } + ], + "encoded_section": "519013F3F99B6429EF43A25C3096E54A7A6AE191100097B2C056D43F50DBD56CE2F57636E93F9002025D4212219F661181F68D105E0567675318418C08858F7F9ADBFDC9EC2525CA987B754CA7B7E20541AE", + "identity_type": "trusted", + "iv": "CF58402F5FE4255D36AC71B32A7E53DD", + "key_seed": "0737014DACB915DA41FCDABFAE3A1612CEA784C26E728B92A515D17AC9880BBA", + "metadata_key": "488DFBB55E10A9C4115ABE9EA510E685", + "section_mic_hmac_key": "2A83F033AD0948FA29DD234D02124C1BF07BB0A914E008CD5A32A794FAFD594E", + "section_salt": "97B2C056D43F50DBD56CE2F57636E93F" + }, + { + "adv_header_byte": "30", + "adv_salt": "742306D9A50A5F57414C636DAD6758AE", + "aes_key": "843800EB6901EC65E32BCDD8C42DDBB0", + "data_elements": [], + "encoded_section": "379013A910AB5E2636F86BC67DE65AA6BF508691100046DD825A5E29527818B48BB6B12D52D1900141FC36E88D10ACBEF867C69D0F07DAE2", + "identity_type": "private", + "iv": "C622A5E21BB8C2A60B610C1523013FD9", + "key_seed": "6A455B03C96F4CE85832223DDB4B84AB1A2C98356B00F09F5855F5D1DF296400", + "metadata_key": "B7BBC5E06529761651EA6817D5434679", + "section_mic_hmac_key": "7BFCEE3D3465311604F1BFEF4746CF63D2433806F5720F4B8DC4876CD398E276", + "section_salt": "46DD825A5E29527818B48BB6B12D52D1" + }, + { + "adv_header_byte": "30", + "adv_salt": "970ABD5B5C3196B424CF4D3BB360A3A2", + "aes_key": "505ED35ABFD6327336834E0A3B8A1168", + "data_elements": [ + { + "contents": "3BAED92467687DDCCB55D80114188395B55B82", + "de_type": 249 + }, + { + "contents": "7D8988A293E7FD36AC2C6A9DF2", + "de_type": 103 + }, + { + "contents": "0186E7C12684315D411D523F67C43FFA8A1CD75A", + "de_type": 1000 + }, + { + "contents": "390049E7B31C2689FD0E6A78AB8165E724F1F70DE1A2C93C615B19", + "de_type": 234 + } + ], + "encoded_section": "9190136E43BD77DD71A1178B3A9D6E81F6218D9110006F5E89B4DD9C9E840C769C2D9CCE5889900294BF8F6B35C8A0A1ADEA4EAD45B4969D29EB245D277B98EA35316E32FD2CDCF61464007AF3EC71697AB7C81845C03493206C236D076D094471DC5E7DAA4D822EF947A2E6446B6630F8605DEF9C467CEABC0AEFDB73BC7ACE0EB4352B06881F71FC480F14E153FA4DBF52", + "identity_type": "trusted", + "iv": "4C9ED54A1DF5B2930A75F6117A853CC5", + "key_seed": "7F47276F24CE6BB646B1CEFEF060FBFE235AEC3DCDCCF4CC2385EA943EE690DA", + "metadata_key": "346F80C5C67A4EDAE1818D56393D3B82", + "section_mic_hmac_key": "AB43E9A5ED9D2DD9535153F4338CDBBE77046191ADF5940A2769B2F919A911E3", + "section_salt": "6F5E89B4DD9C9E840C769C2D9CCE5889" + }, + { + "adv_header_byte": "30", + "adv_salt": "228D8BFE431F88F73A132DD2E756DE94", + "aes_key": "AB278D4D71D4DFA69690315EAC610D6F", + "data_elements": [ + { + "contents": "170117845E", + "de_type": 913 + }, + { + "contents": "FCFAEB51A97F49110B14325B51364275", + "de_type": 100 + }, + { + "contents": "82", + "de_type": 510 + }, + { + "contents": "D62D60EFF7C12231328DE62E", + "de_type": 779 + } + ], + "encoded_section": "6490135A2E477C18D8A5D04E1138CDBBBD2BEF911000B39BE49E8FCC53C0C821C9BBBC0C024D90027F72C6072B8172256C2194121844B4EDB6C2154044FE30EF19BA68E2C1A7F7FBE0387F5764D69AAE52B0E2FC46B0A52CD08728E375B042B0F3E8CBDE3F", + "identity_type": "trusted", + "iv": "31A4BF684280A37A8030426577EB7B9C", + "key_seed": "912586C615BE6DD6F4F6ED12C85D9189B85E1D2FFA06AE1763BB32713ACA1F95", + "metadata_key": "C16D146B28A8C32B7DCB66EAB90C30EA", + "section_mic_hmac_key": "ADA2821A572B4B3ED9298257C200A5B73A39634117024404EC3011E7DA17D24D", + "section_salt": "B39BE49E8FCC53C0C821C9BBBC0C024D" + }, + { + "adv_header_byte": "30", + "adv_salt": "BA26ABDD5164F306449CFF633AFA7806", + "aes_key": "328428A223099585C9ABC9ACD7911FD8", + "data_elements": [ + { + "contents": "33222D5C84507A2B0130501E", + "de_type": 413 + }, + { + "contents": "1ED1B4E58C", + "de_type": 41 + }, + { + "contents": "E2079D383308B60A86988F3B36F491127E", + "de_type": 812 + }, + { + "contents": "D5DE2EFCEAD465719916DA22BF3FE9", + "de_type": 855 + }, + { + "contents": "84D04B14ACEC49162E4705C4DFBADC5EE6161B8D323A", + "de_type": 185 + } + ], + "encoded_section": "8C90131AFAB491598665D824C89C5398CC85B9911000633957E0C51915A10852DC7A8F09400890019069C7C9CFBEA948E3DB9A4DBD040F8E776D4F3721EACE87669A8CA6FF04E51B02D67207B82BC9E6E33D65B0F33DF6D878F0E06560FA8EB638C80117FD6DFAA2B902732BAE4E8CED79420FE93D9B57C724CBB06369FE960269B80BAA1FB8020BDB2D00D72C", + "identity_type": "private", + "iv": "E0B0D025435FF6F9FAAF4B42044DE4C9", + "key_seed": "E75FCCB24B1405672AE7A48F64DBDFF890783DDCC42B9928E74B591D387ADF86", + "metadata_key": "26B8D6CA92011D8C16EA62D6C62781E1", + "section_mic_hmac_key": "5665CD729F01A5933E5AEEB2B38EF153D71A19E3A7A603723E2AD564CEB83D99", + "section_salt": "633957E0C51915A10852DC7A8F094008" + }, + { + "adv_header_byte": "30", + "adv_salt": "DC49AEC367EA0121D5FB188143092866", + "aes_key": "B42D7A6A8D1776BADA8E21C226605833", + "data_elements": [ + { + "contents": "B3BE9AB518C82B73A3C0FB57D56C6F2A335F", + "de_type": 423 + }, + { + "contents": "4D96F55DA0342CE760A1832CB0A53B2A74CB529FF65EB532", + "de_type": 945 + }, + { + "contents": "20ACF6ACC51DAA65AEFDEBDA0D8697476D0E", + "de_type": 423 + }, + { + "contents": "2C3F7B88FE5F07C99978BCF68B3F5E7198724FEDDE", + "de_type": 465 + }, + { + "contents": "06BF37158C17DDD27C8F8DFB3EAD50096EFC8CC085D65AB195A7D0", + "de_type": 368 + } + ], + "encoded_section": "B29013658EAAAEDD464C9AE3EAD5F4D5EC48FB911000739370CE2574699DE19C1289E6F976A390040B3321DA88445526B10812DB7DCB8E5FA5C3FE2602991884CF5444623FE87FC4E63086F9039CFC7B871E08F88FEE69B1BAD6730C2C4C959FBD0AD2DE89020F46CDA552DB50C50939DD58C4D7AEAC8DE212D03F3D47A13990CDA58D276DBD6BA9A8F90A623CEEB931FFA530DF6DD7F57BC1CAD71D242778783C92F855D6E90D509976F8563C9B9370849CA7", + "identity_type": "provisioned", + "iv": "FF2AC24716EF0EEBFF2CF92A02049CD2", + "key_seed": "DD843B0B46AD2B8D137CF22A2517E961A79EB1AEB2882986DE825056D2FC52BD", + "metadata_key": "F64D69CD52EE04FF9E8324E751FAF1FB", + "section_mic_hmac_key": "78F4F673BB14B5F7F6C4563F4D9636355C91CCB01BC021C2FC1567446A944A52", + "section_salt": "739370CE2574699DE19C1289E6F976A3" + }, + { + "adv_header_byte": "30", + "adv_salt": "CF7D481AA8590423266AE9663FF6F7BF", + "aes_key": "E47403E811D992FF13BDD5156EF15C03", + "data_elements": [ + { + "contents": "CE99E4F9ACD8CBF8D99295AF", + "de_type": 110 + }, + { + "contents": "BDF065E66145184B54FE0C0CEED6CD6741404BDA57CFFB2B73102F542EBE", + "de_type": 369 + }, + { + "contents": "EAC4BC7CE2", + "de_type": 971 + } + ], + "encoded_section": "6E90131C80766FCE663175DF597C00BD95B39B9110001568D698479F825D5637D908F813F4DF900154739ED1447C96CEB428C6C2E98F9F6C544970AA9EBE7DB216197F20B6F4B3A573F461E2025808BDDED29278410B1AE18942699647D71252759992BFFBC9F5B7A923965972E820", + "identity_type": "private", + "iv": "11B6F13C8903EE0D12233F0FB5DA1C6D", + "key_seed": "BFDCC2ACAA9E80AE659F652CB2FBFDA4990B805A9D4AA898D350CCCBA3CC9CA8", + "metadata_key": "9AB08AE1CB6AF2A4745439770718B2CE", + "section_mic_hmac_key": "0580E1B433054DF31F38E72764FE5849FDC54D54416CD139F34D4D444402263D", + "section_salt": "1568D698479F825D5637D908F813F4DF" + }, + { + "adv_header_byte": "30", + "adv_salt": "85B1D40513E6CAE086C28552C12FB350", + "aes_key": "CC37B97B5B92FB9F9D6E00EDCA6AF45A", + "data_elements": [ + { + "contents": "14EA6D3FEAC9844D84E540D0AE1033C435F130AB1BEF75B7760E6AB9AD", + "de_type": 341 + }, + { + "contents": "", + "de_type": 550 + } + ], + "encoded_section": "5A901328BA159A1D698C86962BBE2358C362709110008D6FDFC90CA3D1A3AAA1C766B72B5EA490022F5AAFBD03AC4ED441B9EEFFEFFEA020A82B9EBFBD20648A4CE8BF57BF728D9FAD388AD1EEFBD957EF312CB9FDFB7ECF68AA06", + "identity_type": "trusted", + "iv": "25ADEFF36CE0A5B0A09953648F7EF334", + "key_seed": "0454B57060C890C86592212E9A3EC7926D43BA17D4CECE8BCFE7637484D83802", + "metadata_key": "21D66A2461F62F2D1C0B9F66D9739287", + "section_mic_hmac_key": "A61711DB75D7A424E6E806F1F43CFEAE962A7F6C499622A0793A170F4EB9CBBC", + "section_salt": "8D6FDFC90CA3D1A3AAA1C766B72B5EA4" + }, + { + "adv_header_byte": "30", + "adv_salt": "02D5D750D664E288EFE7A964A02A927D", + "aes_key": "A3A5A8A7E672AC04CC383C0F95DCE6A0", + "data_elements": [], + "encoded_section": "37901361A89D3B7C790776967C6501726806BE9110000EB05C6B0F96C24634A63A667709215D9001255CCF12AC41FEAC1EB155D864DCA570", + "identity_type": "private", + "iv": "27A2765AE71E5B83F0480E32BE173DFD", + "key_seed": "2EAFB7F93967A4C45F5DDFF41E13410591E3419E65A7DB92762697DE216FC967", + "metadata_key": "283DD374AA19C66FDB250A312166E6EA", + "section_mic_hmac_key": "D4BD0787505004AC108AC3DA06C1A450057D551AE7DA43BCEBE14C2D975A8E78", + "section_salt": "0EB05C6B0F96C24634A63A667709215D" + }, + { + "adv_header_byte": "30", + "adv_salt": "125D63CB7190B478236C3747A149366D", + "aes_key": "0BE97B73FF512505354DAB5D6B29FCBA", + "data_elements": [ + { + "contents": "14EF62BF82F80FB085A310A1435223ACDB920B97DDCED1", + "de_type": 871 + }, + { + "contents": "2CAF9EF90EAD8F6298060839624769DE", + "de_type": 964 + }, + { + "contents": "768E7C5B73E36F162BF105E085899DA027D9", + "de_type": 721 + }, + { + "contents": "A178D1480EB66B5551EC948ABD91F0C049D33B8D29360DB2EF", + "de_type": 198 + } + ], + "encoded_section": "959013997F971BF31BE7F59A55046ECDE81BCB9110001F657CA6FA909CCA6C1681FC6DD0928B90043DBF611BE7A90F0905DA13400AA1A1866644AC3671290548F39EEBC9B5BD3CC18AB804DA5C77D714181A605BE5C884A5EE6081FF4591D2AF96BDFAB2546D12602EB44A3FEBAAA3E4C66F444F55A6FBFAC75DDD71D57E6A719C739492CBA1C0E73711D2A105A3B3FB2AD3237E9ECC", + "identity_type": "provisioned", + "iv": "5404FADA1301DDEEE830D6119A3846BA", + "key_seed": "246A732C0A2F892B057A253141C26E21F7B0ECEBEF3AEA051118FC0E1BD8D36C", + "metadata_key": "4B47D6D3B10A385845DF425AA1C38431", + "section_mic_hmac_key": "CBE07A55700BC8C0BF94EB36BB907882CB50CB667FC240FBA6AC1830DC14F3FD", + "section_salt": "1F657CA6FA909CCA6C1681FC6DD0928B" + }, + { + "adv_header_byte": "30", + "adv_salt": "6C5994B3FDEFF488147D2225A5AD3289", + "aes_key": "EEEB9A1765F85001AAB7C718544D5853", + "data_elements": [ + { + "contents": "CF41A589C639780D91A23D762B7871", + "de_type": 400 + } + ], + "encoded_section": "499013089985A0087D6F5ACE5AB3B11DC8EE0D911000DD64F5C39C94FF038BFAA44A1B009C139002D5EB61BABCC1E0AF9080528B6261FD81C25644B912DBEA20EC659DDE6F0778CDDC85", + "identity_type": "trusted", + "iv": "43C6A352609BF3D07C23F7457F7BFBED", + "key_seed": "FE781376ED435B876E0E7FA261BE9A2E4D7362EBE61D5C015F6694019D4246BF", + "metadata_key": "670F87F10099A52B7714DC7B088A9AB7", + "section_mic_hmac_key": "94912114FD584C0BA0F6C1C462117D516F0619F216BDB8099BEF422FA50EA315", + "section_salt": "DD64F5C39C94FF038BFAA44A1B009C13" + }, + { + "adv_header_byte": "30", + "adv_salt": "86890C122BA74C502FAAA2B246EBFFB1", + "aes_key": "1A42B8762AA6E9320C32FDDC669DC405", + "data_elements": [], + "encoded_section": "37901367745F1F321A28509A1FD382E5576965911000D788AFA3591BF1E13252441A7D280B2B9001C13C4CD9EB22629AE6ACB4648000FA2F", + "identity_type": "private", + "iv": "8A763DF0DC6548AFBF6EC1526711F13C", + "key_seed": "660D035C9A48405AB89BF25E4F71494AC76286D993B2E8CA213BEBB6C00BB604", + "metadata_key": "A0E42B6646670B54D13D012B2AC9D610", + "section_mic_hmac_key": "3419FAD3032B38259FB4447FEAAC776F5E64DAF919AB24EAC7904709BF60BD61", + "section_salt": "D788AFA3591BF1E13252441A7D280B2B" + }, + { + "adv_header_byte": "30", + "adv_salt": "A507D673235683A679F00AFF69858E78", + "aes_key": "74F54D0AC51AF56BE4CC75ABD624AF34", + "data_elements": [ + { + "contents": "9E4AFE615138D74E", + "de_type": 758 + }, + { + "contents": "2E7BD8416782398BF01F53CD4611DC26DDD158965C2C6D55D3", + "de_type": 583 + } + ], + "encoded_section": "5E9013FE192C6106C46626A96469BBC51CF37B91100060EA0FE905728A9E01B9891E5731F91590010026C008E139C9EF930ADE42C20B09FB19D70EBDA109AC5CE58F35A7F05F329D2A7F8823281DCCE0C246DF43A752DF1B571ADE24671464", + "identity_type": "private", + "iv": "371E3734A83E864FE7434D06799565A8", + "key_seed": "5FADFF2AFE58072B5C59C59B5114C5FE544638917F0EAA8B73B2FFBCB93C5ABA", + "metadata_key": "138F084E2B8D250604A01F2AE51AE287", + "section_mic_hmac_key": "F10F17E2EF9E66F261398CAACC64F069301D59F4C674C583941F959716435E1C", + "section_salt": "60EA0FE905728A9E01B9891E5731F915" + }, + { + "adv_header_byte": "30", + "adv_salt": "BC4A32514B46C03C366AB566227DCABB", + "aes_key": "319D7CB155D521DC9F2017535BE3809F", + "data_elements": [ + { + "contents": "663DFF01222160CB8B4AF0", + "de_type": 611 + }, + { + "contents": "74A119294F8C71D64DEC46282D88B43F3B896420A0A2", + "de_type": 410 + }, + { + "contents": "89A9338136", + "de_type": 756 + }, + { + "contents": "671D", + "de_type": 830 + }, + { + "contents": "745FEA8DAADEA15F08", + "de_type": 294 + } + ], + "encoded_section": "779013FC8A3C4941128517FBF0C9DD73CDD5D1911000E70075B4DB3AE7073A33D45EB9A683D29004A2BF89757731C8381C0555234E298E9786845CD199883ED9444B434A4A0C9033DA1DB45E377719B2A7A9B5DBC9A999A43DFA606028DCB57E6FC55D6F1371AC9F0E45DCF3CF2477D87B39902B34758F7F", + "identity_type": "provisioned", + "iv": "C757A65A68F3EBD6A716AF192FF956EB", + "key_seed": "B19A2C4A8869522DA56A328B502C3C5B54C7E272A6E77861225624038C9D9B2E", + "metadata_key": "86AECBDC0B76BA224B501EC73B8E6BA9", + "section_mic_hmac_key": "421CC07318D2A08C383681AE93B61845FA8E952FFB670340E6860D2BC29B3979", + "section_salt": "E70075B4DB3AE7073A33D45EB9A683D2" + }, + { + "adv_header_byte": "30", + "adv_salt": "C54051A886B449242FE691EFBFB9B8CE", + "aes_key": "B913FEC648BB9E3D942E6A8683F07BAC", + "data_elements": [ + { + "contents": "1F6DE79DD0F5CEE21D5D485A", + "de_type": 980 + }, + { + "contents": "9B", + "de_type": 756 + }, + { + "contents": "560487517D8A50F671F4ADDD8827D2ADE2", + "de_type": 697 + } + ], + "encoded_section": "5E901348E76A5E52F4D62ECAE0CCE82DED2876911000BFA9F58BF2E56725C08161B4F81BB459900161AF730F1FC29BFA27F62252D430C72BEC351333D47129987FB00291F43B8343585C8B48863E042F6EC34D500743C95362EA6C97213BDE", + "identity_type": "private", + "iv": "F09F6C29C92034AB81F55EE06D133577", + "key_seed": "9EA688C752FFAEE37FCB91894708CA03FBCFD9AB3798F0D3B1E1578972861CEB", + "metadata_key": "00106D80565F791BDF1612CD3E290EFC", + "section_mic_hmac_key": "72B11A271AAD73820E785D6C56578AB0847DD744A8E6ABD72790BDDA339F1223", + "section_salt": "BFA9F58BF2E56725C08161B4F81BB459" + }, + { + "adv_header_byte": "30", + "adv_salt": "1E40D6365164CA659D4B50F39E3F85A6", + "aes_key": "9B3859BC7836621D944C23864F6F3550", + "data_elements": [ + { + "contents": "8E3058E4062EAAC88D165AA151D44DF6AF58D634245F10FD71FE3F613275", + "de_type": 90 + }, + { + "contents": "B2FEBB35A264B7537903B8", + "de_type": 712 + }, + { + "contents": "29A0D1104C283E273DD5A3895D0A3D4FB996D96F4C482487E02F09C0", + "de_type": 712 + }, + { + "contents": "25BA53B6E20672A6C53F19FC35388A45EEE09CFD", + "de_type": 819 + } + ], + "encoded_section": "9B90130505D9ECE86F5E3EDC6FC0229F02EC68911000964CF0FBD200823DA6AE76EDC4F2C1449001298E94F4601B7165AA782D1DA74A9E274AF98F92CEFC7AAF15075BBDF016D2FA06F09167A305BADA6B4FA6B2B17AA2A3F73B85C67DBCFA1F565C07C85281C3182C301FC3B810EDD4FF195EBF4D50C1ECCF51705ACB38966B2D61E496425E6B33D2017A5692589D573F1226C182862F31C1B06BF4", + "identity_type": "private", + "iv": "64FE3459449A905E996A5730ADAC500B", + "key_seed": "791CBF19EAE82635964320BF77F90CDC6A40B25A714A47E2E696A03FE466C75F", + "metadata_key": "35402883705B38294EB2D93FF46112E3", + "section_mic_hmac_key": "EF49867605FEC8C35D229722B9DD3AEBEB0B434C4F4925AA3D34F706EFD87D21", + "section_salt": "964CF0FBD200823DA6AE76EDC4F2C144" + }, + { + "adv_header_byte": "30", + "adv_salt": "B8071EC0685F84D18F37D305200EE4FA", + "aes_key": "964869E0D50271B6944FE957380DBF8C", + "data_elements": [ + { + "contents": "24945148BCB09A73", + "de_type": 483 + }, + { + "contents": "79DD087059250E029F", + "de_type": 440 + }, + { + "contents": "9D82CC", + "de_type": 812 + }, + { + "contents": "775F99E59CCE70FCA9D050DD11", + "de_type": 305 + } + ], + "encoded_section": "6490130CE57E93E2E8A432D77023CB6590E0B6911000F746162C91A850D8DCE3BD3A9090C0429002AFE864CCB7884BB9D8AF1C927C847FF0DFF33898E5AC6DDBA9A741956A4B488D5BB52C343B6FF4D9BB888D1D4366E357CDC20BCCBE05392091D18F8961", + "identity_type": "trusted", + "iv": "1CE7729EB320E531F4C3C60EE4C59AA8", + "key_seed": "0D0FF621E557488CE9920E1DE78CEAC7B0D9666B21443FDC57EBB108FC1DDA86", + "metadata_key": "9E53DDBB1F1FDF5E5899E62210663BE9", + "section_mic_hmac_key": "E656B56AA9B2A4A91571D7C6F593AC20AFE90E83E0C13EFA883E20488E37B487", + "section_salt": "F746162C91A850D8DCE3BD3A9090C042" + }, + { + "adv_header_byte": "30", + "adv_salt": "9C13345061898B01207C68614DDA532B", + "aes_key": "AA5B840D4BFDC99B8AF79B584CE12E84", + "data_elements": [ + { + "contents": "A1F81F14E46B", + "de_type": 390 + }, + { + "contents": "A42D01AA6C08", + "de_type": 160 + }, + { + "contents": "9AE6B3E298", + "de_type": 937 + } + ], + "encoded_section": "51901310EAEAFA6AC17122CDCA2573D355D0CD911000CCF8CC3D63587712B4E731FD35EAA3669004B915C781CC1ED7331474C7BC423AFEAD113D1B25C0E94E69E3EB59894678D87BEEBE96355C09DDD32C4E", + "identity_type": "provisioned", + "iv": "95A37DC09AB387CE11030FEB6B1C9DFA", + "key_seed": "B570342527343884EF1CB5BAE4228CC72A19C439402FC11E449A4CBCF50F7E3B", + "metadata_key": "46EC49AFA765AE05F70C74DCA5715DBC", + "section_mic_hmac_key": "0388A70B3DB58C158BEB9A21198BD81FDA14300D6FD4527C80B33E7929C21021", + "section_salt": "CCF8CC3D63587712B4E731FD35EAA366" + }, + { + "adv_header_byte": "30", + "adv_salt": "DCF9E3CE0572EA0DF42D4A555A23592E", + "aes_key": "ECB0F2C8BC9E75FA10F8EA4B4D8629D5", + "data_elements": [ + { + "contents": "8920EC9E22CEE0DD1C8ED84CD007DABD37160FC8AF0AE95923", + "de_type": 728 + } + ], + "encoded_section": "53901313FB99AE0E6BABC8B4849186D87DB4A89110002EBCF33E80A1C8FEF0FEA18D38F4B6FF90028EFBD0ACAE3981D4191B91BD4A7931FBB7AB9587A17D735034B8B94B2E0B5E4B99E1074CA04F4D136AE760D6", + "identity_type": "trusted", + "iv": "4EA1AB449CE1ECCF1D975F94E111F508", + "key_seed": "8817390FE2DDA73E10454028375DF6167C737A41591E2F8BAF9E6EFE8185669B", + "metadata_key": "EA92B90A39ED2CEC3D5D61B74B07A356", + "section_mic_hmac_key": "ECE846A0D0C013B82CFB53C18F7D044FCD7E53B027F2B562CD43EA2AA881C343", + "section_salt": "2EBCF33E80A1C8FEF0FEA18D38F4B6FF" + }, + { + "adv_header_byte": "30", + "adv_salt": "295C4F693C6ED0E9B8E92727C5F4A7B4", + "aes_key": "A45CD64E2DC93AB7FC688850CD3B3FB5", + "data_elements": [ + { + "contents": "65CF460752C1B9676A2049D19BDA1CD3F2", + "de_type": 43 + }, + { + "contents": "7BDB1C4245F476F0E1CFB5F1491C5C0318416011AA69", + "de_type": 45 + }, + { + "contents": "22756DE6303A1311BABFA22E170E9D1F", + "de_type": 762 + }, + { + "contents": "6F23", + "de_type": 329 + }, + { + "contents": "480AEB8EE08170C1D5FE904B5BE9DA2AD094376598DE0F70548B705A25", + "de_type": 828 + } + ], + "encoded_section": "9A9013BC95851D486FAA4EF13F6D7A5AD6E6CE911000749C9EEA6B4A6792229D9E531152124890015B7124853389DBD3B5CC2524AD1C434B2C10214716D89D585E8FA0F55E1CA11B4BC8C262D1BAED2019E61C815CAB00036B15424E1DEA61A93DEE90FE4663F3EC04B1010BB7A178F47B6BDB61847DD9B9A88D35CE2D9A247968F93549D09CF01A98F33B87F038EF995137DADC3D9E2C908D61E7", + "identity_type": "private", + "iv": "CCA81A30F3887FAC55CC619C978C0B45", + "key_seed": "BC9DF6FAE9C35B873DE0FE4AD8CF11245105B7AC518D80498A5205BFB35074E9", + "metadata_key": "32A45452147E1B0A64313C39EFA855AD", + "section_mic_hmac_key": "B25364C8CBF115BF9A46287B759768B611CACEC692152D0DBE125FDBB3A8829F", + "section_salt": "749C9EEA6B4A6792229D9E5311521248" + }, + { + "adv_header_byte": "30", + "adv_salt": "12571F71243CD373229D0C7BB8D30710", + "aes_key": "49B6E023B58BB34C272F807D5DA0A938", + "data_elements": [], + "encoded_section": "379013715C03AC7E1419D8D44694F5A4CB6266911000D55A403C5DEAB9883326E5B111C522049002CED99F5612149B9FDB72B03FADF057D9", + "identity_type": "trusted", + "iv": "B0B763E4D08FC218A318A378EBF75E8C", + "key_seed": "16003DE1916A0820BE43D32BFA1629E67FA83CA01723D4FDFD95746BC16BC7A2", + "metadata_key": "A3605E523D0C4E8CA3787B141CABDF32", + "section_mic_hmac_key": "13E544ABD5FD671F496322D77A4446C3B77ACB007F746A4B948129500045FAA7", + "section_salt": "D55A403C5DEAB9883326E5B111C52204" + }, + { + "adv_header_byte": "30", + "adv_salt": "7856ACD18EF6930C9EE065073F685E8A", + "aes_key": "F6A6945E6C274AF90CF773F8D4FC6FF0", + "data_elements": [ + { + "contents": "DBDF1692FB5E018F0C49A7", + "de_type": 908 + }, + { + "contents": "028A7815CFF85F0AC6D5", + "de_type": 291 + } + ], + "encoded_section": "529013CA6D31C6A12CAE2D2636712A77C22F51911000884B1C54E519FC35F64802BFE939E6929004B056A9831532176B1AB6F17B7577C994EAE50667C44842ACB793918F39962150F1EB4AA0E520277691063A", + "identity_type": "provisioned", + "iv": "6F79E25D027B6E4186761C47E6E1EE0A", + "key_seed": "A891081463E0C9FE931B23F137879FF4B344F2BCB31D5FAEA2A8BFDDF5F13781", + "metadata_key": "07210356E3A7C4AF1B88209799127A55", + "section_mic_hmac_key": "9DCD53D49928551A914A807FFB85660F307480AF464ED3691142DA591D79C951", + "section_salt": "884B1C54E519FC35F64802BFE939E692" + }, + { + "adv_header_byte": "30", + "adv_salt": "2A45B0515F2A249BF7B1387CB70901AE", + "aes_key": "021CF92CE743805B8DF93B88E6AEF0D0", + "data_elements": [ + { + "contents": "08D11FED65701B3A3F5402894F1165", + "de_type": 677 + }, + { + "contents": "F49808BB6625467F86", + "de_type": 810 + }, + { + "contents": "CC13627179B6B8AD3F84", + "de_type": 889 + }, + { + "contents": "2C2EBC4E0F92D24D03A867AD8B07300E1F81BFEF9AE4C2B3F980", + "de_type": 950 + }, + { + "contents": "E55E101A8EF67E80A3AE5F8A0D1A5C1F37B627870B9D586FACB5A718EAE7", + "de_type": 760 + } + ], + "encoded_section": "A090132E71DE6700AA3E0C1C842F31A135B2D5911000562D7ED3A3EA4D2620E92FA7DD128BDD9004035EE5E4CC870B7B1B812CF79D4719E2676E5E2AF7CED20BB42F45CD7F9B8ADC660E976D664DB7B10D049EDBEE2B60E69700410951E62CEBEB4EE089730CF9B259A2B651223902FF17B6FF7C025109F7AF444DB9C2DF564E676B720C0B99C0A9B84DE4D6FF084AEB943B95728F94BB1C65E44CE6C5A97A8847", + "identity_type": "provisioned", + "iv": "6AE6067877803C9B82D5B30A6792FFC7", + "key_seed": "1FF1D25A12210940D973C467FD115BB4B7C906C3FB38D21F16BE63744E016B5A", + "metadata_key": "CFF931305B876F2DBF5BA261EE9E8D17", + "section_mic_hmac_key": "467241B19A991B7AE839D5AA1DA92038F7389ECB55796C6C6B5B181070E23EC8", + "section_salt": "562D7ED3A3EA4D2620E92FA7DD128BDD" + }, + { + "adv_header_byte": "30", + "adv_salt": "485599A65B35D21A40658A9E2766B597", + "aes_key": "8663ED345FECBB713029DC829D74543B", + "data_elements": [ + { + "contents": "E9", + "de_type": 810 + }, + { + "contents": "6E6E09DB0F2355AC2B3C", + "de_type": 404 + } + ], + "encoded_section": "4890138E055A46A940DFF96DF637A5EFD7B93C911000E0A1D051D8D533CF3E77E10A5F8B6C0E9004E4E7C9C6EC8AFC814102DF0DBCEB09A00938F75F24DE48ACA96EB524B708D6D545", + "identity_type": "provisioned", + "iv": "8561B433E308C0D1CA6C9C91BCF0FF81", + "key_seed": "F3F4C98BCEED47C4E562B406D4BD793926B20945745F48D0EB78D5F31F9F2BCD", + "metadata_key": "308BB628E7DECE141A7C5309ADBD6A62", + "section_mic_hmac_key": "0CB4466330332C9FCD21DF8388B1A82C1384D041924657423091BF61A5199BF4", + "section_salt": "E0A1D051D8D533CF3E77E10A5F8B6C0E" + }, + { + "adv_header_byte": "30", + "adv_salt": "0483C23ED6D77A8D0C278940BBD177ED", + "aes_key": "0621EC75B3278510C3093EC0603EDCF4", + "data_elements": [ + { + "contents": "417A9B78", + "de_type": 640 + } + ], + "encoded_section": "3E9013B8E0A03E4AE2E7C1B9F25ED66EA06746911000B48692BE5AFEED1AFBD1184172C7C7969004C1B7DBD5F3B1FD26360B730588E7A5D9AF6677656E2307", + "identity_type": "provisioned", + "iv": "14AE44FB4E180AF23246ED81C4286150", + "key_seed": "A0C7A5E03E6FEA711AAAEEA331CF2B1FC7FF1E9B11D45910ECD2C5B9DB4393AD", + "metadata_key": "F190DAF1401184759B968F030ADC4C41", + "section_mic_hmac_key": "969F571D76ABDBECCFAD193C906C94295C28257C8B6595A08FA511ED4107B32E", + "section_salt": "B48692BE5AFEED1AFBD1184172C7C796" + }, + { + "adv_header_byte": "30", + "adv_salt": "22663881121C84CC788A4F6922C843DE", + "aes_key": "0F81827BB3D0C01DCF64D7E758984BF3", + "data_elements": [ + { + "contents": "68C7FA8F642F7EA1691EA458690F29479E21B04CBB109FEF", + "de_type": 811 + }, + { + "contents": "8A0F88051FD567DE679BFB29095332F265EB034173FB9CCFA5", + "de_type": 435 + }, + { + "contents": "7248F229F7C3561570", + "de_type": 431 + } + ], + "encoded_section": "7A901340369C7D4FCB569C613A49C8DBD0329B91100018EA0774B5EAACC943949E550BE9BB3F90027ECAEE8A6F71B9D7FB08EFE2E3703DAFAB895EAAEB766E0553D865D90BE25DFEFA27648AB16D8B9C9A6D9D516DA6C8D98A3B0347742CA933963AD32B77090A10B631362604FCD808CE3CFDCD1F55501CF6F591", + "identity_type": "trusted", + "iv": "619245F3980B3B070388B0E858E58611", + "key_seed": "3F58BFCB2F818DFCCF2B1A1DC6EF4CC4C30B798F65DBFD6CEF0FBEB2DD78D6D6", + "metadata_key": "19C7DFBC68C5918D20EEC53476B394CC", + "section_mic_hmac_key": "C7434DB05FC2B8286FB317867A78B34C7344CFF20EC1C4C7AF58D2DF66FDFE67", + "section_salt": "18EA0774B5EAACC943949E550BE9BB3F" + }, + { + "adv_header_byte": "30", + "adv_salt": "7F398DEAADE4F63E3321618AC28B0A8E", + "aes_key": "0218AA8671D3E2E3B9EFE1B5C4C11581", + "data_elements": [ + { + "contents": "9323424FE556B495790619DF9DACC116", + "de_type": 37 + }, + { + "contents": "128970C823632AEF313503B1", + "de_type": 782 + } + ], + "encoded_section": "589013F189A6CB59AA3A5558AF3E6A708542E29110008454882DDD820F52035C40B1D5312A4C900428991BD1031F9679D03ED9FC6B252EB552937EEEB002F5948495D55B8C19BDA0EF0975100A8CCE558ED14FB7CA41783BA6", + "identity_type": "provisioned", + "iv": "548A8956100DE08A0305C789B52833CD", + "key_seed": "5B76B5CB1E81CC93E525AF117B8251E0F61C5DA57E4FA328E61A5BFAB48718C4", + "metadata_key": "CE0A85F582B746AF57AF0349E3258079", + "section_mic_hmac_key": "67A13CACBAB11819E8EB4E22F9F81693557DE288C42AB3731983D0C1B3C4FF76", + "section_salt": "8454882DDD820F52035C40B1D5312A4C" + }, + { + "adv_header_byte": "30", + "adv_salt": "E86E43C49AD176E39A0AA9821C78602D", + "aes_key": "BCD5E866510A0A5B815385B383B22AE7", + "data_elements": [ + { + "contents": "EC", + "de_type": 581 + }, + { + "contents": "59789A920867697109C3740D0B8029F1CC7000FF04EC0940", + "de_type": 978 + }, + { + "contents": "940D7B076B6CBA0B73872A012345F3BA97410D8709501262839D3DE137", + "de_type": 135 + }, + { + "contents": "E261435EBE", + "de_type": 88 + } + ], + "encoded_section": "7D9013EFC8FC9DAE00AF80415337DE30A6E31A9110006E869407F2E81551F812020C3433D0E1900254214E6EE97EEF7619C5FB9880E26357ADA5681E80DA9C8E367034D066375C0E8B834CE14A1AB864C7EC310AB35FDCC21167922D8192D0C782DB32A745BFC329176791D090CEE07B7C2E292EDD1DFEE41623C9555EF7", + "identity_type": "trusted", + "iv": "65C99C5FA0A0746E69C46E0C4A857592", + "key_seed": "BEA6260AB3A2F619ADB859391F6A6CA28177B84CD449C728F6189F0467F525E1", + "metadata_key": "7DD064AA32B3E04C57BF54B824641E1E", + "section_mic_hmac_key": "6660174157DC50F6D1C82D1C8D416C0E6EDCA0874333C3D94B46926CFCB12495", + "section_salt": "6E869407F2E81551F812020C3433D0E1" + }, + { + "adv_header_byte": "30", + "adv_salt": "B040969C351F81AE34697DC725DEAC92", + "aes_key": "3AF9FD8F0D0707DA73D7688D0CA0D2A4", + "data_elements": [ + { + "contents": "131A8175D19006DB8D9021", + "de_type": 125 + } + ], + "encoded_section": "449013A902FC6AA6817E9CA34B810932FCB9FD9110008681C5D8FBCC1970B3C6D9F7083FF9E9900475EF1E2E01C84DD0353766ACDE314778BA6ECAEAB9D9A63A60B5578C96", + "identity_type": "provisioned", + "iv": "8C96BB516E8363C0CD2BEFF0AC4CC486", + "key_seed": "637D181D26E0CF8BC0CE45DFE20610F6EAA306196A0C22BF51DEEC49E1A33DAE", + "metadata_key": "FAA1CBAF42E95200D71F3BEC89C79671", + "section_mic_hmac_key": "CC1FBEF9A592EB51101E67FCBA18B5FC3DC62CA157CC01ECC68B9BCD643FBF0F", + "section_salt": "8681C5D8FBCC1970B3C6D9F7083FF9E9" + }, + { + "adv_header_byte": "30", + "adv_salt": "259B5127DF0CD589480E4C1AC87A2186", + "aes_key": "4188F8C94E54114D83CCDBA4A51A1BDB", + "data_elements": [ + { + "contents": "A0382BA41C0E9E669742CCC8830D5573AD19", + "de_type": 851 + }, + { + "contents": "624153", + "de_type": 573 + } + ], + "encoded_section": "5290138B66DB3AD592825ABCAA7F300DBAD488911000D13AB39D6F0C08DE53F3B616CD929F529004A5838FA715D57CE71AF1A64E317091B45E3310331738129691565D4839D38D4D6127F0235BA458A90A2766", + "identity_type": "provisioned", + "iv": "0235DBFEC90AFAEB878738BB174A8EC4", + "key_seed": "E8E501A2579003EDB979B9C5B4C806B4A428D23DA93761D2C8031169BFF83A49", + "metadata_key": "236C4FDA97FD30586D9FC950F334367F", + "section_mic_hmac_key": "D28C28C41D9CD5B0481A62C0CEA0BF13E4910DD423C1D93C37B507D32D33DB8D", + "section_salt": "D13AB39D6F0C08DE53F3B616CD929F52" + }, + { + "adv_header_byte": "30", + "adv_salt": "C4C5AB029E86C38CBFC138696992D680", + "aes_key": "82DDE2E32703369FFF54C2119F64CAE8", + "data_elements": [ + { + "contents": "", + "de_type": 580 + }, + { + "contents": "FB89815745BC95", + "de_type": 244 + }, + { + "contents": "2C17D2FC866D81525A7E8595D271C871B96942BE", + "de_type": 376 + }, + { + "contents": "4F42923EFBCF460A8D860BD405DDCA46F7C9DA0F9232E0EE23BE8B97", + "de_type": 778 + }, + { + "contents": "75924E160C", + "de_type": 857 + } + ], + "encoded_section": "829013DC35D4DE7558FE79F6AA7C452F808B9E9110008F239DDC995DF4C680B358A8799066669001C201BDE177845AA6604EB7B7AF789F5B7502B5F6B6E546EA0ACDC9715CAC6D0250188744CDC08F61E13BF0C177E9052B3866BBEE1939A20D19BCCAEC81F6B365164759EB3016EDFDB09B0064C21C15EFAF9A9E51EE666D2B8D5174", + "identity_type": "private", + "iv": "090B960514A2ED05926303EBB8DFE844", + "key_seed": "117205E1E7B6CBE3FA0DCD6A5654D6D4441C86E3F1D2CD8D14E9A00A50F44A79", + "metadata_key": "E29007F32F7ABC691ADB2154678D5033", + "section_mic_hmac_key": "06B6CFE233713E34981D8C0B59B6BE1471986D027521B7DD6A9690E3E74C735B", + "section_salt": "8F239DDC995DF4C680B358A879906666" + }, + { + "adv_header_byte": "30", + "adv_salt": "BE9ED7A60A893A866CDD037770626A2F", + "aes_key": "7DCBF0B035A5999D3B459BDDB37B9396", + "data_elements": [ + { + "contents": "2EBE52B4DC1044C8", + "de_type": 760 + }, + { + "contents": "C061BDBA02F6C0E30E0DCBC8299DABEC493B", + "de_type": 472 + }, + { + "contents": "21", + "de_type": 20 + } + ], + "encoded_section": "5A9013411A3B5ACD35928ACAD6914239129E329110003099AE6FC3D8669851B51D620A42D12490021B9AE05BD61343867C3C240280327F3246B377D7395B554EB49E6A77370AA68674ABB2B6A256306A1F6719625FB54CC895CD4D", + "identity_type": "trusted", + "iv": "9D72BBFEA0497D1DA4ACC45BB2A90377", + "key_seed": "94F97F6C1E46E30EDC42E6CF6D4B8A1BAC6ECC27853F85B2C8812020CEE49433", + "metadata_key": "4796CE9A597223DD3B0FA429601A6835", + "section_mic_hmac_key": "E480E1D001AF6DEAB85E05569F89C554C91B4C10782D524BB531C0923E5250A8", + "section_salt": "3099AE6FC3D8669851B51D620A42D124" + }, + { + "adv_header_byte": "30", + "adv_salt": "A9CB9CBD617009C6886517BDCE283660", + "aes_key": "33CAB010C3BE276797895D0CBB60AF4A", + "data_elements": [ + { + "contents": "D5D03D064D9C1B5E9A5C4843B275C3CD", + "de_type": 202 + } + ], + "encoded_section": "4A9013A93E5B9A890CC11B51885D93E342F9389110005A3E86C86385ACDEC0F67A0F951409459001AC946618BCDE275AB4E5C0B22C054AF7D38CA4BDD5EFACC2BF163FF305CC85E79B26FF", + "identity_type": "private", + "iv": "4C11908D956A1BE7E5F376D7A95379DF", + "key_seed": "26EA70FB5958B3D30BE5A4B674BF26C35B1165F1167D4D26C2D4FE89A95C444E", + "metadata_key": "450130FDC1E9E917412A844B0B6965F4", + "section_mic_hmac_key": "17D847BC251573C504C4A10D3C9D76CBCC4D8D59C70AF2FDEB8BBAB809195D5A", + "section_salt": "5A3E86C86385ACDEC0F67A0F95140945" + }, + { + "adv_header_byte": "30", + "adv_salt": "8DA30D413D04342787231D2F4703060E", + "aes_key": "73D393348C0CE43988E36C73C2801695", + "data_elements": [ + { + "contents": "5AAE629F32372A1DAD4D4214BE001D6004297951F2BF14A958", + "de_type": 250 + }, + { + "contents": "71EED7E50F377AE422EE9A62664C63B6E8FE7414A9972E", + "de_type": 997 + } + ], + "encoded_section": "6D90138CE8BA256E0D3CE40503F1380555F4F7911000BB2EB1934C4103EE116FCD3227F2E7069001753ED1826BB108753950EE7BA87DAFBC1B893DA6A95349D954690CD30E420AA407E8E7C19B7EEF39A868DA4EDD7F4D94E30A775DE0C1853EFD8376B7E913D57B9B22BD228340", + "identity_type": "private", + "iv": "B1A2C2E8EACB2DAE589BFBCBE73936CD", + "key_seed": "444A7A142BCEC48DECD9BD96B469078C247A46A276589BC49278B46DA1E66898", + "metadata_key": "CDF23D34FD5AE8DCFA43439FA8C1DC83", + "section_mic_hmac_key": "EEACF4F747FAF85850228F313592C4A866FF0203423AFE73AD8A784C68194679", + "section_salt": "BB2EB1934C4103EE116FCD3227F2E706" + }, + { + "adv_header_byte": "30", + "adv_salt": "4E79E2C2CE7D1E7F2B4C0E1B4C6FFC4E", + "aes_key": "686366F14F36F2790F49961D570E31DE", + "data_elements": [ + { + "contents": "79A5FCD4C4", + "de_type": 275 + } + ], + "encoded_section": "3F90137BCB86F08C9E2472B4D7865E8BD67102911000979F2DF1B430F042258DB96F09AAD2DF9001DE6026894781DF90B574283521D90A8717B44B9B83E93441", + "identity_type": "private", + "iv": "CE4D3E400223D202DF6364CA96D7E81E", + "key_seed": "2228A838E4A0FFEAC5045A52ECD38BEA130DEAE56F87E848D347EB39DE7A04D9", + "metadata_key": "28D3DD52B97F54DE9D11725E5BF0DC77", + "section_mic_hmac_key": "A08E5F1CADE33CEAF811625E4F2431704021BD148A11C14E628A98F81F266BAB", + "section_salt": "979F2DF1B430F042258DB96F09AAD2DF" + }, + { + "adv_header_byte": "30", + "adv_salt": "5E29E2EB2092471CED1528AFADDC750D", + "aes_key": "737BBD18F03E6F059B322E4984AC52AD", + "data_elements": [ + { + "contents": "7EB2", + "de_type": 976 + }, + { + "contents": "BDBC400C6F43C492E5BC65B89C6A4F7F", + "de_type": 716 + }, + { + "contents": "4C", + "de_type": 151 + } + ], + "encoded_section": "5390132D49C0DF41955CA5679606D637200C9A9110001AE616ACFE4F0F208FAB57B1798342BB90020334CFDDB0B6CE4BC468F665A6D3E9848C4EDBF35A9F75066415684A86653A4C961ADD30DA100FA9D45AB391", + "identity_type": "trusted", + "iv": "5D03AFC4DBB2F4EE8754B67BFC78BFA9", + "key_seed": "9DB1FF1FB929DAB1AE43C57DA23E8F85253E8FEE48A2BB00C3F6034DEF843692", + "metadata_key": "242B7758F74E2B36DF8E7D81150606AD", + "section_mic_hmac_key": "4C0D23B47C5E9382FA9885B053CB40936954A90B59F2401BA4C0EDBE229A513A", + "section_salt": "1AE616ACFE4F0F208FAB57B1798342BB" + }, + { + "adv_header_byte": "30", + "adv_salt": "242CC33270FB75C2FF4AD84277688FF7", + "aes_key": "EFDE819D904C83619D2D30E4D70B8CC8", + "data_elements": [ + { + "contents": "12529277C5D50C8A4F095B89345B", + "de_type": 507 + }, + { + "contents": "63BA0A52CF5AD99CB9195FEC1DAE109ACF988B7BB17282BD", + "de_type": 1 + } + ], + "encoded_section": "62901383DE207E70B383FC58B678E7BF4C5F419110008C5E1F088294820FA32847D46AD64CD99001E9A0818C660D4C99844859DCF57F3D97D58E724BB646F119976FABA1133442628E2C0B2F46D86BBFA1853D6C5ACCCE677175CC9426CFE14B8AE6A3", + "identity_type": "private", + "iv": "496EC166AF60125F0446D500C3C3819C", + "key_seed": "4D7CCAB2C94F07DB0EBAB82519938066F522CECB330EBC69EAD51162FA850B5F", + "metadata_key": "C2F07402322F9CE5371684278F3E2135", + "section_mic_hmac_key": "C706AB65E845183DBDB246542F2DC17AD0B9F185BD72631BFD48648E84B2C19E", + "section_salt": "8C5E1F088294820FA32847D46AD64CD9" + }, + { + "adv_header_byte": "30", + "adv_salt": "838C29BC8D62B7D297AA86FD6243397B", + "aes_key": "A72506C80E6101E8215D5ECD7CC6676F", + "data_elements": [ + { + "contents": "", + "de_type": 831 + }, + { + "contents": "11ABEE", + "de_type": 750 + }, + { + "contents": "A99BBE1C3491A3F8E9FF3275512D74FBA0E11A098F279BF2AAD24A8E", + "de_type": 180 + } + ], + "encoded_section": "5F9013B302168E039F6DF5F2FF279877BC1B6D9110005825ACEEA13D43300CEC795C9B920143900121D5C02870290006416E2234FBF50EB66BE0FB78C922B7C5066877C09952128FAB2AA8C264716E1FFAAAC4BC1428DC23A61546EFA39DE256", + "identity_type": "private", + "iv": "F1B9213795CF50E84E407BD7183C35AE", + "key_seed": "0900BCFAC049F0F0D650C4FCDC0D6F2E1D92A5F60B1E8BB145ABB628AE5E58ED", + "metadata_key": "FD4E55647EC444ABF650341BE49BD761", + "section_mic_hmac_key": "940BDD8441E16C1D3664C7A47FD3453C7DD9090535D53E84609CF8CE3410CE71", + "section_salt": "5825ACEEA13D43300CEC795C9B920143" + }, + { + "adv_header_byte": "30", + "adv_salt": "608E20905F4D098AD75DE34EBA3CDB0F", + "aes_key": "12C7CDA60ACECF2B3D80CA63FB0CE287", + "data_elements": [ + { + "contents": "15F7D3848623835A", + "de_type": 717 + }, + { + "contents": "5A745E", + "de_type": 3 + } + ], + "encoded_section": "46901316E172E08886A7FBEBCC5B3AA0B17832911000F09EAABD05333528D512C8754644B8AD900467F1A59A78636BADDCEA44E2893670AF125640CBE4AD92E0C2660E6B8FEA55", + "identity_type": "provisioned", + "iv": "B23BF0D8170F7217B2D653298DDD2F85", + "key_seed": "EF6FA69F6234C814FE90CEACF8312CD80CFFE80D89B2F4D95E7B8D3E2CEE31C7", + "metadata_key": "1F0CFD60026CF03DE3CA79B50FFFB3CD", + "section_mic_hmac_key": "3C3E1B060458BACA20D16BDCB96BD91B5FAE8216ED5EBC29943EF8C6B02C3C86", + "section_salt": "F09EAABD05333528D512C8754644B8AD" + }, + { + "adv_header_byte": "30", + "adv_salt": "6C10B4E56E4683A24D3909A366D30B66", + "aes_key": "1F64C99EEDE773095F8E5189F3F9A7DB", + "data_elements": [], + "encoded_section": "379013AD9EE886E64FB47387AFA86F92431ACC911000F0A95F8B37A126FAA7403D8A3AEC350D9004F4D183272101D5C8C109012B210A5C67", + "identity_type": "provisioned", + "iv": "342C3BAD447104821279EC85291B0475", + "key_seed": "B2101BE6844AE38B5AC0D33C747729B1F09E4C8900EAA870412268A94852B40D", + "metadata_key": "91F63DC00A30570F6205FDB025AA95A4", + "section_mic_hmac_key": "3065A710A4107F326F25360F6E498B7375AFFE566A86DEFB62D254C67EF089BF", + "section_salt": "F0A95F8B37A126FAA7403D8A3AEC350D" + }, + { + "adv_header_byte": "30", + "adv_salt": "D94830ED029B92E5B29E222F722B9B6F", + "aes_key": "C57D61016B89F28132CA0B4CAA8A1CA0", + "data_elements": [ + { + "contents": "402E4416B0C352C40F1163D869B8B760C17457D6C3", + "de_type": 188 + }, + { + "contents": "51248E19812A467000", + "de_type": 62 + } + ], + "encoded_section": "5A9013EE7189D36F22441A68DC1425B2B4A411911000CFF8A395F22500E8EBCAD614762CF95890018C3EE3D4AEE5CFCC9E2D3FA21E1B79F7D2D3C7364CAA0F33952C56709120A420E36A8443D4870413BA5BD27BE985B58F824AC0", + "identity_type": "private", + "iv": "DF4774BDDAC6C269773CD0978A6165C3", + "key_seed": "346411BF7C90DD0794DE3F6C9DA0D22F6B0A59811E164CA362548BEC7B452A9D", + "metadata_key": "D440B77462CB03579C051678FA0C9E06", + "section_mic_hmac_key": "70A01DA6C369A6B9ADE05B5C57EB0D5086D2A4EF2BE3745CEA1EC3AADB0EE1FC", + "section_salt": "CFF8A395F22500E8EBCAD614762CF958" + }, + { + "adv_header_byte": "30", + "adv_salt": "655526F2B3BD4707D603BACC74ABB7D8", + "aes_key": "FCE4B6C8FD25716486D3713F4331B438", + "data_elements": [], + "encoded_section": "379013D596630672DF75A4EA5478E59232E39D91100095894B2B79D0B4A3FAD605E277AA33A29004DC96C8EDCD236F241AF6E6AA6DC69752", + "identity_type": "provisioned", + "iv": "E890D5EE6189B3BAB5FFDBC0AE63CBFF", + "key_seed": "79B865DE8DA7B8930812A3D4E627A1CE74476AA1BB51116CC6B43A0E0C3ECAF5", + "metadata_key": "0FAFAA9D6FC46F82384F0D12FB7CD252", + "section_mic_hmac_key": "927666232383A3029385567EC2BEE80951FA4ECF87193393D76E545F3EDF131A", + "section_salt": "95894B2B79D0B4A3FAD605E277AA33A2" + }, + { + "adv_header_byte": "30", + "adv_salt": "A03E7E784F3434A59007980D905D9B94", + "aes_key": "4C68AC909B3117588857C08E1372E532", + "data_elements": [ + { + "contents": "184F372DEE00B3F9ED09A7BF86363D488330FFF7C2A0BF099257B3236C", + "de_type": 301 + }, + { + "contents": "9A6408F59389014B219E5B5AD8160848ACA710DE893162BCC2", + "de_type": 713 + }, + { + "contents": "5D3D783CEA628D3E482D801AB6B1E2", + "de_type": 799 + } + ], + "encoded_section": "8590139CF16293B97917755ADBEF1A013CB4DC91100011705C1239A7475C4A716F4C78B1C8A29002D00DA5542C9AE536C8295452971C87A93A5A15D6C531300972C9451FC7F2644E5803E6E2ADACB793DC59AE0BEF3ACE6E06F03991C717782A35D5DB04914ACA3DBA25CFB011C3A55933FCB48DC19D1938DEC79B8019285B5394C67E60E4D2", + "identity_type": "trusted", + "iv": "6A675C10F654A737352FA395761C8645", + "key_seed": "A5A12D4A886399DE973FDD1D713335DCED621F1A9912397CF17589F2921C3B37", + "metadata_key": "F0354D2E5C76AA746DEC6F428377CFFA", + "section_mic_hmac_key": "B5FE7969BAFFDB41E39B07E4272ACDD8F2959147C8A3524FD34895B1B4AF1215", + "section_salt": "11705C1239A7475C4A716F4C78B1C8A2" + }, + { + "adv_header_byte": "30", + "adv_salt": "6FCE962D651CFA1D1FC26D80D2766F41", + "aes_key": "B4B66DA5F5812D38A75BDDD3D39DD03B", + "data_elements": [], + "encoded_section": "3790132AB715C6AD8256E26D58639B9D263A4D91100078185D32370D3883575CD08D246320B69001F7D0D2D1DDD55101513DB171CA62205A", + "identity_type": "private", + "iv": "C1E034C75C6B7F6FA8FD225ACE7198F9", + "key_seed": "B1CCC7A6A5647E35926BC885BC1462888401B75E7E873A160D9078009E176224", + "metadata_key": "8D008DB1E71FF2FA4BB7846A6EB5957B", + "section_mic_hmac_key": "B60AFA9229E0A951BE1EF9C112E0DC7E5BAEFB8EFD6C4D87C49B12AA9FDFC246", + "section_salt": "78185D32370D3883575CD08D246320B6" + }, + { + "adv_header_byte": "30", + "adv_salt": "BF2838A458097277ADCBE68878A11EDF", + "aes_key": "A42FB4383593544F9CD02358F7450E3C", + "data_elements": [ + { + "contents": "9AABF3A4911F54903A7A585C5935598A17AC1BA1730F11BCE2", + "de_type": 220 + }, + { + "contents": "DBE8AB3119CFACBA0616EBEF11805BA7DB4C6D8EE936A0C75A585C3731", + "de_type": 109 + } + ], + "encoded_section": "72901311DD08CE860EC740F5AF704F4ADC6197911000A5915C75281308C25817A519495433AE9002ED9804291B041DF22F1132D88C7AA514CB99C25507964F71B3E681BEC95DB43D36ECCA071FB2EAB77EC221F2814F09A6407F6D6DDF2EE971EEB161A2E4723C08C3D8907207D24940AAF9E5", + "identity_type": "trusted", + "iv": "B1C915A96024FB361DA2E9E17D7C8666", + "key_seed": "D679DE42650FA520DC444F00DC53331B27A4204BE69BEB44794C7566C616CBF8", + "metadata_key": "76A213E2A9FC5F503DD5C6E48151E973", + "section_mic_hmac_key": "F5A02393A6338BC5D6F1099318530780F0A4AF604FEFE53E948D55487CD6C14B", + "section_salt": "A5915C75281308C25817A519495433AE" + }, + { + "adv_header_byte": "30", + "adv_salt": "7DBCB27A82A7D1338F3F078D12EF928C", + "aes_key": "EA6B8BC0D8703795277414578517CE68", + "data_elements": [], + "encoded_section": "3790130BA98A4D2047B41A35E80D49E0D91691911000670F2BAEA4F3B15AE1D3E0A72C72C9209002DB5533D4335FD2C3B6461A9967D344A2", + "identity_type": "trusted", + "iv": "758D967581262F3882B691B017798245", + "key_seed": "8B3FE8D446D0293D99FF268E762B47E33A0B530993E7177F7FED43D4F8C31CE3", + "metadata_key": "36C1E1FC2CC7E80D4FC938FCB14F4A1B", + "section_mic_hmac_key": "5DA2A4D4B98205C3C9FFCCB93F070B4899739631327C7A86246E0D5111EADB48", + "section_salt": "670F2BAEA4F3B15AE1D3E0A72C72C920" + }, + { + "adv_header_byte": "30", + "adv_salt": "956D51B44D835809B4DCB5C1D6EA607C", + "aes_key": "2AE3CDCA25A22C8A800EDC754D23E416", + "data_elements": [], + "encoded_section": "37901310086B129A7A396A6DF01FA7F82D5CA7911000ACB37E7A8113B240AE185B5E6AFE9242900251C8DEEC88E53A72C6DE2D61D82C1E04", + "identity_type": "trusted", + "iv": "FB4F3041A58B740895B607D12438A62F", + "key_seed": "75726D6692B7BA73365ED6114AD116A882A771857698CD296A1766803F0C748B", + "metadata_key": "090CE8211B3E5418AFFACC353FAE8E45", + "section_mic_hmac_key": "EBCE5FBC0923360145A72E27B3FCD677A9B16527631A374EFA5BB4766BF3567A", + "section_salt": "ACB37E7A8113B240AE185B5E6AFE9242" + }, + { + "adv_header_byte": "30", + "adv_salt": "875B4DC0A9FD6582A298160D8B07241B", + "aes_key": "DD8E7898DB01F3022171929DBE859B05", + "data_elements": [ + { + "contents": "820995BAB825E0BFCDDD7710B139746B8E330E859FFE", + "de_type": 177 + }, + { + "contents": "6B1EFB732380455FCE778DB6DF50D9C474BBB3353845AF1B", + "de_type": 883 + } + ], + "encoded_section": "6B9013113600EB6A517F05193F05274022755F9110001CE97084F1258375F2CBE48D88EDE4EC90011A1C1B2B6E68CAD942903FCACCE5E428FB1BE044C55685B3EF94097A3B1FE658703C24BB548E88ACCE80FFBFE5DD8A5A4724CE2254F077234A7282984038E5A062822549", + "identity_type": "private", + "iv": "CF9EBDF3F06EE6C72089D0F4290F202C", + "key_seed": "F6EAA293204F1BA807120918B47F7F1C2DDF8085F7A1138452F72022B16A2D02", + "metadata_key": "AA009F2D3D1F97B63CCA3AEF490576A1", + "section_mic_hmac_key": "396722ADB64CCA9695A219385A71EECA3E9DD57A1CCFE93009795EA3D5EBE1C5", + "section_salt": "1CE97084F1258375F2CBE48D88EDE4EC" + }, + { + "adv_header_byte": "30", + "adv_salt": "A72824AEC67082FD52F521DA153BC437", + "aes_key": "4A68482B406375EA353B8D3DCC41DA3B", + "data_elements": [ + { + "contents": "7F8DA439C60E", + "de_type": 262 + }, + { + "contents": "4DA31B9C1BE28FE4B906597598", + "de_type": 131 + } + ], + "encoded_section": "5090134CE0387DF697DBFF2B6967B922DA1B96911000AFA838CF8AF1E94C6D3ADC3DEAF9193A90014B4B0C5F47F4F72BC0E54FD3A225353D9C2DB6C6C6582B24F2F4EC601F0AD29D305029F326E4E13E42", + "identity_type": "private", + "iv": "39DE563E758D36C340A8F1161F88A725", + "key_seed": "DA07B9585C6328F8FDA0561EDC40F00B21EEA83C666B73A85F099FA6F4B77F4C", + "metadata_key": "71675EB7D69EC84B1E4C058B6642D812", + "section_mic_hmac_key": "64B80C39B9AE9DD8A7DA97E73E8CFB415AED92B75A815CF1C66AE29FBB9C3D78", + "section_salt": "AFA838CF8AF1E94C6D3ADC3DEAF9193A" + }, + { + "adv_header_byte": "30", + "adv_salt": "2D6A4B8DBA9D00228B9C0CFFB24B916F", + "aes_key": "C0E2C9F0CD3574911480D28E4083263F", + "data_elements": [ + { + "contents": "6F512C943F83EAC9E6E961039D2B8EE806C0", + "de_type": 296 + }, + { + "contents": "3F16FD30D2B0ED2EBDE2EF4C85FAAB16BB428A1E0C2BDAD76E", + "de_type": 243 + }, + { + "contents": "528F528CAD4F647536823261A121CE0875A0E5E41735BC7ACB", + "de_type": 950 + } + ], + "encoded_section": "84901365F658F25AACABB8AE42B7ECD7FDDD1C9110001C67EF90C57AE9B73871ACEEC9F02F349001EF235FC538D616127E38A22C5C64B5CC82F64248EE2CF44866B2A653BDA861AD1A61493F0DB877C8C4F2DE6F602B859659363701A8C57EB57B60D69C1A556FA11E068F407BD6C9355BB53CCD48FEC132F531519C6A6BE20F6B68B4BBFB", + "identity_type": "private", + "iv": "7C742AEB01EA936BE74C4B5F177C6761", + "key_seed": "A6CC5A90AEE26189984C71CF6FE0DD2C0AEAB767E80B709FC27F16A69EA1504E", + "metadata_key": "AEDFA8ECED1B2D6572BF4B181AC7FAAA", + "section_mic_hmac_key": "4B1E36074BC7AD29290AF198E332090BF9910FC0D0487C5F46B0EFB009C5B916", + "section_salt": "1C67EF90C57AE9B73871ACEEC9F02F34" + }, + { + "adv_header_byte": "30", + "adv_salt": "361583139DED2B1E673CD68C16029294", + "aes_key": "44C55EF72E97F5BFF1D8564CD731B946", + "data_elements": [], + "encoded_section": "3790138230C234237A46210D3A04195EE568B0911000292825357BE80336C2218747E9656A299001C92A44671591C7ABF14466844D19A0B6", + "identity_type": "private", + "iv": "35847BF297CA4F0F3EDEB1EF206DD353", + "key_seed": "7FBA013FD2C6A89A6FC72F072A21DA549ED8BDFD1BE50818819EE20C7CB66572", + "metadata_key": "0361C0EDBEE48B8DE9C163F5B8241E8B", + "section_mic_hmac_key": "27E83E253B784927867786E495B1E54B1B2924DDC766239A45D9D501DE33DFF8", + "section_salt": "292825357BE80336C2218747E9656A29" + }, + { + "adv_header_byte": "30", + "adv_salt": "01AF8D1493DA0EA7129FEA26F691537A", + "aes_key": "B3E74FD64DCFB8D61B4BBF6060921947", + "data_elements": [], + "encoded_section": "3790133A7FC10C9D1239CD46C3C6B4FC5B9ED49110002478216082A06CBE5C03A3385785D1719002A06C5AC8E3510C373EF27BF7B5B78B7B", + "identity_type": "trusted", + "iv": "5EDA40827CAB924516B3193A4447F831", + "key_seed": "F427B6C08CD9D9EB69955C96D8B523840C8B9BA38572A5AA5BB2263EDA599A6C", + "metadata_key": "E754D8C6D2D5428A722E130924D9781A", + "section_mic_hmac_key": "90CCD137B4CB590B4D8D37A0EB14FE350FA1E771608DCCAB07469946BB771F76", + "section_salt": "2478216082A06CBE5C03A3385785D171" + }, + { + "adv_header_byte": "30", + "adv_salt": "A95465E03BCFC8E5BFEF31C055C9A024", + "aes_key": "0FB48B0B5519ECB357D58721E1A24445", + "data_elements": [ + { + "contents": "90B0D5AAF302AF084AECF24D32939E", + "de_type": 404 + }, + { + "contents": "AECA1B6B0D10D843E73AE0165A3E7D5B2C8B8310B7FD00B8810684", + "de_type": 59 + } + ], + "encoded_section": "669013C6E721C70C2B3944B5FD253FC61566E491100053615ACCE2909F94FA4B998B569163359002040954BBC4C277CA47D211B5FBFDD97499FD51F6C8E8DF808C51649BEED660998226AFAA10BEC9769D1482673B7A0403F5AA343370C040F9F7B82DEA9D8C1B", + "identity_type": "trusted", + "iv": "B4A532C12A214BC4D727284823EAC0E0", + "key_seed": "0F74A62FBF6CF9220166B846A0F76E669E42D1487EB5FD359B0CBC65FCBA7EF1", + "metadata_key": "8EDD19022D2A88C0441386C74AAD046C", + "section_mic_hmac_key": "2EA06B4B794A2F454E5B070979EDAD76D4983DFB48A098B472710D7917D3E5B6", + "section_salt": "53615ACCE2909F94FA4B998B56916335" + }, + { + "adv_header_byte": "30", + "adv_salt": "FB45A0BAA38D0F35A1F64D9C72B923C8", + "aes_key": "9ED5B7BB2B1C3413E6AAC6DFB3754FEA", + "data_elements": [ + { + "contents": "2CC3BC6746DD1AE5", + "de_type": 152 + }, + { + "contents": "DCEA4835787A94F495C7DE8F2AAE080A39FFC9", + "de_type": 876 + }, + { + "contents": "DC2F08CEEC54", + "de_type": 70 + } + ], + "encoded_section": "609013D8F958F5ED45F8F3727CE84B31A06C0891100025A2312ACCB5535F0EF3A099EA10E7A29004D31578964C0136C455E1985055CCCBD7B56A8FD9315960FFBD889907F17865933AD86C73BE09C9E85B1CB8598B4B2E259AD4DF9AEC0871D2D6", + "identity_type": "provisioned", + "iv": "F332E711DEC606885B92138FD805E405", + "key_seed": "44DF410E636A1EBF23DBC113B90F004B58E95049C1826B8F9EBFA59A6F02F39A", + "metadata_key": "7FD6C62197D5111EAF0F95084607D88D", + "section_mic_hmac_key": "47CF9B8136955D1DE13DFC33ED6896E7A0F27264C5D71FED5148AFA99B3A972C", + "section_salt": "25A2312ACCB5535F0EF3A099EA10E7A2" + }, + { + "adv_header_byte": "30", + "adv_salt": "C74D81C8ABBAE1C6A90F9285801F2336", + "aes_key": "7892DB13943D1F5167398B4A23835088", + "data_elements": [ + { + "contents": "0BEA3CC25F2B23B1A69CB239E9FB07BEF76623E4AF2F5A0C3679AF79", + "de_type": 746 + }, + { + "contents": "8AF23F8EF77D8403BE6D6C9244", + "de_type": 465 + }, + { + "contents": "82", + "de_type": 545 + }, + { + "contents": "9DB8C637C4781544D09EDEA5764F8FD47516ACDF62D8AD98F5586504", + "de_type": 9 + }, + { + "contents": "DFA09FD8BB33F71593", + "de_type": 590 + } + ], + "encoded_section": "949013B2EE5F6DD997B4B4F8BBEECD33984B23911000757F746B62CB45D006E374E2B107DA549004285D582E49B413EE38A1FF386B7AC0BEEC63BD9ED74984319CD8FB0F39ED9104B6FFC3474EDB24465C3FB6D02CE61FCCFAD1EFE9BF6E06E2394CE62584FB7E76BE01E18C3C9CF2E4932F35F7C6DB988DFD97DCD08B983AE89AB6AB1B6ADA891354C1BD42E38BAE9EC4BE692CEC", + "identity_type": "provisioned", + "iv": "C1144E36B46120A9BB81FAF638354A7A", + "key_seed": "A06644701F516480CF3EED2B66DE14FC48749E39C24CE4262F416EE47407C482", + "metadata_key": "A8F0E7D1D083B1EB0E6BB743D2C6B5B5", + "section_mic_hmac_key": "96BB03131488C6D55F42293579231EC82F49E057D9D1D91AD4022380BC2B32D7", + "section_salt": "757F746B62CB45D006E374E2B107DA54" + }, + { + "adv_header_byte": "30", + "adv_salt": "8DC60BD4378BA88DAEF0708052F570FC", + "aes_key": "AD070254CBD31CFF78F5413B43E1272B", + "data_elements": [ + { + "contents": "11FF19A9F2D6881B904B6A020B0658C3C724", + "de_type": 127 + }, + { + "contents": "0914FD60DB1B", + "de_type": 98 + }, + { + "contents": "6DB43F08EE556EF61E1F845D09178098CBE43908E0FE46F8", + "de_type": 256 + } + ], + "encoded_section": "6E9013EEAB611CFFAD8C7D963355A833C9DA149110006F93D279192BDE0E527BD7E8B3168A12900445AE2642753C4D802B090C99C6EEC222388F26C0C119EB029487297606DD5772A0B043DAF23A826A3C113B6EF49C5D4F01202683137DD3FD800A4DA9E8DA510EA7F8C658101225", + "identity_type": "provisioned", + "iv": "C69FBF9DCC40FDEAABC5656F054A0B64", + "key_seed": "221AE078D6806D3A41EDE4DF8CAA587F4ECFBE17210DCB7F168FD6C2DE4C3C2D", + "metadata_key": "77E1A4867CBF4DE00E5C9FEF4DE9D68A", + "section_mic_hmac_key": "D60017BB5E5C89DBFA59FCEF5BEF61E3DF6DAC38163D4964FBE4212652058574", + "section_salt": "6F93D279192BDE0E527BD7E8B3168A12" + }, + { + "adv_header_byte": "30", + "adv_salt": "3E93896B318C8A8A2B86F8BEDC4978D0", + "aes_key": "DAC516C10DF00826FD6F624BF8B98920", + "data_elements": [ + { + "contents": "83674116AC5D2915591B2C50E71E0C2402CF047D4E", + "de_type": 602 + }, + { + "contents": "E199053B60", + "de_type": 165 + }, + { + "contents": "9675FE47BD8D10B11EAD1E1377D3772D5951BDA26D8DBE8521CC", + "de_type": 755 + } + ], + "encoded_section": "749013EF13622E04C646DA50382C936028A2DA911000A60DAE9062B7E80920115AA20A3DF6709004B9CD323F7489632E56DC010ED403CD83E2E22426733185AE3ED210CE702CE2959513B35B894216D0CBAD236E501B715E3801031478988BB7334EB6EDA2D80C4CD7B78E7A64916749728DD6305F", + "identity_type": "provisioned", + "iv": "D952D1CC42037B34686C0B0BD9E697F3", + "key_seed": "B5663E9F549316F4156FE1E1F3A88CEDFD45EEF1413692310A745E7C711BC323", + "metadata_key": "965D9973134E4C5AA5B527EE370875D4", + "section_mic_hmac_key": "3AE74AAF3A515AE1EEAB3BDEBEB1233C300AE27BA3A5668BDF059BD400E07F7D", + "section_salt": "A60DAE9062B7E80920115AA20A3DF670" + }, + { + "adv_header_byte": "30", + "adv_salt": "5A049145452ACBD46CEF34B3D44ACA7F", + "aes_key": "DB91A343B3C4295B3B5A7578BAD0957E", + "data_elements": [ + { + "contents": "4044A5D3A69B", + "de_type": 200 + }, + { + "contents": "B5B5C084C05D28F6A5776A73", + "de_type": 53 + }, + { + "contents": "3F53E321EAAAD37321575F95", + "de_type": 264 + }, + { + "contents": "4969E7296C9756825F11908CF6C44C728579407005DA58", + "de_type": 121 + }, + { + "contents": "EA6EAE6782CADFA1BC03C22398EFCA35A25D1C455A61E86073C05F710C77", + "de_type": 42 + } + ], + "encoded_section": "969013C9C75F20004942324E23C744440463CA911000E7C40EA2C2E65E5C5946447A6823338C9001E0B8C42F8B334E52A77E63C8BEFD9A717536AF9A21AE15918D84B0688C9B9A83C641B2DA40581639C617053E79AABD4FAF5DB9084512306D84091D2369C5507CED38EBD71CBCA5938CD168EC418BE57C2DA2C3C69224A3AD379C95083FCAB626627D96FD55A216B64C9718C082394E", + "identity_type": "private", + "iv": "B0E066C1CB9E81FEC072658AB024D029", + "key_seed": "6AC9251B57E1AAADB0A82C14052229F0828511E8DFB62A7B01408C4C6CF942E1", + "metadata_key": "81B7DFC2288EBA39967BCE164DAFD504", + "section_mic_hmac_key": "305ED3775E3CBE503C3F9DE72AD075BD578D6D16A171536CF6FCA86032859FFF", + "section_salt": "E7C40EA2C2E65E5C5946447A6823338C" + }, + { + "adv_header_byte": "30", + "adv_salt": "E87CD39D43C0C4C98913104FFFB1B6BE", + "aes_key": "EE96CEB9FC198FA238C718D8C664C2BF", + "data_elements": [ + { + "contents": "306E2C5F8259838DB0D07BBA4805E7480BEA4A6C165E31DE8BBA763D3078", + "de_type": 845 + }, + { + "contents": "D88025A8047D6AE0F6875BF82717FA782F", + "de_type": 521 + }, + { + "contents": "8565", + "de_type": 661 + }, + { + "contents": "4D1182D9D22A5B584276EB34F00AD16D6FA3", + "de_type": 140 + } + ], + "encoded_section": "869013F1858C90C012EE372661972315171546911000CE2651E744A99AFAA849A54E1732826C90028BA480AC17C5D584F5BDEF8B4F2E078FF5A0681F77C391C2CB04324E4B5E9EC6EEC870D4F9501CABF785E02FF77D7875286E4505A9B76E28BA5CD940C9B255C609E4A4A4CEEFBB53433E707B56E9E28E202740B6A63C6891A35512A330BB65", + "identity_type": "trusted", + "iv": "E84094156E309C9E78E0F6B2983B3B79", + "key_seed": "83020A9A0A506DE2A82978C1DAE9F961DED0868FABDB237B621F79CFE37E7C16", + "metadata_key": "CF32E44F9BDB4C2AD80AEE60E78D3FA9", + "section_mic_hmac_key": "21F6F2CDE9AD607DC36EA9F9C55A6FF654B00665379CF80DEE1C8E493DC5E35B", + "section_salt": "CE2651E744A99AFAA849A54E1732826C" + }, + { + "adv_header_byte": "30", + "adv_salt": "B57C92EB613E7A217DA71D86490784C7", + "aes_key": "D9DB4C7400D56812F5D3F7DD244E513C", + "data_elements": [], + "encoded_section": "379013303598F236568149434CA461E3F9A4B091100081BBA4092F14CE810ECD0D7109A582B690041B06DC29BC82225D3F91DB0D996619DB", + "identity_type": "provisioned", + "iv": "D586725A11804C6FE31DEB705CC8D294", + "key_seed": "149F80E11AFCACF6E13DF3D36C01C6D5DC688F8DB9F10537494FFF926052CE8C", + "metadata_key": "D6319F5160167840627CA7013B292282", + "section_mic_hmac_key": "51E43F329487E193A6FB0A179BB609F45AD5C4725653DC59EF075A75B52B36D1", + "section_salt": "81BBA4092F14CE810ECD0D7109A582B6" + }, + { + "adv_header_byte": "30", + "adv_salt": "D082000833AE11B48B49AA306FE002A2", + "aes_key": "95D0A624DEA476B1BA80444787463999", + "data_elements": [ + { + "contents": "EF3C4BAF4B77424745", + "de_type": 409 + } + ], + "encoded_section": "439013B0798E09DC56FD5C009B7BD24CF2D4F0911000BE2EF537A56A6022953F032D04ABC35390025EEFDD2CC06B518DDC1F1B383C59D1D9EAC33D6548B648CE39399621", + "identity_type": "trusted", + "iv": "0C8D19316018D63558BF62735E8AC988", + "key_seed": "FAAE2DBB5B2652D6AD95B92F59105DD76AD1B41C51C8B4E358CA0B60A0450DCE", + "metadata_key": "8D027CF95D5A790683C0B669D689CD89", + "section_mic_hmac_key": "98F3525163633F6511A7BFF1598DD040181D2C3CFE3D1AC5D76FE2A23DD09552", + "section_salt": "BE2EF537A56A6022953F032D04ABC353" + }, + { + "adv_header_byte": "30", + "adv_salt": "5D2264D51719AC98B1DC3E0117358071", + "aes_key": "2F98AEE5A3841F10E02133F379B7C39A", + "data_elements": [ + { + "contents": "4FB4", + "de_type": 701 + }, + { + "contents": "48C3D5622F824DC1C7B0414387C8B4AC866B0EB9A7D888AEB6", + "de_type": 995 + }, + { + "contents": "41", + "de_type": 139 + }, + { + "contents": "EA9186B4375DD1BA3491ED53", + "de_type": 934 + }, + { + "contents": "9AF9C3B2BD374FBAA4F3D2F1DB2A186F8C3A", + "de_type": 633 + } + ], + "encoded_section": "809013847031FDA820036FD425568B5611C5EC9110002CA0587BDDDBCB78153207C9158A10169002D74E311DD11F58BFCCC0A19F94F67B0AE4BE81741AC8DC4FAE0B17B772BE126CBBBCE66CFB50F091A70D06F3B34E16ACB9C64532990A6417B30A2CDDE1C001151EC32E7018828124E75A0B74CA5AEE9B4C840D19C255BF72AB", + "identity_type": "trusted", + "iv": "E288D7A1DA92318930084F3ED9ABB505", + "key_seed": "C749179E61D827D1E2AD13B82A48420AB3E80D31F3749E950D292B64FFC08104", + "metadata_key": "3458741999A1025974EF63298E559796", + "section_mic_hmac_key": "A0AD19D8280DFB3DC84E5E68D7D21D5BCBFA9861B1F938660516045D6EB0C137", + "section_salt": "2CA0587BDDDBCB78153207C9158A1016" + }, + { + "adv_header_byte": "30", + "adv_salt": "F68BFAB3213C9FEA8A29A96007FEF64B", + "aes_key": "AC939B24BC933934398A7DC7E7C46CDF", + "data_elements": [], + "encoded_section": "3790139505676F85CA392334B19BBFD5FEC47591100074979416628A37D9CAFB2C4C6F969B569001DB08F385C30A762FA0C410A5184226CC", + "identity_type": "private", + "iv": "465C6117431966DBEDCD888B5221ED21", + "key_seed": "41FFE0FAC77C1DCC8BECCFD8A7CFD4A7343D376B76CABE05961CD44B76BC4B71", + "metadata_key": "4F3BC40A440822F086DEF13754AF74A0", + "section_mic_hmac_key": "CB956645E987944BEB37C2416D24D7A10C0632E588677CCEF862E86B222C5704", + "section_salt": "74979416628A37D9CAFB2C4C6F969B56" + }, + { + "adv_header_byte": "30", + "adv_salt": "32AA8FD5DF4F49A764E9AA3BF5563C89", + "aes_key": "2B4B17EFB895251408BA5B6BE94B4EF1", + "data_elements": [ + { + "contents": "11E38C244B9E12BE76C03E", + "de_type": 935 + }, + { + "contents": "C8D68DB392FBA453357837", + "de_type": 335 + } + ], + "encoded_section": "539013851104503F1D2FA8E851450F39F7106F9110006634BDCFDE3CACB5C787430316E3B0F89001E28FEC491436FA0518D6DC6039167E200AF6348DBFD0FEDFB8FEE6D1783B34159A46C1CC91AB4AB161C3815C", + "identity_type": "private", + "iv": "1797CE15779604FE914F93871B2A0773", + "key_seed": "FCD60D691DC27E7FDD0206B28BF9466003A96D1DABEB7F0C59BDDA3BC5064BFB", + "metadata_key": "0F0F2E2D2C043688CADA7DB16B3890D1", + "section_mic_hmac_key": "28862BC1B9E7774DC66B319EDB52978182AF3EA42F4C71C8E0EAF65952C1DFC9", + "section_salt": "6634BDCFDE3CACB5C787430316E3B0F8" + }, + { + "adv_header_byte": "30", + "adv_salt": "31EE1C30D48B792D61C8792361D3E827", + "aes_key": "1B618DD81493DEDC935CA68511197158", + "data_elements": [], + "encoded_section": "379013A8533FB16D70484318D287A8CA1324889110001DF600D41D8D806C43B138C0F76AF20590024756A94BDABC6824F118571511BBB69F", + "identity_type": "trusted", + "iv": "73CFA325E5CE5D6698F14615EE65D970", + "key_seed": "41DED01B5C779ACF0BFF0641263BAC3406CF6D9F940124F033991297E0B77051", + "metadata_key": "CCCC858E3FBAA8E5BEAF59B3A3D530A1", + "section_mic_hmac_key": "C65B247379C1C47F50F977EE35EFD36AA14E52BC21567F3194977703D85B946C", + "section_salt": "1DF600D41D8D806C43B138C0F76AF205" + }, + { + "adv_header_byte": "30", + "adv_salt": "A282D0AC1842D0A4DEC37AB35AAF4CA3", + "aes_key": "EB7AC26A007B152D033F713CF425D8CE", + "data_elements": [ + { + "contents": "BB5234C9FFD150ADF4", + "de_type": 109 + }, + { + "contents": "185CDC775AE199F0D4DCBEBB8BDA97EFF10C482C52", + "de_type": 390 + }, + { + "contents": "B8D8C33864D21722A1F339216199", + "de_type": 488 + }, + { + "contents": "7942EA3BFACE24FF26C6262F", + "de_type": 3 + } + ], + "encoded_section": "7990138E46F32DFCF3DDB81D6678EE5B9C63C5911000CD7C017292A595A9B91C2A2B0401869290028E1A072B7F5D1AE4EEBD4D3D86C6DE12AF19C45A34F2EE9C79FBBF8E559BE622359C2B632F0714D0303BC8F400263F191FDC55E7098617242A7DF0D5F06B3C3640967F57123DFCBF7263650532D6344C45C3", + "identity_type": "trusted", + "iv": "39B8DF03463FE9A4F1B74EFF99C79633", + "key_seed": "C71AB1872D5CCA2A8AEDE667988CFBCE2EC9AE649062896938D414E9D0E94C4B", + "metadata_key": "B8F3CE213E6E058AF15E956A1DC2036F", + "section_mic_hmac_key": "7C4B63E31AD2FC40AE1D4F8FBF141E0ED08B79FCA7461892C1C8499B73746887", + "section_salt": "CD7C017292A595A9B91C2A2B04018692" + }, + { + "adv_header_byte": "30", + "adv_salt": "B32A72E57DD180C1CD78E0D8FF198BA8", + "aes_key": "0D3B48E8EC2B06C29C96BFC6C538B656", + "data_elements": [ + { + "contents": "5364835176EB07D1F5FC", + "de_type": 584 + }, + { + "contents": "C3492A918E552550E781328B57B40732977328B1325260", + "de_type": 927 + }, + { + "contents": "7E7B5AC1F3EAB30D71429C27667ED35C200476965C78F1CD5FB3B9", + "de_type": 578 + } + ], + "encoded_section": "7C90136A1B890259C14A52A71914369DD5D7C99110001589F7FFF55BB13258B8CE9E93D31AAD900422D15C630478F6F2CB142D46ABE22A98C9C015432E7F6FEB0A922F53F45B513474F47C5068F32ED60CF9AE88147CC957851A4329A9F7116C346481BCE5AAD0786AFDD6D64E9131C36B262750FD4892F5774653BC94", + "identity_type": "provisioned", + "iv": "AC90BA5B1A5D39BD2241EC7DDEA4DC18", + "key_seed": "06405596E394DE2A69B5B205F00E6119A4E9298EB253DD391B582C1899418AD6", + "metadata_key": "68A1C5DA1051C2B604AA05DF6AB59EFF", + "section_mic_hmac_key": "20FA4EFF48BD8E8FF5767A4C79CB2514AF91DA13218FCB63B280F6E41B2A5A26", + "section_salt": "1589F7FFF55BB13258B8CE9E93D31AAD" + }, + { + "adv_header_byte": "30", + "adv_salt": "A9B066473BAFB379F0937FB47F15A38B", + "aes_key": "1F660B42014F118AD25C2CC166226920", + "data_elements": [ + { + "contents": "BF96B6727B448D012D6E42D0", + "de_type": 521 + } + ], + "encoded_section": "469013E4A9322645BED3696A4B6924B4F0A52991100086EC145F4758FDC6D5940C864029656B90042D74437259737DDF7606D3750D4169A0F8A316FA278CAAE53B69BA3726EBA8", + "identity_type": "provisioned", + "iv": "413F7FCDB4FAB753817C2ED9AC9947A1", + "key_seed": "7716AE85F2CD4F520438500DE48432F698519CA01622EE802DCE849E2C162DE0", + "metadata_key": "0B16502A04A879A8EF6936331C7495B1", + "section_mic_hmac_key": "33E577635DDF21CE36E3FC71944393BB3A65B2F1BB67E2015AD4903B47AC5A7B", + "section_salt": "86EC145F4758FDC6D5940C864029656B" + }, + { + "adv_header_byte": "30", + "adv_salt": "97A3EA2B2D4B897973EB658FF34F4FFB", + "aes_key": "67C524B281D8BCD2C51C74F057CB2D15", + "data_elements": [ + { + "contents": "0A2B142E42BF87F21293", + "de_type": 11 + }, + { + "contents": "733CBBDA78C13C5C598CE34EE9A25453EEA0", + "de_type": 847 + }, + { + "contents": "D53872CC070BBFED0E5262FBEAD45A6ACD9E1AE50D", + "de_type": 171 + }, + { + "contents": "A13ADB931426EAD3B2657C23CE0B4F7E4FCBE44C1E047F28548E05C8", + "de_type": 672 + }, + { + "contents": "69AF37BF3DC6FE2745", + "de_type": 258 + } + ], + "encoded_section": "9B9013307A5B1D45053F33A0B2BAFDA032BD36911000F7D66FB12A2DCC5B9F5721066CF56BD39002E94F726AB64C08ABFF473FC3305DCC04B7258913115974B4B93FCBE7A65FD568021B184E299F44C4EA92B3FAE0ACC6D93051DF07F74402A0578D82079AB9D2E945C10D679D0EEA5E0A18D390EF17347E559C75216632ECAE4186375EC728ADAB7E1D02DA5D9E8DEB3C1796BCC23BDEFFFF075C8B", + "identity_type": "trusted", + "iv": "EE833340C3ECE7ED2E42BE6300591A2B", + "key_seed": "5D1FEEA2E15BE812D6E7AED24744EAF066D2044226E1E5DBC215554C4BB21565", + "metadata_key": "5C81700C6F3E2DB99FD9552A1BF8DB62", + "section_mic_hmac_key": "C971E149AF0700BE9FB8A4042F0F02EFC26EBC99141EF025E270E9C6163291C1", + "section_salt": "F7D66FB12A2DCC5B9F5721066CF56BD3" + }, + { + "adv_header_byte": "30", + "adv_salt": "CCB6F827B0A39B6DA8437483DBBF4D21", + "aes_key": "B86C31C7DF4004CEC6B64D8268246F4F", + "data_elements": [ + { + "contents": "1B0FAC5F09165840F1A1FE0A", + "de_type": 108 + }, + { + "contents": "F9FE53B7E86EFB5778E5DC56F8943696", + "de_type": 140 + }, + { + "contents": "", + "de_type": 286 + }, + { + "contents": "C37C58E8968BC63240", + "de_type": 927 + } + ], + "encoded_section": "67901318528A80BAB7CEF27243F8F7A4543D879110008548036C89FF90B1763514205225BB619001FF05FB9C4AEEA7AF5787D23CB730BF83763C2D88740CEFB3E59A6EAC8AD289FF580611CE23391A41C7F3DAF763834D19D9FE31CCA279E335BE82B315BD028572", + "identity_type": "private", + "iv": "7D75415A0D1DB4D65196285773255E16", + "key_seed": "CB2A52478DCE6738675A0501FB4A696A3B8B00318F9BB4C371B67787BDE29E89", + "metadata_key": "76683C45B626D1230AFF1F9E0BC84030", + "section_mic_hmac_key": "D8D2FD272E460779C37FE7AD1EE58C11D9AD119BB803C8475E10CF79AA7768AE", + "section_salt": "8548036C89FF90B1763514205225BB61" + }, + { + "adv_header_byte": "30", + "adv_salt": "7664168CD02E2069535A4E243B03CD58", + "aes_key": "0761688645B584019E0611E1C100DF33", + "data_elements": [ + { + "contents": "055E128D435B74BF4919E3FB6DFF9D061E767FC50A6297674C028B", + "de_type": 817 + }, + { + "contents": "7EABC7A23844D21D3F31940E823FD60578626B7433E1C78898228ECEFE", + "de_type": 343 + }, + { + "contents": "90817D2A59F7ADDF55B1F55B63E85EEE95BAA62408CEB897", + "de_type": 245 + }, + { + "contents": "4787FEC44DF779FAA45E2CF681ED86C1140EEBC15F2D5CA2DB4C", + "de_type": 28 + }, + { + "contents": "053A76", + "de_type": 807 + } + ], + "encoded_section": "B290132E644D92825A53658AA88F3973AC5CB7911000293CE3D52ACE5D4C36736E0E05C8D3D69001CA7AAA50EB4888A43CDF55FE4B94013356209D4986FD7A74DB8A22B93C63CC29BF4CA30AA7D7976F33EF594EACCAA5A474C83D32F1FF7CAF7E9D0910961FA375084AA6C5A2F6E84D127C042BAFD09A63C6B0D4C4EC8CD84B8DE1711059E3C7888997D354606256ACB6FFC3A3E0F754C29D0E4D6553763C1E6DB476C138AD90AD24A46CAA585F509F2FDA59", + "identity_type": "private", + "iv": "A583849D6D43B5E8D8F1ABA5EDB4C673", + "key_seed": "62F1D6EE9DBD290B2AF80AEDF635E14061025F9F279BA55CF7DBAA16DAB16B2A", + "metadata_key": "728F086A73B981B52399C3EA8383A77A", + "section_mic_hmac_key": "10B4AF87157247C3D06140005B0B1CB9FD71C023186C277554E16664928A2168", + "section_salt": "293CE3D52ACE5D4C36736E0E05C8D3D6" + }, + { + "adv_header_byte": "30", + "adv_salt": "5D2A3F63294D83FBE4110C3572F502E6", + "aes_key": "DEC1B7CE58A15E488E53A99B0F6BFFC3", + "data_elements": [ + { + "contents": "F08F328184F706111296A6858F64B43E004B476D86", + "de_type": 675 + }, + { + "contents": "71AB692063473C3F09B6CC52884D2ABC5AA5FEE1435B132501", + "de_type": 762 + } + ], + "encoded_section": "6B90133B241ED22261B210B755B93C3A46339091100024260E21CF1C1B804AF8610EFD1D40A09002BC1E6FE55D438C0A979D8E1724DE2BE88EF49E4DDD021A7BC6D62683FC44DF4B206A475FB56B25CBE20A145DB816E7978E6D0FDA3A29DB4343D410304FBB85C4911BB4E2", + "identity_type": "trusted", + "iv": "D109C7AA8A9C2F502F7FF2795CF0536B", + "key_seed": "DE5BFF67545C1EA0965F927F752EA57236A0A8C07CF1E50C7B05FFE90CA3C080", + "metadata_key": "801F239BCD59F71BFF3DC29C1873141B", + "section_mic_hmac_key": "4DDC01519083DEE233FCD693B2DB1D50D74FF605ECA73C87D6656C2D9E555AC8", + "section_salt": "24260E21CF1C1B804AF8610EFD1D40A0" + }, + { + "adv_header_byte": "30", + "adv_salt": "50AC8F669991D4D35BC8579D03EA514F", + "aes_key": "014FC57AFD464A8788B996F85C208765", + "data_elements": [], + "encoded_section": "3790134B293E541BBF4E5F17F0D3980C9BC00F911000A8451CCF678102437062C19C5E4A11D990019E221A17FAE3A828DEBA689D8C1F3949", + "identity_type": "private", + "iv": "41BAA5F8DD05B8E6A504D599EB74012F", + "key_seed": "DF5BBCE38A8C3E868522252DB57AF57F57DE993F9B34778A84C153BE8A2C36AD", + "metadata_key": "577EF6FD43FBBE8F66D434794686DE81", + "section_mic_hmac_key": "086C0B7B64863355C999983AAFBCF74E98F9EFD238F1A1502C7737E2883300CE", + "section_salt": "A8451CCF678102437062C19C5E4A11D9" + }, + { + "adv_header_byte": "30", + "adv_salt": "FFA2C3BE27EA9EFF4A305F6BF276932E", + "aes_key": "A46E740733F543ABD962D2EB312D93C1", + "data_elements": [], + "encoded_section": "379013C51DBD3329CE6072C8A2A027F942CAA09110003F972D62A949212CEE442B4835C560EE9001E0725CD65D4CBD335842C42F4C4A0113", + "identity_type": "private", + "iv": "C93D934B0765A1D6353BCA51589B87B8", + "key_seed": "3AC5766B4F5C28643B827A841A590AE959AB3558C3A148CFF3F7B833F00D2556", + "metadata_key": "0F7080BB5FA2AA4912BDCC9AF3DE46B7", + "section_mic_hmac_key": "9A78FCB3A75CD2B502005A4184563EB25D146A0CC58FF84C15054DBF869D6BC1", + "section_salt": "3F972D62A949212CEE442B4835C560EE" + }, + { + "adv_header_byte": "30", + "adv_salt": "2081A4F3811AEA051894C1C7C1B92618", + "aes_key": "BB7480392B142CFD23F98A73EAE37E87", + "data_elements": [ + { + "contents": "710A0DA64D8668024AE7", + "de_type": 532 + }, + { + "contents": "E3471D8E60F5875C808ADA60850B01BC1F5EAD6FA43426707D", + "de_type": 847 + }, + { + "contents": "32321B333D25E24FEABBBC8E30A5EF11", + "de_type": 314 + }, + { + "contents": "8EE0E55F33EECFEEEA4485872C96CE", + "de_type": 110 + }, + { + "contents": "2BE0F48387594DB1", + "de_type": 585 + } + ], + "encoded_section": "8F901397FE42D3756E948C098672DBDE9977E691100034F3CD62875F1A61868DD445BDEBA97F900442F07EF844969ABE5029FDEE70E060604FC171F2C6B17AB9E9A6F9B6BB0470A8F72123B30060E88060F3BBE92479CC0E107F330460156C3B6E5626FBFED138195704ED5A79745A2864ED052A5DD4C5AACC511CEE38BD48FDB904CE5904FF96D2F8B224C8C91F76EF", + "identity_type": "provisioned", + "iv": "731E0DB31EB1F2EBCE317A8AC207AD78", + "key_seed": "C648836E062FE1B177659BCF66CE52DA92992A7F57A8C519EFE83B5498B83529", + "metadata_key": "6528CBC1D9D05B685EA0B5109357CC73", + "section_mic_hmac_key": "0E97851D27E9444ED828E6501A033E5F870F46D9D959BE6D0457EC79479A15B8", + "section_salt": "34F3CD62875F1A61868DD445BDEBA97F" + }, + { + "adv_header_byte": "30", + "adv_salt": "3B793A50ECB5E7F622EF1CB281DBFF10", + "aes_key": "785E875C44A1BF02579790F4C07B08F4", + "data_elements": [ + { + "contents": "06B033003DBD6E5EBA861C20D7A37D61", + "de_type": 919 + }, + { + "contents": "2A729E0AF9286BBF90B0A3A6B7591BFDEB2180100541CE38E5", + "de_type": 981 + }, + { + "contents": "E05FE95894D29247E78451A5FE0635C431E0", + "de_type": 555 + }, + { + "contents": "DCEC979BD3722E22464D4FDBBE6C0C36B9", + "de_type": 688 + }, + { + "contents": "E55C2F", + "de_type": 920 + } + ], + "encoded_section": "959013A64D93D01432AB2C93EE598ED825E09D91100096FD510E1761C11DEE130801210BE8B1900431467AF0C894A0E722ADE9F6CCB4A3717F37BC36E26D353D47AE9B2109D0FB52BF23597CA6A8542EEBA33FCD05B128629A04D68A50EBAE917CE307E285D79AC17CC088C8A05E4373896500AE0E3F6F602CAAFDD6FE64A4677E2090AACF1E2DE482EA152A11993C82B70415ADDE4E", + "identity_type": "provisioned", + "iv": "947D28352A1B86C1E2236B6E7531F60F", + "key_seed": "6D6A7D942D7660F709710E81D2ADF1EB82B049264E83608CB61918C555C932B8", + "metadata_key": "CEF10E891EBA5BD00B6152A2FB251BF4", + "section_mic_hmac_key": "9817BF8D1B65414C53FB1C3D264F36D36B48E777DEB910CD87496157C57C60B2", + "section_salt": "96FD510E1761C11DEE130801210BE8B1" + }, + { + "adv_header_byte": "30", + "adv_salt": "F7978C49733680326C8CD0D6550F334C", + "aes_key": "17FA0908863D1B4EBDF05DD2F30A2208", + "data_elements": [ + { + "contents": "246638469C9EFAB7FA881C39", + "de_type": 219 + }, + { + "contents": "9C1A259E1FDEA4E0B5", + "de_type": 303 + }, + { + "contents": "55B6AB32D64D0080BE176569732A38EAFB03450CC7D2E1C21AD3", + "de_type": 892 + } + ], + "encoded_section": "6F9013C5B6C430D3A84D6611604E90B92AC9639110007CA3BE5D4F1E9798DC39FADA6E870C2C9001F8FC611C2B9508DF8AC88764822333DB1229A05449D35E67ABD092235B01D8037A3549EE3AA70482A187E8C872952FFA4A711288BFF30F493A2EE365E52C416E71D3980342F48B75", + "identity_type": "private", + "iv": "8BFCD2132085B890AD2C3E3A9948F316", + "key_seed": "21AC3F8D521DC1FF26D984A4B9BEDCCB8C311FA31B3E5575A4E3AE671DE012A3", + "metadata_key": "03F6987DA25955329DB9A2C50A879C02", + "section_mic_hmac_key": "5D51E2CC831C4B7548CE48A6643AFC127764F31FB9E865969AE10050894FC50F", + "section_salt": "7CA3BE5D4F1E9798DC39FADA6E870C2C" + }, + { + "adv_header_byte": "30", + "adv_salt": "88D9897749A087BA692088105D83C8DF", + "aes_key": "F7DD8EF76EC305BF6B46B1F99D00721C", + "data_elements": [ + { + "contents": "ECB141D6A91EB9DFD5A7943311B7910F15AA07", + "de_type": 369 + } + ], + "encoded_section": "4D901326351027E10EDFD7051D932A46A0BA25911000ADF3819989057AE9A61819927B7F8D1990047D54033ECFED457BB85532481D583A60A69316ABCEB31F91046C27D8FF7C844A9F662094F2A2", + "identity_type": "provisioned", + "iv": "4D9513DAC6E2B616C8E13E153897CEF1", + "key_seed": "BF5C7631979835CF4B4FF4EBFF456C8CD403C68EA87960B0E6851ED4EEA51CF9", + "metadata_key": "DE99D80A3652FE7BC2E467653CB29851", + "section_mic_hmac_key": "A270F8B7F2C41B15DFA09CCA748427572E1089E90F42CA3B98AA1FAC5489E166", + "section_salt": "ADF3819989057AE9A61819927B7F8D19" + }, + { + "adv_header_byte": "30", + "adv_salt": "FFAAF9CF08F2C0E4EABE4EDA5849880E", + "aes_key": "5579888FDEB07F4AE593D558E3FDDAD7", + "data_elements": [ + { + "contents": "04B31B6181ACE137", + "de_type": 362 + }, + { + "contents": "EBE943E23DC7ECD4C7425BA338B5BD3CEDB01706", + "de_type": 430 + } + ], + "encoded_section": "599013593827607D0CB872B3F9F9E7DD8A7E93911000C6121F8EFBA5B2885B32EC0AB3AC09C390013E91B3B7276D0F86C0C7FE864B96232017B450CDE11DB1322E7C8CCCE8F3F60BC173DCF5F6D4210A2F0FC39EDD71D0A4994B", + "identity_type": "private", + "iv": "067851344E70F915139C60128CFEF3B6", + "key_seed": "685763208F4D5F465E32B59BBBB624720807102E810D13E1B7ABFB08540E93D9", + "metadata_key": "0E8CFF3D0A9D7B2998DADD0D9FA14ADD", + "section_mic_hmac_key": "D56C9E377820AA656DD234E62C72AB224953C36A65126252BB66773F175A9AE5", + "section_salt": "C6121F8EFBA5B2885B32EC0AB3AC09C3" + }, + { + "adv_header_byte": "30", + "adv_salt": "445F8262587A527A2A50920D59873975", + "aes_key": "A0F36838DF419D50BC5C556466E1FC97", + "data_elements": [ + { + "contents": "16550C16A40A2C8A362A94BE50C6", + "de_type": 135 + }, + { + "contents": "", + "de_type": 800 + } + ], + "encoded_section": "4B90131D351EFBD9BAE953304D7A8FE0697DAC91100073AFBD6543076B300486F3EAB58E055B900104F18882A1DED7DED581EA73100AA9EC2F3F9173A401D05AF6BE5B4E1CCC8DF696E42C66", + "identity_type": "private", + "iv": "39A88826E22EB99F2CBEDB51171E3EEE", + "key_seed": "F226B3049DD530E4F60C4887D0A2FBFA987A8E1FEB72EA2303EC30A7147DD8E8", + "metadata_key": "AE2B15A2A9B54697E7CC405BDA81790B", + "section_mic_hmac_key": "6D21434215A1F6DF62E827E0268FECA28C37693611557B1C9342EC8E0C1D81EE", + "section_salt": "73AFBD6543076B300486F3EAB58E055B" + }, + { + "adv_header_byte": "30", + "adv_salt": "0557BC1D38283635FBAE13D02728AB5B", + "aes_key": "A9BC8BA7EAF519C7B85E5A01188EF50D", + "data_elements": [ + { + "contents": "", + "de_type": 63 + }, + { + "contents": "A3E5", + "de_type": 422 + }, + { + "contents": "D54CC7D06905667D7360AD193F3130425832776FCEBA2679E267B7970218", + "de_type": 285 + }, + { + "contents": "441597784AE289C3622CB239D2C4E8342231F4", + "de_type": 247 + }, + { + "contents": "C0336CD68C4AE63EAC656E3202C84B545813337C2A", + "de_type": 939 + } + ], + "encoded_section": "8D9013C536B4E39D9201EF3025185148B9453C9110002E9AA3A07F8D9A60B7E03ECF29BB23CD9001509E02E030DC3E8FB95C6BB25A5490B29B435418731DDC6F2FE41F742397A96D8A326826BA73E9839E1BFE0B9DFCF78A063AC0B5135173F31E0DB480B06A4617BF068C88B9CC04BD37BA5CAE862D0601BD1864DBADE74F3506CE064DBBFDA34DEB49C330D7A9", + "identity_type": "private", + "iv": "D8028895E10766DF8BA06D75C6A112A8", + "key_seed": "5493AE88E27447BF331AF54D9F82018ECCD1AADA9013D8FAB3E26434BB65B965", + "metadata_key": "14D05DBAB3A9EEE82E952390E0AEDDF1", + "section_mic_hmac_key": "10002B26833E9FB12D751AA88A90E30B7F8418BE8BDF2EDEDE47A8906C25C49C", + "section_salt": "2E9AA3A07F8D9A60B7E03ECF29BB23CD" + }, + { + "adv_header_byte": "30", + "adv_salt": "30C56C83215C76E99FEB30822EBC10A7", + "aes_key": "5BD799E5168D831A50AE88908D7C819A", + "data_elements": [ + { + "contents": "A52634A06EC8E3", + "de_type": 239 + } + ], + "encoded_section": "4190138560C2A340ADC9FB31AD47095F34482091100068B0F681E3A5DF3C78A44BA62217395E900165E94E9C7C34CED0FEE48824E2BD691A4C924F8FBA59DC0D5697", + "identity_type": "private", + "iv": "2180C4533853767495A5C245C4E6B7DA", + "key_seed": "EA428BE58334D369CB5803FF519C408C44B9C2046DA706B0FC64B3AC7855CF4C", + "metadata_key": "794F11DDC402D478236E4FE863A7C014", + "section_mic_hmac_key": "BA65D2678CC2A9F28B1FC79BD735A0AD94C978A183D80BABF4F7AEEADAC57CFD", + "section_salt": "68B0F681E3A5DF3C78A44BA62217395E" + }, + { + "adv_header_byte": "30", + "adv_salt": "45450AD30A7FF2646B7FC9A7498B48C9", + "aes_key": "C597783A6BEA9B14F749AEFD0554A10E", + "data_elements": [ + { + "contents": "A1BCA904A65BB84506FD4FA7B8F82D4E3E27F1FE06FF98C5F5E9DB841D42", + "de_type": 255 + }, + { + "contents": "9E22935748180AE8A2CB2552330AE84E0753C065271E", + "de_type": 398 + } + ], + "encoded_section": "71901354622DA8EA9F9CC2350BC32E57DE761B911000A833A0E92CA1E0347245C35E678EE14E9004CBDC2F1ECDC2364CEC12BB5C36EBEE053F2D6E806D60BF129AC37E800F49559211A0A8DA47C4F85BD5F5B500201022790C232525FD06CB7161A123892D9D15EA32303BE5439AD3EE6E18", + "identity_type": "provisioned", + "iv": "80E557930065CB90C62020A24F0A88B2", + "key_seed": "BB4AA3FBE34B70ACBBA908FA5F1BA74D9B2C8F521157C183AB94184F85BE6610", + "metadata_key": "CAF8352A2D518815C4687370ECA9B717", + "section_mic_hmac_key": "4A8327360B9E78473FE9E8CC2F68F19A6C2E7F3CDE21ABC007296E6F37103402", + "section_salt": "A833A0E92CA1E0347245C35E678EE14E" + }, + { + "adv_header_byte": "30", + "adv_salt": "2149BA09FAAB9ABCEEFC3F1ABCF9835C", + "aes_key": "320ED87DE4141376542574C62FB7F871", + "data_elements": [ + { + "contents": "58D1F10B05288C8BEE4CA01E515CAE", + "de_type": 472 + }, + { + "contents": "341278EAF7023A", + "de_type": 418 + }, + { + "contents": "7F6DE46EAB91ED", + "de_type": 443 + }, + { + "contents": "ED3F2FB7", + "de_type": 861 + }, + { + "contents": "89BD3EB3", + "de_type": 886 + } + ], + "encoded_section": "6B9013899F627C6E1410138BFFCE742BE143E69110003A40A350CE9225C732AC27C9BCD65F1F90020A96A446120DA7C8C20715B87789DA1EE5EB068690DDB044F346E8E5ED1BB493BF7AEA8873E8A3A02ADE54C073CFE9B2E4432079C89D84C6B302BFD02177EC6ADCEAB360", + "identity_type": "trusted", + "iv": "5F97B82B7494DB44B27135C54CAEC7D4", + "key_seed": "B6E611FD268D0E0B4C5F677B942115CF92D2E4C43B5A69E867A36EA2C68C1193", + "metadata_key": "F0917DDB2BE2193FC96B46B81675209D", + "section_mic_hmac_key": "B11E903ABDB58F30052E0A5046B2E2D5A987589D3365224F4EC6AC25BB5755DD", + "section_salt": "3A40A350CE9225C732AC27C9BCD65F1F" + }, + { + "adv_header_byte": "30", + "adv_salt": "24036FD2BE3DCF97D9DF963B68D92DCC", + "aes_key": "602B4616715273B107370D173ED8666B", + "data_elements": [ + { + "contents": "2734F55CC2D6B46C5C3B37", + "de_type": 963 + }, + { + "contents": "3ECD6542A74D7BE449DA6B40CFAD8D3809", + "de_type": 517 + }, + { + "contents": "49A3375EABF0AF0B26674D2879BB79F81C", + "de_type": 884 + } + ], + "encoded_section": "6D9013D63C809F3652DD6AEF44F7FB35794E82911000D146378477019DF7ACFE29254CA21A7490042BF103C5A38BFF08D3CCF725A0811B6427D6C9D8A87A967DCA5C484C6A45DA78801408E91C5E2E377FCA9E5686E3BA2C901532814770E0EED571C0D03BE53841A5A14EF7D7F8", + "identity_type": "provisioned", + "iv": "080A6136094FC17B1A16AD0BB82693C5", + "key_seed": "520DAB213766293AA52073574939FBDF3FF7FD6E440FE41FDA38840112D7D531", + "metadata_key": "22E70A8A5CE17D98948AA5ACE440250F", + "section_mic_hmac_key": "00DFB12A3DBD705121093901BC2D50BCFDD3173593307F9D4C37C9A0849F5446", + "section_salt": "D146378477019DF7ACFE29254CA21A74" + }, + { + "adv_header_byte": "30", + "adv_salt": "63C51801F768165BFC326E7C82FC1227", + "aes_key": "57B39C2DFF8CAE78838966761E9AD467", + "data_elements": [ + { + "contents": "049E77BF20D8B744640EF2F3C776CDDBA3BAFA2A88", + "de_type": 555 + }, + { + "contents": "15BCAE3F4B78785C16E4590DA228CC3B", + "de_type": 896 + }, + { + "contents": "78C11D80D8BBF31D3482C1F4162BA2FB5FD29B", + "de_type": 132 + } + ], + "encoded_section": "789013E816D1BEAA6F0661CF5A37AFF036BCA9911000B834A100C92A6653F03120CEC5F5592E90025CDCC0847E46F2131D454A6C3774B5EEB4EC5D6AE886A374CFBA015D8FD3336291586D08C141E3637002176BD3F4DA468C61752284262045D3F00A0F9140FC79FC7B3B380A311BEAA0C46C2BBC9790CB8A", + "identity_type": "trusted", + "iv": "6EB51E1B378E7EC195ED6131D5B917A1", + "key_seed": "D0FC05ABA9677770D9560F5CC298BB1CDCECE2776762070E9DB7729C4E6B1998", + "metadata_key": "C3DC3239104F41A29A6CA839846892BD", + "section_mic_hmac_key": "042BE96EE344DE41F99A6F9A99D74DE39B7FDB8FBDEA76CA4819BBBE76D1020F", + "section_salt": "B834A100C92A6653F03120CEC5F5592E" + }, + { + "adv_header_byte": "30", + "adv_salt": "5D2A54C35196DB6687A495E4C266042D", + "aes_key": "B94AF3DE4F31E07283C694BE118A2D39", + "data_elements": [ + { + "contents": "7F221D4C1A", + "de_type": 175 + }, + { + "contents": "DA7BF9A3C1F1A0F7D394FA", + "de_type": 51 + }, + { + "contents": "A3F5054FAD0E0B0F32", + "de_type": 693 + }, + { + "contents": "A0F34BBEA40E64", + "de_type": 514 + }, + { + "contents": "A02552", + "de_type": 259 + } + ], + "encoded_section": "68901328AFDD847D58B8E42C91D72766806C5A911000CEA2BF3A4917856CB02C3E535657238A9002BCA81209838C61B7DC924CB7F75B0954E37749E736DBBE2C06A20809D8DD342D1938A290C35AF882C1B7B937E58703E984E4CF794E70265512407A8E10FA031CAE", + "identity_type": "trusted", + "iv": "8828C505B304C04F4872D41049F59825", + "key_seed": "EE9FC69BD400B68041022770DC312DE8C66C492E23BE76579D714E142489B440", + "metadata_key": "66FEDAAD7F184A6C27481BD86869213D", + "section_mic_hmac_key": "FC34E258074AE77E103008524518165B04278B97935C89ED9DC45F9F1EC090C9", + "section_salt": "CEA2BF3A4917856CB02C3E535657238A" + }, + { + "adv_header_byte": "30", + "adv_salt": "4DE3C97760C9B8DE4C61503AB880C1AC", + "aes_key": "F92EDC38BB8DEF8AFE9BCA414079A5C1", + "data_elements": [ + { + "contents": "3D713A3004C3540EAC1EC4AA1DCAFE0989B228", + "de_type": 322 + }, + { + "contents": "1699702E3F9F64F6A2503415D312429EA274E049BC0B6B7F15756CD8B33A", + "de_type": 25 + }, + { + "contents": "37", + "de_type": 200 + }, + { + "contents": "04F9", + "de_type": 375 + }, + { + "contents": "D363E2343CAB2298956475C4F658C4609E77514ACBC58A40D75A0EA6", + "de_type": 62 + } + ], + "encoded_section": "949013A75CD13AE9FCA132E0B0BCE584544EBC9110002EB54EBE8F6BDDE1109D60F57C29DFB39001AB7FA220B3D56C65AF369EB529702C9C7D039249F3D56387AE4714EEA61FFC310A96DFE05402F7CE7E354D716A3453B583B9CF812A98E85F4EBB3C2CAF09E3EDD2916A57F6AC6E68EF5180301378077EE13E410C594525D5C0A37AD77495EC42117164B749E16FD6762651110A", + "identity_type": "private", + "iv": "C266A550D575D8E8A76B32E4EB60566D", + "key_seed": "DE0CA86B9DE2F53BC684E1E0546BAE9C1168EA4041E70FEA570B63D153B6E0DF", + "metadata_key": "772C23286C809572A8A7A4CFF6562106", + "section_mic_hmac_key": "DE9DD28EAD5F258311F9143A61CF1729938E1973DFC71EFA64BC3496B1DC2FA8", + "section_salt": "2EB54EBE8F6BDDE1109D60F57C29DFB3" + }, + { + "adv_header_byte": "30", + "adv_salt": "08591DE70D9203A4BD5BBFF0EB0923E7", + "aes_key": "84B87FAF5569BE3145FDF5BC95B8228F", + "data_elements": [ + { + "contents": "4B2619", + "de_type": 910 + }, + { + "contents": "737EA4568AD23835B9", + "de_type": 193 + }, + { + "contents": "7F16EDF05CE5CEF44F4669", + "de_type": 908 + }, + { + "contents": "997C7BAD1FA37D3725D2E58BDC87BD892D0A", + "de_type": 789 + }, + { + "contents": "38368E23CA2E20C2D25E0C36E8953D", + "de_type": 683 + } + ], + "encoded_section": "7E901392A0322C56CCB3EDBDA02426B5F20C169110007FC169892BDFE3C58AE3A9145B1945AD9002B0904135D3B0B28995FD2D3BB2AC63CCFA0EA80B4C2FE257692A1C3D46C2ED102D06679A64D95BBA7C65E41EAD48417AA853ADAF290012327085B183EFA9016EA3AF6365776548E4EE9509651AE6BAE0A1AB23DDAD8140", + "identity_type": "trusted", + "iv": "1EFC0B89733153C45C3F0B9952E7CA2C", + "key_seed": "E069DF1441FF9660D686BA2ED4B324F9EE827A41666AD3D72CECCACA3EDC1195", + "metadata_key": "837D4BDE2339F7E0760F507FD65EF0F5", + "section_mic_hmac_key": "332B87B53F48DE7951414290B387018BF70E2DD12A550AE288DEB8F082D5E3AD", + "section_salt": "7FC169892BDFE3C58AE3A9145B1945AD" + }, + { + "adv_header_byte": "30", + "adv_salt": "D3CD0C0B45D18C67D9FF4ABD9C00F638", + "aes_key": "EA252AE1D2F51097B0B3C59CD5394CCB", + "data_elements": [ + { + "contents": "9DA05D735D904142FC9820E859D3D2DAA3FD9BF99077EE289848BD", + "de_type": 729 + }, + { + "contents": "AAA29A80423195", + "de_type": 501 + }, + { + "contents": "", + "de_type": 729 + } + ], + "encoded_section": "6290139551860389CAB63CF19976C38F9F83829110004EAA5E6CB7B52006113B8227B50B6FAA9004F55AF889B0D3A843343569BBB9FBCCFF954C7B2085DDC35493039663D1859721DEC51AFCED18340265399F3D29A634266BD6F7B72B13904BEFFBFA", + "identity_type": "provisioned", + "iv": "33261AE9D64163AEEA6CA4780557B537", + "key_seed": "D276F97EC832428E7341153402EC817EDA087F3722092DFDCD33E3DAC87FCF9C", + "metadata_key": "B784A92864FE81EE00484C3407B19E18", + "section_mic_hmac_key": "BFF73B8A8684137A38AA0CE919F921F5E46BEB78CAABF9001A9829A91BB2DDDB", + "section_salt": "4EAA5E6CB7B52006113B8227B50B6FAA" + }, + { + "adv_header_byte": "30", + "adv_salt": "8F53DA57958205F65AF175946F0E7C9D", + "aes_key": "1AB05E4A3B94AED84AF5AC5AA0C34532", + "data_elements": [ + { + "contents": "70730B2189EDD115FF4146EB6736958B2131B4E758871206A7BD", + "de_type": 857 + }, + { + "contents": "0C", + "de_type": 50 + }, + { + "contents": "85363F2F6E5B68549DC14698", + "de_type": 781 + }, + { + "contents": "24B2893FBC", + "de_type": 493 + } + ], + "encoded_section": "6E901344842419D528E3354B2B62AEB7DCA816911000F7F26313B7593F64E2609508E29C568F9002ADA0099489D0829C5C03B5E34C36A22F4DBD656538D7A34FF22307009C917241BC3C03E863B498F7E744B781E4C97EE731D6C27BBCBB9B0BCD5049BE32A34F127AF7F262555E01", + "identity_type": "trusted", + "iv": "94EEED11E11DD155988B855D19007FAE", + "key_seed": "88182E258A729A4E43B5374B97A2C3B62F694B30FE8716172BC346A27E074B29", + "metadata_key": "5FAF4F9CDDA36DE98B4BE1111E7BBA39", + "section_mic_hmac_key": "EE0A1B46369F96415076C2C5C59FA7FBBE38620043D78E935340767C3094600B", + "section_salt": "F7F26313B7593F64E2609508E29C568F" + }, + { + "adv_header_byte": "30", + "adv_salt": "FD84FB907560ECF5CB2A9771A4BA8CD1", + "aes_key": "E3FD2A72A74A7EFFC6F4585CDC240D3F", + "data_elements": [ + { + "contents": "5BFF", + "de_type": 353 + }, + { + "contents": "56E6B22A147A51A7ADE3A51B1A4ABF", + "de_type": 703 + }, + { + "contents": "FA366A", + "de_type": 922 + } + ], + "encoded_section": "549013A550EB4A596D0709CC4831941ECD4B97911000BC96DC7FE5F9AB0C79FCB5C3427416309004EE787CB1DA498BB4C72EDB79F03197668CA9719227CA6D084FF44145EDE83ACE127060F8AF7A47BFA9AF03D7F5", + "identity_type": "provisioned", + "iv": "0A95F9333CCB2B0BFC001BAE3C585430", + "key_seed": "32F7B9337E17ABEA1D32339620554D78574F2311A7DF33FDC2040ECCEA22F16A", + "metadata_key": "0D7BC86218E42A4DE2ADCE4BFCE1CBEA", + "section_mic_hmac_key": "391BCA81E1EB5B64A6A5B48226FBC88361F80157D68FDEF21D159D765E89B1D9", + "section_salt": "BC96DC7FE5F9AB0C79FCB5C342741630" + }, + { + "adv_header_byte": "30", + "adv_salt": "2A020F8E4858919DA9912CD877E5D7E1", + "aes_key": "AB7BC14F98F82FC2F63DA94527EE1E25", + "data_elements": [ + { + "contents": "F206FA29E92D1E2CE7F8F97335171D49D7634167F9D24DA45945D7C5D1", + "de_type": 558 + }, + { + "contents": "BA45C18251ABB34EBB8A427E55B997260F451D", + "de_type": 686 + }, + { + "contents": "01F97FCD198286623C44DBB47FCC467BEF", + "de_type": 596 + } + ], + "encoded_section": "819013BB56AD1C58BC3238CF683D9C6A2539C4911000C5480A0E75D4E0A677CA57FB7141919D900153375B41C2A3EB1A8AE9D4F3123AF5908A597DD8279AB6D68BBBA1BC107EC58B6D083F21201D44FB5EB0C254DA392099B8F47BFB9875B67C498B3CFCF4069F9A2CAE853F967F1953305E8943E9B97ED439F16FC82AAB2AEE3CFE", + "identity_type": "private", + "iv": "496F077A2B7916761DD8AC728D556F06", + "key_seed": "F8E22E64BC77461311AB36F96475EAA5398D0080F0FBAE13F1C4492DF46179F1", + "metadata_key": "4E7A8A31769B49F87CFE1FD8BCFB052A", + "section_mic_hmac_key": "E5F81D3C2D13A10FF5CD9B863C512FA9E0D1AFCF813474F7666251BD055FBB05", + "section_salt": "C5480A0E75D4E0A677CA57FB7141919D" + }, + { + "adv_header_byte": "30", + "adv_salt": "2B2937852F695F8D56C725B0A6DED2B3", + "aes_key": "C7A0EC3BA5987EA8BCBECC13ADCB9CAD", + "data_elements": [ + { + "contents": "3686E921B3", + "de_type": 624 + }, + { + "contents": "13A0B207EA7A", + "de_type": 693 + }, + { + "contents": "5ECF29F01D38", + "de_type": 348 + }, + { + "contents": "E22EA254A7EFB27938D2E75677F7CE8741463254DE17C1EF", + "de_type": 413 + } + ], + "encoded_section": "6C9013B4F7525345C4D799DCC73BBD7D34A2A891100039E36002FD6A898C7113D8E29BBC18C9900288F3BFFF20D692ED112C8A264C6479AEE31F98BD1410ADB1E8B15E797F18DB33ACEA80FB761CCED0BE25F19B74AC2B7E7874E832E57995638165C3FB0222984E880845556C", + "identity_type": "trusted", + "iv": "6E6427719A16CE39BB3AD9ADED72A83A", + "key_seed": "948B5BB10F06A5C607E6FDD6631F173B7D938E80FFF8F4EFDFA1DF315933648B", + "metadata_key": "7419265431EE04AC211B9BE2072065E9", + "section_mic_hmac_key": "CEB322C685911AF93A57E15C80E40B410600BCBCDB1091D49F1DD58F55DEEE96", + "section_salt": "39E36002FD6A898C7113D8E29BBC18C9" + }, + { + "adv_header_byte": "30", + "adv_salt": "47F54618F90BA0470CAA122D068090DA", + "aes_key": "7D286DE8F9BA981B7AC6EEF116A30B8B", + "data_elements": [ + { + "contents": "8E6ADCC3529CB914BA44071D1039476F503534E24E9FAD", + "de_type": 866 + }, + { + "contents": "FF59C0311B6365D7B2", + "de_type": 482 + }, + { + "contents": "86E592766FBA32BAA8CB5926C68B9CF1757B30ECFC8B01", + "de_type": 865 + }, + { + "contents": "BDEC4494677D60C91BEDBC5613AA622C607D623763F1169835649EAE177D", + "de_type": 912 + } + ], + "encoded_section": "9890133504BB533122BC321979FD233507F92D911000D087206EE8701FADF74E29E64DC42B299001FEE75CADBFA905B7121329EEC77ED201DC81644197BF8BCEE765353ACA4C2D3E6E90F6331506C5A5180DC54AE4FB34B294F70F448EDB3EC9366DEADE0A63EFCCF7B495AF25DFD1E375F109ECF0D66BDC5C1706DA8DDACDDA0D76E109A3998263959F650F34D07BA4908FCCEAA47C3BD1BD", + "identity_type": "private", + "iv": "06092E39EEFF3F94DDF84FB4E82096F0", + "key_seed": "1CEB5B27728B3C394FA53039B1A2BB3963FDB1ABB971C694FF9B583DB4D6F4C5", + "metadata_key": "4BFF4D6A274981EEE3A41CFC71104933", + "section_mic_hmac_key": "71D0D24E9DF1CC8CA5705A5B97564B392020BC1E31103B902AC6109A20736FEC", + "section_salt": "D087206EE8701FADF74E29E64DC42B29" + }, + { + "adv_header_byte": "30", + "adv_salt": "A5CB335E0E651AEC76610103314BE5E8", + "aes_key": "2073B2C6E4A891FA1F4A94E6E0ED2D7B", + "data_elements": [ + { + "contents": "39992BB369E5", + "de_type": 403 + }, + { + "contents": "91A4A04160751875", + "de_type": 341 + } + ], + "encoded_section": "4B9013D868F86C9DABB0C962C104961D2199819110005F70263B58C94A534BA0732A362CFE759004F0376CB6B7C35E6A97774046EB8E11BE29D06EEC71C5300B63E76D1F743ACE32AB77D7C2", + "identity_type": "provisioned", + "iv": "8E45ADAD9A235A3A0131D1DD9B5F9279", + "key_seed": "CF2BF8EA55BEC2D2A5C15C46C09B9291934EBEAC7792D75702B1C1F56DD52AE0", + "metadata_key": "E227B26B4D3E35C8778FA1D40D326AF9", + "section_mic_hmac_key": "8FAC7D8677AF486D3DFCD671F2830A5CD938A6CA7E2DB273FB9AD603617425CB", + "section_salt": "5F70263B58C94A534BA0732A362CFE75" + }, + { + "adv_header_byte": "30", + "adv_salt": "F1C24DC0B003B6D25BD4C3F1BCB66285", + "aes_key": "DB76A3E8C87A935422EDDF2E573D2EAA", + "data_elements": [ + { + "contents": "87", + "de_type": 196 + }, + { + "contents": "24", + "de_type": 342 + }, + { + "contents": "C72C39FF57E7FD4DA1C96A5F6C71DBB7912D5E59351BA03CEC4C31", + "de_type": 295 + }, + { + "contents": "8418AD4C9FED5B9908", + "de_type": 993 + } + ], + "encoded_section": "699013C828BE6B34B2F3061396313E501C35C5911000FD1A8AA4AEE8DF00D003270485B8F7E79001E4A3421E4634FFB67FED3BD908779E411870A14E90F14AD32D3C9F8E34F0DF2F1E956F4586EBA22CCACCA8CDBF530867C4BA55BDE2D461D3BD331F384361963326F8", + "identity_type": "private", + "iv": "C3A642B990DD53C2652267D0D74140F9", + "key_seed": "103EEB5230E3A94CDE86DE361742D42DA89715178B2EEB054192580C46FFEA86", + "metadata_key": "AACE9616D0BE1375E9501E23B9AD5A27", + "section_mic_hmac_key": "EDA3F8BD268CA694571B96BA31002C4C1F0780914645F09C3F41CD2D89E1ED87", + "section_salt": "FD1A8AA4AEE8DF00D003270485B8F7E7" + }, + { + "adv_header_byte": "30", + "adv_salt": "3D1C4D57D1022E2E34A436AB3BA2925E", + "aes_key": "95B5084E465C6C37973DEF1CA3DB47AD", + "data_elements": [ + { + "contents": "C1A19CFE869417D14BA0812EDB723157572FFE02431EB51B", + "de_type": 536 + }, + { + "contents": "", + "de_type": 606 + } + ], + "encoded_section": "559013E83D70079ADAB5FC3E1F844299D6B9319110008ED6921AF82E82864706EDE25EB3796E90042DF36874DAEAF11DBF9CF1F0CE2510156BC023B8D936F09D7BF3005B068697F171958A92CFAC237954E57BAE73C1", + "identity_type": "provisioned", + "iv": "D77A9FE328C32C11C38DC06F43475909", + "key_seed": "5BFA074B8A029B3617D2CA1EB0C5CCCC9AE733C23AFAD5EE72D0AFEA1B43E96E", + "metadata_key": "0D076B70D9757FA46D1DF675985EBCC2", + "section_mic_hmac_key": "13ADE797F4AC758CDAF7B19222516722967586D6742B514E8AC64DA36EB958C5", + "section_salt": "8ED6921AF82E82864706EDE25EB3796E" + }, + { + "adv_header_byte": "30", + "adv_salt": "65E6464F45B5C34BC2B3ACAB85653A62", + "aes_key": "4202E0AD401A9919BE9499177FBFE027", + "data_elements": [ + { + "contents": "87DE98B78C4998378DBD3D8513F1F4252089430D3ACA43E8A9C52F", + "de_type": 613 + }, + { + "contents": "30DF522A56BC545C1B8371AC0DA6583C415464F29CE827339312A5144F0F", + "de_type": 275 + }, + { + "contents": "080BA02D47A3D4AF7BA94C1FCBCB70A71397E14206B6", + "de_type": 264 + }, + { + "contents": "AA6BF69B8ECD8613C95DA243320D4A2581", + "de_type": 349 + }, + { + "contents": "9007448B4D1A1C6824EF74406318C43421622D8177933E1B469088FB6B0C", + "de_type": 763 + } + ], + "encoded_section": "C490133190D16D406DE4CDB486C62178AA7FBE911000C0CF7E29552F1C72FE58F39607FED92B900121CD625287C4ABCC300868F871B3F9FC36B8E82A243F4B7C1DBC00236FE4F0F2FB2B215B8016040357A368672BF3670175DE4E57ACE0E68FC1932303528CBEDDA764DA369F6164070F860C86AC90D6C4EE900AA58F37AAC2CA3C92BBACF0556A28BB264CAACB5DD6515F19CC3F31808CC7341D23593B63166186809F4492CD86A1AB181FFC1F48D7AE759BEF015427EFF04FDC794559B7DB7D33939531", + "identity_type": "private", + "iv": "33A37770A90581B66BF440E910ABED3A", + "key_seed": "FDA2E31760FC708DA464AB0C68FE2466846222FF391F483BBDF194DE7ED3507B", + "metadata_key": "55850C28AB36C0478C59455F908449DC", + "section_mic_hmac_key": "A5F0E47EC740727D97426B01CB0A1D498373E14B2A42964940274954B9CAE4D6", + "section_salt": "C0CF7E29552F1C72FE58F39607FED92B" + }, + { + "adv_header_byte": "30", + "adv_salt": "9FAA7146038C8FBF5223B3F4EF402B4B", + "aes_key": "FDADB3FC15C2748A41A7BD272244731F", + "data_elements": [ + { + "contents": "C888F3DA553255168D1C6C687CC86D8A", + "de_type": 401 + } + ], + "encoded_section": "4A90138C466CF8E025CD72F5C052580230B0A2911000D14BDC42045F83B2B03EBFEC15C42AFA9001E0A30A11CEE658DCDEE4B62B6134BE16B6F2C5C92F4571BF6A2CE1AF1A360FB9C19792", + "identity_type": "private", + "iv": "58E287FC21B6D4FBCFF5C9FDECA731C7", + "key_seed": "79E63CB8F2025BE59AAAA0BCB7AF1C9876DF9E2C8774637887557F11C87913AD", + "metadata_key": "B6F890E2A81B7C0173C0AD1725402695", + "section_mic_hmac_key": "C0B180C437E5BC877605ABC2A30E6E008A6365DF291026AF19F181AD62BB5F3B", + "section_salt": "D14BDC42045F83B2B03EBFEC15C42AFA" + }, + { + "adv_header_byte": "30", + "adv_salt": "5844853779D722DCE751CE513B2A0B37", + "aes_key": "6062FFDA23EB1FD510C3672BA5B92CD4", + "data_elements": [], + "encoded_section": "37901343D08516A6126826C2F77055E624363E9110005BA67B0DD13A87E2209A8796B4455C2690014158D669F5C62F236538C822C5994228", + "identity_type": "private", + "iv": "5FB73671DC2F2B6A48245CA4E3FF1D1E", + "key_seed": "819ADBF5BF607833105976ECAA2E3BC5A8BE1B5E73BB11A7967B93ED72128AC0", + "metadata_key": "4467ADE4F732BB4F0AABFA43606DDB89", + "section_mic_hmac_key": "5462BB3C170727E8601FE06BA4B954764D246394D912E56A085567F7148F0144", + "section_salt": "5BA67B0DD13A87E2209A8796B4455C26" + }, + { + "adv_header_byte": "30", + "adv_salt": "3A49403C60AC65B85C47FF2D1DA45B21", + "aes_key": "F94C9EBAD0A9A3608BAA2D0DC0493BD2", + "data_elements": [ + { + "contents": "9FFF46ED", + "de_type": 411 + }, + { + "contents": "03765D84D65C1DF5BA926D5FBB496AC914", + "de_type": 959 + }, + { + "contents": "2D34BC69CF", + "de_type": 64 + }, + { + "contents": "2456607795672BD7C8E7EB4A79BC6F71970608BB0D6F2E", + "de_type": 350 + } + ], + "encoded_section": "739013D459BEAE4BCCF848831FCFD6DF0EFC259110000DBB0E6CA11CFF6F16ECCE6188E4A1E6900164CF5B4306C90D677539B05AC8FC468C7048FEF75FA4C486D0BC50038AF5620F863D111F441579478FC7474B593EFF0D59E95AA2AE84A2E2D95EDE9FCB7E6A4F669A645B7BAE8A41309ADD91", + "identity_type": "private", + "iv": "6BA0BC2764992CFFC2BC748EA0A61698", + "key_seed": "2E4F8F58A9D66315331FF83B8BC341494998670500C65260040444A67847649F", + "metadata_key": "B8653FCEF2F9771634F76E509234296D", + "section_mic_hmac_key": "35AE4A49D73CF2763F80202B81F55F4D2EC375FAAFF14AE60F00F7F706D36891", + "section_salt": "0DBB0E6CA11CFF6F16ECCE6188E4A1E6" + }, + { + "adv_header_byte": "30", + "adv_salt": "7B2876D1294D35C9A633642CDB531043", + "aes_key": "11BD09E553C69F31A441EB71286BF702", + "data_elements": [ + { + "contents": "1CD68F", + "de_type": 821 + }, + { + "contents": "D6758EB514", + "de_type": 58 + }, + { + "contents": "A2AB3B5B6DC7B404F1EE0B3AC1BF3D67BE64619453F5CBDAEDF225", + "de_type": 19 + }, + { + "contents": "A1A3542F7C661B7FECF56442923CC27152C365D245BC303D", + "de_type": 108 + }, + { + "contents": "9E18754BFB", + "de_type": 629 + } + ], + "encoded_section": "83901388E29374A47FF296171738B1F21D9DF491100032A08CD56B7AF49208B0A3A16326B62B90024A5CADC6674D9B1CD6D74390D279F841B4DF78C1F7D6A08A6A747C6D706FB7070AF8C54BADE0743A9A1DF40953ECAB8DE3D7EB5740B3633E669A3BB14CA04B83453B23E532BE99A7F576D1F3DC5261238A734521217EDE09D908B365", + "identity_type": "trusted", + "iv": "478031F97CE799ECA7A88B9B742BACF3", + "key_seed": "124837A26828865520BB821F0833993EB6459AD3F6C4A3A9E9E3743363CA0FC1", + "metadata_key": "0F6C4FA4BA7A110CCAC6F1E253D86578", + "section_mic_hmac_key": "3366BD2EC451B292C053D75DF63AE820D999EBB1E4D608ABD71D9EE7F17CD6D0", + "section_salt": "32A08CD56B7AF49208B0A3A16326B62B" + }, + { + "adv_header_byte": "30", + "adv_salt": "BF1F3EDE71CC0BA23F3E9B5188DCD74D", + "aes_key": "0D34EA39D00C9491832F0C0893FD98E3", + "data_elements": [ + { + "contents": "C8D6F76BFBB24D", + "de_type": 615 + } + ], + "encoded_section": "419013A6981580761522A9EC4FD894D95FABFE9110000903815A6E8B791AD5B98D3F84DC737F9002828E33F525A8188B2C7FB787101D4E1B2D25346336913916CEEF", + "identity_type": "trusted", + "iv": "B462E5AB2AF8A646A3EE86F73E576561", + "key_seed": "317A34230522CA4E9A39A827F78E044E63D1882E174AF27CFC3158E85FA7BCDE", + "metadata_key": "A16F43B5C24F051BE891FCB6429D5625", + "section_mic_hmac_key": "83683A330870E963D7B405376CAD9952CD313DEF8469F90D6951A0AF7DEF9F63", + "section_salt": "0903815A6E8B791AD5B98D3F84DC737F" + }, + { + "adv_header_byte": "30", + "adv_salt": "B96DEA316DEF89973732DB62BC4432A7", + "aes_key": "C91E00B32F96ABED4FF0122583AB10B2", + "data_elements": [], + "encoded_section": "37901325B6BDC8A60672158F093819CF704ECE911000BDF2DD53B2723CF84674A938606393CD9002AF993A3939824B86FAA22B5B45F758C3", + "identity_type": "trusted", + "iv": "BE5C727FC20CAC7FD9F537FA14DA7E18", + "key_seed": "489D396A25321A6241DE317FD48F88BAB3D8626C6C642C33E4D71ED80C33FCFC", + "metadata_key": "B16BE5F80A589EAAC9F6CE6E40927214", + "section_mic_hmac_key": "DD060E89B2C731BAD9F3B541F17841047A27DFD12DCCE92E2DEDD6D72CF17ABE", + "section_salt": "BDF2DD53B2723CF84674A938606393CD" + }, + { + "adv_header_byte": "30", + "adv_salt": "B15D76E91DFA20E5D94AB77C272AEA36", + "aes_key": "08F89BDE3E8CF20DAA15650BE114AF90", + "data_elements": [], + "encoded_section": "3790132C20330BF7AD2A9D6356023F542CE510911000C28E44A518BCC0A1AD058B4EDF7778849002A89640F16E3ED67F7EC86AC01434665D", + "identity_type": "trusted", + "iv": "4ED00D1E66EABEA0AB30F9ACA64C3AB4", + "key_seed": "F4052897D21C7FDFB463D86A3F70F43315969DD6C35D4E2F28E5C5FDC094499B", + "metadata_key": "A9CC5F1CC6D129AF1BDE07EC54685F86", + "section_mic_hmac_key": "1B1A2DB91F5F90BCE7D03F7F283476DB0E6F856A317A3B29747114D6F7543214", + "section_salt": "C28E44A518BCC0A1AD058B4EDF777884" + }, + { + "adv_header_byte": "30", + "adv_salt": "B23518E75C4291C3FF45E230AE8E1144", + "aes_key": "0EE48AA7E17EB7AC213E0251F5863A43", + "data_elements": [ + { + "contents": "E8397D814788CE2F20C774EDD9A8", + "de_type": 38 + } + ], + "encoded_section": "479013B7680C78524B27EF19239EE7409C867A911000937FD9077FE6FE41C87FF58C9760628390045396E7CEC68FA85BA56F754D53A236C80B709D69201120CE8DC52D023F63EA2B", + "identity_type": "provisioned", + "iv": "70E0CF8376E6263D6D39221A279FFB74", + "key_seed": "C1CD56FC8895CFAF52047C5EC6E4B555A2A3FBEA8078EE18B88DF10D073D3D20", + "metadata_key": "C409D3270AC018858924F1620EC07CB8", + "section_mic_hmac_key": "FC9B097CE0223CF1D7719C00676607E1D99B792D993450C7E333EFB2342D5AC7", + "section_salt": "937FD9077FE6FE41C87FF58C97606283" + }, + { + "adv_header_byte": "30", + "adv_salt": "FE111934B0B07379A319C62F558B8EF1", + "aes_key": "BAF0EADC4EAC7805FF4CB8B5BBE3E33B", + "data_elements": [], + "encoded_section": "3790139B8CC25B1E6EE84846046B6606A9FAEB9110004EEDBAD6580D5B7A26ADC604E4AE5ADB90023E2A49EFB0DAD66407994E861FC7931C", + "identity_type": "trusted", + "iv": "B9F42C9FC19969B3C708F54B1B2D2561", + "key_seed": "CA99DFBEE06974AD30031B9482C62411610D1DE2B05E1977F969FAFD860260B5", + "metadata_key": "7EBA70428E31280F089029EBCCC28E53", + "section_mic_hmac_key": "B7A04163665233F6DB80BFA0E9DF284676010DCC138FBBA97019550EE0505C71", + "section_salt": "4EEDBAD6580D5B7A26ADC604E4AE5ADB" + }, + { + "adv_header_byte": "30", + "adv_salt": "06340305FD9EDD7CA6E97F5F03028D41", + "aes_key": "4A3AE192FE98DF88EFB792D9244CB3C2", + "data_elements": [ + { + "contents": "17A7D78EB34F", + "de_type": 40 + }, + { + "contents": "6CDD9B23F45E60C6", + "de_type": 13 + }, + { + "contents": "5EB80DA49615A9313378E994B31F96F8B3C2C926", + "de_type": 132 + }, + { + "contents": "38130E3285", + "de_type": 514 + }, + { + "contents": "B43389EB33CA74907A7A4F86FE1AD1", + "de_type": 916 + } + ], + "encoded_section": "7A901396619F2B2B94F7F19628FA1F51785B4F9110002340B336B5C2E124737BEF2F43F197BA9001ED28FD63D309949B6BED96D0203D4FDD41B32F847342D156B990DE7DFF2408A202690C74A8F5CE1C8D7A709CE7D85507215D173F3850F3C1B2CB91993E340431B97110F563A286331D4B7103DCBA697904EB30", + "identity_type": "private", + "iv": "11DD03FA6DB092780B048EBD3113CEE0", + "key_seed": "7945F877F9D98C7610CE29F45369C662E303A8F5A326BEAFF9F0FB55611C89AD", + "metadata_key": "3FB05DBFC8E615E495E1BAD8431FCA80", + "section_mic_hmac_key": "FC6524ACBEEA7CBEC81E530F33889F7C852A85E4108B48F1BB2CE77B7AFFDE3E", + "section_salt": "2340B336B5C2E124737BEF2F43F197BA" + }, + { + "adv_header_byte": "30", + "adv_salt": "62114838135ABD22F7D172D64A9F009C", + "aes_key": "3757133FEB278857689A7FA8C48C2A3E", + "data_elements": [], + "encoded_section": "379013CE7AA72E7E878D42F249B992DB2F7173911000F0DE28B972676F2AB092E80CDF67018E90046FA72EA86F5EDAAA0F8CDCA981D5B00C", + "identity_type": "provisioned", + "iv": "28D18F45C5B8ED0408635743FD12CF47", + "key_seed": "EAB98A97C8016D997690C36C1AFB9B27C179D64C4A95BABCD5B30D160EFCE103", + "metadata_key": "1C58B34BEC2709A3E7F68157AFE44195", + "section_mic_hmac_key": "A071066F9D28C8A5318A2E186015463596B26CE67FA85080E2E0C1BA3FA7BF02", + "section_salt": "F0DE28B972676F2AB092E80CDF67018E" + }, + { + "adv_header_byte": "30", + "adv_salt": "1C180AC933FBF1E4BCBCDB69BE0360C6", + "aes_key": "705839E944B1F2E9CD381E4E53EE5B8A", + "data_elements": [ + { + "contents": "AF617170EC2294888C20C8A3B43BB3AC96", + "de_type": 12 + }, + { + "contents": "E8DC15F1D350190F674791CB", + "de_type": 745 + }, + { + "contents": "142A94EC2E864E33", + "de_type": 311 + }, + { + "contents": "A0DFF75C7969634EB2", + "de_type": 940 + } + ], + "encoded_section": "7090137A7BBAF6598BF52772377F42EBBFC25D911000BF57CBF05D69C86F976C9A93BB7DD05990044ED30E5FF146DB04653AB49241949BA2233DEF5D16BDCFA8E61DEE02A211BE46C56D05AD868F1FD3229443986B6BD054D49C895EE0730BF53CAD53C8E84AA47FDE268B61F2343BC294", + "identity_type": "provisioned", + "iv": "566F3A2DE9C6FEC6D2FBEE1645AACAC5", + "key_seed": "CE740FB16B092B7AE502759E36C49BDC5B7A2FA2E97AE29FC9E0B9D2CDA72AA3", + "metadata_key": "C74FB2EB350DBBF1969E3A9691508933", + "section_mic_hmac_key": "1B8D81AB3F79239B973E2C8E73954ED1B5127289547C38CC71BFD0ED9552AE9E", + "section_salt": "BF57CBF05D69C86F976C9A93BB7DD059" + }, + { + "adv_header_byte": "30", + "adv_salt": "26C852943966AC80964F71AADDBF07AD", + "aes_key": "B4D2FBE9AEF3417552263603D22318B2", + "data_elements": [ + { + "contents": "4453D6586D1F59DFCBC6", + "de_type": 203 + }, + { + "contents": "8A3CD10D1097BF", + "de_type": 383 + }, + { + "contents": "05AC77461449443D444D10", + "de_type": 209 + }, + { + "contents": "24", + "de_type": 176 + } + ], + "encoded_section": "609013CBADC624AD2C1F25563EB4BBA865B8F0911000083E4B25DF44E64CB1F9987202D5EE2990016AACE26DEB07CC0FF6D7CB2EDB3B7049A2E9481144AB66F3998841BF6B369CCF56E5878E5C1D2C17A031CE097D4F9B7E4B71CC190F7B637F6E", + "identity_type": "private", + "iv": "71A9F7A9ED012D7D0A3B5E1665C533EF", + "key_seed": "5A0B49C13A755D3C39FB51201D79662CA2DE0CC5DF1853631D2495F78A55490D", + "metadata_key": "441FC2E790A83563ACCEB1D121B02A5A", + "section_mic_hmac_key": "DD41E3D2F17A81A9B4891E0B07B500140C19E3BE96876B7E38CF1B4DEAB3078B", + "section_salt": "083E4B25DF44E64CB1F9987202D5EE29" + }, + { + "adv_header_byte": "30", + "adv_salt": "A05BB37EFDDB01C28868C9CABDE45755", + "aes_key": "11824EA2413643EF46FD5BCFDB388E43", + "data_elements": [], + "encoded_section": "379013C86D4AEE77BBDBB8844E2926505C097691100028E0AF5531DA2DE3C0DED5BC781B7F049001582A39819023E35A620C88CE345798F6", + "identity_type": "private", + "iv": "BF0445BA6682A2B47F7ABF0E20E32035", + "key_seed": "B688A40DA68CD7661B7D6089CCFE418B5B408BD375E9077C8DB33B620731526C", + "metadata_key": "935583808C7CB2FBC7C0714A8C36CA1E", + "section_mic_hmac_key": "F086EBEB816B05AE588F30216FC53E298A827819E14CF791CAA5B43B668A6614", + "section_salt": "28E0AF5531DA2DE3C0DED5BC781B7F04" + }, + { + "adv_header_byte": "30", + "adv_salt": "6E0D833A506E4DB1F3A53EF1F43E4632", + "aes_key": "2679F4BAA410BBC4E9854FEF3B8126DF", + "data_elements": [ + { + "contents": "5B6A4C0B", + "de_type": 32 + }, + { + "contents": "DCE0D04F8F070A447B924F6C8E16EABC8579F140", + "de_type": 672 + }, + { + "contents": "4AD51AD3", + "de_type": 801 + }, + { + "contents": "A2A4B310EEDB978A748833C1F03354157907B8F4952A82D1C60B6F", + "de_type": 988 + } + ], + "encoded_section": "799013D95AC86388C09B4142211B1890B433C7911000E94F2773795ABC33E1D514921EE2BA949004E570F5BDF232B20034955E0752F5D6A5CECC93236A9D55EA1B0E47A3E000126D73140A93AE42360BED1C2DB98ECD79A07B5C38AFADFB8DEC81C8AD48B88EBEA6AC5240B479040953B63A5C6A83786CDE7E6A", + "identity_type": "provisioned", + "iv": "F3D857A44878F37AE15E0E4272AA946B", + "key_seed": "6412DBC3C88BE6FE2C83658F87EFC2B68E27DC6E2A5F7818CE07E278DB4258F5", + "metadata_key": "2093FAC2282FAB9E32873A9249CC23CB", + "section_mic_hmac_key": "59E443F1954D91B37423505D8241E6F35BC213F3059455007F588BABAE936B5D", + "section_salt": "E94F2773795ABC33E1D514921EE2BA94" + }, + { + "adv_header_byte": "30", + "adv_salt": "0366F4962B2FAF43595714EA372D803D", + "aes_key": "2381BB44E4A84BC892495AFD32648DFB", + "data_elements": [ + { + "contents": "EF42CB7BDCFF5FDA2486584DC7C69755B49AEA22", + "de_type": 48 + }, + { + "contents": "07B646472EC5353965E24350EE4F4B41E1D3B04A5FA3AB743D19", + "de_type": 950 + }, + { + "contents": "4CE19C060C1E3AAF573C8BE7046339C6A72F11", + "de_type": 772 + }, + { + "contents": "A9DF36B2600420CA81D5AC14199AAF13B9E4056F43C0C7A9A1B458F9BD", + "de_type": 283 + }, + { + "contents": "B7A2", + "de_type": 578 + } + ], + "encoded_section": "A5901395C08630D83223DA1529C5BDDF862429911000F33DF7DF517C94019086C3C55258270190028EE860429E7BF8FA0A3E8D5138E3CFAADB41414889DE9CCF0C46FC07FC618E4B0EDE78A19EF63C6FC7C4127D749C7ECD19EEC9D7F0C1D4BC6F1074785CF7CC06DF2CA35F43B17D8C23F389F82BB16E21C1C80328B60B0BF7EF031D3C885393CB7F86C0E48848DE744E73F7DE8AA69F5E875AF692EE5CA62B6958F450DDF7", + "identity_type": "trusted", + "iv": "596ADE25EB467684CEF42648156B0626", + "key_seed": "9E23BE85340F7F6E4EF0B499865BC6771EAE8777F5CD62655BBCE72E53ACC83F", + "metadata_key": "2EB7B8F54852A9FA534E0355A51CADDA", + "section_mic_hmac_key": "4A08AF41A015449CDBF11C5A919FE3F09B3D002BA5FE5C0C0910061C291FB569", + "section_salt": "F33DF7DF517C94019086C3C552582701" + }, + { + "adv_header_byte": "30", + "adv_salt": "0AEE1E2CF439B601CEB6912B95375040", + "aes_key": "5089E7D176FF1A7223D80B0409C6FA26", + "data_elements": [ + { + "contents": "D5276E1226F20AB687", + "de_type": 607 + } + ], + "encoded_section": "43901358F31DEAC2408D32879334657F553B3C911000D17FCA0932AF190778C24B96E5FD773490023BFABD0169B35850D2228C8AFB2F91608D59B80F95BFFE0B86F85870", + "identity_type": "trusted", + "iv": "D41B625DDAAC29E9C2C452E9F16A29C0", + "key_seed": "44C670ED0F58A7F2BC90EF1F04EDF83C9348139557B451EB6D8275D7B0185398", + "metadata_key": "D8BFA1BDA44332D65D99EF0080E01D3F", + "section_mic_hmac_key": "C2B8FE9FA062BE161FF8BD14F31BBFCE43378DDD9D82EAE811BF8D61BE0E889E", + "section_salt": "D17FCA0932AF190778C24B96E5FD7734" + }, + { + "adv_header_byte": "30", + "adv_salt": "14EFDEC1CD63DDC48B8B8E8C8CDC8304", + "aes_key": "5E279D274E2D7323A335FB4BB590EB6E", + "data_elements": [ + { + "contents": "A16A8E4A6AF9ECA8C6F59A0C810DF0887016754EDF4E", + "de_type": 933 + }, + { + "contents": "91E18A74954C81ED", + "de_type": 768 + }, + { + "contents": "D284DA8A828C589785EAAF87EACD9B6B629C93A72A", + "de_type": 250 + }, + { + "contents": "10F674B0727729EAA5906B2E2055A074EFD5", + "de_type": 386 + } + ], + "encoded_section": "8890137E2AE6C6195C792C17C7A7D5D85D62C39110000FD914F6DEED1D8B294D54AC1AF731E59001801DE846E75659321A50A88FE67B0F6D15999A664BB34EAD74AF0F15CE500635DCC5662F84ED09B1DD8BE084A71FCC5952EC8D21D42E2C73862E6C7624C1E23EF238E3454F3001E1A1F628F7DDCE9E1603C29A09EAFCE0AC398C535C7E6A3F8B6E", + "identity_type": "private", + "iv": "2769CEA47FC25DCCB02764766D926045", + "key_seed": "94F0C89FCD16F86CE07F9E525E6DAEF427E0E34155511E533DE9E9A3459588E6", + "metadata_key": "F8A0DC8DA1A04B3E48500497F9AD016F", + "section_mic_hmac_key": "BA370144A94F5A2D914A271DA273C7398BA54051561DF993717920C6402766F9", + "section_salt": "0FD914F6DEED1D8B294D54AC1AF731E5" + }, + { + "adv_header_byte": "30", + "adv_salt": "C8DFC829806B833E4CC7A5915DBF6976", + "aes_key": "178A9B604EEB014BFBD4E225DCD5F848", + "data_elements": [ + { + "contents": "E8C937C8367D2CE21D17EB8473B0C2115CFCF8F17AD95664ABC342ABA8", + "de_type": 501 + } + ], + "encoded_section": "579013A26BA7738CE48F0A7785573722492B6F91100052FFAE3A4F772BE69EE13ED700E5C0019002C8986203C903B3446CAE025DF6E718BF73EFF77A892F5867B55BFF67E278D59AFEE383E4115BBC6F3052AFA8F85D5B0B", + "identity_type": "trusted", + "iv": "D2EEBE3242653569FCDA783795429968", + "key_seed": "93A836F66F3808515B936588D6A270FEA403392AF0CB25E16CE672AFAF26BD09", + "metadata_key": "1DFAA8BD5B70B5BCED114183CA5CD29F", + "section_mic_hmac_key": "3DB4DF42F47597DD85B09EC00F7CB6828C0AE0C4AD770964BBB83C18F44A5D4E", + "section_salt": "52FFAE3A4F772BE69EE13ED700E5C001" + }, + { + "adv_header_byte": "30", + "adv_salt": "8EB77BBF9B403FF005C47CD0E16171E6", + "aes_key": "F609CCDD1AED844DB12101C1455043AD", + "data_elements": [ + { + "contents": "6F7BDD9D79C975F5499A0445A0A45B65093FE6BF6B87", + "de_type": 253 + } + ], + "encoded_section": "509013F28F4ECA39FA96461F8A0699BFB576AC911000A9E37AD77F5AF0CDD4310C3400E843999004BBC3E4FB4CD4FF5E74A6FD5D24F758D3A225C841350134B8EAAC663A8425EB10B70D3D5AD7F5D89454", + "identity_type": "provisioned", + "iv": "3FBF642845DA78CA89C9F1C1773C1CAF", + "key_seed": "81004ACD295BD7E1F3B141E4F32DB07B38D89628FEE7E832C5250130F7B76DD6", + "metadata_key": "12D275A01046BCA9813B58EBA1A111A6", + "section_mic_hmac_key": "9DBA40A86FFC3D909D4973DD42F5A1590AEA88CA64FDD1AACEDE1873FABA922F", + "section_salt": "A9E37AD77F5AF0CDD4310C3400E84399" + }, + { + "adv_header_byte": "30", + "adv_salt": "72F229F976778B8F81E6E11237BE69D2", + "aes_key": "965455CE77299A33B4677C22F8934450", + "data_elements": [ + { + "contents": "2BF3E31146E2852F0C71FD8D00185974D4945EC0388D52FDD11F6C78", + "de_type": 474 + } + ], + "encoded_section": "569013F1133A1C5D39C0EB102D559967F81832911000BA431CBF78832E8B284D34DDC999B6589004C08F255B79F62CF6CE040EDC3A23728625BC0399E1EC4D686FE88AE38EA18CD1D3A961F303FE34DCCCA5613EF5B19B", + "identity_type": "provisioned", + "iv": "39CA34319C4E57CFA76C0CC39D250FEB", + "key_seed": "2EE377ED490D438BA5E5856EA6CB0206766DEC800FE300A20C5AA30FD9F985BA", + "metadata_key": "A0B481795EE988419063BED63094A408", + "section_mic_hmac_key": "E63EBAA47708FA1F7DC4BB439938D4434A0083BE3DB361669A090ACB41D45DF1", + "section_salt": "BA431CBF78832E8B284D34DDC999B658" + }, + { + "adv_header_byte": "30", + "adv_salt": "E2438E9BF16B31C95FD6885C00E11B08", + "aes_key": "D4CF5202400F9C1932BE142FFD4CC65A", + "data_elements": [ + { + "contents": "6D", + "de_type": 693 + }, + { + "contents": "40F83E490CA9CA93", + "de_type": 591 + }, + { + "contents": "E66886C93E6592BEFD3F", + "de_type": 241 + }, + { + "contents": "8C0010C44724714E61E68F30533460A53E6B0D", + "de_type": 277 + }, + { + "contents": "B277F8E0CBA5AD4FC3545F8F62834693", + "de_type": 958 + } + ], + "encoded_section": "7C9013FF26D8333BFACFE99C000A04F9446EAE9110003398D1FA6CA164B2F2A9DF651AB8A08B90028DB85D0B6CE0D6780A715759F75B820D7A997FF914C10EA81F49984D37145D11414ED694AE60301AE1181A025E347F78BE15A882905044070CB461D3D04F7BE7466B9768736B89D1E1EDA8227D37E080378D6BA9F9", + "identity_type": "trusted", + "iv": "FDB266B94952A2C53A36FC76B6B10D70", + "key_seed": "2C450CB362CA288FC9F268B3654DE6BBFB2C42A0A3473D1DD752CD670C45E550", + "metadata_key": "437B5470A0C2E0EE8257D7A255D776D5", + "section_mic_hmac_key": "57AB37FA929E2622240214CDFA222E72B87D00F68B01F28629BA162F61B24856", + "section_salt": "3398D1FA6CA164B2F2A9DF651AB8A08B" + }, + { + "adv_header_byte": "30", + "adv_salt": "16A07829874761800D9FB4C3E21A2A30", + "aes_key": "24152963469643ED0534D23908210079", + "data_elements": [ + { + "contents": "582A88E9ED0B", + "de_type": 226 + } + ], + "encoded_section": "409013D7F48916F267119188FE49673E4322F5911000AEA39558B6060468B31BBE90D84E48569004128F5F484DC44595CD6EA02E9616DDEAD65E71B1F3C0ADA8C7", + "identity_type": "provisioned", + "iv": "B77132A303625EC533C2AB64430BE8EC", + "key_seed": "9AB4FD9204A072396ACB99BF24E36F99D6DC23A9C6433CDD793163D716AAB367", + "metadata_key": "6B6FEEDF5FECF44F4598D9F9336EA39F", + "section_mic_hmac_key": "CA281C0ACDB75B8FCCBE489135F1F60CBCE613EDABCE4F6599DB6A32FFE8A98F", + "section_salt": "AEA39558B6060468B31BBE90D84E4856" + }, + { + "adv_header_byte": "30", + "adv_salt": "9159107E1D54578B844265C291E6F456", + "aes_key": "A142FCD93225283E9C860862F8719CE2", + "data_elements": [ + { + "contents": "BBD5", + "de_type": 347 + }, + { + "contents": "A61AEB", + "de_type": 165 + } + ], + "encoded_section": "429013CF49B28303C8F063E5A9C8A2E5E5A582911000C3D02F4B3F14A8C76A0E3840C522BD199002C48D6D20B4B27E0AF7E8AA6319A62AA7AA534F867DED4748522E0B", + "identity_type": "trusted", + "iv": "E45AE7CB222CCB06E574519786304AFF", + "key_seed": "7EFDFFA488A94BF2C11A3EE5B309FAB935BF41D510D587A7115D5BAD030C853D", + "metadata_key": "C6EA1FEBD15B10E7D19D13317D39F365", + "section_mic_hmac_key": "9F5F37B864A003287CDF62806A6D5CC4422816474DAD127DAAA0303B842DBB01", + "section_salt": "C3D02F4B3F14A8C76A0E3840C522BD19" + }, + { + "adv_header_byte": "30", + "adv_salt": "01D0C987D88C843A8DA02F96AEEAB362", + "aes_key": "4D8530AB04B3B18073DD758C44CDB12D", + "data_elements": [ + { + "contents": "C635CC117668AFE7949917A7", + "de_type": 593 + } + ], + "encoded_section": "4690132F78152F11A6D5F60810B49DE0E34D739110003C013D2EE71384CB77B9FFACF9A47F4E9001A32EEA69EB210803D358A56381F4A39B5F6DD7C26B7E13BAC60AD879791059", + "identity_type": "private", + "iv": "47787F6AF0CBFF3224FD5B90B7C62C19", + "key_seed": "00CC8EC56019B472D3ACBE5BE0A264A6678E2DF7CEF0BC67BD79E6828C8DEFA7", + "metadata_key": "726B29FC8323127C8BF3CA61DB54DA54", + "section_mic_hmac_key": "6282DF040346562FEC646797AC206013549F226E4BAAA53F89F7EA8D7704CA35", + "section_salt": "3C013D2EE71384CB77B9FFACF9A47F4E" + }, + { + "adv_header_byte": "30", + "adv_salt": "FAC14F23FCA63EE1AC8C2F59083B88B7", + "aes_key": "6FC985D771EFA0BEA304EBA07A4D4381", + "data_elements": [], + "encoded_section": "379013210B1AE359DE0CBBEF346FF559B51B64911000588A0BD17ED117BB4AF055C77AE2DC439004E313D80409FCA3D2E2979544708A39B2", + "identity_type": "provisioned", + "iv": "86C71197DCC66D69EAC756CF2C03457C", + "key_seed": "C2AE57F5782C3D478DE8AB1D2E1687BF00B9E0610F7D6E16623496E61C6B1230", + "metadata_key": "53695A2CF6468D1F2453CE5EDC1F5D34", + "section_mic_hmac_key": "6AEED53AA44B52EAB200C7F46C01829AF89B54BCF92A9976DB76868D6F135627", + "section_salt": "588A0BD17ED117BB4AF055C77AE2DC43" + }, + { + "adv_header_byte": "30", + "adv_salt": "D472CE5EA02A6BA693D3D3C2FDAD3CB9", + "aes_key": "F3D466548CF059E4BFD26C5886022F5B", + "data_elements": [ + { + "contents": "D8D56CACAF01745BD359143859C0D997FFAF99426DEE4F0526C6B7", + "de_type": 92 + }, + { + "contents": "A24E8CF59B4C05", + "de_type": 365 + }, + { + "contents": "81", + "de_type": 632 + } + ], + "encoded_section": "629013BE8CCC4DF63F42BA4F95A6E67E961F27911000FE4F65E41C205A3E4AECA5C3793C5BF69001EDBDC998D2BB9F46E2820FFA264F9BE3D3915E34044744679A1B1F264AD4E0308DCB0BF6480F7BA07BEF3F97BE391D659BD97C4CE4105F2D3FA56B", + "identity_type": "private", + "iv": "991E163873F0FD3CDFEDF8139642A8F3", + "key_seed": "568C44F2441F53CD271E0542E28C0FDC6695D248A63610880C0453C64F0377E1", + "metadata_key": "2852757C8F7EB2EDEE35A83C67DAA69C", + "section_mic_hmac_key": "FA797B50ED1D17BF334DCF82CC974B740018A9C8003954FE8C86266B17D3F3FC", + "section_salt": "FE4F65E41C205A3E4AECA5C3793C5BF6" + }, + { + "adv_header_byte": "30", + "adv_salt": "37CA9E5FD83C77A93EABAEDC05387FA5", + "aes_key": "2A6AF75B9E41431A70C784C8CC4F67BC", + "data_elements": [ + { + "contents": "537D9BC55AE1DA87236C576CC5F26C2D602732D596", + "de_type": 824 + }, + { + "contents": "86804C087B781C582B55", + "de_type": 646 + } + ], + "encoded_section": "5C9013115FC54D3F5BE989D8D73E6CD5FA8933911000A85F1F25192415C492401A2F8E01E92890045AEFA99C8FC1CA0EF427BB15090A7DD66CBEDB6F851224E43966EDBB49403FAE54A4EB5F2EC7DC91D3303A587F631C60FD37F77187", + "identity_type": "provisioned", + "iv": "EF1CAA1432DC4C9DA79FD2F1B6085F22", + "key_seed": "83B25874FDA42842607D32442AA882CF07302E77F3ED45483B084173C78CE088", + "metadata_key": "D5476BCD37EA529CFE0398E04BFC8DFB", + "section_mic_hmac_key": "9A3EA2A97F65070F53F1D0565BF79C2884EA8F83777C386F788878D0405F8F71", + "section_salt": "A85F1F25192415C492401A2F8E01E928" + }, + { + "adv_header_byte": "30", + "adv_salt": "23A40362AB2ADA10E507ADF73A53B738", + "aes_key": "2A3CDE8E1F16994BEAC62D6303BB37F4", + "data_elements": [ + { + "contents": "0843EC4474384A6564190967861E63F79CE2C093CBE9", + "de_type": 549 + }, + { + "contents": "528EE47BB4B74DC8BB9E1DF094", + "de_type": 970 + } + ], + "encoded_section": "60901318D390C46D78B50D713B7F1D3E4ACCAE9110006797144436216197C900B8B9AAC56F789001CD6DE510AECDD868575107FE8366F7D00DEC23322446DEC1C1544F04F07114E1ECB49ACC9CC160A0AD858347DB70785C8A1FE1865C1B8EF1A1", + "identity_type": "private", + "iv": "D5757A781F250DEA9B32A2187D1DCE66", + "key_seed": "D0B4C8F4097FCB6FA04E537590BF5D93980F62C3CEACD9539F4B805FCEB19BF7", + "metadata_key": "F59AF47E80215C5D7080A9F17789A0A4", + "section_mic_hmac_key": "75CBA9C19FB676E9DAA28A513B222848CF282079CB8D535638316B230DF07FF6", + "section_salt": "6797144436216197C900B8B9AAC56F78" + }, + { + "adv_header_byte": "30", + "adv_salt": "669368F2B1CA51C64A75E82A26AF1C11", + "aes_key": "A4EB2632A392009042825BF578EDE10A", + "data_elements": [ + { + "contents": "F2D8D28C9069643C0348AB1945160AF061335DF9EAF41B221DBE03", + "de_type": 436 + }, + { + "contents": "60197A23C9", + "de_type": 331 + }, + { + "contents": "8A9DF20FBD2E506F3A1A9C0A2BFB4DA265569A10ACDE979A7E788D21F2", + "de_type": 679 + }, + { + "contents": "2CAA8CA35DEC7A9CC23AE80F2AD4D04BA3E183FE80DA7CEF25401F", + "de_type": 414 + }, + { + "contents": "1A1B4F43E756C631B06104F7", + "de_type": 20 + } + ], + "encoded_section": "A990134A4C65C83E53EAC713E40B3AD06319C3911000436276C9196C9DA1609DC9C37F62FCCD90017D953EC227BCF3F8D3C9D12F703836BFEF24DA8CB8DFFD6E8ECFBCEEBD7C7A96FD46C6DD33481F61896CAA97B3080075A5EB1F94CA4723CDE6DEB7A248B1539F7A6F727258DA870911DF1D648D43006DD5E59E84C30F72CD61095DE966561D2CF65E1AD4D23E35CA259C6D24D31B7FC9DA8FC1F6013CF1D45C5024A5586264342E8C", + "identity_type": "private", + "iv": "B16EB79EEF99FC59C0668A1D7BC49AFA", + "key_seed": "5F02964CF3FD078549F6F8A12FBDC0954E721E45D6E846889E7524D2B8434B8B", + "metadata_key": "A708F60A0D600AA8A68217B333B97CD8", + "section_mic_hmac_key": "E13B13E5A85167161D8B99887734E38F16B76B87A517A8C4FF136F89A5DDF17D", + "section_salt": "436276C9196C9DA1609DC9C37F62FCCD" + }, + { + "adv_header_byte": "30", + "adv_salt": "0A2481314ED5461D784F31EAF236F1E5", + "aes_key": "16E09656726BD0DC340707E9A8044E65", + "data_elements": [ + { + "contents": "92A1BAC82C6C9E906E78A8DB18D26644E7A2EAEEED", + "de_type": 647 + }, + { + "contents": "98233973D9B3EBB10DD17CE8B446D32C9401AFD1B5EC9C57FE18", + "de_type": 657 + }, + { + "contents": "39F2C871399BCE2B2A4B30B8B2310104C5B7056E11F51AD03F", + "de_type": 824 + }, + { + "contents": "92A59F3F222B370631B5", + "de_type": 29 + } + ], + "encoded_section": "9490133A361322C6CFD8F123B652392B2C33F0911000C1A4FD2EF8C9F2A6D6974F8499A86C659004B9B926F64A99404F409179FAE1A76A99533E523AB5C23493DC15F5F3F120CADCA02CFCAE5A3082F5FF9C2FB21D81E521728C42982A2328CC308F514795CA4EB96B8345F6BAE498307143DD189D826F4724CC8EA3FAF712901F36E30FC459E53DABAF178E7BD5C84E132A30DAB1", + "identity_type": "provisioned", + "iv": "E767A2363EF745A39E8787B42FD8DE81", + "key_seed": "61F9D03A55557256DF3DB5D601914145C9775AEE985415278B8032FA275C5329", + "metadata_key": "BB767635FA036098ECA2BC4802D976EB", + "section_mic_hmac_key": "31D39D034312D41DC5F9345FB580C37BB38395B84C53E60162A28720C1E63FB7", + "section_salt": "C1A4FD2EF8C9F2A6D6974F8499A86C65" + }, + { + "adv_header_byte": "30", + "adv_salt": "2F5E446BB35D880DD4832A0320D23837", + "aes_key": "0561AF2D0D1CA6D8E039AF77CD3EA3F4", + "data_elements": [ + { + "contents": "AC27B62265094108D47755E4CCDB67D80B83C7074CECC0D32722", + "de_type": 769 + }, + { + "contents": "B4AAFCE877574BE04E95", + "de_type": 926 + } + ], + "encoded_section": "619013DDD6BA07092F273FE5A3B387A7DC9075911000CC0F046848B5C94CFAF3C1D28E8683E59001430FC81EB61D0491A40AA0EE069E9B722C2B89CB62B4F352CB8FE93F0E9D15D6312B6DF7F955A3A8A04C4D6A4986F86D536A3E4CBDBF4FD6DE71", + "identity_type": "private", + "iv": "EABCB9DA7F07B140664428DCC9047C9C", + "key_seed": "F82944B1BE8D9544BDC997CA1D03476C40D7D7FFAF30984C6FB2134B5AC19139", + "metadata_key": "19D5EDE29D0669273A6E1EAB85910537", + "section_mic_hmac_key": "E69B4CE7F49A47FB968E2C884248B3945F308B713AE44E3E4647DED0393E64A4", + "section_salt": "CC0F046848B5C94CFAF3C1D28E8683E5" + }, + { + "adv_header_byte": "30", + "adv_salt": "745EF38C147400E52E78EF73D799E530", + "aes_key": "397F15C3D3507F7558ED7FAA6FCFA2E6", + "data_elements": [ + { + "contents": "744A64EA84D1A11640AA6EC3E1A7", + "de_type": 906 + }, + { + "contents": "AE5862393CAE8A6A8081", + "de_type": 472 + }, + { + "contents": "FA53D0AC965BCC16F47544049731DA0A5A15BE0404705E", + "de_type": 331 + } + ], + "encoded_section": "6F901373AFF0834BE5A8A75E5746CB02F7A71D91100061D605F31762567236505062910B3D87900118280B003A65469819DF38D09A494CF6525442F1CEF475B8314478A8F1A57BAF3C7FB86AB20E0190C6FE6850335A7E386D600128E705B2179D425FEB351F9E4EB59CC5E7A9C83430", + "identity_type": "private", + "iv": "94077956863ACD5EA404F69F49C6DC77", + "key_seed": "CEBFDAAFF86989FC83B21C9AF025C8C9179994F61AD5E743A802B5ED773A3EB0", + "metadata_key": "538ABCEE91E1133075655C92E743045E", + "section_mic_hmac_key": "E73A504BC9BD9D96710628DC0B818E1AFE30AC345BDA21A8D433B5848C46CD2D", + "section_salt": "61D605F31762567236505062910B3D87" + }, + { + "adv_header_byte": "30", + "adv_salt": "0A6BBAF5021A1D2FE1682B7F1075264B", + "aes_key": "F9D5C665842BC9A21E7118A5140C5980", + "data_elements": [ + { + "contents": "04FCE6BB03DCEF4AFFB691BDC55131FB1362F6DC9716322F4D66C7", + "de_type": 586 + }, + { + "contents": "070F8092B39E3A464748E7AB9F0A6D3BB8", + "de_type": 48 + }, + { + "contents": "1B8AB668E06DCCA0A0D10CFF6319600E8C", + "de_type": 363 + }, + { + "contents": "0505E12CB0611C4DCDE6D2501FAF96B1375497EEC1C3D349017C4DB382", + "de_type": 825 + } + ], + "encoded_section": "9C9013F127B1FD8A6754A1D23FC5ADF1AA4888911000D2EE2D16407010B143CC91248DF3EDF39001C723843332E652018213683FE8E97832066841091B04D79B031EE9C28AB3EFEBD8DC90AA76D499E8625B8D7DC05E47FC8725C9F52EC835086F1A12BE17FAE08E5648CA25CAC0C975F9D6CEAC578FA100D26031FF7D24B6A39531F184553B64DDA8B42C63400D9D938719D92EFF98743E9E06D83085", + "identity_type": "private", + "iv": "E54BAF233C2873FDEC34ECDBD2A75BBC", + "key_seed": "5E571CC03CF6060B889A4AFE1525C75D7010747E1F49304996A04F6541A15BD4", + "metadata_key": "7E9B72FC7CFC6D01C32FF8525C73A26F", + "section_mic_hmac_key": "D4FF75AEC965C82A4A2EBCD6D793ED7901083D68C26FA7863DDB45B242B412B0", + "section_salt": "D2EE2D16407010B143CC91248DF3EDF3" + }, + { + "adv_header_byte": "30", + "adv_salt": "DF5BE769CC5F0353186732BE147A63D9", + "aes_key": "22CCD7B2403BD3865C7B2A465F6C30BB", + "data_elements": [ + { + "contents": "A14BBA160E760CF44F", + "de_type": 952 + } + ], + "encoded_section": "439013BAC4DBE0F31AC812333CE4E759DB04059110004209A410502B246C097B277FDB07C4D990013BF9818DB28F7BCEB9BB5E009163691F51BC8DE49B58C0D49F0E18D3", + "identity_type": "private", + "iv": "1355F2F66052B17658A63F135FDA11D7", + "key_seed": "7361CCF3A6692EBC56C0CA940F35FC4AF1AEB3D0A61C09D9E514C39787069B58", + "metadata_key": "4FA17703926007A4761033EDE0235613", + "section_mic_hmac_key": "A13C30E9F3243CF7061EB9B9BEB91A45DAB682A15588C894BC803B751B4579E8", + "section_salt": "4209A410502B246C097B277FDB07C4D9" + }, + { + "adv_header_byte": "30", + "adv_salt": "E5F3B694C8D64BE7698617904C135CAC", + "aes_key": "42CEDB34BEB620F53150B505DBF0017E", + "data_elements": [ + { + "contents": "1B9289BAFE209EB83B1317DAF000E1364AE9B42EA5D3", + "de_type": 329 + }, + { + "contents": "62612B87E30046057587", + "de_type": 311 + }, + { + "contents": "F6E858C9FC1193050685904D19E7AB2BBE", + "de_type": 261 + } + ], + "encoded_section": "719013159144D7E2194B056A0C7E8584BF6CE8911000218C59E9A77F6C177DCD2A9773BA48AF900241DA1F7786470F9D4A621561E8AF20F7C08EE15C0BD534A675FF6463E81F6CA71A45ECD5406B91DDB3E4735DBADFF00978F8362A398E5F456CDAB11EEC901F03D1648EF8B150DC3E67DA", + "identity_type": "trusted", + "iv": "EA32DE5C1E430A835C12B1A91CC89CFB", + "key_seed": "8BD9229CA4491845B4083623E5FEA2069BD41B56809D886324CDB1A586BE0CB6", + "metadata_key": "951A2E71EE9898BDC0296DFF0213DF30", + "section_mic_hmac_key": "3FCF9C69A11FF8EEC29F52F44C472C0C57E91D443C1D2B26A83221567F02151B", + "section_salt": "218C59E9A77F6C177DCD2A9773BA48AF" + }, + { + "adv_header_byte": "30", + "adv_salt": "C6584EC834FED2E94B8091A8747BCD9C", + "aes_key": "15ABEEF92C750250A1A76C68241634D5", + "data_elements": [ + { + "contents": "578A958480E03A34F8978B8260C9A13F9B9ACF373C", + "de_type": 198 + } + ], + "encoded_section": "4F9013A3CDB9B681A52DEE1310B22F1931F9EB9110003F399980C680152865FD9279D977CC139002685C63C0C0E709FEC8E9EFDB7269397FDE1E43D2729F41D9C7A66DEAF2185B5765B530A92CE78B97", + "identity_type": "trusted", + "iv": "1EA030B4EDB3E3830E853133F5DF8E73", + "key_seed": "4121F59F7C8155C2C22DCD541C2EEF8FA89E1A1D92FA6C92767E70EC828E581A", + "metadata_key": "87C695F0A704AFB08ADF552F2D70D36B", + "section_mic_hmac_key": "8BD01A8873BC672624A111614E646520593EBCDFAC76A81D40E3C1C268F89A0C", + "section_salt": "3F399980C680152865FD9279D977CC13" + }, + { + "adv_header_byte": "30", + "adv_salt": "3F2141BAD98E79288895A150E295742F", + "aes_key": "0A35AEB6BA80958F4FBA6475AEDC9C42", + "data_elements": [ + { + "contents": "2EECF608AAAAF0FE733CC5E2DBF178C7E39152E12CDDD772D65C417DFB", + "de_type": 803 + }, + { + "contents": "22A2C92D792B", + "de_type": 103 + } + ], + "encoded_section": "5F90130F0868FBF386021653BA3FE7BCD17E87911000FE75240065FDF8EFC99C0C3AF69156E59002E707FDA0FF2BD0ECDB6FD388E6AD5FB47E69D6B787971FEC414F711F7360869018634A4857329A9B0AD295C4C755CB905EBFAC9A4C0B7BD4", + "identity_type": "trusted", + "iv": "049F4151D3FE5B124170EAAD35C45788", + "key_seed": "2E09F6C972F988C3AEBE406A814ADCE1323861A409071CFAC1EEE755DF201202", + "metadata_key": "D6AFFF9038CD3B4C77CE91F438BFA3B9", + "section_mic_hmac_key": "B1F883D3A3806235308427AC61D723CE12A761C61069ECB1F10CF61558672621", + "section_salt": "FE75240065FDF8EFC99C0C3AF69156E5" + }, + { + "adv_header_byte": "30", + "adv_salt": "49B2915EC7A33D0286B5D856BC1C5284", + "aes_key": "A417B26D49ECA18BAC18ADA35F74D45E", + "data_elements": [ + { + "contents": "9B0E237C78F6CB50", + "de_type": 9 + }, + { + "contents": "C94477AAA110FE809B62604500ACD0F7D414FFA49DA215", + "de_type": 519 + }, + { + "contents": "992B20C63A1A22", + "de_type": 25 + } + ], + "encoded_section": "6490134B524B7F1DCCA091F7824EA36A2617A1911000D340ECFA488E4B8D5097BF106F8B829D9002D655120231B293EF93F1951FA10BE3255011D75CC2409DC37406396FB62A190F4EE6438A650B01A3EE155F192FF7AE7041676C38CB0DE0470D35B881B9", + "identity_type": "trusted", + "iv": "869A1EF9278163ED199CF9F9F137D4E6", + "key_seed": "9EE4BAC6148531F711836FF331C1FB7E3B02B9ACDD78F2F88E8B0E40BE39DE24", + "metadata_key": "C81343B9BED7BD4F0758950833314D87", + "section_mic_hmac_key": "BA6A098387BFB88E2E4FEB012F726011F577FCA9E1349D7627A46B1B5EB2DCF7", + "section_salt": "D340ECFA488E4B8D5097BF106F8B829D" + }, + { + "adv_header_byte": "30", + "adv_salt": "8D17E72A1C35431FE9167E9BD17E0CCA", + "aes_key": "8B6E188A464D1E549D5988EF874A9714", + "data_elements": [ + { + "contents": "65F9D53284B61B216C2FB7905A7E628A36D346F27E63DF03AD5591CC3806", + "de_type": 122 + }, + { + "contents": "1297A56F07B1E17644212F4E57043C1424A6FCA16610A252", + "de_type": 427 + }, + { + "contents": "0373709C74E1682A1293A7C96B026CD7667BDBC8", + "de_type": 321 + }, + { + "contents": "B7A7F0CBAC26EB1A7F10", + "de_type": 240 + } + ], + "encoded_section": "969013135DE684210624C70AB737EA21E2BB2791100071D1EC0652294A473D35ECD597CC09C4900451B8461BB4330D89B49CF05D5D0B305361E41C5D0DA38B58335699AA3E806BC4CFADA43F344F49FF0BB77196236F8CDA9054F508DFB5144AA7E11AB860A0F4CE6F9D47237982D8DD5B3232F3627C4C4A55AD1201A865CE24D5C73E50BB704617AA4D887B7A75048D63F29AE2C31CEF", + "identity_type": "provisioned", + "iv": "3365A1592043B55C5C4144AB1D115066", + "key_seed": "80F58265457937034CE0954435632A123D95EDA52237638197E60E3C3941CE75", + "metadata_key": "95D1A7C78A1E4BACA51EA2476EEB81D3", + "section_mic_hmac_key": "DAF584298F254B48279150416077F45F02EA517C3473AB034D7ADFFE3A670FA3", + "section_salt": "71D1EC0652294A473D35ECD597CC09C4" + }, + { + "adv_header_byte": "30", + "adv_salt": "567BB8BE3AEB3C21E81331145E2A92AB", + "aes_key": "A617DFDBC645514858FA32E01DB12BDC", + "data_elements": [ + { + "contents": "", + "de_type": 487 + }, + { + "contents": "6AA41CA7DCFD6CB1AC6A4318DC40FB83A14443F387C8A2466EC1CFD3", + "de_type": 640 + }, + { + "contents": "7B8F001428B90D600D00", + "de_type": 965 + } + ], + "encoded_section": "669013885D0434ACCA45B4F679F4876DC80314911000691D3A0B07D7528440C9FE2FFAE11C0A9004C856B862CB0B81B4CE4355DC8D1D1938938C313D3481DC74949373CAC221012D4B0B4CA04035F045ECD631596E29947BBC2A20A796889E1C37CD64982CF41F", + "identity_type": "provisioned", + "iv": "895EE2C2AE3779BC94DD8312A6999D85", + "key_seed": "F47E65BC805D3E68FEA05C8CCCE3D494649145434287E31E952646F2576DCDCF", + "metadata_key": "F952060A084F9CBAA1567CAF63228883", + "section_mic_hmac_key": "EEE4F8B3DAE3B3FCB134AD655DF92456239F559B52FA195085850A03481492E7", + "section_salt": "691D3A0B07D7528440C9FE2FFAE11C0A" + }, + { + "adv_header_byte": "30", + "adv_salt": "3D5E77232628E33E4FFD9381E791689F", + "aes_key": "0DAC17E78298ABF6982AD8FDC35407A4", + "data_elements": [ + { + "contents": "97DEABC3A327B8C4354C65700EFE47ADC6617EAE56B7D9", + "de_type": 115 + }, + { + "contents": "2E3A60DF71E005D1E519B5F1443D0D918845C0C621F0D877DF7C33A4FB44", + "de_type": 579 + } + ], + "encoded_section": "7190134EBC1FB02A556EB545C3DB69A142E9B89110009FFAE095EE40CF7BAE117E7431FFA8B39002E91322121BEDB880976E910A1EA6003BDDC0B45400C07A141DD1E14271CC2912438B0B68EB80ED610E8C1DC4723EADBEF7482C8AAC2E723404EE3D4C88238FB9418A968AF469BD65A6AC", + "identity_type": "trusted", + "iv": "34DB2B5538C1F25E926D8191C5EB4382", + "key_seed": "4DA9A6F59DCF615E03AD56258554641692E02CFEE284A5D0F0D90296490475F9", + "metadata_key": "5B8F323279D4CC8CBE66DE149B267214", + "section_mic_hmac_key": "D23649C4CBA96BD6413B049C07B87D7CE18AD6E60D68F56AF270E2B1E2DB97E1", + "section_salt": "9FFAE095EE40CF7BAE117E7431FFA8B3" + }, + { + "adv_header_byte": "30", + "adv_salt": "6C167B8ECC498094A6DB33906F974F4A", + "aes_key": "81353FC4DB19F1128CD2049615C0FA92", + "data_elements": [ + { + "contents": "EFAA10A500DA87", + "de_type": 436 + }, + { + "contents": "E3144711F717FD0853", + "de_type": 956 + }, + { + "contents": "522B257ED92E1AE819C77DF0EA", + "de_type": 547 + }, + { + "contents": "A78410D4E03BAC31469139B84654CBC6BA", + "de_type": 483 + }, + { + "contents": "4A1F996AD64441C85400AF32BE", + "de_type": 549 + } + ], + "encoded_section": "8190132204DF3E53BEDCD51A7AE8F492F566D7911000856E7A66F236E9D930C684BD59B02AD79004641A35B7962DDADF14B7669FCA7CC36C1445925D48C45771B14DDD89DC594BBAD36C95A2A042D28D19979D698BB49CBFC43FEF03C89A80F392A9143C4C5D313A999EEB63C5C53E4DB0568E33770E9D2A9EA92C6EB2EB48224CF5", + "identity_type": "provisioned", + "iv": "5D8C4A61716F2AB552C717A3EFD049F8", + "key_seed": "B92F88C4CF23C1798C1FCEBEB328D300930CABC7DD84B347EF1F0A57F8E44EE1", + "metadata_key": "46530816FD06FF7D41FF0BE5A853A6D1", + "section_mic_hmac_key": "ED64C3F6E9D7E11E0B9299EB0C33A6510B9AB292B01A3BE53C2D13F8D2D8F9A2", + "section_salt": "856E7A66F236E9D930C684BD59B02AD7" + }, + { + "adv_header_byte": "30", + "adv_salt": "C51E8816D92BC1E03CA638712EA09A95", + "aes_key": "08C67FCA2B413C3C583437251B130182", + "data_elements": [ + { + "contents": "0713D3BB05B5FBA4B840171A21AF080166CBC082", + "de_type": 193 + }, + { + "contents": "E2736CB03ADB4DCECB1A316AED5F331044EBE44130138CB85970", + "de_type": 766 + }, + { + "contents": "2EC922EA4A01CA", + "de_type": 582 + }, + { + "contents": "9710558A43", + "de_type": 480 + }, + { + "contents": "", + "de_type": 319 + } + ], + "encoded_section": "8090130D8F386275A65EDFE296E7D02E4D8A80911000AC100EAD10CF49B4BFA4BFD03D22DC619002F9B057A5DFB8A47B3DC1E369CFEDF5A03E58B49395A2E8BE6952AE63CA45680309ABBBCD65D77055FCCB901A657631B0B699886718542E5FBD2ADBC7413A956D85F3BCB6921A97641C74FAEB45E7F2483A6500034788190DDC", + "identity_type": "trusted", + "iv": "A7702DC73BAD3498B5AEE515BA94D38D", + "key_seed": "B045094272F3A0C7248F9C2E7CD8A78491F06C05F08865B7B48418842EE56452", + "metadata_key": "06DA134E75557D145D8869E8858407F7", + "section_mic_hmac_key": "FD2E35B135B6EE46727142BCC2577ED5C53E5D0BF2E8817A05FBC8233B741EA7", + "section_salt": "AC100EAD10CF49B4BFA4BFD03D22DC61" + }, + { + "adv_header_byte": "30", + "adv_salt": "115CE5999BD1A1729822C11BBFFA3197", + "aes_key": "606CD07F4B3B228E11BDD67304CFF94C", + "data_elements": [ + { + "contents": "F51C44D19CF610828FE35CA6D313255BED137D1CA02BECC8F1", + "de_type": 32 + }, + { + "contents": "085D8A1FBD42DEEA5DA9960B20CED595A8A220068AEE29DF", + "de_type": 692 + }, + { + "contents": "30322E279AF190D06F", + "de_type": 329 + }, + { + "contents": "FFCBA9466A7731EF8CC5DA9642FCFA6E", + "de_type": 383 + } + ], + "encoded_section": "8C90131F34C598BA9CC85C706357897958835691100078884C8469817D638BB7387AF840716E90014A5B9F3CA8FD31B906F39867912E9E4472845E72DC24EBCC0AE3BC469DE9E82F365B8C69AF4499902EB14C4F4FD2FA87C7BB5444B524C96D546A69C6374B9EEFE8EABD54FEDA65F3F0A8EE73BC2B253535B32D25675B38FCCD9EBB88D4721D36B0723A21C6", + "identity_type": "private", + "iv": "879EE00C17EE3C3B44268DA9ED727759", + "key_seed": "D8F2A8604FB68290CB810109695B7057A80A161AF8E2685FD099490654A82C03", + "metadata_key": "16D27C779AE2F1C4F21AC121F734D4CE", + "section_mic_hmac_key": "1B93D2DCA5350A33466639D852947667E54E09AEF3FAA193AE3677EAEBAD0635", + "section_salt": "78884C8469817D638BB7387AF840716E" + }, + { + "adv_header_byte": "30", + "adv_salt": "7A2FEC84BCC7D36821CBFDA1B8AF6BDE", + "aes_key": "D94316EC0C1F3F5556B0A6E3EA44BAA1", + "data_elements": [ + { + "contents": "A18233E6470943CEDD28B316DD43F92E8B658D42BD4322F7E8116B", + "de_type": 320 + } + ], + "encoded_section": "559013CF23E8E383098669E7F3B37FF2FAF607911000F1ABBD27DF8BA7CC017FA7E81AA40DD3900248488C1E48B090E1679DD3AE096446392E61E2E044F2464CC4FDB5EF6EEA1F72A5607A8F90CBDDA3E320BED67D6C", + "identity_type": "trusted", + "iv": "E27184AD7419FCA23E773896AD12FDCF", + "key_seed": "B4C4197B892B450AE1AC96CDD612B7DAA67CF43DEA931691FCA75E067BEF9A9F", + "metadata_key": "0DF12C45B639A4C469417723D0599C42", + "section_mic_hmac_key": "87CD066A0003D6487925B00E6D3BB50ADA175AAF8FF4806A0E4A77A62D262D9C", + "section_salt": "F1ABBD27DF8BA7CC017FA7E81AA40DD3" + }, + { + "adv_header_byte": "30", + "adv_salt": "6EE25ECBB7A186290EB3DE0E054CA1C9", + "aes_key": "5477F3FB31FF5E2ABC4EBEDFC20C837A", + "data_elements": [], + "encoded_section": "3790135229E15175751ACE1FC3D9E27815847791100012517EF20157AF7D7686300FFD93CA76900429A2EF5644E24A3812DDC9261EC4C8B0", + "identity_type": "provisioned", + "iv": "551FCE3922ECEA01BF57BF7855905D9F", + "key_seed": "1BA73E4554F36779EE44DE6B9105F69DFF5D0EB3A148F671A1494E9070FF0C94", + "metadata_key": "951796A7C33819FEB9A73F6C7AC70683", + "section_mic_hmac_key": "F5858FC13AB364F8F7DBA608AB127EFF8C96B885D3A4750F4E77A6E6EC206E3F", + "section_salt": "12517EF20157AF7D7686300FFD93CA76" + }, + { + "adv_header_byte": "30", + "adv_salt": "5AAD4B0F2A5F00FFB25C6289A53ADA69", + "aes_key": "2B69E18B00F7C55BD2A0ED3BE199F17C", + "data_elements": [], + "encoded_section": "379013B003774586CD42E7AC66F5E4E31E355F911000ECA4F513378109DFBC32212674423D2F9004AF07EFDCAA038B74D585648EE9827064", + "identity_type": "provisioned", + "iv": "B39D516DDC2723FBA1B60D0FF63DB836", + "key_seed": "8B69FF71E1BF629344A119B02EB326CDB7B7D3145657CECC390E2F81C1890907", + "metadata_key": "C74ABEDA2BE5770EBEB1DAECF4C5E7BC", + "section_mic_hmac_key": "0C5265739DE3730885F7C6A628C96C57851387ABEB914B75C16F8B6099CBFEEB", + "section_salt": "ECA4F513378109DFBC32212674423D2F" + }, + { + "adv_header_byte": "30", + "adv_salt": "532E9FED397C96814EEAB6E1B27D4C86", + "aes_key": "C45208E0024404A60F492DDB2C914191", + "data_elements": [], + "encoded_section": "3790135CB193ABAE4F297BDD49862D1F937ED49110001E90A2A86D1CA79E2F64AD39A5CA77869001526D432A5829C0283F24F39A9CA1F2D3", + "identity_type": "private", + "iv": "9CA827CC416005F5F30C3E170D482CE1", + "key_seed": "1F991BF25881125FE75847D4C6F85BFA6392C2F8B53F1E7FE5FA893B023224BB", + "metadata_key": "39CF4CD3AFD063272F5E540476861918", + "section_mic_hmac_key": "EF468FFCB94D5466593B9B25909D4ED49BB1F5590A66FEE2A6956EA5FB2B8426", + "section_salt": "1E90A2A86D1CA79E2F64AD39A5CA7786" + }, + { + "adv_header_byte": "30", + "adv_salt": "20F33C7ABCB97FD1B01811347ACDDC19", + "aes_key": "9C75B6FE554C7B132A95FE610239A5CE", + "data_elements": [ + { + "contents": "D9ECD7FDC3", + "de_type": 927 + }, + { + "contents": "C1CFCACCFA30BB3D0F84", + "de_type": 486 + }, + { + "contents": "CFE52999406CBAEAF0BC138DE8233B9664C10997E6F8902C1D", + "de_type": 282 + }, + { + "contents": "019E37A059275E31906C582B37C190F7926DD006EB4390CC", + "de_type": 53 + }, + { + "contents": "DB192BBBEC104BC6FD5884AF1FA1E86C4DECE0D945DF93E130", + "de_type": 342 + } + ], + "encoded_section": "9E901377069C7408696D7960EA0BF71DEC6B1F911000674927D66F2947C6E6CFA19007F33A7A900263FB8DE4E5D01AD9B90E3C430689362C1FA797775FE1A5F6AA66B563AF190D6BC65F85F22AF2E337FC4B3AEB313E09E2A5F2B7583C504B37513170BC93F35C43D4CD9D02C7C5A9FCF66F83880160A769D1825AB2A1BE3BBBE69709D6649009DB70314C37D4704C7325A7C3E0D042BF8C0F6858A86F2769", + "identity_type": "trusted", + "iv": "75B00C025C3B6E74D1685D850286425A", + "key_seed": "D483C3C44C959801D49A5D40EA8ED53C623A1C2E4366AA22DD2CE4D2BB2AEB65", + "metadata_key": "B636C1D5060722295EA4D9D29D83144A", + "section_mic_hmac_key": "409242248BD9F7B475BC0F055BAA93A676948BE6F57989769DF739717B56313C", + "section_salt": "674927D66F2947C6E6CFA19007F33A7A" + }, + { + "adv_header_byte": "30", + "adv_salt": "5FFFBB726259844316370AFED28E66D2", + "aes_key": "E8B7530E124B7900B5281191D89BD73F", + "data_elements": [ + { + "contents": "5ADC8EA7781A428860082FF8D90439A6D195C7", + "de_type": 452 + }, + { + "contents": "0743", + "de_type": 582 + }, + { + "contents": "DA22170A8C", + "de_type": 645 + }, + { + "contents": "5D1B5ECDFE491D5171232041", + "de_type": 267 + } + ], + "encoded_section": "6990138D6BAB5B944BE0BE770B03757B61DBF191100094F0DD055481AC91B3856C44C113C5229002AB5EE385FF4D8533458D5D1018B219406C7C016D3CEFD2F2D89FE06C32CA1EB5AE7E8A5954D0911C4A4293AAA0E3F88E9DF83F3EFD19EC8764E16A51B60EA20C822F", + "identity_type": "trusted", + "iv": "B673F39CCED213EB6880FEF952DA8F56", + "key_seed": "F78D9E077004872A3050A6A3EA50B1E70FC3C6DE9E7F49F134B0AE9BE1738A2B", + "metadata_key": "24085049DAFEDDDFD928D0E87A95F58B", + "section_mic_hmac_key": "639957A7793CF45CF598A1BAED976AB2C127212C3C2925CBC11E1570AD73B549", + "section_salt": "94F0DD055481AC91B3856C44C113C522" + }, + { + "adv_header_byte": "30", + "adv_salt": "6325640BF11B968B7C13063AB59A6F22", + "aes_key": "5D2197FFDEFF298C4FF9FA541DAB065C", + "data_elements": [ + { + "contents": "F4F7C14E800989F15DEF6ADBEACFF1A1035B658234C91152C6C51C5F", + "de_type": 157 + }, + { + "contents": "86F2F7FE27446E08", + "de_type": 555 + } + ], + "encoded_section": "6190139595DB3FD2DD731ABDD1BECA616687F7911000378134A082F77DA2BD4DBC13CD4A1C1B9001A8A5CFF56B235053651822983E68C5BD46F3B4020623A8AE59169CAEDA758AE87865319B3A8D3228CC4D04418D44F394B949B37815980338A7C1", + "identity_type": "private", + "iv": "AE588E4ED351B78564904D2E45354BF9", + "key_seed": "A4DED14526CF6F5F984E8900D671B9BBAD83515521A53B9D420D2A388CCAB2F3", + "metadata_key": "94583C4E13E8C9C9944ED50786D19345", + "section_mic_hmac_key": "6F320F7C56B7436AF72F9DDCF837FACABF9D4AB713268225A72BF6E4ED4D56F8", + "section_salt": "378134A082F77DA2BD4DBC13CD4A1C1B" + }, + { + "adv_header_byte": "30", + "adv_salt": "5B662E491149B1B15260B320F4E01E89", + "aes_key": "D4D334E6C506B1E46ACAADCB94AAB75E", + "data_elements": [ + { + "contents": "E45B42DBEA4552BDD8987DA3A9F7C474DD0B5D594704D34C", + "de_type": 927 + }, + { + "contents": "80", + "de_type": 144 + }, + { + "contents": "8C19", + "de_type": 612 + }, + { + "contents": "2AE92C14EC", + "de_type": 278 + }, + { + "contents": "5A3FB2F54F4399259685DE522D31C9E1E2A150A97F597B9DB51F", + "de_type": 449 + } + ], + "encoded_section": "8090132B814D8B0438AE06E18CC62B190F0AFF9110000E7D5791602F29BE17656BADCED2A7269002C35227A826484C307A5FEAE5F5946DEA16A6512CF0C7E661C994CB23E31F0EA5A393FE3B7EE99BEEC02420C3DA7BC94C7E80CF5AA0FE0BB75BEE24632756ED3EC92CF64F9A2E7F9777403306D6995C1F32B1F7ECDC6037CB47", + "identity_type": "trusted", + "iv": "A31ECB0D9891D74FF9DDF376007CB629", + "key_seed": "E50CD35171C69F53BB3631558F6A92B8D202FCB93ACD6C864DE9B1FB0D8A3C1C", + "metadata_key": "E83B8B0FC3FCBC486C852EBEC880A253", + "section_mic_hmac_key": "0CBFE4AAD62203251AABE57D06C7F8785CE7A8AB924584888E4B2E91D0BEA44A", + "section_salt": "0E7D5791602F29BE17656BADCED2A726" + }, + { + "adv_header_byte": "30", + "adv_salt": "D4D3BEA3B13E0E8F2614716FB48F0D6A", + "aes_key": "E05199F2CB435DEF145BB7E73344E9AF", + "data_elements": [], + "encoded_section": "3790130A196A0477DCA5712C2882BF02E4D442911000508CEDD68F1A6A9D7611F0A8BD14343590044945F0B86E7D957AE20C1B6BC7E86735", + "identity_type": "provisioned", + "iv": "6C41743B8B7DB7062EC670DAF6A61798", + "key_seed": "C3C39B75D1D6402D67B7646996D02C1B3A74FE334497C43048D2433668AABF2A", + "metadata_key": "62CBAFD9D46C32E325D99A83EB7C353B", + "section_mic_hmac_key": "64D6C934EE6EAFE81A9AB9BD79C8374461550ECA553909391E1F60E8368E64E4", + "section_salt": "508CEDD68F1A6A9D7611F0A8BD143435" + }, + { + "adv_header_byte": "30", + "adv_salt": "57ED0FF15D76C4099AB899F4E418420A", + "aes_key": "4E9CDD52C9055A07A3BC128358EFEE80", + "data_elements": [ + { + "contents": "779B8A371B9E8BB9D0CAD88505AA1D9A1ED23036A0C6CF572A66E139A687", + "de_type": 215 + }, + { + "contents": "BD5F721280FC99C1B08886", + "de_type": 828 + }, + { + "contents": "D6", + "de_type": 810 + }, + { + "contents": "347A48731BFA69103A4D0F", + "de_type": 678 + }, + { + "contents": "FE74379D142F", + "de_type": 975 + } + ], + "encoded_section": "819013DC7D6CAD65E2DA625647E9D79B415C7C9110000500D0334277EB0134622CD78688B3DA9004BF86CC7D343077E7E560156DB988B4D44DD10AE2D2A9024C20BF5DB58999156BC086F7CD85517B70C08511AEAA9172C56150F5FE5EAE80DD4629EAE66D3B02042A5E0821FF37290FBA5216EFB2C2C01B812F339EB4D240DE59D3", + "identity_type": "provisioned", + "iv": "01576839BF9354E4AC4C715763D32CAB", + "key_seed": "9713BD491A7DDA28161429EC8DD6A456D3A135A1E808DA30B4A55D8528776495", + "metadata_key": "35B0152C9416B9C96E369110D8C6CF9B", + "section_mic_hmac_key": "D12B6016B127A4CC62D2B1BCDE84CAF328626B19F24F3B770A07BA7E6AD9E9EB", + "section_salt": "0500D0334277EB0134622CD78688B3DA" + }, + { + "adv_header_byte": "30", + "adv_salt": "B4573C31F4F975EFFC728BDAC5734826", + "aes_key": "71EFBBAEB4A0E65A8B25AD5D630CCF60", + "data_elements": [ + { + "contents": "", + "de_type": 389 + }, + { + "contents": "3CB055F06072", + "de_type": 910 + }, + { + "contents": "B7518C446B1576FD37BF85481B", + "de_type": 953 + }, + { + "contents": "B6059A5CDC56", + "de_type": 792 + } + ], + "encoded_section": "5C9013FB6CB6FB8FCF17D8F4B5547D9D9FBCA2911000B55F88A79A4D2308C6C58ADAF22BF1CE9001FC6689DACF7BBD836A7384B5E25B4CA444990364955921DAFAE62CBA2953A472F8D06A177D1FC116BABCC99F564BF1773D65E8D964", + "identity_type": "private", + "iv": "54C25EC2FA8AB87ED1EC10ED342FFB3C", + "key_seed": "47495F708FEBAF178EC2565BBCF981AE6AC35E1F8B721102A7337E061BC91935", + "metadata_key": "C8013164B860618F36848811670EF929", + "section_mic_hmac_key": "C5D4B92FA23796773094C596DAEA1B33219F2A3D7A64316765E41FD8D3E16BAA", + "section_salt": "B55F88A79A4D2308C6C58ADAF22BF1CE" + }, + { + "adv_header_byte": "30", + "adv_salt": "E4B5A27A27BE52545A47985B9E7672C8", + "aes_key": "1CBEF7B3F2D0B8B543A8064D081887A4", + "data_elements": [ + { + "contents": "66", + "de_type": 56 + }, + { + "contents": "BBD48390F886FE3524BB7CBEEEC484C3E5F8AE56D6397507C986C64B3334", + "de_type": 797 + } + ], + "encoded_section": "5B90138D632E4E4CF4342FF32A48179E3F363591100066577FA1CF451210A7F51FCB91E8090F900225745619E27544AC812B4E8A914870EE4DB218008E498D777469B12F683439BEEBB15F1D438CF9A2D065D13F7464BEFE7FC78487", + "identity_type": "trusted", + "iv": "B4636AC8670D445B40129E5AC546748B", + "key_seed": "1119F85B101A1C2E50916D1D4EFBE165115CFA1D516BF6FF38E26AFD989AFF1C", + "metadata_key": "07261A673092A6796C05396F34FB979D", + "section_mic_hmac_key": "64CDA74FAE14EA9A68520991817CEB209D3842D1507C55E2398618E02F778686", + "section_salt": "66577FA1CF451210A7F51FCB91E8090F" + }, + { + "adv_header_byte": "30", + "adv_salt": "9B384D5C760F4D838C96CB5C1E9BB241", + "aes_key": "1836C7B82C2B6EA947D8E012F116C09F", + "data_elements": [ + { + "contents": "D9976568115CB8BF83FCC86839E7FA5E6CC215BE1BB1", + "de_type": 358 + }, + { + "contents": "AD587B8B83B854A5F43E3A876649E31E", + "de_type": 27 + } + ], + "encoded_section": "629013D20E8E8CB6A740C268055645992CD564911000237B1902E39CD0E962BFDC3C0CB8F2EE900260224FA07FFC1C8496F1B76A4206C6909D5F802F2B79F688223D656DEC755A01F5E27362E186B5CAE06E37E3AB1D0B3B1293BE67650D0F4377D7DB", + "identity_type": "trusted", + "iv": "2FA2BA9E498FD9F7357D16A77DAE370B", + "key_seed": "602DE291FD9C7C12925034FABFECD98118C38F348372FD534786FFCAFF706400", + "metadata_key": "346B99848B2B463F6693F235D874805B", + "section_mic_hmac_key": "52D562B21447516C31566EB4C0C68A98C71630B24304B428EAC3BABE398A7AAA", + "section_salt": "237B1902E39CD0E962BFDC3C0CB8F2EE" + }, + { + "adv_header_byte": "30", + "adv_salt": "7E91FF05B49BE21AFC9F91A460ABA336", + "aes_key": "B67FC30117CCE626887A7EE662652CD2", + "data_elements": [ + { + "contents": "D69E2C5653B9BAAFBC9D5C3EBC58D3", + "de_type": 627 + }, + { + "contents": "EA28DC05603AD928B2826DCA", + "de_type": 452 + }, + { + "contents": "9501D6E4E075570F383542CF6E8AF8FC", + "de_type": 126 + }, + { + "contents": "930EECF1", + "de_type": 833 + } + ], + "encoded_section": "719013234A6B8D05D901CAA3BB8EC5EAAAB230911000DB399806753D8B6045C73A755B71774B9001DCA87E9CA2A023437557F2F0D4B9A5B58AB3D608D4498CC71DB3547425858CA2D7E5F1BB29387BE5FE9D3272768A65E1765AF706FA43BE09CA8B311B2B7C8B2125E7C8A4B52D1025AD5C", + "identity_type": "private", + "iv": "9AC108D06B463F055D49A91E14F2C8A3", + "key_seed": "A3A8F349F07BB0F7447F51F661AF542D6904BFC6087AF67511A645FE8FCE675C", + "metadata_key": "79B2212A99BB2CD43B34E2E1CA322B62", + "section_mic_hmac_key": "9E7F2E3CDC198279843A86A60FF128B9F349C11E48B67EDC3158A9008C9C36F1", + "section_salt": "DB399806753D8B6045C73A755B71774B" + }, + { + "adv_header_byte": "30", + "adv_salt": "26582E4CE5C251427F923630006AFCEE", + "aes_key": "AEDEBC8CF8F3BC8DE853731DCA9E4DC9", + "data_elements": [ + { + "contents": "DD433F55AF726FD4794FA327246F6F2132E92E62D21D67A321B864", + "de_type": 846 + }, + { + "contents": "D122B1144A43EFF0EB", + "de_type": 759 + }, + { + "contents": "7E078FD3", + "de_type": 404 + }, + { + "contents": "61", + "de_type": 461 + } + ], + "encoded_section": "6C9013D15EEB0F499029BD0116FEA1D3408043911000BF71BA034AAB72D7B4D362AAB499C78790029776023BBD26F7EAFC7B7928DD679D540975CEC90BD83475280C3DA16D23ECB642CB67456C25FA0F51560628DDED9F2D6662FFBDB54D11E57405825F77E5A34396BB7DF1A0", + "identity_type": "trusted", + "iv": "8040F7832AEB66320A2D61CB079320D8", + "key_seed": "118711EA1D5E88DECC48D0139846D57F64A7C1B61315B1A287310948F8A7227A", + "metadata_key": "51759DA981D7A83ABD931FBECED991C5", + "section_mic_hmac_key": "1F08673E88B1D86CD3E152BF6C9E31A06D2CC05F57F9C877D03809FDA407518D", + "section_salt": "BF71BA034AAB72D7B4D362AAB499C787" + }, + { + "adv_header_byte": "30", + "adv_salt": "6E2C7B1C5E818B1CEB5F7DE8FC9E5755", + "aes_key": "DFEAFCEE8B8EE1F96CA60E271B6725F8", + "data_elements": [ + { + "contents": "113C3E2039C4E1C7418BA6BB55FA8BFA", + "de_type": 366 + }, + { + "contents": "3AD067F40A", + "de_type": 823 + }, + { + "contents": "811535BFE2A541B0961314CECD50D59374E1B30D08DC", + "de_type": 763 + }, + { + "contents": "16FB893BF2AFEA6DFC5146AD63BE92F84C5D2D88607E46A228BB", + "de_type": 391 + }, + { + "contents": "FBBC7E70BCE1D5B1EB183D3B9E62FF8E14065D94930390FF", + "de_type": 382 + } + ], + "encoded_section": "A3901332173E24B194596D0A48EED7B9F048BF911000EABEA0196320B7B9C0A57A2E416746029001F85327E3300056CC3C0C0D434A64ADFEB159198EF001E2C778F56DBC1EAF9DB00C725E6688EE8812EB5DAAA339F4A9FEC3927310EC508FCA85C5D611C42DFBE9323EAA48FF38702EC1073C9C13B33BC2EB1BA89E3F233C1A326155F7B5745D05AD16976725672873F40CB030AD916DFF0A42EC4B84F5394FBEA97808", + "identity_type": "private", + "iv": "A9717CD38A876CE4107BD424D8FBA366", + "key_seed": "1148504329B3B33FA44E2A221DFF6CBBE1CD4A52248B6A09A8ADCD3012750977", + "metadata_key": "27856505C84E581AA1A6C46C6FA516F0", + "section_mic_hmac_key": "DDE977E035CC76BBFA8A642C1F143CAACE972E3216BA65A7D75E984A14E5ED13", + "section_salt": "EABEA0196320B7B9C0A57A2E41674602" + }, + { + "adv_header_byte": "30", + "adv_salt": "9FBFBFBF8BB497AB6444B41A2B58A6AB", + "aes_key": "862A0A31E0D23BF6CC4E9DD3D885718B", + "data_elements": [ + { + "contents": "3477BE93CA3B096D960FBE16F63BA456089D872D76F3CD00", + "de_type": 767 + }, + { + "contents": "3D9B50F6ECB3F59931BB2C31A67CB18D", + "de_type": 681 + } + ], + "encoded_section": "65901361778F70E6B5332529106BC5D0D796CF911000CAD36D8BE2990F1DD1BE5A8CA36725939002AE6B6909552DF36AFCC86E4D91C1FAF7ED62212D53C2B7F84E640B3E5760A41BD98F8A544F830A97595B8386EB3A27AE2CC178A5EE103CC275D404DA6417", + "identity_type": "trusted", + "iv": "783403F6FE6BA30DA746FA2708C4D692", + "key_seed": "3942CF4816E8B430A03E14D2F94108C0A770891FB4E99ACD3D277501465BA68D", + "metadata_key": "C78FBDDCEBF1A5384BF7ABC8064377D3", + "section_mic_hmac_key": "94053E6382CEC871376151CBB9694C564ED767E1EEE3239C941D914ABCE92CE3", + "section_salt": "CAD36D8BE2990F1DD1BE5A8CA3672593" + }, + { + "adv_header_byte": "30", + "adv_salt": "55FF1F0BE15C17461B43BAB93500700A", + "aes_key": "966B7CD205F081281E6E93C54EEDF15D", + "data_elements": [ + { + "contents": "D13D37512C791FB5ED13EA221EBA6950B0", + "de_type": 301 + }, + { + "contents": "6244AF57E139117455782A325E7E3D1C910FF0EFDFF03A", + "de_type": 12 + }, + { + "contents": "0E2D671308A90AD27AE72BD2C375CD2E1E54926A6DCB", + "de_type": 571 + } + ], + "encoded_section": "7D9013EF0E9E3112F9F8052BFCD5095F6DA7739110008EF37B9F957E72577A88E3E6616B1F0B90025B8420F2A9242BCAFC847C0C4D389501339DF6BFA0C91B4BD11343632BB679D50A288118A92B0FD09C57E75E13FA0DAA5C2F77D107185487F1F22CFC2F9B664D30F6D386975C72B046FA237531D0D5AAADF79593B9AE", + "identity_type": "trusted", + "iv": "1A624B59ECF332000562C8474140249C", + "key_seed": "5289A92DAA075E761F56E835F2DDC562DB148FE624E5C6FE08FA89CF5FCC9425", + "metadata_key": "F86972B236221A5B1DB9EDA61606B299", + "section_mic_hmac_key": "0F75B7C9F4CEBCB3D3CA5114EA5BBEF6A1065CD11CF1A401A7E3D6C2CEE85961", + "section_salt": "8EF37B9F957E72577A88E3E6616B1F0B" + }, + { + "adv_header_byte": "30", + "adv_salt": "257A8180A470B26312484B49DB427FBF", + "aes_key": "1A6FCC5E29E7D4BAF2ADE0428242C2EF", + "data_elements": [ + { + "contents": "FA0C8C637E390F8123345F41392EF8CE", + "de_type": 556 + } + ], + "encoded_section": "4A9013E976A9B1B377C5AE53AB1396521D337D911000CD1525ED218139EAFF89E47A20B34D4790044DE380677DEA81DAEABD099BF7E04531DF12F3E9C7A9C1B5CEB919C9EF3567915FB74F", + "identity_type": "provisioned", + "iv": "2AEF9979665B18EA76574CF455B20335", + "key_seed": "27AB5D93445CB4CEE55B3405325558636F198AED90C8E51836080F087A2E842A", + "metadata_key": "7C1A8511E3B9200C13C78F9EA4E57939", + "section_mic_hmac_key": "B1C4A104A63A1BA805D20818384EB39B6A440171D8C354424EAB9B6B7502DE77", + "section_salt": "CD1525ED218139EAFF89E47A20B34D47" + }, + { + "adv_header_byte": "30", + "adv_salt": "8D49077EA04B6722167FF9DC3E5A5C6F", + "aes_key": "1D3642C5B0338782485683BC113AD3C7", + "data_elements": [ + { + "contents": "0761DB68EB536A1ED11FF6EE1A2BA0B9859AC5DC206C", + "de_type": 490 + }, + { + "contents": "64DACC73432881300198", + "de_type": 69 + }, + { + "contents": "A2074C1932DACCD81D3DBA", + "de_type": 213 + }, + { + "contents": "E26C55BE99DFAE8088BE1A01890F801D9E382C5419E6EE", + "de_type": 118 + }, + { + "contents": "3D9D9009F5F0B28BAED466EF285DC30B93", + "de_type": 969 + } + ], + "encoded_section": "9790133210E2BD4D3A353337D7ADF84E63FD129110003B8C8A598DE9C86BDF539187043684DA900206D1B6437D8BDF3B6EA83CFF14D82D1241F0019EDF8FD5F1710CA0A9AE469B7F2EEDF319626F11376E797E91FA97E46F82B54406D5C1BB3032165223FBBE1DEB996FCC3C9036B8CA441FFAFE8846277F3FF098FFACB231D8DA52C7997AC3B2CCF65A875747EB0CDD02599308A56C5B5B", + "identity_type": "trusted", + "iv": "8D7F69E96E0B0FDF5711FC3B55A01715", + "key_seed": "AEF224AF0FB93E5306BE251CA4A2F387E5A5CC6630605B0A3E0C56D7078B679A", + "metadata_key": "7DCC60F2F58A401AAA957CF76649C84D", + "section_mic_hmac_key": "32E6F4E7934A34A459D136652114A9C0BD0A23AA4DDE36B51FDBF59C9A9AD9FB", + "section_salt": "3B8C8A598DE9C86BDF539187043684DA" + }, + { + "adv_header_byte": "30", + "adv_salt": "4E4ADE9BB0F5C4629AEA9E3F16EF9601", + "aes_key": "95CB67B31D524CCC83FE954FE9D4E2BB", + "data_elements": [ + { + "contents": "A1BA", + "de_type": 870 + } + ], + "encoded_section": "3C9013A8A3FE675DFAFB72CFC76C7833A5F9DE911000173AC3E1BA7DD39FA785C6E60BAED8C69002F3C038ED49854C212866A5AA075B6ABEAD7DFE458A", + "identity_type": "trusted", + "iv": "9C68198A56ECFD51E7F8B770EBC315D0", + "key_seed": "5F5ACCD7667D18B16F2F816046CACEA387775372D3C2CA44290C17F083B0D8AD", + "metadata_key": "D6F99ABC33D92064B46A910FCA2C4036", + "section_mic_hmac_key": "3E1FF3C4491442BC4C092D3DDCEDF840451EBE6C3D3A438C79B079AE4241BD84", + "section_salt": "173AC3E1BA7DD39FA785C6E60BAED8C6" + }, + { + "adv_header_byte": "30", + "adv_salt": "824423E2D4F67BECC3EF225445DB8976", + "aes_key": "CF185400D6689B037B238F61B0F8159B", + "data_elements": [ + { + "contents": "3C304F6A2D4E030A1EE524588D6B890A278EA715D7E72DA1F6AC41", + "de_type": 939 + }, + { + "contents": "EC9DC0C94D", + "de_type": 294 + }, + { + "contents": "291621E7F7496B", + "de_type": 704 + } + ], + "encoded_section": "679013E3EBF925B22D0BD4B57CA802DE30BD10911000433A9544240B8BEFDA531A895B5FC46D900266034C3D13145C66E02477FE8F718D1C475176016D59CED1DEDEEE6415C87933D3A6D137BD15079779E7CB0B172C0563C90C9A95ED56E0B171AA08E2AEF81C58", + "identity_type": "trusted", + "iv": "2569CB0445A6BF7291D567B280EC7903", + "key_seed": "81E738D2BF50C258C1144AA9371826CD04F166B110AEE21F696D0F776B35BAEA", + "metadata_key": "094A54CF97E267D0FDBC858C3CB5EAF7", + "section_mic_hmac_key": "8C3E857F64C351326BB726B05274A8645176C8C8678C82E9190604DAC1841CEA", + "section_salt": "433A9544240B8BEFDA531A895B5FC46D" + }, + { + "adv_header_byte": "30", + "adv_salt": "BC9A5197755D9A5679DCC87B79E1C9CA", + "aes_key": "374CF6450374370DD377AB35C40FE17C", + "data_elements": [ + { + "contents": "017B0CD8B639ED915D35886531E1", + "de_type": 58 + }, + { + "contents": "F66ECBCA7F402517158769BDD4E7D50CEBC2DF10F32E41911B510F", + "de_type": 856 + } + ], + "encoded_section": "65901307620D1E9A1EE0D4752BAF1CE59141EF911000BAF72D3D61009CA97C8FDD9CCBEF10ED9001E882E442913D85A2CC21169B9257EDCEC72349678006BF72A6C7FD18C85BBCF02E9843BC4ACE539C23AE19D1A79F63EC8886B34A7A32091C8873921F61BE", + "identity_type": "private", + "iv": "B5DB29371481C403B0349A10A7E33855", + "key_seed": "431919386DE84007C979116DF20230D0A60088C81C4CCE8491FD0CD5EF0C07E7", + "metadata_key": "78F91A3FC436CE326988B3C55EA9B5E7", + "section_mic_hmac_key": "B9CF0EFBF1F1F6CD77E6F8314FCB3DADFF55DE06B6B684E8739DD6B793BF7442", + "section_salt": "BAF72D3D61009CA97C8FDD9CCBEF10ED" + }, + { + "adv_header_byte": "30", + "adv_salt": "33F99E993A3416EC161F0044EC71B42F", + "aes_key": "BDA1D8D59CFC0C0E3C0232944E5A82DA", + "data_elements": [ + { + "contents": "C0F5E75C8B80C62DA67A5834B00A", + "de_type": 720 + }, + { + "contents": "894B67C2BF3458", + "de_type": 977 + } + ], + "encoded_section": "5290139B54D6302AB388F8B952001F3F233723911000DA579BCFC70266C882B420E1B122710D90018D8C89DA498ACF2DDD060B59D48A85249435080F054A5479432EAFD1089FCEFF46465BB7A63332561CFE19", + "identity_type": "private", + "iv": "F4DA1B762699DECE3FBEB755A3C8F7DC", + "key_seed": "E615C6F1F6494D3CB1EFEDB1CA97EDD096997DDDB0F840FB4B8A9A9AD8FF68CC", + "metadata_key": "9CCB7E17B8E4F311F5217BEE076FE193", + "section_mic_hmac_key": "08A3425953011FB61CDF4F73BFDF0FAFD337C6192847B028580392CA1920BDE3", + "section_salt": "DA579BCFC70266C882B420E1B122710D" + }, + { + "adv_header_byte": "30", + "adv_salt": "4F729B7E8A3DA79951DB474393B34C05", + "aes_key": "D4CFDC392B5398DA8EFF9761AC883BED", + "data_elements": [ + { + "contents": "7B3D33709DE248C8C6E55A17681634BBD51B9AD16CB70AFE732D434F73", + "de_type": 950 + }, + { + "contents": "572C1E1284C61CD3191CA7FD48278E69A871061C", + "de_type": 519 + }, + { + "contents": "F26F1FFF732399534BB9", + "de_type": 462 + }, + { + "contents": "25D3DA009DF358AA2B1502B102", + "de_type": 760 + }, + { + "contents": "696815F62069A011E27DB2B6", + "de_type": 116 + } + ], + "encoded_section": "9990133BA7F84BD37A8ECFF8991F41816603D9911000A24D83B5B489290033B0FB399D50278C90048830A62074CC528A053D57B871559B428C52947FE6AC380E6C409A9FE4CB2C778D396C9EB33D284ADC7AADB7FA26F64AD1E77EF8700C7D5011EB4188B8EB69C6AB8B247A3A408C296E0E9505DED7DC9B6B81B6AE18BDFE328F76BF28194F1C9FAACEA61A1305D8853B62E00E92B3B5DA906B", + "identity_type": "provisioned", + "iv": "27D31B8F040B8147F00DBE3EDA8DEB3A", + "key_seed": "E4ECAB1DF51BDE39E140E09E592023B0EBB70D51EF925AE06F55BAF1F232F965", + "metadata_key": "A74B0FB29ACAF1F6DCBF1D4B80D05D7C", + "section_mic_hmac_key": "064478CDA8ADA4303610AA070F13AB89C7FEFA11044EB17C620B4843A1D2B185", + "section_salt": "A24D83B5B489290033B0FB399D50278C" + }, + { + "adv_header_byte": "30", + "adv_salt": "532A9B509151D3891A89EC8122177A00", + "aes_key": "65CA1FBDA266B5CC1F687F05BCFFD91E", + "data_elements": [ + { + "contents": "28CAF4164DF090AF", + "de_type": 267 + }, + { + "contents": "2BC0D162D9A11B1592505DD0A88C222E3A05F584", + "de_type": 344 + }, + { + "contents": "5F0BE74A54E9C769E93876", + "de_type": 663 + } + ], + "encoded_section": "679013D6A5733B956C24C026EB4CD77CD241FF911000BA40F9A069E1D2864028AE47BC7FBF5790021A2F29AF45309E075686A17B858A7453DE7F746B1A9AA04C68901F0BAEE8474D84BC96034338542D2FCA389DB128BEC31B187D96C2A7BA001B53B5F3E4B058B9", + "identity_type": "trusted", + "iv": "3B7CD74E54AFBF2903999BDAB75C4E77", + "key_seed": "65A6D38463734CF87E73D55D9695658B0C08ED9F35838884F08DE839C224AD9D", + "metadata_key": "DDE0C29AAF70BC5299D0945DFDB2A320", + "section_mic_hmac_key": "5E63974EFE6650031F0244E69A2533ACCEDDD75479D939E5DCCDFE355FFA52D0", + "section_salt": "BA40F9A069E1D2864028AE47BC7FBF57" + }, + { + "adv_header_byte": "30", + "adv_salt": "D5487414BA08F69CE9D13560766378D9", + "aes_key": "4597450D328A4398969C6984A4812726", + "data_elements": [ + { + "contents": "5594877DB8046C", + "de_type": 749 + }, + { + "contents": "D49D19549FA675ECB739E031", + "de_type": 1 + } + ], + "encoded_section": "4F9013F87D55A4AA36BD81DEB11033F76E60A9911000F948EAC4A61D540FAF5BF958C0AA15029004969211CDDBF8AE4D251A89A69378E93D41D2C6E1FAA39580C4606EE81B99B2F7146566D5F3A2D187", + "identity_type": "provisioned", + "iv": "7251B83564C131AEE0ED8E7D4B2657B3", + "key_seed": "32055A58CFD37AC838F8978ABEDCC2A30BC8752D9985DC4F24AA8010B4855B06", + "metadata_key": "1C85CA810627CA299F3E7C5D8F2CD904", + "section_mic_hmac_key": "20D173254B6DF487603D339E1BB394DBE0BBF19F4680F2FD3DD3EB3E389215EB", + "section_salt": "F948EAC4A61D540FAF5BF958C0AA1502" + }, + { + "adv_header_byte": "30", + "adv_salt": "7443AED9489E3C74C778C996DE9B67C3", + "aes_key": "D131442579CCEA76DA56F4E5171F09A6", + "data_elements": [ + { + "contents": "C879C6B33BAB741D400BB9A06533672BAC016E", + "de_type": 367 + }, + { + "contents": "5ED5", + "de_type": 783 + }, + { + "contents": "0C31C60E1A246200DF872DD766E501", + "de_type": 288 + }, + { + "contents": "38B9BAACCDD2C285CE1DD7D4C101E8FAF4DECE26190B08E1942D71D30434", + "de_type": 835 + } + ], + "encoded_section": "859013856E63F667D52C056607CD1EC8638385911000E3196F7725B52982CA91690DCCAF3D15900132BC6722DBC8E95809378C5569E0FBBE845D96271B645007A3D4A698F25B8A816924D66453873D49313DDFDDD5158FF1A9C0318C0EF5CC5604A58C9E6EA95E2DFAFD40939E4DA0BC33B5DBB471A83773D6E1CB927E79C0509447CB9291D2", + "identity_type": "private", + "iv": "6EF81828124A99A5798762BDCD4F0CA7", + "key_seed": "01281A1DCC6627FB7336A190C0E316C0225EEBEB3DAFD6E79DF86BE811EB5B1F", + "metadata_key": "5DB0440215FE4B0B403027E82DD05BF1", + "section_mic_hmac_key": "FD0BCBD301B26D355985422BC65A0414C2FF451AC7837EE31DDFCE060E6F76C0", + "section_salt": "E3196F7725B52982CA91690DCCAF3D15" + }, + { + "adv_header_byte": "30", + "adv_salt": "01CDD6964C7DCD733D0365A455354A94", + "aes_key": "F9EB800C6E2AB6E3457E3DADDA4E14EC", + "data_elements": [ + { + "contents": "05013630B53FA97478A6B3B4E9617A2B35C4200EA5D1B29D86184A", + "de_type": 161 + }, + { + "contents": "591FB0F89D67D7B2FF2FB27D6B8C", + "de_type": 821 + } + ], + "encoded_section": "66901370C473297041FA4A4260B3995CDF0851911000BB3A62B2E753295B664F3C1B06172B33900186CB039689830CF401848577471BF720CB31EE848CA200D7705C87C3EEBEF421399B027060C18731B7FF977CCB90406E7BFDF0A4D389D6EFD11F426B89B35E", + "identity_type": "private", + "iv": "2195E6D71AC6C2AE69D6DC7E7440FCDE", + "key_seed": "B9AE3932FF811CC014314D266D048E145DE60956DA53BB98D96CBBA136314389", + "metadata_key": "F43D7EDF61357AC7B512D6502D5F1EC7", + "section_mic_hmac_key": "5685062CCF0CF66F8EC8F0601442AE4FF9CB028F7F693235555A7918B83CDC44", + "section_salt": "BB3A62B2E753295B664F3C1B06172B33" + }, + { + "adv_header_byte": "30", + "adv_salt": "201E65F2C73E6749E104294C5B80BD0A", + "aes_key": "9FF2BAEB97F201967B41A9001556C782", + "data_elements": [ + { + "contents": "42AD133E97FD6C468A8BB259F4FC05", + "de_type": 673 + }, + { + "contents": "D7B8495F3785063C4A4B988EEB3804CC5E7040", + "de_type": 973 + }, + { + "contents": "FA600360B5B21558266D62", + "de_type": 30 + }, + { + "contents": "6E90096C876401A20FD96E0A307C57C08893C533C3013A894380ACCFAA", + "de_type": 176 + } + ], + "encoded_section": "8C90132F63EC2519B043C70FF4BC0AEA11B040911000B950743AFE9EA5BD4C03AAEDD3D0736C90044510CBC7D4252D98D4AD42CBFDF678C7D2A145E3EBF06D19FD695399D65444D16D7208A4E71B6CD26FAB2990E0A1F7308F5E2B73461BB7D81BD86EF287D1DCD3467F846DB7B9231F17C535082924817941954F82B95791BFEF9530BEC4D3177495EA68B59A", + "identity_type": "provisioned", + "iv": "3A32A1543E3241B3C6C7D7C40430B793", + "key_seed": "8E5C4D3AC2D07C2092CFE2D34E54C63A572CD8187316161E3DBC78AD90F8353B", + "metadata_key": "6389D90BE57C99D0147423C3088C8433", + "section_mic_hmac_key": "421BC7BAC32D064027C7D3A5609CDC742FE9988282040A0DDF07BA67FED68DBE", + "section_salt": "B950743AFE9EA5BD4C03AAEDD3D0736C" + }, + { + "adv_header_byte": "30", + "adv_salt": "BF4149101EBD062FD66BB8A15D8D97C4", + "aes_key": "D25E758A7A3B45C004D6CC5D04BA496E", + "data_elements": [ + { + "contents": "6E73EAB3E73F8231F2E9985E31B82C1DE362F26327FF355E45", + "de_type": 457 + }, + { + "contents": "173120937001D3979F203D7008E83A2452", + "de_type": 115 + }, + { + "contents": "D857E0E0C4FD3A32A4167DE23D9F4B67", + "de_type": 989 + } + ], + "encoded_section": "7990130DDE44464CAA38BDE84281442900A8509110005ADFF0C03105B2B399A18E9B17168E6D9004AE5A46E81D5F0C9569137015FDEA89BB572AC008302F09D2AE7BB332431A38B0034756E35370BB6F6408594F8CF8898565D4C7C985124484911ADAB72BFF3DA57A6D37618AD5EDB2093AF1C05C186AC624F3", + "identity_type": "provisioned", + "iv": "22ADBBC7329D0E519D5F94A63E763E74", + "key_seed": "FAF2516570FE1256279CD47301C50DF52C2327E6DD7A5653AC6231CA6D788B35", + "metadata_key": "350488F862C7604DDFA0272A3D21B786", + "section_mic_hmac_key": "D2824640C9C9593142EB2CFA6E58AD8E4B6A27F97422A429DAC36D0FF98DD312", + "section_salt": "5ADFF0C03105B2B399A18E9B17168E6D" + }, + { + "adv_header_byte": "30", + "adv_salt": "3DC3253CAA257609187D246F31331F3A", + "aes_key": "73A354EF72BCC07FC9473B64843E5669", + "data_elements": [ + { + "contents": "9835B7634A82F3DFE1EB3B0D25EACF27B111", + "de_type": 786 + }, + { + "contents": "AE349EDFD372502D738B6CE186BD30A24BB77E", + "de_type": 462 + }, + { + "contents": "27A1F50AB7CCEB9B0D69DE538604F8957E44EB05D27608", + "de_type": 570 + }, + { + "contents": "FF7EBE", + "de_type": 960 + } + ], + "encoded_section": "82901331D537AAB3FF00D04936F0A31A2FD4499110006D7E10C60B7F564BD819EEF42810D82290015B0B2252207FC9225CFC1A3E91FA6BCEC5EE55CBC4B9D4CE2C809C666602339E88B12F6A145C89C06C744499988D39A8CF69A2C73B3625C54DD58A74DAC3511558EA11A36ACF302DB6FBC1091E0018672C1299D834A56FE53E6562", + "identity_type": "private", + "iv": "82F350EB514C88202688646DEADC2AE5", + "key_seed": "B7846E30DE6251075FFE9DFF3EF493655033CE4DA3721204249FDAC0FEA81EE4", + "metadata_key": "D6848E0588A7653DBB03F88A3984F6FA", + "section_mic_hmac_key": "EA643D83A79705A66FE8DDBD3ECCBAF88E3C1F80B68C2C406216F65CD1A232B8", + "section_salt": "6D7E10C60B7F564BD819EEF42810D822" + }, + { + "adv_header_byte": "30", + "adv_salt": "E31F9F8EB3513BDFB44EF96AA620AAFB", + "aes_key": "4258A9B2525ECF4A5E58E1C2A9063DD5", + "data_elements": [ + { + "contents": "ADF8FCECA7E191B3517BD0CED3", + "de_type": 968 + }, + { + "contents": "B87EF036921C2A821A7F1870DE5322CB54C78317881EBC0464EA4CA53C", + "de_type": 932 + }, + { + "contents": "EB", + "de_type": 660 + } + ], + "encoded_section": "6B9013F16715F33E9D6F1CB228C7980AEDBF909110009EF4C8B8957C9963F83740019009F8CB9004BA838E0DF9D06746AE2BE8D725EA825AEA40D89326B71B94F0182B2F1187359CA49DE5B68FEB2F489617FBD98183BD84D2A015061EE9D1586BE943BB3AF7631C2BFFEED3", + "identity_type": "provisioned", + "iv": "E4C0765EE932EC49F352EE800E95BF09", + "key_seed": "39F40C082855D864F9EAD4D2E01AABDCFB3AEEA2D6E3CF8BCB5319EA1AAE1C5B", + "metadata_key": "BD48F853813C1365B9D7E7B62FF934B5", + "section_mic_hmac_key": "9FC866D3FA1D25D6A429BA6E8D8BC12C64860E5FBFA2995B6F5C27C3D8C7B940", + "section_salt": "9EF4C8B8957C9963F83740019009F8CB" + }, + { + "adv_header_byte": "30", + "adv_salt": "BCF433EB76C6DC46D6E21B55EF890A62", + "aes_key": "4E79EBA2284EEFAF313F7ED5BCA05ABA", + "data_elements": [ + { + "contents": "D15571FE1145DD2C7490910BDD0C", + "de_type": 910 + }, + { + "contents": "170565A8A4", + "de_type": 762 + } + ], + "encoded_section": "509013C3275F9959C9B6B3984A4D9D7ADBF846911000FF62C0D98902FFC817A5262C7AAEFF34900297B89286BBE1563519BD6A4D344DA0D02A56227C8F15BD7419D3191EE89E07DEDAAEA2C80F44A3BCAC", + "identity_type": "trusted", + "iv": "337A5A9380E964FA6BC47A318FCC34D3", + "key_seed": "E7166D09CDE23D2758F900FE5256262B4E9854C004C565E86240856C6C9C5936", + "metadata_key": "7C7DF4DDE672B397105EDFC764E8E659", + "section_mic_hmac_key": "2DA615C9E80E2528B13F1EC95860BA8BFCE20D5BB09B3B60FA9CC4429AE7B58F", + "section_salt": "FF62C0D98902FFC817A5262C7AAEFF34" + }, + { + "adv_header_byte": "30", + "adv_salt": "944EE800BE99462E7D2CD5B33FD5E63D", + "aes_key": "567FDB0D6E7E46FA89779F09423DAAB4", + "data_elements": [ + { + "contents": "BDE03470416E865C3BABD4", + "de_type": 462 + }, + { + "contents": "D6CCF4C7C2F63DCC143C3D9DE7F43227D61E670D42C8B68180257EB370", + "de_type": 128 + }, + { + "contents": "20C72E3A955F310EB699", + "de_type": 101 + } + ], + "encoded_section": "71901353E7C27131F33499622E7CE6CF74E3A391100046B0B64F499BC8A30778C7EE5E5D53C890045B77D7B11E140D541F75ED8F022F45EE22DF1E033AB90EFB89C5FA7EFE75869168A17A3E5923DFDEF8E94BD2714B039A98FFF4C834E4ED222C88CD29501B34BBD59E294039D5D8AAC305", + "identity_type": "provisioned", + "iv": "429662A647C2A5C874388D09ECBD3863", + "key_seed": "B08E79ED71A776EC7A12D208D40263839BCA251400D223DD604FB46006B16016", + "metadata_key": "3BC1E5BA014BDC2F3E86557B27439B42", + "section_mic_hmac_key": "3C3A1354B81E8F4BF020D00025F63B060526C77F98F41EE759A002AB5E80BAC0", + "section_salt": "46B0B64F499BC8A30778C7EE5E5D53C8" + }, + { + "adv_header_byte": "30", + "adv_salt": "40C50798CB6B90E84B28C2DA92DEFE6A", + "aes_key": "E9EA2C7ADF7FFD2FF4AD9FE602B1FC1A", + "data_elements": [ + { + "contents": "B8C8CDEE", + "de_type": 793 + }, + { + "contents": "9A", + "de_type": 749 + }, + { + "contents": "E449D3660409413C63", + "de_type": 588 + }, + { + "contents": "BF5F66ED2CDF72FE206A9E", + "de_type": 52 + }, + { + "contents": "EC62382023B21EA450983368754FE9B2AE", + "de_type": 39 + } + ], + "encoded_section": "6E9013C9617663F4A258ECAC1D10242CE9C20491100044AC3079A59D58FE95ACACC78E24D4CD90015F59D0C643A5B519A0B0AA437E113BA30E055830AA3D8DFDC8B0CE7BC4F01FFC4472BD93362308715535B643DC58C7C9288EED97CA0687EBC5AF4C2DD4E48464B7974101F424E7", + "identity_type": "private", + "iv": "0E0F84344052E7671CC153002EE1CBD9", + "key_seed": "15F230069139FF86FBC71850F7AA9275ED0BA1A471AFDD4F6F4F32718FC180C1", + "metadata_key": "99FDD5669D2B0D5F466C202F80898CFA", + "section_mic_hmac_key": "F933F36F11D6751204A7D4AA5D00F6D930CA7947DEDFA8E588AE32CDC50355FA", + "section_salt": "44AC3079A59D58FE95ACACC78E24D4CD" + }, + { + "adv_header_byte": "30", + "adv_salt": "C39D831B39DADA8A4D2FDE8CADD7AD5A", + "aes_key": "40777A255D48F7182CE23A787B7C5765", + "data_elements": [], + "encoded_section": "379013F6D0187446372B4CEA0E67575D4EB9E09110001ABDA9EC38BF3FF2C4E6CEA7CB296FAB90021EB5EB4EE1AC52FA36C007F242C903B1", + "identity_type": "trusted", + "iv": "8BF471907B22592267F1C653662E40CB", + "key_seed": "630FE25E7432AC0D3A4DF3B2FD196CA8B774674B7F65CBC1B7EC8C680EDC88DE", + "metadata_key": "CA7D44E7F05D3FE953991E5E2F4F65E6", + "section_mic_hmac_key": "3EE2C708429DF966A211FEAEB99AC02D4B4F88A1AA6D1B3350E0E72D6916472F", + "section_salt": "1ABDA9EC38BF3FF2C4E6CEA7CB296FAB" + }, + { + "adv_header_byte": "30", + "adv_salt": "97552E387E6AE7F19813273C95BC98DD", + "aes_key": "C6F2E67244DF14B25370D81999B3B703", + "data_elements": [ + { + "contents": "48294D8737F6689CA1224806F2BE96746AA3F7E9", + "de_type": 281 + }, + { + "contents": "046A03298AC6CC74C9875F01C585EBFA285FAEE43330", + "de_type": 662 + }, + { + "contents": "5772009914B0F7D03D99EF3848500E5CE2CF1BB8967A4802489DB999", + "de_type": 294 + } + ], + "encoded_section": "86901375877260F8680F64A523EAEACB6A70A6911000C9BED517D11AD9DE1BD79769B4BF1E6F9002B350E0DD7516F6310B5565EF2CFC16FD0F7ABB3C9672D2A4273D874DAD2A50F90B827E7DD2D1F3144E9F44CA56A8F5B8CFBC080004EBDEBD57572915FC3B3ADD1722FECF6DE45A91F1E383F15C990E22790A81DACBD72D7664F3941D15CF05", + "identity_type": "trusted", + "iv": "9343721F3C8067E079543B212BB2889B", + "key_seed": "02AB71C90D39A12A244CF71B024542CC16A83A213203F410FB5E68A9E047C59E", + "metadata_key": "303F6356D15193128F6E6B381E88EE17", + "section_mic_hmac_key": "4E43FFB12A718E30D9F2455E985C46D0998D11D65E84CEAA3DF88E5012AAD482", + "section_salt": "C9BED517D11AD9DE1BD79769B4BF1E6F" + }, + { + "adv_header_byte": "30", + "adv_salt": "71BC9ADC29579DC8A0E0487EAA5230A7", + "aes_key": "9620661A0AFDB63AD16819514497C47E", + "data_elements": [ + { + "contents": "1C1A3657E3A21392", + "de_type": 220 + }, + { + "contents": "6C9F1CA43BCFAB1857D7805A84E4A516FC4D9E7C9678DDCE", + "de_type": 740 + }, + { + "contents": "089BE9", + "de_type": 171 + }, + { + "contents": "331FCCD6645D0E6C2FDC35F3AF3AF969F2FD0282A81D061DD11111EA08", + "de_type": 645 + }, + { + "contents": "60A8B144593D90FEFD6253F416B570B8E55F1BBE4A5D", + "de_type": 986 + } + ], + "encoded_section": "9C90139CA48B7A14644F84BDB15949D54E4D929110009744CE2971F1B4E26F8073C4B4849A10900130945DF1008EF4B256752CAC699B2CBCD0A736335A415D81671FE6C4E62E1AA6721CB7B9A862FDE44D4865E8CA00D9689848B19ECD766EF2612D73BE4E7DF50E81C75FA990DD295777F5F9D4B89D619023163C2ACEB31EE43CFCDEA866EFA0F1F98DAAFD0097DFE4564D5158B26EDBF3943E7D1624", + "identity_type": "private", + "iv": "7D0C9BE18436626C75E5F109E9FA6505", + "key_seed": "06AA79A2060D335E6035AFD4807E33B665C0AA91D672258386D3C8A18BF62730", + "metadata_key": "7011E726D054C8F0A3AF0A64CEB3C04D", + "section_mic_hmac_key": "FC9ADB7DEA9F8B9BC8AE7EE4E37290FBE67F49938209F722BAF94F00F5AD8A3D", + "section_salt": "9744CE2971F1B4E26F8073C4B4849A10" + }, + { + "adv_header_byte": "30", + "adv_salt": "96AE4A65693FECD0AE7DC294E815285B", + "aes_key": "766190BC62AA978ECD78A5FB1B9393AC", + "data_elements": [ + { + "contents": "E2819425AA7B8D06E07D12EBAA19", + "de_type": 112 + }, + { + "contents": "668F51765E67802E8D947DC83432A82F4F9FCDC3FE56DBEA", + "de_type": 997 + }, + { + "contents": "9F", + "de_type": 189 + }, + { + "contents": "B7A803AB085D7464012E7141C92759CD5ABB1D5EE20252D40B", + "de_type": 910 + } + ], + "encoded_section": "8290134C5FE3E874324FF0481B9CF6C7BD23DB91100042F06DF6293FE7CF1755C951BE41DCA190029B0054551005D376488CBF35207D28173DD036E39F6D2DB18CEB5F87FA981F7695589EA3C6CED88CA59C664CBA7F19F5AEA26ED8B819F1A98A2290E8AD88955C9B1CE698BA709C76E66BCD3E0EC22BB6AEE6E2D45619A100FA717C", + "identity_type": "trusted", + "iv": "D5A0D32FD5106E9435882D01E1B6367E", + "key_seed": "1D64C492D1FDA772BFB5BF34A65A186C4571F0B131A19A15C40644C5D597F7D2", + "metadata_key": "18AE245FF683EA4D131CB3B9CBC5AD5B", + "section_mic_hmac_key": "C147044183E1BA4466D363443FFB1F6868D7B9B52D128E702757AF3A8872E2DD", + "section_salt": "42F06DF6293FE7CF1755C951BE41DCA1" + }, + { + "adv_header_byte": "30", + "adv_salt": "D6A98C7976ED88F4776F57E55051BA42", + "aes_key": "D6F42BD59A9A4D83D113E168F945476D", + "data_elements": [ + { + "contents": "33E7567D2554B29992ABFF5F", + "de_type": 733 + }, + { + "contents": "1CEB66A7934CD81BDE08E0B4C68F418C", + "de_type": 235 + }, + { + "contents": "221A4083EE6BD86567C08EE459ECAF0592714C08F3C4541C254EF7B1", + "de_type": 664 + }, + { + "contents": "9802DC6EEC151819FBCBD2208784FC5F45E439518A33BA49C30C9812", + "de_type": 700 + }, + { + "contents": "F59E9C167060C57F524B06FC2CFE8C30B7C245A5C9F02657EBBC2E7F", + "de_type": 938 + } + ], + "encoded_section": "B690133CE3C2FA05766D5CA1A3D5EB51D94E5B911000C154515607DCD6F34C441B78BA3E68A2900155F5CC8E4A8A8E627FBB74C83F67F73F72C7B6F84B5897C890D28B73C4302EFD9EB62782B56E9D0C9F64B75CE36FA88E9C912A29CE40AE572A564E74BE9DCD07E0F252C228F235DFB4CE51B033D4D93BB28E05147464D77673CCF87AF583F02574484839C5407D83B93676066F280BD2E62E586A465D1D62AD7CA1902CD7FDD1C69ADC1A99A85BBD1E56BEA1F7B6AF", + "identity_type": "private", + "iv": "8A66F137E1DD93ABF2E6F8DB8E5629A5", + "key_seed": "0ED34984F8608A1ED2420168D3E39EAB29CAE89E6E00F577A2FE2435E371BA8B", + "metadata_key": "6D78B0D9464EF03BAB914959BF7471D3", + "section_mic_hmac_key": "F77AA75CDBE8F413D63FED4997A9DF7B110A1EE1238ED913DEB1510213F82FDB", + "section_salt": "C154515607DCD6F34C441B78BA3E68A2" + }, + { + "adv_header_byte": "30", + "adv_salt": "95D42E733AAB2A8F4623607AE3AAFA1A", + "aes_key": "307EB5096605C93D74051BF3019140FB", + "data_elements": [ + { + "contents": "CF43", + "de_type": 272 + } + ], + "encoded_section": "3C901309D2D105A3900C7562AD0B847A6BDCD2911000719CA000E206EBB7E414B1F331D8879790017D362D435E3C563734593A7A7A1F6FB1DEDD3FA0A4", + "identity_type": "private", + "iv": "CE936BD2A93680E285FE69D3519B37E5", + "key_seed": "3CACB47DF80E06C8E73F10B1CA40BF090558409363E97E32EDE98ADDC25B7948", + "metadata_key": "70936418E7BFF920321C1D1B1E22E5A5", + "section_mic_hmac_key": "37593B2D5BA45C77CB0E2C19246AF6FD05B182409983BE087D9C100BDCC2B7DD", + "section_salt": "719CA000E206EBB7E414B1F331D88797" + }, + { + "adv_header_byte": "30", + "adv_salt": "7C6A5E9D266FBE338500EF4B1A9AE1C9", + "aes_key": "37B697BF854925E9E7CA558956992E29", + "data_elements": [], + "encoded_section": "379013BACA5D191A040F13B2D30C356C3C383E91100026E263D75F5CFB71AAC091E648255C629002BA53540471CBE7FCAF7339225583900B", + "identity_type": "trusted", + "iv": "88A2CC9AD86FE18152AEDFE96F0264F7", + "key_seed": "666B0E3B2CE558955F83D1992C4F3CE552B1591BE1FBC39E7578A33D4A66015B", + "metadata_key": "9EBB6E6E93A85AAA2629A791B4760394", + "section_mic_hmac_key": "8FE26D7990CF7ED06F5FD77E2F78F5D99DD08D6F366D2C6166286A8C92478306", + "section_salt": "26E263D75F5CFB71AAC091E648255C62" + }, + { + "adv_header_byte": "30", + "adv_salt": "F8170168CDB98E6054D980DC4F486BB3", + "aes_key": "A723C83FFDB884866843D23669DC6225", + "data_elements": [ + { + "contents": "F7844444403E9C", + "de_type": 782 + }, + { + "contents": "8233B24F5F14FFE07565AE42", + "de_type": 69 + } + ], + "encoded_section": "4F901345A324F37CB55A5C0949CBAD49CC11BD911000668B8E44F0078A09F12829F40AD701F79004F968AECCC04CCB53902EA8B7A9AB90AC9D3507DA5708488D8A6D1A681DAF59454152EEEA00D55441", + "identity_type": "provisioned", + "iv": "FD415093D0B11FCFCD62D5EF7EBA2EB1", + "key_seed": "1661E1DB8407DDF7EB6909B99391A568FCD11321E9D340BA2C5D3E802753436D", + "metadata_key": "443844D2B1B640CC1C9A4CB862BD5B5A", + "section_mic_hmac_key": "CE882FC63AF0978CD195CB6DDFA2FD4F77162F138567CF2795776F32B834D7B0", + "section_salt": "668B8E44F0078A09F12829F40AD701F7" + }, + { + "adv_header_byte": "30", + "adv_salt": "7F1798862045B2359834FBEFA172D80F", + "aes_key": "612224E493519B499DA8E37EA72BD934", + "data_elements": [ + { + "contents": "440654B4248B492CE5D00CA61809", + "de_type": 768 + }, + { + "contents": "D417931E9C9816A0289BD8855D855FCB21", + "de_type": 166 + }, + { + "contents": "E8C520AFADCD6D672723D0DA5828F73C6FB01B9F0DC6F7B4D6", + "de_type": 139 + } + ], + "encoded_section": "7890130D0ADE5589F80B65A31269B928FF63D0911000489AA2FF0B570F1558FBCEBDA587BAE590040E64FFDBC2E0CD5EC3C8DF92196E4AF3057ADE7C296F26DA271D95A20FE7C1ECD2C28A8947CFF6007D293217FFA58261AD7F3D223DC7F1C2F2B19F696ED43E593593FDDD0E3AA714D6D646F34DBDD6C298", + "identity_type": "provisioned", + "iv": "FDCB3FCDD56A66B6C933BBFDF96A9FB5", + "key_seed": "8293C98B9D0BF923A3721AC82F2AD92EBB1CA01487D3CEEEAC8CD21CDD69F4DE", + "metadata_key": "78F9E8DC1BE37E91D04C8AF24505C390", + "section_mic_hmac_key": "8B092819354220EA5B74C6332BDDC7D8D817B74789F17501F6D2E13230D93633", + "section_salt": "489AA2FF0B570F1558FBCEBDA587BAE5" + }, + { + "adv_header_byte": "30", + "adv_salt": "8140D71FE04244D8BCA21C9B5080A385", + "aes_key": "CDF733CFB60B594C37C1F1970F06F23D", + "data_elements": [ + { + "contents": "9EAA4D737BC194651FF11D027E653915B66F89CE", + "de_type": 146 + }, + { + "contents": "85", + "de_type": 517 + }, + { + "contents": "B2D927", + "de_type": 37 + } + ], + "encoded_section": "579013EE370B2CFFB5850F24E31EA18EA165E59110009CE7EBE57787FE3B841AAA34A9CEA8879004B79F8E5622D80A40CD40274BD5D19B70D57D842372B67C2220EBC1B075DDDEAE5B7A6E9BC8BB0C1104357CD7F9E27856", + "identity_type": "provisioned", + "iv": "3A43AAD47E0F8DF1D833F633226CE6F4", + "key_seed": "645E00EBE423EDD4AB5A50D7EDD53F4B94B75EDB68D8FD639D72FC1474AAAB6A", + "metadata_key": "AE54A918EEA35A8FF008113B344C0707", + "section_mic_hmac_key": "8D07A0FEDA41154101D987AC882BE0C42375C3F66179A2260997983912026192", + "section_salt": "9CE7EBE57787FE3B841AAA34A9CEA887" + }, + { + "adv_header_byte": "30", + "adv_salt": "6D9C63CC15928B2584D3A469A65E0BE8", + "aes_key": "3571B4319B4687C0D5D54F436896C228", + "data_elements": [ + { + "contents": "782C0F67D4BBA10130696435243010144820F4752910F9B0E3F80FC0", + "de_type": 381 + }, + { + "contents": "9B336B1421B796A9C8F97A20705F", + "de_type": 870 + }, + { + "contents": "9F23ADFBB8E3EE4C54450A49552A6A", + "de_type": 506 + } + ], + "encoded_section": "799013F321877FD6CAD817E2C641F8A90FEF4C9110009A96FEBC9A8FBEA4A344561254552C7F90046293184DBBFB610A416EF1FA50075E891A3937FAB2E51B6F0812D0E3ED51EBAC6849CC78AD2B85DAC2992CAFF2D2D2908E1F5A90889CFC1FE1CCBEDF435FEA597C4E2A2C2D220E4228E8463755D57BFEB5EC", + "identity_type": "provisioned", + "iv": "DA7041AB2C2B7685E1DC21095428E0D4", + "key_seed": "839C80E9283189E3AB98E48862F375C4B87CFC3B6F6C044DB5E26AD4DE364323", + "metadata_key": "BBF2E5F0D26483F19588EEC82EDC6C12", + "section_mic_hmac_key": "12445B6BAD94883AC9E4DB8F94BA02D08DDB9F7A070EEB7D3A8A6FDC10F176E2", + "section_salt": "9A96FEBC9A8FBEA4A344561254552C7F" + }, + { + "adv_header_byte": "30", + "adv_salt": "35A8251868DD2E1A9194786BE8C64BFA", + "aes_key": "A7B21AEEA0C66BE702188CAAE0EA6512", + "data_elements": [ + { + "contents": "A9055442F2B47596B0DB0A971C07", + "de_type": 961 + }, + { + "contents": "D71C", + "de_type": 677 + }, + { + "contents": "E57B64B155CF7527D751CC68B263A792C2", + "de_type": 265 + } + ], + "encoded_section": "619013AA0300E2A8F8624386FC6A4F5F403591911000837E4DF997864CBF37E0B55EB497A1C490027D171341BA6F6E8007CEA0ABBF21B146571A065717806FDAD5CC16C8122394811D1EB1F4B25D784D9CD216CD06A40CAC8DEFE77C0A19BF542ECB", + "identity_type": "trusted", + "iv": "BE19F81834F18C01B380AA4092DE5F1D", + "key_seed": "5787FAEC4C0349041EE656ED1407458B8F07064FA7FF965C37E01938E0939071", + "metadata_key": "23C90D62E06A3A03EA5E4DB7E27387A6", + "section_mic_hmac_key": "790A1AEA80F909DB3A515737E1260748040994491F71C97E02BE9042B5F0FE83", + "section_salt": "837E4DF997864CBF37E0B55EB497A1C4" + }, + { + "adv_header_byte": "30", + "adv_salt": "F3C6A0D85CF7280DA0AE087536D46D4F", + "aes_key": "714CFB9897FC29FC146F4ED1980F8A02", + "data_elements": [ + { + "contents": "CA93EB016F5AB0EAEE15BAAF19508C09E9FBE3ABF0CE6DA662CDD7", + "de_type": 966 + }, + { + "contents": "AA7C1AEB498A8A539C7F9CA7C6AC", + "de_type": 924 + }, + { + "contents": "9A7BFF", + "de_type": 856 + } + ], + "encoded_section": "6C901340616A3CEEE6E3DB8958540220AB0DF8911000D6C0D020C67736CA0DA95743E11FB3559002E77AB2D50E5622942872D90F79889A1211EA3DFD68974FD22077EF7E297B27655072A61CA8148751503D2F945419CC3A41D10116203246F7A29D557ACB20AFEC92FDC3F6A5", + "identity_type": "trusted", + "iv": "CFF129908DEBC64E87D30CEBD7CFB92C", + "key_seed": "E76585B665156041F17624D98389BC90CFB1F7B5FC98395CBB0C92BF39275F08", + "metadata_key": "11E5F0AD1D1064EE76EF482287716210", + "section_mic_hmac_key": "D388B45C5104F5EFF3114BFA514843F086F9CDD012E32ACB4322B3AFC3EF25F8", + "section_salt": "D6C0D020C67736CA0DA95743E11FB355" + }, + { + "adv_header_byte": "30", + "adv_salt": "899E72C0ACE8467E62C1534EC6C7A9F4", + "aes_key": "0ED6FFDFAB0E1775C01399C65FC1EAC2", + "data_elements": [ + { + "contents": "46E4", + "de_type": 164 + }, + { + "contents": "1CD5EB57C26AB946B644C8C6D2EA", + "de_type": 147 + } + ], + "encoded_section": "4D9013D876C620764709BA76B867262A767E9891100003C6477E17249A35DB289D156146DCE19002C34E905787280A485090274A6BE1EB6BAA83C8A860B7E10EF6E68170CD6CD856D47F1B5212E4", + "identity_type": "trusted", + "iv": "9A9EC26A4DF843F67A50C2883B2049E5", + "key_seed": "D093FD917DC3D0AACFB61D214DEC5CD7E9F4D9D1B38A16DC4746005201209030", + "metadata_key": "47EF5956F658168934538B98AD8039EE", + "section_mic_hmac_key": "15D1AE58C9F76DD3D6AF7D332A79746DAC7CA69EEED1E03DE1BA3C2CBE6D0D34", + "section_salt": "03C6477E17249A35DB289D156146DCE1" + }, + { + "adv_header_byte": "30", + "adv_salt": "37D4F69D0CD26B40E94ACE2A5DBCCEAD", + "aes_key": "ED777D47AA2B1CD9A18A679A11D2D4BF", + "data_elements": [ + { + "contents": "3A3396B74739FCE4", + "de_type": 813 + }, + { + "contents": "", + "de_type": 280 + } + ], + "encoded_section": "4590131BEA8B2830E5C0EF21FAA31033A5E5D8911000795CDD085DB06D32AE5FD26F7BCDDBB79002B6A7C8FB0E06CD39246BE00D8F824C8CBFBE5FB5B4CC94298EEC5CBDF16F", + "identity_type": "trusted", + "iv": "BDB607DE3CD62030073D459C5B8D6C93", + "key_seed": "338B03B03A5E620E3B27EAF5E57D5A3E91B50113DC68FD76CCB906A0CD6AC15D", + "metadata_key": "C7C3232A78820948E56ECFBEB230CB6F", + "section_mic_hmac_key": "6A734BE5E220BD0FD824A54573671C3D15CF7B4BB57AA2B505EB6BF0B0CAC0D9", + "section_salt": "795CDD085DB06D32AE5FD26F7BCDDBB7" + }, + { + "adv_header_byte": "30", + "adv_salt": "C4DD5ECE3088AAB59CB1D292B33F366C", + "aes_key": "639007FB19AE47F1C559685FDA3EB75A", + "data_elements": [ + { + "contents": "E88F621FE3EB583D38E8BAC78F77C628", + "de_type": 933 + }, + { + "contents": "75ABDDF8", + "de_type": 54 + } + ], + "encoded_section": "509013AF1C7CA2B228255162CA076C8B11BE46911000F45D6C318697B0191B1D88F3CF9D00F39004ABE13C11D4EE0C8DB3480A7B4B3BDC25563B1C28D8665AD58EDF8794E2B9AF89F46772315982210EEA", + "identity_type": "provisioned", + "iv": "7178DC1EF12587D629C2D6FECFF095CA", + "key_seed": "98AAA87C26694BE9E3BBCC696C76246465B0239410B523EC447C9A2049D1EC0B", + "metadata_key": "A278B435B2A9CA7EBAD385FC6B7E3F15", + "section_mic_hmac_key": "80B3F75573897BDE6A79AF64C8FA3E66E60E12DCA0F934D92464B8FC037944A7", + "section_salt": "F45D6C318697B0191B1D88F3CF9D00F3" + }, + { + "adv_header_byte": "30", + "adv_salt": "98345469CAFE42F15D87F5EEFC770569", + "aes_key": "EAD0F193D218EF675EA19B2DAE377F02", + "data_elements": [ + { + "contents": "AB6691F16BD89FBEC7EA564644B836DF20E3", + "de_type": 396 + }, + { + "contents": "33283B4AC99D1351B01D0FAC70AC124EA0C18806F4EB79A81DD0C7B7", + "de_type": 761 + }, + { + "contents": "338FA25539C9F603E8AA", + "de_type": 545 + } + ], + "encoded_section": "789013E04AD2F52216D16070E3AE142996253A911000908F07CC93A0157CA88C95EA00D2F8B09001801529DCA17EFD27E94D8A309ECE9126B84DDEF670D9AE859FC518535A5EF9E512C84FCA40EA028006D89902575457662EEF326EC7A07B9169BF15231DBE29B408E134074E7A1037F445C293EEF0F50051", + "identity_type": "private", + "iv": "628570BB5423D437AFFAD6A68E7D7C51", + "key_seed": "D16A1A2DEF6A5A281D1345AE625CC996CE718409EC67F52C2126D4F4F35A240B", + "metadata_key": "5D5A62A4FC06971533C17C6914A2ECB1", + "section_mic_hmac_key": "B4027E120D33DDF70FDB320E58DC27EC588E7D0F16E413200A8A834D4FC06B6C", + "section_salt": "908F07CC93A0157CA88C95EA00D2F8B0" + }, + { + "adv_header_byte": "30", + "adv_salt": "473589D555027506C32625BD8CC7DEC7", + "aes_key": "3EEAA4B0A65FE6A149E92A3ACD460F2B", + "data_elements": [ + { + "contents": "00706503DDE2E48069E553BA253443985B15A915D6536999F1F8", + "de_type": 655 + }, + { + "contents": "152C59162A8FD170", + "de_type": 261 + }, + { + "contents": "29121F0B063A6B6F863E730BE1563CE5136F4B76", + "de_type": 1000 + }, + { + "contents": "A4E52EACF159", + "de_type": 503 + }, + { + "contents": "986D5DEC9898E595883F738E6313D79A010DA5", + "de_type": 413 + } + ], + "encoded_section": "9590132BFDDDC9034E622342FD8689E276F16391100053743B86B516991B130398CD526856669001C9112F3BEA177009F48C84164DB23C8A235D39B30B30621639A06493FDCA70371EF4670D5D7F6F35D41573DCA035DFA187060D4509A3085763A2FC46AA05E1414D3A83151E7E8268A1CF1A1F6453114622E36FC069C6FA97D4DEAC4F2BBFC0E2E066BE2BA08D102E0FF80C67AE64", + "identity_type": "private", + "iv": "F4CFB23D5B57AB5DD39B7FA98B5BCE5D", + "key_seed": "A949CA927245FE4AE45D4F369FDF339B2542427E268A92A4FB56D818E1585080", + "metadata_key": "2D5AA2AE17FA3B780595B442816D577A", + "section_mic_hmac_key": "5E2FAD4AD9AD36D0FEFEC43FA96CDDA06B95035C188A02188FA134AF1C039B35", + "section_salt": "53743B86B516991B130398CD52685666" + }, + { + "adv_header_byte": "30", + "adv_salt": "25EFD74B18D28C38561611A4E0EFA653", + "aes_key": "D62A62981F5281FF40D4559D01F3D42E", + "data_elements": [ + { + "contents": "29CD91ECAD1EEAA72B8343AC127EA910C60103006ECF8AB36941", + "de_type": 469 + } + ], + "encoded_section": "549013834CCF10766629D4E328E20F100325A09110001875FF4F2F9EB5B632BA383003DE4C139001D4CD5795AC80238CEA4265BB4D2A4668F9569493BC5936F84442A51F9F93144DC7F0B9855D6E2D8892965D0D75", + "identity_type": "private", + "iv": "583AAA53E4CB858B5425E6CAA806020C", + "key_seed": "2FC71501293477514573A265C5C8704E9C86047A7A6B14A67EF489DF5844E0DD", + "metadata_key": "9CF9951B23AA2C216A88920C36927BDE", + "section_mic_hmac_key": "2DE14E1989C82EF73E9F57D5F31BF1D4C01B96488D633FBA7FD93C8F07DAE841", + "section_salt": "1875FF4F2F9EB5B632BA383003DE4C13" + }, + { + "adv_header_byte": "30", + "adv_salt": "230C6C323653F615C3EDD59CA5C3E4CD", + "aes_key": "8DA0B2533F0BB0B636C0DD2C5F4C2325", + "data_elements": [ + { + "contents": "0F06B38FC8A536260ED355C9FC9E14E7DDD7929CD568A0E2B11F4417", + "de_type": 196 + }, + { + "contents": "E9DAE7C7DE865122E920DE218A959DC66B87191B880164152496328A4D", + "de_type": 564 + }, + { + "contents": "93DA2F2DDF4E29DD44012394C9A9AC64405DFFCBEB", + "de_type": 257 + }, + { + "contents": "F56469A172DCCA67832689D1C2", + "de_type": 228 + } + ], + "encoded_section": "9E9013D58191FEFB4A9B9BDA6B037A0CC63F939110007B2BEA4E28BBEBC044F1282B590D42209002FB5F97FE4F62B89E614F28D1CC810522FB81A03B4C526D66C7B23A95AC861BE8072D5AC673D1E91DDFF56B3354305C6C5798E51B4C34F3AA0B8E49179F988718FA0A500B2F0F1A369DEB3A2DB6E99799CBD3B9970489B773C2C41E567328EE044FEE336F9120673102432E3A80EC7306705CCD5486A3A1", + "identity_type": "trusted", + "iv": "616285E84578D5625166925EDFABF2F0", + "key_seed": "CEA74ABC6E8F5BC365B2A23575FBC9A5242A1175298E8D93900459C42D129730", + "metadata_key": "37E8237111A63B854880506BC5B086F5", + "section_mic_hmac_key": "3DAA034FE225951D1CCF0289F091B047D091F350A6566A0CE44A60152EBEFFE5", + "section_salt": "7B2BEA4E28BBEBC044F1282B590D4220" + }, + { + "adv_header_byte": "30", + "adv_salt": "5D324887E76C3F9433D2B4A42FCAF044", + "aes_key": "66E4331038810B466F236AF2610624D4", + "data_elements": [ + { + "contents": "985840558092746F07B1", + "de_type": 498 + } + ], + "encoded_section": "44901326F885F961FE74FFCE3BBB43648CB811911000D8A99AE153719865050D04CB7D1673FC900256ED4D9FF8B3A8B57F704B5ECC167466004EDBC803DF32767BA4885780", + "identity_type": "trusted", + "iv": "49465FE445A423A5A4D9C893C7124241", + "key_seed": "BB5DB5AE369B6C5D2EBCAA7A14B03F9A249DA93B87C24356475341E34CE211B7", + "metadata_key": "88F87FCEC4D05BCAEB97098A827FAA80", + "section_mic_hmac_key": "2B66622A6228FFDE6DBCE6808DA2A207F942EF38059457C1E84D49D65D5EA0EB", + "section_salt": "D8A99AE153719865050D04CB7D1673FC" + }, + { + "adv_header_byte": "30", + "adv_salt": "492310415125301AF370F3A28F99C923", + "aes_key": "3E60451A7487BD9CC8EF9CD117EC06C3", + "data_elements": [ + { + "contents": "7E0B2E1CB803", + "de_type": 96 + }, + { + "contents": "", + "de_type": 4 + }, + { + "contents": "5FFD2C7DAB0C", + "de_type": 557 + } + ], + "encoded_section": "499013A8190AECB7A7CAAC7A41BCCC1BB23EB99110003D9D5DA626D91FD8CB8910200ADDDCDE9001C4A2BBA08569798DA7CDD17B9434EFFDAB07119526363656E66DD52D79BFE6402756", + "identity_type": "private", + "iv": "C512212E4B03688C91E6742FD6CE85D0", + "key_seed": "303426E69CF0478D3546C376E523B59976BEECE4CD7E5D73A253EFD37AE59596", + "metadata_key": "2EE9CB59D9ED13C836389363377F0C10", + "section_mic_hmac_key": "177318DF2F5E18A2BA15AE658285E89541A870D219C47C5260C77D286E9EAE11", + "section_salt": "3D9D5DA626D91FD8CB8910200ADDDCDE" + }, + { + "adv_header_byte": "30", + "adv_salt": "34B38738AD29FF67B98A87A5E632B403", + "aes_key": "31A27BC1F826FB2A14BAF5D41AD7EF32", + "data_elements": [ + { + "contents": "8FF21C1E9727057BF441B8845924AF2652", + "de_type": 561 + }, + { + "contents": "59354C8203E3D49D708164F64A8E94FD37DC4AB3170AF86EB2DE23", + "de_type": 143 + } + ], + "encoded_section": "6990137AED32E0B427E327EB555684B103FAF09110009FC7D83B3BFFDF9324A3DD576C83C25F9004860BEA1F0A861519D2F64FD943CB247C301755CF3FC0F9688CC9C3A59D712C0A45DCBC0C4A4BACC93E9206E1A1F01AD375047EE9CDC415AACF23CED21082D0D6F2F4", + "identity_type": "provisioned", + "iv": "95AA62BEE82A7EB218781305E16CF180", + "key_seed": "EE9B03BA6F99F320443D9EC2D4080AFE8669D55E64A55476B910609E79804BE5", + "metadata_key": "791FFA37592A73FBE2748C91CBE5EDEC", + "section_mic_hmac_key": "B31DEDF27A541AAEB000A61976F06FB1137AB359B3D86DAC2E30C3DDFE8B85F4", + "section_salt": "9FC7D83B3BFFDF9324A3DD576C83C25F" + }, + { + "adv_header_byte": "30", + "adv_salt": "6F1A5550F40245579FD1FEDB994C60E1", + "aes_key": "EF74CF6922AF88727876DD6180BADDDB", + "data_elements": [ + { + "contents": "10F27CAB4FB6B95F77A5C6", + "de_type": 998 + }, + { + "contents": "7F4C192988A13A4E53C57A52F5DC", + "de_type": 961 + }, + { + "contents": "F676A115F3B1DD", + "de_type": 176 + } + ], + "encoded_section": "609013305284C016C6D4FB8B85A6853EFE3BE1911000A883FB09F88AEBC1CC6CB4375B6F309B90027F59BF0ED26EFD7FC2826D3C353F894B923AAEAAF953CA9710D76864FF689AC4E3AB2109BD45AC5F1DD5578251BBA54D47002CF28B741222F6", + "identity_type": "trusted", + "iv": "3076D26E01CAAE164B6DD68DF2C98D6D", + "key_seed": "F7701383A99913E39E948F24FE4375388A477B5885BCE42E1136D694EC5940E4", + "metadata_key": "FCA9E9D4A7FC73EE0A84DD20EBFEFCD0", + "section_mic_hmac_key": "3090F43370303CEFE295DE610007E4521B9C61EDC8413FDCEDB1A1E827193103", + "section_salt": "A883FB09F88AEBC1CC6CB4375B6F309B" + }, + { + "adv_header_byte": "30", + "adv_salt": "91652221827572DFBD2DECCFDEBC0623", + "aes_key": "93D4594F6D83065E87736A4B1C8B5D90", + "data_elements": [], + "encoded_section": "379013CCA0DA07331E1D50F654EF152E8BE56C9110002EBA87F24986E786C3CF5E687E930F6D9001AF4C55F24D83258BC9CFC3ACE6DD4F77", + "identity_type": "private", + "iv": "7407BF39844950F7C02EFA0DB33EE20A", + "key_seed": "62C96793C0C0A1AD2EAA5D77B983C772D1117BFAEFEF6F1880D15A138CF02BA7", + "metadata_key": "493DA0C9159C6E0A451EF59760E8A037", + "section_mic_hmac_key": "59E78109732E338964B9D72691182ACCE1F13B1FB2AF815D0D9E107BDA483E99", + "section_salt": "2EBA87F24986E786C3CF5E687E930F6D" + }, + { + "adv_header_byte": "30", + "adv_salt": "49A2D6913773EC08C26776F5D82EC4C9", + "aes_key": "61B9D6C9A96D8195A2448D9A4A9FCC50", + "data_elements": [ + { + "contents": "9F6F", + "de_type": 985 + }, + { + "contents": "585537C36483C7D6D71A12EF0E", + "de_type": 650 + } + ], + "encoded_section": "4C9013598C8EAEB8D51BC3FE88DAF09FB46EDC911000A381CE76EA131827A0C0BD7720D36AE59004DCC9D1BAB25D0CCBA65658980D6DBE61D2F02E7300B983FD2D944B9BED0E9ACA1AE77591F1", + "identity_type": "provisioned", + "iv": "DB8334CADCA491D2C65763FED225BEB7", + "key_seed": "076B4CB28DFCC1192ACE62FD2078B9D7A719A4FD023E5C806D60464AD004F54F", + "metadata_key": "C8B3594B1DE8BCC1698D794EB9159D32", + "section_mic_hmac_key": "05F49F228F859D213855BEBDCE762E3297CFFD51ECBB2088CFD8DC8E90E0F1B0", + "section_salt": "A381CE76EA131827A0C0BD7720D36AE5" + }, + { + "adv_header_byte": "30", + "adv_salt": "FDB28EC49C232187F4B313D338CB401E", + "aes_key": "CBDD90D1BA86EBD8B627412AD9097632", + "data_elements": [ + { + "contents": "67B75AB60CE23E879336887B5D9F5775A2078C1B2BC755B1B40901A14D7C", + "de_type": 482 + }, + { + "contents": "CF980B5189EA458B3E9EEA80758E9FCA5195E09F06", + "de_type": 167 + }, + { + "contents": "5B619E636C2E", + "de_type": 759 + }, + { + "contents": "0A408A22E62FC9245250A072273ADD497C300228", + "de_type": 387 + }, + { + "contents": "94", + "de_type": 481 + } + ], + "encoded_section": "949013E4CFAF2BE466963149A6224ABCFB0C0C9110006886CCB0F507AC5B4E3A33B6F31D03EE9002F2392C3A765BB4AD1BAA31BFAC8FA8B5987DDEDF99E0B1F4AB5BD84ECE46D3701BC1B28DCBA2EA465B7F4EDD078FE699CAF1E3E9C2EACD89849EDE3E13B4E9C69A2381755448C9E0113843A4A22BBFFCF7C11BB0EA70C08A606952234B4B6108EC83040C10C6DAD374A5F05EDB", + "identity_type": "trusted", + "iv": "C028C5B6F9A36584545FB179C379BFB2", + "key_seed": "F6F00C19B4792C24EEF3D27D69993076230247603F817E90B855099E413F2B07", + "metadata_key": "67746BF043260C6C49EAA6197157A491", + "section_mic_hmac_key": "61E943AF30DDED5473FBA40F5118C7C2F350103F84A444FB4F7550667228977A", + "section_salt": "6886CCB0F507AC5B4E3A33B6F31D03EE" + }, + { + "adv_header_byte": "30", + "adv_salt": "1EBECD2EA3A8364948252CDAA5B96320", + "aes_key": "5C07BF2012F7917650BBA25DD8F336CC", + "data_elements": [], + "encoded_section": "379013BF51B7882CB99C30571F24D1DDD05BAA911000E3F0D6C54BC850F9A48E98054374ED5F90020F71BA6B33808FA225AD2296003121C5", + "identity_type": "trusted", + "iv": "BC7CAF3B06416475990D575B2B3AFF29", + "key_seed": "D140C25596258623F7D0A978CFB6875793307B7210A9965CF4A09927E23848EE", + "metadata_key": "A62C713646FA57E510CEA5E76377164F", + "section_mic_hmac_key": "B606AF244BA59DCBBF6929DDBC3EF9B7FA0A968EE4958F8D628946460E0B574E", + "section_salt": "E3F0D6C54BC850F9A48E98054374ED5F" + }, + { + "adv_header_byte": "30", + "adv_salt": "34B8D0AA1B6076CACFCD67EAA56205CE", + "aes_key": "D18687CE96E0D9B21847502E60CDCD25", + "data_elements": [ + { + "contents": "53493339", + "de_type": 153 + } + ], + "encoded_section": "3E901369FD29BDD5FCAE64EAE91DA4C76BE48D9110007999D3B31650C18756A1D319773212AE9001275F57FE6AFB60B6DC87B624099A9B24569491F5F49121", + "identity_type": "private", + "iv": "5564C020A460380637EE5661E0F18465", + "key_seed": "51CD66A9B8455A1C61806C6575710F29B99AA5C08B5FB6883E2656EFD4EF4B98", + "metadata_key": "7A089FA25B6301D9D8413F0AA49603CF", + "section_mic_hmac_key": "B6E66D366DD2C413AA66A99E8CACDAA9761BA51C95898458F7B4D37988F135E3", + "section_salt": "7999D3B31650C18756A1D319773212AE" + }, + { + "adv_header_byte": "30", + "adv_salt": "EA23F3D623563CA554B644B8944836A5", + "aes_key": "952EDF3A3A92D45B9DED25777352BA23", + "data_elements": [ + { + "contents": "A0A99C479635E3819E8702A34BDBAB13", + "de_type": 852 + }, + { + "contents": "E0253587563A4C07", + "de_type": 385 + }, + { + "contents": "1FF104D3D8A66917AE8B770463E08516393A6FE29A", + "de_type": 654 + }, + { + "contents": "DD0D3D55183C193476966F12ABFFCF2C65AE5E9000E57E93DDBEEA6B47", + "de_type": 807 + } + ], + "encoded_section": "8D9013E81D950CC4779370E13B06AC5F9BFA749110003F78335FFD99A2E7A40D78D6314F7713900211BBD3B4F8A56E26538F9FAE57F0AA9114CC34411E8D4408B53039E144A6F0F6E3FC4C4E32563A97C177FAB41C6AB5D6ED9EBB41E98627ED5DC9B196432ED1C0036FCD729E492A25D4976723C777333C52ABDDC04D9E7F8654ABE7CBC319DDA5BDBFC37DF51D", + "identity_type": "trusted", + "iv": "2A0B516ECD2E3ED9E8491CB2A23BE7BE", + "key_seed": "9A76DCD6488802F550A1A5B2D68A21B45850BDB5D04F6BFCE6737EE9065459B2", + "metadata_key": "7A82BA273F40F1D7147503A0521EA07D", + "section_mic_hmac_key": "D0071AD96C81ED47B74B6141DD9BBA6467D69ADEE3C4B23556525ED204FE5450", + "section_salt": "3F78335FFD99A2E7A40D78D6314F7713" + }, + { + "adv_header_byte": "30", + "adv_salt": "EBCA2068CEB2497377233BA55556143A", + "aes_key": "B7CAB93856D36C4234AB9B7E3FF2C2CA", + "data_elements": [ + { + "contents": "B906252C6FF66DCECE5745A021B149F9AFDF854A258D184B", + "de_type": 9 + }, + { + "contents": "113F12D313183B2C0F0080EB04", + "de_type": 401 + }, + { + "contents": "33B9E9DBD10F", + "de_type": 838 + }, + { + "contents": "EDF90FB1E1E1D0B56F88F8E52E9F28", + "de_type": 649 + } + ], + "encoded_section": "7C9013B26979B83B32E69A1562F16DE75E14319110006B6BC738CBF9DE91F89702F34C609C239004E53E0A53B0F500690D822ECF8B51533921124980942C4C52D2BDF88BE78D4CCCE1F7B9334FE9EF5FA7846D447BABD7149F092C75AFC759AA705A511848528674C4A75131D2B0FEFBDA757DEF4319F405DAC80EF1D9", + "identity_type": "provisioned", + "iv": "84465E974A7F46A57204E7B87ED0AAFF", + "key_seed": "E00C8B52A62D38CD16051B45E43ED15D643A93FD6F673B03448250D608D10535", + "metadata_key": "3E2F563D9D36B4AF7752C0C19548A5AF", + "section_mic_hmac_key": "5FA9E23CC79D9776D137B5928675B099089A5EFB01BF98F6687C66BBDB3C334E", + "section_salt": "6B6BC738CBF9DE91F89702F34C609C23" + }, + { + "adv_header_byte": "30", + "adv_salt": "246DD4A6A94037FE404D0A0EF4606013", + "aes_key": "B80A4E7A36FECD53741D1832DA6135AC", + "data_elements": [ + { + "contents": "FF7E4C70C4C530F2728E854ECF67475F62905652931C8B7D95CE", + "de_type": 867 + } + ], + "encoded_section": "549013AD258AE82CE83D89E404223234B3AC95911000D4C424C2D921D1248156D8D5AE0B40A2900108EBB7D35A6FB92BBAC4DFF57F860E87A043D0B90A06B94C6282265F668887704AFE03D7D6582F0816A5326028", + "identity_type": "private", + "iv": "2CF2A660A004D8D204498034A9C28C04", + "key_seed": "03982AE5B7459AED3DF2C506B459A366A17E98F81BD7DF3BC27492D0C60AB88E", + "metadata_key": "26C5F75F61DBD2E1E014D7EBD5259EDD", + "section_mic_hmac_key": "CAB0A73023E9B8CBDF76C30DFE90FEC62423FF1328BB239C7F7064E49255464D", + "section_salt": "D4C424C2D921D1248156D8D5AE0B40A2" + }, + { + "adv_header_byte": "30", + "adv_salt": "14369DBB0C59ED5213EC3886FCC36B32", + "aes_key": "3BE5F37F21F48652E478248A61745106", + "data_elements": [ + { + "contents": "7B5BB22FBEBF31", + "de_type": 256 + } + ], + "encoded_section": "419013E3C20D9A0D8CFF73CD40DC2EA192F87D911000E26F9F9CEE62E88574F9614FDF510F5B9004BA4F3353BF508F98B6B06BB3B36442AD6F00882B337E8202F717", + "identity_type": "provisioned", + "iv": "16BB18DA1471AE79153EC619BC92D006", + "key_seed": "E351CE8EA42F777F5490CA51A37836EFFC360847D086D0181F34C50B48A84CC3", + "metadata_key": "17170F758D7A1BF5D584322C73297E1C", + "section_mic_hmac_key": "5BBECE4B2E6F573B52BECA481ECC505F4C38A17657A5CC75B418754E5D19B4D7", + "section_salt": "E26F9F9CEE62E88574F9614FDF510F5B" + }, + { + "adv_header_byte": "30", + "adv_salt": "C8C8E6A84C29BEDCE24FEEE95F310A81", + "aes_key": "D0BE22BCB73BD71C3FE37C497EE212EA", + "data_elements": [ + { + "contents": "95", + "de_type": 110 + }, + { + "contents": "1CA6BD05453648BD3FF1", + "de_type": 606 + } + ], + "encoded_section": "4790131C7F79B0F1E2086443460FE2AE232E95911000FC13C4CD5778C7E95DDB96C09062B64E900238A595E5A0F6964E89CDED56CDA41DD8391A91782768A7ECD119D3C12A98E0A5", + "identity_type": "trusted", + "iv": "2E84FA52101610AAD88549E7608A3849", + "key_seed": "A06EE64788DDE83EB17B56B49A8EC7596A559E9782A491BD87861F63D4EFCCAB", + "metadata_key": "B6B79621B08ABE548DB74B2C2910B691", + "section_mic_hmac_key": "B51522E30B6E35A9C74467E74B32E6319A059BD8C2B60343FE9C6DAE4E881613", + "section_salt": "FC13C4CD5778C7E95DDB96C09062B64E" + }, + { + "adv_header_byte": "30", + "adv_salt": "1961134C789B5EA15AEFD01B020E6C6A", + "aes_key": "AFD569DB55FEE7DD324325167509AB92", + "data_elements": [ + { + "contents": "ADE5", + "de_type": 666 + }, + { + "contents": "5A78B8137C56F49AA2A402", + "de_type": 744 + }, + { + "contents": "CD1FEAFD54E39FA95E0C492E25", + "de_type": 758 + }, + { + "contents": "5D931A41C7E445F6C6EECE448FFC54839DB9F5D1F854D9", + "de_type": 74 + } + ], + "encoded_section": "7390131DD3C5EF126658F5E2DD60B357AEC97B911000A97D706FAD3538F852E485B8E91B9B4D90029973B762AC2D40747B49B7DF31B7BB0071DA2E4F5B4E371E3745A05FA602B3872F4DB9F9805FCFBD6E9E9624E8B05CEE407A25EE98E0865FCD11C08E04F706C96E673BF69E353B692B771DB8", + "identity_type": "trusted", + "iv": "E1BA0D8B2C19F6336353D6019F0D8D59", + "key_seed": "7B0C9CAC1C6FB86BE8E0634E24CF942B571EF10B5BEF56A254E269F931D741F5", + "metadata_key": "61B2052FB3E72679CD7AF270FEF714DD", + "section_mic_hmac_key": "66217CD102C260D78F693E1E5C070009ED91981060E8554C670B6101AB87D67E", + "section_salt": "A97D706FAD3538F852E485B8E91B9B4D" + }, + { + "adv_header_byte": "30", + "adv_salt": "BE37D2BF26F95DA0420AB793F2FD51C3", + "aes_key": "94CAC64FAF0883BC5A905AB0D27402CD", + "data_elements": [ + { + "contents": "45C8134F7E3A2B0952A12FA06074C1F55E228C", + "de_type": 641 + } + ], + "encoded_section": "4D9013921E779C25C2F1969FE5EFE492EF05F49110004857A1A663E286BB45649A4E2A95E4C090020E887CA55C65C8F304D7367060AB2D4C08538F57B150310D0DDB8FE2BFD75DEE9C4E0B2D5201", + "identity_type": "trusted", + "iv": "3F059AB52F8DC52A14C635AAB44A7A58", + "key_seed": "DF5565B416A2E7AB41E62C7E2DF6857DF2E35D5EDC4AD2A070E168287A20836A", + "metadata_key": "073410FCAA7FABF86F28C9921B05AD72", + "section_mic_hmac_key": "A93B302F32C8F81FCEA9AF1011CD9F657B33BE4090CC7F351E0AEC32BF3C4EB5", + "section_salt": "4857A1A663E286BB45649A4E2A95E4C0" + }, + { + "adv_header_byte": "30", + "adv_salt": "771F89E3B46AC6611C69451AD4EDFC64", + "aes_key": "F915BE6D3B134480D0A5D7455D4BFE4B", + "data_elements": [ + { + "contents": "EFA11DE2127527F334FE8B3458C817A05EC0A227", + "de_type": 784 + }, + { + "contents": "9C33AA668F95CC399ECE329BFDEEDAE8CD1599BFEC83C51738", + "de_type": 704 + } + ], + "encoded_section": "6A9013B37D84C2D193043679822C766E68B552911000C913144F7DAFC50ABA66049304D883B3900169CD7BC8EC1BF46A0A81358228CA475A03C7730C36BCF2A69161E8AFFF092DDEA4A8B97783C80CB47CA5E777C43A6C840FCB619B23919CFD33FE5DA1EE4CE37F03875A", + "identity_type": "private", + "iv": "8ECB870D9F4F3DF7E0F61B0F37FAA178", + "key_seed": "8A62A2DECFA4345C616E196C18739C2ED2DBEFCF45BFCD3A68D4BBD673ABC400", + "metadata_key": "30BBDD7957FFE92AD9AC8F4D638186FE", + "section_mic_hmac_key": "57A0D17FD7D3C257222D2862C4EDA3EF89D525634689B41442D4F408940A76DB", + "section_salt": "C913144F7DAFC50ABA66049304D883B3" + }, + { + "adv_header_byte": "30", + "adv_salt": "E862AAC7000736B663C508376E8BD3ED", + "aes_key": "26BB6FAB1BF2E0042949DB8877820B26", + "data_elements": [ + { + "contents": "402462632AADDD04C6419557", + "de_type": 818 + }, + { + "contents": "9E6730409FF8", + "de_type": 605 + }, + { + "contents": "F47F7D404EA0D495FF62A49520", + "de_type": 873 + }, + { + "contents": "287092DE18F81EA128A63774FA885821AE34DF", + "de_type": 903 + } + ], + "encoded_section": "75901340D2D16C893F60F75377B5BC6D7C15799110008CAF5A78B1E6790F346DB14AFC187FC190028FDC753F6FDF59AB4C30DA74B57848A69A5DA9DD03C4F8069D71CCE6307E698277D98C7C83A4DD5E162C542D51E763C65B88B7F9082AA40B37D55BF387851F2EF0C0124D81C610962905D4022114", + "identity_type": "trusted", + "iv": "3E1E75C62AA622FD5D532FA03221A5E8", + "key_seed": "89112D0AB38C09870723291EB34F41CC1276649D22EC916559C37E5ADA6BC495", + "metadata_key": "742683BB2FE3A781C335B64655BDE1F7", + "section_mic_hmac_key": "F1FF987DEF82976AE3323B0794E8B55DAF78097FAEC13971E2DC110033ED4B06", + "section_salt": "8CAF5A78B1E6790F346DB14AFC187FC1" + }, + { + "adv_header_byte": "30", + "adv_salt": "8E2730566E4C094460D3430F556F601C", + "aes_key": "DD80F41866B5C2305F7EDB83DDB2314F", + "data_elements": [], + "encoded_section": "3790135D8F74283C3477E5A48A53983576A3789110005962F214FD66C62FAFD7ADB0449C91D9900101D4C5113DD0A160D67C7694A365EA98", + "identity_type": "private", + "iv": "BF345DAE8603A50EBA6E1F53D639EBA4", + "key_seed": "7EDDBBCA0C3D3E70E8A1AE0D1537F660F8E17DD7AC70E2B12AD710AD270C7499", + "metadata_key": "49E7FD99EA8806E02F7D9266C51E58AE", + "section_mic_hmac_key": "FB24F853F734086D0360DE9B5036D6C9262BB446F78E3E8594351A966A95FAC5", + "section_salt": "5962F214FD66C62FAFD7ADB0449C91D9" + }, + { + "adv_header_byte": "30", + "adv_salt": "B07E55E2700925068EDB49793A5FBC2E", + "aes_key": "00FA5878B9B5C9C67B6B78EA6F7C987E", + "data_elements": [ + { + "contents": "E23741BC5357278D7F1FAF6FD06F", + "de_type": 381 + } + ], + "encoded_section": "4890135E703F79C8BBCC5412BB7F51D7C65ED7911000123652CC63D81642784356825AEFA5149002B8471E8B3673496EA7D67B901D2A0DF2607B9AF1C329F0F716E0D127A22EB3143F", + "identity_type": "trusted", + "iv": "1D38B3322CD6A4B1E5DD0626D6B3F4D5", + "key_seed": "C0F3DDCA80EB2A1A1BF349A2CB48E9EDA04153DAA1DADD20C760C5C4E712D1D2", + "metadata_key": "657257C54ED238136FB1CD0F38189EA6", + "section_mic_hmac_key": "83CE2AA9DE2D247CF7DDD33519F40F49C6672DD7B68C321153C59501E7527226", + "section_salt": "123652CC63D81642784356825AEFA514" + }, + { + "adv_header_byte": "30", + "adv_salt": "F0B2624C966B5ABB55D185559CC05BEE", + "aes_key": "B0CC1C99F199D7B0DFA6A8818D97E3AF", + "data_elements": [ + { + "contents": "F8E673AE46653F33686B67CF9641406F176FD36E", + "de_type": 534 + } + ], + "encoded_section": "4E9013B619CC5D111EE3DD731057171A8E147C9110003777191AEC924C44BDB4A82B1B8CF55990044D4549D7A1B2AB4EB43666D6E04C1AB21F3053ACA9C3C8A8EF4F34DCD75AE8E3443C0BCE6FDE25", + "identity_type": "provisioned", + "iv": "9CAB7FD16B0FBDA87A216F5BC3C64D84", + "key_seed": "D389626DA719AB4CF557F675341E1E959782CC0A975BABAEA6E7B6F106105786", + "metadata_key": "CEC5D039323AB0A6EFC0871786DD4B9D", + "section_mic_hmac_key": "B2FA1282A7DD0C829E6BEA74AD23B119DA99F144359027FAAAD3BEB2E12AA1E4", + "section_salt": "3777191AEC924C44BDB4A82B1B8CF559" + }, + { + "adv_header_byte": "30", + "adv_salt": "D709C7EFFF43F8B5F50357511634199F", + "aes_key": "D9BDAB1A62CD59915C6D87AFD81DCC66", + "data_elements": [ + { + "contents": "FB75717581E26ADACE888FC7B65251F8ABAC3C40613A", + "de_type": 775 + }, + { + "contents": "1764F1", + "de_type": 536 + }, + { + "contents": "30EC19D6A92E42606B66FA4436A8BF35786D", + "de_type": 154 + }, + { + "contents": "491A5D8D776B0370", + "de_type": 563 + }, + { + "contents": "1A2C2252D95ECF1233A5A83D20CE56501E741FD8A3A1", + "de_type": 74 + } + ], + "encoded_section": "8E9013E6FA247F24A139082788D9F9137009EC911000F52EC2909102AA8CD7731AFB755087CF9002A6FA67CF1B1D109A5BF9A45AA25FF44E68CFA66213A90B891313055BAA791C98EA2450AD923CB7A039FB8DF6A1D6F99F7023386BFCE77936BE122B9D9DB17353689C19177F07D850BF2697B3FDF09D4A3C0A4EAEB24D9E147AD481667EDE2C323CE7607A3E31D3", + "identity_type": "trusted", + "iv": "1326B2D61CDFE279821BA574CD22D395", + "key_seed": "E23E916F47CA7077773636B248F20DCC8B3570F5B7035886BCBD4A4C6983225B", + "metadata_key": "51C25C132D519D0B8A3D62697731A46C", + "section_mic_hmac_key": "AF5C6E5D054F422A1958AF447AA500C6695FBB24A28A30F1AD85898A960C5D6B", + "section_salt": "F52EC2909102AA8CD7731AFB755087CF" + }, + { + "adv_header_byte": "30", + "adv_salt": "A90C5F9A4D5EE8C0F093DA60D34E4F7A", + "aes_key": "5BBDF9E43276717F469C46331CCDBDF2", + "data_elements": [], + "encoded_section": "3790131EDB1EE9AAB1D9913865783E4ADD8EA891100068D0833BCDA158BBC5B7486992DFD73190010C8E5201A178300C0997D19C63660359", + "identity_type": "private", + "iv": "D037D4F2047D995CBB869FE4C0AFB002", + "key_seed": "2222133F9A08B0B6DF5DE67AA09B19BBF3279767D9E924533FE77A3E681870D5", + "metadata_key": "3527338EBB73E631F165D4334A5845AD", + "section_mic_hmac_key": "A4C47342B039235D55E3BFA54E273BD3C250C2B3A9B8C60F846450FDC55D6C2F", + "section_salt": "68D0833BCDA158BBC5B7486992DFD731" + }, + { + "adv_header_byte": "30", + "adv_salt": "B01C0A512EF90678274BFCFEB65B9BFB", + "aes_key": "FB0A68F0FAACC559B8B7CE60692B5578", + "data_elements": [ + { + "contents": "D1BD", + "de_type": 244 + } + ], + "encoded_section": "3C9013E9A1064EF69CF0E99BE8718C433CE4039110009532E764C5200635AD10A03DC30287399002DACB0D8438EFED4CD36A27C1AEFDFB48627927EC4E", + "identity_type": "trusted", + "iv": "36F33FE9F30FF5F345261E94AD27670C", + "key_seed": "A95137212D3A3C03BD4A78822E2F55955D833BA2AE8454DA2EDF749F06DD0E19", + "metadata_key": "98C80C93560E9287602B9DC167933921", + "section_mic_hmac_key": "1E0A6D7D2E12C5E918490B41A8D0B2F1AF8CDDFCF7D968F507BD84B5028B34C2", + "section_salt": "9532E764C5200635AD10A03DC3028739" + }, + { + "adv_header_byte": "30", + "adv_salt": "6EEAB27FB59D9E6CC29C4A77DDA80073", + "aes_key": "E272F73E7FF2C352CB16961A117DA4B8", + "data_elements": [ + { + "contents": "AC9F54867C2D3A343EE15B46BB21", + "de_type": 920 + }, + { + "contents": "B21F47CC9AE7F415AC85AD33E360", + "de_type": 3 + }, + { + "contents": "A4F7ECCEF25FCBB7DF7C", + "de_type": 251 + }, + { + "contents": "4AD51198F063055EE851A62002E4150C537144FB5C1D1A", + "de_type": 918 + }, + { + "contents": "6B78A9AABA9F", + "de_type": 742 + } + ], + "encoded_section": "889013985769BEEFB87EFAEFD9016724CB70209110007285FAB75391A148A7EAF2CDB3E7312390015929069EC6D45F3249513153B9AE3CF8BBC891ABC84001532CC0BE7F9068D906C3FA96D915DEF7F6CCE423D22F23F98B6F62CEE6A6206265707AA7C191231B94222884B904BEDC7269016B982B57BCAC107CC419EA378A2FABAB9A9AF413DFFAA8", + "identity_type": "private", + "iv": "2D1CFBB0145D7E9FE2E12C8E060834A8", + "key_seed": "2E8DB347C722FE8FC819707AC6B1D9F1244D91CD7B7A76E35E379F17DF92018D", + "metadata_key": "90B7D0F0D7AD2041C06A6F07D4C12DC2", + "section_mic_hmac_key": "903E4F3ED660355AD0FDC44DCD556A5A325BA002E430C9015D43495EA3ACFA24", + "section_salt": "7285FAB75391A148A7EAF2CDB3E73123" + }, + { + "adv_header_byte": "30", + "adv_salt": "0B34E362BE1CCA7EA27E689A78185921", + "aes_key": "0B25B59E48937801A1B8B2E567E38A58", + "data_elements": [ + { + "contents": "3AFF6623B18BF5A2FCAD751E561111AABB6A6BB5F6F33E5D", + "de_type": 901 + }, + { + "contents": "7E6522479D7F", + "de_type": 337 + }, + { + "contents": "A1DA1D6D618A", + "de_type": 221 + }, + { + "contents": "EE348B17E8A41816E716", + "de_type": 18 + }, + { + "contents": "F96BBF72D4138318", + "de_type": 639 + } + ], + "encoded_section": "7B9013F45B179A1FF35CAAE790906F2B6B039691100014D27591E7A5B662518B0D93211411239002FE9D30D12DAB1418665668DA1CB7F5EC4DAA9CF88CA252CBEAB6D02BBF81945CB5FDB217EC422556D09938E338C8438632BBEE86118F54D7FDA189CE7060AFF1E279D7FC726EB59F1D74CEE318348F248B0A9D77", + "identity_type": "trusted", + "iv": "41224E5FEA506EA36F51CE022F3ABB1A", + "key_seed": "8CEDB96BA8CB14FF94B7C7A3A37A3864C597406E194D69FCF5A871FEAA16CECB", + "metadata_key": "08E48EDD4E12AFF47F8AAF55C517C8FA", + "section_mic_hmac_key": "2463AF9C4F677BD099151DF4759A4F3632D51F1C41BC96E97EB4476658F3D6B0", + "section_salt": "14D27591E7A5B662518B0D9321141123" + }, + { + "adv_header_byte": "30", + "adv_salt": "A904E6EDDC39B1F3213F1D74FAEBE57B", + "aes_key": "AE2236A355CAAAE9D7044AF1B9FE08B4", + "data_elements": [], + "encoded_section": "37901350FA595EF5F19AA58600FA8356264FC19110007A69E35A44477408600F40C1EA6020F990019BA326E5C0DC4D3DA39BE3EABA175E37", + "identity_type": "private", + "iv": "05CA9ACE5528AF680023C92BACAEE8D8", + "key_seed": "5038A07C7783575EC758DBFA22B5B0C961C9C7BACE1AB44549C547DA05167B2A", + "metadata_key": "39CEC4870B31445FF870008CBB598309", + "section_mic_hmac_key": "00277572EF8546C2B9D70D0E7D668FD59FEA252347333A76B0FD6A353830BD03", + "section_salt": "7A69E35A44477408600F40C1EA6020F9" + }, + { + "adv_header_byte": "30", + "adv_salt": "0E75F1D12F3EF90599341DDCC4E6CAF0", + "aes_key": "C63FD8AF5CF7A9B46934298ABBC00693", + "data_elements": [ + { + "contents": "E10020BD5E92D8B6D3ADDC0232197F7AD8EA8B10F82DB6", + "de_type": 94 + }, + { + "contents": "9B56332DD723E56CA51F89D5FD126FD40BF6953679", + "de_type": 255 + } + ], + "encoded_section": "6890138541962B9DAD2E109AA523E949E8D3B5911000C939914DDC703A7FBC857AFA6C1A94369002AFB0809D9C92645644E0A2276F90707E45256A92643432D9288702769AEF6AC4D0C778159A5B4AA0531C612940DE6D832F64DCF9A6EC457C76D3CF42FB5ACFB3B7", + "identity_type": "trusted", + "iv": "864721546276C7A96CC880DBF5B8DC7B", + "key_seed": "9D096BB52548302F9A0F8C6D2DDF1601F2E96F799FE76187DFE2138E7A3FBE4A", + "metadata_key": "81C35203EFCFCBE083726B15AC9DC275", + "section_mic_hmac_key": "6CA85DEF3BE730365475A93E71330031A6DBD9E48E04BB295FDA5321F496D8D4", + "section_salt": "C939914DDC703A7FBC857AFA6C1A9436" + }, + { + "adv_header_byte": "30", + "adv_salt": "D007D878C6FFFACE78778BC06B98E8D5", + "aes_key": "8C1265F1ABAC004CA2D681256B5C502F", + "data_elements": [ + { + "contents": "", + "de_type": 734 + } + ], + "encoded_section": "3A90136B53F00BC73427570D56B25245E31E709110003F1EA18FEF5037CCF30402C46130A70F9002E563FA84C94D3ADEC61DCE418FA76320E5BAAB", + "identity_type": "trusted", + "iv": "C892BFED70D002EBDCA25750710BFE76", + "key_seed": "C4915C71ACA0B455710629B063B5D9286E2CED111FA1C9D638C7069DA933F2D5", + "metadata_key": "B44812E7A415896300387540FA9C4DE8", + "section_mic_hmac_key": "CF8E967F00EBC62D8729A9A1C4AAFA3288EAE5ED966B12953837CE736FCEF820", + "section_salt": "3F1EA18FEF5037CCF30402C46130A70F" + }, + { + "adv_header_byte": "30", + "adv_salt": "C4C0A0A8717305E60D1E1F4EDACB40F1", + "aes_key": "B64935A371108F799E67FD260F6FBC97", + "data_elements": [ + { + "contents": "BC6B8FC4A146298C2C7C4C04B0BCA9", + "de_type": 256 + }, + { + "contents": "A3C4D6D6", + "de_type": 148 + }, + { + "contents": "82ACEC78D07CA4CC55D05CA5455FE192", + "de_type": 755 + } + ], + "encoded_section": "639013159D08B00F5A835AB8977FAC857298BF9110009B3429DD955B53030DE7A0949F8051C590019BEDC8B153588FB31C3D7C0B8EB3B0876208647BE21E2AFCC19CC883A03E5A42636CE85778E8D0D7ECAC63B1E5AD97B095EB538ED53C0F20E31A7B5C", + "identity_type": "private", + "iv": "CBC6CAD2BE51F64BAC34C059A1CDBA3D", + "key_seed": "1B755890B9282E3D75A62CF30D8B507C526AC4D69A87DB688EE1ADE45E6FE64C", + "metadata_key": "F1C7FA9D59151B942260D9095ACB804D", + "section_mic_hmac_key": "8B88E568964992FFEA8B172CEC92CF35A09C17DA53E3B6A4178F30C69E30AC94", + "section_salt": "9B3429DD955B53030DE7A0949F8051C5" + }, + { + "adv_header_byte": "30", + "adv_salt": "46D9D063223E48E1437D30D40B5753F8", + "aes_key": "F648B73CE969976B039A16A28433F333", + "data_elements": [ + { + "contents": "", + "de_type": 181 + }, + { + "contents": "4E76A9FE722A", + "de_type": 265 + }, + { + "contents": "8CC7337D6BB03B7659C537AF883BA4CB5A6831CFC821ED8F", + "de_type": 571 + }, + { + "contents": "61137B10A9EB95EC8B9988C92C8AE58084962EA4EB8A0DD54F4E28AF82", + "de_type": 963 + }, + { + "contents": "F90154329E618F408A44", + "de_type": 319 + } + ], + "encoded_section": "8B901349AA55BEBA93CB2C7A54840B9FBB35CF911000FDB1B9359452E3E2CEAC0DD0CDD50EFC9004984C75297EBDC0AF9A194C52F8B51C4E091EFBBE21423579FDD7E020426A58EFE96C0B50D4FDE6835CF20CEBAC6A24718A4423E3420765508987C19C056C8E56231261FE9537C604057D374C7F21B3C7EF84FECD99476B2ED180E4B2E60C0D066F71808D", + "identity_type": "provisioned", + "iv": "B52F5E947B987B2B1BFDA86CFBAEB325", + "key_seed": "71264001CD0F41F3851E55A3694A78A3503C5E9FE5A0B3B3B7AB8D502E49E667", + "metadata_key": "85510A6F5299C7CEB851856A36EC426D", + "section_mic_hmac_key": "194A3B0426B099DD77F0381EA83D71887298EF577A42D30518B18C7A34B51A07", + "section_salt": "FDB1B9359452E3E2CEAC0DD0CDD50EFC" + }, + { + "adv_header_byte": "30", + "adv_salt": "E0858ABAACE0527B975B26851C8292C8", + "aes_key": "CDF94C859322D6AA6A30EFE4D2038652", + "data_elements": [], + "encoded_section": "3790138224408F0C54B5D42BEE2FC498F3011D911000DB852F256100992EE97EF0F6F931193B90049FD1BC537CFC7F362C6398CE8C7746C0", + "identity_type": "provisioned", + "iv": "D19FDC0000D6D76E0CE605C96FE3ED88", + "key_seed": "A67946C15E4AEFCAEA932BE2B26CA22A3631CAF3963BF24BDB7A839CBC4215B1", + "metadata_key": "034314A9C047377E60A04D4D6D24B67E", + "section_mic_hmac_key": "D37426DEC6209A1AED271135308F665981D7DE9C2250A7982A68FD129FBC597F", + "section_salt": "DB852F256100992EE97EF0F6F931193B" + }, + { + "adv_header_byte": "30", + "adv_salt": "E5D850A6B98731806DD70FE80D14C57F", + "aes_key": "45F17F2A11C37D39EA2E14EB6F2CE1B2", + "data_elements": [], + "encoded_section": "37901322ACBF267B3AC6BBD623E29E4C3CA73A9110003B6349B2E28BFC8EAD832D04EE1D41C6900495D0821E110F23240CF70BDC718DC1E0", + "identity_type": "provisioned", + "iv": "8A38DECA4DE45018DF71E0F5613FE0B5", + "key_seed": "FF31FA9C59DF8135328628787FA48637CD6AF39EF0787506983782D7E32BE634", + "metadata_key": "6C2A4E42EBE23C4D726F76B9FEEE9C18", + "section_mic_hmac_key": "F05B9956C3C0EF6621FDADB68DDE990EF64AEC91603107F728EC761C32FC3C17", + "section_salt": "3B6349B2E28BFC8EAD832D04EE1D41C6" + }, + { + "adv_header_byte": "30", + "adv_salt": "92BC4AC64813CE0FBCBF063580B8450D", + "aes_key": "46FC81523837471CC7B1132E3EAAF8F1", + "data_elements": [ + { + "contents": "3C5DB709AF6BEF1A6DB5", + "de_type": 44 + } + ], + "encoded_section": "439013E00AB739B468075FF17A2F097CA281CC9110004DAC6BD9A7A7499B7171120940ED042990018B201683ED366466ADFB2EB853E969162DA6AFAD259C2FCECB94858B", + "identity_type": "private", + "iv": "2F91E5A6914064B461D1C006ED76FA2F", + "key_seed": "863FB479EFCB6FB70859DFEB44427143E0D5784CDA22DEE6280D75E217720D82", + "metadata_key": "7A7F61C5B138A412235574D1A509D1B3", + "section_mic_hmac_key": "1FCF532394A9A225DF35E2544418E724EACC389FA5E033F8958EDFF1717C6D87", + "section_salt": "4DAC6BD9A7A7499B7171120940ED0429" + }, + { + "adv_header_byte": "30", + "adv_salt": "A47C02A4CFF31760341922681C976C9B", + "aes_key": "CCC21FB62FFFAE008ECF5BD0AA3AF62C", + "data_elements": [], + "encoded_section": "3790138F26A8BE5D75A6F6F8F6CE5ED388FE35911000FCEDAA0772047E6085B7A3DE0656591B900427E950F6D62A13D2BF10F3AE70CF99B1", + "identity_type": "provisioned", + "iv": "748F18DC41E1742BBC685E0F699A8A9C", + "key_seed": "43902BBA2C0D479E16711B145C936CAFDE2EA717B06E48F913861605673E4352", + "metadata_key": "225F23821A1821430F1518C514C45FDE", + "section_mic_hmac_key": "EAD438CB4DBB42665F5EBB51578C6889268CF032E82446E6DB78F538CF8D2008", + "section_salt": "FCEDAA0772047E6085B7A3DE0656591B" + }, + { + "adv_header_byte": "30", + "adv_salt": "529EA628E2445A5F44FE204E7287CB83", + "aes_key": "D077D4226135FE3CC4E82D9136D013D5", + "data_elements": [ + { + "contents": "9B815B76A0BE", + "de_type": 794 + }, + { + "contents": "F0176B0CD2D7ADE497BD", + "de_type": 585 + }, + { + "contents": "FBBD3620FADB7987C5", + "de_type": 951 + }, + { + "contents": "6E6D2A26D45B22C48FBFBF5BA353822DB5", + "de_type": 689 + }, + { + "contents": "", + "de_type": 824 + } + ], + "encoded_section": "709013ACD9FD3F06A15506252D036301A1D1289110007FD227289748907CC788A03478E4C4A490040BDE2788F193C43DCFE364FAD39822E9693F9A61EC2AF84BF6E409352D804375946F04F76B6C8CA105D29896668E6509C7D9A2B12345E0FCA01318A33066A052344AA55973E26EC11C", + "identity_type": "provisioned", + "iv": "21FB688EE8D48AE0204DD0FB6723BDFD", + "key_seed": "09BC65B83D4A9DD8E665C350AFCD428364EE0C429A26432718129B954AABF45F", + "metadata_key": "0A4BF92CCFBE7EE7BA20212B2C9BD9C2", + "section_mic_hmac_key": "2B29674CEDF3923E447AEC380E9A5971EA8858B669B79ABE829731A48A69D46F", + "section_salt": "7FD227289748907CC788A03478E4C4A4" + }, + { + "adv_header_byte": "30", + "adv_salt": "27F532D8AC32634E4CA75D32B8F21CF0", + "aes_key": "C286EC660EBA9F0D2EC7A6303A73DCC8", + "data_elements": [ + { + "contents": "556D2EB5364D03B0D15BB6C2FF22", + "de_type": 982 + }, + { + "contents": "250D3A6C86F50DA0", + "de_type": 215 + }, + { + "contents": "B0D390472D2E4730981C8C9B5520", + "de_type": 879 + }, + { + "contents": "4BD0DDF2F7A591B4F423B8", + "de_type": 519 + }, + { + "contents": "2DF0B2BF2276228A5DA4C99B0E308A7F75B4288A73230B0516", + "de_type": 301 + } + ], + "encoded_section": "8E9013B2FE9B4E230BDE0A6B4C680E38425A88911000AA44252B7B0597D8CAD27BB2DE2E932B90024B03F77517B8733BDD7FC4A6EFF00D0CD0E9136611DF78E7069F61888E95212A50981F152A7962DA910D35D28A87D0FF7AF72A0698459C5AB90373F3ADF7952A8565B1787C0D5FA6C2AD85E3F2C818AF0D7FCC321D29632B3FE1A9E5B0953249ACF71A5D6D6A20", + "identity_type": "trusted", + "iv": "40F91D78B10069B117960376FABD0D24", + "key_seed": "2FD8F442EDD094DD39EC00AA2CFB7FD0675A1BD7F7941D4F53D0CBD82753E8CB", + "metadata_key": "4C3D9AFFE510E1966AC131A89E1F7620", + "section_mic_hmac_key": "A54C280F5756F9FA52C63779EBA43987D19A7EDEFB9967AB425BADC59BF61817", + "section_salt": "AA44252B7B0597D8CAD27BB2DE2E932B" + }, + { + "adv_header_byte": "30", + "adv_salt": "D4E5C889DF978118233B27AA4104654B", + "aes_key": "970E140CD44D7A04EFB008734CEC7010", + "data_elements": [ + { + "contents": "85C4B76453D6E516D361CC73B263CE9D034720445802DA220ECF657A5F3E", + "de_type": 271 + }, + { + "contents": "E32FD49D906691", + "de_type": 731 + }, + { + "contents": "7B3C90A05085048B6179D21AD5A6A86A6ED4F13A5DDCAA6AE04E6B98", + "de_type": 768 + }, + { + "contents": "032F3243", + "de_type": 307 + } + ], + "encoded_section": "889013714CDBCFDC9979F2A631D817CD6F5D81911000B686CC2DD9B1CAF68D2D40641EE8586990022E34067C0F459E6DC7270F4800ADB3332572AAF09C0F3F02D96F7B1886C9AB3337693E4FF929CA72EF3EE3CC4F5A812200784AF925FA20CCAD85A5AD7852BB76CA82B942A1A9BF7BADB315844E595BEA39AFCC17E1DBB66B6E048C605B7441F676", + "identity_type": "trusted", + "iv": "82D4C9AA85D158ECEF4066430E4CA88A", + "key_seed": "08D94818510EF93C263C2F1F29CF026DD9492D6A51C9A8CDA500CA1286DC8548", + "metadata_key": "14EC5B29C281FEB2AF4832FB60E1906A", + "section_mic_hmac_key": "51694A80381B233D9DAF1ADF4486927BEB090BE27033C68E4C767C3AD81FBD32", + "section_salt": "B686CC2DD9B1CAF68D2D40641EE85869" + }, + { + "adv_header_byte": "30", + "adv_salt": "8B3ACC135A6B5C8563C100BC132C3012", + "aes_key": "EB39B2E41C39888C378B488AE2905CEB", + "data_elements": [ + { + "contents": "5CED8B3EE06AE3BF23221CD8516F5A320D", + "de_type": 306 + }, + { + "contents": "D44E64F4CCBB96259885825F", + "de_type": 621 + }, + { + "contents": "9993FECFD946C4409519E9A3178868E99C9C2F715A", + "de_type": 956 + }, + { + "contents": "D61947350812F913D6FCA86D0BE8543C399D", + "de_type": 641 + } + ], + "encoded_section": "8790132D65B8942498CCEA42A0D804A1C01A6F911000D8E290276E0858486D84502DD4CA687D9002D38DF4747B01659AF237FA5A531219AE5136549DADC2B7E717B8F02BC335EE5C1F0D56EC2F477DC8E5F6BD3D376FCF4E0D9D5DCA895BC72F259F18A7F731F595156293CE9237BD2CF392B34332ED00E56695AEF9AB71DBEB9E03784760D8FDF2", + "identity_type": "trusted", + "iv": "3E60B91D4AA0323C5F01E0E597ECF1CC", + "key_seed": "7ABA9927D395596BAE76B09B53E3747C14DDFF26299CEC1C3D27251187E18D53", + "metadata_key": "01F04DC463DFCAAF77C09879E550F4DF", + "section_mic_hmac_key": "9CAA148E03F3E71D5E61C523CA945873AAF055D6B30AD66FE2D4D00B3701769D", + "section_salt": "D8E290276E0858486D84502DD4CA687D" + }, + { + "adv_header_byte": "30", + "adv_salt": "FF3B16C4698751E68F84DE97F35A5FA0", + "aes_key": "3BF5EE085D208F3D6E5A6442013C725E", + "data_elements": [ + { + "contents": "ACC85C", + "de_type": 664 + }, + { + "contents": "83F79F7267E22A6F772DE90F3B3AFA", + "de_type": 179 + }, + { + "contents": "50B49C934D255C07EDEDB85D21754295DEE043", + "de_type": 991 + }, + { + "contents": "9BB5F0D259BDFA70B9", + "de_type": 118 + } + ], + "encoded_section": "709013B5B1766D569DF4A453ACE83B0F38E916911000E37D1545FE3474350536BBFDA3FF986790028E3033EFFCDD3FF351F65DF657B9E78DC235D1597CFA8775D2CA4C2F8B6BB104CD9EFF986A2448B871BFEC865668788447245F0AC1B6E24C869C93D25DEFD64D3935B781AEB3D6A8AE", + "identity_type": "trusted", + "iv": "F2878B2027076B2D71D6F9871A2F0D03", + "key_seed": "A7548D59575A8ADF65ED6E5C2B91BDAF3E49F4420BCEA25A47F2DFFA66A6FB40", + "metadata_key": "A7689FBC874B5252F84B652A6C801ACC", + "section_mic_hmac_key": "1B247C85EAEB89FAE3D9A6F57B342AA2EF11A3D31F99B92B2BEDC33F25E24365", + "section_salt": "E37D1545FE3474350536BBFDA3FF9867" + }, + { + "adv_header_byte": "30", + "adv_salt": "376B1E2353FDBBEE04421E92268F2137", + "aes_key": "B99788E0D39B29BCD2CB9914602DB519", + "data_elements": [ + { + "contents": "9DEF31274C87EAF90C3BE1E286CA6ECE487A9592AAA5", + "de_type": 832 + } + ], + "encoded_section": "509013D0FE03AA8832621507D192A7A032A6AA911000B672CC780DFC5CA8872ED98841695B5190014330021041DAE80CAF03A0921B48EE4DAE14F5A1D5B70B181E47B17DDE48F9E7EE753FB7461464C071", + "identity_type": "private", + "iv": "8A479EBF518ABDD0F8B6E2DD6E6C3DFE", + "key_seed": "038F101C0818A96A4697FCD0C04F83A5E8B305D020C2B1EBD9EF9F2DD47A3A68", + "metadata_key": "74BB45EF94F7CB36DA9A6E8922F968BA", + "section_mic_hmac_key": "DE187BC6A18B7BEEB0F080D19CAE3A966B04B11F2DE3E0B3A4839B4DAF642BF9", + "section_salt": "B672CC780DFC5CA8872ED98841695B51" + }, + { + "adv_header_byte": "30", + "adv_salt": "4A68B75255C47966CFD09D3E6F4D0F00", + "aes_key": "F40B55E81D5218A9C153B4A518EF7965", + "data_elements": [ + { + "contents": "1206302B0C2DA5BEF95E297A1002C931B1A561AC0FEF82E59232", + "de_type": 975 + }, + { + "contents": "4C7B43DDC3DCEDFBDBD82A0E", + "de_type": 106 + } + ], + "encoded_section": "62901370EF584FCB26A18F3353C63B2C6E550A9110002346BA971CCC84FDB572925FDD8415EA9001C180B71BDFB6D03797769B28831D787CC1E34B3D68475BE6BD52BD446FC1F98D46CE95A4E95D6675F751158AA2F32E80E31EBBCC9849E1B38B61CE", + "identity_type": "private", + "iv": "3C79194828BD1CAB4830FA2EDAE139B5", + "key_seed": "E702E9695C5F7A8FB6B07D8826DAB5E93DF485453C1D47729736C247BB5B1989", + "metadata_key": "9496D7B7F81FEB95A795BF7D0094DD22", + "section_mic_hmac_key": "ED70B19FD1BBC280589C9760473339DE84CAAABD844B7E5B6F373B4F2DFEA1B8", + "section_salt": "2346BA971CCC84FDB572925FDD8415EA" + }, + { + "adv_header_byte": "30", + "adv_salt": "A7DC2F6205111E24BC5D3E96A4036E2D", + "aes_key": "948FB743319951D6EF15792E57C44CD0", + "data_elements": [ + { + "contents": "17FF183A55CFC3D6F761A4319DE5D307A3BEBB8337945B", + "de_type": 437 + }, + { + "contents": "14FE4641B1B15E", + "de_type": 850 + }, + { + "contents": "309BBBC5FD371BD50A09BF5C1935638EBBA64CED26", + "de_type": 578 + }, + { + "contents": "82FA4B93D7E9E8E48C452C3765F30212C5D0CE308E", + "de_type": 986 + } + ], + "encoded_section": "8B9013531B7DDA6851D5A468CF7BA6FCC96AF19110009595A85248F0E068EEBDBFFC4A67064D9004A0AD96175DB820F281BCA29136E3FA64A1E0599AE13172AB44649AAC952DCA3FE132D516C5735C86E2AF6D741A69D75D3362D18D9C9CF9218ABDB944A24C8DAF25648A3C76334BF4668F17C1A693891BB74CFCB98A0E6F3E4F7B5E7F63ADFD626CA50BAE", + "identity_type": "provisioned", + "iv": "2C85C7E9AD55CD74962F7494F73F381B", + "key_seed": "7C486876D239CE8820A1F0B2DB610DB41CA61A7AE8B6BEEB0C908624D6F8C73C", + "metadata_key": "4C62329C44D38B35F5A124CDB6DDB4ED", + "section_mic_hmac_key": "A147DDB86022B7B38A5A0EF46FD8A5A3AA8EF58F1A3B29D67692E8DB21CDCDA1", + "section_salt": "9595A85248F0E068EEBDBFFC4A67064D" + }, + { + "adv_header_byte": "30", + "adv_salt": "7AC5CB315FF73D315B9D7BA673EBBA60", + "aes_key": "506C8FB709BD805F07907F3CADA63A4D", + "data_elements": [ + { + "contents": "2FF3236ED0BE30DBA2EFF7B322460D50CBA1CEA89A73D48E002122", + "de_type": 189 + }, + { + "contents": "29325485", + "de_type": 667 + }, + { + "contents": "BE1D11D85F08DC5096CB2C", + "de_type": 755 + }, + { + "contents": "E5A8D258FA69", + "de_type": 265 + }, + { + "contents": "54E1452EF7918625F1C2066886", + "de_type": 395 + } + ], + "encoded_section": "839013313C5AB1D44BB73DB9DCE0A44381CA5F9110007CAAF0C331734518BAD5BC0AE39D6EA690024326AFCA074771D3B7122DDEAD650CC13735E349EE776FCBFE42C28D8AF0B04F72F453412F9ED8F79D05387362CCEB5893D18016C30315C51493E7A4DA3F0AED6B48B92F3A1CA3A7F3EC8508E26C18B1DF167AF4220A79383D06C697", + "identity_type": "trusted", + "iv": "38F542B60DDCF1889C98F636AED0DB70", + "key_seed": "AE9FA4DBE8FE02012923C404592B04CB6645B07CBC053BBC849BC860169B968A", + "metadata_key": "52EAB1D56E20ACE3BFA4998ECD77E75E", + "section_mic_hmac_key": "0F5609DDE1DE5F239BD1F96B1441DE52BC2D5ACD27064FA3007C0652064124FA", + "section_salt": "7CAAF0C331734518BAD5BC0AE39D6EA6" + }, + { + "adv_header_byte": "30", + "adv_salt": "1371D42BB56CC9589A4E711E94003CF1", + "aes_key": "F89B50E8D592AF6598CFFDD4631B98F7", + "data_elements": [ + { + "contents": "BD965E4D7FE3BE0983", + "de_type": 915 + }, + { + "contents": "71317D36EEBF7AA7C774", + "de_type": 130 + } + ], + "encoded_section": "5090134DE55CD88FD6657759CA777FE2A6A5389110006380196708715DC7A15514FCF0C680BA90043BE3270FC1B56DC645FB6F2FE08340A78A7AEE99B6E701C28398BF90CF6A234F664F39263F0B1C12B8", + "identity_type": "provisioned", + "iv": "6D5FF6F65CCD1AD3CE0E402B14996B5D", + "key_seed": "2A965EA9FE93E8AD29738534A581AE4063AE843A84FA26BF5AC4DE9EDE3CD9FB", + "metadata_key": "2F754F4C60734B33C40721F3E3F65157", + "section_mic_hmac_key": "53F2A6DFD7AEEFDE014E55D7BF8840E5D7A573029BD9BC789F4AF5D83A0FE4FC", + "section_salt": "6380196708715DC7A15514FCF0C680BA" + }, + { + "adv_header_byte": "30", + "adv_salt": "5852F713F32A45F394D6CF1503681E71", + "aes_key": "53579F776F4D91AE48BAA741D51273CC", + "data_elements": [ + { + "contents": "264965713C4FF4C23F6058", + "de_type": 957 + } + ], + "encoded_section": "459013250493378F298B2F0FD41D3F26496997911000E097C08787305AFFF05C26120584ADCC9001FCBDE7AD1AD06682B2B4E0E9BFBA96CF731B887DF56996A8D3F184BDC5B2", + "identity_type": "private", + "iv": "586BF8EBA8BFC91CF524513850FA6CB7", + "key_seed": "C1DC5EEA6320D89745E956A59829A9F12BFBB0E84D5702D4323A073153A402D0", + "metadata_key": "CABC965DC85DE1CC03766E3C3AD89955", + "section_mic_hmac_key": "E5BBD68BC259259BD8D7456D0028F4F9ADE138BD9ECBF8B08121095E5385A104", + "section_salt": "E097C08787305AFFF05C26120584ADCC" + }, + { + "adv_header_byte": "30", + "adv_salt": "B6AFC51F6469A1134FC9F3B79C63B648", + "aes_key": "0AEFE23D6E06401C54B9EDFD128EB043", + "data_elements": [ + { + "contents": "E592EE15CC4A379D37A1336E8AEA", + "de_type": 177 + }, + { + "contents": "16A5D19E7D776BB328AAA2", + "de_type": 167 + }, + { + "contents": "7667074E7BAC9ED1071F6D802D", + "de_type": 32 + }, + { + "contents": "6422E8", + "de_type": 397 + } + ], + "encoded_section": "6B90131C4A85CB414A096694AE91D2F80F642B911000B029880034337B48522C5743B764F6379002C54B4FDA4EE62DED8E3CEDE200278112467A6BC315CE1394D3305D6AD8389019B042E52B123A729F5FE8AB7D12E16D97D997E926B5B77E72E744C28708F78FD46C9DA7C1", + "identity_type": "trusted", + "iv": "00CAEF5FD9AC22C1D4D849A1F8405E97", + "key_seed": "CAA6234004DDC5868F8754AF727A16EB9CE58007EA363B77ACFA131DA8B8DE64", + "metadata_key": "E0EB0DCE07B9F33812599159F0966193", + "section_mic_hmac_key": "72A1D922D6D948622CE8A79C84EB61176C5A4624E5879BCE31312C46B7A124A0", + "section_salt": "B029880034337B48522C5743B764F637" + }, + { + "adv_header_byte": "30", + "adv_salt": "FAD0410EFA60449825FFC8516A0FB3B5", + "aes_key": "3A65582FCAFB3BDAD34815AAB02C6A0F", + "data_elements": [ + { + "contents": "F1E69503995E087568407D6D4A43E62530AAE4D1F234446F", + "de_type": 395 + }, + { + "contents": "D324E4CA9472C8AB06D88FE419426C232D883A67CBAF486BC6C3", + "de_type": 260 + }, + { + "contents": "BEB0E1", + "de_type": 153 + } + ], + "encoded_section": "759013EA5DB79A4B63F265C79FAE27A1E26D32911000FB31E0B50B916E1F3ECDE7E827BF50E29001F006CF03659E34A07A5AAC66EB68D19ABD36C2B2B95105487E089604722037191C1B864033FEAE9E902C9085A4DAA25167B29E6158B30DF8E0FFEA9F8AC5523813593B4EB612BA146E7FC0020902", + "identity_type": "private", + "iv": "B9B5A13C98A85049E31086ED7F63A8BD", + "key_seed": "5ACDFEBC110EFEAA985EDC3499B192C4C63780076D69CA3453E33AA31B1FD782", + "metadata_key": "415BB381B6F26519F4A8C16B3A2B2E38", + "section_mic_hmac_key": "617D53C2A4797B14451D556CA739B28CDC74C11599BCA1AA0CC5137AE1E06D64", + "section_salt": "FB31E0B50B916E1F3ECDE7E827BF50E2" + }, + { + "adv_header_byte": "30", + "adv_salt": "A0672D9DBDAC66877E4CADA6575E629E", + "aes_key": "FE14C2D672CD9D635AA444035A977DCD", + "data_elements": [ + { + "contents": "370473F9E9A4CD", + "de_type": 331 + }, + { + "contents": "1091627363EA5D", + "de_type": 599 + }, + { + "contents": "26D956645FD5C2BB41", + "de_type": 831 + }, + { + "contents": "725282C70B7EFAFA41DCFB83486789", + "de_type": 703 + }, + { + "contents": "A6FCE9D3F92AFF803A2EAEC9ED854C84DBD836C2E53DAFF2FBF42EF9", + "de_type": 208 + } + ], + "encoded_section": "889013DE18750F74B8F143F9531EC602C6F8D3911000DE2483B00AB55A180FF1F9B1F841FD2F9001155420E62FB73633F34D463D6FB6BE6C43CDB46D66BCE9BED579D8C8AF270939D8CD5B758458BB6BF168DD2189A818A421C46177C681B3AEB51971C7EAF979D286C5AEE7C5C8B9F4B2A024629B0481555FB6B91D72136640AA6259C98B6A161869", + "identity_type": "private", + "iv": "7FC34F901F1CA946F025BEE913D80805", + "key_seed": "0E323E4FA86CFC101E020EC3794DC949AB5583CC705081F7EF17098750114567", + "metadata_key": "F6DD9E9867B8367443C7454962722B5A", + "section_mic_hmac_key": "8B0D6438887EE9AEA8B4AA0C8A3B51348696F8D714ACFC329ADCCAA94D3FA90A", + "section_salt": "DE2483B00AB55A180FF1F9B1F841FD2F" + }, + { + "adv_header_byte": "30", + "adv_salt": "96F1F913702F12AE480B7EAB21F2E29F", + "aes_key": "7286CA7480D60CCE64380194BBB16219", + "data_elements": [ + { + "contents": "2D8051", + "de_type": 395 + } + ], + "encoded_section": "3D9013A36724A659838BA6715EC43B10B6018D9110004A50460AFDA8F4151FA5F0D09AB9D3119004351C5DAC336A78804914EABF3048100B413604ED1804", + "identity_type": "provisioned", + "iv": "9FD8B714A92F6DF61BD8313AE3F7A49A", + "key_seed": "3A032816A0CB8C6047394D942A569235A698EF81EECCDA4CE2EA03319FD31EF7", + "metadata_key": "DCFEE171874E4F3F44CE3F4C25284136", + "section_mic_hmac_key": "4F27828BA59BEBB1BC8D5491A8DABF3B0695E48243CEAC341E6B466FFB1E45BC", + "section_salt": "4A50460AFDA8F4151FA5F0D09AB9D311" + }, + { + "adv_header_byte": "30", + "adv_salt": "49C3EE4484207ADDF24542801C4A8BE1", + "aes_key": "CB1A44E35190A0A40391E9AC0352CF0D", + "data_elements": [ + { + "contents": "D13E6A67AF69CD4831EA837B4EED38", + "de_type": 118 + }, + { + "contents": "6CBA9A5D81EE86", + "de_type": 576 + }, + { + "contents": "91806A710A3CB7C48C7F9B", + "de_type": 141 + } + ], + "encoded_section": "609013306C20AA4B9DAC542AE193249ED0B4F0911000EFE9FADED32A35322200ECAC8AA2881A90029272DBBD9AAC8A12D6F6004F781D1F4D52EA2D558745FB470410EBBD4C176D934B79E574A2E302C32B6AC058CFC3C4A97099EE579974607E94", + "identity_type": "trusted", + "iv": "8B897A7D823EAC1B4DCE4088B1239438", + "key_seed": "97C8CEE0EB78ADDA0E9ED93B32D7578C1C79FD019B59C4FFC93C243608CE3FDA", + "metadata_key": "07C3B3BE5A728497F903AC14CEB46CAD", + "section_mic_hmac_key": "8D485452833BE483BCCCFD8AC29D62E88798A74B7B0211930CEF86928D20D8E0", + "section_salt": "EFE9FADED32A35322200ECAC8AA2881A" + }, + { + "adv_header_byte": "30", + "adv_salt": "29332896433E0267F1BEC7C68F39BD0E", + "aes_key": "52F52B3912CC1D4375D4C7CC363A06C8", + "data_elements": [ + { + "contents": "E71F91C189472E376B422A2BBCE9CBF608F93D7480", + "de_type": 480 + }, + { + "contents": "147B9B4DCB0E6D249DE2C41A2AAF577F6EAB2662D792ABE203A602B7C1E8", + "de_type": 382 + }, + { + "contents": "193DB2CE325FF3211237EF564F4876", + "de_type": 447 + }, + { + "contents": "22F03DCAE07E9F63B095F57A37A90C72708295C66BA5B46669272AA16D", + "de_type": 335 + }, + { + "contents": "6223ED9F71639C2228485250CAFE33C98E294D76C1704A539157C6CD5FDF", + "de_type": 324 + } + ], + "encoded_section": "C390132F02AE5C28B3D32341611CA5B50CB2D491100071C1B6B18B6BE3F8B10456DAFC58DE4190028D41A79087A8FF6623388489853F49A93D41BF1B458A34D85AAC3688B1E883037A0DEB66DC2A3948DBE513A5A2FE44AF75A3CE8DB96F36C7B7F289FF212BDECF375BE179F3200EEBB9FB185E4356005527031F37151971D546F2973D46F00B4F6A0C669725E69A70B6726BAB0553B65CD4FA49F1B56BFABF1A34A7B9543A474B7BA7E74CF7D212F9FDA74A93071B20ADC6A385081922658E66B27267", + "identity_type": "trusted", + "iv": "C86F257947D0FBEB5F1C7A0F9901D101", + "key_seed": "DB73F443904842E9F64F60B67EF63825A2FE8AA122B4633B5782B6FDB976BC47", + "metadata_key": "7F5EE2AA799A8E4E3F79C30E7B77B176", + "section_mic_hmac_key": "FDC07A4B26BEA7D99987AABF4E031FAE14538A0386922659B5FCCD66913FAB57", + "section_salt": "71C1B6B18B6BE3F8B10456DAFC58DE41" + }, + { + "adv_header_byte": "30", + "adv_salt": "3709DEC44BEDBB170C7652F0248E9DE7", + "aes_key": "400777F0893097082B132E298D6B2B0C", + "data_elements": [ + { + "contents": "0C4B67C6D9434B025D8E75580C8534E0C7851104F102E9666B131B", + "de_type": 269 + }, + { + "contents": "E2C34FB045408D602FBA91CBE2DCADFA", + "de_type": 815 + } + ], + "encoded_section": "689013405BED7C212DD107163732A69097B11E911000861DEAA6AD7EFF607DA016E4DE278FD29004937E2B1A97EA25A4AEFF38D95D57B4188ADC5AA57A1B38E4A86FEDCDFD5903ADC9EDBB7EB35B96A689D83FF35BFD7962DA302437DD32394EFC9B8DA42CD33CAA5A", + "identity_type": "provisioned", + "iv": "1CAE6EB0B86F8C40C325FCAD7BC975A3", + "key_seed": "C91B9ECAE0A8EF1646B96E3C6F06B99C5A01B0904E98349BF7974E1ACBBCDC68", + "metadata_key": "DD8A480B4A601C38C0FB3B382E646A61", + "section_mic_hmac_key": "9BBD9E8CC618CBA17F36BA2593ED4C05DEB69B0F69F2D2917CF37285E62DB629", + "section_salt": "861DEAA6AD7EFF607DA016E4DE278FD2" + }, + { + "adv_header_byte": "30", + "adv_salt": "4992036A41F8E54D00A1D3D4359A9300", + "aes_key": "69BECDC75EB309182C3DADE59FEEDF92", + "data_elements": [ + { + "contents": "8B591A5CAF41CEF237A220785B", + "de_type": 941 + } + ], + "encoded_section": "47901308D7B199CE04C602DE931C37B8E0CDB29110001463D56B2F97E53F05117D1D414DB9A39001CB5CF571A7859271C1CA2D95AE0F4557A8B146FF2FC636B1A6C948A7136E6F10", + "identity_type": "private", + "iv": "6B12EF5D3282AC2EE71A0398322D3655", + "key_seed": "B306946230C730CCD3B93C0FD74760734AFD01F5DAF1A17BD648505A6439C3A2", + "metadata_key": "C42D7A526D780B5D5E46603943A3FFB0", + "section_mic_hmac_key": "821AF2677045D3BAF8341C06C72F0476DBF407FA38967F3B08F060E42E2A0525", + "section_salt": "1463D56B2F97E53F05117D1D414DB9A3" + }, + { + "adv_header_byte": "30", + "adv_salt": "04CC1B63DDC7EFE20F035A5CA57AEA43", + "aes_key": "60046C736A3EFCD5DEA769D6BCFE3654", + "data_elements": [], + "encoded_section": "379013C978E90C73B9CE22075761B22E7B66B0911000C031142EF1CFE2DBCFA88DBE7038F4339001EA998FA7111B16AAEE5D76DCCE34F832", + "identity_type": "private", + "iv": "1425BF85545089772F7A0EC13B31F218", + "key_seed": "29C84402ED9B668C4B419AF8CCF3FC53BB771A5E41BBA83FC8D5264E5847F719", + "metadata_key": "0102525542E84C81FE13D0E70A4512CF", + "section_mic_hmac_key": "4A51F7871DC1B6363526C10EFFFD3492F38B5C352DFE2EEF206A9D8508BB8FB8", + "section_salt": "C031142EF1CFE2DBCFA88DBE7038F433" + }, + { + "adv_header_byte": "30", + "adv_salt": "2C87AF2AA5587D0D186ED5420388AEC2", + "aes_key": "2DA61DF51325B07DBC63B481DDCDE64F", + "data_elements": [ + { + "contents": "6DFF113A772C2EBFEF3BBF18A36294FEF1D734BFC360C376", + "de_type": 548 + }, + { + "contents": "89A698C96D173176BBFC3538AFBEF049CC59B34B14", + "de_type": 546 + }, + { + "contents": "E2F16DB52F89", + "de_type": 266 + }, + { + "contents": "DA22DAEC64B917FD589D805253", + "de_type": 685 + } + ], + "encoded_section": "839013EAA633D971185BFABB394355E4E31064911000C21027A41702F6DFAE49F1629A8E39699002BF31A3881922775031E2AAE919D18CBDFD195B02DA0445F61DEB7B7E655C8A975938B4A47F0FB27356C8A419774DF6A0FE213E84BA6EA1A0EF45F40EAED8ECBE37E53BC6542DFD0D3E582227E27A113785022CCEEFF15D15D94FFCA0", + "identity_type": "trusted", + "iv": "AEFC3DD760BF1C8A0C4D3F4D6F4332B6", + "key_seed": "63CB4A41E5862904E15594B7FB570AB2D20BEAF67CD053241796583FC4BBD471", + "metadata_key": "D1A562E45D9D59A9011D511728F7543D", + "section_mic_hmac_key": "BA11FB7271F9021364AD11352009E9452A74EB81FB340C526D9D2F5DA0CBEFBF", + "section_salt": "C21027A41702F6DFAE49F1629A8E3969" + }, + { + "adv_header_byte": "30", + "adv_salt": "79906A0C8EF398B55A1B7D6626F780B2", + "aes_key": "36EAEBAA45DA5B60809CA32832414FC5", + "data_elements": [ + { + "contents": "FA3FA3A9F0756E567E2A801656", + "de_type": 868 + }, + { + "contents": "45F76C1B", + "de_type": 816 + }, + { + "contents": "B3816FC81347A8D40FA3937BC2CC82C137D7B6067751AD29CCEFF635702C", + "de_type": 379 + }, + { + "contents": "360C1E18456ECFF656F8AD95220EC360ACD246BF31", + "de_type": 213 + } + ], + "encoded_section": "8790133E894393E3BA6C82A326DA85D9031F089110008C2D013111DCC58A0DA04E0EFE9C45319004864DE8CBBF7C31B013DD161A12A92A2C25E57FD4465391B1E1A51F6A7420EB21A6E72917783613E65E885B08BDA69B1A6015E249A2912B3EC997B8972459459270601B6AD2A41BC1E73976A86D8FBE6473C844C32157575412717212D045EDE9", + "identity_type": "provisioned", + "iv": "0E4490BF80B78BC51FE57DB85EB61ACC", + "key_seed": "A8850343015360DFD5FF867CA561B5B41CC0B6BCCE62CAB56055E57AD7EE2614", + "metadata_key": "84CDFC0DC3222FFDBBE864870E67A8D7", + "section_mic_hmac_key": "35A9250370418DA082D0649DCA2C1F2C5581EA3B444905B33D83601A1B16C1FB", + "section_salt": "8C2D013111DCC58A0DA04E0EFE9C4531" + }, + { + "adv_header_byte": "30", + "adv_salt": "7DB249FB5D7BFD40D6D94D4AB36E91D5", + "aes_key": "1236191281B7E6536582FBEDAF9DA8E5", + "data_elements": [ + { + "contents": "119D4427C80B8E", + "de_type": 760 + }, + { + "contents": "EC6A6CBDDF6848B16FF08DA7CF3FA284", + "de_type": 739 + }, + { + "contents": "B0E04C01243711008D6EA5D07C161F6195C5D3", + "de_type": 462 + }, + { + "contents": "DD978C138650CDBAE4", + "de_type": 743 + }, + { + "contents": "675E333C4398FBDB5DA8E19C", + "de_type": 403 + } + ], + "encoded_section": "859013ED4DDEB3D0D051B4EED779AC376BDAD1911000C0643734B37286129B4562EE0BBD13909002B4989BEBC63EA94FB8B876A2BED6797B0BC4FB7579D7406D5BA3E0BB069BCA2503A413B61DDC92002924E14321086EDB5799981AE6375534852E18BBD7497FA7AF7613020DBA383848020A7D2503027F2141669BFEA617C2195E5608407C", + "identity_type": "trusted", + "iv": "9F2743DFAAC832E0F80884CD326918E8", + "key_seed": "03B79B00D65494F60FF94D2606BB2E27ACBDC599D7255B2A74B96F631EB0CB0E", + "metadata_key": "996FB9AF1F3A5C5465BF8704F76410FD", + "section_mic_hmac_key": "49A636DF6F31E0E4D2A77EB1E6209ACF98AD16DB3E177E50F528116D445D3FA9", + "section_salt": "C0643734B37286129B4562EE0BBD1390" + }, + { + "adv_header_byte": "30", + "adv_salt": "CEB98B4B0D841160C2E35158B1037983", + "aes_key": "F053887925734FF405C94A8F3092C193", + "data_elements": [ + { + "contents": "5F8FE0C8238878BB", + "de_type": 994 + }, + { + "contents": "CDED7F45F36DD2BB6C5E5BE59E", + "de_type": 566 + }, + { + "contents": "B8E19720ADA1842AFBD9F20A979CB6", + "de_type": 22 + }, + { + "contents": "ADC17706EEF38EA4BF6842C76B00B7A0", + "de_type": 864 + } + ], + "encoded_section": "769013FB3E7BE1C7C57B079D1C68C1FDF94F499110005B21E275525D3CB89AE0C75679294F3A900115D44F49C8842FF45C041D7D9D3715675882EEC328AE875937FF27A2F98D28FC0FA595179DFB5DF10527AA494524553C57B7E76DDDD9F18724CD4BD2891947A5CECA8486F0C59A5C62387BE80B7DB8", + "identity_type": "private", + "iv": "E0052D908B8B534F17012FE22FD8C1C2", + "key_seed": "042A0DDEB37D4E1243415F80E9AC5FEBC7902B0F4EE29E7B0DCF9F6527D6ADF6", + "metadata_key": "4393A5FFB48F851733D1B5A7B790BA35", + "section_mic_hmac_key": "A85552BEAFCCC741A72DF287A142CF3F998231B97755E3C70FBA249989C053A1", + "section_salt": "5B21E275525D3CB89AE0C75679294F3A" + }, + { + "adv_header_byte": "30", + "adv_salt": "745AFAFC0D37846B5E0C490DDCA6B0FA", + "aes_key": "806FF3273840321E8944A21CBA372A14", + "data_elements": [ + { + "contents": "73B86820241EC5E7D125D74FE3D2", + "de_type": 315 + }, + { + "contents": "56DB7131D8D9555B", + "de_type": 495 + }, + { + "contents": "8E6A76DC340E0AEC07D79C", + "de_type": 895 + } + ], + "encoded_section": "619013D03954EA8469566EFA768C74AC4D2261911000FB23753432B9B3628220D45365F2AF579001083DF8CE07930F669C932656AEE1259E713C6D323E8D102093CE210868F5BBA9B4851B1294C512B9D778BF43BAD9A859BF57409A14294A756E35", + "identity_type": "private", + "iv": "0E3C4A8E72AEF423375202C1176EB2B1", + "key_seed": "60144BFB597852910B428D8DE204D6D6E7EABFF8CCB6B61F8274C2B38CD02BC1", + "metadata_key": "BB66D2E7C096B7AEE4BB671BE9071AF2", + "section_mic_hmac_key": "596D58D71B171946CF75F706CEF421DAD978584AD60E979DCC737D95BB7C0CCF", + "section_salt": "FB23753432B9B3628220D45365F2AF57" + }, + { + "adv_header_byte": "30", + "adv_salt": "9B363547BB9948D07B69AA3892AA525A", + "aes_key": "08E1C799F15F1C96C27A4A1B37AEC7A6", + "data_elements": [ + { + "contents": "E553E23A099E8329DB", + "de_type": 754 + }, + { + "contents": "D9037BB04B6E600107E7DF0A67566115EA3F619158D938", + "de_type": 244 + }, + { + "contents": "3571B7", + "de_type": 517 + }, + { + "contents": "60C498C9A191CF99BDB4C8BBC9201BABE9BAB9AB30", + "de_type": 377 + } + ], + "encoded_section": "7B90138719640172A7CA979ECE524C2CCC5B0F911000C470C9EC5726236DC6C06A591EBBAE7590021E80E98CE6E81A29B6EA96E5B7EC0B496E21D40C10F430851949B30F38A1071A3E98BF8BBFC9CC8A13AB30B73518AA59D96DED687C9409A3C46EE8AB3A4B0BA118AD67F2492522AC66391FFE18E7F41520F12458", + "identity_type": "trusted", + "iv": "6E4892B791E5664DC249425A2E7FBC7C", + "key_seed": "5A08FAE5D0EBAC61590102AA36711002B7800BF744CB7863766BA932F048B8B3", + "metadata_key": "EA9F3E7C877395501F3D890721C96996", + "section_mic_hmac_key": "2D774C8BF3CE278132DD7EA105A125A95ABFE9EE1EEDEF7A191DCCB02155B816", + "section_salt": "C470C9EC5726236DC6C06A591EBBAE75" + }, + { + "adv_header_byte": "30", + "adv_salt": "017CB0E1120225BD43E6B17407129A4A", + "aes_key": "236EDB5FE7F023E81E2772AE8C371905", + "data_elements": [ + { + "contents": "FC6C", + "de_type": 842 + } + ], + "encoded_section": "3C90139BDA46CDA896DC46E1953D4DF84DFFDC911000491F606D2C12BABECB46793C4FD4DD9D90029E9A317E650F42EABBEF539D64E97459ECE92C7716", + "identity_type": "trusted", + "iv": "3E43A43F32F7416F10FCAC7AA29F53CE", + "key_seed": "C536746CE8AB786BF064E636500981AFD86FDAF6D4631B161AA93FE09EA47F0E", + "metadata_key": "AE51F9455468275B5F1F3624602A4E76", + "section_mic_hmac_key": "BA03F46EBC0147C0582AA5BBAEF21D69737DEEE365F042F2767D660B6597B2F6", + "section_salt": "491F606D2C12BABECB46793C4FD4DD9D" + }, + { + "adv_header_byte": "30", + "adv_salt": "8134AC1B9E894BFA8F57429D27BE03FE", + "aes_key": "8E466BF38FD6488483AB864A1B9B2463", + "data_elements": [], + "encoded_section": "37901372B0E373CBA7A88E17D27393CEED2A9B911000580E141B47F88A102003E045B3306ECE900260CEC45B63507146E4F2021A989E4107", + "identity_type": "trusted", + "iv": "9ADDE95FF00ECAFC9BB6DBE00CF4D420", + "key_seed": "DB86E0A4E7BAECD6971FD06F4EA08B999E321D18139B295E3820C5C0A1D9EA6D", + "metadata_key": "AECE395205E92B4E824736CD2EE10388", + "section_mic_hmac_key": "A892FDFC74404F4639A18BD6AA1C732FA67A3F76EA9A4455C241346FB6088646", + "section_salt": "580E141B47F88A102003E045B3306ECE" + }, + { + "adv_header_byte": "30", + "adv_salt": "0E11B8EB767BF23776B2242E7F80A17A", + "aes_key": "CA4F5AC11D27A32BA5813B32CE9FD176", + "data_elements": [], + "encoded_section": "379013437CE707D51EAD22AF0E3D32C70129AD911000679009A3AB6E4C7835C13FA51C82745D900428D8BCD3A330E9A52A90BCD6C042E918", + "identity_type": "provisioned", + "iv": "4A026ADB419CF7A487500F4358C45D59", + "key_seed": "D373D3E85CF5AA0813907E92771B96A67823D7D7644AFAAB76324814008DBB89", + "metadata_key": "9E23DE492588EF5A6F10A9DFAA038A16", + "section_mic_hmac_key": "C4A11FF865C6FD2544C54CB7D16DB70136AD68A4B663DF5F530DE273EE36DE4E", + "section_salt": "679009A3AB6E4C7835C13FA51C82745D" + }, + { + "adv_header_byte": "30", + "adv_salt": "C9CC54A5BD1EBB46FF5246ABC60AAA8D", + "aes_key": "BF5E5C3153CF9792AFD6CDF96A2C5344", + "data_elements": [ + { + "contents": "9D4B5F1E5AB4A177310F992112F9BEA680", + "de_type": 886 + }, + { + "contents": "2D36CF0F4C8F1B36DDA5D23FF20EB6CD379F92", + "de_type": 70 + }, + { + "contents": "342637079BF30209525A62AE1D233B717E", + "de_type": 396 + }, + { + "contents": "D112664E69B12FDF70", + "de_type": 38 + }, + { + "contents": "D9AF0F568322C795328C8B4C1788987C398192A22A", + "de_type": 678 + } + ], + "encoded_section": "979013282215741E4345A78D01377EFF9E84189110005B4B4A350A45FF863C3EAF2AB7F71C0790011B34CF8E42769B0FB7FB3F66C45BBB7B7F2160D74F03D27F7F1AA2D8C52FDC024CF2CF9A7EF240540C04FEBA619ABFAF2D79C7BC35421D09D20FACCE2A115C262624A87057FB67B440D453259A65476D5134E1E263A128B7192920FC7DE545B0EE63F83AD8963197C51E056FA2C6200F", + "identity_type": "private", + "iv": "B084B7392E0FF2BA4DEC9EF8E26B1A93", + "key_seed": "33565BCB2529940138116B4DB968D4D320B749D470FB480FEB2B9A6D6971EAE5", + "metadata_key": "A3988254E6FEAA0D759AE32D048013AA", + "section_mic_hmac_key": "41B9C812B94BD2AC4AC218F8DDE986E2D45EEBB89A0882C438933B001DAB2181", + "section_salt": "5B4B4A350A45FF863C3EAF2AB7F71C07" + }, + { + "adv_header_byte": "30", + "adv_salt": "4144053F0E007DD7F1D38291852FE2A4", + "aes_key": "1E65E2D1E7718EBBD972BC2042B9B11F", + "data_elements": [ + { + "contents": "3AC4BEE4E3E37B706980475F09EBDD", + "de_type": 102 + }, + { + "contents": "7876A28FE5101EC499AAAB", + "de_type": 112 + } + ], + "encoded_section": "559013343E829B75A77E72E1F5C0EC1ECE8EC49110004F47C2E91506FF96DA391B2BBE842F2E9002B9E7953047832B10DFC880CB57E7F569953E97CE5469368BFDC23E298878D41A775E405A97B0944DE64EFFACEE3A", + "identity_type": "trusted", + "iv": "AC1839A4D9EBBC369DF0E5DE3E9FB486", + "key_seed": "F53B91BB8F5F267901F6D0C2E6B511D37F23F41356B514C5BDCE04AEF60A7624", + "metadata_key": "B82E90A5753E1604C5C50790383528B3", + "section_mic_hmac_key": "FBB75466A337A9EF19DAE241B45E6366B3ACAA49B3678F6D410CF6A4B915EBE6", + "section_salt": "4F47C2E91506FF96DA391B2BBE842F2E" + }, + { + "adv_header_byte": "30", + "adv_salt": "DFBED8D9AE83990BB427226E21034CB0", + "aes_key": "AD572A7C029F77B3C54ED924525D3229", + "data_elements": [ + { + "contents": "3E120DC6A27E75C6B4D1D1A1C9F7A29C6B3B9B0F14E45D175F418711", + "de_type": 213 + } + ], + "encoded_section": "569013F5A38DF3EC99C4156E794798A6F296D9911000986627D3A935F5C710D101A38FF8286890024F59E49C79DC9C0E298AD99275CECC28E1B8EDDEF0C3C2B4A7C984A2CE21DDAFE6E918D16575D2D6624D8C44673699", + "identity_type": "trusted", + "iv": "AA8AD31CCD7C59E5EA8186E39301A7F0", + "key_seed": "AACADF297C376735AF0138DD2F3F4B5CFABF32A8762275DFCA9EA2295E86A28E", + "metadata_key": "19528CA6D4629802FCA9D11353A60C2C", + "section_mic_hmac_key": "79F40360C6EDB9881CC05F01929B36746DB5F046093AFF5C2F3721BC5DB54A8B", + "section_salt": "986627D3A935F5C710D101A38FF82868" + }, + { + "adv_header_byte": "30", + "adv_salt": "8BEC81AF56FA2AC4193B05558C125204", + "aes_key": "AE9C86DE09A15A4F3859D801E0678262", + "data_elements": [ + { + "contents": "4340F3E3DB2B1E56361256AF51DC6526", + "de_type": 221 + }, + { + "contents": "CF0E82", + "de_type": 309 + }, + { + "contents": "3EAD73DC8251FB1A5921E8255EC3CE3C12BE13839BF284A799BC", + "de_type": 508 + }, + { + "contents": "E261280F5BEFFFACD5D0ED3CC81F0C1BC1631C2E5D9A", + "de_type": 929 + } + ], + "encoded_section": "869013F05F6FE5E4F7979EEE836171656BBA54911000465E3D595AAD47749A7384B123CA18E9900246F59681BA8A29A4B50D6B4EB3A5A37571EA7EBECCADE01435C0AA8A59440DCC455EC858FBEC686DC4CC3BB20F562B161BD729338C4FA13753F30FE021F5747CF11957D338E0256D07F3AF7A9D2A949DB748A997D6466F6CC5C6F80614B2A9", + "identity_type": "trusted", + "iv": "2E91EDDDC24CC419B76CC16976B8833A", + "key_seed": "11FD266669C2E6C279D8EA69F540B784989D11A09568A19F66D2ED0C1D6DBE08", + "metadata_key": "9B21D37E086FFA839142C0A22F3D65F6", + "section_mic_hmac_key": "A7F1A78902BB05FBB7B54D35CE9225330B349654936258EF908C11D4E6F3BB47", + "section_salt": "465E3D595AAD47749A7384B123CA18E9" + }, + { + "adv_header_byte": "30", + "adv_salt": "801D4CA35A70D4C283D2629EA148170E", + "aes_key": "65B82E5D5498A2A0557B1D39C0F5950F", + "data_elements": [ + { + "contents": "A02494863822B1EA59AC8EB4", + "de_type": 243 + }, + { + "contents": "4C200134B8F4ED2481229F256DEBECCB6C5EFF7A8ECBB9684BAF", + "de_type": 900 + }, + { + "contents": "1CECAE0187941B94F8", + "de_type": 950 + }, + { + "contents": "DB6AF61301EA124E883131733344543394B9EB2D18", + "de_type": 77 + }, + { + "contents": "", + "de_type": 542 + } + ], + "encoded_section": "8990135245B0569137C5BE751DB35223449F6E91100054E61830D0D0DD6A1F6B3DE7013EF06D90044DAE7D1C3F0BF3E5104C1DD01FDD1C5DFC6963613291EC87DEE2ABBC16C9D2BCA620921CA07A64D1DF36C733EAC39D997BCBF38E4D252F232C58CFF37697A13C04EA5284FF0BF47C11E85805018DC6E3495D61EFA87FA298724C267F1F29031B2C9D", + "identity_type": "provisioned", + "iv": "DA7D5D3FB17D06F46DD8AFB6647A44AE", + "key_seed": "78D9D6D609D520DA4339EBF814B40DC3C80AA0096C2E7948D5D4B92FB9243084", + "metadata_key": "ADCD26D03B8A1AF8C0FD9B3188124D19", + "section_mic_hmac_key": "B0430F46E286EA342ACB84CA42C151174AA8650353CBE5B064BA37DE66D823AE", + "section_salt": "54E61830D0D0DD6A1F6B3DE7013EF06D" + }, + { + "adv_header_byte": "30", + "adv_salt": "0CEA8476765E2C9409E38AAD4F554E63", + "aes_key": "BD88F43CAB6E5D6B2BCB69424BCEC9F9", + "data_elements": [ + { + "contents": "D831FF5C4756", + "de_type": 24 + }, + { + "contents": "8689F2BAF45E", + "de_type": 805 + } + ], + "encoded_section": "489013E6F67A18C298C579609785D002870A829110004B7B840D8A6CC70F61B178722D71FD419004B85364FEB66321ACEEBA3A8C7133634867852A5A6A1B2A18FA032B1853288CEB84", + "identity_type": "provisioned", + "iv": "1FC05B651BB33F007EE45A02E7AC904F", + "key_seed": "667CD8F62F8A77492DD85747934C30D23D3658252198EBA915382603CD2B6CDB", + "metadata_key": "68CF855C510241813831D894E104173F", + "section_mic_hmac_key": "9BF0F323006089DCFB6181BE51EBD8DDAC8692E6C8B36A69EFBF85A7C073E31A", + "section_salt": "4B7B840D8A6CC70F61B178722D71FD41" + }, + { + "adv_header_byte": "30", + "adv_salt": "EC30A0D58034A34B8E5C559F280F509E", + "aes_key": "728B0357E323756231894D94286C3AB8", + "data_elements": [ + { + "contents": "A7F5481741CB91CDE0", + "de_type": 894 + }, + { + "contents": "2AB65DA2EC0508A1", + "de_type": 303 + }, + { + "contents": "380AEEF682FD5EDB89F02A05", + "de_type": 920 + } + ], + "encoded_section": "5D90134D517709AEF9711FA7C2AE7B5ACC3ECA91100080E251133A8F0A7747C29C80983F07A790024BD1D93EE6C137F6504D32C8CAC34BCE856EB4FA298CE7801B8F56463E85457A15C15F7075F06F2EC32AA68CF9794298E42F07AACFFB", + "identity_type": "trusted", + "iv": "1C296F5143FB2934F70CDC21DA10965D", + "key_seed": "955963D16FDBA60A066C6F698845F5A28A9D6D0099B4C77B443B56B249CBB1D6", + "metadata_key": "4AB7C96061268E4C9778E218F0E34ECB", + "section_mic_hmac_key": "D0496A75DFD42062C8DC17A2424ECC60EFF3890942702CF45733DCFEE97C58FA", + "section_salt": "80E251133A8F0A7747C29C80983F07A7" + }, + { + "adv_header_byte": "30", + "adv_salt": "EDB71DD72EEABB1066B3E8250E2E6838", + "aes_key": "B0BE972933B74F340C2FD12F033D470A", + "data_elements": [], + "encoded_section": "3790132359338C99B060B1F9B0CA90849B5B7C91100073BA46B076BAB82D101B0761C8B676B590026EE24CD8FE1FEA2573DBCFF4F2E712CC", + "identity_type": "trusted", + "iv": "47E21BB24E2B6E7E524F3B9EE2B3D661", + "key_seed": "2F6D9575641AD9DB592DB0D601A38DC7C33EA96141E7E46F2C12D1DD4FB5DB58", + "metadata_key": "16897C47EAD110C4A40E872DE97BE7BA", + "section_mic_hmac_key": "B383738B32E347E6CA30DD1AB86CD8C6C6F3817FF5DCA69E5927FFE970966B30", + "section_salt": "73BA46B076BAB82D101B0761C8B676B5" + }, + { + "adv_header_byte": "30", + "adv_salt": "CF3696F6CB3680CB90959720B0C0C8B0", + "aes_key": "DEFB7155A421A3C00BCA9521B9802212", + "data_elements": [ + { + "contents": "BB94E1E012E8C01D78B367A8676B719687FA84832A", + "de_type": 100 + } + ], + "encoded_section": "4E90130470C8FD4D0863A99E0655588B3677999110001560EF35DC8690A269985B834F5DF50C90015F68C10A7D7C940497ED4E77972D7A694E425C5CB5CD557378D55E31F445E7D38CF41BACC3584D", + "identity_type": "private", + "iv": "C493FA8A5AA5716991EA0A1825B88634", + "key_seed": "DFFB9A504328A5836EC19500C592E8706E45A8CC9530A63B6D57A50D81DE4368", + "metadata_key": "24DBE2F5B5592F053F7E969D336384F9", + "section_mic_hmac_key": "6A0717E12EC5CD7EC7B18B3A0A597CB73650649DE6E9B11947ECF3552E72BB80", + "section_salt": "1560EF35DC8690A269985B834F5DF50C" + }, + { + "adv_header_byte": "30", + "adv_salt": "96C29DB449A05ABD7BD2AA8292B5B1A3", + "aes_key": "48A7161729D51256FB3A22D800C9F4F8", + "data_elements": [ + { + "contents": "2A33FFE5AF0D", + "de_type": 146 + }, + { + "contents": "61F2724E94BF6C6B841EA6DA24", + "de_type": 777 + }, + { + "contents": "79013E7CBF1E6757B28357C09CD8DF3F06EA5C8B29790B6AF12FAD", + "de_type": 19 + }, + { + "contents": "4E31D2948A6FCB9981BA3423", + "de_type": 85 + } + ], + "encoded_section": "7B901309CDADEFBB30DF2A333B1F1211EFF789911000317126A212B7088BCA01CEAC599314F39002C21EC35FE4B66BE19DC9DAE8FEFC0FA8E0CEDAF4DE232FD592D75432B7D99511A15AB00D4359120C22D4934C0FE24C00B612684FAD1B4B8ACADC18BDE97D5C7BA24454248F2B816DBFC326EB73A7ED11C5F4B3F8", + "identity_type": "trusted", + "iv": "D85729A8ED6F4206E1557D6C0B1A6767", + "key_seed": "76BCB5FF9343256A836AA5AEAD8462A0FFFC2111B70F095635995A2AA6C60FFC", + "metadata_key": "B89DC800A35AC2C0AFE5A91834D7AD2F", + "section_mic_hmac_key": "A9C86D50FB79A6B609EF7F805E8EE1738B278AE7FCC46A0B5462089755752E6E", + "section_salt": "317126A212B7088BCA01CEAC599314F3" + }, + { + "adv_header_byte": "30", + "adv_salt": "C827366ACD1EB08E13FFBF22716C436B", + "aes_key": "420312434A398DF54C75FDE9FC81E919", + "data_elements": [ + { + "contents": "79", + "de_type": 784 + }, + { + "contents": "290E4DAAAF", + "de_type": 11 + }, + { + "contents": "", + "de_type": 225 + } + ], + "encoded_section": "449013BD50CA32BC08AA861296C928AFD29D20911000F29D169C5E837778E5A31231ADEA015C900287033FD9D655A2A75CFB2D920787BFB3A9BD5574A01CF64B3BFBEEE838", + "identity_type": "trusted", + "iv": "88016DDA898C2FEF943D1EA8E96C9A87", + "key_seed": "69722E285E4866039C057956F5CA697047315D8C4C72ABE50D586695683FAD60", + "metadata_key": "475C542B15D91FAED80364C9399C1A17", + "section_mic_hmac_key": "636441B2DC928073663261C3E1A69B80272551D557AEF7F6BED9BC2B86C419BB", + "section_salt": "F29D169C5E837778E5A31231ADEA015C" + }, + { + "adv_header_byte": "30", + "adv_salt": "5A822E5B54BDEF7F5009548D324BBB5B", + "aes_key": "6C2B767028935ECB4D5259451A6FD38C", + "data_elements": [], + "encoded_section": "379013C45F3FC194B77E7CEA94559ECF8B2CEA911000C29DD4EACB5AA9ABB862A37A0BE5EF7B90027B67A1CA38161CDD01B235691A241DC6", + "identity_type": "trusted", + "iv": "10FBB6D3CED80733229DC291931A5F62", + "key_seed": "A25CF787076C32D614D8D7A292FA70FCBC0B24A48CCF9F48126E9A083E9A3B3E", + "metadata_key": "615711C7C51985FB53AD38EA82645DAA", + "section_mic_hmac_key": "092803121B8DA22AA60360C830EA1A5DD8C4FDB5A474914FC4ECB717D13BFE76", + "section_salt": "C29DD4EACB5AA9ABB862A37A0BE5EF7B" + }, + { + "adv_header_byte": "30", + "adv_salt": "3BA5CCE53243F98AD868DE1CD3E9F63E", + "aes_key": "7E3B147189BE67DBA984C1682CEAA129", + "data_elements": [ + { + "contents": "434D0E7DB4C0BBD5674A83C484DA072FEA", + "de_type": 0 + }, + { + "contents": "6AFA19CB7C46BEF2EA5369837FF9F4C834", + "de_type": 413 + }, + { + "contents": "1070DA173252B48ECD95EE5AD376", + "de_type": 410 + }, + { + "contents": "9A09FE8AFA0D8C036D3670E709658C3F67BD13352BF689", + "de_type": 27 + } + ], + "encoded_section": "88901314095DFFE2EEE0485F9947690F21701C91100093DDBC1927840E03F6449B6CB0FFA110900226C7CBC3BA4BD4FCA1E8EF197562C5F485BCA2B259F0A214E3D5C2A68492BBE242E720DA326C82CEF19D79A430D4F2F23E7F36811D5878DF371D6AB23FAB74235DA55E21AC6BA52BEF2F86B4D3DE92F79AD995CA6AA796AD37BA43FBFC9AE913B5", + "identity_type": "trusted", + "iv": "A8976278B12AE5463AE984157E0205F6", + "key_seed": "6D57B2178FBD724251697132B807A3CFBD68DE400362C57CCF9108CCEDD973AD", + "metadata_key": "0D5B558D2890FFB2E5FEB48ED21150B7", + "section_mic_hmac_key": "F79CE3F6795EB7F1B65DC1FF2D997397B02C3975B304B62C7E49C7D0AF3037F2", + "section_salt": "93DDBC1927840E03F6449B6CB0FFA110" + }, + { + "adv_header_byte": "30", + "adv_salt": "1E4EA1B93504696BC87BBA1AE230DFBC", + "aes_key": "65F515D0D4AFB386BC2D9D1C37A46C92", + "data_elements": [ + { + "contents": "0EF8D96C53C49ABD11B69751", + "de_type": 258 + }, + { + "contents": "B945DFECDE411CC9B1FA63", + "de_type": 728 + }, + { + "contents": "AE610E4798CA99", + "de_type": 212 + }, + { + "contents": "18526E1BEACEF8F0FDFC34AA7F0992387B", + "de_type": 765 + } + ], + "encoded_section": "729013B0AC05E79DD417567F17EF2ACF4A48C8911000D05DF80E62306F8629AE61A8270A7CBE90018D38E80AC68E0B71973CD3BB0A4D58D10932C58303F629C6497ABDAD814AAE32A7CD767EDB9F4F6E7B3E1245F15D6D1D6D45B175C6535A701B2C0A19E6ED9BCFF379255F23992E877887ED", + "identity_type": "private", + "iv": "2CBF8042D27B1F49DDA990A4BFF88509", + "key_seed": "09E15C8F181659969AF6C6C2375A564A9E8271EA13B1EDCB8A1F7809406E95D1", + "metadata_key": "F7411DB79645E475BD12C015B15ED0FE", + "section_mic_hmac_key": "AE6FC455FBD017A6B7B80052C2EE240019CAFC961605EA703F0E6F1EF9CF44F9", + "section_salt": "D05DF80E62306F8629AE61A8270A7CBE" + }, + { + "adv_header_byte": "30", + "adv_salt": "967CD8FA43AF6DAC8E445A080A65B16D", + "aes_key": "0A01B5E36CC69764CCE3A74DD544B1B3", + "data_elements": [ + { + "contents": "4747E589E226F4F9093067D1E5227412CD7590", + "de_type": 212 + } + ], + "encoded_section": "4D9013F9C57DAF3EEE1AAC80E7C06F1066F0929110009A52343FA860D361860C5072654AD99A9001A6D1DE2BC661B5E9AEE33FF8034275C5308DD4AE9340C637DFABE250FD8A31813DDAFE0BE84A", + "identity_type": "private", + "iv": "9643C2FA43D519B44896490C005E01B5", + "key_seed": "882D996C004CD5A1A8E00F436F97DB555099408BD3DFC845416A55179EF22C3F", + "metadata_key": "9ABA26D1743D347716204D2AAB927133", + "section_mic_hmac_key": "7CF80AA4D38DE78937E2C09F53E5C71081A5036309D4D3732DCAD4B6D2F82E5A", + "section_salt": "9A52343FA860D361860C5072654AD99A" + }, + { + "adv_header_byte": "30", + "adv_salt": "A703D473C6044C05892027F1F0B60F72", + "aes_key": "2FA998F537E61F6E8195C5CBB96457B3", + "data_elements": [ + { + "contents": "E1A624CA4950C406697EF34E02A7", + "de_type": 902 + } + ], + "encoded_section": "4890134D9EC007C7BCB6530D03FD5F58F0B753911000737B467B6EA222531CD57C3DE300F0BE9004B24DABEFA8C0B41D78ED1E5201E4BBB51D8BC92D8976081E6FFC732C2E483E4547", + "identity_type": "provisioned", + "iv": "F09BCD4A5B8D538621858D272F8357F4", + "key_seed": "D41FE25607634264613845B1FAAF6735778475A69D76DDAA067279DF982667BA", + "metadata_key": "08C6FC8B190221DE2134ACB569BD9002", + "section_mic_hmac_key": "8D5B13DBD8411D3E2012F8B17F42FA32F12212905D7B123C6C8F5A794C28FD17", + "section_salt": "737B467B6EA222531CD57C3DE300F0BE" + }, + { + "adv_header_byte": "30", + "adv_salt": "225DAE6F894DBA4F2E24E053E5DF0926", + "aes_key": "0C13A76631F9D2FF50D2B7943578F342", + "data_elements": [ + { + "contents": "DDCF88A122E86BBA27EDA33BCE5C8C92A5CDD960E3D401DBBF8235", + "de_type": 860 + }, + { + "contents": "EED509DC49EB0688DAE0EF2B694BD257D334656BAE46BA", + "de_type": 281 + } + ], + "encoded_section": "6F901307E6D989A7D4580033D10CDCD0BB35C0911000AB498A5AC0AF52C5CA35710B455BA21F9002AC340BD4B1E47545097AA869F28CDFCEF69744505C494AAED292AD78A9A4F2018CA12E1587B9AB701BB58F91C587B32155674BE664214638B527597315F0F1975D8A6AF1995EE16C", + "identity_type": "trusted", + "iv": "23513AA8837D20F3D7696AAAD240E477", + "key_seed": "7BC68EEFD9B2B6410C33AB48E86A7F66719AE9475ADF6F0A132F869A82BF0297", + "metadata_key": "6E06556BE6FB79950C5DFAE4A2E674ED", + "section_mic_hmac_key": "9016C1CDC6CB002A1B2F89D05DD939B8DC0215BD625C2BB468ED6EF69B9257AD", + "section_salt": "AB498A5AC0AF52C5CA35710B455BA21F" + }, + { + "adv_header_byte": "30", + "adv_salt": "2E9D2DFCBE85982F854C1D4F0E6D93E5", + "aes_key": "D2C5575DDBC1CDD5CE0FE02422980767", + "data_elements": [ + { + "contents": "", + "de_type": 888 + }, + { + "contents": "B9D74B1C7C57A773B30E7A1BBE85531092", + "de_type": 717 + }, + { + "contents": "9D7507067864040C", + "de_type": 743 + } + ], + "encoded_section": "5990134C8FE31670AD6DF853D9B25DF0C1793591100095C176F7E36BE5C6DA5004DDB3C65D7290029317FD5A115128CC9331C1610AC7B2797FA680F094169BF66D48E7E6E1E08D541B89EDF9C3342E8BFAA9F6B2DF6AE881C718", + "identity_type": "trusted", + "iv": "BC20E92086374ECD11A19A07E3E2CF3F", + "key_seed": "02D4DE8B5FF08DCF8256D575084CA4983548DD3F55E7AD54336A4985E3351112", + "metadata_key": "7FCE36BF9B0479FF853DF40B4EF98956", + "section_mic_hmac_key": "7C13466EA8471C744D721F3A584E59B5FED47C7CE25B9C47D2CFF2036920C9C6", + "section_salt": "95C176F7E36BE5C6DA5004DDB3C65D72" + }, + { + "adv_header_byte": "30", + "adv_salt": "39808BC788108E6F5B6D34DCC09FA9C7", + "aes_key": "08F97FD75991B8686F0FB843EE31A1D0", + "data_elements": [ + { + "contents": "9FA77C23C482636D020CE064", + "de_type": 370 + }, + { + "contents": "BC99", + "de_type": 68 + }, + { + "contents": "83E5", + "de_type": 573 + }, + { + "contents": "1EEF6D24", + "de_type": 145 + } + ], + "encoded_section": "569013BAAEDE05A06A54EFEB6D88CBB00A8A7A91100066CDE62F4772FF4E97566A182D5C03329002FED2FF0BFD3A6103DBD82114343B47F4846B6B2A001E7533606442DB32EE91EBD21245F80F6AD615FF03DB2C35118D", + "identity_type": "trusted", + "iv": "5EA3B7F4C64F94FDE824BA20F150F5F9", + "key_seed": "3BB0AA21375B167B2A4777D850C4A2432C0EC93A3BDF6021456508619433F97D", + "metadata_key": "41537838EB8E6DD487D4F2B26182EB72", + "section_mic_hmac_key": "249AD0CAC358E0402D1F0905EF4BCB199B9988D958C17F4A91CC01249061EACE", + "section_salt": "66CDE62F4772FF4E97566A182D5C0332" + }, + { + "adv_header_byte": "30", + "adv_salt": "C8659FDC730244DA2ED976154CCE7794", + "aes_key": "1217C04A0210C3DA505F5EB9123372D6", + "data_elements": [ + { + "contents": "84ADCF3C26D68CB75E3D7290C59D6F86BFD9B23E10065C2886", + "de_type": 795 + }, + { + "contents": "221C330B2C2A3F16F957C02D806C5EC9FB18117D9EBE45A32D9E4C", + "de_type": 534 + }, + { + "contents": "2C858E1D7D841372", + "de_type": 544 + }, + { + "contents": "B5DC82A3D20F6601D1", + "de_type": 629 + } + ], + "encoded_section": "8890133129E43BE247688922EFFC1C06A2976191100097BBA7CE5BEDE598EE61AA356BFA3DB09001E23B0136E0AB1C5D8DE60F20A809FD1D5B787159DB77B950B9F353C38D777D290ED5586BE886CABCDC8E07909FAB3FD375F42F3855D01FC55B4F29DA7951456624CABD2D4454E45AABD9758EF277C1E25B631E897C52201E53D44C8F3FDCE1C82A", + "identity_type": "private", + "iv": "4322ADCB565A23AB23CD40565F78C009", + "key_seed": "FA744BF2436D127CDE08772282F961254C68C88CA37CF683420F04A4321CFAB3", + "metadata_key": "7119BE6A5D9DB6AEFF8C4ACA38E43DAA", + "section_mic_hmac_key": "70A522C74AE34A81184EC55874314B13532145C99D47324BFAFC08041E0755AF", + "section_salt": "97BBA7CE5BEDE598EE61AA356BFA3DB0" + }, + { + "adv_header_byte": "30", + "adv_salt": "6AD3D60D04723C57A58AEE240F6BBACE", + "aes_key": "43D34DFDF2BCCCC8DB6216E7C35C61AE", + "data_elements": [ + { + "contents": "E2", + "de_type": 132 + }, + { + "contents": "19855C45342ACA24BF3C73CB79", + "de_type": 696 + }, + { + "contents": "E2E48F8ACAD7CCAA6910E3", + "de_type": 265 + }, + { + "contents": "76FD5B530D0014", + "de_type": 236 + } + ], + "encoded_section": "639013E9ACAAAE5E2D8CB5E46DCFC19FA72E519110000675F279365CE50B3AA51B78DB0DB4B2900235FD3644D84D6326F596083705677D0F50B4E9C8C25FAE3E08308E09C28D388BB5C0FF248FF9789030675D9B4C73C5EAD088ED65169869A8F20F3FBE", + "identity_type": "trusted", + "iv": "7FC53B20EE21524D8567BB6EE0B24693", + "key_seed": "ADFF7F0DAE8A0314B915683C900FDB5EA48F05D1FB65771E44C1772C2BDD3287", + "metadata_key": "42CFED512703687B96EAAB7E8E402877", + "section_mic_hmac_key": "6CF494AA61E6BEE966D48FAF7E2672F82527FDD1C3075B7637550E7AF90BE358", + "section_salt": "0675F279365CE50B3AA51B78DB0DB4B2" + }, + { + "adv_header_byte": "30", + "adv_salt": "9DE0357046BC21405E3FAA9554F7E58A", + "aes_key": "F9793D17386DA59EE51F7D32A8A151CA", + "data_elements": [ + { + "contents": "6C85DE2E1644563269414164604499D1A2C443969711F381", + "de_type": 473 + }, + { + "contents": "12E30D7E922A107B3803092257C476D6CA8795F03A9E", + "de_type": 759 + }, + { + "contents": "00", + "de_type": 527 + }, + { + "contents": "FE4B43A8995BEA8FAD5746D92ED6F9BAEA918E51F433D47E71C12FD7B9FB", + "de_type": 57 + } + ], + "encoded_section": "8F9013962F6EDF9C4DF87F7C4C5DD8CA42CFA6911000963BE50C9F0419B34F64BAE61586A95790010869544823FB9E1FEFF595AE61CB1806C2996320388AAC60CD987CA7EE6DC1272B2EA4DCC069C3E127ECFB9F616F4B9A9633A355861DF6B463084236E9E8E6FC4860EEB27F65803C8E18C898123DDFCC6621A9F74780D038D3051795B536F9D2D90CBA19090A0978", + "identity_type": "private", + "iv": "ADB30AE2A8D404F6B9EC3C5C7F40C87E", + "key_seed": "C88CA68847CC9E39EBA84A18D9882BA9284276ABF72E3A71E046BD0061A0F946", + "metadata_key": "0A59A06A76CC860B8843AF5DB75DF85C", + "section_mic_hmac_key": "2805BC04A45CC27210E07D9A5C74E95FE7E53C4AA59BCD95D4EA877509C25416", + "section_salt": "963BE50C9F0419B34F64BAE61586A957" + }, + { + "adv_header_byte": "30", + "adv_salt": "57BBEA707A339197563A41AA0E0DF11A", + "aes_key": "1434B77F9FF8ED4472524CEAD5E2600E", + "data_elements": [], + "encoded_section": "37901317C3340DD8DE24DD7038087A0AF9F8919110003A25A320C3B2AF5602DBCC5ECB87F5049001B989234629FFC24C7AF47AC6F5591241", + "identity_type": "private", + "iv": "FAD343C30CA085B82CD74F2EB90EEC36", + "key_seed": "7618055D281738547A4B524FE0C6EABF1BBEE14AFBDD654010569DCEC71EBD5C", + "metadata_key": "2CDE85BDEB42F4A684CB85402EF2050F", + "section_mic_hmac_key": "780A1086ED611E46176DB2BBC18D9922D10CD2505B65C948C3AF08D1EBEBA1C0", + "section_salt": "3A25A320C3B2AF5602DBCC5ECB87F504" + }, + { + "adv_header_byte": "30", + "adv_salt": "69F7A5E815A8018FA3C12A5259619FED", + "aes_key": "1EEA4B9B9FABAC2BB81EA1833E7A9C05", + "data_elements": [], + "encoded_section": "3790137E34824746AA819ACC4C60043B9B3D2791100065C80E3A90B498B761A7C07ECFD92DF69001FAA0CC5A0DBDC1AAA92FF3ECD5297778", + "identity_type": "private", + "iv": "5407E8912C6A7CC71C741306C0848964", + "key_seed": "567ED96D44DD13369424A930E8340DFB1B3A5423A3A8EC36EF30A5CF95B0CBDD", + "metadata_key": "6265BC696E8C105ABBD597107653950C", + "section_mic_hmac_key": "102CB9E93C412A3E2D267FB56147326CBBBB34CA36471AE61B00EDF4BB24B35E", + "section_salt": "65C80E3A90B498B761A7C07ECFD92DF6" + }, + { + "adv_header_byte": "30", + "adv_salt": "EA4E1434567DB6531BCCE1A5D8142D5C", + "aes_key": "52CA47EBCB645595D4CAEE61A9B3C181", + "data_elements": [ + { + "contents": "53ED1098F6A0BAE7CF9EC6", + "de_type": 128 + }, + { + "contents": "A435650C36CB2E6CE210E52065405617925507797DD8", + "de_type": 761 + }, + { + "contents": "F3E6", + "de_type": 242 + }, + { + "contents": "D4B6AC531A7CC0B6296463AE4E98D99FEFE577CF473CFA4D", + "de_type": 556 + }, + { + "contents": "185BBD798D78329142610AF413428555C31F543D65093312003D17BAF8", + "de_type": 388 + } + ], + "encoded_section": "9E90130A0D321186AF0AB2F4AA4379978B717B911000221CA03F0091EF740A7A59E45C6A8B4B9002AEB4E9389E0828052CECEBAB082423E0349E44EA64E5532DCF3C323319E13345127A426379FB1E494C9BB9D6DB2DF56FABAA87E47E7901F2D4805002F428B000CC4DFFDCFE8CC9209596718BD5636C25C177E7726AE4730FA153ABA0CDBBEF47A077EC595144440F725EE5CF6914DD6FAB91AFB8B1FCC5", + "identity_type": "trusted", + "iv": "4936E010A41A65BA9541DC9709158FD1", + "key_seed": "9E67123907427CA52C8260AD5B362365EFEE24A87BBFD9EECD3B17C0A9560CED", + "metadata_key": "E2A5139BC71D9F56DDA6FD58CAF4C72C", + "section_mic_hmac_key": "0E95D0175A99B701BD80DD3B51C02D70DE1D67FDED07F96D3870A89D995B5D27", + "section_salt": "221CA03F0091EF740A7A59E45C6A8B4B" + }, + { + "adv_header_byte": "30", + "adv_salt": "D3721817C8956FE858948C1931BCF455", + "aes_key": "E929945B8EE42B6E003C3E073189C621", + "data_elements": [], + "encoded_section": "379013036FE7F04378A9A1C2894954362311F3911000044A465A357C84AA284FC794D2668FE99004AE1D9D5ED13C9D6409BB549FE27B8814", + "identity_type": "provisioned", + "iv": "66FC1EA30719B09F2E504C0AEFE155D1", + "key_seed": "67E133E44ABB305A340F39B513135EF0353DAAFD23092784520DC9199E9D14F4", + "metadata_key": "1A031A4C41C8DBDBF482E9945F3E928A", + "section_mic_hmac_key": "5FCAD75E7446707C69045518E605986A8BB0F25A0F986648516727E5B885D78E", + "section_salt": "044A465A357C84AA284FC794D2668FE9" + }, + { + "adv_header_byte": "30", + "adv_salt": "4B352B0757FB0D8DC0AFD2AD77FC8F30", + "aes_key": "FBFE41732E1EADFADC6DB41D32E7B56D", + "data_elements": [ + { + "contents": "93E38ED62D376819", + "de_type": 571 + }, + { + "contents": "91B3ADEBDF3A97DA0A772CE21F2272BD4E1EFFA70DE4A3014EE66C", + "de_type": 921 + }, + { + "contents": "348345", + "de_type": 660 + } + ], + "encoded_section": "66901389B03B6684D250EF07E1913E8A54843B911000908608D294CFE21DCAD59E6B65063026900457E91F0F06E7F3A59FCEEDDCCCEAF0BB6FC1C31762C5FF7E60EECBD37BE8FA1CFA439D9FD3F5EC98F22B497151EFF602C8868F429469544FFACDCBBEA6056D", + "identity_type": "provisioned", + "iv": "BD6A74E891B7616A8704F0D2B5361A22", + "key_seed": "9ADEF374AE5C0763B4C81FAFACFC3FDD00BB31EC2BDABF08F72E0CC25C8F8A0B", + "metadata_key": "D925195F47F2C12E5837398262F9894B", + "section_mic_hmac_key": "D4CCE814EEB5CD71C084A1E98D5C3F1A0632DF311D665CC6F1225C1E20561B94", + "section_salt": "908608D294CFE21DCAD59E6B65063026" + }, + { + "adv_header_byte": "30", + "adv_salt": "08B9B51BCFBE04D4523BFAA17837286D", + "aes_key": "23C322B350234D1FA4023DA8FE2D381B", + "data_elements": [ + { + "contents": "57148223", + "de_type": 549 + }, + { + "contents": "ACE590C4F65B4143CF4BB7801CDD", + "de_type": 957 + }, + { + "contents": "39FD3C339EB0A86E78FC096FB33BB284", + "de_type": 22 + }, + { + "contents": "", + "de_type": 120 + }, + { + "contents": "A840D248AD83380304C9BDC1", + "de_type": 534 + } + ], + "encoded_section": "72901304935566CA4CD8AF2420D84128E1F8A891100051A5D7C9F920639AF9C89DB51DC724079001821FD769D4AAE093F00DB6744A7E61A70B1EA33D810F7F266AF3FCD2841A2177DED23CA8C60E4574DF4EFFA31C21D27E39731EB7EDB802287ED62D075FACABC42C9407F742D333A00B6F40", + "identity_type": "private", + "iv": "FFE0673572F02D6F02CB5CD380B2F345", + "key_seed": "80C545E5E6F1E3531C0FDE45C8DF59910DDAE325F822C84F4999C344E7B6E572", + "metadata_key": "A473658E9F2E4B02A48FE08F5A9A03A0", + "section_mic_hmac_key": "279DFAB67F702246B59FA57F0700ECFB97580F0D8F2EA56C621FDC55626B13A3", + "section_salt": "51A5D7C9F920639AF9C89DB51DC72407" + }, + { + "adv_header_byte": "30", + "adv_salt": "397658B7EB19939359DB8BDF7DC09977", + "aes_key": "355D838167010BFCD65619044A34AF0C", + "data_elements": [ + { + "contents": "A329FFEB42E67FA6E8C08620E087CE7E85FEFCBCA1EFAF765F", + "de_type": 885 + }, + { + "contents": "157803B1904DAED114559F0AB2", + "de_type": 480 + }, + { + "contents": "703A8005A3EC894539CAAE34", + "de_type": 354 + }, + { + "contents": "596FB5EFEB49350FC8F683C80926EED7054787", + "de_type": 187 + } + ], + "encoded_section": "889013C5BDBD074C803C8A17E3185E1BA6A571911000395E87FC0DF8B105176174C1D832DDC090044B65DD586A362858D7A824EA454FE3671CC784DF5ABC89CE611C470D04F2F44C9D474610D038A521A619F9703BBE8B0DCF18289A924A01516C63272F03524DEB885D5FD708D66D9D673C553578B27D514441ED938BC1754D94DFAE47BE20B6E2B7", + "identity_type": "provisioned", + "iv": "22D55CE5BCCD3D372782C35F5ECE49C3", + "key_seed": "DD3D65E71C5DFE02F5BD548BBBBA3F38FE8926D0CA9A50804EDA24B3EF7A2868", + "metadata_key": "888FC2EA55F320201E6252FB7DDBA66B", + "section_mic_hmac_key": "AA0724D6E22D4887021B351D9D201A618F8F303201E283F79D95AFE23DDA4CDF", + "section_salt": "395E87FC0DF8B105176174C1D832DDC0" + }, + { + "adv_header_byte": "30", + "adv_salt": "653ED3515E8811D572C1B7765DC268E9", + "aes_key": "686C0B1F2970A3CAD0E2B1209A5A5B78", + "data_elements": [ + { + "contents": "B17112", + "de_type": 147 + }, + { + "contents": "FD920FDBDAC1D5", + "de_type": 721 + }, + { + "contents": "C817A535ECD2C643341E6230F44B67C8D06F228B8EDD", + "de_type": 612 + }, + { + "contents": "B6D4633DC57509F731479DE1127117E11E333682374DFB", + "de_type": 544 + }, + { + "contents": "5321F349", + "de_type": 876 + } + ], + "encoded_section": "81901327A67FBB0CF04078320EE77A2873B8E09110007D7C2E8E278663EB6A532BC7848229B4900227C099A8BD586C51B776FB08D9D29D095070255058F840466D79C5E306488458771690C02C4AF052F3A53EFD7920D40FDAEA1354F4E5B87C375652F2DA4ECC2D744C36C74FA3380799223848829E7C594479214C31205A740524", + "identity_type": "trusted", + "iv": "263DAD92EC0DB2C39822FD26F2AD62D3", + "key_seed": "428968D9A9F686878BF560B65ECDFE3B38569FF712AF4EFC58564CD92AF3D980", + "metadata_key": "BC7405270D0F5841C3A3D3D40FE79873", + "section_mic_hmac_key": "A463136592A1F07BF2CC6D80071A290077283DB827AB456A4CDA64588019494F", + "section_salt": "7D7C2E8E278663EB6A532BC7848229B4" + }, + { + "adv_header_byte": "30", + "adv_salt": "31E689DE84F116A3C449F0B5D8A7288D", + "aes_key": "A6E2770208FAF2A476A475D770A3800C", + "data_elements": [ + { + "contents": "DFF2C917C345C09B31E08B347E588FC64DF374BA28", + "de_type": 218 + }, + { + "contents": "3484B697920F1CBC", + "de_type": 764 + }, + { + "contents": "FB57C8A58AE76571", + "de_type": 686 + }, + { + "contents": "386218D2313E3A5EA2", + "de_type": 723 + } + ], + "encoded_section": "7190132B37ADFB276B7EB4C503CECB801FA3F3911000CDC1162295B9A8A4CCA4AB56810D571A900273FB6BEA176F6DE9E6140EF7A28FAAD0A9DA45DDC9E40E4CE30B514CC388036F31BD93B0AB6F9EDC96583E089F70DEAABB3A6811E35A5463452308A5684FBDE3CA57D9CE8D9458C18606", + "identity_type": "trusted", + "iv": "3B99F43C244F3D82B2F519F26B2FD6F6", + "key_seed": "A80F5C4AC0EDDD45BD9CCE9240FFC30E4616F733172FBC34E7BF903E052A08D8", + "metadata_key": "3C7D19DC3473CE74F9629F28BD35D441", + "section_mic_hmac_key": "B9C76D0EFC21D1EA2AF1A595745B91DE11AEAE661FB727846B887C85AFC79039", + "section_salt": "CDC1162295B9A8A4CCA4AB56810D571A" + }, + { + "adv_header_byte": "30", + "adv_salt": "3A95C623FA8B0993A51FED27660FC46C", + "aes_key": "F6FEE1C8CC0D3E0E0B994591AFA98C35", + "data_elements": [ + { + "contents": "6C0370D55999B1BA966C80E76E5A3143B0A6E9D0766601", + "de_type": 508 + }, + { + "contents": "EC68D3C546", + "de_type": 542 + } + ], + "encoded_section": "599013A1EA22CB6A535194CA61B0F1D589DE5B911000D80A718BB8F999D070DC63B1FA1AB2629004697B686559499F94149621FF9F55241F4B64FFFD0A441863DFEA40E65ED5212335F948EDCB6DAA735F19776A404221BC469D", + "identity_type": "provisioned", + "iv": "D6FBED76B19AABBD88C9EA200FC3C231", + "key_seed": "8A4E313D9ED5FB9056A2A329BC4BA88A75C1BA5540496647765AC14FDD884FDA", + "metadata_key": "F3D9C6ED1DECC720D7640D5B0FA3BFCF", + "section_mic_hmac_key": "C7A6BD4AC4BF8386D2EFB23E0497F7F1C74CE0C45DDF2DF851D857F2EAC01435", + "section_salt": "D80A718BB8F999D070DC63B1FA1AB262" + }, + { + "adv_header_byte": "30", + "adv_salt": "15D51D5529B6554802E05F2B0EF4DC28", + "aes_key": "F4EFE9267FF46EDD2B41456BB04F5EEB", + "data_elements": [ + { + "contents": "7CE8", + "de_type": 187 + }, + { + "contents": "88EB094065F1E658E0B8265BC3F782C4", + "de_type": 643 + }, + { + "contents": "5720AB47DDC16762C5AA", + "de_type": 248 + }, + { + "contents": "0579EB83BD637F0CD137C57BF03F232166577572F6", + "de_type": 760 + } + ], + "encoded_section": "749013DAA2590C575668648A3B6F693BB83D6E911000A98545FD8338EC5A966F1F501EBD5316900192E54C5C045F96FE474951DDA6BFE1E45CF6CB0F1FC97E9959BDB0AC58C60B5804E852491D23E443DCD3DFEEE8EA634974AB9952BFA30DA8B11DD97C0CB154A2A32C5A5E301E28C550DC2409C3", + "identity_type": "private", + "iv": "72EC916B14A083F2E7B345730323CC8B", + "key_seed": "AF922192993E36A50CAC64F9BE2ECE249DB8B2CD256D74B729551D2F45FABAE9", + "metadata_key": "21BEA9236D94154587759956D3F73485", + "section_mic_hmac_key": "F1FCD0DE064ED425D757B87220A95FF47F6B3B9DFC12A1E8D2C31B5C37CC067F", + "section_salt": "A98545FD8338EC5A966F1F501EBD5316" + }, + { + "adv_header_byte": "30", + "adv_salt": "7EE7B0CA063CE2CC1A2DCEED5FF6714C", + "aes_key": "BDDC38B2F185FD0B4F644ED613987035", + "data_elements": [ + { + "contents": "19E3F28620", + "de_type": 502 + } + ], + "encoded_section": "3F9013528238500EB32504E2DF4B101C2D7FE4911000BC04AE42E6A53E5EB4E86672375D905C90041372637B3F4839D1CCBCEAE0B52A6572106DD6E116AA3488", + "identity_type": "provisioned", + "iv": "1600C8A4C762DF0E381EEF9244F0BCB2", + "key_seed": "503A4D71E1FAD56FE3DD7F8FEB65ACC7F116E09E19B8E7BE7EE89E46D0366B1B", + "metadata_key": "9BC9C621E4AB6A57CAA69475ABB06C4F", + "section_mic_hmac_key": "B7D4BEAEB788E9CA0445663C6EC20E21A73EDF73FC4A8DD61A948CB6C21C5CEA", + "section_salt": "BC04AE42E6A53E5EB4E86672375D905C" + }, + { + "adv_header_byte": "30", + "adv_salt": "84ECCB6CC061557F886B9245936C76D0", + "aes_key": "7F3B0C1BA0EDD583625029C096DD029A", + "data_elements": [ + { + "contents": "CA7963078A11D0A7228C6CBA3744CC798AC512FB3DD9DCFE", + "de_type": 967 + }, + { + "contents": "C7D4BCE12696450F47D9EA845672", + "de_type": 431 + }, + { + "contents": "177DB2DED349ED0EC2447742", + "de_type": 910 + } + ], + "encoded_section": "729013B836C7E8CD3614C380121EC46833E761911000FD700ECE83DE5196B3247F17E0C7B8C2900471D9B6AD99D7935EB289FEAA1BECBD93D8E91AAEBF23F71D856A1D211558A798F1593DF65C74FF1A11691490EE59F50088E778193E2B82F10B63A019F699E6276425DE74B67A6997E7A199", + "identity_type": "provisioned", + "iv": "2A30A215680833E42AF075488E76C5C6", + "key_seed": "47C165ECD9CE942B7213F794280434AF22A2BA002C5C841D3AB6D53F8AD6F3BC", + "metadata_key": "0D9AF4F93F888702495D34C8C38C9C1A", + "section_mic_hmac_key": "804B6DE7ED0C8CD36BD95E305C4E03946C8E398E2CD8E6D1D6C0D987E01897D2", + "section_salt": "FD700ECE83DE5196B3247F17E0C7B8C2" + }, + { + "adv_header_byte": "30", + "adv_salt": "C52DD0C0E31D56FCDA7804C58A6F3399", + "aes_key": "0E2385A585A2092D068EEB158B3B816C", + "data_elements": [ + { + "contents": "7A1AD7A0F081FB5E75D2AEEE6B34E40AA9C45FE2BB68C0F4", + "de_type": 552 + }, + { + "contents": "78598CA8AA45EB9D46", + "de_type": 810 + }, + { + "contents": "", + "de_type": 233 + }, + { + "contents": "30827F3E80566B78620FDBFFE3FE2D31EA2FB8AA41E7EF2FCA", + "de_type": 557 + }, + { + "contents": "7BA140F266BEB8206478BA90", + "de_type": 880 + } + ], + "encoded_section": "8C9013B90FBFD47BDC1DCFB3485BF6F2C909039110007D1B4708E6954D4C0804966FC950EB44900475C5B49C69BB677D07FC03DBE39284AFFAA42C55793F626211D1CC5907A788409D6A3CBFD4733A315BF3F2462B8C178BE54FDEDD30AA166BE53268874FD8873ABF7B2F33C42ED03E57F54B94023F17A7C6C7CE53C370513D892F41ECCAC88F501E55DFECD2", + "identity_type": "provisioned", + "iv": "2CBD7DCD77B66F17326CA3E36E31DA3E", + "key_seed": "6C7E8B7296170D5C035E8738E66032688E1392FDD96567E94592D1B001E4833B", + "metadata_key": "ABD68F6323A32F1FDB2F278439E1D526", + "section_mic_hmac_key": "9B87D3AEC1B5C3199643D8542122D7EC1C619A6241F194B04929609E8598825A", + "section_salt": "7D1B4708E6954D4C0804966FC950EB44" + }, + { + "adv_header_byte": "30", + "adv_salt": "835DD484D2FB9B6ECA4A3EEC6067A7F6", + "aes_key": "2DA3CA25BB833993F56C8A66D16ED327", + "data_elements": [ + { + "contents": "C44E2A5E5625A6", + "de_type": 860 + }, + { + "contents": "2134F33D2359D4F288D3A7977D0C8001EA2B4EEC98BC93DE27F9DE0FA7", + "de_type": 523 + }, + { + "contents": "993DA1984ABC29C3B21A11F03125", + "de_type": 683 + }, + { + "contents": "C1ACD752F8FD5786645E11DEAAA13BCE", + "de_type": 865 + }, + { + "contents": "341BAA9E743EA09FEC2E9282EA6B132D48309B8DD7F1F946AE68EFD43028", + "de_type": 613 + } + ], + "encoded_section": "A690132E3DED612DE97EF7F9A44BE590A63D2B91100032FB76369CEB20CA101F1007ECE8694A900403BBD86CE0A9D8F2188B771C6025C47E9B3B31DF6640F8254189CC17F45B61470F01CEF3C0F22720B9ED4EAC50100F4015DD4049B640741067959EFCA41ACA09A216E34BF48DB9377CBF1EA080665151195475CC8FEA2CCB1BCA845314547E3540C1184B0D27C59BD76642114F823391E1358A05FF9817F31C19125F1C5DFF", + "identity_type": "provisioned", + "iv": "1C0CFBCAD7A73BE78ACEEC5AD98A6506", + "key_seed": "10E128D39BF362EC6FFD8E8E1686E0BDD731892BC2A40524346E46905AB097AF", + "metadata_key": "EFB6BBA329C8523F0D9593F267ADCFE3", + "section_mic_hmac_key": "19B833BD8554B60C5A689185D7E087A08B15186B42AEDFDCE2238A7BBC3A120A", + "section_salt": "32FB76369CEB20CA101F1007ECE8694A" + }, + { + "adv_header_byte": "30", + "adv_salt": "771BE78E465BE4E1C94ACB5E4B4ED943", + "aes_key": "52956780EC21E2BAF2C9BF59C7C03E3A", + "data_elements": [ + { + "contents": "3369A56AD364F5A53D4790B0C56E920F79", + "de_type": 743 + }, + { + "contents": "7C7FA8A3BB5B8239EB0AF0D3BF", + "de_type": 344 + }, + { + "contents": "0CE02F21FF72540ED4351A6F04276489D0BCCB", + "de_type": 649 + } + ], + "encoded_section": "71901301F306AEF69B7E55C7198404150FD74491100042AFBE3BB7529B6CE1957A34DD897301900416173A7AD7E611475C2FBE369D84DF2C53203A301A4CD74CE4B1C52BA023FB02B145DB1BDA8040E38F09290D173FA538917FDED3CDDA945A215A954B9B627FF1C724F32B958044C7AD01", + "identity_type": "provisioned", + "iv": "104F4E9AE0F9B86C604E225E535AED28", + "key_seed": "E36C5E16253B098CF1A878723BC88CAE483B7CE4F075210834DF5F4232B3D721", + "metadata_key": "506A4A3A85045F7ABCB2AC0D381C86EA", + "section_mic_hmac_key": "F79D72CE2DA34D0B002EBD4CEFC93DE588B78E3D252E44D9F154EDB987BCF86D", + "section_salt": "42AFBE3BB7529B6CE1957A34DD897301" + }, + { + "adv_header_byte": "30", + "adv_salt": "C8E0431CA117B1831BB6671CA7AA07EF", + "aes_key": "E7AA3598705D6B36C70661E4AAEFC72B", + "data_elements": [ + { + "contents": "E50F0C47F610A27F273715EFD96E61AFC41F07F2", + "de_type": 424 + }, + { + "contents": "EA8A291C59E1", + "de_type": 432 + } + ], + "encoded_section": "5790136D1DDE2484AA68F62E5BE1167BFFEF169110009500FA6CDDCD547D0BEDA1D6AFC6F04090024468565BA0402401B76CF55C729B5FE569695A820992D12CE45A465092D826C730310E13D9F8EC5D7D5717DA77C6CF46", + "identity_type": "trusted", + "iv": "71D6A3CAE2740361D9ABA1066E7330F8", + "key_seed": "DD5E65D75F8C056BFDA78D3EECFD5A42A9397ED1F0BB12378D085F0B70F8750F", + "metadata_key": "6C92FE3FDA57C9A3553A09FA5B37D77B", + "section_mic_hmac_key": "71C6651A3B4956C3C5782D13E4FE870B4D5492C3CE9BEE8374F1D5298147D14F", + "section_salt": "9500FA6CDDCD547D0BEDA1D6AFC6F040" + }, + { + "adv_header_byte": "30", + "adv_salt": "09371C9C7EAF87C2E11BFA366EB616AF", + "aes_key": "84BEEAF36C24AA0C83C825E4BE3F10A3", + "data_elements": [ + { + "contents": "4281AE866AE1A0745A5E6C3842", + "de_type": 254 + }, + { + "contents": "637873B552AB893BBE8CBFFA65E859CB95F2", + "de_type": 935 + }, + { + "contents": "F0AC06ACF732D6E74DBA2367CE64432210F0C03A9C1093", + "de_type": 950 + } + ], + "encoded_section": "769013BCFA668DEBAAEEFE66D7CB5AFF0DDBC5911000178E6852E46CE22115DEAC0CBE53D4A8900479D4969091D3685CE787E51C0B7BAE37FBCA6A67BA8CB03A1BB9D1A08E0D7E6365AB4AE42CC2E445E6E302A7C1BCF28E69ECE32FFADD69F0BD5EA0297DB7241022BFFFF7746884B4A7A55FE41E2A50", + "identity_type": "provisioned", + "iv": "972F1E1A54C9BF5A318CD2F381001A0F", + "key_seed": "20054A2AD5787C8190261524586AC1317AB9A939D775FC8A5559736F67F8EDC3", + "metadata_key": "29A2753D8D2D165B52677B4478E148BC", + "section_mic_hmac_key": "0F498B4B84396C4E4BBD8EA8AC04D100CFD0993AAF4630865665155399FD7CE9", + "section_salt": "178E6852E46CE22115DEAC0CBE53D4A8" + }, + { + "adv_header_byte": "30", + "adv_salt": "312B34C1F8D62CEF39CC22C6718F2AB7", + "aes_key": "1393D21C5EE04A4ADFB2A154F1BC0CE7", + "data_elements": [ + { + "contents": "897F9A471F5A3E7ED36837AC9911A40B3546DCCA1FD9DE7874ADC67A", + "de_type": 852 + }, + { + "contents": "4DF6900031FFFCE8F2E54A3AA4337FF095D50D25B677AC204B57", + "de_type": 813 + }, + { + "contents": "850EB9276E6B8A933DD66B44F18F2CA5", + "de_type": 44 + }, + { + "contents": "E814D95425E1DDC645357D54D569E223CE74", + "de_type": 822 + }, + { + "contents": "CD7697BDE298D3F2C6", + "de_type": 97 + } + ], + "encoded_section": "A590135059149E5A7168D5647488D33E4C5D1291100043760DEB67DD337023E74D8057F8D0B190015EEC17F40A65777B5FD8DFD42A41610D7405BE1ADA0FEC3FF9582ACFA1BADA3027626CC70E0975642DC341B332E735BA412C8C217BC425C11B515077701A5384F7E66F54AF4137938CA1F8BF584C54AEA4FEC7A508FCDE1F7F045182F31C1DC9A486DB90340F79ED72F39D26D658C766AA4A149387CCAE407EC5013B7A61", + "identity_type": "private", + "iv": "CE7902AEF1D998C6ED70A23CAD78AEE8", + "key_seed": "9B2B2B4455F675F8BFD7D6EF0D11DB025DCA56B8FDCC3F91E381A5F588F2AEBD", + "metadata_key": "AC5D5DFCB4B394A76C768472CE1C4DB7", + "section_mic_hmac_key": "A42A8C6554F3CE2FA45E52702A152F0B5AC825789727105DD723478778B410D6", + "section_salt": "43760DEB67DD337023E74D8057F8D0B1" + }, + { + "adv_header_byte": "30", + "adv_salt": "1E2C19C423EA98927CE4F1FFD50DE67E", + "aes_key": "36C1EC0F045707BE7FB3744C95E33F09", + "data_elements": [ + { + "contents": "9427449425", + "de_type": 409 + }, + { + "contents": "FA4CC2EE4D6A", + "de_type": 341 + }, + { + "contents": "CEA2CA161176B4C3B33134476EF837EF32B5D278660CDE48E6B03C81F17F", + "de_type": 102 + } + ], + "encoded_section": "68901308621A6F1E729548386EEE826FB947109110003A5233398F5D3BE64AE007254529830690022A40871AEDE5A3A73C83A9E5220F800AF29C2D8CC34A6EE29734B811823BBB805D32FE9C34BD588DE52C3C9B5FFDF5722DCD625D10AA0B72943A2BB61BFF5E5109", + "identity_type": "trusted", + "iv": "FCE402A294C3AE2A8D0F94417F0A990C", + "key_seed": "E4DA5C79DB8653F6C010ACEC3D8D3A728690FCAE87811AB4B442CF8888597E7D", + "metadata_key": "140A593CCC7E365D5E08D7B30ACE7B1C", + "section_mic_hmac_key": "410D6C692C1A6E677B21261AC4EE2D61087FE874265E1A23BD3996208779682A", + "section_salt": "3A5233398F5D3BE64AE0072545298306" + }, + { + "adv_header_byte": "30", + "adv_salt": "88E66F0BCB2F75310F193D23254ABE27", + "aes_key": "3BC020A4C2A62B57BF29E29668DB8E5C", + "data_elements": [ + { + "contents": "B7", + "de_type": 727 + }, + { + "contents": "A75A29", + "de_type": 909 + }, + { + "contents": "8DD038868341", + "de_type": 505 + } + ], + "encoded_section": "4A901365F4100A29450DCA93B0632DA7DABEA79110008CD04A9DF97342A29F966C6BAFC2A962900112DF363FE2D500C29E75E28E5D7831F485B3CF426A87B4BA74379063395A62240A0F5D", + "identity_type": "private", + "iv": "28152DA95BB94508449CD3C229459A76", + "key_seed": "A03E79B5DC16D85A779CB85A0771817415A6DF256701B261C1ACCD6B4D5CD2D6", + "metadata_key": "3FAB498CA08113604E40C3D5F393006C", + "section_mic_hmac_key": "3F13BE4FDECBFFDED1AE34D92642C7CEF5C406B877DE00B647EE908C12E6A95E", + "section_salt": "8CD04A9DF97342A29F966C6BAFC2A962" + }, + { + "adv_header_byte": "30", + "adv_salt": "AEE14DB3ADD86B7B5DF9484C853A3781", + "aes_key": "8B112E04E5BD800D5169E31665A707A9", + "data_elements": [ + { + "contents": "C01854F342050239D5A83BC58D8BCC107B", + "de_type": 364 + }, + { + "contents": "B06F3F2E6DCE4B0C488F1FBA9A3E09FAC662", + "de_type": 793 + }, + { + "contents": "A516FB2431DB05EBF5514F03650339568203BFD3FD5844765D3BA41A", + "de_type": 57 + }, + { + "contents": "0321515318EC9D9071445D0600A67EF2971E", + "de_type": 688 + } + ], + "encoded_section": "939013ABCA1090D779D697AC56F3591EFF812E91100042E5D94F3697DAE433EB544B01407F509002E58E223728C742FE9FDDDFC05278550FBD564FA0520DF322B90B6F2C18C3E281896D409BF9CFDBE0306DAB483B407019ABAD11FB0B52420CA2CF238C20C05A31ACCF6911C5E2C3488705144CA481B31672D7BF316EF49CB3D88BEA3115DFBE71B69EE065D12039CE5166C9FC", + "identity_type": "trusted", + "iv": "3BB0C86F4784D62474D2310BB337A09F", + "key_seed": "EDAA78185A1A5175083E82BCEC82F099C8331C5C132E9719C5CFD92154857279", + "metadata_key": "7FC7DF905655640A265CE4249EF2343C", + "section_mic_hmac_key": "FD55BD1DF6A3A7B11CE1F6CD6F54B5D5F467908CA565EE5EF51D8E87DAD23F3E", + "section_salt": "42E5D94F3697DAE433EB544B01407F50" + }, + { + "adv_header_byte": "30", + "adv_salt": "B7611E4DB66970C64C508B012B19D038", + "aes_key": "2AB8E62B732603133EFE0A777862A3B8", + "data_elements": [], + "encoded_section": "3790134C043B652FC7D9BB7E47E7C074C00E9A9110003B975A14294937B99D71E213A16D49749002D1804746ED376A0B7412BA53650D6F5E", + "identity_type": "trusted", + "iv": "896CA16D40C2FE9EF467463B781B2D30", + "key_seed": "C8CC1B103276D084459C1C0ACF7EB4E360F9E700891FED6676E6D1075B19A369", + "metadata_key": "141C175A69BC895A7B2F6DEED99F036C", + "section_mic_hmac_key": "D3219E1AB65611823B84767FF42E79D91D19EACC7C057CE11954FF13B1E1876F", + "section_salt": "3B975A14294937B99D71E213A16D4974" + }, + { + "adv_header_byte": "30", + "adv_salt": "3647592C7FBDF648CD7EDB024F33BD04", + "aes_key": "3A1A12B6FACDF29899EE462AEBA9B344", + "data_elements": [ + { + "contents": "88A9B2A6", + "de_type": 712 + } + ], + "encoded_section": "3E90137DA38E03A36C9F9176947F63FB67C12491100062620E36B963B4DE09225791E16F486690016BB6BB370C97BE4450674D73D9130B348323C380B88DC8", + "identity_type": "private", + "iv": "1BC76C617AFC378D7A296ABA4757EA3F", + "key_seed": "C61557026D3D253A85F7AC194BAE74A1E761F59DAD126F47136E993CF2F5B6DE", + "metadata_key": "D0ABA18228B34F9AF59D7248CC844111", + "section_mic_hmac_key": "8FC4925A00CBF30B6ACB61EE98B832AEEBB03CE0ADDBEB4D989FAC453FF32F15", + "section_salt": "62620E36B963B4DE09225791E16F4866" + }, + { + "adv_header_byte": "30", + "adv_salt": "40952DC0D221AE688E3E7162C0923F0C", + "aes_key": "19B5C1C6D9E48CC519A20E81D5D63604", + "data_elements": [], + "encoded_section": "379013E18D5027806A73D9048564062FA8098991100014034FE308AA953FDA2D86F85CCCEA57900257D1F879E535C6C429BC4A2BE220EE7E", + "identity_type": "trusted", + "iv": "BEA9A319D926C16A93C7C563D3A4725B", + "key_seed": "F701D04F3AB67A553F3F007677AE499E1F573CC2AC9219EC6386AC9C001A55B7", + "metadata_key": "758A0996ABFD4059E79623EEE974A91D", + "section_mic_hmac_key": "B2C8BB02DF87BBEACA0088A3DD4B94036C80788AFE9D7BCCCEEF03265C97B824", + "section_salt": "14034FE308AA953FDA2D86F85CCCEA57" + }, + { + "adv_header_byte": "30", + "adv_salt": "756FDFECA95A8AD628CC57BB41E734AC", + "aes_key": "94D6D7BB94A5503D75AEF2C51C940589", + "data_elements": [], + "encoded_section": "37901353D770C75B341EB54A72DE3DD4D0CC899110003B7992CACB34F3A9C66283E73D212F1D9001E853DD8ED1E580D63FAF80B4FB4F620B", + "identity_type": "private", + "iv": "8121921E27A4466509E573B3255F16CB", + "key_seed": "A14520D1E0ADBEA8EDBD90360368C3B198C604A2340EF83FEA134721D6C79613", + "metadata_key": "7AE0BBF927B2590C49791320A4325B68", + "section_mic_hmac_key": "D5727682C5055A4090FAE17716DF6B0B0E321019C4D0809E8200850A4CBF458B", + "section_salt": "3B7992CACB34F3A9C66283E73D212F1D" + }, + { + "adv_header_byte": "30", + "adv_salt": "82B7393BD43AE40BB06D1A3A2823133D", + "aes_key": "469CBADC1BB8023F1BA0DA05A9310B22", + "data_elements": [ + { + "contents": "40A863DCCD4054C96E", + "de_type": 667 + } + ], + "encoded_section": "439013C0F02349BBB2FDECE00F7C9296899417911000EF4B9DE242CE6D6AB6DA0B896C786F389002B25529FA48ADEF1CE9AFD454048A8390B4713EE35D5B6314919CD64D", + "identity_type": "trusted", + "iv": "D7DE8E7D886512AD0339056C7CC54C62", + "key_seed": "BD980624836660BA2C0982812F6F23078802E982DCEA461EE94BD4E8922BC8B5", + "metadata_key": "060B8DD7D93EFDDCE3FA26ABE785B9E0", + "section_mic_hmac_key": "BE821CA0FD33D9E57C3BCE1371AC54A6DC461EA194D0910EA9B38691F76434E2", + "section_salt": "EF4B9DE242CE6D6AB6DA0B896C786F38" + }, + { + "adv_header_byte": "30", + "adv_salt": "E4160F1914D232240945FBF05EC8DA4D", + "aes_key": "673A79D26DA0EEBFC56E507EDB61F814", + "data_elements": [ + { + "contents": "BC315F251FB68CF65A3663343CA7", + "de_type": 562 + }, + { + "contents": "DE7CC83BD90D587EE41E2EBEFEB39E85BCCB1B876DE2A3ED7B9CD046", + "de_type": 259 + } + ], + "encoded_section": "679013B3FABC50AFB0E2CC60D03D341293DFFE9110000AB560F9226EAE8DFF4EDA62A661E9819004946BD0DE5F133F9AFA422180C709FF504E166A3FF94760F24B0248E830D4E848058AF863E9F4296908B3F1061FC8668480676FDA3DCDCCDD5B6C11A9AAB632B5", + "identity_type": "provisioned", + "iv": "3DC82BB10A656986B8EE35FCC6C4D681", + "key_seed": "DD867E8AAA962AEAD05B0A027C1D0BF098AC2B5A9BB81F6629A09A3DB6DF77A9", + "metadata_key": "EBED6F7F0D41A90BCFFD07DC38AD4E7F", + "section_mic_hmac_key": "52835EE8B0354CC1819B4543F5216BDB806D6202C824FF1BA2B1EAEAEF7B667F", + "section_salt": "0AB560F9226EAE8DFF4EDA62A661E981" + }, + { + "adv_header_byte": "30", + "adv_salt": "23EC2882AE29D794E00F3C929ED4EE82", + "aes_key": "21B174B8C2B2C1C32A151FFB3BEE8682", + "data_elements": [], + "encoded_section": "3790137AE67F61984C37A01FB8B94165B8EB269110002A37AE16791BE17CF76D244E7714E43190024E181B5BBB9F5FB00E6A774D12FD3C00", + "identity_type": "trusted", + "iv": "A9BF6682AABD317E8A06D867766A652D", + "key_seed": "A9804B5A70F86AC25E6D501C3CE9EB2E2125DEEAB3AD5D05F0BEEDB0B70F8E89", + "metadata_key": "640AE8DF2C5FD30430D67174765B5D9C", + "section_mic_hmac_key": "33C747147E7BF5C0E36AF6EA7071655381568471DAFA92ABEBE4C78677219216", + "section_salt": "2A37AE16791BE17CF76D244E7714E431" + }, + { + "adv_header_byte": "30", + "adv_salt": "BCF6CA8BA694336C8555B15D6E06F5AE", + "aes_key": "18375E93FA4431A762A9B737D2336ED5", + "data_elements": [ + { + "contents": "A84F3A8B3FC540FD359F5DBBC001EF57", + "de_type": 462 + }, + { + "contents": "75029C04F876937EF2CF8BE2BB09B1241CFFB0A631DE263E", + "de_type": 960 + }, + { + "contents": "7A26076DF65B13D39494", + "de_type": 555 + }, + { + "contents": "BD1C", + "de_type": 307 + }, + { + "contents": "DF3E8C", + "de_type": 513 + } + ], + "encoded_section": "7D9013BA96BEE6CEC0F79A25B8BAEB823DA45B911000F11199E929FB5DE7474EC679FE4B5A4E90022C2DA6326BC23D58AA4E77AE3ABF66A8B261E4E78FF193835D2B9A5F3AC971BE4949847D170429A80B5D763F7D136E9063D7F40A75AABD4F956710B6D5EA391C631FEF5310261634D6578A6A7F7184508FE7CF52E224", + "identity_type": "trusted", + "iv": "0CA6D1FB7354E9E4CEF190EB8ED327C9", + "key_seed": "ED623407DB6E29C91192E1EDE3B83BF57EEECFE10EA5E2547C59F31F836634B2", + "metadata_key": "A6DD5533AE1DE0719410FABB85400660", + "section_mic_hmac_key": "B34016F96945E2AFA191598597EA58E6D5F5AE9EF8158B45AD50F60EF436C732", + "section_salt": "F11199E929FB5DE7474EC679FE4B5A4E" + }, + { + "adv_header_byte": "30", + "adv_salt": "DDCCACFAD9051E1B99C43C413148B0EE", + "aes_key": "E247320C16C197987CA928AD87BA1030", + "data_elements": [ + { + "contents": "", + "de_type": 720 + } + ], + "encoded_section": "3A9013BCFE98BDFD2205C5C668EED3FFB8E672911000DDBE757080D8CA7B65921FC3A638646190046065B7703FFC69AF2E14B00D90BAE51F9111E6", + "identity_type": "provisioned", + "iv": "BCD763E963B259C4E19C8A6F62F05810", + "key_seed": "406F13FCBECBF6E301208FC9C4AFBE541728D2241C987C38D7DE961A95874752", + "metadata_key": "FB990D13C3D0EBE79AF30E19B6262D66", + "section_mic_hmac_key": "D441BE8D9C7952F3B60B023069D64BF2397257FC8FEC7A2BBC090CB2646238C9", + "section_salt": "DDBE757080D8CA7B65921FC3A6386461" + }, + { + "adv_header_byte": "30", + "adv_salt": "FAD923151B5EE843B58C5E02C8636EDE", + "aes_key": "D6353A97771C8967BCA9F7AE4884DAC9", + "data_elements": [ + { + "contents": "DE7E13DAB250CEC845BABCD1", + "de_type": 860 + }, + { + "contents": "6531B82D346C3AFD2D276FA5E02E2A93", + "de_type": 274 + } + ], + "encoded_section": "5990134AC7CD530495F2BAFB85AC93EC6F012B911000438C5B3D5AC51F66F6C683C9ACDD401D9002AC396666585E471439C0A5EF4DC05AF49B9600A96284D58D2C72807902769EBBCD923F31743ABB3F7440C3AD394CC436244B", + "identity_type": "trusted", + "iv": "30D9DC82B1A62B353A8B52CA627211A0", + "key_seed": "77524ED887D0A9A1A96782470380EF5672938C21EC13CC43658246E6520D3D75", + "metadata_key": "76EA680B23CE5062373D8F0AC9FB0912", + "section_mic_hmac_key": "A83C77A67D7CD424BB55C400C3F12E4FB47F6602FE03F0ED8A1E2DF1A311D1F6", + "section_salt": "438C5B3D5AC51F66F6C683C9ACDD401D" + }, + { + "adv_header_byte": "30", + "adv_salt": "A5EBA3EC2EDC3DD714C2EB3288F5E142", + "aes_key": "CE45D560B190E915974255CA1378211D", + "data_elements": [ + { + "contents": "80677B0D8386DC", + "de_type": 102 + } + ], + "encoded_section": "4090133665BFF6F114B04DCD82E3E6627CEB879110003295E996819A16214D393D240335FD779002F049668CE0B95A53D2EB885B92DB5BBC901C37F3C5F350C0C9", + "identity_type": "trusted", + "iv": "D9E137F6608666AF35D69A5EBEEE38E1", + "key_seed": "F33CB9D14DD2597AD7D68D0A4F7BC85C4F32D2B7F4EE7227DABFF6FC5FDAD466", + "metadata_key": "AD9CC4271E2075FB353A9CB5DCD07162", + "section_mic_hmac_key": "0D0174A3186C8CF1D9A57AFAAECB8B284D7E08E82ACCF3AF6C39F0A27199B496", + "section_salt": "3295E996819A16214D393D240335FD77" + }, + { + "adv_header_byte": "30", + "adv_salt": "1AC1B2E96E974AEFAE2BD3E1CE81AAD6", + "aes_key": "BA47EF9390032854FC6FAB604892F729", + "data_elements": [ + { + "contents": "E6063E542EED02F65B9B7BC296A3F78D", + "de_type": 413 + }, + { + "contents": "A5D1", + "de_type": 969 + }, + { + "contents": "7ADCCC9D04EE88E04EACCBEBB555CBC4A2479E1425656DC017568B74DA", + "de_type": 919 + }, + { + "contents": "2F0BDAD9E57D070C4667F38E193B", + "de_type": 949 + }, + { + "contents": "8CF202B2A335336F0A5F2589FDC3CCB21E46658B549A787021", + "de_type": 618 + } + ], + "encoded_section": "9C90135BB284FDF4C800B87360099389CDDB9B911000BA4FBB4D16C95F10913371D7DCE9D3E390020CE61C619DB74977497E427B1C0E9CD9F9D3581D42AE5D15081AB1494E46914E962366A6FADD9C79CC4C64BD0B3E7A83011385919B57F8C04E17CC46D31EB470B7580195A2608C816EA4D5D34296AFD1CF3DB51A99327E8420F15A73539B451D7A7BD9915F56D2D9CBB7684C07146564B6E24B5CBF", + "identity_type": "trusted", + "iv": "42F6C7EF706340A72B05C5C6A99E316C", + "key_seed": "B04216F33F8E756F288B27E645564265383CC9335CFBFF47F439629236A697F3", + "metadata_key": "A1FCFBA76475B80E589617C587806CC1", + "section_mic_hmac_key": "1C62F6D1D011A26040C16859D31494E66A00896B20C852B3FCA34B065DFD48C1", + "section_salt": "BA4FBB4D16C95F10913371D7DCE9D3E3" + }, + { + "adv_header_byte": "30", + "adv_salt": "89BF5E643860DA08F54E99325545E0E3", + "aes_key": "B6EBB7A5B193254333D9EBA863ECDC2A", + "data_elements": [ + { + "contents": "7A10F256CC3DF91E78DF65B24F052339E8C81DEE572D96C4", + "de_type": 833 + }, + { + "contents": "A15E536C45941AD26F38EE81E50E6F5C54C5DFFA12BEE0E3D25E8CC5CF", + "de_type": 607 + }, + { + "contents": "12CE431D2ED376FD594A80943044EA856C642D11DC0F2D9450", + "de_type": 31 + } + ], + "encoded_section": "8D90139DB6F3EB17792669F56F53FA03DE87C09110003AD9600CE15FC3CE465D0228FC8CCE769001CBA6140B22FB73FB1B0E4F8950351659BD43415DC971F0FA325B81986C47A74F3FB2CB7E7374C278ACE925EBF2B7067F8E6488C4CC57BA6AEB832C8B1B4D9A002C8870DFB147033F652EF25CCF19D8D59727EA6BF61A0B52D489106BD21BF8788EBB015E1465", + "identity_type": "private", + "iv": "AEF47384658A554A58363D62F7DB13CF", + "key_seed": "056214B06D0378EBC92E13F6C5EB0FAD7564243DD2317D66CA38C340BE54BB4F", + "metadata_key": "813ED8A5314A2505023A99227D91A6A9", + "section_mic_hmac_key": "618FDE5AEB4E190D45EFF78AB4BF2DE14BA35855973E688853E749A69E3A47FE", + "section_salt": "3AD9600CE15FC3CE465D0228FC8CCE76" + }, + { + "adv_header_byte": "30", + "adv_salt": "5D5F06D37BE24A3EAEDC3F746FF4E579", + "aes_key": "E713EE216EDE341FE268F6237725F725", + "data_elements": [ + { + "contents": "FB504B451A1F0820FE29A2FA", + "de_type": 164 + } + ], + "encoded_section": "4690137FD2067B6E15D4CC6AB3E34A8295F66F911000E9A8A1CB24E1555E9EF384F4124C6BE29004A963964B7D5921A4FB27CD39CC194268B8CF554ED279FCA799130371519A31", + "identity_type": "provisioned", + "iv": "13C7A35EAACE574E2EAF7A13B0A6A32B", + "key_seed": "22A1BCD9F24ECC0BC71F4525D8E531EE7A5E40BAE308C43DA07F034C883C8396", + "metadata_key": "E6A03218FDE3E27FD782B86E176647BD", + "section_mic_hmac_key": "C0FB0F118A976D4B19E95AEE65EA88359C9F071CDB15ACBED9211A5B1EAF958C", + "section_salt": "E9A8A1CB24E1555E9EF384F4124C6BE2" + }, + { + "adv_header_byte": "30", + "adv_salt": "95B989A608C0D6967B551F8C7CA6EBE3", + "aes_key": "0B231EEBD178E593D7F473D51406B900", + "data_elements": [ + { + "contents": "36520A4632FCCBDE9AD34A32301A30B2439AB22E330AA7A18C3A61", + "de_type": 275 + }, + { + "contents": "5B2B4C836A013A651571B13DB670155FB746325B8F", + "de_type": 620 + }, + { + "contents": "DEF0BBB8C8B205", + "de_type": 41 + }, + { + "contents": "1B5CCECF35D720A442BB0AE56E1E91D5EE0CF2BDF5DD6240", + "de_type": 719 + }, + { + "contents": "6BEADE80570A85CC0D95AAB0E3DD76DC2A8123DC48D395380C", + "de_type": 789 + } + ], + "encoded_section": "AD901306AE4285463C53926B1BD6FADF6E1C5691100045E4F8E6A509CEB6F9A49BE5A9B9C20C90011A4BB20D968C614C735D4923F5CAEBC4CB1C56FC8F02B3319B998A5069B4ED1BE73891C3F7D0A6F4211183456B571768FCB52280F32D2D9BF903D21EB5B98781A86FD0548F68A78703F17E0C2929BEA276A85041F8B8EA24B9D6E7D6A627A49812349B564141338E2B3C207B17EF8729E4A3E3A0079D08F33A7B34CC1499CC47A5D460CA1DBB", + "identity_type": "private", + "iv": "AFC59E49ECE5A97EF0FAEACE62660170", + "key_seed": "17FD257E62CE7BC878DA16C5043579B98F79732B0B817B4F2EC51738CB77527E", + "metadata_key": "3186CBA7D7424D1B8B47B2897F11732E", + "section_mic_hmac_key": "2594DDF724498B52B29F3DFD0CCA6283C3403310AFC8E4EF37FC475E30367BD0", + "section_salt": "45E4F8E6A509CEB6F9A49BE5A9B9C20C" + }, + { + "adv_header_byte": "30", + "adv_salt": "EBEC6D0EF372E4BBFD8A88C319852FFC", + "aes_key": "AAB99254BC7CFFE24CB438DF3C727AD1", + "data_elements": [ + { + "contents": "", + "de_type": 432 + } + ], + "encoded_section": "3A901307CC248287D8A88DB671E1586D3FB9CC9110002CC36DDB7D7A279AEAE122BA13AA019990046C51B7CFA17821450A90C98A7B38BD5DBE4FBC", + "identity_type": "provisioned", + "iv": "685AD69EF191E56EF06D7C86714348D9", + "key_seed": "5F065E34B94CD90CC221ACED8910D641D4FC4C6F56934780189E4E6E67DA4901", + "metadata_key": "A592DE8232D18AE8E195363D4B6CD07A", + "section_mic_hmac_key": "0264B54BB116AB3514B39B737B87ABEE206F8CD594CBB3E9B24648C5F53E635F", + "section_salt": "2CC36DDB7D7A279AEAE122BA13AA0199" + }, + { + "adv_header_byte": "30", + "adv_salt": "94DD0021538CC04AA70A5F77125BE600", + "aes_key": "F0C472163938A1BD47B15B942FAFC48B", + "data_elements": [ + { + "contents": "A00EFC0F33C01F0AAC4F5DC6541F53C8CA5B34", + "de_type": 481 + }, + { + "contents": "B12B24", + "de_type": 630 + }, + { + "contents": "81319ED0F5EE75A123443AAA795D81B9278993C6BF", + "de_type": 503 + }, + { + "contents": "8224C14BE4C7CCF408C4E3", + "de_type": 435 + }, + { + "contents": "681B900D27F4699C820155209DAE07AD857DE896C037DC49876E1E", + "de_type": 951 + } + ], + "encoded_section": "979013E5CA4E440ED0EB31935166AF13C4256A9110001ED58C6BF2B47B9556A5D909E29A7AB49002DC33B008D4CF57AC179104B3F5DDABE7D56D19EAEF9BA28100DE838F8D6B98CD2CF81FF9BA53847382E6F71E502F127A858FEBB8AE77D0A504D685DCD638CB167B60DA02ADCE29E3F57BEA20F1113C7718CED429E7A813E03208194C0C99421F55D22265B201A2D80FFB254F5FD619F1", + "identity_type": "trusted", + "iv": "807C9838F5A3DF8073FDFBAC74766862", + "key_seed": "ECA0F4886F264A9CFE0BD7255F6FA88B64AEE99627DD204D4100523CCD96A354", + "metadata_key": "8344533765DC97CD1FF2B037CABBD8D8", + "section_mic_hmac_key": "F0D7ABF7AC2B3A3945209EF72944671D98A4EBD63BF94CDE96EE2D364699342A", + "section_salt": "1ED58C6BF2B47B9556A5D909E29A7AB4" + }, + { + "adv_header_byte": "30", + "adv_salt": "C112DEFB7B31A43E9EA8571DBA1CCAB4", + "aes_key": "383D18B559037EE81B05F2A3A636A6EB", + "data_elements": [ + { + "contents": "27C28C2FF32016A4829B967FDDEC6CC7C0B5BFF5EB412D4899BC2C4A754D", + "de_type": 382 + }, + { + "contents": "4650A741B70621E3D576483481C56AA21F9C", + "de_type": 310 + } + ], + "encoded_section": "6D90136D9098A3888E98C30DA05CCF9EC57EA6911000FBB0F01A46FADCBB680D50359653C27490017AA7C1CE5BBC717C0A1D0003F112B244703260E60034777FAB79B3B9CAB5A5E8E2A955F11A4CD50FF0D7D1FB7F8E17944795C73E8A24161A13FB2F578F549A82B2822D63668E", + "identity_type": "private", + "iv": "B87F931962984B01923EA47FD3193409", + "key_seed": "A9A9F32E48740489BAC39106C497D0350B42C553BFFAEE0A88D67B4A5B424D5D", + "metadata_key": "745B81AF3E8CC9B2FA7203A71AFEA41A", + "section_mic_hmac_key": "0AD484AD1377BC263AB10E7FD0990D6AF7A9F70BC9CEA564EE60913EFFBB13F4", + "section_salt": "FBB0F01A46FADCBB680D50359653C274" + }, + { + "adv_header_byte": "30", + "adv_salt": "8F20FB3600592D6EAAF2F1E74BD0CEB0", + "aes_key": "F9A37408AD4AB15C048209D298BF9C3B", + "data_elements": [ + { + "contents": "348A6AC7D6951E86456352AE6DC70519FBC5", + "de_type": 869 + }, + { + "contents": "07BFAD354EEEABB377E35A3CA9F93C2919D63A5F60F47E9A6E6452", + "de_type": 379 + } + ], + "encoded_section": "6A9013F3CCF8ADF413726CF270C2464A7D6D0A91100075FB92C2BDB77630B96A7871350B3CCA90018B5CB809F8B85ADB3582601C38071C20A3D7C776D0FDEA4E4386B23278FF5C05EF39173B35ED5E64B5E63F5299971353BB80A3E88226FDE3610113FAE3650A87EF3BE8", + "identity_type": "private", + "iv": "F48F1E40820CDCF7DB3E6107C448A32B", + "key_seed": "771A683FBB41544543E3000270F62B0E75BE97DE1E8931A5B0E30874A315B40C", + "metadata_key": "CDBA3FBDB8051258774E18B2A19647A9", + "section_mic_hmac_key": "58F7FF2CB350E0FEE347D0DD9DB0A50D1074F737E04E34351E5D897545149F01", + "section_salt": "75FB92C2BDB77630B96A7871350B3CCA" + }, + { + "adv_header_byte": "30", + "adv_salt": "0718AFF8D3F260798EF3336D840814F9", + "aes_key": "1978A74AB0D377A6443E38504531BEA4", + "data_elements": [], + "encoded_section": "379013792A0670A6E601F9061A049EDD5E34FF911000B179453D2FB79CF56E8A31CFA8B15A389001BBE562860A2039D0152A0496133E865B", + "identity_type": "private", + "iv": "167401B2B2AD0240F0E57038F262961B", + "key_seed": "003D1A9D017396CD95C9138D152B44E500408A013CC2E3E50B0D01B2E9CD80BD", + "metadata_key": "77C3866FBD457BE09D29A90CE12E1689", + "section_mic_hmac_key": "B3A6886A924FE33D724385D45E5FE158AD66370D2791BA5DC553D5E66327001D", + "section_salt": "B179453D2FB79CF56E8A31CFA8B15A38" + }, + { + "adv_header_byte": "30", + "adv_salt": "21E532A86E771C51558095090F8AB251", + "aes_key": "68075EA0842A1D448F7B244E5FC6B29D", + "data_elements": [], + "encoded_section": "3790133308F2B9AB4434656EC8305913A01C089110001708C5DD384808FF64D2BA400F2312A290013A8342F0CC39E9B96584E5CA7DF1DE7C", + "identity_type": "private", + "iv": "227DB4C6845BF40B82073BC0783EC727", + "key_seed": "C2EFBD062A6498B9E52733922A598BF3D4949A74FDB57D92D0ED064239E5C37F", + "metadata_key": "41C0037D03840085364AC811B553003C", + "section_mic_hmac_key": "452A3B6B009FFDF2B2E8F6CC57A2C741418F33E7A85D9FFBD33FA2A8ECEE28BB", + "section_salt": "1708C5DD384808FF64D2BA400F2312A2" + }, + { + "adv_header_byte": "30", + "adv_salt": "52F9C4E2952B34DF2C0296D50B197CBE", + "aes_key": "507A391115EA010FC7DCD6F69DAC200E", + "data_elements": [], + "encoded_section": "37901397A0CBA6F76625846FD918D0DFA8B5EC911000807D0ADCFE480829130092A629C43B779004E57DD041E63A98C2398922E8C6780738", + "identity_type": "provisioned", + "iv": "2CFF04243F275FBF2A33912ED849608C", + "key_seed": "C39B6A57CC29C43B34A9B24B6AA5F88B68249F3EF3FA242B7A227A7FC5B9F013", + "metadata_key": "F902EDE5E988C6DFCB6E550C739CACBB", + "section_mic_hmac_key": "F5914A0D86F740B26A39165146FBE172469E9C3B6A8D7FF5659E8C3A3C40FAAE", + "section_salt": "807D0ADCFE480829130092A629C43B77" + }, + { + "adv_header_byte": "30", + "adv_salt": "560AA4E7A57E03DBFAE7FBD4EFDA7CDC", + "aes_key": "9638DDE581FE5B67F2DD50376E3A99D4", + "data_elements": [ + { + "contents": "F2AED0A54D5317974CEA1732E79EFB900594C5660907", + "de_type": 56 + }, + { + "contents": "", + "de_type": 992 + }, + { + "contents": "", + "de_type": 86 + }, + { + "contents": "61F5EFF11047065B2933557CA2EA9356A4B569A20B362C760A", + "de_type": 748 + }, + { + "contents": "8754249571E61C93D55CA58B9DDB23402C", + "de_type": 790 + } + ], + "encoded_section": "849013203F5A7282936A2C5F6B7D31F2C2B3F1911000350FBAA0A5C14EE71DD5564DF054F7059001F63722D44C16939F37A228801E10C7AF0D3AB2DB910CB4A915A66C9AC57A057E79A46BEAE2B01B7B2422C789156152DB2C0C3C31EFCAFB6260012D7B01D8E55C0DC93FDCE2C9E3883DFBCF4D97E76A4F557470AFE3F6F3630A59DB334D", + "identity_type": "private", + "iv": "5FA4D01E917F4AF96837EAC84C94033C", + "key_seed": "AE37490A40777E13212927937035E5D5CAB7CFDB227BEF01AFCA1D4CFB348910", + "metadata_key": "7C0861BE5B2DA8F097517E544D50EC5D", + "section_mic_hmac_key": "A2CCBE29DCC3756A8B56810F1D9BB20F3087F60A04CF2968CAFB067298BF1FF0", + "section_salt": "350FBAA0A5C14EE71DD5564DF054F705" + }, + { + "adv_header_byte": "30", + "adv_salt": "136C515299513C1C23396C72472A869C", + "aes_key": "F8E96AD115365C1DA32ACE0E955D707B", + "data_elements": [ + { + "contents": "0004ACDFC6E1BF2DFE084CEBD5210494FA370D8D", + "de_type": 439 + } + ], + "encoded_section": "4E9013B093C4394DF11527B26EF2770B65B0579110007923EAF675A0D97190BC856AAA92FA5D90015BC232EFAAFFE8486D932A63D9121426BC5FEE983041B15F40194FFF44A3470C0F5862DFA2DF7F", + "identity_type": "private", + "iv": "2F972A959571317A323BAEC64650D9E0", + "key_seed": "653D1790B9B4E73D40ED58AF3548C01EEE9A1CA7EDBB6788113943F29BB8A7A8", + "metadata_key": "85BB2BE74E51ACB8D631E31C193730C6", + "section_mic_hmac_key": "01A9931123C16D70DF660545EBDC39099DBDE472CA53ECB8CF65CFA3FA67033F", + "section_salt": "7923EAF675A0D97190BC856AAA92FA5D" + }, + { + "adv_header_byte": "30", + "adv_salt": "3D877A078133B36B3035B3D2FD091B01", + "aes_key": "F141257F9BECEC2DA61B11F67E4E107D", + "data_elements": [ + { + "contents": "21F663C2B4668DBB030C2D2EB1506BDA8A77FAEA98B4567E8A91CA", + "de_type": 173 + }, + { + "contents": "71", + "de_type": 401 + }, + { + "contents": "FB19", + "de_type": 751 + }, + { + "contents": "755DF137F59366F68158D6BEA4F7877F1D2BB7CCF6962137", + "de_type": 748 + }, + { + "contents": "A286226956337347E1A54B", + "de_type": 192 + } + ], + "encoded_section": "8790134D927FD029D5F95E67D68D646A6A361491100039D2819931C23ADD06B49F18423BC84C9001B112FAE321EEC67D926158ECED1C2B19CBD9F742E45F25925FE6C6795BE721A2F72638DAB903CF4C970C4B3C35DD693FDAB3DEB719FAED9DDC1711F51F631B36FD26BFC34F9039E535BCB78D1A14D5113270D00F96A956D0DF082E2F30901283", + "identity_type": "private", + "iv": "32F841444267601174749E94F87DE1C2", + "key_seed": "E9333F52CFC570120ED0105ED56952CCE1FC9645367619713FEBAD14AFF0E76C", + "metadata_key": "6E13A84FE3BA463ED9E607F5B1BBC9B4", + "section_mic_hmac_key": "3C44C33189816BB62961DC5FFCF2C71D910C0730BEC3953C5411489DF41ADFAF", + "section_salt": "39D2819931C23ADD06B49F18423BC84C" + }, + { + "adv_header_byte": "30", + "adv_salt": "71A9A746DB966A4456DDE375B6F12606", + "aes_key": "1D5C27ED10C3063737A421D25B061C89", + "data_elements": [ + { + "contents": "39D427B897A964131313B227CCC4DE10B368B8", + "de_type": 519 + }, + { + "contents": "3A67A2E11BF608DC073983D1FB0DA3", + "de_type": 701 + } + ], + "encoded_section": "5F9013B8AF9217D548709840B3AC857034ACB9911000B4F398A8A439BC972F70E2609A6C7CA990022A637108B4F22FC613C0A0E75AC2471132DD1D972FCC1174BE70BB6CAFBB3F6998C49DDBEA8A425CBB28664071BEF42114A0701F112D37A7", + "identity_type": "trusted", + "iv": "F2754259EF584E77196E83CA8B4B49EA", + "key_seed": "B1939F4E5BF1BBA5B56B4C53FCFE87EC1873876B1869B215D79AE2B742AFAD08", + "metadata_key": "E35B349B13DD23987416D3C506A26EDA", + "section_mic_hmac_key": "2DBDE1B077515A353314FB3D933F17F37893CA377766A4C8A3BEFE1E8E2FE8A1", + "section_salt": "B4F398A8A439BC972F70E2609A6C7CA9" + }, + { + "adv_header_byte": "30", + "adv_salt": "0633A7D37D0E75C82950F86658617ADE", + "aes_key": "1EEFF97162B2CE8A3E6C657B8AFB9DF5", + "data_elements": [ + { + "contents": "0A263635A12CA6", + "de_type": 461 + }, + { + "contents": "13696B3B2D423455ADE08CE7E3BEDE", + "de_type": 304 + }, + { + "contents": "4382E5A1567DDC", + "de_type": 911 + }, + { + "contents": "", + "de_type": 3 + } + ], + "encoded_section": "5E9013C561581D56E580C0221BE31A9F5A97D4911000F341712F781AD354FB9444AEB9813A769001EF9DCFE8941FC69C1BDA3B6E61D484BE3CD363AFA8F753EF60E93BC52D8721FBD05DFD27C74584E9087B7645148A9696148501617ECEA1", + "identity_type": "private", + "iv": "1442CE37668B7EE9935E4E400C7051BC", + "key_seed": "E999377BE50FBB31279CD98440114E6CFD0019FA212A47015B9EE5EAC4BD49D3", + "metadata_key": "D489962146D1E488C02D148298B86ACC", + "section_mic_hmac_key": "48392CA50B2CEA5B7AB937397A530A54E1EF8320EE64E23E377333DC1A0725CB", + "section_salt": "F341712F781AD354FB9444AEB9813A76" + }, + { + "adv_header_byte": "30", + "adv_salt": "E5BCB2BFB4497D55C0BFE5EDE0CDC6A6", + "aes_key": "59A78870C55690255DBD141A15F090CD", + "data_elements": [], + "encoded_section": "37901330292E7FF856BD9476F0190AEE3ECA199110009029F02502CCA11E12A7809D3BA9304D9004901405D5FDA5DE684E4D372DEA766905", + "identity_type": "provisioned", + "iv": "08584E585B5ACA5124277D06708F34AE", + "key_seed": "8AAF95575F0A0E04188D3E42DA9F50AA3740E28DA9BE4815B98E74707B02AA15", + "metadata_key": "537EA5D04F0A1B31DC898C1FEAECBAD4", + "section_mic_hmac_key": "F8DCF1DBF531FA564EBA22F2809144AF11DF8BC792A54F77513AE58406FACE1C", + "section_salt": "9029F02502CCA11E12A7809D3BA9304D" + }, + { + "adv_header_byte": "30", + "adv_salt": "4579CC1B14F511A11A441B67B89E39DA", + "aes_key": "7E0F6C860EF0D264F8ED7FDFA9D843DA", + "data_elements": [ + { + "contents": "F8CDB7B169E1147E9B47779FF86A1F7BB2", + "de_type": 284 + }, + { + "contents": "A7FCB30D4379892BD07112349F7580699FE8B8", + "de_type": 603 + } + ], + "encoded_section": "619013E68A36F6574C0776D73BADC793720D31911000115B858A780FD00A4B1D74707D2F85679002F3B4DC9017DFCB21B818ECDA648233753AD42FEE0C77901D741C38EEFF3188811EA6EC7BDED6517DDF15636024BF3DD27B6CFE7A479848AB9DD9", + "identity_type": "trusted", + "iv": "37288FF7CCDB400825540E0E494D3A30", + "key_seed": "1577AFD72DCFDE648AB3084F07F93F275D98D58FEBC60A6CDBCBB1B1EC0E2F05", + "metadata_key": "77A66776AD508B9319A72FFAE4F45720", + "section_mic_hmac_key": "E2AC40D5A99B858D41D224CDB76685071E9DA4A1A4313E913C7C57DB5C05E76D", + "section_salt": "115B858A780FD00A4B1D74707D2F8567" + }, + { + "adv_header_byte": "30", + "adv_salt": "AD85D70775BA4E741F713229A6EF6529", + "aes_key": "28A1B46194B2DDC3497E5AAE297539AD", + "data_elements": [ + { + "contents": "F3F9AD43482D0E8DC791D639C671542CA0EF24E4A3", + "de_type": 292 + }, + { + "contents": "C32E4B8D3F8F7B308A", + "de_type": 578 + } + ], + "encoded_section": "5B90137F7A54A12574145B6DB3F5E27E73E7BF91100024E555596DD4D3555D08243513295FBC9004A301DDBBD6272926BB9DC0B9885A79507EE94B5969DD57C197A16CA97315534F7708D2B98743EFB67CDE8880B55CB6FB6048F9BF", + "identity_type": "provisioned", + "iv": "6899C0DEC131BB47E9D9DC98DD724BAB", + "key_seed": "59F841FD000EB3E98DA6DA3035D326B9242698347F0C972E2C45E6D28C2B7A2D", + "metadata_key": "A90DB67D319DE8549F8B31EE91B69FD0", + "section_mic_hmac_key": "B903E393AFE19D7DC80AEDAC8222CD5B99E60102BB471E4767F06DF32561F7FF", + "section_salt": "24E555596DD4D3555D08243513295FBC" + }, + { + "adv_header_byte": "30", + "adv_salt": "1BDF3C712E3AE53D63309EE3B8023A87", + "aes_key": "980CA9E6379B483E443DC1E160D5201C", + "data_elements": [], + "encoded_section": "3790130534A9410FE91114106C1CA9A8062F9A911000E578AE0019A2141EF58F01365677B05490047AC84A7E04229A68A6F7F3308374957A", + "identity_type": "provisioned", + "iv": "7D7E507A0BE6403325935B1DFA05A9F3", + "key_seed": "ABA16E9B7EE1835A8CC675D390FDD4616623AC235379B657C1233FEF741FA690", + "metadata_key": "2D8A58D701172EDA89904C96AFE41524", + "section_mic_hmac_key": "54E5FA2CE95932EEA68CDD1BD3D445AB83FEF2DCEF7E3A9B2C3785A92B228302", + "section_salt": "E578AE0019A2141EF58F01365677B054" + }, + { + "adv_header_byte": "30", + "adv_salt": "CBDCE43E4A6BED0CA0C6D08F3065F633", + "aes_key": "CEBF5E518C10D4684BEC405850BC032C", + "data_elements": [], + "encoded_section": "379013FE585D545653A98465FB672C230E014491100043DB7392F99B019A671A05708D588FA79002DCE155F4602E46063A0C523C88E2DC50", + "identity_type": "trusted", + "iv": "4B26BC7185A6C854190C227BCAC402BD", + "key_seed": "5916B9D7017269DE9134B2C7612BB1EFD625FB48BFAA111A0A2C093F2277EA26", + "metadata_key": "9D9A222628AF278F409455DDEF8461A8", + "section_mic_hmac_key": "A03260EB043E0791406F9CBBAA2E3F35EA9D3E5E0DE545C3BA5BAF070DACF5A6", + "section_salt": "43DB7392F99B019A671A05708D588FA7" + }, + { + "adv_header_byte": "30", + "adv_salt": "E39DC77B87C9B486CF0A220E9F96005B", + "aes_key": "710AB1ABB206738BF8B7CD25F447C6FC", + "data_elements": [ + { + "contents": "4B", + "de_type": 934 + }, + { + "contents": "66F3ECB89A6EEEF79D7B7E56D0322DF39B288742A2C1C501ADA9A41B6DB7", + "de_type": 110 + }, + { + "contents": "16C065D0395BF1207051A48B11E8CADF", + "de_type": 386 + }, + { + "contents": "98BB36DA75", + "de_type": 76 + } + ], + "encoded_section": "759013A2B7ECF2852EA59A6C5F1CCAAD2756979110002854AECD9C5381CCBF80A06371B88FB690040E78B4D151F14503F20A32EC29FF08EF3B152E32D1A0A6262EFC3A259020C14B6387DC646B3E16ED8F3D3E519266F723184D8B9833BA01AE0320B0F40CBC89431D479F1C6A77A8B91F75CD625434", + "identity_type": "provisioned", + "iv": "907158F1F28F23E9346C336D15BAF4F4", + "key_seed": "7974330F2BF907399B0A00CC0732BBC1A06946E0B1D581E4A4186F99E778F076", + "metadata_key": "6B05DBBF085163F895C1A797DDAB7BB7", + "section_mic_hmac_key": "D10DD1068B113669C31BE18259AA3C6E077D61E97CDF58A6C6139E14C9CB4229", + "section_salt": "2854AECD9C5381CCBF80A06371B88FB6" + }, + { + "adv_header_byte": "30", + "adv_salt": "D2778817F879B9E6369EDFE544E22294", + "aes_key": "C1691E7FCE0574DF8952878B6381739F", + "data_elements": [ + { + "contents": "EDF6EEE118AEE831E7451217", + "de_type": 925 + }, + { + "contents": "EC9312D8F49AFF", + "de_type": 220 + }, + { + "contents": "CFBC75", + "de_type": 681 + } + ], + "encoded_section": "569013718B15A1291DF01695B0DE521D99FB57911000947D8B59F619BDD6502FDF257004C9819002E4348AED16D25DA49B95C26845BF7DE590721FCF8952532E2002ADD53B5A98AD19B3F10E85425FB761FC9641FD6182", + "identity_type": "trusted", + "iv": "4077CA3D2F7BB0F5D8CEE41F01482B98", + "key_seed": "18A71701D5DEE8400E61168A3B3EF1AD1DDA90BC194C446C8BA40B6480C30CDC", + "metadata_key": "D1FE231F740FC03B295276053B2BAC3F", + "section_mic_hmac_key": "82AE800A495516651B39F72786BD066F05890A592D64AE7C1FEB9071FEE6C4D5", + "section_salt": "947D8B59F619BDD6502FDF257004C981" + }, + { + "adv_header_byte": "30", + "adv_salt": "587A03C7955F9860870984298B058015", + "aes_key": "331E9D1FF1937D5F85F0668282E65C29", + "data_elements": [], + "encoded_section": "3790130FB6023392D2A41095E8206D06D7FF0E9110000D85431BAFF333B2573911AFB2EE969B9004E7FD0D3F84B425FCE63798DC6DD93C29", + "identity_type": "provisioned", + "iv": "77A5EAB32784959211B1E7EFD4086F70", + "key_seed": "E46D0C46C240ADB0C96768BDEA14323BAA3AF59DA10695DD2AA96963FB75F633", + "metadata_key": "0364468086B86E4E69D4998412D9446A", + "section_mic_hmac_key": "B8A88D796B1F5CD4E1B3FA421F911CEBFBB33203B5F54D397B77AB08C6A4CECE", + "section_salt": "0D85431BAFF333B2573911AFB2EE969B" + }, + { + "adv_header_byte": "30", + "adv_salt": "7A1632119CD401B77764CD3CBA1B7E48", + "aes_key": "367BA98DF8FDBDF8D92C9E223204F9E7", + "data_elements": [ + { + "contents": "660362F50CAC47EB6D5C372ECB360FED6010E33CFE2BF3", + "de_type": 744 + }, + { + "contents": "2E27FF821CD7CE8C7A", + "de_type": 864 + }, + { + "contents": "24CA67B8", + "de_type": 38 + } + ], + "encoded_section": "639013B6F61D3EB8ABF5F504C50AC36A94EEA191100040B91207E7595A02CAF00DACEEB362229004899D84903A3B24808A0C8B7F59194E87CE3801D9A364D3232D8C9A1825EF6116E5C80E0ED3BC09DF178FBE1C6D28BAA73E8492380E14FDB44EFCAF61", + "identity_type": "provisioned", + "iv": "6A91D4D5C4DFDDFC880B73A3B7240702", + "key_seed": "EB30836609013EE83889ED5ABF6FC302F243144E118A2965AADDCC8C3987566F", + "metadata_key": "0BC8A5D803D9916D0BA83CBC5E0D3F30", + "section_mic_hmac_key": "D89DB6FD35D1A9A236C7B32B2713282376AB727EE4D22775E9A6E7AB64719479", + "section_salt": "40B91207E7595A02CAF00DACEEB36222" + }, + { + "adv_header_byte": "30", + "adv_salt": "EA9BCBE55A09A0AD1993D33AACDCEF3F", + "aes_key": "D480AB0495AC86543854653CF7AF5605", + "data_elements": [ + { + "contents": "5743AE7D722BF57D", + "de_type": 59 + }, + { + "contents": "254368832881E13E4BCD68DD622D7B27BF77F0B248799E3F6BCF903334", + "de_type": 42 + }, + { + "contents": "172233F269FC283AFE876265C41CF433148DB69C743C8965E791", + "de_type": 792 + }, + { + "contents": "C007E7BC097140AA592C287EAA90479BCE00838A84B7D529", + "de_type": 531 + }, + { + "contents": "9678CB4436B9DB612DF2BEA08AD619C84DDF8B58DA67CBA0CC491D", + "de_type": 177 + } + ], + "encoded_section": "B69013EB88670C74254B7E3124F568EAB21AB39110003CD98524158254D763A056D3D7B95EB890028EAD7A637F8D0F6CAF0D74B4A65BFC4C6DF88868FA11D9F5A5B179A5D884CD2C8693AA26F7AD7A949830EDBC504133BE5D5DA8317E74CEFC303FE55553BA1734B63ECDDEE36D3E90127BD85DFF414089E19356CC288B316AD5C88F7237EFA35AF07DC32C636D7DA300C8ED550F4409BD32BCEEC5CCEED448C4C049C19AB21C3E2FBA27F94F7C8402C98F5E60E23783", + "identity_type": "trusted", + "iv": "EBD45E06E481E15D113570B3CD3A690C", + "key_seed": "99F26C755B35B9E8F02471B50155868AD1B5415A36A8A09AEF2CC16B23E93484", + "metadata_key": "98AE7741589B65DC2BF7D9A9F725F908", + "section_mic_hmac_key": "66C7980C46970BE68B05B5263A65D5E3401D4E91DCC084AAF19D401694607A57", + "section_salt": "3CD98524158254D763A056D3D7B95EB8" + }, + { + "adv_header_byte": "30", + "adv_salt": "6F9CFB4554053A39150CCBCFE3D0AF1E", + "aes_key": "9D3541DE5EF0E257E4B8321145F57B4C", + "data_elements": [ + { + "contents": "A43F33AE23920C0423748C754B99D99129E9DB", + "de_type": 37 + }, + { + "contents": "729C9F3BFCA94ACFEF114794B2", + "de_type": 109 + }, + { + "contents": "AC", + "de_type": 730 + }, + { + "contents": "5559BAE1D900", + "de_type": 729 + }, + { + "contents": "2EB49A44A2641ABDF0CDDC03EF43B7F3F52C449A892F", + "de_type": 44 + } + ], + "encoded_section": "8090134F6688FA1A2E7BA04ECB6DDCB44035359110006AD7D11C0944CB91DB95B631C734D8949004E082EDC66A42BB6B05378C26D87B38BA4186497644057393408F087328EC5885E174BFFBD7466E158C474C51F5D524FF92A558F10761A4844FF9F9E1BDCC1C6E0AEEAB7E74BF4D04F79D6366857D63E74633C326B74396A4D9", + "identity_type": "provisioned", + "iv": "BFA35B0ADEC12C33F4A25CE69E314D44", + "key_seed": "585B91BAE582CFCA04B2CB0F4EF6228BF9D3ED8757858BC946567C7C056452D1", + "metadata_key": "ADD1DD5D5AFBD1297CB46459564779B8", + "section_mic_hmac_key": "3CC8495681BD196A59435B9E92678852F7229B3A17222A46F35AEB19872E8736", + "section_salt": "6AD7D11C0944CB91DB95B631C734D894" + }, + { + "adv_header_byte": "30", + "adv_salt": "0D008FD70A96D4922781509DC8233AC3", + "aes_key": "B6597B106536DB997B33270C1FBBFD01", + "data_elements": [], + "encoded_section": "37901319D976A449635BF9366F08B28550A32A911000540F306324634FD806109D2FA0F888719002A37EF91C879233705329EB6E1C7C1F3B", + "identity_type": "trusted", + "iv": "1F610FE4CEBFFBF09ECAB7001A9715FB", + "key_seed": "F000887AE6054C5ED93C14654F9CCB540E4ABD072E4A03C741D446809FB90C61", + "metadata_key": "F774AD3779D9F9C3CAFD222AA8FC1791", + "section_mic_hmac_key": "C5CA0D48EB97535C6759CC5851C60CCC59EFD96218C3AF81E97AF2A492C9DB42", + "section_salt": "540F306324634FD806109D2FA0F88871" + }, + { + "adv_header_byte": "30", + "adv_salt": "A0697BBCB8D71C0E3CBBF61383BBA0AF", + "aes_key": "2F302DFBB66FACFA11C38E4437398B74", + "data_elements": [ + { + "contents": "247B14830A72CDBE2687D79D9216D81F4E3E545B01D75A5B75E29756E4", + "de_type": 20 + }, + { + "contents": "387C2B46942623D8615696845A90B3DE25FF253A159C89A2A3C340", + "de_type": 793 + }, + { + "contents": "F45668C015DDA58C872A0171AA605889E691398726", + "de_type": 252 + }, + { + "contents": "1474A3653170C9", + "de_type": 181 + }, + { + "contents": "E49C82D1F206", + "de_type": 10 + } + ], + "encoded_section": "9D90138CFDF8CCDED054C4D7003AD4CB75765F911000C8C6351ECBBE018D1CAB2041141387E9900264E5A396E06459D7AD5061A8D1E6D6DB9A4DABC2338C9D39F291289A3948F91D3BAB928C47FE7503089FBEB195056064D7893AB1F884E7637AD93079312F00D1DAD71FE98C10370C42C1707C48358951AAFBD6F72889E26C67D846D13273A21E244DC751C76197BB577738B327CC39F017F56D4753BD", + "identity_type": "trusted", + "iv": "E73D0D0D01F12F05E954418529D9F056", + "key_seed": "E7513A0CF82FE239A9CC581240AD1BF40C7546506BAD18C1A754B8A50F190FFA", + "metadata_key": "094D5377650F8BFD60DDFC55521E1C61", + "section_mic_hmac_key": "7FAD140CC4B335530A8754A5CCD4A423AA3EC678ED3CA3D817906EE925AA90F0", + "section_salt": "C8C6351ECBBE018D1CAB2041141387E9" + }, + { + "adv_header_byte": "30", + "adv_salt": "66AB56CCB8DCF4E02102C595173AE0AE", + "aes_key": "080E3256F009193CFC48DBECD6A596ED", + "data_elements": [ + { + "contents": "5FFE88F1F3AD43AC0BD206FB1261", + "de_type": 554 + }, + { + "contents": "C5C5120C2AD8114C0D7223CA0D4B", + "de_type": 376 + }, + { + "contents": "AC57EE249B96DD8F426FE4F02031E48B3AB4A248", + "de_type": 74 + }, + { + "contents": "1CF30B1E1C519ABDCED6", + "de_type": 358 + } + ], + "encoded_section": "7C90137CF07245A7C2E4D9159C8C517CA1336691100063F671E6C1543317418A20C1BA7C01319002F7A70A1BD5393866D2E1E43D580C3C81FD09C428377BC94E8125F1ABAA938A5CB37C29DC9C9232679D1BDE10E8C586905A2EB8CBD52CDD1A50ABE0633360F0311BE2C3E60F32CA5ADDA8212D0D820A5442CBF1F122", + "identity_type": "trusted", + "iv": "6686516893FC3245873F63E6FFCFCBC7", + "key_seed": "226D0D4CBF82EF7C5636C8D21ADE2455DA18017EF11D9855A1C6623D7F52C49D", + "metadata_key": "B24F2E75B0207CA3039D2627726F15BC", + "section_mic_hmac_key": "DFCBCF569269B4C4C73D69E96B0589931C3BE5F7B5CC80B473A68ACB0D036DF3", + "section_salt": "63F671E6C1543317418A20C1BA7C0131" + }, + { + "adv_header_byte": "30", + "adv_salt": "A11C310F925DDFD146F831393D6D0FB9", + "aes_key": "1AE54656FB14E83D942075C749E2115B", + "data_elements": [ + { + "contents": "BD45361322D9A02B2048A177A0103CF3", + "de_type": 926 + }, + { + "contents": "2A214CB5FBCA350A5BB0CB335B9FEA40CDEB6455C037B6821A599F17", + "de_type": 708 + }, + { + "contents": "2680C9A00A375A0A9DCE72BA1CE694B2E29CA12A", + "de_type": 273 + }, + { + "contents": "B79A1762E7073C6A46BA17EC05", + "de_type": 988 + } + ], + "encoded_section": "909013FD6CFE2EE955035DE89C9F166B3E5EA4911000D1B1FB53397FE51B93F74900975CD47E9002924278101267E2D8E228B4C34D0A648C8A6B294E3CC9D07B62D1EF749C7BE05103940D261EC73D1F1C12C99A4B4F8ED3F468AA17CAE45B46E532F632012B8EE8E5C99014BAC4E2B5E20FBD1ED9DC6C6CB2D755E1FED2D3D8A5ACABF57ABF0D012C45D94137FB93592D", + "identity_type": "trusted", + "iv": "892E1A354B6DE952C5B014C7907EC182", + "key_seed": "FAAEE89538A2E2D5786C8946E6A0CEF832F309174B38DF73E4F84A99F15935E5", + "metadata_key": "0DB3D13A2E4FD91A299522F1D8119843", + "section_mic_hmac_key": "99CB5D0E2B02142282326CBFF5F9DA1E0233F2CFFC8C28BE12CEB87B9CC6FE6C", + "section_salt": "D1B1FB53397FE51B93F74900975CD47E" + }, + { + "adv_header_byte": "30", + "adv_salt": "8CD7AD20B2C8317FFA8C35639F74A2BE", + "aes_key": "04A4C39B860940DCBE6D31E645C6C979", + "data_elements": [], + "encoded_section": "3790130B2D888B589284B7A0756A14D057BA899110005EB69F216C556E3154B71449355FEEF590012148C3FFABD2C9E7021C7025F13AF42D", + "identity_type": "private", + "iv": "82B3040C024A93C9E9FA070F5751EF54", + "key_seed": "44A25B92833732691F61F166743F7EC9F9BED95D496117FB2C0D5FE8ADF243B9", + "metadata_key": "58D26BDAFC8C232C9AE6BD1466626518", + "section_mic_hmac_key": "15F5A03411DE20F46038D7081E95D728EF120D4DD04A6D17A89E2BC7EA240C6E", + "section_salt": "5EB69F216C556E3154B71449355FEEF5" + }, + { + "adv_header_byte": "30", + "adv_salt": "9ACA1AFA24CCE7E90657920FB0F97ABC", + "aes_key": "C6114A9A61EBAA0683432F07A306BAAC", + "data_elements": [ + { + "contents": "67F0136B918AA30006", + "de_type": 450 + }, + { + "contents": "3A54424FDE3D", + "de_type": 210 + }, + { + "contents": "BC4E6711DB9D574C249ADB", + "de_type": 362 + }, + { + "contents": "DD7AB44C2783A1", + "de_type": 994 + } + ], + "encoded_section": "64901398942DA061F73AD3DAC7FE04713E897F91100075C50E7D6DFA055F5967BDA20F6011D59002528E07C9E1AB8195BED4404ACF13B5C463F7F522DD45BA62C382337A18053527ECB87D1190488DB8FA1CAFD71DAE0F337F1F27E30405F2B3AA562A4000", + "identity_type": "trusted", + "iv": "C8D5BEDD1D514F4163FDC162E170E8E5", + "key_seed": "0E2E25E5F01089D937936CC39D8D004DC28C1F10D75552A9F66E98D510282092", + "metadata_key": "481B6CCAD1368A7FB57B226F25C5CD38", + "section_mic_hmac_key": "B9E11ECDC5E537C1669EC49389B73866E18AF8E13A0B6934CDD0B50154662368", + "section_salt": "75C50E7D6DFA055F5967BDA20F6011D5" + }, + { + "adv_header_byte": "30", + "adv_salt": "3D78B4DA01181538E9901A89BCEB17DD", + "aes_key": "79793A9EED14B1E7431C0B803ACE76D6", + "data_elements": [ + { + "contents": "1A14E4524B490E8107DACC2F7FF359791012B7BD73F680", + "de_type": 889 + }, + { + "contents": "7F4DD2AE08BEF6906DA8", + "de_type": 173 + }, + { + "contents": "F8559AE2EDEEC96166AE99", + "de_type": 718 + }, + { + "contents": "EA7FBF2AD229DD26D55B6E4A69B5720BEC80F14221", + "de_type": 447 + }, + { + "contents": "6F72657C", + "de_type": 217 + } + ], + "encoded_section": "8B90134FCA585270ECB11CA2D19FCD187E629391100076B4769D60E7810AF314C92E4F4AD22D90010CBA514F61328A8DF741F39426A6414A35993D0ED3645543ADCFC7F60039A16AA7B7544789824A630C6FAE0338828514A802D34E22F2677F5EF92D21B245E2C6BE89E118332EF6820C9298D64708D7E84C0E5A688C13EF9AF0139916E1ADE41C038EA24C", + "identity_type": "private", + "iv": "06676937E3AC4BB809DB29D5D0A0D238", + "key_seed": "13176067BCE094304F0D3D7B34200618EEB8338DC62F8B93B6DF1568D10892EB", + "metadata_key": "867EDB530C4387B741E3F8D5A90297BE", + "section_mic_hmac_key": "35533CF432DA85D9C9C797381EE7F410A1ACA2FAFAC320336E538C4CBC21973A", + "section_salt": "76B4769D60E7810AF314C92E4F4AD22D" + }, + { + "adv_header_byte": "30", + "adv_salt": "024C6620A23F3720DD27159A314223D9", + "aes_key": "FAAFC4270BFEF0C1B99EE28F255DF188", + "data_elements": [ + { + "contents": "B748E7AFEF028374C9FEDACA76", + "de_type": 172 + }, + { + "contents": "85CFCC", + "de_type": 913 + } + ], + "encoded_section": "4D901386135E41C81BF815C35F82210AA987D2911000FDBB2C065FECBF1CC2EE41B51CB6E636900217D0F0543708CCCAE565509D685542ED3F434A7B4CFFDC00B0FDD4A704B31768296C7783A0FC", + "identity_type": "trusted", + "iv": "5F7CCCFC3E69E1B0A4A75BCD2DDCC596", + "key_seed": "6B3B7B151F380162B9E0B70910ECDC784ED5397B3A10BDDE199A7A94BC6D8D75", + "metadata_key": "E138A6D9CD4C8852E08ED89542C192A8", + "section_mic_hmac_key": "42942C5BA5773295A61EC1C494BBA596E1F2E382026FED016C73CF9CCD6CC3E8", + "section_salt": "FDBB2C065FECBF1CC2EE41B51CB6E636" + }, + { + "adv_header_byte": "30", + "adv_salt": "26E8D6DCAF6B89C14D2967CD2F996C3E", + "aes_key": "F93420FD82E0E4006F5BCD4BCAEE619F", + "data_elements": [ + { + "contents": "DCC21604B26103BF2FF0DA36696709C57DD113AE10", + "de_type": 167 + }, + { + "contents": "CAB2EAF5F472143204", + "de_type": 996 + }, + { + "contents": "EF46C11CC5D0B3D06BC6001DF168281A0FB050B2EFE53D191E68D555D7C1", + "de_type": 635 + }, + { + "contents": "8DDE68F7309765DFF675", + "de_type": 575 + } + ], + "encoded_section": "899013EA913BF87D8BB4054C1A63591555992D91100097BE3649478AA55F3B0F450D35B50306900432491F1FBEC83775BC41FC1166D59DE10EF12EB01455B22479FC697A8B2B10B7A56C289D21C2AA3E8DB4FFF376ED4B1AC9C8874F0A99E32E2803F7E745244F53B47EE60BB3581AD954B33BE2DE4807AE5D39CCF10C5A38616AB4A17799ECDB7C895D", + "identity_type": "provisioned", + "iv": "48710ADDD5BF6C5BA7557EF8363238C5", + "key_seed": "90C710688CFB0274A65B1A98B01C42367DB55644917B4590AC7D20BE4045E96C", + "metadata_key": "88E7BD8F22B0BCF3E7017B889AB3BDF4", + "section_mic_hmac_key": "93370F2F5EE939E87A903BEF02707B3AC8C0D39716C741D8D513552EA0EA451E", + "section_salt": "97BE3649478AA55F3B0F450D35B50306" + }, + { + "adv_header_byte": "30", + "adv_salt": "57D01240BF129C429A6CF751CC3D53F9", + "aes_key": "AA74FA6AF836204298237570AC35EB9B", + "data_elements": [], + "encoded_section": "379013E8FB0C142819D59A85D20CE6346FC4C59110000F0472D2D144D008039AECA7226B8B49900139DFE67E4EE80F46A9B96D3AA6194470", + "identity_type": "private", + "iv": "B6E84BB2A3014E5614393F4DEF92C247", + "key_seed": "CEFEE1454C0BB63E85B73102F7323B441AD6589E484827D94DB7F50B158CC225", + "metadata_key": "18446FD698B121EFD552FB4D893FE1E7", + "section_mic_hmac_key": "E88F3731EEB10ACC952F79D2CFE41D9387D5544317EA307E0E929786E80184F9", + "section_salt": "0F0472D2D144D008039AECA7226B8B49" + }, + { + "adv_header_byte": "30", + "adv_salt": "BFF12B5AC3846F17A4F2671DD201DB7B", + "aes_key": "80165990CF33C6AEE8F5D706CA9C16B8", + "data_elements": [ + { + "contents": "1D", + "de_type": 225 + } + ], + "encoded_section": "3B901383873E9BB7C281BED884A6BC9D81E2F491100008BC6FA4DAC8237B4FCA4D351D456A8C900173A35B84F1311BDB48EEEDF03B44AB0A30DEDF0F", + "identity_type": "private", + "iv": "E79024DAB46DC39BF1C41E950EF68F0A", + "key_seed": "0191678E34EB80CC23F8BE780AFA6A323757EE2357B81903F0A11F586A343D74", + "metadata_key": "76BA1F4EE04F37541F620FF3CB0E341D", + "section_mic_hmac_key": "590C297824EBFCEC438E2227989EC334BD8549944587C0EF0CE8647D0CA733E8", + "section_salt": "08BC6FA4DAC8237B4FCA4D351D456A8C" + }, + { + "adv_header_byte": "30", + "adv_salt": "8D64601B3CEDFC33A6EB41F2A57273FB", + "aes_key": "EDC4F0B53EDEC5D458373413BA40EF91", + "data_elements": [ + { + "contents": "FB", + "de_type": 843 + }, + { + "contents": "78B36066A5E407DD1DBE7E3592273857C096A23CB16EE780DC5E", + "de_type": 996 + }, + { + "contents": "66BD25982401D8BA12065C6FE90A2EB5964D62038F03E23FBC1145AF5F29", + "de_type": 723 + }, + { + "contents": "7CA1830470E3E82A", + "de_type": 601 + }, + { + "contents": "D40D41F3E365762AFC055B", + "de_type": 437 + } + ], + "encoded_section": "929013782EBB1DAC3CB17A3F3640824931823E91100064AFBAFD7BC4C4E2CA5BAFA2431EAFC290016E594B07A92708C2BD85FF96A3D9AFA5094F73F05E2BB84CAA0DF5ABDC504C9DFAF179F3DA8206A8DD374E6EEC568B1EDA5A194AA461C4685800FE4E512788300E64D570FF745A9E108CDA5912EBE36316E1856DF794B73B40A53C5B179094622859204F1F22606CD1A94B", + "identity_type": "private", + "iv": "D1317E1FAA030298FF8C5AB6BA81773A", + "key_seed": "62B5DBB64DFFAC377EA82F2D42A7377853DEA50F09D3DAFC4B412B687A66B8C5", + "metadata_key": "1427037C5581AF92467699C6A6751E32", + "section_mic_hmac_key": "213813B05FE7AAF9777E792FF12E2B5A66055002E83ECC0AC7FD46A652AAB8E0", + "section_salt": "64AFBAFD7BC4C4E2CA5BAFA2431EAFC2" + }, + { + "adv_header_byte": "30", + "adv_salt": "373BF3D6F965BB823E05E5F7BD3078A1", + "aes_key": "5CCBD9E3100D52C9CD11F35654668482", + "data_elements": [ + { + "contents": "22E0417B", + "de_type": 599 + } + ], + "encoded_section": "3E90139A0E4A93DA7F646DE9A87E125128EE8A911000AD455E1C688FF04A371C03BF7796CD7690019F04EE8F7762B6F109719AEC910F1942B2F58CF6A6686A", + "identity_type": "private", + "iv": "B2B8D3700005E09ECD4FE23F302E100C", + "key_seed": "57A38204ACF2ED7C4C7CBA7C9546BAA0F9FCCCF9BA57335938A4965281FE65B0", + "metadata_key": "86405D9921CAB755B452C98A0C6CA34A", + "section_mic_hmac_key": "DDBAE43D3E5B9D620B2FC4E64C02035A75DA47DFD0805E0C2E5BAD62793C712D", + "section_salt": "AD455E1C688FF04A371C03BF7796CD76" + }, + { + "adv_header_byte": "30", + "adv_salt": "1A1D7E95B4475678CE4A355E6D120EBB", + "aes_key": "29D17ED2A3D5BFB193E169120EE20B3F", + "data_elements": [], + "encoded_section": "3790135990E82336FE3240D282B7BADCBD28A4911000A9F95C7985EF9A9EE72717C842A698F79002CACF57FE3D1D585998EA9C305C48D2B4", + "identity_type": "trusted", + "iv": "F6DBFADE261C4E9A73026B059AEC9D34", + "key_seed": "7B750CDCFE6B606CA494110409A4EE9860FF6544C8EA98C11F5335546FAFBB15", + "metadata_key": "7635C7A2DE6BF4015EF7903C840EECD9", + "section_mic_hmac_key": "0566AC9D4AB6EC0FA38115AEE5A469D65014629D8E68DFAC42419EEB722ADB1A", + "section_salt": "A9F95C7985EF9A9EE72717C842A698F7" + }, + { + "adv_header_byte": "30", + "adv_salt": "30FBABC3717AEA2AA0477BD6A3E1E475", + "aes_key": "DED9CC135A79C82BA7FBFB0C96B046BE", + "data_elements": [ + { + "contents": "2A350BE1BA1985F4", + "de_type": 111 + }, + { + "contents": "307AD47A1F29D017ACAAE833FAC539D70D1BC0", + "de_type": 417 + } + ], + "encoded_section": "579013871E5F454397F1878BB4CF0647E411F4911000DDED3531E375331992E98F425EB86541900416A66E5A7082A9FBBB4099EE5F0B9A4A92DDB5C2EC4579C5D9948DABEDA010AEE1A7A0472B542C390C7FB6B3C0AA529F", + "identity_type": "provisioned", + "iv": "CB385978490958F65666D5C60B05EF91", + "key_seed": "F429DB5FE75E0AA2E9F2A14A68A3E15458A719C5E4558AE46C00A665BA452154", + "metadata_key": "D8AA437E16803D5F18FCC89767240901", + "section_mic_hmac_key": "0BE552F6D9EC8E01B4E870E90566D0B774B5C26DA534D86AAFB5D2920BC8BEEA", + "section_salt": "DDED3531E375331992E98F425EB86541" + }, + { + "adv_header_byte": "30", + "adv_salt": "EF01B4E820D20AE81C749A58C3DDFEE1", + "aes_key": "F0E49A06F5B9AC50E7421833A986FA98", + "data_elements": [ + { + "contents": "41E065F83C", + "de_type": 299 + }, + { + "contents": "B680D15D9511D833860DE3CB6F2F6743FDF449", + "de_type": 908 + }, + { + "contents": "871078FFADADD8D86DEB9029E47B2031AC1A2BD31E1F5467C46B81F4", + "de_type": 3 + }, + { + "contents": "E8EB3A2427E5BC1225A8CF35D067D3B9CD241CB40066D6C6695B214E45", + "de_type": 138 + } + ], + "encoded_section": "93901384E18167330C033B062C2369F35593D5911000D42B13BDC2120ED6935DA267E6E0757890043CF778DB9F3A7B9C9B0C798274C1C554F3C741D7F939836D65A1052A504CD928FD797216793071AC4B25B292BD19E3C5C47DC5907D29BB01B90C8E923E297B519EE368E979319E6017C6A69D938F638C61803CE45536CA0DD754E846E6ECCFB1AA7A93547FAC69C50663EA8F", + "identity_type": "provisioned", + "iv": "DC1E3FB599A1E7D1608626E6E17C2521", + "key_seed": "3A8FB9BF059E71E53718B02FE78E571CF44AB722527298D272420F549676859A", + "metadata_key": "1F44220ECB96C20C54640633D69DCAD1", + "section_mic_hmac_key": "E91278BE56B332D705A53E313E1DF4E490511699296BD4B60E121E66585D69C3", + "section_salt": "D42B13BDC2120ED6935DA267E6E07578" + }, + { + "adv_header_byte": "30", + "adv_salt": "782D32501734250795AC4AF93A4300A4", + "aes_key": "D50EF6CEC2A54EF8B77C4EDA8F36BD32", + "data_elements": [], + "encoded_section": "379013F040E084112EDBDC93B5FCCB7448296F911000805E7F20E7FA28F518264F5E082CAF04900441FD6FCD160E311319C10A6893D3C924", + "identity_type": "provisioned", + "iv": "EAF6D250FC4F0A6672101E0674B06BCB", + "key_seed": "7620AA14EE8667D1EC09FAAA941346DF595B47B3BE63CB04D4641F6A8D5C760C", + "metadata_key": "B09416A05A492EC78D6F64669DA3402E", + "section_mic_hmac_key": "68601BACC6F7B0E429AC7C1EA88FF78605C1230693A2FA9B3CA393A64CD30A53", + "section_salt": "805E7F20E7FA28F518264F5E082CAF04" + }, + { + "adv_header_byte": "30", + "adv_salt": "FC449A50721817F66C05B8EF876F9E78", + "aes_key": "A1318CC4CE689EF7FBD7FE22B21E9ADC", + "data_elements": [ + { + "contents": "D8D569D2CD36FEFEFECF0358CE1EB87EA9BB533B36B46EA7", + "de_type": 372 + }, + { + "contents": "06AE898607F5596FA8AD05475ECA2E9640BF3305527F30D4", + "de_type": 863 + } + ], + "encoded_section": "6D901349CA53B009B567A031F330D4606450FF911000DC9E659B8BBB254934876CC5D008CBC090049ABF95152E79A7E59C2B1D293B3A354ABEB1ECBEE2CCCC5FF05D49FC9899F2126FEB50C3DD45B7E2693BF171BAAB2987301A1192D902834A4A90D24B18972DF864945E535828", + "identity_type": "provisioned", + "iv": "1EBF95D7139416EC9B1818FD5F97EF91", + "key_seed": "F02A2F8CD34C8A8B257B87ED39B6E9ACB1E27980726732B9E5D6B01FFD7876DD", + "metadata_key": "0F8F4189804AE28E4A464E7F3980FE8C", + "section_mic_hmac_key": "6FD39C4C89A6ACAF5AD70F154C3A597DBA3EE96C2F596420AE8776AFF63FD62B", + "section_salt": "DC9E659B8BBB254934876CC5D008CBC0" + }, + { + "adv_header_byte": "30", + "adv_salt": "3A9206D9C925FC35391F2CCB66843BB6", + "aes_key": "B164F108D4101003D41F5A265069E16C", + "data_elements": [], + "encoded_section": "379013E56300B4C0E142D630D8BF19AF1E5B0F911000BB25DB4C1E1998DC75AB7738E7A0C00990018AE9A810448A770F700B86CB37C14F74", + "identity_type": "private", + "iv": "1093DDCAD240A78B323FEEDF79291D33", + "key_seed": "BE17A1F7DE7B872D67ED89E58DEE8899E9786A71ED62E797F590B3DE30905966", + "metadata_key": "548B24FD91CE28150F24118488E8C650", + "section_mic_hmac_key": "73F14DB10E850262C42FE6527C0E5A26F62203277C1F4AF40C12356CF1639732", + "section_salt": "BB25DB4C1E1998DC75AB7738E7A0C009" + }, + { + "adv_header_byte": "30", + "adv_salt": "419DC54AAA22D76C4FAA100A8B597761", + "aes_key": "B0C19ADDA557D389AEA1D65BA47DE9A2", + "data_elements": [ + { + "contents": "", + "de_type": 970 + }, + { + "contents": "791EDC67", + "de_type": 186 + }, + { + "contents": "42EBC555C54FC8AB0241758981E329839EC9B543E9", + "de_type": 47 + }, + { + "contents": "42EAE840E0F23077AAC76B4FDABB671F", + "de_type": 237 + } + ], + "encoded_section": "6B90131A017BAB4BEC196E0F84C5E587C025D7911000686C4845F376C37C9C3C443EF4E29E9290024E453EB1A34E995C296614A6993FF632E9F97B2DE3D624825569175BD0A9C96B5B9B87531A9FACAAAC69833461463E3C5FCB1D89B23086CA868D4303B56DCE0339C156B9", + "identity_type": "trusted", + "iv": "5321A3B70C166516A62ECAA30FB2AC90", + "key_seed": "404A64651191A344B06BA775AB47A6D961042C751B62DFAFBD4F05C6B692A75A", + "metadata_key": "F8C1EC9CDC2C188F4A9F599CF84E07A8", + "section_mic_hmac_key": "47AE068E71F04816286AAA0F28FF01D4F2271EF59E4A3A37E4B1ADFF9A028BC5", + "section_salt": "686C4845F376C37C9C3C443EF4E29E92" + }, + { + "adv_header_byte": "30", + "adv_salt": "F1B3435490631CC0996A289568DDA5E5", + "aes_key": "B66949CE919A7F877E207F57739276BE", + "data_elements": [ + { + "contents": "CC223F25545F", + "de_type": 109 + }, + { + "contents": "E80181074A42346CB9CD0787A2D568", + "de_type": 780 + }, + { + "contents": "03", + "de_type": 733 + } + ], + "encoded_section": "5590132B1C10D0A90A025571E857B2E49A4054911000837E16BED64DBA81BEE53BE1DBB1DA679001A44E99184E6B16B0499F2E19314E25CF83C93DC0D4B5AF1E140BC3EE578092057599F5C716FA6042D492852F68AF", + "identity_type": "private", + "iv": "3FDFFB73C30D8BC45F8126A86D889C43", + "key_seed": "5D36273BC56672627108B613CB0C12EC04806C65D019A6FE4DB8C8B20DC0963C", + "metadata_key": "BCFE519169AEFCC4E6986C8D370FBA39", + "section_mic_hmac_key": "11A4EF7B955F8050A56C65D331E17EEB0299EE364DF3B99109523110D2018E01", + "section_salt": "837E16BED64DBA81BEE53BE1DBB1DA67" + }, + { + "adv_header_byte": "30", + "adv_salt": "712EAEC308AE64A4ED14E1F7DCB13C43", + "aes_key": "98F6C204DA7BAC2C924E2511E15FBC44", + "data_elements": [ + { + "contents": "9D35F9D040F2AC28D7A81524EDB41589771336127BF26D70AF503DC2", + "de_type": 380 + } + ], + "encoded_section": "569013B73F41BD53CBC78A6861EB9435FA5EBC91100023BDF35A690FDB5ECF141A3899D22F42900246967897B21A2DE7A7F9D49A25BCD939FDBAEF13807F0FF86E4F1BF007728E98849A3FE70D206C883DDC097E1EFE8A", + "identity_type": "trusted", + "iv": "078ABCE52C402BFFE7A5EB49C4AFB40F", + "key_seed": "40D30613640F1FA84C9F670F63C9394E0464C6FED6CA7C3F2CE787B11CCB085A", + "metadata_key": "10DD3208F3A5D1CE9E5FAEA859F84C40", + "section_mic_hmac_key": "D8EF775C6AAFB173BD2956F817257FA3A5A6F4318439ED4E78BC5B95D9B18290", + "section_salt": "23BDF35A690FDB5ECF141A3899D22F42" + }, + { + "adv_header_byte": "30", + "adv_salt": "1F407B57564489497A0CC7E672852C63", + "aes_key": "AFE6419A004892A3074D6F302B525CCB", + "data_elements": [ + { + "contents": "0BC923FB8124E54605284885D20FEA3B0531ED991206A7E1E66A0D3A", + "de_type": 366 + } + ], + "encoded_section": "56901342667136A1FA39944C42FA485384005A9110008916195D190EFCC6885AA87B1C7346CE9001A0FDD44366F8DEDC29560EA4943979E58082609D7F54CD6D6FDD694E5D75F1C8ED256ADD1D96425321273A8C6B484D", + "identity_type": "private", + "iv": "833FAB9A4D9EFA4B9D4A8A68DBC2905E", + "key_seed": "E9F13B36B01E9571788A504A9AFA132B9E57EDE7F29BDC43EE5E8AFB81CE8928", + "metadata_key": "88BC13E7EAE2D056BEB2093A95BD5064", + "section_mic_hmac_key": "2E07197705F025A3E7D117E721682E8D2C3931076CD3E0FB3CA04C4D63BBDB29", + "section_salt": "8916195D190EFCC6885AA87B1C7346CE" + }, + { + "adv_header_byte": "30", + "adv_salt": "D22AC6AF30509C332CFA4656125E4FDE", + "aes_key": "278ADF6744B1BEA0A5E31953A0A25A08", + "data_elements": [ + { + "contents": "DF4143D4A169A64ECC8904D569296CDA879F48", + "de_type": 801 + }, + { + "contents": "DD214F021EDE84B893813CA1B0F66B98AEBB5FF094", + "de_type": 820 + }, + { + "contents": "066A6F1A28BF90A3000A56399A0145BC", + "de_type": 867 + } + ], + "encoded_section": "789013F978EE7FC9B30B192FD29EDE12023D9E91100053AD38BC511698060EC41429F1B120C590014E843B18ACC329051B5DC84693336EE6692A3865FF84858AF8E0D10C37F25DF9765DAF75F880A98656987FF6D40A4F1B4A908C1BDA79667F29FC2922AB4B512749BC50DA3E20E2E6736C501006BDDE1026", + "identity_type": "private", + "iv": "EA05DCAF6A26E50E57F282173E8D6C5C", + "key_seed": "B58DCFEC3705289C33368810E98B7E70368EDE274184B1E2CC42DFD597F4E874", + "metadata_key": "F412B16221AE5038F4C5112C7D1EFC57", + "section_mic_hmac_key": "552EC08151491F3DFF44DB0B5D13F691E064B4E8F09AE41CB98FFC17A607D4AC", + "section_salt": "53AD38BC511698060EC41429F1B120C5" + }, + { + "adv_header_byte": "30", + "adv_salt": "36D0C4D6C12715D7287FE97F02251BE2", + "aes_key": "FAD2E4C7807F81D34D2491ADBA670024", + "data_elements": [ + { + "contents": "434F8FFE447B6BD8FA9CAA8653928D6BE5E8D3", + "de_type": 853 + }, + { + "contents": "57B611D2196D0DAE89249493C060AB27EA4377DF", + "de_type": 652 + }, + { + "contents": "433B21A811", + "de_type": 648 + }, + { + "contents": "ECB728637AC60A94BDC4EDCBAADF7782CDD4031A18B3F3", + "de_type": 172 + } + ], + "encoded_section": "869013E40676A01D66A6DEB421518859371BFE91100055020FF3DB29354D80E8E03397C0E74D9001FCEB97DFB9567B4C57BA8061A646B54559230AF6CCE3CCE6871C4C767C42C70208035162D535FC3B9565AC7FCA3A9D8019AF94D65C38CC7564AF0AD3339822C939570E57181E5CDD40AEB04E64130E4C44A7A4B3C0EDAB655451F585C19750", + "identity_type": "private", + "iv": "4C44E4C5CB13EFA82A8785FB1C4064E0", + "key_seed": "7DB299F572F69A530306BFFD37D3AA1D5702DDE5E8D295A1EE1A89964B2664BE", + "metadata_key": "0BA1602DB4E23F70EEAC5ADD65D9EBDE", + "section_mic_hmac_key": "3B6687807F35C44E71AC08178485BBE20ECACA722061443ED733077FE09812A1", + "section_salt": "55020FF3DB29354D80E8E03397C0E74D" + }, + { + "adv_header_byte": "30", + "adv_salt": "6A0271AA5747B448F81BA095AE218E9F", + "aes_key": "FE81F30B457DB3B5A2B12C9E62126168", + "data_elements": [], + "encoded_section": "3790132CA2D928B14971ABFD0410DCBFEC710D9110006ED067EB08676C51C40F3C1848F89858900418EF11F7818FB2284E8261AAB63CA532", + "identity_type": "provisioned", + "iv": "463F849F17AE15B5D63FC3AD59728ACF", + "key_seed": "BBFC469077C9725D263D54D042C203F6356D60F55F050050CF10928BFA8EF48D", + "metadata_key": "632558DBBDBDE655DB4FDB6CB0280AB1", + "section_mic_hmac_key": "DE884F0B125AD4F4AEBFBB562EC79A8556AAC9C1654E75E79E59C874DB4C554A", + "section_salt": "6ED067EB08676C51C40F3C1848F89858" + }, + { + "adv_header_byte": "30", + "adv_salt": "D0CBA45C99E9FA404A4B0CCE1750C1BA", + "aes_key": "D5F6E5822FD550CD3592877794A9FA54", + "data_elements": [], + "encoded_section": "3790135A82DE2CAC2C840A7A525B98295A2B0E911000C8A8DC0A221A9E73736816B12FADEE9990012AD90295A4695F2AA1CDCE65858F6319", + "identity_type": "private", + "iv": "CE0AE01F467A25649172788288036955", + "key_seed": "1EF3F6BFA77940DECF68C92C4916DB9DDCF12D2FC671F80F133A0E64CE643CC4", + "metadata_key": "1DD57E55893D8C7C66F30AB5BE78E5E0", + "section_mic_hmac_key": "6C18E5729C77197AA709F37CC196DDEBE97CBF5109E6AD8B686F6A193E7B839A", + "section_salt": "C8A8DC0A221A9E73736816B12FADEE99" + }, + { + "adv_header_byte": "30", + "adv_salt": "F33D12D40B9C8B9AE1C47C8AADCC0CAA", + "aes_key": "1E64FCFA53A6CEE7E20F1C616A672CA7", + "data_elements": [ + { + "contents": "081EC010879E34E2E36E07DF44D5", + "de_type": 686 + }, + { + "contents": "ABB15E5E47C51C9C5247E1256387260BB0E688", + "de_type": 184 + }, + { + "contents": "71DF0AF4F9666A099E6DF57EDBEB", + "de_type": 797 + }, + { + "contents": "", + "de_type": 866 + }, + { + "contents": "A1D4", + "de_type": 57 + } + ], + "encoded_section": "76901346AEBDCA4CD4F32C73CFA95B0152AAEA91100019C67F054994EBF76B86A9910B24442590020889DA34F813D8ED74273096EC54618EBC62DDBBB2001CF6F1EA30C6FCC4082B55FC170EA5144776585B7D30E0C4CF9C54318C7115E41490ACE3849B79499C829F5EE6F63D5CD6F725FD7DFB2F0AC8", + "identity_type": "trusted", + "iv": "D3CEEDC1A3009457FF17D6F2C2C6CC45", + "key_seed": "FE080591FBA4B25B2326713AA17FFD1B64C32B4B7D1746571C01D6F23931EE37", + "metadata_key": "6FBB76CBC7FF309E679EB284FC5001F3", + "section_mic_hmac_key": "A72DB4B90E985E04BAF697CC358CC84BC077BF0E863DFDE644E829A40F72C0D3", + "section_salt": "19C67F054994EBF76B86A9910B244425" + }, + { + "adv_header_byte": "30", + "adv_salt": "D67DAFD17744D0F8241D3DD1F3A1B14A", + "aes_key": "8A065DADD8CB1CC9967868C01070DE8D", + "data_elements": [ + { + "contents": "3310FE973462496D27BD963268D98A27A6F848", + "de_type": 506 + }, + { + "contents": "FBEB9691FC08C103F9E7E74092DF32C3DA848F", + "de_type": 947 + }, + { + "contents": "", + "de_type": 942 + } + ], + "encoded_section": "669013A84927C93EF891F3684515177D57F56E91100075EE531A506096BA0F5C07F1123C5CA990025FF39825FC892166579828672F8D9953F02014743C0B7CA7ED00C694A5BC3BF1C3BBBC16C1FEB9489022CB014A97A6E7077B52BD521E811D78A3C3733517D9", + "identity_type": "trusted", + "iv": "75518BA2DDD3E7B3DB43F868ADFE2A20", + "key_seed": "26B3A85EECA4EC7AC1B7855ACBD28EBA1B0E9F96E9198A15078172407708C268", + "metadata_key": "3E9E3098DF63D01ED466C1870EC6B4F3", + "section_mic_hmac_key": "646D3C3381952F4E489A408AFFD2586981B31E9470339C0A196F02D7724A5349", + "section_salt": "75EE531A506096BA0F5C07F1123C5CA9" + }, + { + "adv_header_byte": "30", + "adv_salt": "EC458F9E453AE59CE56316C9A18F2698", + "aes_key": "E4C77487A10D78704F4FA0678EACDC3D", + "data_elements": [ + { + "contents": "4DE4C93DCD045609E8C0D59A5D232BEA345A8805", + "de_type": 106 + } + ], + "encoded_section": "4D90135B2E85AEDCA13DBF678DBD9A491899F89110006EE872C19FAC3E06FF7B1087D7DA70CD9001524A8CCEB50207DD133EE928A16AFDA97AB9D56B798C15BEC3A8878F9CB23FC0A9F1DA69E868", + "identity_type": "private", + "iv": "39EB9D090BBD36CF20FEE1A7B383170C", + "key_seed": "E571F9737891BF4B91A55DECAF950FC0C3C14AFCBCB578BA64369691004CD99B", + "metadata_key": "78DABB32CF166CBF9340B1B6F566A91B", + "section_mic_hmac_key": "26C2433BF4859BDBFDE86F9B14CE9A166C8003185F3C606D58C6F865670F3B63", + "section_salt": "6EE872C19FAC3E06FF7B1087D7DA70CD" + }, + { + "adv_header_byte": "30", + "adv_salt": "91E89D93CAD7F35D9AB9C6BF4325A2E8", + "aes_key": "70EFA33873D2E345D1F56CCA9665054A", + "data_elements": [ + { + "contents": "", + "de_type": 649 + }, + { + "contents": "9EE549A8C30E5CB17E60804FF9F7885BA0DE9AD888AD102A4F40E3675A57", + "de_type": 267 + }, + { + "contents": "E3F347E2C9170891B6437DA81E", + "de_type": 594 + }, + { + "contents": "CB572B98DDD51E9122EDF481FF59D3A692BF43", + "de_type": 642 + }, + { + "contents": "A3CCC2D85DE09207CE8CFA88FBC2A27F5032A9661B89340EB2B45F54", + "de_type": 712 + } + ], + "encoded_section": "A09013053B0E55A309DB4CBBFB63F693F097C1911000C252DDB368B81DF337A9E6C22C1AB1E29002E8784CA2E7E1C22823BD8C71E457C78618A334565C5A4931F291603EF5F5DA43C2E791D65FE4029AD8BC8AF31CCB9FC66300C80CB4A7A026C7F5FCDA97D406D8891C8E36B5DE49F57F4843C0EC57CC01A303C6989D0779114255B7357EC89BDE5935AE4ABF2245A13E0540FFDA726C4BBF33BA356F3FB52B5F", + "identity_type": "trusted", + "iv": "4AAD555F0E8B2B0BD7F8B5B3288EFBB8", + "key_seed": "235725D5AF71A8B364F576DDF5FDE5794F379B1157FFCEF16E0962ED9E7C69F0", + "metadata_key": "221424FDAF49E89693F960537A19185F", + "section_mic_hmac_key": "BF1850DF168537FD74F15A0D907D2205509C03DF1E0B2D3C9C659DA296FBBA12", + "section_salt": "C252DDB368B81DF337A9E6C22C1AB1E2" + }, + { + "adv_header_byte": "30", + "adv_salt": "5F21199702D08F17E8C31D8CACC752B7", + "aes_key": "78055B5877F2DC9100DCC8C026FEAE01", + "data_elements": [ + { + "contents": "0C9E929580674F44BCA192B4988E1186E73C0553339E077DDC537C2F7CFF", + "de_type": 49 + } + ], + "encoded_section": "579013B616F28CC69FE4BD9566BC9C28E7997A91100005F57B353ACC660C1C893CE24C2AB4139002C3B30303F662EF836D765C8CF334F356DD1A214E25294934896D0E54AF12F9740FE06684DBE3E9BB01CF1DADCAE0DD25", + "identity_type": "trusted", + "iv": "5CCF9429D65B8856E1D1DC0F0600DAAD", + "key_seed": "49EDD7CBD630CF1EB36750CF0B84887F9B9036350EBCF09EBD36E1B1D6C412A0", + "metadata_key": "34875210235E1D2D25478D12066C155C", + "section_mic_hmac_key": "45FC0D8B7794850569590818996D2E7F2EDA7E38A2090D37B5D6A5E7A4C24B4F", + "section_salt": "05F57B353ACC660C1C893CE24C2AB413" + }, + { + "adv_header_byte": "30", + "adv_salt": "ADDC564B44D0313C8BE7BB31D9591C73", + "aes_key": "E89A463D3116A6596F4E0E20AAE69439", + "data_elements": [ + { + "contents": "24C93D94C0", + "de_type": 130 + }, + { + "contents": "EB7F3A5D86354B56D639609F502BAC8A292026254288A116C2", + "de_type": 608 + } + ], + "encoded_section": "5B90137D5718E198489D40D7EF03459A4336B0911000BD284D68208CDB356CFDE5EBE234902D900279864896227AE76218FAD91C906B62334298BA923DE515265337355814BB2FB2AB4A9969C34EBFF5F396EB39ED8A605FD7241A5D", + "identity_type": "trusted", + "iv": "36208616A6E3B31472F125A2DC4F51E5", + "key_seed": "B7C8C5EC411AA108CE8EE9B6BBDEAF9CCADA1252DD7C7929E20D12F8E09541D4", + "metadata_key": "CC1BAD820BD0B97A8B5A5FAA4419DBF0", + "section_mic_hmac_key": "2DCD3B2806A4F52453EDE021A1C167C5BBC3FFA9E8BD14C7D1FEEA9EDDACBA1D", + "section_salt": "BD284D68208CDB356CFDE5EBE234902D" + }, + { + "adv_header_byte": "30", + "adv_salt": "5E8E972BE173F38D85F411A2ED26003E", + "aes_key": "9FD558DA6B7A1A5184EB545BF703858F", + "data_elements": [ + { + "contents": "194E56962B21A139D89B79A1509FF3E0DCE71684B72DF74416848286A710", + "de_type": 278 + }, + { + "contents": "C1276C6B7402", + "de_type": 575 + }, + { + "contents": "A64FC3", + "de_type": 589 + }, + { + "contents": "5CF1B952B38E5CAA8E", + "de_type": 883 + }, + { + "contents": "DBA4F3AB1BF2A6F5D325FB9130D5391AFAED7B0792F2DF430F50", + "de_type": 122 + } + ], + "encoded_section": "8F90138745AC668A56139F98DE7B63F8E75D55911000A91454CAB75AB191C1EFCD50DA1C31A490018019E926591F29A634CB84E2B5852C661047B96EB0522EF34BCEA20C8148CBE779FB9FB95AF044F20A6532804C303DEAE0D287D40D2D0050ACE7923A2116360B7F1FA82E888316057B56112C26C1D49865EA7357A73308415CF1CF17D7874D442103DCF4969FE59F", + "identity_type": "private", + "iv": "CC6E95261D63DBDA7B9A379984AC5860", + "key_seed": "D767BD6AAA4F821C12CFDAD0839649B26DE111C270B746948DD3816B42361F6E", + "metadata_key": "99B29D708B6AC3929AD7860847ADF25B", + "section_mic_hmac_key": "7F566273E7867C6044B63B51B1FDD564EB972A1DA7ED441739396A15C85870CB", + "section_salt": "A91454CAB75AB191C1EFCD50DA1C31A4" + }, + { + "adv_header_byte": "30", + "adv_salt": "890508C1E419677CE3D82C8C634D9A8D", + "aes_key": "B58487F205E25C8FFC6BF799D7123167", + "data_elements": [ + { + "contents": "9DBDF9ECBCE565A86F0316355BBAE4", + "de_type": 729 + }, + { + "contents": "894E7DCE8E717CCB6BE7A2B727AE1F038FD81F2D", + "de_type": 556 + } + ], + "encoded_section": "609013BCDC003EF848E2552698FEEF4B5BE538911000FEC9A473F042542F1594E8374E690CD790019456A748B13AE47C66888BFDD3BF5D69259E33B8223572975CFDBEC12D566C8516182DEDDE70B61A0C83091AA7D675C516AC6426395265023B", + "identity_type": "private", + "iv": "3266A4DD70BF6DE22B52D786A665139A", + "key_seed": "1F19488144728397A56FEDF8EF3C71F1C784BF98A8FC5DD3EFC14B733322AB5F", + "metadata_key": "B15E02D56B9062FD82C73E2F1DF3DDDD", + "section_mic_hmac_key": "A3096941E32118FFBA5B57A5A151D49CC0C0E4CBB74658669C6E1C9024FDEDE4", + "section_salt": "FEC9A473F042542F1594E8374E690CD7" + }, + { + "adv_header_byte": "30", + "adv_salt": "8298F26DF0ACD9B9784CF50C1FA31CD5", + "aes_key": "32599218CF7379D323531C4BBAFC94A0", + "data_elements": [ + { + "contents": "BCF691D7FF954D04836873F6822A", + "de_type": 458 + }, + { + "contents": "4F0E8EBC44028D314F3BA98B806DDF652722", + "de_type": 177 + }, + { + "contents": "9B4173AC", + "de_type": 242 + }, + { + "contents": "7F5213584393", + "de_type": 204 + }, + { + "contents": "5C77CCF36304E367291A1B2A3F7F58", + "de_type": 585 + } + ], + "encoded_section": "7F9013102BD6F16710F91D224A7DAE68FC3A2A91100071658BD652281D3C02E63780F9FB687A9001C61A8B00D08E33EDEA32453B605CE6AC3259641D1E0DF3726A164491FBAEE8BC4EB237178E1F55C6C811F14BBB32764330185DAFAF2B3495FBF8AE3368F46DD21D46F0C670448F9D517731F0F7F2118762CADB6E306F2C8C", + "identity_type": "private", + "iv": "75FB79B913CCB164010CEB9C2F003B79", + "key_seed": "FC02A056FAE91FA6DE95CEEBA9EADB65777603F77F123004515D21B281FD1AC3", + "metadata_key": "9B055D228F084D0BEB418876908EC39F", + "section_mic_hmac_key": "58E406BFD5609A7642B7B19AE11FA144D53BB56B583C55694665F8265C09E9B2", + "section_salt": "71658BD652281D3C02E63780F9FB687A" + }, + { + "adv_header_byte": "30", + "adv_salt": "8DE8CF158AF393D2993F59D151D92FE7", + "aes_key": "C3ED1758DD53889D70F1D523EA467752", + "data_elements": [], + "encoded_section": "379013F55E075DEADB5808B48E3D7520302EF991100084AF13307448C2326837E2A2760876A290017A8BE69D8EF995E77620EBED461B2AE2", + "identity_type": "private", + "iv": "58A62B7FDF9BC814F3209DB583F52017", + "key_seed": "60F7A17633D7D73127CECC969609F9AE6638C0E00B95C4464B686A5FCEDD3E2E", + "metadata_key": "A4A17957FC404BF5D50A42BDC3D4857D", + "section_mic_hmac_key": "B1D557333696A1E1AD29866C78BC4086C8C6ED43711A3FF4862709A08F62E214", + "section_salt": "84AF13307448C2326837E2A2760876A2" + }, + { + "adv_header_byte": "30", + "adv_salt": "D767403957E9D3E90C2C17EE950E7122", + "aes_key": "041C51D75D894A63E83E7D6862723202", + "data_elements": [ + { + "contents": "423FE65EEEC743FB7781376641FD9CB31D5E37480D5313BDA90A7A", + "de_type": 623 + }, + { + "contents": "8B5DC36EE664C72FC16840A0CEB5BCAAEBAEF09694", + "de_type": 250 + }, + { + "contents": "CBD97F852E7BA0", + "de_type": 633 + }, + { + "contents": "B2E5FDFFCA6859D1", + "de_type": 230 + } + ], + "encoded_section": "829013CA3F3F33B038546D0583551F01CED15A91100014C5C9F74FFA4509A87523AB284DE2AD9001E09EA5B8DB9CAE3E53DC93FE2CE7669CDE9FD349982E2744F9700745E409F926C1568C527923BE14BB9356179E1F36E072A08EB2BB6559D460BEB251F5C8179DB02B903655D54043000FD1A9A272EE8849391915C9B5E27CCFF6FC", + "identity_type": "private", + "iv": "404AB007A1717B22258CCDADA622C4A6", + "key_seed": "6E0ADE4BB6B948EA0412A3BFE1B3D8F97CC95BF9F8531E91632E6393378F12BA", + "metadata_key": "D211AF1D1753DC34098F73AE56F188D7", + "section_mic_hmac_key": "0CE5B2335330EE0DF2491432539E311627A00E59FA3A6B8858BE6124AEEA67C3", + "section_salt": "14C5C9F74FFA4509A87523AB284DE2AD" + }, + { + "adv_header_byte": "30", + "adv_salt": "EAA4670B96668CC6F80D1C5879AE3AE7", + "aes_key": "B001298B920AD8FFA727BBD08983DB33", + "data_elements": [ + { + "contents": "2C5BD7EE8B257AF6D9F3BAA45266B450", + "de_type": 676 + }, + { + "contents": "6A87A498F333D0EA885BE02FCAAB20A7848264ADF1C536E1", + "de_type": 24 + }, + { + "contents": "5C7816C6CB0D3513FAA77CAC05568E8BFEC1D5338799A27FC5", + "de_type": 275 + }, + { + "contents": "93356AF6AE0C944E5276", + "de_type": 93 + }, + { + "contents": "D6EFB581D317A392", + "de_type": 946 + } + ], + "encoded_section": "9790131ECC1BB30CD53E32B1D49E2C3F686D3D91100013EC472339FE487D5C13C57B3DFED24A9004F8431796FC123097DCDF156B695ED780A62033B4FEF0EB38807631D6C1409B6176694B32A5439E8433393B9354782C64DEEDD9B243521963FDBDF13B9CAB502654981751782EAA352313FC17503998C0F31C20833424AE008FBC003BFF7EFAA0CEFBD144744BE7B55963F9EDAA6F06CB", + "identity_type": "provisioned", + "iv": "CC88BD5D473FFBD1B9E8C25D278E8DB0", + "key_seed": "A0AF2537313F70D3C9ACF9C3670093A73F6DD52E775814785A459C99D925D1F1", + "metadata_key": "5A91F28B272C105013A774EFE06F2D21", + "section_mic_hmac_key": "1D5897008DEDDF91DC33C812DB0D7FF20D32F21A22011CA4AE01E27DD46A71B9", + "section_salt": "13EC472339FE487D5C13C57B3DFED24A" + }, + { + "adv_header_byte": "30", + "adv_salt": "94BC22D840D0F083167EDCFC6AEF8C49", + "aes_key": "1A26CB30822972EE2ABE2791A009C412", + "data_elements": [ + { + "contents": "B72CE5E1E1C2", + "de_type": 692 + }, + { + "contents": "47", + "de_type": 287 + }, + { + "contents": "1DDEC34D828DDB5CC0F84CD20B5DB7B19EF25F95DB123AD9", + "de_type": 86 + }, + { + "contents": "CACCBF6A6B8EAB0047", + "de_type": 314 + } + ], + "encoded_section": "6A9013F5710533AE4FCCEF7B5ADE33EFE5239991100005533C388684983561E9177E61EF12A790043935815AA283938A76A1C359BCB9F4A227EE4D5C756C2FE0E784A728D7A1E04D67778E7AD79C64701C3F5BDC0E9A630BEAA2BDEBC0A6C70B81F289EB1A8EEF6AC534CB", + "identity_type": "provisioned", + "iv": "AE327DDA6E6F62742E607A4D558165F5", + "key_seed": "4F26D99EC0F6EAAD77C9A99A96BAE0433F7CF061701FA46D9694E85F8A53E3C2", + "metadata_key": "8F5507A58C555112EF53DC37B8B35299", + "section_mic_hmac_key": "E5B47398C87A33856D04E6D5DE9FD03830179BBD0B441A0308B6D2D5B0D4C693", + "section_salt": "05533C388684983561E9177E61EF12A7" + }, + { + "adv_header_byte": "30", + "adv_salt": "D3E0E38F22BB30B42170FE476EAAF4A7", + "aes_key": "4E1CFC0FDB6BBB26913B5A0EC39B018C", + "data_elements": [ + { + "contents": "4E9E5BB8C4F9751BAD57AC939AC519FC688076F39FE424", + "de_type": 861 + }, + { + "contents": "9DE1BC6BC8", + "de_type": 315 + }, + { + "contents": "", + "de_type": 995 + }, + { + "contents": "FE3A1A1793B12DC2E2CBEA6DC461", + "de_type": 722 + } + ], + "encoded_section": "6D901328E5F50CDF08199DCDA8953EC535073B911000B629F236825E4F1DAA2A828FAD8B10139001DB295D2AD40736D82A98069FEA37D688BD2D602F52E02554AEBEACBE7BD00AA0E553253B44F645A0BF6F6602583A2ECC26390107D5E1E3832A31784B5E0FB83F74FFFA23F0B2", + "identity_type": "private", + "iv": "512C19498A4E6BBA5958FF68EF833524", + "key_seed": "AAF59E43323B8E5BC14542E4E4B1D6FED664FFA9C4565FC137C53D9F234F687C", + "metadata_key": "E96E09BE304022E2062E3309FBEE197B", + "section_mic_hmac_key": "D4A3BEB6ACBC8497213299435EB3BD8504DB6C82979374D7F918C1D41AECC7E8", + "section_salt": "B629F236825E4F1DAA2A828FAD8B1013" + }, + { + "adv_header_byte": "30", + "adv_salt": "36B6EBFC8957EE9D957D592B1C0293C6", + "aes_key": "EF8A7FB2585A093B212749546DDE83E7", + "data_elements": [], + "encoded_section": "379013FEE47BCD621E2BA1966989BC933A8789911000DD18243E63B52FC8BD6E6237FAC5C0939001FC37D819D217F558FC19D2DDC5A7AC12", + "identity_type": "private", + "iv": "209F0DA89053E84ED00F71B53155B760", + "key_seed": "D82BA7F2F0A36BC58334EC711E2AEDA662999D22F7D7D9B07564C73CDC51E282", + "metadata_key": "226F121645E6F4EC151AA15B31382A13", + "section_mic_hmac_key": "D2906FD8EC224CDA8FE20EB4F77A1FCBC0494238E7BE0FDE3575184CCF2CD5F7", + "section_salt": "DD18243E63B52FC8BD6E6237FAC5C093" + }, + { + "adv_header_byte": "30", + "adv_salt": "99A6BB55ABC4CC161FAD1CB8DE6AC727", + "aes_key": "4DDEDCC1BDABD7190C999F9F5F239FC6", + "data_elements": [], + "encoded_section": "37901348313C15FC6D0809D5C003E835396037911000C62DFB45DF8452EF58E761232FF95ACA9004924D826FEED7FDE6BCC4585637AE50BC", + "identity_type": "provisioned", + "iv": "CA78EFA5E951531B543EC499C60D48B7", + "key_seed": "CC3937AB3F6ADBCCD479ECC12AB4C648EDAF2D715FC61272D90285E2051270AF", + "metadata_key": "249790EE67EA75470D5CA38274206943", + "section_mic_hmac_key": "1720B0888207C03723165DA9C7F2BE23F19DCCF3666947E208F6F1E4D61BF28F", + "section_salt": "C62DFB45DF8452EF58E761232FF95ACA" + }, + { + "adv_header_byte": "30", + "adv_salt": "CF9AFE50ADA0A3975C49A50CA4592CD0", + "aes_key": "8309EFC8132EEB8924884C37F023FAFD", + "data_elements": [ + { + "contents": "", + "de_type": 930 + } + ], + "encoded_section": "3A9013E3B37AB96E385112C61C57C59E5AA4789110008C658E80B19AA3F9A91CF5CAB5EDE9FB900194F75F6B920DFAEDC253BEE8CD72586B3A55A7", + "identity_type": "private", + "iv": "1F9A54370AF4AA8257003C4083115700", + "key_seed": "B180DADD23E531D4693AF1361DEE2B82CB4EAD3CCB7B440822C791DE23808B24", + "metadata_key": "5B70CB9828BF7082D582E80BF68A95D0", + "section_mic_hmac_key": "C7151B084FF92A1D77EB527978F3341F4E26C888AFA801DBD5AD66FEAA09A886", + "section_salt": "8C658E80B19AA3F9A91CF5CAB5EDE9FB" + }, + { + "adv_header_byte": "30", + "adv_salt": "0AE4ACDBB6B969EA9C655FBDFAB3BD24", + "aes_key": "9C721D6592B96CC3EC1A069C8257D53C", + "data_elements": [ + { + "contents": "D6E933C73088AF72DC86CDD2B472AF67C0EF9BF2485481930DD803C8F0", + "de_type": 646 + }, + { + "contents": "C85DDB36AF2574", + "de_type": 692 + } + ], + "encoded_section": "61901310131C4E228092D296F758A3526A9A5391100034B70164C7A05EB4D4166BC4F4CC16BD9001D717BE347A4DB6CB0DBEF2D099D6883842035FD21A6B9D7C92A7D3848E7C64388913DF0AD468382D17EB97C0264F457DE26298EE9729E2551EEE", + "identity_type": "private", + "iv": "1830392917044736F4ED55A186631167", + "key_seed": "BD733DC39589B1AAEDD1C0AF32E3F1D0C67C85A426C76DC1C436F5FBCB4CB8F8", + "metadata_key": "A65E981CDB9BFACB2FAC9048FB5F86AA", + "section_mic_hmac_key": "9A95A15A85545A8F5BF3BF598C68C6B1DD8B717A1C860B306D2C56260D3D144F", + "section_salt": "34B70164C7A05EB4D4166BC4F4CC16BD" + }, + { + "adv_header_byte": "30", + "adv_salt": "CF43BA7DB832370445F2B85CC9DC0820", + "aes_key": "1510B1459D6070F66F102C553E6BB690", + "data_elements": [ + { + "contents": "44D8251E75FF1AC54A2EFB7738044961C77736CF6D", + "de_type": 460 + } + ], + "encoded_section": "4F9013827424047389DEE800447D83ADA0BA13911000DC2F440F30E53E4B029CCFF297104D479004BFB36E2F23E45F49E6C7101D5C1A95B530019C645BE8ED2455D28D7DE4F01D2349EB0AD6EFD768EE", + "identity_type": "provisioned", + "iv": "FBF5782EFC3F038150A57A003453B289", + "key_seed": "0597F824745D4FCA4922A4A641E27C7F0DF3E3754F18229CDC11ABB6731C1E0C", + "metadata_key": "3D982630FB96976DEF7CC0D1DAFD1B80", + "section_mic_hmac_key": "09AFB1227469C31F3FD01CFEE970327FD85AE9557364DC7BDBABDD3E0AD596B7", + "section_salt": "DC2F440F30E53E4B029CCFF297104D47" + }, + { + "adv_header_byte": "30", + "adv_salt": "4BF365A1E62CB517ADF3C96EC86A695C", + "aes_key": "06773F17BF41CFC952BC520FA06E907A", + "data_elements": [ + { + "contents": "F1897D930A5877FA1CD661DCDF2C9225B1ABCB3EB937D674B3E1C444", + "de_type": 404 + } + ], + "encoded_section": "5690136721E5046A5398712F086DCFCCFEBB4E9110009C3172327BA6B8B09FC3AD2A285A4FF09004DD9D9AEE9370F474D9EBEA89CC7BC5EDE99547F14269862FFE642BFA9C51216EB10EC71B5D462DBF155E7F9282ABEB", + "identity_type": "provisioned", + "iv": "2039CD9D8979F45554A8165952138CD0", + "key_seed": "74C768D045E9145CA61115534306A970AD184F166A1DFCAE8FA44019E9274F94", + "metadata_key": "94E9F6F9C99423A6352CCC6D1689BC8A", + "section_mic_hmac_key": "CB0A779AD5C3F5514E1A2D4094600DD5AA50C3756958F80BAD2229A87F170D38", + "section_salt": "9C3172327BA6B8B09FC3AD2A285A4FF0" + }, + { + "adv_header_byte": "30", + "adv_salt": "1CDBA11F9479A51F6C7F5A892FDBF196", + "aes_key": "EE83B59FF4FE53B13B348E8BB40B5B54", + "data_elements": [ + { + "contents": "9E6AF7AFA04A", + "de_type": 60 + }, + { + "contents": "4CA08F4DD378B99F005502048E577335307332", + "de_type": 69 + } + ], + "encoded_section": "54901361D8AD4F0C8E4E18A1D898278B2BC137911000AC75C0FEA579E3F958E4395F9CBEE3B39004C88B0EA35E1F251FA0CA9AA6E42EFA999D69E852E0CAB982BB1A974486BD912507617D5F7F70195010ACCBF83C", + "identity_type": "provisioned", + "iv": "6E4B7653CBB755ECC8927EFE06CABB64", + "key_seed": "D029E2ED3571789462F357D5C3755AFD6D3B91FBA2D2BE1B9AD671E370F9056D", + "metadata_key": "2E36E40B8B0155FF11B92A8077932CA2", + "section_mic_hmac_key": "90D1EE3CC14FCD4F7B5734A40CA42AD27EEE5892C2CF5B26729C34D3C2B143C4", + "section_salt": "AC75C0FEA579E3F958E4395F9CBEE3B3" + }, + { + "adv_header_byte": "30", + "adv_salt": "3690113DBB16570F0CBF9C3A2716C6CF", + "aes_key": "FEFF29107072AAA0681873034994F017", + "data_elements": [ + { + "contents": "2C4DA1F7E021E1354FAC8A76445E1283BB22D1A47DA113", + "de_type": 426 + }, + { + "contents": "AF46", + "de_type": 241 + }, + { + "contents": "C12A5AE9835106753CDF5C961EA2B3A09E5345C15A8BF2878B05", + "de_type": 131 + }, + { + "contents": "021A8B90BA962F", + "de_type": 628 + }, + { + "contents": "4065CC7C14A9A1", + "de_type": 956 + } + ], + "encoded_section": "879013651C94A1F7CFDA39FE974613772127A4911000FC81D58B27C193143B37E79A070730019001AC6EF8D82E470B38CB13558B2F2E0A0E7E28E0D70630BACD41B508B19550BC2301B46B8A64B8BFA3099D2DC6AAED4F125EFCE470FB97D8166834239B1B55880E969318422EBD021FB94EEC47F9602181B9F19A983926D42F185E1B3007D899CA", + "identity_type": "private", + "iv": "80342BF18D7C5776BD7FDE0A2F8AC447", + "key_seed": "5FBD9471E75E2C59F62A8B341120BE518410FBC2DC9C73E01B0892A6BBB6390F", + "metadata_key": "070C25B363FB7C308E15D378FE49E66A", + "section_mic_hmac_key": "811B501ECD17C5CA3483A7B2CB4DBDA18DA36A8A0070A336FA4D4EC7AD617C4D", + "section_salt": "FC81D58B27C193143B37E79A07073001" + }, + { + "adv_header_byte": "30", + "adv_salt": "C108BD4A771CAD2F6E7814121E2ACF0D", + "aes_key": "C842C0FAD03E38DED3004C68FDE4FF7C", + "data_elements": [ + { + "contents": "37F07E9ABF51F94A2FEDCA5EB096BBB6A2C98BF5D792EC10B8", + "de_type": 86 + } + ], + "encoded_section": "529013AAE6FEC854ECB31E4A0638F9C3459BD4911000D314E0A6FADC0C898CFC47B121C5D0439001D0049C43DE3BB4FC114A4E261443B33B87E3D0CDE141BEEE14A6B252BFE7654A53C6F5E087D7871E936406", + "identity_type": "private", + "iv": "9B140F556904B7BB90D90FE1D7053837", + "key_seed": "C422D717FF3CFFB8A1799B7EBE928C327C3C6CECD0EB6F6A5ADDAE450C2E4A43", + "metadata_key": "FA01F1000E65A2B4CF29A61C94B48C0E", + "section_mic_hmac_key": "346DA5C873307F1DE6B6D50DDA7565FD3B64D62BEE8FA5449878CB9B04B8219A", + "section_salt": "D314E0A6FADC0C898CFC47B121C5D043" + }, + { + "adv_header_byte": "30", + "adv_salt": "195580FBA34790E8277954C3BC9D2082", + "aes_key": "E2803B4903235BA7D86D3148185D8CC5", + "data_elements": [], + "encoded_section": "3790132C00FD339FEFDA9A33EA05F0B61C1C559110009E3B063ABD78AACCBA9411EBED90BF029002569640B7F099D81C9F82A9C45AB8F38E", + "identity_type": "trusted", + "iv": "6CB76A799DA3B1D880221B61FCD13BB2", + "key_seed": "85F01432030780C4EF09D81B8B7F3E6F6181AE5E35818A9327B90B513B18D39E", + "metadata_key": "CF225E1482E9DDC1EC23BEE3830BB297", + "section_mic_hmac_key": "E59C266F44177561A92FAD0E914787F91B75102D557AFDD8A90E15E4C517870C", + "section_salt": "9E3B063ABD78AACCBA9411EBED90BF02" + }, + { + "adv_header_byte": "30", + "adv_salt": "6E020398D55EFAAE4811261EDA98FD6D", + "aes_key": "116A369A261D68D0CCBC42A18C347ED3", + "data_elements": [], + "encoded_section": "379013DE1AC91E9B00462A9A9BA642DC5849799110006116C6CF4A3C7D6BA18B8D226D2301C890049ABE79E404D562A6885996894ED53AD0", + "identity_type": "provisioned", + "iv": "1D018BD16FD2DE9E649CEBABD581DD2B", + "key_seed": "F7826F803023E18562041D581E30C68B18F3BD079ED331AB08959EA9D6A4BFD5", + "metadata_key": "7B3DFC9C93D7749184D6D74358823E85", + "section_mic_hmac_key": "CB330A1CF99F0FF314EA31874A09A1C7160318E971FA13D268337D59814C7B1A", + "section_salt": "6116C6CF4A3C7D6BA18B8D226D2301C8" + }, + { + "adv_header_byte": "30", + "adv_salt": "567D9E7C592385238EAE53144E8BA230", + "aes_key": "136470023C70C08029F4DFBAE9F95B7B", + "data_elements": [ + { + "contents": "A561C92ACC2252C6C62DFEFA992BC2C5A9C48D04F9", + "de_type": 248 + }, + { + "contents": "683961187D5DB39339DF9785A2C45271D1CD68611D", + "de_type": 816 + }, + { + "contents": "B56F", + "de_type": 910 + }, + { + "contents": "6166018060BFB398E173C269377CED91731BBD70", + "de_type": 507 + } + ], + "encoded_section": "839013A7C4F33A2ECDC37D6C1CF6252071A5AB911000935A35412D351D8B3D41105173987C0A900266AE9A51DBD974D99670EC791804347809108459DE0B339FBF2C78B1B283B5D47C3B890744DB38733464E8125F101CC220E1BFA52CE6E8871A2E40FBC4E9F7619175B7E3903D7FEEC02B5571A874F22785BE608D844AD1E62A3CD1E1", + "identity_type": "trusted", + "iv": "B2FA1B41C649211A7EDE06841F5BB38F", + "key_seed": "76761CBE3E4C5C59C635770D6712FE9DA60F3EC7DB730C2A2E269D022F253043", + "metadata_key": "4ECF0D1A14561713F994E2DD7B685FC0", + "section_mic_hmac_key": "E05AAD376A660745E2DAA4552147B6301FE2D8BF56586011AC28893DB5856E96", + "section_salt": "935A35412D351D8B3D41105173987C0A" + }, + { + "adv_header_byte": "30", + "adv_salt": "21A510F6CE3823A53764724B62FD6B7C", + "aes_key": "05C066DCB8F0B98888E96B567579C868", + "data_elements": [ + { + "contents": "C15CB0D22F013348DD0E70231A556608480E31D9E890D830B3A553415DAE", + "de_type": 37 + } + ], + "encoded_section": "5790135C827FF620A9B1F9F152963942D6E026911000FEC1DBF803354DC1673A835893AED9DE9004A715F76EFCE834E20F88537CF36933F54809CEF7842962A6DAC2D1D3AF22CAB9E5E855FA6D5F7BBFEC371F21056A8A1A", + "identity_type": "provisioned", + "iv": "B758108B3902E3BCA1ED0C889CC5FA60", + "key_seed": "2F56D486D5C63D844C2FDEEE2180803AD2D1EE5905BA717461135123670C399D", + "metadata_key": "D468A60519C50394C3162E0E02BEE109", + "section_mic_hmac_key": "250E47FD6AEBEB5E33DF17AE8F5819EF98D0839A011BA4FEC04AFB39E75D9F79", + "section_salt": "FEC1DBF803354DC1673A835893AED9DE" + }, + { + "adv_header_byte": "30", + "adv_salt": "80B928DB65B720EE90833AA09FD5DC89", + "aes_key": "EF85E00C15787C5B8CFA20A31C1EE64B", + "data_elements": [], + "encoded_section": "379013023A8AF0E5E41435B4DE9FD9229166A49110009C4B81AEB3D407915348130AF8B9D1609004E4309CF504F37E93F69C559457182D38", + "identity_type": "provisioned", + "iv": "BDE415E1EBCFE566354779AA734A0F9C", + "key_seed": "70F30CBE76BDBF3E99847FFE02242A380D50E2A9C444696C62790E927665196C", + "metadata_key": "0777B0D07118272EF18915210E67D4B6", + "section_mic_hmac_key": "67978F51212E8DB9187E5EF52DBE96714EED071C716D8FC27905A138C597FB6E", + "section_salt": "9C4B81AEB3D407915348130AF8B9D160" + }, + { + "adv_header_byte": "30", + "adv_salt": "DE84590AD5159AE889FE5191762775ED", + "aes_key": "58AE0ED041CB11626C1E135A8FDA418B", + "data_elements": [ + { + "contents": "787F", + "de_type": 864 + }, + { + "contents": "D1F4A82599F6", + "de_type": 876 + } + ], + "encoded_section": "459013A9C4AFAD3ADB46F107137C6E33B1BEE7911000039933B91DD5D7C409512651661B032990014642BBCF512BA6F71FD38D6E73BAEF600156F6FB689FE5BC6943B6A121EE", + "identity_type": "private", + "iv": "D961D3EFC14523C97BCCF93C47DE7AE9", + "key_seed": "D29C5FF82F0D66CE956927333836E3354CB86DD41EAAAB8392225693E897A2EA", + "metadata_key": "B544F56E3A995CCEDFA8549780BC793B", + "section_mic_hmac_key": "D5833BC069C1B314C6A3F7D67320098E72CD93F3770F1E45EBBA5742AF3EC288", + "section_salt": "039933B91DD5D7C409512651661B0329" + }, + { + "adv_header_byte": "30", + "adv_salt": "2FF79874212D7CDA93645F988AF6421B", + "aes_key": "9BEABC1D25ECDB374914B8700638C7D9", + "data_elements": [ + { + "contents": "F9B8FB6EC10F68", + "de_type": 896 + }, + { + "contents": "C08B48B41244100DE3CD2B0DD489", + "de_type": 32 + } + ], + "encoded_section": "5190133A88E7EB3645A94ED695EBA85F75AD1B91100037608F6EBDF46AAE033ACF587848E6639004B805DD3CA0249ED6FA1EAE1244D8E3A49F354370746BE13814E00D5839741ABE795D2752CCB57897FD07", + "identity_type": "provisioned", + "iv": "217FB82980A6995AEC010E921FAC6243", + "key_seed": "DFCB8691CEFEB4ECF09ED9F0719E45C25B4AF43AA8DD405801D670610F508F65", + "metadata_key": "0917CF2905CE9FB3113357F3963AC8C1", + "section_mic_hmac_key": "B797F2EAF9EC7F43CE59E70D7456B0B487AE6A428BF133FF7EDF35C16C2522B5", + "section_salt": "37608F6EBDF46AAE033ACF587848E663" + }, + { + "adv_header_byte": "30", + "adv_salt": "BC78512327F1C8471CF01C0AA4FDEF2A", + "aes_key": "7CD9D0ECED9B92B058C164C72DAA07A0", + "data_elements": [ + { + "contents": "0FE510DCD7D804", + "de_type": 739 + }, + { + "contents": "7C23D2D6EB1B8B3BC85F16DCCB34459904D415F286", + "de_type": 217 + }, + { + "contents": "4CD0B17F3AD93405736BC91F9C4DE76669F2", + "de_type": 763 + }, + { + "contents": "E91721441BA575F21A84CF4DD20B61FA14C6", + "de_type": 938 + } + ], + "encoded_section": "839013AC1DD11822478EA0E8FE591CD90238209110004D8A533E493907664027DA6A4F3183F29001D65670948662735E7A7F129595196B44B94D1AFE368ADD6E5DAF03AACA8E3C4077F46A164F0BE076022417C86F21E8646A103E333AAAE689E33DF411784E6B7D48607C4C8FF6B977AE9F7C55B07DE52F88A54ABB35DC20F128D1E647", + "identity_type": "private", + "iv": "A706CDD672985D91B0CD4F308DE1CC70", + "key_seed": "EEAAE365B3DA449EEB6F25B891B7023EBC5FF1B9B675FA12DEA7525354773CF6", + "metadata_key": "88335D0BD8B53CF2FA24E5EB2D004E91", + "section_mic_hmac_key": "EEED7FAEA65FAAC630EEDE3F70681E796AC19D2E64EEEE5BED29F65BC5064E35", + "section_salt": "4D8A533E493907664027DA6A4F3183F2" + }, + { + "adv_header_byte": "30", + "adv_salt": "D1573ED4ECDCE4A879E65C68B1165F45", + "aes_key": "4FED88141D37FF7790CEFDD9E5A7E9F2", + "data_elements": [ + { + "contents": "430F28BC", + "de_type": 204 + }, + { + "contents": "32EE03B85DF71B06B43CC1C8AC17C3421756FA83ADF098CAB3", + "de_type": 518 + }, + { + "contents": "F0A965818855", + "de_type": 542 + }, + { + "contents": "", + "de_type": 390 + }, + { + "contents": "CADA0F0AB15928451A346544ABBF", + "de_type": 84 + } + ], + "encoded_section": "7690138D3D5ACB2206D76CD2F0DD909F8D0DE69110005A4E8669652BD77496780CC8085FF28B9001B94FB713B235D2EB84DD453FAC955BA8994A4796E3ABC89E7D9BA85085AA727777981A901A11ED6E68F97EC32031FCCEC7BAAB22A20F4DD1E81D811CBACA821E4CD75266B386079896AB4EF9376970", + "identity_type": "private", + "iv": "DEDC56F368F3719F6507F18862DF2F21", + "key_seed": "7474B5856B73AA33803B8F16B5F9230EDDF0E805842BB2494A1F8FE87B8DD10E", + "metadata_key": "0989622EEDCA93001550750A77E81D52", + "section_mic_hmac_key": "88CA9441457FB574EBFC546DF423D2996213B2FE20674FB96BEC57B15E4802DC", + "section_salt": "5A4E8669652BD77496780CC8085FF28B" + }, + { + "adv_header_byte": "30", + "adv_salt": "3379B3B44F19BBEFBAEAF20E742D9209", + "aes_key": "BC6242695C247BA13FB5E1B0A15B7F00", + "data_elements": [ + { + "contents": "4E92C67ED663F28F0D1E3FBC3E295B", + "de_type": 891 + }, + { + "contents": "6D09BFCB10C38724315FA37FBD9F4B01169D5D2F", + "de_type": 497 + }, + { + "contents": "674AB7E0797190073A3AE9", + "de_type": 731 + } + ], + "encoded_section": "6E901332F1F41C1274F02153C590E9582228A79110003A467B2E8A05693603A106F0CC3EFD2A9004CA7F77623D873F7E349A56A149DE733DBFD129501BF46EED93A56BCA17BC3DE92AF5ABFD1B340451D013535A4E939C2BFD78382ED9E661B3C906B20B9B5AF2A8B9C56C544DC7C7", + "identity_type": "provisioned", + "iv": "97CBFEE77A69EC3AB70CFA9DEC69D8B6", + "key_seed": "396536E9DF44FCADA1064F4571A5AAC5646FC8B3EDEE0D33A5DF52C7AE61876E", + "metadata_key": "74B5E5F9F6E2E1F4E23B9250CDBBD802", + "section_mic_hmac_key": "E10F34CE2FF4F91DEF8BCC12EFC3B9FEA40F02CBA57B0C714C3358862C9834EF", + "section_salt": "3A467B2E8A05693603A106F0CC3EFD2A" + }, + { + "adv_header_byte": "30", + "adv_salt": "27CDB6CBFC3BF4820E0A953BB46AE4EC", + "aes_key": "F2963BFFFB81BABEE97F57E2264B4D2E", + "data_elements": [ + { + "contents": "2EC8FD8FAF7CF8B52193", + "de_type": 797 + }, + { + "contents": "DDEFB34CB3BB4D52ACBAC8602A8975FFA878FC21E99C", + "de_type": 715 + }, + { + "contents": "9A2F3ECD9492F6C8D7F5A38C4A213D895D", + "de_type": 46 + } + ], + "encoded_section": "709013AF7171A0C034F3DA55BE657C572FBDFD91100079434D607EADF68D155698ED3AC192F49001A96F812E44AB68004FCF2B067BA95BBCA6CC41B11F4B8A99282FFB2A8BE34E170C129E1041CBA3F9E63B426C54D6A2221407494B54F373E2EC8A11421D6AADAC787180B6A076434327", + "identity_type": "private", + "iv": "93020ED0EF291C73688089CFCE540F62", + "key_seed": "64E35F579F6D8BEA4A3B9646779CC1C21EA2D2878266A7EBCB0773976DED9D26", + "metadata_key": "B913D7031986423EB7BF3339608702D3", + "section_mic_hmac_key": "DB938326214EDA6FB2FA5F84B9DD0ADAF589302CAED778C1A5155473CB9FAA61", + "section_salt": "79434D607EADF68D155698ED3AC192F4" + }, + { + "adv_header_byte": "30", + "adv_salt": "74D392DC20C0813FF03FB08EBEE968CD", + "aes_key": "C42393145979EE5678C0F02913E457C2", + "data_elements": [ + { + "contents": "A249A3E9418CE41DC5B3EA515726B651DF5DC1A992B2", + "de_type": 786 + } + ], + "encoded_section": "5090136279969B1461D2CC0840ACCCFAD1B3EE9110006A843ADF7B539F71779C57B18939E37B9002D14999977E208361FEFF91D231EB62DD0B461BBF47B33CE9F4DA9A5466D6FE7142E7A2536B9790A1B3", + "identity_type": "trusted", + "iv": "F2A0D1AF937909CC82BD391A38FB00BE", + "key_seed": "10FA3986A299426275917865D774D86FAD4AFA8D83E7A92FC11B2B454E90477A", + "metadata_key": "59C6C47FE675122BDA465398F91BA5B8", + "section_mic_hmac_key": "26150B11FE754225C2DFD776DA88595D6F59333D7DE50DF56ECC216FAB7BE68D", + "section_salt": "6A843ADF7B539F71779C57B18939E37B" + }, + { + "adv_header_byte": "30", + "adv_salt": "49709E72975E1423DA5EB84983796A68", + "aes_key": "8C3FEDC1AAF1E282DBFBE2A2826F593E", + "data_elements": [], + "encoded_section": "3790136B0AB5062670A1F2CFA73A8A0C3E2FC3911000E5070EE95C545EDF7C37A169D35F7A469001DB7F2B2790C2DCD64A7684D80219EEF7", + "identity_type": "private", + "iv": "52BE6FCAC177DB189EB7CBE873855789", + "key_seed": "E0C4131D54945581E0A6E7053C42B1C20483EB908F17B3F430745224648F0653", + "metadata_key": "2D6FCA5EA2F20F86394769CB9FC4F743", + "section_mic_hmac_key": "E27951578700D0C5D6BA74098639A6AC7EF5F10CE611AA0E490ACF9A21A07D00", + "section_salt": "E5070EE95C545EDF7C37A169D35F7A46" + }, + { + "adv_header_byte": "30", + "adv_salt": "1CDE5651C61DB529D7A871B8F2C0F913", + "aes_key": "E599DE7996E01F12260F13DF78E15B59", + "data_elements": [ + { + "contents": "097A4A5AFB2B6CFDEDD5A15130", + "de_type": 749 + }, + { + "contents": "3D15EB4E149B5A", + "de_type": 478 + }, + { + "contents": "D6D18F999A8934363B5C8FF561A7A62597FED9C6D40A", + "de_type": 489 + }, + { + "contents": "", + "de_type": 952 + }, + { + "contents": "C20A8E031417669DC55C7B5A7E64BBBA59", + "de_type": 76 + } + ], + "encoded_section": "8090135046F9F1E83B423043631D49D56C9723911000B5BD5514A8DE674976FBAC499AAA9F529004B235B4809AACD74289EFFF94FE9DF1B36194DD4B93B2EFAB21D946571476CD1B1A07280EE656539DE4C54CF3E47D9A0C87A60D58EE613F49C5977750DE5011A6BB52C63C6E175695097AC3012E519D7FF2E18445DC2D063666", + "identity_type": "provisioned", + "iv": "6C3A04584261C50FC965FC088BCE4FC7", + "key_seed": "A0862227764FF19586A9C36D4D5EA8AA743ECCA8E0708995CAA04D3BEFED5A95", + "metadata_key": "F5F1E4D56284CBAC633932CAE89D0D4C", + "section_mic_hmac_key": "2D8B8B4C0356D9767D6EFF979E049A139571CA43F70C7FD08DE658501FAB0674", + "section_salt": "B5BD5514A8DE674976FBAC499AAA9F52" + }, + { + "adv_header_byte": "30", + "adv_salt": "B2FC3B369282CA10A016A4F84A430812", + "aes_key": "668D21A8160ABC3CE12BCF6175D086A5", + "data_elements": [ + { + "contents": "5D3B4A3DBD0B402681", + "de_type": 933 + }, + { + "contents": "08666D6E86796DDDD4C185D7CD3B9C4BAAB698D7154302D0", + "de_type": 239 + } + ], + "encoded_section": "5E90134107A4267522159AB8C37627D144A05F91100049DB288036A3BC3695F0F55D0BE639A19002557A8352F4128B631F38921E110A33279C46B3A97E74B9E4537062A4E23BC831A8866394105243C1EC880F62EE49F7E5E4D65BBB01B4BE", + "identity_type": "trusted", + "iv": "924712790182ECC211328405178D9EFB", + "key_seed": "BAB08FAE6AE8EC56D52961D055D99713CF5BC3742FBCA0F5B5DB63ED6D33F088", + "metadata_key": "BF508276E08064CD62E2DDD3CE52419E", + "section_mic_hmac_key": "C0AC82805FD560115A26DADE1F4ACA30E680503F73A730B9573F039B1A8D1E48", + "section_salt": "49DB288036A3BC3695F0F55D0BE639A1" + }, + { + "adv_header_byte": "30", + "adv_salt": "7A1D241939F1129FC8A7BA9692CC15B0", + "aes_key": "02D06DE435FAC2E542496072E93B32BE", + "data_elements": [ + { + "contents": "0FF9683813B3ADB28F18966B3BF4", + "de_type": 221 + } + ], + "encoded_section": "489013E0D22FB9284C2AE55EE6E93EDF4AA41E9110002F2750ECF08560F8382C78B66352FA359001151B5F5F92C8382D02BAFA80C1205644F2A858A39F0576CA5C41ED6FC8F620D78A", + "identity_type": "private", + "iv": "CB1AE27FC7370085ACC737B2D16C3ADE", + "key_seed": "560A88DA8D8D99F0AA9B78F5C717070E814F73513DD8404D2842023C704E5F61", + "metadata_key": "2FCE6A6844717E567B6453D433C396C4", + "section_mic_hmac_key": "3110C125D838A53C13AA866C2BEA9BE4665D3E9917D780C44E06EBB679F0FCD0", + "section_salt": "2F2750ECF08560F8382C78B66352FA35" + }, + { + "adv_header_byte": "30", + "adv_salt": "92318118DA2EEE83E2EF5E45DFB5DCAC", + "aes_key": "6BDD0921765C3F1BBC2A777EFCBCA39E", + "data_elements": [ + { + "contents": "C5F864769C033B1C4C908B1B9486DDA0DEACFEF5C8AAC5088A4B89", + "de_type": 246 + } + ], + "encoded_section": "5590131C9D39D7CA06A454FB1963E0CD54B457911000250CCCF922CFB098C5A4B835742B50D290027433FF5EC8DC7CDCF92F5A5E299F359427BC71F6BCE090A69A8B3FB71149E628FC8F8414C225D8A9884CCE9C3E05", + "identity_type": "trusted", + "iv": "CBDC742C7977835B4958757B70C41CB5", + "key_seed": "7605F725592CA87DE9BAAAEE0E22182AF0623EF1E43BF7C69C3E1B1600A31BAD", + "metadata_key": "52235475342B8095F3E5DB1A9DAD23AD", + "section_mic_hmac_key": "3298422E72C9D0E74C2F9A62D0B2061D7CCDF4C57728AC803D56E327C937A62A", + "section_salt": "250CCCF922CFB098C5A4B835742B50D2" + }, + { + "adv_header_byte": "30", + "adv_salt": "F26D981FC5BAD9D1E76BF8F50E8B6A34", + "aes_key": "6AFA08461D980105081BEFC1BED15573", + "data_elements": [ + { + "contents": "6C3FF38F38B1E556419512BAE94A24293321886158ACB54AB4F606F3", + "de_type": 925 + }, + { + "contents": "13E28EBBFA5679", + "de_type": 685 + }, + { + "contents": "12220C039D132FFA3F990A8800", + "de_type": 189 + }, + { + "contents": "BE1C6812", + "de_type": 825 + }, + { + "contents": "F65EA4C141184E27B5", + "de_type": 536 + } + ], + "encoded_section": "8390134D53E258FB8B450831D776B4843DE2C691100013ED736F16EE6A2CED580FC6659D24E9900115C96C37DF9232D13C0A77058FD38C7904318CCC73B59DDE8D698753D1A81242B9F2D4988F75BD49B1EB7669ADEBB5C943C2B622790D8DDE98ED5CE2F6CE54E24BE94DE1B9DE3702CC611AECECB6124E6A4A8E78F077BFBBEDF1246C", + "identity_type": "private", + "iv": "6CFC6056865E1D43A9F198D6CB5DEB0A", + "key_seed": "2E66473794E7D76F52E4F4EC27BC04B52DD0878E4AE728E030DBA17ED1BF5165", + "metadata_key": "645B2EAEE90C3EDD564BD70CAC5EA05E", + "section_mic_hmac_key": "80802998858AE3DF52E4C02A934CC27B218CB1B83BAF7AB7545B0A3D1A4A1559", + "section_salt": "13ED736F16EE6A2CED580FC6659D24E9" + }, + { + "adv_header_byte": "30", + "adv_salt": "BDD3E6E05FC1EF8F97B872F320EA5EC5", + "aes_key": "C955629D757D92E065B1C843B3E62502", + "data_elements": [], + "encoded_section": "3790134859D4915A9669BAD25DBD6612C483539110007DB7203CE87A8753D5DF7D7B3B9548B390048800DFAFB1AE182D1F43A11B68CD9964", + "identity_type": "provisioned", + "iv": "7379BD491B8D004FD0BF5E572E1086BB", + "key_seed": "BAA5B1933026681281A49FE55D3D359FF8A37B171836604BFD789EB52978C2F2", + "metadata_key": "472C0CE0246A17A1F29A4083C8680C88", + "section_mic_hmac_key": "81106F3E642560B70CAF5243B430480127CA1B1025C1E9EE45E9600429C81EE5", + "section_salt": "7DB7203CE87A8753D5DF7D7B3B9548B3" + }, + { + "adv_header_byte": "30", + "adv_salt": "0324729B74E497693C66C538B8E377F7", + "aes_key": "6A0FD2D178986806E8D99448C6E03D39", + "data_elements": [ + { + "contents": "E779A71A22F13932159115D92842A7432D9273B15F9EFC0E", + "de_type": 5 + }, + { + "contents": "5AB6447296CE47957BEA513C4A78D7DB718DF085A3C5B6056313C5E97A3E", + "de_type": 164 + }, + { + "contents": "9BE2E0FEE14367E5F9904AD071327559AE351FF343", + "de_type": 492 + } + ], + "encoded_section": "8A90130B1EAC69A3BBA0198791DFD7ABD975CE911000504754FB80080D08BDF20CFB89BAE2F4900232633668B94BD4B723F1A0C2F64D15F01A1121E86CB529C8C08D097252B3A5CBD6B1EA4797372EE51F4C8E0C11F6C7B15957C920FD00950144724D287E5A45893315E3E6613BF0A55F55E6F7E156A879A6EB7F31136810B1F31252E60E4EE8AB54D529", + "identity_type": "trusted", + "iv": "1EA7A7228D5E0B9BC2C467DE0F3E8D7C", + "key_seed": "DE985E83ED8102B2850B579CB045EB10DCDB95A908CD2C11A3EC2AFB5C65D264", + "metadata_key": "43C47B2AEFE02C363B05E235A6BD410A", + "section_mic_hmac_key": "81B93FE732216DCD0036BBFD425D451A502DE7BF6834110FC665CD07E90806B7", + "section_salt": "504754FB80080D08BDF20CFB89BAE2F4" + }, + { + "adv_header_byte": "30", + "adv_salt": "ECDD1DC8D4FD989DB4580FFFFD4EAF58", + "aes_key": "26343238F4AE3E3E5F07808B3B012394", + "data_elements": [ + { + "contents": "19EEE80B7E463D4FA91175C1201E05ED27AD", + "de_type": 418 + }, + { + "contents": "138E9FFB3689657E3D2C4504596445", + "de_type": 313 + }, + { + "contents": "C96F4E4F9DF91F8DC2EA8AB25A49D112F5", + "de_type": 272 + }, + { + "contents": "3BF1B1D5B80FD33B4E13EA34AFD2B04997", + "de_type": 607 + }, + { + "contents": "60E79858BE9E3880F5840B8EDFA2AED9A1", + "de_type": 657 + } + ], + "encoded_section": "9A9013C071629B70BA9DEDE2D6BE7C3EE50A89911000CFBC29C1DB6233359093D46F6B6268729002AA827CE8FB3E7D10578627C549FC3EDAFC546CF7FA5C5B8774321832389BC08CF65BF7008E138B2229C21112326A972D327C3FCEC4A5E447465FB6FB2A3D65F7C53D0BC3A7DE1664B0113E3E3F05DAFACF935775E1D7CEE288220BDF2920F1C0B6F0DBF2B7300EDAAC262A35D2207A9159F577", + "identity_type": "trusted", + "iv": "5D4306FF65CEFE2E7C434BB00E18B020", + "key_seed": "509ED43FECE08BE6BF6379CD1778649C806AB7266610F065B2A6365442DCC4A6", + "metadata_key": "A36A66D7F731890EF9193D882DE89F1B", + "section_mic_hmac_key": "FBBE31414827EFDAD0A31F4BDDD281C958AD680F43AA856DD0319B01961F2E6B", + "section_salt": "CFBC29C1DB6233359093D46F6B626872" + }, + { + "adv_header_byte": "30", + "adv_salt": "876404A488F733AFF2480B84937DC32B", + "aes_key": "F9AD44914D756A3E46E6BAFDD137CDA6", + "data_elements": [ + { + "contents": "804E497B2E573E7F2E93CE434493E636", + "de_type": 446 + }, + { + "contents": "70E3CFF3391999B63BB8F6FBF914969C40AC6A8B69A388CBFD5B5667BE8B", + "de_type": 144 + } + ], + "encoded_section": "6B90133B3BC844AE809C69DD3FDABBAD762AA49110000330AE82E82A5CFCD43DD63947D7B25D9001D96A4D7255C420618CE01331413D4D7428210A004EAF8BA0A2B41DE9129DF151FF58CFD9BD8626FD3201CA27F55156CAE585EC593FA08E260A9591962B7F7F6A28FFFAB2", + "identity_type": "private", + "iv": "F4D1BB95A18F23894E8E694B2C95FDCF", + "key_seed": "E1B4FF787998B33BD7E33250E2386F2BB8A0491EEC4CDF640A2879D09DA19E8D", + "metadata_key": "048E9FBB34067F84D69B4D14ECAEA6D5", + "section_mic_hmac_key": "D606CEE9D49A0D1DBA0E7F07022FF962F6F6DB04608FF2437F2AB436C4BD007F", + "section_salt": "0330AE82E82A5CFCD43DD63947D7B25D" + }, + { + "adv_header_byte": "30", + "adv_salt": "68E03983FBB92FD3B3ABFFA9B536FAEC", + "aes_key": "79F938C4FA735CA8FF0AB1C65AFA5116", + "data_elements": [ + { + "contents": "F2E5FF2AB3237D9375F716D5", + "de_type": 490 + }, + { + "contents": "9D808B5A5BBC1473FFB8DAAB95FD4D9FF675A1DE9A40", + "de_type": 905 + }, + { + "contents": "B90F45006C8FBC5A50DAF69EC332341C8FF71168EE6970523C6C548D6371", + "de_type": 128 + }, + { + "contents": "E541744FDDA8A39D91664C22A2C359BB8EDB4DE026", + "de_type": 496 + } + ], + "encoded_section": "989013DFA3B7763EB39454DE5B2D1F11C74D459110004E4E42F39F331D403DAAC6FD2012DF5890026C8B35E350004277C3C63E5791CE1D8DF6EAF71F950F24A66EABE93ECA5E8BCD39470A09686924CC844A27FF303F73F9EBC2F1D8B15BB2844F4BE645F215E58105A6AF75A88234FEC0E4E83257FB377F595BE77CA1ED1735F929F928138D0AE987E2B094CAD8C91D20C349B2291D54397F", + "identity_type": "trusted", + "iv": "0EB2E5BAE1992B95A34004153725D67A", + "key_seed": "BF2D76E1C94D308C2E27207081573B6C5B18749DCEEAE1CC6858E044396DAD75", + "metadata_key": "766DDCDA99EAC37E0B6715030718F389", + "section_mic_hmac_key": "65F998A2F910AC50F14613F0025A14062D5FD55D2BE2445E01DDF2AD3AFD4CB3", + "section_salt": "4E4E42F39F331D403DAAC6FD2012DF58" + }, + { + "adv_header_byte": "30", + "adv_salt": "F512FD19534C6D30B3D6B6C64F735252", + "aes_key": "C919354EE8916B537AF0C80B01CDFE3A", + "data_elements": [ + { + "contents": "97FF5DD7CF10CA400439FAD93E73DF7BF31C0840B47CC8625908F64F9D", + "de_type": 884 + }, + { + "contents": "E17E6D5BF307A79257F432B833BED7631896236A77DC8991244F02BF28F1", + "de_type": 773 + }, + { + "contents": "128F4E5BF9574E0C5D3E0C287DCBEFA2146ED9", + "de_type": 43 + }, + { + "contents": "F19F873AC214CF412446FCF92FC26F4F96", + "de_type": 989 + }, + { + "contents": "0090C56C3B45810987944B0D74EF0CE7BF771A24A4", + "de_type": 996 + } + ], + "encoded_section": "B99013C5864027C79888996629813A4E22D8FE9110005A6F75A015A7BD183C08ED51EA3406A890022FF7107FDCB387636B67554BA545F04F63A89E41B3547AC27E871BA24BED6B4E347E83DCA86FBB188B18EFEB48E6CAA8923090905BC4974559534DB81313EB69E94BDDC2F397E1CE6247259C046D724DB1AE74ADAAD252F57E477A3C5FD472690839152E8D8571B70C0CF9F486E0125BD74B3E5535D456C966B61E6045995F384D61A2CCD360DF06CB3408A43BC9EF24F861", + "identity_type": "trusted", + "iv": "AC1E6DEE532335A11CC00AA26D211142", + "key_seed": "0654E589CAC8FDDD66324A9E33795A884AB11FDA325C6A1FFC9184981B547C11", + "metadata_key": "BFCD84710DFB3F2C3BF10DFFF9E1DEFE", + "section_mic_hmac_key": "FE6CC88BE6EBD51916AADCB0525D7C7F817DFB061781676C1C5258D466DF7CD6", + "section_salt": "5A6F75A015A7BD183C08ED51EA3406A8" + }, + { + "adv_header_byte": "30", + "adv_salt": "1020365708197FA134F58032B0736A93", + "aes_key": "23C5D746F33EA244CD01AAA605FC0D12", + "data_elements": [ + { + "contents": "D6D87CC0", + "de_type": 969 + }, + { + "contents": "F19C90FB", + "de_type": 138 + } + ], + "encoded_section": "4590130680B536392B1C55C8A39F7575ECD678911000AB790910EBD2510A516A52F216386F5690024C190A81E7249A478324EAD802CC0A72F631AB3ED55CBBC330E0CA3ED6FB", + "identity_type": "trusted", + "iv": "18E15943B98E5BE79E0726008C289E41", + "key_seed": "E7ADE77256E2288534314126F088557EBC87BD3E0034FA36B5E2E414B2BD3089", + "metadata_key": "243CFFF6C8ED39CCE1D20ACEE1E8C6F8", + "section_mic_hmac_key": "90DC367708ADA4748D498E819BC4218C62FA48A828308197F421D9B13B3402F4", + "section_salt": "AB790910EBD2510A516A52F216386F56" + }, + { + "adv_header_byte": "30", + "adv_salt": "F3F2711088CD0EE74DC97A20DAF1C2D8", + "aes_key": "71FF934D1E8D517FBE367CD46BBB17F8", + "data_elements": [ + { + "contents": "A302", + "de_type": 512 + }, + { + "contents": "01F2F27578CA1CB5AEA3747DCE36EEB290376B14E08854", + "de_type": 770 + }, + { + "contents": "C712547AEAA2158286610804E3EEA4C1071F90B9178F4E93E6F8", + "de_type": 622 + }, + { + "contents": "8338102992C864649A9D8A78C497490CC8EE5750E12EF9", + "de_type": 962 + }, + { + "contents": "BC3B3A70C610A20D7C", + "de_type": 754 + } + ], + "encoded_section": "999013DC39E4693F8C1317955AA5920150891A911000B7A64ACC26B3A13A6E1EAF8566807D159004E9CD0DFC4280A635682B3A8DC254119A26AD228C86A032FFBFE926391FD32C81741EF29655A09920EA7FB7090E73359C6B1E61D67D4ADA3BC78F124E1829F6C877453C1200F4FBCA32D7514AC9C2A98F5CC300760F2B114FA5A39701AC236A8E15FC028169E8A7EE42A72EF54829AAB35F5D", + "identity_type": "provisioned", + "iv": "A4AF64AE89D6ED2187780610289F118D", + "key_seed": "9A118BA5B630A910A034F4CF3B9244F57A23BFD59FC0E4934F672CD63E020145", + "metadata_key": "9815FBD7BB8FA24AF2053C9D01F8862B", + "section_mic_hmac_key": "AD345DE497CD73EAEA71EA56EC7098FFD71E65A87FC7B01247643435342EF5C4", + "section_salt": "B7A64ACC26B3A13A6E1EAF8566807D15" + }, + { + "adv_header_byte": "30", + "adv_salt": "420F8EDDBCEF536ECFE0823E0A64150E", + "aes_key": "3E58CA6C9C2E9494CDFDED070763FB07", + "data_elements": [ + { + "contents": "C41B59CE2AD957CA07959684FB6D5E3FDE89D31EDAE877", + "de_type": 280 + }, + { + "contents": "D0DDD13D28FB08B9C19C290C3347", + "de_type": 120 + }, + { + "contents": "1834", + "de_type": 45 + }, + { + "contents": "A3BFD5AEA1634D500CD9D436", + "de_type": 896 + } + ], + "encoded_section": "749013C498F161B727AABCE678B9D94DFEBB0D911000873C3CADAF81A693213597DBD9C53D8690019FD0E7986B2509A457A42866D34E0A892FE47105171A1CE2A245193130B6A1FEC7A6F485EE8AF0FC67ED58B9B732DC93C2671F682805343994C0CDECB5D6E725698F135192C657C569FD81F0CF", + "identity_type": "private", + "iv": "22BCDB28787B9F7343729B59C9F06F87", + "key_seed": "5D3AA5329E3AD5BC9A4C16E276FED94699221C782DBFDCEDEDFFB81FB32FFAFF", + "metadata_key": "CDB698B8C76457DA2631586E44409C35", + "section_mic_hmac_key": "81392F1B099B77B1D7DD7EF7B8C9E58CB4A2444C56CB40D955E238A2BBA5C39E", + "section_salt": "873C3CADAF81A693213597DBD9C53D86" + }, + { + "adv_header_byte": "30", + "adv_salt": "D2F959AAB5DE3FD53094D768D669B969", + "aes_key": "DBE6CC0A7A07592FEBAD3CFF364A5ED5", + "data_elements": [], + "encoded_section": "379013D2960FA7CD8C566FB6722FE0AFB4BDA1911000C5272B1D1A6B168B77D90348D5A8F11E9002FF37EC6DB5FFE7B653EC43A49A0F079E", + "identity_type": "trusted", + "iv": "98C8F75EB86F93E39301FB09266AB286", + "key_seed": "4CB698ADA80C2A298CE7F3C7AC4EE3DEA2E3152F314DBFE595FD550E8895383F", + "metadata_key": "EB0F5B5FB454BA99B963BBC853069E33", + "section_mic_hmac_key": "37E1AFAC60FE9EB5B3976AD6DE229A72890F74395CEB0354DA6E39E24251F5D4", + "section_salt": "C5272B1D1A6B168B77D90348D5A8F11E" + }, + { + "adv_header_byte": "30", + "adv_salt": "14E183839363D1DC8DD63971B165D847", + "aes_key": "15A23D3D9E70A3323BE7E5E0ACF62EAD", + "data_elements": [], + "encoded_section": "3790138678FBDD1D4B2FED10D2044D7E75F2D1911000E67C5ACF5A491028D74192897BE7C8C89004FD23DE541F708C9F0E8412122769EF79", + "identity_type": "provisioned", + "iv": "853E925894CF1B53548A9547B9D5D2BB", + "key_seed": "59DCCE265D17F292C21FDAB1AE190050BE79B24CA9598F341CF3CF28B54C65C0", + "metadata_key": "CA9C149B9147EADE4FDDA3483B5CD694", + "section_mic_hmac_key": "AFE7942059529B6761E08237FD3DFD1B1E5375AB75D993318B04F92DF26CF4A8", + "section_salt": "E67C5ACF5A491028D74192897BE7C8C8" + }, + { + "adv_header_byte": "30", + "adv_salt": "0EF53E475C49FF12FFFAD62075DC0D5D", + "aes_key": "E7EC797302AEE2AE931B498246B49B27", + "data_elements": [ + { + "contents": "03BC28F6", + "de_type": 538 + }, + { + "contents": "78", + "de_type": 119 + }, + { + "contents": "7E", + "de_type": 436 + }, + { + "contents": "140001B5FD493CCB4EF775", + "de_type": 67 + }, + { + "contents": "A82250F3EF3A3EC7AD986144C53E1385FDD7E32920DA628A36E7C4EC40", + "de_type": 177 + } + ], + "encoded_section": "729013E7032F673DF5F16041DDECC78F5ADCA691100099970A2BE5CA4702AB5F94CD52BA12D29004856D9D48E7BA32C0E1D609F1077585A0386531F8456FD5716E5B16E5025A50A2866307253B298F8FEE9FD51C4E2C15FFBDA0FDA07F1B72402FDB1021BDEAFC707FF2E398B0125E73C43D08", + "identity_type": "provisioned", + "iv": "9A6B50EE556D600EBFED50255A635666", + "key_seed": "3CD3990FBBFE4A88391309E9A3314A987602DB087E403C9AB34E5EDEF94E20D8", + "metadata_key": "4A1BA5934FF66FB454D46083D338B99A", + "section_mic_hmac_key": "357EBA3A7167F44A6BE8E10DBF1EB509A0DA2F1998FA8DD0338BD2DFC20CD716", + "section_salt": "99970A2BE5CA4702AB5F94CD52BA12D2" + }, + { + "adv_header_byte": "30", + "adv_salt": "9E5270F2FD83C70EC6A8316A5B3DA3F7", + "aes_key": "BC2F869516A306EAB00FC86189F94B33", + "data_elements": [], + "encoded_section": "379013994A578360FD876E664C89C68C4B4A94911000029A499D61FE555DCE2FD9B72E293E7590025902F37B71C8D6336FB581272FC20E0E", + "identity_type": "trusted", + "iv": "EFACD81C00A66A18B186EDD153827783", + "key_seed": "132CECE9A4A70E8BA66CC013D3A7802E0C394E2CB6FF70934B7FE0793D87D365", + "metadata_key": "2D71D02CB1BB8194F317CB46FE0F91EE", + "section_mic_hmac_key": "6BD9C9248FEB3255BB7A215A55E5A75B6E6BD1D2DB77CAE09E0A7082042CDA56", + "section_salt": "029A499D61FE555DCE2FD9B72E293E75" + }, + { + "adv_header_byte": "30", + "adv_salt": "21C3D6A19DFF28652E68CCF2EB17B6DF", + "aes_key": "03C7A896A16535EEC2C6A351C3C17401", + "data_elements": [ + { + "contents": "1F896905", + "de_type": 229 + } + ], + "encoded_section": "3E9013756F991A26E044E25C8F3A005852033F91100068CBC39EBC593EF92F0A7852D4CFAB2E9002385D85A14F31B33F8EFA86FABAE5B8CDF1302D8D83AB8B", + "identity_type": "trusted", + "iv": "54BD3DC6A8F78CEDF672FF5722264019", + "key_seed": "313399F9F3EBA494B79B76AB2EC128CA4F090DEB39FAA941B6BF1C5D64C3D21F", + "metadata_key": "E975C7A248514BB2EA89E1F61CCAB17C", + "section_mic_hmac_key": "CA509CB5DE76153AB5AB8605FF2B18119515FEC7667E42D1EB783847D9E7BFCF", + "section_salt": "68CBC39EBC593EF92F0A7852D4CFAB2E" + }, + { + "adv_header_byte": "30", + "adv_salt": "98BFB3E0F0510DFE082F97B7179DA50C", + "aes_key": "5494153569CE0A4AE2EC9504E949F5C1", + "data_elements": [ + { + "contents": "893281811CA83052DCA1F09C4BB9F66B979F", + "de_type": 891 + }, + { + "contents": "DB4CBE98092EB7FA4E53", + "de_type": 679 + } + ], + "encoded_section": "5990137998FC158FECFA5BA42953873097E86091100031BFE75E39CC61D315D73D7D17637BB59002E498BFC92B873AD59BF1A8B4D00F2E3C223B9D764D32AE999EB9407B7C5E10ED655EFA33CA62B9AD7FABBD760AB4046F32C0", + "identity_type": "trusted", + "iv": "71319F6EE32F01F7442755A48314D90F", + "key_seed": "DE2E4CE127E2C5B34556CF992FBD5A97A9ACB072210657E6D7234CECEA835947", + "metadata_key": "28AA7545DCF4B6861C4379FCC6A51547", + "section_mic_hmac_key": "86A9DFAEF782CF536B2BCA2E2B70280C6D001D6E79C7E1286DBD3BDF0B273EA2", + "section_salt": "31BFE75E39CC61D315D73D7D17637BB5" + }, + { + "adv_header_byte": "30", + "adv_salt": "F792CC0735D975CBDAA95FDEED64CC34", + "aes_key": "6CFA85E9D7E5F331492B7B7EA0FEC8F7", + "data_elements": [], + "encoded_section": "37901374CC86109CA20F39080D2176D95C0A399110008CFBEA96CDC8317DFC83180AEB0E3781900294B9DD5B5BBBE70EBDBEF59583D9DEFA", + "identity_type": "trusted", + "iv": "F2BD046CD8B55DE3DA138D23F2836888", + "key_seed": "217BC510C941A4F4CED29FC8918C5DA9446B947D15241150D615386A80A5DA07", + "metadata_key": "2E50D416BDCF795FD7B5543B26FAEB27", + "section_mic_hmac_key": "7CDCB29ED9C12538B161F13A6E8CC784700FB5FFC7E2DA4F6F34FD933DBB5D77", + "section_salt": "8CFBEA96CDC8317DFC83180AEB0E3781" + }, + { + "adv_header_byte": "30", + "adv_salt": "0459E861ED82466586CB38BA820A08F0", + "aes_key": "E2A53ACBF8D874D7E3446A77DAB8C00B", + "data_elements": [ + { + "contents": "73C550", + "de_type": 154 + } + ], + "encoded_section": "3D901386F0FA8E4C1631979E805860E37B810791100053C835177E42543EA07364331BDB0B9D90026DBC4D371F252DEB9EC232757C0FFF54B0AA5AA7D4CC", + "identity_type": "trusted", + "iv": "42A1D51EFAE859C62164F4D13EFBB665", + "key_seed": "0BF7A81876C2775C3D1A8BF926D2B32C6EA0BFEA2C677DECECA4D82A40627CE5", + "metadata_key": "DA02A311B1BE6E2FF7F35ED04F2BA935", + "section_mic_hmac_key": "C224D779048C9F41DC725298EDC634A13F54D0726070153C90AF7747543ABB7C", + "section_salt": "53C835177E42543EA07364331BDB0B9D" + }, + { + "adv_header_byte": "30", + "adv_salt": "716BD818239FEC609FD83E0E655D99DB", + "aes_key": "E510FAB4977C76912B8A434666935A8E", + "data_elements": [ + { + "contents": "36B8E05F3ADFC6EB9748E93DA4CAA90DFBA993E4A623B5387F", + "de_type": 773 + }, + { + "contents": "32DA679152", + "de_type": 979 + } + ], + "encoded_section": "5B9013DA850EE1EE94DF5815178A410C55BE0C911000E78A10BE08D7C230574BD056D8478F8C900496535593BB99B5FF19FA00B4673B4EDA76BFA04DB8DF0CBCD14807D518F0B500206AAD90F34FFC1A1CC22F37C9057C4642D732AE", + "identity_type": "provisioned", + "iv": "96F876599B14A21FC060A042F5E134E6", + "key_seed": "F9A248BAE31270E5C543E5EAE28C6552E62BF7DD99F7BE518B5CE78D52C535A8", + "metadata_key": "41CE67094AA58CB68886D68D0193E9FC", + "section_mic_hmac_key": "ED41BD675FE9FC9D386D5F7BDF85A090E0CDD06C654B74F9A925466A616B314F", + "section_salt": "E78A10BE08D7C230574BD056D8478F8C" + }, + { + "adv_header_byte": "30", + "adv_salt": "7F3CC424F187398A9D04E051B12744F9", + "aes_key": "32FE6B6BFDC54C7C3D190731779B9BDE", + "data_elements": [ + { + "contents": "9F8CAF983F9440011F44B7C1E739BD66CA201CD553ECD202C61CC3", + "de_type": 597 + }, + { + "contents": "86636F77095B43A7D8CF9409D3FB56CB184EF894C68733", + "de_type": 351 + } + ], + "encoded_section": "6F901363F63944D3D3B62852E1C29317DC53B4911000D1CD81A105ACF9921968705EAEE9D92A9001DF86E28C415ED0E45F886965EE16475E0C63561C5D876E9F6E5B24E64419C905FCABB21DF8039EB945DC929888A4C7AF8F4729023C726132918DAD5603E12E1A152D57961025B1D9", + "identity_type": "private", + "iv": "5FEB88C9EE2B3558BD1E1CACF0CE8DB7", + "key_seed": "8D82AA87D9535AC9B95629FF003748F0D846D09DCF4577EEAD0F46351AB74B41", + "metadata_key": "4B7CD0359387387945A934B6DF464C8B", + "section_mic_hmac_key": "ADAA329E70F13AE3122A74DF74E84A7C6F1EEFC966617408BE3FC279AC4BB8F6", + "section_salt": "D1CD81A105ACF9921968705EAEE9D92A" + }, + { + "adv_header_byte": "30", + "adv_salt": "FB3D9837C28AC67707ACFE168B79802F", + "aes_key": "DE1ECC3710EE70A72F458CCCBE684022", + "data_elements": [ + { + "contents": "311806935DDC", + "de_type": 932 + }, + { + "contents": "941A", + "de_type": 262 + }, + { + "contents": "4B70C0E6758C665694CEF8D27E2169098693AEA61570C940FBC453", + "de_type": 20 + }, + { + "contents": "BDF524A91132073481B23A0D20C19E3E57D365C37A90FFBA8E41", + "de_type": 474 + }, + { + "contents": "9C36B683253A6AADD79843", + "de_type": 965 + } + ], + "encoded_section": "8D9013794200979A65FAFD9C31FEBA2DACE1B29110001C6B6EF087BAD3E1CF545DF1A9A9CE99900432FAD109DF59A7DEC426A1DB051FCC95F420A321410D13AA0FDCA4E22DC7A7D6873AE13CC3173D14B2BB9CE969E9B0A8B6745D7E913D03BA9031E8EE7A09BDB9689C80DD630CF7D193B233F3F3F1ED1054D9939D8EAFB7EC55BA71A7103F7961A29A1C26B888", + "identity_type": "provisioned", + "iv": "4EF171E764B3E218255391C9D368765E", + "key_seed": "FAF02B1CF86D9A97BCF9E2C0FE5850688E3D49E53616224ADE0238C91860371F", + "metadata_key": "07D64CAB902E683E5C6B3BDC257F2ECB", + "section_mic_hmac_key": "01108F72B3239D936073126F7DA309D55A68509567CABF6F7742DE6B12154D8C", + "section_salt": "1C6B6EF087BAD3E1CF545DF1A9A9CE99" + }, + { + "adv_header_byte": "30", + "adv_salt": "38E22156A8185E55F335A47037F8E2F7", + "aes_key": "6CF70F3F165CE847A9C63F50D8547C21", + "data_elements": [ + { + "contents": "4D8D46ACD86C6961C4094DCB13D4E916F3A83CF8", + "de_type": 508 + }, + { + "contents": "C4688F335D", + "de_type": 78 + } + ], + "encoded_section": "559013CFE4D705FD9D6A0D8079500CE2E92B14911000C625AEF2F9BD3C56372C63173571103D9002D5600B9D26063F4622FC6CECBAB259B3BBD63F3B3E304465A897B891B7DB0039B8BFEF525691FA300DC955A09E17", + "identity_type": "trusted", + "iv": "33820EA628D605D7F5DF12E15E0F202A", + "key_seed": "401411AE44BA8795773F4EF0049F07051344BFE4C7255D4E7D975C63738B27E6", + "metadata_key": "1B003DF5AFD3B438F2D367697DEBFCEA", + "section_mic_hmac_key": "23BD2994A6DC828B1115E7CF2D7A2197ACDFDA21D8030167F845E9A42461EF51", + "section_salt": "C625AEF2F9BD3C56372C63173571103D" + }, + { + "adv_header_byte": "30", + "adv_salt": "4A5CE7E83CA2E1C0B57C8E06D0E6F742", + "aes_key": "F085865AF5C9A124298272AAC0C459F4", + "data_elements": [ + { + "contents": "EA412396D4", + "de_type": 360 + }, + { + "contents": "5B36B6971907900EA4D176E7F96C99C6075CB81A", + "de_type": 151 + }, + { + "contents": "7672075A67196562CFA6A05A1C9A803FAC914E665661", + "de_type": 669 + } + ], + "encoded_section": "6F90135C5E8470AB022D8D60D1362A898BB18C91100072034CD97D55545F76310C999D548F7190014D3248EE4C4B1A52F45BD578C3AFDDDC2F3213EDF205D719FCFDD964A9B580DE8DCF620F5E3B7386389CD569E2CB17B8BA70FF1B739080481A336376DC599322D9952717784ACDA5", + "identity_type": "private", + "iv": "6890DDE4612EEFF53CF9BAA9A0A57B20", + "key_seed": "86589F54F57C9F0AB5245C0F6635B611F802EA256A94441B12160C2605AA2D1D", + "metadata_key": "DDFA0DD062ABE2CD427A72F1C1F81DC4", + "section_mic_hmac_key": "0FD9C77FE8E953E2B8526DA6414A2857E02A4A3213F2BB484799E9CC977A2219", + "section_salt": "72034CD97D55545F76310C999D548F71" + }, + { + "adv_header_byte": "30", + "adv_salt": "4ECC54C7A3A3EA811EB6C2D753C41C19", + "aes_key": "5EE028B37AE8B25ADD419427E31E23AB", + "data_elements": [], + "encoded_section": "3790139322D0756986F1FD123C6B04CDF3EAF091100057FFD16AA68473D0582E5BEEE3868910900201234FC414E25E21A3EFACA4A5E5A999", + "identity_type": "trusted", + "iv": "87F0BB8A2FCD03EFEE2AC5C1453F55F0", + "key_seed": "598FF7D9FD66BA3E660DAEB8B3E5C6C82FA6AB758D3D1076691C4D0542EF067F", + "metadata_key": "9857B87C8DFE289C01F9F9708B692FBC", + "section_mic_hmac_key": "1F7BC70DC4FB9665A7E21929DBC300EE2F91AA7A7AA775222A26149F60EB5345", + "section_salt": "57FFD16AA68473D0582E5BEEE3868910" + }, + { + "adv_header_byte": "30", + "adv_salt": "C73AD85B0EF01E161F1E7764010C1EA5", + "aes_key": "79E30C89ED65C6F40882254563A75E17", + "data_elements": [ + { + "contents": "18609C222BA9D3D5DB036F555AB0CCEC09ADE5179EC2CA9F", + "de_type": 99 + }, + { + "contents": "EC187ACF3F4C481BDF000D552EB3", + "de_type": 658 + }, + { + "contents": "BF556150F61584A4CF7A5C624E", + "de_type": 383 + } + ], + "encoded_section": "7290139ED0E2B0FDC39CD26D661DFFF11234169110001E20C1E816FA9F2D34542BD1BCF7ED9F9004EAACB664A85B0349C8431A0EA7D7E87FEB22B32F30C074D0285840584A1026F19E1DCD4BF133020C1550E42725C77B4E6E60DEEB1A354FEF5E481E41075F40D790546805FDB5F0CF6EB7D4", + "identity_type": "provisioned", + "iv": "C430A8DCAED7C039B0E33CA4FD4F093B", + "key_seed": "EF0BC6EE51E35093FA4C893AAD43B1951B91C650EF6D401C7C03975AA916A507", + "metadata_key": "0FCBFF2F8DA457F6279FB66C50203DF3", + "section_mic_hmac_key": "BC9E4B32DAB0A23BF9FBC776DD2AD5530E1AE56337FB5DCBDA1FC45E5C34598C", + "section_salt": "1E20C1E816FA9F2D34542BD1BCF7ED9F" + }, + { + "adv_header_byte": "30", + "adv_salt": "2B287CE2F08F4BCCBC505B6FB2ABEC15", + "aes_key": "A2391D2B8D95B3B22079BAE241145DF8", + "data_elements": [ + { + "contents": "2A6C741FAC614B55AB5B", + "de_type": 746 + }, + { + "contents": "B82E6D8CFF3DEC1962D2CF4134A7D30C04F4A3", + "de_type": 972 + }, + { + "contents": "A03D72AC4A8A200BAF89714A92FC5BC3753529", + "de_type": 271 + }, + { + "contents": "C89C68F269FCE8", + "de_type": 462 + } + ], + "encoded_section": "7A901325D43FF30DB60387156458D420A2551C911000F8647C38B6266104D6ECE9E5CE7E879190015383810EBB8184B419130D8EABE9C911D7EDF89EA2A9008D98C5EAA9E8D2B550252267595D53A0BC8E7AB281846867F6A54FE0A048F208D38F660D69E6341DE617223D80A2D2B96947630EBD69EDE868FBF659", + "identity_type": "private", + "iv": "FE04A94DEBB042153B2C96CF5D4DE41F", + "key_seed": "F37257303C8330286B67468749200BD24155F76D9EAE8CF6F4A1B11632F9461E", + "metadata_key": "7216F11C49F946FEF51139ABE587B632", + "section_mic_hmac_key": "4C21C99F1C75A9641AE865D73D38BAD22B11A67009ACDFD40F8003D80CB6ECC6", + "section_salt": "F8647C38B6266104D6ECE9E5CE7E8791" + }, + { + "adv_header_byte": "30", + "adv_salt": "A1133D9CB487CF507E85AB45A5225A3B", + "aes_key": "E2BE917DE14406C0FCF09FC4FDEE1FF5", + "data_elements": [ + { + "contents": "71238E", + "de_type": 839 + } + ], + "encoded_section": "3D90132C5CB47E0A288D59348CA9F66DC3AF9A911000523C6B069BD40FBB9C6BF1C8E10865E69002AC2424CD59DA02E42EF7E44168236A9C325B591A7DE3", + "identity_type": "trusted", + "iv": "FBC8CDB92CE0F89BBFF8C1BFD00F6541", + "key_seed": "F7982DAFD3732E72F79D778A65DB2174686D0AFC94A8FDD356DE6B74B0917497", + "metadata_key": "ABDAA0345C02A6AF84BBCCE12BDBB38E", + "section_mic_hmac_key": "55EEAD0385A2BF321ADCB7C14075438ABB04AC96A68B93A9F2C53490431561EE", + "section_salt": "523C6B069BD40FBB9C6BF1C8E10865E6" + }, + { + "adv_header_byte": "30", + "adv_salt": "BB53EC5F4F7ED20F852C88CAE0D7D2FD", + "aes_key": "27166277389D14C33C6EC6FCF087D4DB", + "data_elements": [ + { + "contents": "8CAD688B88D91C820CC9DDE89763", + "de_type": 976 + }, + { + "contents": "8430D62B44C83C85BDB6697D00A8A53518CD8DA7FCA68AA1AD6E", + "de_type": 166 + }, + { + "contents": "7A0FFFA6068B33AF9AEB4798863FCF", + "de_type": 957 + }, + { + "contents": "7AEF9A74325D4192B1B99E704D9FBDEAD1C027388D8F3B0E7FC72BE44A", + "de_type": 533 + }, + { + "contents": "0AD6320E89875A983E2B1507A7F212C5AFE5", + "de_type": 177 + } + ], + "encoded_section": "AC901330A161EB463AD006A1F925054A3A0F8A911000BB38DF610A30BC926FC6C4582D37660D9004243511EB4B95CC7EFF1E37F4559CBE73254459AB1A8AC32FDE866F96C56D5299D575FEEC58639D153EB6466758D10465A65674923DD5BAAE80B5D400AC70B2965FBA05961B31D9C3CE295361741B5DA19C60A13C103B0DEC97C664FC391A1A105F6E8A4FC70CA84EC842DFDBF8B6A86B21DA28E828F78F23DD27F8EC040A6D26309D9BCFB3", + "identity_type": "provisioned", + "iv": "E5930F69FFAF33C673D10B1BCF790387", + "key_seed": "928F3472A71D094F7842799035E83349496DD9963F46E4587FC0BEC618BC68FC", + "metadata_key": "0B9BF0598FA164D48423A5A07C65D3FD", + "section_mic_hmac_key": "FBCAF9F7E6996F5EFF05649E26A30814CF72CA895BC9B6B19B21BD433845D247", + "section_salt": "BB38DF610A30BC926FC6C4582D37660D" + }, + { + "adv_header_byte": "30", + "adv_salt": "D0BA76FCD350C9F9F7951F23F2C51481", + "aes_key": "35C13E514AD41A4D733FE99E7D1AD0D8", + "data_elements": [ + { + "contents": "1D84D057F7999067EA441E2ED2E55BAAA302AD", + "de_type": 651 + }, + { + "contents": "D2C79A4B046101959D", + "de_type": 695 + }, + { + "contents": "1B1C33AF7CD34DAA62A8B03451EAB120EF9BD2B9CE24D8240CFEBEE8ED", + "de_type": 566 + }, + { + "contents": "8C874DFF95B449C595963601D5FDB2", + "de_type": 315 + }, + { + "contents": "E805B80A4D8759A73DEBFF39B881152CE26BC2D440", + "de_type": 42 + } + ], + "encoded_section": "A2901311EB79E0E8D59F0B3C047B92D8CA72BF9110009A2C839A95308FA66A28E37D5346161F90015F33031A6C9AAC27A4B2179E39E69DC705D70EAC406CC05F02C776643CC00D087180158DE32FE190D0DEB2D2DE6D2DEA033605D6CCF77D5207F406C872A1CA1DC19D97DC4FF2D4C3B6CA4548C31DE16C35EEF910818B982851FCF6DEBE5C4C9BA458D2AA51F3B55A5A909E2268580D8AAAAC6FD0ADFC16FCD8BADB", + "identity_type": "private", + "iv": "14105F10774008066E6F963762594EE2", + "key_seed": "6D3436A21EC875EE57134E1DECAE0C2A3B1496945F8D1E11BB96B92F7D47246C", + "metadata_key": "888F65EDB3AB4C3A68E0823136F3D256", + "section_mic_hmac_key": "A7498162FC9BD07510499868B87AFF66AEB0536EF48116381D1CD09EEED03935", + "section_salt": "9A2C839A95308FA66A28E37D5346161F" + }, + { + "adv_header_byte": "30", + "adv_salt": "08B3CEC91E020D1D4484B0343BAAAFE3", + "aes_key": "B32745DAAEA6C4E7D467DCC28E7BDB1A", + "data_elements": [ + { + "contents": "DE5A73510005E7983B15546A1C8978D6", + "de_type": 238 + }, + { + "contents": "6551FCA60C84C5227D009AE786796634EF3DE920CDF7CC", + "de_type": 993 + } + ], + "encoded_section": "64901365E99B278344696A56F13E914616080F911000E05F4117821F694AC893206AE14EF9C69002F00FA0F6E4F18BA8AE1B88AFFED9C59347B2777757E02B7763BB589A19E1718B87E0E429B4602770861BAD7938B0A6AB0394EFA1E5D06492404993B0CF", + "identity_type": "trusted", + "iv": "2931F4D5430BD5F2392929FFD93A2BDE", + "key_seed": "0BA7DFFE886190D25ABCE6232E5CBCF588F071DFA0899C9F145BC5480061F522", + "metadata_key": "5B1CA7665FA68A63D48E11A291B13E15", + "section_mic_hmac_key": "871BEA00E0DE1FDF73CE65FDDC64963FAFB2DB32842BA39D1B98C0B326C08CFB", + "section_salt": "E05F4117821F694AC893206AE14EF9C6" + }, + { + "adv_header_byte": "30", + "adv_salt": "526A3175C83BD7923662BE998A0D026C", + "aes_key": "48DBA531822D93F3D6FEDA0CE7FF67DE", + "data_elements": [ + { + "contents": "8B52817C4B3FAFEF79A65D", + "de_type": 670 + }, + { + "contents": "46", + "de_type": 801 + }, + { + "contents": "E1F3439D0AEAD4CB9F77", + "de_type": 671 + }, + { + "contents": "6DF3745B08B4FEF27F336A", + "de_type": 288 + } + ], + "encoded_section": "649013AE841A17AE95BD4355024766953D137291100031E1FF9DC6275DE2D6CFFDFBD4ABF2BA9004DBA83D7B18E1768B0A74F4540B159871FB9C14BE48F656157533EAD1E5ECC8228A55124E283885BC099481EEF4F1913D09B1E3D5B603D420D5E41EB331", + "identity_type": "provisioned", + "iv": "D4B8B04708827F5B94AD1C4B4AAD0502", + "key_seed": "65F30FB0C0DBE40E8B6DB35012BD4AE37FEF2C62A90EAD5F367CD41D0B4D06E2", + "metadata_key": "E4FBEF567E6D11D3A9C21CEF8687354F", + "section_mic_hmac_key": "61B7897EC3760B6EE3E94E7EC85D1BAC7891D62B9C958EB6754F349DF51B56F3", + "section_salt": "31E1FF9DC6275DE2D6CFFDFBD4ABF2BA" + }, + { + "adv_header_byte": "30", + "adv_salt": "607FCD5903490C79A012D2CC218C8E14", + "aes_key": "1B4926A4AE50E442685876D28E738DC5", + "data_elements": [ + { + "contents": "92193507655A3CFC554D76AB", + "de_type": 703 + }, + { + "contents": "3E93C4EF1F7BB3773E6DF1A44C64A63EBBB84CC12DB6704A2512", + "de_type": 863 + }, + { + "contents": "281F78E0212C7ABB", + "de_type": 785 + }, + { + "contents": "D605E7E6548983FBC54C139E2792F218A1", + "de_type": 674 + }, + { + "contents": "56C18EA4A5CB10EC724D6017F192CC06763AB5", + "de_type": 874 + } + ], + "encoded_section": "989013929D8225107A0F13E5F33951FFF57792911000BC967854BE9AE8680BF37D35FC3247879002F417C437991FCD5F8830F88C9CC8ABD364588908090C416784CB0784383558C9DB80A3EC0945B122D09DDCE9718ECA2DE69F0A4E444DAF5432ABC60AE72624996EBCF0D5D4B3FEEBD7C93DB5DE4FF19BC16971B4BD672738994696EE1EB9020448360ECB9E5B4D14BEDDAACDDDECCD2ECB", + "identity_type": "trusted", + "iv": "18EE01B860AD7549AD1C27D0D1719333", + "key_seed": "BC65AB7D447AED92E7AF15FBA242DE64F51CB5505C7538DF7606E5BBCFF251FD", + "metadata_key": "4EC192FA9236683FB8EE6098F5AB2058", + "section_mic_hmac_key": "0BC73A07FD0D047E1F83EEF451E5FBA8DBAACB166B8BB3200AF94CF39BC391F7", + "section_salt": "BC967854BE9AE8680BF37D35FC324787" + }, + { + "adv_header_byte": "30", + "adv_salt": "1F4428A4B286CB63540A9B96DD5755C6", + "aes_key": "E7AD8FAE2DD846979CF83C2925603C18", + "data_elements": [ + { + "contents": "5FB025BDB59D9975EFC6EF5E4F77", + "de_type": 266 + }, + { + "contents": "A3ECE156745E1E9DDBB39696F06D01B045E3A4A0948C27B5B38F2F", + "de_type": 293 + } + ], + "encoded_section": "6690132001AABFE31D558D81FB2EACCB49044B91100055A992A831E3F554842A50CC1A0F6FD59001B2D52D0A60F5AAA760A47640C2A4BA9F66739355B0A13BFDF1262EB114C6582CDC7186A33416FB0DD4A59F72E83A6913259F07029F9A9B17C79B1CE9286DAC", + "identity_type": "private", + "iv": "3C257D68DE3391B34584EF9F5617E9BA", + "key_seed": "67F1DE60563E3E0DECE3191A8B38107DD8AFC36AE838AC1667D9FA2ABA01B192", + "metadata_key": "5DA221E4FBF5632037F2C38760158865", + "section_mic_hmac_key": "80F62DA2E814A7FC4A5729E1347BC6E0E1ECBCC2A69E94A31201CBC9CA264C71", + "section_salt": "55A992A831E3F554842A50CC1A0F6FD5" + }, + { + "adv_header_byte": "30", + "adv_salt": "0B6FAB3C87525BE1EF6338CC7B44586B", + "aes_key": "9D8AA7E968ED807E12A1BFCB358B2500", + "data_elements": [ + { + "contents": "A8F4C5FF", + "de_type": 250 + }, + { + "contents": "393C6F0B53FCB39895D4673589995BAD266D8C1F37B8EFAEDF715C5E", + "de_type": 891 + }, + { + "contents": "897DD504C7FB519F408359177CA09EBB3285A8D07C047DAEFCAAA9", + "de_type": 195 + }, + { + "contents": "223F0E3959FFFA4BA2C2EF990BE541", + "de_type": 109 + } + ], + "encoded_section": "8C901388894975700558396618D4C5B6DD75AA911000976919A685F1DB72B863D392566395789001BEDDCCFBF8B26CDCCEDF6FDDDDFEF284781D90CF4C669B8E712ADE147F3A055C6927205B7751438812A0AC612BACC422F753A248C921F763A4834D260F66D4C3BEE187B5059BA90DF97BB8D88B8D5EB57B349AD5A5A2C0F4E8048A3903495296C0946F8FBA", + "identity_type": "private", + "iv": "4EB6A4C8E8AD7A198198AF5B3F157ED6", + "key_seed": "7FF31B2DD4EF85589AC7E8DBAF320DF047DFD5383F762946277B9514C19B957A", + "metadata_key": "6DD18E7B8BB136DAF7A00E03A68BA11D", + "section_mic_hmac_key": "32596C515AB3091AC5C0892934243A0E134A5DE300B5934134ED4EDF0551CE41", + "section_salt": "976919A685F1DB72B863D39256639578" + }, + { + "adv_header_byte": "30", + "adv_salt": "4840B5430E2C99864061A0B7BC506FAC", + "aes_key": "305CBBB94EC7BF4B1575082301513A20", + "data_elements": [], + "encoded_section": "3790139F09A81379D3DD32A26A50B29B791D7C9110003BAC436861F7119425262BA2F41ABA479002871FBCB559E18575502D8A4E205CD26B", + "identity_type": "trusted", + "iv": "9523644A9EC5EB4D03F9682F6B71EAFF", + "key_seed": "B7AAD921C1C4B99238DF4FA3E2799F6AAE57B1189D6E886D38DEE52DBAF17272", + "metadata_key": "6159AC2C4F82C220C822A0B02382AC52", + "section_mic_hmac_key": "B0B2F95C1E37B287F9CDC028DEBB10B717883252404112A6E2A0884F4A39E2B3", + "section_salt": "3BAC436861F7119425262BA2F41ABA47" + }, + { + "adv_header_byte": "30", + "adv_salt": "B0DD88926A85214061D588D046C40D39", + "aes_key": "0A9D24DA0E9CD688FEE88EEF7105D736", + "data_elements": [ + { + "contents": "E1CC37DC8F60ABE02709940B49FF8CB7B467E95F", + "de_type": 706 + }, + { + "contents": "1E743AE7B4E54237E661B287998DC1303A", + "de_type": 87 + } + ], + "encoded_section": "61901372401FC11144842B442B965C2F4409749110004E00BE0F929E9D09AC9DD996314507AB90015154576D8110400CD950E8FA2AF870E462D4FDF664B7F9E099BA14A7683B729FEFBAEA36A0B1D1F76A2D4149FF198765456514682E5CDB01F75F", + "identity_type": "private", + "iv": "A061006730444D3FE601B1B9A96D5582", + "key_seed": "C7E8A62C5DB5B1E6B07C55D4A3171C26B346BFD476CC4D835F52C40FE4FACF9A", + "metadata_key": "C88A3F7A29198F2E0BA655DEAA8192B2", + "section_mic_hmac_key": "9BDF103979B01A474F89368E167707AFF7C35913263B5709CFB61FA4BC63732F", + "section_salt": "4E00BE0F929E9D09AC9DD996314507AB" + }, + { + "adv_header_byte": "30", + "adv_salt": "3E57C49387523CFE6CDAC323282CB768", + "aes_key": "828E644A59749E1081F44C309EF285B5", + "data_elements": [], + "encoded_section": "379013461457D7D8208806838F38643B30805C911000602E288251DC86DB4FC88DD50BDBB5B79004E1385E22902422B0DAA09CFE046D4480", + "identity_type": "provisioned", + "iv": "984B98EAAB7855E8E58B90BE045A98D4", + "key_seed": "B2DD1B6846A6C730D35C7DD5F7E66EF0DECC00BC6FC4BCDE5AF7B7A8CA29927F", + "metadata_key": "5F47855ABC1C9E6F40C278922556F9B9", + "section_mic_hmac_key": "2F811707CCF2E89920CCD2E8AF5712BC621F3ADD42AC4C4E945D667BF519E7B0", + "section_salt": "602E288251DC86DB4FC88DD50BDBB5B7" + }, + { + "adv_header_byte": "30", + "adv_salt": "FAA87B7470D9B709BA24C03C0556B201", + "aes_key": "AD00E01086C81CD4ADF2F225D4EC40CF", + "data_elements": [ + { + "contents": "C6710B42", + "de_type": 259 + }, + { + "contents": "B775BA2BC90617E3A1D053C887C95D93928D732E01C596B085", + "de_type": 518 + }, + { + "contents": "C1902A", + "de_type": 542 + } + ], + "encoded_section": "6090136EC2E8301A171621686D256328800A5391100086D384F2BE92C175DBC065A4441DB88C900412860361D567258D47AD2373ED132B0D455A36D52E13E8A60A4D14137633019A9376150FF9C5C3E876A665940CBC3159D26A6DB2A7C726FB7B", + "identity_type": "provisioned", + "iv": "4019E22DE255D0AE7010AD5142D1BFB5", + "key_seed": "45C69BCAE63391CA52F9D2C1C04E9699727876ABE5041DCC006A68270893A46C", + "metadata_key": "CEB8DAB98EC23439D98C713AF4F2D4D7", + "section_mic_hmac_key": "C2DD8B720D968C3A290A9C2038070F134A91E53C09F6214682B7C8D40A0FF543", + "section_salt": "86D384F2BE92C175DBC065A4441DB88C" + }, + { + "adv_header_byte": "30", + "adv_salt": "185871AE8F13E0BC01646BBE8CD93E7D", + "aes_key": "3F4388DB5F2E556979CE2D22B9FF45E5", + "data_elements": [ + { + "contents": "659643C0F6B85BF24446E841", + "de_type": 119 + } + ], + "encoded_section": "459013A62C3DC6BD3EFFBEE575BE8D47E584E6911000C87758744B4E7C881111F2CD34F4D7F79001DCA97B6125D1DAC4E21D5D0D2E7A986FC7867F78551EC031B808FE7D331D", + "identity_type": "private", + "iv": "715E94C49314243FB3D9438BE0B5FC4B", + "key_seed": "B19545CBC53FECBF01DF0794B5E2BBE1FB077D963E6B5AAF7BF3B41B09655E55", + "metadata_key": "8A571C405199BDEBC9E0A996C066BC98", + "section_mic_hmac_key": "EE32E0FF4AE8937E99101C31545DF832EB4424E20F6FFC90DCF47610EC6D4B1F", + "section_salt": "C87758744B4E7C881111F2CD34F4D7F7" + }, + { + "adv_header_byte": "30", + "adv_salt": "C4C2159CFB937F5A7A2FFE48D07C7C70", + "aes_key": "E616EA700DE6B20016EFD092679337E6", + "data_elements": [], + "encoded_section": "379013F8000289CA6BA6E4115BAD0BAE228BDC9110002F0E0B5A5A511C3B0DD2E02FD72510DE90013F4EFCB8C2CB33A2696F2D5405E460D3", + "identity_type": "private", + "iv": "26BC1ECC5F5D6B109307FFEA76907026", + "key_seed": "B872DAA9F9DA74E0D37859F20901854233A6C6E66F537D404A6CDF32863413DB", + "metadata_key": "B86BB6F2B8B3E89B4A3E2672BE4DE433", + "section_mic_hmac_key": "DF0F2BDA3016890F67FA244C72A22AAD605BC9C8732B812826B39C729DFD2858", + "section_salt": "2F0E0B5A5A511C3B0DD2E02FD72510DE" + }, + { + "adv_header_byte": "30", + "adv_salt": "FB11A8102A3D19E567CC0EA7A856BB99", + "aes_key": "D8F09716F9CA40B2576E70575E6788D4", + "data_elements": [ + { + "contents": "7489EF6D168E7528A568454A79B13C99051EFA8CB54D790A676B2E", + "de_type": 144 + }, + { + "contents": "3D489FBBD523E0F6545E9FCABE2FABD575CB66", + "de_type": 278 + } + ], + "encoded_section": "6B90137A6B943C979446674641A75443D0FD539110001445E273F719B3991BC855505C7524CA9002936D5265ABC1014D62D7A0AE1232524F648A170154BB721C65A99DCD7D3B8B31118047E8071AF25223AC9DA6DA3275B5AEC1DC81074FA85C3EA6BE8568E008793268E231", + "identity_type": "trusted", + "iv": "C41905D73CF82367AFDA74A2171728F6", + "key_seed": "3D0D1F01B8DDA465B6B3C07A589C94E3A1272651DB2CAE2038B1DAC1265418CC", + "metadata_key": "B5948EB880BE8DF16056872DDB37723E", + "section_mic_hmac_key": "86D2D4079CB6D1A6E43AA9CEF8B9830580749A245457F823096FE7B72BF9E7AC", + "section_salt": "1445E273F719B3991BC855505C7524CA" + }, + { + "adv_header_byte": "30", + "adv_salt": "B6EC9A6945B754FAB8D7FF959F03997F", + "aes_key": "9B4980C3EE6BE117259F7B1377A31A75", + "data_elements": [ + { + "contents": "2A966E923416C51DE8CD04D2FFBD7129FA00F9B0", + "de_type": 367 + }, + { + "contents": "0953BDEEC1AD8F034790", + "de_type": 452 + }, + { + "contents": "5734C9069ADCEFD63F6DF5E815", + "de_type": 21 + } + ], + "encoded_section": "6A9013D8A4420DA699AA047DA37216590D7361911000193B30E46CAAD820AAED6A871B0DDE3D9002E1DDBA0DC773691E6F5E35467C16D5B90BE6B4794FADFFB35D17D5959F7DA4E0508BA05C7A0E75D733827A23241815076553276D897F9D7F9857C88BCD15251B6A59FD", + "identity_type": "trusted", + "iv": "7596E4CF2D76B0B7B6D57BB31536794D", + "key_seed": "10CDC0E8F2081B6383B5E770324E8A2A0EE7BCD33A06F4AB1C13CC441B1576AA", + "metadata_key": "8B6C66FB4F911DD9D302B58389A38E2F", + "section_mic_hmac_key": "02435909F7FC7DCF6AD2C5782C4454EDDA6825A3F03E2FAE631827EF23C75802", + "section_salt": "193B30E46CAAD820AAED6A871B0DDE3D" + }, + { + "adv_header_byte": "30", + "adv_salt": "3BE86057455C4EAF637B2E2D5A3D203D", + "aes_key": "E49BA1CF3158EBD91ABCD623CF652A88", + "data_elements": [ + { + "contents": "1D", + "de_type": 789 + } + ], + "encoded_section": "3B90134A40A37A0F1F7FFA41DBA69CF401562B911000FF2F1817375B764380DAE5464D94377890017B523500C616F3CC02DB071A8FEDF8A4A77EEF03", + "identity_type": "private", + "iv": "D0B1E3FD976AEF6BC9764DD4C2C77D9F", + "key_seed": "F6C21731E2A651A2A3E69BDB7628AE4D170E03F1290FF07E6B5D53EC4B3A9E07", + "metadata_key": "A67ADD8BB31728F1CBAB049EA30784D0", + "section_mic_hmac_key": "32D1CADC23733164A58E0DFD391F62623DF7CBA2B2C482B97E824837F126A2EF", + "section_salt": "FF2F1817375B764380DAE5464D943778" + }, + { + "adv_header_byte": "30", + "adv_salt": "F835784D7AB18BA808A7F69B57D4815E", + "aes_key": "1BA538EB97A7B39A85A8AE30F3E7F74E", + "data_elements": [ + { + "contents": "3EF58FCB910F", + "de_type": 471 + }, + { + "contents": "B7A97511C7241A87D93CEC34DBE0", + "de_type": 781 + }, + { + "contents": "3B7873329F6042E0", + "de_type": 591 + }, + { + "contents": "4D", + "de_type": 155 + }, + { + "contents": "8B19AB", + "de_type": 459 + } + ], + "encoded_section": "669013321C3BAAF7D8D726DA7B24CB448A7CEF91100060BAA8C3E9B5DE735AB5E20549288EEF900459F48BF2DA6EC0C9509A54CD9EAB469FAEABDB1C0469C4AAE88E000102F20F0410588ADC95DC5CB9F1E618CD9B5D7282AE636F046F0BAF41CB330F90231371", + "identity_type": "provisioned", + "iv": "61B4EC1132186567C1992B337414B65A", + "key_seed": "82DB684D3D3EAAB31A410F59959F697C1A3F06F0225400F7F93973B38E900F48", + "metadata_key": "670D421A6387FAE7387E7687E683FF91", + "section_mic_hmac_key": "4B60F9DB5B3A4C383A3F7D15A90CC70496A30476D9158CD07832E3B34430A386", + "section_salt": "60BAA8C3E9B5DE735AB5E20549288EEF" + }, + { + "adv_header_byte": "30", + "adv_salt": "97AC9B949680B2F11F1C07562473BC5D", + "aes_key": "8893DA49A2A51A183F1A99A688B11CBF", + "data_elements": [ + { + "contents": "B7CFBC4A38F6E5C1EF5529C01E0EC57DEF14", + "de_type": 487 + }, + { + "contents": "76F12E3859EAFC1C47332C188435203DA7BAA2C11219B3287FDB", + "de_type": 699 + }, + { + "contents": "CEAA9D", + "de_type": 474 + } + ], + "encoded_section": "6F901300C1D813793E3D565D7BDF96D4729AD1911000D87C74058CEB77E6047D8FB6FCDE2A84900462BC3ACC414A1075616F631658C6F59BD8313C6D040F237912A83C8391E481F8260C25C001E842C5CF8C9899A39E81497CD14AE3B95C42D4613D5B94AD5A43FCD06FFBBB880771D4", + "identity_type": "provisioned", + "iv": "31692EECD347BB8B790FFE491DC6AA03", + "key_seed": "D7DB5F3D01EB449493F604FC7625AEA837CF2B59C099BBA604A4289E7D130F3A", + "metadata_key": "5B0B450F9073E98F2713D56B6F8B6F45", + "section_mic_hmac_key": "8CCD7DE04D0D174F4071227616AE28B1541FD3DCB20559E49DDB9D7E1E61DF5C", + "section_salt": "D87C74058CEB77E6047D8FB6FCDE2A84" + }, + { + "adv_header_byte": "30", + "adv_salt": "E702551D59055A4C268DE48352D1D471", + "aes_key": "B2C74066FA0433B54D2C41E23E6EF2A1", + "data_elements": [ + { + "contents": "C87DA9FA2AE6", + "de_type": 753 + }, + { + "contents": "0F09EBD5E1FB0403D5FB6EC758FD99969CD51B", + "de_type": 938 + }, + { + "contents": "68", + "de_type": 659 + }, + { + "contents": "EE7C4403DFDF257703D7307BD90FA19F1234", + "de_type": 367 + } + ], + "encoded_section": "6F901313354100352D54F8E69864F4D81E5F40911000D31E9F9EB135D9B417465F14DD616CAE900241F17700C7C522B251D69077C5D83A57C91C76E9608FF7AEBAA9E6D6DEB4FBB4C0FA7A846161B449867B0DEF8857575DB871772C1A32A50C3FC8B5B7BFCE1F9E863B0B3BB540A538", + "identity_type": "trusted", + "iv": "E9CE72D40C0AD1AB24A01A82F2A07826", + "key_seed": "53B877350CAB817BBD44D7EEB318798EA7BBA2D4A1A71D89D36716AE92749BA2", + "metadata_key": "99976B723F002988F4F55EB36FEEF71D", + "section_mic_hmac_key": "99808417006A0BC9AEEB5E57189464625982B170D83E339770A664DA612A8FA2", + "section_salt": "D31E9F9EB135D9B417465F14DD616CAE" + }, + { + "adv_header_byte": "30", + "adv_salt": "2ED0C092724864890A6F1F704D800668", + "aes_key": "DE9D2AF9D5E73B5DCB99478AB10596E8", + "data_elements": [ + { + "contents": "C60493B51521D08E1301A6BA8DDCB0B8C80EB593EE", + "de_type": 626 + } + ], + "encoded_section": "4F9013FB0AF3D967DD7A4DB45338A490E57ED3911000955B8212E6D3B3D51F527D3FA95E5A7D900137E439BCDE00D86C1F7636F036F39C1E747B84D893FF30148A60A0FED2A9630C05074B851C56CFBB", + "identity_type": "private", + "iv": "0C778E8BBE426243CCFAB25E5FAD4AB1", + "key_seed": "E52C0B2498CB2E81CA1D7826956E5CA96643FF387FBCEC351EB3E573E8267E6B", + "metadata_key": "89100169ABB76A810E0689FF4E1CB32C", + "section_mic_hmac_key": "1AE31170876F62388380093D8BBCF2C7EE39CBBFEB704B3FACB3AB58FA218A0F", + "section_salt": "955B8212E6D3B3D51F527D3FA95E5A7D" + }, + { + "adv_header_byte": "30", + "adv_salt": "97D8796AAFFFF0391918C4D843EC7182", + "aes_key": "2DB81BBEEF3CB201FED12F870DD1A6D4", + "data_elements": [ + { + "contents": "AC7A11", + "de_type": 42 + }, + { + "contents": "47F36D", + "de_type": 476 + } + ], + "encoded_section": "42901334B6E677BB68B303430CBE489918DD1A9110004FC550638C733514F55D80678B35E8BF9001D6527838298D839E0AFB36258BC8CBDA19AC72F0C0F1C1D21D1FEB", + "identity_type": "private", + "iv": "88D3B3269364CFD877B4B349E5232F78", + "key_seed": "D2721BAEDB71C77EAD4016BE0B47482E6FE7ED6D8BE89ECBF2874DC8379532B7", + "metadata_key": "E6CF02F6881821F85F695322B753C232", + "section_mic_hmac_key": "23BCDEBB78C2D48D14441FDF8E69E3419DED64FF26E80707BC4D74C23E9985EC", + "section_salt": "4FC550638C733514F55D80678B35E8BF" + }, + { + "adv_header_byte": "30", + "adv_salt": "E29DEA8F8EB14530304F3980D3B1D734", + "aes_key": "36FCBB41B48F5DE8FAFE45582F12BCAD", + "data_elements": [ + { + "contents": "BF2DD9987F4FFF036F7EBEA0", + "de_type": 648 + }, + { + "contents": "F6739557F6F35CC9D3", + "de_type": 600 + }, + { + "contents": "7A461FEDFE239F482570B8", + "de_type": 773 + }, + { + "contents": "755576B7F701C110D30DE8A8A6055E861330AD3038B48369", + "de_type": 910 + } + ], + "encoded_section": "7B90134C1E3F6ECC9F2A87270584D6B556739B91100000B42582A3DDC746C8C72882FC1E3CF29001E801CB59638B55AD760247985729C427C701BF1FC270D0846820E3F3CDAF26FE33F9C42DCCE3B580CD8ED52C8C84A1497C02B8CF858E82598DE51CAE0A9222FC649F0F74FDEAB2980ABB47259919E6AD0E5BF8CD", + "identity_type": "private", + "iv": "45B269C614463C479DAFE5D92A9EA559", + "key_seed": "C35089F1053EEE4A91E2931F7A8AC693D00AAE4A81E7175018BEE21CBAE51145", + "metadata_key": "A458B645925159650706A2E4C8BFCB64", + "section_mic_hmac_key": "668DDB981A4777D6A00612FC5AC0B10287C5E786DEE8A47BC127A87734A51AB8", + "section_salt": "00B42582A3DDC746C8C72882FC1E3CF2" + }, + { + "adv_header_byte": "30", + "adv_salt": "2A1A6C8D295ECF8C0202668F1489A414", + "aes_key": "28CC2DD441CA8E4B7BB065E70D54F066", + "data_elements": [], + "encoded_section": "3790132CE9BA72A592AFC9A154431AD9BF678A9110006F7AFAA6E74352E98FC6F26F271B53A79001C1E8B3BC3B1DC537843A058B3CFC77CE", + "identity_type": "private", + "iv": "CEB816A49DA26AB4B8D0DA3F35D84FD4", + "key_seed": "33ED4D742A7EF0E3B7A7A3A6DFC520B17D56970B3882F8CE0093A65364F26BAB", + "metadata_key": "D013A0446A6D5925AEB112989FCF8B6A", + "section_mic_hmac_key": "A5C57E34BFE28F270E4D4DBFEE7B2B439825F138CE6246EF84DD1A1B362ACD34", + "section_salt": "6F7AFAA6E74352E98FC6F26F271B53A7" + }, + { + "adv_header_byte": "30", + "adv_salt": "C57C5AEC61B254B68BFA1263F09D08ED", + "aes_key": "37606EE34F9AA21C044064B8C1A2886C", + "data_elements": [ + { + "contents": "B11514CC76AABC274DF8F8C6CFC2ACB4E22B53", + "de_type": 472 + }, + { + "contents": "", + "de_type": 457 + }, + { + "contents": "508791F872F0B674D72C29", + "de_type": 688 + } + ], + "encoded_section": "5E9013C8A8A7AFFD886F274CC65659F5A059E1911000B4610CB1B2740CD7D6BA48AE95773889900401416AF0F3FF6BE99E89149A173F289199DB5ADBE086901F6BB884EFE7B8F26B8447A95553BADBA369BFA1FC97FA8253CE897B05AF5679", + "identity_type": "provisioned", + "iv": "7745CE454FFD689BA9F97F294D8A88A8", + "key_seed": "0E252068D453031E6D3E8512F54A93023AB47D40DF65477E1799169584D49A34", + "metadata_key": "ADD4C2CE5C0675D81B04C0CBA49C24F8", + "section_mic_hmac_key": "A1BE55F257B3AEC15DB0CBEFE6B8C9EDF5EC2D5D5D80A2B8365C62E03A18FAF3", + "section_salt": "B4610CB1B2740CD7D6BA48AE95773889" + }, + { + "adv_header_byte": "30", + "adv_salt": "010247C596F6FE045EC36550B5CF9BE0", + "aes_key": "56D59B20C8A02E3EA56FEC1F085E6B43", + "data_elements": [ + { + "contents": "71885D121CE06D7983CE03903E41", + "de_type": 749 + }, + { + "contents": "6429B148C4524881", + "de_type": 197 + }, + { + "contents": "0C10", + "de_type": 915 + } + ], + "encoded_section": "589013A6678EE465A615810F963BC8524823C49110005A5B7E64F50792684B2A8F6A79718EA7900406B7D7E7FCA48BD47114CFD66F0847C883DF7FD6782B352737A61D21EB05EFAF560E2E0CD50D9FD1E940752E6EB6E2D2D7", + "identity_type": "provisioned", + "iv": "F5A4C94B269FA033FE14BFA63ACBED1D", + "key_seed": "B69E0F9C1C0B1F48E8670D5DE996DEEF779C2DD31BA96E3D40FC6A91E97F5CD8", + "metadata_key": "DEA55C1AA38639015CE0CA62436712FE", + "section_mic_hmac_key": "2342FF7DB9270407FAC870A89EC58DA18193CD6761B4A6A186F1DFC8F5097EBB", + "section_salt": "5A5B7E64F50792684B2A8F6A79718EA7" + }, + { + "adv_header_byte": "30", + "adv_salt": "202E08A90937C2075EAD5A59F7E1F826", + "aes_key": "85AD6EF749C1F3785582882A509D2A38", + "data_elements": [ + { + "contents": "5BC965A20DFA04542BEC2459E2BD3E6C124C1E6CF676ABDD2B9C", + "de_type": 722 + } + ], + "encoded_section": "5490135A9C9FEAABD949E8780F74645F6A3C8E911000822CC18C14AD885BC2B6450890F27E1090046DA21AA7BBABC3DBB63EE5653FA4B3CC619F4000A1E82649C1F516F162FB6AE4CB3975928A5E12E27A7E5A47B1", + "identity_type": "provisioned", + "iv": "48D37CB313151B5A637562436E0AD944", + "key_seed": "1BED4881AA77F955F19F3E02484DC66EE385DB9780DBE97D61F72285EAC8C886", + "metadata_key": "3EE77F6213BD622E7A7FC71A63DF2F41", + "section_mic_hmac_key": "789EAE25B10C4671328052CF168517ED74AC64002E81384E4C27F676EBAFBD94", + "section_salt": "822CC18C14AD885BC2B6450890F27E10" + }, + { + "adv_header_byte": "30", + "adv_salt": "25E36ADBBF4FE51E8692897477FBDF1E", + "aes_key": "E820954AF8A47313941F0DFF6F7D8E56", + "data_elements": [ + { + "contents": "F0E521B07A2BA4632B7522FFCBC8868A84B596E0E788", + "de_type": 308 + }, + { + "contents": "BC1B944236DAA3", + "de_type": 650 + }, + { + "contents": "9DD55DF02A53DCF3EAC75B805A2E468FDE7293E8D033456CD75B84B2C2", + "de_type": 202 + } + ], + "encoded_section": "7A901374488D1F21525687674574AC556A759D911000B989B1E6C00C664909F417385FC3184690015D885FA6EABFC8A8AF8155D6022A502AA86FF128A90F7E92CF2E05A9FD1AAA7572DC42D5EB157D8845E144108D4E528D1B247732774F1C7EEBA1441EFBEBC97B3B550F520D4A31AFBB7D94C248BC9883889333", + "identity_type": "private", + "iv": "2A718490018706C03F9A6E4D1058369A", + "key_seed": "0674E67302C41BA299713DE1C1EA641C82F9345120CFFBD8705C8CF1D99D9F24", + "metadata_key": "DF696B20166A8F6C89A3A4999ACC7E66", + "section_mic_hmac_key": "2230661E0FE82FC883CA43379DB99B5F867AC35A6C854FA271576E91DFD44FCD", + "section_salt": "B989B1E6C00C664909F417385FC31846" + }, + { + "adv_header_byte": "30", + "adv_salt": "77A50A93AD1DE5BD21FBA890648EA0F6", + "aes_key": "A5C13EBB1931A7ECCB4D1FFC456D950D", + "data_elements": [ + { + "contents": "F248E8798E08955BB2B8C739C290BB910A2876078AF4E2FC3EBC839080EE", + "de_type": 299 + }, + { + "contents": "", + "de_type": 115 + }, + { + "contents": "6E863CFDE1C1B9EC5C5CE6", + "de_type": 207 + }, + { + "contents": "A78CBD078A98045B5CA79E19", + "de_type": 62 + } + ], + "encoded_section": "769013B2E1239BB6FEFB97B6EA19C9619129D191100030FE3722857D4340D20F7C483E37F2DC900249E2354F02B0D9DAFBE5ECB30730C4A70236F4C59860A3633EEF571C2A024510BD9EEA4A46C1604CE18E0EE914A6B9001FC07FB1FDDA5807E075E7F594DC16D60E86B75246E93F301F7595583BE980", + "identity_type": "trusted", + "iv": "FF98DAB9B88B46C4982566F95B068A02", + "key_seed": "E56913363141DD1C2F0D5F93FB6A9EA6CE5212D0DA2FDCAC3CCE6BB15097283E", + "metadata_key": "661BF758E6697E46F133979F25395A26", + "section_mic_hmac_key": "EE035FE53ADF345F73E4AE77C4BA8FFF96D12CE39F3924939DB827E14ABB715B", + "section_salt": "30FE3722857D4340D20F7C483E37F2DC" + }, + { + "adv_header_byte": "30", + "adv_salt": "EA8DA1BDB85D6AE965D351EE9B8EB881", + "aes_key": "042F1CC32A48B7714A58BB51469C260F", + "data_elements": [ + { + "contents": "C24EE733EAC66F8A54A814A1", + "de_type": 708 + }, + { + "contents": "C24D41A652EC0E16DC1E23A473850585795417447B", + "de_type": 565 + }, + { + "contents": "CC8DA80690986563A3815792", + "de_type": 594 + }, + { + "contents": "5C279B02235F4678698B16545905C95D121FC57EE7B68A387F", + "de_type": 549 + } + ], + "encoded_section": "899013132CE522524AD6D5864DC7C43C07D4EB911000EE856613E81A2B970A62219E03CC698E900172071B9F49F539C94EECF7B8736EE09CFEE8A70BA28CC824951769B286E21B889B408D20E9EEE2A57E93E0CFFCE13E3093224880C88EC85C6B253363B24BCD2CCA07129487B2552240BC7C99C3469521F171065D3F14DC9F02E282DC03185849325A", + "identity_type": "private", + "iv": "55654AA16120C9192CF4251DB48F6811", + "key_seed": "87EAA9BF3F195F050804C1E9CC5A29E15FA3D409EE515096E4AB412F341F63EC", + "metadata_key": "25C515A0D455F2EADF60C5CFD02F5704", + "section_mic_hmac_key": "0B106484613F91290A8AF8552F4FE3E517AB03AD99C7B49884E75E13D6A2F03D", + "section_salt": "EE856613E81A2B970A62219E03CC698E" + }, + { + "adv_header_byte": "30", + "adv_salt": "C83B117035EA70F9B5EE8514818D9563", + "aes_key": "5786A3D45C88BC5BF15E63BEABECC7DD", + "data_elements": [ + { + "contents": "96DFAF82E5E8", + "de_type": 722 + }, + { + "contents": "1A52EE0785ED4F5E", + "de_type": 529 + }, + { + "contents": "4070E0708BEB0EC5715AE4BBC7614AE65D6EC5", + "de_type": 220 + }, + { + "contents": "078FDF57A9D79648DF0C6AE6650D3745B4E5AB8F4230328BFCFD2CFDE8", + "de_type": 534 + }, + { + "contents": "2A683899E3C29BE4296CD5E63F156DD06650B98B6C", + "de_type": 434 + } + ], + "encoded_section": "999013C17A273FC6F3CC1726484BB95C107A5A91100087114931992E6A90DA25ECA40CAA7FA090028868628BFA23AA55C7CE84DC579C73667AE77FD0519B69DD4D27F5F7E274C52807FA63E8BD0646F5317F7109770240A53B3EE772E019E226051DFD5274D641EBCBD1CD122A2222FA5769A2DB47B0C351AFF6F70394D3D39472981534D00428DB1ED731882A0D746990A730B5BD00A15E0729", + "identity_type": "trusted", + "iv": "F9A836CAA147035106E7454E9DD33840", + "key_seed": "CCA2DEE077D57B7BD51A23F80E6E2B4E8CF22B489B31D50DFC0E2C8A51323DEB", + "metadata_key": "2DB7D7E9F6C9CC9ADB3CDA79F1A17A7D", + "section_mic_hmac_key": "0C0C3FBB7B4382A1965F1A0D21B0B76C80E9F5311D048B80C6279E53A9E59F0F", + "section_salt": "87114931992E6A90DA25ECA40CAA7FA0" + }, + { + "adv_header_byte": "30", + "adv_salt": "CB188E83DDB89D62C114F1F1360015DF", + "aes_key": "7BE45751AD3A8B7E49BE27F2D6247688", + "data_elements": [ + { + "contents": "560C374E10F3B1004D6BDA", + "de_type": 930 + } + ], + "encoded_section": "459013537088C101C2FB104B6D3769B2211B1A9110005A675076A273B1935CA8836A8F568EBC90040DDCEEB9121864F9364571A4765FF4B14ABC63F8816880AFAAE4DD3CACCE", + "identity_type": "provisioned", + "iv": "494F76CEC4C372BA61E09E832CA023D7", + "key_seed": "A6DB88D2495FD0F4DA2DDE97BFCF5799017DD7BFC5BB1AF9FB92B365D4690335", + "metadata_key": "45C398B6E4E8B0A5540E19300C0913E4", + "section_mic_hmac_key": "28FC3EAEEBD68AA836A746C2BBF26DE3ECB6AB774440232E986203C9D0F1DC77", + "section_salt": "5A675076A273B1935CA8836A8F568EBC" + }, + { + "adv_header_byte": "30", + "adv_salt": "E2F803555E499AB4ADD6E1BE05823C79", + "aes_key": "5B23E3C06BE7BC3F4ED4E25348249AB1", + "data_elements": [ + { + "contents": "DCAEF3A98B4FC0", + "de_type": 539 + }, + { + "contents": "D4D1", + "de_type": 417 + }, + { + "contents": "CC7A7E6C0801E825F2CF606643C8B4E1", + "de_type": 96 + }, + { + "contents": "C3695CBF18E06D255425E2210E6A0072109062A4883EB67E", + "de_type": 553 + }, + { + "contents": "B426A715DABAF6CDE325699E12F3488EC0B0AD4CC23BBE641DEE", + "de_type": 334 + } + ], + "encoded_section": "9090137453B44CAD941E40F0B10F59070543CA9110006ABC65E438219705DA90C55843E268F590042B17F2F7D33F64EF416A906477269B3EB1E98B647E497F07BEEBE093B0439D16F08DA3AEDA48CB30BA4B1324432337A801C89DBA6DB87CB7335E34663B29B7AFC589B0B18EB82E60B39D235F1143458AD5A0D7CFD18CD4154F180F840BB20CAF7CA5F701428934279A", + "identity_type": "provisioned", + "iv": "0D1E0A06889E8F9607C7BFD987F16DCC", + "key_seed": "0442221D74C5BD01B2274C2A7C37280A192CC1D12208DC72B7DED708CAA5FCFA", + "metadata_key": "53DDA5FB2357A599D7650F5B3F3344EB", + "section_mic_hmac_key": "D56A4747E6404C01FFE0BCD9F85B7D99B07046CFDF5F6B9330F09161AD207FF5", + "section_salt": "6ABC65E438219705DA90C55843E268F5" + }, + { + "adv_header_byte": "30", + "adv_salt": "4B5EA533159CE934C52A8AED1C7FA66D", + "aes_key": "6979C3C75DF7004EE8EB62C5AFD4EB6B", + "data_elements": [ + { + "contents": "4E3FB80E", + "de_type": 151 + }, + { + "contents": "4E637AC7ECFB76369C9B878CEA3EEB802A", + "de_type": 105 + }, + { + "contents": "34A2A98FE7C7EE", + "de_type": 134 + }, + { + "contents": "698C29A5FB482A7ED59214E49F2C2295F8", + "de_type": 992 + }, + { + "contents": "09B28A3CA96A72", + "de_type": 1 + } + ], + "encoded_section": "7790134C59AE20A1D6653BEBD70DC858E3D81E911000D0329D85697985F6E05E42949541149690043EE28E5F836FC134AE452135DBE0EF28E3C8B01718233AAC3699D43C79AD0FF0FD315FFCBC70477A534EE60C7D0006B6B0098838A7A33E2C2D240CB7A38E5340268EA91D9A9A017B8499F5E4B5218F9D", + "identity_type": "provisioned", + "iv": "3356ED13FC96C65324E87673693A1432", + "key_seed": "8EC14F57AE7137067103789D1C2CC872D5F784DB8CFA491CA57D6EED842185F1", + "metadata_key": "969E204773BA54E9F873D6EB28624AE9", + "section_mic_hmac_key": "B502F11F87DAFE0E3700EF8AB8AD420D74DE34FE550E300E899D850C4DF5EC04", + "section_salt": "D0329D85697985F6E05E429495411496" + }, + { + "adv_header_byte": "30", + "adv_salt": "17A088DCDAF83A58AF2753313613B039", + "aes_key": "1F2E0EE3496322D7D8D365E67EA1A0B9", + "data_elements": [ + { + "contents": "62DD2615146476EDDBDA10A1D1F2FCC03BD164C53AFF75DE", + "de_type": 144 + } + ], + "encoded_section": "529013C7B81E1AE9557999FD71E2ECE5F7663F911000749DC9438016B9B31672E361489B94D29002F0D3FDD1FB26395746C6E8145821FEF4DE853AF48008677E47057EA33AEAE5AFDD8A6815A57B9A5B58625A", + "identity_type": "trusted", + "iv": "DA09A3AA5D1AACBA826AFB2E549BFC80", + "key_seed": "EFB6CA23E03746A98605BBC2B163B08507D83D86AAFF789D08CA6DB1225F7D72", + "metadata_key": "E590519575ACD07B7CA73CE1A80E30CE", + "section_mic_hmac_key": "4241619E81FC51B75394A479F56F007762E3CEDC5722CA93375EC5B3FFA44124", + "section_salt": "749DC9438016B9B31672E361489B94D2" + }, + { + "adv_header_byte": "30", + "adv_salt": "9A580D81461EAADF79556203CA735C95", + "aes_key": "4045DA22088C072BF80A09B8C2BCE1F6", + "data_elements": [ + { + "contents": "FEBDF44538E9E70781B5B0E283DF4C13BAB1E49B6DC8242EDBEEA1", + "de_type": 68 + }, + { + "contents": "350B4FB802500AFB0D769352F8A6B9DFCEC2BA61", + "de_type": 318 + }, + { + "contents": "A9ABA29AA6E72DEB67C8E824171876C26CD1", + "de_type": 379 + }, + { + "contents": "3D84", + "de_type": 212 + }, + { + "contents": "DFBA842E5EC56C53390D21A019801B6F0D", + "de_type": 431 + } + ], + "encoded_section": "99901366302C66D9F00F5C3C65DEF7C64F0BE1911000CA70480E790B6FA473C74E3A4E003D269002D07BC8320C3B78FDEE1D1F68E4DCA09AE32B16573455513DEA228C33E7926D26BDCCA638518BF9CB2FD36566D9DB0D6ACD64D0A6F8B2B5EE6F3DB463FF3FDDC485D5BCAEC66F1E982ECC008D3A45A36CE1F81049F95AD6BB6309326428220E8E59EEBAF4AE38A5863886056B57E25D682A7E", + "identity_type": "trusted", + "iv": "D70E519F3DA3F2668D9F8AABB50810BA", + "key_seed": "AFD5C0D98921E1D241A7906F68D8A04F3AD3E81B1A0550D35EE4C6C8DB57DDFF", + "metadata_key": "DC273523F44A001AFA17F0F4FFE6057A", + "section_mic_hmac_key": "DD78AFB4D983C325EFDE1FE20D9BC988335CF2C9B37A75AB9A519DBF0776E6E9", + "section_salt": "CA70480E790B6FA473C74E3A4E003D26" + }, + { + "adv_header_byte": "30", + "adv_salt": "5033210306BA9AB77E2D3EA6B2A88AEE", + "aes_key": "58ABC0465E84B9EC15FCD58D2E34A481", + "data_elements": [ + { + "contents": "D9485F980546BB684977FEE260590F8C94F3DBC5A4D5ABAF3CA68FE902C7", + "de_type": 891 + }, + { + "contents": "CEE448E265CD2D5B240D0389A1D19CC70C39", + "de_type": 962 + } + ], + "encoded_section": "6D9013975E455A5A9DE86D218DF7B84D5B1D549110001B4A179B3A4048FDA263D917D21145EF9001B30134E7DF109B194C1342F0B49E2769BBDA370C5D76748EB77A583F75248CDD1A20CAC314C29429B88FB99979BE4B468B6A9EA4DBF9C3CED9AFBE95FE44E4761A501D8505BF", + "identity_type": "private", + "iv": "9DDE36E1B51C439ECB53A803239075B4", + "key_seed": "FBBA5082E277FF50246090C3607AE6B59192F350244A4E1B38F1F737E1297AAC", + "metadata_key": "078882BA8177D36A63C48E4FB81487D0", + "section_mic_hmac_key": "73B3E2977B6A0722AE497D1F9B52ECB47BF0AD7B0C53C91F66F27F0C4464B4BE", + "section_salt": "1B4A179B3A4048FDA263D917D21145EF" + }, + { + "adv_header_byte": "30", + "adv_salt": "24560C643ACF024603DBC6745F73BBFD", + "aes_key": "96648935E3EA6534930CCEF9FF46157C", + "data_elements": [ + { + "contents": "E9F020541040899D", + "de_type": 609 + }, + { + "contents": "192E2705B3ED51257DE39187071CBE006F59FE797A380C690B7361", + "de_type": 884 + }, + { + "contents": "EA", + "de_type": 284 + } + ], + "encoded_section": "6490130799AC2E188C075DE6FAFFFEB23E085F91100050AC82B4D7F3A6BBC2114DA1F733ACF2900469467DF82CC82A6C8D02AD6C485973D1DE960AEC200EC2925C15CC0AF18C59EF8A21F16C6247F07032029F42F727AAE4F0C0A02E8B92824556A6588409", + "identity_type": "provisioned", + "iv": "C369FA65B5EB270813A60DD29E99F52C", + "key_seed": "75B90F739FC2B807804A7D201D758B8F2CFA5023BC95546EB70AF106B3EFD2AF", + "metadata_key": "0FDB27FCE4A6AEBD5CF6440316B299E5", + "section_mic_hmac_key": "455CE9502152FC7EB6BB721DA5BD1095DB8A8581F1B3F893B5D5FDDF98DCDF55", + "section_salt": "50AC82B4D7F3A6BBC2114DA1F733ACF2" + }, + { + "adv_header_byte": "30", + "adv_salt": "F18489FDCD6520D71418C0A0E7636910", + "aes_key": "C6A5270EE01BAD049F2823A3FB9B3B60", + "data_elements": [], + "encoded_section": "379013450221F90903BE11C937E8F2518999B691100078488DBF62F4D446B6213AB3AFD286AF9001D1AF3AF9D2172A123E854A9564EE1A80", + "identity_type": "private", + "iv": "2C15E2EDEABE3742E25A9EC8E8288C48", + "key_seed": "EFDC60A5D965B43E0181ACDEF1073D8C9CAEA8EB1133CE5538D17D00987411B5", + "metadata_key": "BFD25D2E0822E743638D21199C657DE0", + "section_mic_hmac_key": "12F2F8446F6E90B917D3453DD1543FECD35B7E35D16FE8B966E95A50221FCB88", + "section_salt": "78488DBF62F4D446B6213AB3AFD286AF" + }, + { + "adv_header_byte": "30", + "adv_salt": "DD8077D99C25E5AD861B96702256EF3B", + "aes_key": "4C007FBF6A6921EF95877D207A61EE5B", + "data_elements": [ + { + "contents": "78B194E3A0895DC7", + "de_type": 835 + }, + { + "contents": "EFFC63F96EB172632387FB9B0AAAE82514388876D62D1B4C03", + "de_type": 419 + }, + { + "contents": "00945CF6A5A4", + "de_type": 585 + } + ], + "encoded_section": "679013E41F6BF179F1F1AE413826061C017577911000EFB6DBDE8071C59CD70D626D43FECFE990013F29BDE37417ED94EC2EE33631A7B72D39ECB033BD9B6E12D923E007A716DC8A48BD159DCF6CB77C304394CFD2E198D43DA39B0E37870FB6F5AE1CE44FCE153A", + "identity_type": "private", + "iv": "3DC0231F80F3F2B132B09BDE9CC40759", + "key_seed": "7562411D7931D839A229013E52C55F4DC5A3EEFF1117E408AFA3F4AC426F10C5", + "metadata_key": "ED09172ECDC74F027C0AA0E418BB4AA7", + "section_mic_hmac_key": "CD75F9BE138CDC579730D22DF33B653D0250CC0747B1702A4878DE8302DB7C44", + "section_salt": "EFB6DBDE8071C59CD70D626D43FECFE9" + }, + { + "adv_header_byte": "30", + "adv_salt": "A288ED7E1B68D033C3F4690420B90D7C", + "aes_key": "675CED7A7336FEF07E17C17F959EA288", + "data_elements": [], + "encoded_section": "37901300926ED675109AF07704A987C309566591100015847DEC4B348DCCCA189D05D7D5174C90019395E4BDFD6A6B7A68215CE58AF169AF", + "identity_type": "private", + "iv": "F2B76940B657CD501B1B9D188E69B582", + "key_seed": "C3D8A38ECF7392E4879D99A8C9E21759E23B95860D04E10C33D0F4FC988D219C", + "metadata_key": "B8A8C3055E2FDD6D00A905324E758F5A", + "section_mic_hmac_key": "C6F39BC5C3EFF0F8F09FF1FB23728F5DB138B208032B91EDDCC2888C1405647E", + "section_salt": "15847DEC4B348DCCCA189D05D7D5174C" + }, + { + "adv_header_byte": "30", + "adv_salt": "623E52E555A5421C80C40236F560973B", + "aes_key": "201A7FC4CF51C7C389EB70B4528F0A4F", + "data_elements": [ + { + "contents": "E696D48DEBC719E0BC6B9BFAA01B37363F213EA19B2508E3F65CB81A44", + "de_type": 776 + }, + { + "contents": "F6A3106D966E9E033943DA151E9D520B", + "de_type": 699 + }, + { + "contents": "3822C8B9", + "de_type": 473 + }, + { + "contents": "286476C80CE4C19E40D7F7096A30B4E1AAB2F1AF07", + "de_type": 964 + }, + { + "contents": "801E59E8", + "de_type": 196 + } + ], + "encoded_section": "9090131E9A577C252A33B78982AB45DC475FF091100025F94B814B7033833230BB2CD9C0132A90043C21957E1606423DB86A914AC7B2451502B5206DD412CBAA364FE638AAA8DF0C9AC173462492AB53726A000223D6F74047E9D784B4377D0DC5930404A4C4AE0E3598CCAF70608D9CA0973A8D71C683C163EA16A5D9944F24A510DA586058A498C61CDD9A278D970C82", + "identity_type": "provisioned", + "iv": "402E1DF4ABC0651C160A910297E96D42", + "key_seed": "755AE4BA0D148487644F6661D42583CC5710CBC0C35A1F0CA1013B33378665EE", + "metadata_key": "2C5769C63A6C4DEF4DB33A0FA7C96D5B", + "section_mic_hmac_key": "928C6F5D55ECE19FD96C26CCB0F30481962702DB2E33218E05B5849057BF0221", + "section_salt": "25F94B814B7033833230BB2CD9C0132A" + }, + { + "adv_header_byte": "30", + "adv_salt": "BD9442F4DA1F1E45298431632FBCA1BA", + "aes_key": "C86D801FF7EE0765384862985B3A8FFF", + "data_elements": [ + { + "contents": "940AF7EFA6B964475032932CA2C94F6455CAE937032FE323D9A1EBBFD2", + "de_type": 584 + }, + { + "contents": "9A84386F3D32F5F816B255", + "de_type": 722 + }, + { + "contents": "FA216768C3D6FE14E93C86AF8A45CF2A05BBA5", + "de_type": 722 + } + ], + "encoded_section": "7B901306526801CFB4D0DCB662F3B77BBF1539911000847811E9F14841A70D3129366BC733F39001BDA5621D9D26B5F59BF25279EF7A6A4FC7CA64AFC8F15B42B765D498DACFC4087145C2E8D580B3DCF2F9B3F6E8CF495CE47BD4DF868479F3CA530D0A24B0998A23AF4DCBFE6B6E432FC7EA66491240CE29EDBA2B", + "identity_type": "private", + "iv": "AD35B9BB2AD04BFFAD8A635D7DCB26F4", + "key_seed": "C10655F54E87123FC6B537E38DA1212E290613C97285C4D28BE15593E506919A", + "metadata_key": "487166EB4E0DA027A655BD7D5D952894", + "section_mic_hmac_key": "23B54AE40FE38715E903223F80F2149346D9D34E2A24414ABD7B3933A4CB4337", + "section_salt": "847811E9F14841A70D3129366BC733F3" + }, + { + "adv_header_byte": "30", + "adv_salt": "95A1E9359B39032DFD81BFBEAFD092F8", + "aes_key": "C4A0945C3A1352D1B8D62904D7F9EE9A", + "data_elements": [ + { + "contents": "DDB9062EEE56D10231CF606B139CB1E2AB77BE00F7F12B9E85358111", + "de_type": 939 + }, + { + "contents": "344F840369", + "de_type": 67 + }, + { + "contents": "09DF9B7F9F0CA5708F2D2EAA28", + "de_type": 807 + }, + { + "contents": "90025E283882C5255D19FFB273FBF7AE", + "de_type": 115 + }, + { + "contents": "2D268EF42716C19253E88FCC196D731E774E7472F16D5C", + "de_type": 541 + } + ], + "encoded_section": "9990131968FC75E9DB7C11135F77963495199A911000B2A08BBED54FECC10AC797794F3EC4309002CE86072EC393E15DF60923BFF3977190C76EB76737DA68A858A1A21B956681334E67CAA59B11E0186BE23474A30F87138D238C37608F498F56B70548D984E57959B5AE73731F4F5E20AD34B80909739F891A5E493667E1C6B316F4E0CE6BDE3D397449AD77F1653B1A3E2C43B5ED711387A8", + "identity_type": "trusted", + "iv": "6B19CF9740AE6EB6EBD37FA0CB3D3902", + "key_seed": "F87D44A4D5B28B4BA5D73383B98268E3114BF761756D000E85274BAC3032AE9C", + "metadata_key": "17DFA18739929CE57D4B46B0BC5B0E66", + "section_mic_hmac_key": "274695928C408DA10D19DC3DB46FA78F29D51CB0DDFE304FC5182C785AA21F4A", + "section_salt": "B2A08BBED54FECC10AC797794F3EC430" + }, + { + "adv_header_byte": "30", + "adv_salt": "0CBE6D655846706C41AA38BA89A49466", + "aes_key": "D1217535D1A28CA4A79A5D361D10381A", + "data_elements": [ + { + "contents": "715FD19363404B5B4BF8814D7D6F988BE275D43E4C935E", + "de_type": 257 + }, + { + "contents": "5FECCFADB93B95ECC6E8EDE452FA15B0FD1A96A67A9FAE898A15810CC6", + "de_type": 255 + }, + { + "contents": "40BE80BAFB55E63E12B9F5D5F15E7417DE", + "de_type": 924 + }, + { + "contents": "3D878AB8B130EE71B7A74387CA7AF3466AAF2F14", + "de_type": 259 + }, + { + "contents": "1D6A8D083172AE3E8702D0EE72E9E4D287A4D5E38C3A7E1495E401CCE3BF", + "de_type": 539 + } + ], + "encoded_section": "BD90134CC217C0FBD454E2D3D0949340E43A9D911000EE29E650BBB7FBD251916DF635D491D290040E58986C5A7EAF8ABC13233D237727F371CA25E439F4EC85113F22A1976C74DEBF832FDEF351800FE7F2905DE22D101751999D5B7DE13736E3E77A2F2D07023F8E8FFCD09D1AF91F1688047ABE64023E386EB8883400886CB44B5FE43D6F93CE97A54AA75D277798754B4F1B5F3022095772463B1D354C89E943EBD608C6120B65DA030FFC13F78298E9BBAAFC12B24896A11A8F6F56", + "identity_type": "provisioned", + "iv": "BBCA152795FB88152D57F449CA9603B1", + "key_seed": "6F2DEADD30B4CCA84A011C445661F91CC6FF5786B49AE3F9154CC5841FD56555", + "metadata_key": "35D37C707ECA65275536D1236D349205", + "section_mic_hmac_key": "D83FE1496B06CD24079B117B21F94EF6603338EA01D295FFE274131046071F58", + "section_salt": "EE29E650BBB7FBD251916DF635D491D2" + }, + { + "adv_header_byte": "30", + "adv_salt": "0F459E925172A519DD2828299C75FE2B", + "aes_key": "1B1249ED7D76FE4886B6E526C6C9282E", + "data_elements": [ + { + "contents": "308DE47A8F42DEB39111A2096C20F7356B9839FE3AABA7", + "de_type": 399 + } + ], + "encoded_section": "51901322B7BBBF38950918837234007AA875FF911000264878B5796B1E75ADFE1ED50D18D19F9001049CA71F9B829E07EA5B5F30E7C9B2BAEC9D27BC5038EAD21DF880707BFFD71D641B82DAB89CAEFEEE01", + "identity_type": "private", + "iv": "AF47AAA871EB40799888E96730D541A9", + "key_seed": "EF12CF54E077C01AD5E5B289415D4AFFA7F2221BADF1D898E6F18629A0F1D91F", + "metadata_key": "77C71712C8591629DADB5FAEC758CDF9", + "section_mic_hmac_key": "8EFA1E5AD01997162F01D27CED8DD1A3EE69A32B54C6BDA3E46952F49E418DE0", + "section_salt": "264878B5796B1E75ADFE1ED50D18D19F" + }, + { + "adv_header_byte": "30", + "adv_salt": "3A6690DC2DDD695AA5A9075341B084EC", + "aes_key": "34DFB2535A916D318BAB185BF9A35783", + "data_elements": [ + { + "contents": "F06FA2", + "de_type": 506 + }, + { + "contents": "D4CB2D400A28", + "de_type": 335 + }, + { + "contents": "6DCEC9E8A721AC77680D2F1662", + "de_type": 831 + }, + { + "contents": "D17C7919F930699E", + "de_type": 762 + } + ], + "encoded_section": "619013C7CFFF40F84A407D614398DA241E9E4D911000D32C0F73924D558D708BEBB99A3EB0609002E22E4C8ADB99837CC58EC7E97001719A89E37F9B92E37168434E56311EBF0E5EBB3F9EE662EE2DFE006FDF44EE75196FA08CC8CC3D33B6CF236F", + "identity_type": "trusted", + "iv": "04F8366E46600D1C30CD191211A750DE", + "key_seed": "647DB8957DA90BA5FF55CF490C364BAA8C056638C1BD1D3D5F70302C92CD3A2A", + "metadata_key": "CD662BBD791D7F8C1E30395AF98E5D04", + "section_mic_hmac_key": "1A53E143075E92DE50221DF59303E82CB35533DD879EBFED762B353AFDBA1B5A", + "section_salt": "D32C0F73924D558D708BEBB99A3EB060" + }, + { + "adv_header_byte": "30", + "adv_salt": "6D431878AF6AC725647D2A3932D48049", + "aes_key": "05EE18F99215AD48B14552410229A4BF", + "data_elements": [], + "encoded_section": "37901341A817093CF4C8AAE012B9A9F6B79BB6911000290931A59120D1286A389550AAB835209002C91C9ADD7B5DC4E51AC8DAA513E4A209", + "identity_type": "trusted", + "iv": "4713233E1B8526CBDF59EBDAF4DF2A9F", + "key_seed": "2B25BBCB002C26DEBDAFF430909946F7B022041043BFC5232AFB086B348F1F42", + "metadata_key": "35BCFCCEEE33537EEDF1853BF0378767", + "section_mic_hmac_key": "0B1B7CEC50A244D8A31571BD3E1CCEDB22981CFE1AF50CA57626C072F9CD14C7", + "section_salt": "290931A59120D1286A389550AAB83520" + }, + { + "adv_header_byte": "30", + "adv_salt": "07510B91F77CAE102F146FC8BE46C659", + "aes_key": "779622B3641D512BDEDF2AE0650BC794", + "data_elements": [], + "encoded_section": "379013993CC70660FF52F2412FFC739C7453679110000FD5F8913D590B72580DE20C140E88809002190029DE26AE807D727B820A4AF588A4", + "identity_type": "trusted", + "iv": "91B96C70926C3FB16CE4CAFE91CD827B", + "key_seed": "4F81B6AD805AC41891E439D788B1D5C1FD33F97457AA12D6CA697E328584A24A", + "metadata_key": "9F62C8E787A9B44783A738A566E1FE23", + "section_mic_hmac_key": "87ADAA31C70470F253F408E88D004DBC4B99B7BD22C0159DF93A1C268BB84B45", + "section_salt": "0FD5F8913D590B72580DE20C140E8880" + }, + { + "adv_header_byte": "30", + "adv_salt": "7C1B9BDF63664F7A78C8FF842A3E5BE5", + "aes_key": "B14C39586FEC0DA3E623173EDF55E246", + "data_elements": [ + { + "contents": "68EB2518D2D2DC509CD7", + "de_type": 364 + }, + { + "contents": "A78A0427BF54D74DC902EC", + "de_type": 1000 + }, + { + "contents": "F234", + "de_type": 882 + }, + { + "contents": "E7", + "de_type": 916 + } + ], + "encoded_section": "5B90137644015B5C1628811212B508B4EF15829110003826BEB04A106A0C2B31C1EDC4B1A3389002C812F2014CFFBE215C1E0E1B040ABE8141945625C65300B5D2BF5564AF2E364C119C51EDAD83D99F339C21E6DE0F64C6B9F15C2A", + "identity_type": "trusted", + "iv": "1A7EEEE592C2E95079FCC1C2DB5B3C87", + "key_seed": "2F9AD59747B7A30E2D1D22E49F0A80F5FF8BAD5A540E65970CF0A9E9158A9CC3", + "metadata_key": "178A25DC5E2BFB2F016763C039CAA9DA", + "section_mic_hmac_key": "98B93838BF427995042BF3FEBE6F53DE0BB0A01C400E80E6215E16ED3C8BD32B", + "section_salt": "3826BEB04A106A0C2B31C1EDC4B1A338" + }, + { + "adv_header_byte": "30", + "adv_salt": "DFBE483FF56C948B67B543FA3C3B6810", + "aes_key": "0546270E29B03208CCF711096350B437", + "data_elements": [ + { + "contents": "4938A69A3826", + "de_type": 976 + }, + { + "contents": "AD51E90DCE", + "de_type": 985 + }, + { + "contents": "50D528C99515", + "de_type": 915 + } + ], + "encoded_section": "5190130C8A041604CB78FBD9BA86C48BDA6F5E9110001BF3E6C8ED3648CAAB9137B09117BF8E9001ED1A785EB628A70EBA116E5DB97F8D30605A40CC18B0D7493863758CD712B26F782CB123E25ACD13FBA1", + "identity_type": "private", + "iv": "8E27D6BD840DF5E03F5D9CF83E10A51F", + "key_seed": "BB595D62CC6E3A83C3CEB9FFC054E1EED6F7665F233FFE054DD17F93FB2DCB6A", + "metadata_key": "66E246479EF32D514A6203715F97CCA6", + "section_mic_hmac_key": "151D73D770876023679FB2AF853C5AC6180690F91A5464A8105025F6E963BF43", + "section_salt": "1BF3E6C8ED3648CAAB9137B09117BF8E" + }, + { + "adv_header_byte": "30", + "adv_salt": "993426DE3C76F95E6AE6EAF16EE882B1", + "aes_key": "23FF6D33822767F47C6EA2E7A3659F5A", + "data_elements": [ + { + "contents": "9F4B62", + "de_type": 40 + }, + { + "contents": "DD75CCA8B6EE91CA96B0F660DA7AEA0C787B6E4DD0BB8C0D68BF63", + "de_type": 250 + } + ], + "encoded_section": "5A901310EAAF5CC6F82AED3F7018345C326FED91100094461B35D320D920CFE92855684DC0889002752E76A47C2FFDC9C86586181F3AD4DEF62B1F4AD8AB6FD7832F108CA27D96405ED31670CE51A9582C2005E275A97EF3936F6E", + "identity_type": "trusted", + "iv": "908A568A36D18A8151DB2E23FEA891A6", + "key_seed": "891B77B866BC1361E8A953BF5776A9AEB8CE7AA8B34C48D0FD44EAE0C08137F0", + "metadata_key": "F7CE950ABACD4CC08649F5D72141AFAE", + "section_mic_hmac_key": "D948570C35BBC468884A3C9BF04ADB86D30132BAE6F39F4C6F6E4060D788AF43", + "section_salt": "94461B35D320D920CFE92855684DC088" + }, + { + "adv_header_byte": "30", + "adv_salt": "7EA92251924B66DF513A5012A6C6D568", + "aes_key": "7AF5D9EB8C289F13007A8024AA3E0954", + "data_elements": [ + { + "contents": "1D5E12A67C6225BD455705E9C6D5AB253A", + "de_type": 56 + } + ], + "encoded_section": "4A90130C02BBD5A0B4584C65E3B7D88A9EC7CA911000DD5511FCD7D808F50FF0080A6A41B3F99002965B9AA07C06770BDB145D5CC2C5D535D99E30DFD043BD92E9A89D29A0699B5F09A200", + "identity_type": "trusted", + "iv": "3A2CB91A70F515B1F1B9290FB1F0809E", + "key_seed": "25B553E985E762AA9F3B03F4B89BAC1FD0A3E9F7F9CCF586FF47F3F1E83DAD34", + "metadata_key": "980DE36843A6418160C53B68085FDBF7", + "section_mic_hmac_key": "D674880D748C81B5C248BF6EC8608323A5EE2F6E916E5AD2C24823C569492A0E", + "section_salt": "DD5511FCD7D808F50FF0080A6A41B3F9" + }, + { + "adv_header_byte": "30", + "adv_salt": "E84BF8A1E7FBDA1FCAB241D541A4B647", + "aes_key": "5B21560F602267F7E7DB688C69B10A5E", + "data_elements": [ + { + "contents": "BBD418E93E17C83B5AF5E67F2203094C", + "de_type": 667 + }, + { + "contents": "009A5DA2492D6E5DD01DED55B7A9BE695A", + "de_type": 849 + }, + { + "contents": "FB321D91", + "de_type": 529 + }, + { + "contents": "6D1B46C2935B79287C75EB347FEE52DD196F03B98188DFF4", + "de_type": 971 + }, + { + "contents": "D9299E84D9B7E84D3682BA", + "de_type": 68 + } + ], + "encoded_section": "8D9013F0B3089838810E7704B15BD78D08A685911000295591FB4D665C4B3388BFAAF769AFD09004E208729A8980B56196049A6C2B389E7EEFDC1842D4B0738B62C6C9E4A00D7C998A329B13A54F7741EFD8C22B34E996ECAB49B5B3D8A549EFA1EFBABCC4B90C45D434DDDA3C0A19D2BFEAEEF1103BC0D5925BC692A04C1E7A7BF76EE82785D75507448921F48F", + "identity_type": "provisioned", + "iv": "960F4158B1AEBCA6DB066F0B48984889", + "key_seed": "9BA51AB24D27BEF6575942CBE58DE2795F2D6A9C67EBBA56F938C23C15531A48", + "metadata_key": "A174838932FD40B5E30FCCA95BC31E0F", + "section_mic_hmac_key": "2680C01C16E0EFEEE4C602D9AAAB80FE3B83D8F85A2CE1D52EBCC2C0A48DAB09", + "section_salt": "295591FB4D665C4B3388BFAAF769AFD0" + }, + { + "adv_header_byte": "30", + "adv_salt": "0D89ECCEEE97F4AE796752548C4477B0", + "aes_key": "CB51E81286DECD8DABC11341AAF565E5", + "data_elements": [ + { + "contents": "7B3636268051172202DBCB2BEF58FFB325", + "de_type": 125 + }, + { + "contents": "6BE1759110F2DE04CA9F033B49E2E5ADCEE66BC5", + "de_type": 383 + } + ], + "encoded_section": "619013C9EBFF7BA86B7D87A821163495CD75AF91100063ECCD115CEE939180370ABB6AADB8E09004B8E73E111A704D49A74051C8D5A88261C3BBC9C79500E9F54203007442BB22C0C23AE735D4B462D85A6B31E0A77015E386C713DEFCC331C87688", + "identity_type": "provisioned", + "iv": "40553B60D6076492812FE60B01CA6804", + "key_seed": "26CB810DCB795E439A93DEEE6BB911B1F636B556FD8C53F23459F6302275C7C8", + "metadata_key": "8832629DC35BBB214C9B90ED4AC52608", + "section_mic_hmac_key": "107F6753902D9632AD49A70B0F9872D374E15B4FC9ACD9A4DD077550E73787C0", + "section_salt": "63ECCD115CEE939180370ABB6AADB8E0" + }, + { + "adv_header_byte": "30", + "adv_salt": "8980475911C04D64CB9BBBE789A8ED79", + "aes_key": "8F48B997309C0264316824863B46A5E5", + "data_elements": [ + { + "contents": "", + "de_type": 955 + }, + { + "contents": "85F677EB8010B1E049BBE2750E744709740338", + "de_type": 849 + }, + { + "contents": "545399ECE6558120CAC6843E616D2A66C625B46CAF51", + "de_type": 175 + } + ], + "encoded_section": "699013F558FE32291733B23028F005263532F19110003532D026D9F6B2293231174EF173744390028FBEF73FC61522088993E06CCEB4BBDEA63ACA01E37D68A8241A8BD29CE0C58A17D7C278B9AB5D1BCE16FBD9489B8BFC30AFA25A2042DB00F97BB0DF285544B6D66D", + "identity_type": "trusted", + "iv": "29D344C509673521133F5850EA86AF2E", + "key_seed": "F2EA3582730BDFE282331B42AE97121E21BDF182DBD69B91727A205BAA579037", + "metadata_key": "99E2FF341D58AB75D0127FDD2D425200", + "section_mic_hmac_key": "881AAE5C6151C026780977F62A81903441024E55B9F186791CC3E38B63AB6056", + "section_salt": "3532D026D9F6B2293231174EF1737443" + }, + { + "adv_header_byte": "30", + "adv_salt": "3D35695472AF0B0EABB5D2C51648E491", + "aes_key": "FA32718DEE6BCF406BBF3ED62D576156", + "data_elements": [ + { + "contents": "8CEEA14D", + "de_type": 890 + } + ], + "encoded_section": "3E9013BEA8415E76EB477D7CC18D98804303C19110001EE74524224EF14F78BFFFECEE148AD8900257A6CAABEBAE9381D8760C36858DACC5C915E94E62BB4C", + "identity_type": "trusted", + "iv": "C4E5EB3B1C38A64D16F6D998AEEA72ED", + "key_seed": "5F46CCC0833C98CC451ADD9220D928E9CE89E58D26DC1A0A2E33764B39B9F870", + "metadata_key": "2D5B9A4F7AFD2191247BBA150037597C", + "section_mic_hmac_key": "7730037D7F614061B40B893A02995EB25A63E4EC8AAC72DD8B8CEF2B461F3BC5", + "section_salt": "1EE74524224EF14F78BFFFECEE148AD8" + }, + { + "adv_header_byte": "30", + "adv_salt": "A5ECCE03A7C2509BAA2AB1D6BE71E928", + "aes_key": "0B587FBC29C6D813154219CCE15116F5", + "data_elements": [ + { + "contents": "DF191813F52A", + "de_type": 647 + }, + { + "contents": "725563C23F3804C841FDE67E6E51461F0F2DC9F840", + "de_type": 899 + }, + { + "contents": "1B5D86F0D9C956574F6A3A27C2044B10AB81A255377D7D8AA9", + "de_type": 364 + }, + { + "contents": "D63DA88FC2DBD10C8A92B0", + "de_type": 256 + } + ], + "encoded_section": "829013AD8991F88073B5CA5DAFB2FE708649929110006B0F8560F8FFD0C6E71A028CDDE232F390010E56B36364E1D87122920F29C303A359319472A2B83A3FB385359CFF3F51E2C87F1ECD965F036D359DC840E1B104E530C8F35B796C2E72447468E7219900C8484FAC302632DA4A8F447CE411CAFFFACF26066F40CB9BBA739C8A36", + "identity_type": "private", + "iv": "00429B2681196B02A26C1C02684BB3ED", + "key_seed": "78060E15116E06B5825588FB3C02A33BF1FA963E58CE8DA6C99E7C70137FA362", + "metadata_key": "0ABCAA033AE39B19FB9D30501F5819B8", + "section_mic_hmac_key": "09CA0501CD4C4E1C040C4BC108ABB945485B06655D749FB7793D11139657FC89", + "section_salt": "6B0F8560F8FFD0C6E71A028CDDE232F3" + }, + { + "adv_header_byte": "30", + "adv_salt": "B60D3EADB0A155E05F9BBE78238857EA", + "aes_key": "6FEEE0BCCBDB7BC1D3082DDE80DCF582", + "data_elements": [ + { + "contents": "AAD964BBFDF41816E109E9A6A9C2B9FFEB5B08C45E2039", + "de_type": 271 + }, + { + "contents": "27F1E36F467A1DF69F379F26AF8C26652BF1189B33D2860620AD", + "de_type": 724 + }, + { + "contents": "D77DB60BA95D50366DAF4E0B23", + "de_type": 329 + }, + { + "contents": "C1C4B4CAA02C898493DDF5B8C0159C199A3AC2E3A50C", + "de_type": 528 + } + ], + "encoded_section": "9790131AEB7D53743A85CDDA3D06FD34E5D30B911000F3F0F371BA25F95A5604E8812C8E2D819001A09AB5DA90086A8CFB40E9C57E544CD80CE73710CB80D8A4AF0B284883866397C4E741F4F16EDC191CBEA93E8F9C8C94AD22DD699741F68704B6CEE74C61CC59B07FA970378357BE11F4DAAB1157C045AACCF979342D934D5A7154574C5FAC9C522D0F8228BAF6F82D5AB851CEADED82", + "identity_type": "private", + "iv": "411A5DB92AEFACD6A6B37B000586D0AC", + "key_seed": "A04AD3E70302B99AEF07906B2B762047B970EF8A200D1ED6CBD28476BD85A331", + "metadata_key": "A023B5E00CA83ADAA212B1D64A5D06A1", + "section_mic_hmac_key": "3C1DEF68478B281B581A8747F7D8A5B2ADF5FB49A495EF554110685F2B7DC5D2", + "section_salt": "F3F0F371BA25F95A5604E8812C8E2D81" + }, + { + "adv_header_byte": "30", + "adv_salt": "5661C7B50F7399E237F33E4766620EF6", + "aes_key": "386BA145F32F66CDAF5F1216248C4FBE", + "data_elements": [ + { + "contents": "12C2775438394CAC486D9352543D4F28970AB925AE", + "de_type": 708 + }, + { + "contents": "08FD1092CCC12B09D300519B0CDC6401DD", + "de_type": 706 + }, + { + "contents": "618B6E2DF482703D2CE2C8DAF386B929F8DABEB0CB7B203EA0", + "de_type": 395 + }, + { + "contents": "84DA0F232629", + "de_type": 95 + }, + { + "contents": "D8EFB0C07BB7F632E268EAEECBFD5580EC1A5B0EF432C03DD861A5", + "de_type": 570 + } + ], + "encoded_section": "A5901317309D406C29FEF9E2B0625DF0610CFC9110000B472B8FBFFC54950637585AFA22D5509004FF43D777C9F0350F5CC37D073CCE92BF1304DA2FA06451DA01A1E1741040FCF892BE87A46E3599ED878980B2618C7877DFD0CF1D805062677CE60BF8EF94376E283B17D6BFD2B3E47A14B183E0A8DA63E193F90FA0C5B3A5CF88274725414FDE243394B596BD72CFF6764A983AC46FFF3E66EE489B2C480F63AE1D2A6672", + "identity_type": "provisioned", + "iv": "BC345684E602976E5451D5F182330582", + "key_seed": "8FB21F7DA6D21B3C74FA79DA8B1D2C1C9F08C6D5D92A788EBFBE686CDA2363F7", + "metadata_key": "BD24EEB64110C56897A7526D714C1B9D", + "section_mic_hmac_key": "966F0302B8CB8BA4C588CC61A8C613212E5AB8AA530C3FDE9956F4675D188453", + "section_salt": "0B472B8FBFFC54950637585AFA22D550" + }, + { + "adv_header_byte": "30", + "adv_salt": "E8AC69F87CD8D8E7AC003EB05319318C", + "aes_key": "4762F0AF4F9DBE629D3FA4E7F5EF69ED", + "data_elements": [ + { + "contents": "584B9E443F799CF5A237ED1A90BC64A5347D4CF5B6F6", + "de_type": 700 + } + ], + "encoded_section": "5090133125A01F41198B89512B2E6789D97CBC9110009DEEFC57FD2CC2691604CDB0037C5ADA90011ED9AEBD11CDF10F03FA38E223D5EEB742C6A1FE96FCA9D8E574B3AFC3B23E9009B06F25DE8FA9149C", + "identity_type": "private", + "iv": "9E710005012C74225422BD12E64463A3", + "key_seed": "9E86D7D3AA5528D0D529681C941AEC12D605868B4D8504402A0E871AF45C0E72", + "metadata_key": "68DC6B506A83F52A9376958D6528B4AD", + "section_mic_hmac_key": "877EE9AAB694D7C9CFE7A28C7EFC208047CD35B6F802E0A4804C4ADB877037E8", + "section_salt": "9DEEFC57FD2CC2691604CDB0037C5ADA" + }, + { + "adv_header_byte": "30", + "adv_salt": "661FCB47FA67B5328E1C07086CF91032", + "aes_key": "4A67204896566D0EA552408DEFE37A2B", + "data_elements": [ + { + "contents": "C6DEE49C7944A768E00242ECD44129EAD078153F7F5128B3", + "de_type": 825 + }, + { + "contents": "7951", + "de_type": 998 + }, + { + "contents": "8779555409E658B45F916687961397D88E2484D4", + "de_type": 21 + }, + { + "contents": "", + "de_type": 289 + }, + { + "contents": "77246DD4865D6982E24BA67FAAF627E5BE8370FF91ED97F2EA97DF", + "de_type": 75 + } + ], + "encoded_section": "8D9013DEECEA5F0980DFE5FF791C6B9D245BA3911000995E99F9B9E2BDD3036ED14D6904D6B19004056DB3CDC392922A66EE7CB5AB5966BC3C8970EC5DDEA9A88237BC7BBBCFB6F30FD944F7820BD45CF5D63334BD3A5F392CAAC8BFC8460F60C17CEC1CE0D56839FCC1F9D412E47BB2E7B4D1C49908ABEBE1DD7BFE99D4F1C09116B47DB746E5D67A015B46908A", + "identity_type": "provisioned", + "iv": "A37E4E6E61BEF6E55B309AE5C746F5AC", + "key_seed": "FA6D33246E99E41066ACFD0381D778B908A0E298D510508C8238161EB9FB57C9", + "metadata_key": "A9E99B3DB7BC2DC0861959FA9EABA87F", + "section_mic_hmac_key": "532A8F76A3BBE0711005A126C8A63A59A76702A80372D6AA08301BBEA5878019", + "section_salt": "995E99F9B9E2BDD3036ED14D6904D6B1" + }, + { + "adv_header_byte": "30", + "adv_salt": "6C1F3486166215C3D44981140FA00E7E", + "aes_key": "03D881B6A9D22AE7E5393547A0AF68BD", + "data_elements": [ + { + "contents": "93C31033E2", + "de_type": 236 + }, + { + "contents": "8516881D4AE2302077E4226597AE397845E301EDC63AF3DBBF254F3D84", + "de_type": 350 + } + ], + "encoded_section": "5F9013BF2225F68FCF6A2A9CF8F08DC7BDE6559110005A42B78DFE6ECD8495FD94FFC5218D9B90041E49AC53C6D6FB0CD1B59CE9AA0FC8B5E584EF2AC261B30354675A04BA9CDD34C665732CA32F8BF64CA7A9E44A8D1BA0EADE42A4C2C7CCE9", + "identity_type": "provisioned", + "iv": "738D2E87250EBA0133B45061C943FD51", + "key_seed": "8A91F91C0C7164722766182BEFE0C7676AE00DEF732D440FAC83E1C046BE96F8", + "metadata_key": "C373EBB8A7AE60D0845F6D3E3DB0F466", + "section_mic_hmac_key": "A67E1FCB4BE3644D1F8B613607C1AA671F9271C33E463569600D799F07B6D557", + "section_salt": "5A42B78DFE6ECD8495FD94FFC5218D9B" + }, + { + "adv_header_byte": "30", + "adv_salt": "A4F5D9BA01D3BE606F216EBAD7775C60", + "aes_key": "A9ED3079B7139B65069F9D03015280B3", + "data_elements": [], + "encoded_section": "3790130E4539939983645FFCD1D23BA41A0C7B911000EC62B07DEFAAD4E56591479BEFBE6224900422DC0DE0453B7C022EA9CA53AE356878", + "identity_type": "provisioned", + "iv": "4E934E8CD83DF483CA10D638290AA616", + "key_seed": "44C2B3506DCEB5A58E373F469167188F4F806E5543358C29CF8A3BCEC1DD5722", + "metadata_key": "D2B68CCA820BEEBBD9F539D605DF3DCA", + "section_mic_hmac_key": "8D76FBB29C7430E47F34C044AFFFEB3F3BDFFD257B8DD69AA4F5C3FBC9E8A923", + "section_salt": "EC62B07DEFAAD4E56591479BEFBE6224" + }, + { + "adv_header_byte": "30", + "adv_salt": "5F6FB995D7CC9770A1045F3A9F40CA81", + "aes_key": "242F9B8083541ED747A8BBDFCA8ECDA9", + "data_elements": [ + { + "contents": "0F12B68A338AAFA90DE62513B994AB5F8F1494C7079FFDF1", + "de_type": 233 + } + ], + "encoded_section": "529013E54379FA3C4A05471414BB4A36EBAB09911000145B207075C013CA154C2913861B1AA09002ABC9352B5B4386BFC54CDF208613E44078F3A071B32DD27ED6033ACC3FA4C1FD4F207FF131DC16D300F123", + "identity_type": "trusted", + "iv": "F98E66FF52AB84CFA560C55213C7F797", + "key_seed": "E36464273854858918F264C2C20998686BBC15865B7800265D4CA044BCEDAFA4", + "metadata_key": "64DE8C2420A8C35F2790555177AD2FB5", + "section_mic_hmac_key": "2B5B7C883EDE52F3F0CDBB631C818C4F979DF1A577716C1F2DC06F5F187B66BD", + "section_salt": "145B207075C013CA154C2913861B1AA0" + }, + { + "adv_header_byte": "30", + "adv_salt": "F87B918636F2CCA6489523D683C7794A", + "aes_key": "42C6CC3C0F38EF9F9F90D66FCE0E7F2A", + "data_elements": [ + { + "contents": "CA17436867B321AB43AEDC6B17B5F7E2B70F", + "de_type": 287 + }, + { + "contents": "3F3980E7C64BEDC344F09E8A38EC428699F46B4730", + "de_type": 1000 + }, + { + "contents": "425DE4D96BE2CC3BC3157FDA90E79329D55A475866", + "de_type": 960 + } + ], + "encoded_section": "7C901313F5E405835EFB18227A9A724CBDF2CB911000C071FB4FBFAD007203E02441A50CF9E7900408F48FC18E9E5AB227158F46527D2DF1E3E8B5860EF2B8D15F4267B131735E0E883A0EE7F9702CB3BB73EEB51FCC3086D903053EE88C2B19D0DA3D7854ACB4DF69317530486D18ED42617F74FD5820C7A1B33229E7", + "identity_type": "provisioned", + "iv": "EF3F84E7847D4B31B3FF9B5B0428550D", + "key_seed": "F486B9021DA5ED704CFDBD9825F6D70A5906482EDEABF0226FB45DD75FB969A8", + "metadata_key": "C5D3486E302957ADD4338FEFBE46B3D6", + "section_mic_hmac_key": "96D349AEC4ADB8D9510E3A3093A0C782CF8EA7B6FCF1CC8ED7B5EE269DB1948C", + "section_salt": "C071FB4FBFAD007203E02441A50CF9E7" + }, + { + "adv_header_byte": "30", + "adv_salt": "A7711441846DEA01B5B115B07EE0E586", + "aes_key": "DF79F55B1148D2412CE4907F5017A956", + "data_elements": [], + "encoded_section": "37901336311674D31A1B1ABCA412E87C7206BF91100000E2924EE1771AC6B83C73EE8A6EF9C690013F081118E055F4F4DAA14FBC14EC82BA", + "identity_type": "private", + "iv": "18A45DB774486000FB318F4D68FC75DD", + "key_seed": "02F2C8B3CDA9BC0D8B46B5ABFF653966E444DB5F5A2471474CFB15D5F8D0FE64", + "metadata_key": "23BDAA88D6A6ABEB5C52575E903B68DE", + "section_mic_hmac_key": "55730CBE224F5744D3ABC9666FAFAE3075A3AB1BA891CA8D050E32BB644A4479", + "section_salt": "00E2924EE1771AC6B83C73EE8A6EF9C6" + }, + { + "adv_header_byte": "30", + "adv_salt": "77A40860E9F2D85C18352FE4DA31AE6E", + "aes_key": "F7EB2CE11EE2C72B3E98A799AE37B71D", + "data_elements": [ + { + "contents": "60ABBA2292C2", + "de_type": 249 + }, + { + "contents": "A4870338A81FFC6CEAE2C7", + "de_type": 779 + }, + { + "contents": "B63A10F37A861B79084AA7C6F0C79BE8DBE1B308C7A01C0ABC2A", + "de_type": 711 + }, + { + "contents": "640CDFF15C509989A5BFA77595B5CE348F4E31F6FD34027B08", + "de_type": 410 + } + ], + "encoded_section": "8790133735FEFE7C6C40C0AE2247E7E636393191100025B25F70B4E9701CD2E3D445FBAE117890018D0D255253A4086BE0770494720E0660480571F5F2218A4DAC55FB99D9D18AC77ECD3E4D6C73B27443D8FD663193029BDA29F6394E6F93DB00C33C8F4FF3CC95AD718972008088394F42C6E7A13B8C1374D4F666D6B8179B1AFAAF9BB23E80A4", + "identity_type": "private", + "iv": "7A1B11E2E1BBFC21137D5DB6812BECF8", + "key_seed": "71564841B0C867D87B9EDCB4BD520E0697AF8F85E3782D3430B8BC37DD23B43D", + "metadata_key": "3A3DCC0C22746DF5545BDD3BA1684B67", + "section_mic_hmac_key": "5CC0B01B3F01D3099CBF99A7D3F71F0A91E6FDB26818353271F1B455763BCBAD", + "section_salt": "25B25F70B4E9701CD2E3D445FBAE1178" + }, + { + "adv_header_byte": "30", + "adv_salt": "4F1859CAFEFC8C2B5658B634D7678C20", + "aes_key": "CFCE78B7C4624ADD1507D3D9A63EF82F", + "data_elements": [ + { + "contents": "DE41EA88487B4999D93602", + "de_type": 499 + }, + { + "contents": "48C8543DF38BB0CB7A4B439160", + "de_type": 22 + }, + { + "contents": "35210282", + "de_type": 730 + }, + { + "contents": "75BD", + "de_type": 338 + }, + { + "contents": "92668CFD5C1B", + "de_type": 956 + } + ], + "encoded_section": "69901392227E7E09CD7396BFBD624A49AABC7E9110000DB9529357BB517E42EDFDC2FE4DC8B090013B4FEF7464D942431636A3E5860668B2FED6C3283B785E83A3BC45B1512C66F382BF7AD7868A9CAB33ABB4D335035B21D1E4396C945F1B8066E8568CC40BCE5D9A5C", + "identity_type": "private", + "iv": "2259C71FC8CDC81D9403EF089F159308", + "key_seed": "7C22FDE6E42BEF50DB73033774ADC18BAF2A3C0A53CA30D36ACFC5582EB25100", + "metadata_key": "DB170CBF39A5D48D3F6B0D40140A4257", + "section_mic_hmac_key": "35235B50A5E921ABEFF4BF621956CA22F581D42BB3325A39C8C2D102F75D333E", + "section_salt": "0DB9529357BB517E42EDFDC2FE4DC8B0" + }, + { + "adv_header_byte": "30", + "adv_salt": "0985A4C1FC767EF248AFAA00E0ED2E47", + "aes_key": "0CE73306D8D0AB56045815F2AD20B25A", + "data_elements": [ + { + "contents": "D3D3905C6BEA12C7123B74AB40858D04", + "de_type": 792 + }, + { + "contents": "713F3EB42E57458D4038D809B35106DFF259EA4C4F1F17819E96", + "de_type": 720 + } + ], + "encoded_section": "6790130FC5A44C70B4AD43316DD6D38C4A4845911000026C2E6E34CC1156B5E7EE8221D4A7F290043DD0DB3E9C9BF801CB74473C77DDE2D6329F38BFBD336FE971057F3D2C8C8EF610AFCBF1A5D8C24EFDA93762195F1A863CDC617CB8D317746EA52A7BB0961F3F", + "identity_type": "provisioned", + "iv": "D732D335C908BBF51DFFC3F80FBC75C7", + "key_seed": "F72828A9E550CCB3EE653BEA22E097839072D8D60280AFC2FBE2435D5095979F", + "metadata_key": "ADC1B18C69F7FD30DAC6EC2696F70EAE", + "section_mic_hmac_key": "0F64E025E91492D0AC4434D844FF48CD98C61BCD3E25F9CCC8E1333A81D27A9D", + "section_salt": "026C2E6E34CC1156B5E7EE8221D4A7F2" + }, + { + "adv_header_byte": "30", + "adv_salt": "F753952E84F321276818619F5E2DB7A5", + "aes_key": "BA5479576FEC84060B7986F71751215E", + "data_elements": [ + { + "contents": "174BFD", + "de_type": 274 + }, + { + "contents": "99B7C0C5CE238C6F963A4722865CFACADBBA8B95B18C70AD4267727F81", + "de_type": 212 + }, + { + "contents": "2EF69250213CDA930A85A93BA85F087B9780", + "de_type": 81 + }, + { + "contents": "87", + "de_type": 13 + } + ], + "encoded_section": "739013700384F06906581AC9BCFBCBC2AD496491100096C7B1C5DEFCAFC64251AC87CDCEFCED9001D2B0215328C8DB53DECBDB25F97DBA53A67D02E1DC1F83D6E91AC7B2CF8DCCA4277ED359F6838431E078A50199B4310AEA200307AB216B82348B0024206A6D0A3C79E89CBD254D8426E7BEC1", + "identity_type": "private", + "iv": "FFA79DBF3BA0EBDE530A72A2D8018930", + "key_seed": "132DDE0DAAAC4F4A03CF1CB2B8F4A8FE41327C212AC3CE1B1C854EFA2EE3060B", + "metadata_key": "E61C0407C95D18D5DA193C062801B3F2", + "section_mic_hmac_key": "65CF0A0155EEC7EAABA2C02875F773696CECBDC64FB57E0BB9B7884B174EAF42", + "section_salt": "96C7B1C5DEFCAFC64251AC87CDCEFCED" + }, + { + "adv_header_byte": "30", + "adv_salt": "7C6A90B2F9FAC1C86AEFF121052D076C", + "aes_key": "E73FDA1B40CF93E9561E963B728E2D8B", + "data_elements": [ + { + "contents": "B4F512F3B1639C980A124C94E365", + "de_type": 848 + } + ], + "encoded_section": "489013E7D5DEA0D3B68FCB72D18D623072BDE991100089D76603BB207098A3E6631BFBEF7C329004FB1B665EBA76ACCCE96C07AD83F4BC53948171B9D2DD42122AAAEBF0827973918D", + "identity_type": "provisioned", + "iv": "7B8C0BE7E83DFE973D0817AEB6CB6F63", + "key_seed": "67E08A4FC51867E3A0F57543149D05A2B1DD58C2B77B39F5F4EC5B707007E46A", + "metadata_key": "AF5A1254567F43ED18CCC0C024010B4B", + "section_mic_hmac_key": "8914563971948EA279A2189CDC04749B53E5DA3429FDA1C6F161E96465A76413", + "section_salt": "89D76603BB207098A3E6631BFBEF7C32" + }, + { + "adv_header_byte": "30", + "adv_salt": "FB3EAE2C571C503CED9B656B14BFD0B8", + "aes_key": "30A2ECDA5B5CADF19936D88CD6078144", + "data_elements": [ + { + "contents": "908D4CC782C9EC6222B92FEF8662DF086B", + "de_type": 816 + }, + { + "contents": "2E23352D", + "de_type": 290 + } + ], + "encoded_section": "5290131C34CA643645201E9143E49FEFFBC4C29110000290E81B48B49A315AF4EB0A583B626E9004D8209185C733910032E4252CF793BAD9F4F50FEFC22E595EF0FABD10B50361B7AEF6780F22A2AB9E82D359", + "identity_type": "provisioned", + "iv": "83D6520D6383658D1BCEE9223496A13B", + "key_seed": "C33B862F2494CC516A5CB13A5B8F8905E854AD720F4AEB3C2A0788B194920AC5", + "metadata_key": "1170B8A823A46A9F89D03AB849A8B6C7", + "section_mic_hmac_key": "618F13964E241E73FE3D19F653606FD22DC35E8B402BBE581766F12918B2C749", + "section_salt": "0290E81B48B49A315AF4EB0A583B626E" + }, + { + "adv_header_byte": "30", + "adv_salt": "8CD348B153FFFF829FF59CE087B45052", + "aes_key": "0BA7C51985112928B9DC28E7F65425F1", + "data_elements": [ + { + "contents": "5749", + "de_type": 817 + }, + { + "contents": "F5B9E550C46360EC4810134DAA69B4775E96F03AE0", + "de_type": 10 + }, + { + "contents": "C213FC8E1F6F5335E8", + "de_type": 937 + } + ], + "encoded_section": "5F9013088BC9173D4977CA45D6A1C619348876911000C5D9A37193D9E39A5EDB0F67163977C49001D8FEA804E8BC4013FD7B414D7FEF6ECE162DB0B42893FFBC581ED0B3A3AEABD9530827277802B92E4C2C55F628405E6EA653E237A672ADB1", + "identity_type": "private", + "iv": "A135C384B47C184EC4482051FF8C2E31", + "key_seed": "07B091E071F437A31B8703BBC3936997184E61121AD4F7EB5F492E3DF8DCEA53", + "metadata_key": "01A9B84A7827975243E7B3B2003D084A", + "section_mic_hmac_key": "77B8E093C3E828051F2B2518EDEA3011F482628A8ADA7746887F96E340F412AE", + "section_salt": "C5D9A37193D9E39A5EDB0F67163977C4" + }, + { + "adv_header_byte": "30", + "adv_salt": "B40F18FA69C0FC048DFB0AAA5B0AF0BF", + "aes_key": "3709DF5F4E0A2AAE14602A75EF722DC2", + "data_elements": [ + { + "contents": "B753D510831709EA0C3D738C6033D01A271601AD5978633E9D", + "de_type": 48 + }, + { + "contents": "8367AFEE3BBC94F736A29A7E2714845B5360021AD4FC68FE97E0DF36", + "de_type": 263 + }, + { + "contents": "05D52FCEF6F06D00BF235214C2207E8FB73E3574515D1325A0F8", + "de_type": 595 + }, + { + "contents": "4958A61B59ECC3D66E", + "de_type": 573 + }, + { + "contents": "C4E5F7EA67D7A3F95CF318762C89", + "de_type": 276 + } + ], + "encoded_section": "AB901366A1922F253CFA26D8D248EC4A83156A911000664460D3622578B621D4F753C362904090041092245FE1A57603009BC851D8758A0C7BAEC65F18C94BEE0C0CF6B209BF24B4EC66421EADC280BF1E943750125723D6D59E2B4E0325F9D439BEC4C630B1BC28613DD0F07C2BCDEE6F0A87E8C503B0A4DB22EA76CCA4D86815FA48A96D034570E6CC5FD1E888AE0435D5B784012AA6F0B2E32A10FEC8E2365DBE2A379355E3D65553E2BB", + "identity_type": "provisioned", + "iv": "6F4B43F8D4FABA78459CD81AA33BE4CC", + "key_seed": "BACC0678BD1412CE8F69457D531543891E60D6D28FEA990794BFB40D21AA0949", + "metadata_key": "884C8032F452425CDD66B638C8FB39F6", + "section_mic_hmac_key": "3CEDAF60E90EA68B0E4B4FE3D631A93C699417513FCEC675EB4B0F685EC4BAD8", + "section_salt": "664460D3622578B621D4F753C3629040" + }, + { + "adv_header_byte": "30", + "adv_salt": "83E1288467CC4B24710B345A19B062D5", + "aes_key": "3872F4A171D57E391B108FC34280941E", + "data_elements": [ + { + "contents": "FE41644BF9217FC149AE426A3A110D8684EB", + "de_type": 837 + }, + { + "contents": "CEA178B6B05E1B76FAB7B6C490BC2EAC7704BFD6", + "de_type": 284 + }, + { + "contents": "BF", + "de_type": 363 + }, + { + "contents": "A08F2A4028CEAD4E909837", + "de_type": 141 + }, + { + "contents": "DD907152A5", + "de_type": 296 + } + ], + "encoded_section": "7D90135402E36E007ECD6B8F063C2AF686CEC59110006EC04E6CB0B5DCBCCA90417478CA71FA90010CE62BF979B4123E409ACD9785748E8A30110CD82591D58B1090BCAE8031E1EBCB0B50B914F9C3A616D670ADBBEACF2DA6D5A9E7903EA5A285EAB9FC52D80D54B98576FDEDA10E108BBCE4A44725D5D11AB69EDB3A11", + "identity_type": "private", + "iv": "948B1C0AEFF273FA05E61AB83A67B1E7", + "key_seed": "948CFB8CE79FE0285B4F35335C83A9C12BE88049A60CDDA8A54F03EC5E8B188D", + "metadata_key": "14FB446FDF7BC2DB3BB63D91B78835ED", + "section_mic_hmac_key": "A50B781DE993B3D37EEED3B5957AF0A16DE356C4E5EA6206E010B8542B8180B8", + "section_salt": "6EC04E6CB0B5DCBCCA90417478CA71FA" + }, + { + "adv_header_byte": "30", + "adv_salt": "F7FA2B1220E713D37D5D4219E841D866", + "aes_key": "6C09B48D2E9252886CB8476628E49EA6", + "data_elements": [ + { + "contents": "FE93A34B0B728ECB4A1A23B7", + "de_type": 938 + } + ], + "encoded_section": "469013713B65A9B2834CC302E660F1516FDC529110004BAED26B52E7D85BAD585AACA26600A990012172B89B62912AE533F371A8CE4F587B90B48A534F119A5F6CB20BDD6FCD32", + "identity_type": "private", + "iv": "A6AD44BD75DDB36D3E11CA72047ED68C", + "key_seed": "47690302DC37FEBF9C4D5CC6453DCEFC40DBB204E5A7A81D0B30E74247BCDA80", + "metadata_key": "C114855EDA0E56FA324577137E531FEC", + "section_mic_hmac_key": "B4904367A2141DBFE77167BAC1FE7D508DC07B7496B26448682FD7FF3215B8AB", + "section_salt": "4BAED26B52E7D85BAD585AACA26600A9" + }, + { + "adv_header_byte": "30", + "adv_salt": "397B5F51522DFEA7E1B243BC5D947FDA", + "aes_key": "7BF127F44E510A7B407A4C35B82172B8", + "data_elements": [ + { + "contents": "9E3AD15489CC97EFA791DBD20D6D59F1D9A1D055F080076C9E0849", + "de_type": 313 + }, + { + "contents": "0F8046", + "de_type": 262 + }, + { + "contents": "3A76F640ADDA98B2009266BAEC469C8F33D2991D9AE4F48D13E5", + "de_type": 693 + }, + { + "contents": "B98E5D7725F819C7860151C7C6E0B6", + "de_type": 970 + }, + { + "contents": "8E497812B532C1731A1E42BB0D", + "de_type": 131 + } + ], + "encoded_section": "9A9013623FFEC846FA4EC80AEEE5874F724150911000E4DCFCC4EE61C6352DF5285906A7ACA19002CE3757CF407DBA7A4AC984C7CE89DC1E5E88F6B6DE50085A04894DD3DDB94DBACD840C7744A81D9273C6D6B389314C7DE82B39FA0EEA7F9EF932B412F2B43EF444E59722BA59A51E54162417D4D510FFF996861298FC0346008F9A960744495B72F646ACA5B3607F8EA4C345AFD418DFE65A5F", + "identity_type": "trusted", + "iv": "DC4BBB79EC29CCC02C79BEBD45C7BB70", + "key_seed": "874471CC674DCC5A5BD7E8207CB62F4862C69B6FB28F86BE947A8249F8AD45CA", + "metadata_key": "B8420F0DC2CAD8BE94C2878461F62CA7", + "section_mic_hmac_key": "A60A350281B1B0C59E0F9E44DE3F139D4D5278D21E9325B60A0C1099981C4D47", + "section_salt": "E4DCFCC4EE61C6352DF5285906A7ACA1" + }, + { + "adv_header_byte": "30", + "adv_salt": "14A4E23F310594A923AC2B00CD26FDDF", + "aes_key": "033A7FAED90FD1A0FF7080EDC2D150AD", + "data_elements": [], + "encoded_section": "379013EE55550B8DB3B2D0626ABA7D899DCB1B911000F83C0914EC025DD986BF39B9AA4633D090018687E96989F94FF3D2365FB2CDB89BEF", + "identity_type": "private", + "iv": "E4838E64DC9F04328312FC0952FE1955", + "key_seed": "32AC43A2C4F720EA7255D9B5025B7219801F4A728DAD5DE4C841480BFC6CAF0B", + "metadata_key": "DCD150DA1D4622EA1FB364C64CC56352", + "section_mic_hmac_key": "5713D6A91073B3FC250693CF7608174F7B5C8BB0B89717849AF78745F4BB74FA", + "section_salt": "F83C0914EC025DD986BF39B9AA4633D0" + }, + { + "adv_header_byte": "30", + "adv_salt": "9A5A6E11C1791C48E6BC440FD2B275BC", + "aes_key": "54D9612F2A7BE396A390954DFD2F2DB0", + "data_elements": [], + "encoded_section": "37901371B7C653BFB0E41F1BDA3228F707E39E91100058E26761B259F743F644564A6B23A0CC900155CA0E1E76DF190C54E9142FDBE55CFE", + "identity_type": "private", + "iv": "6B14BB04BBC14392A524A69EB6316F51", + "key_seed": "965BB1781732640C7237DDD1679D07C089927C6A869442EBB23960B536262A9F", + "metadata_key": "7FA623CCF685E489F680D2898580DD72", + "section_mic_hmac_key": "D3FC8D9843906152A789A16A150C0BAACA74BB5AF33A886552CBFA7C6D529029", + "section_salt": "58E26761B259F743F644564A6B23A0CC" + }, + { + "adv_header_byte": "30", + "adv_salt": "64006DB572776637FD097DE973732A7B", + "aes_key": "669E44E9F98F153D8179E44A19F25623", + "data_elements": [ + { + "contents": "7B", + "de_type": 638 + }, + { + "contents": "F00D4AB2C34F139458F1AF9265FA9EA175ED4EE85167", + "de_type": 958 + }, + { + "contents": "87417FB6114F", + "de_type": 499 + }, + { + "contents": "683ED3E93B91EB3FAED44E29457BE80D878415985D41B5F460", + "de_type": 129 + } + ], + "encoded_section": "7990133E374729219551A1BB61EFF4D5AD6B6791100034159DC9EEC690F4ECD6A20A569E8CD29002A28031BC640DEB07E8AC9C7F941289B1327A5247718B0AD60B2A8769AF9749567EAF8A236425CDDF878FE17A735BF4AAB4ECCC4FC34AF217238857F87A06AE9EFAEC7C85452D2439BC5E9E08CF568AB5C7FD", + "identity_type": "trusted", + "iv": "26F5D4D8B5EB6069AEF2B6E435D30DB8", + "key_seed": "15A1B8E687F0DF912101CE373495959EE40D2D1FECB951B41C87DB9A0B4C3EF2", + "metadata_key": "4ED47FC3167C69F90160E2A9BDDC6A8B", + "section_mic_hmac_key": "7DE079745790A823A62470384F692A5CE4AD1C757AFE96917811EF13AD2CC8BC", + "section_salt": "34159DC9EEC690F4ECD6A20A569E8CD2" + }, + { + "adv_header_byte": "30", + "adv_salt": "5DDB5AA2FA3F0A61D18C52E9DE22CDE6", + "aes_key": "E60C3ACE2E521468137DAE60C115B3F5", + "data_elements": [ + { + "contents": "8DD936", + "de_type": 244 + } + ], + "encoded_section": "3D90138C161B53E44488EDAE5C545A49CB632F9110007272DFA635A1B1F42A62BE9147CCC4429004CE40129E8D256DA63B8B6AFA1FD16791EB33FD546813", + "identity_type": "provisioned", + "iv": "C03127C86766B5299AA2A30C42931072", + "key_seed": "A0F876D63DFEBBBC68F52B9A52582992D53E8DBC84DCA86598DDD6B41F1994D8", + "metadata_key": "189A12F2813D0C3D6E6A852F1298AE8A", + "section_mic_hmac_key": "853A31A3BBD636810AE5DEA65BC5739408F9D7DC1661B56D0E54A60A9C59DFE8", + "section_salt": "7272DFA635A1B1F42A62BE9147CCC442" + }, + { + "adv_header_byte": "30", + "adv_salt": "9D031FAD682DAA4BBCA6912CCBB83C09", + "aes_key": "E1B5FA0F1A67F72E01B807F6495C6393", + "data_elements": [ + { + "contents": "BA0688D5", + "de_type": 327 + }, + { + "contents": "CB0502569855FDA6DDA289FB7CA7F8447CB118E542", + "de_type": 880 + }, + { + "contents": "99FF", + "de_type": 940 + }, + { + "contents": "", + "de_type": 195 + } + ], + "encoded_section": "5E9013101E7BB804EC51155AFE647EF89D6FAB91100042441ECF37BAF5319477A42541165CE49001AB8ACECCD8F482909FBC48F308CE76945B74681CE578A664996962BF4F4960586B4D100A83BCEFC21C073BE5407B32F6FE37E4181A8416", + "identity_type": "private", + "iv": "006B7FFEC2A4BC7AF80376E12B9CF206", + "key_seed": "3FDC2376B9AA5ABAA54091F4C3D17E62453E5C4BCA3F7E97D02C087E3D3E56EC", + "metadata_key": "2A9A5CD0C8BBE65B4DA2AC93A3646ADB", + "section_mic_hmac_key": "409C1FA5A935DF46FD0B0BA1F4B6676DC8E53F92992C41B1E167DCAAF92C6B75", + "section_salt": "42441ECF37BAF5319477A42541165CE4" + }, + { + "adv_header_byte": "30", + "adv_salt": "402E548FE3E9094AE8327C5D67323EF3", + "aes_key": "74A450709337C059E4B06AA7339A847A", + "data_elements": [ + { + "contents": "DDEE0C575B876057217E9EBD9A54DC6DDEC5E09A7C8B5AF9B2699B2F4D", + "de_type": 370 + }, + { + "contents": "CD8ECC401DC9D100AB80772990FD586CD51C0F63BCC51C1BC1", + "de_type": 762 + }, + { + "contents": "D4219120DC8A3A5A31C38174E515", + "de_type": 447 + }, + { + "contents": "A7B56D78AA8970937A2B0E39A94148EFE9BE381F0B", + "de_type": 890 + }, + { + "contents": "4C4E4BB8BC53C76E9BDEDAAF9D853E00A0556A6A", + "de_type": 561 + } + ], + "encoded_section": "B39013556E8D35D3BFBCC66BA7FE806642527C9110005AFB2CBC5F6FF709C77C5E5B44FEC2639001302F90C4EE1CC3A669EBC8C94F549755BCBC764D07AC7B44259C7E72BAD6B0603D2618A56A1D5D9D0F8F3361A4F4BA89B14F98D3E27F95F1CA5DB58B7C9710E5785C12C126D0199B28A6955E728FE9E0D56AEA4522B7289D149FFA9AC110B751ACC06CD17F40F3E0EE67191DAF9E12EF7897E526F0037E46E22CD772FFB6A8FA8A6075E7BD51BE635A620EE8", + "identity_type": "private", + "iv": "91B130A57119A917BE672E882CD24F0A", + "key_seed": "349BAC58EA19F4DFC1E615A8F712C39D4A8F9D9371C92914FF7FEB3273EAFA96", + "metadata_key": "ECB79F56C63D39774DA1093D67A2E2BE", + "section_mic_hmac_key": "EC055CD96AA83E58972330916292606A56E320F4078D3E37125FD521366D2C13", + "section_salt": "5AFB2CBC5F6FF709C77C5E5B44FEC263" + }, + { + "adv_header_byte": "30", + "adv_salt": "5FC40591E60B01771FD86CA3E3EFBAA9", + "aes_key": "527134D81C8BB7C6BECF31F34C4FB7EF", + "data_elements": [ + { + "contents": "342CFE0C131BCA582A2B7F241FDDC5ECF120E98493391304BAFA", + "de_type": 217 + } + ], + "encoded_section": "5490131A3E437EC13FDD67C82E5A3E273E9CD391100014444BDF8E6863B041C4F0C1CDEC855D900484ADD7102010AF6513B7367DD4D398FC2D1670B31EB05EB75F6451ABC3AF64D23D067AD0B26AEDEC08DD6BF5F5", + "identity_type": "provisioned", + "iv": "B58720B7A9092A88B216BDC537A2C0C6", + "key_seed": "7795E9287DF02DB694AA5A17909EF3ABAF2B3A67D317F0BA403077B148680D3A", + "metadata_key": "719D474AF4AC20EA51773F7D689FCBC8", + "section_mic_hmac_key": "CA2941EF019C602CD34C2D7A728687EBB9D640E5DFA764616AB435EF32B4955E", + "section_salt": "14444BDF8E6863B041C4F0C1CDEC855D" + }, + { + "adv_header_byte": "30", + "adv_salt": "64E4BB1721EA0A79B18FA4CF2DFCF10C", + "aes_key": "4FC66B746D81042C4012C9CA05EB0F52", + "data_elements": [ + { + "contents": "F3F4EFB14E81119C7C2E98F2", + "de_type": 608 + }, + { + "contents": "C41DD9601061BB775DBC3608789A30523E95B3B05B", + "de_type": 966 + }, + { + "contents": "B33460D6D8E3DF0ADF19BDD666E4", + "de_type": 973 + }, + { + "contents": "CDE289B7ECC9B6CDE5EA6BB595AC3019FE7F", + "de_type": 480 + } + ], + "encoded_section": "849013AACDF54AA823590AF5804916E75A4517911000EF56099BC3FE4347649E0E59527C7A6190015C377B56675F536A451BF7CCFB4F79940DFE2ACB47AFB42B017C572E08DF98CFA55C5EC810CBEC57BC340A59E1F3414E7FCA6E17CD675EC950EFCCA7F589D4187557EA6AEA5F0E752B32C9540691FA07A9904598AE2FF4703638729108", + "identity_type": "private", + "iv": "9862F303568F4CEEEE16790805706ADC", + "key_seed": "790EEE3F64023DF0E967BECC5F9C1881A0E23AABE20BF85D35F0CA9E212D4C9B", + "metadata_key": "5C624608CAB1BE8DE5DF6A058AC025AE", + "section_mic_hmac_key": "F6216E6FCE355E0BD447D8B39A621A566767EEC8EE2F3AF3E86777DCC894B63B", + "section_salt": "EF56099BC3FE4347649E0E59527C7A61" + } +] +
diff --git a/nearby/presence/np_adv/tests/examples_v0.rs b/nearby/presence/np_adv/tests/examples_v0.rs new file mode 100644 index 0000000..e30e12f --- /dev/null +++ b/nearby/presence/np_adv/tests/examples_v0.rs
@@ -0,0 +1,101 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +use crypto_provider_default::CryptoProviderImpl; +use ldt_np_adv::*; +use np_adv::legacy::data_elements::TxPowerDataElement; +use np_adv::{ + credential::{ + simple::SimpleV0Credential, source::SliceCredentialSource, + v0::MinimumFootprintV0CryptoMaterial, + }, + de_type::*, + deserialize_v0_advertisement, + legacy::deserialize::*, + shared_data::*, + *, +}; + +#[test] +fn v0_deser_plaintext() { + let creds = + SliceCredentialSource::<SimpleV0Credential<MinimumFootprintV0CryptoMaterial, ()>>::new(&[]); + let adv = deserialize_v0_advertisement::<_, _, CryptoProviderImpl>( + &[ + 0x00, // adv header + 0x03, // public identity + 0x15, 0x03, // Length 1 Tx Power DE with value 3 + ], + &creds, + ) + .unwrap(); + + match adv { + V0AdvContents::Plaintext(p) => { + assert_eq!(PlaintextIdentityMode::Public, p.identity()); + assert_eq!( + vec![&PlainDataElement::TxPower(TxPowerDataElement::from( + TxPower::try_from(3).unwrap() + )),], + p.data_elements().collect::<Vec<_>>() + ); + } + _ => panic!("this example is plaintext"), + } +} + +#[test] +fn v0_deser_ciphertext() { + let key_seed = [0x11_u8; 32]; + let metadata_key: [u8; NP_LEGACY_METADATA_KEY_LEN] = [0x33; NP_LEGACY_METADATA_KEY_LEN]; + + let hkdf = np_hkdf::NpKeySeedHkdf::<CryptoProviderImpl>::new(&key_seed); + let metadata_key_hmac: [u8; 32] = + hkdf.legacy_metadata_key_hmac_key().calculate_hmac(&metadata_key); + + // output of building a packet using AdvBuilder + let adv = &[ + 0x00, // adv header + 0x21, // private DE w/ a 2 byte payload + 0x22, 0x22, // salt + // ciphertext for metadata key & txpower DE + 0x85, 0xBF, 0xA8, 0x83, 0x58, 0x7C, 0x50, 0xCF, 0x98, 0x38, 0xA7, 0x8A, 0xC0, 0x1C, 0x96, + 0xF9, + ]; + + let credentials: [SimpleV0Credential<_, [u8; 32]>; 1] = [SimpleV0Credential::new( + MinimumFootprintV0CryptoMaterial::new(key_seed, metadata_key_hmac), + key_seed, + )]; + let cred_source = SliceCredentialSource::new(credentials.as_slice()); + + let matched = match deserialize_v0_advertisement::<_, _, CryptoProviderImpl>(adv, &cred_source) + .unwrap() + { + V0AdvContents::Decrypted(c) => c, + _ => panic!("this examples is ciphertext"), + }; + + assert_eq!(&key_seed, matched.matched_credential().matched_data()); + let decrypted = matched.contents(); + + assert_eq!(EncryptedIdentityDataElementType::Private, decrypted.identity_type()); + + assert_eq!(&metadata_key, decrypted.metadata_key()); + + assert_eq!( + vec![&PlainDataElement::TxPower(TxPowerDataElement::from(TxPower::try_from(3).unwrap())),], + decrypted.data_elements().collect::<Vec<_>>() + ); +}
diff --git a/nearby/presence/np_adv/tests/examples_v1.rs b/nearby/presence/np_adv/tests/examples_v1.rs new file mode 100644 index 0000000..fbda763 --- /dev/null +++ b/nearby/presence/np_adv/tests/examples_v1.rs
@@ -0,0 +1,181 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +use crypto_provider::{CryptoProvider, CryptoRng}; +use crypto_provider_default::CryptoProviderImpl; +use np_adv::extended::data_elements::TxPowerDataElement; +use np_adv::extended::serialize::SingleTypeDataElement; +use np_adv::shared_data::TxPower; +use np_adv::{ + credential::{ + simple::SimpleV1Credential, source::SliceCredentialSource, + v1::MinimumFootprintV1CryptoMaterial, + }, + de_type::*, + deserialize_v1_advertisement, + extended::{ + deserialize::{Section, VerificationMode}, + serialize::{AdvBuilder, SignedEncrypted}, + NP_V1_ADV_MAX_SECTION_COUNT, + }, + PlaintextIdentityMode, *, +}; +use np_hkdf::v1_salt; + +#[test] +fn v1_deser_plaintext() { + let mut adv_builder = AdvBuilder::new(); + let mut section_builder = adv_builder.section_builder(PublicIdentity::default()).unwrap(); + section_builder + .add_de(|_salt| TxPowerDataElement::from(TxPower::try_from(6).unwrap())) + .unwrap(); + section_builder.add_to_advertisement(); + let adv = adv_builder.into_advertisement(); + + let creds = + SliceCredentialSource::<SimpleV1Credential<MinimumFootprintV1CryptoMaterial, ()>>::new(&[]); + let contents = + deserialize_v1_advertisement::<_, _, CryptoProviderImpl>(adv.as_slice(), &creds).unwrap(); + + assert_eq!(0, contents.invalid_sections_count()); + + let sections = contents.sections().collect::<Vec<_>>(); + + assert_eq!(1, sections.len()); + + let section = match §ions[0] { + V1DeserializedSection::Plaintext(s) => s, + _ => panic!("this is a plaintext adv"), + }; + assert_eq!(PlaintextIdentityMode::Public, section.identity()); + let data_elements = section.data_elements().collect::<Vec<_>>(); + assert_eq!(1, data_elements.len()); + + let de = &data_elements[0]; + assert_eq!(v1_salt::DataElementOffset::from(1), de.offset()); + assert_eq!(TxPowerDataElement::DE_TYPE, de.de_type()); + assert_eq!(&[6], de.contents()); +} + +#[test] +fn v1_deser_ciphertext() { + // identity material + let mut rng = <CryptoProviderImpl as CryptoProvider>::CryptoRng::new(); + let metadata_key: [u8; 16] = rng.gen(); + let key_pair = np_ed25519::KeyPair::<CryptoProviderImpl>::generate(); + let key_seed = rng.gen(); + let hkdf = np_hkdf::NpKeySeedHkdf::<CryptoProviderImpl>::new(&key_seed); + + // prepare advertisement + let mut adv_builder = AdvBuilder::new(); + let mut section_builder = adv_builder + .section_builder(SignedEncrypted::new_random_salt( + &mut rng, + EncryptedIdentityDataElementType::Private, + &metadata_key, + &key_pair, + &hkdf, + )) + .unwrap(); + section_builder + .add_de(|_salt| TxPowerDataElement::from(TxPower::try_from(7).unwrap())) + .unwrap(); + section_builder.add_to_advertisement(); + let adv = adv_builder.into_advertisement(); + + let cred_array: [SimpleV1Credential<_, [u8; 32]>; 1] = [SimpleV1Credential::new( + MinimumFootprintV1CryptoMaterial::new( + key_seed, + [0; 32], // Zeroing out MIC HMAC, since it's unused in examples here. + hkdf.extended_signed_metadata_key_hmac_key().calculate_hmac(&metadata_key), + key_pair.public(), + ), + key_seed, + )]; + let creds = SliceCredentialSource::new(&cred_array); + let contents = + deserialize_v1_advertisement::<_, _, CryptoProviderImpl>(adv.as_slice(), &creds).unwrap(); + + assert_eq!(0, contents.invalid_sections_count()); + + let sections = contents.sections().collect::<Vec<_>>(); + assert_eq!(1, sections.len()); + + let matched_credential = match §ions[0] { + V1DeserializedSection::Decrypted(d) => d, + _ => panic!("this is a ciphertext adv"), + }; + + assert_eq!(&key_seed, matched_credential.matched_credential().matched_data()); + let section = matched_credential.contents(); + + assert_eq!(EncryptedIdentityDataElementType::Private, section.identity_type()); + assert_eq!(VerificationMode::Signature, section.verification_mode()); + assert_eq!(&metadata_key, section.metadata_key()); + + let data_elements = section.data_elements().collect::<Vec<_>>(); + assert_eq!(1, data_elements.len()); + + let de = &data_elements[0]; + assert_eq!(v1_salt::DataElementOffset::from(2), de.offset()); + assert_eq!(TxPowerDataElement::DE_TYPE, de.de_type()); + assert_eq!(&[7], de.contents()); +} + +#[test] +fn v1_deser_no_section() { + let adv_builder = AdvBuilder::new(); + let adv = adv_builder.into_advertisement(); + let creds = + SliceCredentialSource::<SimpleV1Credential<MinimumFootprintV1CryptoMaterial, ()>>::new(&[]); + let v1_deserialize_error = + deserialize_v1_advertisement::<_, _, CryptoProviderImpl>(adv.as_slice(), &creds) + .expect_err(" Expected an error"); + assert_eq!( + v1_deserialize_error, + AdvDeserializationError::ParseError { + details_hazmat: AdvDeserializationErrorDetailsHazmat::AdvertisementDeserializeError + } + ); +} + +#[test] +fn v1_deser_plaintext_over_max_sections() { + let mut adv_builder = AdvBuilder::new(); + for _ in 0..NP_V1_ADV_MAX_SECTION_COUNT { + let mut section_builder = adv_builder.section_builder(PublicIdentity::default()).unwrap(); + section_builder + .add_de(|_salt| TxPowerDataElement::from(TxPower::try_from(7).unwrap())) + .unwrap(); + section_builder.add_to_advertisement(); + } + let mut adv = adv_builder.into_advertisement().as_slice().to_vec(); + // Push an extra section + adv.extend_from_slice( + [ + 0x01, // Section header + 0x03, // Public identity + ] + .as_slice(), + ); + let creds = + SliceCredentialSource::<SimpleV1Credential<MinimumFootprintV1CryptoMaterial, ()>>::new(&[]); + assert_eq!( + deserialize_v1_advertisement::<_, _, CryptoProviderImpl>(adv.as_slice(), &creds) + .unwrap_err(), + AdvDeserializationError::ParseError { + details_hazmat: AdvDeserializationErrorDetailsHazmat::AdvertisementDeserializeError + } + ); +}
diff --git a/nearby/presence/np_c_ffi/Cargo.lock b/nearby/presence/np_c_ffi/Cargo.lock new file mode 100644 index 0000000..ca23800 --- /dev/null +++ b/nearby/presence/np_c_ffi/Cargo.lock
@@ -0,0 +1,1207 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "aead" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d122413f284cf2d62fb1b7db97e02edb8cda96d769b16e443a4f6195e35662b0" +dependencies = [ + "bytes", + "crypto-common", + "generic-array", +] + +[[package]] +name = "aes" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac1f845298e95f983ff1944b728ae08b8cebab80d684f0a832ed0fc74dfa27e2" +dependencies = [ + "cfg-if", + "cipher", + "cpufeatures", +] + +[[package]] +name = "aes-gcm-siv" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae0784134ba9375416d469ec31e7c5f9fa94405049cf08c5ce5b4698be673e0d" +dependencies = [ + "aead", + "aes", + "cipher", + "ctr", + "polyval", + "subtle", + "zeroize", +] + +[[package]] +name = "ahash" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c99f64d1e06488f620f932677e24bc6e2897582980441ae90a671415bd7ec2f" +dependencies = [ + "cfg-if", + "once_cell", + "version_check", +] + +[[package]] +name = "allocator-api2" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0942ffc6dcaadf03badf6e6a2d0228460359d5e34b57ccdc720b7382dfbd5ec5" + +[[package]] +name = "array_ref" +version = "0.1.0" + +[[package]] +name = "array_view" +version = "0.1.0" + +[[package]] +name = "atty" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" +dependencies = [ + "hermit-abi 0.1.19", + "libc", + "winapi", +] + +[[package]] +name = "autocfg" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" + +[[package]] +name = "base16ct" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "block-padding" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8894febbff9f758034a5b8e12d87918f56dfc64a8e1fe757d65e29041538d93" +dependencies = [ + "generic-array", +] + +[[package]] +name = "bytes" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89b2fd2a0dcf38d7971e2194b6b6eebab45ae01067456a7fd93d5547a61b70be" + +[[package]] +name = "cbc" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26b52a9543ae338f279b96b0b9fed9c8093744685043739079ce85cd58f289a6" +dependencies = [ + "cipher", +] + +[[package]] +name = "cbindgen" +version = "0.24.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b922faaf31122819ec80c4047cc684c6979a087366c069611e33649bf98e18d" +dependencies = [ + "clap", + "heck", + "indexmap", + "log", + "proc-macro2", + "quote", + "serde", + "serde_json", + "syn 1.0.109", + "tempfile", + "toml", +] + +[[package]] +name = "cc" +version = "1.0.79" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50d30906286121d95be3d479533b458f87493b30a4b5f79a607db8f5d11aa91f" + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "cipher" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" +dependencies = [ + "crypto-common", + "inout", +] + +[[package]] +name = "clap" +version = "3.2.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ea181bf566f71cb9a5d17a59e1871af638180a18fb0035c92ae62b705207123" +dependencies = [ + "atty", + "bitflags", + "clap_lex", + "indexmap", + "strsim", + "termcolor", + "textwrap", +] + +[[package]] +name = "clap_lex" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2850f2f5a82cbf437dd5af4d49848fbdfc27c157c3d010345776f952765261c5" +dependencies = [ + "os_str_bytes", +] + +[[package]] +name = "const-oid" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6340df57935414636969091153f35f68d9f00bbc8fb4a9c6054706c213e6c6bc" + +[[package]] +name = "cpufeatures" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a17b76ff3a4162b0b27f354a0c87015ddad39d35f9c0c36607a3bdd175dde1f1" +dependencies = [ + "libc", +] + +[[package]] +name = "crypto-bigint" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf4c2f4e1afd912bc40bfd6fed5d9dc1f288e0ba01bfcc835cc5bc3eb13efe15" +dependencies = [ + "generic-array", + "rand_core", + "subtle", + "zeroize", +] + +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "rand_core", + "typenum", +] + +[[package]] +name = "crypto_provider" +version = "0.1.0" + +[[package]] +name = "crypto_provider_default" +version = "0.1.0" +dependencies = [ + "cfg-if", + "crypto_provider", + "crypto_provider_rustcrypto", +] + +[[package]] +name = "crypto_provider_rustcrypto" +version = "0.1.0" +dependencies = [ + "aead", + "aes", + "aes-gcm-siv", + "cbc", + "cfg-if", + "crypto_provider", + "ctr", + "ed25519-dalek", + "hkdf", + "hmac", + "p256", + "rand", + "rand_chacha", + "rand_core", + "sec1", + "sha2", + "subtle", + "x25519-dalek", +] + +[[package]] +name = "ctr" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0369ee1ad671834580515889b80f2ea915f23b8be8d0daa4bbaf2ac5c7590835" +dependencies = [ + "cipher", +] + +[[package]] +name = "curve25519-dalek" +version = "4.0.0-rc.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "436ace70fc06e06f7f689d2624dc4e2f0ea666efb5aa704215f7249ae6e047a7" +dependencies = [ + "cfg-if", + "cpufeatures", + "curve25519-dalek-derive", + "digest", + "fiat-crypto", + "platforms", + "rustc_version", + "subtle", +] + +[[package]] +name = "curve25519-dalek-derive" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83fdaf97f4804dcebfa5862639bc9ce4121e82140bec2a987ac5140294865b5b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.23", +] + +[[package]] +name = "der" +version = "0.7.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c7ed52955ce76b1554f509074bb357d3fb8ac9b51288a65a3fd480d1dfba946" +dependencies = [ + "const-oid", + "zeroize", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "crypto-common", + "subtle", +] + +[[package]] +name = "ed25519" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5fb04eee5d9d907f29e80ee6b0e78f7e2c82342c63e3580d8c4f69d9d5aad963" +dependencies = [ + "signature", +] + +[[package]] +name = "ed25519-dalek" +version = "2.0.0-rc.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "faa8e9049d5d72bfc12acbc05914731b5322f79b5e2f195e9f2d705fca22ab4c" +dependencies = [ + "curve25519-dalek", + "ed25519", + "rand_core", + "sha2", +] + +[[package]] +name = "elliptic-curve" +version = "0.13.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "968405c8fdc9b3bf4df0a6638858cc0b52462836ab6b1c87377785dd09cf1c0b" +dependencies = [ + "base16ct", + "crypto-bigint", + "digest", + "ff", + "generic-array", + "group", + "hkdf", + "rand_core", + "sec1", + "subtle", + "zeroize", +] + +[[package]] +name = "errno" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4bcfec3a70f97c962c307b2d2c56e358cf1d00b558d74262b5f929ee8cc7e73a" +dependencies = [ + "errno-dragonfly", + "libc", + "windows-sys", +] + +[[package]] +name = "errno-dragonfly" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf" +dependencies = [ + "cc", + "libc", +] + +[[package]] +name = "fastrand" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be" +dependencies = [ + "instant", +] + +[[package]] +name = "ff" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449" +dependencies = [ + "rand_core", + "subtle", +] + +[[package]] +name = "fiat-crypto" +version = "0.1.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e825f6987101665dea6ec934c09ec6d721de7bc1bf92248e1d5810c8cd636b77" + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", + "zeroize", +] + +[[package]] +name = "getrandom" +version = "0.2.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be4136b2a15dd319360be1c07d9933517ccf0be8f16bf62a3bee4f0d618df427" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + +[[package]] +name = "group" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" +dependencies = [ + "ff", + "rand_core", + "subtle", +] + +[[package]] +name = "handle_map" +version = "0.1.0" +dependencies = [ + "crypto_provider", + "hashbrown 0.14.0", + "lock_api", + "portable-atomic", + "spin 0.9.8", +] + +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" + +[[package]] +name = "hashbrown" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c6201b9ff9fd90a5a3bac2e56a830d0caa509576f0e503818ee82c181b3437a" +dependencies = [ + "ahash", + "allocator-api2", +] + +[[package]] +name = "heck" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" + +[[package]] +name = "hermit-abi" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" +dependencies = [ + "libc", +] + +[[package]] +name = "hermit-abi" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "443144c8cdadd93ebf52ddb4056d257f5b52c04d3c804e657d19eb73fc33668b" + +[[package]] +name = "hkdf" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "791a029f6b9fc27657f6f188ec6e5e43f6911f6f878e0dc5501396e09809d437" +dependencies = [ + "hmac", +] + +[[package]] +name = "hmac" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +dependencies = [ + "digest", +] + +[[package]] +name = "indexmap" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +dependencies = [ + "autocfg", + "hashbrown 0.12.3", +] + +[[package]] +name = "inout" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0c10553d664a4d0bcff9f4215d0aac67a639cc68ef660840afe309b807bc9f5" +dependencies = [ + "block-padding", + "generic-array", +] + +[[package]] +name = "instant" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "io-lifetimes" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2" +dependencies = [ + "hermit-abi 0.3.2", + "libc", + "windows-sys", +] + +[[package]] +name = "itoa" +version = "1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62b02a5381cc465bd3041d84623d0fa3b66738b52b8e2fc3bab8ad63ab032f4a" + +[[package]] +name = "lazy_static" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" +dependencies = [ + "spin 0.5.2", +] + +[[package]] +name = "ldt" +version = "0.1.0" +dependencies = [ + "crypto_provider", + "ldt_tbc", +] + +[[package]] +name = "ldt_np_adv" +version = "0.1.0" +dependencies = [ + "array_view", + "crypto_provider", + "ldt", + "ldt_tbc", + "np_hkdf", + "xts_aes", +] + +[[package]] +name = "ldt_tbc" +version = "0.1.0" +dependencies = [ + "crypto_provider", +] + +[[package]] +name = "libc" +version = "0.2.147" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3" + +[[package]] +name = "linux-raw-sys" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef53942eb7bf7ff43a617b3e2c1c4a5ecf5944a7c1bc12d7ee39bbb15e5c1519" + +[[package]] +name = "lock_api" +version = "0.4.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1cc9717a20b1bb222f333e6a92fd32f7d8a18ddc5a3191a11af45dcbf4dcd16" +dependencies = [ + "autocfg", + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b06a4cde4c0f271a446782e3eff8de789548ce57dbc8eca9292c27f4a42004b4" + +[[package]] +name = "memchr" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" + +[[package]] +name = "minimal-lexical" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" + +[[package]] +name = "nom" +version = "7.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" +dependencies = [ + "memchr", + "minimal-lexical", +] + +[[package]] +name = "np_adv" +version = "0.1.0" +dependencies = [ + "array_view", + "crypto_provider", + "lazy_static", + "ldt", + "ldt_np_adv", + "nom", + "np_ed25519", + "np_hkdf", + "rand", + "sink", + "strum", + "strum_macros", + "tinyvec", + "xts_aes", +] + +[[package]] +name = "np_c_ffi" +version = "0.1.0" +dependencies = [ + "cbindgen", + "crypto_provider_default", + "np_ffi_core", + "spin 0.9.8", +] + +[[package]] +name = "np_ed25519" +version = "0.1.0" +dependencies = [ + "array_view", + "crypto_provider", + "sink", + "tinyvec", +] + +[[package]] +name = "np_ffi_core" +version = "0.1.0" +dependencies = [ + "array_view", + "crypto_provider", + "crypto_provider_default", + "handle_map", + "np_adv", + "spin 0.9.8", +] + +[[package]] +name = "np_hkdf" +version = "0.1.0" +dependencies = [ + "crypto_provider", + "ldt", + "xts_aes", +] + +[[package]] +name = "once_cell" +version = "1.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" + +[[package]] +name = "opaque-debug" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" + +[[package]] +name = "os_str_bytes" +version = "6.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d5d9eb14b174ee9aa2ef96dc2b94637a2d4b6e7cb873c7e171f0c20c6cf3eac" + +[[package]] +name = "p256" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9863ad85fa8f4460f9c48cb909d38a0d689dba1f6f6988a5e3e0d31071bcd4b" +dependencies = [ + "elliptic-curve", + "primeorder", +] + +[[package]] +name = "platforms" +version = "3.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3d7ddaed09e0eb771a79ab0fd64609ba0afb0a8366421957936ad14cbd13630" + +[[package]] +name = "polyval" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d52cff9d1d4dee5fe6d03729099f4a310a41179e0a10dbf542039873f2e826fb" +dependencies = [ + "cfg-if", + "cpufeatures", + "opaque-debug", + "universal-hash", +] + +[[package]] +name = "portable-atomic" +version = "1.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "767eb9f07d4a5ebcb39bbf2d452058a93c011373abf6832e24194a1c3f004794" + +[[package]] +name = "ppv-lite86" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" + +[[package]] +name = "primeorder" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c2fcef82c0ec6eefcc179b978446c399b3cdf73c392c35604e399eee6df1ee3" +dependencies = [ + "elliptic-curve", +] + +[[package]] +name = "proc-macro2" +version = "1.0.63" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b368fba921b0dce7e60f5e04ec15e565b3303972b42bcfde1d0713b881959eb" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "573015e8ab27661678357f27dc26460738fd2b6c86e46f386fde94cb5d913105" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "rand_core", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom", +] + +[[package]] +name = "redox_syscall" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" +dependencies = [ + "bitflags", +] + +[[package]] +name = "rustc_version" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" +dependencies = [ + "semver", +] + +[[package]] +name = "rustix" +version = "0.37.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d69718bf81c6127a49dc64e44a742e8bb9213c0ff8869a22c308f84c1d4ab06" +dependencies = [ + "bitflags", + "errno", + "io-lifetimes", + "libc", + "linux-raw-sys", + "windows-sys", +] + +[[package]] +name = "rustversion" +version = "1.0.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc31bd9b61a32c31f9650d18add92aa83a49ba979c143eefd27fe7177b05bd5f" + +[[package]] +name = "ryu" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe232bdf6be8c8de797b22184ee71118d63780ea42ac85b61d1baa6d3b782ae9" + +[[package]] +name = "scopeguard" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" + +[[package]] +name = "sec1" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0aec48e813d6b90b15f0b8948af3c63483992dee44c03e9930b3eebdabe046e" +dependencies = [ + "base16ct", + "der", + "generic-array", + "subtle", + "zeroize", +] + +[[package]] +name = "semver" +version = "1.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bebd363326d05ec3e2f532ab7660680f3b02130d780c299bca73469d521bc0ed" + +[[package]] +name = "serde" +version = "1.0.166" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d01b7404f9d441d3ad40e6a636a7782c377d2abdbe4fa2440e2edcc2f4f10db8" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.166" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5dd83d6dde2b6b2d466e14d9d1acce8816dedee94f735eac6395808b3483c6d6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.23", +] + +[[package]] +name = "serde_json" +version = "1.0.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f1e14e89be7aa4c4b78bdbdc9eb5bf8517829a600ae8eaa39a6e1d960b5185c" +dependencies = [ + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "sha2" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "479fb9d862239e610720565ca91403019f2f00410f1864c5aa7479b950a76ed8" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "signature" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e1788eed21689f9cf370582dfc467ef36ed9c707f073528ddafa8d83e3b8500" + +[[package]] +name = "sink" +version = "0.1.0" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "spin" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" + +[[package]] +name = "spin" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" +dependencies = [ + "lock_api", +] + +[[package]] +name = "strsim" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" + +[[package]] +name = "strum" +version = "0.24.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "063e6045c0e62079840579a7e47a355ae92f60eb74daaf156fb1e84ba164e63f" + +[[package]] +name = "strum_macros" +version = "0.24.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e385be0d24f186b4ce2f9982191e7101bb737312ad61c1f2f984f34bcf85d59" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "rustversion", + "syn 1.0.109", +] + +[[package]] +name = "subtle" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59fb7d6d8281a51045d62b8eb3a7d1ce347b76f312af50cd3dc0af39c87c1737" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "tempfile" +version = "3.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31c0432476357e58790aaa47a8efb0c5138f137343f3b5f23bd36a27e3b0a6d6" +dependencies = [ + "autocfg", + "cfg-if", + "fastrand", + "redox_syscall", + "rustix", + "windows-sys", +] + +[[package]] +name = "termcolor" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be55cf8942feac5c765c2c993422806843c9a9a45d4d5c407ad6dd2ea95eb9b6" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "textwrap" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "222a222a5bfe1bba4a77b45ec488a741b3cb8872e5e499451fd7d0129c9c7c3d" + +[[package]] +name = "tinyvec" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" + +[[package]] +name = "toml" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234" +dependencies = [ + "serde", +] + +[[package]] +name = "typenum" +version = "1.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba" + +[[package]] +name = "unicode-ident" +version = "1.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22049a19f4a68748a168c0fc439f9516686aa045927ff767eca0a85101fb6e73" + +[[package]] +name = "universal-hash" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc1de2c688dc15305988b563c3854064043356019f97a4b46276fe734c4f07ea" +dependencies = [ + "crypto-common", + "subtle", +] + +[[package]] +name = "version_check" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-util" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" +dependencies = [ + "winapi", +] + +[[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-sys" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-targets" +version = "0.48.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05d4b17490f70499f20b9e791dcf6a299785ce8af4d709018206dc5b4953e95f" +dependencies = [ + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3" + +[[package]] +name = "windows_i686_gnu" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241" + +[[package]] +name = "windows_i686_msvc" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" + +[[package]] +name = "x25519-dalek" +version = "2.0.0-rc.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec7fae07da688e17059d5886712c933bb0520f15eff2e09cfa18e30968f4e63a" +dependencies = [ + "curve25519-dalek", + "rand_core", +] + +[[package]] +name = "xts_aes" +version = "0.1.0" +dependencies = [ + "array_ref", + "crypto_provider", + "ldt_tbc", +] + +[[package]] +name = "zeroize" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a0956f1ba7c7909bfb66c2e9e4124ab6f6482560f6628b5aaeba39207c9aad9"
diff --git a/nearby/presence/np_c_ffi/Cargo.toml b/nearby/presence/np_c_ffi/Cargo.toml new file mode 100644 index 0000000..1dd9f32 --- /dev/null +++ b/nearby/presence/np_c_ffi/Cargo.toml
@@ -0,0 +1,18 @@ +[package] +name = "np_c_ffi" +version = "0.1.0" +edition = "2021" +publish = false + +[dependencies] +# TODO: We need to make this configurable for this crate and for np_ffi below it. +crypto_provider_default = {path = "../../crypto/crypto_provider_default", features = ["rustcrypto"]} +np_ffi_core = {path = "../np_ffi_core"} +spin = "0.9.8" + +[build-dependencies] +cbindgen = "0.24.5" + +[lib] +# boringssl and bssl-sys are built as a static lib, so we need to as well +crate-type = ["staticlib"] \ No newline at end of file
diff --git a/nearby/presence/np_c_ffi/build.rs b/nearby/presence/np_c_ffi/build.rs new file mode 100644 index 0000000..b282709 --- /dev/null +++ b/nearby/presence/np_c_ffi/build.rs
@@ -0,0 +1,63 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +use cbindgen::ItemType::*; +use std::vec; + +const C_CONFIG: &str = "cbindgen_configs/c_config.toml"; +const C_OUTPUT_HEADER_FILE: &str = "include/c/np_c_ffi.h"; + +const CPP_CONFIG: &str = "cbindgen_configs/cpp_config.toml"; +const CPP_INCLUDE_DIR_BASE: &str = "include/cpp/"; +const CPP_PUBLIC_HEADER_FILE: &str = "np_cpp_ffi_types.h"; +const CPP_INTERNAL_HEADER_FILE: &str = "np_cpp_ffi_functions.h"; + +fn main() { + let crate_dir = std::env::var("CARGO_MANIFEST_DIR").unwrap(); + + let config_file = format!("{crate_dir}/{C_CONFIG}"); + let config = cbindgen::Config::from_file(config_file).expect("Config file should exist"); + generate_c_header(&crate_dir, config); + + let config_file = format!("{crate_dir}/{CPP_CONFIG}"); + let config = cbindgen::Config::from_file(config_file).expect("Config file should exist"); + generate_private_cpp_header(&crate_dir, config.clone()); + generate_public_cpp_header(&crate_dir, config); +} + +fn generate_c_header(crate_dir: &String, config: cbindgen::Config) { + let output_header_file = format!("{crate_dir}/{C_OUTPUT_HEADER_FILE}"); + generate_header(&output_header_file, crate_dir, config); +} + +fn generate_private_cpp_header(crate_dir: &String, mut config: cbindgen::Config) { + config.export.item_types.append(&mut vec![Functions]); + config.includes.push(CPP_PUBLIC_HEADER_FILE.to_string()); + let output_header_file = + format!("{crate_dir}/{CPP_INCLUDE_DIR_BASE}/{CPP_INTERNAL_HEADER_FILE}"); + generate_header(&output_header_file, crate_dir, config); +} + +fn generate_public_cpp_header(crate_dir: &String, mut config: cbindgen::Config) { + config.export.item_types.append(&mut vec![Enums, Structs]); + let output_header_file = format!("{crate_dir}/{CPP_INCLUDE_DIR_BASE}/{CPP_PUBLIC_HEADER_FILE}"); + generate_header(&output_header_file, crate_dir, config); +} + +fn generate_header(output_file: &String, crate_dir: &String, config: cbindgen::Config) { + let _ = cbindgen::generate_with_config(crate_dir, config) + .map_err(|e| println!("cargo:warning=ERROR: {e}")) + .expect("c header file generation failed") + .write_to_file(output_file); +}
diff --git a/nearby/presence/np_c_ffi/cbindgen_configs/c_config.toml b/nearby/presence/np_c_ffi/cbindgen_configs/c_config.toml new file mode 100644 index 0000000..88483b0 --- /dev/null +++ b/nearby/presence/np_c_ffi/cbindgen_configs/c_config.toml
@@ -0,0 +1,50 @@ +language = "C" + +# Instead go through CPP generated header +cpp_compat = false + +style = "type" +header = """ +/* + Copyright 2023 Google LLC + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ +""" +pragma_once = true +autogen_warning = """ +/* + WARNING: this file is autogenerated by cbindgen. Don't modify this manually. + Additionally, you should _not_ rely upon the layouts of the generated + structs and unions if you want your code to be forward-compatible, + unless a given type explicitly states in its documentation that it has + a guaranteed forward-compatible layout. + Instead, you should use _only_ the provided exported function symbols. +*/""" +include_version = true + +sort_by = "None" # Use order specified in Rust + +[export] +# Prefix to add before the name of every item +prefix = "np_ffi_" + +[enum] +rename_variants = "QualifiedScreamingSnakeCase" + +[parse] +parse_deps = true +include = ["np_c_ffi", "np_ffi_core"] + +[parse.expand] +crates = ["np_ffi_core"] +default_features = true
diff --git a/nearby/presence/np_c_ffi/cbindgen_configs/cpp_config.toml b/nearby/presence/np_c_ffi/cbindgen_configs/cpp_config.toml new file mode 100644 index 0000000..5a2ba2a --- /dev/null +++ b/nearby/presence/np_c_ffi/cbindgen_configs/cpp_config.toml
@@ -0,0 +1,44 @@ +language = "C++" + +style = "type" +header = """ +/* + Copyright 2023 Google LLC + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ +""" +pragma_once = true +autogen_warning = """ +/* + WARNING: this file is autogenerated by cbindgen. Don't modify this manually. + Additionally, you should _not_ rely upon the layouts of the generated + structs and unions if you want your code to be forward-compatible, + unless a given type explicitly states in its documentation that it has + a guaranteed forward-compatible layout. + Instead, you should use _only_ the provided exported function symbols. +*/""" +include_version = true +namespaces = ["np_ffi", "internal"] + +sort_by = "None" # Use order specified in Rust + +[enum] +rename_variants = "None" + +[parse] +parse_deps = true +include = ["np_c_ffi", "np_ffi_core"] + +[parse.expand] +crates = ["np_ffi_core"] +default_features = true
diff --git a/nearby/presence/np_c_ffi/include/c/np_c_ffi.h b/nearby/presence/np_c_ffi/include/c/np_c_ffi.h new file mode 100644 index 0000000..03e5821 --- /dev/null +++ b/nearby/presence/np_c_ffi/include/c/np_c_ffi.h
@@ -0,0 +1,890 @@ +/* + Copyright 2023 Google LLC + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + + +#pragma once + +/* Generated with cbindgen:0.24.5 */ + +/* + WARNING: this file is autogenerated by cbindgen. Don't modify this manually. + Additionally, you should _not_ rely upon the layouts of the generated + structs and unions if you want your code to be forward-compatible, + unless a given type explicitly states in its documentation that it has + a guaranteed forward-compatible layout. + Instead, you should use _only_ the provided exported function symbols. +*/ + +#include <stdarg.h> +#include <stdbool.h> +#include <stdint.h> +#include <stdlib.h> + +/** + * The possible boolean action types which can be present in an Actions data element + */ +enum np_ffi_BooleanActionType { + NP_FFI_BOOLEAN_ACTION_TYPE_ACTIVE_UNLOCK = 8, + NP_FFI_BOOLEAN_ACTION_TYPE_NEARBY_SHARE = 9, + NP_FFI_BOOLEAN_ACTION_TYPE_INSTANT_TETHERING = 10, + NP_FFI_BOOLEAN_ACTION_TYPE_PHONE_HUB = 11, + NP_FFI_BOOLEAN_ACTION_TYPE_PRESENCE_MANAGER = 12, + NP_FFI_BOOLEAN_ACTION_TYPE_FINDER = 13, + NP_FFI_BOOLEAN_ACTION_TYPE_FAST_PAIR_SASS = 14, +}; +typedef uint8_t np_ffi_BooleanActionType; + +/** + * Discriminant for `CreateCredentialBookResult` + */ +enum np_ffi_CreateCredentialBookResultKind { + /** + * There was no space left to create a new credential book + */ + NP_FFI_CREATE_CREDENTIAL_BOOK_RESULT_KIND_NO_SPACE_LEFT = 0, + /** + * We created a new credential book behind the given handle. + * The associated payload may be obtained via + * `CreateCredentialBookResult#into_success()`. + */ + NP_FFI_CREATE_CREDENTIAL_BOOK_RESULT_KIND_SUCCESS = 1, +}; +typedef uint8_t np_ffi_CreateCredentialBookResultKind; + +/** + * A result-type enum which tells the caller whether/not a deallocation + * succeeded or failed due to the requested handle not being present. + */ +typedef enum { + /** + * The requested handle to deallocate was not present in the map + */ + NP_FFI_DEALLOCATE_RESULT_NOT_PRESENT = 0, + /** + * The object behind the handle was successfully deallocated + */ + NP_FFI_DEALLOCATE_RESULT_SUCCESS = 1, +} np_ffi_DeallocateResult; + +/** + * Discriminant for `DeserializeAdvertisementResult`. + */ +enum np_ffi_DeserializeAdvertisementResultKind { + /** + * Deserializing the advertisement failed, for some reason or another. + */ + NP_FFI_DESERIALIZE_ADVERTISEMENT_RESULT_KIND_ERROR = 0, + /** + * The advertisement was correctly deserialized, and it's a V0 advertisement. + * `DeserializeAdvertisementResult#into_v0()` is the corresponding cast + * to the associated enum variant. + */ + NP_FFI_DESERIALIZE_ADVERTISEMENT_RESULT_KIND_V0 = 1, + /** + * The advertisement was correctly deserialized, and it's a V1 advertisement. + * `DeserializeAdvertisementResult#into_v1()` is the corresponding cast + * to the associated enum variant. + */ + NP_FFI_DESERIALIZE_ADVERTISEMENT_RESULT_KIND_V1 = 2, +}; +typedef uint8_t np_ffi_DeserializeAdvertisementResultKind; + +/** + * Discriminant for possible results of V0 advertisement deserialization + */ +enum np_ffi_DeserializedV0AdvertisementKind { + /** + * The deserialized V0 advertisement was legible. + * The associated payload may be obtained via + * `DeserializedV0Advertisement#into_legible`. + */ + NP_FFI_DESERIALIZED_V0_ADVERTISEMENT_KIND_LEGIBLE = 0, + /** + * The deserialized V0 advertisement is illegible, + * likely meaning that the receiver does not hold + * the proper credentials to be able to read + * the received advertisement. + */ + NP_FFI_DESERIALIZED_V0_ADVERTISEMENT_KIND_NO_MATCHING_CREDENTIALS = 1, +}; +typedef uint8_t np_ffi_DeserializedV0AdvertisementKind; + +/** + * Represents deserialized information about the V0 identity utilized + * by a deserialized V0 advertisement + */ +typedef enum { + NP_FFI_DESERIALIZED_V0_IDENTITY_PLAINTEXT, + NP_FFI_DESERIALIZED_V0_IDENTITY_DECRYPTED, +} np_ffi_DeserializedV0Identity; + +/** + * Discriminant for `DeserializedV0Identity`. + */ +enum np_ffi_DeserializedV0IdentityKind { + /** + * The deserialized identity was a plaintext identity. + */ + NP_FFI_DESERIALIZED_V0_IDENTITY_KIND_PLAINTEXT = 0, + /** + * The deserialized identity was some decrypted identity. + */ + NP_FFI_DESERIALIZED_V0_IDENTITY_KIND_DECRYPTED = 1, +}; +typedef uint8_t np_ffi_DeserializedV0IdentityKind; + +/** + * Discriminant for `DeserializedV1Identity`. + */ +enum np_ffi_DeserializedV1IdentityKind { + /** + * The deserialized v1 identity was plaintext + */ + NP_FFI_DESERIALIZED_V1_IDENTITY_KIND_PLAINTEXT = 0, + /** + * The deserialized v1 identity corresponded + * to some kind of decrypted identity. + */ + NP_FFI_DESERIALIZED_V1_IDENTITY_KIND_DECRYPTED = 1, +}; +typedef uint8_t np_ffi_DeserializedV1IdentityKind; + +/** + * Discriminant of `GetV0DEResult`. + */ +enum np_ffi_GetV0DEResultKind { + /** + * The attempt to get the DE succeeded. + * The associated payload may be obtained via + * `GetV0DEResult#into_success`. + */ + NP_FFI_GET_V0DE_RESULT_KIND_SUCCESS = 0, + /** + * The attempt to get the DE failed, + * possibly due to the requested index being + * out-of-bounds or due to the advertisement + * having been previously deallocated. + */ + NP_FFI_GET_V0DE_RESULT_KIND_ERROR = 1, +}; +typedef uint8_t np_ffi_GetV0DEResultKind; + +/** + * Discriminant for the `GetV1DEResult` enum. + */ +enum np_ffi_GetV1DEResultKind { + /** + * Attempting to get the DE at the given position failed, + * possibly due to the index being out-of-bounds or due + * to the whole advertisement having been previously deallocated. + */ + NP_FFI_GET_V1DE_RESULT_KIND_ERROR = 0, + /** + * Attempting to get the DE at the given position succeeded. + * The underlying DE may be extracted with `GetV1DEResult#into_success`. + */ + NP_FFI_GET_V1DE_RESULT_KIND_SUCCESS = 1, +}; +typedef uint8_t np_ffi_GetV1DEResultKind; + +/** + * Discriminant for `GetV1SectionResult` + */ +enum np_ffi_GetV1SectionResultKind { + /** + * The attempt to get the section failed, + * possibly due to the section index being + * out-of-bounds or due to the underlying + * advertisement having already been deallocated. + */ + NP_FFI_GET_V1_SECTION_RESULT_KIND_ERROR = 0, + /** + * The attempt to get the section succeeded. + * The wrapped section may be obtained via + * `GetV1SectionResult#into_success`. + */ + NP_FFI_GET_V1_SECTION_RESULT_KIND_SUCCESS = 1, +}; +typedef uint8_t np_ffi_GetV1SectionResultKind; + +/** + * Structure for categorized reasons for why a NP C FFI call may + * be panicking. + */ +enum np_ffi_PanicReason { + /** + * Some enum cast to a variant failed. Utilized + * for failed enum casts of all enums. + * + * (That is, this is the catch-all panic reason for enum + * casts where there is not a more specific reason + * in some other variant of this enum.) + */ + NP_FFI_PANIC_REASON_ENUM_CAST_FAILED = 0, + /** + * The panic handler is used to assert conditions are true to avoid programmer errors. + * If a failed assert condition is hit, this panic handler is invoked with this reason. + */ + NP_FFI_PANIC_REASON_ASSERT_FAILED = 1, + /** + * Error returned if action bits inside of a V0Actions struct are invalid. If the struct was + * created by this deserializer, the bits will always be valid, they are only invalid if + * a user reaches in and changes them to something invalid. + */ + NP_FFI_PANIC_REASON_INVALID_ACTION_BITS = 2, +}; +typedef uint8_t np_ffi_PanicReason; + +/** + * Discriminant for `V0DataElement`. + */ +enum np_ffi_V0DataElementKind { + /** + * A transmission Power (Tx Power) data-element. + * The associated payload may be obtained via + * `V0DataElement#into_tx_power`. + */ + NP_FFI_V0_DATA_ELEMENT_KIND_TX_POWER = 0, + /** + * The Actions data-element. + * The associated payload may be obtained via + * `V0DataElement#into_actions`. + */ + NP_FFI_V0_DATA_ELEMENT_KIND_ACTIONS = 1, +}; +typedef uint8_t np_ffi_V0DataElementKind; + +/** + *A `#[repr(C)]` handle to a value of type `super::CredentialBookInternals`. + */ +typedef struct { + uint64_t handle_id; +} np_ffi_CredentialBook; + +/** + * Result type for `create_credential_book` + */ +enum np_ffi_CreateCredentialBookResult_Tag { + NP_FFI_CREATE_CREDENTIAL_BOOK_RESULT_NO_SPACE_LEFT = 0, + NP_FFI_CREATE_CREDENTIAL_BOOK_RESULT_SUCCESS = 1, +}; +typedef uint8_t np_ffi_CreateCredentialBookResult_Tag; + +typedef union { + np_ffi_CreateCredentialBookResult_Tag tag; + struct { + np_ffi_CreateCredentialBookResult_Tag success_tag; + np_ffi_CredentialBook success; + }; +} np_ffi_CreateCredentialBookResult; + +/** + *A `#[repr(C)]` handle to a value of type `super::V0PayloadInternals`. + */ +typedef struct { + uint64_t handle_id; +} np_ffi_V0Payload; + +/** + * Represents a deserialized V0 advertisement whose DE contents may be read + */ +typedef struct { + uint8_t num_des; + np_ffi_V0Payload payload; + np_ffi_DeserializedV0Identity identity; +} np_ffi_LegibleDeserializedV0Advertisement; + +/** + * Represents a deserialized V0 advertisement + */ +typedef enum { + NP_FFI_DESERIALIZED_V0_ADVERTISEMENT_LEGIBLE, + NP_FFI_DESERIALIZED_V0_ADVERTISEMENT_NO_MATCHING_CREDENTIALS, +} np_ffi_DeserializedV0Advertisement_Tag; + +typedef struct { + np_ffi_DeserializedV0Advertisement_Tag tag; + union { + struct { + np_ffi_LegibleDeserializedV0Advertisement legible; + }; + }; +} np_ffi_DeserializedV0Advertisement; + +/** + *A `#[repr(C)]` handle to a value of type `super::LegibleV1SectionsInternals`. + */ +typedef struct { + uint64_t handle_id; +} np_ffi_LegibleV1Sections; + +/** + * Representation of a deserialized V1 advertisement + */ +typedef struct { + uint8_t num_legible_sections; + uint8_t num_undecryptable_sections; + np_ffi_LegibleV1Sections legible_sections; +} np_ffi_DeserializedV1Advertisement; + +/** + * The result of calling `np_ffi_deserialize_advertisement`. + * Must be explicitly deallocated after use with + * a corresponding `np_ffi_deallocate_deserialize_advertisement_result` + */ +enum np_ffi_DeserializeAdvertisementResult_Tag { + /** + * Deserializing the advertisement failed, for some reason or another. + * `DeserializeAdvertisementResultKind::Error` is the associated enum tag. + */ + NP_FFI_DESERIALIZE_ADVERTISEMENT_RESULT_ERROR, + /** + * The advertisement was correctly deserialized, and it's a V0 advertisement. + * `DeserializeAdvertisementResultKind::V0` is the associated enum tag. + */ + NP_FFI_DESERIALIZE_ADVERTISEMENT_RESULT_V0, + /** + * The advertisement was correctly deserialized, and it's a V1 advertisement. + * `DeserializeAdvertisementResultKind::V1` is the associated enum tag. + */ + NP_FFI_DESERIALIZE_ADVERTISEMENT_RESULT_V1, +}; +typedef uint8_t np_ffi_DeserializeAdvertisementResult_Tag; + +typedef union { + np_ffi_DeserializeAdvertisementResult_Tag tag; + struct { + np_ffi_DeserializeAdvertisementResult_Tag v0_tag; + np_ffi_DeserializedV0Advertisement v0; + }; + struct { + np_ffi_DeserializeAdvertisementResult_Tag v1_tag; + np_ffi_DeserializedV1Advertisement v1; + }; +} np_ffi_DeserializeAdvertisementResult; + +/** + * A byte-string with a maximum size of N, + * where only the first `len` bytes are considered + * to contain the actual payload. N is only + * permitted to be between 0 and 255. + */ +typedef struct { + uint8_t len; + uint8_t bytes[255]; +} np_ffi_ByteBuffer_255; + +/** + * Represents the raw contents of the service payload data + * under the Nearby Presence service UUID + */ +typedef struct { + np_ffi_ByteBuffer_255 bytes; +} np_ffi_RawAdvertisementPayload; + +/** + * Representation of a transmission power, + * as used for the Tx Power DE in V0 and V1. + */ +typedef struct { + int8_t tx_power; +} np_ffi_TxPower; + +/** + * The bitfield data of a VOActions data element + */ +typedef struct { + uint32_t bitfield; +} np_ffi_V0ActionBits; + +/** + * Representation of the Actions DE in V0. + */ +typedef enum { + /** + * A set of action bits which were present in a plaintext identity advertisement + */ + NP_FFI_V0_ACTIONS_PLAINTEXT, + /** + * A set of action bits which were present in a encrypted identity advertisement + */ + NP_FFI_V0_ACTIONS_ENCRYPTED, +} np_ffi_V0Actions_Tag; + +typedef struct { + np_ffi_V0Actions_Tag tag; + union { + struct { + np_ffi_V0ActionBits plaintext; + }; + struct { + np_ffi_V0ActionBits encrypted; + }; + }; +} np_ffi_V0Actions; + +/** + * Representation of a V0 data element. + */ +typedef enum { + NP_FFI_V0_DATA_ELEMENT_TX_POWER, + NP_FFI_V0_DATA_ELEMENT_ACTIONS, +} np_ffi_V0DataElement_Tag; + +typedef struct { + np_ffi_V0DataElement_Tag tag; + union { + struct { + np_ffi_TxPower tx_power; + }; + struct { + np_ffi_V0Actions actions; + }; + }; +} np_ffi_V0DataElement; + +/** + * The result of `V0Payload#get_de`. + */ +typedef enum { + NP_FFI_GET_V0DE_RESULT_SUCCESS, + NP_FFI_GET_V0DE_RESULT_ERROR, +} np_ffi_GetV0DEResult_Tag; + +typedef struct { + np_ffi_GetV0DEResult_Tag tag; + union { + struct { + np_ffi_V0DataElement success; + }; + }; +} np_ffi_GetV0DEResult; + +/** + * Handle to a deserialized V1 section + */ +typedef struct { + np_ffi_LegibleV1Sections legible_sections_handle; + uint8_t legible_section_index; + uint8_t num_des; + np_ffi_DeserializedV1IdentityKind identity_tag; +} np_ffi_DeserializedV1Section; + +/** + * The result of attempting to get a particular V1 section + * from its' index within the list of legible sections + * via `DeserializedV1Advertisement::get_section`. + */ +typedef enum { + NP_FFI_GET_V1_SECTION_RESULT_ERROR, + NP_FFI_GET_V1_SECTION_RESULT_SUCCESS, +} np_ffi_GetV1SectionResult_Tag; + +typedef struct { + np_ffi_GetV1SectionResult_Tag tag; + union { + struct { + np_ffi_DeserializedV1Section success; + }; + }; +} np_ffi_GetV1SectionResult; + +/** + * Representation of the data-element type tag + * of a V1 data element. + */ +typedef struct { + uint32_t code; +} np_ffi_V1DEType; + +/** + * A byte-string with a maximum size of N, + * where only the first `len` bytes are considered + * to contain the actual payload. N is only + * permitted to be between 0 and 255. + */ +typedef struct { + uint8_t len; + uint8_t bytes[127]; +} np_ffi_ByteBuffer_127; + +/** + * FFI-transmissible representation of a generic V1 data-element. + * This representation is stable, and so you may directly + * reference this struct's fields if you wish. + */ +typedef struct { + /** + * The DE type code of this generic data-element. + */ + np_ffi_V1DEType de_type; + /** + * The raw data-element byte payload, up to + * 127 bytes in length. + */ + np_ffi_ByteBuffer_127 payload; +} np_ffi_GenericV1DataElement; + +/** + * FFI-transmissible representation of a V1 data-element + */ +typedef enum { + /** + * A "generic" V1 data-element, for which we have no + * particular information about its schema (just + * a DE type code and a byte payload.) + */ + NP_FFI_V1_DATA_ELEMENT_GENERIC, +} np_ffi_V1DataElement_Tag; + +typedef struct { + np_ffi_V1DataElement_Tag tag; + union { + struct { + np_ffi_GenericV1DataElement generic; + }; + }; +} np_ffi_V1DataElement; + +/** + * Represents the result of the `DeserializedV1Section#get_de` operation. + */ +typedef enum { + NP_FFI_GET_V1DE_RESULT_ERROR, + NP_FFI_GET_V1DE_RESULT_SUCCESS, +} np_ffi_GetV1DEResult_Tag; + +typedef struct { + np_ffi_GetV1DEResult_Tag tag; + union { + struct { + np_ffi_V1DataElement success; + }; + }; +} np_ffi_GetV1DEResult; + +/** + * Overrides the global panic handler to be used when NP C FFI calls panic. + * This method will only have an effect on the global panic-handler + * the first time it's called, and this method will return `true` + * to indicate that the panic handler was successfully set. + * All subsequent calls to this method + * will simply ignore the argument and return `false`. + * + * If the passed function pointer is non-null, + * then we will call it upon every panic, + * followed by the default panicking behavior for + * the platform (in the case where the user-specified + * function does not terminate or hang the running process.) + * + * Otherwise, we will resort to the + * default panicking behavior for the system, which + * is a printed stack trace followed by an abort + * when this crate is compiled with `std`, + * but a bare `loop { }` when this crate is compiled without. + */ +bool np_ffi_global_config_panic_handler(void (*handler)(np_ffi_PanicReason)); + +/** + * Sets an override to the number of shards to employ in the NP FFI's + * internal handle-maps, which places an upper bound on the number + * of writing threads which may make progress at any one time + * when concurrently accessing handles of the same type. + * + * By default, this value will be set to 16, or in `std` environments, + * the minimum of 16 and the number of available hardware threads. + * A shard value override of zero will be interpreted the same + * as this default. + * + * Setting this value will have no effect if the handle-maps for the + * API have already begun being used by the client code, and any + * values set will take effect upon the first usage of _any_ non-`np_ffi_global_config_set` + * API call. + */ +void np_ffi_global_config_set_num_shards(uint8_t num_shards); + +/** + * Sets the maximum number of active handles to credential books + * which may be active at any one time. + * Default value: Max value. + * Max value: `u32::MAX - 1`. + * + * Useful for bounding the maximum memory used by the client application + * on credential books in constrained-memory environments. + * + * Setting this value will have no effect if the handle-maps for the + * API have already begun being used by the client code, and any + * values set will take effect upon the first usage of any API + * call utilizing credential books. + */ +void np_ffi_global_config_set_max_num_credential_books(uint32_t max_num_credential_books); + +/** + * Sets the maximum number of active handles to deserialized v0 + * advertisements which may be active at any one time. + * + * Useful for bounding the maximum memory used by the client application + * on v0 advertisements in constrained-memory environments. + * + * Default value: Max value. + * Max value: `u32::MAX - 1`. + * + * Setting this value will have no effect if the handle-maps for the + * API have already begun being used by the client code, and any + * values set will take effect upon the first usage of any API + * call which references or returns a deserialized V0 advertisement. + */ +void np_ffi_global_config_set_max_num_deserialized_v0_advertisements(uint32_t max_num_deserialized_v0_advertisements); + +/** + * Sets the maximum number of active handles to deserialized v1 + * advertisements which may be active at any one time. + * + * Useful for bounding the maximum memory used by the client application + * on v1 advertisements in constrained-memory environments. + * + * Default value: Max value. + * Max value: `u32::MAX - 1`. + * + * Setting this value will have no effect if the handle-maps for the + * API have already begun being used by the client code, and any + * values set will take effect upon the first usage of any API + * call which references or returns a deserialized V1 advertisement. + */ +void np_ffi_global_config_set_max_num_deserialized_v1_advertisements(uint32_t max_num_deserialized_v1_advertisements); + +/** + * Allocates a new credential-book, returning a handle to the created object + */ +np_ffi_CreateCredentialBookResult np_ffi_create_credential_book(void); + +/** + * Gets the tag of a `CreateCredentialBookResult` tagged enum. + */ +np_ffi_CreateCredentialBookResultKind np_ffi_CreateCredentialBookResult_kind(np_ffi_CreateCredentialBookResult result); + +/** + * Casts a `CreateCredentialBookResult` to the `SUCCESS` variant, panicking in the + * case where the passed value is of a different enum variant. + */ +np_ffi_CredentialBook np_ffi_CreateCredentialBookResult_into_SUCCESS(np_ffi_CreateCredentialBookResult result); + +/** + * Deallocates a credential-book by its handle + */ +np_ffi_DeallocateResult np_ffi_deallocate_credential_book(np_ffi_CredentialBook credential_book); + +/** + * Attempts to deserialize an advertisement with the given service-data + * payload (presumed to be under the NP service UUID) using credentials + * pulled from the given credential-book. + */ +np_ffi_DeserializeAdvertisementResult np_ffi_deserialize_advertisement(np_ffi_RawAdvertisementPayload adv_payload, + np_ffi_CredentialBook credential_book); + +/** + * Gets the tag of a `DeserializeAdvertisementResult` tagged-union. + */ +np_ffi_DeserializeAdvertisementResultKind np_ffi_DeserializeAdvertisementResult_kind(np_ffi_DeserializeAdvertisementResult result); + +/** + * Casts a `DeserializeAdvertisementResult` to the `V0` variant, panicking in the + * case where the passed value is of a different enum variant. + */ +np_ffi_DeserializedV0Advertisement np_ffi_DeserializeAdvertisementResult_into_V0(np_ffi_DeserializeAdvertisementResult result); + +/** + * Casts a `DeserializeAdvertisementResult` to the `V1` variant, panicking in the + * case where the passed value is of a different enum variant. + */ +np_ffi_DeserializedV1Advertisement np_ffi_DeserializeAdvertisementResult_into_V1(np_ffi_DeserializeAdvertisementResult result); + +/** + * Deallocates any internal data referenced by a `DeserializeAdvertisementResult`. This should only + * be used if into_V0 or into_V1, have not been called yet as it shares the same underlying + * resource. + */ +np_ffi_DeallocateResult np_ffi_deallocate_deserialize_advertisement_result(np_ffi_DeserializeAdvertisementResult result); + +/** + * Deallocates any internal data referenced by a `DeserializedV0Advertisement` + */ +np_ffi_DeallocateResult np_ffi_deallocate_deserialized_V0_advertisement(np_ffi_DeserializedV0Advertisement adv); + +/** + * Deallocates any internal data referenced by a `DeserializedV1Advertisement` + */ +np_ffi_DeallocateResult np_ffi_deallocate_deserialized_V1_advertisement(np_ffi_DeserializedV1Advertisement adv); + +/** + * Gets the tag of a `DeserializedV0Advertisement` tagged-union. + */ +np_ffi_DeserializedV0AdvertisementKind np_ffi_DeserializedV0Advertisement_kind(np_ffi_DeserializedV0Advertisement result); + +/** + * Casts a `DeserializedV0Advertisement` to the `Legible` variant, panicking in the + * case where the passed value is of a different enum variant. + */ +np_ffi_LegibleDeserializedV0Advertisement np_ffi_DeserializedV0Advertisement_into_LEGIBLE(np_ffi_DeserializedV0Advertisement adv); + +/** + * Gets the number of DEs in a legible deserialized advertisement. + * Suitable as an iteration bound for `V0Payload#get_de`. + */ +uint8_t np_ffi_LegibleDeserializedV0Advertisement_get_num_des(np_ffi_LegibleDeserializedV0Advertisement adv); + +/** + * Gets just the data-element payload of a `LegibleDeserializedV0Advertisement`. + */ +np_ffi_V0Payload np_ffi_LegibleDeserializedV0Advertisement_into_payload(np_ffi_LegibleDeserializedV0Advertisement adv); + +/** + * Gets just the identity information associated with a `LegibleDeserializedV0Advertisement`. + */ +np_ffi_DeserializedV0Identity np_ffi_LegibleDeserializedV0Advertisement_into_identity(np_ffi_LegibleDeserializedV0Advertisement adv); + +/** + * Deallocates any internal data of a `LegibleDeserializedV0Advertisement` + */ +np_ffi_DeallocateResult np_ffi_deallocate_legible_v0_advertisement(np_ffi_LegibleDeserializedV0Advertisement adv); + +/** + * Gets the tag of the `DeserializedV0Identity` tagged-union. + */ +np_ffi_DeserializedV0IdentityKind np_ffi_DeserializedV0Identity_kind(np_ffi_DeserializedV0Identity identity); + +/** + * Attempts to get the data-element with the given index in the passed v0 adv payload + */ +np_ffi_GetV0DEResult np_ffi_V0Payload_get_de(np_ffi_V0Payload payload, uint8_t index); + +/** + * Deallocates any internal data of a `V0Payload` + */ +np_ffi_DeallocateResult np_ffi_deallocate_v0_payload(np_ffi_V0Payload payload); + +/** + * Gets the tag of a `GetV0DEResult` tagged-union. + */ +np_ffi_GetV0DEResultKind np_ffi_GetV0DEResult_kind(np_ffi_GetV0DEResult result); + +/** + * Casts a `GetV0DEResult` to the `Success` variant, panicking in the + * case where the passed value is of a different enum variant. + */ +np_ffi_V0DataElement np_ffi_GetV0DEResult_into_SUCCESS(np_ffi_GetV0DEResult result); + +/** + * Gets the tag of a `V0DataElement` tagged-union. + */ +np_ffi_V0DataElementKind np_ffi_V0DataElement_kind(np_ffi_V0DataElement de); + +/** + * Casts a `V0DataElement` to the `TxPower` variant, panicking in the + * case where the passed value is of a different enum variant. + */ +np_ffi_TxPower np_ffi_V0DataElement_into_TX_POWER(np_ffi_V0DataElement de); + +/** + * Casts a `V0DataElement` to the `Actions` variant, panicking in the + * case where the passed value is of a different enum variant. + */ +np_ffi_V0Actions np_ffi_V0DataElement_into_ACTIONS(np_ffi_V0DataElement de); + +/** + * Return whether a boolean action type is set in this data element + */ +bool np_ffi_V0Actions_has_action(np_ffi_V0Actions actions, np_ffi_BooleanActionType action_type); + +/** + * Gets the 4 bit context sync sequence number as a u8 from this data element + */ +uint8_t np_ffi_V0Actions_get_context_sync_sequence_number(np_ffi_V0Actions actions); + +/** + * Return whether a boolean action type is set in this data element + */ +uint32_t np_ffi_V0Actions_as_u32(np_ffi_V0Actions actions); + +/** + * Gets the number of legible sections on a deserialized V1 advertisement. + * Suitable as an index bound for the second argument of + * `np_ffi_DeserializedV1Advertisement#get_section`. + */ +uint8_t np_ffi_DeserializedV1Advertisement_get_num_legible_sections(np_ffi_DeserializedV1Advertisement adv); + +/** + * Gets the number of sections on a deserialized V1 advertisement which + * were unable to be decrypted with the credentials that the receiver possesses. + */ +uint8_t np_ffi_DeserializedV1Advertisement_get_num_undecryptable_sections(np_ffi_DeserializedV1Advertisement adv); + +/** + * Gets the legible section with the given index in a deserialized V1 advertisement. + */ +np_ffi_GetV1SectionResult np_ffi_DeserializedV1Advertisement_get_section(np_ffi_DeserializedV1Advertisement adv, + uint8_t legible_section_index); + +/** + * Gets the tag of the `GetV1SectionResult` tagged-union. + */ +np_ffi_GetV1SectionResultKind np_ffi_GetV1SectionResult_kind(np_ffi_GetV1SectionResult result); + +/** + * Casts a `GetV1SectionResult` to the `Success` variant, panicking in the + * case where the passed value is of a different enum variant. + */ +np_ffi_DeserializedV1Section np_ffi_GetV1SectionResult_into_SUCCESS(np_ffi_GetV1SectionResult result); + +/** + * Gets the number of data elements in a deserialized v1 section. + * Suitable as an iteration bound for the second argument of + * `np_ffi_DeserializedV1Section_get_de`. + */ +uint8_t np_ffi_DeserializedV1Section_get_num_des(np_ffi_DeserializedV1Section section); + +/** + * Gets the tag of the identity tagged-union used for the passed section. + */ +np_ffi_DeserializedV1IdentityKind np_ffi_DeserializedV1Section_get_identity_kind(np_ffi_DeserializedV1Section section); + +/** + * Gets the data-element with the given index in the passed section. + */ +np_ffi_GetV1DEResult np_ffi_DeserializedV1Section_get_de(np_ffi_DeserializedV1Section section, + uint8_t de_index); + +/** + * Gets the tag of the `GetV1DEResult` tagged-union. + */ +np_ffi_GetV1DEResultKind np_ffi_GetV1DEResult_kind(np_ffi_GetV1DEResult result); + +/** + * Casts a `GetV1DEResult` to the `Success` vartiant, panicking in the + * case where the passed value is of a different enum variant. + */ +np_ffi_V1DataElement np_ffi_GetV1DEResult_into_SUCCESS(np_ffi_GetV1DEResult result); + +/** + * Converts a `V1DataElement` to a `GenericV1DataElement` which + * only maintains information about the DE's type-code and payload. + */ +np_ffi_GenericV1DataElement np_ffi_V1DataElement_to_generic(np_ffi_V1DataElement de); + +/** + * Extracts the numerical value of the given V1 DE type code as + * an unsigned 32-bit integer. + */ +uint32_t np_ffi_V1DEType_to_uint32_t(np_ffi_V1DEType de_type);
diff --git a/nearby/presence/np_c_ffi/include/cpp/np_cpp_ffi_functions.h b/nearby/presence/np_c_ffi/include/cpp/np_cpp_ffi_functions.h new file mode 100644 index 0000000..3361c5d --- /dev/null +++ b/nearby/presence/np_c_ffi/include/cpp/np_cpp_ffi_functions.h
@@ -0,0 +1,268 @@ +/* + Copyright 2023 Google LLC + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + + +#pragma once + +/* Generated with cbindgen:0.24.5 */ + +/* + WARNING: this file is autogenerated by cbindgen. Don't modify this manually. + Additionally, you should _not_ rely upon the layouts of the generated + structs and unions if you want your code to be forward-compatible, + unless a given type explicitly states in its documentation that it has + a guaranteed forward-compatible layout. + Instead, you should use _only_ the provided exported function symbols. +*/ + +#include <cstdarg> +#include <cstdint> +#include <cstdlib> +#include <ostream> +#include <new> +#include "np_cpp_ffi_types.h" + +namespace np_ffi { +namespace internal { + +extern "C" { + +/// Overrides the global panic handler to be used when NP C FFI calls panic. +/// This method will only have an effect on the global panic-handler +/// the first time it's called, and this method will return `true` +/// to indicate that the panic handler was successfully set. +/// All subsequent calls to this method +/// will simply ignore the argument and return `false`. +/// +/// If the passed function pointer is non-null, +/// then we will call it upon every panic, +/// followed by the default panicking behavior for +/// the platform (in the case where the user-specified +/// function does not terminate or hang the running process.) +/// +/// Otherwise, we will resort to the +/// default panicking behavior for the system, which +/// is a printed stack trace followed by an abort +/// when this crate is compiled with `std`, +/// but a bare `loop { }` when this crate is compiled without. +bool np_ffi_global_config_panic_handler(void (*handler)(PanicReason)); + +/// Sets an override to the number of shards to employ in the NP FFI's +/// internal handle-maps, which places an upper bound on the number +/// of writing threads which may make progress at any one time +/// when concurrently accessing handles of the same type. +/// +/// By default, this value will be set to 16, or in `std` environments, +/// the minimum of 16 and the number of available hardware threads. +/// A shard value override of zero will be interpreted the same +/// as this default. +/// +/// Setting this value will have no effect if the handle-maps for the +/// API have already begun being used by the client code, and any +/// values set will take effect upon the first usage of _any_ non-`np_ffi_global_config_set` +/// API call. +void np_ffi_global_config_set_num_shards(uint8_t num_shards); + +/// Sets the maximum number of active handles to credential books +/// which may be active at any one time. +/// Default value: Max value. +/// Max value: `u32::MAX - 1`. +/// +/// Useful for bounding the maximum memory used by the client application +/// on credential books in constrained-memory environments. +/// +/// Setting this value will have no effect if the handle-maps for the +/// API have already begun being used by the client code, and any +/// values set will take effect upon the first usage of any API +/// call utilizing credential books. +void np_ffi_global_config_set_max_num_credential_books(uint32_t max_num_credential_books); + +/// Sets the maximum number of active handles to deserialized v0 +/// advertisements which may be active at any one time. +/// +/// Useful for bounding the maximum memory used by the client application +/// on v0 advertisements in constrained-memory environments. +/// +/// Default value: Max value. +/// Max value: `u32::MAX - 1`. +/// +/// Setting this value will have no effect if the handle-maps for the +/// API have already begun being used by the client code, and any +/// values set will take effect upon the first usage of any API +/// call which references or returns a deserialized V0 advertisement. +void np_ffi_global_config_set_max_num_deserialized_v0_advertisements(uint32_t max_num_deserialized_v0_advertisements); + +/// Sets the maximum number of active handles to deserialized v1 +/// advertisements which may be active at any one time. +/// +/// Useful for bounding the maximum memory used by the client application +/// on v1 advertisements in constrained-memory environments. +/// +/// Default value: Max value. +/// Max value: `u32::MAX - 1`. +/// +/// Setting this value will have no effect if the handle-maps for the +/// API have already begun being used by the client code, and any +/// values set will take effect upon the first usage of any API +/// call which references or returns a deserialized V1 advertisement. +void np_ffi_global_config_set_max_num_deserialized_v1_advertisements(uint32_t max_num_deserialized_v1_advertisements); + +/// Allocates a new credential-book, returning a handle to the created object +CreateCredentialBookResult np_ffi_create_credential_book(); + +/// Gets the tag of a `CreateCredentialBookResult` tagged enum. +CreateCredentialBookResultKind np_ffi_CreateCredentialBookResult_kind(CreateCredentialBookResult result); + +/// Casts a `CreateCredentialBookResult` to the `SUCCESS` variant, panicking in the +/// case where the passed value is of a different enum variant. +CredentialBook np_ffi_CreateCredentialBookResult_into_SUCCESS(CreateCredentialBookResult result); + +/// Deallocates a credential-book by its handle +DeallocateResult np_ffi_deallocate_credential_book(CredentialBook credential_book); + +/// Attempts to deserialize an advertisement with the given service-data +/// payload (presumed to be under the NP service UUID) using credentials +/// pulled from the given credential-book. +DeserializeAdvertisementResult np_ffi_deserialize_advertisement(RawAdvertisementPayload adv_payload, + CredentialBook credential_book); + +/// Gets the tag of a `DeserializeAdvertisementResult` tagged-union. +DeserializeAdvertisementResultKind np_ffi_DeserializeAdvertisementResult_kind(DeserializeAdvertisementResult result); + +/// Casts a `DeserializeAdvertisementResult` to the `V0` variant, panicking in the +/// case where the passed value is of a different enum variant. +DeserializedV0Advertisement np_ffi_DeserializeAdvertisementResult_into_V0(DeserializeAdvertisementResult result); + +/// Casts a `DeserializeAdvertisementResult` to the `V1` variant, panicking in the +/// case where the passed value is of a different enum variant. +DeserializedV1Advertisement np_ffi_DeserializeAdvertisementResult_into_V1(DeserializeAdvertisementResult result); + +/// Deallocates any internal data referenced by a `DeserializeAdvertisementResult`. This should only +/// be used if into_V0 or into_V1, have not been called yet as it shares the same underlying +/// resource. +DeallocateResult np_ffi_deallocate_deserialize_advertisement_result(DeserializeAdvertisementResult result); + +/// Deallocates any internal data referenced by a `DeserializedV0Advertisement` +DeallocateResult np_ffi_deallocate_deserialized_V0_advertisement(DeserializedV0Advertisement adv); + +/// Deallocates any internal data referenced by a `DeserializedV1Advertisement` +DeallocateResult np_ffi_deallocate_deserialized_V1_advertisement(DeserializedV1Advertisement adv); + +/// Gets the tag of a `DeserializedV0Advertisement` tagged-union. +DeserializedV0AdvertisementKind np_ffi_DeserializedV0Advertisement_kind(DeserializedV0Advertisement result); + +/// Casts a `DeserializedV0Advertisement` to the `Legible` variant, panicking in the +/// case where the passed value is of a different enum variant. +LegibleDeserializedV0Advertisement np_ffi_DeserializedV0Advertisement_into_LEGIBLE(DeserializedV0Advertisement adv); + +/// Gets the number of DEs in a legible deserialized advertisement. +/// Suitable as an iteration bound for `V0Payload#get_de`. +uint8_t np_ffi_LegibleDeserializedV0Advertisement_get_num_des(LegibleDeserializedV0Advertisement adv); + +/// Gets just the data-element payload of a `LegibleDeserializedV0Advertisement`. +V0Payload np_ffi_LegibleDeserializedV0Advertisement_into_payload(LegibleDeserializedV0Advertisement adv); + +/// Gets just the identity information associated with a `LegibleDeserializedV0Advertisement`. +DeserializedV0Identity np_ffi_LegibleDeserializedV0Advertisement_into_identity(LegibleDeserializedV0Advertisement adv); + +/// Deallocates any internal data of a `LegibleDeserializedV0Advertisement` +DeallocateResult np_ffi_deallocate_legible_v0_advertisement(LegibleDeserializedV0Advertisement adv); + +/// Gets the tag of the `DeserializedV0Identity` tagged-union. +DeserializedV0IdentityKind np_ffi_DeserializedV0Identity_kind(DeserializedV0Identity identity); + +/// Attempts to get the data-element with the given index in the passed v0 adv payload +GetV0DEResult np_ffi_V0Payload_get_de(V0Payload payload, uint8_t index); + +/// Deallocates any internal data of a `V0Payload` +DeallocateResult np_ffi_deallocate_v0_payload(V0Payload payload); + +/// Gets the tag of a `GetV0DEResult` tagged-union. +GetV0DEResultKind np_ffi_GetV0DEResult_kind(GetV0DEResult result); + +/// Casts a `GetV0DEResult` to the `Success` variant, panicking in the +/// case where the passed value is of a different enum variant. +V0DataElement np_ffi_GetV0DEResult_into_SUCCESS(GetV0DEResult result); + +/// Gets the tag of a `V0DataElement` tagged-union. +V0DataElementKind np_ffi_V0DataElement_kind(V0DataElement de); + +/// Casts a `V0DataElement` to the `TxPower` variant, panicking in the +/// case where the passed value is of a different enum variant. +TxPower np_ffi_V0DataElement_into_TX_POWER(V0DataElement de); + +/// Casts a `V0DataElement` to the `Actions` variant, panicking in the +/// case where the passed value is of a different enum variant. +V0Actions np_ffi_V0DataElement_into_ACTIONS(V0DataElement de); + +/// Return whether a boolean action type is set in this data element +bool np_ffi_V0Actions_has_action(V0Actions actions, BooleanActionType action_type); + +/// Gets the 4 bit context sync sequence number as a u8 from this data element +uint8_t np_ffi_V0Actions_get_context_sync_sequence_number(V0Actions actions); + +/// Return whether a boolean action type is set in this data element +uint32_t np_ffi_V0Actions_as_u32(V0Actions actions); + +/// Gets the number of legible sections on a deserialized V1 advertisement. +/// Suitable as an index bound for the second argument of +/// `np_ffi_DeserializedV1Advertisement#get_section`. +uint8_t np_ffi_DeserializedV1Advertisement_get_num_legible_sections(DeserializedV1Advertisement adv); + +/// Gets the number of sections on a deserialized V1 advertisement which +/// were unable to be decrypted with the credentials that the receiver possesses. +uint8_t np_ffi_DeserializedV1Advertisement_get_num_undecryptable_sections(DeserializedV1Advertisement adv); + +/// Gets the legible section with the given index in a deserialized V1 advertisement. +GetV1SectionResult np_ffi_DeserializedV1Advertisement_get_section(DeserializedV1Advertisement adv, + uint8_t legible_section_index); + +/// Gets the tag of the `GetV1SectionResult` tagged-union. +GetV1SectionResultKind np_ffi_GetV1SectionResult_kind(GetV1SectionResult result); + +/// Casts a `GetV1SectionResult` to the `Success` variant, panicking in the +/// case where the passed value is of a different enum variant. +DeserializedV1Section np_ffi_GetV1SectionResult_into_SUCCESS(GetV1SectionResult result); + +/// Gets the number of data elements in a deserialized v1 section. +/// Suitable as an iteration bound for the second argument of +/// `np_ffi_DeserializedV1Section_get_de`. +uint8_t np_ffi_DeserializedV1Section_get_num_des(DeserializedV1Section section); + +/// Gets the tag of the identity tagged-union used for the passed section. +DeserializedV1IdentityKind np_ffi_DeserializedV1Section_get_identity_kind(DeserializedV1Section section); + +/// Gets the data-element with the given index in the passed section. +GetV1DEResult np_ffi_DeserializedV1Section_get_de(DeserializedV1Section section, uint8_t de_index); + +/// Gets the tag of the `GetV1DEResult` tagged-union. +GetV1DEResultKind np_ffi_GetV1DEResult_kind(GetV1DEResult result); + +/// Casts a `GetV1DEResult` to the `Success` vartiant, panicking in the +/// case where the passed value is of a different enum variant. +V1DataElement np_ffi_GetV1DEResult_into_SUCCESS(GetV1DEResult result); + +/// Converts a `V1DataElement` to a `GenericV1DataElement` which +/// only maintains information about the DE's type-code and payload. +GenericV1DataElement np_ffi_V1DataElement_to_generic(V1DataElement de); + +/// Extracts the numerical value of the given V1 DE type code as +/// an unsigned 32-bit integer. +uint32_t np_ffi_V1DEType_to_uint32_t(V1DEType de_type); + +} // extern "C" + +} // namespace internal +} // namespace np_ffi
diff --git a/nearby/presence/np_c_ffi/include/cpp/np_cpp_ffi_types.h b/nearby/presence/np_c_ffi/include/cpp/np_cpp_ffi_types.h new file mode 100644 index 0000000..4d66308 --- /dev/null +++ b/nearby/presence/np_c_ffi/include/cpp/np_cpp_ffi_types.h
@@ -0,0 +1,456 @@ +/* + Copyright 2023 Google LLC + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + + +#pragma once + +/* Generated with cbindgen:0.24.5 */ + +/* + WARNING: this file is autogenerated by cbindgen. Don't modify this manually. + Additionally, you should _not_ rely upon the layouts of the generated + structs and unions if you want your code to be forward-compatible, + unless a given type explicitly states in its documentation that it has + a guaranteed forward-compatible layout. + Instead, you should use _only_ the provided exported function symbols. +*/ + +#include <cstdarg> +#include <cstdint> +#include <cstdlib> +#include <ostream> +#include <new> + +namespace np_ffi { +namespace internal { + +/// The possible boolean action types which can be present in an Actions data element +enum class BooleanActionType : uint8_t { + ActiveUnlock = 8, + NearbyShare = 9, + InstantTethering = 10, + PhoneHub = 11, + PresenceManager = 12, + Finder = 13, + FastPairSass = 14, +}; + +/// Discriminant for `CreateCredentialBookResult` +enum class CreateCredentialBookResultKind : uint8_t { + /// There was no space left to create a new credential book + NoSpaceLeft = 0, + /// We created a new credential book behind the given handle. + /// The associated payload may be obtained via + /// `CreateCredentialBookResult#into_success()`. + Success = 1, +}; + +/// A result-type enum which tells the caller whether/not a deallocation +/// succeeded or failed due to the requested handle not being present. +enum class DeallocateResult { + /// The requested handle to deallocate was not present in the map + NotPresent = 0, + /// The object behind the handle was successfully deallocated + Success = 1, +}; + +/// Discriminant for `DeserializeAdvertisementResult`. +enum class DeserializeAdvertisementResultKind : uint8_t { + /// Deserializing the advertisement failed, for some reason or another. + Error = 0, + /// The advertisement was correctly deserialized, and it's a V0 advertisement. + /// `DeserializeAdvertisementResult#into_v0()` is the corresponding cast + /// to the associated enum variant. + V0 = 1, + /// The advertisement was correctly deserialized, and it's a V1 advertisement. + /// `DeserializeAdvertisementResult#into_v1()` is the corresponding cast + /// to the associated enum variant. + V1 = 2, +}; + +/// Discriminant for possible results of V0 advertisement deserialization +enum class DeserializedV0AdvertisementKind : uint8_t { + /// The deserialized V0 advertisement was legible. + /// The associated payload may be obtained via + /// `DeserializedV0Advertisement#into_legible`. + Legible = 0, + /// The deserialized V0 advertisement is illegible, + /// likely meaning that the receiver does not hold + /// the proper credentials to be able to read + /// the received advertisement. + NoMatchingCredentials = 1, +}; + +/// Represents deserialized information about the V0 identity utilized +/// by a deserialized V0 advertisement +enum class DeserializedV0Identity { + Plaintext, + Decrypted, +}; + +/// Discriminant for `DeserializedV0Identity`. +enum class DeserializedV0IdentityKind : uint8_t { + /// The deserialized identity was a plaintext identity. + Plaintext = 0, + /// The deserialized identity was some decrypted identity. + Decrypted = 1, +}; + +/// Discriminant for `DeserializedV1Identity`. +enum class DeserializedV1IdentityKind : uint8_t { + /// The deserialized v1 identity was plaintext + Plaintext = 0, + /// The deserialized v1 identity corresponded + /// to some kind of decrypted identity. + Decrypted = 1, +}; + +/// Discriminant of `GetV0DEResult`. +enum class GetV0DEResultKind : uint8_t { + /// The attempt to get the DE succeeded. + /// The associated payload may be obtained via + /// `GetV0DEResult#into_success`. + Success = 0, + /// The attempt to get the DE failed, + /// possibly due to the requested index being + /// out-of-bounds or due to the advertisement + /// having been previously deallocated. + Error = 1, +}; + +/// Discriminant for the `GetV1DEResult` enum. +enum class GetV1DEResultKind : uint8_t { + /// Attempting to get the DE at the given position failed, + /// possibly due to the index being out-of-bounds or due + /// to the whole advertisement having been previously deallocated. + Error = 0, + /// Attempting to get the DE at the given position succeeded. + /// The underlying DE may be extracted with `GetV1DEResult#into_success`. + Success = 1, +}; + +/// Discriminant for `GetV1SectionResult` +enum class GetV1SectionResultKind : uint8_t { + /// The attempt to get the section failed, + /// possibly due to the section index being + /// out-of-bounds or due to the underlying + /// advertisement having already been deallocated. + Error = 0, + /// The attempt to get the section succeeded. + /// The wrapped section may be obtained via + /// `GetV1SectionResult#into_success`. + Success = 1, +}; + +/// Structure for categorized reasons for why a NP C FFI call may +/// be panicking. +enum class PanicReason : uint8_t { + /// Some enum cast to a variant failed. Utilized + /// for failed enum casts of all enums. + /// + /// (That is, this is the catch-all panic reason for enum + /// casts where there is not a more specific reason + /// in some other variant of this enum.) + EnumCastFailed = 0, + /// The panic handler is used to assert conditions are true to avoid programmer errors. + /// If a failed assert condition is hit, this panic handler is invoked with this reason. + AssertFailed = 1, + /// Error returned if action bits inside of a V0Actions struct are invalid. If the struct was + /// created by this deserializer, the bits will always be valid, they are only invalid if + /// a user reaches in and changes them to something invalid. + InvalidActionBits = 2, +}; + +/// Discriminant for `V0DataElement`. +enum class V0DataElementKind : uint8_t { + /// A transmission Power (Tx Power) data-element. + /// The associated payload may be obtained via + /// `V0DataElement#into_tx_power`. + TxPower = 0, + /// The Actions data-element. + /// The associated payload may be obtained via + /// `V0DataElement#into_actions`. + Actions = 1, +}; + +///A `#[repr(C)]` handle to a value of type `super::CredentialBookInternals`. +struct CredentialBook { + uint64_t handle_id; +}; + +/// Result type for `create_credential_book` +union CreateCredentialBookResult { + enum class Tag : uint8_t { + NoSpaceLeft = 0, + Success = 1, + }; + + struct Success_Body { + Tag tag; + CredentialBook _0; + }; + + struct { + Tag tag; + }; + Success_Body success; +}; + +///A `#[repr(C)]` handle to a value of type `super::V0PayloadInternals`. +struct V0Payload { + uint64_t handle_id; +}; + +/// Represents a deserialized V0 advertisement whose DE contents may be read +struct LegibleDeserializedV0Advertisement { + uint8_t num_des; + V0Payload payload; + DeserializedV0Identity identity; +}; + +/// Represents a deserialized V0 advertisement +struct DeserializedV0Advertisement { + enum class Tag { + Legible, + NoMatchingCredentials, + }; + + struct Legible_Body { + LegibleDeserializedV0Advertisement _0; + }; + + Tag tag; + union { + Legible_Body legible; + }; +}; + +///A `#[repr(C)]` handle to a value of type `super::LegibleV1SectionsInternals`. +struct LegibleV1Sections { + uint64_t handle_id; +}; + +/// Representation of a deserialized V1 advertisement +struct DeserializedV1Advertisement { + uint8_t num_legible_sections; + uint8_t num_undecryptable_sections; + LegibleV1Sections legible_sections; +}; + +/// The result of calling `np_ffi_deserialize_advertisement`. +/// Must be explicitly deallocated after use with +/// a corresponding `np_ffi_deallocate_deserialize_advertisement_result` +union DeserializeAdvertisementResult { + enum class Tag : uint8_t { + /// Deserializing the advertisement failed, for some reason or another. + /// `DeserializeAdvertisementResultKind::Error` is the associated enum tag. + Error, + /// The advertisement was correctly deserialized, and it's a V0 advertisement. + /// `DeserializeAdvertisementResultKind::V0` is the associated enum tag. + V0, + /// The advertisement was correctly deserialized, and it's a V1 advertisement. + /// `DeserializeAdvertisementResultKind::V1` is the associated enum tag. + V1, + }; + + struct V0_Body { + Tag tag; + DeserializedV0Advertisement _0; + }; + + struct V1_Body { + Tag tag; + DeserializedV1Advertisement _0; + }; + + struct { + Tag tag; + }; + V0_Body v0; + V1_Body v1; +}; + +/// A byte-string with a maximum size of N, +/// where only the first `len` bytes are considered +/// to contain the actual payload. N is only +/// permitted to be between 0 and 255. +template<uintptr_t N> +struct ByteBuffer { + uint8_t len; + uint8_t bytes[N]; +}; + +/// Represents the raw contents of the service payload data +/// under the Nearby Presence service UUID +struct RawAdvertisementPayload { + ByteBuffer<255> bytes; +}; + +/// Representation of a transmission power, +/// as used for the Tx Power DE in V0 and V1. +struct TxPower { + int8_t tx_power; +}; + +/// The bitfield data of a VOActions data element +struct V0ActionBits { + uint32_t bitfield; +}; + +/// Representation of the Actions DE in V0. +struct V0Actions { + enum class Tag { + /// A set of action bits which were present in a plaintext identity advertisement + Plaintext, + /// A set of action bits which were present in a encrypted identity advertisement + Encrypted, + }; + + struct Plaintext_Body { + V0ActionBits _0; + }; + + struct Encrypted_Body { + V0ActionBits _0; + }; + + Tag tag; + union { + Plaintext_Body plaintext; + Encrypted_Body encrypted; + }; +}; + +/// Representation of a V0 data element. +struct V0DataElement { + enum class Tag { + TxPower, + Actions, + }; + + struct TxPower_Body { + TxPower _0; + }; + + struct Actions_Body { + V0Actions _0; + }; + + Tag tag; + union { + TxPower_Body tx_power; + Actions_Body actions; + }; +}; + +/// The result of `V0Payload#get_de`. +struct GetV0DEResult { + enum class Tag { + Success, + Error, + }; + + struct Success_Body { + V0DataElement _0; + }; + + Tag tag; + union { + Success_Body success; + }; +}; + +/// Handle to a deserialized V1 section +struct DeserializedV1Section { + LegibleV1Sections legible_sections_handle; + uint8_t legible_section_index; + uint8_t num_des; + DeserializedV1IdentityKind identity_tag; +}; + +/// The result of attempting to get a particular V1 section +/// from its' index within the list of legible sections +/// via `DeserializedV1Advertisement::get_section`. +struct GetV1SectionResult { + enum class Tag { + Error, + Success, + }; + + struct Success_Body { + DeserializedV1Section _0; + }; + + Tag tag; + union { + Success_Body success; + }; +}; + +/// Representation of the data-element type tag +/// of a V1 data element. +struct V1DEType { + uint32_t code; +}; + +/// FFI-transmissible representation of a generic V1 data-element. +/// This representation is stable, and so you may directly +/// reference this struct's fields if you wish. +struct GenericV1DataElement { + /// The DE type code of this generic data-element. + V1DEType de_type; + /// The raw data-element byte payload, up to + /// 127 bytes in length. + ByteBuffer<127> payload; +}; + +/// FFI-transmissible representation of a V1 data-element +struct V1DataElement { + enum class Tag { + /// A "generic" V1 data-element, for which we have no + /// particular information about its schema (just + /// a DE type code and a byte payload.) + Generic, + }; + + struct Generic_Body { + GenericV1DataElement _0; + }; + + Tag tag; + union { + Generic_Body generic; + }; +}; + +/// Represents the result of the `DeserializedV1Section#get_de` operation. +struct GetV1DEResult { + enum class Tag { + Error, + Success, + }; + + struct Success_Body { + V1DataElement _0; + }; + + Tag tag; + union { + Success_Body success; + }; +}; + +} // namespace internal +} // namespace np_ffi
diff --git a/nearby/presence/np_c_ffi/rust-toolchain.toml b/nearby/presence/np_c_ffi/rust-toolchain.toml new file mode 100644 index 0000000..271800c --- /dev/null +++ b/nearby/presence/np_c_ffi/rust-toolchain.toml
@@ -0,0 +1,2 @@ +[toolchain] +channel = "nightly" \ No newline at end of file
diff --git a/nearby/presence/np_c_ffi/src/credentials.rs b/nearby/presence/np_c_ffi/src/credentials.rs new file mode 100644 index 0000000..6b60545 --- /dev/null +++ b/nearby/presence/np_c_ffi/src/credentials.rs
@@ -0,0 +1,51 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +//! Credential-related data-types and functions + +use crate::{unwrap, PanicReason}; +use np_ffi_core::common::*; +use np_ffi_core::credentials::credential_book::CredentialBook; +use np_ffi_core::credentials::*; +use np_ffi_core::utils::FfiEnum; + +/// Allocates a new credential-book, returning a handle to the created object +#[no_mangle] +pub extern "C" fn np_ffi_create_credential_book() -> CreateCredentialBookResult { + create_credential_book() +} + +/// Gets the tag of a `CreateCredentialBookResult` tagged enum. +#[no_mangle] +pub extern "C" fn np_ffi_CreateCredentialBookResult_kind( + result: CreateCredentialBookResult, +) -> CreateCredentialBookResultKind { + result.kind() +} + +/// Casts a `CreateCredentialBookResult` to the `SUCCESS` variant, panicking in the +/// case where the passed value is of a different enum variant. +#[no_mangle] +pub extern "C" fn np_ffi_CreateCredentialBookResult_into_SUCCESS( + result: CreateCredentialBookResult, +) -> CredentialBook { + unwrap(result.into_success(), PanicReason::EnumCastFailed) +} + +/// Deallocates a credential-book by its handle +#[no_mangle] +pub extern "C" fn np_ffi_deallocate_credential_book( + credential_book: CredentialBook, +) -> DeallocateResult { + deallocate_credential_book(credential_book) +}
diff --git a/nearby/presence/np_c_ffi/src/deserialize/mod.rs b/nearby/presence/np_c_ffi/src/deserialize/mod.rs new file mode 100644 index 0000000..9f2cea8 --- /dev/null +++ b/nearby/presence/np_c_ffi/src/deserialize/mod.rs
@@ -0,0 +1,87 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +use crate::{unwrap, PanicReason}; +use np_ffi_core::common::*; +use np_ffi_core::credentials::credential_book::CredentialBook; +use np_ffi_core::deserialize::v0::*; +use np_ffi_core::deserialize::v1::*; +use np_ffi_core::deserialize::*; +use np_ffi_core::utils::FfiEnum; + +mod v0; +mod v1; + +/// Attempts to deserialize an advertisement with the given service-data +/// payload (presumed to be under the NP service UUID) using credentials +/// pulled from the given credential-book. +#[no_mangle] +pub extern "C" fn np_ffi_deserialize_advertisement( + adv_payload: RawAdvertisementPayload, + credential_book: CredentialBook, +) -> DeserializeAdvertisementResult { + deserialize_advertisement(&adv_payload, credential_book) +} + +/// Gets the tag of a `DeserializeAdvertisementResult` tagged-union. +#[no_mangle] +pub extern "C" fn np_ffi_DeserializeAdvertisementResult_kind( + result: DeserializeAdvertisementResult, +) -> DeserializeAdvertisementResultKind { + result.kind() +} + +/// Casts a `DeserializeAdvertisementResult` to the `V0` variant, panicking in the +/// case where the passed value is of a different enum variant. +#[no_mangle] +pub extern "C" fn np_ffi_DeserializeAdvertisementResult_into_V0( + result: DeserializeAdvertisementResult, +) -> DeserializedV0Advertisement { + unwrap(result.into_v0(), PanicReason::EnumCastFailed) +} + +/// Casts a `DeserializeAdvertisementResult` to the `V1` variant, panicking in the +/// case where the passed value is of a different enum variant. +#[no_mangle] +pub extern "C" fn np_ffi_DeserializeAdvertisementResult_into_V1( + result: DeserializeAdvertisementResult, +) -> DeserializedV1Advertisement { + unwrap(result.into_v1(), PanicReason::EnumCastFailed) +} + +/// Deallocates any internal data referenced by a `DeserializeAdvertisementResult`. This should only +/// be used if into_V0 or into_V1, have not been called yet as it shares the same underlying +/// resource. +#[no_mangle] +pub extern "C" fn np_ffi_deallocate_deserialize_advertisement_result( + result: DeserializeAdvertisementResult, +) -> DeallocateResult { + result.deallocate() +} + +/// Deallocates any internal data referenced by a `DeserializedV0Advertisement` +#[no_mangle] +pub extern "C" fn np_ffi_deallocate_deserialized_V0_advertisement( + adv: DeserializedV0Advertisement, +) -> DeallocateResult { + adv.deallocate() +} + +/// Deallocates any internal data referenced by a `DeserializedV1Advertisement` +#[no_mangle] +pub extern "C" fn np_ffi_deallocate_deserialized_V1_advertisement( + adv: DeserializedV1Advertisement, +) -> DeallocateResult { + adv.deallocate() +}
diff --git a/nearby/presence/np_c_ffi/src/deserialize/v0.rs b/nearby/presence/np_c_ffi/src/deserialize/v0.rs new file mode 100644 index 0000000..877cee5 --- /dev/null +++ b/nearby/presence/np_c_ffi/src/deserialize/v0.rs
@@ -0,0 +1,149 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +use crate::{panic, unwrap, PanicReason}; +use np_ffi_core::common::DeallocateResult; +use np_ffi_core::deserialize::v0::v0_payload::V0Payload; +use np_ffi_core::deserialize::v0::*; +use np_ffi_core::utils::FfiEnum; + +/// Gets the tag of a `DeserializedV0Advertisement` tagged-union. +#[no_mangle] +pub extern "C" fn np_ffi_DeserializedV0Advertisement_kind( + result: DeserializedV0Advertisement, +) -> DeserializedV0AdvertisementKind { + result.kind() +} + +/// Casts a `DeserializedV0Advertisement` to the `Legible` variant, panicking in the +/// case where the passed value is of a different enum variant. +#[no_mangle] +pub extern "C" fn np_ffi_DeserializedV0Advertisement_into_LEGIBLE( + adv: DeserializedV0Advertisement, +) -> LegibleDeserializedV0Advertisement { + unwrap(adv.into_legible(), PanicReason::EnumCastFailed) +} + +/// Gets the number of DEs in a legible deserialized advertisement. +/// Suitable as an iteration bound for `V0Payload#get_de`. +#[no_mangle] +pub extern "C" fn np_ffi_LegibleDeserializedV0Advertisement_get_num_des( + adv: LegibleDeserializedV0Advertisement, +) -> u8 { + adv.num_des() +} + +/// Gets just the data-element payload of a `LegibleDeserializedV0Advertisement`. +#[no_mangle] +pub extern "C" fn np_ffi_LegibleDeserializedV0Advertisement_into_payload( + adv: LegibleDeserializedV0Advertisement, +) -> V0Payload { + adv.into_payload() +} + +/// Gets just the identity information associated with a `LegibleDeserializedV0Advertisement`. +#[no_mangle] +pub extern "C" fn np_ffi_LegibleDeserializedV0Advertisement_into_identity( + adv: LegibleDeserializedV0Advertisement, +) -> DeserializedV0Identity { + adv.into_identity() +} + +/// Deallocates any internal data of a `LegibleDeserializedV0Advertisement` +#[no_mangle] +pub extern "C" fn np_ffi_deallocate_legible_v0_advertisement( + adv: LegibleDeserializedV0Advertisement, +) -> DeallocateResult { + adv.deallocate() +} + +/// Gets the tag of the `DeserializedV0Identity` tagged-union. +#[no_mangle] +pub extern "C" fn np_ffi_DeserializedV0Identity_kind( + identity: DeserializedV0Identity, +) -> DeserializedV0IdentityKind { + identity.kind() +} + +/// Attempts to get the data-element with the given index in the passed v0 adv payload +#[no_mangle] +pub extern "C" fn np_ffi_V0Payload_get_de(payload: V0Payload, index: u8) -> GetV0DEResult { + payload.get_de(index) +} + +/// Deallocates any internal data of a `V0Payload` +#[no_mangle] +pub extern "C" fn np_ffi_deallocate_v0_payload(payload: V0Payload) -> DeallocateResult { + payload.deallocate_payload() +} + +/// Gets the tag of a `GetV0DEResult` tagged-union. +#[no_mangle] +pub extern "C" fn np_ffi_GetV0DEResult_kind(result: GetV0DEResult) -> GetV0DEResultKind { + result.kind() +} + +/// Casts a `GetV0DEResult` to the `Success` variant, panicking in the +/// case where the passed value is of a different enum variant. +#[no_mangle] +pub extern "C" fn np_ffi_GetV0DEResult_into_SUCCESS(result: GetV0DEResult) -> V0DataElement { + unwrap(result.into_success(), PanicReason::EnumCastFailed) +} + +/// Gets the tag of a `V0DataElement` tagged-union. +#[no_mangle] +pub extern "C" fn np_ffi_V0DataElement_kind(de: V0DataElement) -> V0DataElementKind { + de.kind() +} + +/// Casts a `V0DataElement` to the `TxPower` variant, panicking in the +/// case where the passed value is of a different enum variant. +#[no_mangle] +pub extern "C" fn np_ffi_V0DataElement_into_TX_POWER(de: V0DataElement) -> TxPower { + unwrap(de.into_tx_power(), PanicReason::EnumCastFailed) +} + +/// Casts a `V0DataElement` to the `Actions` variant, panicking in the +/// case where the passed value is of a different enum variant. +#[no_mangle] +pub extern "C" fn np_ffi_V0DataElement_into_ACTIONS(de: V0DataElement) -> V0Actions { + unwrap(de.into_actions(), PanicReason::EnumCastFailed) +} + +/// Return whether a boolean action type is set in this data element +#[no_mangle] +pub extern "C" fn np_ffi_V0Actions_has_action( + actions: V0Actions, + action_type: BooleanActionType, +) -> bool { + match actions.has_action(&action_type) { + Ok(b) => b, + Err(_) => panic(PanicReason::InvalidActionBits), + } +} + +/// Gets the 4 bit context sync sequence number as a u8 from this data element +#[no_mangle] +pub extern "C" fn np_ffi_V0Actions_get_context_sync_sequence_number(actions: V0Actions) -> u8 { + match actions.get_context_sync_seq_num() { + Ok(b) => b, + Err(_) => panic(PanicReason::InvalidActionBits), + } +} + +/// Return whether a boolean action type is set in this data element +#[no_mangle] +pub extern "C" fn np_ffi_V0Actions_as_u32(actions: V0Actions) -> u32 { + actions.as_u32() +}
diff --git a/nearby/presence/np_c_ffi/src/deserialize/v1.rs b/nearby/presence/np_c_ffi/src/deserialize/v1.rs new file mode 100644 index 0000000..dc682a3 --- /dev/null +++ b/nearby/presence/np_c_ffi/src/deserialize/v1.rs
@@ -0,0 +1,114 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +use crate::{unwrap, PanicReason}; +use np_ffi_core::deserialize::v1::*; +use np_ffi_core::utils::FfiEnum; + +/// Gets the number of legible sections on a deserialized V1 advertisement. +/// Suitable as an index bound for the second argument of +/// `np_ffi_DeserializedV1Advertisement#get_section`. +#[no_mangle] +pub extern "C" fn np_ffi_DeserializedV1Advertisement_get_num_legible_sections( + adv: DeserializedV1Advertisement, +) -> u8 { + adv.num_legible_sections() +} + +/// Gets the number of sections on a deserialized V1 advertisement which +/// were unable to be decrypted with the credentials that the receiver possesses. +#[no_mangle] +pub extern "C" fn np_ffi_DeserializedV1Advertisement_get_num_undecryptable_sections( + adv: DeserializedV1Advertisement, +) -> u8 { + adv.num_undecryptable_sections() +} + +/// Gets the legible section with the given index in a deserialized V1 advertisement. +#[no_mangle] +pub extern "C" fn np_ffi_DeserializedV1Advertisement_get_section( + adv: DeserializedV1Advertisement, + legible_section_index: u8, +) -> GetV1SectionResult { + adv.get_section(legible_section_index) +} + +/// Gets the tag of the `GetV1SectionResult` tagged-union. +#[no_mangle] +pub extern "C" fn np_ffi_GetV1SectionResult_kind( + result: GetV1SectionResult, +) -> GetV1SectionResultKind { + result.kind() +} + +/// Casts a `GetV1SectionResult` to the `Success` variant, panicking in the +/// case where the passed value is of a different enum variant. +#[no_mangle] +pub extern "C" fn np_ffi_GetV1SectionResult_into_SUCCESS( + result: GetV1SectionResult, +) -> DeserializedV1Section { + unwrap(result.into_success(), PanicReason::EnumCastFailed) +} + +/// Gets the number of data elements in a deserialized v1 section. +/// Suitable as an iteration bound for the second argument of +/// `np_ffi_DeserializedV1Section_get_de`. +#[no_mangle] +pub extern "C" fn np_ffi_DeserializedV1Section_get_num_des(section: DeserializedV1Section) -> u8 { + section.num_des() +} + +/// Gets the tag of the identity tagged-union used for the passed section. +#[no_mangle] +pub extern "C" fn np_ffi_DeserializedV1Section_get_identity_kind( + section: DeserializedV1Section, +) -> DeserializedV1IdentityKind { + section.identity_kind() +} + +/// Gets the data-element with the given index in the passed section. +#[no_mangle] +pub extern "C" fn np_ffi_DeserializedV1Section_get_de( + section: DeserializedV1Section, + de_index: u8, +) -> GetV1DEResult { + section.get_de(de_index) +} + +/// Gets the tag of the `GetV1DEResult` tagged-union. +#[no_mangle] +pub extern "C" fn np_ffi_GetV1DEResult_kind(result: GetV1DEResult) -> GetV1DEResultKind { + result.kind() +} + +/// Casts a `GetV1DEResult` to the `Success` vartiant, panicking in the +/// case where the passed value is of a different enum variant. +#[no_mangle] +pub extern "C" fn np_ffi_GetV1DEResult_into_SUCCESS(result: GetV1DEResult) -> V1DataElement { + unwrap(result.into_success(), PanicReason::EnumCastFailed) +} + +/// Converts a `V1DataElement` to a `GenericV1DataElement` which +/// only maintains information about the DE's type-code and payload. +#[no_mangle] +pub extern "C" fn np_ffi_V1DataElement_to_generic(de: V1DataElement) -> GenericV1DataElement { + de.to_generic() +} + +/// Extracts the numerical value of the given V1 DE type code as +/// an unsigned 32-bit integer. +#[no_mangle] +pub extern "C" fn np_ffi_V1DEType_to_uint32_t(de_type: V1DEType) -> u32 { + de_type.to_u32() +}
diff --git a/nearby/presence/np_c_ffi/src/lib.rs b/nearby/presence/np_c_ffi/src/lib.rs new file mode 100644 index 0000000..bd475ab --- /dev/null +++ b/nearby/presence/np_c_ffi/src/lib.rs
@@ -0,0 +1,221 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! NP Rust C FFI + +#![cfg_attr(not(test), no_std)] +#![allow(dead_code)] +extern crate alloc; +extern crate core; + +pub mod credentials; +pub mod deserialize; + +/// Structure for categorized reasons for why a NP C FFI call may +/// be panicking. +#[derive(Clone, Copy)] +#[repr(u8)] +pub enum PanicReason { + /// Some enum cast to a variant failed. Utilized + /// for failed enum casts of all enums. + /// + /// (That is, this is the catch-all panic reason for enum + /// casts where there is not a more specific reason + /// in some other variant of this enum.) + EnumCastFailed = 0, + /// The panic handler is used to assert conditions are true to avoid programmer errors. + /// If a failed assert condition is hit, this panic handler is invoked with this reason. + AssertFailed = 1, + /// Error returned if action bits inside of a V0Actions struct are invalid. If the struct was + /// created by this deserializer, the bits will always be valid, they are only invalid if + /// a user reaches in and changes them to something invalid. + InvalidActionBits = 2, +} + +/// Structure which maintains information about the panic-handler +/// for panicking calls in the NP C FFI. +#[derive(Debug)] +struct PanicHandler { + /// Optional function-pointer to client-specified panic behavior. + handler: Option<unsafe extern "C" fn(PanicReason) -> ()>, + + /// Fuse to prevent setting the panic-handler more than once. + /// We do not use the presence/absence of `self.handler` for this, + /// since it's possible for the client to explicitly pass "NULL" + /// to set the panic-handler to the platform-default (and ensure + /// that the panic-handler never changes from the platform-default.) + handler_set_by_client: bool, +} + +impl PanicHandler { + pub(crate) const fn new() -> Self { + Self { handler: None, handler_set_by_client: false } + } + pub(crate) fn set_handler( + &mut self, + handler: Option<unsafe extern "C" fn(PanicReason) -> ()>, + ) -> bool { + // Only allow setting the panic handler once + if !self.handler_set_by_client { + self.handler = handler; + self.handler_set_by_client = true; + true + } else { + false + } + } + pub(crate) fn panic(&self, panic_reason: PanicReason) -> ! { + if let Some(handler) = self.handler { + unsafe { handler(panic_reason) } + } + Self::system_handler(panic_reason) + } + #[cfg(feature = "std")] + fn system_handler(panic_reason: PanicReason) -> ! { + eprintln!("NP FFI Panicked: {:?}", panic_reason); + let backtrace = std::backtrace::Backtrace::capture(); + eprintln!("Stack trace: {}", backtrace); + std::process::abort!(); + } + #[cfg(not(feature = "std"))] + #[allow(clippy::empty_loop)] + fn system_handler(_: PanicReason) -> ! { + // Looping is the only platform-independent thing + // that we can really do in this scenario. + // (Even clippy's explanation for the empty-loop + // lint mentions platform-specific intrinsics + // as being the only true way to avoid this + // in a no_std environment.) + loop {} + } +} + +static PANIC_HANDLER: spin::RwLock<PanicHandler> = spin::RwLock::new(PanicHandler::new()); + +pub(crate) fn panic(reason: PanicReason) -> ! { + PANIC_HANDLER.read().panic(reason) +} + +pub(crate) fn unwrap<T>(value: Option<T>, panic_reason: PanicReason) -> T { + match value { + Some(x) => x, + None => panic(panic_reason), + } +} + +/// Overrides the global panic handler to be used when NP C FFI calls panic. +/// This method will only have an effect on the global panic-handler +/// the first time it's called, and this method will return `true` +/// to indicate that the panic handler was successfully set. +/// All subsequent calls to this method +/// will simply ignore the argument and return `false`. +/// +/// If the passed function pointer is non-null, +/// then we will call it upon every panic, +/// followed by the default panicking behavior for +/// the platform (in the case where the user-specified +/// function does not terminate or hang the running process.) +/// +/// Otherwise, we will resort to the +/// default panicking behavior for the system, which +/// is a printed stack trace followed by an abort +/// when this crate is compiled with `std`, +/// but a bare `loop { }` when this crate is compiled without. +#[no_mangle] +pub extern "C" fn np_ffi_global_config_panic_handler( + handler: Option<unsafe extern "C" fn(PanicReason) -> ()>, +) -> bool { + let mut panic_handler = PANIC_HANDLER.write(); + panic_handler.set_handler(handler) +} + +/// Sets an override to the number of shards to employ in the NP FFI's +/// internal handle-maps, which places an upper bound on the number +/// of writing threads which may make progress at any one time +/// when concurrently accessing handles of the same type. +/// +/// By default, this value will be set to 16, or in `std` environments, +/// the minimum of 16 and the number of available hardware threads. +/// A shard value override of zero will be interpreted the same +/// as this default. +/// +/// Setting this value will have no effect if the handle-maps for the +/// API have already begun being used by the client code, and any +/// values set will take effect upon the first usage of _any_ non-`np_ffi_global_config_set` +/// API call. +#[no_mangle] +pub extern "C" fn np_ffi_global_config_set_num_shards(num_shards: u8) { + np_ffi_core::common::global_config_set_num_shards(num_shards) +} + +/// Sets the maximum number of active handles to credential books +/// which may be active at any one time. +/// Default value: Max value. +/// Max value: `u32::MAX - 1`. +/// +/// Useful for bounding the maximum memory used by the client application +/// on credential books in constrained-memory environments. +/// +/// Setting this value will have no effect if the handle-maps for the +/// API have already begun being used by the client code, and any +/// values set will take effect upon the first usage of any API +/// call utilizing credential books. +#[no_mangle] +pub extern "C" fn np_ffi_global_config_set_max_num_credential_books(max_num_credential_books: u32) { + np_ffi_core::common::global_config_set_max_num_credential_books(max_num_credential_books) +} + +/// Sets the maximum number of active handles to deserialized v0 +/// advertisements which may be active at any one time. +/// +/// Useful for bounding the maximum memory used by the client application +/// on v0 advertisements in constrained-memory environments. +/// +/// Default value: Max value. +/// Max value: `u32::MAX - 1`. +/// +/// Setting this value will have no effect if the handle-maps for the +/// API have already begun being used by the client code, and any +/// values set will take effect upon the first usage of any API +/// call which references or returns a deserialized V0 advertisement. +#[no_mangle] +pub extern "C" fn np_ffi_global_config_set_max_num_deserialized_v0_advertisements( + max_num_deserialized_v0_advertisements: u32, +) { + np_ffi_core::common::global_config_set_max_num_deserialized_v0_advertisements( + max_num_deserialized_v0_advertisements, + ) +} + +/// Sets the maximum number of active handles to deserialized v1 +/// advertisements which may be active at any one time. +/// +/// Useful for bounding the maximum memory used by the client application +/// on v1 advertisements in constrained-memory environments. +/// +/// Default value: Max value. +/// Max value: `u32::MAX - 1`. +/// +/// Setting this value will have no effect if the handle-maps for the +/// API have already begun being used by the client code, and any +/// values set will take effect upon the first usage of any API +/// call which references or returns a deserialized V1 advertisement. +#[no_mangle] +pub extern "C" fn np_ffi_global_config_set_max_num_deserialized_v1_advertisements( + max_num_deserialized_v1_advertisements: u32, +) { + np_ffi_core::common::global_config_set_max_num_deserialized_v1_advertisements( + max_num_deserialized_v1_advertisements, + ) +}
diff --git a/nearby/presence/np_cpp_ffi/CMakeLists.txt b/nearby/presence/np_cpp_ffi/CMakeLists.txt new file mode 100644 index 0000000..27c9132 --- /dev/null +++ b/nearby/presence/np_cpp_ffi/CMakeLists.txt
@@ -0,0 +1,48 @@ +# Copyright 2023 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# include ABSL third_party dir which will add it to the cmake build tree +set(ABSL_PROPAGATE_CXX_STD ON) +add_subdirectory(${THIRD_PARTY_DIR}/abseil-cpp ${THIRD_PARTY_DIR}/abseil-cpp/build) + +add_library(nearby_protocol nearby_protocol.cc) + +target_link_libraries(nearby_protocol + "${CMAKE_SOURCE_DIR}/np_c_ffi/target/release/${CMAKE_STATIC_LIBRARY_PREFIX}np_c_ffi${CMAKE_STATIC_LIBRARY_SUFFIX}" + absl::statusor) + +target_include_directories(nearby_protocol PUBLIC + include/ + ${CMAKE_SOURCE_DIR}/np_c_ffi/include/cpp/) + +target_include_directories(nearby_protocol PRIVATE + ${CMAKE_SOURCE_DIR}/np_c_ffi/include/cpp/internal/) + +add_subdirectory(sample) + +# shared testing utilities between sample, tests, and fuzzers +add_library(shared_test_util shared/shared_test_util.cc) +target_include_directories(shared_test_util PUBLIC shared/) +target_include_directories(shared_test_util PRIVATE include/) +target_link_libraries(shared_test_util nearby_protocol absl::statusor) + +if (ENABLE_TESTS) + message(STATUS "Enabling np_cpp tests") + add_subdirectory(tests) + add_subdirectory(benchmarks) +endif () + +if (ENABLE_FUZZ) + add_subdirectory(fuzz) +endif ()
diff --git a/nearby/presence/np_cpp_ffi/benchmarks/CMakeLists.txt b/nearby/presence/np_cpp_ffi/benchmarks/CMakeLists.txt new file mode 100644 index 0000000..c7d8343 --- /dev/null +++ b/nearby/presence/np_cpp_ffi/benchmarks/CMakeLists.txt
@@ -0,0 +1,32 @@ +# Copyright 2022 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +add_executable(np_ffi_bench np_ffi_bench.cc) + +target_link_libraries( + np_ffi_bench + nearby_protocol + benchmark::benchmark) + +if (UNIX) + target_link_libraries( + np_ffi_bench + dl -fsanitize=address + ) +elseif (MSVC) + target_link_libraries( + np_ffi_bench + bcrypt ntdll userenv ws2_32 + ) +endif ()
diff --git a/nearby/presence/np_cpp_ffi/benchmarks/np_ffi_bench.cc b/nearby/presence/np_cpp_ffi/benchmarks/np_ffi_bench.cc new file mode 100644 index 0000000..72a3f91 --- /dev/null +++ b/nearby/presence/np_cpp_ffi/benchmarks/np_ffi_bench.cc
@@ -0,0 +1,102 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "nearby_protocol.h" + +#include "np_cpp_ffi_functions.h" +#include "np_cpp_ffi_types.h" + +#include "benchmark/benchmark.h" + +// Internal C struct representation of a v0 payload +static np_ffi::internal::RawAdvertisementPayload payload{ + {7, + { + 0x00, // Adv Header + 0x03, // Public DE header + 0x15, 0x05, // Tx Power value 5 + 0x26, 0x00, 0x46, // Length 2 Actions + }}}; + +static nearby_protocol::RawAdvertisementPayload + v0_adv(nearby_protocol::ByteBuffer(payload.bytes)); + +class NpCppBenchmark : public benchmark::Fixture { + void SetUp(const ::benchmark::State &state) override {} + + void TearDown(const ::benchmark::State &state) override {} +}; + +BENCHMARK_DEFINE_F(NpCppBenchmark, V0PlaintextAdvertisement) +(benchmark::State &state) { + auto cred_book = nearby_protocol::CredentialBook::TryCreate(); + assert(cred_book.ok()); + auto num_ciphers = state.range(0); + + for ([[maybe_unused]] auto _ : state) { + for (int i = 0; i < num_ciphers; i++) { + auto result = nearby_protocol::Deserializer::DeserializeAdvertisement( + v0_adv, cred_book.value()); + assert(result.GetKind() == + nearby_protocol::DeserializeAdvertisementResultKind::V0); + } + } +} + +BENCHMARK_REGISTER_F(NpCppBenchmark, V0PlaintextAdvertisement) + ->RangeMultiplier(10) + ->Range(1, 1000) + ->Unit(benchmark::kMicrosecond); + +class NpCBenchmark : public benchmark::Fixture { + void SetUp(const ::benchmark::State &state) override {} + + void TearDown(const ::benchmark::State &state) override {} +}; + +BENCHMARK_DEFINE_F(NpCBenchmark, V0PlaintextAdvertisement) +(benchmark::State &state) { + auto num_ciphers = state.range(0); + auto book_result = np_ffi::internal::np_ffi_create_credential_book(); + assert( + np_ffi::internal::np_ffi_CreateCredentialBookResult_kind(book_result) == + np_ffi::internal::CreateCredentialBookResultKind::Success); + auto book = np_ffi::internal::np_ffi_CreateCredentialBookResult_into_SUCCESS( + book_result); + + for ([[maybe_unused]] auto _ : state) { + for (int i = 0; i < num_ciphers; i++) { + auto result = + np_ffi::internal::np_ffi_deserialize_advertisement({payload}, book); + assert(np_ffi::internal::np_ffi_DeserializeAdvertisementResult_kind( + result) == + np_ffi::internal::DeserializeAdvertisementResultKind::V0); + auto deallocate_result = + np_ffi::internal::np_ffi_deallocate_deserialize_advertisement_result( + result); + assert(deallocate_result == np_ffi::internal::DeallocateResult::Success); + } + } + + auto deallocate_result = + np_ffi::internal::np_ffi_deallocate_credential_book(book); + assert(deallocate_result == np_ffi::internal::DeallocateResult::Success); +} + +BENCHMARK_REGISTER_F(NpCBenchmark, V0PlaintextAdvertisement) + ->RangeMultiplier(10) + ->Range(1, 1000) + ->Unit(benchmark::kMicrosecond); + +BENCHMARK_MAIN(); \ No newline at end of file
diff --git a/nearby/presence/np_cpp_ffi/fuzz/CMakeLists.txt b/nearby/presence/np_cpp_ffi/fuzz/CMakeLists.txt new file mode 100644 index 0000000..17f2f1f --- /dev/null +++ b/nearby/presence/np_cpp_ffi/fuzz/CMakeLists.txt
@@ -0,0 +1,31 @@ +# Copyright 2023 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +cmake_minimum_required(VERSION 3.0) + +# libfuzzer needs clang +SET(CMAKE_C_COMPILER "clang") + +add_compile_definitions("CORPUS_DIR=${CMAKE_CURRENT_SOURCE_DIR}/corpus") +file(COPY corpus DESTINATION "${CMAKE_CURRENT_BINARY_DIR}") +add_executable(generate_fuzz_corpus generate_fuzz_corpus.cc) +target_link_libraries(generate_fuzz_corpus nearby_protocol shared_test_util) + +add_executable(fuzzer_np_cpp_deserialize fuzzer_np_cpp_deserialize.cc) +target_compile_options(fuzzer_np_cpp_deserialize PRIVATE -fsanitize=fuzzer,address) +target_link_libraries(fuzzer_np_cpp_deserialize nearby_protocol -fsanitize=fuzzer,address) + +add_executable(fuzzer_np_cpp_valid_header fuzzer_np_cpp_valid_header.cc) +target_compile_options(fuzzer_np_cpp_valid_header PRIVATE -fsanitize=fuzzer,address) +target_link_libraries(fuzzer_np_cpp_valid_header nearby_protocol -fsanitize=fuzzer,address)
diff --git a/nearby/presence/np_cpp_ffi/fuzz/corpus/V0AdvEmpty b/nearby/presence/np_cpp_ffi/fuzz/corpus/V0AdvEmpty new file mode 100644 index 0000000..f76dd23 --- /dev/null +++ b/nearby/presence/np_cpp_ffi/fuzz/corpus/V0AdvEmpty Binary files differ
diff --git a/nearby/presence/np_cpp_ffi/fuzz/corpus/V0AdvSimple b/nearby/presence/np_cpp_ffi/fuzz/corpus/V0AdvSimple new file mode 100644 index 0000000..fac97f6 --- /dev/null +++ b/nearby/presence/np_cpp_ffi/fuzz/corpus/V0AdvSimple Binary files differ
diff --git a/nearby/presence/np_cpp_ffi/fuzz/corpus/V1AdvSimple b/nearby/presence/np_cpp_ffi/fuzz/corpus/V1AdvSimple new file mode 100644 index 0000000..4acdf33 --- /dev/null +++ b/nearby/presence/np_cpp_ffi/fuzz/corpus/V1AdvSimple
@@ -0,0 +1 @@ + \ No newline at end of file
diff --git a/nearby/presence/np_cpp_ffi/fuzz/fuzzer_np_cpp_deserialize.cc b/nearby/presence/np_cpp_ffi/fuzz/fuzzer_np_cpp_deserialize.cc new file mode 100644 index 0000000..84d7247 --- /dev/null +++ b/nearby/presence/np_cpp_ffi/fuzz/fuzzer_np_cpp_deserialize.cc
@@ -0,0 +1,48 @@ +/* + * Copyright 2023 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "nearby_protocol.h" + +#include <cstdint> +#include <string> + +#include "absl/strings/escaping.h" + +extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) { + // won't fit into a FfiByteBuffer<255> + if (size > 255) { + return -1; + } + + nearby_protocol::FfiByteBuffer<255> raw_bytes; + memcpy(&raw_bytes.bytes, data, size); + raw_bytes.len = size; + + nearby_protocol::RawAdvertisementPayload payload( + (nearby_protocol::ByteBuffer<255>(raw_bytes))); + + auto credential_book = nearby_protocol::CredentialBook::TryCreate(); + if (!credential_book.ok()) { + printf("Error: create Credential book failed\n"); + __builtin_trap(); + } + + auto deserialize_result = + nearby_protocol::Deserializer::DeserializeAdvertisement( + payload, credential_book.value()); + + return 0; +} \ No newline at end of file
diff --git a/nearby/presence/np_cpp_ffi/fuzz/fuzzer_np_cpp_valid_header.cc b/nearby/presence/np_cpp_ffi/fuzz/fuzzer_np_cpp_valid_header.cc new file mode 100644 index 0000000..c08b6cd --- /dev/null +++ b/nearby/presence/np_cpp_ffi/fuzz/fuzzer_np_cpp_valid_header.cc
@@ -0,0 +1,54 @@ +/* + * Copyright 2023 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "nearby_protocol.h" + +#include <cstdint> + +// Fuzz input data beginning with a valid header +extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) { + // Won't fit into a FfiByteBuffer<255> + if (size > 255) { + return -1; + } + + nearby_protocol::FfiByteBuffer<255> raw_bytes; + memcpy(&raw_bytes.bytes, data, size); + raw_bytes.len = size; + + nearby_protocol::RawAdvertisementPayload payload( + (nearby_protocol::ByteBuffer<255>(raw_bytes))); + + auto credential_book = nearby_protocol::CredentialBook::TryCreate(); + if (!credential_book.ok()) { + printf("Error: create Credential book failed\n"); + __builtin_trap(); + } + + // Force it to go down the v0 deserialization path + raw_bytes.bytes[0] = 0x00; + + auto v0_result = nearby_protocol::Deserializer::DeserializeAdvertisement( + payload, credential_book.value()); + + // Force it down the v1 deserialization path + raw_bytes.bytes[0] = 0x20; + + auto v1_result = nearby_protocol::Deserializer::DeserializeAdvertisement( + payload, credential_book.value()); + + return 0; +} \ No newline at end of file
diff --git a/nearby/presence/np_cpp_ffi/fuzz/generate_fuzz_corpus.cc b/nearby/presence/np_cpp_ffi/fuzz/generate_fuzz_corpus.cc new file mode 100644 index 0000000..9d28f7a --- /dev/null +++ b/nearby/presence/np_cpp_ffi/fuzz/generate_fuzz_corpus.cc
@@ -0,0 +1,44 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "nearby_protocol.h" +#include "shared_test_util.h" + +#include <fstream> +#include <iostream> + +#define STRING(x) #x +#define XSTRING(x) STRING(x) + +void write_corpus_data_file(std::string file_name, + nearby_protocol::RawAdvertisementPayload payload) { + // Get the current source directory. + std::string current_source_dir = XSTRING(CORPUS_DIR); + + // Print the current source directory to the console. + std::cout << "Writing to file: " << current_source_dir << "/" << file_name + << std::endl; + + std::ofstream out(current_source_dir + "/" + file_name, + std::ios::out | std::ios::binary); + auto vec_data = payload.buffer_.ToVector(); + out.write(reinterpret_cast<const char *>(vec_data.data()), vec_data.size()); + out.close(); +} + +int main() { + write_corpus_data_file("V0AdvSimple", V0AdvSimple); + write_corpus_data_file("V1AdvSimple", V1AdvSimple); + write_corpus_data_file("V0AdvEmpty", V0AdvEmpty); +}
diff --git a/nearby/presence/np_cpp_ffi/include/nearby_protocol.h b/nearby/presence/np_cpp_ffi/include/nearby_protocol.h new file mode 100644 index 0000000..e7e46e7 --- /dev/null +++ b/nearby/presence/np_cpp_ffi/include/nearby_protocol.h
@@ -0,0 +1,518 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef NEARBY_PRESENCE_NP_CPP_FFI_INCLUDE_NP_PROTOCOL_H_ +#define NEARBY_PRESENCE_NP_CPP_FFI_INCLUDE_NP_PROTOCOL_H_ + +#include "absl/status/statusor.h" +#include "absl/strings/str_format.h" +#include "np_cpp_ffi_types.h" + +// This namespace provides a C++ API surface to the Rust nearby protocol +// implementation. This is a wrapper over the np_ffi::internal namespace defined +// in the headers np_cpp_ffi_functions.h and np_cpp_ffi_types.h which are +// autogenerated by cbindgen based on the rust crate np_c_ffi. +// +// Classes in this namespace which have explicitly deleted copy-assignment and +// copy-constructor functions are backed by a C handle allocated in the +// underlying rust library. These handles are managed by the C++ classes which +// hold them and will be freed automatically when the corresponding type which +// currently owns the handle goes out of scope. +// +// A note on conventions in this API surface: +// +// Function prefixed with `Into` will transfer ownership of the current instance +// into a the newly returned object type, meaning that the previous instance is +// no longer valid. Attempting to use a type which has already been moved out of +// will result in the panic handler being invoked, which by default triggers +// std::abort(); +// +// Functions prefixed with `As` will not transfer ownership and instead return a +// casted version of the previous object. +// +// Functions prefixed with `Try` are fallible and will return an +// absl::StatusOr<T> result that needs to be checked before its used +// +// DO NOT DIRECTLY access the types defined in np_ffi::internal::*, these are +// auto-generated and are easy to mis-use. Instead use the public types exposed +// via the `nearby_protocol` namespace. +namespace nearby_protocol { + +// Re-exporting cbindgen generated types which are used in the public API +using np_ffi::internal::BooleanActionType; +using np_ffi::internal::CreateCredentialBookResultKind; +using np_ffi::internal::DeserializeAdvertisementResultKind; +using np_ffi::internal::DeserializedV0AdvertisementKind; +using np_ffi::internal::DeserializedV0IdentityKind; +using np_ffi::internal::DeserializedV1IdentityKind; +using np_ffi::internal::GetV0DEResultKind; +using np_ffi::internal::PanicReason; +using np_ffi::internal::TxPower; +using np_ffi::internal::V0DataElementKind; + +template <uintptr_t N> using FfiByteBuffer = np_ffi::internal::ByteBuffer<N>; + +// All of the types defined in this header +class RawAdvertisementPayload; +class CredentialBook; +class Deserializer; +class DeserializeAdvertisementResult; + +// V0 Classes +class DeserializedV0Advertisement; +class DeserializedV0Identity; +class LegibleDeserializedV0Advertisement; +class V0DataElement; +class V0Payload; +class V0Actions; + +// V1 Classes +class DeserializedV1Advertisement; +class DeserializedV1Section; +class V1DataElement; + +// Global static singleton class used to customize the deserialization library. +// If no values are set, then the default values will be used. In most cases the +// default max instance values won't need to be changed unless you are running +// in a constrained resources environment, and need to specify an upper limit +// on memory consumption. See np_ffi_global_config_* functions in +// np_cpp_ffi_functions.h for more info +class GlobalConfig { +public: + // This class provides the static methods needed for global configuration, + // so it does not need to be constructable, cloneable, or assignable. + GlobalConfig(GlobalConfig const &) = delete; + void operator=(GlobalConfig const &) = delete; + GlobalConfig() = delete; + + // Provides a user specified panic handler. This method will only have an + // effect on the global panic-handler the first time it's called, and this + // method will return `true` to indicate that the panic handler was + // successfully set. All subsequent calls to this method will simply ignore + // the argument and return `false`. see np_ffi_global_config_panic_handler in + // np_cpp_ffi_functions.h for more info + [[nodiscard]] static bool SetPanicHandler(void (*handler)(PanicReason)); + + // Sets an override to the number of shards employed in the libraries internal + // handle maps, used to set an upper limit on memory consumption, see + // np_ffi_global_config_set_num_shards in np_cpp_ffi_functions.h for more info + static void SetNumShards(uint8_t num_shards); + + // Sets the maximum number of active handles to credential books which may be + // active at any one time. See + // np_ffi_global_config_set_max_num_credential_books in np_cpp_ffi_functions.h + // for more info + static void SetMaxNumCredentialBooks(uint32_t max_num_credential_books); + + // Sets the maximum number of active handles to deserialized v0 advertisements + // which may be active at any one time. See + // np_ffi_global_config_set_max_num_deserialized_v0_advertisements for more + // info. + static void SetMaxNumDeserializedV0Advertisements( + uint32_t max_num_deserialized_v0_advertisements); + + // Sets the maximum number of active handles to deserialized v1 advertisements + // which may be active at any one time + static void SetMaxNumDeserializedV1Advertisements( + uint32_t max_num_deserialized_v1_advertisements); +}; + +// Holds the credentials used when decrypting data of an advertisement. +// This needs to be passed to Deserializer::DeserializeAdvertisement() when +// attempting to deserialize a payload +class CredentialBook { +public: + // Don't allow copy constructor or copy assignment, since that would result in + // the underlying handle being freed multiple times + CredentialBook(const CredentialBook &other) = delete; + CredentialBook &operator=(const CredentialBook &other) = delete; + + // Move constructor and move assignment are needed in order to wrap this class + // in absl::StatusOr + CredentialBook(CredentialBook &&other) noexcept; + CredentialBook &operator=(CredentialBook &&other) noexcept; + + // The destructor for a CredentialBook, this will be called when a + // CredentialBook instance goes out of scope and will free the underlying + // resources + ~CredentialBook(); + + // Creates a new instance of a CredentialBook, returns the CredentialBook on + // success or a Status code on failure + [[nodiscard]] static absl::StatusOr<CredentialBook> TryCreate(); + +private: + friend class Deserializer; + explicit CredentialBook(np_ffi::internal::CredentialBook credential_book) + : credential_book_(credential_book), moved_(false) {} + + np_ffi::internal::CredentialBook credential_book_; + bool moved_; +}; + +// Representation of a buffer of bytes returned from deserialization APIs +template <size_t N> class ByteBuffer { +public: + // Constructor for a fixed length buffer of bytes from its internal struct + // data representation consisting of a length and array of unint8_t bytes. + [[nodiscard]] explicit ByteBuffer(FfiByteBuffer<N> internal) + : internal_(internal) {} + + // Creates a ByteBuffer from a absl::string_view of bytes, returning an + // absl::OutOfRangeError in the case where bytes is too large to fit into the + // buffer. On success the returned type contains a copy of the provided bytes. + [[nodiscard]] static absl::StatusOr<ByteBuffer<N>> + CopyFrom(absl::string_view bytes) { + if (bytes.length() > N) { + return absl::OutOfRangeError( + absl::StrFormat("Provided bytes of length %d will not fit into a " + "ByteBuffer<N> of size N=%d", + bytes.length(), N)); + } + np_ffi::internal::ByteBuffer<N> internal = + np_ffi::internal::ByteBuffer<N>(); + internal.len = bytes.length(); + std::copy(std::begin(bytes), std::end(bytes), internal.bytes); + return ByteBuffer(internal); + } + + // Helper method to convert the ByteBuffer into a vector. The vector will + // contain a copy of the bytes and won't share the underlying buffer. + [[nodiscard]] std::vector<uint8_t> ToVector() { + std::vector<uint8_t> result(internal_.bytes, + internal_.bytes + internal_.len); + return result; + } + + // Helper method to convert the ByteBuffer into a std::string. The returned + // string will contain a copy of the bytes and won't share the underlying + // buffer. + [[nodiscard]] std::string ToString() { + std::string result; + result.assign(internal_.bytes, internal_.bytes + internal_.len); + return result; + } + +private: + friend class V1DataElement; + friend class Deserializer; + np_ffi::internal::ByteBuffer<N> internal_; +}; + +class RawAdvertisementPayload { +public: + // Creates a RawAdvertisementPayload from a ByteBuffer. + explicit RawAdvertisementPayload(ByteBuffer<255> bytes) : buffer_(bytes) {} + + ByteBuffer<255> buffer_; + +private: + friend class Deserializer; +}; + +// A global static Deserializer, configured by GlobalConfig and used to +// deserialize advertisement payloads +class Deserializer { +public: + // Attempts to deserialize an advertisement with the given service-data + // payload (presumed to be under the NP service UUID) using credentials pulled + // from the given credential-book. See np_ffi_deserialize_advertisement in + // np_cpp_ffi_functions.h for more info + [[nodiscard]] static DeserializeAdvertisementResult + DeserializeAdvertisement(RawAdvertisementPayload &payload, + const CredentialBook &credential_book); +}; + +// The result type returned from Deserializer::DeserializeAdvertisement(). Can +// be used to further process the advertisement and inspect its contents +class DeserializeAdvertisementResult { +public: + // Don't allow copy constructor or copy assignment, since that would result in + // the underlying handle being freed multiple times + DeserializeAdvertisementResult(const DeserializeAdvertisementResult &other) = + delete; + DeserializeAdvertisementResult & + operator=(const DeserializeAdvertisementResult &other) = delete; + + // Move constructor and move assignment operators + DeserializeAdvertisementResult( + DeserializeAdvertisementResult &&other) noexcept; + DeserializeAdvertisementResult & + operator=(DeserializeAdvertisementResult &&other) noexcept; + + // Frees the underlying resources of the result. + ~DeserializeAdvertisementResult(); + + // Returns the DeserializeAdvertisementResultKind of the Result + [[nodiscard]] DeserializeAdvertisementResultKind GetKind(); + + // Casts a `DeserializeAdvertisementResult` to the `V0` variant, panicking in + // the case where the passed value is of a different enum variant. This can + // only be called once. When called, this object is moved into the + // returned 'DeserializedV0Advertisement' and this object is no longer valid. + [[nodiscard]] DeserializedV0Advertisement IntoV0(); + + // Casts a `DeserializeAdvertisementResult` to the `V1` variant, panicking in + // the case where the passed value is of a different enum variant. This can + // only be called once. After this is cast into a `V1` variant this result + // is no longer valid. + [[nodiscard]] DeserializedV1Advertisement IntoV1(); + +private: + friend class Deserializer; + explicit DeserializeAdvertisementResult( + np_ffi::internal::DeserializeAdvertisementResult result) + : result_(result), moved_(false) {} + + np_ffi::internal::DeserializeAdvertisementResult result_; + bool moved_; +}; + +// A deserialized V0 advertisement payload +class DeserializedV0Advertisement { +public: + // Don't allow copy constructor or copy assignment, since that would result in + // the underlying handle being freed multiple times + DeserializedV0Advertisement(const DeserializedV0Advertisement &other) = + delete; + DeserializedV0Advertisement & + operator=(const DeserializedV0Advertisement &other) = delete; + + // Move constructor and move assignment operators + DeserializedV0Advertisement(DeserializedV0Advertisement &&other) noexcept; + DeserializedV0Advertisement & + operator=(DeserializedV0Advertisement &&other) noexcept; + + // The destructor which will be called when a DeserializedV0Advertisement + // instance goes out of scope, and will free the underlying resources + ~DeserializedV0Advertisement(); + + // Returns the DeserializedV0AdvertisementKind of the advertisement + [[nodiscard]] DeserializedV0AdvertisementKind GetKind(); + + // Casts a `DeserializedV0Advertisement` to the `Legible` variant, panicking + // in the case where the passed value is of a different enum variant. + // After calling this the object is moved into the returned + // `LegibleDeserializedV0Advertisement`, and this object is no longer valid. + [[nodiscard]] LegibleDeserializedV0Advertisement IntoLegible(); + +private: + friend class DeserializeAdvertisementResult; + explicit DeserializedV0Advertisement( + np_ffi::internal::DeserializedV0Advertisement v0_advertisement) + : v0_advertisement_(v0_advertisement), moved_(false) {} + + np_ffi::internal::DeserializedV0Advertisement v0_advertisement_; + bool moved_; +}; + +// A Legible deserialized V0 advertisement, which means the contents of it are +// either plaintext OR have already been decrypted successfully by a matching +// credential in the provided CredentialBook +class LegibleDeserializedV0Advertisement { +public: + // Don't allow copy constructor or copy assignment, since that would result in + // the underlying handle being freed multiple times + LegibleDeserializedV0Advertisement( + const LegibleDeserializedV0Advertisement &other) = delete; + LegibleDeserializedV0Advertisement & + operator=(const LegibleDeserializedV0Advertisement &other) = delete; + + // Move constructor and move assignment operators + LegibleDeserializedV0Advertisement( + LegibleDeserializedV0Advertisement &&other) noexcept; + LegibleDeserializedV0Advertisement & + operator=(LegibleDeserializedV0Advertisement &&other) noexcept; + + // The destructor which will be called when a this instance goes out of scope, + // and will free the underlying parent handle. + ~LegibleDeserializedV0Advertisement(); + + // Returns just the identity information associated with the advertisement + [[nodiscard]] DeserializedV0Identity GetIdentity(); + // Returns the number of data elements in the advertisement + [[nodiscard]] uint8_t GetNumberOfDataElements(); + // Returns just the data-element payload of the advertisement + [[nodiscard]] V0Payload IntoPayload(); + +private: + friend class DeserializedV0Advertisement; + explicit LegibleDeserializedV0Advertisement( + np_ffi::internal::LegibleDeserializedV0Advertisement + legible_v0_advertisement) + : legible_v0_advertisement_(legible_v0_advertisement), moved_(false) {} + + np_ffi::internal::LegibleDeserializedV0Advertisement + legible_v0_advertisement_; + bool moved_; +}; + +// A V0 identity of an advertisement +class DeserializedV0Identity { +public: + // Returns the DeserializedV0IdentityKind of the advertisement + [[nodiscard]] DeserializedV0IdentityKind GetKind(); + +private: + friend class LegibleDeserializedV0Advertisement; + explicit DeserializedV0Identity( + np_ffi::internal::DeserializedV0Identity v0_identity) + : v0_identity_(v0_identity) {} + np_ffi::internal::DeserializedV0Identity v0_identity_; +}; + +// A data element payload of a Deserialized V0 Advertisement. +class V0Payload { +public: + // Don't allow copy constructor or copy assignment, since that would result in + // the underlying parent handle being freed multiple times. + V0Payload(const V0Payload &other) = delete; + V0Payload &operator=(const V0Payload &other) = delete; + + // Move constructor and move assignment operators + V0Payload(V0Payload &&other) noexcept; + V0Payload &operator=(V0Payload &&other) noexcept; + + // Frees the underlying handle when this goes out of scope + ~V0Payload(); + + // Tries to retrieve the data element at the given index, returns the data + // element if it exists otherwise returns an Error status code + [[nodiscard]] absl::StatusOr<V0DataElement> TryGetDataElement(uint8_t index); + +private: + friend class LegibleDeserializedV0Advertisement; + explicit V0Payload(np_ffi::internal::V0Payload v0_payload) + : v0_payload_(v0_payload), moved_(false) {} + + np_ffi::internal::V0Payload v0_payload_; + bool moved_; +}; + +// A single deserialized V0 data element +class V0DataElement { +public: + // Yields the V0DataElementKind of the data element + [[nodiscard]] V0DataElementKind GetKind(); + // Casts the V0DataElement into the TxPower variant, panicking in the case + // where the data element is of a different enum variant + [[nodiscard]] TxPower AsTxPower(); + // Casts the V0DataElement into the Actions variant, panicking in the case + // where the data element is of a different enum variant + [[nodiscard]] V0Actions AsActions(); + +private: + friend class V0Payload; + explicit V0DataElement(np_ffi::internal::V0DataElement v0_data_element) + : v0_data_element_(v0_data_element) {} + np_ffi::internal::V0DataElement v0_data_element_; +}; + +// A V0 Actions Data Element +class V0Actions { +public: + // Gets the V0 Action bits as represented by a u32 where the last 8 bits are + // always 0 since V0 actions can only hold up to 24 bits. + [[nodiscard]] uint32_t GetAsU32(); + + /// Return whether a boolean action type is present in this data element + [[nodiscard]] bool HasAction(BooleanActionType action); + + /// Gets the 4 bit context sync sequence number as a uint8_t from this data + /// element + [[nodiscard]] uint8_t GetContextSyncSequenceNumber(); + +private: + friend class V0DataElement; + explicit V0Actions(np_ffi::internal::V0Actions actions) : actions_(actions) {} + np_ffi::internal::V0Actions actions_; +}; + +// A deserialized V1 Advertisement payload +class DeserializedV1Advertisement { +public: + // Don't allow copy constructor or copy assignment, since that would result in + // the underlying handle being freed multiple times + DeserializedV1Advertisement(const DeserializedV1Advertisement &other) = + delete; + DeserializedV1Advertisement & + operator=(const DeserializedV1Advertisement &other) = delete; + + // Move constructor and move assignment operators + DeserializedV1Advertisement(DeserializedV1Advertisement &&other) noexcept; + DeserializedV1Advertisement & + operator=(DeserializedV1Advertisement &&other) noexcept; + + // Gets the number of legible sections on a deserialized V1 advertisement. + // This is usable as an iteration bound for the section_index of TryGetSection + [[nodiscard]] uint8_t GetNumLegibleSections(); + // Gets the number of sections on a deserialized V1 advertisement which + // were unable to be decrypted with the credentials that the receiver + // possesses + [[nodiscard]] uint8_t GetNumUndecryptableSections(); + // Tries to get the section with the given index in a deserialized V1 + // advertisement. Returns a error code in the result of an invalid index + [[nodiscard]] absl::StatusOr<DeserializedV1Section> + TryGetSection(uint8_t section_index); + +private: + friend class DeserializeAdvertisementResult; + explicit DeserializedV1Advertisement( + np_ffi::internal::DeserializedV1Advertisement v1_advertisement); + + std::shared_ptr<np_ffi::internal::DeserializedV1Advertisement> + v1_advertisement_; +}; + +// A Deserialized V1 Section of an advertisement +class DeserializedV1Section { +public: + // Returns the number of data elements present in the section + [[nodiscard]] uint8_t NumberOfDataElements(); + // Returns the DeserializedV1IdentityKind of the identity + [[nodiscard]] DeserializedV1IdentityKind GetIdentityKind(); + // Tries to get the data element in the section at the given index + [[nodiscard]] absl::StatusOr<V1DataElement> TryGetDataElement(uint8_t index); + +private: + friend class DeserializedV1Advertisement; + explicit DeserializedV1Section( + np_ffi::internal::DeserializedV1Section section, + std::shared_ptr<np_ffi::internal::DeserializedV1Advertisement> + owning_v1_advertisement) + : section_(section), + owning_v1_advertisement_(std::move(owning_v1_advertisement)) {} + np_ffi::internal::DeserializedV1Section section_; + std::shared_ptr<np_ffi::internal::DeserializedV1Advertisement> + owning_v1_advertisement_; +}; + +// A V1 Data Element +class V1DataElement { +public: + // Yields the unsigned 32-bit integer V1 DE type code + [[nodiscard]] uint32_t GetDataElementTypeCode() const; + // Yields the payload bytes of the data element + [[nodiscard]] ByteBuffer<127> GetPayload() const; + +private: + friend class DeserializedV1Section; + explicit V1DataElement(np_ffi::internal::V1DataElement v1_data_element) + : v1_data_element_(v1_data_element) {} + np_ffi::internal::V1DataElement v1_data_element_; +}; + +} // namespace nearby_protocol + +#endif // NEARBY_PRESENCE_NP_CPP_FFI_INCLUDE_NP_PROTOCOL_H_
diff --git a/nearby/presence/np_cpp_ffi/nearby_protocol.cc b/nearby/presence/np_cpp_ffi/nearby_protocol.cc new file mode 100644 index 0000000..3ee5c63 --- /dev/null +++ b/nearby/presence/np_cpp_ffi/nearby_protocol.cc
@@ -0,0 +1,486 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "include/nearby_protocol.h" + +#include "np_cpp_ffi_functions.h" + +#ifdef __FILE_NAME__ +#define __ASSERT_FILE_NAME __FILE_NAME__ +#else /* __FILE_NAME__ */ +#define __ASSERT_FILE_NAME __FILE__ +#endif /* __FILE_NAME__ */ + +namespace nearby_protocol { + +static void panic_handler(PanicReason reason); + +struct PanicHandler { + void (*handler)(PanicReason); + bool set_by_client; +}; + +static PanicHandler gPanicHandler = PanicHandler{panic_handler, false}; + +// C++ layer internal panic handler +static void panic_handler(PanicReason reason) { + // Give clients a chance to use their own panic handler, but if they don't + // terminate the process we will make sure it happens. + if (gPanicHandler.set_by_client) { + gPanicHandler.handler(reason); + } + std::abort(); +} + +static void _assert_panic(bool condition, const char *func, const char *file, + int line) { + if (!condition) { + std::cout << "Assert failed: \n function: " << func << "\n file: " << file + << "\n line: " << line << "\n"; + panic_handler(PanicReason::AssertFailed); + } +} + +#define assert_panic(e) _assert_panic(e, __func__, __ASSERT_FILE_NAME, __LINE__) + +bool GlobalConfig::SetPanicHandler(void (*handler)(PanicReason)) { + if (!gPanicHandler.set_by_client) { + gPanicHandler.handler = handler; + gPanicHandler.set_by_client = true; + return np_ffi::internal::np_ffi_global_config_panic_handler(panic_handler); + } + return false; +} + +void GlobalConfig::SetNumShards(uint8_t num_shards) { + np_ffi::internal::np_ffi_global_config_set_num_shards(num_shards); +} + +void GlobalConfig::SetMaxNumCredentialBooks(uint32_t max_num_credential_books) { + np_ffi::internal::np_ffi_global_config_set_max_num_credential_books( + max_num_credential_books); +} + +void GlobalConfig::SetMaxNumDeserializedV0Advertisements( + uint32_t max_num_deserialized_v0_advertisements) { + np_ffi::internal:: + np_ffi_global_config_set_max_num_deserialized_v0_advertisements( + max_num_deserialized_v0_advertisements); +} + +void GlobalConfig::SetMaxNumDeserializedV1Advertisements( + uint32_t max_num_deserialized_v1_advertisements) { + np_ffi::internal:: + np_ffi_global_config_set_max_num_deserialized_v1_advertisements( + max_num_deserialized_v1_advertisements); +} + +absl::StatusOr<CredentialBook> CredentialBook::TryCreate() { + auto result = np_ffi::internal::np_ffi_create_credential_book(); + auto kind = np_ffi::internal::np_ffi_CreateCredentialBookResult_kind(result); + + switch (kind) { + case CreateCredentialBookResultKind::Success: { + auto book = CredentialBook( + np_ffi::internal::np_ffi_CreateCredentialBookResult_into_SUCCESS( + result)); + return book; + } + case CreateCredentialBookResultKind::NoSpaceLeft: { + return absl::ResourceExhaustedError( + "No space left to create credential book"); + } + } +} + +CredentialBook::~CredentialBook() { + if (!this->moved_) { + auto result = + np_ffi::internal::np_ffi_deallocate_credential_book(credential_book_); + assert_panic(result == np_ffi::internal::DeallocateResult::Success); + } +} + +CredentialBook::CredentialBook(CredentialBook &&other) noexcept + : credential_book_(other.credential_book_), moved_(other.moved_) { + other.credential_book_ = {}; + other.moved_ = true; +} + +CredentialBook &CredentialBook::operator=(CredentialBook &&other) noexcept { + if (this != &other) { + if (!this->moved_) { + auto result = np_ffi::internal::np_ffi_deallocate_credential_book( + this->credential_book_); + assert_panic(result == np_ffi::internal::DeallocateResult::Success); + } + + this->credential_book_ = other.credential_book_; + this->moved_ = other.moved_; + + other.credential_book_ = {}; + other.moved_ = true; + } + return *this; +} + +DeserializeAdvertisementResult +Deserializer::DeserializeAdvertisement(RawAdvertisementPayload &payload, + const CredentialBook &credential_book) { + assert_panic(!credential_book.moved_); + auto result = np_ffi::internal::np_ffi_deserialize_advertisement( + {payload.buffer_.internal_}, credential_book.credential_book_); + return DeserializeAdvertisementResult(result); +} + +DeserializeAdvertisementResultKind DeserializeAdvertisementResult::GetKind() { + assert_panic(!this->moved_); + return np_ffi::internal::np_ffi_DeserializeAdvertisementResult_kind(result_); +} + +DeserializedV0Advertisement DeserializeAdvertisementResult::IntoV0() { + assert_panic(!this->moved_); + auto result = + np_ffi::internal::np_ffi_DeserializeAdvertisementResult_into_V0(result_); + this->moved_ = true; + return DeserializedV0Advertisement(result); +} + +DeserializedV1Advertisement DeserializeAdvertisementResult::IntoV1() { + assert_panic(!this->moved_); + auto v1_adv = + np_ffi::internal::np_ffi_DeserializeAdvertisementResult_into_V1(result_); + this->moved_ = true; + return DeserializedV1Advertisement(v1_adv); +} + +DeserializeAdvertisementResult::~DeserializeAdvertisementResult() { + if (!this->moved_) { + auto result = + np_ffi::internal::np_ffi_deallocate_deserialize_advertisement_result( + result_); + assert_panic(result == np_ffi::internal::DeallocateResult::Success); + } +} + +DeserializeAdvertisementResult::DeserializeAdvertisementResult( + DeserializeAdvertisementResult &&other) noexcept + : result_(other.result_), moved_(other.moved_) { + other.result_ = {}; + other.moved_ = true; +} + +DeserializeAdvertisementResult &DeserializeAdvertisementResult::operator=( + DeserializeAdvertisementResult &&other) noexcept { + if (this != &other) { + if (!this->moved_) { + auto result = + np_ffi::internal::np_ffi_deallocate_deserialize_advertisement_result( + result_); + assert_panic(result == np_ffi::internal::DeallocateResult::Success); + } + this->result_ = other.result_; + this->moved_ = other.moved_; + + other.result_ = {}; + other.moved_ = true; + } + return *this; +} + +// V0 Stuff +DeserializedV0Advertisement::DeserializedV0Advertisement( + DeserializedV0Advertisement &&other) noexcept + : v0_advertisement_(other.v0_advertisement_), moved_(other.moved_) { + other.v0_advertisement_ = {}; + other.moved_ = true; +} + +DeserializedV0Advertisement &DeserializedV0Advertisement::operator=( + DeserializedV0Advertisement &&other) noexcept { + if (this != &other) { + if (!this->moved_) { + auto result = + np_ffi::internal::np_ffi_deallocate_deserialized_V0_advertisement( + v0_advertisement_); + assert_panic(result == np_ffi::internal::DeallocateResult::Success); + } + this->v0_advertisement_ = other.v0_advertisement_; + this->moved_ = other.moved_; + + other.v0_advertisement_ = {}; + other.moved_ = true; + } + return *this; +} + +DeserializedV0Advertisement::~DeserializedV0Advertisement() { + if (!this->moved_) { + auto result = + np_ffi::internal::np_ffi_deallocate_deserialized_V0_advertisement( + v0_advertisement_); + assert_panic(result == np_ffi::internal::DeallocateResult::Success); + } +} + +np_ffi::internal::DeserializedV0AdvertisementKind +DeserializedV0Advertisement::GetKind() { + assert_panic(!this->moved_); + return np_ffi::internal::np_ffi_DeserializedV0Advertisement_kind( + v0_advertisement_); +} + +LegibleDeserializedV0Advertisement DeserializedV0Advertisement::IntoLegible() { + assert_panic(!this->moved_); + auto result = + np_ffi::internal::np_ffi_DeserializedV0Advertisement_into_LEGIBLE( + v0_advertisement_); + this->moved_ = true; + this->v0_advertisement_ = {}; + return LegibleDeserializedV0Advertisement(result); +} + +LegibleDeserializedV0Advertisement::LegibleDeserializedV0Advertisement( + LegibleDeserializedV0Advertisement &&other) noexcept + : legible_v0_advertisement_(other.legible_v0_advertisement_), + moved_(other.moved_) { + other.moved_ = true; + other.legible_v0_advertisement_ = {}; +} + +LegibleDeserializedV0Advertisement & +LegibleDeserializedV0Advertisement::operator=( + LegibleDeserializedV0Advertisement &&other) noexcept { + if (this != &other) { + if (!this->moved_) { + auto result = + np_ffi::internal::np_ffi_deallocate_legible_v0_advertisement( + this->legible_v0_advertisement_); + assert_panic(result == np_ffi::internal::DeallocateResult::Success); + } + this->legible_v0_advertisement_ = other.legible_v0_advertisement_; + this->moved_ = other.moved_; + + other.moved_ = true; + other.legible_v0_advertisement_ = {}; + } + return *this; +} + +LegibleDeserializedV0Advertisement::~LegibleDeserializedV0Advertisement() { + if (!this->moved_) { + auto result = np_ffi::internal::np_ffi_deallocate_legible_v0_advertisement( + this->legible_v0_advertisement_); + assert_panic(result == np_ffi::internal::DeallocateResult::Success); + } +} + +DeserializedV0Identity LegibleDeserializedV0Advertisement::GetIdentity() { + assert_panic(!this->moved_); + auto result = + np_ffi::internal::np_ffi_LegibleDeserializedV0Advertisement_into_identity( + legible_v0_advertisement_); + return DeserializedV0Identity(result); +} + +uint8_t LegibleDeserializedV0Advertisement::GetNumberOfDataElements() { + assert_panic(!this->moved_); + return np_ffi::internal:: + np_ffi_LegibleDeserializedV0Advertisement_get_num_des( + legible_v0_advertisement_); +} + +V0Payload LegibleDeserializedV0Advertisement::IntoPayload() { + assert_panic(!this->moved_); + auto result = np_ffi_LegibleDeserializedV0Advertisement_into_payload( + legible_v0_advertisement_); + this->moved_ = true; + return V0Payload(result); +} + +np_ffi::internal::DeserializedV0IdentityKind DeserializedV0Identity::GetKind() { + return np_ffi::internal::np_ffi_DeserializedV0Identity_kind(v0_identity_); +} + +V0Payload::V0Payload(V0Payload &&other) noexcept + : v0_payload_(other.v0_payload_), moved_(other.moved_) { + other.v0_payload_ = {}; + other.moved_ = true; +} + +V0Payload &V0Payload::operator=(V0Payload &&other) noexcept { + if (this != &other) { + if (!this->moved_) { + auto result = + np_ffi::internal::np_ffi_deallocate_v0_payload(this->v0_payload_); + assert_panic(result == np_ffi::internal::DeallocateResult::Success); + } + this->v0_payload_ = other.v0_payload_; + this->moved_ = other.moved_; + + other.moved_ = true; + other.v0_payload_ = {}; + } + return *this; +} + +V0Payload::~V0Payload() { + if (!this->moved_) { + auto result = + np_ffi::internal::np_ffi_deallocate_v0_payload(this->v0_payload_); + assert_panic(result == np_ffi::internal::DeallocateResult::Success); + } +} + +absl::StatusOr<V0DataElement> V0Payload::TryGetDataElement(uint8_t index) { + assert_panic(!this->moved_); + auto result = np_ffi::internal::np_ffi_V0Payload_get_de(v0_payload_, index); + auto kind = np_ffi::internal::np_ffi_GetV0DEResult_kind(result); + switch (kind) { + case GetV0DEResultKind::Success: { + auto de = np_ffi_GetV0DEResult_into_SUCCESS(result); + return V0DataElement(de); + } + case GetV0DEResultKind::Error: { + return absl::OutOfRangeError("Invalid Data Element index"); + } + } +} + +V0DataElementKind V0DataElement::GetKind() { + return np_ffi::internal::np_ffi_V0DataElement_kind(v0_data_element_); +} + +TxPower V0DataElement::AsTxPower() { + return np_ffi::internal::np_ffi_V0DataElement_into_TX_POWER(v0_data_element_); +} + +V0Actions V0DataElement::AsActions() { + auto internal = + np_ffi::internal::np_ffi_V0DataElement_into_ACTIONS(v0_data_element_); + return V0Actions(internal); +} + +uint32_t V0Actions::GetAsU32() { + return np_ffi::internal::np_ffi_V0Actions_as_u32(actions_); +} + +bool V0Actions::HasAction(BooleanActionType action) { + return np_ffi::internal::np_ffi_V0Actions_has_action(actions_, action); +} + +uint8_t V0Actions::GetContextSyncSequenceNumber() { + return np_ffi::internal::np_ffi_V0Actions_get_context_sync_sequence_number( + actions_); +} + +// This is called after all references to the shared_ptr have gone out of scope +auto DeallocateV1Adv( + np_ffi::internal::DeserializedV1Advertisement *v1_advertisement) { + auto result = + np_ffi::internal::np_ffi_deallocate_deserialized_V1_advertisement( + *v1_advertisement); + assert_panic(result == np_ffi::internal::DeallocateResult::Success); + delete v1_advertisement; +} + +DeserializedV1Advertisement::DeserializedV1Advertisement( + np_ffi::internal::DeserializedV1Advertisement v1_advertisement) { + v1_advertisement_ = + std::shared_ptr<np_ffi::internal::DeserializedV1Advertisement>( + new np_ffi::internal::DeserializedV1Advertisement(v1_advertisement), + DeallocateV1Adv); +} + +DeserializedV1Advertisement::DeserializedV1Advertisement( + DeserializedV1Advertisement &&other) noexcept + : v1_advertisement_(std::move(other.v1_advertisement_)) {} + +DeserializedV1Advertisement &DeserializedV1Advertisement::operator=( + DeserializedV1Advertisement &&other) noexcept { + if (this != &other) { + this->v1_advertisement_ = std::move(other.v1_advertisement_); + } + return *this; +} + +// V1 Stuff +uint8_t DeserializedV1Advertisement::GetNumLegibleSections() { + assert_panic(this->v1_advertisement_ != nullptr); + return np_ffi::internal:: + np_ffi_DeserializedV1Advertisement_get_num_legible_sections( + *v1_advertisement_); +} + +uint8_t DeserializedV1Advertisement::GetNumUndecryptableSections() { + assert_panic(this->v1_advertisement_ != nullptr); + return np_ffi::internal:: + np_ffi_DeserializedV1Advertisement_get_num_undecryptable_sections( + *v1_advertisement_); +} + +absl::StatusOr<DeserializedV1Section> +DeserializedV1Advertisement::TryGetSection(uint8_t section_index) { + assert_panic(this->v1_advertisement_ != nullptr); + auto result = + np_ffi::internal::np_ffi_DeserializedV1Advertisement_get_section( + *v1_advertisement_, section_index); + auto kind = np_ffi::internal::np_ffi_GetV1SectionResult_kind(result); + switch (kind) { + case np_ffi::internal::GetV1SectionResultKind::Error: { + return absl::OutOfRangeError("Invalid section index"); + } + case np_ffi::internal::GetV1SectionResultKind::Success: { + auto section = + np_ffi::internal::np_ffi_GetV1SectionResult_into_SUCCESS(result); + return DeserializedV1Section(section, v1_advertisement_); + } + } +} + +uint8_t DeserializedV1Section::NumberOfDataElements() { + return np_ffi::internal::np_ffi_DeserializedV1Section_get_num_des(section_); +} + +DeserializedV1IdentityKind DeserializedV1Section::GetIdentityKind() { + return np_ffi::internal::np_ffi_DeserializedV1Section_get_identity_kind( + section_); +} + +absl::StatusOr<V1DataElement> +DeserializedV1Section::TryGetDataElement(uint8_t index) { + auto result = + np_ffi::internal::np_ffi_DeserializedV1Section_get_de(section_, index); + auto kind = np_ffi::internal::np_ffi_GetV1DEResult_kind(result); + switch (kind) { + case np_ffi::internal::GetV1DEResultKind::Error: { + return absl::OutOfRangeError("Invalid data element index for this section"); + } + case np_ffi::internal::GetV1DEResultKind::Success: { + return V1DataElement( + np_ffi::internal::np_ffi_GetV1DEResult_into_SUCCESS(result)); + } + } +} + +uint32_t V1DataElement::GetDataElementTypeCode() const { + return np_ffi::internal::np_ffi_V1DEType_to_uint32_t( + v1_data_element_.generic._0.de_type); +} + +ByteBuffer<127> V1DataElement::GetPayload() const { + return ByteBuffer(v1_data_element_.generic._0.payload); +} + +} // namespace nearby_protocol
diff --git a/nearby/presence/np_cpp_ffi/sample/CMakeLists.txt b/nearby/presence/np_cpp_ffi/sample/CMakeLists.txt new file mode 100644 index 0000000..da33258 --- /dev/null +++ b/nearby/presence/np_cpp_ffi/sample/CMakeLists.txt
@@ -0,0 +1,29 @@ +# Copyright 2023 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +add_executable(np_cpp_sample main.cpp) + +target_link_libraries(np_cpp_sample nearby_protocol) + +if (UNIX) + target_link_libraries( + np_cpp_sample + dl -fsanitize=address + ) +elseif (MSVC) + target_link_libraries( + np_cpp_sample + bcrypt ntdll userenv ws2_32 + ) +endif ()
diff --git a/nearby/presence/np_cpp_ffi/sample/main.cpp b/nearby/presence/np_cpp_ffi/sample/main.cpp new file mode 100644 index 0000000..114ed64 --- /dev/null +++ b/nearby/presence/np_cpp_ffi/sample/main.cpp
@@ -0,0 +1,272 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "nearby_protocol.h" + +#include <bitset> +#include <iostream> + +#include "absl/strings/escaping.h" + +static void SamplePanicHandler(nearby_protocol::PanicReason reason); + +void HandleAdvertisementResult(nearby_protocol::DeserializeAdvertisementResult); + +void HandleV0Adv(nearby_protocol::DeserializedV0Advertisement); +void HandleLegibleV0Adv(nearby_protocol::LegibleDeserializedV0Advertisement); +void HandleV0Identity(nearby_protocol::DeserializedV0Identity); +void HandleDataElement(nearby_protocol::V0DataElement); + +void HandleV1Adv(nearby_protocol::DeserializedV1Advertisement); +void HandleV1Section(nearby_protocol::DeserializedV1Section); +void HandleV1DataElement(nearby_protocol::V1DataElement); + +int main() { + auto result = + nearby_protocol::GlobalConfig::SetPanicHandler(SamplePanicHandler); + if (result) { + std::cout << "Successfully registered panic handler\n"; + } else { + std::cout << "Failed register panic handler\n"; + return -1; + } + nearby_protocol::GlobalConfig::SetNumShards(4); + + std::cout << "\n========= Example V0 Adv ==========\n"; + std::cout << "Hex bytes: 00031503260046\n\n"; + + // Create an empty credential book and verify that is is successful + auto cred_book_result = nearby_protocol::CredentialBook::TryCreate(); + if (!cred_book_result.ok()) { + std::cout << cred_book_result.status().ToString(); + return -1; + } + + auto v0_byte_string = "00" // Adv Header + "03" // Public DE header + "1503" // Length 1 Tx Power DE with value 3 + "260046"; // Length 2 Actions + + auto v0_bytes = absl::HexStringToBytes(v0_byte_string); + auto v0_buffer = nearby_protocol::ByteBuffer<255>::CopyFrom(v0_bytes); + nearby_protocol::RawAdvertisementPayload v0_payload(v0_buffer.value()); + + // Try to deserialize a V0 payload + auto deserialize_v0_result = + nearby_protocol::Deserializer::DeserializeAdvertisement( + v0_payload, cred_book_result.value()); + HandleAdvertisementResult(std::move(deserialize_v0_result)); + + std::cout << "\n========= Example V1 Adv ==========\n"; + std::cout << "Hex bytes: 20040326004603031505\n\n"; + + auto v1_byte_string = "20" // V1 Advertisement header + "04" // Section Header + "03" // Public Identity DE header + "260046" // Length 2 Actions DE + "03" // Section Header + "03" // Public Identity DE header + "1505"; // Length 1 Tx Power DE with value 5 + auto v1_bytes = absl::HexStringToBytes(v1_byte_string); + auto v1_buffer = nearby_protocol::ByteBuffer<255>::CopyFrom(v1_bytes); + nearby_protocol::RawAdvertisementPayload v1_payload(v1_buffer.value()); + + // Try to deserialize a V1 payload + auto deserialize_v1_result = + nearby_protocol::Deserializer::DeserializeAdvertisement( + v1_payload, cred_book_result.value()); + HandleAdvertisementResult(std::move(deserialize_v1_result)); + + std::cout << "\n========= User input sample ==========\n\n"; + while (true) { + std::string user_input; + std::cout << "Enter the hex of the advertisement you would like to parse " + "(see above examples): "; + std::cin >> user_input; + auto bytes = absl::HexStringToBytes(user_input); + auto buffer = nearby_protocol::ByteBuffer<255>::CopyFrom(bytes); + if (!buffer.ok()) { + std::cout << "Too many bytes provided, must fit into a max length 255 " + "byte BLE advertisement\n"; + continue; + } + nearby_protocol::RawAdvertisementPayload user_input_payload(buffer.value()); + + // Try to deserialize user input + auto user_input_result = + nearby_protocol::Deserializer::DeserializeAdvertisement( + user_input_payload, cred_book_result.value()); + HandleAdvertisementResult(std::move(user_input_result)); + + char choice; + do { + std::cout << "Do you want to continue? (Y/N) "; + std::cin >> choice; + } while (choice != 'Y' && choice != 'N' && choice != 'n' && choice != 'y'); + + if (choice == 'N' || choice == 'n') { + return 0; + } + } +} + +static void SamplePanicHandler(nearby_protocol::PanicReason reason) { + std::cout << "Panicking! Reason: "; + switch (reason) { + case nearby_protocol::PanicReason::EnumCastFailed: { + std::cout << "EnumCastFailed \n"; + break; + } + case nearby_protocol::PanicReason::AssertFailed: { + std::cout << "AssertFailed \n"; + break; + } + case np_ffi::internal::PanicReason::InvalidActionBits: { + std::cout << "InvalidActionBits \n"; + break; + } + } + std::abort(); +} + +void HandleAdvertisementResult( + nearby_protocol::DeserializeAdvertisementResult result) { + switch (result.GetKind()) { + case nearby_protocol::DeserializeAdvertisementResultKind::Error: + std::cout << "Error in deserializing advertisement!\n"; + break; + case nearby_protocol::DeserializeAdvertisementResultKind::V0: + std::cout << "Successfully deserialized a V0 advertisement!\n"; + HandleV0Adv(result.IntoV0()); + break; + case nearby_protocol::DeserializeAdvertisementResultKind::V1: + std::cout << "Successfully deserialized a V1 advertisement\n"; + HandleV1Adv(result.IntoV1()); + break; + } +} + +void HandleV0Adv(nearby_protocol::DeserializedV0Advertisement result) { + switch (result.GetKind()) { + case nearby_protocol::DeserializedV0AdvertisementKind::Legible: + std::cout << "\tThe Advertisement is plaintext \n"; + HandleLegibleV0Adv(result.IntoLegible()); + break; + case nearby_protocol::DeserializedV0AdvertisementKind::NoMatchingCredentials: + std::cout << "\tNo matching credentials found for this adv\n"; + return; + } +} + +void HandleLegibleV0Adv( + nearby_protocol::LegibleDeserializedV0Advertisement legible_adv) { + HandleV0Identity(legible_adv.GetIdentity()); + + auto num_des = legible_adv.GetNumberOfDataElements(); + std::cout << "\t\tAdv contains " << unsigned(num_des) << " data elements \n"; + auto payload = legible_adv.IntoPayload(); + for (int i = 0; i < num_des; i++) { + auto de_result = payload.TryGetDataElement(i); + if (!de_result.ok()) { + std::cout << "\t\tError getting DE at index: " << i << "\n"; + return; + } + std::cout << "\t\tSuccessfully retrieved De at index " << i << "\n"; + HandleDataElement(de_result.value()); + } +} + +void HandleV0Identity(nearby_protocol::DeserializedV0Identity identity) { + switch (identity.GetKind()) { + case np_ffi::internal::DeserializedV0IdentityKind::Plaintext: { + std::cout << "\t\tIdentity is Plaintext\n"; + break; + } + case np_ffi::internal::DeserializedV0IdentityKind::Decrypted: { + std::cout << "\t\tIdentity is Encrypted\n"; + break; + } + } +} + +void HandleDataElement(nearby_protocol::V0DataElement de) { + switch (de.GetKind()) { + case nearby_protocol::V0DataElementKind::TxPower: { + std::cout << "\t\t\tDE Type is TxPower\n"; + auto tx_power = de.AsTxPower(); + std::cout << "\t\t\tpower: " << int(tx_power.tx_power) << "\n"; + return; + } + case nearby_protocol::V0DataElementKind::Actions: { + std::cout << "\t\t\tDE Type is Actions\n"; + auto actions = de.AsActions(); + std::cout << "\t\t\tactions: " << std::bitset<32>(actions.GetAsU32()) + << "\n"; + return; + } + } +} + +void HandleV1Adv(nearby_protocol::DeserializedV1Advertisement adv) { + auto legible_sections = adv.GetNumLegibleSections(); + std::cout << "\tAdv has " << unsigned(legible_sections) + << " legible sections \n"; + + auto encrypted_sections = adv.GetNumUndecryptableSections(); + std::cout << "\tAdv has " << unsigned(encrypted_sections) + << " undecryptable sections\n"; + + for (auto i = 0; i < legible_sections; i++) { + auto section_result = adv.TryGetSection(i); + if (!section_result.ok()) { + std::cout << "\tError getting Section at index: " << i << "\n"; + return; + } + std::cout << "\tSuccessfully retrieved section at index " << i << "\n"; + HandleV1Section(section_result.value()); + } +} + +void HandleV1Section(nearby_protocol::DeserializedV1Section section) { + switch (section.GetIdentityKind()) { + case np_ffi::internal::DeserializedV1IdentityKind::Plaintext: { + std::cout << "\t\tIdentity is Plaintext\n"; + break; + } + case np_ffi::internal::DeserializedV1IdentityKind::Decrypted: { + std::cout << "\t\tIdentity is Encrypted\n"; + break; + } + } + + auto num_des = section.NumberOfDataElements(); + std::cout << "\t\tSection has " << unsigned(num_des) << " data elements \n"; + for (auto i = 0; i < num_des; i++) { + auto de_result = section.TryGetDataElement(i); + if (!de_result.ok()) { + std::cout << "\t\tError getting de at index: " << i << "\n"; + return; + } + std::cout << "\t\tSuccessfully retrieved data element at index " << i + << "\n"; + HandleV1DataElement(de_result.value()); + } +} + +void HandleV1DataElement(nearby_protocol::V1DataElement de) { + std::cout << "\t\t\tData Element type code: " + << unsigned(de.GetDataElementTypeCode()) << "\n"; + std::cout << "\t\t\tPayload bytes as hex: " + << absl::BytesToHexString(de.GetPayload().ToString()) << "\n"; +}
diff --git a/nearby/presence/np_cpp_ffi/shared/shared_test_util.cc b/nearby/presence/np_cpp_ffi/shared/shared_test_util.cc new file mode 100644 index 0000000..27e98a6 --- /dev/null +++ b/nearby/presence/np_cpp_ffi/shared/shared_test_util.cc
@@ -0,0 +1,50 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "nearby_protocol.h" + +std::string PanicReasonToString(nearby_protocol::PanicReason reason) { + switch (reason) { + case nearby_protocol::PanicReason::EnumCastFailed: { + return "EnumCastFailed"; + } + case nearby_protocol::PanicReason::AssertFailed: { + return "AssertFailed"; + } + case np_ffi::internal::PanicReason::InvalidActionBits: { + return "InvalidActionBits"; + } + } +} + +void test_panic_handler(nearby_protocol::PanicReason reason) { + std::cout << "Panicking! Reason: " << PanicReasonToString(reason); + std::abort(); +} + +std::string generate_hex_string(const size_t length) { + char *str = new char[length]; + + // hexadecimal characters + char hex_characters[] = {'0', '1', '2', '3', '4', '5', '6', '7', + '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'}; + size_t i; + for (i = 0; i < length; i++) { + str[i] = hex_characters[rand() % 16]; // NOLINT(cert-msc50-cpp) + } + str[length] = 0; + std::string result(str, length); + delete[] str; + return result; +} \ No newline at end of file
diff --git a/nearby/presence/np_cpp_ffi/shared/shared_test_util.h b/nearby/presence/np_cpp_ffi/shared/shared_test_util.h new file mode 100644 index 0000000..52c5363 --- /dev/null +++ b/nearby/presence/np_cpp_ffi/shared/shared_test_util.h
@@ -0,0 +1,58 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef NEARBY_PRESENCE_NP_CPP_FFI_TESTS_SHARED_TEST_UTILS_H_ +#define NEARBY_PRESENCE_NP_CPP_FFI_TESTS_SHARED_TEST_UTILS_H_ + +#include "nearby_protocol.h" + +inline nearby_protocol::RawAdvertisementPayload + V0AdvEmpty(nearby_protocol::ByteBuffer<255>({1, {0x00}})); + +inline nearby_protocol::RawAdvertisementPayload + V0AdvSimple(nearby_protocol::ByteBuffer<255>({ + 4, + {0x00, // Adv Header + 0x03, // Public DE header + 0x15, 0x03} // Length 1 Tx Power DE with value 3 + })); + +inline nearby_protocol::RawAdvertisementPayload + V1AdvSimple(nearby_protocol::ByteBuffer<255>( + {5, + { + 0x20, // V1 Advertisement header + 0x03, // Section Header + 0x03, // Public Identity DE header + 0x15, 0x03 // Length 1 Tx Power DE with value 3 + }})); + +inline nearby_protocol::RawAdvertisementPayload + V1AdvMultipleSections(nearby_protocol::ByteBuffer<255>( + {10, + { + 0x20, // V1 Advertisement header + 0x04, // Section Header + 0x03, // Public Identity DE header + 0x26, 0x00, 0x46, // Length 2 Actions DE + 0x03, // Section Header + 0x03, // Public Identity DE header + 0x15, 0x03 // Length 1 Tx Power DE with value 3 + }})); + +void test_panic_handler(nearby_protocol::PanicReason reason); + +std::string generate_hex_string(size_t length); + +#endif // NEARBY_PRESENCE_NP_CPP_FFI_TESTS_SHARED_TEST_UTILS_H_
diff --git a/nearby/presence/np_cpp_ffi/tests/CMakeLists.txt b/nearby/presence/np_cpp_ffi/tests/CMakeLists.txt new file mode 100644 index 0000000..bddda64 --- /dev/null +++ b/nearby/presence/np_cpp_ffi/tests/CMakeLists.txt
@@ -0,0 +1,44 @@ +# Copyright 2023 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +add_executable( + np_ffi_tests + deserialize_result_tests.cc + deserialize_v0_tests.cc + deserialize_v1_tests.cc + global_config_tests.cc + credential_book_tests.cc + byte_buffer_tests.cc +) + +target_link_libraries( + np_ffi_tests + nearby_protocol + shared_test_util + GTest::gtest_main +) + +if (UNIX) + target_link_libraries( + np_ffi_tests + dl -fsanitize=address + ) +elseif (MSVC) + target_link_libraries( + np_ffi_tests + bcrypt ntdll userenv ws2_32 + ) +endif () + +gtest_discover_tests(np_ffi_tests)
diff --git a/nearby/presence/np_cpp_ffi/tests/byte_buffer_tests.cc b/nearby/presence/np_cpp_ffi/tests/byte_buffer_tests.cc new file mode 100644 index 0000000..4bca8ec --- /dev/null +++ b/nearby/presence/np_cpp_ffi/tests/byte_buffer_tests.cc
@@ -0,0 +1,84 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on a "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "nearby_protocol.h" +#include "shared_test_util.h" + +#include "absl/strings/escaping.h" +#include "gtest/gtest.h" + +TEST(ByteBufferTests, ByteBufferMaxLength) { + // Each hex byte takes up 2 characters so length 510 string = 255 bytes of hex + auto str_bytes = generate_hex_string(510); + auto bytes = absl::HexStringToBytes(str_bytes); + auto buffer = nearby_protocol::ByteBuffer<255>::CopyFrom(bytes); + ASSERT_TRUE(buffer.ok()); + auto string = buffer.value().ToString(); + ASSERT_EQ(bytes, string); +} + +TEST(ByteBufferTooLarge, ByteBufferInvalidLength) { + // 256 bytes should fail + auto str_bytes = generate_hex_string(512); + auto bytes = absl::HexStringToBytes(str_bytes); + auto buffer = nearby_protocol::ByteBuffer<255>::CopyFrom(bytes); + ASSERT_FALSE(buffer.ok()); +} + +TEST(ByteBufferTests, ByteBufferRoundTrip) { + auto bytes = absl::HexStringToBytes("2003031503"); + auto buffer = nearby_protocol::ByteBuffer<255>::CopyFrom(bytes); + auto string = buffer.value().ToString(); + ASSERT_EQ(bytes, string); +} + +TEST(ByteBufferTests, ByteBufferPayloadWrongSize) { + auto bytes = absl::HexStringToBytes("1111111111111111111111"); + auto buffer = nearby_protocol::ByteBuffer<10>::CopyFrom(bytes); + ASSERT_FALSE(buffer.ok()); +} + +TEST(ByteBufferTests, ByteBufferEmptyString) { + auto bytes = absl::HexStringToBytes(""); + auto buffer = nearby_protocol::ByteBuffer<10>::CopyFrom(bytes); + ASSERT_TRUE(buffer.ok()); +} + +TEST(ByteBufferTests, ByteBufferToVector) { + auto bytes = absl::HexStringToBytes("1234567890"); + auto buffer = nearby_protocol::ByteBuffer<100>::CopyFrom(bytes); + auto vec = buffer.value().ToVector(); + std::vector<uint8_t> expected{0x12, 0x34, 0x56, 0x78, 0x90}; + ASSERT_EQ(vec, expected); +} + +TEST(ByteBufferTests, ByteBufferEndToEndPayloadAsString) { + std::string bytes = absl::HexStringToBytes("2003031503"); + auto buffer = nearby_protocol::ByteBuffer<255>::CopyFrom(bytes); + ASSERT_TRUE(buffer.ok()); + + nearby_protocol::RawAdvertisementPayload adv(buffer.value()); + + auto credential_book = nearby_protocol::CredentialBook::TryCreate(); + auto str = nearby_protocol::Deserializer::DeserializeAdvertisement( + adv, credential_book.value()) + .IntoV1() + .TryGetSection(0) + .value() + .TryGetDataElement(0) + .value() + .GetPayload() + .ToString(); + ASSERT_EQ(str, absl::HexStringToBytes("03")); +}
diff --git a/nearby/presence/np_cpp_ffi/tests/credential_book_tests.cc b/nearby/presence/np_cpp_ffi/tests/credential_book_tests.cc new file mode 100644 index 0000000..5eb9ce2 --- /dev/null +++ b/nearby/presence/np_cpp_ffi/tests/credential_book_tests.cc
@@ -0,0 +1,80 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "nearby_protocol.h" +#include "shared_test_util.h" + +#include "gtest/gtest.h" + +TEST(NpFfiCredentialBookTests, TestMoveConstructor) { + auto book = nearby_protocol::CredentialBook::TryCreate().value(); + auto deserialize_result = + nearby_protocol::Deserializer::DeserializeAdvertisement(V0AdvEmpty, book); + ASSERT_EQ(deserialize_result.GetKind(), + np_ffi::internal::DeserializeAdvertisementResultKind::V0); + + // Move the credential book into a new object. Using the new object should + // still result in success + nearby_protocol::CredentialBook next_book(std::move(book)); + auto deserialize_result_moved = + nearby_protocol::Deserializer::DeserializeAdvertisement(V0AdvEmpty, + next_book); + ASSERT_EQ(deserialize_result_moved.GetKind(), + np_ffi::internal::DeserializeAdvertisementResultKind::V0); + + // The old object should now lead to use after moved assert failure + ASSERT_DEATH([[maybe_unused]] auto failure = + nearby_protocol::Deserializer::DeserializeAdvertisement( + V0AdvEmpty, book), // NOLINT(bugprone-use-after-move) + ""); + + // moving again should still lead to a use after moved assert failure + nearby_protocol::CredentialBook another_moved_book(std::move(book)); + ASSERT_DEATH([[maybe_unused]] auto failure = + nearby_protocol::Deserializer::DeserializeAdvertisement( + V0AdvEmpty, another_moved_book), + ""); +} + +TEST(NpFfiCredentialBookTests, TestMoveAssignment) { + auto book = nearby_protocol::CredentialBook::TryCreate().value(); + auto deserialize_result = + nearby_protocol::Deserializer::DeserializeAdvertisement(V0AdvEmpty, book); + ASSERT_EQ(deserialize_result.GetKind(), + np_ffi::internal::DeserializeAdvertisementResultKind::V0); + + // create a second empty credential book + auto other_book = nearby_protocol::CredentialBook::TryCreate().value(); + other_book = std::move(book); + + // new credential book should still be successful + auto deserialize_result_other = + nearby_protocol::Deserializer::DeserializeAdvertisement(V0AdvEmpty, + other_book); + ASSERT_EQ(deserialize_result_other.GetKind(), + np_ffi::internal::DeserializeAdvertisementResultKind::V0); + + // The old object should now lead to use after moved assert failure + ASSERT_DEATH([[maybe_unused]] auto failure = + nearby_protocol::Deserializer::DeserializeAdvertisement( + V0AdvEmpty, book), // NOLINT(bugprone-use-after-move) + ""); + + // moving again should still lead to a use after moved assert failure + auto another_moved_book = std::move(book); + ASSERT_DEATH([[maybe_unused]] auto failure = + nearby_protocol::Deserializer::DeserializeAdvertisement( + V0AdvEmpty, another_moved_book), + ""); +} \ No newline at end of file
diff --git a/nearby/presence/np_cpp_ffi/tests/deserialize_result_tests.cc b/nearby/presence/np_cpp_ffi/tests/deserialize_result_tests.cc new file mode 100644 index 0000000..e3a44d5 --- /dev/null +++ b/nearby/presence/np_cpp_ffi/tests/deserialize_result_tests.cc
@@ -0,0 +1,286 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "nearby_protocol.h" +#include "shared_test_util.h" + +#include "absl/strings/escaping.h" +#include "gtest/gtest.h" + +TEST(NpFfiDeserializeResultTests, TestResultMoveConstructor) { + auto book = nearby_protocol::CredentialBook::TryCreate().value(); + auto result = + nearby_protocol::Deserializer::DeserializeAdvertisement(V0AdvEmpty, book); + ASSERT_EQ(result.GetKind(), + np_ffi::internal::DeserializeAdvertisementResultKind::V0); + + // Now move the result into a new value, and make sure its still valid + nearby_protocol::DeserializeAdvertisementResult moved_result( + std::move(result)); + ASSERT_EQ(moved_result.GetKind(), + np_ffi::internal::DeserializeAdvertisementResultKind::V0); + auto v0 = moved_result.IntoV0(); + ASSERT_EQ(v0.GetKind(), + np_ffi::internal::DeserializedV0AdvertisementKind::Legible); + + // trying to use the moved object should result in a use after free which + // triggers an abort + ASSERT_DEATH([[maybe_unused]] auto failure = + result.IntoV0(), // NOLINT(bugprone-use-after-move + ""); + ASSERT_DEATH([[maybe_unused]] auto failure = result.GetKind(), ""); + + // moving again should still preserve the moved state and also lead to an + // abort + nearby_protocol::DeserializeAdvertisementResult moved_again( + std::move(moved_result)); + ASSERT_DEATH([[maybe_unused]] auto failure = moved_again.IntoV0(), ""); + ASSERT_DEATH([[maybe_unused]] auto failure = moved_again.GetKind(), ""); +} + +TEST(NpFfiDeserializeResultTests, DeserializeFromStringView) { + auto bytes = absl::HexStringToBytes("00031503"); + auto buffer = nearby_protocol::ByteBuffer<255>::CopyFrom(bytes); + ASSERT_TRUE(buffer.ok()); + + nearby_protocol::RawAdvertisementPayload adv(buffer.value()); + + auto maybe_credential_book = nearby_protocol::CredentialBook::TryCreate(); + ASSERT_TRUE(maybe_credential_book.ok()); + auto deserialize_result = + nearby_protocol::Deserializer::DeserializeAdvertisement( + adv, maybe_credential_book.value()); + + ASSERT_EQ(deserialize_result.GetKind(), + nearby_protocol::DeserializeAdvertisementResultKind::V0); + auto v0_adv = deserialize_result.IntoV0(); + + ASSERT_EQ(v0_adv.GetKind(), + nearby_protocol::DeserializedV0AdvertisementKind::Legible); + auto legible_adv = v0_adv.IntoLegible(); + auto identity = legible_adv.GetIdentity(); + ASSERT_EQ(identity.GetKind(), + nearby_protocol::DeserializedV0IdentityKind::Plaintext); + + auto num_des = legible_adv.GetNumberOfDataElements(); + ASSERT_EQ(num_des, 1); + auto payload = legible_adv.IntoPayload(); + + auto de_result = payload.TryGetDataElement(0); + ASSERT_TRUE(de_result.ok()); + auto de = de_result.value(); + + ASSERT_EQ(de.GetKind(), nearby_protocol::V0DataElementKind::TxPower); + auto tx_power = de.AsTxPower(); + ASSERT_EQ(tx_power.tx_power, 3); +} + +TEST(NpFfiDeserializeResultTests, TestResultMoveAssignment) { + auto book = nearby_protocol::CredentialBook::TryCreate().value(); + auto result = + nearby_protocol::Deserializer::DeserializeAdvertisement(V0AdvEmpty, book); + ASSERT_EQ(result.GetKind(), + np_ffi::internal::DeserializeAdvertisementResultKind::V0); + + // create a second result + auto another_result = + nearby_protocol::Deserializer::DeserializeAdvertisement(V0AdvEmpty, book); + ASSERT_EQ(another_result.GetKind(), + np_ffi::internal::DeserializeAdvertisementResultKind::V0); + + // move result into another_result. The original another_result should be + // de-allocated. + another_result = std::move(result); + auto v0 = another_result.IntoV0(); + ASSERT_EQ(v0.GetKind(), + np_ffi::internal::DeserializedV0AdvertisementKind::Legible); + + // original result should now be invalid, using it will trigger a use after + // free abort. + ASSERT_DEATH([[maybe_unused]] auto failure = + result.IntoV0(), // NOLINT(bugprone-use-after-move) + ""); + ASSERT_DEATH([[maybe_unused]] auto failure = result.GetKind(), ""); + + // moving again should still lead to an error + auto moved_again = std::move(result); + ASSERT_DEATH([[maybe_unused]] auto failure = moved_again.IntoV0(), ""); + ASSERT_DEATH([[maybe_unused]] auto failure = moved_again.GetKind(), ""); +} + +TEST(NpFfiDeserializeResultTests, TestInvalidPayloadHeader) { + ASSERT_TRUE( + nearby_protocol::GlobalConfig::SetPanicHandler(test_panic_handler)); + + // An invalid header result should result in error + nearby_protocol::RawAdvertisementPayload InvalidHeaderPayload( + nearby_protocol::ByteBuffer<255>({1, {0xFF}})); + auto maybe_credential_book = nearby_protocol::CredentialBook::TryCreate(); + ASSERT_TRUE(maybe_credential_book.ok()); + auto deserialize_result = + nearby_protocol::Deserializer::DeserializeAdvertisement( + InvalidHeaderPayload, maybe_credential_book.value()); + + // Errors cannot be casted into further types + ASSERT_EQ(deserialize_result.GetKind(), + nearby_protocol::DeserializeAdvertisementResultKind::Error); + ASSERT_DEATH({ [[maybe_unused]] auto failure = deserialize_result.IntoV0(); }, + ""); + ASSERT_DEATH({ [[maybe_unused]] auto failure = deserialize_result.IntoV1(); }, + ""); +} + +TEST(NpFfiDeserializeResultTests, TestInvalidV0Cast) { + ASSERT_TRUE( + nearby_protocol::GlobalConfig::SetPanicHandler(test_panic_handler)); + + auto maybe_credential_book = nearby_protocol::CredentialBook::TryCreate(); + auto deserialize_result = + nearby_protocol::Deserializer::DeserializeAdvertisement( + V1AdvSimple, maybe_credential_book.value()); + + ASSERT_EQ(deserialize_result.GetKind(), + nearby_protocol::DeserializeAdvertisementResultKind::V1); + ASSERT_DEATH({ [[maybe_unused]] auto failure = deserialize_result.IntoV0(); }, + ""); +} + +TEST(NpFfiDeserializeResultTests, TestInvalidV1Cast) { + ASSERT_TRUE( + nearby_protocol::GlobalConfig::SetPanicHandler(test_panic_handler)); + + // Create an empty credential book and verify that is is successful + auto maybe_credential_book = nearby_protocol::CredentialBook::TryCreate(); + ASSERT_TRUE(maybe_credential_book.ok()); + auto deserialize_result = + nearby_protocol::Deserializer::DeserializeAdvertisement( + V0AdvEmpty, maybe_credential_book.value()); + + ASSERT_EQ(deserialize_result.GetKind(), + nearby_protocol::DeserializeAdvertisementResultKind::V0); + ASSERT_DEATH({ [[maybe_unused]] auto failure = deserialize_result.IntoV1(); }, + ""); +} + +TEST(NpFfiDeserializeResultTests, V0UseResultTwice) { + auto book_result = nearby_protocol::CredentialBook::TryCreate(); + ASSERT_TRUE(book_result.ok()); + + auto deserialize_result = + nearby_protocol::Deserializer::DeserializeAdvertisement( + V0AdvEmpty, book_result.value()); + ASSERT_EQ(deserialize_result.GetKind(), + np_ffi::internal::DeserializeAdvertisementResultKind::V0); + + // Once this goes out of scope, the entire result will be invalid + auto v0_adv = deserialize_result.IntoV0(); + // Calling intoV0 for a second time is a programmer error and will result + // in a crash. + ASSERT_DEATH({ [[maybe_unused]] auto failure = deserialize_result.IntoV0(); }, + ""); +} + +TEST(NpFfiDeserializeResultTests, V1UseResultTwice) { + auto book_result = nearby_protocol::CredentialBook::TryCreate(); + ASSERT_TRUE(book_result.ok()); + + auto deserialize_result = + nearby_protocol::Deserializer::DeserializeAdvertisement( + V1AdvSimple, book_result.value()); + ASSERT_EQ(deserialize_result.GetKind(), + np_ffi::internal::DeserializeAdvertisementResultKind::V1); + + // Once this goes out of scope, the entire result will be invalid + auto v1_adv = deserialize_result.IntoV1(); + // Calling intoV0 for a second time is a programmer error and will result + // in a crash. + ASSERT_DEATH({ [[maybe_unused]] auto failure = deserialize_result.IntoV1(); }, + ""); +} + +TEST(NpFfiDeserializeResultTests, IntoV0AfterOutOfScope) { + auto book_result = nearby_protocol::CredentialBook::TryCreate(); + ASSERT_TRUE(book_result.ok()); + + auto deserialize_result = + nearby_protocol::Deserializer::DeserializeAdvertisement( + V0AdvEmpty, book_result.value()); + ASSERT_EQ(deserialize_result.GetKind(), + np_ffi::internal::DeserializeAdvertisementResultKind::V0); + + // Once this goes out of scope, the entire result will be invalid + { auto v0_adv = deserialize_result.IntoV0(); } + + // Calling intoV0 for a second time is a programmer error and will result + // in a crash. + ASSERT_DEATH({ [[maybe_unused]] auto failure = deserialize_result.IntoV0(); }, + ""); +} + +TEST(NpFfiDeserializeResultTests, IntoV1AfterOutOfScope) { + auto book_result = nearby_protocol::CredentialBook::TryCreate(); + ASSERT_TRUE(book_result.ok()); + + auto deserialize_result = + nearby_protocol::Deserializer::DeserializeAdvertisement( + V1AdvSimple, book_result.value()); + ASSERT_EQ(deserialize_result.GetKind(), + np_ffi::internal::DeserializeAdvertisementResultKind::V1); + + // Once this goes out of scope, the entire result will be invalid + { auto v0_adv = deserialize_result.IntoV1(); } + + // Calling intoV0 for a second time is a programmer error and will result + // in a crash. + ASSERT_DEATH({ [[maybe_unused]] auto failure = deserialize_result.IntoV1(); }, + ""); +} + +TEST(NpFfiDeserializeV0Tests, V0ResultKindAfterOutOfScope) { + auto book_result = nearby_protocol::CredentialBook::TryCreate(); + ASSERT_TRUE(book_result.ok()); + + auto deserialize_result = + nearby_protocol::Deserializer::DeserializeAdvertisement( + V0AdvEmpty, book_result.value()); + ASSERT_EQ(deserialize_result.GetKind(), + np_ffi::internal::DeserializeAdvertisementResultKind::V0); + + // Once this goes out of scope, the entire result will be invalid + { auto v0_adv = deserialize_result.IntoV0(); } + + // Calling intoV0 for a second time is a programmer error and will result + // in a crash. + ASSERT_DEATH( + { [[maybe_unused]] auto failure = deserialize_result.GetKind(); }, ""); +} + +TEST(NpFfiDeserializeResultTests, V1ResultKindAfterOutOfScope) { + auto book_result = nearby_protocol::CredentialBook::TryCreate(); + ASSERT_TRUE(book_result.ok()); + + auto deserialize_result = + nearby_protocol::Deserializer::DeserializeAdvertisement( + V1AdvSimple, book_result.value()); + ASSERT_EQ(deserialize_result.GetKind(), + np_ffi::internal::DeserializeAdvertisementResultKind::V1); + + // Once this goes out of scope, the entire result will be invalid + { auto v0_adv = deserialize_result.IntoV1(); } + + // Calling intoV0 for a second time is a programmer error and will result + // in a crash. + ASSERT_DEATH( + { [[maybe_unused]] auto failure = deserialize_result.GetKind(); }, ""); +} \ No newline at end of file
diff --git a/nearby/presence/np_cpp_ffi/tests/deserialize_v0_tests.cc b/nearby/presence/np_cpp_ffi/tests/deserialize_v0_tests.cc new file mode 100644 index 0000000..9781720 --- /dev/null +++ b/nearby/presence/np_cpp_ffi/tests/deserialize_v0_tests.cc
@@ -0,0 +1,610 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "nearby_protocol.h" +#include "shared_test_util.h" + +#include "gtest/gtest.h" + +TEST(NpFfiDeserializeV0Tests, V0SingleDataElementTxPower) { + nearby_protocol::RawAdvertisementPayload adv( + nearby_protocol::ByteBuffer<255>({ + 4, + {0x00, // Adv Header + 0x03, // Public DE header + 0x15, 0x03} // Length 1 Tx Power DE with value 3 + })); + + auto maybe_credential_book = nearby_protocol::CredentialBook::TryCreate(); + ASSERT_TRUE(maybe_credential_book.ok()); + auto deserialize_result = + nearby_protocol::Deserializer::DeserializeAdvertisement( + adv, maybe_credential_book.value()); + + ASSERT_EQ(deserialize_result.GetKind(), + nearby_protocol::DeserializeAdvertisementResultKind::V0); + auto v0_adv = deserialize_result.IntoV0(); + + ASSERT_EQ(v0_adv.GetKind(), + nearby_protocol::DeserializedV0AdvertisementKind::Legible); + auto legible_adv = v0_adv.IntoLegible(); + auto identity = legible_adv.GetIdentity(); + ASSERT_EQ(identity.GetKind(), + nearby_protocol::DeserializedV0IdentityKind::Plaintext); + + auto num_des = legible_adv.GetNumberOfDataElements(); + ASSERT_EQ(num_des, 1); + auto payload = legible_adv.IntoPayload(); + + auto de_result = payload.TryGetDataElement(0); + ASSERT_TRUE(de_result.ok()); + auto de = de_result.value(); + + ASSERT_EQ(de.GetKind(), nearby_protocol::V0DataElementKind::TxPower); + auto tx_power = de.AsTxPower(); + ASSERT_EQ(tx_power.tx_power, 3); +} + +TEST(NpFfiDeserializeV0Tests, V0LengthOneActionsDataElement) { + nearby_protocol::RawAdvertisementPayload adv( + nearby_protocol::ByteBuffer<255>({ + 4, + {0x00, // Adv Header + 0x03, // Public DE header + 0x16, 0x00} // Length 1 Actions DE + })); + + auto maybe_credential_book = nearby_protocol::CredentialBook::TryCreate(); + ASSERT_TRUE(maybe_credential_book.ok()); + auto deserialize_result = + nearby_protocol::Deserializer::DeserializeAdvertisement( + adv, maybe_credential_book.value()); + + ASSERT_EQ(deserialize_result.GetKind(), + nearby_protocol::DeserializeAdvertisementResultKind::V0); + auto v0_adv = deserialize_result.IntoV0(); + + ASSERT_EQ(v0_adv.GetKind(), + nearby_protocol::DeserializedV0AdvertisementKind::Legible); + auto legible_adv = v0_adv.IntoLegible(); + auto identity = legible_adv.GetIdentity(); + ASSERT_EQ(identity.GetKind(), + nearby_protocol::DeserializedV0IdentityKind::Plaintext); + + auto num_des = legible_adv.GetNumberOfDataElements(); + ASSERT_EQ(num_des, 1); + auto payload = legible_adv.IntoPayload(); + + auto de_result = payload.TryGetDataElement(0); + ASSERT_TRUE(de_result.ok()); + auto de = de_result.value(); + + ASSERT_EQ(de.GetKind(), nearby_protocol::V0DataElementKind::Actions); + auto actions = de.AsActions(); + ASSERT_EQ(actions.GetAsU32(), 0); +} + +TEST(NpFfiDeserializeV0Tests, V0LengthTwoActionsDataElement) { + nearby_protocol::RawAdvertisementPayload adv( + nearby_protocol::ByteBuffer<255>({ + 5, + {0x00, // Adv Header + 0x03, // Public DE header + 0x26, 0xD0, 0x46} // Length 2 Actions DE + })); + + auto maybe_credential_book = nearby_protocol::CredentialBook::TryCreate(); + ASSERT_TRUE(maybe_credential_book.ok()); + auto deserialize_result = + nearby_protocol::Deserializer::DeserializeAdvertisement( + adv, maybe_credential_book.value()); + + ASSERT_EQ(deserialize_result.GetKind(), + nearby_protocol::DeserializeAdvertisementResultKind::V0); + auto v0_adv = deserialize_result.IntoV0(); + + ASSERT_EQ(v0_adv.GetKind(), + nearby_protocol::DeserializedV0AdvertisementKind::Legible); + auto legible_adv = v0_adv.IntoLegible(); + auto identity = legible_adv.GetIdentity(); + ASSERT_EQ(identity.GetKind(), + nearby_protocol::DeserializedV0IdentityKind::Plaintext); + + auto num_des = legible_adv.GetNumberOfDataElements(); + ASSERT_EQ(num_des, 1); + + auto payload = legible_adv.IntoPayload(); + auto de_result = payload.TryGetDataElement(0); + ASSERT_TRUE(de_result.ok()); + auto de = de_result.value(); + + ASSERT_EQ(de.GetKind(), nearby_protocol::V0DataElementKind::Actions); + auto actions = de.AsActions(); + ASSERT_EQ(actions.GetAsU32(), 0xD0460000); + + ASSERT_TRUE( + actions.HasAction(nearby_protocol::BooleanActionType::NearbyShare)); + ASSERT_TRUE(actions.HasAction(nearby_protocol::BooleanActionType::Finder)); + ASSERT_TRUE( + actions.HasAction(nearby_protocol::BooleanActionType::FastPairSass)); + + ASSERT_FALSE( + actions.HasAction(nearby_protocol::BooleanActionType::ActiveUnlock)); + ASSERT_FALSE( + actions.HasAction(nearby_protocol::BooleanActionType::InstantTethering)); + ASSERT_FALSE(actions.HasAction(nearby_protocol::BooleanActionType::PhoneHub)); + ASSERT_FALSE( + actions.HasAction(nearby_protocol::BooleanActionType::PresenceManager)); + + ASSERT_EQ(actions.GetContextSyncSequenceNumber(), 0xD); +} + +TEST(NpFfiDeserializeV0Tests, V0MultipleDataElements) { + nearby_protocol::RawAdvertisementPayload adv(nearby_protocol::ByteBuffer<255>( + {7, + { + 0x00, // Adv Header + 0x03, // Public DE header + 0x15, 0x05, // Tx Power value 5 + 0x26, 0x00, 0x46, // Length 2 Actions + }})); + + auto maybe_credential_book = nearby_protocol::CredentialBook::TryCreate(); + ASSERT_TRUE(maybe_credential_book.ok()); + auto deserialize_result = + nearby_protocol::Deserializer::DeserializeAdvertisement( + adv, maybe_credential_book.value()); + + ASSERT_EQ(deserialize_result.GetKind(), + nearby_protocol::DeserializeAdvertisementResultKind::V0); + auto v0_adv = deserialize_result.IntoV0(); + + ASSERT_EQ(v0_adv.GetKind(), + nearby_protocol::DeserializedV0AdvertisementKind::Legible); + auto legible_adv = v0_adv.IntoLegible(); + auto identity = legible_adv.GetIdentity(); + ASSERT_EQ(identity.GetKind(), + nearby_protocol::DeserializedV0IdentityKind::Plaintext); + + auto num_des = legible_adv.GetNumberOfDataElements(); + ASSERT_EQ(num_des, 2); + auto payload = legible_adv.IntoPayload(); + + auto first_de_result = payload.TryGetDataElement(0); + ASSERT_TRUE(first_de_result.ok()); + auto first_de = first_de_result.value(); + + ASSERT_EQ(first_de.GetKind(), nearby_protocol::V0DataElementKind::TxPower); + auto power = first_de.AsTxPower(); + ASSERT_EQ(power.tx_power, 5); + + auto second_de_result = payload.TryGetDataElement(1); + ASSERT_TRUE(second_de_result.ok()); + auto second_de = second_de_result.value(); + + ASSERT_EQ(second_de.GetKind(), nearby_protocol::V0DataElementKind::Actions); + auto actions = second_de.AsActions(); + ASSERT_EQ(actions.GetAsU32(), 0x00460000); + ASSERT_EQ(actions.GetContextSyncSequenceNumber(), 0); +} + +TEST(NpFfiDeserializeV0Tests, V0EmptyPayload) { + auto maybe_credential_book = nearby_protocol::CredentialBook::TryCreate(); + ASSERT_TRUE(maybe_credential_book.ok()); + auto deserialize_result = + nearby_protocol::Deserializer::DeserializeAdvertisement( + V0AdvEmpty, maybe_credential_book.value()); + + ASSERT_EQ(deserialize_result.GetKind(), + nearby_protocol::DeserializeAdvertisementResultKind::V0); + auto v0_adv = deserialize_result.IntoV0(); + + ASSERT_EQ(v0_adv.GetKind(), + nearby_protocol::DeserializedV0AdvertisementKind::Legible); + auto legible_adv = v0_adv.IntoLegible(); + auto identity = legible_adv.GetIdentity(); + ASSERT_EQ(identity.GetKind(), + nearby_protocol::DeserializedV0IdentityKind::Plaintext); + + auto num_des = legible_adv.GetNumberOfDataElements(); + ASSERT_EQ(num_des, 0); + auto payload = legible_adv.IntoPayload(); + + auto result = payload.TryGetDataElement(0); + ASSERT_FALSE(result.ok()); + ASSERT_TRUE(absl::IsOutOfRange(result.status())); +} + +TEST(NpFfiDeserializeV0Tests, TestV0AdvMoveConstructor) { + auto book = nearby_protocol::CredentialBook::TryCreate().value(); + auto result = + nearby_protocol::Deserializer::DeserializeAdvertisement(V0AdvEmpty, book); + ASSERT_EQ(result.GetKind(), + np_ffi::internal::DeserializeAdvertisementResultKind::V0); + auto adv = result.IntoV0(); + + // Now move the adv into a new value, and make sure its still valid + nearby_protocol::DeserializedV0Advertisement moved_adv(std::move(adv)); + ASSERT_EQ(moved_adv.GetKind(), + np_ffi::internal::DeserializedV0AdvertisementKind::Legible); + + // trying to use the moved object should result in a use after free which + // triggers an abort + ASSERT_DEATH([[maybe_unused]] auto failure = + adv.IntoLegible(), // NOLINT(bugprone-use-after-move + ""); + ASSERT_DEATH([[maybe_unused]] auto failure = adv.GetKind(), ""); + + // moving again should still preserve the moved state and also lead to an + // abort + nearby_protocol::DeserializedV0Advertisement moved_again(std::move(adv)); + ASSERT_DEATH([[maybe_unused]] auto failure = moved_again.IntoLegible(), ""); + ASSERT_DEATH([[maybe_unused]] auto failure = moved_again.GetKind(), ""); +} + +TEST(NpFfiDeserializeResultTests, TestV0AdvMoveAssignment) { + auto book = nearby_protocol::CredentialBook::TryCreate().value(); + auto result = + nearby_protocol::Deserializer::DeserializeAdvertisement(V0AdvEmpty, book); + ASSERT_EQ(result.GetKind(), + np_ffi::internal::DeserializeAdvertisementResultKind::V0); + auto adv = result.IntoV0(); + + // create a second result + auto another_result = + nearby_protocol::Deserializer::DeserializeAdvertisement(V0AdvEmpty, book); + ASSERT_EQ(another_result.GetKind(), + np_ffi::internal::DeserializeAdvertisementResultKind::V0); + auto adv2 = another_result.IntoV0(); + + // move adv2 into adv, the original should be deallocated by assignment + adv2 = std::move(adv); + ASSERT_EQ(adv2.GetKind(), + np_ffi::internal::DeserializedV0AdvertisementKind::Legible); + + // original result should now be invalid, using it will trigger a use after + // free abort. + ASSERT_DEATH([[maybe_unused]] auto failure = + adv.IntoLegible(), // NOLINT(bugprone-use-after-move) + ""); + ASSERT_DEATH([[maybe_unused]] auto failure = adv.GetKind(), ""); + + // moving again should still lead to an error + auto moved_again = std::move(adv); + ASSERT_DEATH([[maybe_unused]] auto failure = moved_again.IntoLegible(), ""); + ASSERT_DEATH([[maybe_unused]] auto failure = moved_again.GetKind(), ""); +} + +TEST(NpFfiDeserializeV0Tests, V0AdvDestructor) { + nearby_protocol::GlobalConfig::SetMaxNumDeserializedV0Advertisements(1); + auto book_result = nearby_protocol::CredentialBook::TryCreate(); + ASSERT_TRUE(book_result.ok()); + { + auto deserialize_result = + nearby_protocol::Deserializer::DeserializeAdvertisement( + V0AdvEmpty, book_result.value()); + ASSERT_EQ(deserialize_result.GetKind(), + np_ffi::internal::DeserializeAdvertisementResultKind::V0); + + // Going over max amount should result in error + auto deserialize_result2 = + nearby_protocol::Deserializer::DeserializeAdvertisement( + V0AdvEmpty, book_result.value()); + ASSERT_EQ(deserialize_result2.GetKind(), + np_ffi::internal::DeserializeAdvertisementResultKind::Error); + + // Calling IntoV0() should move the underlying resources into the v0 object + // when both go out of scope only one should be freed + auto v0_adv = deserialize_result.IntoV0(); + } + + // Now that the first v0 adv is out of scope, it should be de-allocated which + // will create room for one more to be created. + auto deserialize_result3 = + nearby_protocol::Deserializer::DeserializeAdvertisement( + V0AdvEmpty, book_result.value()); + ASSERT_EQ(deserialize_result3.GetKind(), + np_ffi::internal::DeserializeAdvertisementResultKind::V0); +} + +TEST(NpFfiDeserializeV0Tests, V0AdvUseAfterMove) { + auto maybe_credential_book = nearby_protocol::CredentialBook::TryCreate(); + ASSERT_TRUE(maybe_credential_book.ok()); + auto deserialize_result = + nearby_protocol::Deserializer::DeserializeAdvertisement( + V0AdvSimple, maybe_credential_book.value()); + + ASSERT_EQ(deserialize_result.GetKind(), + nearby_protocol::DeserializeAdvertisementResultKind::V0); + auto v0_adv = deserialize_result.IntoV0(); + + ASSERT_EQ(v0_adv.GetKind(), + nearby_protocol::DeserializedV0AdvertisementKind::Legible); + + // Moves the adv into a legible adv, so the original v0_adv is no longer valid + [[maybe_unused]] auto legible_adv = v0_adv.IntoLegible(); + ASSERT_DEATH([[maybe_unused]] auto failure = v0_adv.GetKind(), ""); + ASSERT_DEATH([[maybe_unused]] auto failure = v0_adv.IntoLegible(), ""); +} + +TEST(NpFfiDeserializeV0Tests, TestLegibleAdvMoveConstructor) { + auto book = nearby_protocol::CredentialBook::TryCreate().value(); + auto result = + nearby_protocol::Deserializer::DeserializeAdvertisement(V0AdvEmpty, book); + ASSERT_EQ(result.GetKind(), + np_ffi::internal::DeserializeAdvertisementResultKind::V0); + auto legible = result.IntoV0().IntoLegible(); + + // Now move the adv into a new value, and make sure its still valid + nearby_protocol::LegibleDeserializedV0Advertisement moved(std::move(legible)); + ASSERT_EQ(moved.GetNumberOfDataElements(), 0); + ASSERT_EQ(moved.GetIdentity().GetKind(), + np_ffi::internal::DeserializedV0IdentityKind::Plaintext); + + // trying to use the moved object should result in a use after free which + // triggers an abort + ASSERT_DEATH([[maybe_unused]] auto failure = + legible.GetIdentity(), // NOLINT(bugprone-use-after-move + ""); + ASSERT_DEATH( + [[maybe_unused]] auto failure = legible.GetNumberOfDataElements(), ""); + ASSERT_DEATH([[maybe_unused]] auto failure = legible.IntoPayload(), ""); + + // moving again should still preserve the moved state and also lead to an + // abort + nearby_protocol::LegibleDeserializedV0Advertisement moved_again( + std::move(legible)); + ASSERT_DEATH([[maybe_unused]] auto failure = moved_again.GetIdentity(), ""); + ASSERT_DEATH([[maybe_unused]] auto failure = + moved_again.GetNumberOfDataElements(), + ""); + ASSERT_DEATH([[maybe_unused]] auto failure = moved_again.IntoPayload(), ""); +} + +TEST(NpFfiDeserializeResultTests, TestLegibleAdvMoveAssignment) { + auto book = nearby_protocol::CredentialBook::TryCreate().value(); + auto result = + nearby_protocol::Deserializer::DeserializeAdvertisement(V0AdvEmpty, book); + ASSERT_EQ(result.GetKind(), + np_ffi::internal::DeserializeAdvertisementResultKind::V0); + auto legible = result.IntoV0().IntoLegible(); + + // create a second result + auto another_result = + nearby_protocol::Deserializer::DeserializeAdvertisement(V0AdvEmpty, book); + ASSERT_EQ(another_result.GetKind(), + np_ffi::internal::DeserializeAdvertisementResultKind::V0); + auto legible2 = another_result.IntoV0().IntoLegible(); + + // move adv2 into adv, the original should be deallocated by assignment + legible2 = std::move(legible); + ASSERT_EQ(legible2.GetIdentity().GetKind(), + np_ffi::internal::DeserializedV0IdentityKind::Plaintext); + + // original result should now be invalid, using it will trigger a use after + // free abort. + ASSERT_DEATH([[maybe_unused]] auto failure = + legible.GetIdentity(), // NOLINT(bugprone-use-after-move) + ""); + ASSERT_DEATH( + [[maybe_unused]] auto failure = legible.GetNumberOfDataElements(), ""); + ASSERT_DEATH([[maybe_unused]] auto failure = legible.IntoPayload(), ""); + + // moving again should still lead to an error + auto moved_again = std::move(legible); + ASSERT_DEATH([[maybe_unused]] auto failure = moved_again.IntoPayload(), ""); + ASSERT_DEATH([[maybe_unused]] auto failure = moved_again.GetIdentity(), ""); + ASSERT_DEATH([[maybe_unused]] auto failure = + moved_again.GetNumberOfDataElements(), + ""); +} + +nearby_protocol::LegibleDeserializedV0Advertisement +CreateLegibleAdv(nearby_protocol::CredentialBook &book) { + auto adv = nearby_protocol::Deserializer::DeserializeAdvertisement( + V0AdvSimple, book); + auto v0_adv = adv.IntoV0(); + return v0_adv.IntoLegible(); +} + +TEST(NpFfiDeserializeV0Tests, V0LegibleAdvUseAfterMove) { + auto book = nearby_protocol::CredentialBook::TryCreate().value(); + auto legible_adv = CreateLegibleAdv(book); + + // Should be able to use the valid legible adv even though its original parent + // is now out of scope. + ASSERT_EQ(legible_adv.GetIdentity().GetKind(), + nearby_protocol::DeserializedV0IdentityKind::Plaintext); + ASSERT_EQ(legible_adv.GetNumberOfDataElements(), 1); + [[maybe_unused]] auto payload = legible_adv.IntoPayload(); + + // now that the legible adv has moved into the payload it should no longer be + // valid + ASSERT_DEATH([[maybe_unused]] auto failure = legible_adv.GetIdentity(), ""); + ASSERT_DEATH([[maybe_unused]] auto failure = + legible_adv.GetNumberOfDataElements(), + ""); + ASSERT_DEATH([[maybe_unused]] auto failure = legible_adv.IntoPayload(), ""); +} + +TEST(NpFfiDeserializeV0Tests, LegibleAdvDestructor) { + auto book = nearby_protocol::CredentialBook::TryCreate().value(); + nearby_protocol::GlobalConfig::SetMaxNumDeserializedV0Advertisements(1); + { + auto legible_adv = CreateLegibleAdv(book); + + // check that legible adv is valid. + ASSERT_EQ(legible_adv.GetIdentity().GetKind(), + nearby_protocol::DeserializedV0IdentityKind::Plaintext); + ASSERT_EQ(legible_adv.GetNumberOfDataElements(), 1); + + // allocation slots should be full + ASSERT_EQ(nearby_protocol::Deserializer::DeserializeAdvertisement( + V0AdvSimple, book) + .GetKind(), + nearby_protocol::DeserializeAdvertisementResultKind::Error); + } + + // Verify the handle was de-allocated when legible adv went out of scope + auto result = nearby_protocol::Deserializer::DeserializeAdvertisement( + V0AdvSimple, book); + ASSERT_EQ(result.GetKind(), + nearby_protocol::DeserializeAdvertisementResultKind::V0); +} + +nearby_protocol::V0Payload +CreatePayload(nearby_protocol::CredentialBook &book) { + auto legible_adv = CreateLegibleAdv(book); + return legible_adv.IntoPayload(); +} + +TEST(NpFfiDeserializeV0Tests, V0PayloadDestructor) { + auto book = nearby_protocol::CredentialBook::TryCreate().value(); + nearby_protocol::GlobalConfig::SetMaxNumDeserializedV0Advertisements(1); + { + auto payload = CreatePayload(book); + + // check that payload adv is valid even though its parent is out of scope + ASSERT_TRUE(payload.TryGetDataElement(0).ok()); + + // allocation slots should be full + ASSERT_EQ(nearby_protocol::Deserializer::DeserializeAdvertisement( + V0AdvSimple, book) + .GetKind(), + nearby_protocol::DeserializeAdvertisementResultKind::Error); + } + + // Now that the payload is out of scope its destructor should have been called + // freeing the parent handle + auto result = nearby_protocol::Deserializer::DeserializeAdvertisement( + V0AdvSimple, book); + ASSERT_EQ(result.GetKind(), + nearby_protocol::DeserializeAdvertisementResultKind::V0); +} + +TEST(NpFfiDeserializeV0Tests, TestV0PayloadMoveConstructor) { + auto book = nearby_protocol::CredentialBook::TryCreate().value(); + auto result = nearby_protocol::Deserializer::DeserializeAdvertisement( + V0AdvSimple, book); + ASSERT_EQ(result.GetKind(), + np_ffi::internal::DeserializeAdvertisementResultKind::V0); + auto payload = result.IntoV0().IntoLegible().IntoPayload(); + + // Now move the adv into a new value, and make sure its still valid + nearby_protocol::V0Payload moved(std::move(payload)); + ASSERT_TRUE(moved.TryGetDataElement(0).ok()); + ASSERT_TRUE(absl::IsOutOfRange(moved.TryGetDataElement(1).status())); + + // trying to use the moved object should result in a use after free which + // triggers an abort + ASSERT_DEATH([[maybe_unused]] auto failure = payload.TryGetDataElement( + 0), // NOLINT(bugprone-use-after-move + ""); + + // moving again should still preserve the moved state and also lead to an + // abort + nearby_protocol::V0Payload moved_again(std::move(payload)); + ASSERT_DEATH([[maybe_unused]] auto failure = moved_again.TryGetDataElement(0), + ""); +} + +TEST(NpFfiDeserializeResultTests, TestV0PayloadMoveAssignment) { + auto book = nearby_protocol::CredentialBook::TryCreate().value(); + auto result = nearby_protocol::Deserializer::DeserializeAdvertisement( + V0AdvSimple, book); + ASSERT_EQ(result.GetKind(), + np_ffi::internal::DeserializeAdvertisementResultKind::V0); + auto payload = result.IntoV0().IntoLegible().IntoPayload(); + + // create a second result + auto another_result = nearby_protocol::Deserializer::DeserializeAdvertisement( + V0AdvSimple, book); + ASSERT_EQ(another_result.GetKind(), + np_ffi::internal::DeserializeAdvertisementResultKind::V0); + auto payload2 = another_result.IntoV0().IntoLegible().IntoPayload(); + + // original should be deallocated by assignment + payload2 = std::move(payload); + ASSERT_TRUE(payload2.TryGetDataElement(0).ok()); + + // original result should now be invalid, using it will trigger a use after + // free abort. + ASSERT_DEATH([[maybe_unused]] auto failure = payload.TryGetDataElement( + 0), // NOLINT(bugprone-use-after-move) + ""); + + // moving again should still lead to an error + auto moved_again = std::move(payload); + ASSERT_DEATH([[maybe_unused]] auto failure = moved_again.TryGetDataElement(0), + ""); +} + +TEST(NpFfiDeserializeV0Tests, InvalidDataElementCast) { + ASSERT_TRUE( + nearby_protocol::GlobalConfig::SetPanicHandler(test_panic_handler)); + + auto maybe_credential_book = nearby_protocol::CredentialBook::TryCreate(); + ASSERT_TRUE(maybe_credential_book.ok()); + auto deserialize_result = + nearby_protocol::Deserializer::DeserializeAdvertisement( + V0AdvSimple, maybe_credential_book.value()); + + ASSERT_EQ(deserialize_result.GetKind(), + nearby_protocol::DeserializeAdvertisementResultKind::V0); + auto v0_adv = deserialize_result.IntoV0(); + ASSERT_EQ(v0_adv.GetKind(), + nearby_protocol::DeserializedV0AdvertisementKind::Legible); + auto legible_adv = v0_adv.IntoLegible(); + auto identity = legible_adv.GetIdentity(); + ASSERT_EQ(identity.GetKind(), + nearby_protocol::DeserializedV0IdentityKind::Plaintext); + + auto num_des = legible_adv.GetNumberOfDataElements(); + ASSERT_EQ(num_des, 1); + auto payload = legible_adv.IntoPayload(); + + auto de_result = payload.TryGetDataElement(0); + ASSERT_TRUE(de_result.ok()); + auto de = de_result.value(); + + ASSERT_EQ(de.GetKind(), nearby_protocol::V0DataElementKind::TxPower); + ASSERT_DEATH([[maybe_unused]] auto failure = de.AsActions();, ""); +} + +TEST(NpFfiDeserializeV0Tests, InvalidDataElementIndex) { + auto maybe_credential_book = nearby_protocol::CredentialBook::TryCreate(); + ASSERT_TRUE(maybe_credential_book.ok()); + auto deserialize_result = + nearby_protocol::Deserializer::DeserializeAdvertisement( + V0AdvSimple, maybe_credential_book.value()); + + ASSERT_EQ(deserialize_result.GetKind(), + nearby_protocol::DeserializeAdvertisementResultKind::V0); + auto v0_adv = deserialize_result.IntoV0(); + + ASSERT_EQ(v0_adv.GetKind(), + nearby_protocol::DeserializedV0AdvertisementKind::Legible); + auto legible_adv = v0_adv.IntoLegible(); + auto identity = legible_adv.GetIdentity(); + ASSERT_EQ(identity.GetKind(), + nearby_protocol::DeserializedV0IdentityKind::Plaintext); + + auto num_des = legible_adv.GetNumberOfDataElements(); + ASSERT_EQ(num_des, 1); + auto payload = legible_adv.IntoPayload(); + + auto de_result = payload.TryGetDataElement(1); + ASSERT_FALSE(de_result.ok()); + ASSERT_TRUE(absl::IsOutOfRange(de_result.status())); +}
diff --git a/nearby/presence/np_cpp_ffi/tests/deserialize_v1_tests.cc b/nearby/presence/np_cpp_ffi/tests/deserialize_v1_tests.cc new file mode 100644 index 0000000..48b881b --- /dev/null +++ b/nearby/presence/np_cpp_ffi/tests/deserialize_v1_tests.cc
@@ -0,0 +1,254 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "nearby_protocol.h" +#include "shared_test_util.h" + +#include "gtest/gtest.h" + +TEST(NpFfiDeserializeV1Tests, V1SimpleTestCase) { + auto maybe_credential_book = nearby_protocol::CredentialBook::TryCreate(); + ASSERT_TRUE(maybe_credential_book.ok()); + + auto deserialize_result = + nearby_protocol::Deserializer::DeserializeAdvertisement( + V1AdvSimple, maybe_credential_book.value()); + ASSERT_EQ(deserialize_result.GetKind(), + nearby_protocol::DeserializeAdvertisementResultKind::V1); + + auto v1_adv = deserialize_result.IntoV1(); + ASSERT_EQ(v1_adv.GetNumLegibleSections(), 1); + ASSERT_EQ(v1_adv.GetNumUndecryptableSections(), 0); + + auto invalid = v1_adv.TryGetSection(1); + ASSERT_FALSE(invalid.ok()); + ASSERT_TRUE(absl::IsOutOfRange(invalid.status())); + + auto section = v1_adv.TryGetSection(0); + ASSERT_TRUE(section.ok()); + ASSERT_EQ(section.value().GetIdentityKind(), + nearby_protocol::DeserializedV1IdentityKind::Plaintext); + ASSERT_EQ(section.value().NumberOfDataElements(), 1); + + auto invalid_de = section.value().TryGetDataElement(1); + ASSERT_FALSE(invalid_de.ok()); + ASSERT_TRUE(absl::IsOutOfRange(invalid_de.status())); + + auto de = section.value().TryGetDataElement(0); + ASSERT_TRUE(de.ok()); + ASSERT_EQ(de.value().GetDataElementTypeCode(), 5); + + auto payload = de.value().GetPayload(); + auto vec = payload.ToVector(); + std::vector<uint8_t> expected{3}; + ASSERT_EQ(vec, expected); +} + +TEST(NpFfiDeserializeV1Tests, V1MultipleSections) { + auto maybe_credential_book = nearby_protocol::CredentialBook::TryCreate(); + ASSERT_TRUE(maybe_credential_book.ok()); + + auto deserialize_result = + nearby_protocol::Deserializer::DeserializeAdvertisement( + V1AdvMultipleSections, maybe_credential_book.value()); + ASSERT_EQ(deserialize_result.GetKind(), + nearby_protocol::DeserializeAdvertisementResultKind::V1); + + auto v1_adv = deserialize_result.IntoV1(); + ASSERT_EQ(v1_adv.GetNumLegibleSections(), 2); + ASSERT_EQ(v1_adv.GetNumUndecryptableSections(), 0); + + auto invalid = v1_adv.TryGetSection(2); + ASSERT_FALSE(invalid.ok()); + ASSERT_TRUE(absl::IsOutOfRange(invalid.status())); + + auto section = v1_adv.TryGetSection(0); + ASSERT_TRUE(section.ok()); + ASSERT_EQ(section.value().GetIdentityKind(), + nearby_protocol::DeserializedV1IdentityKind::Plaintext); + ASSERT_EQ(section.value().NumberOfDataElements(), 1); + + auto invalid_de = section.value().TryGetDataElement(1); + ASSERT_FALSE(invalid_de.ok()); + ASSERT_TRUE(absl::IsOutOfRange(invalid_de.status())); + + auto de = section.value().TryGetDataElement(0); + ASSERT_TRUE(de.ok()); + ASSERT_EQ(de.value().GetDataElementTypeCode(), 6); + + auto payload = de.value().GetPayload(); + auto vec = payload.ToVector(); + std::vector<uint8_t> expected{0x00, 0x46}; + ASSERT_EQ(vec, expected); + + auto section2 = v1_adv.TryGetSection(1); + ASSERT_TRUE(section2.ok()); + ASSERT_EQ(section2.value().GetIdentityKind(), + nearby_protocol::DeserializedV1IdentityKind::Plaintext); + ASSERT_EQ(section2.value().NumberOfDataElements(), 1); +} + +TEST(NpFfiDeserializeV1Tests, TestV1AdvMoveConstructor) { + auto book = nearby_protocol::CredentialBook::TryCreate().value(); + auto result = nearby_protocol::Deserializer::DeserializeAdvertisement( + V1AdvSimple, book); + ASSERT_EQ(result.GetKind(), + np_ffi::internal::DeserializeAdvertisementResultKind::V1); + auto adv = result.IntoV1(); + + // Now move the adv into a new value, and make sure its still valid + nearby_protocol::DeserializedV1Advertisement moved_adv(std::move(adv)); + ASSERT_EQ(moved_adv.GetNumLegibleSections(), 1); + + // trying to use the moved object should result in a use after free which + // triggers an abort + ASSERT_DEATH( + [[maybe_unused]] auto failure = + adv.GetNumLegibleSections(), // NOLINT(bugprone-use-after-move + ""); + ASSERT_DEATH( + [[maybe_unused]] auto failure = adv.GetNumUndecryptableSections(), ""); + ASSERT_DEATH([[maybe_unused]] auto failure = adv.TryGetSection(0), ""); + + // moving again should still preserve the moved state and also lead to an + // abort + nearby_protocol::DeserializedV1Advertisement moved_again(std::move(adv)); + ASSERT_DEATH( + [[maybe_unused]] auto failure = + moved_again.GetNumLegibleSections(), // NOLINT(bugprone-use-after-move + ""); + ASSERT_DEATH([[maybe_unused]] auto failure = + moved_again.GetNumUndecryptableSections(), + ""); + ASSERT_DEATH([[maybe_unused]] auto failure = moved_again.TryGetSection(0), + ""); +} + +TEST(NpFfiDeserializeV1Tests, TestV1AdvMoveAssignment) { + auto book = nearby_protocol::CredentialBook::TryCreate().value(); + auto result = nearby_protocol::Deserializer::DeserializeAdvertisement( + V1AdvSimple, book); + ASSERT_EQ(result.GetKind(), + np_ffi::internal::DeserializeAdvertisementResultKind::V1); + auto adv = result.IntoV1(); + + // create a second result + auto another_result = nearby_protocol::Deserializer::DeserializeAdvertisement( + V1AdvSimple, book); + ASSERT_EQ(another_result.GetKind(), + np_ffi::internal::DeserializeAdvertisementResultKind::V1); + auto adv2 = another_result.IntoV1(); + + // move adv2 into adv, the original should be deallocated by assignment + adv2 = std::move(adv); + ASSERT_EQ(adv2.GetNumLegibleSections(), 1); + + // original result should now be invalid, using it will trigger a use after + // free abort. + ASSERT_DEATH( + [[maybe_unused]] auto failure = + adv.GetNumLegibleSections(), // NOLINT(bugprone-use-after-move + ""); + ASSERT_DEATH( + [[maybe_unused]] auto failure = adv.GetNumUndecryptableSections(), ""); + ASSERT_DEATH([[maybe_unused]] auto failure = adv.TryGetSection(0), ""); + + // moving again should still lead to an error + auto moved_again = std::move(adv); + ASSERT_DEATH( + [[maybe_unused]] auto failure = + moved_again.GetNumLegibleSections(), // NOLINT(bugprone-use-after-move + ""); + ASSERT_DEATH([[maybe_unused]] auto failure = + moved_again.GetNumUndecryptableSections(), + ""); + ASSERT_DEATH([[maybe_unused]] auto failure = moved_again.TryGetSection(0), + ""); +} + +nearby_protocol::DeserializedV1Section +GetSection(nearby_protocol::CredentialBook &book) { + // Create the adv in this scope, so its de-allocated at the end of this call. + // The section should still be valid + auto v1_adv = + nearby_protocol::Deserializer::DeserializeAdvertisement(V1AdvSimple, book) + .IntoV1(); + auto section = v1_adv.TryGetSection(0); + return section.value(); +} + +bool TryDeserializeNewV1Adv(nearby_protocol::CredentialBook &book) { + auto adv = nearby_protocol::Deserializer::DeserializeAdvertisement( + V1AdvSimple, book); + return adv.GetKind() == + np_ffi::internal::DeserializeAdvertisementResultKind::V1; +} + +TEST(NpFfiDeserializeV1Tests, TestSectionOwnership) { + // Capping the max number so we can verify that de-allocations are happening + nearby_protocol::GlobalConfig::SetMaxNumDeserializedV1Advertisements(1); + auto maybe_credential_book = nearby_protocol::CredentialBook::TryCreate(); + ASSERT_TRUE(maybe_credential_book.ok()); + + { + auto section = GetSection(maybe_credential_book.value()); + ASSERT_EQ(section.GetIdentityKind(), + nearby_protocol::DeserializedV1IdentityKind::Plaintext); + ASSERT_EQ(section.NumberOfDataElements(), 1); + ASSERT_TRUE(section.TryGetDataElement(0).ok()); + + ASSERT_FALSE(TryDeserializeNewV1Adv(maybe_credential_book.value())); + } + + // now that the section has gone out of scope, deserializing a new adv should + // succeed + ASSERT_TRUE(TryDeserializeNewV1Adv(maybe_credential_book.value())); +} + +void NestedGetSectionsPart2(nearby_protocol::DeserializedV1Advertisement &adv, + nearby_protocol::CredentialBook &book) { + { auto section = adv.TryGetSection(1); } + assert(!TryDeserializeNewV1Adv(book)); +} + +nearby_protocol::DeserializedV1Section +NestedGetSections(nearby_protocol::CredentialBook &book) { + auto v1_adv = nearby_protocol::Deserializer::DeserializeAdvertisement( + V1AdvMultipleSections, book) + .IntoV1(); + auto section = v1_adv.TryGetSection(0); + NestedGetSectionsPart2(v1_adv, book); + return section.value(); +} + +// Make sure handle stays in scope until all of the sections and adv have gone +// out of scope +TEST(NpFfiDeserializeV1Tests, TestSectionOwnershipMultipleSections) { + // Capping the max number so we can verify that de-allocations are happening + nearby_protocol::GlobalConfig::SetMaxNumDeserializedV1Advertisements(1); + auto maybe_credential_book = nearby_protocol::CredentialBook::TryCreate(); + ASSERT_TRUE(maybe_credential_book.ok()); + { + auto section = NestedGetSections(maybe_credential_book.value()); + ASSERT_EQ(section.GetIdentityKind(), + nearby_protocol::DeserializedV1IdentityKind::Plaintext); + ASSERT_EQ(section.NumberOfDataElements(), 1); + + ASSERT_FALSE(TryDeserializeNewV1Adv(maybe_credential_book.value())); + } + + // now that the section has gone out of scope, deserializing a new adv should + // succeed + ASSERT_TRUE(TryDeserializeNewV1Adv(maybe_credential_book.value())); +} \ No newline at end of file
diff --git a/nearby/presence/np_cpp_ffi/tests/global_config_tests.cc b/nearby/presence/np_cpp_ffi/tests/global_config_tests.cc new file mode 100644 index 0000000..e120aee --- /dev/null +++ b/nearby/presence/np_cpp_ffi/tests/global_config_tests.cc
@@ -0,0 +1,205 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "nearby_protocol.h" +#include "shared_test_util.h" + +#include <iostream> + +#include "gtest/gtest.h" + +TEST(NpFfiGlobalConfigTests, TestPanicHandler) { + ASSERT_TRUE( + nearby_protocol::GlobalConfig::SetPanicHandler(test_panic_handler)); + auto book = nearby_protocol::CredentialBook::TryCreate().value(); + auto deserialize_result = + nearby_protocol::Deserializer::DeserializeAdvertisement(V0AdvEmpty, book); + ASSERT_EQ(deserialize_result.GetKind(), + np_ffi::internal::DeserializeAdvertisementResultKind::V0); + + // Now try to cast the result into the wrong type and verify the process + // aborts + ASSERT_DEATH({ [[maybe_unused]] auto failure = deserialize_result.IntoV1(); }, + ""); +} + +TEST(NpFfiGlobalConfigTests, TestPanicHandlerTwice) { + ASSERT_TRUE( + nearby_protocol::GlobalConfig::SetPanicHandler(test_panic_handler)); + + // Second time trying to set should fail + ASSERT_FALSE( + nearby_protocol::GlobalConfig::SetPanicHandler(test_panic_handler)); +} + +// There is not much we can actually test here since this will affect memory +// consumption. This is more of just a simple check that things still work after +// configuring this +TEST(NpFfiGlobalConfigTests, TestSetMaxShardsDefault) { + // 0 should still work as default behavior + nearby_protocol::GlobalConfig::SetNumShards(0); + + auto book = nearby_protocol::CredentialBook::TryCreate().value(); + auto book2 = nearby_protocol::CredentialBook::TryCreate().value(); + auto book3 = nearby_protocol::CredentialBook::TryCreate().value(); + auto deserialize_result = + nearby_protocol::Deserializer::DeserializeAdvertisement(V0AdvEmpty, book); + + // Should still work + ASSERT_EQ(deserialize_result.GetKind(), + np_ffi::internal::DeserializeAdvertisementResultKind::V0); + + // Call again with a lower number, should have no effect. books 2 and 3 should + // still work. + nearby_protocol::GlobalConfig::SetNumShards(1); + auto deserialize_result_2 = + nearby_protocol::Deserializer::DeserializeAdvertisement(V0AdvEmpty, + book2); + ASSERT_EQ(deserialize_result_2.GetKind(), + np_ffi::internal::DeserializeAdvertisementResultKind::V0); + auto deserialize_result_3 = + nearby_protocol::Deserializer::DeserializeAdvertisement(V0AdvEmpty, + book3); + ASSERT_EQ(deserialize_result_3.GetKind(), + np_ffi::internal::DeserializeAdvertisementResultKind::V0); +} + +TEST(NpFfiGlobalConfigTests, TestSetMaxShardsSmall) { + nearby_protocol::GlobalConfig::SetNumShards(1); + auto book = nearby_protocol::CredentialBook::TryCreate().value(); + + // should still be able to parse 2 payloads with only one shard + auto deserialize_result1 = + nearby_protocol::Deserializer::DeserializeAdvertisement(V0AdvEmpty, book); + ASSERT_EQ(deserialize_result1.GetKind(), + np_ffi::internal::DeserializeAdvertisementResultKind::V0); + auto deserialize_result2 = + nearby_protocol::Deserializer::DeserializeAdvertisement(V0AdvEmpty, book); + ASSERT_EQ(deserialize_result2.GetKind(), + np_ffi::internal::DeserializeAdvertisementResultKind::V0); +} + +TEST(NpFfiGlobalConfigTests, TestSetMaxCredBooks) { + nearby_protocol::GlobalConfig::SetMaxNumCredentialBooks(1); + auto book1_result = nearby_protocol::CredentialBook::TryCreate(); + ASSERT_TRUE(book1_result.ok()); + + auto book2_result = nearby_protocol::CredentialBook::TryCreate(); + ASSERT_FALSE(book2_result.ok()); + ASSERT_TRUE(absl::IsResourceExhausted(book2_result.status())); +} + +TEST(NpFfiGlobalConfigTests, TestSetMaxCredBooksAfterFirstCall) { + auto book = nearby_protocol::CredentialBook::TryCreate().value(); + auto book2 = nearby_protocol::CredentialBook::TryCreate().value(); + auto book3 = nearby_protocol::CredentialBook::TryCreate().value(); + + // setting this after books have already been created should have no affect + nearby_protocol::GlobalConfig::SetMaxNumCredentialBooks(1); + auto book4_result = nearby_protocol::CredentialBook::TryCreate(); + ASSERT_TRUE(book4_result.ok()); +} + +TEST(NpFfiGlobalConfigTests, TestSetMaxV0Advs) { + nearby_protocol::GlobalConfig::SetMaxNumDeserializedV0Advertisements(1); + auto book_result = nearby_protocol::CredentialBook::TryCreate(); + ASSERT_TRUE(book_result.ok()); + + { + auto deserialize_result = + nearby_protocol::Deserializer::DeserializeAdvertisement( + V0AdvEmpty, book_result.value()); + ASSERT_EQ(deserialize_result.GetKind(), + np_ffi::internal::DeserializeAdvertisementResultKind::V0); + + // Going over max amount should result in error + auto deserialize_result2 = + nearby_protocol::Deserializer::DeserializeAdvertisement( + V0AdvEmpty, book_result.value()); + ASSERT_EQ(deserialize_result2.GetKind(), + np_ffi::internal::DeserializeAdvertisementResultKind::Error); + } + + // Now that the first v0 adv is out of scope, it will be de-allocated which + // will create room for one more to be created. + auto deserialize_result3 = + nearby_protocol::Deserializer::DeserializeAdvertisement( + V0AdvEmpty, book_result.value()); + ASSERT_EQ(deserialize_result3.GetKind(), + np_ffi::internal::DeserializeAdvertisementResultKind::V0); +} + +TEST(NpFfiGlobalConfigTests, TestSetMaxV1Advs) { + nearby_protocol::GlobalConfig::SetMaxNumDeserializedV1Advertisements(1); + auto book_result = nearby_protocol::CredentialBook::TryCreate(); + ASSERT_TRUE(book_result.ok()); + + { + auto deserialize_result = + nearby_protocol::Deserializer::DeserializeAdvertisement( + V1AdvSimple, book_result.value()); + ASSERT_EQ(deserialize_result.GetKind(), + np_ffi::internal::DeserializeAdvertisementResultKind::V1); + + // Going over max amount should result in error + auto deserialize_result2 = + nearby_protocol::Deserializer::DeserializeAdvertisement( + V1AdvSimple, book_result.value()); + ASSERT_EQ(deserialize_result2.GetKind(), + np_ffi::internal::DeserializeAdvertisementResultKind::Error); + } + + // Now that the first v1 adv is out of scope, it will be de-allocated which + // will create room for one more to be created. + auto deserialize_result3 = + nearby_protocol::Deserializer::DeserializeAdvertisement( + V1AdvSimple, book_result.value()); + ASSERT_EQ(deserialize_result3.GetKind(), + np_ffi::internal::DeserializeAdvertisementResultKind::V1); +} + +// Same test case as above, but verifies that the de-allocation still succeeds +// after calling IntoV1() and that no double frees occur. +TEST(NpFfiGlobalConfigTests, TestSetMaxV1AdvsFreeAfterInto) { + nearby_protocol::GlobalConfig::SetMaxNumDeserializedV1Advertisements(1); + auto book_result = nearby_protocol::CredentialBook::TryCreate(); + ASSERT_TRUE(book_result.ok()); + + { + auto deserialize_result = + nearby_protocol::Deserializer::DeserializeAdvertisement( + V1AdvSimple, book_result.value()); + ASSERT_EQ(deserialize_result.GetKind(), + np_ffi::internal::DeserializeAdvertisementResultKind::V1); + + // Going over max amount should result in error + auto deserialize_result2 = + nearby_protocol::Deserializer::DeserializeAdvertisement( + V1AdvSimple, book_result.value()); + ASSERT_EQ(deserialize_result2.GetKind(), + np_ffi::internal::DeserializeAdvertisementResultKind::Error); + + // Calling IntoV1() should move the underlying resources into the v0 object + // when both go out of scope only one should be freed + auto v0_adv = deserialize_result.IntoV1(); + } + + // Now that the first v1 adv is out of scope, it will be de-allocated which + // will create room for one more to be created. + auto deserialize_result3 = + nearby_protocol::Deserializer::DeserializeAdvertisement( + V1AdvSimple, book_result.value()); + ASSERT_EQ(deserialize_result3.GetKind(), + np_ffi::internal::DeserializeAdvertisementResultKind::V1); +} \ No newline at end of file
diff --git a/nearby/presence/np_ed25519/Cargo.toml b/nearby/presence/np_ed25519/Cargo.toml new file mode 100644 index 0000000..b4bca66 --- /dev/null +++ b/nearby/presence/np_ed25519/Cargo.toml
@@ -0,0 +1,14 @@ +[package] +name = "np_ed25519" +version.workspace = true +edition.workspace = true +publish.workspace = true + +[dependencies] +array_view.workspace = true +crypto_provider.workspace = true +sink.workspace = true +tinyvec.workspace = true + +[features] +std = ["crypto_provider/std"]
diff --git a/nearby/presence/np_ed25519/src/lib.rs b/nearby/presence/np_ed25519/src/lib.rs new file mode 100644 index 0000000..60c8302 --- /dev/null +++ b/nearby/presence/np_ed25519/src/lib.rs
@@ -0,0 +1,286 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! Wrappers around NP's usage of ed25519 signatures. +//! +//! All of NP's usages of ed25519 signatures are performed +//! with "context" bytes prepended to the payload to be signed +//! or verified. These "context" bytes allow for usage of the +//! same base key-pair for different purposes in the protocol. +#![no_std] +#![forbid(unsafe_code)] +#![deny(missing_docs, clippy::indexing_slicing)] + +extern crate core; + +use array_view::ArrayView; +use crypto_provider::ed25519::{ + Ed25519Provider, KeyPair as _, PublicKey as _, RawPrivateKey, RawPublicKey, RawSignature, + Signature as _, SignatureError, +}; +use crypto_provider::CryptoProvider; +use sink::{Sink, SinkWriter}; +use tinyvec::ArrayVec; + +/// Convenient type-alias for a crypto-provider's Ed25519 key-pair +type CpKeyPair<C> = <<C as CryptoProvider>::Ed25519 as Ed25519Provider>::KeyPair; + +/// Type-alias for the Ed25519 public key type +type CpPublicKey<C> = <<C as CryptoProvider>::Ed25519 as Ed25519Provider>::PublicKey; + +/// Type-alias for the Ed25519 signature type +type CpSignature<C> = <<C as CryptoProvider>::Ed25519 as Ed25519Provider>::Signature; + +/// Maximum length of the combined (context len byte) + (context bytes) + (signing payload) +/// byte-array which an ed25519 signature will be computed over. This is deliberately +/// chosen to be large enough to incorporate an entire v1 adv as the signing payload. +pub const MAX_SIGNATURE_BUFFER_LEN: usize = 512; + +/// Representation of an Ed25519 key-pair using the given +/// [`CryptoProvider`] to back its implementation. +/// Contains both the public and secret halves of an +/// asymmetric key, and so it may be used to +/// both sign and verify message signatures. +pub struct KeyPair<C: CryptoProvider>(CpKeyPair<C>); + +impl<C: CryptoProvider> KeyPair<C> { + /// Returns the `KeyPair`'s private key bytes. This method should only ever be called by code + /// which securely stores private credentials. + pub fn private_key(&self) -> RawPrivateKey { + self.0.private_key() + } + + /// Builds this key-pair from an array of its private key bytes in the yielded by `private_key`. + /// This method should only ever be called by code which securely stores private credentials. + pub fn from_private_key(private_key: &RawPrivateKey) -> Self { + Self(CpKeyPair::<C>::from_private_key(private_key)) + } + + /// Sign the given message with the given context and + /// return a digital signature. The message is represented + /// using a [`SinkWriter`] to allow the caller to construct + /// the payload to sign without requiring a fully-assembled + /// payload available as a slice. + /// + /// If the message writer writes too much data (greater than 256 bytes), + /// this will return `None` instead of a valid signature, + /// and so uses in `np_adv` will use `.expect` on the returned value + /// to indicate that this length constraint has been considered. + pub fn sign_with_context<W: SinkWriter<DataType = u8>>( + &self, + context: &SignatureContext, + msg_writer: W, + ) -> Option<Signature<C>> { + let mut buffer = context.create_signature_buffer(); + buffer.try_extend_from_writer(msg_writer).map(|_| Signature(self.0.sign(buffer.as_ref()))) + } + + /// Gets the public key of this key-pair + pub fn public(&self) -> PublicKey<C> { + PublicKey { public_key: self.0.public() } + } + + /// Generates an ed25519 keypair from a CSPRNG + /// generate is not available in `no-std` + #[cfg(feature = "std")] + pub fn generate() -> Self { + Self(CpKeyPair::<C>::generate()) + } +} + +/// Error raised when attempting to deserialize a key-pair +/// from a byte-array, but the bytes do not represent a valid +/// ed25519 key-pair +#[derive(Debug)] +pub struct InvalidKeyPairBytes; + +/// Errors yielded when attempting to verify an ed25519 signature. +#[derive(Debug, PartialEq, Eq)] +pub enum SignatureVerificationError { + /// The payload that we attempted to verify the signature of was too big + PayloadTooBig, + /// The signature we were checking was invalid for the given payload + SignatureInvalid, +} + +impl From<SignatureError> for SignatureVerificationError { + fn from(_: SignatureError) -> Self { + Self::SignatureInvalid + } +} + +/// Representation of an Ed25519 public key used for +/// signature verification. +pub struct PublicKey<C: CryptoProvider> { + public_key: CpPublicKey<C>, +} + +impl<C: CryptoProvider> PublicKey<C> { + /// Succeeds if the signature was a valid signature created via the corresponding + /// keypair to this public key using the given [`SignatureContext`] on the given + /// message payload. The message payload is represented + /// using a [`SinkWriter`] to allow the caller to construct + /// the payload to sign without requiring a fully-assembled + /// payload available as a slice. + /// + /// If the message writer writes too much data (greater than 256 bytes), + /// this will return `None` instead of a valid signature, + /// and so uses in `np_adv` will use `.expect` on the returned value + /// to indicate that this length constraint has been considered. + pub fn verify_signature_with_context<W: SinkWriter<DataType = u8>>( + &self, + context: &SignatureContext, + msg_writer: W, + signature: &Signature<C>, + ) -> Result<(), SignatureVerificationError> { + let mut buffer = context.create_signature_buffer(); + let maybe_write_success = buffer.try_extend_from_writer(msg_writer); + match maybe_write_success { + Some(_) => { + self.public_key.verify_strict(buffer.as_ref(), &signature.0)?; + Ok(()) + } + None => Err(SignatureVerificationError::PayloadTooBig), + } + } + + /// Builds an ed25519 public key from an array of bytes in + /// the format yielded by `to_bytes`. + pub fn from_bytes(bytes: &RawPublicKey) -> Result<Self, InvalidPublicKeyBytes> { + CpPublicKey::<C>::from_bytes(bytes) + .map(|public_key| Self { public_key }) + .map_err(|_| InvalidPublicKeyBytes) + } + + /// Yields the bytes of this ed25519 public key + pub fn to_bytes(&self) -> RawPublicKey { + self.public_key.to_bytes() + } +} + +impl<C: CryptoProvider> Clone for PublicKey<C> { + fn clone(&self) -> Self { + Self::from_bytes(&self.to_bytes()).unwrap() + } +} + +/// Error raised when attempting to deserialize a public key +/// from a byte-array, but the bytes do not represent a valid +/// ed25519 public key +#[derive(Debug)] +pub struct InvalidPublicKeyBytes; + +/// Representation of an Ed25519 message signature, +/// which can be checked against a [`PublicKey`] +/// for validity. +pub struct Signature<C: CryptoProvider>(CpSignature<C>); + +impl<C: CryptoProvider> Signature<C> { + /// Returns a slice of the signature bytes + pub fn to_bytes(&self) -> RawSignature { + self.0.to_bytes() + } +} + +/// Error raised when attempting to construct a [`Signature`] +/// from a byte-array which is not of the proper length or format. +#[derive(Debug)] +pub struct InvalidSignatureBytes; + +impl<C: CryptoProvider> TryFrom<&[u8]> for Signature<C> { + type Error = InvalidSignatureBytes; + fn try_from(bytes: &[u8]) -> Result<Self, Self::Error> { + bytes + .try_into() + .map(|sig| Self(CpSignature::<C>::from_bytes(sig))) + .map_err(|_| InvalidSignatureBytes) + } +} + +/// Minimum length (in bytes) for a [`SignatureContext`] (which cannot be empty). +pub const MIN_SIGNATURE_CONTEXT_LEN: usize = 1; + +/// Maximum length (in bytes) for a [`SignatureContext`] (which uses a 8-bit length field). +pub const MAX_SIGNATURE_CONTEXT_LEN: usize = 255; + +/// (Non-empty) context bytes to use in the construction of NP's +/// Ed25519 signatures. The context bytes should uniquely +/// identify the component of the protocol performing the +/// signature/verification (e.g: advertisement signing, +/// connection signing), and should be between 1 and +/// 255 bytes in length. +pub struct SignatureContext { + data: ArrayView<u8, MAX_SIGNATURE_CONTEXT_LEN>, +} + +impl SignatureContext { + /// Creates a signature buffer with size bounded by MAX_SIGNATURE_BUFFER_LEN + /// which is pre-populated with the contents yielded by + /// [`SignatureContext#write_length_prefixed`]. + fn create_signature_buffer(&self) -> impl Sink<u8> + AsRef<[u8]> { + let mut buffer = ArrayVec::<[u8; MAX_SIGNATURE_BUFFER_LEN]>::new(); + self.write_length_prefixed(&mut buffer).expect("Context should always fit into sig buffer"); + buffer + } + + /// Writes the contents of this signature context, prefixed + /// by the length of the context payload to the given byte-sink. + /// If writing to the sink failed at some point during this operation, + /// `None` will be returned, and the data written to the sink should + /// be considered to be invalid. + fn write_length_prefixed<S: Sink<u8>>(&self, sink: &mut S) -> Option<()> { + let length_byte = self.data.len() as u8; + sink.try_push(length_byte)?; + sink.try_extend_from_slice(self.data.as_slice()) + } + + /// Attempts to construct a signature context from the utf-8 bytes + /// of the given string. Returns `None` if the passed string + /// is invalid to use for signature context bytes. + pub const fn from_string_bytes(data_str: &str) -> Result<Self, SignatureContextInvalidLength> { + let data_bytes = data_str.as_bytes(); + Self::from_bytes(data_bytes) + } + + #[allow(clippy::indexing_slicing)] + const fn from_bytes(bytes: &[u8]) -> Result<Self, SignatureContextInvalidLength> { + let num_bytes = bytes.len(); + if num_bytes < MIN_SIGNATURE_CONTEXT_LEN || num_bytes > MAX_SIGNATURE_CONTEXT_LEN { + Err(SignatureContextInvalidLength) + } else { + let mut array = [0u8; MAX_SIGNATURE_CONTEXT_LEN]; + let mut i = 0; + while i < num_bytes { + array[i] = bytes[i]; + i += 1; + } + let data = ArrayView::const_from_array(array, bytes.len()); + Ok(Self { data }) + } + } +} + +/// Error raised when attempting to construct a +/// [`SignatureContext`] out of data with an +/// invalid length in bytes. +#[derive(Debug)] +pub struct SignatureContextInvalidLength; + +impl TryFrom<&[u8]> for SignatureContext { + type Error = SignatureContextInvalidLength; + + fn try_from(value: &[u8]) -> Result<Self, Self::Error> { + Self::from_bytes(value) + } +}
diff --git a/nearby/presence/np_ffi_core/Cargo.toml b/nearby/presence/np_ffi_core/Cargo.toml new file mode 100644 index 0000000..5be03a6 --- /dev/null +++ b/nearby/presence/np_ffi_core/Cargo.toml
@@ -0,0 +1,17 @@ +[package] +name = "np_ffi_core" +version.workspace = true +edition.workspace = true +publish.workspace = true + +[dependencies] +array_view.workspace = true +np_adv.workspace = true +handle_map.workspace = true +crypto_provider.workspace = true +#TODO: Allow this to be configurable! +crypto_provider_default = {workspace = true, features = ["rustcrypto"]} +spin.workspace = true + +[features] +std = []
diff --git a/nearby/presence/np_ffi_core/src/common.rs b/nearby/presence/np_ffi_core/src/common.rs new file mode 100644 index 0000000..f00c358 --- /dev/null +++ b/nearby/presence/np_ffi_core/src/common.rs
@@ -0,0 +1,293 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +//! Common externally-accessible FFI constructs which are needed +//! in order to define the interfaces in this crate's various modules. + +use alloc::string::String; +use array_view::ArrayView; +use handle_map::HandleNotPresentError; + +const DEFAULT_MAX_HANDLES: u32 = u32::MAX - 1; + +/// Configuration for top-level constants to be used +/// by the rest of the FFI which are independent of +/// the programming language which we ultimately +/// interface with at a higher level. +#[repr(C)] +pub struct CommonConfig { + /// The number of shards to employ in all handle-maps, + /// or zero if we want to use the default. + /// + /// The default number of shards will depend on whether + /// this crate was compiled with the `std` feature or not: + /// - If compiled with the `std` feature, the default number + /// of shards will be set to + /// `min(16, std::thread::available_parallelism().unwrap())`, + /// assuming that that call completes successfully. + /// - In all other cases, 16 shards will be used by default. + num_shards: u8, + + /// The maximum number of credential books which may be active + /// at any one time. By default, this value will be set to + /// `u32::MAX - 1`, which is the upper-bound on this value. + max_num_credential_books: u32, + + /// The maximum number of deserialized v0 advertisements + /// which may be active at any one time. By default, this + /// value will be set to `u32::MAX - 1`, which is the upper-bound + /// on this value. + max_num_deserialized_v0_advertisements: u32, + + /// The maximum number of deserialized v1 advertisements + /// which may be active at any one time. By default, this + /// value will be set to `u32::MAX - 1`, which is the upper-bound + /// on this value. + max_num_deserialized_v1_advertisements: u32, +} + +impl Default for CommonConfig { + fn default() -> Self { + Self::new() + } +} + +impl CommonConfig { + pub(crate) const fn new() -> Self { + Self { + num_shards: 0, + max_num_credential_books: DEFAULT_MAX_HANDLES, + max_num_deserialized_v0_advertisements: DEFAULT_MAX_HANDLES, + max_num_deserialized_v1_advertisements: DEFAULT_MAX_HANDLES, + } + } + #[cfg(feature = "std")] + pub(crate) fn num_shards(&self) -> u8 { + if self.num_shards == 0 { + match std::thread::available_parallelism() { + Ok(parallelism) => 16u8.min(parallelism), + Err(_) => 16u8, + } + } else { + self.num_shards + } + } + #[cfg(not(feature = "std"))] + pub(crate) fn num_shards(&self) -> u8 { + if self.num_shards == 0 { + 16u8 + } else { + self.num_shards + } + } + pub(crate) fn max_num_credential_books(&self) -> u32 { + self.max_num_credential_books + } + pub(crate) fn max_num_deserialized_v0_advertisements(&self) -> u32 { + self.max_num_deserialized_v0_advertisements + } + pub(crate) fn max_num_deserialized_v1_advertisements(&self) -> u32 { + self.max_num_deserialized_v1_advertisements + } + pub(crate) fn set_num_shards(&mut self, num_shards: u8) { + self.num_shards = num_shards + } + + /// Sets the maximum number of active handles to credential-books + /// which may be active at any one time. + /// Max value: `u32::MAX - 1`. + pub fn set_max_num_credential_books(&mut self, max_num_credential_books: u32) { + self.max_num_credential_books = DEFAULT_MAX_HANDLES.min(max_num_credential_books) + } + + /// Sets the maximum number of active handles to deserialized v0 + /// advertisements which may be active at any one time. + /// Max value: `u32::MAX - 1`. + pub fn set_max_num_deserialized_v0_advertisements( + &mut self, + max_num_deserialized_v0_advertisements: u32, + ) { + self.max_num_deserialized_v0_advertisements = + DEFAULT_MAX_HANDLES.min(max_num_deserialized_v0_advertisements) + } + + /// Sets the maximum number of active handles to deserialized v0 + /// advertisements which may be active at any one time. + /// Max value: `u32::MAX - 1`. + pub fn set_max_num_deserialized_v1_advertisements( + &mut self, + max_num_deserialized_v1_advertisements: u32, + ) { + self.max_num_deserialized_v1_advertisements = + DEFAULT_MAX_HANDLES.min(max_num_deserialized_v1_advertisements) + } +} + +static COMMON_CONFIG: spin::RwLock<CommonConfig> = spin::RwLock::new(CommonConfig::new()); + +pub(crate) fn global_num_shards() -> u8 { + COMMON_CONFIG.read().num_shards() +} +pub(crate) fn global_max_num_credential_books() -> u32 { + COMMON_CONFIG.read().max_num_credential_books() +} +pub(crate) fn global_max_num_deserialized_v0_advertisements() -> u32 { + COMMON_CONFIG.read().max_num_deserialized_v0_advertisements() +} +pub(crate) fn global_max_num_deserialized_v1_advertisements() -> u32 { + COMMON_CONFIG.read().max_num_deserialized_v1_advertisements() +} + +/// Sets an override to the number of shards to employ in the NP FFI's +/// internal handle-maps, which places an upper bound on the number +/// of writing threads which may make progress at any one time +/// when concurrently accessing handles of the same type. +/// +/// By default, this value will be set to 16, or in `std` environments, +/// the minimum of 16 and the number of available hardware threads. +/// A shard value override of zero will be interpreted the same +/// as this default. +/// +/// Setting this value will have no effect if the handle-maps for the +/// API have already begun being used by the client code, and any +/// values set will take effect upon the first usage of _any_ non-`global_config_set` +/// API call. +pub fn global_config_set_num_shards(num_shards: u8) { + let mut config = COMMON_CONFIG.write(); + config.set_num_shards(num_shards); +} + +/// Sets the maximum number of active handles to credential books +/// which may be active at any one time. Max value: `u32::MAX - 1`. +/// +/// Setting this value will have no effect if the handle-maps for the +/// API have already begun being used by the client code, and any +/// values set will take effect upon the first usage of any API +/// call utilizing credential books. +pub fn global_config_set_max_num_credential_books(max_num_credential_books: u32) { + let mut config = COMMON_CONFIG.write(); + config.set_max_num_credential_books(max_num_credential_books); +} + +/// Sets the maximum number of active handles to deserialized v0 +/// advertisements which may be active at any one time. +/// Max value: `u32::MAX - 1`. +/// +/// Setting this value will have no effect if the handle-maps for the +/// API have already begun being used by the client code, and any +/// values set will take effect upon the first usage of any API +/// call which references or returns a deserialized V0 advertisement. +pub fn global_config_set_max_num_deserialized_v0_advertisements( + max_num_deserialized_v0_advertisements: u32, +) { + let mut config = COMMON_CONFIG.write(); + config.set_max_num_deserialized_v0_advertisements(max_num_deserialized_v0_advertisements); +} + +/// Sets the maximum number of active handles to deserialized v1 +/// advertisements which may be active at any one time. +/// Max value: `u32::MAX - 1`. +/// +/// Setting this value will have no effect if the handle-maps for the +/// API have already begun being used by the client code, and any +/// values set will take effect upon the first usage of any API +/// call which references or returns a deserialized V1 advertisement. +pub fn global_config_set_max_num_deserialized_v1_advertisements( + max_num_deserialized_v1_advertisements: u32, +) { + let mut config = COMMON_CONFIG.write(); + config.set_max_num_deserialized_v1_advertisements(max_num_deserialized_v1_advertisements); +} + +// API surfaces: + +/// A result-type enum which tells the caller whether/not a deallocation +/// succeeded or failed due to the requested handle not being present. +#[repr(C)] +pub enum DeallocateResult { + /// The requested handle to deallocate was not present in the map + NotPresent = 0, + /// The object behind the handle was successfully deallocated + Success = 1, +} + +impl From<Result<(), HandleNotPresentError>> for DeallocateResult { + fn from(result: Result<(), HandleNotPresentError>) -> Self { + match result { + Ok(_) => DeallocateResult::Success, + Err(_) => DeallocateResult::NotPresent, + } + } +} + +/// Represents the raw contents of the service payload data +/// under the Nearby Presence service UUID +#[repr(C)] +pub struct RawAdvertisementPayload { + bytes: ByteBuffer<255>, +} + +impl RawAdvertisementPayload { + /// Yields a slice of the bytes in this raw advertisement payload. + pub fn as_slice(&self) -> &[u8] { + self.bytes.as_slice() + } +} + +/// A byte-string with a maximum size of N, +/// where only the first `len` bytes are considered +/// to contain the actual payload. N is only +/// permitted to be between 0 and 255. +#[derive(Clone)] +#[repr(C)] +// TODO: Once generic const exprs are stabilized, +// we could instead make N into a compile-time u8. +pub struct ByteBuffer<const N: usize> { + len: u8, + bytes: [u8; N], +} + +impl<const N: usize> ByteBuffer<N> { + /// Constructs a byte-buffer from a Rust-side-derived + /// ArrayView, which is assumed to be trusted to be + /// properly initialized, and with a size-bound + /// under 255 bytes. + pub(crate) fn from_array_view(array_view: ArrayView<u8, N>) -> Self { + let (len, bytes) = array_view.into_raw_parts(); + let len = len as u8; + Self { len, bytes } + } + /// Yields a slice of the first `self.len` bytes of `self.bytes`. + pub fn as_slice(&self) -> &[u8] { + &self.bytes[..(self.len as usize)] + } +} + +/// Error raised when attempting to cast an enum to +/// one of its variants, but the value is actually +/// of a different variant than the requested one. +pub struct EnumCastError { + pub(crate) projection_method_name: String, + pub(crate) variant_enum_name: String, + pub(crate) variant_type_name: String, +} + +impl core::fmt::Debug for EnumCastError { + fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { + write!( + f, + "Attempted to cast a non-{} to a {} via {}", + &self.variant_enum_name, &self.variant_type_name, &self.projection_method_name + ) + } +}
diff --git a/nearby/presence/np_ffi_core/src/credentials.rs b/nearby/presence/np_ffi_core/src/credentials.rs new file mode 100644 index 0000000..412ebc1 --- /dev/null +++ b/nearby/presence/np_ffi_core/src/credentials.rs
@@ -0,0 +1,88 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +//! Credential-related data-types and functions + +use crate::common::*; +use crate::utils::FfiEnum; +use handle_map::{declare_handle_map, HandleLike, HandleMapDimensions, HandleMapFullError}; + +/// Internal, Rust-side implementation of a credential-book. +/// See [`CredentialBook`] for the FFI-side handles. +// TODO(b/283249542): Give this a real definition! +pub struct CredentialBookInternals; + +fn get_credential_book_handle_map_dimensions() -> HandleMapDimensions { + HandleMapDimensions { + num_shards: global_num_shards(), + max_active_handles: global_max_num_credential_books(), + } +} + +declare_handle_map! {credential_book, CredentialBook, super::CredentialBookInternals, super::get_credential_book_handle_map_dimensions()} +use credential_book::CredentialBook; + +/// Discriminant for `CreateCredentialBookResult` +#[repr(u8)] +pub enum CreateCredentialBookResultKind { + /// There was no space left to create a new credential book + NoSpaceLeft = 0, + /// We created a new credential book behind the given handle. + /// The associated payload may be obtained via + /// `CreateCredentialBookResult#into_success()`. + Success = 1, +} + +/// Result type for `create_credential_book` +#[repr(u8)] +#[allow(missing_docs)] +pub enum CreateCredentialBookResult { + NoSpaceLeft = 0, + Success(CredentialBook) = 1, +} + +impl From<Result<CredentialBook, HandleMapFullError>> for CreateCredentialBookResult { + fn from(result: Result<CredentialBook, HandleMapFullError>) -> Self { + match result { + Ok(book) => CreateCredentialBookResult::Success(book), + Err(_) => CreateCredentialBookResult::NoSpaceLeft, + } + } +} + +/// Allocates a new credential-book, returning a handle to the created object +pub fn create_credential_book() -> CreateCredentialBookResult { + CredentialBook::allocate(|| CredentialBookInternals).into() +} + +impl FfiEnum for CreateCredentialBookResult { + type Kind = CreateCredentialBookResultKind; + fn kind(&self) -> Self::Kind { + match self { + CreateCredentialBookResult::NoSpaceLeft => CreateCredentialBookResultKind::NoSpaceLeft, + CreateCredentialBookResult::Success(_) => CreateCredentialBookResultKind::Success, + } + } +} + +impl CreateCredentialBookResult { + declare_enum_cast! {into_success, Success, CredentialBook} +} + +/// Deallocates a credential-book by its handle +pub fn deallocate_credential_book(credential_book: CredentialBook) -> DeallocateResult { + credential_book.deallocate().map(|_| ()).into() +} + +/// A handle on a particular v0 shared credential stored within a credential book +pub struct V0SharedCredential;
diff --git a/nearby/presence/np_ffi_core/src/deserialize/mod.rs b/nearby/presence/np_ffi_core/src/deserialize/mod.rs new file mode 100644 index 0000000..a651bcf --- /dev/null +++ b/nearby/presence/np_ffi_core/src/deserialize/mod.rs
@@ -0,0 +1,168 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +//! Core NP Rust FFI structures and methods for advertisement deserialization. + +use crate::common::*; +use crate::credentials::credential_book::CredentialBook; +use crate::deserialize::v0::*; +use crate::deserialize::v1::*; +use crate::utils::FfiEnum; +use crypto_provider_default::CryptoProviderImpl; +use handle_map::{HandleLike, HandleMapFullError, HandleNotPresentError}; + +pub mod v0; +pub mod v1; + +/// Discriminant for `DeserializeAdvertisementResult`. +#[repr(u8)] +pub enum DeserializeAdvertisementResultKind { + /// Deserializing the advertisement failed, for some reason or another. + Error = 0, + /// The advertisement was correctly deserialized, and it's a V0 advertisement. + /// `DeserializeAdvertisementResult#into_v0()` is the corresponding cast + /// to the associated enum variant. + V0 = 1, + /// The advertisement was correctly deserialized, and it's a V1 advertisement. + /// `DeserializeAdvertisementResult#into_v1()` is the corresponding cast + /// to the associated enum variant. + V1 = 2, +} + +/// The result of calling `np_ffi_deserialize_advertisement`. +/// Must be explicitly deallocated after use with +/// a corresponding `np_ffi_deallocate_deserialize_advertisement_result` +#[repr(u8)] +pub enum DeserializeAdvertisementResult { + /// Deserializing the advertisement failed, for some reason or another. + /// `DeserializeAdvertisementResultKind::Error` is the associated enum tag. + Error, + /// The advertisement was correctly deserialized, and it's a V0 advertisement. + /// `DeserializeAdvertisementResultKind::V0` is the associated enum tag. + V0(DeserializedV0Advertisement), + /// The advertisement was correctly deserialized, and it's a V1 advertisement. + /// `DeserializeAdvertisementResultKind::V1` is the associated enum tag. + V1(DeserializedV1Advertisement), +} + +impl FfiEnum for DeserializeAdvertisementResult { + type Kind = DeserializeAdvertisementResultKind; + fn kind(&self) -> Self::Kind { + match self { + DeserializeAdvertisementResult::Error => DeserializeAdvertisementResultKind::Error, + DeserializeAdvertisementResult::V0(_) => DeserializeAdvertisementResultKind::V0, + DeserializeAdvertisementResult::V1(_) => DeserializeAdvertisementResultKind::V1, + } + } +} + +impl DeserializeAdvertisementResult { + declare_enum_cast! {into_v0, V0, DeserializedV0Advertisement} + declare_enum_cast! {into_v1, V1, DeserializedV1Advertisement} + + /// Deallocates any internal data referenced by a `DeserializeAdvertisementResult` + pub fn deallocate(self) -> DeallocateResult { + match self { + DeserializeAdvertisementResult::Error => DeallocateResult::Success, + DeserializeAdvertisementResult::V0(adv) => adv.deallocate(), + DeserializeAdvertisementResult::V1(adv) => adv.deallocate(), + } + } +} + +//TODO: Once the `FromResidual` trait is stabilized, we won't need to do this +enum DeserializeAdvertisementSuccess { + V0(DeserializedV0Advertisement), + V1(DeserializedV1Advertisement), +} + +struct DeserializeAdvertisementError; + +impl From<HandleMapFullError> for DeserializeAdvertisementError { + fn from(_: HandleMapFullError) -> Self { + DeserializeAdvertisementError + } +} + +impl From<HandleNotPresentError> for DeserializeAdvertisementError { + fn from(_: HandleNotPresentError) -> Self { + DeserializeAdvertisementError + } +} + +impl From<np_adv::AdvDeserializationError> for DeserializeAdvertisementError { + fn from(_: np_adv::AdvDeserializationError) -> Self { + DeserializeAdvertisementError + } +} + +type DefaultV0Credential = np_adv::credential::simple::SimpleV0Credential< + np_adv::credential::v0::MinimumFootprintV0CryptoMaterial, + (), +>; +type DefaultV1Credential = np_adv::credential::simple::SimpleV1Credential< + np_adv::credential::v1::MinimumFootprintV1CryptoMaterial, + (), +>; +type DefaultBothCredentialSource = + np_adv::credential::source::OwnedBothCredentialSource<DefaultV0Credential, DefaultV1Credential>; + +fn deserialize_advertisement_from_slice_internal( + adv_payload: &[u8], + credential_book: CredentialBook, +) -> Result<DeserializeAdvertisementSuccess, DeserializeAdvertisementError> { + // Deadlock Safety: Credential-book locks always live longer than deserialized advs. + let _credential_book_read_guard = credential_book.get()?; + + //TODO(b/283249542): Use an actual credential source + let cred_source: DefaultBothCredentialSource = DefaultBothCredentialSource::new_empty(); + + let deserialized_advertisement = + np_adv::deserialize_advertisement::<_, _, _, _, CryptoProviderImpl>( + adv_payload, + &cred_source, + )?; + match deserialized_advertisement { + np_adv::DeserializedAdvertisement::V0(adv_contents) => { + let adv_handle = DeserializedV0Advertisement::allocate_with_contents(adv_contents)?; + Ok(DeserializeAdvertisementSuccess::V0(adv_handle)) + } + np_adv::DeserializedAdvertisement::V1(adv_contents) => { + let adv_handle = DeserializedV1Advertisement::allocate_with_contents(adv_contents)?; + Ok(DeserializeAdvertisementSuccess::V1(adv_handle)) + } + } +} + +/// Attempts to deserialize an advertisement with the given payload. +/// Suitable for langs which have a suitably expressive slice-type. +pub fn deserialize_advertisement_from_slice( + adv_payload: &[u8], + credential_book: CredentialBook, +) -> DeserializeAdvertisementResult { + let result = deserialize_advertisement_from_slice_internal(adv_payload, credential_book); + match result { + Ok(DeserializeAdvertisementSuccess::V0(x)) => DeserializeAdvertisementResult::V0(x), + Ok(DeserializeAdvertisementSuccess::V1(x)) => DeserializeAdvertisementResult::V1(x), + Err(_) => DeserializeAdvertisementResult::Error, + } +} + +/// Attempts to deserialize an advertisement with the given payload. +/// Suitable for langs which don't have an expressive-enough slice type. +pub fn deserialize_advertisement( + adv_payload: &RawAdvertisementPayload, + credential_book: CredentialBook, +) -> DeserializeAdvertisementResult { + deserialize_advertisement_from_slice(adv_payload.as_slice(), credential_book) +}
diff --git a/nearby/presence/np_ffi_core/src/deserialize/v0.rs b/nearby/presence/np_ffi_core/src/deserialize/v0.rs new file mode 100644 index 0000000..0f4b24b --- /dev/null +++ b/nearby/presence/np_ffi_core/src/deserialize/v0.rs
@@ -0,0 +1,445 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +//! Core NP Rust FFI structures and methods for v0 advertisement deserialization. + +use crate::common::*; +use crate::credentials::credential_book::CredentialBook; +use crate::utils::{FfiEnum, LocksLongerThan}; +use alloc::vec::Vec; +use handle_map::{declare_handle_map, HandleLike, HandleMapDimensions, HandleMapFullError}; +use np_adv::legacy::actions::ActionsDataElement; +use np_adv::legacy::{data_elements as np_adv_de, Ciphertext, PacketFlavorEnum, Plaintext}; + +/// Discriminant for possible results of V0 advertisement deserialization +#[derive(Clone, Copy)] +#[repr(u8)] +pub enum DeserializedV0AdvertisementKind { + /// The deserialized V0 advertisement was legible. + /// The associated payload may be obtained via + /// `DeserializedV0Advertisement#into_legible`. + Legible = 0, + /// The deserialized V0 advertisement is illegible, + /// likely meaning that the receiver does not hold + /// the proper credentials to be able to read + /// the received advertisement. + NoMatchingCredentials = 1, +} + +/// Represents a deserialized V0 advertisement +#[repr(C)] +#[allow(missing_docs)] +pub enum DeserializedV0Advertisement { + Legible(LegibleDeserializedV0Advertisement), + NoMatchingCredentials, +} + +impl FfiEnum for DeserializedV0Advertisement { + type Kind = DeserializedV0AdvertisementKind; + fn kind(&self) -> Self::Kind { + match self { + DeserializedV0Advertisement::Legible(_) => DeserializedV0AdvertisementKind::Legible, + DeserializedV0Advertisement::NoMatchingCredentials => { + DeserializedV0AdvertisementKind::NoMatchingCredentials + } + } + } +} + +impl DeserializedV0Advertisement { + /// Attempts to deallocate memory utilized internally by this V0 advertisement + /// (which contains a handle to actual advertisement contents behind-the-scenes). + pub fn deallocate(self) -> DeallocateResult { + match self { + DeserializedV0Advertisement::Legible(adv) => adv.deallocate(), + DeserializedV0Advertisement::NoMatchingCredentials => DeallocateResult::Success, + } + } + + pub(crate) fn allocate_with_contents<'m, M: np_adv::credential::MatchedCredential<'m>>( + contents: np_adv::V0AdvContents<'m, M>, + ) -> Result<Self, HandleMapFullError> { + match contents { + np_adv::V0AdvContents::Plaintext(plaintext_contents) => { + let adv = LegibleDeserializedV0Advertisement::allocate_with_plaintext_contents( + plaintext_contents, + )?; + Ok(Self::Legible(adv)) + } + np_adv::V0AdvContents::Decrypted(_) => { + unimplemented!(); + } + np_adv::V0AdvContents::NoMatchingCredentials => Ok(Self::NoMatchingCredentials), + } + } + + declare_enum_cast! {into_legible, Legible, LegibleDeserializedV0Advertisement} +} + +/// Represents a deserialized V0 advertisement whose DE contents may be read +#[repr(C)] +pub struct LegibleDeserializedV0Advertisement { + num_des: u8, + payload: V0Payload, + identity: DeserializedV0Identity, +} + +impl LegibleDeserializedV0Advertisement { + pub(crate) fn allocate_with_plaintext_contents( + contents: np_adv::legacy::deserialize::PlaintextAdvContents, + ) -> Result<Self, HandleMapFullError> { + let data_elements = contents.to_data_elements(); + let num_des = data_elements.len() as u8; + let payload = V0Payload::allocate_with_data_elements(data_elements)?; + Ok(Self { num_des, payload, identity: DeserializedV0Identity::Plaintext }) + } + /// Gets the number of data-elements in this adv's payload + /// Suitable as an iteration bound for `Self.into_payload().get_de(...)`. + pub fn num_des(&self) -> u8 { + self.num_des + } + /// Destructures this legible advertisement into just the payload + pub fn into_payload(self) -> V0Payload { + self.payload + } + /// Destructures this legible advertisement into just the identity information + pub fn into_identity(self) -> DeserializedV0Identity { + self.identity + } + /// Deallocates the underlying handle of the payload + pub fn deallocate(self) -> DeallocateResult { + self.payload.deallocate().map(|_| ()).into() + } +} + +/// Discriminant for `DeserializedV0Identity`. +#[derive(Clone, Copy)] +#[repr(u8)] +pub enum DeserializedV0IdentityKind { + /// The deserialized identity was a plaintext identity. + Plaintext = 0, + /// The deserialized identity was some decrypted identity. + Decrypted = 1, +} + +/// Represents deserialized information about the V0 identity utilized +/// by a deserialized V0 advertisement +#[repr(C)] +#[allow(missing_docs)] +pub enum DeserializedV0Identity { + Plaintext, + // TODO: This gets a payload once we support creds + Decrypted, +} + +impl FfiEnum for DeserializedV0Identity { + type Kind = DeserializedV0IdentityKind; + fn kind(&self) -> Self::Kind { + match self { + DeserializedV0Identity::Plaintext => DeserializedV0IdentityKind::Plaintext, + DeserializedV0Identity::Decrypted => DeserializedV0IdentityKind::Decrypted, + } + } +} + +/// The internal data-structure used for storing +/// the payload of a deserialized V0 advertisement. +pub struct V0PayloadInternals { + des: Vec<V0DataElement>, +} + +impl V0PayloadInternals { + /// Attempts to get the DE with the given index + /// in this v0 payload. + fn get_de(&self, index: u8) -> GetV0DEResult { + match self.des.get(index as usize) { + Some(de) => GetV0DEResult::Success(de.clone()), + None => GetV0DEResult::Error, + } + } +} + +fn get_v0_payload_handle_map_dimensions() -> HandleMapDimensions { + HandleMapDimensions { + num_shards: global_num_shards(), + max_active_handles: global_max_num_deserialized_v0_advertisements(), + } +} + +declare_handle_map! {v0_payload, V0Payload, super::V0PayloadInternals, super::get_v0_payload_handle_map_dimensions() } +use v0_payload::V0Payload; + +impl LocksLongerThan<V0Payload> for CredentialBook {} + +impl V0Payload { + pub(crate) fn allocate_with_data_elements<F: np_adv::legacy::PacketFlavor>( + data_elements: Vec<np_adv::legacy::deserialize::PlainDataElement<F>>, + ) -> Result<Self, HandleMapFullError> { + Self::allocate(move || { + let des = data_elements.into_iter().map(V0DataElement::from).collect(); + V0PayloadInternals { des } + }) + } + /// Gets the data-element with the given index in this v0 adv payload + pub fn get_de(&self, index: u8) -> GetV0DEResult { + match self.get() { + Ok(read_guard) => read_guard.get_de(index), + Err(_) => GetV0DEResult::Error, + } + } + + /// Deallocates any underlying data held by a V0Payload + pub fn deallocate_payload(&self) -> DeallocateResult { + self.deallocate().map(|_| ()).into() + } +} + +/// Discriminant of `GetV0DEResult`. +#[derive(Clone, Copy)] +#[repr(u8)] +pub enum GetV0DEResultKind { + /// The attempt to get the DE succeeded. + /// The associated payload may be obtained via + /// `GetV0DEResult#into_success`. + Success = 0, + /// The attempt to get the DE failed, + /// possibly due to the requested index being + /// out-of-bounds or due to the advertisement + /// having been previously deallocated. + Error = 1, +} + +/// The result of `V0Payload#get_de`. +#[repr(C)] +#[allow(missing_docs)] +pub enum GetV0DEResult { + Success(V0DataElement), + Error, +} + +impl FfiEnum for GetV0DEResult { + type Kind = GetV0DEResultKind; + fn kind(&self) -> Self::Kind { + match self { + GetV0DEResult::Success(_) => GetV0DEResultKind::Success, + GetV0DEResult::Error => GetV0DEResultKind::Error, + } + } +} + +impl GetV0DEResult { + declare_enum_cast! {into_success, Success, V0DataElement} +} + +/// Discriminant for `V0DataElement`. +#[repr(u8)] +pub enum V0DataElementKind { + /// A transmission Power (Tx Power) data-element. + /// The associated payload may be obtained via + /// `V0DataElement#into_tx_power`. + TxPower = 0, + /// The Actions data-element. + /// The associated payload may be obtained via + /// `V0DataElement#into_actions`. + Actions = 1, +} + +/// Representation of a V0 data element. +#[repr(C)] +#[allow(missing_docs)] +#[derive(Clone)] +pub enum V0DataElement { + TxPower(TxPower), + Actions(V0Actions), +} + +impl<F: np_adv::legacy::PacketFlavor> From<np_adv::legacy::deserialize::PlainDataElement<F>> + for V0DataElement +{ + fn from(de: np_adv::legacy::deserialize::PlainDataElement<F>) -> Self { + use np_adv::legacy::deserialize::PlainDataElement; + match de { + PlainDataElement::Actions(x) => V0DataElement::Actions(x.into()), + PlainDataElement::TxPower(x) => V0DataElement::TxPower(x.into()), + } + } +} + +impl FfiEnum for V0DataElement { + type Kind = V0DataElementKind; + fn kind(&self) -> Self::Kind { + match self { + V0DataElement::Actions(_) => V0DataElementKind::Actions, + V0DataElement::TxPower(_) => V0DataElementKind::TxPower, + } + } +} + +impl V0DataElement { + declare_enum_cast! {into_tx_power, TxPower, TxPower} + declare_enum_cast! {into_actions, Actions, V0Actions} +} + +/// Representation of a transmission power, +/// as used for the Tx Power DE in V0 and V1. +#[derive(Clone)] +#[repr(C)] +pub struct TxPower { + tx_power: i8, +} + +impl TxPower { + /// Yields this Tx Power value as an i8. + pub fn as_i8(&self) -> i8 { + self.tx_power + } +} + +impl From<np_adv_de::TxPowerDataElement> for TxPower { + fn from(de: np_adv_de::TxPowerDataElement) -> Self { + Self { tx_power: de.tx_power_value() } + } +} + +/// Representation of the Actions DE in V0. +#[derive(Clone)] +#[repr(C)] +pub enum V0Actions { + /// A set of action bits which were present in a plaintext identity advertisement + Plaintext(V0ActionBits), + /// A set of action bits which were present in a encrypted identity advertisement + Encrypted(V0ActionBits), +} + +impl<F: np_adv::legacy::PacketFlavor> From<np_adv::legacy::actions::ActionsDataElement<F>> + for V0Actions +{ + fn from(value: ActionsDataElement<F>) -> Self { + match F::ENUM_VARIANT { + PacketFlavorEnum::Plaintext => { + Self::Plaintext(V0ActionBits { bitfield: value.as_u32() }) + } + PacketFlavorEnum::Ciphertext => { + Self::Encrypted(V0ActionBits { bitfield: value.as_u32() }) + } + } + } +} + +#[repr(C)] +#[derive(Clone)] +/// The bitfield data of a VOActions data element +pub struct V0ActionBits { + bitfield: u32, +} + +#[allow(missing_docs)] +#[repr(u8)] +/// The possible boolean action types which can be present in an Actions data element +pub enum BooleanActionType { + ActiveUnlock = 8, + NearbyShare = 9, + InstantTethering = 10, + PhoneHub = 11, + PresenceManager = 12, + Finder = 13, + FastPairSass = 14, +} + +impl From<&BooleanActionType> for np_adv::legacy::actions::ActionType { + fn from(value: &BooleanActionType) -> Self { + match value { + BooleanActionType::ActiveUnlock => np_adv::legacy::actions::ActionType::ActiveUnlock, + BooleanActionType::NearbyShare => np_adv::legacy::actions::ActionType::NearbyShare, + BooleanActionType::InstantTethering => { + np_adv::legacy::actions::ActionType::InstantTethering + } + BooleanActionType::PhoneHub => np_adv::legacy::actions::ActionType::PhoneHub, + BooleanActionType::Finder => np_adv::legacy::actions::ActionType::Finder, + BooleanActionType::FastPairSass => np_adv::legacy::actions::ActionType::FastPairSass, + BooleanActionType::PresenceManager => { + np_adv::legacy::actions::ActionType::PresenceManager + } + } + } +} + +/// Error returned if action bits inside of a V0Actions struct are invalid. If the struct was +/// created by the np_adv deserializer, the bits will always be valid, they are only invalid if a +/// user reaches in and changes them to something invalid. +#[derive(Debug)] +pub struct InvalidActionBits; + +impl V0Actions { + /// Gets the V0 Action bits as represented by a u32 where the last 8 bits are + /// always 0 since V0 actions can only hold up to 24 bits. + pub fn as_u32(&self) -> u32 { + match self { + V0Actions::Plaintext(bits) => bits.bitfield, + V0Actions::Encrypted(bits) => bits.bitfield, + } + } + + /// Return whether a boolean action type is set in this data element + #[allow(clippy::expect_used)] + pub fn has_action(&self, action_type: &BooleanActionType) -> Result<bool, InvalidActionBits> { + match self { + V0Actions::Plaintext(action_bits) => { + let bits = np_adv::legacy::actions::ActionBits::<Plaintext>::try_from( + action_bits.bitfield, + ) + .map_err(|_| InvalidActionBits)?; + + let actions_de = np_adv::legacy::actions::ActionsDataElement::from(bits); + Ok(actions_de + .has_action(&action_type.into()) + .expect("BooleanActionType only has one bit")) + } + V0Actions::Encrypted(action_bits) => { + let bits = np_adv::legacy::actions::ActionBits::<Ciphertext>::try_from( + action_bits.bitfield, + ) + .map_err(|_| InvalidActionBits)?; + + let actions_de = np_adv::legacy::actions::ActionsDataElement::from(bits); + Ok(actions_de + .has_action(&action_type.into()) + .expect("BooleanActionType only has one bit")) + } + } + } + + /// Return the context sequence number from this data element + #[allow(clippy::expect_used)] + pub fn get_context_sync_seq_num(&self) -> Result<u8, InvalidActionBits> { + match self { + V0Actions::Plaintext(action_bits) => { + let bits = np_adv::legacy::actions::ActionBits::<Plaintext>::try_from( + action_bits.bitfield, + ) + .map_err(|_| InvalidActionBits)?; + + let actions_de = np_adv::legacy::actions::ActionsDataElement::from(bits); + Ok(actions_de.context_sync_seq_num().as_u8()) + } + V0Actions::Encrypted(action_bits) => { + let bits = np_adv::legacy::actions::ActionBits::<Ciphertext>::try_from( + action_bits.bitfield, + ) + .map_err(|_| InvalidActionBits)?; + let actions_de = np_adv::legacy::actions::ActionsDataElement::from(bits); + Ok(actions_de.context_sync_seq_num().as_u8()) + } + } + } +}
diff --git a/nearby/presence/np_ffi_core/src/deserialize/v1.rs b/nearby/presence/np_ffi_core/src/deserialize/v1.rs new file mode 100644 index 0000000..9b4a3f4 --- /dev/null +++ b/nearby/presence/np_ffi_core/src/deserialize/v1.rs
@@ -0,0 +1,401 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +//! Core NP Rust FFI structures and methods for v1 advertisement deserialization. + +use crate::common::*; +use crate::credentials::credential_book::CredentialBook; +use crate::utils::*; +use alloc::vec::Vec; +use array_view::ArrayView; +use handle_map::{declare_handle_map, HandleLike, HandleMapDimensions, HandleMapFullError}; + +/// Representation of a deserialized V1 advertisement +#[repr(C)] +pub struct DeserializedV1Advertisement { + num_legible_sections: u8, + num_undecryptable_sections: u8, + legible_sections: LegibleV1Sections, +} + +impl DeserializedV1Advertisement { + /// Gets the number of legible sections in this deserialized V1 advertisement. + pub fn num_legible_sections(&self) -> u8 { + self.num_legible_sections + } + + /// Gets the number of undecryptable sections in this deserialized V1 advertisement. + pub fn num_undecryptable_sections(&self) -> u8 { + self.num_undecryptable_sections + } + + /// Gets the legible section with the given index + /// (which is bounded in `0..self.num_legible_sections()`) + pub fn get_section(&self, legible_section_index: u8) -> GetV1SectionResult { + match self.legible_sections.get() { + Ok(sections_read_guard) => { + sections_read_guard.get_section(self.legible_sections, legible_section_index) + } + Err(_) => GetV1SectionResult::Error, + } + } + + /// Attempts to deallocate memory utilized internally by this V1 advertisement + /// (which contains a handle to actual advertisement contents behind-the-scenes). + pub fn deallocate(self) -> DeallocateResult { + self.legible_sections.deallocate().map(|_| ()).into() + } + + pub(crate) fn allocate_with_contents<'m, M: np_adv::credential::MatchedCredential<'m>>( + contents: np_adv::V1AdvContents<'m, M>, + ) -> Result<Self, HandleMapFullError> { + // 16-section limit enforced by np_adv + let num_undecryptable_sections = contents.invalid_sections_count() as u8; + let legible_sections = contents.into_valid_sections(); + let num_legible_sections = legible_sections.len() as u8; + let legible_sections = LegibleV1Sections::allocate_with_contents(legible_sections)?; + Ok(Self { num_undecryptable_sections, num_legible_sections, legible_sections }) + } +} + +/// Internal, Rust-side implementation of a listing of legible sections +/// in a deserialized V1 advertisement +pub struct LegibleV1SectionsInternals { + sections: Vec<DeserializedV1SectionInternals>, +} + +impl LegibleV1SectionsInternals { + fn get_section_internals( + &self, + legible_section_index: u8, + ) -> Option<&DeserializedV1SectionInternals> { + self.sections.get(legible_section_index as usize) + } + fn get_section( + &self, + legible_sections_handle: LegibleV1Sections, + legible_section_index: u8, + ) -> GetV1SectionResult { + match self.get_section_internals(legible_section_index) { + Some(section_ref) => { + // Determine whether the section is plaintext + // or decrypted to report back to the caller, + // and also determine the number of contained DEs. + let num_des = section_ref.num_des(); + let identity_tag = section_ref.identity_kind(); + GetV1SectionResult::Success(DeserializedV1Section { + legible_sections_handle, + legible_section_index, + num_des, + identity_tag, + }) + } + None => GetV1SectionResult::Error, + } + } +} + +impl<'m, M: np_adv::credential::MatchedCredential<'m>> + From<Vec<np_adv::V1DeserializedSection<'m, M>>> for LegibleV1SectionsInternals +{ + fn from(contents: Vec<np_adv::V1DeserializedSection<'m, M>>) -> Self { + let sections = contents.into_iter().map(DeserializedV1SectionInternals::from).collect(); + Self { sections } + } +} + +fn get_legible_v1_sections_handle_map_dimensions() -> HandleMapDimensions { + HandleMapDimensions { + num_shards: global_num_shards(), + max_active_handles: global_max_num_deserialized_v1_advertisements(), + } +} + +declare_handle_map! {legible_v1_sections, LegibleV1Sections, super::LegibleV1SectionsInternals, super::get_legible_v1_sections_handle_map_dimensions() } +use legible_v1_sections::LegibleV1Sections; + +impl LocksLongerThan<LegibleV1Sections> for CredentialBook {} + +impl LegibleV1Sections { + pub(crate) fn allocate_with_contents<'m, M: np_adv::credential::MatchedCredential<'m>>( + contents: Vec<np_adv::V1DeserializedSection<'m, M>>, + ) -> Result<Self, HandleMapFullError> { + Self::allocate(move || LegibleV1SectionsInternals::from(contents)) + } +} + +/// Discriminant for `GetV1SectionResult` +#[derive(Clone, Copy)] +#[repr(u8)] +pub enum GetV1SectionResultKind { + /// The attempt to get the section failed, + /// possibly due to the section index being + /// out-of-bounds or due to the underlying + /// advertisement having already been deallocated. + Error = 0, + /// The attempt to get the section succeeded. + /// The wrapped section may be obtained via + /// `GetV1SectionResult#into_success`. + Success = 1, +} + +/// The result of attempting to get a particular V1 section +/// from its' index within the list of legible sections +/// via `DeserializedV1Advertisement::get_section`. +#[repr(C)] +#[allow(missing_docs)] +pub enum GetV1SectionResult { + Error, + Success(DeserializedV1Section), +} + +impl FfiEnum for GetV1SectionResult { + type Kind = GetV1SectionResultKind; + fn kind(&self) -> Self::Kind { + match self { + GetV1SectionResult::Error => GetV1SectionResultKind::Error, + GetV1SectionResult::Success(_) => GetV1SectionResultKind::Success, + } + } +} + +impl GetV1SectionResult { + declare_enum_cast! {into_success, Success, DeserializedV1Section} +} + +/// The internal FFI-friendly representation of a deserialized v1 section +pub struct DeserializedV1SectionInternals { + des: Vec<V1DataElement>, + identity: DeserializedV1Identity, +} + +impl DeserializedV1SectionInternals { + /// Gets the number of data-elements in this section. + fn num_des(&self) -> u8 { + self.des.len() as u8 + } + /// Gets the enum tag of the identity used for this section. + fn identity_kind(&self) -> DeserializedV1IdentityKind { + self.identity.kind() + } + /// Attempts to get the DE with the given index in this section. + fn get_de(&self, index: u8) -> GetV1DEResult { + match self.des.get(index as usize) { + Some(de) => GetV1DEResult::Success(de.clone()), + None => GetV1DEResult::Error, + } + } +} + +impl<'m, M: np_adv::credential::MatchedCredential<'m>> From<np_adv::V1DeserializedSection<'m, M>> + for DeserializedV1SectionInternals +{ + fn from(section: np_adv::V1DeserializedSection<'m, M>) -> Self { + use np_adv::extended::deserialize::Section; + use np_adv::V1DeserializedSection; + match section { + V1DeserializedSection::Plaintext(section) => { + let des = section.data_elements().map(V1DataElement::from).collect(); + let identity = DeserializedV1Identity::Plaintext; + Self { des, identity } + } + V1DeserializedSection::Decrypted(_) => { + unimplemented!(); + } + } + } +} +/// Discriminant for `DeserializedV1Identity`. +#[derive(Clone, Copy)] +#[repr(u8)] +pub enum DeserializedV1IdentityKind { + /// The deserialized v1 identity was plaintext + Plaintext = 0, + /// The deserialized v1 identity corresponded + /// to some kind of decrypted identity. + Decrypted = 1, +} + +/// Deserialized information about the identity +/// employed in a V1 adveritsement section. +#[derive(Clone, Copy)] +#[repr(C)] +#[allow(missing_docs)] +pub enum DeserializedV1Identity { + Plaintext, + // TODO: This gets a payload once we support creds + Decrypted, +} + +impl FfiEnum for DeserializedV1Identity { + type Kind = DeserializedV1IdentityKind; + fn kind(&self) -> Self::Kind { + match self { + DeserializedV1Identity::Plaintext => DeserializedV1IdentityKind::Plaintext, + DeserializedV1Identity::Decrypted => DeserializedV1IdentityKind::Decrypted, + } + } +} + +/// Handle to a deserialized V1 section +#[repr(C)] +pub struct DeserializedV1Section { + legible_sections_handle: LegibleV1Sections, + legible_section_index: u8, + num_des: u8, + identity_tag: DeserializedV1IdentityKind, +} + +impl DeserializedV1Section { + /// Gets the number of data elements contained in this section. + /// Suitable as an iteration bound on `Self::get_de`. + pub fn num_des(&self) -> u8 { + self.num_des + } + + /// Gets the enum tag of the identity employed by this deserialized section. + pub fn identity_kind(&self) -> DeserializedV1IdentityKind { + self.identity_tag + } + + /// Gets the DE with the given index in this section. + pub fn get_de(&self, de_index: u8) -> GetV1DEResult { + // TODO: Once the `FromResidual` trait is stabilized, this can be simplified. + match self.legible_sections_handle.get() { + Ok(legible_sections_read_guard) => { + match legible_sections_read_guard.get_section_internals(self.legible_section_index) + { + Some(section_ref) => section_ref.get_de(de_index), + None => GetV1DEResult::Error, + } + } + Err(_) => GetV1DEResult::Error, + } + } +} + +/// Discriminant for the `GetV1DEResult` enum. +#[derive(Clone, Copy)] +#[repr(u8)] +pub enum GetV1DEResultKind { + /// Attempting to get the DE at the given position failed, + /// possibly due to the index being out-of-bounds or due + /// to the whole advertisement having been previously deallocated. + Error = 0, + /// Attempting to get the DE at the given position succeeded. + /// The underlying DE may be extracted with `GetV1DEResult#into_success`. + Success = 1, +} + +/// Represents the result of the `DeserializedV1Section#get_de` operation. +#[repr(C)] +#[allow(missing_docs)] +pub enum GetV1DEResult { + Error, + Success(V1DataElement), +} + +impl FfiEnum for GetV1DEResult { + type Kind = GetV1DEResultKind; + fn kind(&self) -> Self::Kind { + match self { + GetV1DEResult::Error => GetV1DEResultKind::Error, + GetV1DEResult::Success(_) => GetV1DEResultKind::Success, + } + } +} + +impl GetV1DEResult { + declare_enum_cast! {into_success, Success, V1DataElement} +} + +/// FFI-transmissible representation of a V1 data-element +#[derive(Clone)] +#[repr(C)] +pub enum V1DataElement { + /// A "generic" V1 data-element, for which we have no + /// particular information about its schema (just + /// a DE type code and a byte payload.) + Generic(GenericV1DataElement), +} + +impl V1DataElement { + // Note: not using declare_enum_cast! for this one, because if V1DataElement + // gets more variants, this will have a different internal implementation + /// Converts a `V1DataElement` to a `GenericV1DataElement` which + /// only maintains information about the DE's type-code and payload. + pub fn to_generic(self) -> GenericV1DataElement { + match self { + V1DataElement::Generic(x) => x, + } + } +} + +impl<'a> From<np_adv::extended::deserialize::DataElement<'a>> for V1DataElement { + fn from(de: np_adv::extended::deserialize::DataElement<'a>) -> Self { + let de_type = V1DEType::from(de.de_type()); + let contents_as_slice = de.contents(); + //Guaranteed not to panic due DE size limit. + #[allow(clippy::unwrap_used)] + let array_view: ArrayView<u8, 127> = ArrayView::try_from_slice(contents_as_slice).unwrap(); + let payload = ByteBuffer::from_array_view(array_view); + Self::Generic(GenericV1DataElement { de_type, payload }) + } +} + +/// FFI-transmissible representation of a generic V1 data-element. +/// This representation is stable, and so you may directly +/// reference this struct's fields if you wish. +#[derive(Clone)] +#[repr(C)] +pub struct GenericV1DataElement { + /// The DE type code of this generic data-element. + pub de_type: V1DEType, + /// The raw data-element byte payload, up to + /// 127 bytes in length. + pub payload: ByteBuffer<127>, +} + +impl GenericV1DataElement { + /// Gets the DE-type of this generic V1 data element. + pub fn de_type(&self) -> V1DEType { + self.de_type + } + /// Destructures this `GenericV1DataElement` into just the + /// DE payload byte-buffer. + pub fn into_payload(self) -> ByteBuffer<127> { + self.payload + } +} + +/// Representation of the data-element type tag +/// of a V1 data element. +#[derive(Clone, Copy)] +#[repr(C)] +pub struct V1DEType { + code: u32, +} + +impl From<np_adv::extended::de_type::DeType> for V1DEType { + fn from(de_type: np_adv::extended::de_type::DeType) -> Self { + let code = de_type.as_u32(); + Self { code } + } +} + +impl V1DEType { + /// Yields this V1 DE type code as a u32. + pub fn to_u32(&self) -> u32 { + self.code + } +}
diff --git a/nearby/presence/np_ffi_core/src/lib.rs b/nearby/presence/np_ffi_core/src/lib.rs new file mode 100644 index 0000000..dd9e49e --- /dev/null +++ b/nearby/presence/np_ffi_core/src/lib.rs
@@ -0,0 +1,32 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +//! Core functionality common to all NP Rust FFI layers +#![cfg_attr(not(feature = "std"), no_std)] +#![forbid(unsafe_code)] +#![deny( + missing_docs, + clippy::indexing_slicing, + clippy::unwrap_used, + clippy::panic, + clippy::expect_used +)] + +extern crate alloc; +extern crate core; + +#[macro_use] +pub mod utils; +pub mod common; +pub mod credentials; +pub mod deserialize;
diff --git a/nearby/presence/np_ffi_core/src/utils.rs b/nearby/presence/np_ffi_core/src/utils.rs new file mode 100644 index 0000000..e547a89 --- /dev/null +++ b/nearby/presence/np_ffi_core/src/utils.rs
@@ -0,0 +1,51 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +//! Common utilities used by other modules within this crate. + +use handle_map::HandleLike; + +/// Type-level predicate for handle types which uniformly hold a lock +/// for longer than some other handle type in API calls. +pub(crate) trait LocksLongerThan<H: HandleLike>: HandleLike {} + +/// Trait which canonicalizes the relationship between FFI +/// tagged-unions and their tags +pub trait FfiEnum { + /// The [FFI-safe] type of tags used to identify + /// variants of this tagged union. + type Kind; + + /// Returns the tag for this FFI-safe tagged union. + fn kind(&self) -> Self::Kind; +} + +/// Declares a method of the given name which attempts to cast +/// the enclosing enum to the payload held under the given +/// variant name, yielding a result of the given type wrapped +/// in an `Option::Some`. +/// +/// If the enclosing enum turns out to not be the requested +/// variant, the generated method will return `None`. +macro_rules! declare_enum_cast { + ($projection_method_name:ident, $variant_enum_name:ident, $variant_type_name:ty) => { + #[doc = concat!("Attempts to cast `self` to the `", stringify!($variant_enum_name), + "` variant, returning `None` in the \ncase where the passed value is of a different enum variant.")] + pub fn $projection_method_name(self) -> Option<$variant_type_name> { + match self { + Self::$variant_enum_name(x) => Some(x), + _ => None, + } + } + } +}
diff --git a/nearby/presence/sink/Cargo.toml b/nearby/presence/sink/Cargo.toml new file mode 100644 index 0000000..a0322b6 --- /dev/null +++ b/nearby/presence/sink/Cargo.toml
@@ -0,0 +1,12 @@ +[package] +name = "sink" +version.workspace = true +edition.workspace = true +publish.workspace = true + +[dependencies] +tinyvec.workspace = true + +[features] +std = [] +
diff --git a/nearby/presence/sink/src/lib.rs b/nearby/presence/sink/src/lib.rs new file mode 100644 index 0000000..75c7c1d --- /dev/null +++ b/nearby/presence/sink/src/lib.rs
@@ -0,0 +1,91 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! A no_std-friendly data-writing "sink" trait which allows for convenient expression +//! of "write me into a limited-size buffer"-type methods on traits. +#![cfg_attr(not(feature = "std"), no_std)] +#![forbid(unsafe_code)] +#![deny( + missing_docs, + clippy::indexing_slicing, + clippy::unwrap_used, + clippy::panic, + clippy::expect_used +)] + +/// An append-only, limited-size collection. +pub trait Sink<T> { + /// Returns `Some` if the slice was appended, `None` otherwise, in which case nothing was written + fn try_extend_from_slice(&mut self, items: &[T]) -> Option<()>; + + /// Returns `Some` if the item could be pushed, `None` otherwise + fn try_push(&mut self, item: T) -> Option<()>; + + /// Uses the given [`SinkWriter`] to write to this sink. + fn try_extend_from_writer<W: SinkWriter<DataType = T>>(&mut self, writer: W) -> Option<()> + where + Self: Sized, + { + writer.write_payload(self) + } +} + +/// A use-once trait (like `FnOnce`) which represents some +/// code which writes data to a [`Sink`]. +pub trait SinkWriter { + /// The type of data being written to the [`Sink`]. + type DataType; + + /// Returns `Some` if all data was successfully written to the [`Sink`], + /// but if doing so failed at any point, returns `None`. If this method + /// fails, the contents of the [`Sink`] should be considered to be invalid. + fn write_payload<S: Sink<Self::DataType> + ?Sized>(self, sink: &mut S) -> Option<()>; +} + +impl<T, A> Sink<T> for tinyvec::ArrayVec<A> +where + A: tinyvec::Array<Item = T>, + T: Clone, +{ + fn try_extend_from_slice(&mut self, items: &[T]) -> Option<()> { + if items.len() > (self.capacity() - self.len()) { + return None; + } + // won't panic: just checked the length + self.extend_from_slice(items); + Some(()) + } + + fn try_push(&mut self, item: T) -> Option<()> { + // tinyvec uses None to indicate success, whereas for our limited purposes we want the + // opposite + match tinyvec::ArrayVec::try_push(self, item) { + None => Some(()), + Some(_) => None, + } + } +} + +#[cfg(feature = "std")] +impl<T: Clone> Sink<T> for std::vec::Vec<T> { + fn try_extend_from_slice(&mut self, items: &[T]) -> Option<()> { + self.extend_from_slice(items); + Some(()) + } + + fn try_push(&mut self, item: T) -> Option<()> { + self.push(item); + Some(()) + } +}
diff --git a/nearby/presence/xts_aes/fuzz/Cargo.lock b/nearby/presence/xts_aes/fuzz/Cargo.lock index 2bdaef3..f0b7f56 100644 --- a/nearby/presence/xts_aes/fuzz/Cargo.lock +++ b/nearby/presence/xts_aes/fuzz/Cargo.lock
@@ -4,9 +4,9 @@ [[package]] name = "aead" -version = "0.5.1" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c192eb8f11fc081b0fe4259ba5af04217d4e0faddd02417310a927911abd7c8" +checksum = "d122413f284cf2d62fb1b7db97e02edb8cda96d769b16e443a4f6195e35662b0" dependencies = [ "bytes", "crypto-common", @@ -15,9 +15,9 @@ [[package]] name = "aes" -version = "0.8.2" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "433cfd6710c9986c576a25ca913c39d66a6474107b406f34f91d4a8923395241" +checksum = "ac1f845298e95f983ff1944b728ae08b8cebab80d684f0a832ed0fc74dfa27e2" dependencies = [ "cfg-if", "cipher", @@ -69,9 +69,9 @@ [[package]] name = "block-padding" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a90ec2df9600c28a01c56c4784c9207a96d2451833aeceb8cc97e4c9548bb78" +checksum = "a8894febbff9f758034a5b8e12d87918f56dfc64a8e1fe757d65e29041538d93" dependencies = [ "generic-array", ] @@ -118,24 +118,24 @@ [[package]] name = "const-oid" -version = "0.9.2" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "520fbf3c07483f94e3e3ca9d0cfd913d7718ef2483d2cfd91c0d9e91474ab913" +checksum = "795bc6e66a8e340f075fcf6227e417a2dc976b92b91f3cdc778bb858778b6747" [[package]] name = "cpufeatures" -version = "0.2.5" +version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28d997bd5e24a5928dd43e46dc529867e207907fe0b239c3477d924f7f2ca320" +checksum = "a17b76ff3a4162b0b27f354a0c87015ddad39d35f9c0c36607a3bdd175dde1f1" dependencies = [ "libc", ] [[package]] name = "crypto-bigint" -version = "0.5.1" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c2538c4e68e52548bacb3e83ac549f903d44f011ac9d5abb5e132e67d0808f7" +checksum = "cf4c2f4e1afd912bc40bfd6fed5d9dc1f288e0ba01bfcc835cc5bc3eb13efe15" dependencies = [ "generic-array", "rand_core", @@ -193,23 +193,36 @@ [[package]] name = "curve25519-dalek" -version = "4.0.0-rc.2" +version = "4.0.0-rc.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03d928d978dbec61a1167414f5ec534f24bea0d7a0d24dd9b6233d3d8223e585" +checksum = "436ace70fc06e06f7f689d2624dc4e2f0ea666efb5aa704215f7249ae6e047a7" dependencies = [ "cfg-if", + "cpufeatures", + "curve25519-dalek-derive", "digest", "fiat-crypto", - "packed_simd_2", "platforms", + "rustc_version", "subtle", ] [[package]] -name = "der" -version = "0.7.1" +name = "curve25519-dalek-derive" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc906908ea6458456e5eaa160a9c08543ec3d1e6f71e2235cedd660cb65f9df0" +checksum = "83fdaf97f4804dcebfa5862639bc9ce4121e82140bec2a987ac5140294865b5b" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "der" +version = "0.7.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c7ed52955ce76b1554f509074bb357d3fb8ac9b51288a65a3fd480d1dfba946" dependencies = [ "const-oid", "zeroize", @@ -217,9 +230,9 @@ [[package]] name = "derive_arbitrary" -version = "1.3.0" +version = "1.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3cdeb9ec472d588e539a818b2dee436825730da08ad0017c4b1a17676bdc8b7" +checksum = "53e0efad4403bfc52dc201159c4b842a246a14b98c64b55dfd0f2d89729dfeb8" dependencies = [ "proc-macro2", "quote", @@ -228,9 +241,9 @@ [[package]] name = "digest" -version = "0.10.6" +version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8168378f4e5023e7218c89c891c0fd8ecdb5e5e4f18cb78f38cf245dd021e76f" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ "block-buffer", "crypto-common", @@ -248,9 +261,9 @@ [[package]] name = "ed25519-dalek" -version = "2.0.0-rc.2" +version = "2.0.0-rc.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "798f704d128510932661a3489b08e3f4c934a01d61c5def59ae7b8e48f19665a" +checksum = "faa8e9049d5d72bfc12acbc05914731b5322f79b5e2f195e9f2d705fca22ab4c" dependencies = [ "curve25519-dalek", "ed25519", @@ -260,9 +273,9 @@ [[package]] name = "elliptic-curve" -version = "0.13.2" +version = "0.13.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ea5a92946e8614bb585254898bb7dd1ddad241ace60c52149e3765e34cc039d" +checksum = "968405c8fdc9b3bf4df0a6638858cc0b52462836ab6b1c87377785dd09cf1c0b" dependencies = [ "base16ct", "crypto-bigint", @@ -295,9 +308,9 @@ [[package]] name = "generic-array" -version = "0.14.6" +version = "0.14.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bff49e947297f3312447abdca79f45f4738097cc82b06e72054d2223f601f1b9" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" dependencies = [ "typenum", "version_check", @@ -306,9 +319,9 @@ [[package]] name = "getrandom" -version = "0.2.8" +version = "0.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c05aeb6a22b8f62540c194aac980f2115af067bfe15a0734d7277a768d396b31" +checksum = "be4136b2a15dd319360be1c07d9933517ccf0be8f16bf62a3bee4f0d618df427" dependencies = [ "cfg-if", "libc", @@ -372,9 +385,9 @@ [[package]] name = "libc" -version = "0.2.140" +version = "0.2.147" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99227334921fae1a979cf0bfdfcc6b3e5ce376ef57e16fb6fb3ea2ed6095f80c" +checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3" [[package]] name = "libfuzzer-sys" @@ -388,16 +401,10 @@ ] [[package]] -name = "libm" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fc7aa29613bd6a620df431842069224d8bc9011086b1db4c0e0cd47fa03ec9a" - -[[package]] name = "once_cell" -version = "1.17.1" +version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7e5500299e16ebb147ae15a00a942af264cf3688f47923b8fc2cd5858f23ad3" +checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" [[package]] name = "opaque-debug" @@ -407,25 +414,15 @@ [[package]] name = "p256" -version = "0.13.0" +version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7270da3e5caa82afd3deb054cc237905853813aea3859544bc082c3fe55b8d47" +checksum = "c9863ad85fa8f4460f9c48cb909d38a0d689dba1f6f6988a5e3e0d31071bcd4b" dependencies = [ "elliptic-curve", "primeorder", ] [[package]] -name = "packed_simd_2" -version = "0.3.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1914cd452d8fccd6f9db48147b29fd4ae05bea9dc5d9ad578509f72415de282" -dependencies = [ - "cfg-if", - "libm", -] - -[[package]] name = "platforms" version = "3.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -433,9 +430,9 @@ [[package]] name = "polyval" -version = "0.6.0" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ef234e08c11dfcb2e56f79fd70f6f2eb7f025c0ce2333e82f4f0518ecad30c6" +checksum = "d52cff9d1d4dee5fe6d03729099f4a310a41179e0a10dbf542039873f2e826fb" dependencies = [ "cfg-if", "cpufeatures", @@ -451,27 +448,27 @@ [[package]] name = "primeorder" -version = "0.13.0" +version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7613fdcc0831c10060fa69833ea8fa2caa94b6456f51e25356a885b530a2e3d0" +checksum = "3c2fcef82c0ec6eefcc179b978446c399b3cdf73c392c35604e399eee6df1ee3" dependencies = [ "elliptic-curve", ] [[package]] name = "proc-macro2" -version = "1.0.53" +version = "1.0.66" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba466839c78239c09faf015484e5cc04860f88242cff4d03eb038f04b4699b73" +checksum = "18fb31db3f9bddb2ea821cde30a9f70117e3f119938b5ee630b7403aa6e2ead9" dependencies = [ "unicode-ident", ] [[package]] name = "quote" -version = "1.0.26" +version = "1.0.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4424af4bf778aae2051a77b60283332f386554255d722233d09fbfc7e30da2fc" +checksum = "5fe8a65d69dd0808184ebb5f836ab526bb259db23c657efa38711b1072ee47f0" dependencies = [ "proc-macro2", ] @@ -505,10 +502,19 @@ ] [[package]] -name = "sec1" -version = "0.7.1" +name = "rustc_version" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48518a2b5775ba8ca5b46596aae011caa431e6ce7e4a67ead66d92f08884220e" +checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" +dependencies = [ + "semver", +] + +[[package]] +name = "sec1" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" dependencies = [ "base16ct", "der", @@ -518,10 +524,16 @@ ] [[package]] -name = "sha2" -version = "0.10.6" +name = "semver" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82e6b795fe2e3b1e845bafcb27aa35405c4d47cdfc92af5fc8d3002f76cebdc0" +checksum = "b0293b4b29daaf487284529cc2f5675b8e57c61f70167ba415a463651fd6a918" + +[[package]] +name = "sha2" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "479fb9d862239e610720565ca91403019f2f00410f1864c5aa7479b950a76ed8" dependencies = [ "cfg-if", "cpufeatures", @@ -536,15 +548,15 @@ [[package]] name = "subtle" -version = "2.4.1" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" +checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" [[package]] name = "syn" -version = "1.0.109" +version = "2.0.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +checksum = "45c3457aacde3c65315de5031ec191ce46604304d2446e803d71ade03308d970" dependencies = [ "proc-macro2", "quote", @@ -559,15 +571,15 @@ [[package]] name = "unicode-ident" -version = "1.0.8" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5464a87b239f13a63a501f2701565754bae92d243d4bb7eb12f6d57d2269bf4" +checksum = "301abaae475aa91687eb82514b328ab47a211a533026cb25fc3e519b86adfc3c" [[package]] name = "universal-hash" -version = "0.5.0" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d3160b73c9a19f7e2939a2fdad446c57c1bbbbf4d919d3213ff1267a580d8b5" +checksum = "fc1de2c688dc15305988b563c3854064043356019f97a4b46276fe734c4f07ea" dependencies = [ "crypto-common", "subtle", @@ -587,9 +599,9 @@ [[package]] name = "x25519-dalek" -version = "2.0.0-rc.2" +version = "2.0.0-rc.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fabd6e16dd08033932fc3265ad4510cc2eab24656058a6dcb107ffe274abcc95" +checksum = "ec7fae07da688e17059d5886712c933bb0520f15eff2e09cfa18e30968f4e63a" dependencies = [ "curve25519-dalek", "rand_core", @@ -618,6 +630,6 @@ [[package]] name = "zeroize" -version = "1.5.7" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c394b5bd0c6f669e7275d9c20aa90ae064cb22e75a1cad54e1b34088034b149f" +checksum = "2a0956f1ba7c7909bfb66c2e9e4124ab6f6482560f6628b5aaeba39207c9aad9"
diff --git a/nearby/src/ffi.rs b/nearby/src/ffi.rs index e0efce5..44479be 100644 --- a/nearby/src/ffi.rs +++ b/nearby/src/ffi.rs
@@ -15,8 +15,32 @@ use crate::{run_cmd_shell, run_cmd_shell_with_color, YellowStderr}; use std::{fs, path}; +// wrapper for checking all ffi related things +pub fn check_everything(root: &path::Path) -> anyhow::Result<()> { + check_np_ffi(root)?; + check_ldt_ffi(root)?; + check_cmake_projects(root)?; + + Ok(()) +} + +pub fn check_np_ffi(root: &path::Path) -> anyhow::Result<()> { + log::info!("Checking np_c_ffi cargo build"); + let mut ffi_dir = root.to_path_buf(); + ffi_dir.push("presence/np_c_ffi"); + for cargo_cmd in [ + "fmt --check", + // Default build, RustCrypto + no_std + "build --release", + "clippy --release", + ] { + run_cmd_shell(&ffi_dir, format!("cargo {}", cargo_cmd))?; + } + Ok(()) +} + pub fn check_ldt_ffi(root: &path::Path) -> anyhow::Result<()> { - log::info!("Checking LDT ffi"); + log::info!("Checking LFT ffi cargo build"); let mut ffi_dir = root.to_path_buf(); ffi_dir.push("presence/ldt_np_adv_ffi"); @@ -43,6 +67,11 @@ run_cmd_shell(&ffi_dir, format!("cargo {}", cargo_cmd))?; } + Ok(()) +} + +pub fn check_cmake_projects(root: &path::Path) -> anyhow::Result<()> { + log::info!("Checking CMake build and tests (for ffi c/c++ code)"); let mut build_dir = root.to_path_buf(); build_dir.push("presence/cmake-build"); fs::create_dir_all(&build_dir)?; @@ -50,8 +79,18 @@ run_cmd_shell_with_color::<YellowStderr>(&build_dir, "cmake .. -DENABLE_TESTS=true")?; run_cmd_shell_with_color::<YellowStderr>(&build_dir, "cmake --build .")?; - let mut tests_dir = build_dir; - tests_dir.push("ldt_np_c_sample/tests"); + // run the np_cpp_ffi unit tests + let mut np_cpp_tests_dir = build_dir.clone(); + np_cpp_tests_dir.push("np_cpp_ffi/tests"); + run_cmd_shell_with_color::<YellowStderr>(&np_cpp_tests_dir, "ctest")?; + + // Run the LDT ffi unit tests. These are rebuilt and tested against all of the different + // Cargo build configurations based on the feature flags. + let mut ldt_tests_dir = build_dir.clone(); + ldt_tests_dir.push("ldt_np_c_sample/tests"); + + let mut ldt_ffi_crate_dir = root.to_path_buf(); + ldt_ffi_crate_dir.push("presence/ldt_np_adv_ffi"); for build_config in [ // test with default build settings (rustcrypto, no_std) @@ -65,9 +104,11 @@ // test without defaults and std feature flag "build --no-default-features --features std --release", ] { - run_cmd_shell(&ffi_dir, format!("cargo {}", build_config))?; - run_cmd_shell_with_color::<YellowStderr>(&tests_dir, "cmake --build .")?; - run_cmd_shell_with_color::<YellowStderr>(&tests_dir, "ctest")?; + run_cmd_shell(&ldt_ffi_crate_dir, format!("cargo {}", build_config))?; + // Force detection of updated `ldt_np_adv_ffi` static lib + run_cmd_shell_with_color::<YellowStderr>(&build_dir, "rm -rf ldt_np_c_sample/tests/*")?; + run_cmd_shell_with_color::<YellowStderr>(&build_dir, "cmake --build .")?; + run_cmd_shell_with_color::<YellowStderr>(&ldt_tests_dir, "ctest")?; } Ok(())
diff --git a/nearby/src/license.rs b/nearby/src/license.rs index fd9af83..657a62e 100644 --- a/nearby/src/license.rs +++ b/nearby/src/license.rs
@@ -94,5 +94,10 @@ "**/Session.vim", "**/*.properties", "**/third_party/**", + "**/*.png", + "**/*.ico", + "**/node_modules/**", + "**/.angular/**", + "**/.editorconfig", ] }
diff --git a/nearby/src/main.rs b/nearby/src/main.rs index b7d002b..4c1104f 100644 --- a/nearby/src/main.rs +++ b/nearby/src/main.rs
@@ -37,6 +37,11 @@ ); match cli.subcommand { + Subcommand::CheckEverything { ref check_options, ref bssl_options } => { + check_everything(&root_dir, check_options, bssl_options)? + } + Subcommand::CheckWorkspace(ref options) => check_workspace(&root_dir, options)?, + Subcommand::FfiCheckEverything => ffi::check_everything(&root_dir)?, Subcommand::BuildBoringssl(ref bssl_options) => { crypto_ffi::build_boringssl(&root_dir, bssl_options)? } @@ -49,13 +54,11 @@ Subcommand::BuildFfiFuzzers => fuzzers::build_ffi_fuzzers(&root_dir)?, Subcommand::CheckLicenseHeaders => license::check_license_headers(&root_dir)?, Subcommand::AddLicenseHeaders => license::add_license_headers(&root_dir)?, - Subcommand::CheckWorkspace(ref options) => check_workspace(&root_dir, options)?, Subcommand::CheckLdtFfi => ffi::check_ldt_ffi(&root_dir)?, - Subcommand::CheckEverything { ref check_options, ref bssl_options } => { - check_everything(&root_dir, check_options, bssl_options)? - } Subcommand::CheckUkey2Ffi => ukey2::check_ukey2_ffi(&root_dir)?, Subcommand::CheckLdtJni => jni::check_ldt_jni(&root_dir)?, + Subcommand::CheckNpFfi => ffi::check_np_ffi(&root_dir)?, + Subcommand::CheckCmakeProjects => ffi::check_cmake_projects(&root_dir)?, } Ok(()) @@ -95,7 +98,7 @@ check_workspace(root, check_options)?; crypto_ffi::check_boringssl(root, bssl_options)?; crypto_ffi::check_openssl(root)?; - ffi::check_ldt_ffi(root)?; + ffi::check_everything(root)?; jni::check_ldt_jni(root)?; ukey2::check_ukey2_ffi(root)?; fuzzers::run_rust_fuzzers(root)?; @@ -112,6 +115,15 @@ #[derive(clap::Subcommand, Debug, Clone)] enum Subcommand { + /// Checks everything in beto-rust + CheckEverything { + #[command(flatten)] + check_options: CheckOptions, + #[command(flatten)] + bssl_options: BuildBoringSslOptions, + }, + /// Checks everything included in the top level workspace + CheckWorkspace(CheckOptions), /// Clones boringssl and uses bindgen to generate the rust crate BuildBoringssl(BuildBoringSslOptions), /// Run crypto provider tests using boringssl backend @@ -125,21 +137,19 @@ RunRustFuzzers, /// Build FFI fuzzers BuildFfiFuzzers, - /// Builds and runs all tests for all combinations of features for the LDT FFI + /// Builds and runs tests for all C/C++ projects. This is a combination of CheckNpFfi, + /// CheckLdtFfi, and CheckCmakeBuildAndTests + FfiCheckEverything, + /// Builds the crate checks the cbindgen generation of C/C++ bindings + CheckNpFfi, + /// Builds ldt_np_adv_ffi crate with all possible different sets of feature flags CheckLdtFfi, + /// Checks the CMake build and runs all of the C/C++ tests + CheckCmakeProjects, /// Checks the workspace 3rd party crates and makes sure they have a valid license CheckLicenseHeaders, /// Generate new headers for any files that are missing them AddLicenseHeaders, - /// Checks everything included in the top level workspace - CheckWorkspace(CheckOptions), - /// Checks everything in beto-rust - CheckEverything { - #[command(flatten)] - check_options: CheckOptions, - #[command(flatten)] - bssl_options: BuildBoringSslOptions, - }, /// Builds and runs tests for the UKEY2 FFI CheckUkey2Ffi, /// Checks the build of ldt_jni wrapper with non default features, ie rust-openssl, and boringssl
diff --git a/nearby/src/ukey2.rs b/nearby/src/ukey2.rs index c54fbb3..f0e1081 100644 --- a/nearby/src/ukey2.rs +++ b/nearby/src/ukey2.rs
@@ -34,7 +34,7 @@ ffi_build_dir.push("cpp/build"); fs::create_dir_all(&ffi_build_dir)?; run_cmd_shell_with_color::<YellowStderr>(&ffi_build_dir, "cmake ..")?; - run_cmd_shell_with_color::<YellowStderr>(&ffi_build_dir, "make all")?; + run_cmd_shell_with_color::<YellowStderr>(&ffi_build_dir, "cmake --build .")?; run_cmd_shell_with_color::<YellowStderr>(&ffi_build_dir, "ctest")?; Ok(())