* call-dirmngr.c (inq_certificate): Changed for new interface semantic.
[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 static void
86 print_dn (char *p)
87 {
88   if (!p)
89     log_printf ("error");
90   else
91     log_printf ("`%s'", p);
92 }
93
94
95 void 
96 gpgsm_dump_cert (const char *text, KsbaCert cert)
97 {
98   KsbaSexp sexp;
99   unsigned char *p;
100   char *dn;
101   time_t t;
102
103   log_debug ("BEGIN Certificate `%s':\n", text? text:"");
104   if (cert)
105     {
106       sexp = ksba_cert_get_serial (cert);
107       log_debug ("  serial: ");
108       gpgsm_dump_serial (sexp);
109       ksba_free (sexp);
110       log_printf ("\n");
111
112       t = ksba_cert_get_validity (cert, 0);
113       log_debug ("  notBefore: ");
114       gpgsm_dump_time (t);
115       log_printf ("\n");
116       t = ksba_cert_get_validity (cert, 1);
117       log_debug ("  notAfter: ");
118       gpgsm_dump_time (t);
119       log_printf ("\n");
120
121       dn = ksba_cert_get_issuer (cert, 0);
122       log_debug ("  issuer: ");
123       print_dn (dn);
124       ksba_free (dn);
125       log_printf ("\n");
126     
127       dn = ksba_cert_get_subject (cert, 0);
128       log_debug ("  subject: ");
129       print_dn (dn);
130       ksba_free (dn);
131       log_printf ("\n");
132
133       log_debug ("  hash algo: %s\n", ksba_cert_get_digest_algo (cert));
134
135       p = gpgsm_get_fingerprint_string (cert, 0);
136       log_debug ("  SHA1 Fingerprint: %s\n", p);
137       xfree (p);
138     }
139   log_debug ("END Certificate\n");
140 }
141
142