Adjust for the changed Camellia draft.
authorWerner Koch <wk@gnupg.org>
Fri, 18 Apr 2008 09:20:25 +0000 (09:20 +0000)
committerWerner Koch <wk@gnupg.org>
Fri, 18 Apr 2008 09:20:25 +0000 (09:20 +0000)
W32 gettext changes.
Comment and typo fixes.

15 files changed:
common/ChangeLog
common/i18n.c
g10/ChangeLog
g10/main.h
g10/misc.c
g10/parse-packet.c
include/ChangeLog
include/cipher.h
jnlib/ChangeLog
jnlib/w32-gettext.c
jnlib/w32help.h
po/de.po
scd/ccid-driver.c
sm/ChangeLog
sm/verify.c

index ab68709..3cc5426 100644 (file)
@@ -1,3 +1,8 @@
+2008-04-08  Werner Koch  <wk@g10code.com>
+
+       * i18n.c (i18n_switchto_utf8, i18n_switchback)
+       [USE_SIMPLE_GETTEXT]: Implement.
+
 2008-04-07  Werner Koch  <wk@g10code.com>
 
        * b64enc.c (b64enc_start): Detect PGP mode.
index c13be86..7ed4bb4 100644 (file)
@@ -45,17 +45,19 @@ i18n_init (void)
 
 
 /* The Assuan agent protocol requires us to transmit utf-8 strings
-   thus we need a fuctnion to temporary switch gettext from native to
+   thus we need a way to temporary switch gettext from native to
    utf8.  */
 char *
 i18n_switchto_utf8 (void)
 {
-#ifdef ENABLE_NLS
+#ifdef USE_SIMPLE_GETTEXT
+  gettext_select_utf8 (1);
+#elif define(ENABLE_NLS)
   char *orig_codeset = bind_textdomain_codeset (PACKAGE_GT, NULL);
-#ifdef HAVE_LANGINFO_CODESET
+# ifdef HAVE_LANGINFO_CODESET
   if (!orig_codeset)
     orig_codeset = nl_langinfo (CODESET);
-#endif
+# endif
   if (orig_codeset)
     { /* We only switch when we are able to restore the codeset later.
          Note that bind_textdomain_codeset does only return on memory
@@ -78,7 +80,9 @@ i18n_switchto_utf8 (void)
 void
 i18n_switchback (char *saved_codeset)
 {
-#ifdef ENABLE_NLS
+#ifdef USE_SIMPLE_GETTEXT
+  gettext_select_utf8 (0);
+#elif defined(ENABLE_NLS)
   if (saved_codeset)
     {
       bind_textdomain_codeset (PACKAGE_GT, saved_codeset);
index 0edfb7a..b7c3d1d 100644 (file)
@@ -1,3 +1,10 @@
+2008-04-18  Werner Koch  <wk@g10code.com>
+
+       * misc.c (map_cipher_openpgp_to_gcry, map_cipher_gcry_to_openpgp) 
+       (openpgp_cipher_test_algo): Add camellia-192.
+       (openpgp_cipher_blocklen): New.
+       * parse-packet.c (parse_key): Use new function here.
+
 2008-04-15  David Shaw  <dshaw@jabberwocky.com>
 
        * getkey.c (merge_selfsigs_subkey): If there are multiple 0x19
index bf3df64..179c067 100644 (file)
@@ -82,6 +82,7 @@ u16 checksum( byte *p, unsigned n );
 u16 checksum_mpi( gcry_mpi_t a );
 u32 buffer_to_u32( const byte *buffer );
 const byte *get_session_marker( size_t *rlen );
+int openpgp_cipher_blocklen (int algo);
 int openpgp_cipher_test_algo( int algo );
 const char *openpgp_cipher_algo_name (int algo);
 int openpgp_pk_test_algo( int algo );
index 233c402..2e2c707 100644 (file)
@@ -1,6 +1,6 @@
 /* misc.c - miscellaneous functions
- * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004,
- *               2005, 2006, 2007 Free Software Foundation, Inc.
+ * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 
+ *               2005, 2006, 2007, 2008 Free Software Foundation, Inc.
  *
  * This file is part of GnuPG.
  *
@@ -338,6 +338,7 @@ map_cipher_openpgp_to_gcry (int algo)
   switch (algo)
     {
     case CIPHER_ALGO_CAMELLIA128: return 310; 
+    case CIPHER_ALGO_CAMELLIA192: return 311; 
     case CIPHER_ALGO_CAMELLIA256: return 312; 
     default: return algo;
     }
@@ -350,11 +351,36 @@ map_cipher_gcry_to_openpgp (int algo)
   switch (algo)
     {
     case 310: return CIPHER_ALGO_CAMELLIA128;
+    case 311: return CIPHER_ALGO_CAMELLIA192;
     case 312: return CIPHER_ALGO_CAMELLIA256;
     default: return algo;
     }
 }
 
+
+/* Return the block length of an OpenPGP cipher algorithm.  */
+int 
+openpgp_cipher_blocklen (int algo)
+{
+  /* We use the numbers from OpenPGP to be sure that we get the right
+     block length.  This is so that the packet parsing code works even
+     for unknown algorithms (for which we assume 8 due to tradition).
+
+     NOTE: If you change the the returned blocklen above 16, check
+     the callers because they may use a fixed size buffer of that
+     size. */
+  switch (algo)
+    {
+    case 7: case 8: case 9: /* AES */
+    case 10: /* Twofish */
+    case 11: case 12: case 13: /* Camellia */
+      return 16;
+
+    default:
+      return 8;
+    }
+}
+
 /****************
  * Wrapper around the libgcrypt function with additonal checks on
  * the OpenPGP contraints for the algo ID.
@@ -370,7 +396,8 @@ openpgp_cipher_test_algo( int algo )
      requested.  */
 #ifndef USE_CAMELLIA
   if (algo == CIPHER_ALGO_CAMELLIA128 
-       || algo == CIPHER_ALGO_CAMELLIA256)
+      || algo == CIPHER_ALGO_CAMELLIA192
+      || algo == CIPHER_ALGO_CAMELLIA256)
     return gpg_error (GPG_ERR_CIPHER_ALGO);
 #endif
 
@@ -386,8 +413,6 @@ openpgp_cipher_algo_name (int algo)
   return gcry_cipher_algo_name (map_cipher_openpgp_to_gcry (algo));
 }
 
