* certpath.c (gpgsm_validate_path): Print the DN of a missing issuer.
[gnupg.git] / sm / certdump.c
1 /* certdump.c - Dump a certificate for debugging
2  *      Copyright (C) 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 /* print the first element of an S-Expression */
37 void
38 gpgsm_dump_serial (KsbaConstSexp p)
39 {
40   unsigned long n;
41   KsbaConstSexp endp;
42
43   if (!p)
44     log_printf ("none");
45   else if (*p != '(')
46     log_printf ("ERROR - not an S-expression");
47   else
48     {
49       p++;
50       n = strtoul (p, (char**)&endp, 10);
51       p = endp;
52       if (*p!=':')
53         log_printf ("ERROR - invalid S-expression");
54       else
55         {
56           for (p++; n; n--, p++)
57             log_printf ("%02X", *p);
58         }
59     }
60 }
61
62
63
64 void
65 gpgsm_dump_time (time_t t)
66 {
67
68   if (!t)
69     log_printf ("none");
70   else if ( t == (time_t)(-1) )
71     log_printf ("error");
72   else
73     {
74       struct tm *tp;
75
76       tp = gmtime (&t);
77       log_printf ("%04d-%02d-%02d %02d:%02d:%02d",
78                   1900+tp->tm_year, tp->tm_mon+1, tp->tm_mday,
79                   tp->tm_hour, tp->tm_min, tp->tm_sec);
80       assert (!tp->tm_isdst);
81     }
82 }
83
84
85 void
86 gpgsm_dump_string (const char *string)
87 {
88
89   if (!string)
90     log_printf ("[error]");
91   else
92     {
93       const unsigned char *s;
94
95       for (s=string; *s; s++)
96         {
97           if (*s < ' ' || (*s >= 0x7f && *s <= 0xa0))
98             break;
99         }
100       if (!*s && *string != '[')
101         log_printf ("%s", string);
102       else
103         {
104           log_printf ( "[ ");
105           log_printhex (NULL, string, strlen (string));
106           log_printf ( " ]");
107         }
108     }
109 }
110
111
112 void 
113 gpgsm_dump_cert (const char *text, KsbaCert cert)
114 {
115   KsbaSexp sexp;
116   unsigned char *p;
117   char *dn;
118   time_t t;
119
120   log_debug ("BEGIN Certificate `%s':\n", text? text:"");
121   if (cert)
122     {
123       sexp = ksba_cert_get_serial (cert);
124       log_debug ("     serial: ");
125       gpgsm_dump_serial (sexp);
126       ksba_free (sexp);
127       log_printf ("\n");
128
129       t = ksba_cert_get_validity (cert, 0);
130       log_debug ("  notBefore: ");
131       gpgsm_dump_time (t);
132       log_printf ("\n");
133       t = ksba_cert_get_validity (cert, 1);
134       log_debug ("   notAfter: ");
135       gpgsm_dump_time (t);
136       log_printf ("\n");
137
138       dn = ksba_cert_get_issuer (cert, 0);
139       log_debug ("     issuer: ");
140       gpgsm_dump_string (dn);
141       ksba_free (dn);
142       log_printf ("\n");
143     
144       dn = ksba_cert_get_subject (cert, 0);
145       log_debug ("    subject: ");
146       gpgsm_dump_string (dn);
147       ksba_free (dn);
148       log_printf ("\n");
149
150       log_debug ("  hash algo: %s\n", ksba_cert_get_digest_algo (cert));
151
152       p = gpgsm_get_fingerprint_string (cert, 0);
153       log_debug ("  SHA1 Fingerprint: %s\n", p);
154       xfree (p);
155     }
156   log_debug ("END Certificate\n");
157 }
158
159
160
161
162
163