* findkey.c (agent_key_available): New.
authorWerner Koch <wk@gnupg.org>
Tue, 29 Jan 2002 10:05:05 +0000 (10:05 +0000)
committerWerner Koch <wk@gnupg.org>
Tue, 29 Jan 2002 10:05:05 +0000 (10:05 +0000)
* command.c (cmd_havekey): New.
(register_commands): And register new command.

agent/ChangeLog
agent/agent.h
agent/command.c
agent/findkey.c

index 89aaa54..9a42b40 100644 (file)
@@ -1,3 +1,9 @@
+2002-01-29  Werner Koch  <wk@gnupg.org>
+
+       * findkey.c (agent_key_available): New.
+       * command.c (cmd_havekey): New.
+       (register_commands): And register new command.
+
 2002-01-20  Werner Koch  <wk@gnupg.org>
 
        * command.c (cmd_get_passphrase): Remove the plus signs.
index 6db2f4b..d999bda 100644 (file)
@@ -94,6 +94,7 @@ void start_command_handler (int);
 
 /*-- findkey.c --*/
 GCRY_SEXP agent_key_from_file (const unsigned char *grip);
+int agent_key_available (const unsigned char *grip);
 
 /*-- query.c --*/
 int agent_askpin (const char *desc_text, struct pin_entry_info_s *pininfo);
index 3727699..bbcab8e 100644 (file)
@@ -120,6 +120,37 @@ cmd_marktrusted (ASSUAN_CONTEXT ctx, char *line)
 
 
 \f
+/* HAVEKEY <hexstring_with_keygrip>
+  
+   Return success when the secret key is available */
+static int
+cmd_havekey (ASSUAN_CONTEXT ctx, char *line)
+{
+  int n;
+  char *p;
+  unsigned char buf[20];
+
+  /* parse the hash value */
+  for (p=line,n=0; hexdigitp (p); p++, n++)
+    ;
+  if (*p)
+    return set_error (Parameter_Error, "invalid hexstring");
+  if ((n&1))
+    return set_error (Parameter_Error, "odd number of digits");
+  n /= 2;
+  if (n != 20)
+    return set_error (Parameter_Error, "invalid length of keygrip");
+
+  for (p=line, n=0; n < 20; p += 2, n++)
+    buf[n] = xtoi_2 (p);
+
+  if (agent_key_available (buf))
+    return ASSUAN_No_Secret_Key;
+
+  return 0;
+}
+
+
 /* SIGKEY <hexstring_with_keygrip>
    SETKEY <hexstring_with_keygrip>
   
@@ -414,6 +445,7 @@ register_commands (ASSUAN_CONTEXT ctx)
     int (*handler)(ASSUAN_CONTEXT, char *line);
   } table[] = {
     { "ISTRUSTED",  0,  cmd_istrusted },
+    { "HAVEKEY",    0,  cmd_havekey },
     { "SIGKEY",     0,  cmd_sigkey },
     { "SETKEY",     0,  cmd_sigkey },
     { "SETHASH",    0,  cmd_sethash },
index 84af44f..50f832b 100644 (file)
@@ -55,9 +55,8 @@ unprotect (GCRY_SEXP s_skey)
 
 
 
-
-
-/* Return the secret key as an S-Exp after locating it using the grip.  Returns NULL if key is not available. */
+/* Return the secret key as an S-Exp after locating it using the grip.
+   Returns NULL if key is not available. */
 GCRY_SEXP
 agent_key_from_file (const unsigned char *grip)
 {
@@ -125,5 +124,24 @@ agent_key_from_file (const unsigned char *grip)
   return s_skey;
 }
 
+/* Return the secret key as an S-Exp after locating it using the grip.
+   Returns NULL if key is not available. 0 = key is available */
+int
+agent_key_available (const unsigned char *grip)
+{
+  int i;
+  char *fname;
+  char hexgrip[41];
+  
+  for (i=0; i < 20; i++)
+    sprintf (hexgrip+2*i, "%02X", grip[i]);
+  hexgrip[40] = 0;
+
+  fname = make_filename (opt.homedir, "private-keys-v1.d", hexgrip, NULL );
+  i = !access (fname, R_OK)? 0 : -1;
+  xfree (fname);
+  return i;
+}
+