Project import generated by Copybara. GitOrigin-RevId: ff7f011e248298e524dcbf6e4177114052b284f7 Change-Id: I631bd0d1a9736e80966d2abe6511eed7a270a2a5
diff --git a/.gitmodules b/.gitmodules index 937bff2..ed737f5 100644 --- a/.gitmodules +++ b/.gitmodules
@@ -7,3 +7,6 @@ [submodule "third_party/boringssl"] path = third_party/boringssl url = https://boringssl.googlesource.com/boringssl +[submodule "third_party/fuzztest"] + path = third_party/fuzztest + url = https://github.com/google/fuzztest.git
diff --git a/nearby/.cargo/config-boringssl.toml b/nearby/.cargo/config-boringssl.toml deleted file mode 100644 index 2bde6df..0000000 --- a/nearby/.cargo/config-boringssl.toml +++ /dev/null
@@ -1,9 +0,0 @@ -# The packages to override -paths = [ - "../third_party/boringssl/rust/bssl-sys", - "../boringssl-build/rust-openssl/openssl", - "../boringssl-build/rust-openssl/openssl-sys", -] - -[env] -WORKSPACE_DIR = { value = "", relative = true }
diff --git a/nearby/Cargo.lock b/nearby/Cargo.lock index 813de5f..46d9066 100644 --- a/nearby/Cargo.lock +++ b/nearby/Cargo.lock
@@ -69,12 +69,6 @@ ] [[package]] -name = "aliasable" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "250f629c0161ad8107cf89319e990051fae62832fd343083bea452d93e2205fd" - -[[package]] name = "android-tzdata" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -97,16 +91,15 @@ [[package]] name = "anstream" -version = "0.3.2" +version = "0.6.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ca84f3628370c59db74ee214b3263d58f9aadd9b4fe7e711fd87dc452b7f163" +checksum = "96b09b5178381e0874812a9b157f7fe84982617e48f71f4e3235482775e5b540" dependencies = [ "anstyle", "anstyle-parse", "anstyle-query", "anstyle-wincon", "colorchoice", - "is-terminal", "utf8parse", ] @@ -136,19 +129,19 @@ [[package]] name = "anstyle-wincon" -version = "1.0.1" +version = "3.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "180abfa45703aebe0093f79badacc01b8fd4ea2e35118747e5811127f926e188" +checksum = "1cd54b81ec8d6180e24654d0b371ad22fc3dd083b6ff8ba325b72e00c87660a7" dependencies = [ "anstyle", - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] name = "anyhow" -version = "1.0.72" +version = "1.0.80" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b13c32d80ecc7ab747b80c3784bce54ee8a7a0cc4fbda9bf4cda2cf6fe90854" +checksum = "5ad32ce52e4161730f7098c077cd2ed6229b5804ccf99e5366be1ab72a98b4e1" [[package]] name = "array_ref" @@ -183,15 +176,9 @@ [[package]] name = "base64" -version = "0.13.1" +version = "0.21.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" - -[[package]] -name = "base64" -version = "0.21.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "604178f6c5c21f02dc555784810edfb88d34ac2c73b2eae109655649ee73ce3d" +checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" [[package]] name = "base64ct" @@ -207,9 +194,9 @@ [[package]] name = "bitflags" -version = "2.3.3" +version = "2.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "630be753d4e58660abd17930c71b647fe46c27ea6b63cc59e1e3851406972e42" +checksum = "ed570934406eb16438a4e976b1b4500774099c13b8cb96eec99f620f05090ddf" [[package]] name = "blake2" @@ -240,9 +227,9 @@ [[package]] name = "bssl-crypto" -version = "0.1.0" +version = "0.2.0" dependencies = [ - "bssl-sys 0.1.0", + "bssl-sys", ] [[package]] @@ -250,12 +237,6 @@ version = "0.1.0" [[package]] -name = "bssl-sys" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "312d12393c060384f2e6ed14c7b4be37b3dd90249857485613c1a91b9a1abb5c" - -[[package]] name = "bstr" version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -271,11 +252,12 @@ dependencies = [ "anyhow", "chrono", - "clap 4.3.19", + "clap 4.5.1", "cmd-runner", "crossbeam", "env_logger", "file-header", + "glob", "globset", "log", "owo-colors", @@ -303,9 +285,9 @@ [[package]] name = "bytes" -version = "1.4.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89b2fd2a0dcf38d7971e2194b6b6eebab45ae01067456a7fd93d5547a61b70be" +checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223" [[package]] name = "cast" @@ -323,6 +305,25 @@ ] [[package]] +name = "cbindgen" +version = "0.26.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da6bc11b07529f16944307272d5bd9b22530bc7d05751717c9d416586cedab49" +dependencies = [ + "clap 3.2.25", + "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" @@ -342,14 +343,14 @@ [[package]] name = "chrono" -version = "0.4.26" +version = "0.4.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec837a71355b28f6556dbd569b37b3f363091c0bd4b2e735674521b4c5fd9bc5" +checksum = "5bc015644b92d5890fab7489e49d21f879d5c990186827d42ec511919404f38b" dependencies = [ "android-tzdata", "iana-time-zone", "num-traits", - "winapi", + "windows-targets 0.52.3", ] [[package]] @@ -395,45 +396,47 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ea181bf566f71cb9a5d17a59e1871af638180a18fb0035c92ae62b705207123" dependencies = [ + "atty", "bitflags 1.3.2", "clap_lex 0.2.4", "indexmap", + "strsim 0.10.0", + "termcolor", "textwrap", ] [[package]] name = "clap" -version = "4.3.19" +version = "4.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fd304a20bff958a57f04c4e96a2e7594cc4490a0e809cbd48bb6437edaa452d" +checksum = "c918d541ef2913577a0f9566e9ce27cb35b6df072075769e0b26cb5a554520da" dependencies = [ "clap_builder", "clap_derive", - "once_cell", ] [[package]] name = "clap_builder" -version = "4.3.19" +version = "4.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01c6a3f08f1fe5662a35cfe393aec09c4df95f60ee93b7556505260f75eee9e1" +checksum = "9f3e7391dad68afb0c2ede1bf619f579a3dc9c2ec67f089baa397123a2f3d1eb" dependencies = [ "anstream", "anstyle", - "clap_lex 0.5.0", - "strsim", + "clap_lex 0.7.0", + "strsim 0.11.0", ] [[package]] name = "clap_derive" -version = "4.3.12" +version = "4.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54a9bb5758fc5dfe728d1019941681eccaf0cf8a4189b692a0ee2f2ecf90a050" +checksum = "307bc0538d5f0f83b8248db3087aa92fe504e4691294d0c96c0eabc33f47ba47" dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.28", + "syn 2.0.50", ] [[package]] @@ -447,9 +450,9 @@ [[package]] name = "clap_lex" -version = "0.5.0" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2da6da31387c7e4ef160ffab6d5e7f00c42626fe39aea70a7b0f1773f7dd6c1b" +checksum = "98cc8fbded0c607b7ba9dd60cd98df59af97e84d24e49c8557331cfc26d301ce" [[package]] name = "cmd-runner" @@ -477,10 +480,6 @@ ] [[package]] -name = "connections_adv" -version = "0.1.0" - -[[package]] name = "const-oid" version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -512,19 +511,19 @@ [[package]] name = "criterion" -version = "0.4.0" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7c76e09c1aae2bc52b3d2f29e13c6572553b30c4aa1b8a49fd70de6412654cb" +checksum = "f2b12d017a929603d80db1831cd3a24082f8137ce19c69e6447f54f5fc8d692f" dependencies = [ "anes", - "atty", "cast", "ciborium", - "clap 3.2.25", + "clap 4.5.1", "criterion-plot", + "is-terminal", "itertools", - "lazy_static", "num-traits", + "once_cell", "oorandom", "plotters", "rayon", @@ -641,8 +640,7 @@ version = "0.1.0" dependencies = [ "criterion", - "crypto_provider_openssl", - "crypto_provider_rustcrypto", + "crypto_provider_default", "hex-literal", "rand", "rand_ext", @@ -664,25 +662,10 @@ "cfg-if", "crypto_provider", "crypto_provider_boringssl", - "crypto_provider_openssl", "crypto_provider_rustcrypto", ] [[package]] -name = "crypto_provider_openssl" -version = "0.1.0" -dependencies = [ - "cfg-if", - "crypto_provider", - "crypto_provider_stubs", - "crypto_provider_test", - "hex-literal", - "openssl", - "ouroboros", - "rstest", -] - -[[package]] name = "crypto_provider_rustcrypto" version = "0.1.0" dependencies = [ @@ -766,7 +749,7 @@ dependencies = [ "proc-macro2", "quote", - "syn 2.0.28", + "syn 2.0.50", ] [[package]] @@ -808,15 +791,16 @@ [[package]] name = "ed25519-dalek" -version = "2.0.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7277392b266383ef8396db7fdeb1e77b6c52fed775f5df15bb24f35b72156980" +checksum = "4a3daa8e81a3963a60642bcc1f90a670680bd4a77535faa384e9d1c79d620871" dependencies = [ "curve25519-dalek", "ed25519", "rand_core 0.6.4", "serde", "sha2", + "subtle", "zeroize", ] @@ -847,9 +831,9 @@ [[package]] name = "env_logger" -version = "0.10.0" +version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85cdab6a89accf66733ad5a1693a4dcced6aeff64602b634530dd73c1f3ee9f0" +checksum = "4cd405aab171cb85d6735e5c8d9db038c17d3ca007a4d2c25f337935c3d90580" dependencies = [ "humantime", "is-terminal", @@ -860,30 +844,19 @@ [[package]] name = "errno" -version = "0.3.2" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b30f669a7961ef1631673d2766cc92f52d64f7ef354d4fe0ddfd30ed52f0f4f" +checksum = "a258e46cdc063eb8519c00b9fc845fc47bcfca4130e2f08e88665ceda8474245" dependencies = [ - "errno-dragonfly", "libc", - "windows-sys 0.48.0", -] - -[[package]] -name = "errno-dragonfly" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf" -dependencies = [ - "cc", - "libc", + "windows-sys 0.52.0", ] [[package]] name = "fastrand" -version = "2.0.0" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6999dc1837253364c2ebb0704ba97994bd874e8f195d665c50b7548f6ea92764" +checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5" [[package]] name = "ff" @@ -931,21 +904,6 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] -name = "foreign-types" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" -dependencies = [ - "foreign-types-shared", -] - -[[package]] -name = "foreign-types-shared" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" - -[[package]] name = "generic-array" version = "0.14.7" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -978,6 +936,12 @@ ] [[package]] +name = "glob" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" + +[[package]] name = "globset" version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -1024,11 +988,11 @@ [[package]] name = "hdrhistogram" -version = "7.5.2" +version = "7.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f19b9f54f7c7f55e31401bb647626ce0cf0f67b0004982ce815b3ee72a02aa8" +checksum = "765c9198f173dd59ce26ff9f95ef0aafd0a0fe01fb9d72841bc5066a4c06511d" dependencies = [ - "base64 0.13.1", + "base64", "byteorder", "crossbeam-channel", "flate2", @@ -1163,6 +1127,16 @@ checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" [[package]] +name = "java-locator" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90003f2fd9c52f212c21d8520f1128da0080bad6fff16b68fe6e7f2f0c3780c2" +dependencies = [ + "glob", + "lazy_static", +] + +[[package]] name = "jni" version = "0.21.1" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -1171,7 +1145,9 @@ "cesu8", "cfg-if", "combine", + "java-locator", "jni-sys", + "libloading", "log", "thiserror", "walkdir", @@ -1208,9 +1184,9 @@ dependencies = [ "aes", "anyhow", - "base64 0.21.2", + "base64", "blake2", - "clap 4.3.19", + "clap 4.5.1", "criterion", "crypto_provider", "crypto_provider_default", @@ -1235,11 +1211,10 @@ dependencies = [ "anyhow", "array_view", - "base64 0.21.2", + "base64", "criterion", "crypto_provider", "crypto_provider_default", - "crypto_provider_openssl", "crypto_provider_rustcrypto", "hex", "ldt", @@ -1254,6 +1229,21 @@ ] [[package]] +name = "ldt_np_adv_ffi" +version = "0.1.0" +dependencies = [ + "cfg-if", + "crypto_provider", + "crypto_provider_default", + "lazy_static", + "ldt", + "ldt_np_adv", + "np_hkdf", + "rand", + "spin 0.9.8", +] + +[[package]] name = "ldt_np_jni" version = "0.1.0" dependencies = [ @@ -1275,9 +1265,19 @@ [[package]] name = "libc" -version = "0.2.147" +version = "0.2.153" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3" +checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" + +[[package]] +name = "libloading" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b67380fd3b2fbe7527a606e18729d21c6f3951633d0500574c4dc22d2d638b9f" +dependencies = [ + "cfg-if", + "winapi", +] [[package]] name = "license" @@ -1292,9 +1292,9 @@ [[package]] name = "linux-raw-sys" -version = "0.4.3" +version = "0.4.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09fc20d2ca12cb9f044c93e3bd6d32d523e6e2ec3db4f7b2939cd99026ecd3f0" +checksum = "01cda141df6706de531b6c46c3a33ecca755538219bd484262fa09410c13539c" [[package]] name = "lock_adapter" @@ -1315,9 +1315,9 @@ [[package]] name = "log" -version = "0.4.19" +version = "0.4.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b06a4cde4c0f271a446782e3eff8de789548ce57dbc8eca9292c27f4a42004b4" +checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" [[package]] name = "memchr" @@ -1399,6 +1399,15 @@ ] [[package]] +name = "np_c_ffi" +version = "0.1.0" +dependencies = [ + "cbindgen", + "lock_adapter", + "np_ffi_core", +] + +[[package]] name = "np_ed25519" version = "0.1.0" dependencies = [ @@ -1420,6 +1429,7 @@ "ldt_np_adv", "lock_adapter", "np_adv", + "np_adv_dynamic", "np_hkdf", ] @@ -1442,9 +1452,9 @@ [[package]] name = "num-bigint" -version = "0.4.3" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f93ab6289c7b344a8a9f60f88d80aa20032336fe78da341afc91c8a2341fc75f" +checksum = "608e7659b5c3d7cba262d894801b9ec9d00de989e8a82bd4bef91d08da45cdc0" dependencies = [ "autocfg", "num-integer", @@ -1499,75 +1509,12 @@ checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" [[package]] -name = "openssl" -version = "0.10.55" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "345df152bc43501c5eb9e4654ff05f794effb78d4efe3d53abc158baddc0703d" -dependencies = [ - "bitflags 1.3.2", - "cfg-if", - "foreign-types", - "libc", - "once_cell", - "openssl-macros", - "openssl-sys", -] - -[[package]] -name = "openssl-macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.28", -] - -[[package]] -name = "openssl-sys" -version = "0.9.90" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "374533b0e45f3a7ced10fcaeccca020e66656bc03dac384f852e4e5a7a8104a6" -dependencies = [ - "bssl-sys 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "cc", - "libc", - "pkg-config", - "vcpkg", -] - -[[package]] name = "os_str_bytes" version = "6.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4d5d9eb14b174ee9aa2ef96dc2b94637a2d4b6e7cb873c7e171f0c20c6cf3eac" [[package]] -name = "ouroboros" -version = "0.17.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2ba07320d39dfea882faa70554b4bd342a5f273ed59ba7c1c6b4c840492c954" -dependencies = [ - "aliasable", - "ouroboros_macro", - "static_assertions", -] - -[[package]] -name = "ouroboros_macro" -version = "0.17.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec4c6225c69b4ca778c0aea097321a64c421cf4577b331c61b229267edabb6f8" -dependencies = [ - "heck", - "proc-macro-error", - "proc-macro2", - "quote", - "syn 2.0.28", -] - -[[package]] name = "owo-colors" version = "3.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -1594,12 +1541,6 @@ ] [[package]] -name = "pkg-config" -version = "0.3.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26072860ba924cbfa98ea39c8c19b4dd6a4a25423dbdf219c1eca91aa0cf6964" - -[[package]] name = "platforms" version = "3.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -1646,6 +1587,30 @@ ] [[package]] +name = "pourover" +version = "0.1.0" +dependencies = [ + "jni", + "pourover_macro", +] + +[[package]] +name = "pourover_macro" +version = "0.1.0" +dependencies = [ + "pourover_macro_core", +] + +[[package]] +name = "pourover_macro_core" +version = "0.1.0" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.50", +] + +[[package]] name = "ppv-lite86" version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -1661,34 +1626,10 @@ ] [[package]] -name = "proc-macro-error" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" -dependencies = [ - "proc-macro-error-attr", - "proc-macro2", - "quote", - "syn 1.0.109", - "version_check", -] - -[[package]] -name = "proc-macro-error-attr" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" -dependencies = [ - "proc-macro2", - "quote", - "version_check", -] - -[[package]] name = "proc-macro2" -version = "1.0.66" +version = "1.0.78" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18fb31db3f9bddb2ea821cde30a9f70117e3f119938b5ee630b7403aa6e2ead9" +checksum = "e2422ad645d89c99f8f3e6b88a9fdeca7fabeac836b1002371c4367c8f984aae" dependencies = [ "unicode-ident", ] @@ -1746,9 +1687,9 @@ [[package]] name = "quote" -version = "1.0.32" +version = "1.0.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50f3b39ccfb720540debaa0164757101c08ecb8d326b15358ce76a62c7e85965" +checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef" dependencies = [ "proc-macro2", ] @@ -1839,15 +1780,6 @@ ] [[package]] -name = "redox_syscall" -version = "0.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" -dependencies = [ - "bitflags 1.3.2", -] - -[[package]] name = "regex" version = "1.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -1877,6 +1809,12 @@ checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" [[package]] +name = "relative-path" +version = "1.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e898588f33fdd5b9420719948f9f2a32c922a246964576f71ba7f24f80610fbc" + +[[package]] name = "reword" version = "7.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -1887,9 +1825,9 @@ [[package]] name = "rstest" -version = "0.17.0" +version = "0.18.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de1bb486a691878cd320c2f0d319ba91eeaa2e894066d8b5f8f117c000e9d962" +checksum = "97eeab2f3c0a199bc4be135c36c924b6590b88c377d416494288c14f2db30199" dependencies = [ "rstest_macros", "rustc_version", @@ -1897,15 +1835,18 @@ [[package]] name = "rstest_macros" -version = "0.17.0" +version = "0.18.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "290ca1a1c8ca7edb7c3283bd44dc35dd54fdec6253a3912e201ba1072018fca8" +checksum = "d428f8247852f894ee1be110b375111b586d4fa431f6c46e64ba5a0dcccbe605" dependencies = [ "cfg-if", + "glob", "proc-macro2", "quote", + "regex", + "relative-path", "rustc_version", - "syn 1.0.109", + "syn 2.0.50", "unicode-ident", ] @@ -1918,7 +1859,7 @@ "quote", "rand", "rustc_version", - "syn 2.0.28", + "syn 2.0.50", ] [[package]] @@ -1932,15 +1873,15 @@ [[package]] name = "rustix" -version = "0.38.4" +version = "0.38.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a962918ea88d644592894bc6dc55acc6c0956488adcebbfb6e273506b7fd6e5" +checksum = "6ea3e1a662af26cd7a3ba09c0297a31af215563ecf42817c98df621387f4e949" dependencies = [ - "bitflags 2.3.3", + "bitflags 2.4.2", "errno", "libc", "linux-raw-sys", - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] @@ -1991,29 +1932,29 @@ [[package]] name = "serde" -version = "1.0.192" +version = "1.0.197" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bca2a08484b285dcb282d0f67b26cadc0df8b19f8c12502c13d966bf9482f001" +checksum = "3fb1c873e1b9b056a4dc4c0c198b24c3ffa059243875552b2bd0933b1aee4ce2" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.192" +version = "1.0.197" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6c7207fbec9faa48073f3e3074cbe553af6ea512d7c21ba46e434e70ea9fbc1" +checksum = "7eb0b34b42edc17f6b7cac84a52a1c5f0e1bb2227e997ca9011ea3dd34e8610b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.28", + "syn 2.0.50", ] [[package]] name = "serde_json" -version = "1.0.104" +version = "1.0.114" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "076066c5f1078eac5b722a31827a8832fe108bed65dfa75e233c89f8206e976c" +checksum = "c5f09b1bd632ef549eaa9f60a1f8de742bdbc698e6cee2095fc84dde5f549ae0" dependencies = [ "itoa", "ryu", @@ -2022,9 +1963,9 @@ [[package]] name = "sha2" -version = "0.10.7" +version = "0.10.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "479fb9d862239e610720565ca91403019f2f00410f1864c5aa7479b950a76ed8" +checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" dependencies = [ "cfg-if", "cpufeatures", @@ -2076,18 +2017,18 @@ ] [[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 = "strsim" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ee073c9e4cd00e28217186dbe12796d692868f432bf2e97ee73bed0c56dfa01" + +[[package]] name = "strum" version = "0.25.0" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -2103,7 +2044,7 @@ "proc-macro2", "quote", "rustversion", - "syn 2.0.28", + "syn 2.0.50", ] [[package]] @@ -2125,9 +2066,9 @@ [[package]] name = "syn" -version = "2.0.28" +version = "2.0.50" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04361975b3f5e348b2189d8dc55bc942f278b2d482a6a0365de5bdd62d351567" +checksum = "74f1bdc9872430ce9b75da68329d1c1746faf50ffac5f19e02b71e37ff881ffb" dependencies = [ "proc-macro2", "quote", @@ -2136,15 +2077,14 @@ [[package]] name = "tempfile" -version = "3.7.0" +version = "3.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5486094ee78b2e5038a6382ed7645bc084dc2ec433426ca4c3cb61e2007b8998" +checksum = "a365e8cd18e44762ef95d87f284f4b5cd04107fec2ff3052bd6a3e6069669e67" dependencies = [ "cfg-if", "fastrand", - "redox_syscall", "rustix", - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] @@ -2172,22 +2112,22 @@ [[package]] name = "thiserror" -version = "1.0.44" +version = "1.0.57" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "611040a08a0439f8248d1990b111c95baa9c704c805fa1f62104b39655fd7f90" +checksum = "1e45bcbe8ed29775f228095caf2cd67af7a4ccf756ebff23a306bf3e8b47b24b" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.44" +version = "1.0.57" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "090198534930841fab3a5d1bb637cde49e339654e606195f8d9c76eeb081dc96" +checksum = "a953cb265bef375dae3de6663da4d3804eee9682ea80d8e2542529b73c531c81" dependencies = [ "proc-macro2", "quote", - "syn 2.0.28", + "syn 2.0.50", ] [[package]] @@ -2207,6 +2147,15 @@ 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" @@ -2284,7 +2233,7 @@ name = "ukey2_shell" version = "0.1.0" dependencies = [ - "clap 4.3.19", + "clap 4.5.1", "crypto_provider_rustcrypto", "ukey2_connections", "ukey2_rs", @@ -2319,12 +2268,6 @@ checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" [[package]] -name = "vcpkg" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" - -[[package]] name = "version_check" version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -2367,7 +2310,7 @@ "once_cell", "proc-macro2", "quote", - "syn 2.0.28", + "syn 2.0.50", "wasm-bindgen-shared", ] @@ -2389,7 +2332,7 @@ dependencies = [ "proc-macro2", "quote", - "syn 2.0.28", + "syn 2.0.50", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -2480,6 +2423,15 @@ ] [[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.3", +] + +[[package]] name = "windows-targets" version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -2510,6 +2462,21 @@ ] [[package]] +name = "windows-targets" +version = "0.52.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d380ba1dc7187569a8a9e91ed34b8ccfc33123bbacb8c0aed2d1ad7f3ef2dc5f" +dependencies = [ + "windows_aarch64_gnullvm 0.52.3", + "windows_aarch64_msvc 0.52.3", + "windows_i686_gnu 0.52.3", + "windows_i686_msvc 0.52.3", + "windows_x86_64_gnu 0.52.3", + "windows_x86_64_gnullvm 0.52.3", + "windows_x86_64_msvc 0.52.3", +] + +[[package]] name = "windows_aarch64_gnullvm" version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -2522,6 +2489,12 @@ checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc" [[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68e5dcfb9413f53afd9c8f86e56a7b4d86d9a2fa26090ea2dc9e40fba56c6ec6" + +[[package]] name = "windows_aarch64_msvc" version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -2534,6 +2507,12 @@ checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3" [[package]] +name = "windows_aarch64_msvc" +version = "0.52.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8dab469ebbc45798319e69eebf92308e541ce46760b49b18c6b3fe5e8965b30f" + +[[package]] name = "windows_i686_gnu" version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -2546,6 +2525,12 @@ checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241" [[package]] +name = "windows_i686_gnu" +version = "0.52.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a4e9b6a7cac734a8b4138a4e1044eac3404d8326b6c0f939276560687a033fb" + +[[package]] name = "windows_i686_msvc" version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -2558,6 +2543,12 @@ checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00" [[package]] +name = "windows_i686_msvc" +version = "0.52.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28b0ec9c422ca95ff34a78755cfa6ad4a51371da2a5ace67500cf7ca5f232c58" + +[[package]] name = "windows_x86_64_gnu" version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -2570,6 +2561,12 @@ checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1" [[package]] +name = "windows_x86_64_gnu" +version = "0.52.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "704131571ba93e89d7cd43482277d6632589b18ecf4468f591fbae0a8b101614" + +[[package]] name = "windows_x86_64_gnullvm" version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -2582,6 +2579,12 @@ checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953" [[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42079295511643151e98d61c38c0acc444e52dd42ab456f7ccfd5152e8ecf21c" + +[[package]] name = "windows_x86_64_msvc" version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -2594,12 +2597,18 @@ checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" [[package]] +name = "windows_x86_64_msvc" +version = "0.52.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0770833d60a970638e989b3fa9fd2bb1aaadcf88963d1659fd7d9990196ed2d6" + +[[package]] name = "wycheproof" version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e639f57253b80c6584b378011aec0fed61c4c21d7a4b97c4d9d7eaf35ca77d12" dependencies = [ - "base64 0.21.2", + "base64", "hex", "serde", "serde_json", @@ -2632,7 +2641,7 @@ "aes", "anyhow", "array_ref", - "base64 0.21.2", + "base64", "crypto_provider", "crypto_provider_default", "hex",
diff --git a/nearby/Cargo.toml b/nearby/Cargo.toml index 774e1d8..301fe34 100644 --- a/nearby/Cargo.toml +++ b/nearby/Cargo.toml
@@ -1,6 +1,5 @@ [workspace] members = [ - "connections/connections_adv/connections_adv", "connections/ukey2/ukey2", "connections/ukey2/ukey2_connections", "connections/ukey2/ukey2_c_ffi", @@ -8,7 +7,6 @@ "connections/ukey2/ukey2_proto", "connections/ukey2/ukey2_shell", "crypto/crypto_provider", - "crypto/crypto_provider_openssl", "crypto/crypto_provider_rustcrypto", "crypto/crypto_provider_stubs", "crypto/crypto_provider_test", @@ -17,10 +15,12 @@ "presence/array_view", "presence/ldt", "presence/ldt_np_adv", + "presence/ldt_np_adv_ffi", "presence/ldt_np_jni", "presence/ldt_tbc", "presence/np_adv", "presence/np_adv_dynamic", + "presence/np_c_ffi", "presence/np_ed25519", "presence/np_ffi_core", "presence/np_hkdf", @@ -30,15 +30,14 @@ "presence/xts_aes", "util/lock_adapter", "util/handle_map", + "util/pourover", + "util/pourover_macro", + "util/pourover_macro_core", ] -# 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 -# 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.lints.rust] @@ -56,14 +55,12 @@ panic = "deny" expect_used = "deny" - [workspace.dependencies] # local crates array_ref = { path = "presence/array_ref" } array_view = { path = "presence/array_view" } crypto_provider = { path = "crypto/crypto_provider", default-features = false } -crypto_provider_default = { path = "crypto/crypto_provider_default", default-features = false } -crypto_provider_openssl = { path = "crypto/crypto_provider_openssl" } +crypto_provider_default = { path = "crypto/crypto_provider_default", default-features=false} crypto_provider_boringssl = { path = "crypto/crypto_provider_boringssl" } crypto_provider_rustcrypto = { path = "crypto/crypto_provider_rustcrypto" } crypto_provider_stubs = { path = "crypto/crypto_provider_stubs" } @@ -83,64 +80,70 @@ np_adv_dynamic = { path = "presence/np_adv_dynamic" } np_ed25519 = { path = "presence/np_ed25519" } np_ffi_core = { path = "presence/np_ffi_core" } +pourover = { path = "util/pourover" } +pourover_macro = { path = "util/pourover_macro" } +pourover_macro_core = { path = "util/pourover_macro_core" } sink = { path = "presence/sink" } # from crates.io rand = { version = "0.8.5", default-features = false } rand_core = { version = "0.6.4", features = ["getrandom"] } rand_pcg = "0.3.1" -sha2 = { version = "0.10.6", default-features = false } -aes = "0.8.2" +sha2 = { version = "0.10.8", default-features = false } +aes = "0.8.3" cbc = { version = "0.1.2", features = ["block-padding"] } -ctr = "0.9.1" +ctr = "0.9.2" hkdf = "0.12.3" hmac = "0.12.1" -ed25519-dalek = { version = "2.0.0", default-features = false } -ed25519 = "2.2.0" +ed25519-dalek = { version = "2.1.0", default-features = false } +ed25519 = "2.2.3" aes-gcm = "0.10.3" hex = "0.4.3" -serde = { version = "1.0.189" } -serde_json = { version = "1.0.96", features = [ +serde = { version = "1.0.193" } +serde_json = { version = "1.0.108", features = [ "alloc", ], default-features = false } -base64 = "0.21.0" +base64 = "0.21.5" x25519-dalek = { version = "2.0.0", default-features = false } subtle = { version = "2.5.0", default-features = false } rand_chacha = { version = "0.3.1", default-features = false } p256 = { version = "0.13.2", default-features = false } -sec1 = "0.7.2" -protobuf = "3.2.0" -protobuf-codegen = "3.2.0" -reqwest = { version = "0.11.19", default-features = false, features = ["blocking", "rustls-tls"] } +sec1 = "0.7.3" +protobuf = "=3.2.0" +protobuf-codegen = "=3.2.0" +reqwest = { version = "0.11.22", default-features = false, features = ["blocking", "rustls-tls"] } jni = "0.21.1" lock_api = "0.4.11" 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"] } +anyhow = "1.0.75" +log = "0.4.20" +env_logger = "0.10.1" +criterion = { version = "0.5.1", features = ["html_reports"] } +clap = { version = "4.4.11", features = ["derive"] } lazy_static = { version = "1.4.0", features = ["spin_no_std"] } 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.32.0", features = ["full"] } +blake2 = "0.10.6" +hdrhistogram = "7.5.4" +regex = "1.10.2" +tokio = { version = "1.35.0", features = ["full"] } xts-mode = "0.5.1" -rstest = { version = "0.17.0", default-features = false } +rstest = { version = "0.18.2", default-features = false } rstest_reuse = "0.6.0" wycheproof = "0.5.1" -chrono = { version = "0.4.26", default-features = false, features = ["clock"] } -tempfile = "3.5.0" -thiserror = "1.0.40" +chrono = { version = "0.4.31", default-features = false, features = ["clock"] } +tempfile = "3.8.1" +thiserror = "1.0.51" tinyvec = { version = "1.6.0", features = ["rustc_1_55"] } -mlua = "0.8.8" -strum = { version = "0.25.0", default-features=false } -strum_macros = { version = "0.25.3", default-features=false } +mlua = "0.9.2" +strum = { version = "0.25.0", default-features = false } +strum_macros = { version = "0.25.3", default-features = false } owo-colors = "3.5.0" rhai = { version = "1.16.3", features = ["sync"] } +cbindgen = "0.26.0" +syn = { version = "2.0", features = ["full"] } +proc-macro2 = "1.0" +quote = "1.0" [workspace.package] version = "0.1.0" @@ -175,13 +178,14 @@ [dependencies] clap.workspace = true -cmd-runner = { path = "../cmd-runner" } +cmd-runner = { path = "../cmd-runner" } anyhow.workspace = true shell-escape = "0.1.5" owo-colors.workspace = true semver = "1.0.17" walkdir = "2.3.3" globset = "0.4.10" +glob = "0.3.1" crossbeam = "0.8.2" chrono.workspace = true thiserror.workspace = true
diff --git a/nearby/connections/connections_adv/connections_adv/Cargo.toml b/nearby/connections/connections_adv/connections_adv/Cargo.toml deleted file mode 100644 index 2b0710d..0000000 --- a/nearby/connections/connections_adv/connections_adv/Cargo.toml +++ /dev/null
@@ -1,8 +0,0 @@ -[package] -name = "connections_adv" -version.workspace = true -edition.workspace = true -publish.workspace = true - -[lints] -workspace = true \ No newline at end of file
diff --git a/nearby/connections/ukey2/ukey2/Cargo.toml b/nearby/connections/ukey2/ukey2/Cargo.toml index 161c5b4..35de144 100644 --- a/nearby/connections/ukey2/ukey2/Cargo.toml +++ b/nearby/connections/ukey2/ukey2/Cargo.toml
@@ -10,7 +10,6 @@ [features] default = [] test_rustcrypto = ["crypto_provider_default/rustcrypto"] -test_openssl = ["crypto_provider_default/openssl"] test_boringssl = ["crypto_provider_default/boringssl"] [dependencies] @@ -19,7 +18,7 @@ ukey2_proto.workspace = true log.workspace = true -num-bigint = "0.4.3" +num-bigint = "0.4.4" [dev-dependencies] rand = { workspace = true, features = ["std_rng", "getrandom"] }
diff --git a/nearby/connections/ukey2/ukey2_c_ffi/Cargo.toml b/nearby/connections/ukey2/ukey2_c_ffi/Cargo.toml index 182ecf2..f302119 100644 --- a/nearby/connections/ukey2/ukey2_c_ffi/Cargo.toml +++ b/nearby/connections/ukey2/ukey2_c_ffi/Cargo.toml
@@ -19,7 +19,6 @@ [features] default = ["rustcrypto", "std"] std = ["lock_adapter/std"] -openssl = ["crypto_provider_default/openssl", "std"] boringssl = ["crypto_provider_default/boringssl", "std"] rustcrypto = ["crypto_provider_default/rustcrypto"]
diff --git a/nearby/connections/ukey2/ukey2_connections/Cargo.toml b/nearby/connections/ukey2/ukey2_connections/Cargo.toml index e7884c4..5c9622b 100644 --- a/nearby/connections/ukey2/ukey2_connections/Cargo.toml +++ b/nearby/connections/ukey2/ukey2_connections/Cargo.toml
@@ -11,7 +11,6 @@ default = [] test_boringssl = ["crypto_provider_default/boringssl"] test_rustcrypto = ["crypto_provider_default/rustcrypto"] -test_openssl = ["crypto_provider_default/openssl"] [dependencies] ukey2_rs = { path = "../ukey2" } @@ -19,8 +18,8 @@ crypto_provider.workspace = true rand = { workspace = true, features = ["std", "std_rng"] } ukey2_proto.workspace = true -nom = { version = "7.1.1", features = ["alloc"] } -bytes = "1.2.1" +nom = { version = "7.1.3", features = ["alloc"] } +bytes = "1.5.0" criterion.workspace = true [dev-dependencies]
diff --git a/nearby/connections/ukey2/ukey2_connections/fuzz/Cargo.lock b/nearby/connections/ukey2/ukey2_connections/fuzz/Cargo.lock index b4e08bd..df37761 100644 --- a/nearby/connections/ukey2/ukey2_connections/fuzz/Cargo.lock +++ b/nearby/connections/ukey2/ukey2_connections/fuzz/Cargo.lock
@@ -55,9 +55,9 @@ [[package]] name = "aho-corasick" -version = "1.0.2" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43f6cb1bf222025340178f382c426f13757b2960e89779dfcb319c32542a5a41" +checksum = "b2969dcb958b36655471fc61f7e416fa76033bdd4bfed0678d8fee1e2d07a1f0" dependencies = [ "memchr", ] @@ -69,32 +69,27 @@ checksum = "4b46cbb362ab8752921c97e041f5e366ee6297bd428a31275b9fcf1e380f7299" [[package]] -name = "anyhow" -version = "1.0.72" +name = "anstyle" +version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b13c32d80ecc7ab747b80c3784bce54ee8a7a0cc4fbda9bf4cda2cf6fe90854" +checksum = "8901269c6307e8d93993578286ac0edf7f195079ffff5ebdeea6a59ffb7e36bc" + +[[package]] +name = "anyhow" +version = "1.0.79" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "080e9890a082662b09c1ad45f567faeeb47f22b5fb23895fbe1e651e718e25ca" [[package]] name = "arbitrary" -version = "1.3.0" +version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2d098ff73c1ca148721f37baad5ea6a465a13f9573aba8641fbbbae8164a54e" +checksum = "7d5a26814d8dcb93b0e5a0ff3c6d80a8843bafb21b39e8e18a6f05471870e110" dependencies = [ "derive_arbitrary", ] [[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" @@ -108,9 +103,9 @@ [[package]] name = "bitflags" -version = "1.3.2" +version = "2.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" +checksum = "ed570934406eb16438a4e976b1b4500774099c13b8cb96eec99f620f05090ddf" [[package]] name = "block-buffer" @@ -132,15 +127,15 @@ [[package]] name = "bumpalo" -version = "3.13.0" +version = "3.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3e2c3daef883ecc1b5d58c15adae93470a91d425f3532ba1695849656af3fc1" +checksum = "7f30e7476521f6f8af1a1c4c0b8cc94f0bee37d91763d0ca2665f299b6cd8aec" [[package]] name = "bytes" -version = "1.4.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89b2fd2a0dcf38d7971e2194b6b6eebab45ae01067456a7fd93d5547a61b70be" +checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223" [[package]] name = "cast" @@ -159,11 +154,12 @@ [[package]] name = "cc" -version = "1.0.79" +version = "1.0.83" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50d30906286121d95be3d479533b458f87493b30a4b5f79a607db8f5d11aa91f" +checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" dependencies = [ "jobserver", + "libc", ] [[package]] @@ -174,9 +170,9 @@ [[package]] name = "ciborium" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "effd91f6c78e5a4ace8a5d3c0b6bfaec9e2baaef55f3efc00e45fb2e477ee926" +checksum = "42e69ffd6f0917f5c029256a24d0161db17cea3997d185db0d35926308770f0e" dependencies = [ "ciborium-io", "ciborium-ll", @@ -185,15 +181,15 @@ [[package]] name = "ciborium-io" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdf919175532b369853f5d5e20b26b43112613fd6fe7aee757e35f7a44642656" +checksum = "05afea1e0a06c9be33d539b876f1ce3692f4afea2cb41f740e7743225ed1c757" [[package]] name = "ciborium-ll" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "defaa24ecc093c77630e6c15e17c51f5e187bf35ee514f4e2d67baaa96dae22b" +checksum = "57663b653d948a338bfb3eeba9bb2fd5fcfaecb9e199e87e1eda4d9e8b240fd9" dependencies = [ "ciborium-io", "half", @@ -211,55 +207,59 @@ [[package]] name = "clap" -version = "3.2.25" +version = "4.4.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ea181bf566f71cb9a5d17a59e1871af638180a18fb0035c92ae62b705207123" +checksum = "1e578d6ec4194633722ccf9544794b71b1385c3c027efe0c55db226fc880865c" dependencies = [ - "bitflags", + "clap_builder", +] + +[[package]] +name = "clap_builder" +version = "4.4.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4df4df40ec50c46000231c914968278b1eb05098cf8f1b3a518a95030e71d1c7" +dependencies = [ + "anstyle", "clap_lex", - "indexmap", - "textwrap", ] [[package]] name = "clap_lex" -version = "0.2.4" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2850f2f5a82cbf437dd5af4d49848fbdfc27c157c3d010345776f952765261c5" -dependencies = [ - "os_str_bytes", -] +checksum = "702fc72eb24e5a1e48ce58027a675bc24edd52096d5397d4aea7c6dd9eca0bd1" [[package]] name = "const-oid" -version = "0.9.4" +version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "795bc6e66a8e340f075fcf6227e417a2dc976b92b91f3cdc778bb858778b6747" +checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" [[package]] name = "cpufeatures" -version = "0.2.9" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a17b76ff3a4162b0b27f354a0c87015ddad39d35f9c0c36607a3bdd175dde1f1" +checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" dependencies = [ "libc", ] [[package]] name = "criterion" -version = "0.4.0" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7c76e09c1aae2bc52b3d2f29e13c6572553b30c4aa1b8a49fd70de6412654cb" +checksum = "f2b12d017a929603d80db1831cd3a24082f8137ce19c69e6447f54f5fc8d692f" dependencies = [ "anes", - "atty", "cast", "ciborium", "clap", "criterion-plot", + "is-terminal", "itertools", - "lazy_static", "num-traits", + "once_cell", "oorandom", "plotters", "rayon", @@ -282,53 +282,41 @@ ] [[package]] -name = "crossbeam-channel" -version = "0.5.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a33c2bf77f2df06183c3aa30d1e96c0695a313d4f9c453cc3762a6db39f99200" -dependencies = [ - "cfg-if", - "crossbeam-utils", -] - -[[package]] name = "crossbeam-deque" -version = "0.8.3" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce6fd6f855243022dcecf8702fef0c297d4338e226845fe067f6341ad9fa0cef" +checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d" dependencies = [ - "cfg-if", "crossbeam-epoch", "crossbeam-utils", ] [[package]] name = "crossbeam-epoch" -version = "0.9.15" +version = "0.9.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae211234986c545741a7dc064309f67ee1e5ad243d0e48335adc0484d960bcc7" +checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" dependencies = [ - "autocfg", - "cfg-if", "crossbeam-utils", - "memoffset", - "scopeguard", ] [[package]] name = "crossbeam-utils" -version = "0.8.16" +version = "0.8.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a22b2d63d4d1dc0b7f1b6b2747dd0088008a9be28b6ddf0b1e7d335e3037294" -dependencies = [ - "cfg-if", -] +checksum = "248e3bacc7dc6baa3b21e405ee045c3047101a49145e7e9eca583ab4c2ca5345" + +[[package]] +name = "crunchy" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" [[package]] name = "crypto-bigint" -version = "0.5.2" +version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf4c2f4e1afd912bc40bfd6fed5d9dc1f288e0ba01bfcc835cc5bc3eb13efe15" +checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" dependencies = [ "generic-array", "rand_core", @@ -390,9 +378,9 @@ [[package]] name = "curve25519-dalek" -version = "4.0.0" +version = "4.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f711ade317dd348950a9910f81c5947e3d8907ebd2b83f76203ff1807e6a2bc2" +checksum = "0a677b8922c94e01bdbb12126b0bc852f00447528dee1782229af9c720c3f348" dependencies = [ "cfg-if", "cpufeatures", @@ -406,9 +394,9 @@ [[package]] name = "curve25519-dalek-derive" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83fdaf97f4804dcebfa5862639bc9ce4121e82140bec2a987ac5140294865b5b" +checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" dependencies = [ "proc-macro2", "quote", @@ -417,9 +405,9 @@ [[package]] name = "der" -version = "0.7.7" +version = "0.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c7ed52955ce76b1554f509074bb357d3fb8ac9b51288a65a3fd480d1dfba946" +checksum = "fffa369a668c8af7dbf8b5e56c9f744fbd399949ed171606040001947de40b1c" dependencies = [ "const-oid", "zeroize", @@ -427,9 +415,9 @@ [[package]] name = "derive_arbitrary" -version = "1.3.1" +version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53e0efad4403bfc52dc201159c4b842a246a14b98c64b55dfd0f2d89729dfeb8" +checksum = "67e77553c4162a157adbf834ebae5b415acbecbeafc7a74b0e886657506a7611" dependencies = [ "proc-macro2", "quote", @@ -449,36 +437,37 @@ [[package]] name = "ed25519" -version = "2.2.1" +version = "2.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fb04eee5d9d907f29e80ee6b0e78f7e2c82342c63e3580d8c4f69d9d5aad963" +checksum = "115531babc129696a58c64a4fef0a8bf9e9698629fb97e9e40767d235cfbcd53" dependencies = [ "signature", ] [[package]] name = "ed25519-dalek" -version = "2.0.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7277392b266383ef8396db7fdeb1e77b6c52fed775f5df15bb24f35b72156980" +checksum = "4a3daa8e81a3963a60642bcc1f90a670680bd4a77535faa384e9d1c79d620871" dependencies = [ "curve25519-dalek", "ed25519", "rand_core", "sha2", + "subtle", ] [[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.5" +version = "0.13.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "968405c8fdc9b3bf4df0a6638858cc0b52462836ab6b1c87377785dd09cf1c0b" +checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" dependencies = [ "base16ct", "crypto-bigint", @@ -495,33 +484,19 @@ [[package]] name = "errno" -version = "0.3.1" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4bcfec3a70f97c962c307b2d2c56e358cf1d00b558d74262b5f929ee8cc7e73a" +checksum = "a258e46cdc063eb8519c00b9fc845fc47bcfca4130e2f08e88665ceda8474245" 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" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be" -dependencies = [ - "instant", -] +checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5" [[package]] name = "ff" @@ -535,9 +510,9 @@ [[package]] name = "fiat-crypto" -version = "0.1.20" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e825f6987101665dea6ec934c09ec6d721de7bc1bf92248e1d5810c8cd636b77" +checksum = "1676f435fc1dadde4d03e43f5d62b259e1ce5f40bd4ffb21db2b42ebe59c1382" [[package]] name = "generic-array" @@ -552,9 +527,9 @@ [[package]] name = "getrandom" -version = "0.2.10" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be4136b2a15dd319360be1c07d9933517ccf0be8f16bf62a3bee4f0d618df427" +checksum = "190092ea657667030ac6a35e305e62fc4dd69fd98ac98631e5d3a2b1575a12b5" dependencies = [ "cfg-if", "libc", @@ -584,9 +559,13 @@ [[package]] name = "half" -version = "1.8.2" +version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eabb4a44450da02c90444cf74558da904edde8fb4e9035a9a6a4e15445af0bd7" +checksum = "bc52e53916c08643f1b56ec082790d1e86a32e58dc5268f897f313fbae7b4872" +dependencies = [ + "cfg-if", + "crunchy", +] [[package]] name = "hashbrown" @@ -596,24 +575,15 @@ [[package]] name = "hermit-abi" -version = "0.1.19" +version = "0.3.5" 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" +checksum = "d0c62115964e08cb8039170eb33c1d0e2388a256930279edca206fff675f82c3" [[package]] name = "hkdf" -version = "0.12.3" +version = "0.12.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "791a029f6b9fc27657f6f188ec6e5e43f6911f6f878e0dc5501396e09809d437" +checksum = "7b5f8eb2ad728638ea2c7d47a21db23b7b58a72ed6a38256b8a1849f15fbbdf7" dependencies = [ "hmac", ] @@ -628,6 +598,15 @@ ] [[package]] +name = "home" +version = "0.5.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3d1354bf6b7235cb4a0576c2619fd4ed18183f689b12b006a0ee7329eeff9a5" +dependencies = [ + "windows-sys", +] + +[[package]] name = "indexmap" version = "1.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -648,22 +627,13 @@ ] [[package]] -name = "instant" -version = "0.1.12" +name = "is-terminal" +version = "0.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" +checksum = "0bad00257d07be169d870ab665980b06cdb366d792ad690bf2e76876dc503455" 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", + "hermit-abi", + "rustix", "windows-sys", ] @@ -678,45 +648,39 @@ [[package]] name = "itoa" -version = "1.0.9" +version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" +checksum = "b1a46d1a171d865aa5f83f92695765caa047a9b4cbae2cbf37dbd613a793fd4c" [[package]] name = "jobserver" -version = "0.1.26" +version = "0.1.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "936cfd212a0155903bcbc060e316fb6cc7cbf2e1907329391ebadc1fe0ce77c2" +checksum = "8c37f63953c4c63420ed5fd3d6d398c719489b9f872b9fa683262f8edd363c7d" dependencies = [ "libc", ] [[package]] name = "js-sys" -version = "0.3.64" +version = "0.3.68" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5f195fe497f702db0f318b07fdd68edb16955aed830df8363d837542f8f935a" +checksum = "406cda4b368d531c842222cf9d2600a9a4acce8d29423695379c6868a143a9ee" dependencies = [ "wasm-bindgen", ] [[package]] -name = "lazy_static" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" - -[[package]] name = "libc" -version = "0.2.147" +version = "0.2.153" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3" +checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" [[package]] name = "libfuzzer-sys" -version = "0.4.6" +version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "beb09950ae85a0a94b27676cccf37da5ff13f27076aa1adbc6545dd0d0e1bd4e" +checksum = "a96cfd5557eb82f2b83fed4955246c988d331975a002961b07c81584d107e7f7" dependencies = [ "arbitrary", "cc", @@ -725,30 +689,21 @@ [[package]] name = "linux-raw-sys" -version = "0.3.8" +version = "0.4.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef53942eb7bf7ff43a617b3e2c1c4a5ecf5944a7c1bc12d7ee39bbb15e5c1519" +checksum = "01cda141df6706de531b6c46c3a33ecca755538219bd484262fa09410c13539c" [[package]] name = "log" -version = "0.4.19" +version = "0.4.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b06a4cde4c0f271a446782e3eff8de789548ce57dbc8eca9292c27f4a42004b4" +checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" [[package]] name = "memchr" -version = "2.5.0" +version = "2.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" - -[[package]] -name = "memoffset" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a634b1c61a95585bd15607c6ab0c4e5b226e695ff2800ba0cdccddf208c406c" -dependencies = [ - "autocfg", -] +checksum = "523dc4f511e55ab87b694dc30d0f820d60906ef06413f93d4d7a1385599cc149" [[package]] name = "minimal-lexical" @@ -768,9 +723,9 @@ [[package]] name = "num-bigint" -version = "0.4.3" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f93ab6289c7b344a8a9f60f88d80aa20032336fe78da341afc91c8a2341fc75f" +checksum = "608e7659b5c3d7cba262d894801b9ec9d00de989e8a82bd4bef91d08da45cdc0" dependencies = [ "autocfg", "num-integer", @@ -789,28 +744,18 @@ [[package]] name = "num-traits" -version = "0.2.15" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" +checksum = "39e3200413f237f41ab11ad6d161bc7239c84dcb631773ccd7de3dfe4b5c267c" dependencies = [ "autocfg", ] [[package]] -name = "num_cpus" -version = "1.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" -dependencies = [ - "hermit-abi 0.3.2", - "libc", -] - -[[package]] name = "once_cell" -version = "1.18.0" +version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" +checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" [[package]] name = "oorandom" @@ -825,12 +770,6 @@ 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" @@ -842,9 +781,9 @@ [[package]] name = "platforms" -version = "3.0.2" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3d7ddaed09e0eb771a79ab0fd64609ba0afb0a8366421957936ad14cbd13630" +checksum = "626dec3cac7cc0e1577a2ec3fc496277ec2baa084bebad95bb6fdbfae235f84c" [[package]] name = "plotters" @@ -894,18 +833,18 @@ [[package]] name = "primeorder" -version = "0.13.2" +version = "0.13.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c2fcef82c0ec6eefcc179b978446c399b3cdf73c392c35604e399eee6df1ee3" +checksum = "353e1ca18966c16d9deb1c69278edbc5f194139612772bd9537af60ac231e1e6" dependencies = [ "elliptic-curve", ] [[package]] name = "proc-macro2" -version = "1.0.66" +version = "1.0.78" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18fb31db3f9bddb2ea821cde30a9f70117e3f119938b5ee630b7403aa6e2ead9" +checksum = "e2422ad645d89c99f8f3e6b88a9fdeca7fabeac836b1002371c4367c8f984aae" dependencies = [ "unicode-ident", ] @@ -963,9 +902,9 @@ [[package]] name = "quote" -version = "1.0.31" +version = "1.0.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fe8a65d69dd0808184ebb5f836ab526bb259db23c657efa38711b1072ee47f0" +checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef" dependencies = [ "proc-macro2", ] @@ -1002,9 +941,9 @@ [[package]] name = "rayon" -version = "1.7.0" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d2df5196e37bcc87abebc0053e20787d73847bb33134a69841207dd0a47f03b" +checksum = "fa7237101a77a10773db45d62004a272517633fbcc3df19d96455ede1122e051" dependencies = [ "either", "rayon-core", @@ -1012,30 +951,19 @@ [[package]] name = "rayon-core" -version = "1.11.0" +version = "1.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b8f95bd6966f5c87776639160a66bd8ab9895d9d4ab01ddba9fc60661aebe8d" +checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" dependencies = [ - "crossbeam-channel", "crossbeam-deque", "crossbeam-utils", - "num_cpus", -] - -[[package]] -name = "redox_syscall" -version = "0.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" -dependencies = [ - "bitflags", ] [[package]] name = "regex" -version = "1.9.1" +version = "1.10.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2eae68fc220f7cf2532e4494aded17545fce192d59cd996e0fe7887f4ceb575" +checksum = "b62dbe01f0b06f9d8dc7d49e05a0785f153b00b2c227856282f671e0318c9b15" dependencies = [ "aho-corasick", "memchr", @@ -1045,9 +973,9 @@ [[package]] name = "regex-automata" -version = "0.3.3" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39354c10dd07468c2e73926b23bb9c2caca74c5501e38a35da70406f1d923310" +checksum = "5bb987efffd3c6d0d8f5f89510bb458559eab11e4f869acb20bf845e016259cd" dependencies = [ "aho-corasick", "memchr", @@ -1056,9 +984,9 @@ [[package]] name = "regex-syntax" -version = "0.7.4" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5ea92a5b6195c6ef2a0295ea818b312502c6fc94dde986c5553242e18fd4ce2" +checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" [[package]] name = "rustc_version" @@ -1071,13 +999,12 @@ [[package]] name = "rustix" -version = "0.37.23" +version = "0.38.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d69718bf81c6127a49dc64e44a742e8bb9213c0ff8869a22c308f84c1d4ab06" +checksum = "6ea3e1a662af26cd7a3ba09c0297a31af215563ecf42817c98df621387f4e949" dependencies = [ "bitflags", "errno", - "io-lifetimes", "libc", "linux-raw-sys", "windows-sys", @@ -1085,9 +1012,9 @@ [[package]] name = "ryu" -version = "1.0.15" +version = "1.0.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741" +checksum = "f98d2aa92eebf49b69786be48e4477826b256916e84a57ff2a4f21923b48eb4c" [[package]] name = "same-file" @@ -1099,12 +1026,6 @@ ] [[package]] -name = "scopeguard" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" - -[[package]] name = "sec1" version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -1119,24 +1040,24 @@ [[package]] name = "semver" -version = "1.0.18" +version = "1.0.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0293b4b29daaf487284529cc2f5675b8e57c61f70167ba415a463651fd6a918" +checksum = "b97ed7a9823b74f99c7742f5336af7be5ecd3eeafcb1507d1fa93347b1d589b0" [[package]] name = "serde" -version = "1.0.171" +version = "1.0.196" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30e27d1e4fd7659406c492fd6cfaf2066ba8773de45ca75e855590f856dc34a9" +checksum = "870026e60fa08c69f064aa766c10f10b1d62db9ccd4d0abb206472bee0ce3b32" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.171" +version = "1.0.196" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "389894603bd18c46fa56231694f8d827779c0951a667087194cf9de94ed24682" +checksum = "33c85360c95e7d137454dc81d9a4ed2b8efd8fbe19cee57357b32b9771fccb67" dependencies = [ "proc-macro2", "quote", @@ -1145,9 +1066,9 @@ [[package]] name = "serde_json" -version = "1.0.103" +version = "1.0.113" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d03b412469450d4404fe8499a268edd7f8b79fecb074b0d812ad64ca21f4031b" +checksum = "69801b70b1c3dac963ecb03a364ba0ceda9cf60c71cfe475e99864759c8b8a79" dependencies = [ "itoa", "ryu", @@ -1156,9 +1077,9 @@ [[package]] name = "sha2" -version = "0.10.7" +version = "0.10.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "479fb9d862239e610720565ca91403019f2f00410f1864c5aa7479b950a76ed8" +checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" dependencies = [ "cfg-if", "cpufeatures", @@ -1167,9 +1088,9 @@ [[package]] name = "signature" -version = "2.1.0" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e1788eed21689f9cf370582dfc467ef36ed9c707f073528ddafa8d83e3b8500" +checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" [[package]] name = "subtle" @@ -1179,9 +1100,9 @@ [[package]] name = "syn" -version = "2.0.26" +version = "2.0.48" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45c3457aacde3c65315de5031ec191ce46604304d2446e803d71ade03308d970" +checksum = "0f3531638e407dfc0814761abb7c00a5b54992b849452a0646b7f65c9f770f3f" dependencies = [ "proc-macro2", "quote", @@ -1190,38 +1111,30 @@ [[package]] name = "tempfile" -version = "3.6.0" +version = "3.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31c0432476357e58790aaa47a8efb0c5138f137343f3b5f23bd36a27e3b0a6d6" +checksum = "a365e8cd18e44762ef95d87f284f4b5cd04107fec2ff3052bd6a3e6069669e67" dependencies = [ - "autocfg", "cfg-if", "fastrand", - "redox_syscall", "rustix", "windows-sys", ] [[package]] -name = "textwrap" -version = "0.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "222a222a5bfe1bba4a77b45ec488a741b3cb8872e5e499451fd7d0129c9c7c3d" - -[[package]] name = "thiserror" -version = "1.0.43" +version = "1.0.56" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a35fc5b8971143ca348fa6df4f024d4d55264f3468c71ad1c2f365b0a4d58c42" +checksum = "d54378c645627613241d077a3a79db965db602882668f9136ac42af9ecb730ad" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.43" +version = "1.0.56" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "463fe12d7993d3b327787537ce8dd4dfa058de32fc2b195ef3cde03dc4771e8f" +checksum = "fa0faa943b50f3db30a20aa7e265dbc66076993efed8463e8de414e5d06d3471" dependencies = [ "proc-macro2", "quote", @@ -1246,9 +1159,9 @@ [[package]] name = "typenum" -version = "1.16.0" +version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba" +checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" [[package]] name = "ukey2_connections" @@ -1296,9 +1209,9 @@ [[package]] name = "unicode-ident" -version = "1.0.11" +version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "301abaae475aa91687eb82514b328ab47a211a533026cb25fc3e519b86adfc3c" +checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" [[package]] name = "universal-hash" @@ -1318,9 +1231,9 @@ [[package]] name = "walkdir" -version = "2.3.3" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36df944cda56c7d8d8b7496af378e6b16de9284591917d307c9b4d313c44e698" +checksum = "d71d857dc86794ca4c280d616f7da00d2dbfd8cd788846559a6813e6aa4b54ee" dependencies = [ "same-file", "winapi-util", @@ -1334,9 +1247,9 @@ [[package]] name = "wasm-bindgen" -version = "0.2.87" +version = "0.2.91" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7706a72ab36d8cb1f80ffbf0e071533974a60d0a308d01a5d0375bf60499a342" +checksum = "c1e124130aee3fb58c5bdd6b639a0509486b0338acaaae0c84a5124b0f588b7f" dependencies = [ "cfg-if", "wasm-bindgen-macro", @@ -1344,9 +1257,9 @@ [[package]] name = "wasm-bindgen-backend" -version = "0.2.87" +version = "0.2.91" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ef2b6d3c510e9625e5fe6f509ab07d66a760f0885d858736483c32ed7809abd" +checksum = "c9e7e1900c352b609c8488ad12639a311045f40a35491fb69ba8c12f758af70b" dependencies = [ "bumpalo", "log", @@ -1359,9 +1272,9 @@ [[package]] name = "wasm-bindgen-macro" -version = "0.2.87" +version = "0.2.91" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dee495e55982a3bd48105a7b947fd2a9b4a8ae3010041b9e0faab3f9cd028f1d" +checksum = "b30af9e2d358182b5c7449424f017eba305ed32a7010509ede96cdc4696c46ed" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -1369,9 +1282,9 @@ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.87" +version = "0.2.91" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b" +checksum = "642f325be6301eb8107a83d12a8ac6c1e1c54345a7ef1a9261962dfefda09e66" dependencies = [ "proc-macro2", "quote", @@ -1382,15 +1295,15 @@ [[package]] name = "wasm-bindgen-shared" -version = "0.2.87" +version = "0.2.91" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca6ad05a4870b2bf5fe995117d3728437bd27d7cd5f06f13c17443ef369775a1" +checksum = "4f186bd2dcf04330886ce82d6f33dd75a7bfcf69ecf5763b89fcde53b6ac9838" [[package]] name = "web-sys" -version = "0.3.64" +version = "0.3.68" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b85cbef8c220a6abc02aefd892dfc0fc23afb1c6a426316ec33253a3877249b" +checksum = "96565907687f7aceb35bc5fc03770a8a0471d82e479f25832f54a0e3f4b28446" dependencies = [ "js-sys", "wasm-bindgen", @@ -1398,13 +1311,14 @@ [[package]] name = "which" -version = "4.4.0" +version = "4.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2441c784c52b289a054b7201fc93253e288f094e2f4be9058343127c4226a269" +checksum = "87ba24419a2078cd2b0f2ede2691b6c66d8e47836da3b6db8265ebad47afbfc7" dependencies = [ "either", - "libc", + "home", "once_cell", + "rustix", ] [[package]] @@ -1425,9 +1339,9 @@ [[package]] name = "winapi-util" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" +checksum = "f29e6f9198ba0d26b4c9f07dbe6f9ed633e1f3d5b8b414090084349e46a52596" dependencies = [ "winapi", ] @@ -1440,18 +1354,18 @@ [[package]] name = "windows-sys" -version = "0.48.0" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ "windows-targets", ] [[package]] name = "windows-targets" -version = "0.48.1" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05d4b17490f70499f20b9e791dcf6a299785ce8af4d709018206dc5b4953e95f" +checksum = "8a18201040b24831fbb9e4eb208f8892e1f50a37feb53cc7ff887feb8f50e7cd" dependencies = [ "windows_aarch64_gnullvm", "windows_aarch64_msvc", @@ -1464,51 +1378,51 @@ [[package]] name = "windows_aarch64_gnullvm" -version = "0.48.0" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc" +checksum = "cb7764e35d4db8a7921e09562a0304bf2f93e0a51bfccee0bd0bb0b666b015ea" [[package]] name = "windows_aarch64_msvc" -version = "0.48.0" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3" +checksum = "bbaa0368d4f1d2aaefc55b6fcfee13f41544ddf36801e793edbbfd7d7df075ef" [[package]] name = "windows_i686_gnu" -version = "0.48.0" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241" +checksum = "a28637cb1fa3560a16915793afb20081aba2c92ee8af57b4d5f28e4b3e7df313" [[package]] name = "windows_i686_msvc" -version = "0.48.0" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00" +checksum = "ffe5e8e31046ce6230cc7215707b816e339ff4d4d67c65dffa206fd0f7aa7b9a" [[package]] name = "windows_x86_64_gnu" -version = "0.48.0" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1" +checksum = "3d6fa32db2bc4a2f5abeacf2b69f7992cd09dca97498da74a151a3132c26befd" [[package]] name = "windows_x86_64_gnullvm" -version = "0.48.0" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953" +checksum = "1a657e1e9d3f514745a572a6846d3c7aa7dbe1658c056ed9c3344c4109a6949e" [[package]] name = "windows_x86_64_msvc" -version = "0.48.0" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" +checksum = "dff9641d1cd4be8d1a070daf9e3773c5f67e78b4d9d42263020c057706765c04" [[package]] name = "x25519-dalek" -version = "2.0.0" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb66477291e7e8d2b0ff1bcb900bf29489a9692816d79874bea351e7a8b6de96" +checksum = "c7e468321c81fb07fa7f4c636c3972b9100f0346e5b6a9f2bd0603a52f7ed277" dependencies = [ "curve25519-dalek", "rand_core", @@ -1516,6 +1430,6 @@ [[package]] name = "zeroize" -version = "1.6.0" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a0956f1ba7c7909bfb66c2e9e4124ab6f6482560f6628b5aaeba39207c9aad9" +checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d"
diff --git a/nearby/connections/ukey2/ukey2_jni/Cargo.toml b/nearby/connections/ukey2/ukey2_jni/Cargo.toml index 08566dd..8a5b0fe 100644 --- a/nearby/connections/ukey2/ukey2_jni/Cargo.toml +++ b/nearby/connections/ukey2/ukey2_jni/Cargo.toml
@@ -24,7 +24,6 @@ [features] default = ["rustcrypto"] -openssl = ["crypto_provider_default/openssl", "std"] rustcrypto = ["crypto_provider_default/rustcrypto"] boringssl = ["crypto_provider_default/boringssl"] std = ["lock_adapter/std"]
diff --git a/nearby/connections/ukey2/ukey2_jni/java/build.gradle.kts b/nearby/connections/ukey2/ukey2_jni/java/build.gradle.kts index 58c58fc..78b0ebc 100644 --- a/nearby/connections/ukey2/ukey2_jni/java/build.gradle.kts +++ b/nearby/connections/ukey2/ukey2_jni/java/build.gradle.kts
@@ -44,6 +44,7 @@ implementation("com.google.code.findbugs:jsr305:3.0.2") implementation(kotlin("stdlib")) testImplementation("org.junit.jupiter:junit-jupiter:5.9.2") + testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine:5.9.2") } kotlin { @@ -51,10 +52,10 @@ } tasks.jmh { - jvmArgs.value(mutableListOf("-Djava.library.path=../../../../target/release")) + jvmArgs.value(mutableListOf("-Djava.library.path=$projectDir/../../../../target/release")) } tasks.test { useJUnitPlatform() - jvmArgs = mutableListOf("-Djava.library.path=../../../../target/debug") + jvmArgs = mutableListOf("-Djava.library.path=$projectDir/../../../../target/debug") }
diff --git a/nearby/connections/ukey2/ukey2_jni/java/src/jmh/java/com/google/security/cryptauth/lib/securegcm/Ukey2Benchmark.java b/nearby/connections/ukey2/ukey2_jni/java/src/jmh/java/com/google/security/cryptauth/lib/securegcm/Ukey2Benchmark.java deleted file mode 100644 index eb063cc..0000000 --- a/nearby/connections/ukey2/ukey2_jni/java/src/jmh/java/com/google/security/cryptauth/lib/securegcm/Ukey2Benchmark.java +++ /dev/null
@@ -1,83 +0,0 @@ -/* - * 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. - */ - -package com.google.security.cryptauth.lib.securegcm; - -import org.openjdk.jmh.annotations.*; -import org.openjdk.jmh.infra.Blackhole; -import org.openjdk.jmh.profile.GCProfiler; -import org.openjdk.jmh.runner.Runner; -import org.openjdk.jmh.runner.RunnerException; -import org.openjdk.jmh.runner.options.Options; -import org.openjdk.jmh.runner.options.OptionsBuilder; - -import java.nio.charset.StandardCharsets; -import java.time.Duration; -import java.util.concurrent.TimeUnit; -import java.util.Random; - -/** - * Benchmark for encoding and decoding UKEY2 messages over the JNI, analogous to - * `ukey2_benches.rs`. The parameters and the operations also roughly matches the that of the Rust - * Criterion benchmark. That said, since the benchmark infrastructure is different, there will - * inevitably be differences the skews the number in certain ways – comparison of numbers from the - * different benchmarks should compared on order-of-magnitudes only. To get the JNI overhead, for - * example, it would be better use this JMH infra to measure a call into a no-op Rust function, - * which is a more apples-to-apples comparison. - * - * To run this benchmark, run - * cargo build -p ukey2_jni --release && ./gradlew jmh - */ -@State(Scope.Benchmark) -@OutputTimeUnit(TimeUnit.SECONDS) -@BenchmarkMode(Mode.Throughput) -public class Ukey2Benchmark { - - @State(Scope.Thread) - public static class ConnectionState { - D2DConnectionContextV1 connContext; - D2DConnectionContextV1 serverConnContext; - @Param({"10", "1024"}) - int sizeKibs; - byte[] inputBytes; - - @Setup - public void setup() throws Exception { - D2DHandshakeContext initiatorContext = - new D2DHandshakeContext(D2DHandshakeContext.Role.Initiator); - D2DHandshakeContext serverContext = - new D2DHandshakeContext(D2DHandshakeContext.Role.Responder); - serverContext.parseHandshakeMessage(initiatorContext.getNextHandshakeMessage()); - initiatorContext.parseHandshakeMessage(serverContext.getNextHandshakeMessage()); - serverContext.parseHandshakeMessage(initiatorContext.getNextHandshakeMessage()); - connContext = initiatorContext.toConnectionContext(); - serverConnContext = serverContext.toConnectionContext(); - Random random = new Random(); - inputBytes = new byte[sizeKibs * 1024]; - random.nextBytes(inputBytes); - } - } - - @Benchmark - @Fork(3) - @Warmup(iterations = 2, time = 500, timeUnit = TimeUnit.MILLISECONDS) - @Measurement(iterations = 5, time = 500, timeUnit = TimeUnit.MILLISECONDS) - public void encodeAndDecode(ConnectionState state, Blackhole blackhole) throws Exception { - byte[] encoded = state.connContext.encodeMessageToPeer(state.inputBytes, null); - byte[] decoded = state.serverConnContext.decodeMessageFromPeer(encoded, null); - blackhole.consume(decoded); - } -}
diff --git a/nearby/connections/ukey2/ukey2_jni/java/src/jmh/java/com/google/security/cryptauth/lib/securegcm/ukey2/Ukey2Benchmark.java b/nearby/connections/ukey2/ukey2_jni/java/src/jmh/java/com/google/security/cryptauth/lib/securegcm/ukey2/Ukey2Benchmark.java new file mode 100644 index 0000000..fcc07b8 --- /dev/null +++ b/nearby/connections/ukey2/ukey2_jni/java/src/jmh/java/com/google/security/cryptauth/lib/securegcm/ukey2/Ukey2Benchmark.java
@@ -0,0 +1,75 @@ +/* + * 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. + */ + +package com.google.security.cryptauth.lib.securegcm.ukey2; + +import com.google.security.cryptauth.lib.securegcm.ukey2.D2DHandshakeContext.Role; +import java.util.Random; +import java.util.concurrent.TimeUnit; +import org.openjdk.jmh.annotations.*; +import org.openjdk.jmh.infra.Blackhole; + +/** + * Benchmark for encoding and decoding UKEY2 messages over the JNI, analogous to `ukey2_benches.rs`. + * The parameters and the operations also roughly matches the that of the Rust Criterion benchmark. + * That said, since the benchmark infrastructure is different, there will inevitably be differences + * the skews the number in certain ways – comparison of numbers from the different benchmarks should + * compared on order-of-magnitudes only. To get the JNI overhead, for example, it would be better + * use this JMH infra to measure a call into a no-op Rust function, which is a more apples-to-apples + * comparison. + * + * <p>To run this benchmark, run cargo build -p ukey2_jni --release && ./gradlew jmh + */ +@State(Scope.Benchmark) +@OutputTimeUnit(TimeUnit.SECONDS) +@BenchmarkMode(Mode.Throughput) +public class Ukey2Benchmark { + + @State(Scope.Thread) + public static class ConnectionState { + D2DConnectionContextV1 connContext; + D2DConnectionContextV1 serverConnContext; + + @Param({"10", "1024"}) + int sizeKibs; + + byte[] inputBytes; + + @Setup + public void setup() throws Exception { + D2DHandshakeContext initiatorContext = new D2DHandshakeContext(Role.INITIATOR); + D2DHandshakeContext serverContext = new D2DHandshakeContext(Role.RESPONDER); + serverContext.parseHandshakeMessage(initiatorContext.getNextHandshakeMessage()); + initiatorContext.parseHandshakeMessage(serverContext.getNextHandshakeMessage()); + serverContext.parseHandshakeMessage(initiatorContext.getNextHandshakeMessage()); + connContext = initiatorContext.toConnectionContext(); + serverConnContext = serverContext.toConnectionContext(); + Random random = new Random(); + inputBytes = new byte[sizeKibs * 1024]; + random.nextBytes(inputBytes); + } + } + + @Benchmark + @Fork(3) + @Warmup(iterations = 2, time = 500, timeUnit = TimeUnit.MILLISECONDS) + @Measurement(iterations = 5, time = 500, timeUnit = TimeUnit.MILLISECONDS) + public void encodeAndDecode(ConnectionState state, Blackhole blackhole) throws Exception { + byte[] encoded = state.connContext.encodeMessageToPeer(state.inputBytes, null); + byte[] decoded = state.serverConnContext.decodeMessageFromPeer(encoded, null); + blackhole.consume(decoded); + } +}
diff --git a/nearby/connections/ukey2/ukey2_jni/java/src/main/java/com/google/security/cryptauth/lib/securegcm/D2DConnectionContextV1.java b/nearby/connections/ukey2/ukey2_jni/java/src/main/java/com/google/security/cryptauth/lib/securegcm/D2DConnectionContextV1.java deleted file mode 100644 index 7874cd9..0000000 --- a/nearby/connections/ukey2/ukey2_jni/java/src/main/java/com/google/security/cryptauth/lib/securegcm/D2DConnectionContextV1.java +++ /dev/null
@@ -1,123 +0,0 @@ -/* - * 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. - */ - -package com.google.security.cryptauth.lib.securegcm; - -import javax.annotation.Nonnull; -import javax.annotation.Nullable; - -public class D2DConnectionContextV1 { - - static { - System.loadLibrary("ukey2_jni"); - } - - private static native byte[] encode_message_to_peer(long contextPtr, byte[] payload, byte[] associatedData) throws BadHandleException; - - private static native byte[] decode_message_from_peer(long contextPtr, byte[] message, byte[] associatedData) throws CryptoException; - - private static native byte[] get_session_unique(long contextPtr) throws BadHandleException; - - private static native int get_sequence_number_for_encoding(long contextPtr) throws BadHandleException; - - private static native int get_sequence_number_for_decoding(long contextPtr) throws BadHandleException; - - private static native byte[] save_session(long contextPtr) throws BadHandleException; - - private static native long from_saved_session(byte[] savedSessionInfo); - - private final long contextPtr; - - /** - * Java wrapper for D2DConnectionContextV1 to interact with the underlying Rust implementation - * - * @param contextPtr the handle to the Rust implementation. - */ - D2DConnectionContextV1(@Nonnull long contextPtr) { - this.contextPtr = contextPtr; - } - - /** - * Encode a message to the connection peer using session keys derived from the handshake. - * - * @param payload The message to be encrypted. - * @return The encrypted/encoded message. - */ - @Nonnull - public byte[] encodeMessageToPeer(@Nonnull byte[] payload, @Nullable byte[] associatedData) throws BadHandleException { - return encode_message_to_peer(contextPtr, payload, associatedData); - } - - /** - * Decodes/decrypts a message from the connection peer. - * - * @param message The message received over the connection. - * @return The decoded message from the connection peer. - */ - @Nonnull - public byte[] decodeMessageFromPeer(@Nonnull byte[] message, @Nullable byte[] associatedData) throws CryptoException { - return decode_message_from_peer(contextPtr, message, associatedData); - } - - /** - * A unique session identifier derived from session-specific information - * - * @return The session unique identifier - */ - @Nonnull - public byte[] getSessionUnique() throws BadHandleException { - return get_session_unique(contextPtr); - } - - /** - * Returns the encoding sequence number. - * - * @return the encoding sequence number. - */ - public int getSequenceNumberForEncoding() throws BadHandleException { - return get_sequence_number_for_encoding(contextPtr); - } - - /** - * Returns the decoding sequence number. - * - * @return the decoding sequence number. - */ - public int getSequenceNumberForDecoding() throws BadHandleException { - return get_sequence_number_for_decoding(contextPtr); - } - - /** - * Serializes the current session in a form usable by {@link D2DConnectionContextV1#fromSavedSession} - * - * @return a byte array representing the current session. - */ - @Nonnull - public byte[] saveSession() throws BadHandleException { - return save_session(contextPtr); - } - - /** - * Reconstructs and returns the session originally serialized by {@link D2DConnectionContextV1#saveSession} - * - * @param savedSessionInfo the byte array from saveSession() - * @return a D2DConnectionContextV1 session with the same properties as the context saved. - */ - public static D2DConnectionContextV1 fromSavedSession(@Nonnull byte[] savedSessionInfo) { - return new D2DConnectionContextV1(from_saved_session(savedSessionInfo)); - } - -}
diff --git a/nearby/connections/ukey2/ukey2_jni/java/src/main/java/com/google/security/cryptauth/lib/securegcm/D2DHandshakeContext.java b/nearby/connections/ukey2/ukey2_jni/java/src/main/java/com/google/security/cryptauth/lib/securegcm/D2DHandshakeContext.java deleted file mode 100644 index 39f7aa9..0000000 --- a/nearby/connections/ukey2/ukey2_jni/java/src/main/java/com/google/security/cryptauth/lib/securegcm/D2DHandshakeContext.java +++ /dev/null
@@ -1,122 +0,0 @@ -/* - * 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. - */ - -package com.google.security.cryptauth.lib.securegcm; - -import javax.annotation.Nonnull; - -public class D2DHandshakeContext { - static { - System.loadLibrary("ukey2_jni"); - } - - public enum Role { - INITIATOR, - RESPONDER, - } - - private final long contextPtr; - - private static native boolean is_handshake_complete(long contextPtr) throws BadHandleException; - - private static native long create_context(boolean isClient); - - private static native byte[] get_next_handshake_message(long contextPtr) throws BadHandleException; - - private static native void parse_handshake_message(long contextPtr, byte[] message) throws BadHandleException, HandshakeException; - - private static native byte[] get_verification_string(long contextPtr, int length) throws BadHandleException, HandshakeException; - - private static native long to_connection_context(long contextPtr) throws HandshakeException; - - public D2DHandshakeContext(@Nonnull Role role) { - this.contextPtr = create_context(role == Role.INITIATOR); - } - - /** - * Convenience constructor that creates a UKEY2 D2DHandshakeContext for the initiator role. - * - * @return a D2DHandshakeContext for the role of initiator in the handshake. - */ - public static D2DHandshakeContext forInitiator() { - return new D2DHandshakeContext(Role.INITIATOR); - } - - /** - * Convenience constructor that creates a UKEY2 D2DHandshakeContext for the initiator role. - * - * @return a D2DHandshakeContext for the role of responder/server in the handshake. - */ - public static D2DHandshakeContext forResponder() { - return new D2DHandshakeContext(Role.RESPONDER); - } - - /** - * Function that checks if the handshake is completed. - * - * @return true/false depending on if the handshake is complete. - */ - public boolean isHandshakeComplete() throws BadHandleException { - return is_handshake_complete(contextPtr); - } - - /** - * Gets the next handshake message in the exchange. - * - * @return handshake message encoded in a SecureMessage. - */ - @Nonnull - public byte[] getNextHandshakeMessage() throws BadHandleException { - return get_next_handshake_message(contextPtr); - } - - /** - * Parses the handshake message. - * - * @param message - handshake message from the other side. - */ - @Nonnull - public void parseHandshakeMessage(@Nonnull byte[] message) throws BadHandleException, HandshakeException { - parse_handshake_message(contextPtr, message); - } - - /** - * Returns an authentication string suitable for authenticating the handshake out-of-band. Note - * that the authentication string can be short (e.g., a 6 digit visual confirmation code). Note: - * this should only be called when {#isHandshakeComplete} returns true. - * This code is analogous to the authentication string described in the spec. - * - * @param length - The length of the returned verification string. - * @return - The returned verification string as a byte array. - * @throws BadHandleException - Thrown if the handle is no longer valid, for example after calling {@link D2DHandshakeContext#toConnectionContext} - * @throws HandshakeException - Thrown if the handshake is not complete when this function is called. - */ - @Nonnull - public byte[] getVerificationString(int length) throws BadHandleException, HandshakeException { - return get_verification_string(contextPtr, length); - } - - /** - * Function to create a secure communication channel from the handshake after confirming the auth string generated by - * the handshake out-of-band (i.e. via a user-facing UI). - * - * @return a new {@link D2DConnectionContextV1} with the next protocol specified when creating the D2DHandshakeContext. - * @throws HandshakeException if the handsshake is not complete when this function is called. - */ - public D2DConnectionContextV1 toConnectionContext() throws HandshakeException { - return new D2DConnectionContextV1(to_connection_context(contextPtr)); - } -}
diff --git a/nearby/connections/ukey2/ukey2_jni/java/src/main/java/com/google/security/cryptauth/lib/securegcm/HandshakeException.java b/nearby/connections/ukey2/ukey2_jni/java/src/main/java/com/google/security/cryptauth/lib/securegcm/HandshakeException.java deleted file mode 100644 index 17928e9..0000000 --- a/nearby/connections/ukey2/ukey2_jni/java/src/main/java/com/google/security/cryptauth/lib/securegcm/HandshakeException.java +++ /dev/null
@@ -1,32 +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 -// -// 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. - -package com.google.security.cryptauth.lib.securegcm; - -/** - * Represents an unrecoverable error that has occurred during the handshake procedure. - */ -public class HandshakeException extends Exception { - public HandshakeException(String message) { - super(message); - } - - public HandshakeException(Exception e) { - super(e); - } - - public HandshakeException(String message, Exception e) { - super(message, e); - } -} \ No newline at end of file
diff --git a/nearby/connections/ukey2/ukey2_jni/java/src/main/java/com/google/security/cryptauth/lib/securegcm/ukey2/AlertException.java b/nearby/connections/ukey2/ukey2_jni/java/src/main/java/com/google/security/cryptauth/lib/securegcm/ukey2/AlertException.java new file mode 100644 index 0000000..bab017d --- /dev/null +++ b/nearby/connections/ukey2/ukey2_jni/java/src/main/java/com/google/security/cryptauth/lib/securegcm/ukey2/AlertException.java
@@ -0,0 +1,36 @@ +// 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. + +package com.google.security.cryptauth.lib.securegcm.ukey2; + +/** + * An alert exception that contains the alert message to send to the connection peer in case + * anything went wrong. + */ +public class AlertException extends Exception { + + private final byte[] alertMessageToSend; + + public AlertException(String message, byte[] alertMessageToSend) { + super(message); + this.alertMessageToSend = alertMessageToSend; + } + + /** + * @return a message suitable for sending to other member of handshake. + */ + public byte[] getAlertMessageToSend() { + return alertMessageToSend; + } +}
diff --git a/nearby/connections/ukey2/ukey2_jni/java/src/main/java/com/google/security/cryptauth/lib/securegcm/BadHandleException.java b/nearby/connections/ukey2/ukey2_jni/java/src/main/java/com/google/security/cryptauth/lib/securegcm/ukey2/BadHandleException.java similarity index 89% rename from nearby/connections/ukey2/ukey2_jni/java/src/main/java/com/google/security/cryptauth/lib/securegcm/BadHandleException.java rename to nearby/connections/ukey2/ukey2_jni/java/src/main/java/com/google/security/cryptauth/lib/securegcm/ukey2/BadHandleException.java index 2efd7c4..78f0e5e 100644 --- a/nearby/connections/ukey2/ukey2_jni/java/src/main/java/com/google/security/cryptauth/lib/securegcm/BadHandleException.java +++ b/nearby/connections/ukey2/ukey2_jni/java/src/main/java/com/google/security/cryptauth/lib/securegcm/ukey2/BadHandleException.java
@@ -12,10 +12,11 @@ // See the License for the specific language governing permissions and // limitations under the License. -package com.google.security.cryptauth.lib.securegcm; +package com.google.security.cryptauth.lib.securegcm.ukey2; /** - * Represents an unrecoverable error (invalid handle) that has occurred during the handshake/connection. + * Represents an unrecoverable error (invalid handle) that has occurred during the + * handshake/connection. */ public class BadHandleException extends Exception { public BadHandleException(String message) { @@ -29,4 +30,4 @@ public BadHandleException(String message, Exception e) { super(message, e); } -} \ No newline at end of file +}
diff --git a/nearby/connections/ukey2/ukey2_jni/java/src/main/java/com/google/security/cryptauth/lib/securegcm/CryptoException.java b/nearby/connections/ukey2/ukey2_jni/java/src/main/java/com/google/security/cryptauth/lib/securegcm/ukey2/CryptoException.java similarity index 84% rename from nearby/connections/ukey2/ukey2_jni/java/src/main/java/com/google/security/cryptauth/lib/securegcm/CryptoException.java rename to nearby/connections/ukey2/ukey2_jni/java/src/main/java/com/google/security/cryptauth/lib/securegcm/ukey2/CryptoException.java index 6abeb53..11b5c9b 100644 --- a/nearby/connections/ukey2/ukey2_jni/java/src/main/java/com/google/security/cryptauth/lib/securegcm/CryptoException.java +++ b/nearby/connections/ukey2/ukey2_jni/java/src/main/java/com/google/security/cryptauth/lib/securegcm/ukey2/CryptoException.java
@@ -12,11 +12,9 @@ // See the License for the specific language governing permissions and // limitations under the License. -package com.google.security.cryptauth.lib.securegcm; +package com.google.security.cryptauth.lib.securegcm.ukey2; -/** - * Represents an unrecoverable error that has occurred during the handshake procedure. - */ +/** Represents an unrecoverable error that has occurred during the handshake procedure. */ public class CryptoException extends Exception { public CryptoException(String message) { super(message); @@ -29,4 +27,4 @@ public CryptoException(String message, Exception e) { super(message, e); } -} \ No newline at end of file +}
diff --git a/nearby/connections/ukey2/ukey2_jni/java/src/main/java/com/google/security/cryptauth/lib/securegcm/ukey2/D2DConnectionContextV1.java b/nearby/connections/ukey2/ukey2_jni/java/src/main/java/com/google/security/cryptauth/lib/securegcm/ukey2/D2DConnectionContextV1.java new file mode 100644 index 0000000..9ce2517 --- /dev/null +++ b/nearby/connections/ukey2/ukey2_jni/java/src/main/java/com/google/security/cryptauth/lib/securegcm/ukey2/D2DConnectionContextV1.java
@@ -0,0 +1,139 @@ +/* + * 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. + */ + +package com.google.security.cryptauth.lib.securegcm.ukey2; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; + +public class D2DConnectionContextV1 { + + static { + var path = System.getProperty("java.library.path"); + + if (path == null) { + throw new RuntimeException("Path isn't set."); + } + + var paths = java.util.List.of(path.split(";")); + paths.forEach(System.out::println); + + System.loadLibrary("ukey2_jni"); + } + + private static native byte[] encode_message_to_peer( + long contextPtr, byte[] payload, byte[] associatedData) throws BadHandleException; + + private static native byte[] decode_message_from_peer( + long contextPtr, byte[] message, byte[] associatedData) throws CryptoException; + + private static native byte[] get_session_unique(long contextPtr) throws BadHandleException; + + private static native int get_sequence_number_for_encoding(long contextPtr) + throws BadHandleException; + + private static native int get_sequence_number_for_decoding(long contextPtr) + throws BadHandleException; + + private static native byte[] save_session(long contextPtr) throws BadHandleException; + + private static native long from_saved_session(byte[] savedSessionInfo); + + private final long contextPtr; + + /** + * Java wrapper for D2DConnectionContextV1 to interact with the underlying Rust implementation + * + * @param contextPtr the handle to the Rust implementation. + */ + D2DConnectionContextV1(@Nonnull long contextPtr) { + this.contextPtr = contextPtr; + } + + /** + * Encode a message to the connection peer using session keys derived from the handshake. + * + * @param payload The message to be encrypted. + * @return The encrypted/encoded message. + */ + @Nonnull + public byte[] encodeMessageToPeer(@Nonnull byte[] payload, @Nullable byte[] associatedData) + throws BadHandleException { + return encode_message_to_peer(contextPtr, payload, associatedData); + } + + /** + * Decodes/decrypts a message from the connection peer. + * + * @param message The message received over the connection. + * @return The decoded message from the connection peer. + */ + @Nonnull + public byte[] decodeMessageFromPeer(@Nonnull byte[] message, @Nullable byte[] associatedData) + throws CryptoException { + return decode_message_from_peer(contextPtr, message, associatedData); + } + + /** + * A unique session identifier derived from session-specific information + * + * @return The session unique identifier + */ + @Nonnull + public byte[] getSessionUnique() throws BadHandleException { + return get_session_unique(contextPtr); + } + + /** + * Returns the encoding sequence number. + * + * @return the encoding sequence number. + */ + public int getSequenceNumberForEncoding() throws BadHandleException { + return get_sequence_number_for_encoding(contextPtr); + } + + /** + * Returns the decoding sequence number. + * + * @return the decoding sequence number. + */ + public int getSequenceNumberForDecoding() throws BadHandleException { + return get_sequence_number_for_decoding(contextPtr); + } + + /** + * Serializes the current session in a form usable by {@link + * D2DConnectionContextV1#fromSavedSession} + * + * @return a byte array representing the current session. + */ + @Nonnull + public byte[] saveSession() throws BadHandleException { + return save_session(contextPtr); + } + + /** + * Reconstructs and returns the session originally serialized by {@link + * D2DConnectionContextV1#saveSession} + * + * @param savedSessionInfo the byte array from saveSession() + * @return a D2DConnectionContextV1 session with the same properties as the context saved. + */ + public static D2DConnectionContextV1 fromSavedSession(@Nonnull byte[] savedSessionInfo) { + return new D2DConnectionContextV1(from_saved_session(savedSessionInfo)); + } +}
diff --git a/nearby/connections/ukey2/ukey2_jni/java/src/main/java/com/google/security/cryptauth/lib/securegcm/ukey2/D2DHandshakeContext.java b/nearby/connections/ukey2/ukey2_jni/java/src/main/java/com/google/security/cryptauth/lib/securegcm/ukey2/D2DHandshakeContext.java new file mode 100644 index 0000000..0e1ad62 --- /dev/null +++ b/nearby/connections/ukey2/ukey2_jni/java/src/main/java/com/google/security/cryptauth/lib/securegcm/ukey2/D2DHandshakeContext.java
@@ -0,0 +1,134 @@ +/* + * 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. + */ + +package com.google.security.cryptauth.lib.securegcm.ukey2; + +import javax.annotation.Nonnull; + +public class D2DHandshakeContext { + static { + System.loadLibrary("ukey2_jni"); + } + + public enum Role { + INITIATOR, + RESPONDER, + } + + private final long contextPtr; + + private static native boolean is_handshake_complete(long contextPtr) throws BadHandleException; + + private static native long create_context(boolean isClient); + + private static native byte[] get_next_handshake_message(long contextPtr) + throws BadHandleException; + + private static native void parse_handshake_message(long contextPtr, byte[] message) + throws AlertException, BadHandleException, HandshakeException; + + private static native byte[] get_verification_string(long contextPtr, int length) + throws BadHandleException, HandshakeException; + + private static native long to_connection_context(long contextPtr) throws HandshakeException; + + public D2DHandshakeContext(@Nonnull Role role) { + this.contextPtr = create_context(role == Role.INITIATOR); + } + + /** + * Convenience constructor that creates a UKEY2 D2DHandshakeContext for the initiator role. + * + * @return a D2DHandshakeContext for the role of initiator in the handshake. + */ + public static D2DHandshakeContext forInitiator() { + return new D2DHandshakeContext(Role.INITIATOR); + } + + /** + * Convenience constructor that creates a UKEY2 D2DHandshakeContext for the initiator role. + * + * @return a D2DHandshakeContext for the role of responder/server in the handshake. + */ + public static D2DHandshakeContext forResponder() { + return new D2DHandshakeContext(Role.RESPONDER); + } + + /** + * Function that checks if the handshake is completed. + * + * @return true/false depending on if the handshake is complete. + */ + public boolean isHandshakeComplete() throws BadHandleException { + return is_handshake_complete(contextPtr); + } + + /** + * Gets the next handshake message in the exchange. + * + * @return handshake message encoded in a SecureMessage. + */ + @Nonnull + public byte[] getNextHandshakeMessage() throws BadHandleException { + return get_next_handshake_message(contextPtr); + } + + /** + * Parses the handshake message. + * + * @param message - handshake message from the other side. + * @throws AlertException - Thrown if the message is unable to be parsed. + * @throws BadHandleException - Thrown if the handle is no longer valid, for example after calling + * {@link D2DHandshakeContext#toConnectionContext()} + * @throws HandshakeException - Thrown if the handshake is not complete when this function is + * called. + */ + @Nonnull + public void parseHandshakeMessage(@Nonnull byte[] message) + throws AlertException, BadHandleException, HandshakeException { + parse_handshake_message(contextPtr, message); + } + + /** + * Returns an authentication string suitable for authenticating the handshake out-of-band. Note + * that the authentication string can be short (e.g., a 6 digit visual confirmation code). Note: + * this should only be called when {#isHandshakeComplete} returns true. This code is analogous to + * the authentication string described in the spec. + * + * @param length - The length of the returned verification string. + * @return - The returned verification string as a byte array. + * @throws BadHandleException - Thrown if the handle is no longer valid, for example after calling + * {@link D2DHandshakeContext#toConnectionContext()} + * @throws HandshakeException - Thrown if the handshake is not complete when this function is + * called. + */ + @Nonnull + public byte[] getVerificationString(int length) throws BadHandleException, HandshakeException { + return get_verification_string(contextPtr, length); + } + + /** + * Function to create a secure communication channel from the handshake after confirming the auth + * string generated by the handshake out-of-band (i.e. via a user-facing UI). + * + * @return a new {@link D2DConnectionContextV1} with the next protocol specified when creating the + * D2DHandshakeContext. + * @throws HandshakeException if the handsshake is not complete when this function is called. + */ + public D2DConnectionContextV1 toConnectionContext() throws HandshakeException { + return new D2DConnectionContextV1(to_connection_context(contextPtr)); + } +}
diff --git a/nearby/connections/ukey2/ukey2_jni/java/src/main/java/com/google/security/cryptauth/lib/securegcm/CryptoException.java b/nearby/connections/ukey2/ukey2_jni/java/src/main/java/com/google/security/cryptauth/lib/securegcm/ukey2/HandshakeException.java similarity index 65% copy from nearby/connections/ukey2/ukey2_jni/java/src/main/java/com/google/security/cryptauth/lib/securegcm/CryptoException.java copy to nearby/connections/ukey2/ukey2_jni/java/src/main/java/com/google/security/cryptauth/lib/securegcm/ukey2/HandshakeException.java index 6abeb53..20d3112 100644 --- a/nearby/connections/ukey2/ukey2_jni/java/src/main/java/com/google/security/cryptauth/lib/securegcm/CryptoException.java +++ b/nearby/connections/ukey2/ukey2_jni/java/src/main/java/com/google/security/cryptauth/lib/securegcm/ukey2/HandshakeException.java
@@ -12,21 +12,19 @@ // See the License for the specific language governing permissions and // limitations under the License. -package com.google.security.cryptauth.lib.securegcm; +package com.google.security.cryptauth.lib.securegcm.ukey2; -/** - * Represents an unrecoverable error that has occurred during the handshake procedure. - */ -public class CryptoException extends Exception { - public CryptoException(String message) { +/** Represents an unrecoverable error that has occurred during the handshake procedure. */ +public class HandshakeException extends Exception { + public HandshakeException(String message) { super(message); } - public CryptoException(Exception e) { + public HandshakeException(Exception e) { super(e); } - public CryptoException(String message, Exception e) { + public HandshakeException(String message, Exception e) { super(message, e); } -} \ No newline at end of file +}
diff --git a/nearby/connections/ukey2/ukey2_jni/java/src/main/java/com/google/security/cryptauth/lib/securegcm/SessionRestoreException.java b/nearby/connections/ukey2/ukey2_jni/java/src/main/java/com/google/security/cryptauth/lib/securegcm/ukey2/SessionRestoreException.java similarity index 85% rename from nearby/connections/ukey2/ukey2_jni/java/src/main/java/com/google/security/cryptauth/lib/securegcm/SessionRestoreException.java rename to nearby/connections/ukey2/ukey2_jni/java/src/main/java/com/google/security/cryptauth/lib/securegcm/ukey2/SessionRestoreException.java index c780973..026f8c5 100644 --- a/nearby/connections/ukey2/ukey2_jni/java/src/main/java/com/google/security/cryptauth/lib/securegcm/SessionRestoreException.java +++ b/nearby/connections/ukey2/ukey2_jni/java/src/main/java/com/google/security/cryptauth/lib/securegcm/ukey2/SessionRestoreException.java
@@ -12,11 +12,9 @@ // See the License for the specific language governing permissions and // limitations under the License. -package com.google.security.cryptauth.lib.securegcm; +package com.google.security.cryptauth.lib.securegcm.ukey2; -/** - * Represents an unrecoverable error that has occurred during the handshake procedure. - */ +/** Represents an unrecoverable error that has occurred during the handshake procedure. */ public class SessionRestoreException extends Exception { public SessionRestoreException(String message) { super(message); @@ -29,4 +27,4 @@ public SessionRestoreException(String message, Exception e) { super(message, e); } -} \ No newline at end of file +}
diff --git a/nearby/connections/ukey2/ukey2_jni/java/src/test/java/com/google/security/cryptauth/lib/securegcm/TestUkey2Protocol.kt b/nearby/connections/ukey2/ukey2_jni/java/src/test/java/com/google/security/cryptauth/lib/securegcm/TestUkey2Protocol.kt deleted file mode 100644 index 79cbd15..0000000 --- a/nearby/connections/ukey2/ukey2_jni/java/src/test/java/com/google/security/cryptauth/lib/securegcm/TestUkey2Protocol.kt +++ /dev/null
@@ -1,182 +0,0 @@ -/* - * 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. - */ - -/* - * This Java source file was generated by the Gradle 'init' task. - */ -package com.google.security.cryptauth.lib.securegcm - -import java.nio.charset.StandardCharsets -import org.junit.jupiter.api.Assertions.assertArrayEquals -import org.junit.jupiter.api.Assertions.assertEquals -import org.junit.jupiter.api.Assertions.assertFalse -import org.junit.jupiter.api.Assertions.assertNotEquals -import org.junit.jupiter.api.Assertions.assertTrue -import org.junit.jupiter.api.Test -import org.junit.jupiter.api.assertDoesNotThrow -import org.junit.jupiter.api.assertThrows - -// Driver code -// Tests exception handling and the handshake routine, as well as encrypting/decrypting short message between the server and initiator contexts. -@Suppress("UNUSED_VARIABLE") -class TestUkey2Protocol { - @Test - fun testHandshake() { - val initiatorContext = - D2DHandshakeContext(D2DHandshakeContext.Role.INITIATOR) - assertFalse(initiatorContext.isHandshakeComplete) - val serverContext = - D2DHandshakeContext(D2DHandshakeContext.Role.RESPONDER) - assertFalse(serverContext.isHandshakeComplete) - assertDoesNotThrow { - serverContext.parseHandshakeMessage(initiatorContext.nextHandshakeMessage) - initiatorContext.parseHandshakeMessage(serverContext.nextHandshakeMessage) - serverContext.parseHandshakeMessage(initiatorContext.nextHandshakeMessage) - assertTrue(initiatorContext.isHandshakeComplete) - assertTrue(serverContext.isHandshakeComplete) - } - } - - @Test - fun testSendReceiveMessage() { - val initiatorContext = - D2DHandshakeContext(D2DHandshakeContext.Role.INITIATOR) - val serverContext = - D2DHandshakeContext(D2DHandshakeContext.Role.RESPONDER) - assertDoesNotThrow { - serverContext.parseHandshakeMessage(initiatorContext.nextHandshakeMessage) - initiatorContext.parseHandshakeMessage(serverContext.nextHandshakeMessage) - serverContext.parseHandshakeMessage(initiatorContext.nextHandshakeMessage) - val connContext = initiatorContext.toConnectionContext() - val serverConnContext = serverContext.toConnectionContext() - val initialShareString = "Nearby sharing to server" - val encoded = connContext.encodeMessageToPeer( - initialShareString.toByteArray( - StandardCharsets.UTF_8 - ), null - ) - val response = - String(serverConnContext.decodeMessageFromPeer(encoded, null), StandardCharsets.UTF_8) - assertEquals(response, initialShareString) - } - } - - @Test - fun testSaveRestoreSession() { - val initiatorContext = - D2DHandshakeContext(D2DHandshakeContext.Role.INITIATOR) - val serverContext = - D2DHandshakeContext(D2DHandshakeContext.Role.RESPONDER) - assertDoesNotThrow { - serverContext.parseHandshakeMessage(initiatorContext.nextHandshakeMessage) - initiatorContext.parseHandshakeMessage(serverContext.nextHandshakeMessage) - serverContext.parseHandshakeMessage(initiatorContext.nextHandshakeMessage) - val connContext = initiatorContext.toConnectionContext() - val serverConnContext = serverContext.toConnectionContext() - val initiatorSavedSession = connContext.saveSession() - val restored = D2DConnectionContextV1.fromSavedSession(initiatorSavedSession) - assertArrayEquals(connContext.sessionUnique, restored.sessionUnique) - val initialShareString = "Nearby sharing to server" - val encoded = serverConnContext.encodeMessageToPeer( - initialShareString.toByteArray( - StandardCharsets.UTF_8 - ), null - ) - val response = String(restored.decodeMessageFromPeer(encoded, null), StandardCharsets.UTF_8) - assertEquals(response, initialShareString) - } - } - - @Test - fun testSaveRestoreBadSession() { - val initiatorContext = - D2DHandshakeContext(D2DHandshakeContext.Role.INITIATOR) - val serverContext = - D2DHandshakeContext(D2DHandshakeContext.Role.RESPONDER) - val deriveInitiatorSavedSession = { - assertDoesNotThrow { - serverContext.parseHandshakeMessage(initiatorContext.nextHandshakeMessage) - initiatorContext.parseHandshakeMessage(serverContext.nextHandshakeMessage) - serverContext.parseHandshakeMessage(initiatorContext.nextHandshakeMessage) - val connContext = initiatorContext.toConnectionContext() - val serverConnContext = serverContext.toConnectionContext() - connContext.saveSession() - } - } - assertThrows<SessionRestoreException> { - val unused = D2DConnectionContextV1.fromSavedSession(deriveInitiatorSavedSession().copyOfRange(0, 20)) - } - } - - @Test - fun tryReuseHandshakeContext() { - val initiatorContext = - D2DHandshakeContext(D2DHandshakeContext.Role.INITIATOR) - val serverContext = - D2DHandshakeContext(D2DHandshakeContext.Role.RESPONDER) - assertDoesNotThrow { - serverContext.parseHandshakeMessage(initiatorContext.nextHandshakeMessage) - initiatorContext.parseHandshakeMessage(serverContext.nextHandshakeMessage) - serverContext.parseHandshakeMessage(initiatorContext.nextHandshakeMessage) - val connContext = initiatorContext.toConnectionContext() - val serverConnContext = serverContext.toConnectionContext() - } - assertThrows<BadHandleException> { - val unused = serverContext.nextHandshakeMessage - } - } - - @Test - fun testSendReceiveMessageWithAssociatedData() { - val initiatorContext = - D2DHandshakeContext(D2DHandshakeContext.Role.INITIATOR) - val serverContext = - D2DHandshakeContext(D2DHandshakeContext.Role.RESPONDER) - val associatedData = "Associated data.".toByteArray() - assertDoesNotThrow { - serverContext.parseHandshakeMessage(initiatorContext.nextHandshakeMessage) - initiatorContext.parseHandshakeMessage(serverContext.nextHandshakeMessage) - serverContext.parseHandshakeMessage(initiatorContext.nextHandshakeMessage) - val connContext = initiatorContext.toConnectionContext() - val serverConnContext = serverContext.toConnectionContext() - val initialShareString = "Nearby sharing to server" - val encoded = connContext.encodeMessageToPeer( - initialShareString.toByteArray( - StandardCharsets.UTF_8 - ), associatedData - ) - val response = - String(serverConnContext.decodeMessageFromPeer(encoded, associatedData), StandardCharsets.UTF_8) - assertEquals(response, initialShareString) - } - } - - @Test - fun testVerificationString() { - val initiatorContext = - D2DHandshakeContext(D2DHandshakeContext.Role.INITIATOR) - val serverContext = - D2DHandshakeContext(D2DHandshakeContext.Role.RESPONDER) - assertDoesNotThrow { - serverContext.parseHandshakeMessage(initiatorContext.nextHandshakeMessage) - initiatorContext.parseHandshakeMessage(serverContext.nextHandshakeMessage) - serverContext.parseHandshakeMessage(initiatorContext.nextHandshakeMessage) - } - assert(serverContext.isHandshakeComplete) - assert(initiatorContext.isHandshakeComplete) - assertArrayEquals(serverContext.getVerificationString(32), initiatorContext.getVerificationString(32)) - } -} \ No newline at end of file
diff --git a/nearby/connections/ukey2/ukey2_jni/java/src/test/java/com/google/security/cryptauth/lib/securegcm/ukey2/TestUkey2Protocol.kt b/nearby/connections/ukey2/ukey2_jni/java/src/test/java/com/google/security/cryptauth/lib/securegcm/ukey2/TestUkey2Protocol.kt new file mode 100644 index 0000000..2940652 --- /dev/null +++ b/nearby/connections/ukey2/ukey2_jni/java/src/test/java/com/google/security/cryptauth/lib/securegcm/ukey2/TestUkey2Protocol.kt
@@ -0,0 +1,175 @@ +/* + * 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. + */ + +/* + * This Java source file was generated by the Gradle 'init' task. + */ +package com.google.security.cryptauth.lib.securegcm.ukey2 + +import java.nio.charset.StandardCharsets +import org.junit.jupiter.api.Assertions.assertArrayEquals +import org.junit.jupiter.api.Assertions.assertEquals +import org.junit.jupiter.api.Assertions.assertFalse +import org.junit.jupiter.api.Assertions.assertTrue +import org.junit.jupiter.api.Test +import org.junit.jupiter.api.assertDoesNotThrow +import org.junit.jupiter.api.assertThrows + +// Driver code +// Tests exception handling and the handshake routine, as well as encrypting/decrypting short +// message between the server and initiator contexts. +@Suppress("UNUSED_VARIABLE") +class TestUkey2Protocol { + @Test + fun testHandshake() { + val initiatorContext = D2DHandshakeContext(D2DHandshakeContext.Role.INITIATOR) + assertFalse(initiatorContext.isHandshakeComplete) + val serverContext = D2DHandshakeContext(D2DHandshakeContext.Role.RESPONDER) + assertFalse(serverContext.isHandshakeComplete) + assertDoesNotThrow { + serverContext.parseHandshakeMessage(initiatorContext.nextHandshakeMessage) + initiatorContext.parseHandshakeMessage(serverContext.nextHandshakeMessage) + serverContext.parseHandshakeMessage(initiatorContext.nextHandshakeMessage) + assertTrue(initiatorContext.isHandshakeComplete) + assertTrue(serverContext.isHandshakeComplete) + } + } + + @Test + fun testSendReceiveMessage() { + val initiatorContext = D2DHandshakeContext(D2DHandshakeContext.Role.INITIATOR) + val serverContext = D2DHandshakeContext(D2DHandshakeContext.Role.RESPONDER) + assertDoesNotThrow { + serverContext.parseHandshakeMessage(initiatorContext.nextHandshakeMessage) + initiatorContext.parseHandshakeMessage(serverContext.nextHandshakeMessage) + serverContext.parseHandshakeMessage(initiatorContext.nextHandshakeMessage) + val connContext = initiatorContext.toConnectionContext() + val serverConnContext = serverContext.toConnectionContext() + val initialShareString = "Nearby sharing to server" + val encoded = + connContext.encodeMessageToPeer( + initialShareString.toByteArray(StandardCharsets.UTF_8), null) + val response = + String(serverConnContext.decodeMessageFromPeer(encoded, null), StandardCharsets.UTF_8) + assertEquals(response, initialShareString) + } + } + + @Test + fun testSaveRestoreSession() { + val initiatorContext = D2DHandshakeContext(D2DHandshakeContext.Role.INITIATOR) + val serverContext = D2DHandshakeContext(D2DHandshakeContext.Role.RESPONDER) + assertDoesNotThrow { + serverContext.parseHandshakeMessage(initiatorContext.nextHandshakeMessage) + initiatorContext.parseHandshakeMessage(serverContext.nextHandshakeMessage) + serverContext.parseHandshakeMessage(initiatorContext.nextHandshakeMessage) + val connContext = initiatorContext.toConnectionContext() + val serverConnContext = serverContext.toConnectionContext() + val initiatorSavedSession = connContext.saveSession() + val restored = D2DConnectionContextV1.fromSavedSession(initiatorSavedSession) + assertArrayEquals(connContext.sessionUnique, restored.sessionUnique) + val initialShareString = "Nearby sharing to server" + val encoded = + serverConnContext.encodeMessageToPeer( + initialShareString.toByteArray(StandardCharsets.UTF_8), null) + val response = String(restored.decodeMessageFromPeer(encoded, null), StandardCharsets.UTF_8) + assertEquals(response, initialShareString) + } + } + + @Test + fun testSaveRestoreBadSession() { + val initiatorContext = D2DHandshakeContext(D2DHandshakeContext.Role.INITIATOR) + val serverContext = D2DHandshakeContext(D2DHandshakeContext.Role.RESPONDER) + val deriveInitiatorSavedSession = { + assertDoesNotThrow { + serverContext.parseHandshakeMessage(initiatorContext.nextHandshakeMessage) + initiatorContext.parseHandshakeMessage(serverContext.nextHandshakeMessage) + serverContext.parseHandshakeMessage(initiatorContext.nextHandshakeMessage) + val connContext = initiatorContext.toConnectionContext() + val serverConnContext = serverContext.toConnectionContext() + connContext.saveSession() + } + } + assertThrows<SessionRestoreException> { + val unused = + D2DConnectionContextV1.fromSavedSession(deriveInitiatorSavedSession().copyOfRange(0, 20)) + } + } + + @Test + fun tryReuseHandshakeContext() { + val initiatorContext = D2DHandshakeContext(D2DHandshakeContext.Role.INITIATOR) + val serverContext = D2DHandshakeContext(D2DHandshakeContext.Role.RESPONDER) + assertDoesNotThrow { + serverContext.parseHandshakeMessage(initiatorContext.nextHandshakeMessage) + initiatorContext.parseHandshakeMessage(serverContext.nextHandshakeMessage) + serverContext.parseHandshakeMessage(initiatorContext.nextHandshakeMessage) + val connContext = initiatorContext.toConnectionContext() + val serverConnContext = serverContext.toConnectionContext() + } + assertThrows<BadHandleException> { + val unused = serverContext.nextHandshakeMessage + } + } + + @Test + fun testSendReceiveMessageWithAssociatedData() { + val initiatorContext = D2DHandshakeContext(D2DHandshakeContext.Role.INITIATOR) + val serverContext = D2DHandshakeContext(D2DHandshakeContext.Role.RESPONDER) + val associatedData = "Associated data.".toByteArray() + assertDoesNotThrow { + serverContext.parseHandshakeMessage(initiatorContext.nextHandshakeMessage) + initiatorContext.parseHandshakeMessage(serverContext.nextHandshakeMessage) + serverContext.parseHandshakeMessage(initiatorContext.nextHandshakeMessage) + val connContext = initiatorContext.toConnectionContext() + val serverConnContext = serverContext.toConnectionContext() + val initialShareString = "Nearby sharing to server" + val encoded = + connContext.encodeMessageToPeer( + initialShareString.toByteArray(StandardCharsets.UTF_8), associatedData) + val response = + String( + serverConnContext.decodeMessageFromPeer(encoded, associatedData), + StandardCharsets.UTF_8) + assertEquals(response, initialShareString) + } + } + + @Test + fun testVerificationString() { + val initiatorContext = D2DHandshakeContext(D2DHandshakeContext.Role.INITIATOR) + val serverContext = D2DHandshakeContext(D2DHandshakeContext.Role.RESPONDER) + assertDoesNotThrow { + serverContext.parseHandshakeMessage(initiatorContext.nextHandshakeMessage) + initiatorContext.parseHandshakeMessage(serverContext.nextHandshakeMessage) + serverContext.parseHandshakeMessage(initiatorContext.nextHandshakeMessage) + } + assert(serverContext.isHandshakeComplete) + assert(initiatorContext.isHandshakeComplete) + assertArrayEquals( + serverContext.getVerificationString(32), initiatorContext.getVerificationString(32)) + } + + @Test + fun throwsAlertExceptionWhenBadMessage() { + val serverContext = D2DHandshakeContext(D2DHandshakeContext.Role.RESPONDER) + val exception = assertThrows<AlertException> { + serverContext.parseHandshakeMessage("Hello UKEY2".toByteArray()) + } + assert(exception.alertMessageToSend.isNotEmpty()) + } +}
diff --git a/nearby/connections/ukey2/ukey2_jni/src/lib.rs b/nearby/connections/ukey2/ukey2_jni/src/lib.rs index b7764fa..2b277aa 100644 --- a/nearby/connections/ukey2/ukey2_jni/src/lib.rs +++ b/nearby/connections/ukey2/ukey2_jni/src/lib.rs
@@ -20,7 +20,7 @@ use std::collections::HashMap; -use jni::objects::{JByteArray, JClass}; +use jni::objects::{JByteArray, JClass, JThrowable}; use jni::sys::{jboolean, jbyteArray, jint, jlong, JNI_TRUE}; use jni::JNIEnv; use lazy_static::lazy_static; @@ -59,12 +59,12 @@ pub(crate) fn insert_handshake_handle(item: D2DBox) -> u64 { let mut handle = generate_handle(); - let map = HANDLE_MAPPING.lock(); + let mut map = HANDLE_MAPPING.lock(); while map.contains_key(&handle) { handle = generate_handle(); } - let result = HANDLE_MAPPING.lock().insert(handle, item); + let result = map.insert(handle, item); // result should always be None since we checked that handle map does not contain the key already assert!(result.is_none()); handle @@ -72,12 +72,12 @@ pub(crate) fn insert_conn_handle(item: ConnectionBox) -> u64 { let mut handle = generate_handle(); - let map = CONNECTION_HANDLE_MAPPING.lock(); + let mut map = CONNECTION_HANDLE_MAPPING.lock(); while map.contains_key(&handle) { handle = generate_handle(); } - let result = CONNECTION_HANDLE_MAPPING.lock().insert(handle, item); + let result = map.insert(handle, item); // result should always be None since we checked that handle map does not contain the key already assert!(result.is_none()); handle @@ -94,7 +94,7 @@ /// Tells the caller whether the handshake has completed or not. If the handshake is complete, /// the caller may call `to_connection_context`to obtain a connection context. #[no_mangle] -pub extern "system" fn Java_com_google_security_cryptauth_lib_securegcm_D2DHandshakeContext_is_1handshake_1complete( +pub extern "system" fn Java_com_google_security_cryptauth_lib_securegcm_ukey2_D2DHandshakeContext_is_1handshake_1complete( mut env: JNIEnv, _: JClass, context_handle: jlong, @@ -103,7 +103,7 @@ if let Some(ctx) = HANDLE_MAPPING.lock().get(&(context_handle as u64)) { is_complete = ctx.is_handshake_complete(); } else { - env.throw_new("com/google/security/cryptauth/lib/securegcm/BadHandleException", "") + env.throw_new("com/google/security/cryptauth/lib/securegcm/ukey2/BadHandleException", "") .expect("failed to find error class"); } is_complete as jboolean @@ -111,7 +111,7 @@ /// Creates a new handshake context #[no_mangle] -pub extern "system" fn Java_com_google_security_cryptauth_lib_securegcm_D2DHandshakeContext_create_1context( +pub extern "system" fn Java_com_google_security_cryptauth_lib_securegcm_ukey2_D2DHandshakeContext_create_1context( _: JNIEnv, _: JClass, is_client: jboolean, @@ -131,7 +131,7 @@ /// Constructs the next message that should be sent in the handshake. #[no_mangle] -pub extern "system" fn Java_com_google_security_cryptauth_lib_securegcm_D2DHandshakeContext_get_1next_1handshake_1message( +pub extern "system" fn Java_com_google_security_cryptauth_lib_securegcm_ukey2_D2DHandshakeContext_get_1next_1handshake_1message( mut env: JNIEnv, _: JClass, context_handle: jlong, @@ -140,7 +140,7 @@ let next_message = if let Some(ctx) = HANDLE_MAPPING.lock().get(&(context_handle as u64)) { ctx.get_next_handshake_message() } else { - env.throw_new("com/google/security/cryptauth/lib/securegcm/BadHandleException", "") + env.throw_new("com/google/security/cryptauth/lib/securegcm/ukey2/BadHandleException", "") .expect("failed to find error class"); None }; @@ -157,7 +157,7 @@ // Safety: We know the message pointer is safe as it is coming directly from the JVM. #[allow(clippy::not_unsafe_ptr_arg_deref)] #[no_mangle] -pub extern "system" fn Java_com_google_security_cryptauth_lib_securegcm_D2DHandshakeContext_parse_1handshake_1message( +pub extern "system" fn Java_com_google_security_cryptauth_lib_securegcm_ukey2_D2DHandshakeContext_parse_1handshake_1message( mut env: JNIEnv, _: JClass, context_handle: jlong, @@ -167,22 +167,48 @@ let result = if let Some(ctx) = HANDLE_MAPPING.lock().get_mut(&(context_handle as u64)) { ctx.handle_handshake_message(rust_buffer.as_slice()).map_err(JniError::HandleMessageError) } else { - env.throw_new("com/google/security/cryptauth/lib/securegcm/BadHandleException", "") + env.throw_new("com/google/security/cryptauth/lib/securegcm/ukey2/BadHandleException", "") .expect("failed to find error class"); Err(JniError::BadHandle) }; if let Err(e) = result { if !env.exception_check().unwrap() { - env.throw_new( - "com/google/security/cryptauth/lib/securegcm/HandshakeException", + let msg = match e { JniError::BadHandle => "Bad handle", JniError::DecodeError(_) => "Unable to decode message", - JniError::HandleMessageError(_) => "Unable to handle message", + JniError::HandleMessageError(hme) => match hme { + HandleMessageError::InvalidState | HandleMessageError::BadMessage => { + "Unable to handle message" + } + HandleMessageError::ErrorMessage(error_msg) => { + let exception: JThrowable = env.new_object( + "com/google/security/cryptauth/lib/securegcm/ukey2/AlertException", + "(Ljava/lang/String;[B)V", + &[ + (&env + .new_string("Failed to handle message, sending alert") + .expect("valid str message for alert exception")) + .into(), + (&env + .byte_array_from_slice(&error_msg) + .expect("valid byte array for alert exception")) + .into(), + ], + ).expect("Did not successfully create AlertException").into(); + env.throw(exception).expect("Throw alert exception"); + "" + } + }, JniError::HandshakeError(_) => "Handshake incomplete", - }, - ) - .expect("failed to find error class"); + }; + if !env.exception_check().unwrap() { + env.throw_new( + "com/google/security/cryptauth/lib/securegcm/ukey2/HandshakeException", + msg, + ) + .expect("failed to find error class"); + } } } } @@ -190,7 +216,7 @@ /// Returns the `CompletedHandshake` using the results from this handshake context. May only /// be called if `is_handshake_complete` returns true. #[no_mangle] -pub extern "system" fn Java_com_google_security_cryptauth_lib_securegcm_D2DHandshakeContext_get_1verification_1string( +pub extern "system" fn Java_com_google_security_cryptauth_lib_securegcm_ukey2_D2DHandshakeContext_get_1verification_1string( mut env: JNIEnv, _: JClass, context_handle: jlong, @@ -202,14 +228,14 @@ .map_err(|_| JniError::HandshakeError(HandshakeError::HandshakeNotComplete)) .map(|h| h.auth_string::<CryptoProvider>().derive_vec(length as usize).unwrap()) } else { - env.throw_new("com/google/security/cryptauth/lib/securegcm/BadHandleException", "") + env.throw_new("com/google/security/cryptauth/lib/securegcm/ukey2/BadHandleException", "") .expect("failed to find error class"); Err(JniError::BadHandle) }; if let Err(e) = result { if !env.exception_check().unwrap() { env.throw_new( - "com/google/security/cryptauth/lib/securegcm/HandshakeException", + "com/google/security/cryptauth/lib/securegcm/ukey2/HandshakeException", match e { JniError::BadHandle => "Bad handle", JniError::DecodeError(_) => "Unable to decode message", @@ -230,7 +256,7 @@ /// Creates a [`D2DConnectionContextV1`] using the results of the handshake. May only be called /// if `is_handshake_complete` returns true. #[no_mangle] -pub extern "system" fn Java_com_google_security_cryptauth_lib_securegcm_D2DHandshakeContext_to_1connection_1context( +pub extern "system" fn Java_com_google_security_cryptauth_lib_securegcm_ukey2_D2DHandshakeContext_to_1connection_1context( mut env: JNIEnv, _: JClass, context_handle: jlong, @@ -242,7 +268,7 @@ }; if let Err(error) = conn_context { env.throw_new( - "com/google/security/cryptauth/lib/securegcm/HandshakeException", + "com/google/security/cryptauth/lib/securegcm/ukey2/HandshakeException", match error { JniError::BadHandle => "Bad context handle", JniError::HandshakeError(_) => "Handshake not complete", @@ -263,7 +289,7 @@ // from the JVM. #[allow(clippy::not_unsafe_ptr_arg_deref)] #[no_mangle] -pub extern "system" fn Java_com_google_security_cryptauth_lib_securegcm_D2DConnectionContextV1_encode_1message_1to_1peer( +pub extern "system" fn Java_com_google_security_cryptauth_lib_securegcm_ukey2_D2DConnectionContextV1_encode_1message_1to_1peer( mut env: JNIEnv, _: JClass, context_handle: jlong, @@ -293,7 +319,7 @@ if let Ok(ret_vec) = result { env.byte_array_from_slice(ret_vec.as_slice()).expect("unable to create jByteArray") } else { - env.throw_new("com/google/security/cryptauth/lib/securegcm/BadHandleException", "") + env.throw_new("com/google/security/cryptauth/lib/securegcm/ukey2/BadHandleException", "") .expect("failed to find error class"); empty_array } @@ -307,7 +333,7 @@ // from the JVM. #[allow(clippy::not_unsafe_ptr_arg_deref)] #[no_mangle] -pub extern "system" fn Java_com_google_security_cryptauth_lib_securegcm_D2DConnectionContextV1_decode_1message_1from_1peer( +pub extern "system" fn Java_com_google_security_cryptauth_lib_securegcm_ukey2_D2DConnectionContextV1_decode_1message_1from_1peer( mut env: JNIEnv, _: JClass, context_handle: jlong, @@ -337,7 +363,7 @@ env.byte_array_from_slice(message.as_slice()).expect("unable to create jByteArray") } else { env.throw_new( - "com/google/security/cryptauth/lib/securegcm/CryptoException", + "com/google/security/cryptauth/lib/securegcm/ukey2/CryptoException", match result.unwrap_err() { JniError::BadHandle => "Bad context handle", JniError::DecodeError(e) => match e { @@ -356,7 +382,7 @@ /// Returns the last sequence number used to encode a message. #[no_mangle] -pub extern "system" fn Java_com_google_security_cryptauth_lib_securegcm_D2DConnectionContextV1_get_1sequence_1number_1for_1encoding( +pub extern "system" fn Java_com_google_security_cryptauth_lib_securegcm_ukey2_D2DConnectionContextV1_get_1sequence_1number_1for_1encoding( mut env: JNIEnv, _: JClass, context_handle: jlong, @@ -364,7 +390,7 @@ if let Some(ctx) = CONNECTION_HANDLE_MAPPING.lock().get(&(context_handle as u64)) { ctx.get_sequence_number_for_encoding() } else { - env.throw_new("com/google/security/cryptauth/lib/securegcm/BadHandleException", "") + env.throw_new("com/google/security/cryptauth/lib/securegcm/ukey2/BadHandleException", "") .expect("failed to find error class"); -1 } @@ -372,7 +398,7 @@ /// Returns the last sequence number used to decode a message. #[no_mangle] -pub extern "system" fn Java_com_google_security_cryptauth_lib_securegcm_D2DConnectionContextV1_get_1sequence_1number_1for_1decoding( +pub extern "system" fn Java_com_google_security_cryptauth_lib_securegcm_ukey2_D2DConnectionContextV1_get_1sequence_1number_1for_1decoding( mut env: JNIEnv, _: JClass, context_handle: jlong, @@ -380,7 +406,7 @@ if let Some(ctx) = CONNECTION_HANDLE_MAPPING.lock().get(&(context_handle as u64)) { ctx.get_sequence_number_for_decoding() } else { - env.throw_new("com/google/security/cryptauth/lib/securegcm/BadHandleException", "") + env.throw_new("com/google/security/cryptauth/lib/securegcm/ukey2/BadHandleException", "") .expect("failed to find error class"); -1 } @@ -389,7 +415,7 @@ /// Creates a saved session that can later be used for resumption. The session data may be /// persisted, but it must be stored in a secure location. #[no_mangle] -pub extern "system" fn Java_com_google_security_cryptauth_lib_securegcm_D2DConnectionContextV1_save_1session( +pub extern "system" fn Java_com_google_security_cryptauth_lib_securegcm_ukey2_D2DConnectionContextV1_save_1session( mut env: JNIEnv, _: JClass, context_handle: jlong, @@ -398,7 +424,7 @@ if let Some(ctx) = CONNECTION_HANDLE_MAPPING.lock().get(&(context_handle as u64)) { env.byte_array_from_slice(ctx.save_session().as_slice()).expect("unable to save session") } else { - env.throw_new("com/google/security/cryptauth/lib/securegcm/BadHandleException", "") + env.throw_new("com/google/security/cryptauth/lib/securegcm/ukey2/BadHandleException", "") .expect("failed to find error class"); empty_array } @@ -409,7 +435,7 @@ // Safety: We know the session_info pointer is safe because it is coming directly from the JVM. #[no_mangle] #[allow(clippy::not_unsafe_ptr_arg_deref)] -pub extern "system" fn Java_com_google_security_cryptauth_lib_securegcm_D2DConnectionContextV1_from_1saved_1session( +pub extern "system" fn Java_com_google_security_cryptauth_lib_securegcm_ukey2_D2DConnectionContextV1_from_1saved_1session( mut env: JNIEnv, _: JClass, session_info: jbyteArray, @@ -421,7 +447,7 @@ D2DConnectionContextV1::from_saved_session::<CryptoProvider>(session_info_rust.as_slice()); if ctx.is_err() { env.throw_new( - "com/google/security/cryptauth/lib/securegcm/SessionRestoreException", + "com/google/security/cryptauth/lib/securegcm/ukey2/SessionRestoreException", match ctx.err().unwrap() { DeserializeError::BadDataLength => "DeserializeError: bad session_info length", DeserializeError::BadProtocolVersion => "DeserializeError: bad protocol version", @@ -440,7 +466,7 @@ /// of the ASCII string "D2D". Since the server and client share the same session keys, the /// resulting session unique is also the same. #[no_mangle] -pub extern "system" fn Java_com_google_security_cryptauth_lib_securegcm_D2DConnectionContextV1_get_1session_1unique( +pub extern "system" fn Java_com_google_security_cryptauth_lib_securegcm_ukey2_D2DConnectionContextV1_get_1session_1unique( mut env: JNIEnv, _: JClass, context_handle: jlong, @@ -450,7 +476,7 @@ env.byte_array_from_slice(ctx.get_session_unique::<CryptoProvider>().as_slice()) .expect("unable to get unique session id") } else { - env.throw_new("com/google/security/cryptauth/lib/securegcm/BadHandleException", "") + env.throw_new("com/google/security/cryptauth/lib/securegcm/ukey2/BadHandleException", "") .expect("failed to find error class"); empty_array }
diff --git a/nearby/connections/ukey2/ukey2_proto/src/ukey2_all_proto/device_to_device_messages.rs b/nearby/connections/ukey2/ukey2_proto/src/ukey2_all_proto/device_to_device_messages.rs index 3c2da35..fb44c51 100644 --- a/nearby/connections/ukey2/ukey2_proto/src/ukey2_all_proto/device_to_device_messages.rs +++ b/nearby/connections/ukey2/ukey2_proto/src/ukey2_all_proto/device_to_device_messages.rs
@@ -1,4 +1,4 @@ -// Copyright 2023 Google LLC +// Copyright 2024 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -13,7 +13,7 @@ // limitations under the License. // This file is generated by rust-protobuf 3.2.0. Do not edit -// .proto file is parsed by protoc 3.19.1 +// .proto file is parsed by protoc 3.21.12 // @generated // https://github.com/rust-lang/rust-clippy/issues/702
diff --git a/nearby/connections/ukey2/ukey2_proto/src/ukey2_all_proto/securegcm.rs b/nearby/connections/ukey2/ukey2_proto/src/ukey2_all_proto/securegcm.rs index 3231440..3ba20e0 100644 --- a/nearby/connections/ukey2/ukey2_proto/src/ukey2_all_proto/securegcm.rs +++ b/nearby/connections/ukey2/ukey2_proto/src/ukey2_all_proto/securegcm.rs
@@ -1,4 +1,4 @@ -// Copyright 2023 Google LLC +// Copyright 2024 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -13,7 +13,7 @@ // limitations under the License. // This file is generated by rust-protobuf 3.2.0. Do not edit -// .proto file is parsed by protoc 3.19.1 +// .proto file is parsed by protoc 3.21.12 // @generated // https://github.com/rust-lang/rust-clippy/issues/702
diff --git a/nearby/connections/ukey2/ukey2_proto/src/ukey2_all_proto/securemessage.rs b/nearby/connections/ukey2/ukey2_proto/src/ukey2_all_proto/securemessage.rs index 161e0be..d11c330 100644 --- a/nearby/connections/ukey2/ukey2_proto/src/ukey2_all_proto/securemessage.rs +++ b/nearby/connections/ukey2/ukey2_proto/src/ukey2_all_proto/securemessage.rs
@@ -1,4 +1,4 @@ -// Copyright 2023 Google LLC +// Copyright 2024 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -13,7 +13,7 @@ // limitations under the License. // This file is generated by rust-protobuf 3.2.0. Do not edit -// .proto file is parsed by protoc 3.19.1 +// .proto file is parsed by protoc 3.21.12 // @generated // https://github.com/rust-lang/rust-clippy/issues/702
diff --git a/nearby/connections/ukey2/ukey2_proto/src/ukey2_all_proto/ukey.rs b/nearby/connections/ukey2/ukey2_proto/src/ukey2_all_proto/ukey.rs index 5370207..4535937 100644 --- a/nearby/connections/ukey2/ukey2_proto/src/ukey2_all_proto/ukey.rs +++ b/nearby/connections/ukey2/ukey2_proto/src/ukey2_all_proto/ukey.rs
@@ -1,4 +1,4 @@ -// Copyright 2023 Google LLC +// Copyright 2024 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -13,7 +13,7 @@ // limitations under the License. // This file is generated by rust-protobuf 3.2.0. Do not edit -// .proto file is parsed by protoc 3.19.1 +// .proto file is parsed by protoc 3.21.12 // @generated // https://github.com/rust-lang/rust-clippy/issues/702
diff --git a/nearby/connections/ukey2/ukey2_shell/Cargo.toml b/nearby/connections/ukey2/ukey2_shell/Cargo.toml index 9a2856d..2ac12fa 100644 --- a/nearby/connections/ukey2/ukey2_shell/Cargo.toml +++ b/nearby/connections/ukey2/ukey2_shell/Cargo.toml
@@ -11,4 +11,4 @@ crypto_provider_rustcrypto = { workspace = true, features = [ "alloc" ] } ukey2_rs = { version = "0.1.0", path = "../ukey2" } ukey2_connections = { version = "0.1.0", path = "../ukey2_connections" } -clap = { version = "4.0.17", default-features = false, features = ["std", "derive"] } +clap = { workspace = true, features = ["std", "derive"] }
diff --git a/nearby/crypto/README.md b/nearby/crypto/README.md index 4cb65be..698a954 100644 --- a/nearby/crypto/README.md +++ b/nearby/crypto/README.md
@@ -1,7 +1,7 @@ # What is this? A crypto provider that abstracts over different crypto implementations, mainly the Rust -implementations by [RustCrypto](https://github.com/RustCrypto), OpenSSL and BoringSSL. +implementations by [RustCrypto](https://github.com/RustCrypto) and BoringSSL. ## Project structure @@ -11,7 +11,7 @@ like AES, SHA2, X25519 and P256 ECDH, HKDF, HMAC, etc. Two implementations are currently provided, `crypto_provider_rustcrypto` and -`crypto_provider_openssl`. +`crypto_provider_boringssl`. #### `crypto_provider::aes` Abstraction on top plain AES, including AES-CTR and AES-CBC. @@ -26,25 +26,11 @@ Implementations of `crypto_provider` types using the convenient pure-Rust primitives from [Rust Crypto](https://github.com/RustCrypto). -### `crypto_provider_openssl` +### `crypto_provider_boringssl` Implementations of `crypto_provider` types using the -[openSSL Rust crate](https://github.com/sfackler/rust-openssl), which is a Rust -wrapper for openSSL. - -#### Using BoringSSL - -`crypto_provider_openssl` can also be made to use BoringSSL via the `boringssl` feature. This -translates to using the `openssl` and `openssl-sys` crates' `unstable_boringssl` feature. Since the -depenedency `bssl-sys` is not on crates.io, to test the BoringSSL integration, you'll need to run -`cargo run -- build-boringssl`, which clones BoringSSL. Then, to use the Android version of -`rust-openssl`, run `cargo run -- prepare-rust-openssl`. - -* Run `cargo run -- build-boringssl` to setup the workspace -* Run `cargo --config=.cargo/config-boringssl.toml test --features=boringssl` to test the crypto - provider implementations. -* Run `cargo --config=.cargo/config-boringssl.toml run -p <package> --features=openssl,boringssl - --no-default-features` on FFI, JNI, or shell targets to make them use BoringSSL. +[bssl-crypto](https://boringssl.googlesource.com/boringssl/+/master/rust/bssl-crypto), which is a +Rust binding layer for BoringSSL. ## Setup
diff --git a/nearby/crypto/crypto_provider/Cargo.toml b/nearby/crypto/crypto_provider/Cargo.toml index 1a588bb..a31f5fa 100644 --- a/nearby/crypto/crypto_provider/Cargo.toml +++ b/nearby/crypto/crypto_provider/Cargo.toml
@@ -13,8 +13,7 @@ [dev-dependencies] criterion.workspace = true hex-literal.workspace = true -crypto_provider_openssl.workspace = true -crypto_provider_rustcrypto = { workspace = true, features = ["std"] } +crypto_provider_default = { workspace = true, features = ["std"]} rand_ext.workspace = true rand.workspace = true @@ -23,6 +22,7 @@ std = [] alloc = [] test_vectors = [] +test_boringssl = ["crypto_provider_default/boringssl"] raw_private_key_permit = [] [[bench]]
diff --git a/nearby/crypto/crypto_provider/benches/constant_time_eq_bench.rs b/nearby/crypto/crypto_provider/benches/constant_time_eq_bench.rs index 70c65cf..3859616 100644 --- a/nearby/crypto/crypto_provider/benches/constant_time_eq_bench.rs +++ b/nearby/crypto/crypto_provider/benches/constant_time_eq_bench.rs
@@ -18,8 +18,7 @@ criterion_group, criterion_main, measurement::WallTime, BatchSize, BenchmarkGroup, Criterion, }; use crypto_provider::CryptoProvider; -use crypto_provider_openssl::Openssl; -use crypto_provider_rustcrypto::RustCrypto; +use crypto_provider_default::CryptoProviderImpl; use rand::{distributions::Standard, rngs::ThreadRng, Rng}; fn constant_time_eq_equals(c: &mut Criterion) { @@ -57,8 +56,7 @@ } } - add_benches::<RustCrypto>(&mut group, &mut rng); - add_benches::<Openssl>(&mut group, &mut rng); + add_benches::<CryptoProviderImpl>(&mut group, &mut rng); } criterion_group!(benches, constant_time_eq_equals);
diff --git a/nearby/crypto/crypto_provider/benches/hkdf_bench.rs b/nearby/crypto/crypto_provider/benches/hkdf_bench.rs index e73f8cf..6464c7e 100644 --- a/nearby/crypto/crypto_provider/benches/hkdf_bench.rs +++ b/nearby/crypto/crypto_provider/benches/hkdf_bench.rs
@@ -19,8 +19,7 @@ use crypto_provider::hkdf::Hkdf; use crypto_provider::CryptoProvider; -use crypto_provider_openssl::Openssl; -use crypto_provider_rustcrypto::RustCrypto; +use crypto_provider_default::CryptoProviderImpl; // simple benchmark, which creates a new hmac, updates once, then finalizes fn hkdf_sha256_operations<C: CryptoProvider>(c: &mut Criterion) { @@ -46,6 +45,6 @@ }); } -criterion_group!(benches, hkdf_sha256_operations::<RustCrypto>, hkdf_sha256_operations::<Openssl>,); +criterion_group!(benches, hkdf_sha256_operations::<CryptoProviderImpl>); criterion_main!(benches);
diff --git a/nearby/crypto/crypto_provider/benches/hmac_bench.rs b/nearby/crypto/crypto_provider/benches/hmac_bench.rs index 9bcfde0..0d856d4 100644 --- a/nearby/crypto/crypto_provider/benches/hmac_bench.rs +++ b/nearby/crypto/crypto_provider/benches/hmac_bench.rs
@@ -18,8 +18,7 @@ use crypto_provider::hmac::Hmac; use crypto_provider::{CryptoProvider, CryptoRng}; -use crypto_provider_openssl::Openssl; -use crypto_provider_rustcrypto::RustCrypto; +use crypto_provider_default::CryptoProviderImpl; use rand_ext::random_bytes; // simple benchmark, which creates a new hmac, updates once, then finalizes @@ -53,10 +52,8 @@ criterion_group!( benches, - hmac_sha256_operations::<RustCrypto>, - hmac_sha256_operations::<Openssl>, - hmac_sha512_operations::<RustCrypto>, - hmac_sha512_operations::<Openssl> + hmac_sha256_operations::<CryptoProviderImpl>, + hmac_sha512_operations::<CryptoProviderImpl>, ); criterion_main!(benches);
diff --git a/nearby/crypto/crypto_provider/src/aes/mod.rs b/nearby/crypto/crypto_provider/src/aes/mod.rs index e359bad..b3dbd6a 100644 --- a/nearby/crypto/crypto_provider/src/aes/mod.rs +++ b/nearby/crypto/crypto_provider/src/aes/mod.rs
@@ -15,7 +15,7 @@ //! An abstraction layer around AES implementations. //! //! The design is an attempt to make it easy to provide implementations that are both idiomatic -//! Rust (e.g. RustCrypto) as well as FFI-backed (e.g. openssl and other C impls). +//! Rust (e.g. RustCrypto) as well as FFI-backed (e.g. boringSSL and other C impls). use core::{array, fmt}; pub mod ctr;
diff --git a/nearby/crypto/crypto_provider/src/ed25519.rs b/nearby/crypto/crypto_provider/src/ed25519.rs index b435ca2..7002335 100644 --- a/nearby/crypto/crypto_provider/src/ed25519.rs +++ b/nearby/crypto/crypto_provider/src/ed25519.rs
@@ -166,7 +166,7 @@ /// Builds this public key from an array of bytes in /// the format yielded by `to_bytes`. - fn from_bytes(bytes: &RawPublicKey) -> Result<Self, InvalidBytes> + fn from_bytes(bytes: &RawPublicKey) -> Result<Self, InvalidPublicKeyBytes> where Self: Sized; @@ -183,7 +183,7 @@ /// error returned when bad bytes are provided to generate keypair #[derive(Debug)] -pub struct InvalidBytes; +pub struct InvalidPublicKeyBytes; /// Error returned if the verification on the signature + message fails #[derive(Debug)]
diff --git a/nearby/crypto/crypto_provider_boringssl/Cargo.lock b/nearby/crypto/crypto_provider_boringssl/Cargo.lock index 7773e56..432c546 100644 --- a/nearby/crypto/crypto_provider_boringssl/Cargo.lock +++ b/nearby/crypto/crypto_provider_boringssl/Cargo.lock
@@ -3,6 +3,15 @@ version = 3 [[package]] +name = "aho-corasick" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2969dcb958b36655471fc61f7e416fa76033bdd4bfed0678d8fee1e2d07a1f0" +dependencies = [ + "memchr", +] + +[[package]] name = "base64" version = "0.21.4" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -10,7 +19,7 @@ [[package]] name = "bssl-crypto" -version = "0.1.0" +version = "0.2.0" dependencies = [ "bssl-sys", ] @@ -68,6 +77,12 @@ ] [[package]] +name = "glob" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" + +[[package]] name = "hex" version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -98,6 +113,12 @@ checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" [[package]] +name = "memchr" +version = "2.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "523dc4f511e55ab87b694dc30d0f820d60906ef06413f93d4d7a1385599cc149" + +[[package]] name = "ppv-lite86" version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -105,18 +126,18 @@ [[package]] name = "proc-macro2" -version = "1.0.66" +version = "1.0.74" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18fb31db3f9bddb2ea821cde30a9f70117e3f119938b5ee630b7403aa6e2ead9" +checksum = "2de98502f212cfcea8d0bb305bd0f49d7ebdd75b64ba0a68f937d888f4e0d6db" dependencies = [ "unicode-ident", ] [[package]] name = "quote" -version = "1.0.33" +version = "1.0.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae" +checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef" dependencies = [ "proc-macro2", ] @@ -171,10 +192,45 @@ ] [[package]] -name = "rstest" -version = "0.17.0" +name = "regex" +version = "1.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de1bb486a691878cd320c2f0d319ba91eeaa2e894066d8b5f8f117c000e9d962" +checksum = "380b951a9c5e80ddfd6136919eef32310721aa4aacd4889a8d39124b026ab343" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f804c7828047e88b2d32e2d7fe5a105da8ee3264f01902f796c8e067dc2483f" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" + +[[package]] +name = "relative-path" +version = "1.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e898588f33fdd5b9420719948f9f2a32c922a246964576f71ba7f24f80610fbc" + +[[package]] +name = "rstest" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97eeab2f3c0a199bc4be135c36c924b6590b88c377d416494288c14f2db30199" dependencies = [ "rstest_macros", "rustc_version", @@ -182,15 +238,18 @@ [[package]] name = "rstest_macros" -version = "0.17.0" +version = "0.18.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "290ca1a1c8ca7edb7c3283bd44dc35dd54fdec6253a3912e201ba1072018fca8" +checksum = "d428f8247852f894ee1be110b375111b586d4fa431f6c46e64ba5a0dcccbe605" dependencies = [ "cfg-if", + "glob", "proc-macro2", "quote", + "regex", + "relative-path", "rustc_version", - "syn 1.0.109", + "syn", "unicode-ident", ] @@ -203,7 +262,7 @@ "quote", "rand", "rustc_version", - "syn 2.0.29", + "syn", ] [[package]] @@ -229,29 +288,29 @@ [[package]] name = "serde" -version = "1.0.187" +version = "1.0.194" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30a7fe14252655bd1e578af19f5fa00fe02fd0013b100ca6b49fde31c41bae4c" +checksum = "0b114498256798c94a0689e1a15fec6005dee8ac1f41de56404b67afc2a4b773" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.187" +version = "1.0.194" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e46b2a6ca578b3f1d4501b12f78ed4692006d79d82a1a7c561c12dbc3d625eb8" +checksum = "a3385e45322e8f9931410f01b3031ec534c3947d0e94c18049af4d9f9907d4e0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.29", + "syn", ] [[package]] name = "serde_json" -version = "1.0.105" +version = "1.0.110" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "693151e1ac27563d6dbcec9dee9fbd5da8539b20fa14ad3752b2e6d363ace360" +checksum = "6fbd975230bada99c8bb618e0c365c2eefa219158d5c6c29610fd09ff1833257" dependencies = [ "itoa", "ryu", @@ -260,20 +319,9 @@ [[package]] name = "syn" -version = "1.0.109" +version = "2.0.46" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "syn" -version = "2.0.29" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c324c494eba9d92503e6f1ef2e6df781e78f6a7705a0202d9801b198807d518a" +checksum = "89456b690ff72fddcecf231caedbe615c59480c93358a93dfae7fc29e3ebbf0e" dependencies = [ "proc-macro2", "quote",
diff --git a/nearby/crypto/crypto_provider_boringssl/src/aead/aes_gcm.rs b/nearby/crypto/crypto_provider_boringssl/src/aead/aes_gcm.rs index 03bb087..75fb385 100644 --- a/nearby/crypto/crypto_provider_boringssl/src/aead/aes_gcm.rs +++ b/nearby/crypto/crypto_provider_boringssl/src/aead/aes_gcm.rs
@@ -19,52 +19,89 @@ use crypto_provider::aead::{Aead, AeadError, AeadInit}; use crypto_provider::aes::{Aes128Key, Aes256Key, AesKey}; -pub struct AesGcm(bssl_crypto::aead::AesGcm); +pub struct AesGcm128(bssl_crypto::aead::Aes128Gcm); -impl AeadInit<Aes128Key> for AesGcm { +pub struct AesGcm256(bssl_crypto::aead::Aes256Gcm); + +impl AeadInit<Aes128Key> for AesGcm128 { fn new(key: &Aes128Key) -> Self { - Self(bssl_crypto::aead::new_aes_128_gcm(key.as_array())) + Self(bssl_crypto::aead::Aes128Gcm::new(key.as_array())) } } -impl AeadInit<Aes256Key> for AesGcm { - fn new(key: &Aes256Key) -> Self { - Self(bssl_crypto::aead::new_aes_256_gcm(key.as_array())) - } -} +impl crypto_provider::aead::AesGcm for AesGcm128 {} -impl crypto_provider::aead::AesGcm for AesGcm {} - -impl Aead for AesGcm { +impl Aead for AesGcm128 { const TAG_SIZE: usize = 16; type Nonce = [u8; 12]; type Tag = [u8; 16]; fn encrypt(&self, msg: &[u8], aad: &[u8], nonce: &Self::Nonce) -> Result<Vec<u8>, AeadError> { - self.0.encrypt(msg, aad, nonce).map_err(|_| AeadError) + Ok(self.0.seal(nonce, msg, aad)) } fn encrypt_detached( &self, - _msg: &mut [u8], - _aad: &[u8], - _nonce: &Self::Nonce, + msg: &mut [u8], + aad: &[u8], + nonce: &Self::Nonce, ) -> Result<Self::Tag, AeadError> { - unimplemented!("Not yet supported by boringssl") + Ok(self.0.seal_in_place(nonce, msg, aad)) } fn decrypt(&self, msg: &[u8], aad: &[u8], nonce: &Self::Nonce) -> Result<Vec<u8>, AeadError> { - self.0.decrypt(msg, aad, nonce).map_err(|_| AeadError) + self.0.open(nonce, msg, aad).ok_or(AeadError) } fn decrypt_detached( &self, - _msg: &mut [u8], - _aad: &[u8], - _nonce: &Self::Nonce, - _tag: &Self::Tag, + msg: &mut [u8], + aad: &[u8], + nonce: &Self::Nonce, + tag: &Self::Tag, ) -> Result<(), AeadError> { - unimplemented!("Not yet supported by boringssl") + self.0.open_in_place(nonce, msg, tag, aad).map_err(|_| AeadError) + } +} + +impl AeadInit<Aes256Key> for AesGcm256 { + fn new(key: &Aes256Key) -> Self { + Self(bssl_crypto::aead::Aes256Gcm::new(key.as_array())) + } +} + +impl crypto_provider::aead::AesGcm for AesGcm256 {} + +impl Aead for AesGcm256 { + const TAG_SIZE: usize = 16; + type Nonce = [u8; 12]; + type Tag = [u8; 16]; + + fn encrypt(&self, msg: &[u8], aad: &[u8], nonce: &Self::Nonce) -> Result<Vec<u8>, AeadError> { + Ok(self.0.seal(nonce, msg, aad)) + } + + fn encrypt_detached( + &self, + msg: &mut [u8], + aad: &[u8], + nonce: &Self::Nonce, + ) -> Result<Self::Tag, AeadError> { + Ok(self.0.seal_in_place(nonce, msg, aad)) + } + + fn decrypt(&self, msg: &[u8], aad: &[u8], nonce: &Self::Nonce) -> Result<Vec<u8>, AeadError> { + self.0.open(nonce, msg, aad).ok_or(AeadError) + } + + fn decrypt_detached( + &self, + msg: &mut [u8], + aad: &[u8], + nonce: &Self::Nonce, + tag: &Self::Tag, + ) -> Result<(), AeadError> { + self.0.open_in_place(nonce, msg, tag, aad).map_err(|_| AeadError) } } @@ -78,12 +115,12 @@ use super::*; #[apply(aes_128_gcm_test_cases)] - fn aes_gcm_128_test(testcase: CryptoProviderTestCase<AesGcm>) { + fn aes_gcm_128_test(testcase: CryptoProviderTestCase<AesGcm128>) { testcase(PhantomData); } #[apply(aes_256_gcm_test_cases)] - fn aes_gcm_256_test(testcase: CryptoProviderTestCase<AesGcm>) { + fn aes_gcm_256_test(testcase: CryptoProviderTestCase<AesGcm256>) { testcase(PhantomData); } }
diff --git a/nearby/crypto/crypto_provider_boringssl/src/aead/aes_gcm_siv.rs b/nearby/crypto/crypto_provider_boringssl/src/aead/aes_gcm_siv.rs index d1fb0e7..ac26c43 100644 --- a/nearby/crypto/crypto_provider_boringssl/src/aead/aes_gcm_siv.rs +++ b/nearby/crypto/crypto_provider_boringssl/src/aead/aes_gcm_siv.rs
@@ -18,52 +18,89 @@ use crypto_provider::aead::{Aead, AeadError, AeadInit}; use crypto_provider::aes::{Aes128Key, Aes256Key, AesKey}; -pub struct AesGcmSiv(bssl_crypto::aead::AesGcmSiv); +pub struct AesGcmSiv128(bssl_crypto::aead::Aes128GcmSiv); -impl AeadInit<Aes128Key> for AesGcmSiv { +impl AeadInit<Aes128Key> for AesGcmSiv128 { fn new(key: &Aes128Key) -> Self { - Self(bssl_crypto::aead::new_aes_128_gcm_siv(key.as_array())) + Self(bssl_crypto::aead::Aes128GcmSiv::new(key.as_array())) } } -impl AeadInit<Aes256Key> for AesGcmSiv { - fn new(key: &Aes256Key) -> Self { - Self(bssl_crypto::aead::new_aes_256_gcm_siv(key.as_array())) - } -} +impl crypto_provider::aead::AesGcmSiv for AesGcmSiv128 {} -impl crypto_provider::aead::AesGcmSiv for AesGcmSiv {} - -impl Aead for AesGcmSiv { +impl Aead for AesGcmSiv128 { const TAG_SIZE: usize = 16; type Nonce = [u8; 12]; type Tag = [u8; 16]; fn encrypt(&self, msg: &[u8], aad: &[u8], nonce: &Self::Nonce) -> Result<Vec<u8>, AeadError> { - self.0.encrypt(msg, aad, nonce).map_err(|_| AeadError) + Ok(self.0.seal(nonce, msg, aad)) } fn encrypt_detached( &self, - _msg: &mut [u8], - _aad: &[u8], - _nonce: &Self::Nonce, + msg: &mut [u8], + aad: &[u8], + nonce: &Self::Nonce, ) -> Result<Self::Tag, AeadError> { - unimplemented!("Not yet supported by boringssl") + Ok(self.0.seal_in_place(nonce, msg, aad)) } fn decrypt(&self, msg: &[u8], aad: &[u8], nonce: &Self::Nonce) -> Result<Vec<u8>, AeadError> { - self.0.decrypt(msg, aad, nonce).map_err(|_| AeadError) + self.0.open(nonce, msg, aad).ok_or(AeadError) } fn decrypt_detached( &self, - _msg: &mut [u8], - _aad: &[u8], - _nonce: &Self::Nonce, - _tag: &Self::Tag, + msg: &mut [u8], + aad: &[u8], + nonce: &Self::Nonce, + tag: &Self::Tag, ) -> Result<(), AeadError> { - unimplemented!("Not yet supported by boringssl") + self.0.open_in_place(nonce, msg, tag, aad).map_err(|_| AeadError) + } +} + +pub struct AesGcmSiv256(bssl_crypto::aead::Aes256GcmSiv); + +impl AeadInit<Aes256Key> for AesGcmSiv256 { + fn new(key: &Aes256Key) -> Self { + Self(bssl_crypto::aead::Aes256GcmSiv::new(key.as_array())) + } +} + +impl crypto_provider::aead::AesGcmSiv for AesGcmSiv256 {} + +impl Aead for AesGcmSiv256 { + const TAG_SIZE: usize = 16; + type Nonce = [u8; 12]; + type Tag = [u8; 16]; + + fn encrypt(&self, msg: &[u8], aad: &[u8], nonce: &Self::Nonce) -> Result<Vec<u8>, AeadError> { + Ok(self.0.seal(nonce, msg, aad)) + } + + fn encrypt_detached( + &self, + msg: &mut [u8], + aad: &[u8], + nonce: &Self::Nonce, + ) -> Result<Self::Tag, AeadError> { + Ok(self.0.seal_in_place(nonce, msg, aad)) + } + + fn decrypt(&self, msg: &[u8], aad: &[u8], nonce: &Self::Nonce) -> Result<Vec<u8>, AeadError> { + self.0.open(nonce, msg, aad).ok_or(AeadError) + } + + fn decrypt_detached( + &self, + msg: &mut [u8], + aad: &[u8], + nonce: &Self::Nonce, + tag: &Self::Tag, + ) -> Result<(), AeadError> { + self.0.open_in_place(nonce, msg, tag, aad).map_err(|_| AeadError) } } @@ -77,12 +114,12 @@ use super::*; #[apply(aes_128_gcm_siv_test_cases)] - fn aes_gcm_siv_128_test(testcase: CryptoProviderTestCase<AesGcmSiv>) { + fn aes_gcm_siv_128_test(testcase: CryptoProviderTestCase<AesGcmSiv128>) { testcase(PhantomData); } #[apply(aes_256_gcm_siv_test_cases)] - fn aes_gcm_siv_256_test(testcase: CryptoProviderTestCase<AesGcmSiv>) { + fn aes_gcm_siv_256_test(testcase: CryptoProviderTestCase<AesGcmSiv256>) { testcase(PhantomData); } }
diff --git a/nearby/crypto/crypto_provider_boringssl/src/aes/mod.rs b/nearby/crypto/crypto_provider_boringssl/src/aes/mod.rs index d5cbe58..d9f3315 100644 --- a/nearby/crypto/crypto_provider_boringssl/src/aes/mod.rs +++ b/nearby/crypto/crypto_provider_boringssl/src/aes/mod.rs
@@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -use bssl_crypto::aes::{AesDecryptKey, AesEncryptKey}; +use bssl_crypto::aes::{DecryptKey, EncryptKey}; use crypto_provider::aes::{ Aes, Aes128Key, Aes256Key, AesBlock, AesCipher, AesDecryptCipher, AesEncryptCipher, AesKey, }; @@ -40,28 +40,28 @@ } /// A BoringSSL backed AES-128 Encryption Cipher -pub struct Aes128EncryptCipher(AesEncryptKey); +pub struct Aes128EncryptCipher(EncryptKey); /// A BoringSSL backed AES-128 Decryption Cipher -pub struct Aes128DecryptCipher(AesDecryptKey); +pub struct Aes128DecryptCipher(DecryptKey); /// A BoringSSL backed AES-256 Encryption Cipher -pub struct Aes256EncryptCipher(AesEncryptKey); +pub struct Aes256EncryptCipher(EncryptKey); /// A BoringSSL backed AES-256 Decryption Cipher -pub struct Aes256DecryptCipher(AesDecryptKey); +pub struct Aes256DecryptCipher(DecryptKey); impl AesCipher for Aes128EncryptCipher { type Key = Aes128Key; fn new(key: &Self::Key) -> Self { - Self(bssl_crypto::aes::AesEncryptKey::new_aes_128(*key.as_array())) + Self(EncryptKey::new_128(key.as_array())) } } impl AesEncryptCipher for Aes128EncryptCipher { fn encrypt(&self, block: &mut AesBlock) { - bssl_crypto::aes::Aes::encrypt(&self.0, block) + self.0.encrypt_in_place(block) } } @@ -69,13 +69,13 @@ type Key = Aes128Key; fn new(key: &Self::Key) -> Self { - Self(bssl_crypto::aes::AesDecryptKey::new_aes_128(*key.as_array())) + Self(DecryptKey::new_128(key.as_array())) } } impl AesDecryptCipher for Aes128DecryptCipher { fn decrypt(&self, block: &mut AesBlock) { - bssl_crypto::aes::Aes::decrypt(&self.0, block) + self.0.decrypt_in_place(block) } } @@ -83,13 +83,13 @@ type Key = Aes256Key; fn new(key: &Self::Key) -> Self { - Self(bssl_crypto::aes::AesEncryptKey::new_aes_256(*key.as_array())) + Self(EncryptKey::new_256(key.as_array())) } } impl AesEncryptCipher for Aes256EncryptCipher { fn encrypt(&self, block: &mut AesBlock) { - bssl_crypto::aes::Aes::encrypt(&self.0, block) + self.0.encrypt_in_place(block) } } @@ -97,13 +97,13 @@ type Key = Aes256Key; fn new(key: &Self::Key) -> Self { - Self(bssl_crypto::aes::AesDecryptKey::new_aes_256(*key.as_array())) + Self(DecryptKey::new_256(key.as_array())) } } impl AesDecryptCipher for Aes256DecryptCipher { fn decrypt(&self, block: &mut AesBlock) { - bssl_crypto::aes::Aes::decrypt(&self.0, block) + self.0.decrypt_in_place(block) } }
diff --git a/nearby/crypto/crypto_provider_boringssl/src/ed25519.rs b/nearby/crypto/crypto_provider_boringssl/src/ed25519.rs index b5c374a..e411df1 100644 --- a/nearby/crypto/crypto_provider_boringssl/src/ed25519.rs +++ b/nearby/crypto/crypto_provider_boringssl/src/ed25519.rs
@@ -13,8 +13,8 @@ // limitations under the License. use crypto_provider::ed25519::{ - InvalidBytes, RawPrivateKey, RawPrivateKeyPermit, RawPublicKey, RawSignature, Signature as _, - SignatureError, + InvalidPublicKeyBytes, RawPrivateKey, RawPrivateKeyPermit, RawPublicKey, RawSignature, + Signature as _, SignatureError, }; pub struct Ed25519; @@ -39,7 +39,7 @@ where Self: Sized, { - let private_key = bssl_crypto::ed25519::PrivateKey::new_from_seed(bytes); + let private_key = bssl_crypto::ed25519::PrivateKey::from_seed(bytes); Self(private_key) } @@ -52,7 +52,7 @@ } fn public(&self) -> Self::PublicKey { - PublicKey(self.0.public()) + PublicKey(self.0.to_public()) } } @@ -60,11 +60,11 @@ impl crypto_provider::ed25519::Signature for Signature { fn from_bytes(bytes: &RawSignature) -> Self { - Self(bssl_crypto::ed25519::Signature::from_bytes(*bytes)) + Self(bssl_crypto::ed25519::Signature::from(*bytes)) } fn to_bytes(&self) -> RawSignature { - self.0.to_bytes() + self.0 } } @@ -73,15 +73,15 @@ impl crypto_provider::ed25519::PublicKey for PublicKey { type Signature = Signature; - fn from_bytes(bytes: &RawPublicKey) -> Result<Self, InvalidBytes> + fn from_bytes(bytes: &RawPublicKey) -> Result<Self, InvalidPublicKeyBytes> where Self: Sized, { - Ok(Self(bssl_crypto::ed25519::PublicKey::from_bytes(*bytes))) + Ok(Self(bssl_crypto::ed25519::PublicKey::from_bytes(bytes))) } fn to_bytes(&self) -> RawPublicKey { - self.0.to_bytes() + *self.0.as_bytes() } fn verify_strict( @@ -90,7 +90,7 @@ signature: &Self::Signature, ) -> Result<(), SignatureError> { self.0 - .verify(message, bssl_crypto::ed25519::Signature::from_bytes(signature.to_bytes())) + .verify(message, &bssl_crypto::ed25519::Signature::from(signature.to_bytes())) .map_err(|_| SignatureError) } }
diff --git a/nearby/crypto/crypto_provider_boringssl/src/hkdf.rs b/nearby/crypto/crypto_provider_boringssl/src/hkdf.rs index c162d3d..7b01a2c 100644 --- a/nearby/crypto/crypto_provider_boringssl/src/hkdf.rs +++ b/nearby/crypto/crypto_provider_boringssl/src/hkdf.rs
@@ -18,15 +18,21 @@ //! See the _Using BoringSSL_ section in `crypto/README.md` for instructions on //! how to test against BoringSSL, or see the subcommands in the top level crate. -use bssl_crypto::digest::Md; +use bssl_crypto::digest::Algorithm; +use bssl_crypto::hkdf::Salt; +use core::marker::PhantomData; use crypto_provider::hkdf::InvalidLength; /// Struct providing BoringSSL implemented Hkdf operations. -pub struct Hkdf<M: Md>(bssl_crypto::hkdf::Hkdf<M>); +pub struct Hkdf<M: Algorithm>(bssl_crypto::hkdf::Prk, PhantomData<M>); -impl<M: Md> crypto_provider::hkdf::Hkdf for Hkdf<M> { +impl<M: Algorithm> crypto_provider::hkdf::Hkdf for Hkdf<M> { fn new(salt: Option<&[u8]>, ikm: &[u8]) -> Self { - Self(bssl_crypto::hkdf::Hkdf::<M>::new(salt, ikm)) + let bssl_salt = match salt { + None => Salt::None, + Some(raw_salt) => Salt::NonEmpty(raw_salt), + }; + Self(bssl_crypto::hkdf::Hkdf::<M>::extract(ikm, bssl_salt), PhantomData) } fn expand_multi_info( @@ -37,14 +43,14 @@ if okm.is_empty() { return Ok(()); } - self.0.expand_multi_info(info_components, okm).map_err(|_| InvalidLength) + self.0.expand_into(&info_components.concat(), okm).map_err(|_| InvalidLength) } fn expand(&self, info: &[u8], okm: &mut [u8]) -> Result<(), InvalidLength> { if okm.is_empty() { return Ok(()); } - self.0.expand(info, okm).map_err(|_| InvalidLength) + self.0.expand_into(info, okm).map_err(|_| InvalidLength) } }
diff --git a/nearby/crypto/crypto_provider_boringssl/src/hmac.rs b/nearby/crypto/crypto_provider_boringssl/src/hmac.rs index 7a5e867..53e829e 100644 --- a/nearby/crypto/crypto_provider_boringssl/src/hmac.rs +++ b/nearby/crypto/crypto_provider_boringssl/src/hmac.rs
@@ -19,7 +19,7 @@ impl crypto_provider::hmac::Hmac<32> for HmacSha256 { fn new_from_key(key: [u8; 32]) -> Self { - Self(bssl_crypto::hmac::HmacSha256::new(key)) + Self(bssl_crypto::hmac::HmacSha256::new(&key)) } fn new_from_slice(key: &[u8]) -> Result<Self, InvalidLength> { @@ -31,7 +31,7 @@ } fn finalize(self) -> [u8; 32] { - self.0.finalize() + self.0.digest() } fn verify_slice(self, tag: &[u8]) -> Result<(), MacError> { @@ -39,7 +39,7 @@ } fn verify(self, tag: [u8; 32]) -> Result<(), MacError> { - self.0.verify(tag).map_err(|_| MacError) + self.0.verify(&tag).map_err(|_| MacError) } fn verify_truncated_left(self, tag: &[u8]) -> Result<(), MacError> { @@ -52,7 +52,7 @@ impl crypto_provider::hmac::Hmac<64> for HmacSha512 { fn new_from_key(key: [u8; 64]) -> Self { - Self(bssl_crypto::hmac::HmacSha512::new(key)) + Self(bssl_crypto::hmac::HmacSha512::new(&key)) } fn new_from_slice(key: &[u8]) -> Result<Self, InvalidLength> { @@ -64,7 +64,7 @@ } fn finalize(self) -> [u8; 64] { - self.0.finalize() + self.0.digest() } fn verify_slice(self, tag: &[u8]) -> Result<(), MacError> { @@ -72,7 +72,7 @@ } fn verify(self, tag: [u8; 64]) -> Result<(), MacError> { - self.0.verify(tag).map_err(|_| MacError) + self.0.verify(&tag).map_err(|_| MacError) } fn verify_truncated_left(self, tag: &[u8]) -> Result<(), MacError> {
diff --git a/nearby/crypto/crypto_provider_boringssl/src/lib.rs b/nearby/crypto/crypto_provider_boringssl/src/lib.rs index 75758b6..560169a 100644 --- a/nearby/crypto/crypto_provider_boringssl/src/lib.rs +++ b/nearby/crypto/crypto_provider_boringssl/src/lib.rs
@@ -23,7 +23,7 @@ //! Crate which provides impls for CryptoProvider backed by BoringSSL //! -use bssl_crypto::rand::rand_bytes; +use bssl_crypto::rand_bytes; use crypto_provider::{CryptoProvider, CryptoRng}; /// Implementation of `crypto_provider::aes` types using BoringSSL @@ -69,18 +69,18 @@ type AesCtr128 = aes::ctr::AesCtr128; type AesCtr256 = aes::ctr::AesCtr256; type Ed25519 = ed25519::Ed25519; - type Aes128GcmSiv = aead::aes_gcm_siv::AesGcmSiv; - type Aes256GcmSiv = aead::aes_gcm_siv::AesGcmSiv; - type Aes128Gcm = aead::aes_gcm::AesGcm; - type Aes256Gcm = aead::aes_gcm::AesGcm; + type Aes128GcmSiv = aead::aes_gcm_siv::AesGcmSiv128; + type Aes256GcmSiv = aead::aes_gcm_siv::AesGcmSiv256; + type Aes128Gcm = aead::aes_gcm::AesGcm128; + type Aes256Gcm = aead::aes_gcm::AesGcm256; type CryptoRng = BoringSslRng; fn constant_time_eq(a: &[u8], b: &[u8]) -> bool { - bssl_crypto::mem::crypto_memcmp(a, b) + bssl_crypto::constant_time_compare(a, b) } } -/// OpenSSL implemented random number generator +/// BoringSSL implemented random number generator pub struct BoringSslRng; impl CryptoRng for BoringSslRng {
diff --git a/nearby/crypto/crypto_provider_boringssl/src/p256.rs b/nearby/crypto/crypto_provider_boringssl/src/p256.rs index 7fefecd..564897b 100644 --- a/nearby/crypto/crypto_provider_boringssl/src/p256.rs +++ b/nearby/crypto/crypto_provider_boringssl/src/p256.rs
@@ -14,7 +14,9 @@ extern crate alloc; +use alloc::vec; use bssl_crypto::ecdh::{PrivateKey, PublicKey}; +use core::fmt::{Debug, Formatter}; use crypto_provider::{ elliptic_curve::{EcdhProvider, EphemeralSecret, PublicKey as _}, p256::{PointCompression, P256}, @@ -31,13 +33,25 @@ } /// A NIST-P256 public key. -#[derive(Debug, PartialEq, Eq)] -pub struct P256PublicKey(PublicKey<bssl_crypto::ecdh::P256>); +pub struct P256PublicKey(PublicKey<bssl_crypto::ec::P256>); + +impl PartialEq for P256PublicKey { + fn eq(&self, other: &Self) -> bool { + self.0.to_x962_uncompressed().as_ref() == other.0.to_x962_uncompressed().as_ref() + } +} + +impl Debug for P256PublicKey { + fn fmt(&self, f: &mut Formatter<'_>) -> core::fmt::Result { + write!(f, "X9.62 bytes: {:?}", self.0.to_x962_uncompressed().as_ref()) + } +} + impl crypto_provider::p256::P256PublicKey for P256PublicKey { - type Error = bssl_crypto::ecdh::Error; + type Error = Error; fn from_sec1_bytes(bytes: &[u8]) -> Result<Self, Self::Error> { - PublicKey::try_from(bytes).map(Self) + PublicKey::from_x962_uncompressed(bytes).map(P256PublicKey).ok_or(Error::ConversionFailed) } fn to_sec1_bytes(&self, point_compression: PointCompression) -> ArrayVec<[u8; 65]> { @@ -45,29 +59,37 @@ PointCompression::Compressed => unimplemented!(), PointCompression::Uncompressed => { let mut bytes = ArrayVec::<[u8; 65]>::new(); - bytes.extend_from_slice(&self.0.to_vec()); + bytes.extend_from_slice(self.0.to_x962_uncompressed().as_ref()); bytes } } } - #[allow(clippy::expect_used)] + #[allow(clippy::expect_used, clippy::indexing_slicing)] fn to_affine_coordinates(&self) -> Result<([u8; 32], [u8; 32]), Self::Error> { - Ok(self.0.to_affine_coordinates()) + let raw_key = self.0.to_x962_uncompressed(); + let x = raw_key.as_ref()[1..33].try_into().map_err(|_| Error::ConversionFailed)?; + let y = raw_key.as_ref()[33..65].try_into().map_err(|_| Error::ConversionFailed)?; + Ok((x, y)) } fn from_affine_coordinates(x: &[u8; 32], y: &[u8; 32]) -> Result<Self, Self::Error> { - PublicKey::<bssl_crypto::ecdh::P256>::from_affine_coordinates(x, y).map(Self) + let mut point = vec![0x04]; + point.extend_from_slice(x); + point.extend_from_slice(y); + PublicKey::<bssl_crypto::ec::P256>::from_x962_uncompressed(&point) + .map(Self) + .ok_or(Error::ConversionFailed) } } -/// Ephemeral secrect for use in a P256 Diffie-Hellman +/// Ephemeral secret for use in a P256 Diffie-Hellman exchange. pub struct P256EphemeralSecret { - secret: PrivateKey<bssl_crypto::ecdh::P256>, + secret: PrivateKey<bssl_crypto::ec::P256>, } impl EphemeralSecret<P256> for P256EphemeralSecret { type Impl = P256Ecdh; - type Error = bssl_crypto::ecdh::Error; + type Error = Error; type Rng = (); type EncodedPublicKey = <P256PublicKey as crypto_provider::elliptic_curve::PublicKey<P256>>::EncodedPublicKey; @@ -77,19 +99,27 @@ } fn public_key_bytes(&self) -> Self::EncodedPublicKey { - P256PublicKey((&self.secret).into()).to_bytes() + P256PublicKey(self.secret.to_public_key()).to_bytes() } fn diffie_hellman( self, other_pub: &P256PublicKey, ) -> Result<<Self::Impl as EcdhProvider<P256>>::SharedSecret, Self::Error> { - let shared_secret = self.secret.diffie_hellman(&other_pub.0)?; - let bytes: <Self::Impl as EcdhProvider<P256>>::SharedSecret = shared_secret.to_bytes(); - Ok(bytes) + let shared_secret = self.secret.compute_shared_key(&other_pub.0); + shared_secret.try_into().map_err(|_| Error::DiffieHellmanFailed) } } +/// Error type for ECDH operations. +#[derive(Debug)] +pub enum Error { + /// Failed when trying to convert between representations. + ConversionFailed, + /// The Diffie-Hellman key exchange failed. + DiffieHellmanFailed, +} + #[cfg(test)] impl crypto_provider_test::elliptic_curve::EphemeralSecretForTesting<P256> for P256EphemeralSecret { #[allow(clippy::unwrap_used)] @@ -97,7 +127,7 @@ private_bytes: &[u8; 32], _public_key: &P256PublicKey, ) -> Result<Self, Self::Error> { - Ok(Self { secret: PrivateKey::from_private_bytes(private_bytes).unwrap() }) + Ok(Self { secret: PrivateKey::from_big_endian(private_bytes).unwrap() }) } } @@ -109,7 +139,7 @@ #[apply(p256_test_cases)] fn p256_tests(testcase: CryptoProviderTestCase<P256Ecdh>, name: &str) { - if name == "to_bytes_compressed" { + if name.contains("compressed") { return; // EC point compression not supported by bssl-crypto yet } testcase(PhantomData::<P256Ecdh>)
diff --git a/nearby/crypto/crypto_provider_boringssl/src/sha2.rs b/nearby/crypto/crypto_provider_boringssl/src/sha2.rs index d95294d..fbee81d 100644 --- a/nearby/crypto/crypto_provider_boringssl/src/sha2.rs +++ b/nearby/crypto/crypto_provider_boringssl/src/sha2.rs
@@ -17,9 +17,9 @@ impl crypto_provider::sha2::Sha256 for Sha256 { fn sha256(input: &[u8]) -> [u8; 32] { - let mut digest = bssl_crypto::digest::Sha256::new_digest(); + let mut digest = bssl_crypto::digest::Sha256::new(); digest.update(input); - digest.finalize() + digest.digest() } } @@ -28,8 +28,8 @@ impl crypto_provider::sha2::Sha512 for Sha512 { fn sha512(input: &[u8]) -> [u8; 64] { - let mut digest = bssl_crypto::digest::Sha512::new_digest(); + let mut digest = bssl_crypto::digest::Sha512::new(); digest.update(input); - digest.finalize() + digest.digest() } }
diff --git a/nearby/crypto/crypto_provider_boringssl/src/x25519.rs b/nearby/crypto/crypto_provider_boringssl/src/x25519.rs index 58d040b..f8444f6 100644 --- a/nearby/crypto/crypto_provider_boringssl/src/x25519.rs +++ b/nearby/crypto/crypto_provider_boringssl/src/x25519.rs
@@ -26,29 +26,30 @@ /// A X25519 ephemeral secret used for Diffie-Hellman. pub struct X25519EphemeralSecret { + public_key: bssl_crypto::x25519::PublicKey, secret: bssl_crypto::x25519::PrivateKey, } impl EphemeralSecret<X25519> for X25519EphemeralSecret { type Impl = X25519Ecdh; - type Error = bssl_crypto::x25519::DiffieHellmanError; + type Error = Error; type Rng = (); type EncodedPublicKey = [u8; 32]; fn generate_random(_rng: &mut Self::Rng) -> Self { - Self { secret: bssl_crypto::x25519::PrivateKey::generate() } + let key_pair = bssl_crypto::x25519::PrivateKey::generate(); + Self { public_key: key_pair.0, secret: key_pair.1 } } fn public_key_bytes(&self) -> Self::EncodedPublicKey { - let pubkey: bssl_crypto::x25519::PublicKey = (&self.secret).into(); - pubkey.to_bytes() + self.public_key } fn diffie_hellman( self, other_pub: &<X25519Ecdh as EcdhProvider<X25519>>::PublicKey, ) -> Result<<X25519Ecdh as EcdhProvider<X25519>>::SharedSecret, Self::Error> { - self.secret.diffie_hellman(&other_pub.0).map(|secret| secret.to_bytes()) + self.secret.compute_shared_key(&other_pub.0).ok_or(Error::WrongSize) } } @@ -58,9 +59,12 @@ { fn from_private_components( private_bytes: &[u8; 32], - _public_key: &X25519PublicKey, + public_key: &X25519PublicKey, ) -> Result<Self, Self::Error> { - Ok(Self { secret: bssl_crypto::x25519::PrivateKey::from_private_bytes(private_bytes) }) + Ok(Self { + public_key: public_key.0, + secret: bssl_crypto::x25519::PrivateKey(*private_bytes), + }) } } @@ -69,16 +73,16 @@ pub struct X25519PublicKey(bssl_crypto::x25519::PublicKey); impl PublicKey<X25519> for X25519PublicKey { - type Error = Error; type EncodedPublicKey = [u8; 32]; + type Error = Error; fn from_bytes(bytes: &[u8]) -> Result<Self, Self::Error> { let byte_arr: [u8; 32] = bytes.try_into().map_err(|_| Error::WrongSize)?; - Ok(Self(bssl_crypto::x25519::PublicKey::from(&byte_arr))) + Ok(Self(bssl_crypto::x25519::PublicKey::from(byte_arr))) } fn to_bytes(&self) -> Self::EncodedPublicKey { - self.0.to_bytes() + self.0 } }
diff --git a/nearby/crypto/crypto_provider_default/Cargo.toml b/nearby/crypto/crypto_provider_default/Cargo.toml index 4c906e4..d79739b 100644 --- a/nearby/crypto/crypto_provider_default/Cargo.toml +++ b/nearby/crypto/crypto_provider_default/Cargo.toml
@@ -10,8 +10,7 @@ [dependencies] crypto_provider.workspace = true crypto_provider_rustcrypto = {workspace = true, optional = true} -crypto_provider_boringssl = {path = "../crypto_provider_boringssl", optional = true} -crypto_provider_openssl = {workspace = true, optional = true} +crypto_provider_boringssl = {workspace = true, optional = true} cfg-if.workspace = true [features] @@ -19,5 +18,3 @@ std = ["crypto_provider_rustcrypto/std"] rustcrypto = ["crypto_provider_rustcrypto"] boringssl = ["crypto_provider_boringssl"] -opensslbssl = ["crypto_provider_openssl/boringssl"] -openssl = ["crypto_provider_openssl"]
diff --git a/nearby/crypto/crypto_provider_default/src/lib.rs b/nearby/crypto/crypto_provider_default/src/lib.rs index 52da9d4..dcde771 100644 --- a/nearby/crypto/crypto_provider_default/src/lib.rs +++ b/nearby/crypto/crypto_provider_default/src/lib.rs
@@ -22,8 +22,6 @@ pub use crypto_provider_rustcrypto::RustCrypto as CryptoProviderImpl; } else if #[cfg(feature = "boringssl")] { pub use crypto_provider_boringssl::Boringssl as CryptoProviderImpl; - } else if #[cfg(any(feature = "openssl", feature = "opensslbssl"))] { - pub use crypto_provider_openssl::Openssl as CryptoProviderImpl; } else { compile_error!("No crypto_provider feature enabled!"); }
diff --git a/nearby/crypto/crypto_provider_openssl/Cargo.toml b/nearby/crypto/crypto_provider_openssl/Cargo.toml deleted file mode 100644 index 19ef3e4..0000000 --- a/nearby/crypto/crypto_provider_openssl/Cargo.toml +++ /dev/null
@@ -1,25 +0,0 @@ -[package] -name = "crypto_provider_openssl" -version.workspace = true -edition.workspace = true -publish.workspace = true - -[lints] -workspace = true - -[dependencies] -crypto_provider = { workspace = true, features = ["alloc", "std"] } -crypto_provider_stubs.workspace = true -openssl.workspace = true -cfg-if.workspace = true - -ouroboros = "0.17.0" - -[features] -default = [] -boringssl = ["openssl/unstable_boringssl"] - -[dev-dependencies] -crypto_provider_test.workspace = true -rstest.workspace = true -hex-literal.workspace = true
diff --git a/nearby/crypto/crypto_provider_openssl/src/aes.rs b/nearby/crypto/crypto_provider_openssl/src/aes.rs deleted file mode 100644 index 857be74..0000000 --- a/nearby/crypto/crypto_provider_openssl/src/aes.rs +++ /dev/null
@@ -1,273 +0,0 @@ -// 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. - -// 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. - -//! Implementation of `crypto_provider::aes` types using openssl's `symm` module. - -use openssl::symm::{Cipher, Crypter, Mode}; - -use crypto_provider::{ - aes::{ - cbc::{AesCbcIv, DecryptionError, EncryptionError}, - ctr::NonceAndCounter, - Aes, Aes128Key, Aes256Key, AesBlock, AesCipher, AesDecryptCipher, AesEncryptCipher, AesKey, - }, - tinyvec::SliceVec, -}; - -/// Uber struct which contains impls for AES-128 fns -pub struct Aes128; - -impl Aes for Aes128 { - type Key = Aes128Key; - type EncryptCipher = Aes128Cipher; - type DecryptCipher = Aes128Cipher; -} - -/// Uber struct which contains impls for AES-256 fns -pub struct Aes256; - -impl Aes for Aes256 { - type Key = Aes256Key; - type EncryptCipher = Aes256Cipher; - type DecryptCipher = Aes256Cipher; -} - -/// Wrapper around openssl's AES-128 impl -pub struct Aes128Cipher(Aes128Key); - -impl AesCipher for Aes128Cipher { - type Key = Aes128Key; - - fn new(key: &Self::Key) -> Self { - Self(key.clone()) - } -} - -impl AesEncryptCipher for Aes128Cipher { - fn encrypt(&self, block: &mut AesBlock) { - // openssl requires the output to be at least 32 bytes long - let mut output = [0_u8; 32]; - let mut crypter = - Crypter::new(Cipher::aes_128_ecb(), Mode::Encrypt, self.0.as_slice(), None).unwrap(); - crypter.pad(false); - let _ = crypter.update(block, &mut output).unwrap(); - block.copy_from_slice(&output[..crypto_provider::aes::BLOCK_SIZE]); - } -} - -impl AesDecryptCipher for Aes128Cipher { - fn decrypt(&self, block: &mut AesBlock) { - // openssl requires the output to be at least 32 bytes long - let mut output = [0_u8; 32]; - let mut crypter = - Crypter::new(Cipher::aes_128_ecb(), Mode::Decrypt, self.0.as_slice(), None).unwrap(); - crypter.pad(false); - let _ = crypter.update(block, &mut output).unwrap(); - block.copy_from_slice(&output[..crypto_provider::aes::BLOCK_SIZE]); - } -} - -/// Wrapper around openssl's AES-128 impl -pub struct Aes256Cipher(Aes256Key); - -impl AesCipher for Aes256Cipher { - type Key = Aes256Key; - - fn new(key: &Self::Key) -> Self { - Self(key.clone()) - } -} - -impl AesEncryptCipher for Aes256Cipher { - fn encrypt(&self, block: &mut AesBlock) { - // openssl requires the output to be at least 32 bytes long - let mut output = [0_u8; 32]; - let mut crypter = - Crypter::new(Cipher::aes_256_ecb(), Mode::Encrypt, self.0.as_slice(), None).unwrap(); - crypter.pad(false); - let _ = crypter.update(block, &mut output).unwrap(); - block.copy_from_slice(&output[..crypto_provider::aes::BLOCK_SIZE]); - } -} - -impl AesDecryptCipher for Aes256Cipher { - fn decrypt(&self, block: &mut AesBlock) { - // openssl requires the output to be at least 32 bytes long - let mut output = [0_u8; 32]; - let mut crypter = - Crypter::new(Cipher::aes_256_ecb(), Mode::Decrypt, self.0.as_slice(), None).unwrap(); - crypter.pad(false); - let _ = crypter.update(block, &mut output).unwrap(); - block.copy_from_slice(&output[..crypto_provider::aes::BLOCK_SIZE]); - } -} - -/// OpenSSL implementation of AES-CBC-PKCS7. -pub struct OpenSslAesCbcPkcs7; - -impl crypto_provider::aes::cbc::AesCbcPkcs7Padded for OpenSslAesCbcPkcs7 { - fn encrypt(key: &crypto_provider::aes::Aes256Key, iv: &AesCbcIv, message: &[u8]) -> Vec<u8> { - openssl::symm::encrypt(Cipher::aes_256_cbc(), key.as_slice(), Some(iv.as_slice()), message) - // The output buffer is allocated by the openssl crate and guarantees to have enough - // space to hold the output value and does not overlap with the input slice. - .expect("encrypt should always succeed") - } - - fn encrypt_in_place( - key: &Aes256Key, - iv: &AesCbcIv, - message: &mut SliceVec<u8>, - ) -> Result<(), EncryptionError> { - let encrypted = Self::encrypt(key, iv, message); - if encrypted.len() > message.capacity() { - return Err(EncryptionError::PaddingFailed); - } - message.clear(); - message.extend_from_slice(&encrypted); - Ok(()) - } - - fn decrypt( - key: &crypto_provider::aes::Aes256Key, - iv: &AesCbcIv, - ciphertext: &[u8], - ) -> Result<Vec<u8>, DecryptionError> { - openssl::symm::decrypt( - Cipher::aes_256_cbc(), - key.as_slice(), - Some(iv.as_slice()), - ciphertext, - ) - .map_err(|_| DecryptionError::BadPadding) - } - - fn decrypt_in_place( - key: &Aes256Key, - iv: &AesCbcIv, - ciphertext: &mut SliceVec<u8>, - ) -> Result<(), DecryptionError> { - Self::decrypt(key, iv, ciphertext).map(|result| { - ciphertext.clear(); - ciphertext.extend_from_slice(&result); - }) - } -} - -/// OpenSSL implementation of AES-CTR-128 -pub struct OpenSslAesCtr128 { - enc_cipher: Crypter, -} - -impl crypto_provider::aes::ctr::AesCtr for OpenSslAesCtr128 { - type Key = crypto_provider::aes::Aes128Key; - fn new(key: &Self::Key, nonce_and_counter: NonceAndCounter) -> Self { - Self { - enc_cipher: Crypter::new( - Cipher::aes_128_ctr(), - Mode::Encrypt, - key.as_slice(), - Some(&nonce_and_counter.as_block_array()), - ) - .unwrap(), - } - } - - fn apply_keystream(&mut self, data: &mut [u8]) { - let mut in_slice = vec![0u8; data.len()]; - in_slice.copy_from_slice(data); - let _ = self.enc_cipher.update(&in_slice, data); - } -} - -/// OpenSSL implementation of AES-CTR-256 -pub struct OpenSslAesCtr256 { - enc_cipher: Crypter, -} - -impl crypto_provider::aes::ctr::AesCtr for OpenSslAesCtr256 { - type Key = crypto_provider::aes::Aes256Key; - fn new(key: &Self::Key, nonce_and_counter: NonceAndCounter) -> Self { - Self { - enc_cipher: Crypter::new( - Cipher::aes_256_ctr(), - Mode::Encrypt, - key.as_slice(), - Some(&nonce_and_counter.as_block_array()), - ) - .unwrap(), - } - } - - fn apply_keystream(&mut self, data: &mut [u8]) { - let mut in_slice = vec![0u8; data.len()]; - in_slice.copy_from_slice(data); - let _ = self.enc_cipher.update(&in_slice, data); - } -} - -#[cfg(test)] -mod tests { - use core::marker::PhantomData; - - use crypto_provider_test::aes::cbc::*; - use crypto_provider_test::aes::ctr::*; - use crypto_provider_test::aes::*; - - use super::*; - - #[apply(aes_128_ctr_test_cases)] - fn aes_128_ctr_test(testcase: CryptoProviderTestCase<OpenSslAesCtr128>) { - testcase(PhantomData); - } - - #[apply(aes_256_ctr_test_cases)] - fn aes_256_ctr_test(testcase: CryptoProviderTestCase<OpenSslAesCtr256>) { - testcase(PhantomData); - } - - #[apply(aes_128_encrypt_test_cases)] - fn aes_128_enc_test(testcase: CryptoProviderTestCase<Aes128Cipher>) { - testcase(PhantomData); - } - - #[apply(aes_128_decrypt_test_cases)] - fn aes_128_dec_test(testcase: CryptoProviderTestCase<Aes128Cipher>) { - testcase(PhantomData); - } - - #[apply(aes_256_encrypt_test_cases)] - fn aes_256_enc_test(testcase: CryptoProviderTestCase<Aes256Cipher>) { - testcase(PhantomData); - } - - #[apply(aes_256_decrypt_test_cases)] - fn aes_256_dec_test(testcase: CryptoProviderTestCase<Aes256Cipher>) { - testcase(PhantomData); - } - - #[apply(aes_256_cbc_test_cases)] - fn aes_256_cbc_test(testcase: CryptoProviderTestCase<OpenSslAesCbcPkcs7>) { - testcase(PhantomData); - } -}
diff --git a/nearby/crypto/crypto_provider_openssl/src/ed25519.rs b/nearby/crypto/crypto_provider_openssl/src/ed25519.rs deleted file mode 100644 index 111348a..0000000 --- a/nearby/crypto/crypto_provider_openssl/src/ed25519.rs +++ /dev/null
@@ -1,136 +0,0 @@ -// 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::ed25519::{ - InvalidBytes, RawPrivateKey, RawPrivateKeyPermit, RawPublicKey, RawSignature, Signature as _, - SignatureError, -}; -use openssl::pkey::{Id, PKey, Private}; -use openssl::sign::{Signer, Verifier}; - -pub struct Ed25519; - -impl crypto_provider::ed25519::Ed25519Provider for Ed25519 { - type KeyPair = KeyPair; - type PublicKey = PublicKey; - type Signature = Signature; -} - -pub struct KeyPair(PKey<Private>); - -impl crypto_provider::ed25519::KeyPair for KeyPair { - type PublicKey = PublicKey; - type Signature = Signature; - - fn raw_private_key(&self, _permit: &RawPrivateKeyPermit) -> RawPrivateKey { - let private_key = self.0.raw_private_key().unwrap(); - let mut public_key = self.0.raw_public_key().unwrap(); - let mut result = private_key; - result.append(&mut public_key); - result.try_into().unwrap() - } - - fn from_raw_private_key(bytes: &RawPrivateKey, _permit: &RawPrivateKeyPermit) -> Self { - Self(PKey::private_key_from_raw_bytes(bytes, Id::ED25519).unwrap()) - } - - fn sign(&self, msg: &[u8]) -> Self::Signature { - let mut signer = - Signer::new_without_digest(&self.0).expect("should be able to create a signer"); - let sig_bytes: RawSignature = signer - .sign_oneshot_to_vec(msg) - .expect("singing should succeed") - .try_into() - .expect("signature should be a valid size"); - - Self::Signature::from_bytes(&sig_bytes) - } - - fn generate() -> Self { - let key = PKey::generate_ed25519().expect("key generation should not fail"); - Self(key) - } - - fn public(&self) -> Self::PublicKey { - PublicKey( - self.0.raw_public_key().expect("should be able to get a pubic key from a keypair"), - ) - } -} - -pub struct Signature(RawSignature); - -impl crypto_provider::ed25519::Signature for Signature { - fn from_bytes(bytes: &RawSignature) -> Self { - Self(*bytes) - } - - fn to_bytes(&self) -> RawSignature { - self.0 - } -} - -pub struct PublicKey(Vec<u8>); - -impl crypto_provider::ed25519::PublicKey for PublicKey { - type Signature = Signature; - - fn from_bytes(bytes: &RawPublicKey) -> Result<Self, InvalidBytes> - where - Self: Sized, - { - Ok(PublicKey(bytes.to_vec())) - } - - fn to_bytes(&self) -> RawPublicKey { - //Should be length 32 - self.0.as_slice().try_into().unwrap() - } - - fn verify_strict( - &self, - message: &[u8], - signature: &Self::Signature, - ) -> Result<(), SignatureError> { - let public_key = PKey::public_key_from_raw_bytes(self.0.as_slice(), Id::ED25519) - .expect("should be a valid public key"); - - let mut verifier = Verifier::new_without_digest(public_key.as_ref()) - .expect("should be able to init verifier"); - let result = verifier - .verify_oneshot(signature.0.as_slice(), message) - .expect("should be able to call verify"); - if result { - Ok(()) - } else { - Err(SignatureError) - } - } -} - -#[cfg(test)] -mod tests { - use crate::ed25519::Ed25519; - use crypto_provider_test::ed25519::{run_rfc_test_vectors, run_wycheproof_test_vectors}; - - #[test] - fn wycheproof_test_ed25519_openssl() { - run_wycheproof_test_vectors::<Ed25519>() - } - - #[test] - fn rfc_test_ed25519_openssl() { - run_rfc_test_vectors::<Ed25519>() - } -}
diff --git a/nearby/crypto/crypto_provider_openssl/src/hkdf_boringssl.rs b/nearby/crypto/crypto_provider_openssl/src/hkdf_boringssl.rs deleted file mode 100644 index 152cdfc..0000000 --- a/nearby/crypto/crypto_provider_openssl/src/hkdf_boringssl.rs +++ /dev/null
@@ -1,72 +0,0 @@ -// 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. - -//! BoringSSL based HKDF implementation. Unfortunately, because the OpenSSL and BoringSSL APIs -//! diverged for HKDF, we have to have separate implementations. -//! -//! See the _Using BoringSSL_ section in `crypto/README.md` for instructions on -//! how to test against BoringSSL, or see the subcommands in the top level crate. - -use crate::OpenSslHash; -use crypto_provider::hkdf::InvalidLength; -use std::marker::PhantomData; - -/// openssl based hkdf implementation -pub struct Hkdf<H: OpenSslHash> { - _marker: PhantomData<H>, - salt: Option<Vec<u8>>, - ikm: Vec<u8>, -} - -impl<H: OpenSslHash> crypto_provider::hkdf::Hkdf for Hkdf<H> { - fn new(salt: Option<&[u8]>, ikm: &[u8]) -> Self { - Self { _marker: Default::default(), salt: salt.map(Vec::from), ikm: Vec::from(ikm) } - } - - fn expand_multi_info( - &self, - info_components: &[&[u8]], - okm: &mut [u8], - ) -> Result<(), InvalidLength> { - // open ssl will panic in the case of a 0 length okm, but expected behavior is no-op - if okm.is_empty() { - return Ok(()); - } - openssl::hkdf::hkdf( - okm, - H::get_md(), - self.ikm.as_slice(), - self.salt.as_deref().unwrap_or_default(), - &info_components.concat(), - ) - .map_err(|_| InvalidLength) - .map(|_| ()) - } - - fn expand(&self, info: &[u8], okm: &mut [u8]) -> Result<(), InvalidLength> { - self.expand_multi_info(&[info], okm) - } -} - -#[cfg(test)] -mod tests { - use crate::Openssl; - use core::marker::PhantomData; - use crypto_provider_test::hkdf::*; - - #[apply(hkdf_test_cases)] - fn hkdf_tests(testcase: CryptoProviderTestCase<Openssl>) { - testcase(PhantomData); - } -}
diff --git a/nearby/crypto/crypto_provider_openssl/src/hkdf_openssl.rs b/nearby/crypto/crypto_provider_openssl/src/hkdf_openssl.rs deleted file mode 100644 index b726f5f..0000000 --- a/nearby/crypto/crypto_provider_openssl/src/hkdf_openssl.rs +++ /dev/null
@@ -1,68 +0,0 @@ -// 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::OpenSslHash; -use crypto_provider::hkdf::InvalidLength; -use std::marker::PhantomData; - -/// openssl based hkdf implementation -pub struct Hkdf<H: OpenSslHash> { - _marker: PhantomData<H>, - salt: Option<Vec<u8>>, - ikm: Vec<u8>, -} - -impl<H: OpenSslHash> crypto_provider::hkdf::Hkdf for Hkdf<H> { - fn new(salt: Option<&[u8]>, ikm: &[u8]) -> Self { - Self { _marker: Default::default(), salt: salt.map(Vec::from), ikm: Vec::from(ikm) } - } - - fn expand_multi_info( - &self, - info_components: &[&[u8]], - okm: &mut [u8], - ) -> Result<(), InvalidLength> { - // open ssl will panic in the case of a 0 length okm, but expected behavior is no-op - if okm.is_empty() { - return Ok(()); - } - let mut ctx = openssl::pkey_ctx::PkeyCtx::new_id(openssl::pkey::Id::HKDF) - .expect("hkdf context should not fail"); - let md = H::get_md(); - ctx.derive_init().expect("hkdf derive init should not fail"); - ctx.set_hkdf_md(md).expect("hkdf set md should not fail"); - let _ = self.salt.as_ref().map(|salt| { - ctx.set_hkdf_salt(salt.as_slice()).expect("setting the salt is infallible") - }); - ctx.set_hkdf_key(self.ikm.as_slice()).expect("should be able to set key"); - ctx.add_hkdf_info(&info_components.concat()).expect("should be able to add info"); - ctx.derive(Some(okm)).map_err(|_| InvalidLength).map(|_| ()) - } - - fn expand(&self, info: &[u8], okm: &mut [u8]) -> Result<(), InvalidLength> { - self.expand_multi_info(&[info], okm) - } -} - -#[cfg(test)] -mod tests { - use crate::Openssl; - use core::marker::PhantomData; - use crypto_provider_test::hkdf::*; - - #[apply(hkdf_test_cases)] - fn hkdf_tests(testcase: CryptoProviderTestCase<Openssl>) { - testcase(PhantomData); - } -}
diff --git a/nearby/crypto/crypto_provider_openssl/src/hmac_boringssl.rs b/nearby/crypto/crypto_provider_openssl/src/hmac_boringssl.rs deleted file mode 100644 index 5272995..0000000 --- a/nearby/crypto/crypto_provider_openssl/src/hmac_boringssl.rs +++ /dev/null
@@ -1,103 +0,0 @@ -// 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. - -//! BoringSSL based HMAC implementation. Unfortunately, because the OpenSSL and BoringSSL APIs -//! diverged (https://boringssl.googlesource.com/boringssl/+/HEAD/PORTING.md#hmac-s), we have to -//! have separate implementations. -//! -//! See the _Using BoringSSL_ section in `crypto/README.md` for instructions on -//! how to test against BoringSSL, or see the subcommands in the top level crate. - -use crate::{sha2::OpenSslSha256, sha2::OpenSslSha512, OpenSslHash}; -use crypto_provider::hmac::{InvalidLength, MacError}; -use openssl::hmac::HmacCtx; -use openssl::memcmp; -use std::marker::PhantomData; - -/// BoringSSL based HMAC implementation -pub struct Hmac<H: OpenSslHash> { - marker: PhantomData<H>, - ctx: HmacCtx, -} - -trait Hash<const N: usize>: OpenSslHash {} -impl Hash<32> for OpenSslSha256 {} -impl Hash<64> for OpenSslSha512 {} - -impl<const N: usize, H: Hash<N>> crypto_provider::hmac::Hmac<N> for Hmac<H> { - fn new_from_key(key: [u8; N]) -> Self { - Self { marker: PhantomData, ctx: HmacCtx::new(&key, H::get_md()).unwrap() } - } - - fn new_from_slice(key: &[u8]) -> Result<Self, InvalidLength> { - Ok(Self { marker: PhantomData, ctx: HmacCtx::new(key, H::get_md()).unwrap() }) - } - - fn update(&mut self, data: &[u8]) { - self.ctx.update(data).expect("should be able to update signer"); - } - - fn finalize(mut self) -> [u8; N] { - let mut buf = [0_u8; N]; - let _ = self.ctx.finalize(&mut buf).expect("wrong length"); - buf - } - - fn verify_slice(self, tag: &[u8]) -> Result<(), MacError> { - let binding: [u8; N] = self.finalize(); - let slice = binding.as_slice(); - if memcmp::eq(slice, tag) { - Ok(()) - } else { - Err(MacError) - } - } - - fn verify(self, tag: [u8; N]) -> Result<(), MacError> { - let binding: [u8; N] = self.finalize(); - let slice = binding.as_slice(); - if memcmp::eq(slice, &tag) { - Ok(()) - } else { - Err(MacError) - } - } - - fn verify_truncated_left(self, tag: &[u8]) -> Result<(), MacError> { - let binding: [u8; N] = self.finalize(); - let slice = binding.as_slice(); - let len = tag.len(); - if len == 0 || len > H::get_digest().block_size() { - return Err(MacError); - } - let left = slice.get(..len).ok_or(MacError)?; - if memcmp::eq(left, tag) { - Ok(()) - } else { - Err(MacError) - } - } -} - -#[cfg(test)] -mod tests { - use crate::Openssl; - use core::marker::PhantomData; - use crypto_provider_test::hmac::*; - - #[apply(hmac_test_cases)] - fn hmac_tests(testcase: CryptoProviderTestCase<Openssl>) { - testcase(PhantomData); - } -}
diff --git a/nearby/crypto/crypto_provider_openssl/src/hmac_openssl.rs b/nearby/crypto/crypto_provider_openssl/src/hmac_openssl.rs deleted file mode 100644 index 42f857e..0000000 --- a/nearby/crypto/crypto_provider_openssl/src/hmac_openssl.rs +++ /dev/null
@@ -1,176 +0,0 @@ -// 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::{sha2::OpenSslSha256, sha2::OpenSslSha512, OpenSslHash}; -use core::convert::TryInto; -use crypto_provider::hmac::{InvalidLength, MacError}; -use openssl::memcmp; -use openssl::pkey::{PKey, Private}; -use openssl::sign::Signer; -use ouroboros::self_referencing; -use std::marker::PhantomData; - -/// openssl based hmac implementation -#[self_referencing] -pub struct Hmac<H: OpenSslHash> { - ctx: PKey<Private>, - #[borrows(ctx)] - #[covariant] - signer: Signer<'this>, - marker: PhantomData<H>, -} - -impl crypto_provider::hmac::Hmac<32> for Hmac<OpenSslSha256> { - fn new_from_key(key: [u8; 32]) -> Self { - new_from_key(key) - } - - fn new_from_slice(key: &[u8]) -> Result<Self, InvalidLength> { - new_from_slice(key) - } - - fn update(&mut self, data: &[u8]) { - update(self, data) - } - - fn finalize(self) -> [u8; 32] { - finalize(self) - } - - fn verify_slice(self, tag: &[u8]) -> Result<(), MacError> { - verify_slice(self, tag) - } - - fn verify(self, tag: [u8; 32]) -> Result<(), MacError> { - verify(self, tag) - } - - fn verify_truncated_left(self, tag: &[u8]) -> Result<(), MacError> { - verify_truncated_left(self, tag) - } -} - -impl crypto_provider::hmac::Hmac<64> for Hmac<OpenSslSha512> { - fn new_from_key(key: [u8; 64]) -> Self { - new_from_key(key) - } - - fn new_from_slice(key: &[u8]) -> Result<Self, InvalidLength> { - new_from_slice(key) - } - - fn update(&mut self, data: &[u8]) { - update(self, data) - } - - fn finalize(self) -> [u8; 64] { - finalize(self) - } - - fn verify_slice(self, tag: &[u8]) -> Result<(), MacError> { - verify_slice(self, tag) - } - - fn verify(self, tag: [u8; 64]) -> Result<(), MacError> { - verify(self, tag) - } - - fn verify_truncated_left(self, tag: &[u8]) -> Result<(), MacError> { - verify_truncated_left(self, tag) - } -} - -fn hmac_from_builder<H: OpenSslHash>(ctx: PKey<Private>) -> Hmac<H> { - let digest = H::get_digest(); - HmacBuilder { - ctx, - marker: PhantomData, - signer_builder: |ctx: &openssl::pkey::PKey<openssl::pkey::Private>| { - Signer::new(digest, ctx).expect("should be able to create signer") - }, - } - .build() -} - -fn new_from_key<const N: usize, H: OpenSslHash>(key: [u8; N]) -> Hmac<H> { - let ctx = openssl::pkey::PKey::hmac(&key) - .expect("hmac creation shouldn't fail since key is of valid size"); - hmac_from_builder(ctx) -} - -fn new_from_slice<H: OpenSslHash>(key: &[u8]) -> Result<Hmac<H>, InvalidLength> { - openssl::pkey::PKey::hmac(key).map(hmac_from_builder).map_err(|_| InvalidLength) -} - -fn update<H: OpenSslHash>(hmac: &mut Hmac<H>, data: &[u8]) { - hmac.with_signer_mut(|signer| { - signer.update(data).expect("should be able to update signer"); - }) -} - -fn finalize<const N: usize, H: OpenSslHash>(hmac: Hmac<H>) -> [u8; N] { - hmac.borrow_signer() - .sign_to_vec() - .expect("sign to vec should succeed") - .as_slice() - .try_into() - .expect("wrong length") -} - -fn verify_slice<H: OpenSslHash>(hmac: Hmac<H>, tag: &[u8]) -> Result<(), MacError> { - let binding = hmac.borrow_signer().sign_to_vec().expect("sign to vec should succeed"); - let slice = binding.as_slice(); - if memcmp::eq(slice, tag) { - Ok(()) - } else { - Err(MacError) - } -} - -fn verify<const N: usize, H: OpenSslHash>(hmac: Hmac<H>, tag: [u8; N]) -> Result<(), MacError> { - let binding = hmac.borrow_signer().sign_to_vec().expect("sign to vec should succeed"); - let slice = binding.as_slice(); - if memcmp::eq(slice, &tag) { - Ok(()) - } else { - Err(MacError) - } -} - -fn verify_truncated_left<H: OpenSslHash>(hmac: Hmac<H>, tag: &[u8]) -> Result<(), MacError> { - let binding = hmac.borrow_signer().sign_to_vec().expect("sign to vec should succeed"); - let slice = binding.as_slice(); - let len = tag.len(); - if len == 0 || len > H::get_digest().block_size() { - return Err(MacError); - } - let left = slice.get(..len).ok_or(MacError)?; - if memcmp::eq(left, tag) { - Ok(()) - } else { - Err(MacError) - } -} - -#[cfg(test)] -mod tests { - use crate::Openssl; - use core::marker::PhantomData; - use crypto_provider_test::hmac::*; - - #[apply(hmac_test_cases)] - fn hmac_tests(testcase: CryptoProviderTestCase<Openssl>) { - testcase(PhantomData); - } -}
diff --git a/nearby/crypto/crypto_provider_openssl/src/lib.rs b/nearby/crypto/crypto_provider_openssl/src/lib.rs deleted file mode 100644 index 04b4e4c..0000000 --- a/nearby/crypto/crypto_provider_openssl/src/lib.rs +++ /dev/null
@@ -1,134 +0,0 @@ -#![forbid(unsafe_code)] -// 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. - -//! Crate which provides impls for CryptoProvider backed by openssl - -// This crate treats allocation errors as handleable, which leads to unwraps everywhere, so they -// have to be allowed here. This will be fixed when we can migrate over to the new boringssl bindings -#![allow(clippy::expect_used, clippy::unwrap_used)] - -use cfg_if::cfg_if; -pub use openssl; -use openssl::hash::MessageDigest; -use openssl::md::MdRef; -use openssl::rand::rand_bytes; - -use crypto_provider::CryptoRng; - -/// Contains the openssl backed AES implementations for CryptoProvider -mod aes; -/// Contains the openssl backed ed25519 impl for key generation, verification, and signing -mod ed25519; - -cfg_if! { - if #[cfg(feature = "boringssl")] { - /// Contains the boringssl backed hkdf impl for CryptoProvider - mod hkdf_boringssl; - use hkdf_boringssl as hkdf; - /// Contains the boringssl backed hmac impl for CryptoProvider - mod hmac_boringssl; - use hmac_boringssl as hmac; - } else { - /// Contains the openssl backed hkdf impl for CryptoProvider - mod hkdf_openssl; - use hkdf_openssl as hkdf; - /// Contains the openssl backed hmac impl for CryptoProvider - mod hmac_openssl; - use hmac_openssl as hmac; - } -} -/// Contains the openssl backed NIST-P256 impl for CryptoProvider -mod p256; -/// Contains the openssl backed SHA2 impl for CryptoProvider -mod sha2; -/// Contains the openssl backed X25519 impl for CryptoProvider -mod x25519; - -/// The the openssl backed struct which implements CryptoProvider -#[derive(Default, Clone, Debug, PartialEq, Eq)] -pub struct Openssl; - -/// The trait which defines a has used in openssl crypto operations -pub trait OpenSslHash { - /// gets the message digest algorithm to be used by the hmac implementation - fn get_digest() -> MessageDigest; - /// gets a reference to a message digest algorithm to be used by the hkdf implementation - fn get_md() -> &'static MdRef; -} - -impl crypto_provider::CryptoProvider for Openssl { - type HkdfSha256 = hkdf::Hkdf<sha2::OpenSslSha256>; - type HmacSha256 = hmac::Hmac<sha2::OpenSslSha256>; - type HkdfSha512 = hkdf::Hkdf<sha2::OpenSslSha512>; - type HmacSha512 = hmac::Hmac<sha2::OpenSslSha512>; - type AesCbcPkcs7Padded = aes::OpenSslAesCbcPkcs7; - type X25519 = x25519::X25519Ecdh; - type P256 = p256::P256Ecdh; - type Sha256 = sha2::OpenSslSha256; - type Sha512 = sha2::OpenSslSha512; - type Aes128 = aes::Aes128; - type Aes256 = aes::Aes256; - type AesCtr128 = aes::OpenSslAesCtr128; - type AesCtr256 = aes::OpenSslAesCtr256; - type Ed25519 = ed25519::Ed25519; - type Aes128GcmSiv = crypto_provider_stubs::Aes128Stubs; - type Aes256GcmSiv = crypto_provider_stubs::Aes256Stubs; - type Aes128Gcm = crypto_provider_stubs::Aes128Stubs; - type Aes256Gcm = crypto_provider_stubs::Aes256Stubs; - type CryptoRng = OpenSslRng; - - fn constant_time_eq(a: &[u8], b: &[u8]) -> bool { - a.len() == b.len() && openssl::memcmp::eq(a, b) - } -} - -/// OpenSSL implemented random number generator -pub struct OpenSslRng; - -impl CryptoRng for OpenSslRng { - fn new() -> Self { - OpenSslRng {} - } - - fn next_u64(&mut self) -> u64 { - let mut buf = [0; 8]; - rand_bytes(&mut buf).unwrap(); - u64::from_be_bytes(buf) - } - - fn fill(&mut self, dest: &mut [u8]) { - rand_bytes(dest).expect("Error in generating random bytes") - } -} - -#[cfg(test)] -mod tests { - use core::marker::PhantomData; - - use crypto_provider_test::sha2::*; - use crypto_provider_test::{prelude::*, *}; - - use crate::Openssl; - - #[apply(sha2_test_cases)] - fn sha2_tests(testcase: CryptoProviderTestCase<Openssl>) { - testcase(PhantomData); - } - - #[apply(constant_time_eq_test_cases)] - fn constant_time_eq_tests(testcase: CryptoProviderTestCase<Openssl>) { - testcase(PhantomData); - } -}
diff --git a/nearby/crypto/crypto_provider_openssl/src/p256.rs b/nearby/crypto/crypto_provider_openssl/src/p256.rs deleted file mode 100644 index 17dd6ce..0000000 --- a/nearby/crypto/crypto_provider_openssl/src/p256.rs +++ /dev/null
@@ -1,202 +0,0 @@ -// 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::{ - elliptic_curve::{EcdhProvider, EphemeralSecret}, - p256::{PointCompression, P256}, - tinyvec::ArrayVec, -}; -use openssl::bn::{BigNum, BigNumContext}; -use openssl::derive::Deriver; -use openssl::ec::{EcGroup, EcKey, EcPoint, PointConversionForm}; -use openssl::error::ErrorStack; -use openssl::nid::Nid; -use openssl::pkey::{PKey, Private, Public}; - -/// Public key type for P256 using OpenSSL's implementation. -#[derive(Debug)] -pub struct P256PublicKey(PKey<Public>); - -impl PartialEq for P256PublicKey { - fn eq(&self, other: &Self) -> bool { - self.0.public_eq(&other.0) - } -} - -/// Custom error type for OpenSSL operations. -#[derive(Debug)] -#[allow(clippy::enum_variant_names)] -pub enum Error { - /// Error from the openssl crate. - OpenSslError(ErrorStack), - /// Unexpected size for the given input. - WrongSize, - /// Invalid input given when creating keys from their byte representations. - InvalidInput, -} - -impl From<ErrorStack> for Error { - fn from(value: ErrorStack) -> Self { - Self::OpenSslError(value) - } -} - -/// The OpenSSL implementation of P256 public key. -impl crypto_provider::p256::P256PublicKey for P256PublicKey { - type Error = Error; - - fn from_sec1_bytes(bytes: &[u8]) -> Result<Self, Self::Error> { - if bytes == [0] { - // Single 0 byte means infinity point. - return Err(Error::InvalidInput); - } - let ecgroup = EcGroup::from_curve_name(Nid::X9_62_PRIME256V1)?; - let mut bncontext = BigNumContext::new()?; - let ecpoint = EcPoint::from_bytes(&ecgroup, bytes, &mut bncontext)?; - let eckey = EcKey::from_public_key(&ecgroup, &ecpoint)?; - Ok(Self(eckey.try_into()?)) - } - - fn to_sec1_bytes(&self, point_compression: PointCompression) -> ArrayVec<[u8; 65]> { - let point_conversion_form = match point_compression { - PointCompression::Compressed => PointConversionForm::COMPRESSED, - PointCompression::Uncompressed => PointConversionForm::UNCOMPRESSED, - }; - let ecgroup = EcGroup::from_curve_name(Nid::X9_62_PRIME256V1).unwrap(); - let mut bncontext = BigNumContext::new().unwrap(); - let mut bytes = ArrayVec::<[u8; 65]>::new(); - bytes.extend_from_slice( - &self - .0 - .ec_key() - .unwrap() - .public_key() - .to_bytes(&ecgroup, point_conversion_form, &mut bncontext) - .unwrap(), - ); - bytes - } - - fn from_affine_coordinates(x: &[u8; 32], y: &[u8; 32]) -> Result<Self, Self::Error> { - let bn_x = BigNum::from_slice(x)?; - let bn_y = BigNum::from_slice(y)?; - let ecgroup = EcGroup::from_curve_name(Nid::X9_62_PRIME256V1)?; - let eckey = EcKey::from_public_key_affine_coordinates(&ecgroup, &bn_x, &bn_y)?; - Ok(Self(eckey.try_into()?)) - } - - fn to_affine_coordinates(&self) -> Result<([u8; 32], [u8; 32]), Self::Error> { - let mut bnctx = openssl::bn::BigNumContext::new()?; - let ecgroup = EcGroup::from_curve_name(Nid::X9_62_PRIME256V1)?; - let p256_key = self.0.ec_key()?; - let mut p256x = BigNum::new()?; - let mut p256y = BigNum::new()?; - p256_key - .public_key() - .affine_coordinates_gfp(&ecgroup, &mut p256x, &mut p256y, &mut bnctx)?; - Ok(( - p256x - .to_vec_padded(32) - .map_err(|_| Error::WrongSize)? - .try_into() - .expect("to_vec_padded(32) should always return vec of length 32"), - p256y - .to_vec_padded(32) - .map_err(|_| Error::WrongSize)? - .try_into() - .expect("to_vec_padded(32) should always return vec of length 32"), - )) - } -} - -/// Private key type for P256 using OpenSSL's implementation. -pub struct P256EphemeralSecret(PKey<Private>); - -impl EphemeralSecret<P256> for P256EphemeralSecret { - type Impl = P256Ecdh; - type Error = Error; - type Rng = (); - type EncodedPublicKey = ArrayVec<[u8; 65]>; - - fn generate_random(_rng: &mut Self::Rng) -> Self { - let ecgroup = EcGroup::from_curve_name(Nid::X9_62_PRIME256V1).unwrap(); - let eckey = EcKey::generate(&ecgroup).unwrap(); - Self(eckey.try_into().unwrap()) - } - - fn public_key_bytes(&self) -> Self::EncodedPublicKey { - let ecgroup = EcGroup::from_curve_name(Nid::X9_62_PRIME256V1).unwrap(); - let mut bncontext = BigNumContext::new().unwrap(); - let mut bytes = Self::EncodedPublicKey::new(); - bytes.extend_from_slice( - &self - .0 - .ec_key() - .unwrap() - .public_key() - .to_bytes(&ecgroup, PointConversionForm::COMPRESSED, &mut bncontext) - .unwrap(), - ); - bytes - } - - fn diffie_hellman( - self, - other_pub: &<Self::Impl as EcdhProvider<P256>>::PublicKey, - ) -> Result<<Self::Impl as EcdhProvider<P256>>::SharedSecret, Self::Error> { - let mut deriver = Deriver::new(&self.0)?; - deriver.set_peer(&other_pub.0)?; - let mut buf = [0_u8; 32]; - let bytes_written = deriver.derive(&mut buf)?; - debug_assert_eq!(bytes_written, 32); - Ok(buf) - } -} - -#[cfg(test)] -impl crypto_provider_test::elliptic_curve::EphemeralSecretForTesting<P256> for P256EphemeralSecret { - fn from_private_components( - private_bytes: &[u8; 32], - public_key: &P256PublicKey, - ) -> Result<Self, Self::Error> { - let ecgroup = EcGroup::from_curve_name(Nid::X9_62_PRIME256V1).unwrap(); - let private_key_bn = BigNum::from_slice(private_bytes)?; - let eckey = EcKey::from_private_components( - &ecgroup, - &private_key_bn, - public_key.0.ec_key()?.public_key(), - )?; - Ok(Self(eckey.try_into()?)) - } -} - -/// The OpenSSL implementation of P256 ECDH. -pub enum P256Ecdh {} -impl EcdhProvider<P256> for P256Ecdh { - type PublicKey = P256PublicKey; - type EphemeralSecret = P256EphemeralSecret; - type SharedSecret = [u8; 32]; -} - -#[cfg(test)] -mod tests { - use super::P256Ecdh; - use core::marker::PhantomData; - use crypto_provider_test::p256::*; - - #[apply(p256_test_cases)] - fn p256_tests(testcase: CryptoProviderTestCase<P256Ecdh>, _name: &str) { - testcase(PhantomData) - } -}
diff --git a/nearby/crypto/crypto_provider_openssl/src/sha2.rs b/nearby/crypto/crypto_provider_openssl/src/sha2.rs deleted file mode 100644 index 68fee79..0000000 --- a/nearby/crypto/crypto_provider_openssl/src/sha2.rs +++ /dev/null
@@ -1,71 +0,0 @@ -// 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 openssl::hash::MessageDigest; -use openssl::md::{Md, MdRef}; -use openssl::md_ctx::MdCtx; - -use crate::OpenSslHash; - -/// openssl sha256 digest algorithm -#[derive(Clone)] -pub struct OpenSslSha256 {} - -impl OpenSslHash for OpenSslSha256 { - fn get_digest() -> MessageDigest { - MessageDigest::sha256() - } - - fn get_md() -> &'static MdRef { - Md::sha256() - } -} - -impl crypto_provider::sha2::Sha256 for OpenSslSha256 { - fn sha256(input: &[u8]) -> [u8; 32] { - let mut mdctx = MdCtx::new().unwrap(); - mdctx.digest_init(Self::get_md()).unwrap(); - mdctx.digest_update(input).unwrap(); - let mut buf = [0_u8; 32]; - let size = mdctx.digest_final(&mut buf).unwrap(); - debug_assert_eq!(size, 32); - buf - } -} - -/// openssl sha512 digest algorithm -#[derive(Clone)] -pub struct OpenSslSha512 {} - -impl OpenSslHash for OpenSslSha512 { - fn get_digest() -> MessageDigest { - MessageDigest::sha512() - } - - fn get_md() -> &'static MdRef { - Md::sha512() - } -} - -impl crypto_provider::sha2::Sha512 for OpenSslSha512 { - fn sha512(input: &[u8]) -> [u8; 64] { - let mut mdctx = MdCtx::new().unwrap(); - mdctx.digest_init(Self::get_md()).unwrap(); - mdctx.digest_update(input).unwrap(); - let mut buf = [0_u8; 64]; - let size = mdctx.digest_final(&mut buf).unwrap(); - debug_assert_eq!(size, 64); - buf - } -}
diff --git a/nearby/crypto/crypto_provider_openssl/src/x25519.rs b/nearby/crypto/crypto_provider_openssl/src/x25519.rs deleted file mode 100644 index 2cb4cab..0000000 --- a/nearby/crypto/crypto_provider_openssl/src/x25519.rs +++ /dev/null
@@ -1,106 +0,0 @@ -// 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::elliptic_curve::{EcdhProvider, EphemeralSecret, PublicKey}; -use crypto_provider::x25519::X25519; -use openssl::derive::Deriver; -use openssl::error::ErrorStack; -use openssl::pkey::{Id, PKey, Private, Public}; - -/// Public key type for X25519 using OpenSSL's implementation. -#[derive(Debug)] -pub struct X25519PublicKey(PKey<Public>); - -impl PartialEq for X25519PublicKey { - fn eq(&self, other: &Self) -> bool { - self.0.public_eq(&other.0) - } -} - -impl PublicKey<X25519> for X25519PublicKey { - type Error = ErrorStack; - type EncodedPublicKey = [u8; 32]; - - fn from_bytes(bytes: &[u8]) -> Result<Self, Self::Error> { - let key = PKey::public_key_from_raw_bytes(bytes, Id::X25519)?; - Ok(X25519PublicKey(key)) - } - - fn to_bytes(&self) -> Self::EncodedPublicKey { - self.0.raw_public_key().unwrap().try_into().unwrap() - } -} - -/// Private key type for X25519 using OpenSSL's implementation. -pub struct X25519PrivateKey(PKey<Private>); - -impl EphemeralSecret<X25519> for X25519PrivateKey { - type Impl = X25519Ecdh; - type Error = ErrorStack; - type Rng = (); - type EncodedPublicKey = [u8; 32]; - - fn generate_random(_rng: &mut Self::Rng) -> Self { - let private_key = openssl::pkey::PKey::generate_x25519().unwrap(); - Self(private_key) - } - - fn public_key_bytes(&self) -> Self::EncodedPublicKey { - self.0.raw_public_key().unwrap().try_into().unwrap() - } - - fn diffie_hellman( - self, - other_pub: &X25519PublicKey, - ) -> Result<<Self::Impl as EcdhProvider<X25519>>::SharedSecret, Self::Error> { - let mut deriver = Deriver::new(&self.0)?; - deriver.set_peer(&other_pub.0)?; - let mut buf = [0_u8; 32]; - let num_bytes_written = deriver.derive(&mut buf)?; - debug_assert_eq!(num_bytes_written, 32); - Ok(buf) - } -} - -#[cfg(test)] -impl crypto_provider_test::elliptic_curve::EphemeralSecretForTesting<X25519> for X25519PrivateKey { - fn from_private_components( - private_bytes: &[u8; 32], - _public_key: &<Self::Impl as EcdhProvider<X25519>>::PublicKey, - ) -> Result<Self, Self::Error> { - let pkey = PKey::private_key_from_raw_bytes(private_bytes, Id::X25519)?; - Ok(Self(pkey)) - } -} - -/// The OpenSSL implementation of X25519 ECDH. -pub enum X25519Ecdh {} -impl EcdhProvider<X25519> for X25519Ecdh { - type PublicKey = X25519PublicKey; - type EphemeralSecret = X25519PrivateKey; - type SharedSecret = [u8; 32]; -} - -#[cfg(test)] -mod tests { - use core::marker::PhantomData; - use crypto_provider_test::x25519::*; - - use super::X25519Ecdh; - - #[apply(x25519_test_cases)] - fn x25519_tests(testcase: CryptoProviderTestCase<X25519Ecdh>) { - testcase(PhantomData::<X25519Ecdh>) - } -}
diff --git a/nearby/crypto/crypto_provider_rustcrypto/src/ed25519.rs b/nearby/crypto/crypto_provider_rustcrypto/src/ed25519.rs index ce8089e..46abfc3 100644 --- a/nearby/crypto/crypto_provider_rustcrypto/src/ed25519.rs +++ b/nearby/crypto/crypto_provider_rustcrypto/src/ed25519.rs
@@ -15,8 +15,8 @@ use ed25519_dalek::Signer; use crypto_provider::ed25519::{ - InvalidBytes, RawPrivateKey, RawPrivateKeyPermit, RawPublicKey, RawSignature, Signature as _, - SignatureError, PRIVATE_KEY_LENGTH, PUBLIC_KEY_LENGTH, SIGNATURE_LENGTH, + InvalidPublicKeyBytes, RawPrivateKey, RawPrivateKeyPermit, RawPublicKey, RawSignature, + Signature as _, SignatureError, PRIVATE_KEY_LENGTH, PUBLIC_KEY_LENGTH, SIGNATURE_LENGTH, }; pub struct Ed25519; @@ -76,11 +76,13 @@ impl crypto_provider::ed25519::PublicKey for PublicKey { type Signature = Signature; - fn from_bytes(bytes: &RawPublicKey) -> Result<Self, InvalidBytes> + fn from_bytes(bytes: &RawPublicKey) -> Result<Self, InvalidPublicKeyBytes> where Self: Sized, { - ed25519_dalek::VerifyingKey::from_bytes(bytes).map(PublicKey).map_err(|_| InvalidBytes) + ed25519_dalek::VerifyingKey::from_bytes(bytes) + .map(PublicKey) + .map_err(|_| InvalidPublicKeyBytes) } fn to_bytes(&self) -> [u8; PUBLIC_KEY_LENGTH] {
diff --git a/nearby/crypto/crypto_provider_stubs/src/lib.rs b/nearby/crypto/crypto_provider_stubs/src/lib.rs index 32c9381..83d54ff 100644 --- a/nearby/crypto/crypto_provider_stubs/src/lib.rs +++ b/nearby/crypto/crypto_provider_stubs/src/lib.rs
@@ -29,7 +29,7 @@ Aes, Aes128Key, Aes256Key, AesBlock, AesCipher, AesDecryptCipher, AesEncryptCipher, }, ed25519::{ - self, Ed25519Provider, InvalidBytes, KeyPair, RawPrivateKey, RawPrivateKeyPermit, + self, Ed25519Provider, InvalidPublicKeyBytes, KeyPair, RawPrivateKey, RawPrivateKeyPermit, RawPublicKey, RawSignature, Signature, SignatureError, }, elliptic_curve::{EcdhProvider, EphemeralSecret, PublicKey}, @@ -480,7 +480,7 @@ impl ed25519::PublicKey for PublicKeyStubs { type Signature = SignatureStubs; - fn from_bytes(bytes: &RawPublicKey) -> Result<Self, InvalidBytes> + fn from_bytes(bytes: &RawPublicKey) -> Result<Self, InvalidPublicKeyBytes> where Self: Sized, {
diff --git a/nearby/crypto/crypto_provider_test/fuzz/Cargo.lock b/nearby/crypto/crypto_provider_test/fuzz/Cargo.lock index bd8f6f9..72c827b 100644 --- a/nearby/crypto/crypto_provider_test/fuzz/Cargo.lock +++ b/nearby/crypto/crypto_provider_test/fuzz/Cargo.lock
@@ -54,16 +54,10 @@ ] [[package]] -name = "aliasable" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "250f629c0161ad8107cf89319e990051fae62832fd343083bea452d93e2205fd" - -[[package]] name = "arbitrary" -version = "1.3.0" +version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2d098ff73c1ca148721f37baad5ea6a465a13f9573aba8641fbbbae8164a54e" +checksum = "7d5a26814d8dcb93b0e5a0ff3c6d80a8843bafb21b39e8e18a6f05471870e110" dependencies = [ "derive_arbitrary", ] @@ -75,12 +69,6 @@ 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" @@ -99,10 +87,21 @@ ] [[package]] +name = "bssl-crypto" +version = "0.2.0" +dependencies = [ + "bssl-sys", +] + +[[package]] +name = "bssl-sys" +version = "0.1.0" + +[[package]] name = "bytes" -version = "1.4.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89b2fd2a0dcf38d7971e2194b6b6eebab45ae01067456a7fd93d5547a61b70be" +checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223" [[package]] name = "cbc" @@ -115,11 +114,12 @@ [[package]] name = "cc" -version = "1.0.79" +version = "1.0.83" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50d30906286121d95be3d479533b458f87493b30a4b5f79a607db8f5d11aa91f" +checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" dependencies = [ "jobserver", + "libc", ] [[package]] @@ -140,24 +140,24 @@ [[package]] name = "const-oid" -version = "0.9.4" +version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "795bc6e66a8e340f075fcf6227e417a2dc976b92b91f3cdc778bb858778b6747" +checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" [[package]] name = "cpufeatures" -version = "0.2.9" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a17b76ff3a4162b0b27f354a0c87015ddad39d35f9c0c36607a3bdd175dde1f1" +checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" dependencies = [ "libc", ] [[package]] name = "crypto-bigint" -version = "0.5.2" +version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf4c2f4e1afd912bc40bfd6fed5d9dc1f288e0ba01bfcc835cc5bc3eb13efe15" +checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" dependencies = [ "generic-array", "rand_core", @@ -184,27 +184,24 @@ ] [[package]] +name = "crypto_provider_boringssl" +version = "0.1.0" +dependencies = [ + "bssl-crypto", + "crypto_provider", +] + +[[package]] name = "crypto_provider_default" version = "0.1.0" dependencies = [ "cfg-if", "crypto_provider", - "crypto_provider_openssl", + "crypto_provider_boringssl", "crypto_provider_rustcrypto", ] [[package]] -name = "crypto_provider_openssl" -version = "0.1.0" -dependencies = [ - "cfg-if", - "crypto_provider", - "crypto_provider_stubs", - "openssl", - "ouroboros", -] - -[[package]] name = "crypto_provider_rustcrypto" version = "0.1.0" dependencies = [ @@ -230,13 +227,6 @@ ] [[package]] -name = "crypto_provider_stubs" -version = "0.1.0" -dependencies = [ - "crypto_provider", -] - -[[package]] name = "crypto_provider_test-fuzz" version = "0.0.0" dependencies = [ @@ -257,9 +247,9 @@ [[package]] name = "curve25519-dalek" -version = "4.0.0" +version = "4.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f711ade317dd348950a9910f81c5947e3d8907ebd2b83f76203ff1807e6a2bc2" +checksum = "0a677b8922c94e01bdbb12126b0bc852f00447528dee1782229af9c720c3f348" dependencies = [ "cfg-if", "cpufeatures", @@ -273,20 +263,20 @@ [[package]] name = "curve25519-dalek-derive" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83fdaf97f4804dcebfa5862639bc9ce4121e82140bec2a987ac5140294865b5b" +checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.26", + "syn", ] [[package]] name = "der" -version = "0.7.7" +version = "0.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c7ed52955ce76b1554f509074bb357d3fb8ac9b51288a65a3fd480d1dfba946" +checksum = "fffa369a668c8af7dbf8b5e56c9f744fbd399949ed171606040001947de40b1c" dependencies = [ "const-oid", "zeroize", @@ -294,13 +284,13 @@ [[package]] name = "derive_arbitrary" -version = "1.3.1" +version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53e0efad4403bfc52dc201159c4b842a246a14b98c64b55dfd0f2d89729dfeb8" +checksum = "67e77553c4162a157adbf834ebae5b415acbecbeafc7a74b0e886657506a7611" dependencies = [ "proc-macro2", "quote", - "syn 2.0.26", + "syn", ] [[package]] @@ -316,30 +306,31 @@ [[package]] name = "ed25519" -version = "2.2.1" +version = "2.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fb04eee5d9d907f29e80ee6b0e78f7e2c82342c63e3580d8c4f69d9d5aad963" +checksum = "115531babc129696a58c64a4fef0a8bf9e9698629fb97e9e40767d235cfbcd53" dependencies = [ "signature", ] [[package]] name = "ed25519-dalek" -version = "2.0.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7277392b266383ef8396db7fdeb1e77b6c52fed775f5df15bb24f35b72156980" +checksum = "4a3daa8e81a3963a60642bcc1f90a670680bd4a77535faa384e9d1c79d620871" dependencies = [ "curve25519-dalek", "ed25519", "rand_core", "sha2", + "subtle", ] [[package]] name = "elliptic-curve" -version = "0.13.5" +version = "0.13.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "968405c8fdc9b3bf4df0a6638858cc0b52462836ab6b1c87377785dd09cf1c0b" +checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" dependencies = [ "base16ct", "crypto-bigint", @@ -366,24 +357,9 @@ [[package]] name = "fiat-crypto" -version = "0.1.20" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e825f6987101665dea6ec934c09ec6d721de7bc1bf92248e1d5810c8cd636b77" - -[[package]] -name = "foreign-types" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" -dependencies = [ - "foreign-types-shared", -] - -[[package]] -name = "foreign-types-shared" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" +checksum = "1676f435fc1dadde4d03e43f5d62b259e1ce5f40bd4ffb21db2b42ebe59c1382" [[package]] name = "generic-array" @@ -398,9 +374,9 @@ [[package]] name = "getrandom" -version = "0.2.10" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be4136b2a15dd319360be1c07d9933517ccf0be8f16bf62a3bee4f0d618df427" +checksum = "190092ea657667030ac6a35e305e62fc4dd69fd98ac98631e5d3a2b1575a12b5" dependencies = [ "cfg-if", "libc", @@ -429,16 +405,10 @@ ] [[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" +version = "0.12.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "791a029f6b9fc27657f6f188ec6e5e43f6911f6f878e0dc5501396e09809d437" +checksum = "7b5f8eb2ad728638ea2c7d47a21db23b7b58a72ed6a38256b8a1849f15fbbdf7" dependencies = [ "hmac", ] @@ -464,24 +434,24 @@ [[package]] name = "jobserver" -version = "0.1.26" +version = "0.1.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "936cfd212a0155903bcbc060e316fb6cc7cbf2e1907329391ebadc1fe0ce77c2" +checksum = "8c37f63953c4c63420ed5fd3d6d398c719489b9f872b9fa683262f8edd363c7d" dependencies = [ "libc", ] [[package]] name = "libc" -version = "0.2.147" +version = "0.2.153" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3" +checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" [[package]] name = "libfuzzer-sys" -version = "0.4.6" +version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "beb09950ae85a0a94b27676cccf37da5ff13f27076aa1adbc6545dd0d0e1bd4e" +checksum = "a96cfd5557eb82f2b83fed4955246c988d331975a002961b07c81584d107e7f7" dependencies = [ "arbitrary", "cc", @@ -490,9 +460,9 @@ [[package]] name = "once_cell" -version = "1.18.0" +version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" +checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" [[package]] name = "opaque-debug" @@ -501,68 +471,6 @@ checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" [[package]] -name = "openssl" -version = "0.10.55" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "345df152bc43501c5eb9e4654ff05f794effb78d4efe3d53abc158baddc0703d" -dependencies = [ - "bitflags", - "cfg-if", - "foreign-types", - "libc", - "once_cell", - "openssl-macros", - "openssl-sys", -] - -[[package]] -name = "openssl-macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.26", -] - -[[package]] -name = "openssl-sys" -version = "0.9.90" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "374533b0e45f3a7ced10fcaeccca020e66656bc03dac384f852e4e5a7a8104a6" -dependencies = [ - "cc", - "libc", - "pkg-config", - "vcpkg", -] - -[[package]] -name = "ouroboros" -version = "0.17.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4361ddfdd108bddc19367ba805a3a43773d8bc3e407ac30e6c364cd264dd52e" -dependencies = [ - "aliasable", - "ouroboros_macro", - "static_assertions", -] - -[[package]] -name = "ouroboros_macro" -version = "0.17.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b81e113ed913910f05ef45c9344f67588fe6395f92d906eedf9ee5d54279922" -dependencies = [ - "heck", - "proc-macro-error", - "proc-macro2", - "quote", - "syn 2.0.26", -] - -[[package]] name = "p256" version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -573,16 +481,10 @@ ] [[package]] -name = "pkg-config" -version = "0.3.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26072860ba924cbfa98ea39c8c19b4dd6a4a25423dbdf219c1eca91aa0cf6964" - -[[package]] name = "platforms" -version = "3.0.2" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3d7ddaed09e0eb771a79ab0fd64609ba0afb0a8366421957936ad14cbd13630" +checksum = "626dec3cac7cc0e1577a2ec3fc496277ec2baa084bebad95bb6fdbfae235f84c" [[package]] name = "polyval" @@ -604,51 +506,27 @@ [[package]] name = "primeorder" -version = "0.13.2" +version = "0.13.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c2fcef82c0ec6eefcc179b978446c399b3cdf73c392c35604e399eee6df1ee3" +checksum = "353e1ca18966c16d9deb1c69278edbc5f194139612772bd9537af60ac231e1e6" dependencies = [ "elliptic-curve", ] [[package]] -name = "proc-macro-error" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" -dependencies = [ - "proc-macro-error-attr", - "proc-macro2", - "quote", - "syn 1.0.109", - "version_check", -] - -[[package]] -name = "proc-macro-error-attr" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" -dependencies = [ - "proc-macro2", - "quote", - "version_check", -] - -[[package]] name = "proc-macro2" -version = "1.0.66" +version = "1.0.78" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18fb31db3f9bddb2ea821cde30a9f70117e3f119938b5ee630b7403aa6e2ead9" +checksum = "e2422ad645d89c99f8f3e6b88a9fdeca7fabeac836b1002371c4367c8f984aae" dependencies = [ "unicode-ident", ] [[package]] name = "quote" -version = "1.0.31" +version = "1.0.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fe8a65d69dd0808184ebb5f836ab526bb259db23c657efa38711b1072ee47f0" +checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef" dependencies = [ "proc-macro2", ] @@ -705,15 +583,15 @@ [[package]] name = "semver" -version = "1.0.18" +version = "1.0.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0293b4b29daaf487284529cc2f5675b8e57c61f70167ba415a463651fd6a918" +checksum = "b97ed7a9823b74f99c7742f5336af7be5ecd3eeafcb1507d1fa93347b1d589b0" [[package]] name = "sha2" -version = "0.10.7" +version = "0.10.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "479fb9d862239e610720565ca91403019f2f00410f1864c5aa7479b950a76ed8" +checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" dependencies = [ "cfg-if", "cpufeatures", @@ -722,15 +600,9 @@ [[package]] name = "signature" -version = "2.1.0" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e1788eed21689f9cf370582dfc467ef36ed9c707f073528ddafa8d83e3b8500" - -[[package]] -name = "static_assertions" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" +checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" [[package]] name = "subtle" @@ -740,19 +612,9 @@ [[package]] name = "syn" -version = "1.0.109" +version = "2.0.48" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" -dependencies = [ - "proc-macro2", - "unicode-ident", -] - -[[package]] -name = "syn" -version = "2.0.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45c3457aacde3c65315de5031ec191ce46604304d2446e803d71ade03308d970" +checksum = "0f3531638e407dfc0814761abb7c00a5b54992b849452a0646b7f65c9f770f3f" dependencies = [ "proc-macro2", "quote", @@ -767,15 +629,15 @@ [[package]] name = "typenum" -version = "1.16.0" +version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba" +checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" [[package]] name = "unicode-ident" -version = "1.0.11" +version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "301abaae475aa91687eb82514b328ab47a211a533026cb25fc3e519b86adfc3c" +checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" [[package]] name = "universal-hash" @@ -788,12 +650,6 @@ ] [[package]] -name = "vcpkg" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" - -[[package]] name = "version_check" version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -807,9 +663,9 @@ [[package]] name = "x25519-dalek" -version = "2.0.0" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb66477291e7e8d2b0ff1bcb900bf29489a9692816d79874bea351e7a8b6de96" +checksum = "c7e468321c81fb07fa7f4c636c3972b9100f0346e5b6a9f2bd0603a52f7ed277" dependencies = [ "curve25519-dalek", "rand_core", @@ -817,6 +673,6 @@ [[package]] name = "zeroize" -version = "1.6.0" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a0956f1ba7c7909bfb66c2e9e4124ab6f6482560f6628b5aaeba39207c9aad9" +checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d"
diff --git a/nearby/crypto/crypto_provider_test/fuzz/Cargo.toml b/nearby/crypto/crypto_provider_test/fuzz/Cargo.toml index 68fad3e..5bfc9ab 100644 --- a/nearby/crypto/crypto_provider_test/fuzz/Cargo.toml +++ b/nearby/crypto/crypto_provider_test/fuzz/Cargo.toml
@@ -15,7 +15,7 @@ [features] default = ["crypto_provider_default/default"] -openssl = ["crypto_provider_default/openssl"] +boringssl = ["crypto_provider_default/boringssl"] # Prevent this from interfering with workspaces [workspace]
diff --git a/nearby/presence/CMakeLists.txt b/nearby/presence/CMakeLists.txt index 9670c34..ec93edd 100644 --- a/nearby/presence/CMakeLists.txt +++ b/nearby/presence/CMakeLists.txt
@@ -14,15 +14,12 @@ cmake_minimum_required(VERSION 3.14) -project(NearbyProtocol) +project(NearbyPresenceProtocol) -# required for designated initializers on MSVC set(CMAKE_CXX_STANDARD 20) -# root directory of repo set(BETO_CORE_ROOT ${CMAKE_SOURCE_DIR}/../..) - -# location of external third_party dependencies +set(NEARBY_ROOT ${CMAKE_SOURCE_DIR}/..) set(THIRD_PARTY_DIR ${BETO_CORE_ROOT}/third_party) set(CMAKE_C_FLAGS_DEBUG "-DDEBUG") @@ -32,13 +29,6 @@ set(CMAKE_CXX_FLAGS_DEBUG "-g ${CMAKE_C_FLAGS_DEBUG}") endif () -find_package(OpenSSL REQUIRED) -if (OPENSSL_FOUND) - message(STATUS "OpenSSL Found: ${OPENSSL_VERSION}") - message(STATUS "OpenSSL Include: ${OPENSSL_INCLUDE_DIR}") - message(STATUS "OpenSSL Libraries: ${OPENSSL_LIBRARIES}") -endif () - if (MSVC) add_compile_options(-W4 -O1 -MD) endif () @@ -46,6 +36,10 @@ if (ENABLE_TESTS) message(STATUS "Enabling workspace wide tests") + # We want to suppress warnings coming from external libraries as they just + # pollute the build output + add_compile_options(-w) + # Setup GoogleTest include(FetchContent) FetchContent_Declare( @@ -69,19 +63,42 @@ ) endif () -# Add these compile options for our own code, not needed for the above deps -if (UNIX) - add_compile_options(-Wall -Wextra -Wimplicit-fallthrough -Wextra-semi - -Wno-missing-field-initializers -Wno-unused-parameter -Wno-psabi - -Wshadow - -Wsign-compare) -endif() +set(ABSL_PROPAGATE_CXX_STD ON) +if (ENABLE_FUZZ) + if (NOT "${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang") + MESSAGE(FATAL_ERROR "fuzzing is only enabed when building with Clang, please set CC and CXX to use clang instead of ${CMAKE_CXX_COMPILER_ID}") + endif() + add_subdirectory(${THIRD_PARTY_DIR}/boringssl boringssl-build) + add_subdirectory(${THIRD_PARTY_DIR}/fuzztest fuzztest-build) + enable_testing() + include(GoogleTest) +else () + # fuzztest handles pulling in absl, so we if we are not building fuzzers we need + # to include it ourselves via third_party. + add_subdirectory(${THIRD_PARTY_DIR}/abseil-cpp ${THIRD_PARTY_DIR}/abseil-cpp/build) +endif () + +if (UNIX) + set_directory_properties( + PROPERTIES + COMPILE_OPTIONS + -Wall -Wextra -Wimplicit-fallthrough -Wextra-semi + -Wno-missing-field-initializers -Wno-unused-parameter -Wno-psabi + -Wshadow -Wsign-compare + ) +endif () + +# rust std lib requires linking against these +if (UNIX) + link_libraries( + dl pthread -fsanitize=address + ) +elseif (MSVC) + link_libraries( + bcrypt ntdll userenv ws2_32 + ) +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 () +add_subdirectory(ldt_np_adv_ffi/c)
diff --git a/nearby/presence/README.md b/nearby/presence/README.md index fe63af1..e7868b5 100644 --- a/nearby/presence/README.md +++ b/nearby/presence/README.md
@@ -59,17 +59,6 @@ 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: - -``` -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
diff --git a/nearby/presence/ldt/fuzz/Cargo.lock b/nearby/presence/ldt/fuzz/Cargo.lock index 419d9e9..3298a9e 100644 --- a/nearby/presence/ldt/fuzz/Cargo.lock +++ b/nearby/presence/ldt/fuzz/Cargo.lock
@@ -55,9 +55,9 @@ [[package]] name = "arbitrary" -version = "1.3.0" +version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2d098ff73c1ca148721f37baad5ea6a465a13f9573aba8641fbbbae8164a54e" +checksum = "7d5a26814d8dcb93b0e5a0ff3c6d80a8843bafb21b39e8e18a6f05471870e110" dependencies = [ "derive_arbitrary", ] @@ -92,9 +92,9 @@ [[package]] name = "bytes" -version = "1.4.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89b2fd2a0dcf38d7971e2194b6b6eebab45ae01067456a7fd93d5547a61b70be" +checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223" [[package]] name = "cbc" @@ -107,11 +107,12 @@ [[package]] name = "cc" -version = "1.0.79" +version = "1.0.83" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50d30906286121d95be3d479533b458f87493b30a4b5f79a607db8f5d11aa91f" +checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" dependencies = [ "jobserver", + "libc", ] [[package]] @@ -132,24 +133,24 @@ [[package]] name = "const-oid" -version = "0.9.4" +version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "795bc6e66a8e340f075fcf6227e417a2dc976b92b91f3cdc778bb858778b6747" +checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" [[package]] name = "cpufeatures" -version = "0.2.9" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a17b76ff3a4162b0b27f354a0c87015ddad39d35f9c0c36607a3bdd175dde1f1" +checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" dependencies = [ "libc", ] [[package]] name = "crypto-bigint" -version = "0.5.2" +version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf4c2f4e1afd912bc40bfd6fed5d9dc1f288e0ba01bfcc835cc5bc3eb13efe15" +checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" dependencies = [ "generic-array", "rand_core", @@ -211,9 +212,9 @@ [[package]] name = "curve25519-dalek" -version = "4.0.0" +version = "4.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f711ade317dd348950a9910f81c5947e3d8907ebd2b83f76203ff1807e6a2bc2" +checksum = "0a677b8922c94e01bdbb12126b0bc852f00447528dee1782229af9c720c3f348" dependencies = [ "cfg-if", "cpufeatures", @@ -227,9 +228,9 @@ [[package]] name = "curve25519-dalek-derive" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83fdaf97f4804dcebfa5862639bc9ce4121e82140bec2a987ac5140294865b5b" +checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" dependencies = [ "proc-macro2", "quote", @@ -238,9 +239,9 @@ [[package]] name = "der" -version = "0.7.7" +version = "0.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c7ed52955ce76b1554f509074bb357d3fb8ac9b51288a65a3fd480d1dfba946" +checksum = "fffa369a668c8af7dbf8b5e56c9f744fbd399949ed171606040001947de40b1c" dependencies = [ "const-oid", "zeroize", @@ -248,9 +249,9 @@ [[package]] name = "derive_arbitrary" -version = "1.3.1" +version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53e0efad4403bfc52dc201159c4b842a246a14b98c64b55dfd0f2d89729dfeb8" +checksum = "67e77553c4162a157adbf834ebae5b415acbecbeafc7a74b0e886657506a7611" dependencies = [ "proc-macro2", "quote", @@ -270,30 +271,31 @@ [[package]] name = "ed25519" -version = "2.2.1" +version = "2.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fb04eee5d9d907f29e80ee6b0e78f7e2c82342c63e3580d8c4f69d9d5aad963" +checksum = "115531babc129696a58c64a4fef0a8bf9e9698629fb97e9e40767d235cfbcd53" dependencies = [ "signature", ] [[package]] name = "ed25519-dalek" -version = "2.0.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7277392b266383ef8396db7fdeb1e77b6c52fed775f5df15bb24f35b72156980" +checksum = "4a3daa8e81a3963a60642bcc1f90a670680bd4a77535faa384e9d1c79d620871" dependencies = [ "curve25519-dalek", "ed25519", "rand_core", "sha2", + "subtle", ] [[package]] name = "elliptic-curve" -version = "0.13.5" +version = "0.13.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "968405c8fdc9b3bf4df0a6638858cc0b52462836ab6b1c87377785dd09cf1c0b" +checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" dependencies = [ "base16ct", "crypto-bigint", @@ -320,9 +322,9 @@ [[package]] name = "fiat-crypto" -version = "0.1.20" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e825f6987101665dea6ec934c09ec6d721de7bc1bf92248e1d5810c8cd636b77" +checksum = "1676f435fc1dadde4d03e43f5d62b259e1ce5f40bd4ffb21db2b42ebe59c1382" [[package]] name = "generic-array" @@ -337,9 +339,9 @@ [[package]] name = "getrandom" -version = "0.2.10" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be4136b2a15dd319360be1c07d9933517ccf0be8f16bf62a3bee4f0d618df427" +checksum = "190092ea657667030ac6a35e305e62fc4dd69fd98ac98631e5d3a2b1575a12b5" dependencies = [ "cfg-if", "libc", @@ -369,9 +371,9 @@ [[package]] name = "hkdf" -version = "0.12.3" +version = "0.12.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "791a029f6b9fc27657f6f188ec6e5e43f6911f6f878e0dc5501396e09809d437" +checksum = "7b5f8eb2ad728638ea2c7d47a21db23b7b58a72ed6a38256b8a1849f15fbbdf7" dependencies = [ "hmac", ] @@ -397,9 +399,9 @@ [[package]] name = "jobserver" -version = "0.1.26" +version = "0.1.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "936cfd212a0155903bcbc060e316fb6cc7cbf2e1907329391ebadc1fe0ce77c2" +checksum = "8c37f63953c4c63420ed5fd3d6d398c719489b9f872b9fa683262f8edd363c7d" dependencies = [ "libc", ] @@ -432,15 +434,15 @@ [[package]] name = "libc" -version = "0.2.147" +version = "0.2.153" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3" +checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" [[package]] name = "libfuzzer-sys" -version = "0.4.6" +version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "beb09950ae85a0a94b27676cccf37da5ff13f27076aa1adbc6545dd0d0e1bd4e" +checksum = "a96cfd5557eb82f2b83fed4955246c988d331975a002961b07c81584d107e7f7" dependencies = [ "arbitrary", "cc", @@ -449,9 +451,9 @@ [[package]] name = "once_cell" -version = "1.18.0" +version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" +checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" [[package]] name = "opaque-debug" @@ -471,9 +473,9 @@ [[package]] name = "platforms" -version = "3.0.2" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3d7ddaed09e0eb771a79ab0fd64609ba0afb0a8366421957936ad14cbd13630" +checksum = "626dec3cac7cc0e1577a2ec3fc496277ec2baa084bebad95bb6fdbfae235f84c" [[package]] name = "polyval" @@ -495,27 +497,27 @@ [[package]] name = "primeorder" -version = "0.13.2" +version = "0.13.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c2fcef82c0ec6eefcc179b978446c399b3cdf73c392c35604e399eee6df1ee3" +checksum = "353e1ca18966c16d9deb1c69278edbc5f194139612772bd9537af60ac231e1e6" dependencies = [ "elliptic-curve", ] [[package]] name = "proc-macro2" -version = "1.0.66" +version = "1.0.78" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18fb31db3f9bddb2ea821cde30a9f70117e3f119938b5ee630b7403aa6e2ead9" +checksum = "e2422ad645d89c99f8f3e6b88a9fdeca7fabeac836b1002371c4367c8f984aae" dependencies = [ "unicode-ident", ] [[package]] name = "quote" -version = "1.0.31" +version = "1.0.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fe8a65d69dd0808184ebb5f836ab526bb259db23c657efa38711b1072ee47f0" +checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef" dependencies = [ "proc-macro2", ] @@ -572,15 +574,15 @@ [[package]] name = "semver" -version = "1.0.18" +version = "1.0.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0293b4b29daaf487284529cc2f5675b8e57c61f70167ba415a463651fd6a918" +checksum = "b97ed7a9823b74f99c7742f5336af7be5ecd3eeafcb1507d1fa93347b1d589b0" [[package]] name = "sha2" -version = "0.10.7" +version = "0.10.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "479fb9d862239e610720565ca91403019f2f00410f1864c5aa7479b950a76ed8" +checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" dependencies = [ "cfg-if", "cpufeatures", @@ -589,9 +591,9 @@ [[package]] name = "signature" -version = "2.1.0" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e1788eed21689f9cf370582dfc467ef36ed9c707f073528ddafa8d83e3b8500" +checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" [[package]] name = "subtle" @@ -601,9 +603,9 @@ [[package]] name = "syn" -version = "2.0.26" +version = "2.0.48" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45c3457aacde3c65315de5031ec191ce46604304d2446e803d71ade03308d970" +checksum = "0f3531638e407dfc0814761abb7c00a5b54992b849452a0646b7f65c9f770f3f" dependencies = [ "proc-macro2", "quote", @@ -618,15 +620,15 @@ [[package]] name = "typenum" -version = "1.16.0" +version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba" +checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" [[package]] name = "unicode-ident" -version = "1.0.11" +version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "301abaae475aa91687eb82514b328ab47a211a533026cb25fc3e519b86adfc3c" +checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" [[package]] name = "universal-hash" @@ -652,9 +654,9 @@ [[package]] name = "x25519-dalek" -version = "2.0.0" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb66477291e7e8d2b0ff1bcb900bf29489a9692816d79874bea351e7a8b6de96" +checksum = "c7e468321c81fb07fa7f4c636c3972b9100f0346e5b6a9f2bd0603a52f7ed277" dependencies = [ "curve25519-dalek", "rand_core", @@ -671,6 +673,6 @@ [[package]] name = "zeroize" -version = "1.6.0" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a0956f1ba7c7909bfb66c2e9e4124ab6f6482560f6628b5aaeba39207c9aad9" +checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d"
diff --git a/nearby/presence/ldt_np_adv/Cargo.toml b/nearby/presence/ldt_np_adv/Cargo.toml index 3f19bdd..ce84505 100644 --- a/nearby/presence/ldt_np_adv/Cargo.toml +++ b/nearby/presence/ldt_np_adv/Cargo.toml
@@ -21,7 +21,6 @@ [dev-dependencies] crypto_provider_default = { workspace = true, features = ["rustcrypto", "std"] } -crypto_provider_openssl.workspace = true rand_ext.workspace = true test_helper.workspace = true
diff --git a/nearby/presence/ldt_np_adv/benches/ldt_adv_scan.rs b/nearby/presence/ldt_np_adv/benches/ldt_adv_scan.rs index 7c0b4aa..b8de6fd 100644 --- a/nearby/presence/ldt_np_adv/benches/ldt_adv_scan.rs +++ b/nearby/presence/ldt_np_adv/benches/ldt_adv_scan.rs
@@ -21,8 +21,7 @@ use rand::{Rng as _, SeedableRng as _}; use crypto_provider::CryptoProvider; -use crypto_provider_openssl::Openssl; -use crypto_provider_rustcrypto::RustCrypto; +use crypto_provider_default::CryptoProviderImpl; use np_hkdf::NpKeySeedHkdf; @@ -57,7 +56,7 @@ } } -criterion_group!(benches, ldt_adv_scan::<RustCrypto>, ldt_adv_scan::<Openssl>); +criterion_group!(benches, ldt_adv_scan::<CryptoProviderImpl>); criterion_main!(benches); fn find_matching_item<C: CryptoProvider>(
diff --git a/nearby/presence/ldt_np_adv/fuzz/Cargo.lock b/nearby/presence/ldt_np_adv/fuzz/Cargo.lock index 6b6ef4b..0a85bd9 100644 --- a/nearby/presence/ldt_np_adv/fuzz/Cargo.lock +++ b/nearby/presence/ldt_np_adv/fuzz/Cargo.lock
@@ -55,9 +55,9 @@ [[package]] name = "arbitrary" -version = "1.3.0" +version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2d098ff73c1ca148721f37baad5ea6a465a13f9573aba8641fbbbae8164a54e" +checksum = "7d5a26814d8dcb93b0e5a0ff3c6d80a8843bafb21b39e8e18a6f05471870e110" dependencies = [ "derive_arbitrary", ] @@ -96,9 +96,9 @@ [[package]] name = "bytes" -version = "1.4.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89b2fd2a0dcf38d7971e2194b6b6eebab45ae01067456a7fd93d5547a61b70be" +checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223" [[package]] name = "cbc" @@ -111,11 +111,12 @@ [[package]] name = "cc" -version = "1.0.79" +version = "1.0.83" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50d30906286121d95be3d479533b458f87493b30a4b5f79a607db8f5d11aa91f" +checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" dependencies = [ "jobserver", + "libc", ] [[package]] @@ -136,24 +137,24 @@ [[package]] name = "const-oid" -version = "0.9.4" +version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "795bc6e66a8e340f075fcf6227e417a2dc976b92b91f3cdc778bb858778b6747" +checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" [[package]] name = "cpufeatures" -version = "0.2.9" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a17b76ff3a4162b0b27f354a0c87015ddad39d35f9c0c36607a3bdd175dde1f1" +checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" dependencies = [ "libc", ] [[package]] name = "crypto-bigint" -version = "0.5.2" +version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf4c2f4e1afd912bc40bfd6fed5d9dc1f288e0ba01bfcc835cc5bc3eb13efe15" +checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" dependencies = [ "generic-array", "rand_core", @@ -215,9 +216,9 @@ [[package]] name = "curve25519-dalek" -version = "4.0.0" +version = "4.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f711ade317dd348950a9910f81c5947e3d8907ebd2b83f76203ff1807e6a2bc2" +checksum = "0a677b8922c94e01bdbb12126b0bc852f00447528dee1782229af9c720c3f348" dependencies = [ "cfg-if", "cpufeatures", @@ -231,9 +232,9 @@ [[package]] name = "curve25519-dalek-derive" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83fdaf97f4804dcebfa5862639bc9ce4121e82140bec2a987ac5140294865b5b" +checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" dependencies = [ "proc-macro2", "quote", @@ -242,9 +243,9 @@ [[package]] name = "der" -version = "0.7.7" +version = "0.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c7ed52955ce76b1554f509074bb357d3fb8ac9b51288a65a3fd480d1dfba946" +checksum = "fffa369a668c8af7dbf8b5e56c9f744fbd399949ed171606040001947de40b1c" dependencies = [ "const-oid", "zeroize", @@ -252,9 +253,9 @@ [[package]] name = "derive_arbitrary" -version = "1.3.1" +version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53e0efad4403bfc52dc201159c4b842a246a14b98c64b55dfd0f2d89729dfeb8" +checksum = "67e77553c4162a157adbf834ebae5b415acbecbeafc7a74b0e886657506a7611" dependencies = [ "proc-macro2", "quote", @@ -274,30 +275,31 @@ [[package]] name = "ed25519" -version = "2.2.1" +version = "2.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fb04eee5d9d907f29e80ee6b0e78f7e2c82342c63e3580d8c4f69d9d5aad963" +checksum = "115531babc129696a58c64a4fef0a8bf9e9698629fb97e9e40767d235cfbcd53" dependencies = [ "signature", ] [[package]] name = "ed25519-dalek" -version = "2.0.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7277392b266383ef8396db7fdeb1e77b6c52fed775f5df15bb24f35b72156980" +checksum = "4a3daa8e81a3963a60642bcc1f90a670680bd4a77535faa384e9d1c79d620871" dependencies = [ "curve25519-dalek", "ed25519", "rand_core", "sha2", + "subtle", ] [[package]] name = "elliptic-curve" -version = "0.13.5" +version = "0.13.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "968405c8fdc9b3bf4df0a6638858cc0b52462836ab6b1c87377785dd09cf1c0b" +checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" dependencies = [ "base16ct", "crypto-bigint", @@ -324,9 +326,9 @@ [[package]] name = "fiat-crypto" -version = "0.1.20" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e825f6987101665dea6ec934c09ec6d721de7bc1bf92248e1d5810c8cd636b77" +checksum = "1676f435fc1dadde4d03e43f5d62b259e1ce5f40bd4ffb21db2b42ebe59c1382" [[package]] name = "generic-array" @@ -341,9 +343,9 @@ [[package]] name = "getrandom" -version = "0.2.10" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be4136b2a15dd319360be1c07d9933517ccf0be8f16bf62a3bee4f0d618df427" +checksum = "190092ea657667030ac6a35e305e62fc4dd69fd98ac98631e5d3a2b1575a12b5" dependencies = [ "cfg-if", "libc", @@ -373,9 +375,9 @@ [[package]] name = "hkdf" -version = "0.12.3" +version = "0.12.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "791a029f6b9fc27657f6f188ec6e5e43f6911f6f878e0dc5501396e09809d437" +checksum = "7b5f8eb2ad728638ea2c7d47a21db23b7b58a72ed6a38256b8a1849f15fbbdf7" dependencies = [ "hmac", ] @@ -401,9 +403,9 @@ [[package]] name = "jobserver" -version = "0.1.26" +version = "0.1.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "936cfd212a0155903bcbc060e316fb6cc7cbf2e1907329391ebadc1fe0ce77c2" +checksum = "8c37f63953c4c63420ed5fd3d6d398c719489b9f872b9fa683262f8edd363c7d" dependencies = [ "libc", ] @@ -450,15 +452,15 @@ [[package]] name = "libc" -version = "0.2.147" +version = "0.2.153" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3" +checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" [[package]] name = "libfuzzer-sys" -version = "0.4.6" +version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "beb09950ae85a0a94b27676cccf37da5ff13f27076aa1adbc6545dd0d0e1bd4e" +checksum = "a96cfd5557eb82f2b83fed4955246c988d331975a002961b07c81584d107e7f7" dependencies = [ "arbitrary", "cc", @@ -476,9 +478,9 @@ [[package]] name = "once_cell" -version = "1.18.0" +version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" +checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" [[package]] name = "opaque-debug" @@ -498,9 +500,9 @@ [[package]] name = "platforms" -version = "3.0.2" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3d7ddaed09e0eb771a79ab0fd64609ba0afb0a8366421957936ad14cbd13630" +checksum = "626dec3cac7cc0e1577a2ec3fc496277ec2baa084bebad95bb6fdbfae235f84c" [[package]] name = "polyval" @@ -522,27 +524,27 @@ [[package]] name = "primeorder" -version = "0.13.2" +version = "0.13.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c2fcef82c0ec6eefcc179b978446c399b3cdf73c392c35604e399eee6df1ee3" +checksum = "353e1ca18966c16d9deb1c69278edbc5f194139612772bd9537af60ac231e1e6" dependencies = [ "elliptic-curve", ] [[package]] name = "proc-macro2" -version = "1.0.66" +version = "1.0.78" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18fb31db3f9bddb2ea821cde30a9f70117e3f119938b5ee630b7403aa6e2ead9" +checksum = "e2422ad645d89c99f8f3e6b88a9fdeca7fabeac836b1002371c4367c8f984aae" dependencies = [ "unicode-ident", ] [[package]] name = "quote" -version = "1.0.31" +version = "1.0.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fe8a65d69dd0808184ebb5f836ab526bb259db23c657efa38711b1072ee47f0" +checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef" dependencies = [ "proc-macro2", ] @@ -599,15 +601,15 @@ [[package]] name = "semver" -version = "1.0.18" +version = "1.0.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0293b4b29daaf487284529cc2f5675b8e57c61f70167ba415a463651fd6a918" +checksum = "b97ed7a9823b74f99c7742f5336af7be5ecd3eeafcb1507d1fa93347b1d589b0" [[package]] name = "sha2" -version = "0.10.7" +version = "0.10.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "479fb9d862239e610720565ca91403019f2f00410f1864c5aa7479b950a76ed8" +checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" dependencies = [ "cfg-if", "cpufeatures", @@ -616,9 +618,9 @@ [[package]] name = "signature" -version = "2.1.0" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e1788eed21689f9cf370582dfc467ef36ed9c707f073528ddafa8d83e3b8500" +checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" [[package]] name = "subtle" @@ -628,9 +630,9 @@ [[package]] name = "syn" -version = "2.0.26" +version = "2.0.48" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45c3457aacde3c65315de5031ec191ce46604304d2446e803d71ade03308d970" +checksum = "0f3531638e407dfc0814761abb7c00a5b54992b849452a0646b7f65c9f770f3f" dependencies = [ "proc-macro2", "quote", @@ -645,15 +647,15 @@ [[package]] name = "typenum" -version = "1.16.0" +version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba" +checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" [[package]] name = "unicode-ident" -version = "1.0.11" +version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "301abaae475aa91687eb82514b328ab47a211a533026cb25fc3e519b86adfc3c" +checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" [[package]] name = "universal-hash" @@ -679,9 +681,9 @@ [[package]] name = "x25519-dalek" -version = "2.0.0" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb66477291e7e8d2b0ff1bcb900bf29489a9692816d79874bea351e7a8b6de96" +checksum = "c7e468321c81fb07fa7f4c636c3972b9100f0346e5b6a9f2bd0603a52f7ed277" dependencies = [ "curve25519-dalek", "rand_core", @@ -698,6 +700,6 @@ [[package]] name = "zeroize" -version = "1.6.0" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a0956f1ba7c7909bfb66c2e9e4124ab6f6482560f6628b5aaeba39207c9aad9" +checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d"
diff --git a/nearby/presence/ldt_np_adv_ffi/.cargo/config.toml b/nearby/presence/ldt_np_adv_ffi/.cargo/config.toml deleted file mode 100644 index 430406b..0000000 --- a/nearby/presence/ldt_np_adv_ffi/.cargo/config.toml +++ /dev/null
@@ -1,9 +0,0 @@ -[target.aarch64-apple-darwin] -rustflags = [ - "-lSystem", -] - -[target.x86_64-apple-darwin] -rustflags = [ - "-lSystem", -] \ 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 deleted file mode 100644 index 3f7e2a7..0000000 --- a/nearby/presence/ldt_np_adv_ffi/Cargo.lock +++ /dev/null
@@ -1,946 +0,0 @@ -# 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" -version = "0.10.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "831010a0f742e1209b3bcea8fab6a8e149051ba6099432c8cb2cc117dec3ead1" -dependencies = [ - "aead", - "aes", - "cipher", - "ctr", - "ghash", - "subtle", -] - -[[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 = "aliasable" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "250f629c0161ad8107cf89319e990051fae62832fd343083bea452d93e2205fd" - -[[package]] -name = "array_ref" -version = "0.1.0" - -[[package]] -name = "array_view" -version = "0.1.0" - -[[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 = "base64ct" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" - -[[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 = "bssl-crypto" -version = "0.1.0" -dependencies = [ - "bssl-sys", -] - -[[package]] -name = "bssl-sys" -version = "0.1.0" - -[[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 = "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 = "const-oid" -version = "0.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6340df57935414636969091153f35f68d9f00bbc8fb4a9c6054706c213e6c6bc" - -[[package]] -name = "cpufeatures" -version = "0.2.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03e69e28e9f7f77debdedbaafa2866e1de9ba56df55a8bd7cfc724c25a09987c" -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" -dependencies = [ - "tinyvec", -] - -[[package]] -name = "crypto_provider_boringssl" -version = "0.1.0" -dependencies = [ - "bssl-crypto", - "crypto_provider", -] - -[[package]] -name = "crypto_provider_openssl" -version = "0.1.0" -dependencies = [ - "cfg-if", - "crypto_provider", - "crypto_provider_stubs", - "openssl", - "ouroboros", -] - -[[package]] -name = "crypto_provider_rustcrypto" -version = "0.1.0" -dependencies = [ - "aead", - "aes", - "aes-gcm", - "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 = "crypto_provider_stubs" -version = "0.1.0" -dependencies = [ - "crypto_provider", -] - -[[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" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f711ade317dd348950a9910f81c5947e3d8907ebd2b83f76203ff1807e6a2bc2" -dependencies = [ - "cfg-if", - "cpufeatures", - "curve25519-dalek-derive", - "digest", - "fiat-crypto", - "platforms", - "rustc_version", - "subtle", - "zeroize", -] - -[[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.22", -] - -[[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 = [ - "pkcs8", - "signature", -] - -[[package]] -name = "ed25519-dalek" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7277392b266383ef8396db7fdeb1e77b6c52fed775f5df15bb24f35b72156980" -dependencies = [ - "curve25519-dalek", - "ed25519", - "rand_core", - "serde", - "sha2", - "zeroize", -] - -[[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 = "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 = "foreign-types" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" -dependencies = [ - "foreign-types-shared", -] - -[[package]] -name = "foreign-types-shared" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" - -[[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 = "ghash" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d930750de5717d2dd0b8c0d42c076c0e884c81a73e6cab859bbd2339c71e3e40" -dependencies = [ - "opaque-debug", - "polyval", -] - -[[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 = "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" -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 = "inout" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0c10553d664a4d0bcff9f4215d0aac67a639cc68ef660840afe309b807bc9f5" -dependencies = [ - "block-padding", - "generic-array", -] - -[[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_np_adv_ffi" -version = "0.1.0" -dependencies = [ - "cfg-if", - "crypto_provider", - "crypto_provider_boringssl", - "crypto_provider_openssl", - "crypto_provider_rustcrypto", - "lazy_static", - "ldt", - "ldt_np_adv", - "libc_alloc", - "np_hkdf", - "panic-abort", - "rand", - "spin 0.9.8", -] - -[[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 = "libc_alloc" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a090348b66d90d8507e30f0d2bd88e5a5c454bd1733fc6d617cbc3471bf69ea" - -[[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 = "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 = "openssl" -version = "0.10.55" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "345df152bc43501c5eb9e4654ff05f794effb78d4efe3d53abc158baddc0703d" -dependencies = [ - "bitflags", - "cfg-if", - "foreign-types", - "libc", - "once_cell", - "openssl-macros", - "openssl-sys", -] - -[[package]] -name = "openssl-macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.22", -] - -[[package]] -name = "openssl-sys" -version = "0.9.90" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "374533b0e45f3a7ced10fcaeccca020e66656bc03dac384f852e4e5a7a8104a6" -dependencies = [ - "cc", - "libc", - "pkg-config", - "vcpkg", -] - -[[package]] -name = "ouroboros" -version = "0.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d813b7b31a82efae94bd30ffaac09aec85efc18db2d5ec3aead1a220ee954351" -dependencies = [ - "aliasable", - "ouroboros_macro", - "static_assertions", -] - -[[package]] -name = "ouroboros_macro" -version = "0.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a56f651b4dd45ae3ac3d260ced32eaf0620cddaae5f26c69b554a9016594726" -dependencies = [ - "heck", - "proc-macro-error", - "proc-macro2", - "quote", - "syn 2.0.22", -] - -[[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 = "panic-abort" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e20e6499bbbc412f280b04a42346b356c6fa0753d5fd22b7bd752ff34c778ee" - -[[package]] -name = "pkcs8" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" -dependencies = [ - "der", - "spki", -] - -[[package]] -name = "pkg-config" -version = "0.3.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26072860ba924cbfa98ea39c8c19b4dd6a4a25423dbdf219c1eca91aa0cf6964" - -[[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 = "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-macro-error" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" -dependencies = [ - "proc-macro-error-attr", - "proc-macro2", - "quote", - "syn 1.0.109", - "version_check", -] - -[[package]] -name = "proc-macro-error-attr" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" -dependencies = [ - "proc-macro2", - "quote", - "version_check", -] - -[[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 = [ - "libc", - "rand_chacha", - "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 = "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" -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.164" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e8c8cf938e98f769bc164923b06dce91cea1751522f46f8466461af04c9027d" - -[[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 = "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 = "spki" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d1e996ef02c474957d681f1b05213dfb0abab947b446a62d37770b23500184a" -dependencies = [ - "base64ct", - "der", -] - -[[package]] -name = "static_assertions" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" - -[[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", - "unicode-ident", -] - -[[package]] -name = "syn" -version = "2.0.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2efbeae7acf4eabd6bcdcbd11c92f45231ddda7539edc7806bd1a04a03b24616" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "tinyvec" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" - -[[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.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b15811caf2415fb889178633e7724bad2509101cde276048e013b9def5e51fa0" - -[[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 = "vcpkg" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" - -[[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 = "x25519-dalek" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb66477291e7e8d2b0ff1bcb900bf29489a9692816d79874bea351e7a8b6de96" -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/ldt_np_adv_ffi/Cargo.toml b/nearby/presence/ldt_np_adv_ffi/Cargo.toml index 829f932..fdc5501 100644 --- a/nearby/presence/ldt_np_adv_ffi/Cargo.toml +++ b/nearby/presence/ldt_np_adv_ffi/Cargo.toml
@@ -5,41 +5,24 @@ publish = false [dependencies] -crypto_provider = { path = "../../crypto/crypto_provider" } -crypto_provider_openssl = { path = "../../crypto/crypto_provider_openssl", optional = true } -crypto_provider_rustcrypto = { path = "../../crypto/crypto_provider_rustcrypto", optional = true } -crypto_provider_boringssl = { path = "../../crypto/crypto_provider_boringssl", optional = true } -ldt = { path = "../ldt" } -ldt_np_adv = { path = "../ldt_np_adv" } -np_hkdf = { path = "../np_hkdf" } +crypto_provider_default.workspace = true +crypto_provider.workspace = true +ldt.workspace = true +ldt_np_adv.workspace = true +np_hkdf.workspace = true -cfg-if = "1.0.0" -lazy_static = { version = "1.4.0" } - -# no_std only deps -libc_alloc = { version = "1.0.4", optional = true } -panic-abort = { version = "0.3.2", optional = true } -spin = { version = "0.9.8", optional = true } +cfg-if.workspace = true +lazy_static.workspace = true +spin = { workspace = true, optional = true } [dev-dependencies] -rand = "0.8.5" +rand.workspace = true [lib] # boringssl and bssl-sys are built as a static lib, so we need to as well crate-type = ["staticlib"] [features] -# by default we support no_std and use rustcrypto primitives -default = ["lazy_static/spin_no_std", "spin", "libc_alloc", "panic-abort", "crypto_provider_rustcrypto"] -std = ["crypto_provider_rustcrypto", "crypto_provider_rustcrypto/std"] -openssl = ["crypto_provider_openssl"] -boringssl = ["crypto_provider_boringssl"] - -[profile.release-min-size] -inherits = "release" -panic = "abort" -codegen-units = 1 -lto = true -# z optimizes for size -opt-level = "z" -strip = true +default = ["lazy_static/spin_no_std", "spin", "crypto_provider_default/rustcrypto"] +std = ["crypto_provider_default/std", "crypto_provider_default/rustcrypto"] +boringssl = ["crypto_provider_default/boringssl"] \ No newline at end of file
diff --git a/nearby/presence/ldt_np_adv_ffi/c/CMakeLists.txt b/nearby/presence/ldt_np_adv_ffi/c/CMakeLists.txt new file mode 100644 index 0000000..476b228 --- /dev/null +++ b/nearby/presence/ldt_np_adv_ffi/c/CMakeLists.txt
@@ -0,0 +1,49 @@ +# 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 ExternalProject to ensure that the rust artifacts are built +include(ExternalProject) +set_directory_properties(PROPERTIES EP_PREFIX ${CMAKE_BINARY_DIR}/target/tmp) +if (CMAKE_BUILD_TYPE STREQUAL "Debug") + set(CARGO_ARTIFACT_DIR debug) + set(CARGO_PROFILE dev) +else () + set(CARGO_ARTIFACT_DIR release) + set(CARGO_PROFILE release) +endif () + +ExternalProject_Add( + ldt_np_adv_ffi + DOWNLOAD_COMMAND "" + CONFIGURE_COMMAND "" + BUILD_COMMAND cargo build -p ldt_np_adv_ffi --no-default-features --features std --profile=${CARGO_PROFILE} + BUILD_BYPRODUCTS ${NEARBY_ROOT}/target/${CARGO_ARTIFACT_DIR}/${CMAKE_STATIC_LIBRARY_PREFIX}ldt_np_adv_ffi${CMAKE_STATIC_LIBRARY_SUFFIX} + BINARY_DIR "${NEARBY_ROOT}/target/" + INSTALL_COMMAND "") + +include_directories(${CMAKE_SOURCE_DIR}/ldt_np_adv_ffi/c/include/) + +add_subdirectory(sample) + +if (ENABLE_TESTS) + message(STATUS "Enabling ldt tests") + add_subdirectory(tests) + add_subdirectory(benchmarks) +endif () + +# Fuzzers won't build on windows so we need a separate flag to pull them in +if (ENABLE_FUZZ) + message(STATUS "Enabling ldt fuzzers") + add_subdirectory(fuzz) +endif ()
diff --git a/nearby/presence/ldt_np_adv_ffi/c/benchmarks/CMakeLists.txt b/nearby/presence/ldt_np_adv_ffi/c/benchmarks/CMakeLists.txt new file mode 100644 index 0000000..330c5ab --- /dev/null +++ b/nearby/presence/ldt_np_adv_ffi/c/benchmarks/CMakeLists.txt
@@ -0,0 +1,24 @@ +# Copyright 2024 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( + ldt_benchmarks + ldt_benchmarks.cc +) + +target_link_libraries( + ldt_benchmarks + "${NEARBY_ROOT}/target/release/${CMAKE_STATIC_LIBRARY_PREFIX}ldt_np_adv_ffi${CMAKE_STATIC_LIBRARY_SUFFIX}" + benchmark::benchmark +)
diff --git a/nearby/presence/ldt_np_c_sample/tests/ldt_benchmarks.cc b/nearby/presence/ldt_np_adv_ffi/c/benchmarks/ldt_benchmarks.cc similarity index 100% rename from nearby/presence/ldt_np_c_sample/tests/ldt_benchmarks.cc rename to nearby/presence/ldt_np_adv_ffi/c/benchmarks/ldt_benchmarks.cc
diff --git a/nearby/presence/ldt_np_adv_ffi/c/fuzz/CMakeLists.txt b/nearby/presence/ldt_np_adv_ffi/c/fuzz/CMakeLists.txt new file mode 100644 index 0000000..3c64c8e --- /dev/null +++ b/nearby/presence/ldt_np_adv_ffi/c/fuzz/CMakeLists.txt
@@ -0,0 +1,30 @@ +# 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. + +fuzztest_setup_fuzzing_flags() + +add_executable( + ldt_fuzzer + ldt_fuzzer.cc +) + +target_link_libraries( + ldt_fuzzer + PRIVATE + optimized "${NEARBY_ROOT}/target/release/${CMAKE_STATIC_LIBRARY_PREFIX}ldt_np_adv_ffi${CMAKE_STATIC_LIBRARY_SUFFIX}" + debug "${NEARBY_ROOT}/target/debug/${CMAKE_STATIC_LIBRARY_PREFIX}ldt_np_adv_ffi${CMAKE_STATIC_LIBRARY_SUFFIX}" + ssl) + +link_fuzztest(ldt_fuzzer) +gtest_discover_tests(ldt_fuzzer) \ No newline at end of file
diff --git a/nearby/presence/ldt_np_adv_ffi/c/fuzz/ldt_fuzzer.cc b/nearby/presence/ldt_np_adv_ffi/c/fuzz/ldt_fuzzer.cc new file mode 100644 index 0000000..dbe136d --- /dev/null +++ b/nearby/presence/ldt_np_adv_ffi/c/fuzz/ldt_fuzzer.cc
@@ -0,0 +1,125 @@ +/* + * 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 <array> +#include <vector> + +#include "fuzztest/fuzztest.h" +#include "gtest/gtest.h" +#include "np_ldt.h" +#include "openssl/digest.h" +#include "openssl/hkdf.h" +#include "openssl/hmac.h" +#include "openssl/obj_mac.h" + +void LdtDecryptBadMac(std::array<uint8_t, 32> key_seed_bytes, + std::array<uint8_t, 2> salt_bytes, + std::vector<uint8_t> plaintext_bytes, + std::array<uint8_t, 32> metadata_key_hmac_tag_bytes) { + NpLdtKeySeed key_seed; + memcpy(key_seed.bytes, key_seed_bytes.data(), key_seed_bytes.size()); + + NpLdtSalt salt; + memcpy(salt.bytes, salt_bytes.data(), salt_bytes.size()); + + NpMetadataKeyHmac metadata_key_hmac; + memcpy(metadata_key_hmac.bytes, metadata_key_hmac_tag_bytes.data(), + metadata_key_hmac_tag_bytes.size()); + + auto enc_handle = NpLdtEncryptCreate(key_seed); + EXPECT_NE(0, enc_handle.handle); + + auto result = NpLdtEncrypt(enc_handle, plaintext_bytes.data(), + plaintext_bytes.size(), salt); + EXPECT_EQ(NP_LDT_RESULT::NP_LDT_SUCCESS, result); + + auto dec_handle = NpLdtDecryptCreate(key_seed, metadata_key_hmac); + EXPECT_NE(0, dec_handle.handle); + result = NpLdtDecryptAndVerify(dec_handle, plaintext_bytes.data(), + plaintext_bytes.size(), salt); + EXPECT_EQ(NP_LDT_RESULT::NP_LDT_ERROR_MAC_MISMATCH, result) + << "we expect mac mismatch since we're using a random mac"; + + result = NpLdtEncryptClose(enc_handle); + EXPECT_EQ(NP_LDT_RESULT::NP_LDT_SUCCESS, result); + + result = NpLdtDecryptClose(dec_handle); + EXPECT_EQ(NP_LDT_RESULT::NP_LDT_SUCCESS, result); +} + +FUZZ_TEST(LdtFuzzers, LdtDecryptBadMac) + .WithDomains(fuzztest::Arbitrary<std::array<uint8_t, 32>>(), + fuzztest::Arbitrary<std::array<uint8_t, 2>>(), + fuzztest::Arbitrary<std::vector<uint8_t>>() + .WithMinSize(16) + .WithMaxSize(31), + fuzztest::Arbitrary<std::array<uint8_t, 32>>()); + +void LdtDecryptCorrectMac(std::array<uint8_t, 32> key_seed_bytes, + std::array<uint8_t, 2> salt_bytes, + std::vector<uint8_t> plaintext_bytes) { + NpLdtKeySeed key_seed; + memcpy(key_seed.bytes, key_seed_bytes.data(), key_seed_bytes.size()); + + NpLdtSalt salt; + memcpy(salt.bytes, salt_bytes.data(), salt_bytes.size()); + + // calculate metadata key hmac key by HKDFing key seed + // Reference: + // https://commondatastorage.googleapis.com/chromium-boringssl-docs/hkdf.h.html + // 32 byte HMAC-SHA256 key + uint8_t metadata_key_hmac_key[32] = {0}; + auto result = HKDF( + metadata_key_hmac_key, sizeof(metadata_key_hmac_key), EVP_sha256(), + (const uint8_t *)&key_seed.bytes, (size_t)32, + (const uint8_t *)"Google Nearby", (size_t)13, + (const uint8_t *)"Legacy metadata key verification HMAC key", (size_t)41); + EXPECT_EQ(1, result); + // calculate metadata key hmac using hkdf'd hmac key + NpMetadataKeyHmac metadata_key_hmac = {.bytes = {0}}; + // will be written to by HMAC call, but it will always be + // 32 because that's what SHA256 outputs + unsigned int md_len = 32; + // first 14 bytes of payload are metadata key + HMAC(EVP_sha256(), metadata_key_hmac_key, 32, plaintext_bytes.data(), 14, + metadata_key_hmac.bytes, &md_len); + + auto enc_handle = NpLdtEncryptCreate(key_seed); + EXPECT_NE(0, enc_handle.handle); + + result = NpLdtEncrypt(enc_handle, plaintext_bytes.data(), + plaintext_bytes.size(), salt); + EXPECT_EQ(NP_LDT_RESULT::NP_LDT_SUCCESS, result); + + auto dec_handle = NpLdtDecryptCreate(key_seed, metadata_key_hmac); + EXPECT_NE(0, dec_handle.handle); + result = NpLdtDecryptAndVerify(dec_handle, plaintext_bytes.data(), + plaintext_bytes.size(), salt); + EXPECT_EQ(NP_LDT_RESULT::NP_LDT_SUCCESS, result); + + result = NpLdtEncryptClose(enc_handle); + EXPECT_EQ(NP_LDT_RESULT::NP_LDT_SUCCESS, result); + + result = NpLdtDecryptClose(dec_handle); + EXPECT_EQ(NP_LDT_RESULT::NP_LDT_SUCCESS, result); +} + +FUZZ_TEST(LdtFuzzers, LdtDecryptCorrectMac) + .WithDomains(fuzztest::Arbitrary<std::array<uint8_t, 32>>(), + fuzztest::Arbitrary<std::array<uint8_t, 2>>(), + fuzztest::Arbitrary<std::vector<uint8_t>>() + .WithMinSize(16) + .WithMaxSize(31));
diff --git a/nearby/presence/ldt_np_adv_ffi/include/np_ldt.h b/nearby/presence/ldt_np_adv_ffi/c/include/np_ldt.h similarity index 100% rename from nearby/presence/ldt_np_adv_ffi/include/np_ldt.h rename to nearby/presence/ldt_np_adv_ffi/c/include/np_ldt.h
diff --git a/nearby/presence/ldt_np_adv_ffi/c/sample/CMakeLists.txt b/nearby/presence/ldt_np_adv_ffi/c/sample/CMakeLists.txt new file mode 100644 index 0000000..a18f15e --- /dev/null +++ b/nearby/presence/ldt_np_adv_ffi/c/sample/CMakeLists.txt
@@ -0,0 +1,19 @@ +# Copyright 2024 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(ldt_c_sample main.c) + +target_link_libraries( + ldt_c_sample + "${NEARBY_ROOT}/target/${CARGO_ARTIFACT_DIR}/${CMAKE_STATIC_LIBRARY_PREFIX}ldt_np_adv_ffi${CMAKE_STATIC_LIBRARY_SUFFIX}" +) \ No newline at end of file
diff --git a/nearby/presence/ldt_np_c_sample/main.c b/nearby/presence/ldt_np_adv_ffi/c/sample/main.c similarity index 100% rename from nearby/presence/ldt_np_c_sample/main.c rename to nearby/presence/ldt_np_adv_ffi/c/sample/main.c
diff --git a/nearby/presence/ldt_np_adv_ffi/c/tests/CMakeLists.txt b/nearby/presence/ldt_np_adv_ffi/c/tests/CMakeLists.txt new file mode 100644 index 0000000..a4cbc24 --- /dev/null +++ b/nearby/presence/ldt_np_adv_ffi/c/tests/CMakeLists.txt
@@ -0,0 +1,30 @@ +# 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. + +file(COPY ${CMAKE_SOURCE_DIR}/ldt_np_adv/resources/test/np_adv_test_vectors.json + DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) + +add_executable( + ldt_ffi_tests + ldt_ffi_tests.cc +) + +target_link_libraries( + ldt_ffi_tests + "${NEARBY_ROOT}/target/release/${CMAKE_STATIC_LIBRARY_PREFIX}ldt_np_adv_ffi${CMAKE_STATIC_LIBRARY_SUFFIX}" + jsoncpp + GTest::gtest_main +) + +gtest_discover_tests(ldt_ffi_tests) \ No newline at end of file
diff --git a/nearby/presence/ldt_np_c_sample/tests/ldt_ffi_tests.cc b/nearby/presence/ldt_np_adv_ffi/c/tests/ldt_ffi_tests.cc similarity index 100% rename from nearby/presence/ldt_np_c_sample/tests/ldt_ffi_tests.cc rename to nearby/presence/ldt_np_adv_ffi/c/tests/ldt_ffi_tests.cc
diff --git a/nearby/presence/ldt_np_adv_ffi/deny.toml b/nearby/presence/ldt_np_adv_ffi/deny.toml deleted file mode 100644 index ca51e11..0000000 --- a/nearby/presence/ldt_np_adv_ffi/deny.toml +++ /dev/null
@@ -1,213 +0,0 @@ -# This template contains all of the possible sections and their default values - -# Note that all fields that take a lint level have these possible values: -# * deny - An error will be produced and the check will fail -# * warn - A warning will be produced, but the check will not fail -# * allow - No warning or error will be produced, though in some cases a note -# will be - -# The values provided in this template are the default values that will be used -# when any section or field is not specified in your own configuration - -# If 1 or more target triples (and optionally, target_features) are specified, -# only the specified targets will be checked when running `cargo deny check`. -# This means, if a particular package is only ever used as a target specific -# dependency, such as, for example, the `nix` crate only being used via the -# `target_family = "unix"` configuration, that only having windows targets in -# this list would mean the nix crate, as well as any of its exclusive -# dependencies not shared by any other crates, would be ignored, as the target -# list here is effectively saying which targets you are building for. -targets = [ - # The triple can be any string, but only the target triples built in to - # rustc (as of 1.40) can be checked against actual config expressions - #{ triple = "x86_64-unknown-linux-musl" }, - # You can also specify which target_features you promise are enabled for a - # particular target. target_features are currently not validated against - # the actual valid features supported by the target architecture. - #{ triple = "wasm32-unknown-unknown", features = ["atomics"] }, -] - -# This section is considered when running `cargo deny check advisories` -# More documentation for the advisories section can be found here: -# https://embarkstudios.github.io/cargo-deny/checks/advisories/cfg.html -[advisories] -# The path where the advisory database is cloned/fetched into -db-path = "~/.cargo/advisory-db" -# The url(s) of the advisory databases to use -db-urls = ["https://github.com/rustsec/advisory-db"] -# The lint level for security vulnerabilities -vulnerability = "deny" -# The lint level for unmaintained crates -unmaintained = "warn" -# The lint level for crates that have been yanked from their source registry -yanked = "warn" -# The lint level for crates with security notices. Note that as of -# 2019-12-17 there are no security notice advisories in -# https://github.com/rustsec/advisory-db -notice = "warn" -# A list of advisory IDs to ignore. Note that ignored advisories will still -# output a note when they are encountered. -ignore = [ - #"RUSTSEC-0000-0000", -] -# Threshold for security vulnerabilities, any vulnerability with a CVSS score -# lower than the range specified will be ignored. Note that ignored advisories -# will still output a note when they are encountered. -# * None - CVSS Score 0.0 -# * Low - CVSS Score 0.1 - 3.9 -# * Medium - CVSS Score 4.0 - 6.9 -# * High - CVSS Score 7.0 - 8.9 -# * Critical - CVSS Score 9.0 - 10.0 -#severity-threshold = - -# If this is true, then cargo deny will use the git executable to fetch advisory database. -# If this is false, then it uses a built-in git library. -# Setting this to true can be helpful if you have special authentication requirements that cargo-deny does not support. -# See Git Authentication for more information about setting up git authentication. -#git-fetch-with-cli = true - -# This section is considered when running `cargo deny check licenses` -# More documentation for the licenses section can be found here: -# https://embarkstudios.github.io/cargo-deny/checks/licenses/cfg.html -[licenses] -# The lint level for crates which do not have a detectable license -unlicensed = "deny" -# List of explicitly allowed licenses -# See https://spdx.org/licenses/ for list of possible licenses -# [possible values: any SPDX 3.11 short identifier (+ optional exception)]. -allow = [ - "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 -# [possible values: any SPDX 3.11 short identifier (+ optional exception)]. -deny = [ - #"Nokia", -] -# Lint level for licenses considered copyleft -copyleft = "warn" -# Blanket approval or denial for OSI-approved or FSF Free/Libre licenses -# * both - The license will be approved if it is both OSI-approved *AND* FSF -# * either - The license will be approved if it is either OSI-approved *OR* FSF -# * osi-only - The license will be approved if is OSI-approved *AND NOT* FSF -# * fsf-only - The license will be approved if is FSF *AND NOT* OSI-approved -# * neither - This predicate is ignored and the default lint level is used -allow-osi-fsf-free = "neither" -# Lint level used when no other predicates are matched -# 1. License isn't in the allow or deny lists -# 2. License isn't copyleft -# 3. License isn't OSI/FSF, or allow-osi-fsf-free = "neither" -default = "deny" -# The confidence threshold for detecting a license from license text. -# The higher the value, the more closely the license text must be to the -# canonical license text of a valid SPDX license file. -# [possible values: any between 0.0 and 1.0]. -confidence-threshold = 0.8 -# Allow 1 or more licenses on a per-crate basis, so that particular licenses -# aren't accepted for every possible crate as with the normal allow list -exceptions = [ - # Each entry is the crate and version constraint, and its specific allow - # list - #{ allow = ["Zlib"], name = "adler32", version = "*" }, -] - -# Some crates don't have (easily) machine readable licensing information, -# adding a clarification entry for it allows you to manually specify the -# licensing information -#[[licenses.clarify]] -# The name of the crate the clarification applies to -#name = "ring" -# The optional version constraint for the crate -#version = "*" -# The SPDX expression for the license requirements of the crate -#expression = "MIT AND ISC AND OpenSSL" -# One or more files in the crate's source used as the "source of truth" for -# the license expression. If the contents match, the clarification will be used -# when running the license check, otherwise the clarification will be ignored -# and the crate will be checked normally, which may produce warnings or errors -# depending on the rest of your configuration -#license-files = [ - # Each entry is a crate relative path, and the (opaque) hash of its contents - #{ path = "LICENSE", hash = 0xbd0eed23 } -#] - -[[licenses.clarify]] -name = "ring" -version = "*" -expression = "MIT AND ISC AND OpenSSL" -license-files = [ - # Each entry is a crate relative path, and the (opaque) hash of its contents - { path = "LICENSE", hash = 0xbd0eed23 } -] - -[licenses.private] -# If true, ignores workspace crates that aren't published, or are only -# published to private registries. -# To see how to mark a crate as unpublished (to the official registry), -# visit https://doc.rust-lang.org/cargo/reference/manifest.html#the-publish-field. -ignore = true -# One or more private registries that you might publish crates to, if a crate -# is only published to private registries, and ignore is true, the crate will -# not have its license(s) checked -registries = [ - #"https://sekretz.com/registry -] - -# This section is considered when running `cargo deny check bans`. -# More documentation about the 'bans' section can be found here: -# https://embarkstudios.github.io/cargo-deny/checks/bans/cfg.html -[bans] -# Lint level for when multiple versions of the same crate are detected -multiple-versions = "allow" -# Lint level for when a crate version requirement is `*` -wildcards = "allow" -# The graph highlighting used when creating dotgraphs for crates -# with multiple versions -# * lowest-version - The path to the lowest versioned duplicate is highlighted -# * simplest-path - The path to the version with the fewest edges is highlighted -# * all - Both lowest-version and simplest-path are used -highlight = "all" -# List of crates that are allowed. Use with care! -allow = [ - #{ name = "ansi_term", version = "=0.11.0" }, -] -# List of crates to deny -deny = [ - # Each entry the name of a crate and a version range. If version is - # not specified, all versions will be matched. - #{ name = "ansi_term", version = "=0.11.0" }, - # - # Wrapper crates can optionally be specified to allow the crate when it - # is a direct dependency of the otherwise banned crate - #{ name = "ansi_term", version = "=0.11.0", wrappers = [] }, -] -# Certain crates/versions that will be skipped when doing duplicate detection. -skip = [ - #{ name = "ansi_term", version = "=0.11.0" }, -] -# Similarly to `skip` allows you to skip certain crates during duplicate -# detection. Unlike skip, it also includes the entire tree of transitive -# dependencies starting at the specified crate, up to a certain depth, which is -# by default infinite -skip-tree = [ - #{ name = "ansi_term", version = "=0.11.0", depth = 20 }, -] - -# This section is considered when running `cargo deny check sources`. -# More documentation about the 'sources' section can be found here: -# https://embarkstudios.github.io/cargo-deny/checks/sources/cfg.html -[sources] -# Lint level for what to happen when a crate from a crate registry that is not -# in the allow list is encountered -unknown-registry = "warn" -# Lint level for what to happen when a crate from a git repository that is not -# in the allow list is encountered -unknown-git = "warn" -# List of URLs for allowed crate registries. Defaults to the crates.io index -# if not specified. If it is specified but empty, no registries are allowed. -allow-registry = ["https://github.com/rust-lang/crates.io-index"] -# List of URLs for allowed Git repositories -allow-git = [] \ No newline at end of file
diff --git a/nearby/presence/ldt_np_adv_ffi/rust-toolchain.toml b/nearby/presence/ldt_np_adv_ffi/rust-toolchain.toml deleted file mode 100644 index 271800c..0000000 --- a/nearby/presence/ldt_np_adv_ffi/rust-toolchain.toml +++ /dev/null
@@ -1,2 +0,0 @@ -[toolchain] -channel = "nightly" \ No newline at end of file
diff --git a/nearby/presence/ldt_np_adv_ffi/src/handle_map.rs b/nearby/presence/ldt_np_adv_ffi/src/handle_map.rs index 9d83c19..9a19562 100644 --- a/nearby/presence/ldt_np_adv_ffi/src/handle_map.rs +++ b/nearby/presence/ldt_np_adv_ffi/src/handle_map.rs
@@ -22,7 +22,7 @@ // Pull in the needed deps for std vs no_std cfg_if::cfg_if! { // Test pulls in std which causes duplicate errors - if #[cfg(any(feature = "std", test, feature = "boringssl", feature = "openssl"))] { + if #[cfg(any(feature = "std", test, feature = "boringssl"))] { use std::sync::{Mutex, MutexGuard}; use std::collections::HashMap;
diff --git a/nearby/presence/ldt_np_adv_ffi/src/lib.rs b/nearby/presence/ldt_np_adv_ffi/src/lib.rs index 1534857..839135e 100644 --- a/nearby/presence/ldt_np_adv_ffi/src/lib.rs +++ b/nearby/presence/ldt_np_adv_ffi/src/lib.rs
@@ -12,7 +12,6 @@ // See the License for the specific language governing permissions and // limitations under the License. -#![no_std] #![deny( missing_docs, clippy::indexing_slicing, @@ -20,10 +19,6 @@ clippy::panic, clippy::expect_used )] -#![allow(internal_features)] -// TODO: Remove usage of `lang_items` when ffi is no longer alloc -// These features are needed to support no_std + alloc -#![feature(lang_items)] //! Rust ffi wrapper of ldt_np_adv, can be called from C/C++ Clients @@ -31,47 +26,15 @@ use alloc::boxed::Box; use core::slice; -use handle_map::get_enc_handle_map; +use crypto_provider_default::CryptoProviderImpl; use ldt_np_adv::{ build_np_adv_decrypter_from_key_seed, salt_padder, LdtAdvDecryptError, LdtEncrypterXtsAes128, LdtNpAdvDecrypterXtsAes128, LegacySalt, }; use np_hkdf::NpKeySeedHkdf; -use crate::handle_map::get_dec_handle_map; - mod handle_map; -// Pull in the needed deps for std vs no_std -cfg_if::cfg_if! { - // Test pulls in std which causes duplicate errors - if #[cfg(any(feature = "std", test, feature = "boringssl", feature = "openssl"))] { - extern crate std; - } else { - // Allow using Box in no_std - mod no_std; - } -} - -// Fail early for invalid combination of feature flags, we need at least one crypto library specified -#[cfg(all( - not(feature = "openssl"), - not(feature = "crypto_provider_rustcrypto"), - not(feature = "boringssl") -))] -compile_error!("Either the \"openssl\", \"boringssl\"or \"default\" features flag needs to be set in order to specify cryptographic library"); - -// Need to have one of the crypto provider impls -cfg_if::cfg_if! { - if #[cfg(feature = "openssl")] { - use crypto_provider_openssl::Openssl as CryptoProviderImpl; - } else if #[cfg(feature = "boringssl")]{ - use crypto_provider_boringssl::Boringssl as CryptoProviderImpl; - } else { - use crypto_provider_rustcrypto::RustCrypto as CryptoProviderImpl; - } -} - pub(crate) type LdtAdvDecrypter = LdtNpAdvDecrypterXtsAes128<CryptoProviderImpl>; pub(crate) type LdtAdvEncrypter = LdtEncrypterXtsAes128<CryptoProviderImpl>; @@ -111,7 +74,7 @@ &NpKeySeedHkdf::new(&key_seed.bytes), metadata_key_hmac.bytes, ); - let handle = get_dec_handle_map().insert::<CryptoProviderImpl>(Box::new(cipher)); + let handle = handle_map::get_dec_handle_map().insert::<CryptoProviderImpl>(Box::new(cipher)); NpLdtDecryptHandle { handle } } @@ -120,14 +83,14 @@ let cipher = LdtAdvEncrypter::new( &NpKeySeedHkdf::<CryptoProviderImpl>::new(&key_seed.bytes).legacy_ldt_key(), ); - let handle = get_enc_handle_map().insert::<CryptoProviderImpl>(Box::new(cipher)); + let handle = handle_map::get_enc_handle_map().insert::<CryptoProviderImpl>(Box::new(cipher)); NpLdtEncryptHandle { handle } } #[no_mangle] extern "C" fn NpLdtEncryptClose(handle: NpLdtEncryptHandle) -> i32 { map_to_error_code(|| { - get_enc_handle_map() + handle_map::get_enc_handle_map() .remove(&handle.handle) .ok_or(CloseCipherError::InvalidHandle) .map(|_| SUCCESS) @@ -137,7 +100,7 @@ #[no_mangle] extern "C" fn NpLdtDecryptClose(handle: NpLdtDecryptHandle) -> i32 { map_to_error_code(|| { - get_dec_handle_map() + handle_map::get_dec_handle_map() .remove(&handle.handle) .ok_or(CloseCipherError::InvalidHandle) .map(|_| SUCCESS) @@ -154,7 +117,7 @@ map_to_error_code(|| { let data = unsafe { slice::from_raw_parts_mut(buffer, buffer_len) }; let padder = salt_padder::<16, CryptoProviderImpl>(LegacySalt::from(salt.bytes)); - get_enc_handle_map() + handle_map::get_enc_handle_map() .get(&handle.handle) .map(|cipher| { cipher.encrypt(data, &padder).map(|_| 0).map_err(|e| match e { @@ -176,7 +139,7 @@ let data = unsafe { slice::from_raw_parts_mut(buffer, buffer_len) }; let padder = salt_padder::<16, CryptoProviderImpl>(LegacySalt::from(salt.bytes)); - get_dec_handle_map() + handle_map::get_dec_handle_map() .get(&handle.handle) .map(|cipher| { cipher
diff --git a/nearby/presence/ldt_np_adv_ffi_fuzz/CMakeLists.txt b/nearby/presence/ldt_np_adv_ffi_fuzz/CMakeLists.txt deleted file mode 100644 index 2144811..0000000 --- a/nearby/presence/ldt_np_adv_ffi_fuzz/CMakeLists.txt +++ /dev/null
@@ -1,47 +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. - -cmake_minimum_required(VERSION 3.0) - -# libfuzzer needs clang -SET(CMAKE_C_COMPILER "clang") - -include_directories( - ${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? -add_compile_options(-fsanitize=fuzzer,address) - -# 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) - message(STATUS "OpenSSL Found: ${OPENSSL_VERSION}") - message(STATUS "OpenSSL Include: ${OPENSSL_INCLUDE_DIR}") - message(STATUS "OpenSSL Libraries: ${OPENSSL_LIBRARIES}") -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) -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) -target_link_libraries(fuzzer_decrypt_correct_mac OpenSSL::SSL)
diff --git a/nearby/presence/ldt_np_adv_ffi_fuzz/src/fuzzer_decrypt_bad_mac.c b/nearby/presence/ldt_np_adv_ffi_fuzz/src/fuzzer_decrypt_bad_mac.c deleted file mode 100644 index 18abb0f..0000000 --- a/nearby/presence/ldt_np_adv_ffi_fuzz/src/fuzzer_decrypt_bad_mac.c +++ /dev/null
@@ -1,102 +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 <openssl/aes.h> -#include <stddef.h> -#include <stdint.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> - -#include "np_ldt.h" - -// Fuzz decrypting data that doesn't match the hmac -int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) { - // data: - // 32 byte key seed - // 2 byte salt - // 31 byte plaintext - // 1 byte length of plaintext to use - // 32 byte metadata key hmac - if (size < 98) { - return -1; - } - - NpLdtKeySeed key_seed; - memcpy(&key_seed.bytes, data, 32); - - NpLdtSalt salt; - memcpy(&salt.bytes, data + 32, 2); - - uint8_t payload[31]; - memcpy(&payload, data + 32 + 2, 31); - - uint8_t payload_len; - memcpy(&payload_len, data + 32 + 2 + 31, 1); - // length in [16, 31] - payload_len = 16 + (payload_len % 16); - - NpMetadataKeyHmac metadata_key_hmac; - memcpy(&metadata_key_hmac.bytes, data + 32 + 2 + 31 + 1, 32); - - // create a cipher - NpLdtEncryptHandle enc_handle = NpLdtEncryptCreate(key_seed); - if (enc_handle.handle == 0) { - printf("Error: create LDT failed\n"); - __builtin_trap(); - return 0; - } - - // encrypt with it - NP_LDT_RESULT result = NpLdtEncrypt(enc_handle, payload, payload_len, salt); - if (result != 0) { - printf("Error: encrypt\n"); - __builtin_trap(); - return 0; - } - - NpLdtDecryptHandle dec_handle = NpLdtDecryptCreate(key_seed, metadata_key_hmac); - if (dec_handle.handle == 0) { - printf("Error: create LDT failed\n"); - __builtin_trap(); - return 0; - } - - // decrypt & verify -- we expect mac mismatch since we're using a random mac - result = NpLdtDecryptAndVerify(dec_handle, payload, payload_len, salt); - if (result != -2) { - printf("Error: decryption didn't fail with the expected MAC mismatch\n"); - __builtin_trap(); - return 0; - } - - // deallocate the cipher - result = NpLdtEncryptClose(enc_handle); - if (result) { - printf("Error: close cipher\n"); - __builtin_trap(); - return result; - } - - result = NpLdtDecryptClose(dec_handle); - if (result) { - printf("Error: close cipher failed\n"); - __builtin_trap(); - return result; - } - - return 0; // Values other than 0 and -1 are reserved for future use. -}
diff --git a/nearby/presence/ldt_np_adv_ffi_fuzz/src/fuzzer_decrypt_correct_mac.c b/nearby/presence/ldt_np_adv_ffi_fuzz/src/fuzzer_decrypt_correct_mac.c deleted file mode 100644 index e99a7e8..0000000 --- a/nearby/presence/ldt_np_adv_ffi_fuzz/src/fuzzer_decrypt_correct_mac.c +++ /dev/null
@@ -1,145 +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 <openssl/core.h> -#include <openssl/core_names.h> -#include <openssl/hmac.h> -#include <openssl/kdf.h> -#include <openssl/obj_mac.h> -#include <openssl/params.h> -#include <stddef.h> -#include <string.h> - -#include "np_ldt.h" - -// Fuzz decrypting data that doesn't match the hmac -int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) { - // data: - // 32 byte key seed - // 2 byte salt - // 31 byte plaintext - // 1 byte length of plaintext to use - if (size < 66) { - return -1; - } - - NpLdtKeySeed key_seed; - memcpy(&key_seed.bytes, data, 32); - - NpLdtSalt salt; - memcpy(&salt.bytes, data + 32, 2); - - uint8_t payload[31]; - memcpy(&payload, data + 32 + 2, 31); - - uint8_t payload_len; - memcpy(&payload_len, data + 32 + 2 + 31, 1); - // length in [16, 31] - payload_len = 16 + (payload_len % 16); - - // calculate metadata key hmac key by HKDFing key seed - // HKDF code from https://www.openssl.org/docs/man3.0/man7/EVP_KDF-HKDF.html - EVP_KDF *kdf; - EVP_KDF_CTX *kctx; - // 32 byte HMAC-SHA256 key - uint8_t metadata_key_hmac_key[32] = {0}; - OSSL_PARAM params[5], *p = params; - - kdf = EVP_KDF_fetch(NULL, "HKDF", NULL); - if (kdf == NULL) { - printf("Couldn't allocate KDF\n"); - __builtin_trap(); - return 0; - } - kctx = EVP_KDF_CTX_new(kdf); - EVP_KDF_free(kdf); - - *p++ = OSSL_PARAM_construct_utf8_string(OSSL_KDF_PARAM_DIGEST, SN_sha256, - strlen(SN_sha256)); - *p++ = OSSL_PARAM_construct_octet_string(OSSL_KDF_PARAM_KEY, &key_seed.bytes, - (size_t)32); - *p++ = OSSL_PARAM_construct_octet_string( - OSSL_KDF_PARAM_INFO, "Legacy metadata key verification HMAC key", - (size_t)41); - *p++ = OSSL_PARAM_construct_octet_string(OSSL_KDF_PARAM_SALT, "Google Nearby", - (size_t)13); - *p = OSSL_PARAM_construct_end(); - if (EVP_KDF_derive(kctx, metadata_key_hmac_key, sizeof(metadata_key_hmac_key), - params) <= 0) { - printf("HKDF error\n"); - __builtin_trap(); - return 0; - } - - EVP_KDF_CTX_free(kctx); - - // calculate metadata key hmac using hkdf'd hmac key - NpMetadataKeyHmac metadata_key_hmac = {.bytes = {0}}; - // will be written to by HMAC call, but it will always be - // 32 because that's what SHA256 outputs - unsigned int md_len = 32; - // first 14 bytes of payload are metadata key - HMAC(EVP_sha256(), metadata_key_hmac_key, 32, payload, 14, - metadata_key_hmac.bytes, &md_len); - - // create a cipher - NpLdtEncryptHandle enc_handle = NpLdtEncryptCreate(key_seed); - if (enc_handle.handle == 0) { - printf("Error: create LDT failed\n"); - __builtin_trap(); - return 0; - } - - // encrypt with it - NP_LDT_RESULT result = NpLdtEncrypt(enc_handle, payload, payload_len, salt); - if (result != 0) { - printf("Error: encrypt\n"); - __builtin_trap(); - return 0; - } - - NpLdtDecryptHandle dec_handle = NpLdtDecryptCreate(key_seed, metadata_key_hmac); - if (dec_handle.handle == 0) { - printf("Error: create LDT failed\n"); - __builtin_trap(); - return 0; - } - - // decrypt & verify -- we expect mac mismatch since we're using a random mac - result = NpLdtDecryptAndVerify(dec_handle, payload, payload_len, salt); - if (result != 0) { - printf("Error: decryption failed\n"); - __builtin_trap(); - return 0; - } - - // deallocate the ciphers - result = NpLdtEncryptClose(enc_handle); - if (result) { - printf("Error: close cipher failed\n"); - __builtin_trap(); - return result; - } - - result = NpLdtDecryptClose(dec_handle); - if (result) { - printf("Error: close cipher failed\n"); - __builtin_trap(); - return result; - } - - return 0; // Values other than 0 and -1 are reserved for future use. -}
diff --git a/nearby/presence/ldt_np_c_sample/CMakeLists.txt b/nearby/presence/ldt_np_c_sample/CMakeLists.txt deleted file mode 100644 index aefc0ba..0000000 --- a/nearby/presence/ldt_np_c_sample/CMakeLists.txt +++ /dev/null
@@ -1,52 +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_directories( - ${CMAKE_SOURCE_DIR}/ldt_np_adv_ffi/include/ - ${CMAKE_SOURCE_DIR}/ldt_np_c_sample/) - -include(ExternalProject) -set_directory_properties(PROPERTIES EP_PREFIX ${CMAKE_BINARY_DIR}/target/tmp) -ExternalProject_Add( - ldt_np_adv_ffi - DOWNLOAD_COMMAND "" - CONFIGURE_COMMAND "" - BUILD_COMMAND cargo build COMMAND cargo build --release --no-default-features --features std - BINARY_DIR "${CMAKE_SOURCE_DIR}/ldt_np_adv_ffi" - INSTALL_COMMAND "") - -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}" -) - -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 "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 deleted file mode 100644 index 141563d..0000000 --- a/nearby/presence/ldt_np_c_sample/tests/CMakeLists.txt +++ /dev/null
@@ -1,65 +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. - -file(COPY ${CMAKE_SOURCE_DIR}/ldt_np_adv/resources/test/np_adv_test_vectors.json - DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) - -add_executable( - ldt_ffi_tests - ldt_ffi_tests.cc -) - -target_link_libraries( - 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 -) -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 -) - -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 -) - -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_jni/Cargo.toml b/nearby/presence/ldt_np_jni/Cargo.toml index 2551c14..cf7c2db 100644 --- a/nearby/presence/ldt_np_jni/Cargo.toml +++ b/nearby/presence/ldt_np_jni/Cargo.toml
@@ -20,7 +20,6 @@ [features] default = ["rustcrypto"] rustcrypto = ["crypto_provider_default/rustcrypto", "crypto_provider_default/std"] -opensslbssl = ["crypto_provider_default/opensslbssl"] boringssl = ["crypto_provider_default/boringssl"] [lib]
diff --git a/nearby/presence/ldt_np_jni/java/LdtNpJni/src/main/java/com/google/android/gms/nearby/presence/hazmat/LdtNpJni.java b/nearby/presence/ldt_np_jni/java/LdtNpJni/src/main/java/com/google/android/gms/nearby/presence/hazmat/LdtNpJni.java index 6af362a..1c0db30 100644 --- a/nearby/presence/ldt_np_jni/java/LdtNpJni/src/main/java/com/google/android/gms/nearby/presence/hazmat/LdtNpJni.java +++ b/nearby/presence/ldt_np_jni/java/LdtNpJni/src/main/java/com/google/android/gms/nearby/presence/hazmat/LdtNpJni.java
@@ -17,22 +17,25 @@ import androidx.annotation.IntDef; - /** JNI for a Nearby Presence LDT-XTS-AES128 cipher with the "swap" mix function. */ class LdtNpJni { /** Error codes which map to return values on the native side. */ - @IntDef({DecryptErrorCode.DATA_LEN_ERROR, DecryptErrorCode.JNI_OP_ERROR, DecryptErrorCode.MAC_MISMATCH} ) + @IntDef({ + DecryptErrorCode.DATA_LEN_ERROR, + DecryptErrorCode.JNI_OP_ERROR, + DecryptErrorCode.MAC_MISMATCH + }) public @interface DecryptErrorCode { - int DATA_LEN_ERROR = -1; + int DATA_LEN_ERROR = -1; int JNI_OP_ERROR = -2; int MAC_MISMATCH = -3; } /** Error codes which map to return values on the native side. */ - @IntDef({EncryptErrorCode.DATA_LEN_ERROR, EncryptErrorCode.JNI_OP_ERROR} ) + @IntDef({EncryptErrorCode.DATA_LEN_ERROR, EncryptErrorCode.JNI_OP_ERROR}) public @interface EncryptErrorCode { - int DATA_LEN_ERROR = -1; + int DATA_LEN_ERROR = -1; int JNI_OP_ERROR = -2; } @@ -43,8 +46,8 @@ /** * Create a new LDT-XTS-AES128 Encryption cipher using the "swap" mix function. * - * @param keySeed is the 32-byte key material from the Nearby Presence credential from which - * the LDT key will be derived. + * @param keySeed is the 32-byte key material from the Nearby Presence credential from which the + * LDT key will be derived. * @return 0 on error, or a non-zero handle on success. */ static native long createEncryptionCipher(byte[] keySeed); @@ -52,16 +55,17 @@ /** * Create a new LDT-XTS-AES128 Decryption cipher using the "swap" mix function. * - * @param keySeed is the 32-byte key material from the Nearby Presence credential from which - * the LDT key will be derived. - * @param hmacTag is the hmac auth tag calculated on the metadata key used to verify - * decryption was successful. + * @param keySeed is the 32-byte key material from the Nearby Presence credential from which the + * LDT key will be derived. + * @param hmacTag is the hmac auth tag calculated on the metadata key used to verify decryption + * was successful. * @return 0 on error, or a non-zero handle on success. */ static native long createDecryptionCipher(byte[] keySeed, byte[] hmacTag); /** * Close the native resources for an LdtEncryptCipher instance. + * * @param ldtEncryptHandle a ldt handle returned from {@link LdtNpJni#createEncryptionCipher}. */ static native void closeEncryptCipher(long ldtEncryptHandle); @@ -76,28 +80,28 @@ /** * Encrypt a 16-31 byte buffer in-place. * - * @param ldtEncryptHandle a ldt encryption handle returned from {@link LdtNpJni#createEncryptionCipher}. - * @param salt is the big-endian 2 byte salt that will be used in the Nearby - * Presence advertisement, which will be incorporated into the tweaks LDT uses - * while encrypting. + * @param ldtEncryptHandle a ldt encryption handle returned from {@link + * LdtNpJni#createEncryptionCipher}. + * @param salt is the big-endian 2 byte salt that will be used in the Nearby Presence + * advertisement, which will be incorporated into the tweaks LDT uses while encrypting. * @param data 16-31 bytes of plaintext data to be encrypted - * @return 0 on success, in which case `buffer` will now contain ciphertext or a non-zero - * an error code on failure + * @return 0 on success, in which case `buffer` will now contain ciphertext or a non-zero an error + * code on failure */ @EncryptErrorCode static native int encrypt(long ldtEncryptHandle, char salt, byte[] data); /** - * Decrypt a 16-31 byte buffer in-place and verify the plaintext metadata key matches - * this item's MAC, if not the buffer will not be decrypted. + * Decrypt a 16-31 byte buffer in-place and verify the plaintext metadata key matches this item's + * MAC, if not the buffer will not be decrypted. * - * @param ldtDecryptHandle a ldt encryption handle returned from {@link LdtNpJni#createDecryptionCipher}. - * @param salt is the big-endian 2 byte salt that will be used in the Nearby - * Presence advertisement, which will be incorporated into the tweaks LDT uses - * while encrypting. + * @param ldtDecryptHandle a ldt encryption handle returned from {@link + * LdtNpJni#createDecryptionCipher}. + * @param salt is the big-endian 2 byte salt that will be used in the Nearby Presence + * advertisement, which will be incorporated into the tweaks LDT uses while encrypting. * @param data 16-31 bytes of ciphertext data to be decrypted - * @return 0 on success, in which case `buffer` will now contain ciphertext or a non-zero - * an error code on failure, in which case data will remain unchanged. + * @return 0 on success, in which case `buffer` will now contain ciphertext or a non-zero an error + * code on failure, in which case data will remain unchanged. */ @DecryptErrorCode static native int decryptAndVerify(long ldtDecryptHandle, char salt, byte[] data);
diff --git a/nearby/presence/np_adv/benches/deser_adv.rs b/nearby/presence/np_adv/benches/deser_adv.rs index 08fd5c4..b52f53a 100644 --- a/nearby/presence/np_adv/benches/deser_adv.rs +++ b/nearby/presence/np_adv/benches/deser_adv.rs
@@ -333,7 +333,9 @@ } } } -fn add_des<I: SectionEncoder>(sb: &mut SectionBuilder<I>) { +fn add_des<I: SectionEncoder>( + sb: &mut SectionBuilder<&mut np_adv::extended::serialize::AdvBuilder, 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(); }
diff --git a/nearby/presence/np_adv/src/credential/v1.rs b/nearby/presence/np_adv/src/credential/v1.rs index 386799f..c13487d 100644 --- a/nearby/presence/np_adv/src/credential/v1.rs +++ b/nearby/presence/np_adv/src/credential/v1.rs
@@ -18,6 +18,7 @@ protocol_version_seal, BroadcastCryptoMaterial, DiscoveryCryptoMaterial, ProtocolVersion, }; use crate::MetadataKey; +use crypto_provider::ed25519::InvalidPublicKeyBytes; use crypto_provider::{aes::Aes128Key, ed25519, ed25519::PublicKey, CryptoProvider, CryptoRng}; use np_hkdf::UnsignedSectionKeys; @@ -28,22 +29,52 @@ key_seed: [u8; 32], expected_unsigned_metadata_key_hmac: [u8; 32], expected_signed_metadata_key_hmac: [u8; 32], - pub_key: ed25519::RawPublicKey, + validated_pub_key: sealed::ValidatedPublicKey, } + +mod sealed { + use crypto_provider::ed25519::InvalidPublicKeyBytes; + use crypto_provider::{ed25519, CryptoProvider}; + + // Wrapper of raw public ed25519 key bytes indicating the bytes stored + // actually represent a valid "edwards y" format and that said compressed + // point is actually a point on the curve. + #[derive(Clone, Copy)] + pub(crate) struct ValidatedPublicKey(ed25519::RawPublicKey); + + impl ValidatedPublicKey { + pub(crate) fn from_raw_bytes<C: CryptoProvider>( + bytes: ed25519::RawPublicKey, + ) -> Result<Self, InvalidPublicKeyBytes> { + np_ed25519::PublicKey::<C>::from_bytes(&bytes) + .map(|_| Self(bytes)) + .map_err(|_| InvalidPublicKeyBytes) + } + + pub(crate) fn to_public_key<C: CryptoProvider>(self) -> np_ed25519::PublicKey<C> { + np_ed25519::PublicKey::<C>::from_bytes(&self.0) + .expect("The public key bytes were validated on construction") + } + } +} +pub(crate) use sealed::ValidatedPublicKey; + impl V1DiscoveryCredential { /// Construct a V1 discovery credential from the provided identity data. - pub fn new( + 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: ed25519::RawPublicKey, - ) -> Self { - Self { - key_seed, - expected_unsigned_metadata_key_hmac, - expected_signed_metadata_key_hmac, - pub_key, - } + ) -> Result<Self, InvalidPublicKeyBytes> { + ValidatedPublicKey::from_raw_bytes::<C>(pub_key) + .map(|validated_pub_key| Self { + key_seed, + expected_unsigned_metadata_key_hmac, + expected_signed_metadata_key_hmac, + validated_pub_key, + }) + .map_err(|_| InvalidPublicKeyBytes) } /// Constructs pre-calculated crypto material from this discovery credential. @@ -94,7 +125,7 @@ } fn signed_verification_material<C: CryptoProvider>(&self) -> SignedSectionVerificationMaterial { - SignedSectionVerificationMaterial { pub_key: self.pub_key } + SignedSectionVerificationMaterial { validated_public_key: self.validated_pub_key } } fn unsigned_verification_material<C: CryptoProvider>( @@ -229,7 +260,7 @@ pub struct SignedSectionVerificationMaterial { /// The np_ed25519 public key to be /// used for signature verification of signed sections. - pub(crate) pub_key: ed25519::RawPublicKey, + pub(crate) validated_public_key: sealed::ValidatedPublicKey, } impl SignedSectionVerificationMaterial { @@ -238,7 +269,7 @@ 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") + self.validated_public_key.to_public_key() } } @@ -408,7 +439,7 @@ .calculate_hmac(metadata_key.0.as_slice()); let signed = hkdf.extended_signed_metadata_key_hmac_key().calculate_hmac(metadata_key.0.as_slice()); - V1DiscoveryCredential::new(key_seed, unsigned, signed, pub_key) + V1DiscoveryCredential::new::<C>(key_seed, unsigned, signed, pub_key).expect("The public key bytes are guaranteed to be valid since they come from the key_pair construction above") } }
diff --git a/nearby/presence/np_adv/src/deser_v1_tests.rs b/nearby/presence/np_adv/src/deser_v1_tests.rs index cea0063..cdd9030 100644 --- a/nearby/presence/np_adv/src/deser_v1_tests.rs +++ b/nearby/presence/np_adv/src/deser_v1_tests.rs
@@ -429,7 +429,7 @@ /// Populate a random number of sections with randomly chosen identities and random DEs fn fill_encrypted_adv<'a, R: rand::Rng, C: CryptoProvider>( mut rng: &mut R, - identities: &'a Vec<TestIdentity<C>>, + identities: &'a [TestIdentity<C>], adv_builder: &mut AdvBuilder, ) -> Vec<SectionConfig<'a, C>> { let mut expected = Vec::new(); @@ -519,7 +519,7 @@ } /// Add several DEs with random types and contents fn add_des<I: SectionEncoder, R: rand::Rng>( - mut sb: SectionBuilder<I>, + mut sb: SectionBuilder<&mut AdvBuilder, I>, rng: &mut R, ) -> Vec<GenericDataElement> { let mut des = Vec::new();
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 index af70228..c5a468f 100644 --- 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
@@ -129,12 +129,13 @@ // plaintext is correct { - let crypto_material = V1DiscoveryCredential::new( + let crypto_material = V1DiscoveryCredential::new::<CryptoProviderImpl>( key_seed, key_seed_hkdf.extended_unsigned_metadata_key_hmac_key().calculate_hmac(&metadata_key.0), key_seed_hkdf.extended_signed_metadata_key_hmac_key().calculate_hmac(&metadata_key.0), key_pair.public().to_bytes(), - ); + ) + .expect("public key bytes are valid since they are generated from a key pair"); let signed_identity_resolution_material = crypto_material.signed_identity_resolution_material::<CryptoProviderImpl>(); let identity_resolution_contents = @@ -179,12 +180,13 @@ // deserialization to Section works { - let crypto_material = V1DiscoveryCredential::new( + let crypto_material = V1DiscoveryCredential::new::<CryptoProviderImpl>( key_seed, key_seed_hkdf.extended_unsigned_metadata_key_hmac_key().calculate_hmac(&metadata_key.0), key_seed_hkdf.extended_signed_metadata_key_hmac_key().calculate_hmac(&metadata_key.0), key_pair.public().to_bytes(), - ); + ) + .expect("public key bytes are valid since they are generated from a key pair"); let signed_identity_resolution_material = crypto_material.signed_identity_resolution_material::<CryptoProviderImpl>(); let signed_verification_material = @@ -422,7 +424,10 @@ }); let signed_verification_material = SignedSectionVerificationMaterial { - pub_key: pub_key.unwrap_or_else(|| key_pair.public()).to_bytes(), + validated_public_key: ValidatedPublicKey::from_raw_bytes::<CryptoProviderImpl>( + pub_key.unwrap_or_else(|| key_pair.public()).to_bytes(), + ) + .expect("public key should be valid bytes"), }; assert_eq!( @@ -526,12 +531,13 @@ contents ); - let crypto_material = V1DiscoveryCredential::new( + let crypto_material = V1DiscoveryCredential::new::<CryptoProviderImpl>( key_seed, key_seed_hkdf.extended_unsigned_metadata_key_hmac_key().calculate_hmac(&metadata_key.0), key_seed_hkdf.extended_signed_metadata_key_hmac_key().calculate_hmac(&metadata_key.0), key_pair.public().to_bytes(), - ); + ) + .expect("public key bytes are valid since they are generated from a key pair"); let identity_resolution_material = crypto_material.signed_identity_resolution_material::<CryptoProviderImpl>(); let verification_material =
diff --git a/nearby/presence/np_adv/src/extended/deserialize/mod.rs b/nearby/presence/np_adv/src/extended/deserialize/mod.rs index 6ec7881..8f12a94 100644 --- a/nearby/presence/np_adv/src/extended/deserialize/mod.rs +++ b/nearby/presence/np_adv/src/extended/deserialize/mod.rs
@@ -48,7 +48,7 @@ DeserializationError, EncryptedSectionContents, MicEncryptedSection, MicVerificationError, SignatureEncryptedSection, SignatureVerificationError, }, - DeLength, ENCRYPTION_INFO_DE_TYPE, METADATA_KEY_LEN, NP_ADV_MAX_SECTION_LEN, + DeLength, ENCRYPTION_INFO_DE_TYPE, NP_ADV_MAX_SECTION_LEN, }, HasIdentityMatch, MetadataKey, PlaintextIdentityMode, V1Header, }; @@ -170,7 +170,7 @@ // 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) + (EncryptedIdentityMetadata::TOTAL_DE_LEN..=NP_ADV_MAX_SECTION_LEN) .contains(&identity_and_ciphertext.len()) }, ), @@ -206,7 +206,8 @@ // 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) + (EncryptedIdentityMetadata::TOTAL_DE_LEN + SectionMic::CONTENTS_LEN + ..=NP_ADV_MAX_SECTION_LEN) .contains(&identity_ciphertext_and_mic.len()) }, ), @@ -901,6 +902,8 @@ } } +pub(crate) const IDENTITY_HEADER_LEN: usize = 2; + /// Parsed form of an encrypted identity DE before its contents are decrypted. /// Metadata key is stored in the enclosing section. #[derive(PartialEq, Eq, Debug)] @@ -908,7 +911,7 @@ 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) header_bytes: [u8; IDENTITY_HEADER_LEN], pub(crate) identity_type: EncryptedIdentityDataElementType, }
diff --git a/nearby/presence/np_adv/src/extended/deserialize/section_tests.rs b/nearby/presence/np_adv/src/extended/deserialize/section_tests.rs index f7e2025..5fa2dbe 100644 --- a/nearby/presence/np_adv/src/extended/deserialize/section_tests.rs +++ b/nearby/presence/np_adv/src/extended/deserialize/section_tests.rs
@@ -523,7 +523,7 @@ fn fill_section_random_des<'adv, R: rand::Rng, I: serialize::SectionEncoder>( mut rng: &mut R, sink: &'adv mut Vec<u8>, - section_builder: &mut SectionBuilder<I>, + section_builder: &mut SectionBuilder<&mut AdvBuilder, I>, de_offset: usize, ) -> (Vec<DataElement<'adv>>, Vec<GenericDataElement>) { let mut expected_des = vec![];
diff --git a/nearby/presence/np_adv/src/extended/serialize/mod.rs b/nearby/presence/np_adv/src/extended/serialize/mod.rs index e753281..b70f49d 100644 --- a/nearby/presence/np_adv/src/extended/serialize/mod.rs +++ b/nearby/presence/np_adv/src/extended/serialize/mod.rs
@@ -161,6 +161,12 @@ advertisement_type: AdvertisementType, } +impl AsMut<AdvBuilder> for AdvBuilder { + fn as_mut(&mut self) -> &mut AdvBuilder { + self + } +} + impl AdvBuilder { /// Build an [AdvBuilder]. pub fn new(advertisement_type: AdvertisementType) -> Self { @@ -170,17 +176,10 @@ Self { adv, section_count: 0, advertisement_type } } - /// Create a section builder. - /// - /// 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<SE: SectionEncoder>( - &mut self, - section_encoder: SE, - ) -> Result<SectionBuilder<SE>, AddSectionError> { + fn prepare_section_builder_buffer_and_de_offset<SE: SectionEncoder>( + &self, + ) -> Result<(CapacityLimitedVec<u8, NP_ADV_MAX_SECTION_LEN>, DataElementOffset), AddSectionError> + { // section header and identity prefix let prefix_len = 1 + SE::PREFIX_LEN; let minimum_section_len = prefix_len + SE::SUFFIX_LEN; @@ -203,16 +202,49 @@ // 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 - SE::SUFFIX_LEN, - }, - section_encoder, - adv_builder: self, - next_de_offset: SE::INITIAL_DE_OFFSET, - }) + let section = CapacityLimitedVec { + vec: section, + // won't underflow: checked above + capacity: available_len - SE::SUFFIX_LEN, + }; + let next_de_offset = SE::INITIAL_DE_OFFSET; + Ok((section, next_de_offset)) + } + + /// Create a section builder whose contents may be added to this advertisement. + /// + /// 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<SE: SectionEncoder>( + &mut self, + section_encoder: SE, + ) -> Result<SectionBuilder<&mut AdvBuilder, SE>, AddSectionError> { + let (section, next_de_offset) = + self.prepare_section_builder_buffer_and_de_offset::<SE>()?; + + Ok(SectionBuilder { section, section_encoder, adv_builder: self, next_de_offset }) + } + + /// Create a section builder which actually takes ownership of this advertisement builder. + /// + /// This is unlike `AdvertisementBuilder#section_builder` in that the returned section + /// builder will take ownership of this advertisement builder, if the operation was + /// successful. Otherwise, this advertisement builder will be returned back to the + /// caller unaltered as part of the `Err` arm. + #[allow(clippy::result_large_err)] + pub fn into_section_builder<SE: SectionEncoder>( + self, + section_encoder: SE, + ) -> Result<SectionBuilder<AdvBuilder, SE>, (AdvBuilder, AddSectionError)> { + match self.prepare_section_builder_buffer_and_de_offset::<SE>() { + Ok((section, next_de_offset)) => { + Ok(SectionBuilder { section, section_encoder, adv_builder: self, next_de_offset }) + } + Err(err) => Err((self, err)), + } } /// Convert the builder into an encoded advertisement. @@ -220,6 +252,12 @@ EncodedAdvertisement { adv: to_array_view(self.adv) } } + /// Gets the current number of sections added to this advertisement + /// builder, not counting any outstanding SectionBuilders. + pub fn section_count(&self) -> usize { + self.section_count + } + /// Add the section, which must have come from a SectionBuilder generated from this, into this /// advertisement. fn add_section(&mut self, section: EncodedSection) { @@ -272,6 +310,11 @@ pub fn as_slice(&self) -> &[u8] { self.adv.as_slice() } + /// Converts this encoded advertisement into + /// a raw byte-array. + pub fn into_array_view(self) -> ArrayView<u8, BLE_ADV_SVC_CONTENT_LEN> { + self.adv + } } /// The encoded form of an advertisement section @@ -279,24 +322,56 @@ /// Accumulates data elements and encodes them into a section. #[derive(Debug)] -pub struct SectionBuilder<'a, SE: SectionEncoder> { +pub struct SectionBuilder<R: AsMut<AdvBuilder>, SE: SectionEncoder> { /// Contains the section header, the identity-specified overhead, and any DEs added pub(crate) section: CapacityLimitedVec<u8, NP_ADV_MAX_SECTION_LEN>, section_encoder: SE, - /// mut ref to enforce only one active section builder at a time - adv_builder: &'a mut AdvBuilder, + /// mut ref-able to enforce only one active section builder at a time + adv_builder: R, next_de_offset: DataElementOffset, } -impl<'a, SE: SectionEncoder> SectionBuilder<'a, SE> { +impl<'a, SE: SectionEncoder> SectionBuilder<&'a mut AdvBuilder, SE> { /// Add this builder to the advertisement that created it. pub fn add_to_advertisement(self) { - let adv_builder = self.adv_builder; + let _ = self.add_to_advertisement_internal(); + } +} + +impl<SE: SectionEncoder> SectionBuilder<AdvBuilder, SE> { + /// Gets the 0-based index of the section currently under construction + /// in the context of the containing advertisement. + pub fn section_index(&self) -> usize { + self.adv_builder.section_count() + } + /// Add this builder to the advertisement that created it, + /// and returns the containing advertisement back to the caller. + pub fn add_to_advertisement(self) -> AdvBuilder { + self.add_to_advertisement_internal() + } +} + +impl<R: AsMut<AdvBuilder>, SE: SectionEncoder> SectionBuilder<R, SE> { + /// Add this builder to the advertisement that created it. + /// Returns the mut-refable to the advertisement builder + /// which the contents of this section builder were added to. + fn add_to_advertisement_internal(mut self) -> R { + let adv_builder = self.adv_builder.as_mut(); + let adv_builder_header_byte = adv_builder.header_byte(); adv_builder.add_section(Self::build_section( + adv_builder_header_byte, self.section.into_inner(), self.section_encoder, - adv_builder, - )) + )); + self.adv_builder + } + + /// Gets the derived salt which will be employed for the next DE offset. + /// + /// Suitable for scenarios (like FFI) where a closure would be inappropriate + /// for DE construction, and interaction with the client is preferred. + pub fn next_de_salt(&self) -> SE::DerivedSalt { + self.section_encoder.de_salt(self.next_de_offset) } /// Add a data element to the section with a closure that returns a `Result`. @@ -306,8 +381,7 @@ &mut self, build_de: F, ) -> Result<(), AddDataElementError<E>> { - let writer = build_de(self.section_encoder.de_salt(self.next_de_offset)) - .map_err(AddDataElementError::BuildDeError)?; + let writer = build_de(self.next_de_salt()).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 @@ -357,9 +431,9 @@ /// /// Implemented without self to avoid partial-move issues. fn build_section( + adv_builder_header_byte: u8, mut section_contents: tinyvec::ArrayVec<[u8; NP_ADV_MAX_SECTION_LEN]>, mut section_encoder: SE, - adv_builder: &AdvBuilder, ) -> EncodedSection { // there is space because the capacity for DEs was restricted to allow it section_contents.resize(section_contents.len() + SE::SUFFIX_LEN, 0); @@ -372,7 +446,7 @@ .expect("section length is always <=255 and non-negative"); section_encoder.postprocess( - adv_builder.header_byte(), + adv_builder_header_byte, section_contents[0], &mut section_contents[1..], );
diff --git a/nearby/presence/np_adv/src/extended/serialize/section_tests.rs b/nearby/presence/np_adv/src/extended/serialize/section_tests.rs index 68e5b60..3a6a5f9 100644 --- a/nearby/presence/np_adv/src/extended/serialize/section_tests.rs +++ b/nearby/presence/np_adv/src/extended/serialize/section_tests.rs
@@ -805,7 +805,7 @@ /// Write `section_contents_len` bytes of DE and header into `section_builder` pub(crate) fn fill_section_builder<I: SectionEncoder>( section_contents_len: usize, - section_builder: &mut SectionBuilder<I>, + section_builder: &mut SectionBuilder<&mut AdvBuilder, I>, ) { // DEs can only go up to 127, so we'll need multiple for long sections for _ in 0..(section_contents_len / 100) { @@ -863,9 +863,14 @@ fn into_section(self) -> EncodedSection; } -impl<'a, I: SectionEncoder> SectionBuilderExt for SectionBuilder<'a, I> { +impl<R: AsMut<AdvBuilder>, I: SectionEncoder> SectionBuilderExt for SectionBuilder<R, I> { /// Convenience method for tests - fn into_section(self) -> EncodedSection { - Self::build_section(self.section.into_inner(), self.section_encoder, self.adv_builder) + fn into_section(mut self) -> EncodedSection { + let adv_builder_header_byte = self.adv_builder.as_mut().header_byte(); + Self::build_section( + adv_builder_header_byte, + self.section.into_inner(), + self.section_encoder, + ) } }
diff --git a/nearby/presence/np_adv/src/legacy/actions/macros.rs b/nearby/presence/np_adv/src/legacy/actions/macros.rs index 8208a57..db241d6 100644 --- a/nearby/presence/np_adv/src/legacy/actions/macros.rs +++ b/nearby/presence/np_adv/src/legacy/actions/macros.rs
@@ -48,25 +48,6 @@ /// 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);
diff --git a/nearby/presence/np_adv/src/legacy/actions/mod.rs b/nearby/presence/np_adv/src/legacy/actions/mod.rs index 90a0186..e0f4514 100644 --- a/nearby/presence/np_adv/src/legacy/actions/mod.rs +++ b/nearby/presence/np_adv/src/legacy/actions/mod.rs
@@ -439,5 +439,5 @@ 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); +macros::boolean_element!(Finder, 13, plaintext_and_ciphertext); +macros::boolean_element!(FastPairSass, 14, plaintext_and_ciphertext);
diff --git a/nearby/presence/np_adv/src/legacy/actions/tests.rs b/nearby/presence/np_adv/src/legacy/actions/tests.rs index d45d968..6e68211 100644 --- a/nearby/presence/np_adv/src/legacy/actions/tests.rs +++ b/nearby/presence/np_adv/src/legacy/actions/tests.rs
@@ -250,18 +250,6 @@ } #[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 {
diff --git a/nearby/presence/np_adv/src/legacy/random_data_elements.rs b/nearby/presence/np_adv/src/legacy/random_data_elements.rs index 00a2e93..aca906b 100644 --- a/nearby/presence/np_adv/src/legacy/random_data_elements.rs +++ b/nearby/presence/np_adv/src/legacy/random_data_elements.rs
@@ -89,9 +89,8 @@ 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") - } + ActionType::Finder => bits.set_action(Finder::from(true)), + ActionType::FastPairSass => bits.set_action(FastPairSass::from(true)), } }
diff --git a/nearby/presence/np_adv/test.json b/nearby/presence/np_adv/test.json deleted file mode 100644 index 953eebf..0000000 --- a/nearby/presence/np_adv/test.json +++ /dev/null
@@ -1,24122 +0,0 @@ -[ - { - "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_v1.rs b/nearby/presence/np_adv/tests/examples_v1.rs index 6e93a3d..f4df30c 100644 --- a/nearby/presence/np_adv/tests/examples_v1.rs +++ b/nearby/presence/np_adv/tests/examples_v1.rs
@@ -142,12 +142,13 @@ section_builder.add_to_advertisement(); let adv = adv_builder.into_advertisement(); - let discovery_credential = V1DiscoveryCredential::new( + let discovery_credential = V1DiscoveryCredential::new::<CryptoProviderImpl>( 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.0), key_pair.public().to_bytes(), - ); + ) + .expect("Public key bytes are valid points on the curve since theyc ame from the keypair"); let credentials: [MatchableCredential<V1, MetadataMatchedCredential<_>>; 1] = [MatchableCredential { discovery_credential, match_data: encrypted_sender_metadata }];
diff --git a/nearby/presence/np_adv_dynamic/src/extended.rs b/nearby/presence/np_adv_dynamic/src/extended.rs index f961bd6..5e1328c 100644 --- a/nearby/presence/np_adv_dynamic/src/extended.rs +++ b/nearby/presence/np_adv_dynamic/src/extended.rs
@@ -20,11 +20,12 @@ /// An advertisement builder for V1 advertisements where the /// presence/absence of salt is determined at run-time instead of compile-time. pub struct BoxedAdvBuilder { - adv_builder: AdvBuilder, + adv_builder: Box<AdvBuilder>, } impl From<AdvBuilder> for BoxedAdvBuilder { fn from(adv_builder: AdvBuilder) -> Self { + let adv_builder = Box::new(adv_builder); BoxedAdvBuilder { adv_builder } } } @@ -48,14 +49,59 @@ } } -fn wrap_section_builder<'a, C: CryptoProvider, S: Into<BoxedSectionBuilder<'a, C>>>( +fn wrap_owning_section_builder<C: CryptoProvider, S: Into<BoxedSectionBuilder<AdvBuilder, C>>>( + maybe_section_builder: Result<S, (AdvBuilder, AddSectionError)>, +) -> Result<BoxedSectionBuilder<AdvBuilder, C>, (BoxedAdvBuilder, BoxedAddSectionError)> { + match maybe_section_builder { + Ok(section_builder) => Ok(section_builder.into()), + Err((adv_builder, err)) => Err((adv_builder.into(), err.into())), + } +} + +fn wrap_mut_ref_section_builder< + 'a, + C: CryptoProvider, + S: Into<BoxedSectionBuilder<&'a mut AdvBuilder, C>>, +>( maybe_section_builder: Result<S, AddSectionError>, -) -> Result<BoxedSectionBuilder<'a, C>, BoxedAddSectionError> { +) -> Result<BoxedSectionBuilder<&'a mut AdvBuilder, C>, BoxedAddSectionError> { let section_builder = maybe_section_builder?; Ok(section_builder.into()) } impl BoxedAdvBuilder { + /// Gets the current count of sections which have been added + /// to this advertisement builder. Does not count currently- + /// outstanding section builders. + pub fn section_count(&self) -> usize { + self.adv_builder.section_count() + } + + /// Create a section builder using the given identity, + /// taking ownership of this advertisement builder. + /// + /// Unlike `BoxedAdvBuilder#section_builder`, the returned + /// section builder will take ownership of this advertisement + /// builder, if the operation was successful. Otherwise, + /// this advertisement builder will be returned back to the + /// caller unaltered as part of the `Err` arm. + pub fn into_section_builder<C: CryptoProvider>( + self, + identity: BoxedIdentity<C>, + ) -> Result<BoxedSectionBuilder<AdvBuilder, C>, (Self, BoxedAddSectionError)> { + match identity { + BoxedIdentity::PublicIdentity => wrap_owning_section_builder( + self.adv_builder.into_section_builder(PublicSectionEncoder::default()), + ), + BoxedIdentity::MicEncrypted(ident) => { + wrap_owning_section_builder(self.adv_builder.into_section_builder(ident)) + } + BoxedIdentity::SignedEncrypted(ident) => { + wrap_owning_section_builder(self.adv_builder.into_section_builder(ident)) + } + } + } + /// Create a section builder using the given identity. /// /// Returns `Err` if the underlying advertisement builder @@ -66,16 +112,16 @@ pub fn section_builder<C: CryptoProvider>( &mut self, identity: BoxedIdentity<C>, - ) -> Result<BoxedSectionBuilder<C>, BoxedAddSectionError> { + ) -> Result<BoxedSectionBuilder<&mut AdvBuilder, C>, BoxedAddSectionError> { match identity { - BoxedIdentity::PublicIdentity => wrap_section_builder( + BoxedIdentity::PublicIdentity => wrap_mut_ref_section_builder( self.adv_builder.section_builder(PublicSectionEncoder::default()), ), BoxedIdentity::MicEncrypted(ident) => { - wrap_section_builder(self.adv_builder.section_builder(ident)) + wrap_mut_ref_section_builder(self.adv_builder.section_builder(ident)) } BoxedIdentity::SignedEncrypted(ident) => { - wrap_section_builder(self.adv_builder.section_builder(ident)) + wrap_mut_ref_section_builder(self.adv_builder.section_builder(ident)) } } } @@ -99,16 +145,49 @@ /// A `SectionBuilder` whose corresponding Identity /// and salted-ness is given at run-time instead of /// at compile-time. -pub enum BoxedSectionBuilder<'a, C: CryptoProvider> { +pub enum BoxedSectionBuilder<R: AsMut<AdvBuilder>, C: CryptoProvider> { /// A builder for a public section. - Public(SectionBuilder<'a, PublicSectionEncoder>), + Public(Box<SectionBuilder<R, PublicSectionEncoder>>), /// A builder for a MIC-verified section. - MicEncrypted(SectionBuilder<'a, MicEncryptedSectionEncoder<C>>), + MicEncrypted(Box<SectionBuilder<R, MicEncryptedSectionEncoder<C>>>), /// A builder for a signature-verified section. - SignedEncrypted(SectionBuilder<'a, SignedEncryptedSectionEncoder<C>>), + SignedEncrypted(Box<SectionBuilder<R, SignedEncryptedSectionEncoder<C>>>), } -impl<'a, C: CryptoProvider> BoxedSectionBuilder<'a, C> { +impl<C: CryptoProvider> BoxedSectionBuilder<AdvBuilder, C> { + /// Gets the 0-based index of the section currently under construction + /// in the context of the containing advertisement. + pub fn section_index(&self) -> usize { + match self { + BoxedSectionBuilder::Public(x) => x.section_index(), + BoxedSectionBuilder::MicEncrypted(x) => x.section_index(), + BoxedSectionBuilder::SignedEncrypted(x) => x.section_index(), + } + } + /// Add this builder to the advertisement that created it, + /// returning the containing advertisement builder. + pub fn add_to_advertisement(self) -> BoxedAdvBuilder { + let adv_builder = match self { + BoxedSectionBuilder::Public(x) => x.add_to_advertisement(), + BoxedSectionBuilder::MicEncrypted(x) => x.add_to_advertisement(), + BoxedSectionBuilder::SignedEncrypted(x) => x.add_to_advertisement(), + }; + BoxedAdvBuilder::from(adv_builder) + } +} + +impl<'a, C: CryptoProvider> BoxedSectionBuilder<&'a mut AdvBuilder, C> { + /// Add this builder to the advertisement that created it. + pub fn add_to_advertisement(self) { + match self { + BoxedSectionBuilder::Public(x) => x.add_to_advertisement(), + BoxedSectionBuilder::MicEncrypted(x) => x.add_to_advertisement(), + BoxedSectionBuilder::SignedEncrypted(x) => x.add_to_advertisement(), + } + } +} + +impl<R: AsMut<AdvBuilder>, C: CryptoProvider> BoxedSectionBuilder<R, C> { /// Returns true if this wraps a section builder which /// leverages some encrypted identity. pub fn is_encrypted(&self) -> bool { @@ -118,14 +197,20 @@ BoxedSectionBuilder::SignedEncrypted(_) => true, } } - /// Add this builder to the advertisement that created it. - pub fn add_to_advertisement(self) { + /// Gets the derived salt of the next DE to be added to the section, + /// if this section-builder corresponds to an encrypted section. + /// Otherwise, returns nothing. + /// + /// Suitable for scenarios (like FFI) where a closure would be inappropriate + /// for DE construction, and interaction with the client is preferred. + pub fn next_de_salt(&self) -> Option<DeSalt<C>> { match self { - BoxedSectionBuilder::Public(x) => x.add_to_advertisement(), - BoxedSectionBuilder::MicEncrypted(x) => x.add_to_advertisement(), - BoxedSectionBuilder::SignedEncrypted(x) => x.add_to_advertisement(), + BoxedSectionBuilder::Public(_) => None, + BoxedSectionBuilder::MicEncrypted(x) => Some(x.next_de_salt()), + BoxedSectionBuilder::SignedEncrypted(x) => Some(x.next_de_salt()), } } + /// 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, @@ -158,27 +243,27 @@ } } -impl<'a, C: CryptoProvider> From<SectionBuilder<'a, PublicSectionEncoder>> - for BoxedSectionBuilder<'a, C> +impl<R: AsMut<AdvBuilder>, C: CryptoProvider> From<SectionBuilder<R, PublicSectionEncoder>> + for BoxedSectionBuilder<R, C> { - fn from(section_builder: SectionBuilder<'a, PublicSectionEncoder>) -> Self { - BoxedSectionBuilder::Public(section_builder) + fn from(section_builder: SectionBuilder<R, PublicSectionEncoder>) -> Self { + BoxedSectionBuilder::Public(Box::new(section_builder)) } } -impl<'a, C: CryptoProvider> From<SectionBuilder<'a, MicEncryptedSectionEncoder<C>>> - for BoxedSectionBuilder<'a, C> +impl<R: AsMut<AdvBuilder>, C: CryptoProvider> From<SectionBuilder<R, MicEncryptedSectionEncoder<C>>> + for BoxedSectionBuilder<R, C> { - fn from(section_builder: SectionBuilder<'a, MicEncryptedSectionEncoder<C>>) -> Self { - BoxedSectionBuilder::MicEncrypted(section_builder) + fn from(section_builder: SectionBuilder<R, MicEncryptedSectionEncoder<C>>) -> Self { + BoxedSectionBuilder::MicEncrypted(Box::new(section_builder)) } } -impl<'a, C: CryptoProvider> From<SectionBuilder<'a, SignedEncryptedSectionEncoder<C>>> - for BoxedSectionBuilder<'a, C> +impl<R: AsMut<AdvBuilder>, C: CryptoProvider> + From<SectionBuilder<R, SignedEncryptedSectionEncoder<C>>> for BoxedSectionBuilder<R, C> { - fn from(section_builder: SectionBuilder<'a, SignedEncryptedSectionEncoder<C>>) -> Self { - BoxedSectionBuilder::SignedEncrypted(section_builder) + fn from(section_builder: SectionBuilder<R, SignedEncryptedSectionEncoder<C>>) -> Self { + BoxedSectionBuilder::SignedEncrypted(Box::new(section_builder)) } }
diff --git a/nearby/presence/np_adv_dynamic/src/legacy.rs b/nearby/presence/np_adv_dynamic/src/legacy.rs index 191ef75..8ffea16 100644 --- a/nearby/presence/np_adv_dynamic/src/legacy.rs +++ b/nearby/presence/np_adv_dynamic/src/legacy.rs
@@ -284,6 +284,18 @@ Ciphertext(ActionBits<Ciphertext>), } +impl From<ActionBits<Plaintext>> for BoxedActionBits { + fn from(bits: ActionBits<Plaintext>) -> Self { + Self::Plaintext(bits) + } +} + +impl From<ActionBits<Ciphertext>> for BoxedActionBits { + fn from(bits: ActionBits<Ciphertext>) -> Self { + Self::Ciphertext(bits) + } +} + /// Error which is raised when the flavor of a [`BoxedActionBits`] /// does not match the supported flavors of a [`ToBoxedActionElement`] /// upon attempting to add the action to the bit-field. @@ -300,6 +312,24 @@ } } + /// Gets the context-sync sequence number from these boxed action bits. + pub fn get_context_sync_seq_num(&self) -> ContextSyncSeqNum { + match self { + BoxedActionBits::Plaintext(x) => x.context_sync_seq_num(), + BoxedActionBits::Ciphertext(x) => x.context_sync_seq_num(), + } + } + + /// Returns whether a boolean action type is set in these action bits, or `None` + /// if the given action type does not represent a boolean (e.g: a context-sync + /// sequence number). + pub fn has_action(&self, action_type: &ActionType) -> Option<bool> { + match self { + BoxedActionBits::Plaintext(x) => x.has_action(action_type), + BoxedActionBits::Ciphertext(x) => x.has_action(action_type), + } + } + fn set<F: PacketFlavor, E: ToActionElement<F>>( action_bits: &mut ActionBits<F>, to_element: E,
diff --git a/nearby/presence/np_c_ffi/Cargo.lock b/nearby/presence/np_c_ffi/Cargo.lock deleted file mode 100644 index 836d35b..0000000 --- a/nearby/presence/np_c_ffi/Cargo.lock +++ /dev/null
@@ -1,1182 +0,0 @@ -# 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" -version = "0.10.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "831010a0f742e1209b3bcea8fab6a8e149051ba6099432c8cb2cc117dec3ead1" -dependencies = [ - "aead", - "aes", - "cipher", - "ctr", - "ghash", - "subtle", -] - -[[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 = "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", - "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 = "base64ct" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" - -[[package]] -name = "bitflags" -version = "1.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" - -[[package]] -name = "bitflags" -version = "2.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "327762f6e5a765692301e5bb513e0d9fef63be86bbc14528052b1cd3e6f03e07" - -[[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 = "bssl-crypto" -version = "0.1.0" -dependencies = [ - "bssl-sys", -] - -[[package]] -name = "bssl-sys" -version = "0.1.0" - -[[package]] -name = "bytes" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223" - -[[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 = "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 1.3.2", - "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.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28c122c3980598d243d63d9a704629a2d748d101f278052ff068be5a4423ab6f" - -[[package]] -name = "cpufeatures" -version = "0.2.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce420fe07aecd3e67c5f910618fe65e94158f6dcc0adf44e00d69ce2bdfe0fd0" -dependencies = [ - "libc", -] - -[[package]] -name = "crypto-bigint" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "740fe28e594155f10cfc383984cbefd529d7396050557148f79cb0f621204124" -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" -dependencies = [ - "tinyvec", -] - -[[package]] -name = "crypto_provider_boringssl" -version = "0.1.0" -dependencies = [ - "bssl-crypto", - "crypto_provider", -] - -[[package]] -name = "crypto_provider_default" -version = "0.1.0" -dependencies = [ - "cfg-if", - "crypto_provider", - "crypto_provider_boringssl", - "crypto_provider_rustcrypto", -] - -[[package]] -name = "crypto_provider_rustcrypto" -version = "0.1.0" -dependencies = [ - "aead", - "aes", - "aes-gcm", - "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.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e89b8c6a2e4b1f45971ad09761aafb85514a84744b67a95e32c3cc1352d1f65c" -dependencies = [ - "cfg-if", - "cpufeatures", - "curve25519-dalek-derive", - "digest", - "fiat-crypto", - "platforms", - "rustc_version", - "subtle", - "zeroize", -] - -[[package]] -name = "curve25519-dalek-derive" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.38", -] - -[[package]] -name = "der" -version = "0.7.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fffa369a668c8af7dbf8b5e56c9f744fbd399949ed171606040001947de40b1c" -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.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "115531babc129696a58c64a4fef0a8bf9e9698629fb97e9e40767d235cfbcd53" -dependencies = [ - "pkcs8", - "signature", -] - -[[package]] -name = "ed25519-dalek" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7277392b266383ef8396db7fdeb1e77b6c52fed775f5df15bb24f35b72156980" -dependencies = [ - "curve25519-dalek", - "ed25519", - "rand_core", - "serde", - "sha2", - "zeroize", -] - -[[package]] -name = "elliptic-curve" -version = "0.13.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d97ca172ae9dc9f9b779a6e3a65d308f2af74e5b8c921299075bdb4a0370e914" -dependencies = [ - "base16ct", - "crypto-bigint", - "digest", - "ff", - "generic-array", - "group", - "hkdf", - "rand_core", - "sec1", - "subtle", - "zeroize", -] - -[[package]] -name = "errno" -version = "0.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac3e13f66a2f95e32a39eaa81f6b95d42878ca0e1db0c7543723dfe12557e860" -dependencies = [ - "libc", - "windows-sys", -] - -[[package]] -name = "fastrand" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5" - -[[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.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a481586acf778f1b1455424c343f71124b048ffa5f4fc3f8f6ae9dc432dcb3c7" - -[[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 = "ghash" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d930750de5717d2dd0b8c0d42c076c0e884c81a73e6cab859bbd2339c71e3e40" -dependencies = [ - "opaque-debug", - "polyval", -] - -[[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 = [ - "lock_adapter", -] - -[[package]] -name = "hashbrown" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" - -[[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 = "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", -] - -[[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 = "itoa" -version = "1.0.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" - -[[package]] -name = "lazy_static" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" -dependencies = [ - "spin", -] - -[[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.149" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a08173bc88b7955d1b3145aa561539096c421ac8debde8cbc3612ec635fee29b" - -[[package]] -name = "linux-raw-sys" -version = "0.4.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da2479e8c062e40bf0066ffa0bc823de0a9368974af99c9f6df941d2c231e03f" - -[[package]] -name = "lock_adapter" -version = "0.1.0" - -[[package]] -name = "log" -version = "0.4.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" - -[[package]] -name = "memchr" -version = "2.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f665ee40bc4a3c5590afb1e9677db74a508659dfd71e126420da8274909a0167" - -[[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", - "sink", - "strum", - "strum_macros", - "tinyvec", - "xts_aes", -] - -[[package]] -name = "np_c_ffi" -version = "0.1.0" -dependencies = [ - "cbindgen", - "lock_adapter", - "np_ffi_core", -] - -[[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", - "lazy_static", - "ldt_np_adv", - "lock_adapter", - "np_adv", - "np_hkdf", -] - -[[package]] -name = "np_hkdf" -version = "0.1.0" -dependencies = [ - "crypto_provider", - "ldt", - "xts_aes", -] - -[[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.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2355d85b9a3786f481747ced0e0ff2ba35213a1f9bd406ed906554d7af805a1" - -[[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 = "pkcs8" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" -dependencies = [ - "der", - "spki", -] - -[[package]] -name = "platforms" -version = "3.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14e6ab3f592e6fb464fc9712d8d6e6912de6473954635fd76a589d832cffcbb0" - -[[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 = "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.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "134c189feb4956b20f6f547d2cf727d4c0fe06722b20a0eec87ed445a97f92da" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "quote" -version = "1.0.33" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae" -dependencies = [ - "proc-macro2", -] - -[[package]] -name = "rand" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" -dependencies = [ - "libc", - "rand_chacha", - "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.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" -dependencies = [ - "bitflags 1.3.2", -] - -[[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.38.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b426b0506e5d50a7d8dafcf2e81471400deb602392c7dd110815afb4eaf02a3" -dependencies = [ - "bitflags 2.4.1", - "errno", - "libc", - "linux-raw-sys", - "windows-sys", -] - -[[package]] -name = "rustversion" -version = "1.0.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4" - -[[package]] -name = "ryu" -version = "1.0.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741" - -[[package]] -name = "sec1" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" -dependencies = [ - "base16ct", - "der", - "generic-array", - "subtle", - "zeroize", -] - -[[package]] -name = "semver" -version = "1.0.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "836fa6a3e1e547f9a2c4040802ec865b5d85f4014efe00555d7090a3dcaa1090" - -[[package]] -name = "serde" -version = "1.0.190" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91d3c334ca1ee894a2c6f6ad698fe8c435b76d504b13d436f0685d648d6d96f7" -dependencies = [ - "serde_derive", -] - -[[package]] -name = "serde_derive" -version = "1.0.190" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67c5609f394e5c2bd7fc51efda478004ea80ef42fee983d5c67a65e34f32c0e3" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.38", -] - -[[package]] -name = "serde_json" -version = "1.0.108" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d1c7e3eac408d115102c4c24ad393e0821bb3a5df4d506a80f85f7a742a526b" -dependencies = [ - "itoa", - "ryu", - "serde", -] - -[[package]] -name = "sha2" -version = "0.10.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" -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 = "spki" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d1e996ef02c474957d681f1b05213dfb0abab947b446a62d37770b23500184a" -dependencies = [ - "base64ct", - "der", -] - -[[package]] -name = "strsim" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" - -[[package]] -name = "strum" -version = "0.25.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "290d54ea6f91c969195bdbcd7442c8c2a2ba87da8bf60a7ee86a235d4bc1e125" - -[[package]] -name = "strum_macros" -version = "0.25.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23dc1fa9ac9c169a78ba62f0b841814b7abae11bdd047b9c58f893439e309ea0" -dependencies = [ - "heck", - "proc-macro2", - "quote", - "rustversion", - "syn 2.0.38", -] - -[[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.38" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e96b79aaa137db8f61e26363a0c9b47d8b4ec75da28b7d1d614c2303e232408b" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "tempfile" -version = "3.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ef1adac450ad7f4b3c28589471ade84f25f731a7a0fe30d71dfa9f60fd808e5" -dependencies = [ - "cfg-if", - "fastrand", - "redox_syscall", - "rustix", - "windows-sys", -] - -[[package]] -name = "termcolor" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6093bad37da69aab9d123a8091e4be0aa4a03e4d601ec641c327398315f62b64" -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.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" - -[[package]] -name = "unicode-ident" -version = "1.0.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" - -[[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.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f29e6f9198ba0d26b4c9f07dbe6f9ed633e1f3d5b8b414090084349e46a52596" -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.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" -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.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" - -[[package]] -name = "windows_i686_gnu" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" - -[[package]] -name = "windows_i686_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" - -[[package]] -name = "x25519-dalek" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb66477291e7e8d2b0ff1bcb900bf29489a9692816d79874bea351e7a8b6de96" -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 index 86bbd53..991a5e0 100644 --- a/nearby/presence/np_c_ffi/Cargo.toml +++ b/nearby/presence/np_c_ffi/Cargo.toml
@@ -5,11 +5,11 @@ publish = false [dependencies] -np_ffi_core = { path = "../np_ffi_core" } -lock_adapter = {path = "../../util/lock_adapter"} +np_ffi_core.workspace = true +lock_adapter.workspace = true [build-dependencies] -cbindgen = "0.24.5" +cbindgen.workspace = true [features] default = ["rustcrypto"] @@ -18,14 +18,4 @@ [lib] # boringssl and bssl-sys are built as a static lib, so we need to as well -crate-type = ["staticlib"] - -# 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 \ No newline at end of file +crate-type = ["staticlib"] \ No newline at end of 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 index 88483b0..b2967cf 100644 --- a/nearby/presence/np_c_ffi/cbindgen_configs/c_config.toml +++ b/nearby/presence/np_c_ffi/cbindgen_configs/c_config.toml
@@ -19,7 +19,13 @@ See the License for the specific language governing permissions and limitations under the License. */ + +// clang-format off """ +trailer = """ +// clang-format on +""" + pragma_once = true autogen_warning = """ /* @@ -44,7 +50,3 @@ [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 index 5a2ba2a..50de758 100644 --- a/nearby/presence/np_c_ffi/cbindgen_configs/cpp_config.toml +++ b/nearby/presence/np_c_ffi/cbindgen_configs/cpp_config.toml
@@ -16,7 +16,13 @@ See the License for the specific language governing permissions and limitations under the License. */ + +// clang-format off """ +trailer = """ +// clang-format on +""" + pragma_once = true autogen_warning = """ /* @@ -38,7 +44,3 @@ [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/deny.toml b/nearby/presence/np_c_ffi/deny.toml deleted file mode 100644 index ca51e11..0000000 --- a/nearby/presence/np_c_ffi/deny.toml +++ /dev/null
@@ -1,213 +0,0 @@ -# This template contains all of the possible sections and their default values - -# Note that all fields that take a lint level have these possible values: -# * deny - An error will be produced and the check will fail -# * warn - A warning will be produced, but the check will not fail -# * allow - No warning or error will be produced, though in some cases a note -# will be - -# The values provided in this template are the default values that will be used -# when any section or field is not specified in your own configuration - -# If 1 or more target triples (and optionally, target_features) are specified, -# only the specified targets will be checked when running `cargo deny check`. -# This means, if a particular package is only ever used as a target specific -# dependency, such as, for example, the `nix` crate only being used via the -# `target_family = "unix"` configuration, that only having windows targets in -# this list would mean the nix crate, as well as any of its exclusive -# dependencies not shared by any other crates, would be ignored, as the target -# list here is effectively saying which targets you are building for. -targets = [ - # The triple can be any string, but only the target triples built in to - # rustc (as of 1.40) can be checked against actual config expressions - #{ triple = "x86_64-unknown-linux-musl" }, - # You can also specify which target_features you promise are enabled for a - # particular target. target_features are currently not validated against - # the actual valid features supported by the target architecture. - #{ triple = "wasm32-unknown-unknown", features = ["atomics"] }, -] - -# This section is considered when running `cargo deny check advisories` -# More documentation for the advisories section can be found here: -# https://embarkstudios.github.io/cargo-deny/checks/advisories/cfg.html -[advisories] -# The path where the advisory database is cloned/fetched into -db-path = "~/.cargo/advisory-db" -# The url(s) of the advisory databases to use -db-urls = ["https://github.com/rustsec/advisory-db"] -# The lint level for security vulnerabilities -vulnerability = "deny" -# The lint level for unmaintained crates -unmaintained = "warn" -# The lint level for crates that have been yanked from their source registry -yanked = "warn" -# The lint level for crates with security notices. Note that as of -# 2019-12-17 there are no security notice advisories in -# https://github.com/rustsec/advisory-db -notice = "warn" -# A list of advisory IDs to ignore. Note that ignored advisories will still -# output a note when they are encountered. -ignore = [ - #"RUSTSEC-0000-0000", -] -# Threshold for security vulnerabilities, any vulnerability with a CVSS score -# lower than the range specified will be ignored. Note that ignored advisories -# will still output a note when they are encountered. -# * None - CVSS Score 0.0 -# * Low - CVSS Score 0.1 - 3.9 -# * Medium - CVSS Score 4.0 - 6.9 -# * High - CVSS Score 7.0 - 8.9 -# * Critical - CVSS Score 9.0 - 10.0 -#severity-threshold = - -# If this is true, then cargo deny will use the git executable to fetch advisory database. -# If this is false, then it uses a built-in git library. -# Setting this to true can be helpful if you have special authentication requirements that cargo-deny does not support. -# See Git Authentication for more information about setting up git authentication. -#git-fetch-with-cli = true - -# This section is considered when running `cargo deny check licenses` -# More documentation for the licenses section can be found here: -# https://embarkstudios.github.io/cargo-deny/checks/licenses/cfg.html -[licenses] -# The lint level for crates which do not have a detectable license -unlicensed = "deny" -# List of explicitly allowed licenses -# See https://spdx.org/licenses/ for list of possible licenses -# [possible values: any SPDX 3.11 short identifier (+ optional exception)]. -allow = [ - "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 -# [possible values: any SPDX 3.11 short identifier (+ optional exception)]. -deny = [ - #"Nokia", -] -# Lint level for licenses considered copyleft -copyleft = "warn" -# Blanket approval or denial for OSI-approved or FSF Free/Libre licenses -# * both - The license will be approved if it is both OSI-approved *AND* FSF -# * either - The license will be approved if it is either OSI-approved *OR* FSF -# * osi-only - The license will be approved if is OSI-approved *AND NOT* FSF -# * fsf-only - The license will be approved if is FSF *AND NOT* OSI-approved -# * neither - This predicate is ignored and the default lint level is used -allow-osi-fsf-free = "neither" -# Lint level used when no other predicates are matched -# 1. License isn't in the allow or deny lists -# 2. License isn't copyleft -# 3. License isn't OSI/FSF, or allow-osi-fsf-free = "neither" -default = "deny" -# The confidence threshold for detecting a license from license text. -# The higher the value, the more closely the license text must be to the -# canonical license text of a valid SPDX license file. -# [possible values: any between 0.0 and 1.0]. -confidence-threshold = 0.8 -# Allow 1 or more licenses on a per-crate basis, so that particular licenses -# aren't accepted for every possible crate as with the normal allow list -exceptions = [ - # Each entry is the crate and version constraint, and its specific allow - # list - #{ allow = ["Zlib"], name = "adler32", version = "*" }, -] - -# Some crates don't have (easily) machine readable licensing information, -# adding a clarification entry for it allows you to manually specify the -# licensing information -#[[licenses.clarify]] -# The name of the crate the clarification applies to -#name = "ring" -# The optional version constraint for the crate -#version = "*" -# The SPDX expression for the license requirements of the crate -#expression = "MIT AND ISC AND OpenSSL" -# One or more files in the crate's source used as the "source of truth" for -# the license expression. If the contents match, the clarification will be used -# when running the license check, otherwise the clarification will be ignored -# and the crate will be checked normally, which may produce warnings or errors -# depending on the rest of your configuration -#license-files = [ - # Each entry is a crate relative path, and the (opaque) hash of its contents - #{ path = "LICENSE", hash = 0xbd0eed23 } -#] - -[[licenses.clarify]] -name = "ring" -version = "*" -expression = "MIT AND ISC AND OpenSSL" -license-files = [ - # Each entry is a crate relative path, and the (opaque) hash of its contents - { path = "LICENSE", hash = 0xbd0eed23 } -] - -[licenses.private] -# If true, ignores workspace crates that aren't published, or are only -# published to private registries. -# To see how to mark a crate as unpublished (to the official registry), -# visit https://doc.rust-lang.org/cargo/reference/manifest.html#the-publish-field. -ignore = true -# One or more private registries that you might publish crates to, if a crate -# is only published to private registries, and ignore is true, the crate will -# not have its license(s) checked -registries = [ - #"https://sekretz.com/registry -] - -# This section is considered when running `cargo deny check bans`. -# More documentation about the 'bans' section can be found here: -# https://embarkstudios.github.io/cargo-deny/checks/bans/cfg.html -[bans] -# Lint level for when multiple versions of the same crate are detected -multiple-versions = "allow" -# Lint level for when a crate version requirement is `*` -wildcards = "allow" -# The graph highlighting used when creating dotgraphs for crates -# with multiple versions -# * lowest-version - The path to the lowest versioned duplicate is highlighted -# * simplest-path - The path to the version with the fewest edges is highlighted -# * all - Both lowest-version and simplest-path are used -highlight = "all" -# List of crates that are allowed. Use with care! -allow = [ - #{ name = "ansi_term", version = "=0.11.0" }, -] -# List of crates to deny -deny = [ - # Each entry the name of a crate and a version range. If version is - # not specified, all versions will be matched. - #{ name = "ansi_term", version = "=0.11.0" }, - # - # Wrapper crates can optionally be specified to allow the crate when it - # is a direct dependency of the otherwise banned crate - #{ name = "ansi_term", version = "=0.11.0", wrappers = [] }, -] -# Certain crates/versions that will be skipped when doing duplicate detection. -skip = [ - #{ name = "ansi_term", version = "=0.11.0" }, -] -# Similarly to `skip` allows you to skip certain crates during duplicate -# detection. Unlike skip, it also includes the entire tree of transitive -# dependencies starting at the specified crate, up to a certain depth, which is -# by default infinite -skip-tree = [ - #{ name = "ansi_term", version = "=0.11.0", depth = 20 }, -] - -# This section is considered when running `cargo deny check sources`. -# More documentation about the 'sources' section can be found here: -# https://embarkstudios.github.io/cargo-deny/checks/sources/cfg.html -[sources] -# Lint level for what to happen when a crate from a crate registry that is not -# in the allow list is encountered -unknown-registry = "warn" -# Lint level for what to happen when a crate from a git repository that is not -# in the allow list is encountered -unknown-git = "warn" -# List of URLs for allowed crate registries. Defaults to the crates.io index -# if not specified. If it is specified but empty, no registries are allowed. -allow-registry = ["https://github.com/rust-lang/crates.io-index"] -# List of URLs for allowed Git repositories -allow-git = [] \ No newline at end of file
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 index 81914c9..0ff152f 100644 --- a/nearby/presence/np_c_ffi/include/c/np_c_ffi.h +++ b/nearby/presence/np_c_ffi/include/c/np_c_ffi.h
@@ -13,10 +13,12 @@ limitations under the License. */ +// clang-format off + #pragma once -/* Generated with cbindgen:0.24.5 */ +/* Generated with cbindgen:0.26.0 */ /* WARNING: this file is autogenerated by cbindgen. Don't modify this manually. @@ -33,19 +35,130 @@ #include <stdlib.h> /** - * Result type for trying to add a credential to a credential-slab. + * Result type for trying to add a V0 credential to a credential-slab. */ -enum np_ffi_AddCredentialToSlabResult { +enum np_ffi_AddV0CredentialToSlabResult { /** * We succeeded in adding the credential to the slab. */ - NP_FFI_ADD_CREDENTIAL_TO_SLAB_RESULT_SUCCESS = 0, + NP_FFI_ADD_V0_CREDENTIAL_TO_SLAB_RESULT_SUCCESS = 0, /** * The handle to the slab was actually invalid. */ - NP_FFI_ADD_CREDENTIAL_TO_SLAB_RESULT_INVALID_HANDLE = 1, + NP_FFI_ADD_V0_CREDENTIAL_TO_SLAB_RESULT_INVALID_HANDLE = 1, }; -typedef uint8_t np_ffi_AddCredentialToSlabResult; +typedef uint8_t np_ffi_AddV0CredentialToSlabResult; + +/** + * Result code for the operation of adding a DE to a V0 + * advertisement builder. + */ +enum np_ffi_AddV0DEResult { + /** + * The DE was successfully added to the advertisement builder + * behind the given handle. + */ + NP_FFI_ADD_V0DE_RESULT_SUCCESS = 0, + /** + * The handle for the advertisement builder was invalid. + */ + NP_FFI_ADD_V0DE_RESULT_INVALID_ADVERTISEMENT_BUILDER_HANDLE = 1, + /** + * There was not enough available space left in the advertisement + * to append the given data element. + */ + NP_FFI_ADD_V0DE_RESULT_INSUFFICIENT_ADVERTISEMENT_SPACE = 2, + /** + * The passed data element is not broadcastable under the + * identity type of the advertisement (public/private). + */ + NP_FFI_ADD_V0DE_RESULT_INVALID_IDENTITY_TYPE_FOR_DATA_ELEMENT = 3, +}; +typedef uint8_t np_ffi_AddV0DEResult; + +/** + * Result type for trying to add a V1 credential to a credential-slab. + */ +enum np_ffi_AddV1CredentialToSlabResult { + /** + * We succeeded in adding the credential to the slab. + */ + NP_FFI_ADD_V1_CREDENTIAL_TO_SLAB_RESULT_SUCCESS = 0, + /** + * The handle to the slab was actually invalid. + */ + NP_FFI_ADD_V1_CREDENTIAL_TO_SLAB_RESULT_INVALID_HANDLE = 1, + /** + * The provided public key bytes do not actually represent a valid "edwards y" format + * or that said compressed point is not actually a point on the curve. + */ + NP_FFI_ADD_V1_CREDENTIAL_TO_SLAB_RESULT_INVALID_PUBLIC_KEY_BYTES = 2, +}; +typedef uint8_t np_ffi_AddV1CredentialToSlabResult; + +/** + * Result code for operations adding DEs to a section builder. + */ +enum np_ffi_AddV1DEResult { + /** + * The DE was successfully added to the section builder + * behind the given handle. + */ + NP_FFI_ADD_V1DE_RESULT_SUCCESS = 0, + /** + * The handle for the section builder was invalid. + */ + NP_FFI_ADD_V1DE_RESULT_INVALID_SECTION_HANDLE = 1, + /** + * There was no more space left in the advertisement + * to fit the DE in the containing section. + */ + NP_FFI_ADD_V1DE_RESULT_INSUFFICIENT_SECTION_SPACE = 2, + /** + * The data element itself had invalid characteristics, + * most likely a length above 127. + */ + NP_FFI_ADD_V1DE_RESULT_INVALID_DATA_ELEMENT = 3, +}; +typedef uint8_t np_ffi_AddV1DEResult; + +/** + * Result code for [`V1SectionBuilder#add_to_advertisement`]. + */ +enum np_ffi_AddV1SectionToAdvertisementResult { + /** + * The section referenced by the given handle + * couldn't be added to the containing advertisement, + * possibly because the handle is invalid or the section + * has already been added to the containing section. + */ + NP_FFI_ADD_V1_SECTION_TO_ADVERTISEMENT_RESULT_ERROR = 0, + /** + * The section referenced by the given handle + * was successfully added to the containing advertisement. + * After obtaining this result code, the section + * handle will no longer be valid. + */ + NP_FFI_ADD_V1_SECTION_TO_ADVERTISEMENT_RESULT_SUCCESS = 1, +}; +typedef uint8_t np_ffi_AddV1SectionToAdvertisementResult; + +/** + * Enum common to V0 and V1 serialization expressing + * what kind of advertisement builder (public/encrypted) + * is in use. + */ +enum np_ffi_AdvertisementBuilderKind { + /** + * The builder is for a public advertisement. + */ + NP_FFI_ADVERTISEMENT_BUILDER_KIND_PUBLIC = 0, + /** + * The builder is for an encrypted advertisement. + */ + NP_FFI_ADVERTISEMENT_BUILDER_KIND_ENCRYPTED = 1, +}; +typedef uint8_t np_ffi_AdvertisementBuilderKind; /** * The possible boolean action types which can be present in an Actions data element @@ -62,6 +175,40 @@ typedef uint8_t np_ffi_BooleanActionType; /** + * Discriminant for `BuildContextSyncSeqNumResult`. + */ +enum np_ffi_BuildContextSyncSeqNumResultKind { + /** + * The sequence number was outside the allowed + * 0-15 single-nibble range. + */ + NP_FFI_BUILD_CONTEXT_SYNC_SEQ_NUM_RESULT_KIND_OUT_OF_RANGE = 0, + /** + * The sequence number was in range, + * and so a `ContextSyncSeqNum` was constructed. + */ + NP_FFI_BUILD_CONTEXT_SYNC_SEQ_NUM_RESULT_KIND_SUCCESS = 1, +}; +typedef uint8_t np_ffi_BuildContextSyncSeqNumResultKind; + +/** + * Discriminant for `BuildTxPowerResult`. + */ +enum np_ffi_BuildTxPowerResultKind { + /** + * The transmission power was outside the + * allowed -100dBm to 20dBm range. + */ + NP_FFI_BUILD_TX_POWER_RESULT_KIND_OUT_OF_RANGE = 0, + /** + * The transmission power was in range, + * and so a `TxPower` struct was constructed. + */ + NP_FFI_BUILD_TX_POWER_RESULT_KIND_SUCCESS = 1, +}; +typedef uint8_t np_ffi_BuildTxPowerResultKind; + +/** * Discriminant for `CreateCredentialBookResult` */ enum np_ffi_CreateCredentialBookResultKind { @@ -101,6 +248,76 @@ typedef uint8_t np_ffi_CreateCredentialSlabResultKind; /** + * Discriminant for `CreateV0AdvertisementBuilderResult` + */ +enum np_ffi_CreateV0AdvertisementBuilderResultKind { + /** + * The attempt to create a new advertisement builder + * failed since there are no more available + * slots for V0 advertisement builders in their handle-map. + */ + NP_FFI_CREATE_V0_ADVERTISEMENT_BUILDER_RESULT_KIND_NO_SPACE_LEFT = 0, + /** + * The attempt succeeded. The wrapped advertisement builder + * may be obtained via + * `CreateV0AdvertisementBuilderResult#into_success`. + */ + NP_FFI_CREATE_V0_ADVERTISEMENT_BUILDER_RESULT_KIND_SUCCESS = 1, +}; +typedef uint8_t np_ffi_CreateV0AdvertisementBuilderResultKind; + +/** + * Discriminant for `CreateV1AdvertisementBuilderResult` + */ +enum np_ffi_CreateV1AdvertisementBuilderResultKind { + /** + * The attempt to create a new advertisement builder + * failed since there are no more available + * slots for V1 advertisement builders in their handle-map. + */ + NP_FFI_CREATE_V1_ADVERTISEMENT_BUILDER_RESULT_KIND_NO_SPACE_LEFT = 0, + /** + * The attempt succeeded. The wrapped advertisement builder + * may be obtained via + * `CreateV1AdvertisementBuilderResult#into_success`. + */ + NP_FFI_CREATE_V1_ADVERTISEMENT_BUILDER_RESULT_KIND_SUCCESS = 1, +}; +typedef uint8_t np_ffi_CreateV1AdvertisementBuilderResultKind; + +/** + * Discriminant for `CreateV1SectionBuilderResult` + */ +enum np_ffi_CreateV1SectionBuilderResultKind { + /** + * The attempt to create a new section builder succeeded. + */ + NP_FFI_CREATE_V1_SECTION_BUILDER_RESULT_KIND_SUCCESS = 0, + /** + * We're currently in the middle of building a section. + */ + NP_FFI_CREATE_V1_SECTION_BUILDER_RESULT_KIND_UNCLOSED_ACTIVE_SECTION = 1, + /** + * The advertisement builder handle was invalid. + */ + NP_FFI_CREATE_V1_SECTION_BUILDER_RESULT_KIND_INVALID_ADVERTISEMENT_BUILDER_HANDLE = 2, + /** + * We're attempting to build a section with an identity + * kind (public/encrypted) which doesn't match the kind + * for the entire advertisement. + */ + NP_FFI_CREATE_V1_SECTION_BUILDER_RESULT_KIND_IDENTITY_KIND_MISMATCH = 3, + /** + * There isn't enough space for a new section, either + * because the maximum section count has been exceeded + * or because the advertisement is almost full, and + * the minimum size of a section wouldn't fit. + */ + NP_FFI_CREATE_V1_SECTION_BUILDER_RESULT_KIND_NO_SPACE_LEFT = 4, +}; +typedef uint8_t np_ffi_CreateV1SectionBuilderResultKind; + +/** * A result-type enum which tells the caller whether/not a deallocation * succeeded or failed due to the requested handle not being present. */ @@ -116,6 +333,24 @@ } np_ffi_DeallocateResult; /** + * Discriminant for `DecryptMetadataResult`. + */ +enum np_ffi_DecryptMetadataResultKind { + /** + * The attempt to decrypt the metadata of the associated credential succeeded + * The associated payload may be obtained via + * `DecryptMetadataResult#into_success`. + */ + NP_FFI_DECRYPT_METADATA_RESULT_KIND_SUCCESS, + /** + * The attempt to decrypt the metadata failed, either the payload had no matching identity + * ie it was a public advertisement OR the decrypt attempt itself was unsuccessful + */ + NP_FFI_DECRYPT_METADATA_RESULT_KIND_ERROR, +}; +typedef uint8_t np_ffi_DecryptMetadataResultKind; + +/** * Discriminant for `DeserializeAdvertisementResult`. */ enum np_ffi_DeserializeAdvertisementResultKind { @@ -191,6 +426,34 @@ typedef uint8_t np_ffi_DeserializedV1IdentityKind; /** + * The DE type for an encrypted identity + */ +enum np_ffi_EncryptedIdentityType { + /** + * Identity for broadcasts to nearby devices with the same + * logged-in-account (for some account). + */ + NP_FFI_ENCRYPTED_IDENTITY_TYPE_PRIVATE = 1, + /** + * Identity for broadcasts to nearby devices which this + * device has declared to trust. + */ + NP_FFI_ENCRYPTED_IDENTITY_TYPE_TRUSTED = 2, + /** + * Identity for broadcasts to devices which have been provisioned + * offline with this device. + */ + NP_FFI_ENCRYPTED_IDENTITY_TYPE_PROVISIONED = 4, +}; +typedef uint8_t np_ffi_EncryptedIdentityType; + +enum np_ffi_GetMetadataBufferPartsResultKind { + NP_FFI_GET_METADATA_BUFFER_PARTS_RESULT_KIND_SUCCESS = 0, + NP_FFI_GET_METADATA_BUFFER_PARTS_RESULT_KIND_ERROR = 1, +}; +typedef uint8_t np_ffi_GetMetadataBufferPartsResultKind; + +/** * Discriminant of `GetV0DEResult`. */ enum np_ffi_GetV0DEResultKind { @@ -211,6 +474,47 @@ typedef uint8_t np_ffi_GetV0DEResultKind; /** + * Discriminant for `GetV0IdentityDetailsResult` + */ +enum np_ffi_GetV0IdentityDetailsResultKind { + /** + * The attempt to get the identity details + * for the advertisement failed, possibly + * due to the advertisement being a public + * advertisement, or the underlying + * advertisement has already been deallocated. + */ + NP_FFI_GET_V0_IDENTITY_DETAILS_RESULT_KIND_ERROR = 0, + /** + * The attempt to get the identity details succeeded. + * The wrapped identity details may be obtained via + * `GetV0IdentityDetailsResult#into_success`. + */ + NP_FFI_GET_V0_IDENTITY_DETAILS_RESULT_KIND_SUCCESS = 1, +}; +typedef uint8_t np_ffi_GetV0IdentityDetailsResultKind; + +/** + * Discriminant for `GetV1DE16ByteSaltResult`. + */ +enum np_ffi_GetV1DE16ByteSaltResultKind { + /** + * The attempt to get the derived salt failed, possibly + * because the passed DE offset was invalid (==255), + * or because there was no salt included for the + * referenced advertisement section (i.e: it was + * a public advertisement section, or it was deallocated.) + */ + NP_FFI_GET_V1DE16_BYTE_SALT_RESULT_KIND_ERROR = 0, + /** + * A 16-byte salt for the given DE offset was successfully + * derived. + */ + NP_FFI_GET_V1DE16_BYTE_SALT_RESULT_KIND_SUCCESS = 1, +}; +typedef uint8_t np_ffi_GetV1DE16ByteSaltResultKind; + +/** * Discriminant for the `GetV1DEResult` enum. */ enum np_ffi_GetV1DEResultKind { @@ -229,6 +533,27 @@ typedef uint8_t np_ffi_GetV1DEResultKind; /** + * Discriminant for `GetV1IdentityDetailsResult` + */ +enum np_ffi_GetV1IdentityDetailsResultKind { + /** + * The attempt to get the identity details + * for the section failed, possibly + * due to the section being a public + * section, or the underlying + * advertisement has already been deallocated. + */ + NP_FFI_GET_V1_IDENTITY_DETAILS_RESULT_KIND_ERROR = 0, + /** + * The attempt to get the identity details succeeded. + * The wrapped identity details may be obtained via + * `GetV1IdentityDetailsResult#into_success`. + */ + NP_FFI_GET_V1_IDENTITY_DETAILS_RESULT_KIND_SUCCESS = 1, +}; +typedef uint8_t np_ffi_GetV1IdentityDetailsResultKind; + +/** * Discriminant for `GetV1SectionResult` */ enum np_ffi_GetV1SectionResultKind { @@ -249,6 +574,24 @@ typedef uint8_t np_ffi_GetV1SectionResultKind; /** + * Discriminant for `NextV1DE16ByteSaltResult`. + */ +enum np_ffi_NextV1DE16ByteSaltResultKind { + /** + * We couldn't return a 16-byte DE salt, possibly + * because the handle to the section builder + * was invalid, or possibly because the section + * builder was for a public section. + */ + NP_FFI_NEXT_V1DE16_BYTE_SALT_RESULT_KIND_ERROR = 0, + /** + * A 16-byte DE salt was returned successfully. + */ + NP_FFI_NEXT_V1DE16_BYTE_SALT_RESULT_KIND_SUCCESS = 1, +}; +typedef uint8_t np_ffi_NextV1DE16ByteSaltResultKind; + +/** * Structure for categorized reasons for why a NP C FFI call may * be panicking. */ @@ -268,15 +611,80 @@ */ 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. + * Error returned if the bit representation of a supposedly-Rust-constructed + * -and-validated type actually doesn't correspond to the format of the + * data structure expected on the Rust side of the boundary, and performing + * further operations on the structure would yield unintended behavior. + * If this kind of error is being raised, the C code must + * be messing with stack-allocated data structures for this library + * in an entirely unexpected way. */ - NP_FFI_PANIC_REASON_INVALID_ACTION_BITS = 2, + NP_FFI_PANIC_REASON_INVALID_STACK_DATA_STRUCTURE = 2, }; typedef uint8_t np_ffi_PanicReason; /** + * Discriminant for `SerializeV0AdvertisementResult`. + */ +enum np_ffi_SerializeV0AdvertisementResultKind { + /** + * Serializing the advertisement to bytes was successful. + */ + NP_FFI_SERIALIZE_V0_ADVERTISEMENT_RESULT_KIND_SUCCESS = 0, + /** + * Serializing the advertisement to bytes failed + * because the data in the advertisement wasn't + * of an appropriate size for LDT encryption + * to succeed. + */ + NP_FFI_SERIALIZE_V0_ADVERTISEMENT_RESULT_KIND_LDT_ERROR = 1, + /** + * The advertisement builder handle was invalid. + */ + NP_FFI_SERIALIZE_V0_ADVERTISEMENT_RESULT_KIND_INVALID_ADVERTISEMENT_BUILDER_HANDLE = 2, +}; +typedef uint8_t np_ffi_SerializeV0AdvertisementResultKind; + +/** + * Discriminant for `SerializeV1AdvertisementResult`. + */ +enum np_ffi_SerializeV1AdvertisementResultKind { + /** + * Serializing the advertisement to bytes was successful. + */ + NP_FFI_SERIALIZE_V1_ADVERTISEMENT_RESULT_KIND_SUCCESS = 0, + /** + * The state of the advertisement builder was invalid + * for the builder to be closed for serialization, likely + * because there was an unclosed section builder. + */ + NP_FFI_SERIALIZE_V1_ADVERTISEMENT_RESULT_KIND_INVALID_BUILDER_STATE = 1, + /** + * The advertisement builder handle was invalid. + */ + NP_FFI_SERIALIZE_V1_ADVERTISEMENT_RESULT_KIND_INVALID_ADVERTISEMENT_BUILDER_HANDLE = 2, +}; +typedef uint8_t np_ffi_SerializeV1AdvertisementResultKind; + +/** + * Discriminant for `SetV0ActionResult`. + */ +enum np_ffi_SetV0ActionResultKind { + /** + * The attempt to set the action bit failed. The + * action bits were yielded back to the caller, + * unmodified. + */ + NP_FFI_SET_V0_ACTION_RESULT_KIND_ERROR = 0, + /** + * The attempt to set the action bit succeeded. + * The updated action bits were yielded back to the caller. + */ + NP_FFI_SET_V0_ACTION_RESULT_KIND_SUCCESS = 1, +}; +typedef uint8_t np_ffi_SetV0ActionResultKind; + +/** * Discriminant for `V0DataElement`. */ enum np_ffi_V0DataElementKind { @@ -296,7 +704,24 @@ typedef uint8_t np_ffi_V0DataElementKind; /** - *A `#[repr(C)]` handle to a value of type `super::CredentialBookInternals`. + * Information about the verification scheme used + * for verifying the integrity of the contents + * of a decrypted section. + */ +enum np_ffi_V1VerificationMode { + /** + * Message integrity code verification. + */ + NP_FFI_V1_VERIFICATION_MODE_MIC = 0, + /** + * Signature verification. + */ + NP_FFI_V1_VERIFICATION_MODE_SIGNATURE = 1, +}; +typedef uint8_t np_ffi_V1VerificationMode; + +/** + * A `#[repr(C)]` handle to a value of type `CredentialBookInternals` */ typedef struct { uint64_t handle_id; @@ -321,7 +746,7 @@ } np_ffi_CreateCredentialBookResult; /** - *A `#[repr(C)]` handle to a value of type `super::CredentialSlabInternals`. + * A `#[repr(C)]` handle to a value of type `CredentialSlabInternals` */ typedef struct { uint64_t handle_id; @@ -394,7 +819,53 @@ } np_ffi_V1MatchableCredential; /** - *A `#[repr(C)]` handle to a value of type `super::V0PayloadInternals`. + * A `#[repr(C)]` handle to a value of type `DecryptedMetadataInternals` + */ +typedef struct { + uint64_t handle_id; +} np_ffi_DecryptedMetadata; + +/** + * The result of decrypting metadata from either a V0Payload or DeserializedV1Section + */ +typedef enum { + NP_FFI_DECRYPT_METADATA_RESULT_SUCCESS, + NP_FFI_DECRYPT_METADATA_RESULT_ERROR, +} np_ffi_DecryptMetadataResult_Tag; + +typedef struct { + np_ffi_DecryptMetadataResult_Tag tag; + union { + struct { + np_ffi_DecryptedMetadata success; + }; + }; +} np_ffi_DecryptMetadataResult; + +/** + * The pointer and length of the decrypted metadata byte buffer + */ +typedef struct { + const uint8_t *ptr; + uintptr_t len; +} np_ffi_MetadataBufferParts; + +typedef enum { + NP_FFI_GET_METADATA_BUFFER_PARTS_RESULT_SUCCESS, + NP_FFI_GET_METADATA_BUFFER_PARTS_RESULT_ERROR, +} np_ffi_GetMetadataBufferPartsResult_Tag; + +typedef struct { + np_ffi_GetMetadataBufferPartsResult_Tag tag; + union { + struct { + np_ffi_MetadataBufferParts success; + }; + }; +} np_ffi_GetMetadataBufferPartsResult; + +/** + * A `#[repr(C)]` handle to a value of type `V0PayloadInternals` */ typedef struct { uint64_t handle_id; @@ -427,7 +898,7 @@ } np_ffi_DeserializedV0Advertisement; /** - *A `#[repr(C)]` handle to a value of type `super::LegibleV1SectionsInternals`. + * A `#[repr(C)]` handle to a value of type `LegibleV1SectionsInternals` */ typedef struct { uint64_t handle_id; @@ -576,6 +1047,49 @@ } np_ffi_GetV0DEResult; /** + * Information about the identity which matched a + * decrypted V0 advertisement. + */ +typedef struct { + /** + * The identity type (private/provisioned/trusted) + */ + np_ffi_EncryptedIdentityType identity_type; + /** + * The ID of the credential which + * matched the deserialized adv + */ + uint32_t cred_id; + /** + * The 14-byte legacy metadata key + */ + uint8_t metadata_key[14]; + /** + * The 2-byte advertisement salt + */ + uint8_t salt[2]; +} np_ffi_DeserializedV0IdentityDetails; + +/** + * The result of attempting to get the identity details + * for a V0 advertisement via + * `DeserializedV0Advertisement#get_identity_details`. + */ +typedef enum { + NP_FFI_GET_V0_IDENTITY_DETAILS_RESULT_ERROR, + NP_FFI_GET_V0_IDENTITY_DETAILS_RESULT_SUCCESS, +} np_ffi_GetV0IdentityDetailsResult_Tag; + +typedef struct { + np_ffi_GetV0IdentityDetailsResult_Tag tag; + union { + struct { + np_ffi_DeserializedV0IdentityDetails success; + }; + }; +} np_ffi_GetV0IdentityDetailsResult; + +/** * Handle to a deserialized V1 section */ typedef struct { @@ -683,6 +1197,356 @@ } np_ffi_GetV1DEResult; /** + * Information about the identity which matched + * a decrypted V1 section. + */ +typedef struct { + /** + * The identity type (private/provisioned/trusted) + */ + np_ffi_EncryptedIdentityType identity_type; + /** + * The verification mode (MIC/Signature) which + * was used to verify the decrypted adv contents. + */ + np_ffi_V1VerificationMode verification_mode; + /** + * The ID of the credential which + * matched the deserialized section. + */ + uint32_t cred_id; + /** + * The 16-byte metadata key. + */ + uint8_t metadata_key[16]; +} np_ffi_DeserializedV1IdentityDetails; + +/** + * The result of attempting to get the identity details + * for a V1 advertisement section via + * `DeserializedV1Advertisement#get_identity_details`. + */ +typedef enum { + NP_FFI_GET_V1_IDENTITY_DETAILS_RESULT_ERROR, + NP_FFI_GET_V1_IDENTITY_DETAILS_RESULT_SUCCESS, +} np_ffi_GetV1IdentityDetailsResult_Tag; + +typedef struct { + np_ffi_GetV1IdentityDetailsResult_Tag tag; + union { + struct { + np_ffi_DeserializedV1IdentityDetails success; + }; + }; +} np_ffi_GetV1IdentityDetailsResult; + +/** + * A FFI safe wrapper of a fixed size array + */ +typedef struct { + uint8_t _0[16]; +} np_ffi_FixedSizeArray_16; + +/** + * The result of attempting to get a derived 16-byte salt + * for a given DE within a section. + */ +typedef enum { + NP_FFI_GET_V1DE16_BYTE_SALT_RESULT_ERROR, + NP_FFI_GET_V1DE16_BYTE_SALT_RESULT_SUCCESS, +} np_ffi_GetV1DE16ByteSaltResult_Tag; + +typedef struct { + np_ffi_GetV1DE16ByteSaltResult_Tag tag; + union { + struct { + np_ffi_FixedSizeArray_16 success; + }; + }; +} np_ffi_GetV1DE16ByteSaltResult; + +/** + * A `#[repr(C)]` handle to a value of type `V0AdvertisementBuilderInternals` + */ +typedef struct { + uint64_t handle_id; +} np_ffi_V0AdvertisementBuilderHandle; + +/** + * A handle to a builder for V0 advertisements. + */ +typedef struct { + np_ffi_AdvertisementBuilderKind kind; + np_ffi_V0AdvertisementBuilderHandle handle; +} np_ffi_V0AdvertisementBuilder; + +/** + * 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[24]; +} np_ffi_ByteBuffer_24; + +/** + * The result of attempting to serialize the contents + * of a V0 advertisement builder to raw bytes. + */ +typedef enum { + NP_FFI_SERIALIZE_V0_ADVERTISEMENT_RESULT_SUCCESS, + NP_FFI_SERIALIZE_V0_ADVERTISEMENT_RESULT_LDT_ERROR, + NP_FFI_SERIALIZE_V0_ADVERTISEMENT_RESULT_INVALID_ADVERTISEMENT_BUILDER_HANDLE, +} np_ffi_SerializeV0AdvertisementResult_Tag; + +typedef struct { + np_ffi_SerializeV0AdvertisementResult_Tag tag; + union { + struct { + np_ffi_ByteBuffer_24 success; + }; + }; +} np_ffi_SerializeV0AdvertisementResult; + +/** + * The result of attempting to create a new V0 advertisement builder. + */ +typedef enum { + NP_FFI_CREATE_V0_ADVERTISEMENT_BUILDER_RESULT_NO_SPACE_LEFT, + NP_FFI_CREATE_V0_ADVERTISEMENT_BUILDER_RESULT_SUCCESS, +} np_ffi_CreateV0AdvertisementBuilderResult_Tag; + +typedef struct { + np_ffi_CreateV0AdvertisementBuilderResult_Tag tag; + union { + struct { + np_ffi_V0AdvertisementBuilder success; + }; + }; +} np_ffi_CreateV0AdvertisementBuilderResult; + +/** + * Cryptographic information about a particular V0 broadcast credential + * necessary to LDT-encrypt V0 advertisements. + */ +typedef struct { + uint8_t key_seed[32]; + uint8_t metadata_key[14]; +} np_ffi_V0BroadcastCredential; + +/** + * A FFI safe wrapper of a fixed size array + */ +typedef struct { + uint8_t _0[2]; +} np_ffi_FixedSizeArray_2; + +/** + * A `#[repr(C)]` handle to a value of type `V1AdvertisementBuilderInternals` + */ +typedef struct { + uint64_t handle_id; +} np_ffi_V1AdvertisementBuilderHandle; + +/** + * A handle to a builder for V1 advertisements. + */ +typedef struct { + np_ffi_AdvertisementBuilderKind kind; + np_ffi_V1AdvertisementBuilderHandle handle; +} np_ffi_V1AdvertisementBuilder; + +/** + * A handle to a builder for V1 sections. + */ +typedef struct { + np_ffi_V1AdvertisementBuilder adv_builder; + uint8_t section_index; +} np_ffi_V1SectionBuilder; + +/** + * The result of attempting to create a new V1 section builder. + */ +typedef enum { + NP_FFI_CREATE_V1_SECTION_BUILDER_RESULT_SUCCESS, + NP_FFI_CREATE_V1_SECTION_BUILDER_RESULT_UNCLOSED_ACTIVE_SECTION, + NP_FFI_CREATE_V1_SECTION_BUILDER_RESULT_INVALID_ADVERTISEMENT_BUILDER_HANDLE, + NP_FFI_CREATE_V1_SECTION_BUILDER_RESULT_IDENTITY_KIND_MISMATCH, + NP_FFI_CREATE_V1_SECTION_BUILDER_RESULT_NO_SPACE_LEFT, +} np_ffi_CreateV1SectionBuilderResult_Tag; + +typedef struct { + np_ffi_CreateV1SectionBuilderResult_Tag tag; + union { + struct { + np_ffi_V1SectionBuilder success; + }; + }; +} np_ffi_CreateV1SectionBuilderResult; + +/** + * Cryptographic information about a particular V1 broadcast credential + * necessary to encrypt V1 MIC-verified and signature-verified sections. + */ +typedef struct { + uint8_t key_seed[32]; + uint8_t metadata_key[16]; + uint8_t private_key[32]; +} np_ffi_V1BroadcastCredential; + +/** + * 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[250]; +} np_ffi_ByteBuffer_250; + +/** + * The result of attempting to serialize the contents + * of a V1 advertisement builder to raw bytes. + */ +typedef enum { + NP_FFI_SERIALIZE_V1_ADVERTISEMENT_RESULT_SUCCESS, + NP_FFI_SERIALIZE_V1_ADVERTISEMENT_RESULT_INVALID_BUILDER_STATE, + NP_FFI_SERIALIZE_V1_ADVERTISEMENT_RESULT_INVALID_ADVERTISEMENT_BUILDER_HANDLE, +} np_ffi_SerializeV1AdvertisementResult_Tag; + +typedef struct { + np_ffi_SerializeV1AdvertisementResult_Tag tag; + union { + struct { + np_ffi_ByteBuffer_250 success; + }; + }; +} np_ffi_SerializeV1AdvertisementResult; + +/** + * The result of attempting to create a new V1 advertisement builder. + */ +typedef enum { + NP_FFI_CREATE_V1_ADVERTISEMENT_BUILDER_RESULT_NO_SPACE_LEFT, + NP_FFI_CREATE_V1_ADVERTISEMENT_BUILDER_RESULT_SUCCESS, +} np_ffi_CreateV1AdvertisementBuilderResult_Tag; + +typedef struct { + np_ffi_CreateV1AdvertisementBuilderResult_Tag tag; + union { + struct { + np_ffi_V1AdvertisementBuilder success; + }; + }; +} np_ffi_CreateV1AdvertisementBuilderResult; + +/** + * The result of attempting to get the derived V1 DE + * 16-byte salt for the next-added DE to the section + * builder behind the given handle. + */ +typedef enum { + NP_FFI_NEXT_V1DE16_BYTE_SALT_RESULT_ERROR, + NP_FFI_NEXT_V1DE16_BYTE_SALT_RESULT_SUCCESS, +} np_ffi_NextV1DE16ByteSaltResult_Tag; + +typedef struct { + np_ffi_NextV1DE16ByteSaltResult_Tag tag; + union { + struct { + np_ffi_FixedSizeArray_16 success; + }; + }; +} np_ffi_NextV1DE16ByteSaltResult; + +/** + * Represents the contents of a V1 DE whose payload + * is stored in a buffer which may contain up to 127 bytes, + * which is the maximum for any V1 DE. + * + * 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. + */ + uint32_t de_type; + /** + * The raw data-element byte payload, up to + * 127 bytes in length. + */ + np_ffi_ByteBuffer_127 payload; +} np_ffi_V1DE127ByteBuffer; + +/** + * Result type for attempting to construct a + * Tx Power from a signed byte. + */ +typedef enum { + NP_FFI_BUILD_TX_POWER_RESULT_OUT_OF_RANGE, + NP_FFI_BUILD_TX_POWER_RESULT_SUCCESS, +} np_ffi_BuildTxPowerResult_Tag; + +typedef struct { + np_ffi_BuildTxPowerResult_Tag tag; + union { + struct { + np_ffi_TxPower success; + }; + }; +} np_ffi_BuildTxPowerResult; + +/** + * The result of attempting to set a particular action + * bit on some `V0Actions`. + */ +typedef enum { + NP_FFI_SET_V0_ACTION_RESULT_SUCCESS, + NP_FFI_SET_V0_ACTION_RESULT_ERROR, +} np_ffi_SetV0ActionResult_Tag; + +typedef struct { + np_ffi_SetV0ActionResult_Tag tag; + union { + struct { + np_ffi_V0Actions success; + }; + struct { + np_ffi_V0Actions error; + }; + }; +} np_ffi_SetV0ActionResult; + +/** + * Representation of a context-sync sequence number. + */ +typedef struct { + uint8_t value; +} np_ffi_ContextSyncSeqNum; + +/** + * Result type for attempting to construct a + * ContextSyncSeqNum from an unsigned byte. + */ +typedef enum { + NP_FFI_BUILD_CONTEXT_SYNC_SEQ_NUM_RESULT_OUT_OF_RANGE, + NP_FFI_BUILD_CONTEXT_SYNC_SEQ_NUM_RESULT_SUCCESS, +} np_ffi_BuildContextSyncSeqNumResult_Tag; + +typedef struct { + np_ffi_BuildContextSyncSeqNumResult_Tag tag; + union { + struct { + np_ffi_ContextSyncSeqNum success; + }; + }; +} np_ffi_BuildContextSyncSeqNumResult; + +/** * 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` @@ -789,6 +1653,40 @@ void np_ffi_global_config_set_max_num_deserialized_v1_advertisements(uint32_t max_num_deserialized_v1_advertisements); /** + * Sets the maximum number of active handles to v0 advertisement + * builders 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 V0 advertisement builder. + */ +void np_ffi_global_config_set_max_num_v0_advertisement_builders(uint32_t max_num_v0_advertisement_builders); + +/** + * Sets the maximum number of active handles to v1 advertisement + * builders 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 V1 advertisement builder. + */ +void np_ffi_global_config_set_max_num_v1_advertisement_builders(uint32_t max_num_v1_advertisement_builders); + +/** * Allocates a new credential-book from the given slab, returning a handle * to the created object. The slab will be deallocated by this call. */ @@ -839,8 +1737,8 @@ * which contains the correct len amount of bytes. The copy from the memory address isn't atomic, * so concurrent modification of the array from another thread would cause undefined behavior. */ -np_ffi_AddCredentialToSlabResult np_ffi_CredentialSlab_add_v0_credential(np_ffi_CredentialSlab credential_slab, - np_ffi_V0MatchableCredential v0_cred); +np_ffi_AddV0CredentialToSlabResult np_ffi_CredentialSlab_add_v0_credential(np_ffi_CredentialSlab credential_slab, + np_ffi_V0MatchableCredential v0_cred); /** * Adds the given V1 discovery credential with some associated @@ -850,8 +1748,44 @@ * which contains the correct len amount of bytes. The copy from the memory address isn't atomic, * so concurrent modification of the array from another thread would cause undefined behavior. */ -np_ffi_AddCredentialToSlabResult np_ffi_CredentialSlab_add_v1_credential(np_ffi_CredentialSlab credential_slab, - np_ffi_V1MatchableCredential v1_cred); +np_ffi_AddV1CredentialToSlabResult np_ffi_CredentialSlab_add_v1_credential(np_ffi_CredentialSlab credential_slab, + np_ffi_V1MatchableCredential v1_cred); + +/** + * Frees the underlying resources of the decrypted metadata buffer + */ +np_ffi_DeallocateResult np_ffi_deallocate_DecryptedMetadata(np_ffi_DecryptedMetadata metadata); + +/** + * Gets the tag of a `DecryptMetadataResult` tagged-union. On success the wrapped identity + * details may be obtained via `DecryptMetadataResult#into_success`. + */ +np_ffi_DecryptMetadataResultKind np_ffi_DecryptMetadataResult_kind(np_ffi_DecryptMetadataResult result); + +/** + * Casts a `DecryptMetadataResult` to the `Success` variant, panicking in the + * case where the passed value is of a different enum variant. + */ +np_ffi_DecryptedMetadata np_ffi_DecryptMetadataResult_into_SUCCESS(np_ffi_DecryptMetadataResult result); + +/** + * Gets the pointer and length of the heap allocated byte buffer of decrypted metadata + */ +np_ffi_GetMetadataBufferPartsResult np_ffi_DecryptedMetadata_get_metadata_buffer_parts(np_ffi_DecryptedMetadata metadata); + +/** + * Gets the tag of a `GetMetadataBufferPartsResult` tagged-union. On success the wrapped identity + * details may be obtained via `GetMetadataBufferPartsResult#into_success`. + */ +np_ffi_GetMetadataBufferPartsResultKind np_ffi_GetMetadataBufferPartsResult_kind(np_ffi_GetMetadataBufferPartsResult result); + +/** + * Casts a `GetMetadataBufferPartsResult` to the `Success` variant, panicking in the + * case where the passed value is of a different enum variant. This returns the pointer and length + * of the byte buffer containing the decrypted metadata. There can be a data-race between attempts + * to access the contents of the buffer and attempts to free the handle from different threads. + */ +np_ffi_MetadataBufferParts np_ffi_GetMetadataBufferPartsResult_into_SUCCESS(np_ffi_GetMetadataBufferPartsResult result); /** * Attempts to deserialize an advertisement with the given service-data @@ -933,6 +1867,29 @@ np_ffi_GetV0DEResult np_ffi_V0Payload_get_de(np_ffi_V0Payload payload, uint8_t index); /** + * Attempts to decrypt the metadata for the matched credential for this V0 payload (if any) + */ +np_ffi_DecryptMetadataResult np_ffi_V0Payload_decrypt_metadata(np_ffi_V0Payload payload); + +/** + * Gets the identity details for this V0 payload, or returns an error if this payload does not have + * any associated identity (public advertisement) + */ +np_ffi_GetV0IdentityDetailsResult np_ffi_V0Payload_get_identity_details(np_ffi_V0Payload payload); + +/** + * Gets the tag of a `GetV0IdentityDetailsResult` tagged-union. On success the wrapped identity + * details may be obtained via `GetV0IdentityDetailsResult#into_success`. + */ +np_ffi_GetV0IdentityDetailsResultKind np_ffi_GetV0IdentityDetailsResult_kind(np_ffi_GetV0IdentityDetailsResult result); + +/** + * Casts a `GetV0IdentityDetailsResult` to the `Success` variant, panicking in the + * case where the passed value is of a different enum variant. + */ +np_ffi_DeserializedV0IdentityDetails np_ffi_GetV0IdentityDetailsResult_into_SUCCESS(np_ffi_GetV0IdentityDetailsResult result); + +/** * Deallocates any internal data of a `V0Payload` */ np_ffi_DeallocateResult np_ffi_deallocate_v0_payload(np_ffi_V0Payload payload); @@ -949,38 +1906,6 @@ 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`. @@ -1029,17 +1954,362 @@ uint8_t de_index); /** + * Gets the identity details used to decrypt this V1 section, or returns an error if this payload + * does not have any associated identity (public advertisement) + */ +np_ffi_GetV1IdentityDetailsResult np_ffi_DeserializedV1Section_get_identity_details(np_ffi_DeserializedV1Section section); + +/** + * Gets the tag of a `GetV1IdentityDetailsResult` tagged-union. On success the wrapped identity + * details may be obtained via `GetV0IdentityDetailsResult#into_success`. + */ +np_ffi_GetV1IdentityDetailsResultKind np_ffi_GetV1IdentityDetailsResult_kind(np_ffi_GetV1IdentityDetailsResult result); + +/** + * Casts a `GetV1IdentityDetailsResult` to the `Success` variant, panicking in the + * case where the passed value is of a different enum variant. + */ +np_ffi_DeserializedV1IdentityDetails np_ffi_GetV1IdentityDetailsResult_into_SUCCESS(np_ffi_GetV1IdentityDetailsResult result); + +/** + * Attempts to decrypt the metadata for the matched credential for this V0 payload (if any) + */ +np_ffi_DecryptMetadataResult np_ffi_DeserializedV1Section_decrypt_metadata(np_ffi_DeserializedV1Section section); + +/** + * Attempts to derive a 16-byte DE salt for a DE in this section with the given DE offset. This + * operation may fail if the passed offset is 255 (causes overflow) or if the section + * is leveraging a public identity, and hence, doesn't have an associated salt. + */ +np_ffi_GetV1DE16ByteSaltResult np_ffi_DeserializedV1Section_derive_16_byte_salt_for_offset(np_ffi_DeserializedV1Section section, + uint8_t offset); + +/** + * Gets the tag of a `GetV1DE16ByteSaltResult` tagged-union. On success the wrapped identity + * details may be obtained via `GetV1DE16ByteSaltResult#into_success`. + */ +np_ffi_GetV1DE16ByteSaltResultKind np_ffi_GetV1DE16ByteSaltResult_kind(np_ffi_GetV1DE16ByteSaltResult result); + +/** + * Casts a `GetV1DE16ByteSaltResult` to the `Success` variant, panicking in the + * case where the passed value is of a different enum variant. + */ +np_ffi_FixedSizeArray_16 np_ffi_GetV1DE16ByteSaltResult_into_SUCCESS(np_ffi_GetV1DE16ByteSaltResult result); + +/** * 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 + * Casts a `GetV1DEResult` to the `Success` variant, 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); /** + * Attempts to add the given data element to the V0 + * advertisement builder behind the passed handle. + * + * This method may invoke the panic handler if the passed DE + * has an invalid layout, which may indicate that the backing + * data on the stack was somehow tampered with in an unintended way. + */ +np_ffi_AddV0DEResult np_ffi_V0AdvertisementBuilder_add_de(np_ffi_V0AdvertisementBuilder adv_builder, + np_ffi_V0DataElement de); + +/** + * Attempts to serialize the contents of the advertisement builder + * behind this handle to bytes. Assuming that the handle is valid, + * this operation will always result in the contents behind the + * advertisement builder handle being deallocated. + */ +np_ffi_SerializeV0AdvertisementResult np_ffi_V0AdvertisementBuilder_into_advertisement(np_ffi_V0AdvertisementBuilder adv_builder); + +/** + * Attempts to deallocate the v0 advertisement builder behind + * the given handle. + */ +np_ffi_DeallocateResult np_ffi_deallocate_v0_advertisement_builder(np_ffi_V0AdvertisementBuilder adv_builder); + +/** + * Gets the tag of a `CreateV0AdvertisementBuilderResult` tagged-union. + */ +np_ffi_CreateV0AdvertisementBuilderResultKind np_ffi_CreateV0AdvertisementBuilderResult_kind(np_ffi_CreateV0AdvertisementBuilderResult result); + +/** + * Casts a `CreateV0AdvertisementBuilderResult` to the `Success` variant, + * panicking in the case where the passed value is of a different enum variant. + */ +np_ffi_V0AdvertisementBuilder np_ffi_CreateV0AdvertisementBuilderResult_into_SUCCESS(np_ffi_CreateV0AdvertisementBuilderResult result); + +/** + * Creates a new V0 advertisement builder for a public advertisement. + */ +np_ffi_CreateV0AdvertisementBuilderResult np_ffi_create_v0_public_advertisement_builder(void); + +/** + * Creates a new V0 advertisement builder for an encrypted advertisement. + */ +np_ffi_CreateV0AdvertisementBuilderResult np_ffi_create_v0_encrypted_advertisement_builder(np_ffi_V0BroadcastCredential broadcast_cred, + np_ffi_EncryptedIdentityType identity_type, + np_ffi_FixedSizeArray_2 salt); + +/** + * Gets the tag of a `SerializeV0AdvertisementResult` tagged-union. + */ +np_ffi_SerializeV0AdvertisementResultKind np_ffi_SerializeV0AdvertisementResult_kind(np_ffi_SerializeV0AdvertisementResult result); + +/** + * Casts a `SerializeV0AdvertisementResult` to the `Success` variant, + * panicking in the case where the passed value is of a different enum variant. + */ +np_ffi_ByteBuffer_24 np_ffi_SerializeV0AdvertisementResult_into_SUCCESS(np_ffi_SerializeV0AdvertisementResult result); + +/** + * Attempts to create a builder for a new public section within + * the advertisement builder behind this handle, + * returning a handle to the newly-created section builder if successful. + * + * This method may fail if there is another currently-active + * section builder for the same advertisement builder, if the + * kind of section being added does not match the advertisement + * type (public/encrypted), or if the section would not manage + * to fit within the enclosing advertisement. + */ +np_ffi_CreateV1SectionBuilderResult np_ffi_V1AdvertisementBuilder_public_section_builder(np_ffi_V1AdvertisementBuilder adv_builder); + +/** + * Attempts to create a builder for a new encrypted section within + * the advertisement builder behind the given handle, + * returning a handle to the newly-created section builder if successful. + * + * The identity details for the new section builder may be specified + * via providing the broadcast credential data, the kind of encrypted + * identity being broadcast (private/trusted/provisioned), and the + * verification mode (MIC/Signature) to be used for the encrypted section. + * + * This method may fail if there is another currently-active + * section builder for the same advertisement builder, if the + * kind of section being added does not match the advertisement + * type (public/encrypted), or if the section would not manage + * to fit within the enclosing advertisement. + */ +np_ffi_CreateV1SectionBuilderResult np_ffi_V1AdvertisementBuilder_encrypted_section_builder(np_ffi_V1AdvertisementBuilder adv_builder, + np_ffi_V1BroadcastCredential broadcast_cred, + np_ffi_EncryptedIdentityType identity_type, + np_ffi_V1VerificationMode verification_mode); + +/** + * Attempts to serialize the contents of the advertisement builder + * behind this handle to bytes. Assuming that the handle is valid, + * this operation will always result in the contents behind the + * advertisement builder handle being deallocated. + */ +np_ffi_SerializeV1AdvertisementResult np_ffi_V1AdvertisementBuilder_into_advertisement(np_ffi_V1AdvertisementBuilder adv_builder); + +/** + * Gets the tag of a `CreateV1AdvertisementBuilderResult` tagged-union. + */ +np_ffi_CreateV1AdvertisementBuilderResultKind np_ffi_CreateV1AdvertisementBuilderResult_kind(np_ffi_CreateV1AdvertisementBuilderResult result); + +/** + * Casts a `CreateV1AdvertisementBuilderResult` to the `Success` variant, + * panicking in the case where the passed value is of a different enum variant. + */ +np_ffi_V1AdvertisementBuilder np_ffi_CreateV1AdvertisementBuilderResult_into_SUCCESS(np_ffi_CreateV1AdvertisementBuilderResult result); + +/** + * Creates a new V1 advertisement builder for the given advertisement + * kind (public/encrypted). + */ +np_ffi_CreateV1AdvertisementBuilderResult np_ffi_create_v1_advertisement_builder(np_ffi_AdvertisementBuilderKind kind); + +/** + * Gets the tag of a `SerializeV1AdvertisementResult` tagged-union. + */ +np_ffi_SerializeV1AdvertisementResultKind np_ffi_SerializeV1AdvertisementResult_kind(np_ffi_SerializeV1AdvertisementResult result); + +/** + * Casts a `SerializeV1AdvertisementResult` to the `Success` variant, + * panicking in the case where the passed value is of a different enum variant. + */ +np_ffi_ByteBuffer_250 np_ffi_SerializeV1AdvertisementResult_into_SUCCESS(np_ffi_SerializeV1AdvertisementResult result); + +/** + * Gets the tag of a `CreateV1SectionBuilderResult` tagged-union. + */ +np_ffi_CreateV1SectionBuilderResultKind np_ffi_CreateV1SectionBuilderResult_kind(np_ffi_CreateV1SectionBuilderResult result); + +/** + * Casts a `CreateV1SectionBuilderResult` to the `Success` variant, + * panicking in the case where the passed value is of a different enum variant. + */ +np_ffi_V1SectionBuilder np_ffi_CreateV1SectionBuilderResult_into_SUCCESS(np_ffi_CreateV1SectionBuilderResult result); + +/** + * Gets the tag of a `NextV1DE16ByteSaltResult` tagged-union. + */ +np_ffi_NextV1DE16ByteSaltResultKind np_ffi_NextV1DE16ByteSaltResult_kind(np_ffi_NextV1DE16ByteSaltResult result); + +/** + * Casts a `NextV1DE16ByteSaltResult` to the `Success` variant, + * panicking in the case where the passed value is of a different enum variant. + */ +np_ffi_FixedSizeArray_16 np_ffi_NextV1DE16ByteSaltResult_into_SUCCESS(np_ffi_NextV1DE16ByteSaltResult result); + +/** + * Adds the section constructed behind the given handle to + * a section builder to the containing advertisement it originated from. + * After this call, the section builder handle will become invalid. + */ +np_ffi_AddV1SectionToAdvertisementResult np_ffi_V1SectionBuilder_add_to_advertisement(np_ffi_V1SectionBuilder section_builder); + +/** + * Attempts to get the derived 16-byte V1 DE salt for the next + * DE to be added to the passed section builder. May fail if this + * section builder handle is invalid, or if the section + * is a public section. + */ +np_ffi_NextV1DE16ByteSaltResult np_ffi_V1SectionBuilder_next_de_salt(np_ffi_V1SectionBuilder section_builder); + +/** + * Attempts to add the given DE to the section builder behind + * this handle. The passed DE may have a payload of up to 127 + * bytes, the maximum for a V1 DE. + */ +np_ffi_AddV1DEResult np_ffi_V1SectionBuilder_add_127_byte_buffer_de(np_ffi_V1SectionBuilder section_builder, + np_ffi_V1DE127ByteBuffer de); + +/** + * 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); + +/** + * Upcasts a Tx power DE to a generic V0 data-element. + */ +np_ffi_V0DataElement np_ffi_TxPower_into_V0DataElement(np_ffi_TxPower tx_power); + +/** + * 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); + +/** + * Upcasts a V0 actions DE to a generic V0 data-element. + */ +np_ffi_V0DataElement np_ffi_V0Actions_into_V0DataElement(np_ffi_V0Actions actions); + +/** + * Gets the tag of a `BuildTxPowerResult` tagged-union. + */ +np_ffi_BuildTxPowerResultKind np_ffi_BuildTxPowerResult_kind(np_ffi_BuildTxPowerResult result); + +/** + * Casts a `BuildTxPowerResult` to the `Success` variant, panicking in the + * case where the passed value is of a different enum variant. + */ +np_ffi_TxPower np_ffi_BuildTxPowerResult_into_SUCCESS(np_ffi_BuildTxPowerResult result); + +/** + * Attempts to construct a new TxPower from + * the given signed-byte value. + */ +np_ffi_BuildTxPowerResult np_ffi_TxPower_build_from_signed_byte(int8_t tx_power); + +/** + * Gets the value of the given TxPower as a signed byte. + */ +int8_t np_ffi_TxPower_as_signed_byte(np_ffi_TxPower tx_power); + +/** + * Gets the discriminant of the `SetV0ActionResult` tagged-union. + */ +np_ffi_SetV0ActionResultKind np_ffi_SetV0ActionResult_kind(np_ffi_SetV0ActionResult result); + +/** + * Attempts to cast a `SetV0ActionResult` tagged-union into the `Success` variant. + */ +np_ffi_V0Actions np_ffi_SetV0ActionResult_into_SUCCESS(np_ffi_SetV0ActionResult result); + +/** + * Attempts to cast a `SetV0ActionResult` tagged-union into the `Error` variant. + */ +np_ffi_V0Actions np_ffi_SetV0ActionResult_into_ERROR(np_ffi_SetV0ActionResult result); + +/** + * Constructs a new V0 actions DE with no declared boolean + * actions and a zeroed context sync sequence number, + * where the DE is intended for the given advertisement + * kind (plaintext/encrypted). + */ +np_ffi_V0Actions np_ffi_build_new_zeroed_V0Actions(np_ffi_AdvertisementBuilderKind kind); + +/** + * 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 + */ +np_ffi_ContextSyncSeqNum np_ffi_V0Actions_get_context_sync_sequence_number(np_ffi_V0Actions actions); + +/** + * Attempts to set the given action bit to the given boolean value. + * This operation may fail if the requested action bit may not be + * set for the kind of containing advertisement (public/encrypted) + * that this action DE is intended to belong to. In this case, + * the original action bits will be yielded back to the caller, + * unaltered. + */ +np_ffi_SetV0ActionResult np_ffi_V0Actions_set_action(np_ffi_V0Actions actions, + np_ffi_BooleanActionType action_type, + bool value); + +/** + * Sets the context sequence number for the given Actions DE. + */ +np_ffi_V0Actions np_ffi_V0Actions_set_context_sync_sequence_number(np_ffi_V0Actions actions, + np_ffi_ContextSyncSeqNum value); + +/** + * Returns the representation of the passed `V0Actions` as an unsigned + * integer, where the bit-positions correspond to individual actions. + */ +uint32_t np_ffi_V0Actions_as_u32(np_ffi_V0Actions actions); + +/** + * Gets the tag of a `BuildContextSyncSeqNumResult` tagged-union. + */ +np_ffi_BuildContextSyncSeqNumResultKind np_ffi_BuildContextSyncSeqNumResult_kind(np_ffi_BuildContextSyncSeqNumResult result); + +/** + * Casts a `BuildContextSyncSeqNumResult` to the `Success` variant, panicking in the + * case where the passed value is of a different enum variant. + */ +np_ffi_ContextSyncSeqNum np_ffi_BuildContextSyncSeqNumResult_into_SUCCESS(np_ffi_BuildContextSyncSeqNumResult result); + +/** + * Attempts to build a new context sync sequence number + * from the given unsigned byte. + */ +np_ffi_BuildContextSyncSeqNumResult np_ffi_ContextSyncSeqNum_build_from_unsigned_byte(uint8_t value); + +/** + * Gets the value of the given context-sync sequence number as an unsigned byte. + */ +uint8_t np_ffi_ContextSyncSeqNum_as_unsigned_byte(np_ffi_ContextSyncSeqNum seq_num); + +/** * Converts a `V1DataElement` to a `GenericV1DataElement` which * only maintains information about the DE's type-code and payload. */ @@ -1050,3 +2320,5 @@ * an unsigned 32-bit integer. */ uint32_t np_ffi_V1DEType_to_uint32_t(np_ffi_V1DEType de_type); + +// clang-format on
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 index ad3ec24..51322d3 100644 --- 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
@@ -13,10 +13,12 @@ limitations under the License. */ +// clang-format off + #pragma once -/* Generated with cbindgen:0.24.5 */ +/* Generated with cbindgen:0.26.0 */ /* WARNING: this file is autogenerated by cbindgen. Don't modify this manually. @@ -133,6 +135,36 @@ /// 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); +/// Sets the maximum number of active handles to v0 advertisement +/// builders 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 V0 advertisement builder. +void np_ffi_global_config_set_max_num_v0_advertisement_builders(uint32_t max_num_v0_advertisement_builders); + +/// Sets the maximum number of active handles to v1 advertisement +/// builders 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 V1 advertisement builder. +void np_ffi_global_config_set_max_num_v1_advertisement_builders(uint32_t max_num_v1_advertisement_builders); + /// Allocates a new credential-book from the given slab, returning a handle /// to the created object. The slab will be deallocated by this call. CreateCredentialBookResult np_ffi_create_credential_book_from_slab(CredentialSlab slab); @@ -166,8 +198,8 @@ /// Safety: this is safe if the provided pointer points to a valid memory address /// which contains the correct len amount of bytes. The copy from the memory address isn't atomic, /// so concurrent modification of the array from another thread would cause undefined behavior. -AddCredentialToSlabResult np_ffi_CredentialSlab_add_v0_credential(CredentialSlab credential_slab, - V0MatchableCredential v0_cred); +AddV0CredentialToSlabResult np_ffi_CredentialSlab_add_v0_credential(CredentialSlab credential_slab, + V0MatchableCredential v0_cred); /// Adds the given V1 discovery credential with some associated /// match-data to this credential slab. @@ -175,8 +207,32 @@ /// Safety: this is safe if the provided pointer points to a valid memory address /// which contains the correct len amount of bytes. The copy from the memory address isn't atomic, /// so concurrent modification of the array from another thread would cause undefined behavior. -AddCredentialToSlabResult np_ffi_CredentialSlab_add_v1_credential(CredentialSlab credential_slab, - V1MatchableCredential v1_cred); +AddV1CredentialToSlabResult np_ffi_CredentialSlab_add_v1_credential(CredentialSlab credential_slab, + V1MatchableCredential v1_cred); + +/// Frees the underlying resources of the decrypted metadata buffer +DeallocateResult np_ffi_deallocate_DecryptedMetadata(DecryptedMetadata metadata); + +/// Gets the tag of a `DecryptMetadataResult` tagged-union. On success the wrapped identity +/// details may be obtained via `DecryptMetadataResult#into_success`. +DecryptMetadataResultKind np_ffi_DecryptMetadataResult_kind(DecryptMetadataResult result); + +/// Casts a `DecryptMetadataResult` to the `Success` variant, panicking in the +/// case where the passed value is of a different enum variant. +DecryptedMetadata np_ffi_DecryptMetadataResult_into_SUCCESS(DecryptMetadataResult result); + +/// Gets the pointer and length of the heap allocated byte buffer of decrypted metadata +GetMetadataBufferPartsResult np_ffi_DecryptedMetadata_get_metadata_buffer_parts(DecryptedMetadata metadata); + +/// Gets the tag of a `GetMetadataBufferPartsResult` tagged-union. On success the wrapped identity +/// details may be obtained via `GetMetadataBufferPartsResult#into_success`. +GetMetadataBufferPartsResultKind np_ffi_GetMetadataBufferPartsResult_kind(GetMetadataBufferPartsResult result); + +/// Casts a `GetMetadataBufferPartsResult` to the `Success` variant, panicking in the +/// case where the passed value is of a different enum variant. This returns the pointer and length +/// of the byte buffer containing the decrypted metadata. There can be a data-race between attempts +/// to access the contents of the buffer and attempts to free the handle from different threads. +MetadataBufferParts np_ffi_GetMetadataBufferPartsResult_into_SUCCESS(GetMetadataBufferPartsResult result); /// Attempts to deserialize an advertisement with the given service-data /// payload (presumed to be under the NP service UUID) using credentials @@ -229,6 +285,21 @@ /// 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); +/// Attempts to decrypt the metadata for the matched credential for this V0 payload (if any) +DecryptMetadataResult np_ffi_V0Payload_decrypt_metadata(V0Payload payload); + +/// Gets the identity details for this V0 payload, or returns an error if this payload does not have +/// any associated identity (public advertisement) +GetV0IdentityDetailsResult np_ffi_V0Payload_get_identity_details(V0Payload payload); + +/// Gets the tag of a `GetV0IdentityDetailsResult` tagged-union. On success the wrapped identity +/// details may be obtained via `GetV0IdentityDetailsResult#into_success`. +GetV0IdentityDetailsResultKind np_ffi_GetV0IdentityDetailsResult_kind(GetV0IdentityDetailsResult result); + +/// Casts a `GetV0IdentityDetailsResult` to the `Success` variant, panicking in the +/// case where the passed value is of a different enum variant. +DeserializedV0IdentityDetails np_ffi_GetV0IdentityDetailsResult_into_SUCCESS(GetV0IdentityDetailsResult result); + /// Deallocates any internal data of a `V0Payload` DeallocateResult np_ffi_deallocate_v0_payload(V0Payload payload); @@ -239,26 +310,6 @@ /// 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`. @@ -290,13 +341,252 @@ /// 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 identity details used to decrypt this V1 section, or returns an error if this payload +/// does not have any associated identity (public advertisement) +GetV1IdentityDetailsResult np_ffi_DeserializedV1Section_get_identity_details(DeserializedV1Section section); + +/// Gets the tag of a `GetV1IdentityDetailsResult` tagged-union. On success the wrapped identity +/// details may be obtained via `GetV0IdentityDetailsResult#into_success`. +GetV1IdentityDetailsResultKind np_ffi_GetV1IdentityDetailsResult_kind(GetV1IdentityDetailsResult result); + +/// Casts a `GetV1IdentityDetailsResult` to the `Success` variant, panicking in the +/// case where the passed value is of a different enum variant. +DeserializedV1IdentityDetails np_ffi_GetV1IdentityDetailsResult_into_SUCCESS(GetV1IdentityDetailsResult result); + +/// Attempts to decrypt the metadata for the matched credential for this V0 payload (if any) +DecryptMetadataResult np_ffi_DeserializedV1Section_decrypt_metadata(DeserializedV1Section section); + +/// Attempts to derive a 16-byte DE salt for a DE in this section with the given DE offset. This +/// operation may fail if the passed offset is 255 (causes overflow) or if the section +/// is leveraging a public identity, and hence, doesn't have an associated salt. +GetV1DE16ByteSaltResult np_ffi_DeserializedV1Section_derive_16_byte_salt_for_offset(DeserializedV1Section section, + uint8_t offset); + +/// Gets the tag of a `GetV1DE16ByteSaltResult` tagged-union. On success the wrapped identity +/// details may be obtained via `GetV1DE16ByteSaltResult#into_success`. +GetV1DE16ByteSaltResultKind np_ffi_GetV1DE16ByteSaltResult_kind(GetV1DE16ByteSaltResult result); + +/// Casts a `GetV1DE16ByteSaltResult` to the `Success` variant, panicking in the +/// case where the passed value is of a different enum variant. +FixedSizeArray<16> np_ffi_GetV1DE16ByteSaltResult_into_SUCCESS(GetV1DE16ByteSaltResult result); + /// 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 +/// Casts a `GetV1DEResult` to the `Success` variant, panicking in the /// case where the passed value is of a different enum variant. V1DataElement np_ffi_GetV1DEResult_into_SUCCESS(GetV1DEResult result); +/// Attempts to add the given data element to the V0 +/// advertisement builder behind the passed handle. +/// +/// This method may invoke the panic handler if the passed DE +/// has an invalid layout, which may indicate that the backing +/// data on the stack was somehow tampered with in an unintended way. +AddV0DEResult np_ffi_V0AdvertisementBuilder_add_de(V0AdvertisementBuilder adv_builder, + V0DataElement de); + +/// Attempts to serialize the contents of the advertisement builder +/// behind this handle to bytes. Assuming that the handle is valid, +/// this operation will always result in the contents behind the +/// advertisement builder handle being deallocated. +SerializeV0AdvertisementResult np_ffi_V0AdvertisementBuilder_into_advertisement(V0AdvertisementBuilder adv_builder); + +/// Attempts to deallocate the v0 advertisement builder behind +/// the given handle. +DeallocateResult np_ffi_deallocate_v0_advertisement_builder(V0AdvertisementBuilder adv_builder); + +/// Gets the tag of a `CreateV0AdvertisementBuilderResult` tagged-union. +CreateV0AdvertisementBuilderResultKind np_ffi_CreateV0AdvertisementBuilderResult_kind(CreateV0AdvertisementBuilderResult result); + +/// Casts a `CreateV0AdvertisementBuilderResult` to the `Success` variant, +/// panicking in the case where the passed value is of a different enum variant. +V0AdvertisementBuilder np_ffi_CreateV0AdvertisementBuilderResult_into_SUCCESS(CreateV0AdvertisementBuilderResult result); + +/// Creates a new V0 advertisement builder for a public advertisement. +CreateV0AdvertisementBuilderResult np_ffi_create_v0_public_advertisement_builder(); + +/// Creates a new V0 advertisement builder for an encrypted advertisement. +CreateV0AdvertisementBuilderResult np_ffi_create_v0_encrypted_advertisement_builder(V0BroadcastCredential broadcast_cred, + EncryptedIdentityType identity_type, + FixedSizeArray<2> salt); + +/// Gets the tag of a `SerializeV0AdvertisementResult` tagged-union. +SerializeV0AdvertisementResultKind np_ffi_SerializeV0AdvertisementResult_kind(SerializeV0AdvertisementResult result); + +/// Casts a `SerializeV0AdvertisementResult` to the `Success` variant, +/// panicking in the case where the passed value is of a different enum variant. +ByteBuffer<24> np_ffi_SerializeV0AdvertisementResult_into_SUCCESS(SerializeV0AdvertisementResult result); + +/// Attempts to create a builder for a new public section within +/// the advertisement builder behind this handle, +/// returning a handle to the newly-created section builder if successful. +/// +/// This method may fail if there is another currently-active +/// section builder for the same advertisement builder, if the +/// kind of section being added does not match the advertisement +/// type (public/encrypted), or if the section would not manage +/// to fit within the enclosing advertisement. +CreateV1SectionBuilderResult np_ffi_V1AdvertisementBuilder_public_section_builder(V1AdvertisementBuilder adv_builder); + +/// Attempts to create a builder for a new encrypted section within +/// the advertisement builder behind the given handle, +/// returning a handle to the newly-created section builder if successful. +/// +/// The identity details for the new section builder may be specified +/// via providing the broadcast credential data, the kind of encrypted +/// identity being broadcast (private/trusted/provisioned), and the +/// verification mode (MIC/Signature) to be used for the encrypted section. +/// +/// This method may fail if there is another currently-active +/// section builder for the same advertisement builder, if the +/// kind of section being added does not match the advertisement +/// type (public/encrypted), or if the section would not manage +/// to fit within the enclosing advertisement. +CreateV1SectionBuilderResult np_ffi_V1AdvertisementBuilder_encrypted_section_builder(V1AdvertisementBuilder adv_builder, + V1BroadcastCredential broadcast_cred, + EncryptedIdentityType identity_type, + V1VerificationMode verification_mode); + +/// Attempts to serialize the contents of the advertisement builder +/// behind this handle to bytes. Assuming that the handle is valid, +/// this operation will always result in the contents behind the +/// advertisement builder handle being deallocated. +SerializeV1AdvertisementResult np_ffi_V1AdvertisementBuilder_into_advertisement(V1AdvertisementBuilder adv_builder); + +/// Gets the tag of a `CreateV1AdvertisementBuilderResult` tagged-union. +CreateV1AdvertisementBuilderResultKind np_ffi_CreateV1AdvertisementBuilderResult_kind(CreateV1AdvertisementBuilderResult result); + +/// Casts a `CreateV1AdvertisementBuilderResult` to the `Success` variant, +/// panicking in the case where the passed value is of a different enum variant. +V1AdvertisementBuilder np_ffi_CreateV1AdvertisementBuilderResult_into_SUCCESS(CreateV1AdvertisementBuilderResult result); + +/// Creates a new V1 advertisement builder for the given advertisement +/// kind (public/encrypted). +CreateV1AdvertisementBuilderResult np_ffi_create_v1_advertisement_builder(AdvertisementBuilderKind kind); + +/// Gets the tag of a `SerializeV1AdvertisementResult` tagged-union. +SerializeV1AdvertisementResultKind np_ffi_SerializeV1AdvertisementResult_kind(SerializeV1AdvertisementResult result); + +/// Casts a `SerializeV1AdvertisementResult` to the `Success` variant, +/// panicking in the case where the passed value is of a different enum variant. +ByteBuffer<250> np_ffi_SerializeV1AdvertisementResult_into_SUCCESS(SerializeV1AdvertisementResult result); + +/// Gets the tag of a `CreateV1SectionBuilderResult` tagged-union. +CreateV1SectionBuilderResultKind np_ffi_CreateV1SectionBuilderResult_kind(CreateV1SectionBuilderResult result); + +/// Casts a `CreateV1SectionBuilderResult` to the `Success` variant, +/// panicking in the case where the passed value is of a different enum variant. +V1SectionBuilder np_ffi_CreateV1SectionBuilderResult_into_SUCCESS(CreateV1SectionBuilderResult result); + +/// Gets the tag of a `NextV1DE16ByteSaltResult` tagged-union. +NextV1DE16ByteSaltResultKind np_ffi_NextV1DE16ByteSaltResult_kind(NextV1DE16ByteSaltResult result); + +/// Casts a `NextV1DE16ByteSaltResult` to the `Success` variant, +/// panicking in the case where the passed value is of a different enum variant. +FixedSizeArray<16> np_ffi_NextV1DE16ByteSaltResult_into_SUCCESS(NextV1DE16ByteSaltResult result); + +/// Adds the section constructed behind the given handle to +/// a section builder to the containing advertisement it originated from. +/// After this call, the section builder handle will become invalid. +AddV1SectionToAdvertisementResult np_ffi_V1SectionBuilder_add_to_advertisement(V1SectionBuilder section_builder); + +/// Attempts to get the derived 16-byte V1 DE salt for the next +/// DE to be added to the passed section builder. May fail if this +/// section builder handle is invalid, or if the section +/// is a public section. +NextV1DE16ByteSaltResult np_ffi_V1SectionBuilder_next_de_salt(V1SectionBuilder section_builder); + +/// Attempts to add the given DE to the section builder behind +/// this handle. The passed DE may have a payload of up to 127 +/// bytes, the maximum for a V1 DE. +AddV1DEResult np_ffi_V1SectionBuilder_add_127_byte_buffer_de(V1SectionBuilder section_builder, + V1DE127ByteBuffer de); + +/// 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); + +/// Upcasts a Tx power DE to a generic V0 data-element. +V0DataElement np_ffi_TxPower_into_V0DataElement(TxPower tx_power); + +/// 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); + +/// Upcasts a V0 actions DE to a generic V0 data-element. +V0DataElement np_ffi_V0Actions_into_V0DataElement(V0Actions actions); + +/// Gets the tag of a `BuildTxPowerResult` tagged-union. +BuildTxPowerResultKind np_ffi_BuildTxPowerResult_kind(BuildTxPowerResult result); + +/// Casts a `BuildTxPowerResult` to the `Success` variant, panicking in the +/// case where the passed value is of a different enum variant. +TxPower np_ffi_BuildTxPowerResult_into_SUCCESS(BuildTxPowerResult result); + +/// Attempts to construct a new TxPower from +/// the given signed-byte value. +BuildTxPowerResult np_ffi_TxPower_build_from_signed_byte(int8_t tx_power); + +/// Gets the value of the given TxPower as a signed byte. +int8_t np_ffi_TxPower_as_signed_byte(TxPower tx_power); + +/// Gets the discriminant of the `SetV0ActionResult` tagged-union. +SetV0ActionResultKind np_ffi_SetV0ActionResult_kind(SetV0ActionResult result); + +/// Attempts to cast a `SetV0ActionResult` tagged-union into the `Success` variant. +V0Actions np_ffi_SetV0ActionResult_into_SUCCESS(SetV0ActionResult result); + +/// Attempts to cast a `SetV0ActionResult` tagged-union into the `Error` variant. +V0Actions np_ffi_SetV0ActionResult_into_ERROR(SetV0ActionResult result); + +/// Constructs a new V0 actions DE with no declared boolean +/// actions and a zeroed context sync sequence number, +/// where the DE is intended for the given advertisement +/// kind (plaintext/encrypted). +V0Actions np_ffi_build_new_zeroed_V0Actions(AdvertisementBuilderKind kind); + +/// 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 +ContextSyncSeqNum np_ffi_V0Actions_get_context_sync_sequence_number(V0Actions actions); + +/// Attempts to set the given action bit to the given boolean value. +/// This operation may fail if the requested action bit may not be +/// set for the kind of containing advertisement (public/encrypted) +/// that this action DE is intended to belong to. In this case, +/// the original action bits will be yielded back to the caller, +/// unaltered. +SetV0ActionResult np_ffi_V0Actions_set_action(V0Actions actions, + BooleanActionType action_type, + bool value); + +/// Sets the context sequence number for the given Actions DE. +V0Actions np_ffi_V0Actions_set_context_sync_sequence_number(V0Actions actions, + ContextSyncSeqNum value); + +/// Returns the representation of the passed `V0Actions` as an unsigned +/// integer, where the bit-positions correspond to individual actions. +uint32_t np_ffi_V0Actions_as_u32(V0Actions actions); + +/// Gets the tag of a `BuildContextSyncSeqNumResult` tagged-union. +BuildContextSyncSeqNumResultKind np_ffi_BuildContextSyncSeqNumResult_kind(BuildContextSyncSeqNumResult result); + +/// Casts a `BuildContextSyncSeqNumResult` to the `Success` variant, panicking in the +/// case where the passed value is of a different enum variant. +ContextSyncSeqNum np_ffi_BuildContextSyncSeqNumResult_into_SUCCESS(BuildContextSyncSeqNumResult result); + +/// Attempts to build a new context sync sequence number +/// from the given unsigned byte. +BuildContextSyncSeqNumResult np_ffi_ContextSyncSeqNum_build_from_unsigned_byte(uint8_t value); + +/// Gets the value of the given context-sync sequence number as an unsigned byte. +uint8_t np_ffi_ContextSyncSeqNum_as_unsigned_byte(ContextSyncSeqNum seq_num); + /// 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); @@ -309,3 +599,5 @@ } // namespace internal } // namespace np_ffi + +// clang-format on
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 index d39bb70..5e4e5a2 100644 --- 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
@@ -13,10 +13,12 @@ limitations under the License. */ +// clang-format off + #pragma once -/* Generated with cbindgen:0.24.5 */ +/* Generated with cbindgen:0.26.0 */ /* WARNING: this file is autogenerated by cbindgen. Don't modify this manually. @@ -36,14 +38,80 @@ namespace np_ffi { namespace internal { -/// Result type for trying to add a credential to a credential-slab. -enum class AddCredentialToSlabResult : uint8_t { +/// Result type for trying to add a V0 credential to a credential-slab. +enum class AddV0CredentialToSlabResult : uint8_t { /// We succeeded in adding the credential to the slab. Success = 0, /// The handle to the slab was actually invalid. InvalidHandle = 1, }; +/// Result code for the operation of adding a DE to a V0 +/// advertisement builder. +enum class AddV0DEResult : uint8_t { + /// The DE was successfully added to the advertisement builder + /// behind the given handle. + Success = 0, + /// The handle for the advertisement builder was invalid. + InvalidAdvertisementBuilderHandle = 1, + /// There was not enough available space left in the advertisement + /// to append the given data element. + InsufficientAdvertisementSpace = 2, + /// The passed data element is not broadcastable under the + /// identity type of the advertisement (public/private). + InvalidIdentityTypeForDataElement = 3, +}; + +/// Result type for trying to add a V1 credential to a credential-slab. +enum class AddV1CredentialToSlabResult : uint8_t { + /// We succeeded in adding the credential to the slab. + Success = 0, + /// The handle to the slab was actually invalid. + InvalidHandle = 1, + /// The provided public key bytes do not actually represent a valid "edwards y" format + /// or that said compressed point is not actually a point on the curve. + InvalidPublicKeyBytes = 2, +}; + +/// Result code for operations adding DEs to a section builder. +enum class AddV1DEResult : uint8_t { + /// The DE was successfully added to the section builder + /// behind the given handle. + Success = 0, + /// The handle for the section builder was invalid. + InvalidSectionHandle = 1, + /// There was no more space left in the advertisement + /// to fit the DE in the containing section. + InsufficientSectionSpace = 2, + /// The data element itself had invalid characteristics, + /// most likely a length above 127. + InvalidDataElement = 3, +}; + +/// Result code for [`V1SectionBuilder#add_to_advertisement`]. +enum class AddV1SectionToAdvertisementResult : uint8_t { + /// The section referenced by the given handle + /// couldn't be added to the containing advertisement, + /// possibly because the handle is invalid or the section + /// has already been added to the containing section. + Error = 0, + /// The section referenced by the given handle + /// was successfully added to the containing advertisement. + /// After obtaining this result code, the section + /// handle will no longer be valid. + Success = 1, +}; + +/// Enum common to V0 and V1 serialization expressing +/// what kind of advertisement builder (public/encrypted) +/// is in use. +enum class AdvertisementBuilderKind : uint8_t { + /// The builder is for a public advertisement. + Public = 0, + /// The builder is for an encrypted advertisement. + Encrypted = 1, +}; + /// The possible boolean action types which can be present in an Actions data element enum class BooleanActionType : uint8_t { ActiveUnlock = 8, @@ -55,6 +123,26 @@ FastPairSass = 14, }; +/// Discriminant for `BuildContextSyncSeqNumResult`. +enum class BuildContextSyncSeqNumResultKind : uint8_t { + /// The sequence number was outside the allowed + /// 0-15 single-nibble range. + OutOfRange = 0, + /// The sequence number was in range, + /// and so a `ContextSyncSeqNum` was constructed. + Success = 1, +}; + +/// Discriminant for `BuildTxPowerResult`. +enum class BuildTxPowerResultKind : uint8_t { + /// The transmission power was outside the + /// allowed -100dBm to 20dBm range. + OutOfRange = 0, + /// The transmission power was in range, + /// and so a `TxPower` struct was constructed. + Success = 1, +}; + /// Discriminant for `CreateCredentialBookResult` enum class CreateCredentialBookResultKind : uint8_t { /// We created a new credential book behind the given handle. @@ -78,6 +166,49 @@ Success = 1, }; +/// Discriminant for `CreateV0AdvertisementBuilderResult` +enum class CreateV0AdvertisementBuilderResultKind : uint8_t { + /// The attempt to create a new advertisement builder + /// failed since there are no more available + /// slots for V0 advertisement builders in their handle-map. + NoSpaceLeft = 0, + /// The attempt succeeded. The wrapped advertisement builder + /// may be obtained via + /// `CreateV0AdvertisementBuilderResult#into_success`. + Success = 1, +}; + +/// Discriminant for `CreateV1AdvertisementBuilderResult` +enum class CreateV1AdvertisementBuilderResultKind : uint8_t { + /// The attempt to create a new advertisement builder + /// failed since there are no more available + /// slots for V1 advertisement builders in their handle-map. + NoSpaceLeft = 0, + /// The attempt succeeded. The wrapped advertisement builder + /// may be obtained via + /// `CreateV1AdvertisementBuilderResult#into_success`. + Success = 1, +}; + +/// Discriminant for `CreateV1SectionBuilderResult` +enum class CreateV1SectionBuilderResultKind : uint8_t { + /// The attempt to create a new section builder succeeded. + Success = 0, + /// We're currently in the middle of building a section. + UnclosedActiveSection = 1, + /// The advertisement builder handle was invalid. + InvalidAdvertisementBuilderHandle = 2, + /// We're attempting to build a section with an identity + /// kind (public/encrypted) which doesn't match the kind + /// for the entire advertisement. + IdentityKindMismatch = 3, + /// There isn't enough space for a new section, either + /// because the maximum section count has been exceeded + /// or because the advertisement is almost full, and + /// the minimum size of a section wouldn't fit. + NoSpaceLeft = 4, +}; + /// 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 { @@ -87,6 +218,17 @@ Success = 1, }; +/// Discriminant for `DecryptMetadataResult`. +enum class DecryptMetadataResultKind : uint8_t { + /// The attempt to decrypt the metadata of the associated credential succeeded + /// The associated payload may be obtained via + /// `DecryptMetadataResult#into_success`. + Success, + /// The attempt to decrypt the metadata failed, either the payload had no matching identity + /// ie it was a public advertisement OR the decrypt attempt itself was unsuccessful + Error, +}; + /// Discriminant for `DeserializeAdvertisementResult`. enum class DeserializeAdvertisementResultKind : uint8_t { /// Deserializing the advertisement failed, for some reason or another. @@ -132,6 +274,24 @@ Decrypted = 1, }; +/// The DE type for an encrypted identity +enum class EncryptedIdentityType : uint8_t { + /// Identity for broadcasts to nearby devices with the same + /// logged-in-account (for some account). + Private = 1, + /// Identity for broadcasts to nearby devices which this + /// device has declared to trust. + Trusted = 2, + /// Identity for broadcasts to devices which have been provisioned + /// offline with this device. + Provisioned = 4, +}; + +enum class GetMetadataBufferPartsResultKind : uint8_t { + Success = 0, + Error = 1, +}; + /// Discriminant of `GetV0DEResult`. enum class GetV0DEResultKind : uint8_t { /// The attempt to get the DE succeeded. @@ -145,6 +305,33 @@ Error = 1, }; +/// Discriminant for `GetV0IdentityDetailsResult` +enum class GetV0IdentityDetailsResultKind : uint8_t { + /// The attempt to get the identity details + /// for the advertisement failed, possibly + /// due to the advertisement being a public + /// advertisement, or the underlying + /// advertisement has already been deallocated. + Error = 0, + /// The attempt to get the identity details succeeded. + /// The wrapped identity details may be obtained via + /// `GetV0IdentityDetailsResult#into_success`. + Success = 1, +}; + +/// Discriminant for `GetV1DE16ByteSaltResult`. +enum class GetV1DE16ByteSaltResultKind : uint8_t { + /// The attempt to get the derived salt failed, possibly + /// because the passed DE offset was invalid (==255), + /// or because there was no salt included for the + /// referenced advertisement section (i.e: it was + /// a public advertisement section, or it was deallocated.) + Error = 0, + /// A 16-byte salt for the given DE offset was successfully + /// derived. + Success = 1, +}; + /// Discriminant for the `GetV1DEResult` enum. enum class GetV1DEResultKind : uint8_t { /// Attempting to get the DE at the given position failed, @@ -156,6 +343,20 @@ Success = 1, }; +/// Discriminant for `GetV1IdentityDetailsResult` +enum class GetV1IdentityDetailsResultKind : uint8_t { + /// The attempt to get the identity details + /// for the section failed, possibly + /// due to the section being a public + /// section, or the underlying + /// advertisement has already been deallocated. + Error = 0, + /// The attempt to get the identity details succeeded. + /// The wrapped identity details may be obtained via + /// `GetV1IdentityDetailsResult#into_success`. + Success = 1, +}; + /// Discriminant for `GetV1SectionResult` enum class GetV1SectionResultKind : uint8_t { /// The attempt to get the section failed, @@ -169,6 +370,17 @@ Success = 1, }; +/// Discriminant for `NextV1DE16ByteSaltResult`. +enum class NextV1DE16ByteSaltResultKind : uint8_t { + /// We couldn't return a 16-byte DE salt, possibly + /// because the handle to the section builder + /// was invalid, or possibly because the section + /// builder was for a public section. + Error = 0, + /// A 16-byte DE salt was returned successfully. + Success = 1, +}; + /// Structure for categorized reasons for why a NP C FFI call may /// be panicking. enum class PanicReason : uint8_t { @@ -182,10 +394,50 @@ /// 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, + /// Error returned if the bit representation of a supposedly-Rust-constructed + /// -and-validated type actually doesn't correspond to the format of the + /// data structure expected on the Rust side of the boundary, and performing + /// further operations on the structure would yield unintended behavior. + /// If this kind of error is being raised, the C code must + /// be messing with stack-allocated data structures for this library + /// in an entirely unexpected way. + InvalidStackDataStructure = 2, +}; + +/// Discriminant for `SerializeV0AdvertisementResult`. +enum class SerializeV0AdvertisementResultKind : uint8_t { + /// Serializing the advertisement to bytes was successful. + Success = 0, + /// Serializing the advertisement to bytes failed + /// because the data in the advertisement wasn't + /// of an appropriate size for LDT encryption + /// to succeed. + LdtError = 1, + /// The advertisement builder handle was invalid. + InvalidAdvertisementBuilderHandle = 2, +}; + +/// Discriminant for `SerializeV1AdvertisementResult`. +enum class SerializeV1AdvertisementResultKind : uint8_t { + /// Serializing the advertisement to bytes was successful. + Success = 0, + /// The state of the advertisement builder was invalid + /// for the builder to be closed for serialization, likely + /// because there was an unclosed section builder. + InvalidBuilderState = 1, + /// The advertisement builder handle was invalid. + InvalidAdvertisementBuilderHandle = 2, +}; + +/// Discriminant for `SetV0ActionResult`. +enum class SetV0ActionResultKind : uint8_t { + /// The attempt to set the action bit failed. The + /// action bits were yielded back to the caller, + /// unmodified. + Error = 0, + /// The attempt to set the action bit succeeded. + /// The updated action bits were yielded back to the caller. + Success = 1, }; /// Discriminant for `V0DataElement`. @@ -200,7 +452,17 @@ Actions = 1, }; -///A `#[repr(C)]` handle to a value of type `super::CredentialBookInternals`. +/// Information about the verification scheme used +/// for verifying the integrity of the contents +/// of a decrypted section. +enum class V1VerificationMode : uint8_t { + /// Message integrity code verification. + Mic = 0, + /// Signature verification. + Signature = 1, +}; + +/// A `#[repr(C)]` handle to a value of type `CredentialBookInternals` struct CredentialBook { uint64_t handle_id; }; @@ -224,7 +486,7 @@ Success_Body success; }; -///A `#[repr(C)]` handle to a value of type `super::CredentialSlabInternals`. +/// A `#[repr(C)]` handle to a value of type `CredentialSlabInternals` struct CredentialSlab { uint64_t handle_id; }; @@ -285,7 +547,51 @@ FfiMatchedCredential matched_cred; }; -///A `#[repr(C)]` handle to a value of type `super::V0PayloadInternals`. +/// A `#[repr(C)]` handle to a value of type `DecryptedMetadataInternals` +struct DecryptedMetadata { + uint64_t handle_id; +}; + +/// The result of decrypting metadata from either a V0Payload or DeserializedV1Section +struct DecryptMetadataResult { + enum class Tag { + Success, + Error, + }; + + struct Success_Body { + DecryptedMetadata _0; + }; + + Tag tag; + union { + Success_Body success; + }; +}; + +/// The pointer and length of the decrypted metadata byte buffer +struct MetadataBufferParts { + const uint8_t *ptr; + uintptr_t len; +}; + +struct GetMetadataBufferPartsResult { + enum class Tag { + Success, + Error, + }; + + struct Success_Body { + MetadataBufferParts _0; + }; + + Tag tag; + union { + Success_Body success; + }; +}; + +/// A `#[repr(C)]` handle to a value of type `V0PayloadInternals` struct V0Payload { uint64_t handle_id; }; @@ -314,7 +620,7 @@ }; }; -///A `#[repr(C)]` handle to a value of type `super::LegibleV1SectionsInternals`. +/// A `#[repr(C)]` handle to a value of type `LegibleV1SectionsInternals` struct LegibleV1Sections { uint64_t handle_id; }; @@ -449,6 +755,39 @@ }; }; +/// Information about the identity which matched a +/// decrypted V0 advertisement. +struct DeserializedV0IdentityDetails { + /// The identity type (private/provisioned/trusted) + EncryptedIdentityType identity_type; + /// The ID of the credential which + /// matched the deserialized adv + uint32_t cred_id; + /// The 14-byte legacy metadata key + uint8_t metadata_key[14]; + /// The 2-byte advertisement salt + uint8_t salt[2]; +}; + +/// The result of attempting to get the identity details +/// for a V0 advertisement via +/// `DeserializedV0Advertisement#get_identity_details`. +struct GetV0IdentityDetailsResult { + enum class Tag { + Error, + Success, + }; + + struct Success_Body { + DeserializedV0IdentityDetails _0; + }; + + Tag tag; + union { + Success_Body success; + }; +}; + /// Handle to a deserialized V1 section struct DeserializedV1Section { LegibleV1Sections legible_sections_handle; @@ -531,5 +870,297 @@ }; }; +/// Information about the identity which matched +/// a decrypted V1 section. +struct DeserializedV1IdentityDetails { + /// The identity type (private/provisioned/trusted) + EncryptedIdentityType identity_type; + /// The verification mode (MIC/Signature) which + /// was used to verify the decrypted adv contents. + V1VerificationMode verification_mode; + /// The ID of the credential which + /// matched the deserialized section. + uint32_t cred_id; + /// The 16-byte metadata key. + uint8_t metadata_key[16]; +}; + +/// The result of attempting to get the identity details +/// for a V1 advertisement section via +/// `DeserializedV1Advertisement#get_identity_details`. +struct GetV1IdentityDetailsResult { + enum class Tag { + Error, + Success, + }; + + struct Success_Body { + DeserializedV1IdentityDetails _0; + }; + + Tag tag; + union { + Success_Body success; + }; +}; + +/// A FFI safe wrapper of a fixed size array +template<uintptr_t N> +struct FixedSizeArray { + uint8_t _0[N]; +}; + +/// The result of attempting to get a derived 16-byte salt +/// for a given DE within a section. +struct GetV1DE16ByteSaltResult { + enum class Tag { + Error, + Success, + }; + + struct Success_Body { + FixedSizeArray<16> _0; + }; + + Tag tag; + union { + Success_Body success; + }; +}; + +/// A `#[repr(C)]` handle to a value of type `V0AdvertisementBuilderInternals` +struct V0AdvertisementBuilderHandle { + uint64_t handle_id; +}; + +/// A handle to a builder for V0 advertisements. +struct V0AdvertisementBuilder { + AdvertisementBuilderKind kind; + V0AdvertisementBuilderHandle handle; +}; + +/// The result of attempting to serialize the contents +/// of a V0 advertisement builder to raw bytes. +struct SerializeV0AdvertisementResult { + enum class Tag { + Success, + LdtError, + InvalidAdvertisementBuilderHandle, + }; + + struct Success_Body { + ByteBuffer<24> _0; + }; + + Tag tag; + union { + Success_Body success; + }; +}; + +/// The result of attempting to create a new V0 advertisement builder. +struct CreateV0AdvertisementBuilderResult { + enum class Tag { + NoSpaceLeft, + Success, + }; + + struct Success_Body { + V0AdvertisementBuilder _0; + }; + + Tag tag; + union { + Success_Body success; + }; +}; + +/// Cryptographic information about a particular V0 broadcast credential +/// necessary to LDT-encrypt V0 advertisements. +struct V0BroadcastCredential { + uint8_t key_seed[32]; + uint8_t metadata_key[14]; +}; + +/// A `#[repr(C)]` handle to a value of type `V1AdvertisementBuilderInternals` +struct V1AdvertisementBuilderHandle { + uint64_t handle_id; +}; + +/// A handle to a builder for V1 advertisements. +struct V1AdvertisementBuilder { + AdvertisementBuilderKind kind; + V1AdvertisementBuilderHandle handle; +}; + +/// A handle to a builder for V1 sections. +struct V1SectionBuilder { + V1AdvertisementBuilder adv_builder; + uint8_t section_index; +}; + +/// The result of attempting to create a new V1 section builder. +struct CreateV1SectionBuilderResult { + enum class Tag { + Success, + UnclosedActiveSection, + InvalidAdvertisementBuilderHandle, + IdentityKindMismatch, + NoSpaceLeft, + }; + + struct Success_Body { + V1SectionBuilder _0; + }; + + Tag tag; + union { + Success_Body success; + }; +}; + +/// Cryptographic information about a particular V1 broadcast credential +/// necessary to encrypt V1 MIC-verified and signature-verified sections. +struct V1BroadcastCredential { + uint8_t key_seed[32]; + uint8_t metadata_key[16]; + uint8_t private_key[32]; +}; + +/// The result of attempting to serialize the contents +/// of a V1 advertisement builder to raw bytes. +struct SerializeV1AdvertisementResult { + enum class Tag { + Success, + InvalidBuilderState, + InvalidAdvertisementBuilderHandle, + }; + + struct Success_Body { + ByteBuffer<250> _0; + }; + + Tag tag; + union { + Success_Body success; + }; +}; + +/// The result of attempting to create a new V1 advertisement builder. +struct CreateV1AdvertisementBuilderResult { + enum class Tag { + NoSpaceLeft, + Success, + }; + + struct Success_Body { + V1AdvertisementBuilder _0; + }; + + Tag tag; + union { + Success_Body success; + }; +}; + +/// The result of attempting to get the derived V1 DE +/// 16-byte salt for the next-added DE to the section +/// builder behind the given handle. +struct NextV1DE16ByteSaltResult { + enum class Tag { + Error, + Success, + }; + + struct Success_Body { + FixedSizeArray<16> _0; + }; + + Tag tag; + union { + Success_Body success; + }; +}; + +/// Represents the contents of a V1 DE whose payload +/// is stored in a buffer which may contain up to 127 bytes, +/// which is the maximum for any V1 DE. +/// +/// This representation is stable, and so you may directly +/// reference this struct's fields if you wish. +struct V1DE127ByteBuffer { + /// The DE type code of this generic data-element. + uint32_t de_type; + /// The raw data-element byte payload, up to + /// 127 bytes in length. + ByteBuffer<127> payload; +}; + +/// Result type for attempting to construct a +/// Tx Power from a signed byte. +struct BuildTxPowerResult { + enum class Tag { + OutOfRange, + Success, + }; + + struct Success_Body { + TxPower _0; + }; + + Tag tag; + union { + Success_Body success; + }; +}; + +/// The result of attempting to set a particular action +/// bit on some `V0Actions`. +struct SetV0ActionResult { + enum class Tag { + Success, + Error, + }; + + struct Success_Body { + V0Actions _0; + }; + + struct Error_Body { + V0Actions _0; + }; + + Tag tag; + union { + Success_Body success; + Error_Body error; + }; +}; + +/// Representation of a context-sync sequence number. +struct ContextSyncSeqNum { + uint8_t value; +}; + +/// Result type for attempting to construct a +/// ContextSyncSeqNum from an unsigned byte. +struct BuildContextSyncSeqNumResult { + enum class Tag { + OutOfRange, + Success, + }; + + struct Success_Body { + ContextSyncSeqNum _0; + }; + + Tag tag; + union { + Success_Body success; + }; +}; + } // namespace internal } // namespace np_ffi + +// clang-format on
diff --git a/nearby/presence/np_c_ffi/rust-toolchain.toml b/nearby/presence/np_c_ffi/rust-toolchain.toml deleted file mode 100644 index 271800c..0000000 --- a/nearby/presence/np_c_ffi/rust-toolchain.toml +++ /dev/null
@@ -1,2 +0,0 @@ -[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 index 70949a6..7dc8ac7 100644 --- a/nearby/presence/np_c_ffi/src/credentials.rs +++ b/nearby/presence/np_c_ffi/src/credentials.rs
@@ -16,9 +16,14 @@ use crate::{unwrap, PanicReason}; use core::slice; use np_ffi_core::common::*; -use np_ffi_core::credentials::credential_book::CredentialBook; -use np_ffi_core::credentials::credential_slab::CredentialSlab; +use np_ffi_core::credentials::CredentialBook; +use np_ffi_core::credentials::CredentialSlab; use np_ffi_core::credentials::*; +use np_ffi_core::deserialize::DecryptedMetadata; +use np_ffi_core::deserialize::{ + DecryptMetadataResult, DecryptMetadataResultKind, GetMetadataBufferPartsResult, + GetMetadataBufferPartsResultKind, MetadataBufferParts, +}; use np_ffi_core::utils::FfiEnum; /// Allocates a new credential-book from the given slab, returning a handle @@ -122,7 +127,7 @@ pub extern "C" fn np_ffi_CredentialSlab_add_v0_credential( credential_slab: CredentialSlab, v0_cred: V0MatchableCredential, -) -> AddCredentialToSlabResult { +) -> AddV0CredentialToSlabResult { #[allow(unsafe_code)] let metadata_slice = unsafe { slice::from_raw_parts( @@ -145,7 +150,7 @@ pub extern "C" fn np_ffi_CredentialSlab_add_v1_credential( credential_slab: CredentialSlab, v1_cred: V1MatchableCredential, -) -> AddCredentialToSlabResult { +) -> AddV1CredentialToSlabResult { #[allow(unsafe_code)] let metadata_slice = unsafe { slice::from_raw_parts( @@ -157,3 +162,57 @@ let matched_credential = MatchedCredential::new(v1_cred.matched_cred.cred_id, metadata_slice); credential_slab.add_v1(v1_cred.discovery_cred, matched_credential) } + +/// Frees the underlying resources of the decrypted metadata buffer +#[no_mangle] +pub extern "C" fn np_ffi_deallocate_DecryptedMetadata( + metadata: DecryptedMetadata, +) -> DeallocateResult { + metadata.deallocate_metadata() +} + +/// Gets the tag of a `DecryptMetadataResult` tagged-union. On success the wrapped identity +/// details may be obtained via `DecryptMetadataResult#into_success`. +#[no_mangle] +pub extern "C" fn np_ffi_DecryptMetadataResult_kind( + result: DecryptMetadataResult, +) -> DecryptMetadataResultKind { + result.kind() +} + +/// Casts a `DecryptMetadataResult` 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_DecryptMetadataResult_into_SUCCESS( + result: DecryptMetadataResult, +) -> DecryptedMetadata { + unwrap(result.into_success(), PanicReason::EnumCastFailed) +} + +/// Gets the pointer and length of the heap allocated byte buffer of decrypted metadata +#[no_mangle] +pub extern "C" fn np_ffi_DecryptedMetadata_get_metadata_buffer_parts( + metadata: DecryptedMetadata, +) -> GetMetadataBufferPartsResult { + metadata.get_metadata_buffer_parts() +} + +/// Gets the tag of a `GetMetadataBufferPartsResult` tagged-union. On success the wrapped identity +/// details may be obtained via `GetMetadataBufferPartsResult#into_success`. +#[no_mangle] +pub extern "C" fn np_ffi_GetMetadataBufferPartsResult_kind( + result: GetMetadataBufferPartsResult, +) -> GetMetadataBufferPartsResultKind { + result.kind() +} + +/// Casts a `GetMetadataBufferPartsResult` to the `Success` variant, panicking in the +/// case where the passed value is of a different enum variant. This returns the pointer and length +/// of the byte buffer containing the decrypted metadata. There can be a data-race between attempts +/// to access the contents of the buffer and attempts to free the handle from different threads. +#[no_mangle] +pub extern "C" fn np_ffi_GetMetadataBufferPartsResult_into_SUCCESS( + result: GetMetadataBufferPartsResult, +) -> MetadataBufferParts { + unwrap(result.into_success(), PanicReason::EnumCastFailed) +}
diff --git a/nearby/presence/np_c_ffi/src/deserialize/mod.rs b/nearby/presence/np_c_ffi/src/deserialize/mod.rs index 9f2cea8..3faf414 100644 --- a/nearby/presence/np_c_ffi/src/deserialize/mod.rs +++ b/nearby/presence/np_c_ffi/src/deserialize/mod.rs
@@ -14,7 +14,7 @@ use crate::{unwrap, PanicReason}; use np_ffi_core::common::*; -use np_ffi_core::credentials::credential_book::CredentialBook; +use np_ffi_core::credentials::CredentialBook; use np_ffi_core::deserialize::v0::*; use np_ffi_core::deserialize::v1::*; use np_ffi_core::deserialize::*;
diff --git a/nearby/presence/np_c_ffi/src/deserialize/v0.rs b/nearby/presence/np_c_ffi/src/deserialize/v0.rs index 28bec8a..be68720 100644 --- a/nearby/presence/np_c_ffi/src/deserialize/v0.rs +++ b/nearby/presence/np_c_ffi/src/deserialize/v0.rs
@@ -12,11 +12,13 @@ // See the License for the specific language governing permissions and // limitations under the License. -use crate::{panic, unwrap, PanicReason}; +use crate::{unwrap, PanicReason}; use np_ffi_core::common::DeallocateResult; -use np_ffi_core::deserialize::v0::v0_payload::V0Payload; +use np_ffi_core::deserialize::v0::V0Payload; use np_ffi_core::deserialize::v0::*; +use np_ffi_core::deserialize::DecryptMetadataResult; use np_ffi_core::utils::FfiEnum; +use np_ffi_core::v0::*; /// Gets the tag of a `DeserializedV0Advertisement` tagged-union. #[no_mangle] @@ -74,6 +76,39 @@ payload.get_de(index) } +/// Attempts to decrypt the metadata for the matched credential for this V0 payload (if any) +#[no_mangle] +pub extern "C" fn np_ffi_V0Payload_decrypt_metadata(payload: V0Payload) -> DecryptMetadataResult { + payload.decrypt_metadata() +} + +/// Gets the identity details for this V0 payload, or returns an error if this payload does not have +/// any associated identity (public advertisement) +#[no_mangle] +pub extern "C" fn np_ffi_V0Payload_get_identity_details( + payload: V0Payload, +) -> GetV0IdentityDetailsResult { + payload.get_identity_details() +} + +/// Gets the tag of a `GetV0IdentityDetailsResult` tagged-union. On success the wrapped identity +/// details may be obtained via `GetV0IdentityDetailsResult#into_success`. +#[no_mangle] +pub extern "C" fn np_ffi_GetV0IdentityDetailsResult_kind( + result: GetV0IdentityDetailsResult, +) -> GetV0IdentityDetailsResultKind { + result.kind() +} + +/// Casts a `GetV0IdentityDetailsResult` 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_GetV0IdentityDetailsResult_into_SUCCESS( + result: GetV0IdentityDetailsResult, +) -> DeserializedV0IdentityDetails { + unwrap(result.into_success(), PanicReason::EnumCastFailed) +} + /// Deallocates any internal data of a `V0Payload` #[no_mangle] pub extern "C" fn np_ffi_deallocate_v0_payload(payload: V0Payload) -> DeallocateResult { @@ -92,50 +127,3 @@ 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 index dc682a3..68c0cc2 100644 --- a/nearby/presence/np_c_ffi/src/deserialize/v1.rs +++ b/nearby/presence/np_c_ffi/src/deserialize/v1.rs
@@ -13,7 +13,9 @@ // limitations under the License. use crate::{unwrap, PanicReason}; +use np_ffi_core::common::FixedSizeArray; use np_ffi_core::deserialize::v1::*; +use np_ffi_core::deserialize::DecryptMetadataResult; use np_ffi_core::utils::FfiEnum; /// Gets the number of legible sections on a deserialized V1 advertisement. @@ -86,29 +88,79 @@ section.get_de(de_index) } +/// Gets the identity details used to decrypt this V1 section, or returns an error if this payload +/// does not have any associated identity (public advertisement) +#[no_mangle] +pub extern "C" fn np_ffi_DeserializedV1Section_get_identity_details( + section: DeserializedV1Section, +) -> GetV1IdentityDetailsResult { + section.get_identity_details() +} + +/// Gets the tag of a `GetV1IdentityDetailsResult` tagged-union. On success the wrapped identity +/// details may be obtained via `GetV0IdentityDetailsResult#into_success`. +#[no_mangle] +pub extern "C" fn np_ffi_GetV1IdentityDetailsResult_kind( + result: GetV1IdentityDetailsResult, +) -> GetV1IdentityDetailsResultKind { + result.kind() +} + +/// Casts a `GetV1IdentityDetailsResult` 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_GetV1IdentityDetailsResult_into_SUCCESS( + result: GetV1IdentityDetailsResult, +) -> DeserializedV1IdentityDetails { + unwrap(result.into_success(), PanicReason::EnumCastFailed) +} + +/// Attempts to decrypt the metadata for the matched credential for this V0 payload (if any) +#[no_mangle] +pub extern "C" fn np_ffi_DeserializedV1Section_decrypt_metadata( + section: DeserializedV1Section, +) -> DecryptMetadataResult { + section.decrypt_metadata() +} + +/// Attempts to derive a 16-byte DE salt for a DE in this section with the given DE offset. This +/// operation may fail if the passed offset is 255 (causes overflow) or if the section +/// is leveraging a public identity, and hence, doesn't have an associated salt. +#[no_mangle] +pub extern "C" fn np_ffi_DeserializedV1Section_derive_16_byte_salt_for_offset( + section: DeserializedV1Section, + offset: u8, +) -> GetV1DE16ByteSaltResult { + section.derive_16_byte_salt_for_offset(offset) +} + +/// Gets the tag of a `GetV1DE16ByteSaltResult` tagged-union. On success the wrapped identity +/// details may be obtained via `GetV1DE16ByteSaltResult#into_success`. +#[no_mangle] +pub extern "C" fn np_ffi_GetV1DE16ByteSaltResult_kind( + result: GetV1DE16ByteSaltResult, +) -> GetV1DE16ByteSaltResultKind { + result.kind() +} + +/// Casts a `GetV1DE16ByteSaltResult` 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_GetV1DE16ByteSaltResult_into_SUCCESS( + result: GetV1DE16ByteSaltResult, +) -> FixedSizeArray<16> { + unwrap(result.into_success(), PanicReason::EnumCastFailed) +} + /// 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 +/// Casts a `GetV1DEResult` 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_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 index 84e9859..2572887 100644 --- a/nearby/presence/np_c_ffi/src/lib.rs +++ b/nearby/presence/np_c_ffi/src/lib.rs
@@ -16,9 +16,13 @@ pub mod credentials; pub mod deserialize; +pub mod serialize; +pub mod v0; +pub mod v1; use lock_adapter::std::RwLock; use lock_adapter::RwLock as _; +use np_ffi_core::common::InvalidStackDataStructure; /// Structure for categorized reasons for why a NP C FFI call may /// be panicking. @@ -35,10 +39,14 @@ /// 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, + /// Error returned if the bit representation of a supposedly-Rust-constructed + /// -and-validated type actually doesn't correspond to the format of the + /// data structure expected on the Rust side of the boundary, and performing + /// further operations on the structure would yield unintended behavior. + /// If this kind of error is being raised, the C code must + /// be messing with stack-allocated data structures for this library + /// in an entirely unexpected way. + InvalidStackDataStructure = 2, } /// Structure which maintains information about the panic-handler @@ -87,14 +95,19 @@ } } -//TODO: use a std library RwLock if we have that available, spin is only needed for no_std and -// won't be as performant static PANIC_HANDLER: RwLock<PanicHandler> = RwLock::new(PanicHandler::new()); pub(crate) fn panic(reason: PanicReason) -> ! { PANIC_HANDLER.read().panic(reason) } +pub(crate) fn panic_if_invalid<T>(value: Result<T, InvalidStackDataStructure>) -> T { + match value { + Ok(x) => x, + Err(_) => panic(PanicReason::InvalidStackDataStructure), + } +} + pub(crate) fn unwrap<T>(value: Option<T>, panic_reason: PanicReason) -> T { match value { Some(x) => x, @@ -224,3 +237,47 @@ max_num_deserialized_v1_advertisements, ) } + +/// Sets the maximum number of active handles to v0 advertisement +/// builders 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 V0 advertisement builder. +#[no_mangle] +pub extern "C" fn np_ffi_global_config_set_max_num_v0_advertisement_builders( + max_num_v0_advertisement_builders: u32, +) { + np_ffi_core::common::global_config_set_max_num_v0_advertisement_builders( + max_num_v0_advertisement_builders, + ) +} + +/// Sets the maximum number of active handles to v1 advertisement +/// builders 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 V1 advertisement builder. +#[no_mangle] +pub extern "C" fn np_ffi_global_config_set_max_num_v1_advertisement_builders( + max_num_v1_advertisement_builders: u32, +) { + np_ffi_core::common::global_config_set_max_num_v1_advertisement_builders( + max_num_v1_advertisement_builders, + ) +}
diff --git a/nearby/presence/ldt_np_adv_ffi/src/no_std.rs b/nearby/presence/np_c_ffi/src/serialize/mod.rs similarity index 67% rename from nearby/presence/ldt_np_adv_ffi/src/no_std.rs rename to nearby/presence/np_c_ffi/src/serialize/mod.rs index 524bc3d..da5690a 100644 --- a/nearby/presence/ldt_np_adv_ffi/src/no_std.rs +++ b/nearby/presence/np_c_ffi/src/serialize/mod.rs
@@ -1,4 +1,4 @@ -// Copyright 2022 Google LLC +// 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. @@ -11,15 +11,6 @@ // 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. -// -// mod to handle all of the impls needed for no_std -extern crate panic_abort; - -use libc_alloc::LibcAlloc; - -#[global_allocator] -static ALLOCATOR: LibcAlloc = LibcAlloc; - -#[lang = "eh_personality"] -extern "C" fn eh_personality() {} +mod v0; +mod v1;
diff --git a/nearby/presence/np_c_ffi/src/serialize/v0.rs b/nearby/presence/np_c_ffi/src/serialize/v0.rs new file mode 100644 index 0000000..962522e --- /dev/null +++ b/nearby/presence/np_c_ffi/src/serialize/v0.rs
@@ -0,0 +1,107 @@ +// 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 functionality for V0 advertisement serialization. + +use crate::{panic_if_invalid, unwrap, PanicReason}; +use np_ffi_core::common::{ByteBuffer, DeallocateResult, EncryptedIdentityType, FixedSizeArray}; +use np_ffi_core::credentials::V0BroadcastCredential; +use np_ffi_core::serialize::v0::*; +use np_ffi_core::utils::FfiEnum; +use np_ffi_core::v0::V0DataElement; + +/// Attempts to add the given data element to the V0 +/// advertisement builder behind the passed handle. +/// +/// This method may invoke the panic handler if the passed DE +/// has an invalid layout, which may indicate that the backing +/// data on the stack was somehow tampered with in an unintended way. +#[no_mangle] +pub extern "C" fn np_ffi_V0AdvertisementBuilder_add_de( + adv_builder: V0AdvertisementBuilder, + de: V0DataElement, +) -> AddV0DEResult { + panic_if_invalid(adv_builder.add_de(de)) +} + +/// Attempts to serialize the contents of the advertisement builder +/// behind this handle to bytes. Assuming that the handle is valid, +/// this operation will always result in the contents behind the +/// advertisement builder handle being deallocated. +#[no_mangle] +pub extern "C" fn np_ffi_V0AdvertisementBuilder_into_advertisement( + adv_builder: V0AdvertisementBuilder, +) -> SerializeV0AdvertisementResult { + adv_builder.into_advertisement() +} + +/// Attempts to deallocate the v0 advertisement builder behind +/// the given handle. +#[no_mangle] +pub extern "C" fn np_ffi_deallocate_v0_advertisement_builder( + adv_builder: V0AdvertisementBuilder, +) -> DeallocateResult { + adv_builder.deallocate() +} + +/// Gets the tag of a `CreateV0AdvertisementBuilderResult` tagged-union. +#[no_mangle] +pub extern "C" fn np_ffi_CreateV0AdvertisementBuilderResult_kind( + result: CreateV0AdvertisementBuilderResult, +) -> CreateV0AdvertisementBuilderResultKind { + result.kind() +} + +/// Casts a `CreateV0AdvertisementBuilderResult` 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_CreateV0AdvertisementBuilderResult_into_SUCCESS( + result: CreateV0AdvertisementBuilderResult, +) -> V0AdvertisementBuilder { + unwrap(result.into_success(), PanicReason::EnumCastFailed) +} + +/// Creates a new V0 advertisement builder for a public advertisement. +#[no_mangle] +pub extern "C" fn np_ffi_create_v0_public_advertisement_builder( +) -> CreateV0AdvertisementBuilderResult { + create_v0_public_advertisement_builder() +} + +/// Creates a new V0 advertisement builder for an encrypted advertisement. +#[no_mangle] +pub extern "C" fn np_ffi_create_v0_encrypted_advertisement_builder( + broadcast_cred: V0BroadcastCredential, + identity_type: EncryptedIdentityType, + salt: FixedSizeArray<2>, +) -> CreateV0AdvertisementBuilderResult { + create_v0_encrypted_advertisement_builder(broadcast_cred, identity_type, salt) +} + +/// Gets the tag of a `SerializeV0AdvertisementResult` tagged-union. +#[no_mangle] +pub extern "C" fn np_ffi_SerializeV0AdvertisementResult_kind( + result: SerializeV0AdvertisementResult, +) -> SerializeV0AdvertisementResultKind { + result.kind() +} + +/// Casts a `SerializeV0AdvertisementResult` 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_SerializeV0AdvertisementResult_into_SUCCESS( + result: SerializeV0AdvertisementResult, +) -> ByteBuffer<24> { + unwrap(result.into_success(), PanicReason::EnumCastFailed) +}
diff --git a/nearby/presence/np_c_ffi/src/serialize/v1.rs b/nearby/presence/np_c_ffi/src/serialize/v1.rs new file mode 100644 index 0000000..c8ba135 --- /dev/null +++ b/nearby/presence/np_c_ffi/src/serialize/v1.rs
@@ -0,0 +1,183 @@ +// 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 functionality for V1 advertisement serialization. + +use crate::{unwrap, PanicReason}; +use np_ffi_core::common::{ByteBuffer, EncryptedIdentityType, FixedSizeArray}; +use np_ffi_core::credentials::V1BroadcastCredential; +use np_ffi_core::serialize::v1::*; +use np_ffi_core::serialize::AdvertisementBuilderKind; +use np_ffi_core::utils::FfiEnum; +use np_ffi_core::v1::V1VerificationMode; + +/// Attempts to create a builder for a new public section within +/// the advertisement builder behind this handle, +/// returning a handle to the newly-created section builder if successful. +/// +/// This method may fail if there is another currently-active +/// section builder for the same advertisement builder, if the +/// kind of section being added does not match the advertisement +/// type (public/encrypted), or if the section would not manage +/// to fit within the enclosing advertisement. +#[no_mangle] +pub extern "C" fn np_ffi_V1AdvertisementBuilder_public_section_builder( + adv_builder: V1AdvertisementBuilder, +) -> CreateV1SectionBuilderResult { + adv_builder.public_section_builder() +} + +/// Attempts to create a builder for a new encrypted section within +/// the advertisement builder behind the given handle, +/// returning a handle to the newly-created section builder if successful. +/// +/// The identity details for the new section builder may be specified +/// via providing the broadcast credential data, the kind of encrypted +/// identity being broadcast (private/trusted/provisioned), and the +/// verification mode (MIC/Signature) to be used for the encrypted section. +/// +/// This method may fail if there is another currently-active +/// section builder for the same advertisement builder, if the +/// kind of section being added does not match the advertisement +/// type (public/encrypted), or if the section would not manage +/// to fit within the enclosing advertisement. +#[no_mangle] +pub extern "C" fn np_ffi_V1AdvertisementBuilder_encrypted_section_builder( + adv_builder: V1AdvertisementBuilder, + broadcast_cred: V1BroadcastCredential, + identity_type: EncryptedIdentityType, + verification_mode: V1VerificationMode, +) -> CreateV1SectionBuilderResult { + adv_builder.encrypted_section_builder(broadcast_cred, identity_type, verification_mode) +} + +/// Attempts to serialize the contents of the advertisement builder +/// behind this handle to bytes. Assuming that the handle is valid, +/// this operation will always result in the contents behind the +/// advertisement builder handle being deallocated. +#[no_mangle] +pub extern "C" fn np_ffi_V1AdvertisementBuilder_into_advertisement( + adv_builder: V1AdvertisementBuilder, +) -> SerializeV1AdvertisementResult { + adv_builder.into_advertisement() +} + +/// Gets the tag of a `CreateV1AdvertisementBuilderResult` tagged-union. +#[no_mangle] +pub extern "C" fn np_ffi_CreateV1AdvertisementBuilderResult_kind( + result: CreateV1AdvertisementBuilderResult, +) -> CreateV1AdvertisementBuilderResultKind { + result.kind() +} + +/// Casts a `CreateV1AdvertisementBuilderResult` 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_CreateV1AdvertisementBuilderResult_into_SUCCESS( + result: CreateV1AdvertisementBuilderResult, +) -> V1AdvertisementBuilder { + unwrap(result.into_success(), PanicReason::EnumCastFailed) +} + +/// Creates a new V1 advertisement builder for the given advertisement +/// kind (public/encrypted). +#[no_mangle] +pub extern "C" fn np_ffi_create_v1_advertisement_builder( + kind: AdvertisementBuilderKind, +) -> CreateV1AdvertisementBuilderResult { + create_v1_advertisement_builder(kind) +} + +/// Gets the tag of a `SerializeV1AdvertisementResult` tagged-union. +#[no_mangle] +pub extern "C" fn np_ffi_SerializeV1AdvertisementResult_kind( + result: SerializeV1AdvertisementResult, +) -> SerializeV1AdvertisementResultKind { + result.kind() +} + +/// Casts a `SerializeV1AdvertisementResult` 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_SerializeV1AdvertisementResult_into_SUCCESS( + result: SerializeV1AdvertisementResult, +) -> ByteBuffer<250> { + unwrap(result.into_success(), PanicReason::EnumCastFailed) +} + +/// Gets the tag of a `CreateV1SectionBuilderResult` tagged-union. +#[no_mangle] +pub extern "C" fn np_ffi_CreateV1SectionBuilderResult_kind( + result: CreateV1SectionBuilderResult, +) -> CreateV1SectionBuilderResultKind { + result.kind() +} + +/// Casts a `CreateV1SectionBuilderResult` 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_CreateV1SectionBuilderResult_into_SUCCESS( + result: CreateV1SectionBuilderResult, +) -> V1SectionBuilder { + unwrap(result.into_success(), PanicReason::EnumCastFailed) +} + +/// Gets the tag of a `NextV1DE16ByteSaltResult` tagged-union. +#[no_mangle] +pub extern "C" fn np_ffi_NextV1DE16ByteSaltResult_kind( + result: NextV1DE16ByteSaltResult, +) -> NextV1DE16ByteSaltResultKind { + result.kind() +} + +/// Casts a `NextV1DE16ByteSaltResult` 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_NextV1DE16ByteSaltResult_into_SUCCESS( + result: NextV1DE16ByteSaltResult, +) -> FixedSizeArray<16> { + unwrap(result.into_success(), PanicReason::EnumCastFailed) +} + +/// Adds the section constructed behind the given handle to +/// a section builder to the containing advertisement it originated from. +/// After this call, the section builder handle will become invalid. +#[no_mangle] +pub extern "C" fn np_ffi_V1SectionBuilder_add_to_advertisement( + section_builder: V1SectionBuilder, +) -> AddV1SectionToAdvertisementResult { + section_builder.add_to_advertisement() +} + +/// Attempts to get the derived 16-byte V1 DE salt for the next +/// DE to be added to the passed section builder. May fail if this +/// section builder handle is invalid, or if the section +/// is a public section. +#[no_mangle] +pub extern "C" fn np_ffi_V1SectionBuilder_next_de_salt( + section_builder: V1SectionBuilder, +) -> NextV1DE16ByteSaltResult { + section_builder.next_de_salt() +} + +/// Attempts to add the given DE to the section builder behind +/// this handle. The passed DE may have a payload of up to 127 +/// bytes, the maximum for a V1 DE. +#[no_mangle] +pub extern "C" fn np_ffi_V1SectionBuilder_add_127_byte_buffer_de( + section_builder: V1SectionBuilder, + de: V1DE127ByteBuffer, +) -> AddV1DEResult { + section_builder.add_127_byte_buffer_de(de) +}
diff --git a/nearby/presence/np_c_ffi/src/v0.rs b/nearby/presence/np_c_ffi/src/v0.rs new file mode 100644 index 0000000..17302aa --- /dev/null +++ b/nearby/presence/np_c_ffi/src/v0.rs
@@ -0,0 +1,195 @@ +// 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 functionality common to V0 ser/deser flows. + +use crate::{panic, panic_if_invalid, unwrap, PanicReason}; +use np_ffi_core::serialize::AdvertisementBuilderKind; +use np_ffi_core::utils::FfiEnum; +use np_ffi_core::v0::*; + +/// 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) +} + +/// Upcasts a Tx power DE to a generic V0 data-element. +#[no_mangle] +pub extern "C" fn np_ffi_TxPower_into_V0DataElement(tx_power: TxPower) -> V0DataElement { + V0DataElement::TxPower(tx_power) +} + +/// 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) +} + +/// Upcasts a V0 actions DE to a generic V0 data-element. +#[no_mangle] +pub extern "C" fn np_ffi_V0Actions_into_V0DataElement(actions: V0Actions) -> V0DataElement { + V0DataElement::Actions(actions) +} + +/// Gets the tag of a `BuildTxPowerResult` tagged-union. +#[no_mangle] +pub extern "C" fn np_ffi_BuildTxPowerResult_kind( + result: BuildTxPowerResult, +) -> BuildTxPowerResultKind { + result.kind() +} + +/// Casts a `BuildTxPowerResult` 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_BuildTxPowerResult_into_SUCCESS(result: BuildTxPowerResult) -> TxPower { + unwrap(result.into_success(), PanicReason::EnumCastFailed) +} + +/// Attempts to construct a new TxPower from +/// the given signed-byte value. +#[no_mangle] +pub extern "C" fn np_ffi_TxPower_build_from_signed_byte(tx_power: i8) -> BuildTxPowerResult { + TxPower::build_from_signed_byte(tx_power) +} + +/// Gets the value of the given TxPower as a signed byte. +#[no_mangle] +pub extern "C" fn np_ffi_TxPower_as_signed_byte(tx_power: TxPower) -> i8 { + tx_power.as_i8() +} + +/// Gets the discriminant of the `SetV0ActionResult` tagged-union. +#[no_mangle] +pub extern "C" fn np_ffi_SetV0ActionResult_kind( + result: SetV0ActionResult, +) -> SetV0ActionResultKind { + result.kind() +} + +/// Attempts to cast a `SetV0ActionResult` tagged-union into the `Success` variant. +#[no_mangle] +pub extern "C" fn np_ffi_SetV0ActionResult_into_SUCCESS(result: SetV0ActionResult) -> V0Actions { + unwrap(result.into_success(), PanicReason::EnumCastFailed) +} + +/// Attempts to cast a `SetV0ActionResult` tagged-union into the `Error` variant. +#[no_mangle] +pub extern "C" fn np_ffi_SetV0ActionResult_into_ERROR(result: SetV0ActionResult) -> V0Actions { + unwrap(result.into_error(), PanicReason::EnumCastFailed) +} + +/// Constructs a new V0 actions DE with no declared boolean +/// actions and a zeroed context sync sequence number, +/// where the DE is intended for the given advertisement +/// kind (plaintext/encrypted). +#[no_mangle] +pub extern "C" fn np_ffi_build_new_zeroed_V0Actions(kind: AdvertisementBuilderKind) -> V0Actions { + V0Actions::new_zeroed(kind) +} + +/// 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::InvalidStackDataStructure), + } +} + +/// 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, +) -> ContextSyncSeqNum { + match actions.get_context_sync_seq_num() { + Ok(b) => b, + Err(_) => panic(PanicReason::InvalidStackDataStructure), + } +} + +/// Attempts to set the given action bit to the given boolean value. +/// This operation may fail if the requested action bit may not be +/// set for the kind of containing advertisement (public/encrypted) +/// that this action DE is intended to belong to. In this case, +/// the original action bits will be yielded back to the caller, +/// unaltered. +#[no_mangle] +pub extern "C" fn np_ffi_V0Actions_set_action( + actions: V0Actions, + action_type: BooleanActionType, + value: bool, +) -> SetV0ActionResult { + panic_if_invalid(actions.set_action(action_type, value)) +} + +/// Sets the context sequence number for the given Actions DE. +#[no_mangle] +pub extern "C" fn np_ffi_V0Actions_set_context_sync_sequence_number( + actions: V0Actions, + value: ContextSyncSeqNum, +) -> V0Actions { + panic_if_invalid(actions.set_context_sync_seq_num(value)) +} + +/// Returns the representation of the passed `V0Actions` as an unsigned +/// integer, where the bit-positions correspond to individual actions. +#[no_mangle] +pub extern "C" fn np_ffi_V0Actions_as_u32(actions: V0Actions) -> u32 { + actions.as_u32() +} + +/// Gets the tag of a `BuildContextSyncSeqNumResult` tagged-union. +#[no_mangle] +pub extern "C" fn np_ffi_BuildContextSyncSeqNumResult_kind( + result: BuildContextSyncSeqNumResult, +) -> BuildContextSyncSeqNumResultKind { + result.kind() +} + +/// Casts a `BuildContextSyncSeqNumResult` 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_BuildContextSyncSeqNumResult_into_SUCCESS( + result: BuildContextSyncSeqNumResult, +) -> ContextSyncSeqNum { + unwrap(result.into_success(), PanicReason::EnumCastFailed) +} + +/// Attempts to build a new context sync sequence number +/// from the given unsigned byte. +#[no_mangle] +pub extern "C" fn np_ffi_ContextSyncSeqNum_build_from_unsigned_byte( + value: u8, +) -> BuildContextSyncSeqNumResult { + ContextSyncSeqNum::build_from_unsigned_byte(value) +} + +/// Gets the value of the given context-sync sequence number as an unsigned byte. +#[no_mangle] +pub extern "C" fn np_ffi_ContextSyncSeqNum_as_unsigned_byte(seq_num: ContextSyncSeqNum) -> u8 { + seq_num.as_u8() +}
diff --git a/nearby/presence/np_c_ffi/src/v1.rs b/nearby/presence/np_c_ffi/src/v1.rs new file mode 100644 index 0000000..87a168e --- /dev/null +++ b/nearby/presence/np_c_ffi/src/v1.rs
@@ -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. + +//! NP Rust C FFI functionality common to V1 ser/deser flows. + +use np_ffi_core::deserialize::v1::*; + +/// 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_cpp_ffi/CMakeLists.txt b/nearby/presence/np_cpp_ffi/CMakeLists.txt index 27c9132..7071bbd 100644 --- a/nearby/presence/np_cpp_ffi/CMakeLists.txt +++ b/nearby/presence/np_cpp_ffi/CMakeLists.txt
@@ -12,14 +12,10 @@ # 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}" + "${NEARBY_ROOT}/target/release/${CMAKE_STATIC_LIBRARY_PREFIX}np_c_ffi${CMAKE_STATIC_LIBRARY_SUFFIX}" absl::statusor) target_include_directories(nearby_protocol PUBLIC @@ -38,11 +34,12 @@ target_link_libraries(shared_test_util nearby_protocol absl::statusor) if (ENABLE_TESTS) - message(STATUS "Enabling np_cpp tests") + message(STATUS "Enabling np_ffi tests") add_subdirectory(tests) add_subdirectory(benchmarks) endif () if (ENABLE_FUZZ) + message(STATUS "Enabling np_ffi fuzzers") add_subdirectory(fuzz) endif ()
diff --git a/nearby/presence/np_cpp_ffi/benchmarks/CMakeLists.txt b/nearby/presence/np_cpp_ffi/benchmarks/CMakeLists.txt index c7d8343..c3c059a 100644 --- a/nearby/presence/np_cpp_ffi/benchmarks/CMakeLists.txt +++ b/nearby/presence/np_cpp_ffi/benchmarks/CMakeLists.txt
@@ -12,11 +12,15 @@ # See the License for the specific language governing permissions and # limitations under the License. -add_executable(np_ffi_bench np_ffi_bench.cc) +add_executable( + np_ffi_bench + np_cpp_benches.cc + np_c_ffi_benches.cc) target_link_libraries( np_ffi_bench nearby_protocol + shared_test_util benchmark::benchmark) if (UNIX)
diff --git a/nearby/presence/np_cpp_ffi/benchmarks/np_c_ffi_benches.cc b/nearby/presence/np_cpp_ffi/benchmarks/np_c_ffi_benches.cc new file mode 100644 index 0000000..02bd4ca --- /dev/null +++ b/nearby/presence/np_cpp_ffi/benchmarks/np_c_ffi_benches.cc
@@ -0,0 +1,64 @@ +// 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. + +// Benchmarks measuring the performance of the pure autogenerated C API. +// This is useful to compare with the C++ benchmarks to understand the overhead +// incurred by going through the C++ wrapper types instead of directly calling +// the C API. + +#include "benchmark/benchmark.h" +#include "np_cpp_ffi_functions.h" +#include "np_cpp_ffi_types.h" +#include "shared_test_util.h" + +void V0PlaintextCApi(benchmark::State &state) { + auto num_ciphers = state.range(0); + auto slab_result = np_ffi::internal::np_ffi_create_credential_slab(); + assert( + np_ffi::internal::np_ffi_CreateCredentialSlabResult_kind(slab_result) == + np_ffi::internal::CreateCredentialSlabResultKind::Success); + auto slab = np_ffi::internal::np_ffi_CreateCredentialSlabResult_into_SUCCESS( + slab_result); + + auto book_result = + np_ffi::internal::np_ffi_create_credential_book_from_slab(slab); + 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( + {V0AdvMultiDeInternals}, book); + assert(np_ffi::internal::np_ffi_DeserializeAdvertisementResult_kind( + result) == + np_ffi::internal::DeserializeAdvertisementResultKind::V0); + [[maybe_unused]] auto deallocate_result = + np_ffi::internal::np_ffi_deallocate_deserialize_advertisement_result( + result); + assert(deallocate_result == np_ffi::internal::DeallocateResult::Success); + } + } + + [[maybe_unused]] auto deallocate_result = + np_ffi::internal::np_ffi_deallocate_credential_book(book); + assert(deallocate_result == np_ffi::internal::DeallocateResult::Success); +} + +BENCHMARK(V0PlaintextCApi) + ->RangeMultiplier(10) + ->Range(1, 1000) + ->Unit(benchmark::kMicrosecond);
diff --git a/nearby/presence/np_cpp_ffi/benchmarks/np_cpp_benches.cc b/nearby/presence/np_cpp_ffi/benchmarks/np_cpp_benches.cc new file mode 100644 index 0000000..2a3b010 --- /dev/null +++ b/nearby/presence/np_cpp_ffi/benchmarks/np_cpp_benches.cc
@@ -0,0 +1,229 @@ +// 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" + +// needed for running directly against the C API (ie: bypassing the C++ wrapper) +#include "np_cpp_ffi_functions.h" +#include "np_cpp_ffi_types.h" + +#include "benchmark/benchmark.h" + +nearby_protocol::CredentialBook CreateEmptyCredBook() { + auto cred_slab = nearby_protocol::CredentialSlab::TryCreate(); + assert(cred_slab.ok()); + auto cred_book = + nearby_protocol::CredentialBook::TryCreateFromSlab(cred_slab.value()); + assert(cred_book.ok()); + return std::move(*cred_book); +} + +void V0Plaintext(benchmark::State &state) { + auto cred_book = CreateEmptyCredBook(); + auto num_advs = state.range(0); + for ([[maybe_unused]] auto _ : state) { + for (int i = 0; i < num_advs; i++) { + auto result = nearby_protocol::Deserializer::DeserializeAdvertisement( + V0AdvPlaintextMultiDe, cred_book); + assert(result.GetKind() == + nearby_protocol::DeserializeAdvertisementResultKind::V0); + } + } +} +BENCHMARK(V0Plaintext) + ->RangeMultiplier(10) + ->Range(1, 1000) + ->Unit(benchmark::kMicrosecond); + +void V1Plaintext(benchmark::State &state) { + auto cred_book = CreateEmptyCredBook(); + auto num_advs = state.range(0); + for ([[maybe_unused]] auto _ : state) { + for (int i = 0; i < num_advs; i++) { + auto result = nearby_protocol::Deserializer::DeserializeAdvertisement( + V1AdvPlaintext, cred_book); + assert(result.GetKind() == + nearby_protocol::DeserializeAdvertisementResultKind::V1); + } + } +} +BENCHMARK(V1Plaintext) + ->RangeMultiplier(10) + ->Range(1, 1000) + ->Unit(benchmark::kMicrosecond); + +class V0Encrypted : public benchmark::Fixture { +public: + std::optional<nearby_protocol::CredentialBook> cred_book_; + void SetUp(const ::benchmark::State &state) override { + // populate credential book + auto num_creds = state.range(0); + + auto slab = nearby_protocol::CredentialSlab::TryCreate(); + assert(slab.ok()); + + for (int i = 1; i < num_creds; i++) { + auto credential = GenerateRandomCredentialV0(); + auto result = slab->AddV0Credential(credential); + assert(result.ok()); + } + + // now at the end of the list add the matching credential + nearby_protocol::MatchedCredentialData match_data(123, + V0AdvEncryptedMetadata); + std::array<uint8_t, 32> key_seed = {}; + std::fill_n(key_seed.begin(), 32, 0x11); + nearby_protocol::V0MatchableCredential v0_cred( + key_seed, V0AdvLegacyMetadataKeyHmac, match_data); + auto add_result = slab->AddV0Credential(v0_cred); + assert(add_result.ok()); + + auto cred_book = nearby_protocol::CredentialBook::TryCreateFromSlab(*slab); + assert(cred_book.ok()); + cred_book_ = std::move(*cred_book); + } + void TearDown(const ::benchmark::State &state) override {} +}; + +BENCHMARK_DEFINE_F(V0Encrypted, SingleMatchingCredential) +(benchmark::State &state) { + for ([[maybe_unused]] auto _ : state) { + // now that the credentials have been loaded attempt to deserialize + auto result = nearby_protocol::Deserializer::DeserializeAdvertisement( + V0AdvEncryptedPayload, cred_book_.value()); + benchmark::DoNotOptimize(result); + + // make sure this succeeded and that we could correctly decrypt the adv + assert(result.GetKind() == + nearby_protocol::DeserializeAdvertisementResultKind::V0); + assert(result.IntoV0().IntoLegible().GetIdentityKind() == + nearby_protocol::DeserializedV0IdentityKind::Decrypted); + } +} + +BENCHMARK_REGISTER_F(V0Encrypted, SingleMatchingCredential) + ->RangeMultiplier(10) + ->Range(1, 1000) + ->Unit(benchmark::kMicrosecond); + +class V1SigEncryptedSingleSection : public benchmark::Fixture { +public: + std::optional<nearby_protocol::CredentialBook> cred_book_; + void SetUp(const ::benchmark::State &state) override { + // populate credential book + auto num_creds = state.range(0); + auto slab = nearby_protocol::CredentialSlab::TryCreate(); + assert(slab.ok()); + for (int i = 1; i < num_creds; i++) { + auto credential = GenerateRandomCredentialV1(); + auto result = slab->AddV1Credential(credential); + assert(result.ok()); + } + // now at the end of the list add the matching credential + nearby_protocol::MatchedCredentialData match_data(123, + V1AdvEncryptedMetadata); + nearby_protocol::V1MatchableCredential v1_cred( + V1AdvKeySeed, V1AdvExpectedUnsignedMetadataKeyHmac, + V1AdvExpectedSignedMetadataKeyHmac, V1AdvPublicKey, match_data); + auto add_result = slab->AddV1Credential(v1_cred); + assert(add_result.ok()); + auto cred_book = nearby_protocol::CredentialBook::TryCreateFromSlab(*slab); + assert(cred_book.ok()); + cred_book_ = std::move(*cred_book); + } + void TearDown(const ::benchmark::State &state) override {} +}; + +BENCHMARK_DEFINE_F(V1SigEncryptedSingleSection, SingleMatchingCredential) +(benchmark::State &state) { + for ([[maybe_unused]] auto _ : state) { + // now that the credentials have been loaded attempt to deserialize + auto result = nearby_protocol::Deserializer::DeserializeAdvertisement( + V1AdvEncrypted, cred_book_.value()); + benchmark::DoNotOptimize(result); + + // make sure this succeeded and that we could correctly decrypt the adv + assert(result.GetKind() == + nearby_protocol::DeserializeAdvertisementResultKind::V1); + assert(result.IntoV1().GetNumLegibleSections() == 1); + } +} + +BENCHMARK_REGISTER_F(V1SigEncryptedSingleSection, SingleMatchingCredential) + ->RangeMultiplier(10) + ->Range(1, 1000) + ->Unit(benchmark::kMicrosecond); + +struct V1CredentialData { + uint32_t cred_id; + std::array<uint8_t, 32> key_seed; + std::array<uint8_t, 32> expected_unsigned_metadata_key_hmac; + std::array<uint8_t, 32> expected_signed_metadata_key_hmac; + std::array<uint8_t, 32> pub_key; + std::array<uint8_t, 500> encrypted_metadata_bytes; +}; + +V1CredentialData GenerateData() { + return { + .cred_id = static_cast<uint32_t>(rand()), + .key_seed = create_random_array<32>(), + .expected_unsigned_metadata_key_hmac = create_random_array<32>(), + .expected_signed_metadata_key_hmac = create_random_array<32>(), + .pub_key = create_random_array<32>(), + .encrypted_metadata_bytes = create_random_array<500>(), + }; +} + +class LoadCredentialBook : public benchmark::Fixture { +public: + std::vector<V1CredentialData> creds_; + // generate all the data in setup so the time for generation is not included + // in the measurement + void SetUp(const ::benchmark::State &state) override { + // populate credential book + auto num_creds = state.range(0); + for (int i = 1; i < num_creds; i++) { + auto credential = GenerateData(); + creds_.push_back(credential); + } + } +}; + +BENCHMARK_DEFINE_F(LoadCredentialBook, SingleMatchingCredential) +(benchmark::State &state) { + for ([[maybe_unused]] auto _ : state) { + auto slab = nearby_protocol::CredentialSlab::TryCreate(); + assert(slab.ok()); + for (auto cred : creds_) { + nearby_protocol::MatchedCredentialData m(cred.cred_id, + cred.encrypted_metadata_bytes); + nearby_protocol::V1MatchableCredential v1_cred( + cred.key_seed, cred.expected_unsigned_metadata_key_hmac, + cred.expected_signed_metadata_key_hmac, cred.pub_key, m); + auto result = slab->AddV1Credential(v1_cred); + assert(result.ok()); + } + auto book = nearby_protocol::CredentialBook::TryCreateFromSlab(*slab); + assert(book.ok()); + benchmark::DoNotOptimize(book); + } +} + +BENCHMARK_REGISTER_F(LoadCredentialBook, SingleMatchingCredential) + ->RangeMultiplier(10) + ->Range(1, 1000) + ->Unit(benchmark::kMicrosecond); + +BENCHMARK_MAIN();
diff --git a/nearby/presence/np_cpp_ffi/benchmarks/np_ffi_bench.cc b/nearby/presence/np_cpp_ffi/benchmarks/np_ffi_bench.cc deleted file mode 100644 index 164bab3..0000000 --- a/nearby/presence/np_cpp_ffi/benchmarks/np_ffi_bench.cc +++ /dev/null
@@ -1,111 +0,0 @@ -// 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_slab = nearby_protocol::CredentialSlab::TryCreate(); - assert(cred_slab.ok()); - auto cred_book = nearby_protocol::CredentialBook::TryCreateFromSlab(cred_slab.value()); - 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 slab_result = np_ffi::internal::np_ffi_create_credential_slab(); - assert( - np_ffi::internal::np_ffi_CreateCredentialSlabResult_kind(slab_result) == - np_ffi::internal::CreateCredentialSlabResultKind::Success); - auto slab = np_ffi::internal::np_ffi_CreateCredentialSlabResult_into_SUCCESS( - slab_result); - - auto book_result = np_ffi::internal::np_ffi_create_credential_book_from_slab(slab); - 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();
diff --git a/nearby/presence/np_cpp_ffi/fuzz/CMakeLists.txt b/nearby/presence/np_cpp_ffi/fuzz/CMakeLists.txt index 0a1c088..e9decf3 100644 --- a/nearby/presence/np_cpp_ffi/fuzz/CMakeLists.txt +++ b/nearby/presence/np_cpp_ffi/fuzz/CMakeLists.txt
@@ -12,21 +12,19 @@ # See the License for the specific language governing permissions and # limitations under the License. -cmake_minimum_required(VERSION 3.0) +fuzztest_setup_fuzzing_flags() -# libfuzzer needs clang -SET(CMAKE_C_COMPILER "clang") -SET(CMAKE_CXX_COMPILER "clang++") +add_executable( + deserialization_fuzzer + deserialization_fuzzer.cc +) -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) +target_link_libraries( + deserialization_fuzzer + PRIVATE + 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) +link_fuzztest(deserialization_fuzzer) +gtest_discover_tests(deserialization_fuzzer)
diff --git a/nearby/presence/np_cpp_ffi/fuzz/corpus/V0AdvEmpty b/nearby/presence/np_cpp_ffi/fuzz/corpus/V0AdvEmpty deleted file mode 100644 index f76dd23..0000000 --- a/nearby/presence/np_cpp_ffi/fuzz/corpus/V0AdvEmpty +++ /dev/null Binary files differ
diff --git a/nearby/presence/np_cpp_ffi/fuzz/corpus/V0AdvSimple b/nearby/presence/np_cpp_ffi/fuzz/corpus/V0AdvSimple deleted file mode 100644 index fac97f6..0000000 --- a/nearby/presence/np_cpp_ffi/fuzz/corpus/V0AdvSimple +++ /dev/null Binary files differ
diff --git a/nearby/presence/np_cpp_ffi/fuzz/corpus/V1AdvSimple b/nearby/presence/np_cpp_ffi/fuzz/corpus/V1AdvSimple deleted file mode 100644 index 4acdf33..0000000 --- a/nearby/presence/np_cpp_ffi/fuzz/corpus/V1AdvSimple +++ /dev/null
@@ -1 +0,0 @@ - \ No newline at end of file
diff --git a/nearby/presence/np_cpp_ffi/fuzz/deserialization_fuzzer.cc b/nearby/presence/np_cpp_ffi/fuzz/deserialization_fuzzer.cc new file mode 100644 index 0000000..d18b83e --- /dev/null +++ b/nearby/presence/np_cpp_ffi/fuzz/deserialization_fuzzer.cc
@@ -0,0 +1,307 @@ +// Copyright 2024 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 <array> +#include <cstdint> +#include <random> +#include <span> +#include <utility> +#include <vector> + +#include "fuzztest/domain_core.h" +#include "fuzztest/fuzztest.h" +#include "gtest/gtest.h" +#include "nearby_protocol.h" +#include "np_cpp_ffi_types.h" +#include "shared_test_util.h" + +// redefine test data as std::vector types since fuzztest does not support +// template class use in its input domains (ie: std::array<T, N>), and we want +// to use our test data to seed the fuzzer +static std::vector<uint8_t> V0AdvEmptyVec(V0AdvEmptyBytes.begin(), + V0AdvEmptyBytes.end()); +static std::vector<uint8_t> V1AdvEmptyVec(V1AdvEmptyBytes.begin(), + V1AdvEmptyBytes.end()); +static std::vector<uint8_t> V0AdvPlaintextVec(V0AdvPlaintextBytes.begin(), + V0AdvPlaintextBytes.end()); +static std::vector<uint8_t> V0AdvPlaintextMultiDeVec( + V0AdvPlaintextMultiDeBytes.begin(), V0AdvPlaintextMultiDeBytes.end()); +static std::vector<uint8_t> V1AdvPlaintextVec(V1AdvPlaintextBytes.begin(), + V1AdvPlaintextBytes.end()); +static std::vector<uint8_t> V0AdvEncryptedVec(V0AdvEncryptedBytes.begin(), + V0AdvEncryptedBytes.end()); +static std::vector<uint8_t> V1AdvEncryptedVec(V1AdvEncryptedBytes.begin(), + V1AdvEncryptedBytes.end()); + +void HandleAdvertisementResult(nearby_protocol::DeserializeAdvertisementResult); + +void PlaintextDeserializer(std::span<const uint8_t> adv_bytes) { + auto slab = nearby_protocol::CredentialSlab::TryCreate(); + EXPECT_TRUE(slab.ok()); + auto book = nearby_protocol::CredentialBook::TryCreateFromSlab(*slab); + EXPECT_TRUE(book.ok()); + auto buffer = nearby_protocol::ByteBuffer<255>::TryFromSpan(adv_bytes); + EXPECT_TRUE(buffer.ok()); + + nearby_protocol::RawAdvertisementPayload payload( + (nearby_protocol::ByteBuffer<255>(*buffer))); + auto deserialize_result = + nearby_protocol::Deserializer::DeserializeAdvertisement(payload, *book); + + // Since we are seeding with valid data, we can add extra calls into the + // result processing APIs to ensure none of the internal asserts are + // triggered. + HandleAdvertisementResult(std::move(deserialize_result)); +} + +FUZZ_TEST(NpCppDeserializationFuzzers, PlaintextDeserializer) + .WithDomains(fuzztest::Arbitrary<std::vector<uint8_t>>() + .WithMinSize(0) + .WithMaxSize(255)) + .WithSeeds({V0AdvEmptyVec, V1AdvEmptyVec, V0AdvPlaintextVec, + V0AdvPlaintextMultiDeVec, V1AdvPlaintextVec, V0AdvEncryptedVec, + V1AdvEncryptedVec}); + +// The data which is automatically generated by the fuzzer +struct IdentityData { + uint32_t credential_id; + std::array<uint8_t, 32> key_seed; + std::array<uint8_t, 32> legacy_metadata_key_hmac; + std::array<uint8_t, 32> expected_unsigned_metadata_key_hmac; + std::array<uint8_t, 32> expected_signed_metadata_key_hmac; + std::array<uint8_t, 32> pub_key; + std::vector<uint8_t> encrypted_metadata_bytes; +}; + +static struct IdentityData V0TestCaseIdentityData { + .credential_id = static_cast<uint32_t>(rand()), .key_seed = V0AdvKeySeed, + .legacy_metadata_key_hmac = V0AdvLegacyMetadataKeyHmac, + .encrypted_metadata_bytes = V0AdvEncryptedMetadata +}; + +static struct IdentityData V1TestCaseIdentityData { + .credential_id = static_cast<uint32_t>(rand()), .key_seed = V1AdvKeySeed, + .expected_unsigned_metadata_key_hmac = V1AdvExpectedUnsignedMetadataKeyHmac, + .expected_signed_metadata_key_hmac = V1AdvExpectedSignedMetadataKeyHmac, + .pub_key = V1AdvPublicKey, .encrypted_metadata_bytes = V1AdvEncryptedMetadata, +}; + +// Now lets try feeding the fuzzer some credential data that can successfully +// decrypt advertisements to improve its efficiency, and provide extra coverage +// on on credential/iteration code paths. +// TODO: Add more interesting credential seed data once we have C++ +// serialization APIs, ie multiple sections with multiple valid credentials +// and combinations of matching and undecryptable sections etc. +void DeserializeWithCredentials(std::span<const IdentityData> identities, + std::span<const uint8_t> adv_bytes) { + auto slab = nearby_protocol::CredentialSlab::TryCreate(); + EXPECT_TRUE(slab.ok()); + + // populate book with fuzzer generated credential data + for (auto data : identities) { + nearby_protocol::MatchedCredentialData match_data( + 123, data.encrypted_metadata_bytes); + nearby_protocol::V0MatchableCredential v0_cred( + data.key_seed, data.legacy_metadata_key_hmac, match_data); + // adding v0 credentials is infallible + EXPECT_TRUE(slab->AddV0Credential(v0_cred).ok()); + + nearby_protocol::V1MatchableCredential v1_cred( + data.key_seed, data.expected_unsigned_metadata_key_hmac, + data.expected_signed_metadata_key_hmac, data.pub_key, match_data); + [[maybe_unused]] auto result = slab->AddV1Credential(v1_cred); + } + + auto book = nearby_protocol::CredentialBook::TryCreateFromSlab(*slab); + EXPECT_TRUE(book.ok()); + auto buffer = nearby_protocol::ByteBuffer<255>::TryFromSpan(adv_bytes); + EXPECT_TRUE(buffer.ok()); + + nearby_protocol::RawAdvertisementPayload payload( + (nearby_protocol::ByteBuffer<255>(*buffer))); + auto deserialize_result = + nearby_protocol::Deserializer::DeserializeAdvertisement(payload, *book); + + // Since we are seeding with valid data, we can add extra calls into the + // result processing APIs to ensure none of the internal asserts are + // triggered. + HandleAdvertisementResult(std::move(deserialize_result)); +} + +std::vector<std::tuple<std::vector<IdentityData>, std::vector<uint8_t>>> +DeserializeWithCredentialSeedData() { + return { + {{{V0TestCaseIdentityData, V1TestCaseIdentityData}, V0AdvEncryptedVec}, + {{V0TestCaseIdentityData, V1TestCaseIdentityData}, V1AdvEncryptedVec}}, + }; +} + +TEST(NpCppDeserializationFuzzers, InvalidPublicKeyInCredential) { + std::vector<IdentityData> identities; + identities.push_back( + {1804289383, + {17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17}, + {136, 51, 222, 213, 77, 0, 146, 232, 128, 112, 213, + 31, 24, 236, 34, 69, 117, 124, 36, 223, 227, 140, + 178, 222, 119, 182, 120, 133, 252, 165, 103, 77}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + fuzztest::ToByteArray("")}); + identities.push_back({846930886, + {49, 67, 99, 30, 202, 232, 151, 75, 150, 80, 204, + 28, 72, 37, 14, 129, 88, 6, 129, 81, 249, 235, + 37, 35, 3, 212, 151, 109, 149, 25, 145, 57}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {28, 188, 235, 220, 23, 181, 145, 229, 7, 157, 112, + 193, 232, 75, 204, 219, 75, 15, 118, 131, 89, 98, + 10, 45, 85, 11, 59, 54, 164, 146, 139, 19}, + {109, 13, 182, 9, 16, 177, 83, 196, 126, 16, 22, + 20, 156, 159, 242, 20, 15, 236, 83, 118, 227, 7, + 217, 211, 158, 174, 231, 69, 44, 3, 236, 109}, + fuzztest::ToByteArray("")}); + + DeserializeWithCredentials( + identities, + fuzztest::ToByteArray( + " g\221\020\010\255iF\004]" + "\256m\267\367\\\323\270\254\360\277u\220\001\276s3\244v\204J\t" + "\017+" + "\231G\337\213F\312\026\316\023\265nS\256(" + "VD\016\246\215\353\241\021\257N\033\340\216\365\272\220O." + "\224\374\336\246\177]" + "\3107\265\357\312\254\213\237\033\324\306\021\205\323g92\321\202" + "\312" + "N\271F\003\203hV\013\314\375z*\276\007")); +} + +TEST(NpCppDeserializationFuzzers, PlaintextDeserializerRegression) { + PlaintextDeserializer(fuzztest::ToByteArray( + " 4\221\020\005\255iF\004]" + "\256\275m\267\367\\\270\254\360\277u\220\001G\337\213F\312\026\316\023" + "\265nS\256(VD\016\243\215\353\241\021\257N\020\340\216\365\272\220O." + "\224\374\336\246\177]" + "\3107\267\357\312\254\213\237\033\324\306\021\205\323g92\321\202\312N" + "\271D\003\203hV\013\314\375z*\276\007")); +} + +FUZZ_TEST(NpCppDeserializationFuzzers, DeserializeWithCredentials) + .WithDomains(fuzztest::Arbitrary<std::vector<IdentityData>>() + .WithMinSize(0) + .WithMaxSize(1000), + fuzztest::Arbitrary<std::vector<uint8_t>>() + .WithMinSize(0) + .WithMaxSize(255)) + .WithSeeds(DeserializeWithCredentialSeedData); + +// Lets encourage the fuzzer to try with a lot of credentials and make sure +// nothing falls apart. By default the vec ranges are somewhere between 1-20 +// even with setting a max of 1000, so setting a high minimum here to ensure the +// higher end of credential iteration is hit. +FUZZ_TEST(NpCppDeserializationFuzzersLotsOfCredentials, + DeserializeWithCredentials) + .WithDomains( + fuzztest::Arbitrary<std::vector<IdentityData>>().WithMinSize(10000), + fuzztest::Arbitrary<std::vector<uint8_t>>().WithMinSize(0).WithMaxSize( + 255)); + +// Helpers to trigger result processing code paths. +void HandleV0Adv(nearby_protocol::DeserializedV0Advertisement); +void HandleLegibleV0Adv(nearby_protocol::LegibleDeserializedV0Advertisement); +void HandleV0IdentityKind(nearby_protocol::DeserializedV0IdentityKind); +void HandleDataElement(nearby_protocol::V0DataElement); + +void HandleV1Adv(nearby_protocol::DeserializedV1Advertisement); +void HandleV1Section(nearby_protocol::DeserializedV1Section); +void HandleV1DataElement(nearby_protocol::V1DataElement); + +void HandleAdvertisementResult( + nearby_protocol::DeserializeAdvertisementResult result) { + switch (result.GetKind()) { + case nearby_protocol::DeserializeAdvertisementResultKind::Error: + break; + case nearby_protocol::DeserializeAdvertisementResultKind::V0: + HandleV0Adv(result.IntoV0()); + break; + case nearby_protocol::DeserializeAdvertisementResultKind::V1: + HandleV1Adv(result.IntoV1()); + break; + } +} + +void HandleV0Adv(nearby_protocol::DeserializedV0Advertisement result) { + switch (result.GetKind()) { + case nearby_protocol::DeserializedV0AdvertisementKind::Legible: + HandleLegibleV0Adv(result.IntoLegible()); + break; + case nearby_protocol::DeserializedV0AdvertisementKind:: + NoMatchingCredentials: + break; + } +} + +void HandleLegibleV0Adv( + nearby_protocol::LegibleDeserializedV0Advertisement legible_adv) { + auto num_des = legible_adv.GetNumberOfDataElements(); + auto payload = legible_adv.IntoPayload(); + for (int i = 0; i < num_des; i++) { + auto de_result = payload.TryGetDataElement(i); + if (!de_result.ok()) { + return; + } + HandleDataElement(de_result.value()); + } +} + +void HandleDataElement(nearby_protocol::V0DataElement de) { + switch (de.GetKind()) { + case nearby_protocol::V0DataElementKind::TxPower: { + [[maybe_unused]] auto tx_power = de.AsTxPower(); + break; + } + case nearby_protocol::V0DataElementKind::Actions: { + [[maybe_unused]] auto actions = de.AsActions(); + break; + } + } +} + +void HandleV1Adv(nearby_protocol::DeserializedV1Advertisement adv) { + auto legible_sections = adv.GetNumLegibleSections(); + [[maybe_unused]] auto encrypted_sections = adv.GetNumUndecryptableSections(); + for (auto i = 0; i < legible_sections; i++) { + auto section_result = adv.TryGetSection(i); + if (!section_result.ok()) { + return; + } + HandleV1Section(section_result.value()); + } +} + +void HandleV1Section(nearby_protocol::DeserializedV1Section section) { + auto num_des = section.NumberOfDataElements(); + for (auto i = 0; i < num_des; i++) { + auto de_result = section.TryGetDataElement(i); + if (!de_result.ok()) { + return; + } + } +}
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 deleted file mode 100644 index 3c409e7..0000000 --- a/nearby/presence/np_cpp_ffi/fuzz/fuzzer_np_cpp_deserialize.cc +++ /dev/null
@@ -1,54 +0,0 @@ -/* - * 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_slab = nearby_protocol::CredentialSlab::TryCreate(); - if (!credential_slab.ok()) { - printf("Error: create Credential slab failed\n"); - __builtin_trap(); - } - - auto credential_book = nearby_protocol::CredentialBook::TryCreateFromSlab(credential_slab.value()); - 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; -}
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 deleted file mode 100644 index 2475b5e..0000000 --- a/nearby/presence/np_cpp_ffi/fuzz/fuzzer_np_cpp_valid_header.cc +++ /dev/null
@@ -1,60 +0,0 @@ -/* - * 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_slab = nearby_protocol::CredentialSlab::TryCreate(); - if (!credential_slab.ok()) { - printf("Error: create Credential slab failed\n"); - __builtin_trap(); - } - - auto credential_book = nearby_protocol::CredentialBook::TryCreateFromSlab(credential_slab.value()); - 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; -}
diff --git a/nearby/presence/np_cpp_ffi/fuzz/generate_fuzz_corpus.cc b/nearby/presence/np_cpp_ffi/fuzz/generate_fuzz_corpus.cc deleted file mode 100644 index 9d28f7a..0000000 --- a/nearby/presence/np_cpp_ffi/fuzz/generate_fuzz_corpus.cc +++ /dev/null
@@ -1,44 +0,0 @@ -// 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 index 2cb410d..1cc73d7 100644 --- a/nearby/presence/np_cpp_ffi/include/nearby_protocol.h +++ b/nearby/presence/np_cpp_ffi/include/nearby_protocol.h
@@ -15,12 +15,21 @@ #ifndef NEARBY_PRESENCE_NP_CPP_FFI_INCLUDE_NP_PROTOCOL_H_ #define NEARBY_PRESENCE_NP_CPP_FFI_INCLUDE_NP_PROTOCOL_H_ +#include <array> +#include <cstddef> +#include <cstdint> +#include <memory> +#include <span> +#include <string> +#include <utility> +#include <vector> + +#include "absl/status/status.h" #include "absl/status/statusor.h" #include "absl/strings/str_format.h" +#include "absl/strings/string_view.h" #include "np_cpp_ffi_types.h" -#include <span> - // 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 @@ -52,20 +61,35 @@ namespace nearby_protocol { // Re-exporting cbindgen generated types which are used in the public API -using np_ffi::internal::AddCredentialToSlabResult; +using np_ffi::internal::AddV0CredentialToSlabResult; +using np_ffi::internal::AddV0DEResult; +using np_ffi::internal::AddV1CredentialToSlabResult; +using np_ffi::internal::AdvertisementBuilderKind; using np_ffi::internal::BooleanActionType; using np_ffi::internal::CreateCredentialBookResultKind; using np_ffi::internal::CreateCredentialSlabResultKind; +using np_ffi::internal::CreateV0AdvertisementBuilderResultKind; +using np_ffi::internal::CreateV1SectionBuilderResultKind; using np_ffi::internal::DeserializeAdvertisementResultKind; using np_ffi::internal::DeserializedV0AdvertisementKind; +using np_ffi::internal::DeserializedV0IdentityDetails; using np_ffi::internal::DeserializedV0IdentityKind; +using np_ffi::internal::DeserializedV1IdentityDetails; using np_ffi::internal::DeserializedV1IdentityKind; +using np_ffi::internal::EncryptedIdentityType; using np_ffi::internal::GetV0DEResultKind; using np_ffi::internal::PanicReason; -using np_ffi::internal::TxPower; +using np_ffi::internal::SerializeV0AdvertisementResultKind; +using np_ffi::internal::SerializeV1AdvertisementResultKind; using np_ffi::internal::V0DataElementKind; +using np_ffi::internal::V1VerificationMode; -template <uintptr_t N> using FfiByteBuffer = np_ffi::internal::ByteBuffer<N>; +const uint8_t MAX_ADV_PAYLOAD_SIZE = 255; +const uint8_t MAX_V1_DE_PAYLOAD_SIZE = 127; +const uint8_t KEY_SEED_SIZE = 32; +const uint8_t HMAC_TAG_SIZE = 32; +const uint8_t PUBLIC_SIGNING_KEY_SIZE = 32; +const uint8_t DERIVED_SALT_SIZE = 16; // All of the types defined in this header class RawAdvertisementPayload; @@ -96,11 +120,11 @@ // on memory consumption. See np_ffi_global_config_* functions in // np_cpp_ffi_functions.h for more info class GlobalConfig { -public: + 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(const GlobalConfig &) = delete; + void operator=(const GlobalConfig &) = delete; GlobalConfig() = delete; // Provides a user specified panic handler. This method will only have an @@ -139,14 +163,20 @@ // which may be active at any one time static void SetMaxNumDeserializedV1Advertisements( uint32_t max_num_deserialized_v1_advertisements); + + // Sets the maximum number of active handles to v0 advertisement builders + // which may be active at any one time + static void SetMaxNumV0AdvertisementBuilders( + uint32_t max_num_v0_advertisement_builders); }; // Holds the credentials used in the construction of a credential book // using CredentialBook::TryCreateFromSlab() class CredentialSlab { -public: - // Don't allow copy constructor or copy assignment, since that would result in - // the underlying handle being freed multiple times + public: + // Don't allow copy constructor, copy-assignment or default constructor, since + // this class wraps a handle to externally allocated resources. + CredentialSlab() = delete; CredentialSlab(const CredentialSlab &other) = delete; CredentialSlab &operator=(const CredentialSlab &other) = delete; @@ -170,7 +200,7 @@ // Adds a V1 credential to the slab [[nodiscard]] absl::Status AddV1Credential(V1MatchableCredential v1_cred); -private: + private: friend class CredentialBook; explicit CredentialSlab(np_ffi::internal::CredentialSlab credential_slab) : credential_slab_(credential_slab), moved_(false) {} @@ -183,9 +213,10 @@ // 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 + public: + // Don't allow copy constructor, copy-assignment or default constructor, since + // this class wraps a handle to externally allocated resources. + CredentialBook() = delete; CredentialBook(const CredentialBook &other) = delete; CredentialBook &operator=(const CredentialBook &other) = delete; @@ -203,10 +234,10 @@ // returning the CredentialBook on success or a Status code on failure. // The passed credential-slab will be deallocated if this operation // is successful. - [[nodiscard]] static absl::StatusOr<CredentialBook> - TryCreateFromSlab(CredentialSlab &slab); + [[nodiscard]] static absl::StatusOr<CredentialBook> TryCreateFromSlab( + CredentialSlab &slab); -private: + private: friend class Deserializer; explicit CredentialBook(np_ffi::internal::CredentialBook credential_book) : credential_book_(credential_book), moved_(false) {} @@ -218,21 +249,20 @@ // Holds data associated with a specific credential which will be returned to // the caller when it is successfully matched with an advertisement. class MatchedCredentialData { -public: + public: // Creates matched credential data from a provided credential_id used to // correlate the data back to its full credential data, and the metadata byte - // buffer as copied from the given span over bytes. After calling - // this the bytes are copied into the rust code, so the - // encrypted_metadata_bytes_buffer can be freed. + // buffer as copied from the given span over bytes. The span must be valid + // until the corresponding Add_*_Credential is called using this data. // // Safety: this is safe if the span is over a valid buffer of bytes. The copy // from the memory address isn't atomic, so concurrent modification of the // array from another thread would cause undefined behavior. - [[nodiscard]] MatchedCredentialData(uint32_t cred_id, - std::span<uint8_t> metadata_bytes); + [[nodiscard]] MatchedCredentialData( + uint32_t cred_id, std::span<const uint8_t> encrypted_metadata_bytes); -private: - np_ffi::internal::FfiMatchedCredential data_; + private: + np_ffi::internal::FfiMatchedCredential data_{}; friend class V0MatchableCredential; friend class V1MatchableCredential; }; @@ -241,15 +271,15 @@ // advertisements, along with some provided matched data that will be returned // back to the caller upon a successful credential match. class V0MatchableCredential { -public: + public: // Creates a new V0MatchableCredential from a key seed, its calculated hmac // value and some match data. [[nodiscard]] V0MatchableCredential( - std::array<uint8_t, 32> key_seed, - std::array<uint8_t, 32> legacy_metadata_key_hmac, + std::array<uint8_t, KEY_SEED_SIZE> key_seed, + std::array<uint8_t, HMAC_TAG_SIZE> legacy_metadata_key_hmac, MatchedCredentialData matched_credential_data); -private: + private: friend class CredentialSlab; np_ffi::internal::V0MatchableCredential internal_{}; }; @@ -258,34 +288,78 @@ // advertisements, along with some provided matched data that will be returned // back to the caller upon a successful credential match. class V1MatchableCredential { -public: + public: + V1MatchableCredential() = delete; + // Creates a new V1MatchableCredential from key material, its calculated hmac // value and some match data. [[nodiscard]] V1MatchableCredential( - std::array<uint8_t, 32> key_seed, - std::array<uint8_t, 32> expected_unsigned_metadata_key_hmac, - std::array<uint8_t, 32> expected_signed_metadata_key_hmac, - std::array<uint8_t, 32> pub_key, + std::array<uint8_t, KEY_SEED_SIZE> key_seed, + std::array<uint8_t, HMAC_TAG_SIZE> expected_unsigned_metadata_key_hmac, + std::array<uint8_t, HMAC_TAG_SIZE> expected_signed_metadata_key_hmac, + std::array<uint8_t, PUBLIC_SIGNING_KEY_SIZE> pub_key, MatchedCredentialData matched_credential_data); -private: + private: friend class CredentialSlab; - np_ffi::internal::V1MatchableCredential internal_; + np_ffi::internal::V1MatchableCredential internal_{}; }; -// 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) {} +// Holds the V0 credential data needed to encrypt advertisements. +class V0BroadcastCredential { + public: + V0BroadcastCredential() = delete; + + // Creates a new V0Broadcast credential with the given + // key seed and metadata key. + [[nodiscard]] V0BroadcastCredential(std::array<uint8_t, 32> key_seed, + std::array<uint8_t, 14> metadata_key); + + private: + friend class V0AdvertisementBuilder; + np_ffi::internal::V0BroadcastCredential internal_; +}; + +// Representation of a buffer of bytes returned from and passed to Rust library +// deserialization APIs. `N` is the max size of the buffer but its actual +// contents can be up to N in size. +template <size_t N> +class ByteBuffer { + public: + // Constructs a ByteBuffer from an std::array of bytes + template <size_t M> + [[nodiscard]] constexpr explicit ByteBuffer(std::array<uint8_t, M> data) { + static_assert(N >= M); + np_ffi::internal::ByteBuffer<N> internal = + np_ffi::internal::ByteBuffer<N>(); + internal.len = M; + std::copy(data.begin(), data.end(), internal.bytes); + internal_ = internal; + } + + // Creates a ByteBuffer from a std::vector<uint8_t> 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>> TryFromSpan( + std::span<const uint8_t> bytes) { + if (bytes.size() > N) { + return absl::OutOfRangeError( + absl::StrFormat("Provided bytes of length %d will not fit into a " + "ByteBuffer<N> of size N=%d", + bytes.size(), N)); + } + np_ffi::internal::ByteBuffer<N> internal = + np_ffi::internal::ByteBuffer<N>(); + internal.len = bytes.size(); + std::copy(std::begin(bytes), std::end(bytes), internal.bytes); + return ByteBuffer(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) { + [[nodiscard]] static absl::StatusOr<ByteBuffer<N>> TryFromString( + absl::string_view bytes) { if (bytes.length() > N) { return absl::OutOfRangeError( absl::StrFormat("Provided bytes of length %d will not fit into a " @@ -301,7 +375,7 @@ // 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() { + [[nodiscard]] std::vector<uint8_t> ToVector() const { std::vector<uint8_t> result(internal_.bytes, internal_.bytes + internal_.len); return result; @@ -310,64 +384,71 @@ // 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() { + [[nodiscard]] std::string ToString() const { std::string result; result.assign(internal_.bytes, internal_.bytes + internal_.len); return result; } + // 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(np_ffi::internal::ByteBuffer<N> internal) + : internal_(internal) {} -private: + private: + friend class V0AdvertisementBuilder; friend class V1DataElement; friend class Deserializer; np_ffi::internal::ByteBuffer<N> internal_; }; class RawAdvertisementPayload { -public: + public: // Creates a RawAdvertisementPayload from a ByteBuffer. - explicit RawAdvertisementPayload(ByteBuffer<255> bytes) : buffer_(bytes) {} + explicit constexpr RawAdvertisementPayload( + ByteBuffer<MAX_ADV_PAYLOAD_SIZE> bytes) + : buffer_(bytes) {} - ByteBuffer<255> buffer_; - -private: + private: + ByteBuffer<MAX_ADV_PAYLOAD_SIZE> buffer_; friend class Deserializer; }; // A global static Deserializer, configured by GlobalConfig and used to // deserialize advertisement payloads class Deserializer { -public: + 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); + [[nodiscard]] static DeserializeAdvertisementResult DeserializeAdvertisement( + const 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 + public: + // Don't allow copy constructor, copy-assignment or default constructor, since + // this class wraps a handle to externally allocated resources. + DeserializeAdvertisementResult() = delete; DeserializeAdvertisementResult(const DeserializeAdvertisementResult &other) = delete; - DeserializeAdvertisementResult & - operator=(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; + DeserializeAdvertisementResult &operator=( + DeserializeAdvertisementResult &&other) noexcept; // Frees the underlying resources of the result. ~DeserializeAdvertisementResult(); // Returns the DeserializeAdvertisementResultKind of the Result - [[nodiscard]] DeserializeAdvertisementResultKind GetKind(); + [[nodiscard]] DeserializeAdvertisementResultKind GetKind() const; // Casts a `DeserializeAdvertisementResult` to the `V0` variant, panicking in // the case where the passed value is of a different enum variant. This can @@ -381,7 +462,7 @@ // is no longer valid. [[nodiscard]] DeserializedV1Advertisement IntoV1(); -private: + private: friend class Deserializer; explicit DeserializeAdvertisementResult( np_ffi::internal::DeserializeAdvertisementResult result) @@ -393,25 +474,26 @@ // 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 + public: + // Don't allow copy constructor, copy-assignment or default constructor, since + // this class wraps a handle to externally allocated resources. + DeserializedV0Advertisement() = delete; DeserializedV0Advertisement(const DeserializedV0Advertisement &other) = delete; - DeserializedV0Advertisement & - operator=(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; + 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(); + [[nodiscard]] DeserializedV0AdvertisementKind GetKind() const; // Casts a `DeserializedV0Advertisement` to the `Legible` variant, panicking // in the case where the passed value is of a different enum variant. @@ -419,7 +501,7 @@ // `LegibleDeserializedV0Advertisement`, and this object is no longer valid. [[nodiscard]] LegibleDeserializedV0Advertisement IntoLegible(); -private: + private: friend class DeserializeAdvertisementResult; explicit DeserializedV0Advertisement( np_ffi::internal::DeserializedV0Advertisement v0_advertisement) @@ -433,19 +515,20 @@ // 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 + public: + // Don't allow copy constructor, copy-assignment or default constructor, since + // this class wraps a handle to externally allocated resources. + LegibleDeserializedV0Advertisement() = delete; LegibleDeserializedV0Advertisement( const LegibleDeserializedV0Advertisement &other) = delete; - LegibleDeserializedV0Advertisement & - operator=(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; + 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. @@ -453,13 +536,13 @@ // Returns just the kind of identity (public/encrypted) // associated with the advertisement - [[nodiscard]] DeserializedV0IdentityKind GetIdentityKind(); + [[nodiscard]] DeserializedV0IdentityKind GetIdentityKind() const; // Returns the number of data elements in the advertisement - [[nodiscard]] uint8_t GetNumberOfDataElements(); + [[nodiscard]] uint8_t GetNumberOfDataElements() const; // Returns just the data-element payload of the advertisement [[nodiscard]] V0Payload IntoPayload(); -private: + private: friend class DeserializedV0Advertisement; explicit LegibleDeserializedV0Advertisement( np_ffi::internal::LegibleDeserializedV0Advertisement @@ -473,9 +556,10 @@ // 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. + public: + // Don't allow copy constructor, copy-assignment or default constructor, since + // this class wraps a handle to externally allocated resources. + V0Payload() = delete; V0Payload(const V0Payload &other) = delete; V0Payload &operator=(const V0Payload &other) = delete; @@ -488,9 +572,20 @@ // 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); + [[nodiscard]] absl::StatusOr<V0DataElement> TryGetDataElement( + uint8_t index) const; -private: + // Decrypts the metadata of the credential which matched with this + // advertisement, or returns an error if the metadata key is invalid and + // unable to successfully decrypt the metadata. + [[nodiscard]] absl::StatusOr<std::vector<uint8_t>> DecryptMetadata() const; + + // Gets the details of the identity data element of this payload or returns an + // error if the payload does not have an identity (public advertisement) + [[nodiscard]] absl::StatusOr<DeserializedV0IdentityDetails> + GetIdentityDetails() const; + + private: friend class LegibleDeserializedV0Advertisement; explicit V0Payload(np_ffi::internal::V0Payload v0_payload) : v0_payload_(v0_payload), moved_(false) {} @@ -499,40 +594,102 @@ bool moved_; }; -// A single deserialized V0 data element +// A Tx Power [transmission power] between -100dBm and 20dBm +class TxPower { + public: + TxPower() = delete; + + // Gets the value of this tx power as a signed byte. + [[nodiscard]] int8_t GetAsI8() const; + + // Attempts to construct a tx power with the given value contained + // in a signed byte. If the number is not within the representable + // range, this method will return an invalid argument error. + [[nodiscard]] static absl::StatusOr<TxPower> TryBuildFromI8(int8_t value); + + private: + friend class V0DataElement; + explicit TxPower(np_ffi::internal::TxPower tx_power) : tx_power_(tx_power) {} + np_ffi::internal::TxPower tx_power_; +}; + +// A single V0 data element class V0DataElement { -public: + public: // Yields the V0DataElementKind of the data element - [[nodiscard]] V0DataElementKind GetKind(); + [[nodiscard]] V0DataElementKind GetKind() const; // Casts the V0DataElement into the TxPower variant, panicking in the case // where the data element is of a different enum variant - [[nodiscard]] TxPower AsTxPower(); + [[nodiscard]] TxPower AsTxPower() const; // Casts the V0DataElement into the Actions variant, panicking in the case // where the data element is of a different enum variant - [[nodiscard]] V0Actions AsActions(); + [[nodiscard]] V0Actions AsActions() const; -private: + // Constructs a Tx Power V0 data element + explicit V0DataElement(TxPower tx_power); + // Constructs an Actions V0 data element + explicit V0DataElement(V0Actions actions); + + private: + friend class V0AdvertisementBuilder; 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 Context Sync Sequence Number [0-15] +class ContextSyncSeqNum { + public: + ContextSyncSeqNum() = delete; + + // Gets the value of this context-sync sequence number. + [[nodiscard]] uint8_t GetAsU8() const; + + // Attempts to construct a context-sync sequence number with the given + // value contained in an unsigned byte. If the number may not be + // represented in a single nibble, this method will return an + // invalid argument error. + [[nodiscard]] static absl::StatusOr<ContextSyncSeqNum> TryBuildFromU8( + uint8_t value); + + private: + friend class V0Actions; + explicit ContextSyncSeqNum(np_ffi::internal::ContextSyncSeqNum seq_num) + : seq_num_(seq_num) {} + np_ffi::internal::ContextSyncSeqNum seq_num_; +}; + // A V0 Actions Data Element class V0Actions { -public: + public: + V0Actions() = delete; + // 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(); + [[nodiscard]] uint32_t GetAsU32() const; /// Return whether a boolean action type is present in this data element - [[nodiscard]] bool HasAction(BooleanActionType action); + [[nodiscard]] bool HasAction(BooleanActionType action) const; - /// Gets the 4 bit context sync sequence number as a uint8_t from this data - /// element - [[nodiscard]] uint8_t GetContextSyncSequenceNumber(); + /// Gets the 4 bit context sync sequence number from this data element + [[nodiscard]] ContextSyncSeqNum GetContextSyncSequenceNumber() const; -private: + /// Attempts to set the given action bit to the given boolean value. + /// This operation may fail with an invalid argument error + /// if the requested action bit may not be set given the encoding + /// of the containing advertisement. + /// In this case, the action bits will be unaltered by this call. + absl::Status TrySetAction(BooleanActionType action, bool value); + + /// Sets the context sync sequence number. + void SetContextSyncSequenceNumber(ContextSyncSeqNum seq_num); + + // Constructs an all-zeroed V0 actions DE for the given advertisement builder + // kind. + [[nodiscard]] static V0Actions BuildNewZeroed(AdvertisementBuilderKind kind); + + private: friend class V0DataElement; explicit V0Actions(np_ffi::internal::V0Actions actions) : actions_(actions) {} np_ffi::internal::V0Actions actions_; @@ -540,32 +697,33 @@ // 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 + public: + // Don't allow copy constructor, copy-assignment or default constructor, since + // this class wraps a handle to externally allocated resources. + DeserializedV1Advertisement() = delete; DeserializedV1Advertisement(const DeserializedV1Advertisement &other) = delete; - DeserializedV1Advertisement & - operator=(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; + 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(); + [[nodiscard]] uint8_t GetNumLegibleSections() const; // 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(); + [[nodiscard]] uint8_t GetNumUndecryptableSections() const; // 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); + [[nodiscard]] absl::StatusOr<DeserializedV1Section> TryGetSection( + uint8_t section_index) const; -private: + private: friend class DeserializeAdvertisementResult; explicit DeserializedV1Advertisement( np_ffi::internal::DeserializedV1Advertisement v1_advertisement); @@ -576,15 +734,34 @@ // A Deserialized V1 Section of an advertisement class DeserializedV1Section { -public: + 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); + [[nodiscard]] uint8_t NumberOfDataElements() const; -private: + // Returns the DeserializedV1IdentityKind of the identity + [[nodiscard]] DeserializedV1IdentityKind GetIdentityKind() const; + + // Tries to get the data element in the section at the given index + [[nodiscard]] absl::StatusOr<V1DataElement> TryGetDataElement( + uint8_t index) const; + + // Decrypts the metadata of the credential which matched with this section + [[nodiscard]] absl::StatusOr<std::vector<uint8_t>> DecryptMetadata() const; + + // Gets the details of the identity data element of this section or returns an + // error if the section does not contain an identity (public section) + [[nodiscard]] absl::StatusOr<DeserializedV1IdentityDetails> + GetIdentityDetails() const; + + // Attempts to derive a 16-byte DE salt for a DE in this section with the + // given DE offset. This operation may fail if the passed offset is 255 + // (causes overflow) or if the section is leveraging a public identity, and + // hence, doesn't have an associated salt. The offset should come from a + // particular deserialized v1 de via `V1DataElement::GetOffset()` + [[nodiscard]] absl::StatusOr<std::array<uint8_t, DERIVED_SALT_SIZE>> + DeriveSaltForOffset(uint8_t offset) const; + + private: friend class DeserializedV1Advertisement; explicit DeserializedV1Section( np_ffi::internal::DeserializedV1Section section, @@ -599,19 +776,81 @@ // A V1 Data Element class V1DataElement { -public: + 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; + [[nodiscard]] ByteBuffer<MAX_V1_DE_PAYLOAD_SIZE> GetPayload() const; + /// Gets the offset for this V1 data element. + [[nodiscard]] uint8_t GetOffset() const; -private: + 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 +// A builder for V0 advertisements +class V0AdvertisementBuilder { + public: + V0AdvertisementBuilder() = delete; + // Don't allow copy constructor or copy assignment, since that would result in + // the underlying handle being freed multiple times + V0AdvertisementBuilder(const V0AdvertisementBuilder &other) = delete; + V0AdvertisementBuilder &operator=(const V0AdvertisementBuilder &other) = + delete; -#endif // NEARBY_PRESENCE_NP_CPP_FFI_INCLUDE_NP_PROTOCOL_H_ + // Move constructor and move assignment operators + V0AdvertisementBuilder(V0AdvertisementBuilder &&other) noexcept; + V0AdvertisementBuilder &operator=(V0AdvertisementBuilder &&other) noexcept; + + // Frees the underlying resources of the adv builder. + ~V0AdvertisementBuilder(); + + // Tries to add the given data element to the advertisement builder. + // May fail with: + // - An invalid argument code if: + // - The adv builder handle is invalid + // OR + // - The identity type of the adv builder is invalid + // for the data element we're attempting to add. + // - A resource exhausted error if there's no remaining adv space. + absl::Status TryAddDE(V0DataElement de); + + // Attempts to serialize the contents of the advertisement + // builder to bytes. This operation will always result in the + // contents behind the handle for this instance being deallocated. + // + // This operation may return an out-of-range error in the case + // where the advertisement contents are of a size inappropriate + // for LDT encryption in an encrypted V0 advertisement. + [[nodiscard]] absl::StatusOr<ByteBuffer<24>> TrySerialize(); + + // Creates a new V0 advertisement builder for a public advertisement, + // or returns a Status code on failure. + [[nodiscard]] static absl::StatusOr<V0AdvertisementBuilder> TryCreatePublic(); + + // Creates a new V0 advertisement builder for an encrypted advertisement, + // or returns a Status code on failure. + [[nodiscard]] static absl::StatusOr<V0AdvertisementBuilder> + TryCreateEncrypted(V0BroadcastCredential broadcast_cred, + EncryptedIdentityType identity_type, + std::array<uint8_t, 2> salt); + + private: + [[nodiscard]] static absl::StatusOr<V0AdvertisementBuilder> + CreateV0AdvertisementBuilderResultToInternal( + np_ffi::internal::CreateV0AdvertisementBuilderResult result); + + explicit V0AdvertisementBuilder( + np_ffi::internal::V0AdvertisementBuilder adv_builder) + : adv_builder_(adv_builder), moved_(false) {} + + np_ffi::internal::V0AdvertisementBuilder adv_builder_; + bool moved_; +}; + +} // 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 index b6730ef..360f7ad 100644 --- a/nearby/presence/np_cpp_ffi/nearby_protocol.cc +++ b/nearby/presence/np_cpp_ffi/nearby_protocol.cc
@@ -12,29 +12,36 @@ // See the License for the specific language governing permissions and // limitations under the License. -#include "include/nearby_protocol.h" +#include "nearby_protocol.h" +#include <array> +#include <cstddef> +#include <cstdint> +#include <cstdlib> +#include <iostream> +#include <memory> +#include <span> +#include <utility> +#include <vector> + +#include "absl/status/status.h" +#include "absl/status/statusor.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__ */ +#include "np_cpp_ffi_types.h" namespace nearby_protocol { -static void panic_handler(PanicReason reason); +void panic_handler(PanicReason reason); struct PanicHandler { void (*handler)(PanicReason); bool set_by_client; }; -static PanicHandler gPanicHandler = PanicHandler{panic_handler, false}; +PanicHandler gPanicHandler = PanicHandler{panic_handler, false}; // C++ layer internal panic handler -static void panic_handler(PanicReason reason) { +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) { @@ -43,8 +50,8 @@ std::abort(); } -static void _assert_panic(bool condition, const char *func, const char *file, - int line) { +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"; @@ -52,7 +59,7 @@ } } -#define assert_panic(e) _assert_panic(e, __func__, __ASSERT_FILE_NAME, __LINE__) +#define assert_panic(e) _assert_panic(e, __func__, __FILE__, __LINE__) bool GlobalConfig::SetPanicHandler(void (*handler)(PanicReason)) { if (!gPanicHandler.set_by_client) { @@ -63,49 +70,57 @@ return false; } -void GlobalConfig::SetNumShards(uint8_t num_shards) { +void GlobalConfig::SetNumShards(const uint8_t num_shards) { np_ffi::internal::np_ffi_global_config_set_num_shards(num_shards); } -void GlobalConfig::SetMaxNumCredentialSlabs(uint32_t max_num_credential_slabs) { +void GlobalConfig::SetMaxNumCredentialSlabs( + const uint32_t max_num_credential_slabs) { np_ffi::internal::np_ffi_global_config_set_max_num_credential_slabs( max_num_credential_slabs); } -void GlobalConfig::SetMaxNumCredentialBooks(uint32_t max_num_credential_books) { +void GlobalConfig::SetMaxNumCredentialBooks( + const 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) { + const 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) { + const 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); } +void GlobalConfig::SetMaxNumV0AdvertisementBuilders( + uint32_t max_num_v0_advertisement_builders) { + np_ffi::internal::np_ffi_global_config_set_max_num_v0_advertisement_builders( + max_num_v0_advertisement_builders); +} + absl::StatusOr<CredentialSlab> CredentialSlab::TryCreate() { auto result = np_ffi::internal::np_ffi_create_credential_slab(); auto kind = np_ffi::internal::np_ffi_CreateCredentialSlabResult_kind(result); switch (kind) { - case CreateCredentialSlabResultKind::Success: { - auto slab = CredentialSlab( - np_ffi::internal::np_ffi_CreateCredentialSlabResult_into_SUCCESS( - result)); - return slab; - } - case CreateCredentialSlabResultKind::NoSpaceLeft: { - return absl::ResourceExhaustedError( - "No space left to create credential slab"); - } + case CreateCredentialSlabResultKind::Success: { + auto slab = CredentialSlab( + np_ffi::internal::np_ffi_CreateCredentialSlabResult_into_SUCCESS( + result)); + return slab; + } + case CreateCredentialSlabResultKind::NoSpaceLeft: { + return absl::ResourceExhaustedError( + "No space left to create credential slab"); + } } } @@ -117,13 +132,13 @@ } } -CredentialSlab::CredentialSlab(CredentialSlab &&other) noexcept +CredentialSlab::CredentialSlab(CredentialSlab&& other) noexcept : credential_slab_(other.credential_slab_), moved_(other.moved_) { other.credential_slab_ = {}; other.moved_ = true; } -CredentialSlab &CredentialSlab::operator=(CredentialSlab &&other) noexcept { +CredentialSlab& CredentialSlab::operator=(CredentialSlab&& other) noexcept { if (this != &other) { if (!this->moved_) { auto result = np_ffi::internal::np_ffi_deallocate_credential_slab( @@ -140,58 +155,64 @@ return *this; } -absl::Status CredentialSlab::AddV0Credential(V0MatchableCredential v0_cred) { +absl::Status CredentialSlab::AddV0Credential( + const V0MatchableCredential v0_cred) { assert_panic(!this->moved_); auto result = np_ffi::internal::np_ffi_CredentialSlab_add_v0_credential( this->credential_slab_, v0_cred.internal_); switch (result) { - case AddCredentialToSlabResult::Success: { - return absl::OkStatus(); - } - case AddCredentialToSlabResult::InvalidHandle: { - return absl::InvalidArgumentError( - "invalid credential slab handle provided"); - } + case AddV0CredentialToSlabResult::Success: { + return absl::OkStatus(); + } + case AddV0CredentialToSlabResult::InvalidHandle: { + return absl::InvalidArgumentError( + "invalid credential slab handle provided"); + } } } -absl::Status CredentialSlab::AddV1Credential(V1MatchableCredential v1_cred) { +absl::Status CredentialSlab::AddV1Credential( + const V1MatchableCredential v1_cred) { assert_panic(!this->moved_); auto result = np_ffi::internal::np_ffi_CredentialSlab_add_v1_credential( this->credential_slab_, v1_cred.internal_); switch (result) { - case AddCredentialToSlabResult::Success: { - return absl::OkStatus(); - } - case AddCredentialToSlabResult::InvalidHandle: { - return absl::InvalidArgumentError( - "invalid credential slab handle provided"); - } + case AddV1CredentialToSlabResult::Success: { + return absl::OkStatus(); + } + case AddV1CredentialToSlabResult::InvalidHandle: { + return absl::InvalidArgumentError( + "invalid credential slab handle provided"); + } + case AddV1CredentialToSlabResult::InvalidPublicKeyBytes: { + return absl::InvalidArgumentError( + "Invalid public key bytes in credential"); + } } } -absl::StatusOr<CredentialBook> -CredentialBook::TryCreateFromSlab(CredentialSlab &slab) { +absl::StatusOr<CredentialBook> CredentialBook::TryCreateFromSlab( + CredentialSlab& slab) { assert_panic(!slab.moved_); auto result = np_ffi::internal::np_ffi_create_credential_book_from_slab( slab.credential_slab_); auto kind = np_ffi::internal::np_ffi_CreateCredentialBookResult_kind(result); switch (kind) { - case CreateCredentialBookResultKind::Success: { - auto book = - np_ffi::internal::np_ffi_CreateCredentialBookResult_into_SUCCESS( - result); - slab.moved_ = true; - return CredentialBook(book); - } - case CreateCredentialBookResultKind::NoSpaceLeft: { - return absl::ResourceExhaustedError( - "No space left to create credential book"); - } - case CreateCredentialBookResultKind::InvalidSlabHandle: { - return absl::NotFoundError( - "The slab referenced by the given handle was not found."); - } + case CreateCredentialBookResultKind::Success: { + auto book = + np_ffi::internal::np_ffi_CreateCredentialBookResult_into_SUCCESS( + result); + slab.moved_ = true; + return CredentialBook(book); + } + case CreateCredentialBookResultKind::NoSpaceLeft: { + return absl::ResourceExhaustedError( + "No space left to create credential book"); + } + case CreateCredentialBookResultKind::InvalidSlabHandle: { + return absl::NotFoundError( + "The slab referenced by the given handle was not found."); + } } } @@ -203,13 +224,13 @@ } } -CredentialBook::CredentialBook(CredentialBook &&other) noexcept +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 { +CredentialBook& CredentialBook::operator=(CredentialBook&& other) noexcept { if (this != &other) { if (!this->moved_) { auto result = np_ffi::internal::np_ffi_deallocate_credential_book( @@ -226,16 +247,17 @@ return *this; } -DeserializeAdvertisementResult -Deserializer::DeserializeAdvertisement(RawAdvertisementPayload &payload, - const CredentialBook &credential_book) { +DeserializeAdvertisementResult Deserializer::DeserializeAdvertisement( + const 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() { +DeserializeAdvertisementResultKind DeserializeAdvertisementResult::GetKind() + const { assert_panic(!this->moved_); return np_ffi::internal::np_ffi_DeserializeAdvertisementResult_kind(result_); } @@ -266,14 +288,14 @@ } DeserializeAdvertisementResult::DeserializeAdvertisementResult( - DeserializeAdvertisementResult &&other) noexcept + DeserializeAdvertisementResult&& other) noexcept : result_(other.result_), moved_(other.moved_) { other.result_ = {}; other.moved_ = true; } -DeserializeAdvertisementResult &DeserializeAdvertisementResult::operator=( - DeserializeAdvertisementResult &&other) noexcept { +DeserializeAdvertisementResult& DeserializeAdvertisementResult::operator=( + DeserializeAdvertisementResult&& other) noexcept { if (this != &other) { if (!this->moved_) { auto result = @@ -292,14 +314,14 @@ // V0 Stuff DeserializedV0Advertisement::DeserializedV0Advertisement( - DeserializedV0Advertisement &&other) noexcept + DeserializedV0Advertisement&& other) noexcept : v0_advertisement_(other.v0_advertisement_), moved_(other.moved_) { other.v0_advertisement_ = {}; other.moved_ = true; } -DeserializedV0Advertisement &DeserializedV0Advertisement::operator=( - DeserializedV0Advertisement &&other) noexcept { +DeserializedV0Advertisement& DeserializedV0Advertisement::operator=( + DeserializedV0Advertisement&& other) noexcept { if (this != &other) { if (!this->moved_) { auto result = @@ -326,7 +348,7 @@ } np_ffi::internal::DeserializedV0AdvertisementKind -DeserializedV0Advertisement::GetKind() { +DeserializedV0Advertisement::GetKind() const { assert_panic(!this->moved_); return np_ffi::internal::np_ffi_DeserializedV0Advertisement_kind( v0_advertisement_); @@ -343,16 +365,16 @@ } LegibleDeserializedV0Advertisement::LegibleDeserializedV0Advertisement( - LegibleDeserializedV0Advertisement &&other) noexcept + LegibleDeserializedV0Advertisement&& other) noexcept : legible_v0_advertisement_(other.legible_v0_advertisement_), moved_(other.moved_) { other.moved_ = true; other.legible_v0_advertisement_ = {}; } -LegibleDeserializedV0Advertisement & +LegibleDeserializedV0Advertisement& LegibleDeserializedV0Advertisement::operator=( - LegibleDeserializedV0Advertisement &&other) noexcept { + LegibleDeserializedV0Advertisement&& other) noexcept { if (this != &other) { if (!this->moved_) { auto result = @@ -377,8 +399,8 @@ } } -DeserializedV0IdentityKind -LegibleDeserializedV0Advertisement::GetIdentityKind() { +DeserializedV0IdentityKind LegibleDeserializedV0Advertisement::GetIdentityKind() + const { assert_panic(!this->moved_); auto result = np_ffi::internal:: np_ffi_LegibleDeserializedV0Advertisement_get_identity_kind( @@ -386,7 +408,7 @@ return result; } -uint8_t LegibleDeserializedV0Advertisement::GetNumberOfDataElements() { +uint8_t LegibleDeserializedV0Advertisement::GetNumberOfDataElements() const { assert_panic(!this->moved_); return np_ffi::internal:: np_ffi_LegibleDeserializedV0Advertisement_get_num_des( @@ -401,13 +423,13 @@ return V0Payload(result); } -V0Payload::V0Payload(V0Payload &&other) noexcept +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 { +V0Payload& V0Payload::operator=(V0Payload&& other) noexcept { if (this != &other) { if (!this->moved_) { auto result = @@ -431,51 +453,199 @@ } } -absl::StatusOr<V0DataElement> V0Payload::TryGetDataElement(uint8_t index) { +absl::StatusOr<V0DataElement> V0Payload::TryGetDataElement( + const uint8_t index) const { 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"); - } + 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() { +absl::StatusOr<std::vector<uint8_t>> MetadataResultToVec( + np_ffi::internal::DecryptMetadataResult decrypt_result) { + auto kind = + np_ffi::internal::np_ffi_DecryptMetadataResult_kind(decrypt_result); + switch (kind) { + case np_ffi::internal::DecryptMetadataResultKind::Success: { + auto metadata = + np_ffi::internal::np_ffi_DecryptMetadataResult_into_SUCCESS( + decrypt_result); + auto parts_result = + np_ffi::internal::np_ffi_DecryptedMetadata_get_metadata_buffer_parts( + metadata); + // The handle is guaranteed to be valid by the C++ wrapper so this should + // never fail + assert_panic(np_ffi::internal::np_ffi_GetMetadataBufferPartsResult_kind( + parts_result) == + np_ffi::internal::GetMetadataBufferPartsResultKind::Success); + auto parts = + np_ffi::internal::np_ffi_GetMetadataBufferPartsResult_into_SUCCESS( + parts_result); + std::vector<uint8_t> result(parts.ptr, parts.ptr + parts.len); + + // Now that the contents have been copied into the vec, the underlying + // handle can be de-allocated + auto deallocate_result = + np_ffi::internal::np_ffi_deallocate_DecryptedMetadata(metadata); + assert_panic(deallocate_result == + np_ffi::internal::DeallocateResult::Success); + return result; + } + case np_ffi::internal::DecryptMetadataResultKind::Error: { + return absl::InvalidArgumentError("Invalid V0 payload handle"); + } + } +} + +absl::StatusOr<DeserializedV0IdentityDetails> V0Payload::GetIdentityDetails() + const { + assert_panic(!this->moved_); + auto result = np_ffi::internal::np_ffi_V0Payload_get_identity_details( + this->v0_payload_); + auto kind = np_ffi::internal::np_ffi_GetV0IdentityDetailsResult_kind(result); + switch (kind) { + case np_ffi::internal::GetV0IdentityDetailsResultKind::Error: { + return absl::InvalidArgumentError("Invalid handle"); + } + case np_ffi::internal::GetV0IdentityDetailsResultKind::Success: { + return np_ffi::internal::np_ffi_GetV0IdentityDetailsResult_into_SUCCESS( + result); + } + } +} + +absl::StatusOr<std::vector<uint8_t>> V0Payload::DecryptMetadata() const { + assert_panic(!this->moved_); + auto decrypt_result = + np_ffi::internal::np_ffi_V0Payload_decrypt_metadata(this->v0_payload_); + return MetadataResultToVec(decrypt_result); +} + +V0DataElementKind V0DataElement::GetKind() const { 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_); +TxPower V0DataElement::AsTxPower() const { + return TxPower( + np_ffi::internal::np_ffi_V0DataElement_into_TX_POWER(v0_data_element_)); } -V0Actions V0DataElement::AsActions() { +V0Actions V0DataElement::AsActions() const { auto internal = np_ffi::internal::np_ffi_V0DataElement_into_ACTIONS(v0_data_element_); return V0Actions(internal); } -uint32_t V0Actions::GetAsU32() { +V0DataElement::V0DataElement(TxPower tx_power) { + v0_data_element_ = + np_ffi::internal::np_ffi_TxPower_into_V0DataElement(tx_power.tx_power_); +} + +V0DataElement::V0DataElement(V0Actions actions) { + v0_data_element_ = + np_ffi::internal::np_ffi_V0Actions_into_V0DataElement(actions.actions_); +} + +uint32_t V0Actions::GetAsU32() const { return np_ffi::internal::np_ffi_V0Actions_as_u32(actions_); } -bool V0Actions::HasAction(BooleanActionType action) { +bool V0Actions::HasAction(BooleanActionType action) const { 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_); +ContextSyncSeqNum V0Actions::GetContextSyncSequenceNumber() const { + return ContextSyncSeqNum( + 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 +absl::Status V0Actions::TrySetAction(BooleanActionType action, bool value) { + auto result = + np_ffi::internal::np_ffi_V0Actions_set_action(actions_, action, value); + auto kind = np_ffi::internal::np_ffi_SetV0ActionResult_kind(result); + switch (kind) { + case np_ffi::internal::SetV0ActionResultKind::Success: { + actions_ = + np_ffi::internal::np_ffi_SetV0ActionResult_into_SUCCESS(result); + return absl::OkStatus(); + } + case np_ffi::internal::SetV0ActionResultKind::Error: { + actions_ = np_ffi::internal::np_ffi_SetV0ActionResult_into_ERROR(result); + return absl::InvalidArgumentError( + "The requested action bit may not be set for the requested adv " + "encoding"); + } + } +} + +void V0Actions::SetContextSyncSequenceNumber(ContextSyncSeqNum seq_num) { + actions_ = + np_ffi::internal::np_ffi_V0Actions_set_context_sync_sequence_number( + actions_, seq_num.seq_num_); +} + +V0Actions V0Actions::BuildNewZeroed(AdvertisementBuilderKind kind) { + auto actions = np_ffi::internal::np_ffi_build_new_zeroed_V0Actions(kind); + return V0Actions(actions); +} + +uint8_t ContextSyncSeqNum::GetAsU8() const { + return np_ffi::internal::np_ffi_ContextSyncSeqNum_as_unsigned_byte(seq_num_); +} + +absl::StatusOr<ContextSyncSeqNum> ContextSyncSeqNum::TryBuildFromU8( + uint8_t value) { + auto result = + np_ffi::internal::np_ffi_ContextSyncSeqNum_build_from_unsigned_byte( + value); + auto kind = + np_ffi::internal::np_ffi_BuildContextSyncSeqNumResult_kind(result); + switch (kind) { + case np_ffi::internal::BuildContextSyncSeqNumResultKind::Success: { + return ContextSyncSeqNum( + np_ffi::internal::np_ffi_BuildContextSyncSeqNumResult_into_SUCCESS( + result)); + } + case np_ffi::internal::BuildContextSyncSeqNumResultKind::OutOfRange: { + return absl::InvalidArgumentError( + "Attempted to build a context sync sequence number from a non-nibble " + "value."); + } + } +} + +int8_t TxPower::GetAsI8() const { + return np_ffi::internal::np_ffi_TxPower_as_signed_byte(tx_power_); +} + +absl::StatusOr<TxPower> TxPower::TryBuildFromI8(int8_t value) { + auto result = np_ffi::internal::np_ffi_TxPower_build_from_signed_byte(value); + auto kind = np_ffi::internal::np_ffi_BuildTxPowerResult_kind(result); + switch (kind) { + case np_ffi::internal::BuildTxPowerResultKind::Success: { + return TxPower( + np_ffi::internal::np_ffi_BuildTxPowerResult_into_SUCCESS(result)); + } + case np_ffi::internal::BuildTxPowerResultKind::OutOfRange: { + return absl::InvalidArgumentError( + "Could not build a tx power for the requested byte value."); + } + } +} + +// This is called after all references to the shared_ptr have gone out of +// scope auto DeallocateV1Adv( - np_ffi::internal::DeserializedV1Advertisement *v1_advertisement) { + np_ffi::internal::DeserializedV1Advertisement* v1_advertisement) { auto result = np_ffi::internal::np_ffi_deallocate_deserialized_V1_advertisement( *v1_advertisement); @@ -492,11 +662,11 @@ } DeserializedV1Advertisement::DeserializedV1Advertisement( - DeserializedV1Advertisement &&other) noexcept + DeserializedV1Advertisement&& other) noexcept : v1_advertisement_(std::move(other.v1_advertisement_)) {} -DeserializedV1Advertisement &DeserializedV1Advertisement::operator=( - DeserializedV1Advertisement &&other) noexcept { +DeserializedV1Advertisement& DeserializedV1Advertisement::operator=( + DeserializedV1Advertisement&& other) noexcept { if (this != &other) { this->v1_advertisement_ = std::move(other.v1_advertisement_); } @@ -504,14 +674,14 @@ } // V1 Stuff -uint8_t DeserializedV1Advertisement::GetNumLegibleSections() { +uint8_t DeserializedV1Advertisement::GetNumLegibleSections() const { assert_panic(this->v1_advertisement_ != nullptr); return np_ffi::internal:: np_ffi_DeserializedV1Advertisement_get_num_legible_sections( *v1_advertisement_); } -uint8_t DeserializedV1Advertisement::GetNumUndecryptableSections() { +uint8_t DeserializedV1Advertisement::GetNumUndecryptableSections() const { assert_panic(this->v1_advertisement_ != nullptr); return np_ffi::internal:: np_ffi_DeserializedV1Advertisement_get_num_undecryptable_sections( @@ -519,72 +689,127 @@ } absl::StatusOr<DeserializedV1Section> -DeserializedV1Advertisement::TryGetSection(uint8_t section_index) { +DeserializedV1Advertisement::TryGetSection(const uint8_t section_index) const { 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_); - } + 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() { +uint8_t DeserializedV1Section::NumberOfDataElements() const { return np_ffi::internal::np_ffi_DeserializedV1Section_get_num_des(section_); } -DeserializedV1IdentityKind DeserializedV1Section::GetIdentityKind() { +DeserializedV1IdentityKind DeserializedV1Section::GetIdentityKind() const { return np_ffi::internal::np_ffi_DeserializedV1Section_get_identity_kind( section_); } -absl::StatusOr<V1DataElement> -DeserializedV1Section::TryGetDataElement(uint8_t index) { +absl::StatusOr<V1DataElement> DeserializedV1Section::TryGetDataElement( + const uint8_t index) const { 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::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)); + } } - case np_ffi::internal::GetV1DEResultKind::Success: { - return V1DataElement( - np_ffi::internal::np_ffi_GetV1DEResult_into_SUCCESS(result)); +} + +absl::StatusOr<std::vector<uint8_t>> DeserializedV1Section::DecryptMetadata() + const { + assert_panic(this->owning_v1_advertisement_ != nullptr); + auto decrypt_result = + np_ffi::internal::np_ffi_DeserializedV1Section_decrypt_metadata( + this->section_); + return MetadataResultToVec(decrypt_result); +} + +absl::StatusOr<DeserializedV1IdentityDetails> +DeserializedV1Section::GetIdentityDetails() const { + assert_panic(this->owning_v1_advertisement_ != nullptr); + auto result = + np_ffi::internal::np_ffi_DeserializedV1Section_get_identity_details( + this->section_); + auto kind = np_ffi::internal::np_ffi_GetV1IdentityDetailsResult_kind(result); + switch (kind) { + case np_ffi::internal::GetV1IdentityDetailsResultKind::Error: { + return absl::InvalidArgumentError("Invalid handle"); + } + case np_ffi::internal::GetV1IdentityDetailsResultKind::Success: { + return np_ffi::internal::np_ffi_GetV1IdentityDetailsResult_into_SUCCESS( + result); + } } +} + +absl::StatusOr<std::array<uint8_t, DERIVED_SALT_SIZE>> +DeserializedV1Section::DeriveSaltForOffset(const uint8_t offset) const { + auto result = np_ffi::internal:: + np_ffi_DeserializedV1Section_derive_16_byte_salt_for_offset( + this->section_, offset); + auto kind = np_ffi::internal::np_ffi_GetV1DE16ByteSaltResult_kind(result); + switch (kind) { + case np_ffi::internal::GetV1DE16ByteSaltResultKind::Error: { + return absl::InvalidArgumentError("Failed to derive salt for offset"); + } + case np_ffi::internal::GetV1DE16ByteSaltResultKind::Success: { + auto buffer = + np_ffi::internal::np_ffi_GetV1DE16ByteSaltResult_into_SUCCESS(result); + return std::to_array(buffer._0); + } } } uint32_t V1DataElement::GetDataElementTypeCode() const { return np_ffi::internal::np_ffi_V1DEType_to_uint32_t( - v1_data_element_.generic._0.de_type); + np_ffi::internal::np_ffi_V1DataElement_to_generic(this->v1_data_element_) + .de_type); } -ByteBuffer<127> V1DataElement::GetPayload() const { - return ByteBuffer(v1_data_element_.generic._0.payload); +ByteBuffer<MAX_V1_DE_PAYLOAD_SIZE> V1DataElement::GetPayload() const { + return ByteBuffer( + np_ffi::internal::np_ffi_V1DataElement_to_generic(this->v1_data_element_) + .payload); +} + +uint8_t V1DataElement::GetOffset() const { + return np_ffi::internal::np_ffi_V1DataElement_to_generic( + this->v1_data_element_) + .offset; } MatchedCredentialData::MatchedCredentialData( - uint32_t cred_id, std::span<uint8_t> metadata_bytes) { + const uint32_t cred_id, std::span<const uint8_t> metadata_bytes) { this->data_ = {cred_id, metadata_bytes.data(), metadata_bytes.size()}; } template <typename T, size_t N> -static void CopyToRawArray(T (&dest)[N], const std::array<T, N> &src) { +void CopyToRawArray(T (&dest)[N], const std::array<T, N>& src) { memcpy(dest, src.data(), sizeof(T) * N); } V0MatchableCredential::V0MatchableCredential( - std::array<uint8_t, 32> key_seed, - std::array<uint8_t, 32> legacy_metadata_key_hmac, - MatchedCredentialData matched_credential_data) { + const std::array<uint8_t, 32> key_seed, + const std::array<uint8_t, 32> legacy_metadata_key_hmac, + const MatchedCredentialData matched_credential_data) { np_ffi::internal::V0DiscoveryCredential discovery_cred{}; CopyToRawArray(discovery_cred.key_seed, key_seed); CopyToRawArray(discovery_cred.legacy_metadata_key_hmac, @@ -593,11 +818,11 @@ } V1MatchableCredential::V1MatchableCredential( - std::array<uint8_t, 32> key_seed, - std::array<uint8_t, 32> expected_unsigned_metadata_key_hmac, - std::array<uint8_t, 32> expected_signed_metadata_key_hmac, - std::array<uint8_t, 32> pub_key, - MatchedCredentialData matched_credential_data) { + const std::array<uint8_t, 32> key_seed, + const std::array<uint8_t, 32> expected_unsigned_metadata_key_hmac, + const std::array<uint8_t, 32> expected_signed_metadata_key_hmac, + const std::array<uint8_t, 32> pub_key, + const MatchedCredentialData matched_credential_data) { np_ffi::internal::V1DiscoveryCredential discovery_cred{}; CopyToRawArray(discovery_cred.key_seed, key_seed); CopyToRawArray(discovery_cred.expected_unsigned_metadata_key_hmac, @@ -607,4 +832,145 @@ CopyToRawArray(discovery_cred.pub_key, pub_key); this->internal_ = {discovery_cred, matched_credential_data.data_}; } -} // namespace nearby_protocol + +V0BroadcastCredential::V0BroadcastCredential( + std::array<uint8_t, 32> key_seed, std::array<uint8_t, 14> metadata_key) { + CopyToRawArray(internal_.key_seed, key_seed); + CopyToRawArray(internal_.metadata_key, metadata_key); +} + +V0AdvertisementBuilder::~V0AdvertisementBuilder() { + if (!this->moved_) { + auto result = np_ffi::internal::np_ffi_deallocate_v0_advertisement_builder( + adv_builder_); + assert_panic(result == np_ffi::internal::DeallocateResult::Success); + } +} + +V0AdvertisementBuilder::V0AdvertisementBuilder( + V0AdvertisementBuilder&& other) noexcept + : adv_builder_(other.adv_builder_), moved_(other.moved_) { + other.adv_builder_ = {}; + other.moved_ = true; +} + +V0AdvertisementBuilder& V0AdvertisementBuilder::operator=( + V0AdvertisementBuilder&& other) noexcept { + if (this != &other) { + if (!this->moved_) { + auto result = + np_ffi::internal::np_ffi_deallocate_v0_advertisement_builder( + this->adv_builder_); + assert_panic(result == np_ffi::internal::DeallocateResult::Success); + } + + this->adv_builder_ = other.adv_builder_; + this->moved_ = other.moved_; + + other.adv_builder_ = {}; + other.moved_ = true; + } + return *this; +} + +absl::Status V0AdvertisementBuilder::TryAddDE(V0DataElement de) { + assert_panic(!this->moved_); + auto result = np_ffi::internal::np_ffi_V0AdvertisementBuilder_add_de( + this->adv_builder_, de.v0_data_element_); + switch (result) { + case AddV0DEResult::Success: { + return absl::OkStatus(); + } + case AddV0DEResult::InvalidAdvertisementBuilderHandle: { + return absl::InvalidArgumentError( + "invalid v0 advertisement builder handle provided"); + } + case AddV0DEResult::InsufficientAdvertisementSpace: { + return absl::ResourceExhaustedError( + "insufficient advertisement space to add DE"); + } + case AddV0DEResult::InvalidIdentityTypeForDataElement: { + return absl::InvalidArgumentError( + "the DE may not be added to this advertisement builder due to an " + "identity type mismatch"); + } + } +} + +[[nodiscard]] absl::StatusOr<ByteBuffer<24>> +V0AdvertisementBuilder::TrySerialize() { + assert_panic(!this->moved_); + auto result = + np_ffi::internal::np_ffi_V0AdvertisementBuilder_into_advertisement( + this->adv_builder_); + auto kind = + np_ffi::internal::np_ffi_SerializeV0AdvertisementResult_kind(result); + // Regardless of what happens, we've invalidated the original adv builder. + this->moved_ = true; + + switch (kind) { + case SerializeV0AdvertisementResultKind::Success: { + auto bytes = + np_ffi::internal::np_ffi_SerializeV0AdvertisementResult_into_SUCCESS( + result); + return ByteBuffer(bytes); + } + case SerializeV0AdvertisementResultKind::LdtError: { + return absl::OutOfRangeError( + "The advertisement contents were not of a proper size for LDT " + "encryption"); + } + case SerializeV0AdvertisementResultKind:: + InvalidAdvertisementBuilderHandle: { + return absl::InvalidArgumentError( + "The advertisement builder handle was invalid"); + } + } +} + +[[nodiscard]] absl::StatusOr<V0AdvertisementBuilder> +V0AdvertisementBuilder::CreateV0AdvertisementBuilderResultToInternal( + np_ffi::internal::CreateV0AdvertisementBuilderResult result) { + auto kind = + np_ffi::internal::np_ffi_CreateV0AdvertisementBuilderResult_kind(result); + switch (kind) { + case CreateV0AdvertisementBuilderResultKind::Success: { + auto adv_builder = np_ffi::internal:: + np_ffi_CreateV0AdvertisementBuilderResult_into_SUCCESS(result); + return V0AdvertisementBuilder(adv_builder); + } + case CreateV0AdvertisementBuilderResultKind::NoSpaceLeft: { + return absl::ResourceExhaustedError( + "No space left to create v0 advertisement builder"); + } + } +} + +[[nodiscard]] absl::StatusOr<V0AdvertisementBuilder> +V0AdvertisementBuilder::TryCreatePublic() { + auto result = + np_ffi::internal::np_ffi_create_v0_public_advertisement_builder(); + return V0AdvertisementBuilder::CreateV0AdvertisementBuilderResultToInternal( + result); +} + +template <uintptr_t N> +[[nodiscard]] np_ffi::internal::FixedSizeArray<N> ToFFIArray( + std::array<uint8_t, N> value) { + np_ffi::internal::FixedSizeArray<N> result; + std::copy(std::begin(value), std::end(value), result._0); + return result; +} + +[[nodiscard]] absl::StatusOr<V0AdvertisementBuilder> +V0AdvertisementBuilder::TryCreateEncrypted(V0BroadcastCredential broadcast_cred, + EncryptedIdentityType identity_type, + std::array<uint8_t, 2> salt) { + auto result = + np_ffi::internal::np_ffi_create_v0_encrypted_advertisement_builder( + broadcast_cred.internal_, identity_type, ToFFIArray(salt)); + return V0AdvertisementBuilder::CreateV0AdvertisementBuilderResultToInternal( + result); +} + +} // namespace nearby_protocol \ No newline at end of file
diff --git a/nearby/presence/np_cpp_ffi/sample/main.cc b/nearby/presence/np_cpp_ffi/sample/main.cc index 1d273da..eb0cae0 100644 --- a/nearby/presence/np_cpp_ffi/sample/main.cc +++ b/nearby/presence/np_cpp_ffi/sample/main.cc
@@ -12,12 +12,11 @@ // 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" +#include "nearby_protocol.h" static void SamplePanicHandler(nearby_protocol::PanicReason reason); @@ -54,19 +53,21 @@ } // Create an empty credential book from the empty slab, and verify success. - auto cred_book_result = nearby_protocol::CredentialBook::TryCreateFromSlab(cred_slab_result.value()); + auto cred_book_result = nearby_protocol::CredentialBook::TryCreateFromSlab( + cred_slab_result.value()); 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_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); + auto v0_buffer = nearby_protocol::ByteBuffer<255>::TryFromString(v0_bytes); nearby_protocol::RawAdvertisementPayload v0_payload(v0_buffer.value()); // Try to deserialize a V0 payload @@ -78,13 +79,14 @@ 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 + auto v1_byte_string = + "20" // V1 Advertisement header + "04" // Section Header + "03" // Public Identity DE header + "260046"; // Length 2 Actions DE auto v1_bytes = absl::HexStringToBytes(v1_byte_string); - auto v1_buffer = nearby_protocol::ByteBuffer<255>::CopyFrom(v1_bytes); + auto v1_buffer = nearby_protocol::ByteBuffer<255>::TryFromString(v1_bytes); nearby_protocol::RawAdvertisementPayload v1_payload(v1_buffer.value()); // Try to deserialize a V1 payload @@ -100,7 +102,7 @@ "(see above examples): "; std::cin >> user_input; auto bytes = absl::HexStringToBytes(user_input); - auto buffer = nearby_protocol::ByteBuffer<255>::CopyFrom(bytes); + auto buffer = nearby_protocol::ByteBuffer<255>::TryFromString(bytes); if (!buffer.ok()) { std::cout << "Too many bytes provided, must fit into a max length 255 " "byte BLE advertisement\n"; @@ -129,18 +131,18 @@ 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 nearby_protocol::PanicReason::InvalidActionBits: { - std::cout << "InvalidActionBits \n"; - break; - } + case nearby_protocol::PanicReason::EnumCastFailed: { + std::cout << "EnumCastFailed \n"; + break; + } + case nearby_protocol::PanicReason::AssertFailed: { + std::cout << "AssertFailed \n"; + break; + } + case nearby_protocol::PanicReason::InvalidStackDataStructure: { + std::cout << "InvalidStackDataStructure \n"; + break; + } } std::abort(); } @@ -148,29 +150,30 @@ 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; + 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; + 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; } } @@ -192,34 +195,35 @@ } } -void HandleV0IdentityKind(nearby_protocol::DeserializedV0IdentityKind identity) { +void HandleV0IdentityKind( + nearby_protocol::DeserializedV0IdentityKind identity) { switch (identity) { - 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; - } + 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; - } + 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.GetAsI8()) << "\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; + } } } @@ -245,14 +249,14 @@ 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; - } + 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();
diff --git a/nearby/presence/np_cpp_ffi/shared/shared_test_util.cc b/nearby/presence/np_cpp_ffi/shared/shared_test_util.cc index 67ca828..8f172c1 100644 --- a/nearby/presence/np_cpp_ffi/shared/shared_test_util.cc +++ b/nearby/presence/np_cpp_ffi/shared/shared_test_util.cc
@@ -12,22 +12,23 @@ // See the License for the specific language governing permissions and // limitations under the License. -#include "nearby_protocol.h" +#include "shared_test_util.h" #include <cstdlib> -#include <cstddef> // IWYU pragma: keep + +#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 nearby_protocol::PanicReason::InvalidActionBits: { - return "InvalidActionBits"; - } + case nearby_protocol::PanicReason::EnumCastFailed: { + return "EnumCastFailed"; + } + case nearby_protocol::PanicReason::AssertFailed: { + return "AssertFailed"; + } + case nearby_protocol::PanicReason::InvalidStackDataStructure: { + return "InvalidStackDataStructure"; + } } } @@ -37,17 +38,37 @@ } std::string generate_hex_string(const size_t length) { - char *str = new char[length]; + std::string result; + result.reserve(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) + + for (size_t i = 0; i < length; i++) { + result.push_back(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 +} + +nearby_protocol::V0MatchableCredential GenerateRandomCredentialV0() { + auto key_seed = create_random_array<32>(); + auto legacy_metadata_key_hmac = create_random_array<32>(); + auto encrypted_metadata_bytes = create_random_array<200>(); + nearby_protocol::MatchedCredentialData matched_cred(rand(), + encrypted_metadata_bytes); + return {key_seed, legacy_metadata_key_hmac, matched_cred}; +} + +nearby_protocol::V1MatchableCredential GenerateRandomCredentialV1() { + auto key_seed = create_random_array<32>(); + auto expected_unsigned_metadata_key_hmac = create_random_array<32>(); + auto expected_signed_metadata_key_hmac = create_random_array<32>(); + auto pub_key = create_random_array<32>(); + auto encrypted_metadata_bytes = create_random_array<200>(); + nearby_protocol::MatchedCredentialData matched_cred(rand(), + encrypted_metadata_bytes); + return {key_seed, expected_unsigned_metadata_key_hmac, + expected_signed_metadata_key_hmac, pub_key, matched_cred}; +}
diff --git a/nearby/presence/np_cpp_ffi/shared/shared_test_util.h b/nearby/presence/np_cpp_ffi/shared/shared_test_util.h index 22d1bb3..da57b63 100644 --- a/nearby/presence/np_cpp_ffi/shared/shared_test_util.h +++ b/nearby/presence/np_cpp_ffi/shared/shared_test_util.h
@@ -17,28 +17,131 @@ #include "nearby_protocol.h" -inline nearby_protocol::RawAdvertisementPayload - V0AdvEmpty(nearby_protocol::ByteBuffer<255>({2, {0x00, 0x03}})); +// Plaintext advertisement bytes +constexpr std::array<uint8_t, 2> V0AdvEmptyBytes{0x00, 0x03}; +constexpr std::array<uint8_t, 2> V1AdvEmptyBytes{0x00, 0x20}; +constexpr std::array<uint8_t, 4> V0AdvPlaintextBytes{0x00, 0x03, 0x15, 0x03}; +constexpr std::array<uint8_t, 7> V0AdvPlaintextMultiDeBytes{ + 0x00, 0x03, 0x15, 0x05, 0x26, 0x00, 0x46, +}; +constexpr std::array<uint8_t, 5> V1AdvPlaintextBytes{0x20, 0x03, 0x03, 0x15, + 0x03}; -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 - })); +// V0 encrypted advertisement data - ripped out of np_adv/tests/examples_v0.rs +constexpr std::array<uint8_t, 20> V0AdvEncryptedBytes{ + 0x00, 0x21, 0x22, 0x22, 0x85, 0xBF, 0xA8, 0x83, 0x58, 0x7C, + 0x50, 0xCF, 0x98, 0x38, 0xA7, 0x8A, 0xC0, 0x1C, 0x96, 0xF9, +}; +inline std::vector<uint8_t> V0AdvEncryptedMetadata = { + 0x26, 0xC5, 0xEA, 0xD4, 0xED, 0x58, 0xF8, 0xFC, 0xE8, 0xF4, 0xAB, 0x0C, + 0x93, 0x2B, 0x75, 0xAA, 0x74, 0x39, 0x67, 0xDB, 0x1E, 0xF2, 0x33, 0xB5, + 0x43, 0xCC, 0x94, 0xAA, 0xA3, 0xBB, 0xB9, 0x4C, 0xBF, 0x57, 0x77, 0xD0, + 0x43, 0x0C, 0x7F, 0xF7, 0x36, 0x03, 0x29, 0xE0, 0x57, 0xBA, 0x97, 0x7F, + 0xF2, 0xD1, 0x51, 0xDB, 0xC9, 0x01, 0x47, 0xE7, 0x48, 0x36, +}; +inline std::string ExpectedV0DecryptedMetadata( + R"({"name":"Alice","email":"alice@gmail.com"})"); +constexpr std::array<uint8_t, 32> V0AdvKeySeed = { + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, +}; +constexpr std::array<uint8_t, 32> V0AdvLegacyMetadataKeyHmac = { + 0x88, 0x33, 0xDE, 0xD5, 0x4D, 0x00, 0x92, 0xE8, 0x80, 0x70, 0xD5, + 0x1F, 0x18, 0xEC, 0x22, 0x45, 0x75, 0x7C, 0x24, 0xDF, 0xE3, 0x8C, + 0xB2, 0xDE, 0x77, 0xB6, 0x78, 0x85, 0xFC, 0xA5, 0x67, 0x4D, +}; -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 - }})); +// V1 encrypted advertisement data - ripped out of np_adv/tests/examples_v1.rs +constexpr std::array<uint8_t, 105> V1AdvEncryptedBytes{ + 0x20, 0x67, 0x91, 0x10, 0x08, 0xAD, 0x69, 0x46, 0x04, 0x5D, 0xAE, 0x6D, + 0xB7, 0xF7, 0x5C, 0xD3, 0xB8, 0xAC, 0xF0, 0xBF, 0x75, 0x90, 0x01, 0xBE, + 0x73, 0x33, 0xA4, 0x76, 0x84, 0x4A, 0x09, 0x0F, 0x2B, 0x99, 0x47, 0xDF, + 0x8B, 0x46, 0xCA, 0x16, 0xCE, 0x13, 0xB5, 0x6E, 0x53, 0xAE, 0x28, 0x56, + 0x44, 0x0E, 0xA6, 0x8D, 0xEB, 0xA1, 0x11, 0xAF, 0x4E, 0x1B, 0xE0, 0x8E, + 0xF5, 0xBA, 0x90, 0x4F, 0x2E, 0x94, 0xFC, 0xDE, 0xA6, 0x7F, 0x5D, 0xC8, + 0x37, 0xB7, 0xEF, 0xCA, 0xAC, 0x8B, 0x9F, 0x1B, 0xD4, 0xC6, 0x11, 0x85, + 0xD3, 0x67, 0x39, 0x32, 0xD1, 0x82, 0xCA, 0x4E, 0xB9, 0x46, 0x03, 0x83, + 0x68, 0x56, 0x0B, 0xCC, 0xFD, 0x7A, 0x2A, 0xBE, 0x07, +}; +constexpr std::array<uint8_t, 32> V1AdvKeySeed = { + 0x31, 0x43, 0x63, 0x1E, 0xCA, 0xE8, 0x97, 0x4B, 0x96, 0x50, 0xCC, + 0x1C, 0x48, 0x25, 0x0E, 0x81, 0x58, 0x06, 0x81, 0x51, 0xF9, 0xEB, + 0x25, 0x23, 0x03, 0xD4, 0x97, 0x6D, 0x95, 0x19, 0x91, 0x39, +}; +constexpr std::array<uint8_t, 32> V1AdvExpectedUnsignedMetadataKeyHmac = {0}; +constexpr std::array<uint8_t, 32> V1AdvExpectedSignedMetadataKeyHmac = { + 0x1C, 0xBC, 0xEB, 0xDC, 0x17, 0xB5, 0x91, 0xE5, 0x07, 0x9D, 0x70, + 0xC1, 0xE8, 0x4B, 0xCC, 0xDB, 0x4B, 0x0F, 0x76, 0x83, 0x59, 0x62, + 0x0A, 0x2D, 0x55, 0x0B, 0x3B, 0x36, 0xA4, 0x92, 0x8B, 0x13, +}; +constexpr std::array<uint8_t, 32> V1AdvPublicKey = { + 0x6D, 0x0D, 0xB6, 0x09, 0x10, 0xB1, 0x4E, 0xC4, 0x7E, 0x10, 0x16, + 0x14, 0x9C, 0x9F, 0xF2, 0x14, 0x0F, 0xEC, 0x53, 0x76, 0xE3, 0x07, + 0xD9, 0xD3, 0x9E, 0xAE, 0xE7, 0x45, 0x2C, 0x03, 0xEC, 0x6D, +}; +inline std::vector<uint8_t> V1AdvEncryptedMetadata = { + 0x09, 0xB8, 0xC6, 0x6B, 0x71, 0x43, 0x55, 0x4C, 0xB9, 0x9D, 0xBF, + 0xE4, 0xAF, 0x3E, 0xA2, 0x56, 0x0E, 0x6C, 0xBC, 0xDC, 0x3F, 0x3F, + 0x0D, 0x28, 0xD4, 0x50, 0xA9, 0xEA, 0xC3, 0x60, 0xB0, 0x81, 0x31, + 0xE2, 0x67, 0xB5, 0xC8, 0x15, 0x0C, 0xCA, 0x0B, 0x9B, 0x2C, 0x80, + 0xC1, 0xB1, 0xF6, 0x5F, 0xE1, 0x51, 0xF9, 0xE2, 0x23, 0x56, 0xD4, + 0x0B, 0x89, 0xA7, 0xF3, 0x4D, 0xE8, 0x79, 0x26, 0x44, 0x7E, 0x62, + 0xDE, 0x53, 0x13, 0x15, 0x3D, 0xFC, 0x04, 0x2E, 0x2D, 0x08, 0x43, + 0x2E, 0xE1, 0x96, 0xE8, 0x0F, 0xD0, 0xFC, 0xDE, 0x03, 0x86, 0x23, + 0xB6, 0x98, 0x85, 0x27, 0x67, 0xD8, 0x1D, 0xC3, 0xE2, 0xE0, 0xA4, + 0x32, 0x1A, 0x5F, 0x51, 0x0B, 0xA8, 0xD8, 0xA7, 0x23, 0xA4, 0x57, +}; +inline std::string ExpectedV1DecryptedMetadata( + "{\"uuid\":\"378845e1-2616-420d-86f5-674177a7504d\"," + "\"display_name\":\"Alice\",\"location\":\"Wonderland\"}"); + +// Data suitable for use directly through the C API (bypassing the C++ wrapper) +constexpr np_ffi::internal::RawAdvertisementPayload V0AdvMultiDeInternals{ + {7, {0x00, 0x03, 0x15, 0x05, 0x26, 0x00, 0x46}}}; + +// Wrapper types directly usable by C++ API +constexpr nearby_protocol::ByteBuffer<255> V0AdvEmptyBuffer(V0AdvEmptyBytes); +constexpr nearby_protocol::RawAdvertisementPayload V0AdvEmpty(V0AdvEmptyBuffer); + +constexpr nearby_protocol::ByteBuffer<255> V0AdvPlaintextBuffer( + V0AdvPlaintextBytes); +constexpr nearby_protocol::RawAdvertisementPayload V0AdvPlaintext( + V0AdvPlaintextBuffer); + +constexpr nearby_protocol::ByteBuffer<255> V0AdvPlaintextMultiDeBuffer( + V0AdvPlaintextMultiDeBytes); +constexpr nearby_protocol::RawAdvertisementPayload V0AdvPlaintextMultiDe( + V0AdvPlaintextMultiDeBuffer); + +constexpr nearby_protocol::ByteBuffer<255> V1AdvPlaintextBuffer( + V1AdvPlaintextBytes); +constexpr nearby_protocol::RawAdvertisementPayload V1AdvPlaintext( + V1AdvPlaintextBuffer); + +constexpr nearby_protocol::ByteBuffer<255> V0AdvEncryptedBuffer( + V0AdvEncryptedBytes); +constexpr nearby_protocol::RawAdvertisementPayload V0AdvEncryptedPayload( + V0AdvEncryptedBuffer); + +constexpr nearby_protocol::ByteBuffer<255> V1AdvEncryptedBuffer( + V1AdvEncryptedBytes); +constexpr nearby_protocol::RawAdvertisementPayload V1AdvEncrypted( + V1AdvEncryptedBuffer); + void test_panic_handler(nearby_protocol::PanicReason reason); +nearby_protocol::V0MatchableCredential GenerateRandomCredentialV0(); + +nearby_protocol::V1MatchableCredential GenerateRandomCredentialV1(); + +template <uint32_t N> +std::array<uint8_t, N> create_random_array() { + std::array<uint8_t, N> array{}; + std::generate(array.begin(), array.end(), []() { return rand(); }); + return array; +} + std::string generate_hex_string(size_t length); -#endif // NEARBY_PRESENCE_NP_CPP_FFI_TESTS_SHARED_TEST_UTILS_H_ +#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 index 23d02a4..80fdee0 100644 --- a/nearby/presence/np_cpp_ffi/tests/CMakeLists.txt +++ b/nearby/presence/np_cpp_ffi/tests/CMakeLists.txt
@@ -14,14 +14,18 @@ add_executable( np_ffi_tests - deserialize_result_tests.cc - deserialize_v0_tests.cc - deserialize_v1_tests.cc - credential_slab_tests.cc - credential_book_tests.cc byte_buffer_tests.cc + credential_book_tests.cc + credential_slab_tests.cc + deserialize_result_tests.cc np_cpp_test.h np_cpp_test.cc + v0_encrypted_deserialization_tests.cc + v0_encrypted_serialization_tests.cc + v0_unencrypted_deserialization_tests.cc + v0_unencrypted_serialization_tests.cc + v1_encrypted_deserialization_tests.cc + v1_unencrypted_deserialization_tests.cc ) target_link_libraries(
diff --git a/nearby/presence/np_cpp_ffi/tests/byte_buffer_tests.cc b/nearby/presence/np_cpp_ffi/tests/byte_buffer_tests.cc index 7e1a048..f76f396 100644 --- a/nearby/presence/np_cpp_ffi/tests/byte_buffer_tests.cc +++ b/nearby/presence/np_cpp_ffi/tests/byte_buffer_tests.cc
@@ -12,64 +12,116 @@ // See the License for the specific language governing permissions and // limitations under the License. +#include <array> +#include <cassert> +#include <cstdint> +#include <string> +#include <vector> + +#include "absl/strings/escaping.h" +#include "gtest/gtest.h" #include "nearby_protocol.h" #include "np_cpp_test.h" #include "shared_test_util.h" -#include "absl/strings/escaping.h" -#include "gtest/gtest.h" - +// NOLINTBEGIN(readability-magic-numbers) TEST_F(NpCppTest, 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); + auto buffer = nearby_protocol::ByteBuffer< + nearby_protocol::MAX_ADV_PAYLOAD_SIZE>::TryFromString(bytes); ASSERT_TRUE(buffer.ok()); auto string = buffer.value().ToString(); ASSERT_EQ(bytes, string); } +TEST_F(NpCppTest, ByteBufferArrayConstructor) { + const std::array<uint8_t, 3> data{1, 2, 3}; + const nearby_protocol::ByteBuffer<nearby_protocol::MAX_ADV_PAYLOAD_SIZE> + buffer(data); + const std::vector<uint8_t> expected{1, 2, 3}; + ASSERT_EQ(expected, buffer.ToVector()); +} + +TEST_F(NpCppTest, ByteBufferTryFromSpan) { + std::vector<uint8_t> data{1, 2, 3}; + auto buffer = nearby_protocol::ByteBuffer<3>::TryFromSpan(data); + assert(buffer.ok()); + ASSERT_EQ(data, buffer->ToVector()); +} + +TEST_F(NpCppTest, ByteBufferTryFromSpanBufferNotFull) { + std::vector<uint8_t> data{1, 2, 3}; + auto buffer = nearby_protocol::ByteBuffer<100>::TryFromSpan(data); + assert(buffer.ok()); + ASSERT_EQ(data, buffer->ToVector()); +} + +TEST_F(NpCppTest, ByteBufferTryFromSpanInvalidLength) { + std::vector<uint8_t> data{1, 2, 3}; + auto buffer = nearby_protocol::ByteBuffer<2>::TryFromSpan(data); + ASSERT_FALSE(buffer.ok()); +} + +TEST_F(NpCppTest, ByteBufferTryFromSpanArray) { + const std::array<uint8_t, 3> data{1, 2, 3}; + auto buffer = nearby_protocol::ByteBuffer< + nearby_protocol::MAX_ADV_PAYLOAD_SIZE>::TryFromSpan(data); + const std::vector<uint8_t> expected{1, 2, 3}; + ASSERT_EQ(expected, buffer->ToVector()); +} + +TEST_F(NpCppTest, ByteBufferTryFromSpanArrayInvalid) { + std::array<uint8_t, 3> data{1, 2, 3}; + auto buffer = nearby_protocol::ByteBuffer<2>::TryFromSpan(data); + ASSERT_FALSE(buffer.ok()); +} + TEST_F(NpCppTest, 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); + auto buffer = nearby_protocol::ByteBuffer< + nearby_protocol::MAX_ADV_PAYLOAD_SIZE>::TryFromString(bytes); ASSERT_FALSE(buffer.ok()); } TEST_F(NpCppTest, ByteBufferRoundTrip) { auto bytes = absl::HexStringToBytes("2003031503"); - auto buffer = nearby_protocol::ByteBuffer<255>::CopyFrom(bytes); + auto buffer = nearby_protocol::ByteBuffer< + nearby_protocol::MAX_ADV_PAYLOAD_SIZE>::TryFromString(bytes); auto string = buffer.value().ToString(); ASSERT_EQ(bytes, string); } TEST_F(NpCppTest, ByteBufferPayloadWrongSize) { auto bytes = absl::HexStringToBytes("1111111111111111111111"); - auto buffer = nearby_protocol::ByteBuffer<10>::CopyFrom(bytes); + auto buffer = nearby_protocol::ByteBuffer<10>::TryFromString(bytes); ASSERT_FALSE(buffer.ok()); } TEST_F(NpCppTest, ByteBufferEmptyString) { auto bytes = absl::HexStringToBytes(""); - auto buffer = nearby_protocol::ByteBuffer<10>::CopyFrom(bytes); + auto buffer = nearby_protocol::ByteBuffer<10>::TryFromString(bytes); ASSERT_TRUE(buffer.ok()); } TEST_F(NpCppTest, ByteBufferToVector) { auto bytes = absl::HexStringToBytes("1234567890"); - auto buffer = nearby_protocol::ByteBuffer<100>::CopyFrom(bytes); + auto buffer = nearby_protocol::ByteBuffer<100>::TryFromString(bytes); auto vec = buffer.value().ToVector(); - std::vector<uint8_t> expected{0x12, 0x34, 0x56, 0x78, 0x90}; + const std::vector<uint8_t> expected{0x12, 0x34, 0x56, 0x78, 0x90}; ASSERT_EQ(vec, expected); } TEST_F(NpCppTest, ByteBufferEndToEndPayloadAsString) { - std::string bytes = absl::HexStringToBytes("2003031503"); - auto buffer = nearby_protocol::ByteBuffer<255>::CopyFrom(bytes); + const std::string bytes = absl::HexStringToBytes("2003031503"); + auto buffer = nearby_protocol::ByteBuffer< + nearby_protocol::MAX_ADV_PAYLOAD_SIZE>::TryFromString(bytes); ASSERT_TRUE(buffer.ok()); - nearby_protocol::RawAdvertisementPayload adv(buffer.value()); + const nearby_protocol::RawAdvertisementPayload adv(buffer.value()); auto credential_slab = nearby_protocol::CredentialSlab::TryCreate().value(); auto credential_book = @@ -86,3 +138,4 @@ .ToString(); ASSERT_EQ(str, absl::HexStringToBytes("03")); } +// NOLINTEND(readability-magic-numbers) \ No newline at end of file
diff --git a/nearby/presence/np_cpp_ffi/tests/credential_book_tests.cc b/nearby/presence/np_cpp_ffi/tests/credential_book_tests.cc index af8fc0d..32aa173 100644 --- a/nearby/presence/np_cpp_ffi/tests/credential_book_tests.cc +++ b/nearby/presence/np_cpp_ffi/tests/credential_book_tests.cc
@@ -12,26 +12,32 @@ // See the License for the specific language governing permissions and // limitations under the License. -#include "nearby_protocol.h" -#include "shared_test_util.h" -#include "np_cpp_test.h" +#include <utility> +#include "absl/status/status.h" #include "gtest/gtest.h" +#include "nearby_protocol.h" +#include "np_cpp_ffi_types.h" +#include "np_cpp_test.h" +#include "shared_test_util.h" TEST_F(NpCppTest, TestSetMaxCredBooks) { auto slab1_result = nearby_protocol::CredentialSlab::TryCreate(); ASSERT_TRUE(slab1_result.ok()); - auto book1_result = nearby_protocol::CredentialBook::TryCreateFromSlab(slab1_result.value()); + auto book1_result = + nearby_protocol::CredentialBook::TryCreateFromSlab(slab1_result.value()); ASSERT_TRUE(book1_result.ok()); auto slab2_result = nearby_protocol::CredentialSlab::TryCreate(); ASSERT_TRUE(slab2_result.ok()); - auto book2_result = nearby_protocol::CredentialBook::TryCreateFromSlab(slab2_result.value()); + auto book2_result = + nearby_protocol::CredentialBook::TryCreateFromSlab(slab2_result.value()); ASSERT_TRUE(book2_result.ok()); auto slab3_result = nearby_protocol::CredentialSlab::TryCreate(); ASSERT_TRUE(slab3_result.ok()); - auto book3_result = nearby_protocol::CredentialBook::TryCreateFromSlab(slab3_result.value()); + auto book3_result = + nearby_protocol::CredentialBook::TryCreateFromSlab(slab3_result.value()); ASSERT_FALSE(book3_result.ok()); ASSERT_TRUE(absl::IsResourceExhausted(book3_result.status())); @@ -41,31 +47,32 @@ auto slab = nearby_protocol::CredentialSlab::TryCreate().value(); auto book = nearby_protocol::CredentialBook::TryCreateFromSlab(slab).value(); auto deserialize_result = - nearby_protocol::Deserializer::DeserializeAdvertisement(V0AdvSimple, + nearby_protocol::Deserializer::DeserializeAdvertisement(V0AdvPlaintext, book); ASSERT_EQ(deserialize_result.GetKind(), - np_ffi::internal::DeserializeAdvertisementResultKind::V0); + nearby_protocol::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)); + const nearby_protocol::CredentialBook next_book(std::move(book)); auto deserialize_result_moved = - nearby_protocol::Deserializer::DeserializeAdvertisement(V0AdvSimple, + nearby_protocol::Deserializer::DeserializeAdvertisement(V0AdvPlaintext, next_book); ASSERT_EQ(deserialize_result_moved.GetKind(), - np_ffi::internal::DeserializeAdvertisementResultKind::V0); + nearby_protocol::DeserializeAdvertisementResultKind::V0); // The old object should now lead to use after moved assert failure - ASSERT_DEATH([[maybe_unused]] auto failure = - nearby_protocol::Deserializer::DeserializeAdvertisement( - V0AdvSimple, book), // NOLINT(bugprone-use-after-move) - ""); + ASSERT_DEATH( + [[maybe_unused]] auto failure = + nearby_protocol::Deserializer::DeserializeAdvertisement( + V0AdvPlaintext, 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)); + const nearby_protocol::CredentialBook another_moved_book(std::move(book)); ASSERT_DEATH([[maybe_unused]] auto failure = nearby_protocol::Deserializer::DeserializeAdvertisement( - V0AdvSimple, another_moved_book), + V0AdvPlaintext, another_moved_book), ""); } @@ -73,33 +80,35 @@ auto slab = nearby_protocol::CredentialSlab::TryCreate().value(); auto book = nearby_protocol::CredentialBook::TryCreateFromSlab(slab).value(); auto deserialize_result = - nearby_protocol::Deserializer::DeserializeAdvertisement(V0AdvSimple, + nearby_protocol::Deserializer::DeserializeAdvertisement(V0AdvPlaintext, book); ASSERT_EQ(deserialize_result.GetKind(), - np_ffi::internal::DeserializeAdvertisementResultKind::V0); + nearby_protocol::DeserializeAdvertisementResultKind::V0); // create a second empty credential book auto other_slab = nearby_protocol::CredentialSlab::TryCreate().value(); - auto other_book = nearby_protocol::CredentialBook::TryCreateFromSlab(other_slab).value(); + auto other_book = + nearby_protocol::CredentialBook::TryCreateFromSlab(other_slab).value(); other_book = std::move(book); // new credential book should still be successful auto deserialize_result_other = - nearby_protocol::Deserializer::DeserializeAdvertisement(V0AdvSimple, + nearby_protocol::Deserializer::DeserializeAdvertisement(V0AdvPlaintext, other_book); ASSERT_EQ(deserialize_result_other.GetKind(), - np_ffi::internal::DeserializeAdvertisementResultKind::V0); + nearby_protocol::DeserializeAdvertisementResultKind::V0); // The old object should now lead to use after moved assert failure - ASSERT_DEATH([[maybe_unused]] auto failure = - nearby_protocol::Deserializer::DeserializeAdvertisement( - V0AdvSimple, book), // NOLINT(bugprone-use-after-move) - ""); + ASSERT_DEATH( + [[maybe_unused]] auto failure = + nearby_protocol::Deserializer::DeserializeAdvertisement( + V0AdvPlaintext, 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( - V0AdvSimple, another_moved_book), + V0AdvPlaintext, another_moved_book), ""); }
diff --git a/nearby/presence/np_cpp_ffi/tests/credential_slab_tests.cc b/nearby/presence/np_cpp_ffi/tests/credential_slab_tests.cc index b99ab5e..719323f 100644 --- a/nearby/presence/np_cpp_ffi/tests/credential_slab_tests.cc +++ b/nearby/presence/np_cpp_ffi/tests/credential_slab_tests.cc
@@ -12,12 +12,17 @@ // See the License for the specific language governing permissions and // limitations under the License. +#include <array> +#include <cstdint> +#include <span> +#include <utility> + +#include "absl/status/status.h" +#include "gtest/gtest.h" #include "nearby_protocol.h" #include "np_cpp_test.h" -#include "shared_test_util.h" -#include "gtest/gtest.h" - +// NOLINTBEGIN(readability-magic-numbers) TEST_F(NpCppTest, TestSetMaxCredSlabs) { auto slab1_result = nearby_protocol::CredentialSlab::TryCreate(); ASSERT_TRUE(slab1_result.ok()); @@ -50,7 +55,7 @@ // result in an assert failure. ASSERT_DEATH([[maybe_unused]] auto failure = nearby_protocol::CredentialBook::TryCreateFromSlab( - slab), // NOLINT(bugprone-use-after-move) + slab), // NOLINT(bugprone-use-after-move) ""); ASSERT_DEATH( [[maybe_unused]] auto failure = @@ -99,14 +104,14 @@ // The old object should now lead to use after moved assert failure ASSERT_DEATH([[maybe_unused]] auto failure = nearby_protocol::CredentialBook::TryCreateFromSlab( - slab_result.value()), // NOLINT(bugprone-use-after-move) + slab_result.value()), // NOLINT(bugprone-use-after-move) ""); // moving again should still lead to a use after moved assert failure auto another_moved_book = std::move(slab_result.value()); ASSERT_DEATH([[maybe_unused]] auto failure = nearby_protocol::CredentialBook::TryCreateFromSlab( - another_moved_book), // NOLINT(bugprone-use-after-move) + another_moved_book), // NOLINT(bugprone-use-after-move) ""); } @@ -115,13 +120,13 @@ ASSERT_TRUE(slab_result.ok()); uint8_t metadata[] = {1, 2, 3}; - std::span<uint8_t> metadata_span(metadata); + const std::span<uint8_t> metadata_span(metadata); - nearby_protocol::MatchedCredentialData match_data(111, metadata_span); - std::array<uint8_t, 32> key_seed {1, 2, 3}; - std::array<uint8_t, 32> legacy_metadata_key_hmac {1, 2, 3}; + const nearby_protocol::MatchedCredentialData match_data(111, metadata_span); + const std::array<uint8_t, 32> key_seed{1, 2, 3}; + const std::array<uint8_t, 32> legacy_metadata_key_hmac{1, 2, 3}; - nearby_protocol::V0MatchableCredential v0_cred( + const nearby_protocol::V0MatchableCredential v0_cred( key_seed, legacy_metadata_key_hmac, match_data); auto add_result = slab_result.value().AddV0Credential(v0_cred); ASSERT_EQ(add_result, absl::OkStatus()); @@ -137,11 +142,11 @@ ASSERT_TRUE(maybe_book.ok()); uint8_t metadata[] = {1, 2, 3}; - std::span<uint8_t> metadata_span(metadata); - nearby_protocol::MatchedCredentialData match_data(111, metadata_span); - std::array<uint8_t, 32> key_seed {1, 2, 3}; - std::array<uint8_t, 32> legacy_metadata_key_hmac {1, 2, 3}; - nearby_protocol::V0MatchableCredential v0_cred( + const std::span<uint8_t> metadata_span(metadata); + const nearby_protocol::MatchedCredentialData match_data(111, metadata_span); + const std::array<uint8_t, 32> key_seed{1, 2, 3}; + const std::array<uint8_t, 32> legacy_metadata_key_hmac{1, 2, 3}; + const nearby_protocol::V0MatchableCredential v0_cred( key_seed, legacy_metadata_key_hmac, match_data); ASSERT_DEATH([[maybe_unused]] auto add_result = @@ -154,13 +159,13 @@ ASSERT_TRUE(slab_result.ok()); uint8_t metadata[] = {1, 2, 3}; - std::span<uint8_t> metadata_span(metadata); - nearby_protocol::MatchedCredentialData match_data(111, metadata_span); - std::array<uint8_t, 32> key_seed {1, 2, 3}; - std::array<uint8_t, 32> expected_unsigned_metadata_key_hmac {1, 2, 3}; - std::array<uint8_t, 32> expected_signed_metadata_key_hmac {1, 2, 3}; - std::array<uint8_t, 32> pub_key {1, 2, 3}; - nearby_protocol::V1MatchableCredential v1_cred( + const std::span<uint8_t> metadata_span(metadata); + const nearby_protocol::MatchedCredentialData match_data(111, metadata_span); + const std::array<uint8_t, 32> key_seed{1, 2, 3}; + const std::array<uint8_t, 32> expected_unsigned_metadata_key_hmac{1, 2, 3}; + const std::array<uint8_t, 32> expected_signed_metadata_key_hmac{1, 2, 3}; + const std::array<uint8_t, 32> pub_key{1, 2, 3}; + const nearby_protocol::V1MatchableCredential v1_cred( key_seed, expected_unsigned_metadata_key_hmac, expected_signed_metadata_key_hmac, pub_key, match_data); @@ -178,13 +183,13 @@ ASSERT_TRUE(maybe_book.ok()); uint8_t metadata[] = {1, 2, 3}; - std::span<uint8_t> metadata_span(metadata); - nearby_protocol::MatchedCredentialData match_data(111, metadata_span); - std::array<uint8_t, 32> key_seed {1, 2, 3}; - std::array<uint8_t, 32> expected_unsigned_metadata_key_hmac {1, 2, 3}; - std::array<uint8_t, 32> expected_signed_metadata_key_hmac {1, 2, 3}; - std::array<uint8_t, 32> pub_key {1, 2, 3}; - nearby_protocol::V1MatchableCredential v1_cred( + const std::span<uint8_t> metadata_span(metadata); + const nearby_protocol::MatchedCredentialData match_data(111, metadata_span); + const std::array<uint8_t, 32> key_seed{1, 2, 3}; + const std::array<uint8_t, 32> expected_unsigned_metadata_key_hmac{1, 2, 3}; + const std::array<uint8_t, 32> expected_signed_metadata_key_hmac{1, 2, 3}; + const std::array<uint8_t, 32> pub_key{1, 2, 3}; + const nearby_protocol::V1MatchableCredential v1_cred( key_seed, expected_unsigned_metadata_key_hmac, expected_signed_metadata_key_hmac, pub_key, match_data); @@ -192,3 +197,37 @@ slab_result.value().AddV1Credential(v1_cred); , ""); } + +// make sure the book can be populated with many credentials +TEST_F(NpCppTest, TestAddManyCredentials) { + auto slab_result = nearby_protocol::CredentialSlab::TryCreate(); + ASSERT_TRUE(slab_result.ok()); + + // Should be able to load the slab up with many credentials + for (int i = 0; i < 500; i++) { + uint8_t metadata[] = {1, 2, 3}; + const std::span<uint8_t> metadata_span(metadata); + const nearby_protocol::MatchedCredentialData match_data(111, metadata_span); + const std::array<uint8_t, 32> key_seed{1, 2, 3}; + const std::array<uint8_t, 32> legacy_metadata_key_hmac{1, 2, 3}; + const nearby_protocol::V0MatchableCredential v0_cred( + key_seed, legacy_metadata_key_hmac, match_data); + auto add_result = slab_result->AddV0Credential(v0_cred); + ASSERT_EQ(add_result, absl::OkStatus()); + + const std::array<uint8_t, 32> v1_key_seed{1, 2, 3}; + const std::array<uint8_t, 32> v1_expected_unsigned_metadata_key_hmac{1, 2, + 3}; + const std::array<uint8_t, 32> v1_expected_signed_metadata_key_hmac{1, 2, 3}; + const std::array<uint8_t, 32> v1_pub_key{1, 2, 3}; + const nearby_protocol::V1MatchableCredential v1_cred( + v1_key_seed, v1_expected_unsigned_metadata_key_hmac, + v1_expected_signed_metadata_key_hmac, v1_pub_key, match_data); + + auto add_v1_result = slab_result->AddV1Credential(v1_cred); + ASSERT_EQ(add_v1_result, absl::OkStatus()); + } + ASSERT_TRUE( + nearby_protocol::CredentialBook::TryCreateFromSlab(*slab_result).ok()); +} +// NOLINTEND(readability-magic-numbers) \ 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 index 0469933..37ef27a 100644 --- a/nearby/presence/np_cpp_ffi/tests/deserialize_result_tests.cc +++ b/nearby/presence/np_cpp_ffi/tests/deserialize_result_tests.cc
@@ -12,18 +12,22 @@ // See the License for the specific language governing permissions and // limitations under the License. -#include "nearby_protocol.h" -#include "shared_test_util.h" -#include "np_cpp_test.h" +#include <array> +#include <cstdint> +#include <utility> #include "absl/strings/escaping.h" #include "gtest/gtest.h" +#include "nearby_protocol.h" +#include "np_cpp_ffi_types.h" +#include "np_cpp_test.h" +#include "shared_test_util.h" TEST_F(NpCppTest, TestResultMoveConstructor) { auto slab = nearby_protocol::CredentialSlab::TryCreate().value(); auto book = nearby_protocol::CredentialBook::TryCreateFromSlab(slab).value(); auto result = nearby_protocol::Deserializer::DeserializeAdvertisement( - V0AdvSimple, book); + V0AdvPlaintext, book); ASSERT_EQ(result.GetKind(), np_ffi::internal::DeserializeAdvertisementResultKind::V0); @@ -39,7 +43,7 @@ // 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 + result.IntoV0(), // NOLINT(bugprone-use-after-move) ""); ASSERT_DEATH([[maybe_unused]] auto failure = result.GetKind(), ""); @@ -53,15 +57,18 @@ TEST_F(NpCppTest, DeserializeFromStringView) { auto bytes = absl::HexStringToBytes("00031503"); - auto buffer = nearby_protocol::ByteBuffer<255>::CopyFrom(bytes); + auto buffer = nearby_protocol::ByteBuffer< + nearby_protocol::MAX_ADV_PAYLOAD_SIZE>::TryFromString(bytes); ASSERT_TRUE(buffer.ok()); - nearby_protocol::RawAdvertisementPayload adv(buffer.value()); + const nearby_protocol::RawAdvertisementPayload adv(buffer.value()); auto maybe_credential_slab = nearby_protocol::CredentialSlab::TryCreate(); ASSERT_TRUE(maybe_credential_slab.ok()); - auto maybe_credential_book = nearby_protocol::CredentialBook::TryCreateFromSlab(maybe_credential_slab.value()); + auto maybe_credential_book = + nearby_protocol::CredentialBook::TryCreateFromSlab( + maybe_credential_slab.value()); ASSERT_TRUE(maybe_credential_book.ok()); auto deserialize_result = @@ -76,8 +83,7 @@ nearby_protocol::DeserializedV0AdvertisementKind::Legible); auto legible_adv = v0_adv.IntoLegible(); auto identity = legible_adv.GetIdentityKind(); - ASSERT_EQ(identity, - nearby_protocol::DeserializedV0IdentityKind::Plaintext); + ASSERT_EQ(identity, nearby_protocol::DeserializedV0IdentityKind::Plaintext); auto num_des = legible_adv.GetNumberOfDataElements(); ASSERT_EQ(num_des, 1); @@ -89,20 +95,20 @@ ASSERT_EQ(de.GetKind(), nearby_protocol::V0DataElementKind::TxPower); auto tx_power = de.AsTxPower(); - ASSERT_EQ(tx_power.tx_power, 3); + ASSERT_EQ(tx_power.GetAsI8(), 3); } TEST_F(NpCppTest, TestResultMoveAssignment) { auto slab = nearby_protocol::CredentialSlab::TryCreate().value(); auto book = nearby_protocol::CredentialBook::TryCreateFromSlab(slab).value(); auto result = nearby_protocol::Deserializer::DeserializeAdvertisement( - V0AdvSimple, book); + V0AdvPlaintext, book); ASSERT_EQ(result.GetKind(), np_ffi::internal::DeserializeAdvertisementResultKind::V0); // create a second result auto another_result = nearby_protocol::Deserializer::DeserializeAdvertisement( - V0AdvSimple, book); + V0AdvPlaintext, book); ASSERT_EQ(another_result.GetKind(), np_ffi::internal::DeserializeAdvertisementResultKind::V0); @@ -116,7 +122,7 @@ // 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) + result.IntoV0(), // NOLINT(bugprone-use-after-move) ""); ASSERT_DEATH([[maybe_unused]] auto failure = result.GetKind(), ""); @@ -128,13 +134,16 @@ TEST_F(NpCppTest, TestInvalidPayloadHeader) { // An invalid header result should result in error - nearby_protocol::RawAdvertisementPayload InvalidHeaderPayload( - nearby_protocol::ByteBuffer<255>({1, {0xFF}})); + const std::array<uint8_t, 1> InvalidHeaderPayloadBytes{0xFF}; + const nearby_protocol::RawAdvertisementPayload InvalidHeaderPayload( + (nearby_protocol::ByteBuffer<255>(InvalidHeaderPayloadBytes))); auto maybe_credential_slab = nearby_protocol::CredentialSlab::TryCreate(); ASSERT_TRUE(maybe_credential_slab.ok()); - auto maybe_credential_book = nearby_protocol::CredentialBook::TryCreateFromSlab(maybe_credential_slab.value()); + auto maybe_credential_book = + nearby_protocol::CredentialBook::TryCreateFromSlab( + maybe_credential_slab.value()); ASSERT_TRUE(maybe_credential_book.ok()); auto deserialize_result = @@ -144,27 +153,29 @@ // 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(); }, - ""); + ASSERT_DEATH( + { [[maybe_unused]] auto failure = deserialize_result.IntoV0(); }, ""); + ASSERT_DEATH( + { [[maybe_unused]] auto failure = deserialize_result.IntoV1(); }, ""); } TEST_F(NpCppTest, TestInvalidV0Cast) { auto maybe_credential_slab = nearby_protocol::CredentialSlab::TryCreate(); ASSERT_TRUE(maybe_credential_slab.ok()); - auto maybe_credential_book = nearby_protocol::CredentialBook::TryCreateFromSlab(maybe_credential_slab.value()); + auto maybe_credential_book = + nearby_protocol::CredentialBook::TryCreateFromSlab( + maybe_credential_slab.value()); ASSERT_TRUE(maybe_credential_book.ok()); auto deserialize_result = nearby_protocol::Deserializer::DeserializeAdvertisement( - V1AdvSimple, maybe_credential_book.value()); + V1AdvPlaintext, maybe_credential_book.value()); ASSERT_EQ(deserialize_result.GetKind(), nearby_protocol::DeserializeAdvertisementResultKind::V1); - ASSERT_DEATH({ [[maybe_unused]] auto failure = deserialize_result.IntoV0(); }, - ""); + ASSERT_DEATH( + { [[maybe_unused]] auto failure = deserialize_result.IntoV0(); }, ""); } TEST_F(NpCppTest, TestInvalidV1Cast) { @@ -172,30 +183,33 @@ auto maybe_credential_slab = nearby_protocol::CredentialSlab::TryCreate(); ASSERT_TRUE(maybe_credential_slab.ok()); - auto maybe_credential_book = nearby_protocol::CredentialBook::TryCreateFromSlab(maybe_credential_slab.value()); + auto maybe_credential_book = + nearby_protocol::CredentialBook::TryCreateFromSlab( + maybe_credential_slab.value()); ASSERT_TRUE(maybe_credential_book.ok()); - auto deserialize_result = nearby_protocol::Deserializer::DeserializeAdvertisement( - V0AdvSimple, maybe_credential_book.value()); + V0AdvPlaintext, maybe_credential_book.value()); ASSERT_EQ(deserialize_result.GetKind(), nearby_protocol::DeserializeAdvertisementResultKind::V0); - ASSERT_DEATH({ [[maybe_unused]] auto failure = deserialize_result.IntoV1(); }, - ""); + ASSERT_DEATH( + { [[maybe_unused]] auto failure = deserialize_result.IntoV1(); }, ""); } TEST_F(NpCppTest, V0UseResultTwice) { auto maybe_credential_slab = nearby_protocol::CredentialSlab::TryCreate(); ASSERT_TRUE(maybe_credential_slab.ok()); - auto maybe_credential_book = nearby_protocol::CredentialBook::TryCreateFromSlab(maybe_credential_slab.value()); + auto maybe_credential_book = + nearby_protocol::CredentialBook::TryCreateFromSlab( + maybe_credential_slab.value()); ASSERT_TRUE(maybe_credential_book.ok()); auto deserialize_result = nearby_protocol::Deserializer::DeserializeAdvertisement( - V0AdvSimple, maybe_credential_book.value()); + V0AdvPlaintext, maybe_credential_book.value()); ASSERT_EQ(deserialize_result.GetKind(), np_ffi::internal::DeserializeAdvertisementResultKind::V0); @@ -203,20 +217,22 @@ 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(); }, - ""); + ASSERT_DEATH( + { [[maybe_unused]] auto failure = deserialize_result.IntoV0(); }, ""); } TEST_F(NpCppTest, V1UseResultTwice) { auto maybe_credential_slab = nearby_protocol::CredentialSlab::TryCreate(); ASSERT_TRUE(maybe_credential_slab.ok()); - auto maybe_credential_book = nearby_protocol::CredentialBook::TryCreateFromSlab(maybe_credential_slab.value()); + auto maybe_credential_book = + nearby_protocol::CredentialBook::TryCreateFromSlab( + maybe_credential_slab.value()); ASSERT_TRUE(maybe_credential_book.ok()); auto deserialize_result = nearby_protocol::Deserializer::DeserializeAdvertisement( - V1AdvSimple, maybe_credential_book.value()); + V1AdvPlaintext, maybe_credential_book.value()); ASSERT_EQ(deserialize_result.GetKind(), np_ffi::internal::DeserializeAdvertisementResultKind::V1); @@ -224,20 +240,22 @@ 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(); }, - ""); + ASSERT_DEATH( + { [[maybe_unused]] auto failure = deserialize_result.IntoV1(); }, ""); } TEST_F(NpCppTest, IntoV0AfterOutOfScope) { auto maybe_credential_slab = nearby_protocol::CredentialSlab::TryCreate(); ASSERT_TRUE(maybe_credential_slab.ok()); - auto maybe_credential_book = nearby_protocol::CredentialBook::TryCreateFromSlab(maybe_credential_slab.value()); + auto maybe_credential_book = + nearby_protocol::CredentialBook::TryCreateFromSlab( + maybe_credential_slab.value()); ASSERT_TRUE(maybe_credential_book.ok()); auto deserialize_result = nearby_protocol::Deserializer::DeserializeAdvertisement( - V0AdvSimple, maybe_credential_book.value()); + V0AdvPlaintext, maybe_credential_book.value()); ASSERT_EQ(deserialize_result.GetKind(), np_ffi::internal::DeserializeAdvertisementResultKind::V0); @@ -246,20 +264,22 @@ // 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(); }, - ""); + ASSERT_DEATH( + { [[maybe_unused]] auto failure = deserialize_result.IntoV0(); }, ""); } TEST_F(NpCppTest, IntoV1AfterOutOfScope) { auto maybe_credential_slab = nearby_protocol::CredentialSlab::TryCreate(); ASSERT_TRUE(maybe_credential_slab.ok()); - auto maybe_credential_book = nearby_protocol::CredentialBook::TryCreateFromSlab(maybe_credential_slab.value()); + auto maybe_credential_book = + nearby_protocol::CredentialBook::TryCreateFromSlab( + maybe_credential_slab.value()); ASSERT_TRUE(maybe_credential_book.ok()); auto deserialize_result = nearby_protocol::Deserializer::DeserializeAdvertisement( - V1AdvSimple, maybe_credential_book.value()); + V1AdvPlaintext, maybe_credential_book.value()); ASSERT_EQ(deserialize_result.GetKind(), np_ffi::internal::DeserializeAdvertisementResultKind::V1); @@ -268,20 +288,22 @@ // 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(); }, - ""); + ASSERT_DEATH( + { [[maybe_unused]] auto failure = deserialize_result.IntoV1(); }, ""); } TEST_F(NpCppTest, V0ResultKindAfterOutOfScope) { auto maybe_credential_slab = nearby_protocol::CredentialSlab::TryCreate(); ASSERT_TRUE(maybe_credential_slab.ok()); - auto maybe_credential_book = nearby_protocol::CredentialBook::TryCreateFromSlab(maybe_credential_slab.value()); + auto maybe_credential_book = + nearby_protocol::CredentialBook::TryCreateFromSlab( + maybe_credential_slab.value()); ASSERT_TRUE(maybe_credential_book.ok()); auto deserialize_result = nearby_protocol::Deserializer::DeserializeAdvertisement( - V0AdvSimple, maybe_credential_book.value()); + V0AdvPlaintext, maybe_credential_book.value()); ASSERT_EQ(deserialize_result.GetKind(), np_ffi::internal::DeserializeAdvertisementResultKind::V0); @@ -298,12 +320,14 @@ auto maybe_credential_slab = nearby_protocol::CredentialSlab::TryCreate(); ASSERT_TRUE(maybe_credential_slab.ok()); - auto maybe_credential_book = nearby_protocol::CredentialBook::TryCreateFromSlab(maybe_credential_slab.value()); + auto maybe_credential_book = + nearby_protocol::CredentialBook::TryCreateFromSlab( + maybe_credential_slab.value()); ASSERT_TRUE(maybe_credential_book.ok()); auto deserialize_result = nearby_protocol::Deserializer::DeserializeAdvertisement( - V1AdvSimple, maybe_credential_book.value()); + V1AdvPlaintext, maybe_credential_book.value()); ASSERT_EQ(deserialize_result.GetKind(), np_ffi::internal::DeserializeAdvertisementResultKind::V1);
diff --git a/nearby/presence/np_cpp_ffi/tests/np_cpp_test.h b/nearby/presence/np_cpp_ffi/tests/np_cpp_test.h index 03eb03a..6cbf8c9 100644 --- a/nearby/presence/np_cpp_ffi/tests/np_cpp_test.h +++ b/nearby/presence/np_cpp_ffi/tests/np_cpp_test.h
@@ -15,13 +15,12 @@ #ifndef NEARBY_PRESENCE_NP_CPP_FFI_TESTS_NP_CPP_TEST_H_ #define NEARBY_PRESENCE_NP_CPP_FFI_TESTS_NP_CPP_TEST_H_ +#include "gtest/gtest.h" #include "nearby_protocol.h" #include "shared_test_util.h" -#include <gtest/gtest.h> - class NpCppTest : public testing::Test { -protected: + protected: static void SetUpTestSuite() { if (!panic_handler_set) { ASSERT_TRUE( @@ -31,6 +30,7 @@ nearby_protocol::GlobalConfig::SetMaxNumDeserializedV1Advertisements(2); nearby_protocol::GlobalConfig::SetMaxNumCredentialSlabs(3); nearby_protocol::GlobalConfig::SetMaxNumCredentialBooks(2); + nearby_protocol::GlobalConfig::SetMaxNumV0AdvertisementBuilders(2); } else { ASSERT_FALSE( nearby_protocol::GlobalConfig::SetPanicHandler(test_panic_handler)); @@ -39,4 +39,4 @@ static bool panic_handler_set; }; -#endif // NEARBY_PRESENCE_NP_CPP_FFI_TESTS_NP_CPP_TEST_H_ +#endif // NEARBY_PRESENCE_NP_CPP_FFI_TESTS_NP_CPP_TEST_H_
diff --git a/nearby/presence/np_cpp_ffi/tests/v0_encrypted_deserialization_tests.cc b/nearby/presence/np_cpp_ffi/tests/v0_encrypted_deserialization_tests.cc new file mode 100644 index 0000000..3d74295 --- /dev/null +++ b/nearby/presence/np_cpp_ffi/tests/v0_encrypted_deserialization_tests.cc
@@ -0,0 +1,192 @@ +// 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 <algorithm> +#include <array> +#include <cstdint> +#include <span> +#include <string> + +#include "absl/status/status.h" +#include "gtest/gtest.h" +#include "nearby_protocol.h" +#include "np_cpp_ffi_types.h" +#include "np_cpp_test.h" +#include "shared_test_util.h" + +// NOLINTBEGIN(readability-magic-numbers) +TEST_F(NpCppTest, V0PrivateIdentityDeserializationSimpleCase) { + auto slab_result = nearby_protocol::CredentialSlab::TryCreate(); + ASSERT_TRUE(slab_result.ok()); + + const std::span<uint8_t> metadata_span(V0AdvEncryptedMetadata); + const nearby_protocol::MatchedCredentialData match_data(123, metadata_span); + + std::array<uint8_t, 32> key_seed = {}; + std::fill_n(key_seed.begin(), 32, 0x11); + + const nearby_protocol::V0MatchableCredential v0_cred( + key_seed, V0AdvLegacyMetadataKeyHmac, match_data); + + auto add_result = slab_result->AddV0Credential(v0_cred); + ASSERT_EQ(add_result, absl::OkStatus()); + + auto book_result = + nearby_protocol::CredentialBook::TryCreateFromSlab(*slab_result); + ASSERT_TRUE(book_result.ok()); + + auto deserialize_result = + nearby_protocol::Deserializer::DeserializeAdvertisement( + V0AdvEncryptedPayload, *book_result); + ASSERT_EQ(deserialize_result.GetKind(), + nearby_protocol::DeserializeAdvertisementResultKind::V0); + + auto v0_adv = deserialize_result.IntoV0(); + auto kind = v0_adv.GetKind(); + ASSERT_EQ(kind, nearby_protocol::DeserializedV0AdvertisementKind::Legible); + + auto legible_adv = v0_adv.IntoLegible(); + auto identity_kind = legible_adv.GetIdentityKind(); + ASSERT_EQ(identity_kind, + nearby_protocol::DeserializedV0IdentityKind::Decrypted); + ASSERT_EQ(legible_adv.GetNumberOfDataElements(), 1); + + auto payload = legible_adv.IntoPayload(); + auto de = payload.TryGetDataElement(0); + ASSERT_TRUE(de.ok()); + + auto metadata = payload.DecryptMetadata(); + ASSERT_TRUE(metadata.ok()); + ASSERT_EQ(ExpectedV0DecryptedMetadata, + std::string(metadata->begin(), metadata->end())); + + auto identity_details = payload.GetIdentityDetails(); + ASSERT_TRUE(identity_details.ok()); + ASSERT_EQ(identity_details->cred_id, 123); + ASSERT_EQ(identity_details->identity_type, + nearby_protocol::EncryptedIdentityType::Private); + + auto de_type = de->GetKind(); + ASSERT_EQ(de_type, nearby_protocol::V0DataElementKind::TxPower); + + auto tx_power_de = de->AsTxPower(); + ASSERT_EQ(tx_power_de.GetAsI8(), 3); +} + +nearby_protocol::CredentialBook CreateEmptyCredBook() { + auto slab = nearby_protocol::CredentialSlab::TryCreate().value(); + auto book = nearby_protocol::CredentialBook::TryCreateFromSlab(slab).value(); + return book; +} + +TEST_F(NpCppTest, V0PrivateIdentityEmptyBook) { + auto book = CreateEmptyCredBook(); + auto deserialize_result = + nearby_protocol::Deserializer::DeserializeAdvertisement( + V0AdvEncryptedPayload, book); + ASSERT_EQ(deserialize_result.GetKind(), + nearby_protocol::DeserializeAdvertisementResultKind::V0); + + auto v0_adv = deserialize_result.IntoV0(); + ASSERT_EQ( + v0_adv.GetKind(), + nearby_protocol::DeserializedV0AdvertisementKind::NoMatchingCredentials); + + // Should not be able to actually access contents + ASSERT_DEATH([[maybe_unused]] auto failure = v0_adv.IntoLegible(), ""); +} + +TEST_F(NpCppTest, V0PrivateIdentityNoMatchingCreds) { + auto slab_result = nearby_protocol::CredentialSlab::TryCreate(); + ASSERT_TRUE(slab_result.ok()); + + uint8_t metadata[] = {0}; + const std::span<uint8_t> metadata_span(metadata); + const nearby_protocol::MatchedCredentialData match_data(123, metadata_span); + + // A randomly picked key seed, does NOT match what was used for the canned adv + std::array<uint8_t, 32> key_seed = {}; + std::fill_n(key_seed.begin(), 31, 0x11); + + const nearby_protocol::V0MatchableCredential v0_cred( + key_seed, V0AdvLegacyMetadataKeyHmac, match_data); + + auto add_result = slab_result->AddV0Credential(v0_cred); + ASSERT_EQ(add_result, absl::OkStatus()); + + auto book_result = + nearby_protocol::CredentialBook::TryCreateFromSlab(*slab_result); + ASSERT_TRUE(book_result.ok()); + + auto deserialize_result = + nearby_protocol::Deserializer::DeserializeAdvertisement( + V0AdvEncryptedPayload, *book_result); + ASSERT_EQ(deserialize_result.GetKind(), + nearby_protocol::DeserializeAdvertisementResultKind::V0); + + auto v0_adv = deserialize_result.IntoV0(); + ASSERT_EQ( + v0_adv.GetKind(), + nearby_protocol::DeserializedV0AdvertisementKind::NoMatchingCredentials); + + // Should not be able to actually access contents + ASSERT_DEATH([[maybe_unused]] auto failure = v0_adv.IntoLegible(), ""); +} + +// Make sure the correct credential is matched out of multiple provided +TEST_F(NpCppTest, V0PrivateIdentityMultipleCredentials) { + auto slab = nearby_protocol::CredentialSlab::TryCreate().value(); + const std::span<uint8_t> metadata_span(V0AdvEncryptedMetadata); + std::array<uint8_t, 32> key_seed = {}; + // Non matching credential + const nearby_protocol::MatchedCredentialData match_data(123, metadata_span); + std::fill_n(key_seed.begin(), 32, 0x12); + const nearby_protocol::V0MatchableCredential v0_cred( + key_seed, V0AdvLegacyMetadataKeyHmac, match_data); + ASSERT_TRUE(slab.AddV0Credential(v0_cred).ok()); + + // Matching credential + const nearby_protocol::MatchedCredentialData match_data2(456, metadata_span); + std::fill_n(key_seed.begin(), 32, 0x11); + const nearby_protocol::V0MatchableCredential v0_cred2( + key_seed, V0AdvLegacyMetadataKeyHmac, match_data2); + ASSERT_TRUE(slab.AddV0Credential(v0_cred2).ok()); + + // Non matching credential + const nearby_protocol::MatchedCredentialData match_data3(789, metadata_span); + std::fill_n(key_seed.begin(), 32, 0x13); + const nearby_protocol::V0MatchableCredential v0_cred3( + key_seed, V0AdvLegacyMetadataKeyHmac, match_data3); + ASSERT_TRUE(slab.AddV0Credential(v0_cred3).ok()); + + auto book = nearby_protocol::CredentialBook::TryCreateFromSlab(slab).value(); + auto legible_adv = nearby_protocol::Deserializer::DeserializeAdvertisement( + V0AdvEncryptedPayload, book) + .IntoV0() + .IntoLegible(); + ASSERT_EQ(legible_adv.GetIdentityKind(), + nearby_protocol::DeserializedV0IdentityKind::Decrypted); + ASSERT_EQ(legible_adv.GetNumberOfDataElements(), 1); + + auto payload = legible_adv.IntoPayload(); + ASSERT_TRUE(payload.TryGetDataElement(0).ok()); + + // Make sure the correct credential matches + auto identity_details = payload.GetIdentityDetails(); + ASSERT_TRUE(identity_details.ok()); + ASSERT_EQ(identity_details->cred_id, 456); + ASSERT_EQ(identity_details->identity_type, + nearby_protocol::EncryptedIdentityType::Private); +} +// NOLINTEND(readability-magic-numbers)
diff --git a/nearby/presence/np_cpp_ffi/tests/v0_encrypted_serialization_tests.cc b/nearby/presence/np_cpp_ffi/tests/v0_encrypted_serialization_tests.cc new file mode 100644 index 0000000..ebc82a4 --- /dev/null +++ b/nearby/presence/np_cpp_ffi/tests/v0_encrypted_serialization_tests.cc
@@ -0,0 +1,62 @@ +// 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 <algorithm> +#include <array> +#include <cstdint> + +#include "gtest/gtest.h" +#include "nearby_protocol.h" +#include "np_cpp_ffi_types.h" +#include "np_cpp_test.h" +#include "shared_test_util.h" + +// NOLINTBEGIN(readability-magic-numbers) + +// Corresponds to V0PrivateIdentityDeserializationSimpleCase, +// which in turn corresponds to np_adv's examples_v0 +TEST_F(NpCppTest, V0PrivateIdentitySerializationSimpleCase) { + std::array<uint8_t, 32> key_seed = {}; + std::fill_n(key_seed.begin(), 32, 0x11); + + std::array<uint8_t, 14> metadata_key = {}; + std::fill_n(metadata_key.begin(), 14, 0x33); + + auto broadcast_cred = + nearby_protocol::V0BroadcastCredential(key_seed, metadata_key); + + std::array<uint8_t, 2> salt = {}; + std::fill_n(salt.begin(), 2, 0x22); + + auto identity_type = nearby_protocol::EncryptedIdentityType::Private; + + auto adv_builder = + nearby_protocol::V0AdvertisementBuilder::TryCreateEncrypted( + broadcast_cred, identity_type, salt) + .value(); + + auto tx_power = nearby_protocol::TxPower::TryBuildFromI8(3).value(); + auto de = nearby_protocol::V0DataElement(tx_power); + + ASSERT_TRUE(adv_builder.TryAddDE(de).ok()); + + auto serialized_bytes = adv_builder.TrySerialize().value(); + auto actual = serialized_bytes.ToVector(); + + auto expected = V0AdvEncryptedBuffer.ToVector(); + + ASSERT_EQ(actual, expected); +} + +// NOLINTEND(readability-magic-numbers) \ 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/v0_unencrypted_deserialization_tests.cc similarity index 79% rename from nearby/presence/np_cpp_ffi/tests/deserialize_v0_tests.cc rename to nearby/presence/np_cpp_ffi/tests/v0_unencrypted_deserialization_tests.cc index 3ed2d79..4760009 100644 --- a/nearby/presence/np_cpp_ffi/tests/deserialize_v0_tests.cc +++ b/nearby/presence/np_cpp_ffi/tests/v0_unencrypted_deserialization_tests.cc
@@ -12,40 +12,40 @@ // See the License for the specific language governing permissions and // limitations under the License. -#include "nearby_protocol.h" -#include "shared_test_util.h" -#include "np_cpp_test.h" +#include <array> +#include <cstdint> +#include <utility> + +#include "absl/status/status.h" #include "gtest/gtest.h" +#include "nearby_protocol.h" +#include "np_cpp_ffi_types.h" +#include "np_cpp_test.h" +#include "shared_test_util.h" TEST_F(NpCppTest, InvalidCast) { auto slab = nearby_protocol::CredentialSlab::TryCreate().value(); auto book = nearby_protocol::CredentialBook::TryCreateFromSlab(slab).value(); auto deserialize_result = - nearby_protocol::Deserializer::DeserializeAdvertisement(V0AdvSimple, book); + nearby_protocol::Deserializer::DeserializeAdvertisement(V0AdvPlaintext, + 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(); }, - ""); + ASSERT_DEATH( + { [[maybe_unused]] auto failure = deserialize_result.IntoV1(); }, ""); } -TEST_F(NpCppTest, 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 - })); - +TEST_F(NpCppTest, V0DeserializeSingleDataElementTxPower) { auto slab = nearby_protocol::CredentialSlab::TryCreate().value(); - auto maybe_credential_book = nearby_protocol::CredentialBook::TryCreateFromSlab(slab); + auto maybe_credential_book = + nearby_protocol::CredentialBook::TryCreateFromSlab(slab); ASSERT_TRUE(maybe_credential_book.ok()); auto deserialize_result = nearby_protocol::Deserializer::DeserializeAdvertisement( - adv, maybe_credential_book.value()); + V0AdvPlaintext, maybe_credential_book.value()); ASSERT_EQ(deserialize_result.GetKind(), nearby_protocol::DeserializeAdvertisementResultKind::V0); @@ -55,8 +55,7 @@ nearby_protocol::DeserializedV0AdvertisementKind::Legible); auto legible_adv = v0_adv.IntoLegible(); auto identity = legible_adv.GetIdentityKind(); - ASSERT_EQ(identity, - nearby_protocol::DeserializedV0IdentityKind::Plaintext); + ASSERT_EQ(identity, nearby_protocol::DeserializedV0IdentityKind::Plaintext); auto num_des = legible_adv.GetNumberOfDataElements(); ASSERT_EQ(num_des, 1); @@ -68,21 +67,20 @@ ASSERT_EQ(de.GetKind(), nearby_protocol::V0DataElementKind::TxPower); auto tx_power = de.AsTxPower(); - ASSERT_EQ(tx_power.tx_power, 3); + ASSERT_EQ(tx_power.GetAsI8(), 3); } TEST_F(NpCppTest, V0LengthOneActionsDataElement) { - nearby_protocol::RawAdvertisementPayload adv( - nearby_protocol::ByteBuffer<255>({ - 4, - {0x00, // Adv Header - 0x03, // Public DE header - 0x16, 0x00} // Length 1 Actions DE - })); + const std::array<uint8_t, 4> V0AdvPlaintextLengthOneActions{0x00, 0x03, 0x16, + 0x00}; + const nearby_protocol::RawAdvertisementPayload adv( + (nearby_protocol::ByteBuffer<255>(V0AdvPlaintextLengthOneActions))); auto maybe_credential_slab = nearby_protocol::CredentialSlab::TryCreate(); ASSERT_TRUE(maybe_credential_slab.ok()); - auto maybe_credential_book = nearby_protocol::CredentialBook::TryCreateFromSlab(maybe_credential_slab.value()); + auto maybe_credential_book = + nearby_protocol::CredentialBook::TryCreateFromSlab( + maybe_credential_slab.value()); ASSERT_TRUE(maybe_credential_book.ok()); auto deserialize_result = nearby_protocol::Deserializer::DeserializeAdvertisement( @@ -96,8 +94,7 @@ nearby_protocol::DeserializedV0AdvertisementKind::Legible); auto legible_adv = v0_adv.IntoLegible(); auto identity = legible_adv.GetIdentityKind(); - ASSERT_EQ(identity, - nearby_protocol::DeserializedV0IdentityKind::Plaintext); + ASSERT_EQ(identity, nearby_protocol::DeserializedV0IdentityKind::Plaintext); auto num_des = legible_adv.GetNumberOfDataElements(); ASSERT_EQ(num_des, 1); @@ -113,17 +110,16 @@ } TEST_F(NpCppTest, V0LengthTwoActionsDataElement) { - nearby_protocol::RawAdvertisementPayload adv( - nearby_protocol::ByteBuffer<255>({ - 5, - {0x00, // Adv Header - 0x03, // Public DE header - 0x26, 0xD0, 0x46} // Length 2 Actions DE - })); + const std::array<uint8_t, 5> V0AdvPlaintextLengthTwoActions{0x00, 0x03, 0x26, + 0xD0, 0x46}; + const nearby_protocol::RawAdvertisementPayload adv( + (nearby_protocol::ByteBuffer<255>(V0AdvPlaintextLengthTwoActions))); auto maybe_credential_slab = nearby_protocol::CredentialSlab::TryCreate(); ASSERT_TRUE(maybe_credential_slab.ok()); - auto maybe_credential_book = nearby_protocol::CredentialBook::TryCreateFromSlab(maybe_credential_slab.value()); + auto maybe_credential_book = + nearby_protocol::CredentialBook::TryCreateFromSlab( + maybe_credential_slab.value()); ASSERT_TRUE(maybe_credential_book.ok()); auto deserialize_result = nearby_protocol::Deserializer::DeserializeAdvertisement( @@ -137,8 +133,7 @@ nearby_protocol::DeserializedV0AdvertisementKind::Legible); auto legible_adv = v0_adv.IntoLegible(); auto identity = legible_adv.GetIdentityKind(); - ASSERT_EQ(identity, - nearby_protocol::DeserializedV0IdentityKind::Plaintext); + ASSERT_EQ(identity, nearby_protocol::DeserializedV0IdentityKind::Plaintext); auto num_des = legible_adv.GetNumberOfDataElements(); ASSERT_EQ(num_des, 1); @@ -166,26 +161,19 @@ ASSERT_FALSE( actions.HasAction(nearby_protocol::BooleanActionType::PresenceManager)); - ASSERT_EQ(actions.GetContextSyncSequenceNumber(), 0xD); + ASSERT_EQ(actions.GetContextSyncSequenceNumber().GetAsU8(), 0xD); } TEST_F(NpCppTest, 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_slab = nearby_protocol::CredentialSlab::TryCreate(); ASSERT_TRUE(maybe_credential_slab.ok()); - auto maybe_credential_book = nearby_protocol::CredentialBook::TryCreateFromSlab(maybe_credential_slab.value()); + auto maybe_credential_book = + nearby_protocol::CredentialBook::TryCreateFromSlab( + maybe_credential_slab.value()); ASSERT_TRUE(maybe_credential_book.ok()); auto deserialize_result = nearby_protocol::Deserializer::DeserializeAdvertisement( - adv, maybe_credential_book.value()); + V0AdvPlaintextMultiDe, maybe_credential_book.value()); ASSERT_EQ(deserialize_result.GetKind(), nearby_protocol::DeserializeAdvertisementResultKind::V0); @@ -195,8 +183,7 @@ nearby_protocol::DeserializedV0AdvertisementKind::Legible); auto legible_adv = v0_adv.IntoLegible(); auto identity = legible_adv.GetIdentityKind(); - ASSERT_EQ(identity, - nearby_protocol::DeserializedV0IdentityKind::Plaintext); + ASSERT_EQ(identity, nearby_protocol::DeserializedV0IdentityKind::Plaintext); auto num_des = legible_adv.GetNumberOfDataElements(); ASSERT_EQ(num_des, 2); @@ -208,7 +195,7 @@ ASSERT_EQ(first_de.GetKind(), nearby_protocol::V0DataElementKind::TxPower); auto power = first_de.AsTxPower(); - ASSERT_EQ(power.tx_power, 5); + ASSERT_EQ(power.GetAsI8(), 5); auto second_de_result = payload.TryGetDataElement(1); ASSERT_TRUE(second_de_result.ok()); @@ -217,13 +204,15 @@ ASSERT_EQ(second_de.GetKind(), nearby_protocol::V0DataElementKind::Actions); auto actions = second_de.AsActions(); ASSERT_EQ(actions.GetAsU32(), (uint32_t)0x00460000); - ASSERT_EQ(actions.GetContextSyncSequenceNumber(), (uint8_t)0); + ASSERT_EQ(actions.GetContextSyncSequenceNumber().GetAsU8(), (uint8_t)0); } TEST_F(NpCppTest, V0EmptyPayload) { auto maybe_credential_slab = nearby_protocol::CredentialSlab::TryCreate(); ASSERT_TRUE(maybe_credential_slab.ok()); - auto maybe_credential_book = nearby_protocol::CredentialBook::TryCreateFromSlab(maybe_credential_slab.value()); + auto maybe_credential_book = + nearby_protocol::CredentialBook::TryCreateFromSlab( + maybe_credential_slab.value()); ASSERT_TRUE(maybe_credential_book.ok()); auto deserialize_result = nearby_protocol::Deserializer::DeserializeAdvertisement( @@ -237,20 +226,20 @@ auto slab = nearby_protocol::CredentialSlab::TryCreate().value(); auto book = nearby_protocol::CredentialBook::TryCreateFromSlab(slab).value(); auto result = nearby_protocol::Deserializer::DeserializeAdvertisement( - V0AdvSimple, book); + V0AdvPlaintext, 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)); + const 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 + adv.IntoLegible(), // NOLINT(bugprone-use-after-move) ""); ASSERT_DEATH([[maybe_unused]] auto failure = adv.GetKind(), ""); @@ -265,14 +254,14 @@ auto slab = nearby_protocol::CredentialSlab::TryCreate().value(); auto book = nearby_protocol::CredentialBook::TryCreateFromSlab(slab).value(); auto result = nearby_protocol::Deserializer::DeserializeAdvertisement( - V0AdvSimple, book); + V0AdvPlaintext, 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( - V0AdvSimple, book); + V0AdvPlaintext, book); ASSERT_EQ(another_result.GetKind(), np_ffi::internal::DeserializeAdvertisementResultKind::V0); auto adv2 = another_result.IntoV0(); @@ -285,7 +274,7 @@ // 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) + adv.IntoLegible(), // NOLINT(bugprone-use-after-move) ""); ASSERT_DEATH([[maybe_unused]] auto failure = adv.GetKind(), ""); @@ -295,17 +284,18 @@ ASSERT_DEATH([[maybe_unused]] auto failure = moved_again.GetKind(), ""); } -static nearby_protocol::DeserializeAdvertisementResult -CreateAdv(nearby_protocol::CredentialBook &book) { +nearby_protocol::DeserializeAdvertisementResult CreateAdv( + nearby_protocol::CredentialBook &book) { auto adv = nearby_protocol::Deserializer::DeserializeAdvertisement( - V0AdvSimple, book); + V0AdvPlaintext, book); return adv; } TEST_F(NpCppTest, V0AdvDestructor) { auto maybe_credential_slab = nearby_protocol::CredentialSlab::TryCreate(); ASSERT_TRUE(maybe_credential_slab.ok()); - auto book_result = nearby_protocol::CredentialBook::TryCreateFromSlab(maybe_credential_slab.value()); + auto book_result = nearby_protocol::CredentialBook::TryCreateFromSlab( + maybe_credential_slab.value()); ASSERT_TRUE(book_result.ok()); { auto deserialize_result = CreateAdv(book_result.value()); @@ -320,7 +310,7 @@ // Going over max amount should result in error auto deserialize_result3 = nearby_protocol::Deserializer::DeserializeAdvertisement( - V0AdvSimple, book_result.value()); + V0AdvPlaintext, book_result.value()); ASSERT_EQ(deserialize_result3.GetKind(), np_ffi::internal::DeserializeAdvertisementResultKind::Error); @@ -333,7 +323,7 @@ // will create room for one more to be created. auto deserialize_result = nearby_protocol::Deserializer::DeserializeAdvertisement( - V0AdvSimple, book_result.value()); + V0AdvPlaintext, book_result.value()); ASSERT_EQ(deserialize_result.GetKind(), np_ffi::internal::DeserializeAdvertisementResultKind::V0); } @@ -341,11 +331,13 @@ TEST_F(NpCppTest, V0AdvUseAfterMove) { auto maybe_credential_slab = nearby_protocol::CredentialSlab::TryCreate(); ASSERT_TRUE(maybe_credential_slab.ok()); - auto maybe_credential_book = nearby_protocol::CredentialBook::TryCreateFromSlab(maybe_credential_slab.value()); + auto maybe_credential_book = + nearby_protocol::CredentialBook::TryCreateFromSlab( + maybe_credential_slab.value()); ASSERT_TRUE(maybe_credential_book.ok()); auto deserialize_result = nearby_protocol::Deserializer::DeserializeAdvertisement( - V0AdvSimple, maybe_credential_book.value()); + V0AdvPlaintext, maybe_credential_book.value()); ASSERT_EQ(deserialize_result.GetKind(), nearby_protocol::DeserializeAdvertisementResultKind::V0); @@ -364,22 +356,24 @@ auto slab = nearby_protocol::CredentialSlab::TryCreate().value(); auto book = nearby_protocol::CredentialBook::TryCreateFromSlab(slab).value(); auto result = nearby_protocol::Deserializer::DeserializeAdvertisement( - V0AdvSimple, book); + V0AdvPlaintext, 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)); + const nearby_protocol::LegibleDeserializedV0Advertisement moved( + std::move(legible)); ASSERT_EQ(moved.GetNumberOfDataElements(), 1); ASSERT_EQ(moved.GetIdentityKind(), 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.GetIdentityKind(), // NOLINT(bugprone-use-after-move - ""); + ASSERT_DEATH( + [[maybe_unused]] auto failure = + legible.GetIdentityKind(), // NOLINT(bugprone-use-after-move) + ""); ASSERT_DEATH( [[maybe_unused]] auto failure = legible.GetNumberOfDataElements(), ""); ASSERT_DEATH([[maybe_unused]] auto failure = legible.IntoPayload(), ""); @@ -388,10 +382,11 @@ // abort nearby_protocol::LegibleDeserializedV0Advertisement moved_again( std::move(legible)); - ASSERT_DEATH([[maybe_unused]] auto failure = moved_again.GetIdentityKind(), ""); - ASSERT_DEATH([[maybe_unused]] auto failure = - moved_again.GetNumberOfDataElements(), + ASSERT_DEATH([[maybe_unused]] auto failure = moved_again.GetIdentityKind(), ""); + ASSERT_DEATH( + [[maybe_unused]] auto failure = moved_again.GetNumberOfDataElements(), + ""); ASSERT_DEATH([[maybe_unused]] auto failure = moved_again.IntoPayload(), ""); } @@ -399,14 +394,14 @@ auto slab = nearby_protocol::CredentialSlab::TryCreate().value(); auto book = nearby_protocol::CredentialBook::TryCreateFromSlab(slab).value(); auto result = nearby_protocol::Deserializer::DeserializeAdvertisement( - V0AdvSimple, book); + V0AdvPlaintext, 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( - V0AdvSimple, book); + V0AdvPlaintext, book); ASSERT_EQ(another_result.GetKind(), np_ffi::internal::DeserializeAdvertisementResultKind::V0); auto legible2 = another_result.IntoV0().IntoLegible(); @@ -418,9 +413,10 @@ // original result should now be invalid, using it will trigger a use after // free abort. - ASSERT_DEATH([[maybe_unused]] auto failure = - legible.GetIdentityKind(), // NOLINT(bugprone-use-after-move) - ""); + ASSERT_DEATH( + [[maybe_unused]] auto failure = + legible.GetIdentityKind(), // NOLINT(bugprone-use-after-move) + ""); ASSERT_DEATH( [[maybe_unused]] auto failure = legible.GetNumberOfDataElements(), ""); ASSERT_DEATH([[maybe_unused]] auto failure = legible.IntoPayload(), ""); @@ -428,16 +424,17 @@ // 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.GetIdentityKind(), ""); - ASSERT_DEATH([[maybe_unused]] auto failure = - moved_again.GetNumberOfDataElements(), + ASSERT_DEATH([[maybe_unused]] auto failure = moved_again.GetIdentityKind(), ""); + ASSERT_DEATH( + [[maybe_unused]] auto failure = moved_again.GetNumberOfDataElements(), + ""); } -nearby_protocol::LegibleDeserializedV0Advertisement -CreateLegibleAdv(nearby_protocol::CredentialBook &book) { +nearby_protocol::LegibleDeserializedV0Advertisement CreateLegibleAdv( + nearby_protocol::CredentialBook &book) { auto adv = nearby_protocol::Deserializer::DeserializeAdvertisement( - V0AdvSimple, book); + V0AdvPlaintext, book); auto v0_adv = adv.IntoV0(); return v0_adv.IntoLegible(); } @@ -456,10 +453,11 @@ // now that the legible adv has moved into the payload it should no longer be // valid - ASSERT_DEATH([[maybe_unused]] auto failure = legible_adv.GetIdentityKind(), ""); - ASSERT_DEATH([[maybe_unused]] auto failure = - legible_adv.GetNumberOfDataElements(), + ASSERT_DEATH([[maybe_unused]] auto failure = legible_adv.GetIdentityKind(), ""); + ASSERT_DEATH( + [[maybe_unused]] auto failure = legible_adv.GetNumberOfDataElements(), + ""); ASSERT_DEATH([[maybe_unused]] auto failure = legible_adv.IntoPayload(), ""); } @@ -480,20 +478,20 @@ // allocation slots should be full ASSERT_EQ(nearby_protocol::Deserializer::DeserializeAdvertisement( - V0AdvSimple, book) + V0AdvPlaintext, 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); + V0AdvPlaintext, book); ASSERT_EQ(result.GetKind(), nearby_protocol::DeserializeAdvertisementResultKind::V0); } -nearby_protocol::V0Payload -CreatePayload(nearby_protocol::CredentialBook &book) { +nearby_protocol::V0Payload CreatePayload( + nearby_protocol::CredentialBook &book) { auto legible_adv = CreateLegibleAdv(book); return legible_adv.IntoPayload(); } @@ -511,7 +509,7 @@ // allocation slots should be full ASSERT_EQ(nearby_protocol::Deserializer::DeserializeAdvertisement( - V0AdvSimple, book) + V0AdvPlaintext, book) .GetKind(), nearby_protocol::DeserializeAdvertisementResultKind::Error); } @@ -519,7 +517,7 @@ // 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); + V0AdvPlaintext, book); ASSERT_EQ(result.GetKind(), nearby_protocol::DeserializeAdvertisementResultKind::V0); } @@ -528,25 +526,27 @@ auto slab = nearby_protocol::CredentialSlab::TryCreate().value(); auto book = nearby_protocol::CredentialBook::TryCreateFromSlab(slab).value(); auto result = nearby_protocol::Deserializer::DeserializeAdvertisement( - V0AdvSimple, book); + V0AdvPlaintext, 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)); + const 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 - ""); + ASSERT_DEATH( + [[maybe_unused]] auto failure = + payload.TryGetDataElement( // NOLINT(bugprone-use-after-move) + 0), + ""); // moving again should still preserve the moved state and also lead to an // abort - nearby_protocol::V0Payload moved_again(std::move(payload)); + const nearby_protocol::V0Payload moved_again(std::move(payload)); ASSERT_DEATH([[maybe_unused]] auto failure = moved_again.TryGetDataElement(0), ""); } @@ -555,14 +555,14 @@ auto slab = nearby_protocol::CredentialSlab::TryCreate().value(); auto book = nearby_protocol::CredentialBook::TryCreateFromSlab(slab).value(); auto result = nearby_protocol::Deserializer::DeserializeAdvertisement( - V0AdvSimple, book); + V0AdvPlaintext, 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); + V0AdvPlaintext, book); ASSERT_EQ(another_result.GetKind(), np_ffi::internal::DeserializeAdvertisementResultKind::V0); auto payload2 = another_result.IntoV0().IntoLegible().IntoPayload(); @@ -573,9 +573,11 @@ // 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) - ""); + ASSERT_DEATH( + [[maybe_unused]] auto failure = + payload.TryGetDataElement( // NOLINT(bugprone-use-after-move) + 0), + ""); // moving again should still lead to an error auto moved_again = std::move(payload); @@ -586,11 +588,13 @@ TEST_F(NpCppTest, InvalidDataElementCast) { auto maybe_credential_slab = nearby_protocol::CredentialSlab::TryCreate(); ASSERT_TRUE(maybe_credential_slab.ok()); - auto maybe_credential_book = nearby_protocol::CredentialBook::TryCreateFromSlab(maybe_credential_slab.value()); + auto maybe_credential_book = + nearby_protocol::CredentialBook::TryCreateFromSlab( + maybe_credential_slab.value()); ASSERT_TRUE(maybe_credential_book.ok()); auto deserialize_result = nearby_protocol::Deserializer::DeserializeAdvertisement( - V0AdvSimple, maybe_credential_book.value()); + V0AdvPlaintext, maybe_credential_book.value()); ASSERT_EQ(deserialize_result.GetKind(), nearby_protocol::DeserializeAdvertisementResultKind::V0); @@ -599,8 +603,7 @@ nearby_protocol::DeserializedV0AdvertisementKind::Legible); auto legible_adv = v0_adv.IntoLegible(); auto identity = legible_adv.GetIdentityKind(); - ASSERT_EQ(identity, - nearby_protocol::DeserializedV0IdentityKind::Plaintext); + ASSERT_EQ(identity, nearby_protocol::DeserializedV0IdentityKind::Plaintext); auto num_des = legible_adv.GetNumberOfDataElements(); ASSERT_EQ(num_des, 1); @@ -617,11 +620,13 @@ TEST_F(NpCppTest, InvalidDataElementIndex) { auto maybe_credential_slab = nearby_protocol::CredentialSlab::TryCreate(); ASSERT_TRUE(maybe_credential_slab.ok()); - auto maybe_credential_book = nearby_protocol::CredentialBook::TryCreateFromSlab(maybe_credential_slab.value()); + auto maybe_credential_book = + nearby_protocol::CredentialBook::TryCreateFromSlab( + maybe_credential_slab.value()); ASSERT_TRUE(maybe_credential_book.ok()); auto deserialize_result = nearby_protocol::Deserializer::DeserializeAdvertisement( - V0AdvSimple, maybe_credential_book.value()); + V0AdvPlaintext, maybe_credential_book.value()); ASSERT_EQ(deserialize_result.GetKind(), nearby_protocol::DeserializeAdvertisementResultKind::V0); @@ -631,8 +636,7 @@ nearby_protocol::DeserializedV0AdvertisementKind::Legible); auto legible_adv = v0_adv.IntoLegible(); auto identity = legible_adv.GetIdentityKind(); - ASSERT_EQ(identity, - nearby_protocol::DeserializedV0IdentityKind::Plaintext); + ASSERT_EQ(identity, nearby_protocol::DeserializedV0IdentityKind::Plaintext); auto num_des = legible_adv.GetNumberOfDataElements(); ASSERT_EQ(num_des, 1);
diff --git a/nearby/presence/np_cpp_ffi/tests/v0_unencrypted_serialization_tests.cc b/nearby/presence/np_cpp_ffi/tests/v0_unencrypted_serialization_tests.cc new file mode 100644 index 0000000..0ce4d24 --- /dev/null +++ b/nearby/presence/np_cpp_ffi/tests/v0_unencrypted_serialization_tests.cc
@@ -0,0 +1,242 @@ +// 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 <cstdint> +#include <utility> +#include <vector> + +#include "gtest/gtest.h" +#include "nearby_protocol.h" +#include "np_cpp_ffi_types.h" +#include "np_cpp_test.h" + +// NOLINTBEGIN(readability-magic-numbers) + +TEST_F(NpCppTest, TxPowerMustBeInRange) { + auto out_of_range_result = nearby_protocol::TxPower::TryBuildFromI8(100); + ASSERT_FALSE(out_of_range_result.ok()); +} + +TEST_F(NpCppTest, ContextSyncSeqNumMustBeInRange) { + // Check that out-of-range fails + auto out_of_range_result = + nearby_protocol::ContextSyncSeqNum::TryBuildFromU8(17); + ASSERT_FALSE(out_of_range_result.ok()); + + // Check that if it's in range, we can get a context sync seq num and set it + // appropriately within an actions field. + auto actions = nearby_protocol::V0Actions::BuildNewZeroed( + nearby_protocol::AdvertisementBuilderKind::Public); + auto seq_num = nearby_protocol::ContextSyncSeqNum::TryBuildFromU8(15).value(); + actions.SetContextSyncSequenceNumber(seq_num); + ASSERT_EQ(actions.GetContextSyncSequenceNumber().GetAsU8(), + seq_num.GetAsU8()); +} + +TEST_F(NpCppTest, V0UnencryptedActionFlavorMustMatch) { + auto actions = nearby_protocol::V0Actions::BuildNewZeroed( + nearby_protocol::AdvertisementBuilderKind::Public); + + // Try to set an encrypted-only action. + auto mismatch_result = actions.TrySetAction( + nearby_protocol::BooleanActionType::InstantTethering, true); + ASSERT_FALSE(mismatch_result.ok()); + // Verify that nothing changed about the actions. + ASSERT_EQ(actions.GetAsU32(), 0); + + // Try again, but with a plaintext-compatible action. + auto success_result = actions.TrySetAction( + nearby_protocol::BooleanActionType::NearbyShare, true); + ASSERT_TRUE(success_result.ok()); + ASSERT_TRUE( + actions.HasAction(nearby_protocol::BooleanActionType::NearbyShare)); +} + +// Corresponds to V0DeserializeSingleDataElementTxPower +TEST_F(NpCppTest, V0SerializeSingleDataElementTxPower) { + auto adv_builder = + nearby_protocol::V0AdvertisementBuilder::TryCreatePublic().value(); + + auto tx_power = nearby_protocol::TxPower::TryBuildFromI8(3).value(); + auto de = nearby_protocol::V0DataElement(tx_power); + + auto add_de_result = adv_builder.TryAddDE(de); + ASSERT_TRUE(add_de_result.ok()); + + auto serialized_bytes = adv_builder.TrySerialize().value(); + auto actual = serialized_bytes.ToVector(); + + const std::vector<uint8_t> expected{ + 0x00, // Adv Header + 0x03, // Public DE header + 0x15, 0x03 // Length 1 Tx Power DE with value 3 + }; + ASSERT_EQ(actual, expected); +} + +// Corresponds to V0DeserializeLengthOneActionsDataElement +TEST_F(NpCppTest, V0SerializeLengthOneActionsDataElement) { + auto adv_builder = + nearby_protocol::V0AdvertisementBuilder::TryCreatePublic().value(); + auto actions = nearby_protocol::V0Actions::BuildNewZeroed( + nearby_protocol::AdvertisementBuilderKind::Public); + auto de = nearby_protocol::V0DataElement(actions); + + auto add_de_result = adv_builder.TryAddDE(de); + ASSERT_TRUE(add_de_result.ok()); + + auto serialized_bytes = adv_builder.TrySerialize().value(); + auto actual = serialized_bytes.ToVector(); + + const std::vector<uint8_t> expected{ + 0x00, // Adv Header + 0x03, // Public DE header + 0x16, 0x00 // Length 1 Actions DE + }; + + ASSERT_EQ(actual, expected); +} + +// Corresponds to V0DeserializeLengthTwoActionsDataElement +TEST_F(NpCppTest, V0SerializeLengthTwoActionsDataElement) { + auto adv_builder = + nearby_protocol::V0AdvertisementBuilder::TryCreatePublic().value(); + auto actions = nearby_protocol::V0Actions::BuildNewZeroed( + nearby_protocol::AdvertisementBuilderKind::Public); + + ASSERT_TRUE( + actions + .TrySetAction(nearby_protocol::BooleanActionType::NearbyShare, true) + .ok()); + ASSERT_TRUE( + actions.TrySetAction(nearby_protocol::BooleanActionType::Finder, true) + .ok()); + ASSERT_TRUE( + actions + .TrySetAction(nearby_protocol::BooleanActionType::FastPairSass, true) + .ok()); + auto seq_num = + nearby_protocol::ContextSyncSeqNum::TryBuildFromU8(0xD).value(); + actions.SetContextSyncSequenceNumber(seq_num); + + auto de = nearby_protocol::V0DataElement(actions); + + auto add_de_result = adv_builder.TryAddDE(de); + ASSERT_TRUE(add_de_result.ok()); + + auto serialized_bytes = adv_builder.TrySerialize().value(); + auto actual = serialized_bytes.ToVector(); + + const std::vector<uint8_t> expected{ + 0x00, // Adv Header + 0x03, // Public DE header + 0x26, 0xD0, 0x46 // Length 2 Actions DE + }; + + ASSERT_EQ(actual, expected); +} +// Corresponds to V0DeserializeMultipleDataElements +TEST_F(NpCppTest, V0SerializeMultipleDataElements) { + auto adv_builder = + nearby_protocol::V0AdvertisementBuilder::TryCreatePublic().value(); + + auto tx_power = nearby_protocol::TxPower::TryBuildFromI8(5).value(); + auto tx_power_de = nearby_protocol::V0DataElement(tx_power); + auto add_tx_power_de_result = adv_builder.TryAddDE(tx_power_de); + ASSERT_TRUE(add_tx_power_de_result.ok()); + + auto actions = nearby_protocol::V0Actions::BuildNewZeroed( + nearby_protocol::AdvertisementBuilderKind::Public); + + ASSERT_TRUE( + actions + .TrySetAction(nearby_protocol::BooleanActionType::NearbyShare, true) + .ok()); + ASSERT_TRUE( + actions.TrySetAction(nearby_protocol::BooleanActionType::Finder, true) + .ok()); + ASSERT_TRUE( + actions + .TrySetAction(nearby_protocol::BooleanActionType::FastPairSass, true) + .ok()); + + auto actions_de = nearby_protocol::V0DataElement(actions); + + auto add_actions_de_result = adv_builder.TryAddDE(actions_de); + ASSERT_TRUE(add_actions_de_result.ok()); + + auto serialized_bytes = adv_builder.TrySerialize().value(); + auto actual = serialized_bytes.ToVector(); + + const std::vector<uint8_t> expected{ + 0x00, // Adv Header + 0x03, // Public DE header + 0x15, 0x05, // Tx Power value 5 + 0x26, 0x00, 0x46, // Length 2 Actions + }; + + ASSERT_EQ(actual, expected); +} + +// TODO: Reinstate this test. +// TEST_F(NpCppTest, V0SerializeEmptyPayload) { +// auto adv_builder = +// nearby_protocol::V0AdvertisementBuilder::TryCreatePublic().value(); auto +// serialize_result = adv_builder.TrySerialize(); +// ASSERT_FALSE(serialize_result.ok()); +//} + +TEST_F(NpCppTest, TestV0AdvBuilderMoveConstructor) { + auto adv_builder = + nearby_protocol::V0AdvertisementBuilder::TryCreatePublic().value(); + // Move it, and ensure it's still valid. + nearby_protocol::V0AdvertisementBuilder moved_adv_builder( + std::move(adv_builder)); + + auto actions = nearby_protocol::V0Actions::BuildNewZeroed( + nearby_protocol::AdvertisementBuilderKind::Public); + auto actions_de = nearby_protocol::V0DataElement(actions); + ASSERT_TRUE(moved_adv_builder.TryAddDE(actions_de).ok()); + + // Trying to use the moved-out-of-object should trigger an abort + ASSERT_DEATH([[maybe_unused]] auto failure = + adv_builder.TryAddDE( // NOLINT(bugprone-use-after-move) + actions_de), + ""); + + // Moving again should still preserve the moved state and lead to an abort + nearby_protocol::V0AdvertisementBuilder moved_again(std::move(adv_builder)); + ASSERT_DEATH([[maybe_unused]] auto failure = moved_again.TryAddDE( + actions_de) // NOLINT(bugprone-use-after-move) + , + ""); +} + +TEST_F(NpCppTest, TestV0AdvBuilderDestructor) { + { + // Get us up to the limit on the number of adv builders + auto adv_builder_one = + nearby_protocol::V0AdvertisementBuilder::TryCreatePublic().value(); + auto adv_builder_two = + nearby_protocol::V0AdvertisementBuilder::TryCreatePublic().value(); + // Assert that we're at the limit + ASSERT_FALSE( + nearby_protocol::V0AdvertisementBuilder::TryCreatePublic().ok()); + // Destructors should run. + } + // The space from the adv builders should've been reclaimed now. + ASSERT_TRUE(nearby_protocol::V0AdvertisementBuilder::TryCreatePublic().ok()); +} + +// NOLINTEND(readability-magic-numbers)
diff --git a/nearby/presence/np_cpp_ffi/tests/v1_encrypted_deserialization_tests.cc b/nearby/presence/np_cpp_ffi/tests/v1_encrypted_deserialization_tests.cc new file mode 100644 index 0000000..825b36c --- /dev/null +++ b/nearby/presence/np_cpp_ffi/tests/v1_encrypted_deserialization_tests.cc
@@ -0,0 +1,86 @@ +// 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 <array> +#include <cstdint> +#include <span> +#include <string> +#include <vector> + +#include "absl/status/status.h" +#include "gtest/gtest.h" +#include "nearby_protocol.h" +#include "np_cpp_ffi_types.h" +#include "np_cpp_test.h" +#include "shared_test_util.h" + +TEST_F(NpCppTest, V1PrivateIdentitySimpleCase) { + auto slab_result = nearby_protocol::CredentialSlab::TryCreate(); + ASSERT_TRUE(slab_result.ok()); + + const std::span<uint8_t> metadata_span(V1AdvEncryptedMetadata); + const nearby_protocol::MatchedCredentialData match_data(123, metadata_span); + + const nearby_protocol::V1MatchableCredential v1_cred( + V1AdvKeySeed, V1AdvExpectedUnsignedMetadataKeyHmac, + V1AdvExpectedSignedMetadataKeyHmac, V1AdvPublicKey, match_data); + + auto add_result = slab_result->AddV1Credential(v1_cred); + ASSERT_EQ(add_result, absl::OkStatus()); + + auto book_result = + nearby_protocol::CredentialBook::TryCreateFromSlab(*slab_result); + ASSERT_TRUE(book_result.ok()); + + auto deserialize_result = + nearby_protocol::Deserializer::DeserializeAdvertisement(V1AdvEncrypted, + *book_result); + ASSERT_EQ(deserialize_result.GetKind(), + nearby_protocol::DeserializeAdvertisementResultKind::V1); + + auto v1_adv = deserialize_result.IntoV1(); + ASSERT_EQ(v1_adv.GetNumUndecryptableSections(), 0); + ASSERT_EQ(v1_adv.GetNumLegibleSections(), 1); + + auto section = v1_adv.TryGetSection(0); + ASSERT_TRUE(section.ok()); + ASSERT_EQ(section->GetIdentityKind(), + nearby_protocol::DeserializedV1IdentityKind::Decrypted); + ASSERT_EQ(section->NumberOfDataElements(), 1); + + auto metadata = section->DecryptMetadata(); + ASSERT_TRUE(metadata.ok()); + ASSERT_EQ(ExpectedV1DecryptedMetadata, + std::string(metadata->begin(), metadata->end())); + + auto identity_details = section->GetIdentityDetails(); + ASSERT_TRUE(identity_details.ok()); + ASSERT_EQ(identity_details->cred_id, 123); + ASSERT_EQ(identity_details->verification_mode, + nearby_protocol::V1VerificationMode::Signature); + ASSERT_EQ(identity_details->identity_type, + nearby_protocol::EncryptedIdentityType::Private); + + auto de = section->TryGetDataElement(0); + ASSERT_TRUE(de.ok()); + ASSERT_EQ(de->GetDataElementTypeCode(), 5); + ASSERT_EQ(de->GetPayload().ToVector(), std::vector<uint8_t>{7}); + + auto offset = de->GetOffset(); + auto derived_salt = section->DeriveSaltForOffset(offset); + ASSERT_TRUE(derived_salt.ok()); + const std::array<uint8_t, 16> expected = { + 94, 154, 245, 152, 164, 22, 131, 157, 8, 79, 28, 77, 236, 57, 17, 97}; + ASSERT_EQ(*derived_salt, expected); +} \ No newline at end of file
diff --git a/nearby/presence/np_cpp_ffi/tests/deserialize_v1_tests.cc b/nearby/presence/np_cpp_ffi/tests/v1_unencrypted_deserialization_tests.cc similarity index 83% rename from nearby/presence/np_cpp_ffi/tests/deserialize_v1_tests.cc rename to nearby/presence/np_cpp_ffi/tests/v1_unencrypted_deserialization_tests.cc index aa32f7b..f7e233b 100644 --- a/nearby/presence/np_cpp_ffi/tests/deserialize_v1_tests.cc +++ b/nearby/presence/np_cpp_ffi/tests/v1_unencrypted_deserialization_tests.cc
@@ -12,21 +12,28 @@ // See the License for the specific language governing permissions and // limitations under the License. -#include "nearby_protocol.h" -#include "shared_test_util.h" -#include "np_cpp_test.h" +#include <cstdint> +#include <utility> +#include <vector> +#include "absl/status/status.h" #include "gtest/gtest.h" +#include "nearby_protocol.h" +#include "np_cpp_ffi_types.h" +#include "np_cpp_test.h" +#include "shared_test_util.h" TEST_F(NpCppTest, V1SimpleTestCase) { auto maybe_credential_slab = nearby_protocol::CredentialSlab::TryCreate(); ASSERT_TRUE(maybe_credential_slab.ok()); - auto maybe_credential_book = nearby_protocol::CredentialBook::TryCreateFromSlab(maybe_credential_slab.value()); + auto maybe_credential_book = + nearby_protocol::CredentialBook::TryCreateFromSlab( + maybe_credential_slab.value()); ASSERT_TRUE(maybe_credential_book.ok()); auto deserialize_result = nearby_protocol::Deserializer::DeserializeAdvertisement( - V1AdvSimple, maybe_credential_book.value()); + V1AdvPlaintext, maybe_credential_book.value()); ASSERT_EQ(deserialize_result.GetKind(), nearby_protocol::DeserializeAdvertisementResultKind::V1); @@ -54,7 +61,7 @@ auto payload = de.value().GetPayload(); auto vec = payload.ToVector(); - std::vector<uint8_t> expected{3}; + const std::vector<uint8_t> expected{3}; ASSERT_EQ(vec, expected); } @@ -62,20 +69,20 @@ auto slab = nearby_protocol::CredentialSlab::TryCreate().value(); auto book = nearby_protocol::CredentialBook::TryCreateFromSlab(slab).value(); auto result = nearby_protocol::Deserializer::DeserializeAdvertisement( - V1AdvSimple, book); + V1AdvPlaintext, 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)); + const 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 + adv.GetNumLegibleSections(), // NOLINT(bugprone-use-after-move) ""); ASSERT_DEATH( [[maybe_unused]] auto failure = adv.GetNumUndecryptableSections(), ""); @@ -83,14 +90,13 @@ // moving again should still preserve the moved state and also lead to an // abort - nearby_protocol::DeserializedV1Advertisement moved_again(std::move(adv)); + const nearby_protocol::DeserializedV1Advertisement moved_again( + std::move(adv)); ASSERT_DEATH( - [[maybe_unused]] auto failure = - moved_again.GetNumLegibleSections(), // NOLINT(bugprone-use-after-move + [[maybe_unused]] auto failure = moved_again.GetNumLegibleSections(), ""); + ASSERT_DEATH( + [[maybe_unused]] auto failure = moved_again.GetNumUndecryptableSections(), ""); - ASSERT_DEATH([[maybe_unused]] auto failure = - moved_again.GetNumUndecryptableSections(), - ""); ASSERT_DEATH([[maybe_unused]] auto failure = moved_again.TryGetSection(0), ""); } @@ -99,14 +105,14 @@ auto slab = nearby_protocol::CredentialSlab::TryCreate().value(); auto book = nearby_protocol::CredentialBook::TryCreateFromSlab(slab).value(); auto result = nearby_protocol::Deserializer::DeserializeAdvertisement( - V1AdvSimple, book); + V1AdvPlaintext, 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); + V1AdvPlaintext, book); ASSERT_EQ(another_result.GetKind(), np_ffi::internal::DeserializeAdvertisementResultKind::V1); auto adv2 = another_result.IntoV1(); @@ -119,7 +125,7 @@ // free abort. ASSERT_DEATH( [[maybe_unused]] auto failure = - adv.GetNumLegibleSections(), // NOLINT(bugprone-use-after-move + adv.GetNumLegibleSections(), // NOLINT(bugprone-use-after-move) ""); ASSERT_DEATH( [[maybe_unused]] auto failure = adv.GetNumUndecryptableSections(), ""); @@ -128,30 +134,28 @@ // 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 + [[maybe_unused]] auto failure = moved_again.GetNumLegibleSections(), ""); + ASSERT_DEATH( + [[maybe_unused]] auto failure = moved_again.GetNumUndecryptableSections(), ""); - 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) { +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 v1_adv = nearby_protocol::Deserializer::DeserializeAdvertisement( + V1AdvPlaintext, 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); + V1AdvPlaintext, book); return adv.GetKind() == np_ffi::internal::DeserializeAdvertisementResultKind::V1; } @@ -159,7 +163,9 @@ TEST_F(NpCppTest, TestSectionOwnership) { auto maybe_credential_slab = nearby_protocol::CredentialSlab::TryCreate(); ASSERT_TRUE(maybe_credential_slab.ok()); - auto maybe_credential_book = nearby_protocol::CredentialBook::TryCreateFromSlab(maybe_credential_slab.value()); + auto maybe_credential_book = + nearby_protocol::CredentialBook::TryCreateFromSlab( + maybe_credential_slab.value()); ASSERT_TRUE(maybe_credential_book.ok()); {
diff --git a/nearby/presence/np_ffi_core/Cargo.toml b/nearby/presence/np_ffi_core/Cargo.toml index 0c14d1c..a6b21b0 100644 --- a/nearby/presence/np_ffi_core/Cargo.toml +++ b/nearby/presence/np_ffi_core/Cargo.toml
@@ -11,6 +11,7 @@ array_view.workspace = true ldt_np_adv.workspace = true np_adv = { workspace = true, features = ["alloc"] } +np_adv_dynamic.workspace = true np_hkdf.workspace = true handle_map.workspace = true crypto_provider.workspace = true @@ -21,5 +22,4 @@ [features] default = ["rustcrypto"] rustcrypto = ["crypto_provider_default/rustcrypto", "crypto_provider_default/std"] -opensslbssl = ["crypto_provider_default/opensslbssl"] boringssl = ["crypto_provider_default/boringssl"]
diff --git a/nearby/presence/np_ffi_core/src/common.rs b/nearby/presence/np_ffi_core/src/common.rs index 6333db5..e90a072 100644 --- a/nearby/presence/np_ffi_core/src/common.rs +++ b/nearby/presence/np_ffi_core/src/common.rs
@@ -15,12 +15,14 @@ //! in order to define the interfaces in this crate's various modules. use array_view::ArrayView; +use crypto_provider::{CryptoProvider, CryptoRng}; +use crypto_provider_default::CryptoProviderImpl; use handle_map::HandleNotPresentError; -use lock_adapter::std::RwLock; +use lock_adapter::std::{RwLock, RwLockWriteGuard}; use lock_adapter::RwLock as _; use std::string::String; -const DEFAULT_MAX_HANDLES: u32 = u32::MAX - 1; +pub(crate) 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 @@ -61,6 +63,18 @@ /// value will be set to `u32::MAX - 1`, which is the upper-bound /// on this value. max_num_deserialized_v1_advertisements: u32, + + /// The maximum number of v0 advertisement builders + /// 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_v0_advertisement_builders: u32, + + /// The maximum number of v1 advertisement builders + /// 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_v1_advertisement_builders: u32, } impl Default for CommonConfig { @@ -77,6 +91,8 @@ max_num_credential_books: DEFAULT_MAX_HANDLES, max_num_deserialized_v0_advertisements: DEFAULT_MAX_HANDLES, max_num_deserialized_v1_advertisements: DEFAULT_MAX_HANDLES, + max_num_v0_advertisement_builders: DEFAULT_MAX_HANDLES, + max_num_v1_advertisement_builders: DEFAULT_MAX_HANDLES, } } #[cfg(feature = "std")] @@ -110,6 +126,12 @@ pub(crate) fn max_num_deserialized_v1_advertisements(&self) -> u32 { self.max_num_deserialized_v1_advertisements } + pub(crate) fn max_num_v0_advertisement_builders(&self) -> u32 { + self.max_num_v0_advertisement_builders + } + pub(crate) fn max_num_v1_advertisement_builders(&self) -> u32 { + self.max_num_v1_advertisement_builders + } pub(crate) fn set_num_shards(&mut self, num_shards: u8) { self.num_shards = num_shards } @@ -139,7 +161,7 @@ DEFAULT_MAX_HANDLES.min(max_num_deserialized_v0_advertisements) } - /// Sets the maximum number of active handles to deserialized v0 + /// Sets the maximum number of active handles to deserialized v1 /// advertisements which may be active at any one time. /// Max value: `u32::MAX - 1`. pub fn set_max_num_deserialized_v1_advertisements( @@ -149,6 +171,26 @@ self.max_num_deserialized_v1_advertisements = DEFAULT_MAX_HANDLES.min(max_num_deserialized_v1_advertisements) } + /// Sets the maximum number of active handles to v0 advertisement + /// builders which may be active at any one time. + /// Max value: `u32::MAX - 1`. + pub fn set_max_num_v0_advertisement_builders( + &mut self, + max_num_v0_advertisement_builders: u32, + ) { + self.max_num_v0_advertisement_builders = + DEFAULT_MAX_HANDLES.min(max_num_v0_advertisement_builders) + } + /// Sets the maximum number of active handles to v1 advertisement + /// builders which may be active at any one time. + /// Max value: `u32::MAX - 1`. + pub fn set_max_num_v1_advertisement_builders( + &mut self, + max_num_v1_advertisement_builders: u32, + ) { + self.max_num_v1_advertisement_builders = + DEFAULT_MAX_HANDLES.min(max_num_v1_advertisement_builders) + } } static COMMON_CONFIG: RwLock<CommonConfig> = RwLock::new(CommonConfig::new()); @@ -168,6 +210,12 @@ pub(crate) fn global_max_num_deserialized_v1_advertisements() -> u32 { COMMON_CONFIG.read().max_num_deserialized_v1_advertisements() } +pub(crate) fn global_max_num_v0_advertisement_builders() -> u32 { + COMMON_CONFIG.read().max_num_v0_advertisement_builders() +} +pub(crate) fn global_max_num_v1_advertisement_builders() -> u32 { + COMMON_CONFIG.read().max_num_v1_advertisement_builders() +} /// 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 @@ -241,6 +289,31 @@ config.set_max_num_deserialized_v1_advertisements(max_num_deserialized_v1_advertisements); } +/// Sets the maximum number of active handles to v0 advertisement +/// builders 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 v0 advertisement builder. +pub fn global_config_set_max_num_v0_advertisement_builders(max_num_v0_advertisement_builders: u32) { + let mut config = COMMON_CONFIG.write(); + config.set_max_num_v0_advertisement_builders(max_num_v0_advertisement_builders); +} + +/// Sets the maximum number of active handles to v1 advertisement +/// builders 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 v1 advertisement builder. +pub fn global_config_set_max_num_v1_advertisement_builders(max_num_v1_advertisement_builders: u32) { + let mut config = COMMON_CONFIG.write(); + config.set_max_num_v1_advertisement_builders(max_num_v1_advertisement_builders); +} // API surfaces: /// A result-type enum which tells the caller whether/not a deallocation @@ -271,8 +344,12 @@ impl RawAdvertisementPayload { /// Yields a slice of the bytes in this raw advertisement payload. + #[allow(clippy::unwrap_used)] pub fn as_slice(&self) -> &[u8] { - self.bytes.as_slice() + // The unwrapping here will never trigger a panic, + // because the byte-buffer is 255 bytes, the byte-length + // of which is the maximum value storable in a u8. + self.bytes.as_slice().unwrap() } } @@ -289,6 +366,27 @@ bytes: [u8; N], } +/// A FFI safe wrapper of a fixed size array +#[derive(Clone)] +#[repr(C)] +pub struct FixedSizeArray<const N: usize>([u8; N]); + +impl<const N: usize> FixedSizeArray<N> { + /// Constructs a byte-buffer from a Rust-side-derived owned array + pub(crate) fn from_array(bytes: [u8; N]) -> Self { + Self(bytes) + } + /// Yields a slice of the bytes + pub fn as_slice(&self) -> &[u8] { + self.0.as_slice() + } + /// De-structures this FFI-compatible fixed-size array + /// into a bare Rust fixed size array. + pub fn into_array(self) -> [u8; N] { + self.0 + } +} + impl<const N: usize> ByteBuffer<N> { /// Constructs a byte-buffer from a Rust-side-derived /// ArrayView, which is assumed to be trusted to be @@ -300,11 +398,39 @@ 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)] + pub fn as_slice(&self) -> Option<&[u8]> { + if self.len as usize <= N { + Some(&self.bytes[..(self.len as usize)]) + } else { + None + } } } +pub(crate) type CryptoRngImpl = <CryptoProviderImpl as CryptoProvider>::CryptoRng; + +pub(crate) struct LazyInitCryptoRng { + maybe_rng: Option<CryptoRngImpl>, +} + +impl LazyInitCryptoRng { + const fn new() -> Self { + Self { maybe_rng: None } + } + pub(crate) fn get_rng(&mut self) -> &mut CryptoRngImpl { + self.maybe_rng.get_or_insert_with(CryptoRngImpl::new) + } +} + +/// Shared, lazily-initialized cryptographically-secure +/// RNG for all operations in the FFI core. +static CRYPTO_RNG: RwLock<LazyInitCryptoRng> = RwLock::new(LazyInitCryptoRng::new()); + +/// Gets a write guard to the (lazily-init) library-global crypto rng. +pub(crate) fn get_global_crypto_rng() -> RwLockWriteGuard<'static, LazyInitCryptoRng> { + CRYPTO_RNG.write() +} + /// The DE type for an encrypted identity #[derive(Clone, Copy)] #[repr(u8)] @@ -320,6 +446,17 @@ Provisioned = 4, } +impl From<EncryptedIdentityType> for np_adv::de_type::EncryptedIdentityDataElementType { + fn from(val: EncryptedIdentityType) -> np_adv::de_type::EncryptedIdentityDataElementType { + use np_adv::de_type::EncryptedIdentityDataElementType; + match val { + EncryptedIdentityType::Private => EncryptedIdentityDataElementType::Private, + EncryptedIdentityType::Trusted => EncryptedIdentityDataElementType::Trusted, + EncryptedIdentityType::Provisioned => EncryptedIdentityDataElementType::Provisioned, + } + } +} + impl From<np_adv::de_type::EncryptedIdentityDataElementType> for EncryptedIdentityType { fn from(value: np_adv::de_type::EncryptedIdentityDataElementType) -> Self { use np_adv::de_type::EncryptedIdentityDataElementType; @@ -331,6 +468,16 @@ } } +/// Error returned if the bit representation of a supposedly-Rust-constructed +/// -and-validated type actually doesn't correspond to the format of the +/// data structure expected on the Rust side of the boundary, and performing +/// further operations on the structure would yield unintended behavior. +/// If this kind of error is being raised, the foreign lang code must +/// be messing with stack-allocated data structures for this library +/// in an entirely unexpected way. +#[derive(Debug)] +pub struct InvalidStackDataStructure; + /// 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.
diff --git a/nearby/presence/np_ffi_core/src/credentials.rs b/nearby/presence/np_ffi_core/src/credentials.rs index 0972d45..dad61ee 100644 --- a/nearby/presence/np_ffi_core/src/credentials.rs +++ b/nearby/presence/np_ffi_core/src/credentials.rs
@@ -15,6 +15,7 @@ use crate::common::*; use crate::utils::{FfiEnum, LocksLongerThan}; +use crypto_provider::ed25519::InvalidPublicKeyBytes; use crypto_provider_default::CryptoProviderImpl; use handle_map::{ declare_handle_map, HandleLike, HandleMapDimensions, HandleMapFullError, @@ -71,8 +72,10 @@ pub_key, } } - fn into_internal(self) -> np_adv::credential::v1::V1DiscoveryCredential { - np_adv::credential::v1::V1DiscoveryCredential::new( + fn into_internal( + self, + ) -> Result<np_adv::credential::v1::V1DiscoveryCredential, InvalidPublicKeyBytes> { + np_adv::credential::v1::V1DiscoveryCredential::new::<CryptoProviderImpl>( self.key_seed, self.expected_unsigned_metadata_key_hmac, self.expected_signed_metadata_key_hmac, @@ -164,11 +167,12 @@ &mut self, discovery_credential: V1DiscoveryCredential, match_data: MatchedCredential, - ) { - let discovery_credential = discovery_credential.into_internal(); - let matchable_credential = - np_adv::credential::MatchableCredential { discovery_credential, match_data }; - self.v1_creds.push(matchable_credential); + ) -> Result<(), InvalidPublicKeyBytes> { + discovery_credential.into_internal().map(|discovery_credential| { + let matchable_credential = + np_adv::credential::MatchableCredential { discovery_credential, match_data }; + self.v1_creds.push(matchable_credential); + }) } } @@ -200,22 +204,33 @@ } } -/// Result type for trying to add a credential to a credential-slab. +/// Result type for trying to add a V1 credential to a credential-slab. #[repr(u8)] -pub enum AddCredentialToSlabResult { +pub enum AddV1CredentialToSlabResult { + /// We succeeded in adding the credential to the slab. + Success = 0, + /// The handle to the slab was actually invalid. + InvalidHandle = 1, + /// The provided public key bytes do not actually represent a valid "edwards y" format + /// or that said compressed point is not actually a point on the curve. + InvalidPublicKeyBytes = 2, +} + +/// Result type for trying to add a V0 credential to a credential-slab. +#[repr(u8)] +pub enum AddV0CredentialToSlabResult { /// We succeeded in adding the credential to the slab. Success = 0, /// The handle to the slab was actually invalid. InvalidHandle = 1, } -declare_handle_map! { - mod credential_slab { - #[dimensions = super::get_credential_slab_handle_map_dimensions()] - type CredentialSlab: HandleLike<Object = super::CredentialSlabInternals>; - } +/// A `#[repr(C)]` handle to a value of type `CredentialSlabInternals` +#[repr(C)] +#[derive(Clone, Copy, PartialEq, Eq)] +pub struct CredentialSlab { + handle_id: u64, } -use credential_slab::CredentialSlab; fn get_credential_slab_handle_map_dimensions() -> HandleMapDimensions { HandleMapDimensions { @@ -224,6 +239,13 @@ } } +declare_handle_map!( + credential_slab, + super::get_credential_slab_handle_map_dimensions(), + super::CredentialSlab, + super::CredentialSlabInternals +); + impl CredentialSlab { /// Adds the given V0 discovery credential with some associated /// match-data to this credential slab. @@ -231,13 +253,13 @@ &self, discovery_credential: V0DiscoveryCredential, match_data: MatchedCredential, - ) -> AddCredentialToSlabResult { + ) -> AddV0CredentialToSlabResult { match self.get_mut() { Ok(mut write_guard) => { write_guard.add_v0(discovery_credential, match_data); - AddCredentialToSlabResult::Success + AddV0CredentialToSlabResult::Success } - Err(_) => AddCredentialToSlabResult::InvalidHandle, + Err(_) => AddV0CredentialToSlabResult::InvalidHandle, } } /// Adds the given V1 discovery credential with some associated @@ -246,13 +268,13 @@ &self, discovery_credential: V1DiscoveryCredential, match_data: MatchedCredential, - ) -> AddCredentialToSlabResult { + ) -> AddV1CredentialToSlabResult { match self.get_mut() { - Ok(mut write_guard) => { - write_guard.add_v1(discovery_credential, match_data); - AddCredentialToSlabResult::Success - } - Err(_) => AddCredentialToSlabResult::InvalidHandle, + Ok(mut write_guard) => match write_guard.add_v1(discovery_credential, match_data) { + Ok(_) => AddV1CredentialToSlabResult::Success, + Err(_) => AddV1CredentialToSlabResult::InvalidPublicKeyBytes, + }, + Err(_) => AddV1CredentialToSlabResult::InvalidHandle, } } } @@ -298,13 +320,19 @@ } } -declare_handle_map! { - mod credential_book { - #[dimensions = super::get_credential_book_handle_map_dimensions()] - type CredentialBook: HandleLike<Object = super::CredentialBookInternals>; - } +/// A `#[repr(C)]` handle to a value of type `CredentialBookInternals` +#[repr(C)] +#[derive(Clone, Copy, PartialEq, Eq)] +pub struct CredentialBook { + handle_id: u64, } -pub use credential_book::CredentialBook; + +declare_handle_map!( + credential_book, + super::get_credential_book_handle_map_dimensions(), + super::CredentialBook, + super::CredentialBookInternals +); /// Discriminant for `CreateCredentialBookResult` #[repr(u8)] @@ -380,3 +408,66 @@ pub fn deallocate_credential_slab(credential_slab: CredentialSlab) -> DeallocateResult { credential_slab.deallocate().map(|_| ()).into() } + +/// Cryptographic information about a particular V0 broadcast credential +/// necessary to LDT-encrypt V0 advertisements. +#[repr(C)] +pub struct V0BroadcastCredential { + key_seed: [u8; 32], + metadata_key: [u8; 14], +} + +impl V0BroadcastCredential { + /// Constructs a new `V0BroadcastCredential` from the given + /// key-seed and 14-byte metadata key. + /// + /// Safety: Since this representation requires transmission + /// of the raw bytes of sensitive cryptographic info over FFI, + /// foreign-lang code around how this information is maintained + /// deserves close scrutiny. + pub fn new(key_seed: [u8; 32], metadata_key: [u8; 14]) -> Self { + Self { key_seed, metadata_key } + } + pub(crate) fn into_internal( + self, + ) -> np_adv::credential::SimpleBroadcastCryptoMaterial<np_adv::credential::v0::V0> { + np_adv::credential::SimpleBroadcastCryptoMaterial::new( + self.key_seed, + np_adv::legacy::ShortMetadataKey(self.metadata_key), + ) + } +} + +/// Cryptographic information about a particular V1 broadcast credential +/// necessary to encrypt V1 MIC-verified and signature-verified sections. +#[repr(C)] +pub struct V1BroadcastCredential { + key_seed: [u8; 32], + metadata_key: [u8; 16], + private_key: [u8; 32], +} + +impl V1BroadcastCredential { + /// Constructs a new `V1BroadcastCredential` from the given + /// key-seed, 16-byte metadata key, and the raw bytes + /// of the ed25519 private key. + /// + /// Safety: Since this representation requires transmission + /// of the raw bytes of an ed25519 private key (and other + /// sensitive cryptographic info) over FFI, foreign-lang + /// code around how this information is maintained + /// deserves close scrutiny. + pub const fn new(key_seed: [u8; 32], metadata_key: [u8; 16], private_key: [u8; 32]) -> Self { + Self { key_seed, metadata_key, private_key } + } + pub(crate) fn into_internal( + self, + ) -> np_adv::credential::v1::SimpleSignedBroadcastCryptoMaterial { + let permit = crypto_provider::ed25519::RawPrivateKeyPermit::default(); + np_adv::credential::v1::SimpleSignedBroadcastCryptoMaterial::new( + self.key_seed, + np_adv::MetadataKey(self.metadata_key), + crypto_provider::ed25519::PrivateKey::from_raw_private_key(self.private_key, &permit), + ) + } +}
diff --git a/nearby/presence/np_ffi_core/src/deserialize/mod.rs b/nearby/presence/np_ffi_core/src/deserialize.rs similarity index 61% rename from nearby/presence/np_ffi_core/src/deserialize/mod.rs rename to nearby/presence/np_ffi_core/src/deserialize.rs index 44510f6..09df8a4 100644 --- a/nearby/presence/np_ffi_core/src/deserialize/mod.rs +++ b/nearby/presence/np_ffi_core/src/deserialize.rs
@@ -14,12 +14,14 @@ //! Core NP Rust FFI structures and methods for advertisement deserialization. use crate::common::*; -use crate::credentials::credential_book::CredentialBook; +use crate::credentials::CredentialBook; use crate::deserialize::v0::*; use crate::deserialize::v1::*; use crate::utils::FfiEnum; use crypto_provider_default::CryptoProviderImpl; -use handle_map::{HandleLike, HandleMapFullError, HandleNotPresentError}; +use handle_map::{ + declare_handle_map, HandleLike, HandleMapDimensions, HandleMapFullError, HandleNotPresentError, +}; use np_adv::deserialization_arena; pub mod v0; @@ -154,8 +156,8 @@ deserialize_advertisement_from_slice(adv_payload.as_slice(), credential_book) } -/// Errors returned from [`crate::deserialize::v0::v0_payload::V0Payload#decrypt_metadata`]. -pub enum DecryptMetadataError { +/// Errors returned from attempting to decrypt metadata +pub(crate) enum DecryptMetadataError { /// The advertisement payload handle was either deallocated /// or corresponds to a public advertisement, and so we /// don't have any metadata to decrypt. @@ -163,3 +165,128 @@ /// Decryption of the raw metadata bytes failed. DecryptionFailed, } + +/// The result of decrypting metadata from either a V0Payload or DeserializedV1Section +#[repr(C)] +#[allow(missing_docs)] +pub enum DecryptMetadataResult { + Success(DecryptedMetadata), + Error, +} + +/// Discriminant for `DecryptMetadataResult`. +#[repr(u8)] +pub enum DecryptMetadataResultKind { + /// The attempt to decrypt the metadata of the associated credential succeeded + /// The associated payload may be obtained via + /// `DecryptMetadataResult#into_success`. + Success, + /// The attempt to decrypt the metadata failed, either the payload had no matching identity + /// ie it was a public advertisement OR the decrypt attempt itself was unsuccessful + Error, +} + +impl FfiEnum for DecryptMetadataResult { + type Kind = DecryptMetadataResultKind; + + fn kind(&self) -> Self::Kind { + match self { + DecryptMetadataResult::Success(_) => DecryptMetadataResultKind::Success, + DecryptMetadataResult::Error => DecryptMetadataResultKind::Error, + } + } +} + +impl DecryptMetadataResult { + declare_enum_cast! {into_success, Success, DecryptedMetadata} +} + +/// Internals of decrypted metadata +pub struct DecryptedMetadataInternals { + decrypted_bytes: Box<[u8]>, +} + +/// A `#[repr(C)]` handle to a value of type `DecryptedMetadataInternals` +#[repr(C)] +#[derive(Clone, Copy, PartialEq, Eq)] +pub struct DecryptedMetadata { + handle_id: u64, +} + +declare_handle_map!( + decrypted_metadata, + super::get_decrypted_metadata_handle_map_dimensions(), + super::DecryptedMetadata, + super::DecryptedMetadataInternals +); + +fn get_decrypted_metadata_handle_map_dimensions() -> HandleMapDimensions { + HandleMapDimensions { num_shards: global_num_shards(), max_active_handles: DEFAULT_MAX_HANDLES } +} + +/// The pointer and length of the decrypted metadata byte buffer +#[repr(C)] +pub struct MetadataBufferParts { + ptr: *const u8, + len: usize, +} + +#[repr(C)] +#[allow(missing_docs)] +pub enum GetMetadataBufferPartsResult { + Success(MetadataBufferParts), + Error, +} + +impl GetMetadataBufferPartsResult { + declare_enum_cast! {into_success, Success, MetadataBufferParts} +} + +#[repr(u8)] +#[allow(missing_docs)] +pub enum GetMetadataBufferPartsResultKind { + Success = 0, + Error = 1, +} + +impl FfiEnum for GetMetadataBufferPartsResult { + type Kind = GetMetadataBufferPartsResultKind; + + fn kind(&self) -> Self::Kind { + match self { + GetMetadataBufferPartsResult::Success(_) => GetMetadataBufferPartsResultKind::Success, + GetMetadataBufferPartsResult::Error => GetMetadataBufferPartsResultKind::Error, + } + } +} + +fn allocate_decrypted_metadata_handle(metadata: Vec<u8>) -> DecryptMetadataResult { + let allocate_result = DecryptedMetadata::allocate(move || DecryptedMetadataInternals { + decrypted_bytes: metadata.into_boxed_slice(), + }); + match allocate_result { + Ok(decrypted) => DecryptMetadataResult::Success(decrypted), + Err(_) => DecryptMetadataResult::Error, + } +} + +impl DecryptedMetadata { + /// Gets the raw parts, pointer + length representation of the metadata byte buffer + pub fn get_metadata_buffer_parts(&self) -> GetMetadataBufferPartsResult { + match self.get() { + Ok(metadata_internals) => { + let result = MetadataBufferParts { + ptr: metadata_internals.decrypted_bytes.as_ptr(), + len: metadata_internals.decrypted_bytes.len(), + }; + GetMetadataBufferPartsResult::Success(result) + } + Err(_) => GetMetadataBufferPartsResult::Error, + } + } + + /// Frees the underlying decrypted metadata buffer + pub fn deallocate_metadata(&self) -> DeallocateResult { + self.deallocate().map(|_| ()).into() + } +}
diff --git a/nearby/presence/np_ffi_core/src/deserialize/v0.rs b/nearby/presence/np_ffi_core/src/deserialize/v0.rs index a07b9d8..c4f117f 100644 --- a/nearby/presence/np_ffi_core/src/deserialize/v0.rs +++ b/nearby/presence/np_ffi_core/src/deserialize/v0.rs
@@ -14,14 +14,15 @@ //! Core NP Rust FFI structures and methods for v0 advertisement deserialization. use crate::common::*; -use crate::credentials::credential_book::CredentialBook; +use crate::credentials::CredentialBook; use crate::credentials::MatchedCredential; -use crate::deserialize::DecryptMetadataError; +use crate::deserialize::{ + allocate_decrypted_metadata_handle, DecryptMetadataError, DecryptMetadataResult, +}; use crate::utils::{FfiEnum, LocksLongerThan}; +use crate::v0::V0DataElement; use crypto_provider_default::CryptoProviderImpl; 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}; use np_adv::HasIdentityMatch; use std::vec::Vec; @@ -348,13 +349,19 @@ } } -declare_handle_map! { - mod v0_payload { - #[dimensions = super::get_v0_payload_handle_map_dimensions()] - type V0Payload: HandleLike<Object = super::V0PayloadInternals>; - } +/// A `#[repr(C)]` handle to a value of type `V0PayloadInternals` +#[repr(C)] +#[derive(Clone, Copy, PartialEq, Eq)] +pub struct V0Payload { + handle_id: u64, } -use v0_payload::V0Payload; + +declare_handle_map!( + v0_payload, + super::get_v0_payload_handle_map_dimensions(), + super::V0Payload, + super::V0PayloadInternals +); use super::DeserializeAdvertisementError; @@ -399,7 +406,7 @@ } /// Gets the identity details for this V0 payload, - /// if this payload was associted with an identity + /// if this payload was associated with an identity /// (i.e: non-public advertisements). pub fn get_identity_details(&self) -> GetV0IdentityDetailsResult { match self.get() { @@ -410,17 +417,13 @@ /// Attempts to decrypt the metadata for the matched /// credential for this V0 payload (if any) - /// - /// Note that while this method is publicly exposed - /// from `np_ffi_core`, since it involves the (FFI-layer-unexpressed) - /// type `Vec<u8>`, a direct wrapper will not suffice, - /// and instead a language-specific binding will need to - /// be generated for this method which respects the - /// expected memory-management semantics of the target language. - pub fn decrypt_metadata(&self) -> Result<Vec<u8>, DecryptMetadataError> { + pub fn decrypt_metadata(&self) -> DecryptMetadataResult { match self.get() { - Ok(read_guard) => read_guard.decrypt_metadata(), - Err(_) => Err(DecryptMetadataError::EncryptedMetadataNotAvailable), + Ok(read_guard) => match read_guard.decrypt_metadata() { + Ok(decrypted_metadata) => allocate_decrypted_metadata_handle(decrypted_metadata), + Err(_) => DecryptMetadataResult::Error, + }, + Err(_) => DecryptMetadataResult::Error, } } @@ -466,208 +469,3 @@ 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.action.as_u32() }) - } - PacketFlavorEnum::Ciphertext => { - Self::Encrypted(V0ActionBits { bitfield: value.action.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 - .action - .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 - .action - .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.action.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.action.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 index 4684f55..3bc056d 100644 --- a/nearby/presence/np_ffi_core/src/deserialize/v1.rs +++ b/nearby/presence/np_ffi_core/src/deserialize/v1.rs
@@ -15,14 +15,14 @@ use super::DeserializeAdvertisementError; use crate::common::*; -use crate::credentials::credential_book::CredentialBook; +use crate::credentials::CredentialBook; use crate::credentials::MatchedCredential; -use crate::deserialize::DecryptMetadataError; +use crate::deserialize::{allocate_decrypted_metadata_handle, DecryptMetadataResult}; use crate::utils::*; +use crate::v1::V1VerificationMode; use array_view::ArrayView; use crypto_provider_default::CryptoProviderImpl; use handle_map::{declare_handle_map, HandleLike, HandleMapDimensions}; -use legible_v1_sections::LegibleV1Sections; use np_adv::extended::deserialize::DataElementParseError; use np_adv::HasIdentityMatch; use std::vec::Vec; @@ -150,13 +150,20 @@ } } -declare_handle_map! { - mod legible_v1_sections { - #[dimensions = super::get_legible_v1_sections_handle_map_dimensions()] - type LegibleV1Sections: HandleLike<Object = super::LegibleV1SectionsInternals>; - } +/// A `#[repr(C)]` handle to a value of type `LegibleV1SectionsInternals` +#[repr(C)] +#[derive(Clone, Copy, PartialEq, Eq)] +struct LegibleV1Sections { + handle_id: u64, } +declare_handle_map!( + legible_v1_sections, + super::get_legible_v1_sections_handle_map_dimensions(), + super::LegibleV1Sections, + super::LegibleV1SectionsInternals +); + impl LocksLongerThan<LegibleV1Sections> for CredentialBook {} impl LegibleV1Sections { @@ -229,12 +236,15 @@ /// The result of attempting to get a derived 16-byte salt /// for a given DE within a section. -#[derive(Copy, Clone)] #[repr(C)] #[allow(missing_docs)] pub enum GetV1DE16ByteSaltResult { Error, - Success([u8; 16]), + Success(FixedSizeArray<16>), +} + +impl GetV1DE16ByteSaltResult { + declare_enum_cast! {into_success, Success, FixedSizeArray<16>} } impl FfiEnum for GetV1DE16ByteSaltResult { @@ -258,6 +268,7 @@ 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 { if self.identity.is_some() { @@ -266,6 +277,7 @@ DeserializedV1IdentityKind::Plaintext } } + /// 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) { @@ -273,6 +285,7 @@ None => GetV1DEResult::Error, } } + /// Attempts to get the directly-transmissible details about /// the deserialized V1 identity for this section. Does /// not include decrypted metadata bytes nor the section salt. @@ -282,16 +295,19 @@ None => GetV1IdentityDetailsResult::Error, } } + /// Attempts to decrypt the metadata for the matched /// credential for this V1 section (if any). - pub(crate) fn decrypt_metadata(&self) -> Result<Vec<u8>, DecryptMetadataError> { + pub(crate) fn decrypt_metadata(&self) -> DecryptMetadataResult { match &self.identity { - None => Err(DecryptMetadataError::EncryptedMetadataNotAvailable), - Some(identity) => { - identity.decrypt_metadata().ok_or(DecryptMetadataError::DecryptionFailed) - } + None => DecryptMetadataResult::Error, + Some(identity) => match identity.decrypt_metadata() { + None => DecryptMetadataResult::Error, + Some(metadata) => allocate_decrypted_metadata_handle(metadata), + }, } } + /// Attempts to derive a 16-byte DE salt for a DE in this section /// with the given DE offset. This operation may fail if the /// passed offset is 255 (causes overflow) or if the section @@ -411,32 +427,13 @@ } /// For a given data-element offset, derives a 16-byte DE salt /// for a DE in that position within this section. - pub(crate) fn derive_16_byte_salt_for_offset(&self, de_offset: u8) -> Option<[u8; 16]> { + pub(crate) fn derive_16_byte_salt_for_offset( + &self, + de_offset: u8, + ) -> Option<FixedSizeArray<16>> { let section_salt = np_hkdf::v1_salt::V1Salt::<CryptoProviderImpl>::from(self.salt); let de_offset = np_hkdf::v1_salt::DataElementOffset::from(de_offset); - section_salt.derive::<16>(Some(de_offset)) - } -} - -/// Information about the verification scheme used -/// for verifying the integrity of the contents -/// of a decrypted section. -#[derive(Clone, Copy)] -#[repr(u8)] -pub enum V1VerificationMode { - /// Message integrity code verification. - Mic = 0, - /// Signature verification. - Signature = 1, -} - -impl From<np_adv::extended::deserialize::VerificationMode> for V1VerificationMode { - fn from(verification_mode: np_adv::extended::deserialize::VerificationMode) -> Self { - use np_adv::extended::deserialize::VerificationMode; - match verification_mode { - VerificationMode::Mic => Self::Mic, - VerificationMode::Signature => Self::Signature, - } + section_salt.derive::<16>(Some(de_offset)).map(FixedSizeArray::from_array) } } @@ -550,23 +547,6 @@ self.identity_tag } - fn apply_to_section_internals<R>( - &self, - func: impl FnOnce(&DeserializedV1SectionInternals) -> R, - lookup_failure_result: R, - ) -> R { - // 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) => func(section_ref), - None => lookup_failure_result, - } - } - Err(_) => lookup_failure_result, - } - } /// Gets the DE with the given index in this section. pub fn get_de(&self, de_index: u8) -> GetV1DEResult { self.apply_to_section_internals( @@ -587,10 +567,10 @@ /// Attempts to decrypt the metadata for the matched /// credential for the V1 section referenced by /// this handle (if any). - pub fn decrypt_metadata(&self) -> Result<Vec<u8>, DecryptMetadataError> { + pub fn decrypt_metadata(&self) -> DecryptMetadataResult { self.apply_to_section_internals( DeserializedV1SectionInternals::decrypt_metadata, - Err(DecryptMetadataError::EncryptedMetadataNotAvailable), + DecryptMetadataResult::Error, ) } /// Attempts to derive a 16-byte DE salt for a DE in this section @@ -604,6 +584,24 @@ GetV1DE16ByteSaltResult::Error, ) } + + fn apply_to_section_internals<R>( + &self, + func: impl FnOnce(&DeserializedV1SectionInternals) -> R, + lookup_failure_result: R, + ) -> R { + // 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) => func(section_ref), + None => lookup_failure_result, + } + } + Err(_) => lookup_failure_result, + } + } } /// Discriminant for the `GetV1DEResult` enum.
diff --git a/nearby/presence/np_ffi_core/src/lib.rs b/nearby/presence/np_ffi_core/src/lib.rs index 0c25168..2c03ea5 100644 --- a/nearby/presence/np_ffi_core/src/lib.rs +++ b/nearby/presence/np_ffi_core/src/lib.rs
@@ -22,3 +22,6 @@ pub mod common; pub mod credentials; pub mod deserialize; +pub mod serialize; +pub mod v0; +pub mod v1;
diff --git a/nearby/presence/np_ffi_core/src/serialize.rs b/nearby/presence/np_ffi_core/src/serialize.rs new file mode 100644 index 0000000..0aade0a --- /dev/null +++ b/nearby/presence/np_ffi_core/src/serialize.rs
@@ -0,0 +1,39 @@ +// 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 serialization. + +pub mod v0; +pub mod v1; + +/// Enum common to V0 and V1 serialization expressing +/// what kind of advertisement builder (public/encrypted) +/// is in use. +#[derive(Clone, Copy)] +#[repr(u8)] +pub enum AdvertisementBuilderKind { + /// The builder is for a public advertisement. + Public = 0, + /// The builder is for an encrypted advertisement. + Encrypted = 1, +} + +impl AdvertisementBuilderKind { + pub(crate) fn as_internal_v1(&self) -> np_adv::extended::serialize::AdvertisementType { + use np_adv::extended::serialize::AdvertisementType; + match self { + Self::Public => AdvertisementType::Plaintext, + Self::Encrypted => AdvertisementType::Encrypted, + } + } +}
diff --git a/nearby/presence/np_ffi_core/src/serialize/v0.rs b/nearby/presence/np_ffi_core/src/serialize/v0.rs new file mode 100644 index 0000000..2d6b413 --- /dev/null +++ b/nearby/presence/np_ffi_core/src/serialize/v0.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. + +//! NP Rust FFI structures and methods for V0 advertisement serialization. + +use crate::common::*; +use crate::credentials::V0BroadcastCredential; +use crate::serialize::AdvertisementBuilderKind; +use crate::utils::FfiEnum; +use crate::v0::V0DataElement; +use crypto_provider_default::CryptoProviderImpl; +use handle_map::{declare_handle_map, HandleLike, HandleMapDimensions, HandleMapFullError}; +use np_adv; +use np_adv_dynamic; + +/// A handle to a builder for V0 advertisements. +#[derive(Clone, Copy)] +#[repr(C)] +pub struct V0AdvertisementBuilder { + kind: AdvertisementBuilderKind, + handle: V0AdvertisementBuilderHandle, +} + +impl V0AdvertisementBuilder { + /// Attempts to add the given data element to the V0 + /// advertisement builder behind this handle. + pub fn add_de(&self, de: V0DataElement) -> Result<AddV0DEResult, InvalidStackDataStructure> { + match self.handle.get_mut() { + Ok(mut adv_builder_write_guard) => adv_builder_write_guard.add_de(de), + Err(_) => Ok(AddV0DEResult::InvalidAdvertisementBuilderHandle), + } + } + /// Attempts to serialize the contents of the advertisement builder + /// behind this handle to bytes. Assuming that the handle is valid, + /// this operation will always result in the contents behind the + /// advertisement builder handle being deallocated. + pub fn into_advertisement(self) -> SerializeV0AdvertisementResult { + match self.handle.deallocate() { + Ok(adv_builder) => adv_builder.into_advertisement(), + Err(_) => SerializeV0AdvertisementResult::InvalidAdvertisementBuilderHandle, + } + } + /// Attempts to deallocate the V0 advertisement builder + /// behind this handle. + pub fn deallocate(self) -> DeallocateResult { + self.handle.deallocate().map(|_| ()).into() + } +} + +/// Discriminant for `CreateV0AdvertisementBuilderResult` +#[derive(Copy, Clone)] +#[repr(u8)] +pub enum CreateV0AdvertisementBuilderResultKind { + /// The attempt to create a new advertisement builder + /// failed since there are no more available + /// slots for V0 advertisement builders in their handle-map. + NoSpaceLeft = 0, + /// The attempt succeeded. The wrapped advertisement builder + /// may be obtained via + /// `CreateV0AdvertisementBuilderResult#into_success`. + Success = 1, +} + +/// The result of attempting to create a new V0 advertisement builder. +#[repr(C)] +#[allow(missing_docs)] +pub enum CreateV0AdvertisementBuilderResult { + NoSpaceLeft, + Success(V0AdvertisementBuilder), +} + +impl From<Result<V0AdvertisementBuilder, HandleMapFullError>> + for CreateV0AdvertisementBuilderResult +{ + fn from(result: Result<V0AdvertisementBuilder, HandleMapFullError>) -> Self { + match result { + Ok(builder) => CreateV0AdvertisementBuilderResult::Success(builder), + Err(_) => CreateV0AdvertisementBuilderResult::NoSpaceLeft, + } + } +} + +impl FfiEnum for CreateV0AdvertisementBuilderResult { + type Kind = CreateV0AdvertisementBuilderResultKind; + fn kind(&self) -> Self::Kind { + match self { + CreateV0AdvertisementBuilderResult::NoSpaceLeft => { + CreateV0AdvertisementBuilderResultKind::NoSpaceLeft + } + CreateV0AdvertisementBuilderResult::Success(_) => { + CreateV0AdvertisementBuilderResultKind::Success + } + } + } +} + +impl CreateV0AdvertisementBuilderResult { + declare_enum_cast! {into_success, Success, V0AdvertisementBuilder } +} + +/// Creates a new V0 advertisement builder for a public advertisement. +pub fn create_v0_public_advertisement_builder() -> CreateV0AdvertisementBuilderResult { + V0AdvertisementBuilderHandle::allocate(V0AdvertisementBuilderInternals::new_public) + .map(|handle| V0AdvertisementBuilder { kind: AdvertisementBuilderKind::Public, handle }) + .into() +} + +/// Creates a new V0 advertisement builder for an encrypted advertisement. +pub fn create_v0_encrypted_advertisement_builder( + broadcast_cred: V0BroadcastCredential, + identity_type: EncryptedIdentityType, + salt: FixedSizeArray<2>, +) -> CreateV0AdvertisementBuilderResult { + V0AdvertisementBuilderHandle::allocate(move || { + V0AdvertisementBuilderInternals::new_ldt(broadcast_cred, identity_type, salt.into_array()) + }) + .map(|handle| V0AdvertisementBuilder { kind: AdvertisementBuilderKind::Encrypted, handle }) + .into() +} + +impl V0AdvertisementBuilder { + /// Gets the kind of advertisement builder (public/encrypted) + pub fn kind(&self) -> AdvertisementBuilderKind { + self.kind + } +} + +/// Discriminant for `SerializeV0AdvertisementResult`. +#[repr(u8)] +pub enum SerializeV0AdvertisementResultKind { + /// Serializing the advertisement to bytes was successful. + Success = 0, + /// Serializing the advertisement to bytes failed + /// because the data in the advertisement wasn't + /// of an appropriate size for LDT encryption + /// to succeed. + LdtError = 1, + /// The advertisement builder handle was invalid. + InvalidAdvertisementBuilderHandle = 2, +} + +/// The result of attempting to serialize the contents +/// of a V0 advertisement builder to raw bytes. +#[repr(C)] +#[allow(missing_docs)] +pub enum SerializeV0AdvertisementResult { + Success(ByteBuffer<24>), + LdtError, + InvalidAdvertisementBuilderHandle, +} + +impl SerializeV0AdvertisementResult { + declare_enum_cast! { into_success, Success, ByteBuffer<24> } +} + +impl FfiEnum for SerializeV0AdvertisementResult { + type Kind = SerializeV0AdvertisementResultKind; + fn kind(&self) -> SerializeV0AdvertisementResultKind { + match self { + Self::Success(_) => SerializeV0AdvertisementResultKind::Success, + Self::LdtError => SerializeV0AdvertisementResultKind::LdtError, + Self::InvalidAdvertisementBuilderHandle => { + SerializeV0AdvertisementResultKind::InvalidAdvertisementBuilderHandle + } + } + } +} + +/// Internal Rust-side implementation of a V0 advertisement builder. +pub struct V0AdvertisementBuilderInternals { + adv_builder: np_adv_dynamic::legacy::BoxedAdvBuilder<CryptoProviderImpl>, +} + +impl V0AdvertisementBuilderInternals { + pub(crate) fn new_public() -> Self { + Self::new(np_adv::PublicIdentity.into()) + } + pub(crate) fn new_ldt( + broadcast_cred: V0BroadcastCredential, + identity_type: EncryptedIdentityType, + salt: [u8; 2], + ) -> Self { + // TODO: What do about salts? Need to prevent re-use fo the same salt, + // but have no current rich representation of used salts... + let salt = ldt_np_adv::LegacySalt::from(salt); + let identity_type = identity_type.into(); + let internal_broadcast_cred = broadcast_cred.into_internal(); + let identity = np_adv::legacy::serialize::LdtIdentity::new( + identity_type, + salt, + &internal_broadcast_cred, + ); + Self::new(identity.into()) + } + fn new(identity: np_adv_dynamic::legacy::BoxedIdentity<CryptoProviderImpl>) -> Self { + let adv_builder = + np_adv_dynamic::legacy::BoxedAdvBuilder::<CryptoProviderImpl>::new(identity); + Self { adv_builder } + } + fn add_de(&mut self, de: V0DataElement) -> Result<AddV0DEResult, InvalidStackDataStructure> { + let to_boxed = np_adv_dynamic::legacy::ToBoxedDataElementBundle::try_from(de)?; + use np_adv::legacy::serialize::AddDataElementError; + use np_adv_dynamic::legacy::BoxedAddDataElementError; + match self.adv_builder.add_data_element(to_boxed) { + Ok(_) => Ok(AddV0DEResult::Success), + Err(BoxedAddDataElementError::FlavorMismatchError) => { + Ok(AddV0DEResult::InvalidIdentityTypeForDataElement) + } + Err(BoxedAddDataElementError::UnderlyingError( + AddDataElementError::InsufficientAdvSpace, + )) => Ok(AddV0DEResult::InsufficientAdvertisementSpace), + } + } + fn into_advertisement(self) -> SerializeV0AdvertisementResult { + match self.adv_builder.into_advertisement() { + Ok(serialized_bytes) => { + let byte_buffer = ByteBuffer::from_array_view(serialized_bytes); + SerializeV0AdvertisementResult::Success(byte_buffer) + } + Err(np_adv_dynamic::legacy::BoxedAdvConstructionError::Ldt(_)) => { + SerializeV0AdvertisementResult::LdtError + } + } + } +} + +fn get_v0_advertisement_builder_handle_map_dimensions() -> HandleMapDimensions { + HandleMapDimensions { + num_shards: global_num_shards(), + max_active_handles: global_max_num_v0_advertisement_builders(), + } +} + +/// A `#[repr(C)]` handle to a value of type `V0AdvertisementBuilderInternals` +#[repr(C)] +#[derive(Clone, Copy, PartialEq, Eq)] +struct V0AdvertisementBuilderHandle { + handle_id: u64, +} + +declare_handle_map!( + advertisement_builder, + super::get_v0_advertisement_builder_handle_map_dimensions(), + super::V0AdvertisementBuilderHandle, + super::V0AdvertisementBuilderInternals +); + +/// Result code for the operation of adding a DE to a V0 +/// advertisement builder. +#[derive(Clone, Copy)] +#[repr(u8)] +pub enum AddV0DEResult { + /// The DE was successfully added to the advertisement builder + /// behind the given handle. + Success = 0, + /// The handle for the advertisement builder was invalid. + InvalidAdvertisementBuilderHandle = 1, + /// There was not enough available space left in the advertisement + /// to append the given data element. + InsufficientAdvertisementSpace = 2, + /// The passed data element is not broadcastable under the + /// identity type of the advertisement (public/private). + InvalidIdentityTypeForDataElement = 3, +} + +impl From<np_adv_dynamic::legacy::BoxedAddDataElementError> for AddV0DEResult { + fn from(err: np_adv_dynamic::legacy::BoxedAddDataElementError) -> Self { + use np_adv_dynamic::legacy::BoxedAddDataElementError; + match err { + BoxedAddDataElementError::UnderlyingError(_) => Self::InsufficientAdvertisementSpace, + BoxedAddDataElementError::FlavorMismatchError => { + Self::InvalidIdentityTypeForDataElement + } + } + } +}
diff --git a/nearby/presence/np_ffi_core/src/serialize/v1.rs b/nearby/presence/np_ffi_core/src/serialize/v1.rs new file mode 100644 index 0000000..d48a725 --- /dev/null +++ b/nearby/presence/np_ffi_core/src/serialize/v1.rs
@@ -0,0 +1,700 @@ +// 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 FFI structures and methods for V1 advertisement serialization. + +use crate::common::*; +use crate::credentials::V1BroadcastCredential; +use crate::serialize::AdvertisementBuilderKind; +use crate::utils::FfiEnum; +use crate::v1::V1VerificationMode; +use crypto_provider_default::CryptoProviderImpl; +use handle_map::{declare_handle_map, HandleLike, HandleMapDimensions, HandleMapFullError}; +use np_adv; +use np_adv_dynamic; + +/// A handle to a builder for V1 advertisements. +#[derive(Clone, Copy)] +#[repr(C)] +pub struct V1AdvertisementBuilder { + kind: AdvertisementBuilderKind, + handle: V1AdvertisementBuilderHandle, +} + +impl V1AdvertisementBuilder { + /// Attempts to create a builder for a new public section within + /// this advertisement, returning a handle to the newly-created + /// section builder if successful. + /// + /// This method may fail if there is another currently-active + /// section builder for the same advertisement builder, if the + /// kind of section being added does not match the advertisement + /// type (public/encrypted), or if the section would not manage + /// to fit within the enclosing advertisement. + pub fn public_section_builder(&self) -> CreateV1SectionBuilderResult { + self.section_builder_internals(|internals| internals.public_section_builder()) + } + /// Attempts to create a builder for a new encrypted section within + /// this advertisement, returning a handle to the newly-created + /// section builder if successful. + /// + /// The identity details for the new section builder may be specified + /// via providing the broadcast credential data, the kind of encrypted + /// identity being broadcast (private/trusted/provisioned), and the + /// verification mode (MIC/Signature) to be used for the encrypted section. + /// + /// This method may fail if there is another currently-active + /// section builder for the same advertisement builder, if the + /// kind of section being added does not match the advertisement + /// type (public/encrypted), or if the section would not manage + /// to fit within the enclosing advertisement. + pub fn encrypted_section_builder( + &self, + broadcast_cred: V1BroadcastCredential, + identity_type: EncryptedIdentityType, + verification_mode: V1VerificationMode, + ) -> CreateV1SectionBuilderResult { + self.section_builder_internals(move |internals| { + internals.encrypted_section_builder(broadcast_cred, identity_type, verification_mode) + }) + } + + /// Attempts to serialize the contents of the advertisement builder + /// behind this handle to bytes. Assuming that the handle is valid, + /// this operation will always result in the contents behind the + /// advertisement builder handle being deallocated. + pub fn into_advertisement(self) -> SerializeV1AdvertisementResult { + match self.handle.deallocate() { + Ok(adv_builder) => adv_builder.into_advertisement(), + Err(_) => SerializeV1AdvertisementResult::InvalidAdvertisementBuilderHandle, + } + } + + fn section_builder_internals( + &self, + builder_supplier: impl FnOnce( + &mut V1AdvertisementBuilderInternals, + ) -> Result<usize, SectionBuilderError>, + ) -> CreateV1SectionBuilderResult { + match self.handle.get_mut() { + Ok(mut adv_builder_write_guard) => { + match builder_supplier(&mut adv_builder_write_guard) { + Ok(section_index) => CreateV1SectionBuilderResult::Success(V1SectionBuilder { + adv_builder: *self, + section_index: section_index as u8, + }), + Err(e) => e.into(), + } + } + Err(_) => CreateV1SectionBuilderResult::InvalidAdvertisementBuilderHandle, + } + } +} + +/// Discriminant for `CreateV1AdvertisementBuilderResult` +#[derive(Copy, Clone)] +#[repr(u8)] +pub enum CreateV1AdvertisementBuilderResultKind { + /// The attempt to create a new advertisement builder + /// failed since there are no more available + /// slots for V1 advertisement builders in their handle-map. + NoSpaceLeft = 0, + /// The attempt succeeded. The wrapped advertisement builder + /// may be obtained via + /// `CreateV1AdvertisementBuilderResult#into_success`. + Success = 1, +} + +/// The result of attempting to create a new V1 advertisement builder. +#[repr(C)] +#[allow(missing_docs)] +pub enum CreateV1AdvertisementBuilderResult { + NoSpaceLeft, + Success(V1AdvertisementBuilder), +} + +impl From<Result<V1AdvertisementBuilder, HandleMapFullError>> + for CreateV1AdvertisementBuilderResult +{ + fn from(result: Result<V1AdvertisementBuilder, HandleMapFullError>) -> Self { + match result { + Ok(builder) => CreateV1AdvertisementBuilderResult::Success(builder), + Err(_) => CreateV1AdvertisementBuilderResult::NoSpaceLeft, + } + } +} + +impl FfiEnum for CreateV1AdvertisementBuilderResult { + type Kind = CreateV1AdvertisementBuilderResultKind; + fn kind(&self) -> Self::Kind { + match self { + CreateV1AdvertisementBuilderResult::NoSpaceLeft => { + CreateV1AdvertisementBuilderResultKind::NoSpaceLeft + } + CreateV1AdvertisementBuilderResult::Success(_) => { + CreateV1AdvertisementBuilderResultKind::Success + } + } + } +} + +impl CreateV1AdvertisementBuilderResult { + declare_enum_cast! {into_success, Success, V1AdvertisementBuilder } +} + +/// Creates a new V1 advertisement builder for the given advertisement +/// kind (public/encrypted). +pub fn create_v1_advertisement_builder( + kind: AdvertisementBuilderKind, +) -> CreateV1AdvertisementBuilderResult { + V1AdvertisementBuilderHandle::allocate(move || V1AdvertisementBuilderInternals::new(kind)) + .map(|handle| V1AdvertisementBuilder { kind, handle }) + .into() +} + +impl V1AdvertisementBuilder { + /// Gets the kind of advertisement builder (public/encrypted) + pub fn kind(&self) -> AdvertisementBuilderKind { + self.kind + } +} + +pub(crate) enum V1AdvertisementBuilderState { + /// Internal state for when we have an active advertisement + /// builder, but no currently-active section builder. + Advertisement(np_adv_dynamic::extended::BoxedAdvBuilder), + /// Internal state for when we have both an active advertisement + /// builder and an active section builder. + Section( + np_adv_dynamic::extended::BoxedSectionBuilder< + np_adv::extended::serialize::AdvBuilder, + CryptoProviderImpl, + >, + ), +} + +/// Internal version of errors which may be raised when +/// attempting to derive a new section builder from an +/// advertisement builder. +#[derive(Debug, Eq, PartialEq)] +pub(crate) enum SectionBuilderError { + /// We're currently in the middle of building a section. + UnclosedActiveSection, + /// We're attempting to build a section with an identity + /// kind (public/encrypted) which doesn't match the kind + /// for the entire advertisement. + IdentityKindMismatch, + /// There isn't enough space for a new section, either + /// because the maximum section count has been exceeded + /// or because the advertisement is almost full, and + /// the minimum size of a section wouldn't fit. + NoSpaceLeft, +} + +impl From<np_adv_dynamic::extended::BoxedAddSectionError> for SectionBuilderError { + fn from(err: np_adv_dynamic::extended::BoxedAddSectionError) -> Self { + use np_adv::extended::serialize::AddSectionError; + use np_adv_dynamic::extended::BoxedAddSectionError; + match err { + BoxedAddSectionError::IdentityRequiresSaltError + | BoxedAddSectionError::Underlying(AddSectionError::IncompatibleSectionType) => { + SectionBuilderError::IdentityKindMismatch + } + BoxedAddSectionError::Underlying(AddSectionError::InsufficientAdvSpace) + | BoxedAddSectionError::Underlying(AddSectionError::MaxSectionCountExceeded) => { + SectionBuilderError::NoSpaceLeft + } + } + } +} + +/// Discriminant for `SerializeV1AdvertisementResult`. +#[repr(u8)] +pub enum SerializeV1AdvertisementResultKind { + /// Serializing the advertisement to bytes was successful. + Success = 0, + /// The state of the advertisement builder was invalid + /// for the builder to be closed for serialization, likely + /// because there was an unclosed section builder. + InvalidBuilderState = 1, + /// The advertisement builder handle was invalid. + InvalidAdvertisementBuilderHandle = 2, +} + +/// The result of attempting to serialize the contents +/// of a V1 advertisement builder to raw bytes. +#[repr(C)] +#[allow(missing_docs, clippy::large_enum_variant)] +pub enum SerializeV1AdvertisementResult { + Success(ByteBuffer<250>), + InvalidBuilderState, + InvalidAdvertisementBuilderHandle, +} + +impl SerializeV1AdvertisementResult { + declare_enum_cast! { into_success, Success, ByteBuffer<250> } +} + +impl FfiEnum for SerializeV1AdvertisementResult { + type Kind = SerializeV1AdvertisementResultKind; + fn kind(&self) -> SerializeV1AdvertisementResultKind { + match self { + Self::Success(_) => SerializeV1AdvertisementResultKind::Success, + Self::InvalidBuilderState => SerializeV1AdvertisementResultKind::InvalidBuilderState, + Self::InvalidAdvertisementBuilderHandle => { + SerializeV1AdvertisementResultKind::InvalidAdvertisementBuilderHandle + } + } + } +} + +/// Internal, Rust-side implementation of a V1 advertisement builder. +pub struct V1AdvertisementBuilderInternals { + // Note: This is actually always populated from an external + // perspective in the absence of panics. We only need + // the `Option` in order to be able to take ownership + // and perform a state transition when needed. + state: Option<V1AdvertisementBuilderState>, +} + +impl V1AdvertisementBuilderInternals { + pub(crate) fn new(kind: AdvertisementBuilderKind) -> Self { + let adv_type = kind.as_internal_v1(); + let builder = np_adv::extended::serialize::AdvBuilder::new(adv_type); + let builder = builder.into(); + let state = Some(V1AdvertisementBuilderState::Advertisement(builder)); + Self { state } + } + /// Internals of section_builder-type routines. Upon success, yields the index + /// of the newly-added section builder. + pub(crate) fn section_builder_internal( + &mut self, + identity: np_adv_dynamic::extended::BoxedIdentity<CryptoProviderImpl>, + ) -> Result<usize, SectionBuilderError> { + let state = self.state.take(); + match state { + Some(V1AdvertisementBuilderState::Advertisement(adv_builder)) => { + match adv_builder.into_section_builder::<CryptoProviderImpl>(identity) { + Ok(section_builder) => { + let section_index = section_builder.section_index(); + self.state = Some(V1AdvertisementBuilderState::Section(section_builder)); + Ok(section_index) + } + Err((adv_builder, err)) => { + self.state = Some(V1AdvertisementBuilderState::Advertisement(adv_builder)); + Err(err.into()) + } + } + } + x => { + // Note: Technically, this case also would leave the `None` state + // if we ever entered into it, but we never transition to that + // state during normal operation. + self.state = x; + Err(SectionBuilderError::UnclosedActiveSection) + } + } + } + + pub(crate) fn public_section_builder(&mut self) -> Result<usize, SectionBuilderError> { + let identity = np_adv_dynamic::extended::BoxedIdentity::PublicIdentity; + self.section_builder_internal(identity) + } + pub(crate) fn encrypted_section_builder( + &mut self, + broadcast_cred: V1BroadcastCredential, + identity_type: EncryptedIdentityType, + verification_mode: V1VerificationMode, + ) -> Result<usize, SectionBuilderError> { + let mut rng = get_global_crypto_rng(); + let rng = rng.get_rng(); + let identity_type = identity_type.into(); + let internal_broadcast_cred = broadcast_cred.into_internal(); + let identity = match verification_mode { + V1VerificationMode::Mic => { + let encoder = np_adv::extended::serialize::MicEncryptedSectionEncoder::< + CryptoProviderImpl, + >::new_random_salt( + rng, identity_type, &internal_broadcast_cred + ); + np_adv_dynamic::extended::BoxedIdentity::MicEncrypted(encoder) + } + V1VerificationMode::Signature => { + let encoder = np_adv::extended::serialize::SignedEncryptedSectionEncoder::< + CryptoProviderImpl, + >::new_random_salt( + rng, identity_type, &internal_broadcast_cred + ); + np_adv_dynamic::extended::BoxedIdentity::SignedEncrypted(encoder) + } + }; + self.section_builder_internal(identity) + } + fn into_advertisement(self) -> SerializeV1AdvertisementResult { + match self.state { + Some(V1AdvertisementBuilderState::Advertisement(adv_builder)) => { + let array_view = adv_builder.into_advertisement().into_array_view(); + SerializeV1AdvertisementResult::Success(ByteBuffer::from_array_view(array_view)) + } + _ => SerializeV1AdvertisementResult::InvalidBuilderState, + } + } +} + +fn get_v1_advertisement_builder_handle_map_dimensions() -> HandleMapDimensions { + HandleMapDimensions { + num_shards: global_num_shards(), + max_active_handles: global_max_num_v1_advertisement_builders(), + } +} + +/// A `#[repr(C)]` handle to a value of type `V1AdvertisementBuilderInternals` +#[repr(C)] +#[derive(Clone, Copy, PartialEq, Eq)] +struct V1AdvertisementBuilderHandle { + handle_id: u64, +} + +declare_handle_map!( + advertisement_builder, + super::get_v1_advertisement_builder_handle_map_dimensions(), + super::V1AdvertisementBuilderHandle, + super::V1AdvertisementBuilderInternals +); + +/// Discriminant for `CreateV1SectionBuilderResult` +#[derive(Copy, Clone)] +#[repr(u8)] +pub enum CreateV1SectionBuilderResultKind { + /// The attempt to create a new section builder succeeded. + Success = 0, + /// We're currently in the middle of building a section. + UnclosedActiveSection = 1, + /// The advertisement builder handle was invalid. + InvalidAdvertisementBuilderHandle = 2, + /// We're attempting to build a section with an identity + /// kind (public/encrypted) which doesn't match the kind + /// for the entire advertisement. + IdentityKindMismatch = 3, + /// There isn't enough space for a new section, either + /// because the maximum section count has been exceeded + /// or because the advertisement is almost full, and + /// the minimum size of a section wouldn't fit. + NoSpaceLeft = 4, +} + +/// The result of attempting to create a new V1 section builder. +#[repr(C)] +#[allow(missing_docs)] +pub enum CreateV1SectionBuilderResult { + Success(V1SectionBuilder), + UnclosedActiveSection, + InvalidAdvertisementBuilderHandle, + IdentityKindMismatch, + NoSpaceLeft, +} + +impl FfiEnum for CreateV1SectionBuilderResult { + type Kind = CreateV1SectionBuilderResultKind; + fn kind(&self) -> Self::Kind { + match self { + Self::Success(_) => CreateV1SectionBuilderResultKind::Success, + Self::UnclosedActiveSection => CreateV1SectionBuilderResultKind::UnclosedActiveSection, + Self::InvalidAdvertisementBuilderHandle => { + CreateV1SectionBuilderResultKind::InvalidAdvertisementBuilderHandle + } + Self::IdentityKindMismatch => CreateV1SectionBuilderResultKind::IdentityKindMismatch, + Self::NoSpaceLeft => CreateV1SectionBuilderResultKind::NoSpaceLeft, + } + } +} + +impl CreateV1SectionBuilderResult { + declare_enum_cast! {into_success, Success, V1SectionBuilder} +} + +impl From<SectionBuilderError> for CreateV1SectionBuilderResult { + fn from(err: SectionBuilderError) -> Self { + match err { + SectionBuilderError::UnclosedActiveSection => Self::UnclosedActiveSection, + SectionBuilderError::IdentityKindMismatch => Self::IdentityKindMismatch, + SectionBuilderError::NoSpaceLeft => Self::NoSpaceLeft, + } + } +} + +/// Result code for [`V1SectionBuilder#add_to_advertisement`]. +#[derive(Clone, Copy)] +#[repr(u8)] +pub enum AddV1SectionToAdvertisementResult { + /// The section referenced by the given handle + /// couldn't be added to the containing advertisement, + /// possibly because the handle is invalid or the section + /// has already been added to the containing section. + Error = 0, + /// The section referenced by the given handle + /// was successfully added to the containing advertisement. + /// After obtaining this result code, the section + /// handle will no longer be valid. + Success = 1, +} + +/// Result code for operations adding DEs to a section builder. +#[derive(Clone, Copy)] +#[repr(u8)] +pub enum AddV1DEResult { + /// The DE was successfully added to the section builder + /// behind the given handle. + Success = 0, + /// The handle for the section builder was invalid. + InvalidSectionHandle = 1, + /// There was no more space left in the advertisement + /// to fit the DE in the containing section. + InsufficientSectionSpace = 2, + /// The data element itself had invalid characteristics, + /// most likely a length above 127. + InvalidDataElement = 3, +} + +/// Discriminant for `NextV1DE16ByteSaltResult`. +#[derive(Clone, Copy)] +#[repr(u8)] +pub enum NextV1DE16ByteSaltResultKind { + /// We couldn't return a 16-byte DE salt, possibly + /// because the handle to the section builder + /// was invalid, or possibly because the section + /// builder was for a public section. + Error = 0, + /// A 16-byte DE salt was returned successfully. + Success = 1, +} + +/// The result of attempting to get the derived V1 DE +/// 16-byte salt for the next-added DE to the section +/// builder behind the given handle. +#[derive(Clone)] +#[repr(C)] +#[allow(missing_docs)] +pub enum NextV1DE16ByteSaltResult { + Error, + Success(FixedSizeArray<16>), +} + +impl FfiEnum for NextV1DE16ByteSaltResult { + type Kind = NextV1DE16ByteSaltResultKind; + fn kind(&self) -> Self::Kind { + match self { + Self::Error => NextV1DE16ByteSaltResultKind::Error, + Self::Success(_) => NextV1DE16ByteSaltResultKind::Success, + } + } +} + +impl NextV1DE16ByteSaltResult { + declare_enum_cast! {into_success, Success, FixedSizeArray<16> } +} + +impl From<Option<np_adv::extended::serialize::DeSalt<CryptoProviderImpl>>> + for NextV1DE16ByteSaltResult +{ + fn from(maybe_salt: Option<np_adv::extended::serialize::DeSalt<CryptoProviderImpl>>) -> Self { + match maybe_salt.and_then(|salt| salt.derive::<16>()) { + Some(salt) => NextV1DE16ByteSaltResult::Success(FixedSizeArray::from_array(salt)), + None => NextV1DE16ByteSaltResult::Error, + } + } +} + +/// A handle to a builder for V1 sections. +#[derive(Clone, Copy)] +#[repr(C)] +pub struct V1SectionBuilder { + adv_builder: V1AdvertisementBuilder, + section_index: u8, +} + +impl V1SectionBuilder { + /// Attempts to add the section constructed behind this handle + /// to a section builder to the containing advertisement it + /// originated from. + pub fn add_to_advertisement(self) -> AddV1SectionToAdvertisementResult { + match self.adv_builder.handle.get_mut() { + Ok(mut adv_builder) => { + let state = adv_builder.state.take(); + match state { + Some(V1AdvertisementBuilderState::Section(section_builder)) => { + // Make sure the index of the section we're trying to close + // matches the index of the section currently under construction. + let actual_section_index = section_builder.section_index() as u8; + if self.section_index == actual_section_index { + let updated_adv_builder = section_builder.add_to_advertisement(); + adv_builder.state = Some(V1AdvertisementBuilderState::Advertisement( + updated_adv_builder, + )); + AddV1SectionToAdvertisementResult::Success + } else { + adv_builder.state = + Some(V1AdvertisementBuilderState::Section(section_builder)); + AddV1SectionToAdvertisementResult::Error + } + } + x => { + adv_builder.state = x; + AddV1SectionToAdvertisementResult::Error + } + } + } + Err(_) => AddV1SectionToAdvertisementResult::Error, + } + } + + /// Attempts to get the derived 16-byte V1 DE salt for the next + /// DE to be added to this section builder. May fail if this + /// section builder handle is invalid, or if the section + /// is a public section. + pub fn next_de_salt(&self) -> NextV1DE16ByteSaltResult { + self.try_apply_to_internals( + |section_builder| section_builder.next_de_salt().into(), + NextV1DE16ByteSaltResult::Error, + ) + } + + /// Attempts to add the given DE to the section builder behind + /// this handle. The passed DE may have a payload of up to 127 + /// bytes, the maximum for a V1 DE. + pub fn add_127_byte_buffer_de(&self, de: V1DE127ByteBuffer) -> AddV1DEResult { + match de.into_internal() { + Some(generic_de) => self + .add_de_internals(np_adv_dynamic::extended::BoxedWriteDataElement::new(generic_de)), + None => AddV1DEResult::InvalidDataElement, + } + } + + fn add_de_internals( + &self, + de: np_adv_dynamic::extended::BoxedWriteDataElement, + ) -> AddV1DEResult { + self.try_apply_to_internals( + move |section_builder| match section_builder.add_de(move |_| de) { + Ok(_) => AddV1DEResult::Success, + Err(_) => AddV1DEResult::InsufficientSectionSpace, + }, + AddV1DEResult::InvalidSectionHandle, + ) + } + + fn try_apply_to_internals<R>( + &self, + func: impl FnOnce( + &mut np_adv_dynamic::extended::BoxedSectionBuilder< + np_adv::extended::serialize::AdvBuilder, + CryptoProviderImpl, + >, + ) -> R, + invalid_handle_error: R, + ) -> R { + match self.adv_builder.handle.get_mut() { + Ok(mut adv_builder) => { + match adv_builder.state.as_mut() { + Some(V1AdvertisementBuilderState::Section(ref mut section_builder)) => { + // Check to make sure that the section index matches, otherwise + // we have an invalid handle. + let current_section_index = section_builder.section_index() as u8; + if current_section_index == self.section_index { + func(section_builder) + } else { + invalid_handle_error + } + } + Some(V1AdvertisementBuilderState::Advertisement(_)) => invalid_handle_error, + None => invalid_handle_error, + } + } + Err(_) => invalid_handle_error, + } + } +} + +/// Represents the contents of a V1 DE whose payload +/// is stored in a buffer which may contain up to 127 bytes, +/// which is the maximum for any V1 DE. +/// +/// This representation is stable, and so you may directly +/// reference this struct's fields if you wish. +#[repr(C)] +//TODO: Partial unification with `deserialize::v1::GenericV1DataElement`? +pub struct V1DE127ByteBuffer { + /// The DE type code of this generic data-element. + pub de_type: u32, + /// The raw data-element byte payload, up to + /// 127 bytes in length. + pub payload: ByteBuffer<127>, +} + +impl V1DE127ByteBuffer { + /// Attempts to convert this FFI-friendly DE with a byte-buffer size of 127 + /// to the internal representation of a generic DE. May fail in the case + /// where the underlying payload byte-buffer has an invalid length above 127. + fn into_internal(self) -> Option<np_adv::extended::data_elements::GenericDataElement> { + let de_type = np_adv::extended::de_type::DeType::from(self.de_type); + self.payload.as_slice().and_then(move |payload_slice| { + np_adv::extended::data_elements::GenericDataElement::try_from(de_type, payload_slice) + .ok() + }) + } +} + +#[cfg(test)] +mod tests { + use super::*; + + const EMPTY_BROADCAST_CRED: V1BroadcastCredential = + V1BroadcastCredential::new([0; 32], [0; 16], [0; 32]); + + fn state_is_advertisement_building(adv_builder_state: &V1AdvertisementBuilderState) -> bool { + matches!(adv_builder_state, V1AdvertisementBuilderState::Advertisement(_)) + } + + #[allow(clippy::expect_used)] + #[test] + fn test_build_section_fails_with_outstanding_section() { + let mut adv_builder = + V1AdvertisementBuilderInternals::new(AdvertisementBuilderKind::Encrypted); + + let adv_builder_state = + adv_builder.state.as_ref().expect("Adv builder state should be present."); + assert!(state_is_advertisement_building(adv_builder_state)); + let section_index = adv_builder + .encrypted_section_builder( + EMPTY_BROADCAST_CRED, + EncryptedIdentityType::Private, + V1VerificationMode::Mic, + ) + .expect("Should be able to build the first section."); + assert_eq!(section_index, 0); + + assert!(adv_builder.state.is_some()); + let adv_builder_state = + adv_builder.state.as_ref().expect("Adv builder state should be present."); + assert!(!state_is_advertisement_building(adv_builder_state)); + + let double_build_error = adv_builder + .encrypted_section_builder( + EMPTY_BROADCAST_CRED, + EncryptedIdentityType::Private, + V1VerificationMode::Mic, + ) + .expect_err("Shouldn't be able to start a new section builder with an unclosed one."); + assert_eq!(double_build_error, SectionBuilderError::UnclosedActiveSection); + } +}
diff --git a/nearby/presence/np_ffi_core/src/utils.rs b/nearby/presence/np_ffi_core/src/utils.rs index e547a89..b1495b9 100644 --- a/nearby/presence/np_ffi_core/src/utils.rs +++ b/nearby/presence/np_ffi_core/src/utils.rs
@@ -37,6 +37,7 @@ /// /// If the enclosing enum turns out to not be the requested /// variant, the generated method will return `None`. +#[macro_export] 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),
diff --git a/nearby/presence/np_ffi_core/src/v0.rs b/nearby/presence/np_ffi_core/src/v0.rs new file mode 100644 index 0000000..89a427c --- /dev/null +++ b/nearby/presence/np_ffi_core/src/v0.rs
@@ -0,0 +1,461 @@ +// 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-acessible V0 constructs for both of the +//! serialization+deserialization flows. + +use crate::common::InvalidStackDataStructure; +use crate::serialize::AdvertisementBuilderKind; +use crate::utils::FfiEnum; +use np_adv::legacy::actions::ActionsDataElement; +use np_adv::legacy::{data_elements as np_adv_de, Ciphertext, PacketFlavorEnum, Plaintext}; + +/// 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 TryFrom<V0DataElement> for np_adv_dynamic::legacy::ToBoxedDataElementBundle { + type Error = InvalidStackDataStructure; + fn try_from(de: V0DataElement) -> Result<Self, InvalidStackDataStructure> { + match de { + V0DataElement::TxPower(x) => x.try_into(), + V0DataElement::Actions(x) => x.try_into(), + } + } +} + +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} +} + +/// Discriminant for `BuildTxPowerResult`. +#[repr(u8)] +#[derive(Clone, Copy)] +pub enum BuildTxPowerResultKind { + /// The transmission power was outside the + /// allowed -100dBm to 20dBm range. + OutOfRange = 0, + /// The transmission power was in range, + /// and so a `TxPower` struct was constructed. + Success = 1, +} + +/// Result type for attempting to construct a +/// Tx Power from a signed byte. +#[repr(C)] +#[allow(missing_docs)] +pub enum BuildTxPowerResult { + OutOfRange, + Success(TxPower), +} + +impl FfiEnum for BuildTxPowerResult { + type Kind = BuildTxPowerResultKind; + fn kind(&self) -> Self::Kind { + match self { + Self::OutOfRange => BuildTxPowerResultKind::OutOfRange, + Self::Success(_) => BuildTxPowerResultKind::Success, + } + } +} + +impl BuildTxPowerResult { + declare_enum_cast! {into_success, Success, TxPower} +} + +/// 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 { + /// Attempts to construct a new TxPower from + /// the given signed-byte value. + pub fn build_from_signed_byte(tx_power: i8) -> BuildTxPowerResult { + match np_adv::shared_data::TxPower::try_from(tx_power) { + Ok(_) => BuildTxPowerResult::Success(Self { tx_power }), + Err(_) => BuildTxPowerResult::OutOfRange, + } + } + /// 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() } + } +} + +impl TryFrom<TxPower> for np_adv_dynamic::legacy::ToBoxedDataElementBundle { + type Error = InvalidStackDataStructure; + fn try_from(value: TxPower) -> Result<Self, InvalidStackDataStructure> { + np_adv::shared_data::TxPower::try_from(value.as_i8()) + .map_err(|_| InvalidStackDataStructure) + .map(|x| x.into()) + } +} + +/// Discriminant for `BuildContextSyncSeqNumResult`. +#[repr(u8)] +#[derive(Clone, Copy)] +pub enum BuildContextSyncSeqNumResultKind { + /// The sequence number was outside the allowed + /// 0-15 single-nibble range. + OutOfRange = 0, + /// The sequence number was in range, + /// and so a `ContextSyncSeqNum` was constructed. + Success = 1, +} + +/// Result type for attempting to construct a +/// ContextSyncSeqNum from an unsigned byte. +#[repr(C)] +#[allow(missing_docs)] +pub enum BuildContextSyncSeqNumResult { + OutOfRange, + Success(ContextSyncSeqNum), +} + +impl FfiEnum for BuildContextSyncSeqNumResult { + type Kind = BuildContextSyncSeqNumResultKind; + fn kind(&self) -> Self::Kind { + match self { + Self::OutOfRange => BuildContextSyncSeqNumResultKind::OutOfRange, + Self::Success(_) => BuildContextSyncSeqNumResultKind::Success, + } + } +} + +impl BuildContextSyncSeqNumResult { + declare_enum_cast! {into_success, Success, ContextSyncSeqNum} +} +/// Representation of a context-sync sequence number. +#[derive(Clone, Copy)] +#[repr(C)] +pub struct ContextSyncSeqNum { + value: u8, +} + +impl ContextSyncSeqNum { + /// Attempts to build a new context sync sequence number + /// from the given unsigned byte. + pub fn build_from_unsigned_byte(value: u8) -> BuildContextSyncSeqNumResult { + match np_adv::shared_data::ContextSyncSeqNum::try_from(value) { + Ok(_) => BuildContextSyncSeqNumResult::Success(Self { value }), + Err(_) => BuildContextSyncSeqNumResult::OutOfRange, + } + } + /// Yields this context sync sequence number + /// as a u8. + pub fn as_u8(&self) -> u8 { + self.value + } +} + +impl From<np_adv::shared_data::ContextSyncSeqNum> for ContextSyncSeqNum { + fn from(value: np_adv::shared_data::ContextSyncSeqNum) -> Self { + let value = value.as_u8(); + Self { value } + } +} + +impl TryFrom<ContextSyncSeqNum> for np_adv_dynamic::legacy::ToBoxedActionElement { + type Error = InvalidStackDataStructure; + fn try_from(value: ContextSyncSeqNum) -> Result<Self, Self::Error> { + let value = value.as_u8(); + np_adv::shared_data::ContextSyncSeqNum::try_from(value) + .map(np_adv_dynamic::legacy::ToBoxedActionElement::ContextSyncSeqNum) + .map_err(|_| InvalidStackDataStructure) + } +} + +/// Representation of the Actions DE in V0. +#[derive(Clone, Copy)] +#[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 TryFrom<V0Actions> for np_adv_dynamic::legacy::ToBoxedDataElementBundle { + type Error = InvalidStackDataStructure; + fn try_from(value: V0Actions) -> Result<Self, InvalidStackDataStructure> { + let boxed_action_bits = np_adv_dynamic::legacy::BoxedActionBits::try_from(value)?; + Ok(boxed_action_bits.into()) + } +} + +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.action.as_u32() }) + } + PacketFlavorEnum::Ciphertext => { + Self::Encrypted(V0ActionBits { bitfield: value.action.as_u32() }) + } + } + } +} + +#[repr(C)] +#[derive(Clone, Copy)] +/// The bitfield data of a VOActions data element +pub struct V0ActionBits { + bitfield: u32, +} + +#[derive(Clone, Copy)] +#[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 BooleanActionType { + pub(crate) fn as_boxed_action_element( + &self, + value: bool, + ) -> np_adv_dynamic::legacy::ToBoxedActionElement { + use np_adv_dynamic::legacy::ToBoxedActionElement; + match self { + Self::ActiveUnlock => ToBoxedActionElement::ActiveUnlock(value), + Self::NearbyShare => ToBoxedActionElement::NearbyShare(value), + Self::InstantTethering => ToBoxedActionElement::InstantTethering(value), + Self::PhoneHub => ToBoxedActionElement::PhoneHub(value), + Self::PresenceManager => ToBoxedActionElement::PresenceManager(value), + Self::Finder => ToBoxedActionElement::Finder(value), + Self::FastPairSass => ToBoxedActionElement::FastPairSass(value), + } + } +} + +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 + } + } + } +} + +impl From<np_adv_dynamic::legacy::BoxedActionBits> for V0Actions { + fn from(bits: np_adv_dynamic::legacy::BoxedActionBits) -> Self { + use np_adv_dynamic::legacy::BoxedActionBits; + match bits { + BoxedActionBits::Plaintext(x) => Self::Plaintext(V0ActionBits { bitfield: x.as_u32() }), + BoxedActionBits::Ciphertext(x) => { + Self::Encrypted(V0ActionBits { bitfield: x.as_u32() }) + } + } + } +} + +impl TryFrom<V0Actions> for np_adv_dynamic::legacy::BoxedActionBits { + type Error = InvalidStackDataStructure; + fn try_from(actions: V0Actions) -> Result<Self, InvalidStackDataStructure> { + match actions { + V0Actions::Plaintext(action_bits) => { + let bits = np_adv::legacy::actions::ActionBits::<Plaintext>::try_from( + action_bits.bitfield, + ) + .map_err(|_| InvalidStackDataStructure)?; + Ok(bits.into()) + } + V0Actions::Encrypted(action_bits) => { + let bits = np_adv::legacy::actions::ActionBits::<Ciphertext>::try_from( + action_bits.bitfield, + ) + .map_err(|_| InvalidStackDataStructure)?; + Ok(bits.into()) + } + } + } +} + +/// Discriminant for `SetV0ActionResult`. +#[repr(u8)] +pub enum SetV0ActionResultKind { + /// The attempt to set the action bit failed. The + /// action bits were yielded back to the caller, + /// unmodified. + Error = 0, + /// The attempt to set the action bit succeeded. + /// The updated action bits were yielded back to the caller. + Success = 1, +} + +/// The result of attempting to set a particular action +/// bit on some `V0Actions`. +#[repr(C)] +#[allow(missing_docs)] +pub enum SetV0ActionResult { + Success(V0Actions), + Error(V0Actions), +} + +impl FfiEnum for SetV0ActionResult { + type Kind = SetV0ActionResultKind; + fn kind(&self) -> Self::Kind { + match self { + Self::Success(_) => SetV0ActionResultKind::Success, + Self::Error(_) => SetV0ActionResultKind::Error, + } + } +} + +impl SetV0ActionResult { + declare_enum_cast! { into_success, Success, V0Actions } + declare_enum_cast! { into_error, Error, V0Actions } +} + +impl V0Actions { + /// Constructs a new V0 actions DE with no declared boolean + /// actions and a zeroed context sync sequence number, + /// where the DE is intended for the given advertisement + /// kind (plaintext/encrypted). + pub fn new_zeroed(kind: AdvertisementBuilderKind) -> Self { + match kind { + AdvertisementBuilderKind::Public => Self::Plaintext(V0ActionBits { bitfield: 0 }), + AdvertisementBuilderKind::Encrypted => Self::Encrypted(V0ActionBits { bitfield: 0 }), + } + } + + /// 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, InvalidStackDataStructure> { + let boxed_action_bits = np_adv_dynamic::legacy::BoxedActionBits::try_from(*self)?; + let action_type = action_type.into(); + Ok(boxed_action_bits.has_action(&action_type).expect("BooleanActionType only has one bit")) + } + + /// Attempts to set the given action bit to the given boolean value. + /// This operation may fail if the requested action bit may not be + /// set for the kind of containing advertisement (public/encrypted) + /// that this action DE is intended to belong to. In this case, + /// the original action bits will be yielded back to the caller, + /// unaltered. + pub fn set_action( + self, + action_type: BooleanActionType, + value: bool, + ) -> Result<SetV0ActionResult, InvalidStackDataStructure> { + let mut boxed_action_bits = np_adv_dynamic::legacy::BoxedActionBits::try_from(self)?; + let boxed_action_element = action_type.as_boxed_action_element(value); + match boxed_action_bits.set_action(boxed_action_element) { + Ok(()) => Ok(SetV0ActionResult::Success(boxed_action_bits.into())), + Err(_) => Ok(SetV0ActionResult::Error(self)), + } + } + + /// Sets the context sequence number for this data element. + #[allow(clippy::expect_used)] + pub fn set_context_sync_seq_num( + self, + value: ContextSyncSeqNum, + ) -> Result<Self, InvalidStackDataStructure> { + let mut boxed_action_bits = np_adv_dynamic::legacy::BoxedActionBits::try_from(self)?; + let boxed_action_element = np_adv_dynamic::legacy::ToBoxedActionElement::try_from(value)?; + boxed_action_bits + .set_action(boxed_action_element) + .expect("Context sync sequence number always may be present"); + Ok(boxed_action_bits.into()) + } + + /// Return the context sequence number from this data element + #[allow(clippy::expect_used)] + pub fn get_context_sync_seq_num(&self) -> Result<ContextSyncSeqNum, InvalidStackDataStructure> { + let boxed_action_bits = np_adv_dynamic::legacy::BoxedActionBits::try_from(*self)?; + Ok(boxed_action_bits.get_context_sync_seq_num().into()) + } +}
diff --git a/nearby/presence/np_ffi_core/src/v1.rs b/nearby/presence/np_ffi_core/src/v1.rs new file mode 100644 index 0000000..c7b564d --- /dev/null +++ b/nearby/presence/np_ffi_core/src/v1.rs
@@ -0,0 +1,38 @@ +// 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-acessible V1 constructs for both of the +//! serialization+deserialization flows. + +/// Information about the verification scheme used +/// for verifying the integrity of the contents +/// of a decrypted section. +#[derive(Clone, Copy)] +#[repr(u8)] +pub enum V1VerificationMode { + /// Message integrity code verification. + Mic = 0, + /// Signature verification. + Signature = 1, +} + +impl From<np_adv::extended::deserialize::VerificationMode> for V1VerificationMode { + fn from(verification_mode: np_adv::extended::deserialize::VerificationMode) -> Self { + use np_adv::extended::deserialize::VerificationMode; + match verification_mode { + VerificationMode::Mic => Self::Mic, + VerificationMode::Signature => Self::Signature, + } + } +}
diff --git a/nearby/presence/xts_aes/fuzz/Cargo.lock b/nearby/presence/xts_aes/fuzz/Cargo.lock index 1844bd3..52831cd 100644 --- a/nearby/presence/xts_aes/fuzz/Cargo.lock +++ b/nearby/presence/xts_aes/fuzz/Cargo.lock
@@ -55,9 +55,9 @@ [[package]] name = "arbitrary" -version = "1.3.0" +version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2d098ff73c1ca148721f37baad5ea6a465a13f9573aba8641fbbbae8164a54e" +checksum = "7d5a26814d8dcb93b0e5a0ff3c6d80a8843bafb21b39e8e18a6f05471870e110" dependencies = [ "derive_arbitrary", ] @@ -92,9 +92,9 @@ [[package]] name = "bytes" -version = "1.4.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89b2fd2a0dcf38d7971e2194b6b6eebab45ae01067456a7fd93d5547a61b70be" +checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223" [[package]] name = "cbc" @@ -107,11 +107,12 @@ [[package]] name = "cc" -version = "1.0.79" +version = "1.0.83" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50d30906286121d95be3d479533b458f87493b30a4b5f79a607db8f5d11aa91f" +checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" dependencies = [ "jobserver", + "libc", ] [[package]] @@ -132,24 +133,24 @@ [[package]] name = "const-oid" -version = "0.9.4" +version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "795bc6e66a8e340f075fcf6227e417a2dc976b92b91f3cdc778bb858778b6747" +checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" [[package]] name = "cpufeatures" -version = "0.2.9" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a17b76ff3a4162b0b27f354a0c87015ddad39d35f9c0c36607a3bdd175dde1f1" +checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" dependencies = [ "libc", ] [[package]] name = "crypto-bigint" -version = "0.5.2" +version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf4c2f4e1afd912bc40bfd6fed5d9dc1f288e0ba01bfcc835cc5bc3eb13efe15" +checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" dependencies = [ "generic-array", "rand_core", @@ -211,9 +212,9 @@ [[package]] name = "curve25519-dalek" -version = "4.0.0" +version = "4.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f711ade317dd348950a9910f81c5947e3d8907ebd2b83f76203ff1807e6a2bc2" +checksum = "0a677b8922c94e01bdbb12126b0bc852f00447528dee1782229af9c720c3f348" dependencies = [ "cfg-if", "cpufeatures", @@ -227,9 +228,9 @@ [[package]] name = "curve25519-dalek-derive" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83fdaf97f4804dcebfa5862639bc9ce4121e82140bec2a987ac5140294865b5b" +checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" dependencies = [ "proc-macro2", "quote", @@ -238,9 +239,9 @@ [[package]] name = "der" -version = "0.7.7" +version = "0.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c7ed52955ce76b1554f509074bb357d3fb8ac9b51288a65a3fd480d1dfba946" +checksum = "fffa369a668c8af7dbf8b5e56c9f744fbd399949ed171606040001947de40b1c" dependencies = [ "const-oid", "zeroize", @@ -248,9 +249,9 @@ [[package]] name = "derive_arbitrary" -version = "1.3.1" +version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53e0efad4403bfc52dc201159c4b842a246a14b98c64b55dfd0f2d89729dfeb8" +checksum = "67e77553c4162a157adbf834ebae5b415acbecbeafc7a74b0e886657506a7611" dependencies = [ "proc-macro2", "quote", @@ -270,30 +271,31 @@ [[package]] name = "ed25519" -version = "2.2.1" +version = "2.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fb04eee5d9d907f29e80ee6b0e78f7e2c82342c63e3580d8c4f69d9d5aad963" +checksum = "115531babc129696a58c64a4fef0a8bf9e9698629fb97e9e40767d235cfbcd53" dependencies = [ "signature", ] [[package]] name = "ed25519-dalek" -version = "2.0.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7277392b266383ef8396db7fdeb1e77b6c52fed775f5df15bb24f35b72156980" +checksum = "4a3daa8e81a3963a60642bcc1f90a670680bd4a77535faa384e9d1c79d620871" dependencies = [ "curve25519-dalek", "ed25519", "rand_core", "sha2", + "subtle", ] [[package]] name = "elliptic-curve" -version = "0.13.5" +version = "0.13.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "968405c8fdc9b3bf4df0a6638858cc0b52462836ab6b1c87377785dd09cf1c0b" +checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" dependencies = [ "base16ct", "crypto-bigint", @@ -320,9 +322,9 @@ [[package]] name = "fiat-crypto" -version = "0.1.20" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e825f6987101665dea6ec934c09ec6d721de7bc1bf92248e1d5810c8cd636b77" +checksum = "1676f435fc1dadde4d03e43f5d62b259e1ce5f40bd4ffb21db2b42ebe59c1382" [[package]] name = "generic-array" @@ -337,9 +339,9 @@ [[package]] name = "getrandom" -version = "0.2.10" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be4136b2a15dd319360be1c07d9933517ccf0be8f16bf62a3bee4f0d618df427" +checksum = "190092ea657667030ac6a35e305e62fc4dd69fd98ac98631e5d3a2b1575a12b5" dependencies = [ "cfg-if", "libc", @@ -369,9 +371,9 @@ [[package]] name = "hkdf" -version = "0.12.3" +version = "0.12.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "791a029f6b9fc27657f6f188ec6e5e43f6911f6f878e0dc5501396e09809d437" +checksum = "7b5f8eb2ad728638ea2c7d47a21db23b7b58a72ed6a38256b8a1849f15fbbdf7" dependencies = [ "hmac", ] @@ -397,9 +399,9 @@ [[package]] name = "jobserver" -version = "0.1.26" +version = "0.1.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "936cfd212a0155903bcbc060e316fb6cc7cbf2e1907329391ebadc1fe0ce77c2" +checksum = "8c37f63953c4c63420ed5fd3d6d398c719489b9f872b9fa683262f8edd363c7d" dependencies = [ "libc", ] @@ -413,15 +415,15 @@ [[package]] name = "libc" -version = "0.2.147" +version = "0.2.153" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3" +checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" [[package]] name = "libfuzzer-sys" -version = "0.4.6" +version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "beb09950ae85a0a94b27676cccf37da5ff13f27076aa1adbc6545dd0d0e1bd4e" +checksum = "a96cfd5557eb82f2b83fed4955246c988d331975a002961b07c81584d107e7f7" dependencies = [ "arbitrary", "cc", @@ -430,9 +432,9 @@ [[package]] name = "once_cell" -version = "1.18.0" +version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" +checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" [[package]] name = "opaque-debug" @@ -452,9 +454,9 @@ [[package]] name = "platforms" -version = "3.0.2" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3d7ddaed09e0eb771a79ab0fd64609ba0afb0a8366421957936ad14cbd13630" +checksum = "626dec3cac7cc0e1577a2ec3fc496277ec2baa084bebad95bb6fdbfae235f84c" [[package]] name = "polyval" @@ -476,27 +478,27 @@ [[package]] name = "primeorder" -version = "0.13.2" +version = "0.13.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c2fcef82c0ec6eefcc179b978446c399b3cdf73c392c35604e399eee6df1ee3" +checksum = "353e1ca18966c16d9deb1c69278edbc5f194139612772bd9537af60ac231e1e6" dependencies = [ "elliptic-curve", ] [[package]] name = "proc-macro2" -version = "1.0.66" +version = "1.0.78" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18fb31db3f9bddb2ea821cde30a9f70117e3f119938b5ee630b7403aa6e2ead9" +checksum = "e2422ad645d89c99f8f3e6b88a9fdeca7fabeac836b1002371c4367c8f984aae" dependencies = [ "unicode-ident", ] [[package]] name = "quote" -version = "1.0.31" +version = "1.0.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fe8a65d69dd0808184ebb5f836ab526bb259db23c657efa38711b1072ee47f0" +checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef" dependencies = [ "proc-macro2", ] @@ -553,15 +555,15 @@ [[package]] name = "semver" -version = "1.0.18" +version = "1.0.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0293b4b29daaf487284529cc2f5675b8e57c61f70167ba415a463651fd6a918" +checksum = "b97ed7a9823b74f99c7742f5336af7be5ecd3eeafcb1507d1fa93347b1d589b0" [[package]] name = "sha2" -version = "0.10.7" +version = "0.10.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "479fb9d862239e610720565ca91403019f2f00410f1864c5aa7479b950a76ed8" +checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" dependencies = [ "cfg-if", "cpufeatures", @@ -570,9 +572,9 @@ [[package]] name = "signature" -version = "2.1.0" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e1788eed21689f9cf370582dfc467ef36ed9c707f073528ddafa8d83e3b8500" +checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" [[package]] name = "subtle" @@ -582,9 +584,9 @@ [[package]] name = "syn" -version = "2.0.26" +version = "2.0.48" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45c3457aacde3c65315de5031ec191ce46604304d2446e803d71ade03308d970" +checksum = "0f3531638e407dfc0814761abb7c00a5b54992b849452a0646b7f65c9f770f3f" dependencies = [ "proc-macro2", "quote", @@ -599,15 +601,15 @@ [[package]] name = "typenum" -version = "1.16.0" +version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba" +checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" [[package]] name = "unicode-ident" -version = "1.0.11" +version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "301abaae475aa91687eb82514b328ab47a211a533026cb25fc3e519b86adfc3c" +checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" [[package]] name = "universal-hash" @@ -633,9 +635,9 @@ [[package]] name = "x25519-dalek" -version = "2.0.0" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb66477291e7e8d2b0ff1bcb900bf29489a9692816d79874bea351e7a8b6de96" +checksum = "c7e468321c81fb07fa7f4c636c3972b9100f0346e5b6a9f2bd0603a52f7ed277" dependencies = [ "curve25519-dalek", "rand_core", @@ -664,6 +666,6 @@ [[package]] name = "zeroize" -version = "1.6.0" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a0956f1ba7c7909bfb66c2e9e4124ab6f6482560f6628b5aaeba39207c9aad9" +checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d"
diff --git a/nearby/rustfmt.toml b/nearby/rustfmt.toml index 10c1698..d45a5bf 100644 --- a/nearby/rustfmt.toml +++ b/nearby/rustfmt.toml
@@ -1,3 +1,3 @@ edition = "2021" newline_style = "Unix" -use_small_heuristics = "Max" +use_small_heuristics = "Max" \ No newline at end of file
diff --git a/nearby/scripts/openssl-patches/0001-Apply-android-patches.patch b/nearby/scripts/openssl-patches/0001-Apply-android-patches.patch deleted file mode 100644 index 0ee52b1..0000000 --- a/nearby/scripts/openssl-patches/0001-Apply-android-patches.patch +++ /dev/null
@@ -1,1017 +0,0 @@ -From 5c9103f02cb56f0f04444b16dd67eeaa05429d47 Mon Sep 17 00:00:00 2001 -From: Nabil Wadih <nwadih@google.com> -Date: Thu, 24 Aug 2023 15:51:26 -0700 -Subject: [PATCH] Apply android patches - ---- - openssl/.cargo/config.toml | 2 + - openssl/src/asn1.rs | 2 +- - openssl/src/bio.rs | 6 +- - openssl/src/bn.rs | 2 +- - openssl/src/cipher.rs | 4 + - openssl/src/dh.rs | 2 +- - openssl/src/dsa.rs | 5 +- - openssl/src/ec.rs | 20 ++++ - openssl/src/ecdsa.rs | 2 +- - openssl/src/encrypt.rs | 4 +- - openssl/src/hash.rs | 2 +- - openssl/src/hkdf.rs | 89 +++++++++++++++ - openssl/src/hmac.rs | 217 +++++++++++++++++++++++++++++++++++++ - openssl/src/lib.rs | 12 ++ - openssl/src/md_ctx.rs | 2 +- - openssl/src/pkey.rs | 22 ++-- - openssl/src/pkey_ctx.rs | 21 +++- - openssl/src/rsa.rs | 2 +- - openssl/src/sign.rs | 10 +- - openssl/src/symm.rs | 7 +- - openssl/src/x509/mod.rs | 52 +++++++-- - 21 files changed, 439 insertions(+), 46 deletions(-) - create mode 100644 openssl/.cargo/config.toml - create mode 100644 openssl/src/hkdf.rs - create mode 100644 openssl/src/hmac.rs - -diff --git a/openssl/.cargo/config.toml b/openssl/.cargo/config.toml -new file mode 100644 -index 00000000..e2b197d8 ---- /dev/null -+++ b/openssl/.cargo/config.toml -@@ -0,0 +1,2 @@ -+[patch.crates-io] -+bssl-ffi = { package = "bssl-sys", version = "0.1.0", path = "../../../boringssl/build/rust", optional=true } -diff --git a/openssl/src/asn1.rs b/openssl/src/asn1.rs -index b02f9ac4..939a1732 100644 ---- a/openssl/src/asn1.rs -+++ b/openssl/src/asn1.rs -@@ -651,7 +651,7 @@ impl fmt::Debug for Asn1ObjectRef { - } - - cfg_if! { -- if #[cfg(any(ossl110, libressl273))] { -+ if #[cfg(any(ossl110, libressl273, boringssl))] { - use ffi::ASN1_STRING_get0_data; - } else { - #[allow(bad_style)] -diff --git a/openssl/src/bio.rs b/openssl/src/bio.rs -index 6a72552a..03242188 100644 ---- a/openssl/src/bio.rs -+++ b/openssl/src/bio.rs -@@ -4,7 +4,7 @@ use std::marker::PhantomData; - use std::ptr; - use std::slice; - --use crate::cvt_p; -+use crate::{cvt_p, SignedLenType}; - use crate::error::ErrorStack; - - pub struct MemBioSlice<'a>(*mut ffi::BIO, PhantomData<&'a [u8]>); -@@ -25,7 +25,7 @@ impl<'a> MemBioSlice<'a> { - let bio = unsafe { - cvt_p(BIO_new_mem_buf( - buf.as_ptr() as *const _, -- buf.len() as c_int, -+ buf.len() as SignedLenType, - ))? - }; - -@@ -78,7 +78,7 @@ cfg_if! { - use ffi::BIO_new_mem_buf; - } else { - #[allow(bad_style)] -- unsafe fn BIO_new_mem_buf(buf: *const ::libc::c_void, len: ::libc::c_int) -> *mut ffi::BIO { -+ unsafe fn BIO_new_mem_buf(buf: *const ::libc::c_void, len: SignedLenType) -> *mut ffi::BIO { - ffi::BIO_new_mem_buf(buf as *mut _, len) - } - } -diff --git a/openssl/src/bn.rs b/openssl/src/bn.rs -index 1cd00dd4..dbd7ae94 100644 ---- a/openssl/src/bn.rs -+++ b/openssl/src/bn.rs -@@ -814,7 +814,7 @@ impl BigNumRef { - /// assert_eq!(&bn_vec, &[0, 0, 0x45, 0x43]); - /// ``` - #[corresponds(BN_bn2binpad)] -- #[cfg(ossl110)] -+ #[cfg(any(boringssl, ossl110))] - pub fn to_vec_padded(&self, pad_to: i32) -> Result<Vec<u8>, ErrorStack> { - let mut v = Vec::with_capacity(pad_to as usize); - unsafe { -diff --git a/openssl/src/cipher.rs b/openssl/src/cipher.rs -index ab5f49d2..84a82654 100644 ---- a/openssl/src/cipher.rs -+++ b/openssl/src/cipher.rs -@@ -208,6 +208,7 @@ impl Cipher { - unsafe { CipherRef::from_ptr(ffi::EVP_aes_192_cfb1() as *mut _) } - } - -+ #[cfg(not(boringssl))] - pub fn aes_192_cfb128() -> &'static CipherRef { - unsafe { CipherRef::from_ptr(ffi::EVP_aes_192_cfb128() as *mut _) } - } -@@ -253,6 +254,7 @@ impl Cipher { - unsafe { CipherRef::from_ptr(ffi::EVP_aes_256_cfb1() as *mut _) } - } - -+ #[cfg(not(boringssl))] - pub fn aes_256_cfb128() -> &'static CipherRef { - unsafe { CipherRef::from_ptr(ffi::EVP_aes_256_cfb128() as *mut _) } - } -@@ -282,11 +284,13 @@ impl Cipher { - } - - #[cfg(not(osslconf = "OPENSSL_NO_BF"))] -+ #[cfg(not(boringssl))] - pub fn bf_cbc() -> &'static CipherRef { - unsafe { CipherRef::from_ptr(ffi::EVP_bf_cbc() as *mut _) } - } - - #[cfg(not(osslconf = "OPENSSL_NO_BF"))] -+ #[cfg(not(boringssl))] - pub fn bf_ecb() -> &'static CipherRef { - unsafe { CipherRef::from_ptr(ffi::EVP_bf_ecb() as *mut _) } - } -diff --git a/openssl/src/dh.rs b/openssl/src/dh.rs -index 12170b99..e781543e 100644 ---- a/openssl/src/dh.rs -+++ b/openssl/src/dh.rs -@@ -239,7 +239,7 @@ where - } - - cfg_if! { -- if #[cfg(any(ossl110, libressl270))] { -+ if #[cfg(any(ossl110, libressl270, boringssl))] { - use ffi::{DH_set0_pqg, DH_get0_pqg, DH_get0_key, DH_set0_key}; - } else { - #[allow(bad_style)] -diff --git a/openssl/src/dsa.rs b/openssl/src/dsa.rs -index 5f59ba8a..0aceeb55 100644 ---- a/openssl/src/dsa.rs -+++ b/openssl/src/dsa.rs -@@ -7,6 +7,7 @@ - - use cfg_if::cfg_if; - use foreign_types::{ForeignType, ForeignTypeRef}; -+#[cfg(not(boringssl))] - use libc::c_int; - use std::fmt; - use std::mem; -@@ -283,7 +284,7 @@ impl<T> fmt::Debug for Dsa<T> { - } - - cfg_if! { -- if #[cfg(any(ossl110, libressl273))] { -+ if #[cfg(any(ossl110, libressl273, boringssl))] { - use ffi::{DSA_get0_key, DSA_get0_pqg, DSA_set0_key, DSA_set0_pqg}; - } else { - #[allow(bad_style)] -@@ -462,7 +463,7 @@ impl DsaSigRef { - } - - cfg_if! { -- if #[cfg(any(ossl110, libressl273))] { -+ if #[cfg(any(ossl110, libressl273, boringssl))] { - use ffi::{DSA_SIG_set0, DSA_SIG_get0}; - } else { - #[allow(bad_style)] -diff --git a/openssl/src/ec.rs b/openssl/src/ec.rs -index 24b38322..20785428 100644 ---- a/openssl/src/ec.rs -+++ b/openssl/src/ec.rs -@@ -954,6 +954,26 @@ impl EcKey<Private> { - EcKey<Private>, - ffi::d2i_ECPrivateKey - } -+ -+ /// Decodes a DER-encoded elliptic curve private key structure for the specified curve. -+ #[corresponds(EC_KEY_parse_private_key)] -+ #[cfg(boringssl)] -+ pub fn private_key_from_der_for_group( -+ der: &[u8], -+ group: &EcGroupRef, -+ ) -> Result<EcKey<Private>, ErrorStack> { -+ unsafe { -+ let mut cbs = ffi::CBS { -+ data: der.as_ptr(), -+ len: der.len(), -+ }; -+ cvt_p(ffi::EC_KEY_parse_private_key( -+ &mut cbs as *mut ffi::CBS, -+ group.as_ptr(), -+ )) -+ .map(|p| EcKey::from_ptr(p)) -+ } -+ } - } - - impl<T> Clone for EcKey<T> { -diff --git a/openssl/src/ecdsa.rs b/openssl/src/ecdsa.rs -index 0a960e7b..f3b27b39 100644 ---- a/openssl/src/ecdsa.rs -+++ b/openssl/src/ecdsa.rs -@@ -110,7 +110,7 @@ impl EcdsaSigRef { - } - - cfg_if! { -- if #[cfg(any(ossl110, libressl273))] { -+ if #[cfg(any(ossl110, libressl273, boringssl))] { - use ffi::{ECDSA_SIG_set0, ECDSA_SIG_get0}; - } else { - #[allow(bad_style)] -diff --git a/openssl/src/encrypt.rs b/openssl/src/encrypt.rs -index 3cb10fcc..34a9eb8b 100644 ---- a/openssl/src/encrypt.rs -+++ b/openssl/src/encrypt.rs -@@ -148,7 +148,7 @@ impl<'a> Encrypter<'a> { - /// This corresponds to [`EVP_PKEY_CTX_set_rsa_oaep_md`]. - /// - /// [`EVP_PKEY_CTX_set_rsa_oaep_md`]: https://www.openssl.org/docs/manmaster/man3/EVP_PKEY_CTX_set_rsa_oaep_md.html -- #[cfg(any(ossl102, libressl310))] -+ #[cfg(any(ossl102, libressl310, boringssl))] - pub fn set_rsa_oaep_md(&mut self, md: MessageDigest) -> Result<(), ErrorStack> { - unsafe { - cvt(ffi::EVP_PKEY_CTX_set_rsa_oaep_md( -@@ -352,7 +352,7 @@ impl<'a> Decrypter<'a> { - /// This corresponds to [`EVP_PKEY_CTX_set_rsa_oaep_md`]. - /// - /// [`EVP_PKEY_CTX_set_rsa_oaep_md`]: https://www.openssl.org/docs/manmaster/man3/EVP_PKEY_CTX_set_rsa_oaep_md.html -- #[cfg(any(ossl102, libressl310))] -+ #[cfg(any(ossl102, libressl310, boringssl))] - pub fn set_rsa_oaep_md(&mut self, md: MessageDigest) -> Result<(), ErrorStack> { - unsafe { - cvt(ffi::EVP_PKEY_CTX_set_rsa_oaep_md( -diff --git a/openssl/src/hash.rs b/openssl/src/hash.rs -index 8e27505a..7f6fa89e 100644 ---- a/openssl/src/hash.rs -+++ b/openssl/src/hash.rs -@@ -43,7 +43,7 @@ use crate::nid::Nid; - use crate::{cvt, cvt_p}; - - cfg_if! { -- if #[cfg(ossl110)] { -+ if #[cfg(any(ossl110, boringssl))] { - use ffi::{EVP_MD_CTX_free, EVP_MD_CTX_new}; - } else { - use ffi::{EVP_MD_CTX_create as EVP_MD_CTX_new, EVP_MD_CTX_destroy as EVP_MD_CTX_free}; -diff --git a/openssl/src/hkdf.rs b/openssl/src/hkdf.rs -new file mode 100644 -index 00000000..cc7e5b3a ---- /dev/null -+++ b/openssl/src/hkdf.rs -@@ -0,0 +1,89 @@ -+use crate::cvt; -+use crate::error::ErrorStack; -+use crate::md::MdRef; -+use foreign_types::ForeignTypeRef; -+use openssl_macros::corresponds; -+ -+/// Computes HKDF (as specified by RFC 5869). -+/// -+/// HKDF is an Extract-and-Expand algorithm. It does not do any key stretching, -+/// and as such, is not suited to be used alone to generate a key from a -+/// password. -+#[corresponds(HKDF)] -+#[inline] -+pub fn hkdf( -+ out_key: &mut [u8], -+ md: &MdRef, -+ secret: &[u8], -+ salt: &[u8], -+ info: &[u8], -+) -> Result<(), ErrorStack> { -+ unsafe { -+ cvt(ffi::HKDF( -+ out_key.as_mut_ptr(), -+ out_key.len(), -+ md.as_ptr(), -+ secret.as_ptr(), -+ secret.len(), -+ salt.as_ptr(), -+ salt.len(), -+ info.as_ptr(), -+ info.len(), -+ ))?; -+ } -+ -+ Ok(()) -+} -+ -+/// Computes a HKDF PRK (as specified by RFC 5869). -+/// -+/// WARNING: This function orders the inputs differently from RFC 5869 -+/// specification. Double-check which parameter is the secret/IKM and which is -+/// the salt when using. -+#[corresponds(HKDF_extract)] -+#[inline] -+pub fn hkdf_extract<'a>( -+ out_key: &'a mut [u8], -+ md: &MdRef, -+ secret: &[u8], -+ salt: &[u8], -+) -> Result<&'a [u8], ErrorStack> { -+ let mut out_len = out_key.len(); -+ unsafe { -+ cvt(ffi::HKDF_extract( -+ out_key.as_mut_ptr(), -+ &mut out_len, -+ md.as_ptr(), -+ secret.as_ptr(), -+ secret.len(), -+ salt.as_ptr(), -+ salt.len(), -+ ))?; -+ } -+ -+ Ok(&out_key[..out_len]) -+} -+ -+/// Computes a HKDF OKM (as specified by RFC 5869). -+#[corresponds(HKDF_expand)] -+#[inline] -+pub fn hkdf_expand( -+ out_key: &mut [u8], -+ md: &MdRef, -+ prk: &[u8], -+ info: &[u8], -+) -> Result<(), ErrorStack> { -+ unsafe { -+ cvt(ffi::HKDF_expand( -+ out_key.as_mut_ptr(), -+ out_key.len(), -+ md.as_ptr(), -+ prk.as_ptr(), -+ prk.len(), -+ info.as_ptr(), -+ info.len(), -+ ))?; -+ } -+ -+ Ok(()) -+} -diff --git a/openssl/src/hmac.rs b/openssl/src/hmac.rs -new file mode 100644 -index 00000000..465781e2 ---- /dev/null -+++ b/openssl/src/hmac.rs -@@ -0,0 +1,217 @@ -+use crate::error::ErrorStack; -+use crate::md::MdRef; -+use crate::{cvt, cvt_p}; -+use ffi::HMAC_CTX; -+use foreign_types::ForeignTypeRef; -+use libc::{c_uint, c_void}; -+use openssl_macros::corresponds; -+use std::convert::TryFrom; -+use std::ptr; -+ -+/// Computes the HMAC as a one-shot operation. -+/// -+/// Calculates the HMAC of data, using the given |key| -+/// and hash function |md|, and returns the result re-using the space from -+/// buffer |out|. On entry, |out| must contain at least |EVP_MD_size| bytes -+/// of space. The actual length of the result is used to resize the returned -+/// slice. An output size of |EVP_MAX_MD_SIZE| will always be large enough. -+/// It returns a resized |out| or ErrorStack on error. -+#[corresponds(HMAC)] -+#[inline] -+pub fn hmac<'a>( -+ md: &MdRef, -+ key: &[u8], -+ data: &[u8], -+ out: &'a mut [u8], -+) -> Result<&'a [u8], ErrorStack> { -+ assert!(out.len() >= md.size()); -+ let mut out_len = c_uint::try_from(out.len()).unwrap(); -+ unsafe { -+ cvt_p(ffi::HMAC( -+ md.as_ptr(), -+ key.as_ptr() as *const c_void, -+ key.len(), -+ data.as_ptr(), -+ data.len(), -+ out.as_mut_ptr(), -+ &mut out_len, -+ ))?; -+ } -+ Ok(&out[..out_len as usize]) -+} -+ -+/// A context object used to perform HMAC operations. -+/// -+/// HMAC is a MAC (message authentication code), i.e. a keyed hash function used for message -+/// authentication, which is based on a hash function. -+/// -+/// Note: Only available in boringssl. For openssl, use `PKey::hmac` instead. -+#[cfg(boringssl)] -+pub struct HmacCtx { -+ ctx: *mut HMAC_CTX, -+ output_size: usize, -+} -+ -+#[cfg(boringssl)] -+impl HmacCtx { -+ /// Creates a new [HmacCtx] to use the hash function `md` and key `key`. -+ #[corresponds(HMAC_Init_ex)] -+ pub fn new(key: &[u8], md: &MdRef) -> Result<Self, ErrorStack> { -+ unsafe { -+ // Safety: If an error occurred, the resulting null from HMAC_CTX_new is converted into -+ // ErrorStack in the returned result by `cvt_p`. -+ let ctx = cvt_p(ffi::HMAC_CTX_new())?; -+ // Safety: -+ // - HMAC_Init_ex must be called with a context previously created with HMAC_CTX_new, -+ // which is the line above. -+ // - HMAC_Init_ex may return an error if key is null but the md is different from -+ // before. This is avoided here since key is guaranteed to be non-null. -+ cvt(ffi::HMAC_Init_ex( -+ ctx, -+ key.as_ptr() as *const c_void, -+ key.len(), -+ md.as_ptr(), -+ ptr::null_mut(), -+ ))?; -+ Ok(Self { -+ ctx, -+ output_size: md.size(), -+ }) -+ } -+ } -+ -+ /// `update` can be called repeatedly with chunks of the message `data` to be authenticated. -+ #[corresponds(HMAC_Update)] -+ pub fn update(&mut self, data: &[u8]) -> Result<(), ErrorStack> { -+ unsafe { -+ // Safety: HMAC_Update returns 0 on error, and that is converted into ErrorStack in the -+ // returned result by `cvt`. -+ cvt(ffi::HMAC_Update(self.ctx, data.as_ptr(), data.len())).map(|_| ()) -+ } -+ } -+ -+ /// Finishes the HMAC process, and places the message authentication code in `output`. -+ /// The number of bytes written to `output` is returned. -+ /// -+ /// # Panics -+ /// -+ /// Panics if the `output` is smaller than the required size. The output size is indicated by -+ /// `md.size()` for the `Md` instance passed in [new]. An output size of |EVP_MAX_MD_SIZE| will -+ /// always be large enough. -+ #[corresponds(HMAC_Final)] -+ pub fn finalize(&mut self, output: &mut [u8]) -> Result<usize, ErrorStack> { -+ assert!(output.len() >= self.output_size); -+ unsafe { -+ // Safety: The length assertion above makes sure that `HMAC_Final` will not write longer -+ // than the length of `output`. -+ let mut size: c_uint = 0; -+ cvt(ffi::HMAC_Final( -+ self.ctx, -+ output.as_mut_ptr(), -+ &mut size as *mut c_uint, -+ )) -+ .map(|_| size as usize) -+ } -+ } -+} -+ -+impl Drop for HmacCtx { -+ #[corresponds(HMAC_CTX_free)] -+ fn drop(&mut self) { -+ unsafe { -+ ffi::HMAC_CTX_free(self.ctx); -+ } -+ } -+} -+ -+#[cfg(test)] -+mod tests { -+ use super::*; -+ use crate::md::Md; -+ -+ const SHA_256_DIGEST_SIZE: usize = 32; -+ -+ #[test] -+ fn hmac_sha256_test() { -+ let expected_hmac = [ -+ 0xb0, 0x34, 0x4c, 0x61, 0xd8, 0xdb, 0x38, 0x53, 0x5c, 0xa8, 0xaf, 0xce, 0xaf, 0xb, -+ 0xf1, 0x2b, 0x88, 0x1d, 0xc2, 0x0, 0xc9, 0x83, 0x3d, 0xa7, 0x26, 0xe9, 0x37, 0x6c, -+ 0x2e, 0x32, 0xcf, 0xf7, -+ ]; -+ let mut out: [u8; SHA_256_DIGEST_SIZE] = [0; SHA_256_DIGEST_SIZE]; -+ let key: [u8; 20] = [0x0b; 20]; -+ let data = b"Hi There"; -+ let hmac_result = -+ hmac(Md::sha256(), &key, data, &mut out).expect("Couldn't calculate sha256 hmac"); -+ assert_eq!(&hmac_result, &expected_hmac); -+ } -+ -+ #[test] -+ #[should_panic] -+ fn hmac_sha256_output_too_short() { -+ let mut out = vec![0_u8; 1]; -+ let key: [u8; 20] = [0x0b; 20]; -+ let data = b"Hi There"; -+ hmac(Md::sha256(), &key, data, &mut out).expect("Couldn't calculate sha256 hmac"); -+ } -+ -+ #[test] -+ fn hmac_sha256_test_big_buffer() { -+ let expected_hmac = [ -+ 0xb0, 0x34, 0x4c, 0x61, 0xd8, 0xdb, 0x38, 0x53, 0x5c, 0xa8, 0xaf, 0xce, 0xaf, 0xb, -+ 0xf1, 0x2b, 0x88, 0x1d, 0xc2, 0x0, 0xc9, 0x83, 0x3d, 0xa7, 0x26, 0xe9, 0x37, 0x6c, -+ 0x2e, 0x32, 0xcf, 0xf7, -+ ]; -+ let mut out: [u8; 100] = [0; 100]; -+ let key: [u8; 20] = [0x0b; 20]; -+ let data = b"Hi There"; -+ let hmac_result = -+ hmac(Md::sha256(), &key, data, &mut out).expect("Couldn't calculate sha256 hmac"); -+ assert_eq!(hmac_result.len(), SHA_256_DIGEST_SIZE); -+ assert_eq!(&hmac_result, &expected_hmac); -+ } -+ -+ #[test] -+ fn hmac_sha256_update_test() { -+ let expected_hmac = [ -+ 0xb0, 0x34, 0x4c, 0x61, 0xd8, 0xdb, 0x38, 0x53, 0x5c, 0xa8, 0xaf, 0xce, 0xaf, 0xb, -+ 0xf1, 0x2b, 0x88, 0x1d, 0xc2, 0x0, 0xc9, 0x83, 0x3d, 0xa7, 0x26, 0xe9, 0x37, 0x6c, -+ 0x2e, 0x32, 0xcf, 0xf7, -+ ]; -+ let mut out: [u8; SHA_256_DIGEST_SIZE] = [0; SHA_256_DIGEST_SIZE]; -+ let key: [u8; 20] = [0x0b; 20]; -+ let data = b"Hi There"; -+ let mut hmac_ctx = HmacCtx::new(&key, Md::sha256()).unwrap(); -+ hmac_ctx.update(data).unwrap(); -+ let size = hmac_ctx.finalize(&mut out).unwrap(); -+ assert_eq!(&out, &expected_hmac); -+ assert_eq!(size, SHA_256_DIGEST_SIZE); -+ } -+ -+ #[test] -+ fn hmac_sha256_update_chunks_test() { -+ let expected_hmac = [ -+ 0xb0, 0x34, 0x4c, 0x61, 0xd8, 0xdb, 0x38, 0x53, 0x5c, 0xa8, 0xaf, 0xce, 0xaf, 0xb, -+ 0xf1, 0x2b, 0x88, 0x1d, 0xc2, 0x0, 0xc9, 0x83, 0x3d, 0xa7, 0x26, 0xe9, 0x37, 0x6c, -+ 0x2e, 0x32, 0xcf, 0xf7, -+ ]; -+ let mut out: [u8; SHA_256_DIGEST_SIZE] = [0; SHA_256_DIGEST_SIZE]; -+ let key: [u8; 20] = [0x0b; 20]; -+ let mut hmac_ctx = HmacCtx::new(&key, Md::sha256()).unwrap(); -+ hmac_ctx.update(b"Hi").unwrap(); -+ hmac_ctx.update(b" There").unwrap(); -+ let size = hmac_ctx.finalize(&mut out).unwrap(); -+ assert_eq!(&out, &expected_hmac); -+ assert_eq!(size, SHA_256_DIGEST_SIZE); -+ } -+ -+ #[test] -+ #[should_panic] -+ fn hmac_sha256_update_output_too_short() { -+ let mut out = vec![0_u8; 1]; -+ let key: [u8; 20] = [0x0b; 20]; -+ let mut hmac_ctx = HmacCtx::new(&key, Md::sha256()).unwrap(); -+ hmac_ctx.update(b"Hi There").unwrap(); -+ hmac_ctx.finalize(&mut out).unwrap(); -+ } -+} -diff --git a/openssl/src/lib.rs b/openssl/src/lib.rs -index 891651ec..e8d07d8a 100644 ---- a/openssl/src/lib.rs -+++ b/openssl/src/lib.rs -@@ -120,6 +120,9 @@ - #![doc(html_root_url = "https://docs.rs/openssl/0.10")] - #![warn(rust_2018_idioms)] - -+#[cfg(all(soong, boringssl))] -+extern crate bssl_ffi as ffi; -+ - #[doc(inline)] - pub use ffi::init; - -@@ -155,6 +158,10 @@ pub mod ex_data; - #[cfg(not(any(libressl, ossl300)))] - pub mod fips; - pub mod hash; -+#[cfg(boringssl)] -+pub mod hkdf; -+#[cfg(boringssl)] -+pub mod hmac; - #[cfg(ossl300)] - pub mod lib_ctx; - pub mod md; -@@ -189,6 +196,11 @@ type LenType = libc::size_t; - #[cfg(not(boringssl))] - type LenType = libc::c_int; - -+#[cfg(boringssl)] -+type SignedLenType = libc::ssize_t; -+#[cfg(not(boringssl))] -+type SignedLenType = libc::c_int; -+ - #[inline] - fn cvt_p<T>(r: *mut T) -> Result<*mut T, ErrorStack> { - if r.is_null() { -diff --git a/openssl/src/md_ctx.rs b/openssl/src/md_ctx.rs -index c4d3f06b..156f3c2f 100644 ---- a/openssl/src/md_ctx.rs -+++ b/openssl/src/md_ctx.rs -@@ -93,7 +93,7 @@ use std::convert::TryFrom; - use std::ptr; - - cfg_if! { -- if #[cfg(ossl110)] { -+ if #[cfg(any(ossl110, boringssl))] { - use ffi::{EVP_MD_CTX_free, EVP_MD_CTX_new}; - } else { - use ffi::{EVP_MD_CTX_create as EVP_MD_CTX_new, EVP_MD_CTX_destroy as EVP_MD_CTX_free}; -diff --git a/openssl/src/pkey.rs b/openssl/src/pkey.rs -index 2039e7e9..21ba7118 100644 ---- a/openssl/src/pkey.rs -+++ b/openssl/src/pkey.rs -@@ -47,7 +47,7 @@ use crate::dh::Dh; - use crate::dsa::Dsa; - use crate::ec::EcKey; - use crate::error::ErrorStack; --#[cfg(ossl110)] -+#[cfg(any(boringssl, ossl110))] - use crate::pkey_ctx::PkeyCtx; - use crate::rsa::Rsa; - use crate::symm::Cipher; -@@ -86,14 +86,14 @@ impl Id { - pub const DH: Id = Id(ffi::EVP_PKEY_DH); - pub const EC: Id = Id(ffi::EVP_PKEY_EC); - -- #[cfg(ossl110)] -+ #[cfg(any(boringssl, ossl110))] - pub const HKDF: Id = Id(ffi::EVP_PKEY_HKDF); - -- #[cfg(ossl111)] -+ #[cfg(any(boringssl, ossl111))] - pub const ED25519: Id = Id(ffi::EVP_PKEY_ED25519); - #[cfg(ossl111)] - pub const ED448: Id = Id(ffi::EVP_PKEY_ED448); -- #[cfg(ossl111)] -+ #[cfg(any(boringssl, ossl111))] - pub const X25519: Id = Id(ffi::EVP_PKEY_X25519); - #[cfg(ossl111)] - pub const X448: Id = Id(ffi::EVP_PKEY_X448); -@@ -252,7 +252,7 @@ where - /// This function only works for algorithms that support raw public keys. - /// Currently this is: [`Id::X25519`], [`Id::ED25519`], [`Id::X448`] or [`Id::ED448`]. - #[corresponds(EVP_PKEY_get_raw_public_key)] -- #[cfg(ossl111)] -+ #[cfg(any(boringssl, ossl111))] - pub fn raw_public_key(&self) -> Result<Vec<u8>, ErrorStack> { - unsafe { - let mut len = 0; -@@ -303,7 +303,7 @@ where - /// This function only works for algorithms that support raw private keys. - /// Currently this is: [`Id::HMAC`], [`Id::X25519`], [`Id::ED25519`], [`Id::X448`] or [`Id::ED448`]. - #[corresponds(EVP_PKEY_get_raw_private_key)] -- #[cfg(ossl111)] -+ #[cfg(any(boringssl, ossl111))] - pub fn raw_private_key(&self) -> Result<Vec<u8>, ErrorStack> { - unsafe { - let mut len = 0; -@@ -484,7 +484,7 @@ impl PKey<Private> { - ctx.keygen() - } - -- #[cfg(ossl111)] -+ #[cfg(any(boringssl, ossl111))] - fn generate_eddsa(id: Id) -> Result<PKey<Private>, ErrorStack> { - let mut ctx = PkeyCtx::new_id(id)?; - ctx.keygen_init()?; -@@ -514,7 +514,7 @@ impl PKey<Private> { - /// assert_eq!(secret.len(), 32); - /// # Ok(()) } - /// ``` -- #[cfg(ossl111)] -+ #[cfg(any(boringssl, ossl111))] - pub fn generate_x25519() -> Result<PKey<Private>, ErrorStack> { - PKey::generate_eddsa(Id::X25519) - } -@@ -568,7 +568,7 @@ impl PKey<Private> { - /// assert_eq!(signature.len(), 64); - /// # Ok(()) } - /// ``` -- #[cfg(ossl111)] -+ #[cfg(any(boringssl, ossl111))] - pub fn generate_ed25519() -> Result<PKey<Private>, ErrorStack> { - PKey::generate_eddsa(Id::ED25519) - } -@@ -718,7 +718,7 @@ impl PKey<Private> { - /// - /// Algorithm types that support raw private keys are HMAC, X25519, ED25519, X448 or ED448 - #[corresponds(EVP_PKEY_new_raw_private_key)] -- #[cfg(ossl111)] -+ #[cfg(any(boringssl, ossl111))] - pub fn private_key_from_raw_bytes( - bytes: &[u8], - key_type: Id, -@@ -759,7 +759,7 @@ impl PKey<Public> { - /// - /// Algorithm types that support raw public keys are X25519, ED25519, X448 or ED448 - #[corresponds(EVP_PKEY_new_raw_public_key)] -- #[cfg(ossl111)] -+ #[cfg(any(boringssl, ossl111))] - pub fn public_key_from_raw_bytes( - bytes: &[u8], - key_type: Id, -diff --git a/openssl/src/pkey_ctx.rs b/openssl/src/pkey_ctx.rs -index f79372fb..3d4203fa 100644 ---- a/openssl/src/pkey_ctx.rs -+++ b/openssl/src/pkey_ctx.rs -@@ -470,7 +470,7 @@ impl<T> PkeyCtxRef<T> { - /// - /// Requires OpenSSL 1.1.0 or newer. - #[corresponds(EVP_PKEY_CTX_set_hkdf_md)] -- #[cfg(ossl110)] -+ #[cfg(any(ossl110, boringssl))] - #[inline] - pub fn set_hkdf_md(&mut self, digest: &MdRef) -> Result<(), ErrorStack> { - unsafe { -@@ -503,10 +503,13 @@ impl<T> PkeyCtxRef<T> { - /// - /// Requires OpenSSL 1.1.0 or newer. - #[corresponds(EVP_PKEY_CTX_set1_hkdf_key)] -- #[cfg(ossl110)] -+ #[cfg(any(ossl110, boringssl))] - #[inline] - pub fn set_hkdf_key(&mut self, key: &[u8]) -> Result<(), ErrorStack> { -+ #[cfg(not(boringssl))] - let len = c_int::try_from(key.len()).unwrap(); -+ #[cfg(boringssl)] -+ let len = key.len(); - - unsafe { - cvt(ffi::EVP_PKEY_CTX_set1_hkdf_key( -@@ -523,10 +526,13 @@ impl<T> PkeyCtxRef<T> { - /// - /// Requires OpenSSL 1.1.0 or newer. - #[corresponds(EVP_PKEY_CTX_set1_hkdf_salt)] -- #[cfg(ossl110)] -+ #[cfg(any(ossl110, boringssl))] - #[inline] - pub fn set_hkdf_salt(&mut self, salt: &[u8]) -> Result<(), ErrorStack> { -+ #[cfg(not(boringssl))] - let len = c_int::try_from(salt.len()).unwrap(); -+ #[cfg(boringssl)] -+ let len = salt.len(); - - unsafe { - cvt(ffi::EVP_PKEY_CTX_set1_hkdf_salt( -@@ -543,10 +549,13 @@ impl<T> PkeyCtxRef<T> { - /// - /// Requires OpenSSL 1.1.0 or newer. - #[corresponds(EVP_PKEY_CTX_add1_hkdf_info)] -- #[cfg(ossl110)] -+ #[cfg(any(ossl110, boringssl))] - #[inline] - pub fn add_hkdf_info(&mut self, info: &[u8]) -> Result<(), ErrorStack> { -+ #[cfg(not(boringssl))] - let len = c_int::try_from(info.len()).unwrap(); -+ #[cfg(boringssl)] -+ let len = info.len(); - - unsafe { - cvt(ffi::EVP_PKEY_CTX_add1_hkdf_info( -@@ -604,7 +613,7 @@ mod test { - #[cfg(not(boringssl))] - use crate::cipher::Cipher; - use crate::ec::{EcGroup, EcKey}; -- #[cfg(any(ossl102, libressl310))] -+ #[cfg(any(ossl102, libressl310, boringssl))] - use crate::md::Md; - use crate::nid::Nid; - use crate::pkey::PKey; -@@ -689,7 +698,7 @@ mod test { - } - - #[test] -- #[cfg(ossl110)] -+ #[cfg(any(ossl110, boringssl))] - fn hkdf() { - let mut ctx = PkeyCtx::new_id(Id::HKDF).unwrap(); - ctx.derive_init().unwrap(); -diff --git a/openssl/src/rsa.rs b/openssl/src/rsa.rs -index 68cf64b0..f155b12d 100644 ---- a/openssl/src/rsa.rs -+++ b/openssl/src/rsa.rs -@@ -581,7 +581,7 @@ impl<T> fmt::Debug for Rsa<T> { - } - - cfg_if! { -- if #[cfg(any(ossl110, libressl273))] { -+ if #[cfg(any(ossl110, libressl273, boringssl))] { - use ffi::{ - RSA_get0_key, RSA_get0_factors, RSA_get0_crt_params, RSA_set0_key, RSA_set0_factors, - RSA_set0_crt_params, -diff --git a/openssl/src/sign.rs b/openssl/src/sign.rs -index b675825e..e5e80608 100644 ---- a/openssl/src/sign.rs -+++ b/openssl/src/sign.rs -@@ -290,7 +290,7 @@ impl<'a> Signer<'a> { - self.len_intern() - } - -- #[cfg(not(ossl111))] -+ #[cfg(not(any(boringssl, ossl111)))] - fn len_intern(&self) -> Result<usize, ErrorStack> { - unsafe { - let mut len = 0; -@@ -303,7 +303,7 @@ impl<'a> Signer<'a> { - } - } - -- #[cfg(ossl111)] -+ #[cfg(any(boringssl, ossl111))] - fn len_intern(&self) -> Result<usize, ErrorStack> { - unsafe { - let mut len = 0; -@@ -360,7 +360,7 @@ impl<'a> Signer<'a> { - /// OpenSSL documentation at [`EVP_DigestSign`]. - /// - /// [`EVP_DigestSign`]: https://www.openssl.org/docs/man1.1.1/man3/EVP_DigestSign.html -- #[cfg(ossl111)] -+ #[cfg(any(boringssl, ossl111))] - pub fn sign_oneshot( - &mut self, - sig_buf: &mut [u8], -@@ -382,7 +382,7 @@ impl<'a> Signer<'a> { - /// Returns the signature. - /// - /// This is a simple convenience wrapper over `len` and `sign_oneshot`. -- #[cfg(ossl111)] -+ #[cfg(any(boringssl, ossl111))] - pub fn sign_oneshot_to_vec(&mut self, data_buf: &[u8]) -> Result<Vec<u8>, ErrorStack> { - let mut sig_buf = vec![0; self.len()?]; - let len = self.sign_oneshot(&mut sig_buf, data_buf)?; -@@ -596,7 +596,7 @@ impl<'a> Verifier<'a> { - /// OpenSSL documentation at [`EVP_DigestVerify`]. - /// - /// [`EVP_DigestVerify`]: https://www.openssl.org/docs/man1.1.1/man3/EVP_DigestVerify.html -- #[cfg(ossl111)] -+ #[cfg(any(boringssl, ossl111))] - pub fn verify_oneshot(&mut self, signature: &[u8], buf: &[u8]) -> Result<bool, ErrorStack> { - unsafe { - let r = ffi::EVP_DigestVerify( -diff --git a/openssl/src/symm.rs b/openssl/src/symm.rs -index c75bbc0c..beff5fc2 100644 ---- a/openssl/src/symm.rs -+++ b/openssl/src/symm.rs -@@ -119,6 +119,7 @@ impl Cipher { - unsafe { Cipher(ffi::EVP_aes_128_cfb1()) } - } - -+ #[cfg(not(boringssl))] - pub fn aes_128_cfb128() -> Cipher { - unsafe { Cipher(ffi::EVP_aes_128_cfb128()) } - } -@@ -164,6 +165,7 @@ impl Cipher { - unsafe { Cipher(ffi::EVP_aes_192_cfb1()) } - } - -+ #[cfg(not(boringssl))] - pub fn aes_192_cfb128() -> Cipher { - unsafe { Cipher(ffi::EVP_aes_192_cfb128()) } - } -@@ -214,6 +216,7 @@ impl Cipher { - unsafe { Cipher(ffi::EVP_aes_256_cfb1()) } - } - -+ #[cfg(not(boringssl))] - pub fn aes_256_cfb128() -> Cipher { - unsafe { Cipher(ffi::EVP_aes_256_cfb128()) } - } -@@ -242,12 +245,12 @@ impl Cipher { - unsafe { Cipher(ffi::EVP_aes_256_ocb()) } - } - -- #[cfg(not(osslconf = "OPENSSL_NO_BF"))] -+ #[cfg(not(any(boringssl, osslconf = "OPENSSL_NO_BF")))] - pub fn bf_cbc() -> Cipher { - unsafe { Cipher(ffi::EVP_bf_cbc()) } - } - -- #[cfg(not(osslconf = "OPENSSL_NO_BF"))] -+ #[cfg(not(any(boringssl, osslconf = "OPENSSL_NO_BF")))] - pub fn bf_ecb() -> Cipher { - unsafe { Cipher(ffi::EVP_bf_ecb()) } - } -diff --git a/openssl/src/x509/mod.rs b/openssl/src/x509/mod.rs -index edd54aa8..a03a8aa6 100644 ---- a/openssl/src/x509/mod.rs -+++ b/openssl/src/x509/mod.rs -@@ -353,6 +353,19 @@ impl X509Builder { - unsafe { cvt(ffi::X509_sign(self.0.as_ptr(), key.as_ptr(), hash.as_ptr())).map(|_| ()) } - } - -+ /// Signs the certificate with a private key but without a digest. -+ /// -+ /// This is the only way to sign with Ed25519 keys as BoringSSL doesn't support the null -+ /// message digest. -+ #[cfg(boringssl)] -+ #[corresponds(X509_sign)] -+ pub fn sign_without_digest<T>(&mut self, key: &PKeyRef<T>) -> Result<(), ErrorStack> -+ where -+ T: HasPrivate, -+ { -+ unsafe { cvt(ffi::X509_sign(self.0.as_ptr(), key.as_ptr(), ptr::null())).map(|_| ()) } -+ } -+ - /// Consumes the builder, returning the certificate. - pub fn build(self) -> X509 { - self.0 -@@ -880,13 +893,13 @@ impl X509NameBuilder { - pub fn append_entry_by_text(&mut self, field: &str, value: &str) -> Result<(), ErrorStack> { - unsafe { - let field = CString::new(field).unwrap(); -- assert!(value.len() <= c_int::max_value() as usize); -+ assert!(value.len() <= isize::max_value() as usize); - cvt(ffi::X509_NAME_add_entry_by_txt( - self.0.as_ptr(), - field.as_ptr() as *mut _, - ffi::MBSTRING_UTF8, - value.as_ptr(), -- value.len() as c_int, -+ value.len() as isize, - -1, - 0, - )) -@@ -907,13 +920,13 @@ impl X509NameBuilder { - ) -> Result<(), ErrorStack> { - unsafe { - let field = CString::new(field).unwrap(); -- assert!(value.len() <= c_int::max_value() as usize); -+ assert!(value.len() <= isize::max_value() as usize); - cvt(ffi::X509_NAME_add_entry_by_txt( - self.0.as_ptr(), - field.as_ptr() as *mut _, - ty.as_raw(), - value.as_ptr(), -- value.len() as c_int, -+ value.len() as isize, - -1, - 0, - )) -@@ -928,13 +941,13 @@ impl X509NameBuilder { - /// [`X509_NAME_add_entry_by_NID`]: https://www.openssl.org/docs/man1.1.0/crypto/X509_NAME_add_entry_by_NID.html - pub fn append_entry_by_nid(&mut self, field: Nid, value: &str) -> Result<(), ErrorStack> { - unsafe { -- assert!(value.len() <= c_int::max_value() as usize); -+ assert!(value.len() <= isize::max_value() as usize); - cvt(ffi::X509_NAME_add_entry_by_NID( - self.0.as_ptr(), - field.as_raw(), - ffi::MBSTRING_UTF8, - value.as_ptr() as *mut _, -- value.len() as c_int, -+ value.len() as isize, - -1, - 0, - )) -@@ -954,13 +967,13 @@ impl X509NameBuilder { - ty: Asn1Type, - ) -> Result<(), ErrorStack> { - unsafe { -- assert!(value.len() <= c_int::max_value() as usize); -+ assert!(value.len() <= isize::max_value() as usize); - cvt(ffi::X509_NAME_add_entry_by_NID( - self.0.as_ptr(), - field.as_raw(), - ty.as_raw(), - value.as_ptr() as *mut _, -- value.len() as c_int, -+ value.len() as isize, - -1, - 0, - )) -@@ -1260,6 +1273,29 @@ impl X509ReqBuilder { - } - } - -+ /// Sign the request using a private key without a digest. -+ /// -+ /// This is the only way to sign with Ed25519 keys as BoringSSL doesn't support the null -+ /// message digest. -+ /// -+ /// This corresponds to [`X509_REQ_sign`]. -+ /// -+ /// [`X509_REQ_sign`]: https://www.openssl.org/docs/man1.1.0/crypto/X509_REQ_sign.html -+ #[cfg(boringssl)] -+ pub fn sign_without_digest<T>(&mut self, key: &PKeyRef<T>) -> Result<(), ErrorStack> -+ where -+ T: HasPrivate, -+ { -+ unsafe { -+ cvt(ffi::X509_REQ_sign( -+ self.0.as_ptr(), -+ key.as_ptr(), -+ ptr::null(), -+ )) -+ .map(|_| ()) -+ } -+ } -+ - /// Returns the `X509Req`. - pub fn build(self) -> X509Req { - self.0 --- -2.42.0.rc2.253.gd59a3bf2b4-goog -
diff --git a/nearby/scripts/openssl-patches/README.md b/nearby/scripts/openssl-patches/README.md deleted file mode 100644 index ab1fcea..0000000 --- a/nearby/scripts/openssl-patches/README.md +++ /dev/null
@@ -1,38 +0,0 @@ -This directory contains patch files for `rust-openssl` for it to build successfully with -`--features=unstable_boringssl`. - -After running `prepare-rust-openssl`, the `rust-openssl` git repo is cloned to -`beto-rust/boringssl-build/rust-openssl/openssl`, and the patches in this directory will be applied. - -If you make further changes, or update the "base commit" in `prepare-rust-openssl`, you can -regenerate the patch files by following these steps: - -1. Run `cargo run -- prepare-rust-openssl` -2. `cd boringssl-build/rust-openssl/` and make the necessary changes -3. Commit the changes -4. `git format-patch BASE_COMMIT`. (Note: `BASE_COMMIT` is set by `prepare-rust-openssl`) -5. The patch files will be generated in the current working directory. Move them here in - `nearby/scripts/openssl-patches`. - -### Regenerate patches based on AOSP changes - -In the "make the necessary changes" part in Step 2 above, follow these steps: - -1. Download the patch files in https://googleplex-android.googlesource.com/platform/external/rust/crates/openssl/+/master/patches -2. `cd` into the openssl directory since the AOSP project starts at that root: - ```sh - $ cd openssl - ``` -3. Reset your branch to `BASE_COMMIT` to ensure the AOSP patches apply cleanly. - ```sh - $ git co BASE_COMMIT - $ git co -b create-patch - ``` -4. Apply the patches from AOSP - ```sh - for i in /path/to/android/external/rust/crates/openssl/patches/*; do patch -p1 < $i; done - ``` -5. Remove unneeded files (like `.orig`). Commit the changes. -6. Patches locally in `scripts/openssl-patches` but not in AOSP are lost in this process. Reapply - the appropriate ones at this point, using `git apply` or `git am`. -7. Continue with `git format-patch` described in step 4 in the previous section.
diff --git a/nearby/src/crypto_ffi.rs b/nearby/src/crypto_ffi.rs index 20d1d5d..42ac5ab 100644 --- a/nearby/src/crypto_ffi.rs +++ b/nearby/src/crypto_ffi.rs
@@ -14,18 +14,13 @@ use anyhow::anyhow; use cmd_runner::{run_cmd_shell, run_cmd_shell_with_color, YellowStderr}; -use owo_colors::OwoColorize as _; use semver::{Version, VersionReq}; -use std::{ - env, fs, - path::{Path, PathBuf}, -}; +use std::{env, fs, path::Path}; use crate::CargoOptions; pub fn boringssl_check_everything(root: &Path, cargo_options: &CargoOptions) -> anyhow::Result<()> { check_boringssl(root, cargo_options)?; - check_openssl(root, cargo_options)?; Ok(()) } @@ -90,83 +85,6 @@ Ok(()) } -pub fn prepare_patched_rust_openssl(root: &Path) -> anyhow::Result<()> { - let mut vendor_dir = - root.parent().ok_or_else(|| anyhow!("project root dir no parent dir"))?.to_path_buf(); - vendor_dir.push("boringssl-build"); - fs::create_dir_all(&vendor_dir)?; - - let repo_dir = clone_repo_if_needed( - &vendor_dir, - "rust-openssl", - "https://github.com/sfackler/rust-openssl.git", - )?; - - run_cmd_shell_with_color::<YellowStderr>( - &repo_dir, - "git checkout 7df56869c5e1e32369091ab106750d644d3aa0c4", - )?; - run_cmd_shell_with_color::<YellowStderr>(&repo_dir, "git branch -f BASE_COMMIT")?; - run_cmd_shell_with_color::<YellowStderr>( - &repo_dir, - format!( - "git am {}/scripts/openssl-patches/*.patch", - root.to_str().ok_or_else(|| anyhow!("root dir is not UTF-8"))? - ), - )?; - - println!("{}", "Preparation complete. The required repositories are downloaded to `beto-rust/boringssl-build`. If -you need to go back to a clean state, you can remove that directory and rerun this script. - -You can now build and test with boringssl using the following command - `cargo --config .cargo/config-boringssl.toml test -p crypto_provider* --features=boringssl,std` -".cyan()); - - Ok(()) -} - -pub fn check_openssl(root: &Path, cargo_options: &CargoOptions) -> anyhow::Result<()> { - log::info!("Checking rust openssl"); - prepare_patched_rust_openssl(root)?; - let locked_arg = if cargo_options.locked { "--locked" } else { "" }; - - // test the openssl crate with the boringssl feature - run_cmd_shell( - root, - format!( - concat!( - "cargo --config .cargo/config-boringssl.toml test {locked_arg} -p crypto_provider_openssl ", - "--features=boringssl -- --color=always" - ), - locked_arg=locked_arg - ), - )?; - - Ok(()) -} - -/// If the repo dir doesn't exist, or errors when running `git fetch -a`, re-clone it. -/// -/// Returns the repo dir -fn clone_repo_if_needed( - dir: &Path, - repo_subdir_name: &str, - repo_url: &str, -) -> anyhow::Result<PathBuf> { - let mut repo_dir = dir.to_path_buf(); - repo_dir.push(repo_subdir_name); - - if run_cmd_shell_with_color::<YellowStderr>(&repo_dir, "git fetch -a").is_err() { - // delete it and start over - if repo_dir.exists() { - fs::remove_dir_all(&repo_dir)?; - } - run_cmd_shell_with_color::<YellowStderr>(dir, format!("git clone {}", repo_url))?; - } - - Ok(repo_dir) -} - fn get_bindgen_version() -> anyhow::Result<Version> { let bindgen_version_output = run_cmd_shell(&env::current_dir().unwrap(), "bindgen --version")?;
diff --git a/nearby/src/ffi.rs b/nearby/src/ffi.rs index 01fe58a..68e6e8c 100644 --- a/nearby/src/ffi.rs +++ b/nearby/src/ffi.rs
@@ -18,63 +18,15 @@ // wrapper for checking all ffi related things pub fn check_everything(root: &path::Path, cargo_options: &CargoOptions) -> anyhow::Result<()> { - check_np_ffi_rust(root, cargo_options)?; - check_ldt_ffi_rust(root)?; - check_ldt_cmake(root, cargo_options)?; check_np_ffi_cmake(root, cargo_options)?; - - Ok(()) -} - -pub fn check_np_ffi_rust(root: &path::Path, cargo_options: &CargoOptions) -> anyhow::Result<()> { - log::info!("Checking np_c_ffi cargo build"); - let ffi_dir = root.join("presence/np_c_ffi"); - let locked_arg = if cargo_options.locked { "--locked" } else { "" }; - for cargo_cmd in [ - "fmt --check", - // Default build, RustCrypto - format!("check {locked_arg} --quiet").as_str(), - // Build with BoringSSL for crypto - format!("check {locked_arg} --no-default-features --features=boringssl").as_str(), - "clippy", - "deny check", - "doc --quiet --no-deps", - ] { - run_cmd_shell(&ffi_dir, format!("cargo {}", cargo_cmd))?; - } - Ok(()) -} - -pub fn check_ldt_ffi_rust(root: &path::Path) -> anyhow::Result<()> { - log::info!("Checking LFT ffi cargo build"); - let ffi_dir = root.to_path_buf().join("presence/ldt_np_adv_ffi"); - - for cargo_cmd in [ - "fmt --check", - // Default build, RustCrypto + no_std - "check --quiet", - // Turn on std, still using RustCrypto - "check --quiet --features=std", - // Turn off default features and try to build with std", - "check --quiet --no-default-features --features=std", - // Turn off RustCrypto and use boringssl - "check --quiet --no-default-features --features=boringssl", - "doc --quiet --no-deps", - "clippy --release", - "clippy --features=std", - "clippy --no-default-features --features=openssl", - "clippy --no-default-features --features=std", - "deny check", - ] { - run_cmd_shell(&ffi_dir, format!("cargo {}", cargo_cmd))?; - } + check_ldt_cmake(root, cargo_options)?; Ok(()) } pub fn check_np_ffi_cmake(root: &path::Path, cargo_options: &CargoOptions) -> anyhow::Result<()> { log::info!("Checking CMake build and tests for np ffi c/c++ code"); - let build_dir = root.to_path_buf().join("presence/cmake-build"); + let build_dir = root.join("presence/cmake-build"); fs::create_dir_all(&build_dir)?; let locked_arg = if cargo_options.locked { "--locked" } else { "" }; @@ -91,7 +43,7 @@ run_cmd_shell_with_color::<YellowStderr>(&build_dir, "cmake --build . --target np_ffi_bench")?; // Run tests with different crypto backends - let tests_dir = build_dir.to_path_buf().join("np_cpp_ffi/tests"); + let tests_dir = build_dir.join("np_cpp_ffi/tests"); for build_config in [ // test with default build settings (rustcrypto) format!("build {locked_arg} --quiet --release"), @@ -115,7 +67,7 @@ pub fn check_ldt_cmake(root: &path::Path, cargo_options: &CargoOptions) -> anyhow::Result<()> { log::info!("Checking CMake build and tests for ldt c/c++ code"); - let build_dir = root.to_path_buf().join("presence/cmake-build"); + let build_dir = root.join("presence/cmake-build"); fs::create_dir_all(&build_dir)?; let locked_arg = if cargo_options.locked { "--locked" } else { "" }; @@ -126,8 +78,6 @@ )?; // verify sample and benchmarks build - let ldt_ffi_crate_dir = root.to_path_buf().join("presence/ldt_np_adv_ffi"); - run_cmd_shell(&ldt_ffi_crate_dir, format!("cargo build {locked_arg} --release"))?; run_cmd_shell_with_color::<YellowStderr>(&build_dir, "cmake --build . --target ldt_c_sample")?; run_cmd_shell_with_color::<YellowStderr>( &build_dir, @@ -136,23 +86,18 @@ // 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 ldt_tests_dir = build_dir.to_path_buf().join("ldt_np_c_sample/tests"); + let ldt_tests_dir = build_dir.join("ldt_np_adv_ffi/c/tests"); for build_config in [ // test with default build settings (rustcrypto, no_std) format!("build {locked_arg} --quiet --release"), - // test with std and default features - format!("build {locked_arg} --quiet --features std --release"), // test with boringssl crypto feature flag format!("build {locked_arg} --quiet --no-default-features --features boringssl --release"), // test without defaults and std feature flag format!("build {locked_arg} --quiet --no-default-features --features std --release"), ] { - run_cmd_shell(&ldt_ffi_crate_dir, format!("cargo {}", build_config))?; + run_cmd_shell(root, format!("cargo {} -p ldt_np_adv_ffi", build_config))?; // Force detection of updated `ldt_np_adv_ffi` static lib - let _ = run_cmd_shell_with_color::<YellowStderr>( - &build_dir, - "rm ldt_np_c_sample/tests/ldt_ffi_tests", - ); + let _ = run_cmd_shell_with_color::<YellowStderr>(&ldt_tests_dir, "rm ldt_ffi_tests"); run_cmd_shell_with_color::<YellowStderr>( &build_dir, "cmake --build . --target ldt_ffi_tests",
diff --git a/nearby/src/fuzzers.rs b/nearby/src/fuzzers.rs index 192d59c..aba01b3 100644 --- a/nearby/src/fuzzers.rs +++ b/nearby/src/fuzzers.rs
@@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -use cmd_runner::{run_cmd_shell_with_color, YellowStderr}; +use cmd_runner::{run_cmd_shell, run_cmd_shell_with_color, YellowStderr}; use std::{fs, path}; pub(crate) fn run_rust_fuzzers(root: &path::Path) -> anyhow::Result<()> { @@ -52,7 +52,7 @@ run_cmd_shell_with_color::<YellowStderr>( &root.join("crypto/crypto_provider_test"), concat!( - "cargo +nightly fuzz run fuzz_p256 --features=openssl --no-default-features ", + "cargo +nightly fuzz run fuzz_p256 --features=boringssl --no-default-features ", "-- -runs=10000 -max_total_time=60" ), )?; @@ -60,22 +60,25 @@ Ok(()) } -pub(crate) fn build_ffi_fuzzers(root: &path::Path) -> anyhow::Result<()> { - log::info!("Building ffi fuzzers"); - // TODO currently broken because the FFI stuff hasn't necessarily been built yet - let mut build_dir = root.to_path_buf(); - build_dir.push("presence/ldt_np_adv_ffi_fuzz/cmake-build"); +// Runs the fuzztest fuzzers as short lived unit tests, compatible with gtest +pub(crate) fn build_fuzztest_uts(root: &path::Path) -> anyhow::Result<()> { + log::info!("Checking fuzztest targets in unit test mode"); - if build_dir.exists() { - fs::remove_dir_all(&build_dir)?; - } + // first build the rust static libs to link against + let np_ffi_crate_dir = root.join("presence/np_c_ffi"); + run_cmd_shell(&np_ffi_crate_dir, "cargo build --release")?; + let build_dir = root.join("presence/cmake-build"); fs::create_dir_all(&build_dir)?; - run_cmd_shell_with_color::<YellowStderr>( - &build_dir, - "cmake -G Ninja ../.. -DENABLE_FUZZ=true", - )?; - run_cmd_shell_with_color::<YellowStderr>(&build_dir, "cmake --build .")?; - fs::remove_dir_all(&build_dir)?; + run_cmd_shell_with_color::<YellowStderr>(&build_dir, "cmake -G Ninja -DENABLE_FUZZ=true ..")?; + for target in ["deserialization_fuzzer", "ldt_fuzzer"] { + run_cmd_shell_with_color::<YellowStderr>( + &build_dir, + format!("cmake --build . --target {}", target), + )?; + } + + run_cmd_shell_with_color::<YellowStderr>(&build_dir.join("np_cpp_ffi/fuzz/"), "ctest")?; + run_cmd_shell_with_color::<YellowStderr>(&build_dir.join("ldt_np_adv_ffi/c/fuzz/"), "ctest")?; Ok(()) }
diff --git a/nearby/src/jni.rs b/nearby/src/jni.rs index 22a1da2..0b000fb 100644 --- a/nearby/src/jni.rs +++ b/nearby/src/jni.rs
@@ -17,9 +17,7 @@ // This has to happen after both boringssl has been built and prepare rust openssl patches has been run. pub fn check_ldt_jni(root: &path::Path) -> anyhow::Result<()> { - for feature in ["opensslbssl", "boringssl"] { - run_cmd_shell(root, format!("cargo --config .cargo/config-boringssl.toml build -p ldt_np_jni --no-default-features --features={}", feature))?; - } + run_cmd_shell(root, "cargo build -p ldt_np_jni --no-default-features --features=boringssl")?; Ok(()) } @@ -28,3 +26,10 @@ run_cmd_shell(&kotlin_lib_path, "./gradlew :test")?; Ok(()) } + +pub fn run_ukey2_jni_tests(root: &path::Path) -> anyhow::Result<()> { + run_cmd_shell(root, "cargo build -p ukey2_jni")?; + let ukey2_jni_path = root.to_path_buf().join("connections/ukey2/ukey2_jni/java"); + run_cmd_shell(&ukey2_jni_path, "./gradlew :test")?; + Ok(()) +}
diff --git a/nearby/src/main.rs b/nearby/src/main.rs index 3d698e2..f4843be 100644 --- a/nearby/src/main.rs +++ b/nearby/src/main.rs
@@ -15,9 +15,9 @@ extern crate core; use clap::Parser as _; -use cmd_runner::run_cmd_shell; +use cmd_runner::{run_cmd, run_cmd_shell, YellowStderr}; use env_logger::Env; -use std::{env, path}; +use std::{env, ffi::OsString, path}; mod crypto_ffi; mod ffi; @@ -46,16 +46,13 @@ } Subcommand::BuildBoringssl => crypto_ffi::build_boringssl(&root_dir)?, Subcommand::CheckBoringssl(ref options) => crypto_ffi::check_boringssl(&root_dir, options)?, - Subcommand::PrepareRustOpenssl => crypto_ffi::prepare_patched_rust_openssl(&root_dir)?, - Subcommand::CheckOpenssl(ref options) => crypto_ffi::check_openssl(&root_dir, options)?, Subcommand::RunRustFuzzers => fuzzers::run_rust_fuzzers(&root_dir)?, - Subcommand::BuildFfiFuzzers => fuzzers::build_ffi_fuzzers(&root_dir)?, + Subcommand::CheckFuzztest => fuzzers::build_fuzztest_uts(&root_dir)?, Subcommand::CheckLicenseHeaders => license::check_license_headers(&root_dir)?, Subcommand::AddLicenseHeaders => license::add_license_headers(&root_dir)?, - Subcommand::CheckLdtFfi => ffi::check_ldt_ffi_rust(&root_dir)?, Subcommand::CheckUkey2Ffi(ref options) => ukey2::check_ukey2_ffi(&root_dir, options)?, + Subcommand::RunUkey2JniTests => jni::run_ukey2_jni_tests(&root_dir)?, Subcommand::CheckLdtJni => jni::check_ldt_jni(&root_dir)?, - Subcommand::CheckNpFfi(ref options) => ffi::check_np_ffi_rust(&root_dir, options)?, Subcommand::CheckLdtCmake(ref options) => ffi::check_ldt_cmake(&root_dir, options)?, Subcommand::CheckNpFfiCmake(ref options) => ffi::check_np_ffi_cmake(&root_dir, options)?, Subcommand::RunKotlinTests => jni::run_kotlin_tests(&root_dir)?, @@ -64,28 +61,68 @@ Ok(()) } +fn check_format(root: &path::Path, options: &CheckOptions) -> anyhow::Result<()> { + // Rust format + { + let fmt_command = if options.reformat { "cargo fmt" } else { "cargo fmt --check" }; + run_cmd_shell(root, fmt_command)?; + } + + // Java format. This uses the jar downloaded as part of the CI script or the local + // `google-java-format` executable. The jar file path can be overridden with the + // `GOOGLE_JAVA_FORMAT_ALL_DEPS_JAR` environment variable. See + // <go/google-java-format#installation> for setup instructions for your dev environment if + // needed. + { + let jar_path = std::env::var("GOOGLE_JAVA_FORMAT_ALL_DEPS_JAR").unwrap_or_else(|_| { + "/opt/google-java-format/google-java-format-all-deps.jar".to_owned() + }); + + let mut fmt_command: Vec<OsString> = Vec::new(); + + if path::PathBuf::from(&jar_path).exists() { + fmt_command.extend(["java".into(), "-jar".into(), jar_path.into()]); + } else { + fmt_command.push("google-java-format".into()); + } + + if options.reformat { + fmt_command.push("-i".into()); + } else { + fmt_command.extend(["--set-exit-if-changed".into(), "--dry-run".into()]); + } + + let java_files: Vec<_> = + glob::glob("./**/*.java").unwrap().filter_map(Result::ok).collect(); + + for file_set in java_files.chunks(100) { + let mut args = fmt_command[1..].to_vec(); + args.extend(file_set.iter().map(OsString::from)); + + run_cmd::<YellowStderr, _, _, _>(root, &fmt_command[0], args)?; + } + } + + Ok(()) +} + pub fn check_workspace(root: &path::Path, options: &CheckOptions) -> anyhow::Result<()> { log::info!("Running cargo checks on workspace"); - let fmt_command = if options.reformat { "cargo fmt" } else { "cargo fmt --check" }; + // ensure formatting is correct (Check for it first because it is fast compared to running tests) + check_format(root, options)?; for cargo_cmd in [ - // ensure formatting is correct (Check for it first because it is fast compared to running tests) - fmt_command, // make sure everything compiles "cargo check --workspace --all-targets --quiet", // run all the tests - //TODO: re-enable the openssl tests, this was potentially failing due to UB code in the - // upstream rust-openssl crate's handling of empty slices. This repros consistently when - // using the rust-openssl crate backed by openssl-sys on Ubuntu 20.04. - "cargo test --workspace --quiet --exclude crypto_provider_openssl -- --color=always", + "cargo test --workspace --quiet -- --color=always", // Test ukey2 builds with different crypto providers "cargo test -p ukey2_connections -p ukey2_rs --no-default-features --features test_rustcrypto", - "cargo test -p ukey2_connections -p ukey2_rs --no-default-features --features test_openssl", // ensure the docs are valid (cross-references to other code, etc) concat!( - "RUSTDOCFLAGS='--deny warnings -Z unstable-options --enable-index-page --generate-link-to-definition' ", - "cargo +nightly doc --quiet --workspace --no-deps --document-private-items ", + "RUSTDOCFLAGS='--deny warnings' ", + "cargo doc --quiet --workspace --no-deps --document-private-items ", "--target-dir target/dist_docs", ), "cargo clippy --all-targets --workspace -- --deny warnings", @@ -102,20 +139,19 @@ license::check_license_headers(root)?; check_workspace(root, check_options)?; crypto_ffi::check_boringssl(root, &check_options.cargo_options)?; - crypto_ffi::check_openssl(root, &check_options.cargo_options)?; ffi::check_everything(root, &check_options.cargo_options)?; jni::check_ldt_jni(root)?; jni::run_kotlin_tests(root)?; + jni::run_ukey2_jni_tests(root)?; ukey2::check_ukey2_ffi(root, &check_options.cargo_options)?; fuzzers::run_rust_fuzzers(root)?; - fuzzers::build_ffi_fuzzers(root)?; + fuzzers::build_fuzztest_uts(root)?; Ok(()) } pub fn clean_everything(root: &path::Path) -> anyhow::Result<()> { run_cmd_shell(root, "cargo clean")?; - run_cmd_shell(&root.join("presence/ldt_np_adv_ffi"), "cargo clean")?; run_cmd_shell(&root.join("presence/np_c_ffi"), "cargo clean")?; run_cmd_shell(&root.join("crypto/crypto_provider_boringssl"), "cargo clean")?; run_cmd_shell(&root.join("connections/ukey2/ukey2_c_ffi"), "cargo clean")?; @@ -140,29 +176,19 @@ CleanEverything, /// Checks everything included in the top level workspace CheckWorkspace(CheckOptions), - /// Checks everything related to the boringssl version (equivalent of running check-boringssl - /// + check-openssl) + /// Checks everything related to the boringssl version BoringsslCheckEverything(CargoOptions), /// Clones boringssl and uses bindgen to generate the rust crate BuildBoringssl, /// Run crypto provider tests using boringssl backend CheckBoringssl(CargoOptions), - /// Applies AOSP specific patches to the 3p `openssl` crate so that it can use a boringssl - /// backend - PrepareRustOpenssl, - /// Run crypto provider tests using openssl crate with boringssl backend - CheckOpenssl(CargoOptions), /// Build and run pure Rust fuzzers for 10000 runs RunRustFuzzers, - /// Build FFI fuzzers - BuildFfiFuzzers, + /// Builds and runs fuzztest property based unit tests + CheckFuzztest, /// Builds and runs tests for all C/C++ projects. This is a combination of CheckNpFfi, /// CheckLdtFfi, and CheckCmakeBuildAndTests FfiCheckEverything(CargoOptions), - /// Builds the crate checks the cbindgen generation of C/C++ bindings - CheckNpFfi(CargoOptions), - /// 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 CheckLdtCmake(CargoOptions), /// Checks the CMake build and runs all of the C/C++ tests @@ -173,10 +199,12 @@ AddLicenseHeaders, /// Builds and runs tests for the UKEY2 FFI CheckUkey2Ffi(CargoOptions), - /// Checks the build of ldt_jni wrapper with non default features, ie rust-openssl, and boringssl + /// Checks the build of ldt_jni wrapper with non default features, ie boringssl CheckLdtJni, /// Runs the kotlin tests of the LDT Jni API RunKotlinTests, + /// Checks the build of the ukey2_jni wrapper and runs tests + RunUkey2JniTests, } #[derive(clap::Args, Debug, Clone, Default)]
diff --git a/nearby/src/ukey2.rs b/nearby/src/ukey2.rs index e548ab0..5e711a1 100644 --- a/nearby/src/ukey2.rs +++ b/nearby/src/ukey2.rs
@@ -28,22 +28,18 @@ // Default build, RustCrypto run_cmd_shell(&ffi_dir, format!("cargo build {locked_arg} --quiet --release --lib"))?; - // OpenSSL + // BoringSSL run_cmd_shell( &ffi_dir, - format!("cargo build {locked_arg} --quiet --no-default-features --features=openssl"), + format!("cargo build {locked_arg} --quiet --no-default-features --features=boringssl"), )?; + run_cmd_shell(&ffi_dir, "cargo clippy --no-default-features --features=boringssl")?; - run_cmd_shell(&ffi_dir, "cargo doc --quiet --no-deps")?; - run_cmd_shell(&ffi_dir, "cargo clippy --no-default-features --features=openssl")?; - - run_cmd_shell(&ffi_dir, "cargo deny check")?; - + // now run cmake build let ffi_build_dir = ffi_dir.join("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, "cmake --build .")?; run_cmd_shell_with_color::<YellowStderr>(&ffi_build_dir, "ctest")?; - Ok(()) }
diff --git a/nearby/util/handle_map/src/declare_handle_map.rs b/nearby/util/handle_map/src/declare_handle_map.rs index c19a012..688ec18 100644 --- a/nearby/util/handle_map/src/declare_handle_map.rs +++ b/nearby/util/handle_map/src/declare_handle_map.rs
@@ -16,17 +16,18 @@ #[macro_export] /// ```ignore -/// declare_handle_map! { -/// mod $handle_module_name { -/// #[dimensions = $map_dimension_provider] -/// type $handle_type_name: HandleLike<Object = $wrapped_type>; -/// } -/// } +/// declare_handle_map! ( +/// $handle_module_name, +/// $map_dimension_provider, +/// $handle_type_name, +/// $wrapped_type, +/// ) /// ``` /// -/// 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`. +/// Declares a new public module with name `handle_module_name` which implements handle functionality +/// for the given struct `handle_type_name` which is `#[repr(C)]` and represents FFI-accessible +/// handles to values of type `wrapped_type`. `handle_type_name` expects a struct with a single u64 +/// field `handle_id`. /// /// 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 @@ -54,14 +55,16 @@ /// } /// } /// -/// declare_handle_map! { -/// mod string_handle { -/// #[dimensions = super::get_string_handle_map_dimensions()] -/// type StringHandle: HandleLike<Object = String>; -/// } +/// struct StringHandle { +/// handle_id: u64 /// } /// -/// use string_handle::StringHandle; +/// declare_handle_map!( +/// string_handle, +/// super::get_string_handle_map_dimensions(), +/// super::StringHandle, +/// String +/// ); /// /// fn main() { /// // Note: this method could panic if there are @@ -90,10 +93,10 @@ /// ``` macro_rules! declare_handle_map { ( - mod $handle_module_name:ident { - #[dimensions = $map_dimension_provider:expr] - type $handle_type_name:ident: HandleLike<Object = $wrapped_type:ty>; - } + $handle_module_name:ident, + $map_dimension_provider:expr, + $handle_type_name:ty, + $wrapped_type:ty ) => { #[doc = ::core::concat!( "Macro-generated (via `handle_map::declare_handle_map!`) module which", @@ -102,7 +105,6 @@ " which references values of type `", ::core::stringify!($wrapped_type), "`." )] pub mod $handle_module_name { - lazy_static! { static ref GLOBAL_HANDLE_MAP: $crate::HandleMap<$wrapped_type> = $crate::HandleMap::with_dimensions($map_dimension_provider); @@ -112,11 +114,6 @@ "A `#[repr(C)]` handle to a value of type `", ::core::stringify!($wrapped_type), "`." )] - #[repr(C)] - #[derive(Clone, Copy, PartialEq, Eq)] - pub struct $handle_type_name { - handle_id: u64, - } impl $handle_type_name { /// Cast the given raw Handle to this HandleLike
diff --git a/nearby/util/pourover/Cargo.toml b/nearby/util/pourover/Cargo.toml new file mode 100644 index 0000000..ce6fefa --- /dev/null +++ b/nearby/util/pourover/Cargo.toml
@@ -0,0 +1,13 @@ +[package] +name = "pourover" +version.workspace = true +edition.workspace = true +publish.workspace = true + +[dependencies] +jni.workspace = true +pourover_macro.workspace = true + +[dev-dependencies] +# Enable JVM creation for `tests/desc_integration.rs` +jni = { workspace = true, features = ["invocation"] }
diff --git a/nearby/util/pourover/src/conversions.rs b/nearby/util/pourover/src/conversions.rs new file mode 100644 index 0000000..69a00a2 --- /dev/null +++ b/nearby/util/pourover/src/conversions.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. + +//! Helper traits to convert byte signedness for Java interop + +/// A helper trait to bitcast data to its signed representation +pub trait ToSigned { + /// The signed version of this type. + type Signed; + + /// Bitcast to signed + fn to_signed(self) -> Self::Signed; +} + +impl<'a> ToSigned for &'a [u8] { + type Signed = &'a [i8]; + + fn to_signed(self) -> Self::Signed { + let len = self.len(); + // Safety: + // u8 and i8 have the same layout and the lifetime is maintained + unsafe { core::slice::from_raw_parts(self.as_ptr() as *const i8, len) } + } +} + +/// A helper trait to bitcast data to its unsigned representation +pub trait ToUnsigned { + /// The unsigned version of this type. + type Unsigned; + + /// Bitcast to unsigned + fn to_unsigned(self) -> Self::Unsigned; +} + +impl<'a> ToUnsigned for &'a [i8] { + type Unsigned = &'a [u8]; + + fn to_unsigned(self) -> Self::Unsigned { + let len = self.len(); + // Safety: + // u8 and i8 have the same layout and the lifetime is maintained + unsafe { core::slice::from_raw_parts(self.as_ptr() as *const u8, len) } + } +} + +#[cfg(test)] +mod test { + use super::*; + + #[test] + fn test_to_signed() { + let input: &[u8] = &[1, 2, 3, 0, 0xff, 0xfe]; + let expected: &[i8] = &[1, 2, 3, 0, -1, -2]; + + assert_eq!(expected, input.to_signed()); + } + + #[test] + fn test_to_unsigned() { + let input: &[i8] = &[1, 2, 3, 0, -1, -2]; + let expected: &[u8] = &[1, 2, 3, 0, 0xff, 0xfe]; + + assert_eq!(expected, input.to_unsigned()); + } + + #[test] + fn test_roundtrip_unsigned() { + let case: &[u8] = &[1, 2, 3, 0, 0xff, 0xfe]; + assert_eq!(case, case.to_signed().to_unsigned()); + } + + #[test] + fn test_roundtrip_signed() { + let case: &[i8] = &[1, 2, 3, 0, -1, -2]; + assert_eq!(case, case.to_unsigned().to_signed()); + } +}
diff --git a/nearby/util/pourover/src/desc.rs b/nearby/util/pourover/src/desc.rs new file mode 100644 index 0000000..507d3de --- /dev/null +++ b/nearby/util/pourover/src/desc.rs
@@ -0,0 +1,381 @@ +// 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. + +//! Cacheable descriptors. These `jni` crate compatible descriptors will cache their value on first +//! lookup. They are meant to be combined with static variables in order to globally cache their +//! associated id values. +//! +//! ### Example +//! +//! ```java +//! package com.example; +//! +//! public class MyClass { +//! public int foo; +//! public int getBar() { /* ... */ } +//! } +//! ``` +//! +//! ```rust +//! use pourover::desc::*; +//! +//! static MY_CLASS_DESC: ClassDesc = ClassDesc::new("com/example/MyClass"); +//! static MY_CLASS_FOO_FIELD: FieldDesc = MY_CLASS_DESC.field("foo", "I"); +//! static MY_CLASS_GET_BAR_METHOD: MethodDesc = MY_CLASS_DESC.method("getBar", "I()"); +//! ``` + +use core::convert::AsRef; +use jni::{ + descriptors::Desc, + objects::{GlobalRef, JClass, JFieldID, JMethodID, JObject, JStaticFieldID, JStaticMethodID}, + JNIEnv, +}; +use std::sync::{LockResult, RwLock, RwLockReadGuard}; + +/// JNI descriptor that caches a Java class. +pub struct ClassDesc { + /// The JNI descriptor for this class. + descriptor: &'static str, + /// The cached class + /// + /// The implementation assumes that `None` is only written to the lock when `&mut self` is + /// held. Only `Some` is valid to write to this lock while `&self` is held. + cls: RwLock<Option<GlobalRef>>, +} + +impl ClassDesc { + /// Create a new descriptor with the given JNI descriptor string. + pub const fn new(descriptor: &'static str) -> Self { + Self { descriptor, cls: RwLock::new(None) } + } + + /// Create a new descriptor for a field member of this class. + pub const fn field<'cls>(&'cls self, name: &'static str, sig: &'static str) -> FieldDesc<'cls> { + FieldDesc::new(self, name, sig) + } + + /// Create a new descriptor for a static field member of this class. + pub const fn static_field<'cls>( + &'cls self, + name: &'static str, + sig: &'static str, + ) -> StaticFieldDesc<'cls> { + StaticFieldDesc::new(self, name, sig) + } + + /// Create a new descriptor for a method member of this class. + pub const fn method<'cls>( + &'cls self, + name: &'static str, + sig: &'static str, + ) -> MethodDesc<'cls> { + MethodDesc::new(self, name, sig) + } + + /// Create a new descriptor for a constructor for this class. + pub const fn constructor<'cls>(&'cls self, sig: &'static str) -> MethodDesc<'cls> { + MethodDesc::new(self, "<init>", sig) + } + + /// Create a new descriptor for a static method member of this class. + pub const fn static_method<'cls>( + &'cls self, + name: &'static str, + sig: &'static str, + ) -> StaticMethodDesc<'cls> { + StaticMethodDesc::new(self, name, sig) + } + + /// Free the cached GlobalRef to the class object. This will happen automatically on drop, but + /// this method is provided to allow the value to be dropped early. This can be used to perform + /// cleanup on a thread that is already attached to the JVM. + pub fn free(&mut self) { + // Get a mutable reference ignoring poison state + let mut guard = self.cls.write().ignore_poison(); + let global = guard.take(); + // Drop the guard before global in case it panics. We don't want to poison the lock. + core::mem::drop(guard); + // Drop the GlobalRef value to cleanup + core::mem::drop(global); + } + + fn get_cached(&self) -> Option<CachedClass<'_>> { + CachedClass::from_lock(&self.cls) + } +} + +/// Wrapper to allow RwLock references to be returned from Desc. Use the `AsRef` impl to get the +/// associated `JClass` reference. The inner `Option` must always be `Some`. This is enfocred by +/// the `from_lock` constructor. +pub struct CachedClass<'lock>(RwLockReadGuard<'lock, Option<GlobalRef>>); + +impl<'lock> CachedClass<'lock> { + /// Read from the given lock and create a `CachedClass` instance if the lock contains a cached + /// class value. The given lock must have valid data even if it is poisoned. + fn from_lock(lock: &'lock RwLock<Option<GlobalRef>>) -> Option<CachedClass<'lock>> { + let guard = lock.read().ignore_poison(); + + // Validate that there is a GlobalRef value already, otherwise avoid constructing `Self`. + if guard.is_some() { + Some(Self(guard)) + } else { + None + } + } +} + +// Implement AsRef so that we can use this type as `Desc::Output` in [`ClassDesc`]. +impl<'lock> AsRef<JClass<'static>> for CachedClass<'lock> { + fn as_ref(&self) -> &JClass<'static> { + // `unwrap` is valid since we checked for `Some` in the constructor. + let global = self.0.as_ref().unwrap(); + // No direct conversion to JClass, so let's go through JObject first. + let obj: &JObject<'static> = global.as_ref(); + // This assumes our object is a class object. + let cls: &JClass<'static> = From::from(obj); + cls + } +} + +/// # Safety +/// +/// This returns the correct class instance via `JNIEnv::find_class`. The cached class is held in a +/// [`GlobalRef`] so that it cannot be unloaded. +unsafe impl<'a, 'local> Desc<'local, JClass<'static>> for &'a ClassDesc { + type Output = CachedClass<'a>; + + fn lookup(self, env: &mut JNIEnv<'local>) -> jni::errors::Result<Self::Output> { + // Check the cache + if let Some(cls) = self.get_cached() { + return Ok(cls); + } + + { + // Ignoring poison is fine because we only write fully-constructed values. + let mut guard = self.cls.write().ignore_poison(); + + // Multiple threads could have hit this block at the same time. Only allocate the + // `GlobalRef` if it was not already allocated. + if guard.is_none() { + let cls = env.find_class(self.descriptor)?; + let global = env.new_global_ref(cls)?; + + // Only directly assign valid values. That way poison state can't have broken + // invariants. If the above panicked then it will poison without changing the + // lock's data, and everything will still be fine albeit with a sprinkle of + // possibly-leaked memory. + *guard = Some(global); + } + } + + // Safe to unwrap since we just set `self.cls` to `Some`. `ClassDesc::free` can't be called + // before this point because it takes a mutable reference to `*self`. + Ok(self.get_cached().unwrap()) + } +} + +/// A descriptor for a class member. `Id` is expected to implement the [`MemberId`] trait. +/// +/// See [`FieldDesc`], [`StaticFieldDesc`], [`MethodDesc`], and [`StaticMethodDesc`] aliases. +pub struct MemberDesc<'cls, Id> { + cls: &'cls ClassDesc, + name: &'static str, + sig: &'static str, + id: RwLock<Option<Id>>, +} + +/// Descriptor for a field. +pub type FieldDesc<'cls> = MemberDesc<'cls, JFieldID>; +/// Descriptor for a static field. +pub type StaticFieldDesc<'cls> = MemberDesc<'cls, JStaticFieldID>; +/// Descriptor for a method. +pub type MethodDesc<'cls> = MemberDesc<'cls, JMethodID>; +/// Descriptor for a static method. +pub type StaticMethodDesc<'cls> = MemberDesc<'cls, JStaticMethodID>; + +impl<'cls, Id: MemberId> MemberDesc<'cls, Id> { + /// Create a new descriptor for a member of the given class with the given name and signature. + /// + /// Please use the helpers on [`ClassDesc`] instead of directly calling this method. + pub const fn new(cls: &'cls ClassDesc, name: &'static str, sig: &'static str) -> Self { + Self { cls, name, sig, id: RwLock::new(None) } + } + + /// Get the class descriptor that this member is associated to. + pub const fn cls(&self) -> &'cls ClassDesc { + self.cls + } +} + +/// # Safety +/// +/// This returns the correct id. It is the same id obtained from the JNI. This id can be a pointer +/// in some JVM implementations. See trait [`MemberId`]. +unsafe impl<'cls, 'local, Id: MemberId> Desc<'local, Id> for &MemberDesc<'cls, Id> { + type Output = Id; + + fn lookup(self, env: &mut JNIEnv<'local>) -> jni::errors::Result<Self::Output> { + // Check the cache. + if let Some(id) = *self.id.read().ignore_poison() { + return Ok(id); + } + + { + // Ignoring poison is fine because we only write valid values. + let mut guard = self.id.write().ignore_poison(); + + // Multiple threads could have hit this block at the same time. Only lookup the id if + // the lookup was not already performed. + if guard.is_none() { + let id = Id::lookup(env, self)?; + + // Only directly assign valid values. That way poison state can't have broken + // invariants. If the above panicked then it will poison without changing the + // lock's data and everything will still be fine. + *guard = Some(id); + + Ok(id) + } else { + // Can unwrap since we just checked for `None`. + Ok(*guard.as_ref().unwrap()) + } + } + } +} + +/// Helper trait that calls into `jni` to lookup the id values. This is specialized on the id's +/// type to call the correct lookup function. +/// +/// # Safety +/// +/// Implementers must be an ID returned from the JNI. `lookup` must be implemented such that the +/// returned ID matches the JNI descriptor given. All values must be sourced from the JNI APIs. +/// See [`::jni::descriptors::Desc`]. +pub unsafe trait MemberId: Sized + Copy + AsRef<Self> { + /// Lookup the id of the given descriptor via the given environment. + fn lookup(env: &mut JNIEnv, desc: &MemberDesc<Self>) -> jni::errors::Result<Self>; +} + +/// # Safety +/// +/// This fetches the matching ID from the JNI APIs. +unsafe impl MemberId for JFieldID { + fn lookup(env: &mut JNIEnv, desc: &MemberDesc<Self>) -> jni::errors::Result<Self> { + env.get_field_id(desc.cls(), desc.name, desc.sig) + } +} + +/// # Safety +/// +/// This fetches the matching ID from the JNI APIs. +unsafe impl MemberId for JStaticFieldID { + fn lookup(env: &mut JNIEnv, desc: &MemberDesc<Self>) -> jni::errors::Result<Self> { + env.get_static_field_id(desc.cls(), desc.name, desc.sig) + } +} + +/// # Safety +/// +/// This fetches the matching ID from the JNI APIs. +unsafe impl MemberId for JMethodID { + fn lookup(env: &mut JNIEnv, desc: &MemberDesc<Self>) -> jni::errors::Result<Self> { + env.get_method_id(desc.cls(), desc.name, desc.sig) + } +} + +/// # Safety +/// +/// This fetches the matching ID from the JNI APIs. +unsafe impl MemberId for JStaticMethodID { + fn lookup(env: &mut JNIEnv, desc: &MemberDesc<Self>) -> jni::errors::Result<Self> { + env.get_static_method_id(desc.cls(), desc.name, desc.sig) + } +} + +/// Internal helper to ignore the poison state of `LockResult`. +/// +/// The poison state occurs when a panic occurs during the lock's critical section. This means that +/// the invariants of the locked data that were protected by the lock may be broken. When this +/// trait is used below, it is used in scenarios where the locked data does not have invariants +/// that can be broken in this way. In these cases, the possibly-poisoned lock is being used purely +/// for synchronization, so the poison state may be ignored. +trait IgnoreLockPoison { + type Guard; + + /// Extract the inner `Guard` of this `LockResult`. This ignores whether the lock state is + /// poisoned or not. + fn ignore_poison(self) -> Self::Guard; +} + +impl<G> IgnoreLockPoison for LockResult<G> { + type Guard = G; + fn ignore_poison(self) -> Self::Guard { + self.unwrap_or_else(|poison| poison.into_inner()) + } +} + +#[cfg(test)] +mod test { + use super::*; + + const DESC: &str = "com/example/Foo"; + static FOO: ClassDesc = ClassDesc::new(DESC); + + static FIELD: FieldDesc = FOO.field("foo", "I"); + static STATIC_FIELD: StaticFieldDesc = FOO.static_field("sfoo", "J"); + static CONSTRUCTOR: MethodDesc = FOO.constructor("(I)V"); + static METHOD: MethodDesc = FOO.method("mfoo", "()Z"); + static STATIC_METHOD: StaticMethodDesc = FOO.static_method("smfoo", "()I"); + + #[test] + fn class_desc_created_properly() { + assert_eq!(DESC, FOO.descriptor); + assert!(FOO.cls.read().ignore_poison().is_none()); + } + + #[test] + fn field_desc_created_properly() { + assert!(std::ptr::eq(&FOO, FIELD.cls())); + assert_eq!("foo", FIELD.name); + assert_eq!("I", FIELD.sig); + } + + #[test] + fn static_field_desc_created_properly() { + assert!(std::ptr::eq(&FOO, STATIC_FIELD.cls())); + assert_eq!("sfoo", STATIC_FIELD.name); + assert_eq!("J", STATIC_FIELD.sig); + } + + #[test] + fn constructor_desc_created_properly() { + assert!(std::ptr::eq(&FOO, CONSTRUCTOR.cls())); + assert_eq!("<init>", CONSTRUCTOR.name); + assert_eq!("(I)V", CONSTRUCTOR.sig); + } + + #[test] + fn method_desc_created_properly() { + assert!(std::ptr::eq(&FOO, METHOD.cls())); + assert_eq!("mfoo", METHOD.name); + assert_eq!("()Z", METHOD.sig); + } + + #[test] + fn static_method_desc_created_properly() { + assert!(std::ptr::eq(&FOO, STATIC_METHOD.cls())); + assert_eq!("smfoo", STATIC_METHOD.name); + assert_eq!("()I", STATIC_METHOD.sig); + } +}
diff --git a/nearby/connections/connections_adv/connections_adv/src/lib.rs b/nearby/util/pourover/src/lib.rs similarity index 67% rename from nearby/connections/connections_adv/connections_adv/src/lib.rs rename to nearby/util/pourover/src/lib.rs index 4cfcdfa..51495de 100644 --- a/nearby/connections/connections_adv/connections_adv/src/lib.rs +++ b/nearby/util/pourover/src/lib.rs
@@ -12,20 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. -//! Placeholder crate for connections advertisements +//! Utilties for JNI interactions. -/// placeholder -pub fn add(left: usize, right: usize) -> usize { - left + right -} +// Enforce documentation +#![deny(missing_docs)] +#![deny(unsafe_op_in_unsafe_fn)] -#[cfg(test)] -mod tests { - use super::*; +pub use pourover_macro::jni_method; - #[test] - fn it_works() { - let result = add(2, 2); - assert_eq!(result, 4); - } -} +pub mod desc; + +mod conversions; +pub use conversions::{ToSigned, ToUnsigned};
diff --git a/nearby/util/pourover/tests/Foo.java b/nearby/util/pourover/tests/Foo.java new file mode 100644 index 0000000..0907964 --- /dev/null +++ b/nearby/util/pourover/tests/Foo.java
@@ -0,0 +1,41 @@ +/* + * Copyright 2024 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. + */ + +package com.example; + +/** Test class for integration tests. See {@code common/foo_class.rs} for how to compile and use. */ +public final class Foo { + + public static long sfoo = 321; + + public int foo; + + public static int smfoo() { + return 3; + } + + public Foo(int f) { + this.foo = f; + } + + public boolean mfoo() { + return true; + } + + public native int nativeReturnsInt(int n); + + public native String nativeReturnsObject(int n); +}
diff --git a/nearby/util/pourover/tests/common/foo_class.rs b/nearby/util/pourover/tests/common/foo_class.rs new file mode 100644 index 0000000..65971d7 --- /dev/null +++ b/nearby/util/pourover/tests/common/foo_class.rs
@@ -0,0 +1,89 @@ +// Copyright 2024 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. + +//! Java integration for the `Foo.java` test class. +//! +//! There are pourover descriptors for each member of `Foo`. Keep these in sync with changes to +//! `Foo.java`. +//! +//! Compilation is done at runtime. There isn't a way to create a build.rs for an integration test. +//! use [`compile_foo`] to get the class bytes and load the class using +//! [`jni::JNIEnv::define_class`]. + +use pourover::desc::*; +use std::error::Error; +use std::process::Command; + +pub const CLASS_DESC: &str = "com/example/Foo"; +pub static FOO: ClassDesc = ClassDesc::new(CLASS_DESC); + +pub static FIELD: FieldDesc = FOO.field("foo", "I"); +pub static STATIC_FIELD: StaticFieldDesc = FOO.static_field("sfoo", "J"); +pub static CONSTRUCTOR: MethodDesc = FOO.constructor("(I)V"); +pub static METHOD: MethodDesc = FOO.method("mfoo", "()Z"); +pub static STATIC_METHOD: StaticMethodDesc = FOO.static_method("smfoo", "()I"); +pub static NATIVE_METHOD: MethodDesc = FOO.method("nativeReturnsInt", "(I)I"); +pub static NATIVE_OBJECT_METHOD: MethodDesc = + FOO.method("nativeReturnsObject", "(I)Ljava/lang/String;"); + +/// Quick test to ensure that Java is available on the system. The version will be logged to +/// stdout. +#[test] +fn has_java() -> Result<(), Box<dyn Error>> { + Command::new("java").arg("--version").status()?; + Ok(()) +} + +/// Compile `Foo.java` and return the class file's bytes. +#[track_caller] +pub fn compile_foo() -> Result<Vec<u8>, Box<dyn Error>> { + // Avoid concurrent tests colliding on the file system by adding a hash of the call-site to the + // temp file path + let caller_hash = { + use core::hash::{Hash, Hasher}; + let caller = core::panic::Location::caller(); + let mut hasher = std::collections::hash_map::DefaultHasher::new(); + caller.hash(&mut hasher); + hasher.finish() + }; + + // Create a temporary dir to generate class files + let mut tmp = std::env::temp_dir(); + tmp.push(format!("test-java-build-{caller_hash:016x}")); + + if let Err(err) = std::fs::create_dir(&tmp) { + println!("error creating {}: {}", tmp.display(), &err); + } + + // Compile Foo.java into the temp dir + Command::new("javac") + .args(["--release", "8"]) + .arg("-d") + .arg(&tmp) + .arg("tests/Foo.java") + .status()?; + + // Read the class file bytes + let class = { + let mut class_file = tmp.clone(); + class_file.push("com/example/Foo.class"); + std::fs::read(&class_file)? + }; + + // Clean up the temp dir. If an error occurs before this we will leave the temp dir on the + // filesystem. That should work better for debugging than cleaning up in all cases. + std::fs::remove_dir_all(&tmp)?; + + Ok(class) +}
diff --git a/nearby/connections/connections_adv/connections_adv/src/lib.rs b/nearby/util/pourover/tests/common/mod.rs similarity index 63% copy from nearby/connections/connections_adv/connections_adv/src/lib.rs copy to nearby/util/pourover/tests/common/mod.rs index 4cfcdfa..1dad720 100644 --- a/nearby/connections/connections_adv/connections_adv/src/lib.rs +++ b/nearby/util/pourover/tests/common/mod.rs
@@ -1,4 +1,4 @@ -// Copyright 2023 Google LLC +// Copyright 2024 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -12,20 +12,10 @@ // See the License for the specific language governing permissions and // limitations under the License. -//! Placeholder crate for connections advertisements +//! Common module for pourover integration tests. This file must use the `mod.rs` name to avoid +//! being compiled as an integration test. -/// placeholder -pub fn add(left: usize, right: usize) -> usize { - left + right -} +// Not every item is used in every test +#![allow(dead_code)] -#[cfg(test)] -mod tests { - use super::*; - - #[test] - fn it_works() { - let result = add(2, 2); - assert_eq!(result, 4); - } -} +pub mod foo_class;
diff --git a/nearby/util/pourover/tests/desc_integration.rs b/nearby/util/pourover/tests/desc_integration.rs new file mode 100644 index 0000000..7eec528 --- /dev/null +++ b/nearby/util/pourover/tests/desc_integration.rs
@@ -0,0 +1,100 @@ +// Copyright 2024 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 jni::{ + descriptors::Desc, + objects::JObject, + signature::{JavaType, Primitive, ReturnType}, + JavaVM, +}; +use std::error::Error; + +mod common; +use common::foo_class::*; + +#[test] +fn jni_access() -> Result<(), Box<dyn Error>> { + // Create the environment + let vm = JavaVM::new( + jni::InitArgsBuilder::new().version(jni::JNIVersion::V8).option("-Xcheck:jni").build()?, + )?; + let mut env = vm.attach_current_thread()?; + + // Load `Foo.class` + { + let foo_class = compile_foo()?; + let loaded_foo = env.define_class(CLASS_DESC, &JObject::null(), &foo_class)?; + let loaded_foo = env.auto_local(loaded_foo); + + let found_foo = FOO.lookup(&mut env)?; + assert!(env.is_same_object(&loaded_foo, found_foo.as_ref())?); + } + + // Verify we can call the constructor + let obj_foo = { + let method_id = CONSTRUCTOR.lookup(&mut env)?; + let args = &[jni::sys::jvalue { i: 123 }]; + // Safety: `args` must match the constructor arg count and types. + unsafe { env.new_object_unchecked(CONSTRUCTOR.cls(), method_id, args) }? + }; + assert!(env.is_instance_of(&obj_foo, &FOO)?); + + // Verify we can access all of the members + + let field_value = + { env.get_field_unchecked(&obj_foo, &FIELD, ReturnType::Primitive(Primitive::Int))?.i()? }; + assert_eq!(123, field_value); + + let method_value = { + let method_id = METHOD.lookup(&mut env)?; + let args = &[]; + // Safety: `args` must match the method arg count and types. + unsafe { + env.call_method_unchecked( + &obj_foo, + method_id, + ReturnType::Primitive(Primitive::Boolean), + args, + ) + }? + .z()? + }; + assert!(method_value); + + env.delete_local_ref(obj_foo)?; + + let static_field_value = { + env.get_static_field_unchecked(&FOO, &STATIC_FIELD, JavaType::Primitive(Primitive::Long))? + .j()? + }; + assert_eq!(321, static_field_value); + + let static_method_value = { + let method_id = STATIC_METHOD.lookup(&mut env)?; + let args = &[]; + // Safety: `args` must match the method arg count and types. + unsafe { + env.call_static_method_unchecked( + &FOO, + method_id, + ReturnType::Primitive(Primitive::Int), + args, + ) + }? + .i()? + }; + assert_eq!(3, static_method_value); + + Ok(()) +}
diff --git a/nearby/util/pourover/tests/jni_method_integration.rs b/nearby/util/pourover/tests/jni_method_integration.rs new file mode 100644 index 0000000..73d89d1 --- /dev/null +++ b/nearby/util/pourover/tests/jni_method_integration.rs
@@ -0,0 +1,156 @@ +// Copyright 2024 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 jni::{ + descriptors::Desc, + objects::{JObject, JString}, + signature::{Primitive, ReturnType}, + sys::jint, + JNIEnv, JavaVM, +}; +use std::error::Error; +use std::sync::atomic::{AtomicBool, Ordering}; + +mod common; +use common::foo_class::*; + +static NATIVE_METHOD_CALLED: AtomicBool = AtomicBool::new(false); +static TEST_PANIC: AtomicBool = AtomicBool::new(false); + +#[pourover::jni_method( + package = "com.example", + class = "Foo", + panic_returns = -1 +)] +extern "system" fn nativeReturnsInt<'local>( + mut env: JNIEnv<'local>, + this: JObject<'local>, + n: jint, +) -> jint { + NATIVE_METHOD_CALLED.store(true, Ordering::SeqCst); + + let foo_value = env + .get_field_unchecked(&this, &FIELD, ReturnType::Primitive(Primitive::Int)) + .unwrap() + .i() + .unwrap(); + + n * foo_value +} + +#[pourover::jni_method( + package = "com.example", + class = "Foo", + panic_returns = JObject::null().into(), +)] +extern "system" fn nativeReturnsObject<'local>( + env: JNIEnv<'local>, + _this: JObject<'local>, + n: jint, +) -> JString<'local> { + if TEST_PANIC.load(Ordering::SeqCst) { + panic!("testing panic case"); + } + env.new_string(n.to_string()).unwrap() +} + +#[test] +fn can_call_native_method() -> Result<(), Box<dyn Error>> { + // Create the environment + let vm = JavaVM::new( + jni::InitArgsBuilder::new().version(jni::JNIVersion::V8).option("-Xcheck:jni").build()?, + )?; + let mut env = vm.attach_current_thread()?; + + { + let foo_class = compile_foo()?; + let loaded_foo = env.define_class(CLASS_DESC, &JObject::null(), &foo_class)?; + env.delete_local_ref(loaded_foo)?; + } + + let obj_foo = { + let method_id = CONSTRUCTOR.lookup(&mut env)?; + let args = &[jni::sys::jvalue { i: 123 }]; + // Safety: `args` must match the constructor arg count and types. + unsafe { env.new_object_unchecked(CONSTRUCTOR.cls(), method_id, args) }? + }; + let obj_foo = env.auto_local(obj_foo); + + NATIVE_METHOD_CALLED.store(false, Ordering::SeqCst); + + // TODO: It would be better if the JVM was able to find the method on its own, + // but, since we are using the invocation API to create the JVM, I haven't found a way to make + // it visible to the JVM. Normally the methods are loaded dynamically with + // `System.loadLibrary`, but in this case the symbols already exist in the executable, and I'm + // unsure why the JVM cannot find them. I have tried compiling with + // `-Zexport-executable-symbols` but that wasn't working for me. + env.register_native_methods( + &FOO, + &[ + jni::NativeMethod { + name: "nativeReturnsInt".into(), + sig: "(I)I".into(), + fn_ptr: crate::nativeReturnsInt as *mut std::ffi::c_void, + }, + jni::NativeMethod { + name: "nativeReturnsObject".into(), + sig: "(I)Ljava/lang/String;".into(), + fn_ptr: crate::nativeReturnsObject as *mut std::ffi::c_void, + }, + ], + )?; + + let method_value = { + let method_id = NATIVE_METHOD.lookup(&mut env)?; + let args = &[jni::sys::jvalue { i: 3 }]; + // Safety: `args` must match the method arg count and types. + unsafe { + env.call_method_unchecked( + &obj_foo, + method_id, + ReturnType::Primitive(Primitive::Int), + args, + ) + }? + .i()? + }; + + assert_eq!(369, method_value); + assert!(NATIVE_METHOD_CALLED.load(Ordering::SeqCst)); + + TEST_PANIC.store(false, Ordering::SeqCst); + let string_value: JString = { + let method_id = NATIVE_OBJECT_METHOD.lookup(&mut env)?; + let args = &[jni::sys::jvalue { i: 1234 }]; + // Safety: `args` must match the method arg count and types. + unsafe { env.call_method_unchecked(&obj_foo, method_id, ReturnType::Object, args) }? + .l()? + .into() + }; + assert_eq!("1234", env.get_string(&string_value)?.to_str()?); + env.delete_local_ref(string_value)?; + + TEST_PANIC.store(true, Ordering::SeqCst); + let string_value: JString = { + let method_id = NATIVE_OBJECT_METHOD.lookup(&mut env)?; + let args = &[jni::sys::jvalue { i: 1234 }]; + // Safety: `args` must match the method arg count and types. + unsafe { env.call_method_unchecked(&obj_foo, method_id, ReturnType::Object, args) }? + .l()? + .into() + }; + assert!(string_value.is_null()); + + Ok(()) +}
diff --git a/nearby/util/pourover_macro/Cargo.toml b/nearby/util/pourover_macro/Cargo.toml new file mode 100644 index 0000000..ac230b1 --- /dev/null +++ b/nearby/util/pourover_macro/Cargo.toml
@@ -0,0 +1,11 @@ +[package] +name = "pourover_macro" +version.workspace = true +edition.workspace = true +publish.workspace = true + +[lib] +proc-macro = true + +[dependencies] +pourover_macro_core.workspace = true
diff --git a/nearby/util/pourover_macro/src/lib.rs b/nearby/util/pourover_macro/src/lib.rs new file mode 100644 index 0000000..9f62354 --- /dev/null +++ b/nearby/util/pourover_macro/src/lib.rs
@@ -0,0 +1,56 @@ +// 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 proc_macro; + +use pourover_macro_core as core; +use proc_macro::TokenStream; + +/// Export a function as a JNI native method. This will attach a `#[export_name = "..."]` attribute that +/// is formatted with the given parameters. +/// +/// # Parameters +/// - `package` (lit str): the Java package for the class being implemented +/// - `class` (lit str): the Java class being implemented. Use `Foo.Inner` syntax for inner +/// classes. +/// - `panic_returns` (expr): the value to return when a panic is encountered. This can not access +/// local variables. This may only be used with `panic=unwind` and will produce a compile error +/// otherwise. +/// +/// When using `panic_returns` function arguments must be [`std::panic::UnwindSafe`]. See +/// [`std::panic::catch_unwind`] for details. In practice this will not cause issues as JNI +/// arguments and return values are passed by pointer or value and not by Rust reference. +/// +/// # Example +/// ``` +/// # use pourover_macro::jni_method; +/// # #[allow(non_camel_case_types)] type jint = i32; // avoid jni dep for test +/// # type JNIEnv<'local> = *mut (); +/// # type JObject<'local> = *mut (); +/// +/// #[jni_method(package = "my.package", class = "Foo", panic_returns = -1)] +/// extern "system" fn getFoo<'local>( +/// mut env: JNIEnv<'local>, +/// this: JObject<'local>, +/// ) -> jint { +/// // ... +/// 0 +/// } +/// ``` +/// +/// This function will be exported with `#[export_name = "Java_my_package_Foo_getFoo"]`. +#[proc_macro_attribute] +pub fn jni_method(meta: TokenStream, item: TokenStream) -> TokenStream { + core::jni_method(meta.into(), item.into()).into() +}
diff --git a/nearby/util/pourover_macro_core/Cargo.toml b/nearby/util/pourover_macro_core/Cargo.toml new file mode 100644 index 0000000..04882d1 --- /dev/null +++ b/nearby/util/pourover_macro_core/Cargo.toml
@@ -0,0 +1,10 @@ +[package] +name = "pourover_macro_core" +version.workspace = true +edition.workspace = true +publish.workspace = true + +[dependencies] +proc-macro2.workspace = true +syn.workspace = true +quote.workspace = true
diff --git a/nearby/util/pourover_macro_core/src/jni_method.rs b/nearby/util/pourover_macro_core/src/jni_method.rs new file mode 100644 index 0000000..73ca155 --- /dev/null +++ b/nearby/util/pourover_macro_core/src/jni_method.rs
@@ -0,0 +1,346 @@ +// Copyright 2024 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 proc_macro2::TokenStream; +use quote::ToTokens; +use syn::{punctuated::Punctuated, spanned::Spanned, ItemFn, LitStr, Token}; + +mod meta; +mod meta_arg; +mod substitutions; + +use meta::JniMethodMeta; +use substitutions::substitute_method_chars; + +/// See `pourover_macro::jni_method` for usage. +pub fn jni_method(meta: TokenStream, item: TokenStream) -> TokenStream { + match jni_method_inner(meta, item) { + Ok(out) => out.to_token_stream(), + Err(err) => err.to_compile_error(), + } +} + +fn jni_method_inner(meta: TokenStream, item: TokenStream) -> syn::Result<impl ToTokens> { + let meta = syn::parse2::<JniMethodMeta>(meta)?; + let mut func = syn::parse2::<ItemFn>(item)?; + + // Check that ABI is set to `extern "system"` + if let Some(ref abi @ syn::Abi { name: Some(ref abi_name), .. }) = func.sig.abi { + if abi_name.value() != "system" { + return Err(syn::Error::new( + abi.span(), + "JNI methods are required to have the `extern \"system\"` ABI", + )); + } + } else { + return Err(syn::Error::new( + func.sig.span(), + "JNI methods are required to have the `extern \"system\"` ABI", + )); + } + + let export_attr = { + // Format the name of the function as expected by the JNI layer + let method_name = func.sig.ident.to_string(); + if method_name.starts_with("Java_") { + return Err(syn::Error::new( + func.sig.ident.span(), + "The `jni_method` attribute will perform the JNI name formatting", + )); + } + let method_name = substitute_method_chars(&method_name); + + // NOTE: doesn't handle overload suffix + let link_name = LitStr::new( + &format!("Java_{class}_{method_name}", class = &meta.class_desc), + func.sig.ident.span(), + ); + + syn::parse_quote! { #[export_name = #link_name] } + }; + let allow_attr = syn::parse_quote! { #[allow(non_snake_case)] }; + func.attrs.extend([export_attr, allow_attr]); + + // Add a panic handler if requested + if let Some(panic_returns) = meta.panic_returns { + let block = &func.block; + let return_type = &func.sig.output; + let mut lifetimes = Punctuated::new(); + for param in func.sig.generics.lifetimes() { + lifetimes.push_value(param.clone()); + lifetimes.push_punct(<Token![,]>::default()); + } + + let panic_check = quote::quote_spanned! { panic_returns.span() => + #[cfg(not(panic = "unwind"))] + ::core::compile_error!("Cannot use `panic_returns` with non-unwinding panic handler"); + }; + + func.block = syn::parse_quote! { + { + #panic_check + match ::std::panic::catch_unwind(move || { + #block + }) { + Ok(ret) => ret, + Err(_err) => { + fn __on_panic<#lifetimes>() #return_type { #panic_returns } + __on_panic() + }, + } + } + }; + } + + // Return the modified function + Ok(func) +} + +#[cfg(test)] +mod tests { + use super::*; + use proc_macro2::{TokenStream, TokenTree}; + use quote::quote; + + fn contains_ident(stream: TokenStream, ident: &str) -> bool { + /// Iterator that traverses TokenTree:Group structures in preorder. + struct FlatStream { + streams: Vec<<TokenStream as IntoIterator>::IntoIter>, + } + + impl FlatStream { + fn new(stream: TokenStream) -> Self { + Self { streams: vec![stream.into_iter()] } + } + } + + impl Iterator for FlatStream { + type Item = TokenTree; + + fn next(&mut self) -> Option<TokenTree> { + let next = loop { + let stream = self.streams.last_mut()?; + if let Some(next) = stream.next() { + break next; + } + self.streams.pop(); + }; + + if let TokenTree::Group(group) = &next { + self.streams.push(group.stream().into_iter()); + } + + Some(next) + } + } + + FlatStream::new(stream) + .filter_map(|tree| { + let TokenTree::Ident(ident) = tree else { return None }; + Some(ident.to_string()) + }) + .any(|ident_str| ident_str == ident) + } + + #[test] + fn can_parse() { + let meta = quote! { + package = "com.example", + class = "Foo.Inner", + panic_returns = false, + }; + + let func = quote! { + extern "system" fn nativeFoo<'local>( + mut env: JNIEnv<'local>, + this: JObject<'local> + ) -> jint { + 123 + } + }; + + let out = jni_method(meta, func); + + assert!(contains_ident(out, "catch_unwind")); + } + + fn parse_example_output() -> syn::ItemFn { + let meta = quote! { + package = "com.example", + class = "Foo.Inner", + panic_returns = false, + }; + + let func = quote! { + extern "system" fn nativeFoo<'local>( + mut env: JNIEnv<'local>, + this: JObject<'local> + ) -> jint { + 123 + } + }; + + syn::parse2(jni_method(meta, func)).expect("Proc macro output should be a function item") + } + + #[test] + fn check_output_is_itemfn() { + let _item_fn = parse_example_output(); + } + + #[test] + fn check_output_export_name() { + let out = parse_example_output(); + + let export_name = out + .attrs + .iter() + .find_map(|attr| { + let syn::Meta::NameValue(nv) = &attr.meta else { + return None; + }; + if !nv.path.is_ident("export_name") { + return None; + } + let syn::Expr::Lit(syn::ExprLit { lit: syn::Lit::Str(lit_str), .. }) = &nv.value + else { + return None; + }; + Some(lit_str.value()) + }) + .expect("Failed to find `export_name` attribute"); + assert_eq!("Java_com_example_Foo_00024Inner_nativeFoo", export_name); + } + + #[test] + fn check_output_allow_non_snake_case() { + let out = parse_example_output(); + + let _allow_attr = out + .attrs + .iter() + .find(|attr| { + let syn::Meta::List(ml) = &attr.meta else { + return false; + }; + if !ml.path.is_ident("allow") { + return false; + } + let Ok(value) = syn::parse2::<syn::Path>(ml.tokens.clone()) else { + return false; + }; + value.is_ident("non_snake_case") + }) + .expect("Failed to find `allow(non_snake_case)` attribute"); + } + + #[test] + fn no_panic_returns() { + let meta = quote! { + package = "com.example", + class = "Foo.Inner", + }; + + let func = quote! { + extern "system" fn nativeFoo<'local>( + mut env: JNIEnv<'local>, + this: JObject<'local> + ) -> jint { + 123 + } + }; + + let out = jni_method(meta, func); + assert!(!contains_ident(out.clone(), "compile_error")); + assert!(!contains_ident(out, "catch_unwind")); + } + + #[test] + fn missing_extern() { + let meta = quote! { + package = "com.example", + class = "Foo.Inner", + panic_returns = false, + }; + + let func = quote! { + fn nativeFoo<'local>( + mut env: JNIEnv<'local>, + this: JObject<'local> + ) -> jint { + 123 + } + }; + + let Err(err) = jni_method_inner(meta, func) else { + panic!("Should fail to generate code"); + }; + + assert!(err + .to_string() + .contains("JNI methods are required to have the `extern \"system\"` ABI")); + } + + #[test] + fn wrong_extern() { + let meta = quote! { + package = "com.example", + class = "Foo.Inner", + panic_returns = false, + }; + + let func = quote! { + extern "C" fn nativeFoo<'local>( + mut env: JNIEnv<'local>, + this: JObject<'local> + ) -> jint { + 123 + } + }; + + let Err(err) = jni_method_inner(meta, func) else { + panic!("Should fail to generate code"); + }; + + assert!(err + .to_string() + .contains("JNI methods are required to have the `extern \"system\"` ABI")); + } + + #[test] + fn already_mangled() { + let meta = quote! { + package = "com.example", + class = "Foo.Inner", + panic_returns = false, + }; + + let func = quote! { + extern "system" fn Java_com_example_Foo_00024Inner_nativeFoo<'local>( + mut env: JNIEnv<'local>, + this: JObject<'local> + ) -> jint { + 123 + } + }; + + let Err(err) = jni_method_inner(meta, func) else { + panic!("Should fail to generate code"); + }; + + assert!(err + .to_string() + .contains("The `jni_method` attribute will perform the JNI name formatting")); + } +}
diff --git a/nearby/util/pourover_macro_core/src/jni_method/meta.rs b/nearby/util/pourover_macro_core/src/jni_method/meta.rs new file mode 100644 index 0000000..1e07edd --- /dev/null +++ b/nearby/util/pourover_macro_core/src/jni_method/meta.rs
@@ -0,0 +1,179 @@ +// Copyright 2024 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 syn::{ + parse::{Parse, ParseStream}, + Expr, Token, +}; + +use super::meta_arg::MetaArg; +use super::substitutions::{substitute_class_chars, substitute_package_chars}; + +pub struct JniMethodMeta { + /// The class descriptor in [export_name format](https://docs.oracle.com/javase/8/docs/technotes/guides/jni/spec/design.html#resolving_native_method_names) + pub class_desc: String, + /// The expression to run when a panic is encountered. The value of this expression will be + /// returned by the annotated function. + pub panic_returns: Option<Expr>, +} + +impl Parse for JniMethodMeta { + fn parse(stream: ParseStream<'_>) -> syn::Result<Self> { + let mut package = None; + let mut class = None; + let mut panic_returns = None; + + type Structure = syn::punctuated::Punctuated<MetaArg, Token![,]>; + + for arg in Structure::parse_terminated(stream)? { + match arg { + MetaArg::Package { package_token, value, .. } => { + if let Some(_old) = package.replace(value) { + return Err(syn::Error::new( + package_token.span, + "`package` should not be specified twice", + )); + } + } + MetaArg::Class { class_token, value, .. } => { + if let Some(_old) = class.replace(value) { + return Err(syn::Error::new( + class_token.span, + "`class` should not be specified twice", + )); + } + } + MetaArg::PanicReturns { panic_returns_token, value, .. } => { + if let Some(_old) = panic_returns.replace(value) { + return Err(syn::Error::new( + panic_returns_token.span, + "`panic_returns` should not be specified twice", + )); + } + } + } + } + + let Some(package) = package else { + return Err(syn::Error::new(stream.span(), "`package` is required")); + }; + + let Some(class) = class else { + return Err(syn::Error::new(stream.span(), "`class` is required")); + }; + + let package = { + let package_str = package.value(); + if package_str.contains('/') { + return Err(syn::Error::new( + stream.span(), + "`package` should use '.' as a separator", + )); + } + substitute_package_chars(&package_str) + }; + let class = substitute_class_chars(&class.value()); + let class_desc = format!("{package}_{class}"); + + Ok(Self { class_desc, panic_returns }) + } +} + +#[cfg(test)] +mod tests { + use super::*; + use syn::parse_quote; + + #[test] + fn can_parse() { + let meta: JniMethodMeta = parse_quote! { + package = "com.example", + class = "Foo.Inner", + panic_returns = false, + }; + assert_eq!("com_example_Foo_00024Inner", &meta.class_desc); + assert!(meta.panic_returns.is_some()); + } + + #[test] + fn can_parse_missing_panic_returns() { + let meta: JniMethodMeta = parse_quote! { + package = "com.example", + class = "Foo.Inner", + }; + assert_eq!("com_example_Foo_00024Inner", &meta.class_desc); + assert!(meta.panic_returns.is_none()); + } + + #[test] + #[should_panic] + fn double_package() { + let _: JniMethodMeta = parse_quote! { + package = "com.example", + package = "com.example", + class = "Foo.Inner", + panic_returns = false, + }; + } + + #[test] + #[should_panic] + fn package_uses_slashes() { + let _: JniMethodMeta = parse_quote! { + package = "com/example", + class = "Foo.Inner", + panic_returns = false, + }; + } + + #[test] + #[should_panic] + fn missing_package() { + let _: JniMethodMeta = parse_quote! { + class = "Foo.Inner", + panic_returns = false, + }; + } + + #[test] + #[should_panic] + fn double_class() { + let _: JniMethodMeta = parse_quote! { + package = "com.example", + class = "Foo.Inner", + class = "Foo.Inner", + panic_returns = false, + }; + } + + #[test] + #[should_panic] + fn missing_class() { + let _: JniMethodMeta = parse_quote! { + package = "com.example", + panic_returns = false, + }; + } + + #[test] + #[should_panic] + fn double_panic_returns() { + let _: JniMethodMeta = parse_quote! { + package = "com.example", + class = "Foo.Inner", + panic_returns = false, + panic_returns = false, + }; + } +}
diff --git a/nearby/util/pourover_macro_core/src/jni_method/meta_arg.rs b/nearby/util/pourover_macro_core/src/jni_method/meta_arg.rs new file mode 100644 index 0000000..aa28aa1 --- /dev/null +++ b/nearby/util/pourover_macro_core/src/jni_method/meta_arg.rs
@@ -0,0 +1,92 @@ +// Copyright 2024 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 syn::{ + parse::{Parse, ParseStream}, + Expr, LitStr, Token, +}; + +/// Custom keywords +pub mod kw { + syn::custom_keyword!(package); + syn::custom_keyword!(class); + syn::custom_keyword!(panic_returns); +} + +/// Arguments to the attribute +pub enum MetaArg { + Package { package_token: kw::package, _eq_token: Token![=], value: LitStr }, + Class { class_token: kw::class, _eq_token: Token![=], value: LitStr }, + PanicReturns { panic_returns_token: kw::panic_returns, _eq_token: Token![=], value: Expr }, +} + +impl Parse for MetaArg { + fn parse(stream: ParseStream<'_>) -> syn::Result<Self> { + let lookahead = stream.lookahead1(); + if lookahead.peek(kw::package) { + Ok(MetaArg::Package { + package_token: stream.parse::<kw::package>()?, + _eq_token: stream.parse()?, + value: stream.parse()?, + }) + } else if lookahead.peek(kw::class) { + Ok(MetaArg::Class { + class_token: stream.parse::<kw::class>()?, + _eq_token: stream.parse()?, + value: stream.parse()?, + }) + } else if lookahead.peek(kw::panic_returns) { + Ok(MetaArg::PanicReturns { + panic_returns_token: stream.parse::<kw::panic_returns>()?, + _eq_token: stream.parse()?, + value: stream.parse()?, + }) + } else { + Err(lookahead.error()) + } + } +} + +#[cfg(test)] +mod tests { + use super::*; + use syn::parse_quote; + + #[test] + fn parse_meta_arg_package() { + let MetaArg::Package { value, .. } = parse_quote!(package = "com.example") else { + panic!("failed to parse") + }; + + assert_eq!("com.example", value.value()); + } + + #[test] + fn parse_meta_arg_class() { + let MetaArg::Class { value, .. } = parse_quote!(class = "Foo") else { + panic!("failed to parse") + }; + + assert_eq!("Foo", value.value()); + } + + #[test] + fn parse_meta_arg_panic_returns() { + let MetaArg::PanicReturns { value, .. } = parse_quote!(panic_returns = { foo() }) else { + panic!("failed to parse") + }; + + let syn::Expr::Block(_) = value else { panic!("not a block expression") }; + } +}
diff --git a/nearby/util/pourover_macro_core/src/jni_method/substitutions.rs b/nearby/util/pourover_macro_core/src/jni_method/substitutions.rs new file mode 100644 index 0000000..229bb5d --- /dev/null +++ b/nearby/util/pourover_macro_core/src/jni_method/substitutions.rs
@@ -0,0 +1,123 @@ +// Copyright 2024 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. + +//! Name substitutions for JNI name mangling. See +//! <https://docs.oracle.com/javase/8/docs/technotes/guides/jni/spec/design.html#resolving_native_method_names> +//! for spec details. + +pub fn substitute_method_chars(s: &str) -> String { + s.chars() + .flat_map(|c| -> CharIter { + match c { + '$' => "_00024".into(), + '_' => "_1".into(), + _ => c.into(), + } + }) + .collect() +} + +pub fn substitute_package_chars(s: &str) -> String { + s.chars() + .flat_map(|c| -> CharIter { + match c { + '.' => "_".into(), + '$' => "_00024".into(), + '_' => "_1".into(), + _ => c.into(), + } + }) + .collect() +} + +pub fn substitute_class_chars(s: &str) -> String { + s.chars() + .flat_map(|c| -> CharIter { + match c { + // Use dot or dollar for inner classes: `'.' -> '$' -> "_00024"` + '.' | '$' => "_00024".into(), + '_' => "_1".into(), + _ => c.into(), + } + }) + .collect() +} + +/// A `char` iterator that can be created from either a `char` or a `&'static str`. +enum CharIter { + One(core::option::IntoIter<char>), + Many(core::str::Chars<'static>), +} + +impl Iterator for CharIter { + type Item = char; + fn next(&mut self) -> Option<char> { + match *self { + Self::One(ref mut iter) => iter.next(), + Self::Many(ref mut iter) => iter.next(), + } + } +} + +impl From<char> for CharIter { + fn from(c: char) -> Self { + Self::One(Some(c).into_iter()) + } +} + +impl From<&'static str> for CharIter { + fn from(s: &'static str) -> Self { + Self::Many(s.chars()) + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_char_iter_one() { + let seq = CharIter::from('a').collect::<String>(); + assert_eq!("a", &seq); + } + + #[test] + fn test_char_iter_many() { + let seq = CharIter::from("asdf").collect::<String>(); + assert_eq!("asdf", &seq); + } + + #[test] + fn test_substitute_method_chars() { + let mangled = substitute_method_chars("method_with_under$cores"); + assert_eq!("method_1with_1under_00024cores", &mangled); + } + + #[test] + fn test_substitute_package_chars() { + let mangled = substitute_package_chars("com.weird_name.java"); + assert_eq!("com_weird_1name_java", &mangled); + } + + #[test] + fn test_substitute_class_chars() { + // Both dot and dollar should work here + + let mangled = substitute_class_chars("Foo.Inner"); + assert_eq!("Foo_00024Inner", &mangled); + + let mangled = substitute_class_chars("Foo$Inner"); + assert_eq!("Foo_00024Inner", &mangled); + } +}
diff --git a/nearby/connections/connections_adv/connections_adv/src/lib.rs b/nearby/util/pourover_macro_core/src/lib.rs similarity index 63% copy from nearby/connections/connections_adv/connections_adv/src/lib.rs copy to nearby/util/pourover_macro_core/src/lib.rs index 4cfcdfa..ae06345 100644 --- a/nearby/connections/connections_adv/connections_adv/src/lib.rs +++ b/nearby/util/pourover_macro_core/src/lib.rs
@@ -1,4 +1,4 @@ -// Copyright 2023 Google LLC +// Copyright 2024 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -12,20 +12,5 @@ // See the License for the specific language governing permissions and // limitations under the License. -//! Placeholder crate for connections advertisements - -/// placeholder -pub fn add(left: usize, right: usize) -> usize { - left + right -} - -#[cfg(test)] -mod tests { - use super::*; - - #[test] - fn it_works() { - let result = add(2, 2); - assert_eq!(result, 4); - } -} +mod jni_method; +pub use jni_method::jni_method;
diff --git a/third_party/abseil-cpp b/third_party/abseil-cpp new file mode 160000 index 0000000..d87dc03 --- /dev/null +++ b/third_party/abseil-cpp
@@ -0,0 +1 @@ +Subproject commit d87dc03cee90a0cac2dbf254217b346ca693bb83
diff --git a/third_party/benchmark b/third_party/benchmark new file mode 160000 index 0000000..3d85343 --- /dev/null +++ b/third_party/benchmark
@@ -0,0 +1 @@ +Subproject commit 3d85343d65832d05b4dcd6666640e0e38b981c33
diff --git a/third_party/boringssl b/third_party/boringssl new file mode 160000 index 0000000..ab4037e --- /dev/null +++ b/third_party/boringssl
@@ -0,0 +1 @@ +Subproject commit ab4037e3d14b2b1e02c93f76d80a8dd0ce3193fc
diff --git a/third_party/fuzztest b/third_party/fuzztest new file mode 160000 index 0000000..e6aca36 --- /dev/null +++ b/third_party/fuzztest
@@ -0,0 +1 @@ +Subproject commit e6aca366a1c71b4a2d0c4d71b2040cc9b87a9ca4