See ChangeLog: Mon Jul 12 14:55:34 CEST 1999 Werner Koch
authorWerner Koch <wk@gnupg.org>
Mon, 12 Jul 1999 12:57:54 +0000 (12:57 +0000)
committerWerner Koch <wk@gnupg.org>
Mon, 12 Jul 1999 12:57:54 +0000 (12:57 +0000)
13 files changed:
THOUGHTS
TODO
cipher/ChangeLog
g10/ChangeLog
g10/g10.c
g10/mainproc.c
g10/openfile.c
g10/passphrase.c
g10/seckey-cert.c
scripts/ChangeLog
scripts/autogen.sh
util/ChangeLog
util/argparse.c

index 70d3dff..247264c 100644 (file)
--- a/THOUGHTS
+++ b/THOUGHTS
@@ -215,3 +215,10 @@ Probably more things but this keyserver is not a goal for the
 of the existing key servers (I think they bail out on some rfc2440
 packet formats).
 
+
+Suggested things which I will not do:
+=====================================
+  * Let take --help an option to select some topics.
+    Using grep is much easier
+
+
diff --git a/TODO b/TODO
index 7a70f64..6b0917e 100644 (file)
--- a/TODO
+++ b/TODO
@@ -6,11 +6,6 @@
 
   * print a warning when a revoked/expired _secret_ key is used.
 
-  * remove more "Fixmes"
-
-  * when decryptiong multiple key: print a warning only if no usable pubkey
-    encrypt package was found. Extension: display a list of all recipients.
-
   * Add NO_PUBKEY and NO_SECKEY status lines.
 
   * Solaris make has problems with the generated POTFILES - seems to be a
   * find a way to allow the import of non-self-signed keys.  This is needed
     for the IN ENCR/SIGN hack.
 
-  * Not all user names are correctly converted to UTF8.
-
 
 Nice to have
 ------------
-  * Let take --help an option to select some topics.
   * Offcial test vectors for 3DES-EDE3
   * use DEL and ^H for erasing the previous character (util/ttyio.c).
     or better readline.
@@ -43,7 +35,7 @@ Nice to have
     stuff?
   * the pubkey encrypt functions should do some sanity checks.
   * dynload: implement the hint stuff.
-  * "gpg filename.tar.gz.asc" sollte wie mit --verify funktionieren (-sab).
+  * "gpg filename.tar.gz.asc" should work like --verify (-sab).
   * for messages created with "-t", it might make sense to append the
     verification status of the message to the output (i.e. write something to
     the --output file and not only to stderr.
index 91a2770..1c6a7c1 100644 (file)
@@ -1,11 +1,9 @@
 Wed Jul  7 13:08:40 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
 
-
        * Makefile.am: Support for libtool.
 
 Fri Jul  2 11:45:54 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
 
-
        * dsa.c (gen_k): Changed algorithm to consume less random bytes
        * elgamal.c (gen_k): Ditto.
 
@@ -13,13 +11,11 @@ Fri Jul  2 11:45:54 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
 
 Thu Jul  1 12:47:31 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
 
-
        * primegen.c, elgamal.c, dsa.c (progess): New and replaced all
        fputc with a call to this function.
 
 Sat Jun 26 12:15:59 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
 
-
        * rndegd.c (do_write): s/ssize_t/int/ due to SunOS 4.1 probs.
 
        * cipher.c (do_cbc_encrypt, do_cbc_decrypt): New.
index fcc2a97..480aa1f 100644 (file)
@@ -1,3 +1,19 @@
+Mon Jul 12 14:55:34 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+
+       * mainproc.c (kidlist_item): New.
+       (release_list): Release failed pk-enc-list.
+       (print_failed_pkenc): New
+       (proc_encrypted): Print info about failed PK enc.
+
+       * openfile.c (make_outfile_name): s/error/info/
+
+       * passphrase.c (passphrase_to_dek): Return an empty passphrase when
+       in batch mode and don't make the warbing message fatal
+       * seckey-cert.c (check_secret_key): Try only once when in batch mode.
+
+       * g10.c (make_username): New.
+
 Thu Jul  8 16:21:27 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
 
 
index 092def6..f22f629 100644 (file)
--- a/g10/g10.c
+++ b/g10/g10.c
@@ -442,6 +442,19 @@ wrong_args( const char *text)
     g10_exit(2);
 }
 
