feat: allow verify functions to build for wasm

This commit is contained in:
rvcas
2023-02-06 14:43:21 -05:00
committed by Lucas
parent 5d0c5d2a5b
commit 67a2674d27
4 changed files with 233 additions and 33 deletions

View File

@@ -31,11 +31,14 @@ strum = "0.24.1"
strum_macros = "0.24.3"
itertools = "0.10.5"
indexmap = "1.9.2"
secp256k1 = "0.26.0"
secp256k1 = { version = "0.26.0", optional = true }
k256 = { version = "0.12.0", optional = true }
[dev-dependencies]
hex = "0.4.3"
proptest = "1.0.0"
[features]
default = ["dep:secp256k1"]
wasm = ["dep:k256"]
unstable = []

View File

@@ -48,6 +48,10 @@ pub enum Error {
DeserialisationError(String, Value),
#[error("Integer overflow")]
OverflowError,
#[cfg(not(feature = "wasm"))]
#[error(transparent)]
Secp256k1(#[from] secp256k1::Error),
#[cfg(feature = "wasm")]
#[error(transparent)]
Secp256k1(#[from] k256::ecdsa::Error),
}

View File

@@ -682,21 +682,7 @@ impl DefaultFunction {
Constant::ByteString(public_key),
Constant::ByteString(message),
Constant::ByteString(signature),
) => {
use secp256k1::{ecdsa::Signature, Message, PublicKey, Secp256k1};
let secp = Secp256k1::verification_only();
let public_key = PublicKey::from_slice(public_key.as_slice())?;
let signature = Signature::from_compact(signature.as_slice())?;
let message = Message::from_slice(message.as_slice())?;
let valid = secp.verify_ecdsa(&message, &signature, &public_key);
Ok(Value::Con(Constant::Bool(valid.is_ok()).into()).into())
}
) => verify_ecdsa(public_key, message, signature),
_ => unreachable!(),
}
}
@@ -711,23 +697,7 @@ impl DefaultFunction {
Constant::ByteString(public_key),
Constant::ByteString(message),
Constant::ByteString(signature),
) => {
use secp256k1::{
schnorr::Signature, Message, Secp256k1, XOnlyPublicKey,
};
let secp = Secp256k1::verification_only();
let public_key = XOnlyPublicKey::from_slice(public_key.as_slice())?;
let signature = Signature::from_slice(signature.as_slice())?;
let message = Message::from_slice(message.as_slice())?;
let valid = secp.verify_schnorr(&signature, &message, &public_key);
Ok(Value::Con(Constant::Bool(valid.is_ok()).into()).into())
}
) => verify_schnorr(public_key, message, signature),
_ => unreachable!(),
}
}
@@ -1175,3 +1145,63 @@ pub fn convert_constr_to_tag(constr: u64) -> u64 {
todo!()
}
}
#[cfg(not(feature = "wasm"))]
fn verify_ecdsa(public_key: &[u8], message: &[u8], signature: &[u8]) -> Result<Rc<Value>, Error> {
use secp256k1::{ecdsa::Signature, Message, PublicKey, Secp256k1};
let secp = Secp256k1::verification_only();
let public_key = PublicKey::from_slice(public_key)?;
let signature = Signature::from_compact(signature)?;
let message = Message::from_slice(message)?;
let valid = secp.verify_ecdsa(&message, &signature, &public_key);
Ok(Value::Con(Constant::Bool(valid.is_ok()).into()).into())
}
#[cfg(not(feature = "wasm"))]
fn verify_schnorr(public_key: &[u8], message: &[u8], signature: &[u8]) -> Result<Rc<Value>, Error> {
use secp256k1::{schnorr::Signature, Message, Secp256k1, XOnlyPublicKey};
let secp = Secp256k1::verification_only();
let public_key = XOnlyPublicKey::from_slice(public_key)?;
let signature = Signature::from_slice(signature)?;
let message = Message::from_slice(message)?;
let valid = secp.verify_schnorr(&signature, &message, &public_key);
Ok(Value::Con(Constant::Bool(valid.is_ok()).into()).into())
}
#[cfg(feature = "wasm")]
fn verify_ecdsa(public_key: &[u8], message: &[u8], signature: &[u8]) -> Result<Rc<Value>, Error> {
use k256::ecdsa::{self, signature::Verifier};
let verifying_key = ecdsa::VerifyingKey::try_from(public_key)?;
let signature = ecdsa::Signature::try_from(signature)?;
let valid = verifying_key.verify(message, &signature);
Ok(Value::Con(Constant::Bool(valid.is_ok()).into()).into())
}
#[cfg(feature = "wasm")]
fn verify_schnorr(public_key: &[u8], message: &[u8], signature: &[u8]) -> Result<Rc<Value>, Error> {
use k256::schnorr::{self, signature::Verifier};
let verifying_key = schnorr::VerifyingKey::from_bytes(public_key)?;
let signature = schnorr::Signature::try_from(signature)?;
let valid = verifying_key.verify(message, &signature);
Ok(Value::Con(Constant::Bool(valid.is_ok()).into()).into())
}