* g10.c (main): Add --no-throw-keyid.
authorDavid Shaw <dshaw@jabberwocky.com>
Fri, 1 Nov 2002 16:15:45 +0000 (16:15 +0000)
committerDavid Shaw <dshaw@jabberwocky.com>
Fri, 1 Nov 2002 16:15:45 +0000 (16:15 +0000)
* keydb.h, encode.c (write_pubkey_enc_from_list), g10.c (main), pkclist.c
(build_pk_list): Add --hidden-recipient (-R) and --hidden-encrypt-to,
which do a single-user variation on --throw-keyid.  The "hide this key"
flag is carried in bit 0 of the pk_list flags field.

* keyserver.c (parse_keyrec): Fix shadowing warning.

g10/ChangeLog
g10/encode.c
g10/g10.c
g10/keydb.h
g10/keyserver.c
g10/pkclist.c

index 978935d..4e71443 100644 (file)
@@ -1,3 +1,15 @@
+2002-11-01  David Shaw  <dshaw@jabberwocky.com>
+
+       * g10.c (main): Add --no-throw-keyid.
+
+       * keydb.h, encode.c (write_pubkey_enc_from_list), g10.c (main),
+       pkclist.c (build_pk_list): Add --hidden-recipient (-R) and
+       --hidden-encrypt-to, which do a single-user variation on
+       --throw-keyid.  The "hide this key" flag is carried in bit 0 of
+       the pk_list flags field.
+
+       * keyserver.c (parse_keyrec): Fix shadowing warning.
+
 2002-10-31  Stefan Bellon  <sbellon@sbellon.de>
 
        * compress.c (init_compress) [__riscos__]: Use
index 6727c08..b635ce0 100644 (file)
@@ -699,7 +699,7 @@ write_pubkey_enc_from_list( PK_LIST pk_list, DEK *dek, IOBUF out )
        enc = m_alloc_clear( sizeof *enc );
        enc->pubkey_algo = pk->pubkey_algo;
        keyid_from_pk( pk, enc->keyid );
