diff --git a/js/app/services/credentialservice.js b/js/app/services/credentialservice.js index 89e3b8cf..accf31ae 100644 --- a/js/app/services/credentialservice.js +++ b/js/app/services/credentialservice.js @@ -57,6 +57,9 @@ angular.module('passmanApp') } }); }, + getEncryptedFields: function () { + return _encryptedFields; + }, updateCredential: function (credential) { var _credential = angular.copy(credential); for (var i = 0; i < _encryptedFields.length; i++) { diff --git a/js/app/services/encryptservice.js b/js/app/services/encryptservice.js index 4305b8bb..91dbb34d 100644 --- a/js/app/services/encryptservice.js +++ b/js/app/services/encryptservice.js @@ -19,15 +19,19 @@ angular.module('passmanApp') }; return { - encryptString: function(string){ - var _key = VaultService.getActiveVault().vaultKey; + encryptString: function(string, _key){ + if(!_key) { + _key = VaultService.getActiveVault().vaultKey; + } var rp = {}; var ct = sjcl.encrypt(_key, string, encryption_config, rp); return window.btoa(ct); }, - decryptString: function(ciphertext){ + decryptString: function(ciphertext, _key){ + if(!_key) { + _key = VaultService.getActiveVault().vaultKey; + } ciphertext = window.atob(ciphertext); - var _key = VaultService.getActiveVault().vaultKey; var rp = {}; try { return sjcl.decrypt(_key, ciphertext, encryption_config, rp) diff --git a/js/app/services/shareservice.js b/js/app/services/shareservice.js index 55132ff2..27e5ed45 100644 --- a/js/app/services/shareservice.js +++ b/js/app/services/shareservice.js @@ -8,9 +8,9 @@ * Service in the passmanApp. */ angular.module('passmanApp') - .service('ShareService', ['$http', 'VaultService', 'EncryptService', function ($http, VaultService, EncryptService) { + .service('ShareService', ['$http', 'VaultService', 'EncryptService', 'CredentialService', function ($http, VaultService, EncryptService, CredentialService) { // Setup sjcl random engine to max paranoia level and start collecting data - var paranoia_level = 10 + var paranoia_level = 10; sjcl.random.setDefaultParanoia(paranoia_level); sjcl.random.startCollectors(); @@ -49,6 +49,38 @@ angular.module('passmanApp') } }); }, + encryptSharedCredential: function(credential, sharedKey){ + var _credential = angular.copy(_credential); + var encrypted_fields = CredentialService.getEncryptedFields(); + for(var i = 0; i < encrypted_fields.length; i++){ + var field = encrypted_fields[i]; + var fieldValue = angular.copy(credential[field]); + _credential[field] = EncryptService.encryptString(JSON.stringify(fieldValue), sharedKey); + } + }, + decryptSharedCredential: function (credential, sharedKey) { + var _credential = angular.copy(credential); + var encrypted_fields = CredentialService.getEncryptedFields(); + for (var i = 0; i < encrypted_fields.length; i++) { + var field = encrypted_fields[i]; + var fieldValue = angular.copy(_credential[field]); + try { + var field_decrypted_value = EncryptService.decryptString(fieldValue, sharedKey); + } catch (e){ + console.log(e); + throw e + } + try{ + _credential[field] = JSON.parse(field_decrypted_value); + } catch (e){ + console.log('Field' + field + ' in '+ _credential.label +' could not be parsed! Value:'+ fieldValue) + throw e + } + + } + return _credential; + }, + generateRSAKeys: function(key_length, progress, callback){ var p = new C_Promise(function(){ var state = forge.pki.rsa.createKeyPairGenerationState(key_length, 0x10001);