diff --git a/lib/modules/Crypto/rsa.pike b/lib/modules/Crypto/rsa.pike
index 3e2d4280f7bc83531ed95a32c91bccb1986b63bb..a8bd7a5f7acb10d96e9d858707d5002d27d57ff3 100644
--- a/lib/modules/Crypto/rsa.pike
+++ b/lib/modules/Crypto/rsa.pike
@@ -1,8 +1,6 @@
-/* $Id: rsa.pike,v 1.11 1997/10/12 14:39:47 grubba Exp $
+/* $Id: rsa.pike,v 1.12 1997/11/28 10:04:31 nisse Exp $
  *
  * Follow the PKCS#1 standard for padding and encryption.
- * However, PKCS#1 style signing (involving ISO Object Identifiers) is
- * not yet implemented.
  */
 
 #define bignum object(Gmp.mpz)
@@ -13,6 +11,11 @@ bignum e;  /* public exponent */
 bignum d;  /* private exponent (if known) */
 int size;
 
+/* Extra info associated with a private key. Not currently used. */
+   
+bignum p;
+bignum q;
+
 int encrypt_mode; /* For block cipher compatible functions */
 
 object set_public_key(bignum modulo, bignum pub)
@@ -26,9 +29,14 @@ object set_public_key(bignum modulo, bignum pub)
   return this_object();
 }
 
-object set_private_key(bignum priv)
+object set_private_key(bignum priv, array(bignum)|void extra)
 {
   d = priv;
+  if (extra)
+  {
+    p = extra[0];
+    q = extra[1];
+  }
   return this_object();
 }
 
@@ -55,14 +63,24 @@ bignum rsa_pad(string message, int type, mixed|void random)
     throw( ({ "Crypto.rsa->rsa_pad: Too large block.\n",
 		backtrace() }) );
 
-  if (random)
-    cookie = replace(random(len), "\0", "\1");
-  else
-    cookie = sprintf("%@c", Array.map(allocate(len), lambda(int dummy)
-				      {
-					return random(255) + 1;
-				      } ));
-  
+  switch(type)
+  {
+  case 1:
+    cookie = sprintf("%@c", replace(allocate(len), 0, 0xff));
+    break;
+  case 2:
+    if (random)
+      cookie = replace(random(len), "\0", "\1");
+    else
+      cookie = sprintf("%@c", Array.map(allocate(len), lambda(int dummy)
+					{
+					  return random(255) + 1;
+					} ));
+    break;
+  default:
+    throw( ({ "Crypto.rsa->rsa_pad: Unknown type.\n",
+		backtrace() }) );
+  }    
   return BIGNUM(sprintf("%c", type) + cookie + "\0" + message, 256);
 }
 
@@ -83,8 +101,13 @@ object sign(string message, program h, mixed|void r)
 
 int verify(string msg, program h, object sign)
 {
+  // werror(sprintf("msg: '%s'\n", Crypto.string_to_hex(msg)));
   string s = pkcs.build_digestinfo(msg, h());
-  return s == rsa_unpad(sign->powm(e, n), 1);
+  // werror(sprintf("rsa: s = '%s'\n", s));
+  // werror(sprintf("decrypted: '%s'\n", sign->powm(e, n)->digits(256)));
+  string s2 = rsa_unpad(sign->powm(e, n), 1);
+  // werror(sprintf("rsa: s2 = '%s'\n", s2));
+  return s == s2;
 }
 
 string sha_sign(string message, mixed|void r)
@@ -123,8 +146,8 @@ object generate_key(int bits, function|void r)
   
   do
   {
-    bignum p = get_prime(bits, r);
-    bignum q = get_prime(bits, r);
+    p = get_prime(bits, r);
+    q = get_prime(bits, r);
     bignum phi = Gmp.mpz(p-1)*Gmp.mpz(q-1);
 
     array gs; /* gcd(pub, phi), and pub^-1 mod phi */