fork-openpgpjs/src/crypto/sym.js
2013-05-11 21:55:48 +02:00

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