diff --git a/bindings/cashu-sdk-ffi/src/cashu_sdk.udl b/bindings/cashu-sdk-ffi/src/cashu_sdk.udl index 69e62ba1..a4d77b93 100644 --- a/bindings/cashu-sdk-ffi/src/cashu_sdk.udl +++ b/bindings/cashu-sdk-ffi/src/cashu_sdk.udl @@ -26,6 +26,11 @@ interface Amount { }; +interface Secret { + constructor(); + sequence as_bytes(); +}; + interface PublicKey { [Throws=CashuError, Name=from_hex] constructor(string hex); @@ -46,9 +51,9 @@ interface BlindedMessage { }; interface Proof { - constructor(Amount amount, string secret, PublicKey c, string? id); + constructor(Amount amount, Secret secret, PublicKey c, string? id); Amount amount(); - string secret(); + Secret secret(); PublicKey c(); string? id(); }; @@ -61,9 +66,9 @@ interface BlindedSignature { }; interface MintProof { - constructor(Amount? amount, string secret, PublicKey? c, string? id); + constructor(Amount? amount, Secret secret, PublicKey? c, string? id); Amount? amount(); - string secret(); + Secret secret(); PublicKey? c(); string? id(); @@ -94,7 +99,7 @@ interface BlindedMessages { [Throws=CashuError, Name=blank] constructor(Amount fee_reserve); sequence blinded_messages(); - sequence secrets(); + sequence secrets(); sequence rs(); sequence amounts(); }; @@ -314,7 +319,7 @@ interface Wallet { interface Mint { - constructor(string secret, string derivation_path, record inactive_keysets, sequence spent_secrets, u8 max_order); + constructor(string secret, string derivation_path, record inactive_keysets, sequence spent_secrets, u8 max_order); KeySet active_keyset_pubkeys(); KeySetResponse keysets(); MintKeySet active_keyset(); @@ -324,7 +329,7 @@ interface Mint { [Throws=CashuSdkError] SplitResponse proccess_split_request(SplitRequest split_request); [Throws=CashuSdkError] - string verify_proof(Proof proof); + void verify_proof(Proof proof); [Throws=CashuSdkError] void verify_melt_request(MeltRequest melt_request); [Throws=CashuSdkError] diff --git a/bindings/cashu-sdk-ffi/src/lib.rs b/bindings/cashu-sdk-ffi/src/lib.rs index db0bf806..0692df2d 100644 --- a/bindings/cashu-sdk-ffi/src/lib.rs +++ b/bindings/cashu-sdk-ffi/src/lib.rs @@ -10,8 +10,8 @@ mod ffi { CheckFeesRequest, CheckFeesResponse, CheckSpendableRequest, CheckSpendableResponse, InvoiceStatus, KeyPair, KeySet, KeySetResponse, Keys, MeltRequest, MeltResponse, MintInfo, MintKeySet, MintProof, MintProofs, MintRequest, MintVersion, Nut05MeltRequest, - Nut05MeltResponse, PostMintResponse, Proof, PublicKey, RequestMintResponse, SecretKey, - SplitRequest, SplitResponse, Token, + Nut05MeltResponse, PostMintResponse, Proof, PublicKey, RequestMintResponse, Secret, + SecretKey, SplitRequest, SplitResponse, Token, }; pub use crate::client::Client; diff --git a/bindings/cashu-sdk-ffi/src/mint.rs b/bindings/cashu-sdk-ffi/src/mint.rs index 0e75b295..0f13b2e7 100644 --- a/bindings/cashu-sdk-ffi/src/mint.rs +++ b/bindings/cashu-sdk-ffi/src/mint.rs @@ -9,7 +9,8 @@ use cashu_sdk::mint::Mint as MintSdk; use crate::error::Result; use cashu_ffi::{ Amount, CheckSpendableRequest, CheckSpendableResponse, KeySet, KeySetResponse, MeltRequest, - MeltResponse, MintKeySet, MintRequest, PostMintResponse, Proof, SplitRequest, SplitResponse, + MeltResponse, MintKeySet, MintRequest, PostMintResponse, Proof, Secret, SplitRequest, + SplitResponse, }; pub struct Mint { @@ -21,10 +22,13 @@ impl Mint { secret: String, derivation_path: String, inactive_keysets: HashMap>, - spent_secrets: Vec, + spent_secrets: Vec>, max_order: u8, ) -> Self { - let spent_secrets = spent_secrets.into_iter().collect(); + let spent_secrets = spent_secrets + .into_iter() + .map(|s| s.as_ref().deref().clone()) + .collect(); let inactive_keysets = inactive_keysets .into_iter() @@ -89,7 +93,7 @@ impl Mint { )) } - pub fn verify_proof(&self, proof: Arc) -> Result { + pub fn verify_proof(&self, proof: Arc) -> Result<()> { Ok(self .inner .read() diff --git a/crates/cashu-sdk/src/mint.rs b/crates/cashu-sdk/src/mint.rs index 8eecf028..41bef547 100644 --- a/crates/cashu-sdk/src/mint.rs +++ b/crates/cashu-sdk/src/mint.rs @@ -14,14 +14,15 @@ use cashu::nuts::nut07::CheckSpendableResponse; use cashu::nuts::nut08::MeltRequest; use cashu::nuts::nut08::MeltResponse; use cashu::nuts::*; +use cashu::secret::Secret; use cashu::Amount; pub struct Mint { // pub pubkey: PublicKey, pub active_keyset: nut02::mint::KeySet, pub inactive_keysets: HashMap, - pub spent_secrets: HashSet, - pub pending_secrets: HashSet, + pub spent_secrets: HashSet, + pub pending_secrets: HashSet, } impl Mint { @@ -29,7 +30,7 @@ impl Mint { secret: &str, derivation_path: &str, inactive_keysets: HashMap, - spent_secrets: HashSet, + spent_secrets: HashSet, max_order: u8, ) -> Self { Self { @@ -126,7 +127,7 @@ impl Mint { let proof_count = split_request.proofs.len(); - let secrets: HashSet = split_request.proofs.into_iter().map(|p| p.secret).collect(); + let secrets: HashSet = split_request.proofs.into_iter().map(|p| p.secret).collect(); // Check that there are no duplicate proofs in request if secrets.len().ne(&proof_count) { @@ -190,7 +191,7 @@ impl Mint { }; verify_message( - keypair.secret_key.to_owned().into(), + keypair.secret_key.clone().into(), proof.c.clone().into(), &proof.secret, )?; @@ -225,11 +226,7 @@ impl Mint { return Err(Error::Amount); } - let secrets: HashSet<&str> = melt_request - .proofs - .iter() - .map(|p| p.secret.as_str()) - .collect(); + let secrets: HashSet<&Secret> = melt_request.proofs.iter().map(|p| &p.secret).collect(); // Ensure proofs are unique and not being double spent if melt_request.proofs.len().ne(&secrets.len()) { diff --git a/crates/cashu/src/dhke.rs b/crates/cashu/src/dhke.rs index cb1625ab..2f87f0c0 100644 --- a/crates/cashu/src/dhke.rs +++ b/crates/cashu/src/dhke.rs @@ -128,7 +128,7 @@ pub fn sign_message( pub fn verify_message( a: SecretKey, unblinded_message: k256::PublicKey, - msg: Secret, + msg: &Secret, ) -> Result<(), error::mint::Error> { // Y let y = hash_to_curve(msg.as_bytes()); @@ -273,6 +273,6 @@ mod tests { // C let c = unblind_message(signed.into(), blinded.1, bob_pub.into()).unwrap(); - assert!(verify_message(bob_sec, c.into(), x).is_ok()); + assert!(verify_message(bob_sec, c.into(), &x).is_ok()); } }