+
+static char *
+make_username( const char *string )
+{
+    char *p;
+    if( utf8_strings )
+       p = native_to_utf8( string );
+    else
+       p = m_strdup(string);
+    return p;
+}
+
+
 static void
 set_debug(void)
 {
@@ -494,6 +507,7 @@ main( int argc, char **argv )
     int orig_argc;
     char **orig_argv;
     const char *fname;
+    char *username;
     STRLIST sl, remusr= NULL, locusr=NULL;
     STRLIST nrings=NULL, sec_nrings=NULL;
     armor_filter_context_t afx;
@@ -1050,10 +1064,10 @@ main( int argc, char **argv )
       case aDeleteKey:
        if( argc != 1 )
            wrong_args(_("--delete-key username"));
-       /* note: fname is the user id! */
-       /* fixme: do utf8 conversion */
-       if( (rc = delete_key(fname, cmd==aDeleteSecretKey)) )
-           log_error("%s: delete key failed: %s\n", print_fname_stdin(fname), g10_errstr(rc) );
+       username = make_username( fname );
+       if( (rc = delete_key(username, cmd==aDeleteSecretKey)) )
+           log_error("%s: delete key failed: %s\n", username, g10_errstr(rc) );
+       m_free(username);
        break;
 
 
@@ -1068,7 +1082,7 @@ main( int argc, char **argv )
        secret_key_list( argc, argv );
        break;
 
-      case aKMode: /* list keyring */
+      case aKMode: /* list keyring -- NOTE: This will be removed soon */
        if( argc < 2 )  /* -kv [userid] */
            public_key_list( (argc && **argv)? 1:0, argv );
        else if( argc == 2 ) { /* -kv userid keyring */
@@ -1114,7 +1128,7 @@ main( int argc, char **argv )
       case aRecvKeys:
        sl = NULL;
        for( ; argc; argc--, argv++ )
-           add_to_strlist( &sl, *argv );
+           add_to_strlist2( &sl, *argv, utf8_strings );
        if( cmd == aSendKeys )
            hkp_export( sl );
        else if( cmd == aRecvKeys )
@@ -1127,7 +1141,7 @@ main( int argc, char **argv )
       case aExportSecret:
        sl = NULL;
        for( ; argc; argc--, argv++ )
-           add_to_strlist( &sl, *argv );
+           add_to_strlist2( &sl, *argv, utf8_strings );
        export_seckeys( sl );
        free_strlist(sl);
        break;
@@ -1135,7 +1149,9 @@ main( int argc, char **argv )
       case aGenRevoke:
        if( argc != 1 )
            wrong_args("--gen-revoke user-id");
-       gen_revoke( *argv );
+       username =  make_username(*argv);
+       gen_revoke( username );
+       m_free( username );
        break;
 
       case aDeArmor:
@@ -1258,8 +1274,11 @@ main( int argc, char **argv )
        if( !argc )
            check_trustdb(NULL);
        else {
-           for( ; argc; argc--, argv++ )
-               check_trustdb( *argv );
+           for( ; argc; argc--, argv++ ) {
+               username = make_username( *argv );
+               check_trustdb( username );
+               m_free(username);
+           }
        }
        break;
 
@@ -1272,8 +1291,11 @@ main( int argc, char **argv )
       case aListTrustPath:
        if( !argc )
            wrong_args("--list-trust-path <usernames>");
-       for( ; argc; argc--, argv++ )
-           list_trust_path( *argv );
+       for( ; argc; argc--, argv++ ) {
+           username = make_username( *argv );
+           list_trust_path( username );
+           m_free(username);
+       }
        break;
 
       case aExportOwnerTrust:
index edd393a..1e06a78 100644 (file)
 #include "trustdb.h"
 #include "hkp.h"
 
+
+struct kidlist_item {
+    struct kidlist_item *next;
+    u32 kid[2];
+    int pubkey_algo;
+    int reason;
+};
+
+
+
 /****************
  * Structure to hold the context
  */
@@ -60,6 +70,8 @@ struct mainproc_context {
     IOBUF iobuf;    /* used to get the filename etc. */
     int trustletter; /* temp usage in list_node */
     ulong local_id;    /* ditto */
+    struct kidlist_item *failed_pkenc; /* list of packets for which
+                                          we do not have a secret key */
 };
 
 
@@ -76,6 +88,12 @@ release_list( CTX c )
        return;
     proc_tree(c, c->list );
     release_kbnode( c->list );
+    while( c->failed_pkenc ) {
+       struct kidlist_item *tmp = c->failed_pkenc->next;
+       m_free( c->failed_pkenc );
+       c->failed_pkenc = tmp;
+    }
+    c->failed_pkenc = NULL;
     c->list = NULL;
 }
 
@@ -213,6 +231,8 @@ proc_pubkey_enc( CTX c, PACKET *pkt )
                m_free(c->dek); c->dek = NULL;
            }
        }