-       enc->throw_keyid = opt.throw_keyid;
+       enc->throw_keyid = (opt.throw_keyid || (pk_list->flags&1));
 
        if(opt.throw_keyid && (opt.pgp2 || opt.pgp6 || opt.pgp7))
          {
index 5aa0dbf..96696ae 100644 (file)
--- a/g10/g10.c
+++ b/g10/g10.c
@@ -65,6 +65,7 @@ enum cmd_and_opt_values { aNull = 0,
     oOutput      = 'o',
     oQuiet       = 'q',
     oRecipient   = 'r',
+    oHiddenRecipient = 'R',
     aSign        = 's',
     oTextmodeShort= 't',
     oUser        = 'u',
@@ -218,6 +219,7 @@ enum cmd_and_opt_values { aNull = 0,
     oComment,
     oDefaultComment,
     oThrowKeyid,
+    oNoThrowKeyid,
     oShowPhotos,
     oNoShowPhotos,
     oPhotoViewer,
@@ -247,6 +249,7 @@ enum cmd_and_opt_values { aNull = 0,
     oTempDir,
     oExecPath,
     oEncryptTo,
+    oHiddenEncryptTo,
     oNoEncryptTo,
     oLoggerFD,
 #ifdef __riscos__
@@ -372,6 +375,7 @@ static ARGPARSE_OPTS opts[] = {
     { oArmor, "armor",     0, N_("create ascii armored output")},
     { oArmor, "armour",     0, "@" },
     { oRecipient, "recipient", 2, N_("|NAME|encrypt for NAME")},
+    { oHiddenRecipient, "hidden-recipient", 2, "@" },
     { oRecipient, "remote-user", 2, "@"},  /* old option name */
     { oDefRecipient, "default-recipient" ,2,
                                  N_("|NAME|use NAME as default recipient")},
@@ -381,6 +385,7 @@ static ARGPARSE_OPTS opts[] = {
     { oTempDir, "temp-directory", 2, "@" },
     { oExecPath, "exec-path", 2, "@" },
     { oEncryptTo, "encrypt-to", 2, "@" },
+    { oHiddenEncryptTo, "hidden-encrypt-to", 2, "@" },
     { oNoEncryptTo, "no-encrypt-to", 0, "@" },
     { oUser, "local-user",2, N_("use this user-id to sign or decrypt")},
     { oCompress, NULL,       1, N_("|N|set compress level N (0 disables)") },
@@ -460,6 +465,7 @@ static ARGPARSE_OPTS opts[] = {
     { oCertDigestAlgo, "cert-digest-algo", 2 , "@" },
     { oCompressAlgo, "compress-algo", 1 , N_("|N|use compress algorithm N")},
     { oThrowKeyid, "throw-keyid", 0, N_("throw keyid field of encrypted packets")},
+    { oNoThrowKeyid, "no-throw-keyid", 0, "@" },
     { oShowPhotos,   "show-photos", 0, N_("Show Photo IDs")},
     { oNoShowPhotos, "no-show-photos", 0, N_("Don't show Photo IDs")},
     { oPhotoViewer,  "photo-viewer", 2, N_("Set command line to view Photo IDs")},
@@ -1515,6 +1521,7 @@ main( int argc, char **argv )
          case oComment: opt.comment_string = pargs.r.ret_str; break;
          case oDefaultComment: opt.comment_string = NULL; break;
          case oThrowKeyid: opt.throw_keyid = 1; break;
+         case oNoThrowKeyid: opt.throw_keyid = 0; break;
          case oShowPhotos: opt.show_photos = 1; break;
          case oNoShowPhotos: opt.show_photos = 0; break;
          case oPhotoViewer: opt.photo_viewer = pargs.r.ret_str; break;
@@ -1535,10 +1542,19 @@ main( int argc, char **argv )
            sl = add_to_strlist2( &remusr, pargs.r.ret_str, utf8_strings );
            sl->flags = 1;
            break;
+         case oHiddenEncryptTo: /* store the recipient in the second list */
+           sl = add_to_strlist2( &remusr, pargs.r.ret_str, utf8_strings );
+           sl->flags = 1|2;
+           break;
          case oRecipient: /* store the recipient */
            add_to_strlist2( &remusr, pargs.r.ret_str, utf8_strings );
             any_explicit_recipient = 1;
            break;
+         case oHiddenRecipient: /* store the recipient with a flag */
+           sl = add_to_strlist2( &remusr, pargs.r.ret_str, utf8_strings );
+           sl->flags = 2;
+            any_explicit_recipient = 1;
+           break;
          case oTextmodeShort: opt.textmode = 2; break;
          case oTextmode: opt.textmode=1;  break;
          case oExpert: opt.expert = 1; break;
index ea9e48e..0204bd3 100644 (file)
@@ -89,7 +89,7 @@ typedef struct pk_list *PK_LIST;
 struct pk_list {
     PK_LIST next;
     PKT_public_key *pk;
-    int mark;
+    int flags; /* flag bit 1==throw_keyid */
 };
 
 /* structure to hold a couple of secret key certificates */
@@ -97,7 +97,7 @@ typedef struct sk_list *SK_LIST;
 struct sk_list {
     SK_LIST next;
     PKT_secret_key *sk;
-    int mark;
+    int mark; /* not used */
 };
 
 /* structure to collect all information which can be used to
index 59d67e3..b80e691 100644 (file)
@@ -304,7 +304,7 @@ parse_keyrec(char *keystring)
 {
   static struct keyrec *work=NULL;
   struct keyrec *ret=NULL;
-  char *record,*tok;
+  char *record;
   int i;
 
   if(keystring==NULL)
@@ -342,6 +342,8 @@ parse_keyrec(char *keystring)
 
   if(ascii_strcasecmp("pub",record)==0)
     {
+      char *tok;
+
       if(work->desc.mode)
        {
          ret=work;
@@ -415,7 +417,6 @@ parse_keyrec(char *keystring)
   else if(ascii_strcasecmp("uid",record)==0 && work->desc.mode)
     {
       char *userid,*tok,*decoded;
-      int i=0;
 
       if((tok=strsep(&keystring,":"))==NULL)
        return ret;
@@ -428,6 +429,8 @@ parse_keyrec(char *keystring)
       /* By definition, de-%-encoding is always smaller than the
          original string so we can decode in place. */
 
+      i=0;
+
       while(*tok)
        if(tok[0]=='%' && tok[1] && tok[2])
          {
index e54d4d5..780dde0 100644 (file)
@@ -808,7 +808,21 @@ build_pk_list( STRLIST rcpts, PK_LIST *ret_pk_list, unsigned use )
      * list of the encrypt-to ones (we always trust them) */
     for( rov = remusr; rov; rov = rov->next ) {
        if( !(rov->flags & 1) )
+         {
            any_recipients = 1;
+
+           if((rov->flags&2) && (opt.pgp2 || opt.pgp6 || opt.pgp7))
+             {
+               log_info(_("you may not use %s while in %s mode\n"),
+                        "--hidden-recipient",
+                        opt.pgp2?"--pgp2":opt.pgp6?"--pgp6":"--pgp7");
+
+               log_info(_("this message may not be usable by %s\n"),
+                        opt.pgp2?"PGP 2.x":opt.pgp6?"PGP 6.x":"PGP 7.x");
+
+               opt.pgp2=opt.pgp6=opt.pgp7=0;
+             }
+         }
        else if( (use & PUBKEY_USAGE_ENC) && !opt.no_encrypt_to ) {
            pk = m_alloc_clear( sizeof *pk );
            pk->req_usage = use;
@@ -832,8 +846,20 @@ build_pk_list( STRLIST rcpts, PK_LIST *ret_pk_list, unsigned use )
                    r = m_alloc( sizeof *r );
                    r->pk = pk; pk = NULL;
                    r->next = pk_list;
-                   r->mark = 0;
+                   r->flags = (rov->flags&2)?1:0;
                    pk_list = r;
+
+                   if(r->flags&1 && (opt.pgp2 || opt.pgp6 || opt.pgp7))
+                     {
+                       log_info(_("you may not use %s while in %s mode\n"),
+                                "--hidden-encrypt-to",
+                                opt.pgp2?"--pgp2":opt.pgp6?"--pgp6":"--pgp7");
+
+                       log_info(_("this message may not be usable by %s\n"),
+                             opt.pgp2?"PGP 2.x":opt.pgp6?"PGP 6.x":"PGP 7.x");
+
+                       opt.pgp2=opt.pgp6=opt.pgp7=0;
+                     }
                }
            }
            else {
@@ -896,7 +922,7 @@ build_pk_list( STRLIST rcpts, PK_LIST *ret_pk_list, unsigned use )
                        PK_LIST r = m_alloc( sizeof *r );
                        r->pk = pk; pk = NULL;
                        r->next = pk_list;
-                       r->mark = 0;
+                       r->flags = 0; /* no throwing default ids */
                        pk_list = r;
                    }
                    any_recipients = 1;
@@ -936,7 +962,7 @@ build_pk_list( STRLIST rcpts, PK_LIST *ret_pk_list, unsigned use )
                            r = m_alloc( sizeof *r );
                            r->pk = pk; pk = NULL;
                            r->next = pk_list;
-                           r->mark = 0;
+                           r->flags = 0; /* no throwing interactive ids */
                            pk_list = r;
                        }
                        any_recipients = 1;
@@ -970,7 +996,7 @@ build_pk_list( STRLIST rcpts, PK_LIST *ret_pk_list, unsigned use )
            PK_LIST r = m_alloc( sizeof *r );
            r->pk = pk; pk = NULL;
            r->next = pk_list;
-           r->mark = 0;
+           r->flags = 0; /* no throwing default ids */
            pk_list = r;
          }
        }
@@ -1030,7 +1056,7 @@ build_pk_list( STRLIST rcpts, PK_LIST *ret_pk_list, unsigned use )
                        r = m_alloc( sizeof *r );
                        r->pk = pk; pk = NULL;
                        r->next = pk_list;
-                       r->mark = 0;
+                       r->flags = (remusr->flags&2)?1:0;
                        pk_list = r;
                    }
                }
@@ -1266,7 +1292,7 @@ select_algo_from_prefs(PK_LIST pk_list, int preftype, int request, void *hint)
         * algorithm 1 is also available (the ordering is not relevant
         * in this case). */
        if( bits[0] & (1<<1) )
-           i = 1;  /* yep; we can use compression algo 1 */
+           i = 1; /* yep; we can use compression algo 1 */
     }
 
     /* "If you are building an authentication system, the recipient
@@ -1274,7 +1300,7 @@ select_algo_from_prefs(PK_LIST pk_list, int preftype, int request, void *hint)
        would be foolish to use a weak algorithm simply because the
        recipient requests it." RFC2440:13.  If we settle on MD5, and
        SHA1 is also available, use SHA1 instead.  Of course, if the
-       user intentinally chose MD5 (by putting it in their personal
+       user intentionally chose MD5 (by putting it in their personal
        prefs), then we should do what they say. */
 
     if(preftype==PREFTYPE_HASH &&