From 143d49b14a5bf6dcdae83da12f4418db7de92097 Mon Sep 17 00:00:00 2001 From: jojobyte <184880+jojobyte@users.noreply.github.com> Date: Tue, 20 Jun 2023 22:02:13 -0600 Subject: [PATCH] fix: external cryptstore implementation Closes #18 --- CryptStore.js | 286 ---------------------------------- components/dialogs/encrypt.js | 11 +- components/forms/backup.js | 4 +- components/forms/wallet.js | 4 +- imports.js | 7 + lib/storage.js | 22 ++- package-lock.json | 162 +++++++------------ package.json | 9 +- sw.js | 2 +- types.js | 3 +- 10 files changed, 95 insertions(+), 415 deletions(-) delete mode 100644 CryptStore.js diff --git a/CryptStore.js b/CryptStore.js deleted file mode 100644 index 8efe03b..0000000 --- a/CryptStore.js +++ /dev/null @@ -1,286 +0,0 @@ -// Based on https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/encrypt -// Based on https://github.com/plamikcho/local-storage-encrypt - -// Encoder based on https://github.com/plamikcho/local-storage-encrypt/blob/master/src/encoder.js - -export function bufferToString(ab) { - let bytes = new Uint8Array(ab); - let str = new TextDecoder().decode(bytes); - - return str -} - -export function stringToBuffer(str) { - let bytes = new TextEncoder().encode(str); - - return bytes.buffer; -} - -/* @type {Uint8ArrayToHex} */ -export function toHex(bytes) { - /** @type {Array} */ - let hex = []; - - bytes.forEach(function (b) { - let h = b.toString(16); - h = h.padStart(2, "0"); - hex.push(h); - }); - - return hex.join(""); -}; - -/* @type {HexToUint8Array} */ -export function toBytes(hex) { - let len = hex.length / 2; - let bytes = new Uint8Array(len); - - let index = 0; - for (let i = 0; i < hex.length; i += 2) { - let c = hex.slice(i, i + 2); - let b = parseInt(c, 16); - bytes[index] = b; - index += 1; - } - - return bytes; -}; - -export function bufferToHex(buf) { - let bytes = new Uint8Array(buf) - let hex = toHex(bytes) - return hex -} - -export function hexToBuffer(hex) { - let bytes = toBytes(hex) - return bytes.buffer -} - -/** - * Creates an instance of PbCrypto with encrypt and decrypt operations - * - * @param {String} password - * @param {String} salt - * @param {Crypto} currentCrypto - window.crypto instance - */ -export function encryptMsg( - password, salt, currentCrypto = window.crypto -) { - const name = 'AES-GCM'; - const targets = ["encrypt", "decrypt"]; - const pbkdfName = 'PBKDF2'; - const hash = { name: 'SHA-256', length: 256 }; - const iterations = 1000; - - const deriveKey = async (password, salt, currentCrypto = window.crypto) => { - const keyMaterial = await currentCrypto.subtle.importKey( - "raw", - stringToBuffer(password), - { name: pbkdfName }, - false, - ["deriveBits", "deriveKey"] - ); - return currentCrypto.subtle.deriveKey( - { - name: pbkdfName, - salt: stringToBuffer(salt), - iterations, - hash: hash.name, - }, - keyMaterial, - { name, length: hash.length }, - true, - // @ts-ignore - targets, - ); - }; - - async function encrypt(message, iv) { - if ('string' === typeof iv) { - iv = hexToBuffer(iv) - } - - return await deriveKey(password, salt) - .then(async cryptoKey => await currentCrypto.subtle.encrypt( - { name, iv }, - cryptoKey, - stringToBuffer(message) - )) - .then(enc => bufferToHex(enc)); - } - - async function decrypt(ciphertext, iv) { - if ('string' === typeof iv) { - iv = hexToBuffer(iv) - } - - return await deriveKey(password, salt) - .then(async function (cryptoKey) { - let dec = await currentCrypto.subtle.decrypt( - { name, iv }, - cryptoKey, - hexToBuffer(ciphertext) - ) - - return dec - }) - .then(dec => bufferToString(dec)); - } - - function getInitVector () { - return currentCrypto.getRandomValues(new Uint8Array(16)); - } - - return { encrypt, decrypt, getInitVector } -} - -export const isBrowserSupported = async () => { - const testMessage = 'w?'; - try { - const cryptoWrapper = encryptMsg('a', 'b'); - const iv = cryptoWrapper.getInitVector(); - const encrypted = await cryptoWrapper.encrypt(testMessage, iv); - const decrypted = await cryptoWrapper.decrypt(encrypted, iv); - return decrypted === testMessage; - } catch (error) { - console.warn('Your browser does not support WebCrypto API', error); - return false; - } -} - -/** - * Gets encrypted storage with async getItem and setItem - * - * @param {Storage} storage Browser storage - localStorage, sessionStorage - * @param {Encryptage} cryptoWrapper Crypto - */ -export async function getEncryptedStorageFromCrypto( - storage, - cryptoWrapper, - ivKey = null // 'encryptage' -) { - let isSupported; - - // const getInitVectorKey = key => `${key}_iv`; - const getInitVectorKey = (key) => `${ivKey || key}_iv`; - - const unmodifiedFunctions = { - clear() { - storage.clear(); - }, - get length() { - return storage.length; - }, - key(i) { - return storage.key(i); - }, - }; - - const setBrowserSupport = async () => { - if (typeof isSupported === 'undefined') { - isSupported = await isBrowserSupported(); - } - }; - - await setBrowserSupport(); - - if (isSupported && ivKey) { - // const iv = cryptoWrapper.getInitVector(); - let iv = storage.getItem(getInitVectorKey()) || - cryptoWrapper.getInitVector(); - - if ('string' !== typeof iv) { - iv = bufferToHex(iv) - } - - console.log( - 'isSupported && ivKey', - iv, - // stringToBuffer(iv), - // hexToBuffer(iv), - ) - - storage.setItem( - getInitVectorKey(), - iv, - ); - } - - return { - ...storage, - async setItem(key, value) { - await setBrowserSupport(); - if (isSupported) { - try { - const iv = storage.getItem(getInitVectorKey(key)) || - cryptoWrapper.getInitVector(); - const encrypted = await cryptoWrapper.encrypt(value, iv); - - storage.setItem(key, String(encrypted)); - - if (!ivKey) { - storage.setItem( - getInitVectorKey(key), - bufferToHex(iv), - ); - } - } - catch (error) { - console.error(`Cannot set encrypted value for ${key}. Error: ${error}`); - throw error; - } - } else { - storage.setItem(key, value); // legacy mode, no encryption - } - }, - async getItem(key) { - await setBrowserSupport(); - if (isSupported) { - try { - const data = storage.getItem(key); - const iv = storage.getItem(getInitVectorKey(key)); - const decrypted = await cryptoWrapper.decrypt(data, iv); - return decrypted; - } - catch (error) { - console.error(`Cannot get encrypted item for ${key}. Error: ${error}`); - return null; - } - } - return storage.getItem(key); // legacy mode, no encryption - }, - async hasItem(key) { - const data = storage.getItem(key); - const iv = storage.getItem(getInitVectorKey(key)); - return data !== null && iv !== null - }, - removeItem(key) { - storage.removeItem(key); - - const ivKey = getInitVectorKey(key); - storage.getItem(ivKey) && storage.removeItem(ivKey); - }, - ...unmodifiedFunctions, - }; -}; - -export async function getEncryptedStorageFromPassword( - storage, password, salt, ivKey -) { - return await getEncryptedStorageFromCrypto( - storage, - encryptMsg(password, salt), - ivKey, - ); -} - -export async function getEncryptedStorage(storage, ...args) { - const [arg1, arg2, arg3] = args; - if (typeof arg1 === 'object') { // it is crypto object - return await getEncryptedStorageFromCrypto(storage, arg1, arg2); - } - if (typeof arg1 === 'string' && typeof arg2 === 'string') { - return await getEncryptedStorageFromPassword(storage, arg1, arg2, arg3); - } -}; diff --git a/components/dialogs/encrypt.js b/components/dialogs/encrypt.js index fe095f1..c0269fc 100644 --- a/components/dialogs/encrypt.js +++ b/components/dialogs/encrypt.js @@ -6,11 +6,10 @@ import { getStakeRows, } from '../../lib/ui.js' import { + isStoreEncrypted, getStoredKeys, initEncryptedStore, encryptKeys, - store, - ENCRYPT_IV, } from '../../lib/storage.js' // import { // // Secp256k1, @@ -37,9 +36,7 @@ let encryptedStore let passphrase export async function setupEncryptDialog(el, state = {}) { - const isStoreEncrypted = !!(await store.getItem(`${ENCRYPT_IV}_iv`)) - - let cryptDirection = isStoreEncrypted ? 'decrypt' : 'encrypt' + let cryptDirection = isStoreEncrypted() ? 'decrypt' : 'encrypt' let capCryptDir = `${capitalizeFirstLetter(cryptDirection)}` let title = `${capCryptDir} Wallet` @@ -189,7 +186,7 @@ export async function setupEncryptDialog(el, state = {}) { trigger("set:pass", passphrase); - if (!isStoreEncrypted || decryptSuccess) { + if (!isStoreEncrypted() || decryptSuccess) { await encryptKeys(storedKeys, passphrase) let { storedKeys: decryptedKeys } = await getStoredKeys(passphrase) @@ -213,7 +210,7 @@ export async function setupEncryptDialog(el, state = {}) { storedKeys, encryptedStore, decryptedStoredKeys, - isStoreEncrypted, + isStoreEncrypted: isStoreEncrypted(), dl: decryptedStoredKeys.length, el: storedKeys.length, }) diff --git a/components/forms/backup.js b/components/forms/backup.js index 34e4b54..d8ee585 100644 --- a/components/forms/backup.js +++ b/components/forms/backup.js @@ -49,7 +49,7 @@ export function setupBackupButton(el, state = {}) { } if ( - !isStoreEncrypted || ( + !isStoreEncrypted() || ( state.passphrase || isDecryptedPhraseOrWif(state.phraseOrWif) ) @@ -71,7 +71,7 @@ export function setupBackupButton(el, state = {}) { // console.log(`${state.name} button handleSubmit`, event) if ( - isStoreEncrypted && ( + isStoreEncrypted() && ( !state.passphrase || !isDecryptedPhraseOrWif(state.phraseOrWif) ) diff --git a/components/forms/wallet.js b/components/forms/wallet.js index c376a53..a6f032b 100644 --- a/components/forms/wallet.js +++ b/components/forms/wallet.js @@ -49,7 +49,7 @@ export function setupWalletButton(el, state = {}) { } if ( - !isStoreEncrypted || ( + !isStoreEncrypted() || ( state.passphrase || isDecryptedPhraseOrWif(state.phraseOrWif) ) @@ -78,7 +78,7 @@ export function setupWalletButton(el, state = {}) { addWalletDialog.showModal() // if ( - // isStoreEncrypted && ( + // isStoreEncrypted() && ( // !state.passphrase || // !isDecryptedPhraseOrWif(state.phraseOrWif) // ) diff --git a/imports.js b/imports.js index 91fab5c..0ae52e6 100644 --- a/imports.js +++ b/imports.js @@ -1,3 +1,5 @@ +// @ts-nocheck + import './node_modules/dashkeys/dashkeys.js'; import './node_modules/dashhd/dashhd.js'; import './node_modules/dashphrase/dashphrase.js'; @@ -7,6 +9,7 @@ import './node_modules/crowdnode/dashapi.js'; import './node_modules/crowdnode/crowdnode.js'; import './node_modules/@dashincubator/secp256k1/secp256k1.js'; import './node_modules/@dashincubator/base58check/base58check.js'; +import './node_modules/crypticstorage/crypticstorage.js' // import './node_modules/qrcode-svg/dist/qrcode.min.js'; import * as DashKeysTypes from './node_modules/dashkeys/dashkeys.js'; @@ -19,6 +22,7 @@ import * as CrowdNodeTypes from './node_modules/crowdnode/crowdnode.js'; import * as Secp256k1Types from './node_modules/@dashincubator/secp256k1/secp256k1.js' import * as Base58CheckTypes from './node_modules/@dashincubator/base58check/base58check.js' import * as RIPEMD160Types from './node_modules/@dashincubator/ripemd160/ripemd160.js' +import * as CrypticStorageTypes from './node_modules/crypticstorage/crypticstorage.js' // import * as QRCodeTypes from './node_modules/qrcode-svg/dist/qrcode.min.js' /** @type {DashKeysTypes} */ @@ -41,6 +45,8 @@ export let Secp256k1 = window?.nobleSecp256k1 || globalThis?.nobleSecp256k1 export let Base58Check = window?.Base58Check || globalThis?.Base58Check /** @type {RIPEMD160Types} */ export let RIPEMD160 = window?.RIPEMD160 || globalThis?.RIPEMD160 +/** @type {CrypticStorageTypes} */ +export let CrypticStorage = window?.CrypticStorage || globalThis?.CrypticStorage; // /** @type {QRCodeTypes} */ // export let QRCode = QRCodeTypes || window?.QRCode || globalThis?.QRCode @@ -55,5 +61,6 @@ export default { Secp256k1, Base58Check, RIPEMD160, + CrypticStorage, // QRCode, } diff --git a/lib/storage.js b/lib/storage.js index b24181b..5c2e6c5 100644 --- a/lib/storage.js +++ b/lib/storage.js @@ -1,7 +1,7 @@ -import { getEncryptedStorage, } from '../CryptStore.js'; import { generateRecoveryPhrase, } from '../utils.js'; import { DashPhrase, + CrypticStorage, } from '../imports.js' export const SK = 'selectedKey' @@ -27,13 +27,27 @@ if (fiatCurrency === null) { } export let store = rememberMe ? localStorage : sessionStorage -export const isStoreEncrypted = !!(await store.getItem(`${ENCRYPT_IV}_iv`)) + +export function isStoreEncrypted() { + for (const [key, value] of Object.entries(store)) { + if ( + key.startsWith(KEY_PREFIX) && + value.includes(':') + ) { + console.log(`At least one key is encrypted. + ${key}: ${value}`); + return true + } + } + + return false +} + export async function initEncryptedStore(pass) { - let tmpStore = await getEncryptedStorage( + let tmpStore = await CrypticStorage.getEncryptedStorage( store, pass, STOREAGE_SALT, - ENCRYPT_IV ) if (passphrase !== pass || !encryptedStore) { encryptedStore = tmpStore diff --git a/package-lock.json b/package-lock.json index b4922b2..2f67173 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "crowdnode-ui", - "version": "0.0.5", + "version": "0.0.6", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "crowdnode-ui", - "version": "0.0.5", + "version": "0.0.6", "license": "MIT", "dependencies": { "@dashevo/dashcore-lib": "^0.19.44", @@ -14,23 +14,20 @@ "@dashincubator/ripemd160": "^3.0.0", "@dashincubator/secp256k1": "^1.7.1-5", "crowdnode": "^1.8.0", + "crypticstorage": "dashhive/CrypticStorage", "dashhd": "3.0.5", "dashkeys": "1.0.0", "dashphrase": "1.3.9", "dashsight": "^1.4.0-2", "qrcode-svg": "^1.1.0" }, - "devDependencies": { - "@plamikcho/pbcrypto": "^2.2.1" - }, "engines": { "node": ">=18.0.0" } }, "node_modules/@dashevo/dashcore-lib": { "version": "0.19.44", - "resolved": "https://registry.npmjs.org/@dashevo/dashcore-lib/-/dashcore-lib-0.19.44.tgz", - "integrity": "sha512-t22zf/wSpV5+kgr+rdiEnUCPmX7TEN30s8aLFNPYtPxJb17kLLGBHp+zwC+NQSKjXliT6T8XwX4cqoDT/IikLg==", + "license": "MIT", "dependencies": { "@dashevo/x11-hash-js": "^1.0.2", "@types/node": "^12.12.47", @@ -47,83 +44,62 @@ }, "node_modules/@dashevo/x11-hash-js": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@dashevo/x11-hash-js/-/x11-hash-js-1.0.2.tgz", - "integrity": "sha512-3vvnZweBca4URBXHF+FTrM4sdTpp3IMt73G1zUKQEdYm/kJkIKN94qpFai7YZDl87k64RCH+ckRZk6ruQPz5KQ==" + "license": "MIT" }, "node_modules/@dashincubator/base58check": { "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@dashincubator/base58check/-/base58check-1.3.2.tgz", - "integrity": "sha512-Bx/Zu/EHeI4yCsiEhvPe0eYkNuU3NUZfNl07T0XwMnRb8LWJj2IX9FpwhQWJA0t/Vrpfz7gr0JmhY58Cez2Cpw==", + "license": "SEE LICENSE IN LICENSE", "bin": { "base58check": "bin/base58check.js" } }, "node_modules/@dashincubator/ripemd160": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@dashincubator/ripemd160/-/ripemd160-3.0.0.tgz", - "integrity": "sha512-EbdXcceP2mW76NchCKp8UYNbZgWkLuV4Mbi30G82xRED32ljJzXsKaaVdzU0oVo2fVzPRXF1GhSF6Lq9beTVvA==" + "license": "MIT" }, "node_modules/@dashincubator/secp256k1": { "version": "1.7.1-5", - "resolved": "https://registry.npmjs.org/@dashincubator/secp256k1/-/secp256k1-1.7.1-5.tgz", - "integrity": "sha512-3iA+RDZrJsRFPpWhlYkp3EdoFAlKjdqkNFiRwajMrzcpA/G/IBX0AnC1pwRLkTrM+tUowcyGrkJfT03U4ETZeg==" - }, - "node_modules/@plamikcho/pbcrypto": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@plamikcho/pbcrypto/-/pbcrypto-2.2.1.tgz", - "integrity": "sha512-2MO8Fh04vk8cUYnmj3QourvUq4dpl+dkRHoUybva+CvE7D52XChM9ozuu2uWU25bi0KGpUbYXW0t7f194TRbvQ==", - "dev": true + "license": "MIT" }, "node_modules/@root/request": { "version": "1.9.2", - "resolved": "https://registry.npmjs.org/@root/request/-/request-1.9.2.tgz", - "integrity": "sha512-wVaL9yVV9oDR9UNbPZa20qgY+4Ch6YN8JUkaE4el/uuS5dmhD8Lusm/ku8qJVNtmQA56XLzEDCRS6/vfpiHK2A==" + "license": "(MIT OR Apache-2.0)" }, "node_modules/@types/node": { "version": "12.20.55", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", - "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==" + "license": "MIT" }, "node_modules/base-x": { "version": "3.0.9", - "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.9.tgz", - "integrity": "sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==", + "license": "MIT", "dependencies": { "safe-buffer": "^5.0.1" } }, "node_modules/bloom-filter": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/bloom-filter/-/bloom-filter-0.2.0.tgz", - "integrity": "sha512-RMG2RpnKczVzRsEYSPaT5rKsyj0w5/wpQRjaW4vOMe1WyUDQpoqxjNc10uROEjdhu63ytRt6aFRPXFePi/Rd7A==" + "version": "0.2.0" }, "node_modules/bls-signatures": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/bls-signatures/-/bls-signatures-0.2.5.tgz", - "integrity": "sha512-5TzQNCtR4zWE4lM08EOMIT8l3b4h8g5LNKu50fUYP1PnupaLGSLklAcTto4lnH7VXpyhsar+74L9wNJII4E/4Q==" + "version": "0.2.5" }, "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==" + "license": "MIT" }, "node_modules/brorand": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==" + "license": "MIT" }, "node_modules/bs58": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", - "integrity": "sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==", + "license": "MIT", "dependencies": { "base-x": "^3.0.2" } }, "node_modules/crowdnode": { "version": "1.8.0", - "resolved": "https://registry.npmjs.org/crowdnode/-/crowdnode-1.8.0.tgz", - "integrity": "sha512-PgP7foeXhQ+omQk6iw92n59zQeTVJ/MzVOQi5rYU4tmvHoRRMD6mbHczNxj7zETZIxxMURRPi38FnKPYtr4j+w==", + "license": "SEE LICENSE IN LICENSE", "dependencies": { "@dashevo/dashcore-lib": "^0.19.41", "dashsight": "^1.3.0-0" @@ -141,8 +117,7 @@ }, "node_modules/crowdnode/node_modules/dashsight": { "version": "1.3.5", - "resolved": "https://registry.npmjs.org/dashsight/-/dashsight-1.3.5.tgz", - "integrity": "sha512-IAY0KCRbxQ65CIKiRoYRepfh4/Vo1uk+/RIQfMQ5Z08R/r3DNPtZjDazgDaIozJIj0pvO1aYURkXWDE83+xf/Q==", + "license": "SEE LICENSE IN LICENSE", "dependencies": { "@root/request": "^1.9.2" }, @@ -157,28 +132,29 @@ "dotenv": "^16.0.1" } }, + "node_modules/crypticstorage": { + "version": "0.0.0", + "resolved": "git+ssh://git@github.com/dashhive/CrypticStorage.git#a695b8ef78360a34d94a040ba356a1565f34630b", + "license": "MIT" + }, "node_modules/dashhd": { "version": "3.0.5", - "resolved": "https://registry.npmjs.org/dashhd/-/dashhd-3.0.5.tgz", - "integrity": "sha512-aixNsoNG0JQMFODvfYyrjZ6MaHQ2vjxD8w5Dha9nNWc8ShvhGRHArZnV3rETtNUQUZgtPABKAq3+ItkxYFQP0Q==", + "license": "SEE LICENSE IN LICENSE", "dependencies": { "dashkeys": "^1.0.0" } }, "node_modules/dashkeys": { "version": "1.0.0", - "resolved": "git+ssh://git@github.com/dashhive/DashKeys.js.git#a45d0ead4c4bc11cfda7e0f76152792d7b425f1c", "license": "SEE LICENSE IN LICENSE" }, "node_modules/dashphrase": { "version": "1.3.9", - "resolved": "https://registry.npmjs.org/dashphrase/-/dashphrase-1.3.9.tgz", - "integrity": "sha512-Hh1LEoiNxp63DGCeWLauoHbDeVyE7xzOZhMNFGdiq0HDaQt1Zkq0kJ9yhiQj7Dq3rZrAPybGM0xkI8/wqY3+ig==" + "license": "SEE LICENSE IN LICENSE" }, "node_modules/dashsight": { "version": "1.4.0-2", - "resolved": "https://registry.npmjs.org/dashsight/-/dashsight-1.4.0-2.tgz", - "integrity": "sha512-/PFAuj8cOGL3hyYRbyhCbtNXo5jLW8H9/DRSwyERJ9cHIOZ/0/HIG8D6s3JM/+iXJj8U65mf8wxSY0otl1We3A==", + "license": "SEE LICENSE IN LICENSE", "dependencies": { "@root/request": "^1.9.2" }, @@ -195,8 +171,7 @@ }, "node_modules/dotenv": { "version": "16.0.3", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz", - "integrity": "sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==", + "license": "BSD-2-Clause", "optional": true, "engines": { "node": ">=12" @@ -204,8 +179,7 @@ }, "node_modules/elliptic": { "version": "6.5.4", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", - "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", + "license": "MIT", "dependencies": { "bn.js": "^4.11.9", "brorand": "^1.1.0", @@ -218,13 +192,11 @@ }, "node_modules/elliptic/node_modules/inherits": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + "license": "ISC" }, "node_modules/hash-base": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", - "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", + "license": "MIT", "dependencies": { "inherits": "^2.0.4", "readable-stream": "^3.6.0", @@ -236,13 +208,11 @@ }, "node_modules/hash-base/node_modules/inherits": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + "license": "ISC" }, "node_modules/hash.js": { "version": "1.1.7", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "license": "MIT", "dependencies": { "inherits": "^2.0.3", "minimalistic-assert": "^1.0.1" @@ -250,13 +220,11 @@ }, "node_modules/hash.js/node_modules/inherits": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + "license": "ISC" }, "node_modules/hmac-drbg": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", + "license": "MIT", "dependencies": { "hash.js": "^1.0.3", "minimalistic-assert": "^1.0.0", @@ -265,34 +233,28 @@ }, "node_modules/inherits": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha512-8nWq2nLTAwd02jTqJExUYFSD/fKq6VH9Y/oG2accc/kdI0V98Bag8d5a4gi3XHz73rDWa2PvTtvcWYquKqSENA==" + "license": "ISC" }, "node_modules/lodash": { "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + "license": "MIT" }, "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==" + "license": "ISC" }, "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==" + "license": "MIT" }, "node_modules/psl": { "version": "1.9.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", - "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", + "license": "MIT", "optional": true }, "node_modules/punycode": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "license": "MIT", "optional": true, "engines": { "node": ">=6" @@ -300,22 +262,19 @@ }, "node_modules/qrcode-svg": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/qrcode-svg/-/qrcode-svg-1.1.0.tgz", - "integrity": "sha512-XyQCIXux1zEIA3NPb0AeR8UMYvXZzWEhgdBgBjH9gO7M48H9uoHzviNz8pXw3UzrAcxRRRn9gxHewAVK7bn9qw==", + "license": "MIT", "bin": { "qrcode-svg": "bin/qrcode-svg.js" } }, "node_modules/querystringify": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", - "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", + "license": "MIT", "optional": true }, "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==", + "license": "MIT", "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -327,19 +286,16 @@ }, "node_modules/readable-stream/node_modules/inherits": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + "license": "ISC" }, "node_modules/requires-port": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "license": "MIT", "optional": true }, "node_modules/ripemd160": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", - "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "license": "MIT", "dependencies": { "hash-base": "^3.0.0", "inherits": "^2.0.1" @@ -347,8 +303,6 @@ }, "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==", "funding": [ { "type": "github", @@ -362,20 +316,19 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "MIT" }, "node_modules/string_decoder": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "license": "MIT", "dependencies": { "safe-buffer": "~5.2.0" } }, "node_modules/tough-cookie": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.2.tgz", - "integrity": "sha512-G9fqXWoYFZgTc2z8Q5zaHy/vJMjm+WV0AkAeHxVCQiEB1b+dGvWzFW6QV07cY5jQ5gRkeid2qIkzkxUnmoQZUQ==", + "license": "BSD-3-Clause", "optional": true, "dependencies": { "psl": "^1.1.33", @@ -389,8 +342,7 @@ }, "node_modules/universalify": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", - "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", + "license": "MIT", "optional": true, "engines": { "node": ">= 4.0.0" @@ -398,16 +350,14 @@ }, "node_modules/unorm": { "version": "1.6.0", - "resolved": "https://registry.npmjs.org/unorm/-/unorm-1.6.0.tgz", - "integrity": "sha512-b2/KCUlYZUeA7JFUuRJZPUtr4gZvBh7tavtv4fvk4+KV9pfGiR6CQAQAWl49ZpR3ts2dk4FYkP7EIgDJoiOLDA==", + "license": "MIT or GPL-2.0", "engines": { "node": ">= 0.4.0" } }, "node_modules/url-parse": { "version": "1.5.10", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", - "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "license": "MIT", "optional": true, "dependencies": { "querystringify": "^2.1.1", @@ -416,13 +366,11 @@ }, "node_modules/util-deprecate": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + "license": "MIT" }, "node_modules/ws": { "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.12.0.tgz", - "integrity": "sha512-kU62emKIdKVeEIOIKVegvqpXMSTAMLJozpHZaJNDYqBjzlSYXQGviYwN1osDLJ9av68qHd4a2oSjd7yD4pacig==", + "license": "MIT", "optional": true, "engines": { "node": ">=10.0.0" diff --git a/package.json b/package.json index 52410b9..74439d5 100644 --- a/package.json +++ b/package.json @@ -17,6 +17,9 @@ "type": "git", "url": "https://github.com/dashhive/crowdnode-ui.git" }, + "bugs": { + "url": "https://github.com/dashhive/crowdnode-ui/issues" + }, "author": "jojobyte (https://jojo.io/)", "type": "module", "private": true, @@ -38,9 +41,7 @@ "dashkeys": "1.0.0", "dashphrase": "1.3.9", "dashsight": "^1.4.0-2", - "qrcode-svg": "^1.1.0" - }, - "devDependencies": { - "@plamikcho/pbcrypto": "^2.2.1" + "qrcode-svg": "^1.1.0", + "crypticstorage": "dashhive/CrypticStorage" } } diff --git a/sw.js b/sw.js index ce3df03..9379ab7 100644 --- a/sw.js +++ b/sw.js @@ -8,7 +8,6 @@ let fileCache = [ 'index.css', 'main.js', 'sw.js', - 'CryptStore.js', 'imports.js', 'qr.js', 'types.js', @@ -44,6 +43,7 @@ let fileCache = [ 'node_modules/@dashincubator/secp256k1/secp256k1.js', 'node_modules/@dashincubator/base58check/base58check.js', 'node_modules/@dashincubator/ripemd160/ripemd160.js', + 'node_modules/crypticstorage/crypticstorage.js', ]; self.addEventListener('install', function (event) { diff --git a/types.js b/types.js index 85b3564..8f6a923 100644 --- a/types.js +++ b/types.js @@ -5,9 +5,8 @@ * @typedef {Object} Encryptage * @property {EncryptageEncrypt} encrypt * @property {EncryptageDecrypt} decrypt - * @property {BaseICrypto["getIv"]} getInitVector + * @property {ArrayBuffer} getInitVector * - * @typedef {BaseICrypto & Encryptage} EncryptageB * @typedef {(message: string, iv: string | ArrayBufferLike) => Promise} EncryptageEncrypt * @typedef {(ciphertext: string, iv: string | ArrayBufferLike) => Promise} EncryptageDecrypt *