diff options
Diffstat (limited to 'src/libimcv/tcg/pts/tcg_pts_attr_aik.c')
-rw-r--r-- | src/libimcv/tcg/pts/tcg_pts_attr_aik.c | 21 |
1 files changed, 17 insertions, 4 deletions
diff --git a/src/libimcv/tcg/pts/tcg_pts_attr_aik.c b/src/libimcv/tcg/pts/tcg_pts_attr_aik.c index 17a8db5d6..ad1ad7e8a 100644 --- a/src/libimcv/tcg/pts/tcg_pts_attr_aik.c +++ b/src/libimcv/tcg/pts/tcg_pts_attr_aik.c @@ -1,5 +1,6 @@ /* - * Copyright (C) 2011-2012 Sansar Choinyambuu, Andreas Steffen + * Copyright (C) 2011-2012 Sansar Choinyambuu + * Copyright (C) 2011-2014 Andreas Steffen * HSR Hochschule fuer Technik Rapperswil * * This program is free software; you can redistribute it and/or modify it @@ -54,7 +55,12 @@ struct private_tcg_pts_attr_aik_t { pen_type_t type; /** - * Attribute value + * Length of attribute value + */ + size_t length; + + /** + * Attribute value or segment */ chunk_t value; @@ -124,6 +130,7 @@ METHOD(pa_tnc_attr_t, build, void, writer->write_uint8(writer, flags); writer->write_data (writer, aik_blob); this->value = writer->extract_buf(writer); + this->length = this->value.len; writer->destroy(writer); free(aik_blob.ptr); } @@ -136,10 +143,15 @@ METHOD(pa_tnc_attr_t, process, status_t, certificate_type_t type; chunk_t aik_blob; + *offset = 0; + + if (this->value.len < this->length) + { + return NEED_MORE; + } if (this->value.len < PTS_AIK_SIZE) { DBG1(DBG_TNC, "insufficient data for Attestation Identity Key"); - *offset = 0; return FAILED; } reader = bio_reader_create(this->value); @@ -218,7 +230,7 @@ pa_tnc_attr_t *tcg_pts_attr_aik_create(certificate_t *aik) /** * Described in header. */ -pa_tnc_attr_t *tcg_pts_attr_aik_create_from_data(chunk_t data) +pa_tnc_attr_t *tcg_pts_attr_aik_create_from_data(size_t length, chunk_t data) { private_tcg_pts_attr_aik_t *this; @@ -237,6 +249,7 @@ pa_tnc_attr_t *tcg_pts_attr_aik_create_from_data(chunk_t data) .get_aik = _get_aik, }, .type = { PEN_TCG, TCG_PTS_AIK }, + .length = length, .value = chunk_clone(data), .ref = 1, ); |