feat: Add SigSocket integration with WASM client and JavaScript bridge for sign requests

This commit is contained in:
Sameh Abouel-saad
2025-06-04 16:11:53 +03:00
parent 9f143ded9d
commit 4e1e707f85
8 changed files with 436 additions and 80 deletions

View File

@@ -24,7 +24,6 @@ use error::VaultError;
pub use kvstore::traits::KVStore;
use crate::crypto::cipher::{decrypt_chacha20, encrypt_chacha20};
use signature::SignatureEncoding;
// TEMP: File-based debug logger for crypto troubleshooting
use log::debug;
@@ -230,7 +229,7 @@ impl<S: KVStore> Vault<S> {
let seed = kdf::keyspace_key(password, salt);
// 2. Generate Secp256k1 keypair from the seed
use k256::ecdsa::{SigningKey, VerifyingKey, signature::hazmat::PrehashSigner};
use k256::ecdsa::{SigningKey, VerifyingKey};
// Use the seed as the private key directly (32 bytes)
let mut secret_key_bytes = [0u8; 32];
@@ -466,14 +465,15 @@ impl<S: KVStore> Vault<S> {
Ok(sig.to_bytes().to_vec())
}
KeyType::Secp256k1 => {
use k256::ecdsa::{signature::Signer, SigningKey};
use k256::ecdsa::{signature::Signer, SigningKey, Signature};
let arr: &[u8; 32] = key.private_key.as_slice().try_into().map_err(|_| {
VaultError::Crypto("Invalid secp256k1 private key length".to_string())
})?;
let sk = SigningKey::from_bytes(arr.into())
.map_err(|e| VaultError::Crypto(e.to_string()))?;
let sig: k256::ecdsa::DerSignature = sk.sign(message);
Ok(sig.to_vec())
let sig: Signature = sk.sign(message);
// Return compact signature (64 bytes) instead of DER format
Ok(sig.to_bytes().to_vec())
}
}
}
@@ -517,7 +517,11 @@ impl<S: KVStore> Vault<S> {
use k256::ecdsa::{signature::Verifier, Signature, VerifyingKey};
let pk = VerifyingKey::from_sec1_bytes(&key.public_key)
.map_err(|e| VaultError::Crypto(e.to_string()))?;
let sig = Signature::from_der(signature)
// Use compact format (64 bytes) instead of DER
let sig_array: &[u8; 64] = signature.try_into().map_err(|_| {
VaultError::Crypto("Invalid secp256k1 signature length".to_string())
})?;
let sig = Signature::from_bytes(sig_array.into())
.map_err(|e| VaultError::Crypto(e.to_string()))?;
Ok(pk.verify(message, &sig).is_ok())
}