2 * Copyright (C) 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
16 #include "pubkey_cert.h"
20 typedef struct private_pubkey_cert_t private_pubkey_cert_t
;
23 * private data of pubkey_cert
25 struct private_pubkey_cert_t
{
38 * dummy issuer id, ID_ANY
40 identification_t
*issuer
;
43 * subject, ID_KEY_ID of the public key
45 identification_t
*subject
;
53 METHOD(certificate_t
, get_type
, certificate_type_t
,
54 private_pubkey_cert_t
*this)
56 return CERT_TRUSTED_PUBKEY
;
59 METHOD(certificate_t
, get_subject
, identification_t
*,
60 private_pubkey_cert_t
*this)
65 METHOD(certificate_t
, get_issuer
, identification_t
*,
66 private_pubkey_cert_t
*this)
71 METHOD(certificate_t
, has_subject
, id_match_t
,
72 private_pubkey_cert_t
*this, identification_t
*subject
)
74 if (subject
->get_type(subject
) == ID_KEY_ID
)
76 cred_encoding_type_t type
;
79 for (type
= 0; type
< CRED_ENCODING_MAX
; type
++)
81 if (this->key
->get_fingerprint(this->key
, type
, &fingerprint
) &&
82 chunk_equals(fingerprint
, subject
->get_encoding(subject
)))
84 return ID_MATCH_PERFECT
;
91 METHOD(certificate_t
, has_issuer
, id_match_t
,
92 private_pubkey_cert_t
*this, identification_t
*issuer
)
97 METHOD(certificate_t
, equals
, bool,
98 private_pubkey_cert_t
*this, certificate_t
*other
)
100 public_key_t
*other_key
;
102 other_key
= other
->get_public_key(other
);
105 if (public_key_equals(this->key
, other_key
))
107 other_key
->destroy(other_key
);
110 other_key
->destroy(other_key
);
115 METHOD(certificate_t
, issued_by
, bool,
116 private_pubkey_cert_t
*this, certificate_t
*issuer
)
118 return equals(this, issuer
);
121 METHOD(certificate_t
, get_public_key
, public_key_t
*,
122 private_pubkey_cert_t
*this)
124 this->key
->get_ref(this->key
);
128 METHOD(certificate_t
, get_validity
, bool,
129 private_pubkey_cert_t
*this, time_t *when
, time_t *not_before
,
143 METHOD(certificate_t
, get_encoding
, bool,
144 private_pubkey_cert_t
*this, cred_encoding_type_t type
, chunk_t
*encoding
)
146 return this->key
->get_encoding(this->key
, type
, encoding
);
149 METHOD(certificate_t
, get_ref
, certificate_t
*,
150 private_pubkey_cert_t
*this)
153 return &this->public.interface
;
156 METHOD(certificate_t
, destroy
, void,
157 private_pubkey_cert_t
*this)
159 if (ref_put(&this->ref
))
161 this->subject
->destroy(this->subject
);
162 this->issuer
->destroy(this->issuer
);
163 this->key
->destroy(this->key
);
171 static pubkey_cert_t
*pubkey_cert_create(public_key_t
*key
)
173 private_pubkey_cert_t
*this;
179 .get_type
= _get_type
,
180 .get_subject
= _get_subject
,
181 .get_issuer
= _get_issuer
,
182 .has_subject
= _has_subject
,
183 .has_issuer
= _has_issuer
,
184 .issued_by
= _issued_by
,
185 .get_public_key
= _get_public_key
,
186 .get_validity
= _get_validity
,
187 .get_encoding
= _get_encoding
,
195 .issuer
= identification_create_from_encoding(ID_ANY
, chunk_empty
),
198 if (key
->get_fingerprint(key
, KEYID_PUBKEY_INFO_SHA1
, &fingerprint
))
200 this->subject
= identification_create_from_encoding(ID_KEY_ID
, fingerprint
);
204 this->subject
= identification_create_from_encoding(ID_ANY
, chunk_empty
);
207 return &this->public;
213 pubkey_cert_t
*pubkey_cert_wrap(certificate_type_t type
, va_list args
)
215 public_key_t
*key
= NULL
;
216 chunk_t blob
= chunk_empty
;
220 switch (va_arg(args
, builder_part_t
))
222 case BUILD_BLOB_ASN1_DER
:
223 blob
= va_arg(args
, chunk_t
);
225 case BUILD_PUBLIC_KEY
:
226 key
= va_arg(args
, public_key_t
*);
241 key
= lib
->creds
->create(lib
->creds
, CRED_PUBLIC_KEY
, KEY_ANY
,
242 BUILD_BLOB_ASN1_DER
, blob
, BUILD_END
);
246 return pubkey_cert_create(key
);