From e5eca1fe65cd2b6fe8485840970057a1294a4d6b Mon Sep 17 00:00:00 2001 From: Hatter Jiang Date: Wed, 14 May 2025 23:13:15 +0800 Subject: [PATCH] feat: 1.2.0 --- Cargo.toml | 2 +- examples/external_public_key.rs | 10 ++++++++ examples/external_spec.rs | 6 +++++ src/lib.rs | 45 +++++++++++++++++++++++++++++++++ 4 files changed, 62 insertions(+), 1 deletion(-) create mode 100644 examples/external_public_key.rs create mode 100644 examples/external_spec.rs diff --git a/Cargo.toml b/Cargo.toml index ded0826..99cfe27 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "swift-secure-enclave-tool-rs" -version = "1.1.0" +version = "1.2.0" edition = "2024" authors = ["Hatter Jiang"] repository = "https://git.hatter.ink/hatter/swift-secure-enclave-tool-rs" diff --git a/examples/external_public_key.rs b/examples/external_public_key.rs new file mode 100644 index 0000000..ea0e4b0 --- /dev/null +++ b/examples/external_public_key.rs @@ -0,0 +1,10 @@ +use swift_secure_enclave_tool_rs::external_public_key; + +fn main() { + let args = std::env::args().collect::>(); + let parameter = &args[1]; + + let public_key = external_public_key("card-cli", parameter).unwrap(); + + println!("{}", hex::encode(&public_key)); +} diff --git a/examples/external_spec.rs b/examples/external_spec.rs new file mode 100644 index 0000000..e6e47a8 --- /dev/null +++ b/examples/external_spec.rs @@ -0,0 +1,6 @@ +use swift_secure_enclave_tool_rs::external_spec; + +fn main() { + let shared_secret = external_spec("card-cli").unwrap(); + println!("{:?}", shared_secret); +} diff --git a/src/lib.rs b/src/lib.rs index 4570d03..05dc0d8 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -78,6 +78,21 @@ struct DhResult { pub shared_secret_hex: String, } +#[derive(Debug, Deserialize)] +pub struct ExternalSpec { + #[allow(dead_code)] + pub success: bool, + pub agent: String, + pub specification: String, +} + +#[derive(Debug, Deserialize)] +struct ExternalPublicKey { + #[allow(dead_code)] + pub success: bool, + pub public_key_base64: String, +} + pub fn is_secure_enclave_supported() -> XResult { let mut cmd = Command::new(SWIFT_SECURE_ENCLAVE_TOOL_CMD); cmd.arg("is_support_secure_enclave"); @@ -178,6 +193,36 @@ pub fn external_ecdh(external_command: &str, parameter: &str, ephemera_public_ke parse_ecdh_result(&cmd_stdout) } +pub fn external_spec(external_command: &str) -> XResult { + let mut cmd = Command::new(external_command); + cmd.arg("external_spec"); + + let cmd_stdout = run_command_stdout(cmd)?; + if is_success(&cmd_stdout)? { + let external_spec: ExternalSpec = from_str(&cmd_stdout)?; + Ok(external_spec) + } else { + let error_result: ErrorResult = from_str(&cmd_stdout)?; + simple_error!("{}", error_result.error) + } +} + +pub fn external_public_key(external_command: &str, parameter: &str) -> XResult> { + let mut cmd = Command::new(external_command); + cmd.arg("external_public_key"); + cmd.arg("--parameter"); + cmd.arg(parameter); + + let cmd_stdout = run_command_stdout(cmd)?; + if is_success(&cmd_stdout)? { + let external_public_key: ExternalPublicKey = from_str(&cmd_stdout)?; + Ok(STANDARD.decode(&external_public_key.public_key_base64)?) + } else { + let error_result: ErrorResult = from_str(&cmd_stdout)?; + simple_error!("{}", error_result.error) + } +} + fn run_command_stdout(cmd: Command) -> XResult { let output = run_command(cmd)?; let stdout_text = opt_result!(String::from_utf8(output.stdout), "Parse stdout failed:{}");