tryu harder to ignore duplicate specified keyrings and -boxes.
authorWerner Koch <wk@gnupg.org>
Fri, 24 Aug 2007 09:34:39 +0000 (09:34 +0000)
committerWerner Koch <wk@gnupg.org>
Fri, 24 Aug 2007 09:34:39 +0000 (09:34 +0000)
Documentation updates.

14 files changed:
NEWS
doc/ChangeLog
doc/debugging.texi
doc/gpg-agent.texi
g10/ChangeLog
g10/keyring.c
jnlib/ChangeLog
jnlib/mischelp.c
jnlib/mischelp.h
jnlib/stringhelp.c
kbx/ChangeLog
kbx/keybox-init.c
tests/samplekeys/README
tests/samplekeys/gte.pem [new file with mode: 0644]

diff --git a/NEWS b/NEWS
index 689c8ed..d360334 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -1,6 +1,11 @@
 Noteworthy changes in version 2.0.7
 ------------------------------------------------
 
+ * Fixed encryption problem if duplicate certificates are in the
+   keybox.
+
+ * Made it work on Windows Vista.
+
 
 Noteworthy changes in version 2.0.6 (2007-08-16)
 ------------------------------------------------
index 07c497c..d4ade07 100644 (file)
@@ -1,3 +1,8 @@
+2007-08-24  Werner Koch  <wk@g10code.com>
+
+       * debugging.texi (Common Problems): Add "A root certifciate does
+       not validate."
+
 2007-08-14  Werner Koch  <wk@g10code.com>
 
        * glossary.texi (Glossary): Add a more items.
index e1a62d7..fb27b27 100644 (file)
@@ -77,6 +77,13 @@ are flagges as ephemeral, meaning that they are only temporary stored
 provided by @command{gpgsm} or @command{gpg}. 81 certifcates are stored
 in a standard way and directly available from @command{gpgsm}.
 
+@noindent
+To find duplicated certificates and keyblocks in a keybox file (this
+should not occur but sometimes things go wrong), run it using
+
+@samp{kbxutil --find-dups ~/.gnupg/pubring.kbx}
+
+
 
 
 
@@ -165,6 +172,18 @@ stored private keys because some private keys are used for Secure Shell
 or other purposes and don't have a corresponding certificate.
 
 
+@item A root certificate does not verify
+
+A common problem is that the root certificate misses the required
+basicConstrains attribute and thus @command{gpgsm} rejects this
+certificate.  An error message indicating ``no value'' is a sign for
+such a certificate.  You may use the @code{relax} flag in
+@file{trustlist.txt} to accept the certificate anyway.  Note that the
+fingerprint and this flag may only be added manually to
+@file{trustlist.txt}.
+
+
+
 @end itemize
 
 
index 829530b..156fe53 100644 (file)
@@ -502,7 +502,9 @@ caller:
 
 @table @code
 @item relax
-Relax checking of some root certificate requirements.
+Relax checking of some root certificate requirements.  This is for
+example required if the certificate is missing the basicConstraints
+attribute (despite that it is a MUST for CA certificates).
 
 @item cm
 If validation of a certificate finally issued by a CA with this flag set
index be41ada..90501d0 100644 (file)
@@ -1,3 +1,7 @@
+2007-08-24  Werner Koch  <wk@g10code.com>
+
+       * keyring.c (keyring_register_filename): Use same_file_p().
+
 2007-08-21  Werner Koch  <wk@g10code.com>
 
        * misc.c (openpgp_md_test_algo): Remove rfc2440bis hash algorithms.
index 67ac018..937502a 100644 (file)
@@ -206,10 +206,10 @@ keyring_register_filename (const char *fname, int secret, void **ptr)
 
     for (kr=kr_names; kr; kr = kr->next)
       {
-        if ( !compare_filenames (kr->fname, fname) )
+        if (same_file_p (kr->fname, fname))
          {
             *ptr=kr;
-           return 0; /* already registered */
+           return 0; /* Already registered.  */
          }
       }
 
index c772287..1d0adec 100644 (file)
@@ -1,3 +1,9 @@
+2007-08-24  Werner Koch  <wk@g10code.com>
+
+       * mischelp.c (same_file_p): New.
+       (libjnlib_dummy_mischelp_func): Remove as we now always have one
+       function.
+
 2007-08-09  Werner Koch  <wk@g10code.com>
 
        * argparse.c (show_help): Expand the @EMAIL@ macro in the package
