pluto and charon now have the same ipsec listall output format

This commit is contained in:
Andreas Steffen
2009-10-06 16:49:46 +02:00
parent f3e9eae283
commit ce2f2461e0
17 changed files with 89 additions and 131 deletions
+11 -13
View File
@@ -20,6 +20,7 @@
#include <unistd.h>
#include <dirent.h>
#include <sys/types.h>
#include <time.h>
#include <freeswan.h>
@@ -282,7 +283,6 @@ void list_acerts(bool utc)
{
whack_log(RC_COMMENT, " ");
whack_log(RC_COMMENT, "List of X.509 Attribute Certificates:");
whack_log(RC_COMMENT, " ");
}
while (x509ac)
@@ -294,53 +294,51 @@ void list_acerts(bool utc)
time_t notBefore, notAfter;
ietf_attributes_t *groups;
whack_log(RC_COMMENT, "%T", &x509ac->installed, utc);
whack_log(RC_COMMENT, " ");
entityName = cert_ac->get_subject(cert_ac);
if (entityName)
{
whack_log(RC_COMMENT, " holder: '%Y'", entityName);
whack_log(RC_COMMENT, " holder: \"%Y\"", entityName);
}
holderIssuer = ac->get_holderIssuer(ac);
if (holderIssuer)
{
whack_log(RC_COMMENT, " hissuer: '%Y'", holderIssuer);
whack_log(RC_COMMENT, " hissuer: \"%Y\"", holderIssuer);
}
holderSerial = ac->get_holderSerial(ac);
if (holderSerial.ptr)
{
whack_log(RC_COMMENT, " hserial: %#B", &holderSerial);
whack_log(RC_COMMENT, " hserial: %#B", &holderSerial);
}
groups = ac->get_groups(ac);
if (groups)
{
whack_log(RC_COMMENT, " groups: %s",
whack_log(RC_COMMENT, " groups: %s",
groups->get_string(groups));
groups->destroy(groups);
}
issuer = cert_ac->get_issuer(cert_ac);
whack_log(RC_COMMENT, " issuer: '%Y'", issuer);
whack_log(RC_COMMENT, " issuer: \"%Y\"", issuer);
serial = ac->get_serial(ac);
whack_log(RC_COMMENT, " serial: %#B", &serial);
whack_log(RC_COMMENT, " serial: %#B", &serial);
cert_ac->get_validity(cert_ac, &now, &notBefore, &notAfter);
whack_log(RC_COMMENT, " validity: not before %T %s",
whack_log(RC_COMMENT, " validity: not before %T %s",
&notBefore, utc,
(notBefore < now)?"ok":"fatal (not valid yet)");
whack_log(RC_COMMENT, " not after %T %s",
&notAfter, utc,
whack_log(RC_COMMENT, " not after %T %s", &notAfter, utc,
check_expiry(notAfter, ACERT_WARNING_INTERVAL, TRUE));
authKeyID = ac->get_authKeyIdentifier(ac);
if (authKeyID.ptr)
{
whack_log(RC_COMMENT, " authkey: %#B", &authKeyID);
whack_log(RC_COMMENT, " authkey: %#B", &authKeyID);
}
x509ac = x509ac->next;
-3
View File
@@ -18,8 +18,6 @@
#ifndef _AC_H
#define _AC_H
#include <time.h>
#include <credentials/certificates/certificate.h>
#include <credentials/ietf_attributes/ietf_attributes.h>
@@ -30,7 +28,6 @@ typedef struct x509acert x509acert_t;
struct x509acert {
certificate_t *ac;
x509acert_t *next;
time_t installed;
};
extern bool verify_x509acert(x509acert_t *ac, bool strict);
+1 -4
View File
@@ -98,7 +98,6 @@ static cert_t *builder_load_cert(certificate_type_t type, va_list args)
*cert = cert_empty;
cert->type = CERT_X509_SIGNATURE;
cert->u.x509 = x509cert;
time(&x509cert->installed);
return cert;
}
plog(" error in X.509 certificate");
@@ -134,7 +133,6 @@ static x509acert_t *builder_load_ac(certificate_type_t type, va_list args)
{
ac = malloc_thing(x509acert_t);
ac->next = NULL;
ac->installed = UNDEFINED_TIME;
ac->ac = lib->creds->create(lib->creds,
CRED_CERTIFICATE, CERT_X509_AC,
BUILD_BLOB_ASN1_DER, blob, BUILD_END);
@@ -173,9 +171,8 @@ static x509crl_t *builder_load_crl(certificate_type_t type, va_list args)
if (blob.ptr)
{
crl = malloc_thing(x509crl_t);
*crl = empty_x509crl;
crl->next = NULL;
crl->distributionPoints = linked_list_create();
crl->crl = lib->creds->create(lib->creds,
CRED_CERTIFICATE, CERT_X509_CRL,
BUILD_BLOB_ASN1_DER, blob,
+15 -12
View File
@@ -661,7 +661,6 @@ void add_ca_info(const whack_message_t *msg)
ca->next = ca_infos;
ca_infos = ca;
ca->installed = time(NULL);
unlock_ca_info_list("add_ca_info");
@@ -690,7 +689,6 @@ void list_ca_infos(bool utc)
{
whack_log(RC_COMMENT, " ");
whack_log(RC_COMMENT, "List of X.509 CA Information Records:");
whack_log(RC_COMMENT, " ");
}
while (ca != NULL)
@@ -703,15 +701,21 @@ void list_ca_infos(bool utc)
, &ca->installed, utc, ca->name
, ca->strictcrlpolicy? "yes":"no");
*/
whack_log(RC_COMMENT, "%T, \"%s\"", &ca->installed, utc, ca->name);
whack_log(RC_COMMENT, " ");
dntoa(buf, BUF_LEN, ca->authName);
whack_log(RC_COMMENT, " authname: '%s'", buf);
if (ca->ldaphost != NULL)
whack_log(RC_COMMENT, " ldaphost: '%s'", ca->ldaphost);
if (ca->ldapbase != NULL)
whack_log(RC_COMMENT, " ldapbase: '%s'", ca->ldapbase);
if (ca->ocspuri != NULL)
whack_log(RC_COMMENT, " ocspuri: '%s'", ca->ocspuri);
whack_log(RC_COMMENT, " authname: \"%s\"", buf);
if (ca->ldaphost)
{
whack_log(RC_COMMENT, " ldaphost: '%s'", ca->ldaphost);
}
if (ca->ldapbase)
{
whack_log(RC_COMMENT, " ldapbase: '%s'", ca->ldapbase);
}
if (ca->ocspuri)
{
whack_log(RC_COMMENT, " ocspuri: '%s'", ca->ocspuri);
}
list_distribution_points(ca->crluris);
@@ -719,10 +723,9 @@ void list_ca_infos(bool utc)
{
datatot(ca->authKeyID.ptr, ca->authKeyID.len, ':'
, buf, BUF_LEN);
whack_log(RC_COMMENT, " authkey: %s", buf);
whack_log(RC_COMMENT, " authkey: %s", buf);
}
ca = ca->next;
}
}
-1
View File
@@ -29,7 +29,6 @@ typedef struct ca_info ca_info_t;
struct ca_info {
ca_info_t *next;
char *name;
time_t installed;
chunk_t authName;
chunk_t authKeyID;
char *ldaphost;
+14 -23
View File
@@ -39,14 +39,7 @@
/* chained lists of X.509 crls */
static x509crl_t *x509crls = NULL;
const x509crl_t empty_x509crl = {
NULL , /* crl */
NULL , /* *next */
UNDEFINED_TIME, /* installed */
NULL , /* distributionPoints */
};
static x509crl_t *x509crls = NULL;
/**
* Get the X.509 CRL with a given issuer
@@ -502,7 +495,6 @@ void list_crls(bool utc, bool strict)
{
whack_log(RC_COMMENT, " ");
whack_log(RC_COMMENT, "List of X.509 CRLs:");
whack_log(RC_COMMENT, " ");
}
while (x509crl)
@@ -514,6 +506,15 @@ void list_crls(bool utc, bool strict)
u_int revoked = 0;
enumerator_t *enumerator;
whack_log(RC_COMMENT, " ");
whack_log(RC_COMMENT, " issuer: \"%Y\"",
cert_crl->get_issuer(cert_crl));
serial = crl->get_serial(crl);
if (serial.ptr)
{
whack_log(RC_COMMENT, " serial: %#B", &serial);
}
/* count number of revoked certificates in CRL */
enumerator = crl->create_enumerator(crl);
while (enumerator->enumerate(enumerator, NULL, NULL, NULL))
@@ -521,28 +522,18 @@ void list_crls(bool utc, bool strict)
revoked++;
}
enumerator->destroy(enumerator);
whack_log(RC_COMMENT, " revoked: %d certificates", revoked);
whack_log(RC_COMMENT, "%T, revoked certs: %d",
&x509crl->installed, utc, revoked);
whack_log(RC_COMMENT, " issuer: '%Y'",
cert_crl->get_issuer(cert_crl));
serial = crl->get_serial(crl);
if (serial.ptr)
{
whack_log(RC_COMMENT, " crlnumber: %#B", &serial);
}
list_distribution_points(x509crl->distributionPoints);
cert_crl->get_validity(cert_crl, NULL, &thisUpdate, &nextUpdate);
whack_log(RC_COMMENT, " updates: this %T",
&thisUpdate, utc);
whack_log(RC_COMMENT, " next %T %s",
&nextUpdate, utc,
whack_log(RC_COMMENT, " updates: this %T", &thisUpdate, utc);
whack_log(RC_COMMENT, " next %T %s", &nextUpdate, utc,
check_expiry(nextUpdate, CRL_WARNING_INTERVAL, strict));
authKeyID = crl->get_authKeyIdentifier(crl);
if (authKeyID.ptr)
{
whack_log(RC_COMMENT, " authkey: %#B", &authKeyID);
whack_log(RC_COMMENT, " authkey: %#B", &authKeyID);
}
x509crl = x509crl->next;
-5
View File
@@ -25,7 +25,6 @@ typedef struct x509crl x509crl_t;
struct x509crl {
certificate_t *crl;
x509crl_t *next;
time_t installed;
linked_list_t *distributionPoints;
chunk_t signature;
};
@@ -44,10 +43,6 @@ extern bool cache_crls;
* check periodically for expired crls
*/
extern long crl_check_interval;
/* used for initialization */
extern const x509crl_t empty_x509crl;
extern void load_crls(void);
extern void check_crls(void);
extern bool insert_crl(x509crl_t *crl, char *crl_uri, bool cache_crl);
+5 -10
View File
@@ -44,7 +44,6 @@
fetch_req_t empty_fetch_req = {
NULL , /* next */
0 , /* installed */
0 , /* trials */
{ NULL, 0}, /* issuer */
{ NULL, 0}, /* authKeyID */
@@ -609,9 +608,6 @@ fetch_req_t* build_crl_fetch_request(chunk_t issuer, chunk_t authKeyID,
memset(req, 0, sizeof(fetch_req_t));
req->distributionPoints = linked_list_create();
/* note current time */
req->installed = time(NULL);
/* clone fields */
req->issuer = chunk_clone(issuer);
req->authKeyID = chunk_clone(authKeyID);
@@ -695,7 +691,7 @@ void list_distribution_points(linked_list_t *distributionPoints)
enumerator = distributionPoints->create_enumerator(distributionPoints);
while (enumerator->enumerate(enumerator, &point))
{
whack_log(RC_COMMENT, " %s '%s'",
whack_log(RC_COMMENT, " %s '%s'",
(first_point)? "distPts: " : " ", point);
first_point = FALSE;
}
@@ -715,7 +711,7 @@ void list_crl_fetch_requests(bool utc)
if (req != NULL)
{
whack_log(RC_COMMENT, " ");
whack_log(RC_COMMENT, "List of CRL fetch requests:");
whack_log(RC_COMMENT, "List of CRL Fetch Requests:");
whack_log(RC_COMMENT, " ");
}
@@ -723,15 +719,14 @@ void list_crl_fetch_requests(bool utc)
{
u_char buf[BUF_LEN];
whack_log(RC_COMMENT, "%T, trials: %d"
, &req->installed, utc, req->trials);
whack_log(RC_COMMENT, " trials: %d", req->trials);
dntoa(buf, BUF_LEN, req->issuer);
whack_log(RC_COMMENT, " issuer: '%s'", buf);
whack_log(RC_COMMENT, " issuer: '%s'", buf);
if (req->authKeyID.ptr != NULL)
{
datatot(req->authKeyID.ptr, req->authKeyID.len, ':'
, buf, BUF_LEN);
whack_log(RC_COMMENT, " authkey: %s", buf);
whack_log(RC_COMMENT, " authkey: %s", buf);
}
list_distribution_points(req->distributionPoints);
req = req->next;
-1
View File
@@ -30,7 +30,6 @@ typedef struct fetch_req fetch_req_t;
struct fetch_req {
fetch_req_t *next;
time_t installed;
int trials;
chunk_t issuer;
chunk_t authKeyID;
-1
View File
@@ -2173,7 +2173,6 @@ static void decode_cert(struct msg_digest *md)
BUILD_END);
if (cert.cert)
{
time(&cert.installed);
if (verify_x509cert(&cert, strict_crl_policy, &valid_until))
{
DBG(DBG_PARSING,
+6 -6
View File
@@ -1430,7 +1430,6 @@ void list_public_keys(bool utc)
{
whack_log(RC_COMMENT, " ");
whack_log(RC_COMMENT, "List of Public Keys:");
whack_log(RC_COMMENT, " ");
}
while (p != NULL)
@@ -1440,27 +1439,28 @@ void list_public_keys(bool utc)
chunk_t keyid;
char buf[BUF_LEN];
whack_log(RC_COMMENT, " ");
idtoa(&key->id, buf, BUF_LEN);
whack_log(RC_COMMENT,"%T, '%s'", &key->installed_time, utc, buf);
whack_log(RC_COMMENT, " pubkey: %N %4d bits, until %T %s",
whack_log(RC_COMMENT, " owner: '%s'", buf);
whack_log(RC_COMMENT, " pubkey: %N %4d bits, until %T %s",
key_type_names, public->get_type(public),
public->get_keysize(public) * BITS_PER_BYTE,
&key->until_time, utc,
check_expiry(key->until_time, PUBKEY_WARNING_INTERVAL, TRUE));
if (public->get_fingerprint(public, KEY_ID_PUBKEY_INFO_SHA1, &keyid))
{
whack_log(RC_COMMENT," keyid: %#B", &keyid);
whack_log(RC_COMMENT," keyid: %#B", &keyid);
}
if (key->issuer.len > 0)
{
dntoa(buf, BUF_LEN, key->issuer);
whack_log(RC_COMMENT," issuer: '%s'", buf);
whack_log(RC_COMMENT," issuer: \"%s\"", buf);
}
if (key->serial.len > 0)
{
datatot(key->serial.ptr, key->serial.len, ':'
, buf, BUF_LEN);
whack_log(RC_COMMENT," serial: %s", buf);
whack_log(RC_COMMENT," serial: %s", buf);
}
p = p->next;
}
+20 -25
View File
@@ -424,7 +424,7 @@ cert_status_t verify_by_ocsp(const x509cert_t *cert, time_t *until,
chunk_t serialNumber = x509->get_serial(x509);
cert_status_t status;
ocsp_location_t location;
time_t nextUpdate;
time_t nextUpdate = UNDEFINED_TIME;
*revocationDate = UNDEFINED_TIME;
*revocationReason = CRL_REASON_UNSPECIFIED;
@@ -595,50 +595,46 @@ void list_ocsp_locations(ocsp_location_t *location, bool requests,
first = FALSE;
}
whack_log(RC_COMMENT, " ");
if (location->issuer.ptr != NULL)
if (location->issuer.ptr)
{
dntoa(buf, BUF_LEN, location->issuer);
whack_log(RC_COMMENT, " issuer: '%s'", buf);
whack_log(RC_COMMENT, " issuer: \"%s\"", buf);
}
whack_log(RC_COMMENT, " uri: '%s'", location->uri);
if (location->authNameID.ptr != NULL)
whack_log(RC_COMMENT, " uri: '%s'", location->uri);
if (location->authNameID.ptr)
{
datatot(location->authNameID.ptr, location->authNameID.len, ':'
, buf, BUF_LEN);
whack_log(RC_COMMENT, " authname: %s", buf);
whack_log(RC_COMMENT, " authname: %s", buf);
}
if (location->authKeyID.ptr != NULL)
if (location->authKeyID.ptr)
{
datatot(location->authKeyID.ptr, location->authKeyID.len, ':'
, buf, BUF_LEN);
whack_log(RC_COMMENT, " authkey: %s", buf);
whack_log(RC_COMMENT, " authkey: %s", buf);
}
while (certinfo != NULL)
while (certinfo)
{
char thisUpdate[BUF_LEN];
snprintf(thisUpdate, BUF_LEN, "%T", &certinfo->thisUpdate, utc);
if (requests)
{
whack_log(RC_COMMENT, "%s, trials: %d", thisUpdate
, certinfo->trials);
whack_log(RC_COMMENT, " serial: %#B, %d trials",
&certinfo->serialNumber, certinfo->trials);
}
else if (certinfo->once)
{
whack_log(RC_COMMENT, "%s, onetime use%s", thisUpdate
, (certinfo->nextUpdate < time(NULL))? " (expired)": "");
whack_log(RC_COMMENT, " serial: %#B, %s, once%s",
&certinfo->serialNumber,
cert_status_names[certinfo->status],
(certinfo->nextUpdate < time(NULL))? " (expired)": "");
}
else
{
whack_log(RC_COMMENT, "%s, until %T %s", thisUpdate
, &certinfo->nextUpdate, utc
, check_expiry(certinfo->nextUpdate, OCSP_WARNING_INTERVAL, strict));
whack_log(RC_COMMENT, " serial: %#B, %s, until %T %s",
&certinfo->serialNumber,
cert_status_names[certinfo->status],
&certinfo->nextUpdate, utc,
check_expiry(certinfo->nextUpdate, OCSP_WARNING_INTERVAL, strict));
}
datatot(certinfo->serialNumber.ptr, certinfo->serialNumber.len, ':'
, buf, BUF_LEN);
whack_log(RC_COMMENT, " serial: %s, %s", buf
, cert_status_names[certinfo->status]);
certinfo = certinfo->next;
}
}
@@ -1155,7 +1151,6 @@ static bool parse_basic_ocsp_response(chunk_t blob, int level0, response_t *res)
free_x509cert(cert);
break;
}
time(&cert->installed);
x509 = (x509_t*)cert->cert;
if ((x509->get_flags(x509) & X509_OCSP_SIGNER) &&
+6 -9
View File
@@ -97,7 +97,6 @@ static pgpcert_t *pgpcerts = NULL;
const pgpcert_t pgpcert_empty = {
NULL , /* next */
0 , /* version */
0 , /* installed */
0 , /* count */
{ NULL, 0 }, /* certificate */
0 , /* created */
@@ -309,7 +308,6 @@ bool parse_pgp(chunk_t blob, pgpcert_t *cert)
/* parse a PGP certificate file */
cert->certificate = blob;
time(&cert->installed);
while (blob.len > 0)
{
@@ -479,8 +477,7 @@ void list_pgp_end_certs(bool utc)
if (cert != NULL)
{
whack_log(RC_COMMENT, " ");
whack_log(RC_COMMENT, "List of PGP End certificates:");
whack_log(RC_COMMENT, " ");
whack_log(RC_COMMENT, "List of PGP End Entity Certificates:");
}
while (cert != NULL)
@@ -492,10 +489,10 @@ void list_pgp_end_certs(bool utc)
c.type = CERT_PGP;
c.u.pgp = cert;
whack_log(RC_COMMENT, "%T, count: %d", &cert->installed, utc, cert->count);
whack_log(RC_COMMENT, " digest: %Y", cert->fingerprint);
whack_log(RC_COMMENT, " created: %T", &cert->created, utc);
whack_log(RC_COMMENT, " until: %T %s", &cert->until, utc,
whack_log(RC_COMMENT, " ");
whack_log(RC_COMMENT, " digest: %Y", cert->fingerprint);
whack_log(RC_COMMENT, " created: %T", &cert->created, utc);
whack_log(RC_COMMENT, " until: %T %s", &cert->until, utc,
check_expiry(cert->until, CA_CERT_WARNING_INTERVAL, TRUE));
whack_log(RC_COMMENT, " pubkey: %N %4d bits%s",
key_type_names, key->get_type(key),
@@ -503,7 +500,7 @@ void list_pgp_end_certs(bool utc)
has_private_key(c)? ", has private key" : "");
if (key->get_fingerprint(key, KEY_ID_PUBKEY_INFO_SHA1, &keyid))
{
whack_log(RC_COMMENT, " keyid: %#B", &keyid);
whack_log(RC_COMMENT, " keyid: %#B", &keyid);
}
cert = cert->next;
}
-1
View File
@@ -35,7 +35,6 @@ typedef struct pgpcert pgpcert_t;
struct pgpcert {
pgpcert_t *next;
int version;
time_t installed;
int count;
chunk_t certificate;
time_t created;
-1
View File
@@ -263,7 +263,6 @@ bool pkcs7_parse_signedData(chunk_t blob, contentInfo_t *data, x509cert_t **cert
BUILD_END);
if (newcert->cert)
{
time(&newcert->installed);
newcert->next = *cert;
*cert = newcert;
}
+11 -15
View File
@@ -124,7 +124,6 @@ static const asn1Object_t otherNameObjects[] = {
const x509cert_t empty_x509cert = {
NULL , /* cert */
NULL , /* *next */
UNDEFINED_TIME, /* installed */
0 , /* count */
FALSE /* smartcard */
};
@@ -1491,32 +1490,29 @@ void list_x509cert_chain(const char *caption, x509cert_t* cert,
{
whack_log(RC_COMMENT, " ");
whack_log(RC_COMMENT, "List of X.509 %s Certificates:", caption);
whack_log(RC_COMMENT, " ");
first = FALSE;
}
whack_log(RC_COMMENT, "%T, count: %d", &cert->installed, utc,
cert->count);
whack_log(RC_COMMENT, " subject: '%Y'",
whack_log(RC_COMMENT, " ");
whack_log(RC_COMMENT, " subject: \"%Y\"",
certificate->get_subject(certificate));
whack_log(RC_COMMENT, " issuer: '%Y'",
whack_log(RC_COMMENT, " issuer: \"%Y\"",
certificate->get_issuer(certificate));
serial = x509->get_serial(x509);
whack_log(RC_COMMENT, " serial: %#B", &serial);
whack_log(RC_COMMENT, " serial: %#B", &serial);
/* list validity */
certificate->get_validity(certificate, &now, &notBefore, &notAfter);
whack_log(RC_COMMENT, " validity: not before %T %s",
whack_log(RC_COMMENT, " validity: not before %T %s",
&notBefore, utc,
(notBefore < now)?"ok":"fatal (not valid yet)");
whack_log(RC_COMMENT, " not after %T %s",
whack_log(RC_COMMENT, " not after %T %s",
&notAfter, utc,
check_expiry(notAfter, CA_CERT_WARNING_INTERVAL, TRUE));
key = certificate->get_public_key(certificate);
if (key);
{
whack_log(RC_COMMENT, " pubkey: %N %4d bits%s",
whack_log(RC_COMMENT, " pubkey: %N %4d bits%s",
key_type_names, key->get_type(key),
key->get_keysize(key) * BITS_PER_BYTE,
cert->smartcard ? ", on smartcard" :
@@ -1524,11 +1520,11 @@ void list_x509cert_chain(const char *caption, x509cert_t* cert,
if (key->get_fingerprint(key, KEY_ID_PUBKEY_INFO_SHA1, &keyid))
{
whack_log(RC_COMMENT, " keyid: %#B", &keyid);
whack_log(RC_COMMENT, " keyid: %#B", &keyid);
}
if (key->get_fingerprint(key, KEY_ID_PUBKEY_SHA1, &subjkey))
{
whack_log(RC_COMMENT, " subjkey: %#B", &subjkey);
whack_log(RC_COMMENT, " subjkey: %#B", &subjkey);
}
key->destroy(key);
}
@@ -1537,7 +1533,7 @@ void list_x509cert_chain(const char *caption, x509cert_t* cert,
authkey = x509->get_authKeyIdentifier(x509);
if (authkey.ptr)
{
whack_log(RC_COMMENT, " authkey: %#B", &authkey);
whack_log(RC_COMMENT, " authkey: %#B", &authkey);
}
}
cert = cert->next;
@@ -1549,5 +1545,5 @@ void list_x509cert_chain(const char *caption, x509cert_t* cert,
*/
void list_x509_end_certs(bool utc)
{
list_x509cert_chain("End", x509certs, X509_NONE, utc);
list_x509cert_chain("End Entity", x509certs, X509_NONE, utc);
}
-1
View File
@@ -55,7 +55,6 @@ typedef struct x509cert x509cert_t;
struct x509cert {
certificate_t *cert;
x509cert_t *next;
time_t installed;
int count;
bool smartcard;
};