]> zoso.dev Git - libnemo.git/commitdiff
Nano spec indicates account derivation should use index in unsigned 32-bit big endian...
authorChris Duncan <chris@zoso.dev>
Wed, 6 Nov 2024 07:08:21 +0000 (23:08 -0800)
committerChris Duncan <chris@zoso.dev>
Wed, 6 Nov 2024 07:08:21 +0000 (23:08 -0800)
src/lib/tools.ts
src/lib/wallet.ts

index 797ce0300b969f69c1b8bb115136b39f5a5792b1..20065ad219e009cc9bd9d6b5c0a9433c9022ca23 100644 (file)
@@ -11,6 +11,19 @@ import { Rpc } from './rpc.js'
 import { Bip44Wallet, Blake2bWallet, LedgerWallet } from './wallet.js'
 import { SendBlock } from './block.js'
 
+/**
+* Hashes data using BLAKE2b.
+*
+* @param {string|string[]} data - Hexadecimal-formatted data to hash
+* @returns {Promise<Uint8Array>} Array of bytes representing hashed input data
+*/
+export async function blake2b (data: string | string[]): Promise<Uint8Array> {
+       if (!Array.isArray(data)) data = [data]
+       const ctx = blake2bInit(32)
+       data.forEach(str => blake2bUpdate(ctx, hex.toBytes(str)))
+       return blake2bFinal(ctx)
+}
+
 /**
 * Converts a decimal amount from one unit divider to another.
 *
@@ -61,19 +74,6 @@ export async function convert (amount: bigint | string, inputUnit: string, outpu
        return `${i}${f ? '.' : ''}${f}`
 }
 
-/**
-* Hashes data using BLAKE2b.
-*
-* @param {string|string[]} data - Hexadecimal-formatted data to hash
-* @returns {Promise<Uint8Array>} Array of bytes representing hashed input data
-*/
-export async function blake2b (data: string | string[]): Promise<Uint8Array> {
-       if (!Array.isArray(data)) data = [data]
-       const ctx = blake2bInit(32)
-       data.forEach(str => blake2bUpdate(ctx, hex.toBytes(str)))
-       return blake2bFinal(ctx)
-}
-
 /**
 * Converts one or more strings to hexadecimal and hashes them with BLAKE2b.
 *
@@ -88,6 +88,18 @@ export async function hash (data: string | string[]): Promise<string> {
        return bytes.toHex(hash)
 }
 
+
+/**
+* Checks the endianness of the current machine.
+*
+* @returns {Promise<boolean>} True if little-endian, else false
+*/
+export async function littleEndian () {
+       const buffer = new ArrayBuffer(2)
+       new DataView(buffer).setUint16(0, 256, true)
+       return new Uint16Array(buffer)[0] === 256
+}
+
 /**
 * Signs arbitrary strings with a private key using the Ed25519 signature scheme.
 *
@@ -175,4 +187,4 @@ export async function verify (key: string, signature: string, ...input: string[]
                hex.toBytes(signature))
 }
 
-export default { blake2b, convert, hash, sign, sweep, verify }
+export default { blake2b, convert, hash, littleEndian, sign, sweep, verify }
index 96b65ad935cdb1b8f3cb10d2b07dedfdab86aa2b..3608804b155f2b8df326918201d15dc9b01ccee8 100644 (file)
@@ -539,7 +539,11 @@ export class Blake2bWallet extends Wallet {
        * @returns {Promise<Account>}\r
        */\r
        async ckd (index: number): Promise<Account> {\r
-               const hash = await Tools.blake2b([this.seed, dec.toHex(index, 4)])\r
+               const indexBytes = dec.toBytes(index, 4)\r
+               if (await Tools.littleEndian()) {\r
+                       indexBytes.reverse()\r
+               }\r
+               const hash = await Tools.blake2b([this.seed, bytes.toHex(indexBytes)])\r
                const key = bytes.toHex(hash)\r
                return await Account.fromPrivateKey(key, index)\r
        }\r