1: /*
2: * Copyright (C) 2011 Sansar Choinyambuu, 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 "pts/components/pts_comp_evidence.h"
17:
18: #include <utils/debug.h>
19:
20: typedef struct private_pts_comp_evidence_t private_pts_comp_evidence_t;
21:
22: /**
23: * Private data of a pts_comp_evidence_t object.
24: */
25: struct private_pts_comp_evidence_t {
26:
27: /**
28: * Public pts_comp_evidence_t interface.
29: */
30: pts_comp_evidence_t public;
31:
32: /**
33: * Component Functional Name
34: */
35: pts_comp_func_name_t *name;
36:
37: /**
38: * Sub-Component Depth
39: */
40: uint32_t depth;
41:
42: /**
43: * Measurement Time
44: */
45: time_t measurement_time;
46:
47: /**
48: * Measurement Time
49: */
50: chunk_t measurement;
51:
52: /**
53: * Measurement Hash Algorithm
54: */
55: pts_meas_algorithms_t hash_algorithm;
56:
57: /**
58: * Is PCR Information included?
59: */
60: bool has_pcr_info;
61:
62: /**
63: * PCR the measurement was extended into
64: */
65: uint32_t extended_pcr;
66:
67: /**
68: * PCR value before extension
69: */
70: chunk_t pcr_before;
71:
72: /**
73: * PCR value after extension
74: */
75: chunk_t pcr_after;
76:
77: /**
78: * Transformation used for extending measurement into PCR
79: */
80: pts_pcr_transform_t transform;
81:
82: /**
83: * Component Validation Result
84: */
85: pts_comp_evid_validation_t validation;
86:
87: /**
88: * Verification Policy URI
89: */
90: char *policy_uri;
91:
92: };
93:
94: METHOD(pts_comp_evidence_t, get_comp_func_name, pts_comp_func_name_t*,
95: private_pts_comp_evidence_t *this, uint32_t *depth)
96: {
97: if (depth)
98: {
99: *depth = this->depth;
100: }
101: return this->name;
102: }
103:
104: METHOD(pts_comp_evidence_t, get_extended_pcr, uint32_t,
105: private_pts_comp_evidence_t *this)
106: {
107: return this->extended_pcr;
108: }
109:
110: METHOD(pts_comp_evidence_t, get_measurement, chunk_t,
111: private_pts_comp_evidence_t *this, uint32_t *extended_pcr,
112: pts_meas_algorithms_t *algo, pts_pcr_transform_t *transform,
113: time_t *measurement_time)
114: {
115: if (extended_pcr)
116: {
117: *extended_pcr = this->extended_pcr;
118: }
119: if (algo)
120: {
121: *algo = this->hash_algorithm;
122: }
123: if (transform)
124: {
125: *transform = this->transform;
126: }
127: if (measurement_time)
128: {
129: *measurement_time = this->measurement_time;
130: }
131: return this->measurement;
132: }
133:
134: METHOD(pts_comp_evidence_t, get_pcr_info, bool,
135: private_pts_comp_evidence_t *this, chunk_t *pcr_before, chunk_t *pcr_after)
136: {
137: if (pcr_before)
138: {
139: *pcr_before = this->pcr_before;
140: }
141: if (pcr_after)
142: {
143: *pcr_after = this->pcr_after;
144: }
145: return this->has_pcr_info;
146: }
147:
148: METHOD(pts_comp_evidence_t, set_pcr_info, void,
149: private_pts_comp_evidence_t *this, chunk_t pcr_before, chunk_t pcr_after)
150: {
151: this->has_pcr_info = TRUE;
152: this->pcr_before = pcr_before;
153: this->pcr_after = pcr_after;
154:
155: DBG3(DBG_PTS, "PCR %2d before value : %#B", this->extended_pcr, &pcr_before);
156: DBG3(DBG_PTS, "PCR %2d after value : %#B", this->extended_pcr, &pcr_after);
157: }
158:
159: METHOD(pts_comp_evidence_t, get_validation, pts_comp_evid_validation_t,
160: private_pts_comp_evidence_t *this, char **uri)
161: {
162: if (uri)
163: {
164: *uri = this->policy_uri;
165: }
166: return this->validation;
167: }
168:
169: METHOD(pts_comp_evidence_t, set_validation, void,
170: private_pts_comp_evidence_t *this, pts_comp_evid_validation_t validation,
171: char *uri)
172: {
173: this->validation = validation;
174: if (uri)
175: {
176: this->policy_uri = strdup(uri);
177: DBG3(DBG_PTS, "'%s'", uri);
178: }
179: }
180:
181: METHOD(pts_comp_evidence_t, destroy, void,
182: private_pts_comp_evidence_t *this)
183: {
184: this->name->destroy(this->name);
185: free(this->measurement.ptr);
186: free(this->pcr_before.ptr);
187: free(this->pcr_after.ptr);
188: free(this->policy_uri);
189: free(this);
190: }
191:
192: /**
193: * See header
194: */
195: pts_comp_evidence_t *pts_comp_evidence_create(pts_comp_func_name_t *name,
196: uint32_t depth,
197: uint32_t extended_pcr,
198: pts_meas_algorithms_t algo,
199: pts_pcr_transform_t transform,
200: time_t measurement_time,
201: chunk_t measurement)
202: {
203: private_pts_comp_evidence_t *this;
204:
205: INIT(this,
206: .public = {
207: .get_comp_func_name = _get_comp_func_name,
208: .get_extended_pcr = _get_extended_pcr,
209: .get_measurement = _get_measurement,
210: .get_pcr_info = _get_pcr_info,
211: .set_pcr_info = _set_pcr_info,
212: .get_validation = _get_validation,
213: .set_validation = _set_validation,
214: .destroy = _destroy,
215: },
216: .name = name,
217: .depth = depth,
218: .extended_pcr = extended_pcr,
219: .hash_algorithm = algo,
220: .transform = transform,
221: .measurement_time = measurement_time,
222: .measurement = measurement,
223: );
224:
225: name->log(name, "");
226: DBG3(DBG_PTS, "measurement time: %T", &measurement_time, FALSE);
227: DBG3(DBG_PTS, "PCR %2d extended with: %#B", extended_pcr, &measurement);
228:
229: return &this->public;
230: }
231:
232: /**
233: * See header
234: */
235: pts_pcr_transform_t pts_meas_algo_to_pcr_transform(pts_meas_algorithms_t algo,
236: size_t pcr_len)
237: {
238: size_t hash_size;
239:
240: hash_size = pts_meas_algo_hash_size(algo);
241: if (hash_size == 0)
242: {
243: return PTS_PCR_TRANSFORM_NO;
244: }
245: if (hash_size == pcr_len)
246: {
247: return PTS_PCR_TRANSFORM_MATCH;
248: }
249: if (hash_size > pcr_len)
250: {
251: return PTS_PCR_TRANSFORM_LONG;
252: }
253: return PTS_PCR_TRANSFORM_SHORT;
254: }
255:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>