* verify.c (calc_sig_summary): Set bad policy for wrong key usage.
authorWerner Koch <wk@gnupg.org>
Thu, 20 Jun 2002 12:13:44 +0000 (12:13 +0000)
committerWerner Koch <wk@gnupg.org>
Thu, 20 Jun 2002 12:13:44 +0000 (12:13 +0000)
(skip_token): New.
(_gpgme_verify_status_handler): Watch out for wrong key usage.
(gpgme_get_sig_string_attr): Hack to return info on the key
usage.  Does now make use of the former RESERVED argument which
has been renamed to WHATIDX.
(gpgme_get_sig_ulong_attr): Renamed RESERVED to WHATIDX.

* gpgme.texi (Verify): Explain the new whatidx variable.

doc/ChangeLog
doc/gpgme.texi
gpgme/ChangeLog
gpgme/gpgme.h
gpgme/verify.c

index 19a292c..3c9cee8 100644 (file)
@@ -1,3 +1,7 @@
+2002-06-20  Werner Koch  <wk@gnupg.org>
+
+       * gpgme.texi (Verify): Explain the new whatidx variable.
+
 2002-06-10  Werner Koch  <wk@gnupg.org>
 
        * gpgme.texi (Verify): Document attribute GPGME_ATTR_ERRTOK.
index cd5e57f..9f07ee9 100644 (file)
@@ -2217,25 +2217,34 @@ fingerprint of the key which signed the plaintext, or @code{NULL} if
 no verification could be performed.
 @end deftypefun
 
-@deftypefun {const char *} gpgme_get_sig_string_attr (@w{GpgmeCtx @var{ctx}}, @w{int @var{idx}}, @w{GpgmeAttr @var{what}}, @w{int @var{reserved}})
+@deftypefun {const char *} gpgme_get_sig_string_attr (@w{GpgmeCtx @var{ctx}}, @w{int @var{idx}}, @w{GpgmeAttr @var{what}}, @w{int @var{whatidx}})
 This function is similar to @code{gpgme_get_sig_status} but may be used
 to retrieve more detailed information.  @var{ctx} should be the context
 used for the last signature verification, @var{idx} is used to enumerate
-over all signatures starting with @code{0} and @var{reserved} should be
-@code{0} for now.
+over all signatures starting with @code{0} and @var{whatidx} should be
+@code{0} for unless otherwise stated.
 
-The attributes @var{what} currently supports are
-@code{GPGME_ATTR_FPR} to return the fingerprint of the key used to
-create the signature and @code{GPGME_ERRTOK} to return a token
-with a more detailed error description.
+The following values may be used for @var{what}:
+@table @code
+@item GPGME_ATTR_FPR
+Return the fingerprint of the key used to create the signature.
+
+@item GPGME_ATTR_ERRTOK
+Return a token with a more detailed error description.  A @var{whatidx}
+of @code{0} returns an error token associated with validity calculation,
+a value of @code{1} return an error token related to the certifixate
+checking.
+
+@end table
 @end deftypefun
 
-@deftypefun {const char *} gpgme_get_sig_ulong_attr (@w{GpgmeCtx @var{ctx}}, @w{int @var{idx}}, @w{GpgmeAttr @var{waht}}, @w{int @var{reserved}})
-This fucntion is similar to @code{gpgme_get_sig_string_attr} but used
+@deftypefun {const char *} gpgme_get_sig_ulong_attr (@w{GpgmeCtx @var{ctx}}, @w{int @var{idx}}, @w{GpgmeAttr @var{waht}}, @w{int @var{whatidx}})
+This function is similar to @code{gpgme_get_sig_string_attr} but used
 for attributes which can be represented by an @code{unsigned long} data
 type.  @var{ctx} should be the context used for the last signature
 verification, @var{idx} is used to enumerate over all signatures
-starting with @code{0} and @var{reserved} should be @code{0} for now.
+starting with @code{0} and @var{whatidx} should be @code{0} for unless
+otherwise stated.
 
 The following values may be used for @var{what}:
 @table @code
index c017b08..5c68e9c 100644 (file)
@@ -1,3 +1,13 @@
+2002-06-20  Werner Koch  <wk@gnupg.org>
+
+       * verify.c (calc_sig_summary): Set bad policy for wrong key usage.
+       (skip_token): New.
+       (_gpgme_verify_status_handler): Watch out for wrong key usage.
+       (gpgme_get_sig_string_attr): Hack to return info on the key
+       usage.  Does now make use of the former RESERVED argument which
+       has been renamed to WHATIDX.
+       (gpgme_get_sig_ulong_attr): Renamed RESERVED to WHATIDX.
+
 2002-06-14  Marcus Brinkmann  <marcus@g10code.de>
 
        * wait.c (do_select): Return -1 on error, and 0 if nothing to run.
