57 lines
1.3 KiB
JavaScript
57 lines
1.3 KiB
JavaScript
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));
|
|
|
|
});
|
|
})
|
|
}
|