1 /* Copyright (c) 2011 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 two-stage locking using bGlobalLock and PP.
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 zero = 0;
19   uint32_t x;
20 
21   TlclLibInit();
22   TPM_CHECK(TlclStartupIfNeeded());
23   TPM_CHECK(TlclSelfTestFull());
24   TPM_CHECK(TlclAssertPhysicalPresence());
25   TPM_CHECK(TlclRead(INDEX0, (uint8_t*) &x, sizeof(x)));
26   TPM_CHECK(TlclWrite(INDEX0, (uint8_t*) &zero, sizeof(uint32_t)));
27   TPM_CHECK(TlclRead(INDEX1, (uint8_t*) &x, sizeof(x)));
28   TPM_CHECK(TlclWrite(INDEX1, (uint8_t*) &zero, sizeof(uint32_t)));
29   TPM_CHECK(TlclSetGlobalLock());
30 
31   // Verifies that write to index0 fails.
32   x = 1;
33   TPM_EXPECT(TlclWrite(INDEX0, (uint8_t*) &x, sizeof(x)), TPM_E_AREA_LOCKED);
34   TPM_CHECK(TlclRead(INDEX0, (uint8_t*) &x, sizeof(x)));
35   VbAssert(x == 0);
36 
37   // Verifies that write to index1 is still possible.
38   x = 2;
39   TPM_CHECK(TlclWrite(INDEX1, (uint8_t*) &x, sizeof(x)));
40   TPM_CHECK(TlclRead(INDEX1, (uint8_t*) &x, sizeof(x)));
41   VbAssert(x == 2);
42 
43   // Turns off PP.
44   TlclLockPhysicalPresence();
45 
46   // Verifies that write to index1 fails.
47   x = 3;
48   TPM_EXPECT(TlclWrite(INDEX1, (uint8_t*) &x, sizeof(x)), TPM_E_BAD_PRESENCE);
49   TPM_CHECK(TlclRead(INDEX1, (uint8_t*) &x, sizeof(x)));
50   VbAssert(x == 2);
51   printf("TEST SUCCEEDED\n");
52   exit(0);
53 }
54