From e467fb6c8a0665366f6fee3df92d013fb521f136 Mon Sep 17 00:00:00 2001 From: Musab Hussain Date: Mon, 23 Jan 2023 14:12:08 +0500 Subject: [PATCH 1/6] session management --- example/App.tsx | 23 +++- example/package-lock.json | 83 +++++++----- example/package.json | 3 +- example_general/App.tsx | 27 ++-- example_general/package.json | 5 +- example_general/yarn.lock | 81 ++++++++++- package-lock.json | 229 +++++++++++++++++--------------- package.json | 14 +- src/Web3Auth.ts | 89 ++++++++++++- src/api/Web3AuthApi.ts | 24 ++++ src/api/model.ts | 18 +++ src/session/KeyStore.ts | 34 +++++ src/session/SessionManagment.ts | 90 +++++++++++++ src/types/IEncryptedStorage.ts | 56 ++++++++ src/types/IExpoSecureStore.ts | 116 ++++++++++++++++ 15 files changed, 724 insertions(+), 168 deletions(-) create mode 100644 src/api/Web3AuthApi.ts create mode 100644 src/api/model.ts create mode 100644 src/session/KeyStore.ts create mode 100644 src/session/SessionManagment.ts create mode 100644 src/types/IEncryptedStorage.ts create mode 100644 src/types/IExpoSecureStore.ts diff --git a/example/App.tsx b/example/App.tsx index 5975299..aaaac6b 100644 --- a/example/App.tsx +++ b/example/App.tsx @@ -1,10 +1,11 @@ import { StatusBar } from "expo-status-bar"; -import { useState } from "react"; +import { useEffect, useRef, useState } from "react"; import { StyleSheet, Text, View, Button } from "react-native"; import Web3Auth, { LOGIN_PROVIDER, OPENLOGIN_NETWORK, State } from "@web3auth/react-native-sdk"; import Constants, { AppOwnership } from "expo-constants"; import * as Linking from "expo-linking"; import * as WebBrowser from "expo-web-browser"; +import * as SecureStore from 'expo-secure-store'; import { Buffer } from "buffer"; global.Buffer = global.Buffer || Buffer; @@ -20,13 +21,23 @@ export default function App() { const [key, setKey] = useState(""); const [errorMsg, setErrorMsg] = useState(""); const [userInfo, setUserInfo] = useState(null); + + var web3auth = useRef(); + + useEffect(() => { + web3auth.current = new Web3Auth(WebBrowser, SecureStore, { + clientId: "BDj1toq1N1xYgDIJ00ADR-QPJ71ESzJcB3ijVHP1TsIX7nsx_lu6uLoJQMPze1vpGDt--Ew95RGxz-RgOh1tcxM", + network: OPENLOGIN_NETWORK.TESTNET, + }); + web3auth.current.sessionResponse.on("login", function(state: State) { + setKey(state.privKey || "no key"); + setUserInfo(state); + }); + }, []); + const login = async () => { try { - const web3auth = new Web3Auth(WebBrowser, { - clientId: "BA0mVyeHATikwuXVhXWCNjAxHthlw0w84mUhLuxlC4KZKjvmBsbdbmEWTizJ26YzrbKSWbOZbtGYdVDm0ESuYSg", - network: OPENLOGIN_NETWORK.TESTNET, - }); - const state = await web3auth.login({ + const state = await web3auth.current.login({ loginProvider: LOGIN_PROVIDER.GOOGLE, redirectUrl: resolvedRedirectUrl, }); diff --git a/example/package-lock.json b/example/package-lock.json index 4184103..503e9fb 100644 --- a/example/package-lock.json +++ b/example/package-lock.json @@ -11,6 +11,7 @@ "@web3auth/react-native-sdk": "file:../", "expo": "~45.0.6", "expo-linking": "^3.1.0", + "expo-secure-store": "~11.2.0", "expo-status-bar": "~1.3.0", "expo-web-browser": "~10.2.1", "react": "^17.0.1", @@ -31,38 +32,39 @@ }, "..": { "name": "@web3auth/react-native-sdk", - "version": "3.0.0", + "version": "3.3.0", "license": "MIT", "dependencies": { + "@wangshijun/secp256k1": "^4.0.3", "base64url": "^3.0.1", "buffer": "^6.0.3", - "loglevel": "^1.8.0", + "crypto-js": "^4.1.1", + "loglevel": "^1.8.1", "react-native-url-polyfill": "^1.3.0" }, "devDependencies": { - "@babel/runtime": "^7.18.9", - "@toruslabs/eslint-config-typescript": "1.0.3", - "@toruslabs/openlogin": "^2.4.0", - "@toruslabs/torus-scripts": "^1.0.5", + "@babel/runtime": "^7.20.1", + "@toruslabs/eslint-config-typescript": "1.2.0", + "@toruslabs/openlogin": "^2.8.0", + "@toruslabs/torus-scripts": "^1.3.0", "@types/node": "^16", "@types/react-native": "^0.69.3", - "@typescript-eslint/eslint-plugin": "^5.30.7", - "@typescript-eslint/parser": "^5.30.7", - "eslint": "^8.20.0", + "@typescript-eslint/eslint-plugin": "^5.44.0", + "@typescript-eslint/parser": "^5.44.0", + "eslint": "^8.28.0", "eslint-plugin-import": "^2.26.0", "eslint-plugin-mocha": "^10.1.0", - "eslint-plugin-n": "^15.2.4", - "eslint-plugin-node": "^11.1.0", + "eslint-plugin-n": "^15.5.1", "eslint-plugin-prettier": "^4.2.1", - "eslint-plugin-promise": "^6.0.0", - "eslint-plugin-simple-import-sort": "^7.0.0", - "eslint-plugin-tsdoc": "^0.2.16", - "husky": "^8.0.1", + "eslint-plugin-promise": "^6.1.1", + "eslint-plugin-simple-import-sort": "^8.0.0", + "eslint-plugin-tsdoc": "^0.2.17", + "husky": "^8.0.2", "lint-staged": "^13.0.3", - "prettier": "^2.7.1", + "prettier": "^2.8.0", "react-native": "~0.68.2", "rimraf": "^3.0.2", - "typescript": "^4.7.4" + "typescript": "^4.9.3" }, "peerDependencies": { "@babel/runtime": "^7.x", @@ -12410,6 +12412,14 @@ "node": ">=8" } }, + "node_modules/expo-secure-store": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/expo-secure-store/-/expo-secure-store-11.2.0.tgz", + "integrity": "sha512-PlmDplx9QNqaTVKNLgqSurRhzYf6YbVTTiSKX5JlEMWgOiBTz77Nh6mpMMjI1jwrvtz9grD+CT2AlDEGXe+Ovg==", + "peerDependencies": { + "expo": "*" + } + }, "node_modules/expo-status-bar": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/expo-status-bar/-/expo-status-bar-1.3.0.tgz", @@ -30950,33 +30960,34 @@ "@web3auth/react-native-sdk": { "version": "file:..", "requires": { - "@babel/runtime": "^7.18.9", - "@toruslabs/eslint-config-typescript": "1.0.3", - "@toruslabs/openlogin": "^2.4.0", - "@toruslabs/torus-scripts": "^1.0.5", + "@babel/runtime": "^7.20.1", + "@toruslabs/eslint-config-typescript": "1.2.0", + "@toruslabs/openlogin": "^2.8.0", + "@toruslabs/torus-scripts": "^1.3.0", "@types/node": "^16", "@types/react-native": "^0.69.3", - "@typescript-eslint/eslint-plugin": "^5.30.7", - "@typescript-eslint/parser": "^5.30.7", + "@typescript-eslint/eslint-plugin": "^5.44.0", + "@typescript-eslint/parser": "^5.44.0", + "@wangshijun/secp256k1": "^4.0.3", "base64url": "^3.0.1", "buffer": "^6.0.3", - "eslint": "^8.20.0", + "crypto-js": "^4.1.1", + "eslint": "^8.28.0", "eslint-plugin-import": "^2.26.0", "eslint-plugin-mocha": "^10.1.0", - "eslint-plugin-n": "^15.2.4", - "eslint-plugin-node": "^11.1.0", + "eslint-plugin-n": "^15.5.1", "eslint-plugin-prettier": "^4.2.1", - "eslint-plugin-promise": "^6.0.0", - "eslint-plugin-simple-import-sort": "^7.0.0", - "eslint-plugin-tsdoc": "^0.2.16", - "husky": "^8.0.1", + "eslint-plugin-promise": "^6.1.1", + "eslint-plugin-simple-import-sort": "^8.0.0", + "eslint-plugin-tsdoc": "^0.2.17", + "husky": "^8.0.2", "lint-staged": "^13.0.3", - "loglevel": "^1.8.0", - "prettier": "^2.7.1", + "loglevel": "^1.8.1", + "prettier": "^2.8.0", "react-native": "~0.68.2", "react-native-url-polyfill": "^1.3.0", "rimraf": "^3.0.2", - "typescript": "^4.7.4" + "typescript": "^4.9.3" } }, "@webassemblyjs/ast": { @@ -35836,6 +35847,12 @@ } } }, + "expo-secure-store": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/expo-secure-store/-/expo-secure-store-11.2.0.tgz", + "integrity": "sha512-PlmDplx9QNqaTVKNLgqSurRhzYf6YbVTTiSKX5JlEMWgOiBTz77Nh6mpMMjI1jwrvtz9grD+CT2AlDEGXe+Ovg==", + "requires": {} + }, "expo-status-bar": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/expo-status-bar/-/expo-status-bar-1.3.0.tgz", diff --git a/example/package.json b/example/package.json index b2e8b57..44dbcbe 100644 --- a/example/package.json +++ b/example/package.json @@ -18,7 +18,8 @@ "react": "^17.0.1", "react-dom": "^17.0.1", "react-native": "^0.68.2", - "react-native-web": "0.17.7" + "react-native-web": "0.17.7", + "expo-secure-store": "~11.2.0" }, "devDependencies": { "@babel/core": "^7.18.9", diff --git a/example_general/App.tsx b/example_general/App.tsx index 0b71bce..659a089 100644 --- a/example_general/App.tsx +++ b/example_general/App.tsx @@ -8,8 +8,9 @@ * @format */ -import React, {useState} from 'react'; +import React, {useEffect, useRef, useState} from 'react'; import * as WebBrowser from '@toruslabs/react-native-web-browser'; +import EncryptedStorage from 'react-native-encrypted-storage'; import Web3Auth, { LOGIN_PROVIDER, OPENLOGIN_NETWORK, @@ -28,24 +29,34 @@ const App = () => { const [key, setKey] = useState(''); const [errorMsg, setErrorMsg] = useState(''); const [userInfo, setUserInfo] = useState(null); + + var web3auth = useRef(); + + useEffect(() => { + web3auth.current = new Web3Auth(WebBrowser, EncryptedStorage, { + clientId: "BDj1toq1N1xYgDIJ00ADR-QPJ71ESzJcB3ijVHP1TsIX7nsx_lu6uLoJQMPze1vpGDt--Ew95RGxz-RgOh1tcxM", + network: OPENLOGIN_NETWORK.TESTNET, + }); + web3auth.current.sessionResponse.on("login", function(state: State) { + setKey(state.privKey || "no key"); + setUserInfo(state); + }); + }, []); + const login = async () => { try { - const web3auth = new Web3Auth(WebBrowser, { - clientId: - 'BA0mVyeHATikwuXVhXWCNjAxHthlw0w84mUhLuxlC4KZKjvmBsbdbmEWTizJ26YzrbKSWbOZbtGYdVDm0ESuYSg', - network: OPENLOGIN_NETWORK.TESTNET, - }); - const state = await web3auth.login({ + const state = await web3auth.current.login({ loginProvider: LOGIN_PROVIDER.GOOGLE, redirectUrl: resolvedRedirectUrl, }); - setKey(state.privKey || 'no key'); + setKey(state.privKey || "no key"); setUserInfo(state); } catch (e) { console.error(e); setErrorMsg(String(e)); } }; + return ( {key !== '' ? Key: {key} : null} diff --git a/example_general/package.json b/example_general/package.json index 17a1ccf..71d4c17 100644 --- a/example_general/package.json +++ b/example_general/package.json @@ -10,10 +10,11 @@ "lint": "eslint . --ext .js,.jsx,.ts,.tsx" }, "dependencies": { + "@toruslabs/react-native-web-browser": "^1.0.1", + "@web3auth/react-native-sdk": "file:../", "react": "18.1.0", "react-native": "0.70.1", - "@toruslabs/react-native-web-browser": "^1.0.1", - "@web3auth/react-native-sdk": "file:../" + "react-native-encrypted-storage": "^4.0.3" }, "devDependencies": { "@babel/core": "^7.12.9", diff --git a/example_general/yarn.lock b/example_general/yarn.lock index 15a45c6..a43189f 100644 --- a/example_general/yarn.lock +++ b/example_general/yarn.lock @@ -1617,12 +1617,21 @@ "@typescript-eslint/types" "5.39.0" eslint-visitor-keys "^3.3.0" +"@wangshijun/secp256k1@^4.0.3": + version "4.0.3" + resolved "https://registry.yarnpkg.com/@wangshijun/secp256k1/-/secp256k1-4.0.3.tgz#20fc976dc0abc252ed653ee75d1b63d484267b07" + integrity sha512-07nXubNoGKpnJruT9wNGS4PP6+5qYKA+psd0Tdh/XVqkDf+S+MQ2y9o7Fh8g8pg/ScfPCgjL1O4N+w/21pQY+w== + dependencies: + elliptic "^6.5.2" + "@web3auth/react-native-sdk@file:..": - version "3.1.0" + version "3.3.0" dependencies: + "@wangshijun/secp256k1" "^4.0.3" base64url "^3.0.1" buffer "^6.0.3" - loglevel "^1.8.0" + crypto-js "^4.1.1" + loglevel "^1.8.1" react-native-url-polyfill "^1.3.0" abab@^2.0.3, abab@^2.0.5: @@ -2060,6 +2069,11 @@ bl@^4.1.0: inherits "^2.0.4" readable-stream "^3.4.0" +bn.js@^4.11.9: + version "4.12.0" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" + integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== + brace-expansion@^1.1.7: version "1.1.11" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" @@ -2091,6 +2105,11 @@ braces@^3.0.2: dependencies: fill-range "^7.0.1" +brorand@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" + integrity sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w== + browser-process-hrtime@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626" @@ -2465,6 +2484,11 @@ cross-spawn@^7.0.0, cross-spawn@^7.0.2: shebang-command "^2.0.0" which "^2.0.1" +crypto-js@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/crypto-js/-/crypto-js-4.1.1.tgz#9e485bcf03521041bd85844786b83fb7619736cf" + integrity sha512-o2JlM7ydqd3Qk9CA0L4NL6mTzU2sdx96a+oOfPu8Mkl/PK51vSyoi8/rQ8NknZtk44vq15lmhAj9CIAGwgeWKw== + cssom@^0.4.4: version "0.4.4" resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.4.4.tgz#5a66cf93d2d0b661d80bf6a44fb65f5c2e4e0a10" @@ -2650,6 +2674,19 @@ electron-to-chromium@^1.4.251: resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.275.tgz#db25c8e39c9cc910a996d1ec9b73eee834cb0ac1" integrity sha512-aJeQQ+Hl9Jyyzv4chBqYJwmVRY46N5i2BEX5Cuyk/5gFCUZ5F3i7Hnba6snZftWla7Gglwc5pIgcd+E7cW+rPg== +elliptic@^6.5.2: + version "6.5.4" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" + integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== + dependencies: + bn.js "^4.11.9" + brorand "^1.1.0" + hash.js "^1.0.0" + hmac-drbg "^1.0.1" + inherits "^2.0.4" + minimalistic-assert "^1.0.1" + minimalistic-crypto-utils "^1.0.1" + emittery@^0.7.1: version "0.7.2" resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.7.2.tgz#25595908e13af0f5674ab419396e2fb394cdfa82" @@ -3486,6 +3523,14 @@ has@^1.0.3: dependencies: function-bind "^1.1.1" +hash.js@^1.0.0, hash.js@^1.0.3: + version "1.1.7" + resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" + integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== + dependencies: + inherits "^2.0.3" + minimalistic-assert "^1.0.1" + hermes-estree@0.8.0: version "0.8.0" resolved "https://registry.yarnpkg.com/hermes-estree/-/hermes-estree-0.8.0.tgz#530be27243ca49f008381c1f3e8b18fb26bf9ec0" @@ -3505,6 +3550,15 @@ hermes-profile-transformer@^0.0.6: dependencies: source-map "^0.7.3" +hmac-drbg@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" + integrity sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg== + dependencies: + hash.js "^1.0.3" + minimalistic-assert "^1.0.0" + minimalistic-crypto-utils "^1.0.1" + hosted-git-info@^2.1.4: version "2.8.9" resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" @@ -4661,10 +4715,10 @@ logkitty@^0.7.1: dayjs "^1.8.15" yargs "^15.1.0" -loglevel@^1.8.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.8.0.tgz#e7ec73a57e1e7b419cb6c6ac06bf050b67356114" - integrity sha512-G6A/nJLRgWOuuwdNuA6koovfEV1YpqqAG4pRUlFaz3jj2QNZ8M4vBqnVA+HBTmU/AMNUtlOsMmSpF6NyOjztbA== +loglevel@^1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.8.1.tgz#5c621f83d5b48c54ae93b6156353f555963377b4" + integrity sha512-tCRIJM51SHjAayKwC+QAg8hT8vg6z7GSgLJKGvzuPb1Wc+hLzqtuVLxp6/HzSPOozuK+8ErAhy7U/sVzw8Dgfg== loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0: version "1.4.0" @@ -5155,6 +5209,16 @@ mimic-fn@^2.1.0: resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== +minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" + integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== + +minimalistic-crypto-utils@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" + integrity sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg== + minimatch@^3.0.2, minimatch@^3.0.4, minimatch@^3.1.1, minimatch@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" @@ -5804,6 +5868,11 @@ react-native-codegen@^0.70.5: jscodeshift "^0.13.1" nullthrows "^1.1.1" +react-native-encrypted-storage@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/react-native-encrypted-storage/-/react-native-encrypted-storage-4.0.3.tgz#2a4d65459870511e8f4ccd22f02433dab7fa5e91" + integrity sha512-0pJA4Aj2S1PIJEbU7pN/Qvf7JIJx3hFywx+i+bLHtgK0/6Zryf1V2xVsWcrD50dfiu3jY1eN2gesQ5osGxE7jA== + react-native-gradle-plugin@^0.70.3: version "0.70.3" resolved "https://registry.yarnpkg.com/react-native-gradle-plugin/-/react-native-gradle-plugin-0.70.3.tgz#cbcf0619cbfbddaa9128701aa2d7b4145f9c4fc8" diff --git a/package-lock.json b/package-lock.json index 95b6b07..e4d0b39 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,8 +9,10 @@ "version": "3.3.0", "license": "MIT", "dependencies": { + "@wangshijun/secp256k1": "^4.0.3", "base64url": "^3.0.1", "buffer": "^6.0.3", + "crypto-js": "^4.1.1", "loglevel": "^1.8.1", "react-native-url-polyfill": "^1.3.0" }, @@ -104,11 +106,11 @@ } }, "node_modules/@babel/generator": { - "version": "7.20.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.4.tgz", - "integrity": "sha512-luCf7yk/cm7yab6CAW1aiFnmEfBJplb/JojV56MYEK7ziWfGmFlTfmL9Ehwfy4gFhbjBfWO1wj7/TuSbVNEEtA==", + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.7.tgz", + "integrity": "sha512-7wqMOJq8doJMZmP4ApXTzLxSr7+oO2jroJURrVEp6XShrQUObV8Tq/D0NCcoYg2uHqUrjzO0zwBjoYzelxK+sw==", "dependencies": { - "@babel/types": "^7.20.2", + "@babel/types": "^7.20.7", "@jridgewell/gen-mapping": "^0.3.2", "jsesc": "^2.5.1" }, @@ -170,16 +172,17 @@ } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.18.9.tgz", - "integrity": "sha512-WvypNAYaVh23QcjpMR24CwZY2Nz6hqdOcFdPbNpV56hL5H6KiFheO7Xm1aPdlLQ7d5emYZX7VZwPp9x3z+2opw==", + "version": "7.20.12", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.20.12.tgz", + "integrity": "sha512-9OunRkbT0JQcednL0UFvbfXpAsUXiGjUk0a7sN8fUXX7Mue79cUSMjHGDRRi/Vz9vYlpIhLV5fMD5dKoMhhsNQ==", "dependencies": { "@babel/helper-annotate-as-pure": "^7.18.6", "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.18.9", - "@babel/helper-member-expression-to-functions": "^7.18.9", + "@babel/helper-function-name": "^7.19.0", + "@babel/helper-member-expression-to-functions": "^7.20.7", "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-replace-supers": "^7.18.9", + "@babel/helper-replace-supers": "^7.20.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", "@babel/helper-split-export-declaration": "^7.18.6" }, "engines": { @@ -263,11 +266,11 @@ } }, "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.18.9.tgz", - "integrity": "sha512-RxifAh2ZoVU67PyKIO4AMi1wTenGfMR/O/ae0CCRqwgBAt5v7xjdtRw7UoSbsreKrQn5t7r89eruK/9JjYHuDg==", + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.20.7.tgz", + "integrity": "sha512-9J0CxJLq315fEdi4s7xK5TQaNYjZw+nDVpVqr1axNGKzdrdwYBD5b4uKv3n75aABG0rCCTK8Im8Ww7eYfMrZgw==", "dependencies": { - "@babel/types": "^7.18.9" + "@babel/types": "^7.20.7" }, "engines": { "node": ">=6.9.0" @@ -339,15 +342,16 @@ } }, "node_modules/@babel/helper-replace-supers": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.19.1.tgz", - "integrity": "sha512-T7ahH7wV0Hfs46SFh5Jz3s0B6+o8g3c+7TMxu7xKfmHikg7EAZ3I2Qk9LFhjxXq8sL7UkP5JflezNwoZa8WvWw==", + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.20.7.tgz", + "integrity": "sha512-vujDMtB6LVfNW13jhlCrp48QNslK6JXi7lQG736HVbHz/mbf4Dc7tIRh1Xf5C0rF7BP8iiSxGMCmY6Ci1ven3A==", "dependencies": { "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-member-expression-to-functions": "^7.18.9", + "@babel/helper-member-expression-to-functions": "^7.20.7", "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/traverse": "^7.19.1", - "@babel/types": "^7.19.0" + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.20.7", + "@babel/types": "^7.20.7" }, "engines": { "node": ">=6.9.0" @@ -365,11 +369,11 @@ } }, "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.18.9.tgz", - "integrity": "sha512-imytd2gHi3cJPsybLRbmFrF7u5BIEuI2cNheyKi3/iOBC63kNn3q8Crn2xVuESli0aM4KYsyEqKyS7lFL8YVtw==", + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.20.0.tgz", + "integrity": "sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg==", "dependencies": { - "@babel/types": "^7.18.9" + "@babel/types": "^7.20.0" }, "engines": { "node": ">=6.9.0" @@ -515,9 +519,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.20.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.3.tgz", - "integrity": "sha512-OP/s5a94frIPXwjzEcv5S/tpQfc6XhxYUnmWpgdqMWGgYCuErA3SzozaRAMQgSZWKeTJxht9aWAkUY+0UzvOFg==", + "version": "7.20.13", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.13.tgz", + "integrity": "sha512-gFDLKMfpiXCsjt4za2JA9oTMn70CeseCehb11kRZgvd7+F67Hih3OHOK24cRrWECJ/ljfPGac6ygXAs/C8kIvw==", "bin": { "parser": "bin/babel-parser.js" }, @@ -1912,31 +1916,31 @@ } }, "node_modules/@babel/template": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz", - "integrity": "sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==", + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz", + "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==", "dependencies": { "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.18.10", - "@babel/types": "^7.18.10" + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.20.1", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.1.tgz", - "integrity": "sha512-d3tN8fkVJwFLkHkBN479SOsw4DMZnz8cdbL/gvuDuzy3TS6Nfw80HuQqhw1pITbIruHyh7d1fMA47kWzmcUEGA==", + "version": "7.20.13", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.13.tgz", + "integrity": "sha512-kMJXfF0T6DIS9E8cgdLCSAL+cuCK+YEZHWiLK0SXpTo8YRj5lpJu3CDNKiIBCne4m9hhTIqUg6SYTAI39tAiVQ==", "dependencies": { "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.20.1", + "@babel/generator": "^7.20.7", "@babel/helper-environment-visitor": "^7.18.9", "@babel/helper-function-name": "^7.19.0", "@babel/helper-hoist-variables": "^7.18.6", "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.20.1", - "@babel/types": "^7.20.0", + "@babel/parser": "^7.20.13", + "@babel/types": "^7.20.7", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -1945,9 +1949,9 @@ } }, "node_modules/@babel/types": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.2.tgz", - "integrity": "sha512-FnnvsNWgZCr232sqtXggapvlkk/tuwR/qhGzcmxI0GXLCjmPYQPzio2FbdlWuY6y1sHFfQKk+rRbUZ9VStQMog==", + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.7.tgz", + "integrity": "sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg==", "dependencies": { "@babel/helper-string-parser": "^7.19.4", "@babel/helper-validator-identifier": "^7.19.1", @@ -4248,6 +4252,17 @@ "url": "https://opencollective.com/typescript-eslint" } }, + "node_modules/@wangshijun/secp256k1": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@wangshijun/secp256k1/-/secp256k1-4.0.3.tgz", + "integrity": "sha512-07nXubNoGKpnJruT9wNGS4PP6+5qYKA+psd0Tdh/XVqkDf+S+MQ2y9o7Fh8g8pg/ScfPCgjL1O4N+w/21pQY+w==", + "dependencies": { + "elliptic": "^6.5.2" + }, + "engines": { + "node": ">=10.0.0" + } + }, "node_modules/@webassemblyjs/ast": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", @@ -5293,8 +5308,7 @@ "node_modules/brorand": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==", - "dev": true + "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==" }, "node_modules/browserify-aes": { "version": "1.2.0", @@ -6288,6 +6302,11 @@ "node": "*" } }, + "node_modules/crypto-js": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.1.1.tgz", + "integrity": "sha512-o2JlM7ydqd3Qk9CA0L4NL6mTzU2sdx96a+oOfPu8Mkl/PK51vSyoi8/rQ8NknZtk44vq15lmhAj9CIAGwgeWKw==" + }, "node_modules/crypto-random-string": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", @@ -6620,7 +6639,6 @@ "version": "6.5.4", "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", - "dev": true, "dependencies": { "bn.js": "^4.11.9", "brorand": "^1.1.0", @@ -6634,8 +6652,7 @@ "node_modules/elliptic/node_modules/bn.js": { "version": "4.12.0", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" }, "node_modules/emoji-regex": { "version": "8.0.0", @@ -8685,7 +8702,6 @@ "version": "1.1.7", "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", - "dev": true, "dependencies": { "inherits": "^2.0.3", "minimalistic-assert": "^1.0.1" @@ -8724,7 +8740,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", - "dev": true, "dependencies": { "hash.js": "^1.0.3", "minimalistic-assert": "^1.0.0", @@ -11032,14 +11047,12 @@ "node_modules/minimalistic-assert": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", - "dev": true + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" }, "node_modules/minimalistic-crypto-utils": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==", - "dev": true + "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==" }, "node_modules/minimatch": { "version": "3.1.2", @@ -15989,11 +16002,11 @@ } }, "@babel/generator": { - "version": "7.20.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.4.tgz", - "integrity": "sha512-luCf7yk/cm7yab6CAW1aiFnmEfBJplb/JojV56MYEK7ziWfGmFlTfmL9Ehwfy4gFhbjBfWO1wj7/TuSbVNEEtA==", + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.7.tgz", + "integrity": "sha512-7wqMOJq8doJMZmP4ApXTzLxSr7+oO2jroJURrVEp6XShrQUObV8Tq/D0NCcoYg2uHqUrjzO0zwBjoYzelxK+sw==", "requires": { - "@babel/types": "^7.20.2", + "@babel/types": "^7.20.7", "@jridgewell/gen-mapping": "^0.3.2", "jsesc": "^2.5.1" }, @@ -16039,16 +16052,17 @@ } }, "@babel/helper-create-class-features-plugin": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.18.9.tgz", - "integrity": "sha512-WvypNAYaVh23QcjpMR24CwZY2Nz6hqdOcFdPbNpV56hL5H6KiFheO7Xm1aPdlLQ7d5emYZX7VZwPp9x3z+2opw==", + "version": "7.20.12", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.20.12.tgz", + "integrity": "sha512-9OunRkbT0JQcednL0UFvbfXpAsUXiGjUk0a7sN8fUXX7Mue79cUSMjHGDRRi/Vz9vYlpIhLV5fMD5dKoMhhsNQ==", "requires": { "@babel/helper-annotate-as-pure": "^7.18.6", "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.18.9", - "@babel/helper-member-expression-to-functions": "^7.18.9", + "@babel/helper-function-name": "^7.19.0", + "@babel/helper-member-expression-to-functions": "^7.20.7", "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-replace-supers": "^7.18.9", + "@babel/helper-replace-supers": "^7.20.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", "@babel/helper-split-export-declaration": "^7.18.6" } }, @@ -16105,11 +16119,11 @@ } }, "@babel/helper-member-expression-to-functions": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.18.9.tgz", - "integrity": "sha512-RxifAh2ZoVU67PyKIO4AMi1wTenGfMR/O/ae0CCRqwgBAt5v7xjdtRw7UoSbsreKrQn5t7r89eruK/9JjYHuDg==", + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.20.7.tgz", + "integrity": "sha512-9J0CxJLq315fEdi4s7xK5TQaNYjZw+nDVpVqr1axNGKzdrdwYBD5b4uKv3n75aABG0rCCTK8Im8Ww7eYfMrZgw==", "requires": { - "@babel/types": "^7.18.9" + "@babel/types": "^7.20.7" } }, "@babel/helper-module-imports": { @@ -16160,15 +16174,16 @@ } }, "@babel/helper-replace-supers": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.19.1.tgz", - "integrity": "sha512-T7ahH7wV0Hfs46SFh5Jz3s0B6+o8g3c+7TMxu7xKfmHikg7EAZ3I2Qk9LFhjxXq8sL7UkP5JflezNwoZa8WvWw==", + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.20.7.tgz", + "integrity": "sha512-vujDMtB6LVfNW13jhlCrp48QNslK6JXi7lQG736HVbHz/mbf4Dc7tIRh1Xf5C0rF7BP8iiSxGMCmY6Ci1ven3A==", "requires": { "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-member-expression-to-functions": "^7.18.9", + "@babel/helper-member-expression-to-functions": "^7.20.7", "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/traverse": "^7.19.1", - "@babel/types": "^7.19.0" + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.20.7", + "@babel/types": "^7.20.7" } }, "@babel/helper-simple-access": { @@ -16180,11 +16195,11 @@ } }, "@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.18.9.tgz", - "integrity": "sha512-imytd2gHi3cJPsybLRbmFrF7u5BIEuI2cNheyKi3/iOBC63kNn3q8Crn2xVuESli0aM4KYsyEqKyS7lFL8YVtw==", + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.20.0.tgz", + "integrity": "sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg==", "requires": { - "@babel/types": "^7.18.9" + "@babel/types": "^7.20.0" } }, "@babel/helper-split-export-declaration": { @@ -16293,9 +16308,9 @@ } }, "@babel/parser": { - "version": "7.20.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.3.tgz", - "integrity": "sha512-OP/s5a94frIPXwjzEcv5S/tpQfc6XhxYUnmWpgdqMWGgYCuErA3SzozaRAMQgSZWKeTJxht9aWAkUY+0UzvOFg==" + "version": "7.20.13", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.13.tgz", + "integrity": "sha512-gFDLKMfpiXCsjt4za2JA9oTMn70CeseCehb11kRZgvd7+F67Hih3OHOK24cRrWECJ/ljfPGac6ygXAs/C8kIvw==" }, "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { "version": "7.18.6", @@ -17194,36 +17209,36 @@ } }, "@babel/template": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz", - "integrity": "sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==", + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz", + "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==", "requires": { "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.18.10", - "@babel/types": "^7.18.10" + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7" } }, "@babel/traverse": { - "version": "7.20.1", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.1.tgz", - "integrity": "sha512-d3tN8fkVJwFLkHkBN479SOsw4DMZnz8cdbL/gvuDuzy3TS6Nfw80HuQqhw1pITbIruHyh7d1fMA47kWzmcUEGA==", + "version": "7.20.13", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.13.tgz", + "integrity": "sha512-kMJXfF0T6DIS9E8cgdLCSAL+cuCK+YEZHWiLK0SXpTo8YRj5lpJu3CDNKiIBCne4m9hhTIqUg6SYTAI39tAiVQ==", "requires": { "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.20.1", + "@babel/generator": "^7.20.7", "@babel/helper-environment-visitor": "^7.18.9", "@babel/helper-function-name": "^7.19.0", "@babel/helper-hoist-variables": "^7.18.6", "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.20.1", - "@babel/types": "^7.20.0", + "@babel/parser": "^7.20.13", + "@babel/types": "^7.20.7", "debug": "^4.1.0", "globals": "^11.1.0" } }, "@babel/types": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.2.tgz", - "integrity": "sha512-FnnvsNWgZCr232sqtXggapvlkk/tuwR/qhGzcmxI0GXLCjmPYQPzio2FbdlWuY6y1sHFfQKk+rRbUZ9VStQMog==", + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.7.tgz", + "integrity": "sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg==", "requires": { "@babel/helper-string-parser": "^7.19.4", "@babel/helper-validator-identifier": "^7.19.1", @@ -19000,6 +19015,14 @@ "eslint-visitor-keys": "^3.3.0" } }, + "@wangshijun/secp256k1": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@wangshijun/secp256k1/-/secp256k1-4.0.3.tgz", + "integrity": "sha512-07nXubNoGKpnJruT9wNGS4PP6+5qYKA+psd0Tdh/XVqkDf+S+MQ2y9o7Fh8g8pg/ScfPCgjL1O4N+w/21pQY+w==", + "requires": { + "elliptic": "^6.5.2" + } + }, "@webassemblyjs/ast": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", @@ -19834,8 +19857,7 @@ "brorand": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==", - "dev": true + "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==" }, "browserify-aes": { "version": "1.2.0", @@ -20614,6 +20636,11 @@ "randomfill": "^1.0.3" } }, + "crypto-js": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.1.1.tgz", + "integrity": "sha512-o2JlM7ydqd3Qk9CA0L4NL6mTzU2sdx96a+oOfPu8Mkl/PK51vSyoi8/rQ8NknZtk44vq15lmhAj9CIAGwgeWKw==" + }, "crypto-random-string": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", @@ -20881,7 +20908,6 @@ "version": "6.5.4", "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", - "dev": true, "requires": { "bn.js": "^4.11.9", "brorand": "^1.1.0", @@ -20895,8 +20921,7 @@ "bn.js": { "version": "4.12.0", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" } } }, @@ -22433,7 +22458,6 @@ "version": "1.1.7", "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", - "dev": true, "requires": { "inherits": "^2.0.3", "minimalistic-assert": "^1.0.1" @@ -22469,7 +22493,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", - "dev": true, "requires": { "hash.js": "^1.0.3", "minimalistic-assert": "^1.0.0", @@ -24219,14 +24242,12 @@ "minimalistic-assert": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", - "dev": true + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" }, "minimalistic-crypto-utils": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==", - "dev": true + "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==" }, "minimatch": { "version": "3.1.2", diff --git a/package.json b/package.json index f49ae96..ced3912 100644 --- a/package.json +++ b/package.json @@ -36,25 +36,26 @@ "web3auth" ], "dependencies": { + "@wangshijun/secp256k1": "^4.0.3", "base64url": "^3.0.1", "buffer": "^6.0.3", + "crypto-js": "^4.1.1", "loglevel": "^1.8.1", "react-native-url-polyfill": "^1.3.0" }, "peerDependencies": { - "react-native": "*", - "@babel/runtime": "^7.x" + "@babel/runtime": "^7.x", + "react-native": "*" }, "devDependencies": { - "react-native": "~0.68.2", "@babel/runtime": "^7.20.1", + "@toruslabs/eslint-config-typescript": "1.2.0", "@toruslabs/openlogin": "^2.8.0", "@toruslabs/torus-scripts": "^1.3.0", - "@toruslabs/eslint-config-typescript": "1.2.0", - "@typescript-eslint/eslint-plugin": "^5.44.0", - "@typescript-eslint/parser": "^5.44.0", "@types/node": "^16", "@types/react-native": "^0.69.3", + "@typescript-eslint/eslint-plugin": "^5.44.0", + "@typescript-eslint/parser": "^5.44.0", "eslint": "^8.28.0", "eslint-plugin-import": "^2.26.0", "eslint-plugin-mocha": "^10.1.0", @@ -66,6 +67,7 @@ "husky": "^8.0.2", "lint-staged": "^13.0.3", "prettier": "^2.8.0", + "react-native": "~0.68.2", "rimraf": "^3.0.2", "typescript": "^4.9.3" } diff --git a/src/Web3Auth.ts b/src/Web3Auth.ts index 823cb35..90544da 100644 --- a/src/Web3Auth.ts +++ b/src/Web3Auth.ts @@ -1,22 +1,34 @@ import base64url from "base64url"; import log from "loglevel"; import { URL } from "react-native-url-polyfill"; +import EventEmitter from 'events'; import { IWebBrowser } from "./types/IWebBrowser"; import { SdkInitParams, SdkLoginParams, SdkLogoutParams } from "./types/sdk"; import { State } from "./types/State"; +import { SessionManagement } from "./session/SessionManagment"; +import { Web3AuthApi } from "./api/Web3AuthApi"; +import { ShareMetadata } from "./api/model"; +import { SecureStore } from "./types/IExpoSecureStore"; +import { EncryptedStorage } from "./types/IEncryptedStorage"; +import KeyStore from "./session/KeyStore"; class Web3Auth { initParams: SdkInitParams; - webBrowser: IWebBrowser; + sessionResponse: EventEmitter; + keyStore: KeyStore; - constructor(webBrowser: IWebBrowser, initParams: SdkInitParams) { + constructor(webBrowser: IWebBrowser, storage: SecureStore|EncryptedStorage, initParams: SdkInitParams) { this.initParams = initParams; if (!this.initParams.sdkUrl) { this.initParams.sdkUrl = "https://sdk.openlogin.com"; } this.webBrowser = webBrowser; + this.sessionResponse = new EventEmitter(); + this.keyStore = new KeyStore(storage); + + this.authorizeSession(); } async login(options: SdkLoginParams): Promise { @@ -29,10 +41,14 @@ class Web3Auth { const fragment = new URL(result.url).hash; const decodedPayload = base64url.decode(fragment); const state = JSON.parse(decodedPayload); + + await this.keyStore.set("sessionId", state?.sessionId); + return state; } async logout(options: SdkLogoutParams): Promise { + this.sessionTimeout(); const result = await this.request("logout", options.redirectUrl, options); if (result.type !== "success" || !result.url) { log.error(`[Web3Auth] logout flow failed with error type ${result.type}`); @@ -70,6 +86,75 @@ class Web3Auth { return this.webBrowser.openAuthSessionAsync(url.href, redirectUrl); } + + async authorizeSession() { + const sessionId = await this.keyStore.get("sessionId"); + if (sessionId && sessionId.length > 0) { + var pubKey = SessionManagement.getPubKey(sessionId); + var response = await Web3AuthApi.authorizeSession(pubKey); + var shareMetadata = JSON.parse(response.message) as ShareMetadata; + + this.keyStore.set("ephemPublicKey", shareMetadata.ephemPublicKey); + this.keyStore.set("ivKey", shareMetadata.iv); + this.keyStore.set("mac", shareMetadata.mac); + + var session = new SessionManagement( + sessionId, + shareMetadata.ephemPublicKey, + shareMetadata.iv + ); + var web3AuthResponse = JSON.parse(session.decrypt(shareMetadata.ciphertext)); + web3AuthResponse["userInfo"] = web3AuthResponse["store"] + delete web3AuthResponse['store']; + + if (!web3AuthResponse.error) { + web3AuthResponse = web3AuthResponse as State; + if (web3AuthResponse.privKey && web3AuthResponse.privKey.trim('0').length > 0) { + this.sessionResponse.emit("login", web3AuthResponse); + } + } else { + throw new Error(`session recovery failed with error ${web3AuthResponse.error}`); + } + } + } + + async sessionTimeout() { + const sessionId = await this.keyStore.get("sessionId"); + if (sessionId && sessionId.length > 0) { + var ephemKey = await this.keyStore.get("ephemPublicKey"); + var ivKey = await this.keyStore.get("ivKey"); + var mac = await this.keyStore.get("mac"); + + if (ephemKey?.length == 0 && ivKey?.length == 0) + return; + + var session = new SessionManagement( + sessionId, + ephemKey, + ivKey + ); + + var encryptedData = session.encrypt(""); + var encryptedMetadata: ShareMetadata = { + iv: ivKey, + ephemPublicKey: ephemKey, + ciphertext: encryptedData, + mac: mac + }; + var jsonData = JSON.stringify(encryptedMetadata); + + try { + await Web3AuthApi.logout({ + key: SessionManagement.getPubKey(sessionId), + data: jsonData, + signature: SessionManagement.getECDSASignature(sessionId, jsonData), + timeout: 1 + }); + } catch (ex) { + console.log(ex); + } + } + } } export default Web3Auth; diff --git a/src/api/Web3AuthApi.ts b/src/api/Web3AuthApi.ts new file mode 100644 index 0000000..915791b --- /dev/null +++ b/src/api/Web3AuthApi.ts @@ -0,0 +1,24 @@ +import { LogoutApiRequest, StoreApiResponse } from "./model"; + +export abstract class Web3AuthApi { + static baseUrl = "https://broadcast-server.tor.us"; + + static async authorizeSession(key: String): Promise { + const response = await fetch(`${this.baseUrl}/store/get?key=` + key, { + method: 'GET' + }); + + return await response.json(); + } + + static async logout(logoutApiRequest: LogoutApiRequest): Promise { + const response = await fetch(`${this.baseUrl}/store/set`, { + method: 'POST', + body: JSON.stringify({ + logoutApiRequest + }) + }); + + return await response.json(); + } +} \ No newline at end of file diff --git a/src/api/model.ts b/src/api/model.ts new file mode 100644 index 0000000..65cdf98 --- /dev/null +++ b/src/api/model.ts @@ -0,0 +1,18 @@ +export interface StoreApiResponse { + message?: string; + success: boolean; +} + +export interface LogoutApiRequest { + key?: string; + data?: string; + signature?: string; + timeout: number; +} + +export interface ShareMetadata { + iv: string; + ephemPublicKey: string; + ciphertext: string; + mac: string; +} \ No newline at end of file diff --git a/src/session/KeyStore.ts b/src/session/KeyStore.ts new file mode 100644 index 0000000..8e63a7c --- /dev/null +++ b/src/session/KeyStore.ts @@ -0,0 +1,34 @@ +import { EncryptedStorage } from "../types/IEncryptedStorage"; +import { SecureStore } from "../types/IExpoSecureStore"; + +export default class KeyStore { + storage: SecureStore|EncryptedStorage; + + constructor(storage: SecureStore|EncryptedStorage) { + this.storage = storage; + } + + async get(key: string) { + if ('getItemAsync' in this.storage) { + return (this.storage as SecureStore).getItemAsync(key, {}); + } else { + return (this.storage as EncryptedStorage).getItem(key); + } + } + + async set(key: string, value: string) { + if ('setItemAsync' in this.storage) { + return (this.storage as SecureStore).setItemAsync(key, value, {}); + } else { + return (this.storage as EncryptedStorage).setItem(key, value); + } + } + + async remove(key: string) { + if ('deleteItemAsync' in this.storage) { + return (this.storage as SecureStore).deleteItemAsync(key, {}); + } else { + return (this.storage as EncryptedStorage).removeItem(key); + } + } +} \ No newline at end of file diff --git a/src/session/SessionManagment.ts b/src/session/SessionManagment.ts new file mode 100644 index 0000000..f548791 --- /dev/null +++ b/src/session/SessionManagment.ts @@ -0,0 +1,90 @@ +import * as CryptoJS from 'crypto-js'; +import secp256k1 from '@wangshijun/secp256k1'; + +CryptoJS.enc.Uint8Array = { + parse: function (u8Array: Uint8Array) { + var words = [], i = 0, len = u8Array.length; + + while (i < len) { + words.push( + (u8Array[i++] << 24) | + (u8Array[i++] << 16) | + (u8Array[i++] << 8) | + (u8Array[i++]) + ); + } + + return { + sigBytes: words.length * 4, + words: words + }; + }, + + stringify: function (words: CryptoJS.Words) { + const dataArray = new Uint8Array(words.sigBytes); + for (let i = 0x0; i < words.sigBytes; i++) { + dataArray[i] = words.words[i >>> 0x2] >>> 0x18 - i % 0x4 * 0x8 & 0xff; + } + return new Uint8Array(dataArray); + } +} + +function Uint8ArrayToHex(uint8: Uint8Array) { + return Array.from(uint8).map(function(i) { + return ('0' + i.toString(16)).slice(-2); + }).join(''); +} + +function HexToUint8Array(hex: string) { + return Uint8Array.from(hex.match(/.{1,2}/g).map((byte) => parseInt(byte, 16))); +} + + +export class SessionManagement { + key: CryptoJS.Words; + iv: CryptoJS.Words; + + constructor(privateKeyHex: string, ephemPublicKeyHex: string, encryptionIvHex: string) { + const ecdhPointX = secp256k1.ecdh(HexToUint8Array(ephemPublicKeyHex), HexToUint8Array(privateKeyHex), { + hashfn : function(x: any, y: any) { + const pubKey = new Uint8Array(32); + pubKey.set(x, 0); + return pubKey; + } + }, new Uint8Array(32) + ); + + this.key = CryptoJS.enc.Uint8Array.parse( + CryptoJS.SHA512(CryptoJS.enc.Uint8Array.parse(ecdhPointX)).toString(CryptoJS.enc.Uint8Array).subarray(0, 32) + ); + this.iv = CryptoJS.enc.Hex.parse(encryptionIvHex); + } + + decrypt(text: string) { + const data = CryptoJS.enc.Base64.stringify( + CryptoJS.enc.Hex.parse(text) + ); + + var decrypted = CryptoJS.AES.decrypt(data, this.key, {iv: this.iv}); + return decrypted.toString(CryptoJS.enc.Utf8); + } + + encrypt(text: string) { + var encrypted = CryptoJS.AES.encrypt(text, this.key, {iv: this.iv}); + return encrypted.toString(CryptoJS.enc.Utf8); + } + + static getPubKey(privateKey: string): string { + const pubKey = secp256k1.publicKeyCreate(CryptoJS.enc.Hex.parse(privateKey).toString(CryptoJS.enc.Uint8Array), false); + return Uint8ArrayToHex(pubKey); + } + + static getECDSASignature(privateKey: string, data: string): string { + var privKey = CryptoJS.enc.Hex.parse(privateKey) + var sign = secp256k1.ecdsaSign( + CryptoJS.SHA3(data, { outputLength: 256 }).toString(CryptoJS.enc.Uint8Array), privKey.toString(CryptoJS.enc.Uint8Array) + ); + var signature = CryptoJS.enc.Uint8Array.parse(sign.signature); + return CryptoJS.enc.Hex.stringify(signature); + } +} \ No newline at end of file diff --git a/src/types/IEncryptedStorage.ts b/src/types/IEncryptedStorage.ts new file mode 100644 index 0000000..0aa4585 --- /dev/null +++ b/src/types/IEncryptedStorage.ts @@ -0,0 +1,56 @@ +export type StorageErrorCallback = (error?: Error) => void; +export type StorageValueCallback = (error?: Error, value?: string) => void; + +export type EncryptedStorage = { + /** + * Writes data to the disk, using SharedPreferences or KeyChain, depending on the platform. + * @param {string} key - A string that will be associated to the value for later retrieval. + * @param {string} value - The data to store. + */ + setItem(key: string, value: string): Promise; + + /** + * Writes data to the disk, using SharedPreferences or KeyChain, depending on the platform. + * @param {string} key - A string that will be associated to the value for later retrieval. + * @param {string} value - The data to store. + * @param {Function} cb - The function to call when the operation completes. + */ + setItem(key: string, value: string, cb: StorageErrorCallback): void; + + /** + * Retrieves data from the disk, using SharedPreferences or KeyChain, depending on the platform and returns it as the specified type. + * @param {string} key - A string that is associated to a value. + */ + getItem(key: string): Promise; + + /** + * Retrieves data from the disk, using SharedPreferences or KeyChain, depending on the platform and returns it as the specified type. + * @param {string} key - A string that is associated to a value. + * @param {Function} cb - The function to call when the operation completes. + */ + getItem(key: string, cb: StorageValueCallback): void; + + /** + * Deletes data from the disk, using SharedPreferences or KeyChain, depending on the platform. + * @param {string} key - A string that is associated to a value. + */ + removeItem(key: string): Promise; + + /** + * Deletes data from the disk, using SharedPreferences or KeyChain, depending on the platform. + * @param {string} key - A string that is associated to a value. + * @param {Function} cb - The function to call when the operation completes. + */ + removeItem(key: string, cb: StorageErrorCallback): void; + + /** + * Clears all data from disk, using SharedPreferences or KeyChain, depending on the platform. + */ + clear(): Promise; + + /** + * Clears all data from disk, using SharedPreferences or KeyChain, depending on the platform. + * @param {Function} cb - The function to call when the operation completes. + */ + clear(cb: StorageErrorCallback): void; +} \ No newline at end of file diff --git a/src/types/IExpoSecureStore.ts b/src/types/IExpoSecureStore.ts new file mode 100644 index 0000000..f528701 --- /dev/null +++ b/src/types/IExpoSecureStore.ts @@ -0,0 +1,116 @@ +export const ExpoSecureStore: any = {}; +export type KeychainAccessibilityConstant = number; + +// @needsAudit +/** + * The data in the keychain item cannot be accessed after a restart until the device has been + * unlocked once by the user. This may be useful if you need to access the item when the phone + * is locked. + */ +export const AFTER_FIRST_UNLOCK: KeychainAccessibilityConstant = ExpoSecureStore.AFTER_FIRST_UNLOCK; + +// @needsAudit +/** + * Similar to `AFTER_FIRST_UNLOCK`, except the entry is not migrated to a new device when restoring + * from a backup. + */ +export const AFTER_FIRST_UNLOCK_THIS_DEVICE_ONLY: KeychainAccessibilityConstant = ExpoSecureStore.AFTER_FIRST_UNLOCK_THIS_DEVICE_ONLY; + +// @needsAudit +/** + * The data in the keychain item can always be accessed regardless of whether the device is locked. + * This is the least secure option. + */ +export const ALWAYS: KeychainAccessibilityConstant = ExpoSecureStore.ALWAYS; + +// @needsAudit +/** + * Similar to `WHEN_UNLOCKED_THIS_DEVICE_ONLY`, except the user must have set a passcode in order to + * store an entry. If the user removes their passcode, the entry will be deleted. + */ +export const WHEN_PASSCODE_SET_THIS_DEVICE_ONLY: KeychainAccessibilityConstant = ExpoSecureStore.WHEN_PASSCODE_SET_THIS_DEVICE_ONLY; + +// @needsAudit +/** + * Similar to `ALWAYS`, except the entry is not migrated to a new device when restoring from a backup. + */ +export const ALWAYS_THIS_DEVICE_ONLY: KeychainAccessibilityConstant = ExpoSecureStore.ALWAYS_THIS_DEVICE_ONLY; + +// @needsAudit +/** + * The data in the keychain item can be accessed only while the device is unlocked by the user. + */ +export const WHEN_UNLOCKED: KeychainAccessibilityConstant = ExpoSecureStore.WHEN_UNLOCKED; + +// @needsAudit +/** + * Similar to `WHEN_UNLOCKED`, except the entry is not migrated to a new device when restoring from + * a backup. + */ +export const WHEN_UNLOCKED_THIS_DEVICE_ONLY: KeychainAccessibilityConstant = ExpoSecureStore.WHEN_UNLOCKED_THIS_DEVICE_ONLY; + + +export type SecureStoreOptions = { + /** + * - iOS: The item's service, equivalent to `kSecAttrService` + * - Android: Equivalent of the public/private key pair `Alias` + * > If the item is set with the `keychainService` option, it will be required to later fetch the value. + */ + keychainService?: string; + /** + * Option responsible for enabling the usage of the user authentication methods available on the device while + * accessing data stored in SecureStore. + * - iOS: Equivalent to `kSecAccessControlBiometryCurrentSet` + * - Android: Equivalent to `setUserAuthenticationRequired(true)` (requires API 23). + * Complete functionality is unlocked only with a freshly generated key - this would not work in tandem with the `keychainService` + * value used for the others non-authenticated operations. + */ + requireAuthentication?: boolean; + /** + * Custom message displayed to the user while `requireAuthentication` option is turned on. + */ + authenticationPrompt?: string; + /** + * Specifies when the stored entry is accessible, using iOS's `kSecAttrAccessible` property. + * @see Apple's documentation on [keychain item accessibility](https://developer.apple.com/library/content/documentation/Security/Conceptual/keychainServConcepts/02concepts/concepts.html#//apple_ref/doc/uid/TP30000897-CH204-SW18). + * @default SecureStore.WHEN_UNLOCKED + * @platform ios + */ + keychainAccessible?: KeychainAccessibilityConstant; +}; + +export declare type SecureStore = { + /** + * Fetch the stored value associated with the provided key. + * + * @param key The key that was used to store the associated value. + * @param options An [`SecureStoreOptions`](#securestoreoptions) object. + * + * @return A promise that resolves to the previously stored value, or `null` if there is no entry + * for the given key. The promise will reject if an error occurred while retrieving the value. + */ + + getItemAsync(key: string, options: SecureStoreOptions): Promise; + + /** + * Store a key–value pair. + * + * @param key The key to associate with the stored value. Keys may contain alphanumeric characters + * `.`, `-`, and `_`. + * @param value The value to store. Size limit is 2048 bytes. + * @param options An [`SecureStoreOptions`](#securestoreoptions) object. + * + * @return A promise that will reject if value cannot be stored on the device. + */ + setItemAsync(key: string, value: string, options: SecureStoreOptions): Promise; + + /** + * Delete the value associated with the provided key. + * + * @param key The key that was used to store the associated value. + * @param options An [`SecureStoreOptions`](#securestoreoptions) object. + * + * @return A promise that will reject if the value couldn't be deleted. + */ + deleteItemAsync(key: string, options: SecureStoreOptions): Promise; +} \ No newline at end of file From 079e1ae0cab6a9126f68ebf9c91b926892a1b452 Mon Sep 17 00:00:00 2001 From: Musab Hussain Date: Thu, 2 Feb 2023 22:00:23 +0500 Subject: [PATCH 2/6] crypto libs updated --- example/metro.config.js | 14 +- example/package-lock.json | 4 + example_general/metro.config.js | 6 + package-lock.json | 451 +++++++++++++++++++------------- package.json | 7 +- src/Web3Auth.ts | 32 +-- src/session/SessionManagment.ts | 90 ------- 7 files changed, 305 insertions(+), 299 deletions(-) delete mode 100644 src/session/SessionManagment.ts diff --git a/example/metro.config.js b/example/metro.config.js index 9b182a5..bf318a1 100644 --- a/example/metro.config.js +++ b/example/metro.config.js @@ -28,10 +28,16 @@ module.exports = { ) ), - extraNodeModules: modules.reduce((acc, name) => { - acc[name] = path.join(__dirname, "node_modules", name); - return acc; - }, {}), + extraNodeModules: { + ... { + stream: path.join(__dirname, "node_modules", 'stream-browserify'), + crypto: path.join(__dirname, "node_modules", 'crypto-browserify') + }, + ... modules.reduce((acc, name) => { + acc[name] = path.join(__dirname, "node_modules", name); + return acc; + }, {}) + }, }, transformer: { diff --git a/example/package-lock.json b/example/package-lock.json index 503e9fb..bc24247 100644 --- a/example/package-lock.json +++ b/example/package-lock.json @@ -35,9 +35,11 @@ "version": "3.3.0", "license": "MIT", "dependencies": { + "@toruslabs/metadata-helpers": "^3.0.0", "@wangshijun/secp256k1": "^4.0.3", "base64url": "^3.0.1", "buffer": "^6.0.3", + "crypto-browserify": "^3.12.0", "crypto-js": "^4.1.1", "loglevel": "^1.8.1", "react-native-url-polyfill": "^1.3.0" @@ -30962,6 +30964,7 @@ "requires": { "@babel/runtime": "^7.20.1", "@toruslabs/eslint-config-typescript": "1.2.0", + "@toruslabs/metadata-helpers": "^3.0.0", "@toruslabs/openlogin": "^2.8.0", "@toruslabs/torus-scripts": "^1.3.0", "@types/node": "^16", @@ -30971,6 +30974,7 @@ "@wangshijun/secp256k1": "^4.0.3", "base64url": "^3.0.1", "buffer": "^6.0.3", + "crypto-browserify": "^3.12.0", "crypto-js": "^4.1.1", "eslint": "^8.28.0", "eslint-plugin-import": "^2.26.0", diff --git a/example_general/metro.config.js b/example_general/metro.config.js index e91aba9..4ca86f8 100644 --- a/example_general/metro.config.js +++ b/example_general/metro.config.js @@ -12,6 +12,12 @@ module.exports = { experimentalImportSupport: false, inlineRequires: true, }, + extraNodeModules: { + ... { + stream: path.join(__dirname, "node_modules", 'stream-browserify'), + crypto: path.join(__dirname, "node_modules", 'crypto-browserify') + } + }, }), }, }; diff --git a/package-lock.json b/package-lock.json index e4d0b39..df2ec5f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,12 +9,13 @@ "version": "3.3.0", "license": "MIT", "dependencies": { - "@wangshijun/secp256k1": "^4.0.3", + "@toruslabs/metadata-helpers": "^3.0.0", "base64url": "^3.0.1", "buffer": "^6.0.3", - "crypto-js": "^4.1.1", + "crypto-browserify": "^3.12.0", "loglevel": "^1.8.1", - "react-native-url-polyfill": "^1.3.0" + "react-native-url-polyfill": "^1.3.0", + "stream-browserify": "^3.0.0" }, "devDependencies": { "@babel/runtime": "^7.20.1", @@ -3587,7 +3588,6 @@ "version": "1.1.8", "resolved": "https://registry.npmjs.org/@toruslabs/eccrypto/-/eccrypto-1.1.8.tgz", "integrity": "sha512-5dIrO2KVqvnAPOPfJ2m6bnjp9vav9GIcCZXiXRW/bJuIDRLVxJhVvRlleF4oaEZPq5yX5piHq5jVHagNNS0jOQ==", - "dev": true, "hasInstallScript": true, "dependencies": { "acorn": "^8.4.1", @@ -3634,7 +3634,6 @@ "version": "3.2.0", "resolved": "https://registry.npmjs.org/@toruslabs/http-helpers/-/http-helpers-3.2.0.tgz", "integrity": "sha512-fCfvBHfYzd7AyOYlBo7wihh5nj6+4Ik6V5+nI7H63oiKICjMlByTXSauTUa/qm2mjZJn/OmVYeV5guPIgxoW1w==", - "dev": true, "dependencies": { "lodash.merge": "^4.6.2", "loglevel": "^1.8.0" @@ -3653,6 +3652,25 @@ } } }, + "node_modules/@toruslabs/metadata-helpers": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@toruslabs/metadata-helpers/-/metadata-helpers-3.0.0.tgz", + "integrity": "sha512-0eWCIbKpaBx3/z3BDyWebxUisCS37Uxb0zxOEWizSXjGH/T6TJCrBeZFPmANN3hq47GoNCsRiku9cgfij1UMTQ==", + "dependencies": { + "@toruslabs/eccrypto": "^1.1.8", + "@toruslabs/http-helpers": "^3.0.0", + "elliptic": "^6.5.4", + "json-stable-stringify": "^1.0.1", + "keccak": "^3.0.2" + }, + "engines": { + "node": ">=14.17.0", + "npm": ">=6.x" + }, + "peerDependencies": { + "@babel/runtime": "7.x" + } + }, "node_modules/@toruslabs/openlogin": { "version": "2.8.0", "resolved": "https://registry.npmjs.org/@toruslabs/openlogin/-/openlogin-2.8.0.tgz", @@ -3690,6 +3708,20 @@ "@babel/runtime": "7.x" } }, + "node_modules/@toruslabs/openlogin-jrpc/node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/@toruslabs/openlogin-utils": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/@toruslabs/openlogin-utils/-/openlogin-utils-2.1.0.tgz", @@ -4252,17 +4284,6 @@ "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@wangshijun/secp256k1": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@wangshijun/secp256k1/-/secp256k1-4.0.3.tgz", - "integrity": "sha512-07nXubNoGKpnJruT9wNGS4PP6+5qYKA+psd0Tdh/XVqkDf+S+MQ2y9o7Fh8g8pg/ScfPCgjL1O4N+w/21pQY+w==", - "dependencies": { - "elliptic": "^6.5.2" - }, - "engines": { - "node": ">=10.0.0" - } - }, "node_modules/@webassemblyjs/ast": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", @@ -4489,7 +4510,6 @@ "version": "8.8.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz", "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==", - "dev": true, "bin": { "acorn": "bin/acorn" }, @@ -4872,7 +4892,6 @@ "version": "5.4.1", "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", - "dev": true, "dependencies": { "bn.js": "^4.0.0", "inherits": "^2.0.1", @@ -4883,8 +4902,7 @@ "node_modules/asn1.js/node_modules/bn.js": { "version": "4.12.0", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" }, "node_modules/assert": { "version": "2.0.0", @@ -5170,7 +5188,6 @@ "version": "1.5.0", "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", - "dev": true, "optional": true, "dependencies": { "file-uri-to-path": "1.0.0" @@ -5180,14 +5197,12 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", - "dev": true, "optional": true }, "node_modules/bip66": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/bip66/-/bip66-1.1.5.tgz", "integrity": "sha512-nemMHz95EmS38a26XbbdxIYj5csHd3RMP3H5bwQknX0WYHF01qhpufP42mLOwVICuH2JmhIhXiWs89MfUGL7Xw==", - "dev": true, "optional": true, "dependencies": { "safe-buffer": "^5.0.1" @@ -5226,11 +5241,23 @@ "ieee754": "^1.1.13" } }, + "node_modules/bl/node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/bn.js": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", - "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", - "dev": true + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" }, "node_modules/boxen": { "version": "5.1.2", @@ -5314,7 +5341,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", - "dev": true, "dependencies": { "buffer-xor": "^1.0.3", "cipher-base": "^1.0.0", @@ -5328,7 +5354,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", - "dev": true, "dependencies": { "browserify-aes": "^1.0.4", "browserify-des": "^1.0.0", @@ -5339,7 +5364,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", - "dev": true, "dependencies": { "cipher-base": "^1.0.1", "des.js": "^1.0.0", @@ -5351,7 +5375,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", - "dev": true, "dependencies": { "bn.js": "^5.0.0", "randombytes": "^2.0.1" @@ -5361,7 +5384,6 @@ "version": "4.2.1", "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", - "dev": true, "dependencies": { "bn.js": "^5.1.1", "browserify-rsa": "^4.0.1", @@ -5374,11 +5396,23 @@ "safe-buffer": "^5.2.0" } }, + "node_modules/browserify-sign/node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/browserify-sign/node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true, "funding": [ { "type": "github", @@ -5460,8 +5494,7 @@ "node_modules/buffer-xor": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==", - "dev": true + "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==" }, "node_modules/builtin-status-codes": { "version": "3.0.0", @@ -5697,7 +5730,6 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", - "dev": true, "dependencies": { "inherits": "^2.0.1", "safe-buffer": "^5.0.1" @@ -6227,7 +6259,6 @@ "version": "4.0.4", "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", - "dev": true, "dependencies": { "bn.js": "^4.1.0", "elliptic": "^6.5.3" @@ -6236,14 +6267,12 @@ "node_modules/create-ecdh/node_modules/bn.js": { "version": "4.12.0", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" }, "node_modules/create-hash": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", - "dev": true, "dependencies": { "cipher-base": "^1.0.1", "inherits": "^2.0.1", @@ -6256,7 +6285,6 @@ "version": "1.1.7", "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", - "dev": true, "dependencies": { "cipher-base": "^1.0.3", "create-hash": "^1.1.0", @@ -6284,7 +6312,6 @@ "version": "3.12.0", "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", - "dev": true, "dependencies": { "browserify-cipher": "^1.0.0", "browserify-sign": "^4.0.0", @@ -6302,11 +6329,6 @@ "node": "*" } }, - "node_modules/crypto-js": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.1.1.tgz", - "integrity": "sha512-o2JlM7ydqd3Qk9CA0L4NL6mTzU2sdx96a+oOfPu8Mkl/PK51vSyoi8/rQ8NknZtk44vq15lmhAj9CIAGwgeWKw==" - }, "node_modules/crypto-random-string": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", @@ -6515,7 +6537,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", - "dev": true, "dependencies": { "inherits": "^2.0.1", "minimalistic-assert": "^1.0.0" @@ -6534,7 +6555,6 @@ "version": "5.0.3", "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", - "dev": true, "dependencies": { "bn.js": "^4.1.0", "miller-rabin": "^4.0.0", @@ -6544,8 +6564,7 @@ "node_modules/diffie-hellman/node_modules/bn.js": { "version": "4.12.0", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" }, "node_modules/dir-glob": { "version": "3.0.1", @@ -6596,7 +6615,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/drbg.js/-/drbg.js-1.0.1.tgz", "integrity": "sha512-F4wZ06PvqxYLFEZKkFxTDcns9oFNk34hvmJSEwdzsxVQ8YI5YaxtACgQatkYgv2VI2CFkUd2Y+xosPQnHv809g==", - "dev": true, "optional": true, "dependencies": { "browserify-aes": "^1.0.6", @@ -6830,8 +6848,7 @@ "node_modules/es6-promise": { "version": "4.2.8", "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", - "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", - "dev": true + "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==" }, "node_modules/escalade": { "version": "3.1.1", @@ -7675,7 +7692,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", - "dev": true, "dependencies": { "md5.js": "^1.3.4", "safe-buffer": "^5.1.1" @@ -8668,7 +8684,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", - "dev": true, "dependencies": { "inherits": "^2.0.4", "readable-stream": "^3.6.0", @@ -8678,11 +8693,23 @@ "node": ">=4" } }, + "node_modules/hash-base/node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/hash-base/node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true, "funding": [ { "type": "github", @@ -10046,6 +10073,17 @@ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true }, + "node_modules/json-stable-stringify": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.2.tgz", + "integrity": "sha512-eunSSaEnxV12z+Z73y/j5N37/In40GK4GmsSy+tEHJMxknvqnA7/djeYtAgW0GsWHUfg+847WJjKaEylk2y09g==", + "dependencies": { + "jsonify": "^0.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", @@ -10071,11 +10109,18 @@ "graceful-fs": "^4.1.6" } }, + "node_modules/jsonify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.1.tgz", + "integrity": "sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/keccak": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/keccak/-/keccak-3.0.2.tgz", "integrity": "sha512-PyKKjkH53wDMLGrvmRGSNWgmSxZOUqbnXwKL9tmgbFYA1iAYqW21kfR7mZXV0MlESiefxQQE9X9fTa3X+2MPDQ==", - "dev": true, "hasInstallScript": true, "dependencies": { "node-addon-api": "^2.0.0", @@ -10086,6 +10131,19 @@ "node": ">=10.0.0" } }, + "node_modules/keccak/node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/keyv": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", @@ -10307,8 +10365,7 @@ "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" }, "node_modules/lodash.mergewith": { "version": "4.6.2", @@ -10515,7 +10572,6 @@ "version": "1.3.5", "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", - "dev": true, "dependencies": { "hash-base": "^3.0.0", "inherits": "^2.0.1", @@ -10978,7 +11034,6 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", - "dev": true, "dependencies": { "bn.js": "^4.0.0", "brorand": "^1.0.1" @@ -10990,8 +11045,7 @@ "node_modules/miller-rabin/node_modules/bn.js": { "version": "4.12.0", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" }, "node_modules/mime": { "version": "2.6.0", @@ -11116,8 +11170,7 @@ "node_modules/nan": { "version": "2.16.0", "resolved": "https://registry.npmjs.org/nan/-/nan-2.16.0.tgz", - "integrity": "sha512-UdAqHyFngu7TfQKsCBgAA6pWDkT8MAO7d0jyOecVhN5354xbLqdn8mV9Tat9gepAupm0bt2DbeaSC8vS52MuFA==", - "dev": true + "integrity": "sha512-UdAqHyFngu7TfQKsCBgAA6pWDkT8MAO7d0jyOecVhN5354xbLqdn8mV9Tat9gepAupm0bt2DbeaSC8vS52MuFA==" }, "node_modules/nanomatch": { "version": "1.2.13", @@ -11211,8 +11264,7 @@ "node_modules/node-addon-api": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz", - "integrity": "sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==", - "dev": true + "integrity": "sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==" }, "node_modules/node-dir": { "version": "0.1.17", @@ -11248,7 +11300,6 @@ "version": "4.5.0", "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.5.0.tgz", "integrity": "sha512-2iGbaQBV+ITgCz76ZEjmhUKAKVf7xfY1sRl4UiKQspfZMH2h06SyhNsnSVy50cwkFQDGLyif6m/6uFXHkOZ6rg==", - "dev": true, "bin": { "node-gyp-build": "bin.js", "node-gyp-build-optional": "optional.js", @@ -11795,7 +11846,6 @@ "version": "5.1.6", "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", - "dev": true, "dependencies": { "asn1.js": "^5.2.0", "browserify-aes": "^1.0.0", @@ -11923,7 +11973,6 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", - "dev": true, "dependencies": { "create-hash": "^1.1.2", "create-hmac": "^1.1.4", @@ -12267,7 +12316,6 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", - "dev": true, "dependencies": { "bn.js": "^4.1.0", "browserify-rsa": "^4.0.0", @@ -12280,8 +12328,7 @@ "node_modules/public-encrypt/node_modules/bn.js": { "version": "4.12.0", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" }, "node_modules/pump": { "version": "3.0.0", @@ -12385,7 +12432,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, "dependencies": { "safe-buffer": "^5.1.0" } @@ -12394,7 +12440,6 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", - "dev": true, "dependencies": { "randombytes": "^2.0.5", "safe-buffer": "^5.1.0" @@ -12604,19 +12649,6 @@ "react": "^16.0.0 || ^17.0.0" } }, - "node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/readline": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/readline/-/readline-1.3.0.tgz", @@ -13242,7 +13274,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", - "dev": true, "dependencies": { "hash-base": "^3.0.0", "inherits": "^2.0.1" @@ -13320,8 +13351,7 @@ "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "node_modules/sax": { "version": "1.2.4", @@ -13394,7 +13424,6 @@ "version": "3.8.0", "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-3.8.0.tgz", "integrity": "sha512-k5ke5avRZbtl9Tqx/SA7CbY3NF6Ro+Sj9cZxezFzuBlLDmyqPiL8hJJ+EmzD8Ig4LUDByHJ3/iPOVoRixs/hmw==", - "dev": true, "hasInstallScript": true, "optional": true, "dependencies": { @@ -13415,7 +13444,6 @@ "version": "4.12.0", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true, "optional": true }, "node_modules/semver": { @@ -13587,7 +13615,6 @@ "version": "2.4.11", "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", - "dev": true, "dependencies": { "inherits": "^2.0.1", "safe-buffer": "^5.0.1" @@ -14151,12 +14178,24 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-3.0.0.tgz", "integrity": "sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==", - "dev": true, "dependencies": { "inherits": "~2.0.4", "readable-stream": "^3.5.0" } }, + "node_modules/stream-browserify/node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/stream-buffers": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/stream-buffers/-/stream-buffers-2.2.0.tgz", @@ -14177,6 +14216,20 @@ "xtend": "^4.0.2" } }, + "node_modules/stream-http/node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/strict-uri-encode": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz", @@ -18536,7 +18589,6 @@ "version": "1.1.8", "resolved": "https://registry.npmjs.org/@toruslabs/eccrypto/-/eccrypto-1.1.8.tgz", "integrity": "sha512-5dIrO2KVqvnAPOPfJ2m6bnjp9vav9GIcCZXiXRW/bJuIDRLVxJhVvRlleF4oaEZPq5yX5piHq5jVHagNNS0jOQ==", - "dev": true, "requires": { "acorn": "^8.4.1", "elliptic": "^6.5.4", @@ -18563,12 +18615,23 @@ "version": "3.2.0", "resolved": "https://registry.npmjs.org/@toruslabs/http-helpers/-/http-helpers-3.2.0.tgz", "integrity": "sha512-fCfvBHfYzd7AyOYlBo7wihh5nj6+4Ik6V5+nI7H63oiKICjMlByTXSauTUa/qm2mjZJn/OmVYeV5guPIgxoW1w==", - "dev": true, "requires": { "lodash.merge": "^4.6.2", "loglevel": "^1.8.0" } }, + "@toruslabs/metadata-helpers": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@toruslabs/metadata-helpers/-/metadata-helpers-3.0.0.tgz", + "integrity": "sha512-0eWCIbKpaBx3/z3BDyWebxUisCS37Uxb0zxOEWizSXjGH/T6TJCrBeZFPmANN3hq47GoNCsRiku9cgfij1UMTQ==", + "requires": { + "@toruslabs/eccrypto": "^1.1.8", + "@toruslabs/http-helpers": "^3.0.0", + "elliptic": "^6.5.4", + "json-stable-stringify": "^1.0.1", + "keccak": "^3.0.2" + } + }, "@toruslabs/openlogin": { "version": "2.8.0", "resolved": "https://registry.npmjs.org/@toruslabs/openlogin/-/openlogin-2.8.0.tgz", @@ -18598,6 +18661,19 @@ "once": "^1.4.0", "pump": "^3.0.0", "readable-stream": "^3.6.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } } }, "@toruslabs/openlogin-utils": { @@ -19015,14 +19091,6 @@ "eslint-visitor-keys": "^3.3.0" } }, - "@wangshijun/secp256k1": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@wangshijun/secp256k1/-/secp256k1-4.0.3.tgz", - "integrity": "sha512-07nXubNoGKpnJruT9wNGS4PP6+5qYKA+psd0Tdh/XVqkDf+S+MQ2y9o7Fh8g8pg/ScfPCgjL1O4N+w/21pQY+w==", - "requires": { - "elliptic": "^6.5.2" - } - }, "@webassemblyjs/ast": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", @@ -19229,8 +19297,7 @@ "acorn": { "version": "8.8.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz", - "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==", - "dev": true + "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==" }, "acorn-import-assertions": { "version": "1.8.0", @@ -19514,7 +19581,6 @@ "version": "5.4.1", "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", - "dev": true, "requires": { "bn.js": "^4.0.0", "inherits": "^2.0.1", @@ -19525,8 +19591,7 @@ "bn.js": { "version": "4.12.0", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" } } }, @@ -19745,7 +19810,6 @@ "version": "1.5.0", "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", - "dev": true, "optional": true, "requires": { "file-uri-to-path": "1.0.0" @@ -19755,7 +19819,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", - "dev": true, "optional": true } } @@ -19764,7 +19827,6 @@ "version": "1.1.5", "resolved": "https://registry.npmjs.org/bip66/-/bip66-1.1.5.tgz", "integrity": "sha512-nemMHz95EmS38a26XbbdxIYj5csHd3RMP3H5bwQknX0WYHF01qhpufP42mLOwVICuH2JmhIhXiWs89MfUGL7Xw==", - "dev": true, "optional": true, "requires": { "safe-buffer": "^5.0.1" @@ -19788,14 +19850,23 @@ "base64-js": "^1.3.1", "ieee754": "^1.1.13" } + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } } } }, "bn.js": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", - "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", - "dev": true + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" }, "boxen": { "version": "5.1.2", @@ -19863,7 +19934,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", - "dev": true, "requires": { "buffer-xor": "^1.0.3", "cipher-base": "^1.0.0", @@ -19877,7 +19947,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", - "dev": true, "requires": { "browserify-aes": "^1.0.4", "browserify-des": "^1.0.0", @@ -19888,7 +19957,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", - "dev": true, "requires": { "cipher-base": "^1.0.1", "des.js": "^1.0.0", @@ -19900,7 +19968,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", - "dev": true, "requires": { "bn.js": "^5.0.0", "randombytes": "^2.0.1" @@ -19910,7 +19977,6 @@ "version": "4.2.1", "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", - "dev": true, "requires": { "bn.js": "^5.1.1", "browserify-rsa": "^4.0.1", @@ -19923,11 +19989,20 @@ "safe-buffer": "^5.2.0" }, "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, "safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" } } }, @@ -19967,8 +20042,7 @@ "buffer-xor": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==", - "dev": true + "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==" }, "builtin-status-codes": { "version": "3.0.0", @@ -20143,7 +20217,6 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", - "dev": true, "requires": { "inherits": "^2.0.1", "safe-buffer": "^5.0.1" @@ -20565,7 +20638,6 @@ "version": "4.0.4", "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", - "dev": true, "requires": { "bn.js": "^4.1.0", "elliptic": "^6.5.3" @@ -20574,8 +20646,7 @@ "bn.js": { "version": "4.12.0", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" } } }, @@ -20583,7 +20654,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", - "dev": true, "requires": { "cipher-base": "^1.0.1", "inherits": "^2.0.1", @@ -20596,7 +20666,6 @@ "version": "1.1.7", "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", - "dev": true, "requires": { "cipher-base": "^1.0.3", "create-hash": "^1.1.0", @@ -20621,7 +20690,6 @@ "version": "3.12.0", "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", - "dev": true, "requires": { "browserify-cipher": "^1.0.0", "browserify-sign": "^4.0.0", @@ -20636,11 +20704,6 @@ "randomfill": "^1.0.3" } }, - "crypto-js": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.1.1.tgz", - "integrity": "sha512-o2JlM7ydqd3Qk9CA0L4NL6mTzU2sdx96a+oOfPu8Mkl/PK51vSyoi8/rQ8NknZtk44vq15lmhAj9CIAGwgeWKw==" - }, "crypto-random-string": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", @@ -20801,7 +20864,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", - "dev": true, "requires": { "inherits": "^2.0.1", "minimalistic-assert": "^1.0.0" @@ -20816,7 +20878,6 @@ "version": "5.0.3", "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", - "dev": true, "requires": { "bn.js": "^4.1.0", "miller-rabin": "^4.0.0", @@ -20826,8 +20887,7 @@ "bn.js": { "version": "4.12.0", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" } } }, @@ -20868,7 +20928,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/drbg.js/-/drbg.js-1.0.1.tgz", "integrity": "sha512-F4wZ06PvqxYLFEZKkFxTDcns9oFNk34hvmJSEwdzsxVQ8YI5YaxtACgQatkYgv2VI2CFkUd2Y+xosPQnHv809g==", - "dev": true, "optional": true, "requires": { "browserify-aes": "^1.0.6", @@ -21071,8 +21130,7 @@ "es6-promise": { "version": "4.2.8", "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", - "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", - "dev": true + "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==" }, "escalade": { "version": "3.1.1", @@ -21665,7 +21723,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", - "dev": true, "requires": { "md5.js": "^1.3.4", "safe-buffer": "^5.1.1" @@ -22439,18 +22496,26 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", - "dev": true, "requires": { "inherits": "^2.0.4", "readable-stream": "^3.6.0", "safe-buffer": "^5.2.0" }, "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, "safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" } } }, @@ -23449,6 +23514,14 @@ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true }, + "json-stable-stringify": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.2.tgz", + "integrity": "sha512-eunSSaEnxV12z+Z73y/j5N37/In40GK4GmsSy+tEHJMxknvqnA7/djeYtAgW0GsWHUfg+847WJjKaEylk2y09g==", + "requires": { + "jsonify": "^0.0.1" + } + }, "json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", @@ -23468,15 +23541,31 @@ "graceful-fs": "^4.1.6" } }, + "jsonify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.1.tgz", + "integrity": "sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg==" + }, "keccak": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/keccak/-/keccak-3.0.2.tgz", "integrity": "sha512-PyKKjkH53wDMLGrvmRGSNWgmSxZOUqbnXwKL9tmgbFYA1iAYqW21kfR7mZXV0MlESiefxQQE9X9fTa3X+2MPDQ==", - "dev": true, "requires": { "node-addon-api": "^2.0.0", "node-gyp-build": "^4.2.0", "readable-stream": "^3.6.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } } }, "keyv": { @@ -23643,8 +23732,7 @@ "lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" }, "lodash.mergewith": { "version": "4.6.2", @@ -23792,7 +23880,6 @@ "version": "1.3.5", "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", - "dev": true, "requires": { "hash-base": "^3.0.0", "inherits": "^2.0.1", @@ -24195,7 +24282,6 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", - "dev": true, "requires": { "bn.js": "^4.0.0", "brorand": "^1.0.1" @@ -24204,8 +24290,7 @@ "bn.js": { "version": "4.12.0", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" } } }, @@ -24299,8 +24384,7 @@ "nan": { "version": "2.16.0", "resolved": "https://registry.npmjs.org/nan/-/nan-2.16.0.tgz", - "integrity": "sha512-UdAqHyFngu7TfQKsCBgAA6pWDkT8MAO7d0jyOecVhN5354xbLqdn8mV9Tat9gepAupm0bt2DbeaSC8vS52MuFA==", - "dev": true + "integrity": "sha512-UdAqHyFngu7TfQKsCBgAA6pWDkT8MAO7d0jyOecVhN5354xbLqdn8mV9Tat9gepAupm0bt2DbeaSC8vS52MuFA==" }, "nanomatch": { "version": "1.2.13", @@ -24378,8 +24462,7 @@ "node-addon-api": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz", - "integrity": "sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==", - "dev": true + "integrity": "sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==" }, "node-dir": { "version": "0.1.17", @@ -24400,8 +24483,7 @@ "node-gyp-build": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.5.0.tgz", - "integrity": "sha512-2iGbaQBV+ITgCz76ZEjmhUKAKVf7xfY1sRl4UiKQspfZMH2h06SyhNsnSVy50cwkFQDGLyif6m/6uFXHkOZ6rg==", - "dev": true + "integrity": "sha512-2iGbaQBV+ITgCz76ZEjmhUKAKVf7xfY1sRl4UiKQspfZMH2h06SyhNsnSVy50cwkFQDGLyif6m/6uFXHkOZ6rg==" }, "node-int64": { "version": "0.4.0", @@ -24795,7 +24877,6 @@ "version": "5.1.6", "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", - "dev": true, "requires": { "asn1.js": "^5.2.0", "browserify-aes": "^1.0.0", @@ -24900,7 +24981,6 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", - "dev": true, "requires": { "create-hash": "^1.1.2", "create-hmac": "^1.1.4", @@ -25160,7 +25240,6 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", - "dev": true, "requires": { "bn.js": "^4.1.0", "browserify-rsa": "^4.0.0", @@ -25173,8 +25252,7 @@ "bn.js": { "version": "4.12.0", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" } } }, @@ -25244,7 +25322,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, "requires": { "safe-buffer": "^5.1.0" } @@ -25253,7 +25330,6 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", - "dev": true, "requires": { "randombytes": "^2.0.5", "safe-buffer": "^5.1.0" @@ -25419,16 +25495,6 @@ "react-is": "^16.12.0 || ^17.0.0" } }, - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, "readline": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/readline/-/readline-1.3.0.tgz", @@ -25891,7 +25957,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", - "dev": true, "requires": { "hash-base": "^3.0.0", "inherits": "^2.0.1" @@ -25946,8 +26011,7 @@ "safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "sax": { "version": "1.2.4", @@ -26008,7 +26072,6 @@ "version": "3.8.0", "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-3.8.0.tgz", "integrity": "sha512-k5ke5avRZbtl9Tqx/SA7CbY3NF6Ro+Sj9cZxezFzuBlLDmyqPiL8hJJ+EmzD8Ig4LUDByHJ3/iPOVoRixs/hmw==", - "dev": true, "optional": true, "requires": { "bindings": "^1.5.0", @@ -26025,7 +26088,6 @@ "version": "4.12.0", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true, "optional": true } } @@ -26169,7 +26231,6 @@ "version": "2.4.11", "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", - "dev": true, "requires": { "inherits": "^2.0.1", "safe-buffer": "^5.0.1" @@ -26615,10 +26676,21 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-3.0.0.tgz", "integrity": "sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==", - "dev": true, "requires": { "inherits": "~2.0.4", "readable-stream": "^3.5.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } } }, "stream-buffers": { @@ -26636,6 +26708,19 @@ "inherits": "^2.0.4", "readable-stream": "^3.6.0", "xtend": "^4.0.2" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } } }, "strict-uri-encode": { diff --git a/package.json b/package.json index ced3912..49a86df 100644 --- a/package.json +++ b/package.json @@ -36,12 +36,13 @@ "web3auth" ], "dependencies": { - "@wangshijun/secp256k1": "^4.0.3", + "@toruslabs/metadata-helpers": "^3.0.0", "base64url": "^3.0.1", "buffer": "^6.0.3", - "crypto-js": "^4.1.1", + "crypto-browserify": "^3.12.0", "loglevel": "^1.8.1", - "react-native-url-polyfill": "^1.3.0" + "react-native-url-polyfill": "^1.3.0", + "stream-browserify": "^3.0.0" }, "peerDependencies": { "@babel/runtime": "^7.x", diff --git a/src/Web3Auth.ts b/src/Web3Auth.ts index 90544da..5e312bc 100644 --- a/src/Web3Auth.ts +++ b/src/Web3Auth.ts @@ -1,12 +1,14 @@ +(process as any).browser = true; + import base64url from "base64url"; import log from "loglevel"; import { URL } from "react-native-url-polyfill"; import EventEmitter from 'events'; - +import {encryptData, decryptData, keccak256 } from '@toruslabs/metadata-helpers'; +import { getPublic, sign } from "@toruslabs/eccrypto"; import { IWebBrowser } from "./types/IWebBrowser"; import { SdkInitParams, SdkLoginParams, SdkLogoutParams } from "./types/sdk"; import { State } from "./types/State"; -import { SessionManagement } from "./session/SessionManagment"; import { Web3AuthApi } from "./api/Web3AuthApi"; import { ShareMetadata } from "./api/model"; import { SecureStore } from "./types/IExpoSecureStore"; @@ -90,20 +92,18 @@ class Web3Auth { async authorizeSession() { const sessionId = await this.keyStore.get("sessionId"); if (sessionId && sessionId.length > 0) { - var pubKey = SessionManagement.getPubKey(sessionId); + var pubKey = getPublic(Buffer.from(sessionId, "hex")).toString("hex"); var response = await Web3AuthApi.authorizeSession(pubKey); + if (response.success == false) { + return; + } var shareMetadata = JSON.parse(response.message) as ShareMetadata; this.keyStore.set("ephemPublicKey", shareMetadata.ephemPublicKey); this.keyStore.set("ivKey", shareMetadata.iv); this.keyStore.set("mac", shareMetadata.mac); - var session = new SessionManagement( - sessionId, - shareMetadata.ephemPublicKey, - shareMetadata.iv - ); - var web3AuthResponse = JSON.parse(session.decrypt(shareMetadata.ciphertext)); + var web3AuthResponse = await decryptData(sessionId, response.message); web3AuthResponse["userInfo"] = web3AuthResponse["store"] delete web3AuthResponse['store']; @@ -128,13 +128,7 @@ class Web3Auth { if (ephemKey?.length == 0 && ivKey?.length == 0) return; - var session = new SessionManagement( - sessionId, - ephemKey, - ivKey - ); - - var encryptedData = session.encrypt(""); + var encryptedData = await encryptData(sessionId, ""); var encryptedMetadata: ShareMetadata = { iv: ivKey, ephemPublicKey: ephemKey, @@ -142,12 +136,12 @@ class Web3Auth { mac: mac }; var jsonData = JSON.stringify(encryptedMetadata); - + var hashData = keccak256(jsonData); try { await Web3AuthApi.logout({ - key: SessionManagement.getPubKey(sessionId), + key: getPublic(Buffer.from(sessionId, "hex")).toString("hex"), data: jsonData, - signature: SessionManagement.getECDSASignature(sessionId, jsonData), + signature: (await sign(Buffer.from(sessionId, "hex"), hashData)).toString("hex"), timeout: 1 }); } catch (ex) { diff --git a/src/session/SessionManagment.ts b/src/session/SessionManagment.ts deleted file mode 100644 index f548791..0000000 --- a/src/session/SessionManagment.ts +++ /dev/null @@ -1,90 +0,0 @@ -import * as CryptoJS from 'crypto-js'; -import secp256k1 from '@wangshijun/secp256k1'; - -CryptoJS.enc.Uint8Array = { - parse: function (u8Array: Uint8Array) { - var words = [], i = 0, len = u8Array.length; - - while (i < len) { - words.push( - (u8Array[i++] << 24) | - (u8Array[i++] << 16) | - (u8Array[i++] << 8) | - (u8Array[i++]) - ); - } - - return { - sigBytes: words.length * 4, - words: words - }; - }, - - stringify: function (words: CryptoJS.Words) { - const dataArray = new Uint8Array(words.sigBytes); - for (let i = 0x0; i < words.sigBytes; i++) { - dataArray[i] = words.words[i >>> 0x2] >>> 0x18 - i % 0x4 * 0x8 & 0xff; - } - return new Uint8Array(dataArray); - } -} - -function Uint8ArrayToHex(uint8: Uint8Array) { - return Array.from(uint8).map(function(i) { - return ('0' + i.toString(16)).slice(-2); - }).join(''); -} - -function HexToUint8Array(hex: string) { - return Uint8Array.from(hex.match(/.{1,2}/g).map((byte) => parseInt(byte, 16))); -} - - -export class SessionManagement { - key: CryptoJS.Words; - iv: CryptoJS.Words; - - constructor(privateKeyHex: string, ephemPublicKeyHex: string, encryptionIvHex: string) { - const ecdhPointX = secp256k1.ecdh(HexToUint8Array(ephemPublicKeyHex), HexToUint8Array(privateKeyHex), { - hashfn : function(x: any, y: any) { - const pubKey = new Uint8Array(32); - pubKey.set(x, 0); - return pubKey; - } - }, new Uint8Array(32) - ); - - this.key = CryptoJS.enc.Uint8Array.parse( - CryptoJS.SHA512(CryptoJS.enc.Uint8Array.parse(ecdhPointX)).toString(CryptoJS.enc.Uint8Array).subarray(0, 32) - ); - this.iv = CryptoJS.enc.Hex.parse(encryptionIvHex); - } - - decrypt(text: string) { - const data = CryptoJS.enc.Base64.stringify( - CryptoJS.enc.Hex.parse(text) - ); - - var decrypted = CryptoJS.AES.decrypt(data, this.key, {iv: this.iv}); - return decrypted.toString(CryptoJS.enc.Utf8); - } - - encrypt(text: string) { - var encrypted = CryptoJS.AES.encrypt(text, this.key, {iv: this.iv}); - return encrypted.toString(CryptoJS.enc.Utf8); - } - - static getPubKey(privateKey: string): string { - const pubKey = secp256k1.publicKeyCreate(CryptoJS.enc.Hex.parse(privateKey).toString(CryptoJS.enc.Uint8Array), false); - return Uint8ArrayToHex(pubKey); - } - - static getECDSASignature(privateKey: string, data: string): string { - var privKey = CryptoJS.enc.Hex.parse(privateKey) - var sign = secp256k1.ecdsaSign( - CryptoJS.SHA3(data, { outputLength: 256 }).toString(CryptoJS.enc.Uint8Array), privKey.toString(CryptoJS.enc.Uint8Array) - ); - var signature = CryptoJS.enc.Uint8Array.parse(sign.signature); - return CryptoJS.enc.Hex.stringify(signature); - } -} \ No newline at end of file From 96fc0df2cb03552fa22b92bc2b9317ca3567a5df Mon Sep 17 00:00:00 2001 From: Musab Hussain Date: Thu, 2 Feb 2023 22:27:09 +0500 Subject: [PATCH 3/6] dappShare feature --- src/Web3Auth.ts | 33 +++++++++++++++++++++++++++++++-- 1 file changed, 31 insertions(+), 2 deletions(-) diff --git a/src/Web3Auth.ts b/src/Web3Auth.ts index 5e312bc..efe1219 100644 --- a/src/Web3Auth.ts +++ b/src/Web3Auth.ts @@ -34,6 +34,17 @@ class Web3Auth { } async login(options: SdkLoginParams): Promise { + //check for share + if (this.initParams.loginConfig) { + var loginConfigItem = Object.values(this.initParams.loginConfig)[0]; + if (loginConfigItem) { + var share = await this.keyStore.get(loginConfigItem.verifier); + if (share) { + options.dappShare = share + } + } + } + const result = await this.request("login", options.redirectUrl, options); if (result.type !== "success" || !result.url) { log.error(`[Web3Auth] login flow failed with error type ${result.type}`); @@ -42,10 +53,17 @@ class Web3Auth { const fragment = new URL(result.url).hash; const decodedPayload = base64url.decode(fragment); - const state = JSON.parse(decodedPayload); + const state = JSON.parse(decodedPayload) as State; await this.keyStore.set("sessionId", state?.sessionId); + if (state.userInfo?.dappShare.length > 0) { + this.keyStore.set( + state.userInfo?.verifier, + state.userInfo?.dappShare, + ) + } + return state; } @@ -144,8 +162,19 @@ class Web3Auth { signature: (await sign(Buffer.from(sessionId, "hex"), hashData)).toString("hex"), timeout: 1 }); + + this.keyStore.remove("ephemPublicKey"); + this.keyStore.remove("ivKey"); + this.keyStore.remove("mac"); + + if (this.initParams.loginConfig) { + var loginConfigItem = Object.values(this.initParams.loginConfig)[0]; + if (loginConfigItem) { + this.keyStore.remove(loginConfigItem.verifier); + } + } } catch (ex) { - console.log(ex); + log.error(ex); } } } From dd371ce6e5296fd30bfee55089a87c723a8df8d6 Mon Sep 17 00:00:00 2001 From: Musab Hussain Date: Thu, 2 Feb 2023 22:42:19 +0500 Subject: [PATCH 4/6] event emitter changed to promise --- example/App.tsx | 2 +- example_general/App.tsx | 2 +- src/Web3Auth.ts | 14 +++++++------- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/example/App.tsx b/example/App.tsx index aaaac6b..4dd3413 100644 --- a/example/App.tsx +++ b/example/App.tsx @@ -29,7 +29,7 @@ export default function App() { clientId: "BDj1toq1N1xYgDIJ00ADR-QPJ71ESzJcB3ijVHP1TsIX7nsx_lu6uLoJQMPze1vpGDt--Ew95RGxz-RgOh1tcxM", network: OPENLOGIN_NETWORK.TESTNET, }); - web3auth.current.sessionResponse.on("login", function(state: State) { + web3auth.current.init().then(function(state) { setKey(state.privKey || "no key"); setUserInfo(state); }); diff --git a/example_general/App.tsx b/example_general/App.tsx index 659a089..bc38c35 100644 --- a/example_general/App.tsx +++ b/example_general/App.tsx @@ -37,7 +37,7 @@ const App = () => { clientId: "BDj1toq1N1xYgDIJ00ADR-QPJ71ESzJcB3ijVHP1TsIX7nsx_lu6uLoJQMPze1vpGDt--Ew95RGxz-RgOh1tcxM", network: OPENLOGIN_NETWORK.TESTNET, }); - web3auth.current.sessionResponse.on("login", function(state: State) { + web3auth.current.init().then(function(state) { setKey(state.privKey || "no key"); setUserInfo(state); }); diff --git a/src/Web3Auth.ts b/src/Web3Auth.ts index efe1219..929942f 100644 --- a/src/Web3Auth.ts +++ b/src/Web3Auth.ts @@ -18,7 +18,6 @@ import KeyStore from "./session/KeyStore"; class Web3Auth { initParams: SdkInitParams; webBrowser: IWebBrowser; - sessionResponse: EventEmitter; keyStore: KeyStore; constructor(webBrowser: IWebBrowser, storage: SecureStore|EncryptedStorage, initParams: SdkInitParams) { @@ -27,10 +26,11 @@ class Web3Auth { this.initParams.sdkUrl = "https://sdk.openlogin.com"; } this.webBrowser = webBrowser; - this.sessionResponse = new EventEmitter(); this.keyStore = new KeyStore(storage); + } - this.authorizeSession(); + async init(): Promise { + return this.authorizeSession(); } async login(options: SdkLoginParams): Promise { @@ -107,7 +107,7 @@ class Web3Auth { return this.webBrowser.openAuthSessionAsync(url.href, redirectUrl); } - async authorizeSession() { + async authorizeSession(): Promise { const sessionId = await this.keyStore.get("sessionId"); if (sessionId && sessionId.length > 0) { var pubKey = getPublic(Buffer.from(sessionId, "hex")).toString("hex"); @@ -128,10 +128,10 @@ class Web3Auth { if (!web3AuthResponse.error) { web3AuthResponse = web3AuthResponse as State; if (web3AuthResponse.privKey && web3AuthResponse.privKey.trim('0').length > 0) { - this.sessionResponse.emit("login", web3AuthResponse); + return Promise.resolve(web3AuthResponse); } } else { - throw new Error(`session recovery failed with error ${web3AuthResponse.error}`); + return Promise.reject(`session recovery failed with error ${web3AuthResponse.error}`); } } } @@ -166,7 +166,7 @@ class Web3Auth { this.keyStore.remove("ephemPublicKey"); this.keyStore.remove("ivKey"); this.keyStore.remove("mac"); - + if (this.initParams.loginConfig) { var loginConfigItem = Object.values(this.initParams.loginConfig)[0]; if (loginConfigItem) { From d91413ed0214eb24612bb0b9ba5895936f20bfb8 Mon Sep 17 00:00:00 2001 From: Musab Hussain Date: Thu, 2 Feb 2023 22:59:09 +0500 Subject: [PATCH 5/6] minor fixes --- example/App.tsx | 2 -- 1 file changed, 2 deletions(-) diff --git a/example/App.tsx b/example/App.tsx index d02aedf..019340d 100644 --- a/example/App.tsx +++ b/example/App.tsx @@ -7,8 +7,6 @@ import Constants, { AppOwnership } from "expo-constants"; import * as Linking from "expo-linking"; import * as WebBrowser from "expo-web-browser"; import * as SecureStore from 'expo-secure-store'; -import { useState } from "react"; -import { Button, StyleSheet, Text, View } from "react-native"; global.Buffer = global.Buffer || Buffer; From 69322c560da242ebeb04d93cd7d87b1adbee0106 Mon Sep 17 00:00:00 2001 From: Musab Hussain Date: Mon, 13 Feb 2023 12:37:11 +0500 Subject: [PATCH 6/6] code fixes --- example/App.tsx | 1 + package.json | 8 ++++---- src/Web3Auth.ts | 31 +++++++++---------------------- 3 files changed, 14 insertions(+), 26 deletions(-) diff --git a/example/App.tsx b/example/App.tsx index 019340d..e2cb985 100644 --- a/example/App.tsx +++ b/example/App.tsx @@ -48,6 +48,7 @@ export default function App() { try { const state = await web3auth.current.login({ loginProvider: LOGIN_PROVIDER.GOOGLE, + redirectUrl: resolvedRedirectUrl, }); setKey(state.privKey || "no key"); setUserInfo(state); diff --git a/package.json b/package.json index 1ed5ca8..9411bda 100644 --- a/package.json +++ b/package.json @@ -39,14 +39,14 @@ "@toruslabs/metadata-helpers": "^3.0.0", "base64url": "^3.0.1", "buffer": "^6.0.3", - "crypto-browserify": "^3.12.0", "loglevel": "^1.8.1", - "react-native-url-polyfill": "^1.3.0", - "stream-browserify": "^3.0.0" + "react-native-url-polyfill": "^1.3.0" }, "peerDependencies": { "@babel/runtime": "^7.x", - "react-native": "*" + "react-native": "*", + "stream-browserify": "^3.0.0", + "crypto-browserify": "^3.12.0" }, "devDependencies": { "react-native": "~0.68.2", diff --git a/src/Web3Auth.ts b/src/Web3Auth.ts index 929942f..587736a 100644 --- a/src/Web3Auth.ts +++ b/src/Web3Auth.ts @@ -112,15 +112,7 @@ class Web3Auth { if (sessionId && sessionId.length > 0) { var pubKey = getPublic(Buffer.from(sessionId, "hex")).toString("hex"); var response = await Web3AuthApi.authorizeSession(pubKey); - if (response.success == false) { - return; - } - var shareMetadata = JSON.parse(response.message) as ShareMetadata; - this.keyStore.set("ephemPublicKey", shareMetadata.ephemPublicKey); - this.keyStore.set("ivKey", shareMetadata.iv); - this.keyStore.set("mac", shareMetadata.mac); - var web3AuthResponse = await decryptData(sessionId, response.message); web3AuthResponse["userInfo"] = web3AuthResponse["store"] delete web3AuthResponse['store']; @@ -131,7 +123,7 @@ class Web3Auth { return Promise.resolve(web3AuthResponse); } } else { - return Promise.reject(`session recovery failed with error ${web3AuthResponse.error}`); + throw new Error(`session recovery failed with error ${web3AuthResponse.error}`); } } } @@ -139,19 +131,16 @@ class Web3Auth { async sessionTimeout() { const sessionId = await this.keyStore.get("sessionId"); if (sessionId && sessionId.length > 0) { - var ephemKey = await this.keyStore.get("ephemPublicKey"); - var ivKey = await this.keyStore.get("ivKey"); - var mac = await this.keyStore.get("mac"); - - if (ephemKey?.length == 0 && ivKey?.length == 0) + var pubKey = getPublic(Buffer.from(sessionId, "hex")).toString("hex"); + var response = await Web3AuthApi.authorizeSession(pubKey); + if (!response.success) { return; - + } + var shareMetadata = JSON.parse(response.message) as ShareMetadata; var encryptedData = await encryptData(sessionId, ""); var encryptedMetadata: ShareMetadata = { - iv: ivKey, - ephemPublicKey: ephemKey, - ciphertext: encryptedData, - mac: mac + ... shareMetadata, + ciphertext: encryptedData }; var jsonData = JSON.stringify(encryptedMetadata); var hashData = keccak256(jsonData); @@ -163,9 +152,7 @@ class Web3Auth { timeout: 1 }); - this.keyStore.remove("ephemPublicKey"); - this.keyStore.remove("ivKey"); - this.keyStore.remove("mac"); + this.keyStore.remove("sessionId"); if (this.initParams.loginConfig) { var loginConfigItem = Object.values(this.initParams.loginConfig)[0];