From 7c0235ab26b4cb2fa724a2c6ce39211a287d06e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C4=99drzej=20Stuczy=C5=84ski?= Date: Thu, 19 Sep 2024 10:06:59 +0100 Subject: [PATCH] fixed wasm build and trait impl --- .../src/backend/mem_backend.rs | 3 +- .../src/registration/handshake/messages.rs | 3 +- .../src/storage/core_client_traits.rs | 29 ++++++++++++++++-- common/wasm/client-core/src/storage/types.rs | 4 ++- .../src/storage/wasm_client_traits.rs | 18 +++++++++++ nym-wallet/Cargo.lock | 30 ++++++++++++++++--- sdk/lib/socks5-listener/src/persistence.rs | 14 +++++++-- .../examples/manually_handle_storage.rs | 26 ++++++++++++++-- wasm/node-tester/src/tester.rs | 2 +- 9 files changed, 115 insertions(+), 14 deletions(-) diff --git a/common/client-core/gateways-storage/src/backend/mem_backend.rs b/common/client-core/gateways-storage/src/backend/mem_backend.rs index 14fee876db..70560995e9 100644 --- a/common/client-core/gateways-storage/src/backend/mem_backend.rs +++ b/common/client-core/gateways-storage/src/backend/mem_backend.rs @@ -103,13 +103,14 @@ impl GatewaysDetailsStore for InMemGatewaysDetails { ) -> Result<(), Self::StorageError> { let mut guard = self.inner.write().await; + #[allow(clippy::unwrap_used)] if let Some(target) = guard.gateways.get_mut(&gateway_id.to_string()) { let GatewayDetails::Remote(details) = &mut target.details else { return Ok(()); }; assert_eq!(Arc::strong_count(&details.shared_key), 1); - // eh. that's nasty, but it's only ever for ephemeral clients so should be fine for now... + // eh. that's nasty, but it's only ever used for ephemeral clients so should be fine for now... details.shared_key = Arc::new(SharedGatewayKey::Current( SharedSymmetricKey::try_from_bytes(updated_key.as_bytes()).unwrap(), )) diff --git a/common/gateway-requests/src/registration/handshake/messages.rs b/common/gateway-requests/src/registration/handshake/messages.rs index 6f64c561b0..10dda7edaf 100644 --- a/common/gateway-requests/src/registration/handshake/messages.rs +++ b/common/gateway-requests/src/registration/handshake/messages.rs @@ -25,6 +25,7 @@ pub struct Initialisation { } impl Initialisation { + #[cfg(not(target_arch = "wasm32"))] pub fn is_legacy(&self) -> bool { self.initiator_salt.is_none() } @@ -78,7 +79,7 @@ impl HandshakeMessage for Initialisation { .chain(self.ephemeral_dh.to_bytes()); if let Some(salt) = self.initiator_salt { - bytes.chain(salt.into_iter()).collect() + bytes.chain(salt).collect() } else { bytes.collect() } diff --git a/common/wasm/client-core/src/storage/core_client_traits.rs b/common/wasm/client-core/src/storage/core_client_traits.rs index 20105ac339..3824b6e9be 100644 --- a/common/wasm/client-core/src/storage/core_client_traits.rs +++ b/common/wasm/client-core/src/storage/core_client_traits.rs @@ -15,6 +15,8 @@ use nym_client_core::client::key_manager::persistence::KeyStore; use nym_client_core::client::key_manager::ClientKeys; use nym_client_core::client::replies::reply_storage::browser_backend; use nym_credential_storage::ephemeral_storage::EphemeralStorage as EphemeralCredentialStorage; +use nym_crypto::asymmetric::ed25519::PublicKey; +use nym_gateway_client::SharedSymmetricKey; use wasm_utils::console_log; // temporary until other variants are properly implemented (probably it should get changed into `ClientStorage` @@ -43,8 +45,18 @@ impl MixnetClientStorage for FullWasmClientStorage { type GatewaysDetailsStore = ClientStorage; - fn into_runtime_stores(self) -> (Self::ReplyStore, Self::CredentialStore) { - (self.reply_storage, self.credential_storage) + fn into_runtime_stores( + self, + ) -> ( + Self::ReplyStore, + Self::CredentialStore, + Self::GatewaysDetailsStore, + ) { + ( + self.reply_storage, + self.credential_storage, + self.keys_and_gateway_store, + ) } fn key_store(&self) -> &Self::KeyStore { @@ -142,6 +154,19 @@ impl GatewaysDetailsStore for ClientStorage { self.store_registered_gateway(&raw_registration).await } + async fn upgrade_stored_remote_gateway_key( + &self, + gateway_id: PublicKey, + updated_key: &SharedSymmetricKey, + ) -> Result<(), Self::StorageError> { + self.update_remote_gateway_key( + &gateway_id.to_base58_string(), + None, + Some(updated_key.as_bytes()), + ) + .await + } + async fn remove_gateway_details(&self, gateway_id: &str) -> Result<(), Self::StorageError> { self.remove_registered_gateway(gateway_id).await } diff --git a/common/wasm/client-core/src/storage/types.rs b/common/wasm/client-core/src/storage/types.rs index c59d729589..b94f04f651 100644 --- a/common/wasm/client-core/src/storage/types.rs +++ b/common/wasm/client-core/src/storage/types.rs @@ -8,12 +8,14 @@ use nym_gateway_client::SharedGatewayKey; use serde::{Deserialize, Serialize}; use std::ops::Deref; use time::OffsetDateTime; +use zeroize::Zeroize; // a more nested struct since we only have a single gateway type in wasm (no 'custom') -#[derive(Debug, Clone, Serialize, Deserialize)] +#[derive(Debug, Clone, Serialize, Deserialize, Zeroize)] pub struct WasmRawRegisteredGateway { pub gateway_id_bs58: String, + #[zeroize(skip)] pub registration_timestamp: OffsetDateTime, pub derived_aes128_ctr_blake3_hmac_keys_bs58: Option, diff --git a/common/wasm/client-core/src/storage/wasm_client_traits.rs b/common/wasm/client-core/src/storage/wasm_client_traits.rs index 7c1b8e3e02..677056498e 100644 --- a/common/wasm/client-core/src/storage/wasm_client_traits.rs +++ b/common/wasm/client-core/src/storage/wasm_client_traits.rs @@ -10,6 +10,7 @@ use std::error::Error; use thiserror::Error; use wasm_bindgen::JsValue; use wasm_storage::traits::BaseWasmStorage; +use zeroize::Zeroize; // v1 tables pub(crate) mod v1 { @@ -228,6 +229,23 @@ pub trait WasmClientStorage: BaseWasmStorage { .map_err(Into::into) } + async fn update_remote_gateway_key( + &self, + gateway_id_bs58: &str, + derived_aes128_ctr_blake3_hmac_keys_bs58: Option<&str>, + derived_aes256_gcm_siv_key: Option<&[u8]>, + ) -> Result<(), ::StorageError> { + if let Some(mut current) = self.maybe_get_registered_gateway(gateway_id_bs58).await? { + current.derived_aes128_ctr_blake3_hmac_keys_bs58 = + derived_aes128_ctr_blake3_hmac_keys_bs58.map(|k| k.to_string()); + current.derived_aes256_gcm_siv_key = derived_aes256_gcm_siv_key.map(|k| k.to_vec()); + self.store_registered_gateway(¤t).await?; + current.zeroize(); + } + + Ok(()) + } + async fn remove_registered_gateway( &self, gateway_id: &str, diff --git a/nym-wallet/Cargo.lock b/nym-wallet/Cargo.lock index e4e79726d3..f949feda83 100644 --- a/nym-wallet/Cargo.lock +++ b/nym-wallet/Cargo.lock @@ -1930,14 +1930,14 @@ dependencies = [ [[package]] name = "getset" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e45727250e75cc04ff2846a66397da8ef2b3db8e40e0cef4df67950a07621eb9" +checksum = "f636605b743120a8d32ed92fc27b6cde1a769f8f936c065151eb66f88ded513c" dependencies = [ - "proc-macro-error", + "proc-macro-error2", "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.55", ] [[package]] @@ -4130,6 +4130,28 @@ dependencies = [ "version_check", ] +[[package]] +name = "proc-macro-error-attr2" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96de42df36bb9bba5542fe9f1a054b8cc87e172759a1868aa05c1f3acc89dfc5" +dependencies = [ + "proc-macro2", + "quote", +] + +[[package]] +name = "proc-macro-error2" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11ec05c52be0a07b08061f7dd003e7d7092e0472bc731b4af7bb1ef876109802" +dependencies = [ + "proc-macro-error-attr2", + "proc-macro2", + "quote", + "syn 2.0.55", +] + [[package]] name = "proc-macro-hack" version = "0.5.20+deprecated" diff --git a/sdk/lib/socks5-listener/src/persistence.rs b/sdk/lib/socks5-listener/src/persistence.rs index 9ee4990e6c..77a903144a 100644 --- a/sdk/lib/socks5-listener/src/persistence.rs +++ b/sdk/lib/socks5-listener/src/persistence.rs @@ -22,8 +22,18 @@ impl MixnetClientStorage for MobileClientStorage { type CredentialStore = EphemeralCredentialStorage; type GatewaysDetailsStore = InMemGatewaysDetails; - fn into_runtime_stores(self) -> (Self::ReplyStore, Self::CredentialStore) { - (self.reply_store, self.credential_store) + fn into_runtime_stores( + self, + ) -> ( + Self::ReplyStore, + Self::CredentialStore, + Self::GatewaysDetailsStore, + ) { + ( + self.reply_store, + self.credential_store, + self.gateway_details_store, + ) } fn key_store(&self) -> &Self::KeyStore { diff --git a/sdk/rust/nym-sdk/examples/manually_handle_storage.rs b/sdk/rust/nym-sdk/examples/manually_handle_storage.rs index 298502458c..a7fb182743 100644 --- a/sdk/rust/nym-sdk/examples/manually_handle_storage.rs +++ b/sdk/rust/nym-sdk/examples/manually_handle_storage.rs @@ -1,3 +1,5 @@ +use nym_crypto::asymmetric::ed25519::PublicKey; +use nym_gateway_requests::SharedSymmetricKey; use nym_sdk::mixnet::{ self, ActiveGateway, BadGateway, ClientKeys, EmptyReplyStorage, EphemeralCredentialStorage, GatewayRegistration, GatewaysDetailsStore, KeyStore, MixnetClientStorage, MixnetMessageSender, @@ -63,8 +65,18 @@ impl MixnetClientStorage for MockClientStorage { type CredentialStore = EphemeralCredentialStorage; type GatewaysDetailsStore = MockGatewayDetailsStore; - fn into_runtime_stores(self) -> (Self::ReplyStore, Self::CredentialStore) { - (self.reply_store, self.credential_store) + fn into_runtime_stores( + self, + ) -> ( + Self::ReplyStore, + Self::CredentialStore, + Self::GatewaysDetailsStore, + ) { + ( + self.reply_store, + self.credential_store, + self.gateway_details_store, + ) } fn key_store(&self) -> &Self::KeyStore { @@ -151,6 +163,16 @@ impl GatewaysDetailsStore for MockGatewayDetailsStore { Ok(()) } + async fn upgrade_stored_remote_gateway_key( + &self, + gateway_id: PublicKey, + _updated_key: &SharedSymmetricKey, + ) -> Result<(), Self::StorageError> { + println!("upgrading gateway key for {gateway_id}"); + + Err(MyError) + } + async fn remove_gateway_details(&self, _gateway_id: &str) -> Result<(), Self::StorageError> { println!("removing gateway details"); diff --git a/wasm/node-tester/src/tester.rs b/wasm/node-tester/src/tester.rs index 43ff55d7bf..5d4958fa9f 100644 --- a/wasm/node-tester/src/tester.rs +++ b/wasm/node-tester/src/tester.rs @@ -221,7 +221,7 @@ impl NymNodeTesterBuilder { .await?; } gateway_client.claim_initial_bandwidth().await?; - gateway_client.start_listening_for_mixnet_messages().await?; + gateway_client.start_listening_for_mixnet_messages()?; // TODO: make those values configurable later let tester = NodeTester::new(