diff --git a/nearby/Cargo.lock b/nearby/Cargo.lock
index 7dc0e09..4730df4 100644
--- a/nearby/Cargo.lock
+++ b/nearby/Cargo.lock
@@ -501,7 +501,6 @@
  "rand 0.8.5",
  "rand_chacha 0.3.1",
  "rand_core 0.6.4",
- "rand_core_05_adapter",
  "sec1",
  "sha2 0.10.6",
  "subtle",
@@ -594,6 +593,7 @@
  "curve25519-dalek",
  "ed25519",
  "rand 0.7.3",
+ "rand_core 0.5.1",
  "serde",
  "sha2 0.9.9",
  "zeroize",
@@ -1054,7 +1054,9 @@
  "anyhow",
  "array_view",
  "base64 0.21.0",
+ "criterion",
  "crypto_provider",
+ "crypto_provider_openssl",
  "crypto_provider_rustcrypto",
  "hex",
  "ldt",
@@ -1062,6 +1064,7 @@
  "np_hkdf",
  "rand 0.8.5",
  "rand_ext",
+ "rand_pcg",
  "serde_json",
  "test_helper",
  "xts_aes",
@@ -1407,39 +1410,53 @@
 
 [[package]]
 name = "protobuf"
-version = "2.28.0"
+version = "3.2.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "106dd99e98437432fed6519dedecfade6a06a73bb7b2a1e019fdd2bee5778d94"
-
-[[package]]
-name = "protobuf-codegen"
-version = "2.28.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "033460afb75cf755fcfc16dfaed20b86468082a2ea24e05ac35ab4a099a017d6"
+checksum = "b55bad9126f378a853655831eb7363b7b01b81d19f8cb1218861086ca4a1a61e"
 dependencies = [
- "protobuf",
+ "once_cell",
+ "protobuf-support",
+ "thiserror",
 ]
 
 [[package]]
-name = "protoc"
-version = "2.28.0"
+name = "protobuf-codegen"
+version = "3.2.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a0218039c514f9e14a5060742ecd50427f8ac4f85a6dc58f2ddb806e318c55ee"
+checksum = "0dd418ac3c91caa4032d37cb80ff0d44e2ebe637b2fb243b6234bf89cdac4901"
 dependencies = [
+ "anyhow",
+ "once_cell",
+ "protobuf",
+ "protobuf-parse",
+ "regex",
+ "tempfile",
+ "thiserror",
+]
+
+[[package]]
+name = "protobuf-parse"
+version = "3.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9d39b14605eaa1f6a340aec7f320b34064feb26c93aec35d6a9a2272a8ddfa49"
+dependencies = [
+ "anyhow",
+ "indexmap",
  "log",
+ "protobuf",
+ "protobuf-support",
+ "tempfile",
+ "thiserror",
  "which",
 ]
 
 [[package]]
-name = "protoc-rust"
-version = "2.28.0"
+name = "protobuf-support"
+version = "3.2.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "22f8a182bb17c485f20bdc4274a8c39000a61024cfe461c799b50fec77267838"
+checksum = "a5d4d7b8601c814cfb36bcebb79f0e61e45e1e93640cf778837833bbed05c372"
 dependencies = [
- "protobuf",
- "protobuf-codegen",
- "protoc",
- "tempfile",
+ "thiserror",
 ]
 
 [[package]]
@@ -1775,9 +1792,9 @@
 
 [[package]]
 name = "spin"
-version = "0.9.7"
+version = "0.9.8"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c0959fd6f767df20b231736396e4f602171e00d95205676286e79d4a4eb67bef"
+checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67"
 dependencies = [
  "lock_api",
 ]
@@ -1899,7 +1916,7 @@
  "log",
  "rand 0.8.5",
  "rand_chacha 0.3.1",
- "spin 0.9.7",
+ "spin 0.9.8",
  "ukey2_connections",
  "ukey2_rs",
 ]
@@ -1931,7 +1948,7 @@
  "log",
  "rand 0.8.5",
  "rand_chacha 0.3.1",
- "spin 0.9.7",
+ "spin 0.9.8",
  "ukey2_connections",
  "ukey2_rs",
 ]
@@ -1942,7 +1959,7 @@
 dependencies = [
  "diff",
  "protobuf",
- "protoc-rust",
+ "protobuf-codegen",
 ]
 
 [[package]]
diff --git a/nearby/Cargo.toml b/nearby/Cargo.toml
index eabca53..a5570a8 100644
--- a/nearby/Cargo.toml
+++ b/nearby/Cargo.toml
@@ -62,10 +62,11 @@
 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)
-protobuf = "2.27.1"
+protobuf = "3.2.0"
+protobuf-codegen = "3.2.0"
 protoc-rust = "2.27.1"
 jni = "0.21.1"
-spin = "0.9.4"
+spin = "0.9.8"
 anyhow = "1.0.64"
 log = "0.4.17"
 env_logger = "0.10.0"
diff --git a/nearby/connections/ukey2/ukey2/src/proto_adapter.rs b/nearby/connections/ukey2/ukey2/src/proto_adapter.rs
index 0660595..adb9982 100644
--- a/nearby/connections/ukey2/ukey2/src/proto_adapter.rs
+++ b/nearby/connections/ukey2/ukey2/src/proto_adapter.rs
@@ -18,12 +18,11 @@
 use crypto_provider::p256::{P256EcdhProvider, P256PublicKey, P256};
 use crypto_provider::CryptoProvider;
 use derive_getters::Getters;
-use ukey2_proto::protobuf::ProtobufEnum;
 use ukey2_proto::ukey2_all_proto::{securemessage, ukey};
 
 /// For generated proto types for UKEY2 messages
 trait WithMessageType: ukey2_proto::protobuf::Message {
-    fn msg_type() -> ukey::Ukey2Message_Type;
+    fn msg_type() -> ukey::ukey2message::Type;
 }
 
 pub(crate) trait ToWrappedMessage {
@@ -35,41 +34,42 @@
 
 impl<M: WithMessageType> ToWrappedMessage for M {
     fn to_wrapped_msg(self) -> ukey::Ukey2Message {
-        let mut message = ukey::Ukey2Message::default();
-        message.set_message_type(Self::msg_type());
-        message.set_message_data(self.write_to_bytes().unwrap());
-        message
+        ukey::Ukey2Message {
+            message_type: Some(Self::msg_type().into()),
+            message_data: self.write_to_bytes().ok(),
+            ..Default::default()
+        }
     }
 }
 
 impl WithMessageType for ukey::Ukey2Alert {
-    fn msg_type() -> ukey::Ukey2Message_Type {
-        ukey::Ukey2Message_Type::ALERT
+    fn msg_type() -> ukey::ukey2message::Type {
+        ukey::ukey2message::Type::ALERT
     }
 }
 
 impl WithMessageType for ukey::Ukey2ServerInit {
-    fn msg_type() -> ukey::Ukey2Message_Type {
-        ukey::Ukey2Message_Type::SERVER_INIT
+    fn msg_type() -> ukey::ukey2message::Type {
+        ukey::ukey2message::Type::SERVER_INIT
     }
 }
 
 impl WithMessageType for ukey::Ukey2ClientFinished {
-    fn msg_type() -> ukey::Ukey2Message_Type {
-        ukey::Ukey2Message_Type::CLIENT_FINISH
+    fn msg_type() -> ukey::ukey2message::Type {
+        ukey::ukey2message::Type::CLIENT_FINISH
     }
 }
 
 impl WithMessageType for ukey::Ukey2ClientInit {
-    fn msg_type() -> ukey::Ukey2Message_Type {
-        ukey::Ukey2Message_Type::CLIENT_INIT
+    fn msg_type() -> ukey::ukey2message::Type {
+        ukey::ukey2message::Type::CLIENT_INIT
     }
 }
 
 /// Convert a generated proto type into our custom adapter type.
 pub(crate) trait IntoAdapter<A> {
     /// Convert `self` into the adapter type.
-    fn into_adapter(self) -> Result<A, ukey::Ukey2Alert_AlertType>;
+    fn into_adapter(self) -> Result<A, ukey::ukey2alert::AlertType>;
 }
 
 #[derive(Debug, PartialEq, Eq)]
@@ -125,53 +125,45 @@
     commitment: Vec<u8>,
 }
 
-pub(crate) enum PublicKeyType {
-    Ec256,
-    RSA2048,
-    Dh2048Modp,
-}
-
 pub(crate) enum GenericPublicKey<C: CryptoProvider> {
     Ec256(<C::P256 as EcdhProvider<P256>>::PublicKey),
     // Other public key types are not supported
 }
 
-impl IntoAdapter<MessageType> for i32 {
-    fn into_adapter(self) -> Result<MessageType, ukey::Ukey2Alert_AlertType> {
-        const CLIENT_INIT: i32 = ukey::Ukey2Message_Type::CLIENT_INIT as i32;
-        const SERVER_INIT: i32 = ukey::Ukey2Message_Type::SERVER_INIT as i32;
-        const CLIENT_FINISH: i32 = ukey::Ukey2Message_Type::CLIENT_FINISH as i32;
+impl IntoAdapter<MessageType> for ukey::ukey2message::Type {
+    fn into_adapter(self) -> Result<MessageType, ukey::ukey2alert::AlertType> {
         match self {
-            CLIENT_INIT => Some(MessageType::ClientInit),
-            SERVER_INIT => Some(MessageType::ServerInit),
-            CLIENT_FINISH => Some(MessageType::ClientFinish),
-            _ => None,
+            ukey::ukey2message::Type::CLIENT_INIT => Ok(MessageType::ClientInit),
+            ukey::ukey2message::Type::SERVER_INIT => Ok(MessageType::ServerInit),
+            ukey::ukey2message::Type::CLIENT_FINISH => Ok(MessageType::ClientFinish),
+            _ => Err(ukey::ukey2alert::AlertType::BAD_MESSAGE_TYPE),
         }
-        .ok_or(ukey::Ukey2Alert_AlertType::BAD_MESSAGE_TYPE)
     }
 }
 
 impl IntoAdapter<HandshakeCipher> for i32 {
-    fn into_adapter(self) -> Result<HandshakeCipher, ukey::Ukey2Alert_AlertType> {
+    fn into_adapter(self) -> Result<HandshakeCipher, ukey::ukey2alert::AlertType> {
         const P256_CODE: i32 = ukey::Ukey2HandshakeCipher::P256_SHA512 as i32;
         const CURVE25519_CODE: i32 = ukey::Ukey2HandshakeCipher::CURVE25519_SHA512 as i32;
         match self {
             P256_CODE => Ok(HandshakeCipher::P256Sha512),
             CURVE25519_CODE => Ok(HandshakeCipher::Curve25519Sha512),
-            _ => Err(ukey::Ukey2Alert_AlertType::BAD_HANDSHAKE_CIPHER),
+            _ => Err(ukey::ukey2alert::AlertType::BAD_HANDSHAKE_CIPHER),
         }
     }
 }
 
-impl IntoAdapter<CipherCommitment> for ukey::Ukey2ClientInit_CipherCommitment {
-    fn into_adapter(self) -> Result<CipherCommitment, ukey::Ukey2Alert_AlertType> {
-        let handshake_cipher: HandshakeCipher =
-            self.get_handshake_cipher().value().into_adapter()?;
+impl IntoAdapter<CipherCommitment> for ukey::ukey2client_init::CipherCommitment {
+    fn into_adapter(self) -> Result<CipherCommitment, ukey::ukey2alert::AlertType> {
+        let handshake_cipher: HandshakeCipher = self
+            .handshake_cipher
+            .ok_or(ukey::ukey2alert::AlertType::BAD_HANDSHAKE_CIPHER)
+            .and_then(|code| code.value().into_adapter())?;
         // no bad commitment so this is best-effort
-        let commitment = self.get_commitment().to_vec();
-        if commitment.is_empty() {
-            return Err(ukey::Ukey2Alert_AlertType::BAD_HANDSHAKE_CIPHER);
-        }
+        let commitment = self
+            .commitment
+            .filter(|c| !c.is_empty())
+            .ok_or(ukey::ukey2alert::AlertType::BAD_HANDSHAKE_CIPHER)?;
         Ok(CipherCommitment {
             commitment,
             cipher: handshake_cipher,
@@ -180,18 +172,17 @@
 }
 
 impl IntoAdapter<ClientInit> for ukey::Ukey2ClientInit {
-    fn into_adapter(self) -> Result<ClientInit, ukey::Ukey2Alert_AlertType> {
-        if self.get_random().len() != 32 {
-            return Err(ukey::Ukey2Alert_AlertType::BAD_RANDOM);
+    fn into_adapter(self) -> Result<ClientInit, ukey::ukey2alert::AlertType> {
+        if self.random().len() != 32 {
+            return Err(ukey::ukey2alert::AlertType::BAD_RANDOM);
         }
-        if !self.has_version() {
-            return Err(ukey::Ukey2Alert_AlertType::BAD_VERSION);
-        }
-        let version: i32 = self.get_version();
-        let next_protocol = String::from(self.get_next_protocol());
-        if next_protocol.is_empty() {
-            return Err(ukey::Ukey2Alert_AlertType::BAD_NEXT_PROTOCOL);
-        }
+        let version: i32 = self
+            .version
+            .ok_or(ukey::ukey2alert::AlertType::BAD_VERSION)?;
+        let next_protocol = self
+            .next_protocol
+            .filter(|n| !n.is_empty())
+            .ok_or(ukey::ukey2alert::AlertType::BAD_NEXT_PROTOCOL)?;
         Ok(ClientInit {
             next_protocol,
             version,
@@ -205,21 +196,22 @@
 }
 
 impl IntoAdapter<ServerInit> for ukey::Ukey2ServerInit {
-    fn into_adapter(self) -> Result<ServerInit, ukey::Ukey2Alert_AlertType> {
-        if !self.has_version() {
-            return Err(ukey::Ukey2Alert_AlertType::BAD_VERSION);
-        }
-        let version: i32 = self.get_version();
+    fn into_adapter(self) -> Result<ServerInit, ukey::ukey2alert::AlertType> {
+        let version: i32 = self
+            .version
+            .ok_or(ukey::ukey2alert::AlertType::BAD_VERSION)?;
         let random: [u8; 32] = self
-            .get_random()
-            .try_into()
-            .map_err(|_| ukey::Ukey2Alert_AlertType::BAD_RANDOM)?;
-        let handshake_cipher = self.get_handshake_cipher().value().into_adapter()?;
+            .random
+            .and_then(|r| r.try_into().ok())
+            .ok_or(ukey::ukey2alert::AlertType::BAD_RANDOM)?;
+        let handshake_cipher = self
+            .handshake_cipher
+            .ok_or(ukey::ukey2alert::AlertType::BAD_HANDSHAKE_CIPHER)
+            .and_then(|code| code.value().into_adapter())?;
         // We will be handling bad pubkeys in the layers above
-        let public_key: Vec<u8> = self.get_public_key().to_vec();
-        if public_key.is_empty() {
-            return Err(ukey::Ukey2Alert_AlertType::BAD_PUBLIC_KEY);
-        }
+        let public_key: Vec<u8> = self
+            .public_key
+            .ok_or(ukey::ukey2alert::AlertType::BAD_PUBLIC_KEY)?;
         Ok(ServerInit {
             handshake_cipher,
             version,
@@ -230,50 +222,45 @@
 }
 
 impl IntoAdapter<ClientFinished> for ukey::Ukey2ClientFinished {
-    fn into_adapter(self) -> Result<ClientFinished, ukey::Ukey2Alert_AlertType> {
-        let public_key: Vec<u8> = self.get_public_key().to_vec();
-        if public_key.is_empty() {
-            return Err(ukey::Ukey2Alert_AlertType::BAD_PUBLIC_KEY);
-        }
+    fn into_adapter(self) -> Result<ClientFinished, ukey::ukey2alert::AlertType> {
+        let public_key: Vec<u8> = self
+            .public_key
+            .ok_or(ukey::ukey2alert::AlertType::BAD_PUBLIC_KEY)?;
         Ok(ClientFinished { public_key })
     }
 }
 
 impl<C: CryptoProvider> IntoAdapter<GenericPublicKey<C>> for securemessage::GenericPublicKey {
-    fn into_adapter(self) -> Result<GenericPublicKey<C>, ukey::Ukey2Alert_AlertType> {
-        const DH2048_MODP: i32 = securemessage::PublicKeyType::DH2048_MODP as i32;
-        const EC_P256: i32 = securemessage::PublicKeyType::EC_P256 as i32;
-        const RSA_2048: i32 = securemessage::PublicKeyType::RSA2048 as i32;
-        let key_type = match self.get_field_type().value() {
-            DH2048_MODP => Some(PublicKeyType::Dh2048Modp),
-            EC_P256 => Some(PublicKeyType::Ec256),
-            RSA_2048 => Some(PublicKeyType::RSA2048),
-            _ => None,
-        }
-        .ok_or(ukey::Ukey2Alert_AlertType::BAD_PUBLIC_KEY)?;
+    fn into_adapter(self) -> Result<GenericPublicKey<C>, ukey::ukey2alert::AlertType> {
+        let key_type = self
+            .type_
+            .and_then(|t| t.enum_value().ok())
+            .ok_or(ukey::ukey2alert::AlertType::BAD_PUBLIC_KEY)?;
         match key_type {
-            PublicKeyType::Ec256 => {
-                let key = self.ec_p256_public_key.unwrap();
-                let key_x_bytes: [u8; 32] =
-                    positive_twos_complement_to_32_byte_unsigned(key.get_x())
-                        .ok_or(ukey::Ukey2Alert_AlertType::BAD_PUBLIC_KEY)?;
-                let key_y_bytes: [u8; 32] =
-                    positive_twos_complement_to_32_byte_unsigned(key.get_y())
-                        .ok_or(ukey::Ukey2Alert_AlertType::BAD_PUBLIC_KEY)?;
+            securemessage::PublicKeyType::EC_P256 => {
+                let (key_x, key_y) = self
+                    .ec_p256_public_key
+                    .into_option()
+                    .and_then(|pk| pk.x.zip(pk.y))
+                    .ok_or(ukey::ukey2alert::AlertType::BAD_PUBLIC_KEY)?;
+                let key_x_bytes: [u8; 32] = positive_twos_complement_to_32_byte_unsigned(&key_x)
+                    .ok_or(ukey::ukey2alert::AlertType::BAD_PUBLIC_KEY)?;
+                let key_y_bytes: [u8; 32] = positive_twos_complement_to_32_byte_unsigned(&key_y)
+                    .ok_or(ukey::ukey2alert::AlertType::BAD_PUBLIC_KEY)?;
                 <C::P256 as P256EcdhProvider>::PublicKey::from_affine_coordinates(
                     &key_x_bytes,
                     &key_y_bytes,
                 )
                 .map(GenericPublicKey::Ec256)
-                .map_err(|_| ukey::Ukey2Alert_AlertType::BAD_PUBLIC_KEY)
+                .map_err(|_| ukey::ukey2alert::AlertType::BAD_PUBLIC_KEY)
             }
-            PublicKeyType::RSA2048 => {
+            securemessage::PublicKeyType::RSA2048 => {
                 // We don't support RSA keys
-                Err(ukey::Ukey2Alert_AlertType::BAD_PUBLIC_KEY)
+                Err(ukey::ukey2alert::AlertType::BAD_PUBLIC_KEY)
             }
-            PublicKeyType::Dh2048Modp => {
+            securemessage::PublicKeyType::DH2048_MODP => {
                 // We don't support DH2048 keys, only ECDH.
-                Err(ukey::Ukey2Alert_AlertType::BAD_PUBLIC_KEY)
+                Err(ukey::ukey2alert::AlertType::BAD_PUBLIC_KEY)
             }
         }
     }
diff --git a/nearby/connections/ukey2/ukey2/src/state_machine.rs b/nearby/connections/ukey2/ukey2/src/state_machine.rs
index d381083..6b9a367 100644
--- a/nearby/connections/ukey2/ukey2/src/state_machine.rs
+++ b/nearby/connections/ukey2/ukey2/src/state_machine.rs
@@ -21,28 +21,28 @@
 use crypto_provider::CryptoProvider;
 use log::error;
 use std::fmt::Debug;
-use ukey2_proto::protobuf::{Message, ProtobufEnum};
+use ukey2_proto::protobuf::Message;
 use ukey2_proto::ukey2_all_proto::ukey;
 
 /// An alert type and message to be sent to the other party.
 #[derive(Debug, PartialEq, Eq)]
 pub struct SendAlert {
-    alert_type: ukey::Ukey2Alert_AlertType,
+    alert_type: ukey::ukey2alert::AlertType,
     msg: Option<String>,
 }
 
 impl SendAlert {
-    pub(crate) fn from(alert_type: ukey::Ukey2Alert_AlertType, msg: Option<String>) -> Self {
+    pub(crate) fn from(alert_type: ukey::ukey2alert::AlertType, msg: Option<String>) -> Self {
         Self { alert_type, msg }
     }
 
     /// Convert this `SendAlert` into serialized bytes of the `Ukey2Alert` protobuf message.
     pub fn into_wrapped_alert_msg(self) -> Vec<u8> {
-        let mut alert_message = ukey::Ukey2Alert::default();
-        alert_message.set_field_type(self.alert_type);
-        if let Some(msg) = self.msg {
-            alert_message.set_error_message(msg)
-        }
+        let alert_message = ukey::Ukey2Alert {
+            type_: Some(self.alert_type.into()),
+            error_message: self.msg,
+            ..Default::default()
+        };
         alert_message.to_wrapped_msg().write_to_bytes().unwrap()
     }
 }
@@ -102,7 +102,7 @@
         match message_type {
             // Client should not be receiving ClientInit/ClientFinish
             MessageType::ClientInit | MessageType::ClientFinish => Err(SendAlert::from(
-                ukey::Ukey2Alert_AlertType::INCORRECT_MESSAGE,
+                ukey::ukey2alert::AlertType::INCORRECT_MESSAGE,
                 Some("wrong message".to_string()),
             )),
             MessageType::ServerInit => {
@@ -110,7 +110,7 @@
                 self.handle_server_init(message, message_bytes.to_vec())
                     .map_err(|_| {
                         SendAlert::from(
-                            ukey::Ukey2Alert_AlertType::BAD_MESSAGE_DATA,
+                            ukey::ukey2alert::AlertType::BAD_MESSAGE_DATA,
                             Some("bad message_data".to_string()),
                         )
                     })
@@ -137,13 +137,13 @@
                         SendAlert::from(
                             match e {
                                 ClientInitError::BadVersion => {
-                                    ukey::Ukey2Alert_AlertType::BAD_VERSION
+                                    ukey::ukey2alert::AlertType::BAD_VERSION
                                 }
                                 ClientInitError::BadHandshakeCipher => {
-                                    ukey::Ukey2Alert_AlertType::BAD_HANDSHAKE_CIPHER
+                                    ukey::ukey2alert::AlertType::BAD_HANDSHAKE_CIPHER
                                 }
                                 ClientInitError::BadNextProtocol => {
-                                    ukey::Ukey2Alert_AlertType::BAD_NEXT_PROTOCOL
+                                    ukey::ukey2alert::AlertType::BAD_NEXT_PROTOCOL
                                 }
                             },
                             None,
@@ -151,7 +151,7 @@
                     })
             }
             MessageType::ClientFinish | MessageType::ServerInit => Err(SendAlert::from(
-                ukey::Ukey2Alert_AlertType::INCORRECT_MESSAGE,
+                ukey::ukey2alert::AlertType::INCORRECT_MESSAGE,
                 Some("wrong message".to_string()),
             )),
         }
@@ -173,25 +173,25 @@
                 self.handle_client_finished_msg(message, message_bytes)
                     .map_err(|e| match e {
                         ClientFinishedError::BadEd25519Key => SendAlert::from(
-                            ukey::Ukey2Alert_AlertType::BAD_PUBLIC_KEY,
+                            ukey::ukey2alert::AlertType::BAD_PUBLIC_KEY,
                             "Bad ED25519 Key".to_string().into(),
                         ),
                         ClientFinishedError::BadP256Key => SendAlert::from(
-                            ukey::Ukey2Alert_AlertType::BAD_PUBLIC_KEY,
+                            ukey::ukey2alert::AlertType::BAD_PUBLIC_KEY,
                             "Bad P256 Key".to_string().into(),
                         ),
                         ClientFinishedError::UnknownCommitment => SendAlert::from(
-                            ukey::Ukey2Alert_AlertType::BAD_MESSAGE_DATA,
+                            ukey::ukey2alert::AlertType::BAD_MESSAGE_DATA,
                             "Unknown commitment".to_string().into(),
                         ),
                         ClientFinishedError::BadKeyExchange => SendAlert::from(
-                            ukey::Ukey2Alert_AlertType::INTERNAL_ERROR,
+                            ukey::ukey2alert::AlertType::INTERNAL_ERROR,
                             "Key exchange error".to_string().into(),
                         ),
                     })
             }
             MessageType::ClientInit | MessageType::ServerInit => Err(SendAlert::from(
-                ukey::Ukey2Alert_AlertType::INCORRECT_MESSAGE,
+                ukey::ukey2alert::AlertType::INCORRECT_MESSAGE,
                 "wrong message".to_string().into(),
             )),
         }
@@ -204,27 +204,26 @@
         .map_err(|_| {
             error!("Unable to marshal into Ukey2Message");
             SendAlert::from(
-                ukey::Ukey2Alert_AlertType::BAD_MESSAGE,
+                ukey::ukey2alert::AlertType::BAD_MESSAGE,
                 Some("Bad message data".to_string()),
             )
         })
         .and_then(|message| {
-            let message_data = message.get_message_data();
+            let message_data = message.message_data();
             if message_data.is_empty() {
                 return Err(SendAlert::from(
-                    ukey::Ukey2Alert_AlertType::BAD_MESSAGE_DATA,
+                    ukey::ukey2alert::AlertType::BAD_MESSAGE_DATA,
                     None,
                 ));
             }
-            let message_type = message.get_message_type();
-            if message_type == ukey::Ukey2Message_Type::UNKNOWN_DO_NOT_USE {
+            let message_type = message.message_type();
+            if message_type == ukey::ukey2message::Type::UNKNOWN_DO_NOT_USE {
                 return Err(SendAlert::from(
-                    ukey::Ukey2Alert_AlertType::BAD_MESSAGE_TYPE,
+                    ukey::ukey2alert::AlertType::BAD_MESSAGE_TYPE,
                     None,
                 ));
             }
             message_type
-                .value()
                 .into_adapter()
                 .map_err(|e| {
                     error!("Unknown UKEY2 Message Type");
@@ -246,7 +245,7 @@
                 "Unable to unmarshal message, check frame of the message you were trying to send"
             );
             SendAlert::from(
-                ukey::Ukey2Alert_AlertType::BAD_MESSAGE_DATA,
+                ukey::ukey2alert::AlertType::BAD_MESSAGE_DATA,
                 Some("frame error".to_string()),
             )
         })?
diff --git a/nearby/connections/ukey2/ukey2/src/tests.rs b/nearby/connections/ukey2/ukey2/src/tests.rs
index 5f47706..5f3b942 100644
--- a/nearby/connections/ukey2/ukey2/src/tests.rs
+++ b/nearby/connections/ukey2/ukey2/src/tests.rs
@@ -52,12 +52,13 @@
         <C::X25519 as EcdhProvider<X25519>>::PublicKey::from_bytes(&secret.public_key_bytes())
             .unwrap();
     let random: [u8; 32] = rng.gen();
-
-    let mut message_data: ukey::Ukey2ServerInit = ukey::Ukey2ServerInit::default();
-    message_data.set_version(1);
-    message_data.set_random(random.to_vec());
-    message_data.set_handshake_cipher(ukey::Ukey2HandshakeCipher::CURVE25519_SHA512);
-    message_data.set_public_key(public_key.to_bytes().to_vec());
+    let message_data: ukey::Ukey2ServerInit = ukey::Ukey2ServerInit {
+        version: Some(1),
+        random: Some(random.to_vec()),
+        handshake_cipher: Some(ukey::Ukey2HandshakeCipher::CURVE25519_SHA512.into()),
+        public_key: Some(public_key.to_bytes()),
+        ..Default::default()
+    };
 
     let _client = client1
         .advance_state(
@@ -96,14 +97,18 @@
     let cipher = HandshakeCipher::Curve25519Sha512;
     let client_random = rng.gen::<[u8; 32]>();
     let client_init_framed = {
-        let mut commitment = ukey::Ukey2ClientInit_CipherCommitment::default();
-        commitment.set_handshake_cipher(cipher.as_proto());
-        commitment.set_commitment(client_finished_hash);
-        let mut client_init = ukey::Ukey2ClientInit::default();
-        client_init.set_version(1);
-        client_init.set_random(client_random.to_vec());
-        client_init.set_cipher_commitments(vec![commitment].into());
-        client_init.set_next_protocol("AES_256_CBC-HMAC_SHA256".to_string());
+        let commitment = ukey::ukey2client_init::CipherCommitment {
+            handshake_cipher: Some(cipher.as_proto().into()),
+            commitment: Some(client_finished_hash),
+            ..Default::default()
+        };
+        let client_init = ukey::Ukey2ClientInit {
+            version: Some(1),
+            random: Some(client_random.to_vec()),
+            cipher_commitments: vec![commitment],
+            next_protocol: Some("AES_256_CBC-HMAC_SHA256".to_string()),
+            ..Default::default()
+        };
         client_init.to_wrapped_msg()
     };
     let server2 = server1
@@ -149,15 +154,19 @@
     let client_finished_hash = hasher.finalize().to_vec();
     let cipher = HandshakeCipher::P256Sha512;
     let client_init_framed = {
-        let mut commitment = ukey::Ukey2ClientInit_CipherCommitment::default();
-        commitment.set_handshake_cipher(cipher.as_proto());
-        commitment.set_commitment(client_finished_hash);
-        let mut client_init = ukey::Ukey2ClientInit::default();
-        client_init.set_version(1);
-        client_init.set_random(rng.gen::<[u8; 32]>().to_vec());
-        client_init.set_cipher_commitments(vec![commitment].into());
-        client_init.set_next_protocol("AES_256_CBC-HMAC_SHA256".to_string());
-        client_init.to_wrapped_msg()
+        let commitment = ukey::ukey2client_init::CipherCommitment {
+            handshake_cipher: Some(cipher.as_proto().into()),
+            commitment: Some(client_finished_hash),
+            ..Default::default()
+        };
+        ukey::Ukey2ClientInit {
+            version: Some(1),
+            random: Some(rng.gen::<[u8; 32]>().to_vec()),
+            cipher_commitments: vec![commitment],
+            next_protocol: Some("AES_256_CBC-HMAC_SHA256".to_string()),
+            ..Default::default()
+        }
+        .to_wrapped_msg()
     };
     let server2 = server1
         .advance_state(&mut rng, &client_init_framed.write_to_bytes().unwrap())
@@ -171,10 +180,10 @@
 
 #[test]
 fn message_type_discriminant() {
-    assert_eq!(1, ukey::Ukey2Message_Type::ALERT as i32);
-    assert_eq!(2, ukey::Ukey2Message_Type::CLIENT_INIT as i32);
-    assert_eq!(3, ukey::Ukey2Message_Type::SERVER_INIT as i32);
-    assert_eq!(4, ukey::Ukey2Message_Type::CLIENT_FINISH as i32);
+    assert_eq!(1, ukey::ukey2message::Type::ALERT as i32);
+    assert_eq!(2, ukey::ukey2message::Type::CLIENT_INIT as i32);
+    assert_eq!(3, ukey::ukey2message::Type::SERVER_INIT as i32);
+    assert_eq!(4, ukey::ukey2message::Type::CLIENT_FINISH as i32);
 }
 
 #[test]
@@ -185,9 +194,24 @@
 
 #[test]
 fn convert_to_message_type() {
-    assert_eq!(MessageType::ClientInit, 2.into_adapter().unwrap());
-    assert_eq!(MessageType::ServerInit, 3.into_adapter().unwrap());
-    assert_eq!(MessageType::ClientFinish, 4.into_adapter().unwrap());
+    assert_eq!(
+        MessageType::ClientInit,
+        ukey::ukey2message::Type::CLIENT_INIT
+            .into_adapter()
+            .unwrap()
+    );
+    assert_eq!(
+        MessageType::ServerInit,
+        ukey::ukey2message::Type::SERVER_INIT
+            .into_adapter()
+            .unwrap()
+    );
+    assert_eq!(
+        MessageType::ClientFinish,
+        ukey::ukey2message::Type::CLIENT_FINISH
+            .into_adapter()
+            .unwrap()
+    );
 }
 
 #[test]
diff --git a/nearby/connections/ukey2/ukey2/src/ukey2_handshake.rs b/nearby/connections/ukey2/ukey2/src/ukey2_handshake.rs
index e5e0cb9..ec88318 100644
--- a/nearby/connections/ukey2/ukey2/src/ukey2_handshake.rs
+++ b/nearby/connections/ukey2/ukey2/src/ukey2_handshake.rs
@@ -99,12 +99,16 @@
                         num_bigint::Sign::Plus,
                         num_bigint::BigUint::from_bytes_be(y.to_vec().as_slice()),
                     );
-                    let mut proto_key = securemessage::EcP256PublicKey::default();
-                    proto_key.set_x(bigboi_x.to_signed_bytes_be());
-                    proto_key.set_y(bigboi_y.to_signed_bytes_be());
-                    let mut key = securemessage::GenericPublicKey::default();
-                    key.set_field_type(securemessage::PublicKeyType::EC_P256);
-                    key.set_ec_p256_public_key(proto_key);
+                    let proto_key = securemessage::EcP256PublicKey {
+                        x: Some(bigboi_x.to_signed_bytes_be()),
+                        y: Some(bigboi_y.to_signed_bytes_be()),
+                        ..Default::default()
+                    };
+                    let key = securemessage::GenericPublicKey {
+                        type_: Some(securemessage::PublicKeyType::EC_P256.into()),
+                        ec_p256_public_key: Some(proto_key).into(),
+                        ..Default::default()
+                    };
                     key.write_to_bytes().ok()
                 }
                 HandshakeCipher::Curve25519Sha512 => None,
@@ -392,8 +396,10 @@
                 >>::Rng as CryptoRng>::new(),
             );
         let curve25519_client_finished_bytes = {
-            let mut client_finished = ukey::Ukey2ClientFinished::default();
-            client_finished.set_public_key(curve25519_secret.public_key_bytes());
+            let client_finished = ukey::Ukey2ClientFinished {
+                public_key: Some(curve25519_secret.public_key_bytes()),
+                ..Default::default()
+            };
             client_finished.to_wrapped_msg().write_to_bytes().unwrap()
         };
         let curve25519_client_finished_hash =
@@ -406,35 +412,42 @@
                         >>::Rng as CryptoRng>::new(),
                     );
         let p256_client_finished_bytes = {
-            let mut client_finished = ukey::Ukey2ClientFinished::default();
-            client_finished.set_public_key(
-                handshake_impl
-                    .encode_public_key::<C>(
-                        p256_secret.public_key_bytes(),
-                        HandshakeCipher::P256Sha512,
-                    )
-                    .unwrap(),
-            );
+            let client_finished = ukey::Ukey2ClientFinished {
+                public_key: Some(
+                    handshake_impl
+                        .encode_public_key::<C>(
+                            p256_secret.public_key_bytes(),
+                            HandshakeCipher::P256Sha512,
+                        )
+                        .unwrap(),
+                ),
+                ..Default::default()
+            };
             client_finished.to_wrapped_msg().write_to_bytes().unwrap()
         };
         let p256_client_finished_hash = C::Sha512::sha512(&p256_client_finished_bytes).to_vec();
 
         // ClientInit Message
         let client_init_bytes = {
-            let mut curve25519_commitment = ukey::Ukey2ClientInit_CipherCommitment::default();
-            curve25519_commitment
-                .set_handshake_cipher(HandshakeCipher::Curve25519Sha512.as_proto());
-            curve25519_commitment.set_commitment(curve25519_client_finished_hash);
+            let curve25519_commitment = ukey::ukey2client_init::CipherCommitment {
+                handshake_cipher: Some(HandshakeCipher::Curve25519Sha512.as_proto().into()),
+                commitment: Some(curve25519_client_finished_hash),
+                ..Default::default()
+            };
 
-            let mut p256_commitment = ukey::Ukey2ClientInit_CipherCommitment::default();
-            p256_commitment.set_handshake_cipher(HandshakeCipher::P256Sha512.as_proto());
-            p256_commitment.set_commitment(p256_client_finished_hash);
+            let p256_commitment = ukey::ukey2client_init::CipherCommitment {
+                handshake_cipher: Some(HandshakeCipher::P256Sha512.as_proto().into()),
+                commitment: Some(p256_client_finished_hash),
+                ..Default::default()
+            };
 
-            let mut client_init = ukey::Ukey2ClientInit::default();
-            client_init.set_version(1);
-            client_init.set_random(random);
-            client_init.set_cipher_commitments(vec![curve25519_commitment, p256_commitment].into());
-            client_init.set_next_protocol(next_protocol.to_string());
+            let client_init = ukey::Ukey2ClientInit {
+                version: Some(1),
+                random: Some(random),
+                cipher_commitments: vec![curve25519_commitment, p256_commitment],
+                next_protocol: Some(next_protocol.to_string()),
+                ..Default::default()
+            };
             client_init.to_wrapped_msg().write_to_bytes().unwrap()
         };
 
diff --git a/nearby/connections/ukey2/ukey2_c_ffi/Cargo.toml b/nearby/connections/ukey2/ukey2_c_ffi/Cargo.toml
index 117c9ab..ec58e9a 100644
--- a/nearby/connections/ukey2/ukey2_c_ffi/Cargo.toml
+++ b/nearby/connections/ukey2/ukey2_c_ffi/Cargo.toml
@@ -15,7 +15,7 @@
 log.workspace = true
 rand.workspace = true
 rand_chacha.workspace = true
-spin = "0.9.4"
+spin.workspace = true
 
 [features]
 default = ["rustcrypto"]
diff --git a/nearby/connections/ukey2/ukey2_c_ffi/src/lib.rs b/nearby/connections/ukey2/ukey2_c_ffi/src/lib.rs
index 25d8992..68d42c9 100644
--- a/nearby/connections/ukey2/ukey2_c_ffi/src/lib.rs
+++ b/nearby/connections/ukey2/ukey2_c_ffi/src/lib.rs
@@ -351,7 +351,7 @@
     arr: CFFIByteArray,
 ) -> CD2DRestoreConnectionContextV1Result {
     let saved_session = std::slice::from_raw_parts(arr.ptr, arr.len);
-    let ctx = D2DConnectionContextV1::from_saved_session(saved_session);
+    let ctx = D2DConnectionContextV1::from_saved_session::<CryptoProvider>(saved_session);
     if let Ok(conn_ctx) = ctx {
         let final_ctx = Box::new(conn_ctx);
         CD2DRestoreConnectionContextV1Result {
diff --git a/nearby/connections/ukey2/ukey2_connections/fuzz/Cargo.lock b/nearby/connections/ukey2/ukey2_connections/fuzz/Cargo.lock
index f97ed03..8f42dbe 100644
--- a/nearby/connections/ukey2/ukey2_connections/fuzz/Cargo.lock
+++ b/nearby/connections/ukey2/ukey2_connections/fuzz/Cargo.lock
@@ -40,6 +40,21 @@
 ]
 
 [[package]]
+name = "aho-corasick"
+version = "0.7.20"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cc936419f96fa211c1b9166887b38e5e40b19958e5b895be7c1f93adec7071ac"
+dependencies = [
+ "memchr",
+]
+
+[[package]]
+name = "anyhow"
+version = "1.0.70"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7de8ce5e0f9f8d88245311066a578d72b7af3e7088f32783804676302df237e4"
+
+[[package]]
 name = "arbitrary"
 version = "1.3.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -68,15 +83,6 @@
 
 [[package]]
 name = "block-buffer"
-version = "0.9.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4"
-dependencies = [
- "generic-array",
-]
-
-[[package]]
-name = "block-buffer"
 version = "0.10.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71"
@@ -94,12 +100,6 @@
 ]
 
 [[package]]
-name = "byteorder"
-version = "1.4.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610"
-
-[[package]]
 name = "bytes"
 version = "1.4.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -161,7 +161,7 @@
 checksum = "7c2538c4e68e52548bacb3e83ac549f903d44f011ac9d5abb5e132e67d0808f7"
 dependencies = [
  "generic-array",
- "rand_core 0.6.4",
+ "rand_core",
  "subtle",
  "zeroize",
 ]
@@ -173,7 +173,7 @@
 checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3"
 dependencies = [
  "generic-array",
- "rand_core 0.6.4",
+ "rand_core",
  "typenum",
 ]
 
@@ -201,10 +201,9 @@
  "p256",
  "rand",
  "rand_chacha",
- "rand_core 0.6.4",
- "rand_core_05_adapter",
+ "rand_core",
  "sec1",
- "sha2 0.10.6",
+ "sha2",
  "subtle",
  "x25519-dalek",
 ]
@@ -220,15 +219,16 @@
 
 [[package]]
 name = "curve25519-dalek"
-version = "3.2.0"
+version = "4.0.0-rc.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0b9fdf9972b2bd6af2d913799d9ebc165ea4d2e65878e329d9c6b372c4491b61"
+checksum = "03d928d978dbec61a1167414f5ec534f24bea0d7a0d24dd9b6233d3d8223e585"
 dependencies = [
- "byteorder",
- "digest 0.9.0",
- "rand_core 0.5.1",
+ "cfg-if",
+ "digest",
+ "fiat-crypto",
+ "packed_simd_2",
+ "platforms",
  "subtle",
- "zeroize",
 ]
 
 [[package]]
@@ -249,7 +249,7 @@
 dependencies = [
  "proc-macro2",
  "quote",
- "syn",
+ "syn 1.0.109",
 ]
 
 [[package]]
@@ -260,16 +260,7 @@
 dependencies = [
  "proc-macro2",
  "quote",
- "syn",
-]
-
-[[package]]
-name = "digest"
-version = "0.9.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066"
-dependencies = [
- "generic-array",
+ "syn 1.0.109",
 ]
 
 [[package]]
@@ -278,30 +269,30 @@
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "8168378f4e5023e7218c89c891c0fd8ecdb5e5e4f18cb78f38cf245dd021e76f"
 dependencies = [
- "block-buffer 0.10.4",
+ "block-buffer",
  "crypto-common",
  "subtle",
 ]
 
 [[package]]
 name = "ed25519"
-version = "1.5.3"
+version = "2.2.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "91cff35c70bba8a626e3185d8cd48cc11b5437e1a5bcd15b9b5fa3c64b6dfee7"
+checksum = "5fb04eee5d9d907f29e80ee6b0e78f7e2c82342c63e3580d8c4f69d9d5aad963"
 dependencies = [
  "signature",
 ]
 
 [[package]]
 name = "ed25519-dalek"
-version = "1.0.1"
+version = "2.0.0-rc.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c762bae6dcaf24c4c84667b8579785430908723d5c889f469d76a41d59cc7a9d"
+checksum = "798f704d128510932661a3489b08e3f4c934a01d61c5def59ae7b8e48f19665a"
 dependencies = [
  "curve25519-dalek",
  "ed25519",
- "sha2 0.9.9",
- "zeroize",
+ "rand_core",
+ "sha2",
 ]
 
 [[package]]
@@ -318,12 +309,12 @@
 dependencies = [
  "base16ct",
  "crypto-bigint",
- "digest 0.10.6",
+ "digest",
  "ff",
  "generic-array",
  "group",
  "hkdf",
- "rand_core 0.6.4",
+ "rand_core",
  "sec1",
  "subtle",
  "zeroize",
@@ -365,11 +356,17 @@
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449"
 dependencies = [
- "rand_core 0.6.4",
+ "rand_core",
  "subtle",
 ]
 
 [[package]]
+name = "fiat-crypto"
+version = "0.1.20"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e825f6987101665dea6ec934c09ec6d721de7bc1bf92248e1d5810c8cd636b77"
+
+[[package]]
 name = "generic-array"
 version = "0.14.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -398,11 +395,17 @@
 checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63"
 dependencies = [
  "ff",
- "rand_core 0.6.4",
+ "rand_core",
  "subtle",
 ]
 
 [[package]]
+name = "hashbrown"
+version = "0.12.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888"
+
+[[package]]
 name = "hermit-abi"
 version = "0.3.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -423,7 +426,17 @@
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e"
 dependencies = [
- "digest 0.10.6",
+ "digest",
+]
+
+[[package]]
+name = "indexmap"
+version = "1.9.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99"
+dependencies = [
+ "autocfg",
+ "hashbrown",
 ]
 
 [[package]]
@@ -483,6 +496,12 @@
 ]
 
 [[package]]
+name = "libm"
+version = "0.1.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7fc7aa29613bd6a620df431842069224d8bc9011086b1db4c0e0cd47fa03ec9a"
+
+[[package]]
 name = "linux-raw-sys"
 version = "0.1.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -572,6 +591,22 @@
 ]
 
 [[package]]
+name = "packed_simd_2"
+version = "0.3.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a1914cd452d8fccd6f9db48147b29fd4ae05bea9dc5d9ad578509f72415de282"
+dependencies = [
+ "cfg-if",
+ "libm",
+]
+
+[[package]]
+name = "platforms"
+version = "3.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e3d7ddaed09e0eb771a79ab0fd64609ba0afb0a8366421957936ad14cbd13630"
+
+[[package]]
 name = "polyval"
 version = "0.6.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -600,48 +635,62 @@
 
 [[package]]
 name = "proc-macro2"
-version = "1.0.53"
+version = "1.0.56"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ba466839c78239c09faf015484e5cc04860f88242cff4d03eb038f04b4699b73"
+checksum = "2b63bdb0cd06f1f4dedf69b254734f9b45af66e4a031e42a7480257d9898b435"
 dependencies = [
  "unicode-ident",
 ]
 
 [[package]]
 name = "protobuf"
-version = "2.28.0"
+version = "3.2.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "106dd99e98437432fed6519dedecfade6a06a73bb7b2a1e019fdd2bee5778d94"
-
-[[package]]
-name = "protobuf-codegen"
-version = "2.28.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "033460afb75cf755fcfc16dfaed20b86468082a2ea24e05ac35ab4a099a017d6"
+checksum = "b55bad9126f378a853655831eb7363b7b01b81d19f8cb1218861086ca4a1a61e"
 dependencies = [
- "protobuf",
+ "once_cell",
+ "protobuf-support",
+ "thiserror",
 ]
 
 [[package]]
-name = "protoc"
-version = "2.28.0"
+name = "protobuf-codegen"
+version = "3.2.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a0218039c514f9e14a5060742ecd50427f8ac4f85a6dc58f2ddb806e318c55ee"
+checksum = "0dd418ac3c91caa4032d37cb80ff0d44e2ebe637b2fb243b6234bf89cdac4901"
 dependencies = [
+ "anyhow",
+ "once_cell",
+ "protobuf",
+ "protobuf-parse",
+ "regex",
+ "tempfile",
+ "thiserror",
+]
+
+[[package]]
+name = "protobuf-parse"
+version = "3.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9d39b14605eaa1f6a340aec7f320b34064feb26c93aec35d6a9a2272a8ddfa49"
+dependencies = [
+ "anyhow",
+ "indexmap",
  "log",
+ "protobuf",
+ "protobuf-support",
+ "tempfile",
+ "thiserror",
  "which",
 ]
 
 [[package]]
-name = "protoc-rust"
-version = "2.28.0"
+name = "protobuf-support"
+version = "3.2.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "22f8a182bb17c485f20bdc4274a8c39000a61024cfe461c799b50fec77267838"
+checksum = "a5d4d7b8601c814cfb36bcebb79f0e61e45e1e93640cf778837833bbed05c372"
 dependencies = [
- "protobuf",
- "protobuf-codegen",
- "protoc",
- "tempfile",
+ "thiserror",
 ]
 
 [[package]]
@@ -661,7 +710,7 @@
 dependencies = [
  "libc",
  "rand_chacha",
- "rand_core 0.6.4",
+ "rand_core",
 ]
 
 [[package]]
@@ -671,17 +720,11 @@
 checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88"
 dependencies = [
  "ppv-lite86",
- "rand_core 0.6.4",
+ "rand_core",
 ]
 
 [[package]]
 name = "rand_core"
-version = "0.5.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19"
-
-[[package]]
-name = "rand_core"
 version = "0.6.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c"
@@ -690,14 +733,6 @@
 ]
 
 [[package]]
-name = "rand_core_05_adapter"
-version = "0.1.0"
-dependencies = [
- "rand",
- "rand_core 0.5.1",
-]
-
-[[package]]
 name = "redox_syscall"
 version = "0.2.16"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -707,6 +742,23 @@
 ]
 
 [[package]]
+name = "regex"
+version = "1.7.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8b1f693b24f6ac912f4893ef08244d70b6067480d2f1a46e950c9691e6749d1d"
+dependencies = [
+ "aho-corasick",
+ "memchr",
+ "regex-syntax",
+]
+
+[[package]]
+name = "regex-syntax"
+version = "0.6.29"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1"
+
+[[package]]
 name = "rustix"
 version = "0.36.11"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -735,33 +787,20 @@
 
 [[package]]
 name = "sha2"
-version = "0.9.9"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800"
-dependencies = [
- "block-buffer 0.9.0",
- "cfg-if",
- "cpufeatures",
- "digest 0.9.0",
- "opaque-debug",
-]
-
-[[package]]
-name = "sha2"
 version = "0.10.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "82e6b795fe2e3b1e845bafcb27aa35405c4d47cdfc92af5fc8d3002f76cebdc0"
 dependencies = [
  "cfg-if",
  "cpufeatures",
- "digest 0.10.6",
+ "digest",
 ]
 
 [[package]]
 name = "signature"
-version = "1.6.4"
+version = "2.1.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "74233d3b3b2f6d4b006dc19dee745e73e2a6bfb6f93607cd3b02bd5b00797d7c"
+checksum = "5e1788eed21689f9cf370582dfc467ef36ed9c707f073528ddafa8d83e3b8500"
 
 [[package]]
 name = "subtle"
@@ -781,15 +820,14 @@
 ]
 
 [[package]]
-name = "synstructure"
-version = "0.12.6"
+name = "syn"
+version = "2.0.13"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f36bdaa60a83aca3921b5259d5400cbf5e90fc51931376a9bd4a0eb79aa7210f"
+checksum = "4c9da457c5285ac1f936ebd076af6dac17a61cfe7826f2076b4d015cf47bc8ec"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn",
- "unicode-xid",
+ "unicode-ident",
 ]
 
 [[package]]
@@ -806,6 +844,26 @@
 ]
 
 [[package]]
+name = "thiserror"
+version = "1.0.40"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "978c9a314bd8dc99be594bc3c175faaa9794be04a5a5e153caba6915336cebac"
+dependencies = [
+ "thiserror-impl",
+]
+
+[[package]]
+name = "thiserror-impl"
+version = "1.0.40"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f9456a42c5b0d803c8cd86e73dd7cc9edd429499f37a3550d286d5e86720569f"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.13",
+]
+
+[[package]]
 name = "typenum"
 version = "1.16.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -840,7 +898,7 @@
 version = "0.1.0"
 dependencies = [
  "protobuf",
- "protoc-rust",
+ "protobuf-codegen",
 ]
 
 [[package]]
@@ -862,12 +920,6 @@
 checksum = "e5464a87b239f13a63a501f2701565754bae92d243d4bb7eb12f6d57d2269bf4"
 
 [[package]]
-name = "unicode-xid"
-version = "0.2.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c"
-
-[[package]]
 name = "universal-hash"
 version = "0.5.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -1005,13 +1057,12 @@
 
 [[package]]
 name = "x25519-dalek"
-version = "2.0.0-pre.1"
+version = "2.0.0-rc.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e5da623d8af10a62342bcbbb230e33e58a63255a58012f8653c578e54bab48df"
+checksum = "fabd6e16dd08033932fc3265ad4510cc2eab24656058a6dcb107ffe274abcc95"
 dependencies = [
  "curve25519-dalek",
- "rand_core 0.6.4",
- "zeroize",
+ "rand_core",
 ]
 
 [[package]]
@@ -1019,18 +1070,3 @@
 version = "1.5.7"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "c394b5bd0c6f669e7275d9c20aa90ae064cb22e75a1cad54e1b34088034b149f"
-dependencies = [
- "zeroize_derive",
-]
-
-[[package]]
-name = "zeroize_derive"
-version = "1.3.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "44bf07cb3e50ea2003396695d58bf46bc9887a1f362260446fad6bc4e79bd36c"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn",
- "synstructure",
-]
diff --git a/nearby/connections/ukey2/ukey2_connections/fuzz/fuzz_targets/fuzz_connection.rs b/nearby/connections/ukey2/ukey2_connections/fuzz/fuzz_targets/fuzz_connection.rs
index a301c47..1db7e63 100644
--- a/nearby/connections/ukey2/ukey2_connections/fuzz/fuzz_targets/fuzz_connection.rs
+++ b/nearby/connections/ukey2/ukey2_connections/fuzz/fuzz_targets/fuzz_connection.rs
@@ -13,7 +13,6 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-
 use arbitrary::Arbitrary;
 use crypto_provider_rustcrypto::RustCrypto;
 use libfuzzer_sys::fuzz_target;
@@ -27,6 +26,8 @@
 enum Type {
     SentByInitiator,
     SentByServer,
+    ReceivedByInitiator,
+    ReceivedByServer,
 }
 
 #[derive(Debug, Arbitrary)]
@@ -103,6 +104,16 @@
                     .unwrap();
                 assert_eq!(decoded, payload);
             }
+            Type::ReceivedByInitiator => {
+                // Both Ok and Err results are possible here since the input is Arbitrary payload
+                let _unused_result = initiator_connection
+                    .decode_message_from_peer::<RustCrypto, _>(&payload, associated_data);
+            }
+            Type::ReceivedByServer => {
+                // Both Ok and Err results are possible here since the input is Arbitrary payload
+                let _unused_result = server_connection
+                    .decode_message_from_peer::<RustCrypto, _>(&payload, associated_data);
+            }
         }
     }
 });
diff --git a/nearby/connections/ukey2/ukey2_connections/fuzz/fuzz_targets/fuzz_from_saved_session.rs b/nearby/connections/ukey2/ukey2_connections/fuzz/fuzz_targets/fuzz_from_saved_session.rs
index a8e1d4e..c2cd385 100644
--- a/nearby/connections/ukey2/ukey2_connections/fuzz/fuzz_targets/fuzz_from_saved_session.rs
+++ b/nearby/connections/ukey2/ukey2_connections/fuzz/fuzz_targets/fuzz_from_saved_session.rs
@@ -13,21 +13,16 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-
 use libfuzzer_sys::fuzz_target;
-use ukey2_connections::{
-    DeserializeError, D2DConnectionContextV1
-};
+use ukey2_connections::{D2DConnectionContextV1, DeserializeError};
+use crypto_provider_rustcrypto::RustCrypto;
 
 const PROTOCOL_VERSION: u8 = 1;
 
 fuzz_target!(|input: [u8; 73]| {
-    let result = D2DConnectionContextV1::from_saved_session(&input);
+    let result = D2DConnectionContextV1::from_saved_session::<RustCrypto>(&input);
     if input[0] != PROTOCOL_VERSION {
-        assert_eq!(
-            result.unwrap_err(),
-            DeserializeError::BadProtocolVersion
-        );
+        assert_eq!(result.unwrap_err(), DeserializeError::BadProtocolVersion);
     } else {
         assert!(result.is_ok());
     }
diff --git a/nearby/connections/ukey2/ukey2_connections/fuzz/fuzz_targets/fuzz_handshake.rs b/nearby/connections/ukey2/ukey2_connections/fuzz/fuzz_targets/fuzz_handshake.rs
index 97012ba..3007c9a 100644
--- a/nearby/connections/ukey2/ukey2_connections/fuzz/fuzz_targets/fuzz_handshake.rs
+++ b/nearby/connections/ukey2/ukey2_connections/fuzz/fuzz_targets/fuzz_handshake.rs
@@ -13,7 +13,6 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-
 use arbitrary::Arbitrary;
 use crypto_provider_rustcrypto::RustCrypto;
 use libfuzzer_sys::fuzz_target;
diff --git a/nearby/connections/ukey2/ukey2_connections/src/d2d_connection_context_v1.rs b/nearby/connections/ukey2/ukey2_connections/src/d2d_connection_context_v1.rs
index 97e950a..1f524c9 100644
--- a/nearby/connections/ukey2/ukey2_connections/src/d2d_connection_context_v1.rs
+++ b/nearby/connections/ukey2/ukey2_connections/src/d2d_connection_context_v1.rs
@@ -77,11 +77,10 @@
 
 // Static utility functions for dealing with DeviceToDeviceMessage.
 fn create_device_to_device_message(msg: RustDeviceToDeviceMessage) -> Vec<u8> {
-    let d2d_message = {
-        let mut proto_msg = DeviceToDeviceMessage::default();
-        proto_msg.set_message(msg.message);
-        proto_msg.set_sequence_number(msg.sequence_num);
-        proto_msg
+    let d2d_message = DeviceToDeviceMessage {
+        message: Some(msg.message),
+        sequence_number: Some(msg.sequence_num),
+        ..Default::default()
     };
     d2d_message.write_to_bytes().unwrap()
 }
@@ -91,8 +90,10 @@
 ) -> Result<RustDeviceToDeviceMessage, DecodeError> {
     let result =
         DeviceToDeviceMessage::parse_from_bytes(message).map_err(|_| DecodeError::BadData)?;
-    let msg = result.get_message().to_vec();
-    let seq_num = result.get_sequence_number();
+    let (msg, seq_num) = result
+        .message
+        .zip(result.sequence_number)
+        .ok_or(DecodeError::BadData)?;
     Ok(RustDeviceToDeviceMessage {
         sequence_num: seq_num,
         message: msg,
@@ -118,6 +119,10 @@
     encode_sequence_num: i32,
     encode_key: Aes256Key,
     decode_key: Aes256Key,
+    encryption_key: Aes256Key,
+    decryption_key: Aes256Key,
+    signing_key: Aes256Key,
+    verify_key: Aes256Key,
     rng: R,
 }
 
@@ -152,8 +157,8 @@
 }
 
 impl D2DConnectionContextV1<rand::rngs::StdRng> {
-    pub fn from_saved_session(session: &[u8]) -> Result<Self, DeserializeError> {
-        Self::from_saved_session_with_rng(session, rand::rngs::StdRng::from_entropy())
+    pub fn from_saved_session<C: CryptoProvider>(session: &[u8]) -> Result<Self, DeserializeError> {
+        Self::from_saved_session_with_rng::<C>(session, rand::rngs::StdRng::from_entropy())
     }
 }
 
@@ -163,18 +168,26 @@
 {
     pub(crate) const NEXT_PROTOCOL_IDENTIFIER: &'static str = "AES_256_CBC-HMAC_SHA256";
 
-    pub fn new(
+    pub fn new<C: CryptoProvider>(
         decode_sequence_num: i32,
         encode_sequence_num: i32,
         encode_key: Aes256Key,
         decode_key: Aes256Key,
         rng: R,
     ) -> Self {
+        let encryption_key = derive_aes256_key::<C>(&encode_key, b"ENC:2");
+        let decryption_key = derive_aes256_key::<C>(&decode_key, b"ENC:2");
+        let signing_key = derive_aes256_key::<C>(&encode_key, b"SIG:1");
+        let verify_key = derive_aes256_key::<C>(&decode_key, b"SIG:1");
         D2DConnectionContextV1 {
             decode_sequence_num,
             encode_sequence_num,
             encode_key,
             decode_key,
+            encryption_key,
+            decryption_key,
+            signing_key,
+            verify_key,
             rng,
         }
     }
@@ -187,7 +200,7 @@
             .next_protocol_secret::<C>()
             .derive_array::<AES_256_KEY_SIZE>()
             .unwrap();
-        D2DConnectionContextV1::new(
+        D2DConnectionContextV1::new::<C>(
             0,
             0,
             encryption_key::<32, C>(&next_protocol_secret, HKDF_INFO_KEY_INITIATOR).unwrap(),
@@ -204,7 +217,7 @@
             .next_protocol_secret::<C>()
             .derive_array::<AES_256_KEY_SIZE>()
             .unwrap();
-        D2DConnectionContextV1::new(
+        D2DConnectionContextV1::new::<C>(
             0,
             0,
             encryption_key::<32, C>(&next_protocol_secret, HKDF_INFO_KEY_RESPONDER).unwrap(),
@@ -240,7 +253,7 @@
         ret
     }
 
-    pub(crate) fn from_saved_session_with_rng(
+    pub(crate) fn from_saved_session_with_rng<C: CryptoProvider>(
         session: &[u8],
         rng: R,
     ) -> Result<Self, DeserializeError> {
@@ -268,13 +281,13 @@
             // This should always succeed since all of the parsers above are valid over the entire
             // [u8] space, and we already checked the length at the start.
             .expect("Saved session parsing should succeed");
-        Ok(Self {
+        Ok(Self::new::<C>(
             encode_sequence_num,
             decode_sequence_num,
             encode_key,
             decode_key,
             rng,
-        })
+        ))
     }
 
     /// Once initiator and responder have exchanged public keys, use this method to encrypt and
@@ -295,42 +308,46 @@
             message: payload.to_vec(),
             sequence_num: self.get_sequence_number_for_encoding(),
         });
-        let encrypt_key = derive_aes256_key::<C>(&self.encode_key, b"ENC:2");
         let (ciphertext, iv) = crypto_utils::encrypt::<_, C::AesCbcPkcs7Padded>(
-            &encrypt_key,
+            &self.encryption_key,
             message.as_slice(),
             &mut self.rng,
         );
-        let mut metadata: GcmMetadata = GcmMetadata::default();
-        metadata.set_field_type(Type::DEVICE_TO_DEVICE_MESSAGE);
-        // As specified in
-        // google3/third_party/ukey2/src/main/java/com/google/security/cryptauth/lib/securegcm/SecureGcmConstants.java
-        metadata.set_version(1);
-        let mut header: Header = Header::default();
-        header.set_signature_scheme(SigScheme::HMAC_SHA256);
-        header.set_encryption_scheme(EncScheme::AES_256_CBC);
-        header.set_iv(iv.to_vec());
-        header.set_public_metadata(metadata.write_to_bytes().unwrap());
-        if let Some(assoc_data) = associated_data.as_ref() {
-            header.set_associated_data_length(assoc_data.as_ref().len() as u32)
-        }
-        let mut header_and_body = HeaderAndBody::default();
-        header_and_body.set_header(header);
-        header_and_body.set_body(ciphertext);
+        let metadata = GcmMetadata {
+            type_: Some(Type::DEVICE_TO_DEVICE_MESSAGE.into()),
+            // As specified in
+            // google3/third_party/ukey2/src/main/java/com/google/security/cryptauth/lib/securegcm/SecureGcmConstants.java
+            version: Some(1),
+            ..Default::default()
+        };
+        let header = Header {
+            signature_scheme: Some(SigScheme::HMAC_SHA256.into()),
+            encryption_scheme: Some(EncScheme::AES_256_CBC.into()),
+            iv: Some(iv.to_vec()),
+            public_metadata: Some(metadata.write_to_bytes().unwrap()),
+            associated_data_length: associated_data.as_ref().map(|d| d.as_ref().len() as u32),
+            ..Default::default()
+        };
+        let header_and_body = HeaderAndBody {
+            header: Some(header).into(),
+            body: Some(ciphertext),
+            ..Default::default()
+        };
         let header_and_body_bytes = header_and_body.write_to_bytes().unwrap();
 
         // add sha256 MAC
-        let sign_key = derive_aes256_key::<C>(&self.encode_key, b"SIG:1");
-        let mut hmac = C::HmacSha256::new_from_slice(&sign_key).unwrap();
+        let mut hmac = C::HmacSha256::new_from_slice(&self.signing_key).unwrap();
         hmac.update(header_and_body_bytes.as_slice());
         if let Some(associated_data_vec) = associated_data.as_ref() {
             hmac.update(associated_data_vec.as_ref())
         }
         let result_mac = hmac.finalize().to_vec();
 
-        let mut secure_message = SecureMessage::default();
-        secure_message.set_header_and_body(header_and_body_bytes);
-        secure_message.set_signature(result_mac);
+        let secure_message = SecureMessage {
+            header_and_body: Some(header_and_body_bytes),
+            signature: Some(result_mac),
+            ..Default::default()
+        };
         secure_message.write_to_bytes().unwrap()
     }
 
@@ -349,37 +366,36 @@
         // first confirm that the payload MAC matches the header_and_body
         let message = SecureMessage::parse_from_bytes(payload).map_err(|_| DecodeError::BadData)?;
         let payload_mac: [u8; 32] = message
-            .get_signature()
-            .try_into()
-            .map_err(|_| DecodeError::BadData)?;
-        let payload = message.get_header_and_body();
-        let verify_key = derive_aes256_key::<C>(&self.decode_key, b"SIG:1");
-        let mut hmac = C::HmacSha256::new_from_slice(&verify_key).unwrap();
-        hmac.update(payload);
+            .signature
+            .and_then(|signature| signature.try_into().ok())
+            .ok_or(DecodeError::BadData)?;
+        let payload = message.header_and_body.ok_or(DecodeError::BadData)?;
+        let mut hmac = C::HmacSha256::new_from_slice(&self.verify_key).unwrap();
+        hmac.update(&payload);
         if let Some(associated_data) = associated_data.as_ref() {
             hmac.update(associated_data.as_ref())
         }
         hmac.verify(payload_mac).map_err(|_| DecodeError::BadData)?;
-        let payload = HeaderAndBody::parse_from_bytes(payload).map_err(|_| DecodeError::BadData)?;
-        let associated_data_len = payload.header.as_ref().and_then(|header| {
-            if header.has_associated_data_length() {
-                Some(header.get_associated_data_length())
-            } else {
-                None
-            }
-        });
+        let payload =
+            HeaderAndBody::parse_from_bytes(&payload).map_err(|_| DecodeError::BadData)?;
+        let associated_data_len = payload
+            .header
+            .as_ref()
+            .and_then(|header| header.associated_data_length);
         if associated_data_len != associated_data.map(|ad| ad.as_ref().len() as u32) {
             return Err(DecodeError::BadData);
         }
         let iv: AesCbcIv = payload
-            .get_header()
-            .get_iv()
-            .try_into()
-            .map_err(|_| DecodeError::BadData)?;
-        let decode_key = derive_aes256_key::<C>(&self.decode_key, b"ENC:2");
-        let decrypted =
-            crypto_utils::decrypt::<C::AesCbcPkcs7Padded>(&decode_key, payload.get_body(), &iv)
-                .map_err(|_| DecodeError::BadData)?;
+            .header
+            .as_ref()
+            .and_then(|header| header.iv().try_into().ok())
+            .ok_or(DecodeError::BadData)?;
+        let decrypted = crypto_utils::decrypt::<C::AesCbcPkcs7Padded>(
+            &self.decryption_key,
+            &payload.body.unwrap_or_default(),
+            &iv,
+        )
+        .map_err(|_| DecodeError::BadData)?;
         let d2d_message = unwrap_device_to_device_message(decrypted.as_slice())?;
         if d2d_message.sequence_num != self.get_sequence_number_for_decoding() + 1 {
             return Err(DecodeError::BadSequenceNumber);
diff --git a/nearby/connections/ukey2/ukey2_connections/src/tests.rs b/nearby/connections/ukey2/ukey2_connections/src/tests.rs
index db76b62..9b5403f 100644
--- a/nearby/connections/ukey2/ukey2_connections/src/tests.rs
+++ b/nearby/connections/ukey2/ukey2_connections/src/tests.rs
@@ -37,8 +37,7 @@
     let (ciphertext, iv) =
         encrypt::<_, C::AesCbcPkcs7Padded>(key, message, &mut rand::rngs::StdRng::from_entropy());
     let decrypt_result = decrypt::<C::AesCbcPkcs7Padded>(key, ciphertext.as_slice(), &iv);
-    assert!(decrypt_result.is_ok());
-    let ptext = decrypt_result.unwrap();
+    let ptext = decrypt_result.expect("Decrypt should be successful");
     assert_eq!(ptext, message.to_vec());
 }
 
@@ -146,7 +145,7 @@
 #[rstest]
 fn send_receive_message_seeded<C: CryptoProvider>(
     // TODO: Find a way to inject RNG / generated ephemeral secrets in openSSL and test them here
-    #[values(RustCryptoImpl::<MockRng>::new())] _crypto_provider: C,
+    #[values(RustCryptoImpl::< MockRng >::new())] _crypto_provider: C,
 ) {
     let rng = MockRng;
     let message = b"Hello World!";
@@ -179,8 +178,10 @@
     let (mut init_conn_ctx, mut server_conn_ctx) = run_handshake::<C>();
     let encoded = init_conn_ctx.encode_message_to_peer::<C, &[u8]>(message, None);
     let decoded = server_conn_ctx.decode_message_from_peer::<C, &[u8]>(encoded.as_slice(), None);
-    assert!(decoded.is_ok());
-    assert_eq!(message.to_vec(), decoded.unwrap());
+    assert_eq!(
+        message.to_vec(),
+        decoded.expect("Decode should be successful")
+    );
 }
 
 #[rstest]
@@ -192,8 +193,10 @@
     let encoded = init_conn_ctx.encode_message_to_peer::<C, _>(message, Some(b"associated data"));
     let decoded = server_conn_ctx
         .decode_message_from_peer::<C, _>(encoded.as_slice(), Some(b"associated data"));
-    assert!(decoded.is_ok());
-    assert_eq!(message.to_vec(), decoded.unwrap());
+    assert_eq!(
+        message.to_vec(),
+        decoded.expect("Decode should be successful")
+    );
     // Make sure decode fails with missing associated data.
     let decoded = server_conn_ctx.decode_message_from_peer::<C, &[u8]>(encoded.as_slice(), None);
     assert!(decoded.is_err());
@@ -210,17 +213,20 @@
     let (init_conn_ctx, server_conn_ctx) = run_handshake::<C>();
     let init_session = init_conn_ctx.save_session();
     let server_session = server_conn_ctx.save_session();
-    let mut init_restored_ctx = D2DConnectionContextV1::from_saved_session(init_session.as_slice())
-        .expect("failed to restore client session");
+    let mut init_restored_ctx =
+        D2DConnectionContextV1::from_saved_session::<C>(init_session.as_slice())
+            .expect("failed to restore client session");
     let mut server_restored_ctx =
-        D2DConnectionContextV1::from_saved_session(server_session.as_slice())
+        D2DConnectionContextV1::from_saved_session::<C>(server_session.as_slice())
             .expect("failed to restore server session");
     let message = b"Hello World!";
     let encoded = init_restored_ctx.encode_message_to_peer::<C, &[u8]>(message, None);
     let decoded =
         server_restored_ctx.decode_message_from_peer::<C, &[u8]>(encoded.as_slice(), None);
-    assert!(decoded.is_ok());
-    assert_eq!(message.to_vec(), decoded.unwrap());
+    assert_eq!(
+        message.to_vec(),
+        decoded.expect("Decode should be successful")
+    );
 }
 
 #[rstest]
@@ -230,9 +236,10 @@
     let (init_conn_ctx, server_conn_ctx) = run_handshake::<C>();
     let init_session = init_conn_ctx.save_session();
     let server_session = server_conn_ctx.save_session();
-    let _ = D2DConnectionContextV1::from_saved_session(init_session.as_slice())
+    let _ = D2DConnectionContextV1::from_saved_session::<C>(init_session.as_slice())
         .expect("failed to restore client session");
-    let server_restored_ctx = D2DConnectionContextV1::from_saved_session(&server_session[0..60]);
+    let server_restored_ctx =
+        D2DConnectionContextV1::from_saved_session::<C>(&server_session[0..60]);
     assert_eq!(
         server_restored_ctx.unwrap_err(),
         DeserializeError::BadDataLength
@@ -246,10 +253,10 @@
     let (init_conn_ctx, server_conn_ctx) = run_handshake::<C>();
     let init_session = init_conn_ctx.save_session();
     let mut server_session = server_conn_ctx.save_session();
-    let _ = D2DConnectionContextV1::from_saved_session(init_session.as_slice())
+    let _ = D2DConnectionContextV1::from_saved_session::<C>(init_session.as_slice())
         .expect("failed to restore client session");
     server_session[0] = 0; // Change the protocol version to an invalid one (0)
-    let server_restored_ctx = D2DConnectionContextV1::from_saved_session(&server_session);
+    let server_restored_ctx = D2DConnectionContextV1::from_saved_session::<C>(&server_session);
     assert_eq!(
         server_restored_ctx.unwrap_err(),
         DeserializeError::BadProtocolVersion
@@ -266,11 +273,13 @@
     let message = b"Hello World!";
     let encoded = init_conn_ctx.encode_message_to_peer::<C, &[u8]>(message, None);
     let decoded = server_conn_ctx.decode_message_from_peer::<C, &[u8]>(encoded.as_slice(), None);
-    assert!(decoded.is_ok());
-    assert_eq!(message.to_vec(), decoded.unwrap());
+    assert_eq!(
+        message.to_vec(),
+        decoded.expect("Decode should be successful")
+    );
     let init_session_after = init_conn_ctx.get_session_unique::<C>();
     let server_session_after = server_conn_ctx.get_session_unique::<C>();
-    let bad_server_ctx = D2DConnectionContextV1::new(
+    let bad_server_ctx = D2DConnectionContextV1::new::<C>(
         server_conn_ctx.get_sequence_number_for_decoding(),
         server_conn_ctx.get_sequence_number_for_encoding(),
         Aes256Key::default(),
diff --git a/nearby/connections/ukey2/ukey2_jni/src/lib.rs b/nearby/connections/ukey2/ukey2_jni/src/lib.rs
index 03cd24c..e5106d7 100644
--- a/nearby/connections/ukey2/ukey2_jni/src/lib.rs
+++ b/nearby/connections/ukey2/ukey2_jni/src/lib.rs
@@ -431,7 +431,8 @@
     let session_info_rust = env
         .convert_byte_array(unsafe { JByteArray::from_raw(session_info) })
         .expect("bad session_info data");
-    let ctx = D2DConnectionContextV1::from_saved_session(session_info_rust.as_slice());
+    let ctx =
+        D2DConnectionContextV1::from_saved_session::<CryptoProvider>(session_info_rust.as_slice());
     if ctx.is_err() {
         env.throw_new(
             "com/google/security/cryptauth/lib/securegcm/SessionRestoreException",
diff --git a/nearby/connections/ukey2/ukey2_proto/Cargo.toml b/nearby/connections/ukey2/ukey2_proto/Cargo.toml
index 6ac2f52..c94d5b8 100644
--- a/nearby/connections/ukey2/ukey2_proto/Cargo.toml
+++ b/nearby/connections/ukey2/ukey2_proto/Cargo.toml
@@ -16,5 +16,5 @@
 diff = "0.1.13"
 
 [build-dependencies]
-protoc-rust.workspace = true
+protobuf-codegen.workspace = true
 
diff --git a/nearby/connections/ukey2/ukey2_proto/build.rs b/nearby/connections/ukey2/ukey2_proto/build.rs
index 158b0b8..8d9aaa0 100644
--- a/nearby/connections/ukey2/ukey2_proto/build.rs
+++ b/nearby/connections/ukey2/ukey2_proto/build.rs
@@ -12,12 +12,11 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-use protoc_rust::Customize;
+use protobuf_codegen::Customize;
 
 fn main() {
-    let out_dir = std::env::var("OUT_DIR").unwrap() + "/proto";
-    std::fs::create_dir_all(&out_dir).unwrap();
-    protoc_rust::Codegen::new()
+    protobuf_codegen::Codegen::new()
+        .protoc()
         // All inputs and imports from the inputs must reside in `includes` directories.
         .includes(["proto"])
         // Inputs must reside in some of include paths.
@@ -25,11 +24,7 @@
         .input("proto/securemessage.proto")
         .input("proto/securegcm.proto")
         .input("proto/device_to_device_messages.proto")
-        .customize(Customize {
-            gen_mod_rs: Some(true),
-            ..Default::default()
-        })
-        .out_dir(out_dir)
-        .run()
-        .unwrap();
+        .customize(Customize::default().gen_mod_rs(true))
+        .cargo_out_dir("proto")
+        .run_from_script()
 }
diff --git a/nearby/connections/ukey2/ukey2_proto/proto/securemessage.proto b/nearby/connections/ukey2/ukey2_proto/proto/securemessage.proto
index aef2765..7a19739 100644
--- a/nearby/connections/ukey2/ukey2_proto/proto/securemessage.proto
+++ b/nearby/connections/ukey2/ukey2_proto/proto/securemessage.proto
@@ -36,6 +36,7 @@
   ECDSA_P256_SHA256 = 2;
   // Not recommended -- use ECDSA_P256_SHA256 instead
   RSA2048_SHA256 = 3;
+  AEAD = 4;
 }
 
 // Supported encryption schemes
@@ -43,6 +44,7 @@
   // No encryption
   NONE = 1;
   AES_256_CBC = 2;
+  AES_256_GCM_SIV = 3;
 }
 
 message Header {
@@ -59,6 +61,8 @@
   // The length of some associated data this is not sent in this SecureMessage,
   // but which will be bound to the signature.
   optional uint32 associated_data_length = 7 [default = 0];
+  // Encryption may use a nonce. Required for AES-256-GCM-SIV.
+  optional bytes nonce = 8;
 }
 
 message HeaderAndBody {
diff --git a/nearby/connections/ukey2/ukey2_proto/proto/ukey.proto b/nearby/connections/ukey2/ukey2_proto/proto/ukey.proto
index 2b4dcd5..1edec1f 100644
--- a/nearby/connections/ukey2/ukey2_proto/proto/ukey.proto
+++ b/nearby/connections/ukey2/ukey2_proto/proto/ukey.proto
@@ -87,6 +87,8 @@
 
   // Next protocol that the client wants to speak.
   optional string next_protocol = 4;
+  // Other next protocols the client can speak.
+  repeated string other_next_protocols = 5;
 }
 
 message Ukey2ServerInit {
@@ -97,6 +99,9 @@
   // Selected Cipher and corresponding public key
   optional Ukey2HandshakeCipher handshake_cipher = 3;
   optional bytes public_key = 4;
+  // The server-selected next_protocol string based on the Ukey2ClientInit's
+  // next_protocol string and other_next_protocols array.
+  optional string selected_next_protocol = 5;
 }
 
 message Ukey2ClientFinished {
diff --git a/nearby/connections/ukey2/ukey2_proto/src/ukey2_all_proto/device_to_device_messages.rs b/nearby/connections/ukey2/ukey2_proto/src/ukey2_all_proto/device_to_device_messages.rs
index e4d2a99..3c2da35 100644
--- a/nearby/connections/ukey2/ukey2_proto/src/ukey2_all_proto/device_to_device_messages.rs
+++ b/nearby/connections/ukey2/ukey2_proto/src/ukey2_all_proto/device_to_device_messages.rs
@@ -12,7 +12,8 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-// This file is generated by rust-protobuf 2.28.0. Do not edit
+// This file is generated by rust-protobuf 3.2.0. Do not edit
+// .proto file is parsed by protoc 3.19.1
 // @generated
 
 // https://github.com/rust-lang/rust-clippy/issues/702
@@ -29,22 +30,27 @@
 #![allow(non_snake_case)]
 #![allow(non_upper_case_globals)]
 #![allow(trivial_casts)]
-#![allow(unused_imports)]
 #![allow(unused_results)]
+#![allow(unused_mut)]
+
 //! Generated file from `device_to_device_messages.proto`
+// Generated for lite runtime
 
 /// Generated files are compatible only with the same version
 /// of protobuf runtime.
-// const _PROTOBUF_VERSION_CHECK: () = ::protobuf::VERSION_2_28_0;
+const _PROTOBUF_VERSION_CHECK: () = ::protobuf::VERSION_3_2_0;
 
 #[derive(PartialEq,Clone,Default,Debug)]
+// @@protoc_insertion_point(message:securegcm.DeviceToDeviceMessage)
 pub struct DeviceToDeviceMessage {
     // message fields
-    message: ::protobuf::SingularField<::std::vec::Vec<u8>>,
-    sequence_number: ::std::option::Option<i32>,
+    // @@protoc_insertion_point(field:securegcm.DeviceToDeviceMessage.message)
+    pub message: ::std::option::Option<::std::vec::Vec<u8>>,
+    // @@protoc_insertion_point(field:securegcm.DeviceToDeviceMessage.sequence_number)
+    pub sequence_number: ::std::option::Option<i32>,
     // special fields
-    pub unknown_fields: ::protobuf::UnknownFields,
-    pub cached_size: ::protobuf::CachedSize,
+    // @@protoc_insertion_point(special_field:securegcm.DeviceToDeviceMessage.special_fields)
+    pub special_fields: ::protobuf::SpecialFields,
 }
 
 impl<'a> ::std::default::Default for &'a DeviceToDeviceMessage {
@@ -60,15 +66,15 @@
 
     // optional bytes message = 1;
 
-
-    pub fn get_message(&self) -> &[u8] {
+    pub fn message(&self) -> &[u8] {
         match self.message.as_ref() {
-            Some(v) => &v,
+            Some(v) => v,
             None => &[],
         }
     }
+
     pub fn clear_message(&mut self) {
-        self.message.clear();
+        self.message = ::std::option::Option::None;
     }
 
     pub fn has_message(&self) -> bool {
@@ -77,14 +83,14 @@
 
     // Param is passed by value, moved
     pub fn set_message(&mut self, v: ::std::vec::Vec<u8>) {
-        self.message = ::protobuf::SingularField::some(v);
+        self.message = ::std::option::Option::Some(v);
     }
 
     // Mutable pointer to the field.
     // If field is not initialized, it is initialized with default value first.
     pub fn mut_message(&mut self) -> &mut ::std::vec::Vec<u8> {
         if self.message.is_none() {
-            self.message.set_default();
+            self.message = ::std::option::Option::Some(::std::vec::Vec::new());
         }
         self.message.as_mut().unwrap()
     }
@@ -96,10 +102,10 @@
 
     // optional int32 sequence_number = 2;
 
-
-    pub fn get_sequence_number(&self) -> i32 {
+    pub fn sequence_number(&self) -> i32 {
         self.sequence_number.unwrap_or(0)
     }
+
     pub fn clear_sequence_number(&mut self) {
         self.sequence_number = ::std::option::Option::None;
     }
@@ -115,26 +121,23 @@
 }
 
 impl ::protobuf::Message for DeviceToDeviceMessage {
+    const NAME: &'static str = "DeviceToDeviceMessage";
+
     fn is_initialized(&self) -> bool {
         true
     }
 
-    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::ProtobufResult<()> {
-        while !is.eof()? {
-            let (field_number, wire_type) = is.read_tag_unpack()?;
-            match field_number {
-                1 => {
-                    ::protobuf::rt::read_singular_bytes_into(wire_type, is, &mut self.message)?;
+    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {
+        while let Some(tag) = is.read_raw_tag_or_eof()? {
+            match tag {
+                10 => {
+                    self.message = ::std::option::Option::Some(is.read_bytes()?);
                 },
-                2 => {
-                    if wire_type != ::protobuf::wire_format::WireTypeVarint {
-                        return ::std::result::Result::Err(::protobuf::rt::unexpected_wire_type(wire_type));
-                    }
-                    let tmp = is.read_int32()?;
-                    self.sequence_number = ::std::option::Option::Some(tmp);
+                16 => {
+                    self.sequence_number = ::std::option::Option::Some(is.read_int32()?);
                 },
-                _ => {
-                    ::protobuf::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?;
+                tag => {
+                    ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;
                 },
             };
         }
@@ -143,88 +146,69 @@
 
     // Compute sizes of nested messages
     #[allow(unused_variables)]
-    fn compute_size(&self) -> u32 {
+    fn compute_size(&self) -> u64 {
         let mut my_size = 0;
-        if let Some(ref v) = self.message.as_ref() {
+        if let Some(v) = self.message.as_ref() {
             my_size += ::protobuf::rt::bytes_size(1, &v);
         }
         if let Some(v) = self.sequence_number {
-            my_size += ::protobuf::rt::value_size(2, v, ::protobuf::wire_format::WireTypeVarint);
+            my_size += ::protobuf::rt::int32_size(2, v);
         }
-        my_size += ::protobuf::rt::unknown_fields_size(self.get_unknown_fields());
-        self.cached_size.set(my_size);
+        my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());
+        self.special_fields.cached_size().set(my_size as u32);
         my_size
     }
 
-    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::ProtobufResult<()> {
-        if let Some(ref v) = self.message.as_ref() {
-            os.write_bytes(1, &v)?;
+    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {
+        if let Some(v) = self.message.as_ref() {
+            os.write_bytes(1, v)?;
         }
         if let Some(v) = self.sequence_number {
             os.write_int32(2, v)?;
         }
-        os.write_unknown_fields(self.get_unknown_fields())?;
+        os.write_unknown_fields(self.special_fields.unknown_fields())?;
         ::std::result::Result::Ok(())
     }
 
-    fn get_cached_size(&self) -> u32 {
-        self.cached_size.get()
+    fn special_fields(&self) -> &::protobuf::SpecialFields {
+        &self.special_fields
     }
 
-    fn get_unknown_fields(&self) -> &::protobuf::UnknownFields {
-        &self.unknown_fields
-    }
-
-    fn mut_unknown_fields(&mut self) -> &mut ::protobuf::UnknownFields {
-        &mut self.unknown_fields
-    }
-
-    fn as_any(&self) -> &dyn (::std::any::Any) {
-        self as &dyn (::std::any::Any)
-    }
-    fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) {
-        self as &mut dyn (::std::any::Any)
-    }
-    fn into_any(self: ::std::boxed::Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
-        self
-    }
-
-    fn descriptor(&self) -> &'static ::protobuf::reflect::MessageDescriptor {
-        Self::descriptor_static()
+    fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {
+        &mut self.special_fields
     }
 
     fn new() -> DeviceToDeviceMessage {
         DeviceToDeviceMessage::new()
     }
 
-    fn default_instance() -> &'static DeviceToDeviceMessage {
-        static instance: ::protobuf::rt::LazyV2<DeviceToDeviceMessage> = ::protobuf::rt::LazyV2::INIT;
-        instance.get(DeviceToDeviceMessage::new)
-    }
-}
-
-impl ::protobuf::Clear for DeviceToDeviceMessage {
     fn clear(&mut self) {
-        self.message.clear();
+        self.message = ::std::option::Option::None;
         self.sequence_number = ::std::option::Option::None;
-        self.unknown_fields.clear();
+        self.special_fields.clear();
     }
-}
 
-impl ::protobuf::reflect::ProtobufValue for DeviceToDeviceMessage {
-    fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef {
-        ::protobuf::reflect::ReflectValueRef::Message(self)
+    fn default_instance() -> &'static DeviceToDeviceMessage {
+        static instance: DeviceToDeviceMessage = DeviceToDeviceMessage {
+            message: ::std::option::Option::None,
+            sequence_number: ::std::option::Option::None,
+            special_fields: ::protobuf::SpecialFields::new(),
+        };
+        &instance
     }
 }
 
 #[derive(PartialEq,Clone,Default,Debug)]
+// @@protoc_insertion_point(message:securegcm.InitiatorHello)
 pub struct InitiatorHello {
     // message fields
-    pub public_dh_key: ::protobuf::SingularPtrField<super::securemessage::GenericPublicKey>,
-    protocol_version: ::std::option::Option<i32>,
+    // @@protoc_insertion_point(field:securegcm.InitiatorHello.public_dh_key)
+    pub public_dh_key: ::protobuf::MessageField<super::securemessage::GenericPublicKey>,
+    // @@protoc_insertion_point(field:securegcm.InitiatorHello.protocol_version)
+    pub protocol_version: ::std::option::Option<i32>,
     // special fields
-    pub unknown_fields: ::protobuf::UnknownFields,
-    pub cached_size: ::protobuf::CachedSize,
+    // @@protoc_insertion_point(special_field:securegcm.InitiatorHello.special_fields)
+    pub special_fields: ::protobuf::SpecialFields,
 }
 
 impl<'a> ::std::default::Default for &'a InitiatorHello {
@@ -238,45 +222,12 @@
         ::std::default::Default::default()
     }
 
-    // optional .securemessage.GenericPublicKey public_dh_key = 1;
-
-
-    pub fn get_public_dh_key(&self) -> &super::securemessage::GenericPublicKey {
-        self.public_dh_key.as_ref().unwrap_or_else(|| <super::securemessage::GenericPublicKey as ::protobuf::Message>::default_instance())
-    }
-    pub fn clear_public_dh_key(&mut self) {
-        self.public_dh_key.clear();
-    }
-
-    pub fn has_public_dh_key(&self) -> bool {
-        self.public_dh_key.is_some()
-    }
-
-    // Param is passed by value, moved
-    pub fn set_public_dh_key(&mut self, v: super::securemessage::GenericPublicKey) {
-        self.public_dh_key = ::protobuf::SingularPtrField::some(v);
-    }
-
-    // Mutable pointer to the field.
-    // If field is not initialized, it is initialized with default value first.
-    pub fn mut_public_dh_key(&mut self) -> &mut super::securemessage::GenericPublicKey {
-        if self.public_dh_key.is_none() {
-            self.public_dh_key.set_default();
-        }
-        self.public_dh_key.as_mut().unwrap()
-    }
-
-    // Take field
-    pub fn take_public_dh_key(&mut self) -> super::securemessage::GenericPublicKey {
-        self.public_dh_key.take().unwrap_or_else(|| super::securemessage::GenericPublicKey::new())
-    }
-
     // optional int32 protocol_version = 2;
 
-
-    pub fn get_protocol_version(&self) -> i32 {
+    pub fn protocol_version(&self) -> i32 {
         self.protocol_version.unwrap_or(0i32)
     }
+
     pub fn clear_protocol_version(&mut self) {
         self.protocol_version = ::std::option::Option::None;
     }
@@ -292,6 +243,8 @@
 }
 
 impl ::protobuf::Message for InitiatorHello {
+    const NAME: &'static str = "InitiatorHello";
+
     fn is_initialized(&self) -> bool {
         for v in &self.public_dh_key {
             if !v.is_initialized() {
@@ -301,22 +254,17 @@
         true
     }
 
-    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::ProtobufResult<()> {
-        while !is.eof()? {
-            let (field_number, wire_type) = is.read_tag_unpack()?;
-            match field_number {
-                1 => {
-                    ::protobuf::rt::read_singular_message_into(wire_type, is, &mut self.public_dh_key)?;
+    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {
+        while let Some(tag) = is.read_raw_tag_or_eof()? {
+            match tag {
+                10 => {
+                    ::protobuf::rt::read_singular_message_into_field(is, &mut self.public_dh_key)?;
                 },
-                2 => {
-                    if wire_type != ::protobuf::wire_format::WireTypeVarint {
-                        return ::std::result::Result::Err(::protobuf::rt::unexpected_wire_type(wire_type));
-                    }
-                    let tmp = is.read_int32()?;
-                    self.protocol_version = ::std::option::Option::Some(tmp);
+                16 => {
+                    self.protocol_version = ::std::option::Option::Some(is.read_int32()?);
                 },
-                _ => {
-                    ::protobuf::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?;
+                tag => {
+                    ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;
                 },
             };
         }
@@ -325,91 +273,70 @@
 
     // Compute sizes of nested messages
     #[allow(unused_variables)]
-    fn compute_size(&self) -> u32 {
+    fn compute_size(&self) -> u64 {
         let mut my_size = 0;
-        if let Some(ref v) = self.public_dh_key.as_ref() {
+        if let Some(v) = self.public_dh_key.as_ref() {
             let len = v.compute_size();
-            my_size += 1 + ::protobuf::rt::compute_raw_varint32_size(len) + len;
+            my_size += 1 + ::protobuf::rt::compute_raw_varint64_size(len) + len;
         }
         if let Some(v) = self.protocol_version {
-            my_size += ::protobuf::rt::value_size(2, v, ::protobuf::wire_format::WireTypeVarint);
+            my_size += ::protobuf::rt::int32_size(2, v);
         }
-        my_size += ::protobuf::rt::unknown_fields_size(self.get_unknown_fields());
-        self.cached_size.set(my_size);
+        my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());
+        self.special_fields.cached_size().set(my_size as u32);
         my_size
     }
 
-    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::ProtobufResult<()> {
-        if let Some(ref v) = self.public_dh_key.as_ref() {
-            os.write_tag(1, ::protobuf::wire_format::WireTypeLengthDelimited)?;
-            os.write_raw_varint32(v.get_cached_size())?;
-            v.write_to_with_cached_sizes(os)?;
+    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {
+        if let Some(v) = self.public_dh_key.as_ref() {
+            ::protobuf::rt::write_message_field_with_cached_size(1, v, os)?;
         }
         if let Some(v) = self.protocol_version {
             os.write_int32(2, v)?;
         }
-        os.write_unknown_fields(self.get_unknown_fields())?;
+        os.write_unknown_fields(self.special_fields.unknown_fields())?;
         ::std::result::Result::Ok(())
     }
 
-    fn get_cached_size(&self) -> u32 {
-        self.cached_size.get()
+    fn special_fields(&self) -> &::protobuf::SpecialFields {
+        &self.special_fields
     }
 
-    fn get_unknown_fields(&self) -> &::protobuf::UnknownFields {
-        &self.unknown_fields
-    }
-
-    fn mut_unknown_fields(&mut self) -> &mut ::protobuf::UnknownFields {
-        &mut self.unknown_fields
-    }
-
-    fn as_any(&self) -> &dyn (::std::any::Any) {
-        self as &dyn (::std::any::Any)
-    }
-    fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) {
-        self as &mut dyn (::std::any::Any)
-    }
-    fn into_any(self: ::std::boxed::Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
-        self
-    }
-
-    fn descriptor(&self) -> &'static ::protobuf::reflect::MessageDescriptor {
-        Self::descriptor_static()
+    fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {
+        &mut self.special_fields
     }
 
     fn new() -> InitiatorHello {
         InitiatorHello::new()
     }
 
-    fn default_instance() -> &'static InitiatorHello {
-        static instance: ::protobuf::rt::LazyV2<InitiatorHello> = ::protobuf::rt::LazyV2::INIT;
-        instance.get(InitiatorHello::new)
-    }
-}
-
-impl ::protobuf::Clear for InitiatorHello {
     fn clear(&mut self) {
         self.public_dh_key.clear();
         self.protocol_version = ::std::option::Option::None;
-        self.unknown_fields.clear();
+        self.special_fields.clear();
     }
-}
 
-impl ::protobuf::reflect::ProtobufValue for InitiatorHello {
-    fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef {
-        ::protobuf::reflect::ReflectValueRef::Message(self)
+    fn default_instance() -> &'static InitiatorHello {
+        static instance: InitiatorHello = InitiatorHello {
+            public_dh_key: ::protobuf::MessageField::none(),
+            protocol_version: ::std::option::Option::None,
+            special_fields: ::protobuf::SpecialFields::new(),
+        };
+        &instance
     }
 }
 
 #[derive(PartialEq,Clone,Default,Debug)]
+// @@protoc_insertion_point(message:securegcm.ResponderHello)
 pub struct ResponderHello {
     // message fields
-    pub public_dh_key: ::protobuf::SingularPtrField<super::securemessage::GenericPublicKey>,
-    protocol_version: ::std::option::Option<i32>,
+    // @@protoc_insertion_point(field:securegcm.ResponderHello.public_dh_key)
+    pub public_dh_key: ::protobuf::MessageField<super::securemessage::GenericPublicKey>,
+    // @@protoc_insertion_point(field:securegcm.ResponderHello.protocol_version)
+    pub protocol_version: ::std::option::Option<i32>,
     // special fields
-    pub unknown_fields: ::protobuf::UnknownFields,
-    pub cached_size: ::protobuf::CachedSize,
+    // @@protoc_insertion_point(special_field:securegcm.ResponderHello.special_fields)
+    pub special_fields: ::protobuf::SpecialFields,
 }
 
 impl<'a> ::std::default::Default for &'a ResponderHello {
@@ -423,45 +350,12 @@
         ::std::default::Default::default()
     }
 
-    // optional .securemessage.GenericPublicKey public_dh_key = 1;
-
-
-    pub fn get_public_dh_key(&self) -> &super::securemessage::GenericPublicKey {
-        self.public_dh_key.as_ref().unwrap_or_else(|| <super::securemessage::GenericPublicKey as ::protobuf::Message>::default_instance())
-    }
-    pub fn clear_public_dh_key(&mut self) {
-        self.public_dh_key.clear();
-    }
-
-    pub fn has_public_dh_key(&self) -> bool {
-        self.public_dh_key.is_some()
-    }
-
-    // Param is passed by value, moved
-    pub fn set_public_dh_key(&mut self, v: super::securemessage::GenericPublicKey) {
-        self.public_dh_key = ::protobuf::SingularPtrField::some(v);
-    }
-
-    // Mutable pointer to the field.
-    // If field is not initialized, it is initialized with default value first.
-    pub fn mut_public_dh_key(&mut self) -> &mut super::securemessage::GenericPublicKey {
-        if self.public_dh_key.is_none() {
-            self.public_dh_key.set_default();
-        }
-        self.public_dh_key.as_mut().unwrap()
-    }
-
-    // Take field
-    pub fn take_public_dh_key(&mut self) -> super::securemessage::GenericPublicKey {
-        self.public_dh_key.take().unwrap_or_else(|| super::securemessage::GenericPublicKey::new())
-    }
-
     // optional int32 protocol_version = 2;
 
-
-    pub fn get_protocol_version(&self) -> i32 {
+    pub fn protocol_version(&self) -> i32 {
         self.protocol_version.unwrap_or(0i32)
     }
+
     pub fn clear_protocol_version(&mut self) {
         self.protocol_version = ::std::option::Option::None;
     }
@@ -477,6 +371,8 @@
 }
 
 impl ::protobuf::Message for ResponderHello {
+    const NAME: &'static str = "ResponderHello";
+
     fn is_initialized(&self) -> bool {
         for v in &self.public_dh_key {
             if !v.is_initialized() {
@@ -486,22 +382,17 @@
         true
     }
 
-    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::ProtobufResult<()> {
-        while !is.eof()? {
-            let (field_number, wire_type) = is.read_tag_unpack()?;
-            match field_number {
-                1 => {
-                    ::protobuf::rt::read_singular_message_into(wire_type, is, &mut self.public_dh_key)?;
+    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {
+        while let Some(tag) = is.read_raw_tag_or_eof()? {
+            match tag {
+                10 => {
+                    ::protobuf::rt::read_singular_message_into_field(is, &mut self.public_dh_key)?;
                 },
-                2 => {
-                    if wire_type != ::protobuf::wire_format::WireTypeVarint {
-                        return ::std::result::Result::Err(::protobuf::rt::unexpected_wire_type(wire_type));
-                    }
-                    let tmp = is.read_int32()?;
-                    self.protocol_version = ::std::option::Option::Some(tmp);
+                16 => {
+                    self.protocol_version = ::std::option::Option::Some(is.read_int32()?);
                 },
-                _ => {
-                    ::protobuf::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?;
+                tag => {
+                    ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;
                 },
             };
         }
@@ -510,92 +401,72 @@
 
     // Compute sizes of nested messages
     #[allow(unused_variables)]
-    fn compute_size(&self) -> u32 {
+    fn compute_size(&self) -> u64 {
         let mut my_size = 0;
-        if let Some(ref v) = self.public_dh_key.as_ref() {
+        if let Some(v) = self.public_dh_key.as_ref() {
             let len = v.compute_size();
-            my_size += 1 + ::protobuf::rt::compute_raw_varint32_size(len) + len;
+            my_size += 1 + ::protobuf::rt::compute_raw_varint64_size(len) + len;
         }
         if let Some(v) = self.protocol_version {
-            my_size += ::protobuf::rt::value_size(2, v, ::protobuf::wire_format::WireTypeVarint);
+            my_size += ::protobuf::rt::int32_size(2, v);
         }
-        my_size += ::protobuf::rt::unknown_fields_size(self.get_unknown_fields());
-        self.cached_size.set(my_size);
+        my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());
+        self.special_fields.cached_size().set(my_size as u32);
         my_size
     }
 
-    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::ProtobufResult<()> {
-        if let Some(ref v) = self.public_dh_key.as_ref() {
-            os.write_tag(1, ::protobuf::wire_format::WireTypeLengthDelimited)?;
-            os.write_raw_varint32(v.get_cached_size())?;
-            v.write_to_with_cached_sizes(os)?;
+    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {
+        if let Some(v) = self.public_dh_key.as_ref() {
+            ::protobuf::rt::write_message_field_with_cached_size(1, v, os)?;
         }
         if let Some(v) = self.protocol_version {
             os.write_int32(2, v)?;
         }
-        os.write_unknown_fields(self.get_unknown_fields())?;
+        os.write_unknown_fields(self.special_fields.unknown_fields())?;
         ::std::result::Result::Ok(())
     }
 
-    fn get_cached_size(&self) -> u32 {
-        self.cached_size.get()
+    fn special_fields(&self) -> &::protobuf::SpecialFields {
+        &self.special_fields
     }
 
-    fn get_unknown_fields(&self) -> &::protobuf::UnknownFields {
-        &self.unknown_fields
-    }
-
-    fn mut_unknown_fields(&mut self) -> &mut ::protobuf::UnknownFields {
-        &mut self.unknown_fields
-    }
-
-    fn as_any(&self) -> &dyn (::std::any::Any) {
-        self as &dyn (::std::any::Any)
-    }
-    fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) {
-        self as &mut dyn (::std::any::Any)
-    }
-    fn into_any(self: ::std::boxed::Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
-        self
-    }
-
-    fn descriptor(&self) -> &'static ::protobuf::reflect::MessageDescriptor {
-        Self::descriptor_static()
+    fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {
+        &mut self.special_fields
     }
 
     fn new() -> ResponderHello {
         ResponderHello::new()
     }
 
-    fn default_instance() -> &'static ResponderHello {
-        static instance: ::protobuf::rt::LazyV2<ResponderHello> = ::protobuf::rt::LazyV2::INIT;
-        instance.get(ResponderHello::new)
-    }
-}
-
-impl ::protobuf::Clear for ResponderHello {
     fn clear(&mut self) {
         self.public_dh_key.clear();
         self.protocol_version = ::std::option::Option::None;
-        self.unknown_fields.clear();
+        self.special_fields.clear();
     }
-}
 
-impl ::protobuf::reflect::ProtobufValue for ResponderHello {
-    fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef {
-        ::protobuf::reflect::ReflectValueRef::Message(self)
+    fn default_instance() -> &'static ResponderHello {
+        static instance: ResponderHello = ResponderHello {
+            public_dh_key: ::protobuf::MessageField::none(),
+            protocol_version: ::std::option::Option::None,
+            special_fields: ::protobuf::SpecialFields::new(),
+        };
+        &instance
     }
 }
 
 #[derive(PartialEq,Clone,Default,Debug)]
+// @@protoc_insertion_point(message:securegcm.EcPoint)
 pub struct EcPoint {
     // message fields
-    curve: ::std::option::Option<Curve>,
-    x: ::protobuf::SingularField<::std::vec::Vec<u8>>,
-    y: ::protobuf::SingularField<::std::vec::Vec<u8>>,
+    // @@protoc_insertion_point(field:securegcm.EcPoint.curve)
+    pub curve: ::std::option::Option<::protobuf::EnumOrUnknown<Curve>>,
+    // @@protoc_insertion_point(field:securegcm.EcPoint.x)
+    pub x: ::std::option::Option<::std::vec::Vec<u8>>,
+    // @@protoc_insertion_point(field:securegcm.EcPoint.y)
+    pub y: ::std::option::Option<::std::vec::Vec<u8>>,
     // special fields
-    pub unknown_fields: ::protobuf::UnknownFields,
-    pub cached_size: ::protobuf::CachedSize,
+    // @@protoc_insertion_point(special_field:securegcm.EcPoint.special_fields)
+    pub special_fields: ::protobuf::SpecialFields,
 }
 
 impl<'a> ::std::default::Default for &'a EcPoint {
@@ -611,10 +482,13 @@
 
     // required .securegcm.Curve curve = 1;
 
-
-    pub fn get_curve(&self) -> Curve {
-        self.curve.unwrap_or(Curve::ED_25519)
+    pub fn curve(&self) -> Curve {
+        match self.curve {
+            Some(e) => e.enum_value_or(Curve::ED_25519),
+            None => Curve::ED_25519,
+        }
     }
+
     pub fn clear_curve(&mut self) {
         self.curve = ::std::option::Option::None;
     }
@@ -625,20 +499,20 @@
 
     // Param is passed by value, moved
     pub fn set_curve(&mut self, v: Curve) {
-        self.curve = ::std::option::Option::Some(v);
+        self.curve = ::std::option::Option::Some(::protobuf::EnumOrUnknown::new(v));
     }
 
     // required bytes x = 2;
 
-
-    pub fn get_x(&self) -> &[u8] {
+    pub fn x(&self) -> &[u8] {
         match self.x.as_ref() {
-            Some(v) => &v,
+            Some(v) => v,
             None => &[],
         }
     }
+
     pub fn clear_x(&mut self) {
-        self.x.clear();
+        self.x = ::std::option::Option::None;
     }
 
     pub fn has_x(&self) -> bool {
@@ -647,14 +521,14 @@
 
     // Param is passed by value, moved
     pub fn set_x(&mut self, v: ::std::vec::Vec<u8>) {
-        self.x = ::protobuf::SingularField::some(v);
+        self.x = ::std::option::Option::Some(v);
     }
 
     // Mutable pointer to the field.
     // If field is not initialized, it is initialized with default value first.
     pub fn mut_x(&mut self) -> &mut ::std::vec::Vec<u8> {
         if self.x.is_none() {
-            self.x.set_default();
+            self.x = ::std::option::Option::Some(::std::vec::Vec::new());
         }
         self.x.as_mut().unwrap()
     }
@@ -666,15 +540,15 @@
 
     // required bytes y = 3;
 
-
-    pub fn get_y(&self) -> &[u8] {
+    pub fn y(&self) -> &[u8] {
         match self.y.as_ref() {
-            Some(v) => &v,
+            Some(v) => v,
             None => &[],
         }
     }
+
     pub fn clear_y(&mut self) {
-        self.y.clear();
+        self.y = ::std::option::Option::None;
     }
 
     pub fn has_y(&self) -> bool {
@@ -683,14 +557,14 @@
 
     // Param is passed by value, moved
     pub fn set_y(&mut self, v: ::std::vec::Vec<u8>) {
-        self.y = ::protobuf::SingularField::some(v);
+        self.y = ::std::option::Option::Some(v);
     }
 
     // Mutable pointer to the field.
     // If field is not initialized, it is initialized with default value first.
     pub fn mut_y(&mut self) -> &mut ::std::vec::Vec<u8> {
         if self.y.is_none() {
-            self.y.set_default();
+            self.y = ::std::option::Option::Some(::std::vec::Vec::new());
         }
         self.y.as_mut().unwrap()
     }
@@ -702,6 +576,8 @@
 }
 
 impl ::protobuf::Message for EcPoint {
+    const NAME: &'static str = "EcPoint";
+
     fn is_initialized(&self) -> bool {
         if self.curve.is_none() {
             return false;
@@ -715,21 +591,20 @@
         true
     }
 
-    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::ProtobufResult<()> {
-        while !is.eof()? {
-            let (field_number, wire_type) = is.read_tag_unpack()?;
-            match field_number {
-                1 => {
-                    ::protobuf::rt::read_proto2_enum_with_unknown_fields_into(wire_type, is, &mut self.curve, 1, &mut self.unknown_fields)?
+    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {
+        while let Some(tag) = is.read_raw_tag_or_eof()? {
+            match tag {
+                8 => {
+                    self.curve = ::std::option::Option::Some(is.read_enum_or_unknown()?);
                 },
-                2 => {
-                    ::protobuf::rt::read_singular_bytes_into(wire_type, is, &mut self.x)?;
+                18 => {
+                    self.x = ::std::option::Option::Some(is.read_bytes()?);
                 },
-                3 => {
-                    ::protobuf::rt::read_singular_bytes_into(wire_type, is, &mut self.y)?;
+                26 => {
+                    self.y = ::std::option::Option::Some(is.read_bytes()?);
                 },
-                _ => {
-                    ::protobuf::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?;
+                tag => {
+                    ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;
                 },
             };
         }
@@ -738,97 +613,81 @@
 
     // Compute sizes of nested messages
     #[allow(unused_variables)]
-    fn compute_size(&self) -> u32 {
+    fn compute_size(&self) -> u64 {
         let mut my_size = 0;
         if let Some(v) = self.curve {
-            my_size += ::protobuf::rt::enum_size(1, v);
+            my_size += ::protobuf::rt::int32_size(1, v.value());
         }
-        if let Some(ref v) = self.x.as_ref() {
+        if let Some(v) = self.x.as_ref() {
             my_size += ::protobuf::rt::bytes_size(2, &v);
         }
-        if let Some(ref v) = self.y.as_ref() {
+        if let Some(v) = self.y.as_ref() {
             my_size += ::protobuf::rt::bytes_size(3, &v);
         }
-        my_size += ::protobuf::rt::unknown_fields_size(self.get_unknown_fields());
-        self.cached_size.set(my_size);
+        my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());
+        self.special_fields.cached_size().set(my_size as u32);
         my_size
     }
 
-    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::ProtobufResult<()> {
+    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {
         if let Some(v) = self.curve {
-            os.write_enum(1, ::protobuf::ProtobufEnum::value(&v))?;
+            os.write_enum(1, ::protobuf::EnumOrUnknown::value(&v))?;
         }
-        if let Some(ref v) = self.x.as_ref() {
-            os.write_bytes(2, &v)?;
+        if let Some(v) = self.x.as_ref() {
+            os.write_bytes(2, v)?;
         }
-        if let Some(ref v) = self.y.as_ref() {
-            os.write_bytes(3, &v)?;
+        if let Some(v) = self.y.as_ref() {
+            os.write_bytes(3, v)?;
         }
-        os.write_unknown_fields(self.get_unknown_fields())?;
+        os.write_unknown_fields(self.special_fields.unknown_fields())?;
         ::std::result::Result::Ok(())
     }
 
-    fn get_cached_size(&self) -> u32 {
-        self.cached_size.get()
+    fn special_fields(&self) -> &::protobuf::SpecialFields {
+        &self.special_fields
     }
 
-    fn get_unknown_fields(&self) -> &::protobuf::UnknownFields {
-        &self.unknown_fields
-    }
-
-    fn mut_unknown_fields(&mut self) -> &mut ::protobuf::UnknownFields {
-        &mut self.unknown_fields
-    }
-
-    fn as_any(&self) -> &dyn (::std::any::Any) {
-        self as &dyn (::std::any::Any)
-    }
-    fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) {
-        self as &mut dyn (::std::any::Any)
-    }
-    fn into_any(self: ::std::boxed::Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
-        self
-    }
-
-    fn descriptor(&self) -> &'static ::protobuf::reflect::MessageDescriptor {
-        Self::descriptor_static()
+    fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {
+        &mut self.special_fields
     }
 
     fn new() -> EcPoint {
         EcPoint::new()
     }
 
-    fn default_instance() -> &'static EcPoint {
-        static instance: ::protobuf::rt::LazyV2<EcPoint> = ::protobuf::rt::LazyV2::INIT;
-        instance.get(EcPoint::new)
-    }
-}
-
-impl ::protobuf::Clear for EcPoint {
     fn clear(&mut self) {
         self.curve = ::std::option::Option::None;
-        self.x.clear();
-        self.y.clear();
-        self.unknown_fields.clear();
+        self.x = ::std::option::Option::None;
+        self.y = ::std::option::Option::None;
+        self.special_fields.clear();
     }
-}
 
-impl ::protobuf::reflect::ProtobufValue for EcPoint {
-    fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef {
-        ::protobuf::reflect::ReflectValueRef::Message(self)
+    fn default_instance() -> &'static EcPoint {
+        static instance: EcPoint = EcPoint {
+            curve: ::std::option::Option::None,
+            x: ::std::option::Option::None,
+            y: ::std::option::Option::None,
+            special_fields: ::protobuf::SpecialFields::new(),
+        };
+        &instance
     }
 }
 
 #[derive(PartialEq,Clone,Default,Debug)]
+// @@protoc_insertion_point(message:securegcm.SpakeHandshakeMessage)
 pub struct SpakeHandshakeMessage {
     // message fields
-    flow_number: ::std::option::Option<i32>,
-    pub ec_point: ::protobuf::SingularPtrField<EcPoint>,
-    hash_value: ::protobuf::SingularField<::std::vec::Vec<u8>>,
-    payload: ::protobuf::SingularField<::std::vec::Vec<u8>>,
+    // @@protoc_insertion_point(field:securegcm.SpakeHandshakeMessage.flow_number)
+    pub flow_number: ::std::option::Option<i32>,
+    // @@protoc_insertion_point(field:securegcm.SpakeHandshakeMessage.ec_point)
+    pub ec_point: ::protobuf::MessageField<EcPoint>,
+    // @@protoc_insertion_point(field:securegcm.SpakeHandshakeMessage.hash_value)
+    pub hash_value: ::std::option::Option<::std::vec::Vec<u8>>,
+    // @@protoc_insertion_point(field:securegcm.SpakeHandshakeMessage.payload)
+    pub payload: ::std::option::Option<::std::vec::Vec<u8>>,
     // special fields
-    pub unknown_fields: ::protobuf::UnknownFields,
-    pub cached_size: ::protobuf::CachedSize,
+    // @@protoc_insertion_point(special_field:securegcm.SpakeHandshakeMessage.special_fields)
+    pub special_fields: ::protobuf::SpecialFields,
 }
 
 impl<'a> ::std::default::Default for &'a SpakeHandshakeMessage {
@@ -844,10 +703,10 @@
 
     // optional int32 flow_number = 1;
 
-
-    pub fn get_flow_number(&self) -> i32 {
+    pub fn flow_number(&self) -> i32 {
         self.flow_number.unwrap_or(0)
     }
+
     pub fn clear_flow_number(&mut self) {
         self.flow_number = ::std::option::Option::None;
     }
@@ -861,50 +720,17 @@
         self.flow_number = ::std::option::Option::Some(v);
     }
 
-    // optional .securegcm.EcPoint ec_point = 2;
-
-
-    pub fn get_ec_point(&self) -> &EcPoint {
-        self.ec_point.as_ref().unwrap_or_else(|| <EcPoint as ::protobuf::Message>::default_instance())
-    }
-    pub fn clear_ec_point(&mut self) {
-        self.ec_point.clear();
-    }
-
-    pub fn has_ec_point(&self) -> bool {
-        self.ec_point.is_some()
-    }
-
-    // Param is passed by value, moved
-    pub fn set_ec_point(&mut self, v: EcPoint) {
-        self.ec_point = ::protobuf::SingularPtrField::some(v);
-    }
-
-    // Mutable pointer to the field.
-    // If field is not initialized, it is initialized with default value first.
-    pub fn mut_ec_point(&mut self) -> &mut EcPoint {
-        if self.ec_point.is_none() {
-            self.ec_point.set_default();
-        }
-        self.ec_point.as_mut().unwrap()
-    }
-
-    // Take field
-    pub fn take_ec_point(&mut self) -> EcPoint {
-        self.ec_point.take().unwrap_or_else(|| EcPoint::new())
-    }
-
     // optional bytes hash_value = 3;
 
-
-    pub fn get_hash_value(&self) -> &[u8] {
+    pub fn hash_value(&self) -> &[u8] {
         match self.hash_value.as_ref() {
-            Some(v) => &v,
+            Some(v) => v,
             None => &[],
         }
     }
+
     pub fn clear_hash_value(&mut self) {
-        self.hash_value.clear();
+        self.hash_value = ::std::option::Option::None;
     }
 
     pub fn has_hash_value(&self) -> bool {
@@ -913,14 +739,14 @@
 
     // Param is passed by value, moved
     pub fn set_hash_value(&mut self, v: ::std::vec::Vec<u8>) {
-        self.hash_value = ::protobuf::SingularField::some(v);
+        self.hash_value = ::std::option::Option::Some(v);
     }
 
     // Mutable pointer to the field.
     // If field is not initialized, it is initialized with default value first.
     pub fn mut_hash_value(&mut self) -> &mut ::std::vec::Vec<u8> {
         if self.hash_value.is_none() {
-            self.hash_value.set_default();
+            self.hash_value = ::std::option::Option::Some(::std::vec::Vec::new());
         }
         self.hash_value.as_mut().unwrap()
     }
@@ -932,15 +758,15 @@
 
     // optional bytes payload = 4;
 
-
-    pub fn get_payload(&self) -> &[u8] {
+    pub fn payload(&self) -> &[u8] {
         match self.payload.as_ref() {
-            Some(v) => &v,
+            Some(v) => v,
             None => &[],
         }
     }
+
     pub fn clear_payload(&mut self) {
-        self.payload.clear();
+        self.payload = ::std::option::Option::None;
     }
 
     pub fn has_payload(&self) -> bool {
@@ -949,14 +775,14 @@
 
     // Param is passed by value, moved
     pub fn set_payload(&mut self, v: ::std::vec::Vec<u8>) {
-        self.payload = ::protobuf::SingularField::some(v);
+        self.payload = ::std::option::Option::Some(v);
     }
 
     // Mutable pointer to the field.
     // If field is not initialized, it is initialized with default value first.
     pub fn mut_payload(&mut self) -> &mut ::std::vec::Vec<u8> {
         if self.payload.is_none() {
-            self.payload.set_default();
+            self.payload = ::std::option::Option::Some(::std::vec::Vec::new());
         }
         self.payload.as_mut().unwrap()
     }
@@ -968,6 +794,8 @@
 }
 
 impl ::protobuf::Message for SpakeHandshakeMessage {
+    const NAME: &'static str = "SpakeHandshakeMessage";
+
     fn is_initialized(&self) -> bool {
         for v in &self.ec_point {
             if !v.is_initialized() {
@@ -977,28 +805,23 @@
         true
     }
 
-    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::ProtobufResult<()> {
-        while !is.eof()? {
-            let (field_number, wire_type) = is.read_tag_unpack()?;
-            match field_number {
-                1 => {
-                    if wire_type != ::protobuf::wire_format::WireTypeVarint {
-                        return ::std::result::Result::Err(::protobuf::rt::unexpected_wire_type(wire_type));
-                    }
-                    let tmp = is.read_int32()?;
-                    self.flow_number = ::std::option::Option::Some(tmp);
+    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {
+        while let Some(tag) = is.read_raw_tag_or_eof()? {
+            match tag {
+                8 => {
+                    self.flow_number = ::std::option::Option::Some(is.read_int32()?);
                 },
-                2 => {
-                    ::protobuf::rt::read_singular_message_into(wire_type, is, &mut self.ec_point)?;
+                18 => {
+                    ::protobuf::rt::read_singular_message_into_field(is, &mut self.ec_point)?;
                 },
-                3 => {
-                    ::protobuf::rt::read_singular_bytes_into(wire_type, is, &mut self.hash_value)?;
+                26 => {
+                    self.hash_value = ::std::option::Option::Some(is.read_bytes()?);
                 },
-                4 => {
-                    ::protobuf::rt::read_singular_bytes_into(wire_type, is, &mut self.payload)?;
+                34 => {
+                    self.payload = ::std::option::Option::Some(is.read_bytes()?);
                 },
-                _ => {
-                    ::protobuf::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?;
+                tag => {
+                    ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;
                 },
             };
         }
@@ -1007,103 +830,85 @@
 
     // Compute sizes of nested messages
     #[allow(unused_variables)]
-    fn compute_size(&self) -> u32 {
+    fn compute_size(&self) -> u64 {
         let mut my_size = 0;
         if let Some(v) = self.flow_number {
-            my_size += ::protobuf::rt::value_size(1, v, ::protobuf::wire_format::WireTypeVarint);
+            my_size += ::protobuf::rt::int32_size(1, v);
         }
-        if let Some(ref v) = self.ec_point.as_ref() {
+        if let Some(v) = self.ec_point.as_ref() {
             let len = v.compute_size();
-            my_size += 1 + ::protobuf::rt::compute_raw_varint32_size(len) + len;
+            my_size += 1 + ::protobuf::rt::compute_raw_varint64_size(len) + len;
         }
-        if let Some(ref v) = self.hash_value.as_ref() {
+        if let Some(v) = self.hash_value.as_ref() {
             my_size += ::protobuf::rt::bytes_size(3, &v);
         }
-        if let Some(ref v) = self.payload.as_ref() {
+        if let Some(v) = self.payload.as_ref() {
             my_size += ::protobuf::rt::bytes_size(4, &v);
         }
-        my_size += ::protobuf::rt::unknown_fields_size(self.get_unknown_fields());
-        self.cached_size.set(my_size);
+        my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());
+        self.special_fields.cached_size().set(my_size as u32);
         my_size
     }
 
-    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::ProtobufResult<()> {
+    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {
         if let Some(v) = self.flow_number {
             os.write_int32(1, v)?;
         }
-        if let Some(ref v) = self.ec_point.as_ref() {
-            os.write_tag(2, ::protobuf::wire_format::WireTypeLengthDelimited)?;
-            os.write_raw_varint32(v.get_cached_size())?;
-            v.write_to_with_cached_sizes(os)?;
+        if let Some(v) = self.ec_point.as_ref() {
+            ::protobuf::rt::write_message_field_with_cached_size(2, v, os)?;
         }
-        if let Some(ref v) = self.hash_value.as_ref() {
-            os.write_bytes(3, &v)?;
+        if let Some(v) = self.hash_value.as_ref() {
+            os.write_bytes(3, v)?;
         }
-        if let Some(ref v) = self.payload.as_ref() {
-            os.write_bytes(4, &v)?;
+        if let Some(v) = self.payload.as_ref() {
+            os.write_bytes(4, v)?;
         }
-        os.write_unknown_fields(self.get_unknown_fields())?;
+        os.write_unknown_fields(self.special_fields.unknown_fields())?;
         ::std::result::Result::Ok(())
     }
 
-    fn get_cached_size(&self) -> u32 {
-        self.cached_size.get()
+    fn special_fields(&self) -> &::protobuf::SpecialFields {
+        &self.special_fields
     }
 
-    fn get_unknown_fields(&self) -> &::protobuf::UnknownFields {
-        &self.unknown_fields
-    }
-
-    fn mut_unknown_fields(&mut self) -> &mut ::protobuf::UnknownFields {
-        &mut self.unknown_fields
-    }
-
-    fn as_any(&self) -> &dyn (::std::any::Any) {
-        self as &dyn (::std::any::Any)
-    }
-    fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) {
-        self as &mut dyn (::std::any::Any)
-    }
-    fn into_any(self: ::std::boxed::Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
-        self
-    }
-
-    fn descriptor(&self) -> &'static ::protobuf::reflect::MessageDescriptor {
-        Self::descriptor_static()
+    fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {
+        &mut self.special_fields
     }
 
     fn new() -> SpakeHandshakeMessage {
         SpakeHandshakeMessage::new()
     }
 
-    fn default_instance() -> &'static SpakeHandshakeMessage {
-        static instance: ::protobuf::rt::LazyV2<SpakeHandshakeMessage> = ::protobuf::rt::LazyV2::INIT;
-        instance.get(SpakeHandshakeMessage::new)
-    }
-}
-
-impl ::protobuf::Clear for SpakeHandshakeMessage {
     fn clear(&mut self) {
         self.flow_number = ::std::option::Option::None;
         self.ec_point.clear();
-        self.hash_value.clear();
-        self.payload.clear();
-        self.unknown_fields.clear();
+        self.hash_value = ::std::option::Option::None;
+        self.payload = ::std::option::Option::None;
+        self.special_fields.clear();
+    }
+
+    fn default_instance() -> &'static SpakeHandshakeMessage {
+        static instance: SpakeHandshakeMessage = SpakeHandshakeMessage {
+            flow_number: ::std::option::Option::None,
+            ec_point: ::protobuf::MessageField::none(),
+            hash_value: ::std::option::Option::None,
+            payload: ::std::option::Option::None,
+            special_fields: ::protobuf::SpecialFields::new(),
+        };
+        &instance
     }
 }
 
-impl ::protobuf::reflect::ProtobufValue for SpakeHandshakeMessage {
-    fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef {
-        ::protobuf::reflect::ReflectValueRef::Message(self)
-    }
-}
-
-#[derive(Clone,PartialEq,Eq,Debug,Hash)]
+#[derive(Clone,Copy,PartialEq,Eq,Debug,Hash)]
+// @@protoc_insertion_point(enum:securegcm.Curve)
 pub enum Curve {
+    // @@protoc_insertion_point(enum_value:securegcm.Curve.ED_25519)
     ED_25519 = 1,
 }
 
-impl ::protobuf::ProtobufEnum for Curve {
+impl ::protobuf::Enum for Curve {
+    const NAME: &'static str = "Curve";
+
     fn value(&self) -> i32 {
         *self as i32
     }
@@ -1115,15 +920,9 @@
         }
     }
 
-    fn values() -> &'static [Self] {
-        static values: &'static [Curve] = &[
-            Curve::ED_25519,
-        ];
-        values
-    }
-}
-
-impl ::std::marker::Copy for Curve {
+    const VALUES: &'static [Curve] = &[
+        Curve::ED_25519,
+    ];
 }
 
 // Note, `Default` is implemented although default value is not 0
@@ -1133,8 +932,3 @@
     }
 }
 
-impl ::protobuf::reflect::ProtobufValue for Curve {
-    fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef {
-        ::protobuf::reflect::ReflectValueRef::Enum(::protobuf::ProtobufEnum::descriptor(self))
-    }
-}
diff --git a/nearby/connections/ukey2/ukey2_proto/src/ukey2_all_proto/securegcm.rs b/nearby/connections/ukey2/ukey2_proto/src/ukey2_all_proto/securegcm.rs
index 8a908b1..3231440 100644
--- a/nearby/connections/ukey2/ukey2_proto/src/ukey2_all_proto/securegcm.rs
+++ b/nearby/connections/ukey2/ukey2_proto/src/ukey2_all_proto/securegcm.rs
@@ -12,7 +12,8 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-// This file is generated by rust-protobuf 2.28.0. Do not edit
+// This file is generated by rust-protobuf 3.2.0. Do not edit
+// .proto file is parsed by protoc 3.19.1
 // @generated
 
 // https://github.com/rust-lang/rust-clippy/issues/702
@@ -29,58 +30,99 @@
 #![allow(non_snake_case)]
 #![allow(non_upper_case_globals)]
 #![allow(trivial_casts)]
-#![allow(unused_imports)]
 #![allow(unused_results)]
+#![allow(unused_mut)]
+
 //! Generated file from `securegcm.proto`
+// Generated for lite runtime
 
 /// Generated files are compatible only with the same version
 /// of protobuf runtime.
-// const _PROTOBUF_VERSION_CHECK: () = ::protobuf::VERSION_2_28_0;
+const _PROTOBUF_VERSION_CHECK: () = ::protobuf::VERSION_3_2_0;
 
 #[derive(PartialEq,Clone,Default,Debug)]
+// @@protoc_insertion_point(message:securegcm.GcmDeviceInfo)
 pub struct GcmDeviceInfo {
     // message fields
-    android_device_id: ::std::option::Option<u64>,
-    gcm_registration_id: ::protobuf::SingularField<::std::vec::Vec<u8>>,
-    apn_registration_id: ::protobuf::SingularField<::std::vec::Vec<u8>>,
-    notification_enabled: ::std::option::Option<bool>,
-    bluetooth_mac_address: ::protobuf::SingularField<::std::string::String>,
-    device_master_key_hash: ::protobuf::SingularField<::std::vec::Vec<u8>>,
-    user_public_key: ::protobuf::SingularField<::std::vec::Vec<u8>>,
-    device_model: ::protobuf::SingularField<::std::string::String>,
-    locale: ::protobuf::SingularField<::std::string::String>,
-    key_handle: ::protobuf::SingularField<::std::vec::Vec<u8>>,
-    counter: ::std::option::Option<i64>,
-    device_os_version: ::protobuf::SingularField<::std::string::String>,
-    device_os_version_code: ::std::option::Option<i64>,
-    device_os_release: ::protobuf::SingularField<::std::string::String>,
-    device_os_codename: ::protobuf::SingularField<::std::string::String>,
-    device_software_version: ::protobuf::SingularField<::std::string::String>,
-    device_software_version_code: ::std::option::Option<i64>,
-    device_software_package: ::protobuf::SingularField<::std::string::String>,
-    device_display_diagonal_mils: ::std::option::Option<i32>,
-    device_authzen_version: ::std::option::Option<i32>,
-    long_device_id: ::protobuf::SingularField<::std::vec::Vec<u8>>,
-    device_manufacturer: ::protobuf::SingularField<::std::string::String>,
-    device_type: ::std::option::Option<DeviceType>,
-    using_secure_screenlock: ::std::option::Option<bool>,
-    auto_unlock_screenlock_supported: ::std::option::Option<bool>,
-    auto_unlock_screenlock_enabled: ::std::option::Option<bool>,
-    bluetooth_radio_supported: ::std::option::Option<bool>,
-    bluetooth_radio_enabled: ::std::option::Option<bool>,
-    mobile_data_supported: ::std::option::Option<bool>,
-    tethering_supported: ::std::option::Option<bool>,
-    ble_radio_supported: ::std::option::Option<bool>,
-    pixel_experience: ::std::option::Option<bool>,
-    arc_plus_plus: ::std::option::Option<bool>,
-    is_screenlock_state_flaky: ::std::option::Option<bool>,
-    pub supported_software_features: ::std::vec::Vec<SoftwareFeature>,
-    pub enabled_software_features: ::std::vec::Vec<SoftwareFeature>,
-    enrollment_session_id: ::protobuf::SingularField<::std::vec::Vec<u8>>,
-    oauth_token: ::protobuf::SingularField<::std::string::String>,
+    // @@protoc_insertion_point(field:securegcm.GcmDeviceInfo.android_device_id)
+    pub android_device_id: ::std::option::Option<u64>,
+    // @@protoc_insertion_point(field:securegcm.GcmDeviceInfo.gcm_registration_id)
+    pub gcm_registration_id: ::std::option::Option<::std::vec::Vec<u8>>,
+    // @@protoc_insertion_point(field:securegcm.GcmDeviceInfo.apn_registration_id)
+    pub apn_registration_id: ::std::option::Option<::std::vec::Vec<u8>>,
+    // @@protoc_insertion_point(field:securegcm.GcmDeviceInfo.notification_enabled)
+    pub notification_enabled: ::std::option::Option<bool>,
+    // @@protoc_insertion_point(field:securegcm.GcmDeviceInfo.bluetooth_mac_address)
+    pub bluetooth_mac_address: ::std::option::Option<::std::string::String>,
+    // @@protoc_insertion_point(field:securegcm.GcmDeviceInfo.device_master_key_hash)
+    pub device_master_key_hash: ::std::option::Option<::std::vec::Vec<u8>>,
+    // @@protoc_insertion_point(field:securegcm.GcmDeviceInfo.user_public_key)
+    pub user_public_key: ::std::option::Option<::std::vec::Vec<u8>>,
+    // @@protoc_insertion_point(field:securegcm.GcmDeviceInfo.device_model)
+    pub device_model: ::std::option::Option<::std::string::String>,
+    // @@protoc_insertion_point(field:securegcm.GcmDeviceInfo.locale)
+    pub locale: ::std::option::Option<::std::string::String>,
+    // @@protoc_insertion_point(field:securegcm.GcmDeviceInfo.key_handle)
+    pub key_handle: ::std::option::Option<::std::vec::Vec<u8>>,
+    // @@protoc_insertion_point(field:securegcm.GcmDeviceInfo.counter)
+    pub counter: ::std::option::Option<i64>,
+    // @@protoc_insertion_point(field:securegcm.GcmDeviceInfo.device_os_version)
+    pub device_os_version: ::std::option::Option<::std::string::String>,
+    // @@protoc_insertion_point(field:securegcm.GcmDeviceInfo.device_os_version_code)
+    pub device_os_version_code: ::std::option::Option<i64>,
+    // @@protoc_insertion_point(field:securegcm.GcmDeviceInfo.device_os_release)
+    pub device_os_release: ::std::option::Option<::std::string::String>,
+    // @@protoc_insertion_point(field:securegcm.GcmDeviceInfo.device_os_codename)
+    pub device_os_codename: ::std::option::Option<::std::string::String>,
+    // @@protoc_insertion_point(field:securegcm.GcmDeviceInfo.device_software_version)
+    pub device_software_version: ::std::option::Option<::std::string::String>,
+    // @@protoc_insertion_point(field:securegcm.GcmDeviceInfo.device_software_version_code)
+    pub device_software_version_code: ::std::option::Option<i64>,
+    // @@protoc_insertion_point(field:securegcm.GcmDeviceInfo.device_software_package)
+    pub device_software_package: ::std::option::Option<::std::string::String>,
+    // @@protoc_insertion_point(field:securegcm.GcmDeviceInfo.device_display_diagonal_mils)
+    pub device_display_diagonal_mils: ::std::option::Option<i32>,
+    // @@protoc_insertion_point(field:securegcm.GcmDeviceInfo.device_authzen_version)
+    pub device_authzen_version: ::std::option::Option<i32>,
+    // @@protoc_insertion_point(field:securegcm.GcmDeviceInfo.long_device_id)
+    pub long_device_id: ::std::option::Option<::std::vec::Vec<u8>>,
+    // @@protoc_insertion_point(field:securegcm.GcmDeviceInfo.device_manufacturer)
+    pub device_manufacturer: ::std::option::Option<::std::string::String>,
+    // @@protoc_insertion_point(field:securegcm.GcmDeviceInfo.device_type)
+    pub device_type: ::std::option::Option<::protobuf::EnumOrUnknown<DeviceType>>,
+    // @@protoc_insertion_point(field:securegcm.GcmDeviceInfo.using_secure_screenlock)
+    pub using_secure_screenlock: ::std::option::Option<bool>,
+    // @@protoc_insertion_point(field:securegcm.GcmDeviceInfo.auto_unlock_screenlock_supported)
+    pub auto_unlock_screenlock_supported: ::std::option::Option<bool>,
+    // @@protoc_insertion_point(field:securegcm.GcmDeviceInfo.auto_unlock_screenlock_enabled)
+    pub auto_unlock_screenlock_enabled: ::std::option::Option<bool>,
+    // @@protoc_insertion_point(field:securegcm.GcmDeviceInfo.bluetooth_radio_supported)
+    pub bluetooth_radio_supported: ::std::option::Option<bool>,
+    // @@protoc_insertion_point(field:securegcm.GcmDeviceInfo.bluetooth_radio_enabled)
+    pub bluetooth_radio_enabled: ::std::option::Option<bool>,
+    // @@protoc_insertion_point(field:securegcm.GcmDeviceInfo.mobile_data_supported)
+    pub mobile_data_supported: ::std::option::Option<bool>,
+    // @@protoc_insertion_point(field:securegcm.GcmDeviceInfo.tethering_supported)
+    pub tethering_supported: ::std::option::Option<bool>,
+    // @@protoc_insertion_point(field:securegcm.GcmDeviceInfo.ble_radio_supported)
+    pub ble_radio_supported: ::std::option::Option<bool>,
+    // @@protoc_insertion_point(field:securegcm.GcmDeviceInfo.pixel_experience)
+    pub pixel_experience: ::std::option::Option<bool>,
+    // @@protoc_insertion_point(field:securegcm.GcmDeviceInfo.arc_plus_plus)
+    pub arc_plus_plus: ::std::option::Option<bool>,
+    // @@protoc_insertion_point(field:securegcm.GcmDeviceInfo.is_screenlock_state_flaky)
+    pub is_screenlock_state_flaky: ::std::option::Option<bool>,
+    // @@protoc_insertion_point(field:securegcm.GcmDeviceInfo.supported_software_features)
+    pub supported_software_features: ::std::vec::Vec<::protobuf::EnumOrUnknown<SoftwareFeature>>,
+    // @@protoc_insertion_point(field:securegcm.GcmDeviceInfo.enabled_software_features)
+    pub enabled_software_features: ::std::vec::Vec<::protobuf::EnumOrUnknown<SoftwareFeature>>,
+    // @@protoc_insertion_point(field:securegcm.GcmDeviceInfo.enrollment_session_id)
+    pub enrollment_session_id: ::std::option::Option<::std::vec::Vec<u8>>,
+    // @@protoc_insertion_point(field:securegcm.GcmDeviceInfo.oauth_token)
+    pub oauth_token: ::std::option::Option<::std::string::String>,
     // special fields
-    pub unknown_fields: ::protobuf::UnknownFields,
-    pub cached_size: ::protobuf::CachedSize,
+    // @@protoc_insertion_point(special_field:securegcm.GcmDeviceInfo.special_fields)
+    pub special_fields: ::protobuf::SpecialFields,
 }
 
 impl<'a> ::std::default::Default for &'a GcmDeviceInfo {
@@ -96,10 +138,10 @@
 
     // optional fixed64 android_device_id = 1;
 
-
-    pub fn get_android_device_id(&self) -> u64 {
+    pub fn android_device_id(&self) -> u64 {
         self.android_device_id.unwrap_or(0)
     }
+
     pub fn clear_android_device_id(&mut self) {
         self.android_device_id = ::std::option::Option::None;
     }
@@ -115,15 +157,15 @@
 
     // optional bytes gcm_registration_id = 102;
 
-
-    pub fn get_gcm_registration_id(&self) -> &[u8] {
+    pub fn gcm_registration_id(&self) -> &[u8] {
         match self.gcm_registration_id.as_ref() {
-            Some(v) => &v,
+            Some(v) => v,
             None => &[],
         }
     }
+
     pub fn clear_gcm_registration_id(&mut self) {
-        self.gcm_registration_id.clear();
+        self.gcm_registration_id = ::std::option::Option::None;
     }
 
     pub fn has_gcm_registration_id(&self) -> bool {
@@ -132,14 +174,14 @@
 
     // Param is passed by value, moved
     pub fn set_gcm_registration_id(&mut self, v: ::std::vec::Vec<u8>) {
-        self.gcm_registration_id = ::protobuf::SingularField::some(v);
+        self.gcm_registration_id = ::std::option::Option::Some(v);
     }
 
     // Mutable pointer to the field.
     // If field is not initialized, it is initialized with default value first.
     pub fn mut_gcm_registration_id(&mut self) -> &mut ::std::vec::Vec<u8> {
         if self.gcm_registration_id.is_none() {
-            self.gcm_registration_id.set_default();
+            self.gcm_registration_id = ::std::option::Option::Some(::std::vec::Vec::new());
         }
         self.gcm_registration_id.as_mut().unwrap()
     }
@@ -151,15 +193,15 @@
 
     // optional bytes apn_registration_id = 202;
 
-
-    pub fn get_apn_registration_id(&self) -> &[u8] {
+    pub fn apn_registration_id(&self) -> &[u8] {
         match self.apn_registration_id.as_ref() {
-            Some(v) => &v,
+            Some(v) => v,
             None => &[],
         }
     }
+
     pub fn clear_apn_registration_id(&mut self) {
-        self.apn_registration_id.clear();
+        self.apn_registration_id = ::std::option::Option::None;
     }
 
     pub fn has_apn_registration_id(&self) -> bool {
@@ -168,14 +210,14 @@
 
     // Param is passed by value, moved
     pub fn set_apn_registration_id(&mut self, v: ::std::vec::Vec<u8>) {
-        self.apn_registration_id = ::protobuf::SingularField::some(v);
+        self.apn_registration_id = ::std::option::Option::Some(v);
     }
 
     // Mutable pointer to the field.
     // If field is not initialized, it is initialized with default value first.
     pub fn mut_apn_registration_id(&mut self) -> &mut ::std::vec::Vec<u8> {
         if self.apn_registration_id.is_none() {
-            self.apn_registration_id.set_default();
+            self.apn_registration_id = ::std::option::Option::Some(::std::vec::Vec::new());
         }
         self.apn_registration_id.as_mut().unwrap()
     }
@@ -187,10 +229,10 @@
 
     // optional bool notification_enabled = 203;
 
-
-    pub fn get_notification_enabled(&self) -> bool {
+    pub fn notification_enabled(&self) -> bool {
         self.notification_enabled.unwrap_or(true)
     }
+
     pub fn clear_notification_enabled(&mut self) {
         self.notification_enabled = ::std::option::Option::None;
     }
@@ -206,15 +248,15 @@
 
     // optional string bluetooth_mac_address = 302;
 
-
-    pub fn get_bluetooth_mac_address(&self) -> &str {
+    pub fn bluetooth_mac_address(&self) -> &str {
         match self.bluetooth_mac_address.as_ref() {
-            Some(v) => &v,
+            Some(v) => v,
             None => "",
         }
     }
+
     pub fn clear_bluetooth_mac_address(&mut self) {
-        self.bluetooth_mac_address.clear();
+        self.bluetooth_mac_address = ::std::option::Option::None;
     }
 
     pub fn has_bluetooth_mac_address(&self) -> bool {
@@ -223,14 +265,14 @@
 
     // Param is passed by value, moved
     pub fn set_bluetooth_mac_address(&mut self, v: ::std::string::String) {
-        self.bluetooth_mac_address = ::protobuf::SingularField::some(v);
+        self.bluetooth_mac_address = ::std::option::Option::Some(v);
     }
 
     // Mutable pointer to the field.
     // If field is not initialized, it is initialized with default value first.
     pub fn mut_bluetooth_mac_address(&mut self) -> &mut ::std::string::String {
         if self.bluetooth_mac_address.is_none() {
-            self.bluetooth_mac_address.set_default();
+            self.bluetooth_mac_address = ::std::option::Option::Some(::std::string::String::new());
         }
         self.bluetooth_mac_address.as_mut().unwrap()
     }
@@ -242,15 +284,15 @@
 
     // optional bytes device_master_key_hash = 103;
 
-
-    pub fn get_device_master_key_hash(&self) -> &[u8] {
+    pub fn device_master_key_hash(&self) -> &[u8] {
         match self.device_master_key_hash.as_ref() {
-            Some(v) => &v,
+            Some(v) => v,
             None => &[],
         }
     }
+
     pub fn clear_device_master_key_hash(&mut self) {
-        self.device_master_key_hash.clear();
+        self.device_master_key_hash = ::std::option::Option::None;
     }
 
     pub fn has_device_master_key_hash(&self) -> bool {
@@ -259,14 +301,14 @@
 
     // Param is passed by value, moved
     pub fn set_device_master_key_hash(&mut self, v: ::std::vec::Vec<u8>) {
-        self.device_master_key_hash = ::protobuf::SingularField::some(v);
+        self.device_master_key_hash = ::std::option::Option::Some(v);
     }
 
     // Mutable pointer to the field.
     // If field is not initialized, it is initialized with default value first.
     pub fn mut_device_master_key_hash(&mut self) -> &mut ::std::vec::Vec<u8> {
         if self.device_master_key_hash.is_none() {
-            self.device_master_key_hash.set_default();
+            self.device_master_key_hash = ::std::option::Option::Some(::std::vec::Vec::new());
         }
         self.device_master_key_hash.as_mut().unwrap()
     }
@@ -278,15 +320,15 @@
 
     // required bytes user_public_key = 4;
 
-
-    pub fn get_user_public_key(&self) -> &[u8] {
+    pub fn user_public_key(&self) -> &[u8] {
         match self.user_public_key.as_ref() {
-            Some(v) => &v,
+            Some(v) => v,
             None => &[],
         }
     }
+
     pub fn clear_user_public_key(&mut self) {
-        self.user_public_key.clear();
+        self.user_public_key = ::std::option::Option::None;
     }
 
     pub fn has_user_public_key(&self) -> bool {
@@ -295,14 +337,14 @@
 
     // Param is passed by value, moved
     pub fn set_user_public_key(&mut self, v: ::std::vec::Vec<u8>) {
-        self.user_public_key = ::protobuf::SingularField::some(v);
+        self.user_public_key = ::std::option::Option::Some(v);
     }
 
     // Mutable pointer to the field.
     // If field is not initialized, it is initialized with default value first.
     pub fn mut_user_public_key(&mut self) -> &mut ::std::vec::Vec<u8> {
         if self.user_public_key.is_none() {
-            self.user_public_key.set_default();
+            self.user_public_key = ::std::option::Option::Some(::std::vec::Vec::new());
         }
         self.user_public_key.as_mut().unwrap()
     }
@@ -314,15 +356,15 @@
 
     // optional string device_model = 7;
 
-
-    pub fn get_device_model(&self) -> &str {
+    pub fn device_model(&self) -> &str {
         match self.device_model.as_ref() {
-            Some(v) => &v,
+            Some(v) => v,
             None => "",
         }
     }
+
     pub fn clear_device_model(&mut self) {
-        self.device_model.clear();
+        self.device_model = ::std::option::Option::None;
     }
 
     pub fn has_device_model(&self) -> bool {
@@ -331,14 +373,14 @@
 
     // Param is passed by value, moved
     pub fn set_device_model(&mut self, v: ::std::string::String) {
-        self.device_model = ::protobuf::SingularField::some(v);
+        self.device_model = ::std::option::Option::Some(v);
     }
 
     // Mutable pointer to the field.
     // If field is not initialized, it is initialized with default value first.
     pub fn mut_device_model(&mut self) -> &mut ::std::string::String {
         if self.device_model.is_none() {
-            self.device_model.set_default();
+            self.device_model = ::std::option::Option::Some(::std::string::String::new());
         }
         self.device_model.as_mut().unwrap()
     }
@@ -350,15 +392,15 @@
 
     // optional string locale = 8;
 
-
-    pub fn get_locale(&self) -> &str {
+    pub fn locale(&self) -> &str {
         match self.locale.as_ref() {
-            Some(v) => &v,
+            Some(v) => v,
             None => "",
         }
     }
+
     pub fn clear_locale(&mut self) {
-        self.locale.clear();
+        self.locale = ::std::option::Option::None;
     }
 
     pub fn has_locale(&self) -> bool {
@@ -367,14 +409,14 @@
 
     // Param is passed by value, moved
     pub fn set_locale(&mut self, v: ::std::string::String) {
-        self.locale = ::protobuf::SingularField::some(v);
+        self.locale = ::std::option::Option::Some(v);
     }
 
     // Mutable pointer to the field.
     // If field is not initialized, it is initialized with default value first.
     pub fn mut_locale(&mut self) -> &mut ::std::string::String {
         if self.locale.is_none() {
-            self.locale.set_default();
+            self.locale = ::std::option::Option::Some(::std::string::String::new());
         }
         self.locale.as_mut().unwrap()
     }
@@ -386,15 +428,15 @@
 
     // optional bytes key_handle = 9;
 
-
-    pub fn get_key_handle(&self) -> &[u8] {
+    pub fn key_handle(&self) -> &[u8] {
         match self.key_handle.as_ref() {
-            Some(v) => &v,
+            Some(v) => v,
             None => &[],
         }
     }
+
     pub fn clear_key_handle(&mut self) {
-        self.key_handle.clear();
+        self.key_handle = ::std::option::Option::None;
     }
 
     pub fn has_key_handle(&self) -> bool {
@@ -403,14 +445,14 @@
 
     // Param is passed by value, moved
     pub fn set_key_handle(&mut self, v: ::std::vec::Vec<u8>) {
-        self.key_handle = ::protobuf::SingularField::some(v);
+        self.key_handle = ::std::option::Option::Some(v);
     }
 
     // Mutable pointer to the field.
     // If field is not initialized, it is initialized with default value first.
     pub fn mut_key_handle(&mut self) -> &mut ::std::vec::Vec<u8> {
         if self.key_handle.is_none() {
-            self.key_handle.set_default();
+            self.key_handle = ::std::option::Option::Some(::std::vec::Vec::new());
         }
         self.key_handle.as_mut().unwrap()
     }
@@ -422,10 +464,10 @@
 
     // optional int64 counter = 12;
 
-
-    pub fn get_counter(&self) -> i64 {
+    pub fn counter(&self) -> i64 {
         self.counter.unwrap_or(0i64)
     }
+
     pub fn clear_counter(&mut self) {
         self.counter = ::std::option::Option::None;
     }
@@ -441,15 +483,15 @@
 
     // optional string device_os_version = 13;
 
-
-    pub fn get_device_os_version(&self) -> &str {
+    pub fn device_os_version(&self) -> &str {
         match self.device_os_version.as_ref() {
-            Some(v) => &v,
+            Some(v) => v,
             None => "",
         }
     }
+
     pub fn clear_device_os_version(&mut self) {
-        self.device_os_version.clear();
+        self.device_os_version = ::std::option::Option::None;
     }
 
     pub fn has_device_os_version(&self) -> bool {
@@ -458,14 +500,14 @@
 
     // Param is passed by value, moved
     pub fn set_device_os_version(&mut self, v: ::std::string::String) {
-        self.device_os_version = ::protobuf::SingularField::some(v);
+        self.device_os_version = ::std::option::Option::Some(v);
     }
 
     // Mutable pointer to the field.
     // If field is not initialized, it is initialized with default value first.
     pub fn mut_device_os_version(&mut self) -> &mut ::std::string::String {
         if self.device_os_version.is_none() {
-            self.device_os_version.set_default();
+            self.device_os_version = ::std::option::Option::Some(::std::string::String::new());
         }
         self.device_os_version.as_mut().unwrap()
     }
@@ -477,10 +519,10 @@
 
     // optional int64 device_os_version_code = 14;
 
-
-    pub fn get_device_os_version_code(&self) -> i64 {
+    pub fn device_os_version_code(&self) -> i64 {
         self.device_os_version_code.unwrap_or(0)
     }
+
     pub fn clear_device_os_version_code(&mut self) {
         self.device_os_version_code = ::std::option::Option::None;
     }
@@ -496,15 +538,15 @@
 
     // optional string device_os_release = 15;
 
-
-    pub fn get_device_os_release(&self) -> &str {
+    pub fn device_os_release(&self) -> &str {
         match self.device_os_release.as_ref() {
-            Some(v) => &v,
+            Some(v) => v,
             None => "",
         }
     }
+
     pub fn clear_device_os_release(&mut self) {
-        self.device_os_release.clear();
+        self.device_os_release = ::std::option::Option::None;
     }
 
     pub fn has_device_os_release(&self) -> bool {
@@ -513,14 +555,14 @@
 
     // Param is passed by value, moved
     pub fn set_device_os_release(&mut self, v: ::std::string::String) {
-        self.device_os_release = ::protobuf::SingularField::some(v);
+        self.device_os_release = ::std::option::Option::Some(v);
     }
 
     // Mutable pointer to the field.
     // If field is not initialized, it is initialized with default value first.
     pub fn mut_device_os_release(&mut self) -> &mut ::std::string::String {
         if self.device_os_release.is_none() {
-            self.device_os_release.set_default();
+            self.device_os_release = ::std::option::Option::Some(::std::string::String::new());
         }
         self.device_os_release.as_mut().unwrap()
     }
@@ -532,15 +574,15 @@
 
     // optional string device_os_codename = 16;
 
-
-    pub fn get_device_os_codename(&self) -> &str {
+    pub fn device_os_codename(&self) -> &str {
         match self.device_os_codename.as_ref() {
-            Some(v) => &v,
+            Some(v) => v,
             None => "",
         }
     }
+
     pub fn clear_device_os_codename(&mut self) {
-        self.device_os_codename.clear();
+        self.device_os_codename = ::std::option::Option::None;
     }
 
     pub fn has_device_os_codename(&self) -> bool {
@@ -549,14 +591,14 @@
 
     // Param is passed by value, moved
     pub fn set_device_os_codename(&mut self, v: ::std::string::String) {
-        self.device_os_codename = ::protobuf::SingularField::some(v);
+        self.device_os_codename = ::std::option::Option::Some(v);
     }
 
     // Mutable pointer to the field.
     // If field is not initialized, it is initialized with default value first.
     pub fn mut_device_os_codename(&mut self) -> &mut ::std::string::String {
         if self.device_os_codename.is_none() {
-            self.device_os_codename.set_default();
+            self.device_os_codename = ::std::option::Option::Some(::std::string::String::new());
         }
         self.device_os_codename.as_mut().unwrap()
     }
@@ -568,15 +610,15 @@
 
     // optional string device_software_version = 17;
 
-
-    pub fn get_device_software_version(&self) -> &str {
+    pub fn device_software_version(&self) -> &str {
         match self.device_software_version.as_ref() {
-            Some(v) => &v,
+            Some(v) => v,
             None => "",
         }
     }
+
     pub fn clear_device_software_version(&mut self) {
-        self.device_software_version.clear();
+        self.device_software_version = ::std::option::Option::None;
     }
 
     pub fn has_device_software_version(&self) -> bool {
@@ -585,14 +627,14 @@
 
     // Param is passed by value, moved
     pub fn set_device_software_version(&mut self, v: ::std::string::String) {
-        self.device_software_version = ::protobuf::SingularField::some(v);
+        self.device_software_version = ::std::option::Option::Some(v);
     }
 
     // Mutable pointer to the field.
     // If field is not initialized, it is initialized with default value first.
     pub fn mut_device_software_version(&mut self) -> &mut ::std::string::String {
         if self.device_software_version.is_none() {
-            self.device_software_version.set_default();
+            self.device_software_version = ::std::option::Option::Some(::std::string::String::new());
         }
         self.device_software_version.as_mut().unwrap()
     }
@@ -604,10 +646,10 @@
 
     // optional int64 device_software_version_code = 18;
 
-
-    pub fn get_device_software_version_code(&self) -> i64 {
+    pub fn device_software_version_code(&self) -> i64 {
         self.device_software_version_code.unwrap_or(0)
     }
+
     pub fn clear_device_software_version_code(&mut self) {
         self.device_software_version_code = ::std::option::Option::None;
     }
@@ -623,15 +665,15 @@
 
     // optional string device_software_package = 19;
 
-
-    pub fn get_device_software_package(&self) -> &str {
+    pub fn device_software_package(&self) -> &str {
         match self.device_software_package.as_ref() {
-            Some(v) => &v,
+            Some(v) => v,
             None => "",
         }
     }
+
     pub fn clear_device_software_package(&mut self) {
-        self.device_software_package.clear();
+        self.device_software_package = ::std::option::Option::None;
     }
 
     pub fn has_device_software_package(&self) -> bool {
@@ -640,14 +682,14 @@
 
     // Param is passed by value, moved
     pub fn set_device_software_package(&mut self, v: ::std::string::String) {
-        self.device_software_package = ::protobuf::SingularField::some(v);
+        self.device_software_package = ::std::option::Option::Some(v);
     }
 
     // Mutable pointer to the field.
     // If field is not initialized, it is initialized with default value first.
     pub fn mut_device_software_package(&mut self) -> &mut ::std::string::String {
         if self.device_software_package.is_none() {
-            self.device_software_package.set_default();
+            self.device_software_package = ::std::option::Option::Some(::std::string::String::new());
         }
         self.device_software_package.as_mut().unwrap()
     }
@@ -659,10 +701,10 @@
 
     // optional int32 device_display_diagonal_mils = 22;
 
-
-    pub fn get_device_display_diagonal_mils(&self) -> i32 {
+    pub fn device_display_diagonal_mils(&self) -> i32 {
         self.device_display_diagonal_mils.unwrap_or(0)
     }
+
     pub fn clear_device_display_diagonal_mils(&mut self) {
         self.device_display_diagonal_mils = ::std::option::Option::None;
     }
@@ -678,10 +720,10 @@
 
     // optional int32 device_authzen_version = 24;
 
-
-    pub fn get_device_authzen_version(&self) -> i32 {
+    pub fn device_authzen_version(&self) -> i32 {
         self.device_authzen_version.unwrap_or(0)
     }
+
     pub fn clear_device_authzen_version(&mut self) {
         self.device_authzen_version = ::std::option::Option::None;
     }
@@ -697,15 +739,15 @@
 
     // optional bytes long_device_id = 29;
 
-
-    pub fn get_long_device_id(&self) -> &[u8] {
+    pub fn long_device_id(&self) -> &[u8] {
         match self.long_device_id.as_ref() {
-            Some(v) => &v,
+            Some(v) => v,
             None => &[],
         }
     }
+
     pub fn clear_long_device_id(&mut self) {
-        self.long_device_id.clear();
+        self.long_device_id = ::std::option::Option::None;
     }
 
     pub fn has_long_device_id(&self) -> bool {
@@ -714,14 +756,14 @@
 
     // Param is passed by value, moved
     pub fn set_long_device_id(&mut self, v: ::std::vec::Vec<u8>) {
-        self.long_device_id = ::protobuf::SingularField::some(v);
+        self.long_device_id = ::std::option::Option::Some(v);
     }
 
     // Mutable pointer to the field.
     // If field is not initialized, it is initialized with default value first.
     pub fn mut_long_device_id(&mut self) -> &mut ::std::vec::Vec<u8> {
         if self.long_device_id.is_none() {
-            self.long_device_id.set_default();
+            self.long_device_id = ::std::option::Option::Some(::std::vec::Vec::new());
         }
         self.long_device_id.as_mut().unwrap()
     }
@@ -733,15 +775,15 @@
 
     // optional string device_manufacturer = 31;
 
-
-    pub fn get_device_manufacturer(&self) -> &str {
+    pub fn device_manufacturer(&self) -> &str {
         match self.device_manufacturer.as_ref() {
-            Some(v) => &v,
+            Some(v) => v,
             None => "",
         }
     }
+
     pub fn clear_device_manufacturer(&mut self) {
-        self.device_manufacturer.clear();
+        self.device_manufacturer = ::std::option::Option::None;
     }
 
     pub fn has_device_manufacturer(&self) -> bool {
@@ -750,14 +792,14 @@
 
     // Param is passed by value, moved
     pub fn set_device_manufacturer(&mut self, v: ::std::string::String) {
-        self.device_manufacturer = ::protobuf::SingularField::some(v);
+        self.device_manufacturer = ::std::option::Option::Some(v);
     }
 
     // Mutable pointer to the field.
     // If field is not initialized, it is initialized with default value first.
     pub fn mut_device_manufacturer(&mut self) -> &mut ::std::string::String {
         if self.device_manufacturer.is_none() {
-            self.device_manufacturer.set_default();
+            self.device_manufacturer = ::std::option::Option::Some(::std::string::String::new());
         }
         self.device_manufacturer.as_mut().unwrap()
     }
@@ -769,10 +811,13 @@
 
     // optional .securegcm.DeviceType device_type = 32;
 
-
-    pub fn get_device_type(&self) -> DeviceType {
-        self.device_type.unwrap_or(DeviceType::ANDROID)
+    pub fn device_type(&self) -> DeviceType {
+        match self.device_type {
+            Some(e) => e.enum_value_or(DeviceType::ANDROID),
+            None => DeviceType::ANDROID,
+        }
     }
+
     pub fn clear_device_type(&mut self) {
         self.device_type = ::std::option::Option::None;
     }
@@ -783,15 +828,15 @@
 
     // Param is passed by value, moved
     pub fn set_device_type(&mut self, v: DeviceType) {
-        self.device_type = ::std::option::Option::Some(v);
+        self.device_type = ::std::option::Option::Some(::protobuf::EnumOrUnknown::new(v));
     }
 
     // optional bool using_secure_screenlock = 400;
 
-
-    pub fn get_using_secure_screenlock(&self) -> bool {
+    pub fn using_secure_screenlock(&self) -> bool {
         self.using_secure_screenlock.unwrap_or(false)
     }
+
     pub fn clear_using_secure_screenlock(&mut self) {
         self.using_secure_screenlock = ::std::option::Option::None;
     }
@@ -807,10 +852,10 @@
 
     // optional bool auto_unlock_screenlock_supported = 401;
 
-
-    pub fn get_auto_unlock_screenlock_supported(&self) -> bool {
+    pub fn auto_unlock_screenlock_supported(&self) -> bool {
         self.auto_unlock_screenlock_supported.unwrap_or(false)
     }
+
     pub fn clear_auto_unlock_screenlock_supported(&mut self) {
         self.auto_unlock_screenlock_supported = ::std::option::Option::None;
     }
@@ -826,10 +871,10 @@
 
     // optional bool auto_unlock_screenlock_enabled = 402;
 
-
-    pub fn get_auto_unlock_screenlock_enabled(&self) -> bool {
+    pub fn auto_unlock_screenlock_enabled(&self) -> bool {
         self.auto_unlock_screenlock_enabled.unwrap_or(false)
     }
+
     pub fn clear_auto_unlock_screenlock_enabled(&mut self) {
         self.auto_unlock_screenlock_enabled = ::std::option::Option::None;
     }
@@ -845,10 +890,10 @@
 
     // optional bool bluetooth_radio_supported = 403;
 
-
-    pub fn get_bluetooth_radio_supported(&self) -> bool {
+    pub fn bluetooth_radio_supported(&self) -> bool {
         self.bluetooth_radio_supported.unwrap_or(false)
     }
+
     pub fn clear_bluetooth_radio_supported(&mut self) {
         self.bluetooth_radio_supported = ::std::option::Option::None;
     }
@@ -864,10 +909,10 @@
 
     // optional bool bluetooth_radio_enabled = 404;
 
-
-    pub fn get_bluetooth_radio_enabled(&self) -> bool {
+    pub fn bluetooth_radio_enabled(&self) -> bool {
         self.bluetooth_radio_enabled.unwrap_or(false)
     }
+
     pub fn clear_bluetooth_radio_enabled(&mut self) {
         self.bluetooth_radio_enabled = ::std::option::Option::None;
     }
@@ -883,10 +928,10 @@
 
     // optional bool mobile_data_supported = 405;
 
-
-    pub fn get_mobile_data_supported(&self) -> bool {
+    pub fn mobile_data_supported(&self) -> bool {
         self.mobile_data_supported.unwrap_or(false)
     }
+
     pub fn clear_mobile_data_supported(&mut self) {
         self.mobile_data_supported = ::std::option::Option::None;
     }
@@ -902,10 +947,10 @@
 
     // optional bool tethering_supported = 406;
 
-
-    pub fn get_tethering_supported(&self) -> bool {
+    pub fn tethering_supported(&self) -> bool {
         self.tethering_supported.unwrap_or(false)
     }
+
     pub fn clear_tethering_supported(&mut self) {
         self.tethering_supported = ::std::option::Option::None;
     }
@@ -921,10 +966,10 @@
 
     // optional bool ble_radio_supported = 407;
 
-
-    pub fn get_ble_radio_supported(&self) -> bool {
+    pub fn ble_radio_supported(&self) -> bool {
         self.ble_radio_supported.unwrap_or(false)
     }
+
     pub fn clear_ble_radio_supported(&mut self) {
         self.ble_radio_supported = ::std::option::Option::None;
     }
@@ -940,10 +985,10 @@
 
     // optional bool pixel_experience = 408;
 
-
-    pub fn get_pixel_experience(&self) -> bool {
+    pub fn pixel_experience(&self) -> bool {
         self.pixel_experience.unwrap_or(false)
     }
+
     pub fn clear_pixel_experience(&mut self) {
         self.pixel_experience = ::std::option::Option::None;
     }
@@ -959,10 +1004,10 @@
 
     // optional bool arc_plus_plus = 409;
 
-
-    pub fn get_arc_plus_plus(&self) -> bool {
+    pub fn arc_plus_plus(&self) -> bool {
         self.arc_plus_plus.unwrap_or(false)
     }
+
     pub fn clear_arc_plus_plus(&mut self) {
         self.arc_plus_plus = ::std::option::Option::None;
     }
@@ -978,10 +1023,10 @@
 
     // optional bool is_screenlock_state_flaky = 410;
 
-
-    pub fn get_is_screenlock_state_flaky(&self) -> bool {
+    pub fn is_screenlock_state_flaky(&self) -> bool {
         self.is_screenlock_state_flaky.unwrap_or(false)
     }
+
     pub fn clear_is_screenlock_state_flaky(&mut self) {
         self.is_screenlock_state_flaky = ::std::option::Option::None;
     }
@@ -995,67 +1040,17 @@
         self.is_screenlock_state_flaky = ::std::option::Option::Some(v);
     }
 
-    // repeated .securegcm.SoftwareFeature supported_software_features = 411;
-
-
-    pub fn get_supported_software_features(&self) -> &[SoftwareFeature] {
-        &self.supported_software_features
-    }
-    pub fn clear_supported_software_features(&mut self) {
-        self.supported_software_features.clear();
-    }
-
-    // Param is passed by value, moved
-    pub fn set_supported_software_features(&mut self, v: ::std::vec::Vec<SoftwareFeature>) {
-        self.supported_software_features = v;
-    }
-
-    // Mutable pointer to the field.
-    pub fn mut_supported_software_features(&mut self) -> &mut ::std::vec::Vec<SoftwareFeature> {
-        &mut self.supported_software_features
-    }
-
-    // Take field
-    pub fn take_supported_software_features(&mut self) -> ::std::vec::Vec<SoftwareFeature> {
-        ::std::mem::replace(&mut self.supported_software_features, ::std::vec::Vec::new())
-    }
-
-    // repeated .securegcm.SoftwareFeature enabled_software_features = 412;
-
-
-    pub fn get_enabled_software_features(&self) -> &[SoftwareFeature] {
-        &self.enabled_software_features
-    }
-    pub fn clear_enabled_software_features(&mut self) {
-        self.enabled_software_features.clear();
-    }
-
-    // Param is passed by value, moved
-    pub fn set_enabled_software_features(&mut self, v: ::std::vec::Vec<SoftwareFeature>) {
-        self.enabled_software_features = v;
-    }
-
-    // Mutable pointer to the field.
-    pub fn mut_enabled_software_features(&mut self) -> &mut ::std::vec::Vec<SoftwareFeature> {
-        &mut self.enabled_software_features
-    }
-
-    // Take field
-    pub fn take_enabled_software_features(&mut self) -> ::std::vec::Vec<SoftwareFeature> {
-        ::std::mem::replace(&mut self.enabled_software_features, ::std::vec::Vec::new())
-    }
-
     // optional bytes enrollment_session_id = 1000;
 
-
-    pub fn get_enrollment_session_id(&self) -> &[u8] {
+    pub fn enrollment_session_id(&self) -> &[u8] {
         match self.enrollment_session_id.as_ref() {
-            Some(v) => &v,
+            Some(v) => v,
             None => &[],
         }
     }
+
     pub fn clear_enrollment_session_id(&mut self) {
-        self.enrollment_session_id.clear();
+        self.enrollment_session_id = ::std::option::Option::None;
     }
 
     pub fn has_enrollment_session_id(&self) -> bool {
@@ -1064,14 +1059,14 @@
 
     // Param is passed by value, moved
     pub fn set_enrollment_session_id(&mut self, v: ::std::vec::Vec<u8>) {
-        self.enrollment_session_id = ::protobuf::SingularField::some(v);
+        self.enrollment_session_id = ::std::option::Option::Some(v);
     }
 
     // Mutable pointer to the field.
     // If field is not initialized, it is initialized with default value first.
     pub fn mut_enrollment_session_id(&mut self) -> &mut ::std::vec::Vec<u8> {
         if self.enrollment_session_id.is_none() {
-            self.enrollment_session_id.set_default();
+            self.enrollment_session_id = ::std::option::Option::Some(::std::vec::Vec::new());
         }
         self.enrollment_session_id.as_mut().unwrap()
     }
@@ -1083,15 +1078,15 @@
 
     // optional string oauth_token = 1001;
 
-
-    pub fn get_oauth_token(&self) -> &str {
+    pub fn oauth_token(&self) -> &str {
         match self.oauth_token.as_ref() {
-            Some(v) => &v,
+            Some(v) => v,
             None => "",
         }
     }
+
     pub fn clear_oauth_token(&mut self) {
-        self.oauth_token.clear();
+        self.oauth_token = ::std::option::Option::None;
     }
 
     pub fn has_oauth_token(&self) -> bool {
@@ -1100,14 +1095,14 @@
 
     // Param is passed by value, moved
     pub fn set_oauth_token(&mut self, v: ::std::string::String) {
-        self.oauth_token = ::protobuf::SingularField::some(v);
+        self.oauth_token = ::std::option::Option::Some(v);
     }
 
     // Mutable pointer to the field.
     // If field is not initialized, it is initialized with default value first.
     pub fn mut_oauth_token(&mut self) -> &mut ::std::string::String {
         if self.oauth_token.is_none() {
-            self.oauth_token.set_default();
+            self.oauth_token = ::std::option::Option::Some(::std::string::String::new());
         }
         self.oauth_token.as_mut().unwrap()
     }
@@ -1119,6 +1114,8 @@
 }
 
 impl ::protobuf::Message for GcmDeviceInfo {
+    const NAME: &'static str = "GcmDeviceInfo";
+
     fn is_initialized(&self) -> bool {
         if self.user_public_key.is_none() {
             return false;
@@ -1126,198 +1123,131 @@
         true
     }
 
-    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::ProtobufResult<()> {
-        while !is.eof()? {
-            let (field_number, wire_type) = is.read_tag_unpack()?;
-            match field_number {
-                1 => {
-                    if wire_type != ::protobuf::wire_format::WireTypeFixed64 {
-                        return ::std::result::Result::Err(::protobuf::rt::unexpected_wire_type(wire_type));
-                    }
-                    let tmp = is.read_fixed64()?;
-                    self.android_device_id = ::std::option::Option::Some(tmp);
-                },
-                102 => {
-                    ::protobuf::rt::read_singular_bytes_into(wire_type, is, &mut self.gcm_registration_id)?;
-                },
-                202 => {
-                    ::protobuf::rt::read_singular_bytes_into(wire_type, is, &mut self.apn_registration_id)?;
-                },
-                203 => {
-                    if wire_type != ::protobuf::wire_format::WireTypeVarint {
-                        return ::std::result::Result::Err(::protobuf::rt::unexpected_wire_type(wire_type));
-                    }
-                    let tmp = is.read_bool()?;
-                    self.notification_enabled = ::std::option::Option::Some(tmp);
-                },
-                302 => {
-                    ::protobuf::rt::read_singular_string_into(wire_type, is, &mut self.bluetooth_mac_address)?;
-                },
-                103 => {
-                    ::protobuf::rt::read_singular_bytes_into(wire_type, is, &mut self.device_master_key_hash)?;
-                },
-                4 => {
-                    ::protobuf::rt::read_singular_bytes_into(wire_type, is, &mut self.user_public_key)?;
-                },
-                7 => {
-                    ::protobuf::rt::read_singular_string_into(wire_type, is, &mut self.device_model)?;
-                },
-                8 => {
-                    ::protobuf::rt::read_singular_string_into(wire_type, is, &mut self.locale)?;
-                },
+    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {
+        while let Some(tag) = is.read_raw_tag_or_eof()? {
+            match tag {
                 9 => {
-                    ::protobuf::rt::read_singular_bytes_into(wire_type, is, &mut self.key_handle)?;
+                    self.android_device_id = ::std::option::Option::Some(is.read_fixed64()?);
                 },
-                12 => {
-                    if wire_type != ::protobuf::wire_format::WireTypeVarint {
-                        return ::std::result::Result::Err(::protobuf::rt::unexpected_wire_type(wire_type));
-                    }
-                    let tmp = is.read_int64()?;
-                    self.counter = ::std::option::Option::Some(tmp);
+                818 => {
+                    self.gcm_registration_id = ::std::option::Option::Some(is.read_bytes()?);
                 },
-                13 => {
-                    ::protobuf::rt::read_singular_string_into(wire_type, is, &mut self.device_os_version)?;
+                1618 => {
+                    self.apn_registration_id = ::std::option::Option::Some(is.read_bytes()?);
                 },
-                14 => {
-                    if wire_type != ::protobuf::wire_format::WireTypeVarint {
-                        return ::std::result::Result::Err(::protobuf::rt::unexpected_wire_type(wire_type));
-                    }
-                    let tmp = is.read_int64()?;
-                    self.device_os_version_code = ::std::option::Option::Some(tmp);
+                1624 => {
+                    self.notification_enabled = ::std::option::Option::Some(is.read_bool()?);
                 },
-                15 => {
-                    ::protobuf::rt::read_singular_string_into(wire_type, is, &mut self.device_os_release)?;
+                2418 => {
+                    self.bluetooth_mac_address = ::std::option::Option::Some(is.read_string()?);
                 },
-                16 => {
-                    ::protobuf::rt::read_singular_string_into(wire_type, is, &mut self.device_os_codename)?;
+                826 => {
+                    self.device_master_key_hash = ::std::option::Option::Some(is.read_bytes()?);
                 },
-                17 => {
-                    ::protobuf::rt::read_singular_string_into(wire_type, is, &mut self.device_software_version)?;
+                34 => {
+                    self.user_public_key = ::std::option::Option::Some(is.read_bytes()?);
                 },
-                18 => {
-                    if wire_type != ::protobuf::wire_format::WireTypeVarint {
-                        return ::std::result::Result::Err(::protobuf::rt::unexpected_wire_type(wire_type));
-                    }
-                    let tmp = is.read_int64()?;
-                    self.device_software_version_code = ::std::option::Option::Some(tmp);
+                58 => {
+                    self.device_model = ::std::option::Option::Some(is.read_string()?);
                 },
-                19 => {
-                    ::protobuf::rt::read_singular_string_into(wire_type, is, &mut self.device_software_package)?;
+                66 => {
+                    self.locale = ::std::option::Option::Some(is.read_string()?);
                 },
-                22 => {
-                    if wire_type != ::protobuf::wire_format::WireTypeVarint {
-                        return ::std::result::Result::Err(::protobuf::rt::unexpected_wire_type(wire_type));
-                    }
-                    let tmp = is.read_int32()?;
-                    self.device_display_diagonal_mils = ::std::option::Option::Some(tmp);
+                74 => {
+                    self.key_handle = ::std::option::Option::Some(is.read_bytes()?);
                 },
-                24 => {
-                    if wire_type != ::protobuf::wire_format::WireTypeVarint {
-                        return ::std::result::Result::Err(::protobuf::rt::unexpected_wire_type(wire_type));
-                    }
-                    let tmp = is.read_int32()?;
-                    self.device_authzen_version = ::std::option::Option::Some(tmp);
+                96 => {
+                    self.counter = ::std::option::Option::Some(is.read_int64()?);
                 },
-                29 => {
-                    ::protobuf::rt::read_singular_bytes_into(wire_type, is, &mut self.long_device_id)?;
+                106 => {
+                    self.device_os_version = ::std::option::Option::Some(is.read_string()?);
                 },
-                31 => {
-                    ::protobuf::rt::read_singular_string_into(wire_type, is, &mut self.device_manufacturer)?;
+                112 => {
+                    self.device_os_version_code = ::std::option::Option::Some(is.read_int64()?);
                 },
-                32 => {
-                    ::protobuf::rt::read_proto2_enum_with_unknown_fields_into(wire_type, is, &mut self.device_type, 32, &mut self.unknown_fields)?
+                122 => {
+                    self.device_os_release = ::std::option::Option::Some(is.read_string()?);
                 },
-                400 => {
-                    if wire_type != ::protobuf::wire_format::WireTypeVarint {
-                        return ::std::result::Result::Err(::protobuf::rt::unexpected_wire_type(wire_type));
-                    }
-                    let tmp = is.read_bool()?;
-                    self.using_secure_screenlock = ::std::option::Option::Some(tmp);
+                130 => {
+                    self.device_os_codename = ::std::option::Option::Some(is.read_string()?);
                 },
-                401 => {
-                    if wire_type != ::protobuf::wire_format::WireTypeVarint {
-                        return ::std::result::Result::Err(::protobuf::rt::unexpected_wire_type(wire_type));
-                    }
-                    let tmp = is.read_bool()?;
-                    self.auto_unlock_screenlock_supported = ::std::option::Option::Some(tmp);
+                138 => {
+                    self.device_software_version = ::std::option::Option::Some(is.read_string()?);
                 },
-                402 => {
-                    if wire_type != ::protobuf::wire_format::WireTypeVarint {
-                        return ::std::result::Result::Err(::protobuf::rt::unexpected_wire_type(wire_type));
-                    }
-                    let tmp = is.read_bool()?;
-                    self.auto_unlock_screenlock_enabled = ::std::option::Option::Some(tmp);
+                144 => {
+                    self.device_software_version_code = ::std::option::Option::Some(is.read_int64()?);
                 },
-                403 => {
-                    if wire_type != ::protobuf::wire_format::WireTypeVarint {
-                        return ::std::result::Result::Err(::protobuf::rt::unexpected_wire_type(wire_type));
-                    }
-                    let tmp = is.read_bool()?;
-                    self.bluetooth_radio_supported = ::std::option::Option::Some(tmp);
+                154 => {
+                    self.device_software_package = ::std::option::Option::Some(is.read_string()?);
                 },
-                404 => {
-                    if wire_type != ::protobuf::wire_format::WireTypeVarint {
-                        return ::std::result::Result::Err(::protobuf::rt::unexpected_wire_type(wire_type));
-                    }
-                    let tmp = is.read_bool()?;
-                    self.bluetooth_radio_enabled = ::std::option::Option::Some(tmp);
+                176 => {
+                    self.device_display_diagonal_mils = ::std::option::Option::Some(is.read_int32()?);
                 },
-                405 => {
-                    if wire_type != ::protobuf::wire_format::WireTypeVarint {
-                        return ::std::result::Result::Err(::protobuf::rt::unexpected_wire_type(wire_type));
-                    }
-                    let tmp = is.read_bool()?;
-                    self.mobile_data_supported = ::std::option::Option::Some(tmp);
+                192 => {
+                    self.device_authzen_version = ::std::option::Option::Some(is.read_int32()?);
                 },
-                406 => {
-                    if wire_type != ::protobuf::wire_format::WireTypeVarint {
-                        return ::std::result::Result::Err(::protobuf::rt::unexpected_wire_type(wire_type));
-                    }
-                    let tmp = is.read_bool()?;
-                    self.tethering_supported = ::std::option::Option::Some(tmp);
+                234 => {
+                    self.long_device_id = ::std::option::Option::Some(is.read_bytes()?);
                 },
-                407 => {
-                    if wire_type != ::protobuf::wire_format::WireTypeVarint {
-                        return ::std::result::Result::Err(::protobuf::rt::unexpected_wire_type(wire_type));
-                    }
-                    let tmp = is.read_bool()?;
-                    self.ble_radio_supported = ::std::option::Option::Some(tmp);
+                250 => {
+                    self.device_manufacturer = ::std::option::Option::Some(is.read_string()?);
                 },
-                408 => {
-                    if wire_type != ::protobuf::wire_format::WireTypeVarint {
-                        return ::std::result::Result::Err(::protobuf::rt::unexpected_wire_type(wire_type));
-                    }
-                    let tmp = is.read_bool()?;
-                    self.pixel_experience = ::std::option::Option::Some(tmp);
+                256 => {
+                    self.device_type = ::std::option::Option::Some(is.read_enum_or_unknown()?);
                 },
-                409 => {
-                    if wire_type != ::protobuf::wire_format::WireTypeVarint {
-                        return ::std::result::Result::Err(::protobuf::rt::unexpected_wire_type(wire_type));
-                    }
-                    let tmp = is.read_bool()?;
-                    self.arc_plus_plus = ::std::option::Option::Some(tmp);
+                3200 => {
+                    self.using_secure_screenlock = ::std::option::Option::Some(is.read_bool()?);
                 },
-                410 => {
-                    if wire_type != ::protobuf::wire_format::WireTypeVarint {
-                        return ::std::result::Result::Err(::protobuf::rt::unexpected_wire_type(wire_type));
-                    }
-                    let tmp = is.read_bool()?;
-                    self.is_screenlock_state_flaky = ::std::option::Option::Some(tmp);
+                3208 => {
+                    self.auto_unlock_screenlock_supported = ::std::option::Option::Some(is.read_bool()?);
                 },
-                411 => {
-                    ::protobuf::rt::read_repeated_enum_with_unknown_fields_into(wire_type, is, &mut self.supported_software_features, 411, &mut self.unknown_fields)?
+                3216 => {
+                    self.auto_unlock_screenlock_enabled = ::std::option::Option::Some(is.read_bool()?);
                 },
-                412 => {
-                    ::protobuf::rt::read_repeated_enum_with_unknown_fields_into(wire_type, is, &mut self.enabled_software_features, 412, &mut self.unknown_fields)?
+                3224 => {
+                    self.bluetooth_radio_supported = ::std::option::Option::Some(is.read_bool()?);
                 },
-                1000 => {
-                    ::protobuf::rt::read_singular_bytes_into(wire_type, is, &mut self.enrollment_session_id)?;
+                3232 => {
+                    self.bluetooth_radio_enabled = ::std::option::Option::Some(is.read_bool()?);
                 },
-                1001 => {
-                    ::protobuf::rt::read_singular_string_into(wire_type, is, &mut self.oauth_token)?;
+                3240 => {
+                    self.mobile_data_supported = ::std::option::Option::Some(is.read_bool()?);
                 },
-                _ => {
-                    ::protobuf::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?;
+                3248 => {
+                    self.tethering_supported = ::std::option::Option::Some(is.read_bool()?);
+                },
+                3256 => {
+                    self.ble_radio_supported = ::std::option::Option::Some(is.read_bool()?);
+                },
+                3264 => {
+                    self.pixel_experience = ::std::option::Option::Some(is.read_bool()?);
+                },
+                3272 => {
+                    self.arc_plus_plus = ::std::option::Option::Some(is.read_bool()?);
+                },
+                3280 => {
+                    self.is_screenlock_state_flaky = ::std::option::Option::Some(is.read_bool()?);
+                },
+                3288 => {
+                    self.supported_software_features.push(is.read_enum_or_unknown()?);
+                },
+                3290 => {
+                    ::protobuf::rt::read_repeated_packed_enum_or_unknown_into(is, &mut self.supported_software_features)?
+                },
+                3296 => {
+                    self.enabled_software_features.push(is.read_enum_or_unknown()?);
+                },
+                3298 => {
+                    ::protobuf::rt::read_repeated_packed_enum_or_unknown_into(is, &mut self.enabled_software_features)?
+                },
+                8002 => {
+                    self.enrollment_session_id = ::std::option::Option::Some(is.read_bytes()?);
+                },
+                8010 => {
+                    self.oauth_token = ::std::option::Option::Some(is.read_string()?);
+                },
+                tag => {
+                    ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;
                 },
             };
         }
@@ -1326,181 +1256,181 @@
 
     // Compute sizes of nested messages
     #[allow(unused_variables)]
-    fn compute_size(&self) -> u32 {
+    fn compute_size(&self) -> u64 {
         let mut my_size = 0;
         if let Some(v) = self.android_device_id {
-            my_size += 9;
+            my_size += 1 + 8;
         }
-        if let Some(ref v) = self.gcm_registration_id.as_ref() {
+        if let Some(v) = self.gcm_registration_id.as_ref() {
             my_size += ::protobuf::rt::bytes_size(102, &v);
         }
-        if let Some(ref v) = self.apn_registration_id.as_ref() {
+        if let Some(v) = self.apn_registration_id.as_ref() {
             my_size += ::protobuf::rt::bytes_size(202, &v);
         }
         if let Some(v) = self.notification_enabled {
-            my_size += 3;
+            my_size += 2 + 1;
         }
-        if let Some(ref v) = self.bluetooth_mac_address.as_ref() {
+        if let Some(v) = self.bluetooth_mac_address.as_ref() {
             my_size += ::protobuf::rt::string_size(302, &v);
         }
-        if let Some(ref v) = self.device_master_key_hash.as_ref() {
+        if let Some(v) = self.device_master_key_hash.as_ref() {
             my_size += ::protobuf::rt::bytes_size(103, &v);
         }
-        if let Some(ref v) = self.user_public_key.as_ref() {
+        if let Some(v) = self.user_public_key.as_ref() {
             my_size += ::protobuf::rt::bytes_size(4, &v);
         }
-        if let Some(ref v) = self.device_model.as_ref() {
+        if let Some(v) = self.device_model.as_ref() {
             my_size += ::protobuf::rt::string_size(7, &v);
         }
-        if let Some(ref v) = self.locale.as_ref() {
+        if let Some(v) = self.locale.as_ref() {
             my_size += ::protobuf::rt::string_size(8, &v);
         }
-        if let Some(ref v) = self.key_handle.as_ref() {
+        if let Some(v) = self.key_handle.as_ref() {
             my_size += ::protobuf::rt::bytes_size(9, &v);
         }
         if let Some(v) = self.counter {
-            my_size += ::protobuf::rt::value_size(12, v, ::protobuf::wire_format::WireTypeVarint);
+            my_size += ::protobuf::rt::int64_size(12, v);
         }
-        if let Some(ref v) = self.device_os_version.as_ref() {
+        if let Some(v) = self.device_os_version.as_ref() {
             my_size += ::protobuf::rt::string_size(13, &v);
         }
         if let Some(v) = self.device_os_version_code {
-            my_size += ::protobuf::rt::value_size(14, v, ::protobuf::wire_format::WireTypeVarint);
+            my_size += ::protobuf::rt::int64_size(14, v);
         }
-        if let Some(ref v) = self.device_os_release.as_ref() {
+        if let Some(v) = self.device_os_release.as_ref() {
             my_size += ::protobuf::rt::string_size(15, &v);
         }
-        if let Some(ref v) = self.device_os_codename.as_ref() {
+        if let Some(v) = self.device_os_codename.as_ref() {
             my_size += ::protobuf::rt::string_size(16, &v);
         }
-        if let Some(ref v) = self.device_software_version.as_ref() {
+        if let Some(v) = self.device_software_version.as_ref() {
             my_size += ::protobuf::rt::string_size(17, &v);
         }
         if let Some(v) = self.device_software_version_code {
-            my_size += ::protobuf::rt::value_size(18, v, ::protobuf::wire_format::WireTypeVarint);
+            my_size += ::protobuf::rt::int64_size(18, v);
         }
-        if let Some(ref v) = self.device_software_package.as_ref() {
+        if let Some(v) = self.device_software_package.as_ref() {
             my_size += ::protobuf::rt::string_size(19, &v);
         }
         if let Some(v) = self.device_display_diagonal_mils {
-            my_size += ::protobuf::rt::value_size(22, v, ::protobuf::wire_format::WireTypeVarint);
+            my_size += ::protobuf::rt::int32_size(22, v);
         }
         if let Some(v) = self.device_authzen_version {
-            my_size += ::protobuf::rt::value_size(24, v, ::protobuf::wire_format::WireTypeVarint);
+            my_size += ::protobuf::rt::int32_size(24, v);
         }
-        if let Some(ref v) = self.long_device_id.as_ref() {
+        if let Some(v) = self.long_device_id.as_ref() {
             my_size += ::protobuf::rt::bytes_size(29, &v);
         }
-        if let Some(ref v) = self.device_manufacturer.as_ref() {
+        if let Some(v) = self.device_manufacturer.as_ref() {
             my_size += ::protobuf::rt::string_size(31, &v);
         }
         if let Some(v) = self.device_type {
-            my_size += ::protobuf::rt::enum_size(32, v);
+            my_size += ::protobuf::rt::int32_size(32, v.value());
         }
         if let Some(v) = self.using_secure_screenlock {
-            my_size += 3;
+            my_size += 2 + 1;
         }
         if let Some(v) = self.auto_unlock_screenlock_supported {
-            my_size += 3;
+            my_size += 2 + 1;
         }
         if let Some(v) = self.auto_unlock_screenlock_enabled {
-            my_size += 3;
+            my_size += 2 + 1;
         }
         if let Some(v) = self.bluetooth_radio_supported {
-            my_size += 3;
+            my_size += 2 + 1;
         }
         if let Some(v) = self.bluetooth_radio_enabled {
-            my_size += 3;
+            my_size += 2 + 1;
         }
         if let Some(v) = self.mobile_data_supported {
-            my_size += 3;
+            my_size += 2 + 1;
         }
         if let Some(v) = self.tethering_supported {
-            my_size += 3;
+            my_size += 2 + 1;
         }
         if let Some(v) = self.ble_radio_supported {
-            my_size += 3;
+            my_size += 2 + 1;
         }
         if let Some(v) = self.pixel_experience {
-            my_size += 3;
+            my_size += 2 + 1;
         }
         if let Some(v) = self.arc_plus_plus {
-            my_size += 3;
+            my_size += 2 + 1;
         }
         if let Some(v) = self.is_screenlock_state_flaky {
-            my_size += 3;
+            my_size += 2 + 1;
         }
         for value in &self.supported_software_features {
-            my_size += ::protobuf::rt::enum_size(411, *value);
+            my_size += ::protobuf::rt::int32_size(411, value.value());
         };
         for value in &self.enabled_software_features {
-            my_size += ::protobuf::rt::enum_size(412, *value);
+            my_size += ::protobuf::rt::int32_size(412, value.value());
         };
-        if let Some(ref v) = self.enrollment_session_id.as_ref() {
+        if let Some(v) = self.enrollment_session_id.as_ref() {
             my_size += ::protobuf::rt::bytes_size(1000, &v);
         }
-        if let Some(ref v) = self.oauth_token.as_ref() {
+        if let Some(v) = self.oauth_token.as_ref() {
             my_size += ::protobuf::rt::string_size(1001, &v);
         }
-        my_size += ::protobuf::rt::unknown_fields_size(self.get_unknown_fields());
-        self.cached_size.set(my_size);
+        my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());
+        self.special_fields.cached_size().set(my_size as u32);
         my_size
     }
 
-    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::ProtobufResult<()> {
+    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {
         if let Some(v) = self.android_device_id {
             os.write_fixed64(1, v)?;
         }
-        if let Some(ref v) = self.gcm_registration_id.as_ref() {
-            os.write_bytes(102, &v)?;
+        if let Some(v) = self.gcm_registration_id.as_ref() {
+            os.write_bytes(102, v)?;
         }
-        if let Some(ref v) = self.apn_registration_id.as_ref() {
-            os.write_bytes(202, &v)?;
+        if let Some(v) = self.apn_registration_id.as_ref() {
+            os.write_bytes(202, v)?;
         }
         if let Some(v) = self.notification_enabled {
             os.write_bool(203, v)?;
         }
-        if let Some(ref v) = self.bluetooth_mac_address.as_ref() {
-            os.write_string(302, &v)?;
+        if let Some(v) = self.bluetooth_mac_address.as_ref() {
+            os.write_string(302, v)?;
         }
-        if let Some(ref v) = self.device_master_key_hash.as_ref() {
-            os.write_bytes(103, &v)?;
+        if let Some(v) = self.device_master_key_hash.as_ref() {
+            os.write_bytes(103, v)?;
         }
-        if let Some(ref v) = self.user_public_key.as_ref() {
-            os.write_bytes(4, &v)?;
+        if let Some(v) = self.user_public_key.as_ref() {
+            os.write_bytes(4, v)?;
         }
-        if let Some(ref v) = self.device_model.as_ref() {
-            os.write_string(7, &v)?;
+        if let Some(v) = self.device_model.as_ref() {
+            os.write_string(7, v)?;
         }
-        if let Some(ref v) = self.locale.as_ref() {
-            os.write_string(8, &v)?;
+        if let Some(v) = self.locale.as_ref() {
+            os.write_string(8, v)?;
         }
-        if let Some(ref v) = self.key_handle.as_ref() {
-            os.write_bytes(9, &v)?;
+        if let Some(v) = self.key_handle.as_ref() {
+            os.write_bytes(9, v)?;
         }
         if let Some(v) = self.counter {
             os.write_int64(12, v)?;
         }
-        if let Some(ref v) = self.device_os_version.as_ref() {
-            os.write_string(13, &v)?;
+        if let Some(v) = self.device_os_version.as_ref() {
+            os.write_string(13, v)?;
         }
         if let Some(v) = self.device_os_version_code {
             os.write_int64(14, v)?;
         }
-        if let Some(ref v) = self.device_os_release.as_ref() {
-            os.write_string(15, &v)?;
+        if let Some(v) = self.device_os_release.as_ref() {
+            os.write_string(15, v)?;
         }
-        if let Some(ref v) = self.device_os_codename.as_ref() {
-            os.write_string(16, &v)?;
+        if let Some(v) = self.device_os_codename.as_ref() {
+            os.write_string(16, v)?;
         }
-        if let Some(ref v) = self.device_software_version.as_ref() {
-            os.write_string(17, &v)?;
+        if let Some(v) = self.device_software_version.as_ref() {
+            os.write_string(17, v)?;
         }
         if let Some(v) = self.device_software_version_code {
             os.write_int64(18, v)?;
         }
-        if let Some(ref v) = self.device_software_package.as_ref() {
-            os.write_string(19, &v)?;
+        if let Some(v) = self.device_software_package.as_ref() {
+            os.write_string(19, v)?;
         }
         if let Some(v) = self.device_display_diagonal_mils {
             os.write_int32(22, v)?;
@@ -1508,14 +1438,14 @@
         if let Some(v) = self.device_authzen_version {
             os.write_int32(24, v)?;
         }
-        if let Some(ref v) = self.long_device_id.as_ref() {
-            os.write_bytes(29, &v)?;
+        if let Some(v) = self.long_device_id.as_ref() {
+            os.write_bytes(29, v)?;
         }
-        if let Some(ref v) = self.device_manufacturer.as_ref() {
-            os.write_string(31, &v)?;
+        if let Some(v) = self.device_manufacturer.as_ref() {
+            os.write_string(31, v)?;
         }
         if let Some(v) = self.device_type {
-            os.write_enum(32, ::protobuf::ProtobufEnum::value(&v))?;
+            os.write_enum(32, ::protobuf::EnumOrUnknown::value(&v))?;
         }
         if let Some(v) = self.using_secure_screenlock {
             os.write_bool(400, v)?;
@@ -1551,81 +1481,56 @@
             os.write_bool(410, v)?;
         }
         for v in &self.supported_software_features {
-            os.write_enum(411, ::protobuf::ProtobufEnum::value(v))?;
+            os.write_enum(411, ::protobuf::EnumOrUnknown::value(v))?;
         };
         for v in &self.enabled_software_features {
-            os.write_enum(412, ::protobuf::ProtobufEnum::value(v))?;
+            os.write_enum(412, ::protobuf::EnumOrUnknown::value(v))?;
         };
-        if let Some(ref v) = self.enrollment_session_id.as_ref() {
-            os.write_bytes(1000, &v)?;
+        if let Some(v) = self.enrollment_session_id.as_ref() {
+            os.write_bytes(1000, v)?;
         }
-        if let Some(ref v) = self.oauth_token.as_ref() {
-            os.write_string(1001, &v)?;
+        if let Some(v) = self.oauth_token.as_ref() {
+            os.write_string(1001, v)?;
         }
-        os.write_unknown_fields(self.get_unknown_fields())?;
+        os.write_unknown_fields(self.special_fields.unknown_fields())?;
         ::std::result::Result::Ok(())
     }
 
-    fn get_cached_size(&self) -> u32 {
-        self.cached_size.get()
+    fn special_fields(&self) -> &::protobuf::SpecialFields {
+        &self.special_fields
     }
 
-    fn get_unknown_fields(&self) -> &::protobuf::UnknownFields {
-        &self.unknown_fields
-    }
-
-    fn mut_unknown_fields(&mut self) -> &mut ::protobuf::UnknownFields {
-        &mut self.unknown_fields
-    }
-
-    fn as_any(&self) -> &dyn (::std::any::Any) {
-        self as &dyn (::std::any::Any)
-    }
-    fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) {
-        self as &mut dyn (::std::any::Any)
-    }
-    fn into_any(self: ::std::boxed::Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
-        self
-    }
-
-    fn descriptor(&self) -> &'static ::protobuf::reflect::MessageDescriptor {
-        Self::descriptor_static()
+    fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {
+        &mut self.special_fields
     }
 
     fn new() -> GcmDeviceInfo {
         GcmDeviceInfo::new()
     }
 
-    fn default_instance() -> &'static GcmDeviceInfo {
-        static instance: ::protobuf::rt::LazyV2<GcmDeviceInfo> = ::protobuf::rt::LazyV2::INIT;
-        instance.get(GcmDeviceInfo::new)
-    }
-}
-
-impl ::protobuf::Clear for GcmDeviceInfo {
     fn clear(&mut self) {
         self.android_device_id = ::std::option::Option::None;
-        self.gcm_registration_id.clear();
-        self.apn_registration_id.clear();
+        self.gcm_registration_id = ::std::option::Option::None;
+        self.apn_registration_id = ::std::option::Option::None;
         self.notification_enabled = ::std::option::Option::None;
-        self.bluetooth_mac_address.clear();
-        self.device_master_key_hash.clear();
-        self.user_public_key.clear();
-        self.device_model.clear();
-        self.locale.clear();
-        self.key_handle.clear();
+        self.bluetooth_mac_address = ::std::option::Option::None;
+        self.device_master_key_hash = ::std::option::Option::None;
+        self.user_public_key = ::std::option::Option::None;
+        self.device_model = ::std::option::Option::None;
+        self.locale = ::std::option::Option::None;
+        self.key_handle = ::std::option::Option::None;
         self.counter = ::std::option::Option::None;
-        self.device_os_version.clear();
+        self.device_os_version = ::std::option::Option::None;
         self.device_os_version_code = ::std::option::Option::None;
-        self.device_os_release.clear();
-        self.device_os_codename.clear();
-        self.device_software_version.clear();
+        self.device_os_release = ::std::option::Option::None;
+        self.device_os_codename = ::std::option::Option::None;
+        self.device_software_version = ::std::option::Option::None;
         self.device_software_version_code = ::std::option::Option::None;
-        self.device_software_package.clear();
+        self.device_software_package = ::std::option::Option::None;
         self.device_display_diagonal_mils = ::std::option::Option::None;
         self.device_authzen_version = ::std::option::Option::None;
-        self.long_device_id.clear();
-        self.device_manufacturer.clear();
+        self.long_device_id = ::std::option::Option::None;
+        self.device_manufacturer = ::std::option::Option::None;
         self.device_type = ::std::option::Option::None;
         self.using_secure_screenlock = ::std::option::Option::None;
         self.auto_unlock_screenlock_supported = ::std::option::Option::None;
@@ -1640,26 +1545,68 @@
         self.is_screenlock_state_flaky = ::std::option::Option::None;
         self.supported_software_features.clear();
         self.enabled_software_features.clear();
-        self.enrollment_session_id.clear();
-        self.oauth_token.clear();
-        self.unknown_fields.clear();
+        self.enrollment_session_id = ::std::option::Option::None;
+        self.oauth_token = ::std::option::Option::None;
+        self.special_fields.clear();
     }
-}
 
-impl ::protobuf::reflect::ProtobufValue for GcmDeviceInfo {
-    fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef {
-        ::protobuf::reflect::ReflectValueRef::Message(self)
+    fn default_instance() -> &'static GcmDeviceInfo {
+        static instance: GcmDeviceInfo = GcmDeviceInfo {
+            android_device_id: ::std::option::Option::None,
+            gcm_registration_id: ::std::option::Option::None,
+            apn_registration_id: ::std::option::Option::None,
+            notification_enabled: ::std::option::Option::None,
+            bluetooth_mac_address: ::std::option::Option::None,
+            device_master_key_hash: ::std::option::Option::None,
+            user_public_key: ::std::option::Option::None,
+            device_model: ::std::option::Option::None,
+            locale: ::std::option::Option::None,
+            key_handle: ::std::option::Option::None,
+            counter: ::std::option::Option::None,
+            device_os_version: ::std::option::Option::None,
+            device_os_version_code: ::std::option::Option::None,
+            device_os_release: ::std::option::Option::None,
+            device_os_codename: ::std::option::Option::None,
+            device_software_version: ::std::option::Option::None,
+            device_software_version_code: ::std::option::Option::None,
+            device_software_package: ::std::option::Option::None,
+            device_display_diagonal_mils: ::std::option::Option::None,
+            device_authzen_version: ::std::option::Option::None,
+            long_device_id: ::std::option::Option::None,
+            device_manufacturer: ::std::option::Option::None,
+            device_type: ::std::option::Option::None,
+            using_secure_screenlock: ::std::option::Option::None,
+            auto_unlock_screenlock_supported: ::std::option::Option::None,
+            auto_unlock_screenlock_enabled: ::std::option::Option::None,
+            bluetooth_radio_supported: ::std::option::Option::None,
+            bluetooth_radio_enabled: ::std::option::Option::None,
+            mobile_data_supported: ::std::option::Option::None,
+            tethering_supported: ::std::option::Option::None,
+            ble_radio_supported: ::std::option::Option::None,
+            pixel_experience: ::std::option::Option::None,
+            arc_plus_plus: ::std::option::Option::None,
+            is_screenlock_state_flaky: ::std::option::Option::None,
+            supported_software_features: ::std::vec::Vec::new(),
+            enabled_software_features: ::std::vec::Vec::new(),
+            enrollment_session_id: ::std::option::Option::None,
+            oauth_token: ::std::option::Option::None,
+            special_fields: ::protobuf::SpecialFields::new(),
+        };
+        &instance
     }
 }
 
 #[derive(PartialEq,Clone,Default,Debug)]
+// @@protoc_insertion_point(message:securegcm.GcmMetadata)
 pub struct GcmMetadata {
     // message fields
-    field_type: ::std::option::Option<Type>,
-    version: ::std::option::Option<i32>,
+    // @@protoc_insertion_point(field:securegcm.GcmMetadata.type)
+    pub type_: ::std::option::Option<::protobuf::EnumOrUnknown<Type>>,
+    // @@protoc_insertion_point(field:securegcm.GcmMetadata.version)
+    pub version: ::std::option::Option<i32>,
     // special fields
-    pub unknown_fields: ::protobuf::UnknownFields,
-    pub cached_size: ::protobuf::CachedSize,
+    // @@protoc_insertion_point(special_field:securegcm.GcmMetadata.special_fields)
+    pub special_fields: ::protobuf::SpecialFields,
 }
 
 impl<'a> ::std::default::Default for &'a GcmMetadata {
@@ -1675,29 +1622,32 @@
 
     // required .securegcm.Type type = 1;
 
-
-    pub fn get_field_type(&self) -> Type {
-        self.field_type.unwrap_or(Type::ENROLLMENT)
-    }
-    pub fn clear_field_type(&mut self) {
-        self.field_type = ::std::option::Option::None;
+    pub fn type_(&self) -> Type {
+        match self.type_ {
+            Some(e) => e.enum_value_or(Type::ENROLLMENT),
+            None => Type::ENROLLMENT,
+        }
     }
 
-    pub fn has_field_type(&self) -> bool {
-        self.field_type.is_some()
+    pub fn clear_type_(&mut self) {
+        self.type_ = ::std::option::Option::None;
+    }
+
+    pub fn has_type(&self) -> bool {
+        self.type_.is_some()
     }
 
     // Param is passed by value, moved
-    pub fn set_field_type(&mut self, v: Type) {
-        self.field_type = ::std::option::Option::Some(v);
+    pub fn set_type(&mut self, v: Type) {
+        self.type_ = ::std::option::Option::Some(::protobuf::EnumOrUnknown::new(v));
     }
 
     // optional int32 version = 2;
 
-
-    pub fn get_version(&self) -> i32 {
+    pub fn version(&self) -> i32 {
         self.version.unwrap_or(0i32)
     }
+
     pub fn clear_version(&mut self) {
         self.version = ::std::option::Option::None;
     }
@@ -1713,29 +1663,26 @@
 }
 
 impl ::protobuf::Message for GcmMetadata {
+    const NAME: &'static str = "GcmMetadata";
+
     fn is_initialized(&self) -> bool {
-        if self.field_type.is_none() {
+        if self.type_.is_none() {
             return false;
         }
         true
     }
 
-    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::ProtobufResult<()> {
-        while !is.eof()? {
-            let (field_number, wire_type) = is.read_tag_unpack()?;
-            match field_number {
-                1 => {
-                    ::protobuf::rt::read_proto2_enum_with_unknown_fields_into(wire_type, is, &mut self.field_type, 1, &mut self.unknown_fields)?
+    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {
+        while let Some(tag) = is.read_raw_tag_or_eof()? {
+            match tag {
+                8 => {
+                    self.type_ = ::std::option::Option::Some(is.read_enum_or_unknown()?);
                 },
-                2 => {
-                    if wire_type != ::protobuf::wire_format::WireTypeVarint {
-                        return ::std::result::Result::Err(::protobuf::rt::unexpected_wire_type(wire_type));
-                    }
-                    let tmp = is.read_int32()?;
-                    self.version = ::std::option::Option::Some(tmp);
+                16 => {
+                    self.version = ::std::option::Option::Some(is.read_int32()?);
                 },
-                _ => {
-                    ::protobuf::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?;
+                tag => {
+                    ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;
                 },
             };
         }
@@ -1744,87 +1691,67 @@
 
     // Compute sizes of nested messages
     #[allow(unused_variables)]
-    fn compute_size(&self) -> u32 {
+    fn compute_size(&self) -> u64 {
         let mut my_size = 0;
-        if let Some(v) = self.field_type {
-            my_size += ::protobuf::rt::enum_size(1, v);
+        if let Some(v) = self.type_ {
+            my_size += ::protobuf::rt::int32_size(1, v.value());
         }
         if let Some(v) = self.version {
-            my_size += ::protobuf::rt::value_size(2, v, ::protobuf::wire_format::WireTypeVarint);
+            my_size += ::protobuf::rt::int32_size(2, v);
         }
-        my_size += ::protobuf::rt::unknown_fields_size(self.get_unknown_fields());
-        self.cached_size.set(my_size);
+        my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());
+        self.special_fields.cached_size().set(my_size as u32);
         my_size
     }
 
-    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::ProtobufResult<()> {
-        if let Some(v) = self.field_type {
-            os.write_enum(1, ::protobuf::ProtobufEnum::value(&v))?;
+    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {
+        if let Some(v) = self.type_ {
+            os.write_enum(1, ::protobuf::EnumOrUnknown::value(&v))?;
         }
         if let Some(v) = self.version {
             os.write_int32(2, v)?;
         }
-        os.write_unknown_fields(self.get_unknown_fields())?;
+        os.write_unknown_fields(self.special_fields.unknown_fields())?;
         ::std::result::Result::Ok(())
     }
 
-    fn get_cached_size(&self) -> u32 {
-        self.cached_size.get()
+    fn special_fields(&self) -> &::protobuf::SpecialFields {
+        &self.special_fields
     }
 
-    fn get_unknown_fields(&self) -> &::protobuf::UnknownFields {
-        &self.unknown_fields
-    }
-
-    fn mut_unknown_fields(&mut self) -> &mut ::protobuf::UnknownFields {
-        &mut self.unknown_fields
-    }
-
-    fn as_any(&self) -> &dyn (::std::any::Any) {
-        self as &dyn (::std::any::Any)
-    }
-    fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) {
-        self as &mut dyn (::std::any::Any)
-    }
-    fn into_any(self: ::std::boxed::Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
-        self
-    }
-
-    fn descriptor(&self) -> &'static ::protobuf::reflect::MessageDescriptor {
-        Self::descriptor_static()
+    fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {
+        &mut self.special_fields
     }
 
     fn new() -> GcmMetadata {
         GcmMetadata::new()
     }
 
-    fn default_instance() -> &'static GcmMetadata {
-        static instance: ::protobuf::rt::LazyV2<GcmMetadata> = ::protobuf::rt::LazyV2::INIT;
-        instance.get(GcmMetadata::new)
-    }
-}
-
-impl ::protobuf::Clear for GcmMetadata {
     fn clear(&mut self) {
-        self.field_type = ::std::option::Option::None;
+        self.type_ = ::std::option::Option::None;
         self.version = ::std::option::Option::None;
-        self.unknown_fields.clear();
+        self.special_fields.clear();
     }
-}
 
-impl ::protobuf::reflect::ProtobufValue for GcmMetadata {
-    fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef {
-        ::protobuf::reflect::ReflectValueRef::Message(self)
+    fn default_instance() -> &'static GcmMetadata {
+        static instance: GcmMetadata = GcmMetadata {
+            type_: ::std::option::Option::None,
+            version: ::std::option::Option::None,
+            special_fields: ::protobuf::SpecialFields::new(),
+        };
+        &instance
     }
 }
 
 #[derive(PartialEq,Clone,Default,Debug)]
+// @@protoc_insertion_point(message:securegcm.Tickle)
 pub struct Tickle {
     // message fields
-    expiry_time: ::std::option::Option<u64>,
+    // @@protoc_insertion_point(field:securegcm.Tickle.expiry_time)
+    pub expiry_time: ::std::option::Option<u64>,
     // special fields
-    pub unknown_fields: ::protobuf::UnknownFields,
-    pub cached_size: ::protobuf::CachedSize,
+    // @@protoc_insertion_point(special_field:securegcm.Tickle.special_fields)
+    pub special_fields: ::protobuf::SpecialFields,
 }
 
 impl<'a> ::std::default::Default for &'a Tickle {
@@ -1840,10 +1767,10 @@
 
     // optional fixed64 expiry_time = 1;
 
-
-    pub fn get_expiry_time(&self) -> u64 {
+    pub fn expiry_time(&self) -> u64 {
         self.expiry_time.unwrap_or(0)
     }
+
     pub fn clear_expiry_time(&mut self) {
         self.expiry_time = ::std::option::Option::None;
     }
@@ -1859,23 +1786,20 @@
 }
 
 impl ::protobuf::Message for Tickle {
+    const NAME: &'static str = "Tickle";
+
     fn is_initialized(&self) -> bool {
         true
     }
 
-    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::ProtobufResult<()> {
-        while !is.eof()? {
-            let (field_number, wire_type) = is.read_tag_unpack()?;
-            match field_number {
-                1 => {
-                    if wire_type != ::protobuf::wire_format::WireTypeFixed64 {
-                        return ::std::result::Result::Err(::protobuf::rt::unexpected_wire_type(wire_type));
-                    }
-                    let tmp = is.read_fixed64()?;
-                    self.expiry_time = ::std::option::Option::Some(tmp);
+    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {
+        while let Some(tag) = is.read_raw_tag_or_eof()? {
+            match tag {
+                9 => {
+                    self.expiry_time = ::std::option::Option::Some(is.read_fixed64()?);
                 },
-                _ => {
-                    ::protobuf::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?;
+                tag => {
+                    ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;
                 },
             };
         }
@@ -1884,84 +1808,67 @@
 
     // Compute sizes of nested messages
     #[allow(unused_variables)]
-    fn compute_size(&self) -> u32 {
+    fn compute_size(&self) -> u64 {
         let mut my_size = 0;
         if let Some(v) = self.expiry_time {
-            my_size += 9;
+            my_size += 1 + 8;
         }
-        my_size += ::protobuf::rt::unknown_fields_size(self.get_unknown_fields());
-        self.cached_size.set(my_size);
+        my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());
+        self.special_fields.cached_size().set(my_size as u32);
         my_size
     }
 
-    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::ProtobufResult<()> {
+    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {
         if let Some(v) = self.expiry_time {
             os.write_fixed64(1, v)?;
         }
-        os.write_unknown_fields(self.get_unknown_fields())?;
+        os.write_unknown_fields(self.special_fields.unknown_fields())?;
         ::std::result::Result::Ok(())
     }
 
-    fn get_cached_size(&self) -> u32 {
-        self.cached_size.get()
+    fn special_fields(&self) -> &::protobuf::SpecialFields {
+        &self.special_fields
     }
 
-    fn get_unknown_fields(&self) -> &::protobuf::UnknownFields {
-        &self.unknown_fields
-    }
-
-    fn mut_unknown_fields(&mut self) -> &mut ::protobuf::UnknownFields {
-        &mut self.unknown_fields
-    }
-
-    fn as_any(&self) -> &dyn (::std::any::Any) {
-        self as &dyn (::std::any::Any)
-    }
-    fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) {
-        self as &mut dyn (::std::any::Any)
-    }
-    fn into_any(self: ::std::boxed::Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
-        self
-    }
-
-    fn descriptor(&self) -> &'static ::protobuf::reflect::MessageDescriptor {
-        Self::descriptor_static()
+    fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {
+        &mut self.special_fields
     }
 
     fn new() -> Tickle {
         Tickle::new()
     }
 
-    fn default_instance() -> &'static Tickle {
-        static instance: ::protobuf::rt::LazyV2<Tickle> = ::protobuf::rt::LazyV2::INIT;
-        instance.get(Tickle::new)
-    }
-}
-
-impl ::protobuf::Clear for Tickle {
     fn clear(&mut self) {
         self.expiry_time = ::std::option::Option::None;
-        self.unknown_fields.clear();
+        self.special_fields.clear();
     }
-}
 
-impl ::protobuf::reflect::ProtobufValue for Tickle {
-    fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef {
-        ::protobuf::reflect::ReflectValueRef::Message(self)
+    fn default_instance() -> &'static Tickle {
+        static instance: Tickle = Tickle {
+            expiry_time: ::std::option::Option::None,
+            special_fields: ::protobuf::SpecialFields::new(),
+        };
+        &instance
     }
 }
 
 #[derive(PartialEq,Clone,Default,Debug)]
+// @@protoc_insertion_point(message:securegcm.LoginNotificationInfo)
 pub struct LoginNotificationInfo {
     // message fields
-    creation_time: ::std::option::Option<u64>,
-    email: ::protobuf::SingularField<::std::string::String>,
-    host: ::protobuf::SingularField<::std::string::String>,
-    source: ::protobuf::SingularField<::std::string::String>,
-    event_type: ::protobuf::SingularField<::std::string::String>,
+    // @@protoc_insertion_point(field:securegcm.LoginNotificationInfo.creation_time)
+    pub creation_time: ::std::option::Option<u64>,
+    // @@protoc_insertion_point(field:securegcm.LoginNotificationInfo.email)
+    pub email: ::std::option::Option<::std::string::String>,
+    // @@protoc_insertion_point(field:securegcm.LoginNotificationInfo.host)
+    pub host: ::std::option::Option<::std::string::String>,
+    // @@protoc_insertion_point(field:securegcm.LoginNotificationInfo.source)
+    pub source: ::std::option::Option<::std::string::String>,
+    // @@protoc_insertion_point(field:securegcm.LoginNotificationInfo.event_type)
+    pub event_type: ::std::option::Option<::std::string::String>,
     // special fields
-    pub unknown_fields: ::protobuf::UnknownFields,
-    pub cached_size: ::protobuf::CachedSize,
+    // @@protoc_insertion_point(special_field:securegcm.LoginNotificationInfo.special_fields)
+    pub special_fields: ::protobuf::SpecialFields,
 }
 
 impl<'a> ::std::default::Default for &'a LoginNotificationInfo {
@@ -1977,10 +1884,10 @@
 
     // optional fixed64 creation_time = 2;
 
-
-    pub fn get_creation_time(&self) -> u64 {
+    pub fn creation_time(&self) -> u64 {
         self.creation_time.unwrap_or(0)
     }
+
     pub fn clear_creation_time(&mut self) {
         self.creation_time = ::std::option::Option::None;
     }
@@ -1996,15 +1903,15 @@
 
     // optional string email = 3;
 
-
-    pub fn get_email(&self) -> &str {
+    pub fn email(&self) -> &str {
         match self.email.as_ref() {
-            Some(v) => &v,
+            Some(v) => v,
             None => "",
         }
     }
+
     pub fn clear_email(&mut self) {
-        self.email.clear();
+        self.email = ::std::option::Option::None;
     }
 
     pub fn has_email(&self) -> bool {
@@ -2013,14 +1920,14 @@
 
     // Param is passed by value, moved
     pub fn set_email(&mut self, v: ::std::string::String) {
-        self.email = ::protobuf::SingularField::some(v);
+        self.email = ::std::option::Option::Some(v);
     }
 
     // Mutable pointer to the field.
     // If field is not initialized, it is initialized with default value first.
     pub fn mut_email(&mut self) -> &mut ::std::string::String {
         if self.email.is_none() {
-            self.email.set_default();
+            self.email = ::std::option::Option::Some(::std::string::String::new());
         }
         self.email.as_mut().unwrap()
     }
@@ -2032,15 +1939,15 @@
 
     // optional string host = 4;
 
-
-    pub fn get_host(&self) -> &str {
+    pub fn host(&self) -> &str {
         match self.host.as_ref() {
-            Some(v) => &v,
+            Some(v) => v,
             None => "",
         }
     }
+
     pub fn clear_host(&mut self) {
-        self.host.clear();
+        self.host = ::std::option::Option::None;
     }
 
     pub fn has_host(&self) -> bool {
@@ -2049,14 +1956,14 @@
 
     // Param is passed by value, moved
     pub fn set_host(&mut self, v: ::std::string::String) {
-        self.host = ::protobuf::SingularField::some(v);
+        self.host = ::std::option::Option::Some(v);
     }
 
     // Mutable pointer to the field.
     // If field is not initialized, it is initialized with default value first.
     pub fn mut_host(&mut self) -> &mut ::std::string::String {
         if self.host.is_none() {
-            self.host.set_default();
+            self.host = ::std::option::Option::Some(::std::string::String::new());
         }
         self.host.as_mut().unwrap()
     }
@@ -2068,15 +1975,15 @@
 
     // optional string source = 5;
 
-
-    pub fn get_source(&self) -> &str {
+    pub fn source(&self) -> &str {
         match self.source.as_ref() {
-            Some(v) => &v,
+            Some(v) => v,
             None => "",
         }
     }
+
     pub fn clear_source(&mut self) {
-        self.source.clear();
+        self.source = ::std::option::Option::None;
     }
 
     pub fn has_source(&self) -> bool {
@@ -2085,14 +1992,14 @@
 
     // Param is passed by value, moved
     pub fn set_source(&mut self, v: ::std::string::String) {
-        self.source = ::protobuf::SingularField::some(v);
+        self.source = ::std::option::Option::Some(v);
     }
 
     // Mutable pointer to the field.
     // If field is not initialized, it is initialized with default value first.
     pub fn mut_source(&mut self) -> &mut ::std::string::String {
         if self.source.is_none() {
-            self.source.set_default();
+            self.source = ::std::option::Option::Some(::std::string::String::new());
         }
         self.source.as_mut().unwrap()
     }
@@ -2104,15 +2011,15 @@
 
     // optional string event_type = 6;
 
-
-    pub fn get_event_type(&self) -> &str {
+    pub fn event_type(&self) -> &str {
         match self.event_type.as_ref() {
-            Some(v) => &v,
+            Some(v) => v,
             None => "",
         }
     }
+
     pub fn clear_event_type(&mut self) {
-        self.event_type.clear();
+        self.event_type = ::std::option::Option::None;
     }
 
     pub fn has_event_type(&self) -> bool {
@@ -2121,14 +2028,14 @@
 
     // Param is passed by value, moved
     pub fn set_event_type(&mut self, v: ::std::string::String) {
-        self.event_type = ::protobuf::SingularField::some(v);
+        self.event_type = ::std::option::Option::Some(v);
     }
 
     // Mutable pointer to the field.
     // If field is not initialized, it is initialized with default value first.
     pub fn mut_event_type(&mut self) -> &mut ::std::string::String {
         if self.event_type.is_none() {
-            self.event_type.set_default();
+            self.event_type = ::std::option::Option::Some(::std::string::String::new());
         }
         self.event_type.as_mut().unwrap()
     }
@@ -2140,35 +2047,32 @@
 }
 
 impl ::protobuf::Message for LoginNotificationInfo {
+    const NAME: &'static str = "LoginNotificationInfo";
+
     fn is_initialized(&self) -> bool {
         true
     }
 
-    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::ProtobufResult<()> {
-        while !is.eof()? {
-            let (field_number, wire_type) = is.read_tag_unpack()?;
-            match field_number {
-                2 => {
-                    if wire_type != ::protobuf::wire_format::WireTypeFixed64 {
-                        return ::std::result::Result::Err(::protobuf::rt::unexpected_wire_type(wire_type));
-                    }
-                    let tmp = is.read_fixed64()?;
-                    self.creation_time = ::std::option::Option::Some(tmp);
+    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {
+        while let Some(tag) = is.read_raw_tag_or_eof()? {
+            match tag {
+                17 => {
+                    self.creation_time = ::std::option::Option::Some(is.read_fixed64()?);
                 },
-                3 => {
-                    ::protobuf::rt::read_singular_string_into(wire_type, is, &mut self.email)?;
+                26 => {
+                    self.email = ::std::option::Option::Some(is.read_string()?);
                 },
-                4 => {
-                    ::protobuf::rt::read_singular_string_into(wire_type, is, &mut self.host)?;
+                34 => {
+                    self.host = ::std::option::Option::Some(is.read_string()?);
                 },
-                5 => {
-                    ::protobuf::rt::read_singular_string_into(wire_type, is, &mut self.source)?;
+                42 => {
+                    self.source = ::std::option::Option::Some(is.read_string()?);
                 },
-                6 => {
-                    ::protobuf::rt::read_singular_string_into(wire_type, is, &mut self.event_type)?;
+                50 => {
+                    self.event_type = ::std::option::Option::Some(is.read_string()?);
                 },
-                _ => {
-                    ::protobuf::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?;
+                tag => {
+                    ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;
                 },
             };
         }
@@ -2177,108 +2081,94 @@
 
     // Compute sizes of nested messages
     #[allow(unused_variables)]
-    fn compute_size(&self) -> u32 {
+    fn compute_size(&self) -> u64 {
         let mut my_size = 0;
         if let Some(v) = self.creation_time {
-            my_size += 9;
+            my_size += 1 + 8;
         }
-        if let Some(ref v) = self.email.as_ref() {
+        if let Some(v) = self.email.as_ref() {
             my_size += ::protobuf::rt::string_size(3, &v);
         }
-        if let Some(ref v) = self.host.as_ref() {
+        if let Some(v) = self.host.as_ref() {
             my_size += ::protobuf::rt::string_size(4, &v);
         }
-        if let Some(ref v) = self.source.as_ref() {
+        if let Some(v) = self.source.as_ref() {
             my_size += ::protobuf::rt::string_size(5, &v);
         }
-        if let Some(ref v) = self.event_type.as_ref() {
+        if let Some(v) = self.event_type.as_ref() {
             my_size += ::protobuf::rt::string_size(6, &v);
         }
-        my_size += ::protobuf::rt::unknown_fields_size(self.get_unknown_fields());
-        self.cached_size.set(my_size);
+        my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());
+        self.special_fields.cached_size().set(my_size as u32);
         my_size
     }
 
-    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::ProtobufResult<()> {
+    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {
         if let Some(v) = self.creation_time {
             os.write_fixed64(2, v)?;
         }
-        if let Some(ref v) = self.email.as_ref() {
-            os.write_string(3, &v)?;
+        if let Some(v) = self.email.as_ref() {
+            os.write_string(3, v)?;
         }
-        if let Some(ref v) = self.host.as_ref() {
-            os.write_string(4, &v)?;
+        if let Some(v) = self.host.as_ref() {
+            os.write_string(4, v)?;
         }
-        if let Some(ref v) = self.source.as_ref() {
-            os.write_string(5, &v)?;
+        if let Some(v) = self.source.as_ref() {
+            os.write_string(5, v)?;
         }
-        if let Some(ref v) = self.event_type.as_ref() {
-            os.write_string(6, &v)?;
+        if let Some(v) = self.event_type.as_ref() {
+            os.write_string(6, v)?;
         }
-        os.write_unknown_fields(self.get_unknown_fields())?;
+        os.write_unknown_fields(self.special_fields.unknown_fields())?;
         ::std::result::Result::Ok(())
     }
 
-    fn get_cached_size(&self) -> u32 {
-        self.cached_size.get()
+    fn special_fields(&self) -> &::protobuf::SpecialFields {
+        &self.special_fields
     }
 
-    fn get_unknown_fields(&self) -> &::protobuf::UnknownFields {
-        &self.unknown_fields
-    }
-
-    fn mut_unknown_fields(&mut self) -> &mut ::protobuf::UnknownFields {
-        &mut self.unknown_fields
-    }
-
-    fn as_any(&self) -> &dyn (::std::any::Any) {
-        self as &dyn (::std::any::Any)
-    }
-    fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) {
-        self as &mut dyn (::std::any::Any)
-    }
-    fn into_any(self: ::std::boxed::Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
-        self
-    }
-
-    fn descriptor(&self) -> &'static ::protobuf::reflect::MessageDescriptor {
-        Self::descriptor_static()
+    fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {
+        &mut self.special_fields
     }
 
     fn new() -> LoginNotificationInfo {
         LoginNotificationInfo::new()
     }
 
-    fn default_instance() -> &'static LoginNotificationInfo {
-        static instance: ::protobuf::rt::LazyV2<LoginNotificationInfo> = ::protobuf::rt::LazyV2::INIT;
-        instance.get(LoginNotificationInfo::new)
-    }
-}
-
-impl ::protobuf::Clear for LoginNotificationInfo {
     fn clear(&mut self) {
         self.creation_time = ::std::option::Option::None;
-        self.email.clear();
-        self.host.clear();
-        self.source.clear();
-        self.event_type.clear();
-        self.unknown_fields.clear();
+        self.email = ::std::option::Option::None;
+        self.host = ::std::option::Option::None;
+        self.source = ::std::option::Option::None;
+        self.event_type = ::std::option::Option::None;
+        self.special_fields.clear();
+    }
+
+    fn default_instance() -> &'static LoginNotificationInfo {
+        static instance: LoginNotificationInfo = LoginNotificationInfo {
+            creation_time: ::std::option::Option::None,
+            email: ::std::option::Option::None,
+            host: ::std::option::Option::None,
+            source: ::std::option::Option::None,
+            event_type: ::std::option::Option::None,
+            special_fields: ::protobuf::SpecialFields::new(),
+        };
+        &instance
     }
 }
 
-impl ::protobuf::reflect::ProtobufValue for LoginNotificationInfo {
-    fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef {
-        ::protobuf::reflect::ReflectValueRef::Message(self)
-    }
-}
-
-#[derive(Clone,PartialEq,Eq,Debug,Hash)]
+#[derive(Clone,Copy,PartialEq,Eq,Debug,Hash)]
+// @@protoc_insertion_point(enum:securegcm.AppleDeviceDiagonalMils)
 pub enum AppleDeviceDiagonalMils {
+    // @@protoc_insertion_point(enum_value:securegcm.AppleDeviceDiagonalMils.APPLE_PHONE)
     APPLE_PHONE = 4000,
+    // @@protoc_insertion_point(enum_value:securegcm.AppleDeviceDiagonalMils.APPLE_PAD)
     APPLE_PAD = 7900,
 }
 
-impl ::protobuf::ProtobufEnum for AppleDeviceDiagonalMils {
+impl ::protobuf::Enum for AppleDeviceDiagonalMils {
+    const NAME: &'static str = "AppleDeviceDiagonalMils";
+
     fn value(&self) -> i32 {
         *self as i32
     }
@@ -2291,16 +2181,10 @@
         }
     }
 
-    fn values() -> &'static [Self] {
-        static values: &'static [AppleDeviceDiagonalMils] = &[
-            AppleDeviceDiagonalMils::APPLE_PHONE,
-            AppleDeviceDiagonalMils::APPLE_PAD,
-        ];
-        values
-    }
-}
-
-impl ::std::marker::Copy for AppleDeviceDiagonalMils {
+    const VALUES: &'static [AppleDeviceDiagonalMils] = &[
+        AppleDeviceDiagonalMils::APPLE_PHONE,
+        AppleDeviceDiagonalMils::APPLE_PAD,
+    ];
 }
 
 // Note, `Default` is implemented although default value is not 0
@@ -2310,23 +2194,27 @@
     }
 }
 
-impl ::protobuf::reflect::ProtobufValue for AppleDeviceDiagonalMils {
-    fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef {
-        ::protobuf::reflect::ReflectValueRef::Enum(::protobuf::ProtobufEnum::descriptor(self))
-    }
-}
 
-#[derive(Clone,PartialEq,Eq,Debug,Hash)]
+#[derive(Clone,Copy,PartialEq,Eq,Debug,Hash)]
+// @@protoc_insertion_point(enum:securegcm.DeviceType)
 pub enum DeviceType {
+    // @@protoc_insertion_point(enum_value:securegcm.DeviceType.UNKNOWN)
     UNKNOWN = 0,
+    // @@protoc_insertion_point(enum_value:securegcm.DeviceType.ANDROID)
     ANDROID = 1,
+    // @@protoc_insertion_point(enum_value:securegcm.DeviceType.CHROME)
     CHROME = 2,
+    // @@protoc_insertion_point(enum_value:securegcm.DeviceType.IOS)
     IOS = 3,
+    // @@protoc_insertion_point(enum_value:securegcm.DeviceType.BROWSER)
     BROWSER = 4,
+    // @@protoc_insertion_point(enum_value:securegcm.DeviceType.OSX)
     OSX = 5,
 }
 
-impl ::protobuf::ProtobufEnum for DeviceType {
+impl ::protobuf::Enum for DeviceType {
+    const NAME: &'static str = "DeviceType";
+
     fn value(&self) -> i32 {
         *self as i32
     }
@@ -2343,20 +2231,14 @@
         }
     }
 
-    fn values() -> &'static [Self] {
-        static values: &'static [DeviceType] = &[
-            DeviceType::UNKNOWN,
-            DeviceType::ANDROID,
-            DeviceType::CHROME,
-            DeviceType::IOS,
-            DeviceType::BROWSER,
-            DeviceType::OSX,
-        ];
-        values
-    }
-}
-
-impl ::std::marker::Copy for DeviceType {
+    const VALUES: &'static [DeviceType] = &[
+        DeviceType::UNKNOWN,
+        DeviceType::ANDROID,
+        DeviceType::CHROME,
+        DeviceType::IOS,
+        DeviceType::BROWSER,
+        DeviceType::OSX,
+    ];
 }
 
 impl ::std::default::Default for DeviceType {
@@ -2365,26 +2247,33 @@
     }
 }
 
-impl ::protobuf::reflect::ProtobufValue for DeviceType {
-    fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef {
-        ::protobuf::reflect::ReflectValueRef::Enum(::protobuf::ProtobufEnum::descriptor(self))
-    }
-}
 
-#[derive(Clone,PartialEq,Eq,Debug,Hash)]
+#[derive(Clone,Copy,PartialEq,Eq,Debug,Hash)]
+// @@protoc_insertion_point(enum:securegcm.SoftwareFeature)
 pub enum SoftwareFeature {
+    // @@protoc_insertion_point(enum_value:securegcm.SoftwareFeature.UNKNOWN_FEATURE)
     UNKNOWN_FEATURE = 0,
+    // @@protoc_insertion_point(enum_value:securegcm.SoftwareFeature.BETTER_TOGETHER_HOST)
     BETTER_TOGETHER_HOST = 1,
+    // @@protoc_insertion_point(enum_value:securegcm.SoftwareFeature.BETTER_TOGETHER_CLIENT)
     BETTER_TOGETHER_CLIENT = 2,
+    // @@protoc_insertion_point(enum_value:securegcm.SoftwareFeature.EASY_UNLOCK_HOST)
     EASY_UNLOCK_HOST = 3,
+    // @@protoc_insertion_point(enum_value:securegcm.SoftwareFeature.EASY_UNLOCK_CLIENT)
     EASY_UNLOCK_CLIENT = 4,
+    // @@protoc_insertion_point(enum_value:securegcm.SoftwareFeature.MAGIC_TETHER_HOST)
     MAGIC_TETHER_HOST = 5,
+    // @@protoc_insertion_point(enum_value:securegcm.SoftwareFeature.MAGIC_TETHER_CLIENT)
     MAGIC_TETHER_CLIENT = 6,
+    // @@protoc_insertion_point(enum_value:securegcm.SoftwareFeature.SMS_CONNECT_HOST)
     SMS_CONNECT_HOST = 7,
+    // @@protoc_insertion_point(enum_value:securegcm.SoftwareFeature.SMS_CONNECT_CLIENT)
     SMS_CONNECT_CLIENT = 8,
 }
 
-impl ::protobuf::ProtobufEnum for SoftwareFeature {
+impl ::protobuf::Enum for SoftwareFeature {
+    const NAME: &'static str = "SoftwareFeature";
+
     fn value(&self) -> i32 {
         *self as i32
     }
@@ -2404,23 +2293,17 @@
         }
     }
 
-    fn values() -> &'static [Self] {
-        static values: &'static [SoftwareFeature] = &[
-            SoftwareFeature::UNKNOWN_FEATURE,
-            SoftwareFeature::BETTER_TOGETHER_HOST,
-            SoftwareFeature::BETTER_TOGETHER_CLIENT,
-            SoftwareFeature::EASY_UNLOCK_HOST,
-            SoftwareFeature::EASY_UNLOCK_CLIENT,
-            SoftwareFeature::MAGIC_TETHER_HOST,
-            SoftwareFeature::MAGIC_TETHER_CLIENT,
-            SoftwareFeature::SMS_CONNECT_HOST,
-            SoftwareFeature::SMS_CONNECT_CLIENT,
-        ];
-        values
-    }
-}
-
-impl ::std::marker::Copy for SoftwareFeature {
+    const VALUES: &'static [SoftwareFeature] = &[
+        SoftwareFeature::UNKNOWN_FEATURE,
+        SoftwareFeature::BETTER_TOGETHER_HOST,
+        SoftwareFeature::BETTER_TOGETHER_CLIENT,
+        SoftwareFeature::EASY_UNLOCK_HOST,
+        SoftwareFeature::EASY_UNLOCK_CLIENT,
+        SoftwareFeature::MAGIC_TETHER_HOST,
+        SoftwareFeature::MAGIC_TETHER_CLIENT,
+        SoftwareFeature::SMS_CONNECT_HOST,
+        SoftwareFeature::SMS_CONNECT_CLIENT,
+    ];
 }
 
 impl ::std::default::Default for SoftwareFeature {
@@ -2429,33 +2312,47 @@
     }
 }
 
-impl ::protobuf::reflect::ProtobufValue for SoftwareFeature {
-    fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef {
-        ::protobuf::reflect::ReflectValueRef::Enum(::protobuf::ProtobufEnum::descriptor(self))
-    }
-}
 
-#[derive(Clone,PartialEq,Eq,Debug,Hash)]
+#[derive(Clone,Copy,PartialEq,Eq,Debug,Hash)]
+// @@protoc_insertion_point(enum:securegcm.InvocationReason)
 pub enum InvocationReason {
+    // @@protoc_insertion_point(enum_value:securegcm.InvocationReason.REASON_UNKNOWN)
     REASON_UNKNOWN = 0,
+    // @@protoc_insertion_point(enum_value:securegcm.InvocationReason.REASON_INITIALIZATION)
     REASON_INITIALIZATION = 1,
+    // @@protoc_insertion_point(enum_value:securegcm.InvocationReason.REASON_PERIODIC)
     REASON_PERIODIC = 2,
+    // @@protoc_insertion_point(enum_value:securegcm.InvocationReason.REASON_SLOW_PERIODIC)
     REASON_SLOW_PERIODIC = 3,
+    // @@protoc_insertion_point(enum_value:securegcm.InvocationReason.REASON_FAST_PERIODIC)
     REASON_FAST_PERIODIC = 4,
+    // @@protoc_insertion_point(enum_value:securegcm.InvocationReason.REASON_EXPIRATION)
     REASON_EXPIRATION = 5,
+    // @@protoc_insertion_point(enum_value:securegcm.InvocationReason.REASON_FAILURE_RECOVERY)
     REASON_FAILURE_RECOVERY = 6,
+    // @@protoc_insertion_point(enum_value:securegcm.InvocationReason.REASON_NEW_ACCOUNT)
     REASON_NEW_ACCOUNT = 7,
+    // @@protoc_insertion_point(enum_value:securegcm.InvocationReason.REASON_CHANGED_ACCOUNT)
     REASON_CHANGED_ACCOUNT = 8,
+    // @@protoc_insertion_point(enum_value:securegcm.InvocationReason.REASON_FEATURE_TOGGLED)
     REASON_FEATURE_TOGGLED = 9,
+    // @@protoc_insertion_point(enum_value:securegcm.InvocationReason.REASON_SERVER_INITIATED)
     REASON_SERVER_INITIATED = 10,
+    // @@protoc_insertion_point(enum_value:securegcm.InvocationReason.REASON_ADDRESS_CHANGE)
     REASON_ADDRESS_CHANGE = 11,
+    // @@protoc_insertion_point(enum_value:securegcm.InvocationReason.REASON_SOFTWARE_UPDATE)
     REASON_SOFTWARE_UPDATE = 12,
+    // @@protoc_insertion_point(enum_value:securegcm.InvocationReason.REASON_MANUAL)
     REASON_MANUAL = 13,
+    // @@protoc_insertion_point(enum_value:securegcm.InvocationReason.REASON_CUSTOM_KEY_INVALIDATION)
     REASON_CUSTOM_KEY_INVALIDATION = 14,
+    // @@protoc_insertion_point(enum_value:securegcm.InvocationReason.REASON_PROXIMITY_PERIODIC)
     REASON_PROXIMITY_PERIODIC = 15,
 }
 
-impl ::protobuf::ProtobufEnum for InvocationReason {
+impl ::protobuf::Enum for InvocationReason {
+    const NAME: &'static str = "InvocationReason";
+
     fn value(&self) -> i32 {
         *self as i32
     }
@@ -2482,30 +2379,24 @@
         }
     }
 
-    fn values() -> &'static [Self] {
-        static values: &'static [InvocationReason] = &[
-            InvocationReason::REASON_UNKNOWN,
-            InvocationReason::REASON_INITIALIZATION,
-            InvocationReason::REASON_PERIODIC,
-            InvocationReason::REASON_SLOW_PERIODIC,
-            InvocationReason::REASON_FAST_PERIODIC,
-            InvocationReason::REASON_EXPIRATION,
-            InvocationReason::REASON_FAILURE_RECOVERY,
-            InvocationReason::REASON_NEW_ACCOUNT,
-            InvocationReason::REASON_CHANGED_ACCOUNT,
-            InvocationReason::REASON_FEATURE_TOGGLED,
-            InvocationReason::REASON_SERVER_INITIATED,
-            InvocationReason::REASON_ADDRESS_CHANGE,
-            InvocationReason::REASON_SOFTWARE_UPDATE,
-            InvocationReason::REASON_MANUAL,
-            InvocationReason::REASON_CUSTOM_KEY_INVALIDATION,
-            InvocationReason::REASON_PROXIMITY_PERIODIC,
-        ];
-        values
-    }
-}
-
-impl ::std::marker::Copy for InvocationReason {
+    const VALUES: &'static [InvocationReason] = &[
+        InvocationReason::REASON_UNKNOWN,
+        InvocationReason::REASON_INITIALIZATION,
+        InvocationReason::REASON_PERIODIC,
+        InvocationReason::REASON_SLOW_PERIODIC,
+        InvocationReason::REASON_FAST_PERIODIC,
+        InvocationReason::REASON_EXPIRATION,
+        InvocationReason::REASON_FAILURE_RECOVERY,
+        InvocationReason::REASON_NEW_ACCOUNT,
+        InvocationReason::REASON_CHANGED_ACCOUNT,
+        InvocationReason::REASON_FEATURE_TOGGLED,
+        InvocationReason::REASON_SERVER_INITIATED,
+        InvocationReason::REASON_ADDRESS_CHANGE,
+        InvocationReason::REASON_SOFTWARE_UPDATE,
+        InvocationReason::REASON_MANUAL,
+        InvocationReason::REASON_CUSTOM_KEY_INVALIDATION,
+        InvocationReason::REASON_PROXIMITY_PERIODIC,
+    ];
 }
 
 impl ::std::default::Default for InvocationReason {
@@ -2514,33 +2405,47 @@
     }
 }
 
-impl ::protobuf::reflect::ProtobufValue for InvocationReason {
-    fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef {
-        ::protobuf::reflect::ReflectValueRef::Enum(::protobuf::ProtobufEnum::descriptor(self))
-    }
-}
 
-#[derive(Clone,PartialEq,Eq,Debug,Hash)]
+#[derive(Clone,Copy,PartialEq,Eq,Debug,Hash)]
+// @@protoc_insertion_point(enum:securegcm.Type)
 pub enum Type {
+    // @@protoc_insertion_point(enum_value:securegcm.Type.ENROLLMENT)
     ENROLLMENT = 0,
+    // @@protoc_insertion_point(enum_value:securegcm.Type.TICKLE)
     TICKLE = 1,
+    // @@protoc_insertion_point(enum_value:securegcm.Type.TX_REQUEST)
     TX_REQUEST = 2,
+    // @@protoc_insertion_point(enum_value:securegcm.Type.TX_REPLY)
     TX_REPLY = 3,
+    // @@protoc_insertion_point(enum_value:securegcm.Type.TX_SYNC_REQUEST)
     TX_SYNC_REQUEST = 4,
+    // @@protoc_insertion_point(enum_value:securegcm.Type.TX_SYNC_RESPONSE)
     TX_SYNC_RESPONSE = 5,
+    // @@protoc_insertion_point(enum_value:securegcm.Type.TX_PING)
     TX_PING = 6,
+    // @@protoc_insertion_point(enum_value:securegcm.Type.DEVICE_INFO_UPDATE)
     DEVICE_INFO_UPDATE = 7,
+    // @@protoc_insertion_point(enum_value:securegcm.Type.TX_CANCEL_REQUEST)
     TX_CANCEL_REQUEST = 8,
+    // @@protoc_insertion_point(enum_value:securegcm.Type.PROXIMITYAUTH_PAIRING)
     PROXIMITYAUTH_PAIRING = 10,
+    // @@protoc_insertion_point(enum_value:securegcm.Type.GCMV1_IDENTITY_ASSERTION)
     GCMV1_IDENTITY_ASSERTION = 11,
+    // @@protoc_insertion_point(enum_value:securegcm.Type.DEVICE_TO_DEVICE_RESPONDER_HELLO_PAYLOAD)
     DEVICE_TO_DEVICE_RESPONDER_HELLO_PAYLOAD = 12,
+    // @@protoc_insertion_point(enum_value:securegcm.Type.DEVICE_TO_DEVICE_MESSAGE)
     DEVICE_TO_DEVICE_MESSAGE = 13,
+    // @@protoc_insertion_point(enum_value:securegcm.Type.DEVICE_PROXIMITY_CALLBACK)
     DEVICE_PROXIMITY_CALLBACK = 14,
+    // @@protoc_insertion_point(enum_value:securegcm.Type.UNLOCK_KEY_SIGNED_CHALLENGE)
     UNLOCK_KEY_SIGNED_CHALLENGE = 15,
+    // @@protoc_insertion_point(enum_value:securegcm.Type.LOGIN_NOTIFICATION)
     LOGIN_NOTIFICATION = 101,
 }
 
-impl ::protobuf::ProtobufEnum for Type {
+impl ::protobuf::Enum for Type {
+    const NAME: &'static str = "Type";
+
     fn value(&self) -> i32 {
         *self as i32
     }
@@ -2567,30 +2472,24 @@
         }
     }
 
-    fn values() -> &'static [Self] {
-        static values: &'static [Type] = &[
-            Type::ENROLLMENT,
-            Type::TICKLE,
-            Type::TX_REQUEST,
-            Type::TX_REPLY,
-            Type::TX_SYNC_REQUEST,
-            Type::TX_SYNC_RESPONSE,
-            Type::TX_PING,
-            Type::DEVICE_INFO_UPDATE,
-            Type::TX_CANCEL_REQUEST,
-            Type::PROXIMITYAUTH_PAIRING,
-            Type::GCMV1_IDENTITY_ASSERTION,
-            Type::DEVICE_TO_DEVICE_RESPONDER_HELLO_PAYLOAD,
-            Type::DEVICE_TO_DEVICE_MESSAGE,
-            Type::DEVICE_PROXIMITY_CALLBACK,
-            Type::UNLOCK_KEY_SIGNED_CHALLENGE,
-            Type::LOGIN_NOTIFICATION,
-        ];
-        values
-    }
-}
-
-impl ::std::marker::Copy for Type {
+    const VALUES: &'static [Type] = &[
+        Type::ENROLLMENT,
+        Type::TICKLE,
+        Type::TX_REQUEST,
+        Type::TX_REPLY,
+        Type::TX_SYNC_REQUEST,
+        Type::TX_SYNC_RESPONSE,
+        Type::TX_PING,
+        Type::DEVICE_INFO_UPDATE,
+        Type::TX_CANCEL_REQUEST,
+        Type::PROXIMITYAUTH_PAIRING,
+        Type::GCMV1_IDENTITY_ASSERTION,
+        Type::DEVICE_TO_DEVICE_RESPONDER_HELLO_PAYLOAD,
+        Type::DEVICE_TO_DEVICE_MESSAGE,
+        Type::DEVICE_PROXIMITY_CALLBACK,
+        Type::UNLOCK_KEY_SIGNED_CHALLENGE,
+        Type::LOGIN_NOTIFICATION,
+    ];
 }
 
 impl ::std::default::Default for Type {
@@ -2599,8 +2498,3 @@
     }
 }
 
-impl ::protobuf::reflect::ProtobufValue for Type {
-    fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef {
-        ::protobuf::reflect::ReflectValueRef::Enum(::protobuf::ProtobufEnum::descriptor(self))
-    }
-}
diff --git a/nearby/connections/ukey2/ukey2_proto/src/ukey2_all_proto/securemessage.rs b/nearby/connections/ukey2/ukey2_proto/src/ukey2_all_proto/securemessage.rs
index e3df251..161e0be 100644
--- a/nearby/connections/ukey2/ukey2_proto/src/ukey2_all_proto/securemessage.rs
+++ b/nearby/connections/ukey2/ukey2_proto/src/ukey2_all_proto/securemessage.rs
@@ -12,7 +12,8 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-// This file is generated by rust-protobuf 2.28.0. Do not edit
+// This file is generated by rust-protobuf 3.2.0. Do not edit
+// .proto file is parsed by protoc 3.19.1
 // @generated
 
 // https://github.com/rust-lang/rust-clippy/issues/702
@@ -29,22 +30,27 @@
 #![allow(non_snake_case)]
 #![allow(non_upper_case_globals)]
 #![allow(trivial_casts)]
-#![allow(unused_imports)]
 #![allow(unused_results)]
+#![allow(unused_mut)]
+
 //! Generated file from `securemessage.proto`
+// Generated for lite runtime
 
 /// Generated files are compatible only with the same version
 /// of protobuf runtime.
-// const _PROTOBUF_VERSION_CHECK: () = ::protobuf::VERSION_2_28_0;
+const _PROTOBUF_VERSION_CHECK: () = ::protobuf::VERSION_3_2_0;
 
 #[derive(PartialEq,Clone,Default,Debug)]
+// @@protoc_insertion_point(message:securemessage.SecureMessage)
 pub struct SecureMessage {
     // message fields
-    header_and_body: ::protobuf::SingularField<::std::vec::Vec<u8>>,
-    signature: ::protobuf::SingularField<::std::vec::Vec<u8>>,
+    // @@protoc_insertion_point(field:securemessage.SecureMessage.header_and_body)
+    pub header_and_body: ::std::option::Option<::std::vec::Vec<u8>>,
+    // @@protoc_insertion_point(field:securemessage.SecureMessage.signature)
+    pub signature: ::std::option::Option<::std::vec::Vec<u8>>,
     // special fields
-    pub unknown_fields: ::protobuf::UnknownFields,
-    pub cached_size: ::protobuf::CachedSize,
+    // @@protoc_insertion_point(special_field:securemessage.SecureMessage.special_fields)
+    pub special_fields: ::protobuf::SpecialFields,
 }
 
 impl<'a> ::std::default::Default for &'a SecureMessage {
@@ -60,15 +66,15 @@
 
     // required bytes header_and_body = 1;
 
-
-    pub fn get_header_and_body(&self) -> &[u8] {
+    pub fn header_and_body(&self) -> &[u8] {
         match self.header_and_body.as_ref() {
-            Some(v) => &v,
+            Some(v) => v,
             None => &[],
         }
     }
+
     pub fn clear_header_and_body(&mut self) {
-        self.header_and_body.clear();
+        self.header_and_body = ::std::option::Option::None;
     }
 
     pub fn has_header_and_body(&self) -> bool {
@@ -77,14 +83,14 @@
 
     // Param is passed by value, moved
     pub fn set_header_and_body(&mut self, v: ::std::vec::Vec<u8>) {
-        self.header_and_body = ::protobuf::SingularField::some(v);
+        self.header_and_body = ::std::option::Option::Some(v);
     }
 
     // Mutable pointer to the field.
     // If field is not initialized, it is initialized with default value first.
     pub fn mut_header_and_body(&mut self) -> &mut ::std::vec::Vec<u8> {
         if self.header_and_body.is_none() {
-            self.header_and_body.set_default();
+            self.header_and_body = ::std::option::Option::Some(::std::vec::Vec::new());
         }
         self.header_and_body.as_mut().unwrap()
     }
@@ -96,15 +102,15 @@
 
     // required bytes signature = 2;
 
-
-    pub fn get_signature(&self) -> &[u8] {
+    pub fn signature(&self) -> &[u8] {
         match self.signature.as_ref() {
-            Some(v) => &v,
+            Some(v) => v,
             None => &[],
         }
     }
+
     pub fn clear_signature(&mut self) {
-        self.signature.clear();
+        self.signature = ::std::option::Option::None;
     }
 
     pub fn has_signature(&self) -> bool {
@@ -113,14 +119,14 @@
 
     // Param is passed by value, moved
     pub fn set_signature(&mut self, v: ::std::vec::Vec<u8>) {
-        self.signature = ::protobuf::SingularField::some(v);
+        self.signature = ::std::option::Option::Some(v);
     }
 
     // Mutable pointer to the field.
     // If field is not initialized, it is initialized with default value first.
     pub fn mut_signature(&mut self) -> &mut ::std::vec::Vec<u8> {
         if self.signature.is_none() {
-            self.signature.set_default();
+            self.signature = ::std::option::Option::Some(::std::vec::Vec::new());
         }
         self.signature.as_mut().unwrap()
     }
@@ -132,6 +138,8 @@
 }
 
 impl ::protobuf::Message for SecureMessage {
+    const NAME: &'static str = "SecureMessage";
+
     fn is_initialized(&self) -> bool {
         if self.header_and_body.is_none() {
             return false;
@@ -142,18 +150,17 @@
         true
     }
 
-    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::ProtobufResult<()> {
-        while !is.eof()? {
-            let (field_number, wire_type) = is.read_tag_unpack()?;
-            match field_number {
-                1 => {
-                    ::protobuf::rt::read_singular_bytes_into(wire_type, is, &mut self.header_and_body)?;
+    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {
+        while let Some(tag) = is.read_raw_tag_or_eof()? {
+            match tag {
+                10 => {
+                    self.header_and_body = ::std::option::Option::Some(is.read_bytes()?);
                 },
-                2 => {
-                    ::protobuf::rt::read_singular_bytes_into(wire_type, is, &mut self.signature)?;
+                18 => {
+                    self.signature = ::std::option::Option::Some(is.read_bytes()?);
                 },
-                _ => {
-                    ::protobuf::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?;
+                tag => {
+                    ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;
                 },
             };
         }
@@ -162,93 +169,81 @@
 
     // Compute sizes of nested messages
     #[allow(unused_variables)]
-    fn compute_size(&self) -> u32 {
+    fn compute_size(&self) -> u64 {
         let mut my_size = 0;
-        if let Some(ref v) = self.header_and_body.as_ref() {
+        if let Some(v) = self.header_and_body.as_ref() {
             my_size += ::protobuf::rt::bytes_size(1, &v);
         }
-        if let Some(ref v) = self.signature.as_ref() {
+        if let Some(v) = self.signature.as_ref() {
             my_size += ::protobuf::rt::bytes_size(2, &v);
         }
-        my_size += ::protobuf::rt::unknown_fields_size(self.get_unknown_fields());
-        self.cached_size.set(my_size);
+        my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());
+        self.special_fields.cached_size().set(my_size as u32);
         my_size
     }
 
-    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::ProtobufResult<()> {
-        if let Some(ref v) = self.header_and_body.as_ref() {
-            os.write_bytes(1, &v)?;
+    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {
+        if let Some(v) = self.header_and_body.as_ref() {
+            os.write_bytes(1, v)?;
         }
-        if let Some(ref v) = self.signature.as_ref() {
-            os.write_bytes(2, &v)?;
+        if let Some(v) = self.signature.as_ref() {
+            os.write_bytes(2, v)?;
         }
-        os.write_unknown_fields(self.get_unknown_fields())?;
+        os.write_unknown_fields(self.special_fields.unknown_fields())?;
         ::std::result::Result::Ok(())
     }
 
-    fn get_cached_size(&self) -> u32 {
-        self.cached_size.get()
+    fn special_fields(&self) -> &::protobuf::SpecialFields {
+        &self.special_fields
     }
 
-    fn get_unknown_fields(&self) -> &::protobuf::UnknownFields {
-        &self.unknown_fields
-    }
-
-    fn mut_unknown_fields(&mut self) -> &mut ::protobuf::UnknownFields {
-        &mut self.unknown_fields
-    }
-
-    fn as_any(&self) -> &dyn (::std::any::Any) {
-        self as &dyn (::std::any::Any)
-    }
-    fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) {
-        self as &mut dyn (::std::any::Any)
-    }
-    fn into_any(self: ::std::boxed::Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
-        self
-    }
-
-    fn descriptor(&self) -> &'static ::protobuf::reflect::MessageDescriptor {
-        Self::descriptor_static()
+    fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {
+        &mut self.special_fields
     }
 
     fn new() -> SecureMessage {
         SecureMessage::new()
     }
 
-    fn default_instance() -> &'static SecureMessage {
-        static instance: ::protobuf::rt::LazyV2<SecureMessage> = ::protobuf::rt::LazyV2::INIT;
-        instance.get(SecureMessage::new)
-    }
-}
-
-impl ::protobuf::Clear for SecureMessage {
     fn clear(&mut self) {
-        self.header_and_body.clear();
-        self.signature.clear();
-        self.unknown_fields.clear();
+        self.header_and_body = ::std::option::Option::None;
+        self.signature = ::std::option::Option::None;
+        self.special_fields.clear();
     }
-}
 
-impl ::protobuf::reflect::ProtobufValue for SecureMessage {
-    fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef {
-        ::protobuf::reflect::ReflectValueRef::Message(self)
+    fn default_instance() -> &'static SecureMessage {
+        static instance: SecureMessage = SecureMessage {
+            header_and_body: ::std::option::Option::None,
+            signature: ::std::option::Option::None,
+            special_fields: ::protobuf::SpecialFields::new(),
+        };
+        &instance
     }
 }
 
 #[derive(PartialEq,Clone,Default,Debug)]
+// @@protoc_insertion_point(message:securemessage.Header)
 pub struct Header {
     // message fields
-    signature_scheme: ::std::option::Option<SigScheme>,
-    encryption_scheme: ::std::option::Option<EncScheme>,
-    verification_key_id: ::protobuf::SingularField<::std::vec::Vec<u8>>,
-    decryption_key_id: ::protobuf::SingularField<::std::vec::Vec<u8>>,
-    iv: ::protobuf::SingularField<::std::vec::Vec<u8>>,
-    public_metadata: ::protobuf::SingularField<::std::vec::Vec<u8>>,
-    associated_data_length: ::std::option::Option<u32>,
+    // @@protoc_insertion_point(field:securemessage.Header.signature_scheme)
+    pub signature_scheme: ::std::option::Option<::protobuf::EnumOrUnknown<SigScheme>>,
+    // @@protoc_insertion_point(field:securemessage.Header.encryption_scheme)
+    pub encryption_scheme: ::std::option::Option<::protobuf::EnumOrUnknown<EncScheme>>,
+    // @@protoc_insertion_point(field:securemessage.Header.verification_key_id)
+    pub verification_key_id: ::std::option::Option<::std::vec::Vec<u8>>,
+    // @@protoc_insertion_point(field:securemessage.Header.decryption_key_id)
+    pub decryption_key_id: ::std::option::Option<::std::vec::Vec<u8>>,
+    // @@protoc_insertion_point(field:securemessage.Header.iv)
+    pub iv: ::std::option::Option<::std::vec::Vec<u8>>,
+    // @@protoc_insertion_point(field:securemessage.Header.public_metadata)
+    pub public_metadata: ::std::option::Option<::std::vec::Vec<u8>>,
+    // @@protoc_insertion_point(field:securemessage.Header.associated_data_length)
+    pub associated_data_length: ::std::option::Option<u32>,
+    // @@protoc_insertion_point(field:securemessage.Header.nonce)
+    pub nonce: ::std::option::Option<::std::vec::Vec<u8>>,
     // special fields
-    pub unknown_fields: ::protobuf::UnknownFields,
-    pub cached_size: ::protobuf::CachedSize,
+    // @@protoc_insertion_point(special_field:securemessage.Header.special_fields)
+    pub special_fields: ::protobuf::SpecialFields,
 }
 
 impl<'a> ::std::default::Default for &'a Header {
@@ -264,10 +259,13 @@
 
     // required .securemessage.SigScheme signature_scheme = 1;
 
-
-    pub fn get_signature_scheme(&self) -> SigScheme {
-        self.signature_scheme.unwrap_or(SigScheme::HMAC_SHA256)
+    pub fn signature_scheme(&self) -> SigScheme {
+        match self.signature_scheme {
+            Some(e) => e.enum_value_or(SigScheme::HMAC_SHA256),
+            None => SigScheme::HMAC_SHA256,
+        }
     }
+
     pub fn clear_signature_scheme(&mut self) {
         self.signature_scheme = ::std::option::Option::None;
     }
@@ -278,15 +276,18 @@
 
     // Param is passed by value, moved
     pub fn set_signature_scheme(&mut self, v: SigScheme) {
-        self.signature_scheme = ::std::option::Option::Some(v);
+        self.signature_scheme = ::std::option::Option::Some(::protobuf::EnumOrUnknown::new(v));
     }
 
     // required .securemessage.EncScheme encryption_scheme = 2;
 
-
-    pub fn get_encryption_scheme(&self) -> EncScheme {
-        self.encryption_scheme.unwrap_or(EncScheme::NONE)
+    pub fn encryption_scheme(&self) -> EncScheme {
+        match self.encryption_scheme {
+            Some(e) => e.enum_value_or(EncScheme::NONE),
+            None => EncScheme::NONE,
+        }
     }
+
     pub fn clear_encryption_scheme(&mut self) {
         self.encryption_scheme = ::std::option::Option::None;
     }
@@ -297,20 +298,20 @@
 
     // Param is passed by value, moved
     pub fn set_encryption_scheme(&mut self, v: EncScheme) {
-        self.encryption_scheme = ::std::option::Option::Some(v);
+        self.encryption_scheme = ::std::option::Option::Some(::protobuf::EnumOrUnknown::new(v));
     }
 
     // optional bytes verification_key_id = 3;
 
-
-    pub fn get_verification_key_id(&self) -> &[u8] {
+    pub fn verification_key_id(&self) -> &[u8] {
         match self.verification_key_id.as_ref() {
-            Some(v) => &v,
+            Some(v) => v,
             None => &[],
         }
     }
+
     pub fn clear_verification_key_id(&mut self) {
-        self.verification_key_id.clear();
+        self.verification_key_id = ::std::option::Option::None;
     }
 
     pub fn has_verification_key_id(&self) -> bool {
@@ -319,14 +320,14 @@
 
     // Param is passed by value, moved
     pub fn set_verification_key_id(&mut self, v: ::std::vec::Vec<u8>) {
-        self.verification_key_id = ::protobuf::SingularField::some(v);
+        self.verification_key_id = ::std::option::Option::Some(v);
     }
 
     // Mutable pointer to the field.
     // If field is not initialized, it is initialized with default value first.
     pub fn mut_verification_key_id(&mut self) -> &mut ::std::vec::Vec<u8> {
         if self.verification_key_id.is_none() {
-            self.verification_key_id.set_default();
+            self.verification_key_id = ::std::option::Option::Some(::std::vec::Vec::new());
         }
         self.verification_key_id.as_mut().unwrap()
     }
@@ -338,15 +339,15 @@
 
     // optional bytes decryption_key_id = 4;
 
-
-    pub fn get_decryption_key_id(&self) -> &[u8] {
+    pub fn decryption_key_id(&self) -> &[u8] {
         match self.decryption_key_id.as_ref() {
-            Some(v) => &v,
+            Some(v) => v,
             None => &[],
         }
     }
+
     pub fn clear_decryption_key_id(&mut self) {
-        self.decryption_key_id.clear();
+        self.decryption_key_id = ::std::option::Option::None;
     }
 
     pub fn has_decryption_key_id(&self) -> bool {
@@ -355,14 +356,14 @@
 
     // Param is passed by value, moved
     pub fn set_decryption_key_id(&mut self, v: ::std::vec::Vec<u8>) {
-        self.decryption_key_id = ::protobuf::SingularField::some(v);
+        self.decryption_key_id = ::std::option::Option::Some(v);
     }
 
     // Mutable pointer to the field.
     // If field is not initialized, it is initialized with default value first.
     pub fn mut_decryption_key_id(&mut self) -> &mut ::std::vec::Vec<u8> {
         if self.decryption_key_id.is_none() {
-            self.decryption_key_id.set_default();
+            self.decryption_key_id = ::std::option::Option::Some(::std::vec::Vec::new());
         }
         self.decryption_key_id.as_mut().unwrap()
     }
@@ -374,15 +375,15 @@
 
     // optional bytes iv = 5;
 
-
-    pub fn get_iv(&self) -> &[u8] {
+    pub fn iv(&self) -> &[u8] {
         match self.iv.as_ref() {
-            Some(v) => &v,
+            Some(v) => v,
             None => &[],
         }
     }
+
     pub fn clear_iv(&mut self) {
-        self.iv.clear();
+        self.iv = ::std::option::Option::None;
     }
 
     pub fn has_iv(&self) -> bool {
@@ -391,14 +392,14 @@
 
     // Param is passed by value, moved
     pub fn set_iv(&mut self, v: ::std::vec::Vec<u8>) {
-        self.iv = ::protobuf::SingularField::some(v);
+        self.iv = ::std::option::Option::Some(v);
     }
 
     // Mutable pointer to the field.
     // If field is not initialized, it is initialized with default value first.
     pub fn mut_iv(&mut self) -> &mut ::std::vec::Vec<u8> {
         if self.iv.is_none() {
-            self.iv.set_default();
+            self.iv = ::std::option::Option::Some(::std::vec::Vec::new());
         }
         self.iv.as_mut().unwrap()
     }
@@ -410,15 +411,15 @@
 
     // optional bytes public_metadata = 6;
 
-
-    pub fn get_public_metadata(&self) -> &[u8] {
+    pub fn public_metadata(&self) -> &[u8] {
         match self.public_metadata.as_ref() {
-            Some(v) => &v,
+            Some(v) => v,
             None => &[],
         }
     }
+
     pub fn clear_public_metadata(&mut self) {
-        self.public_metadata.clear();
+        self.public_metadata = ::std::option::Option::None;
     }
 
     pub fn has_public_metadata(&self) -> bool {
@@ -427,14 +428,14 @@
 
     // Param is passed by value, moved
     pub fn set_public_metadata(&mut self, v: ::std::vec::Vec<u8>) {
-        self.public_metadata = ::protobuf::SingularField::some(v);
+        self.public_metadata = ::std::option::Option::Some(v);
     }
 
     // Mutable pointer to the field.
     // If field is not initialized, it is initialized with default value first.
     pub fn mut_public_metadata(&mut self) -> &mut ::std::vec::Vec<u8> {
         if self.public_metadata.is_none() {
-            self.public_metadata.set_default();
+            self.public_metadata = ::std::option::Option::Some(::std::vec::Vec::new());
         }
         self.public_metadata.as_mut().unwrap()
     }
@@ -446,10 +447,10 @@
 
     // optional uint32 associated_data_length = 7;
 
-
-    pub fn get_associated_data_length(&self) -> u32 {
+    pub fn associated_data_length(&self) -> u32 {
         self.associated_data_length.unwrap_or(0u32)
     }
+
     pub fn clear_associated_data_length(&mut self) {
         self.associated_data_length = ::std::option::Option::None;
     }
@@ -462,9 +463,47 @@
     pub fn set_associated_data_length(&mut self, v: u32) {
         self.associated_data_length = ::std::option::Option::Some(v);
     }
+
+    // optional bytes nonce = 8;
+
+    pub fn nonce(&self) -> &[u8] {
+        match self.nonce.as_ref() {
+            Some(v) => v,
+            None => &[],
+        }
+    }
+
+    pub fn clear_nonce(&mut self) {
+        self.nonce = ::std::option::Option::None;
+    }
+
+    pub fn has_nonce(&self) -> bool {
+        self.nonce.is_some()
+    }
+
+    // Param is passed by value, moved
+    pub fn set_nonce(&mut self, v: ::std::vec::Vec<u8>) {
+        self.nonce = ::std::option::Option::Some(v);
+    }
+
+    // Mutable pointer to the field.
+    // If field is not initialized, it is initialized with default value first.
+    pub fn mut_nonce(&mut self) -> &mut ::std::vec::Vec<u8> {
+        if self.nonce.is_none() {
+            self.nonce = ::std::option::Option::Some(::std::vec::Vec::new());
+        }
+        self.nonce.as_mut().unwrap()
+    }
+
+    // Take field
+    pub fn take_nonce(&mut self) -> ::std::vec::Vec<u8> {
+        self.nonce.take().unwrap_or_else(|| ::std::vec::Vec::new())
+    }
 }
 
 impl ::protobuf::Message for Header {
+    const NAME: &'static str = "Header";
+
     fn is_initialized(&self) -> bool {
         if self.signature_scheme.is_none() {
             return false;
@@ -475,37 +514,35 @@
         true
     }
 
-    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::ProtobufResult<()> {
-        while !is.eof()? {
-            let (field_number, wire_type) = is.read_tag_unpack()?;
-            match field_number {
-                1 => {
-                    ::protobuf::rt::read_proto2_enum_with_unknown_fields_into(wire_type, is, &mut self.signature_scheme, 1, &mut self.unknown_fields)?
+    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {
+        while let Some(tag) = is.read_raw_tag_or_eof()? {
+            match tag {
+                8 => {
+                    self.signature_scheme = ::std::option::Option::Some(is.read_enum_or_unknown()?);
                 },
-                2 => {
-                    ::protobuf::rt::read_proto2_enum_with_unknown_fields_into(wire_type, is, &mut self.encryption_scheme, 2, &mut self.unknown_fields)?
+                16 => {
+                    self.encryption_scheme = ::std::option::Option::Some(is.read_enum_or_unknown()?);
                 },
-                3 => {
-                    ::protobuf::rt::read_singular_bytes_into(wire_type, is, &mut self.verification_key_id)?;
+                26 => {
+                    self.verification_key_id = ::std::option::Option::Some(is.read_bytes()?);
                 },
-                4 => {
-                    ::protobuf::rt::read_singular_bytes_into(wire_type, is, &mut self.decryption_key_id)?;
+                34 => {
+                    self.decryption_key_id = ::std::option::Option::Some(is.read_bytes()?);
                 },
-                5 => {
-                    ::protobuf::rt::read_singular_bytes_into(wire_type, is, &mut self.iv)?;
+                42 => {
+                    self.iv = ::std::option::Option::Some(is.read_bytes()?);
                 },
-                6 => {
-                    ::protobuf::rt::read_singular_bytes_into(wire_type, is, &mut self.public_metadata)?;
+                50 => {
+                    self.public_metadata = ::std::option::Option::Some(is.read_bytes()?);
                 },
-                7 => {
-                    if wire_type != ::protobuf::wire_format::WireTypeVarint {
-                        return ::std::result::Result::Err(::protobuf::rt::unexpected_wire_type(wire_type));
-                    }
-                    let tmp = is.read_uint32()?;
-                    self.associated_data_length = ::std::option::Option::Some(tmp);
+                56 => {
+                    self.associated_data_length = ::std::option::Option::Some(is.read_uint32()?);
                 },
-                _ => {
-                    ::protobuf::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?;
+                66 => {
+                    self.nonce = ::std::option::Option::Some(is.read_bytes()?);
+                },
+                tag => {
+                    ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;
                 },
             };
         }
@@ -514,123 +551,117 @@
 
     // Compute sizes of nested messages
     #[allow(unused_variables)]
-    fn compute_size(&self) -> u32 {
+    fn compute_size(&self) -> u64 {
         let mut my_size = 0;
         if let Some(v) = self.signature_scheme {
-            my_size += ::protobuf::rt::enum_size(1, v);
+            my_size += ::protobuf::rt::int32_size(1, v.value());
         }
         if let Some(v) = self.encryption_scheme {
-            my_size += ::protobuf::rt::enum_size(2, v);
+            my_size += ::protobuf::rt::int32_size(2, v.value());
         }
-        if let Some(ref v) = self.verification_key_id.as_ref() {
+        if let Some(v) = self.verification_key_id.as_ref() {
             my_size += ::protobuf::rt::bytes_size(3, &v);
         }
-        if let Some(ref v) = self.decryption_key_id.as_ref() {
+        if let Some(v) = self.decryption_key_id.as_ref() {
             my_size += ::protobuf::rt::bytes_size(4, &v);
         }
-        if let Some(ref v) = self.iv.as_ref() {
+        if let Some(v) = self.iv.as_ref() {
             my_size += ::protobuf::rt::bytes_size(5, &v);
         }
-        if let Some(ref v) = self.public_metadata.as_ref() {
+        if let Some(v) = self.public_metadata.as_ref() {
             my_size += ::protobuf::rt::bytes_size(6, &v);
         }
         if let Some(v) = self.associated_data_length {
-            my_size += ::protobuf::rt::value_size(7, v, ::protobuf::wire_format::WireTypeVarint);
+            my_size += ::protobuf::rt::uint32_size(7, v);
         }
-        my_size += ::protobuf::rt::unknown_fields_size(self.get_unknown_fields());
-        self.cached_size.set(my_size);
+        if let Some(v) = self.nonce.as_ref() {
+            my_size += ::protobuf::rt::bytes_size(8, &v);
+        }
+        my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());
+        self.special_fields.cached_size().set(my_size as u32);
         my_size
     }
 
-    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::ProtobufResult<()> {
+    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {
         if let Some(v) = self.signature_scheme {
-            os.write_enum(1, ::protobuf::ProtobufEnum::value(&v))?;
+            os.write_enum(1, ::protobuf::EnumOrUnknown::value(&v))?;
         }
         if let Some(v) = self.encryption_scheme {
-            os.write_enum(2, ::protobuf::ProtobufEnum::value(&v))?;
+            os.write_enum(2, ::protobuf::EnumOrUnknown::value(&v))?;
         }
-        if let Some(ref v) = self.verification_key_id.as_ref() {
-            os.write_bytes(3, &v)?;
+        if let Some(v) = self.verification_key_id.as_ref() {
+            os.write_bytes(3, v)?;
         }
-        if let Some(ref v) = self.decryption_key_id.as_ref() {
-            os.write_bytes(4, &v)?;
+        if let Some(v) = self.decryption_key_id.as_ref() {
+            os.write_bytes(4, v)?;
         }
-        if let Some(ref v) = self.iv.as_ref() {
-            os.write_bytes(5, &v)?;
+        if let Some(v) = self.iv.as_ref() {
+            os.write_bytes(5, v)?;
         }
-        if let Some(ref v) = self.public_metadata.as_ref() {
-            os.write_bytes(6, &v)?;
+        if let Some(v) = self.public_metadata.as_ref() {
+            os.write_bytes(6, v)?;
         }
         if let Some(v) = self.associated_data_length {
             os.write_uint32(7, v)?;
         }
-        os.write_unknown_fields(self.get_unknown_fields())?;
+        if let Some(v) = self.nonce.as_ref() {
+            os.write_bytes(8, v)?;
+        }
+        os.write_unknown_fields(self.special_fields.unknown_fields())?;
         ::std::result::Result::Ok(())
     }
 
-    fn get_cached_size(&self) -> u32 {
-        self.cached_size.get()
+    fn special_fields(&self) -> &::protobuf::SpecialFields {
+        &self.special_fields
     }
 
-    fn get_unknown_fields(&self) -> &::protobuf::UnknownFields {
-        &self.unknown_fields
-    }
-
-    fn mut_unknown_fields(&mut self) -> &mut ::protobuf::UnknownFields {
-        &mut self.unknown_fields
-    }
-
-    fn as_any(&self) -> &dyn (::std::any::Any) {
-        self as &dyn (::std::any::Any)
-    }
-    fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) {
-        self as &mut dyn (::std::any::Any)
-    }
-    fn into_any(self: ::std::boxed::Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
-        self
-    }
-
-    fn descriptor(&self) -> &'static ::protobuf::reflect::MessageDescriptor {
-        Self::descriptor_static()
+    fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {
+        &mut self.special_fields
     }
 
     fn new() -> Header {
         Header::new()
     }
 
-    fn default_instance() -> &'static Header {
-        static instance: ::protobuf::rt::LazyV2<Header> = ::protobuf::rt::LazyV2::INIT;
-        instance.get(Header::new)
-    }
-}
-
-impl ::protobuf::Clear for Header {
     fn clear(&mut self) {
         self.signature_scheme = ::std::option::Option::None;
         self.encryption_scheme = ::std::option::Option::None;
-        self.verification_key_id.clear();
-        self.decryption_key_id.clear();
-        self.iv.clear();
-        self.public_metadata.clear();
+        self.verification_key_id = ::std::option::Option::None;
+        self.decryption_key_id = ::std::option::Option::None;
+        self.iv = ::std::option::Option::None;
+        self.public_metadata = ::std::option::Option::None;
         self.associated_data_length = ::std::option::Option::None;
-        self.unknown_fields.clear();
+        self.nonce = ::std::option::Option::None;
+        self.special_fields.clear();
     }
-}
 
-impl ::protobuf::reflect::ProtobufValue for Header {
-    fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef {
-        ::protobuf::reflect::ReflectValueRef::Message(self)
+    fn default_instance() -> &'static Header {
+        static instance: Header = Header {
+            signature_scheme: ::std::option::Option::None,
+            encryption_scheme: ::std::option::Option::None,
+            verification_key_id: ::std::option::Option::None,
+            decryption_key_id: ::std::option::Option::None,
+            iv: ::std::option::Option::None,
+            public_metadata: ::std::option::Option::None,
+            associated_data_length: ::std::option::Option::None,
+            nonce: ::std::option::Option::None,
+            special_fields: ::protobuf::SpecialFields::new(),
+        };
+        &instance
     }
 }
 
 #[derive(PartialEq,Clone,Default,Debug)]
+// @@protoc_insertion_point(message:securemessage.HeaderAndBody)
 pub struct HeaderAndBody {
     // message fields
-    pub header: ::protobuf::SingularPtrField<Header>,
-    body: ::protobuf::SingularField<::std::vec::Vec<u8>>,
+    // @@protoc_insertion_point(field:securemessage.HeaderAndBody.header)
+    pub header: ::protobuf::MessageField<Header>,
+    // @@protoc_insertion_point(field:securemessage.HeaderAndBody.body)
+    pub body: ::std::option::Option<::std::vec::Vec<u8>>,
     // special fields
-    pub unknown_fields: ::protobuf::UnknownFields,
-    pub cached_size: ::protobuf::CachedSize,
+    // @@protoc_insertion_point(special_field:securemessage.HeaderAndBody.special_fields)
+    pub special_fields: ::protobuf::SpecialFields,
 }
 
 impl<'a> ::std::default::Default for &'a HeaderAndBody {
@@ -644,50 +675,17 @@
         ::std::default::Default::default()
     }
 
-    // required .securemessage.Header header = 1;
-
-
-    pub fn get_header(&self) -> &Header {
-        self.header.as_ref().unwrap_or_else(|| <Header as ::protobuf::Message>::default_instance())
-    }
-    pub fn clear_header(&mut self) {
-        self.header.clear();
-    }
-
-    pub fn has_header(&self) -> bool {
-        self.header.is_some()
-    }
-
-    // Param is passed by value, moved
-    pub fn set_header(&mut self, v: Header) {
-        self.header = ::protobuf::SingularPtrField::some(v);
-    }
-
-    // Mutable pointer to the field.
-    // If field is not initialized, it is initialized with default value first.
-    pub fn mut_header(&mut self) -> &mut Header {
-        if self.header.is_none() {
-            self.header.set_default();
-        }
-        self.header.as_mut().unwrap()
-    }
-
-    // Take field
-    pub fn take_header(&mut self) -> Header {
-        self.header.take().unwrap_or_else(|| Header::new())
-    }
-
     // required bytes body = 2;
 
-
-    pub fn get_body(&self) -> &[u8] {
+    pub fn body(&self) -> &[u8] {
         match self.body.as_ref() {
-            Some(v) => &v,
+            Some(v) => v,
             None => &[],
         }
     }
+
     pub fn clear_body(&mut self) {
-        self.body.clear();
+        self.body = ::std::option::Option::None;
     }
 
     pub fn has_body(&self) -> bool {
@@ -696,14 +694,14 @@
 
     // Param is passed by value, moved
     pub fn set_body(&mut self, v: ::std::vec::Vec<u8>) {
-        self.body = ::protobuf::SingularField::some(v);
+        self.body = ::std::option::Option::Some(v);
     }
 
     // Mutable pointer to the field.
     // If field is not initialized, it is initialized with default value first.
     pub fn mut_body(&mut self) -> &mut ::std::vec::Vec<u8> {
         if self.body.is_none() {
-            self.body.set_default();
+            self.body = ::std::option::Option::Some(::std::vec::Vec::new());
         }
         self.body.as_mut().unwrap()
     }
@@ -715,6 +713,8 @@
 }
 
 impl ::protobuf::Message for HeaderAndBody {
+    const NAME: &'static str = "HeaderAndBody";
+
     fn is_initialized(&self) -> bool {
         if self.header.is_none() {
             return false;
@@ -730,18 +730,17 @@
         true
     }
 
-    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::ProtobufResult<()> {
-        while !is.eof()? {
-            let (field_number, wire_type) = is.read_tag_unpack()?;
-            match field_number {
-                1 => {
-                    ::protobuf::rt::read_singular_message_into(wire_type, is, &mut self.header)?;
+    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {
+        while let Some(tag) = is.read_raw_tag_or_eof()? {
+            match tag {
+                10 => {
+                    ::protobuf::rt::read_singular_message_into_field(is, &mut self.header)?;
                 },
-                2 => {
-                    ::protobuf::rt::read_singular_bytes_into(wire_type, is, &mut self.body)?;
+                18 => {
+                    self.body = ::std::option::Option::Some(is.read_bytes()?);
                 },
-                _ => {
-                    ::protobuf::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?;
+                tag => {
+                    ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;
                 },
             };
         }
@@ -750,91 +749,70 @@
 
     // Compute sizes of nested messages
     #[allow(unused_variables)]
-    fn compute_size(&self) -> u32 {
+    fn compute_size(&self) -> u64 {
         let mut my_size = 0;
-        if let Some(ref v) = self.header.as_ref() {
+        if let Some(v) = self.header.as_ref() {
             let len = v.compute_size();
-            my_size += 1 + ::protobuf::rt::compute_raw_varint32_size(len) + len;
+            my_size += 1 + ::protobuf::rt::compute_raw_varint64_size(len) + len;
         }
-        if let Some(ref v) = self.body.as_ref() {
+        if let Some(v) = self.body.as_ref() {
             my_size += ::protobuf::rt::bytes_size(2, &v);
         }
-        my_size += ::protobuf::rt::unknown_fields_size(self.get_unknown_fields());
-        self.cached_size.set(my_size);
+        my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());
+        self.special_fields.cached_size().set(my_size as u32);
         my_size
     }
 
-    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::ProtobufResult<()> {
-        if let Some(ref v) = self.header.as_ref() {
-            os.write_tag(1, ::protobuf::wire_format::WireTypeLengthDelimited)?;
-            os.write_raw_varint32(v.get_cached_size())?;
-            v.write_to_with_cached_sizes(os)?;
+    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {
+        if let Some(v) = self.header.as_ref() {
+            ::protobuf::rt::write_message_field_with_cached_size(1, v, os)?;
         }
-        if let Some(ref v) = self.body.as_ref() {
-            os.write_bytes(2, &v)?;
+        if let Some(v) = self.body.as_ref() {
+            os.write_bytes(2, v)?;
         }
-        os.write_unknown_fields(self.get_unknown_fields())?;
+        os.write_unknown_fields(self.special_fields.unknown_fields())?;
         ::std::result::Result::Ok(())
     }
 
-    fn get_cached_size(&self) -> u32 {
-        self.cached_size.get()
+    fn special_fields(&self) -> &::protobuf::SpecialFields {
+        &self.special_fields
     }
 
-    fn get_unknown_fields(&self) -> &::protobuf::UnknownFields {
-        &self.unknown_fields
-    }
-
-    fn mut_unknown_fields(&mut self) -> &mut ::protobuf::UnknownFields {
-        &mut self.unknown_fields
-    }
-
-    fn as_any(&self) -> &dyn (::std::any::Any) {
-        self as &dyn (::std::any::Any)
-    }
-    fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) {
-        self as &mut dyn (::std::any::Any)
-    }
-    fn into_any(self: ::std::boxed::Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
-        self
-    }
-
-    fn descriptor(&self) -> &'static ::protobuf::reflect::MessageDescriptor {
-        Self::descriptor_static()
+    fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {
+        &mut self.special_fields
     }
 
     fn new() -> HeaderAndBody {
         HeaderAndBody::new()
     }
 
-    fn default_instance() -> &'static HeaderAndBody {
-        static instance: ::protobuf::rt::LazyV2<HeaderAndBody> = ::protobuf::rt::LazyV2::INIT;
-        instance.get(HeaderAndBody::new)
-    }
-}
-
-impl ::protobuf::Clear for HeaderAndBody {
     fn clear(&mut self) {
         self.header.clear();
-        self.body.clear();
-        self.unknown_fields.clear();
+        self.body = ::std::option::Option::None;
+        self.special_fields.clear();
     }
-}
 
-impl ::protobuf::reflect::ProtobufValue for HeaderAndBody {
-    fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef {
-        ::protobuf::reflect::ReflectValueRef::Message(self)
+    fn default_instance() -> &'static HeaderAndBody {
+        static instance: HeaderAndBody = HeaderAndBody {
+            header: ::protobuf::MessageField::none(),
+            body: ::std::option::Option::None,
+            special_fields: ::protobuf::SpecialFields::new(),
+        };
+        &instance
     }
 }
 
 #[derive(PartialEq,Clone,Default,Debug)]
+// @@protoc_insertion_point(message:securemessage.HeaderAndBodyInternal)
 pub struct HeaderAndBodyInternal {
     // message fields
-    header: ::protobuf::SingularField<::std::vec::Vec<u8>>,
-    body: ::protobuf::SingularField<::std::vec::Vec<u8>>,
+    // @@protoc_insertion_point(field:securemessage.HeaderAndBodyInternal.header)
+    pub header: ::std::option::Option<::std::vec::Vec<u8>>,
+    // @@protoc_insertion_point(field:securemessage.HeaderAndBodyInternal.body)
+    pub body: ::std::option::Option<::std::vec::Vec<u8>>,
     // special fields
-    pub unknown_fields: ::protobuf::UnknownFields,
-    pub cached_size: ::protobuf::CachedSize,
+    // @@protoc_insertion_point(special_field:securemessage.HeaderAndBodyInternal.special_fields)
+    pub special_fields: ::protobuf::SpecialFields,
 }
 
 impl<'a> ::std::default::Default for &'a HeaderAndBodyInternal {
@@ -850,15 +828,15 @@
 
     // required bytes header = 1;
 
-
-    pub fn get_header(&self) -> &[u8] {
+    pub fn header(&self) -> &[u8] {
         match self.header.as_ref() {
-            Some(v) => &v,
+            Some(v) => v,
             None => &[],
         }
     }
+
     pub fn clear_header(&mut self) {
-        self.header.clear();
+        self.header = ::std::option::Option::None;
     }
 
     pub fn has_header(&self) -> bool {
@@ -867,14 +845,14 @@
 
     // Param is passed by value, moved
     pub fn set_header(&mut self, v: ::std::vec::Vec<u8>) {
-        self.header = ::protobuf::SingularField::some(v);
+        self.header = ::std::option::Option::Some(v);
     }
 
     // Mutable pointer to the field.
     // If field is not initialized, it is initialized with default value first.
     pub fn mut_header(&mut self) -> &mut ::std::vec::Vec<u8> {
         if self.header.is_none() {
-            self.header.set_default();
+            self.header = ::std::option::Option::Some(::std::vec::Vec::new());
         }
         self.header.as_mut().unwrap()
     }
@@ -886,15 +864,15 @@
 
     // required bytes body = 2;
 
-
-    pub fn get_body(&self) -> &[u8] {
+    pub fn body(&self) -> &[u8] {
         match self.body.as_ref() {
-            Some(v) => &v,
+            Some(v) => v,
             None => &[],
         }
     }
+
     pub fn clear_body(&mut self) {
-        self.body.clear();
+        self.body = ::std::option::Option::None;
     }
 
     pub fn has_body(&self) -> bool {
@@ -903,14 +881,14 @@
 
     // Param is passed by value, moved
     pub fn set_body(&mut self, v: ::std::vec::Vec<u8>) {
-        self.body = ::protobuf::SingularField::some(v);
+        self.body = ::std::option::Option::Some(v);
     }
 
     // Mutable pointer to the field.
     // If field is not initialized, it is initialized with default value first.
     pub fn mut_body(&mut self) -> &mut ::std::vec::Vec<u8> {
         if self.body.is_none() {
-            self.body.set_default();
+            self.body = ::std::option::Option::Some(::std::vec::Vec::new());
         }
         self.body.as_mut().unwrap()
     }
@@ -922,6 +900,8 @@
 }
 
 impl ::protobuf::Message for HeaderAndBodyInternal {
+    const NAME: &'static str = "HeaderAndBodyInternal";
+
     fn is_initialized(&self) -> bool {
         if self.header.is_none() {
             return false;
@@ -932,18 +912,17 @@
         true
     }
 
-    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::ProtobufResult<()> {
-        while !is.eof()? {
-            let (field_number, wire_type) = is.read_tag_unpack()?;
-            match field_number {
-                1 => {
-                    ::protobuf::rt::read_singular_bytes_into(wire_type, is, &mut self.header)?;
+    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {
+        while let Some(tag) = is.read_raw_tag_or_eof()? {
+            match tag {
+                10 => {
+                    self.header = ::std::option::Option::Some(is.read_bytes()?);
                 },
-                2 => {
-                    ::protobuf::rt::read_singular_bytes_into(wire_type, is, &mut self.body)?;
+                18 => {
+                    self.body = ::std::option::Option::Some(is.read_bytes()?);
                 },
-                _ => {
-                    ::protobuf::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?;
+                tag => {
+                    ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;
                 },
             };
         }
@@ -952,88 +931,69 @@
 
     // Compute sizes of nested messages
     #[allow(unused_variables)]
-    fn compute_size(&self) -> u32 {
+    fn compute_size(&self) -> u64 {
         let mut my_size = 0;
-        if let Some(ref v) = self.header.as_ref() {
+        if let Some(v) = self.header.as_ref() {
             my_size += ::protobuf::rt::bytes_size(1, &v);
         }
-        if let Some(ref v) = self.body.as_ref() {
+        if let Some(v) = self.body.as_ref() {
             my_size += ::protobuf::rt::bytes_size(2, &v);
         }
-        my_size += ::protobuf::rt::unknown_fields_size(self.get_unknown_fields());
-        self.cached_size.set(my_size);
+        my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());
+        self.special_fields.cached_size().set(my_size as u32);
         my_size
     }
 
-    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::ProtobufResult<()> {
-        if let Some(ref v) = self.header.as_ref() {
-            os.write_bytes(1, &v)?;
+    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {
+        if let Some(v) = self.header.as_ref() {
+            os.write_bytes(1, v)?;
         }
-        if let Some(ref v) = self.body.as_ref() {
-            os.write_bytes(2, &v)?;
+        if let Some(v) = self.body.as_ref() {
+            os.write_bytes(2, v)?;
         }
-        os.write_unknown_fields(self.get_unknown_fields())?;
+        os.write_unknown_fields(self.special_fields.unknown_fields())?;
         ::std::result::Result::Ok(())
     }
 
-    fn get_cached_size(&self) -> u32 {
-        self.cached_size.get()
+    fn special_fields(&self) -> &::protobuf::SpecialFields {
+        &self.special_fields
     }
 
-    fn get_unknown_fields(&self) -> &::protobuf::UnknownFields {
-        &self.unknown_fields
-    }
-
-    fn mut_unknown_fields(&mut self) -> &mut ::protobuf::UnknownFields {
-        &mut self.unknown_fields
-    }
-
-    fn as_any(&self) -> &dyn (::std::any::Any) {
-        self as &dyn (::std::any::Any)
-    }
-    fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) {
-        self as &mut dyn (::std::any::Any)
-    }
-    fn into_any(self: ::std::boxed::Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
-        self
-    }
-
-    fn descriptor(&self) -> &'static ::protobuf::reflect::MessageDescriptor {
-        Self::descriptor_static()
+    fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {
+        &mut self.special_fields
     }
 
     fn new() -> HeaderAndBodyInternal {
         HeaderAndBodyInternal::new()
     }
 
-    fn default_instance() -> &'static HeaderAndBodyInternal {
-        static instance: ::protobuf::rt::LazyV2<HeaderAndBodyInternal> = ::protobuf::rt::LazyV2::INIT;
-        instance.get(HeaderAndBodyInternal::new)
-    }
-}
-
-impl ::protobuf::Clear for HeaderAndBodyInternal {
     fn clear(&mut self) {
-        self.header.clear();
-        self.body.clear();
-        self.unknown_fields.clear();
+        self.header = ::std::option::Option::None;
+        self.body = ::std::option::Option::None;
+        self.special_fields.clear();
     }
-}
 
-impl ::protobuf::reflect::ProtobufValue for HeaderAndBodyInternal {
-    fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef {
-        ::protobuf::reflect::ReflectValueRef::Message(self)
+    fn default_instance() -> &'static HeaderAndBodyInternal {
+        static instance: HeaderAndBodyInternal = HeaderAndBodyInternal {
+            header: ::std::option::Option::None,
+            body: ::std::option::Option::None,
+            special_fields: ::protobuf::SpecialFields::new(),
+        };
+        &instance
     }
 }
 
 #[derive(PartialEq,Clone,Default,Debug)]
+// @@protoc_insertion_point(message:securemessage.EcP256PublicKey)
 pub struct EcP256PublicKey {
     // message fields
-    x: ::protobuf::SingularField<::std::vec::Vec<u8>>,
-    y: ::protobuf::SingularField<::std::vec::Vec<u8>>,
+    // @@protoc_insertion_point(field:securemessage.EcP256PublicKey.x)
+    pub x: ::std::option::Option<::std::vec::Vec<u8>>,
+    // @@protoc_insertion_point(field:securemessage.EcP256PublicKey.y)
+    pub y: ::std::option::Option<::std::vec::Vec<u8>>,
     // special fields
-    pub unknown_fields: ::protobuf::UnknownFields,
-    pub cached_size: ::protobuf::CachedSize,
+    // @@protoc_insertion_point(special_field:securemessage.EcP256PublicKey.special_fields)
+    pub special_fields: ::protobuf::SpecialFields,
 }
 
 impl<'a> ::std::default::Default for &'a EcP256PublicKey {
@@ -1049,15 +1009,15 @@
 
     // required bytes x = 1;
 
-
-    pub fn get_x(&self) -> &[u8] {
+    pub fn x(&self) -> &[u8] {
         match self.x.as_ref() {
-            Some(v) => &v,
+            Some(v) => v,
             None => &[],
         }
     }
+
     pub fn clear_x(&mut self) {
-        self.x.clear();
+        self.x = ::std::option::Option::None;
     }
 
     pub fn has_x(&self) -> bool {
@@ -1066,14 +1026,14 @@
 
     // Param is passed by value, moved
     pub fn set_x(&mut self, v: ::std::vec::Vec<u8>) {
-        self.x = ::protobuf::SingularField::some(v);
+        self.x = ::std::option::Option::Some(v);
     }
 
     // Mutable pointer to the field.
     // If field is not initialized, it is initialized with default value first.
     pub fn mut_x(&mut self) -> &mut ::std::vec::Vec<u8> {
         if self.x.is_none() {
-            self.x.set_default();
+            self.x = ::std::option::Option::Some(::std::vec::Vec::new());
         }
         self.x.as_mut().unwrap()
     }
@@ -1085,15 +1045,15 @@
 
     // required bytes y = 2;
 
-
-    pub fn get_y(&self) -> &[u8] {
+    pub fn y(&self) -> &[u8] {
         match self.y.as_ref() {
-            Some(v) => &v,
+            Some(v) => v,
             None => &[],
         }
     }
+
     pub fn clear_y(&mut self) {
-        self.y.clear();
+        self.y = ::std::option::Option::None;
     }
 
     pub fn has_y(&self) -> bool {
@@ -1102,14 +1062,14 @@
 
     // Param is passed by value, moved
     pub fn set_y(&mut self, v: ::std::vec::Vec<u8>) {
-        self.y = ::protobuf::SingularField::some(v);
+        self.y = ::std::option::Option::Some(v);
     }
 
     // Mutable pointer to the field.
     // If field is not initialized, it is initialized with default value first.
     pub fn mut_y(&mut self) -> &mut ::std::vec::Vec<u8> {
         if self.y.is_none() {
-            self.y.set_default();
+            self.y = ::std::option::Option::Some(::std::vec::Vec::new());
         }
         self.y.as_mut().unwrap()
     }
@@ -1121,6 +1081,8 @@
 }
 
 impl ::protobuf::Message for EcP256PublicKey {
+    const NAME: &'static str = "EcP256PublicKey";
+
     fn is_initialized(&self) -> bool {
         if self.x.is_none() {
             return false;
@@ -1131,18 +1093,17 @@
         true
     }
 
-    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::ProtobufResult<()> {
-        while !is.eof()? {
-            let (field_number, wire_type) = is.read_tag_unpack()?;
-            match field_number {
-                1 => {
-                    ::protobuf::rt::read_singular_bytes_into(wire_type, is, &mut self.x)?;
+    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {
+        while let Some(tag) = is.read_raw_tag_or_eof()? {
+            match tag {
+                10 => {
+                    self.x = ::std::option::Option::Some(is.read_bytes()?);
                 },
-                2 => {
-                    ::protobuf::rt::read_singular_bytes_into(wire_type, is, &mut self.y)?;
+                18 => {
+                    self.y = ::std::option::Option::Some(is.read_bytes()?);
                 },
-                _ => {
-                    ::protobuf::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?;
+                tag => {
+                    ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;
                 },
             };
         }
@@ -1151,88 +1112,69 @@
 
     // Compute sizes of nested messages
     #[allow(unused_variables)]
-    fn compute_size(&self) -> u32 {
+    fn compute_size(&self) -> u64 {
         let mut my_size = 0;
-        if let Some(ref v) = self.x.as_ref() {
+        if let Some(v) = self.x.as_ref() {
             my_size += ::protobuf::rt::bytes_size(1, &v);
         }
-        if let Some(ref v) = self.y.as_ref() {
+        if let Some(v) = self.y.as_ref() {
             my_size += ::protobuf::rt::bytes_size(2, &v);
         }
-        my_size += ::protobuf::rt::unknown_fields_size(self.get_unknown_fields());
-        self.cached_size.set(my_size);
+        my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());
+        self.special_fields.cached_size().set(my_size as u32);
         my_size
     }
 
-    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::ProtobufResult<()> {
-        if let Some(ref v) = self.x.as_ref() {
-            os.write_bytes(1, &v)?;
+    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {
+        if let Some(v) = self.x.as_ref() {
+            os.write_bytes(1, v)?;
         }
-        if let Some(ref v) = self.y.as_ref() {
-            os.write_bytes(2, &v)?;
+        if let Some(v) = self.y.as_ref() {
+            os.write_bytes(2, v)?;
         }
-        os.write_unknown_fields(self.get_unknown_fields())?;
+        os.write_unknown_fields(self.special_fields.unknown_fields())?;
         ::std::result::Result::Ok(())
     }
 
-    fn get_cached_size(&self) -> u32 {
-        self.cached_size.get()
+    fn special_fields(&self) -> &::protobuf::SpecialFields {
+        &self.special_fields
     }
 
-    fn get_unknown_fields(&self) -> &::protobuf::UnknownFields {
-        &self.unknown_fields
-    }
-
-    fn mut_unknown_fields(&mut self) -> &mut ::protobuf::UnknownFields {
-        &mut self.unknown_fields
-    }
-
-    fn as_any(&self) -> &dyn (::std::any::Any) {
-        self as &dyn (::std::any::Any)
-    }
-    fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) {
-        self as &mut dyn (::std::any::Any)
-    }
-    fn into_any(self: ::std::boxed::Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
-        self
-    }
-
-    fn descriptor(&self) -> &'static ::protobuf::reflect::MessageDescriptor {
-        Self::descriptor_static()
+    fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {
+        &mut self.special_fields
     }
 
     fn new() -> EcP256PublicKey {
         EcP256PublicKey::new()
     }
 
-    fn default_instance() -> &'static EcP256PublicKey {
-        static instance: ::protobuf::rt::LazyV2<EcP256PublicKey> = ::protobuf::rt::LazyV2::INIT;
-        instance.get(EcP256PublicKey::new)
-    }
-}
-
-impl ::protobuf::Clear for EcP256PublicKey {
     fn clear(&mut self) {
-        self.x.clear();
-        self.y.clear();
-        self.unknown_fields.clear();
+        self.x = ::std::option::Option::None;
+        self.y = ::std::option::Option::None;
+        self.special_fields.clear();
     }
-}
 
-impl ::protobuf::reflect::ProtobufValue for EcP256PublicKey {
-    fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef {
-        ::protobuf::reflect::ReflectValueRef::Message(self)
+    fn default_instance() -> &'static EcP256PublicKey {
+        static instance: EcP256PublicKey = EcP256PublicKey {
+            x: ::std::option::Option::None,
+            y: ::std::option::Option::None,
+            special_fields: ::protobuf::SpecialFields::new(),
+        };
+        &instance
     }
 }
 
 #[derive(PartialEq,Clone,Default,Debug)]
+// @@protoc_insertion_point(message:securemessage.SimpleRsaPublicKey)
 pub struct SimpleRsaPublicKey {
     // message fields
-    n: ::protobuf::SingularField<::std::vec::Vec<u8>>,
-    e: ::std::option::Option<i32>,
+    // @@protoc_insertion_point(field:securemessage.SimpleRsaPublicKey.n)
+    pub n: ::std::option::Option<::std::vec::Vec<u8>>,
+    // @@protoc_insertion_point(field:securemessage.SimpleRsaPublicKey.e)
+    pub e: ::std::option::Option<i32>,
     // special fields
-    pub unknown_fields: ::protobuf::UnknownFields,
-    pub cached_size: ::protobuf::CachedSize,
+    // @@protoc_insertion_point(special_field:securemessage.SimpleRsaPublicKey.special_fields)
+    pub special_fields: ::protobuf::SpecialFields,
 }
 
 impl<'a> ::std::default::Default for &'a SimpleRsaPublicKey {
@@ -1248,15 +1190,15 @@
 
     // required bytes n = 1;
 
-
-    pub fn get_n(&self) -> &[u8] {
+    pub fn n(&self) -> &[u8] {
         match self.n.as_ref() {
-            Some(v) => &v,
+            Some(v) => v,
             None => &[],
         }
     }
+
     pub fn clear_n(&mut self) {
-        self.n.clear();
+        self.n = ::std::option::Option::None;
     }
 
     pub fn has_n(&self) -> bool {
@@ -1265,14 +1207,14 @@
 
     // Param is passed by value, moved
     pub fn set_n(&mut self, v: ::std::vec::Vec<u8>) {
-        self.n = ::protobuf::SingularField::some(v);
+        self.n = ::std::option::Option::Some(v);
     }
 
     // Mutable pointer to the field.
     // If field is not initialized, it is initialized with default value first.
     pub fn mut_n(&mut self) -> &mut ::std::vec::Vec<u8> {
         if self.n.is_none() {
-            self.n.set_default();
+            self.n = ::std::option::Option::Some(::std::vec::Vec::new());
         }
         self.n.as_mut().unwrap()
     }
@@ -1284,10 +1226,10 @@
 
     // optional int32 e = 2;
 
-
-    pub fn get_e(&self) -> i32 {
+    pub fn e(&self) -> i32 {
         self.e.unwrap_or(65537i32)
     }
+
     pub fn clear_e(&mut self) {
         self.e = ::std::option::Option::None;
     }
@@ -1303,6 +1245,8 @@
 }
 
 impl ::protobuf::Message for SimpleRsaPublicKey {
+    const NAME: &'static str = "SimpleRsaPublicKey";
+
     fn is_initialized(&self) -> bool {
         if self.n.is_none() {
             return false;
@@ -1310,22 +1254,17 @@
         true
     }
 
-    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::ProtobufResult<()> {
-        while !is.eof()? {
-            let (field_number, wire_type) = is.read_tag_unpack()?;
-            match field_number {
-                1 => {
-                    ::protobuf::rt::read_singular_bytes_into(wire_type, is, &mut self.n)?;
+    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {
+        while let Some(tag) = is.read_raw_tag_or_eof()? {
+            match tag {
+                10 => {
+                    self.n = ::std::option::Option::Some(is.read_bytes()?);
                 },
-                2 => {
-                    if wire_type != ::protobuf::wire_format::WireTypeVarint {
-                        return ::std::result::Result::Err(::protobuf::rt::unexpected_wire_type(wire_type));
-                    }
-                    let tmp = is.read_int32()?;
-                    self.e = ::std::option::Option::Some(tmp);
+                16 => {
+                    self.e = ::std::option::Option::Some(is.read_int32()?);
                 },
-                _ => {
-                    ::protobuf::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?;
+                tag => {
+                    ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;
                 },
             };
         }
@@ -1334,87 +1273,67 @@
 
     // Compute sizes of nested messages
     #[allow(unused_variables)]
-    fn compute_size(&self) -> u32 {
+    fn compute_size(&self) -> u64 {
         let mut my_size = 0;
-        if let Some(ref v) = self.n.as_ref() {
+        if let Some(v) = self.n.as_ref() {
             my_size += ::protobuf::rt::bytes_size(1, &v);
         }
         if let Some(v) = self.e {
-            my_size += ::protobuf::rt::value_size(2, v, ::protobuf::wire_format::WireTypeVarint);
+            my_size += ::protobuf::rt::int32_size(2, v);
         }
-        my_size += ::protobuf::rt::unknown_fields_size(self.get_unknown_fields());
-        self.cached_size.set(my_size);
+        my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());
+        self.special_fields.cached_size().set(my_size as u32);
         my_size
     }
 
-    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::ProtobufResult<()> {
-        if let Some(ref v) = self.n.as_ref() {
-            os.write_bytes(1, &v)?;
+    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {
+        if let Some(v) = self.n.as_ref() {
+            os.write_bytes(1, v)?;
         }
         if let Some(v) = self.e {
             os.write_int32(2, v)?;
         }
-        os.write_unknown_fields(self.get_unknown_fields())?;
+        os.write_unknown_fields(self.special_fields.unknown_fields())?;
         ::std::result::Result::Ok(())
     }
 
-    fn get_cached_size(&self) -> u32 {
-        self.cached_size.get()
+    fn special_fields(&self) -> &::protobuf::SpecialFields {
+        &self.special_fields
     }
 
-    fn get_unknown_fields(&self) -> &::protobuf::UnknownFields {
-        &self.unknown_fields
-    }
-
-    fn mut_unknown_fields(&mut self) -> &mut ::protobuf::UnknownFields {
-        &mut self.unknown_fields
-    }
-
-    fn as_any(&self) -> &dyn (::std::any::Any) {
-        self as &dyn (::std::any::Any)
-    }
-    fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) {
-        self as &mut dyn (::std::any::Any)
-    }
-    fn into_any(self: ::std::boxed::Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
-        self
-    }
-
-    fn descriptor(&self) -> &'static ::protobuf::reflect::MessageDescriptor {
-        Self::descriptor_static()
+    fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {
+        &mut self.special_fields
     }
 
     fn new() -> SimpleRsaPublicKey {
         SimpleRsaPublicKey::new()
     }
 
-    fn default_instance() -> &'static SimpleRsaPublicKey {
-        static instance: ::protobuf::rt::LazyV2<SimpleRsaPublicKey> = ::protobuf::rt::LazyV2::INIT;
-        instance.get(SimpleRsaPublicKey::new)
-    }
-}
-
-impl ::protobuf::Clear for SimpleRsaPublicKey {
     fn clear(&mut self) {
-        self.n.clear();
+        self.n = ::std::option::Option::None;
         self.e = ::std::option::Option::None;
-        self.unknown_fields.clear();
+        self.special_fields.clear();
     }
-}
 
-impl ::protobuf::reflect::ProtobufValue for SimpleRsaPublicKey {
-    fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef {
-        ::protobuf::reflect::ReflectValueRef::Message(self)
+    fn default_instance() -> &'static SimpleRsaPublicKey {
+        static instance: SimpleRsaPublicKey = SimpleRsaPublicKey {
+            n: ::std::option::Option::None,
+            e: ::std::option::Option::None,
+            special_fields: ::protobuf::SpecialFields::new(),
+        };
+        &instance
     }
 }
 
 #[derive(PartialEq,Clone,Default,Debug)]
+// @@protoc_insertion_point(message:securemessage.DhPublicKey)
 pub struct DhPublicKey {
     // message fields
-    y: ::protobuf::SingularField<::std::vec::Vec<u8>>,
+    // @@protoc_insertion_point(field:securemessage.DhPublicKey.y)
+    pub y: ::std::option::Option<::std::vec::Vec<u8>>,
     // special fields
-    pub unknown_fields: ::protobuf::UnknownFields,
-    pub cached_size: ::protobuf::CachedSize,
+    // @@protoc_insertion_point(special_field:securemessage.DhPublicKey.special_fields)
+    pub special_fields: ::protobuf::SpecialFields,
 }
 
 impl<'a> ::std::default::Default for &'a DhPublicKey {
@@ -1430,15 +1349,15 @@
 
     // required bytes y = 1;
 
-
-    pub fn get_y(&self) -> &[u8] {
+    pub fn y(&self) -> &[u8] {
         match self.y.as_ref() {
-            Some(v) => &v,
+            Some(v) => v,
             None => &[],
         }
     }
+
     pub fn clear_y(&mut self) {
-        self.y.clear();
+        self.y = ::std::option::Option::None;
     }
 
     pub fn has_y(&self) -> bool {
@@ -1447,14 +1366,14 @@
 
     // Param is passed by value, moved
     pub fn set_y(&mut self, v: ::std::vec::Vec<u8>) {
-        self.y = ::protobuf::SingularField::some(v);
+        self.y = ::std::option::Option::Some(v);
     }
 
     // Mutable pointer to the field.
     // If field is not initialized, it is initialized with default value first.
     pub fn mut_y(&mut self) -> &mut ::std::vec::Vec<u8> {
         if self.y.is_none() {
-            self.y.set_default();
+            self.y = ::std::option::Option::Some(::std::vec::Vec::new());
         }
         self.y.as_mut().unwrap()
     }
@@ -1466,6 +1385,8 @@
 }
 
 impl ::protobuf::Message for DhPublicKey {
+    const NAME: &'static str = "DhPublicKey";
+
     fn is_initialized(&self) -> bool {
         if self.y.is_none() {
             return false;
@@ -1473,15 +1394,14 @@
         true
     }
 
-    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::ProtobufResult<()> {
-        while !is.eof()? {
-            let (field_number, wire_type) = is.read_tag_unpack()?;
-            match field_number {
-                1 => {
-                    ::protobuf::rt::read_singular_bytes_into(wire_type, is, &mut self.y)?;
+    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {
+        while let Some(tag) = is.read_raw_tag_or_eof()? {
+            match tag {
+                10 => {
+                    self.y = ::std::option::Option::Some(is.read_bytes()?);
                 },
-                _ => {
-                    ::protobuf::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?;
+                tag => {
+                    ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;
                 },
             };
         }
@@ -1490,83 +1410,65 @@
 
     // Compute sizes of nested messages
     #[allow(unused_variables)]
-    fn compute_size(&self) -> u32 {
+    fn compute_size(&self) -> u64 {
         let mut my_size = 0;
-        if let Some(ref v) = self.y.as_ref() {
+        if let Some(v) = self.y.as_ref() {
             my_size += ::protobuf::rt::bytes_size(1, &v);
         }
-        my_size += ::protobuf::rt::unknown_fields_size(self.get_unknown_fields());
-        self.cached_size.set(my_size);
+        my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());
+        self.special_fields.cached_size().set(my_size as u32);
         my_size
     }
 
-    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::ProtobufResult<()> {
-        if let Some(ref v) = self.y.as_ref() {
-            os.write_bytes(1, &v)?;
+    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {
+        if let Some(v) = self.y.as_ref() {
+            os.write_bytes(1, v)?;
         }
-        os.write_unknown_fields(self.get_unknown_fields())?;
+        os.write_unknown_fields(self.special_fields.unknown_fields())?;
         ::std::result::Result::Ok(())
     }
 
-    fn get_cached_size(&self) -> u32 {
-        self.cached_size.get()
+    fn special_fields(&self) -> &::protobuf::SpecialFields {
+        &self.special_fields
     }
 
-    fn get_unknown_fields(&self) -> &::protobuf::UnknownFields {
-        &self.unknown_fields
-    }
-
-    fn mut_unknown_fields(&mut self) -> &mut ::protobuf::UnknownFields {
-        &mut self.unknown_fields
-    }
-
-    fn as_any(&self) -> &dyn (::std::any::Any) {
-        self as &dyn (::std::any::Any)
-    }
-    fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) {
-        self as &mut dyn (::std::any::Any)
-    }
-    fn into_any(self: ::std::boxed::Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
-        self
-    }
-
-    fn descriptor(&self) -> &'static ::protobuf::reflect::MessageDescriptor {
-        Self::descriptor_static()
+    fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {
+        &mut self.special_fields
     }
 
     fn new() -> DhPublicKey {
         DhPublicKey::new()
     }
 
-    fn default_instance() -> &'static DhPublicKey {
-        static instance: ::protobuf::rt::LazyV2<DhPublicKey> = ::protobuf::rt::LazyV2::INIT;
-        instance.get(DhPublicKey::new)
-    }
-}
-
-impl ::protobuf::Clear for DhPublicKey {
     fn clear(&mut self) {
-        self.y.clear();
-        self.unknown_fields.clear();
+        self.y = ::std::option::Option::None;
+        self.special_fields.clear();
     }
-}
 
-impl ::protobuf::reflect::ProtobufValue for DhPublicKey {
-    fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef {
-        ::protobuf::reflect::ReflectValueRef::Message(self)
+    fn default_instance() -> &'static DhPublicKey {
+        static instance: DhPublicKey = DhPublicKey {
+            y: ::std::option::Option::None,
+            special_fields: ::protobuf::SpecialFields::new(),
+        };
+        &instance
     }
 }
 
 #[derive(PartialEq,Clone,Default,Debug)]
+// @@protoc_insertion_point(message:securemessage.GenericPublicKey)
 pub struct GenericPublicKey {
     // message fields
-    field_type: ::std::option::Option<PublicKeyType>,
-    pub ec_p256_public_key: ::protobuf::SingularPtrField<EcP256PublicKey>,
-    pub rsa2048_public_key: ::protobuf::SingularPtrField<SimpleRsaPublicKey>,
-    pub dh2048_public_key: ::protobuf::SingularPtrField<DhPublicKey>,
+    // @@protoc_insertion_point(field:securemessage.GenericPublicKey.type)
+    pub type_: ::std::option::Option<::protobuf::EnumOrUnknown<PublicKeyType>>,
+    // @@protoc_insertion_point(field:securemessage.GenericPublicKey.ec_p256_public_key)
+    pub ec_p256_public_key: ::protobuf::MessageField<EcP256PublicKey>,
+    // @@protoc_insertion_point(field:securemessage.GenericPublicKey.rsa2048_public_key)
+    pub rsa2048_public_key: ::protobuf::MessageField<SimpleRsaPublicKey>,
+    // @@protoc_insertion_point(field:securemessage.GenericPublicKey.dh2048_public_key)
+    pub dh2048_public_key: ::protobuf::MessageField<DhPublicKey>,
     // special fields
-    pub unknown_fields: ::protobuf::UnknownFields,
-    pub cached_size: ::protobuf::CachedSize,
+    // @@protoc_insertion_point(special_field:securemessage.GenericPublicKey.special_fields)
+    pub special_fields: ::protobuf::SpecialFields,
 }
 
 impl<'a> ::std::default::Default for &'a GenericPublicKey {
@@ -1582,126 +1484,32 @@
 
     // required .securemessage.PublicKeyType type = 1;
 
-
-    pub fn get_field_type(&self) -> PublicKeyType {
-        self.field_type.unwrap_or(PublicKeyType::EC_P256)
-    }
-    pub fn clear_field_type(&mut self) {
-        self.field_type = ::std::option::Option::None;
-    }
-
-    pub fn has_field_type(&self) -> bool {
-        self.field_type.is_some()
-    }
-
-    // Param is passed by value, moved
-    pub fn set_field_type(&mut self, v: PublicKeyType) {
-        self.field_type = ::std::option::Option::Some(v);
-    }
-
-    // optional .securemessage.EcP256PublicKey ec_p256_public_key = 2;
-
-
-    pub fn get_ec_p256_public_key(&self) -> &EcP256PublicKey {
-        self.ec_p256_public_key.as_ref().unwrap_or_else(|| <EcP256PublicKey as ::protobuf::Message>::default_instance())
-    }
-    pub fn clear_ec_p256_public_key(&mut self) {
-        self.ec_p256_public_key.clear();
-    }
-
-    pub fn has_ec_p256_public_key(&self) -> bool {
-        self.ec_p256_public_key.is_some()
-    }
-
-    // Param is passed by value, moved
-    pub fn set_ec_p256_public_key(&mut self, v: EcP256PublicKey) {
-        self.ec_p256_public_key = ::protobuf::SingularPtrField::some(v);
-    }
-
-    // Mutable pointer to the field.
-    // If field is not initialized, it is initialized with default value first.
-    pub fn mut_ec_p256_public_key(&mut self) -> &mut EcP256PublicKey {
-        if self.ec_p256_public_key.is_none() {
-            self.ec_p256_public_key.set_default();
+    pub fn type_(&self) -> PublicKeyType {
+        match self.type_ {
+            Some(e) => e.enum_value_or(PublicKeyType::EC_P256),
+            None => PublicKeyType::EC_P256,
         }
-        self.ec_p256_public_key.as_mut().unwrap()
     }
 
-    // Take field
-    pub fn take_ec_p256_public_key(&mut self) -> EcP256PublicKey {
-        self.ec_p256_public_key.take().unwrap_or_else(|| EcP256PublicKey::new())
+    pub fn clear_type_(&mut self) {
+        self.type_ = ::std::option::Option::None;
     }
 
-    // optional .securemessage.SimpleRsaPublicKey rsa2048_public_key = 3;
-
-
-    pub fn get_rsa2048_public_key(&self) -> &SimpleRsaPublicKey {
-        self.rsa2048_public_key.as_ref().unwrap_or_else(|| <SimpleRsaPublicKey as ::protobuf::Message>::default_instance())
-    }
-    pub fn clear_rsa2048_public_key(&mut self) {
-        self.rsa2048_public_key.clear();
-    }
-
-    pub fn has_rsa2048_public_key(&self) -> bool {
-        self.rsa2048_public_key.is_some()
+    pub fn has_type(&self) -> bool {
+        self.type_.is_some()
     }
 
     // Param is passed by value, moved
-    pub fn set_rsa2048_public_key(&mut self, v: SimpleRsaPublicKey) {
-        self.rsa2048_public_key = ::protobuf::SingularPtrField::some(v);
-    }
-
-    // Mutable pointer to the field.
-    // If field is not initialized, it is initialized with default value first.
-    pub fn mut_rsa2048_public_key(&mut self) -> &mut SimpleRsaPublicKey {
-        if self.rsa2048_public_key.is_none() {
-            self.rsa2048_public_key.set_default();
-        }
-        self.rsa2048_public_key.as_mut().unwrap()
-    }
-
-    // Take field
-    pub fn take_rsa2048_public_key(&mut self) -> SimpleRsaPublicKey {
-        self.rsa2048_public_key.take().unwrap_or_else(|| SimpleRsaPublicKey::new())
-    }
-
-    // optional .securemessage.DhPublicKey dh2048_public_key = 4;
-
-
-    pub fn get_dh2048_public_key(&self) -> &DhPublicKey {
-        self.dh2048_public_key.as_ref().unwrap_or_else(|| <DhPublicKey as ::protobuf::Message>::default_instance())
-    }
-    pub fn clear_dh2048_public_key(&mut self) {
-        self.dh2048_public_key.clear();
-    }
-
-    pub fn has_dh2048_public_key(&self) -> bool {
-        self.dh2048_public_key.is_some()
-    }
-
-    // Param is passed by value, moved
-    pub fn set_dh2048_public_key(&mut self, v: DhPublicKey) {
-        self.dh2048_public_key = ::protobuf::SingularPtrField::some(v);
-    }
-
-    // Mutable pointer to the field.
-    // If field is not initialized, it is initialized with default value first.
-    pub fn mut_dh2048_public_key(&mut self) -> &mut DhPublicKey {
-        if self.dh2048_public_key.is_none() {
-            self.dh2048_public_key.set_default();
-        }
-        self.dh2048_public_key.as_mut().unwrap()
-    }
-
-    // Take field
-    pub fn take_dh2048_public_key(&mut self) -> DhPublicKey {
-        self.dh2048_public_key.take().unwrap_or_else(|| DhPublicKey::new())
+    pub fn set_type(&mut self, v: PublicKeyType) {
+        self.type_ = ::std::option::Option::Some(::protobuf::EnumOrUnknown::new(v));
     }
 }
 
 impl ::protobuf::Message for GenericPublicKey {
+    const NAME: &'static str = "GenericPublicKey";
+
     fn is_initialized(&self) -> bool {
-        if self.field_type.is_none() {
+        if self.type_.is_none() {
             return false;
         }
         for v in &self.ec_p256_public_key {
@@ -1722,24 +1530,23 @@
         true
     }
 
-    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::ProtobufResult<()> {
-        while !is.eof()? {
-            let (field_number, wire_type) = is.read_tag_unpack()?;
-            match field_number {
-                1 => {
-                    ::protobuf::rt::read_proto2_enum_with_unknown_fields_into(wire_type, is, &mut self.field_type, 1, &mut self.unknown_fields)?
+    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {
+        while let Some(tag) = is.read_raw_tag_or_eof()? {
+            match tag {
+                8 => {
+                    self.type_ = ::std::option::Option::Some(is.read_enum_or_unknown()?);
                 },
-                2 => {
-                    ::protobuf::rt::read_singular_message_into(wire_type, is, &mut self.ec_p256_public_key)?;
+                18 => {
+                    ::protobuf::rt::read_singular_message_into_field(is, &mut self.ec_p256_public_key)?;
                 },
-                3 => {
-                    ::protobuf::rt::read_singular_message_into(wire_type, is, &mut self.rsa2048_public_key)?;
+                26 => {
+                    ::protobuf::rt::read_singular_message_into_field(is, &mut self.rsa2048_public_key)?;
                 },
-                4 => {
-                    ::protobuf::rt::read_singular_message_into(wire_type, is, &mut self.dh2048_public_key)?;
+                34 => {
+                    ::protobuf::rt::read_singular_message_into_field(is, &mut self.dh2048_public_key)?;
                 },
-                _ => {
-                    ::protobuf::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?;
+                tag => {
+                    ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;
                 },
             };
         }
@@ -1748,111 +1555,93 @@
 
     // Compute sizes of nested messages
     #[allow(unused_variables)]
-    fn compute_size(&self) -> u32 {
+    fn compute_size(&self) -> u64 {
         let mut my_size = 0;
-        if let Some(v) = self.field_type {
-            my_size += ::protobuf::rt::enum_size(1, v);
+        if let Some(v) = self.type_ {
+            my_size += ::protobuf::rt::int32_size(1, v.value());
         }
-        if let Some(ref v) = self.ec_p256_public_key.as_ref() {
+        if let Some(v) = self.ec_p256_public_key.as_ref() {
             let len = v.compute_size();
-            my_size += 1 + ::protobuf::rt::compute_raw_varint32_size(len) + len;
+            my_size += 1 + ::protobuf::rt::compute_raw_varint64_size(len) + len;
         }
-        if let Some(ref v) = self.rsa2048_public_key.as_ref() {
+        if let Some(v) = self.rsa2048_public_key.as_ref() {
             let len = v.compute_size();
-            my_size += 1 + ::protobuf::rt::compute_raw_varint32_size(len) + len;
+            my_size += 1 + ::protobuf::rt::compute_raw_varint64_size(len) + len;
         }
-        if let Some(ref v) = self.dh2048_public_key.as_ref() {
+        if let Some(v) = self.dh2048_public_key.as_ref() {
             let len = v.compute_size();
-            my_size += 1 + ::protobuf::rt::compute_raw_varint32_size(len) + len;
+            my_size += 1 + ::protobuf::rt::compute_raw_varint64_size(len) + len;
         }
-        my_size += ::protobuf::rt::unknown_fields_size(self.get_unknown_fields());
-        self.cached_size.set(my_size);
+        my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());
+        self.special_fields.cached_size().set(my_size as u32);
         my_size
     }
 
-    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::ProtobufResult<()> {
-        if let Some(v) = self.field_type {
-            os.write_enum(1, ::protobuf::ProtobufEnum::value(&v))?;
+    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {
+        if let Some(v) = self.type_ {
+            os.write_enum(1, ::protobuf::EnumOrUnknown::value(&v))?;
         }
-        if let Some(ref v) = self.ec_p256_public_key.as_ref() {
-            os.write_tag(2, ::protobuf::wire_format::WireTypeLengthDelimited)?;
-            os.write_raw_varint32(v.get_cached_size())?;
-            v.write_to_with_cached_sizes(os)?;
+        if let Some(v) = self.ec_p256_public_key.as_ref() {
+            ::protobuf::rt::write_message_field_with_cached_size(2, v, os)?;
         }
-        if let Some(ref v) = self.rsa2048_public_key.as_ref() {
-            os.write_tag(3, ::protobuf::wire_format::WireTypeLengthDelimited)?;
-            os.write_raw_varint32(v.get_cached_size())?;
-            v.write_to_with_cached_sizes(os)?;
+        if let Some(v) = self.rsa2048_public_key.as_ref() {
+            ::protobuf::rt::write_message_field_with_cached_size(3, v, os)?;
         }
-        if let Some(ref v) = self.dh2048_public_key.as_ref() {
-            os.write_tag(4, ::protobuf::wire_format::WireTypeLengthDelimited)?;
-            os.write_raw_varint32(v.get_cached_size())?;
-            v.write_to_with_cached_sizes(os)?;
+        if let Some(v) = self.dh2048_public_key.as_ref() {
+            ::protobuf::rt::write_message_field_with_cached_size(4, v, os)?;
         }
-        os.write_unknown_fields(self.get_unknown_fields())?;
+        os.write_unknown_fields(self.special_fields.unknown_fields())?;
         ::std::result::Result::Ok(())
     }
 
-    fn get_cached_size(&self) -> u32 {
-        self.cached_size.get()
+    fn special_fields(&self) -> &::protobuf::SpecialFields {
+        &self.special_fields
     }
 
-    fn get_unknown_fields(&self) -> &::protobuf::UnknownFields {
-        &self.unknown_fields
-    }
-
-    fn mut_unknown_fields(&mut self) -> &mut ::protobuf::UnknownFields {
-        &mut self.unknown_fields
-    }
-
-    fn as_any(&self) -> &dyn (::std::any::Any) {
-        self as &dyn (::std::any::Any)
-    }
-    fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) {
-        self as &mut dyn (::std::any::Any)
-    }
-    fn into_any(self: ::std::boxed::Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
-        self
-    }
-
-    fn descriptor(&self) -> &'static ::protobuf::reflect::MessageDescriptor {
-        Self::descriptor_static()
+    fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {
+        &mut self.special_fields
     }
 
     fn new() -> GenericPublicKey {
         GenericPublicKey::new()
     }
 
-    fn default_instance() -> &'static GenericPublicKey {
-        static instance: ::protobuf::rt::LazyV2<GenericPublicKey> = ::protobuf::rt::LazyV2::INIT;
-        instance.get(GenericPublicKey::new)
-    }
-}
-
-impl ::protobuf::Clear for GenericPublicKey {
     fn clear(&mut self) {
-        self.field_type = ::std::option::Option::None;
+        self.type_ = ::std::option::Option::None;
         self.ec_p256_public_key.clear();
         self.rsa2048_public_key.clear();
         self.dh2048_public_key.clear();
-        self.unknown_fields.clear();
+        self.special_fields.clear();
+    }
+
+    fn default_instance() -> &'static GenericPublicKey {
+        static instance: GenericPublicKey = GenericPublicKey {
+            type_: ::std::option::Option::None,
+            ec_p256_public_key: ::protobuf::MessageField::none(),
+            rsa2048_public_key: ::protobuf::MessageField::none(),
+            dh2048_public_key: ::protobuf::MessageField::none(),
+            special_fields: ::protobuf::SpecialFields::new(),
+        };
+        &instance
     }
 }
 
-impl ::protobuf::reflect::ProtobufValue for GenericPublicKey {
-    fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef {
-        ::protobuf::reflect::ReflectValueRef::Message(self)
-    }
-}
-
-#[derive(Clone,PartialEq,Eq,Debug,Hash)]
+#[derive(Clone,Copy,PartialEq,Eq,Debug,Hash)]
+// @@protoc_insertion_point(enum:securemessage.SigScheme)
 pub enum SigScheme {
+    // @@protoc_insertion_point(enum_value:securemessage.SigScheme.HMAC_SHA256)
     HMAC_SHA256 = 1,
+    // @@protoc_insertion_point(enum_value:securemessage.SigScheme.ECDSA_P256_SHA256)
     ECDSA_P256_SHA256 = 2,
+    // @@protoc_insertion_point(enum_value:securemessage.SigScheme.RSA2048_SHA256)
     RSA2048_SHA256 = 3,
+    // @@protoc_insertion_point(enum_value:securemessage.SigScheme.AEAD)
+    AEAD = 4,
 }
 
-impl ::protobuf::ProtobufEnum for SigScheme {
+impl ::protobuf::Enum for SigScheme {
+    const NAME: &'static str = "SigScheme";
+
     fn value(&self) -> i32 {
         *self as i32
     }
@@ -1862,21 +1651,17 @@
             1 => ::std::option::Option::Some(SigScheme::HMAC_SHA256),
             2 => ::std::option::Option::Some(SigScheme::ECDSA_P256_SHA256),
             3 => ::std::option::Option::Some(SigScheme::RSA2048_SHA256),
+            4 => ::std::option::Option::Some(SigScheme::AEAD),
             _ => ::std::option::Option::None
         }
     }
 
-    fn values() -> &'static [Self] {
-        static values: &'static [SigScheme] = &[
-            SigScheme::HMAC_SHA256,
-            SigScheme::ECDSA_P256_SHA256,
-            SigScheme::RSA2048_SHA256,
-        ];
-        values
-    }
-}
-
-impl ::std::marker::Copy for SigScheme {
+    const VALUES: &'static [SigScheme] = &[
+        SigScheme::HMAC_SHA256,
+        SigScheme::ECDSA_P256_SHA256,
+        SigScheme::RSA2048_SHA256,
+        SigScheme::AEAD,
+    ];
 }
 
 // Note, `Default` is implemented although default value is not 0
@@ -1886,19 +1671,21 @@
     }
 }
 
-impl ::protobuf::reflect::ProtobufValue for SigScheme {
-    fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef {
-        ::protobuf::reflect::ReflectValueRef::Enum(::protobuf::ProtobufEnum::descriptor(self))
-    }
-}
 
-#[derive(Clone,PartialEq,Eq,Debug,Hash)]
+#[derive(Clone,Copy,PartialEq,Eq,Debug,Hash)]
+// @@protoc_insertion_point(enum:securemessage.EncScheme)
 pub enum EncScheme {
+    // @@protoc_insertion_point(enum_value:securemessage.EncScheme.NONE)
     NONE = 1,
+    // @@protoc_insertion_point(enum_value:securemessage.EncScheme.AES_256_CBC)
     AES_256_CBC = 2,
+    // @@protoc_insertion_point(enum_value:securemessage.EncScheme.AES_256_GCM_SIV)
+    AES_256_GCM_SIV = 3,
 }
 
-impl ::protobuf::ProtobufEnum for EncScheme {
+impl ::protobuf::Enum for EncScheme {
+    const NAME: &'static str = "EncScheme";
+
     fn value(&self) -> i32 {
         *self as i32
     }
@@ -1907,20 +1694,16 @@
         match value {
             1 => ::std::option::Option::Some(EncScheme::NONE),
             2 => ::std::option::Option::Some(EncScheme::AES_256_CBC),
+            3 => ::std::option::Option::Some(EncScheme::AES_256_GCM_SIV),
             _ => ::std::option::Option::None
         }
     }
 
-    fn values() -> &'static [Self] {
-        static values: &'static [EncScheme] = &[
-            EncScheme::NONE,
-            EncScheme::AES_256_CBC,
-        ];
-        values
-    }
-}
-
-impl ::std::marker::Copy for EncScheme {
+    const VALUES: &'static [EncScheme] = &[
+        EncScheme::NONE,
+        EncScheme::AES_256_CBC,
+        EncScheme::AES_256_GCM_SIV,
+    ];
 }
 
 // Note, `Default` is implemented although default value is not 0
@@ -1930,20 +1713,21 @@
     }
 }
 
-impl ::protobuf::reflect::ProtobufValue for EncScheme {
-    fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef {
-        ::protobuf::reflect::ReflectValueRef::Enum(::protobuf::ProtobufEnum::descriptor(self))
-    }
-}
 
-#[derive(Clone,PartialEq,Eq,Debug,Hash)]
+#[derive(Clone,Copy,PartialEq,Eq,Debug,Hash)]
+// @@protoc_insertion_point(enum:securemessage.PublicKeyType)
 pub enum PublicKeyType {
+    // @@protoc_insertion_point(enum_value:securemessage.PublicKeyType.EC_P256)
     EC_P256 = 1,
+    // @@protoc_insertion_point(enum_value:securemessage.PublicKeyType.RSA2048)
     RSA2048 = 2,
+    // @@protoc_insertion_point(enum_value:securemessage.PublicKeyType.DH2048_MODP)
     DH2048_MODP = 3,
 }
 
-impl ::protobuf::ProtobufEnum for PublicKeyType {
+impl ::protobuf::Enum for PublicKeyType {
+    const NAME: &'static str = "PublicKeyType";
+
     fn value(&self) -> i32 {
         *self as i32
     }
@@ -1957,17 +1741,11 @@
         }
     }
 
-    fn values() -> &'static [Self] {
-        static values: &'static [PublicKeyType] = &[
-            PublicKeyType::EC_P256,
-            PublicKeyType::RSA2048,
-            PublicKeyType::DH2048_MODP,
-        ];
-        values
-    }
-}
-
-impl ::std::marker::Copy for PublicKeyType {
+    const VALUES: &'static [PublicKeyType] = &[
+        PublicKeyType::EC_P256,
+        PublicKeyType::RSA2048,
+        PublicKeyType::DH2048_MODP,
+    ];
 }
 
 // Note, `Default` is implemented although default value is not 0
@@ -1977,8 +1755,3 @@
     }
 }
 
-impl ::protobuf::reflect::ProtobufValue for PublicKeyType {
-    fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef {
-        ::protobuf::reflect::ReflectValueRef::Enum(::protobuf::ProtobufEnum::descriptor(self))
-    }
-}
diff --git a/nearby/connections/ukey2/ukey2_proto/src/ukey2_all_proto/ukey.rs b/nearby/connections/ukey2/ukey2_proto/src/ukey2_all_proto/ukey.rs
index a4aef70..5370207 100644
--- a/nearby/connections/ukey2/ukey2_proto/src/ukey2_all_proto/ukey.rs
+++ b/nearby/connections/ukey2/ukey2_proto/src/ukey2_all_proto/ukey.rs
@@ -12,7 +12,8 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-// This file is generated by rust-protobuf 2.28.0. Do not edit
+// This file is generated by rust-protobuf 3.2.0. Do not edit
+// .proto file is parsed by protoc 3.19.1
 // @generated
 
 // https://github.com/rust-lang/rust-clippy/issues/702
@@ -29,22 +30,27 @@
 #![allow(non_snake_case)]
 #![allow(non_upper_case_globals)]
 #![allow(trivial_casts)]
-#![allow(unused_imports)]
 #![allow(unused_results)]
+#![allow(unused_mut)]
+
 //! Generated file from `ukey.proto`
+// Generated for lite runtime
 
 /// Generated files are compatible only with the same version
 /// of protobuf runtime.
-// const _PROTOBUF_VERSION_CHECK: () = ::protobuf::VERSION_2_28_0;
+const _PROTOBUF_VERSION_CHECK: () = ::protobuf::VERSION_3_2_0;
 
 #[derive(PartialEq,Clone,Default,Debug)]
+// @@protoc_insertion_point(message:securegcm.Ukey2Message)
 pub struct Ukey2Message {
     // message fields
-    message_type: ::std::option::Option<Ukey2Message_Type>,
-    message_data: ::protobuf::SingularField<::std::vec::Vec<u8>>,
+    // @@protoc_insertion_point(field:securegcm.Ukey2Message.message_type)
+    pub message_type: ::std::option::Option<::protobuf::EnumOrUnknown<ukey2message::Type>>,
+    // @@protoc_insertion_point(field:securegcm.Ukey2Message.message_data)
+    pub message_data: ::std::option::Option<::std::vec::Vec<u8>>,
     // special fields
-    pub unknown_fields: ::protobuf::UnknownFields,
-    pub cached_size: ::protobuf::CachedSize,
+    // @@protoc_insertion_point(special_field:securegcm.Ukey2Message.special_fields)
+    pub special_fields: ::protobuf::SpecialFields,
 }
 
 impl<'a> ::std::default::Default for &'a Ukey2Message {
@@ -60,10 +66,13 @@
 
     // optional .securegcm.Ukey2Message.Type message_type = 1;
 
-
-    pub fn get_message_type(&self) -> Ukey2Message_Type {
-        self.message_type.unwrap_or(Ukey2Message_Type::UNKNOWN_DO_NOT_USE)
+    pub fn message_type(&self) -> ukey2message::Type {
+        match self.message_type {
+            Some(e) => e.enum_value_or(ukey2message::Type::UNKNOWN_DO_NOT_USE),
+            None => ukey2message::Type::UNKNOWN_DO_NOT_USE,
+        }
     }
+
     pub fn clear_message_type(&mut self) {
         self.message_type = ::std::option::Option::None;
     }
@@ -73,21 +82,21 @@
     }
 
     // Param is passed by value, moved
-    pub fn set_message_type(&mut self, v: Ukey2Message_Type) {
-        self.message_type = ::std::option::Option::Some(v);
+    pub fn set_message_type(&mut self, v: ukey2message::Type) {
+        self.message_type = ::std::option::Option::Some(::protobuf::EnumOrUnknown::new(v));
     }
 
     // optional bytes message_data = 2;
 
-
-    pub fn get_message_data(&self) -> &[u8] {
+    pub fn message_data(&self) -> &[u8] {
         match self.message_data.as_ref() {
-            Some(v) => &v,
+            Some(v) => v,
             None => &[],
         }
     }
+
     pub fn clear_message_data(&mut self) {
-        self.message_data.clear();
+        self.message_data = ::std::option::Option::None;
     }
 
     pub fn has_message_data(&self) -> bool {
@@ -96,14 +105,14 @@
 
     // Param is passed by value, moved
     pub fn set_message_data(&mut self, v: ::std::vec::Vec<u8>) {
-        self.message_data = ::protobuf::SingularField::some(v);
+        self.message_data = ::std::option::Option::Some(v);
     }
 
     // Mutable pointer to the field.
     // If field is not initialized, it is initialized with default value first.
     pub fn mut_message_data(&mut self) -> &mut ::std::vec::Vec<u8> {
         if self.message_data.is_none() {
-            self.message_data.set_default();
+            self.message_data = ::std::option::Option::Some(::std::vec::Vec::new());
         }
         self.message_data.as_mut().unwrap()
     }
@@ -115,22 +124,23 @@
 }
 
 impl ::protobuf::Message for Ukey2Message {
+    const NAME: &'static str = "Ukey2Message";
+
     fn is_initialized(&self) -> bool {
         true
     }
 
-    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::ProtobufResult<()> {
-        while !is.eof()? {
-            let (field_number, wire_type) = is.read_tag_unpack()?;
-            match field_number {
-                1 => {
-                    ::protobuf::rt::read_proto2_enum_with_unknown_fields_into(wire_type, is, &mut self.message_type, 1, &mut self.unknown_fields)?
+    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {
+        while let Some(tag) = is.read_raw_tag_or_eof()? {
+            match tag {
+                8 => {
+                    self.message_type = ::std::option::Option::Some(is.read_enum_or_unknown()?);
                 },
-                2 => {
-                    ::protobuf::rt::read_singular_bytes_into(wire_type, is, &mut self.message_data)?;
+                18 => {
+                    self.message_data = ::std::option::Option::Some(is.read_bytes()?);
                 },
-                _ => {
-                    ::protobuf::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?;
+                tag => {
+                    ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;
                 },
             };
         }
@@ -139,140 +149,121 @@
 
     // Compute sizes of nested messages
     #[allow(unused_variables)]
-    fn compute_size(&self) -> u32 {
+    fn compute_size(&self) -> u64 {
         let mut my_size = 0;
         if let Some(v) = self.message_type {
-            my_size += ::protobuf::rt::enum_size(1, v);
+            my_size += ::protobuf::rt::int32_size(1, v.value());
         }
-        if let Some(ref v) = self.message_data.as_ref() {
+        if let Some(v) = self.message_data.as_ref() {
             my_size += ::protobuf::rt::bytes_size(2, &v);
         }
-        my_size += ::protobuf::rt::unknown_fields_size(self.get_unknown_fields());
-        self.cached_size.set(my_size);
+        my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());
+        self.special_fields.cached_size().set(my_size as u32);
         my_size
     }
 
-    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::ProtobufResult<()> {
+    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {
         if let Some(v) = self.message_type {
-            os.write_enum(1, ::protobuf::ProtobufEnum::value(&v))?;
+            os.write_enum(1, ::protobuf::EnumOrUnknown::value(&v))?;
         }
-        if let Some(ref v) = self.message_data.as_ref() {
-            os.write_bytes(2, &v)?;
+        if let Some(v) = self.message_data.as_ref() {
+            os.write_bytes(2, v)?;
         }
-        os.write_unknown_fields(self.get_unknown_fields())?;
+        os.write_unknown_fields(self.special_fields.unknown_fields())?;
         ::std::result::Result::Ok(())
     }
 
-    fn get_cached_size(&self) -> u32 {
-        self.cached_size.get()
+    fn special_fields(&self) -> &::protobuf::SpecialFields {
+        &self.special_fields
     }
 
-    fn get_unknown_fields(&self) -> &::protobuf::UnknownFields {
-        &self.unknown_fields
-    }
-
-    fn mut_unknown_fields(&mut self) -> &mut ::protobuf::UnknownFields {
-        &mut self.unknown_fields
-    }
-
-    fn as_any(&self) -> &dyn (::std::any::Any) {
-        self as &dyn (::std::any::Any)
-    }
-    fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) {
-        self as &mut dyn (::std::any::Any)
-    }
-    fn into_any(self: ::std::boxed::Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
-        self
-    }
-
-    fn descriptor(&self) -> &'static ::protobuf::reflect::MessageDescriptor {
-        Self::descriptor_static()
+    fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {
+        &mut self.special_fields
     }
 
     fn new() -> Ukey2Message {
         Ukey2Message::new()
     }
 
-    fn default_instance() -> &'static Ukey2Message {
-        static instance: ::protobuf::rt::LazyV2<Ukey2Message> = ::protobuf::rt::LazyV2::INIT;
-        instance.get(Ukey2Message::new)
-    }
-}
-
-impl ::protobuf::Clear for Ukey2Message {
     fn clear(&mut self) {
         self.message_type = ::std::option::Option::None;
-        self.message_data.clear();
-        self.unknown_fields.clear();
+        self.message_data = ::std::option::Option::None;
+        self.special_fields.clear();
+    }
+
+    fn default_instance() -> &'static Ukey2Message {
+        static instance: Ukey2Message = Ukey2Message {
+            message_type: ::std::option::Option::None,
+            message_data: ::std::option::Option::None,
+            special_fields: ::protobuf::SpecialFields::new(),
+        };
+        &instance
     }
 }
 
-impl ::protobuf::reflect::ProtobufValue for Ukey2Message {
-    fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef {
-        ::protobuf::reflect::ReflectValueRef::Message(self)
-    }
-}
-
-#[derive(Clone,PartialEq,Eq,Debug,Hash)]
-pub enum Ukey2Message_Type {
-    UNKNOWN_DO_NOT_USE = 0,
-    ALERT = 1,
-    CLIENT_INIT = 2,
-    SERVER_INIT = 3,
-    CLIENT_FINISH = 4,
-}
-
-impl ::protobuf::ProtobufEnum for Ukey2Message_Type {
-    fn value(&self) -> i32 {
-        *self as i32
+/// Nested message and enums of message `Ukey2Message`
+pub mod ukey2message {
+    #[derive(Clone,Copy,PartialEq,Eq,Debug,Hash)]
+    // @@protoc_insertion_point(enum:securegcm.Ukey2Message.Type)
+    pub enum Type {
+        // @@protoc_insertion_point(enum_value:securegcm.Ukey2Message.Type.UNKNOWN_DO_NOT_USE)
+        UNKNOWN_DO_NOT_USE = 0,
+        // @@protoc_insertion_point(enum_value:securegcm.Ukey2Message.Type.ALERT)
+        ALERT = 1,
+        // @@protoc_insertion_point(enum_value:securegcm.Ukey2Message.Type.CLIENT_INIT)
+        CLIENT_INIT = 2,
+        // @@protoc_insertion_point(enum_value:securegcm.Ukey2Message.Type.SERVER_INIT)
+        SERVER_INIT = 3,
+        // @@protoc_insertion_point(enum_value:securegcm.Ukey2Message.Type.CLIENT_FINISH)
+        CLIENT_FINISH = 4,
     }
 
-    fn from_i32(value: i32) -> ::std::option::Option<Ukey2Message_Type> {
-        match value {
-            0 => ::std::option::Option::Some(Ukey2Message_Type::UNKNOWN_DO_NOT_USE),
-            1 => ::std::option::Option::Some(Ukey2Message_Type::ALERT),
-            2 => ::std::option::Option::Some(Ukey2Message_Type::CLIENT_INIT),
-            3 => ::std::option::Option::Some(Ukey2Message_Type::SERVER_INIT),
-            4 => ::std::option::Option::Some(Ukey2Message_Type::CLIENT_FINISH),
-            _ => ::std::option::Option::None
+    impl ::protobuf::Enum for Type {
+        const NAME: &'static str = "Type";
+
+        fn value(&self) -> i32 {
+            *self as i32
+        }
+
+        fn from_i32(value: i32) -> ::std::option::Option<Type> {
+            match value {
+                0 => ::std::option::Option::Some(Type::UNKNOWN_DO_NOT_USE),
+                1 => ::std::option::Option::Some(Type::ALERT),
+                2 => ::std::option::Option::Some(Type::CLIENT_INIT),
+                3 => ::std::option::Option::Some(Type::SERVER_INIT),
+                4 => ::std::option::Option::Some(Type::CLIENT_FINISH),
+                _ => ::std::option::Option::None
+            }
+        }
+
+        const VALUES: &'static [Type] = &[
+            Type::UNKNOWN_DO_NOT_USE,
+            Type::ALERT,
+            Type::CLIENT_INIT,
+            Type::SERVER_INIT,
+            Type::CLIENT_FINISH,
+        ];
+    }
+
+    impl ::std::default::Default for Type {
+        fn default() -> Self {
+            Type::UNKNOWN_DO_NOT_USE
         }
     }
 
-    fn values() -> &'static [Self] {
-        static values: &'static [Ukey2Message_Type] = &[
-            Ukey2Message_Type::UNKNOWN_DO_NOT_USE,
-            Ukey2Message_Type::ALERT,
-            Ukey2Message_Type::CLIENT_INIT,
-            Ukey2Message_Type::SERVER_INIT,
-            Ukey2Message_Type::CLIENT_FINISH,
-        ];
-        values
-    }
-}
-
-impl ::std::marker::Copy for Ukey2Message_Type {
-}
-
-impl ::std::default::Default for Ukey2Message_Type {
-    fn default() -> Self {
-        Ukey2Message_Type::UNKNOWN_DO_NOT_USE
-    }
-}
-
-impl ::protobuf::reflect::ProtobufValue for Ukey2Message_Type {
-    fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef {
-        ::protobuf::reflect::ReflectValueRef::Enum(::protobuf::ProtobufEnum::descriptor(self))
-    }
 }
 
 #[derive(PartialEq,Clone,Default,Debug)]
+// @@protoc_insertion_point(message:securegcm.Ukey2Alert)
 pub struct Ukey2Alert {
     // message fields
-    field_type: ::std::option::Option<Ukey2Alert_AlertType>,
-    error_message: ::protobuf::SingularField<::std::string::String>,
+    // @@protoc_insertion_point(field:securegcm.Ukey2Alert.type)
+    pub type_: ::std::option::Option<::protobuf::EnumOrUnknown<ukey2alert::AlertType>>,
+    // @@protoc_insertion_point(field:securegcm.Ukey2Alert.error_message)
+    pub error_message: ::std::option::Option<::std::string::String>,
     // special fields
-    pub unknown_fields: ::protobuf::UnknownFields,
-    pub cached_size: ::protobuf::CachedSize,
+    // @@protoc_insertion_point(special_field:securegcm.Ukey2Alert.special_fields)
+    pub special_fields: ::protobuf::SpecialFields,
 }
 
 impl<'a> ::std::default::Default for &'a Ukey2Alert {
@@ -288,34 +279,37 @@
 
     // optional .securegcm.Ukey2Alert.AlertType type = 1;
 
-
-    pub fn get_field_type(&self) -> Ukey2Alert_AlertType {
-        self.field_type.unwrap_or(Ukey2Alert_AlertType::BAD_MESSAGE)
-    }
-    pub fn clear_field_type(&mut self) {
-        self.field_type = ::std::option::Option::None;
+    pub fn type_(&self) -> ukey2alert::AlertType {
+        match self.type_ {
+            Some(e) => e.enum_value_or(ukey2alert::AlertType::BAD_MESSAGE),
+            None => ukey2alert::AlertType::BAD_MESSAGE,
+        }
     }
 
-    pub fn has_field_type(&self) -> bool {
-        self.field_type.is_some()
+    pub fn clear_type_(&mut self) {
+        self.type_ = ::std::option::Option::None;
+    }
+
+    pub fn has_type(&self) -> bool {
+        self.type_.is_some()
     }
 
     // Param is passed by value, moved
-    pub fn set_field_type(&mut self, v: Ukey2Alert_AlertType) {
-        self.field_type = ::std::option::Option::Some(v);
+    pub fn set_type(&mut self, v: ukey2alert::AlertType) {
+        self.type_ = ::std::option::Option::Some(::protobuf::EnumOrUnknown::new(v));
     }
 
     // optional string error_message = 2;
 
-
-    pub fn get_error_message(&self) -> &str {
+    pub fn error_message(&self) -> &str {
         match self.error_message.as_ref() {
-            Some(v) => &v,
+            Some(v) => v,
             None => "",
         }
     }
+
     pub fn clear_error_message(&mut self) {
-        self.error_message.clear();
+        self.error_message = ::std::option::Option::None;
     }
 
     pub fn has_error_message(&self) -> bool {
@@ -324,14 +318,14 @@
 
     // Param is passed by value, moved
     pub fn set_error_message(&mut self, v: ::std::string::String) {
-        self.error_message = ::protobuf::SingularField::some(v);
+        self.error_message = ::std::option::Option::Some(v);
     }
 
     // Mutable pointer to the field.
     // If field is not initialized, it is initialized with default value first.
     pub fn mut_error_message(&mut self) -> &mut ::std::string::String {
         if self.error_message.is_none() {
-            self.error_message.set_default();
+            self.error_message = ::std::option::Option::Some(::std::string::String::new());
         }
         self.error_message.as_mut().unwrap()
     }
@@ -343,22 +337,23 @@
 }
 
 impl ::protobuf::Message for Ukey2Alert {
+    const NAME: &'static str = "Ukey2Alert";
+
     fn is_initialized(&self) -> bool {
         true
     }
 
-    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::ProtobufResult<()> {
-        while !is.eof()? {
-            let (field_number, wire_type) = is.read_tag_unpack()?;
-            match field_number {
-                1 => {
-                    ::protobuf::rt::read_proto2_enum_with_unknown_fields_into(wire_type, is, &mut self.field_type, 1, &mut self.unknown_fields)?
+    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {
+        while let Some(tag) = is.read_raw_tag_or_eof()? {
+            match tag {
+                8 => {
+                    self.type_ = ::std::option::Option::Some(is.read_enum_or_unknown()?);
                 },
-                2 => {
-                    ::protobuf::rt::read_singular_string_into(wire_type, is, &mut self.error_message)?;
+                18 => {
+                    self.error_message = ::std::option::Option::Some(is.read_string()?);
                 },
-                _ => {
-                    ::protobuf::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?;
+                tag => {
+                    ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;
                 },
             };
         }
@@ -367,158 +362,148 @@
 
     // Compute sizes of nested messages
     #[allow(unused_variables)]
-    fn compute_size(&self) -> u32 {
+    fn compute_size(&self) -> u64 {
         let mut my_size = 0;
-        if let Some(v) = self.field_type {
-            my_size += ::protobuf::rt::enum_size(1, v);
+        if let Some(v) = self.type_ {
+            my_size += ::protobuf::rt::int32_size(1, v.value());
         }
-        if let Some(ref v) = self.error_message.as_ref() {
+        if let Some(v) = self.error_message.as_ref() {
             my_size += ::protobuf::rt::string_size(2, &v);
         }
-        my_size += ::protobuf::rt::unknown_fields_size(self.get_unknown_fields());
-        self.cached_size.set(my_size);
+        my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());
+        self.special_fields.cached_size().set(my_size as u32);
         my_size
     }
 
-    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::ProtobufResult<()> {
-        if let Some(v) = self.field_type {
-            os.write_enum(1, ::protobuf::ProtobufEnum::value(&v))?;
+    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {
+        if let Some(v) = self.type_ {
+            os.write_enum(1, ::protobuf::EnumOrUnknown::value(&v))?;
         }
-        if let Some(ref v) = self.error_message.as_ref() {
-            os.write_string(2, &v)?;
+        if let Some(v) = self.error_message.as_ref() {
+            os.write_string(2, v)?;
         }
-        os.write_unknown_fields(self.get_unknown_fields())?;
+        os.write_unknown_fields(self.special_fields.unknown_fields())?;
         ::std::result::Result::Ok(())
     }
 
-    fn get_cached_size(&self) -> u32 {
-        self.cached_size.get()
+    fn special_fields(&self) -> &::protobuf::SpecialFields {
+        &self.special_fields
     }
 
-    fn get_unknown_fields(&self) -> &::protobuf::UnknownFields {
-        &self.unknown_fields
-    }
-
-    fn mut_unknown_fields(&mut self) -> &mut ::protobuf::UnknownFields {
-        &mut self.unknown_fields
-    }
-
-    fn as_any(&self) -> &dyn (::std::any::Any) {
-        self as &dyn (::std::any::Any)
-    }
-    fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) {
-        self as &mut dyn (::std::any::Any)
-    }
-    fn into_any(self: ::std::boxed::Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
-        self
-    }
-
-    fn descriptor(&self) -> &'static ::protobuf::reflect::MessageDescriptor {
-        Self::descriptor_static()
+    fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {
+        &mut self.special_fields
     }
 
     fn new() -> Ukey2Alert {
         Ukey2Alert::new()
     }
 
-    fn default_instance() -> &'static Ukey2Alert {
-        static instance: ::protobuf::rt::LazyV2<Ukey2Alert> = ::protobuf::rt::LazyV2::INIT;
-        instance.get(Ukey2Alert::new)
-    }
-}
-
-impl ::protobuf::Clear for Ukey2Alert {
     fn clear(&mut self) {
-        self.field_type = ::std::option::Option::None;
-        self.error_message.clear();
-        self.unknown_fields.clear();
+        self.type_ = ::std::option::Option::None;
+        self.error_message = ::std::option::Option::None;
+        self.special_fields.clear();
+    }
+
+    fn default_instance() -> &'static Ukey2Alert {
+        static instance: Ukey2Alert = Ukey2Alert {
+            type_: ::std::option::Option::None,
+            error_message: ::std::option::Option::None,
+            special_fields: ::protobuf::SpecialFields::new(),
+        };
+        &instance
     }
 }
 
-impl ::protobuf::reflect::ProtobufValue for Ukey2Alert {
-    fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef {
-        ::protobuf::reflect::ReflectValueRef::Message(self)
-    }
-}
-
-#[derive(Clone,PartialEq,Eq,Debug,Hash)]
-pub enum Ukey2Alert_AlertType {
-    BAD_MESSAGE = 1,
-    BAD_MESSAGE_TYPE = 2,
-    INCORRECT_MESSAGE = 3,
-    BAD_MESSAGE_DATA = 4,
-    BAD_VERSION = 100,
-    BAD_RANDOM = 101,
-    BAD_HANDSHAKE_CIPHER = 102,
-    BAD_NEXT_PROTOCOL = 103,
-    BAD_PUBLIC_KEY = 104,
-    INTERNAL_ERROR = 200,
-}
-
-impl ::protobuf::ProtobufEnum for Ukey2Alert_AlertType {
-    fn value(&self) -> i32 {
-        *self as i32
+/// Nested message and enums of message `Ukey2Alert`
+pub mod ukey2alert {
+    #[derive(Clone,Copy,PartialEq,Eq,Debug,Hash)]
+    // @@protoc_insertion_point(enum:securegcm.Ukey2Alert.AlertType)
+    pub enum AlertType {
+        // @@protoc_insertion_point(enum_value:securegcm.Ukey2Alert.AlertType.BAD_MESSAGE)
+        BAD_MESSAGE = 1,
+        // @@protoc_insertion_point(enum_value:securegcm.Ukey2Alert.AlertType.BAD_MESSAGE_TYPE)
+        BAD_MESSAGE_TYPE = 2,
+        // @@protoc_insertion_point(enum_value:securegcm.Ukey2Alert.AlertType.INCORRECT_MESSAGE)
+        INCORRECT_MESSAGE = 3,
+        // @@protoc_insertion_point(enum_value:securegcm.Ukey2Alert.AlertType.BAD_MESSAGE_DATA)
+        BAD_MESSAGE_DATA = 4,
+        // @@protoc_insertion_point(enum_value:securegcm.Ukey2Alert.AlertType.BAD_VERSION)
+        BAD_VERSION = 100,
+        // @@protoc_insertion_point(enum_value:securegcm.Ukey2Alert.AlertType.BAD_RANDOM)
+        BAD_RANDOM = 101,
+        // @@protoc_insertion_point(enum_value:securegcm.Ukey2Alert.AlertType.BAD_HANDSHAKE_CIPHER)
+        BAD_HANDSHAKE_CIPHER = 102,
+        // @@protoc_insertion_point(enum_value:securegcm.Ukey2Alert.AlertType.BAD_NEXT_PROTOCOL)
+        BAD_NEXT_PROTOCOL = 103,
+        // @@protoc_insertion_point(enum_value:securegcm.Ukey2Alert.AlertType.BAD_PUBLIC_KEY)
+        BAD_PUBLIC_KEY = 104,
+        // @@protoc_insertion_point(enum_value:securegcm.Ukey2Alert.AlertType.INTERNAL_ERROR)
+        INTERNAL_ERROR = 200,
     }
 
-    fn from_i32(value: i32) -> ::std::option::Option<Ukey2Alert_AlertType> {
-        match value {
-            1 => ::std::option::Option::Some(Ukey2Alert_AlertType::BAD_MESSAGE),
-            2 => ::std::option::Option::Some(Ukey2Alert_AlertType::BAD_MESSAGE_TYPE),
-            3 => ::std::option::Option::Some(Ukey2Alert_AlertType::INCORRECT_MESSAGE),
-            4 => ::std::option::Option::Some(Ukey2Alert_AlertType::BAD_MESSAGE_DATA),
-            100 => ::std::option::Option::Some(Ukey2Alert_AlertType::BAD_VERSION),
-            101 => ::std::option::Option::Some(Ukey2Alert_AlertType::BAD_RANDOM),
-            102 => ::std::option::Option::Some(Ukey2Alert_AlertType::BAD_HANDSHAKE_CIPHER),
-            103 => ::std::option::Option::Some(Ukey2Alert_AlertType::BAD_NEXT_PROTOCOL),
-            104 => ::std::option::Option::Some(Ukey2Alert_AlertType::BAD_PUBLIC_KEY),
-            200 => ::std::option::Option::Some(Ukey2Alert_AlertType::INTERNAL_ERROR),
-            _ => ::std::option::Option::None
+    impl ::protobuf::Enum for AlertType {
+        const NAME: &'static str = "AlertType";
+
+        fn value(&self) -> i32 {
+            *self as i32
+        }
+
+        fn from_i32(value: i32) -> ::std::option::Option<AlertType> {
+            match value {
+                1 => ::std::option::Option::Some(AlertType::BAD_MESSAGE),
+                2 => ::std::option::Option::Some(AlertType::BAD_MESSAGE_TYPE),
+                3 => ::std::option::Option::Some(AlertType::INCORRECT_MESSAGE),
+                4 => ::std::option::Option::Some(AlertType::BAD_MESSAGE_DATA),
+                100 => ::std::option::Option::Some(AlertType::BAD_VERSION),
+                101 => ::std::option::Option::Some(AlertType::BAD_RANDOM),
+                102 => ::std::option::Option::Some(AlertType::BAD_HANDSHAKE_CIPHER),
+                103 => ::std::option::Option::Some(AlertType::BAD_NEXT_PROTOCOL),
+                104 => ::std::option::Option::Some(AlertType::BAD_PUBLIC_KEY),
+                200 => ::std::option::Option::Some(AlertType::INTERNAL_ERROR),
+                _ => ::std::option::Option::None
+            }
+        }
+
+        const VALUES: &'static [AlertType] = &[
+            AlertType::BAD_MESSAGE,
+            AlertType::BAD_MESSAGE_TYPE,
+            AlertType::INCORRECT_MESSAGE,
+            AlertType::BAD_MESSAGE_DATA,
+            AlertType::BAD_VERSION,
+            AlertType::BAD_RANDOM,
+            AlertType::BAD_HANDSHAKE_CIPHER,
+            AlertType::BAD_NEXT_PROTOCOL,
+            AlertType::BAD_PUBLIC_KEY,
+            AlertType::INTERNAL_ERROR,
+        ];
+    }
+
+    // Note, `Default` is implemented although default value is not 0
+    impl ::std::default::Default for AlertType {
+        fn default() -> Self {
+            AlertType::BAD_MESSAGE
         }
     }
 
-    fn values() -> &'static [Self] {
-        static values: &'static [Ukey2Alert_AlertType] = &[
-            Ukey2Alert_AlertType::BAD_MESSAGE,
-            Ukey2Alert_AlertType::BAD_MESSAGE_TYPE,
-            Ukey2Alert_AlertType::INCORRECT_MESSAGE,
-            Ukey2Alert_AlertType::BAD_MESSAGE_DATA,
-            Ukey2Alert_AlertType::BAD_VERSION,
-            Ukey2Alert_AlertType::BAD_RANDOM,
-            Ukey2Alert_AlertType::BAD_HANDSHAKE_CIPHER,
-            Ukey2Alert_AlertType::BAD_NEXT_PROTOCOL,
-            Ukey2Alert_AlertType::BAD_PUBLIC_KEY,
-            Ukey2Alert_AlertType::INTERNAL_ERROR,
-        ];
-        values
-    }
-}
-
-impl ::std::marker::Copy for Ukey2Alert_AlertType {
-}
-
-// Note, `Default` is implemented although default value is not 0
-impl ::std::default::Default for Ukey2Alert_AlertType {
-    fn default() -> Self {
-        Ukey2Alert_AlertType::BAD_MESSAGE
-    }
-}
-
-impl ::protobuf::reflect::ProtobufValue for Ukey2Alert_AlertType {
-    fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef {
-        ::protobuf::reflect::ReflectValueRef::Enum(::protobuf::ProtobufEnum::descriptor(self))
-    }
 }
 
 #[derive(PartialEq,Clone,Default,Debug)]
+// @@protoc_insertion_point(message:securegcm.Ukey2ClientInit)
 pub struct Ukey2ClientInit {
     // message fields
-    version: ::std::option::Option<i32>,
-    random: ::protobuf::SingularField<::std::vec::Vec<u8>>,
-    pub cipher_commitments: ::protobuf::RepeatedField<Ukey2ClientInit_CipherCommitment>,
-    next_protocol: ::protobuf::SingularField<::std::string::String>,
+    // @@protoc_insertion_point(field:securegcm.Ukey2ClientInit.version)
+    pub version: ::std::option::Option<i32>,
+    // @@protoc_insertion_point(field:securegcm.Ukey2ClientInit.random)
+    pub random: ::std::option::Option<::std::vec::Vec<u8>>,
+    // @@protoc_insertion_point(field:securegcm.Ukey2ClientInit.cipher_commitments)
+    pub cipher_commitments: ::std::vec::Vec<ukey2client_init::CipherCommitment>,
+    // @@protoc_insertion_point(field:securegcm.Ukey2ClientInit.next_protocol)
+    pub next_protocol: ::std::option::Option<::std::string::String>,
+    // @@protoc_insertion_point(field:securegcm.Ukey2ClientInit.other_next_protocols)
+    pub other_next_protocols: ::std::vec::Vec<::std::string::String>,
     // special fields
-    pub unknown_fields: ::protobuf::UnknownFields,
-    pub cached_size: ::protobuf::CachedSize,
+    // @@protoc_insertion_point(special_field:securegcm.Ukey2ClientInit.special_fields)
+    pub special_fields: ::protobuf::SpecialFields,
 }
 
 impl<'a> ::std::default::Default for &'a Ukey2ClientInit {
@@ -534,10 +519,10 @@
 
     // optional int32 version = 1;
 
-
-    pub fn get_version(&self) -> i32 {
+    pub fn version(&self) -> i32 {
         self.version.unwrap_or(0)
     }
+
     pub fn clear_version(&mut self) {
         self.version = ::std::option::Option::None;
     }
@@ -553,15 +538,15 @@
 
     // optional bytes random = 2;
 
-
-    pub fn get_random(&self) -> &[u8] {
+    pub fn random(&self) -> &[u8] {
         match self.random.as_ref() {
-            Some(v) => &v,
+            Some(v) => v,
             None => &[],
         }
     }
+
     pub fn clear_random(&mut self) {
-        self.random.clear();
+        self.random = ::std::option::Option::None;
     }
 
     pub fn has_random(&self) -> bool {
@@ -570,14 +555,14 @@
 
     // Param is passed by value, moved
     pub fn set_random(&mut self, v: ::std::vec::Vec<u8>) {
-        self.random = ::protobuf::SingularField::some(v);
+        self.random = ::std::option::Option::Some(v);
     }
 
     // Mutable pointer to the field.
     // If field is not initialized, it is initialized with default value first.
     pub fn mut_random(&mut self) -> &mut ::std::vec::Vec<u8> {
         if self.random.is_none() {
-            self.random.set_default();
+            self.random = ::std::option::Option::Some(::std::vec::Vec::new());
         }
         self.random.as_mut().unwrap()
     }
@@ -587,42 +572,17 @@
         self.random.take().unwrap_or_else(|| ::std::vec::Vec::new())
     }
 
-    // repeated .securegcm.Ukey2ClientInit.CipherCommitment cipher_commitments = 3;
-
-
-    pub fn get_cipher_commitments(&self) -> &[Ukey2ClientInit_CipherCommitment] {
-        &self.cipher_commitments
-    }
-    pub fn clear_cipher_commitments(&mut self) {
-        self.cipher_commitments.clear();
-    }
-
-    // Param is passed by value, moved
-    pub fn set_cipher_commitments(&mut self, v: ::protobuf::RepeatedField<Ukey2ClientInit_CipherCommitment>) {
-        self.cipher_commitments = v;
-    }
-
-    // Mutable pointer to the field.
-    pub fn mut_cipher_commitments(&mut self) -> &mut ::protobuf::RepeatedField<Ukey2ClientInit_CipherCommitment> {
-        &mut self.cipher_commitments
-    }
-
-    // Take field
-    pub fn take_cipher_commitments(&mut self) -> ::protobuf::RepeatedField<Ukey2ClientInit_CipherCommitment> {
-        ::std::mem::replace(&mut self.cipher_commitments, ::protobuf::RepeatedField::new())
-    }
-
     // optional string next_protocol = 4;
 
-
-    pub fn get_next_protocol(&self) -> &str {
+    pub fn next_protocol(&self) -> &str {
         match self.next_protocol.as_ref() {
-            Some(v) => &v,
+            Some(v) => v,
             None => "",
         }
     }
+
     pub fn clear_next_protocol(&mut self) {
-        self.next_protocol.clear();
+        self.next_protocol = ::std::option::Option::None;
     }
 
     pub fn has_next_protocol(&self) -> bool {
@@ -631,14 +591,14 @@
 
     // Param is passed by value, moved
     pub fn set_next_protocol(&mut self, v: ::std::string::String) {
-        self.next_protocol = ::protobuf::SingularField::some(v);
+        self.next_protocol = ::std::option::Option::Some(v);
     }
 
     // Mutable pointer to the field.
     // If field is not initialized, it is initialized with default value first.
     pub fn mut_next_protocol(&mut self) -> &mut ::std::string::String {
         if self.next_protocol.is_none() {
-            self.next_protocol.set_default();
+            self.next_protocol = ::std::option::Option::Some(::std::string::String::new());
         }
         self.next_protocol.as_mut().unwrap()
     }
@@ -650,37 +610,32 @@
 }
 
 impl ::protobuf::Message for Ukey2ClientInit {
+    const NAME: &'static str = "Ukey2ClientInit";
+
     fn is_initialized(&self) -> bool {
-        for v in &self.cipher_commitments {
-            if !v.is_initialized() {
-                return false;
-            }
-        };
         true
     }
 
-    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::ProtobufResult<()> {
-        while !is.eof()? {
-            let (field_number, wire_type) = is.read_tag_unpack()?;
-            match field_number {
-                1 => {
-                    if wire_type != ::protobuf::wire_format::WireTypeVarint {
-                        return ::std::result::Result::Err(::protobuf::rt::unexpected_wire_type(wire_type));
-                    }
-                    let tmp = is.read_int32()?;
-                    self.version = ::std::option::Option::Some(tmp);
+    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {
+        while let Some(tag) = is.read_raw_tag_or_eof()? {
+            match tag {
+                8 => {
+                    self.version = ::std::option::Option::Some(is.read_int32()?);
                 },
-                2 => {
-                    ::protobuf::rt::read_singular_bytes_into(wire_type, is, &mut self.random)?;
+                18 => {
+                    self.random = ::std::option::Option::Some(is.read_bytes()?);
                 },
-                3 => {
-                    ::protobuf::rt::read_repeated_message_into(wire_type, is, &mut self.cipher_commitments)?;
+                26 => {
+                    self.cipher_commitments.push(is.read_message()?);
                 },
-                4 => {
-                    ::protobuf::rt::read_singular_string_into(wire_type, is, &mut self.next_protocol)?;
+                34 => {
+                    self.next_protocol = ::std::option::Option::Some(is.read_string()?);
                 },
-                _ => {
-                    ::protobuf::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?;
+                42 => {
+                    self.other_next_protocols.push(is.read_string()?);
+                },
+                tag => {
+                    ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;
                 },
             };
         }
@@ -689,283 +644,264 @@
 
     // Compute sizes of nested messages
     #[allow(unused_variables)]
-    fn compute_size(&self) -> u32 {
+    fn compute_size(&self) -> u64 {
         let mut my_size = 0;
         if let Some(v) = self.version {
-            my_size += ::protobuf::rt::value_size(1, v, ::protobuf::wire_format::WireTypeVarint);
+            my_size += ::protobuf::rt::int32_size(1, v);
         }
-        if let Some(ref v) = self.random.as_ref() {
+        if let Some(v) = self.random.as_ref() {
             my_size += ::protobuf::rt::bytes_size(2, &v);
         }
         for value in &self.cipher_commitments {
             let len = value.compute_size();
-            my_size += 1 + ::protobuf::rt::compute_raw_varint32_size(len) + len;
+            my_size += 1 + ::protobuf::rt::compute_raw_varint64_size(len) + len;
         };
-        if let Some(ref v) = self.next_protocol.as_ref() {
+        if let Some(v) = self.next_protocol.as_ref() {
             my_size += ::protobuf::rt::string_size(4, &v);
         }
-        my_size += ::protobuf::rt::unknown_fields_size(self.get_unknown_fields());
-        self.cached_size.set(my_size);
+        for value in &self.other_next_protocols {
+            my_size += ::protobuf::rt::string_size(5, &value);
+        };
+        my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());
+        self.special_fields.cached_size().set(my_size as u32);
         my_size
     }
 
-    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::ProtobufResult<()> {
+    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {
         if let Some(v) = self.version {
             os.write_int32(1, v)?;
         }
-        if let Some(ref v) = self.random.as_ref() {
-            os.write_bytes(2, &v)?;
+        if let Some(v) = self.random.as_ref() {
+            os.write_bytes(2, v)?;
         }
         for v in &self.cipher_commitments {
-            os.write_tag(3, ::protobuf::wire_format::WireTypeLengthDelimited)?;
-            os.write_raw_varint32(v.get_cached_size())?;
-            v.write_to_with_cached_sizes(os)?;
+            ::protobuf::rt::write_message_field_with_cached_size(3, v, os)?;
         };
-        if let Some(ref v) = self.next_protocol.as_ref() {
-            os.write_string(4, &v)?;
+        if let Some(v) = self.next_protocol.as_ref() {
+            os.write_string(4, v)?;
         }
-        os.write_unknown_fields(self.get_unknown_fields())?;
+        for v in &self.other_next_protocols {
+            os.write_string(5, &v)?;
+        };
+        os.write_unknown_fields(self.special_fields.unknown_fields())?;
         ::std::result::Result::Ok(())
     }
 
-    fn get_cached_size(&self) -> u32 {
-        self.cached_size.get()
+    fn special_fields(&self) -> &::protobuf::SpecialFields {
+        &self.special_fields
     }
 
-    fn get_unknown_fields(&self) -> &::protobuf::UnknownFields {
-        &self.unknown_fields
-    }
-
-    fn mut_unknown_fields(&mut self) -> &mut ::protobuf::UnknownFields {
-        &mut self.unknown_fields
-    }
-
-    fn as_any(&self) -> &dyn (::std::any::Any) {
-        self as &dyn (::std::any::Any)
-    }
-    fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) {
-        self as &mut dyn (::std::any::Any)
-    }
-    fn into_any(self: ::std::boxed::Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
-        self
-    }
-
-    fn descriptor(&self) -> &'static ::protobuf::reflect::MessageDescriptor {
-        Self::descriptor_static()
+    fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {
+        &mut self.special_fields
     }
 
     fn new() -> Ukey2ClientInit {
         Ukey2ClientInit::new()
     }
 
-    fn default_instance() -> &'static Ukey2ClientInit {
-        static instance: ::protobuf::rt::LazyV2<Ukey2ClientInit> = ::protobuf::rt::LazyV2::INIT;
-        instance.get(Ukey2ClientInit::new)
-    }
-}
-
-impl ::protobuf::Clear for Ukey2ClientInit {
     fn clear(&mut self) {
         self.version = ::std::option::Option::None;
-        self.random.clear();
+        self.random = ::std::option::Option::None;
         self.cipher_commitments.clear();
-        self.next_protocol.clear();
-        self.unknown_fields.clear();
+        self.next_protocol = ::std::option::Option::None;
+        self.other_next_protocols.clear();
+        self.special_fields.clear();
+    }
+
+    fn default_instance() -> &'static Ukey2ClientInit {
+        static instance: Ukey2ClientInit = Ukey2ClientInit {
+            version: ::std::option::Option::None,
+            random: ::std::option::Option::None,
+            cipher_commitments: ::std::vec::Vec::new(),
+            next_protocol: ::std::option::Option::None,
+            other_next_protocols: ::std::vec::Vec::new(),
+            special_fields: ::protobuf::SpecialFields::new(),
+        };
+        &instance
     }
 }
 
-impl ::protobuf::reflect::ProtobufValue for Ukey2ClientInit {
-    fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef {
-        ::protobuf::reflect::ReflectValueRef::Message(self)
-    }
-}
-
-#[derive(PartialEq,Clone,Default,Debug)]
-pub struct Ukey2ClientInit_CipherCommitment {
-    // message fields
-    handshake_cipher: ::std::option::Option<Ukey2HandshakeCipher>,
-    commitment: ::protobuf::SingularField<::std::vec::Vec<u8>>,
-    // special fields
-    pub unknown_fields: ::protobuf::UnknownFields,
-    pub cached_size: ::protobuf::CachedSize,
-}
-
-impl<'a> ::std::default::Default for &'a Ukey2ClientInit_CipherCommitment {
-    fn default() -> &'a Ukey2ClientInit_CipherCommitment {
-        <Ukey2ClientInit_CipherCommitment as ::protobuf::Message>::default_instance()
-    }
-}
-
-impl Ukey2ClientInit_CipherCommitment {
-    pub fn new() -> Ukey2ClientInit_CipherCommitment {
-        ::std::default::Default::default()
+/// Nested message and enums of message `Ukey2ClientInit`
+pub mod ukey2client_init {
+    #[derive(PartialEq,Clone,Default,Debug)]
+    // @@protoc_insertion_point(message:securegcm.Ukey2ClientInit.CipherCommitment)
+    pub struct CipherCommitment {
+        // message fields
+        // @@protoc_insertion_point(field:securegcm.Ukey2ClientInit.CipherCommitment.handshake_cipher)
+        pub handshake_cipher: ::std::option::Option<::protobuf::EnumOrUnknown<super::Ukey2HandshakeCipher>>,
+        // @@protoc_insertion_point(field:securegcm.Ukey2ClientInit.CipherCommitment.commitment)
+        pub commitment: ::std::option::Option<::std::vec::Vec<u8>>,
+        // special fields
+        // @@protoc_insertion_point(special_field:securegcm.Ukey2ClientInit.CipherCommitment.special_fields)
+        pub special_fields: ::protobuf::SpecialFields,
     }
 
-    // optional .securegcm.Ukey2HandshakeCipher handshake_cipher = 1;
-
-
-    pub fn get_handshake_cipher(&self) -> Ukey2HandshakeCipher {
-        self.handshake_cipher.unwrap_or(Ukey2HandshakeCipher::RESERVED)
-    }
-    pub fn clear_handshake_cipher(&mut self) {
-        self.handshake_cipher = ::std::option::Option::None;
-    }
-
-    pub fn has_handshake_cipher(&self) -> bool {
-        self.handshake_cipher.is_some()
-    }
-
-    // Param is passed by value, moved
-    pub fn set_handshake_cipher(&mut self, v: Ukey2HandshakeCipher) {
-        self.handshake_cipher = ::std::option::Option::Some(v);
-    }
-
-    // optional bytes commitment = 2;
-
-
-    pub fn get_commitment(&self) -> &[u8] {
-        match self.commitment.as_ref() {
-            Some(v) => &v,
-            None => &[],
+    impl<'a> ::std::default::Default for &'a CipherCommitment {
+        fn default() -> &'a CipherCommitment {
+            <CipherCommitment as ::protobuf::Message>::default_instance()
         }
     }
-    pub fn clear_commitment(&mut self) {
-        self.commitment.clear();
-    }
 
-    pub fn has_commitment(&self) -> bool {
-        self.commitment.is_some()
-    }
-
-    // Param is passed by value, moved
-    pub fn set_commitment(&mut self, v: ::std::vec::Vec<u8>) {
-        self.commitment = ::protobuf::SingularField::some(v);
-    }
-
-    // Mutable pointer to the field.
-    // If field is not initialized, it is initialized with default value first.
-    pub fn mut_commitment(&mut self) -> &mut ::std::vec::Vec<u8> {
-        if self.commitment.is_none() {
-            self.commitment.set_default();
+    impl CipherCommitment {
+        pub fn new() -> CipherCommitment {
+            ::std::default::Default::default()
         }
-        self.commitment.as_mut().unwrap()
+
+        // optional .securegcm.Ukey2HandshakeCipher handshake_cipher = 1;
+
+        pub fn handshake_cipher(&self) -> super::Ukey2HandshakeCipher {
+            match self.handshake_cipher {
+                Some(e) => e.enum_value_or(super::Ukey2HandshakeCipher::RESERVED),
+                None => super::Ukey2HandshakeCipher::RESERVED,
+            }
+        }
+
+        pub fn clear_handshake_cipher(&mut self) {
+            self.handshake_cipher = ::std::option::Option::None;
+        }
+
+        pub fn has_handshake_cipher(&self) -> bool {
+            self.handshake_cipher.is_some()
+        }
+
+        // Param is passed by value, moved
+        pub fn set_handshake_cipher(&mut self, v: super::Ukey2HandshakeCipher) {
+            self.handshake_cipher = ::std::option::Option::Some(::protobuf::EnumOrUnknown::new(v));
+        }
+
+        // optional bytes commitment = 2;
+
+        pub fn commitment(&self) -> &[u8] {
+            match self.commitment.as_ref() {
+                Some(v) => v,
+                None => &[],
+            }
+        }
+
+        pub fn clear_commitment(&mut self) {
+            self.commitment = ::std::option::Option::None;
+        }
+
+        pub fn has_commitment(&self) -> bool {
+            self.commitment.is_some()
+        }
+
+        // Param is passed by value, moved
+        pub fn set_commitment(&mut self, v: ::std::vec::Vec<u8>) {
+            self.commitment = ::std::option::Option::Some(v);
+        }
+
+        // Mutable pointer to the field.
+        // If field is not initialized, it is initialized with default value first.
+        pub fn mut_commitment(&mut self) -> &mut ::std::vec::Vec<u8> {
+            if self.commitment.is_none() {
+                self.commitment = ::std::option::Option::Some(::std::vec::Vec::new());
+            }
+            self.commitment.as_mut().unwrap()
+        }
+
+        // Take field
+        pub fn take_commitment(&mut self) -> ::std::vec::Vec<u8> {
+            self.commitment.take().unwrap_or_else(|| ::std::vec::Vec::new())
+        }
     }
 
-    // Take field
-    pub fn take_commitment(&mut self) -> ::std::vec::Vec<u8> {
-        self.commitment.take().unwrap_or_else(|| ::std::vec::Vec::new())
-    }
-}
+    impl ::protobuf::Message for CipherCommitment {
+        const NAME: &'static str = "CipherCommitment";
 
-impl ::protobuf::Message for Ukey2ClientInit_CipherCommitment {
-    fn is_initialized(&self) -> bool {
-        true
-    }
+        fn is_initialized(&self) -> bool {
+            true
+        }
 
-    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::ProtobufResult<()> {
-        while !is.eof()? {
-            let (field_number, wire_type) = is.read_tag_unpack()?;
-            match field_number {
-                1 => {
-                    ::protobuf::rt::read_proto2_enum_with_unknown_fields_into(wire_type, is, &mut self.handshake_cipher, 1, &mut self.unknown_fields)?
-                },
-                2 => {
-                    ::protobuf::rt::read_singular_bytes_into(wire_type, is, &mut self.commitment)?;
-                },
-                _ => {
-                    ::protobuf::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?;
-                },
+        fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {
+            while let Some(tag) = is.read_raw_tag_or_eof()? {
+                match tag {
+                    8 => {
+                        self.handshake_cipher = ::std::option::Option::Some(is.read_enum_or_unknown()?);
+                    },
+                    18 => {
+                        self.commitment = ::std::option::Option::Some(is.read_bytes()?);
+                    },
+                    tag => {
+                        ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;
+                    },
+                };
+            }
+            ::std::result::Result::Ok(())
+        }
+
+        // Compute sizes of nested messages
+        #[allow(unused_variables)]
+        fn compute_size(&self) -> u64 {
+            let mut my_size = 0;
+            if let Some(v) = self.handshake_cipher {
+                my_size += ::protobuf::rt::int32_size(1, v.value());
+            }
+            if let Some(v) = self.commitment.as_ref() {
+                my_size += ::protobuf::rt::bytes_size(2, &v);
+            }
+            my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());
+            self.special_fields.cached_size().set(my_size as u32);
+            my_size
+        }
+
+        fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {
+            if let Some(v) = self.handshake_cipher {
+                os.write_enum(1, ::protobuf::EnumOrUnknown::value(&v))?;
+            }
+            if let Some(v) = self.commitment.as_ref() {
+                os.write_bytes(2, v)?;
+            }
+            os.write_unknown_fields(self.special_fields.unknown_fields())?;
+            ::std::result::Result::Ok(())
+        }
+
+        fn special_fields(&self) -> &::protobuf::SpecialFields {
+            &self.special_fields
+        }
+
+        fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {
+            &mut self.special_fields
+        }
+
+        fn new() -> CipherCommitment {
+            CipherCommitment::new()
+        }
+
+        fn clear(&mut self) {
+            self.handshake_cipher = ::std::option::Option::None;
+            self.commitment = ::std::option::Option::None;
+            self.special_fields.clear();
+        }
+
+        fn default_instance() -> &'static CipherCommitment {
+            static instance: CipherCommitment = CipherCommitment {
+                handshake_cipher: ::std::option::Option::None,
+                commitment: ::std::option::Option::None,
+                special_fields: ::protobuf::SpecialFields::new(),
             };
+            &instance
         }
-        ::std::result::Result::Ok(())
-    }
-
-    // Compute sizes of nested messages
-    #[allow(unused_variables)]
-    fn compute_size(&self) -> u32 {
-        let mut my_size = 0;
-        if let Some(v) = self.handshake_cipher {
-            my_size += ::protobuf::rt::enum_size(1, v);
-        }
-        if let Some(ref v) = self.commitment.as_ref() {
-            my_size += ::protobuf::rt::bytes_size(2, &v);
-        }
-        my_size += ::protobuf::rt::unknown_fields_size(self.get_unknown_fields());
-        self.cached_size.set(my_size);
-        my_size
-    }
-
-    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::ProtobufResult<()> {
-        if let Some(v) = self.handshake_cipher {
-            os.write_enum(1, ::protobuf::ProtobufEnum::value(&v))?;
-        }
-        if let Some(ref v) = self.commitment.as_ref() {
-            os.write_bytes(2, &v)?;
-        }
-        os.write_unknown_fields(self.get_unknown_fields())?;
-        ::std::result::Result::Ok(())
-    }
-
-    fn get_cached_size(&self) -> u32 {
-        self.cached_size.get()
-    }
-
-    fn get_unknown_fields(&self) -> &::protobuf::UnknownFields {
-        &self.unknown_fields
-    }
-
-    fn mut_unknown_fields(&mut self) -> &mut ::protobuf::UnknownFields {
-        &mut self.unknown_fields
-    }
-
-    fn as_any(&self) -> &dyn (::std::any::Any) {
-        self as &dyn (::std::any::Any)
-    }
-    fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) {
-        self as &mut dyn (::std::any::Any)
-    }
-    fn into_any(self: ::std::boxed::Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
-        self
-    }
-
-    fn descriptor(&self) -> &'static ::protobuf::reflect::MessageDescriptor {
-        Self::descriptor_static()
-    }
-
-    fn new() -> Ukey2ClientInit_CipherCommitment {
-        Ukey2ClientInit_CipherCommitment::new()
-    }
-
-    fn default_instance() -> &'static Ukey2ClientInit_CipherCommitment {
-        static instance: ::protobuf::rt::LazyV2<Ukey2ClientInit_CipherCommitment> = ::protobuf::rt::LazyV2::INIT;
-        instance.get(Ukey2ClientInit_CipherCommitment::new)
-    }
-}
-
-impl ::protobuf::Clear for Ukey2ClientInit_CipherCommitment {
-    fn clear(&mut self) {
-        self.handshake_cipher = ::std::option::Option::None;
-        self.commitment.clear();
-        self.unknown_fields.clear();
-    }
-}
-
-impl ::protobuf::reflect::ProtobufValue for Ukey2ClientInit_CipherCommitment {
-    fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef {
-        ::protobuf::reflect::ReflectValueRef::Message(self)
     }
 }
 
 #[derive(PartialEq,Clone,Default,Debug)]
+// @@protoc_insertion_point(message:securegcm.Ukey2ServerInit)
 pub struct Ukey2ServerInit {
     // message fields
-    version: ::std::option::Option<i32>,
-    random: ::protobuf::SingularField<::std::vec::Vec<u8>>,
-    handshake_cipher: ::std::option::Option<Ukey2HandshakeCipher>,
-    public_key: ::protobuf::SingularField<::std::vec::Vec<u8>>,
+    // @@protoc_insertion_point(field:securegcm.Ukey2ServerInit.version)
+    pub version: ::std::option::Option<i32>,
+    // @@protoc_insertion_point(field:securegcm.Ukey2ServerInit.random)
+    pub random: ::std::option::Option<::std::vec::Vec<u8>>,
+    // @@protoc_insertion_point(field:securegcm.Ukey2ServerInit.handshake_cipher)
+    pub handshake_cipher: ::std::option::Option<::protobuf::EnumOrUnknown<Ukey2HandshakeCipher>>,
+    // @@protoc_insertion_point(field:securegcm.Ukey2ServerInit.public_key)
+    pub public_key: ::std::option::Option<::std::vec::Vec<u8>>,
+    // @@protoc_insertion_point(field:securegcm.Ukey2ServerInit.selected_next_protocol)
+    pub selected_next_protocol: ::std::option::Option<::std::string::String>,
     // special fields
-    pub unknown_fields: ::protobuf::UnknownFields,
-    pub cached_size: ::protobuf::CachedSize,
+    // @@protoc_insertion_point(special_field:securegcm.Ukey2ServerInit.special_fields)
+    pub special_fields: ::protobuf::SpecialFields,
 }
 
 impl<'a> ::std::default::Default for &'a Ukey2ServerInit {
@@ -981,10 +917,10 @@
 
     // optional int32 version = 1;
 
-
-    pub fn get_version(&self) -> i32 {
+    pub fn version(&self) -> i32 {
         self.version.unwrap_or(0)
     }
+
     pub fn clear_version(&mut self) {
         self.version = ::std::option::Option::None;
     }
@@ -1000,15 +936,15 @@
 
     // optional bytes random = 2;
 
-
-    pub fn get_random(&self) -> &[u8] {
+    pub fn random(&self) -> &[u8] {
         match self.random.as_ref() {
-            Some(v) => &v,
+            Some(v) => v,
             None => &[],
         }
     }
+
     pub fn clear_random(&mut self) {
-        self.random.clear();
+        self.random = ::std::option::Option::None;
     }
 
     pub fn has_random(&self) -> bool {
@@ -1017,14 +953,14 @@
 
     // Param is passed by value, moved
     pub fn set_random(&mut self, v: ::std::vec::Vec<u8>) {
-        self.random = ::protobuf::SingularField::some(v);
+        self.random = ::std::option::Option::Some(v);
     }
 
     // Mutable pointer to the field.
     // If field is not initialized, it is initialized with default value first.
     pub fn mut_random(&mut self) -> &mut ::std::vec::Vec<u8> {
         if self.random.is_none() {
-            self.random.set_default();
+            self.random = ::std::option::Option::Some(::std::vec::Vec::new());
         }
         self.random.as_mut().unwrap()
     }
@@ -1036,10 +972,13 @@
 
     // optional .securegcm.Ukey2HandshakeCipher handshake_cipher = 3;
 
-
-    pub fn get_handshake_cipher(&self) -> Ukey2HandshakeCipher {
-        self.handshake_cipher.unwrap_or(Ukey2HandshakeCipher::RESERVED)
+    pub fn handshake_cipher(&self) -> Ukey2HandshakeCipher {
+        match self.handshake_cipher {
+            Some(e) => e.enum_value_or(Ukey2HandshakeCipher::RESERVED),
+            None => Ukey2HandshakeCipher::RESERVED,
+        }
     }
+
     pub fn clear_handshake_cipher(&mut self) {
         self.handshake_cipher = ::std::option::Option::None;
     }
@@ -1050,20 +989,20 @@
 
     // Param is passed by value, moved
     pub fn set_handshake_cipher(&mut self, v: Ukey2HandshakeCipher) {
-        self.handshake_cipher = ::std::option::Option::Some(v);
+        self.handshake_cipher = ::std::option::Option::Some(::protobuf::EnumOrUnknown::new(v));
     }
 
     // optional bytes public_key = 4;
 
-
-    pub fn get_public_key(&self) -> &[u8] {
+    pub fn public_key(&self) -> &[u8] {
         match self.public_key.as_ref() {
-            Some(v) => &v,
+            Some(v) => v,
             None => &[],
         }
     }
+
     pub fn clear_public_key(&mut self) {
-        self.public_key.clear();
+        self.public_key = ::std::option::Option::None;
     }
 
     pub fn has_public_key(&self) -> bool {
@@ -1072,14 +1011,14 @@
 
     // Param is passed by value, moved
     pub fn set_public_key(&mut self, v: ::std::vec::Vec<u8>) {
-        self.public_key = ::protobuf::SingularField::some(v);
+        self.public_key = ::std::option::Option::Some(v);
     }
 
     // Mutable pointer to the field.
     // If field is not initialized, it is initialized with default value first.
     pub fn mut_public_key(&mut self) -> &mut ::std::vec::Vec<u8> {
         if self.public_key.is_none() {
-            self.public_key.set_default();
+            self.public_key = ::std::option::Option::Some(::std::vec::Vec::new());
         }
         self.public_key.as_mut().unwrap()
     }
@@ -1088,35 +1027,71 @@
     pub fn take_public_key(&mut self) -> ::std::vec::Vec<u8> {
         self.public_key.take().unwrap_or_else(|| ::std::vec::Vec::new())
     }
+
+    // optional string selected_next_protocol = 5;
+
+    pub fn selected_next_protocol(&self) -> &str {
+        match self.selected_next_protocol.as_ref() {
+            Some(v) => v,
+            None => "",
+        }
+    }
+
+    pub fn clear_selected_next_protocol(&mut self) {
+        self.selected_next_protocol = ::std::option::Option::None;
+    }
+
+    pub fn has_selected_next_protocol(&self) -> bool {
+        self.selected_next_protocol.is_some()
+    }
+
+    // Param is passed by value, moved
+    pub fn set_selected_next_protocol(&mut self, v: ::std::string::String) {
+        self.selected_next_protocol = ::std::option::Option::Some(v);
+    }
+
+    // Mutable pointer to the field.
+    // If field is not initialized, it is initialized with default value first.
+    pub fn mut_selected_next_protocol(&mut self) -> &mut ::std::string::String {
+        if self.selected_next_protocol.is_none() {
+            self.selected_next_protocol = ::std::option::Option::Some(::std::string::String::new());
+        }
+        self.selected_next_protocol.as_mut().unwrap()
+    }
+
+    // Take field
+    pub fn take_selected_next_protocol(&mut self) -> ::std::string::String {
+        self.selected_next_protocol.take().unwrap_or_else(|| ::std::string::String::new())
+    }
 }
 
 impl ::protobuf::Message for Ukey2ServerInit {
+    const NAME: &'static str = "Ukey2ServerInit";
+
     fn is_initialized(&self) -> bool {
         true
     }
 
-    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::ProtobufResult<()> {
-        while !is.eof()? {
-            let (field_number, wire_type) = is.read_tag_unpack()?;
-            match field_number {
-                1 => {
-                    if wire_type != ::protobuf::wire_format::WireTypeVarint {
-                        return ::std::result::Result::Err(::protobuf::rt::unexpected_wire_type(wire_type));
-                    }
-                    let tmp = is.read_int32()?;
-                    self.version = ::std::option::Option::Some(tmp);
+    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {
+        while let Some(tag) = is.read_raw_tag_or_eof()? {
+            match tag {
+                8 => {
+                    self.version = ::std::option::Option::Some(is.read_int32()?);
                 },
-                2 => {
-                    ::protobuf::rt::read_singular_bytes_into(wire_type, is, &mut self.random)?;
+                18 => {
+                    self.random = ::std::option::Option::Some(is.read_bytes()?);
                 },
-                3 => {
-                    ::protobuf::rt::read_proto2_enum_with_unknown_fields_into(wire_type, is, &mut self.handshake_cipher, 3, &mut self.unknown_fields)?
+                24 => {
+                    self.handshake_cipher = ::std::option::Option::Some(is.read_enum_or_unknown()?);
                 },
-                4 => {
-                    ::protobuf::rt::read_singular_bytes_into(wire_type, is, &mut self.public_key)?;
+                34 => {
+                    self.public_key = ::std::option::Option::Some(is.read_bytes()?);
                 },
-                _ => {
-                    ::protobuf::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?;
+                42 => {
+                    self.selected_next_protocol = ::std::option::Option::Some(is.read_string()?);
+                },
+                tag => {
+                    ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;
                 },
             };
         }
@@ -1125,101 +1100,91 @@
 
     // Compute sizes of nested messages
     #[allow(unused_variables)]
-    fn compute_size(&self) -> u32 {
+    fn compute_size(&self) -> u64 {
         let mut my_size = 0;
         if let Some(v) = self.version {
-            my_size += ::protobuf::rt::value_size(1, v, ::protobuf::wire_format::WireTypeVarint);
+            my_size += ::protobuf::rt::int32_size(1, v);
         }
-        if let Some(ref v) = self.random.as_ref() {
+        if let Some(v) = self.random.as_ref() {
             my_size += ::protobuf::rt::bytes_size(2, &v);
         }
         if let Some(v) = self.handshake_cipher {
-            my_size += ::protobuf::rt::enum_size(3, v);
+            my_size += ::protobuf::rt::int32_size(3, v.value());
         }
-        if let Some(ref v) = self.public_key.as_ref() {
+        if let Some(v) = self.public_key.as_ref() {
             my_size += ::protobuf::rt::bytes_size(4, &v);
         }
-        my_size += ::protobuf::rt::unknown_fields_size(self.get_unknown_fields());
-        self.cached_size.set(my_size);
+        if let Some(v) = self.selected_next_protocol.as_ref() {
+            my_size += ::protobuf::rt::string_size(5, &v);
+        }
+        my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());
+        self.special_fields.cached_size().set(my_size as u32);
         my_size
     }
 
-    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::ProtobufResult<()> {
+    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {
         if let Some(v) = self.version {
             os.write_int32(1, v)?;
         }
-        if let Some(ref v) = self.random.as_ref() {
-            os.write_bytes(2, &v)?;
+        if let Some(v) = self.random.as_ref() {
+            os.write_bytes(2, v)?;
         }
         if let Some(v) = self.handshake_cipher {
-            os.write_enum(3, ::protobuf::ProtobufEnum::value(&v))?;
+            os.write_enum(3, ::protobuf::EnumOrUnknown::value(&v))?;
         }
-        if let Some(ref v) = self.public_key.as_ref() {
-            os.write_bytes(4, &v)?;
+        if let Some(v) = self.public_key.as_ref() {
+            os.write_bytes(4, v)?;
         }
-        os.write_unknown_fields(self.get_unknown_fields())?;
+        if let Some(v) = self.selected_next_protocol.as_ref() {
+            os.write_string(5, v)?;
+        }
+        os.write_unknown_fields(self.special_fields.unknown_fields())?;
         ::std::result::Result::Ok(())
     }
 
-    fn get_cached_size(&self) -> u32 {
-        self.cached_size.get()
+    fn special_fields(&self) -> &::protobuf::SpecialFields {
+        &self.special_fields
     }
 
-    fn get_unknown_fields(&self) -> &::protobuf::UnknownFields {
-        &self.unknown_fields
-    }
-
-    fn mut_unknown_fields(&mut self) -> &mut ::protobuf::UnknownFields {
-        &mut self.unknown_fields
-    }
-
-    fn as_any(&self) -> &dyn (::std::any::Any) {
-        self as &dyn (::std::any::Any)
-    }
-    fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) {
-        self as &mut dyn (::std::any::Any)
-    }
-    fn into_any(self: ::std::boxed::Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
-        self
-    }
-
-    fn descriptor(&self) -> &'static ::protobuf::reflect::MessageDescriptor {
-        Self::descriptor_static()
+    fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {
+        &mut self.special_fields
     }
 
     fn new() -> Ukey2ServerInit {
         Ukey2ServerInit::new()
     }
 
-    fn default_instance() -> &'static Ukey2ServerInit {
-        static instance: ::protobuf::rt::LazyV2<Ukey2ServerInit> = ::protobuf::rt::LazyV2::INIT;
-        instance.get(Ukey2ServerInit::new)
-    }
-}
-
-impl ::protobuf::Clear for Ukey2ServerInit {
     fn clear(&mut self) {
         self.version = ::std::option::Option::None;
-        self.random.clear();
+        self.random = ::std::option::Option::None;
         self.handshake_cipher = ::std::option::Option::None;
-        self.public_key.clear();
-        self.unknown_fields.clear();
+        self.public_key = ::std::option::Option::None;
+        self.selected_next_protocol = ::std::option::Option::None;
+        self.special_fields.clear();
     }
-}
 
-impl ::protobuf::reflect::ProtobufValue for Ukey2ServerInit {
-    fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef {
-        ::protobuf::reflect::ReflectValueRef::Message(self)
+    fn default_instance() -> &'static Ukey2ServerInit {
+        static instance: Ukey2ServerInit = Ukey2ServerInit {
+            version: ::std::option::Option::None,
+            random: ::std::option::Option::None,
+            handshake_cipher: ::std::option::Option::None,
+            public_key: ::std::option::Option::None,
+            selected_next_protocol: ::std::option::Option::None,
+            special_fields: ::protobuf::SpecialFields::new(),
+        };
+        &instance
     }
 }
 
 #[derive(PartialEq,Clone,Default,Debug)]
+// @@protoc_insertion_point(message:securegcm.Ukey2ClientFinished)
 pub struct Ukey2ClientFinished {
     // message fields
-    public_key: ::protobuf::SingularField<::std::vec::Vec<u8>>,
+    // @@protoc_insertion_point(field:securegcm.Ukey2ClientFinished.public_key)
+    pub public_key: ::std::option::Option<::std::vec::Vec<u8>>,
     // special fields
-    pub unknown_fields: ::protobuf::UnknownFields,
-    pub cached_size: ::protobuf::CachedSize,
+    // @@protoc_insertion_point(special_field:securegcm.Ukey2ClientFinished.special_fields)
+    pub special_fields: ::protobuf::SpecialFields,
 }
 
 impl<'a> ::std::default::Default for &'a Ukey2ClientFinished {
@@ -1235,15 +1200,15 @@
 
     // optional bytes public_key = 1;
 
-
-    pub fn get_public_key(&self) -> &[u8] {
+    pub fn public_key(&self) -> &[u8] {
         match self.public_key.as_ref() {
-            Some(v) => &v,
+            Some(v) => v,
             None => &[],
         }
     }
+
     pub fn clear_public_key(&mut self) {
-        self.public_key.clear();
+        self.public_key = ::std::option::Option::None;
     }
 
     pub fn has_public_key(&self) -> bool {
@@ -1252,14 +1217,14 @@
 
     // Param is passed by value, moved
     pub fn set_public_key(&mut self, v: ::std::vec::Vec<u8>) {
-        self.public_key = ::protobuf::SingularField::some(v);
+        self.public_key = ::std::option::Option::Some(v);
     }
 
     // Mutable pointer to the field.
     // If field is not initialized, it is initialized with default value first.
     pub fn mut_public_key(&mut self) -> &mut ::std::vec::Vec<u8> {
         if self.public_key.is_none() {
-            self.public_key.set_default();
+            self.public_key = ::std::option::Option::Some(::std::vec::Vec::new());
         }
         self.public_key.as_mut().unwrap()
     }
@@ -1271,19 +1236,20 @@
 }
 
 impl ::protobuf::Message for Ukey2ClientFinished {
+    const NAME: &'static str = "Ukey2ClientFinished";
+
     fn is_initialized(&self) -> bool {
         true
     }
 
-    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::ProtobufResult<()> {
-        while !is.eof()? {
-            let (field_number, wire_type) = is.read_tag_unpack()?;
-            match field_number {
-                1 => {
-                    ::protobuf::rt::read_singular_bytes_into(wire_type, is, &mut self.public_key)?;
+    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {
+        while let Some(tag) = is.read_raw_tag_or_eof()? {
+            match tag {
+                10 => {
+                    self.public_key = ::std::option::Option::Some(is.read_bytes()?);
                 },
-                _ => {
-                    ::protobuf::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?;
+                tag => {
+                    ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;
                 },
             };
         }
@@ -1292,81 +1258,64 @@
 
     // Compute sizes of nested messages
     #[allow(unused_variables)]
-    fn compute_size(&self) -> u32 {
+    fn compute_size(&self) -> u64 {
         let mut my_size = 0;
-        if let Some(ref v) = self.public_key.as_ref() {
+        if let Some(v) = self.public_key.as_ref() {
             my_size += ::protobuf::rt::bytes_size(1, &v);
         }
-        my_size += ::protobuf::rt::unknown_fields_size(self.get_unknown_fields());
-        self.cached_size.set(my_size);
+        my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());
+        self.special_fields.cached_size().set(my_size as u32);
         my_size
     }
 
-    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::ProtobufResult<()> {
-        if let Some(ref v) = self.public_key.as_ref() {
-            os.write_bytes(1, &v)?;
+    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {
+        if let Some(v) = self.public_key.as_ref() {
+            os.write_bytes(1, v)?;
         }
-        os.write_unknown_fields(self.get_unknown_fields())?;
+        os.write_unknown_fields(self.special_fields.unknown_fields())?;
         ::std::result::Result::Ok(())
     }
 
-    fn get_cached_size(&self) -> u32 {
-        self.cached_size.get()
+    fn special_fields(&self) -> &::protobuf::SpecialFields {
+        &self.special_fields
     }
 
-    fn get_unknown_fields(&self) -> &::protobuf::UnknownFields {
-        &self.unknown_fields
-    }
-
-    fn mut_unknown_fields(&mut self) -> &mut ::protobuf::UnknownFields {
-        &mut self.unknown_fields
-    }
-
-    fn as_any(&self) -> &dyn (::std::any::Any) {
-        self as &dyn (::std::any::Any)
-    }
-    fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) {
-        self as &mut dyn (::std::any::Any)
-    }
-    fn into_any(self: ::std::boxed::Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
-        self
-    }
-
-    fn descriptor(&self) -> &'static ::protobuf::reflect::MessageDescriptor {
-        Self::descriptor_static()
+    fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {
+        &mut self.special_fields
     }
 
     fn new() -> Ukey2ClientFinished {
         Ukey2ClientFinished::new()
     }
 
-    fn default_instance() -> &'static Ukey2ClientFinished {
-        static instance: ::protobuf::rt::LazyV2<Ukey2ClientFinished> = ::protobuf::rt::LazyV2::INIT;
-        instance.get(Ukey2ClientFinished::new)
-    }
-}
-
-impl ::protobuf::Clear for Ukey2ClientFinished {
     fn clear(&mut self) {
-        self.public_key.clear();
-        self.unknown_fields.clear();
+        self.public_key = ::std::option::Option::None;
+        self.special_fields.clear();
+    }
+
+    fn default_instance() -> &'static Ukey2ClientFinished {
+        static instance: Ukey2ClientFinished = Ukey2ClientFinished {
+            public_key: ::std::option::Option::None,
+            special_fields: ::protobuf::SpecialFields::new(),
+        };
+        &instance
     }
 }
 
-impl ::protobuf::reflect::ProtobufValue for Ukey2ClientFinished {
-    fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef {
-        ::protobuf::reflect::ReflectValueRef::Message(self)
-    }
-}
-
-#[derive(Clone,PartialEq,Eq,Debug,Hash)]
+#[derive(Clone,Copy,PartialEq,Eq,Debug,Hash)]
+// @@protoc_insertion_point(enum:securegcm.Ukey2HandshakeCipher)
 pub enum Ukey2HandshakeCipher {
+    // @@protoc_insertion_point(enum_value:securegcm.Ukey2HandshakeCipher.RESERVED)
     RESERVED = 0,
+    // @@protoc_insertion_point(enum_value:securegcm.Ukey2HandshakeCipher.P256_SHA512)
     P256_SHA512 = 100,
+    // @@protoc_insertion_point(enum_value:securegcm.Ukey2HandshakeCipher.CURVE25519_SHA512)
     CURVE25519_SHA512 = 200,
 }
 
-impl ::protobuf::ProtobufEnum for Ukey2HandshakeCipher {
+impl ::protobuf::Enum for Ukey2HandshakeCipher {
+    const NAME: &'static str = "Ukey2HandshakeCipher";
+
     fn value(&self) -> i32 {
         *self as i32
     }
@@ -1380,17 +1329,11 @@
         }
     }
 
-    fn values() -> &'static [Self] {
-        static values: &'static [Ukey2HandshakeCipher] = &[
-            Ukey2HandshakeCipher::RESERVED,
-            Ukey2HandshakeCipher::P256_SHA512,
-            Ukey2HandshakeCipher::CURVE25519_SHA512,
-        ];
-        values
-    }
-}
-
-impl ::std::marker::Copy for Ukey2HandshakeCipher {
+    const VALUES: &'static [Ukey2HandshakeCipher] = &[
+        Ukey2HandshakeCipher::RESERVED,
+        Ukey2HandshakeCipher::P256_SHA512,
+        Ukey2HandshakeCipher::CURVE25519_SHA512,
+    ];
 }
 
 impl ::std::default::Default for Ukey2HandshakeCipher {
@@ -1399,8 +1342,3 @@
     }
 }
 
-impl ::protobuf::reflect::ProtobufValue for Ukey2HandshakeCipher {
-    fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef {
-        ::protobuf::reflect::ReflectValueRef::Enum(::protobuf::ProtobufEnum::descriptor(self))
-    }
-}
diff --git a/nearby/crypto/crypto_provider/src/hkdf.rs b/nearby/crypto/crypto_provider/src/hkdf.rs
index dab4e13..c905302 100644
--- a/nearby/crypto/crypto_provider/src/hkdf.rs
+++ b/nearby/crypto/crypto_provider/src/hkdf.rs
@@ -33,3 +33,292 @@
 /// an invalid length
 #[derive(Debug)]
 pub struct InvalidLength;
+
+/// Test cases exported for testing specific hkdf implementations
+#[cfg(feature = "testing")]
+pub mod testing {
+    extern crate alloc;
+    use crate::hkdf::Hkdf;
+    pub use crate::testing::prelude::*;
+    use crate::CryptoProvider;
+    use alloc::vec;
+    use alloc::vec::Vec;
+    use core::iter;
+    use core::marker::PhantomData;
+    use hex_literal::hex;
+    use rstest_reuse::template;
+
+    /// Generates the test cases to validate the hkdf implementation.
+    /// For example, to test `MyCryptoProvider`:
+    ///
+    /// ```
+    /// mod tests {
+    ///     use std::marker::PhantomData;
+    ///     use crypto_provider::testing::CryptoProviderTestCase;
+    ///     #[apply(hkdf_test_cases)]
+    ///     fn hkdf_tests(testcase: CryptoProviderTestCase<MyCryptoProvider>){
+    ///         testcase(PhantomData::<MyCryptoProvider>);
+    ///     }
+    /// }
+    /// ```
+    #[template]
+    #[export]
+    #[rstest]
+    #[case::basic_test_hkdf(basic_test_hkdf)]
+    #[case::test_rfc5869_sha256(test_rfc5869_sha256)]
+    #[case::test_lengths(test_lengths)]
+    #[case::test_max_length(test_max_length)]
+    #[case::test_max_length_exceeded(test_max_length_exceeded)]
+    #[case::test_unsupported_length(test_unsupported_length)]
+    #[case::test_expand_multi_info(test_expand_multi_info)]
+    #[case::run_hkdf_sha256_vectors(run_hkdf_sha256_vectors)]
+    #[case::run_hkdf_sha512_vectors(run_hkdf_sha512_vectors)]
+    fn hkdf_test_cases<C: CryptoProvider>(#[case] testcase: CryptoProviderTestCase<C>) {}
+
+    const MAX_SHA256_LENGTH: usize = 255 * (256 / 8); // =8160
+
+    ///
+    pub struct Test<'a> {
+        ikm: &'a [u8],
+        salt: &'a [u8],
+        info: &'a [u8],
+        okm: &'a [u8],
+    }
+
+    /// data taken from sample code in Readme of crates.io page
+    pub fn basic_test_hkdf<C: CryptoProvider>(_: PhantomData<C>) {
+        let ikm = hex!("0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b");
+        let salt = hex!("000102030405060708090a0b0c");
+        let info = hex!("f0f1f2f3f4f5f6f7f8f9");
+
+        let hk = C::HkdfSha256::new(Some(&salt[..]), &ikm);
+        let mut okm = [0u8; 42];
+        hk.expand(&info, &mut okm)
+            .expect("42 is a valid length for Sha256 to output");
+
+        let expected = hex!(
+            "
+        3cb25f25faacd57a90434f64d0362f2a
+        2d2d0a90cf1a5a4c5db02d56ecc4c5bf
+        34007208d5b887185865
+        "
+        );
+        assert_eq!(okm, expected);
+    }
+
+    // Test Vectors from https://tools.ietf.org/html/rfc5869.
+    #[rustfmt::skip]
+    ///
+    pub fn test_rfc5869_sha256<C: CryptoProvider>(_: PhantomData<C>) {
+        let tests = [
+            Test {
+                // Test Case 1
+                ikm: &hex!("0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b"),
+                salt: &hex!("000102030405060708090a0b0c"),
+                info: &hex!("f0f1f2f3f4f5f6f7f8f9"),
+                okm: &hex!("
+                    3cb25f25faacd57a90434f64d0362f2a
+                    2d2d0a90cf1a5a4c5db02d56ecc4c5bf
+                    34007208d5b887185865
+                "),
+            },
+            Test {
+                // Test Case 2
+                ikm: &hex!("
+                    000102030405060708090a0b0c0d0e0f
+                    101112131415161718191a1b1c1d1e1f
+                    202122232425262728292a2b2c2d2e2f
+                    303132333435363738393a3b3c3d3e3f
+                    404142434445464748494a4b4c4d4e4f
+                "),
+                salt: &hex!("
+                    606162636465666768696a6b6c6d6e6f
+                    707172737475767778797a7b7c7d7e7f
+                    808182838485868788898a8b8c8d8e8f
+                    909192939495969798999a9b9c9d9e9f
+                    a0a1a2a3a4a5a6a7a8a9aaabacadaeaf
+                "),
+                info: &hex!("
+                    b0b1b2b3b4b5b6b7b8b9babbbcbdbebf
+                    c0c1c2c3c4c5c6c7c8c9cacbcccdcecf
+                    d0d1d2d3d4d5d6d7d8d9dadbdcdddedf
+                    e0e1e2e3e4e5e6e7e8e9eaebecedeeef
+                    f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff
+                "),
+                okm: &hex!("
+                    b11e398dc80327a1c8e7f78c596a4934
+                    4f012eda2d4efad8a050cc4c19afa97c
+                    59045a99cac7827271cb41c65e590e09
+                    da3275600c2f09b8367793a9aca3db71
+                    cc30c58179ec3e87c14c01d5c1f3434f
+                    1d87
+                "),
+            },
+            Test {
+                // Test Case 3
+                ikm: &hex!("0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b"),
+                salt: &hex!(""),
+                info: &hex!(""),
+                okm: &hex!("
+                    8da4e775a563c18f715f802a063c5a31
+                    b8a11f5c5ee1879ec3454e5f3c738d2d
+                    9d201395faa4b61a96c8
+                "),
+            },
+        ];
+        for Test { ikm, salt, info, okm } in tests.iter() {
+            let salt = if salt.is_empty() {
+                None
+            } else {
+                Some(&salt[..])
+            };
+            let hkdf = C::HkdfSha256::new(salt, ikm);
+            let mut okm2 = vec![0u8; okm.len()];
+            assert!(hkdf.expand(&info[..], &mut okm2).is_ok());
+            assert_eq!(okm2[..], okm[..]);
+        }
+    }
+
+    ///
+    pub fn test_lengths<C: CryptoProvider>(_: PhantomData<C>) {
+        let hkdf = C::HkdfSha256::new(None, &[]);
+        let mut longest = vec![0u8; MAX_SHA256_LENGTH];
+        assert!(hkdf.expand(&[], &mut longest).is_ok());
+        // Runtime is O(length), so exhaustively testing all legal lengths
+        // would take too long (at least without --release). Only test a
+        // subset: the first 500, the last 10, and every 100th in between.
+        // 0 is an invalid key length for openssl, so start at 1
+        let lengths = (1..MAX_SHA256_LENGTH + 1)
+            .filter(|&len| !(500..=MAX_SHA256_LENGTH - 10).contains(&len) || len % 100 == 0);
+
+        for length in lengths {
+            let mut okm = vec![0u8; length];
+
+            assert!(hkdf.expand(&[], &mut okm).is_ok());
+            assert_eq!(okm.len(), length);
+            assert_eq!(okm[..], longest[..length]);
+        }
+    }
+
+    ///
+    pub fn test_max_length<C: CryptoProvider>(_: PhantomData<C>) {
+        let hkdf = C::HkdfSha256::new(Some(&[]), &[]);
+        let mut okm = vec![0u8; MAX_SHA256_LENGTH];
+        assert!(hkdf.expand(&[], &mut okm).is_ok());
+    }
+
+    ///
+    pub fn test_max_length_exceeded<C: CryptoProvider>(_: PhantomData<C>) {
+        let hkdf = C::HkdfSha256::new(Some(&[]), &[]);
+        let mut okm = vec![0u8; MAX_SHA256_LENGTH + 1];
+        assert!(hkdf.expand(&[], &mut okm).is_err());
+    }
+
+    ///
+    pub fn test_unsupported_length<C: CryptoProvider>(_: PhantomData<C>) {
+        let hkdf = C::HkdfSha256::new(Some(&[]), &[]);
+        let mut okm = vec![0u8; 90000];
+        assert!(hkdf.expand(&[], &mut okm).is_err());
+    }
+
+    ///
+    pub fn test_expand_multi_info<C: CryptoProvider>(_: PhantomData<C>) {
+        let info_components = &[
+            &b"09090909090909090909090909090909090909090909"[..],
+            &b"8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a"[..],
+            &b"0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0"[..],
+            &b"4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4"[..],
+            &b"1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d"[..],
+        ];
+
+        let hkdf = C::HkdfSha256::new(None, b"some ikm here");
+
+        // Compute HKDF-Expand on the concatenation of all the info components
+        let mut oneshot_res = [0u8; 16];
+        hkdf.expand(&info_components.concat(), &mut oneshot_res)
+            .unwrap();
+
+        // Now iteratively join the components of info_components until it's all 1 component. The value
+        // of HKDF-Expand should be the same throughout
+        let mut num_concatted = 0;
+        let mut info_head = Vec::new();
+
+        while num_concatted < info_components.len() {
+            info_head.extend(info_components[num_concatted]);
+
+            // Build the new input to be the info head followed by the remaining components
+            let input: Vec<&[u8]> = iter::once(info_head.as_slice())
+                .chain(info_components.iter().cloned().skip(num_concatted + 1))
+                .collect();
+
+            // Compute and compare to the one-shot answer
+            let mut multipart_res = [0u8; 16];
+            hkdf.expand_multi_info(&input, &mut multipart_res).unwrap();
+            assert_eq!(multipart_res, oneshot_res);
+            num_concatted += 1;
+        }
+    }
+
+    ///
+    pub fn run_hkdf_sha256_vectors<C: CryptoProvider>(_: PhantomData<C>) {
+        run_hkdf_test_vectors::<C::HkdfSha256>(HashAlg::Sha256)
+    }
+
+    ///
+    pub fn run_hkdf_sha512_vectors<C: CryptoProvider>(_: PhantomData<C>) {
+        run_hkdf_test_vectors::<C::HkdfSha512>(HashAlg::Sha512)
+    }
+
+    enum HashAlg {
+        Sha256,
+        Sha512,
+    }
+
+    ///
+    fn run_hkdf_test_vectors<K: Hkdf>(hash: HashAlg) {
+        let test_name = match hash {
+            HashAlg::Sha256 => wycheproof::hkdf::TestName::HkdfSha256,
+            HashAlg::Sha512 => wycheproof::hkdf::TestName::HkdfSha512,
+        };
+
+        let test_set =
+            wycheproof::hkdf::TestSet::load(test_name).expect("should be able to load test set");
+        for test_group in test_set.test_groups {
+            for test in test_group.tests {
+                let ikm = test.ikm;
+                let salt = test.salt;
+                let info = test.info;
+                let okm = test.okm;
+                let tc_id = test.tc_id;
+                if let Some(desc) = run_test::<K>(
+                    ikm.as_slice(),
+                    salt.as_slice(),
+                    info.as_slice(),
+                    okm.as_slice(),
+                ) {
+                    panic!(
+                        "\n\
+                         Failed test {tc_id}: {desc}\n\
+                         ikm:\t{ikm:?}\n\
+                         salt:\t{salt:?}\n\
+                         info:\t{info:?}\n\
+                         okm:\t{okm:?}\n"
+                    );
+                }
+            }
+        }
+    }
+
+    fn run_test<K: Hkdf>(ikm: &[u8], salt: &[u8], info: &[u8], okm: &[u8]) -> Option<&'static str> {
+        let prk = K::new(Some(salt), ikm);
+        let mut got_okm = vec![0; okm.len()];
+
+        if prk.expand(info, &mut got_okm).is_err() {
+            return Some("prk expand");
+        }
+        if got_okm != okm {
+            return Some("mismatch in okm");
+        }
+        None
+    }
+}
diff --git a/nearby/crypto/crypto_provider/src/hmac.rs b/nearby/crypto/crypto_provider/src/hmac.rs
index c5a9ae1..40be189 100644
--- a/nearby/crypto/crypto_provider/src/hmac.rs
+++ b/nearby/crypto/crypto_provider/src/hmac.rs
@@ -44,3 +44,125 @@
 /// Error output when the provided key material length is invalid
 #[derive(Debug)]
 pub struct InvalidLength;
+
+/// Test cases exported for testing specific hmac implementations
+#[cfg(feature = "testing")]
+pub mod testing {
+    use crate::hmac::Hmac;
+    use crate::rstest_reuse::template;
+    pub use crate::testing::prelude::*;
+    use crate::CryptoProvider;
+    use core::cmp::min;
+    use core::marker::PhantomData;
+    use wycheproof::TestResult;
+
+    /// Generates the test cases to validate the hmac implementation.
+    /// For example, to test `MyCryptoProvider`:
+    ///
+    /// ```
+    /// mod tests {
+    ///     use std::marker::PhantomData;
+    ///     use crypto_provider::testing::CryptoProviderTestCase;
+    ///     #[apply(hmac_test_cases)]
+    ///     fn hmac_tests(testcase: CryptoProviderTestCase<MyCryptoProvider>){
+    ///         testcase(PhantomData::<MyCryptoProvider>);
+    ///     }
+    /// }
+    /// ```
+    #[template]
+    #[export]
+    #[rstest]
+    #[case::hmac_sha256_test_vectors(hmac_sha256_test_vectors)]
+    #[case::hmac_sha512_test_vectors(hmac_sha512_test_vectors)]
+    fn hmac_test_cases<C: CryptoProvider>(#[case] testcase: CryptoProviderTestCase<C>) {}
+
+    /// Run wycheproof hmac sha256 test vectors on provided CryptoProvider
+    pub fn hmac_sha256_test_vectors<C: CryptoProvider>(_: PhantomData<C>) {
+        run_hmac_test_vectors::<32, C::HmacSha256>(HashAlg::Sha256)
+    }
+
+    /// Run wycheproof hmac sha512 test vectors on provided CryptoProvider
+    pub fn hmac_sha512_test_vectors<C: CryptoProvider>(_: PhantomData<C>) {
+        run_hmac_test_vectors::<64, C::HmacSha512>(HashAlg::Sha512)
+    }
+
+    enum HashAlg {
+        Sha256,
+        Sha512,
+    }
+
+    // Tests vectors from Project Wycheproof:
+    // https://github.com/google/wycheproof
+    fn run_hmac_test_vectors<const N: usize, H: Hmac<N>>(hash: HashAlg) {
+        let test_name = match hash {
+            HashAlg::Sha256 => wycheproof::mac::TestName::HmacSha256,
+            HashAlg::Sha512 => wycheproof::mac::TestName::HmacSha512,
+        };
+        let test_set =
+            wycheproof::mac::TestSet::load(test_name).expect("should be able to load test set");
+
+        for test_group in test_set.test_groups {
+            for test in test_group.tests {
+                let key = test.key;
+                let msg = test.msg;
+                let tag = test.tag;
+                let tc_id = test.tc_id;
+                let valid = match test.result {
+                    TestResult::Valid | TestResult::Acceptable => true,
+                    TestResult::Invalid => false,
+                };
+
+                if let Some(desc) =
+                    run_test::<N, H>(key.as_slice(), msg.as_slice(), tag.as_slice(), valid)
+                {
+                    panic!(
+                        "\n\
+                         Failed test {tc_id}: {desc}\n\
+                         key:\t{key:?}\n\
+                         msg:\t{msg:?}\n\
+                         tag:\t{tag:?}\n",
+                    );
+                }
+            }
+        }
+    }
+
+    fn run_test<const N: usize, H: Hmac<N>>(
+        key: &[u8],
+        input: &[u8],
+        tag: &[u8],
+        valid_data: bool,
+    ) -> Option<&'static str> {
+        let mut mac = H::new_from_slice(key).unwrap();
+        mac.update(input);
+        let result = mac.finalize();
+        let n = tag.len();
+        let result_bytes = &result[..n];
+
+        if valid_data {
+            if result_bytes != tag {
+                return Some("whole message");
+            }
+        } else {
+            return if result_bytes == tag {
+                Some("invalid should not match")
+            } else {
+                None
+            };
+        }
+
+        // test reading different chunk sizes
+        for chunk_size in 1..min(64, input.len()) {
+            let mut mac = H::new_from_slice(key).unwrap();
+            for chunk in input.chunks(chunk_size) {
+                mac.update(chunk);
+            }
+            let res = mac.verify_truncated_left(tag);
+            if res.is_err() {
+                return Some("chunked message");
+            }
+        }
+
+        None
+    }
+}
diff --git a/nearby/crypto/crypto_provider/src/lib.rs b/nearby/crypto/crypto_provider/src/lib.rs
index e9ce8b8..a61370c 100644
--- a/nearby/crypto/crypto_provider/src/lib.rs
+++ b/nearby/crypto/crypto_provider/src/lib.rs
@@ -46,11 +46,11 @@
 /// Uber crypto trait which defines the traits for all crypto primitives as associated types
 pub trait CryptoProvider: Clone + Debug + PartialEq + Eq + Send {
     /// The Hkdf type which implements the hkdf trait
-    type HkdfSha256: hkdf::Hkdf + Clone;
+    type HkdfSha256: hkdf::Hkdf;
     /// The Hmac type which implements the hmac trait
     type HmacSha256: hmac::Hmac<32>;
     /// The Hkdf type which implements the hkdf trait
-    type HkdfSha512: hkdf::Hkdf + Clone;
+    type HkdfSha512: hkdf::Hkdf;
     /// The Hmac type which implements the hmac trait
     type HmacSha512: hmac::Hmac<64>;
     /// The AES-CBC-PKCS7 implementation to use
diff --git a/nearby/crypto/crypto_provider/tests/hkdf_tests.rs b/nearby/crypto/crypto_provider/tests/hkdf_tests.rs
deleted file mode 100644
index 72d8dcc..0000000
--- a/nearby/crypto/crypto_provider/tests/hkdf_tests.rs
+++ /dev/null
@@ -1,345 +0,0 @@
-// Copyright 2022 Google LLC
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-/// Tests for both openssl and rust-crypto crypto_provider impls
-use crypto_provider::hkdf::Hkdf as _;
-use crypto_provider::CryptoProvider;
-use crypto_provider_openssl::Openssl;
-use crypto_provider_rustcrypto::RustCrypto;
-use hex_literal::hex;
-use std::iter;
-
-struct Test<'a> {
-    ikm: &'a [u8],
-    salt: &'a [u8],
-    info: &'a [u8],
-    okm: &'a [u8],
-}
-
-#[test]
-fn basic_test_rc() {
-    basic_test_hkdf::<RustCrypto>();
-}
-
-#[test]
-fn basic_test_openssl() {
-    basic_test_hkdf::<Openssl>();
-}
-
-/// data taken from sample code in Readme of crates.io page
-fn basic_test_hkdf<C: CryptoProvider>() {
-    let ikm = hex!("0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b");
-    let salt = hex!("000102030405060708090a0b0c");
-    let info = hex!("f0f1f2f3f4f5f6f7f8f9");
-
-    let hk = C::HkdfSha256::new(Some(&salt[..]), &ikm);
-    let mut okm = [0u8; 42];
-    hk.expand(&info, &mut okm)
-        .expect("42 is a valid length for Sha256 to output");
-
-    let expected = hex!(
-        "
-        3cb25f25faacd57a90434f64d0362f2a
-        2d2d0a90cf1a5a4c5db02d56ecc4c5bf
-        34007208d5b887185865
-        "
-    );
-    assert_eq!(okm, expected);
-}
-
-#[test]
-fn rfc5869_sha256_rc() {
-    test_rfc5869_sha256::<RustCrypto>();
-}
-
-#[test]
-fn rfc5869_sha256_openssl() {
-    test_rfc5869_sha256::<Openssl>();
-}
-
-// Test Vectors from https://tools.ietf.org/html/rfc5869.
-#[rustfmt::skip]
-fn test_rfc5869_sha256<C: CryptoProvider>() {
-    let tests = [
-        Test {
-            // Test Case 1
-            ikm: &hex!("0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b"),
-            salt: &hex!("000102030405060708090a0b0c"),
-            info: &hex!("f0f1f2f3f4f5f6f7f8f9"),
-            okm: &hex!("
-                3cb25f25faacd57a90434f64d0362f2a
-                2d2d0a90cf1a5a4c5db02d56ecc4c5bf
-                34007208d5b887185865
-            "),
-        },
-        Test {
-            // Test Case 2
-            ikm: &hex!("
-                000102030405060708090a0b0c0d0e0f
-                101112131415161718191a1b1c1d1e1f
-                202122232425262728292a2b2c2d2e2f
-                303132333435363738393a3b3c3d3e3f
-                404142434445464748494a4b4c4d4e4f
-            "),
-            salt: &hex!("
-                606162636465666768696a6b6c6d6e6f
-                707172737475767778797a7b7c7d7e7f
-                808182838485868788898a8b8c8d8e8f
-                909192939495969798999a9b9c9d9e9f
-                a0a1a2a3a4a5a6a7a8a9aaabacadaeaf
-            "),
-            info: &hex!("
-                b0b1b2b3b4b5b6b7b8b9babbbcbdbebf
-                c0c1c2c3c4c5c6c7c8c9cacbcccdcecf
-                d0d1d2d3d4d5d6d7d8d9dadbdcdddedf
-                e0e1e2e3e4e5e6e7e8e9eaebecedeeef
-                f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff
-            "),
-            okm: &hex!("
-                b11e398dc80327a1c8e7f78c596a4934
-                4f012eda2d4efad8a050cc4c19afa97c
-                59045a99cac7827271cb41c65e590e09
-                da3275600c2f09b8367793a9aca3db71
-                cc30c58179ec3e87c14c01d5c1f3434f
-                1d87
-            "),
-        },
-        Test {
-            // Test Case 3
-            ikm: &hex!("0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b"),
-            salt: &hex!(""),
-            info: &hex!(""),
-            okm: &hex!("
-                8da4e775a563c18f715f802a063c5a31
-                b8a11f5c5ee1879ec3454e5f3c738d2d
-                9d201395faa4b61a96c8
-            "),
-        },
-    ];
-    for Test { ikm, salt, info, okm } in tests.iter() {
-        let salt = if salt.is_empty() {
-            None
-        } else {
-            Some(&salt[..])
-        };
-        let hkdf = C::HkdfSha256::new(salt, ikm);
-        let mut okm2 = vec![0u8; okm.len()];
-        assert!(hkdf.expand(&info[..], &mut okm2).is_ok());
-        assert_eq!(okm2[..], okm[..]);
-    }
-}
-
-const MAX_SHA256_LENGTH: usize = 255 * (256 / 8); // =8160
-
-#[test]
-fn lengths_rc() {
-    test_lengths::<RustCrypto>()
-}
-
-#[test]
-fn lengths_openssl() {
-    test_lengths::<Openssl>()
-}
-
-fn test_lengths<C: CryptoProvider>() {
-    let hkdf = C::HkdfSha256::new(None, &[]);
-    let mut longest = vec![0u8; MAX_SHA256_LENGTH];
-    assert!(hkdf.expand(&[], &mut longest).is_ok());
-    // Runtime is O(length), so exhaustively testing all legal lengths
-    // would take too long (at least without --release). Only test a
-    // subset: the first 500, the last 10, and every 100th in between.
-    // 0 is an invalid key length for openssl, so start at 1
-    let lengths = (1..MAX_SHA256_LENGTH + 1)
-        .filter(|&len| !(500..=MAX_SHA256_LENGTH - 10).contains(&len) || len % 100 == 0);
-
-    for length in lengths {
-        let mut okm = vec![0u8; length];
-
-        assert!(hkdf.expand(&[], &mut okm).is_ok());
-        assert_eq!(okm.len(), length);
-        assert_eq!(okm[..], longest[..length]);
-    }
-}
-
-#[test]
-fn max_length_rc() {
-    test_max_length::<RustCrypto>();
-}
-
-#[test]
-fn max_length_openssl() {
-    test_max_length::<Openssl>();
-}
-
-fn test_max_length<C: CryptoProvider>() {
-    let hkdf = C::HkdfSha256::new(Some(&[]), &[]);
-    let mut okm = vec![0u8; MAX_SHA256_LENGTH];
-    assert!(hkdf.expand(&[], &mut okm).is_ok());
-}
-
-#[test]
-fn max_length_exceeded_rc() {
-    test_max_length_exceeded::<RustCrypto>();
-}
-
-#[test]
-fn max_length_exceeded_openssl() {
-    test_max_length_exceeded::<Openssl>();
-}
-
-fn test_max_length_exceeded<C: CryptoProvider>() {
-    let hkdf = C::HkdfSha256::new(Some(&[]), &[]);
-    let mut okm = vec![0u8; MAX_SHA256_LENGTH + 1];
-    assert!(hkdf.expand(&[], &mut okm).is_err());
-}
-
-#[test]
-fn unsupported_length_rc() {
-    test_unsupported_length::<RustCrypto>();
-}
-
-#[test]
-fn unsupported_length_openssl() {
-    test_unsupported_length::<Openssl>();
-}
-
-fn test_unsupported_length<C: CryptoProvider>() {
-    let hkdf = C::HkdfSha256::new(Some(&[]), &[]);
-    let mut okm = vec![0u8; 90000];
-    assert!(hkdf.expand(&[], &mut okm).is_err());
-}
-
-#[test]
-fn expand_multi_info_rc() {
-    test_expand_multi_info::<RustCrypto>();
-}
-
-#[test]
-fn expand_multi_info_openssl() {
-    test_expand_multi_info::<Openssl>();
-}
-
-fn test_expand_multi_info<C: CryptoProvider>() {
-    let info_components = &[
-        &b"09090909090909090909090909090909090909090909"[..],
-        &b"8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a"[..],
-        &b"0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0"[..],
-        &b"4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4"[..],
-        &b"1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d"[..],
-    ];
-
-    let hkdf = C::HkdfSha256::new(None, b"some ikm here");
-
-    // Compute HKDF-Expand on the concatenation of all the info components
-    let mut oneshot_res = [0u8; 16];
-    hkdf.expand(&info_components.concat(), &mut oneshot_res)
-        .unwrap();
-
-    // Now iteratively join the components of info_components until it's all 1 component. The value
-    // of HKDF-Expand should be the same throughout
-    let mut num_concatted = 0;
-    let mut info_head = Vec::new();
-
-    while num_concatted < info_components.len() {
-        info_head.extend(info_components[num_concatted]);
-
-        // Build the new input to be the info head followed by the remaining components
-        let input: Vec<&[u8]> = iter::once(info_head.as_slice())
-            .chain(info_components.iter().cloned().skip(num_concatted + 1))
-            .collect();
-
-        // Compute and compare to the one-shot answer
-        let mut multipart_res = [0u8; 16];
-        hkdf.expand_multi_info(&input, &mut multipart_res).unwrap();
-        assert_eq!(multipart_res, oneshot_res);
-        num_concatted += 1;
-    }
-}
-
-#[test]
-fn hkdf_sha_256_wycheproof_test_vectors_rc() {
-    run_hkdf_test_vectors::<<RustCrypto as CryptoProvider>::HkdfSha256>(HashAlg::Sha256)
-}
-
-#[test]
-fn hkdf_sha_512_wycheproof_test_vectors_rc() {
-    run_hkdf_test_vectors::<<RustCrypto as CryptoProvider>::HkdfSha512>(HashAlg::Sha512)
-}
-
-#[test]
-fn hkdf_sha_256_wycheproof_test_vectors_openssl() {
-    run_hkdf_test_vectors::<<Openssl as CryptoProvider>::HkdfSha256>(HashAlg::Sha256)
-}
-
-#[test]
-fn hkdf_sha_512_wycheproof_test_vectors_openssl() {
-    run_hkdf_test_vectors::<<Openssl as CryptoProvider>::HkdfSha512>(HashAlg::Sha512)
-}
-
-enum HashAlg {
-    Sha256,
-    Sha512,
-}
-
-fn run_hkdf_test_vectors<K: crypto_provider::hkdf::Hkdf>(hash: HashAlg) {
-    let test_name = match hash {
-        HashAlg::Sha256 => wycheproof::hkdf::TestName::HkdfSha256,
-        HashAlg::Sha512 => wycheproof::hkdf::TestName::HkdfSha512,
-    };
-
-    let test_set =
-        wycheproof::hkdf::TestSet::load(test_name).expect("should be able to load test set");
-    for test_group in test_set.test_groups {
-        for test in test_group.tests {
-            let ikm = test.ikm;
-            let salt = test.salt;
-            let info = test.info;
-            let okm = test.okm;
-            let tc_id = test.tc_id;
-            if let Some(desc) = run_test::<K>(
-                ikm.as_slice(),
-                salt.as_slice(),
-                info.as_slice(),
-                okm.as_slice(),
-            ) {
-                panic!(
-                    "\n\
-                         Failed test {tc_id}: {desc}\n\
-                         ikm:\t{ikm:?}\n\
-                         salt:\t{salt:?}\n\
-                         info:\t{info:?}\n\
-                         okm:\t{okm:?}\n"
-                );
-            }
-        }
-    }
-}
-
-fn run_test<K: crypto_provider::hkdf::Hkdf>(
-    ikm: &[u8],
-    salt: &[u8],
-    info: &[u8],
-    okm: &[u8],
-) -> Option<&'static str> {
-    let prk = K::new(Some(salt), ikm);
-    let mut got_okm = vec![0; okm.len()];
-
-    if prk.expand(info, &mut got_okm).is_err() {
-        return Some("prk expand");
-    }
-    if got_okm != okm {
-        return Some("mismatch in okm");
-    }
-    None
-}
diff --git a/nearby/crypto/crypto_provider/tests/hmac_tests.rs b/nearby/crypto/crypto_provider/tests/hmac_tests.rs
deleted file mode 100644
index b7b64ee..0000000
--- a/nearby/crypto/crypto_provider/tests/hmac_tests.rs
+++ /dev/null
@@ -1,119 +0,0 @@
-// Copyright 2023 Google LLC
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-use core::cmp::min;
-use crypto_provider::CryptoProvider;
-use crypto_provider_openssl::Openssl;
-use crypto_provider_rustcrypto::RustCrypto;
-use wycheproof::TestResult;
-
-#[test]
-fn hmac_sha_256_wycheproof_test_vectors_rustcrypto() {
-    run_hmac_test_vectors::<32, <RustCrypto as CryptoProvider>::HmacSha256>(HashAlg::Sha256)
-}
-
-#[test]
-fn hmac_sha_256_wycheproof_test_vectors_openssl() {
-    run_hmac_test_vectors::<32, <Openssl as CryptoProvider>::HmacSha256>(HashAlg::Sha256)
-}
-
-#[test]
-fn hmac_sha_512_wycheproof_test_vectors_rustcrypto() {
-    run_hmac_test_vectors::<64, <RustCrypto as CryptoProvider>::HmacSha512>(HashAlg::Sha512)
-}
-
-#[test]
-fn hmac_sha_512_wycheproof_test_vectors_openssl() {
-    run_hmac_test_vectors::<64, <Openssl as CryptoProvider>::HmacSha512>(HashAlg::Sha512)
-}
-
-enum HashAlg {
-    Sha256,
-    Sha512,
-}
-
-// Tests vectors from Project Wycheproof:
-// https://github.com/google/wycheproof
-fn run_hmac_test_vectors<const N: usize, H: crypto_provider::hmac::Hmac<N>>(hash: HashAlg) {
-    let test_name = match hash {
-        HashAlg::Sha256 => wycheproof::mac::TestName::HmacSha256,
-        HashAlg::Sha512 => wycheproof::mac::TestName::HmacSha512,
-    };
-    let test_set =
-        wycheproof::mac::TestSet::load(test_name).expect("should be able to load test set");
-
-    for test_group in test_set.test_groups {
-        for test in test_group.tests {
-            let key = test.key;
-            let msg = test.msg;
-            let tag = test.tag;
-            let tc_id = test.tc_id;
-            let valid = match test.result {
-                TestResult::Valid | TestResult::Acceptable => true,
-                TestResult::Invalid => false,
-            };
-
-            if let Some(desc) =
-                run_test::<N, H>(key.as_slice(), msg.as_slice(), tag.as_slice(), valid)
-            {
-                panic!(
-                    "\n\
-                         Failed test {tc_id}: {desc}\n\
-                         key:\t{key:?}\n\
-                         msg:\t{msg:?}\n\
-                         tag:\t{tag:?}\n",
-                );
-            }
-        }
-    }
-}
-
-fn run_test<const N: usize, H: crypto_provider::hmac::Hmac<N>>(
-    key: &[u8],
-    input: &[u8],
-    tag: &[u8],
-    valid_data: bool,
-) -> Option<&'static str> {
-    let mut mac = H::new_from_slice(key).unwrap();
-    mac.update(input);
-    let result = mac.finalize();
-    let n = tag.len();
-    let result_bytes = &result[..n];
-
-    if valid_data {
-        if result_bytes != tag {
-            return Some("whole message");
-        }
-    } else {
-        return if result_bytes == tag {
-            Some("invalid should not match")
-        } else {
-            None
-        };
-    }
-
-    // test reading different chunk sizes
-    for chunk_size in 1..min(64, input.len()) {
-        let mut mac = H::new_from_slice(key).unwrap();
-        for chunk in input.chunks(chunk_size) {
-            mac.update(chunk);
-        }
-        let res = mac.verify_truncated_left(tag);
-        if res.is_err() {
-            return Some("chunked message");
-        }
-    }
-
-    None
-}
diff --git a/nearby/crypto/crypto_provider_boringssl/src/aes.rs b/nearby/crypto/crypto_provider_boringssl/src/aes.rs
index a92f67e..a4f275e 100644
--- a/nearby/crypto/crypto_provider_boringssl/src/aes.rs
+++ b/nearby/crypto/crypto_provider_boringssl/src/aes.rs
@@ -12,8 +12,6 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-//! Implementation of `crypto_provider::aes` types using BoringSSL.
-
 use bssl_crypto::aes::{AesDecryptKey, AesEncryptKey};
 use crypto_provider::aes::{
     Aes, Aes128Key, Aes256Key, AesBlock, AesCipher, AesDecryptCipher, AesEncryptCipher, AesKey,
diff --git a/nearby/crypto/crypto_provider_boringssl/src/hkdf.rs b/nearby/crypto/crypto_provider_boringssl/src/hkdf.rs
new file mode 100644
index 0000000..4ab0ad4
--- /dev/null
+++ b/nearby/crypto/crypto_provider_boringssl/src/hkdf.rs
@@ -0,0 +1,63 @@
+// Copyright 2023 Google LLC
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+//! BoringSSL based HKDF implementation. Unfortunately, because the OpenSSL and BoringSSL APIs
+//! diverged for HKDF, we have to have separate implementations.
+//!
+//! See the _Using BoringSSL_ section in `nearby/scripts/prepare_boringssl.sh` for instructions on
+//! how to test against BoringSSL.
+
+use bssl_crypto::digest::Md;
+use crypto_provider::hkdf::InvalidLength;
+
+/// Struct providing BoringSSL implemented Hkdf operations.
+pub struct Hkdf<M: Md>(bssl_crypto::hkdf::Hkdf<M>);
+
+impl<M: Md> crypto_provider::hkdf::Hkdf for Hkdf<M> {
+    fn new(salt: Option<&[u8]>, ikm: &[u8]) -> Self {
+        Self(bssl_crypto::hkdf::Hkdf::<M>::new(salt, ikm))
+    }
+
+    fn expand_multi_info(
+        &self,
+        info_components: &[&[u8]],
+        okm: &mut [u8],
+    ) -> Result<(), InvalidLength> {
+        if okm.is_empty() {
+            return Ok(());
+        }
+        self.0
+            .expand_multi_info(info_components, okm)
+            .map_err(|_| InvalidLength)
+    }
+
+    fn expand(&self, info: &[u8], okm: &mut [u8]) -> Result<(), InvalidLength> {
+        if okm.is_empty() {
+            return Ok(());
+        }
+        self.0.expand(info, okm).map_err(|_| InvalidLength)
+    }
+}
+
+#[cfg(test)]
+mod tests {
+    use crate::Boringssl;
+    use core::marker::PhantomData;
+    use crypto_provider::hkdf::testing::*;
+
+    #[apply(hkdf_test_cases)]
+    fn hkdf_tests(testcase: CryptoProviderTestCase<Boringssl>) {
+        testcase(PhantomData);
+    }
+}
diff --git a/nearby/crypto/crypto_provider_boringssl/src/hmac.rs b/nearby/crypto/crypto_provider_boringssl/src/hmac.rs
new file mode 100644
index 0000000..3459c3b
--- /dev/null
+++ b/nearby/crypto/crypto_provider_boringssl/src/hmac.rs
@@ -0,0 +1,93 @@
+// Copyright 2023 Google LLC
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+use crypto_provider::hmac::{InvalidLength, MacError};
+
+/// BoringSSL implemented Hmac Sha256 struct
+pub struct HmacSha256(bssl_crypto::hmac::HmacSha256);
+
+impl crypto_provider::hmac::Hmac<32> for HmacSha256 {
+    fn new_from_key(key: [u8; 32]) -> Self {
+        Self(bssl_crypto::hmac::HmacSha256::new(key))
+    }
+
+    fn new_from_slice(key: &[u8]) -> Result<Self, InvalidLength> {
+        Ok(Self(bssl_crypto::hmac::HmacSha256::new_from_slice(key)))
+    }
+
+    fn update(&mut self, data: &[u8]) {
+        self.0.update(data)
+    }
+
+    fn finalize(self) -> [u8; 32] {
+        self.0.finalize()
+    }
+
+    fn verify_slice(self, tag: &[u8]) -> Result<(), MacError> {
+        self.0.verify_slice(tag).map_err(|_| MacError)
+    }
+
+    fn verify(self, tag: [u8; 32]) -> Result<(), MacError> {
+        self.0.verify(tag).map_err(|_| MacError)
+    }
+
+    fn verify_truncated_left(self, tag: &[u8]) -> Result<(), MacError> {
+        self.0.verify_truncated_left(tag).map_err(|_| MacError)
+    }
+}
+
+/// BoringSSL implemented Hmac Sha512 struct
+pub struct HmacSha512(bssl_crypto::hmac::HmacSha512);
+
+impl crypto_provider::hmac::Hmac<64> for HmacSha512 {
+    fn new_from_key(key: [u8; 64]) -> Self {
+        Self(bssl_crypto::hmac::HmacSha512::new(key))
+    }
+
+    fn new_from_slice(key: &[u8]) -> Result<Self, InvalidLength> {
+        Ok(Self(bssl_crypto::hmac::HmacSha512::new_from_slice(key)))
+    }
+
+    fn update(&mut self, data: &[u8]) {
+        self.0.update(data)
+    }
+
+    fn finalize(self) -> [u8; 64] {
+        self.0.finalize()
+    }
+
+    fn verify_slice(self, tag: &[u8]) -> Result<(), MacError> {
+        self.0.verify_slice(tag).map_err(|_| MacError)
+    }
+
+    fn verify(self, tag: [u8; 64]) -> Result<(), MacError> {
+        self.0.verify(tag).map_err(|_| MacError)
+    }
+
+    fn verify_truncated_left(self, tag: &[u8]) -> Result<(), MacError> {
+        self.0.verify_truncated_left(tag).map_err(|_| MacError)
+    }
+}
+
+#[cfg(test)]
+mod tests {
+    use crate::Boringssl;
+    use core::marker::PhantomData;
+    use crypto_provider::hmac::testing::*;
+
+    #[apply(hmac_test_cases)]
+    fn hmac_tests(testcase: CryptoProviderTestCase<Boringssl>) {
+        testcase(PhantomData);
+    }
+}
diff --git a/nearby/crypto/crypto_provider_boringssl/src/lib.rs b/nearby/crypto/crypto_provider_boringssl/src/lib.rs
index 0775172..a7e78d0 100644
--- a/nearby/crypto/crypto_provider_boringssl/src/lib.rs
+++ b/nearby/crypto/crypto_provider_boringssl/src/lib.rs
@@ -23,20 +23,28 @@
 
 //! Crate which provides impls for CryptoProvider backed by BoringSSL.
 
-use crypto_provider::CryptoProvider;
+use bssl_crypto::digest::{Sha256, Sha512};
+use crypto_provider::{CryptoProvider, CryptoRng};
 use crypto_provider_stubs::*;
 
+/// Implementation of `crypto_provider::aes` types using BoringSSL.
 pub mod aes;
 
+/// Implementations of crypto_provider::hkdf traits backed by BoringSSL
+pub mod hkdf;
+
+/// Implementations of crypto_provider::hmac traits backed by BoringSSL
+pub mod hmac;
+
 /// The BoringSSL backed struct which implements CryptoProvider
 #[derive(Default, Clone, Debug, PartialEq, Eq)]
 pub struct Boringssl;
 
 impl CryptoProvider for Boringssl {
-    type HkdfSha256 = HkdfStubs;
-    type HmacSha256 = HmacStubs;
-    type HkdfSha512 = HkdfStubs;
-    type HmacSha512 = HmacStubs;
+    type HkdfSha256 = hkdf::Hkdf<Sha256>;
+    type HmacSha256 = hmac::HmacSha256;
+    type HkdfSha512 = hkdf::Hkdf<Sha512>;
+    type HmacSha512 = hmac::HmacSha512;
     type AesCbcPkcs7Padded = AesCbcPkcs7PaddedStubs;
     type X25519 = X25519Stubs;
     type P256 = P256Stubs;
@@ -47,9 +55,24 @@
     type AesCtr128 = Aes128Stubs;
     type AesCtr256 = Aes256Stubs;
     type Ed25519 = Ed25519Stubs;
-    type CryptoRng = ();
+    type CryptoRng = BoringSslRng;
 
     fn constant_time_eq(_a: &[u8], _b: &[u8]) -> bool {
         unimplemented!()
     }
 }
+
+/// OpenSSL implemented random number generator
+pub struct BoringSslRng;
+
+impl CryptoRng for BoringSslRng {
+    fn new() -> Self {
+        BoringSslRng {}
+    }
+
+    fn next_u64(&mut self) -> u64 {
+        let mut buf = [0; 8];
+        bssl_crypto::rand::rand_bytes(&mut buf);
+        u64::from_be_bytes(buf)
+    }
+}
diff --git a/nearby/crypto/crypto_provider_openssl/src/hkdf_boringssl.rs b/nearby/crypto/crypto_provider_openssl/src/hkdf_boringssl.rs
index 63e0ebc..f6c106d 100644
--- a/nearby/crypto/crypto_provider_openssl/src/hkdf_boringssl.rs
+++ b/nearby/crypto/crypto_provider_openssl/src/hkdf_boringssl.rs
@@ -23,7 +23,6 @@
 use std::marker::PhantomData;
 
 /// openssl based hkdf implementation
-#[derive(Clone)]
 pub struct Hkdf<H: OpenSslHash> {
     _marker: PhantomData<H>,
     salt: Option<Vec<u8>>,
@@ -63,3 +62,15 @@
         self.expand_multi_info(&[info], okm)
     }
 }
+
+#[cfg(test)]
+mod tests {
+    use crate::Openssl;
+    use core::marker::PhantomData;
+    use crypto_provider::hkdf::testing::*;
+
+    #[apply(hkdf_test_cases)]
+    fn hkdf_tests(testcase: CryptoProviderTestCase<Openssl>) {
+        testcase(PhantomData);
+    }
+}
diff --git a/nearby/crypto/crypto_provider_openssl/src/hkdf_openssl.rs b/nearby/crypto/crypto_provider_openssl/src/hkdf_openssl.rs
index b6885bc..605cff1 100644
--- a/nearby/crypto/crypto_provider_openssl/src/hkdf_openssl.rs
+++ b/nearby/crypto/crypto_provider_openssl/src/hkdf_openssl.rs
@@ -17,7 +17,6 @@
 use std::marker::PhantomData;
 
 /// openssl based hkdf implementation
-#[derive(Clone)]
 pub struct Hkdf<H: OpenSslHash> {
     _marker: PhantomData<H>,
     salt: Option<Vec<u8>>,
@@ -61,3 +60,15 @@
         self.expand_multi_info(&[info], okm)
     }
 }
+
+#[cfg(test)]
+mod tests {
+    use crate::Openssl;
+    use core::marker::PhantomData;
+    use crypto_provider::hkdf::testing::*;
+
+    #[apply(hkdf_test_cases)]
+    fn hkdf_tests(testcase: CryptoProviderTestCase<Openssl>) {
+        testcase(PhantomData);
+    }
+}
diff --git a/nearby/crypto/crypto_provider_openssl/src/hmac_boringssl.rs b/nearby/crypto/crypto_provider_openssl/src/hmac_boringssl.rs
index 82782b9..af728b3 100644
--- a/nearby/crypto/crypto_provider_openssl/src/hmac_boringssl.rs
+++ b/nearby/crypto/crypto_provider_openssl/src/hmac_boringssl.rs
@@ -97,3 +97,15 @@
         }
     }
 }
+
+#[cfg(test)]
+mod tests {
+    use crate::Openssl;
+    use core::marker::PhantomData;
+    use crypto_provider::hmac::testing::*;
+
+    #[apply(hmac_test_cases)]
+    fn hmac_tests(testcase: CryptoProviderTestCase<Openssl>) {
+        testcase(PhantomData);
+    }
+}
diff --git a/nearby/crypto/crypto_provider_openssl/src/hmac_openssl.rs b/nearby/crypto/crypto_provider_openssl/src/hmac_openssl.rs
index 34a64c4..d99ee3e 100644
--- a/nearby/crypto/crypto_provider_openssl/src/hmac_openssl.rs
+++ b/nearby/crypto/crypto_provider_openssl/src/hmac_openssl.rs
@@ -175,3 +175,15 @@
         Err(MacError)
     }
 }
+
+#[cfg(test)]
+mod tests {
+    use crate::Openssl;
+    use core::marker::PhantomData;
+    use crypto_provider::hmac::testing::*;
+
+    #[apply(hmac_test_cases)]
+    fn hmac_tests(testcase: CryptoProviderTestCase<Openssl>) {
+        testcase(PhantomData);
+    }
+}
diff --git a/nearby/crypto/crypto_provider_rustcrypto/Cargo.toml b/nearby/crypto/crypto_provider_rustcrypto/Cargo.toml
index ad5a4b8..2ab5354 100644
--- a/nearby/crypto/crypto_provider_rustcrypto/Cargo.toml
+++ b/nearby/crypto/crypto_provider_rustcrypto/Cargo.toml
@@ -14,9 +14,8 @@
 x25519-dalek.workspace = true
 p256 = { workspace = true, features = ["ecdh"], default-features = false }
 sec1.workspace = true
-ed25519-dalek = { workspace = true, default-features = false }
+ed25519-dalek = { workspace = true, default-features = false, features = ["rand_core"] }
 rand = { workspace = true, default-features = false }
-rand_core_05_adapter.workspace = true
 rand_core.workspace = true
 subtle.workspace = true
 aes.workspace = true
diff --git a/nearby/crypto/crypto_provider_rustcrypto/src/ed25519.rs b/nearby/crypto/crypto_provider_rustcrypto/src/ed25519.rs
index 874aa82..df5c5de 100644
--- a/nearby/crypto/crypto_provider_rustcrypto/src/ed25519.rs
+++ b/nearby/crypto/crypto_provider_rustcrypto/src/ed25519.rs
@@ -12,30 +12,33 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
+use ed25519_dalek::Signer;
+
 use crypto_provider::ed25519::{
     InvalidBytes, InvalidSignature, Signature as _, SignatureError, KEY_LENGTH, KEY_PAIR_LENGTH,
     SIGNATURE_LENGTH,
 };
-use ed25519_dalek::Signer;
 
 pub struct Ed25519;
+
 impl crypto_provider::ed25519::Ed25519Provider for Ed25519 {
     type KeyPair = KeyPair;
     type PublicKey = PublicKey;
     type Signature = Signature;
 }
 
-pub struct KeyPair(ed25519_dalek::Keypair);
+pub struct KeyPair(ed25519_dalek::SigningKey);
+
 impl crypto_provider::ed25519::KeyPair for KeyPair {
     type PublicKey = PublicKey;
     type Signature = Signature;
 
     fn to_bytes(&self) -> [u8; KEY_PAIR_LENGTH] {
-        self.0.to_bytes()
+        self.0.to_keypair_bytes()
     }
 
     fn from_bytes(bytes: [u8; KEY_PAIR_LENGTH]) -> Result<Self, InvalidBytes> {
-        ed25519_dalek::Keypair::from_bytes(&bytes)
+        ed25519_dalek::SigningKey::from_keypair_bytes(&bytes)
             .map(Self)
             .map_err(|_| InvalidBytes)
     }
@@ -51,23 +54,22 @@
     #[cfg(feature = "std")]
     fn generate() -> Self {
         let mut csprng = rand::rngs::ThreadRng::default();
-        Self(ed25519_dalek::Keypair::generate(
-            &mut rand_core_05_adapter::RandWrapper::from(&mut csprng),
-        ))
+        Self(ed25519_dalek::SigningKey::generate(&mut csprng))
     }
 
     fn public(&self) -> Self::PublicKey {
-        PublicKey(self.0.public)
+        PublicKey(self.0.verifying_key())
     }
 }
 
 pub struct Signature(ed25519_dalek::Signature);
+
 impl crypto_provider::ed25519::Signature for Signature {
     fn from_bytes(bytes: &[u8]) -> Result<Self, InvalidSignature> {
         if bytes.len() != SIGNATURE_LENGTH {
             return Err(InvalidSignature);
         }
-        ed25519_dalek::Signature::from_bytes(bytes)
+        ed25519_dalek::Signature::from_slice(bytes)
             .map(Self)
             .map_err(|_| InvalidSignature)
     }
@@ -77,7 +79,8 @@
     }
 }
 
-pub struct PublicKey(ed25519_dalek::PublicKey);
+pub struct PublicKey(ed25519_dalek::VerifyingKey);
+
 impl crypto_provider::ed25519::PublicKey for PublicKey {
     type Signature = Signature;
 
@@ -85,7 +88,7 @@
     where
         Self: Sized,
     {
-        ed25519_dalek::PublicKey::from_bytes(&bytes)
+        ed25519_dalek::VerifyingKey::from_bytes(&bytes)
             .map(PublicKey)
             .map_err(|_| InvalidBytes)
     }
@@ -107,9 +110,10 @@
 
 #[cfg(test)]
 mod tests {
-    use crate::ed25519::Ed25519;
     use crypto_provider::ed25519::testing::{run_rfc_test_vectors, run_wycheproof_test_vectors};
 
+    use crate::ed25519::Ed25519;
+
     #[test]
     fn wycheproof_test_ed25519_rustcrypto() {
         run_wycheproof_test_vectors::<Ed25519>()
diff --git a/nearby/crypto/crypto_provider_rustcrypto/src/hkdf_rc.rs b/nearby/crypto/crypto_provider_rustcrypto/src/hkdf_rc.rs
index d6ca687..8ff5d7b 100644
--- a/nearby/crypto/crypto_provider_rustcrypto/src/hkdf_rc.rs
+++ b/nearby/crypto/crypto_provider_rustcrypto/src/hkdf_rc.rs
@@ -22,7 +22,6 @@
 use hmac::digest::{HashMarker, OutputSizeUser};
 
 /// RustCrypto based hkdf implementation
-#[derive(Clone)]
 pub struct Hkdf<D>
 where
     D: OutputSizeUser,
@@ -72,3 +71,15 @@
         self.hkdf_impl.expand(info, okm).map_err(|_| InvalidLength)
     }
 }
+
+#[cfg(test)]
+mod tests {
+    use crate::RustCrypto;
+    use core::marker::PhantomData;
+    use crypto_provider::hkdf::testing::*;
+
+    #[apply(hkdf_test_cases)]
+    fn hkdf_tests(testcase: CryptoProviderTestCase<RustCrypto>) {
+        testcase(PhantomData);
+    }
+}
diff --git a/nearby/crypto/crypto_provider_rustcrypto/src/hmac_rc.rs b/nearby/crypto/crypto_provider_rustcrypto/src/hmac_rc.rs
index e31b815..95254a5 100644
--- a/nearby/crypto/crypto_provider_rustcrypto/src/hmac_rc.rs
+++ b/nearby/crypto/crypto_provider_rustcrypto/src/hmac_rc.rs
@@ -112,3 +112,15 @@
             .map_err(|_| MacError)
     }
 }
+
+#[cfg(test)]
+mod tests {
+    use crate::RustCrypto;
+    use core::marker::PhantomData;
+    use crypto_provider::hmac::testing::*;
+
+    #[apply(hmac_test_cases)]
+    fn hmac_tests(testcase: CryptoProviderTestCase<RustCrypto>) {
+        testcase(PhantomData);
+    }
+}
diff --git a/nearby/crypto/crypto_provider_rustcrypto/src/lib.rs b/nearby/crypto/crypto_provider_rustcrypto/src/lib.rs
index 9807f81..9145233 100644
--- a/nearby/crypto/crypto_provider_rustcrypto/src/lib.rs
+++ b/nearby/crypto/crypto_provider_rustcrypto/src/lib.rs
@@ -65,7 +65,7 @@
 }
 
 impl<R: CryptoRng + SeedableRng + RngCore> RustCryptoImpl<R> {
-    ///
+    /// Create a new instance of RustCrypto
     pub fn new() -> Self {
         Self {
             _marker: Default::default(),
diff --git a/nearby/crypto/crypto_provider_rustcrypto/src/x25519.rs b/nearby/crypto/crypto_provider_rustcrypto/src/x25519.rs
index a184d44..794d780 100644
--- a/nearby/crypto/crypto_provider_rustcrypto/src/x25519.rs
+++ b/nearby/crypto/crypto_provider_rustcrypto/src/x25519.rs
@@ -48,7 +48,7 @@
 
     fn generate_random(rng: &mut Self::Rng) -> Self {
         Self {
-            secret: x25519_dalek::EphemeralSecret::new(&mut rng.0),
+            secret: x25519_dalek::EphemeralSecret::random_from_rng(&mut rng.0),
             marker: Default::default(),
         }
     }
@@ -76,9 +76,11 @@
         _public_key: &X25519PublicKey,
     ) -> Result<Self, Self::Error> {
         Ok(Self {
-            secret: x25519_dalek::EphemeralSecret::new(&mut crate::testing::MockCryptoRng {
-                values: private_bytes.iter(),
-            }),
+            secret: x25519_dalek::EphemeralSecret::random_from_rng(
+                &mut crate::testing::MockCryptoRng {
+                    values: private_bytes.iter(),
+                },
+            ),
             marker: Default::default(),
         })
     }
diff --git a/nearby/presence/ldt/benches/ldt_scan.rs b/nearby/presence/ldt/benches/ldt_scan.rs
index 8088869..31f669f 100644
--- a/nearby/presence/ldt/benches/ldt_scan.rs
+++ b/nearby/presence/ldt/benches/ldt_scan.rs
@@ -15,7 +15,9 @@
 use criterion::{black_box, criterion_group, criterion_main, Criterion};
 use crypto_provider_rustcrypto::RustCrypto;
 use ctr::cipher::{KeyIvInit as _, StreamCipher as _, StreamCipherSeek as _};
-use ldt::{DefaultPadder, Ldt, LdtKey, Mix, Padder, Swap, XorPadder};
+use ldt::{
+    DefaultPadder, LdtDecryptCipher, LdtEncryptCipher, LdtKey, Mix, Padder, Swap, XorPadder,
+};
 use ldt_tbc::TweakableBlockCipher;
 use rand::SeedableRng as _;
 use sha2::Digest as _;
@@ -180,7 +182,8 @@
 /// A wrapper that lets us avoid percolating the need to specify a bogus and type-confused padder
 /// for ciphers that don't use one.
 struct LdtScanCipher<const B: usize, T: TweakableBlockCipher<B>, M: Mix, P: Padder<B, T>> {
-    ldt: Ldt<B, T, M>,
+    ldt_enc: LdtEncryptCipher<B, T, M>,
+    ldt_dec: LdtDecryptCipher<B, T, M>,
     padder: P,
 }
 
@@ -188,11 +191,11 @@
     for LdtScanCipher<B, T, M, P>
 {
     fn encrypt(&mut self, buf: &mut [u8]) {
-        self.ldt.encrypt(buf, &self.padder).unwrap();
+        self.ldt_enc.encrypt(buf, &self.padder).unwrap();
     }
 
     fn decrypt(&mut self, buf: &mut [u8]) {
-        self.ldt.decrypt(buf, &self.padder).unwrap();
+        self.ldt_dec.decrypt(buf, &self.padder).unwrap();
     }
 }
 
@@ -231,7 +234,8 @@
     fn build_cipher<R: rand::Rng + rand::CryptoRng>(&self, key_rng: &mut R) -> Self::Cipher {
         let key: LdtKey<T::Key> = LdtKey::from_random(key_rng);
         LdtScanCipher {
-            ldt: Ldt::new(&key),
+            ldt_enc: LdtEncryptCipher::new(&key),
+            ldt_dec: LdtDecryptCipher::new(&key),
             padder: P::generate(key_rng),
         }
     }
diff --git a/nearby/presence/ldt/examples/gen_ldt_xor_pad_test_vectors.rs b/nearby/presence/ldt/examples/gen_ldt_xor_pad_test_vectors.rs
index f579fe0..1b6af2d 100644
--- a/nearby/presence/ldt/examples/gen_ldt_xor_pad_test_vectors.rs
+++ b/nearby/presence/ldt/examples/gen_ldt_xor_pad_test_vectors.rs
@@ -15,7 +15,7 @@
 use crypto_provider::aes;
 use crypto_provider::aes::BLOCK_SIZE;
 use crypto_provider_rustcrypto::RustCrypto;
-use ldt::{Ldt, LdtKey, Swap, XorPadder};
+use ldt::{LdtEncryptCipher, LdtKey, Swap, XorPadder};
 use rand::{Rng as _, SeedableRng as _};
 use rand_ext::*;
 use serde_json::json;
@@ -31,10 +31,11 @@
         let key = LdtKey::from_random(&mut rng);
         let pad_xor: [u8; aes::BLOCK_SIZE] = random_bytes(&mut rng);
 
-        let ldt = Ldt::<BLOCK_SIZE, XtsAes128<RustCrypto>, Swap>::new(&key);
+        let ldt_enc = LdtEncryptCipher::<BLOCK_SIZE, XtsAes128<RustCrypto>, Swap>::new(&key);
 
         let mut ciphertext = plaintext.clone();
-        ldt.encrypt(&mut ciphertext, &XorPadder::from(pad_xor))
+        ldt_enc
+            .encrypt(&mut ciphertext, &XorPadder::from(pad_xor))
             .unwrap();
 
         array.push(json!({
diff --git a/nearby/presence/ldt/examples/ldt_benchmark.rs b/nearby/presence/ldt/examples/ldt_benchmark.rs
index 7ab41ad..f6793e1 100644
--- a/nearby/presence/ldt/examples/ldt_benchmark.rs
+++ b/nearby/presence/ldt/examples/ldt_benchmark.rs
@@ -16,7 +16,7 @@
 
 use clap::Parser as _;
 use crypto_provider_rustcrypto::RustCrypto;
-use ldt::{Ldt, LdtKey, Mix, Swap, XorPadder};
+use ldt::{LdtDecryptCipher, LdtEncryptCipher, LdtKey, Mix, Swap, XorPadder};
 
 use ldt_tbc::TweakableBlockCipher;
 use rand::{distributions, seq::SliceRandom, Rng as _, SeedableRng as _};
@@ -42,7 +42,7 @@
         .iter()
         .map(|s| {
             let mut ciphertext = s.plaintext.clone();
-            s.ldt.encrypt(&mut ciphertext[..], &padder).unwrap();
+            s.ldt_enc.encrypt(&mut ciphertext[..], &padder).unwrap();
             ciphertext
         })
         .collect::<Vec<_>>();
@@ -71,7 +71,7 @@
 
                 buf.clear();
                 buf.extend_from_slice(ciphertext.as_slice());
-                scenario.ldt.decrypt(&mut buf, &padder).unwrap();
+                scenario.ldt_dec.decrypt(&mut buf, &padder).unwrap();
 
                 hasher.update(&buf[..MATCH_LEN]);
                 hasher.finalize_into_reset(&mut hash_output);
@@ -127,7 +127,8 @@
 const MATCH_LEN: usize = 16;
 
 struct LdtScenario<const B: usize, T: TweakableBlockCipher<B>, M: Mix> {
-    ldt: Ldt<B, T, M>,
+    ldt_enc: LdtEncryptCipher<B, T, M>,
+    ldt_dec: LdtDecryptCipher<B, T, M>,
     plaintext: Vec<u8>,
     plaintext_prefix_hash: [u8; 32],
 }
@@ -142,7 +143,8 @@
     plaintext_len: usize,
 ) -> LdtScenario<B, T, M> {
     let ldt_key: LdtKey<T::Key> = LdtKey::from_random(rng);
-    let ldt: Ldt<B, T, M> = Ldt::new(&ldt_key);
+    let ldt_enc = LdtEncryptCipher::new(&ldt_key);
+    let ldt_dec = LdtDecryptCipher::new(&ldt_key);
     let plaintext = random_vec(rng, plaintext_len);
 
     let mut hasher = sha2::Sha256::new();
@@ -151,7 +153,8 @@
     hasher.finalize_into_reset(&mut plaintext_prefix_hash);
 
     LdtScenario {
-        ldt,
+        ldt_enc,
+        ldt_dec,
         plaintext,
         plaintext_prefix_hash: plaintext_prefix_hash.into(),
     }
diff --git a/nearby/presence/ldt/examples/ldt_prp.rs b/nearby/presence/ldt/examples/ldt_prp.rs
index c744b81..0e7bcf6 100644
--- a/nearby/presence/ldt/examples/ldt_prp.rs
+++ b/nearby/presence/ldt/examples/ldt_prp.rs
@@ -43,14 +43,24 @@
     for _ in 0..args.trials {
         let (percent, ok) = if rng.gen() {
             do_trial(
-                Ldt::<16, XtsAes128<RustCrypto>, Swap>::new(&LdtKey::from_random(&mut rng)),
+                LdtEncryptCipher::<16, XtsAes128<RustCrypto>, Swap>::new(&LdtKey::from_random(
+                    &mut rng,
+                )),
+                LdtDecryptCipher::<16, XtsAes128<RustCrypto>, Swap>::new(&LdtKey::from_random(
+                    &mut rng,
+                )),
                 &mut rng,
                 DefaultPadder::default(),
                 &args,
             )
         } else {
             do_trial(
-                Ldt::<16, XtsAes256<RustCrypto>, Swap>::new(&LdtKey::from_random(&mut rng)),
+                LdtEncryptCipher::<16, XtsAes256<RustCrypto>, Swap>::new(&LdtKey::from_random(
+                    &mut rng,
+                )),
+                LdtDecryptCipher::<16, XtsAes256<RustCrypto>, Swap>::new(&LdtKey::from_random(
+                    &mut rng,
+                )),
                 &mut rng,
                 DefaultPadder::default(),
                 &args,
@@ -87,7 +97,8 @@
 }
 
 fn do_trial<const B: usize, T: TweakableBlockCipher<B>, P: Padder<B, T>, M: Mix, R: rand::Rng>(
-    ldt: Ldt<B, T, M>,
+    ldt_enc: LdtEncryptCipher<B, T, M>,
+    ldt_dec: LdtDecryptCipher<B, T, M>,
     rng: &mut R,
     padder: P,
     args: &Args,
@@ -97,12 +108,12 @@
     let plaintext = random_vec(rng, len);
 
     let mut ciphertext = plaintext.clone();
-    ldt.encrypt(&mut ciphertext, &padder).unwrap();
+    ldt_enc.encrypt(&mut ciphertext, &padder).unwrap();
 
     // flip a random bit
     ciphertext[rng.gen_range(0..len)] ^= 1 << rng.gen_range(0..8);
 
-    ldt.decrypt(&mut ciphertext, &padder).unwrap();
+    ldt_dec.decrypt(&mut ciphertext, &padder).unwrap();
     assert_ne!(plaintext, ciphertext);
 
     let differing_bits: u32 = plaintext
diff --git a/nearby/presence/ldt/fuzz/Cargo.lock b/nearby/presence/ldt/fuzz/Cargo.lock
index c952332..d0a7fc3 100644
--- a/nearby/presence/ldt/fuzz/Cargo.lock
+++ b/nearby/presence/ldt/fuzz/Cargo.lock
@@ -60,15 +60,6 @@
 
 [[package]]
 name = "block-buffer"
-version = "0.9.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4"
-dependencies = [
- "generic-array",
-]
-
-[[package]]
-name = "block-buffer"
 version = "0.10.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71"
@@ -86,12 +77,6 @@
 ]
 
 [[package]]
-name = "byteorder"
-version = "1.4.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610"
-
-[[package]]
 name = "bytes"
 version = "1.4.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -153,7 +138,7 @@
 checksum = "7c2538c4e68e52548bacb3e83ac549f903d44f011ac9d5abb5e132e67d0808f7"
 dependencies = [
  "generic-array",
- "rand_core 0.6.4",
+ "rand_core",
  "subtle",
  "zeroize",
 ]
@@ -165,7 +150,7 @@
 checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3"
 dependencies = [
  "generic-array",
- "rand_core 0.6.4",
+ "rand_core",
  "typenum",
 ]
 
@@ -193,10 +178,9 @@
  "p256",
  "rand",
  "rand_chacha",
- "rand_core 0.6.4",
- "rand_core_05_adapter",
+ "rand_core",
  "sec1",
- "sha2 0.10.6",
+ "sha2",
  "subtle",
  "x25519-dalek",
 ]
@@ -212,15 +196,16 @@
 
 [[package]]
 name = "curve25519-dalek"
-version = "3.2.0"
+version = "4.0.0-rc.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0b9fdf9972b2bd6af2d913799d9ebc165ea4d2e65878e329d9c6b372c4491b61"
+checksum = "03d928d978dbec61a1167414f5ec534f24bea0d7a0d24dd9b6233d3d8223e585"
 dependencies = [
- "byteorder",
- "digest 0.9.0",
- "rand_core 0.5.1",
+ "cfg-if",
+ "digest",
+ "fiat-crypto",
+ "packed_simd_2",
+ "platforms",
  "subtle",
- "zeroize",
 ]
 
 [[package]]
@@ -246,43 +231,34 @@
 
 [[package]]
 name = "digest"
-version = "0.9.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066"
-dependencies = [
- "generic-array",
-]
-
-[[package]]
-name = "digest"
 version = "0.10.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "8168378f4e5023e7218c89c891c0fd8ecdb5e5e4f18cb78f38cf245dd021e76f"
 dependencies = [
- "block-buffer 0.10.4",
+ "block-buffer",
  "crypto-common",
  "subtle",
 ]
 
 [[package]]
 name = "ed25519"
-version = "1.5.3"
+version = "2.2.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "91cff35c70bba8a626e3185d8cd48cc11b5437e1a5bcd15b9b5fa3c64b6dfee7"
+checksum = "5fb04eee5d9d907f29e80ee6b0e78f7e2c82342c63e3580d8c4f69d9d5aad963"
 dependencies = [
  "signature",
 ]
 
 [[package]]
 name = "ed25519-dalek"
-version = "1.0.1"
+version = "2.0.0-rc.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c762bae6dcaf24c4c84667b8579785430908723d5c889f469d76a41d59cc7a9d"
+checksum = "798f704d128510932661a3489b08e3f4c934a01d61c5def59ae7b8e48f19665a"
 dependencies = [
  "curve25519-dalek",
  "ed25519",
- "sha2 0.9.9",
- "zeroize",
+ "rand_core",
+ "sha2",
 ]
 
 [[package]]
@@ -293,12 +269,12 @@
 dependencies = [
  "base16ct",
  "crypto-bigint",
- "digest 0.10.6",
+ "digest",
  "ff",
  "generic-array",
  "group",
  "hkdf",
- "rand_core 0.6.4",
+ "rand_core",
  "sec1",
  "subtle",
  "zeroize",
@@ -310,11 +286,17 @@
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449"
 dependencies = [
- "rand_core 0.6.4",
+ "rand_core",
  "subtle",
 ]
 
 [[package]]
+name = "fiat-crypto"
+version = "0.1.20"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e825f6987101665dea6ec934c09ec6d721de7bc1bf92248e1d5810c8cd636b77"
+
+[[package]]
 name = "generic-array"
 version = "0.14.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -343,7 +325,7 @@
 checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63"
 dependencies = [
  "ff",
- "rand_core 0.6.4",
+ "rand_core",
  "subtle",
 ]
 
@@ -362,7 +344,7 @@
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e"
 dependencies = [
- "digest 0.10.6",
+ "digest",
 ]
 
 [[package]]
@@ -428,6 +410,12 @@
 ]
 
 [[package]]
+name = "libm"
+version = "0.1.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7fc7aa29613bd6a620df431842069224d8bc9011086b1db4c0e0cd47fa03ec9a"
+
+[[package]]
 name = "once_cell"
 version = "1.17.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -450,6 +438,22 @@
 ]
 
 [[package]]
+name = "packed_simd_2"
+version = "0.3.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a1914cd452d8fccd6f9db48147b29fd4ae05bea9dc5d9ad578509f72415de282"
+dependencies = [
+ "cfg-if",
+ "libm",
+]
+
+[[package]]
+name = "platforms"
+version = "3.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e3d7ddaed09e0eb771a79ab0fd64609ba0afb0a8366421957936ad14cbd13630"
+
+[[package]]
 name = "polyval"
 version = "0.6.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -500,7 +504,7 @@
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404"
 dependencies = [
- "rand_core 0.6.4",
+ "rand_core",
 ]
 
 [[package]]
@@ -510,17 +514,11 @@
 checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88"
 dependencies = [
  "ppv-lite86",
- "rand_core 0.6.4",
+ "rand_core",
 ]
 
 [[package]]
 name = "rand_core"
-version = "0.5.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19"
-
-[[package]]
-name = "rand_core"
 version = "0.6.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c"
@@ -529,14 +527,6 @@
 ]
 
 [[package]]
-name = "rand_core_05_adapter"
-version = "0.1.0"
-dependencies = [
- "rand",
- "rand_core 0.5.1",
-]
-
-[[package]]
 name = "sec1"
 version = "0.7.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -551,33 +541,20 @@
 
 [[package]]
 name = "sha2"
-version = "0.9.9"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800"
-dependencies = [
- "block-buffer 0.9.0",
- "cfg-if",
- "cpufeatures",
- "digest 0.9.0",
- "opaque-debug",
-]
-
-[[package]]
-name = "sha2"
 version = "0.10.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "82e6b795fe2e3b1e845bafcb27aa35405c4d47cdfc92af5fc8d3002f76cebdc0"
 dependencies = [
  "cfg-if",
  "cpufeatures",
- "digest 0.10.6",
+ "digest",
 ]
 
 [[package]]
 name = "signature"
-version = "1.6.4"
+version = "2.1.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "74233d3b3b2f6d4b006dc19dee745e73e2a6bfb6f93607cd3b02bd5b00797d7c"
+checksum = "5e1788eed21689f9cf370582dfc467ef36ed9c707f073528ddafa8d83e3b8500"
 
 [[package]]
 name = "subtle"
@@ -597,18 +574,6 @@
 ]
 
 [[package]]
-name = "synstructure"
-version = "0.12.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f36bdaa60a83aca3921b5259d5400cbf5e90fc51931376a9bd4a0eb79aa7210f"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn",
- "unicode-xid",
-]
-
-[[package]]
 name = "typenum"
 version = "1.16.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -621,12 +586,6 @@
 checksum = "e5464a87b239f13a63a501f2701565754bae92d243d4bb7eb12f6d57d2269bf4"
 
 [[package]]
-name = "unicode-xid"
-version = "0.2.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c"
-
-[[package]]
 name = "universal-hash"
 version = "0.5.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -650,13 +609,12 @@
 
 [[package]]
 name = "x25519-dalek"
-version = "2.0.0-pre.1"
+version = "2.0.0-rc.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e5da623d8af10a62342bcbbb230e33e58a63255a58012f8653c578e54bab48df"
+checksum = "fabd6e16dd08033932fc3265ad4510cc2eab24656058a6dcb107ffe274abcc95"
 dependencies = [
  "curve25519-dalek",
- "rand_core 0.6.4",
- "zeroize",
+ "rand_core",
 ]
 
 [[package]]
@@ -673,18 +631,3 @@
 version = "1.5.7"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "c394b5bd0c6f669e7275d9c20aa90ae064cb22e75a1cad54e1b34088034b149f"
-dependencies = [
- "zeroize_derive",
-]
-
-[[package]]
-name = "zeroize_derive"
-version = "1.3.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "44bf07cb3e50ea2003396695d58bf46bc9887a1f362260446fad6bc4e79bd36c"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn",
- "synstructure",
-]
diff --git a/nearby/presence/ldt/fuzz/fuzz_targets/ldt_roundtrip.rs b/nearby/presence/ldt/fuzz/fuzz_targets/ldt_roundtrip.rs
index 16a06c5..13e2a46 100644
--- a/nearby/presence/ldt/fuzz/fuzz_targets/ldt_roundtrip.rs
+++ b/nearby/presence/ldt/fuzz/fuzz_targets/ldt_roundtrip.rs
@@ -19,14 +19,16 @@
 use xts_aes::XtsAes128;
 
 fuzz_target!(|data: LdtFuzzInput| {
-    let ldt =
-        Ldt::<16, XtsAes128<RustCrypto>, Swap>::new(&LdtKey::from_concatenated(&data.ldt_key));
+    let ldt_enc =
+        LdtEncryptCipher::<16, XtsAes128<RustCrypto>, Swap>::new(&LdtKey::from_concatenated(&data.ldt_key));
+    let ldt_dec =
+        LdtDecryptCipher::<16, XtsAes128<RustCrypto>, Swap>::new(&LdtKey::from_concatenated(&data.ldt_key));
     let len = 16 + (data.len as usize % 16);
     let padder: XorPadder<16> = data.xor_padder.clone().into();
 
     let mut buffer = data.plaintext.clone();
-    ldt.encrypt(&mut buffer[..len], &padder).unwrap();
-    ldt.decrypt(&mut buffer[..len], &padder).unwrap();
+    ldt_enc.encrypt(&mut buffer[..len], &padder).unwrap();
+    ldt_dec.decrypt(&mut buffer[..len], &padder).unwrap();
     assert_eq!(data.plaintext, buffer);
 });
 
diff --git a/nearby/presence/ldt/src/lib.rs b/nearby/presence/ldt/src/lib.rs
index 9ea8b79..8dc4068 100644
--- a/nearby/presence/ldt/src/lib.rs
+++ b/nearby/presence/ldt/src/lib.rs
@@ -17,7 +17,6 @@
 #![no_std]
 #![forbid(unsafe_code)]
 #![deny(
-    missing_docs,
     clippy::indexing_slicing,
     clippy::unwrap_used,
     clippy::panic,
@@ -26,24 +25,27 @@
 
 use core::{fmt, marker::PhantomData};
 use ldt_tbc::{ConcatenatedKeyArray, TweakableBlockCipher, TweakableBlockCipherKey};
+use ldt_tbc::{TweakableBlockCipherDecrypter, TweakableBlockCipherEncrypter};
 
-/// Implementation of the [LDT](https://eprint.iacr.org/2017/841.pdf) length doubler.
+/// Implementation of the [LDT](https://eprint.iacr.org/2017/841.pdf) length doubler encryption cipher.
 ///
 /// `B` is the block size.
+/// `T` is the provided implementation of a Tweakable Block Cipher
+/// `M` is the implementation of a [pure mix function](https://eprint.iacr.org/2017/841.pdf)
 #[repr(C)]
-pub struct Ldt<const B: usize, T: TweakableBlockCipher<B>, M: Mix> {
-    cipher_1: T,
-    cipher_2: T,
+pub struct LdtEncryptCipher<const B: usize, T: TweakableBlockCipher<B>, M: Mix> {
+    cipher_1: T::EncryptionCipher,
+    cipher_2: T::EncryptionCipher,
     // marker to use `M`
     mix_phantom: PhantomData<M>,
 }
 
-impl<const B: usize, T: TweakableBlockCipher<B>, M: Mix> Ldt<B, T, M> {
-    /// Create an [Ldt] with the provided Tweakable block cipher and Mix function
+impl<const B: usize, T: TweakableBlockCipher<B>, M: Mix> LdtEncryptCipher<B, T, M> {
+    /// Create an [LdtEncryptCipher] with the provided Tweakable block cipher and Mix function
     pub fn new(key: &LdtKey<T::Key>) -> Self {
-        Ldt {
-            cipher_1: T::new(&key.key_1),
-            cipher_2: T::new(&key.key_2),
+        LdtEncryptCipher {
+            cipher_1: T::EncryptionCipher::new(&key.key_1),
+            cipher_2: T::EncryptionCipher::new(&key.key_2),
             mix_phantom: PhantomData::default(),
         }
     }
@@ -55,7 +57,7 @@
     /// # Errors
     /// - if `data` has a length outside of `[B, B * 2)`.
     pub fn encrypt<P: Padder<B, T>>(&self, data: &mut [u8], padder: &P) -> Result<(), LdtError> {
-        self.do_ldt(
+        do_ldt::<B, T, M, _, _, _, P>(
             data,
             |cipher, tweak, block| cipher.encrypt(tweak, block),
             padder,
@@ -64,6 +66,30 @@
             &self.cipher_2,
         )
     }
+}
+
+/// Implementation of the [LDT](https://eprint.iacr.org/2017/841.pdf) length doubler decryption cipher.
+///
+/// `B` is the block size.
+/// `T` is the provided implementation of a Tweakable Block Cipher
+/// `M` is the implementation of a [pure mix function](https://eprint.iacr.org/2017/841.pdf)
+#[repr(C)]
+pub struct LdtDecryptCipher<const B: usize, T: TweakableBlockCipher<B>, M: Mix> {
+    cipher_1: T::DecryptionCipher,
+    cipher_2: T::DecryptionCipher,
+    // marker to use `M`
+    mix_phantom: PhantomData<M>,
+}
+
+impl<const B: usize, T: TweakableBlockCipher<B>, M: Mix> LdtDecryptCipher<B, T, M> {
+    /// Create an [LdtDecryptCipher] with the provided Tweakable block cipher and Mix function
+    pub fn new(key: &LdtKey<T::Key>) -> Self {
+        LdtDecryptCipher {
+            cipher_1: T::DecryptionCipher::new(&key.key_1),
+            cipher_2: T::DecryptionCipher::new(&key.key_2),
+            mix_phantom: PhantomData::default(),
+        }
+    }
 
     /// Decrypt `data` in place, performing the pad operation with `padder`.
     ///
@@ -72,7 +98,7 @@
     /// # Errors
     /// - if `data` has a length outside of `[B, B * 2)`.
     pub fn decrypt<P: Padder<B, T>>(&self, data: &mut [u8], padder: &P) -> Result<(), LdtError> {
-        self.do_ldt(
+        do_ldt::<B, T, M, _, _, _, P>(
             data,
             |cipher, tweak, block| cipher.decrypt(tweak, block),
             padder,
@@ -82,63 +108,66 @@
             &self.cipher_1,
         )
     }
+}
 
-    fn do_ldt<C, X, P>(
-        &self,
-        data: &mut [u8],
-        cipher_op: C,
-        padder: &P,
-        mix: X,
-        first_cipher: &T,
-        second_cipher: &T,
-    ) -> Result<(), LdtError>
-    where
-        // Encrypt or decrypt in place with a tweak
-        C: Fn(&T, T::Tweak, &mut [u8; B]),
-        // Mix a/b into block-sized chunks
-        X: Fn(&[u8], &[u8]) -> ([u8; B], [u8; B]),
-        P: Padder<B, T>,
-    {
-        if data.len() < B || data.len() >= B * 2 {
-            return Err(LdtError::InvalidLength(data.len()));
-        }
-        let s = data.len() - B;
-        debug_assert!(s < B);
-
-        // m1 length B, m2 length s (s < B)
-        let (m1, m2) = data.split_at(B);
-        debug_assert_eq!(s, m2.len());
-        let m1_ciphertext = {
-            let mut m1_plaintext = [0_u8; B];
-            // m1 is of length B, so no panic
-            m1_plaintext[..].copy_from_slice(m1);
-            let tweak = padder.pad_tweak(m2);
-            cipher_op(first_cipher, tweak, &mut m1_plaintext);
-            m1_plaintext
-        };
-        // |z| = B - s, |m3| = s
-        let (z, m3) = m1_ciphertext.split_at(B - s);
-        debug_assert_eq!(s, m3.len());
-        // c3 and c2 are the last s bytes of their size-B arrays, respectively
-        let (mut c3, c2) = mix(m3, m2);
-        let c1 = {
-            // constructing z || c3 is easy since c3 is already the last s bytes
-            c3[0..(B - s)].copy_from_slice(z);
-            let mut z_c3 = c3;
-            let tweak = padder.pad_tweak(&c2[B - s..]);
-            cipher_op(second_cipher, tweak, &mut z_c3);
-            z_c3
-        };
-        let len = data.len();
-        data.get_mut(0..B)
-            .ok_or(LdtError::InvalidLength(len))?
-            .copy_from_slice(&c1);
-        data.get_mut(B..)
-            .ok_or(LdtError::InvalidLength(len))?
-            .copy_from_slice(&c2[B - s..]);
-
-        Ok(())
+// internal implementation of ldt cipher operations, re-used by encryption and decryption, by providing
+// the corresponding cipher_op and mix operation
+fn do_ldt<const B: usize, T, M, O, C, X, P>(
+    data: &mut [u8],
+    cipher_op: O,
+    padder: &P,
+    mix: X,
+    first_cipher: &C,
+    second_cipher: &C,
+) -> Result<(), LdtError>
+where
+    T: TweakableBlockCipher<B>,
+    M: Mix,
+    // Encrypt or decrypt in place with a tweak
+    O: Fn(&C, T::Tweak, &mut [u8; B]),
+    // Mix a/b into block-sized chunks
+    X: Fn(&[u8], &[u8]) -> ([u8; B], [u8; B]),
+    P: Padder<B, T>,
+{
+    if data.len() < B || data.len() >= B * 2 {
+        return Err(LdtError::InvalidLength(data.len()));
     }
+    let s = data.len() - B;
+    debug_assert!(s < B);
+
+    // m1 length B, m2 length s (s < B)
+    let (m1, m2) = data.split_at(B);
+    debug_assert_eq!(s, m2.len());
+    let m1_ciphertext = {
+        let mut m1_plaintext = [0_u8; B];
+        // m1 is of length B, so no panic
+        m1_plaintext[..].copy_from_slice(m1);
+        let tweak = padder.pad_tweak(m2);
+        cipher_op(first_cipher, tweak, &mut m1_plaintext);
+        m1_plaintext
+    };
+    // |z| = B - s, |m3| = s
+    let (z, m3) = m1_ciphertext.split_at(B - s);
+    debug_assert_eq!(s, m3.len());
+    // c3 and c2 are the last s bytes of their size-B arrays, respectively
+    let (mut c3, c2) = mix(m3, m2);
+    let c1 = {
+        // constructing z || c3 is easy since c3 is already the last s bytes
+        c3[0..(B - s)].copy_from_slice(z);
+        let mut z_c3 = c3;
+        let tweak = padder.pad_tweak(&c2[B - s..]);
+        cipher_op(second_cipher, tweak, &mut z_c3);
+        z_c3
+    };
+    let len = data.len();
+    data.get_mut(0..B)
+        .ok_or(LdtError::InvalidLength(len))?
+        .copy_from_slice(&c1);
+    data.get_mut(B..)
+        .ok_or(LdtError::InvalidLength(len))?
+        .copy_from_slice(&c2[B - s..]);
+
+    Ok(())
 }
 
 /// Errors produced by LDT encryption/decryption.
diff --git a/nearby/presence/ldt/tests/ldt_roundtrip.rs b/nearby/presence/ldt/tests/ldt_roundtrip.rs
index b848984..b225399 100644
--- a/nearby/presence/ldt/tests/ldt_roundtrip.rs
+++ b/nearby/presence/ldt/tests/ldt_roundtrip.rs
@@ -27,15 +27,19 @@
 
     for _ in 0..100_000 {
         if rng.gen() {
+            let ldt_key = LdtKey::from_random(&mut rng);
             do_roundtrip(
-                Ldt::<16, XtsAes128<RustCrypto>, Swap>::new(&LdtKey::from_random(&mut rng)),
+                LdtEncryptCipher::<16, XtsAes128<RustCrypto>, Swap>::new(&ldt_key),
+                LdtDecryptCipher::<16, XtsAes128<RustCrypto>, Swap>::new(&ldt_key),
                 &DefaultPadder::default(),
                 &mut rng,
                 &plaintext_len_range,
             )
         } else {
+            let ldt_key = LdtKey::from_random(&mut rng);
             do_roundtrip(
-                Ldt::<16, XtsAes256<RustCrypto>, Swap>::new(&LdtKey::from_random(&mut rng)),
+                LdtEncryptCipher::<16, XtsAes256<RustCrypto>, Swap>::new(&ldt_key),
+                LdtDecryptCipher::<16, XtsAes256<RustCrypto>, Swap>::new(&ldt_key),
                 &DefaultPadder::default(),
                 &mut rng,
                 &plaintext_len_range,
@@ -47,22 +51,27 @@
 #[test]
 fn roundtrip_xor_padder() {
     let mut rng = rand::rngs::StdRng::from_entropy();
-    // 2 bytes smaller becauwe're using a 2 byte salt
+    // 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(&mut rng).into();
+
         if rng.gen() {
+            let ldt_key = LdtKey::from_random(&mut rng);
             do_roundtrip(
-                Ldt::<16, XtsAes128<RustCrypto>, Swap>::new(&LdtKey::from_random(&mut rng)),
+                LdtEncryptCipher::<16, XtsAes128<RustCrypto>, Swap>::new(&ldt_key),
+                LdtDecryptCipher::<16, XtsAes128<RustCrypto>, Swap>::new(&ldt_key),
                 &padder,
                 &mut rng,
                 &plaintext_len_range,
             )
         } else {
+            let ldt_key = LdtKey::from_random(&mut rng);
             do_roundtrip(
-                Ldt::<16, XtsAes256<RustCrypto>, Swap>::new(&LdtKey::from_random(&mut rng)),
+                LdtEncryptCipher::<16, XtsAes256<RustCrypto>, Swap>::new(&ldt_key),
+                LdtDecryptCipher::<16, XtsAes256<RustCrypto>, Swap>::new(&ldt_key),
                 &padder,
                 &mut rng,
                 &plaintext_len_range,
@@ -78,7 +87,8 @@
     M: Mix,
     R: rand::Rng,
 >(
-    ldt: Ldt<B, T, M>,
+    ldt_enc: LdtEncryptCipher<B, T, M>,
+    ldt_dec: LdtDecryptCipher<B, T, M>,
     padder: &P,
     rng: &mut R,
     plaintext_len_range: &distributions::Uniform<usize>,
@@ -87,11 +97,11 @@
     let plaintext = random_vec(rng, len);
 
     let mut ciphertext = plaintext.clone();
-    ldt.encrypt(&mut ciphertext, padder).unwrap();
+    ldt_enc.encrypt(&mut ciphertext, padder).unwrap();
 
     assert_eq!(plaintext.len(), ciphertext.len());
     assert_ne!(plaintext, ciphertext);
 
-    ldt.decrypt(&mut ciphertext, padder).unwrap();
+    ldt_dec.decrypt(&mut ciphertext, padder).unwrap();
     assert_eq!(plaintext, ciphertext);
 }
diff --git a/nearby/presence/ldt/tests/ldt_test_vectors.rs b/nearby/presence/ldt/tests/ldt_test_vectors.rs
index ff2c6fe..691bd62 100644
--- a/nearby/presence/ldt/tests/ldt_test_vectors.rs
+++ b/nearby/presence/ldt/tests/ldt_test_vectors.rs
@@ -14,7 +14,7 @@
 
 use anyhow::anyhow;
 use crypto_provider_rustcrypto::RustCrypto;
-use ldt::{DefaultPadder, Ldt, LdtKey, Swap, XorPadder};
+use ldt::{DefaultPadder, LdtDecryptCipher, LdtEncryptCipher, LdtKey, Swap, XorPadder};
 use std::{fs, io::Read as _};
 use test_helper::{extract_key_array, extract_key_vec};
 use xts_aes::XtsAes128;
@@ -46,17 +46,24 @@
         assert!(len >= crypto_provider::aes::BLOCK_SIZE);
         assert!(len < crypto_provider::aes::BLOCK_SIZE * 2);
 
-        let ldt = Ldt::<16, XtsAes128<RustCrypto>, Swap>::new(&LdtKey::from_concatenated(&key));
+        let ldt_enc = LdtEncryptCipher::<16, XtsAes128<RustCrypto>, Swap>::new(
+            &LdtKey::from_concatenated(&key),
+        );
+        let ldt_dec = LdtDecryptCipher::<16, XtsAes128<RustCrypto>, Swap>::new(
+            &LdtKey::from_concatenated(&key),
+        );
 
         let mut plaintext = [0; 31];
         plaintext[..len].copy_from_slice(&expected_ciphertext);
-        ldt.decrypt(&mut plaintext[..len], &DefaultPadder::default())
+        ldt_dec
+            .decrypt(&mut plaintext[..len], &DefaultPadder::default())
             .unwrap();
         assert_eq!(&expected_plaintext, &plaintext[..len]);
 
         let mut ciphertext = [0; 31];
         ciphertext[..len].copy_from_slice(&expected_plaintext);
-        ldt.encrypt(&mut ciphertext[..len], &DefaultPadder::default())
+        ldt_enc
+            .encrypt(&mut ciphertext[..len], &DefaultPadder::default())
             .unwrap();
         assert_eq!(&expected_ciphertext, &ciphertext[..len]);
     }
@@ -92,17 +99,24 @@
         assert!(len >= crypto_provider::aes::BLOCK_SIZE);
         assert!(len < crypto_provider::aes::BLOCK_SIZE * 2);
 
-        let ldt = Ldt::<16, XtsAes128<RustCrypto>, Swap>::new(&LdtKey::from_concatenated(&key));
+        let ldt_enc = LdtEncryptCipher::<16, XtsAes128<RustCrypto>, Swap>::new(
+            &LdtKey::from_concatenated(&key),
+        );
+        let ldt_dec = LdtDecryptCipher::<16, XtsAes128<RustCrypto>, Swap>::new(
+            &LdtKey::from_concatenated(&key),
+        );
 
         let mut plaintext = [0; 31];
         plaintext[..len].copy_from_slice(&expected_ciphertext);
-        ldt.decrypt(&mut plaintext[..len], &XorPadder::from(xor_pad))
+        ldt_dec
+            .decrypt(&mut plaintext[..len], &XorPadder::from(xor_pad))
             .unwrap();
         assert_eq!(&expected_plaintext, &plaintext[..len]);
 
         let mut ciphertext = [0; 31];
         ciphertext[..len].copy_from_slice(&expected_plaintext);
-        ldt.encrypt(&mut ciphertext[..len], &XorPadder::from(xor_pad))
+        ldt_enc
+            .encrypt(&mut ciphertext[..len], &XorPadder::from(xor_pad))
             .unwrap();
         assert_eq!(&expected_ciphertext, &ciphertext[..len]);
     }
diff --git a/nearby/presence/ldt/tests/tests.rs b/nearby/presence/ldt/tests/tests.rs
index 77dbb35..a50658d 100644
--- a/nearby/presence/ldt/tests/tests.rs
+++ b/nearby/presence/ldt/tests/tests.rs
@@ -17,15 +17,16 @@
 use alloc::vec;
 use crypto_provider::aes::BLOCK_SIZE;
 use crypto_provider_rustcrypto::RustCrypto;
-use ldt::{DefaultPadder, Ldt, LdtError, LdtKey, Padder, Swap, XorPadder};
+use ldt::{
+    DefaultPadder, LdtDecryptCipher, LdtEncryptCipher, LdtError, LdtKey, Padder, Swap, XorPadder,
+};
 use xts_aes::{XtsAes128, XtsAes128Key};
 
 #[test]
 fn normal_pad_empty() {
     let padder = DefaultPadder::default();
     let tweak: xts_aes::Tweak =
-        <DefaultPadder as Padder<16, xts_aes::XtsAes128<RustCrypto>>>::pad_tweak(&padder, &[]);
-
+        <DefaultPadder as Padder<16, XtsAes128<RustCrypto>>>::pad_tweak(&padder, &[]);
     let bytes = tweak.le_bytes();
 
     // leading 1 bit
@@ -38,7 +39,7 @@
 fn normal_pad_one_byte() {
     let padder = DefaultPadder::default();
     let tweak: xts_aes::Tweak =
-        <DefaultPadder as Padder<16, xts_aes::XtsAes128<RustCrypto>>>::pad_tweak(&padder, &[0x81]);
+        <DefaultPadder as Padder<16, XtsAes128<RustCrypto>>>::pad_tweak(&padder, &[0x81]);
 
     let bytes = tweak.le_bytes();
 
@@ -69,7 +70,7 @@
 fn normal_pad_too_big_panics() {
     let padder = DefaultPadder::default();
     let input = [0x99; 16];
-    <DefaultPadder as Padder<16, xts_aes::XtsAes128<RustCrypto>>>::pad_tweak(&padder, &input);
+    <DefaultPadder as Padder<16, XtsAes128<RustCrypto>>>::pad_tweak(&padder, &input);
 }
 
 #[test]
@@ -77,7 +78,7 @@
     let padder = [0x24; BLOCK_SIZE].into();
     let tweak: xts_aes::Tweak = <XorPadder<BLOCK_SIZE> as Padder<
         BLOCK_SIZE,
-        xts_aes::XtsAes128<RustCrypto>,
+        XtsAes128<RustCrypto>,
     >>::pad_tweak(&padder, &[]);
 
     let bytes = tweak.le_bytes();
@@ -135,41 +136,42 @@
 
 #[test]
 fn encrypt_too_short_err() {
-    do_length_check(7, |ldt, payload| {
-        ldt.encrypt(payload, &DefaultPadder::default())
-    })
+    do_length_check_enc(7)
 }
 
 #[test]
 fn encrypt_too_long_err() {
-    do_length_check(40, |ldt, payload| {
-        ldt.encrypt(payload, &DefaultPadder::default())
-    })
+    do_length_check_enc(40)
 }
 #[test]
 fn decrypt_too_short_err() {
-    do_length_check(7, |ldt, payload| {
-        ldt.decrypt(payload, &DefaultPadder::default())
-    })
+    do_length_check_dec(7)
 }
 #[test]
 fn decrypt_too_long_err() {
-    do_length_check(40, |ldt, payload| {
-        ldt.decrypt(payload, &DefaultPadder::default())
-    })
+    do_length_check_dec(40)
 }
 
-fn do_length_check<
-    F: Fn(Ldt<{ BLOCK_SIZE }, XtsAes128<RustCrypto>, Swap>, &mut [u8]) -> Result<(), LdtError>,
->(
-    payload_len: usize,
-    ldt_op: F,
-) {
-    let ldt = Ldt::new(&LdtKey::<XtsAes128Key>::from_concatenated(&[0u8; 64]));
+fn do_length_check_dec(len: usize) {
+    let ldt_dec = LdtDecryptCipher::<{ BLOCK_SIZE }, XtsAes128<RustCrypto>, Swap>::new(
+        &LdtKey::<XtsAes128Key>::from_concatenated(&[0u8; 64]),
+    );
 
-    let mut payload = vec![0; payload_len];
+    let mut payload = vec![0; len];
     assert_eq!(
-        Err(LdtError::InvalidLength(payload_len)),
-        ldt_op(ldt, &mut payload)
+        Err(LdtError::InvalidLength(len)),
+        ldt_dec.decrypt(&mut payload, &DefaultPadder::default())
+    );
+}
+
+fn do_length_check_enc(len: usize) {
+    let ldt_enc = LdtEncryptCipher::<{ BLOCK_SIZE }, XtsAes128<RustCrypto>, Swap>::new(
+        &LdtKey::<XtsAes128Key>::from_concatenated(&[0u8; 64]),
+    );
+
+    let mut payload = vec![0; len];
+    assert_eq!(
+        Err(LdtError::InvalidLength(len)),
+        ldt_enc.encrypt(&mut payload, &DefaultPadder::default())
     );
 }
diff --git a/nearby/presence/ldt_np_adv/Cargo.toml b/nearby/presence/ldt_np_adv/Cargo.toml
index b5a0471..707bb8d 100644
--- a/nearby/presence/ldt_np_adv/Cargo.toml
+++ b/nearby/presence/ldt_np_adv/Cargo.toml
@@ -13,12 +13,21 @@
 ldt_tbc.workspace = true
 
 [dev-dependencies]
-crypto_provider_rustcrypto.workspace = true
+crypto_provider_rustcrypto = {workspace = true, features=["std"]}
+crypto_provider_openssl.workspace = true
 rand_ext.workspace = true
 test_helper.workspace = true
 
 rand.workspace = true
 base64.workspace = true
-serde_json.workspace = true
+serde_json = {workspace = true, features=["std"]}
 hex.workspace = true
 anyhow.workspace = true
+criterion.workspace = true
+rand_pcg.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
new file mode 100644
index 0000000..c40530b
--- /dev/null
+++ b/nearby/presence/ldt_np_adv/benches/ldt_adv_scan.rs
@@ -0,0 +1,124 @@
+// Copyright 2022 Google LLC
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+use criterion::{black_box, criterion_group, criterion_main, Criterion};
+use ldt_np_adv::*;
+
+use array_view::ArrayView;
+use rand::{Rng as _, SeedableRng as _};
+
+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) {
+    let mut seed: <rand_pcg::Pcg64 as rand::SeedableRng>::Seed = Default::default();
+    rand::thread_rng().fill(&mut seed);
+    let mut rng = rand_pcg::Pcg64::from_seed(seed);
+
+    for &len in &[1_usize, 10, 1000] {
+        c.bench_function(&format!("Scan adv with fresh ciphers/{len}"), |b| {
+            let configs = random_configs::<C, _>(&mut rng, len);
+            let payload_len = rng.gen_range(crypto_provider::aes::BLOCK_SIZE..=LDT_XTS_AES_MAX_LEN);
+            let payload = random_vec(&mut rng, payload_len);
+
+            let salt = LegacySalt::from(rng.gen::<[u8; 2]>());
+            #[allow(clippy::unit_arg)]
+            b.iter(|| {
+                let ciphers = build_ciphers(&configs);
+                black_box(find_matching_item::<C>(&ciphers, salt, &payload))
+            });
+        });
+        c.bench_function(&format!("Scan adv with existing ciphers/{len}"), |b| {
+            let configs = random_configs::<C, _>(&mut rng, len);
+            let payload_len = rng.gen_range(crypto_provider::aes::BLOCK_SIZE..=LDT_XTS_AES_MAX_LEN);
+            let payload = random_vec(&mut rng, payload_len);
+
+            let salt = LegacySalt::from(rng.gen::<[u8; 2]>());
+            let ciphers = build_ciphers(&configs);
+            #[allow(clippy::unit_arg)]
+            b.iter(|| black_box(find_matching_item::<C>(&ciphers, salt, &payload)));
+        });
+    }
+}
+
+criterion_group!(benches, ldt_adv_scan::<RustCrypto>, ldt_adv_scan::<Openssl>);
+criterion_main!(benches);
+
+fn find_matching_item<C: CryptoProvider>(
+    ciphers: &[LdtNpAdvDecrypterXtsAes128<C>],
+    salt: LegacySalt,
+    payload: &[u8],
+) {
+    let padder = salt_padder::<16, C>(salt);
+    ciphers
+        .iter()
+        .enumerate()
+        .filter_map(|(index, item)| {
+            item.decrypt_and_verify(payload, &padder)
+                .map(|buffer| (index, buffer))
+                // any error = move to the next item
+                .ok()
+        })
+        .next()
+        .map(|(index, buffer)| MatchResult {
+            matching_index: index,
+            buffer,
+        });
+}
+
+fn build_ciphers<C: CryptoProvider>(
+    configs: &[CipherConfig<C>],
+) -> Vec<LdtNpAdvDecrypterXtsAes128<C>> {
+    configs
+        .iter()
+        .map(|config| {
+            build_np_adv_decrypter_from_key_seed(&config.key_seed, config.metadata_key_hmac)
+        })
+        .collect::<Vec<_>>()
+}
+
+struct CipherConfig<C: CryptoProvider> {
+    key_seed: NpKeySeedHkdf<C>,
+    metadata_key_hmac: [u8; 32],
+}
+
+/// `O` is the buffer size of the LDT config that produced this
+#[derive(PartialEq, Eq, Debug)]
+pub struct MatchResult<const O: usize> {
+    /// The index of the batch item that matched
+    matching_index: usize,
+    /// The buffer holding the plaintext
+    buffer: ArrayView<u8, O>,
+}
+
+fn random_configs<C: CryptoProvider, R: rand::Rng>(
+    rng: &mut R,
+    len: usize,
+) -> Vec<CipherConfig<C>> {
+    (0..len)
+        // ok to use random hmac since we want to try all configs always
+        .map(|_| CipherConfig {
+            key_seed: NpKeySeedHkdf::new(&rng.gen()),
+            metadata_key_hmac: rng.gen(),
+        })
+        .collect()
+}
+
+fn random_vec<R: rand::Rng>(rng: &mut R, len: usize) -> Vec<u8> {
+    let mut bytes = Vec::<u8>::new();
+    bytes.extend((0..len).map(|_| rng.gen::<u8>()));
+    bytes
+}
diff --git a/nearby/presence/ldt_np_adv/fuzz/Cargo.lock b/nearby/presence/ldt_np_adv/fuzz/Cargo.lock
index 6bf3469..e02e7cc 100644
--- a/nearby/presence/ldt_np_adv/fuzz/Cargo.lock
+++ b/nearby/presence/ldt_np_adv/fuzz/Cargo.lock
@@ -64,15 +64,6 @@
 
 [[package]]
 name = "block-buffer"
-version = "0.9.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4"
-dependencies = [
- "generic-array",
-]
-
-[[package]]
-name = "block-buffer"
 version = "0.10.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71"
@@ -90,12 +81,6 @@
 ]
 
 [[package]]
-name = "byteorder"
-version = "1.4.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610"
-
-[[package]]
 name = "bytes"
 version = "1.4.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -157,7 +142,7 @@
 checksum = "7c2538c4e68e52548bacb3e83ac549f903d44f011ac9d5abb5e132e67d0808f7"
 dependencies = [
  "generic-array",
- "rand_core 0.6.4",
+ "rand_core",
  "subtle",
  "zeroize",
 ]
@@ -169,7 +154,7 @@
 checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3"
 dependencies = [
  "generic-array",
- "rand_core 0.6.4",
+ "rand_core",
  "typenum",
 ]
 
@@ -197,10 +182,9 @@
  "p256",
  "rand",
  "rand_chacha",
- "rand_core 0.6.4",
- "rand_core_05_adapter",
+ "rand_core",
  "sec1",
- "sha2 0.10.6",
+ "sha2",
  "subtle",
  "x25519-dalek",
 ]
@@ -216,15 +200,16 @@
 
 [[package]]
 name = "curve25519-dalek"
-version = "3.2.0"
+version = "4.0.0-rc.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0b9fdf9972b2bd6af2d913799d9ebc165ea4d2e65878e329d9c6b372c4491b61"
+checksum = "03d928d978dbec61a1167414f5ec534f24bea0d7a0d24dd9b6233d3d8223e585"
 dependencies = [
- "byteorder",
- "digest 0.9.0",
- "rand_core 0.5.1",
+ "cfg-if",
+ "digest",
+ "fiat-crypto",
+ "packed_simd_2",
+ "platforms",
  "subtle",
- "zeroize",
 ]
 
 [[package]]
@@ -250,43 +235,34 @@
 
 [[package]]
 name = "digest"
-version = "0.9.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066"
-dependencies = [
- "generic-array",
-]
-
-[[package]]
-name = "digest"
 version = "0.10.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "8168378f4e5023e7218c89c891c0fd8ecdb5e5e4f18cb78f38cf245dd021e76f"
 dependencies = [
- "block-buffer 0.10.4",
+ "block-buffer",
  "crypto-common",
  "subtle",
 ]
 
 [[package]]
 name = "ed25519"
-version = "1.5.3"
+version = "2.2.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "91cff35c70bba8a626e3185d8cd48cc11b5437e1a5bcd15b9b5fa3c64b6dfee7"
+checksum = "5fb04eee5d9d907f29e80ee6b0e78f7e2c82342c63e3580d8c4f69d9d5aad963"
 dependencies = [
  "signature",
 ]
 
 [[package]]
 name = "ed25519-dalek"
-version = "1.0.1"
+version = "2.0.0-rc.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c762bae6dcaf24c4c84667b8579785430908723d5c889f469d76a41d59cc7a9d"
+checksum = "798f704d128510932661a3489b08e3f4c934a01d61c5def59ae7b8e48f19665a"
 dependencies = [
  "curve25519-dalek",
  "ed25519",
- "sha2 0.9.9",
- "zeroize",
+ "rand_core",
+ "sha2",
 ]
 
 [[package]]
@@ -297,12 +273,12 @@
 dependencies = [
  "base16ct",
  "crypto-bigint",
- "digest 0.10.6",
+ "digest",
  "ff",
  "generic-array",
  "group",
  "hkdf",
- "rand_core 0.6.4",
+ "rand_core",
  "sec1",
  "subtle",
  "zeroize",
@@ -314,11 +290,17 @@
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449"
 dependencies = [
- "rand_core 0.6.4",
+ "rand_core",
  "subtle",
 ]
 
 [[package]]
+name = "fiat-crypto"
+version = "0.1.20"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e825f6987101665dea6ec934c09ec6d721de7bc1bf92248e1d5810c8cd636b77"
+
+[[package]]
 name = "generic-array"
 version = "0.14.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -347,7 +329,7 @@
 checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63"
 dependencies = [
  "ff",
- "rand_core 0.6.4",
+ "rand_core",
  "subtle",
 ]
 
@@ -366,7 +348,7 @@
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e"
 dependencies = [
- "digest 0.10.6",
+ "digest",
 ]
 
 [[package]]
@@ -402,9 +384,11 @@
 dependencies = [
  "arbitrary",
  "crypto_provider_rustcrypto",
+ "ldt",
  "ldt_np_adv",
  "libfuzzer-sys",
  "np_hkdf",
+ "xts_aes",
 ]
 
 [[package]]
@@ -444,6 +428,12 @@
 ]
 
 [[package]]
+name = "libm"
+version = "0.1.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7fc7aa29613bd6a620df431842069224d8bc9011086b1db4c0e0cd47fa03ec9a"
+
+[[package]]
 name = "np_hkdf"
 version = "0.1.0"
 dependencies = [
@@ -475,6 +465,22 @@
 ]
 
 [[package]]
+name = "packed_simd_2"
+version = "0.3.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a1914cd452d8fccd6f9db48147b29fd4ae05bea9dc5d9ad578509f72415de282"
+dependencies = [
+ "cfg-if",
+ "libm",
+]
+
+[[package]]
+name = "platforms"
+version = "3.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e3d7ddaed09e0eb771a79ab0fd64609ba0afb0a8366421957936ad14cbd13630"
+
+[[package]]
 name = "polyval"
 version = "0.6.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -525,7 +531,7 @@
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404"
 dependencies = [
- "rand_core 0.6.4",
+ "rand_core",
 ]
 
 [[package]]
@@ -535,17 +541,11 @@
 checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88"
 dependencies = [
  "ppv-lite86",
- "rand_core 0.6.4",
+ "rand_core",
 ]
 
 [[package]]
 name = "rand_core"
-version = "0.5.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19"
-
-[[package]]
-name = "rand_core"
 version = "0.6.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c"
@@ -554,14 +554,6 @@
 ]
 
 [[package]]
-name = "rand_core_05_adapter"
-version = "0.1.0"
-dependencies = [
- "rand",
- "rand_core 0.5.1",
-]
-
-[[package]]
 name = "sec1"
 version = "0.7.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -576,33 +568,20 @@
 
 [[package]]
 name = "sha2"
-version = "0.9.9"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800"
-dependencies = [
- "block-buffer 0.9.0",
- "cfg-if",
- "cpufeatures",
- "digest 0.9.0",
- "opaque-debug",
-]
-
-[[package]]
-name = "sha2"
 version = "0.10.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "82e6b795fe2e3b1e845bafcb27aa35405c4d47cdfc92af5fc8d3002f76cebdc0"
 dependencies = [
  "cfg-if",
  "cpufeatures",
- "digest 0.10.6",
+ "digest",
 ]
 
 [[package]]
 name = "signature"
-version = "1.6.4"
+version = "2.1.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "74233d3b3b2f6d4b006dc19dee745e73e2a6bfb6f93607cd3b02bd5b00797d7c"
+checksum = "5e1788eed21689f9cf370582dfc467ef36ed9c707f073528ddafa8d83e3b8500"
 
 [[package]]
 name = "subtle"
@@ -622,18 +601,6 @@
 ]
 
 [[package]]
-name = "synstructure"
-version = "0.12.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f36bdaa60a83aca3921b5259d5400cbf5e90fc51931376a9bd4a0eb79aa7210f"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn",
- "unicode-xid",
-]
-
-[[package]]
 name = "typenum"
 version = "1.16.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -646,12 +613,6 @@
 checksum = "e5464a87b239f13a63a501f2701565754bae92d243d4bb7eb12f6d57d2269bf4"
 
 [[package]]
-name = "unicode-xid"
-version = "0.2.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c"
-
-[[package]]
 name = "universal-hash"
 version = "0.5.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -675,13 +636,12 @@
 
 [[package]]
 name = "x25519-dalek"
-version = "2.0.0-pre.1"
+version = "2.0.0-rc.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e5da623d8af10a62342bcbbb230e33e58a63255a58012f8653c578e54bab48df"
+checksum = "fabd6e16dd08033932fc3265ad4510cc2eab24656058a6dcb107ffe274abcc95"
 dependencies = [
  "curve25519-dalek",
- "rand_core 0.6.4",
- "zeroize",
+ "rand_core",
 ]
 
 [[package]]
@@ -698,18 +658,3 @@
 version = "1.5.7"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "c394b5bd0c6f669e7275d9c20aa90ae064cb22e75a1cad54e1b34088034b149f"
-dependencies = [
- "zeroize_derive",
-]
-
-[[package]]
-name = "zeroize_derive"
-version = "1.3.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "44bf07cb3e50ea2003396695d58bf46bc9887a1f362260446fad6bc4e79bd36c"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn",
- "synstructure",
-]
diff --git a/nearby/presence/ldt_np_adv/fuzz/Cargo.toml b/nearby/presence/ldt_np_adv/fuzz/Cargo.toml
index f74cee6..a346c6b 100644
--- a/nearby/presence/ldt_np_adv/fuzz/Cargo.toml
+++ b/nearby/presence/ldt_np_adv/fuzz/Cargo.toml
@@ -18,6 +18,10 @@
 
 [dependencies.np_hkdf]
 path = "../../np_hkdf"
+[dependencies.xts_aes]
+path = "../../xts_aes"
+[dependencies.ldt]
+path = "../../ldt"
 
 # Prevent this from interfering with workspaces
 [workspace]
diff --git a/nearby/presence/ldt_np_adv/fuzz/fuzz_targets/ldt_np_decrypt.rs b/nearby/presence/ldt_np_adv/fuzz/fuzz_targets/ldt_np_decrypt.rs
index b8edc18..2039219 100644
--- a/nearby/presence/ldt_np_adv/fuzz/fuzz_targets/ldt_np_decrypt.rs
+++ b/nearby/presence/ldt_np_adv/fuzz/fuzz_targets/ldt_np_decrypt.rs
@@ -21,8 +21,8 @@
     // try to decrypt data that won't pass validation
     let salt = data.salt.into();
     let padder = salt_padder::<16, RustCrypto>(salt);
-    let cipher_config = LdtAdvCipherConfig::new(data.key_seed, data.metadata_key_hmac);
-    let cipher = cipher_config.build_adv_decrypter_xts_aes_128::<RustCrypto>();
+    let hkdf = np_hkdf::NpKeySeedHkdf::<RustCrypto>::new(&data.key_seed);
+    let cipher = build_np_adv_decrypter_from_key_seed::<RustCrypto>(&hkdf, data.metadata_key_hmac);
 
     let len = 16 + (data.len as usize % 16);
     let ciphertext = data.ciphertext;
diff --git a/nearby/presence/ldt_np_adv/fuzz/fuzz_targets/ldt_np_roundtrip.rs b/nearby/presence/ldt_np_adv/fuzz/fuzz_targets/ldt_np_roundtrip.rs
index e2b3713..69f82c3 100644
--- a/nearby/presence/ldt_np_adv/fuzz/fuzz_targets/ldt_np_roundtrip.rs
+++ b/nearby/presence/ldt_np_adv/fuzz/fuzz_targets/ldt_np_roundtrip.rs
@@ -14,26 +14,27 @@
 // limitations under the License.
 
 use crypto_provider_rustcrypto::RustCrypto;
+use ldt::*;
 use ldt_np_adv::*;
 use libfuzzer_sys::fuzz_target;
+use xts_aes::XtsAes128;
 
 fuzz_target!(|data: LdtNpRoundtripFuzzInput| {
     let salt = data.salt.into();
     let padder = salt_padder::<16, RustCrypto>(salt);
 
     let hkdf = np_hkdf::NpKeySeedHkdf::<RustCrypto>::new(&data.key_seed);
-    let ldt = ldt_xts_aes_128::<RustCrypto>(&hkdf.legacy_ldt_key());
+    let ldt_enc = LdtEncryptCipher::<16, XtsAes128<RustCrypto>, Swap>::new(&hkdf.legacy_ldt_key());
     let metadata_key_hmac: [u8; 32] = hkdf
         .legacy_metadata_key_hmac_key()
         .calculate_hmac(&data.plaintext[..14]);
 
-    let cipher_config = LdtAdvCipherConfig::new(data.key_seed, metadata_key_hmac);
-    let cipher = cipher_config.build_adv_decrypter_xts_aes_128::<RustCrypto>();
+    let cipher = build_np_adv_decrypter_from_key_seed::<RustCrypto>(&hkdf, metadata_key_hmac);
 
     let len = 16 + (data.len as usize % 16);
     let mut ciphertext = data.plaintext;
 
-    ldt.encrypt(&mut ciphertext[..len], &padder).unwrap();
+    ldt_enc.encrypt(&mut ciphertext[..len], &padder).unwrap();
     let plaintext = cipher
         .decrypt_and_verify(&ciphertext[..len], &padder)
         .unwrap();
diff --git a/nearby/presence/ldt_np_adv/src/lib.rs b/nearby/presence/ldt_np_adv/src/lib.rs
index 7ab88fb..6e23573 100644
--- a/nearby/presence/ldt_np_adv/src/lib.rs
+++ b/nearby/presence/ldt_np_adv/src/lib.rs
@@ -30,12 +30,13 @@
 
 use array_view::ArrayView;
 use core::fmt;
+use crypto_provider::aes::BLOCK_SIZE;
 use crypto_provider::hmac::Hmac;
 use crypto_provider::CryptoProvider;
-use ldt::{Ldt, LdtError, LdtKey, Mix, Padder, Swap, XorPadder};
+use ldt::{LdtDecryptCipher, LdtEncryptCipher, LdtError, Mix, Padder, Swap, XorPadder};
 use ldt_tbc::TweakableBlockCipher;
-use np_hkdf::legacy_ldt_expanded_salt;
-use xts_aes::{XtsAes128, XtsAes128Key, XtsAes256, XtsAes256Key};
+use np_hkdf::{legacy_ldt_expanded_salt, NpHmacSha256Key, NpKeySeedHkdf};
+use xts_aes::XtsAes128;
 
 /// Max LDT-XTS-AES data size: `(2 * AES block size) - 1`
 pub const LDT_XTS_AES_MAX_LEN: usize = 31;
@@ -62,65 +63,63 @@
     }
 }
 
-/// Config for one individual cipher, corresponding to a particular NP identity/credential
-pub struct LdtAdvCipherConfig {
-    /// The key seed in the NP credential from which other keys will be derived
-    key_seed: [u8; 32],
-    /// The metadata key HMAC in the NP credential
-    metadata_key_hmac: [u8; 32],
+/// [LdtEncryptCipher] parameterized for XTS-AES-128 with the [Swap] mix function.
+pub type LdtEncrypterXtsAes128<C> = LdtEncryptCipher<{ BLOCK_SIZE }, XtsAes128<C>, Swap>;
+
+/// A Nearby Presence specific LDT decrypter which verifies the hmac tag of the given payload
+/// parameterized for XTS-AES-128 with the [Swap] mix function.
+pub type LdtNpAdvDecrypterXtsAes128<C> =
+    LdtNpAdvDecrypter<{ BLOCK_SIZE }, LDT_XTS_AES_MAX_LEN, XtsAes128<C>, Swap, C>;
+
+/// Build a Nearby Presence specific LDT XTS-AES-128 decrypter from a provided [NpKeySeedHkdf] and
+/// metadata_key_hmac, with the [Swap] mix function
+pub fn build_np_adv_decrypter_from_key_seed<C: CryptoProvider>(
+    key_seed: &NpKeySeedHkdf<C>,
+    metadata_key_tag: [u8; 32],
+) -> LdtNpAdvDecrypterXtsAes128<C> {
+    build_np_adv_decrypter(
+        &key_seed.legacy_ldt_key(),
+        metadata_key_tag,
+        key_seed.legacy_metadata_key_hmac_key(),
+    )
 }
 
-impl LdtAdvCipherConfig {
-    /// Build a config from the provided key seed and metadata key hmac.
-    pub fn new(key_seed: [u8; 32], metadata_key_mac: [u8; 32]) -> Self {
-        Self {
-            key_seed,
-            metadata_key_hmac: metadata_key_mac,
-        }
-    }
-
-    /// Build an LdtAdvCipher using XTS-AES128 and keys derived from the key seed.
-    pub fn build_adv_decrypter_xts_aes_128<C: CryptoProvider>(&self) -> LdtAdvDecrypterAes128<C> {
-        let hkdf = np_hkdf::NpKeySeedHkdf::new(&self.key_seed);
-
-        LdtAdvDecrypter {
-            ldt: ldt_xts_aes_128::<C>(&hkdf.legacy_ldt_key()),
-            metadata_key_hmac: self.metadata_key_hmac,
-            metadata_key_hmac_key: hkdf.legacy_metadata_key_hmac_key(),
-        }
+/// Build a Nearby Presence specific LDT XTS-AES-128 decrypter from precalculated cipher components,
+/// with the [Swap] mix function
+pub fn build_np_adv_decrypter<C: CryptoProvider>(
+    ldt_key: &ldt::LdtKey<xts_aes::XtsAes128Key>,
+    metadata_key_tag: [u8; 32],
+    metadata_key_hmac_key: NpHmacSha256Key<C>,
+) -> LdtNpAdvDecrypterXtsAes128<C> {
+    LdtNpAdvDecrypter {
+        ldt_decrypter: LdtXtsAes128Decrypter::<C>::new(ldt_key),
+        metadata_key_tag,
+        metadata_key_hmac_key,
     }
 }
 
+// [LdtDecryptCipher] parameterized for XTS-AES-128 with the [Swap] mix function.
+type LdtXtsAes128Decrypter<C> = LdtDecryptCipher<{ BLOCK_SIZE }, XtsAes128<C>, Swap>;
+
 /// Decrypts and validates a NP legacy format advertisement encrypted with LDT.
 ///
-/// Use an [LdtAdvCipherConfig] to build one from an NP `key_seed`.
-///
 /// `B` is the underlying block cipher block size.
 /// `O` is the max output size (must be 2 * B - 1).
 /// `T` is the tweakable block cipher used by LDT.
 /// `M` is the mix function used by LDT.
-pub struct LdtAdvDecrypter<
+pub struct LdtNpAdvDecrypter<
     const B: usize,
     const O: usize,
     T: TweakableBlockCipher<B>,
     M: Mix,
     C: CryptoProvider,
 > {
-    ldt: Ldt<B, T, M>,
-    metadata_key_hmac: [u8; 32],
+    ldt_decrypter: LdtDecryptCipher<B, T, M>,
+    metadata_key_tag: [u8; 32],
     metadata_key_hmac_key: np_hkdf::NpHmacSha256Key<C>,
 }
 
-/// An LdtAdvCipher with block size set appropriately for AES.
-pub type LdtAdvDecrypterAes128<C> = LdtAdvDecrypter<
-    { crypto_provider::aes::BLOCK_SIZE },
-    LDT_XTS_AES_MAX_LEN,
-    xts_aes::XtsAes128<C>,
-    Swap,
-    C,
->;
-
-impl<const B: usize, const O: usize, T, M, C> LdtAdvDecrypter<B, O, T, M, C>
+impl<const B: usize, const O: usize, T, M, C> LdtNpAdvDecrypter<B, O, T, M, C>
 where
     T: TweakableBlockCipher<B>,
     M: Mix,
@@ -150,7 +149,7 @@
         buffer[..payload.len()].copy_from_slice(payload);
 
         #[allow(clippy::expect_used)]
-        self.ldt
+        self.ldt_decrypter
             .decrypt(&mut buffer[..payload.len()], padder)
             .map_err(|e| match e {
                 LdtError::InvalidLength(l) => LdtAdvDecryptError::InvalidLength(l),
@@ -158,7 +157,7 @@
             .and_then(|_| {
                 let mut hmac = self.metadata_key_hmac_key.build_hmac();
                 hmac.update(&buffer[..NP_LEGACY_METADATA_KEY_LEN]);
-                hmac.verify_slice(&self.metadata_key_hmac)
+                hmac.verify_slice(&self.metadata_key_tag)
                     .map_err(|_| LdtAdvDecryptError::MacMismatch)
                     .map(|_| {
                         ArrayView::try_from_array(buffer, payload.len())
@@ -166,39 +165,9 @@
                     })
             })
     }
-
-    /// Encrypt the payload in place using the provided padder.
-    ///
-    /// No validation is done to ensure that the metadata key is correct.
-    ///
-    /// # Errors
-    /// - If `payload` has a length outside of `[B, B * 2)`.
-    // Leaving it in place, but deprecating it, to avoid breaking ldt_np_adv_ffi which will be
-    // replaced by a much more expansive FFI API soon.
-    #[deprecated]
-    pub fn encrypt<P: Padder<B, T>>(&self, payload: &mut [u8], padder: &P) -> Result<(), LdtError> {
-        assert_eq!(B * 2 - 1, O); // should be compiled away
-
-        self.ldt.encrypt(payload, padder)
-    }
-
-    /// Construct a cipher from its component parts.
-    ///
-    /// See also [LdtAdvCipherConfig] to build a cipher from an NP key seed.
-    pub fn new(
-        ldt: Ldt<B, T, M>,
-        metadata_key_hmac: [u8; 32],
-        metadata_key_hmac_key: np_hkdf::NpHmacSha256Key<C>,
-    ) -> Self {
-        Self {
-            ldt,
-            metadata_key_hmac,
-            metadata_key_hmac_key,
-        }
-    }
 }
 
-/// Errors that can occur during [LdtAdvCipher.decrypt_and_verify].
+/// Errors that can occur during [LdtNpAdvDecrypter::decrypt_and_verify].
 #[derive(Debug, PartialEq, Eq)]
 pub enum LdtAdvDecryptError {
     /// The ciphertext data was an invalid length.
@@ -223,19 +192,3 @@
     // If that's ever not true, yet another generic parameter will address that.
     XorPadder::from(legacy_ldt_expanded_salt::<B, C>(&salt.bytes))
 }
-
-/// [Ldt] parameterized for XTS-AES-128 with the [Swap] mix function.
-pub type LdtXtsAes128<C> = Ldt<{ crypto_provider::aes::BLOCK_SIZE }, XtsAes128<C>, Swap>;
-
-/// Build an [Ldt] with [xts_aes::Xts]-AES-128 and the [Swap] mix function.
-pub fn ldt_xts_aes_128<C: CryptoProvider>(key: &LdtKey<XtsAes128Key>) -> LdtXtsAes128<C> {
-    Ldt::new(key)
-}
-
-/// [Ldt] parameterized for XTS-AES-256 with the [Swap] mix function.
-pub type LdtXtsAes256<C> = Ldt<{ crypto_provider::aes::BLOCK_SIZE }, XtsAes256<C>, Swap>;
-
-/// Build an [Ldt] with [xts_aes::Xts]-AES-256 and the [Swap] mix function.
-pub fn ldt_xts_aes_256<C: CryptoProvider>(key: &LdtKey<XtsAes256Key>) -> LdtXtsAes256<C> {
-    Ldt::new(key)
-}
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 14a96d6..46c9968 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
@@ -21,7 +21,8 @@
 extern crate std;
 
 use crate::{
-    ldt_xts_aes_128, salt_padder, LdtAdvCipherConfig, LegacySalt, NP_LEGACY_METADATA_KEY_LEN,
+    build_np_adv_decrypter_from_key_seed, salt_padder, LdtEncrypterXtsAes128, LegacySalt,
+    NP_LEGACY_METADATA_KEY_LEN,
 };
 use anyhow::anyhow;
 use crypto_provider_rustcrypto::RustCrypto;
@@ -59,16 +60,18 @@
         let salt = LegacySalt::from(extract_key_array(&tc, "adv_salt"));
         let padder = salt_padder::<16, RustCrypto>(salt);
 
-        let ldt = ldt_xts_aes_128::<RustCrypto>(&ldt_key);
+        let ldt_enc = LdtEncrypterXtsAes128::<RustCrypto>::new(&ldt_key);
 
-        let config = LdtAdvCipherConfig::new(key_seed, extract_key_array(&tc, "metadata_key_hmac"));
-        let decrypter = config.build_adv_decrypter_xts_aes_128::<RustCrypto>();
+        let decrypter = build_np_adv_decrypter_from_key_seed(
+            &hkdf,
+            extract_key_array(&tc, "metadata_key_hmac"),
+        );
 
         let plaintext = extract_key_vec(&tc, "plaintext");
         let ciphertext = extract_key_vec(&tc, "ciphertext");
 
         let mut ciphertext_actual = plaintext.clone();
-        ldt.encrypt(&mut ciphertext_actual, &padder).unwrap();
+        ldt_enc.encrypt(&mut ciphertext_actual, &padder).unwrap();
 
         assert_eq!(ciphertext, ciphertext_actual);
 
@@ -98,11 +101,11 @@
         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 = ldt_xts_aes_128::<RustCrypto>(&ldt_key);
+        let ldt_enc = LdtEncrypterXtsAes128::<RustCrypto>::new(&ldt_key);
 
         let padder = salt_padder::<16, RustCrypto>(LegacySalt::from(rng.gen::<[u8; 2]>()));
         let mut ciphertext = plaintext.clone();
-        ldt.encrypt(&mut ciphertext[..], &padder).unwrap();
+        ldt_enc.encrypt(&mut ciphertext[..], &padder).unwrap();
 
         array.push(json!({
             "key_seed": hex::encode_upper(key_seed),
diff --git a/nearby/presence/ldt_np_adv/src/tests.rs b/nearby/presence/ldt_np_adv/src/tests.rs
index d1be881..5f09e33 100644
--- a/nearby/presence/ldt_np_adv/src/tests.rs
+++ b/nearby/presence/ldt_np_adv/src/tests.rs
@@ -21,13 +21,15 @@
 extern crate alloc;
 
 use crate::{
-    ldt_xts_aes_128, salt_padder, LdtAdvDecryptError, LdtAdvDecrypterAes128, LdtXtsAes128,
-    LegacySalt, LDT_XTS_AES_MAX_LEN, NP_LEGACY_METADATA_KEY_LEN,
+    build_np_adv_decrypter_from_key_seed, salt_padder, LdtAdvDecryptError, LdtEncrypterXtsAes128,
+    LdtNpAdvDecrypterXtsAes128, LdtXtsAes128Decrypter, LegacySalt, LDT_XTS_AES_MAX_LEN,
+    NP_LEGACY_METADATA_KEY_LEN,
 };
 use alloc::vec::Vec;
 use crypto_provider::CryptoProvider;
 use crypto_provider_rustcrypto::RustCrypto;
 use ldt::{DefaultPadder, LdtError, LdtKey, XorPadder};
+use np_hkdf::NpKeySeedHkdf;
 use rand_ext::{random_vec, seeded_rng};
 
 #[test]
@@ -36,11 +38,7 @@
     for _ in 0..1_000 {
         let test_state = make_test_components::<_, RustCrypto>(&mut rng);
 
-        let cipher = LdtAdvDecrypterAes128 {
-            ldt: test_state.ldt,
-            metadata_key_hmac: test_state.hmac,
-            metadata_key_hmac_key: test_state.hmac_key,
-        };
+        let cipher = build_np_adv_decrypter_from_key_seed(&test_state.hkdf, test_state.hmac);
         let decrypted = cipher
             .decrypt_and_verify(&test_state.ciphertext, &test_state.padder)
             .unwrap();
@@ -58,11 +56,7 @@
         // mangle the ciphertext
         test_state.ciphertext[0] ^= 0xAA;
 
-        let cipher = LdtAdvDecrypterAes128 {
-            ldt: test_state.ldt,
-            metadata_key_hmac: test_state.hmac,
-            metadata_key_hmac_key: test_state.hmac_key,
-        };
+        let cipher = build_np_adv_decrypter_from_key_seed(&test_state.hkdf, test_state.hmac);
         assert_eq!(
             Err(LdtAdvDecryptError::MacMismatch),
             cipher.decrypt_and_verify(&test_state.ciphertext, &test_state.padder)
@@ -79,12 +73,7 @@
         // mangle the mac
         test_state.hmac[0] ^= 0xAA;
 
-        let cipher = LdtAdvDecrypterAes128 {
-            ldt: test_state.ldt,
-            metadata_key_hmac: test_state.hmac,
-            metadata_key_hmac_key: test_state.hmac_key,
-        };
-
+        let cipher = build_np_adv_decrypter_from_key_seed(&test_state.hkdf, test_state.hmac);
         assert_eq!(
             Err(LdtAdvDecryptError::MacMismatch),
             cipher.decrypt_and_verify(&test_state.ciphertext, &test_state.padder)
@@ -99,11 +88,7 @@
     for _ in 0..1_000 {
         let test_state = make_test_components::<_, RustCrypto>(&mut rng);
 
-        let cipher = LdtAdvDecrypterAes128 {
-            ldt: test_state.ldt,
-            metadata_key_hmac: test_state.hmac,
-            metadata_key_hmac_key: test_state.hmac_key,
-        };
+        let cipher = test_state.ldt_enc;
 
         let mut plaintext_copy = test_state.plaintext.clone();
         cipher
@@ -117,43 +102,34 @@
 #[test]
 #[allow(deprecated)]
 fn encrypt_too_short_err() {
-    let ldt = ldt_xts_aes_128::<RustCrypto>(&LdtKey::from_concatenated(&[0; 64]));
-    let adv_cipher = LdtAdvDecrypterAes128 {
-        ldt,
-        metadata_key_hmac: [0; 32],
-        metadata_key_hmac_key: np_hkdf::NpHmacSha256Key::<RustCrypto>::from([0; 32]),
-    };
+    let ldt_enc = LdtEncrypterXtsAes128::<RustCrypto>::new(&LdtKey::from_concatenated(&[0; 64]));
 
     let mut payload = [0; 7];
     assert_eq!(
         Err(LdtError::InvalidLength(7)),
-        adv_cipher.encrypt(&mut payload, &DefaultPadder::default())
+        ldt_enc.encrypt(&mut payload, &DefaultPadder::default())
     );
 }
 
 #[test]
 #[allow(deprecated)]
 fn encrypt_too_long_err() {
-    let ldt = ldt_xts_aes_128::<RustCrypto>(&LdtKey::from_concatenated(&[0; 64]));
-    let adv_cipher = LdtAdvDecrypterAes128 {
-        ldt,
-        metadata_key_hmac: [0; 32],
-        metadata_key_hmac_key: np_hkdf::NpHmacSha256Key::<RustCrypto>::from([0; 32]),
-    };
+    let ldt_enc = LdtEncrypterXtsAes128::<RustCrypto>::new(&LdtKey::from_concatenated(&[0; 64]));
 
     let mut payload = [0; 40];
     assert_eq!(
         Err(LdtError::InvalidLength(40)),
-        adv_cipher.encrypt(&mut payload, &DefaultPadder::default())
+        ldt_enc.encrypt(&mut payload, &DefaultPadder::default())
     );
 }
 
 #[test]
 fn decrypt_too_short_err() {
-    let ldt = ldt_xts_aes_128::<RustCrypto>(&LdtKey::from_concatenated(&[0; 64]));
-    let adv_cipher = LdtAdvDecrypterAes128 {
-        ldt,
-        metadata_key_hmac: [0; 32],
+    let adv_cipher = LdtNpAdvDecrypterXtsAes128 {
+        ldt_decrypter: LdtXtsAes128Decrypter::<RustCrypto>::new(&LdtKey::from_concatenated(
+            &[0; 64],
+        )),
+        metadata_key_tag: [0; 32],
         metadata_key_hmac_key: np_hkdf::NpHmacSha256Key::<RustCrypto>::from([0; 32]),
     };
 
@@ -166,10 +142,11 @@
 
 #[test]
 fn decrypt_too_long_err() {
-    let ldt = ldt_xts_aes_128::<RustCrypto>(&LdtKey::from_concatenated(&[0; 64]));
-    let adv_cipher = LdtAdvDecrypterAes128 {
-        ldt,
-        metadata_key_hmac: [0; 32],
+    let adv_cipher = LdtNpAdvDecrypterXtsAes128 {
+        ldt_decrypter: LdtXtsAes128Decrypter::<RustCrypto>::new(&LdtKey::from_concatenated(
+            &[0; 64],
+        )),
+        metadata_key_tag: [0; 32],
         metadata_key_hmac_key: np_hkdf::NpHmacSha256Key::<RustCrypto>::from([0; 32]),
     };
 
@@ -198,20 +175,21 @@
     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 = ldt_xts_aes_128::<C>(&ldt_key);
+    let ldt_enc = LdtEncrypterXtsAes128::<C>::new(&ldt_key);
 
     let mut ciphertext = [0_u8; LDT_XTS_AES_MAX_LEN];
     ciphertext[..plaintext.len()].copy_from_slice(&plaintext);
-    ldt.encrypt(&mut ciphertext[..plaintext.len()], &padder)
+    ldt_enc
+        .encrypt(&mut ciphertext[..plaintext.len()], &padder)
         .unwrap();
 
     LdtAdvTestComponents {
         plaintext,
         ciphertext: ciphertext[..payload_len].to_vec(),
         padder,
-        hmac_key,
         hmac,
-        ldt,
+        ldt_enc,
+        hkdf,
     }
 }
 
@@ -219,7 +197,7 @@
     plaintext: Vec<u8>,
     ciphertext: Vec<u8>,
     padder: XorPadder<{ crypto_provider::aes::BLOCK_SIZE }>,
-    hmac_key: np_hkdf::NpHmacSha256Key<C>,
     hmac: [u8; 32],
-    ldt: LdtXtsAes128<C>,
+    ldt_enc: LdtEncrypterXtsAes128<C>,
+    hkdf: NpKeySeedHkdf<C>,
 }
diff --git a/nearby/presence/ldt_np_adv_ffi/Cargo.lock b/nearby/presence/ldt_np_adv_ffi/Cargo.lock
index 3c91225..5deadcc 100644
--- a/nearby/presence/ldt_np_adv_ffi/Cargo.lock
+++ b/nearby/presence/ldt_np_adv_ffi/Cargo.lock
@@ -10,9 +10,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",
@@ -67,9 +67,15 @@
 
 [[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 = "base64ct"
+version = "1.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b"
 
 [[package]]
 name = "bitflags"
@@ -79,15 +85,6 @@
 
 [[package]]
 name = "block-buffer"
-version = "0.9.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4"
-dependencies = [
- "generic-array",
-]
-
-[[package]]
-name = "block-buffer"
 version = "0.10.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71"
@@ -97,18 +94,23 @@
 
 [[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 = "byteorder"
-version = "1.4.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610"
+name = "bssl-crypto"
+version = "0.1.0"
+dependencies = [
+ "bssl-sys",
+]
+
+[[package]]
+name = "bssl-sys"
+version = "0.1.0"
 
 [[package]]
 name = "bytes"
@@ -164,12 +166,12 @@
 
 [[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",
+ "rand_core",
  "subtle",
  "zeroize",
 ]
@@ -181,7 +183,7 @@
 checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3"
 dependencies = [
  "generic-array",
- "rand_core 0.6.4",
+ "rand_core",
  "typenum",
 ]
 
@@ -193,6 +195,15 @@
 ]
 
 [[package]]
+name = "crypto_provider_boringssl"
+version = "0.1.0"
+dependencies = [
+ "bssl-crypto",
+ "crypto_provider",
+ "crypto_provider_stubs",
+]
+
+[[package]]
 name = "crypto_provider_openssl"
 version = "0.1.0"
 dependencies = [
@@ -217,17 +228,23 @@
  "hkdf",
  "hmac",
  "p256",
- "rand 0.8.5",
- "rand_chacha 0.3.1",
- "rand_core 0.6.4",
- "rand_core_05_adapter",
+ "rand",
+ "rand_chacha",
+ "rand_core",
  "sec1",
- "sha2 0.10.6",
+ "sha2",
  "subtle",
  "x25519-dalek",
 ]
 
 [[package]]
+name = "crypto_provider_stubs"
+version = "0.1.0"
+dependencies = [
+ "crypto_provider",
+]
+
+[[package]]
 name = "ctr"
 version = "0.9.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -238,33 +255,27 @@
 
 [[package]]
 name = "curve25519-dalek"
-version = "3.2.0"
+version = "4.0.0-rc.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0b9fdf9972b2bd6af2d913799d9ebc165ea4d2e65878e329d9c6b372c4491b61"
+checksum = "03d928d978dbec61a1167414f5ec534f24bea0d7a0d24dd9b6233d3d8223e585"
 dependencies = [
- "byteorder",
- "digest 0.9.0",
- "rand_core 0.5.1",
+ "cfg-if",
+ "digest",
+ "fiat-crypto",
+ "packed_simd_2",
+ "platforms",
  "subtle",
  "zeroize",
 ]
 
 [[package]]
 name = "der"
-version = "0.6.1"
+version = "0.7.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f1a467a65c5e759bce6e65eaf91cc29f466cdc57cb65777bd646872a8a1fd4de"
+checksum = "bc906908ea6458456e5eaa160a9c08543ec3d1e6f71e2235cedd660cb65f9df0"
 dependencies = [
  "const-oid",
-]
-
-[[package]]
-name = "digest"
-version = "0.9.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066"
-dependencies = [
- "generic-array",
+ "zeroize",
 ]
 
 [[package]]
@@ -273,49 +284,49 @@
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "8168378f4e5023e7218c89c891c0fd8ecdb5e5e4f18cb78f38cf245dd021e76f"
 dependencies = [
- "block-buffer 0.10.4",
+ "block-buffer",
  "crypto-common",
  "subtle",
 ]
 
 [[package]]
 name = "ed25519"
-version = "1.5.3"
+version = "2.2.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "91cff35c70bba8a626e3185d8cd48cc11b5437e1a5bcd15b9b5fa3c64b6dfee7"
+checksum = "5fb04eee5d9d907f29e80ee6b0e78f7e2c82342c63e3580d8c4f69d9d5aad963"
 dependencies = [
+ "pkcs8",
  "signature",
 ]
 
 [[package]]
 name = "ed25519-dalek"
-version = "1.0.1"
+version = "2.0.0-rc.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c762bae6dcaf24c4c84667b8579785430908723d5c889f469d76a41d59cc7a9d"
+checksum = "798f704d128510932661a3489b08e3f4c934a01d61c5def59ae7b8e48f19665a"
 dependencies = [
  "curve25519-dalek",
  "ed25519",
- "rand 0.7.3",
+ "rand_core",
  "serde",
- "sha2 0.9.9",
+ "sha2",
  "zeroize",
 ]
 
 [[package]]
 name = "elliptic-curve"
-version = "0.12.3"
+version = "0.13.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e7bb888ab5300a19b8e5bceef25ac745ad065f3c9f7efc6de1b91958110891d3"
+checksum = "6ea5a92946e8614bb585254898bb7dd1ddad241ace60c52149e3765e34cc039d"
 dependencies = [
  "base16ct",
  "crypto-bigint",
- "der",
- "digest 0.10.6",
+ "digest",
  "ff",
  "generic-array",
  "group",
  "hkdf",
- "rand_core 0.6.4",
+ "rand_core",
  "sec1",
  "subtle",
  "zeroize",
@@ -323,15 +334,21 @@
 
 [[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",
+ "rand_core",
  "subtle",
 ]
 
 [[package]]
+name = "fiat-crypto"
+version = "0.1.20"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e825f6987101665dea6ec934c09ec6d721de7bc1bf92248e1d5810c8cd636b77"
+
+[[package]]
 name = "foreign-types"
 version = "0.3.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -348,23 +365,13 @@
 
 [[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",
-]
-
-[[package]]
-name = "getrandom"
-version = "0.1.16"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce"
-dependencies = [
- "cfg-if",
- "libc",
- "wasi 0.9.0+wasi-snapshot-preview1",
+ "zeroize",
 ]
 
 [[package]]
@@ -375,17 +382,17 @@
 dependencies = [
  "cfg-if",
  "libc",
- "wasi 0.11.0+wasi-snapshot-preview1",
+ "wasi",
 ]
 
 [[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",
+ "rand_core",
  "subtle",
 ]
 
@@ -404,7 +411,7 @@
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e"
 dependencies = [
- "digest 0.10.6",
+ "digest",
 ]
 
 [[package]]
@@ -431,7 +438,7 @@
 version = "0.1.0"
 dependencies = [
  "ldt_tbc",
- "rand 0.8.5",
+ "rand",
 ]
 
 [[package]]
@@ -452,29 +459,31 @@
 dependencies = [
  "cfg-if",
  "crypto_provider",
+ "crypto_provider_boringssl",
  "crypto_provider_openssl",
  "crypto_provider_rustcrypto",
  "lazy_static",
  "ldt",
  "ldt_np_adv",
  "libc_alloc",
+ "np_hkdf",
  "panic-abort",
- "rand 0.8.5",
- "spin 0.9.7",
+ "rand",
+ "spin 0.9.8",
 ]
 
 [[package]]
 name = "ldt_tbc"
 version = "0.1.0"
 dependencies = [
- "rand 0.8.5",
+ "rand",
 ]
 
 [[package]]
 name = "libc"
-version = "0.2.140"
+version = "0.2.141"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "99227334921fae1a979cf0bfdfcc6b3e5ce376ef57e16fb6fb3ea2ed6095f80c"
+checksum = "3304a64d199bb964be99741b7a14d26972741915b3649639149b2479bb46f4b5"
 
 [[package]]
 name = "libc_alloc"
@@ -483,6 +492,12 @@
 checksum = "6a090348b66d90d8507e30f0d2bd88e5a5c454bd1733fc6d617cbc3471bf69ea"
 
 [[package]]
+name = "libm"
+version = "0.1.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7fc7aa29613bd6a620df431842069224d8bc9011086b1db4c0e0cd47fa03ec9a"
+
+[[package]]
 name = "lock_api"
 version = "0.4.9"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -515,9 +530,9 @@
 
 [[package]]
 name = "openssl"
-version = "0.10.48"
+version = "0.10.49"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "518915b97df115dd36109bfa429a48b8f737bd05508cf9588977b599648926d2"
+checksum = "4d2f106ab837a24e03672c59b1239669a0596406ff657c3c0835b6b7f0f35a33"
 dependencies = [
  "bitflags",
  "cfg-if",
@@ -530,22 +545,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.13",
 ]
 
 [[package]]
 name = "openssl-sys"
-version = "0.9.83"
+version = "0.9.84"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "666416d899cf077260dac8698d60a60b435a46d57e82acb1be3d0dad87284e5b"
+checksum = "3a20eace9dc2d82904039cb76dcf50fb1a0bba071cfd1629720b5d6f1ddba0fa"
 dependencies = [
- "autocfg",
  "cc",
  "libc",
  "pkg-config",
@@ -577,27 +591,53 @@
 
 [[package]]
 name = "p256"
-version = "0.12.0"
+version = "0.13.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "49c124b3cbce43bcbac68c58ec181d98ed6cc7e6d0aa7c3ba97b2563410b0e55"
+checksum = "7270da3e5caa82afd3deb054cc237905853813aea3859544bc082c3fe55b8d47"
 dependencies = [
  "elliptic-curve",
  "primeorder",
 ]
 
 [[package]]
+name = "packed_simd_2"
+version = "0.3.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a1914cd452d8fccd6f9db48147b29fd4ae05bea9dc5d9ad578509f72415de282"
+dependencies = [
+ "cfg-if",
+ "libm",
+]
+
+[[package]]
 name = "panic-abort"
 version = "0.3.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "4e20e6499bbbc412f280b04a42346b356c6fa0753d5fd22b7bd752ff34c778ee"
 
 [[package]]
+name = "pkcs8"
+version = "0.10.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3d2820d87d2b008616e5c27212dd9e0e694fb4c6b522de06094106813328cb49"
+dependencies = [
+ "der",
+ "spki",
+]
+
+[[package]]
 name = "pkg-config"
 version = "0.3.26"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "6ac9a59f73473f1b8d852421e59e64809f025994837ef743615c6d0c5b305160"
 
 [[package]]
+name = "platforms"
+version = "3.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e3d7ddaed09e0eb771a79ab0fd64609ba0afb0a8366421957936ad14cbd13630"
+
+[[package]]
 name = "polyval"
 version = "0.6.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -617,9 +657,9 @@
 
 [[package]]
 name = "primeorder"
-version = "0.12.1"
+version = "0.13.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0b54f7131b3dba65a2f414cf5bd25b66d4682e4608610668eae785750ba4c5b2"
+checksum = "7613fdcc0831c10060fa69833ea8fa2caa94b6456f51e25356a885b530a2e3d0"
 dependencies = [
  "elliptic-curve",
 ]
@@ -650,9 +690,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",
 ]
@@ -668,36 +708,13 @@
 
 [[package]]
 name = "rand"
-version = "0.7.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03"
-dependencies = [
- "getrandom 0.1.16",
- "libc",
- "rand_chacha 0.2.2",
- "rand_core 0.5.1",
- "rand_hc",
-]
-
-[[package]]
-name = "rand"
 version = "0.8.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404"
 dependencies = [
  "libc",
- "rand_chacha 0.3.1",
- "rand_core 0.6.4",
-]
-
-[[package]]
-name = "rand_chacha"
-version = "0.2.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402"
-dependencies = [
- "ppv-lite86",
- "rand_core 0.5.1",
+ "rand_chacha",
+ "rand_core",
 ]
 
 [[package]]
@@ -707,16 +724,7 @@
 checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88"
 dependencies = [
  "ppv-lite86",
- "rand_core 0.6.4",
-]
-
-[[package]]
-name = "rand_core"
-version = "0.5.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19"
-dependencies = [
- "getrandom 0.1.16",
+ "rand_core",
 ]
 
 [[package]]
@@ -725,24 +733,7 @@
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c"
 dependencies = [
- "getrandom 0.2.8",
-]
-
-[[package]]
-name = "rand_core_05_adapter"
-version = "0.1.0"
-dependencies = [
- "rand 0.8.5",
- "rand_core 0.5.1",
-]
-
-[[package]]
-name = "rand_hc"
-version = "0.2.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c"
-dependencies = [
- "rand_core 0.5.1",
+ "getrandom",
 ]
 
 [[package]]
@@ -753,9 +744,9 @@
 
 [[package]]
 name = "sec1"
-version = "0.3.0"
+version = "0.7.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3be24c1842290c45df0a7bf069e0c268a747ad05a192f2fd7dcfdbc1cba40928"
+checksum = "48518a2b5775ba8ca5b46596aae011caa431e6ce7e4a67ead66d92f08884220e"
 dependencies = [
  "base16ct",
  "der",
@@ -766,22 +757,9 @@
 
 [[package]]
 name = "serde"
-version = "1.0.158"
+version = "1.0.159"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "771d4d9c4163ee138805e12c710dd365e4f44be8be0503cb1bb9eb989425d9c9"
-
-[[package]]
-name = "sha2"
-version = "0.9.9"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800"
-dependencies = [
- "block-buffer 0.9.0",
- "cfg-if",
- "cpufeatures",
- "digest 0.9.0",
- "opaque-debug",
-]
+checksum = "3c04e8343c3daeec41f58990b9d77068df31209f2af111e059e9fe9646693065"
 
 [[package]]
 name = "sha2"
@@ -791,14 +769,14 @@
 dependencies = [
  "cfg-if",
  "cpufeatures",
- "digest 0.10.6",
+ "digest",
 ]
 
 [[package]]
 name = "signature"
-version = "1.6.4"
+version = "2.1.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "74233d3b3b2f6d4b006dc19dee745e73e2a6bfb6f93607cd3b02bd5b00797d7c"
+checksum = "5e1788eed21689f9cf370582dfc467ef36ed9c707f073528ddafa8d83e3b8500"
 
 [[package]]
 name = "spin"
@@ -808,14 +786,24 @@
 
 [[package]]
 name = "spin"
-version = "0.9.7"
+version = "0.9.8"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c0959fd6f767df20b231736396e4f602171e00d95205676286e79d4a4eb67bef"
+checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67"
 dependencies = [
  "lock_api",
 ]
 
 [[package]]
+name = "spki"
+version = "0.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c0445c905640145c7ea8c1993555957f65e7c46d0535b91ba501bc9bfc85522f"
+dependencies = [
+ "base64ct",
+ "der",
+]
+
+[[package]]
 name = "subtle"
 version = "2.4.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -834,9 +822,9 @@
 
 [[package]]
 name = "syn"
-version = "2.0.10"
+version = "2.0.13"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5aad1363ed6d37b84299588d62d3a7d95b5a5c2d9aad5c85609fda12afaa1f40"
+checksum = "4c9da457c5285ac1f936ebd076af6dac17a61cfe7826f2076b4d015cf47bc8ec"
 dependencies = [
  "proc-macro2",
  "quote",
@@ -879,25 +867,18 @@
 
 [[package]]
 name = "wasi"
-version = "0.9.0+wasi-snapshot-preview1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519"
-
-[[package]]
-name = "wasi"
 version = "0.11.0+wasi-snapshot-preview1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423"
 
 [[package]]
 name = "x25519-dalek"
-version = "2.0.0-pre.1"
+version = "2.0.0-rc.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e5da623d8af10a62342bcbbb230e33e58a63255a58012f8653c578e54bab48df"
+checksum = "fabd6e16dd08033932fc3265ad4510cc2eab24656058a6dcb107ffe274abcc95"
 dependencies = [
  "curve25519-dalek",
- "rand_core 0.6.4",
- "zeroize",
+ "rand_core",
 ]
 
 [[package]]
@@ -914,17 +895,3 @@
 version = "1.6.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "2a0956f1ba7c7909bfb66c2e9e4124ab6f6482560f6628b5aaeba39207c9aad9"
-dependencies = [
- "zeroize_derive",
-]
-
-[[package]]
-name = "zeroize_derive"
-version = "1.4.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "25588073e5216b50bca71d61cb8595cdb9745e87032a58c199730def2862c934"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn 2.0.10",
-]
diff --git a/nearby/presence/ldt_np_adv_ffi/Cargo.toml b/nearby/presence/ldt_np_adv_ffi/Cargo.toml
index 5a3fada..d53809f 100644
--- a/nearby/presence/ldt_np_adv_ffi/Cargo.toml
+++ b/nearby/presence/ldt_np_adv_ffi/Cargo.toml
@@ -8,8 +8,10 @@
 crypto_provider = { path = "../../crypto/crypto_provider" }
 crypto_provider_openssl = {path = "../../crypto/crypto_provider_openssl", optional = true}
 crypto_provider_rustcrypto = {path = "../../crypto/crypto_provider_rustcrypto", optional = true}
+crypto_provider_boringssl = {path = "../../crypto/crypto_provider_boringssl", optional = true}
 ldt = { path = "../ldt" }
 ldt_np_adv = { path = "../ldt_np_adv" }
+np_hkdf = {path = "../np_hkdf"}
 
 cfg-if = "1.0.0"
 lazy_static = { version = "1.4.0"}
@@ -17,19 +19,21 @@
 # no_std only deps
 libc_alloc = {version = "1.0.4", optional = true }
 panic-abort = { version = "0.3.2", optional = true }
-spin = {version = "0.9.4", optional = true }
+spin = {version = "0.9.8", optional = true }
 
 [dev-dependencies]
 rand = "0.8.5"
 
 [lib]
-crate-type = ["cdylib", "staticlib"]
+# boringssl and bssl-sys are built as a static lib, so we need to as well
+crate-type = ["staticlib"]
 
 [features]
 # by default we support no_std and use rustcrypto primitives
 default = ["lazy_static/spin_no_std", "spin", "libc_alloc", "panic-abort", "crypto_provider_rustcrypto"]
 std = ["crypto_provider_rustcrypto", "crypto_provider_rustcrypto/std"]
-openssl = ["crypto_provider_openssl", "std"]
+openssl = ["crypto_provider_openssl"]
+boringssl = ["crypto_provider_boringssl"]
 
 [profile.release-min-size]
 inherits = "release"
diff --git a/nearby/presence/ldt_np_adv_ffi/deny.toml b/nearby/presence/ldt_np_adv_ffi/deny.toml
index 5bc6eaf..07381d1 100644
--- a/nearby/presence/ldt_np_adv_ffi/deny.toml
+++ b/nearby/presence/ldt_np_adv_ffi/deny.toml
@@ -79,8 +79,6 @@
     "MIT",
     "Apache-2.0",
     "BSD-3-Clause",
-    "Unicode-DFS-2016",
-    "Unlicense"
 ]
 # List of explicitly disallowed licenses
 # See https://spdx.org/licenses/ for list of possible licenses
diff --git a/nearby/presence/ldt_np_adv_ffi/include/np_ldt.h b/nearby/presence/ldt_np_adv_ffi/include/np_ldt.h
index 02bbe7d..13af781 100644
--- a/nearby/presence/ldt_np_adv_ffi/include/np_ldt.h
+++ b/nearby/presence/ldt_np_adv_ffi/include/np_ldt.h
@@ -19,9 +19,6 @@
 //
 // [1] https://eprint.iacr.org/2017/841.pdf
 
-// TODO pluggable memory allocation for embedded
-
-// TODO include guard name based on final file location
 #ifndef NP_LDT_H_
 #define NP_LDT_H_
 
@@ -35,23 +32,34 @@
 // Individual encrypt/decrypt API, useful when creating advertisements or when
 // decrypting advertisements from a known origin
 
-// Handle for accessing the rust ldt implementation apis
-typedef uint64_t NpLdtHandle;
-
 // Key material from the Nearby Presence credential from which keys will be
 // derived.
 typedef struct {
   uint8_t bytes[32];
 } NpLdtKeySeed;
 
+// The calculated hmac key used for verifying successful decryption of
+// credential metadata
 typedef struct{
   uint8_t bytes[32];
 } NpMetadataKeyHmac;
 
+// The big-endian  2 byte salt which will be incorporated into the tweaks LDT
+// uses while encrypting.
 typedef struct {
   uint8_t bytes[2];
 } NpLdtSalt;
 
+// The allocated handle to use for encryption
+typedef struct {
+  uint64_t handle;
+} NpLdtEncryptHandle;
+
+// The allocated handle to use for decryption
+typedef struct {
+  uint64_t handle;
+} NpLdtDecryptHandle;
+
 // Possible result codes returned from the LDT NP APIs
 typedef enum {
   // Call to api was successful
@@ -64,20 +72,33 @@
   NP_LDT_INVALID_HANDLE = -3
 } NP_LDT_RESULT;
 
-// Allocate an LDT-XTS-AES128 cipher using the "swap" mix function.
+// Allocate an LDT-XTS-AES128 Decryption cipher using the "swap" mix function.
 //
-// `aes_config` defines the AES impl that will be used.
+// `key_seed` is the key material from the Nearby Presence credential from which
+// the LDT key will be derived.
+// 'hmac_tag' is the hmac auth tag calculated on the metadata key used to verify
+// decryption was successful
+//
+// Returns 0 on error, or a non-zero handle on success.
+NpLdtDecryptHandle NpLdtDecryptCreate(NpLdtKeySeed key_seed, NpMetadataKeyHmac hmac_tag);
+
+// Allocate an LDT-XTS-AES128 Encryption cipher using the "swap" mix function.
+//
 // `key_seed` is the key material from the Nearby Presence credential from which
 // the LDT key will be derived.
 //
 // Returns 0 on error, or a non-zero handle on success.
-NpLdtHandle NpLdtCreate(NpLdtKeySeed key_seed, NpMetadataKeyHmac known_hmac);
+NpLdtEncryptHandle NpLdtEncryptCreate(NpLdtKeySeed key_seed);
 
-// Release resources for an NpLdtHandle allocated by
-// `np_ldt_create_xts_aes_128`.
+// Release allocated resources for an NpLdtEncryptHandle
 //
 // Returns 0 on success or an NP_LDT_RESULT error code on failure
-NP_LDT_RESULT NpLdtClose(NpLdtHandle handle);
+NP_LDT_RESULT NpLdtEncryptClose(NpLdtEncryptHandle handle);
+
+// Release allocated resources for an NpLdtDecryptHandle
+//
+// Returns 0 on success or an NP_LDT_RESULT error code on failure
+NP_LDT_RESULT NpLdtDecryptClose(NpLdtDecryptHandle handle);
 
 // Encrypt a 16-31 byte buffer in-place.
 //
@@ -88,7 +109,7 @@
 //
 // Returns 0 on success, in which case `buffer` will now contain ciphertext.
 // Returns an NP_LDT_RESULT error code on failure
-NP_LDT_RESULT NpLdtEncrypt(NpLdtHandle handle, uint8_t* buffer, size_t buffer_len,
+NP_LDT_RESULT NpLdtEncrypt(NpLdtEncryptHandle handle, uint8_t* buffer, size_t buffer_len,
                      NpLdtSalt salt);
 
 // Decrypt a 16-31 byte buffer in-place and verify the plaintext metadata key matches
@@ -102,9 +123,9 @@
 //
 // Returns 0 on success, in which case `buffer` will now contain plaintext.
 // Returns an NP_LDT_RESULT error code on failure
-/// - If the buffer has an invalid length
-/// - If the decrypted plaintext fails its HMAC validation
-NP_LDT_RESULT NpLdtDecryptAndVerify(NpLdtHandle handle, uint8_t* buffer, size_t buffer_len,
+// - If the buffer has an invalid length
+// - If the decrypted plaintext fails its HMAC validation
+NP_LDT_RESULT NpLdtDecryptAndVerify(NpLdtDecryptHandle handle, uint8_t* buffer, size_t buffer_len,
                      NpLdtSalt salt);
 
 #ifdef __cplusplus
diff --git a/nearby/presence/ldt_np_adv_ffi/src/handle_map.rs b/nearby/presence/ldt_np_adv_ffi/src/handle_map.rs
index 0b3dfda..9d83c19 100644
--- a/nearby/presence/ldt_np_adv_ffi/src/handle_map.rs
+++ b/nearby/presence/ldt_np_adv_ffi/src/handle_map.rs
@@ -14,6 +14,7 @@
 
 use crate::Box;
 use crate::LdtAdvDecrypter;
+use crate::LdtAdvEncrypter;
 use core::marker::PhantomData;
 use crypto_provider::{CryptoProvider, CryptoRng};
 use lazy_static::lazy_static;
@@ -21,7 +22,7 @@
 // Pull in the needed deps for std vs no_std
 cfg_if::cfg_if! {
     // Test pulls in std which causes duplicate errors
-    if #[cfg(any(feature = "std", test))] {
+    if #[cfg(any(feature = "std", test, feature = "boringssl", feature = "openssl"))] {
         use std::sync::{Mutex, MutexGuard};
         use std::collections::HashMap;
 
@@ -42,10 +43,19 @@
         }
 
         // returns a thread safe instance of the global static hashmap tracking the cipher handles
-        pub (crate) fn get_handle_map() -> MutexGuard<'static, HandleMap<Box<LdtAdvDecrypter>>> {
+        pub (crate) fn get_enc_handle_map() -> MutexGuard<'static, HandleMap<Box<LdtAdvEncrypter>>> {
             // Note even in the case of an error, the lock is still acquired, it just means whichever
             // thread was holding it panicked, we will continue on as either way we acquired the lock
-            HANDLE_MAP
+            ENCRYPT_HANDLE_MAP
+                .lock()
+                .unwrap_or_else(|err_guard| err_guard.into_inner())
+        }
+
+        // returns a thread safe instance of the global static hashmap tracking the cipher handles
+        pub (crate) fn get_dec_handle_map() -> MutexGuard<'static, HandleMap<Box<LdtAdvDecrypter>>> {
+            // Note even in the case of an error, the lock is still acquired, it just means whichever
+            // thread was holding it panicked, we will continue on as either way we acquired the lock
+            DECRYPT_HANDLE_MAP
                 .lock()
                 .unwrap_or_else(|err_guard| err_guard.into_inner())
         }
@@ -69,8 +79,13 @@
         }
 
         // returns a thread safe instance of the global static hashmap tracking the cipher handles
-        pub (crate) fn get_handle_map() -> MutexGuard<'static, HandleMap<Box<LdtAdvDecrypter>>> {
-            HANDLE_MAP.lock()
+        pub (crate) fn get_enc_handle_map() -> MutexGuard<'static, HandleMap<Box<LdtAdvEncrypter>>> {
+            ENCRYPT_HANDLE_MAP.lock()
+        }
+
+        // returns a thread safe instance of the global static hashmap tracking the cipher handles
+        pub (crate) fn get_dec_handle_map() -> MutexGuard<'static, HandleMap<Box<LdtAdvDecrypter>>> {
+            DECRYPT_HANDLE_MAP.lock()
         }
     }
 }
@@ -78,7 +93,10 @@
 // Global hashmap to track valid pointers, this is a safety precaution to make sure we are not
 // reading from unsafe memory address's passed in by caller.
 lazy_static! {
-    static ref HANDLE_MAP: Mutex<HandleMap<Box<LdtAdvDecrypter>>> = Mutex::new(HandleMap::init());
+    static ref ENCRYPT_HANDLE_MAP: Mutex<HandleMap<Box<LdtAdvEncrypter>>> =
+        Mutex::new(HandleMap::init());
+    static ref DECRYPT_HANDLE_MAP: Mutex<HandleMap<Box<LdtAdvDecrypter>>> =
+        Mutex::new(HandleMap::init());
 }
 
 impl<T> HandleMap<T> {
diff --git a/nearby/presence/ldt_np_adv_ffi/src/lib.rs b/nearby/presence/ldt_np_adv_ffi/src/lib.rs
index ddf7f3f..7b440e4 100644
--- a/nearby/presence/ldt_np_adv_ffi/src/lib.rs
+++ b/nearby/presence/ldt_np_adv_ffi/src/lib.rs
@@ -30,17 +30,20 @@
 
 extern crate alloc;
 
+use crate::handle_map::get_dec_handle_map;
 use alloc::boxed::Box;
 use core::slice;
-use handle_map::get_handle_map;
+use handle_map::get_enc_handle_map;
 use ldt_np_adv::{
-    salt_padder, LdtAdvCipherConfig, LdtAdvDecryptError, LdtAdvDecrypterAes128, LegacySalt,
+    build_np_adv_decrypter_from_key_seed, salt_padder, LdtAdvDecryptError, LdtEncrypterXtsAes128,
+    LdtNpAdvDecrypterXtsAes128, LegacySalt,
 };
+use np_hkdf::NpKeySeedHkdf;
 
 // Pull in the needed deps for std vs no_std
 cfg_if::cfg_if! {
     // Test pulls in std which causes duplicate errors
-    if #[cfg(any(feature = "std", test))] {
+    if #[cfg(any(feature = "std", test, feature = "boringssl", feature = "openssl"))] {
         extern crate std;
     } else {
         // Allow using Box in no_std
@@ -48,20 +51,27 @@
     }
 }
 
-// Fail early for invalid combination of feature flags, we need at least on crypto library specified
-#[cfg(all(not(feature = "openssl"), not(feature = "crypto_provider_rustcrypto")))]
-compile_error!("Either the \"openssl\" or \"default\" features flag needs to be set uin order to specify cryptographic library");
+// Fail early for invalid combination of feature flags, we need at least one crypto library specified
+#[cfg(all(
+    not(feature = "openssl"),
+    not(feature = "crypto_provider_rustcrypto"),
+    not(feature = "boringssl")
+))]
+compile_error!("Either the \"openssl\", \"boringssl\"or \"default\" features flag needs to be set in order to specify cryptographic library");
 
 // Need to have one of the crypto provider impls
 cfg_if::cfg_if! {
     if #[cfg(feature = "openssl")] {
         use crypto_provider_openssl::Openssl as CryptoProviderImpl;
+    } else if #[cfg(feature = "boringssl")]{
+        use crypto_provider_boringssl::Boringssl as CryptoProviderImpl;
     } else {
         use crypto_provider_rustcrypto::RustCrypto as CryptoProviderImpl;
     }
 }
 
-pub(crate) type LdtAdvDecrypter = LdtAdvDecrypterAes128<CryptoProviderImpl>;
+pub(crate) type LdtAdvDecrypter = LdtNpAdvDecrypterXtsAes128<CryptoProviderImpl>;
+pub(crate) type LdtAdvEncrypter = LdtEncrypterXtsAes128<CryptoProviderImpl>;
 
 const SUCCESS: i32 = 0;
 
@@ -80,18 +90,53 @@
     bytes: [u8; 2],
 }
 
-#[no_mangle]
-extern "C" fn NpLdtCreate(key_seed: NpLdtKeySeed, metadata_key_hmac: NpMetadataKeyHmac) -> u64 {
-    let ldt_adv_cipher_config = LdtAdvCipherConfig::new(key_seed.bytes, metadata_key_hmac.bytes);
-    let cipher = ldt_adv_cipher_config.build_adv_decrypter_xts_aes_128::<CryptoProviderImpl>();
-    get_handle_map().insert::<CryptoProviderImpl>(Box::new(cipher))
+#[repr(C)]
+struct NpLdtEncryptHandle {
+    handle: u64,
+}
+
+#[repr(C)]
+struct NpLdtDecryptHandle {
+    handle: u64,
 }
 
 #[no_mangle]
-extern "C" fn NpLdtClose(handle: u64) -> i32 {
+extern "C" fn NpLdtDecryptCreate(
+    key_seed: NpLdtKeySeed,
+    metadata_key_hmac: NpMetadataKeyHmac,
+) -> NpLdtDecryptHandle {
+    let cipher = build_np_adv_decrypter_from_key_seed(
+        &NpKeySeedHkdf::new(&key_seed.bytes),
+        metadata_key_hmac.bytes,
+    );
+    let handle = get_dec_handle_map().insert::<CryptoProviderImpl>(Box::new(cipher));
+    NpLdtDecryptHandle { handle }
+}
+
+#[no_mangle]
+extern "C" fn NpLdtEncryptCreate(key_seed: NpLdtKeySeed) -> NpLdtEncryptHandle {
+    let cipher = LdtAdvEncrypter::new(
+        &NpKeySeedHkdf::<CryptoProviderImpl>::new(&key_seed.bytes).legacy_ldt_key(),
+    );
+    let handle = get_enc_handle_map().insert::<CryptoProviderImpl>(Box::new(cipher));
+    NpLdtEncryptHandle { handle }
+}
+
+#[no_mangle]
+extern "C" fn NpLdtEncryptClose(handle: NpLdtEncryptHandle) -> i32 {
     map_to_error_code(|| {
-        get_handle_map()
-            .remove(&handle)
+        get_enc_handle_map()
+            .remove(&handle.handle)
+            .ok_or(CloseCipherError::InvalidHandle)
+            .map(|_| 0)
+    })
+}
+
+#[no_mangle]
+extern "C" fn NpLdtDecryptClose(handle: NpLdtDecryptHandle) -> i32 {
+    map_to_error_code(|| {
+        get_dec_handle_map()
+            .remove(&handle.handle)
             .ok_or(CloseCipherError::InvalidHandle)
             .map(|_| 0)
     })
@@ -102,7 +147,7 @@
 // and get rid of this.
 #[allow(deprecated)]
 extern "C" fn NpLdtEncrypt(
-    handle: u64,
+    handle: NpLdtEncryptHandle,
     buffer: *mut u8,
     buffer_len: usize,
     salt: NpLdtSalt,
@@ -110,8 +155,8 @@
     map_to_error_code(|| {
         let data = unsafe { slice::from_raw_parts_mut(buffer, buffer_len) };
         let padder = salt_padder::<16, CryptoProviderImpl>(LegacySalt::from(salt.bytes));
-        get_handle_map()
-            .get(&handle)
+        get_enc_handle_map()
+            .get(&handle.handle)
             .map(|cipher| {
                 cipher
                     .encrypt(data, &padder)
@@ -126,7 +171,7 @@
 
 #[no_mangle]
 extern "C" fn NpLdtDecryptAndVerify(
-    handle: u64,
+    handle: NpLdtDecryptHandle,
     buffer: *mut u8,
     buffer_len: usize,
     salt: NpLdtSalt,
@@ -135,8 +180,8 @@
         let data = unsafe { slice::from_raw_parts_mut(buffer, buffer_len) };
         let padder = salt_padder::<16, CryptoProviderImpl>(LegacySalt::from(salt.bytes));
 
-        get_handle_map()
-            .get(&handle)
+        get_dec_handle_map()
+            .get(&handle.handle)
             .map(|cipher| {
                 cipher
                     .decrypt_and_verify(data, &padder)
diff --git a/nearby/presence/ldt_np_adv_ffi_fuzz/src/fuzzer_decrypt_bad_mac.c b/nearby/presence/ldt_np_adv_ffi_fuzz/src/fuzzer_decrypt_bad_mac.c
index 3e8e6ac..18abb0f 100644
--- a/nearby/presence/ldt_np_adv_ffi_fuzz/src/fuzzer_decrypt_bad_mac.c
+++ b/nearby/presence/ldt_np_adv_ffi_fuzz/src/fuzzer_decrypt_bad_mac.c
@@ -53,23 +53,30 @@
   memcpy(&metadata_key_hmac.bytes, data + 32 + 2 + 31 + 1, 32);
 
   // create a cipher
-  NpLdtHandle handle = NpLdtCreate(key_seed, metadata_key_hmac);
-  if (handle == 0) {
-    printf("Error: create LDT\n");
+  NpLdtEncryptHandle enc_handle = NpLdtEncryptCreate(key_seed);
+  if (enc_handle.handle == 0) {
+    printf("Error: create LDT failed\n");
     __builtin_trap();
     return 0;
   }
 
   // encrypt with it
-  NP_LDT_RESULT result = NpLdtEncrypt(handle, payload, payload_len, salt);
+  NP_LDT_RESULT result = NpLdtEncrypt(enc_handle, payload, payload_len, salt);
   if (result != 0) {
     printf("Error: encrypt\n");
     __builtin_trap();
     return 0;
   }
 
+  NpLdtDecryptHandle dec_handle = NpLdtDecryptCreate(key_seed, metadata_key_hmac);
+  if (dec_handle.handle == 0) {
+    printf("Error: create LDT failed\n");
+    __builtin_trap();
+    return 0;
+  }
+
   // decrypt & verify -- we expect mac mismatch since we're using a random mac
-  result = NpLdtDecryptAndVerify(handle, payload, payload_len, salt);
+  result = NpLdtDecryptAndVerify(dec_handle, payload, payload_len, salt);
   if (result != -2) {
     printf("Error: decryption didn't fail with the expected MAC mismatch\n");
     __builtin_trap();
@@ -77,12 +84,19 @@
   }
 
   // deallocate the cipher
-  result = NpLdtClose(handle);
+  result = NpLdtEncryptClose(enc_handle);
   if (result) {
     printf("Error: close cipher\n");
     __builtin_trap();
     return result;
   }
 
+  result = NpLdtDecryptClose(dec_handle);
+  if (result) {
+    printf("Error: close cipher failed\n");
+    __builtin_trap();
+    return result;
+  }
+
   return 0;  // Values other than 0 and -1 are reserved for future use.
 }
diff --git a/nearby/presence/ldt_np_adv_ffi_fuzz/src/fuzzer_decrypt_correct_mac.c b/nearby/presence/ldt_np_adv_ffi_fuzz/src/fuzzer_decrypt_correct_mac.c
index 7d16894..e99a7e8 100644
--- a/nearby/presence/ldt_np_adv_ffi_fuzz/src/fuzzer_decrypt_correct_mac.c
+++ b/nearby/presence/ldt_np_adv_ffi_fuzz/src/fuzzer_decrypt_correct_mac.c
@@ -96,31 +96,45 @@
        metadata_key_hmac.bytes, &md_len);
 
   // create a cipher
-  NpLdtHandle handle = NpLdtCreate(key_seed, metadata_key_hmac);
-  if (handle == 0) {
+  NpLdtEncryptHandle enc_handle = NpLdtEncryptCreate(key_seed);
+  if (enc_handle.handle == 0) {
     printf("Error: create LDT failed\n");
     __builtin_trap();
     return 0;
   }
 
   // encrypt with it
-  NP_LDT_RESULT result = NpLdtEncrypt(handle, payload, payload_len, salt);
+  NP_LDT_RESULT result = NpLdtEncrypt(enc_handle, payload, payload_len, salt);
   if (result != 0) {
     printf("Error: encrypt\n");
     __builtin_trap();
     return 0;
   }
 
+  NpLdtDecryptHandle dec_handle = NpLdtDecryptCreate(key_seed, metadata_key_hmac);
+  if (dec_handle.handle == 0) {
+    printf("Error: create LDT failed\n");
+    __builtin_trap();
+    return 0;
+  }
+
   // decrypt & verify -- we expect mac mismatch since we're using a random mac
-  result = NpLdtDecryptAndVerify(handle, payload, payload_len, salt);
+  result = NpLdtDecryptAndVerify(dec_handle, payload, payload_len, salt);
   if (result != 0) {
     printf("Error: decryption failed\n");
     __builtin_trap();
     return 0;
   }
 
-  // deallocate the cipher
-  result = NpLdtClose(handle);
+  // deallocate the ciphers
+  result = NpLdtEncryptClose(enc_handle);
+  if (result) {
+    printf("Error: close cipher failed\n");
+    __builtin_trap();
+    return result;
+  }
+
+  result = NpLdtDecryptClose(dec_handle);
   if (result) {
     printf("Error: close cipher failed\n");
     __builtin_trap();
diff --git a/nearby/presence/ldt_np_c_sample/CMakeLists.txt b/nearby/presence/ldt_np_c_sample/CMakeLists.txt
index b4d149a..58b6f6f 100644
--- a/nearby/presence/ldt_np_c_sample/CMakeLists.txt
+++ b/nearby/presence/ldt_np_c_sample/CMakeLists.txt
@@ -24,7 +24,7 @@
     ldt_np_adv_ffi
     DOWNLOAD_COMMAND ""
     CONFIGURE_COMMAND ""
-    BUILD_COMMAND cargo build COMMAND cargo build --release
+    BUILD_COMMAND cargo build COMMAND cargo build --release --no-default-features --features std
     BINARY_DIR "${CMAKE_SOURCE_DIR}/ldt_np_adv_ffi"
     INSTALL_COMMAND "")
 
diff --git a/nearby/presence/ldt_np_c_sample/main.c b/nearby/presence/ldt_np_c_sample/main.c
index 4bfbb79..1ae9244 100644
--- a/nearby/presence/ldt_np_c_sample/main.c
+++ b/nearby/presence/ldt_np_c_sample/main.c
@@ -41,11 +41,10 @@
         {12, 15}
     };
 
-    // Create handle
-    NpLdtHandle handle = NpLdtCreate(*key_seed, *known_hmac);
-    if (handle == 0)
+    // Create handle for encryption
+    NpLdtEncryptHandle enc_handle = NpLdtEncryptCreate(*key_seed);
+    if (enc_handle.handle == 0)
     {
-        printf("Invalid alignment\n");
         return -1;
     }
 
@@ -57,7 +56,7 @@
     printf("\n");
 
     // Encrypt the data and print it
-    NP_LDT_RESULT result = NpLdtEncrypt(handle, plaintext, 24, salt);
+    NP_LDT_RESULT result = NpLdtEncrypt(enc_handle, plaintext, 24, salt);
     if (result)
     {
         printf("Error in NpLdtEncrypt: %d\n", result);
@@ -69,8 +68,15 @@
         printf("%X ", *(plaintext + i));
     printf("\n");
 
+    // Create handle for encryption
+    NpLdtDecryptHandle dec_handle = NpLdtDecryptCreate(*key_seed, *known_hmac);
+    if (enc_handle.handle == 0)
+    {
+        return -1;
+    }
+
     // Decrypt the data and print its bytes
-    result = NpLdtDecryptAndVerify(handle, plaintext, 24, salt);
+    result = NpLdtDecryptAndVerify(dec_handle, plaintext, 24, salt);
     if (result)
     {
         printf("Error in NpDecryptAndVerify: %d\n", result);
@@ -83,7 +89,15 @@
     printf("\n");
 
     // Call NpLdtClose to free resources
-    result = NpLdtClose(handle);
+    result = NpLdtEncryptClose(enc_handle);
+    if (result)
+    {
+        printf("Error in NpLdtClose: %d\n", result);
+        return result;
+    }
+
+    // Call NpLdtClose to free resources
+    result = NpLdtDecryptClose(dec_handle);
     if (result)
     {
         printf("Error in NpLdtClose: %d\n", result);
diff --git a/nearby/presence/ldt_np_c_sample/tests/benchmarks.cc b/nearby/presence/ldt_np_c_sample/tests/benchmarks.cc
index d84c304..fbd20a8 100644
--- a/nearby/presence/ldt_np_c_sample/tests/benchmarks.cc
+++ b/nearby/presence/ldt_np_c_sample/tests/benchmarks.cc
@@ -37,7 +37,7 @@
     size_t payload_len;
     uint8_t* payload;
     NpLdtSalt* salt;
-    vector<NpLdtHandle> handles;
+    vector<tuple<NpLdtEncryptHandle, NpLdtDecryptHandle>> handles;
     vector<tuple<NpLdtKeySeed*, NpMetadataKeyHmac*>> configs;
 
     void SetUp(const ::benchmark::State& state)
@@ -63,23 +63,20 @@
     {
         for(int i = 0; i < num_ciphers; i++)
         {
-            NpLdtHandle handle = buildCipherFromRand();
-            handles.push_back(handle);
+            NpLdtKeySeed* key_seed = (NpLdtKeySeed*) malloc(sizeof(NpLdtKeySeed));
+            NpMetadataKeyHmac* known_hmac = (NpMetadataKeyHmac*) malloc(sizeof(NpMetadataKeyHmac));
+
+            generateRandomBytes(key_seed->bytes, 32);
+            generateRandomBytes(known_hmac->bytes, 32);
+
+            configs.push_back(tuple<NpLdtKeySeed*, NpMetadataKeyHmac*>(key_seed, known_hmac));
+            auto enc_handle = NpLdtEncryptCreate(*key_seed);
+            auto dec_handle = NpLdtDecryptCreate(*key_seed, *known_hmac);
+
+            handles.push_back(tuple<NpLdtEncryptHandle, NpLdtDecryptHandle>(enc_handle, dec_handle));
         }
     }
 
-    NpLdtHandle buildCipherFromRand()
-    {
-        NpLdtKeySeed* key_seed = (NpLdtKeySeed*) malloc(sizeof(NpLdtKeySeed));
-        NpMetadataKeyHmac* known_hmac = (NpMetadataKeyHmac*) malloc(sizeof(NpMetadataKeyHmac));
-
-        generateRandomBytes(key_seed->bytes, 32);
-        generateRandomBytes(known_hmac->bytes, 32);
-
-        configs.push_back(tuple<NpLdtKeySeed*, NpMetadataKeyHmac*>(key_seed, known_hmac));
-        return NpLdtCreate(*key_seed, *known_hmac);
-    }
-
     void generatePayload()
     {
         payload_len = randNumInRange(BLOCK_SIZE, LDT_PAYLOAD_MAX_LEN);
@@ -100,9 +97,13 @@
 
     void freeCiphers()
     {
-        for(NpLdtHandle handle : handles)
+        for(tuple<NpLdtEncryptHandle, NpLdtDecryptHandle> handle : handles)
         {
-            NpLdtClose(handle);
+            auto enc_handle = std::get<0>(handle);
+            NpLdtEncryptClose(enc_handle);
+
+            auto dec_handle = std::get<1>(handle);
+            NpLdtDecryptClose(dec_handle);
         }
     }
 
@@ -120,9 +121,10 @@
 {
     for (auto _ : state)
     {
-        for(NpLdtHandle handle : handles)
+        for(tuple<NpLdtEncryptHandle, NpLdtDecryptHandle> handle : handles)
         {
-            NpLdtDecryptAndVerify(handle, payload, payload_len, *salt);
+            auto dec_handle = std::get<1>(handle);
+            NpLdtDecryptAndVerify(dec_handle, payload, payload_len, *salt);
         }
     }
 };
@@ -135,7 +137,7 @@
     {
         for(tuple<NpLdtKeySeed*, NpMetadataKeyHmac*> values : configs)
         {
-            NpLdtHandle handle = NpLdtCreate(*std::get<0>(values), *std::get<1>(values));
+            NpLdtDecryptHandle handle = NpLdtDecryptCreate(*std::get<0>(values), *std::get<1>(values));
             NpLdtDecryptAndVerify(handle, payload, payload_len, *salt);
         }
     }
diff --git a/nearby/presence/ldt_np_c_sample/tests/np_ffi_tests.cc b/nearby/presence/ldt_np_c_sample/tests/np_ffi_tests.cc
index 3e20338..fbb0db4 100644
--- a/nearby/presence/ldt_np_c_sample/tests/np_ffi_tests.cc
+++ b/nearby/presence/ldt_np_c_sample/tests/np_ffi_tests.cc
@@ -40,7 +40,15 @@
     {12, 15}
 };
 
-static NpLdtHandle create_handle_from_test_key ()
+static NpLdtEncryptHandle create_enc_handle_from_test_key ()
+{
+    NpLdtKeySeed key_seed;
+    memcpy(key_seed.bytes, KEY_SEED_BYTES, 32);
+
+    return NpLdtEncryptCreate(key_seed);
+}
+
+static NpLdtDecryptHandle create_dec_handle_from_test_key ()
 {
     NpLdtKeySeed key_seed;
     memcpy(key_seed.bytes, KEY_SEED_BYTES, 32);
@@ -48,7 +56,7 @@
     NpMetadataKeyHmac known_hmac;
     memcpy(known_hmac.bytes, KNOWN_HMAC_BYTES, 32);
 
-    return NpLdtCreate(key_seed, known_hmac);
+    return NpLdtDecryptCreate(key_seed, known_hmac);
 }
 
 static void hex_string_to_bytes(const char * hexString, uint8_t * out, size_t len)
@@ -105,8 +113,8 @@
         hex_string_to_bytes(metadata_key_hmac, known_hmac.bytes, len);
         ASSERT_EQ(len, 32);
 
-        NpLdtHandle handle = NpLdtCreate(np_key_seed, known_hmac);
-        ASSERT_NE(handle, 0);
+        NpLdtEncryptHandle enc_handle = NpLdtEncryptCreate(np_key_seed);
+        ASSERT_NE(enc_handle.handle, 0);
 
         NpLdtSalt salt;
         len = strlen(adv_salt)/2;
@@ -116,14 +124,17 @@
         len = strlen(plaintext)/2;
         uint8_t* buffer = (uint8_t*)malloc(len);
         hex_string_to_bytes(plaintext, buffer, len);
-        NP_LDT_RESULT result = NpLdtEncrypt(handle, buffer, len, salt);
+        NP_LDT_RESULT result = NpLdtEncrypt(enc_handle, buffer, len, salt);
         ASSERT_EQ(result, NP_LDT_SUCCESS);
 
         char output[strlen(plaintext) + 1];
         bytes_to_hex_string(buffer, output, len);
         ASSERT_EQ(strcmp(output, ciphertext), 0);
 
-        result = NpLdtDecryptAndVerify(handle, buffer, len, salt);
+        NpLdtDecryptHandle dec_handle = NpLdtDecryptCreate(np_key_seed, known_hmac);
+        ASSERT_NE(dec_handle.handle, 0);
+
+        result = NpLdtDecryptAndVerify(dec_handle, buffer, len, salt);
         ASSERT_EQ(result, NP_LDT_SUCCESS);
 
         bytes_to_hex_string(buffer, output, len);
@@ -139,13 +150,15 @@
     uint8_t* plaintext = (uint8_t*) malloc(20 * sizeof(uint8_t));
     memcpy(plaintext, TEST_DATA_BYTES, 20);
 
-    NpLdtHandle handle = create_handle_from_test_key();
-    ASSERT_NE(handle, 0);
+    NpLdtEncryptHandle enc_handle = create_enc_handle_from_test_key();
+    ASSERT_NE(enc_handle.handle, 0);
 
-    NP_LDT_RESULT result = NpLdtEncrypt(handle, plaintext, 20, salt);
+    NP_LDT_RESULT result = NpLdtEncrypt(enc_handle, plaintext, 20, salt);
     ASSERT_EQ(result, NP_LDT_SUCCESS);
 
-    result = NpLdtDecryptAndVerify(handle, plaintext, 20, salt);
+    NpLdtDecryptHandle dec_handle = create_dec_handle_from_test_key();
+
+    result = NpLdtDecryptAndVerify(dec_handle, plaintext, 20, salt);
     ASSERT_EQ(result, NP_LDT_SUCCESS);
     free(plaintext);
 }
@@ -155,13 +168,13 @@
     uint8_t* plaintext = (uint8_t*) malloc(32 * sizeof(uint8_t));
     memcpy(plaintext, TEST_DATA_BYTES, 20);
 
-    NpLdtHandle handle = create_handle_from_test_key();
-    ASSERT_NE(handle, 0);
+    NpLdtEncryptHandle enc_handle = create_enc_handle_from_test_key();
+    ASSERT_NE(enc_handle.handle, 0);
 
-    NP_LDT_RESULT result = NpLdtEncrypt(handle, plaintext, 32, salt);
+    NP_LDT_RESULT result = NpLdtEncrypt(enc_handle, plaintext, 32, salt);
     ASSERT_EQ(result, NP_LDT_ERROR_INVALID_LENGTH);
 
-    result = NpLdtEncrypt(handle, plaintext, 15, salt);
+    result = NpLdtEncrypt(enc_handle, plaintext, 15, salt);
     ASSERT_EQ(result,  NP_LDT_ERROR_INVALID_LENGTH);
     free(plaintext);
 }
@@ -171,13 +184,13 @@
     uint8_t* plaintext = (uint8_t*) malloc(32 * sizeof(uint8_t));
     memcpy(plaintext, TEST_DATA_BYTES, 20);
 
-    NpLdtHandle handle = create_handle_from_test_key();
-    ASSERT_NE(handle, 0);
+    NpLdtDecryptHandle dec_handle = create_dec_handle_from_test_key();
+    ASSERT_NE(dec_handle.handle, 0);
 
-    NP_LDT_RESULT result = NpLdtDecryptAndVerify(handle, plaintext, 32, salt);
+    NP_LDT_RESULT result = NpLdtDecryptAndVerify(dec_handle, plaintext, 32, salt);
     ASSERT_EQ(result, NP_LDT_ERROR_INVALID_LENGTH);
 
-    result = NpLdtDecryptAndVerify(handle, plaintext, 15, salt);
+    result = NpLdtDecryptAndVerify(dec_handle, plaintext, 15, salt);
     ASSERT_EQ(result, NP_LDT_ERROR_INVALID_LENGTH);
     free(plaintext);
 }
@@ -189,10 +202,10 @@
     uint8_t* plaintext = (uint8_t*) malloc(30 * sizeof(char));
     memcpy(plaintext, test_text, 29);
 
-    NpLdtHandle handle = create_handle_from_test_key();
-    ASSERT_NE(handle, 0);
+    NpLdtDecryptHandle dec_handle = create_dec_handle_from_test_key();
+    ASSERT_NE(dec_handle.handle, 0);
 
-    NP_LDT_RESULT result = NpLdtDecryptAndVerify(handle, plaintext, 24, salt);
+    NP_LDT_RESULT result = NpLdtDecryptAndVerify(dec_handle, plaintext, 24, salt);
     ASSERT_EQ(result, NP_LDT_ERROR_MAC_MISMATCH);
 
     ASSERT_EQ(strcmp((char *)plaintext, test_text), 0);
@@ -204,17 +217,17 @@
     uint8_t* plaintext = (uint8_t*) malloc(20 * sizeof(uint8_t));
     memcpy(plaintext, TEST_DATA_BYTES, 20);
 
-    NpLdtHandle handle = create_handle_from_test_key();
-    ASSERT_NE(handle, 0);
-
-    NP_LDT_RESULT result = NpLdtEncrypt(1234, plaintext, 20, salt);
+    NP_LDT_RESULT result = NpLdtEncrypt(NpLdtEncryptHandle{1234}, plaintext, 20, salt);
     ASSERT_EQ(result, NP_LDT_INVALID_HANDLE);
 
-    result = NpLdtDecryptAndVerify(1234, plaintext, 20, salt);
+    result = NpLdtDecryptAndVerify(NpLdtDecryptHandle{1234}, plaintext, 20, salt);
     ASSERT_EQ(result, NP_LDT_INVALID_HANDLE);
     free(plaintext);
 
-    result = NpLdtClose(1234);
+    result = NpLdtEncryptClose(NpLdtEncryptHandle{1234});
+    ASSERT_EQ(result, NP_LDT_INVALID_HANDLE);
+
+    result = NpLdtDecryptClose(NpLdtDecryptHandle{1234});
     ASSERT_EQ(result, NP_LDT_INVALID_HANDLE);
 }
 
@@ -235,21 +248,27 @@
     uint8_t* plaintext = (uint8_t*) malloc(20 * sizeof(uint8_t));
     memcpy(plaintext, TEST_DATA_BYTES, 20);
 
-    NpLdtHandle handle = create_handle_from_test_key();
-    if (handle == 0){
+    NpLdtEncryptHandle enc_handle = create_enc_handle_from_test_key();
+    if (enc_handle.handle == 0){
         printf("Error creating handle in thread!");
         free(plaintext);
         exit(2);
     }
 
-    NP_LDT_RESULT result = NpLdtEncrypt(handle, plaintext, 20, salt);
+    NP_LDT_RESULT result = NpLdtEncrypt(enc_handle, plaintext, 20, salt);
     if (result != NP_LDT_SUCCESS){
         printf("Error in encrypt in thread!");
         free(plaintext);
         exit(2);
     }
 
-    result = NpLdtDecryptAndVerify(handle, plaintext, 20, salt);
+    NpLdtDecryptHandle dec_handle = create_dec_handle_from_test_key();
+    if (dec_handle.handle == 0){
+        printf("Error creating handle in thread!");
+        free(plaintext);
+        exit(2);
+    }
+    result = NpLdtDecryptAndVerify(dec_handle, plaintext, 20, salt);
     if (result != NP_LDT_SUCCESS){
         printf("Error in decrypt in thread!");
         free(plaintext);
diff --git a/nearby/presence/ldt_tbc/src/lib.rs b/nearby/presence/ldt_tbc/src/lib.rs
index 8a07f48..97dc5a5 100644
--- a/nearby/presence/ldt_tbc/src/lib.rs
+++ b/nearby/presence/ldt_tbc/src/lib.rs
@@ -23,20 +23,45 @@
 
 //! Defining traits for an LDT specific Tweakable Block Cipher
 
-/// `B` is the block size in bytes.
+/// The higher level trait defining the single block at a time Tweakable Block Cipher types.
+/// Holds associates types for both the [TweakableBlockCipherEncrypter] and corresponding
+/// [TweakableBlockCipherDecrypter]
 pub trait TweakableBlockCipher<const B: usize> {
+    /// The tweakable block cipher encryption cipher
+    type EncryptionCipher: TweakableBlockCipherEncrypter<B, Key = Self::Key, Tweak = Self::Tweak>;
+
+    /// The tweakable block cipher decryption cipher
+    type DecryptionCipher: TweakableBlockCipherDecrypter<B, Key = Self::Key, Tweak = Self::Tweak>;
+
     /// The tweak type used with encryption/decryption.
     type Tweak: From<[u8; B]>;
 
     /// the tweakable block cipher key type for the tbc
     type Key: TweakableBlockCipherKey;
+}
 
-    /// Create a new tweakable block cipher for ldt from a tbc key
+/// Trait defining a Tweakable Block Cipher, single block at a time, decrypt operation
+/// `B` is the block size in bytes.
+pub trait TweakableBlockCipherEncrypter<const B: usize> {
+    /// The tweakable block cipher key type for the tbc
+    type Key: TweakableBlockCipherKey;
+    /// The tweak type used when encrypting
+    type Tweak: From<[u8; B]>;
+    /// Build a [TweakableBlockCipherEncrypter] with the provided and the provided key.
     fn new(key: &Self::Key) -> Self;
-
     /// Encrypt `block` in place using the specified `tweak`.
     fn encrypt(&self, tweak: Self::Tweak, block: &mut [u8; B]);
+}
 
+/// Trait defining a Tweakable Block Cipher, single block at a time, encrypt operation
+/// `B` is the block size in bytes.
+pub trait TweakableBlockCipherDecrypter<const B: usize> {
+    /// The tweakable block cipher key type for the tbc
+    type Key: TweakableBlockCipherKey;
+    /// The tweak type used when decrypting
+    type Tweak: From<[u8; B]>;
+    /// Build a [TweakableBlockCipherDecrypter] with the provided and the provided key.
+    fn new(key: &Self::Key) -> Self;
     /// Decrypt `block` in place using the specified `tweak`.
     fn decrypt(&self, tweak: Self::Tweak, block: &mut [u8; B]);
 }
diff --git a/nearby/presence/np_hkdf/src/v1_salt.rs b/nearby/presence/np_hkdf/src/v1_salt.rs
index 6fb309f..acd118c 100644
--- a/nearby/presence/np_hkdf/src/v1_salt.rs
+++ b/nearby/presence/np_hkdf/src/v1_salt.rs
@@ -59,6 +59,11 @@
     pub fn as_slice(&self) -> &[u8] {
         self.data.as_slice()
     }
+
+    /// Returns the salt bytes as a reference to an array
+    pub fn as_array_ref(&self) -> &[u8; 16] {
+        &self.data
+    }
 }
 
 impl<C: CryptoProvider> From<[u8; 16]> for V1Salt<C> {
diff --git a/nearby/presence/test_helper/src/lib.rs b/nearby/presence/test_helper/src/lib.rs
index e095d36..ecb54c9 100644
--- a/nearby/presence/test_helper/src/lib.rs
+++ b/nearby/presence/test_helper/src/lib.rs
@@ -27,13 +27,20 @@
     full_path
 }
 
-/// Opens a json file at the specified path and parses it into a value
-pub fn parse_json_data_file(file: &str) -> serde_json::Value {
+/// Opens a file at the specified path (relative to the workspace root)
+/// and yields its contents as a string
+pub fn load_data_file_contents_as_string(file: &str) -> String {
     let full_path = get_data_file(file);
     let mut file = fs::File::open(full_path).expect("Should be able to open data file");
     let mut data = String::new();
     file.read_to_string(&mut data)
         .expect("should be able to read data file");
+    data
+}
+
+/// Opens a json file at the specified path and parses it into a value
+pub fn parse_json_data_file(file: &str) -> serde_json::Value {
+    let data = load_data_file_contents_as_string(file);
     serde_json::de::from_str(data.as_str()).expect("should be able to parse json date file")
 }
 
diff --git a/nearby/presence/xts_aes/fuzz/Cargo.lock b/nearby/presence/xts_aes/fuzz/Cargo.lock
index 90fc28c..a03bfe0 100644
--- a/nearby/presence/xts_aes/fuzz/Cargo.lock
+++ b/nearby/presence/xts_aes/fuzz/Cargo.lock
@@ -54,18 +54,9 @@
 
 [[package]]
 name = "base16ct"
-version = "0.1.1"
+version = "0.2.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "349a06037c7bf932dd7e7d1f653678b2038b9ad46a74102f1fc7bd7872678cce"
-
-[[package]]
-name = "block-buffer"
-version = "0.9.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4"
-dependencies = [
- "generic-array",
-]
+checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf"
 
 [[package]]
 name = "block-buffer"
@@ -86,12 +77,6 @@
 ]
 
 [[package]]
-name = "byteorder"
-version = "1.4.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610"
-
-[[package]]
 name = "bytes"
 version = "1.4.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -148,12 +133,12 @@
 
 [[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",
+ "rand_core",
  "subtle",
  "zeroize",
 ]
@@ -165,7 +150,7 @@
 checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3"
 dependencies = [
  "generic-array",
- "rand_core 0.6.4",
+ "rand_core",
  "typenum",
 ]
 
@@ -193,10 +178,9 @@
  "p256",
  "rand",
  "rand_chacha",
- "rand_core 0.6.4",
- "rand_core_05_adapter",
+ "rand_core",
  "sec1",
- "sha2 0.10.6",
+ "sha2",
  "subtle",
  "x25519-dalek",
 ]
@@ -212,24 +196,26 @@
 
 [[package]]
 name = "curve25519-dalek"
-version = "3.2.0"
+version = "4.0.0-rc.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0b9fdf9972b2bd6af2d913799d9ebc165ea4d2e65878e329d9c6b372c4491b61"
+checksum = "03d928d978dbec61a1167414f5ec534f24bea0d7a0d24dd9b6233d3d8223e585"
 dependencies = [
- "byteorder",
- "digest 0.9.0",
- "rand_core 0.5.1",
+ "cfg-if",
+ "digest",
+ "fiat-crypto",
+ "packed_simd_2",
+ "platforms",
  "subtle",
- "zeroize",
 ]
 
 [[package]]
 name = "der"
-version = "0.6.1"
+version = "0.7.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f1a467a65c5e759bce6e65eaf91cc29f466cdc57cb65777bd646872a8a1fd4de"
+checksum = "bc906908ea6458456e5eaa160a9c08543ec3d1e6f71e2235cedd660cb65f9df0"
 dependencies = [
  "const-oid",
+ "zeroize",
 ]
 
 [[package]]
@@ -245,60 +231,50 @@
 
 [[package]]
 name = "digest"
-version = "0.9.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066"
-dependencies = [
- "generic-array",
-]
-
-[[package]]
-name = "digest"
 version = "0.10.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "8168378f4e5023e7218c89c891c0fd8ecdb5e5e4f18cb78f38cf245dd021e76f"
 dependencies = [
- "block-buffer 0.10.4",
+ "block-buffer",
  "crypto-common",
  "subtle",
 ]
 
 [[package]]
 name = "ed25519"
-version = "1.5.3"
+version = "2.2.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "91cff35c70bba8a626e3185d8cd48cc11b5437e1a5bcd15b9b5fa3c64b6dfee7"
+checksum = "5fb04eee5d9d907f29e80ee6b0e78f7e2c82342c63e3580d8c4f69d9d5aad963"
 dependencies = [
  "signature",
 ]
 
 [[package]]
 name = "ed25519-dalek"
-version = "1.0.1"
+version = "2.0.0-rc.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c762bae6dcaf24c4c84667b8579785430908723d5c889f469d76a41d59cc7a9d"
+checksum = "798f704d128510932661a3489b08e3f4c934a01d61c5def59ae7b8e48f19665a"
 dependencies = [
  "curve25519-dalek",
  "ed25519",
- "sha2 0.9.9",
- "zeroize",
+ "rand_core",
+ "sha2",
 ]
 
 [[package]]
 name = "elliptic-curve"
-version = "0.12.3"
+version = "0.13.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e7bb888ab5300a19b8e5bceef25ac745ad065f3c9f7efc6de1b91958110891d3"
+checksum = "6ea5a92946e8614bb585254898bb7dd1ddad241ace60c52149e3765e34cc039d"
 dependencies = [
  "base16ct",
  "crypto-bigint",
- "der",
- "digest 0.10.6",
+ "digest",
  "ff",
  "generic-array",
  "group",
  "hkdf",
- "rand_core 0.6.4",
+ "rand_core",
  "sec1",
  "subtle",
  "zeroize",
@@ -306,15 +282,21 @@
 
 [[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",
+ "rand_core",
  "subtle",
 ]
 
 [[package]]
+name = "fiat-crypto"
+version = "0.1.20"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e825f6987101665dea6ec934c09ec6d721de7bc1bf92248e1d5810c8cd636b77"
+
+[[package]]
 name = "generic-array"
 version = "0.14.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -322,6 +304,7 @@
 dependencies = [
  "typenum",
  "version_check",
+ "zeroize",
 ]
 
 [[package]]
@@ -337,12 +320,12 @@
 
 [[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",
+ "rand_core",
  "subtle",
 ]
 
@@ -361,7 +344,7 @@
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e"
 dependencies = [
- "digest 0.10.6",
+ "digest",
 ]
 
 [[package]]
@@ -408,6 +391,12 @@
 ]
 
 [[package]]
+name = "libm"
+version = "0.1.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7fc7aa29613bd6a620df431842069224d8bc9011086b1db4c0e0cd47fa03ec9a"
+
+[[package]]
 name = "once_cell"
 version = "1.17.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -421,15 +410,31 @@
 
 [[package]]
 name = "p256"
-version = "0.12.0"
+version = "0.13.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "49c124b3cbce43bcbac68c58ec181d98ed6cc7e6d0aa7c3ba97b2563410b0e55"
+checksum = "7270da3e5caa82afd3deb054cc237905853813aea3859544bc082c3fe55b8d47"
 dependencies = [
  "elliptic-curve",
  "primeorder",
 ]
 
 [[package]]
+name = "packed_simd_2"
+version = "0.3.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a1914cd452d8fccd6f9db48147b29fd4ae05bea9dc5d9ad578509f72415de282"
+dependencies = [
+ "cfg-if",
+ "libm",
+]
+
+[[package]]
+name = "platforms"
+version = "3.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e3d7ddaed09e0eb771a79ab0fd64609ba0afb0a8366421957936ad14cbd13630"
+
+[[package]]
 name = "polyval"
 version = "0.6.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -449,9 +454,9 @@
 
 [[package]]
 name = "primeorder"
-version = "0.12.1"
+version = "0.13.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0b54f7131b3dba65a2f414cf5bd25b66d4682e4608610668eae785750ba4c5b2"
+checksum = "7613fdcc0831c10060fa69833ea8fa2caa94b6456f51e25356a885b530a2e3d0"
 dependencies = [
  "elliptic-curve",
 ]
@@ -480,7 +485,7 @@
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404"
 dependencies = [
- "rand_core 0.6.4",
+ "rand_core",
 ]
 
 [[package]]
@@ -490,17 +495,11 @@
 checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88"
 dependencies = [
  "ppv-lite86",
- "rand_core 0.6.4",
+ "rand_core",
 ]
 
 [[package]]
 name = "rand_core"
-version = "0.5.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19"
-
-[[package]]
-name = "rand_core"
 version = "0.6.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c"
@@ -509,18 +508,10 @@
 ]
 
 [[package]]
-name = "rand_core_05_adapter"
-version = "0.1.0"
-dependencies = [
- "rand",
- "rand_core 0.5.1",
-]
-
-[[package]]
 name = "sec1"
-version = "0.3.0"
+version = "0.7.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3be24c1842290c45df0a7bf069e0c268a747ad05a192f2fd7dcfdbc1cba40928"
+checksum = "48518a2b5775ba8ca5b46596aae011caa431e6ce7e4a67ead66d92f08884220e"
 dependencies = [
  "base16ct",
  "der",
@@ -531,33 +522,20 @@
 
 [[package]]
 name = "sha2"
-version = "0.9.9"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800"
-dependencies = [
- "block-buffer 0.9.0",
- "cfg-if",
- "cpufeatures",
- "digest 0.9.0",
- "opaque-debug",
-]
-
-[[package]]
-name = "sha2"
 version = "0.10.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "82e6b795fe2e3b1e845bafcb27aa35405c4d47cdfc92af5fc8d3002f76cebdc0"
 dependencies = [
  "cfg-if",
  "cpufeatures",
- "digest 0.10.6",
+ "digest",
 ]
 
 [[package]]
 name = "signature"
-version = "1.6.4"
+version = "2.1.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "74233d3b3b2f6d4b006dc19dee745e73e2a6bfb6f93607cd3b02bd5b00797d7c"
+checksum = "5e1788eed21689f9cf370582dfc467ef36ed9c707f073528ddafa8d83e3b8500"
 
 [[package]]
 name = "subtle"
@@ -577,18 +555,6 @@
 ]
 
 [[package]]
-name = "synstructure"
-version = "0.12.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f36bdaa60a83aca3921b5259d5400cbf5e90fc51931376a9bd4a0eb79aa7210f"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn",
- "unicode-xid",
-]
-
-[[package]]
 name = "typenum"
 version = "1.16.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -601,12 +567,6 @@
 checksum = "e5464a87b239f13a63a501f2701565754bae92d243d4bb7eb12f6d57d2269bf4"
 
 [[package]]
-name = "unicode-xid"
-version = "0.2.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c"
-
-[[package]]
 name = "universal-hash"
 version = "0.5.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -630,13 +590,12 @@
 
 [[package]]
 name = "x25519-dalek"
-version = "2.0.0-pre.1"
+version = "2.0.0-rc.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e5da623d8af10a62342bcbbb230e33e58a63255a58012f8653c578e54bab48df"
+checksum = "fabd6e16dd08033932fc3265ad4510cc2eab24656058a6dcb107ffe274abcc95"
 dependencies = [
  "curve25519-dalek",
- "rand_core 0.6.4",
- "zeroize",
+ "rand_core",
 ]
 
 [[package]]
@@ -646,6 +605,7 @@
  "arbitrary",
  "crypto_provider",
  "crypto_provider_rustcrypto",
+ "ldt_tbc",
  "libfuzzer-sys",
  "xts_aes",
 ]
@@ -664,18 +624,3 @@
 version = "1.5.7"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "c394b5bd0c6f669e7275d9c20aa90ae064cb22e75a1cad54e1b34088034b149f"
-dependencies = [
- "zeroize_derive",
-]
-
-[[package]]
-name = "zeroize_derive"
-version = "1.3.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "44bf07cb3e50ea2003396695d58bf46bc9887a1f362260446fad6bc4e79bd36c"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn",
- "synstructure",
-]
diff --git a/nearby/presence/xts_aes/fuzz/Cargo.toml b/nearby/presence/xts_aes/fuzz/Cargo.toml
index 70b700f..4d00c49 100644
--- a/nearby/presence/xts_aes/fuzz/Cargo.toml
+++ b/nearby/presence/xts_aes/fuzz/Cargo.toml
@@ -21,6 +21,9 @@
 [dependencies.crypto_provider_rustcrypto]
 path = "../../../crypto/crypto_provider_rustcrypto"
 
+[dependencies.ldt_tbc]
+path = "../../../presence/ldt_tbc"
+
 # Prevent this from interfering with workspaces
 [workspace]
 members = ["."]
diff --git a/nearby/presence/xts_aes/fuzz/fuzz_targets/xts_roundtrip.rs b/nearby/presence/xts_aes/fuzz/fuzz_targets/xts_roundtrip.rs
index 91eaa5c..b7133de 100644
--- a/nearby/presence/xts_aes/fuzz/fuzz_targets/xts_roundtrip.rs
+++ b/nearby/presence/xts_aes/fuzz/fuzz_targets/xts_roundtrip.rs
@@ -13,8 +13,8 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-use crypto_provider::CryptoProvider;
 use crypto_provider_rustcrypto::RustCrypto;
+use ldt_tbc::{TweakableBlockCipherDecrypter, TweakableBlockCipherEncrypter};
 use libfuzzer_sys::fuzz_target;
 use xts_aes::*;
 
@@ -24,16 +24,23 @@
         return;
     }
 
-    let xts = build_xts_aes::<_, <RustCrypto as CryptoProvider>::Aes128>(
-        &XtsAes128Key::from(&data.key),
-    );
+    let xts_enc =
+        <XtsAes128<RustCrypto> as ldt_tbc::TweakableBlockCipher<16>>::EncryptionCipher::new(
+            &XtsAes128Key::from(&data.key),
+        );
+    let xts_dec =
+        <XtsAes128<RustCrypto> as ldt_tbc::TweakableBlockCipher<16>>::DecryptionCipher::new(
+            &XtsAes128Key::from(&data.key),
+        );
+
     let tweak: Tweak = data.tweak.into();
 
     let mut buffer = data.plaintext.clone();
 
-    xts.encrypt_data_unit(tweak.clone(), &mut buffer[..])
+    xts_enc
+        .encrypt_data_unit(tweak.clone(), &mut buffer[..])
         .unwrap();
-    xts.decrypt_data_unit(tweak, &mut buffer[..]).unwrap();
+    xts_dec.decrypt_data_unit(tweak, &mut buffer[..]).unwrap();
     assert_eq!(data.plaintext, buffer);
 });
 
diff --git a/nearby/presence/xts_aes/src/lib.rs b/nearby/presence/xts_aes/src/lib.rs
index e213dc2..1ffa813 100644
--- a/nearby/presence/xts_aes/src/lib.rs
+++ b/nearby/presence/xts_aes/src/lib.rs
@@ -29,33 +29,22 @@
 
 use array_ref::{array_mut_ref, array_ref};
 use core::fmt;
+use core::marker::PhantomData;
+
 use crypto_provider::aes::{Aes, AesCipher, AesDecryptCipher, AesEncryptCipher};
 use crypto_provider::{
     aes::{AesKey, BLOCK_SIZE},
     CryptoProvider,
 };
 
-use ldt_tbc::{TweakableBlockCipher, TweakableBlockCipherKey};
+use ldt_tbc::{
+    TweakableBlockCipher, TweakableBlockCipherDecrypter, TweakableBlockCipherEncrypter,
+    TweakableBlockCipherKey,
+};
 
 #[cfg(test)]
 mod tweak_tests;
 
-/// Build an [Xts] with the provided [Aes] with separate block cipher keys.
-fn build_xts_aes_separate<A: Aes>(key1: &A::Key, key2: &A::Key) -> Xts<A> {
-    // TODO: split xts into encrypter and decrypter for better performance
-    Xts {
-        main_encryption_cipher: A::EncryptCipher::new(key1),
-        main_decryption_cipher: A::DecryptCipher::new(key1),
-        tweak_encryption_cipher: A::EncryptCipher::new(key2),
-        tweak_decryption_cipher: A::DecryptCipher::new(key2),
-    }
-}
-
-/// Build an [Xts] with the provided [Aes] and the provided key.
-pub fn build_xts_aes<K: XtsKey, A: Aes<Key = K::BlockCipherKey>>(key: &K) -> Xts<A> {
-    build_xts_aes_separate::<A>(key.key_1(), key.key_2())
-}
-
 /// XTS-AES as per NIST docs
 /// [here](https://luca-giuzzi.unibs.it/corsi/Support/papers-cryptography/1619-2007-NIST-Submission.pdf)
 /// and
@@ -75,27 +64,51 @@
 /// the tweak used to encrypt that block.
 ///
 /// There is no support for partial bytes (bit lengths that aren't a multiple of 8).
-#[repr(C)]
-pub struct Xts<A: Aes> {
-    main_encryption_cipher: A::EncryptCipher,
-    main_decryption_cipher: A::DecryptCipher,
-    tweak_encryption_cipher: A::EncryptCipher,
-    tweak_decryption_cipher: A::DecryptCipher,
+pub struct XtsAes<A: Aes<Key = K::BlockCipherKey>, K: XtsKey + TweakableBlockCipherKey> {
+    _marker: PhantomData<A>,
+    _marker2: PhantomData<K>,
 }
 
-type DataUnitPartsResult<'a> = Result<(&'a mut [u8], &'a mut [u8], &'a mut [u8]), XtsError>;
+impl<A: Aes<Key = K::BlockCipherKey>, K: XtsKey + TweakableBlockCipherKey>
+    TweakableBlockCipher<BLOCK_SIZE> for XtsAes<A, K>
+{
+    type EncryptionCipher = XtsEncrypter<A, K>;
+    type DecryptionCipher = XtsDecrypter<A, K>;
+    type Tweak = Tweak;
+    type Key = K;
+}
 
-// We have vetted each instance is used in a context where the slice will
-// always be in range, and the expects are unreachable
+/// The XtsAes128 implementation
+pub type XtsAes128<C> = XtsAes<<C as CryptoProvider>::Aes128, XtsAes128Key>;
+
+/// The XtsAes256 implementation
+pub type XtsAes256<C> = XtsAes<<C as CryptoProvider>::Aes256, XtsAes256Key>;
+
+/// Struct which provides Xts Aes Encrypt operations
+#[repr(C)]
+pub struct XtsEncrypter<A: Aes<Key = K::BlockCipherKey>, K: XtsKey> {
+    main_encryption_cipher: A::EncryptCipher,
+    tweak_encryption_cipher: A::EncryptCipher,
+    _marker: PhantomData<K>,
+}
+
+/// Struct which provides Xts Aes Decrypt operations
+#[repr(C)]
+pub struct XtsDecrypter<A: Aes<Key = K::BlockCipherKey>, K: XtsKey> {
+    main_decryption_cipher: A::DecryptCipher,
+    tweak_encryption_cipher: A::EncryptCipher,
+    _marker: PhantomData<K>,
+}
+
 #[allow(clippy::expect_used)]
 #[allow(clippy::indexing_slicing)]
-impl<A: Aes> Xts<A> {
+impl<A: Aes<Key = K::BlockCipherKey>, K: XtsKey> XtsEncrypter<A, K> {
     /// Encrypt a data unit in place, using sequential block numbers for each block.
     /// `data_unit` must be at least [BLOCK_SIZE] bytes, and fewer than
     /// `BLOCK_SIZE * 2^20` bytes.
     pub fn encrypt_data_unit(&self, tweak: Tweak, data_unit: &mut [u8]) -> Result<(), XtsError> {
         let (standalone_blocks, last_complete_block, partial_last_block) =
-            Self::data_unit_parts(data_unit)?;
+            data_unit_parts(data_unit)?;
 
         let mut tweaked_xts = self.tweaked(tweak);
 
@@ -157,12 +170,27 @@
         Ok(())
     }
 
+    /// Returns an [XtsTweaked] configured with the specified tweak and a block number of 0.
+    fn tweaked(&self, tweak: Tweak) -> XtsEncrypterTweaked<A> {
+        let mut bytes = tweak.bytes;
+        self.tweak_encryption_cipher.encrypt(&mut bytes);
+
+        XtsEncrypterTweaked {
+            tweak_state: TweakState::new(bytes),
+            enc_cipher: &self.main_encryption_cipher,
+        }
+    }
+}
+
+#[allow(clippy::expect_used)]
+#[allow(clippy::indexing_slicing)]
+impl<A: Aes<Key = K::BlockCipherKey>, K: XtsKey> XtsDecrypter<A, K> {
     /// Decrypt a data unit in place, using sequential block numbers for each block.
     /// `data_unit` must be at least [BLOCK_SIZE] bytes, and fewer than
     /// `BLOCK_SIZE * 2^20` bytes.
     pub fn decrypt_data_unit(&self, tweak: Tweak, data_unit: &mut [u8]) -> Result<(), XtsError> {
         let (standalone_blocks, last_complete_block, partial_last_block) =
-            Self::data_unit_parts(data_unit)?;
+            data_unit_parts(data_unit)?;
 
         let mut tweaked_xts = self.tweaked(tweak);
 
@@ -213,94 +241,80 @@
         Ok(())
     }
 
-    /// Returns `(standalone blocks, last complete block, partial last block)`.
-    fn data_unit_parts(data_unit: &mut [u8]) -> DataUnitPartsResult {
-        if data_unit.len() < BLOCK_SIZE {
-            return Err(XtsError::DataTooShort);
-        } else if data_unit.len() > MAX_XTS_SIZE {
-            return Err(XtsError::DataTooLong);
-        }
-        // complete_blocks >= 1
-        let complete_blocks = data_unit.len() / BLOCK_SIZE;
-        // standalone_units >= 0 blocks, suffix = last complete block + possible partial block.
-        let (standalone_blocks, suffix) =
-            data_unit.split_at_mut((complete_blocks - 1) * BLOCK_SIZE);
-        let (last_complete_block, partial_last_block) = suffix.split_at_mut(BLOCK_SIZE);
-        Ok((standalone_blocks, last_complete_block, partial_last_block))
-    }
-
     /// Returns an [XtsTweaked] configured with the specified tweak and a block number of 0.
-    fn tweaked(&self, tweak: Tweak) -> XtsTweaked<A> {
+    fn tweaked(&self, tweak: Tweak) -> XtsDecrypterTweaked<A> {
         let mut bytes = tweak.bytes;
         self.tweak_encryption_cipher.encrypt(&mut bytes);
 
-        XtsTweaked {
+        XtsDecrypterTweaked {
             tweak_state: TweakState::new(bytes),
-            enc_cipher: &self.main_encryption_cipher,
             dec_cipher: &self.main_decryption_cipher,
         }
     }
 }
 
-/// Implementation of XTS-AES-128
-pub struct XtsAes128<C: CryptoProvider>(Xts<C::Aes128>);
-impl<C: CryptoProvider> TweakableBlockCipher<BLOCK_SIZE> for XtsAes128<C> {
+type DataUnitPartsResult<'a> = Result<(&'a mut [u8], &'a mut [u8], &'a mut [u8]), XtsError>;
+
+/// Returns `(standalone blocks, last complete block, partial last block)`.
+fn data_unit_parts(data_unit: &mut [u8]) -> DataUnitPartsResult {
+    if data_unit.len() < BLOCK_SIZE {
+        return Err(XtsError::DataTooShort);
+    } else if data_unit.len() > MAX_XTS_SIZE {
+        return Err(XtsError::DataTooLong);
+    }
+    // complete_blocks >= 1
+    let complete_blocks = data_unit.len() / BLOCK_SIZE;
+    // standalone_units >= 0 blocks, suffix = last complete block + possible partial block.
+    let (standalone_blocks, suffix) = data_unit.split_at_mut((complete_blocks - 1) * BLOCK_SIZE);
+    let (last_complete_block, partial_last_block) = suffix.split_at_mut(BLOCK_SIZE);
+    Ok((standalone_blocks, last_complete_block, partial_last_block))
+}
+
+impl<A: Aes<Key = K::BlockCipherKey>, K: XtsKey + TweakableBlockCipherKey>
+    TweakableBlockCipherEncrypter<BLOCK_SIZE> for XtsEncrypter<A, K>
+{
+    type Key = K;
     type Tweak = Tweak;
 
-    type Key = XtsAes128Key;
-
+    /// Build an [XtsEncrypter] with the provided [Aes] and the provided key.
     fn new(key: &Self::Key) -> Self {
-        Self(build_xts_aes(key))
+        XtsEncrypter {
+            main_encryption_cipher: A::EncryptCipher::new(key.key_1()),
+            tweak_encryption_cipher: A::EncryptCipher::new(key.key_2()),
+            _marker: Default::default(),
+        }
     }
 
     #[allow(clippy::expect_used)]
     fn encrypt(&self, tweak: Self::Tweak, block: &mut [u8; 16]) {
         // we're encrypting precisely one block, so the block number won't advance, and ciphertext
         // stealing will not be applied.
-        self.0
-            .encrypt_data_unit(tweak, block)
-            .expect("One block is a valid size");
-    }
-
-    #[allow(clippy::expect_used)]
-    fn decrypt(&self, tweak: Self::Tweak, block: &mut [u8; 16]) {
-        self.0
-            .decrypt_data_unit(tweak, block)
+        self.encrypt_data_unit(tweak, block)
             .expect("One block is a valid size");
     }
 }
 
-/// Implementation of XTS-AES-256
-pub struct XtsAes256<C: CryptoProvider>(Xts<C::Aes256>);
-impl<C: CryptoProvider> TweakableBlockCipher<BLOCK_SIZE> for XtsAes256<C> {
+impl<A: Aes<Key = K::BlockCipherKey>, K: XtsKey + TweakableBlockCipherKey>
+    TweakableBlockCipherDecrypter<BLOCK_SIZE> for XtsDecrypter<A, K>
+{
+    type Key = K;
     type Tweak = Tweak;
 
-    type Key = XtsAes256Key;
-
-    fn new(key: &Self::Key) -> Self {
-        Self(build_xts_aes(key))
-    }
-
-    #[allow(clippy::expect_used)]
-    fn encrypt(&self, tweak: Self::Tweak, block: &mut [u8; 16]) {
-        // we're encrypting precisely one block, so the block number won't advance, and ciphertext
-        // stealing will not be applied.
-        self.0
-            .encrypt_data_unit(tweak, block)
-            .expect("One block is a valid size");
+    fn new(key: &K) -> Self {
+        XtsDecrypter {
+            main_decryption_cipher: A::DecryptCipher::new(key.key_1()),
+            tweak_encryption_cipher: A::EncryptCipher::new(key.key_2()),
+            _marker: Default::default(),
+        }
     }
 
     #[allow(clippy::expect_used)]
     fn decrypt(&self, tweak: Self::Tweak, block: &mut [u8; 16]) {
-        self.0
-            .decrypt_data_unit(tweak, block)
+        self.decrypt_data_unit(tweak, block)
             .expect("One block is a valid size");
     }
 }
 
-/// XTS spec recommends to not go beyond 2^20 blocks.
-const MAX_XTS_SIZE: usize = (1 << 20) * BLOCK_SIZE;
-
 /// Errors that can occur during XTS encryption/decryption.
 #[derive(Debug, PartialEq, Eq)]
 pub enum XtsError {
@@ -310,6 +324,9 @@
     DataTooLong,
 }
 
+/// XTS spec recommends to not go beyond 2^20 blocks.
+const MAX_XTS_SIZE: usize = (1 << 20) * BLOCK_SIZE;
+
 /// An XTS key comprised of two keys for the underlying block cipher.
 pub trait XtsKey: for<'a> TryFrom<&'a [u8], Error = Self::TryFromError> {
     /// The key used by the block cipher underlying XTS
@@ -576,13 +593,36 @@
 ///
 /// Encryption or decryption is per-block only; ciphertext stealing is not implemented at this
 /// level.
-struct XtsTweaked<'a, A: Aes> {
+struct XtsEncrypterTweaked<'a, A: Aes> {
     tweak_state: TweakState,
     enc_cipher: &'a A::EncryptCipher,
+}
+
+impl<'a, A: Aes> XtsEncrypterTweaked<'a, A> {
+    fn advance_to_next_block_num(&mut self) {
+        self.tweak_state
+            .advance_to_block(self.tweak_state.block_num + 1)
+    }
+
+    /// Encrypt a block in place using the configured tweak and current block number.
+    fn encrypt_block(&self, block: &mut crypto_provider::aes::AesBlock) {
+        array_xor(block, &self.tweak_state.tweak);
+        self.enc_cipher.encrypt(block);
+        array_xor(block, &self.tweak_state.tweak);
+    }
+}
+
+/// An XTS-AES cipher configured with an initial tweak that can be advanced through the block
+/// numbers for that tweak's data unit.
+///
+/// Encryption or decryption is per-block only; ciphertext stealing is not implemented at this
+/// level.
+struct XtsDecrypterTweaked<'a, A: Aes> {
+    tweak_state: TweakState,
     dec_cipher: &'a A::DecryptCipher,
 }
 
-impl<'a, A: Aes> XtsTweaked<'a, A> {
+impl<'a, A: Aes> XtsDecrypterTweaked<'a, A> {
     fn advance_to_next_block_num(&mut self) {
         self.tweak_state
             .advance_to_block(self.tweak_state.block_num + 1)
@@ -597,14 +637,6 @@
     fn set_tweak(&mut self, tweak_state: TweakState) {
         self.tweak_state = tweak_state;
     }
-
-    /// Encrypt a block in place using the configured tweak and current block number.
-    fn encrypt_block(&self, block: &mut crypto_provider::aes::AesBlock) {
-        array_xor(block, &self.tweak_state.tweak);
-        self.enc_cipher.encrypt(block);
-        array_xor(block, &self.tweak_state.tweak);
-    }
-
     fn decrypt_block(&self, block: &mut crypto_provider::aes::AesBlock) {
         // CC = C ^ T
         array_xor(block, &self.tweak_state.tweak);
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 42f1db4..05eca0d 100644
--- a/nearby/presence/xts_aes/tests/xts_nist_test_vectors.rs
+++ b/nearby/presence/xts_aes/tests/xts_nist_test_vectors.rs
@@ -17,8 +17,11 @@
 use anyhow::anyhow;
 use crypto_provider::CryptoProvider;
 use crypto_provider_rustcrypto::RustCrypto;
+use ldt_tbc::TweakableBlockCipherDecrypter;
+use ldt_tbc::TweakableBlockCipherEncrypter;
+use ldt_tbc::TweakableBlockCipherKey;
 use std::{collections::hash_map, fs, io, io::BufRead as _};
-use xts_aes::{self, build_xts_aes, XtsAes128Key, XtsAes256Key, XtsKey};
+use xts_aes::{self, XtsAes128Key, XtsAes256Key, XtsDecrypter, XtsEncrypter, XtsKey};
 
 #[test]
 fn nist_test_vectors_data_unit_seq_128() -> Result<(), anyhow::Error> {
@@ -55,7 +58,7 @@
 
 fn run_test_cases<K, A>(path: &str, expected_num_cases: usize) -> Result<(), anyhow::Error>
 where
-    K: XtsKey,
+    K: XtsKey + TweakableBlockCipherKey,
     A: crypto_provider::aes::Aes<Key = K::BlockCipherKey>,
 {
     let test_cases = parse_test_vector(path)?;
@@ -65,24 +68,32 @@
     for tc in test_cases {
         buf.clear();
 
-        let xts = build_xts_aes::<_, A>(&K::try_from(tc.key.as_slice()).unwrap());
+        let xts_enc = XtsEncrypter::<A, _>::new(&K::try_from(tc.key.as_slice()).unwrap());
+        let xts_dec = XtsDecrypter::<A, _>::new(&K::try_from(tc.key.as_slice()).unwrap());
 
         match tc.test_type {
             TestType::Encrypt => {
                 buf.extend_from_slice(&tc.plaintext);
-                xts.encrypt_data_unit(tc.tweak.clone(), &mut buf).unwrap();
-                assert_eq!(tc.ciphertext, buf, "count {}", tc.count);
+                xts_enc
+                    .encrypt_data_unit(tc.tweak.clone(), &mut buf)
+                    .unwrap();
 
                 // check decryption too just for fun
-                xts.decrypt_data_unit(tc.tweak.clone(), &mut buf).unwrap();
+                xts_dec
+                    .decrypt_data_unit(tc.tweak.clone(), &mut buf)
+                    .unwrap();
                 assert_eq!(tc.plaintext, buf, "count {}", tc.count);
             }
             TestType::Decrypt => {
                 buf.extend_from_slice(&tc.ciphertext);
-                xts.decrypt_data_unit(tc.tweak.clone(), &mut buf).unwrap();
+                xts_dec
+                    .decrypt_data_unit(tc.tweak.clone(), &mut buf)
+                    .unwrap();
                 assert_eq!(tc.plaintext, buf, "count {}", tc.count);
 
-                xts.encrypt_data_unit(tc.tweak.clone(), &mut buf).unwrap();
+                xts_enc
+                    .encrypt_data_unit(tc.tweak.clone(), &mut buf)
+                    .unwrap();
                 assert_eq!(tc.ciphertext, buf, "count {}", tc.count);
             }
         }
diff --git a/nearby/presence/xts_aes/tests/xts_roundtrip.rs b/nearby/presence/xts_aes/tests/xts_roundtrip_tests.rs
similarity index 70%
rename from nearby/presence/xts_aes/tests/xts_roundtrip.rs
rename to nearby/presence/xts_aes/tests/xts_roundtrip_tests.rs
index 09bf629..042b62e 100644
--- a/nearby/presence/xts_aes/tests/xts_roundtrip.rs
+++ b/nearby/presence/xts_aes/tests/xts_roundtrip_tests.rs
@@ -13,11 +13,15 @@
 // limitations under the License.
 
 use aes::{cipher, cipher::KeyInit as _};
-use crypto_provider::{aes::*, CryptoProvider};
-use crypto_provider_rustcrypto::RustCrypto;
+use alloc::vec::Vec;
+use crypto_provider::aes::*;
+use crypto_provider_rustcrypto::aes::{Aes128, Aes256};
+use ldt_tbc::TweakableBlockCipherDecrypter;
+use ldt_tbc::TweakableBlockCipherEncrypter;
 use rand::{self, distributions, Rng as _};
 use rand_ext::seeded_rng;
-use xts_aes::*;
+use xts_aes::{Tweak, XtsAes128Key, XtsAes256Key, XtsDecrypter, XtsEncrypter, XtsKey};
+extern crate alloc;
 
 #[test]
 fn roundtrip_self() {
@@ -27,37 +31,40 @@
             let mut key = [0_u8; 32];
             rng.fill(&mut key);
             do_roundtrip(
-                build_xts_aes::<_, <RustCrypto as CryptoProvider>::Aes128>(&XtsAes128Key::from(
-                    &key,
-                )),
+                XtsEncrypter::<Aes128, _>::new(&XtsAes128Key::from(&key)),
+                XtsDecrypter::<Aes128, _>::new(&XtsAes128Key::from(&key)),
                 &mut rng,
             )
         } else {
             let mut key = [0_u8; 64];
             rng.fill(&mut key);
             do_roundtrip(
-                build_xts_aes::<_, <RustCrypto as CryptoProvider>::Aes256>(&XtsAes256Key::from(
-                    &key,
-                )),
+                XtsEncrypter::<Aes256, _>::new(&XtsAes256Key::from(&key)),
+                XtsDecrypter::<Aes256, _>::new(&XtsAes256Key::from(&key)),
                 &mut rng,
             )
         };
     }
 
-    fn do_roundtrip<A: Aes, R: rand::Rng>(xts: Xts<A>, rng: &mut R) {
+    fn do_roundtrip<A: Aes<Key = K::BlockCipherKey>, K: XtsKey, R: rand::Rng>(
+        xts_enc: XtsEncrypter<A, K>,
+        xts_dec: XtsDecrypter<A, K>,
+        rng: &mut R,
+    ) {
         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>()));
 
         let mut ciphertext = plaintext.clone();
         let tweak: Tweak = rng.gen::<u128>().into();
-        xts.encrypt_data_unit(tweak.clone(), &mut ciphertext)
+        xts_enc
+            .encrypt_data_unit(tweak.clone(), &mut ciphertext)
             .unwrap();
 
         assert_eq!(plaintext.len(), ciphertext.len());
         assert_ne!(plaintext, ciphertext);
 
-        xts.decrypt_data_unit(tweak, &mut ciphertext).unwrap();
+        xts_dec.decrypt_data_unit(tweak, &mut ciphertext).unwrap();
         assert_eq!(plaintext, ciphertext);
     }
 }
@@ -74,9 +81,8 @@
         if rng.gen() {
             let mut key = [0; 32];
             rng.fill(&mut key);
-            let xts = build_xts_aes::<_, <RustCrypto as CryptoProvider>::Aes128>(
-                &XtsAes128Key::from(&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]));
@@ -84,13 +90,12 @@
                 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, other_xts, &mut rng)
+            do_roundtrip(xts_enc, xts_dec, other_xts, &mut rng)
         } else {
             let mut key = [0; 64];
             rng.fill(&mut key);
-            let xts = build_xts_aes::<_, <RustCrypto as CryptoProvider>::Aes256>(
-                &XtsAes256Key::from(&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]));
@@ -98,16 +103,18 @@
                 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, other_xts, &mut rng)
+            do_roundtrip(xts_enc, xts_dec, other_xts, &mut rng)
         };
     }
 
     fn do_roundtrip<
-        A: Aes,
+        A: Aes<Key = K::BlockCipherKey>,
+        K: XtsKey,
         C: cipher::BlockEncrypt + cipher::BlockDecrypt + cipher::BlockCipher,
         R: rand::Rng,
     >(
-        xts: Xts<A>,
+        xts_enc: XtsEncrypter<A, K>,
+        xts_dec: XtsDecrypter<A, K>,
         other_xts: xts_mode::Xts128<C>,
         rng: &mut R,
     ) {
@@ -119,7 +126,8 @@
         // encrypt with our impl
         let mut ciphertext = plaintext.clone();
         let tweak: Tweak = rng.gen::<u128>().into();
-        xts.encrypt_data_unit(tweak.clone(), &mut ciphertext)
+        xts_enc
+            .encrypt_data_unit(tweak.clone(), &mut ciphertext)
             .unwrap();
 
         // encrypt with the other impl
@@ -130,7 +138,7 @@
         assert_eq!(ciphertext, other_ciphertext);
 
         // decrypt ciphertext in place
-        xts.decrypt_data_unit(tweak, &mut ciphertext).unwrap();
+        xts_dec.decrypt_data_unit(tweak, &mut ciphertext).unwrap();
         assert_eq!(plaintext, ciphertext);
 
         // and with the other impl
diff --git a/nearby/scripts/build-script.sh b/nearby/scripts/build-script.sh
index f9bbee5..7311df2 100755
--- a/nearby/scripts/build-script.sh
+++ b/nearby/scripts/build-script.sh
@@ -21,27 +21,31 @@
 
 # Use to generate headers for new source code files
 gen_headers() {
+  set -e
   $HOME/go/bin/addlicense -c "Google LLC" -l apache -ignore=**/android/build/** -ignore=target/** -ignore=**/target/** -ignore=".idea/*" -ignore=**/cmake-build/** -ignore="**/java/build/**" .
 }
 
 # Checks the workspace 3rd party crates and makes sure they have a valid license
 check_crate_licenses(){
+    set -e
     cd $SCRIPT_DIR/..
     cargo deny --workspace check
 }
 
 # Checks everything in beto-rust
 check_everything(){
+  set -e
   cd $SCRIPT_DIR/..
   check_license_headers
   check_workspace
-  check_ldt_ffi
   check_boringssl
+  check_ldt_ffi
   build_fuzzers
 }
 
 # Checks everything included in the top level workspace
 check_workspace(){
+  set -e
   cd $SCRIPT_DIR/..
   # ensure formatting is correct (Check for it first because it is fast compared to running tests)
   cargo fmt --check
@@ -59,6 +63,7 @@
 
 # Checks that the license auditing tool is installed and that all source files in the project contain the needed headers
 check_license_headers() {
+  set -e
   cd $SCRIPT_DIR/..
   # install location for those following the default instructions
   ADDLICENSE="$HOME/go/bin/addlicense"
@@ -75,7 +80,15 @@
     exit 1
   fi
 
-  if $ADDLICENSE -check -ignore=**/android/build/** -ignore=target/** -ignore=**/target/** -ignore=".idea/*" -ignore=**/cmake-build/** -ignore="**/java/build/**" .; then
+  if $ADDLICENSE -check \
+      -ignore="**/android/build/**" \
+      -ignore="target/**" \
+      -ignore="**/target/**" \
+      -ignore="**/.idea/**" \
+      -ignore="**/cmake-build/**" \
+      -ignore="**/java/build/**" \
+      -ignore="**/java/*/build/**" \
+      .; then
     echo "License header check succeeded!"
   else
     echo "ERROR: License header missing for above files"
@@ -85,6 +98,7 @@
 
 # Build all fuzz targets
 build_fuzzers() {
+  set -e
   cd $SCRIPT_DIR/..
   # rust fuzzers
   for fuzzed_crate in presence/xts_aes presence/ldt presence/ldt_np_adv connections/ukey2/ukey2_connections; do
@@ -99,19 +113,27 @@
 
 # Builds and runs all tests for all combinations of features for the LDT FFI
 check_ldt_ffi() {
+  set -e
   cd $SCRIPT_DIR/..
   # We need to handle ldt_np_adv_ffi separately since it requires the nightly toolchain
   cd presence/ldt_np_adv_ffi
   cargo fmt --check
   cargo check
+  # Default build, RustCrypto + no_std
   cargo build --release
+  # Turn on std, still using RustCrypto
   cargo build --features=std
-  cargo build --features=openssl
+  # Turn off default features and try to build with std
   cargo build --no-default-features --features=std
+  # 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 doc --no-deps
+  cargo clippy --release
   cargo clippy --features=std
-  cargo clippy --features=openssl
+  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 ../
@@ -122,18 +144,28 @@
   make
 
   # test with default build settings (rustcrypto, no_std)
+  echo "Testing default features (no_std + rustcrypto)"
+  (cd ../ldt_np_adv_ffi && cargo build --release)
   (cd ldt_np_c_sample/tests && ctest)
 
-  # test with openssl crypto feature flag
-  (cd ../ldt_np_adv_ffi && cargo build --features openssl --release)
-  (cd ldt_np_c_sample/tests && make && ctest)
-
-  # test with std feature flag
+  # test with std
+  echo "Testing std feature flag"
   (cd ../ldt_np_adv_ffi && cargo build --features std --release)
   (cd ldt_np_c_sample/tests && make && ctest)
 
+  # 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_c_sample/tests && make && ctest)
+
+  # test with openssl feature flag
+  echo "Testing openssl"
+  (cd ../ldt_np_adv_ffi && cargo build --no-default-features --features openssl --release)
+  (cd ldt_np_c_sample/tests && make && ctest)
+
   # test with std feature flag
-  (cd ../ldt_np_adv_ffi && cargo build --features std --no-default-features --release)
+  echo "Testing std with no default features"
+  (cd ../ldt_np_adv_ffi && cargo build --no-default-features --features std --release)
   (cd ldt_np_c_sample/tests && make && ctest)
   cd ../
 }
@@ -141,6 +173,7 @@
 # Clones boringssl and uses bindgen to generate the rust crate, applies AOSP
 # specific patches to the 3p `openssl` crate so that it can use a bssl backend
 prepare_boringssl() {
+  set -e
   cd $SCRIPT_DIR/../..
   projectroot=$PWD
   mkdir -p boringssl-build && cd boringssl-build
@@ -178,6 +211,7 @@
 # crypto_provider_boringssl is used on Chromium
 # And we want to verify that both of these are tested in our own repo
 check_boringssl() {
+  set -e
   cd $SCRIPT_DIR/../..
   # clones boringssl and uses bindgen to generate the sys bindings
   prepare_boringssl
@@ -197,6 +231,7 @@
 
 # Helper for setting up dependencies on the build machine
 setup_kokoro_macos () {
+  set -e
   go install github.com/google/addlicense@latest
   curl https://sh.rustup.rs -sSf | sh -s -- -y --no-modify-path --default-toolchain 1.68.0
   cargo install --locked cargo-deny --color never 2>&1
