2 * Copyright (C) 2007-2008 Martin Willi
3 * Hochschule fuer Technik Rapperswil
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License as published by the
7 * Free Software Foundation; either version 2 of the License, or (at your
8 * option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>.
10 * This program is distributed in the hope that it will be useful, but
11 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
12 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
17 * @defgroup certificate certificate
18 * @{ @ingroup certificates
21 #ifndef CERTIFICATE_H_
22 #define CERTIFICATE_H_
24 typedef struct certificate_t certificate_t
;
25 typedef enum certificate_type_t certificate_type_t
;
26 typedef enum cert_validation_t cert_validation_t
;
29 #include <utils/identification.h>
30 #include <credentials/keys/public_key.h>
33 * Kind of a certificate_t
35 enum certificate_type_t
{
36 /** just any certificate */
38 /** X.509 certificate */
40 /** X.509 certificate revocation list */
42 /** X.509 online certificate status protocol request */
43 CERT_X509_OCSP_REQUEST
,
44 /** X.509 online certificate status protocol response */
45 CERT_X509_OCSP_RESPONSE
,
46 /** X.509 attribute certificate */
48 /** trusted, preinstalled public key */
50 /** PGP certificate */
52 /** Pluto cert_t (not a certificate_t), either x509 or PGP */
54 /** Pluto x509acert_t (not a certificate_t), attribute certificate */
56 /** Pluto x509crl_t (not a certificate_t), certificate revocation list */
61 * Enum names for certificate_type_t
63 extern enum_name_t
*certificate_type_names
;
66 * Result of a certificate validation.
68 * Order of values is relevant, sorted from good to bad.
70 enum cert_validation_t
{
71 /** certificate has been validated successfully */
73 /** validation has been skipped due to missing validation information */
75 /** certificate has been validated, but check based on stale information */
77 /** validation failed due to a processing error */
79 /** certificate has been revoked */
84 * Enum names for cert_validation_t
86 extern enum_name_t
*cert_validation_names
;
89 * An abstract certificate.
91 * A certificate designs a subject-issuer relationship. It may have an
92 * associated public key.
94 struct certificate_t
{
97 * Get the type of the certificate.
99 * @return certifcate type
101 certificate_type_t (*get_type
)(certificate_t
*this);
104 * Get the primary subject to which this certificate belongs.
106 * @return subject identity
108 identification_t
* (*get_subject
)(certificate_t
*this);
111 * Check if certificate contains a subject ID.
113 * A certificate may contain additional subject identifiers, which are
114 * not returned by get_subject (e.g. subjectAltNames)
116 * @param subject subject identity
117 * @return matching value of best match
119 id_match_t (*has_subject
)(certificate_t
*this, identification_t
*subject
);
122 * Get the issuer which signed this certificate.
124 * @return issuer identity
126 identification_t
* (*get_issuer
)(certificate_t
*this);
129 * Check if certificate contains an issuer ID.
131 * A certificate may contain additional issuer identifiers, which are
132 * not returned by get_issuer (e.g. issuerAltNames)
134 * @param subject isser identity
135 * @return matching value of best match
137 id_match_t (*has_issuer
)(certificate_t
*this, identification_t
*issuer
);
140 * Check if this certificate is issued and signed by a specific issuer.
142 * @param issuer issuer's certificate
143 * @return TRUE if certificate issued by issuer and trusted
145 bool (*issued_by
)(certificate_t
*this, certificate_t
*issuer
);
148 * Get the public key associated to this certificate.
150 * @return newly referenced public_key, NULL if none available
152 public_key_t
* (*get_public_key
)(certificate_t
*this);
155 * Check the lifetime of the certificate.
157 * @param when check validity at a certain time (NULL for now)
158 * @param not_before receives certificates start of lifetime
159 * @param not_after receives certificates end of lifetime
160 * @return TRUE if when between not_after and not_before
162 bool (*get_validity
)(certificate_t
*this, time_t *when
,
163 time_t *not_before
, time_t *not_after
);
166 * Is this newer than that?
168 * @return TRUE if newer, FALSE otherwise
170 bool (*is_newer
)(certificate_t
*this, certificate_t
*that
);
173 * Get the certificate in an encoded form.
175 * @return allocated chunk of encoded cert
177 chunk_t (*get_encoding
)(certificate_t
*this);
180 * Check if two certificates are equal.
182 * @param other certificate to compair against this
183 * @return TRUE if certificates are equal
185 bool (*equals
)(certificate_t
*this, certificate_t
*other
);
188 * Get a new reference to the certificate.
190 * @return this, with an increased refcount
192 certificate_t
* (*get_ref
)(certificate_t
*this);
195 * Destroy a certificate.
197 void (*destroy
)(certificate_t
*this);
200 #endif /** CERTIFICATE_H_ @}*/