Pollard's rho algorithm for computing discrete logs.
[u/mdw/catacomb] / keyutil.c
index 673f4ea..be8d5f9 100644 (file)
--- a/keyutil.c
+++ b/keyutil.c
@@ -1,6 +1,6 @@
 /* -*-c-*-
  *
- * $Id: keyutil.c,v 1.5 2000/02/12 18:21:03 mdw Exp $
+ * $Id: keyutil.c,v 1.7 2000/07/01 11:18:51 mdw Exp $
  *
  * Simple key manager program
  *
 /*----- Revision history --------------------------------------------------* 
  *
  * $Log: keyutil.c,v $
+ * Revision 1.7  2000/07/01 11:18:51  mdw
+ * Use new interfaces for key manipulation.
+ *
+ * Revision 1.6  2000/06/17 11:28:22  mdw
+ * Use secure memory interface from MP library.  `rand_getgood' is
+ * deprecated.
+ *
  * Revision 1.5  2000/02/12 18:21:03  mdw
  * Overhaul of key management (again).
  *
@@ -340,7 +347,7 @@ static void alg_binary(keyopts *k)
   sz = (k->bits + 7) >> 3;
   p = sub_alloc(sz);
   m = (1 << (((k->bits - 1) & 7) + 1)) - 1;
-  rand_getgood(RAND_GLOBAL, p, sz);
+  rand_get(RAND_GLOBAL, p, sz);
   *p &= m;
   key_binary(&k->k->k, p, sz);
   k->k->k.e |= KCAT_SYMM | KF_BURN;
@@ -364,7 +371,7 @@ static void alg_des(keyopts *k)
 
   sz = k->bits / 7;
   p = sub_alloc(sz);
-  rand_getgood(RAND_GLOBAL, p, sz);    /* Too much work done here! */
+  rand_get(RAND_GLOBAL, p, sz);        /* Too much work done here! */
   for (i = 0; i < sz; i++) {
     octet x = p[i] | 0x01;
     x = x ^ (x >> 4);
@@ -381,7 +388,7 @@ static void alg_des(keyopts *k)
 
 static void alg_rsa(keyopts *k)
 {
-  rsa_param rp;
+  rsa_priv rp;
   key_data *kd;
 
   /* --- Sanity checking --- */
@@ -401,21 +408,14 @@ static void alg_rsa(keyopts *k)
 
   {
     grand *g = fibrand_create(rand_global.ops->word(&rand_global));
-    mpmont mm;
+    rsa_pub rpp;
     mp *m = mprand_range(MP_NEW, rp.n, g, 0);
     mp *c;
 
-    /* --- Encrypt the plaintext --- */
-
-    mpmont_create(&mm, rp.n);
-    c = mpmont_exp(&mm, MP_NEW, m, rp.e);
-    mpmont_destroy(&mm);
-
-    /* --- Decrypt the ciphertext --- */
-
-    c = rsa_decrypt(&rp, c, c, g);
-
-    /* --- Check everything went OK --- */
+    rpp.n = rp.n;
+    rpp.e = rp.e;
+    c = rsa_qpubop(&rpp, MP_NEW, m);
+    c = rsa_qprivop(&rp, c, c, g);
 
     if (MP_CMP(c, !=, m))
       die(EXIT_FAILURE, "test encryption failed");
@@ -441,8 +441,7 @@ static void alg_rsa(keyopts *k)
   mpkey(kd, "d-mod-q", rp.dq, KCAT_PRIV | KF_BURN);
   dolock(k, kd, "private");
 
-  mp_drop(rp.p); mp_drop(rp.q); mp_drop(rp.n); mp_drop(rp.q_inv);
-  mp_drop(rp.e); mp_drop(rp.d); mp_drop(rp.dp); mp_drop(rp.dq);
+  rsa_privfree(&rp);
 }
 
 static void alg_dsaparam(keyopts *k)
@@ -467,7 +466,7 @@ static void alg_dsaparam(keyopts *k)
 
     sz = (k->qbits + 7) >> 3;
     p = sub_alloc(sz);
-    rand_getgood(RAND_GLOBAL, p, sz);
+    rand_get(RAND_GLOBAL, p, sz);
 
     /* --- Allocate the parameters --- */
 
@@ -514,8 +513,7 @@ static void alg_dsa(keyopts *k)
 
   /* --- Choose a private key --- */
 
-  x = mprand_range(MP_NEW, q, &rand_global, 0);
-  mp_burn(x);
+  x = mprand_range(MP_NEWSEC, q, &rand_global, 0);
   mpmont_create(&mm, p);
   y = mpmont_exp(&mm, MP_NEW, g, x);
 
@@ -576,8 +574,7 @@ static void alg_dh(keyopts *k)
    * Since %$g$% has order %$q$%, choose %$x < q$%.
    */
 
-  x = mprand_range(MP_NEW, q, &rand_global, 0);
-  mp_burn(x);
+  x = mprand_range(MP_NEWSEC, q, &rand_global, 0);
 
   /* --- Compute the public key %$y = g^x \bmod p$% --- */
 
@@ -599,7 +596,7 @@ static void alg_dh(keyopts *k)
 
 static void alg_bbs(keyopts *k)
 {
-  bbs_param bp;
+  bbs_priv bp;
   key_data *kd;
 
   /* --- Sanity checking --- */
@@ -627,7 +624,7 @@ static void alg_bbs(keyopts *k)
   mpkey(kd, "q", bp.q, KCAT_PRIV | KF_BURN);
   dolock(k, kd, "private");
 
-  mp_drop(bp.p); mp_drop(bp.q); mp_drop(bp.n);
+  bbs_privfree(&bp);
 }
 
 /* --- The algorithm tables --- */
@@ -1656,8 +1653,8 @@ int main(int argc, char *argv[])
 
   /* --- Initialize the Catacomb random number generator --- */
 
-  rand_init(RAND_GLOBAL);
   rand_noisesrc(RAND_GLOBAL, &noise_source);
+  rand_seed(RAND_GLOBAL, 160);
 
   /* --- Dispatch to appropriate command handler --- */