Compare commits

...
171 Commits
Author SHA1 Message Date
github-actions[bot] bff05aad32 [CI Skip] release/stable 8.2.2
skip-checks: true
2021-12-19 07:02:52 +00:00
Jaco 0f98c1ac22 8.2.2 2021-12-19 08:58:36 +02:00
github-actions[bot] f72d9a2a26 [CI Skip] release/beta 8.2.2-0
skip-checks: true
2021-12-19 06:54:36 +00:00
Jaco 1d0558a537 8.2.2 (#1328) 2021-12-19 08:50:43 +02:00
Jaco 94e7c05573 8.2.1 (#1327) 2021-12-19 08:17:43 +02:00
github-actions[bot] 12601805b1 [CI Skip] release/beta 8.1.3-30
skip-checks: true
2021-12-19 06:02:04 +00:00
Jaco 9194f417fe ss58 sync (w/ bumps) (#1326) 2021-12-19 07:58:12 +02:00
github-actions[bot] 6a3118e66c [CI Skip] release/beta 8.1.3-29
skip-checks: true
2021-12-15 14:16:06 +00:00
Jaco 4ccad202c5 Remove x-noble-* packages (all upstream) (#1323) 2021-12-15 16:12:06 +02:00
github-actions[bot] 96a019f6eb [CI Skip] release/beta 8.1.3-28
skip-checks: true
2021-12-15 13:56:40 +00:00
Jaco bad6a1b991 Bump dependencies (#1322) 2021-12-15 15:52:47 +02:00
github-actions[bot] d83e50ee19 [CI Skip] release/beta 8.1.3-27
skip-checks: true
2021-12-14 06:27:14 +00:00
Jaco feae08fc0f Adjust with tsconfig references (#1317)
* Adjust with tsconfig references

* tabs -> spaces

* Adjust

* Cleanup spacing

* Adjust

* eslint-specific config

* Bump deps

* Bumps

* Adjust

* Update tests
2021-12-14 08:23:16 +02:00
github-actions[bot] fdd32df12f [CI Skip] release/beta 8.1.3-26
skip-checks: true
2021-12-13 16:12:33 +00:00
Jaco 17a9b653ac Upstream @noble packages (#1319) 2021-12-13 18:07:48 +02:00
github-actions[bot] 6154454c38 [CI Skip] release/beta 8.1.3-25
skip-checks: true
2021-12-13 16:04:15 +00:00
Jaco ac0ec5be55 Bump noble (#1318) 2021-12-13 17:58:48 +02:00
github-actions[bot] 3802426046 [CI Skip] release/beta 8.1.3-24
skip-checks: true
2021-12-13 08:15:54 +00:00
Jaco d91b27b180 CHANGELOG (#1316) 2021-12-13 10:10:59 +02:00
github-actions[bot] 1f9a1a5f8a [CI Skip] release/beta 8.1.3-23
skip-checks: true
2021-12-13 06:18:04 +00:00
Jaco 6b3edffe55 Add tsconfig.base (#1315) 2021-12-13 08:13:26 +02:00
github-actions[bot] 7d46eb8423 [CI Skip] release/beta 8.1.3-22
skip-checks: true
2021-12-12 09:31:45 +00:00
Jaco a7eb0ed319 Bump tsc (#1313) 2021-12-12 11:26:25 +02:00
github-actions[bot] 227a34d55d [CI Skip] release/beta 8.1.3-21
skip-checks: true
2021-12-12 06:48:22 +00:00
Jaco 8a29dc2b57 Bump dependencies (#1312) 2021-12-12 08:43:47 +02:00
github-actions[bot] 88d1a71df8 [CI Skip] release/beta 8.1.3-20
skip-checks: true
2021-12-11 07:50:27 +00:00
Jaco 6f53068297 Type re-exports (#1310) 2021-12-11 09:45:49 +02:00
github-actions[bot] 5bf71dab41 [CI Skip] release/beta 8.1.3-19
skip-checks: true
2021-12-10 09:34:04 +00:00
Jared Norris b6f3dfb2ca Add Sora network (#1306)
* Add Sora network

* Fixed sort order

* Add Sora network
2021-12-10 11:29:30 +02:00
github-actions[bot] 4d3a2d9610 [CI Skip] release/beta 8.1.3-18
skip-checks: true
2021-12-10 09:18:41 +00:00
Jaco 7eaf013572 isPromise utility (#1308)
* isPromise utility

* Adjust

* Update packages/util/src/is/wasm.ts

* Update packages/util/src/is/codec.ts

* Adjust
2021-12-10 11:13:00 +02:00
github-actions[bot] c673b96963 [CI Skip] release/beta 8.1.3-17
skip-checks: true
2021-12-10 06:48:03 +00:00
Jaco c57eee5027 Remove deprecated substr from formatBalance (#1307)
* Remove deprecated substr from formatBalance

* Cleanups

* Adjust
2021-12-10 08:43:28 +02:00
github-actions[bot] 9efd2db377 [CI Skip] release/beta 8.1.3-16
skip-checks: true
2021-12-09 18:43:56 +00:00
Jared Norris c90246ec0b Add Sora network (#1305)
* Add Sora network

* Add Sora network

removed trailing slash ( lint complaint )

* Remove Sora from knownLedger

Dependency has not been updated yet
2021-12-09 20:39:21 +02:00
github-actions[bot] fbe1532f62 [CI Skip] release/beta 8.1.3-15
skip-checks: true
2021-12-09 08:49:33 +00:00
Jaco f514402b15 Small maintainability cleanups (#1304) 2021-12-09 10:44:56 +02:00
github-actions[bot] 5ea6992704 [CI Skip] release/beta 8.1.3-14
skip-checks: true
2021-12-09 08:15:32 +00:00
Jaco 7955022ce5 Helpers for 256/512 hashing (#1303)
* Helpers for 256/512 hashing

* Adjust u8aToU8a (u8a-only check earlier)

* Fix export

* Simplify

* revert
2021-12-09 10:10:51 +02:00
github-actions[bot] 000d097de2 [CI Skip] release/beta 8.1.3-13
skip-checks: true
2021-12-08 18:28:50 +00:00
Jaco 8a6c8b64df Adjust & dedupe global extraction tests (#1301) 2021-12-08 20:23:46 +02:00
github-actions[bot] 306e503d23 [CI Skip] release/beta 8.1.3-12
skip-checks: true
2021-12-08 11:20:18 +00:00
Jaco 648019f9d4 CC check adjustments (#1300) 2021-12-08 13:14:51 +02:00
github-actions[bot] 5e48cfbbaa [CI Skip] release/beta 8.1.3-11
skip-checks: true
2021-12-08 11:13:34 +00:00
Jaco 57825fc73b Sync ss58 registry (#1299) 2021-12-08 13:07:34 +02:00
github-actions[bot] 19ae016723 [CI Skip] release/beta 8.1.3-10
skip-checks: true
2021-12-08 10:51:49 +00:00
pan 8d7bed5865 add bifrost (#1296)
* add bifrost.finance

* update code style

* update code style
2021-12-08 12:47:05 +02:00
github-actions[bot] e019a3043a [CI Skip] release/beta 8.1.3-9
skip-checks: true
2021-12-08 09:38:50 +00:00
Jaco 9dfd013755 Dedupes for min/max (#1297) 2021-12-08 11:33:29 +02:00
github-actions[bot] a5df4ed764 [CI Skip] release/beta 8.1.3-8
skip-checks: true
2021-12-08 08:49:18 +00:00
Jaco a938a9f998 Some bip39-en cleanups (& tests) (#1295) 2021-12-08 10:43:43 +02:00
github-actions[bot] 1a6f81e2a7 [CI Skip] release/beta 8.1.3-7
skip-checks: true
2021-12-08 08:32:18 +00:00
Jaco 6ab85a42bb assertUnreachable (#1294) 2021-12-08 10:26:45 +02:00
github-actions[bot] 21c9e1aefd [CI Skip] release/beta 8.1.3-6
skip-checks: true
2021-12-07 17:50:02 +00:00
Jaco 58f740f3de Bump deps (#1293) 2021-12-07 19:44:48 +02:00
github-actions[bot] ddc6b83e96 [CI Skip] release/beta 8.1.3-5
skip-checks: true
2021-12-07 16:15:16 +00:00
Antoine Estienne 285e595930 Add eth uri keyring test (#1291)
* added gerald test address

* add test for addUri for eth

* lint
2021-12-07 18:10:44 +02:00
github-actions[bot] dce16d59e6 [CI Skip] release/beta 8.1.3-4
skip-checks: true
2021-12-07 15:42:22 +00:00
Jaco b8edcb0e65 Revert package inclusion (re-add x-*) (#1292) 2021-12-07 17:37:06 +02:00
github-actions[bot] b63607c4a0 [CI Skip] release/beta 8.1.3-3
skip-checks: true
2021-12-06 12:45:44 +00:00
Jaco c56c86432a Sync ss58 (#1290) 2021-12-06 14:41:06 +02:00
github-actions[bot] e52fe9a838 [CI Skip] release/beta 8.1.3-2
skip-checks: true
2021-12-06 08:28:17 +00:00
Jaco 06dca3d955 Bump dev (#1288) 2021-12-06 10:22:55 +02:00
github-actions[bot] 0908dbb861 [CI Skip] release/beta 8.1.3-1
skip-checks: true
2021-12-06 07:06:02 +00:00
Jaco e97410df52 Preserve all-caps word splits in stringCamelCase (#1287)
* Preserve all-caps word splits in `stringCamelCase`

* Additional tests

* Additional test

* Additional
2021-12-06 09:02:03 +02:00
github-actions[bot] faa6734329 [CI Skip] release/beta 8.1.3-0
skip-checks: true
2021-12-06 05:09:14 +00:00
Jaco f2f25815c1 Swap to upstream @noble/hashes (#1285)
* Swap to upstream `@noble/hashes`

* Lintin (import order)
2021-12-06 07:05:08 +02:00
github-actions[bot] 80785babb4 [CI Skip] release/stable 8.1.2
skip-checks: true
2021-12-05 11:20:24 +00:00
Jaco 59761086d0 8.1.2 (#1284)
* 8.1.2

* Adjust

* Adjust
2021-12-05 13:14:40 +02:00
github-actions[bot] 05c82721e8 [CI Skip] release/stable 8.1.1
skip-checks: true
2021-12-05 08:58:29 +00:00
Jaco 1b13cf0eea 8.1.1 (#1283) 2021-12-05 10:54:07 +02:00
github-actions[bot] e6777ece62 [CI Skip] release/beta 8.0.6-18
skip-checks: true
2021-12-05 08:15:04 +00:00
Jaco 7436976598 Add shims for x-* (not used, convenience) (#1282)
* Add shims for x-* (not used, convenience)

* Update packages/x-ws/src/shim.ts

* Remove (now) unused dependencies
2021-12-05 10:09:47 +02:00
github-actions[bot] 699ef952c3 [CI Skip] release/beta 8.0.6-17
skip-checks: true
2021-12-04 11:02:06 +00:00
Jaco cd9dc35475 Align x-noble with upstream (#1281)
* Align x-noble with upstream

* Remove own version of hashes

* @noble/hashes from master
2021-12-04 12:57:36 +02:00
github-actions[bot] ee7923c457 [CI Skip] release/beta 8.0.6-16
skip-checks: true
2021-12-04 07:16:16 +00:00
Jaco bd3f51844c Add BigInt shim (#1280) 2021-12-04 09:11:16 +02:00
github-actions[bot] 986dfe5006 [CI Skip] release/beta 8.0.6-15
skip-checks: true
2021-12-03 15:29:06 +00:00
Jaco 1eba41b2e6 Use @noble/secp256k1 (#1189)
* Use @noble/secp256k1

* Remove elliptic

* Remove @types

* -19

* verify uses recover internally

* fromSeed

* Init Noble utils inside cryptoInit

* remove bn.js dep (used from @polkadot/util)

* With x-noble-secp256k1

* Adjust

* Remove unused functions

* CHANGELOG

* Fix useless assignment

* Cleanup cryptoInit

* adjust hasher

* bn.js only via util

* align versions

* Remove x-secp256k1 (to be pulled in from master merge)

* Remove (now) invalid test

* Remove assertBigInt

* hasBigInt

* cleanups

* Apply suggestions from code review

* evmAddress fixes

* Extra comment
2021-12-03 17:23:46 +02:00
github-actions[bot] 88c2d16951 [CI Skip] release/beta 8.0.6-14
skip-checks: true
2021-12-03 14:28:20 +00:00
Jaco 303a57c4b5 Use secp256k1 from wasm (#1276)
* Use secp256k1 from wasm

* Expand & recover

* sign (tests failing)

* Pass onlyJs flags everywhere

* Adjust, all ready to actually pass... they don't

* naming

* Fix verify tests

* Adjust verify with non-hashing

* bump wasm

* Allow verify against address or publicKey

* Passing tests

* comment for wasm

* bi/bn versions for tweakadd

* Bumps

* Adjust
2021-12-03 16:23:41 +02:00
github-actions[bot] 7bfca0d40f [CI Skip] release/beta 8.0.6-13
skip-checks: true
2021-12-03 13:47:26 +00:00
Jaco 916187dbf2 Add x-noble-secp256k1 (#1279)
* Add x-noble-secp256k1

* Ignores

* Remove unused functions

* Fix jest
2021-12-03 15:42:57 +02:00
github-actions[bot] cfc598b30f [CI Skip] release/beta 8.0.6-12
skip-checks: true
2021-12-03 12:06:48 +00:00
Jaco 67bfe3a52e Bump deps (#1278) 2021-12-03 14:01:30 +02:00
github-actions[bot] 0299cba18e [CI Skip] release/beta 8.0.6-11
skip-checks: true
2021-12-02 13:51:53 +00:00
Jaco 182c6770d1 Bump dev (#1277) 2021-12-02 15:46:22 +02:00
github-actions[bot] c89ec8a964 [CI Skip] release/beta 8.0.6-10
skip-checks: true
2021-12-02 06:53:44 +00:00
Jaco dc63304735 Remove unused x-noble-hashes functions (#1275) 2021-12-02 08:48:44 +02:00
github-actions[bot] 9ce825de94 [CI Skip] release/beta 8.0.6-9
skip-checks: true
2021-12-02 05:37:08 +00:00
Jaco 3cb41c3b03 CHANGELOG 2021-12-02 07:32:47 +02:00
Jaco b1f9c37f6a x-bigint package (#1274)
* x-bigint package

* x-bigint in has*

* 8.0.6-8

* Adjust

* Adjust

* jest config

* Adjust

* Remove commented code

* Update README

* CHANGELOG
2021-12-02 07:29:44 +02:00
github-actions[bot] 4a69486993 [CI Skip] release/beta 8.0.6-8
skip-checks: true
2021-12-01 19:41:34 +00:00
Jaco 3a7ab0454f instanceof BigInt (#1273) 2021-12-01 21:37:21 +02:00
github-actions[bot] ecfc262bcd [CI Skip] release/beta 8.0.6-7
skip-checks: true
2021-12-01 18:41:25 +00:00
Jaco 776a653f42 Use BigInt only via xglobal (#1272)
* Use BigInt only via xglobal

* Adjust

* yarn
2021-12-01 20:37:11 +02:00
github-actions[bot] ee99ffdbb4 [CI Skip] release/beta 8.0.6-6
skip-checks: true
2021-12-01 16:15:34 +00:00
Jaco bda848f484 Expand has checks (#1271) 2021-12-01 18:11:03 +02:00
github-actions[bot] 82a63887a6 [CI Skip] release/beta 8.0.6-5
skip-checks: true
2021-12-01 14:25:07 +00:00
Jaco 50317d7dc3 Adjust for anon (#1269) 2021-12-01 16:19:50 +02:00
github-actions[bot] 39e6a3c048 [CI Skip] release/beta 8.0.6-4
skip-checks: true
2021-12-01 13:33:02 +00:00
Jaco db93c3076b Revert "Remove ed2curve dependency (#1265)" (#1267)
* Revert "Remove ed2curve dependency (#1265)"

This reverts commit 7e9b2770b6.

* Adjust
2021-12-01 15:28:42 +02:00
Jaco c8f0ad55c4 Split into @polkadot/x-noble-hashes (indicating diff from upstream) (#1268)
* Aplit @noble/hashes fork

* Re-add original (non-eslint)

* Original package imports in README

* package.json

* Update packages/x-noble-hashes/package.json

* CC ignore

* jest
2021-12-01 15:27:29 +02:00
github-actions[bot] 2104c50bd0 [CI Skip] release/beta 8.0.6-3
skip-checks: true
2021-12-01 09:56:10 +00:00
Jaco 7e9b2770b6 Remove ed2curve dependency (#1265)
* Remove edcurve dependency

* browser overrides

* Remove bundledDependencies
2021-12-01 11:51:55 +02:00
github-actions[bot] 8bf24c2f85 [CI Skip] release/beta 8.0.6-2
skip-checks: true
2021-12-01 08:04:23 +00:00
Jaco 60337a3b55 Adjust stale cron (#1264) 2021-12-01 09:59:19 +02:00
github-actions[bot] f527c80b5c [CI Skip] release/beta 8.0.6-1
skip-checks: true
2021-12-01 07:26:29 +00:00
Jaco bdd2bcf236 camelCase with mixed uppercase/numbers (#1260)
* camelCase with mixed uppercase/numbers

* consequtive capitals

* CHANGELOG

* CHANGELOG
2021-12-01 09:21:31 +02:00
github-actions[bot] cf370febf0 [CI Skip] release/beta 8.0.6-0
skip-checks: true
2021-12-01 07:19:00 +00:00
Hussein Ait-Lahcen 715ef6e7db Add Picasso Genesis Hash (#1261) 2021-12-01 09:14:36 +02:00
github-actions[bot] cc644e85bf [CI Skip] release/stable 8.0.5
skip-checks: true
2021-12-01 06:00:21 +00:00
Jaco c7b8d95097 Adjust sha3 expectation of BigInt availability (#1263) 2021-12-01 07:54:50 +02:00
github-actions[bot] 42de7cebe1 [CI Skip] release/stable 8.0.4
skip-checks: true
2021-11-30 05:16:59 +00:00
Jaco 2e520c933a 8.0.4 (#1259) 2021-11-30 07:12:55 +02:00
github-actions[bot] 5d1dd0dd27 [CI Skip] release/stable 8.0.3
skip-checks: true
2021-11-30 04:37:24 +00:00
Jaco 154f9f22f1 8.0.3 (#1258) 2021-11-30 06:33:07 +02:00
github-actions[bot] 98e398954e [CI Skip] release/beta 8.0.3-3
skip-checks: true
2021-11-29 16:38:10 +00:00
Jaco 3643c2e306 Adjust string{Camel, Pascal}Case (#1256) 2021-11-29 18:34:04 +02:00
github-actions[bot] 80195f6d11 [CI Skip] release/beta 8.0.3-2
skip-checks: true
2021-11-27 10:55:11 +00:00
Jaco 6bc648bfe0 Some tweaks on base{32, 58, 64} (#1254)
* Some tweaks on base{32, 58, 64}

* align

* rationale
2021-11-27 12:50:40 +02:00
github-actions[bot] c29b12d3b5 [CI Skip] release/beta 8.0.3-1
skip-checks: true
2021-11-27 07:28:39 +00:00
Jaco 8a5b514944 Additional tiny base64 decoder tests (#1252)
* Additional tiny base64 decoder tests

* Update packages/util-crypto/src/base64/encode.spec.ts

* Update packages/x-randomvalues/src/base64.spec.ts
2021-11-27 09:23:18 +02:00
github-actions[bot] 64fd66bd2a [CI Skip] release/beta 8.0.3-0
skip-checks: true
2021-11-27 06:09:53 +00:00
Jaco 75aa7ba2c7 Tiny base64 decoder (no Buffer dep) (#1251)
* Tiny base64 decoder (no Buffer dep)

* CHANGELOG
2021-11-27 08:05:34 +02:00
github-actions[bot] 25196c3367 [CI Skip] release/stable 8.0.2
skip-checks: true
2021-11-26 09:58:36 +00:00
Jaco eeb68c7e0f Explicit inclusion (patch-package + bundled is problematic) (#1250)
* Explicit inclusion (patch-package + bundled is problematic)

* 8.0.2
2021-11-26 11:53:45 +02:00
github-actions[bot] 1604b92771 [CI Skip] release/stable 8.0.1
skip-checks: true
2021-11-26 09:32:49 +00:00
Jaco 1881b564c5 8.0.1 (#1249)
* 8.0.1

* correct version

* Remove unused dep
2021-11-26 11:29:09 +02:00
github-actions[bot] 3bd4b56eb0 [CI Skip] release/stable 8.0.0
skip-checks: true
2021-11-26 08:51:49 +00:00
Jaco ce46e6da0c 8.0.0-0 (indicating bump) (#1248)
* 8.0.0-0 (indicating bump)

* root
2021-11-26 10:47:29 +02:00
github-actions[bot] bd1efcbba0 [CI Skip] release/beta 7.9.3-19
skip-checks: true
2021-11-26 08:26:57 +00:00
Jaco f2e4fa0d34 Hash bigint syntax (tmp incl. w/ _n adjustment) (#1246)
* Hash bigint syntax (tmp incl. w/ _n adjustment)

* headers with licence & PR link

* Re-adjust package.json

* Use patch-package

* test for patch application

* Upgrade dev

* Remove eslintignore
2021-11-26 10:22:17 +02:00
Github Actions adbf452c8d [CI Skip] release/beta 7.9.3-18
skip-checks: true
2021-11-26 07:07:40 +00:00
Jaco 56a5a079dd Rename bi constants (consistency) (#1247)
* Rename bi constants (consistency)

* sqrt constant

* Rename bi* functions

* secp256k1 also part of renames
2021-11-26 09:03:14 +02:00
Github Actions 0791b2dc9e [CI Skip] release/beta 7.9.3-17
skip-checks: true
2021-11-25 15:19:42 +00:00
Jaco 9821eba11f Rename internal BigInt helper (#1244)
* Rename internal BigInt helper

* Consistency
2021-11-25 17:16:09 +02:00
Github Actions b0b0151071 [CI Skip] release/beta 7.9.3-16
skip-checks: true
2021-11-25 14:08:16 +00:00
Jaco 8422e0da66 CHANGELOG (#1243) 2021-11-25 16:03:24 +02:00
Github Actions 5faa0fd544 [CI Skip] release/beta 7.9.3-15
skip-checks: true
2021-11-25 10:21:50 +00:00
Jaco b16396b9b3 Rename internal keypair locations (#1242)
* Rename internal keypair locations

* save all :)

* Incdicate testing

* add dummy test
2021-11-25 12:17:23 +02:00
Github Actions f342348ad2 [CI Skip] release/beta 7.9.3-14
skip-checks: true
2021-11-25 09:38:14 +00:00
Jaco a8f13bd387 Additional adjustments on newBigInt (#1241)
* Additional adjustments on newBigInt

* typing
2021-11-25 11:34:34 +02:00
Github Actions dbb77f35b6 [CI Skip] release/beta 7.9.3-13
skip-checks: true
2021-11-25 09:03:15 +00:00
Jaco c60e35ee9e Ensure BigInt(...) is called conditionally (#1240)
* Ensure BigInt(...) is called consitionally

* adjust

* comments

* adjust
2021-11-25 10:59:26 +02:00
Github Actions b102d9c2b3 [CI Skip] release/beta 7.9.3-12
skip-checks: true
2021-11-25 07:19:56 +00:00
Jaco 0ee4bc81f5 Performance test adjustments (#1239)
* Performance test adjustments

* testing

* adjust

* alphabet

* Adjust
2021-11-25 09:16:01 +02:00
Github Actions b05abf869a [CI Skip] release/beta 7.9.3-11
skip-checks: true
2021-11-24 14:59:34 +00:00
Jaco bc014f11dd Stale schedule (#1238) 2021-11-24 16:55:43 +02:00
Github Actions f1429f10af [CI Skip] release/beta 7.9.3-10
skip-checks: true
2021-11-24 13:25:40 +00:00
Jaco be8cabbd1e Rename {ed, sr}25519 functions (#1237)
* Rename {ed, sr}25519 functions

* Finalize renames

* Fix wasm imports

* CHANGELOG
2021-11-24 15:21:28 +02:00
Github Actions 8d0a0ed2b7 [CI Skip] release/beta 7.9.3-9
skip-checks: true
2021-11-24 12:04:11 +00:00
Jaco 39baaa2b6d CHANGELOG (#1236) 2021-11-24 14:00:23 +02:00
Github Actions 821980f64e [CI Skip] release/beta 7.9.3-8
skip-checks: true
2021-11-24 11:46:56 +00:00
Jaco 6688ff0a43 Use @noble/hashes (#1188)
* Use hashing functions from @noble/hashes

* Remove built-in pbkdf2

* Remove @types

* -19

* Remove @types

* Update packages/util-crypto/src/mnemonic/bip39.ts

* Align

* BigInt alignment

* hmac BigInt assert

* Legacy hmacSha

* Legacy fallbacks

* Align has

* Re-add micro-base

* remove old random inputs

* re-add @types/ed2curve

* Adjust pbkdf2

* Remove legacy (we have wasm)

* Update packages/util-crypto/src/detectPackage.ts

* Update packages/util-crypto/src/detectPackage.ts

* Ordering

* Comments

* Adjust

* Fix build

* cleanup legacySeed
2021-11-24 13:42:49 +02:00
Github Actions ee18b661ad [CI Skip] release/beta 7.9.3-7
skip-checks: true
2021-11-24 07:06:06 +00:00
Jaco 9a5998b921 bigint consts without BigInt(*) wrapper (#1235) 2021-11-24 09:02:17 +02:00
Github Actions f27f705f0c [CI Skip] release/beta 7.9.3-6
skip-checks: true
2021-11-23 16:00:47 +00:00
Jaco 5e16b1e84c Remove concatBuffer viariant (#1234) 2021-11-23 17:56:33 +02:00
Github Actions 25a53e43fd [CI Skip] release/beta 7.9.3-5
skip-checks: true
2021-11-23 14:58:30 +00:00
Jaco 75b60b9999 Adjust and enable old perfromance tests (#1233) 2021-11-23 16:54:39 +02:00
Github Actions e8813aa110 [CI Skip] release/beta 7.9.3-4
skip-checks: true
2021-11-23 08:55:23 +00:00
Jaco b55cdb25f6 xxhash64 replacement (#1220)
* xxhash64 replacement

* yarn.lock

* hasBigInt check

* extract common

* lint fixes

* Dedupe

* flatten

* Update changes

* Update packages/util-crypto/src/xxhash/asU8a.spec.ts

* Remove useless assignment

* flatten

* combine intermediate vars

* Align var naming

* lint

* Remove unneeded inner conversions

* Update packages/util-crypto/src/xxhash/xxhash64.ts

* Adjust

* bitLength type

* BitLength type

* additional BitLength

* Small cleanups

* Adjust

* Adjust

* blak2 bitLength adjust

* with 384

* renames

* Adjust

* Adjust

* localize

* Comments

* format performance outputs

* format performance outputs

* isWasmOnly revert
2021-11-23 10:51:08 +02:00
Github Actions 05e852337a [CI Skip] release/beta 7.9.3-3
skip-checks: true
2021-11-22 14:45:37 +00:00
Jaco cdd2d9ace5 Allow for . & , in camelCase (#1231) 2021-11-22 16:41:50 +02:00
Github Actions a2d9538b31 [CI Skip] release/beta 7.9.3-2
skip-checks: true
2021-11-22 14:17:13 +00:00
Jaco 391ab49b8f Adjust camelCase with simplified version (#1230)
* Adjust camelCase with simplified version

* Adjust count

* Adjust

* readability

* Ascii-only

* single-line callbacks

* CHANGELOG

* Dedupe string{Lower, Upper}First

* replacer -> fn
2021-11-22 16:12:29 +02:00
Github Actions b390714285 [CI Skip] release/beta 7.9.3-1
skip-checks: true
2021-11-22 06:54:50 +00:00
Jaco 277c80eb96 Revery isWasmOnly helper (#1229)
* Revery isWasmOnly helper

* Adjust
2021-11-22 08:51:03 +02:00
Github Actions 28f0040080 [CI Skip] release/beta 7.9.3-0
skip-checks: true
2021-11-22 06:26:28 +00:00
Jaco 5f280aabb8 Bump dev (w/ /src/ check) (#1228) 2021-11-22 08:22:37 +02:00
265 changed files with 3688 additions and 4786 deletions
+7 -1
View File
@@ -19,4 +19,10 @@
7.0.3
7.1.2
7.8.2
7.9.2
7.9.2
8.0.2
8.0.3
8.0.4
8.0.5
8.1.2
8.2.2
+16
View File
@@ -1,5 +1,21 @@
checks:
argument-count:
config:
threshold: 5
method-complexity:
config:
threshold: 7
method-count:
config:
threshold: 25
method-lines:
config:
threshold: 30
exclude_patterns:
- "**/*.spec.js"
- "**/*.spec.ts"
- "packages/networks/src/substrate.ts"
- "packages/util/src/is/utf8.ts"
- "packages/x-noble-hashes/src/**.ts"
- "packages/x-noble-secp256k1/src/**.ts"
+2
View File
@@ -0,0 +1,2 @@
packages/x-noble-hashes/**/*.ts
packages/x-noble-secp256k1/**/*.ts
+2 -8
View File
@@ -6,18 +6,12 @@ const base = require('@polkadot/dev/config/eslint.cjs');
module.exports = {
...base,
ignorePatterns: [
'.eslintrc.js',
'.github/**',
'.vscode/**',
'.yarn/**',
'**/build/*',
'**/coverage/*',
'**/node_modules/*'
...base.ignorePatterns
],
parserOptions: {
...base.parserOptions,
project: [
'./tsconfig.json'
'./tsconfig.eslint.json'
]
},
rules: {
+1 -1
View File
@@ -2,7 +2,7 @@ name: 'Lock Threads'
on:
schedule:
- cron: '30 1/2 * * *'
- cron: '15 1/3 * * *'
jobs:
lock:
+1 -1
View File
@@ -1,7 +1,7 @@
name: 'Close stale issues and PRs'
on:
schedule:
- cron: '30 2/2 * * *'
- cron: '50 1/3 * * *'
jobs:
stale:
+3 -2
View File
@@ -11,7 +11,9 @@ tmp/
.env.development.local
.env.test.local
.env.production.local
.idea
.npmrc
.vscode
.yarn/*
!.yarn/releases
!.yarn/plugins
@@ -24,5 +26,4 @@ yarn-debug.log*
yarn-error.log*
store.db
store.db.compacted
.idea
.vscode
tsconfig.*buildinfo
+92
View File
@@ -1,5 +1,97 @@
# CHANGELOG
## 8.2.2 Dec 19, 2021
Contributed:
- Add Bifrost Ledger capabilities (Thanks to https://github.com/awesomepan)
- Add Sora genesisHash & Ledger capabilities (Thanks to https://github.com/NoodleSploder)
Changes:
- Add `isPromise` check utility function
- Add `assertUnreachable` for codepaths that should not be followed
- Preserve all-caps word splits in `stringCamelCase`
- Adjust `x-*` fallbacks via `x-global/extractGlobal`
- Sync with upstream Substrate ss58 registry
- Additional tests for `bip39` wordlists
- Maintainability cleanups
- Update to latest Ledger dependencies
- Swap to upstream `@noble` packages
- Adjust tsconfig with references
- 8.2.2 (8.2.1 failed CI due to incorrect CHANGELOG)
## 8.1.2 Dec 5, 2021
Changes:
- Adjustment to non-full-word consecutive uppercase via `string{Camel, Pascal}Case`
## 8.1.1 Dec 5, 2021
Contributed:
- Add Picasso genesisHash (Thanks to https://github.com/hussein-aitlahcen)
Changes:
- Allow for use of `secp256k1` from `@polkadot/wasm-crypto`
- Adjust `isBigInt` to not do `instanceof` check
- Ensure consequtive capitals in `stringCamelCase` are lowercased
- Use `@polkadot/x-bigint` for `BigInt` constructor
- Split `@noble/hashes` fork into `x-noble-hashes`
- Add `@noble/secp256k1` fork into `x-noble-secp256k1`, replaces `elliptic`
## 8.0.5 Dec 1, 2021
Changes:
- Adjust sha3 expectation of `BigInt` availability
## 8.0.4 Nov 30, 2021
Changes:
- Adjust `stringCamelCase` with leading `_`
## 8.0.3 Nov 30, 2021
Changes:
- Remove `Buffer` usage in `x-randomvalues`
- Adjust `stringCamelCase` for all-caps parts
## 8.0.2 Nov 26, 2021
Changes:
- Explicitly include BigInt patched versions
## 8.0.1 Nov 26, 2021
**Important** In the 8.0 version the hashing utilities have been consolidated around an optimized and audited version from `@noble/hashes`. As in the past the WASM hashing will be used by default if the environment is initialized.
**Breaking change** The `schnorrkel*` functions have been renamed to `sr25519*`. Likewise the `ed25519` operations have been renamed from `nacl*` to `ed25519*`. Additionally the `{ed, sr, secp256k1}25519KeyPairFrom*` functions have been renamed to `{ed, sr, secp256k1}25519PairFrom*`.
Changes:
- Introduce `ed25519*` & `sr25519*` functions
- Replace camelcase dep with simplified/optimized version
- Replace (most) hashing operations with `@noble/hashes`
- Replace JS fallback for `xxhash`
- Adjust `BigInt` utility exports (with capability detection)
- Previously added `bi*` functions renamed to `n*`
- Extend performance tests with implementation compares
- Remove non-significant Node Buffer concat fill
## 7.9.2 Nov 22, 2021
Changes:
+2 -3
View File
@@ -13,8 +13,7 @@ module.exports = Object.assign({}, config, {
'@polkadot/util-(crypto)(.*)$': '<rootDir>/packages/util-$1/src/$2',
// eslint-disable-next-line sort-keys
'@polkadot/util(.*)$': '<rootDir>/packages/util/src/$1',
'@polkadot/x-(fetch|randomvalues|textdecoder|textencoder|ws)(.*)$': '<rootDir>/packages/x-$1/src/node',
'@polkadot/x-global(.*)$': '<rootDir>/packages/x-global/src/$1',
'@polkadot/x-rxjs(.*)$': '<rootDir>/packages/x-rxjs/src/$1'
'@polkadot/x-(bigint|global)(.*)$': '<rootDir>/packages/x-$1/src/$2',
'@polkadot/x-(fetch|randomvalues|textdecoder|textencoder|ws)(.*)$': '<rootDir>/packages/x-$1/src/node'
}
});
+5 -5
View File
@@ -10,7 +10,7 @@
"url": "https://github.com/polkadot-js/common.git"
},
"sideEffects": false,
"version": "7.9.2",
"version": "8.2.2",
"workspaces": [
"packages/*"
],
@@ -28,12 +28,12 @@
"test:one": "polkadot-dev-run-test --runInBand"
},
"devDependencies": {
"@babel/core": "^7.16.0",
"@polkadot/dev": "^0.63.29",
"@polkadot/ts": "^0.4.14",
"@babel/core": "^7.16.5",
"@polkadot/dev": "^0.64.5",
"@polkadot/ts": "^0.4.20",
"@types/jest": "^27.0.3"
},
"resolutions": {
"typescript": "^4.5.2"
"typescript": "^4.5.3"
}
}
+6 -6
View File
@@ -16,17 +16,17 @@
},
"sideEffects": false,
"type": "module",
"version": "7.9.2",
"version": "8.2.2",
"browser": "browser.js",
"main": "node.js",
"react-native": "react-native.js",
"dependencies": {
"@babel/runtime": "^7.16.3",
"@ledgerhq/hw-transport": "^6.11.2",
"@ledgerhq/hw-transport-webhid": "^6.11.2",
"@ledgerhq/hw-transport-webusb": "^6.11.2"
"@babel/runtime": "^7.16.5",
"@ledgerhq/hw-transport": "^6.20.0",
"@ledgerhq/hw-transport-webhid": "^6.20.0",
"@ledgerhq/hw-transport-webusb": "^6.20.0"
},
"optionalDependencies": {
"@ledgerhq/hw-transport-node-hid-singleton": "^6.11.2"
"@ledgerhq/hw-transport-node-hid-singleton": "^6.20.0"
}
}
@@ -3,4 +3,4 @@
// Auto-generated by @polkadot/dev, do not edit
export const packageInfo = { name: '@polkadot/hw-ledger-transports', version: '7.9.2' };
export const packageInfo = { name: '@polkadot/hw-ledger-transports', version: '8.2.2' };
@@ -0,0 +1,9 @@
{
"extends": "../../tsconfig.base.json",
"compilerOptions": {
"baseUrl": "..",
"outDir": "./build",
"rootDir": "./src"
},
"references": []
}
+5 -5
View File
@@ -19,12 +19,12 @@
"./detectPackage.cjs"
],
"type": "module",
"version": "7.9.2",
"version": "8.2.2",
"main": "index.js",
"dependencies": {
"@babel/runtime": "^7.16.3",
"@polkadot/hw-ledger-transports": "7.9.2",
"@polkadot/util": "7.9.2",
"@zondax/ledger-substrate": "^0.18.0"
"@babel/runtime": "^7.16.5",
"@polkadot/hw-ledger-transports": "8.2.2",
"@polkadot/util": "8.2.2",
"@zondax/ledger-substrate": "^0.23.0"
}
}
-24
View File
@@ -1,24 +0,0 @@
// Copyright 2017-2021 @polkadot/hw-ledger authors & contributors
// SPDX-License-Identifier: Apache-2.0
import { knownLedger } from '@polkadot/networks/defaults';
import { ledgerApps } from './defaults';
describe('defaults', (): void => {
it('has entries for each of the apps (hwledger -> networks)', (): void => {
expect(
Object.keys(knownLedger).filter((network) =>
!ledgerApps[network]
)
).toEqual([]);
});
it('has entries for each of the apps (networks -> hwledger)', (): void => {
expect(
Object.keys(ledgerApps).filter((network) =>
!knownLedger[network]
)
).toEqual([]);
});
});
+3 -1
View File
@@ -4,10 +4,11 @@
import type Transport from '@ledgerhq/hw-transport';
import type { SubstrateApp } from '@zondax/ledger-substrate';
import { newCentrifugeApp, newDockApp, newEdgewareApp, newEquilibriumApp, newGenshiroApp, newKusamaApp, newNodleApp, newPolkadotApp, newPolymeshApp, newStatemineApp } from '@zondax/ledger-substrate';
import { newBifrostApp, newCentrifugeApp, newDockApp, newEdgewareApp, newEquilibriumApp, newGenshiroApp, newKusamaApp, newNodleApp, newPolkadotApp, newPolymeshApp, newSoraApp, newStatemineApp } from '@zondax/ledger-substrate';
// These match up with the keys of the knownLedger object in the @polkadot/networks/defaults.ts
export const ledgerApps: Record<string, (transport: Transport) => SubstrateApp> = {
bifrost: newBifrostApp,
centrifuge: newCentrifugeApp,
'dock-mainnet': newDockApp,
edgeware: newEdgewareApp,
@@ -17,5 +18,6 @@ export const ledgerApps: Record<string, (transport: Transport) => SubstrateApp>
'nodle-chain': newNodleApp,
polkadot: newPolkadotApp,
polymesh: newPolymeshApp,
sora: newSoraApp,
statemine: newStatemineApp
};
+1 -1
View File
@@ -3,4 +3,4 @@
// Auto-generated by @polkadot/dev, do not edit
export const packageInfo = { name: '@polkadot/hw-ledger', version: '7.9.2' };
export const packageInfo = { name: '@polkadot/hw-ledger', version: '8.2.2' };
+12
View File
@@ -0,0 +1,12 @@
{
"extends": "../../tsconfig.base.json",
"compilerOptions": {
"baseUrl": "..",
"outDir": "./build",
"rootDir": "./src"
},
"references": [
{ "path": "../hw-ledger-transports" },
{ "path": "../util" }
]
}
+6 -6
View File
@@ -20,15 +20,15 @@
"./detectPackage.cjs"
],
"type": "module",
"version": "7.9.2",
"version": "8.2.2",
"main": "index.js",
"dependencies": {
"@babel/runtime": "^7.16.3",
"@polkadot/util": "7.9.2",
"@polkadot/util-crypto": "7.9.2"
"@babel/runtime": "^7.16.5",
"@polkadot/util": "8.2.2",
"@polkadot/util-crypto": "8.2.2"
},
"peerDependencies": {
"@polkadot/util": "7.9.2",
"@polkadot/util-crypto": "7.9.2"
"@polkadot/util": "8.2.2",
"@polkadot/util-crypto": "8.2.2"
}
}
+8
View File
@@ -369,6 +369,14 @@ describe('keypair', (): void => {
).toEqual(ETH_ADDRESS_ONE);
});
it('creates with dev phrase with derivation path specified - addFromUri with type', (): void => {
const keyringUntyped = new Keyring();
expect(
keyringUntyped.addFromUri(PHRASE, {}, 'ethereum').address
).toEqual(ETH_ADDRESS_ONE);
});
it('encodes a pair toJSON (and decodes)', (): void => {
const pair = keyring.createFromUri(PHRASE);
const json = pair.toJson('password');
+7 -7
View File
@@ -5,17 +5,17 @@ import type { EncryptedJsonEncoding, Keypair, KeypairType } from '@polkadot/util
import type { KeyringInstance, KeyringOptions, KeyringPair, KeyringPair$Json, KeyringPair$Meta } from './types';
import { assert, hexToU8a, isHex, isUndefined, stringToU8a } from '@polkadot/util';
import { base64Decode, decodeAddress, encodeAddress, ethereumEncode, hdEthereum, keyExtractSuri, keyFromPath, mnemonicToLegacySeed, mnemonicToMiniSecret, naclKeypairFromSeed as naclFromSeed, schnorrkelKeypairFromSeed as schnorrkelFromSeed, secp256k1KeypairFromSeed as secp256k1FromSeed } from '@polkadot/util-crypto';
import { base64Decode, decodeAddress, ed25519PairFromSeed as ed25519FromSeed, encodeAddress, ethereumEncode, hdEthereum, keyExtractSuri, keyFromPath, mnemonicToLegacySeed, mnemonicToMiniSecret, secp256k1PairFromSeed as secp256k1FromSeed, sr25519PairFromSeed as sr25519FromSeed } from '@polkadot/util-crypto';
import { DEV_PHRASE } from './defaults';
import { createPair } from './pair';
import { Pairs } from './pairs';
const keypairFromSeed = {
const PairFromSeed = {
ecdsa: (seed: Uint8Array): Keypair => secp256k1FromSeed(seed),
ed25519: (seed: Uint8Array): Keypair => naclFromSeed(seed),
ed25519: (seed: Uint8Array): Keypair => ed25519FromSeed(seed),
ethereum: (seed: Uint8Array): Keypair => secp256k1FromSeed(seed),
sr25519: (seed: Uint8Array): Keypair => schnorrkelFromSeed(seed)
sr25519: (seed: Uint8Array): Keypair => sr25519FromSeed(seed)
};
function pairToPublic ({ publicKey }: KeyringPair): Uint8Array {
@@ -142,7 +142,7 @@ export class Keyring implements KeyringInstance {
*/
public addFromSeed (seed: Uint8Array, meta: KeyringPair$Meta = {}, type: KeypairType = this.type): KeyringPair {
return this.addPair(
createPair({ toSS58: this.encodeAddress, type }, keypairFromSeed[type](seed), meta, null)
createPair({ toSS58: this.encodeAddress, type }, PairFromSeed[type](seed), meta, null)
);
}
@@ -224,9 +224,9 @@ export class Keyring implements KeyringInstance {
const derived = type === 'ethereum'
? isPhraseHex
? keypairFromSeed[type](seed) // for eth, if the private key is provided as suri, it must be derived only once
? PairFromSeed[type](seed) // for eth, if the private key is provided as suri, it must be derived only once
: hdEthereum(seed, derivePath.substring(1))
: keyFromPath(keypairFromSeed[type](seed), path, type);
: keyFromPath(PairFromSeed[type](seed), path, type);
return createPair({ toSS58: this.encodeAddress, type }, derived, meta, null);
}
+1 -1
View File
@@ -3,4 +3,4 @@
// Auto-generated by @polkadot/dev, do not edit
export const packageInfo = { name: '@polkadot/keyring', version: '7.9.2' };
export const packageInfo = { name: '@polkadot/keyring', version: '8.2.2' };
+7 -7
View File
@@ -7,7 +7,7 @@ import type { KeyringPair, KeyringPair$Json, KeyringPair$Meta, SignOptions } fro
import type { PairInfo } from './types';
import { assert, objectSpread, u8aConcat, u8aEmpty, u8aEq, u8aToHex, u8aToU8a } from '@polkadot/util';
import { blake2AsU8a, convertPublicKeyToCurve25519, convertSecretKeyToCurve25519, ethereumEncode, keccakAsU8a, keyExtractPath, keyFromPath, naclKeypairFromSeed as naclFromSeed, naclOpen, naclSeal, naclSign, schnorrkelKeypairFromSeed as schnorrkelFromSeed, schnorrkelSign, schnorrkelVrfSign, schnorrkelVrfVerify, secp256k1Compress, secp256k1Expand, secp256k1KeypairFromSeed as secp256k1FromSeed, secp256k1Sign, signatureVerify } from '@polkadot/util-crypto';
import { blake2AsU8a, convertPublicKeyToCurve25519, convertSecretKeyToCurve25519, ed25519PairFromSeed as ed25519FromSeed, ed25519Sign, ethereumEncode, keccakAsU8a, keyExtractPath, keyFromPath, naclOpen, naclSeal, secp256k1Compress, secp256k1Expand, secp256k1PairFromSeed as secp256k1FromSeed, secp256k1Sign, signatureVerify, sr25519PairFromSeed as sr25519FromSeed, sr25519Sign, sr25519VrfSign, sr25519VrfVerify } from '@polkadot/util-crypto';
import { decodePair } from './decode';
import { encodePair } from './encode';
@@ -22,9 +22,9 @@ const SIG_TYPE_NONE = new Uint8Array();
const TYPE_FROM_SEED = {
ecdsa: secp256k1FromSeed,
ed25519: naclFromSeed,
ed25519: ed25519FromSeed,
ethereum: secp256k1FromSeed,
sr25519: schnorrkelFromSeed
sr25519: sr25519FromSeed
};
const TYPE_PREFIX = {
@@ -36,9 +36,9 @@ const TYPE_PREFIX = {
const TYPE_SIGNATURE = {
ecdsa: (m: Uint8Array, p: Partial<Keypair>) => secp256k1Sign(m, p, 'blake2'),
ed25519: naclSign,
ed25519: ed25519Sign,
ethereum: (m: Uint8Array, p: Partial<Keypair>) => secp256k1Sign(m, p, 'keccak'),
sr25519: schnorrkelSign
sr25519: sr25519Sign
};
const TYPE_ADDRESS = {
@@ -215,7 +215,7 @@ export function createPair ({ toSS58, type }: Setup, { publicKey, secretKey }: P
assert(!isLocked(secretKey), 'Cannot sign with a locked key pair');
if (type === 'sr25519') {
return schnorrkelVrfSign(message, { secretKey }, context, extra);
return sr25519VrfSign(message, { secretKey }, context, extra);
}
const proof = TYPE_SIGNATURE[type](u8aToU8a(message), { publicKey, secretKey });
@@ -224,7 +224,7 @@ export function createPair ({ toSS58, type }: Setup, { publicKey, secretKey }: P
},
vrfVerify: (message: HexString | string | Uint8Array, vrfResult: Uint8Array, signerPublic: HexString | Uint8Array | string, context?: HexString | string | Uint8Array, extra?: HexString | string | Uint8Array): boolean => {
if (type === 'sr25519') {
return schnorrkelVrfVerify(message, vrfResult, publicKey, context, extra);
return sr25519VrfVerify(message, vrfResult, publicKey, context, extra);
}
const result = signatureVerify(message, u8aConcat(TYPE_PREFIX[type], vrfResult.subarray(32)), TYPE_ADDRESS[type](u8aToU8a(signerPublic)));
+4 -4
View File
@@ -4,7 +4,7 @@
import type { KeyringPair } from '../types';
import { u8aToHex } from '@polkadot/util';
import { cryptoWaitReady, encodeAddress as toSS58, naclKeypairFromSeed, randomAsU8a, schnorrkelKeypairFromSeed, secp256k1KeypairFromSeed } from '@polkadot/util-crypto';
import { cryptoWaitReady, ed25519PairFromSeed, encodeAddress as toSS58, randomAsU8a, secp256k1PairFromSeed, sr25519PairFromSeed } from '@polkadot/util-crypto';
import { createPair } from '.';
@@ -19,9 +19,9 @@ describe('vrf', (): void => {
beforeAll(async (): Promise<void> => {
await cryptoWaitReady();
ecdsa = createPair({ toSS58, type: 'ecdsa' }, secp256k1KeypairFromSeed(randomAsU8a()));
ed25519 = createPair({ toSS58, type: 'ed25519' }, naclKeypairFromSeed(randomAsU8a()));
sr25519 = createPair({ toSS58, type: 'sr25519' }, schnorrkelKeypairFromSeed(randomAsU8a()));
ecdsa = createPair({ toSS58, type: 'ecdsa' }, secp256k1PairFromSeed(randomAsU8a()));
ed25519 = createPair({ toSS58, type: 'ed25519' }, ed25519PairFromSeed(randomAsU8a()));
sr25519 = createPair({ toSS58, type: 'sr25519' }, sr25519PairFromSeed(randomAsU8a()));
});
it('has deterministic signature values for ecdsa', (): void => {
+14 -10
View File
@@ -3,7 +3,7 @@
import type { KeyringInstance, KeyringOptions } from './types';
import { hexToU8a } from '@polkadot/util';
import { assert, hexToU8a } from '@polkadot/util';
import { KeypairType } from '@polkadot/util-crypto/types';
import { Keyring } from './keyring';
@@ -111,6 +111,15 @@ export const PAIRSETHEREUM: PairDef[] = [
}
];
function createMeta (name?: string, seed?: string) {
assert(name || seed, 'Testing pair should have either a name or a seed');
return {
isTesting: true,
name: name || (seed && seed.replace('//', '_').toLowerCase())
};
}
/**
* @name testKeyring
* @summary Create an instance of Keyring pre-populated with locked test accounts
@@ -119,17 +128,12 @@ export const PAIRSETHEREUM: PairDef[] = [
*/
export function createTestKeyring (options: KeyringOptions = {}, isDerived = true): KeyringInstance {
const keyring = new Keyring(options);
const pairs: PairDef[] = (options.type && options.type === 'ethereum') ? PAIRSETHEREUM : PAIRSSR25519;
const pairs = (options.type && options.type === 'ethereum')
? PAIRSETHEREUM
: PAIRSSR25519;
for (const { name, publicKey, secretKey, seed, type } of pairs) {
if (!name && !seed) {
throw new Error('Testing pair should have either a name or a seed');
}
const meta = {
isTesting: true,
name: name || (seed && seed.replace('//', '_').toLowerCase())
};
const meta = createMeta(name, seed);
const pair = !isDerived && !name && seed
? keyring.addFromUri(seed, meta, options.type)
: keyring.addPair(
+12
View File
@@ -0,0 +1,12 @@
{
"extends": "../../tsconfig.base.json",
"compilerOptions": {
"baseUrl": "..",
"outDir": "./build",
"rootDir": "./src"
},
"references": [
{ "path": "../util" },
{ "path": "../util-crypto" }
]
}
+5 -4
View File
@@ -17,13 +17,14 @@
},
"sideEffects": false,
"type": "module",
"version": "7.9.2",
"version": "8.2.2",
"main": "index.js",
"dependencies": {
"@babel/runtime": "^7.16.3"
"@babel/runtime": "^7.16.5"
},
"devDependencies": {
"@polkadot/util": "7.9.2",
"@polkadot/x-fetch": "7.9.2"
"@polkadot/hw-ledger": "8.2.2",
"@polkadot/util": "8.2.2",
"@polkadot/x-fetch": "8.2.2"
}
}
+34 -13
View File
@@ -1,25 +1,46 @@
// Copyright 2017-2021 @polkadot/networks authors & contributors
// SPDX-License-Identifier: Apache-2.0
import { ledgerApps } from '@polkadot/hw-ledger/defaults';
import { isHex } from '@polkadot/util';
import { knownGenesis, knownLedger } from './defaults';
describe('defaults', (): void => {
it('has hex values for all genesis chains', (): void => {
expect(
Object.keys(knownGenesis).filter((network) =>
!knownGenesis[network].length ||
knownGenesis[network].some((g) => !isHex(g, 256))
)
).toEqual([]);
describe('genesis', (): void => {
it('has hex values for all genesis chains', (): void => {
expect(
Object.keys(knownGenesis).filter((network) =>
!knownGenesis[network].length ||
knownGenesis[network].some((g) => !isHex(g, 256))
)
).toEqual([]);
});
it('has genesis for all Ledger chains', (): void => {
expect(
Object.keys(knownLedger).filter((network) =>
!knownGenesis[network]
)
).toEqual([]);
});
});
it('has genesis for all Ledger chains', (): void => {
expect(
Object.keys(knownLedger).filter((network) =>
!knownGenesis[network]
)
).toEqual([]);
describe('Ledger', (): void => {
it('has entries for each of the apps (hwledger -> networks)', (): void => {
expect(
Object.keys(knownLedger).filter((network) =>
!ledgerApps[network]
)
).toEqual([]);
});
it('has entries for each of the apps (networks -> hwledger)', (): void => {
expect(
Object.keys(ledgerApps).filter((network) =>
!knownLedger[network]
)
).toEqual([]);
});
});
});
+9
View File
@@ -51,6 +51,9 @@ export const knownGenesis: KnownGenesis = {
'nodle-chain': [
'0xa3d114c2b8d0627c1aa9b134eafcf7d05ca561fdc19fb388bb9457f81809fb23'
],
picasso: [
'0xe8e7f0f4c4f5a00720b4821dbfddefea7490bcf0b19009961cc46957984e2c1c'
],
plasm: [
'0x3e86364d4b4894021cb2a0390bcf2feb5517d5292f2de2bb9404227e908b0b8b'
],
@@ -60,6 +63,9 @@ export const knownGenesis: KnownGenesis = {
polymesh: [
'0x6fbd74e5e1d0a61d52ccfe9d4adaed16dd3a7caa37c6bc4d0c2fa12e8b2f4063'
],
sora: [
'0x7e4e32d0feafd4f9c9414b0be86373f9a1efa904809b683453a9af6856d38ad5'
],
stafi: [
'0x290a4149f09ea0e402c74c1c7e96ae4239588577fe78932f94f5404c68243d80'
],
@@ -76,6 +82,7 @@ export const knownIcon: KnownIcon = {
centrifuge: 'polkadot',
kusama: 'polkadot',
polkadot: 'polkadot',
sora: 'polkadot',
statemine: 'polkadot',
statemint: 'polkadot',
westmint: 'polkadot'
@@ -85,6 +92,7 @@ export const knownIcon: KnownIcon = {
// and maps to the known slip44 (minus the `0x8` hard derivation flag)
// NOTE: Any network here needs to have a genesisHash attached in the config above
export const knownLedger: KnownLedger = {
bifrost: 0x00000314,
centrifuge: 0x000002eb,
'dock-mainnet': 0x00000252,
edgeware: 0x0000020b,
@@ -94,6 +102,7 @@ export const knownLedger: KnownLedger = {
'nodle-chain': 0x000003eb,
polkadot: 0x00000162,
polymesh: 0x00000253,
sora: 0x00000269,
statemine: 0x000001b2 // common-good on Kusama, shares derivation
};
+1 -1
View File
@@ -3,4 +3,4 @@
// Auto-generated by @polkadot/dev, do not edit
export const packageInfo = { name: '@polkadot/networks', version: '7.9.2' };
export const packageInfo = { name: '@polkadot/networks', version: '8.2.2' };
+44 -8
View File
@@ -504,12 +504,21 @@ export const knownSubstrate: KnownSubstrate[] = [
website: 'https://crust.network'
},
{
decimals: [0, 9, 9, 9, 9, 9, 9, 9],
displayName: 'Equilibrium Network',
network: 'equilibrium',
decimals: [9, 9, 9],
displayName: 'Genshiro Network',
network: 'genshiro',
prefix: 67,
standardAccount: '*25519',
symbols: ['Unknown', 'USD', 'EQ', 'ETH', 'BTC', 'EOS', 'DOT', 'CRV'],
symbols: ['GENS', 'EQD', 'LPT0'],
website: 'https://genshiro.equilibrium.io'
},
{
decimals: [9],
displayName: 'Equilibrium Network',
network: 'equilibrium',
prefix: 68,
standardAccount: '*25519',
symbols: ['EQ'],
website: 'https://equilibrium.io'
},
{
@@ -531,12 +540,12 @@ export const knownSubstrate: KnownSubstrate[] = [
website: 'https://zeitgeist.pm'
},
{
decimals: [12],
decimals: [18],
displayName: 'Manta network',
network: 'manta',
prefix: 77,
standardAccount: '*25519',
symbols: ['MA'],
symbols: ['MANTA'],
website: 'https://manta.network'
},
{
@@ -665,6 +674,15 @@ export const knownSubstrate: KnownSubstrate[] = [
symbols: ['NEER'],
website: 'https://bit.country'
},
{
decimals: [18],
displayName: 'Efinity',
network: 'efinity',
prefix: 1110,
standardAccount: 'Sr25519',
symbols: ['EFI'],
website: 'https://efinity.io/'
},
{
decimals: [18],
displayName: 'Moonbeam',
@@ -692,6 +710,24 @@ export const knownSubstrate: KnownSubstrate[] = [
symbols: ['KAPEX'],
website: 'https://totemaccounting.com'
},
{
decimals: [10],
displayName: 'Interlay',
network: 'interlay',
prefix: 2032,
standardAccount: '*25519',
symbols: ['INTR'],
website: 'https://interlay.io/'
},
{
decimals: [12],
displayName: 'Kintsugi',
network: 'kintsugi',
prefix: 2092,
standardAccount: '*25519',
symbols: ['KINT'],
website: 'https://interlay.io/'
},
{
decimals: [18],
displayName: 'Subspace testnet',
@@ -723,7 +759,7 @@ export const knownSubstrate: KnownSubstrate[] = [
decimals: [12],
displayName: 'CESS Testnet',
network: 'cess-testnet',
prefix: 10042,
prefix: 11330,
standardAccount: '*25519',
symbols: ['TCESS'],
website: 'https://cess.cloud'
@@ -732,7 +768,7 @@ export const knownSubstrate: KnownSubstrate[] = [
decimals: [12],
displayName: 'CESS',
network: 'cess',
prefix: 10043,
prefix: 11331,
standardAccount: '*25519',
symbols: ['CESS'],
website: 'https://cess.cloud'
+13
View File
@@ -0,0 +1,13 @@
{
"extends": "../../tsconfig.base.json",
"compilerOptions": {
"baseUrl": "..",
"outDir": "./build",
"rootDir": "./src"
},
"references": [
{ "path": "../hw-ledger" },
{ "path": "../util" },
{ "path": "../x-fetch" }
]
}
+17 -23
View File
@@ -22,35 +22,29 @@
"./detectPackage.cjs"
],
"type": "module",
"version": "7.9.2",
"version": "8.2.2",
"browser": {
"crypto": false,
"stream": false
},
"main": "index.js",
"dependencies": {
"@babel/runtime": "^7.16.3",
"@polkadot/networks": "7.9.2",
"@polkadot/util": "7.9.2",
"@polkadot/wasm-crypto": "^4.4.1",
"@polkadot/x-randomvalues": "7.9.2",
"blakejs": "^1.1.1",
"bn.js": "^4.12.0",
"create-hash": "^1.2.0",
"@babel/runtime": "^7.16.5",
"@noble/hashes": "^0.4.5",
"@noble/secp256k1": "^1.3.4",
"@polkadot/networks": "8.2.2",
"@polkadot/util": "8.2.2",
"@polkadot/wasm-crypto": "^4.5.1",
"@polkadot/x-bigint": "8.2.2",
"@polkadot/x-randomvalues": "8.2.2",
"ed2curve": "^0.3.0",
"elliptic": "^6.5.4",
"hash.js": "^1.1.7",
"js-sha3": "^0.8.0",
"micro-base": "^0.9.0",
"scryptsy": "^2.1.0",
"tweetnacl": "^1.0.3",
"xxhashjs": "^0.2.2"
"micro-base": "^0.10.0",
"tweetnacl": "^1.0.3"
},
"devDependencies": {
"@types/bn.js": "^4.11.6",
"@types/create-hash": "^1.2.2",
"@types/ed2curve": "^0.2.2",
"@types/elliptic": "^6.4.14",
"@types/scryptsy": "^2.0.0",
"@types/xxhashjs": "^0.2.2"
"@types/ed2curve": "^0.2.2"
},
"peerDependencies": {
"@polkadot/util": "7.9.2"
"@polkadot/util": "8.2.2"
}
}
@@ -3,21 +3,15 @@
import { hexToU8a, stringToU8a, u8aToHex } from '@polkadot/util';
import { createTestPairs, TestKeyringMap } from '../../../keyring/src/testingPairs';
import { ALICE_PUBLIC_SR } from './encode.spec';
import { decodeAddress } from '.';
describe('decodeAddress', (): void => {
let keyring: TestKeyringMap;
beforeAll((): void => {
keyring = createTestPairs({ type: 'sr25519' });
});
it('decodes an address', (): void => {
expect(
decodeAddress('5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY')
).toEqual(
keyring.alice.publicKey
ALICE_PUBLIC_SR
);
});
+2 -2
View File
@@ -8,7 +8,7 @@ import type { Prefix } from './types';
import { assert } from '@polkadot/util';
import { keyExtractPath } from '../key';
import { schnorrkelDerivePublic } from '../schnorrkel';
import { sr25519DerivePublic } from '../sr25519';
import { decodeAddress } from './decode';
import { encodeAddress } from './encode';
@@ -30,7 +30,7 @@ export function deriveAddress (who: HexString | Uint8Array | string, suri: strin
let publicKey = decodeAddress(who);
for (const { chainCode } of path) {
publicKey = schnorrkelDerivePublic(publicKey, chainCode);
publicKey = sr25519DerivePublic(publicKey, chainCode);
}
return encodeAddress(publicKey, ss58Format);
+10 -10
View File
@@ -1,11 +1,11 @@
// Copyright 2017-2021 @polkadot/util-crypto authors & contributors
// SPDX-License-Identifier: Apache-2.0
import { createTestPairs } from '@polkadot/keyring/testingPairs';
import { encodeAddress } from '.';
const keyring = createTestPairs({ type: 'ed25519' }, false);
export const ALICE_PUBLIC_SR = new Uint8Array([212, 53, 147, 199, 21, 253, 211, 28, 97, 20, 26, 189, 4, 169, 159, 214, 130, 44, 133, 88, 133, 76, 205, 227, 154, 86, 132, 231, 165, 109, 162, 125]);
export const ALICE_PUBLIC_ED = new Uint8Array([209, 114, 167, 76, 218, 76, 134, 89, 18, 195, 43, 160, 168, 10, 87, 174, 105, 171, 174, 65, 14, 92, 203, 89, 222, 232, 78, 47, 68, 50, 219, 79]);
const SUBKEY = [
{
@@ -69,7 +69,7 @@ const SUBKEY = [
describe('encode', (): void => {
it('encodes an address to a valid value', (): void => {
expect(
keyring.alice.address
encodeAddress(ALICE_PUBLIC_ED)
).toEqual('5GoKvZWG5ZPYL1WUovuHW3zJBWBP5eT8CbqjdRY4Q6iMaQua');
});
@@ -88,7 +88,7 @@ describe('encode', (): void => {
it('fails when non-valid publicKey provided', (): void => {
expect(
(): string => encodeAddress(
keyring.alice.publicKey.slice(0, 30)
ALICE_PUBLIC_ED.slice(0, 30)
)
).toThrow(/Expected a valid key/);
});
@@ -141,7 +141,7 @@ describe('encode', (): void => {
it('encodes with 2 byte prefix', (): void => {
expect(
encodeAddress(keyring.alice.publicKey, 255)
encodeAddress(ALICE_PUBLIC_ED, 255)
).toEqual('yGHU8YKprxHbHdEv7oUK4rzMZXtsdhcXVG2CAMyC9WhzhjH2k');
});
@@ -155,19 +155,19 @@ describe('encode', (): void => {
it('does not encode for > 16,383, < 0', (): void => {
expect(
() => encodeAddress(keyring.alice.publicKey, -1)
() => encodeAddress(ALICE_PUBLIC_ED, -1)
).toThrow(/range ss58Format specified/);
expect(
() => encodeAddress(keyring.alice.publicKey, 16384)
() => encodeAddress(ALICE_PUBLIC_ED, 16384)
).toThrow(/range ss58Format specified/);
});
it('does not encode reserved', (): void => {
expect(
() => encodeAddress(keyring.alice.publicKey, 46)
() => encodeAddress(ALICE_PUBLIC_ED, 46)
).toThrow(/range ss58Format specified/);
expect(
() => encodeAddress(keyring.alice.publicKey, 47)
() => encodeAddress(ALICE_PUBLIC_ED, 47)
).toThrow(/range ss58Format specified/);
});
});
+2 -5
View File
@@ -1,8 +1,7 @@
// Copyright 2017-2021 @polkadot/util-crypto authors & contributors
// SPDX-License-Identifier: Apache-2.0
import { createTestPairs } from '@polkadot/keyring/testingPairs';
import { ALICE_PUBLIC_SR } from './encode.spec';
import { addressEq } from '.';
describe('addressEq', (): void => {
@@ -34,12 +33,10 @@ describe('addressEq', (): void => {
});
it('returns true for equal, address vs publicKey', (): void => {
const keyring = createTestPairs({ type: 'sr25519' });
expect(
addressEq(
'5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY',
keyring.alice.publicKey
ALICE_PUBLIC_SR
)
).toEqual(true);
});
@@ -5,9 +5,9 @@ import type { HexString } from '@polkadot/util/types';
import type { HashType } from '../secp256k1/types';
import type { Prefix } from './types';
import { u8aConcat } from '@polkadot/util';
import { assert, u8aConcat } from '@polkadot/util';
import { secp256k1Hasher } from '../secp256k1/hasher';
import { hasher } from '../secp256k1/hasher';
import { encodeAddress } from './encode';
/**
@@ -15,15 +15,9 @@ import { encodeAddress } from './encode';
* @summary Converts an EVM address to its corresponding SS58 address.
*/
export function evmToAddress (evmAddress: HexString | string | Uint8Array, ss58Format?: Prefix, hashType: HashType = 'blake2'): string {
const wrapError = (message: string) => `Converting ${evmAddress as string}: ${message}`;
const message = u8aConcat('evm:', evmAddress);
if (message.length !== 24) {
throw new Error(wrapError('Invalid evm address length'));
}
assert(message.length === 24, () => `Converting ${evmAddress as string}: Invalid evm address length`);
const address = secp256k1Hasher(hashType, message);
return encodeAddress(address, ss58Format);
return encodeAddress(hasher(hashType, message), ss58Format);
}
+8 -8
View File
@@ -5,20 +5,20 @@ import { utils } from 'micro-base';
import { createDecode, createEncode, createIs, createValidate } from './helpers';
const BASE32_ALPHABET = 'abcdefghijklmnopqrstuvwxyz234567';
const chars = 'abcdefghijklmnopqrstuvwxyz234567';
const BASE32_CONFIG = {
alphabet: BASE32_ALPHABET,
const config = {
chars,
coder: utils.chain(
// We define our own chain, the default base32 has padding
utils.radix2(5),
utils.alphabet(BASE32_ALPHABET),
utils.alphabet(chars),
{
decode: (input: string) => input.split(''),
encode: (input: string[]) => input.join('')
}
),
ipfsChar: 'b',
ipfs: 'b',
type: 'base32'
};
@@ -28,7 +28,7 @@ const BASE32_CONFIG = {
* @description
* Validates that the supplied value is valid base32, throwing exceptions if not
*/
export const base32Validate = createValidate(BASE32_CONFIG);
export const base32Validate = createValidate(config);
/**
* @name isBase32
@@ -42,7 +42,7 @@ export const isBase32 = createIs(base32Validate);
* @description
* From the provided input, decode the base32 and return the result as an `Uint8Array`.
*/
export const base32Decode = createDecode(BASE32_CONFIG, base32Validate);
export const base32Decode = createDecode(config, base32Validate);
/**
* @name base32Encode
@@ -50,4 +50,4 @@ export const base32Decode = createDecode(BASE32_CONFIG, base32Validate);
* @description
* From the provided input, create the base32 and return the result as a string.
*/
export const base32Encode = createEncode(BASE32_CONFIG);
export const base32Encode = createEncode(config);
+24 -27
View File
@@ -1,19 +1,12 @@
// Copyright 2017-2021 @polkadot/util-crypto authors & contributors
// SPDX-License-Identifier: Apache-2.0
import type { U8aLike } from '@polkadot/util/types';
import { assert, u8aToU8a } from '@polkadot/util';
// NOTE: Work around a TS issue. These are re-defined like in @polkadot/util/types
// since without it the import
//
// import type { U8aLike } from '@polkadot/util/types';
//
// ends up in the build-generated code as
//
// import("../../../util/src/types").U8aLike
//
// eslint-disable-next-line @typescript-eslint/ban-types
type U8aLike = number[] | Buffer | Uint8Array | string | String;
// re-export the type so *.d.ts files don't have ../src imports
export type { U8aLike } from '@polkadot/util/types';
interface Coder {
decode: (value: string) => Uint8Array;
@@ -21,9 +14,9 @@ interface Coder {
}
interface Config {
alphabet: string;
chars: string;
coder: Coder;
ipfsChar?: string;
ipfs?: string;
regex?: RegExp;
type: string;
}
@@ -34,24 +27,24 @@ type EncodeFn = (value: U8aLike, ipfsCompat?: boolean) => string;
type ValidateFn = (value?: unknown, ipfsCompat?: boolean) => value is string;
export function createDecode ({ coder, ipfsChar }: Config, validate: ValidateFn): DecodeFn {
export function createDecode ({ coder, ipfs }: Config, validate: ValidateFn): DecodeFn {
return (value: string, ipfsCompat?: boolean): Uint8Array => {
validate(value, ipfsCompat);
return coder.decode(
ipfsChar && ipfsCompat
ipfs && ipfsCompat
? value.substr(1)
: value
);
};
}
export function createEncode ({ coder, ipfsChar }: Config): EncodeFn {
export function createEncode ({ coder, ipfs }: Config): EncodeFn {
return (value: U8aLike, ipfsCompat?: boolean): string => {
const out = coder.encode(u8aToU8a(value));
return ipfsChar && ipfsCompat
? `${ipfsChar}${out}`
return ipfs && ipfsCompat
? `${ipfs}${out}`
: out;
};
}
@@ -66,20 +59,24 @@ export function createIs (validate: ValidateFn): ValidateFn {
};
}
export function createValidate ({ alphabet, ipfsChar, regex, type }: Config): ValidateFn {
export function createValidate ({ chars, ipfs, type }: Config): ValidateFn {
return (value?: unknown, ipfsCompat?: boolean): value is string => {
assert(value && typeof value === 'string', () => `Expected non-null, non-empty ${type} string input`);
if (ipfsChar && ipfsCompat) {
assert(value[0] === ipfsChar, () => `Expected ipfs-compatible ${type} to start with '${ipfsChar}'`);
if (ipfs && ipfsCompat) {
assert(value[0] === ipfs, () => `Expected ipfs-compatible ${type} to start with '${ipfs}'`);
}
if (regex) {
assert(regex.test(value), `Invalid ${type} encoding`);
} else {
for (let i = (ipfsCompat ? 1 : 0); i < value.length; i++) {
assert(alphabet.includes(value[i]), () => `Invalid ${type} character "${value[i]}" (0x${value.charCodeAt(i).toString(16)}) at index ${i}`);
}
for (let i = (ipfsCompat ? 1 : 0); i < value.length; i++) {
assert(
chars.includes(value[i]) || (
value[i] === '=' && (
(i === value.length - 1) ||
!chars.includes(value[i + 1])
)
),
() => `Invalid ${type} character "${value[i]}" (0x${value.charCodeAt(i).toString(16)}) at index ${i}`
);
}
return true;
+6 -6
View File
@@ -5,10 +5,10 @@ import { base58 } from 'micro-base';
import { createDecode, createEncode, createIs, createValidate } from '../base32/helpers';
const BASE58_CONFIG = {
alphabet: '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz',
const config = {
chars: '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz',
coder: base58,
ipfsChar: 'z',
ipfs: 'z',
type: 'base58'
};
@@ -18,7 +18,7 @@ const BASE58_CONFIG = {
* @description
* Validates that the supplied value is valid base58, throwing exceptions if not
*/
export const base58Validate = createValidate(BASE58_CONFIG);
export const base58Validate = createValidate(config);
/**
* @name base58Decode
@@ -26,7 +26,7 @@ export const base58Validate = createValidate(BASE58_CONFIG);
* @description
* From the provided input, decode the base58 and return the result as an `Uint8Array`.
*/
export const base58Decode = createDecode(BASE58_CONFIG, base58Validate);
export const base58Decode = createDecode(config, base58Validate);
/**
* @name base58Encode
@@ -34,7 +34,7 @@ export const base58Decode = createDecode(BASE58_CONFIG, base58Validate);
* @description
* From the provided input, create the base58 and return the result as a string.
*/
export const base58Encode = createEncode(BASE58_CONFIG);
export const base58Encode = createEncode(config);
/**
* @name isBase58
+5 -6
View File
@@ -5,10 +5,9 @@ import { base64 } from 'micro-base';
import { createDecode, createEncode, createIs, createValidate } from '../base32/helpers';
const BASE64_CONFIG = {
alphabet: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/',
const config = {
chars: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/',
coder: base64,
regex: /^(?:[A-Za-z0-9+/]{2}[A-Za-z0-9+/]{2})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/,
type: 'base64'
};
@@ -18,7 +17,7 @@ const BASE64_CONFIG = {
* @description
* Validates that the supplied value is valid base64
*/
export const base64Validate = createValidate(BASE64_CONFIG);
export const base64Validate = createValidate(config);
/**
* @name isBase64
@@ -32,7 +31,7 @@ export const isBase64 = createIs(base64Validate);
* @description
* From the provided input, decode the base64 and return the result as an `Uint8Array`.
*/
export const base64Decode = createDecode(BASE64_CONFIG, base64Validate);
export const base64Decode = createDecode(config, base64Validate);
/**
* @name base64Encode
@@ -40,4 +39,4 @@ export const base64Decode = createDecode(BASE64_CONFIG, base64Validate);
* @description
* From the provided input, create the base64 and return the result as a string.
*/
export const base64Encode = createEncode(BASE64_CONFIG);
export const base64Encode = createEncode(config);
+17 -1
View File
@@ -6,11 +6,27 @@ import { stringToU8a } from '@polkadot/util';
import { base64Decode } from '.';
describe('base64Decode', (): void => {
it('decodes a mixed base64 utf8 string', (): void => {
it('decodes a mixed base64 utf8 string (1)', (): void => {
expect(
base64Decode('aGVsbG8gd29ybGQg0J/RgNC40LLQtdGC0YHRgtCy0YPRjiDQvNC4IOS9oOWlvQ==')
).toEqual(
stringToU8a('hello world Приветствую ми 你好')
);
});
it('decodes a mixed base64 utf8 string (2)', (): void => {
expect(
base64Decode('4pyTIMOgIGxhIG1vZGU=')
).toEqual(
stringToU8a('✓ à la mode')
);
});
it('decodes a mixed base64 utf8 string (3)', (): void => {
expect(
base64Decode('SGVsbG8gV29ybGQh')
).toEqual(
stringToU8a('Hello World!')
);
});
});
@@ -7,6 +7,6 @@ describe('base64Validate', (): void => {
it('validates a mixed base64 utf8 string', (): void => {
expect(
() => base64Validate('aGVsbG8gd29ybGQg0J/RgNC40LLQtd^GC0YHRgtCy0YPRjiDQvNC4IOS9oOWlvQ==')
).toThrow(/Invalid base64 encoding/);
).toThrow(/Invalid base64 character "\^" \(0x5e\) at index 30/);
});
});
@@ -4,7 +4,7 @@
import { hexToU8a } from '@polkadot/util';
import { waitReady } from '@polkadot/wasm-crypto';
import { performanceTest } from '../../test/performance';
import { performanceWasm } from '../test/performance';
import { blake2AsU8a } from '.';
describe('blake2AsU8a', (): void => {
@@ -61,7 +61,7 @@ describe('blake2AsU8a', (): void => {
});
describe.each([256, 512] as (256 | 512)[])('bitLength=$p', (bitLength): void => {
performanceTest(`blake2AsU8a, bitLength=${bitLength}`, 64000, (input, onlyJs) =>
performanceWasm(`blake2AsU8a, bitLength=${bitLength}`, 64000, (input, onlyJs) =>
blake2AsU8a(input, bitLength, null, onlyJs)
);
});
+9 -7
View File
@@ -3,12 +3,14 @@
import type { HexString } from '@polkadot/util/types';
import js from 'blakejs';
import { blake2b as blake2bJs } from '@noble/hashes/lib/blake2b';
import { u8aToU8a } from '@polkadot/util';
import { blake2b } from '@polkadot/wasm-crypto';
import { hasBigInt, u8aToU8a } from '@polkadot/util';
import { blake2b, isReady } from '@polkadot/wasm-crypto';
import { createAsHex, isWasmOnly } from '../helpers';
import { createAsHex } from '../helpers';
type BitLength = 64 | 128 | 256 | 384 | 512;
/**
* @name blake2AsU8a
@@ -24,13 +26,13 @@ import { createAsHex, isWasmOnly } from '../helpers';
* blake2AsU8a('abc'); // => [0xba, 0x80, 0xa5, 0x3f, 0x98, 0x1c, 0x4d, 0x0d]
* ```
*/
export function blake2AsU8a (data: HexString | Uint8Array | string, bitLength = 256, key?: Uint8Array | null, onlyJs?: boolean): Uint8Array {
export function blake2AsU8a (data: HexString | Uint8Array | string, bitLength: BitLength = 256, key?: Uint8Array | null, onlyJs?: boolean): Uint8Array {
const byteLength = Math.ceil(bitLength / 8);
const u8a = u8aToU8a(data);
return isWasmOnly(onlyJs)
return !hasBigInt || (!onlyJs && isReady())
? blake2b(u8a, u8aToU8a(key), byteLength)
: js.blake2b(u8a, key || undefined, byteLength);
: blake2bJs(u8a, { dkLen: byteLength, key: key || undefined });
}
/**
+1
View File
@@ -1,6 +1,7 @@
// Copyright 2017-2021 @polkadot/util-crypto authors & contributors
// SPDX-License-Identifier: Apache-2.0
export const BN_BE_OPTS = { isLe: false };
export const BN_LE_OPTS = { isLe: true };
export const BN_LE_16_OPTS = { bitLength: 16, isLe: true };
+2 -1
View File
@@ -12,6 +12,7 @@ export * from './base58';
export * from './base64';
export * from './blake2';
export * from './crypto';
export * from './ed25519';
export * from './ethereum';
export * from './hd';
export * from './hmac';
@@ -23,9 +24,9 @@ export * from './networks';
export * from './nacl';
export * from './pbkdf2';
export * from './random';
export * from './schnorrkel';
export * from './scrypt';
export * from './secp256k1';
export * from './sha';
export * from './signature';
export * from './sr25519';
export * from './xxhash';
+12
View File
@@ -1,7 +1,19 @@
// Copyright 2017-2021 @polkadot/util-crypto authors & contributors
// SPDX-License-Identifier: Apache-2.0
import '@polkadot/x-bigint/shim';
import { utils as utilsNobleSecp256k1 } from '@noble/secp256k1';
import { u8aConcat } from '@polkadot/util';
import { cryptoWaitReady } from './crypto';
import { hmacSha256AsU8a } from './hmac';
// Set overrides on the secp256k1 utils
// - hmacShaSync - This needs to be set, unset by default
utilsNobleSecp256k1.hmacSha256Sync = (key: Uint8Array, ...messages: Uint8Array[]) =>
hmacSha256AsU8a(key, u8aConcat(...messages));
// start init process immediately
cryptoWaitReady().catch((): void => {
@@ -7,7 +7,7 @@ import { blake2AsU8a } from '../blake2/asU8a';
const HDKD = compactAddLength(stringToU8a('Ed25519HDKD'));
export function naclDeriveHard (seed: Uint8Array, chainCode: Uint8Array): Uint8Array {
export function ed25519DeriveHard (seed: Uint8Array, chainCode: Uint8Array): Uint8Array {
assert(isU8a(chainCode) && chainCode.length === 32, 'Invalid chainCode passed to derive');
return blake2AsU8a(
+14
View File
@@ -0,0 +1,14 @@
// Copyright 2017-2021 @polkadot/util-crypto authors & contributors
// SPDX-License-Identifier: Apache-2.0
/**
* @summary Implements ed25519 operations
*/
export { convertPublicKeyToCurve25519, convertSecretKeyToCurve25519 } from './convertKey';
export { ed25519DeriveHard } from './deriveHard';
export { ed25519PairFromRandom } from './pair/fromRandom';
export { ed25519PairFromSecret } from './pair/fromSecret';
export { ed25519PairFromSeed } from './pair/fromSeed';
export { ed25519PairFromString } from './pair/fromString';
export { ed25519Sign } from './sign';
export { ed25519Verify } from './verify';
@@ -3,13 +3,13 @@
import type { Keypair } from '../../types';
import { naclKeypairFromRandom } from '..';
import { ed25519PairFromRandom } from '..';
describe('naclKeypairFromRandom', (): void => {
describe('ed25519PairFromRandom', (): void => {
let keypair: Keypair;
beforeEach((): void => {
keypair = naclKeypairFromRandom();
keypair = ed25519PairFromRandom();
});
it('generates a valid publicKey', (): void => {
@@ -3,10 +3,11 @@
import type { Keypair } from '../../types';
import nacl from 'tweetnacl';
import { randomAsU8a } from '../../random';
import { ed25519PairFromSeed } from './fromSeed';
/**
* @name naclKeypairFromRandom
* @name ed25519PairFromRandom
* @summary Creates a new public/secret keypair.
* @description
* Returns a new generate object containing a `publicKey` & `secretKey`.
@@ -14,11 +15,11 @@ import nacl from 'tweetnacl';
* <BR>
*
* ```javascript
* import { naclKeypairFromRandom } from '@polkadot/util-crypto';
* import { ed25519PairFromRandom } from '@polkadot/util-crypto';
*
* naclKeypairFromRandom(); // => { secretKey: [...], publicKey: [...] }
* ed25519PairFromRandom(); // => { secretKey: [...], publicKey: [...] }
* ```
*/
export function naclKeypairFromRandom (): Keypair {
return nacl.sign.keyPair();
export function ed25519PairFromRandom (): Keypair {
return ed25519PairFromSeed(randomAsU8a());
}
@@ -1,9 +1,9 @@
// Copyright 2017-2021 @polkadot/util-crypto authors & contributors
// SPDX-License-Identifier: Apache-2.0
import { naclKeypairFromSecret } from '..';
import { ed25519PairFromSecret } from '..';
describe('naclKeypairFromSecret', (): void => {
describe('ed25519PairFromSecret', (): void => {
const secretKey = new Uint8Array([
18, 52, 86, 120, 144, 18, 52, 86,
120, 144, 18, 52, 86, 120, 144, 18,
@@ -17,7 +17,7 @@ describe('naclKeypairFromSecret', (): void => {
it('generates a valid publicKey/secretKey pair', (): void => {
expect(
naclKeypairFromSecret(secretKey)
ed25519PairFromSecret(secretKey)
).toEqual({
publicKey: new Uint8Array([
180, 114, 93, 155, 165, 255, 217, 82,
@@ -6,7 +6,7 @@ import type { Keypair } from '../../types';
import nacl from 'tweetnacl';
/**
* @name naclKeypairFromSecret
* @name ed25519PairFromSecret
* @summary Creates a new public/secret keypair from a secret.
* @description
* Returns a object containing a `publicKey` & `secretKey` generated from the supplied secret.
@@ -14,11 +14,11 @@ import nacl from 'tweetnacl';
* <BR>
*
* ```javascript
* import { naclKeypairFromSecret } from '@polkadot/util-crypto';
* import { ed25519PairFromSecret } from '@polkadot/util-crypto';
*
* naclKeypairFromSecret(...); // => { secretKey: [...], publicKey: [...] }
* ed25519PairFromSecret(...); // => { secretKey: [...], publicKey: [...] }
* ```
*/
export function naclKeypairFromSecret (secret: Uint8Array): Keypair {
export function ed25519PairFromSecret (secret: Uint8Array): Keypair {
return nacl.sign.keyPair.fromSecretKey(secret);
}
@@ -4,9 +4,9 @@
import { stringToU8a } from '@polkadot/util';
import { waitReady } from '@polkadot/wasm-crypto';
import { naclKeypairFromSeed } from '..';
import { ed25519PairFromSeed } from '..';
describe('naclKeypairFromSeed', (): void => {
describe('ed25519PairFromSeed', (): void => {
// NOTE: Aligned with Rust test, b"12345678901234567890123456789012"
const TEST = stringToU8a('12345678901234567890123456789012');
const RESULT = {
@@ -33,7 +33,7 @@ describe('naclKeypairFromSeed', (): void => {
it('generates a valid publicKey/secretKey pair (u8a)', (): void => {
[true, false].forEach((onlyJs): void => {
expect(
naclKeypairFromSeed(TEST, onlyJs)
ed25519PairFromSeed(TEST, onlyJs)
).toEqual(RESULT);
});
});
@@ -8,7 +8,7 @@ import nacl from 'tweetnacl';
import { ed25519KeypairFromSeed, isReady } from '@polkadot/wasm-crypto';
/**
* @name naclKeypairFromSeed
* @name ed25519PairFromSeed
* @summary Creates a new public/secret keypair from a seed.
* @description
* Returns a object containing a `publicKey` & `secretKey` generated from the supplied seed.
@@ -16,12 +16,12 @@ import { ed25519KeypairFromSeed, isReady } from '@polkadot/wasm-crypto';
* <BR>
*
* ```javascript
* import { naclKeypairFromSeed } from '@polkadot/util-crypto';
* import { ed25519PairFromSeed } from '@polkadot/util-crypto';
*
* naclKeypairFromSeed(...); // => { secretKey: [...], publicKey: [...] }
* ed25519PairFromSeed(...); // => { secretKey: [...], publicKey: [...] }
* ```
*/
export function naclKeypairFromSeed (seed: Uint8Array, onlyJs?: boolean): Keypair {
export function ed25519PairFromSeed (seed: Uint8Array, onlyJs?: boolean): Keypair {
if (!onlyJs && isReady()) {
const full = ed25519KeypairFromSeed(seed);
@@ -1,12 +1,12 @@
// Copyright 2017-2021 @polkadot/util-crypto authors & contributors
// SPDX-License-Identifier: Apache-2.0
import { naclKeypairFromString } from '..';
import { ed25519PairFromString } from '..';
describe('naclKeypairFromSeed', (): void => {
describe('ed25519PairFromSeed', (): void => {
it('generates a valid publicKey/secretKey pair', (): void => {
expect(
naclKeypairFromString('test')
ed25519PairFromString('test')
).toEqual({
publicKey: new Uint8Array([188, 108, 179, 142, 36, 142, 76, 87, 77, 193, 147, 139, 254, 110, 196, 217, 117, 233, 167, 165, 250, 150, 247, 237, 198, 68, 129, 4, 211, 209, 136, 48]),
secretKey: new Uint8Array([146, 139, 32, 54, 105, 67, 226, 175, 209, 30, 188, 14, 174, 46, 83, 169, 59, 241, 119, 164, 252, 243, 91, 204, 100, 213, 3, 112, 78, 101, 226, 2, 188, 108, 179, 142, 36, 142, 76, 87, 77, 193, 147, 139, 254, 110, 196, 217, 117, 233, 167, 165, 250, 150, 247, 237, 198, 68, 129, 4, 211, 209, 136, 48])
@@ -6,10 +6,10 @@ import type { Keypair } from '../../types';
import { stringToU8a } from '@polkadot/util';
import { blake2AsU8a } from '../../blake2/asU8a';
import { naclKeypairFromSeed } from './fromSeed';
import { ed25519PairFromSeed } from './fromSeed';
/**
* @name naclKeypairFromString
* @name ed25519PairFromString
* @summary Creates a new public/secret keypair from a string.
* @description
* Returns a object containing a `publicKey` & `secretKey` generated from the supplied string. The string is hashed and the value used as the input seed.
@@ -17,16 +17,15 @@ import { naclKeypairFromSeed } from './fromSeed';
* <BR>
*
* ```javascript
* import { naclKeypairFromString } from '@polkadot/util-crypto';
* import { ed25519PairFromString } from '@polkadot/util-crypto';
*
* naclKeypairFromString('test'); // => { secretKey: [...], publicKey: [...] }
* ed25519PairFromString('test'); // => { secretKey: [...], publicKey: [...] }
* ```
*/
export function naclKeypairFromString (value: string): Keypair {
return naclKeypairFromSeed(
export function ed25519PairFromString (value: string): Keypair {
return ed25519PairFromSeed(
blake2AsU8a(
stringToU8a(value),
256
stringToU8a(value)
)
);
}
@@ -4,14 +4,14 @@
import { stringToU8a } from '@polkadot/util';
import { waitReady } from '@polkadot/wasm-crypto';
import { performanceTest } from '../../test/performance';
import { naclKeypairFromSeed, naclSign } from '.';
import { performanceWasm } from '../test/performance';
import { ed25519PairFromSeed, ed25519Sign } from '.';
const PAIR = naclKeypairFromSeed(
const PAIR = ed25519PairFromSeed(
stringToU8a('12345678901234567890123456789012')
);
describe('naclSign', (): void => {
describe('ed25519Sign', (): void => {
beforeEach(async (): Promise<void> => {
await waitReady();
});
@@ -19,7 +19,7 @@ describe('naclSign', (): void => {
describe.each([false, true])('onlyJs=%p', (onlyJs): void => {
it('returns a valid signature for the message', (): void => {
expect(
naclSign(
ed25519Sign(
new Uint8Array([0x61, 0x62, 0x63, 0x64]),
PAIR,
onlyJs
@@ -30,7 +30,7 @@ describe('naclSign', (): void => {
});
});
performanceTest('naclSign', 250, (input, onlyJs) =>
naclSign(input, PAIR, onlyJs)
performanceWasm('ed25519Sign', 250, (input, onlyJs) =>
ed25519Sign(input, PAIR, onlyJs)
);
});
@@ -7,12 +7,10 @@ import type { Keypair } from '../types';
import nacl from 'tweetnacl';
import { assert, u8aToU8a } from '@polkadot/util';
import { ed25519Sign } from '@polkadot/wasm-crypto';
import { isWasmOnly } from '../helpers';
import { ed25519Sign as wasmSign, isReady } from '@polkadot/wasm-crypto';
/**
* @name naclSign
* @name ed25519Sign
* @summary Signs a message using the supplied secretKey
* @description
* Returns message signature of `message`, using the `secretKey`.
@@ -20,17 +18,17 @@ import { isWasmOnly } from '../helpers';
* <BR>
*
* ```javascript
* import { naclSign } from '@polkadot/util-crypto';
* import { ed25519Sign } from '@polkadot/util-crypto';
*
* naclSign([...], [...]); // => [...]
* ed25519Sign([...], [...]); // => [...]
* ```
*/
export function naclSign (message: HexString | Uint8Array | string, { publicKey, secretKey }: Partial<Keypair>, onlyJs?: boolean): Uint8Array {
export function ed25519Sign (message: HexString | Uint8Array | string, { publicKey, secretKey }: Partial<Keypair>, onlyJs?: boolean): Uint8Array {
assert(secretKey, 'Expected a valid secretKey');
const messageU8a = u8aToU8a(message);
return isWasmOnly(onlyJs)
? ed25519Sign(publicKey as Uint8Array, secretKey.subarray(0, 32), messageU8a)
return !onlyJs && isReady()
? wasmSign(publicKey as Uint8Array, secretKey.subarray(0, 32), messageU8a)
: nacl.sign.detached(messageU8a, secretKey);
}
@@ -4,16 +4,16 @@
import { stringToU8a } from '@polkadot/util';
import { waitReady } from '@polkadot/wasm-crypto';
import { naclKeypairFromSeed, naclVerify } from '.';
import { ed25519PairFromSeed, ed25519Verify } from '.';
describe('naclVerify', (): void => {
describe('ed25519Verify', (): void => {
let publicKey: Uint8Array;
let signature: Uint8Array;
beforeEach(async (): Promise<void> => {
await waitReady();
publicKey = naclKeypairFromSeed(
publicKey = ed25519PairFromSeed(
stringToU8a('12345678901234567890123456789012')
).publicKey;
signature = new Uint8Array([28, 58, 206, 239, 249, 70, 59, 191, 166, 40, 219, 218, 235, 170, 25, 79, 10, 94, 9, 197, 34, 126, 1, 150, 246, 68, 28, 238, 36, 26, 172, 163, 168, 90, 202, 211, 126, 246, 57, 212, 43, 24, 88, 197, 240, 113, 118, 76, 37, 81, 91, 110, 236, 50, 144, 134, 100, 223, 220, 238, 34, 185, 211, 7]);
@@ -22,7 +22,7 @@ describe('naclVerify', (): void => {
describe.each([false, true])('onlyJs=%p', (onlyJs): void => {
it('validates a correctly signed message', (): void => {
expect(
naclVerify(
ed25519Verify(
new Uint8Array([0x61, 0x62, 0x63, 0x64]),
signature,
publicKey,
@@ -33,7 +33,7 @@ describe('naclVerify', (): void => {
it('fails a correctly signed message (message changed)', (): void => {
expect(
naclVerify(
ed25519Verify(
new Uint8Array([0x61, 0x62, 0x63, 0x64, 0x65]),
signature,
publicKey,
@@ -46,7 +46,7 @@ describe('naclVerify', (): void => {
signature[0] = 0xff;
expect(
naclVerify(
ed25519Verify(
new Uint8Array([0x61, 0x62, 0x63, 0x64]),
signature,
publicKey,
@@ -57,7 +57,7 @@ describe('naclVerify', (): void => {
it('throws error when publicKey lengths do not match', (): void => {
expect(
() => naclVerify(
() => ed25519Verify(
new Uint8Array([0x61, 0x62, 0x63, 0x64]),
signature,
new Uint8Array([1, 2]),
@@ -68,7 +68,7 @@ describe('naclVerify', (): void => {
it('throws error when signature lengths do not match', (): void => {
expect(
() => naclVerify(
() => ed25519Verify(
new Uint8Array([0x61, 0x62, 0x63, 0x64]),
new Uint8Array([1, 2]),
publicKey,
@@ -6,12 +6,10 @@ import type { HexString } from '@polkadot/util/types';
import nacl from 'tweetnacl';
import { assert, u8aToU8a } from '@polkadot/util';
import { ed25519Verify } from '@polkadot/wasm-crypto';
import { isWasmOnly } from '../helpers';
import { ed25519Verify as wasmVerify, isReady } from '@polkadot/wasm-crypto';
/**
* @name naclSign
* @name ed25519Sign
* @summary Verifies the signature on the supplied message.
* @description
* Verifies the `signature` on `message` with the supplied `publicKey`. Returns `true` on sucess, `false` otherwise.
@@ -19,12 +17,12 @@ import { isWasmOnly } from '../helpers';
* <BR>
*
* ```javascript
* import { naclVerify } from '@polkadot/util-crypto';
* import { ed25519Verify } from '@polkadot/util-crypto';
*
* naclVerify([...], [...], [...]); // => true/false
* ed25519Verify([...], [...], [...]); // => true/false
* ```
*/
export function naclVerify (message: HexString | Uint8Array | string, signature: HexString | Uint8Array | string, publicKey: HexString | Uint8Array | string, onlyJs?: boolean): boolean {
export function ed25519Verify (message: HexString | Uint8Array | string, signature: HexString | Uint8Array | string, publicKey: HexString | Uint8Array | string, onlyJs?: boolean): boolean {
const messageU8a = u8aToU8a(message);
const publicKeyU8a = u8aToU8a(publicKey);
const signatureU8a = u8aToU8a(signature);
@@ -32,7 +30,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 isWasmOnly(onlyJs)
? ed25519Verify(signatureU8a, messageU8a, publicKeyU8a)
return !onlyJs && isReady()
? wasmVerify(signatureU8a, messageU8a, publicKeyU8a)
: nacl.sign.detached.verify(messageU8a, signatureU8a, publicKeyU8a);
}
@@ -7,7 +7,7 @@ import { assert, bnToU8a, stringToU8a, u8aConcat } from '@polkadot/util';
import { BN_BE_32_OPTS } from '../../bn';
import { hmacShaAsU8a } from '../../hmac';
import { secp256k1KeypairFromSeed, secp256k1PrivateKeyTweakAdd } from '../../secp256k1';
import { secp256k1PairFromSeed, secp256k1PrivateKeyTweakAdd } from '../../secp256k1';
import { HARDENED, hdValidatePath } from '../validatePath';
interface CodedKeypair extends Keypair {
@@ -19,7 +19,7 @@ const MASTER_SECRET = stringToU8a('Bitcoin seed');
function createCoded (secretKey: Uint8Array, chainCode: Uint8Array): CodedKeypair {
return {
chainCode,
publicKey: secp256k1KeypairFromSeed(secretKey).publicKey,
publicKey: secp256k1PairFromSeed(secretKey).publicKey,
secretKey
};
}
+2 -2
View File
@@ -5,8 +5,8 @@ import type { Keypair } from '../../types';
import { assert } from '@polkadot/util';
import { ed25519PairFromSeed } from '../../ed25519';
import { mnemonicValidate } from '../../mnemonic';
import { naclKeypairFromSeed } from '../../nacl';
import { HARDENED, hdValidatePath } from '../validatePath';
import { ledgerDerivePrivate } from './derivePrivate';
import { ledgerMaster } from './master';
@@ -35,5 +35,5 @@ export function hdLedger (_mnemonic: string, path: string): Keypair {
seed = ledgerDerivePrivate(seed, (n < HARDENED) ? (n + HARDENED) : n);
}
return naclKeypairFromSeed(seed.slice(0, 32));
return ed25519PairFromSeed(seed.slice(0, 32));
}
+17 -3
View File
@@ -3,9 +3,17 @@
import type { HexString } from '@polkadot/util/types';
import { u8aToHex } from '@polkadot/util';
import { hasBigInt, u8aToHex, u8aToU8a } from '@polkadot/util';
import { isReady } from '@polkadot/wasm-crypto';
// re-export so TS *.d.ts generation is correct
export type { HexString } from '@polkadot/util/types';
interface DualHash {
256: (u8a: Uint8Array) => Uint8Array;
512: (u8a: Uint8Array) => Uint8Array;
}
// eslint-disable-next-line @typescript-eslint/no-explicit-any
export function createAsHex <T extends (...args: any[]) => Uint8Array> (fn: T): (...args: Parameters<T>) => HexString {
return (...args: Parameters<T>): HexString =>
@@ -17,6 +25,12 @@ export function createBitHasher <T> (bitLength: T, fn: (data: HexString | Buffer
fn(data, bitLength, onlyJs);
}
export function isWasmOnly (onlyJs?: boolean): boolean {
return isReady() && !onlyJs;
export function createDualHasher (wa: DualHash, js: DualHash): (value: HexString | Buffer | Uint8Array | string, bitLength?: 256 | 512, onlyJs?: boolean) => Uint8Array {
return (value: HexString | Buffer | Uint8Array | string, bitLength: 256 | 512 = 256, onlyJs?: boolean): Uint8Array => {
const u8a = u8aToU8a(value);
return !hasBigInt || (!onlyJs && isReady())
? wa[bitLength](u8a)
: js[bitLength](u8a);
};
}
@@ -4,7 +4,7 @@
import { hexToU8a, stringToU8a } from '@polkadot/util';
import { waitReady } from '@polkadot/wasm-crypto';
import { performanceTest } from '../../test/performance';
import { performanceWasm } from '../test/performance';
import { hmacShaAsU8a } from '.';
describe('hmacShaAsU8a', (): void => {
@@ -23,7 +23,7 @@ describe('hmacShaAsU8a', (): void => {
)
};
describe.each([256, 512] as (256 | 512)[])('bitLength=$p', (bitLength): void => {
describe.each([256, 512] as (256 | 512)[])('bitLength=%p', (bitLength): void => {
describe.each([false, true])('onlyJs=%p', (onlyJs): void => {
it('returns an hex representation (string)', (): void => {
expect(
@@ -32,7 +32,7 @@ describe('hmacShaAsU8a', (): void => {
});
});
performanceTest(`hmacShaAsU8a, bitLength=${bitLength}`, 16000, (input, onlyJs) =>
performanceWasm(`hmacShaAsU8a, bitLength=${bitLength}`, 16000, (input, onlyJs) =>
hmacShaAsU8a(input, input, bitLength, onlyJs)
);
});
+33 -21
View File
@@ -1,38 +1,50 @@
// Copyright 2017-2021 @polkadot/util-crypto authors & contributors
// SPDX-License-Identifier: Apache-2.0
import hash from 'hash.js';
import { hmac } from '@noble/hashes/lib/hmac';
import { sha256 } from '@noble/hashes/lib/sha256';
import { sha512 } from '@noble/hashes/lib/sha512';
import { u8aToU8a } from '@polkadot/util';
import { hmacSha256, hmacSha512 } from '@polkadot/wasm-crypto';
import { hasBigInt, u8aToU8a } from '@polkadot/util';
import { hmacSha256, hmacSha512, isReady } from '@polkadot/wasm-crypto';
import { isWasmOnly } from '../helpers';
type BitLength = 256 | 512;
type HashFn = (key: Uint8Array | string, data: Uint8Array, onlyJs?: boolean) => Uint8Array;
const JS_HASH = {
256: sha256,
512: sha512
};
function createSha (bitLength: 256 | 512 = 256): HashFn {
const WA_MHAC = {
256: hmacSha256,
512: hmacSha512
};
function createSha (bitLength: BitLength): (key: Uint8Array | string, data: Uint8Array, onlyJs?: boolean) => Uint8Array {
return (key: Uint8Array | string, data: Uint8Array, onlyJs?: boolean): Uint8Array =>
hmacShaAsU8a(key, data, bitLength, onlyJs);
}
export function hmacShaAsU8a (key: Uint8Array | string, data: Uint8Array, bitLength: 256 | 512 = 256, onlyJs?: boolean): Uint8Array {
const is256 = bitLength === 256;
/**
* @name hmacShaAsU8a
* @description creates a Hmac Sha (256/512) Uint8Array from the key & data
*/
export function hmacShaAsU8a (key: Uint8Array | string, data: Uint8Array, bitLength: BitLength = 256, onlyJs?: boolean): Uint8Array {
const u8aKey = u8aToU8a(key);
return isWasmOnly(onlyJs)
? is256
? hmacSha256(u8aKey, data)
: hmacSha512(u8aKey, data)
: new Uint8Array(
is256
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore
? hash.hmac(hash.sha256, u8aKey).update(data).digest()
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore
: hash.hmac(hash.sha512, u8aKey).update(data).digest()
);
return !hasBigInt || (!onlyJs && isReady())
? WA_MHAC[bitLength](u8aKey, data)
: hmac(JS_HASH[bitLength], u8aKey, data);
}
/**
* @name hmacSha256AsU8a
* @description creates a Hmac Sha256 Uint8Array from the key & data
*/
export const hmacSha256AsU8a = createSha(256);
/**
* @name hmacSha512AsU8a
* @description creates a Hmac Sha512 Uint8Array from the key & data
*/
export const hmacSha512AsU8a = createSha(512);
@@ -4,7 +4,7 @@
import { hexToU8a, stringToU8a } from '@polkadot/util';
import { waitReady } from '@polkadot/wasm-crypto';
import { performanceTest } from '../../test/performance';
import { performanceWasm } from '../test/performance';
import { keccakAsU8a } from '.';
describe('keccakAsU8a', (): void => {
@@ -43,7 +43,7 @@ describe('keccakAsU8a', (): void => {
});
});
performanceTest(`keccakAsU8a, bitLength=${bitLength}`, 128000, (input, onlyJs) =>
performanceWasm(`keccakAsU8a, bitLength=${bitLength}`, 128000, (input, onlyJs) =>
keccakAsU8a(input, bitLength, onlyJs)
);
});
+6 -18
View File
@@ -1,14 +1,11 @@
// Copyright 2017-2021 @polkadot/util-crypto authors & contributors
// SPDX-License-Identifier: Apache-2.0
import type { HexString } from '@polkadot/util/types';
import { keccak_256 as keccak256Js, keccak_512 as keccak512Js } from '@noble/hashes/lib/sha3';
import js from 'js-sha3';
import { u8aToU8a } from '@polkadot/util';
import { keccak256, keccak512 } from '@polkadot/wasm-crypto';
import { createAsHex, createBitHasher, isWasmOnly } from '../helpers';
import { createAsHex, createBitHasher, createDualHasher } from '../helpers';
/**
* @name keccakAsU8a
@@ -24,20 +21,11 @@ import { createAsHex, createBitHasher, isWasmOnly } from '../helpers';
* keccakAsU8a('123'); // => Uint8Array
* ```
*/
export function keccakAsU8a (value: HexString | Buffer | Uint8Array | string, bitLength: 256 | 512 = 256, onlyJs?: boolean): Uint8Array {
const is256 = bitLength === 256;
const u8a = u8aToU8a(value);
return isWasmOnly(onlyJs)
? is256
? keccak256(u8a)
: keccak512(u8a)
: new Uint8Array(
is256
? js.keccak256.update(u8a).arrayBuffer()
: js.keccak512.update(u8a).arrayBuffer()
);
}
export const keccakAsU8a = createDualHasher(
{ 256: keccak256, 512: keccak512 },
{ 256: keccak256Js, 512: keccak512Js }
);
/**
* @name keccak256AsU8a
+2 -2
View File
@@ -2,7 +2,7 @@
// SPDX-License-Identifier: Apache-2.0
import { secp256k1DeriveHard } from '../secp256k1/deriveHard';
import { secp256k1KeypairFromSeed } from '../secp256k1/keypair/fromSeed';
import { secp256k1PairFromSeed } from '../secp256k1/pair/fromSeed';
import { createSeedDeriveFn } from './hdkdDerive';
export const keyHdkdEcdsa = createSeedDeriveFn(secp256k1KeypairFromSeed, secp256k1DeriveHard);
export const keyHdkdEcdsa = createSeedDeriveFn(secp256k1PairFromSeed, secp256k1DeriveHard);
+2 -3
View File
@@ -1,8 +1,7 @@
// Copyright 2017-2021 @polkadot/util-crypto authors & contributors
// SPDX-License-Identifier: Apache-2.0
import { naclDeriveHard } from '../nacl/deriveHard';
import { naclKeypairFromSeed } from '../nacl/keypair/fromSeed';
import { ed25519DeriveHard, ed25519PairFromSeed } from '../ed25519';
import { createSeedDeriveFn } from './hdkdDerive';
export const keyHdkdEd25519 = createSeedDeriveFn(naclKeypairFromSeed, naclDeriveHard);
export const keyHdkdEd25519 = createSeedDeriveFn(ed25519PairFromSeed, ed25519DeriveHard);
+4 -4
View File
@@ -3,12 +3,12 @@
import type { Keypair } from '../types';
import { schnorrkelDeriveHard } from '../schnorrkel/deriveHard';
import { schnorrkelDeriveSoft } from '../schnorrkel/deriveSoft';
import { sr25519DeriveHard } from '../sr25519/deriveHard';
import { sr25519DeriveSoft } from '../sr25519/deriveSoft';
import { DeriveJunction } from './DeriveJunction';
export function keyHdkdSr25519 (keypair: Keypair, { chainCode, isSoft }: DeriveJunction): Keypair {
return isSoft
? schnorrkelDeriveSoft(keypair, chainCode)
: schnorrkelDeriveHard(keypair, chainCode);
? sr25519DeriveSoft(keypair, chainCode)
: sr25519DeriveHard(keypair, chainCode);
}
File diff suppressed because one or more lines are too long
@@ -0,0 +1,14 @@
// Copyright 2017-2021 @polkadot/util-crypto authors & contributors
// SPDX-License-Identifier: Apache-2.0
import DEFAULT_WORDLIST from './bip39-en';
describe('wordlist', (): void => {
it('has the correct number of words', (): void => {
expect(DEFAULT_WORDLIST).toHaveLength(2048);
});
it('has no empty words', (): void => {
expect(DEFAULT_WORDLIST.some((n) => !n.length || n.trim() !== n)).toEqual(false);
});
});
@@ -1,9 +1,9 @@
// Copyright 2017-2021 @polkadot/util-crypto authors & contributors
// SPDX-License-Identifier: Apache-2.0
import { bip39Generate } from '@polkadot/wasm-crypto';
import { hasBigInt } from '@polkadot/util';
import { bip39Generate, isReady } from '@polkadot/wasm-crypto';
import { isWasmOnly } from '../helpers';
import { generateMnemonic } from './bip39';
export type WordCount = 12 | 15 | 18 | 21 | 24;
@@ -30,7 +30,7 @@ const STRENGTH_MAP = {
* ```
*/
export function mnemonicGenerate (numWords: WordCount = 12, onlyJs?: boolean): string {
return isWasmOnly(onlyJs)
return !hasBigInt || (!onlyJs && isReady())
? bip39Generate(numWords)
: generateMnemonic(STRENGTH_MAP[numWords]);
}
@@ -3,7 +3,7 @@
import { u8aToHex } from '@polkadot/util';
import tests from '../schnorrkel/keypair/testing';
import tests from '../sr25519/pair/testing.spec';
import { cryptoWaitReady } from '..';
import { mnemonicToEntropy } from './toEntropy';
@@ -1,13 +1,13 @@
// Copyright 2017-2021 @polkadot/util-crypto authors & contributors
// SPDX-License-Identifier: Apache-2.0
import { bip39ToEntropy } from '@polkadot/wasm-crypto';
import { hasBigInt } from '@polkadot/util';
import { bip39ToEntropy, isReady } from '@polkadot/wasm-crypto';
import { isWasmOnly } from '../helpers';
import { mnemonicToEntropy as jsToEntropy } from './bip39';
export function mnemonicToEntropy (mnemonic: string, onlyJs?: boolean): Uint8Array {
return isWasmOnly(onlyJs)
return !hasBigInt || (!onlyJs && isReady())
? bip39ToEntropy(mnemonic)
: jsToEntropy(mnemonic);
}
@@ -1,10 +1,9 @@
// Copyright 2017-2021 @polkadot/util-crypto authors & contributors
// SPDX-License-Identifier: Apache-2.0
import { assert } from '@polkadot/util';
import { bip39ToSeed } from '@polkadot/wasm-crypto';
import { assert, hasBigInt } from '@polkadot/util';
import { bip39ToSeed, isReady } from '@polkadot/wasm-crypto';
import { isWasmOnly } from '../helpers';
import { mnemonicToSeedSync } from './bip39';
import { mnemonicValidate } from './validate';
@@ -29,13 +28,9 @@ export function mnemonicToLegacySeed (mnemonic: string, password = '', onlyJs?:
assert(mnemonicValidate(mnemonic), 'Invalid bip39 mnemonic specified');
assert([32, 64].includes(byteLength), () => `Invalid seed length ${byteLength}, expected 32 or 64`);
if (byteLength === 32) {
return isWasmOnly(onlyJs)
return byteLength === 32
? !hasBigInt || (!onlyJs && isReady())
? bip39ToSeed(mnemonic, password)
: mnemonicToSeedSync(mnemonic, password).subarray(0, 32);
} else if (byteLength === 64) {
return mnemonicToSeedSync(mnemonic, password);
}
return new Uint8Array();
: mnemonicToSeedSync(mnemonic, password).subarray(0, 32)
: mnemonicToSeedSync(mnemonic, password);
}
@@ -3,7 +3,7 @@
import { u8aEq, u8aToHex } from '@polkadot/util';
import tests from '../schnorrkel/keypair/testing';
import tests from '../sr25519/pair/testing.spec';
import { cryptoWaitReady } from '..';
import { mnemonicToMiniSecret } from './toMiniSecret';
@@ -2,9 +2,8 @@
// SPDX-License-Identifier: Apache-2.0
import { assert, stringToU8a } from '@polkadot/util';
import { bip39ToMiniSecret } from '@polkadot/wasm-crypto';
import { bip39ToMiniSecret, isReady } from '@polkadot/wasm-crypto';
import { isWasmOnly } from '../helpers';
import { pbkdf2Encode } from '../pbkdf2';
import { mnemonicToEntropy } from './toEntropy';
import { mnemonicValidate } from './validate';
@@ -12,7 +11,7 @@ import { mnemonicValidate } from './validate';
export function mnemonicToMiniSecret (mnemonic: string, password = '', onlyJs?: boolean): Uint8Array {
assert(mnemonicValidate(mnemonic), 'Invalid bip39 mnemonic specified');
if (isWasmOnly(onlyJs)) {
if (!onlyJs && isReady()) {
return bip39ToMiniSecret(mnemonic, password);
}
@@ -3,7 +3,7 @@
import { arrayRange, u8aEq } from '@polkadot/util';
import { cryptoWaitReady, mnemonicGenerate, mnemonicToMiniSecret, naclKeypairFromSeed, schnorrkelKeypairFromSeed } from '..';
import { cryptoWaitReady, ed25519PairFromSeed, mnemonicGenerate, mnemonicToMiniSecret, sr25519PairFromSeed } from '..';
// NOTE: This basically controls how long stuff runs for, YMMV
//
@@ -29,8 +29,8 @@ describe.each([true, false])('mnemonicToMiniSecret (compare), onlyJsMnemonic=%p'
// do iterations to check and re-check that all matches
it.concurrent.each(arrayRange(NUM_CHECKS))('check=%p', (count): void => {
const minisecret = mnemonicToMiniSecret(mnemonic, count ? `${count}` : '', onlyJsMnemonic);
const edpub = naclKeypairFromSeed(minisecret).publicKey;
const srpub = schnorrkelKeypairFromSeed(minisecret).publicKey;
const edpub = ed25519PairFromSeed(minisecret).publicKey;
const srpub = sr25519PairFromSeed(minisecret).publicKey;
const testmini = mnemonicToMiniSecret(mnemonic, count ? `${count}` : '', onlyJsMini);
@@ -41,13 +41,13 @@ describe.each([true, false])('mnemonicToMiniSecret (compare), onlyJsMnemonic=%p'
// compare the sr25519 keypair generated
expect(
u8aEq(srpub, schnorrkelKeypairFromSeed(testmini).publicKey)
u8aEq(srpub, sr25519PairFromSeed(testmini).publicKey)
).toEqual(true);
// compare ed both in WASM and JS
[true, false].forEach((onlyJsEd): void => {
expect(
u8aEq(edpub, naclKeypairFromSeed(testmini, onlyJsEd).publicKey)
u8aEq(edpub, ed25519PairFromSeed(testmini, onlyJsEd).publicKey)
).toEqual(true);
});
});
@@ -1,9 +1,9 @@
// Copyright 2017-2021 @polkadot/util-crypto authors & contributors
// SPDX-License-Identifier: Apache-2.0
import { bip39Validate } from '@polkadot/wasm-crypto';
import { hasBigInt } from '@polkadot/util';
import { bip39Validate, isReady } from '@polkadot/wasm-crypto';
import { isWasmOnly } from '../helpers';
import { validateMnemonic } from './bip39';
/**
@@ -20,7 +20,7 @@ import { validateMnemonic } from './bip39';
* ```
*/
export function mnemonicValidate (mnemonic: string, onlyJs?: boolean): boolean {
return isWasmOnly(onlyJs)
return !hasBigInt || (!onlyJs && isReady())
? bip39Validate(mnemonic)
: validateMnemonic(mnemonic);
}
@@ -1,9 +1,9 @@
// Copyright 2017-2021 @polkadot/util-crypto authors & contributors
// SPDX-License-Identifier: Apache-2.0
import { naclBoxKeypairFromSecret } from '..';
import { naclBoxPairFromSecret } from '..';
describe('naclBoxKeypairFromSecret', (): void => {
describe('naclBoxPairFromSecret', (): void => {
const secretKey = new Uint8Array([
18, 52, 86, 120, 144, 18, 52, 86,
120, 144, 18, 52, 86, 120, 144, 18,
@@ -13,7 +13,7 @@ describe('naclBoxKeypairFromSecret', (): void => {
it('generates a valid publicKey/secretKey pair', (): void => {
expect(
naclBoxKeypairFromSecret(secretKey)
naclBoxPairFromSecret(secretKey)
).toEqual({
publicKey: new Uint8Array([
206, 110, 228, 222, 155, 43, 229, 254,
@@ -6,7 +6,7 @@ import type { Keypair } from '../../types';
import nacl from 'tweetnacl';
/**
* @name naclBoxKeypairFromSecret
* @name naclBoxPairFromSecret
* @summary Creates a new public/secret box keypair from a secret.
* @description
* Returns a object containing a box `publicKey` & `secretKey` generated from the supplied secret.
@@ -14,11 +14,11 @@ import nacl from 'tweetnacl';
* <BR>
*
* ```javascript
* import { naclBoxKeypairFromSecret } from '@polkadot/util-crypto';
* import { naclBoxPairFromSecret } from '@polkadot/util-crypto';
*
* naclBoxKeypairFromSecret(...); // => { secretKey: [...], publicKey: [...] }
* naclBoxPairFromSecret(...); // => { secretKey: [...], publicKey: [...] }
* ```
*/
export function naclBoxKeypairFromSecret (secret: Uint8Array): Keypair {
export function naclBoxPairFromSecret (secret: Uint8Array): Keypair {
return nacl.box.keyPair.fromSecretKey(secret.slice(0, 32));
}
+2 -9
View File
@@ -2,17 +2,10 @@
// SPDX-License-Identifier: Apache-2.0
/**
* @summary Implements [NaCl](http://nacl.cr.yp.to/) secret-key authenticated encryption, public-key authenticated encryption, hashing, and public-key signatures
* @summary Implements [NaCl](http://nacl.cr.yp.to/) secret-key authenticated encryption, public-key authenticated encryption
*/
export { naclDecrypt } from './decrypt';
export { naclEncrypt } from './encrypt';
export { naclKeypairFromRandom } from './keypair/fromRandom';
export { naclKeypairFromSecret } from './keypair/fromSecret';
export { naclKeypairFromSeed } from './keypair/fromSeed';
export { naclKeypairFromString } from './keypair/fromString';
export { naclSign } from './sign';
export { naclVerify } from './verify';
export { naclBoxKeypairFromSecret } from './box/fromSecret';
export { naclBoxPairFromSecret } from './box/fromSecret';
export { naclOpen } from './open';
export { naclSeal } from './seal';
export { convertSecretKeyToCurve25519, convertPublicKeyToCurve25519 } from './convertKey';
+14 -13
View File
@@ -1,17 +1,18 @@
// Copyright 2017-2021 @polkadot/util-crypto authors & contributors
// SPDX-License-Identifier: Apache-2.0
import { ed25519PairFromString } from '../ed25519';
import { keyExtractPath } from '../key';
import { keyFromPath } from '../key/fromPath';
import { naclBoxKeypairFromSecret, naclKeypairFromString, naclOpen, naclSeal } from '.';
import { naclBoxPairFromSecret, naclOpen, naclSeal } from '.';
describe('naclOpen', (): void => {
it('opens a sealed message by the sender', (): void => {
const message = new Uint8Array([1, 2, 3, 4, 5, 4, 3, 2, 1]);
const sender = naclKeypairFromString('sender');
const receiver = naclKeypairFromString('receiver');
const senderBox = naclBoxKeypairFromSecret(sender.secretKey);
const receiverBox = naclBoxKeypairFromSecret(receiver.secretKey);
const sender = ed25519PairFromString('sender');
const receiver = ed25519PairFromString('receiver');
const senderBox = naclBoxPairFromSecret(sender.secretKey);
const receiverBox = naclBoxPairFromSecret(receiver.secretKey);
const { nonce, sealed } = naclSeal(message, senderBox.secretKey, receiverBox.publicKey);
expect(
@@ -22,20 +23,20 @@ describe('naclOpen', (): void => {
});
it('polkadot does double ratchet', () => {
const sender = naclKeypairFromString('sender');
const receiver = naclKeypairFromString('receiver');
const sender = ed25519PairFromString('sender');
const receiver = ed25519PairFromString('receiver');
// Make id key for identifying each other
const senderIdKey = keyFromPath(sender, keyExtractPath('//1//1//1//1').path, 'ed25519');
const receiverIdKey = keyFromPath(receiver, keyExtractPath('//2//2//2//2').path, 'ed25519');
// Receiver sends encrypting public key to receive message to decrypt with his private key
const receiverIdBoxKey = naclBoxKeypairFromSecret(receiverIdKey.secretKey);
const receiverIdBoxKey = naclBoxPairFromSecret(receiverIdKey.secretKey);
// console.log(`Receiver sends receiver's public key to sender ${receiverIdBoxKey.publicKey.toString()}`);
// Sender encrypts message to send with the public key the receiver sent and send it to receiver
const senderIdBoxKey = naclBoxKeypairFromSecret(senderIdKey.secretKey);
const senderIdBoxKey = naclBoxPairFromSecret(senderIdKey.secretKey);
const message = new Uint8Array([1, 2, 3, 4, 5, 4, 3, 2, 1]);
const { nonce, sealed } = naclSeal(message, senderIdBoxKey.secretKey, receiverIdBoxKey.publicKey);
@@ -51,12 +52,12 @@ describe('naclOpen', (): void => {
const receiverIdKey2 = keyFromPath(receiver, keyExtractPath('//2//2//2//3').path, 'ed25519');
// Receiver sends encrypting public key to receive message to decrypt with his private key
const receiverIdBoxKey2 = naclBoxKeypairFromSecret(receiverIdKey2.secretKey);
const receiverIdBoxKey2 = naclBoxPairFromSecret(receiverIdKey2.secretKey);
// console.log(`Receiver sends receiver's public key to sender ${receiverIdBoxKey2.publicKey.toString()}`);
// Sender encrypts message to send with the public key the receiver sent and send it to receiver
const senderIdBoxKey2 = naclBoxKeypairFromSecret(senderIdKey2.secretKey);
const senderIdBoxKey2 = naclBoxPairFromSecret(senderIdKey2.secretKey);
const message2 = new Uint8Array([1, 2, 3, 4, 5, 4, 3, 2, 1]);
let ctx = naclSeal(message2, senderIdBoxKey2.secretKey, receiverIdBoxKey2.publicKey);
const sealed2 = ctx.sealed;
@@ -70,12 +71,12 @@ describe('naclOpen', (): void => {
// This time derive key for each message to send and receive
// Receiver sends encrypting public key to receive message to decrypt with his private key
const receiverIdBoxKey2One = naclBoxKeypairFromSecret(receiverIdBoxKey2.secretKey);
const receiverIdBoxKey2One = naclBoxPairFromSecret(receiverIdBoxKey2.secretKey);
// console.log(`Receiver sends receiver's public key to sender ${receiverIdBoxKey2One.publicKey.toString()}`);
// Sender encrypts message to send with the public key the receiver sent and send it to receiver
const senderIdBoxKey2One = naclBoxKeypairFromSecret(senderIdBoxKey2.secretKey);
const senderIdBoxKey2One = naclBoxPairFromSecret(senderIdBoxKey2.secretKey);
const message3 = new Uint8Array([1, 2, 3, 4, 5, 4, 3, 2, 1]);
ctx = naclSeal(message3, senderIdBoxKey2One.secretKey, receiverIdBoxKey2One.publicKey);
+6 -5
View File
@@ -1,15 +1,16 @@
// Copyright 2017-2021 @polkadot/util-crypto authors & contributors
// SPDX-License-Identifier: Apache-2.0
import { naclBoxKeypairFromSecret, naclKeypairFromString, naclSeal } from '.';
import { ed25519PairFromString } from '../ed25519';
import { naclBoxPairFromSecret, naclSeal } from '.';
describe('naclSeal', (): void => {
it('seals a message', (): void => {
const message = new Uint8Array([1, 2, 3, 4, 5, 4, 3, 2, 1]);
const sender = naclKeypairFromString('sender');
const receiver = naclKeypairFromString('receiver');
const senderBox = naclBoxKeypairFromSecret(sender.secretKey);
const receiverBox = naclBoxKeypairFromSecret(receiver.secretKey);
const sender = ed25519PairFromString('sender');
const receiver = ed25519PairFromString('receiver');
const senderBox = naclBoxPairFromSecret(sender.secretKey);
const receiverBox = naclBoxPairFromSecret(receiver.secretKey);
const senderBoxSecret = senderBox.secretKey;
const receiverBoxPublic = receiverBox.publicKey;
+1 -1
View File
@@ -3,4 +3,4 @@
// Auto-generated by @polkadot/dev, do not edit
export const packageInfo = { name: '@polkadot/util-crypto', version: '7.9.2' };
export const packageInfo = { name: '@polkadot/util-crypto', version: '8.2.2' };
@@ -5,6 +5,7 @@ import { u8aEq, u8aToHex } from '@polkadot/util';
import { waitReady } from '@polkadot/wasm-crypto';
import { randomAsU8a } from '../random/asU8a';
import { performanceWasm } from '../test/performance';
import { pbkdf2Encode } from '.';
const KNOWN_SALT = new Uint8Array([
@@ -40,4 +41,8 @@ describe('pbkdf2Encode', (): void => {
);
});
});
performanceWasm('pbkdf2Encode', 8, (input, onlyJs) =>
pbkdf2Encode(input, input, undefined, onlyJs)
);
});
+7 -6
View File
@@ -3,12 +3,13 @@
import type { HexString } from '@polkadot/util/types';
import { u8aToU8a } from '@polkadot/util';
import { pbkdf2 } from '@polkadot/wasm-crypto';
import { pbkdf2 as pbkdf2Js } from '@noble/hashes/lib/pbkdf2';
import { sha512 } from '@noble/hashes/lib/sha512';
import { hasBigInt, u8aToU8a } from '@polkadot/util';
import { isReady, pbkdf2 } from '@polkadot/wasm-crypto';
import { isWasmOnly } from '../helpers';
import { randomAsU8a } from '../random/asU8a';
import { pbkdf2Sync } from './pbkdf2';
interface Result {
password: Uint8Array;
@@ -21,9 +22,9 @@ export function pbkdf2Encode (passphrase?: HexString | Buffer | Uint8Array | str
const u8aSalt = u8aToU8a(salt);
return {
password: isWasmOnly(onlyJs)
password: !hasBigInt || (!onlyJs && isReady())
? pbkdf2(u8aPass, u8aSalt, rounds)
: pbkdf2Sync(u8aPass, u8aSalt, rounds),
: pbkdf2Js(sha512, u8aPass, u8aSalt, { c: rounds, dkLen: 64 }),
rounds,
salt
};
-38
View File
@@ -1,38 +0,0 @@
// Copyright 2017-2021 @polkadot/util-crypto authors & contributors
// SPDX-License-Identifier: Apache-2.0
// Adapted from https://gist.github.com/calvinmetcalf/91e8e84dc63c75f2aa53
import { bnToU8a, u8aConcat } from '@polkadot/util';
import { BN_BE_32_OPTS } from '../bn';
import { hmacShaAsU8a } from '../hmac';
export function pbkdf2Sync (password: Uint8Array, salt: Uint8Array, rounds: number, len = 64): Uint8Array {
let out = new Uint8Array();
let num = 0;
const block = u8aConcat(salt, new Uint8Array(4));
while (out.length < len) {
num++;
block.set(bnToU8a(num, BN_BE_32_OPTS), salt.length);
let prev = hmacShaAsU8a(password, block, 512);
const md = prev;
let i = 0;
while (++i < rounds) {
prev = hmacShaAsU8a(password, prev, 512);
let j = -1;
while (++j < prev.length) {
md[j] ^= prev[j];
}
}
out = u8aConcat(out, md);
}
return out.slice(0, len);
}
@@ -1,12 +0,0 @@
// Copyright 2017-2021 @polkadot/util-crypto authors & contributors
// SPDX-License-Identifier: Apache-2.0
export { schnorrkelAgreement } from './agreement';
export { schnorrkelDeriveHard } from './deriveHard';
export { schnorrkelDerivePublic } from './derivePublic';
export { schnorrkelDeriveSoft } from './deriveSoft';
export { schnorrkelKeypairFromSeed } from './keypair/fromSeed';
export { schnorrkelSign } from './sign';
export { schnorrkelVerify } from './verify';
export { schnorrkelVrfSign } from './vrfSign';
export { schnorrkelVrfVerify } from './vrfVerify';
@@ -3,7 +3,7 @@
import { waitReady } from '@polkadot/wasm-crypto';
import { performanceTest } from '../../test/performance';
import { performanceWasm } from '../test/performance';
import { DEFAULT_PARAMS } from './defaults';
import { scryptEncode } from '.';
@@ -30,7 +30,7 @@ describe('scryptEncode', (): void => {
});
});
performanceTest('scryptEncode', 2, (input, onlyJs) =>
performanceWasm('scryptEncode', 4, (input, onlyJs) =>
scryptEncode(input, input, undefined, onlyJs)
);
});
+10 -11
View File
@@ -4,12 +4,11 @@
import type { HexString } from '@polkadot/util/types';
import type { Params } from './types';
import scryptsy from 'scryptsy';
import { scrypt as scryptJs } from '@noble/hashes/lib/scrypt';
import { bufferToU8a, u8aToBuffer, u8aToU8a } from '@polkadot/util';
import { scrypt } from '@polkadot/wasm-crypto';
import { hasBigInt, objectSpread, u8aToU8a } from '@polkadot/util';
import { isReady, scrypt } from '@polkadot/wasm-crypto';
import { isWasmOnly } from '../helpers';
import { randomAsU8a } from '../random/asU8a';
import { DEFAULT_PARAMS } from './defaults';
@@ -22,11 +21,11 @@ interface Result {
export function scryptEncode (passphrase?: HexString | Uint8Array | string, salt = randomAsU8a(), params = DEFAULT_PARAMS, onlyJs?: boolean): Result {
const u8a = u8aToU8a(passphrase);
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)
);
return { params, password, salt };
return {
params,
password: !hasBigInt || (!onlyJs && isReady())
? scrypt(u8a, salt, Math.log2(params.N), params.r, params.p)
: scryptJs(u8a, salt, objectSpread({ dkLen: 64 }, params)),
salt
};
}
@@ -2,17 +2,43 @@
// SPDX-License-Identifier: Apache-2.0
import { hexToU8a } from '@polkadot/util';
import { waitReady } from '@polkadot/wasm-crypto';
import { secp256k1Compress } from './';
import { performanceWasm } from '../test/performance';
import { secp256k1Compress } from '.';
describe('secp256k1Compress', (): void => {
it('compresses a known key', (): void => {
expect(
secp256k1Compress(
hexToU8a('0x04b9dc646dd71118e5f7fda681ad9eca36eb3ee96f344f582fbe7b5bcdebb1307763fe926c273235fd979a134076d00fd1683cbd35868cb485d4a3a640e52184af')
)
).toEqual(
hexToU8a('0x03b9dc646dd71118e5f7fda681ad9eca36eb3ee96f344f582fbe7b5bcdebb13077')
);
beforeEach(async (): Promise<void> => {
await waitReady();
});
describe.each([false, true])('onlyJs=%p', (onlyJs): void => {
it('returns a compressed key as-is', (): void => {
expect(
secp256k1Compress(
hexToU8a('0x03b9dc646dd71118e5f7fda681ad9eca36eb3ee96f344f582fbe7b5bcdebb13077'),
onlyJs
)
).toEqual(
hexToU8a('0x03b9dc646dd71118e5f7fda681ad9eca36eb3ee96f344f582fbe7b5bcdebb13077')
);
});
it('compresses a known key', (): void => {
expect(
secp256k1Compress(
hexToU8a('0x04b9dc646dd71118e5f7fda681ad9eca36eb3ee96f344f582fbe7b5bcdebb1307763fe926c273235fd979a134076d00fd1683cbd35868cb485d4a3a640e52184af'),
onlyJs
)
).toEqual(
hexToU8a('0x03b9dc646dd71118e5f7fda681ad9eca36eb3ee96f344f582fbe7b5bcdebb13077')
);
});
});
performanceWasm('secp256k1Compress', 100000, (input, onlyJs) => secp256k1Compress(input, onlyJs),
[[
hexToU8a('0x04b9dc646dd71118e5f7fda681ad9eca36eb3ee96f344f582fbe7b5bcdebb1307763fe926c273235fd979a134076d00fd1683cbd35868cb485d4a3a640e52184af')
]]
);
});
+12 -10
View File
@@ -1,17 +1,19 @@
// Copyright 2017-2021 @polkadot/util-crypto authors & contributors
// SPDX-License-Identifier: Apache-2.0
import { assert } from '@polkadot/util';
import { Point } from '@noble/secp256k1';
import { secp256k1 } from './secp256k1';
import { assert, hasBigInt } from '@polkadot/util';
import { isReady, secp256k1Compress as wasm } from '@polkadot/wasm-crypto';
export function secp256k1Compress (publicKey: Uint8Array): Uint8Array {
assert([33, 65].includes(publicKey.length), 'Invalid publicKey provided');
export function secp256k1Compress (publicKey: Uint8Array, onlyJs?: boolean): Uint8Array {
if (publicKey.length === 33) {
return publicKey;
}
return new Uint8Array(
secp256k1
.keyFromPublic(publicKey)
.getPublic()
.encodeCompressed()
);
assert(publicKey.length === 65, 'Invalid publicKey provided');
return !hasBigInt || (!onlyJs && isReady())
? wasm(publicKey)
: Point.fromHex(publicKey).toRawBytes(true);
}
@@ -2,27 +2,43 @@
// SPDX-License-Identifier: Apache-2.0
import { hexToU8a } from '@polkadot/util';
import { waitReady } from '@polkadot/wasm-crypto';
import { secp256k1Expand } from './';
import { performanceWasm } from '../test/performance';
import { secp256k1Expand } from '.';
describe('secp256k1Expand', (): void => {
it('expands a known key', (): void => {
expect(
secp256k1Expand(
hexToU8a('0x03b9dc646dd71118e5f7fda681ad9eca36eb3ee96f344f582fbe7b5bcdebb13077')
)
).toEqual(
hexToU8a('0xb9dc646dd71118e5f7fda681ad9eca36eb3ee96f344f582fbe7b5bcdebb1307763fe926c273235fd979a134076d00fd1683cbd35868cb485d4a3a640e52184af')
);
beforeEach(async (): Promise<void> => {
await waitReady();
});
it('expands a known full key', (): void => {
expect(
secp256k1Expand(
hexToU8a('0x04b9dc646dd71118e5f7fda681ad9eca36eb3ee96f344f582fbe7b5bcdebb1307763fe926c273235fd979a134076d00fd1683cbd35868cb485d4a3a640e52184af')
)
).toEqual(
hexToU8a('0xb9dc646dd71118e5f7fda681ad9eca36eb3ee96f344f582fbe7b5bcdebb1307763fe926c273235fd979a134076d00fd1683cbd35868cb485d4a3a640e52184af')
);
describe.each([false, true])('onlyJs=%p', (onlyJs): void => {
it('expands a known key', (): void => {
expect(
secp256k1Expand(
hexToU8a('0x03b9dc646dd71118e5f7fda681ad9eca36eb3ee96f344f582fbe7b5bcdebb13077'),
onlyJs
)
).toEqual(
hexToU8a('0xb9dc646dd71118e5f7fda681ad9eca36eb3ee96f344f582fbe7b5bcdebb1307763fe926c273235fd979a134076d00fd1683cbd35868cb485d4a3a640e52184af')
);
});
it('expands a known full key', (): void => {
expect(
secp256k1Expand(
hexToU8a('0x04b9dc646dd71118e5f7fda681ad9eca36eb3ee96f344f582fbe7b5bcdebb1307763fe926c273235fd979a134076d00fd1683cbd35868cb485d4a3a640e52184af'),
onlyJs
)
).toEqual(
hexToU8a('0xb9dc646dd71118e5f7fda681ad9eca36eb3ee96f344f582fbe7b5bcdebb1307763fe926c273235fd979a134076d00fd1683cbd35868cb485d4a3a640e52184af')
);
});
});
performanceWasm('secp256k1Expand', 2000, (input, onlyJs) => secp256k1Expand(input, onlyJs),
[[
hexToU8a('0x03b9dc646dd71118e5f7fda681ad9eca36eb3ee96f344f582fbe7b5bcdebb13077')
]]
);
});

Some files were not shown because too many files have changed in this diff Show More