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_unix_file_meta.h"
18 #include <pa_tnc/pa_tnc_msg.h>
19 #include <bio/bio_writer.h>
20 #include <bio/bio_reader.h>
21 #include <utils/linked_list.h>
24 typedef struct private_tcg_pts_attr_file_meta_t private_tcg_pts_attr_file_meta_t
;
27 * Unix-Style File Metadata
28 * see section 3.17.3 of PTS Protocol: Binding to TNC IF-M Specification
31 * 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
32 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
33 * | Number of Files included |
34 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
35 * | Number of Files included |
36 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
37 * | File metadata Length | Type | Reserved |
38 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
40 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
42 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
43 * | File Create Time |
44 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
45 * | File Create Time |
46 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
47 * | Last Modify Time |
48 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
49 * | Last Modify Time |
50 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
51 * | Last Access Time |
52 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
53 * | Last Access Time |
54 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
56 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
58 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
60 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
62 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
63 * ~ Filename (Variable Length) ~
64 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
65 * ...........................
68 #define PTS_FILE_META_SIZE 8
69 #define PTS_FILE_MEAS_RESERVED 0x00
70 #define PTS_FILE_METADATA_SIZE 52
73 * Private data of an tcg_pts_attr_file_meta_t object.
75 struct private_tcg_pts_attr_file_meta_t
{
78 * Public members of tcg_pts_attr_file_meta_t
80 tcg_pts_attr_file_meta_t
public;
105 pts_file_meta_t
*metadata
;
109 METHOD(pa_tnc_attr_t
, get_vendor_id
, pen_t
,
110 private_tcg_pts_attr_file_meta_t
*this)
112 return this->vendor_id
;
115 METHOD(pa_tnc_attr_t
, get_type
, u_int32_t
,
116 private_tcg_pts_attr_file_meta_t
*this)
121 METHOD(pa_tnc_attr_t
, get_value
, chunk_t
,
122 private_tcg_pts_attr_file_meta_t
*this)
127 METHOD(pa_tnc_attr_t
, get_noskip_flag
, bool,
128 private_tcg_pts_attr_file_meta_t
*this)
130 return this->noskip_flag
;
133 METHOD(pa_tnc_attr_t
, set_noskip_flag
,void,
134 private_tcg_pts_attr_file_meta_t
*this, bool noskip
)
136 this->noskip_flag
= noskip
;
139 METHOD(pa_tnc_attr_t
, build
, void,
140 private_tcg_pts_attr_file_meta_t
*this)
142 bio_writer_t
*writer
;
143 enumerator_t
*enumerator
;
144 pts_file_metadata_t
*entry
;
145 u_int64_t number_of_files
;
147 number_of_files
= this->metadata
->get_file_count(this->metadata
);
148 writer
= bio_writer_create(PTS_FILE_META_SIZE
);
150 writer
->write_uint64(writer
, number_of_files
);
152 enumerator
= this->metadata
->create_enumerator(this->metadata
);
153 while (enumerator
->enumerate(enumerator
, &entry
))
155 writer
->write_uint16(writer
, PTS_FILE_METADATA_SIZE
+
156 strlen(entry
->filename
));
157 writer
->write_uint8 (writer
, entry
->type
);
158 writer
->write_uint8 (writer
, PTS_FILE_MEAS_RESERVED
);
159 writer
->write_uint64(writer
, entry
->filesize
);
160 writer
->write_uint64(writer
, entry
->created
);
161 writer
->write_uint64(writer
, entry
->modified
);
162 writer
->write_uint64(writer
, entry
->accessed
);
163 writer
->write_uint64(writer
, entry
->owner
);
164 writer
->write_uint64(writer
, entry
->group
);
165 writer
->write_data (writer
, chunk_create(entry
->filename
,
166 strlen(entry
->filename
)));
168 enumerator
->destroy(enumerator
);
170 this->value
= chunk_clone(writer
->get_buf(writer
));
171 writer
->destroy(writer
);
174 METHOD(pa_tnc_attr_t
, process
, status_t
,
175 private_tcg_pts_attr_file_meta_t
*this, u_int32_t
*offset
)
177 bio_reader_t
*reader
;
178 pts_file_metadata_t
*entry
;
179 u_int8_t type
, reserved
;
181 u_int64_t number_of_files
, filesize
, created
, modified
, accessed
;
182 u_int64_t owner
, group
;
184 status_t status
= FAILED
;
186 if (this->value
.len
< PTS_FILE_META_SIZE
)
188 DBG1(DBG_TNC
, "insufficient data for PTS Unix-Style file metadata header");
192 reader
= bio_reader_create(this->value
);
193 reader
->read_uint64(reader
, &number_of_files
);
195 this->metadata
= pts_file_meta_create();
197 while (number_of_files
--)
199 if (!reader
->read_uint16(reader
, &len
))
201 DBG1(DBG_TNC
, "insufficient data for PTS file metadata length");
204 if (!reader
->read_uint8(reader
, &type
))
206 DBG1(DBG_TNC
, "insufficient data for file type");
209 if (!reader
->read_uint8(reader
, &reserved
))
211 DBG1(DBG_TNC
, "insufficient data for reserved field");
214 if (!reader
->read_uint64(reader
, &filesize
))
216 DBG1(DBG_TNC
, "insufficient data for file size");
219 if (!reader
->read_uint64(reader
, &created
))
221 DBG1(DBG_TNC
, "insufficient data for file create time");
224 if (!reader
->read_uint64(reader
, &modified
))
226 DBG1(DBG_TNC
, "insufficient data for last modify time");
229 if (!reader
->read_uint64(reader
, &accessed
))
231 DBG1(DBG_TNC
, "insufficient data for last access time");
234 if (!reader
->read_uint64(reader
, &owner
))
236 DBG1(DBG_TNC
, "insufficient data for owner id");
239 if (!reader
->read_uint64(reader
, &group
))
241 DBG1(DBG_TNC
, "insufficient data for group id");
244 if (!reader
->read_data(reader
, len
- PTS_FILE_METADATA_SIZE
, &filename
))
246 DBG1(DBG_TNC
, "insufficient data for filename");
250 entry
= malloc_thing(pts_file_metadata_t
);
252 entry
->filesize
= filesize
;
253 entry
->created
= created
;
254 entry
->modified
= modified
;
255 entry
->accessed
= accessed
;
256 entry
->owner
= owner
;
257 entry
->group
= group
;
258 entry
->filename
= malloc(filename
.len
+ 1);
259 entry
->filename
[filename
.len
] = '\0';
260 memcpy(entry
->filename
, filename
.ptr
, filename
.len
);
262 this->metadata
->add(this->metadata
, entry
);
267 reader
->destroy(reader
);
271 METHOD(pa_tnc_attr_t
, destroy
, void,
272 private_tcg_pts_attr_file_meta_t
*this)
274 this->metadata
->destroy(this->metadata
);
275 free(this->value
.ptr
);
279 METHOD(tcg_pts_attr_file_meta_t
, get_metadata
, pts_file_meta_t
*,
280 private_tcg_pts_attr_file_meta_t
*this)
282 return this->metadata
;
286 * Described in header.
288 pa_tnc_attr_t
*tcg_pts_attr_unix_file_meta_create(pts_file_meta_t
*metadata
)
290 private_tcg_pts_attr_file_meta_t
*this;
294 .pa_tnc_attribute
= {
295 .get_vendor_id
= _get_vendor_id
,
296 .get_type
= _get_type
,
297 .get_value
= _get_value
,
298 .get_noskip_flag
= _get_noskip_flag
,
299 .set_noskip_flag
= _set_noskip_flag
,
304 .get_metadata
= _get_metadata
,
306 .vendor_id
= PEN_TCG
,
307 .type
= TCG_PTS_UNIX_FILE_META
,
308 .metadata
= metadata
,
311 return &this->public.pa_tnc_attribute
;
316 * Described in header.
318 pa_tnc_attr_t
*tcg_pts_attr_unix_file_meta_create_from_data(chunk_t data
)
320 private_tcg_pts_attr_file_meta_t
*this;
324 .pa_tnc_attribute
= {
325 .get_vendor_id
= _get_vendor_id
,
326 .get_type
= _get_type
,
327 .get_value
= _get_value
,
328 .get_noskip_flag
= _get_noskip_flag
,
329 .set_noskip_flag
= _set_noskip_flag
,
334 .get_metadata
= _get_metadata
,
336 .vendor_id
= PEN_TCG
,
337 .type
= TCG_PTS_UNIX_FILE_META
,
338 .value
= chunk_clone(data
),
341 return &this->public.pa_tnc_attribute
;