Skip to content
Snippets Groups Projects
Commit bb84b08d authored by Niels Möller's avatar Niels Möller
Browse files

Use an instance variable for random-number generator.

Rev: lib/modules/Crypto/dsa.pike:1.3
parent cd6e8217
No related branches found
No related tags found
No related merge requests found
...@@ -12,6 +12,8 @@ bignum g; /* Generator */ ...@@ -12,6 +12,8 @@ bignum g; /* Generator */
bignum y; /* Public key */ bignum y; /* Public key */
bignum x; /* Private key */ bignum x; /* Private key */
function random;
object set_public_key(bignum p_, bignum q_, bignum g_, bignum y_) object set_public_key(bignum p_, bignum q_, bignum g_, bignum y_)
{ {
p = p_; q = q_; g = g_; y = y_; p = p_; q = q_; g = g_; y = y_;
...@@ -24,6 +26,11 @@ object set_private_key(bignum secret) ...@@ -24,6 +26,11 @@ object set_private_key(bignum secret)
return this_object(); return this_object();
} }
object use_random(function r)
{
random = r;
}
bignum hash2number(string digest) bignum hash2number(string digest)
{ {
return Gmp.mpz(digest, 256) % q; return Gmp.mpz(digest, 256) % q;
...@@ -35,19 +42,19 @@ bignum dsa_hash(string msg) ...@@ -35,19 +42,19 @@ bignum dsa_hash(string msg)
} }
/* Generate a random number k, 0<=k<n */ /* Generate a random number k, 0<=k<n */
bignum random_number(bignum n, function r) bignum random_number(bignum n)
{ {
return Gmp.mpz(r( (q->size() + 10 / 8)), 256) % n; return Gmp.mpz(random( (q->size() + 10 / 8)), 256) % n;
} }
bignum random_exponent(function r) bignum random_exponent()
{ {
return random_number(q - 1, r) + 1; return random_number(q - 1) + 1;
} }
array(bignum) raw_sign(bignum h, function random) array(bignum) raw_sign(bignum h)
{ {
bignum k = random_exponent(random); bignum k = random_exponent();
bignum r = g->powm(k, p) % q; bignum r = g->powm(k, p) % q;
bignum s = (k->invert(q) * (h + x*r)) % q; bignum s = (k->invert(q) * (h + x*r)) % q;
...@@ -69,7 +76,7 @@ int raw_verify(bignum h, bignum r, bignum s) ...@@ -69,7 +76,7 @@ int raw_verify(bignum h, bignum r, bignum s)
return r == (g->powm(w * h % q, p) * y->powm(w * r % q, p) % p) % q; return r == (g->powm(w * h % q, p) * y->powm(w * r % q, p) % p) % q;
} }
string sign_rsaref(string msg, function random) string sign_rsaref(string msg)
{ {
[bignum r, bignum s] = raw_sign(dsa_hash(msg), random); [bignum r, bignum s] = raw_sign(dsa_hash(msg), random);
...@@ -86,7 +93,7 @@ int verify_rsaref(string msg, string s) ...@@ -86,7 +93,7 @@ int verify_rsaref(string msg, string s)
Gmp.mpz(s[20..], 256)); Gmp.mpz(s[20..], 256));
} }
string sign_ssl(string msg, function random) string sign_ssl(string msg)
{ {
return Standards.ASN1.Types.asn1_sequence( return Standards.ASN1.Types.asn1_sequence(
Array.map(raw_sign(dsa_hash(msg), random), Array.map(raw_sign(dsa_hash(msg), random),
...@@ -140,7 +147,7 @@ string nist_hash(bignum x) ...@@ -140,7 +147,7 @@ string nist_hash(bignum x)
} }
/* Returns ({ p, q }) */ /* Returns ({ p, q }) */
array(bignum) nist_primes(int l, function r) array(bignum) nist_primes(int l)
{ {
if ( (l < 0) || (l > 8) ) if ( (l < 0) || (l > 8) )
throw( ({ "Crypto.dsa->nist_primes: Unsupported key size.\n", throw( ({ "Crypto.dsa->nist_primes: Unsupported key size.\n",
...@@ -154,7 +161,7 @@ array(bignum) nist_primes(int l, function r) ...@@ -154,7 +161,7 @@ array(bignum) nist_primes(int l, function r)
for (;;) for (;;)
{ {
/* Generate q */ /* Generate q */
string seed = r(SEED_LENGTH); string seed = random(SEED_LENGTH);
bignum s = Gmp.mpz(seed, 256); bignum s = Gmp.mpz(seed, 256);
string h = nist_hash(s) ^ nist_hash(s + 1); string h = nist_hash(s) ^ nist_hash(s + 1);
...@@ -194,7 +201,7 @@ array(bignum) nist_primes(int l, function r) ...@@ -194,7 +201,7 @@ array(bignum) nist_primes(int l, function r)
} }
} }
bignum find_generator(bignum p, bignum q, function r) bignum find_generator(bignum p, bignum q)
{ {
bignum e = (p - 1) / q; bignum e = (p - 1) / q;
bignum g; bignum g;
...@@ -202,7 +209,7 @@ bignum find_generator(bignum p, bignum q, function r) ...@@ -202,7 +209,7 @@ bignum find_generator(bignum p, bignum q, function r)
do do
{ {
/* A random number in { 2, 3, ... p - 2 } */ /* A random number in { 2, 3, ... p - 2 } */
g = (random_number(p-3, r) + 2) g = (random_number(p-3) + 2)
/* Exponentiate to get an element of order 1 or q */ /* Exponentiate to get an element of order 1 or q */
->powm(e, p); ->powm(e, p);
} }
...@@ -211,16 +218,13 @@ bignum find_generator(bignum p, bignum q, function r) ...@@ -211,16 +218,13 @@ bignum find_generator(bignum p, bignum q, function r)
return g; return g;
} }
object generate_key(int bits, function r) object generate_parameters(int bits)
{ {
if (!r)
r = Crypto.randomness.really_random()->read;
if (bits % 64) if (bits % 64)
throw( ({ "Crypto.dsa->generate_key: Unsupported key size.\n", throw( ({ "Crypto.dsa->generate_key: Unsupported key size.\n",
backtrace() }) ); backtrace() }) );
[p, q] = nist_primes(bits / 64 - 8, r); [p, q] = nist_primes(bits / 64 - 8);
if (p % q != 1) if (p % q != 1)
throw( ({ "Crypto.dsa->generate_key: Internal error.\n", backtrace() }) ); throw( ({ "Crypto.dsa->generate_key: Internal error.\n", backtrace() }) );
...@@ -228,13 +232,18 @@ object generate_key(int bits, function r) ...@@ -228,13 +232,18 @@ object generate_key(int bits, function r)
if (q->size() != 160) if (q->size() != 160)
throw( ({ "Crypto.dsa->generate_key: Internal error.\n", backtrace() }) ); throw( ({ "Crypto.dsa->generate_key: Internal error.\n", backtrace() }) );
g = find_generator(p, q, r); g = find_generator(p, q);
if ( (g == 1) || (g->powm(q, p) != 1)) if ( (g == 1) || (g->powm(q, p) != 1))
throw( ({ "Crypto.dsa->generate_key: Internal error.\n", backtrace() }) ); throw( ({ "Crypto.dsa->generate_key: Internal error.\n", backtrace() }) );
return this_object();
}
object generate_key()
{
/* x in { 2, 3, ... q - 1 } */ /* x in { 2, 3, ... q - 1 } */
x = random_number(q - 2, r) + 2; x = random_number(q - 2) + 2;
y = g->powm(x, p); y = g->powm(x, p);
return this_object(); return this_object();
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment