From dfd07e04d4a1d17a2e75a0042bf27cd5eba8d78b Mon Sep 17 00:00:00 2001 From: Jaco Date: Fri, 21 Apr 2023 10:27:30 +0300 Subject: [PATCH] Align x-randomvalues with webCrypto (#1782) * Align x-randomvalues with webCrypto * Deno export from browser * export * for x-ws * export * from RN * CHANGELOG --- CHANGELOG.md | 1 + packages/x-fetch/src/mod.ts | 6 +----- packages/x-fetch/src/react-native.ts | 2 +- packages/x-randomvalues/src/browser.ts | 9 +++++---- packages/x-randomvalues/src/mod.ts | 6 +----- packages/x-randomvalues/src/node.ts | 17 +++++++++-------- packages/x-randomvalues/src/react-native.ts | 9 ++++++++- packages/x-randomvalues/src/shim.ts | 7 +++++++ packages/x-textdecoder/src/mod.ts | 6 +----- packages/x-textdecoder/src/react-native.ts | 2 +- packages/x-textencoder/src/mod.ts | 6 +----- packages/x-textencoder/src/react-native.ts | 2 +- packages/x-ws/src/mod.ts | 6 +----- packages/x-ws/src/react-native.ts | 2 +- 14 files changed, 39 insertions(+), 42 deletions(-) create mode 100644 packages/x-randomvalues/src/shim.ts diff --git a/CHANGELOG.md b/CHANGELOG.md index ddf57b1e4..f8a3859e8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,7 @@ Changes: - Replace `tweetnacl` secretbox usage with slimmer local version - Adjust `isCodec` helper with closer API alignment - Initial steps to multi-language bip39 support +- Use Node webcrypto for Node `getRandomValues` support - Upgrade dependencies to latest stable versions - Drop support for Node 14 (EOL 30 Apr 2023) diff --git a/packages/x-fetch/src/mod.ts b/packages/x-fetch/src/mod.ts index 2b9f4d64e..a0a478548 100644 --- a/packages/x-fetch/src/mod.ts +++ b/packages/x-fetch/src/mod.ts @@ -1,8 +1,4 @@ // Copyright 2017-2023 @polkadot/x-fetch authors & contributors // SPDX-License-Identifier: Apache-2.0 -export { packageInfo } from './packageInfo.js'; - -const _fetch = fetch; - -export { _fetch as fetch }; +export * from './browser.js'; diff --git a/packages/x-fetch/src/react-native.ts b/packages/x-fetch/src/react-native.ts index 4700c6f9b..a0a478548 100644 --- a/packages/x-fetch/src/react-native.ts +++ b/packages/x-fetch/src/react-native.ts @@ -1,4 +1,4 @@ // Copyright 2017-2023 @polkadot/x-fetch authors & contributors // SPDX-License-Identifier: Apache-2.0 -export { fetch, packageInfo } from './browser.js'; +export * from './browser.js'; diff --git a/packages/x-randomvalues/src/browser.ts b/packages/x-randomvalues/src/browser.ts index c4b1b8fe5..8adde20d2 100644 --- a/packages/x-randomvalues/src/browser.ts +++ b/packages/x-randomvalues/src/browser.ts @@ -5,9 +5,10 @@ import { xglobal } from '@polkadot/x-global'; export { packageInfo } from './packageInfo.js'; +export const crypto = xglobal.crypto; + +// getRandomValues needs to be called on the crypto object, +// hence the need for the wrapper function export function getRandomValues (arr: T): T { - // We use x-global here - this prevents packagers such as rollup - // confusing this with the "normal" Node.js import and stubbing it - // (and also aligns with eg. x-fetch, where x-global is used) - return xglobal.crypto.getRandomValues(arr); + return crypto.getRandomValues(arr); } diff --git a/packages/x-randomvalues/src/mod.ts b/packages/x-randomvalues/src/mod.ts index 552f9909c..2c7ba0d5f 100644 --- a/packages/x-randomvalues/src/mod.ts +++ b/packages/x-randomvalues/src/mod.ts @@ -1,8 +1,4 @@ // Copyright 2017-2023 @polkadot/x-randomvalues authors & contributors // SPDX-License-Identifier: Apache-2.0 -export { packageInfo } from './packageInfo.js'; - -export function getRandomValues (arr: T): T { - return crypto.getRandomValues(arr); -} +export * from './browser.js'; diff --git a/packages/x-randomvalues/src/node.ts b/packages/x-randomvalues/src/node.ts index 73047e66c..0d3448d25 100644 --- a/packages/x-randomvalues/src/node.ts +++ b/packages/x-randomvalues/src/node.ts @@ -1,16 +1,17 @@ // Copyright 2017-2023 @polkadot/x-randomvalues authors & contributors // SPDX-License-Identifier: Apache-2.0 -import crypto from 'node:crypto'; +// Needs Node 15+ for webcrypto +import nodeCrypto from 'node:crypto'; + +import { extractGlobal } from '@polkadot/x-global'; export { packageInfo } from './packageInfo.js'; +export const crypto = /*#__PURE__*/ extractGlobal('crypto', nodeCrypto.webcrypto); + +// getRandomValues needs to be called on the crypto object, +// hence the need for the wrapper function export function getRandomValues (output: T): T { - const bytes = crypto.randomBytes(output.length); - - for (let i = 0; i < bytes.length; i++) { - output[i] = bytes[i]; - } - - return output; + return crypto.getRandomValues(output); } diff --git a/packages/x-randomvalues/src/react-native.ts b/packages/x-randomvalues/src/react-native.ts index 03f9c810b..9dda6224f 100644 --- a/packages/x-randomvalues/src/react-native.ts +++ b/packages/x-randomvalues/src/react-native.ts @@ -2,6 +2,7 @@ // SPDX-License-Identifier: Apache-2.0 // Adapted from https://github.com/LinusU/react-native-get-random-values/blob/85f48393821c23b83b89a8177f56d3a81dc8b733/index.js +// // Copyright (c) 2018, 2020 Linus Unnebäck // SPDX-License-Identifier: MIT @@ -10,7 +11,7 @@ import { NativeModules } from 'react-native'; import { base64Decode } from '@polkadot/wasm-util/base64'; import { xglobal } from '@polkadot/x-global'; -import { getRandomValues as getRandomValuesBrowser } from './browser.js'; +import { crypto as cryptoBrowser, getRandomValues as getRandomValuesBrowser } from './browser.js'; import { insecureRandomValues } from './fallback.js'; export { packageInfo } from './packageInfo.js'; @@ -46,3 +47,9 @@ export const getRandomValues = ( ? insecureRandomValues : getRandomValuesRn ); + +export const crypto = ( + getRandomValues === getRandomValuesBrowser + ? cryptoBrowser + : { getRandomValues } +); diff --git a/packages/x-randomvalues/src/shim.ts b/packages/x-randomvalues/src/shim.ts new file mode 100644 index 000000000..af89d42aa --- /dev/null +++ b/packages/x-randomvalues/src/shim.ts @@ -0,0 +1,7 @@ +// Copyright 2017-2023 @polkadot/x-randomvalues authors & contributors +// SPDX-License-Identifier: Apache-2.0 + +import { exposeGlobal } from '@polkadot/x-global'; +import { crypto } from '@polkadot/x-randomvalues'; + +exposeGlobal('crypto', crypto); diff --git a/packages/x-textdecoder/src/mod.ts b/packages/x-textdecoder/src/mod.ts index dc315de54..2c9c0d4ce 100644 --- a/packages/x-textdecoder/src/mod.ts +++ b/packages/x-textdecoder/src/mod.ts @@ -1,8 +1,4 @@ // Copyright 2017-2023 @polkadot/x-textencoder authors & contributors // SPDX-License-Identifier: Apache-2.0 -export { packageInfo } from './packageInfo.js'; - -const _TextDecoder = TextDecoder; - -export { _TextDecoder as TextDecoder }; +export * from './browser.js'; diff --git a/packages/x-textdecoder/src/react-native.ts b/packages/x-textdecoder/src/react-native.ts index ddcd6fa11..2c9c0d4ce 100644 --- a/packages/x-textdecoder/src/react-native.ts +++ b/packages/x-textdecoder/src/react-native.ts @@ -1,4 +1,4 @@ // Copyright 2017-2023 @polkadot/x-textencoder authors & contributors // SPDX-License-Identifier: Apache-2.0 -export { TextDecoder, packageInfo } from './browser.js'; +export * from './browser.js'; diff --git a/packages/x-textencoder/src/mod.ts b/packages/x-textencoder/src/mod.ts index 78d586492..2c9c0d4ce 100644 --- a/packages/x-textencoder/src/mod.ts +++ b/packages/x-textencoder/src/mod.ts @@ -1,8 +1,4 @@ // Copyright 2017-2023 @polkadot/x-textencoder authors & contributors // SPDX-License-Identifier: Apache-2.0 -export { packageInfo } from './packageInfo.js'; - -const _TextEncoder = TextEncoder; - -export { _TextEncoder as TextEncoder }; +export * from './browser.js'; diff --git a/packages/x-textencoder/src/react-native.ts b/packages/x-textencoder/src/react-native.ts index 1c28962ab..2c9c0d4ce 100644 --- a/packages/x-textencoder/src/react-native.ts +++ b/packages/x-textencoder/src/react-native.ts @@ -1,4 +1,4 @@ // Copyright 2017-2023 @polkadot/x-textencoder authors & contributors // SPDX-License-Identifier: Apache-2.0 -export { TextEncoder, packageInfo } from './browser.js'; +export * from './browser.js'; diff --git a/packages/x-ws/src/mod.ts b/packages/x-ws/src/mod.ts index e8d0ffd69..45981c5d6 100644 --- a/packages/x-ws/src/mod.ts +++ b/packages/x-ws/src/mod.ts @@ -1,8 +1,4 @@ // Copyright 2017-2023 @polkadot/x-ws authors & contributors // SPDX-License-Identifier: Apache-2.0 -export { packageInfo } from './packageInfo.js'; - -const _WebSocket = WebSocket; - -export { _WebSocket as WebSocket }; +export * from './browser.js'; diff --git a/packages/x-ws/src/react-native.ts b/packages/x-ws/src/react-native.ts index ee5914c93..45981c5d6 100644 --- a/packages/x-ws/src/react-native.ts +++ b/packages/x-ws/src/react-native.ts @@ -1,4 +1,4 @@ // Copyright 2017-2023 @polkadot/x-ws authors & contributors // SPDX-License-Identifier: Apache-2.0 -export { WebSocket, packageInfo } from './browser.js'; +export * from './browser.js';