diff --git a/crypto.html b/crypto.html index 22f186db..2b38e4df 100644 --- a/crypto.html +++ b/crypto.html @@ -19,6 +19,12 @@ + +
@@ -48,23 +54,23 @@

User Key

-

{{userKey.b64}}

+
{{userKey.b64}}

Master Password Hash

-

{{userKeyHash.b64}}

+
{{userKeyHash.b64}}

Generated Symmetric Key Material

-

{{key.key.b64}}

+
{{key.key.b64}}

Encryption Key

-

{{key.encKey.b64}}

+
{{key.encKey.b64}}

MAC Key

-

{{key.macKey.b64}}

+
{{key.macKey.b64}}

Generated RSA Keypair

Public Key

-

+
{{publicKey.b64}}

Private Key

-

+
{{privateKey.b64}}
@@ -339,6 +345,32 @@ return dataForMac; } + function generateRsaKeypair() { + var rsaOptions = { + name: 'RSA-OAEP', + modulusLength: 2048, + publicExponent: new Uint8Array([0x01, 0x00, 0x01]), // 65537 + hash: { name: 'SHA-1' } + }; + + var keypair, publicKey; + return window.crypto.subtle.generateKey(rsaOptions, true, ['encrypt', 'decrypt']) + .then(function (generatedKey) { + keypair = generatedKey; + return window.crypto.subtle.exportKey('spki', keypair.publicKey); + }).then(function (exportedKey) { + publicKey = new ByteData(exportedKey); + return window.crypto.subtle.exportKey('pkcs8', keypair.privateKey); + }).then(function (exportedKey) { + return { + publicKey: publicKey, + privateKey: new ByteData(exportedKey) + }; + }).catch(function (err) { + console.error(err); + }); + } + // App var vm = new Vue({ @@ -350,8 +382,8 @@ userKey: new ByteData(), userKeyHash: new ByteData(), key: new SymmetricCryptoKey(), - publicKey: null, - privateKey: null, + publicKey: new ByteData(), + privateKey: new ByteData(), plaintext: '', cipher: new Cipher(), decPlaintext: '' @@ -383,9 +415,16 @@ }, methods: { generateKeys: function () { + var self = this; + var key = new Uint8Array(512 / 8); window.crypto.getRandomValues(key); - this.key = new SymmetricCryptoKey(key); + self.key = new SymmetricCryptoKey(key); + + generateRsaKeypair().then(function (keypair) { + self.publicKey = keypair.publicKey; + self.privateKey = keypair.privateKey; + }); } } });