Message ID | 20201116092631.13333-1-ivan.hu@canonical.com |
---|---|
State | Accepted |
Headers | show |
Series | tpmevlog: add tests for snatic check of the TPM event sha1 format log | expand |
On 16/11/2020 09:26, Ivan Hu wrote: > Signed-off-by: Ivan Hu <ivan.hu@canonical.com> > --- > src/tpm/tpmevlog/tpmevlog.c | 47 +++++++++++++++++++++++++++++++++++++ > 1 file changed, 47 insertions(+) > > diff --git a/src/tpm/tpmevlog/tpmevlog.c b/src/tpm/tpmevlog/tpmevlog.c > index 94b718c5..052e62eb 100644 > --- a/src/tpm/tpmevlog/tpmevlog.c > +++ b/src/tpm/tpmevlog/tpmevlog.c > @@ -333,6 +333,50 @@ static int tpmevlog_v2_check(fwts_framework *fw, uint8_t *data, size_t len) > return FWTS_OK; > } > > +static int tpmevlog_check(fwts_framework *fw, uint8_t *data, size_t len) > +{ > + > + uint8_t *pdata = data; > + int ret = FWTS_OK; > + fwts_pc_client_pcr_event *pc_event = NULL; I don't think setting pc_event to NULL is really required, but I'm OK with that. > + > + do { > + if (len < sizeof(fwts_pc_client_pcr_event)) { > + fwts_failed(fw, LOG_LEVEL_MEDIUM, "EventLength", > + "The length of the event is %zd bytes " > + "is smaller than the PCClientPCREvent %zd bytes.", > + len, > + sizeof(fwts_pc_client_pcr_event)); > + return FWTS_ERROR; > + } > + > + pc_event = (fwts_pc_client_pcr_event *)pdata; > + ret = tpmevlog_pcrindex_value_check(fw, pc_event->pcr_index); > + if (ret != FWTS_OK) > + return ret; > + ret = tpmevlog_eventtype_check(fw, pc_event->event_type); > + if (ret != FWTS_OK) > + return ret; > + > + if ((len - sizeof(fwts_pc_client_pcr_event)) < pc_event->event_data_size) { > + fwts_failed(fw, LOG_LEVEL_MEDIUM, "EventLength", > + "The remain length of the event is %zd bytes " > + "is smaller than required event length " > + "%" PRIu32 " bytes.", > + len - sizeof(fwts_pc_client_pcr_event), > + pc_event->event_data_size); > + return FWTS_ERROR; > + } > + > + pdata += (sizeof(fwts_pc_client_pcr_event) + pc_event->event_data_size); > + len -= (sizeof(fwts_pc_client_pcr_event) + pc_event->event_data_size); > + } while (len > 0); > + > + fwts_passed(fw, "Check TPM event SHA1 log test passed."); > + return FWTS_OK; > +} > + > + > static uint8_t *tpmevlog_load_file(const int fd, size_t *length) > { > uint8_t *ptr = NULL, *tmp; > @@ -416,6 +460,9 @@ static int tpmevlog_test1(fwts_framework *fw) > /* check if the TPM2 eventlog */ > if (strstr((char *)(data + sizeof(fwts_pc_client_pcr_event)), FWTS_TPM_EVENTLOG_V2_SIGNATURE)) > tpmevlog_v2_check(fw, data, length); > + else { > + tpmevlog_check(fw, data, length); > + } > > free(data); > } > Looks good to me. Thanks Ivan Acked-by: Colin Ian King <colin.king@canonical.com>
Typo in subject line? On 2020-11-16 2:26 a.m., Ivan Hu wrote: > Signed-off-by: Ivan Hu <ivan.hu@canonical.com> > --- > src/tpm/tpmevlog/tpmevlog.c | 47 +++++++++++++++++++++++++++++++++++++ > 1 file changed, 47 insertions(+) > > diff --git a/src/tpm/tpmevlog/tpmevlog.c b/src/tpm/tpmevlog/tpmevlog.c > index 94b718c5..052e62eb 100644 > --- a/src/tpm/tpmevlog/tpmevlog.c > +++ b/src/tpm/tpmevlog/tpmevlog.c > @@ -333,6 +333,50 @@ static int tpmevlog_v2_check(fwts_framework *fw, uint8_t *data, size_t len) > return FWTS_OK; > } > > +static int tpmevlog_check(fwts_framework *fw, uint8_t *data, size_t len) > +{ > + > + uint8_t *pdata = data; > + int ret = FWTS_OK; > + fwts_pc_client_pcr_event *pc_event = NULL; > + > + do { > + if (len < sizeof(fwts_pc_client_pcr_event)) { > + fwts_failed(fw, LOG_LEVEL_MEDIUM, "EventLength", > + "The length of the event is %zd bytes " > + "is smaller than the PCClientPCREvent %zd bytes.", > + len, > + sizeof(fwts_pc_client_pcr_event)); > + return FWTS_ERROR; > + } > + > + pc_event = (fwts_pc_client_pcr_event *)pdata; > + ret = tpmevlog_pcrindex_value_check(fw, pc_event->pcr_index); > + if (ret != FWTS_OK) > + return ret; > + ret = tpmevlog_eventtype_check(fw, pc_event->event_type); > + if (ret != FWTS_OK) > + return ret; > + > + if ((len - sizeof(fwts_pc_client_pcr_event)) < pc_event->event_data_size) { > + fwts_failed(fw, LOG_LEVEL_MEDIUM, "EventLength", > + "The remain length of the event is %zd bytes " > + "is smaller than required event length " > + "%" PRIu32 " bytes.", > + len - sizeof(fwts_pc_client_pcr_event), > + pc_event->event_data_size); > + return FWTS_ERROR; > + } > + > + pdata += (sizeof(fwts_pc_client_pcr_event) + pc_event->event_data_size); > + len -= (sizeof(fwts_pc_client_pcr_event) + pc_event->event_data_size); > + } while (len > 0); > + > + fwts_passed(fw, "Check TPM event SHA1 log test passed."); > + return FWTS_OK; > +} > + > + > static uint8_t *tpmevlog_load_file(const int fd, size_t *length) > { > uint8_t *ptr = NULL, *tmp; > @@ -416,6 +460,9 @@ static int tpmevlog_test1(fwts_framework *fw) > /* check if the TPM2 eventlog */ > if (strstr((char *)(data + sizeof(fwts_pc_client_pcr_event)), FWTS_TPM_EVENTLOG_V2_SIGNATURE)) > tpmevlog_v2_check(fw, data, length); > + else { > + tpmevlog_check(fw, data, length); > + } > > free(data); > } > Acked-by: Alex Hung <alex.hung@canonical.com>
diff --git a/src/tpm/tpmevlog/tpmevlog.c b/src/tpm/tpmevlog/tpmevlog.c index 94b718c5..052e62eb 100644 --- a/src/tpm/tpmevlog/tpmevlog.c +++ b/src/tpm/tpmevlog/tpmevlog.c @@ -333,6 +333,50 @@ static int tpmevlog_v2_check(fwts_framework *fw, uint8_t *data, size_t len) return FWTS_OK; } +static int tpmevlog_check(fwts_framework *fw, uint8_t *data, size_t len) +{ + + uint8_t *pdata = data; + int ret = FWTS_OK; + fwts_pc_client_pcr_event *pc_event = NULL; + + do { + if (len < sizeof(fwts_pc_client_pcr_event)) { + fwts_failed(fw, LOG_LEVEL_MEDIUM, "EventLength", + "The length of the event is %zd bytes " + "is smaller than the PCClientPCREvent %zd bytes.", + len, + sizeof(fwts_pc_client_pcr_event)); + return FWTS_ERROR; + } + + pc_event = (fwts_pc_client_pcr_event *)pdata; + ret = tpmevlog_pcrindex_value_check(fw, pc_event->pcr_index); + if (ret != FWTS_OK) + return ret; + ret = tpmevlog_eventtype_check(fw, pc_event->event_type); + if (ret != FWTS_OK) + return ret; + + if ((len - sizeof(fwts_pc_client_pcr_event)) < pc_event->event_data_size) { + fwts_failed(fw, LOG_LEVEL_MEDIUM, "EventLength", + "The remain length of the event is %zd bytes " + "is smaller than required event length " + "%" PRIu32 " bytes.", + len - sizeof(fwts_pc_client_pcr_event), + pc_event->event_data_size); + return FWTS_ERROR; + } + + pdata += (sizeof(fwts_pc_client_pcr_event) + pc_event->event_data_size); + len -= (sizeof(fwts_pc_client_pcr_event) + pc_event->event_data_size); + } while (len > 0); + + fwts_passed(fw, "Check TPM event SHA1 log test passed."); + return FWTS_OK; +} + + static uint8_t *tpmevlog_load_file(const int fd, size_t *length) { uint8_t *ptr = NULL, *tmp; @@ -416,6 +460,9 @@ static int tpmevlog_test1(fwts_framework *fw) /* check if the TPM2 eventlog */ if (strstr((char *)(data + sizeof(fwts_pc_client_pcr_event)), FWTS_TPM_EVENTLOG_V2_SIGNATURE)) tpmevlog_v2_check(fw, data, length); + else { + tpmevlog_check(fw, data, length); + } free(data); }
Signed-off-by: Ivan Hu <ivan.hu@canonical.com> --- src/tpm/tpmevlog/tpmevlog.c | 47 +++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+)