+       else
+           result = G10ERR_NO_SECKEY;
     }
     else
        result = G10ERR_PUBKEY_ALGO;
@@ -223,22 +243,66 @@ proc_pubkey_enc( CTX c, PACKET *pkt )
        if( opt.verbose > 1 )
            log_info( _("public key encrypted data: good DEK\n") );
     }
-    else {
-       /* fixme: defer this message until we have parsed all packets of
-        * this type - do this by building a list of keys with their stati
-        * and store it with the context.  do_proc_packets can then use
-        * this list to display some information */
-       log_error(_("public key decryption failed: %s\n"), g10_errstr(result));
+    else { /* store it for later display */
+       struct kidlist_item *x = m_alloc( sizeof *x );
+       x->kid[0] = enc->keyid[0];
+       x->kid[1] = enc->keyid[1];
+       x->pubkey_algo = enc->pubkey_algo;
+       x->reason = result;
+       x->next = c->failed_pkenc;
+       c->failed_pkenc = x;
     }
     free_packet(pkt);
 }
 
 
+
+/****************
+ * Print the list of public key encrypted packets which we could
+ * not decrypt.
+ */
+static void
+print_failed_pkenc( struct kidlist_item *list )
+{
+    for( ; list; list = list->next ) {
+       PKT_public_key *pk = m_alloc_clear( sizeof *pk );
+       const char *algstr = pubkey_algo_to_string( list->pubkey_algo );
+
+       pk->pubkey_algo = list->pubkey_algo;
+       if( !get_pubkey( pk, list->kid ) ) {
+           size_t n;
+           char *p;
+           log_info( _("encrypted with %u-bit %s key, ID %08lX, created %s\n"),
+                      nbits_from_pk( pk ), algstr, (ulong)list->kid[1],
+                      strtimestamp(pk->timestamp) );
+           fputs("      \"", log_stream() );
+           p = get_user_id( list->kid, &n );
+           print_string( log_stream(), p, n, '"' );
+           m_free(p);
+           fputs("\"\n", log_stream() );
+       }
+       else {
+           log_info(_("encrypted with %s key, ID %08lX\n"),
+                       algstr, (ulong) list->kid[1] );
+       }
+       free_public_key( pk );
+
+       if( list->reason == G10ERR_NO_SECKEY )
+           log_info(_("no secret key for decryption available\n"));
+       else
+           log_error(_("public key decryption failed: %s\n"),
+                                               g10_errstr(list->reason));
+    }
+}
+
+
 static void
 proc_encrypted( CTX c, PACKET *pkt )
 {
     int result = 0;
 
+    print_failed_pkenc( c->failed_pkenc );
+
     /*log_debug("dat: %sencrypted data\n", c->dek?"":"conventional ");*/
     if( !c->dek && !c->last_was_session_key ) {
        /* assume this is old conventional encrypted data */
@@ -267,8 +331,8 @@ proc_encrypted( CTX c, PACKET *pkt )
     else {
        write_status( STATUS_DECRYPTION_FAILED );
        log_error(_("decryption failed: %s\n"), g10_errstr(result));
-       /* FIXME: if this is secret key not available, try with
-        * other keys */
+       /* Hmmm: does this work when we have encrypted using a multiple
+        * ways to specify the session key (symmmetric and PK)*/
     }
     free_packet(pkt);
     c->last_was_session_key = 0;
@@ -452,7 +516,6 @@ do_check_sig( CTX c, KBNODE node, int *is_selfsig )
 }
 
 
-
 static void
 print_userid( PACKET *pkt )
 {
@@ -544,6 +607,7 @@ print_notation_data( PKT_signature *sig )
     /* TODO */
 }
 
+
 /****************
  * List the certificate in a user friendly way
  */
index ebf9548..4d16db5 100644 (file)
@@ -94,7 +94,7 @@ make_outfile_name( const char *iname )
        return buf;
     }
 
