feat: allow verify functions to build for wasm
This commit is contained in:
@@ -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 = []
|
||||
|
||||
@@ -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),
|
||||
}
|
||||
|
||||
@@ -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())
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user