Skip to content

Commit

Permalink
[PM-16221] uniffi bindings for ssh agent and keygen (#89)
Browse files Browse the repository at this point in the history
## 🎟️ Tracking

https://bitwarden.atlassian.net/browse/PM-16221

## 📔 Objective

Adds bindings so we can add keygen and import to the mobile clients.



## ⏰ Reminders before review

- Contributor guidelines followed
- All formatters and local linters executed and passed
- Written new unit and / or integration tests where applicable
- Protected functional changes with optionality (feature flags)
- Used internationalization (i18n) for all UI strings
- CI builds passed
- Communicated to DevOps any deployment requirements
- Updated any necessary documentation (Confluence, contributing docs) or
informed the documentation
  team

## 🦮 Reviewer guidelines

<!-- Suggested interactions but feel free to use (or not) as you desire!
-->

- 👍 (`:+1:`) or similar for great changes
- 📝 (`:memo:`) or ℹ️ (`:information_source:`) for notes or general info
- ❓ (`:question:`) for questions
- 🤔 (`:thinking:`) or 💭 (`:thought_balloon:`) for more open inquiry
that's not quite a confirmed
  issue and could potentially benefit from discussion
- 🎨 (`:art:`) for suggestions / improvements
- ❌ (`:x:`) or ⚠️ (`:warning:`) for more significant problems or
concerns needing attention
- 🌱 (`:seedling:`) or ♻️ (`:recycle:`) for future improvements or
indications of technical debt
- ⛏ (`:pick:`) for minor or nitpick changes
  • Loading branch information
quexten authored Jan 10, 2025
1 parent 73747b6 commit 203e538
Show file tree
Hide file tree
Showing 10 changed files with 62 additions and 1 deletion.
2 changes: 2 additions & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 2 additions & 0 deletions crates/bitwarden-ssh/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ wasm = [
"dep:tsify-next",
"dep:wasm-bindgen"
] # WASM support
uniffi = ["dep:uniffi"] # Uniffi bindings

[dependencies]
bitwarden-error = { workspace = true }
Expand All @@ -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]
Expand Down
1 change: 1 addition & 0 deletions crates/bitwarden-ssh/src/generator.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
4 changes: 4 additions & 0 deletions crates/bitwarden-ssh/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
9 changes: 9 additions & 0 deletions crates/bitwarden-ssh/uniffi.toml
Original file line number Diff line number Diff line change
@@ -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
1 change: 1 addition & 0 deletions crates/bitwarden-uniffi/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down
5 changes: 5 additions & 0 deletions crates/bitwarden-uniffi/src/error.rs
Original file line number Diff line number Diff line change
Expand Up @@ -76,4 +76,9 @@ pub enum Error {
DecryptFido2AutofillCredentials(#[from] bitwarden_fido::DecryptFido2AutofillCredentialsError),
#[error(transparent)]
Fido2Client(#[from] bitwarden_fido::Fido2ClientError),

#[error(transparent)]
SshGeneration(#[from] bitwarden_ssh::error::KeyGenerationError),
#[error(transparent)]
SshImport(#[from] bitwarden_ssh::error::SshKeyImportError),
}
7 changes: 6 additions & 1 deletion crates/bitwarden-uniffi/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ mod android_support;
use crypto::CryptoClient;
use error::Result;
use platform::PlatformClient;
use tool::{ExporterClient, GeneratorClients, SendClient};
use tool::{ExporterClient, GeneratorClients, SendClient, SshClient};
use vault::VaultClient;

#[derive(uniffi::Object)]
Expand Down Expand Up @@ -67,6 +67,11 @@ impl Client {
Arc::new(SendClient(self))
}

/// SSH operations
pub fn ssh(self: Arc<Self>) -> Arc<SshClient> {
Arc::new(SshClient(self))
}

/// Auth operations
pub fn auth(self: Arc<Self>) -> Arc<AuthClient> {
Arc::new(AuthClient(self))
Expand Down
3 changes: 3 additions & 0 deletions crates/bitwarden-uniffi/src/tool/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,9 @@ use crate::{
mod sends;
pub use sends::SendClient;

mod ssh;
pub use ssh::SshClient;

#[derive(uniffi::Object)]
pub struct GeneratorClients(pub(crate) Arc<Client>);

Expand Down
29 changes: 29 additions & 0 deletions crates/bitwarden-uniffi/src/tool/ssh.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
use std::sync::Arc;

use crate::{
error::{BitwardenError, Error},
Client, Result,
};

#[derive(uniffi::Object)]
pub struct SshClient(pub Arc<Client>);

#[uniffi::export]
impl SshClient {
pub fn generate_ssh_key(
&self,
key_algorithm: bitwarden_ssh::generator::KeyAlgorithm,
) -> Result<bitwarden_ssh::SshKey> {
bitwarden_ssh::generator::generate_sshkey(key_algorithm)
.map_err(|e| BitwardenError::E(Error::SshGeneration(e)))
}

pub fn import_ssh_key(
&self,
imported_key: String,
password: Option<String>,
) -> Result<bitwarden_ssh::SshKey> {
bitwarden_ssh::import::import_key(imported_key, password)
.map_err(|e| BitwardenError::E(Error::SshImport(e)))
}
}

0 comments on commit 203e538

Please sign in to comment.