* keylist.c (list_cert_colon): Print alternative names of subject
[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 static void
70 print_time (time_t t, FILE *fp)
71 {
72   if (!t)
73     ;
74   else if ( t == (time_t)(-1) )
75     putc ('?', fp);
76   else
77     fprintf (fp, "%lu", (unsigned long)t);
78 }
79
80
81 /* List one certificate in colon mode */
82 static void
83 list_cert_colon (KsbaCert cert, FILE *fp)
84 {
85   int idx, trustletter = 0;
86   unsigned char *p;
87
88   fputs ("crt:", fp);
89   trustletter = 0;
90 #if 0
91   if (is_not_valid (cert))
92     putc ('i', fp);
93   else if ( is_revoked (cert) )
94     putc ('r', fp);
95   else if ( has_expired (cert))
96     putcr ('e', fp);
97   else
98 #endif
99     {
100       trustletter = '?'; /*get_validity_info ( pk, NULL );*/
101       putc (trustletter, fp);
102     }
103
104   fprintf (fp, ":%u:%d::",
105            /*keylen_of_cert (cert)*/1024,
106            /* pubkey_algo_of_cert (cert)*/'R');
107
108   /* we assume --fixed-list-mode for gpgsm */
109   print_time ( ksba_cert_get_validity (cert, 0), fp);
110   putc (':', fp);
111   print_time ( ksba_cert_get_validity (cert, 1), fp);
112   putc (':', fp);
113   putc (':', fp);
114   if ((p = ksba_cert_get_serial (cert)))
115     {
116       int i, len = (p[0] << 24) | (p[1] << 16) | (p[2] << 8) | p[3];
117       for (i=0; i < len; i++)
118         fprintf (fp,"%02X", p[4+i]);
119       xfree (p);
120     }
121   putc (':', fp);
122   putc (':', fp);
123   if ((p = ksba_cert_get_issuer (cert,0)))
124     {
125       fputs (p, fp);  /* FIXME: Escape colons and linefeeds */
126       xfree (p);
127     }
128   putc (':', fp);
129   print_capabilities (cert, fp);
130   putc ('\n', fp);
131
132   p = gpgsm_get_fingerprint_hexstring (cert, GCRY_MD_SHA1);
133   fprintf (fp, "fpr:::::::::%s:\n", p);
134   xfree (p);
135   if (opt.with_key_data)
136     {
137       if ( (p = gpgsm_get_keygrip_hexstring (cert)))
138         {
139           fprintf (fp, "grp:::::::::%s:\n", p);
140           xfree (p);
141         }
142       print_key_data (cert, fp);
143     }
144
145   for (idx=0; (p = ksba_cert_get_subject (cert,idx)); idx++)
146     {
147       fprintf (fp, "uid:%c::::::::", trustletter);
148       fputs (p, fp);  /* FIXME: Escape colons and linefeeds */
149       xfree (p);
150       putc (':', fp);
151       putc (':', fp);
152       putc ('\n', fp);
153     }
154 }
155
156
157
158 \f
159 /* List all keys or just the key given as NAMES */
160 void
161 gpgsm_list_keys (CTRL ctrl, STRLIST names, FILE *fp)
162 {
163   KEYDB_HANDLE hd;
164   KsbaCert cert = NULL;
165   int rc=0;
166   const char *lastresname, *resname;
167
168   hd = keydb_new (0);
169   if (!hd)
170     rc = GNUPG_General_Error;
171   else
172     rc = keydb_search_first (hd);
173   if (rc)
174     {
175       if (rc != -1)
176         log_error ("keydb_search_first failed: %s\n", gnupg_strerror (rc) );
177       goto leave;
178     }
179
180   lastresname = NULL;
181   do
182     {
183       rc = keydb_get_cert (hd, &cert);
184       if (rc) 
185         {
186           log_error ("keydb_get_cert failed: %s\n", gnupg_strerror (rc));
187           goto leave;
188         }
189       
190       resname = keydb_get_resource_name (hd);
191       
192       if (lastresname != resname ) 
193         {
194           int i;
195           
196           if (ctrl->no_server)
197             {
198               fprintf (fp, "%s\n", resname );
199               for (i=strlen(resname); i; i-- )
200                 putchar('-');
201               putc ('\n', fp);
202               lastresname = resname;
203             }
204         }
205       if (ctrl->with_colons)
206         list_cert_colon (cert, fp);
207       else
208         list_cert_colon (cert, fp);
209       ksba_cert_release (cert); 
210       cert = NULL;
211     }
212   while (!(rc = keydb_search_next (hd)));
213   if (rc && rc != -1)
214     log_error ("keydb_search_next failed: %s\n", gnupg_strerror (rc));
215   
216  leave:
217   ksba_cert_release (cert);
218   keydb_release (hd);
219 }
220