Files
xahau.js/packages/isomorphic/README.md
Nicholas Dudfield 217b111ef2 feat: use @noble and @scure libraries for cryptography (#2273)
Switch to using `@noble/hashes`, `@noble/curves`, `@scure/base`,
`@scure/bip32`, and `@scure/bip39`. This replaces `crypto` polyfills
(such as `crypto-browserify`), `create-hash`, `elliptic`, `hash.js`,
`bn.js` (both versions), and their many dependencies.  This also means
there are 33 less dependencies downloaded when running a fresh
`npm install` and will make the project much easier to maintain.

This reduces the bundle size by 44% (82kb minified and gzipped) over
the current 3.0 branch as well as reducing the amount of configuration
required to bundle.

Closes #1814, #1817, #2272, and #2306

Co-authored-by: Caleb Kniffen <ckniffen@ripple.com>
2024-02-01 13:50:19 -06:00

2.2 KiB

@xrplf/isomorphic

A collection of isomorphic implementations of crypto and utility functions.

Browser implementations of cryptographic functions use @noble/hashes and crypto for node .

Hashes

All hash functions operate similarly to @noble/hashes and have the following properties:

  • They can be called directly by providing a Uint8Array or string which will be converted into a UInt8Array via UTF-8 encoding (not hex).
  • They all return a UInt8Array.
function hash(message: Uint8Array | string): Uint8Array;
hash(new Uint8Array([1, 3]));
hash('string') == hash(new TextEncoder().encode('string'));

All hash functions can be constructed via hash.create() method:

  • The result is Hash subclass instance, which has update() and digest() methods.
  • digest() finalizes the hash and makes it no longer usable
hash
  .create()
  .update(new Uint8Array([1, 3]))
  .digest();

@xrplf/isomorphic/ripemd160

import { ripemd160 } from '@xrplf/isomorphic/ripemd160';
const hashA = ripemd160('abc');
const hashB = ripemd160
  .create()
  .update(Uint8Array.from([1, 2, 3]))
  .digest();

@xrplf/isomorphic/sha256

import { sha256 } from '@xrplf/isomorphic/sha256';
const hashA = sha256('abc');
const hashB = sha256
  .create()
  .update(Uint8Array.from([1, 2, 3]))
  .digest();

@xrplf/isomorphic/sha512

import { sha512 } from '@xrplf/isomorphic/sha512';
const hashA = sha512('abc');
const hashB = sha512
  .create()
  .update(Uint8Array.from([1, 2, 3]))
  .digest();

Utilities

@xrplf/isomorphic/utils

randomBytes

Create an UInt8Array of the supplied size

import { randomBytes } from @xrplf/isomorphic/utils

console.log(randomBytes(12)) // Uint8Array(12) [95, 236, 188,  55, 208, 128, 161, 249, 171, 57, 141, 7]

bytesToHex

Convert an UInt8Array to hex.

import { bytesToHex } from @xrplf/isomorphic/utils

console.log(bytesToHex([222, 173, 190, 239])) // "DEADBEEF"

hexToBytes

Convert hex to an UInt8Array.

import { hexToBytes } from @xrplf/isomorphic/utils

console.log(hexToBytes('DEADBEEF')) // [222, 173, 190, 239]

@xrplf/isomorphic/ws

// TODO: Websocket Wrapper and ws