Return to pts_comp_evidence.c CVS log | Up to [ELWIX - Embedded LightWeight unIX -] / embedaddon / strongswan / src / libimcv / pts / components |
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: