mirror of
https://github.com/openpgpjs/openpgpjs.git
synced 2026-03-02 23:13:25 +00:00
Test cleanup, and fall out from that. test/crypto/openpgp.crypto.js is
still broken because DSA still has issues. I'm guessing elgamal will too once the DSA ones are fixed.
This commit is contained in:
@@ -18,10 +18,10 @@
|
||||
// The GPG4Browsers crypto interface
|
||||
|
||||
var random = require('./random.js'),
|
||||
cipher = require('./cipher'),
|
||||
cfb = require('./cfb.js'),
|
||||
publicKey= require('./public_key'),
|
||||
type_mpi = require('../type/mpi.js');
|
||||
cipher = require('./cipher'),
|
||||
cfb = require('./cfb.js'),
|
||||
publicKey= require('./public_key'),
|
||||
type_mpi = require('../type/mpi.js');
|
||||
|
||||
module.exports = {
|
||||
/**
|
||||
@@ -34,34 +34,34 @@ module.exports = {
|
||||
* if elgamal encryption an array of two openpgp_type_mpi is returned; otherwise null
|
||||
*/
|
||||
publicKeyEncrypt: function(algo, publicMPIs, data) {
|
||||
var result = (function() {
|
||||
switch(algo) {
|
||||
case 'rsa_encrypt':
|
||||
case 'rsa_encrypt_sign':
|
||||
var rsa = new publicKey.rsa();
|
||||
var n = publicMPIs[0].toBigInteger();
|
||||
var e = publicMPIs[1].toBigInteger();
|
||||
var m = data.toBigInteger();
|
||||
return [rsa.encrypt(m,e,n)];
|
||||
var result = (function() {
|
||||
switch(algo) {
|
||||
case 'rsa_encrypt':
|
||||
case 'rsa_encrypt_sign':
|
||||
var rsa = new publicKey.rsa();
|
||||
var n = publicMPIs[0].toBigInteger();
|
||||
var e = publicMPIs[1].toBigInteger();
|
||||
var m = data.toBigInteger();
|
||||
return [rsa.encrypt(m,e,n)];
|
||||
|
||||
case 'elgamal':
|
||||
var elgamal = new publicKey.elgamal();
|
||||
var p = publicMPIs[0].toBigInteger();
|
||||
var g = publicMPIs[1].toBigInteger();
|
||||
var y = publicMPIs[2].toBigInteger();
|
||||
var m = data.toBigInteger();
|
||||
return elgamal.encrypt(m,g,p,y);
|
||||
case 'elgamal':
|
||||
var elgamal = new publicKey.elgamal();
|
||||
var p = publicMPIs[0].toBigInteger();
|
||||
var g = publicMPIs[1].toBigInteger();
|
||||
var y = publicMPIs[2].toBigInteger();
|
||||
var m = data.toBigInteger();
|
||||
return elgamal.encrypt(m,g,p,y);
|
||||
|
||||
default:
|
||||
return [];
|
||||
}
|
||||
})();
|
||||
default:
|
||||
return [];
|
||||
}
|
||||
})();
|
||||
|
||||
return result.map(function(bn) {
|
||||
var mpi = new type_mpi();
|
||||
mpi.fromBigInteger(bn);
|
||||
return mpi;
|
||||
});
|
||||
return result.map(function(bn) {
|
||||
var mpi = new type_mpi();
|
||||
mpi.fromBigInteger(bn);
|
||||
return mpi;
|
||||
});
|
||||
},
|
||||
|
||||
/**
|
||||
@@ -77,33 +77,33 @@ publicKeyEncrypt: function(algo, publicMPIs, data) {
|
||||
*/
|
||||
|
||||
publicKeyDecrypt: function (algo, keyIntegers, dataIntegers) {
|
||||
var bn = (function() {
|
||||
switch(algo) {
|
||||
case 'rsa_encrypt_sign':
|
||||
case 'rsa_encrypt':
|
||||
var rsa = new publicKey.rsa();
|
||||
// 0 and 1 are the public key.
|
||||
var d = keyIntegers[2].toBigInteger();
|
||||
var p = keyIntegers[3].toBigInteger();
|
||||
var q = keyIntegers[4].toBigInteger();
|
||||
var u = keyIntegers[5].toBigInteger();
|
||||
var m = dataIntegers[0].toBigInteger();
|
||||
return rsa.decrypt(m, d, p, q, u);
|
||||
case 'elgamal':
|
||||
var elgamal = new publicKey.elgamal();
|
||||
var x = keyIntegers[3].toBigInteger();
|
||||
var c1 = dataIntegers[0].toBigInteger();
|
||||
var c2 = dataIntegers[1].toBigInteger();
|
||||
var p = keyIntegers[0].toBigInteger();
|
||||
return elgamal.decrypt(c1,c2,p,x);
|
||||
default:
|
||||
return null;
|
||||
}
|
||||
})();
|
||||
var bn = (function() {
|
||||
switch(algo) {
|
||||
case 'rsa_encrypt_sign':
|
||||
case 'rsa_encrypt':
|
||||
var rsa = new publicKey.rsa();
|
||||
// 0 and 1 are the public key.
|
||||
var d = keyIntegers[2].toBigInteger();
|
||||
var p = keyIntegers[3].toBigInteger();
|
||||
var q = keyIntegers[4].toBigInteger();
|
||||
var u = keyIntegers[5].toBigInteger();
|
||||
var m = dataIntegers[0].toBigInteger();
|
||||
return rsa.decrypt(m, d, p, q, u);
|
||||
case 'elgamal':
|
||||
var elgamal = new publicKey.elgamal();
|
||||
var x = keyIntegers[3].toBigInteger();
|
||||
var c1 = dataIntegers[0].toBigInteger();
|
||||
var c2 = dataIntegers[1].toBigInteger();
|
||||
var p = keyIntegers[0].toBigInteger();
|
||||
return elgamal.decrypt(c1,c2,p,x);
|
||||
default:
|
||||
return null;
|
||||
}
|
||||
})();
|
||||
|
||||
var result = new type_mpi();
|
||||
result.fromBigInteger(bn);
|
||||
return result;
|
||||
var result = new type_mpi();
|
||||
result.fromBigInteger(bn);
|
||||
return result;
|
||||
},
|
||||
|
||||
/** Returns the number of integers comprising the private key of an algorithm
|
||||
@@ -111,58 +111,58 @@ publicKeyDecrypt: function (algo, keyIntegers, dataIntegers) {
|
||||
* @return {Integer} The number of integers.
|
||||
*/
|
||||
getPrivateMpiCount: function(algo) {
|
||||
switch(algo) {
|
||||
case 'rsa_encrypt':
|
||||
case 'rsa_encrypt_sign':
|
||||
case 'rsa_sign':
|
||||
// Algorithm-Specific Fields for RSA secret keys:
|
||||
// - multiprecision integer (MPI) of RSA secret exponent d.
|
||||
// - MPI of RSA secret prime value p.
|
||||
// - MPI of RSA secret prime value q (p < q).
|
||||
// - MPI of u, the multiplicative inverse of p, mod q.
|
||||
return 4;
|
||||
case 'elgamal':
|
||||
// Algorithm-Specific Fields for Elgamal secret keys:
|
||||
// - MPI of Elgamal secret exponent x.
|
||||
return 1;
|
||||
case 'dsa':
|
||||
// Algorithm-Specific Fields for DSA secret keys:
|
||||
// - MPI of DSA secret exponent x.
|
||||
return 1;
|
||||
default:
|
||||
throw new Error('Unknown algorithm');
|
||||
}
|
||||
switch(algo) {
|
||||
case 'rsa_encrypt':
|
||||
case 'rsa_encrypt_sign':
|
||||
case 'rsa_sign':
|
||||
// Algorithm-Specific Fields for RSA secret keys:
|
||||
// - multiprecision integer (MPI) of RSA secret exponent d.
|
||||
// - MPI of RSA secret prime value p.
|
||||
// - MPI of RSA secret prime value q (p < q).
|
||||
// - MPI of u, the multiplicative inverse of p, mod q.
|
||||
return 4;
|
||||
case 'elgamal':
|
||||
// Algorithm-Specific Fields for Elgamal secret keys:
|
||||
// - MPI of Elgamal secret exponent x.
|
||||
return 1;
|
||||
case 'dsa':
|
||||
// Algorithm-Specific Fields for DSA secret keys:
|
||||
// - MPI of DSA secret exponent x.
|
||||
return 1;
|
||||
default:
|
||||
throw new Error('Unknown algorithm');
|
||||
}
|
||||
},
|
||||
|
||||
|
||||
getPublicMpiCount: function(algo) {
|
||||
// - A series of multiprecision integers comprising the key material:
|
||||
// Algorithm-Specific Fields for RSA public keys:
|
||||
// - a multiprecision integer (MPI) of RSA public modulus n;
|
||||
// - an MPI of RSA public encryption exponent e.
|
||||
switch(algo) {
|
||||
case 'rsa_encrypt':
|
||||
case 'rsa_encrypt_sign':
|
||||
case 'rsa_sign':
|
||||
return 2;
|
||||
// - A series of multiprecision integers comprising the key material:
|
||||
// Algorithm-Specific Fields for RSA public keys:
|
||||
// - a multiprecision integer (MPI) of RSA public modulus n;
|
||||
// - an MPI of RSA public encryption exponent e.
|
||||
switch(algo) {
|
||||
case 'rsa_encrypt':
|
||||
case 'rsa_encrypt_sign':
|
||||
case 'rsa_sign':
|
||||
return 2;
|
||||
|
||||
// Algorithm-Specific Fields for Elgamal public keys:
|
||||
// - MPI of Elgamal prime p;
|
||||
// - MPI of Elgamal group generator g;
|
||||
// - MPI of Elgamal public key value y (= g**x mod p where x is secret).
|
||||
case 'elgamal':
|
||||
return 3;
|
||||
// Algorithm-Specific Fields for Elgamal public keys:
|
||||
// - MPI of Elgamal prime p;
|
||||
// - MPI of Elgamal group generator g;
|
||||
// - MPI of Elgamal public key value y (= g**x mod p where x is secret).
|
||||
case 'elgamal':
|
||||
return 3;
|
||||
|
||||
// Algorithm-Specific Fields for DSA public keys:
|
||||
// - MPI of DSA prime p;
|
||||
// - MPI of DSA group order q (q is a prime divisor of p-1);
|
||||
// - MPI of DSA group generator g;
|
||||
// - MPI of DSA public-key value y (= g**x mod p where x is secret).
|
||||
case 'dsa':
|
||||
return 4;
|
||||
// Algorithm-Specific Fields for DSA public keys:
|
||||
// - MPI of DSA prime p;
|
||||
// - MPI of DSA group order q (q is a prime divisor of p-1);
|
||||
// - MPI of DSA group generator g;
|
||||
// - MPI of DSA public-key value y (= g**x mod p where x is secret).
|
||||
case 'dsa':
|
||||
return 4;
|
||||
|
||||
default:
|
||||
throw new Error('Unknown algorithm.');
|
||||
}
|
||||
default:
|
||||
throw new Error('Unknown algorithm.');
|
||||
}
|
||||
},
|
||||
|
||||
|
||||
@@ -173,7 +173,7 @@ getPublicMpiCount: function(algo) {
|
||||
* size of the cipher
|
||||
*/
|
||||
getPrefixRandom: function(algo) {
|
||||
return random.getRandomBytes(cipher[algo].blockSize);
|
||||
return random.getRandomBytes(cipher[algo].blockSize);
|
||||
},
|
||||
|
||||
/**
|
||||
@@ -182,7 +182,7 @@ getPrefixRandom: function(algo) {
|
||||
* @return {String} Random bytes as a string to be used as a key
|
||||
*/
|
||||
generateSessionKey: function(algo) {
|
||||
return random.getRandomBytes(this.getKeyLength(algo));
|
||||
return random.getRandomBytes(this.getKeyLength(algo));
|
||||
},
|
||||
|
||||
/**
|
||||
@@ -191,31 +191,35 @@ generateSessionKey: function(algo) {
|
||||
* @return {BigInteger} Resulting big integer
|
||||
*/
|
||||
getRandomBigInteger: function(bits) {
|
||||
if (bits < 0)
|
||||
return null;
|
||||
var numBytes = Math.floor((bits+7)/8);
|
||||
if (bits < 0) {
|
||||
return null;
|
||||
}
|
||||
var numBytes = Math.floor((bits+7)/8);
|
||||
|
||||
var randomBits = random.getRandomBytes(numBytes);
|
||||
if (bits % 8 > 0) {
|
||||
|
||||
randomBits = String.fromCharCode(
|
||||
(Math.pow(2,bits % 8)-1) &
|
||||
randomBits.charCodeAt(0)) +
|
||||
randomBits.substring(1);
|
||||
}
|
||||
return new type_mpi().create(randomBits).toBigInteger();
|
||||
var randomBits = random.getRandomBytes(numBytes);
|
||||
if (bits % 8 > 0) {
|
||||
|
||||
randomBits = String.fromCharCode(
|
||||
(Math.pow(2,bits % 8)-1) &
|
||||
randomBits.charCodeAt(0)) +
|
||||
randomBits.substring(1);
|
||||
}
|
||||
var mpi = new type_mpi();
|
||||
mpi.fromBytes(randomBits);
|
||||
return mpi.toBigInteger();
|
||||
},
|
||||
|
||||
getRandomBigIntegerInRange: function(min, max) {
|
||||
if (max.compareTo(min) <= 0)
|
||||
return;
|
||||
if (max.compareTo(min) <= 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
var range = max.subtract(min);
|
||||
var r = this.getRandomBigInteger(range.bitLength());
|
||||
while (r > range) {
|
||||
r = this.getRandomBigInteger(range.bitLength());
|
||||
}
|
||||
return min.add(r);
|
||||
var range = max.subtract(min);
|
||||
var r = this.getRandomBigInteger(range.bitLength());
|
||||
while (r > range) {
|
||||
r = this.getRandomBigInteger(range.bitLength());
|
||||
}
|
||||
return min.add(r);
|
||||
},
|
||||
|
||||
}
|
||||
|
||||
@@ -17,6 +17,11 @@
|
||||
//
|
||||
// A Digital signature algorithm implementation
|
||||
|
||||
var BigInteger = require('./jsbn.js'),
|
||||
crypto = require('../crypto.js'),
|
||||
hashModule = require('../hash'),
|
||||
util = require('../../util');
|
||||
|
||||
function DSA() {
|
||||
// s1 = ((g**s) mod p) mod q
|
||||
// s1 = ((s**-1)*(sha-1(m)+(s1*x) mod q)
|
||||
@@ -26,9 +31,9 @@ function DSA() {
|
||||
// of leftmost bits equal to the number of bits of q. This (possibly
|
||||
// truncated) hash function result is treated as a number and used
|
||||
// directly in the DSA signature algorithm.
|
||||
var hashed_data = util.getLeftNBits(openpgp_crypto_hashData(hashalgo,m),q.bitLength());
|
||||
var hashed_data = util.getLeftNBits(hashModule.digest(hashalgo,m),q.bitLength());
|
||||
var hash = new BigInteger(util.hexstrdump(hashed_data), 16);
|
||||
var k = openpgp_crypto_getRandomBigIntegerInRange(BigInteger.ONE.add(BigInteger.ONE), q.subtract(BigInteger.ONE));
|
||||
var k = crypto.getRandomBigIntegerInRange(BigInteger.ONE.add(BigInteger.ONE), q.subtract(BigInteger.ONE));
|
||||
var s1 = (g.modPow(k,p)).mod(q);
|
||||
var s2 = (k.modInverse(q).multiply(hash.add(x.multiply(s1)))).mod(q);
|
||||
var result = new Array();
|
||||
@@ -71,7 +76,7 @@ function DSA() {
|
||||
this.select_hash_algorithm = select_hash_algorithm;
|
||||
|
||||
function verify(hashalgo, s1,s2,m,p,q,g,y) {
|
||||
var hashed_data = util.getLeftNBits(openpgp_crypto_hashData(hashalgo,m),q.bitLength());
|
||||
var hashed_data = util.getLeftNBits(hashModule.digest(hashalgo,m),q.bitLength());
|
||||
var hash = new BigInteger(util.hexstrdump(hashed_data), 16);
|
||||
if (BigInteger.ZERO.compareTo(s1) > 0 ||
|
||||
s1.compareTo(q) > 0 ||
|
||||
|
||||
@@ -34,8 +34,6 @@ module.exports = function packet_symmetrically_encrypted() {
|
||||
* @type {openpgp_packetlist} */
|
||||
this.packets;
|
||||
|
||||
|
||||
|
||||
this.read = function(bytes) {
|
||||
this.encrypted = bytes;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user