Annotation of embedaddon/strongswan/src/libtnccs/plugins/tnccs_dynamic/tnccs_dynamic.c, revision 1.1.1.1
1.1 misho 1: /*
2: * Copyright (C) 2011-2015 Andreas Steffen
3: * HSR Hochschule fuer Technik Rapperswil
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 "tnccs_dynamic.h"
17:
18: #include <tnc/tnc.h>
19:
20: #include <utils/debug.h>
21:
22: typedef struct private_tnccs_dynamic_t private_tnccs_dynamic_t;
23:
24: /**
25: * Private data of a tnccs_dynamic_t object.
26: */
27: struct private_tnccs_dynamic_t {
28:
29: /**
30: * Public tnccs_t interface.
31: */
32: tnccs_t public;
33:
34: /**
35: * Server identity
36: */
37: identification_t *server_id;
38:
39: /**
40: * Client identity
41: */
42: identification_t *peer_id;
43:
44: /**
45: * Server IP address
46: */
47: host_t *server_ip;
48:
49: /**
50: * Client IP address
51: */
52: host_t *peer_ip;
53:
54: /**
55: * Detected TNC IF-TNCCS stack
56: */
57: tls_t *tls;
58:
59: /**
60: * Underlying TNC IF-T transport protocol
61: */
62: tnc_ift_type_t transport;
63:
64: /**
65: * Type of TNC client authentication
66: */
67: uint32_t auth_type;
68:
69: /**
70: * Callback function to communicate recommendation (TNC Server only)
71: */
72: tnccs_cb_t callback;
73:
74: /**
75: * reference count
76: */
77: refcount_t ref;
78:
79: };
80:
81: /**
82: * Determine the version of the IF-TNCCS protocol used by analyzing the first
83: * byte of the TNCCS batch received from a TNC Client according to the rules
84: * defined by section 3.5 "Interoperability with older IF-TNCCS versions" of
85: * the TCG TNC IF-TNCCS TLV Bindings Version 2.0 standard.
86: */
87: tnccs_type_t determine_tnccs_protocol(char version)
88: {
89: switch (version)
90: {
91: case '\t':
92: case '\n':
93: case '\r':
94: case ' ':
95: case '<':
96: return TNCCS_1_1;
97: case 0x00:
98: return TNCCS_SOH;
99: case 0x02:
100: return TNCCS_2_0;
101: default:
102: return TNCCS_UNKNOWN;
103: }
104: }
105:
106: METHOD(tls_t, process, status_t,
107: private_tnccs_dynamic_t *this, void *buf, size_t buflen)
108: {
109: tnccs_type_t type;
110: tnccs_t *tnccs;
111:
112: if (!this->tls)
113: {
114: if (buflen == 0)
115: {
116: return FAILED;
117: }
118: type = determine_tnccs_protocol(*(char*)buf);
119: DBG1(DBG_TNC, "%N protocol detected dynamically",
120: tnccs_type_names, type);
121: tnccs = tnc->tnccs->create_instance(tnc->tnccs, type, TRUE,
122: this->server_id, this->peer_id, this->server_ip,
123: this->peer_ip, this->transport, this->callback);
124: if (!tnccs)
125: {
126: DBG1(DBG_TNC, "N% protocol not supported", tnccs_type_names, type);
127: return FAILED;
128: }
129: tnccs->set_auth_type(tnccs, this->auth_type);
130: this->tls = &tnccs->tls;
131: }
132: return this->tls->process(this->tls, buf, buflen);
133: }
134:
135: METHOD(tls_t, build, status_t,
136: private_tnccs_dynamic_t *this, void *buf, size_t *buflen, size_t *msglen)
137: {
138: return this->tls->build(this->tls, buf, buflen, msglen);
139: }
140:
141: METHOD(tls_t, is_server, bool,
142: private_tnccs_dynamic_t *this)
143: {
144: return TRUE;
145: }
146:
147: METHOD(tls_t, get_server_id, identification_t*,
148: private_tnccs_dynamic_t *this)
149: {
150: return this->server_id;
151: }
152:
153: METHOD(tls_t, set_peer_id, void,
154: private_tnccs_dynamic_t *this, identification_t *id)
155: {
156: DESTROY_IF(this->peer_id);
157: this->peer_id = id->clone(id);
158: if (this->tls)
159: {
160: this->tls->set_peer_id(this->tls, id);
161: }
162: }
163:
164: METHOD(tls_t, get_peer_id, identification_t*,
165: private_tnccs_dynamic_t *this)
166: {
167: return this->peer_id;
168: }
169:
170: METHOD(tls_t, get_purpose, tls_purpose_t,
171: private_tnccs_dynamic_t *this)
172: {
173: return TLS_PURPOSE_EAP_TNC;
174: }
175:
176: METHOD(tls_t, is_complete, bool,
177: private_tnccs_dynamic_t *this)
178: {
179: return this->tls ? this->tls->is_complete(this->tls) : FALSE;
180: }
181:
182: METHOD(tls_t, get_eap_msk, chunk_t,
183: private_tnccs_dynamic_t *this)
184: {
185: return chunk_empty;
186: }
187:
188: METHOD(tls_t, destroy, void,
189: private_tnccs_dynamic_t *this)
190: {
191: if (ref_put(&this->ref))
192: {
193: DESTROY_IF(this->tls);
194: this->server_id->destroy(this->server_id);
195: this->peer_id->destroy(this->peer_id);
196: this->server_ip->destroy(this->server_ip);
197: this->peer_ip->destroy(this->peer_ip);
198: free(this);
199: }
200: }
201:
202: METHOD(tnccs_t, get_server_ip, host_t*,
203: private_tnccs_dynamic_t *this)
204: {
205: return this->server_ip;
206: }
207:
208: METHOD(tnccs_t, get_peer_ip, host_t*,
209: private_tnccs_dynamic_t *this)
210: {
211: return this->peer_ip;
212: }
213:
214: METHOD(tnccs_t, get_transport, tnc_ift_type_t,
215: private_tnccs_dynamic_t *this)
216: {
217: return this->transport;
218: }
219:
220: METHOD(tnccs_t, set_transport, void,
221: private_tnccs_dynamic_t *this, tnc_ift_type_t transport)
222: {
223: this->transport = transport;
224: }
225:
226: METHOD(tnccs_t, get_auth_type, uint32_t,
227: private_tnccs_dynamic_t *this)
228: {
229: return this->auth_type;
230: }
231:
232: METHOD(tnccs_t, set_auth_type, void,
233: private_tnccs_dynamic_t *this, uint32_t auth_type)
234: {
235: this->auth_type = auth_type;
236: }
237:
238: METHOD(tnccs_t, get_pdp_server, chunk_t,
239: private_tnccs_dynamic_t *this, uint16_t *port)
240: {
241: tnccs_t *tnccs = (tnccs_t*)this->tls;
242:
243: return tnccs->get_pdp_server(tnccs, port);
244: }
245:
246: METHOD(tnccs_t, get_ref, tnccs_t*,
247: private_tnccs_dynamic_t *this)
248: {
249: ref_get(&this->ref);
250: return &this->public;
251: }
252:
253: /**
254: * See header
255: */
256: tnccs_t* tnccs_dynamic_create(bool is_server, identification_t *server_id,
257: identification_t *peer_id, host_t *server_ip,
258: host_t *peer_ip, tnc_ift_type_t transport,
259: tnccs_cb_t cb)
260: {
261: private_tnccs_dynamic_t *this;
262:
263: INIT(this,
264: .public = {
265: .tls = {
266: .process = _process,
267: .build = _build,
268: .is_server = _is_server,
269: .get_server_id = _get_server_id,
270: .set_peer_id = _set_peer_id,
271: .get_peer_id = _get_peer_id,
272: .get_purpose = _get_purpose,
273: .is_complete = _is_complete,
274: .get_eap_msk = _get_eap_msk,
275: .destroy = _destroy,
276: },
277: .get_server_ip = _get_server_ip,
278: .get_peer_ip = _get_peer_ip,
279: .get_transport = _get_transport,
280: .set_transport = _set_transport,
281: .get_auth_type = _get_auth_type,
282: .set_auth_type = _set_auth_type,
283: .get_pdp_server = _get_pdp_server,
284: .get_ref = _get_ref,
285: },
286: .server_id = server_id->clone(server_id),
287: .peer_id = peer_id->clone(peer_id),
288: .server_ip = server_ip->clone(server_ip),
289: .peer_ip = peer_ip->clone(peer_ip),
290: .transport = transport,
291: .callback = cb,
292: .ref = 1,
293: );
294:
295: return &this->public;
296: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>