* g10.c (main): Use 3DES instead of CAST5 if we don't have CAST5 support.
[gnupg.git] / g10 / keygen.c
index aa30b4d..ccaa4ad 100644 (file)
@@ -143,56 +143,43 @@ do_add_key_flags (PKT_signature *sig, unsigned int use)
     build_sig_subpkt (sig, SIGSUBPKT_KEY_FLAGS, buf, 1);
 }
 
-static void
-do_copy_key_flags (PKT_signature *sig, PKT_signature *oldsig)
-{
-  const byte *f;
-  size_t n;
-  /* Note that this will make any key flags in the unhashed area
-     disappear.  This may be good or bad, depending on your point of
-     view. */
-  f=parse_sig_subpkt(oldsig->hashed,SIGSUBPKT_KEY_FLAGS,&n);
-  if(f)
-    build_sig_subpkt(sig,SIGSUBPKT_KEY_FLAGS,f,n);
-}
 
-static void
-do_add_key_expire( PKT_signature *sig, PKT_public_key *pk )
+int
+keygen_add_key_expire( PKT_signature *sig, void *opaque )
 {
-  if( pk->expiredate )
-    {
-      byte buf[4];
-      u32 u;
+    PKT_public_key *pk = opaque;
+    byte buf[8];
+    u32  u;
 
-      u = pk->expiredate > pk->timestamp? pk->expiredate - pk->timestamp
-       : pk->timestamp;
-      buf[0] = (u >> 24) & 0xff;
-      buf[1] = (u >> 16) & 0xff;
-      buf[2] = (u >>  8) & 0xff;
-      buf[3] = u & 0xff;
-      build_sig_subpkt( sig, SIGSUBPKT_KEY_EXPIRE, buf, 4 );
-    }
-}
+    if( pk->expiredate ) {
+        if(pk->expiredate > pk->timestamp)
+         u= pk->expiredate - pk->timestamp;
+       else
+         u= 0;
 
-int
-keygen_copy_flags_add_expire( PKT_signature *sig, void *opaque )
-{
-  struct flags_expire *fe=opaque;
-  do_add_key_expire(sig,fe->pk);
-  do_copy_key_flags(sig,fe->sig);
+       buf[0] = (u >> 24) & 0xff;
+       buf[1] = (u >> 16) & 0xff;
+       buf[2] = (u >>  8) & 0xff;
+       buf[3] = u & 0xff;
+       build_sig_subpkt( sig, SIGSUBPKT_KEY_EXPIRE, buf, 4 );
+    }
+    else
+      {
+       /* Make sure we don't leave a key expiration subpacket lying
+          around */
+       delete_sig_subpkt (sig->hashed, SIGSUBPKT_KEY_EXPIRE);
+      }
 
-  return 0;
+    return 0;
 }
 
 static int
 keygen_add_key_flags_and_expire (PKT_signature *sig, void *opaque)
 {
-  struct opaque_data_usage_and_pk *oduap = opaque;
+    struct opaque_data_usage_and_pk *oduap = opaque;
 
-  do_add_key_flags (sig, oduap->usage);
-  do_add_key_expire(sig,oduap->pk);
-  return 0;
+    do_add_key_flags (sig, oduap->usage);
+    return keygen_add_key_expire (sig, oduap->pk);
 }
 
 static int
@@ -253,7 +240,7 @@ keygen_set_std_prefs (const char *string,int personal)
          <=2048 bits, as that is what won't break PGP2, but that is
          difficult with the current code, and not really worth
          checking as a non-RSA <=2048 bit key wouldn't be usable by
-         PGP2 anyway -dms */
+         PGP2 anyway. -dms */
     }
     else if (!ascii_strcasecmp (string, "none"))
         string = "";
@@ -288,6 +275,12 @@ keygen_set_std_prefs (const char *string,int personal)
            else
              {
                log_info (_("invalid item `%s' in preference string\n"),tok);
+
+               /* Complain if IDEA is not available. */
+               if(ascii_strcasecmp(tok,"s1")==0
+                  || ascii_strcasecmp(tok,"idea")==0)
+                 idea_cipher_warn(1);
+
                rc=-1;
              }
          }
@@ -511,7 +504,7 @@ keygen_add_std_prefs( PKT_signature *sig, void *opaque )
     byte buf[8];
 
     do_add_key_flags (sig, pk->pubkey_usage);
-    do_add_key_expire (sig, pk);
+    keygen_add_key_expire( sig, opaque );
     keygen_upd_std_prefs (sig, opaque);
 
     buf[0] = 0x80; /* no modify - It is reasonable that a key holder
@@ -999,12 +992,9 @@ ask_algo (int addmode, unsigned int *r_usage)
            break;
        }
        else if( algo == 7 && opt.expert ) {
-           if (cpr_get_answer_is_yes ("keygen.algo.rsa_se",_(
-               "The use of this algorithm is deprecated - create anyway? "))){
-              algo = PUBKEY_ALGO_RSA;
-              *r_usage = PUBKEY_USAGE_ENC | PUBKEY_USAGE_SIG;
-              break;
-            }
+           algo = PUBKEY_ALGO_RSA;
+           *r_usage = PUBKEY_USAGE_ENC | PUBKEY_USAGE_SIG;
+           break;
        }
        else if( algo == 6 && addmode ) {
            algo = PUBKEY_ALGO_RSA;
@@ -1016,12 +1006,19 @@ ask_algo (int addmode, unsigned int *r_usage)
             *r_usage = PUBKEY_USAGE_SIG;
            break;
        }
-       else if( algo == 4 && opt.expert) {
-           if( cpr_get_answer_is_yes("keygen.algo.elg_se",_(
-               "The use of this algorithm is deprecated - create anyway? "))){
+       else if( algo == 4 && opt.expert)
+         {
+           tty_printf(_(
+"The use of this algorithm is only supported by GnuPG.  You will not be\n"
+"able to use this key to communicate with PGP users.  This algorithm is also\n"
+"very slow, and may not be as secure as the other choices.\n"));
+
+           if( cpr_get_answer_is_yes("keygen.algo.elg_se",
+                                     _("Create anyway? ")))
+             {
                algo = PUBKEY_ALGO_ELGAMAL;
                break;
-           }
+             }
        }
        else if( algo == 3 && addmode ) {
            algo = PUBKEY_ALGO_ELGAMAL_E;