1 /* t-crl-parser.c - basic test for the CRl parser.
2 * Copyright (C) 2002, 2004, 2005 g10 Code GmbH
4 * This file is part of KSBA.
6 * KSBA 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 3 of the License, or
9 * (at your option) any later version.
11 * KSBA 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.
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, see <http://www.gnu.org/licenses/>.
20 #undef ENABLE_HASH_LOGGING
22 #ifdef ENABLE_HASH_LOGGING
32 #include "../src/ksba.h"
35 #include "oidtranstbl.h"
43 my_hasher (void *arg, const void *buffer, size_t length)
49 if ( fwrite (buffer, length, 1, fp) != 1 )
50 fail ("error writing to-be-hashed data");
55 /* Return the description for OID; if no description is available
58 get_oid_desc (const char *oid)
63 for (i=0; oidtranstbl[i].oid; i++)
64 if (!strcmp (oidtranstbl[i].oid, oid))
65 return oidtranstbl[i].desc;
71 print_names (int indent, ksba_name_t name)
77 if ((indent_all = (indent < 0)))
83 fputs ("none\n", stdout);
87 for (idx=0; (s = ksba_name_enum (name, idx)); idx++)
89 char *p = ksba_name_get_uri (name, idx);
91 printf ("%*s%s\n", idx||indent_all?indent:0, "", p?p:s);
99 one_file (const char *fname)
105 ksba_stop_reason_t stopreason;
107 FILE *hashlog = NULL;
109 #ifdef ENABLE_HASH_LOGGING
114 if (asprintf (&buf, "%s.hash.log", fname) < 0)
115 fail ("asprintf failed");
116 hashlog = fopen (buf, "wb");
118 fail ("can't create log file");
124 printf ("*** checking `%s' ***\n", fname);
125 fp = fopen (fname, "rb");
128 fprintf (stderr, "%s:%d: can't open `%s': %s\n",
129 __FILE__, __LINE__, fname, strerror (errno));
133 err = ksba_reader_new (&r);
136 err = ksba_reader_set_file (r, fp);
139 err = ksba_crl_new (&crl);
143 err = ksba_crl_set_reader (crl, r);
147 ksba_crl_set_hash_function (crl, my_hasher, hashlog);
151 err = ksba_crl_parse (crl, &stopreason);
152 fail_if_err2 (fname, err);
155 case KSBA_SR_BEGIN_ITEMS:
159 ksba_isotime_t this, next;
161 algoid = ksba_crl_get_digest_algo (crl);
163 printf ("digest algo: %s\n", algoid? algoid : "[none]");
164 if (algoid && !strcmp (algoid, "1.2.840.113549.1.1.10"))
166 ksba_sexp_t pssparam;
169 printf (" pss para: ");
170 pssparam = ksba_crl_get_sig_val (crl);
173 print_sexp (pssparam);
179 err = ksba_crl_get_issuer (crl, &issuer);
180 fail_if_err2 (fname, err);
189 err = ksba_crl_get_update_times (crl, this, next);
190 if (gpg_err_code (err) != GPG_ERR_INV_TIME)
191 fail_if_err2 (fname, err);
194 printf ("thisUpdate: ");
197 printf ("nextUpdate: ");
204 case KSBA_SR_GOT_ITEM:
207 ksba_isotime_t rdate;
208 ksba_crl_reason_t reason;
210 err = ksba_crl_get_item (crl, &serial, rdate, &reason);
211 fail_if_err2 (fname, err);
214 printf ("CRL entry %d: s=", ++count);
215 print_sexp_hex (serial);
218 printf (", r=%x\n", reason);
224 case KSBA_SR_END_ITEMS:
231 fail ("unknown stop reason");
235 while (stopreason != KSBA_SR_READY);
237 if ( !ksba_crl_get_digest_algo (crl))
238 fail ("digest algorithm mismatch");
245 err = ksba_crl_get_auth_key_id (crl, &keyid, &name1, &serial);
246 if (!err || gpg_err_code (err) == GPG_ERR_NO_DATA)
249 fputs ("AuthorityKeyIdentifier: ", stdout);
250 if (gpg_err_code (err) == GPG_ERR_NO_DATA)
253 fputs ("none\n", stdout);
259 print_names (24, name1);
260 ksba_name_release (name1);
263 fputs (" serial: ", stdout);
264 print_sexp_hex (serial);
274 fputs (" keyIdentifier: ", stdout);
289 err = ksba_crl_get_crl_number (crl, &serial);
290 if (!err || gpg_err_code (err) == GPG_ERR_NO_DATA)
293 fputs ("crlNumber: ", stdout);
294 if (gpg_err_code (err) == GPG_ERR_NO_DATA)
297 fputs ("none", stdout);
318 for (idx=0; !(err=ksba_crl_get_extension (crl, idx,
320 NULL, &derlen)); idx++)
322 const char *s = get_oid_desc (oid);
324 printf ("%sExtn: %s%s%s%s (%lu octets)\n",
326 s?" (":"", s?s:"", s?")":"",
327 oid, (unsigned long)derlen);
329 if (err && gpg_err_code (err) != GPG_ERR_EOF
330 && gpg_err_code (err) != GPG_ERR_NO_DATA )
338 sigval = ksba_crl_get_sig_val (crl);
340 fail ("signature value missing");
350 ksba_crl_release (crl);
351 ksba_reader_release (r);
361 main (int argc, char **argv)
363 const char *srcdir = getenv ("srcdir");
372 if (argc && !strcmp (*argv, "--verbose"))
380 for (; argc; argc--, argv++)
385 const char *files[] = {
386 "crl_testpki_testpca.der",
394 for (idx=0; files[idx]; idx++)
398 fname = xmalloc (strlen (srcdir) + 10 + strlen (files[idx]) + 1);
399 strcpy (fname, srcdir);
400 strcat (fname, "/samples/");
401 strcat (fname, files[idx]);