From 56dcd48542720b3c3d88d391d72d7497d8909915 Mon Sep 17 00:00:00 2001 From: Bernd Schoolmann Date: Thu, 19 Dec 2024 14:15:47 +0100 Subject: [PATCH] Add uniffi bindings for ssh keygen and import --- Cargo.lock | 2 ++ crates/bitwarden-ssh/Cargo.toml | 4 +++- crates/bitwarden-ssh/src/generator.rs | 1 + crates/bitwarden-ssh/src/lib.rs | 4 ++++ crates/bitwarden-ssh/uniffi.toml | 9 +++++++++ crates/bitwarden-uniffi/Cargo.toml | 1 + crates/bitwarden-uniffi/src/error.rs | 7 +++++++ crates/bitwarden-uniffi/src/lib.rs | 18 ++++++++++++++++++ 8 files changed, 45 insertions(+), 1 deletion(-) create mode 100644 crates/bitwarden-ssh/uniffi.toml diff --git a/Cargo.lock b/Cargo.lock index 7f03988d..963bb0e9 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -594,6 +594,7 @@ dependencies = [ "ssh-key", "thiserror 1.0.69", "tsify-next", + "uniffi", "wasm-bindgen", ] @@ -609,6 +610,7 @@ dependencies = [ "bitwarden-fido", "bitwarden-generators", "bitwarden-send", + "bitwarden-ssh", "bitwarden-vault", "chrono", "env_logger", diff --git a/crates/bitwarden-ssh/Cargo.toml b/crates/bitwarden-ssh/Cargo.toml index e17f53e3..84f86f47 100644 --- a/crates/bitwarden-ssh/Cargo.toml +++ b/crates/bitwarden-ssh/Cargo.toml @@ -18,8 +18,9 @@ keywords.workspace = true wasm = [ "bitwarden-error/wasm", "dep:tsify-next", - "dep:wasm-bindgen" + "dep:wasm-bindgen", ] # WASM support +uniffi = ["dep:uniffi"] # Uniffi bindings [dependencies] bitwarden-error = { workspace = true } @@ -36,6 +37,7 @@ ssh-key = { version = ">=0.6.7, <0.7", features = [ ], default-features = false } thiserror = { workspace = true } tsify-next = { workspace = true, optional = true } +uniffi = { workspace = true, optional = true } wasm-bindgen = { workspace = true, optional = true } [dev-dependencies] diff --git a/crates/bitwarden-ssh/src/generator.rs b/crates/bitwarden-ssh/src/generator.rs index 51b8f9f7..0cec1f41 100644 --- a/crates/bitwarden-ssh/src/generator.rs +++ b/crates/bitwarden-ssh/src/generator.rs @@ -7,6 +7,7 @@ use crate::{error, error::KeyGenerationError, SshKey}; #[derive(Serialize, Deserialize)] #[cfg_attr(feature = "wasm", derive(Tsify), tsify(into_wasm_abi, from_wasm_abi))] +#[cfg_attr(feature = "uniffi", derive(uniffi::Enum))] pub enum KeyAlgorithm { Ed25519, Rsa3072, diff --git a/crates/bitwarden-ssh/src/lib.rs b/crates/bitwarden-ssh/src/lib.rs index 1a972efe..459d1b41 100644 --- a/crates/bitwarden-ssh/src/lib.rs +++ b/crates/bitwarden-ssh/src/lib.rs @@ -9,8 +9,12 @@ use ssh_key::{HashAlg, PrivateKey}; #[cfg(feature = "wasm")] use tsify_next::Tsify; +#[cfg(feature = "uniffi")] +uniffi::setup_scaffolding!(); + #[derive(Serialize, Deserialize, Debug)] #[cfg_attr(feature = "wasm", derive(Tsify), tsify(into_wasm_abi, from_wasm_abi))] +#[cfg_attr(feature = "uniffi", derive(uniffi::Record))] pub struct SshKey { /// The private key in OpenSSH format pub private_key: String, diff --git a/crates/bitwarden-ssh/uniffi.toml b/crates/bitwarden-ssh/uniffi.toml new file mode 100644 index 00000000..202ae0a4 --- /dev/null +++ b/crates/bitwarden-ssh/uniffi.toml @@ -0,0 +1,9 @@ +[bindings.kotlin] +package_name = "com.bitwarden.ssh" +generate_immutable_records = true +android = true + +[bindings.swift] +ffi_module_name = "BitwardenSshFFI" +module_name = "BitwardenSsh" +generate_immutable_records = true diff --git a/crates/bitwarden-uniffi/Cargo.toml b/crates/bitwarden-uniffi/Cargo.toml index 6575e6ad..bbcb5359 100644 --- a/crates/bitwarden-uniffi/Cargo.toml +++ b/crates/bitwarden-uniffi/Cargo.toml @@ -24,6 +24,7 @@ bitwarden-exporters = { workspace = true, features = ["uniffi"] } bitwarden-fido = { workspace = true, features = ["uniffi"] } bitwarden-generators = { workspace = true, features = ["uniffi"] } bitwarden-send = { workspace = true, features = ["uniffi"] } +bitwarden-ssh = { workspace = true, features = ["uniffi"] } bitwarden-vault = { workspace = true, features = ["uniffi"] } chrono = { workspace = true, features = ["std"] } env_logger = "0.11.1" diff --git a/crates/bitwarden-uniffi/src/error.rs b/crates/bitwarden-uniffi/src/error.rs index 89096e8b..f372e1e0 100644 --- a/crates/bitwarden-uniffi/src/error.rs +++ b/crates/bitwarden-uniffi/src/error.rs @@ -76,4 +76,11 @@ pub enum Error { DecryptFido2AutofillCredentials(#[from] bitwarden_fido::DecryptFido2AutofillCredentialsError), #[error(transparent)] Fido2Client(#[from] bitwarden_fido::Fido2ClientError), + + #[error(transparent)] + SshGenerationError(#[from] bitwarden_ssh::error::KeyGenerationError), + #[error(transparent)] + SshImportError(#[from] bitwarden_ssh::error::SshKeyImportError), + #[error(transparent)] + SshExportError(#[from] bitwarden_ssh::error::SshKeyExportError), } diff --git a/crates/bitwarden-uniffi/src/lib.rs b/crates/bitwarden-uniffi/src/lib.rs index 074d3992..6139f82d 100644 --- a/crates/bitwarden-uniffi/src/lib.rs +++ b/crates/bitwarden-uniffi/src/lib.rs @@ -88,6 +88,24 @@ impl Client { Ok(res.text().await.map_err(bitwarden_core::Error::Reqwest)?) } + + pub fn generate_ssh_key( + &self, + key_algorithm: bitwarden_ssh::generator::KeyAlgorithm, + ) -> Result { + let test = bitwarden_ssh::generator::generate_sshkey(key_algorithm); + let a = test.map_err(|e| error::BitwardenError::E(error::Error::SshGenerationError(e))); + a + } + + pub fn import_ssh_key( + &self, + imported_key: String, + password: Option, + ) -> Result { + bitwarden_ssh::import::import_key(imported_key, password) + .map_err(|e| error::BitwardenError::E(error::Error::SshImportError(e))) + } } fn init_logger() {