73 lines
1.5 KiB
JavaScript
73 lines
1.5 KiB
JavaScript
function arrayToHex(iv) {
|
|
let hexStr = '';
|
|
for (const i in iv) {
|
|
if (iv[i] < 16) {
|
|
hexStr += '0' + iv[i].toString(16);
|
|
} else {
|
|
hexStr += iv[i].toString(16);
|
|
}
|
|
}
|
|
return hexStr;
|
|
}
|
|
|
|
function hexToArray(str) {
|
|
const iv = new Uint8Array(str.length / 2);
|
|
for (let i = 0; i < str.length; i += 2) {
|
|
iv[i / 2] = parseInt(str.charAt(i) + str.charAt(i + 1), 16);
|
|
}
|
|
|
|
return iv;
|
|
}
|
|
|
|
function notify(str) {
|
|
if (!('Notification' in window)) {
|
|
return;
|
|
} else if (Notification.permission === 'granted') {
|
|
new Notification(str);
|
|
} else if (Notification.permission !== 'denied') {
|
|
Notification.requestPermission(function(permission) {
|
|
if (permission === 'granted') new Notification(str);
|
|
});
|
|
}
|
|
}
|
|
|
|
function gcmCompliant() {
|
|
try {
|
|
return window.crypto.subtle.generateKey(
|
|
{
|
|
name: 'AES-GCM',
|
|
length: 128
|
|
},
|
|
true,
|
|
['encrypt', 'decrypt']
|
|
).then(key => {
|
|
return window.crypto.subtle.encrypt(
|
|
{
|
|
name: 'AES-GCM',
|
|
iv: window.crypto.getRandomValues(new Uint8Array(12)),
|
|
additionalData: window.crypto.getRandomValues(new Uint8Array(6)),
|
|
tagLength: 128
|
|
},
|
|
key,
|
|
new ArrayBuffer(8)
|
|
)
|
|
.then(() => {
|
|
return Promise.resolve()
|
|
})
|
|
.catch(err => {
|
|
return Promise.reject()
|
|
})
|
|
}).catch(err => {
|
|
return Promise.reject();
|
|
})
|
|
} catch(err) {
|
|
return Promise.reject();
|
|
}
|
|
}
|
|
|
|
module.exports = {
|
|
arrayToHex,
|
|
hexToArray,
|
|
notify,
|
|
gcmCompliant
|
|
};
|