-    log_error(_("%s: unknown suffix\n"), iname );
+    log_info(_("%s: unknown suffix\n"), iname );
     return NULL;
 }
 
index 80c6fa3..6026ff7 100644 (file)
@@ -187,8 +187,8 @@ passphrase_to_dek( u32 *keyid, int pubkey_algo,
        strcpy( pw, fd_passwd );
     }
     else if( opt.batch ) {
-       write_status( STATUS_MISSING_PASSPHRASE );
-       log_fatal("Can't query password in batchmode\n");
+       log_error(_("can't query password in batchmode\n"));
+       pw = m_strdup( "" ); /* return an empty passphrase */
     }
     else {
        pw = cpr_get_hidden("passphrase.enter", _("Enter passphrase: ") );
index 95af40b..a8fae04 100644 (file)
@@ -164,7 +164,7 @@ check_secret_key( PKT_secret_key *sk, int n )
     int i;
 
     if( n < 1 )
-       n = 3; /* use the default value */
+       n = opt.batch? 1 : 3; /* use the default value */
 
     for(i=0; i < n && rc == G10ERR_BAD_PASS; i++ ) {
        if( i )
index 14765db..6f73e8c 100644 (file)
@@ -1,3 +1,8 @@
+Mon Jul 12 14:55:34 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+
+       * autogen.sh: Run libtoolize
+
 Sat May 22 22:47:26 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
 
        * autogen.sh: Fixed the error message for a missing libtool.
index 045716b..23cb5bd 100755 (executable)
@@ -87,6 +87,8 @@ fi
 
 echo "Running gettextize...  Ignore non-fatal messages."
 echo "no" | gettextize --force
+echo "Running libtoolize...  Ignore non-fatal messages."
+echo "no" | libtoolize
 
 
 echo "Running aclocal..."
index 44c0f7f..0e67818 100644 (file)
@@ -1,3 +1,9 @@
+Mon Jul 12 14:55:34 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+
+       * argparse.c (initialize): Init ret_xxx.
+       (optfile_parse): Remove quotes from arguments.
+
 Wed Jul  7 13:08:40 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
 
 
index 707d75e..b693414 100644 (file)
@@ -155,6 +155,7 @@ initialize( ARGPARSE_ARGS *arg, const char *filename, unsigned *lineno )
            log_bug("Invalid argument for ArgParse\n");
     }
 
+
     if( arg->err ) { /* last option was erroneous */
        const char *s;
 
@@ -194,6 +195,10 @@ initialize( ARGPARSE_ARGS *arg, const char *filename, unsigned *lineno )
            exit(2);
        arg->err = 0;
     }
+
+    /* clearout the return value union */
+    arg->r.ret_str = NULL;
+    arg->r.ret_long= 0;
 }
 
 
@@ -309,6 +314,7 @@ optfile_parse( FILE *fp, const char *filename, unsigned *lineno,
                else if( !(opts[idx].flags & 7) )  /* does not take an arg */
                    arg->r_opt = -6;        /* error */
                else {
+                   char *p;
                    if( !buffer ) {
                        keyword[i] = 0;
                        buffer = m_strdup(keyword);
@@ -317,7 +323,13 @@ optfile_parse( FILE *fp, const char *filename, unsigned *lineno,
                        buffer[i] = 0;
 
                    trim_spaces( buffer );
-                   if( !set_opt_arg(arg, opts[idx].flags, buffer) )
+                   p = buffer;
+                   if( *p == '"' ) { /* remove quotes */
+                       p++;
+                       if( *p && p[strlen(p)-1] == '"' )
+                           p[strlen(p)-1] = 0;
+                   }
+                   if( !set_opt_arg(arg, opts[idx].flags, p) )
                        m_free(buffer);
                }
                break;