
Rename resources to dist. Eliminate keyring bundle and expose keyring class in openpgp module. Add mochaTest grunt task to run node server-side tests. Add node_pack grunt task to create npm package into dist and install it for testing. Add node_store config property which specifies location of localStorage emulation when using node. Add repository info to package.json. Move util.js to src directory from util since it is the only file there. Rename class properties in openpgp to the new class names.
351 lines
18 KiB
HTML
351 lines
18 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="en">
|
|
<head>
|
|
<meta charset="utf-8">
|
|
<title>JSDoc: Source: crypto/cfb.js</title>
|
|
|
|
<script src="scripts/prettify/prettify.js"> </script>
|
|
<script src="scripts/prettify/lang-css.js"> </script>
|
|
<!--[if lt IE 9]>
|
|
<script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script>
|
|
<![endif]-->
|
|
<link type="text/css" rel="stylesheet" href="styles/prettify-tomorrow.css">
|
|
<link type="text/css" rel="stylesheet" href="styles/jsdoc-default.css">
|
|
</head>
|
|
|
|
<body>
|
|
|
|
<div id="main">
|
|
|
|
<h1 class="page-title">Source: crypto/cfb.js</h1>
|
|
|
|
|
|
|
|
|
|
|
|
<section>
|
|
<article>
|
|
<pre class="prettyprint source"><code>// Modified by Recurity Labs GmbH
|
|
|
|
// modified version of http://www.hanewin.net/encrypt/PGdecode.js:
|
|
|
|
/* OpenPGP encryption using RSA/AES
|
|
* Copyright 2005-2006 Herbert Hanewinkel, www.haneWIN.de
|
|
* version 2.0, check www.haneWIN.de for the latest version
|
|
|
|
* This software is provided as-is, without express or implied warranty.
|
|
* Permission to use, copy, modify, distribute or sell this software, with or
|
|
* without fee, for any purpose and by any individual or organization, is hereby
|
|
* granted, provided that the above copyright notice and this paragraph appear
|
|
* in all copies. Distribution as a part of an application or binary must
|
|
* include the above copyright notice in the documentation and/or other
|
|
* materials provided with the application or distribution.
|
|
*/
|
|
|
|
/**
|
|
* @requires crypto/cipher
|
|
* @requires util
|
|
* @module crypto/cfb
|
|
*/
|
|
|
|
var util = require('../util.js'),
|
|
cipher = require('./cipher');
|
|
|
|
module.exports = {
|
|
|
|
/**
|
|
* This function encrypts a given with the specified prefixrandom
|
|
* using the specified blockcipher to encrypt a message
|
|
* @param {String} prefixrandom random bytes of block_size length provided
|
|
* as a string to be used in prefixing the data
|
|
* @param {String} cipherfn the algorithm cipher class to encrypt
|
|
* data in one block_size encryption, {@link module:crypto/cipher}.
|
|
* @param {String} plaintext data to be encrypted provided as a string
|
|
* @param {String} key binary string representation of key to be used to encrypt the plaintext.
|
|
* This will be passed to the cipherfn
|
|
* @param {Boolean} resync a boolean value specifying if a resync of the
|
|
* IV should be used or not. The encrypteddatapacket uses the
|
|
* "old" style with a resync. Encryption within an
|
|
* encryptedintegrityprotecteddata packet is not resyncing the IV.
|
|
* @return {String} a string with the encrypted data
|
|
*/
|
|
encrypt: function(prefixrandom, cipherfn, plaintext, key, resync) {
|
|
cipherfn = new cipher[cipherfn](key);
|
|
var block_size = cipherfn.blockSize;
|
|
|
|
var FR = new Array(block_size);
|
|
var FRE = new Array(block_size);
|
|
|
|
prefixrandom = prefixrandom + prefixrandom.charAt(block_size - 2) + prefixrandom.charAt(block_size - 1);
|
|
util.print_debug("prefixrandom:" + util.hexstrdump(prefixrandom));
|
|
var ciphertext = "";
|
|
var i;
|
|
// 1. The feedback register (FR) is set to the IV, which is all zeros.
|
|
for (i = 0; i < block_size; i++) FR[i] = 0;
|
|
|
|
// 2. FR is encrypted to produce FRE (FR Encrypted). This is the
|
|
// encryption of an all-zero value.
|
|
FRE = cipherfn.encrypt(FR);
|
|
// 3. FRE is xored with the first BS octets of random data prefixed to
|
|
// the plaintext to produce C[1] through C[BS], the first BS octets
|
|
// of ciphertext.
|
|
for (i = 0; i < block_size; i++) ciphertext += String.fromCharCode(FRE[i] ^ prefixrandom.charCodeAt(i));
|
|
|
|
// 4. FR is loaded with C[1] through C[BS].
|
|
for (i = 0; i < block_size; i++) FR[i] = ciphertext.charCodeAt(i);
|
|
|
|
// 5. FR is encrypted to produce FRE, the encryption of the first BS
|
|
// octets of ciphertext.
|
|
FRE = cipherfn.encrypt(FR);
|
|
|
|
// 6. The left two octets of FRE get xored with the next two octets of
|
|
// data that were prefixed to the plaintext. This produces C[BS+1]
|
|
// and C[BS+2], the next two octets of ciphertext.
|
|
ciphertext += String.fromCharCode(FRE[0] ^ prefixrandom.charCodeAt(block_size));
|
|
ciphertext += String.fromCharCode(FRE[1] ^ prefixrandom.charCodeAt(block_size + 1));
|
|
|
|
if (resync) {
|
|
// 7. (The resync step) FR is loaded with C3-C10.
|
|
for (i = 0; i < block_size; i++) FR[i] = ciphertext.charCodeAt(i + 2);
|
|
} else {
|
|
for (i = 0; i < block_size; i++) FR[i] = ciphertext.charCodeAt(i);
|
|
}
|
|
// 8. FR is encrypted to produce FRE.
|
|
FRE = cipherfn.encrypt(FR, key);
|
|
|
|
if (resync) {
|
|
// 9. FRE is xored with the first 8 octets of the given plaintext, now
|
|
// that we have finished encrypting the 10 octets of prefixed data.
|
|
// This produces C11-C18, the next 8 octets of ciphertext.
|
|
for (i = 0; i < block_size; i++)
|
|
ciphertext += String.fromCharCode(FRE[i] ^ plaintext.charCodeAt(i));
|
|
for (n = block_size + 2; n < plaintext.length; n += block_size) {
|
|
// 10. FR is loaded with C11-C18
|
|
for (i = 0; i < block_size; i++) FR[i] = ciphertext.charCodeAt(n + i);
|
|
|
|
// 11. FR is encrypted to produce FRE.
|
|
FRE = cipherfn.encrypt(FR);
|
|
|
|
// 12. FRE is xored with the next 8 octets of plaintext, to produce the
|
|
// next 8 octets of ciphertext. These are loaded into FR and the
|
|
// process is repeated until the plaintext is used up.
|
|
for (i = 0; i < block_size; i++) ciphertext += String.fromCharCode(FRE[i] ^ plaintext.charCodeAt((n - 2) +
|
|
i));
|
|
}
|
|
} else {
|
|
plaintext = " " + plaintext;
|
|
// 9. FRE is xored with the first 8 octets of the given plaintext, now
|
|
// that we have finished encrypting the 10 octets of prefixed data.
|
|
// This produces C11-C18, the next 8 octets of ciphertext.
|
|
for (i = 2; i < block_size; i++) ciphertext += String.fromCharCode(FRE[i] ^ plaintext.charCodeAt(i));
|
|
var tempCiphertext = ciphertext.substring(0, 2 * block_size).split('');
|
|
var tempCiphertextString = ciphertext.substring(block_size);
|
|
for (n = block_size; n < plaintext.length; n += block_size) {
|
|
// 10. FR is loaded with C11-C18
|
|
for (i = 0; i < block_size; i++) FR[i] = tempCiphertextString.charCodeAt(i);
|
|
tempCiphertextString = '';
|
|
|
|
// 11. FR is encrypted to produce FRE.
|
|
FRE = cipherfn.encrypt(FR);
|
|
|
|
// 12. FRE is xored with the next 8 octets of plaintext, to produce the
|
|
// next 8 octets of ciphertext. These are loaded into FR and the
|
|
// process is repeated until the plaintext is used up.
|
|
for (i = 0; i < block_size; i++) {
|
|
tempCiphertext.push(String.fromCharCode(FRE[i] ^ plaintext.charCodeAt(n + i)));
|
|
tempCiphertextString += String.fromCharCode(FRE[i] ^ plaintext.charCodeAt(n + i));
|
|
}
|
|
}
|
|
ciphertext = tempCiphertext.join('');
|
|
}
|
|
|
|
ciphertext = ciphertext.substring(0, plaintext.length + 2 + block_size);
|
|
|
|
return ciphertext;
|
|
},
|
|
|
|
/**
|
|
* Decrypts the prefixed data for the Modification Detection Code (MDC) computation
|
|
* @param {String} cipherfn.encrypt Cipher function to use,
|
|
* @see module:crypto/cipher.
|
|
* @param {String} key binary string representation of key to be used to check the mdc
|
|
* This will be passed to the cipherfn
|
|
* @param {String} ciphertext The encrypted data
|
|
* @return {String} plaintext Data of D(ciphertext) with blocksize length +2
|
|
*/
|
|
mdc: function(cipherfn, key, ciphertext) {
|
|
cipherfn = new cipher[cipherfn](key);
|
|
var block_size = cipherfn.blockSize;
|
|
|
|
var iblock = new Array(block_size);
|
|
var ablock = new Array(block_size);
|
|
var i;
|
|
|
|
|
|
// initialisation vector
|
|
for (i = 0; i < block_size; i++) iblock[i] = 0;
|
|
|
|
iblock = cipherfn.encrypt(iblock);
|
|
for (i = 0; i < block_size; i++) {
|
|
ablock[i] = ciphertext.charCodeAt(i);
|
|
iblock[i] ^= ablock[i];
|
|
}
|
|
|
|
ablock = cipherfn.encrypt(ablock);
|
|
|
|
return util.bin2str(iblock) +
|
|
String.fromCharCode(ablock[0] ^ ciphertext.charCodeAt(block_size)) +
|
|
String.fromCharCode(ablock[1] ^ ciphertext.charCodeAt(block_size + 1));
|
|
},
|
|
/**
|
|
* This function decrypts a given plaintext using the specified
|
|
* blockcipher to decrypt a message
|
|
* @param {String} cipherfn the algorithm cipher class to decrypt
|
|
* data in one block_size encryption, {@link module:crypto/cipher}.
|
|
* @param {String} key binary string representation of key to be used to decrypt the ciphertext.
|
|
* This will be passed to the cipherfn
|
|
* @param {String} ciphertext to be decrypted provided as a string
|
|
* @param {Boolean} resync a boolean value specifying if a resync of the
|
|
* IV should be used or not. The encrypteddatapacket uses the
|
|
* "old" style with a resync. Decryption within an
|
|
* encryptedintegrityprotecteddata packet is not resyncing the IV.
|
|
* @return {String} a string with the plaintext data
|
|
*/
|
|
|
|
decrypt: function(cipherfn, key, ciphertext, resync) {
|
|
cipherfn = new cipher[cipherfn](key);
|
|
var block_size = cipherfn.blockSize;
|
|
|
|
var iblock = new Array(block_size);
|
|
var ablock = new Array(block_size);
|
|
var i, n = '';
|
|
var text = [];
|
|
|
|
// initialisation vector
|
|
for (i = 0; i < block_size; i++) iblock[i] = 0;
|
|
|
|
iblock = cipherfn.encrypt(iblock, key);
|
|
for (i = 0; i < block_size; i++) {
|
|
ablock[i] = ciphertext.charCodeAt(i);
|
|
iblock[i] ^= ablock[i];
|
|
}
|
|
|
|
ablock = cipherfn.encrypt(ablock, key);
|
|
|
|
// test check octets
|
|
if (iblock[block_size - 2] != (ablock[0] ^ ciphertext.charCodeAt(block_size)) || iblock[block_size - 1] != (ablock[
|
|
1] ^ ciphertext.charCodeAt(block_size + 1))) {
|
|
throw new Error('Invalid data.');
|
|
}
|
|
|
|
/* RFC4880: Tag 18 and Resync:
|
|
* [...] Unlike the Symmetrically Encrypted Data Packet, no
|
|
* special CFB resynchronization is done after encrypting this prefix
|
|
* data. See "OpenPGP CFB Mode" below for more details.
|
|
|
|
*/
|
|
|
|
if (resync) {
|
|
for (i = 0; i < block_size; i++) iblock[i] = ciphertext.charCodeAt(i + 2);
|
|
for (n = block_size + 2; n < ciphertext.length; n += block_size) {
|
|
ablock = cipherfn.encrypt(iblock);
|
|
|
|
for (i = 0; i < block_size && i + n < ciphertext.length; i++) {
|
|
iblock[i] = ciphertext.charCodeAt(n + i);
|
|
text.push(String.fromCharCode(ablock[i] ^ iblock[i]));
|
|
}
|
|
}
|
|
} else {
|
|
for (i = 0; i < block_size; i++) iblock[i] = ciphertext.charCodeAt(i);
|
|
for (n = block_size; n < ciphertext.length; n += block_size) {
|
|
ablock = cipherfn.encrypt(iblock);
|
|
for (i = 0; i < block_size && i + n < ciphertext.length; i++) {
|
|
iblock[i] = ciphertext.charCodeAt(n + i);
|
|
text.push(String.fromCharCode(ablock[i] ^ iblock[i]));
|
|
}
|
|
}
|
|
}
|
|
|
|
n = resync ? 0 : 2;
|
|
|
|
text = text.join('');
|
|
|
|
text = text.substring(n, ciphertext.length - block_size - 2 + n);
|
|
|
|
|
|
return text;
|
|
},
|
|
|
|
|
|
normalEncrypt: function(cipherfn, key, plaintext, iv) {
|
|
cipherfn = new cipher[cipherfn](key);
|
|
var block_size = cipherfn.blockSize;
|
|
|
|
var blocki = "";
|
|
var blockc = "";
|
|
var pos = 0;
|
|
var cyphertext = [];
|
|
var tempBlock = [];
|
|
blockc = iv.substring(0, block_size);
|
|
while (plaintext.length > block_size * pos) {
|
|
var encblock = cipherfn.encrypt(util.str2bin(blockc));
|
|
blocki = plaintext.substring((pos * block_size), (pos * block_size) + block_size);
|
|
for (var i = 0; i < blocki.length; i++)
|
|
tempBlock.push(String.fromCharCode(blocki.charCodeAt(i) ^ encblock[i]));
|
|
blockc = tempBlock.join('');
|
|
tempBlock = [];
|
|
cyphertext.push(blockc);
|
|
pos++;
|
|
}
|
|
return cyphertext.join('');
|
|
},
|
|
|
|
normalDecrypt: function(cipherfn, key, ciphertext, iv) {
|
|
cipherfn = new cipher[cipherfn](key);
|
|
var block_size = cipherfn.blockSize;
|
|
|
|
var blockp = "";
|
|
var pos = 0;
|
|
var plaintext = [];
|
|
var offset = 0;
|
|
var i;
|
|
if (iv === null)
|
|
for (i = 0; i < block_size; i++) blockp += String.fromCharCode(0);
|
|
else
|
|
blockp = iv.substring(0, block_size);
|
|
while (ciphertext.length > (block_size * pos)) {
|
|
var decblock = cipherfn.encrypt(util.str2bin(blockp));
|
|
blockp = ciphertext.substring((pos * (block_size)) + offset, (pos * (block_size)) + (block_size) + offset);
|
|
for (i = 0; i < blockp.length; i++) {
|
|
plaintext.push(String.fromCharCode(blockp.charCodeAt(i) ^ decblock[i]));
|
|
}
|
|
pos++;
|
|
}
|
|
|
|
return plaintext.join('');
|
|
}
|
|
};
|
|
</code></pre>
|
|
</article>
|
|
</section>
|
|
|
|
|
|
|
|
|
|
</div>
|
|
|
|
<nav>
|
|
<h2><a href="index.html">Index</a></h2><h3>Modules</h3><ul><li><a href="module-cleartext.html">cleartext</a></li><li><a href="module-config.html">config</a></li><li><a href="config.html">config/config</a></li><li><a href="localStorage.html">config/localStorage</a></li><li><a href="module-crypto.html">crypto</a></li><li><a href="cfb.html">crypto/cfb</a></li><li><a href="cipher.html">crypto/cipher</a></li><li><a href="aes.html">crypto/cipher/aes</a></li><li><a href="blowfish.html">crypto/cipher/blowfish</a></li><li><a href="cast5.html">crypto/cipher/cast5</a></li><li><a href="des.html">crypto/cipher/des</a></li><li><a href="twofish.html">crypto/cipher/twofish</a></li><li><a href="crypto.html">crypto/crypto</a></li><li><a href="hash.html">crypto/hash</a></li><li><a href="md5.html">crypto/hash/md5</a></li><li><a href="ripe-md.html">crypto/hash/ripe-md</a></li><li><a href="sha.html">crypto/hash/sha</a></li><li><a href="pkcs1.html">crypto/pkcs1</a></li><li><a href="public_key.html">crypto/public_key</a></li><li><a href="dsa.html">crypto/public_key/dsa</a></li><li><a href="elgamal.html">crypto/public_key/elgamal</a></li><li><a href="jsbn.html">crypto/public_key/jsbn</a></li><li><a href="rsa.html">crypto/public_key/rsa</a></li><li><a href="random.html">crypto/random</a></li><li><a href="signature.html">crypto/signature</a></li><li><a href="armor.html">encoding/armor</a></li><li><a href="base64.html">encoding/base64</a></li><li><a href="module-enums.html">enums</a></li><li><a href="module-key.html">key</a></li><li><a href="module-keyring.html">keyring</a></li><li><a href="keyring.html">keyring/keyring</a></li><li><a href="localstore.html">keyring/localstore</a></li><li><a href="module-message.html">message</a></li><li><a href="module-openpgp.html">openpgp</a></li><li><a href="module-packet.html">packet</a></li><li><a href="compressed.html">packet/compressed</a></li><li><a href="literal.html">packet/literal</a></li><li><a href="marker.html">packet/marker</a></li><li><a href="one_pass_signature.html">packet/one_pass_signature</a></li><li><a href="packet.html">packet/packet</a></li><li><a href="packetlist.html">packet/packetlist</a></li><li><a href="public_key_.html">packet/public_key</a></li><li><a href="public_key_encrypted_session_key.html">packet/public_key_encrypted_session_key</a></li><li><a href="public_subkey.html">packet/public_subkey</a></li><li><a href="secret_key.html">packet/secret_key</a></li><li><a href="secret_subkey.html">packet/secret_subkey</a></li><li><a href="signature_.html">packet/signature</a></li><li><a href="sym_encrypted_integrity_protected.html">packet/sym_encrypted_integrity_protected</a></li><li><a href="sym_encrypted_session_key.html">packet/sym_encrypted_session_key</a></li><li><a href="symmetrically_encrypted.html">packet/symmetrically_encrypted</a></li><li><a href="trust.html">packet/trust</a></li><li><a href="user_attribute.html">packet/user_attribute</a></li><li><a href="userid.html">packet/userid</a></li><li><a href="keyid.html">type/keyid</a></li><li><a href="mpi.html">type/mpi</a></li><li><a href="s2k.html">type/s2k</a></li><li><a href="module-util.html">util</a></li></ul><h3>Classes</h3><ul><li><a href="JXG.Util.html">JXG.Util</a></li><li><a href="module-cleartext-CleartextMessage.html">cleartext~CleartextMessage</a></li><li><a href="localStorage-LocalStorage.html">config/localStorage~LocalStorage</a></li><li><a href="keyring-Keyring.html">keyring/keyring~Keyring</a></li><li><a href="module-key-Key.html">key~Key</a></li><li><a href="module-key-SubKey.html">key~SubKey</a></li><li><a href="module-key-User.html">key~User</a></li><li><a href="module-message-Message.html">message~Message</a></li><li><a href="compressed-Compressed.html">packet/compressed~Compressed</a></li><li><a href="literal-Literal.html">packet/literal~Literal</a></li><li><a href="marker-Marker.html">packet/marker~Marker</a></li><li><a href="one_pass_signature-OnePassSignature.html">packet/one_pass_signature~OnePassSignature</a></li><li><a href="packetlist-Packetlist.html">packet/packetlist~Packetlist</a></li><li><a href="public_key_encrypted_session_key-PublicKeyEncryptedSessionKey.html">packet/public_key_encrypted_session_key~PublicKeyEncryptedSessionKey</a></li><li><a href="public_key-PublicKey.html">packet/public_key~PublicKey</a></li><li><a href="public_subkey-PublicSubkey.html">packet/public_subkey~PublicSubkey</a></li><li><a href="secret_key-SecretKey.html">packet/secret_key~SecretKey</a></li><li><a href="secret_subkey-SecretSubkey.html">packet/secret_subkey~SecretSubkey</a></li><li><a href="signature-Signature.html">packet/signature~Signature</a></li><li><a href="sym_encrypted_integrity_protected-SymEncryptedIntegrityProtected.html">packet/sym_encrypted_integrity_protected~SymEncryptedIntegrityProtected</a></li><li><a href="sym_encrypted_session_key-SymEncryptedSessionKey.html">packet/sym_encrypted_session_key~SymEncryptedSessionKey</a></li><li><a href="symmetrically_encrypted-SymmetricallyEncrypted.html">packet/symmetrically_encrypted~SymmetricallyEncrypted</a></li><li><a href="trust-Trust.html">packet/trust~Trust</a></li><li><a href="user_attribute-UserAttribute.html">packet/user_attribute~UserAttribute</a></li><li><a href="userid-Userid.html">packet/userid~Userid</a></li><li><a href="keyid-Keyid.html">type/keyid~Keyid</a></li><li><a href="mpi-MPI.html">type/mpi~MPI</a></li><li><a href="s2k-S2K.html">type/s2k~S2K</a></li></ul>
|
|
</nav>
|
|
|
|
<br clear="both">
|
|
|
|
<footer>
|
|
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.2.2</a> on Thu Jan 09 2014 02:24:28 GMT-0800 (PST)
|
|
</footer>
|
|
|
|
<script> prettyPrint(); </script>
|
|
<script src="scripts/linenumber.js"> </script>
|
|
</body>
|
|
</html>
|