Introduced the keygrip
[gnupg.git] / sm / keylist.c
1 /* keylist.c
2  * Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation, Inc.
3  *
4  * This file is part of GnuPG.
5  *
6  * GnuPG is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (at your option) any later version.
10  *
11  * GnuPG is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software
18  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
19  */
20
21 #include <config.h>
22 #include <stdio.h>
23 #include <stdlib.h>
24 #include <string.h>
25 #include <errno.h>
26 #include <unistd.h> 
27 #include <time.h>
28 #include <assert.h>
29
30 #include <gcrypt.h>
31 #include <ksba.h>
32
33 #include "gpgsm.h"
34 #include "keydb.h"
35
36
37
38
39 static void
40 print_key_data (KsbaCert cert, FILE *fp)
41 {
42 #if 0  
43   int n = pk ? pubkey_get_npkey( pk->pubkey_algo ) : 0;
44   int i;
45
46   for(i=0; i < n; i++ ) 
47     {
48       fprintf (fp, "pkd:%d:%u:", i, mpi_get_nbits( pk->pkey[i] ) );
49       mpi_print(stdout, pk->pkey[i], 1 );
50       putchar(':');
51       putchar('\n');
52     }
53 #endif
54 }
55
56 static void
57 print_capabilities (KsbaCert cert, FILE *fp)
58 {
59   putc ('e', fp);
60   putc ('s', fp);
61   putc ('c', fp);
62   putc ('E', fp);
63   putc ('S', fp);
64   putc ('C', fp);
65   putc (':', fp);
66 }
67
68
69
70 /* List one certificate in colon mode */
71 static void
72 list_cert_colon (KsbaCert cert, FILE *fp)
73 {
74   int trustletter = 0;
75   char *p;
76
77   fputs ("crt:", fp);
78   trustletter = 0;
79 #if 0
80   if (is_not_valid (cert))
81     putc ('i', fp);
82   else if ( is_revoked (cert) )
83     putc ('r', fp);
84   else if ( has_expired (cert))
85     putcr ('e', fp);
86   else
87 #endif
88     {
89       trustletter = '?'; /*get_validity_info ( pk, NULL );*/
90       putc (trustletter, fp);
91     }
92
93   fprintf (fp, ":%u:%d::%s:%s:::",
94            /*keylen_of_cert (cert)*/1024,
95            /* pubkey_algo_of_cert (cert)*/'R',
96            /*colon_datestr_from_cert (cert)*/ "2001-11-11",
97            /*colon_strtime_expire (cert)*/ "2001-11-12" );
98     
99   putc (':', fp);
100   /* fixme: should we print the issuer name here? */
101   putc (':', fp);
102   print_capabilities (cert, fp);
103   putc ('\n', fp);
104   p = gpgsm_get_fingerprint_hexstring (cert, GCRY_MD_SHA1);
105   fprintf (fp, "fpr:::::::::%s:\n", p);
106   xfree (p);
107   p = gpgsm_get_keygrip_hexstring (cert);
108   fprintf (fp, "grp:::::::::%s:\n", p?p:"");
109   xfree (p);
110   if (opt.with_key_data)
111     print_key_data (cert, fp);
112
113   fprintf (fp, "uid:%c::::::::", trustletter);
114   p = ksba_cert_get_subject (cert);
115   if (p)
116     fputs (p, fp);  /* FIXME: Escape colons and linefeeds */
117   xfree (p);
118   putc (':', fp);
119   putc (':', fp);
120   putc ('\n', fp);
121 }
122
123
124
125 \f
126 /* List all keys or just the key given as NAMES */
127 void
128 gpgsm_list_keys (CTRL ctrl, STRLIST names, FILE *fp)
129 {
130   KEYDB_HANDLE hd;
131   KsbaCert cert = NULL;
132   int rc=0;
133   const char *lastresname, *resname;
134
135   hd = keydb_new (0);
136   if (!hd)
137     rc = GNUPG_General_Error;
138   else
139     rc = keydb_search_first (hd);
140   if (rc)
141     {
142       if (rc != -1)
143         log_error ("keydb_search_first failed: %s\n", gnupg_strerror (rc) );
144       goto leave;
145     }
146
147   lastresname = NULL;
148   do
149     {
150       rc = keydb_get_cert (hd, &cert);
151       if (rc) 
152         {
153           log_error ("keydb_get_cert failed: %s\n", gnupg_strerror (rc));
154           goto leave;
155         }
156       
157       resname = keydb_get_resource_name (hd);
158       
159       if (lastresname != resname ) 
160         {
161           int i;
162           
163           if (ctrl->no_server)
164             {
165               fprintf (fp, "%s\n", resname );
166               for (i=strlen(resname); i; i-- )
167                 putchar('-');
168               putc ('\n', fp);
169               lastresname = resname;
170             }
171           if (ctrl->with_colons)
172             list_cert_colon (cert, fp);
173           else
174             list_cert_colon (cert, fp);
175           ksba_cert_release (cert); 
176           cert = NULL;
177         } 
178     }
179   while (!(rc = keydb_search_next (hd)));
180   if (rc && rc != -1)
181     log_error ("keydb_search_next failed: %s\n", gnupg_strerror (rc));
182   
183  leave:
184   ksba_cert_release (cert);
185   keydb_release (hd);
186 }
187