2 * Copyright (C) 2014 Andreas Steffen
3 * HSR 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 "tcg_seg_attr_max_size.h"
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>
23 typedef struct private_tcg_seg_attr_max_size_t private_tcg_seg_attr_max_size_t
;
26 * Maximum Attribute Size Request/Response
27 * see TCG IF-M Segmentation Specification
30 * 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
31 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
32 * | Max Attribute Size |
33 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
34 * | Max Segment Size |
35 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
39 * Private data of an tcg_seg_attr_max_size_t object.
41 struct private_tcg_seg_attr_max_size_t
{
44 * Public members of tcg_seg_attr_max_size_t
46 tcg_seg_attr_max_size_t
public;
49 * Vendor-specific attribute type
54 * Length of attribute value
59 * Attribute value or segment
69 * Maximum IF-M attribute size in octets
71 uint32_t max_attr_size
;
74 * Maximum IF-M attribute segment size in octets
76 uint32_t max_seg_size
;
84 METHOD(pa_tnc_attr_t
, get_type
, pen_type_t
,
85 private_tcg_seg_attr_max_size_t
*this)
90 METHOD(pa_tnc_attr_t
, get_value
, chunk_t
,
91 private_tcg_seg_attr_max_size_t
*this)
96 METHOD(pa_tnc_attr_t
, get_noskip_flag
, bool,
97 private_tcg_seg_attr_max_size_t
*this)
99 return this->noskip_flag
;
102 METHOD(pa_tnc_attr_t
, set_noskip_flag
,void,
103 private_tcg_seg_attr_max_size_t
*this, bool noskip
)
105 this->noskip_flag
= noskip
;
108 METHOD(pa_tnc_attr_t
, build
, void,
109 private_tcg_seg_attr_max_size_t
*this)
111 bio_writer_t
*writer
;
117 writer
= bio_writer_create(TCG_SEG_ATTR_MAX_SIZE_SIZE
);
118 writer
->write_uint32(writer
, this->max_attr_size
);
119 writer
->write_uint32(writer
, this->max_seg_size
);
121 this->value
= writer
->extract_buf(writer
);
122 this->length
= this->value
.len
;
123 writer
->destroy(writer
);
126 METHOD(pa_tnc_attr_t
, process
, status_t
,
127 private_tcg_seg_attr_max_size_t
*this, u_int32_t
*offset
)
129 bio_reader_t
*reader
;
133 if (this->value
.len
< this->length
)
137 if (this->value
.len
< TCG_SEG_ATTR_MAX_SIZE_SIZE
)
139 DBG1(DBG_TNC
, "insufficient data for %N", tcg_attr_names
,
143 reader
= bio_reader_create(this->value
);
144 reader
->read_uint32(reader
, &this->max_attr_size
);
145 reader
->read_uint32(reader
, &this->max_seg_size
);
146 reader
->destroy(reader
);
151 METHOD(pa_tnc_attr_t
, add_segment
, void,
152 private_tcg_seg_attr_max_size_t
*this, chunk_t segment
)
154 this->value
= chunk_cat("mc", this->value
, segment
);
157 METHOD(pa_tnc_attr_t
, get_ref
, pa_tnc_attr_t
*,
158 private_tcg_seg_attr_max_size_t
*this)
161 return &this->public.pa_tnc_attribute
;
164 METHOD(pa_tnc_attr_t
, destroy
, void,
165 private_tcg_seg_attr_max_size_t
*this)
167 if (ref_put(&this->ref
))
169 free(this->value
.ptr
);
174 METHOD(tcg_seg_attr_max_size_t
, get_attr_size
, void,
175 private_tcg_seg_attr_max_size_t
*this, uint32_t *max_attr_size
,
176 uint32_t *max_seg_size
)
180 *max_attr_size
= this->max_attr_size
;
184 *max_seg_size
= this->max_seg_size
;
189 * Described in header.
191 pa_tnc_attr_t
* tcg_seg_attr_max_size_create(uint32_t max_attr_size
,
192 uint32_t max_seg_size
,
195 private_tcg_seg_attr_max_size_t
*this;
199 .pa_tnc_attribute
= {
200 .get_type
= _get_type
,
201 .get_value
= _get_value
,
202 .get_noskip_flag
= _get_noskip_flag
,
203 .set_noskip_flag
= _set_noskip_flag
,
206 .add_segment
= _add_segment
,
210 .get_attr_size
= _get_attr_size
,
212 .type
= { PEN_TCG
, request ? TCG_SEG_MAX_ATTR_SIZE_REQ
:
213 TCG_SEG_MAX_ATTR_SIZE_RESP
},
214 .max_attr_size
= max_attr_size
,
215 .max_seg_size
= max_seg_size
,
219 return &this->public.pa_tnc_attribute
;
223 * Described in header.
225 pa_tnc_attr_t
*tcg_seg_attr_max_size_create_from_data(size_t length
,
229 private_tcg_seg_attr_max_size_t
*this;
233 .pa_tnc_attribute
= {
234 .get_type
= _get_type
,
235 .get_value
= _get_value
,
236 .get_noskip_flag
= _get_noskip_flag
,
237 .set_noskip_flag
= _set_noskip_flag
,
240 .add_segment
= _add_segment
,
244 .get_attr_size
= _get_attr_size
,
246 .type
= { PEN_TCG
, request ? TCG_SEG_MAX_ATTR_SIZE_REQ
:
247 TCG_SEG_MAX_ATTR_SIZE_RESP
},
249 .value
= chunk_clone(data
),
253 return &this->public.pa_tnc_attribute
;