index b224828..f7df5c1 100644 (file)
@@ -1,5 +1,5 @@
 /* mischelp.c - Miscellaneous helper functions
- * Copyright (C) 1998, 2000, 2001, 2006 Free Software Foundation, Inc.
+ * Copyright (C) 1998, 2000, 2001, 2006, 2007 Free Software Foundation, Inc.
  *
  * This file is part of JNLIB.
  *
 #include <stdlib.h>
 #include <string.h>
 #include <time.h>
+#ifdef HAVE_W32_SYSTEM
+# define WIN32_LEAN_AND_MEAN
+# include <windows.h>
+#else /*!HAVE_W32_SYSTEM*/
+# include <sys/types.h>
+# include <sys/stat.h>
+# include <unistd.h>
+#endif /*!HAVE_W32_SYSTEM*/
 
 #include "libjnlib-config.h"
+#include "stringhelp.h"
 #include "mischelp.h"
 
-/* A dummy function to prevent an empty compilation unit.  Some
-   compilers bail out in this case. */
-time_t
-libjnlib_dummy_mischelp_func (void)
+
+/* Check whether the files NAME1 and NAME2 are identical.  This is for
+   example achieved by comparing the inode numbers of the files.  */
+int
+same_file_p (const char *name1, const char *name2)
 {
-  return time (NULL);
+  int yes;
+      
+  /* First try a shortcut.  */
+  if (!compare_filenames (name1, name2))
+    yes = 1;
+  else
+    {
+#ifdef HAVE_W32_SYSTEM  
+      HANDLE file1, file2;
+      BY_HANDLE_FILE_INFORMATION info1, info2;
+      
+      file1 = CreateFile (name1, 0, 0, NULL, OPEN_EXISTING, 0, NULL);
+      if (file1 == INVALID_HANDLE_VALUE)
+        yes = 0; /* If we can't open the file, it is not the same.  */
+      else
+        {
+          file2 = CreateFile (name2, 0, 0, NULL, OPEN_EXISTING, 0, NULL);
+          if (file1 == INVALID_HANDLE_VALUE)
+            yes = 0; /* If we can't open the file, it is not the same.  */
+          else
+            {
+              yes = (GetFileInformationByHandle (file1, &info1)
+                     && GetFileInformationByHandle (file2, &info2)
+                     && info1.dwVolumeSerialNumber==info2.dwVolumeSerialNumber
+                     && info1.nFileIndexHigh == info2.nFileIndexHigh
+                     && info1.nFileIndexLow == info2.nFileIndexLow);
+              CloseHandle (file2);
+            }
+          CloseHandle (file1);
+        }
+#else /*!HAVE_W32_SYSTEM*/
+      struct stat info1, info2;
+      
+      yes = (!stat (name1, &info1) && !stat (name2, &info2)
+             && info1.st_dev == info2.st_dev && info1.st_ino == info2.st_ino);
+#endif /*!HAVE_W32_SYSTEM*/
+    }
+  return yes;
 }
 
 
index a007641..2f003e1 100644 (file)
@@ -1,6 +1,6 @@
 /* mischelp.h - Miscellaneous helper macros and functions
  * Copyright (C) 1999, 2000, 2001, 2002, 2003,
- *               2006  Free Software Foundation, Inc.
+ *               2006, 2007  Free Software Foundation, Inc.
  *
  * This file is part of JNLIB.
  *
 #define LIBJNLIB_MISCHHELP_H
 
 
+/* Check whether the files NAME1 and NAME2 are identical.  This is for
+   example achieved by comparing the inode numbers of the files.  */
+int same_file_p (const char *name1, const char *name2);
+
+
 #ifndef HAVE_TIMEGM
 #include <time.h>
 time_t timegm (struct tm *tm);
index b1f6f73..e7fd0ce 100644 (file)
@@ -338,11 +338,14 @@ make_filename( const char *first_part, ... )
 }
 
 
