function stringToArrayBuffer(str) { var buf = new ArrayBuffer(str.length); var bufView = new Uint8Array(buf); for (var i = 0, strLen = str.length; i < strLen; i++) { bufView[i] = str.charCodeAt(i); } return buf; } function arrayBufferToString(str) { var byteArray = new Uint8Array(str); var byteString = ''; for (var i = 0; i < byteArray.byteLength; i++) { byteString += String.fromCodePoint(byteArray[i]); } return byteString; } function encryptWithKey(key, data) { // Encrypt data with key. Return a Promise return new Promise((resolve) => { window.crypto.subtle.encrypt( { name: "AES-GCM", iv: stringToArrayBuffer(key.uuid), }, key.key, stringToArrayBuffer(data) ).then(text => { resolve(btoa(arrayBufferToString(text))); }); }); } function decryptWithKey(key, data) { // Decrypt data with key. Return a Promise return new Promise((resolve) => { window.crypto.subtle.decrypt( { name: "AES-GCM", iv: stringToArrayBuffer(key.uuid), }, key.key, stringToArrayBuffer(atob(data)) ).then(text => { resolve(arrayBufferToString(text)); }); }) }