xref: /aosp_15_r20/external/vboot_reference/tests/tpm_lite/tpmtest_redefine_unowned.c (revision 8617a60d3594060b7ecbd21bc622a7c14f3cf2bc)
1 /* Copyright 2010 The ChromiumOS Authors
2  * Use of this source code is governed by a BSD-style license that can be
3  * found in the LICENSE file.
4  */
5 
6 /* Test of protection from space redefinition when an owner is NOT present.
7  */
8 
9 #include <stdio.h>
10 #include <stdint.h>
11 #include <stdlib.h>
12 
13 #include "host_common.h"
14 #include "common/tests.h"
15 #include "tlcl.h"
16 #include "tlcl_tests.h"
17 
main(int argc,char ** argv)18 int main(int argc, char** argv) {
19 	uint32_t perm;
20 	uint32_t x;
21 
22 	TlclLibInit();
23 	TPM_CHECK(TlclStartupIfNeeded());
24 	TPM_CHECK(TlclSelfTestFull());
25 	TPM_CHECK(TlclAssertPhysicalPresence());
26 
27 	TEST_FALSE(TlclIsOwned(), "TlclIsOwned should return false");
28 
29 	/* Ensures spaces exist. */
30 	TPM_CHECK(TlclRead(INDEX0, (uint8_t*) &x, sizeof(x)));
31 	TPM_CHECK(TlclRead(INDEX1, (uint8_t*) &x, sizeof(x)));
32 
33 	/* Redefines spaces a couple of times. */
34 	perm = TPM_NV_PER_PPWRITE | TPM_NV_PER_GLOBALLOCK;
35 	TPM_CHECK(TlclDefineSpace(INDEX0, perm, 2 * sizeof(uint32_t)));
36 	TPM_CHECK(TlclDefineSpace(INDEX0, perm, sizeof(uint32_t)));
37 
38 	perm = TPM_NV_PER_PPWRITE;
39 	TPM_CHECK(TlclDefineSpace(INDEX1, perm, 2 * sizeof(uint32_t)));
40 	TPM_CHECK(TlclDefineSpace(INDEX1, perm, sizeof(uint32_t)));
41 
42 	// Sets the global lock.
43 	TlclSetGlobalLock();
44 
45 	// Verifies that index0 cannot be redefined.
46 	TPM_EXPECT(TlclDefineSpace(INDEX0, perm, sizeof(uint32_t)),
47 		   TPM_E_AREA_LOCKED);
48 
49 	// Checks that index1 can.
50 	TPM_CHECK(TlclDefineSpace(INDEX1, perm, 2 * sizeof(uint32_t)));
51 	TPM_CHECK(TlclDefineSpace(INDEX1, perm, sizeof(uint32_t)));
52 
53 	// Turns off PP.
54 	TlclLockPhysicalPresence();
55 
56 	// Verifies that neither index0 nor index1 can be redefined.
57 	TPM_EXPECT(TlclDefineSpace(INDEX0, perm, sizeof(uint32_t)),
58 		   TPM_E_BAD_PRESENCE);
59 	TPM_EXPECT(TlclDefineSpace(INDEX1, perm, sizeof(uint32_t)),
60 		   TPM_E_BAD_PRESENCE);
61 
62 	printf("TEST SUCCEEDED\n");
63 	exit(0);
64 }
65