hash_based_signatures/
wasm.rs

1use crate::signature::stateless_merkle::StatelessMerkleSignatureScheme;
2use crate::signature::SignatureScheme;
3use crate::utils::{hash, slice_to_hash, string_to_hash_maybe};
4use js_sys::Uint8Array;
5
6use wasm_bindgen::prelude::*;
7
8#[wasm_bindgen]
9extern "C" {
10    pub fn alert(s: &str);
11
12    #[wasm_bindgen(js_namespace = console)]
13    fn log(s: &str);
14}
15
16#[wasm_bindgen]
17pub fn verify(file_bytes: Uint8Array, signature_bytes: Uint8Array, public_key_str: &str) -> String {
18    let file_hash = hash(&file_bytes.to_vec());
19
20    match string_to_hash_maybe(public_key_str) {
21        Ok(public_key) => match rmp_serde::from_slice(&signature_bytes.to_vec()) {
22            Ok(signature) => {
23                if StatelessMerkleSignatureScheme::verify(
24                    public_key,
25                    slice_to_hash(file_hash.as_ref()),
26                    &signature,
27                ) {
28                    "valid".into()
29                } else {
30                    "invalid_signature".into()
31                }
32            }
33            Err(_) => "cant_parse_signature".into(),
34        },
35        Err(_) => "invalid_public_key".into(),
36    }
37}