-
-
 int
 openpgp_pk_test_algo( int algo )
 {
index 409daab..dbaa278 100644 (file)
@@ -1901,19 +1901,13 @@ parse_key( IOBUF inp, int pkttype, unsigned long pktlen,
             * of the IV here in cases we are not aware of the algorithm.
             * so a
             *   sk->protect.ivlen = cipher_get_blocksize(sk->protect.algo);
-            * won't work.  The only solution I see is to hardwire it here.
+            * won't work.  The only solution I see is to hardwire it.
             * NOTE: if you change the ivlen above 16, don't forget to
             * enlarge temp.
             */
-           switch( sk->protect.algo ) {
-             case 7: case 8: case 9: /* AES */
-             case 10: /* Twofish */
-              case 11: case 12: /* Camellia */
-               sk->protect.ivlen = 16;
-               break;
-             default:
-               sk->protect.ivlen = 8;
-           }
+            sk->protect.ivlen = openpgp_cipher_blocklen (sk->protect.algo);
+            assert (sk->protect.ivlen <= sizeof (temp));
+
            if( sk->protect.s2k.mode == 1001 )
                sk->protect.ivlen = 0;
            else if( sk->protect.s2k.mode == 1002 )
index b4362be..559d305 100644 (file)
@@ -1,3 +1,8 @@
+2008-04-18  Werner Koch  <wk@g10code.com>
+
+       * cipher.h (CIPHER_ALGO_CAMELLIA256): Change ID to 13.
+       (CIPHER_ALGO_CAMELLIA192): New.
+
 2007-12-12  Werner Koch  <wk@g10code.com>
 
        * cipher.h (CIPHER_ALGO_CAMELLIA128, CIPHER_ALGO_CAMELLIA256): New.
index 52c4f27..0d75fa6 100644 (file)
@@ -47,7 +47,8 @@
 #define CIPHER_ALGO_TWOFISH     /* 10 */  GCRY_CIPHER_TWOFISH  /* 256 bit */
 /* Note: Camellia ids don't match those used by libgcrypt. */
 #define CIPHER_ALGO_CAMELLIA128     11
-#define CIPHER_ALGO_CAMELLIA256     12
+#define CIPHER_ALGO_CAMELLIA192     12
+#define CIPHER_ALGO_CAMELLIA256     13
 #define CIPHER_ALGO_DUMMY          110    /* No encryption at all. */
 
 #define PUBKEY_ALGO_RSA          /*  1 */ GCRY_PK_RSA  
index 473d469..23a0202 100644 (file)
@@ -1,3 +1,9 @@
+2008-04-08  Werner Koch  <wk@g10code.com>
+
+       * w32-gettext.c (gettext_select_utf8): New.
+       (get_string): Support switching encodings.
+       (load_domain): Allocate space for DATA_NATIVE.
+
 2008-03-25  Werner Koch  <wk@g10code.com>
 
        * w32-gettext.c (_nl_locale_name): New.  Taken from
@@ -555,7 +561,7 @@ Mon Jan 24 13:04:28 CET 2000  Werner Koch  <wk@gnupg.de>
      ***********************************************************       
        
  Copyright 2000, 2001, 2002, 2003, 2004,
-          2005, 2006, 2007 Free Software Foundation, Inc.
+          2005, 2006, 2007, 2008 Free Software Foundation, Inc.
 
  This file is free software; as a special exception the author gives
  unlimited permission to copy and/or distribute it, with or without
index b46dd47..9872928 100644 (file)
@@ -1,6 +1,6 @@
 /* w32-gettext.c  - A simplified version of gettext for use under W32.
  * Copyright (C) 1995, 1996, 1997, 1999, 2000, 2003,
- *               2005, 2007, 2088 Free Software Foundation, Inc.
+ *               2005, 2007, 2008 Free Software Foundation, Inc.
  *
  * This file is part of JNLIB.
  *
@@ -96,11 +96,13 @@ struct overflow_space_s
 struct loaded_domain
 {
   char *data;
+  char *data_native; /* Data mapped to the native version of the
+                        string.  (Allocated along with DATA). */
   int must_swap;
   u32 nstrings;
-  char *mapped;  /* 0 = not yet mapped, 1 = mapped,
-                    2 = mapped to
-                    overflow space */
+  char *mapped;  /* 0 = not mapped (original utf8), 
+                    1 = mapped to native encoding,
+                    2 = mapped to native encoding in overflow space.   */
   struct overflow_space_s *overflow_space;
   struct string_desc *orig_tab;
   struct string_desc *trans_tab;
@@ -111,6 +113,8 @@ struct loaded_domain
 
 static struct loaded_domain *the_domain;
 static char *the_langid;
+static int want_utf8;  /* True if the user want's utf-8 strings.  */
+
 
 static __inline__ u32
 do_swap_u32( u32 i )
@@ -1236,7 +1240,7 @@ load_domain (const char *filename)
       return NULL;
     }
 
-  data = jnlib_malloc (size);
+  data = (2*size <= size)? NULL : jnlib_malloc (2*size);
   if (!data)
     {
       fclose (fp);
@@ -1278,38 +1282,39 @@ load_domain (const char *filename)
       return NULL;
     }
   domain->data = (char *) data;
+  domain->data_native = (char *) data + size;
   domain->must_swap = data->magic != MAGIC;
 
   /* Fill in the information about the available tables.  */
-    switch (SWAPIT(domain->must_swap, data->revision))
-      {
-      case 0:
-       domain->nstrings = SWAPIT(domain->must_swap, data->nstrings);
-       domain->orig_tab = (struct string_desc *)
+  switch (SWAPIT(domain->must_swap, data->revision))
+    {
+    case 0:
+      domain->nstrings = SWAPIT(domain->must_swap, data->nstrings);
+      domain->orig_tab = (struct string_desc *)
          ((char *) data + SWAPIT(domain->must_swap, data->orig_tab_offset));
-       domain->trans_tab = (struct string_desc *)
-         ((char *) data + SWAPIT(domain->must_swap, data->trans_tab_offset));
-       domain->hash_size = SWAPIT(domain->must_swap, data->hash_tab_size);
-       domain->hash_tab = (u32 *)
-         ((char *) data + SWAPIT(domain->must_swap, data->hash_tab_offset));
-        break;
+      domain->trans_tab = (struct string_desc *)
+        ((char *) data + SWAPIT(domain->must_swap, data->trans_tab_offset));
+      domain->hash_size = SWAPIT(domain->must_swap, data->hash_tab_size);
+      domain->hash_tab = (u32 *)
+        ((char *) data + SWAPIT(domain->must_swap, data->hash_tab_offset));
+      break;
         
-      default: /* This is an invalid revision. */
-       jnlib_free( data );
-       jnlib_free( domain );
-       return NULL;
+    default: /* This is an invalid revision.   */
+      jnlib_free( data );
+      jnlib_free( domain );
+      return NULL;
     }
-
-    /* Allocate an array to keep track of code page mappings. */
-    domain->mapped = jnlib_calloc (1, domain->nstrings);
-    if (!domain->mapped)
-      {
-        jnlib_free (data);
-        jnlib_free (domain);
-        return NULL;
-      }
-
-    return domain;
+  
+  /* Allocate an array to keep track of code page mappings. */
+  domain->mapped = jnlib_calloc (1, domain->nstrings);
+  if (!domain->mapped)
+    {
+      jnlib_free (data);
+      jnlib_free (domain);
+      return NULL;
+    }
+  
+  return domain;
 }
 
 
@@ -1510,30 +1515,45 @@ set_gettext_file ( const char *filename, const char *regkey )
 
 
 static const char*
-get_string( struct loaded_domain *domain, u32 idx )
+get_string (struct loaded_domain *domain, u32 idx)
 {
   struct overflow_space_s *os;
   char *p;
 
-  p = domain->data + SWAPIT(domain->must_swap, domain->trans_tab[idx].offset);
-  if (!domain->mapped[idx]) 
+  if (want_utf8)
+    {
+      p = (domain->data 
+           + SWAPIT(domain->must_swap, domain->trans_tab[idx].offset));
+    }
+  else if (!domain->mapped[idx]) 
     {
+      /* Not yet mapped - map utf-8 to native encoding.  */
+      const char *p_orig;
       size_t plen, buflen;
       char *buf;
 
-      domain->mapped[idx] = 1;
+      p_orig = (domain->data 
+                + SWAPIT(domain->must_swap, domain->trans_tab[idx].offset));
+      p = (domain->data_native 
+           + SWAPIT(domain->must_swap, domain->trans_tab[idx].offset));
 
-      plen = strlen (p);
-      buf = utf8_to_native (p, plen, -1);
+      plen = strlen (p_orig);
+      buf = utf8_to_native (p_orig, plen, -1);
       buflen = strlen (buf);
       if (buflen <= plen)
-        strcpy (p, buf);
+        {
+          /* Copy into the DATA_NATIVE area. */
+          strcpy (p, buf);
+          domain->mapped[idx] = 1;
+        }
       else
         {
           /* There is not enough space for the translation - store it
-             in the overflow_space else and mark that in the mapped
-             array.  Because we expect that this won't happen too
-             often, we use a simple linked list.  */
+             in the overflow_space and mark that in the mapped array.
+             Because UTF-8 strings are in general longer than the
+             Windows 2 byte encodings, we expect that this won't
+             happen too often (if at all) and thus we use a linked
+             list to manage this space. */
           os = jnlib_malloc (sizeof *os + buflen);
           if (os)
             {
@@ -1545,9 +1565,16 @@ get_string( struct loaded_domain *domain, u32 idx )
             }
           else
             p = "ERROR in GETTEXT MALLOC";
+          domain->mapped[idx] = 2;
         }
       jnlib_free (buf);
     }
+  else if (domain->mapped[idx] == 1) 
+    {
+      p = (domain->data_native
+           + SWAPIT(domain->must_swap, domain->trans_tab[idx].offset));
+
+    }
   else if (domain->mapped[idx] == 2) 
     { /* We need to get the string from the overflow_space. */
       for (os=domain->overflow_space; os; os = os->next)
@@ -1555,6 +1582,9 @@ get_string( struct loaded_domain *domain, u32 idx )
           return (const char*)os->d;
       p = "ERROR in GETTEXT\n";
     }
+  else
+    p = "ERROR in GETEXT mapping";
+
   return (const char*)p;
 }
 
@@ -1660,4 +1690,11 @@ gettext_localename (void)
 }
 
 
