Return to tcg_pts_attr_get_aik.c CVS log | Up to [ELWIX - Embedded LightWeight unIX -] / embedaddon / strongswan / src / libimcv / tcg / pts |
1.1 misho 1: /* 2: * Copyright (C) 2011-2012 Sansar Choinyambuu 3: * Copyright (C) 2011-2014 Andreas Steffen 4: * HSR Hochschule fuer Technik Rapperswil 5: * 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>. 10: * 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 14: * for more details. 15: */ 16: 17: #include "tcg_pts_attr_get_aik.h" 18: 19: #include <pa_tnc/pa_tnc_msg.h> 20: #include <bio/bio_writer.h> 21: #include <bio/bio_reader.h> 22: #include <utils/debug.h> 23: 24: typedef struct private_tcg_pts_attr_get_aik_t private_tcg_pts_attr_get_aik_t; 25: 26: /** 27: * Get Attestation Identity Key 28: * see section 3.12 of PTS Protocol: Binding to TNC IF-M Specification 29: * 30: * 1 2 3 31: * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 32: * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 33: * | Reserved | 34: * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 35: */ 36: 37: #define PTS_GET_AIK_SIZE 4 38: #define PTS_GET_AIK_RESERVED 0x00000000 39: 40: /** 41: * Private data of an tcg_pts_attr_get_aik_t object. 42: */ 43: struct private_tcg_pts_attr_get_aik_t { 44: 45: /** 46: * Public members of tcg_pts_attr_get_aik_t 47: */ 48: tcg_pts_attr_get_aik_t public; 49: 50: /** 51: * Vendor-specific attribute type 52: */ 53: pen_type_t type; 54: 55: /** 56: * Length of attribute value 57: */ 58: size_t length; 59: 60: /** 61: * Attribute value or segment 62: */ 63: chunk_t value; 64: 65: /** 66: * Noskip flag 67: */ 68: bool noskip_flag; 69: 70: /** 71: * Reference count 72: */ 73: refcount_t ref; 74: }; 75: 76: METHOD(pa_tnc_attr_t, get_type, pen_type_t, 77: private_tcg_pts_attr_get_aik_t *this) 78: { 79: return this->type; 80: } 81: 82: METHOD(pa_tnc_attr_t, get_value, chunk_t, 83: private_tcg_pts_attr_get_aik_t *this) 84: { 85: return this->value; 86: } 87: 88: METHOD(pa_tnc_attr_t, get_noskip_flag, bool, 89: private_tcg_pts_attr_get_aik_t *this) 90: { 91: return this->noskip_flag; 92: } 93: 94: METHOD(pa_tnc_attr_t, set_noskip_flag,void, 95: private_tcg_pts_attr_get_aik_t *this, bool noskip) 96: { 97: this->noskip_flag = noskip; 98: } 99: 100: METHOD(pa_tnc_attr_t, build, void, 101: private_tcg_pts_attr_get_aik_t *this) 102: { 103: bio_writer_t *writer; 104: 105: if (this->value.ptr) 106: { 107: return; 108: } 109: writer = bio_writer_create(PTS_GET_AIK_SIZE); 110: writer->write_uint32 (writer, PTS_GET_AIK_RESERVED); 111: 112: this->value = writer->extract_buf(writer); 113: this->length = this->value.len; 114: writer->destroy(writer); 115: } 116: 117: METHOD(pa_tnc_attr_t, add_segment, void, 118: private_tcg_pts_attr_get_aik_t *this, chunk_t segment) 119: { 120: this->value = chunk_cat("mc", this->value, segment); 121: } 122: 123: METHOD(pa_tnc_attr_t, process, status_t, 124: private_tcg_pts_attr_get_aik_t *this, uint32_t *offset) 125: { 126: bio_reader_t *reader; 127: uint32_t reserved; 128: 129: *offset = 0; 130: 131: if (this->value.len < this->length) 132: { 133: return NEED_MORE; 134: } 135: if (this->value.len < PTS_GET_AIK_SIZE) 136: { 137: DBG1(DBG_TNC, "insufficient data for Get AIK"); 138: return FAILED; 139: } 140: reader = bio_reader_create(this->value); 141: reader->read_uint32 (reader, &reserved); 142: reader->destroy(reader); 143: 144: return SUCCESS; 145: } 146: 147: METHOD(pa_tnc_attr_t, get_ref, pa_tnc_attr_t*, 148: private_tcg_pts_attr_get_aik_t *this) 149: { 150: ref_get(&this->ref); 151: return &this->public.pa_tnc_attribute; 152: } 153: 154: METHOD(pa_tnc_attr_t, destroy, void, 155: private_tcg_pts_attr_get_aik_t *this) 156: { 157: if (ref_put(&this->ref)) 158: { 159: free(this->value.ptr); 160: free(this); 161: } 162: } 163: 164: /** 165: * Described in header. 166: */ 167: pa_tnc_attr_t *tcg_pts_attr_get_aik_create() 168: { 169: private_tcg_pts_attr_get_aik_t *this; 170: 171: INIT(this, 172: .public = { 173: .pa_tnc_attribute = { 174: .get_type = _get_type, 175: .get_value = _get_value, 176: .get_noskip_flag = _get_noskip_flag, 177: .set_noskip_flag = _set_noskip_flag, 178: .build = _build, 179: .process = _process, 180: .add_segment = _add_segment, 181: .get_ref = _get_ref, 182: .destroy = _destroy, 183: }, 184: }, 185: .type = { PEN_TCG, TCG_PTS_GET_AIK }, 186: .ref = 1, 187: ); 188: 189: return &this->public.pa_tnc_attribute; 190: } 191: 192: 193: /** 194: * Described in header. 195: */ 196: pa_tnc_attr_t *tcg_pts_attr_get_aik_create_from_data(size_t length, 197: chunk_t data) 198: { 199: private_tcg_pts_attr_get_aik_t *this; 200: 201: INIT(this, 202: .public = { 203: .pa_tnc_attribute = { 204: .get_type = _get_type, 205: .get_value = _get_value, 206: .get_noskip_flag = _get_noskip_flag, 207: .set_noskip_flag = _set_noskip_flag, 208: .build = _build, 209: .process = _process, 210: .add_segment = _add_segment, 211: .get_ref = _get_ref, 212: .destroy = _destroy, 213: }, 214: }, 215: .type = { PEN_TCG, TCG_PTS_GET_AIK }, 216: .length = length, 217: .value = chunk_clone(data), 218: .ref = 1, 219: ); 220: 221: return &this->public.pa_tnc_attribute; 222: }