Changes to be used with the new libksba interface.
[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 static void
37 print_sexp (KsbaConstSexp p)
38 {
39   unsigned long n;
40   KsbaConstSexp endp;
41
42   if (!p)
43     log_printf ("none");
44   else
45     {
46       n = strtoul (p, (char**)&endp, 10);
47       p = endp;
48       if (*p!=':')
49         log_printf ("ERROR - invalid value");
50       else
51         {
52           for (p++; n; n--, p++)
53             log_printf ("%02X", *p);
54         }
55     }
56 }
57
58
59
60 static void
61 print_time (time_t t)
62 {
63
64   if (!t)
65     log_printf ("none");
66   else if ( t == (time_t)(-1) )
67     log_printf ("error");
68   else
69     {
70       struct tm *tp;
71
72       tp = gmtime (&t);
73       log_printf ("%04d-%02d-%02d %02d:%02d:%02d",
74                   1900+tp->tm_year, tp->tm_mon+1, tp->tm_mday,
75                   tp->tm_hour, tp->tm_min, tp->tm_sec);
76       assert (!tp->tm_isdst);
77     }
78 }
79
80 static void
81 print_dn (char *p)
82 {
83   if (!p)
84     log_printf ("error");
85   else
86     log_printf ("`%s'", p);
87 }
88
89
90 void 
91 gpgsm_dump_cert (const char *text, KsbaCert cert)
92 {
93   KsbaSexp sexp;
94   unsigned char *p;
95   char *dn;
96   time_t t;
97
98   log_debug ("BEGIN Certificate `%s':\n", text? text:"");
99   if (cert)
100     {
101       sexp = ksba_cert_get_serial (cert);
102       log_debug ("  serial: ");
103       print_sexp (sexp);
104       ksba_free (sexp);
105       log_printf ("\n");
106
107       t = ksba_cert_get_validity (cert, 0);
108       log_debug ("  notBefore: ");
109       print_time (t);
110       log_printf ("\n");
111       t = ksba_cert_get_validity (cert, 1);
112       log_debug ("  notAfter: ");
113       print_time (t);
114       log_printf ("\n");
115
116       dn = ksba_cert_get_issuer (cert, 0);
117       log_debug ("  issuer: ");
118       print_dn (dn);
119       ksba_free (dn);
120       log_printf ("\n");
121     
122       dn = ksba_cert_get_subject (cert, 0);
123       log_debug ("  subject: ");
124       print_dn (dn);
125       ksba_free (dn);
126       log_printf ("\n");
127
128       log_debug ("  hash algo: %s\n", ksba_cert_get_digest_algo (cert));
129
130       p = gpgsm_get_fingerprint_string (cert, 0);
131       log_debug ("  SHA1 Fingerprint: %s\n", p);
132       xfree (p);
133     }
134   log_debug ("END Certificate\n");
135 }