95 lines
4.4 KiB
JavaScript
95 lines
4.4 KiB
JavaScript
// GPG4Browsers - An OpenPGP implementation in javascript
|
|
// Copyright (C) 2011 Recurity Labs GmbH
|
|
//
|
|
// This library is free software; you can redistribute it and/or
|
|
// modify it under the terms of the GNU Lesser General Public
|
|
// License as published by the Free Software Foundation; either
|
|
// version 2.1 of the License, or (at your option) any later version.
|
|
//
|
|
// This library is distributed in the hope that it will be useful,
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
// Lesser General Public License for more details.
|
|
//
|
|
// You should have received a copy of the GNU Lesser General Public
|
|
// License along with this library; if not, write to the Free Software
|
|
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
|
|
// The GPG4Browsers symmetric crypto interface
|
|
|
|
var cfb = require('./cfb.js'),
|
|
cipher = require('./cipher');
|
|
|
|
module.exports = {
|
|
|
|
/**
|
|
* Symmetrically encrypts data using prefixedrandom, a key with length
|
|
* depending on the algorithm in openpgp_cfb mode with or without resync
|
|
* (MDC style)
|
|
* @param {String} prefixrandom Secure random bytes as string in
|
|
* length equal to the block size of the algorithm used (use
|
|
* openpgp_crypto_getPrefixRandom(algo) to retrieve that string
|
|
* @param {Integer} algo Algorithm to use (see RFC4880 9.2)
|
|
* @param {String} key Key as string. length is depending on the algorithm used
|
|
* @param {String} data Data to encrypt
|
|
* @param {Boolean} openpgp_cfb
|
|
* @return {String} Encrypted data
|
|
*/
|
|
encrypt: function (prefixrandom, algo, key, data, openpgp_cfb) {
|
|
switch(algo) {
|
|
case 'plaintext': // Plaintext or unencrypted data
|
|
return data; // blockcipherencryptfn, plaintext, block_size, key
|
|
case 'des': // TripleDES (DES-EDE, [SCHNEIER] [HAC] - 168 bit key derived from 192)
|
|
return cfb.encrypt(prefixrandom, cipher.des, data,8,key, openpgp_cfb).substring(0, data.length + 10);
|
|
case 'cast5': // CAST5 (128 bit key, as per [RFC2144])
|
|
return cfb.encrypt(prefixrandom, cipher.cast5, data,8,key, openpgp_cfb).substring(0, data.length + 10);
|
|
case 'blowfish': // Blowfish (128 bit key, 16 rounds) [BLOWFISH]
|
|
return cfb.encrypt(prefixrandom, cipher.blowfish, data,8,key, openpgp_cfb).substring(0, data.length + 10);
|
|
case 'aes128': // AES with 128-bit key [AES]
|
|
case 'aes192': // AES with 192-bit key
|
|
case 'aes256': // AES with 256-bit key
|
|
return cfb.encrypt(prefixrandom, cipher.aes.encrypt, data, 16, cipher.aes.keyExpansion(key), openpgp_cfb).substring(0, data.length + 18);
|
|
case 'twofish': // Twofish with 256-bit key [TWOFISH]
|
|
return cfb.encrypt(prefixrandom, cipher.twofish, data,16, key, openpgp_cfb).substring(0, data.length + 18);
|
|
default:
|
|
throw new Error('Invalid algorithm.');
|
|
}
|
|
},
|
|
|
|
/**
|
|
* Symmetrically decrypts data using a key with length depending on the
|
|
* algorithm in openpgp_cfb mode with or without resync (MDC style)
|
|
* @param {Integer} algo Algorithm to use (see RFC4880 9.2)
|
|
* @param {String} key Key as string. length is depending on the algorithm used
|
|
* @param {String} data Data to be decrypted
|
|
* @param {Boolean} openpgp_cfb If true use the resync (for encrypteddata);
|
|
* otherwise use without the resync (for MDC encrypted data)
|
|
* @return {String} Plaintext data
|
|
*/
|
|
decrypt: function (algo, key, data, openpgp_cfb) {
|
|
var n = 0;
|
|
if (!openpgp_cfb)
|
|
n = 2;
|
|
switch(algo) {
|
|
case 'plaintext': // Plaintext or unencrypted data
|
|
return data;
|
|
case 'des': // TripleDES (DES-EDE, [SCHNEIER] [HAC] - 168 bit key derived from 192)
|
|
return cfb.decrypt(cipher.des, 8, key, data, openpgp_cfb).substring(n, (data.length+n)-10);
|
|
case 'cast5': // CAST5 (128 bit key, as per [RFC2144])
|
|
return cfb.decrypt(cipher.cast5, 8, key, data, openpgp_cfb).substring(n, (data.length+n)-10);
|
|
case 'blowfish': // Blowfish (128 bit key, 16 rounds) [BLOWFISH]
|
|
return cfb.decrypt(cipher.blowfish, 8, key, data, openpgp_cfb).substring(n, (data.length+n)-10);
|
|
case 'aes128': // AES with 128-bit key [AES]
|
|
case 'aes192': // AES with 192-bit key
|
|
case 'aes256': // AES with 256-bit key
|
|
return cfb.decrypt(cipher.aes.encrypt, 16, cipher.aes.keyExpansion(key), data, openpgp_cfb).substring(n, (data.length+n)-18);
|
|
case 'twofish': // Twofish with 256-bit key [TWOFISH]
|
|
var result = cfb.decrypt(cipher.twofish, 16, key, data, openpgp_cfb).substring(n, (data.length+n)-18);
|
|
return result;
|
|
default:
|
|
throw new Error('Invalid algorithm');
|
|
}
|
|
}
|
|
|
|
}
|