Annotation of embedaddon/strongswan/src/libimcv/pts/components/ita/ita_comp_tgrub.c, revision 1.1.1.1

1.1       misho       1: /*
                      2:  * Copyright (C) 2011-2012 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 "ita_comp_tgrub.h"
                     17: #include "ita_comp_func_name.h"
                     18: 
                     19: #include "pts/components/pts_component.h"
                     20: 
                     21: #include <utils/debug.h>
                     22: #include <pen/pen.h>
                     23: 
                     24: typedef struct pts_ita_comp_tgrub_t pts_ita_comp_tgrub_t;
                     25: 
                     26: /**
                     27:  * Private data of a pts_ita_comp_tgrub_t object.
                     28:  *
                     29:  */
                     30: struct pts_ita_comp_tgrub_t {
                     31: 
                     32:        /**
                     33:         * Public pts_component_t interface.
                     34:         */
                     35:        pts_component_t public;
                     36: 
                     37:        /**
                     38:         * Component Functional Name
                     39:         */
                     40:        pts_comp_func_name_t *name;
                     41: 
                     42:        /**
                     43:         * Sub-component depth
                     44:         */
                     45:        uint32_t depth;
                     46: 
                     47:        /**
                     48:         * PTS measurement database
                     49:         */
                     50:        pts_database_t *pts_db;
                     51: 
                     52:        /**
                     53:         * Reference count
                     54:         */
                     55:        refcount_t ref;
                     56: 
                     57: };
                     58: 
                     59: METHOD(pts_component_t, get_comp_func_name, pts_comp_func_name_t*,
                     60:        pts_ita_comp_tgrub_t *this)
                     61: {
                     62:        return this->name;
                     63: }
                     64: 
                     65: METHOD(pts_component_t, get_evidence_flags, uint8_t,
                     66:        pts_ita_comp_tgrub_t *this)
                     67: {
                     68:        return PTS_REQ_FUNC_COMP_EVID_PCR;
                     69: }
                     70: 
                     71: METHOD(pts_component_t, get_depth, uint32_t,
                     72:        pts_ita_comp_tgrub_t *this)
                     73: {
                     74:        return this->depth;
                     75: }
                     76: 
                     77: METHOD(pts_component_t, measure, status_t,
                     78:        pts_ita_comp_tgrub_t *this, uint8_t qualifier, pts_t *pts,
                     79:        pts_comp_evidence_t **evidence)
                     80: {
                     81:        size_t pcr_len;
                     82:        pts_pcr_transform_t pcr_transform;
                     83:        pts_meas_algorithms_t hash_algo;
                     84:        pts_comp_evidence_t *evid;
                     85:        uint32_t extended_pcr;
                     86:        time_t measurement_time;
                     87:        chunk_t measurement, pcr_before, pcr_after;
                     88: 
                     89:        /* Provisional implementation for TGRUB */
                     90:        extended_pcr = PCR_DEBUG;
                     91:        time(&measurement_time);
                     92: 
                     93:        if (!pts->read_pcr(pts, extended_pcr, &pcr_after, HASH_SHA1))
                     94:        {
                     95:                DBG1(DBG_PTS, "error occurred while reading PCR: %d", extended_pcr);
                     96:                return FAILED;
                     97:        }
                     98: 
                     99:        hash_algo = PTS_MEAS_ALGO_SHA1;
                    100:        pcr_len = HASH_SIZE_SHA1;
                    101:        pcr_transform = pts_meas_algo_to_pcr_transform(hash_algo, pcr_len);
                    102: 
                    103:        measurement = chunk_alloc(pcr_len);
                    104:        memset(measurement.ptr, 0x00, measurement.len);
                    105: 
                    106:        pcr_before = chunk_alloc(pcr_len);
                    107:        memset(pcr_before.ptr, 0x00, pcr_before.len);
                    108: 
                    109:        evid = *evidence = pts_comp_evidence_create(this->name->clone(this->name),
                    110:                                                                this->depth, extended_pcr,
                    111:                                                                hash_algo, pcr_transform,
                    112:                                                                measurement_time, measurement);
                    113:        evid->set_pcr_info(evid, pcr_before, pcr_after);
                    114: 
                    115:        return SUCCESS;
                    116: }
                    117: 
                    118: METHOD(pts_component_t, verify, status_t,
                    119:        pts_ita_comp_tgrub_t *this, uint8_t qualifier, pts_t *pts,
                    120:        pts_comp_evidence_t *evidence)
                    121: {
                    122:        bool has_pcr_info;
                    123:        uint32_t extended_pcr;
                    124:        pts_meas_algorithms_t algo;
                    125:        pts_pcr_transform_t transform;
                    126:        pts_pcr_t *pcrs;
                    127:        time_t measurement_time;
                    128:        chunk_t pcr_before, pcr_after;
                    129:        chunk_t measurement __attribute__((unused));
                    130: 
                    131:        pcrs = pts->get_pcrs(pts);
                    132:        measurement = evidence->get_measurement(evidence, &extended_pcr,
                    133:                                                                &algo, &transform, &measurement_time);
                    134:        if (extended_pcr != PCR_DEBUG)
                    135:        {
                    136:                return FAILED;
                    137:        }
                    138: 
                    139:        /* TODO check measurement in database */
                    140: 
                    141:        has_pcr_info = evidence->get_pcr_info(evidence, &pcr_before, &pcr_after);
                    142:        if (has_pcr_info)
                    143:        {
                    144:                if (!chunk_equals_const(pcr_before, pcrs->get(pcrs, extended_pcr)))
                    145:                {
                    146:                        DBG1(DBG_PTS, "PCR %2u: pcr_before is not equal to pcr value");
                    147:                }
                    148:                if (pcrs->set(pcrs, extended_pcr, pcr_after))
                    149:                {
                    150:                        return SUCCESS;
                    151:                }
                    152:        }
                    153: 
                    154:        return SUCCESS;
                    155: }
                    156: 
                    157: METHOD(pts_component_t, finalize, bool,
                    158:        pts_ita_comp_tgrub_t *this, uint8_t qualifier, bio_writer_t *result)
                    159: {
                    160:        return FALSE;
                    161: }
                    162: 
                    163: METHOD(pts_component_t, get_ref, pts_component_t*,
                    164:        pts_ita_comp_tgrub_t *this)
                    165: {
                    166:        ref_get(&this->ref);
                    167:        return &this->public;
                    168: }
                    169: 
                    170: METHOD(pts_component_t, destroy, void,
                    171:        pts_ita_comp_tgrub_t *this)
                    172: {
                    173:        if (ref_put(&this->ref))
                    174:        {
                    175:                this->name->destroy(this->name);
                    176:                free(this);
                    177:        }
                    178: }
                    179: 
                    180: /**
                    181:  * See header
                    182:  */
                    183: pts_component_t *pts_ita_comp_tgrub_create(uint32_t depth,
                    184:                                                                                   pts_database_t *pts_db)
                    185: {
                    186:        pts_ita_comp_tgrub_t *this;
                    187: 
                    188:        INIT(this,
                    189:                .public = {
                    190:                        .get_comp_func_name = _get_comp_func_name,
                    191:                        .get_evidence_flags = _get_evidence_flags,
                    192:                        .get_depth = _get_depth,
                    193:                        .measure = _measure,
                    194:                        .verify = _verify,
                    195:                        .finalize = _finalize,
                    196:                        .get_ref = _get_ref,
                    197:                        .destroy = _destroy,
                    198:                },
                    199:                .name = pts_comp_func_name_create(PEN_ITA, PTS_ITA_COMP_FUNC_NAME_TGRUB,
                    200:                                                                                  PTS_ITA_QUALIFIER_FLAG_KERNEL |
                    201:                                                                                  PTS_ITA_QUALIFIER_TYPE_TRUSTED),
                    202:                .depth = depth,
                    203:                .pts_db = pts_db,
                    204:                .ref = 1,
                    205:        );
                    206: 
                    207:        return &this->public;
                    208: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>