Project import generated by Copybara.

GitOrigin-RevId: 638e64d988d739f6fdd113340d865c26088f936d
Change-Id: Iad9ac5ae93b524d2de9ae7ab24f504f9bd913d85
diff --git a/nearby/Cargo.lock b/nearby/Cargo.lock
index 637c67d..31aaf06 100644
--- a/nearby/Cargo.lock
+++ b/nearby/Cargo.lock
@@ -16,9 +16,9 @@
 
 [[package]]
 name = "aead"
-version = "0.5.1"
+version = "0.5.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5c192eb8f11fc081b0fe4259ba5af04217d4e0faddd02417310a927911abd7c8"
+checksum = "d122413f284cf2d62fb1b7db97e02edb8cda96d769b16e443a4f6195e35662b0"
 dependencies = [
  "bytes",
  "crypto-common",
@@ -53,9 +53,9 @@
 
 [[package]]
 name = "aho-corasick"
-version = "0.7.20"
+version = "1.0.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cc936419f96fa211c1b9166887b38e5e40b19958e5b895be7c1f93adec7071ac"
+checksum = "67fc08ce920c31afb70f013dcce1bfc3a3195de6a228474e45e1f145b36f8d04"
 dependencies = [
  "memchr",
 ]
@@ -73,6 +73,55 @@
 checksum = "4b46cbb362ab8752921c97e041f5e366ee6297bd428a31275b9fcf1e380f7299"
 
 [[package]]
+name = "anstream"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6342bd4f5a1205d7f41e94a41a901f5647c938cdfa96036338e8533c9d6c2450"
+dependencies = [
+ "anstyle",
+ "anstyle-parse",
+ "anstyle-query",
+ "anstyle-wincon",
+ "colorchoice",
+ "is-terminal",
+ "utf8parse",
+]
+
+[[package]]
+name = "anstyle"
+version = "1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "41ed9a86bf92ae6580e0a31281f65a1b1d867c0cc68d5346e2ae128dddfa6a7d"
+
+[[package]]
+name = "anstyle-parse"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e765fd216e48e067936442276d1d57399e37bce53c264d6fefbe298080cb57ee"
+dependencies = [
+ "utf8parse",
+]
+
+[[package]]
+name = "anstyle-query"
+version = "1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5ca11d4be1bab0c8bc8734a9aa7bf4ee8316d462a08c6ac5052f888fef5b494b"
+dependencies = [
+ "windows-sys 0.48.0",
+]
+
+[[package]]
+name = "anstyle-wincon"
+version = "1.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "180abfa45703aebe0093f79badacc01b8fd4ea2e35118747e5811127f926e188"
+dependencies = [
+ "anstyle",
+ "windows-sys 0.48.0",
+]
+
+[[package]]
 name = "anyhow"
 version = "1.0.70"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -105,9 +154,9 @@
 
 [[package]]
 name = "base16ct"
-version = "0.1.1"
+version = "0.2.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "349a06037c7bf932dd7e7d1f653678b2038b9ad46a74102f1fc7bd7872678cce"
+checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf"
 
 [[package]]
 name = "base64"
@@ -153,14 +202,18 @@
 
 [[package]]
 name = "block-padding"
-version = "0.3.2"
+version = "0.3.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0a90ec2df9600c28a01c56c4784c9207a96d2451833aeceb8cc97e4c9548bb78"
+checksum = "a8894febbff9f758034a5b8e12d87918f56dfc64a8e1fe757d65e29041538d93"
 dependencies = [
  "generic-array",
 ]
 
 [[package]]
+name = "bssl-crypto"
+version = "0.1.0"
+
+[[package]]
 name = "bssl-sys"
 version = "0.1.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -168,9 +221,9 @@
 
 [[package]]
 name = "bumpalo"
-version = "3.12.0"
+version = "3.12.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0d261e256854913907f67ed06efbc3338dfe6179796deefc1ff763fc1aee5535"
+checksum = "9b1ce199063694f33ffb7dd4e0ee620741495c32833cde5aa08f02a0bf96f0c8"
 
 [[package]]
 name = "byteorder"
@@ -268,29 +321,38 @@
 
 [[package]]
 name = "clap"
-version = "4.1.13"
+version = "4.2.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3c911b090850d79fc64fe9ea01e28e465f65e821e08813ced95bced72f7a8a9b"
+checksum = "956ac1f6381d8d82ab4684768f89c0ea3afe66925ceadb4eeb3fc452ffc55d62"
 dependencies = [
- "bitflags",
+ "clap_builder",
  "clap_derive",
- "clap_lex 0.3.3",
- "is-terminal",
  "once_cell",
+]
+
+[[package]]
+name = "clap_builder"
+version = "4.2.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "84080e799e54cff944f4b4a4b0e71630b0e0443b25b985175c7dddc1a859b749"
+dependencies = [
+ "anstream",
+ "anstyle",
+ "bitflags",
+ "clap_lex 0.4.1",
  "strsim",
- "termcolor",
 ]
 
 [[package]]
 name = "clap_derive"
-version = "4.1.12"
+version = "4.2.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9a932373bab67b984c790ddf2c9ca295d8e3af3b7ef92de5a5bacdccdee4b09b"
+checksum = "3f9644cd56d6b87dbe899ef8b053e331c0637664e9e21a33dfcdc36093f5c5c4"
 dependencies = [
  "heck",
  "proc-macro2",
  "quote",
- "syn 2.0.10",
+ "syn 2.0.15",
 ]
 
 [[package]]
@@ -304,12 +366,15 @@
 
 [[package]]
 name = "clap_lex"
-version = "0.3.3"
+version = "0.4.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "033f6b7a4acb1f358c742aaca805c939ee73b4c6209ae4318ec7aca81c42e646"
-dependencies = [
- "os_str_bytes",
-]
+checksum = "8a2dd5a6fe8c6e3502f568a6353e5273bbb15193ad9a89e457b9970798efbea1"
+
+[[package]]
+name = "colorchoice"
+version = "1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7"
 
 [[package]]
 name = "combine"
@@ -329,9 +394,9 @@
 
 [[package]]
 name = "cpufeatures"
-version = "0.2.6"
+version = "0.2.7"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "280a9f2d8b3a38871a3c8a46fb80db65e5e5ed97da80c4d08bf27fb63e35e181"
+checksum = "3e4c1eaa2012c47becbbad2ab175484c2a84d1185b566fb2cc5b8707343dfe58"
 dependencies = [
  "libc",
 ]
@@ -383,9 +448,9 @@
 
 [[package]]
 name = "crossbeam-channel"
-version = "0.5.7"
+version = "0.5.8"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cf2b3e8478797446514c91ef04bafcb59faba183e621ad488df88983cc14128c"
+checksum = "a33c2bf77f2df06183c3aa30d1e96c0695a313d4f9c453cc3762a6db39f99200"
 dependencies = [
  "cfg-if",
  "crossbeam-utils",
@@ -426,9 +491,9 @@
 
 [[package]]
 name = "crypto-bigint"
-version = "0.4.9"
+version = "0.5.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ef2b4b23cddf68b89b8f8069890e8c270d54e2d5fe1b143820234805e4cb17ef"
+checksum = "7c2538c4e68e52548bacb3e83ac549f903d44f011ac9d5abb5e132e67d0808f7"
 dependencies = [
  "generic-array",
  "rand_core 0.6.4",
@@ -466,6 +531,26 @@
 ]
 
 [[package]]
+name = "crypto_provider_boringssl"
+version = "0.1.0"
+dependencies = [
+ "bssl-crypto",
+ "crypto_provider",
+ "crypto_provider_stubs",
+]
+
+[[package]]
+name = "crypto_provider_default"
+version = "0.1.0"
+dependencies = [
+ "cfg-if",
+ "crypto_provider",
+ "crypto_provider_boringssl",
+ "crypto_provider_openssl",
+ "crypto_provider_rustcrypto",
+]
+
+[[package]]
 name = "crypto_provider_openssl"
 version = "0.1.0"
 dependencies = [
@@ -504,6 +589,13 @@
 ]
 
 [[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"
@@ -529,18 +621,9 @@
 
 [[package]]
 name = "der"
-version = "0.6.1"
+version = "0.7.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f1a467a65c5e759bce6e65eaf91cc29f466cdc57cb65777bd646872a8a1fd4de"
-dependencies = [
- "const-oid",
-]
-
-[[package]]
-name = "der"
-version = "0.7.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "82b10af9f9f9f2134a42d3f8aa74658660f2e0234b0eb81bd171df8aa32779ed"
+checksum = "86b14af2045fa69ed2b7a48934bebb842d0f33e73e96e78766ecb14bb5347a11"
 dependencies = [
  "const-oid",
  "zeroize",
@@ -548,9 +631,9 @@
 
 [[package]]
 name = "derive-getters"
-version = "0.2.0"
+version = "0.2.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0c5905670fd9c320154f3a4a01c9e609733cd7b753f3c58777ab7d5ce26686b3"
+checksum = "0122f262bf9c9a367829da84f808d9fb128c10ef283bbe7b0922a77cf07b2747"
 dependencies = [
  "proc-macro2",
  "quote",
@@ -606,13 +689,12 @@
 
 [[package]]
 name = "elliptic-curve"
-version = "0.12.3"
+version = "0.13.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e7bb888ab5300a19b8e5bceef25ac745ad065f3c9f7efc6de1b91958110891d3"
+checksum = "75c71eaa367f2e5d556414a8eea812bc62985c879748d6403edabd9cb03f16e7"
 dependencies = [
  "base16ct",
  "crypto-bigint",
- "der 0.6.1",
  "digest",
  "ff",
  "generic-array",
@@ -626,13 +708,13 @@
 
 [[package]]
 name = "errno"
-version = "0.2.8"
+version = "0.3.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f639046355ee4f37944e44f60642c6f3a7efa3cf6b78c78a0d989a8ce6c396a1"
+checksum = "4bcfec3a70f97c962c307b2d2c56e358cf1d00b558d74262b5f929ee8cc7e73a"
 dependencies = [
  "errno-dragonfly",
  "libc",
- "winapi",
+ "windows-sys 0.48.0",
 ]
 
 [[package]]
@@ -656,9 +738,9 @@
 
 [[package]]
 name = "ff"
-version = "0.12.1"
+version = "0.13.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d013fc25338cc558c5c2cfbad646908fb23591e2404481826742b651c9af7160"
+checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449"
 dependencies = [
  "rand_core 0.6.4",
  "subtle",
@@ -697,9 +779,9 @@
 
 [[package]]
 name = "futures"
-version = "0.3.27"
+version = "0.3.28"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "531ac96c6ff5fd7c62263c5e3c67a603af4fcaee2e1a0ae5565ba3a11e69e549"
+checksum = "23342abe12aba583913b2e62f22225ff9c950774065e4bfb61a19cd9770fec40"
 dependencies = [
  "futures-channel",
  "futures-core",
@@ -712,9 +794,9 @@
 
 [[package]]
 name = "futures-channel"
-version = "0.3.27"
+version = "0.3.28"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "164713a5a0dcc3e7b4b1ed7d3b433cabc18025386f9339346e8daf15963cf7ac"
+checksum = "955518d47e09b25bbebc7a18df10b81f0c766eaf4c4f1cccef2fca5f2a4fb5f2"
 dependencies = [
  "futures-core",
  "futures-sink",
@@ -722,15 +804,15 @@
 
 [[package]]
 name = "futures-core"
-version = "0.3.27"
+version = "0.3.28"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "86d7a0c1aa76363dac491de0ee99faf6941128376f1cf96f07db7603b7de69dd"
+checksum = "4bca583b7e26f571124fe5b7561d49cb2868d79116cfa0eefce955557c6fee8c"
 
 [[package]]
 name = "futures-executor"
-version = "0.3.27"
+version = "0.3.28"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1997dd9df74cdac935c76252744c1ed5794fac083242ea4fe77ef3ed60ba0f83"
+checksum = "ccecee823288125bd88b4d7f565c9e58e41858e47ab72e8ea2d64e93624386e0"
 dependencies = [
  "futures-core",
  "futures-task",
@@ -739,32 +821,32 @@
 
 [[package]]
 name = "futures-io"
-version = "0.3.27"
+version = "0.3.28"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "89d422fa3cbe3b40dca574ab087abb5bc98258ea57eea3fd6f1fa7162c778b91"
+checksum = "4fff74096e71ed47f8e023204cfd0aa1289cd54ae5430a9523be060cdb849964"
 
 [[package]]
 name = "futures-macro"
-version = "0.3.27"
+version = "0.3.28"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3eb14ed937631bd8b8b8977f2c198443447a8355b6e3ca599f38c975e5a963b6"
+checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 1.0.109",
+ "syn 2.0.15",
 ]
 
 [[package]]
 name = "futures-sink"
-version = "0.3.27"
+version = "0.3.28"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ec93083a4aecafb2a80a885c9de1f0ccae9dbd32c2bb54b0c3a65690e0b8d2f2"
+checksum = "f43be4fe21a13b9781a69afa4985b0f6ee0e1afab2c6f454a8cf30e2b2237b6e"
 
 [[package]]
 name = "futures-task"
-version = "0.3.27"
+version = "0.3.28"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fd65540d33b37b16542a0438c12e6aeead10d4ac5d05bd3f805b8f35ab592879"
+checksum = "76d3d132be6c0e6aa1534069c705a74a5997a356c0dc2f86a47765e5617c5b65"
 
 [[package]]
 name = "futures-timer"
@@ -774,9 +856,9 @@
 
 [[package]]
 name = "futures-util"
-version = "0.3.27"
+version = "0.3.28"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3ef6b17e481503ec85211fed8f39d1970f128935ca1f814cd32ac4a6842e84ab"
+checksum = "26b01e40b772d54cf6c6d721c1d1abd0647a0106a12ecaa1c186273392a69533"
 dependencies = [
  "futures-channel",
  "futures-core",
@@ -792,19 +874,20 @@
 
 [[package]]
 name = "generic-array"
-version = "0.14.6"
+version = "0.14.7"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bff49e947297f3312447abdca79f45f4738097cc82b06e72054d2223f601f1b9"
+checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a"
 dependencies = [
  "typenum",
  "version_check",
+ "zeroize",
 ]
 
 [[package]]
 name = "getrandom"
-version = "0.2.8"
+version = "0.2.9"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c05aeb6a22b8f62540c194aac980f2115af067bfe15a0734d7277a768d396b31"
+checksum = "c85e1d9ab2eadba7e5040d4e09cbd6d072b76a557ad64e797c2cb9d4da21d7e4"
 dependencies = [
  "cfg-if",
  "libc",
@@ -813,9 +896,9 @@
 
 [[package]]
 name = "group"
-version = "0.12.1"
+version = "0.13.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5dfbfb3a6cfbd390d5c9564ab283a0349b9b9fcd46a706c1eb10e0db70bfbac7"
+checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63"
 dependencies = [
  "ff",
  "rand_core 0.6.4",
@@ -939,25 +1022,25 @@
 
 [[package]]
 name = "io-lifetimes"
-version = "1.0.9"
+version = "1.0.10"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "09270fd4fa1111bc614ed2246c7ef56239a3063d5be0d1ec3b589c505d400aeb"
+checksum = "9c66c74d2ae7e79a5a8f7ac924adbe38ee42a859c6539ad869eb51f0b52dc220"
 dependencies = [
  "hermit-abi 0.3.1",
  "libc",
- "windows-sys 0.45.0",
+ "windows-sys 0.48.0",
 ]
 
 [[package]]
 name = "is-terminal"
-version = "0.4.5"
+version = "0.4.7"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8687c819457e979cc940d09cb16e42a1bf70aa6b60a549de6d3a62a0ee90c69e"
+checksum = "adcf93614601c8129ddf72e2d5633df827ba6551541c6d8c59520a371475be1f"
 dependencies = [
  "hermit-abi 0.3.1",
  "io-lifetimes",
  "rustix",
- "windows-sys 0.45.0",
+ "windows-sys 0.48.0",
 ]
 
 [[package]]
@@ -1023,9 +1106,10 @@
  "anyhow",
  "base64 0.21.0",
  "blake2",
- "clap 4.1.13",
+ "clap 4.2.4",
  "criterion",
  "crypto_provider",
+ "crypto_provider_default",
  "crypto_provider_rustcrypto",
  "ctr",
  "hdrhistogram",
@@ -1050,6 +1134,7 @@
  "base64 0.21.0",
  "criterion",
  "crypto_provider",
+ "crypto_provider_default",
  "crypto_provider_openssl",
  "crypto_provider_rustcrypto",
  "hex",
@@ -1073,9 +1158,9 @@
 
 [[package]]
 name = "libc"
-version = "0.2.140"
+version = "0.2.142"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "99227334921fae1a979cf0bfdfcc6b3e5ce376ef57e16fb6fb3ea2ed6095f80c"
+checksum = "6a987beff54b60ffa6d51982e1aa1146bc42f19bd26be28b0586f252fccf5317"
 
 [[package]]
 name = "libm"
@@ -1085,9 +1170,9 @@
 
 [[package]]
 name = "linux-raw-sys"
-version = "0.1.4"
+version = "0.3.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f051f77a7c8e6957c0696eac88f26b0117e54f52d3fc682ab19397a8812846a4"
+checksum = "36eb31c1778188ae1e64398743890d0877fef36d11521ac60406b42016e8c2cf"
 
 [[package]]
 name = "lock_api"
@@ -1155,7 +1240,7 @@
  "anyhow",
  "criterion",
  "crypto_provider",
- "crypto_provider_rustcrypto",
+ "crypto_provider_default",
  "hex",
  "ldt",
  "rand",
@@ -1225,9 +1310,9 @@
 
 [[package]]
 name = "openssl"
-version = "0.10.48"
+version = "0.10.51"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "518915b97df115dd36109bfa429a48b8f737bd05508cf9588977b599648926d2"
+checksum = "97ea2d98598bf9ada7ea6ee8a30fb74f9156b63bbe495d64ec2b87c269d2dda3"
 dependencies = [
  "bitflags",
  "cfg-if",
@@ -1240,22 +1325,21 @@
 
 [[package]]
 name = "openssl-macros"
-version = "0.1.0"
+version = "0.1.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b501e44f11665960c7e7fcf062c7d96a14ade4aa98116c004b2e37b5be7d736c"
+checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 1.0.109",
+ "syn 2.0.15",
 ]
 
 [[package]]
 name = "openssl-sys"
-version = "0.9.83"
+version = "0.9.86"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "666416d899cf077260dac8698d60a60b435a46d57e82acb1be3d0dad87284e5b"
+checksum = "992bac49bdbab4423199c654a5515bd2a6c6a23bf03f2dd3bdb7e5ae6259bc69"
 dependencies = [
- "autocfg",
  "bssl-sys",
  "cc",
  "libc",
@@ -1294,9 +1378,9 @@
 
 [[package]]
 name = "p256"
-version = "0.12.0"
+version = "0.13.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "49c124b3cbce43bcbac68c58ec181d98ed6cc7e6d0aa7c3ba97b2563410b0e55"
+checksum = "c9863ad85fa8f4460f9c48cb909d38a0d689dba1f6f6988a5e3e0d31071bcd4b"
 dependencies = [
  "elliptic-curve",
  "primeorder",
@@ -1330,7 +1414,7 @@
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7"
 dependencies = [
- "der 0.7.3",
+ "der",
  "spki",
 ]
 
@@ -1394,9 +1478,9 @@
 
 [[package]]
 name = "primeorder"
-version = "0.12.1"
+version = "0.13.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0b54f7131b3dba65a2f414cf5bd25b66d4682e4608610668eae785750ba4c5b2"
+checksum = "cf8d3875361e28f7753baefef104386e7aa47642c93023356d97fdef4003bfb5"
 dependencies = [
  "elliptic-curve",
 ]
@@ -1427,9 +1511,9 @@
 
 [[package]]
 name = "proc-macro2"
-version = "1.0.54"
+version = "1.0.56"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e472a104799c74b514a57226160104aa483546de37e839ec50e3c2e41dd87534"
+checksum = "2b63bdb0cd06f1f4dedf69b254734f9b45af66e4a031e42a7480257d9898b435"
 dependencies = [
  "unicode-ident",
 ]
@@ -1581,18 +1665,18 @@
 
 [[package]]
 name = "redox_syscall"
-version = "0.2.16"
+version = "0.3.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a"
+checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29"
 dependencies = [
  "bitflags",
 ]
 
 [[package]]
 name = "regex"
-version = "1.7.3"
+version = "1.8.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8b1f693b24f6ac912f4893ef08244d70b6067480d2f1a46e950c9691e6749d1d"
+checksum = "af83e617f331cc6ae2da5443c602dfa5af81e517212d9d611a5b3ba1777b5370"
 dependencies = [
  "aho-corasick",
  "memchr",
@@ -1601,9 +1685,9 @@
 
 [[package]]
 name = "regex-syntax"
-version = "0.6.29"
+version = "0.7.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1"
+checksum = "a5996294f19bd3aae0453a862ad728f60e6600695733dd5df01da90c54363a3c"
 
 [[package]]
 name = "rstest"
@@ -1654,16 +1738,16 @@
 
 [[package]]
 name = "rustix"
-version = "0.36.11"
+version = "0.37.14"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "db4165c9963ab29e422d6c26fbc1d37f15bace6b2810221f9d925023480fcf0e"
+checksum = "d9b864d3c18a5785a05953adeed93e2dca37ed30f18e69bba9f30079d51f363f"
 dependencies = [
  "bitflags",
  "errno",
  "io-lifetimes",
  "libc",
  "linux-raw-sys",
- "windows-sys 0.45.0",
+ "windows-sys 0.48.0",
 ]
 
 [[package]]
@@ -1689,12 +1773,12 @@
 
 [[package]]
 name = "sec1"
-version = "0.3.0"
+version = "0.7.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3be24c1842290c45df0a7bf069e0c268a747ad05a192f2fd7dcfdbc1cba40928"
+checksum = "f0aec48e813d6b90b15f0b8948af3c63483992dee44c03e9930b3eebdabe046e"
 dependencies = [
  "base16ct",
- "der 0.6.1",
+ "der",
  "generic-array",
  "subtle",
  "zeroize",
@@ -1708,29 +1792,29 @@
 
 [[package]]
 name = "serde"
-version = "1.0.158"
+version = "1.0.160"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "771d4d9c4163ee138805e12c710dd365e4f44be8be0503cb1bb9eb989425d9c9"
+checksum = "bb2f3770c8bce3bcda7e149193a069a0f4365bda1fa5cd88e03bca26afc1216c"
 dependencies = [
  "serde_derive",
 ]
 
 [[package]]
 name = "serde_derive"
-version = "1.0.158"
+version = "1.0.160"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e801c1712f48475582b7696ac71e0ca34ebb30e09338425384269d9717c62cad"
+checksum = "291a097c63d8497e00160b166a967a4a79c64f3facdd01cbd7502231688d77df"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.10",
+ "syn 2.0.15",
 ]
 
 [[package]]
 name = "serde_json"
-version = "1.0.95"
+version = "1.0.96"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d721eca97ac802aa7777b701877c8004d950fc142651367300d21c1cc0194744"
+checksum = "057d394a50403bcac12672b2b18fb387ab6d289d957dab67dd201875391e52f1"
 dependencies = [
  "itoa",
  "ryu",
@@ -1785,7 +1869,7 @@
 checksum = "37a5be806ab6f127c3da44b7378837ebf01dadca8510a0e572460216b228bd0e"
 dependencies = [
  "base64ct",
- "der 0.7.3",
+ "der",
 ]
 
 [[package]]
@@ -1813,9 +1897,9 @@
 
 [[package]]
 name = "syn"
-version = "2.0.10"
+version = "2.0.15"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5aad1363ed6d37b84299588d62d3a7d95b5a5c2d9aad5c85609fda12afaa1f40"
+checksum = "a34fcf3e8b60f57e6a14301a2e916d323af98b0ea63c599441eec8558660c822"
 dependencies = [
  "proc-macro2",
  "quote",
@@ -1824,24 +1908,15 @@
 
 [[package]]
 name = "tempfile"
-version = "3.4.0"
+version = "3.5.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "af18f7ae1acd354b992402e9ec5864359d693cd8a79dcbef59f76891701c1e95"
+checksum = "b9fbec84f381d5795b08656e4912bec604d162bff9291d6189a78f4c8ab87998"
 dependencies = [
  "cfg-if",
  "fastrand",
  "redox_syscall",
  "rustix",
- "windows-sys 0.42.0",
-]
-
-[[package]]
-name = "termcolor"
-version = "1.2.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "be55cf8942feac5c765c2c993422806843c9a9a45d4d5c407ad6dd2ea95eb9b6"
-dependencies = [
- "winapi-util",
+ "windows-sys 0.45.0",
 ]
 
 [[package]]
@@ -1875,7 +1950,7 @@
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.10",
+ "syn 2.0.15",
 ]
 
 [[package]]
@@ -1915,6 +1990,7 @@
 version = "0.1.0"
 dependencies = [
  "bytes",
+ "criterion",
  "crypto_provider",
  "crypto_provider_openssl",
  "crypto_provider_rustcrypto",
@@ -1971,7 +2047,7 @@
 name = "ukey2_shell"
 version = "0.1.0"
 dependencies = [
- "clap 4.1.13",
+ "clap 4.2.4",
  "crypto_provider_rustcrypto",
  "ukey2_connections",
  "ukey2_rs",
@@ -1994,6 +2070,12 @@
 ]
 
 [[package]]
+name = "utf8parse"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a"
+
+[[package]]
 name = "vcpkg"
 version = "0.2.15"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -2129,26 +2211,20 @@
 
 [[package]]
 name = "windows-sys"
-version = "0.42.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7"
-dependencies = [
- "windows_aarch64_gnullvm",
- "windows_aarch64_msvc",
- "windows_i686_gnu",
- "windows_i686_msvc",
- "windows_x86_64_gnu",
- "windows_x86_64_gnullvm",
- "windows_x86_64_msvc",
-]
-
-[[package]]
-name = "windows-sys"
 version = "0.45.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0"
 dependencies = [
- "windows-targets",
+ "windows-targets 0.42.2",
+]
+
+[[package]]
+name = "windows-sys"
+version = "0.48.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9"
+dependencies = [
+ "windows-targets 0.48.0",
 ]
 
 [[package]]
@@ -2157,13 +2233,28 @@
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071"
 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",
+ "windows_aarch64_gnullvm 0.42.2",
+ "windows_aarch64_msvc 0.42.2",
+ "windows_i686_gnu 0.42.2",
+ "windows_i686_msvc 0.42.2",
+ "windows_x86_64_gnu 0.42.2",
+ "windows_x86_64_gnullvm 0.42.2",
+ "windows_x86_64_msvc 0.42.2",
+]
+
+[[package]]
+name = "windows-targets"
+version = "0.48.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7b1eb6f0cd7c80c79759c929114ef071b87354ce476d9d94271031c0497adfd5"
+dependencies = [
+ "windows_aarch64_gnullvm 0.48.0",
+ "windows_aarch64_msvc 0.48.0",
+ "windows_i686_gnu 0.48.0",
+ "windows_i686_msvc 0.48.0",
+ "windows_x86_64_gnu 0.48.0",
+ "windows_x86_64_gnullvm 0.48.0",
+ "windows_x86_64_msvc 0.48.0",
 ]
 
 [[package]]
@@ -2173,42 +2264,84 @@
 checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8"
 
 [[package]]
+name = "windows_aarch64_gnullvm"
+version = "0.48.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc"
+
+[[package]]
 name = "windows_aarch64_msvc"
 version = "0.42.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43"
 
 [[package]]
+name = "windows_aarch64_msvc"
+version = "0.48.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3"
+
+[[package]]
 name = "windows_i686_gnu"
 version = "0.42.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f"
 
 [[package]]
+name = "windows_i686_gnu"
+version = "0.48.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241"
+
+[[package]]
 name = "windows_i686_msvc"
 version = "0.42.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060"
 
 [[package]]
+name = "windows_i686_msvc"
+version = "0.48.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00"
+
+[[package]]
 name = "windows_x86_64_gnu"
 version = "0.42.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36"
 
 [[package]]
+name = "windows_x86_64_gnu"
+version = "0.48.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1"
+
+[[package]]
 name = "windows_x86_64_gnullvm"
 version = "0.42.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3"
 
 [[package]]
+name = "windows_x86_64_gnullvm"
+version = "0.48.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953"
+
+[[package]]
 name = "windows_x86_64_msvc"
 version = "0.42.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0"
 
 [[package]]
+name = "windows_x86_64_msvc"
+version = "0.48.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a"
+
+[[package]]
 name = "wycheproof"
 version = "0.4.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -2249,7 +2382,7 @@
  "array_ref",
  "base64 0.21.0",
  "crypto_provider",
- "crypto_provider_rustcrypto",
+ "crypto_provider_default",
  "hex",
  "ldt_tbc",
  "rand",
diff --git a/nearby/Cargo.toml b/nearby/Cargo.toml
index a2b9f93..8ede0df 100644
--- a/nearby/Cargo.toml
+++ b/nearby/Cargo.toml
@@ -6,9 +6,13 @@
     "connections/ukey2/ukey2_jni",
     "connections/ukey2/ukey2_proto",
     "connections/ukey2/ukey2_shell",
+    # placeholder bssl-crypto crate
+    "crypto/bssl-crypto",
     "crypto/crypto_provider",
     "crypto/crypto_provider_openssl",
     "crypto/crypto_provider_rustcrypto",
+    "crypto/crypto_provider_stubs",
+    "crypto/crypto_provider_default",
     "crypto/rand_core_05_adapter",
     "presence/array_view",
     "presence/ldt",
@@ -25,11 +29,13 @@
 exclude = ["presence/ldt_np_adv_ffi", "crypto/crypto_provider_boringssl"]
 
 [workspace.dependencies]
-array_ref = {path = "presence/array_ref"}
-array_view = {path = "presence/array_view"}
+array_ref = { path = "presence/array_ref" }
+array_view = { path = "presence/array_view" }
 crypto_provider = { path = "crypto/crypto_provider" }
 crypto_provider_openssl = { path = "crypto/crypto_provider_openssl" }
 crypto_provider_rustcrypto = { path = "crypto/crypto_provider_rustcrypto" }
+crypto_provider_stubs = { path = "crypto/crypto_provider_stubs" }
+crypto_provider_default = {path = "crypto/crypto_provider_default" }
 rand_core_05_adapter = { path = "crypto/rand_core_05_adapter" }
 rand_ext = { path = "presence/rand_ext" }
 test_helper = { path = "presence/test_helper" }
@@ -38,11 +44,11 @@
 xts_aes = { path = "presence/xts_aes" }
 ldt = { path = "presence/ldt" }
 ldt_np_adv = { path = "presence/ldt_np_adv" }
-ldt_tbc = {path = "presence/ldt_tbc"}
+ldt_tbc = { path = "presence/ldt_tbc" }
 
 # RustCrypto crates
 rand = { version = "0.8.5", default-features = false }
-rand_core = {version = "0.6.4"}
+rand_core = "0.6.4"
 rand_pcg = "0.3.1"
 sha2 = { version = "0.10.2", default-features = false }
 aes = "0.8.2"
@@ -51,7 +57,7 @@
 hkdf = "0.12.3"
 hmac = "0.12.1"
 ed25519-dalek = { version = "2.0.0-rc.2", default-features = false }
-ed25519 = "1.5.3"
+ed25519 = "2.2.0"
 aes-gcm = "0.10.1"
 hex = "0.4.3"
 serde_json = { version = "1.0.91", features = ["alloc"], default-features = false }
@@ -59,12 +65,10 @@
 x25519-dalek = { version = "2.0.0-rc.2", default-features = false }
 subtle = { version = "2.4.1", default-features = false }
 rand_chacha = { version = "0.3.1", default-features = false }
-p256 = { version = "0.12.0", default-features = false }
-sec1 = "0.3.0"
-# AOSP's protobuf is only at 2.27.1 (http://cs/android-internal/external/rust/crates/protobuf/METADATA)
+p256 = { version = "0.13.0", default-features = false }
+sec1 = "0.7.1"
 protobuf = "3.2.0"
 protobuf-codegen = "3.2.0"
-protoc-rust = "2.27.1"
 jni = "0.21.1"
 spin = "0.9.8"
 anyhow = "1.0.64"
@@ -74,7 +78,7 @@
 clap = { version = "4.0.25", features = ["derive"] }
 lazy_static = { version = "1.4.0", features = ["spin_no_std"] }
 hex-literal = "0.3.4"
-openssl = "0.10.45"
+openssl = "0.10.48"
 cfg-if = "1.0.0"
 blake2 = "0.10.4"
 hdrhistogram = "7.5.0"
diff --git a/nearby/connections/ukey2/ukey2_connections/Cargo.toml b/nearby/connections/ukey2/ukey2_connections/Cargo.toml
index dff7f06..41fe10d 100644
--- a/nearby/connections/ukey2/ukey2_connections/Cargo.toml
+++ b/nearby/connections/ukey2/ukey2_connections/Cargo.toml
@@ -11,10 +11,14 @@
 rand = { workspace = true, features = ["std", "std_rng"] }
 ukey2_proto.workspace = true
 nom = { version = "7.1.1", features = ["alloc"] }
-
 bytes = "1.2.1"
+criterion = "0.4.0"
 
 [dev-dependencies]
 crypto_provider_openssl.workspace = true
 crypto_provider_rustcrypto = { workspace = true, features = ["alloc", "std"] }
 rstest = "0.16.0"
+
+[[bench]]
+name = "ukey2_benches"
+harness = false
diff --git a/nearby/connections/ukey2/ukey2_connections/benches/ukey2_benches.rs b/nearby/connections/ukey2/ukey2_connections/benches/ukey2_benches.rs
new file mode 100644
index 0000000..63372ef
--- /dev/null
+++ b/nearby/connections/ukey2/ukey2_connections/benches/ukey2_benches.rs
@@ -0,0 +1,94 @@
+// Copyright 2023 Google LLC
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+use criterion::{black_box, criterion_group, criterion_main, Criterion, Throughput};
+use rand::{Rng, SeedableRng};
+
+use crypto_provider::CryptoProvider;
+use crypto_provider_rustcrypto::RustCrypto;
+use ukey2_connections::{
+    D2DConnectionContextV1, D2DHandshakeContext, InitiatorD2DHandshakeContext,
+    ServerD2DHandshakeContext,
+};
+use ukey2_rs::HandshakeImplementation;
+
+fn run_handshake_with_rng<C, R>(
+    mut rng: R,
+) -> (D2DConnectionContextV1<R>, D2DConnectionContextV1<R>)
+where
+    C: CryptoProvider,
+    R: rand::RngCore + rand::CryptoRng + rand::SeedableRng + Send,
+{
+    let mut initiator_ctx = InitiatorD2DHandshakeContext::<C, R>::new_impl(
+        HandshakeImplementation::Spec,
+        R::from_rng(&mut rng).unwrap(),
+    );
+    let mut server_ctx = ServerD2DHandshakeContext::<C, R>::new_impl(
+        HandshakeImplementation::Spec,
+        R::from_rng(&mut rng).unwrap(),
+    );
+    server_ctx
+        .handle_handshake_message(
+            initiator_ctx
+                .get_next_handshake_message()
+                .expect("No message")
+                .as_slice(),
+        )
+        .expect("Failed to handle message");
+    initiator_ctx
+        .handle_handshake_message(
+            server_ctx
+                .get_next_handshake_message()
+                .expect("No message")
+                .as_slice(),
+        )
+        .expect("Failed to handle message");
+    server_ctx
+        .handle_handshake_message(
+            initiator_ctx
+                .get_next_handshake_message()
+                .expect("No message")
+                .as_slice(),
+        )
+        .expect("Failed to handle message");
+    assert!(initiator_ctx.is_handshake_complete());
+    assert!(server_ctx.is_handshake_complete());
+    (
+        initiator_ctx.to_connection_context().unwrap(),
+        server_ctx.to_connection_context().unwrap(),
+    )
+}
+
+fn criterion_benchmark(c: &mut Criterion) {
+    let kib = 1024;
+    let mut group = c.benchmark_group("throughput");
+    let mut plaintext = Vec::new();
+    let (mut initiator_ctx, mut server_ctx) =
+        run_handshake_with_rng::<RustCrypto, _>(rand::rngs::StdRng::from_entropy());
+    for len in [10 * kib, 1024 * kib] {
+        group.throughput(Throughput::Bytes(len as u64));
+        plaintext.resize(len, 0);
+        rand::thread_rng().fill(&mut plaintext[..]);
+        group.bench_function(format!("UKEY2 encrypt/decrypt {}KiB", len / kib), |b| {
+            b.iter(|| {
+                let msg =
+                    initiator_ctx.encode_message_to_peer::<RustCrypto, &[u8]>(&plaintext, None);
+                black_box(server_ctx.decode_message_from_peer::<RustCrypto, &[u8]>(&msg, None))
+            })
+        });
+    }
+}
+
+criterion_group!(benches, criterion_benchmark);
+criterion_main!(benches);
diff --git a/nearby/connections/ukey2/ukey2_connections/fuzz/Cargo.lock b/nearby/connections/ukey2/ukey2_connections/fuzz/Cargo.lock
index 8f42dbe..5c10cb6 100644
--- a/nearby/connections/ukey2/ukey2_connections/fuzz/Cargo.lock
+++ b/nearby/connections/ukey2/ukey2_connections/fuzz/Cargo.lock
@@ -49,6 +49,12 @@
 ]
 
 [[package]]
+name = "anes"
+version = "0.1.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4b46cbb362ab8752921c97e041f5e366ee6297bd428a31275b9fcf1e380f7299"
+
+[[package]]
 name = "anyhow"
 version = "1.0.70"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -64,6 +70,17 @@
 ]
 
 [[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"
@@ -100,12 +117,24 @@
 ]
 
 [[package]]
+name = "bumpalo"
+version = "3.12.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9b1ce199063694f33ffb7dd4e0ee620741495c32833cde5aa08f02a0bf96f0c8"
+
+[[package]]
 name = "bytes"
 version = "1.4.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "89b2fd2a0dcf38d7971e2194b6b6eebab45ae01067456a7fd93d5547a61b70be"
 
 [[package]]
+name = "cast"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5"
+
+[[package]]
 name = "cbc"
 version = "0.1.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -130,6 +159,33 @@
 checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
 
 [[package]]
+name = "ciborium"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b0c137568cc60b904a7724001b35ce2630fd00d5d84805fbb608ab89509d788f"
+dependencies = [
+ "ciborium-io",
+ "ciborium-ll",
+ "serde",
+]
+
+[[package]]
+name = "ciborium-io"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "346de753af073cc87b52b2083a506b38ac176a44cfb05497b622e27be899b369"
+
+[[package]]
+name = "ciborium-ll"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "213030a2b5a4e0c0892b6652260cf6ccac84827b83a85a534e178e3906c4cf1b"
+dependencies = [
+ "ciborium-io",
+ "half",
+]
+
+[[package]]
 name = "cipher"
 version = "0.4.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -140,6 +196,27 @@
 ]
 
 [[package]]
+name = "clap"
+version = "3.2.23"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "71655c45cb9845d3270c9d6df84ebe72b4dad3c2ba3f7023ad47c144e4e473a5"
+dependencies = [
+ "bitflags",
+ "clap_lex",
+ "indexmap",
+ "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.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -155,6 +232,85 @@
 ]
 
 [[package]]
+name = "criterion"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e7c76e09c1aae2bc52b3d2f29e13c6572553b30c4aa1b8a49fd70de6412654cb"
+dependencies = [
+ "anes",
+ "atty",
+ "cast",
+ "ciborium",
+ "clap",
+ "criterion-plot",
+ "itertools",
+ "lazy_static",
+ "num-traits",
+ "oorandom",
+ "plotters",
+ "rayon",
+ "regex",
+ "serde",
+ "serde_derive",
+ "serde_json",
+ "tinytemplate",
+ "walkdir",
+]
+
+[[package]]
+name = "criterion-plot"
+version = "0.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6b50826342786a51a89e2da3a28f1c32b06e387201bc2d19791f622c673706b1"
+dependencies = [
+ "cast",
+ "itertools",
+]
+
+[[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"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ce6fd6f855243022dcecf8702fef0c297d4338e226845fe067f6341ad9fa0cef"
+dependencies = [
+ "cfg-if",
+ "crossbeam-epoch",
+ "crossbeam-utils",
+]
+
+[[package]]
+name = "crossbeam-epoch"
+version = "0.9.14"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "46bd5f3f85273295a9d14aedfb86f6aadbff6d8f5295c4a9edb08e819dcf5695"
+dependencies = [
+ "autocfg",
+ "cfg-if",
+ "crossbeam-utils",
+ "memoffset",
+ "scopeguard",
+]
+
+[[package]]
+name = "crossbeam-utils"
+version = "0.8.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3c063cd8cc95f5c377ed0d4b49a4b21f632396ff690e8470c29b3359b346984b"
+dependencies = [
+ "cfg-if",
+]
+
+[[package]]
 name = "crypto-bigint"
 version = "0.5.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -180,9 +336,6 @@
 [[package]]
 name = "crypto_provider"
 version = "0.1.0"
-dependencies = [
- "bytes",
-]
 
 [[package]]
 name = "crypto_provider_rustcrypto"
@@ -233,9 +386,9 @@
 
 [[package]]
 name = "der"
-version = "0.7.1"
+version = "0.7.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bc906908ea6458456e5eaa160a9c08543ec3d1e6f71e2235cedd660cb65f9df0"
+checksum = "86b14af2045fa69ed2b7a48934bebb842d0f33e73e96e78766ecb14bb5347a11"
 dependencies = [
  "const-oid",
  "zeroize",
@@ -303,9 +456,9 @@
 
 [[package]]
 name = "elliptic-curve"
-version = "0.13.2"
+version = "0.13.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6ea5a92946e8614bb585254898bb7dd1ddad241ace60c52149e3765e34cc039d"
+checksum = "75c71eaa367f2e5d556414a8eea812bc62985c879748d6403edabd9cb03f16e7"
 dependencies = [
  "base16ct",
  "crypto-bigint",
@@ -368,9 +521,9 @@
 
 [[package]]
 name = "generic-array"
-version = "0.14.6"
+version = "0.14.7"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bff49e947297f3312447abdca79f45f4738097cc82b06e72054d2223f601f1b9"
+checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a"
 dependencies = [
  "typenum",
  "version_check",
@@ -400,6 +553,12 @@
 ]
 
 [[package]]
+name = "half"
+version = "1.8.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "eabb4a44450da02c90444cf74558da904edde8fb4e9035a9a6a4e15445af0bd7"
+
+[[package]]
 name = "hashbrown"
 version = "0.12.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -407,6 +566,24 @@
 
 [[package]]
 name = "hermit-abi"
+version = "0.1.19"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "hermit-abi"
+version = "0.2.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ee512640fe35acbfb4bb779db6f0d80704c2cacfa2e39b601ef3e3f47d1ae4c7"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "hermit-abi"
 version = "0.3.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "fed44880c466736ef9a5c5b5facefb5ed0785676d0c02d612db14e54f0d84286"
@@ -464,12 +641,27 @@
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "09270fd4fa1111bc614ed2246c7ef56239a3063d5be0d1ec3b589c505d400aeb"
 dependencies = [
- "hermit-abi",
+ "hermit-abi 0.3.1",
  "libc",
  "windows-sys 0.45.0",
 ]
 
 [[package]]
+name = "itertools"
+version = "0.10.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473"
+dependencies = [
+ "either",
+]
+
+[[package]]
+name = "itoa"
+version = "1.0.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "453ad9f582a441959e5f0d088b02ce04cfe8d51a8eaf077f12ac6d3e94164ca6"
+
+[[package]]
 name = "jobserver"
 version = "0.1.26"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -479,6 +671,21 @@
 ]
 
 [[package]]
+name = "js-sys"
+version = "0.3.61"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "445dde2150c55e483f3d8416706b97ec8e8237c307e5b7b4b8dd15e6af2a0730"
+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.140"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -523,6 +730,15 @@
 checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d"
 
 [[package]]
+name = "memoffset"
+version = "0.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d61c719bcfbcf5d62b3a09efa6088de8c54bc0bfcd3ea7ae39fcc186108b8de1"
+dependencies = [
+ "autocfg",
+]
+
+[[package]]
 name = "minimal-lexical"
 version = "0.2.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -569,22 +785,44 @@
 ]
 
 [[package]]
+name = "num_cpus"
+version = "1.15.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0fac9e2da13b5eb447a6ce3d392f23a29d8694bff781bf03a16cd9ac8697593b"
+dependencies = [
+ "hermit-abi 0.2.6",
+ "libc",
+]
+
+[[package]]
 name = "once_cell"
 version = "1.17.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "b7e5500299e16ebb147ae15a00a942af264cf3688f47923b8fc2cd5858f23ad3"
 
 [[package]]
+name = "oorandom"
+version = "11.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0ab1bc2a289d34bd04a330323ac98a1b4bc82c9d9fcb1e66b63caa84da26b575"
+
+[[package]]
 name = "opaque-debug"
 version = "0.3.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5"
 
 [[package]]
-name = "p256"
-version = "0.13.0"
+name = "os_str_bytes"
+version = "6.5.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7270da3e5caa82afd3deb054cc237905853813aea3859544bc082c3fe55b8d47"
+checksum = "ceedf44fb00f2d1984b0bc98102627ce622e083e49a5bacdb3e514fa4238e267"
+
+[[package]]
+name = "p256"
+version = "0.13.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c9863ad85fa8f4460f9c48cb909d38a0d689dba1f6f6988a5e3e0d31071bcd4b"
 dependencies = [
  "elliptic-curve",
  "primeorder",
@@ -607,6 +845,34 @@
 checksum = "e3d7ddaed09e0eb771a79ab0fd64609ba0afb0a8366421957936ad14cbd13630"
 
 [[package]]
+name = "plotters"
+version = "0.3.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2538b639e642295546c50fcd545198c9d64ee2a38620a628724a3b266d5fbf97"
+dependencies = [
+ "num-traits",
+ "plotters-backend",
+ "plotters-svg",
+ "wasm-bindgen",
+ "web-sys",
+]
+
+[[package]]
+name = "plotters-backend"
+version = "0.3.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "193228616381fecdc1224c62e96946dfbc73ff4384fba576e052ff8c1bea8142"
+
+[[package]]
+name = "plotters-svg"
+version = "0.3.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f9a81d2759aae1dae668f783c308bc5c8ebd191ff4184aaa1b37f65a6ae5a56f"
+dependencies = [
+ "plotters-backend",
+]
+
+[[package]]
 name = "polyval"
 version = "0.6.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -626,9 +892,9 @@
 
 [[package]]
 name = "primeorder"
-version = "0.13.0"
+version = "0.13.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7613fdcc0831c10060fa69833ea8fa2caa94b6456f51e25356a885b530a2e3d0"
+checksum = "cf8d3875361e28f7753baefef104386e7aa47642c93023356d97fdef4003bfb5"
 dependencies = [
  "elliptic-curve",
 ]
@@ -733,6 +999,28 @@
 ]
 
 [[package]]
+name = "rayon"
+version = "1.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1d2df5196e37bcc87abebc0053e20787d73847bb33134a69841207dd0a47f03b"
+dependencies = [
+ "either",
+ "rayon-core",
+]
+
+[[package]]
+name = "rayon-core"
+version = "1.11.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4b8f95bd6966f5c87776639160a66bd8ab9895d9d4ab01ddba9fc60661aebe8d"
+dependencies = [
+ "crossbeam-channel",
+ "crossbeam-deque",
+ "crossbeam-utils",
+ "num_cpus",
+]
+
+[[package]]
 name = "redox_syscall"
 version = "0.2.16"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -773,10 +1061,31 @@
 ]
 
 [[package]]
-name = "sec1"
-version = "0.7.1"
+name = "ryu"
+version = "1.0.13"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "48518a2b5775ba8ca5b46596aae011caa431e6ce7e4a67ead66d92f08884220e"
+checksum = "f91339c0467de62360649f8d3e185ca8de4224ff281f66000de5eb2a77a79041"
+
+[[package]]
+name = "same-file"
+version = "1.0.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502"
+dependencies = [
+ "winapi-util",
+]
+
+[[package]]
+name = "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",
@@ -786,6 +1095,37 @@
 ]
 
 [[package]]
+name = "serde"
+version = "1.0.160"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bb2f3770c8bce3bcda7e149193a069a0f4365bda1fa5cd88e03bca26afc1216c"
+dependencies = [
+ "serde_derive",
+]
+
+[[package]]
+name = "serde_derive"
+version = "1.0.160"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "291a097c63d8497e00160b166a967a4a79c64f3facdd01cbd7502231688d77df"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.13",
+]
+
+[[package]]
+name = "serde_json"
+version = "1.0.96"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "057d394a50403bcac12672b2b18fb387ab6d289d957dab67dd201875391e52f1"
+dependencies = [
+ "itoa",
+ "ryu",
+ "serde",
+]
+
+[[package]]
 name = "sha2"
 version = "0.10.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -844,6 +1184,12 @@
 ]
 
 [[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.40"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -864,6 +1210,16 @@
 ]
 
 [[package]]
+name = "tinytemplate"
+version = "1.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "be4d6b5f19ff7664e8c98d03e2139cb510db9b0a60b55f8e8709b689d939b6bc"
+dependencies = [
+ "serde",
+ "serde_json",
+]
+
+[[package]]
 name = "typenum"
 version = "1.16.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -874,6 +1230,7 @@
 version = "0.1.0"
 dependencies = [
  "bytes",
+ "criterion",
  "crypto_provider",
  "nom",
  "rand",
@@ -936,12 +1293,86 @@
 checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f"
 
 [[package]]
+name = "walkdir"
+version = "2.3.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "36df944cda56c7d8d8b7496af378e6b16de9284591917d307c9b4d313c44e698"
+dependencies = [
+ "same-file",
+ "winapi-util",
+]
+
+[[package]]
 name = "wasi"
 version = "0.11.0+wasi-snapshot-preview1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423"
 
 [[package]]
+name = "wasm-bindgen"
+version = "0.2.84"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "31f8dcbc21f30d9b8f2ea926ecb58f6b91192c17e9d33594b3df58b2007ca53b"
+dependencies = [
+ "cfg-if",
+ "wasm-bindgen-macro",
+]
+
+[[package]]
+name = "wasm-bindgen-backend"
+version = "0.2.84"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "95ce90fd5bcc06af55a641a86428ee4229e44e07033963a2290a8e241607ccb9"
+dependencies = [
+ "bumpalo",
+ "log",
+ "once_cell",
+ "proc-macro2",
+ "quote",
+ "syn 1.0.109",
+ "wasm-bindgen-shared",
+]
+
+[[package]]
+name = "wasm-bindgen-macro"
+version = "0.2.84"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4c21f77c0bedc37fd5dc21f897894a5ca01e7bb159884559461862ae90c0b4c5"
+dependencies = [
+ "quote",
+ "wasm-bindgen-macro-support",
+]
+
+[[package]]
+name = "wasm-bindgen-macro-support"
+version = "0.2.84"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2aff81306fcac3c7515ad4e177f521b5c9a15f2b08f4e32d823066102f35a5f6"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 1.0.109",
+ "wasm-bindgen-backend",
+ "wasm-bindgen-shared",
+]
+
+[[package]]
+name = "wasm-bindgen-shared"
+version = "0.2.84"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d"
+
+[[package]]
+name = "web-sys"
+version = "0.3.61"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e33b99f4b23ba3eec1a53ac264e35a755f00e966e0065077d6027c0f575b0b97"
+dependencies = [
+ "js-sys",
+ "wasm-bindgen",
+]
+
+[[package]]
 name = "which"
 version = "4.4.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -969,6 +1400,15 @@
 checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
 
 [[package]]
+name = "winapi-util"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178"
+dependencies = [
+ "winapi",
+]
+
+[[package]]
 name = "winapi-x86_64-pc-windows-gnu"
 version = "0.4.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
diff --git a/nearby/crypto/bssl-crypto/Cargo.toml b/nearby/crypto/bssl-crypto/Cargo.toml
new file mode 100644
index 0000000..bfe3964
--- /dev/null
+++ b/nearby/crypto/bssl-crypto/Cargo.toml
@@ -0,0 +1,9 @@
+[package]
+name = "bssl-crypto"
+version.workspace = true
+edition.workspace = true
+publish.workspace = true
+
+# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
+
+[dependencies]
diff --git a/nearby/crypto/bssl-crypto/src/lib.rs b/nearby/crypto/bssl-crypto/src/lib.rs
new file mode 100644
index 0000000..d72e106
--- /dev/null
+++ b/nearby/crypto/bssl-crypto/src/lib.rs
@@ -0,0 +1,16 @@
+// 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.
+
+//! Placeholder crate to satisfy cargo. If actually using boring ssl, please run `prepare_boringssl`
+//! from scripts/build_script.sh
diff --git a/nearby/crypto/crypto_provider_boringssl/.cargo/config.toml b/nearby/crypto/crypto_provider_boringssl/.cargo/config.toml
new file mode 100644
index 0000000..f5ab7fa
--- /dev/null
+++ b/nearby/crypto/crypto_provider_boringssl/.cargo/config.toml
@@ -0,0 +1,3 @@
+paths = [
+    "../../../boringssl-build/boringssl/rust/bssl-crypto",
+]
\ No newline at end of file
diff --git a/nearby/crypto/crypto_provider_boringssl/Cargo.lock b/nearby/crypto/crypto_provider_boringssl/Cargo.lock
index 4a8327d..b1c65bd 100644
--- a/nearby/crypto/crypto_provider_boringssl/Cargo.lock
+++ b/nearby/crypto/crypto_provider_boringssl/Cargo.lock
@@ -17,13 +17,6 @@
 [[package]]
 name = "bssl-crypto"
 version = "0.1.0"
-dependencies = [
- "bssl-sys",
-]
-
-[[package]]
-name = "bssl-sys"
-version = "0.1.0"
 
 [[package]]
 name = "cfg-if"
diff --git a/nearby/crypto/crypto_provider_boringssl/Cargo.toml b/nearby/crypto/crypto_provider_boringssl/Cargo.toml
index 686d871..6a62172 100644
--- a/nearby/crypto/crypto_provider_boringssl/Cargo.toml
+++ b/nearby/crypto/crypto_provider_boringssl/Cargo.toml
@@ -8,8 +8,8 @@
 crypto_provider = { path = "../crypto_provider", features = ["alloc", "std"] }
 crypto_provider_stubs = { path = "../crypto_provider_stubs" }
 
-# Note: before this crate will build you need to run `scripts/prepare-boringssl.sh`
-bssl-crypto = {path = "../../../boringssl-build/boringssl/rust/bssl-crypto"}
+# Note: before this crate will work you need to run `scripts/prepare-boringssl.sh`
+bssl-crypto = {path = "../bssl-crypto"}
 
 [dev-dependencies]
 crypto_provider = {path = "../crypto_provider", features = ["std", "alloc", "testing"]}
diff --git a/nearby/crypto/crypto_provider_default/Cargo.toml b/nearby/crypto/crypto_provider_default/Cargo.toml
new file mode 100644
index 0000000..9eff7ea
--- /dev/null
+++ b/nearby/crypto/crypto_provider_default/Cargo.toml
@@ -0,0 +1,18 @@
+[package]
+name = "crypto_provider_default"
+version.workspace = true
+edition.workspace = true
+publish.workspace = true
+
+[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}
+cfg-if.workspace = true
+
+[features]
+default = ["rustcrypto"]
+rustcrypto = ["crypto_provider_rustcrypto"]
+boringssl = ["crypto_provider_boringssl"]
+opensslbssl = ["crypto_provider_openssl/boringssl"]
diff --git a/nearby/crypto/crypto_provider_default/src/lib.rs b/nearby/crypto/crypto_provider_default/src/lib.rs
new file mode 100644
index 0000000..831698b
--- /dev/null
+++ b/nearby/crypto/crypto_provider_default/src/lib.rs
@@ -0,0 +1,28 @@
+// 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.
+
+//! Provides multiple implementations of CryptoProvider through the same struct, configurable by
+//! feature flag.
+
+cfg_if::cfg_if! {
+    if #[cfg(feature = "rustcrypto")] {
+        pub use crypto_provider_rustcrypto::RustCrypto as CryptoProviderImpl;
+    } else if #[cfg(feature = "boringssl")] {
+        pub use crypto_provider_boringssl::Boringssl as CryptoProviderImpl;
+    } else if #[cfg(feature = "openssl")] {
+        pub use crypto_provider_openssl::Openssl as CryptoProviderImpl;
+    } else {
+        compile_error!("No crypto_provider feature enabled!");
+    }
+}
diff --git a/nearby/presence/ldt/Cargo.toml b/nearby/presence/ldt/Cargo.toml
index 8f2461e..d98f223 100644
--- a/nearby/presence/ldt/Cargo.toml
+++ b/nearby/presence/ldt/Cargo.toml
@@ -9,8 +9,7 @@
 ldt_tbc.workspace = true
 
 [dev-dependencies]
-crypto_provider.workspace = true
-crypto_provider_rustcrypto.workspace = true
+crypto_provider_default = {workspace = true}
 rand_ext.workspace = true
 test_helper.workspace = true
 xts_aes.workspace = true
@@ -18,14 +17,17 @@
 rand.workspace = true
 rand_pcg.workspace = true
 base64.workspace = true
+serde_json = {workspace = true, features = ["std"]}
+anyhow.workspace = true
+hex.workspace = true
+
+# benchmark/example only deps
+crypto_provider_rustcrypto.workspace = true
 clap.workspace = true
 criterion.workspace = true
 sha2.workspace = true
 ctr.workspace = true
 aes.workspace = true
-serde_json.workspace = true
-anyhow.workspace = true
-hex.workspace = true
 subtle.workspace = true
 blake2.workspace = true
 hdrhistogram.workspace = true
diff --git a/nearby/presence/ldt/fuzz/Cargo.lock b/nearby/presence/ldt/fuzz/Cargo.lock
index 2f38bca..e0b529d 100644
--- a/nearby/presence/ldt/fuzz/Cargo.lock
+++ b/nearby/presence/ldt/fuzz/Cargo.lock
@@ -157,9 +157,6 @@
 [[package]]
 name = "crypto_provider"
 version = "0.1.0"
-dependencies = [
- "bytes",
-]
 
 [[package]]
 name = "crypto_provider_rustcrypto"
@@ -210,9 +207,9 @@
 
 [[package]]
 name = "der"
-version = "0.7.1"
+version = "0.7.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bc906908ea6458456e5eaa160a9c08543ec3d1e6f71e2235cedd660cb65f9df0"
+checksum = "86b14af2045fa69ed2b7a48934bebb842d0f33e73e96e78766ecb14bb5347a11"
 dependencies = [
  "const-oid",
  "zeroize",
@@ -263,9 +260,9 @@
 
 [[package]]
 name = "elliptic-curve"
-version = "0.13.2"
+version = "0.13.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6ea5a92946e8614bb585254898bb7dd1ddad241ace60c52149e3765e34cc039d"
+checksum = "75c71eaa367f2e5d556414a8eea812bc62985c879748d6403edabd9cb03f16e7"
 dependencies = [
  "base16ct",
  "crypto-bigint",
@@ -298,9 +295,9 @@
 
 [[package]]
 name = "generic-array"
-version = "0.14.6"
+version = "0.14.7"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bff49e947297f3312447abdca79f45f4738097cc82b06e72054d2223f601f1b9"
+checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a"
 dependencies = [
  "typenum",
  "version_check",
@@ -429,9 +426,9 @@
 
 [[package]]
 name = "p256"
-version = "0.13.0"
+version = "0.13.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7270da3e5caa82afd3deb054cc237905853813aea3859544bc082c3fe55b8d47"
+checksum = "c9863ad85fa8f4460f9c48cb909d38a0d689dba1f6f6988a5e3e0d31071bcd4b"
 dependencies = [
  "elliptic-curve",
  "primeorder",
@@ -473,9 +470,9 @@
 
 [[package]]
 name = "primeorder"
-version = "0.13.0"
+version = "0.13.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7613fdcc0831c10060fa69833ea8fa2caa94b6456f51e25356a885b530a2e3d0"
+checksum = "cf8d3875361e28f7753baefef104386e7aa47642c93023356d97fdef4003bfb5"
 dependencies = [
  "elliptic-curve",
 ]
@@ -528,9 +525,9 @@
 
 [[package]]
 name = "sec1"
-version = "0.7.1"
+version = "0.7.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "48518a2b5775ba8ca5b46596aae011caa431e6ce7e4a67ead66d92f08884220e"
+checksum = "f0aec48e813d6b90b15f0b8948af3c63483992dee44c03e9930b3eebdabe046e"
 dependencies = [
  "base16ct",
  "der",
diff --git a/nearby/presence/ldt/tests/ldt_roundtrip.rs b/nearby/presence/ldt/tests/ldt_roundtrip.rs
index 6f5cada..33f3fe5 100644
--- a/nearby/presence/ldt/tests/ldt_roundtrip.rs
+++ b/nearby/presence/ldt/tests/ldt_roundtrip.rs
@@ -14,7 +14,7 @@
 
 use crypto_provider::aes::BLOCK_SIZE;
 use crypto_provider::{CryptoProvider, CryptoRng};
-use crypto_provider_rustcrypto::RustCrypto;
+use crypto_provider_default::CryptoProviderImpl;
 use ldt::*;
 use ldt_tbc::TweakableBlockCipher;
 use rand::rngs::StdRng;
@@ -24,25 +24,25 @@
 
 #[test]
 fn roundtrip_normal_padder() {
-    let mut rng = <RustCrypto as CryptoProvider>::CryptoRng::new();
+    let mut rng = <CryptoProviderImpl as CryptoProvider>::CryptoRng::new();
     let mut rc_rng = rand::rngs::StdRng::from_entropy();
     let plaintext_len_range = distributions::Uniform::new_inclusive(BLOCK_SIZE, BLOCK_SIZE * 2 - 1);
 
     for _ in 0..100_000 {
         if rc_rng.gen() {
-            let ldt_key = LdtKey::from_random::<RustCrypto>(&mut rng);
-            do_roundtrip::<16, _, _, _, RustCrypto>(
-                LdtEncryptCipher::<16, XtsAes128<RustCrypto>, Swap>::new(&ldt_key),
-                LdtDecryptCipher::<16, XtsAes128<RustCrypto>, Swap>::new(&ldt_key),
+            let ldt_key = LdtKey::from_random::<CryptoProviderImpl>(&mut rng);
+            do_roundtrip::<16, _, _, _, CryptoProviderImpl>(
+                LdtEncryptCipher::<16, XtsAes128<CryptoProviderImpl>, Swap>::new(&ldt_key),
+                LdtDecryptCipher::<16, XtsAes128<CryptoProviderImpl>, Swap>::new(&ldt_key),
                 &DefaultPadder::default(),
                 &mut rng,
                 &plaintext_len_range,
             )
         } else {
-            let ldt_key = LdtKey::from_random::<RustCrypto>(&mut rng);
-            do_roundtrip::<16, _, _, _, RustCrypto>(
-                LdtEncryptCipher::<16, XtsAes256<RustCrypto>, Swap>::new(&ldt_key),
-                LdtDecryptCipher::<16, XtsAes256<RustCrypto>, Swap>::new(&ldt_key),
+            let ldt_key = LdtKey::from_random::<CryptoProviderImpl>(&mut rng);
+            do_roundtrip::<16, _, _, _, CryptoProviderImpl>(
+                LdtEncryptCipher::<16, XtsAes256<CryptoProviderImpl>, Swap>::new(&ldt_key),
+                LdtDecryptCipher::<16, XtsAes256<CryptoProviderImpl>, Swap>::new(&ldt_key),
                 &DefaultPadder::default(),
                 &mut rng,
                 &plaintext_len_range,
@@ -53,29 +53,30 @@
 
 #[test]
 fn roundtrip_xor_padder() {
-    let mut rng = <RustCrypto as CryptoProvider>::CryptoRng::new();
+    let mut rng = <CryptoProviderImpl as CryptoProvider>::CryptoRng::new();
     let mut rc_rng = rand::rngs::StdRng::from_entropy();
     // 2 bytes smaller because we're using a 2 byte salt
     let plaintext_len_range =
         distributions::Uniform::new_inclusive(BLOCK_SIZE, BLOCK_SIZE * 2 - 1 - 2);
 
     for _ in 0..100_000 {
-        let padder: XorPadder<BLOCK_SIZE> = random_bytes::<BLOCK_SIZE, RustCrypto>(&mut rng).into();
+        let padder: XorPadder<BLOCK_SIZE> =
+            random_bytes::<BLOCK_SIZE, CryptoProviderImpl>(&mut rng).into();
 
         if rc_rng.gen() {
-            let ldt_key = LdtKey::from_random::<RustCrypto>(&mut rng);
-            do_roundtrip::<16, _, _, _, RustCrypto>(
-                LdtEncryptCipher::<16, XtsAes128<RustCrypto>, Swap>::new(&ldt_key),
-                LdtDecryptCipher::<16, XtsAes128<RustCrypto>, Swap>::new(&ldt_key),
+            let ldt_key = LdtKey::from_random::<CryptoProviderImpl>(&mut rng);
+            do_roundtrip::<16, _, _, _, CryptoProviderImpl>(
+                LdtEncryptCipher::<16, XtsAes128<CryptoProviderImpl>, Swap>::new(&ldt_key),
+                LdtDecryptCipher::<16, XtsAes128<CryptoProviderImpl>, Swap>::new(&ldt_key),
                 &padder,
                 &mut rng,
                 &plaintext_len_range,
             )
         } else {
-            let ldt_key = LdtKey::from_random::<RustCrypto>(&mut rng);
-            do_roundtrip::<16, _, _, _, RustCrypto>(
-                LdtEncryptCipher::<16, XtsAes256<RustCrypto>, Swap>::new(&ldt_key),
-                LdtDecryptCipher::<16, XtsAes256<RustCrypto>, Swap>::new(&ldt_key),
+            let ldt_key = LdtKey::from_random::<CryptoProviderImpl>(&mut rng);
+            do_roundtrip::<16, _, _, _, CryptoProviderImpl>(
+                LdtEncryptCipher::<16, XtsAes256<CryptoProviderImpl>, Swap>::new(&ldt_key),
+                LdtDecryptCipher::<16, XtsAes256<CryptoProviderImpl>, Swap>::new(&ldt_key),
                 &padder,
                 &mut rng,
                 &plaintext_len_range,
diff --git a/nearby/presence/ldt/tests/ldt_test_vectors.rs b/nearby/presence/ldt/tests/ldt_test_vectors.rs
index 691bd62..9d66926 100644
--- a/nearby/presence/ldt/tests/ldt_test_vectors.rs
+++ b/nearby/presence/ldt/tests/ldt_test_vectors.rs
@@ -13,7 +13,7 @@
 // limitations under the License.
 
 use anyhow::anyhow;
-use crypto_provider_rustcrypto::RustCrypto;
+use crypto_provider_default::CryptoProviderImpl;
 use ldt::{DefaultPadder, LdtDecryptCipher, LdtEncryptCipher, LdtKey, Swap, XorPadder};
 use std::{fs, io::Read as _};
 use test_helper::{extract_key_array, extract_key_vec};
@@ -46,10 +46,10 @@
         assert!(len >= crypto_provider::aes::BLOCK_SIZE);
         assert!(len < crypto_provider::aes::BLOCK_SIZE * 2);
 
-        let ldt_enc = LdtEncryptCipher::<16, XtsAes128<RustCrypto>, Swap>::new(
+        let ldt_enc = LdtEncryptCipher::<16, XtsAes128<CryptoProviderImpl>, Swap>::new(
             &LdtKey::from_concatenated(&key),
         );
-        let ldt_dec = LdtDecryptCipher::<16, XtsAes128<RustCrypto>, Swap>::new(
+        let ldt_dec = LdtDecryptCipher::<16, XtsAes128<CryptoProviderImpl>, Swap>::new(
             &LdtKey::from_concatenated(&key),
         );
 
@@ -99,10 +99,10 @@
         assert!(len >= crypto_provider::aes::BLOCK_SIZE);
         assert!(len < crypto_provider::aes::BLOCK_SIZE * 2);
 
-        let ldt_enc = LdtEncryptCipher::<16, XtsAes128<RustCrypto>, Swap>::new(
+        let ldt_enc = LdtEncryptCipher::<16, XtsAes128<CryptoProviderImpl>, Swap>::new(
             &LdtKey::from_concatenated(&key),
         );
-        let ldt_dec = LdtDecryptCipher::<16, XtsAes128<RustCrypto>, Swap>::new(
+        let ldt_dec = LdtDecryptCipher::<16, XtsAes128<CryptoProviderImpl>, Swap>::new(
             &LdtKey::from_concatenated(&key),
         );
 
diff --git a/nearby/presence/ldt/tests/tests.rs b/nearby/presence/ldt/tests/tests.rs
index a50658d..56e5947 100644
--- a/nearby/presence/ldt/tests/tests.rs
+++ b/nearby/presence/ldt/tests/tests.rs
@@ -16,7 +16,7 @@
 
 use alloc::vec;
 use crypto_provider::aes::BLOCK_SIZE;
-use crypto_provider_rustcrypto::RustCrypto;
+use crypto_provider_default::CryptoProviderImpl;
 use ldt::{
     DefaultPadder, LdtDecryptCipher, LdtEncryptCipher, LdtError, LdtKey, Padder, Swap, XorPadder,
 };
@@ -26,7 +26,7 @@
 fn normal_pad_empty() {
     let padder = DefaultPadder::default();
     let tweak: xts_aes::Tweak =
-        <DefaultPadder as Padder<16, XtsAes128<RustCrypto>>>::pad_tweak(&padder, &[]);
+        <DefaultPadder as Padder<16, XtsAes128<CryptoProviderImpl>>>::pad_tweak(&padder, &[]);
     let bytes = tweak.le_bytes();
 
     // leading 1 bit
@@ -39,7 +39,7 @@
 fn normal_pad_one_byte() {
     let padder = DefaultPadder::default();
     let tweak: xts_aes::Tweak =
-        <DefaultPadder as Padder<16, XtsAes128<RustCrypto>>>::pad_tweak(&padder, &[0x81]);
+        <DefaultPadder as Padder<16, XtsAes128<CryptoProviderImpl>>>::pad_tweak(&padder, &[0x81]);
 
     let bytes = tweak.le_bytes();
 
@@ -55,7 +55,7 @@
     let padder = DefaultPadder::default();
     let input = [0x99; 15];
     let tweak: xts_aes::Tweak =
-        <DefaultPadder as Padder<16, XtsAes128<RustCrypto>>>::pad_tweak(&padder, &input);
+        <DefaultPadder as Padder<16, XtsAes128<CryptoProviderImpl>>>::pad_tweak(&padder, &input);
 
     let bytes = tweak.le_bytes();
 
@@ -70,7 +70,7 @@
 fn normal_pad_too_big_panics() {
     let padder = DefaultPadder::default();
     let input = [0x99; 16];
-    <DefaultPadder as Padder<16, XtsAes128<RustCrypto>>>::pad_tweak(&padder, &input);
+    <DefaultPadder as Padder<16, XtsAes128<CryptoProviderImpl>>>::pad_tweak(&padder, &input);
 }
 
 #[test]
@@ -78,7 +78,7 @@
     let padder = [0x24; BLOCK_SIZE].into();
     let tweak: xts_aes::Tweak = <XorPadder<BLOCK_SIZE> as Padder<
         BLOCK_SIZE,
-        XtsAes128<RustCrypto>,
+        XtsAes128<CryptoProviderImpl>,
     >>::pad_tweak(&padder, &[]);
 
     let bytes = tweak.le_bytes();
@@ -94,7 +94,7 @@
     let padder = [0x24; BLOCK_SIZE].into();
     let tweak: xts_aes::Tweak = <XorPadder<BLOCK_SIZE> as Padder<
         BLOCK_SIZE,
-        XtsAes128<RustCrypto>,
+        XtsAes128<CryptoProviderImpl>,
     >>::pad_tweak(&padder, &[0x81]);
 
     let bytes = tweak.le_bytes();
@@ -112,7 +112,7 @@
     let input = [0x99; 15];
     let tweak: xts_aes::Tweak = <XorPadder<BLOCK_SIZE> as Padder<
         BLOCK_SIZE,
-        XtsAes128<RustCrypto>,
+        XtsAes128<CryptoProviderImpl>,
     >>::pad_tweak(&padder, &input);
 
     let bytes = tweak.le_bytes();
@@ -129,7 +129,7 @@
     let padder = [0x24; BLOCK_SIZE].into();
     // need 1 byte for padding, and 2 more for salt
     let input = [0x99; 16];
-    <XorPadder<BLOCK_SIZE> as Padder<BLOCK_SIZE, XtsAes128<RustCrypto>>>::pad_tweak(
+    <XorPadder<BLOCK_SIZE> as Padder<BLOCK_SIZE, XtsAes128<CryptoProviderImpl>>>::pad_tweak(
         &padder, &input,
     );
 }
@@ -153,7 +153,7 @@
 }
 
 fn do_length_check_dec(len: usize) {
-    let ldt_dec = LdtDecryptCipher::<{ BLOCK_SIZE }, XtsAes128<RustCrypto>, Swap>::new(
+    let ldt_dec = LdtDecryptCipher::<{ BLOCK_SIZE }, XtsAes128<CryptoProviderImpl>, Swap>::new(
         &LdtKey::<XtsAes128Key>::from_concatenated(&[0u8; 64]),
     );
 
@@ -165,7 +165,7 @@
 }
 
 fn do_length_check_enc(len: usize) {
-    let ldt_enc = LdtEncryptCipher::<{ BLOCK_SIZE }, XtsAes128<RustCrypto>, Swap>::new(
+    let ldt_enc = LdtEncryptCipher::<{ BLOCK_SIZE }, XtsAes128<CryptoProviderImpl>, Swap>::new(
         &LdtKey::<XtsAes128Key>::from_concatenated(&[0u8; 64]),
     );
 
diff --git a/nearby/presence/ldt_np_adv/Cargo.toml b/nearby/presence/ldt_np_adv/Cargo.toml
index 707bb8d..d543032 100644
--- a/nearby/presence/ldt_np_adv/Cargo.toml
+++ b/nearby/presence/ldt_np_adv/Cargo.toml
@@ -13,7 +13,7 @@
 ldt_tbc.workspace = true
 
 [dev-dependencies]
-crypto_provider_rustcrypto = {workspace = true, features=["std"]}
+crypto_provider_default.workspace = true
 crypto_provider_openssl.workspace = true
 rand_ext.workspace = true
 test_helper.workspace = true
@@ -26,6 +26,9 @@
 criterion.workspace = true
 rand_pcg.workspace = true
 
+# Benchmark only dependency
+crypto_provider_rustcrypto.workspace = true
+
 [[bench]]
 name = "ldt_adv_scan"
 harness = false
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 c40530b..47544d8 100644
--- a/nearby/presence/ldt_np_adv/benches/ldt_adv_scan.rs
+++ b/nearby/presence/ldt_np_adv/benches/ldt_adv_scan.rs
@@ -21,6 +21,7 @@
 use crypto_provider::CryptoProvider;
 use crypto_provider_openssl::Openssl;
 use crypto_provider_rustcrypto::RustCrypto;
+
 use np_hkdf::NpKeySeedHkdf;
 
 fn ldt_adv_scan<C: CryptoProvider>(c: &mut Criterion) {
diff --git a/nearby/presence/ldt_np_adv/fuzz/Cargo.lock b/nearby/presence/ldt_np_adv/fuzz/Cargo.lock
index 4922fc2..31409c8 100644
--- a/nearby/presence/ldt_np_adv/fuzz/Cargo.lock
+++ b/nearby/presence/ldt_np_adv/fuzz/Cargo.lock
@@ -161,9 +161,6 @@
 [[package]]
 name = "crypto_provider"
 version = "0.1.0"
-dependencies = [
- "bytes",
-]
 
 [[package]]
 name = "crypto_provider_rustcrypto"
@@ -214,9 +211,9 @@
 
 [[package]]
 name = "der"
-version = "0.7.1"
+version = "0.7.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bc906908ea6458456e5eaa160a9c08543ec3d1e6f71e2235cedd660cb65f9df0"
+checksum = "86b14af2045fa69ed2b7a48934bebb842d0f33e73e96e78766ecb14bb5347a11"
 dependencies = [
  "const-oid",
  "zeroize",
@@ -267,9 +264,9 @@
 
 [[package]]
 name = "elliptic-curve"
-version = "0.13.2"
+version = "0.13.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6ea5a92946e8614bb585254898bb7dd1ddad241ace60c52149e3765e34cc039d"
+checksum = "75c71eaa367f2e5d556414a8eea812bc62985c879748d6403edabd9cb03f16e7"
 dependencies = [
  "base16ct",
  "crypto-bigint",
@@ -302,9 +299,9 @@
 
 [[package]]
 name = "generic-array"
-version = "0.14.6"
+version = "0.14.7"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bff49e947297f3312447abdca79f45f4738097cc82b06e72054d2223f601f1b9"
+checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a"
 dependencies = [
  "typenum",
  "version_check",
@@ -456,9 +453,9 @@
 
 [[package]]
 name = "p256"
-version = "0.13.0"
+version = "0.13.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7270da3e5caa82afd3deb054cc237905853813aea3859544bc082c3fe55b8d47"
+checksum = "c9863ad85fa8f4460f9c48cb909d38a0d689dba1f6f6988a5e3e0d31071bcd4b"
 dependencies = [
  "elliptic-curve",
  "primeorder",
@@ -500,9 +497,9 @@
 
 [[package]]
 name = "primeorder"
-version = "0.13.0"
+version = "0.13.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7613fdcc0831c10060fa69833ea8fa2caa94b6456f51e25356a885b530a2e3d0"
+checksum = "cf8d3875361e28f7753baefef104386e7aa47642c93023356d97fdef4003bfb5"
 dependencies = [
  "elliptic-curve",
 ]
@@ -555,9 +552,9 @@
 
 [[package]]
 name = "sec1"
-version = "0.7.1"
+version = "0.7.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "48518a2b5775ba8ca5b46596aae011caa431e6ce7e4a67ead66d92f08884220e"
+checksum = "f0aec48e813d6b90b15f0b8948af3c63483992dee44c03e9930b3eebdabe046e"
 dependencies = [
  "base16ct",
  "der",
diff --git a/nearby/presence/ldt_np_adv/src/np_adv_test_vectors.rs b/nearby/presence/ldt_np_adv/src/np_adv_test_vectors.rs
index 6460e34..9d283d1 100644
--- a/nearby/presence/ldt_np_adv/src/np_adv_test_vectors.rs
+++ b/nearby/presence/ldt_np_adv/src/np_adv_test_vectors.rs
@@ -24,7 +24,7 @@
     NP_LEGACY_METADATA_KEY_LEN,
 };
 use anyhow::anyhow;
-use crypto_provider_rustcrypto::RustCrypto;
+use crypto_provider_default::CryptoProviderImpl;
 use rand::Rng;
 use rand_ext::{random_vec_rc, seeded_rng};
 use serde_json::json;
@@ -49,7 +49,7 @@
     for tc in test_cases {
         let key_seed = extract_key_array::<32>(&tc, "key_seed");
 
-        let hkdf = np_hkdf::NpKeySeedHkdf::<RustCrypto>::new(&key_seed);
+        let hkdf = np_hkdf::NpKeySeedHkdf::<CryptoProviderImpl>::new(&key_seed);
         let ldt_key = hkdf.legacy_ldt_key();
         let hmac_key = hkdf.legacy_metadata_key_hmac_key();
 
@@ -57,9 +57,9 @@
         assert_eq!(&extract_key_vec(&tc, "hmac_key"), &hmac_key.as_bytes());
 
         let salt = LegacySalt::from(extract_key_array(&tc, "adv_salt"));
-        let padder = salt_padder::<16, RustCrypto>(salt);
+        let padder = salt_padder::<16, CryptoProviderImpl>(salt);
 
-        let ldt_enc = LdtEncrypterXtsAes128::<RustCrypto>::new(&ldt_key);
+        let ldt_enc = LdtEncrypterXtsAes128::<CryptoProviderImpl>::new(&ldt_key);
 
         let decrypter = build_np_adv_decrypter_from_key_seed(
             &hkdf,
@@ -96,13 +96,13 @@
         let plaintext = random_vec_rc(&mut rng, len);
         let key_seed: [u8; 32] = rng.gen();
 
-        let hkdf = np_hkdf::NpKeySeedHkdf::<RustCrypto>::new(&key_seed);
+        let hkdf = np_hkdf::NpKeySeedHkdf::<CryptoProviderImpl>::new(&key_seed);
         let ldt_key = hkdf.legacy_ldt_key();
         let hmac_key = hkdf.legacy_metadata_key_hmac_key();
         let hmac: [u8; 32] = hmac_key.calculate_hmac(&plaintext[..NP_LEGACY_METADATA_KEY_LEN]);
-        let ldt_enc = LdtEncrypterXtsAes128::<RustCrypto>::new(&ldt_key);
+        let ldt_enc = LdtEncrypterXtsAes128::<CryptoProviderImpl>::new(&ldt_key);
 
-        let padder = salt_padder::<16, RustCrypto>(LegacySalt::from(rng.gen::<[u8; 2]>()));
+        let padder = salt_padder::<16, CryptoProviderImpl>(LegacySalt::from(rng.gen::<[u8; 2]>()));
         let mut ciphertext = plaintext.clone();
         ldt_enc.encrypt(&mut ciphertext[..], &padder).unwrap();
 
diff --git a/nearby/presence/ldt_np_adv/src/tests.rs b/nearby/presence/ldt_np_adv/src/tests.rs
index 653e145..56e917d 100644
--- a/nearby/presence/ldt_np_adv/src/tests.rs
+++ b/nearby/presence/ldt_np_adv/src/tests.rs
@@ -27,7 +27,7 @@
 };
 use alloc::vec::Vec;
 use crypto_provider::{CryptoProvider, CryptoRng};
-use crypto_provider_rustcrypto::RustCrypto;
+use crypto_provider_default::CryptoProviderImpl;
 use ldt::{DefaultPadder, LdtError, LdtKey, XorPadder};
 use np_hkdf::NpKeySeedHkdf;
 use rand::Rng;
@@ -37,7 +37,7 @@
 fn decrypt_matches_correct_ciphertext() {
     let mut rng = CryptoRng::new();
     for _ in 0..1_000 {
-        let test_state = make_test_components::<RustCrypto>(&mut rng);
+        let test_state = make_test_components::<CryptoProviderImpl>(&mut rng);
 
         let cipher = build_np_adv_decrypter_from_key_seed(&test_state.hkdf, test_state.hmac);
         let decrypted = cipher
@@ -52,7 +52,7 @@
 fn decrypt_doesnt_match_when_ciphertext_mangled() {
     let mut rng = CryptoRng::new();
     for _ in 0..1_000 {
-        let mut test_state = make_test_components::<RustCrypto>(&mut rng);
+        let mut test_state = make_test_components::<CryptoProviderImpl>(&mut rng);
 
         // mangle the ciphertext
         test_state.ciphertext[0] ^= 0xAA;
@@ -69,7 +69,7 @@
 fn decrypt_doesnt_match_when_plaintext_doesnt_match_mac() {
     let mut rng = CryptoRng::new();
     for _ in 0..1_000 {
-        let mut test_state = make_test_components::<RustCrypto>(&mut rng);
+        let mut test_state = make_test_components::<CryptoProviderImpl>(&mut rng);
 
         // mangle the mac
         test_state.hmac[0] ^= 0xAA;
@@ -87,7 +87,7 @@
 fn encrypt_works() {
     let mut rng = CryptoRng::new();
     for _ in 0..1_000 {
-        let test_state = make_test_components::<RustCrypto>(&mut rng);
+        let test_state = make_test_components::<CryptoProviderImpl>(&mut rng);
 
         let cipher = test_state.ldt_enc;
 
@@ -103,7 +103,8 @@
 #[test]
 #[allow(deprecated)]
 fn encrypt_too_short_err() {
-    let ldt_enc = LdtEncrypterXtsAes128::<RustCrypto>::new(&LdtKey::from_concatenated(&[0; 64]));
+    let ldt_enc =
+        LdtEncrypterXtsAes128::<CryptoProviderImpl>::new(&LdtKey::from_concatenated(&[0; 64]));
 
     let mut payload = [0; 7];
     assert_eq!(
@@ -115,7 +116,8 @@
 #[test]
 #[allow(deprecated)]
 fn encrypt_too_long_err() {
-    let ldt_enc = LdtEncrypterXtsAes128::<RustCrypto>::new(&LdtKey::from_concatenated(&[0; 64]));
+    let ldt_enc =
+        LdtEncrypterXtsAes128::<CryptoProviderImpl>::new(&LdtKey::from_concatenated(&[0; 64]));
 
     let mut payload = [0; 40];
     assert_eq!(
@@ -127,11 +129,11 @@
 #[test]
 fn decrypt_too_short_err() {
     let adv_cipher = LdtNpAdvDecrypterXtsAes128 {
-        ldt_decrypter: LdtXtsAes128Decrypter::<RustCrypto>::new(&LdtKey::from_concatenated(
-            &[0; 64],
-        )),
+        ldt_decrypter: LdtXtsAes128Decrypter::<CryptoProviderImpl>::new(
+            &LdtKey::from_concatenated(&[0; 64]),
+        ),
         metadata_key_tag: [0; 32],
-        metadata_key_hmac_key: np_hkdf::NpHmacSha256Key::<RustCrypto>::from([0; 32]),
+        metadata_key_hmac_key: np_hkdf::NpHmacSha256Key::<CryptoProviderImpl>::from([0; 32]),
     };
 
     let payload = [0; 7];
@@ -144,11 +146,11 @@
 #[test]
 fn decrypt_too_long_err() {
     let adv_cipher = LdtNpAdvDecrypterXtsAes128 {
-        ldt_decrypter: LdtXtsAes128Decrypter::<RustCrypto>::new(&LdtKey::from_concatenated(
-            &[0; 64],
-        )),
+        ldt_decrypter: LdtXtsAes128Decrypter::<CryptoProviderImpl>::new(
+            &LdtKey::from_concatenated(&[0; 64]),
+        ),
         metadata_key_tag: [0; 32],
-        metadata_key_hmac_key: np_hkdf::NpHmacSha256Key::<RustCrypto>::from([0; 32]),
+        metadata_key_hmac_key: np_hkdf::NpHmacSha256Key::<CryptoProviderImpl>::from([0; 32]),
     };
 
     let payload = [0; 40];
diff --git a/nearby/presence/ldt_np_adv_ffi/.cargo/config-boringssl.toml b/nearby/presence/ldt_np_adv_ffi/.cargo/config-boringssl.toml
new file mode 100644
index 0000000..f5ab7fa
--- /dev/null
+++ b/nearby/presence/ldt_np_adv_ffi/.cargo/config-boringssl.toml
@@ -0,0 +1,3 @@
+paths = [
+    "../../../boringssl-build/boringssl/rust/bssl-crypto",
+]
\ No newline at end of file
diff --git a/nearby/presence/ldt_np_adv_ffi/Cargo.lock b/nearby/presence/ldt_np_adv_ffi/Cargo.lock
index 075e658..12f0615 100644
--- a/nearby/presence/ldt_np_adv_ffi/Cargo.lock
+++ b/nearby/presence/ldt_np_adv_ffi/Cargo.lock
@@ -104,13 +104,6 @@
 [[package]]
 name = "bssl-crypto"
 version = "0.1.0"
-dependencies = [
- "bssl-sys",
-]
-
-[[package]]
-name = "bssl-sys"
-version = "0.1.0"
 
 [[package]]
 name = "bytes"
@@ -312,9 +305,9 @@
 
 [[package]]
 name = "elliptic-curve"
-version = "0.13.2"
+version = "0.13.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6ea5a92946e8614bb585254898bb7dd1ddad241ace60c52149e3765e34cc039d"
+checksum = "75c71eaa367f2e5d556414a8eea812bc62985c879748d6403edabd9cb03f16e7"
 dependencies = [
  "base16ct",
  "crypto-bigint",
@@ -588,9 +581,9 @@
 
 [[package]]
 name = "p256"
-version = "0.13.0"
+version = "0.13.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7270da3e5caa82afd3deb054cc237905853813aea3859544bc082c3fe55b8d47"
+checksum = "c9863ad85fa8f4460f9c48cb909d38a0d689dba1f6f6988a5e3e0d31071bcd4b"
 dependencies = [
  "elliptic-curve",
  "primeorder",
@@ -654,9 +647,9 @@
 
 [[package]]
 name = "primeorder"
-version = "0.13.0"
+version = "0.13.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7613fdcc0831c10060fa69833ea8fa2caa94b6456f51e25356a885b530a2e3d0"
+checksum = "cf8d3875361e28f7753baefef104386e7aa47642c93023356d97fdef4003bfb5"
 dependencies = [
  "elliptic-curve",
 ]
@@ -741,9 +734,9 @@
 
 [[package]]
 name = "sec1"
-version = "0.7.1"
+version = "0.7.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "48518a2b5775ba8ca5b46596aae011caa431e6ce7e4a67ead66d92f08884220e"
+checksum = "f0aec48e813d6b90b15f0b8948af3c63483992dee44c03e9930b3eebdabe046e"
 dependencies = [
  "base16ct",
  "der",
diff --git a/nearby/presence/np_hkdf/Cargo.toml b/nearby/presence/np_hkdf/Cargo.toml
index 686d0e5..3d1dd70 100644
--- a/nearby/presence/np_hkdf/Cargo.toml
+++ b/nearby/presence/np_hkdf/Cargo.toml
@@ -10,7 +10,7 @@
 xts_aes.workspace = true
 
 [dev-dependencies]
-crypto_provider_rustcrypto.workspace = true
+crypto_provider_default.workspace = true
 rand_ext.workspace = true
 test_helper.workspace = true
 
diff --git a/nearby/presence/np_hkdf/benches/np_hkdf.rs b/nearby/presence/np_hkdf/benches/np_hkdf.rs
index 54e682d..da796c4 100644
--- a/nearby/presence/np_hkdf/benches/np_hkdf.rs
+++ b/nearby/presence/np_hkdf/benches/np_hkdf.rs
@@ -14,27 +14,30 @@
 
 use criterion::{black_box, criterion_group, criterion_main, Criterion};
 use crypto_provider::{CryptoProvider, CryptoRng};
-use crypto_provider_rustcrypto::RustCrypto;
+use crypto_provider_default::CryptoProviderImpl;
 use rand_ext::random_bytes;
 
 pub fn build_np_hkdf(c: &mut Criterion) {
-    let mut rng = <RustCrypto as CryptoProvider>::CryptoRng::new();
+    let mut rng = <CryptoProviderImpl as CryptoProvider>::CryptoRng::new();
     for &num_keys in &[1_usize, 10, 100] {
         c.bench_function(&format!("build {num_keys} np_hkdf from key_seed"), |b| {
             let keys = (0..num_keys)
-                .map(|_| random_bytes::<32, RustCrypto>(&mut rng))
+                .map(|_| random_bytes::<32, CryptoProviderImpl>(&mut rng))
                 .collect::<Vec<_>>();
             b.iter(|| {
                 for key_seed in keys.iter() {
-                    black_box(np_hkdf::NpKeySeedHkdf::<RustCrypto>::new(key_seed));
+                    black_box(np_hkdf::NpKeySeedHkdf::<CryptoProviderImpl>::new(key_seed));
                 }
             });
         });
         c.bench_function(&format!("hkdf generate {num_keys} hmac keys"), |b| {
             let keys = (0..num_keys)
                 .map(|_| {
-                    np_hkdf::NpKeySeedHkdf::<RustCrypto>::new(&random_bytes::<32, RustCrypto>(
-                        &mut rng,
+                    np_hkdf::NpKeySeedHkdf::<CryptoProviderImpl>::new(&random_bytes::<
+                        32,
+                        CryptoProviderImpl,
+                    >(
+                        &mut rng
                     ))
                 })
                 .collect::<Vec<_>>();
@@ -47,8 +50,11 @@
         c.bench_function(&format!("hkdf generate {num_keys} AES keys"), |b| {
             let keys = (0..num_keys)
                 .map(|_| {
-                    np_hkdf::NpKeySeedHkdf::<RustCrypto>::new(&random_bytes::<32, RustCrypto>(
-                        &mut rng,
+                    np_hkdf::NpKeySeedHkdf::<CryptoProviderImpl>::new(&random_bytes::<
+                        32,
+                        CryptoProviderImpl,
+                    >(
+                        &mut rng
                     ))
                 })
                 .collect::<Vec<_>>();
@@ -61,8 +67,11 @@
         c.bench_function(&format!("hkdf generate {num_keys} LDT keys"), |b| {
             let keys = (0..num_keys)
                 .map(|_| {
-                    np_hkdf::NpKeySeedHkdf::<RustCrypto>::new(&random_bytes::<32, RustCrypto>(
-                        &mut rng,
+                    np_hkdf::NpKeySeedHkdf::<CryptoProviderImpl>::new(&random_bytes::<
+                        32,
+                        CryptoProviderImpl,
+                    >(
+                        &mut rng
                     ))
                 })
                 .collect::<Vec<_>>();
diff --git a/nearby/presence/np_hkdf/tests/test_vectors.rs b/nearby/presence/np_hkdf/tests/test_vectors.rs
index ce60337..dd9dca4 100644
--- a/nearby/presence/np_hkdf/tests/test_vectors.rs
+++ b/nearby/presence/np_hkdf/tests/test_vectors.rs
@@ -14,7 +14,7 @@
 
 use anyhow::anyhow;
 use crypto_provider::aes::AesKey;
-use crypto_provider_rustcrypto::RustCrypto;
+use crypto_provider_default::CryptoProviderImpl;
 use np_hkdf::{v1_salt::V1Salt, *};
 use rand::Rng as _;
 use rand_ext::seeded_rng;
@@ -38,7 +38,7 @@
         {
             let group = &tc["key_seed_hkdf"];
             let key_seed = extract_key_array::<32>(group, "key_seed");
-            let hkdf = NpKeySeedHkdf::<RustCrypto>::new(&key_seed);
+            let hkdf = NpKeySeedHkdf::<CryptoProviderImpl>::new(&key_seed);
             assert_eq!(
                 extract_key_array::<64>(group, "legacy_ldt_key"),
                 hkdf.legacy_ldt_key().as_concatenated()
@@ -82,7 +82,7 @@
             let ikm = extract_key_array::<2>(group, "adv_salt");
             assert_eq!(
                 extract_key_array::<16>(group, "expanded_salt"),
-                legacy_ldt_expanded_salt::<16, RustCrypto>(&ikm)
+                legacy_ldt_expanded_salt::<16, CryptoProviderImpl>(&ikm)
             )
         }
 
@@ -91,14 +91,14 @@
             let ikm = extract_key_array::<14>(group, "legacy_metadata_key");
             assert_eq!(
                 extract_key_array::<16>(group, "expanded_key"),
-                legacy_metadata_expanded_key::<RustCrypto>(&ikm)
+                legacy_metadata_expanded_key::<CryptoProviderImpl>(&ikm)
             )
         }
 
         {
             let group = &tc["extended_section_salt_hkdf"];
             let ikm = extract_key_array::<16>(group, "section_salt");
-            let salt = V1Salt::<RustCrypto>::from(ikm);
+            let salt = V1Salt::<CryptoProviderImpl>::from(ikm);
             assert_eq!(
                 extract_key_array::<16>(group, "derived_salt_first_section_no_de"),
                 salt.derive(None).unwrap(),
@@ -130,9 +130,9 @@
         let legacy_adv_salt: [u8; 2] = rng.gen();
         let legacy_metadata_key: [u8; 14] = rng.gen();
         let adv_salt_bytes: [u8; 16] = rng.gen();
-        let extended_adv_salt = V1Salt::<RustCrypto>::from(adv_salt_bytes);
+        let extended_adv_salt = V1Salt::<CryptoProviderImpl>::from(adv_salt_bytes);
 
-        let key_seed_hkdf = NpKeySeedHkdf::<RustCrypto>::new(&key_seed);
+        let key_seed_hkdf = NpKeySeedHkdf::<CryptoProviderImpl>::new(&key_seed);
         array
             .push(json!({
                 "key_seed_hkdf": {
@@ -150,12 +150,12 @@
                 },
                 "legacy_adv_salt_hkdf": {
                     "adv_salt": hex::encode_upper(legacy_adv_salt),
-                    "expanded_salt": hex::encode_upper(legacy_ldt_expanded_salt::<16, RustCrypto>(&legacy_adv_salt))
+                    "expanded_salt": hex::encode_upper(legacy_ldt_expanded_salt::<16, CryptoProviderImpl>(&legacy_adv_salt))
                 },
                 "legacy_metadata_key_hkdf": {
                     "legacy_metadata_key": hex::encode_upper(legacy_metadata_key),
                     "expanded_key":
-                        hex::encode_upper(legacy_metadata_expanded_key::<RustCrypto>(&legacy_metadata_key))
+                        hex::encode_upper(legacy_metadata_expanded_key::<CryptoProviderImpl>(&legacy_metadata_key))
                 },
                 "extended_section_salt_hkdf": {
                     "section_salt": hex::encode_upper(adv_salt_bytes),
diff --git a/nearby/presence/xts_aes/Cargo.toml b/nearby/presence/xts_aes/Cargo.toml
index 200fa91..72acf98 100644
--- a/nearby/presence/xts_aes/Cargo.toml
+++ b/nearby/presence/xts_aes/Cargo.toml
@@ -10,15 +10,16 @@
 ldt_tbc.workspace = true
 
 [dev-dependencies]
-crypto_provider_rustcrypto.workspace = true
+crypto_provider_default.workspace = true
 rand_ext.workspace = true
 test_helper.workspace = true
 
-aes.workspace = true
 anyhow.workspace = true
 base64.workspace = true
 hex.workspace = true
 rand.workspace = true
 rand_pcg.workspace = true
 regex.workspace = true
+
+aes.workspace = true
 xts-mode.workspace = true
\ No newline at end of file
diff --git a/nearby/presence/xts_aes/fuzz/Cargo.lock b/nearby/presence/xts_aes/fuzz/Cargo.lock
index 2bdaef3..06b5f86 100644
--- a/nearby/presence/xts_aes/fuzz/Cargo.lock
+++ b/nearby/presence/xts_aes/fuzz/Cargo.lock
@@ -207,9 +207,9 @@
 
 [[package]]
 name = "der"
-version = "0.7.1"
+version = "0.7.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bc906908ea6458456e5eaa160a9c08543ec3d1e6f71e2235cedd660cb65f9df0"
+checksum = "86b14af2045fa69ed2b7a48934bebb842d0f33e73e96e78766ecb14bb5347a11"
 dependencies = [
  "const-oid",
  "zeroize",
@@ -260,9 +260,9 @@
 
 [[package]]
 name = "elliptic-curve"
-version = "0.13.2"
+version = "0.13.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6ea5a92946e8614bb585254898bb7dd1ddad241ace60c52149e3765e34cc039d"
+checksum = "75c71eaa367f2e5d556414a8eea812bc62985c879748d6403edabd9cb03f16e7"
 dependencies = [
  "base16ct",
  "crypto-bigint",
@@ -295,9 +295,9 @@
 
 [[package]]
 name = "generic-array"
-version = "0.14.6"
+version = "0.14.7"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bff49e947297f3312447abdca79f45f4738097cc82b06e72054d2223f601f1b9"
+checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a"
 dependencies = [
  "typenum",
  "version_check",
@@ -407,9 +407,9 @@
 
 [[package]]
 name = "p256"
-version = "0.13.0"
+version = "0.13.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7270da3e5caa82afd3deb054cc237905853813aea3859544bc082c3fe55b8d47"
+checksum = "c9863ad85fa8f4460f9c48cb909d38a0d689dba1f6f6988a5e3e0d31071bcd4b"
 dependencies = [
  "elliptic-curve",
  "primeorder",
@@ -451,9 +451,9 @@
 
 [[package]]
 name = "primeorder"
-version = "0.13.0"
+version = "0.13.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7613fdcc0831c10060fa69833ea8fa2caa94b6456f51e25356a885b530a2e3d0"
+checksum = "cf8d3875361e28f7753baefef104386e7aa47642c93023356d97fdef4003bfb5"
 dependencies = [
  "elliptic-curve",
 ]
@@ -506,9 +506,9 @@
 
 [[package]]
 name = "sec1"
-version = "0.7.1"
+version = "0.7.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "48518a2b5775ba8ca5b46596aae011caa431e6ce7e4a67ead66d92f08884220e"
+checksum = "f0aec48e813d6b90b15f0b8948af3c63483992dee44c03e9930b3eebdabe046e"
 dependencies = [
  "base16ct",
  "der",
diff --git a/nearby/presence/xts_aes/tests/compare_with_xts_mode_test.rs b/nearby/presence/xts_aes/tests/compare_with_xts_mode_test.rs
new file mode 100644
index 0000000..92c5f78
--- /dev/null
+++ b/nearby/presence/xts_aes/tests/compare_with_xts_mode_test.rs
@@ -0,0 +1,112 @@
+// 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 aes::{cipher, cipher::KeyInit as _};
+use alloc::vec::Vec;
+use crypto_provider::aes::*;
+use crypto_provider::CryptoProvider;
+use crypto_provider_default::CryptoProviderImpl;
+use ldt_tbc::TweakableBlockCipherDecrypter;
+use ldt_tbc::TweakableBlockCipherEncrypter;
+use rand::{self, distributions, Rng as _};
+use rand_ext::seeded_rng;
+use xts_aes::{Tweak, XtsAes128Key, XtsAes256Key, XtsDecrypter, XtsEncrypter, XtsKey};
+extern crate alloc;
+
+#[test]
+fn identical_to_xtsmode_crate() {
+    // xts-mode crate exists, but is tied to RustCrypto, which we can't necessarily use with
+    // whatever C/assembly we need to use on embedded platforms. Thus, we have our own, but
+    // we can compare our impl's results with theirs.
+
+    let mut rng = seeded_rng();
+
+    for _ in 0..100_000 {
+        if rng.gen() {
+            let mut key = [0; 32];
+            rng.fill(&mut key);
+            let xts_enc = XtsEncrypter::<<CryptoProviderImpl as CryptoProvider>::Aes128, _>::new(
+                &XtsAes128Key::from(&key),
+            );
+            let xts_dec = XtsDecrypter::<<CryptoProviderImpl as CryptoProvider>::Aes128, _>::new(
+                &XtsAes128Key::from(&key),
+            );
+
+            let primary_cipher =
+                aes::Aes128::new(cipher::generic_array::GenericArray::from_slice(&key[0..16]));
+            let tweak_cipher =
+                aes::Aes128::new(cipher::generic_array::GenericArray::from_slice(&key[16..]));
+            let other_xts = xts_mode::Xts128::new(primary_cipher, tweak_cipher);
+
+            do_roundtrip(xts_enc, xts_dec, other_xts, &mut rng)
+        } else {
+            let mut key = [0; 64];
+            rng.fill(&mut key);
+            let xts_enc = XtsEncrypter::<<CryptoProviderImpl as CryptoProvider>::Aes256, _>::new(
+                &XtsAes256Key::from(&key),
+            );
+            let xts_dec = XtsDecrypter::<<CryptoProviderImpl as CryptoProvider>::Aes256, _>::new(
+                &XtsAes256Key::from(&key),
+            );
+
+            let primary_cipher =
+                aes::Aes256::new(cipher::generic_array::GenericArray::from_slice(&key[0..32]));
+            let tweak_cipher =
+                aes::Aes256::new(cipher::generic_array::GenericArray::from_slice(&key[32..]));
+            let other_xts = xts_mode::Xts128::new(primary_cipher, tweak_cipher);
+
+            do_roundtrip(xts_enc, xts_dec, other_xts, &mut rng)
+        };
+    }
+
+    fn do_roundtrip<
+        A: Aes<Key = K::BlockCipherKey>,
+        K: XtsKey,
+        C: cipher::BlockEncrypt + cipher::BlockDecrypt + cipher::BlockCipher,
+        R: rand::Rng,
+    >(
+        xts_enc: XtsEncrypter<A, K>,
+        xts_dec: XtsDecrypter<A, K>,
+        other_xts: xts_mode::Xts128<C>,
+        rng: &mut R,
+    ) {
+        // 1-3 blocks
+        let plaintext_len_range = distributions::Uniform::new_inclusive(BLOCK_SIZE, BLOCK_SIZE * 4);
+        let mut plaintext = Vec::<u8>::new();
+        plaintext.extend((0..rng.sample(plaintext_len_range)).map(|_| rng.gen::<u8>()));
+
+        // encrypt with our impl
+        let mut ciphertext = plaintext.clone();
+        let tweak: Tweak = rng.gen::<u128>().into();
+        xts_enc
+            .encrypt_data_unit(tweak.clone(), &mut ciphertext)
+            .unwrap();
+
+        // encrypt with the other impl
+        let mut other_ciphertext = plaintext.clone();
+        let tweak_bytes = tweak.le_bytes();
+        other_xts.encrypt_sector(&mut other_ciphertext[..], tweak_bytes);
+
+        assert_eq!(ciphertext, other_ciphertext);
+
+        // decrypt ciphertext in place
+        xts_dec.decrypt_data_unit(tweak, &mut ciphertext).unwrap();
+        assert_eq!(plaintext, ciphertext);
+
+        // and with the other impl
+        other_xts.decrypt_sector(&mut other_ciphertext[..], tweak_bytes);
+
+        assert_eq!(ciphertext, other_ciphertext);
+    }
+}
diff --git a/nearby/presence/xts_aes/tests/xts_nist_test_vectors.rs b/nearby/presence/xts_aes/tests/xts_nist_test_vectors.rs
index 05eca0d..94b2c34 100644
--- a/nearby/presence/xts_aes/tests/xts_nist_test_vectors.rs
+++ b/nearby/presence/xts_aes/tests/xts_nist_test_vectors.rs
@@ -16,7 +16,7 @@
 
 use anyhow::anyhow;
 use crypto_provider::CryptoProvider;
-use crypto_provider_rustcrypto::RustCrypto;
+use crypto_provider_default::CryptoProviderImpl;
 use ldt_tbc::TweakableBlockCipherDecrypter;
 use ldt_tbc::TweakableBlockCipherEncrypter;
 use ldt_tbc::TweakableBlockCipherKey;
@@ -25,7 +25,7 @@
 
 #[test]
 fn nist_test_vectors_data_unit_seq_128() -> Result<(), anyhow::Error> {
-    run_test_cases::<XtsAes128Key, <RustCrypto as CryptoProvider>::Aes128>(
+    run_test_cases::<XtsAes128Key, <CryptoProviderImpl as CryptoProvider>::Aes128>(
         "format tweak value input - data unit seq no/XTSGenAES128.rsp",
         // not 1000 because we skip test cases with data that isn't a multiple of 8 bits
         800,
@@ -34,7 +34,7 @@
 
 #[test]
 fn nist_test_vectors_data_unit_seq_256() -> Result<(), anyhow::Error> {
-    run_test_cases::<XtsAes256Key, <RustCrypto as CryptoProvider>::Aes256>(
+    run_test_cases::<XtsAes256Key, <CryptoProviderImpl as CryptoProvider>::Aes256>(
         "format tweak value input - data unit seq no/XTSGenAES256.rsp",
         600,
     )
@@ -42,7 +42,7 @@
 
 #[test]
 fn nist_test_vectors_hex_tweak_128() -> Result<(), anyhow::Error> {
-    run_test_cases::<XtsAes128Key, <RustCrypto as CryptoProvider>::Aes128>(
+    run_test_cases::<XtsAes128Key, <CryptoProviderImpl as CryptoProvider>::Aes128>(
         "format tweak value input - 128 hex str/XTSGenAES128.rsp",
         800,
     )
@@ -50,7 +50,7 @@
 
 #[test]
 fn nist_test_vectors_hex_tweak_256() -> Result<(), anyhow::Error> {
-    run_test_cases::<XtsAes256Key, <RustCrypto as CryptoProvider>::Aes256>(
+    run_test_cases::<XtsAes256Key, <CryptoProviderImpl as CryptoProvider>::Aes256>(
         "format tweak value input - 128 hex str/XTSGenAES256.rsp",
         600,
     )
diff --git a/nearby/presence/xts_aes/tests/xts_roundtrip_tests.rs b/nearby/presence/xts_aes/tests/xts_roundtrip_tests.rs
index 042b62e..93f61a8 100644
--- a/nearby/presence/xts_aes/tests/xts_roundtrip_tests.rs
+++ b/nearby/presence/xts_aes/tests/xts_roundtrip_tests.rs
@@ -12,10 +12,10 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-use aes::{cipher, cipher::KeyInit as _};
 use alloc::vec::Vec;
 use crypto_provider::aes::*;
-use crypto_provider_rustcrypto::aes::{Aes128, Aes256};
+use crypto_provider::CryptoProvider;
+use crypto_provider_default::CryptoProviderImpl;
 use ldt_tbc::TweakableBlockCipherDecrypter;
 use ldt_tbc::TweakableBlockCipherEncrypter;
 use rand::{self, distributions, Rng as _};
@@ -31,16 +31,24 @@
             let mut key = [0_u8; 32];
             rng.fill(&mut key);
             do_roundtrip(
-                XtsEncrypter::<Aes128, _>::new(&XtsAes128Key::from(&key)),
-                XtsDecrypter::<Aes128, _>::new(&XtsAes128Key::from(&key)),
+                XtsEncrypter::<<CryptoProviderImpl as CryptoProvider>::Aes128, _>::new(
+                    &XtsAes128Key::from(&key),
+                ),
+                XtsDecrypter::<<CryptoProviderImpl as CryptoProvider>::Aes128, _>::new(
+                    &XtsAes128Key::from(&key),
+                ),
                 &mut rng,
             )
         } else {
             let mut key = [0_u8; 64];
             rng.fill(&mut key);
             do_roundtrip(
-                XtsEncrypter::<Aes256, _>::new(&XtsAes256Key::from(&key)),
-                XtsDecrypter::<Aes256, _>::new(&XtsAes256Key::from(&key)),
+                XtsEncrypter::<<CryptoProviderImpl as CryptoProvider>::Aes256, _>::new(
+                    &XtsAes256Key::from(&key),
+                ),
+                XtsDecrypter::<<CryptoProviderImpl as CryptoProvider>::Aes256, _>::new(
+                    &XtsAes256Key::from(&key),
+                ),
                 &mut rng,
             )
         };
@@ -68,82 +76,3 @@
         assert_eq!(plaintext, ciphertext);
     }
 }
-
-#[test]
-fn identical_to_xtsmode_crate() {
-    // xts-mode crate exists, but is tied to RustCrypto, which we can't necessarily use with
-    // whatever C/assembly we need to use on embedded platforms. Thus, we have our own, but
-    // we can compare our impl's results with theirs.
-
-    let mut rng = seeded_rng();
-
-    for _ in 0..100_000 {
-        if rng.gen() {
-            let mut key = [0; 32];
-            rng.fill(&mut key);
-            let xts_enc = XtsEncrypter::<Aes128, _>::new(&XtsAes128Key::from(&key));
-            let xts_dec = XtsDecrypter::<Aes128, _>::new(&XtsAes128Key::from(&key));
-
-            let primary_cipher =
-                aes::Aes128::new(cipher::generic_array::GenericArray::from_slice(&key[0..16]));
-            let tweak_cipher =
-                aes::Aes128::new(cipher::generic_array::GenericArray::from_slice(&key[16..]));
-            let other_xts = xts_mode::Xts128::new(primary_cipher, tweak_cipher);
-
-            do_roundtrip(xts_enc, xts_dec, other_xts, &mut rng)
-        } else {
-            let mut key = [0; 64];
-            rng.fill(&mut key);
-            let xts_enc = XtsEncrypter::<Aes256, _>::new(&XtsAes256Key::from(&key));
-            let xts_dec = XtsDecrypter::<Aes256, _>::new(&XtsAes256Key::from(&key));
-
-            let primary_cipher =
-                aes::Aes256::new(cipher::generic_array::GenericArray::from_slice(&key[0..32]));
-            let tweak_cipher =
-                aes::Aes256::new(cipher::generic_array::GenericArray::from_slice(&key[32..]));
-            let other_xts = xts_mode::Xts128::new(primary_cipher, tweak_cipher);
-
-            do_roundtrip(xts_enc, xts_dec, other_xts, &mut rng)
-        };
-    }
-
-    fn do_roundtrip<
-        A: Aes<Key = K::BlockCipherKey>,
-        K: XtsKey,
-        C: cipher::BlockEncrypt + cipher::BlockDecrypt + cipher::BlockCipher,
-        R: rand::Rng,
-    >(
-        xts_enc: XtsEncrypter<A, K>,
-        xts_dec: XtsDecrypter<A, K>,
-        other_xts: xts_mode::Xts128<C>,
-        rng: &mut R,
-    ) {
-        // 1-3 blocks
-        let plaintext_len_range = distributions::Uniform::new_inclusive(BLOCK_SIZE, BLOCK_SIZE * 4);
-        let mut plaintext = Vec::<u8>::new();
-        plaintext.extend((0..rng.sample(plaintext_len_range)).map(|_| rng.gen::<u8>()));
-
-        // encrypt with our impl
-        let mut ciphertext = plaintext.clone();
-        let tweak: Tweak = rng.gen::<u128>().into();
-        xts_enc
-            .encrypt_data_unit(tweak.clone(), &mut ciphertext)
-            .unwrap();
-
-        // encrypt with the other impl
-        let mut other_ciphertext = plaintext.clone();
-        let tweak_bytes = tweak.le_bytes();
-        other_xts.encrypt_sector(&mut other_ciphertext[..], tweak_bytes);
-
-        assert_eq!(ciphertext, other_ciphertext);
-
-        // decrypt ciphertext in place
-        xts_dec.decrypt_data_unit(tweak, &mut ciphertext).unwrap();
-        assert_eq!(plaintext, ciphertext);
-
-        // and with the other impl
-        other_xts.decrypt_sector(&mut other_ciphertext[..], tweak_bytes);
-
-        assert_eq!(ciphertext, other_ciphertext);
-    }
-}
diff --git a/nearby/scripts/build-script.sh b/nearby/scripts/build-script.sh
index c117a5c..3643482 100755
--- a/nearby/scripts/build-script.sh
+++ b/nearby/scripts/build-script.sh
@@ -128,12 +128,11 @@
   # Turn off RustCrypto and use openssl
   cargo build --no-default-features --features=openssl
   # Turn off RustCrypto and use boringssl
-  cargo build --no-default-features --features=boringssl
+  cargo --config .cargo/config-boringssl.toml build --no-default-features --features=boringssl
   cargo doc --no-deps
   cargo clippy --release
   cargo clippy --features=std
   cargo clippy --no-default-features --features=openssl
-  cargo clippy --no-default-features --features=boringssl
   cargo clippy --no-default-features --features=std
   cargo deny check
   cd ../
@@ -155,7 +154,7 @@
 
   # test with boringssl crypto feature flag
   echo "Testing boringssl"
-  (cd ../ldt_np_adv_ffi && cargo build --no-default-features --features boringssl --release)
+  (cd ../ldt_np_adv_ffi && cargo --config .cargo/config-boringssl.toml build --no-default-features --features boringssl --release)
   (cd ldt_np_c_sample/tests && make && ctest)
 
   # test with openssl feature flag
@@ -181,7 +180,9 @@
   if ! git -C boringssl pull origin master; then
     git clone https://boringssl.googlesource.com/boringssl
   fi
-  cd boringssl && mkdir -p build && cd build
+  # Snap to the AOSP commit of boringssl
+  boringssl_rev=$(curl https://android.googlesource.com/platform/external/boringssl/+/master/BORINGSSL_REVISION?format=text | base64 -d)
+  cd boringssl && git checkout $boringssl_rev && mkdir -p build && cd build
   target=$(rustc -vV | awk '/host/ { print $2 }')
   cmake -G Ninja .. -DRUST_BINDINGS="$target" && ninja
   # A valid Rust crate is built under `boringssl-build/boringssl/build/rust/bssl-sys`