
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.
164 lines
10 KiB
HTML
164 lines
10 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="en">
|
|
<head>
|
|
<meta charset="utf-8">
|
|
<title>JSDoc: Source: crypto/signature.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/signature.js</h1>
|
|
|
|
|
|
|
|
|
|
|
|
<section>
|
|
<article>
|
|
<pre class="prettyprint source"><code>/**
|
|
* @requires crypto/hash
|
|
* @requires crypto/pkcs1
|
|
* @requires crypto/public_key
|
|
* @module crypto/signature */
|
|
|
|
var publicKey = require('./public_key'),
|
|
pkcs1 = require('./pkcs1.js'),
|
|
hashModule = require('./hash');
|
|
|
|
module.exports = {
|
|
/**
|
|
*
|
|
* @param {module:enums.publicKey} algo public Key algorithm
|
|
* @param {module:enums.hash} hash_algo Hash algorithm
|
|
* @param {Array<module:type/mpi>} msg_MPIs Signature multiprecision integers
|
|
* @param {Array<module:type/mpi>} publickey_MPIs Public key multiprecision integers
|
|
* @param {String} data Data on where the signature was computed on.
|
|
* @return {Boolean} true if signature (sig_data was equal to data over hash)
|
|
*/
|
|
verify: function(algo, hash_algo, msg_MPIs, publickey_MPIs, data) {
|
|
var calc_hash = hashModule.digest(hash_algo, data);
|
|
var dopublic;
|
|
|
|
switch (algo) {
|
|
case 1:
|
|
// RSA (Encrypt or Sign) [HAC]
|
|
case 2:
|
|
// RSA Encrypt-Only [HAC]
|
|
case 3:
|
|
// RSA Sign-Only [HAC]
|
|
var rsa = new publicKey.rsa();
|
|
var n = publickey_MPIs[0].toBigInteger();
|
|
var e = publickey_MPIs[1].toBigInteger();
|
|
var x = msg_MPIs[0].toBigInteger();
|
|
dopublic = rsa.verify(x, e, n);
|
|
var hash = pkcs1.emsa.decode(hash_algo, dopublic.toMPI().substring(2));
|
|
if (hash == -1) {
|
|
throw new Error('PKCS1 padding in message or key incorrect. Aborting...');
|
|
}
|
|
return hash == calc_hash;
|
|
|
|
case 16:
|
|
// Elgamal (Encrypt-Only) [ELGAMAL] [HAC]
|
|
throw new Error("signing with Elgamal is not defined in the OpenPGP standard.");
|
|
case 17:
|
|
// DSA (Digital Signature Algorithm) [FIPS186] [HAC]
|
|
var dsa = new publicKey.dsa();
|
|
var s1 = msg_MPIs[0].toBigInteger();
|
|
var s2 = msg_MPIs[1].toBigInteger();
|
|
var p = publickey_MPIs[0].toBigInteger();
|
|
var q = publickey_MPIs[1].toBigInteger();
|
|
var g = publickey_MPIs[2].toBigInteger();
|
|
var y = publickey_MPIs[3].toBigInteger();
|
|
var m = data;
|
|
dopublic = dsa.verify(hash_algo, s1, s2, m, p, q, g, y);
|
|
return dopublic.compareTo(s1) === 0;
|
|
default:
|
|
throw new Error('Invalid signature algorithm.');
|
|
}
|
|
},
|
|
|
|
/**
|
|
* Create a signature on data using the specified algorithm
|
|
* @param {module:enums.hash} hash_algo hash Algorithm to use (See {@link http://tools.ietf.org/html/rfc4880#section-9.4|RFC 4880 9.4})
|
|
* @param {module:enums.publicKey} algo Asymmetric cipher algorithm to use (See {@link http://tools.ietf.org/html/rfc4880#section-9.1|RFC 4880 9.1})
|
|
* @param {Array<module:type/mpi>} publicMPIs Public key multiprecision integers
|
|
* of the private key
|
|
* @param {Array<module:type/mpi>} secretMPIs Private key multiprecision
|
|
* integers which is used to sign the data
|
|
* @param {String} data Data to be signed
|
|
* @return {Array<module:type/mpi>}
|
|
*/
|
|
sign: function(hash_algo, algo, keyIntegers, data) {
|
|
|
|
var m;
|
|
|
|
switch (algo) {
|
|
case 1:
|
|
// RSA (Encrypt or Sign) [HAC]
|
|
case 2:
|
|
// RSA Encrypt-Only [HAC]
|
|
case 3:
|
|
// RSA Sign-Only [HAC]
|
|
var rsa = new publicKey.rsa();
|
|
var d = keyIntegers[2].toBigInteger();
|
|
var n = keyIntegers[0].toBigInteger();
|
|
m = pkcs1.emsa.encode(hash_algo,
|
|
data, keyIntegers[0].byteLength());
|
|
|
|
return rsa.sign(m, d, n).toMPI();
|
|
|
|
case 17:
|
|
// DSA (Digital Signature Algorithm) [FIPS186] [HAC]
|
|
var dsa = new publicKey.dsa();
|
|
|
|
var p = keyIntegers[0].toBigInteger();
|
|
var q = keyIntegers[1].toBigInteger();
|
|
var g = keyIntegers[2].toBigInteger();
|
|
var y = keyIntegers[3].toBigInteger();
|
|
var x = keyIntegers[4].toBigInteger();
|
|
m = data;
|
|
var result = dsa.sign(hash_algo, m, g, p, q, x);
|
|
|
|
return result[0].toString() + result[1].toString();
|
|
case 16:
|
|
// Elgamal (Encrypt-Only) [ELGAMAL] [HAC]
|
|
throw new Error('Signing with Elgamal is not defined in the OpenPGP standard.');
|
|
default:
|
|
throw new Error('Invalid signature algorithm.');
|
|
}
|
|
}
|
|
};
|
|
</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>
|