feat: full event verify in wasm
This commit is contained in:
@ -12,9 +12,10 @@ argon2 = "0.5.2"
|
||||
console_error_panic_hook = "0.1.7"
|
||||
hex = { version = "0.4.3", features = [], default-features = false }
|
||||
itertools = "0.11.0"
|
||||
secp256k1 = "0.28.0"
|
||||
secp256k1 = { version = "0.28.0", features = ["global-context"] }
|
||||
serde = { version = "1.0.188", features = ["derive"], default-features = false }
|
||||
serde-wasm-bindgen = "0.5.0"
|
||||
serde_json = "1.0.105"
|
||||
sha256 = { version = "1.4.0", features = [], default-features = false }
|
||||
wasm-bindgen = "0.2.87"
|
||||
|
||||
|
6
packages/system-wasm/pkg/system_wasm.d.ts
vendored
6
packages/system-wasm/pkg/system_wasm.d.ts
vendored
@ -46,6 +46,11 @@ export function argon2(password: any, salt: any): any;
|
||||
* @returns {boolean}
|
||||
*/
|
||||
export function schnorr_verify(hash: any, sig: any, pub_key: any): boolean;
|
||||
/**
|
||||
* @param {any} event
|
||||
* @returns {boolean}
|
||||
*/
|
||||
export function schnorr_verify_event(event: any): boolean;
|
||||
|
||||
export type InitInput = RequestInfo | URL | Response | BufferSource | WebAssembly.Module;
|
||||
|
||||
@ -59,6 +64,7 @@ export interface InitOutput {
|
||||
readonly pow: (a: number, b: number, c: number) => void;
|
||||
readonly argon2: (a: number, b: number, c: number) => void;
|
||||
readonly schnorr_verify: (a: number, b: number, c: number, d: number) => void;
|
||||
readonly schnorr_verify_event: (a: number, b: number) => void;
|
||||
readonly rustsecp256k1_v0_9_1_context_create: (a: number) => number;
|
||||
readonly rustsecp256k1_v0_9_1_context_destroy: (a: number) => void;
|
||||
readonly rustsecp256k1_v0_9_1_default_illegal_callback_fn: (a: number, b: number) => void;
|
||||
|
@ -383,6 +383,26 @@ export function schnorr_verify(hash, sig, pub_key) {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {any} event
|
||||
* @returns {boolean}
|
||||
*/
|
||||
export function schnorr_verify_event(event) {
|
||||
try {
|
||||
const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);
|
||||
wasm.schnorr_verify_event(retptr, addHeapObject(event));
|
||||
var r0 = getInt32Memory0()[retptr / 4 + 0];
|
||||
var r1 = getInt32Memory0()[retptr / 4 + 1];
|
||||
var r2 = getInt32Memory0()[retptr / 4 + 2];
|
||||
if (r2) {
|
||||
throw takeObject(r1);
|
||||
}
|
||||
return r0 !== 0;
|
||||
} finally {
|
||||
wasm.__wbindgen_add_to_stack_pointer(16);
|
||||
}
|
||||
}
|
||||
|
||||
function handleError(f, args) {
|
||||
try {
|
||||
return f.apply(this, args);
|
||||
|
Binary file not shown.
@ -9,6 +9,7 @@ export function compress(a: number, b: number): void;
|
||||
export function pow(a: number, b: number, c: number): void;
|
||||
export function argon2(a: number, b: number, c: number): void;
|
||||
export function schnorr_verify(a: number, b: number, c: number, d: number): void;
|
||||
export function schnorr_verify_event(a: number, b: number): void;
|
||||
export function rustsecp256k1_v0_9_1_context_create(a: number): number;
|
||||
export function rustsecp256k1_v0_9_1_context_destroy(a: number): void;
|
||||
export function rustsecp256k1_v0_9_1_default_illegal_callback_fn(a: number, b: number): void;
|
||||
|
@ -1,8 +1,9 @@
|
||||
extern crate console_error_panic_hook;
|
||||
|
||||
use argon2::{Argon2};
|
||||
use secp256k1::{Message, Secp256k1, XOnlyPublicKey};
|
||||
use secp256k1::{Message, XOnlyPublicKey, SECP256K1};
|
||||
use serde::{Deserialize, Serialize};
|
||||
use serde_json::json;
|
||||
use crate::filter::{FlatReqFilter, ReqFilter};
|
||||
use wasm_bindgen::prelude::*;
|
||||
|
||||
@ -106,13 +107,25 @@ pub fn schnorr_verify(hash: JsValue, sig: JsValue, pub_key: JsValue) -> Result<b
|
||||
let sig_hex: String = serde_wasm_bindgen::from_value(sig)?;
|
||||
let pub_key_hex: String = serde_wasm_bindgen::from_value(pub_key)?;
|
||||
|
||||
let secp = Secp256k1::new();
|
||||
let msg = Message::from_digest_slice(&hex::decode(msg_hex).unwrap()).unwrap();
|
||||
let key = XOnlyPublicKey::from_slice(&hex::decode(pub_key_hex).unwrap()).unwrap();
|
||||
let sig = secp256k1::schnorr::Signature::from_slice(&hex::decode(sig_hex).unwrap()).unwrap();
|
||||
Ok(secp.verify_schnorr(&sig, &msg, &key).is_ok())
|
||||
Ok(SECP256K1.verify_schnorr(&sig, &msg, &key).is_ok())
|
||||
}
|
||||
|
||||
#[wasm_bindgen]
|
||||
pub fn schnorr_verify_event(event: JsValue) -> Result<bool, JsValue> {
|
||||
console_error_panic_hook::set_once();
|
||||
let event_obj: Event = serde_wasm_bindgen::from_value(event)?;
|
||||
|
||||
let json = json!([0, event_obj.pubkey, event_obj.created_at, event_obj.kind, event_obj.tags, event_obj.content]);
|
||||
let id = sha256::digest(json.to_string().as_bytes());
|
||||
|
||||
let msg = Message::from_digest_slice(&hex::decode(id).unwrap()).unwrap();
|
||||
let key = XOnlyPublicKey::from_slice(&hex::decode(&event_obj.pubkey).unwrap()).unwrap();
|
||||
let sig = secp256k1::schnorr::Signature::from_slice(&hex::decode(&event_obj.sig.unwrap()).unwrap()).unwrap();
|
||||
Ok(SECP256K1.verify_schnorr(&sig, &msg, &key).is_ok())
|
||||
}
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
|
Reference in New Issue
Block a user