diff --git a/common/ChangeLog b/common/ChangeLog index ab68709cc..3cc542682 100644 --- a/common/ChangeLog +++ b/common/ChangeLog @@ -1,3 +1,8 @@ +2008-04-08 Werner Koch + + * i18n.c (i18n_switchto_utf8, i18n_switchback) + [USE_SIMPLE_GETTEXT]: Implement. + 2008-04-07 Werner Koch * b64enc.c (b64enc_start): Detect PGP mode. diff --git a/common/i18n.c b/common/i18n.c index c13be8608..7ed4bb4de 100644 --- a/common/i18n.c +++ b/common/i18n.c @@ -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); diff --git a/g10/ChangeLog b/g10/ChangeLog index 0edfb7a28..b7c3d1d50 100644 --- a/g10/ChangeLog +++ b/g10/ChangeLog @@ -1,3 +1,10 @@ +2008-04-18 Werner Koch + + * 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 * getkey.c (merge_selfsigs_subkey): If there are multiple 0x19 diff --git a/g10/main.h b/g10/main.h index bf3df6417..179c06757 100644 --- a/g10/main.h +++ b/g10/main.h @@ -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 ); diff --git a/g10/misc.c b/g10/misc.c index 233c40264..2e2c70722 100644 --- a/g10/misc.c +++ b/g10/misc.c @@ -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 ) { diff --git a/g10/parse-packet.c b/g10/parse-packet.c index 409daab09..dbaa27886 100644 --- a/g10/parse-packet.c +++ b/g10/parse-packet.c @@ -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 ) diff --git a/include/ChangeLog b/include/ChangeLog index b4362bedd..559d305ba 100644 --- a/include/ChangeLog +++ b/include/ChangeLog @@ -1,3 +1,8 @@ +2008-04-18 Werner Koch + + * cipher.h (CIPHER_ALGO_CAMELLIA256): Change ID to 13. + (CIPHER_ALGO_CAMELLIA192): New. + 2007-12-12 Werner Koch * cipher.h (CIPHER_ALGO_CAMELLIA128, CIPHER_ALGO_CAMELLIA256): New. diff --git a/include/cipher.h b/include/cipher.h index 52c4f27b1..0d75fa6cd 100644 --- a/include/cipher.h +++ b/include/cipher.h @@ -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 diff --git a/jnlib/ChangeLog b/jnlib/ChangeLog index 473d469fe..23a02020c 100644 --- a/jnlib/ChangeLog +++ b/jnlib/ChangeLog @@ -1,3 +1,9 @@ +2008-04-08 Werner Koch + + * w32-gettext.c (gettext_select_utf8): New. + (get_string): Support switching encodings. + (load_domain): Allocate space for DATA_NATIVE. + 2008-03-25 Werner Koch * w32-gettext.c (_nl_locale_name): New. Taken from @@ -555,7 +561,7 @@ Mon Jan 24 13:04:28 CET 2000 Werner Koch *********************************************************** 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 diff --git a/jnlib/w32-gettext.c b/jnlib/w32-gettext.c index b46dd4743..987292832 100644 --- a/jnlib/w32-gettext.c +++ b/jnlib/w32-gettext.c @@ -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 */ diff --git a/jnlib/w32help.h b/jnlib/w32help.h index 1a821e99d..9d387bd3a 100644 --- a/jnlib/w32help.h +++ b/jnlib/w32help.h @@ -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*/ diff --git a/po/de.po b/po/de.po index 45a56e1ba..97aea27b1 100644 --- 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 \n" "Language-Team: German \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" diff --git a/scd/ccid-driver.c b/scd/ccid-driver.c index ec847c6cb..79a42a423 100644 --- a/scd/ccid-driver.c +++ b/scd/ccid-driver.c @@ -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) { diff --git a/sm/ChangeLog b/sm/ChangeLog index 6a77e2a91..bff7f1bee 100644 --- a/sm/ChangeLog +++ b/sm/ChangeLog @@ -1,3 +1,7 @@ +2008-04-09 Werner Koch + + * verify.c (gpgsm_verify): Print the message hash values on error. + 2008-03-31 Werner Koch * call-dirmngr.c (start_dirmngr): Use log_info instead of diff --git a/sm/verify.c b/sm/verify.c index 1071d9086..8ce5affb8 100644 --- a/sm/verify.c +++ b/sm/verify.c @@ -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);