110 lines
2.3 KiB
JavaScript
110 lines
2.3 KiB
JavaScript
const operations = crypto.subtle
|
|
var iv = crypto.getRandomValues(new Uint8Array(24))
|
|
|
|
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;
|
|
}
|
|
|
|
|
|
const encoder = new TextEncoder();
|
|
const passwordAsKeyData = encoder.encode('superSecretPassword');
|
|
|
|
const keyFromPassword = await operations.importKey(
|
|
"raw",
|
|
passwordAsKeyData,
|
|
"PBKDF2",
|
|
false,
|
|
["deriveKey"]
|
|
)
|
|
|
|
const aes = await operations.deriveKey(
|
|
{
|
|
name: "PBKDF2",
|
|
salt: stringToArrayBuffer("salt"),
|
|
iterations: 250000,
|
|
hash: "SHA-256",
|
|
},
|
|
keyFromPassword,
|
|
{
|
|
name: "AES-GCM",
|
|
length: 256
|
|
},
|
|
true,
|
|
["wrapKey", "unwrapKey"]
|
|
)
|
|
|
|
var keyPair = await crypto.subtle.generateKey(
|
|
{
|
|
name: "RSA-OAEP",
|
|
modulusLength: 4096,
|
|
publicExponent: new Uint8Array([1, 0, 1]),
|
|
hash: "SHA-256",
|
|
},
|
|
true,
|
|
["encrypt", "decrypt"]
|
|
)
|
|
|
|
var wrappedRSAKey = await crypto.subtle.wrapKey(
|
|
"jwk",
|
|
keyPair.privateKey,
|
|
aes,
|
|
{name: "AES-GCM", iv: iv}
|
|
)
|
|
|
|
const kk = btoa(arrayBufferToString(wrappedRSAKey))
|
|
const siv = btoa(arrayBufferToString(iv))
|
|
|
|
console.log(wrappedRSAKey)
|
|
console.log('wrapped key:', kk)
|
|
console.log('iv:', siv)
|
|
|
|
console.log("=================================")
|
|
console.log("=================================")
|
|
console.log("=================================")
|
|
|
|
var unwrapped = await crypto.subtle.unwrapKey(
|
|
"jwk",
|
|
stringToArrayBuffer(atob(kk)),
|
|
aes,
|
|
{name: "AES-GCM", iv: stringToArrayBuffer(atob(siv))},
|
|
{
|
|
name: "RSA-OAEP",
|
|
hash: "SHA-256",
|
|
},
|
|
true,
|
|
["decrypt"]
|
|
)
|
|
|
|
console.log(unwrapped)
|
|
|
|
const enc = await operations.encrypt(
|
|
{ name: "RSA-OAEP" },
|
|
keyPair.publicKey,
|
|
stringToArrayBuffer("asd"),
|
|
)
|
|
|
|
console.log(btoa(arrayBufferToString(enc)))
|
|
|
|
const dec = await operations.decrypt(
|
|
{ name: "RSA-OAEP" },
|
|
unwrapped,
|
|
enc,
|
|
)
|
|
|
|
console.log(arrayBufferToString(dec))
|