+/* Compare whether the filenames are identical.  This is a
+   specialversion of strcmp() taking the semantics of filenames in
+   account.  Note that this function works only on the supplied names
+   without considereing any context like the current directory.  See
+   also same_file_p(). */
 int
 compare_filenames (const char *a, const char *b)
 {
-  /* ? check whether this is an absolute filename and resolve
-     symlinks?  */
 #ifdef HAVE_DRIVE_LETTERS
   for ( ; *a && *b; a++, b++ ) 
     {
index edcf917..f7c79ee 100644 (file)
@@ -1,3 +1,7 @@
+2007-08-24  Werner Koch  <wk@g10code.com>
+
+       * keybox-init.c (keybox_register_file): Use same_file_p.
+
 2007-08-23  Werner Koch  <wk@g10code.com>
 
        * kbxutil.c: New commands --find-dups and --cut.  New options
index ea95c5f..fcf3c7c 100644 (file)
 #include <unistd.h>
 #include <assert.h>
 
+#include "../jnlib/mischelp.h"
 #include "keybox-defs.h"
 
-#define compare_filenames strcmp
-
 static KB_NAME kb_names;
 
 
@@ -42,8 +41,8 @@ keybox_register_file (const char *fname, int secret)
 
   for (kr=kb_names; kr; kr = kr->next)
     {
-      if ( !compare_filenames (kr->fname, fname) )
-        return NULL; /* already registered */
+      if (same_file_p (kr->fname, fname) )
+        return NULL; /* Already registered. */
     }
 
   kr = xtrymalloc (sizeof *kr + strlen (fname));
index 0e88779..57ece0d 100644 (file)
@@ -13,5 +13,8 @@ webderoot.der      trust.web.de Root CA certificate [2004-02-17]
 webdeca.der        trust.web.de CA certificate [2004-02-17]
 
 
+gte.pem            GTE CyberTrust Global Root
+
+
 
                  
diff --git a/tests/samplekeys/gte.pem b/tests/samplekeys/gte.pem
new file mode 100644 (file)
index 0000000..fd6ae9f
--- /dev/null
@@ -0,0 +1,19 @@
+Issuer ...: /CN=GTE CyberTrust Global Root/OU=GTE CyberTrust Solutions, Inc./O=GTE Corporation/C=US\r
+Serial ...: 01A5\r
+Subject ..: /CN=GTE CyberTrust Global Root/OU=GTE CyberTrust Solutions, Inc./O=GTE Corporation/C=US\r
+\r
+-----BEGIN CERTIFICATE-----\r
+MIICWjCCAcMCAgGlMA0GCSqGSIb3DQEBBAUAMHUxCzAJBgNVBAYTAlVTMRgwFgYD\r
+VQQKEw9HVEUgQ29ycG9yYXRpb24xJzAlBgNVBAsTHkdURSBDeWJlclRydXN0IFNv\r
+bHV0aW9ucywgSW5jLjEjMCEGA1UEAxMaR1RFIEN5YmVyVHJ1c3QgR2xvYmFsIFJv\r
+b3QwHhcNOTgwODEzMDAyOTAwWhcNMTgwODEzMjM1OTAwWjB1MQswCQYDVQQGEwJV\r
+UzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMScwJQYDVQQLEx5HVEUgQ3liZXJU\r
+cnVzdCBTb2x1dGlvbnMsIEluYy4xIzAhBgNVBAMTGkdURSBDeWJlclRydXN0IEds\r
+b2JhbCBSb290MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCVD6C28FCc6HrH\r
+iM3dFw4usJTQGz0O9pTAipTHBsiQl8i4ZBp6fmw8U+E3KHNgf7KXUwefU/ltWJTS\r
+r41tiGeA5u2ylc9yMcqlHHK6XALnZELn+aks1joNrI1CqiQBOeacPwGFVw1Yh0X4\r
+04Wqk2kmhXBIgD8SFcd5tB8FLztimQIDAQABMA0GCSqGSIb3DQEBBAUAA4GBAG3r\r
+GwnpXtlR22ciYaQqPEh346B8pt5zohQDhT37qw4wxYMWM4ETCJ57NE7fQMh017l9\r
+3PR2VX2bY1QY6fDq81yx2YtCHrnAlU66+tXifPVoYb+O7AWXX1uw16OFNMQkpw0P\r
+lZPvy5TYnh+dXIVtx6quTx8itc2VrbqnzPmrC3p/\r
+-----END CERTIFICATE-----\r