* pubkey.c (_gcry_pk_aliased_algo_name): New.
authorWerner Koch <wk@gnupg.org>
Thu, 4 Sep 2003 10:11:25 +0000 (10:11 +0000)
committerWerner Koch <wk@gnupg.org>
Thu, 4 Sep 2003 10:11:25 +0000 (10:11 +0000)
* ac.c (gcry_ac_open): Use it here.

* pubkey.c (check_keys_crypt): Fix for compatibility mode.

cipher/ChangeLog
cipher/ac.c
cipher/pubkey.c
src/cipher.h
tests/ChangeLog
tests/pubkey.c

index 9eabcf0..2c51ebc 100644 (file)
@@ -1,5 +1,8 @@
 2003-09-04  Werner Koch  <wk@gnupg.org>
 
+       * pubkey.c (_gcry_pk_aliased_algo_name): New.
+       * ac.c (gcry_ac_open): Use it here.
+
        * Makefile.am (EXTRA_libcipher_la_SOURCES): Add serpent.c
 
 2003-09-02  Moritz Schulte  <mo@g10code.com>
index 98e4dfa..3a3e189 100644 (file)
@@ -688,7 +688,7 @@ gcry_ac_open (gcry_ac_handle_t *handle,
   const char *algorithm_name;
 
   /* Get name.  */
-  algorithm_name = gcry_pk_algo_name (algorithm);
+  algorithm_name = _gcry_pk_aliased_algo_name (algorithm);
   if (! *algorithm_name)
     err = GPG_ERR_PUBKEY_ALGO;
 
index 54097b1..de7c810 100644 (file)
@@ -284,6 +284,34 @@ gcry_pk_algo_name (int algorithm)
 }
 
 
+/* A special version of gcry_pk_algo name to return the first aliased
+   name of the algorithm.  This is required to adhere to the spki
+   specs where the algorithm names are lowercase. */
+const char *
+_gcry_pk_aliased_algo_name (int algorithm)
+{
+  const char *name = NULL;
+  gcry_module_t module;
+
+  REGISTER_DEFAULT_PUBKEYS;
+
+  ath_mutex_lock (&pubkeys_registered_lock);
+  module = _gcry_module_lookup_id (pubkeys_registered, algorithm);
+  if (module)
+    {
+      gcry_pk_spec_t *pubkey = (gcry_pk_spec_t *) module->spec;
+
+      name = pubkey->aliases? *pubkey->aliases : NULL;
+      if (!name || !*name)
+        name = pubkey->name;
+      _gcry_module_release (module);
+    }
+  ath_mutex_unlock (&pubkeys_registered_lock);
+
+  return name;
+}
+
+
 static void
 disable_pubkey_algo (int algorithm)
 {
index 392b646..8af097a 100644 (file)
@@ -41,6 +41,11 @@ void _gcry_register_pk_elg_progress (gcry_handler_progress_t cb, void *cb_data);
 /*-- primegen.c --*/
 void _gcry_register_primegen_progress (gcry_handler_progress_t cb, void *cb_data);
 
+
+/*-- pubkey.c --*/
+const char * _gcry_pk_aliased_algo_name (int algorithm);
+
+
 /* Declarations for the cipher specifications.  */
 extern gcry_cipher_spec_t cipher_spec_blowfish;
 extern gcry_cipher_spec_t cipher_spec_des;
index 62d485e..6a2d37a 100644 (file)
@@ -1,3 +1,7 @@
+2003-09-04  Werner Koch  <wk@gnupg.org>
+
+       * pubkey.c (check_keys_crypt): Fix for compatibility mode.
+
 2003-08-27  Moritz Schulte  <mo@g10code.com>
 
        * basic.c (check_ciphers): Added: Serpent.
index f405e12..747f946 100644 (file)
@@ -82,6 +82,7 @@ check_keys_crypt (gcry_sexp_t pkey, gcry_sexp_t skey,
   gcry_sexp_t plain1, cipher, l;
   gcry_mpi_t x0, x1;
   int rc;
+  int have_flags;
 
   /* Extract data from plaintext.  */
   l = gcry_sexp_find_token (plain0, "value", 0);
@@ -92,17 +93,37 @@ check_keys_crypt (gcry_sexp_t pkey, gcry_sexp_t skey,
   if (rc)
     die ("encryption failed: %s\n", gcry_strerror (rc));
 
+  l = gcry_sexp_find_token (plain1, "flags", 0);
+  have_flags = !!l;
+  gcry_sexp_release (l);
+
   /* Decrypt data.  */
   rc = gcry_pk_decrypt (&plain1, cipher, skey);
   gcry_sexp_release (cipher);
   if (rc)
     die ("decryption failed: %s\n", gcry_strerror (rc));
 
-  /* Extract decrypted data.  */
+  /* Extract decrypted data.  Note that for compatibility reasons, the
+     output opf gcry_pk_decrypt depends on whether a flags lists (even
+     if empty) occurs in its input data.  Because we passed the output
+     of encrypt directly to decrypt, such a flag value won't be there
+     as of today.  We check it anyway. */
   l = gcry_sexp_find_token (plain1, "value", 0);
-  gcry_sexp_release (plain1);
-  x1 = gcry_sexp_nth_mpi (l, 1, GCRYMPI_FMT_USG);
-  gcry_sexp_release (l);
+  if (l)
+    {
+      if (!have_flags)
+        die ("compatibility mode of pk_decrypt broken\n");
+      gcry_sexp_release (plain1);
+      x1 = gcry_sexp_nth_mpi (l, 1, GCRYMPI_FMT_USG);
+      gcry_sexp_release (l);
+    }
+  else
+    {
+      if (have_flags)
+        die ("compatibility mode of pk_decrypt broken\n");
+      x1 = gcry_sexp_nth_mpi (plain1, 0, GCRYMPI_FMT_USG);
+      gcry_sexp_release (plain1);
+    }
 
   /* Compare.  */
   if (gcry_mpi_cmp (x0, x1))