Skip to content

Commit b26d38e

Browse files
committed
Fix fTPM NSC bounds handling
1 parent 884352c commit b26d38e

4 files changed

Lines changed: 120 additions & 14 deletions

File tree

src/ftpm_callable.c

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -117,28 +117,37 @@ void wcs_ftpm_init(void)
117117
int CSME_NSE_API wcs_ftpm_transmit(const uint8_t *cmd, uint32_t cmdSz,
118118
uint8_t *rsp, uint32_t *rspSz)
119119
{
120+
int rc;
120121
int rspLen;
122+
uint32_t rspCapacity;
123+
uint32_t wireSz;
121124

122125
if (!ftpm_ready) {
123126
return TPM_RC_INITIALIZE;
124127
}
125128
if (cmd == NULL || rsp == NULL || rspSz == NULL || cmdSz == 0U ||
126-
cmdSz > WCS_FTPM_MAX_COMMAND_SIZE || *rspSz == 0U ||
127-
*rspSz > WCS_FTPM_MAX_COMMAND_SIZE) {
129+
cmdSz > WCS_FTPM_MAX_COMMAND_SIZE) {
128130
return BAD_FUNC_ARG;
129131
}
130132

131-
rspLen = (int)*rspSz;
132-
int rc = FWTPM_ProcessCommand(&ftpm_ctx, cmd, (int)cmdSz, rsp, &rspLen, 0);
133-
if (rc >= 0) {
134-
uint32_t wireSz = ftpm_rsp_size(rsp, rspLen);
135-
if (wireSz > 0U && wireSz <= *rspSz) {
133+
rspCapacity = *rspSz;
134+
if (rspCapacity == 0U || rspCapacity > WCS_FTPM_MAX_COMMAND_SIZE) {
135+
return BAD_FUNC_ARG;
136+
}
137+
138+
rspLen = (int)rspCapacity;
139+
rc = FWTPM_ProcessCommand(&ftpm_ctx, cmd, (int)cmdSz, rsp, &rspLen, 0);
140+
if (rc == TPM_RC_SUCCESS) {
141+
wireSz = ftpm_rsp_size(rsp, rspLen);
142+
if (wireSz > 0U && wireSz <= rspCapacity) {
136143
*rspSz = wireSz;
137-
rc = TPM_RC_SUCCESS;
138144
}
139-
else if (rspLen >= 0) {
145+
else if (rspLen >= 0 && (uint32_t)rspLen <= rspCapacity) {
140146
*rspSz = (uint32_t)rspLen;
141147
}
148+
else {
149+
rc = TPM_RC_FAILURE;
150+
}
142151
}
143152
return rc;
144153
}

test-app/wcs/ftpm_stub.c

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -50,9 +50,15 @@ static struct ftpm_tis_state ftpm_tis = {
5050
FTPM_STS_VALID | FTPM_STS_COMMAND_READY
5151
};
5252

53-
static uint32_t ftpm_reg_offset(uint32_t addr)
53+
static int ftpm_reg_offset(uint32_t addr, uint32_t *off)
5454
{
55-
return (addr - FTPM_TIS_BASE) & 0x0FFFU;
55+
if (off == NULL || addr < FTPM_TIS_BASE ||
56+
addr >= (FTPM_TIS_BASE + 0x1000U)) {
57+
return BAD_FUNC_ARG;
58+
}
59+
60+
*off = addr - FTPM_TIS_BASE;
61+
return TPM_RC_SUCCESS;
5662
}
5763

5864
static void ftpm_store_le(uint8_t *buf, uint16_t size, uint32_t val)
@@ -107,11 +113,14 @@ int TPM2_IoCb_FtpmNsc(TPM2_CTX *ctx, INT32 isRead, UINT32 addr,
107113
(void)ctx;
108114
(void)userCtx;
109115

110-
if (buf == NULL || size == 0U || addr < FTPM_TIS_BASE) {
116+
if (buf == NULL || size == 0U) {
117+
return BAD_FUNC_ARG;
118+
}
119+
120+
if (ftpm_reg_offset(addr, &off) != TPM_RC_SUCCESS) {
111121
return BAD_FUNC_ARG;
112122
}
113123

114-
off = ftpm_reg_offset(addr);
115124
burst = FTPM_BURST_COUNT;
116125

117126
if (isRead) {

tools/unit-tests/Makefile

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ TESTS:=unit-parser unit-fdt unit-extflash unit-string unit-spi-flash unit-aes128
5050
unit-enc-nvm-flagshome unit-delta unit-update-flash unit-update-flash-delta \
5151
unit-update-flash-self-update \
5252
unit-update-flash-enc unit-update-ram unit-update-ram-nofixed unit-pkcs11_store unit-psa_store unit-disk \
53-
unit-update-disk unit-multiboot unit-boot-x86-fsp unit-loader-tpm-init unit-qspi-flash unit-tpm-rsa-exp \
53+
unit-update-disk unit-multiboot unit-boot-x86-fsp unit-loader-tpm-init unit-qspi-flash unit-ftpm-stub unit-tpm-rsa-exp \
5454
unit-image-nopart unit-image-sha384 unit-image-sha3-384 unit-store-sbrk \
5555
unit-tpm-blob unit-policy-create unit-policy-sign unit-rot-auth unit-sdhci-response-bits \
5656
unit-sdhci-disk-unaligned unit-sign-encrypted-output
@@ -168,6 +168,11 @@ unit-tpm-check-rot-auth: ../../include/target.h unit-tpm-check-rot-auth.c ../../
168168
-DWOLFBOOT_HASH_SHA256 \
169169
-ffunction-sections -fdata-sections $(LDFLAGS) -Wl,--gc-sections
170170

171+
unit-ftpm-stub: ../../include/target.h unit-ftpm-stub.c
172+
gcc -o $@ $^ $(CFLAGS) -I$(WOLFBOOT_LIB_WOLFTPM) \
173+
-DWOLFTPM_USER_SETTINGS -ffunction-sections -fdata-sections \
174+
$(LDFLAGS) -Wl,--gc-sections
175+
171176
unit-tpm-blob: ../../include/target.h unit-tpm-blob.c
172177
gcc -o $@ $^ $(CFLAGS) -I$(WOLFBOOT_LIB_WOLFTPM) -DWOLFBOOT_TPM \
173178
-DWOLFTPM_USER_SETTINGS -DWOLFBOOT_TPM_SEAL -DWOLFBOOT_SIGN_RSA2048 \

tools/unit-tests/unit-ftpm-stub.c

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
/* unit-ftpm-stub.c
2+
*
3+
* Unit tests for the fTPM non-secure TIS callback shim.
4+
*/
5+
6+
#include <check.h>
7+
#include <stdint.h>
8+
9+
#define WOLFBOOT_TZ_FTPM
10+
11+
int wcs_ftpm_transmit(const uint8_t *cmd, uint32_t cmdSz, uint8_t *rsp,
12+
uint32_t *rspSz)
13+
{
14+
(void)cmd;
15+
(void)cmdSz;
16+
(void)rsp;
17+
(void)rspSz;
18+
return -1;
19+
}
20+
21+
#include "../../test-app/wcs/ftpm_stub.c"
22+
23+
START_TEST(ftpm_tis_rejects_address_below_window)
24+
{
25+
BYTE buf[4] = {0};
26+
27+
ck_assert_int_eq(TPM2_IoCb_FtpmNsc(NULL, 1, FTPM_TIS_BASE - 1U,
28+
buf, sizeof(buf), NULL), BAD_FUNC_ARG);
29+
}
30+
END_TEST
31+
32+
START_TEST(ftpm_tis_rejects_address_above_window)
33+
{
34+
BYTE buf[4] = {0};
35+
36+
ck_assert_int_eq(TPM2_IoCb_FtpmNsc(NULL, 1, FTPM_TIS_BASE + 0x1000U,
37+
buf, sizeof(buf), NULL), BAD_FUNC_ARG);
38+
}
39+
END_TEST
40+
41+
START_TEST(ftpm_tis_accepts_valid_window_register)
42+
{
43+
BYTE buf[4] = {0};
44+
45+
ck_assert_int_eq(TPM2_IoCb_FtpmNsc(NULL, 1,
46+
FTPM_TIS_BASE + FTPM_TIS_DID_VID, buf, sizeof(buf), NULL),
47+
TPM_RC_SUCCESS);
48+
ck_assert_uint_eq(buf[0], 0x4EU);
49+
ck_assert_uint_eq(buf[1], 0x1BU);
50+
ck_assert_uint_eq(buf[2], 0x01U);
51+
ck_assert_uint_eq(buf[3], 0x00U);
52+
}
53+
END_TEST
54+
55+
static Suite *ftpm_stub_suite(void)
56+
{
57+
Suite *s;
58+
TCase *tc;
59+
60+
s = suite_create("ftpm_stub");
61+
tc = tcase_create("tis_window");
62+
tcase_add_test(tc, ftpm_tis_rejects_address_below_window);
63+
tcase_add_test(tc, ftpm_tis_rejects_address_above_window);
64+
tcase_add_test(tc, ftpm_tis_accepts_valid_window_register);
65+
suite_add_tcase(s, tc);
66+
67+
return s;
68+
}
69+
70+
int main(void)
71+
{
72+
int fails;
73+
Suite *s;
74+
SRunner *sr;
75+
76+
s = ftpm_stub_suite();
77+
sr = srunner_create(s);
78+
srunner_run_all(sr, CK_NORMAL);
79+
fails = srunner_ntests_failed(sr);
80+
srunner_free(sr);
81+
82+
return fails == 0 ? 0 : 1;
83+
}

0 commit comments

Comments
 (0)