2 * Copyright (C) 2011 Sansar Choinyambuu
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_pts_attr_aik.h"
18 #include <pa_tnc/pa_tnc_msg.h>
19 #include <bio/bio_writer.h>
20 #include <bio/bio_reader.h>
23 typedef struct private_tcg_pts_attr_aik_t private_tcg_pts_attr_aik_t
;
26 * Attestation Identity Key (see section 3.13 of PTS Protocol: Binding to TNC IF-M Specification)
29 * 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 * | Flags | Attestation Identity Key (Variable Lenght) ~
33 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
34 * | Attestation Identity Key (Variable Lenght) ~
35 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
39 #define PTS_AIK_SIZE 4
42 * Private data of an tcg_pts_attr_aik_t object.
44 struct private_tcg_pts_attr_aik_t
{
47 * Public members of tcg_pts_attr_aik_t
49 tcg_pts_attr_aik_t
public;
72 * Naked Public Key flag
77 * Attestation Identity Key
82 METHOD(pa_tnc_attr_t
, get_vendor_id
, pen_t
,
83 private_tcg_pts_attr_aik_t
*this)
85 return this->vendor_id
;
88 METHOD(pa_tnc_attr_t
, get_type
, u_int32_t
,
89 private_tcg_pts_attr_aik_t
*this)
94 METHOD(pa_tnc_attr_t
, get_value
, chunk_t
,
95 private_tcg_pts_attr_aik_t
*this)
100 METHOD(pa_tnc_attr_t
, get_noskip_flag
, bool,
101 private_tcg_pts_attr_aik_t
*this)
103 return this->noskip_flag
;
106 METHOD(pa_tnc_attr_t
, set_noskip_flag
,void,
107 private_tcg_pts_attr_aik_t
*this, bool noskip
)
109 this->noskip_flag
= noskip
;
112 METHOD(pa_tnc_attr_t
, build
, void,
113 private_tcg_pts_attr_aik_t
*this)
115 bio_writer_t
*writer
;
118 writer
= bio_writer_create(PTS_AIK_SIZE
);
120 if(this->naked_pub_aik
) flags
+= 128;
121 writer
->write_uint8 (writer
, flags
);
122 writer
->write_data(writer
, this->aik
);
124 this->value
= chunk_clone(writer
->get_buf(writer
));
125 writer
->destroy(writer
);
128 METHOD(pa_tnc_attr_t
, process
, status_t
,
129 private_tcg_pts_attr_aik_t
*this, u_int32_t
*offset
)
131 bio_reader_t
*reader
;
134 if (this->value
.len
< PTS_AIK_SIZE
)
136 DBG1(DBG_TNC
, "insufficient data for Attestation Identity Key");
140 reader
= bio_reader_create(this->value
);
142 reader
->read_uint8(reader
, &flags
);
143 if((flags
>> 7 ) & 1) this->naked_pub_aik
= true;
145 reader
->read_data (reader
, this->value
.len
- 1, &this->aik
);
146 this->aik
= chunk_clone(this->aik
);
147 reader
->destroy(reader
);
152 METHOD(pa_tnc_attr_t
, destroy
, void,
153 private_tcg_pts_attr_aik_t
*this)
155 free(this->value
.ptr
);
160 METHOD(tcg_pts_attr_aik_t
, get_naked_flag
, bool,
161 private_tcg_pts_attr_aik_t
*this)
163 return this->naked_pub_aik
;
166 METHOD(tcg_pts_attr_aik_t
, set_naked_flag
, void,
167 private_tcg_pts_attr_aik_t
*this, bool naked_pub_aik
)
169 this->naked_pub_aik
= naked_pub_aik
;
172 METHOD(tcg_pts_attr_aik_t
, get_aik
, chunk_t
,
173 private_tcg_pts_attr_aik_t
*this)
178 METHOD(tcg_pts_attr_aik_t
, set_aik
, void,
179 private_tcg_pts_attr_aik_t
*this,
186 * Described in header.
188 pa_tnc_attr_t
*tcg_pts_attr_aik_create(bool naked_pub_aik
, chunk_t aik
)
190 private_tcg_pts_attr_aik_t
*this;
194 .pa_tnc_attribute
= {
195 .get_vendor_id
= _get_vendor_id
,
196 .get_type
= _get_type
,
197 .get_value
= _get_value
,
198 .get_noskip_flag
= _get_noskip_flag
,
199 .set_noskip_flag
= _set_noskip_flag
,
204 .get_naked_flag
= _get_naked_flag
,
205 .set_naked_flag
= _set_naked_flag
,
209 .vendor_id
= PEN_TCG
,
211 .naked_pub_aik
= naked_pub_aik
,
215 return &this->public.pa_tnc_attribute
;
220 * Described in header.
222 pa_tnc_attr_t
*tcg_pts_attr_aik_create_from_data(chunk_t data
)
224 private_tcg_pts_attr_aik_t
*this;
228 .pa_tnc_attribute
= {
229 .get_vendor_id
= _get_vendor_id
,
230 .get_type
= _get_type
,
231 .get_value
= _get_value
,
232 .get_noskip_flag
= _get_noskip_flag
,
233 .set_noskip_flag
= _set_noskip_flag
,
238 .get_naked_flag
= _get_naked_flag
,
239 .set_naked_flag
= _set_naked_flag
,
243 .vendor_id
= PEN_TCG
,
245 .value
= chunk_clone(data
),
248 return &this->public.pa_tnc_attribute
;