Peter Huewe | d5a36f6 | 2018-06-12 00:59:26 +0200 | [diff] [blame] | 1 | /* SPDX-License-Identifier: BSD-2 */ |
Philip Tricca | 21fa321 | 2018-02-19 06:43:56 -0800 | [diff] [blame] | 2 | /* |
| 3 | * Copyright (c) 2015 - 2018 Intel Corporation |
Philip Tricca | a003d76 | 2017-10-17 13:25:42 -0700 | [diff] [blame] | 4 | * All rights reserved. |
Philip Tricca | 21fa321 | 2018-02-19 06:43:56 -0800 | [diff] [blame] | 5 | */ |
wcarthur | eedecd6 | 2015-11-20 16:59:45 -0500 | [diff] [blame] | 6 | |
Philip Tricca | a003ae6 | 2018-02-19 10:32:46 -0800 | [diff] [blame] | 7 | #include <inttypes.h> |
wcarthur | eedecd6 | 2015-11-20 16:59:45 -0500 | [diff] [blame] | 8 | #include <stdio.h> |
Philip Tricca | a003d76 | 2017-10-17 13:25:42 -0700 | [diff] [blame] | 9 | #include <stdlib.h> |
Philip Tricca | 910f17c | 2018-03-15 12:38:37 -0700 | [diff] [blame] | 10 | #include <string.h> |
David J. Maria | 06db575 | 2018-06-19 14:52:37 -0700 | [diff] [blame] | 11 | |
| 12 | #ifndef _WIN32 |
Philip Tricca | a003ae6 | 2018-02-19 10:32:46 -0800 | [diff] [blame] | 13 | #include <unistd.h> |
David J. Maria | 06db575 | 2018-06-19 14:52:37 -0700 | [diff] [blame] | 14 | #endif |
wcarthur | eedecd6 | 2015-11-20 16:59:45 -0500 | [diff] [blame] | 15 | |
Philip Tricca | 910f17c | 2018-03-15 12:38:37 -0700 | [diff] [blame] | 16 | #include "tss2_tpm2_types.h" |
| 17 | #include "tss2_mu.h" |
| 18 | |
Philip Tricca | 850bb59 | 2018-04-03 09:29:22 -0700 | [diff] [blame] | 19 | #include "tcti-common.h" |
Philip Tricca | a003ae6 | 2018-02-19 10:32:46 -0800 | [diff] [blame] | 20 | #define LOGMODULE tcti |
Philip Tricca | a7c51ce | 2018-03-10 18:28:25 -0800 | [diff] [blame] | 21 | #include "util/log.h" |
wcarthur | eedecd6 | 2015-11-20 16:59:45 -0500 | [diff] [blame] | 22 | |
Philip Tricca | 850bb59 | 2018-04-03 09:29:22 -0700 | [diff] [blame] | 23 | TSS2_TCTI_COMMON_CONTEXT* |
| 24 | tcti_common_context_cast (TSS2_TCTI_CONTEXT *ctx) |
wcarthur | eedecd6 | 2015-11-20 16:59:45 -0500 | [diff] [blame] | 25 | { |
Philip Tricca | 850bb59 | 2018-04-03 09:29:22 -0700 | [diff] [blame] | 26 | return (TSS2_TCTI_COMMON_CONTEXT*)ctx; |
| 27 | } |
Philip Tricca | dfa41a5 | 2016-07-20 17:43:57 -0700 | [diff] [blame] | 28 | |
Philip Tricca | 850bb59 | 2018-04-03 09:29:22 -0700 | [diff] [blame] | 29 | TSS2_TCTI_CONTEXT* |
| 30 | tcti_common_down_cast (TSS2_TCTI_COMMON_CONTEXT *ctx) |
| 31 | { |
| 32 | return (TSS2_TCTI_CONTEXT*)&ctx->v2; |
| 33 | } |
| 34 | |
| 35 | TSS2_RC |
| 36 | tcti_common_cancel_checks ( |
| 37 | TSS2_TCTI_COMMON_CONTEXT *tcti_common) |
| 38 | { |
| 39 | if (tcti_common->state != TCTI_STATE_RECEIVE) { |
| 40 | return TSS2_TCTI_RC_BAD_SEQUENCE; |
| 41 | } |
Tadeusz Struk | 32aadee | 2017-06-14 13:23:42 -0700 | [diff] [blame] | 42 | return TSS2_RC_SUCCESS; |
wcarthur | eedecd6 | 2015-11-20 16:59:45 -0500 | [diff] [blame] | 43 | } |
| 44 | |
Philip Tricca | cac4c3a | 2018-03-05 18:21:41 -0800 | [diff] [blame] | 45 | TSS2_RC |
Philip Tricca | 850bb59 | 2018-04-03 09:29:22 -0700 | [diff] [blame] | 46 | tcti_common_transmit_checks ( |
| 47 | TSS2_TCTI_COMMON_CONTEXT *tcti_common, |
Philip Tricca | cac4c3a | 2018-03-05 18:21:41 -0800 | [diff] [blame] | 48 | const uint8_t *command_buffer) |
Philip Tricca | 3f1828c | 2017-10-18 18:44:13 -0700 | [diff] [blame] | 49 | { |
Philip Tricca | 850bb59 | 2018-04-03 09:29:22 -0700 | [diff] [blame] | 50 | if (tcti_common->state != TCTI_STATE_TRANSMIT) { |
Philip Tricca | fa14abe | 2018-03-05 21:14:54 -0800 | [diff] [blame] | 51 | return TSS2_TCTI_RC_BAD_SEQUENCE; |
| 52 | } |
Philip Tricca | 3f1828c | 2017-10-18 18:44:13 -0700 | [diff] [blame] | 53 | if (command_buffer == NULL) { |
| 54 | return TSS2_TCTI_RC_BAD_REFERENCE; |
| 55 | } |
Philip Tricca | 3f1828c | 2017-10-18 18:44:13 -0700 | [diff] [blame] | 56 | |
| 57 | return TSS2_RC_SUCCESS; |
| 58 | } |
wcarthur | eedecd6 | 2015-11-20 16:59:45 -0500 | [diff] [blame] | 59 | |
Philip Tricca | cac4c3a | 2018-03-05 18:21:41 -0800 | [diff] [blame] | 60 | TSS2_RC |
Philip Tricca | 850bb59 | 2018-04-03 09:29:22 -0700 | [diff] [blame] | 61 | tcti_common_receive_checks ( |
| 62 | TSS2_TCTI_COMMON_CONTEXT *tcti_common, |
Andreas Fuchs | baeb2be | 2018-03-29 15:39:50 +0200 | [diff] [blame] | 63 | size_t *response_size) |
wcarthur | eedecd6 | 2015-11-20 16:59:45 -0500 | [diff] [blame] | 64 | { |
Philip Tricca | 850bb59 | 2018-04-03 09:29:22 -0700 | [diff] [blame] | 65 | if (tcti_common->state != TCTI_STATE_RECEIVE) { |
Philip Tricca | fa14abe | 2018-03-05 21:14:54 -0800 | [diff] [blame] | 66 | return TSS2_TCTI_RC_BAD_SEQUENCE; |
| 67 | } |
Philip Tricca | 25789b2 | 2018-03-07 15:23:47 -0800 | [diff] [blame] | 68 | if (response_size == NULL) { |
Tadeusz Struk | 32aadee | 2017-06-14 13:23:42 -0700 | [diff] [blame] | 69 | return TSS2_TCTI_RC_BAD_REFERENCE; |
Philip Tricca | dfa41a5 | 2016-07-20 17:43:57 -0700 | [diff] [blame] | 70 | } |
Philip Tricca | dfa41a5 | 2016-07-20 17:43:57 -0700 | [diff] [blame] | 71 | |
Tadeusz Struk | 32aadee | 2017-06-14 13:23:42 -0700 | [diff] [blame] | 72 | return TSS2_RC_SUCCESS; |
Philip Tricca | 4ea417c | 2016-01-24 23:10:03 +0000 | [diff] [blame] | 73 | } |
Philip Tricca | a003ae6 | 2018-02-19 10:32:46 -0800 | [diff] [blame] | 74 | |
Philip Tricca | 850bb59 | 2018-04-03 09:29:22 -0700 | [diff] [blame] | 75 | TSS2_RC |
| 76 | tcti_common_set_locality_checks ( |
| 77 | TSS2_TCTI_COMMON_CONTEXT *tcti_common) |
| 78 | { |
| 79 | if (tcti_common->state != TCTI_STATE_TRANSMIT) { |
| 80 | return TSS2_TCTI_RC_BAD_SEQUENCE; |
| 81 | } |
| 82 | return TSS2_RC_SUCCESS; |
| 83 | } |
Philip Tricca | ee41115 | 2018-02-23 19:16:04 -0800 | [diff] [blame] | 84 | |
Philip Tricca | cac4c3a | 2018-03-05 18:21:41 -0800 | [diff] [blame] | 85 | TSS2_RC |
| 86 | tcti_make_sticky_not_implemented ( |
Philip Tricca | ee41115 | 2018-02-23 19:16:04 -0800 | [diff] [blame] | 87 | TSS2_TCTI_CONTEXT *tctiContext, |
| 88 | TPM2_HANDLE *handle, |
| 89 | uint8_t sticky) |
| 90 | { |
Andreas Fuchs | baeb2be | 2018-03-29 15:39:50 +0200 | [diff] [blame] | 91 | (void)(tctiContext); |
| 92 | (void)(handle); |
| 93 | (void)(sticky); |
Philip Tricca | ee41115 | 2018-02-23 19:16:04 -0800 | [diff] [blame] | 94 | return TSS2_TCTI_RC_NOT_IMPLEMENTED; |
| 95 | } |
Philip Tricca | 7a10ee3 | 2018-03-06 12:48:39 -0800 | [diff] [blame] | 96 | |
| 97 | TSS2_RC |
Philip Tricca | 9d4e41e | 2018-03-27 08:22:54 -0700 | [diff] [blame] | 98 | header_unmarshal ( |
Philip Tricca | 7a10ee3 | 2018-03-06 12:48:39 -0800 | [diff] [blame] | 99 | const uint8_t *buf, |
| 100 | tpm_header_t *header) |
| 101 | { |
| 102 | TSS2_RC rc; |
| 103 | size_t offset = 0; |
| 104 | |
| 105 | LOG_TRACE ("Parsing header from buffer: 0x%" PRIxPTR, (uintptr_t)buf); |
| 106 | rc = Tss2_MU_TPM2_ST_Unmarshal (buf, |
| 107 | TPM_HEADER_SIZE, |
| 108 | &offset, |
| 109 | &header->tag); |
| 110 | if (rc != TSS2_RC_SUCCESS) { |
| 111 | LOG_ERROR ("Failed to unmarshal tag."); |
| 112 | return rc; |
| 113 | } |
| 114 | rc = Tss2_MU_UINT32_Unmarshal (buf, |
| 115 | TPM_HEADER_SIZE, |
| 116 | &offset, |
| 117 | &header->size); |
| 118 | if (rc != TSS2_RC_SUCCESS) { |
| 119 | LOG_ERROR ("Failed to unmarshal command size."); |
| 120 | return rc; |
| 121 | } |
| 122 | rc = Tss2_MU_UINT32_Unmarshal (buf, |
| 123 | TPM_HEADER_SIZE, |
| 124 | &offset, |
| 125 | &header->code); |
| 126 | if (rc != TSS2_RC_SUCCESS) { |
| 127 | LOG_ERROR ("Failed to unmarshal command code."); |
| 128 | } |
| 129 | return rc; |
| 130 | } |
Philip Tricca | 0b87044 | 2018-03-26 14:27:28 -0700 | [diff] [blame] | 131 | |
| 132 | TSS2_RC |
| 133 | header_marshal ( |
| 134 | const tpm_header_t *header, |
| 135 | uint8_t *buf) |
| 136 | { |
| 137 | TSS2_RC rc; |
| 138 | size_t offset = 0; |
| 139 | |
| 140 | LOG_TRACE ("Parsing header from buffer: 0x%" PRIxPTR, (uintptr_t)buf); |
| 141 | rc = Tss2_MU_TPM2_ST_Marshal (header->tag, |
| 142 | buf, |
| 143 | TPM_HEADER_SIZE, |
| 144 | &offset); |
| 145 | if (rc != TSS2_RC_SUCCESS) { |
| 146 | LOG_ERROR ("Failed to marshal tag."); |
| 147 | return rc; |
| 148 | } |
| 149 | rc = Tss2_MU_UINT32_Marshal (header->size, |
| 150 | buf, |
| 151 | TPM_HEADER_SIZE, |
| 152 | &offset); |
| 153 | if (rc != TSS2_RC_SUCCESS) { |
| 154 | LOG_ERROR ("Failed to marshal command size."); |
| 155 | return rc; |
| 156 | } |
| 157 | rc = Tss2_MU_UINT32_Marshal (header->code, |
| 158 | buf, |
| 159 | TPM_HEADER_SIZE, |
| 160 | &offset); |
| 161 | if (rc != TSS2_RC_SUCCESS) { |
| 162 | LOG_ERROR ("Failed to marshal command code."); |
| 163 | } |
| 164 | return rc; |
| 165 | } |