Annotation of embedaddon/strongswan/src/libimcv/tcg/pts/tcg_pts_attr_req_file_meas.c, revision 1.1.1.1
1.1 misho 1: /*
2: * Copyright (C) 2011-2012 Sansar Choinyambuu
3: * Copyright (C) 2011-2014 Andreas Steffen
4: * HSR Hochschule fuer Technik Rapperswil
5: *
6: * This program is free software; you can redistribute it and/or modify it
7: * under the terms of the GNU General Public License as published by the
8: * Free Software Foundation; either version 2 of the License, or (at your
9: * option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>.
10: *
11: * This program is distributed in the hope that it will be useful, but
12: * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
13: * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14: * for more details.
15: */
16:
17: #define _GNU_SOURCE /* for stdndup() */
18: #include <string.h>
19:
20: #include "tcg_pts_attr_req_file_meas.h"
21:
22: #include <pa_tnc/pa_tnc_msg.h>
23: #include <bio/bio_writer.h>
24: #include <bio/bio_reader.h>
25: #include <utils/debug.h>
26:
27: typedef struct private_tcg_pts_attr_req_file_meas_t private_tcg_pts_attr_req_file_meas_t;
28:
29: /**
30: * Request File Measurement
31: * see section 3.19.1 of PTS Protocol: Binding to TNC IF-M Specification
32: *
33: * 1 2 3
34: * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
35: * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
36: * | Flags | Reserved | Request ID |
37: * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
38: * | Delimiter |
39: * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
40: * ~ Fully Qualified File Pathname (Variable Length) ~
41: * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
42: */
43:
44: #define PTS_REQ_FILE_MEAS_SIZE 8
45: #define PTS_REQ_FILE_MEAS_RESERVED 0x00
46: #define PTS_REQ_FILE_MEAS_NO_FLAGS 0x00
47:
48: #define DIRECTORY_CONTENTS_FLAG (1<<7)
49:
50: /**
51: * Private data of an tcg_pts_attr_req_file_meas_t object.
52: */
53: struct private_tcg_pts_attr_req_file_meas_t {
54:
55: /**
56: * Public members of tcg_pts_attr_req_file_meas_t
57: */
58: tcg_pts_attr_req_file_meas_t public;
59:
60: /**
61: * Vendor-specific attribute type
62: */
63: pen_type_t type;
64:
65: /**
66: * Length of attribute value
67: */
68: size_t length;
69:
70: /**
71: * Attribute value or segment
72: */
73: chunk_t value;
74:
75: /**
76: * Noskip flag
77: */
78: bool noskip_flag;
79:
80: /**
81: * Directory Contents flag
82: */
83: bool directory_flag;
84:
85: /**
86: * Request ID
87: */
88: uint16_t request_id;
89:
90: /**
91: * UTF8 Encoding of Delimiter Character
92: */
93: uint32_t delimiter;
94:
95: /**
96: * Fully Qualified File Pathname
97: */
98: char *pathname;
99:
100: /**
101: * Reference count
102: */
103: refcount_t ref;
104: };
105:
106: METHOD(pa_tnc_attr_t, get_type, pen_type_t,
107: private_tcg_pts_attr_req_file_meas_t *this)
108: {
109: return this->type;
110: }
111:
112: METHOD(pa_tnc_attr_t, get_value, chunk_t,
113: private_tcg_pts_attr_req_file_meas_t *this)
114: {
115: return this->value;
116: }
117:
118: METHOD(pa_tnc_attr_t, get_noskip_flag, bool,
119: private_tcg_pts_attr_req_file_meas_t *this)
120: {
121: return this->noskip_flag;
122: }
123:
124: METHOD(pa_tnc_attr_t, set_noskip_flag,void,
125: private_tcg_pts_attr_req_file_meas_t *this, bool noskip)
126: {
127: this->noskip_flag = noskip;
128: }
129:
130: METHOD(pa_tnc_attr_t, build, void,
131: private_tcg_pts_attr_req_file_meas_t *this)
132: {
133: uint8_t flags = PTS_REQ_FILE_MEAS_NO_FLAGS;
134: chunk_t pathname;
135: bio_writer_t *writer;
136:
137: if (this->value.ptr)
138: {
139: return;
140: }
141: if (this->directory_flag)
142: {
143: flags |= DIRECTORY_CONTENTS_FLAG;
144: }
145: pathname = chunk_create(this->pathname, strlen(this->pathname));
146:
147: writer = bio_writer_create(PTS_REQ_FILE_MEAS_SIZE);
148: writer->write_uint8 (writer, flags);
149: writer->write_uint8 (writer, PTS_REQ_FILE_MEAS_RESERVED);
150: writer->write_uint16(writer, this->request_id);
151: writer->write_uint32(writer, this->delimiter);
152: writer->write_data (writer, pathname);
153: this->value = writer->extract_buf(writer);
154: this->length = this->value.len;
155: writer->destroy(writer);
156: }
157:
158: METHOD(pa_tnc_attr_t, process, status_t,
159: private_tcg_pts_attr_req_file_meas_t *this, uint32_t *offset)
160: {
161: bio_reader_t *reader;
162: uint8_t flags;
163: uint8_t reserved;
164: chunk_t pathname;
165:
166: *offset = 0;
167:
168: if (this->value.len < this->length)
169: {
170: return NEED_MORE;
171: }
172: if (this->value.len < PTS_REQ_FILE_MEAS_SIZE)
173: {
174: DBG1(DBG_TNC, "insufficient data for Request File Measurement");
175: return FAILED;
176: }
177:
178: reader = bio_reader_create(this->value);
179: reader->read_uint8 (reader, &flags);
180: reader->read_uint8 (reader, &reserved);
181: reader->read_uint16(reader, &this->request_id);
182: reader->read_uint32(reader, &this->delimiter);
183: reader->read_data (reader, reader->remaining(reader), &pathname);
184:
185: this->directory_flag = (flags & DIRECTORY_CONTENTS_FLAG) !=
186: PTS_REQ_FILE_MEAS_NO_FLAGS;
187: this->pathname = strndup(pathname.ptr, pathname.len);
188:
189: reader->destroy(reader);
190: return SUCCESS;
191: }
192:
193: METHOD(pa_tnc_attr_t, add_segment, void,
194: private_tcg_pts_attr_req_file_meas_t *this, chunk_t segment)
195: {
196: this->value = chunk_cat("mc", this->value, segment);
197: }
198:
199: METHOD(pa_tnc_attr_t, get_ref, pa_tnc_attr_t*,
200: private_tcg_pts_attr_req_file_meas_t *this)
201: {
202: ref_get(&this->ref);
203: return &this->public.pa_tnc_attribute;
204: }
205:
206: METHOD(pa_tnc_attr_t, destroy, void,
207: private_tcg_pts_attr_req_file_meas_t *this)
208: {
209: if (ref_put(&this->ref))
210: {
211: free(this->pathname);
212: free(this->value.ptr);
213: free(this);
214: }
215: }
216:
217: METHOD(tcg_pts_attr_req_file_meas_t, get_directory_flag, bool,
218: private_tcg_pts_attr_req_file_meas_t *this)
219: {
220: return this->directory_flag;
221: }
222:
223: METHOD(tcg_pts_attr_req_file_meas_t, get_request_id, uint16_t,
224: private_tcg_pts_attr_req_file_meas_t *this)
225: {
226: return this->request_id;
227: }
228:
229: METHOD(tcg_pts_attr_req_file_meas_t, get_delimiter, uint32_t,
230: private_tcg_pts_attr_req_file_meas_t *this)
231: {
232: return this->delimiter;
233: }
234:
235: METHOD(tcg_pts_attr_req_file_meas_t, get_pathname, char*,
236: private_tcg_pts_attr_req_file_meas_t *this)
237: {
238: return this->pathname;
239: }
240:
241: /**
242: * Described in header.
243: */
244: pa_tnc_attr_t *tcg_pts_attr_req_file_meas_create(bool directory_flag,
245: uint16_t request_id,
246: uint32_t delimiter,
247: char *pathname)
248: {
249: private_tcg_pts_attr_req_file_meas_t *this;
250:
251: INIT(this,
252: .public = {
253: .pa_tnc_attribute = {
254: .get_type = _get_type,
255: .get_value = _get_value,
256: .get_noskip_flag = _get_noskip_flag,
257: .set_noskip_flag = _set_noskip_flag,
258: .build = _build,
259: .process = _process,
260: .add_segment = _add_segment,
261: .get_ref = _get_ref,
262: .destroy = _destroy,
263: },
264: .get_directory_flag = _get_directory_flag,
265: .get_request_id = _get_request_id,
266: .get_delimiter = _get_delimiter,
267: .get_pathname = _get_pathname,
268: },
269: .type = { PEN_TCG, TCG_PTS_REQ_FILE_MEAS },
270: .directory_flag = directory_flag,
271: .request_id = request_id,
272: .delimiter = delimiter,
273: .pathname = strdup(pathname),
274: .ref = 1,
275: );
276:
277: return &this->public.pa_tnc_attribute;
278: }
279:
280:
281: /**
282: * Described in header.
283: */
284: pa_tnc_attr_t *tcg_pts_attr_req_file_meas_create_from_data(size_t length,
285: chunk_t data)
286: {
287: private_tcg_pts_attr_req_file_meas_t *this;
288:
289: INIT(this,
290: .public = {
291: .pa_tnc_attribute = {
292: .get_type = _get_type,
293: .get_value = _get_value,
294: .get_noskip_flag = _get_noskip_flag,
295: .set_noskip_flag = _set_noskip_flag,
296: .build = _build,
297: .process = _process,
298: .add_segment = _add_segment,
299: .get_ref = _get_ref,
300: .destroy = _destroy,
301: },
302: .get_directory_flag = _get_directory_flag,
303: .get_request_id = _get_request_id,
304: .get_delimiter = _get_delimiter,
305: .get_pathname = _get_pathname,
306: },
307: .type = { PEN_TCG, TCG_PTS_REQ_FILE_MEAS },
308: .length = length,
309: .value = chunk_clone(data),
310: .ref = 1,
311: );
312:
313: return &this->public.pa_tnc_attribute;
314: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>