Files
strongswan-ext/src/libstrongswan/crypto/certinfo.c
T

213 lines
4.8 KiB
C

/**
* @file certinfo.c
*
* @brief Implementation of certinfo_t.
*
*/
/*
* Copyright (C) 2006 Andreas Steffen
* Hochschule fuer Technik Rapperswil
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at your
* option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* for more details.
*/
#include <time.h>
#include <types.h>
#include <definitions.h>
#include "certinfo.h"
typedef struct private_certinfo_t private_certinfo_t;
/**
* Private data of a certinfo_t object.
*/
struct private_certinfo_t {
/**
* Public interface for this certificate status information object.
*/
certinfo_t public;
/**
* Serial number of the certificate
*/
chunk_t serialNumber;
/**
* Certificate status
*/
cert_status_t status;
/**
* Time when the certificate status info was generated
*/
time_t thisUpdate;
/**
* Time when an updated certifcate status info will be available
*/
time_t nextUpdate;
/**
* Time of certificate revocation
*/
time_t revocationTime;
/**
* Reason of certificate revocation
*/
crl_reason_t revocationReason;
};
/**
* RFC 2560 OCSP - certificate status
*/
static const char *const cert_status_name[] = {
"good",
"revoked",
"unknown",
"unknown",
"untrusted"
};
enum_names cert_status_names =
{ CERT_GOOD, CERT_UNTRUSTED, cert_status_name, NULL};
/**
* RFC 2459 CRL reason codes
*/
static const char *const crl_reason_name[] = {
"unspecified",
"key compromise",
"ca compromise",
"affiliation changed",
"superseded",
"cessation of operation",
"certificate hold",
"reason #7",
"remove from crl"
};
enum_names crl_reason_names =
{ REASON_UNSPECIFIED, REASON_REMOVE_FROM_CRL, crl_reason_name, NULL};
/**
* Implements certinfo_t.get_serialNumber
*/
static chunk_t get_serialNumber(const private_certinfo_t *this)
{
return this->serialNumber;
}
/**
* Implements certinfo_t.set_status
*/
static void set_status(private_certinfo_t *this, cert_status_t status)
{
this->status = status;
}
/**
* Implements certinfo_t.get_status
*/
static cert_status_t get_status(const private_certinfo_t *this)
{
return this->status;
}
/**
* Implements certinfo_t.set_nextUpdate
*/
static void set_nextUpdate(private_certinfo_t *this, time_t nextUpdate)
{
this->nextUpdate = nextUpdate;
}
/**
* Implements certinfo_t.get_nextUpdate
*/
static time_t get_nextUpdate(const private_certinfo_t *this)
{
return this->nextUpdate;
}
/**
* Implements certinfo_t.set_revocationTime
*/
static void set_revocationTime(private_certinfo_t *this, time_t revocationTime)
{
this->revocationTime = revocationTime;
}
/**
* Implements certinfo_t.get_revocationTime
*/
static time_t get_revocationTime(const private_certinfo_t *this)
{
return this->revocationTime;
}
/**
* Implements certinfo_t.set_revocationReason
*/
static void set_revocationReason(private_certinfo_t *this, crl_reason_t reason)
{
this->revocationReason = reason;
}
/**
* Implements certinfo_t.get_revocationReason
*/
static const char *get_revocationReason(const private_certinfo_t *this)
{
return enum_name(&crl_reason_names, this->revocationReason);
}
/**
* Implements certinfo_t.destroy
*/
static void destroy(private_certinfo_t *this)
{
free(this->serialNumber.ptr);
free(this);
}
/*
* Described in header.
*/
certinfo_t *certinfo_create(chunk_t serial)
{
private_certinfo_t *this = malloc_thing(private_certinfo_t);
/* initialize */
this->serialNumber = chunk_clone(serial);
this->status = CERT_UNDEFINED;
this->nextUpdate = UNDEFINED_TIME;
this->revocationTime = UNDEFINED_TIME;
this->revocationReason = REASON_UNSPECIFIED;
/* public functions */
this->public.get_serialNumber = (chunk_t (*) (const certinfo_t*))get_serialNumber;
this->public.set_status = (void (*) (certinfo_t*,cert_status_t))set_status;
this->public.get_status = (cert_status_t (*) (const certinfo_t*))get_status;
this->public.set_nextUpdate = (void (*) (certinfo_t*,time_t))set_nextUpdate;
this->public.get_nextUpdate = (time_t (*) (const certinfo_t*))get_nextUpdate;
this->public.set_revocationTime = (void (*) (certinfo_t*,time_t))set_revocationTime;
this->public.get_revocationTime = (time_t (*) (const certinfo_t*))get_revocationTime;
this->public.set_revocationReason = (void (*) (certinfo_t*, crl_reason_t))set_revocationReason;
this->public.get_revocationReason = (const char *(*) (const certinfo_t*))get_revocationReason;
this->public.destroy = (void (*) (certinfo_t*))destroy;
return &this->public;
}