diff --git a/CHANGELOG.md b/CHANGELOG.md index ef558d6..540cb71 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ ## 0.4.1 ~ 0.4.6 +- Revamp util functions - Drop Node 16 support - Support curve25519 (x25519 and ed25519) tentatively - Revamp browser compatibility diff --git a/package.json b/package.json index b75af6f..9896682 100644 --- a/package.json +++ b/package.json @@ -40,14 +40,14 @@ "@noble/hashes": "^1.3.2" }, "devDependencies": { - "@types/jest": "^29.5.8", - "@types/node": "^20.9.0", + "@types/jest": "^29.5.10", + "@types/node": "^20.9.4", "@types/node-fetch": "^2.6.9", "https-proxy-agent": "^7.0.2", "jest": "^29.7.0", "node-fetch": "^2.7.0", "ts-jest": "^29.1.1", "ts-node": "^10.9.1", - "typescript": "^5.2.2" + "typescript": "^5.3.2" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8f6d5d5..58e6637 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -17,11 +17,11 @@ dependencies: devDependencies: '@types/jest': - specifier: ^29.5.8 - version: 29.5.8 + specifier: ^29.5.10 + version: 29.5.10 '@types/node': - specifier: ^20.9.0 - version: 20.9.0 + specifier: ^20.9.4 + version: 20.9.4 '@types/node-fetch': specifier: ^2.6.9 version: 2.6.9 @@ -30,19 +30,19 @@ devDependencies: version: 7.0.2 jest: specifier: ^29.7.0 - version: 29.7.0(@types/node@20.9.0)(ts-node@10.9.1) + version: 29.7.0(@types/node@20.9.4)(ts-node@10.9.1) node-fetch: specifier: ^2.7.0 version: 2.7.0 ts-jest: specifier: ^29.1.1 - version: 29.1.1(@babel/core@7.23.3)(jest@29.7.0)(typescript@5.2.2) + version: 29.1.1(@babel/core@7.23.3)(jest@29.7.0)(typescript@5.3.2) ts-node: specifier: ^10.9.1 - version: 10.9.1(@types/node@20.9.0)(typescript@5.2.2) + version: 10.9.1(@types/node@20.9.4)(typescript@5.3.2) typescript: - specifier: ^5.2.2 - version: 5.2.2 + specifier: ^5.3.2 + version: 5.3.2 packages: @@ -54,11 +54,11 @@ packages: '@jridgewell/trace-mapping': 0.3.20 dev: true - /@babel/code-frame@7.22.13: - resolution: {integrity: sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==} + /@babel/code-frame@7.23.4: + resolution: {integrity: sha512-r1IONyb6Ia+jYR2vvIDhdWdlTGhqbBoFqLTQidzZ4kepUFH15ejXvFHxCVbtl7BOXIudsIubf4E81xeA3h3IXA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/highlight': 7.22.20 + '@babel/highlight': 7.23.4 chalk: 2.4.2 dev: true @@ -72,15 +72,15 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@ampproject/remapping': 2.2.1 - '@babel/code-frame': 7.22.13 - '@babel/generator': 7.23.3 + '@babel/code-frame': 7.23.4 + '@babel/generator': 7.23.4 '@babel/helper-compilation-targets': 7.22.15 '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.3) - '@babel/helpers': 7.23.2 - '@babel/parser': 7.23.3 + '@babel/helpers': 7.23.4 + '@babel/parser': 7.23.4 '@babel/template': 7.22.15 - '@babel/traverse': 7.23.3 - '@babel/types': 7.23.3 + '@babel/traverse': 7.23.4 + '@babel/types': 7.23.4 convert-source-map: 2.0.0 debug: 4.3.4 gensync: 1.0.0-beta.2 @@ -90,11 +90,11 @@ packages: - supports-color dev: true - /@babel/generator@7.23.3: - resolution: {integrity: sha512-keeZWAV4LU3tW0qRi19HRpabC/ilM0HRBBzf9/k8FFiG4KVpiv0FIy4hHfLfFQZNhziCTPTmd59zoyv6DNISzg==} + /@babel/generator@7.23.4: + resolution: {integrity: sha512-esuS49Cga3HcThFNebGhlgsrVLkvhqvYDTzgjfFFlHJcIfLe5jFmRRfCQ1KuBfc4Jrtn3ndLgKWAKjBE+IraYQ==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.23.3 + '@babel/types': 7.23.4 '@jridgewell/gen-mapping': 0.3.3 '@jridgewell/trace-mapping': 0.3.20 jsesc: 2.5.2 @@ -121,21 +121,21 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/template': 7.22.15 - '@babel/types': 7.23.3 + '@babel/types': 7.23.4 dev: true /@babel/helper-hoist-variables@7.22.5: resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.23.3 + '@babel/types': 7.23.4 dev: true /@babel/helper-module-imports@7.22.15: resolution: {integrity: sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.23.3 + '@babel/types': 7.23.4 dev: true /@babel/helper-module-transforms@7.23.3(@babel/core@7.23.3): @@ -161,18 +161,18 @@ packages: resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.23.3 + '@babel/types': 7.23.4 dev: true /@babel/helper-split-export-declaration@7.22.6: resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.23.3 + '@babel/types': 7.23.4 dev: true - /@babel/helper-string-parser@7.22.5: - resolution: {integrity: sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==} + /@babel/helper-string-parser@7.23.4: + resolution: {integrity: sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==} engines: {node: '>=6.9.0'} dev: true @@ -186,19 +186,19 @@ packages: engines: {node: '>=6.9.0'} dev: true - /@babel/helpers@7.23.2: - resolution: {integrity: sha512-lzchcp8SjTSVe/fPmLwtWVBFC7+Tbn8LGHDVfDp9JGxpAY5opSaEFgt8UQvrnECWOTdji2mOWMz1rOhkHscmGQ==} + /@babel/helpers@7.23.4: + resolution: {integrity: sha512-HfcMizYz10cr3h29VqyfGL6ZWIjTwWfvYBMsBVGwpcbhNGe3wQ1ZXZRPzZoAHhd9OqHadHqjQ89iVKINXnbzuw==} engines: {node: '>=6.9.0'} dependencies: '@babel/template': 7.22.15 - '@babel/traverse': 7.23.3 - '@babel/types': 7.23.3 + '@babel/traverse': 7.23.4 + '@babel/types': 7.23.4 transitivePeerDependencies: - supports-color dev: true - /@babel/highlight@7.22.20: - resolution: {integrity: sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==} + /@babel/highlight@7.23.4: + resolution: {integrity: sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==} engines: {node: '>=6.9.0'} dependencies: '@babel/helper-validator-identifier': 7.22.20 @@ -206,12 +206,12 @@ packages: js-tokens: 4.0.0 dev: true - /@babel/parser@7.23.3: - resolution: {integrity: sha512-uVsWNvlVsIninV2prNz/3lHCb+5CJ+e+IUBfbjToAHODtfGYLfCFuY4AU7TskI+dAKk+njsPiBjq1gKTvZOBaw==} + /@babel/parser@7.23.4: + resolution: {integrity: sha512-vf3Xna6UEprW+7t6EtOmFpHNAuxw3xqPZghy+brsnusscJRW5BMUzzHZc5ICjULee81WeUV2jjakG09MDglJXQ==} engines: {node: '>=6.0.0'} hasBin: true dependencies: - '@babel/types': 7.23.3 + '@babel/types': 7.23.4 dev: true /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.23.3): @@ -347,34 +347,34 @@ packages: resolution: {integrity: sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==} engines: {node: '>=6.9.0'} dependencies: - '@babel/code-frame': 7.22.13 - '@babel/parser': 7.23.3 - '@babel/types': 7.23.3 + '@babel/code-frame': 7.23.4 + '@babel/parser': 7.23.4 + '@babel/types': 7.23.4 dev: true - /@babel/traverse@7.23.3: - resolution: {integrity: sha512-+K0yF1/9yR0oHdE0StHuEj3uTPzwwbrLGfNOndVJVV2TqA5+j3oljJUb4nmB954FLGjNem976+B+eDuLIjesiQ==} + /@babel/traverse@7.23.4: + resolution: {integrity: sha512-IYM8wSUwunWTB6tFC2dkKZhxbIjHoWemdK+3f8/wq8aKhbUscxD5MX72ubd90fxvFknaLPeGw5ycU84V1obHJg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/code-frame': 7.22.13 - '@babel/generator': 7.23.3 + '@babel/code-frame': 7.23.4 + '@babel/generator': 7.23.4 '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-function-name': 7.23.0 '@babel/helper-hoist-variables': 7.22.5 '@babel/helper-split-export-declaration': 7.22.6 - '@babel/parser': 7.23.3 - '@babel/types': 7.23.3 + '@babel/parser': 7.23.4 + '@babel/types': 7.23.4 debug: 4.3.4 globals: 11.12.0 transitivePeerDependencies: - supports-color dev: true - /@babel/types@7.23.3: - resolution: {integrity: sha512-OZnvoH2l8PK5eUvEcUyCt/sXgr/h+UWpVuBbOljwcrAgUl6lpchoQ++PHGyQy1AtYnVA6CEq3y5xeEI10brpXw==} + /@babel/types@7.23.4: + resolution: {integrity: sha512-7uIFwVYpoplT5jp/kVv6EF93VaJ8H+Yn5IczYiaAi98ajzjfoZfslet/e0sLh+wVBjb2qqIut1b0S26VSafsSQ==} engines: {node: '>=6.9.0'} dependencies: - '@babel/helper-string-parser': 7.22.5 + '@babel/helper-string-parser': 7.23.4 '@babel/helper-validator-identifier': 7.22.20 to-fast-properties: 2.0.0 dev: true @@ -411,7 +411,7 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.6.3 - '@types/node': 20.9.0 + '@types/node': 20.9.4 chalk: 4.1.2 jest-message-util: 29.7.0 jest-util: 29.7.0 @@ -432,14 +432,14 @@ packages: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.9.0 + '@types/node': 20.9.4 ansi-escapes: 4.3.2 chalk: 4.1.2 ci-info: 3.9.0 exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 29.7.0 - jest-config: 29.7.0(@types/node@20.9.0)(ts-node@10.9.1) + jest-config: 29.7.0(@types/node@20.9.4)(ts-node@10.9.1) jest-haste-map: 29.7.0 jest-message-util: 29.7.0 jest-regex-util: 29.6.3 @@ -467,7 +467,7 @@ packages: dependencies: '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.9.0 + '@types/node': 20.9.4 jest-mock: 29.7.0 dev: true @@ -494,7 +494,7 @@ packages: dependencies: '@jest/types': 29.6.3 '@sinonjs/fake-timers': 10.3.0 - '@types/node': 20.9.0 + '@types/node': 20.9.4 jest-message-util: 29.7.0 jest-mock: 29.7.0 jest-util: 29.7.0 @@ -527,7 +527,7 @@ packages: '@jest/transform': 29.7.0 '@jest/types': 29.6.3 '@jridgewell/trace-mapping': 0.3.20 - '@types/node': 20.9.0 + '@types/node': 20.9.4 chalk: 4.1.2 collect-v8-coverage: 1.0.2 exit: 0.1.2 @@ -544,7 +544,7 @@ packages: slash: 3.0.0 string-length: 4.0.2 strip-ansi: 6.0.1 - v8-to-istanbul: 9.1.3 + v8-to-istanbul: 9.2.0 transitivePeerDependencies: - supports-color dev: true @@ -615,8 +615,8 @@ packages: '@jest/schemas': 29.6.3 '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 - '@types/node': 20.9.0 - '@types/yargs': 17.0.31 + '@types/node': 20.9.4 + '@types/yargs': 17.0.32 chalk: 4.1.2 dev: true @@ -704,11 +704,11 @@ packages: resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} dev: true - /@types/babel__core@7.20.4: - resolution: {integrity: sha512-mLnSC22IC4vcWiuObSRjrLd9XcBTGf59vUSoq2jkQDJ/QQ8PMI9rSuzE+aEV8karUMbskw07bKYoUJCKTUaygg==} + /@types/babel__core@7.20.5: + resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} dependencies: - '@babel/parser': 7.23.3 - '@babel/types': 7.23.3 + '@babel/parser': 7.23.4 + '@babel/types': 7.23.4 '@types/babel__generator': 7.6.7 '@types/babel__template': 7.4.4 '@types/babel__traverse': 7.20.4 @@ -717,26 +717,26 @@ packages: /@types/babel__generator@7.6.7: resolution: {integrity: sha512-6Sfsq+EaaLrw4RmdFWE9Onp63TOUue71AWb4Gpa6JxzgTYtimbM086WnYTy2U67AofR++QKCo08ZP6pwx8YFHQ==} dependencies: - '@babel/types': 7.23.3 + '@babel/types': 7.23.4 dev: true /@types/babel__template@7.4.4: resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} dependencies: - '@babel/parser': 7.23.3 - '@babel/types': 7.23.3 + '@babel/parser': 7.23.4 + '@babel/types': 7.23.4 dev: true /@types/babel__traverse@7.20.4: resolution: {integrity: sha512-mSM/iKUk5fDDrEV/e83qY+Cr3I1+Q3qqTuEn++HAWYjEa1+NxZr6CNrcJGf2ZTnq4HoFGC3zaTPZTobCzCFukA==} dependencies: - '@babel/types': 7.23.3 + '@babel/types': 7.23.4 dev: true /@types/graceful-fs@4.1.9: resolution: {integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==} dependencies: - '@types/node': 20.9.0 + '@types/node': 20.9.4 dev: true /@types/istanbul-lib-coverage@2.0.6: @@ -755,8 +755,8 @@ packages: '@types/istanbul-lib-report': 3.0.3 dev: true - /@types/jest@29.5.8: - resolution: {integrity: sha512-fXEFTxMV2Co8ZF5aYFJv+YeA08RTYJfhtN5c9JSv/mFEMe+xxjufCb+PHL+bJcMs/ebPUsBu+UNTEz+ydXrR6g==} + /@types/jest@29.5.10: + resolution: {integrity: sha512-tE4yxKEphEyxj9s4inideLHktW/x6DwesIwWZ9NN1FKf9zbJYsnhBoA9vrHA/IuIOKwPa5PcFBNV4lpMIOEzyQ==} dependencies: expect: 29.7.0 pretty-format: 29.7.0 @@ -765,12 +765,12 @@ packages: /@types/node-fetch@2.6.9: resolution: {integrity: sha512-bQVlnMLFJ2d35DkPNjEPmd9ueO/rh5EiaZt2bhqiSarPjZIuIV6bPQVqcrEyvNo+AfTrRGVazle1tl597w3gfA==} dependencies: - '@types/node': 20.9.0 + '@types/node': 20.9.4 form-data: 4.0.0 dev: true - /@types/node@20.9.0: - resolution: {integrity: sha512-nekiGu2NDb1BcVofVcEKMIwzlx4NjHlcjhoxxKBNLtz15Y1z7MYf549DFvkHSId02Ax6kGwWntIBPC3l/JZcmw==} + /@types/node@20.9.4: + resolution: {integrity: sha512-wmyg8HUhcn6ACjsn8oKYjkN/zUzQeNtMy44weTJSM6p4MMzEOuKbA3OjJ267uPCOW7Xex9dyrNTful8XTQYoDA==} dependencies: undici-types: 5.26.5 dev: true @@ -783,8 +783,8 @@ packages: resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} dev: true - /@types/yargs@17.0.31: - resolution: {integrity: sha512-bocYSx4DI8TmdlvxqGpVNXOgCNR1Jj0gNPhhAY+iz1rgKDAaYrAYdFYnhDV1IFuiuVc9HkOwyDcFxaTElF3/wg==} + /@types/yargs@17.0.32: + resolution: {integrity: sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==} dependencies: '@types/yargs-parser': 21.0.3 dev: true @@ -870,7 +870,7 @@ packages: dependencies: '@babel/core': 7.23.3 '@jest/transform': 29.7.0 - '@types/babel__core': 7.20.4 + '@types/babel__core': 7.20.5 babel-plugin-istanbul: 6.1.1 babel-preset-jest: 29.6.3(@babel/core@7.23.3) chalk: 4.1.2 @@ -898,8 +898,8 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@babel/template': 7.22.15 - '@babel/types': 7.23.3 - '@types/babel__core': 7.20.4 + '@babel/types': 7.23.4 + '@types/babel__core': 7.20.5 '@types/babel__traverse': 7.20.4 dev: true @@ -957,8 +957,8 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true dependencies: - caniuse-lite: 1.0.30001561 - electron-to-chromium: 1.4.582 + caniuse-lite: 1.0.30001564 + electron-to-chromium: 1.4.592 node-releases: 2.0.13 update-browserslist-db: 1.0.13(browserslist@4.22.1) dev: true @@ -995,8 +995,8 @@ packages: engines: {node: '>=10'} dev: true - /caniuse-lite@1.0.30001561: - resolution: {integrity: sha512-NTt0DNoKe958Q0BE0j0c1V9jbUzhBxHIEJy7asmGrpE0yG63KTV7PLHPnK2E1O9RsQrQ081I3NLuXGS6zht3cw==} + /caniuse-lite@1.0.30001564: + resolution: {integrity: sha512-DqAOf+rhof+6GVx1y+xzbFPeOumfQnhYzVnZD6LAXijR77yPtm9mfOcqOnT3mpnJiZVT+kwLAFnRlZcIz+c6bg==} dev: true /chalk@2.4.2: @@ -1084,7 +1084,7 @@ packages: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} dev: true - /create-jest@29.7.0(@types/node@20.9.0)(ts-node@10.9.1): + /create-jest@29.7.0(@types/node@20.9.4)(ts-node@10.9.1): resolution: {integrity: sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true @@ -1093,7 +1093,7 @@ packages: chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.11 - jest-config: 29.7.0(@types/node@20.9.0)(ts-node@10.9.1) + jest-config: 29.7.0(@types/node@20.9.4)(ts-node@10.9.1) jest-util: 29.7.0 prompts: 2.4.2 transitivePeerDependencies: @@ -1162,8 +1162,8 @@ packages: engines: {node: '>=0.3.1'} dev: true - /electron-to-chromium@1.4.582: - resolution: {integrity: sha512-89o0MGoocwYbzqUUjc+VNpeOFSOK9nIdC5wY4N+PVUarUK0MtjyTjks75AZS2bW4Kl8MdewdFsWaH0jLy+JNoA==} + /electron-to-chromium@1.4.592: + resolution: {integrity: sha512-D3NOkROIlF+d5ixnz7pAf3Lu/AuWpd6AYgI9O67GQXMXTcCP1gJQRotOq35eQy5Sb4hez33XH1YdTtILA7Udww==} dev: true /emittery@0.13.1: @@ -1428,7 +1428,7 @@ packages: engines: {node: '>=8'} dependencies: '@babel/core': 7.23.3 - '@babel/parser': 7.23.3 + '@babel/parser': 7.23.4 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.2 semver: 6.3.1 @@ -1441,7 +1441,7 @@ packages: engines: {node: '>=10'} dependencies: '@babel/core': 7.23.3 - '@babel/parser': 7.23.3 + '@babel/parser': 7.23.4 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.2 semver: 7.5.4 @@ -1494,7 +1494,7 @@ packages: '@jest/expect': 29.7.0 '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.9.0 + '@types/node': 20.9.4 chalk: 4.1.2 co: 4.6.0 dedent: 1.5.1 @@ -1515,7 +1515,7 @@ packages: - supports-color dev: true - /jest-cli@29.7.0(@types/node@20.9.0)(ts-node@10.9.1): + /jest-cli@29.7.0(@types/node@20.9.4)(ts-node@10.9.1): resolution: {integrity: sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true @@ -1529,10 +1529,10 @@ packages: '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 chalk: 4.1.2 - create-jest: 29.7.0(@types/node@20.9.0)(ts-node@10.9.1) + create-jest: 29.7.0(@types/node@20.9.4)(ts-node@10.9.1) exit: 0.1.2 import-local: 3.1.0 - jest-config: 29.7.0(@types/node@20.9.0)(ts-node@10.9.1) + jest-config: 29.7.0(@types/node@20.9.4)(ts-node@10.9.1) jest-util: 29.7.0 jest-validate: 29.7.0 yargs: 17.7.2 @@ -1543,7 +1543,7 @@ packages: - ts-node dev: true - /jest-config@29.7.0(@types/node@20.9.0)(ts-node@10.9.1): + /jest-config@29.7.0(@types/node@20.9.4)(ts-node@10.9.1): resolution: {integrity: sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: @@ -1558,7 +1558,7 @@ packages: '@babel/core': 7.23.3 '@jest/test-sequencer': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.9.0 + '@types/node': 20.9.4 babel-jest: 29.7.0(@babel/core@7.23.3) chalk: 4.1.2 ci-info: 3.9.0 @@ -1578,7 +1578,7 @@ packages: pretty-format: 29.7.0 slash: 3.0.0 strip-json-comments: 3.1.1 - ts-node: 10.9.1(@types/node@20.9.0)(typescript@5.2.2) + ts-node: 10.9.1(@types/node@20.9.4)(typescript@5.3.2) transitivePeerDependencies: - babel-plugin-macros - supports-color @@ -1619,7 +1619,7 @@ packages: '@jest/environment': 29.7.0 '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.9.0 + '@types/node': 20.9.4 jest-mock: 29.7.0 jest-util: 29.7.0 dev: true @@ -1635,7 +1635,7 @@ packages: dependencies: '@jest/types': 29.6.3 '@types/graceful-fs': 4.1.9 - '@types/node': 20.9.0 + '@types/node': 20.9.4 anymatch: 3.1.3 fb-watchman: 2.0.2 graceful-fs: 4.2.11 @@ -1670,7 +1670,7 @@ packages: resolution: {integrity: sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@babel/code-frame': 7.22.13 + '@babel/code-frame': 7.23.4 '@jest/types': 29.6.3 '@types/stack-utils': 2.0.3 chalk: 4.1.2 @@ -1686,7 +1686,7 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.6.3 - '@types/node': 20.9.0 + '@types/node': 20.9.4 jest-util: 29.7.0 dev: true @@ -1741,7 +1741,7 @@ packages: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.9.0 + '@types/node': 20.9.4 chalk: 4.1.2 emittery: 0.13.1 graceful-fs: 4.2.11 @@ -1772,7 +1772,7 @@ packages: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.9.0 + '@types/node': 20.9.4 chalk: 4.1.2 cjs-module-lexer: 1.2.3 collect-v8-coverage: 1.0.2 @@ -1796,10 +1796,10 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@babel/core': 7.23.3 - '@babel/generator': 7.23.3 + '@babel/generator': 7.23.4 '@babel/plugin-syntax-jsx': 7.23.3(@babel/core@7.23.3) '@babel/plugin-syntax-typescript': 7.23.3(@babel/core@7.23.3) - '@babel/types': 7.23.3 + '@babel/types': 7.23.4 '@jest/expect-utils': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 @@ -1824,7 +1824,7 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.6.3 - '@types/node': 20.9.0 + '@types/node': 20.9.4 chalk: 4.1.2 ci-info: 3.9.0 graceful-fs: 4.2.11 @@ -1849,7 +1849,7 @@ packages: dependencies: '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.9.0 + '@types/node': 20.9.4 ansi-escapes: 4.3.2 chalk: 4.1.2 emittery: 0.13.1 @@ -1861,13 +1861,13 @@ packages: resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@types/node': 20.9.0 + '@types/node': 20.9.4 jest-util: 29.7.0 merge-stream: 2.0.0 supports-color: 8.1.1 dev: true - /jest@29.7.0(@types/node@20.9.0)(ts-node@10.9.1): + /jest@29.7.0(@types/node@20.9.4)(ts-node@10.9.1): resolution: {integrity: sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true @@ -1880,7 +1880,7 @@ packages: '@jest/core': 29.7.0(ts-node@10.9.1) '@jest/types': 29.6.3 import-local: 3.1.0 - jest-cli: 29.7.0(@types/node@20.9.0)(ts-node@10.9.1) + jest-cli: 29.7.0(@types/node@20.9.4)(ts-node@10.9.1) transitivePeerDependencies: - '@types/node' - babel-plugin-macros @@ -2089,7 +2089,7 @@ packages: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} engines: {node: '>=8'} dependencies: - '@babel/code-frame': 7.22.13 + '@babel/code-frame': 7.23.4 error-ex: 1.3.2 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 @@ -2346,7 +2346,7 @@ packages: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} dev: true - /ts-jest@29.1.1(@babel/core@7.23.3)(jest@29.7.0)(typescript@5.2.2): + /ts-jest@29.1.1(@babel/core@7.23.3)(jest@29.7.0)(typescript@5.3.2): resolution: {integrity: sha512-D6xjnnbP17cC85nliwGiL+tpoKN0StpgE0TeOjXQTU6MVCfsB4v7aW05CgQ/1OywGb0x/oy9hHFnN+sczTiRaA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true @@ -2370,17 +2370,17 @@ packages: '@babel/core': 7.23.3 bs-logger: 0.2.6 fast-json-stable-stringify: 2.1.0 - jest: 29.7.0(@types/node@20.9.0)(ts-node@10.9.1) + jest: 29.7.0(@types/node@20.9.4)(ts-node@10.9.1) jest-util: 29.7.0 json5: 2.2.3 lodash.memoize: 4.1.2 make-error: 1.3.6 semver: 7.5.4 - typescript: 5.2.2 + typescript: 5.3.2 yargs-parser: 21.1.1 dev: true - /ts-node@10.9.1(@types/node@20.9.0)(typescript@5.2.2): + /ts-node@10.9.1(@types/node@20.9.4)(typescript@5.3.2): resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} hasBin: true peerDependencies: @@ -2399,14 +2399,14 @@ packages: '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 20.9.0 + '@types/node': 20.9.4 acorn: 8.11.2 acorn-walk: 8.3.0 arg: 4.1.3 create-require: 1.1.1 diff: 4.0.2 make-error: 1.3.6 - typescript: 5.2.2 + typescript: 5.3.2 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 dev: true @@ -2421,8 +2421,8 @@ packages: engines: {node: '>=10'} dev: true - /typescript@5.2.2: - resolution: {integrity: sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==} + /typescript@5.3.2: + resolution: {integrity: sha512-6l+RyNy7oAHDfxC4FzSJcz9vnjTKxrLpDG5M2Vu4SHRVNg6xzqZp6LYSR9zjqQTu8DU/f5xwxUdADOkbrIX2gQ==} engines: {node: '>=14.17'} hasBin: true dev: true @@ -2446,8 +2446,8 @@ packages: resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} dev: true - /v8-to-istanbul@9.1.3: - resolution: {integrity: sha512-9lDD+EVI2fjFsMWXc6dy5JJzBsVTcQ2fVkfBvncZ6xJWG9wtBhOldG+mHkSL0+V1K/xgZz0JDO5UT5hFwHUghg==} + /v8-to-istanbul@9.2.0: + resolution: {integrity: sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA==} engines: {node: '>=10.12.0'} dependencies: '@jridgewell/trace-mapping': 0.3.20 diff --git a/src/index.ts b/src/index.ts index 884eace..a03c6f8 100644 --- a/src/index.ts +++ b/src/index.ts @@ -2,7 +2,15 @@ import { concatBytes } from "@noble/ciphers/utils"; import { ephemeralKeySize, isEphemeralKeyCompressed } from "./config"; import { PrivateKey, PublicKey } from "./keys"; -import { aesDecrypt, aesEncrypt, decodeHex, getValidSecret, remove0x } from "./utils"; +import { + aesDecrypt, + aesEncrypt, + decodeHex, + getValidSecret, + remove0x, + symDecrypt, + symEncrypt, +} from "./utils"; export function encrypt(receiverRawPK: string | Uint8Array, msg: Uint8Array): Buffer { const ephemeralKey = new PrivateKey(); @@ -13,7 +21,7 @@ export function encrypt(receiverRawPK: string | Uint8Array, msg: Uint8Array): Bu : PublicKey.fromHex(receiverRawPK); const symKey = ephemeralKey.encapsulate(receiverPK); - const encrypted = aesEncrypt(symKey, msg); + const encrypted = symEncrypt(symKey, msg); let pk: Uint8Array; if (isEphemeralKeyCompressed()) { @@ -34,7 +42,7 @@ export function decrypt(receiverRawSK: string | Uint8Array, msg: Uint8Array): Bu const senderPK = new PublicKey(msg.subarray(0, keySize)); const encrypted = msg.subarray(keySize); const symKey = senderPK.decapsulate(receiverSK); - return Buffer.from(aesDecrypt(symKey, encrypted)); + return Buffer.from(symDecrypt(symKey, encrypted)); } export { ECIES_CONFIG } from "./config"; @@ -42,8 +50,10 @@ export { PrivateKey, PublicKey } from "./keys"; export const utils = { // TODO: review these before 0.5.0 - aesDecrypt, aesEncrypt, + aesDecrypt, + symEncrypt, + symDecrypt, decodeHex, getValidSecret, remove0x, diff --git a/src/utils/compat.ts b/src/utils/compat.ts index f3f5ba7..61c2a1b 100644 --- a/src/utils/compat.ts +++ b/src/utils/compat.ts @@ -6,22 +6,18 @@ export const aes256gcm = ( key: Uint8Array, nonce: Uint8Array, AAD?: Uint8Array -): Cipher => { - return _compatAES("aes-256-gcm", key, nonce, AAD); -}; +): Cipher => _compatAES("aes-256-gcm", key, nonce, AAD); // NOT RECOMMENDED. There is neither AAD nor AEAD tag in cbc mode export const aes256cbc = ( key: Uint8Array, nonce: Uint8Array, AAD?: Uint8Array -): Cipher => { - return _compatAES("aes-256-cbc", key, nonce); -}; +): Cipher => _compatAES("aes-256-cbc", key, nonce); // make `node:crypto`'s aes compatible with `@noble/ciphers` function _compatAES( - algorithm: "aes-256-cbc" | "aes-256-gcm", + algorithm: "aes-256-gcm" | "aes-256-cbc", key: Uint8Array, nonce: Uint8Array, AAD?: Uint8Array diff --git a/src/utils/elliptic.ts b/src/utils/elliptic.ts index 2bcd346..ecedbec 100644 --- a/src/utils/elliptic.ts +++ b/src/utils/elliptic.ts @@ -8,45 +8,41 @@ import { ETH_PUBLIC_KEY_SIZE, SECRET_KEY_LENGTH } from "../consts"; import { decodeHex } from "./hex"; import { deriveKey } from "./symmetric"; -export function getValidSecret(): Uint8Array { - let key: Uint8Array; - do { - key = randomBytes(SECRET_KEY_LENGTH); - } while (!isValidPrivateKey(key)); - return key; -} - -export function isValidPrivateKey(secret: Uint8Array): boolean { +export const isValidPrivateKey = (secret: Uint8Array): boolean => // on secp256k1: only key ∈ (0, group order) is valid // on curve25519: any 32-byte key is valid - return _exec( + _exec( (curve) => curve.utils.isValidPrivateKey(secret), () => true, () => true ); -} -export function getPublicKey(secret: Uint8Array): Uint8Array { - return _exec( +export const getValidSecret = (): Uint8Array => { + let key: Uint8Array; + do { + key = randomBytes(SECRET_KEY_LENGTH); + } while (!isValidPrivateKey(key)); + return key; +}; + +export const getPublicKey = (secret: Uint8Array): Uint8Array => + _exec( (curve) => curve.getPublicKey(secret), (curve) => curve.getPublicKey(secret), (curve) => curve.getPublicKey(secret) ); -} -export function getSharedKey( +export const getSharedKey = ( ephemeralPoint: Uint8Array, sharedPoint: Uint8Array -): Uint8Array { - return deriveKey(concatBytes(ephemeralPoint, sharedPoint)); -} +): Uint8Array => deriveKey(concatBytes(ephemeralPoint, sharedPoint)); -export function getSharedPoint( +export const getSharedPoint = ( sk: Uint8Array, pk: Uint8Array, compressed?: boolean -): Uint8Array { - return _exec( +): Uint8Array => + _exec( (curve) => curve.getSharedSecret(sk, pk, compressed), (curve) => curve.getSharedSecret(sk, pk), (curve) => { @@ -56,21 +52,19 @@ export function getSharedPoint( return point.toRawBytes(); } ); -} -export function convertPublicKeyFormat( +export const convertPublicKeyFormat = ( pk: Uint8Array, compressed: boolean -): Uint8Array { +): Uint8Array => // only for secp256k1 - return _exec( + _exec( (curve) => curve.getSharedSecret(BigInt(1), pk, compressed), () => pk, () => pk ); -} -export function hexToPublicKey(hex: string): Uint8Array { +export const hexToPublicKey = (hex: string): Uint8Array => { const decoded = decodeHex(hex); return _exec( () => { @@ -85,18 +79,19 @@ export function hexToPublicKey(hex: string): Uint8Array { () => decoded, () => decoded ); -} +}; function _exec( secp256k1Callback: (curve: typeof secp256k1) => T, x25519Callback: (curve: typeof x25519) => T, ed25519Callback: (curve: typeof ed25519) => T -) { - if (ellipticCurve() === "secp256k1") { +): T { + const curve = ellipticCurve(); + if (curve === "secp256k1") { return secp256k1Callback(secp256k1); - } else if (ellipticCurve() === "x25519") { + } else if (curve === "x25519") { return x25519Callback(x25519); - } else if (ellipticCurve() === "ed25519") { + } else if (curve === "ed25519") { return ed25519Callback(ed25519); } else { throw new Error("Not implemented"); diff --git a/src/utils/hex.ts b/src/utils/hex.ts index 7a2fa6f..f7ec01e 100644 --- a/src/utils/hex.ts +++ b/src/utils/hex.ts @@ -1,12 +1,6 @@ import { hexToBytes } from "@noble/ciphers/utils"; -export function remove0x(hex: string): string { - if (hex.startsWith("0x") || hex.startsWith("0X")) { - return hex.slice(2); - } - return hex; -} +export const remove0x = (hex: string): string => + hex.startsWith("0x") || hex.startsWith("0X") ? hex.slice(2) : hex; -export function decodeHex(hex: string): Uint8Array { - return hexToBytes(remove0x(hex)); -} +export const decodeHex = (hex: string): Uint8Array => hexToBytes(remove0x(hex)); diff --git a/src/utils/symmetric.ts b/src/utils/symmetric.ts index 3788c8a..9fc7cb8 100644 --- a/src/utils/symmetric.ts +++ b/src/utils/symmetric.ts @@ -8,20 +8,21 @@ import { symmetricAlgorithm, symmetricNonceLength } from "../config"; import { AEAD_TAG_LENGTH, XCHACHA20_NONCE_LENGTH } from "../consts"; import { aes256cbc, aes256gcm } from "./compat"; -export function aesEncrypt(key: Uint8Array, plainText: Uint8Array): Uint8Array { - // TODO: Rename to symEncrypt - return _exec(true, key, plainText); -} +export const symEncrypt = (key: Uint8Array, plainText: Uint8Array): Uint8Array => + _exec(true, key, plainText); -export function aesDecrypt(key: Uint8Array, cipherText: Uint8Array): Uint8Array { - // TODO: Rename to symDecrypt - return _exec(false, key, cipherText); -} +export const symDecrypt = (key: Uint8Array, cipherText: Uint8Array): Uint8Array => + _exec(false, key, cipherText); + +/** @deprecated - use `symEncrypt` instead. */ +export const aesEncrypt = symEncrypt; // TODO: delete -export function deriveKey(master: Uint8Array): Uint8Array { +/** @deprecated - use `symDecrypt` instead. */ +export const aesDecrypt = symDecrypt; // TODO: delete + +export const deriveKey = (master: Uint8Array): Uint8Array => // 32 bytes shared secret for aes256 and xchacha20 derived from HKDF-SHA256 - return hkdf(sha256, master, undefined, undefined, 32); -} + hkdf(sha256, master, undefined, undefined, 32); function _exec(is_encryption: boolean, key: Uint8Array, data: Uint8Array): Uint8Array { const algorithm = symmetricAlgorithm(); @@ -47,7 +48,7 @@ function _encrypt( ): Uint8Array { const nonce = randomBytes(nonceLength); const cipher = func(key, nonce); - const ciphered = cipher.encrypt(plainText); // TAG + encrypted + const ciphered = cipher.encrypt(plainText); // encrypted || tag const encrypted = ciphered.subarray(0, ciphered.length - tagLength); const tag = ciphered.subarray(ciphered.length - tagLength); diff --git a/tests/utils/symmetric.test.ts b/tests/utils/symmetric.test.ts index 1d970a2..2db26f6 100644 --- a/tests/utils/symmetric.test.ts +++ b/tests/utils/symmetric.test.ts @@ -4,7 +4,7 @@ import { randomBytes } from "@noble/ciphers/webcrypto/utils"; import { ECIES_CONFIG, utils } from "../../src/index"; import { deriveKey } from "../../src/utils"; -const { aesDecrypt, aesEncrypt, decodeHex } = utils; +const { symDecrypt, symEncrypt, decodeHex } = utils; const TEXT = "helloworld🌍"; const encoder = new TextEncoder(); @@ -14,7 +14,7 @@ describe("test random symmetric", () => { function testRandomKey() { const key = randomBytes(32); const data = encoder.encode(TEXT); - expect(data).toEqual(aesDecrypt(key, aesEncrypt(key, data))); + expect(data).toEqual(symDecrypt(key, symEncrypt(key, data))); } it("tests aes", () => { @@ -42,7 +42,7 @@ describe("test random symmetric", () => { expect(testRandomKey).toThrow("Not implemented"); - expect(() => aesDecrypt(randomBytes(32), decodeHex("01010e0e"))).toThrow( + expect(() => symDecrypt(randomBytes(32), decodeHex("01010e0e"))).toThrow( "Not implemented" ); @@ -71,7 +71,7 @@ describe("test known symmetric", () => { const encrypted = decodeHex("aa0664f3c00a09d098bf"); const data = concatBytes(nonce, tag, encrypted); - const decrypted = aesDecrypt(key, data); + const decrypted = symDecrypt(key, data); expect(decoder.decode(decrypted)).toBe("helloworld"); ECIES_CONFIG.symmetricAlgorithm = "aes-256-gcm";