diff --git a/.123npm b/.123npm
new file mode 100644
index 000000000..e69de29bb
diff --git a/packages/util-crypto/src/mnemonic/bip39.ts b/packages/util-crypto/src/mnemonic/bip39.ts
index 09674830d..be7256ff3 100644
--- a/packages/util-crypto/src/mnemonic/bip39.ts
+++ b/packages/util-crypto/src/mnemonic/bip39.ts
@@ -25,18 +25,22 @@ const INVALID_MNEMONIC = 'Invalid mnemonic';
const INVALID_ENTROPY = 'Invalid entropy';
const INVALID_CHECKSUM = 'Invalid mnemonic checksum';
+/** @internal */
function normalize (str?: string): string {
return (str || '').normalize('NFKD');
}
+/** @internal */
function binaryToByte (bin: string): number {
return parseInt(bin, 2);
}
+/** @internal */
function bytesToBinary (bytes: number[]): string {
return bytes.map((x) => x.toString(2).padStart(8, '0')).join('');
}
+/** @internal */
function deriveChecksumBits (entropyBuffer: Uint8Array): string {
return bytesToBinary(
Array.from(sha256AsU8a(entropyBuffer))
diff --git a/packages/x-randomvalues/package.json b/packages/x-randomvalues/package.json
index 09e818361..233be3ba2 100644
--- a/packages/x-randomvalues/package.json
+++ b/packages/x-randomvalues/package.json
@@ -20,11 +20,11 @@
"main": "node.js",
"react-native": "react-native.js",
"dependencies": {
+ "@polkadot/wasm-util": "^7.0.3",
"@polkadot/x-global": "11.1.4-10-x",
"tslib": "^2.5.0"
},
"devDependencies": {
- "@polkadot/util": "11.1.4-10-x",
"@types/react-native": "^0.71.5"
},
"denoDependencies": {
diff --git a/packages/x-randomvalues/src/base64.spec.ts b/packages/x-randomvalues/src/base64.spec.ts
deleted file mode 100644
index 47da6c184..000000000
--- a/packages/x-randomvalues/src/base64.spec.ts
+++ /dev/null
@@ -1,52 +0,0 @@
-// Copyright 2017-2023 @polkadot/util-crypto authors & contributors
-// SPDX-License-Identifier: Apache-2.0
-
-///
-
-import { perf } from '@polkadot/util/test';
-
-import { base64Decode } from './base64.js';
-
-const HELLO_DUAL = 'aGVsbG8gd29ybGQg0J/RgNC40LLQtdGC0YHRgtCy0YPRjiDQvNC4IOS9oOWlvQ==';
-
-const TESTS = [
- {
- // hello world Приветствую ми 你好
- base64: HELLO_DUAL,
- expect: new Uint8Array([104, 101, 108, 108, 111, 32, 119, 111, 114, 108, 100, 32, 208, 159, 209, 128, 208, 184, 208, 178, 208, 181, 209, 130, 209, 129, 209, 130, 208, 178, 209, 131, 209, 142, 32, 208, 188, 208, 184, 32, 228, 189, 160, 229, 165, 189])
- },
- {
- // ✓ à la mode
- base64: '4pyTIMOgIGxhIG1vZGU=',
- expect: new Uint8Array([226, 156, 147, 32, 195, 160, 32, 108, 97, 32, 109, 111, 100, 101])
- },
- {
- // Hello World!
- base64: 'SGVsbG8gV29ybGQh',
- expect: new Uint8Array([72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100, 33])
- },
- {
- base64: 'AA==',
- expect: new Uint8Array([0])
- },
- {
- base64: 'AAA=',
- expect: new Uint8Array([0, 0])
- },
- {
- base64: 'AAAA',
- expect: new Uint8Array([0, 0, 0])
- }
-];
-
-describe('base64Decode', (): void => {
- for (const test of TESTS) {
- it(test.base64, (): void => {
- expect(
- base64Decode(test.base64)
- ).toEqual(test.expect);
- });
- }
-});
-
-perf('base64Decode (hello, dual)', 100_000, [[HELLO_DUAL]], base64Decode);
diff --git a/packages/x-randomvalues/src/base64.ts b/packages/x-randomvalues/src/base64.ts
deleted file mode 100644
index 99fbc0b51..000000000
--- a/packages/x-randomvalues/src/base64.ts
+++ /dev/null
@@ -1,37 +0,0 @@
-// Copyright 2017-2023 @polkadot/x-randomvalues authors & contributors
-// SPDX-License-Identifier: Apache-2.0
-
-// A tiny base64 decoder for RN usage when atob is not available.
-// The alternative would be to rely on Buffer with 'base64'
-//
-// Uint8Array.from(Buffer.from(data, 'base64'))
-//
-// We provide an own (tiny) decoder to not have Buffer deps
-
-const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
-const map = new Uint8Array(256);
-
-// We use charCodeAt for access here and in the decoder loop - this is faster
-// on lookups (array + numbers) and also faster than accessing the specific
-// character via data[i] (around a 50% improvement on perf tests)
-for (let i = 0; i < chars.length; i++) {
- map[chars.charCodeAt(i)] = i;
-}
-
-export function base64Decode (data: string): Uint8Array {
- const bytes = [];
- let byte = 0;
- let bits = 0;
-
- for (let i = 0; i < data.length && data[i] !== '='; i++) {
- // each character represents 6 bits
- byte = (byte << 6) | map[data.charCodeAt(i)];
-
- // each byte needs to contain 8 bits
- if ((bits += 6) >= 8) {
- bytes.push((byte >>> (bits -= 8)) & 0xff);
- }
- }
-
- return Uint8Array.from(bytes);
-}
diff --git a/packages/x-randomvalues/src/react-native.ts b/packages/x-randomvalues/src/react-native.ts
index 2ee232813..238269cf5 100644
--- a/packages/x-randomvalues/src/react-native.ts
+++ b/packages/x-randomvalues/src/react-native.ts
@@ -7,9 +7,9 @@
import { NativeModules } from 'react-native';
+import { base64Decode } from '@polkadot/wasm-util/base64';
import { xglobal } from '@polkadot/x-global';
-import { base64Decode } from './base64.js';
import { getRandomValues as getRandomValuesGlobal } from './browser.js';
import { insecureRandomValues } from './fallback.js';
@@ -28,18 +28,19 @@ interface GlobalExt {
nativeCallSyncHook: unknown;
}
-function getRandomValuesNative (output: T): T {
- const bytes = base64Decode(
+/**
+ * @internal
+ *
+ * A getRandomValues util that detects and uses the available RN
+ * random utiliy generation functions.
+ **/
+function getRandomValuesNative (output: Uint8Array): Uint8Array {
+ return base64Decode(
(NativeModules as RNExt).RNGetRandomValues
? (NativeModules as RNExt).RNGetRandomValues.getRandomBase64(output.length)
- : (NativeModules as RNExt).ExpoRandom.getRandomBase64String(output.length)
+ : (NativeModules as RNExt).ExpoRandom.getRandomBase64String(output.length),
+ output
);
-
- for (let i = 0; i < bytes.length; i++) {
- output[i] = bytes[i];
- }
-
- return output;
}
export const getRandomValues = (
diff --git a/yarn.lock b/yarn.lock
index 78b541136..582d2ebca 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -732,7 +732,7 @@ __metadata:
languageName: node
linkType: hard
-"@polkadot/wasm-util@npm:7.0.3":
+"@polkadot/wasm-util@npm:7.0.3, @polkadot/wasm-util@npm:^7.0.3":
version: 7.0.3
resolution: "@polkadot/wasm-util@npm:7.0.3"
dependencies:
@@ -785,7 +785,7 @@ __metadata:
version: 0.0.0-use.local
resolution: "@polkadot/x-randomvalues@workspace:packages/x-randomvalues"
dependencies:
- "@polkadot/util": 11.1.4-10-x
+ "@polkadot/wasm-util": ^7.0.3
"@polkadot/x-global": 11.1.4-10-x
"@types/react-native": ^0.71.5
tslib: ^2.5.0