diff --git a/lib/modules/Crypto/dsa.pike b/lib/modules/Crypto/dsa.pike
index 9aca2edf7f141ff28891ea4ce02948792fee08ee..3c3334e45c5209d81bcbb266fdf93b3d4d4a5b52 100644
--- a/lib/modules/Crypto/dsa.pike
+++ b/lib/modules/Crypto/dsa.pike
@@ -12,6 +12,8 @@ bignum g; /* Generator */
 bignum y; /* Public key */
 bignum x; /* Private key */
 
+function random;
+
 object set_public_key(bignum p_, bignum q_, bignum g_, bignum y_)
 {
   p = p_; q = q_; g = g_; y = y_;
@@ -24,6 +26,11 @@ object set_private_key(bignum secret)
   return this_object();
 }
 
+object use_random(function r)
+{
+  random = r;
+}
+
 bignum hash2number(string digest)
 {
   return Gmp.mpz(digest, 256) % q;
@@ -35,19 +42,19 @@ bignum dsa_hash(string msg)
 }
   
 /* 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 s = (k->invert(q) * (h + x*r)) % q;
@@ -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;
 }
 
-string sign_rsaref(string msg, function random)
+string sign_rsaref(string msg)
 {
   [bignum r, bignum s] = raw_sign(dsa_hash(msg), random);
 
@@ -86,7 +93,7 @@ int verify_rsaref(string msg, string s)
 		    Gmp.mpz(s[20..], 256));
 }
 
-string sign_ssl(string msg, function random)
+string sign_ssl(string msg)
 {
   return Standards.ASN1.Types.asn1_sequence(
     Array.map(raw_sign(dsa_hash(msg), random),
@@ -140,7 +147,7 @@ string nist_hash(bignum x)
 }
 
 /* Returns ({ p, q }) */
-array(bignum) nist_primes(int l, function r)
+array(bignum) nist_primes(int l)
 {
   if ( (l < 0) || (l > 8) )
     throw( ({ "Crypto.dsa->nist_primes: Unsupported key size.\n",
@@ -154,7 +161,7 @@ array(bignum) nist_primes(int l, function r)
   for (;;)
   {
     /* Generate q */
-    string seed = r(SEED_LENGTH);
+    string seed = random(SEED_LENGTH);
     bignum s = Gmp.mpz(seed, 256);
 
     string h = nist_hash(s) ^ nist_hash(s + 1);
@@ -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 g;
@@ -202,7 +209,7 @@ bignum find_generator(bignum p, bignum q, function r)
   do
   {
     /* 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 */
       ->powm(e, p);
   }
@@ -211,16 +218,13 @@ bignum find_generator(bignum p, bignum q, function r)
   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)
     throw( ({ "Crypto.dsa->generate_key: Unsupported key size.\n",
 		backtrace() }) );
 
-  [p, q] = nist_primes(bits / 64 - 8, r);
+  [p, q] = nist_primes(bits / 64 - 8);
 
   if (p % q != 1)
     throw( ({ "Crypto.dsa->generate_key: Internal error.\n", backtrace() }) );
@@ -228,13 +232,18 @@ object generate_key(int bits, function r)
   if (q->size() != 160)
     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))
     throw( ({ "Crypto.dsa->generate_key: Internal error.\n", backtrace() }) );
-    
+
+  return this_object();
+}
+
+object generate_key()
+{
   /* x in { 2, 3, ... q - 1 } */
-  x = random_number(q - 2, r) + 2;
+  x = random_number(q - 2) + 2;
   y = g->powm(x, p);
 
   return this_object();