Annotation of embedaddon/strongswan/src/libimcv/pts/components/pts_comp_evidence.c, revision 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>