Annotation of embedaddon/strongswan/src/libcharon/plugins/certexpire/certexpire_listener.c, revision 1.1.1.1
1.1 misho 1: /*
2: * Copyright (C) 2011 Martin Willi
3: * Copyright (C) 2011 revosec AG
4: *
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>.
9: *
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
13: * for more details.
14: */
15:
16: #include "certexpire_listener.h"
17:
18: #include <daemon.h>
19:
20: typedef struct private_certexpire_listener_t private_certexpire_listener_t;
21:
22: /**
23: * Private data of an certexpire_listener_t object.
24: */
25: struct private_certexpire_listener_t {
26:
27: /**
28: * Public certexpire_listener_t interface.
29: */
30: certexpire_listener_t public;
31:
32: /**
33: * Export facility
34: */
35: certexpire_export_t *export;
36: };
37:
38: METHOD(listener_t, authorize, bool,
39: private_certexpire_listener_t *this, ike_sa_t *ike_sa,
40: bool final, bool *success)
41: {
42: enumerator_t *rounds, *enumerator;
43: certificate_t *cert, *ca = NULL;
44: linked_list_t *trustchain;
45: auth_cfg_t *auth;
46: auth_rule_t rule;
47:
48: /* Check all rounds in final hook, as local authentication data are
49: * not completely available after round-invocation. */
50: if (!final)
51: {
52: return TRUE;
53: }
54:
55: /* collect local certificates */
56: trustchain = linked_list_create();
57: rounds = ike_sa->create_auth_cfg_enumerator(ike_sa, TRUE);
58: while (rounds->enumerate(rounds, &auth))
59: {
60: cert = auth->get(auth, AUTH_RULE_SUBJECT_CERT);
61: if (cert)
62: {
63: trustchain->insert_last(trustchain, cert);
64:
65: enumerator = auth->create_enumerator(auth);
66: while (enumerator->enumerate(enumerator, &rule, &cert))
67: {
68: if (rule == AUTH_RULE_IM_CERT)
69: {
70: trustchain->insert_last(trustchain, cert);
71: }
72: if (rule == AUTH_RULE_CA_CERT)
73: {
74: /* the last CA cert is the one used in the trustchain.
75: * Previous CA certificates have been received as cert
76: * requests. */
77: ca = cert;
78: }
79: }
80: enumerator->destroy(enumerator);
81: if (ca)
82: {
83: trustchain->insert_last(trustchain, ca);
84: }
85: }
86: }
87: rounds->destroy(rounds);
88: this->export->add(this->export, trustchain, TRUE);
89: trustchain->destroy(trustchain);
90:
91: /* collect remote certificates */
92: trustchain = linked_list_create();
93: rounds = ike_sa->create_auth_cfg_enumerator(ike_sa, FALSE);
94: while (rounds->enumerate(rounds, &auth))
95: {
96: cert = auth->get(auth, AUTH_RULE_SUBJECT_CERT);
97: if (cert)
98: {
99: trustchain->insert_last(trustchain, cert);
100:
101: enumerator = auth->create_enumerator(auth);
102: while (enumerator->enumerate(enumerator, &rule, &cert))
103: {
104: if (rule == AUTH_RULE_IM_CERT)
105: {
106: trustchain->insert_last(trustchain, cert);
107: }
108: }
109: enumerator->destroy(enumerator);
110:
111: cert = auth->get(auth, AUTH_RULE_CA_CERT);
112: if (cert)
113: {
114: trustchain->insert_last(trustchain, cert);
115: }
116: }
117: }
118: rounds->destroy(rounds);
119: this->export->add(this->export, trustchain, FALSE);
120: trustchain->destroy(trustchain);
121: return TRUE;
122: }
123:
124: METHOD(certexpire_listener_t, destroy, void,
125: private_certexpire_listener_t *this)
126: {
127: free(this);
128: }
129:
130: /**
131: * See header
132: */
133: certexpire_listener_t *certexpire_listener_create(certexpire_export_t *export)
134: {
135: private_certexpire_listener_t *this;
136:
137: INIT(this,
138: .public = {
139: .listener = {
140: .authorize = _authorize,
141: },
142: .destroy = _destroy,
143: },
144: .export = export,
145: );
146:
147: return &this->public;
148: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>