feat: use secp256k1 to implement verify for ecdsa and schnorr
This commit is contained in:
parent
cde3e31723
commit
31cd19f198
|
@ -103,8 +103,8 @@ impl DefaultFunction {
|
||||||
DefaultFunction::Sha3_256 => 1,
|
DefaultFunction::Sha3_256 => 1,
|
||||||
DefaultFunction::Blake2b_256 => 1,
|
DefaultFunction::Blake2b_256 => 1,
|
||||||
DefaultFunction::VerifyEd25519Signature => 3,
|
DefaultFunction::VerifyEd25519Signature => 3,
|
||||||
DefaultFunction::VerifyEcdsaSecp256k1Signature => todo!(),
|
DefaultFunction::VerifyEcdsaSecp256k1Signature => 3,
|
||||||
DefaultFunction::VerifySchnorrSecp256k1Signature => todo!(),
|
DefaultFunction::VerifySchnorrSecp256k1Signature => 3,
|
||||||
DefaultFunction::AppendString => 2,
|
DefaultFunction::AppendString => 2,
|
||||||
DefaultFunction::EqualsString => 2,
|
DefaultFunction::EqualsString => 2,
|
||||||
DefaultFunction::EncodeUtf8 => 1,
|
DefaultFunction::EncodeUtf8 => 1,
|
||||||
|
@ -683,14 +683,48 @@ impl DefaultFunction {
|
||||||
Constant::ByteString(message),
|
Constant::ByteString(message),
|
||||||
Constant::ByteString(signature),
|
Constant::ByteString(signature),
|
||||||
) => {
|
) => {
|
||||||
use k256::ecdsa::{self, signature::Verifier};
|
use secp256k1::{ecdsa::Signature, Message, PublicKey, Secp256k1};
|
||||||
|
|
||||||
let verifying_key =
|
let secp = Secp256k1::verification_only();
|
||||||
ecdsa::VerifyingKey::try_from(public_key.as_slice())?;
|
|
||||||
|
|
||||||
let signature = ecdsa::Signature::try_from(signature.as_slice())?;
|
let public_key = PublicKey::from_slice(public_key.as_slice())?;
|
||||||
|
|
||||||
let valid = verifying_key.verify(message, &signature);
|
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())
|
||||||
|
}
|
||||||
|
_ => unreachable!(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_ => unreachable!(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
DefaultFunction::VerifySchnorrSecp256k1Signature => {
|
||||||
|
match (args[0].as_ref(), args[1].as_ref(), args[2].as_ref()) {
|
||||||
|
(Value::Con(public_key), Value::Con(message), Value::Con(signature)) => {
|
||||||
|
match (public_key.as_ref(), message.as_ref(), signature.as_ref()) {
|
||||||
|
(
|
||||||
|
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())
|
Ok(Value::Con(Constant::Bool(valid.is_ok()).into()).into())
|
||||||
}
|
}
|
||||||
|
@ -700,7 +734,6 @@ impl DefaultFunction {
|
||||||
_ => unreachable!(),
|
_ => unreachable!(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
DefaultFunction::VerifySchnorrSecp256k1Signature => todo!(),
|
|
||||||
DefaultFunction::AppendString => match (args[0].as_ref(), args[1].as_ref()) {
|
DefaultFunction::AppendString => match (args[0].as_ref(), args[1].as_ref()) {
|
||||||
(Value::Con(string1), Value::Con(string2)) => {
|
(Value::Con(string1), Value::Con(string2)) => {
|
||||||
match (string1.as_ref(), string2.as_ref()) {
|
match (string1.as_ref(), string2.as_ref()) {
|
||||||
|
|
Loading…
Reference in New Issue