index cc781cd..798ebd7 100644 (file)
@@ -317,11 +317,11 @@ const char *gpgme_get_sig_status (GpgmeCtx ctx, int idx,
 /* Retrieve certain attributes of a signature.  IDX is the index
    number of the signature after a successful verify operation.  WHAT
    is an attribute where GPGME_ATTR_EXPIRE is probably the most useful
-   one.  RESERVED must be passed as 0. */
+   one.  WHATIDX is to be passed as 0 for most attributes . */
 unsigned long gpgme_get_sig_ulong_attr (GpgmeCtx c, int idx,
-                                        GpgmeAttr what, int reserved);
+                                        GpgmeAttr what, int whatidx);
 const char *gpgme_get_sig_string_attr (GpgmeCtx c, int idx,
-                                      GpgmeAttr what, int reserved);
+                                      GpgmeAttr what, int whatidx);
 
 
 /* Get the key used to create signature IDX in CTX and return it in
index fe99aa9..1005426 100644 (file)
@@ -44,6 +44,7 @@ struct verify_result_s
   ulong timestamp;     /* Signature creation time.  */
   ulong exptimestamp;   /* signature exipration time or 0 */
   GpgmeValidity validity;
+  int wrong_key_usage;  
   char trust_errtok[31]; /* error token send with the trust status */
 };
 
@@ -82,6 +83,23 @@ is_token (const char *string, const char *token, size_t *next)
   return 1;
 }
 
+static int
+skip_token (const char *string, size_t *next)
+{
+  size_t n = 0;
+
+  for (;*string && *string != ' '; string++, n++)
+    ;
+  for (;*string == ' '; string++, n++)
+    ;
+  if (!*string)
+    return 0;
+  if (next)
+    *next = n;
+  return 1;
+}
+
+
 static size_t
 copy_token (const char *string, char *buffer, size_t length)
 {
@@ -306,6 +324,12 @@ _gpgme_verify_status_handler (GpgmeCtx ctx, GpgStatusCode code, char *args)
             ctx->result.verify->status = GPGME_SIG_STAT_ERROR;
 
         }
+      else if (skip_token (args, &n) && n)
+        {
+          args += n;
+          if (is_token (args, "Wrong_Key_Usage", NULL))
+            ctx->result.verify->wrong_key_usage = 1;
+        }
       break;
 
     case STATUS_EOF:
@@ -548,6 +572,9 @@ calc_sig_summary (VerifyResult result)
   else if (*result->trust_errtok)
     sum |= GPGME_SIGSUM_SYS_ERROR;
 
+  if (result->wrong_key_usage)
+    sum |= GPGME_SIGSUM_BAD_POLICY;
+
   /* Set the valid flag when the signature is unquestionable
      valid. */
   if ((sum & GPGME_SIGSUM_GREEN) && !(sum & ~GPGME_SIGSUM_GREEN))
@@ -558,15 +585,13 @@ calc_sig_summary (VerifyResult result)
 
 
 const char *
-gpgme_get_sig_string_attr (GpgmeCtx c, int idx, GpgmeAttr what, int reserved)
+gpgme_get_sig_string_attr (GpgmeCtx c, int idx, GpgmeAttr what, int whatidx)
 {
   VerifyResult result;
 
   if (!c || c->pending || !c->result.verify)
     return NULL;       /* No results yet or verification error.  */
-  if (reserved)
-    return NULL; /* We might want to use it to enumerate attributes of
-                    one signature */
+
   for (result = c->result.verify;
        result && idx > 0; result = result->next, idx--)
     ;
@@ -578,7 +603,10 @@ gpgme_get_sig_string_attr (GpgmeCtx c, int idx, GpgmeAttr what, int reserved)
     case GPGME_ATTR_FPR:
       return result->fpr;
     case GPGME_ATTR_ERRTOK:
-      return result->trust_errtok;
+      if (whatidx == 1)
+        return result->wrong_key_usage? "Wrong_Key_Usage":"";
+      else
+        return result->trust_errtok;
     default:
       break;
     }
@@ -592,8 +620,7 @@ gpgme_get_sig_ulong_attr (GpgmeCtx c, int idx, GpgmeAttr what, int reserved)
 
   if (!c || c->pending || !c->result.verify)
     return 0;  /* No results yet or verification error.  */
-  if (reserved)
-    return 0; 
+
   for (result = c->result.verify;
        result && idx > 0; result = result->next, idx--)
     ;