+void
+gettext_select_utf8 (int value)
+{
+  want_utf8 = value;
+}
+
+
 #endif /* USE_SIMPLE_GETTEXT */
index 1a821e9..9d387bd 100644 (file)
@@ -33,6 +33,7 @@ const char *gettext (const char *msgid );
 const char *ngettext (const char *msgid1, const char *msgid2,
                       unsigned long int n);
 const char *gettext_localename (void);
+void gettext_select_utf8 (int value);
 #endif /*USE_SIMPLE_GETTEXT*/
 
 
index 45a56e1..97aea27 100644 (file)
--- a/po/de.po
+++ b/po/de.po
@@ -10,7 +10,7 @@ msgstr ""
 "Project-Id-Version: gnupg-2.0.6\n"
 "Report-Msgid-Bugs-To: translations@gnupg.org\n"
 "POT-Creation-Date: 2008-03-27 13:41+0100\n"
-"PO-Revision-Date: 2008-04-02 17:50+0200\n"
+"PO-Revision-Date: 2008-04-08 15:41+0200\n"
 "Last-Translator: Walter Koch <koch@u32.de>\n"
 "Language-Team: German <de@li.org>\n"
 "MIME-Version: 1.0\n"
@@ -7080,8 +7080,7 @@ msgid ""
 "S/N %s, ID 0x%08lX,\n"
 "created %s, expires %s.\n"
 msgstr ""
