1 /* Copyright (c) 2010 The Chromium OS Authors. All rights reserved.
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 "tlcl.h"
15 #include "tlcl_tests.h"
16
main(int argc,char ** argv)17 int main(int argc, char** argv) {
18 uint32_t perm;
19 uint32_t x;
20
21 TlclLibInit();
22 TPM_CHECK(TlclStartupIfNeeded());
23 TPM_CHECK(TlclSelfTestFull());
24 TPM_CHECK(TlclAssertPhysicalPresence());
25
26 VbAssert(!TlclIsOwned());
27
28 /* Ensures spaces exist. */
29 TPM_CHECK(TlclRead(INDEX0, (uint8_t*) &x, sizeof(x)));
30 TPM_CHECK(TlclRead(INDEX1, (uint8_t*) &x, sizeof(x)));
31
32 /* Redefines spaces a couple of times. */
33 perm = TPM_NV_PER_PPWRITE | TPM_NV_PER_GLOBALLOCK;
34 TPM_CHECK(TlclDefineSpace(INDEX0, perm, 2 * sizeof(uint32_t)));
35 TPM_CHECK(TlclDefineSpace(INDEX0, perm, sizeof(uint32_t)));
36
37 perm = TPM_NV_PER_PPWRITE;
38 TPM_CHECK(TlclDefineSpace(INDEX1, perm, 2 * sizeof(uint32_t)));
39 TPM_CHECK(TlclDefineSpace(INDEX1, perm, sizeof(uint32_t)));
40
41 // Sets the global lock.
42 TlclSetGlobalLock();
43
44 // Verifies that index0 cannot be redefined.
45 TPM_EXPECT(TlclDefineSpace(INDEX0, perm, sizeof(uint32_t)),
46 TPM_E_AREA_LOCKED);
47
48 // Checks that index1 can.
49 TPM_CHECK(TlclDefineSpace(INDEX1, perm, 2 * sizeof(uint32_t)));
50 TPM_CHECK(TlclDefineSpace(INDEX1, perm, sizeof(uint32_t)));
51
52 // Turns off PP.
53 TlclLockPhysicalPresence();
54
55 // Verifies that neither index0 nor index1 can be redefined.
56 TPM_EXPECT(TlclDefineSpace(INDEX0, perm, sizeof(uint32_t)),
57 TPM_E_BAD_PRESENCE);
58 TPM_EXPECT(TlclDefineSpace(INDEX1, perm, sizeof(uint32_t)),
59 TPM_E_BAD_PRESENCE);
60
61 printf("TEST SUCCEEDED\n");
62 exit(0);
63 }
64