Project import generated by Copybara. GitOrigin-RevId: b6ca065e6fc9504c3ff07067ef2da184afaf0c78 Change-Id: Ie3b3a5835bf622e679fd21e0a9149dd85da59aca
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)] # 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