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;
+ });
}
}
});