2 * Copyright (C) 2011-2020 Andreas Steffen
4 * Copyright (C) secunet Security Networks AG
6 * This program is free software; you can redistribute it and/or modify it
7 * under the terms of the GNU General Public License as published by the
8 * Free Software Foundation; either version 2 of the License, or (at your
9 * option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>.
11 * This program is distributed in the hope that it will be useful, but
12 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
13 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
17 #include "ita_comp_tgrub.h"
18 #include "ita_comp_func_name.h"
20 #include "pts/components/pts_component.h"
22 #include <utils/debug.h>
25 typedef struct pts_ita_comp_tgrub_t pts_ita_comp_tgrub_t
;
28 * Private data of a pts_ita_comp_tgrub_t object.
31 struct pts_ita_comp_tgrub_t
{
34 * Public pts_component_t interface.
36 pts_component_t
public;
39 * Component Functional Name
41 pts_comp_func_name_t
*name
;
49 * PTS measurement database
51 pts_database_t
*pts_db
;
60 METHOD(pts_component_t
, get_comp_func_name
, pts_comp_func_name_t
*,
61 pts_ita_comp_tgrub_t
*this)
66 METHOD(pts_component_t
, get_evidence_flags
, uint8_t,
67 pts_ita_comp_tgrub_t
*this)
69 return PTS_REQ_FUNC_COMP_EVID_PCR
;
72 METHOD(pts_component_t
, get_depth
, uint32_t,
73 pts_ita_comp_tgrub_t
*this)
78 METHOD(pts_component_t
, measure
, status_t
,
79 pts_ita_comp_tgrub_t
*this, uint8_t qualifier
, pts_t
*pts
,
80 pts_comp_evidence_t
**evidence
)
83 pts_pcr_transform_t pcr_transform
;
84 pts_meas_algorithms_t hash_algo
;
85 pts_comp_evidence_t
*evid
;
86 uint32_t extended_pcr
;
87 time_t measurement_time
;
88 chunk_t measurement
, pcr_before
, pcr_after
;
90 /* Provisional implementation for TGRUB */
91 extended_pcr
= PCR_DEBUG
;
92 time(&measurement_time
);
94 if (!pts
->read_pcr(pts
, extended_pcr
, &pcr_after
, HASH_SHA1
))
96 DBG1(DBG_PTS
, "error occurred while reading PCR: %d", extended_pcr
);
100 hash_algo
= PTS_MEAS_ALGO_SHA1
;
101 pcr_len
= HASH_SIZE_SHA1
;
102 pcr_transform
= pts_meas_algo_to_pcr_transform(hash_algo
, pcr_len
);
104 measurement
= chunk_alloc(pcr_len
);
105 memset(measurement
.ptr
, 0x00, measurement
.len
);
107 pcr_before
= chunk_alloc(pcr_len
);
108 memset(pcr_before
.ptr
, 0x00, pcr_before
.len
);
110 evid
= *evidence
= pts_comp_evidence_create(this->name
->clone(this->name
),
111 this->depth
, extended_pcr
,
112 hash_algo
, pcr_transform
,
113 measurement_time
, measurement
);
114 evid
->set_pcr_info(evid
, pcr_before
, pcr_after
);
119 METHOD(pts_component_t
, verify
, status_t
,
120 pts_ita_comp_tgrub_t
*this, uint8_t qualifier
, pts_t
*pts
,
121 pts_comp_evidence_t
*evidence
)
124 uint32_t extended_pcr
;
125 pts_meas_algorithms_t algo
;
126 pts_pcr_transform_t transform
;
128 time_t measurement_time
;
129 chunk_t pcr_before
, pcr_after
;
130 chunk_t measurement
__attribute__((unused
));
132 pcrs
= pts
->get_pcrs(pts
);
137 measurement
= evidence
->get_measurement(evidence
, &extended_pcr
,
138 &algo
, &transform
, &measurement_time
);
139 if (extended_pcr
!= PCR_DEBUG
)
144 /* TODO check measurement in database */
146 has_pcr_info
= evidence
->get_pcr_info(evidence
, &pcr_before
, &pcr_after
);
149 if (!chunk_equals_const(pcr_before
, pcrs
->get(pcrs
, extended_pcr
)))
151 DBG1(DBG_PTS
, "PCR %2u: pcr_before is not equal to pcr value");
153 if (pcrs
->set(pcrs
, extended_pcr
, pcr_after
))
162 METHOD(pts_component_t
, finalize
, bool,
163 pts_ita_comp_tgrub_t
*this, uint8_t qualifier
, bio_writer_t
*result
)
168 METHOD(pts_component_t
, get_ref
, pts_component_t
*,
169 pts_ita_comp_tgrub_t
*this)
172 return &this->public;
175 METHOD(pts_component_t
, destroy
, void,
176 pts_ita_comp_tgrub_t
*this)
178 if (ref_put(&this->ref
))
180 this->name
->destroy(this->name
);
188 pts_component_t
*pts_ita_comp_tgrub_create(uint32_t depth
,
189 pts_database_t
*pts_db
)
191 pts_ita_comp_tgrub_t
*this;
195 .get_comp_func_name
= _get_comp_func_name
,
196 .get_evidence_flags
= _get_evidence_flags
,
197 .get_depth
= _get_depth
,
200 .finalize
= _finalize
,
204 .name
= pts_comp_func_name_create(PEN_ITA
, PTS_ITA_COMP_FUNC_NAME_TGRUB
,
205 PTS_ITA_QUALIFIER_FLAG_KERNEL
|
206 PTS_ITA_QUALIFIER_TYPE_TRUSTED
),
212 return &this->public;