-"Bitte geben Sie die Passphrase an, um den geheimen Schlüssel\n"
-"des X.509 Zertifikats:\n"
+"Bitte geben Sie die Passphrase an, um den geheimen Schlüssel des X.509 Zertifikats:\n"
 "\"%s\"\n"
 "S/N %s, ID 0x%08lX,\n"
 "gültig von %s bis %s\n"
index ec847c6..79a42a4 100644 (file)
@@ -282,7 +282,7 @@ set_msg_len (unsigned char *msg, unsigned int length)
 
 
 /* Pint an error message for a failed CCID command including a textual
-   error code.  MSG is shall be the CCID message of at least 10 bytes. */
+   error code.  MSG shall be the CCID message at a minimum of 10 bytes. */
 static void
 print_command_failed (const unsigned char *msg)
 {
index 6a77e2a..bff7f1b 100644 (file)
@@ -1,3 +1,7 @@
+2008-04-09  Werner Koch  <wk@g10code.com>
+
+       * verify.c (gpgsm_verify): Print the message hash values on error.
+
 2008-03-31  Werner Koch  <wk@g10code.com>
 
        * call-dirmngr.c (start_dirmngr): Use log_info instead of
index 1071d90..8ce5aff 100644 (file)
@@ -467,8 +467,16 @@ gpgsm_verify (ctrl_t ctrl, int in_fd, int data_fd, FILE *out_fp)
             {
               char *fpr;
 
-              log_error ("invalid signature: message digest attribute "
-                         "does not match calculated one\n");
+              log_error (_("invalid signature: message digest attribute "
+                           "does not match computed one\n"));
+              if (DBG_X509)
+                {
+                  if (msgdigest)
+                    log_printhex ("message:  ", msgdigest, msgdigestlen);
+                  if (s)
+                    log_printhex ("computed: ",
+                                  s, gcry_md_get_algo_dlen (algo));
+                }
               fpr = gpgsm_fpr_and_name_for_status (cert);
               gpgsm_status (ctrl, STATUS_BADSIG, fpr);
               xfree (fpr);