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

1.1       misho       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>