mirror of
https://github.com/pezkuwichain/pezkuwi-wasm.git
synced 2026-11-10 01:57:05 +00:00
7.5.15-7.5.18 shipped a wasm built from a separate sr25519-only module
(4 exports) and replaced every other function in bundle.ts with a stub
that throws "not yet implemented": ed25519 pair/sign/verify, sr25519
agree and hard/soft derivation, VRF, and all of secp256k1. Because the
wasm still initialised, isReady() was true and @pezkuwi/util-crypto
called those stubs instead of falling back to JS, so ed25519 and
ethereum accounts and any // derivation failed at runtime wherever the
package is used. bip39Generate threw as well, and bip39ToSeed hashed with
SHA-256 where BIP39 specifies SHA-512.
The Rust in packages/wasm-crypto/src/rs already implemented all of it,
with sr25519 under the "bizinikiwi" context. This builds that crate and
binds it again:
- bundle.ts: the withWasm bindings for every ext_* export, as in
b61206c; getSigningContext() kept, returning "bizinikiwi".
- wasm-bridge: wasm-bindgen 0.2.90 passes an alignment to
__wbindgen_malloc/__wbindgen_free (without it Rust aborts with
`unreachable`); __wbindgen_memory returns a heap index; the two-argument
getRandomValues import takes the crypto object and a Uint8Array by heap
index, not a pointer and length.
- build-wasm.sh: source rust-version.sh relative to the script; strip the
`import * as wbg` line newer wasm2js emits and call asmFunc({ wbg }),
which is the shape its output expects.
- pack-wasm-base.mjs: also write build/bytes.js. The package exports
./bytes from there for ESM, and it was still the old sr25519-only wasm.
The committed src copies are now empty placeholders, so a build that
skips the wasm step fails instead of shipping a stale binary.
- Tests: the sr25519 known-signature vectors were substrate-context
vectors; they are replaced by vectors signed by 7.5.18, plus a test that
the same seed yields the same public key. A rename had changed the
substrate-bip39 vector's password to "Bizinikiwi"; it is "Substrate".
Compatibility with 7.5.18, measured in separate processes:
mnemonic -> mini secret -> public key is identical for every phrase with
an empty or ASCII password (12/12). It differs when the BIP39 password has
characters NFKD changes: 7.5.18 normalised it, while the Rust crate and
util-crypto's JS path do not, so this returns to the canonical result.
Rust 43/43, JS 55/55, wasm and asm.js runners pass. With this build in
place, pezkuwi-extension's suite goes from 19 failing to 3 (the 3 left
are unrelated sorting tests).
All wasm packages move to 7.5.19 and pin each other at 7.5.19.
89 lines
2.4 KiB
JavaScript
89 lines
2.4 KiB
JavaScript
// Copyright 2019-2026 @pezkuwi/wasm-crypto authors & contributors
|
|
// SPDX-License-Identifier: Apache-2.0
|
|
|
|
/* global it */
|
|
|
|
import { assert, u8aToHex } from '@pezkuwi/util';
|
|
|
|
/**
|
|
* @param {*} wasm
|
|
*/
|
|
export function bip39Generate (wasm) {
|
|
it('generates a bip39 phrase', () => {
|
|
const res = wasm.bip39Generate(21);
|
|
|
|
// console.log('\tPHR', res);
|
|
|
|
assert(res.split(' ').length === 21, 'ERROR: Invalid bip39 Phase length');
|
|
});
|
|
}
|
|
|
|
/**
|
|
* @param {*} wasm
|
|
*/
|
|
export function bip39GenerateSubsequent (wasm) {
|
|
it('generates different subsequent mnemonics', () => {
|
|
const val1 = wasm.bip39Generate(24);
|
|
const val2 = wasm.bip39Generate(24);
|
|
|
|
// console.log('\tVL1', val1);
|
|
// console.log('\tVL2', val2);
|
|
|
|
assert(val1 !== val2, 'ERROR: Subsequent mnemonics are the same');
|
|
});
|
|
}
|
|
|
|
/**
|
|
* @param {*} wasm
|
|
*/
|
|
export function bip39Validate (wasm) {
|
|
it('validates a created mnemonic', () => {
|
|
const res = wasm.bip39Validate(wasm.bip39Generate(12));
|
|
|
|
// console.log('\tVAL', res);
|
|
|
|
assert(res, 'ERROR: Invalid bip39 validation');
|
|
});
|
|
}
|
|
|
|
/**
|
|
* @param {*} wasm
|
|
*/
|
|
export function bip39ToEntropy (wasm) {
|
|
it('creates correct entropy for a known mnemonic', () => {
|
|
const res = u8aToHex(wasm.bip39ToEntropy('legal winner thank year wave sausage worth useful legal winner thank yellow'));
|
|
|
|
// console.log('\tENT', res);
|
|
|
|
assert(res === '0x7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f', 'ERROR: Invalid bip39 entropy');
|
|
});
|
|
}
|
|
|
|
/**
|
|
* @param {*} wasm
|
|
*/
|
|
export function bip39ToMiniSecret (wasm) {
|
|
it('creates the correct minisecret from a mnemonic', () => {
|
|
// The published substrate-bip39 vector: its password is the literal string below,
|
|
// not a product name, so a rename must not touch it.
|
|
const res = u8aToHex(wasm.bip39ToMiniSecret('legal winner thank year wave sausage worth useful legal winner thank yellow', 'Substrate'));
|
|
|
|
// console.log('\tMIN', res);
|
|
|
|
assert(res === '0x4313249608fe8ac10fd5886c92c4579007272cb77c21551ee5b8d60b78041685', 'ERROR: Invalid bip39 mini secret');
|
|
});
|
|
}
|
|
|
|
/**
|
|
* @param {*} wasm
|
|
*/
|
|
export function bip39ToSeed (wasm) {
|
|
it('creates the correct seed for a mnemonic', () => {
|
|
const res = u8aToHex(wasm.bip39ToSeed('seed sock milk update focus rotate barely fade car face mechanic mercy', ''));
|
|
|
|
// console.log('\tSEE', res);
|
|
|
|
assert(res === '0x3c121e20de068083b49c2315697fb59a2d9e8643c24e5ea7628132c58969a027', 'ERROR: Invalid bip39 mini secret');
|
|
});
|
|
}
|