Annotation of embedaddon/strongswan/src/libimcv/tcg/seg/tcg_seg_attr_next_seg.c, revision 1.1.1.1
1.1 misho 1: /*
2: * Copyright (C) 2014 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 "tcg_seg_attr_next_seg.h"
17:
18: #include <pa_tnc/pa_tnc_msg.h>
19: #include <bio/bio_writer.h>
20: #include <bio/bio_reader.h>
21: #include <utils/debug.h>
22:
23: typedef struct private_tcg_seg_attr_next_seg_t private_tcg_seg_attr_next_seg_t;
24:
25: typedef enum {
26: NEXT_SEG_FLAG_NONE = 0,
27: NEXT_SEG_FLAG_CANCEL = 1
28: } next_seg_flags_t;
29:
30: /**
31: * Next Segment
32: * see TCG IF-M Segmentation Specification
33: *
34: * 1 2 3
35: * 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
36: * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
37: * |C| Reserved | Base Attribute ID |
38: * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
39: */
40:
41: /**
42: * Private data of an tcg_seg_attr_next_seg_t object.
43: */
44: struct private_tcg_seg_attr_next_seg_t {
45:
46: /**
47: * Public members of tcg_seg_attr_next_seg_t
48: */
49: tcg_seg_attr_next_seg_t public;
50:
51: /**
52: * Vendor-specific attribute type
53: */
54: pen_type_t type;
55:
56: /**
57: * Length of attribute value
58: */
59: size_t length;
60:
61: /**
62: * Attribute value or segment
63: */
64: chunk_t value;
65:
66: /**
67: * Noskip flag
68: */
69: bool noskip_flag;
70:
71: /**
72: * Cancel flag
73: */
74: bool cancel_flag;
75:
76: /**
77: * Base Attribute ID
78: */
79: uint32_t base_attr_id;
80:
81: /**
82: * Reference count
83: */
84: refcount_t ref;
85: };
86:
87: METHOD(pa_tnc_attr_t, get_type, pen_type_t,
88: private_tcg_seg_attr_next_seg_t *this)
89: {
90: return this->type;
91: }
92:
93: METHOD(pa_tnc_attr_t, get_value, chunk_t,
94: private_tcg_seg_attr_next_seg_t *this)
95: {
96: return this->value;
97: }
98:
99: METHOD(pa_tnc_attr_t, get_noskip_flag, bool,
100: private_tcg_seg_attr_next_seg_t *this)
101: {
102: return this->noskip_flag;
103: }
104:
105: METHOD(pa_tnc_attr_t, set_noskip_flag,void,
106: private_tcg_seg_attr_next_seg_t *this, bool noskip)
107: {
108: this->noskip_flag = noskip;
109: }
110:
111: METHOD(pa_tnc_attr_t, build, void,
112: private_tcg_seg_attr_next_seg_t *this)
113: {
114: bio_writer_t *writer;
115:
116: if (this->value.ptr)
117: {
118: return;
119: }
120: writer = bio_writer_create(TCG_SEG_ATTR_NEXT_SEG_SIZE);
121: writer->write_uint8 (writer, this->cancel_flag ? NEXT_SEG_FLAG_CANCEL :
122: NEXT_SEG_FLAG_NONE);
123: writer->write_uint24(writer, this->base_attr_id);
124:
125: this->value = writer->extract_buf(writer);
126: this->length = this->value.len;
127: writer->destroy(writer);
128: }
129:
130: METHOD(pa_tnc_attr_t, process, status_t,
131: private_tcg_seg_attr_next_seg_t *this, uint32_t *offset)
132: {
133: bio_reader_t *reader;
134: uint8_t flags;
135:
136: *offset = 0;
137:
138: if (this->value.len < this->length)
139: {
140: DBG1(DBG_TNC, "segmentation not allowed for %N", tcg_attr_names,
141: this->type.type);
142: return FAILED;
143: }
144: if (this->value.len < TCG_SEG_ATTR_NEXT_SEG_SIZE)
145: {
146: DBG1(DBG_TNC, "insufficient data for %N", tcg_attr_names,
147: this->type.type);
148: return FAILED;
149: }
150: reader = bio_reader_create(this->value);
151: reader->read_uint8 (reader, &flags);
152: reader->read_uint24(reader, &this->base_attr_id);
153: reader->destroy(reader);
154:
155: this->cancel_flag = (flags & NEXT_SEG_FLAG_CANCEL);
156:
157: return SUCCESS;
158: }
159:
160: METHOD(pa_tnc_attr_t, add_segment, void,
161: private_tcg_seg_attr_next_seg_t *this, chunk_t segment)
162: {
163: this->value = chunk_cat("mc", this->value, segment);
164: }
165:
166: METHOD(pa_tnc_attr_t, get_ref, pa_tnc_attr_t*,
167: private_tcg_seg_attr_next_seg_t *this)
168: {
169: ref_get(&this->ref);
170: return &this->public.pa_tnc_attribute;
171: }
172:
173: METHOD(pa_tnc_attr_t, destroy, void,
174: private_tcg_seg_attr_next_seg_t *this)
175: {
176: if (ref_put(&this->ref))
177: {
178: free(this->value.ptr);
179: free(this);
180: }
181: }
182:
183: METHOD(tcg_seg_attr_next_seg_t, get_base_attr_id, uint32_t,
184: private_tcg_seg_attr_next_seg_t *this)
185: {
186: return this->base_attr_id;
187: }
188:
189: METHOD(tcg_seg_attr_next_seg_t, get_cancel_flag, bool,
190: private_tcg_seg_attr_next_seg_t *this)
191: {
192: return this->cancel_flag;
193: }
194:
195: /**
196: * Described in header.
197: */
198: pa_tnc_attr_t* tcg_seg_attr_next_seg_create(uint32_t base_attr_id, bool cancel)
199: {
200: private_tcg_seg_attr_next_seg_t *this;
201:
202: INIT(this,
203: .public = {
204: .pa_tnc_attribute = {
205: .get_type = _get_type,
206: .get_value = _get_value,
207: .get_noskip_flag = _get_noskip_flag,
208: .set_noskip_flag = _set_noskip_flag,
209: .build = _build,
210: .process = _process,
211: .add_segment = _add_segment,
212: .get_ref = _get_ref,
213: .destroy = _destroy,
214: },
215: .get_base_attr_id = _get_base_attr_id,
216: .get_cancel_flag = _get_cancel_flag,
217: },
218: .type = { PEN_TCG, TCG_SEG_NEXT_SEG_REQ },
219: .base_attr_id = base_attr_id,
220: .cancel_flag = cancel,
221: .ref = 1,
222: );
223:
224: return &this->public.pa_tnc_attribute;
225: }
226:
227: /**
228: * Described in header.
229: */
230: pa_tnc_attr_t *tcg_seg_attr_next_seg_create_from_data(size_t length,
231: chunk_t data)
232: {
233: private_tcg_seg_attr_next_seg_t *this;
234:
235: INIT(this,
236: .public = {
237: .pa_tnc_attribute = {
238: .get_type = _get_type,
239: .get_value = _get_value,
240: .get_noskip_flag = _get_noskip_flag,
241: .set_noskip_flag = _set_noskip_flag,
242: .build = _build,
243: .process = _process,
244: .add_segment = _add_segment,
245: .get_ref = _get_ref,
246: .destroy = _destroy,
247: },
248: .get_base_attr_id = _get_base_attr_id,
249: .get_cancel_flag = _get_cancel_flag,
250: },
251: .type = { PEN_TCG, TCG_SEG_NEXT_SEG_REQ },
252: .length = length,
253: .value = chunk_clone(data),
254: .ref = 1,
255: );
256:
257: return &this->public.pa_tnc_attribute;
258: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>