Files
pezkuwi-wasm/packages/wasm-crypto/src/lib.rs
T
Satoshi Qazi Muhammed d0520842dc Move wasm-crypto off the crate versions with advisories
curve25519-dalek 2/3 -> 4.1.3 (timing variability in Scalar52::sub, on
every signature), ed25519-dalek 1 -> 2, schnorrkel 0.9 -> 0.11, merlin
2 -> 3, secp256k1 0.21 -> 0.29, tiny-bip39 0.7 -> 1.0 (drops failure),
keccak 0.1.6, rand 0.8. wee_alloc is unmaintained and is no longer the
global allocator. OSV: 9 crates with advisories before, 0 after.

secp256k1 is built with lowmemory: newer libsecp256k1 embeds about 1 MB
of precomputed tables, which would have quadrupled the wasm. The
signatures are the same; recovery uses a smaller window.

getrandom 0.2 is used with a custom backend that calls one fixed
import, wbg.ext_fill_random, which the bridge fills from
@pezkuwi/x-randomvalues. The getrandom "js" backend would have needed a
dozen new hashed wasm-bindgen imports in the bridge; the wasm now has
one import instead of 18.

The recorded known answers still hold, and signatures made by either
build verify in the other.
2026-10-12 06:17:29 +04:00

47 lines
1.1 KiB
Rust

// Copyright 2019-2025 @pezkuwi/wasm-crypto authors & contributors
// SPDX-License-Identifier: Apache-2.0
// Randomness comes from the host: the bridge fills the buffer with
// getRandomValues from @pezkuwi/x-randomvalues. It is one import with a fixed
// name, so the bridge does not have to track the hashed names wasm-bindgen
// gives the getrandom "js" backend.
#[cfg(target_arch = "wasm32")]
mod random {
#[link(wasm_import_module = "wbg")]
extern "C" {
fn ext_fill_random(ptr: *mut u8, len: usize);
}
fn fill(buf: &mut [u8]) -> Result<(), getrandom::Error> {
// getRandomValues fills at most 65536 bytes per call
for chunk in buf.chunks_mut(65536) {
unsafe { ext_fill_random(chunk.as_mut_ptr(), chunk.len()) };
}
Ok(())
}
getrandom::register_custom_getrandom!(fill);
}
#[path = "rs/bip39.rs"]
pub mod bip39;
#[path = "rs/ed25519.rs"]
pub mod ed25519;
#[path = "rs/hashing.rs"]
pub mod hashing;
#[path = "rs/secp256k1.rs"]
pub mod secp256k1;
#[path = "rs/sr25519.rs"]
pub mod sr25519;
#[path = "rs/vrf.rs"]
pub mod vrf;
#[path = "rs/kat.rs"]
pub mod kat;