{"version":3,"file":"bundle.js","mappings":"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","sources":["webpack://ic-vault-javascript-app/webpack/runtime/chunk loaded","webpack://ic-vault-javascript-app/./src/main.js","webpack://ic-vault-javascript-app/webpack/bootstrap","webpack://ic-vault-javascript-app/webpack/runtime/amd options","webpack://ic-vault-javascript-app/webpack/runtime/define property getters","webpack://ic-vault-javascript-app/webpack/runtime/global","webpack://ic-vault-javascript-app/webpack/runtime/hasOwnProperty shorthand","webpack://ic-vault-javascript-app/webpack/runtime/make namespace object","webpack://ic-vault-javascript-app/webpack/runtime/node module decorator","webpack://ic-vault-javascript-app/webpack/runtime/jsonp chunk loading","webpack://ic-vault-javascript-app/webpack/startup"],"sourcesContent":["var deferred = [];\n__webpack_require__.O = (result, chunkIds, fn, priority) => {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar [chunkIds, fn, priority] = deferred[i];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every((key) => (__webpack_require__.O[key](chunkIds[j])))) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","import { Actor, HttpAgent } from '@dfinity/agent';\nimport { Principal } from '@dfinity/principal';\nimport { AuthClient } from '@dfinity/auth-client';\n\nconst signInBtn = document.getElementById('signinBtn');\nconst signOutBtn = document.getElementById('signoutBtn');\nconst whoamiBtn = document.getElementById('whoamiBtn');\nconst listDevicesBtn = document.getElementById('listDevicesBtn');\nconst listDevicesEl = document.getElementById('listDevicesResponse');\nconst hostUrlEl = document.getElementById('hostUrl');\nconst whoAmIResponseEl = document.getElementById('whoamiResponse');\nconst principalEl = document.getElementById('principal');\nconst registerDeviceEl = document.getElementById('registerDeviceResponse');\nconst deviceAliasEl = document.getElementById('deviceAlias');\nconst seedResponseEl = document.getElementById('seedResponse');\nconst syncResponseEl = document.getElementById('syncResponse');\n\nconst keySyncCanister = \"khpze-daaaa-aaaai-aal6q-cai\";\nconst vaultCanister = \"uvf7r-liaaa-aaaah-qabnq-cai\"; // deployment on IC\n//const vaultCanister = \"un4fu-tqaaa-aaaab-qadjq-cai\"; // from Motoko playground\n\nconst vaultIdlFactory = ({ IDL }) =>\n IDL.Service({\n insert:\n IDL.Func([IDL.Text, IDL.Text], [], ['update']),\n get_kvstore:\n IDL.Func([], [IDL.Vec(IDL.Record({\"key\": IDL.Text, \"value\": IDL.Text}))], []),\n 'delete':\n IDL.Func([IDL.Text], [], []),\n lookup : IDL.Func([IDL.Text], [IDL.Opt(IDL.Text)], []),\n replace : IDL.Func([IDL.Text, IDL.Text], [IDL.Opt(IDL.Text)], []),\n});\n\nlet authClient;\n\nconst keySync_idlFactory = ({ IDL }) => {\n const PublicKey = IDL.Text;\n const Ciphertext = IDL.Text;\n const GetCiphertextError = IDL.Variant({\n 'notSynced' : IDL.Null,\n 'notFound' : IDL.Null,\n });\n const Result = IDL.Variant({ 'ok' : Ciphertext, 'err' : GetCiphertextError });\n const DeviceAlias = IDL.Text;\n const KeySync = IDL.Service({\n 'get_ciphertext' : IDL.Func([PublicKey], [Result], ['query']),\n 'get_devices' : IDL.Func(\n [],\n [IDL.Vec(IDL.Tuple(DeviceAlias, PublicKey))],\n ['query'],\n ),\n 'get_unsynced_pubkeys' : IDL.Func([], [IDL.Vec(PublicKey)], ['query']),\n 'isSeeded' : IDL.Func([], [IDL.Bool], ['query']),\n 'register_device' : IDL.Func([DeviceAlias, PublicKey], [IDL.Bool], []),\n 'remove_device' : IDL.Func([DeviceAlias], [], ['oneway']),\n 'seed' : IDL.Func([PublicKey, Ciphertext], [], ['oneway']),\n 'submit_ciphertexts' : IDL.Func(\n [IDL.Vec(IDL.Tuple(PublicKey, Ciphertext))],\n [],\n ['oneway'],\n ),\n 'whoami' : IDL.Func([], [IDL.Principal], ['query']),\n });\n return KeySync;\n};\n\nfunction ab2str(buf) {\n return String.fromCharCode.apply(null, new Uint8Array(buf));\n}\n\nfunction str2ab(str) {\n var buf = new ArrayBuffer(str.length);\n var bufView = new Uint8Array(buf);\n for (var i=0, strLen=str.length; i {\n authClient = await AuthClient.create();\n principalEl.innerText = await authClient.getIdentity().getPrincipal();\n\n // Redirect to the identity provider\n signInBtn.onclick = async () => {\n authClient.login({\n identityProvider: \"https://identity.ic0.app\",\n onSuccess: async () => {\n principalEl.innerText = await authClient.getIdentity().getPrincipal();\n },\n });\n };\n\n signOutBtn.onclick = async () => {\n authClient.logout();\n principalEl.innerText = await authClient.getIdentity().getPrincipal();\n };\n\n let local_store = window.localStorage;\n if (!local_store.getItem(\"PublicKey\") || !local_store.getItem(\"PrivateKey\")) {\n console.log(\"Local store does not exists, generating keys\");\n let keypair = await crypto.subtle.generateKey(\n {\n name: \"RSA-OAEP\",\n // Consider using a 4096-bit key for systems that require long-term security\n modulusLength: 2048,\n publicExponent: new Uint8Array([1, 0, 1]),\n hash: \"SHA-256\",\n },\n true,\n [\"encrypt\", \"decrypt\", \"wrapKey\", \"unwrapKey\"]\n );\n const exported = await window.crypto.subtle.exportKey('spki', keypair.publicKey);\n const exportedAsBase64 = window.btoa(ab2str(exported));\n window.myPublicKeyString = exportedAsBase64;\n\n console.log(\"Exporting private key .. \");\n const exported_private = await window.crypto.subtle.exportKey('pkcs8', keypair.privateKey)\n const exported_privateAsBase64 = window.btoa(ab2str(exported_private));\n window.myPrivateKeyString = exported_privateAsBase64;\n\n local_store.setItem(\"PublicKey\", window.myPublicKeyString);\n local_store.setItem(\"PrivateKey\", window.myPrivateKeyString);\n\n window.myPublicKey = keypair.publicKey;\n window.myPrivateKey = keypair.privateKey;\n\n } else {\n\n console.log(\"Loading keys from local store\");\n window.myPublicKeyString = local_store.getItem(\"PublicKey\");\n window.myPrivateKeyString = local_store.getItem(\"PrivateKey\");\n\n window.crypto.subtle.importKey(\n 'spki',\n str2ab(window.atob(window.myPublicKeyString)),\n {\n name: \"RSA-OAEP\",\n hash: {name: \"SHA-256\"},\n },\n true,\n [\"encrypt\", \"wrapKey\"]\n ).then((key) => {\n console.log(\"Success importing public key: \" + key);\n window.myPublicKey = key;\n }).catch((err) => {\n console.error(\"Failed to import public key: \" + err);\n });\n\n window.crypto.subtle.importKey(\n 'pkcs8',\n str2ab(window.atob(window.myPrivateKeyString)),\n {\n name: \"RSA-OAEP\",\n hash: {name: \"SHA-256\"},\n },\n true,\n [\"decrypt\", \"unwrapKey\"]\n ).then((key) => {\n console.log(\"Success importing private key: \" + key);\n window.myPrivateKey = key;\n }).catch((err) => {\n console.error(\"Failed to import private key: \" + err);\n });\n }\n console.log(\"Public key is: \" + window.myPublicKeyString);\n console.log(\"Private key is: \" + window.myPrivateKeyString);\n\n if (local_store.getItem(\"DeviceAlias\")) {\n document.getElementById('deviceAliasLocalStore').innerHTML = local_store.getItem(\"DeviceAlias\");\n }\n\n await initial_load();\n};\n\ninit();\n\nlistDevicesBtn.addEventListener('click', async() => {\n const identity = await authClient.getIdentity();\n const canisterId = Principal.fromText(keySyncCanister);\n\n const actor = Actor.createActor(keySync_idlFactory, {\n agent: new HttpAgent({\n host: \"https://ic0.app/\",\n identity,\n }),\n canisterId,\n });\n \n listDevicesEl.innerText = 'Loading...';\n\n // Similar to the sample project on dfx new:\n actor.get_devices().then(devices => {\n load_devices(devices);\n });\n});\n\nwhoamiBtn.addEventListener('click', async () => {\n const identity = await authClient.getIdentity();\n\n const canisterId = Principal.fromText(keySyncCanister);\n\n const actor = Actor.createActor(keySync_idlFactory, {\n agent: new HttpAgent({\n host: \"https://ic0.app/\",\n identity,\n }),\n canisterId,\n });\n\n whoAmIResponseEl.innerText = 'Loading...';\n\n // Similar to the sample project on dfx new:\n actor.whoami().then(principal => {\n whoAmIResponseEl.innerText = principal.toText();\n });\n});\n\nregisterDeviceBtn.addEventListener('click', async () => {\n const identity = await authClient.getIdentity();\n const canisterId = Principal.fromText(keySyncCanister);\n const actor = Actor.createActor(keySync_idlFactory, {\n agent: new HttpAgent({\n host: \"https://ic0.app/\",\n identity,\n }),\n canisterId,\n });\n\n registerDeviceEl.innerText = 'Registering public key for device ' + deviceAliasEl.value + ' : ' + window.myPublicKeyString;\n\n actor.register_device(deviceAliasEl.value, window.myPublicKeyString).then(result => {\n if (result) {\n window.localStorage.setItem(\"DeviceAlias\", deviceAliasEl.value);\n registerDeviceEl.innerText += \"\\nDone.\";\n } else {\n registerDeviceEl.innerText += \"\\nDevice alias already registered. Choose a unique alias. To overwrite an existing device call remove_device first (currently only through Candid UI).\";\n }\n });\n});\n\nseedBtn.addEventListener('click', async () => {\n const identity = await authClient.getIdentity();\n const canisterId = Principal.fromText(keySyncCanister);\n const actor = Actor.createActor(keySync_idlFactory, {\n agent: new HttpAgent({\n host: \"https://ic0.app/\",\n identity,\n }),\n canisterId,\n });\n \n // TODO: make sure step 1 is completed, i.e. public key is registered\n\n seedResponseEl.innerText = 'Checking if the secret is already defined (\"seeded\")...';\n\n actor.isSeeded().then( result => {\n if (result) {\n seedResponseEl.innerText += '\\nAlready seeded. Now have to sync the secret.';\n } else {\n seedResponseEl.innerText += '\\nNot seeded. Seeding now...';\n // Generate secret\n window.crypto.subtle.generateKey(\n {\n name: \"AES-GCM\",\n length: 256\n },\n true,\n [\"encrypt\", \"decrypt\"]\n ).then( (key) => {\n // Wrap key for own pubkey\n window.crypto.subtle.wrapKey(\n 'raw', \n key, \n window.myPublicKey,\n { name: \"RSA-OAEP\" }\n ).then( (wrapped) => {\n // serialize it\n const exportedAsBase64 = window.btoa(ab2str(wrapped));\n console.log(\"Submitting wrapped secret: \" + exportedAsBase64);\n // Call actor.seed\n actor.seed(window.myPublicKeyString, exportedAsBase64).then( () => {\n seedResponseEl.innerText += \"Done.\";\n });\n });\n });\n }\n })\n});\n\nsyncBtn.addEventListener('click', async () => {\n const identity = await authClient.getIdentity();\n const canisterId = Principal.fromText(keySyncCanister);\n const actor = Actor.createActor(keySync_idlFactory, {\n agent: new HttpAgent({\n host: \"https://ic0.app/\",\n identity,\n }),\n canisterId,\n });\n\n syncResponseEl.innerText = 'Retrieving secret for my public key...';\n console.log('gettin ciphertext for public key : ',window.myPublicKeyString);\n // call get_ciphertext\n actor.get_ciphertext(window.myPublicKeyString).then( (result) => {\n console.log('get_ciphertext : ',result);\n if ('err' in result) {\n if ('notFound' in result.err) {\n syncResponseEl.innerText += 'Failed.\\nOwn public key is not registered. Go back to step 1.';\n console.log('get_ciphertext error: notFound');\n } else {\n syncResponseEl.innerText += 'Failed.\\nOwn public key is not synced. Do step 3 on an already synced device. Or do step 2 if this is the first device.';\n console.log('get_ciphertext error: notSynced');\n }\n } else {\n syncResponseEl.innerText += 'Done.';\n console.log('sync succesful: ',result.ok);\n syncResponseEl.innerText += '\\nUnwrapping...';\n // unwrap key\n window.crypto.subtle.unwrapKey(\n 'raw',\n str2ab(window.atob(result.ok)),\n window.myPrivateKey,\n { \n name: \"RSA-OAEP\" \n },\n {\n name: \"AES-GCM\",\n length: 256\n },\n true,\n [ \"encrypt\", \"decrypt\"]\n ).then((unwrapped) => {\n syncResponseEl.innerText += 'Done.';\n // store key in window.secret\n window.crypto.subtle.exportKey('raw', unwrapped).then((exported) => {\n const exportedAsBase64 = window.btoa(ab2str(exported));\n window.secret = exportedAsBase64;\n console.log('shared secret: ' + exportedAsBase64);\n syncResponseEl.innerText += '\\nShared secret: ' + exportedAsBase64;\n });\n // re-encrypt/wrap secret for all unsynced other devices\n actor.get_unsynced_pubkeys().then((list) => {\n console.log('unsynced_pubkeys:', list)\n for (const pk_str of list) {\n console.log('importing unsynced pubkey: ', pk_str);\n window.crypto.subtle.importKey(\n 'spki',\n str2ab(window.atob(pk_str)),\n {\n name: \"RSA-OAEP\",\n hash: {name: \"SHA-256\"},\n },\n true,\n [\"wrapKey\"]\n ).then((pk) => {\n console.log(\"Success importing public key: \", pk);\n window.crypto.subtle.wrapKey(\n 'raw', \n unwrapped, \n pk,\n { name: \"RSA-OAEP\" }\n ).then( (wrapped) => {\n // serialize it\n const exportedAsBase64 = window.btoa(ab2str(wrapped));\n // add to output list\n console.log('Submitting wrapped secret for pk ', pk_str,' : ', exportedAsBase64);\n actor.submit_ciphertexts([[pk_str,exportedAsBase64]]).then( () => {\n console.log('Submitted successful for ', pk_str);\n });\n });\n });\n };\n });\n });\n\n\n }\n });\n});\n\n// The function encrypts all data deterministically in order to enable lookups.\n// It would be possible to use deterministic encryption only for the encryption\n// of keys. All data is correctly encrypted using deterministic encryption for\n// the sake of simplicity.\nfunction encrypt(data, encryption_key) {\n var CryptoJS = require(\"crypto-js\");\n // An all-zero initialization vector is used.\n var init_vector = CryptoJS.enc.Base64.parse(\"0000000000000000000000\");\n // The encryption key is hashed.\n var hash = CryptoJS.SHA256(encryption_key);\n // AES is used to get the encrypted data.\n var encrypted_data = CryptoJS.AES.encrypt(data, hash, {iv: init_vector});\n return encrypted_data.toString();\n}\n\n// The function decrypts the given input data.\nfunction decrypt(data, decryption_key) {\n var CryptoJS = require(\"crypto-js\");\n // The initialization vector must also be provided.\n var init_vector = CryptoJS.enc.Base64.parse(\"0000000000000000000000\");\n // The encryption key is hashed.\n var hash = CryptoJS.SHA256(decryption_key);\n // THe data is decrypted using AES.\n var decrypted_data = CryptoJS.AES.decrypt(data, hash, {iv: init_vector});\n // The return value must be converted to plain UTF-8.\n return decodeURIComponent(decrypted_data.toString().replace(/\\s+/g, '').replace(/[0-9a-f]{2}/g, '%$&'));\n}\n\nfunction call_insert(identity, key, user, pw) {\n\n const VAULT_CANISTER_ID = Principal.fromText(vaultCanister);\n\n const value = JSON.stringify({username: user, password: pw});\n const actor = Actor.createActor(vaultIdlFactory, {\n agent: new HttpAgent(\n {\n host: 'https://ic0.app/',\n identity,\n }\n ),\n canisterId: vaultCanister,\n });\n\n const encrypted_key = encrypt(key, window.secret);\n const encrypted_value = encrypt(value, window.secret);\n actor.insert(encrypted_key, encrypted_value).then(async () => {\n await fetch_single_row(key);\n });\n}\n\nfunction make_with_input_cell(className, content, ro=false) {\n var cell = document.createElement('div');\n cell.className = className;\n var field = document.createElement('input');\n field.setAttribute('type', 'text');\n field.setAttribute('value', content);\n if (ro) {\n field.readOnly = true;\n }\n cell.appendChild(field);\n return cell;\n}\n\nfunction make_input_cell(id) {\n var cell = document.createElement('div');\n cell.id = id;\n var input = document.createElement('input');\n input.type = 'text';\n cell.appendChild(input);\n return cell;\n}\n\nfunction make_edit_cell(className) {\n var cell = document.createElement('div');\n cell.className = className;\n\n var edit_button = document.createElement('input');\n edit_button.setAttribute(\"type\", \"button\");\n edit_button.setAttribute(\"value\", \"edit\");\n edit_button.addEventListener('click', make_row_editable, false);\n cell.appendChild(edit_button);\n\n var delete_button = document.createElement('input');\n delete_button.setAttribute(\"type\", \"button\");\n delete_button.setAttribute(\"value\", \"delete\");\n delete_button.addEventListener('click', start_delete_row, false);\n cell.appendChild(delete_button);\n\n return cell;\n}\n\nconst fetch_single_row = async (key) => {\n const identity = await authClient.getIdentity();\n const actor = Actor.createActor(vaultIdlFactory, {\n agent: new HttpAgent(\n {\n host: 'https://ic0.app/',\n identity,\n }\n ),\n canisterId: vaultCanister,\n });\n\n actor.lookup(encrypt(key, window.secret)).then((value) => {\n if (value.length >= 1) {\n value = JSON.parse(decrypt(value[0], window.secret));\n add_row(key, value.username, value.password, false);\n } else {\n remove_row(key);\n }\n });\n}\n\nfunction make_text_cell(className, content) {\n var cell = document.createElement('div');\n cell.className = className;\n cell.appendChild(document.createTextNode(content));\n return cell;\n}\n\nfunction make_progress_cell(className) {\n var cell = document.createElement('div');\n cell.className = className;\n var img = document.createElement('img');\n img.className = 'small_spinner';\n img.src = 'spinner.gif';\n cell.appendChild(img);\n return cell;\n}\n\nfunction make_row(key, user, pw, in_progress) {\n var row = document.createElement('div');\n row.className = \"cred_row\";\n row.id = \"datarow-\" + key;\n row.appendChild(make_text_cell('cred_key', key));\n row.appendChild(make_text_cell('cred_user', user));\n row.appendChild(make_text_cell('cred_pw', pw));\n if (in_progress) {\n row.appendChild(make_progress_cell('cred_control'));\n } else {\n row.appendChild(make_edit_cell('cred_control'));\n }\n return row;\n}\n\nfunction save_row(event) {\n\n var row = event.target.parentNode.parentNode;\n\n var key = row.getElementsByClassName('cred_key')[0].childNodes[0].value;\n var user = row.getElementsByClassName('cred_user')[0].childNodes[0].value;\n var pw = row.getElementsByClassName('cred_pw')[0].childNodes[0].value;\n\n var new_row = make_row(key, user, pw, true);\n\n const identity = authClient.getIdentity();\n\n if (user.length!=0 && pw.length!=0){\n \tcall_insert(identity, key, user, pw);\n \tvar parentElement = row.parentNode;\n\tparentElement.replaceChild(new_row, row);\n }\n}\n\nfunction make_save_cell(className) {\n var cell = document.createElement('div');\n cell.className = className;\n\n var edit_button = document.createElement('input');\n edit_button.setAttribute(\"type\", \"button\");\n edit_button.setAttribute(\"value\", \"save\");\n edit_button.addEventListener('click',save_row,false);\n\n cell.appendChild(edit_button);\n return cell;\n}\n\nfunction make_row_editable(event) {\n var row = event.target.parentNode.parentNode;\n\n var key = row.getElementsByClassName('cred_key')[0].childNodes[0].nodeValue;\n var editable_row = document.createElement('div');\n editable_row.className = row.className;\n editable_row.id = \"datarow-\" + key;\n\n editable_row.appendChild(make_with_input_cell('cred_key', key, true));\n editable_row.appendChild(make_with_input_cell('cred_user', row.getElementsByClassName('cred_user')[0].childNodes[0].nodeValue));\n editable_row.appendChild(make_with_input_cell('cred_pw', row.getElementsByClassName('cred_pw')[0].childNodes[0].nodeValue));\n\n editable_row.appendChild(make_save_cell('cred_control'));\n\n var parentElement = row.parentNode;\n parentElement.replaceChild(editable_row, row);\n}\n\nasync function start_delete_row(event) {\n var row = event.target.parentNode.parentNode;\n var key = row.getElementsByClassName('cred_key')[0].childNodes[0].nodeValue;\n var user = row.getElementsByClassName('cred_user')[0].childNodes[0].nodeValue;\n var pw = row.getElementsByClassName('cred_pw')[0].childNodes[0].nodeValue;\n \n const identity = await authClient.getIdentity();\n\n add_row(key, user, pw, true);\n\n const actor = Actor.createActor(vaultIdlFactory, {\n agent: new HttpAgent(\n {\n host: 'https://ic0.app/',\n identity,\n }\n ),\n canisterId: vaultCanister,\n });\n\n actor.delete(encrypt(key, window.secret)).then(result => {\n fetch_single_row(key);\n });\n}\n\nfunction add_row(key, user, pw, in_progress) {\n var tab = document.getElementById('cred_table');\n\n var row = make_row(key, user, pw, in_progress);\n var old_row = document.getElementById('datarow-' + key);\n if (old_row) {\n tab.replaceChild(row, old_row);\n } else {\n tab.insertBefore(row, tab.childNodes[tab.childNodes.length - 1]);\n }\n}\n\nfunction remove_row(key) {\n var tab = document.getElementById('cred_table');\n var old_row = document.getElementById('datarow-' + key);\n if (old_row) {\n old_row.remove();\n }\n}\n\nasync function remove_device(event) {\n\n var button = event.target;\n var elem = button.parentNode.childNodes[0];\n var d = elem.innerHTML;\n console.log(\"Removing device: \" + d);\n button.remove();\n\n const identity = await authClient.getIdentity();\n const canisterId = Principal.fromText(keySyncCanister);\n\n const actor = Actor.createActor(keySync_idlFactory, {\n agent: new HttpAgent({\n host: \"https://ic0.app/\",\n identity,\n }),\n canisterId,\n });\n \n elem.innerText += ' ... deleting';\n\n actor.remove_device(d).then(devices => {\n console.log('Device ' + d + ' successfully deleted');\n elem.innerText += ' ... deleted';\n });\n}\n\nfunction load_devices(rows) {\n listDevicesEl.innerText = '';\n for (const row of rows) {\n try {\n console.log(row);\n var alias = row[0];\n\n var device_entry = document.createElement('div');\n\n var device_button = document.createElement('button');\n device_button.innerHTML = 'remove';\n device_button.addEventListener('click', remove_device, false);\n\n var device_label = document.createElement('span');\n device_label.innerHTML = alias;\n\n device_entry.appendChild(device_label);\n device_entry.appendChild(device_button);\n \n listDevicesEl.appendChild(device_entry);\n\n } catch (error) {\n console.error(\"Failed to read row: \" + row + \" - with error: \" + error);\n }\n }\n}\n\nfunction load_rows(rows) {\n for (const row of rows) {\n try {\n let key = decrypt(row.key, window.secret);\n console.log(\"encrypted \"+row.value);\n console.log(\"decrypted \"+decrypt(row.value, window.secret));\n let value = JSON.parse(decrypt(row.value, window.secret));\n let username = value.username;\n let pw = value.password;\n add_row(key, username, pw, false);\n } catch (error) {\n console.error(\"Failed to read row: \" + row + \" - with error: \" + error);\n }\n }\n}\n\nfunction clear_input() {\n var row = document.getElementById('add_entry_row');\n row.getElementsByClassName('key_input')[0].value = '';\n row.getElementsByClassName('user_input')[0].value = '';\n row.getElementsByClassName('pw_input')[0].value = '';\n}\n\ncreate_new_button.addEventListener('click', async () => {\n if (typeof(window.secret) != 'undefined') {\n console.log('using secret:', window.secret);\n var row = document.getElementById('add_entry_row');\n var key = row.getElementsByClassName('key_input')[0].value;\n var user = row.getElementsByClassName('user_input')[0].value;\n var pw = row.getElementsByClassName('pw_input')[0].value;\n\n const identity = await authClient.getIdentity();\n //const identity = Principal.fromText('2vxsx-fae');\n\n if (user.length!=0 && pw.length!=0){\n \tadd_row(key, user, pw, true);\n \tclear_input();\n \tcall_insert(identity, key, user, pw);\n }\n }\n})\n\nconst initial_load = async () => {\n\n const identity = await authClient.getIdentity();\n \n const actor = Actor.createActor(vaultIdlFactory, {\n agent: new HttpAgent(\n {\n host: 'https://ic0.app/',\n identity,\n }\n ),\n canisterId: vaultCanister,\n });\n\n actor.get_kvstore().then(result => {\n load_rows(result);\n change_app_view('table');\n });\n}\n\nrefresh.addEventListener('click', async () => {\n change_app_view('loading');\n initial_load();\n})\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\tid: moduleId,\n\t\tloaded: false,\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Flag the module as loaded\n\tmodule.loaded = true;\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","__webpack_require__.amdO = {};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.nmd = (module) => {\n\tmodule.paths = [];\n\tif (!module.children) module.children = [];\n\treturn module;\n};","// no baseURI\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t296: 0\n};\n\n// no chunk on demand loading\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n__webpack_require__.O.j = (chunkId) => (installedChunks[chunkId] === 0);\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = (parentChunkLoadingFunction, data) => {\n\tvar [chunkIds, moreModules, runtime] = data;\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some((id) => (installedChunks[id] !== 0))) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkIds[i]] = 0;\n\t}\n\treturn __webpack_require__.O(result);\n}\n\nvar chunkLoadingGlobal = self[\"webpackChunkic_vault_javascript_app\"] = self[\"webpackChunkic_vault_javascript_app\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","// startup\n// Load entry module and return exports\n// This entry module depends on other loaded chunks and execution need to be delayed\nvar __webpack_exports__ = __webpack_require__.O(undefined, [689], () => (__webpack_require__(2225)))\n__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n"],"names":["deferred","signInBtn","document","getElementById","signOutBtn","whoamiBtn","listDevicesBtn","listDevicesEl","whoAmIResponseEl","principalEl","registerDeviceEl","deviceAliasEl","seedResponseEl","syncResponseEl","keySyncCanister","vaultCanister","vaultIdlFactory","IDL","Service","insert","Func","Text","get_kvstore","Vec","Record","lookup","Opt","replace","authClient","keySync_idlFactory","PublicKey","Ciphertext","GetCiphertextError","Variant","Null","Result","DeviceAlias","Tuple","Bool","Principal","ab2str","buf","String","fromCharCode","apply","Uint8Array","str2ab","str","ArrayBuffer","length","bufView","i","strLen","charCodeAt","change_app_view","state","view","className","encrypt","data","encryption_key","CryptoJS","init_vector","enc","Base64","parse","hash","SHA256","AES","iv","toString","decrypt","decryption_key","decrypted_data","decodeURIComponent","call_insert","identity","key","user","pw","value","JSON","stringify","username","password","actor","agent","host","canisterId","encrypted_key","window","secret","encrypted_value","then","async","fetch_single_row","make_with_input_cell","content","ro","cell","createElement","field","setAttribute","readOnly","appendChild","innerText","getIdentity","getPrincipal","onclick","login","identityProvider","onSuccess","logout","local_store","localStorage","getItem","console","log","myPublicKeyString","myPrivateKeyString","crypto","subtle","importKey","atob","name","myPublicKey","catch","err","error","myPrivateKey","keypair","generateKey","modulusLength","publicExponent","exported","exportKey","publicKey","exportedAsBase64","btoa","exported_private","privateKey","exported_privateAsBase64","setItem","innerHTML","initial_load","init","addEventListener","get_devices","devices","rows","row","alias","device_entry","device_button","remove_device","device_label","load_devices","whoami","principal","toText","registerDeviceBtn","register_device","result","seedBtn","isSeeded","wrapKey","wrapped","seed","syncBtn","get_ciphertext","ok","unwrapKey","unwrapped","get_unsynced_pubkeys","list","pk_str","pk","submit_ciphertexts","add_row","old_row","remove","remove_row","make_text_cell","createTextNode","make_row","in_progress","id","img","src","make_progress_cell","edit_button","make_row_editable","delete_button","start_delete_row","make_edit_cell","save_row","event","target","parentNode","getElementsByClassName","childNodes","new_row","replaceChild","nodeValue","editable_row","make_save_cell","delete","tab","insertBefore","button","elem","d","create_new_button","clear_input","load_rows","refresh","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","exports","module","loaded","__webpack_modules__","call","m","amdO","O","chunkIds","fn","priority","notFulfilled","Infinity","fulfilled","j","Object","keys","every","splice","r","definition","o","defineProperty","enumerable","get","g","globalThis","this","Function","e","obj","prop","prototype","hasOwnProperty","Symbol","toStringTag","nmd","paths","children","installedChunks","chunkId","webpackJsonpCallback","parentChunkLoadingFunction","moreModules","runtime","some","chunkLoadingGlobal","self","forEach","bind","push","__webpack_exports__"],"sourceRoot":""}