1
0
mirror of https://github.com/bitwarden/browser.git synced 2024-10-31 08:20:37 +01:00

updates to cryptoService for rsa keypairs

This commit is contained in:
Kyle Spearrin 2017-02-20 22:21:14 -05:00
parent 3ed69d887f
commit 2478a8f3cc

View File

@ -4,13 +4,19 @@ angular
.factory('cryptoService', function ($sessionStorage) {
var _service = {},
_key,
_b64Key;
_b64Key,
_privateKey;
_service.setKey = function (key) {
_key = key;
$sessionStorage.key = forge.util.encode64(key);
};
_service.setPrivateKey = function (privateKey) {
_privateKey = privateKey;
$sessionStorage.privateKey = forge.util.encode64(privateKey);
};
_service.getKey = function (b64) {
if (b64 && b64 === true && _b64Key) {
return _b64Key;
@ -46,11 +52,33 @@ angular
return buffer.getBytes(16);
};
_service.getPrivateKey = function () {
if (_privateKey) {
return _privateKey;
}
if ($sessionStorage.privateKey) {
_privateKey = forge.util.decode64($sessionStorage.privateKey);
}
return _privateKey;
};
_service.clearKey = function () {
_key = _b64Key = null;
delete $sessionStorage.key;
};
_service.clearPrivateKey = function () {
_privateKey = null;
delete $sessionStorage.privateKey;
};
_service.clearKeys = function () {
_service.clearKey();
_service.clearPrivateKey();
};
_service.makeKey = function (password, salt, b64) {
var key = forge.pbkdf2(forge.util.encodeUtf8(password), forge.util.encodeUtf8(salt),
5000, 256 / 8, 'sha256');
@ -62,6 +90,23 @@ angular
return key;
};
_service.makeKeyPair = function (callback) {
forge.pki.rsa.generateKeyPair({ bits: 2048, workers: 2 }, function (error, keypair) {
if (error) {
callback(null, null, error);
return;
}
var privateKey = forge.pki.privateKeyToAsn1(keypair.privateKey);
var privateKeyBytes = forge.asn1.toDer(privateKey).getBytes();
var publicKey = forge.pki.publicKeyToAsn1(keypair.publicKey);
var publicKeyBytes = forge.asn1.toDer(publicKey).getBytes();
callback(privateKeyBytes, publicKeyBytes, null);
});
};
_service.hashPassword = function (password, key) {
if (!key) {
key = _service.getKey();
@ -75,7 +120,7 @@ angular
return forge.util.encode64(hashBits);
};
_service.encrypt = function (plaintextValue, key) {
_service.encrypt = function (plainValue, key, encoding) {
if (!_service.getKey() && !key) {
throw 'Encryption key unavailable.';
}
@ -89,7 +134,8 @@ angular
encKey = key || _service.getKey();
}
var buffer = forge.util.createBuffer(plaintextValue, 'utf8');
encoding = encoding || 'utf8';
var buffer = forge.util.createBuffer(plainValue, encoding);
var ivBytes = forge.random.getBytesSync(16);
var cipher = forge.cipher.createCipher('AES-CBC', encKey);
cipher.start({ iv: ivBytes });
@ -110,7 +156,7 @@ angular
return cipherString;
};
_service.decrypt = function (encValue) {
_service.decrypt = function (encValue, outputEncoding) {
if (!_service.getKey()) {
throw 'AES encryption unavailable.';
}
@ -138,7 +184,13 @@ angular
decipher.update(ctBuffer);
decipher.finish();
return decipher.output.toString('utf8');
outputEncoding = outputEncoding || 'utf8';
if (outputEncoding === 'utf8') {
return decipher.output.toString('utf8');
}
else {
return decipher.output.getBytes();
}
};
function computeMac(ct, iv, macKey) {