From e8af9b5a1ef96503ee8bf92b0a08f030f099b6b7 Mon Sep 17 00:00:00 2001 From: Jaco Date: Sun, 21 Nov 2021 19:21:20 +0100 Subject: [PATCH] Add a helper for de-dupe of *AsHex (#1224) * Add a helper for de-dupe of *AsHex * Update packages/util-crypto/src/random/asU8a.ts * lint * isWasmOnly helper * bit hasher --- packages/util-crypto/src/blake2/asHex.ts | 28 ----------------- packages/util-crypto/src/blake2/asU8a.ts | 12 ++++++-- packages/util-crypto/src/blake2/index.ts | 3 +- packages/util-crypto/src/helpers.ts | 22 ++++++++++++++ packages/util-crypto/src/hmac/shaAsU8a.ts | 6 ++-- packages/util-crypto/src/keccak/asHex.ts | 28 ----------------- packages/util-crypto/src/keccak/asU8a.ts | 30 ++++++++++++------- packages/util-crypto/src/keccak/index.ts | 3 +- packages/util-crypto/src/mnemonic/generate.ts | 5 ++-- .../util-crypto/src/mnemonic/toEntropy.ts | 5 ++-- .../util-crypto/src/mnemonic/toLegacySeed.ts | 5 ++-- .../util-crypto/src/mnemonic/toMiniSecret.ts | 5 ++-- packages/util-crypto/src/mnemonic/validate.ts | 5 ++-- packages/util-crypto/src/nacl/sign.ts | 6 ++-- packages/util-crypto/src/nacl/verify.ts | 6 ++-- packages/util-crypto/src/pbkdf2/encode.ts | 5 ++-- packages/util-crypto/src/random/asHex.ts | 28 ----------------- packages/util-crypto/src/random/asNumber.ts | 2 +- packages/util-crypto/src/random/asU8a.ts | 8 +++++ packages/util-crypto/src/random/index.ts | 3 +- packages/util-crypto/src/scrypt/encode.ts | 5 ++-- packages/util-crypto/src/sha/asU8a.ts | 15 ++++------ packages/util-crypto/src/xxhash/asHex.ts | 28 ----------------- packages/util-crypto/src/xxhash/asU8a.ts | 11 +++++-- packages/util-crypto/src/xxhash/index.ts | 3 +- 25 files changed, 112 insertions(+), 165 deletions(-) delete mode 100644 packages/util-crypto/src/blake2/asHex.ts create mode 100644 packages/util-crypto/src/helpers.ts delete mode 100644 packages/util-crypto/src/keccak/asHex.ts delete mode 100644 packages/util-crypto/src/random/asHex.ts delete mode 100644 packages/util-crypto/src/xxhash/asHex.ts diff --git a/packages/util-crypto/src/blake2/asHex.ts b/packages/util-crypto/src/blake2/asHex.ts deleted file mode 100644 index 9fdd515bf..000000000 --- a/packages/util-crypto/src/blake2/asHex.ts +++ /dev/null @@ -1,28 +0,0 @@ -// Copyright 2017-2021 @polkadot/util-crypto authors & contributors -// SPDX-License-Identifier: Apache-2.0 - -import type { HexString } from '@polkadot/util/types'; - -import { u8aToHex } from '@polkadot/util'; - -import { blake2AsU8a } from './asU8a'; - -/** - * @name blake2AsHex - * @summary Creates a blake2b hex from the input. - * @description - * From a `Uint8Array` input, create the blake2b and return the result as a hex string with the specified `bitLength`. - * @example - *
- * - * ```javascript - * import { blake2AsHex } from '@polkadot/util-crypto'; - * - * blake2AsHex('abc'); // => 0xba80a53f981c4d0d - * ``` - */ -export function blake2AsHex (data: HexString | Uint8Array | string, bitLength = 256, key?: Uint8Array | null, onlyJs?: boolean): HexString { - return u8aToHex( - blake2AsU8a(data, bitLength, key, onlyJs) - ); -} diff --git a/packages/util-crypto/src/blake2/asU8a.ts b/packages/util-crypto/src/blake2/asU8a.ts index 9fd81ba62..8c3dab6d4 100644 --- a/packages/util-crypto/src/blake2/asU8a.ts +++ b/packages/util-crypto/src/blake2/asU8a.ts @@ -6,7 +6,9 @@ import type { HexString } from '@polkadot/util/types'; import js from 'blakejs'; import { u8aToU8a } from '@polkadot/util'; -import { blake2b, isReady } from '@polkadot/wasm-crypto'; +import { blake2b } from '@polkadot/wasm-crypto'; + +import { createAsHex, isWasmOnly } from '../helpers'; /** * @name blake2AsU8a @@ -26,7 +28,13 @@ export function blake2AsU8a (data: HexString | Uint8Array | string, bitLength = const byteLength = Math.ceil(bitLength / 8); const u8a = u8aToU8a(data); - return isReady() && !onlyJs + return isWasmOnly(onlyJs) ? blake2b(u8a, u8aToU8a(key), byteLength) : js.blake2b(u8a, key || undefined, byteLength); } + +/** + * @name blake2AsHex + * @description Creates a blake2b hex from the input. + */ +export const blake2AsHex = createAsHex(blake2AsU8a); diff --git a/packages/util-crypto/src/blake2/index.ts b/packages/util-crypto/src/blake2/index.ts index 001f8920a..c82b7a78e 100644 --- a/packages/util-crypto/src/blake2/index.ts +++ b/packages/util-crypto/src/blake2/index.ts @@ -5,5 +5,4 @@ * @summary Create blake2b values with specified bitlengths */ -export { blake2AsHex } from './asHex'; -export { blake2AsU8a } from './asU8a'; +export { blake2AsHex, blake2AsU8a } from './asU8a'; diff --git a/packages/util-crypto/src/helpers.ts b/packages/util-crypto/src/helpers.ts new file mode 100644 index 000000000..dfe7be39d --- /dev/null +++ b/packages/util-crypto/src/helpers.ts @@ -0,0 +1,22 @@ +// Copyright 2017-2021 @polkadot/util-crypto authors & contributors +// SPDX-License-Identifier: Apache-2.0 + +import type { HexString } from '@polkadot/util/types'; + +import { u8aToHex } from '@polkadot/util'; +import { isReady } from '@polkadot/wasm-crypto'; + +// eslint-disable-next-line @typescript-eslint/no-explicit-any +export function createAsHex Uint8Array> (fn: T): (...args: Parameters) => HexString { + return (...args: Parameters): HexString => + u8aToHex(fn(...args)); +} + +export function createBitHasher (bitLength: T, fn: (data: HexString | Buffer | Uint8Array | string, bitLength: T, onlyJs?: boolean) => Uint8Array): (data: HexString | Buffer | Uint8Array | string, onlyJs?: boolean) => Uint8Array { + return (data: HexString | Buffer | Uint8Array | string, onlyJs?: boolean): Uint8Array => + fn(data, bitLength, onlyJs); +} + +export function isWasmOnly (onlyJs?: boolean): boolean { + return isReady() && !onlyJs; +} diff --git a/packages/util-crypto/src/hmac/shaAsU8a.ts b/packages/util-crypto/src/hmac/shaAsU8a.ts index f42f8b062..7537cc380 100644 --- a/packages/util-crypto/src/hmac/shaAsU8a.ts +++ b/packages/util-crypto/src/hmac/shaAsU8a.ts @@ -4,7 +4,9 @@ import hash from 'hash.js'; import { u8aToU8a } from '@polkadot/util'; -import { hmacSha256, hmacSha512, isReady } from '@polkadot/wasm-crypto'; +import { hmacSha256, hmacSha512 } from '@polkadot/wasm-crypto'; + +import { isWasmOnly } from '../helpers'; type HashFn = (key: Uint8Array | string, data: Uint8Array, onlyJs?: boolean) => Uint8Array; @@ -17,7 +19,7 @@ export function hmacShaAsU8a (key: Uint8Array | string, data: Uint8Array, bitLen const is256 = bitLength === 256; const u8aKey = u8aToU8a(key); - return isReady() && !onlyJs + return isWasmOnly(onlyJs) ? is256 ? hmacSha256(u8aKey, data) : hmacSha512(u8aKey, data) diff --git a/packages/util-crypto/src/keccak/asHex.ts b/packages/util-crypto/src/keccak/asHex.ts deleted file mode 100644 index ccdc64074..000000000 --- a/packages/util-crypto/src/keccak/asHex.ts +++ /dev/null @@ -1,28 +0,0 @@ -// Copyright 2017-2021 @polkadot/util-crypto authors & contributors -// SPDX-License-Identifier: Apache-2.0 - -import type { HexString } from '@polkadot/util/types'; - -import { u8aToHex } from '@polkadot/util'; - -import { keccakAsU8a } from './asU8a'; - -/** - * @name keccakAsHex - * @summary Creates a keccak hex string from the input. - * @description - * From either a `string` or a `Buffer` input, create the keccak and return the result as a `0x` prefixed hex string. - * @example - *
- * - * ```javascript - * import { keccakAsHex } from '@polkadot/util-crypto'; - * - * keccakAsHex('123'); // => 0x... - * ``` - */ -export function keccakAsHex (value: HexString | Buffer | Uint8Array | string, bitLength?: 256 | 512): HexString { - return u8aToHex( - keccakAsU8a(value, bitLength) - ); -} diff --git a/packages/util-crypto/src/keccak/asU8a.ts b/packages/util-crypto/src/keccak/asU8a.ts index ab0e085e7..f45405625 100644 --- a/packages/util-crypto/src/keccak/asU8a.ts +++ b/packages/util-crypto/src/keccak/asU8a.ts @@ -6,14 +6,9 @@ import type { HexString } from '@polkadot/util/types'; import js from 'js-sha3'; import { u8aToU8a } from '@polkadot/util'; -import { isReady, keccak256, keccak512 } from '@polkadot/wasm-crypto'; +import { keccak256, keccak512 } from '@polkadot/wasm-crypto'; -type HashFn = (value: HexString | Buffer | Uint8Array | string, onlyJs?: boolean) => Uint8Array; - -function createKeccak (bitLength: 256 | 512 = 256): HashFn { - return (value: HexString | Buffer | Uint8Array | string, onlyJs?: boolean): Uint8Array => - keccakAsU8a(value, bitLength, onlyJs); -} +import { createAsHex, createBitHasher, isWasmOnly } from '../helpers'; /** * @name keccakAsU8a @@ -33,7 +28,7 @@ export function keccakAsU8a (value: HexString | Buffer | Uint8Array | string, bi const is256 = bitLength === 256; const u8a = u8aToU8a(value); - return isReady() && !onlyJs + return isWasmOnly(onlyJs) ? is256 ? keccak256(u8a) : keccak512(u8a) @@ -44,5 +39,20 @@ export function keccakAsU8a (value: HexString | Buffer | Uint8Array | string, bi ); } -export const keccak256AsU8a = createKeccak(256); -export const keccak512AsU8a = createKeccak(512); +/** + * @name keccak256AsU8a + * @description Creates a keccak256 Uint8Array from the input. + */ +export const keccak256AsU8a = createBitHasher(256, keccakAsU8a); + +/** + * @name keccak512AsU8a + * @description Creates a keccak512 Uint8Array from the input. + */ +export const keccak512AsU8a = createBitHasher(512, keccakAsU8a); + +/** + * @name keccakAsHex + * @description Creates a keccak hex string from the input. + */ +export const keccakAsHex = createAsHex(keccakAsU8a); diff --git a/packages/util-crypto/src/keccak/index.ts b/packages/util-crypto/src/keccak/index.ts index 5fadbbc09..54b456835 100644 --- a/packages/util-crypto/src/keccak/index.ts +++ b/packages/util-crypto/src/keccak/index.ts @@ -5,5 +5,4 @@ * @summary Create Keccak256/512 values as hex & Uint8Array output */ -export { keccakAsHex } from './asHex'; -export { keccakAsU8a, keccak256AsU8a, keccak512AsU8a } from './asU8a'; +export { keccakAsHex, keccakAsU8a, keccak256AsU8a, keccak512AsU8a } from './asU8a'; diff --git a/packages/util-crypto/src/mnemonic/generate.ts b/packages/util-crypto/src/mnemonic/generate.ts index 319dc29ea..60291dedf 100644 --- a/packages/util-crypto/src/mnemonic/generate.ts +++ b/packages/util-crypto/src/mnemonic/generate.ts @@ -1,8 +1,9 @@ // Copyright 2017-2021 @polkadot/util-crypto authors & contributors // SPDX-License-Identifier: Apache-2.0 -import { bip39Generate, isReady } from '@polkadot/wasm-crypto'; +import { bip39Generate } from '@polkadot/wasm-crypto'; +import { isWasmOnly } from '../helpers'; import { generateMnemonic } from './bip39'; export type WordCount = 12 | 15 | 18 | 21 | 24; @@ -29,7 +30,7 @@ const STRENGTH_MAP = { * ``` */ export function mnemonicGenerate (numWords: WordCount = 12, onlyJs?: boolean): string { - return isReady() && !onlyJs + return isWasmOnly(onlyJs) ? bip39Generate(numWords) : generateMnemonic(STRENGTH_MAP[numWords]); } diff --git a/packages/util-crypto/src/mnemonic/toEntropy.ts b/packages/util-crypto/src/mnemonic/toEntropy.ts index f9fb48e69..dcb73db42 100644 --- a/packages/util-crypto/src/mnemonic/toEntropy.ts +++ b/packages/util-crypto/src/mnemonic/toEntropy.ts @@ -1,12 +1,13 @@ // Copyright 2017-2021 @polkadot/util-crypto authors & contributors // SPDX-License-Identifier: Apache-2.0 -import { bip39ToEntropy, isReady } from '@polkadot/wasm-crypto'; +import { bip39ToEntropy } from '@polkadot/wasm-crypto'; +import { isWasmOnly } from '../helpers'; import { mnemonicToEntropy as jsToEntropy } from './bip39'; export function mnemonicToEntropy (mnemonic: string, onlyJs?: boolean): Uint8Array { - return isReady() && !onlyJs + return isWasmOnly(onlyJs) ? bip39ToEntropy(mnemonic) : jsToEntropy(mnemonic); } diff --git a/packages/util-crypto/src/mnemonic/toLegacySeed.ts b/packages/util-crypto/src/mnemonic/toLegacySeed.ts index d3e71e6f1..fcd8d447d 100644 --- a/packages/util-crypto/src/mnemonic/toLegacySeed.ts +++ b/packages/util-crypto/src/mnemonic/toLegacySeed.ts @@ -2,8 +2,9 @@ // SPDX-License-Identifier: Apache-2.0 import { assert } from '@polkadot/util'; -import { bip39ToSeed, isReady } from '@polkadot/wasm-crypto'; +import { bip39ToSeed } from '@polkadot/wasm-crypto'; +import { isWasmOnly } from '../helpers'; import { mnemonicToSeedSync } from './bip39'; import { mnemonicValidate } from './validate'; @@ -29,7 +30,7 @@ export function mnemonicToLegacySeed (mnemonic: string, password = '', onlyJs?: assert([32, 64].includes(byteLength), () => `Invalid seed length ${byteLength}, expected 32 or 64`); if (byteLength === 32) { - return isReady() && !onlyJs + return isWasmOnly(onlyJs) ? bip39ToSeed(mnemonic, password) : mnemonicToSeedSync(mnemonic, password).subarray(0, 32); } else if (byteLength === 64) { diff --git a/packages/util-crypto/src/mnemonic/toMiniSecret.ts b/packages/util-crypto/src/mnemonic/toMiniSecret.ts index 076feef36..aeb02600d 100644 --- a/packages/util-crypto/src/mnemonic/toMiniSecret.ts +++ b/packages/util-crypto/src/mnemonic/toMiniSecret.ts @@ -2,8 +2,9 @@ // SPDX-License-Identifier: Apache-2.0 import { assert, stringToU8a } from '@polkadot/util'; -import { bip39ToMiniSecret, isReady } from '@polkadot/wasm-crypto'; +import { bip39ToMiniSecret } from '@polkadot/wasm-crypto'; +import { isWasmOnly } from '../helpers'; import { pbkdf2Encode } from '../pbkdf2'; import { mnemonicToEntropy } from './toEntropy'; import { mnemonicValidate } from './validate'; @@ -11,7 +12,7 @@ import { mnemonicValidate } from './validate'; export function mnemonicToMiniSecret (mnemonic: string, password = '', onlyJs?: boolean): Uint8Array { assert(mnemonicValidate(mnemonic), 'Invalid bip39 mnemonic specified'); - if (isReady() && !onlyJs) { + if (isWasmOnly(onlyJs)) { return bip39ToMiniSecret(mnemonic, password); } diff --git a/packages/util-crypto/src/mnemonic/validate.ts b/packages/util-crypto/src/mnemonic/validate.ts index d1e2fb81c..84a640868 100644 --- a/packages/util-crypto/src/mnemonic/validate.ts +++ b/packages/util-crypto/src/mnemonic/validate.ts @@ -1,8 +1,9 @@ // Copyright 2017-2021 @polkadot/util-crypto authors & contributors // SPDX-License-Identifier: Apache-2.0 -import { bip39Validate, isReady } from '@polkadot/wasm-crypto'; +import { bip39Validate } from '@polkadot/wasm-crypto'; +import { isWasmOnly } from '../helpers'; import { validateMnemonic } from './bip39'; /** @@ -19,7 +20,7 @@ import { validateMnemonic } from './bip39'; * ``` */ export function mnemonicValidate (mnemonic: string, onlyJs?: boolean): boolean { - return isReady() && !onlyJs + return isWasmOnly(onlyJs) ? bip39Validate(mnemonic) : validateMnemonic(mnemonic); } diff --git a/packages/util-crypto/src/nacl/sign.ts b/packages/util-crypto/src/nacl/sign.ts index 935b180cc..601174769 100644 --- a/packages/util-crypto/src/nacl/sign.ts +++ b/packages/util-crypto/src/nacl/sign.ts @@ -7,7 +7,9 @@ import type { Keypair } from '../types'; import nacl from 'tweetnacl'; import { assert, u8aToU8a } from '@polkadot/util'; -import { ed25519Sign, isReady } from '@polkadot/wasm-crypto'; +import { ed25519Sign } from '@polkadot/wasm-crypto'; + +import { isWasmOnly } from '../helpers'; /** * @name naclSign @@ -28,7 +30,7 @@ export function naclSign (message: HexString | Uint8Array | string, { publicKey, const messageU8a = u8aToU8a(message); - return isReady() && !onlyJs + return isWasmOnly(onlyJs) ? ed25519Sign(publicKey as Uint8Array, secretKey.subarray(0, 32), messageU8a) : nacl.sign.detached(messageU8a, secretKey); } diff --git a/packages/util-crypto/src/nacl/verify.ts b/packages/util-crypto/src/nacl/verify.ts index 1df966bbd..eca10a5cb 100644 --- a/packages/util-crypto/src/nacl/verify.ts +++ b/packages/util-crypto/src/nacl/verify.ts @@ -6,7 +6,9 @@ import type { HexString } from '@polkadot/util/types'; import nacl from 'tweetnacl'; import { assert, u8aToU8a } from '@polkadot/util'; -import { ed25519Verify, isReady } from '@polkadot/wasm-crypto'; +import { ed25519Verify } from '@polkadot/wasm-crypto'; + +import { isWasmOnly } from '../helpers'; /** * @name naclSign @@ -30,7 +32,7 @@ export function naclVerify (message: HexString | Uint8Array | string, signature: assert(publicKeyU8a.length === 32, () => `Invalid publicKey, received ${publicKeyU8a.length}, expected 32`); assert(signatureU8a.length === 64, () => `Invalid signature, received ${signatureU8a.length} bytes, expected 64`); - return isReady() && !onlyJs + return isWasmOnly(onlyJs) ? ed25519Verify(signatureU8a, messageU8a, publicKeyU8a) : nacl.sign.detached.verify(messageU8a, signatureU8a, publicKeyU8a); } diff --git a/packages/util-crypto/src/pbkdf2/encode.ts b/packages/util-crypto/src/pbkdf2/encode.ts index 693e87c56..3d49b18fc 100644 --- a/packages/util-crypto/src/pbkdf2/encode.ts +++ b/packages/util-crypto/src/pbkdf2/encode.ts @@ -4,8 +4,9 @@ import type { HexString } from '@polkadot/util/types'; import { u8aToU8a } from '@polkadot/util'; -import { isReady, pbkdf2 } from '@polkadot/wasm-crypto'; +import { pbkdf2 } from '@polkadot/wasm-crypto'; +import { isWasmOnly } from '../helpers'; import { randomAsU8a } from '../random/asU8a'; import { pbkdf2Sync } from './pbkdf2'; @@ -20,7 +21,7 @@ export function pbkdf2Encode (passphrase?: HexString | Buffer | Uint8Array | str const u8aSalt = u8aToU8a(salt); return { - password: isReady() && !onlyJs + password: isWasmOnly(onlyJs) ? pbkdf2(u8aPass, u8aSalt, rounds) : pbkdf2Sync(u8aPass, u8aSalt, rounds), rounds, diff --git a/packages/util-crypto/src/random/asHex.ts b/packages/util-crypto/src/random/asHex.ts deleted file mode 100644 index 11ca30b2e..000000000 --- a/packages/util-crypto/src/random/asHex.ts +++ /dev/null @@ -1,28 +0,0 @@ -// Copyright 2017-2021 @polkadot/util-crypto authors & contributors -// SPDX-License-Identifier: Apache-2.0 - -import type { HexString } from '@polkadot/util/types'; - -import { u8aToHex } from '@polkadot/util'; - -import { randomAsU8a } from './asU8a'; - -/** - * @name randomAsHex - * @summary Creates a hex string filled with random bytes. - * @description - * Returns a hex string with the specified (optional) length filled with random bytes. - * @example - *
- * - * ```javascript - * import { randomAsHex } from '@polkadot/util-crypto'; - * - * randomAsHex(); // => 0x... - * ``` - */ -export function randomAsHex (length = 32): HexString { - return u8aToHex( - randomAsU8a(length) - ); -} diff --git a/packages/util-crypto/src/random/asNumber.ts b/packages/util-crypto/src/random/asNumber.ts index fdbb466c1..f68976b57 100644 --- a/packages/util-crypto/src/random/asNumber.ts +++ b/packages/util-crypto/src/random/asNumber.ts @@ -3,7 +3,7 @@ import { BN, hexToBn } from '@polkadot/util'; -import { randomAsHex } from './asHex'; +import { randomAsHex } from './asU8a'; const BN_53 = new BN(0b11111111111111111111111111111111111111111111111111111); diff --git a/packages/util-crypto/src/random/asU8a.ts b/packages/util-crypto/src/random/asU8a.ts index 4cf28d468..8d06c611e 100644 --- a/packages/util-crypto/src/random/asU8a.ts +++ b/packages/util-crypto/src/random/asU8a.ts @@ -3,6 +3,8 @@ import { getRandomValues } from '@polkadot/x-randomvalues'; +import { createAsHex } from '../helpers'; + /** * @name randomAsU8a * @summary Creates a Uint8Array filled with random bytes. @@ -20,3 +22,9 @@ import { getRandomValues } from '@polkadot/x-randomvalues'; export function randomAsU8a (length = 32): Uint8Array { return getRandomValues(new Uint8Array(length)); } + +/** + * @name randomAsHex + * @description Creates a hex string filled with random bytes. + */ +export const randomAsHex = createAsHex(randomAsU8a); diff --git a/packages/util-crypto/src/random/index.ts b/packages/util-crypto/src/random/index.ts index e6fc45065..b2b95af38 100644 --- a/packages/util-crypto/src/random/index.ts +++ b/packages/util-crypto/src/random/index.ts @@ -5,6 +5,5 @@ * @summary Returns a sequence of secure random bytes in a variety of formats */ -export { randomAsHex } from './asHex'; export { randomAsNumber } from './asNumber'; -export { randomAsU8a } from './asU8a'; +export { randomAsHex, randomAsU8a } from './asU8a'; diff --git a/packages/util-crypto/src/scrypt/encode.ts b/packages/util-crypto/src/scrypt/encode.ts index 6db161a19..bb9dd4ec2 100644 --- a/packages/util-crypto/src/scrypt/encode.ts +++ b/packages/util-crypto/src/scrypt/encode.ts @@ -7,8 +7,9 @@ import type { Params } from './types'; import scryptsy from 'scryptsy'; import { bufferToU8a, u8aToBuffer, u8aToU8a } from '@polkadot/util'; -import { isReady, scrypt } from '@polkadot/wasm-crypto'; +import { scrypt } from '@polkadot/wasm-crypto'; +import { isWasmOnly } from '../helpers'; import { randomAsU8a } from '../random/asU8a'; import { DEFAULT_PARAMS } from './defaults'; @@ -21,7 +22,7 @@ interface Result { export function scryptEncode (passphrase?: HexString | Uint8Array | string, salt = randomAsU8a(), params = DEFAULT_PARAMS, onlyJs?: boolean): Result { const u8a = u8aToU8a(passphrase); - const password = isReady() && !onlyJs + const password = isWasmOnly(onlyJs) ? scrypt(u8a, salt, Math.log2(params.N), params.r, params.p) : bufferToU8a( scryptsy(u8aToBuffer(u8a), u8aToBuffer(salt), params.N, params.r, params.p, 64) diff --git a/packages/util-crypto/src/sha/asU8a.ts b/packages/util-crypto/src/sha/asU8a.ts index 199ef026c..b79340186 100644 --- a/packages/util-crypto/src/sha/asU8a.ts +++ b/packages/util-crypto/src/sha/asU8a.ts @@ -6,14 +6,9 @@ import type { HexString } from '@polkadot/util/types'; import hash from 'hash.js'; import { u8aToU8a } from '@polkadot/util'; -import { isReady, sha256, sha512 } from '@polkadot/wasm-crypto'; +import { sha256, sha512 } from '@polkadot/wasm-crypto'; -type HashFn = (value: HexString | Buffer | Uint8Array | string, onlyJs?: boolean) => Uint8Array; - -function createSha (bitLength: 256 | 512 = 256): HashFn { - return (value: HexString | Buffer | Uint8Array | string, onlyJs?: boolean): Uint8Array => - shaAsU8a(value, bitLength, onlyJs); -} +import { createBitHasher, isWasmOnly } from '../helpers'; /** * @name shaAsU8a @@ -23,7 +18,7 @@ export function shaAsU8a (value: HexString | Buffer | Uint8Array | string, bitLe const is256 = bitLength === 256; const u8a = u8aToU8a(value); - return isReady() && !onlyJs + return isWasmOnly(onlyJs) ? is256 ? sha256(u8a) : sha512(u8a) @@ -34,5 +29,5 @@ export function shaAsU8a (value: HexString | Buffer | Uint8Array | string, bitLe ); } -export const sha256AsU8a = createSha(256); -export const sha512AsU8a = createSha(512); +export const sha256AsU8a = createBitHasher(256, shaAsU8a); +export const sha512AsU8a = createBitHasher(512, shaAsU8a); diff --git a/packages/util-crypto/src/xxhash/asHex.ts b/packages/util-crypto/src/xxhash/asHex.ts deleted file mode 100644 index a374e1c13..000000000 --- a/packages/util-crypto/src/xxhash/asHex.ts +++ /dev/null @@ -1,28 +0,0 @@ -// Copyright 2017-2021 @polkadot/util-crypto authors & contributors -// SPDX-License-Identifier: Apache-2.0 - -import type { HexString } from '@polkadot/util/types'; - -import { u8aToHex } from '@polkadot/util'; - -import { xxhashAsU8a } from './asU8a'; - -/** - * @name xxhashAsHex - * @summary Creates a xxhash64 hex from the input. - * @description - * From either a `string`, `Uint8Array` or a `Buffer` input, create the xxhash64 and return the result as a hex string with the specified `bitLength`. - * @example - *
- * - * ```javascript - * import { xxhashAsHex } from '@polkadot/util-crypto'; - * - * xxhashAsHex('abc'); // => 0x44bc2cf5ad770999 - * ``` - */ -export function xxhashAsHex (data: HexString | Buffer | Uint8Array | string, bitLength = 64): HexString { - return u8aToHex( - xxhashAsU8a(data, bitLength) - ); -} diff --git a/packages/util-crypto/src/xxhash/asU8a.ts b/packages/util-crypto/src/xxhash/asU8a.ts index 8e826fe19..ea04da21c 100644 --- a/packages/util-crypto/src/xxhash/asU8a.ts +++ b/packages/util-crypto/src/xxhash/asU8a.ts @@ -4,8 +4,9 @@ import type { HexString } from '@polkadot/util/types'; import { u8aToU8a } from '@polkadot/util'; -import { isReady, twox } from '@polkadot/wasm-crypto'; +import { twox } from '@polkadot/wasm-crypto'; +import { createAsHex, isWasmOnly } from '../helpers'; import xxhash64AsBn from './xxhash64/asBn'; /** @@ -26,7 +27,7 @@ export function xxhashAsU8a (data: HexString | Buffer | Uint8Array | string, bit const iterations = Math.ceil(bitLength / 64); const u8a = u8aToU8a(data); - if (isReady() && !onlyJs) { + if (isWasmOnly(onlyJs)) { return twox(u8a, iterations); } @@ -38,3 +39,9 @@ export function xxhashAsU8a (data: HexString | Buffer | Uint8Array | string, bit return result; } + +/** + * @name xxhashAsHex + * @description Creates a xxhash64 hex from the input. + */ +export const xxhashAsHex = createAsHex(xxhashAsU8a); diff --git a/packages/util-crypto/src/xxhash/index.ts b/packages/util-crypto/src/xxhash/index.ts index 114a11a7b..e82e58ef9 100644 --- a/packages/util-crypto/src/xxhash/index.ts +++ b/packages/util-crypto/src/xxhash/index.ts @@ -5,5 +5,4 @@ * @summary Create xxhash64 values with specified bitlengths */ -export { xxhashAsHex } from './asHex'; -export { xxhashAsU8a } from './asU8a'; +export { xxhashAsHex, xxhashAsU8a } from './asU8a';