From cdd8d1c8c37db641bd995b2c470ad0b4fdddb93f Mon Sep 17 00:00:00 2001 From: Georgi Tsonev Date: Fri, 24 Nov 2023 11:58:03 +0200 Subject: [PATCH 1/2] fix: replace tweetncal by @noble/curves --- .changeset/strong-dots-design.md | 8 ++ packages/crypto/package.json | 2 +- packages/crypto/src/constants.ts | 4 + packages/crypto/src/key_pair_ed25519.ts | 24 ++-- packages/crypto/src/public_key.ts | 10 +- packages/near-api-js/package.json | 2 +- pnpm-lock.yaml | 170 ++++++++++++++---------- 7 files changed, 136 insertions(+), 84 deletions(-) create mode 100644 .changeset/strong-dots-design.md diff --git a/.changeset/strong-dots-design.md b/.changeset/strong-dots-design.md new file mode 100644 index 0000000000..a147bb0dc7 --- /dev/null +++ b/.changeset/strong-dots-design.md @@ -0,0 +1,8 @@ +--- +"@near-js/accounts": patch +"@near-js/crypto": patch +"near-api-js": patch +"@near-js/providers": patch +--- + +Replace tweetnacl by @noble/curves diff --git a/packages/crypto/package.json b/packages/crypto/package.json index 8757b4e603..b6b5bbfb58 100644 --- a/packages/crypto/package.json +++ b/packages/crypto/package.json @@ -20,7 +20,7 @@ "@near-js/utils": "workspace:*", "bn.js": "5.2.1", "borsh": "1.0.0", - "tweetnacl": "^1.0.1" + "@noble/curves": "1.2.0" }, "devDependencies": { "@types/node": "^18.11.18", diff --git a/packages/crypto/src/constants.ts b/packages/crypto/src/constants.ts index d61ef34fa0..30197c4478 100644 --- a/packages/crypto/src/constants.ts +++ b/packages/crypto/src/constants.ts @@ -2,3 +2,7 @@ export enum KeyType { ED25519 = 0, } + +export enum KeySize { + SECRET_KEY = 32 +} \ No newline at end of file diff --git a/packages/crypto/src/key_pair_ed25519.ts b/packages/crypto/src/key_pair_ed25519.ts index 031b106724..df20f0b548 100644 --- a/packages/crypto/src/key_pair_ed25519.ts +++ b/packages/crypto/src/key_pair_ed25519.ts @@ -1,7 +1,8 @@ import { baseEncode, baseDecode } from '@near-js/utils'; -import nacl from 'tweetnacl'; +import { ed25519 } from '@noble/curves/ed25519'; +import { webcrypto } from 'crypto'; -import { KeyType } from './constants'; +import { KeySize, KeyType } from './constants'; import { KeyPairBase, Signature } from './key_pair_base'; import { PublicKey } from './public_key'; @@ -20,9 +21,11 @@ export class KeyPairEd25519 extends KeyPairBase { */ constructor(secretKey: string) { super(); - const keyPair = nacl.sign.keyPair.fromSecretKey(baseDecode(secretKey)); - this.publicKey = new PublicKey({ keyType: KeyType.ED25519, data: keyPair.publicKey }); - this.secretKey = secretKey; + const decoded = baseDecode(secretKey); + const sk = new Uint8Array(decoded.slice(0, KeySize.SECRET_KEY)); + const publicKey = ed25519.getPublicKey(sk); + this.publicKey = new PublicKey({ keyType: KeyType.ED25519, data: publicKey }); + this.secretKey = baseEncode(sk); } /** @@ -36,12 +39,14 @@ export class KeyPairEd25519 extends KeyPairBase { * // returns [SECRET_KEY] */ static fromRandom() { - const newKeyPair = nacl.sign.keyPair(); - return new KeyPairEd25519(baseEncode(newKeyPair.secretKey)); + const sk = webcrypto.getRandomValues(new Uint8Array(KeySize.SECRET_KEY)); + const pk = ed25519.getPublicKey(sk); + const extendedSC = new Uint8Array([...sk, ...pk]); + return new KeyPairEd25519(baseEncode(extendedSC)); } sign(message: Uint8Array): Signature { - const signature = nacl.sign.detached(message, baseDecode(this.secretKey)); + const signature = ed25519.sign(message, baseDecode(this.secretKey)); return { signature, publicKey: this.publicKey }; } @@ -50,7 +55,8 @@ export class KeyPairEd25519 extends KeyPairBase { } toString(): string { - return `ed25519:${this.secretKey}`; + const extendedSK = baseEncode(new Uint8Array([...baseDecode(this.secretKey), ...this.publicKey.data])); + return `ed25519:${extendedSK}`; } getPublicKey(): PublicKey { diff --git a/packages/crypto/src/public_key.ts b/packages/crypto/src/public_key.ts index 2e337787df..0959cd4d6e 100644 --- a/packages/crypto/src/public_key.ts +++ b/packages/crypto/src/public_key.ts @@ -1,8 +1,8 @@ import { Assignable } from '@near-js/types'; import { baseEncode, baseDecode } from '@near-js/utils'; -import nacl from 'tweetnacl'; +import { ed25519 } from '@noble/curves/ed25519'; -import { KeyType } from './constants'; +import { KeySize, KeyType } from './constants'; function key_type_to_str(keyType: KeyType): string { switch (keyType) { @@ -45,8 +45,8 @@ export class PublicKey extends Assignable { throw new Error('Invalid encoded key format, must be :'); } const decodedPublicKey = baseDecode(publicKey); - if(decodedPublicKey.length !== nacl.box.publicKeyLength) { - throw new Error(`Invalid public key size (${decodedPublicKey.length}), must be ${nacl.box.publicKeyLength}`); + if(decodedPublicKey.length !== KeySize.SECRET_KEY) { + throw new Error(`Invalid public key size (${decodedPublicKey.length}), must be ${KeySize.SECRET_KEY}`); } return new PublicKey({ keyType, data: decodedPublicKey }); } @@ -57,7 +57,7 @@ export class PublicKey extends Assignable { verify(message: Uint8Array, signature: Uint8Array): boolean { switch (this.keyType) { - case KeyType.ED25519: return nacl.sign.detached.verify(message, signature, this.data); + case KeyType.ED25519: return ed25519.verify(signature, message, this.data); default: throw new Error(`Unknown key type ${this.keyType}`); } } diff --git a/packages/near-api-js/package.json b/packages/near-api-js/package.json index d64ded4884..df68639140 100644 --- a/packages/near-api-js/package.json +++ b/packages/near-api-js/package.json @@ -31,7 +31,7 @@ "http-errors": "^1.7.2", "near-abi": "0.1.1", "node-fetch": "^2.6.1", - "tweetnacl": "^1.0.1" + "@noble/curves": "1.2.0" }, "devDependencies": { "@types/bn.js": "^5.1.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9f0204836b..11adb2d17e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,5 +1,9 @@ lockfileVersion: '6.0' +settings: + autoInstallPeers: false + excludeLinksFromLockfile: false + importers: .: @@ -94,7 +98,7 @@ importers: version: 4.0.0 jest: specifier: ^26.0.1 - version: 26.0.1(ts-node@10.9.1) + version: 26.0.1 near-hello: specifier: ^0.5.1 version: 0.5.1 @@ -183,22 +187,22 @@ importers: '@near-js/utils': specifier: workspace:* version: link:../utils + '@noble/curves': + specifier: 1.2.0 + version: 1.2.0 bn.js: specifier: 5.2.1 version: 5.2.1 borsh: specifier: 1.0.0 version: 1.0.0 - tweetnacl: - specifier: ^1.0.1 - version: 1.0.1 devDependencies: '@types/node': specifier: ^18.11.18 version: 18.16.1 jest: specifier: ^26.0.1 - version: 26.0.1(ts-node@10.9.1) + version: 26.0.1 ts-jest: specifier: ^26.5.6 version: 26.5.6(jest@26.0.1)(typescript@4.9.4) @@ -230,7 +234,7 @@ importers: version: 18.16.1 jest: specifier: ^26.0.1 - version: 26.0.1(ts-node@10.9.1) + version: 26.0.1 ts-jest: specifier: ^26.5.6 version: 26.5.6(jest@26.0.1)(typescript@4.9.4) @@ -249,7 +253,7 @@ importers: devDependencies: jest: specifier: ^26.0.1 - version: 26.0.1(ts-node@10.9.1) + version: 26.0.1 ts-jest: specifier: ^26.5.6 version: 26.5.6(jest@26.0.1)(typescript@4.9.4) @@ -271,7 +275,7 @@ importers: version: 18.16.1 jest: specifier: ^26.0.1 - version: 26.0.1(ts-node@10.9.1) + version: 26.0.1 ts-jest: specifier: ^26.5.6 version: 26.5.6(jest@26.0.1)(typescript@4.9.4) @@ -314,6 +318,9 @@ importers: '@near-js/wallet-account': specifier: workspace:* version: link:../wallet-account + '@noble/curves': + specifier: 1.2.0 + version: 1.2.0 ajv: specifier: ^8.11.2 version: 8.11.2 @@ -341,9 +348,6 @@ importers: node-fetch: specifier: ^2.6.1 version: 2.6.1 - tweetnacl: - specifier: ^1.0.1 - version: 1.0.1 devDependencies: '@types/bn.js': specifier: ^5.1.0 @@ -377,7 +381,7 @@ importers: version: 2.0.0 jest: specifier: ^26.0.1 - version: 26.0.1(ts-node@10.9.1) + version: 26.0.1 localstorage-memory: specifier: ^1.0.3 version: 1.0.3 @@ -392,7 +396,7 @@ importers: version: 7.1.1 ts-jest: specifier: ^26.5.6 - version: 26.5.6(jest@26.0.1)(typescript@4.9.4) + version: 26.5.6(jest@26.0.1) uglifyify: specifier: ^5.0.1 version: 5.0.1 @@ -420,14 +424,14 @@ importers: optionalDependencies: node-fetch: specifier: ^2.6.1 - version: 2.6.1 + version: 2.6.12 devDependencies: '@types/node': specifier: ^18.11.18 version: 18.16.1 jest: specifier: ^26.0.1 - version: 26.0.1(ts-node@10.9.1) + version: 26.0.1 ts-jest: specifier: ^26.5.6 version: 26.5.6(jest@26.0.1)(typescript@4.9.4) @@ -452,7 +456,7 @@ importers: version: 18.16.1 jest: specifier: ^26.0.1 - version: 26.0.1(ts-node@10.9.1) + version: 26.0.1 ts-jest: specifier: ^26.5.6 version: 26.5.6(jest@26.0.1)(typescript@4.9.4) @@ -492,7 +496,7 @@ importers: version: 18.16.1 jest: specifier: ^26.0.1 - version: 26.0.1(ts-node@10.9.1) + version: 26.0.1 ts-jest: specifier: ^26.5.6 version: 26.5.6(jest@26.0.1)(typescript@4.9.4) @@ -511,7 +515,7 @@ importers: version: 18.16.1 jest: specifier: ^26.0.1 - version: 26.0.1(ts-node@10.9.1) + version: 26.0.1 ts-jest: specifier: ^26.5.6 version: 26.5.6(jest@26.0.1)(typescript@4.9.4) @@ -542,7 +546,7 @@ importers: version: 18.16.1 jest: specifier: ^26.0.1 - version: 26.0.1(ts-node@10.9.1) + version: 26.0.1 ts-jest: specifier: ^26.5.6 version: 26.5.6(jest@26.0.1)(typescript@4.9.4) @@ -585,7 +589,7 @@ importers: version: 18.16.1 jest: specifier: ^26.0.1 - version: 26.0.1(ts-node@10.9.1) + version: 26.0.1 localstorage-memory: specifier: ^1.0.3 version: 1.0.3 @@ -1314,15 +1318,15 @@ packages: '@commitlint/execute-rule': 17.4.0 '@commitlint/resolve-extends': 17.6.7 '@commitlint/types': 17.4.4 - '@types/node': 18.17.2 + '@types/node': 20.9.4 chalk: 4.1.2 cosmiconfig: 8.2.0 - cosmiconfig-typescript-loader: 4.4.0(@types/node@18.17.2)(cosmiconfig@8.2.0)(ts-node@10.9.1)(typescript@4.9.4) + cosmiconfig-typescript-loader: 4.4.0(@types/node@20.9.4)(cosmiconfig@8.2.0)(ts-node@10.9.1)(typescript@4.9.4) lodash.isplainobject: 4.0.6 lodash.merge: 4.6.2 lodash.uniq: 4.5.0 resolve-from: 5.0.0 - ts-node: 10.9.1(@types/node@18.17.2)(typescript@4.9.4) + ts-node: 10.9.1(@types/node@20.9.4)(typescript@4.9.4) typescript: 4.9.4 transitivePeerDependencies: - '@swc/core' @@ -1467,7 +1471,7 @@ packages: slash: 3.0.0 dev: true - /@jest/core@26.6.3(ts-node@10.9.1): + /@jest/core@26.6.3: resolution: {integrity: sha512-xvV1kKbhfUqFVuZ8Cyo+JPpipAHHAV3kcDBftiduK8EICXmTFddryy3P7NfZt8Pv37rA9nEJBKCCkglCPt/Xjw==} engines: {node: '>= 10.14.2'} dependencies: @@ -1482,14 +1486,14 @@ packages: exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 26.6.2 - jest-config: 26.6.3(ts-node@10.9.1) + jest-config: 26.6.3 jest-haste-map: 26.6.2 jest-message-util: 26.6.2 jest-regex-util: 26.0.0 jest-resolve: 26.6.2 jest-resolve-dependencies: 26.6.3 - jest-runner: 26.6.3(ts-node@10.9.1) - jest-runtime: 26.6.3(ts-node@10.9.1) + jest-runner: 26.6.3 + jest-runtime: 26.6.3 jest-snapshot: 26.6.2 jest-util: 26.6.2 jest-validate: 26.6.2 @@ -1591,15 +1595,15 @@ packages: collect-v8-coverage: 1.0.2 dev: true - /@jest/test-sequencer@26.6.3(ts-node@10.9.1): + /@jest/test-sequencer@26.6.3: resolution: {integrity: sha512-YHlVIjP5nfEyjlrSr8t/YdNfU/1XEt7c5b4OxcXCjyRhjzLYu/rO69/WHPuYcbCWkz8kAeZVZp2N2+IOLLEPGw==} engines: {node: '>= 10.14.2'} dependencies: '@jest/test-result': 26.6.2 graceful-fs: 4.2.11 jest-haste-map: 26.6.2 - jest-runner: 26.6.3(ts-node@10.9.1) - jest-runtime: 26.6.3(ts-node@10.9.1) + jest-runner: 26.6.3 + jest-runtime: 26.6.3 transitivePeerDependencies: - bufferutil - canvas @@ -1708,6 +1712,17 @@ packages: read-yaml-file: 1.1.0 dev: true + /@noble/curves@1.2.0: + resolution: {integrity: sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==} + dependencies: + '@noble/hashes': 1.3.2 + dev: false + + /@noble/hashes@1.3.2: + resolution: {integrity: sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==} + engines: {node: '>= 16'} + dev: false + /@nodelib/fs.scandir@2.1.5: resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} @@ -1977,8 +1992,10 @@ packages: resolution: {integrity: sha512-DZxSZWXxFfOlx7k7Rv4LAyiMroaxa3Ly/7OOzZO8cBNho0YzAi4qlbrx8W27JGqG57IgR/6J7r+nOJWw6kcvZA==} dev: true - /@types/node@18.17.2: - resolution: {integrity: sha512-wBo3KqP/PBqje5TI9UTiuL3yWfP6sdPtjtygSOqcYZWT232dfDeDOnkDps5wqZBP9NgGgYrNejinl0faAuE+HQ==} + /@types/node@20.9.4: + resolution: {integrity: sha512-wmyg8HUhcn6ACjsn8oKYjkN/zUzQeNtMy44weTJSM6p4MMzEOuKbA3OjJ267uPCOW7Xex9dyrNTful8XTQYoDA==} + dependencies: + undici-types: 5.26.5 dev: true /@types/normalize-package-data@2.4.1: @@ -3183,7 +3200,7 @@ packages: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} dev: true - /cosmiconfig-typescript-loader@4.4.0(@types/node@18.17.2)(cosmiconfig@8.2.0)(ts-node@10.9.1)(typescript@4.9.4): + /cosmiconfig-typescript-loader@4.4.0(@types/node@20.9.4)(cosmiconfig@8.2.0)(ts-node@10.9.1)(typescript@4.9.4): resolution: {integrity: sha512-BabizFdC3wBHhbI4kJh0VkQP9GkBfoHPydD0COMce1nJ1kJAB3F2TmJ/I7diULBKtmEWSwEbuN/KDtgnmUUVmw==} engines: {node: '>=v14.21.3'} peerDependencies: @@ -3192,9 +3209,9 @@ packages: ts-node: '>=10' typescript: '>=4' dependencies: - '@types/node': 18.17.2 + '@types/node': 20.9.4 cosmiconfig: 8.2.0 - ts-node: 10.9.1(@types/node@18.17.2)(typescript@4.9.4) + ts-node: 10.9.1(@types/node@20.9.4)(typescript@4.9.4) typescript: 4.9.4 dev: true @@ -4433,6 +4450,8 @@ packages: li: 1.3.0 query-string: 6.14.1 universal-url: 2.0.0 + transitivePeerDependencies: + - encoding dev: true /glob-parent@5.1.2: @@ -5237,12 +5256,12 @@ packages: throat: 5.0.0 dev: true - /jest-cli@26.6.3(ts-node@10.9.1): + /jest-cli@26.6.3: resolution: {integrity: sha512-GF9noBSa9t08pSyl3CY4frMrqp+aQXFGFkf5hEPbh/pIUFYWMK6ZLTfbmadxJVcJrdRoChlWQsA2VkJcDFK8hg==} engines: {node: '>= 10.14.2'} hasBin: true dependencies: - '@jest/core': 26.6.3(ts-node@10.9.1) + '@jest/core': 26.6.3 '@jest/test-result': 26.6.2 '@jest/types': 26.6.2 chalk: 4.1.2 @@ -5250,7 +5269,7 @@ packages: graceful-fs: 4.2.11 import-local: 3.1.0 is-ci: 2.0.0 - jest-config: 26.6.3(ts-node@10.9.1) + jest-config: 26.6.3 jest-util: 26.6.2 jest-validate: 26.6.2 prompts: 2.4.2 @@ -5263,7 +5282,7 @@ packages: - utf-8-validate dev: true - /jest-config@26.6.3(ts-node@10.9.1): + /jest-config@26.6.3: resolution: {integrity: sha512-t5qdIj/bCj2j7NFVHb2nFB4aUdfucDn3JRKgrZnplb8nieAirAzRSHP8uDEd+qV6ygzg9Pz4YG7UTJf94LPSyg==} engines: {node: '>= 10.14.2'} peerDependencies: @@ -5273,7 +5292,7 @@ packages: optional: true dependencies: '@babel/core': 7.22.9 - '@jest/test-sequencer': 26.6.3(ts-node@10.9.1) + '@jest/test-sequencer': 26.6.3 '@jest/types': 26.6.2 babel-jest: 26.6.3(@babel/core@7.22.9) chalk: 4.1.2 @@ -5283,14 +5302,13 @@ packages: jest-environment-jsdom: 26.6.2 jest-environment-node: 26.6.2 jest-get-type: 26.3.0 - jest-jasmine2: 26.6.3(ts-node@10.9.1) + jest-jasmine2: 26.6.3 jest-regex-util: 26.0.0 jest-resolve: 26.6.2 jest-util: 26.6.2 jest-validate: 26.6.2 micromatch: 4.0.5 pretty-format: 26.6.2 - ts-node: 10.9.1(@types/node@18.17.2)(typescript@4.9.4) transitivePeerDependencies: - bufferutil - canvas @@ -5384,7 +5402,7 @@ packages: - supports-color dev: true - /jest-jasmine2@26.6.3(ts-node@10.9.1): + /jest-jasmine2@26.6.3: resolution: {integrity: sha512-kPKUrQtc8aYwBV7CqBg5pu+tmYXlvFlSFYn18ev4gPFtrRzB15N2gW/Roew3187q2w2eHuu0MU9TJz6w0/nPEg==} engines: {node: '>= 10.14.2'} dependencies: @@ -5401,7 +5419,7 @@ packages: jest-each: 26.6.2 jest-matcher-utils: 26.6.2 jest-message-util: 26.6.2 - jest-runtime: 26.6.3(ts-node@10.9.1) + jest-runtime: 26.6.3 jest-snapshot: 26.6.2 jest-util: 26.6.2 pretty-format: 26.6.2 @@ -5497,7 +5515,7 @@ packages: slash: 3.0.0 dev: true - /jest-runner@26.6.3(ts-node@10.9.1): + /jest-runner@26.6.3: resolution: {integrity: sha512-atgKpRHnaA2OvByG/HpGA4g6CSPS/1LK0jK3gATJAoptC1ojltpmVlYC3TYgdmGp+GLuhzpH30Gvs36szSL2JQ==} engines: {node: '>= 10.14.2'} dependencies: @@ -5510,13 +5528,13 @@ packages: emittery: 0.7.2 exit: 0.1.2 graceful-fs: 4.2.11 - jest-config: 26.6.3(ts-node@10.9.1) + jest-config: 26.6.3 jest-docblock: 26.0.0 jest-haste-map: 26.6.2 jest-leak-detector: 26.6.2 jest-message-util: 26.6.2 jest-resolve: 26.6.2 - jest-runtime: 26.6.3(ts-node@10.9.1) + jest-runtime: 26.6.3 jest-util: 26.6.2 jest-worker: 26.6.2 source-map-support: 0.5.21 @@ -5529,7 +5547,7 @@ packages: - utf-8-validate dev: true - /jest-runtime@26.6.3(ts-node@10.9.1): + /jest-runtime@26.6.3: resolution: {integrity: sha512-lrzyR3N8sacTAMeonbqpnSka1dHNux2uk0qqDXVkMv2c/A3wYnvQ4EXuI013Y6+gSKSCxdaczvf4HF0mVXHRdw==} engines: {node: '>= 10.14.2'} hasBin: true @@ -5549,7 +5567,7 @@ packages: exit: 0.1.2 glob: 7.2.3 graceful-fs: 4.2.11 - jest-config: 26.6.3(ts-node@10.9.1) + jest-config: 26.6.3 jest-haste-map: 26.6.2 jest-message-util: 26.6.2 jest-mock: 26.6.2 @@ -5647,14 +5665,14 @@ packages: supports-color: 7.2.0 dev: true - /jest@26.0.1(ts-node@10.9.1): + /jest@26.0.1: resolution: {integrity: sha512-29Q54kn5Bm7ZGKIuH2JRmnKl85YRigp0o0asTc6Sb6l2ch1DCXIeZTLLFy9ultJvhkTqbswF5DEx4+RlkmCxWg==} engines: {node: '>= 10.14.2'} hasBin: true dependencies: - '@jest/core': 26.6.3(ts-node@10.9.1) + '@jest/core': 26.6.3 import-local: 3.1.0 - jest-cli: 26.6.3(ts-node@10.9.1) + jest-cli: 26.6.3 transitivePeerDependencies: - bufferutil - canvas @@ -5870,7 +5888,9 @@ packages: dependencies: abort-controller: 3.0.0 ky: 0.12.0 - node-fetch: 2.6.1 + node-fetch: 2.6.12 + transitivePeerDependencies: + - encoding dev: true /ky@0.12.0: @@ -6353,6 +6373,7 @@ packages: /node-fetch@2.6.1: resolution: {integrity: sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==} engines: {node: 4.x || >=6.0.0} + dev: false /node-fetch@2.6.12: resolution: {integrity: sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g==} @@ -6364,7 +6385,6 @@ packages: optional: true dependencies: whatwg-url: 5.0.0 - dev: true /node-gyp-build-optional-packages@5.0.3: resolution: {integrity: sha512-k75jcVzk5wnnc/FMxsf4udAoTEUv2jY3ycfdSd3yWu6Cnd1oee6/CfZJApyscA4FJOmdoixWwiwOyf16RzD5JA==} @@ -7825,7 +7845,6 @@ packages: /tr46@0.0.3: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - dev: true /tr46@1.0.1: resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} @@ -7850,6 +7869,27 @@ packages: engines: {node: '>=8'} dev: true + /ts-jest@26.5.6(jest@26.0.1): + resolution: {integrity: sha512-rua+rCP8DxpA8b4DQD/6X2HQS8Zy/xzViVYfEs2OQu68tkCuKLV0Md8pmX55+W24uRIyAsf/BajRfxOs+R2MKA==} + engines: {node: '>= 10'} + hasBin: true + peerDependencies: + jest: '>=26 <27' + typescript: '>=3.8 <5.0' + dependencies: + bs-logger: 0.2.6 + buffer-from: 1.1.2 + fast-json-stable-stringify: 2.1.0 + jest: 26.0.1 + jest-util: 26.6.2 + json5: 2.2.3 + lodash: 4.17.21 + make-error: 1.3.6 + mkdirp: 1.0.4 + semver: 7.5.4 + yargs-parser: 20.2.9 + dev: true + /ts-jest@26.5.6(jest@26.0.1)(typescript@4.9.4): resolution: {integrity: sha512-rua+rCP8DxpA8b4DQD/6X2HQS8Zy/xzViVYfEs2OQu68tkCuKLV0Md8pmX55+W24uRIyAsf/BajRfxOs+R2MKA==} engines: {node: '>= 10'} @@ -7861,7 +7901,7 @@ packages: bs-logger: 0.2.6 buffer-from: 1.1.2 fast-json-stable-stringify: 2.1.0 - jest: 26.0.1(ts-node@10.9.1) + jest: 26.0.1 jest-util: 26.6.2 json5: 2.2.3 lodash: 4.17.21 @@ -7872,7 +7912,7 @@ packages: yargs-parser: 20.2.9 dev: true - /ts-node@10.9.1(@types/node@18.17.2)(typescript@4.9.4): + /ts-node@10.9.1(@types/node@20.9.4)(typescript@4.9.4): resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} hasBin: true peerDependencies: @@ -7891,7 +7931,7 @@ packages: '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 18.17.2 + '@types/node': 20.9.4 acorn: 8.10.0 acorn-walk: 8.2.0 arg: 4.1.3 @@ -8070,10 +8110,6 @@ packages: turbo-windows-arm64: 1.4.5 dev: true - /tweetnacl@1.0.1: - resolution: {integrity: sha512-kcoMoKTPYnoeS50tzoqjPY3Uv9axeuuFAZY9M/9zFnhoVvRfxz9K29IMPD7jGmt2c8SW7i3gT9WqDl2+nV7p4A==} - dev: false - /type-check@0.4.0: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} @@ -8209,6 +8245,10 @@ packages: xtend: 4.0.2 dev: true + /undici-types@5.26.5: + resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + dev: true + /union-value@1.0.1: resolution: {integrity: sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==} engines: {node: '>=0.10.0'} @@ -8382,7 +8422,6 @@ packages: /webidl-conversions@3.0.1: resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} - dev: true /webidl-conversions@4.0.2: resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} @@ -8413,7 +8452,6 @@ packages: dependencies: tr46: 0.0.3 webidl-conversions: 3.0.1 - dev: true /whatwg-url@7.1.0: resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} @@ -8615,7 +8653,3 @@ packages: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} dev: true - -settings: - autoInstallPeers: false - excludeLinksFromLockfile: false From 2b17056aa021736da1f409c618b6b28f03b5fd57 Mon Sep 17 00:00:00 2001 From: Georgi Tsonev Date: Fri, 24 Nov 2023 12:07:35 +0200 Subject: [PATCH 2/2] fix: rename vars; cache extended secret key --- packages/crypto/src/key_pair_ed25519.ts | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/packages/crypto/src/key_pair_ed25519.ts b/packages/crypto/src/key_pair_ed25519.ts index df20f0b548..7236cc115a 100644 --- a/packages/crypto/src/key_pair_ed25519.ts +++ b/packages/crypto/src/key_pair_ed25519.ts @@ -13,19 +13,21 @@ import { PublicKey } from './public_key'; export class KeyPairEd25519 extends KeyPairBase { readonly publicKey: PublicKey; readonly secretKey: string; + readonly extendedSecretKey: string; /** * Construct an instance of key pair given a secret key. * It's generally assumed that these are encoded in base58. - * @param {string} secretKey + * @param {string} extendedSecretKey */ - constructor(secretKey: string) { + constructor(extendedSecretKey: string) { super(); - const decoded = baseDecode(secretKey); - const sk = new Uint8Array(decoded.slice(0, KeySize.SECRET_KEY)); - const publicKey = ed25519.getPublicKey(sk); + const decoded = baseDecode(extendedSecretKey); + const secretKey = new Uint8Array(decoded.slice(0, KeySize.SECRET_KEY)); + const publicKey = ed25519.getPublicKey(secretKey); this.publicKey = new PublicKey({ keyType: KeyType.ED25519, data: publicKey }); - this.secretKey = baseEncode(sk); + this.secretKey = baseEncode(secretKey); + this.extendedSecretKey = extendedSecretKey; } /** @@ -39,10 +41,10 @@ export class KeyPairEd25519 extends KeyPairBase { * // returns [SECRET_KEY] */ static fromRandom() { - const sk = webcrypto.getRandomValues(new Uint8Array(KeySize.SECRET_KEY)); - const pk = ed25519.getPublicKey(sk); - const extendedSC = new Uint8Array([...sk, ...pk]); - return new KeyPairEd25519(baseEncode(extendedSC)); + const secretKey = webcrypto.getRandomValues(new Uint8Array(KeySize.SECRET_KEY)); + const publicKey = ed25519.getPublicKey(secretKey); + const extendedSecretKey = new Uint8Array([...secretKey, ...publicKey]); + return new KeyPairEd25519(baseEncode(extendedSecretKey)); } sign(message: Uint8Array): Signature { @@ -55,8 +57,7 @@ export class KeyPairEd25519 extends KeyPairBase { } toString(): string { - const extendedSK = baseEncode(new Uint8Array([...baseDecode(this.secretKey), ...this.publicKey.data])); - return `ed25519:${extendedSK}`; + return `ed25519:${this.extendedSecretKey}`; } getPublicKey(): PublicKey {