tpm_generated_test.cc revision 434cfb322d09c125018fc0864f42d36dff3014e6
187496dd0090ac4f9188297e05573207db41ba2b6Darren Krahn// Copyright 2014 The Chromium OS Authors. All rights reserved.
287496dd0090ac4f9188297e05573207db41ba2b6Darren Krahn// Use of this source code is governed by a BSD-style license that can be
387496dd0090ac4f9188297e05573207db41ba2b6Darren Krahn// found in the LICENSE file.
487496dd0090ac4f9188297e05573207db41ba2b6Darren Krahn
587496dd0090ac4f9188297e05573207db41ba2b6Darren Krahn// Note: These tests are not generated. They test generated code.
687496dd0090ac4f9188297e05573207db41ba2b6Darren Krahn
7a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn#include <base/bind.h>
8a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn#include <base/callback.h>
9a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn#include <base/message_loop/message_loop.h>
10a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn#include <base/run_loop.h>
1187496dd0090ac4f9188297e05573207db41ba2b6Darren Krahn#include <gtest/gtest.h>
1287496dd0090ac4f9188297e05573207db41ba2b6Darren Krahn
13a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn#include "trunks/mock_authorization_delegate.h"
14a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn#include "trunks/mock_command_transceiver.h"
1587496dd0090ac4f9188297e05573207db41ba2b6Darren Krahn#include "trunks/tpm_generated.h"
1687496dd0090ac4f9188297e05573207db41ba2b6Darren Krahn
17a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahnusing testing::_;
18a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahnusing testing::DoAll;
19a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahnusing testing::Invoke;
20a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahnusing testing::Return;
21a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahnusing testing::SetArgPointee;
22a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahnusing testing::StrictMock;
23a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahnusing testing::WithArg;
24a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn
2587496dd0090ac4f9188297e05573207db41ba2b6Darren Krahnnamespace trunks {
2687496dd0090ac4f9188297e05573207db41ba2b6Darren Krahn
27a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn// This test is designed to get good coverage of the different types of code
28a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn// generated for serializing and parsing structures / unions / typedefs.
2987496dd0090ac4f9188297e05573207db41ba2b6Darren KrahnTEST(GeneratorTest, SerializeParseStruct) {
3087496dd0090ac4f9188297e05573207db41ba2b6Darren Krahn  TPM2B_CREATION_DATA data;
3187496dd0090ac4f9188297e05573207db41ba2b6Darren Krahn  memset(&data, 0, sizeof(TPM2B_CREATION_DATA));
3287496dd0090ac4f9188297e05573207db41ba2b6Darren Krahn  data.creation_data.pcr_select.count = 1;
3387496dd0090ac4f9188297e05573207db41ba2b6Darren Krahn  data.creation_data.pcr_select.pcr_selections[0].hash = TPM_ALG_SHA256;
3487496dd0090ac4f9188297e05573207db41ba2b6Darren Krahn  data.creation_data.pcr_select.pcr_selections[0].sizeof_select = 1;
3587496dd0090ac4f9188297e05573207db41ba2b6Darren Krahn  data.creation_data.pcr_select.pcr_selections[0].pcr_select[0] = 0;
3687496dd0090ac4f9188297e05573207db41ba2b6Darren Krahn  data.creation_data.pcr_digest.size = 2;
3787496dd0090ac4f9188297e05573207db41ba2b6Darren Krahn  data.creation_data.locality = 0;
3887496dd0090ac4f9188297e05573207db41ba2b6Darren Krahn  data.creation_data.parent_name_alg = TPM_ALG_SHA256;
3987496dd0090ac4f9188297e05573207db41ba2b6Darren Krahn  data.creation_data.parent_name.size = 3;
4087496dd0090ac4f9188297e05573207db41ba2b6Darren Krahn  data.creation_data.parent_qualified_name.size = 4;
4187496dd0090ac4f9188297e05573207db41ba2b6Darren Krahn  data.creation_data.outside_info.size = 5;
4287496dd0090ac4f9188297e05573207db41ba2b6Darren Krahn  std::string buffer;
4387496dd0090ac4f9188297e05573207db41ba2b6Darren Krahn  TPM_RC rc = Serialize_TPM2B_CREATION_DATA(data, &buffer);
4487496dd0090ac4f9188297e05573207db41ba2b6Darren Krahn  ASSERT_EQ(TPM_RC_SUCCESS, rc);
4587496dd0090ac4f9188297e05573207db41ba2b6Darren Krahn  EXPECT_EQ(35, buffer.size());
4687496dd0090ac4f9188297e05573207db41ba2b6Darren Krahn  TPM2B_CREATION_DATA data2;
4787496dd0090ac4f9188297e05573207db41ba2b6Darren Krahn  memset(&data2, 0, sizeof(TPM2B_CREATION_DATA));
4887496dd0090ac4f9188297e05573207db41ba2b6Darren Krahn  std::string buffer_before = buffer;
4987496dd0090ac4f9188297e05573207db41ba2b6Darren Krahn  std::string buffer_parsed;
5087496dd0090ac4f9188297e05573207db41ba2b6Darren Krahn  rc = Parse_TPM2B_CREATION_DATA(&buffer, &data2, &buffer_parsed);
5187496dd0090ac4f9188297e05573207db41ba2b6Darren Krahn  ASSERT_EQ(TPM_RC_SUCCESS, rc);
5287496dd0090ac4f9188297e05573207db41ba2b6Darren Krahn  EXPECT_EQ(0, buffer.size());
5387496dd0090ac4f9188297e05573207db41ba2b6Darren Krahn  EXPECT_EQ(buffer_before, buffer_parsed);
54434cfb322d09c125018fc0864f42d36dff3014e6Darren Krahn  EXPECT_EQ(buffer_before.size() - 2, data2.size);
55434cfb322d09c125018fc0864f42d36dff3014e6Darren Krahn  EXPECT_EQ(0, memcmp(&data.creation_data,
56434cfb322d09c125018fc0864f42d36dff3014e6Darren Krahn                      &data2.creation_data,
57434cfb322d09c125018fc0864f42d36dff3014e6Darren Krahn                      sizeof(TPMS_CREATION_DATA)));
5887496dd0090ac4f9188297e05573207db41ba2b6Darren Krahn}
5987496dd0090ac4f9188297e05573207db41ba2b6Darren Krahn
6058a6ad9e4e634f7dbafaea963ad43076e0ed1733Darren KrahnTEST(GeneratorTest, SerializeBufferOverflow) {
6158a6ad9e4e634f7dbafaea963ad43076e0ed1733Darren Krahn  TPM2B_MAX_BUFFER value;
6258a6ad9e4e634f7dbafaea963ad43076e0ed1733Darren Krahn  value.size = arraysize(value.buffer) + 1;
6358a6ad9e4e634f7dbafaea963ad43076e0ed1733Darren Krahn  std::string tmp;
6458a6ad9e4e634f7dbafaea963ad43076e0ed1733Darren Krahn  EXPECT_EQ(TPM_RC_INSUFFICIENT, Serialize_TPM2B_MAX_BUFFER(value, &tmp));
6558a6ad9e4e634f7dbafaea963ad43076e0ed1733Darren Krahn}
6658a6ad9e4e634f7dbafaea963ad43076e0ed1733Darren Krahn
6758a6ad9e4e634f7dbafaea963ad43076e0ed1733Darren KrahnTEST(GeneratorTest, ParseBufferOverflow) {
6858a6ad9e4e634f7dbafaea963ad43076e0ed1733Darren Krahn  TPM2B_MAX_BUFFER tmp;
6958a6ad9e4e634f7dbafaea963ad43076e0ed1733Darren Krahn  // Case 1: Sufficient source but overflow the destination.
7058a6ad9e4e634f7dbafaea963ad43076e0ed1733Darren Krahn  std::string malformed1 = "\x10\x00";
7158a6ad9e4e634f7dbafaea963ad43076e0ed1733Darren Krahn  malformed1 += std::string(0x1000, 'A');
7258a6ad9e4e634f7dbafaea963ad43076e0ed1733Darren Krahn  ASSERT_GT(0x1000, sizeof(tmp.buffer));
7358a6ad9e4e634f7dbafaea963ad43076e0ed1733Darren Krahn  EXPECT_EQ(TPM_RC_INSUFFICIENT,
7458a6ad9e4e634f7dbafaea963ad43076e0ed1733Darren Krahn            Parse_TPM2B_MAX_BUFFER(&malformed1, &tmp, NULL));
7558a6ad9e4e634f7dbafaea963ad43076e0ed1733Darren Krahn  // Case 2: Sufficient destination but overflow the source.
7658a6ad9e4e634f7dbafaea963ad43076e0ed1733Darren Krahn  std::string malformed2 = "\x00\x01";
7758a6ad9e4e634f7dbafaea963ad43076e0ed1733Darren Krahn  EXPECT_EQ(TPM_RC_INSUFFICIENT,
7858a6ad9e4e634f7dbafaea963ad43076e0ed1733Darren Krahn            Parse_TPM2B_MAX_BUFFER(&malformed2, &tmp, NULL));
7958a6ad9e4e634f7dbafaea963ad43076e0ed1733Darren Krahn}
8058a6ad9e4e634f7dbafaea963ad43076e0ed1733Darren Krahn
816a5f9fd320f2bd202653d09bad15a75474d49360Darren KrahnTEST(GeneratorTest, SynchronousCommand) {
826a5f9fd320f2bd202653d09bad15a75474d49360Darren Krahn  // A hand-rolled TPM2_Startup command.
836a5f9fd320f2bd202653d09bad15a75474d49360Darren Krahn  std::string expected_command("\x80\x01"          // tag=TPM_ST_NO_SESSIONS
846a5f9fd320f2bd202653d09bad15a75474d49360Darren Krahn                               "\x00\x00\x00\x0C"  // size=12
856a5f9fd320f2bd202653d09bad15a75474d49360Darren Krahn                               "\x00\x00\x01\x44"  // code=TPM_CC_Startup
866a5f9fd320f2bd202653d09bad15a75474d49360Darren Krahn                               "\x00\x00",         // param=TPM_SU_CLEAR
876a5f9fd320f2bd202653d09bad15a75474d49360Darren Krahn                               12);
886a5f9fd320f2bd202653d09bad15a75474d49360Darren Krahn  std::string command_response("\x80\x01"           // tag=TPM_ST_NO_SESSIONS
896a5f9fd320f2bd202653d09bad15a75474d49360Darren Krahn                               "\x00\x00\x00\x0A"   // size=10
906a5f9fd320f2bd202653d09bad15a75474d49360Darren Krahn                               "\x00\x00\x00\x00",  // code=TPM_RC_SUCCESS
916a5f9fd320f2bd202653d09bad15a75474d49360Darren Krahn                               10);
926a5f9fd320f2bd202653d09bad15a75474d49360Darren Krahn  StrictMock<MockCommandTransceiver> transceiver;
936a5f9fd320f2bd202653d09bad15a75474d49360Darren Krahn  EXPECT_CALL(transceiver, SendCommandAndWait(expected_command, _))
9488c9c242d0060034b83173054ed5a8c35078abaaUtkarsh Sanghi      .WillOnce(DoAll(SetArgPointee<1>(command_response),
9588c9c242d0060034b83173054ed5a8c35078abaaUtkarsh Sanghi                      Return(TPM_RC_SUCCESS)));
966a5f9fd320f2bd202653d09bad15a75474d49360Darren Krahn  StrictMock<MockAuthorizationDelegate> authorization;
976a5f9fd320f2bd202653d09bad15a75474d49360Darren Krahn  EXPECT_CALL(authorization, GetCommandAuthorization(_, _))
9888c9c242d0060034b83173054ed5a8c35078abaaUtkarsh Sanghi      .WillOnce(Return(true));
996a5f9fd320f2bd202653d09bad15a75474d49360Darren Krahn  Tpm tpm(&transceiver);
1006a5f9fd320f2bd202653d09bad15a75474d49360Darren Krahn  EXPECT_EQ(TPM_RC_SUCCESS, tpm.StartupSync(TPM_SU_CLEAR, &authorization));
1016a5f9fd320f2bd202653d09bad15a75474d49360Darren Krahn}
1026a5f9fd320f2bd202653d09bad15a75474d49360Darren Krahn
1036a5f9fd320f2bd202653d09bad15a75474d49360Darren KrahnTEST(GeneratorTest, SynchronousCommandWithError) {
1046a5f9fd320f2bd202653d09bad15a75474d49360Darren Krahn  // A hand-rolled TPM2_Startup command.
1056a5f9fd320f2bd202653d09bad15a75474d49360Darren Krahn  std::string expected_command("\x80\x01"          // tag=TPM_ST_NO_SESSIONS
1066a5f9fd320f2bd202653d09bad15a75474d49360Darren Krahn                               "\x00\x00\x00\x0C"  // size=12
1076a5f9fd320f2bd202653d09bad15a75474d49360Darren Krahn                               "\x00\x00\x01\x44"  // code=TPM_CC_Startup
1086a5f9fd320f2bd202653d09bad15a75474d49360Darren Krahn                               "\x00\x00",         // param=TPM_SU_CLEAR
1096a5f9fd320f2bd202653d09bad15a75474d49360Darren Krahn                               12);
1106a5f9fd320f2bd202653d09bad15a75474d49360Darren Krahn  std::string command_response("\x80\x01"           // tag=TPM_ST_NO_SESSIONS
1116a5f9fd320f2bd202653d09bad15a75474d49360Darren Krahn                               "\x00\x00\x00\x0A"   // size=10
1126a5f9fd320f2bd202653d09bad15a75474d49360Darren Krahn                               "\x00\x00\x01\x01",  // code=TPM_RC_FAILURE
1136a5f9fd320f2bd202653d09bad15a75474d49360Darren Krahn                               10);
1146a5f9fd320f2bd202653d09bad15a75474d49360Darren Krahn  StrictMock<MockCommandTransceiver> transceiver;
1156a5f9fd320f2bd202653d09bad15a75474d49360Darren Krahn  EXPECT_CALL(transceiver, SendCommandAndWait(expected_command, _))
11688c9c242d0060034b83173054ed5a8c35078abaaUtkarsh Sanghi      .WillOnce(DoAll(SetArgPointee<1>(command_response),
11788c9c242d0060034b83173054ed5a8c35078abaaUtkarsh Sanghi                      Return(TPM_RC_SUCCESS)));
1186a5f9fd320f2bd202653d09bad15a75474d49360Darren Krahn  StrictMock<MockAuthorizationDelegate> authorization;
1196a5f9fd320f2bd202653d09bad15a75474d49360Darren Krahn  EXPECT_CALL(authorization, GetCommandAuthorization(_, _))
12088c9c242d0060034b83173054ed5a8c35078abaaUtkarsh Sanghi      .WillOnce(Return(true));
1216a5f9fd320f2bd202653d09bad15a75474d49360Darren Krahn  Tpm tpm(&transceiver);
1226a5f9fd320f2bd202653d09bad15a75474d49360Darren Krahn  EXPECT_EQ(TPM_RC_FAILURE, tpm.StartupSync(TPM_SU_CLEAR, &authorization));
1236a5f9fd320f2bd202653d09bad15a75474d49360Darren Krahn}
1246a5f9fd320f2bd202653d09bad15a75474d49360Darren Krahn
1256a5f9fd320f2bd202653d09bad15a75474d49360Darren KrahnTEST(GeneratorTest, SynchronousCommandWithTransceiverError) {
1266a5f9fd320f2bd202653d09bad15a75474d49360Darren Krahn  // A hand-rolled TPM2_Startup command.
1276a5f9fd320f2bd202653d09bad15a75474d49360Darren Krahn  std::string expected_command("\x80\x01"          // tag=TPM_ST_NO_SESSIONS
1286a5f9fd320f2bd202653d09bad15a75474d49360Darren Krahn                               "\x00\x00\x00\x0C"  // size=12
1296a5f9fd320f2bd202653d09bad15a75474d49360Darren Krahn                               "\x00\x00\x01\x44"  // code=TPM_CC_Startup
1306a5f9fd320f2bd202653d09bad15a75474d49360Darren Krahn                               "\x00\x00",         // param=TPM_SU_CLEAR
1316a5f9fd320f2bd202653d09bad15a75474d49360Darren Krahn                               12);
1326a5f9fd320f2bd202653d09bad15a75474d49360Darren Krahn  std::string command_response("\x80\x01"           // tag=TPM_ST_NO_SESSIONS
1336a5f9fd320f2bd202653d09bad15a75474d49360Darren Krahn                               "\x00\x00\x00\x0A"   // size=10
1346a5f9fd320f2bd202653d09bad15a75474d49360Darren Krahn                               "\x00\x00\x00\x00",  // code=TPM_RC_SUCCESS
1356a5f9fd320f2bd202653d09bad15a75474d49360Darren Krahn                               10);
1366a5f9fd320f2bd202653d09bad15a75474d49360Darren Krahn  StrictMock<MockCommandTransceiver> transceiver;
1376a5f9fd320f2bd202653d09bad15a75474d49360Darren Krahn  EXPECT_CALL(transceiver, SendCommandAndWait(expected_command, _))
13888c9c242d0060034b83173054ed5a8c35078abaaUtkarsh Sanghi      .WillOnce(DoAll(SetArgPointee<1>(command_response),
13988c9c242d0060034b83173054ed5a8c35078abaaUtkarsh Sanghi                      Return(TPM_RC_FAILURE)));
1406a5f9fd320f2bd202653d09bad15a75474d49360Darren Krahn  StrictMock<MockAuthorizationDelegate> authorization;
1416a5f9fd320f2bd202653d09bad15a75474d49360Darren Krahn  EXPECT_CALL(authorization, GetCommandAuthorization(_, _))
14288c9c242d0060034b83173054ed5a8c35078abaaUtkarsh Sanghi      .WillOnce(Return(true));
1436a5f9fd320f2bd202653d09bad15a75474d49360Darren Krahn  Tpm tpm(&transceiver);
1446a5f9fd320f2bd202653d09bad15a75474d49360Darren Krahn  EXPECT_EQ(TPM_RC_FAILURE, tpm.StartupSync(TPM_SU_CLEAR, &authorization));
1456a5f9fd320f2bd202653d09bad15a75474d49360Darren Krahn}
1466a5f9fd320f2bd202653d09bad15a75474d49360Darren Krahn
14788c9c242d0060034b83173054ed5a8c35078abaaUtkarsh SanghiTEST(GeneratorTest, SynchronousCommandResponseTest) {
14888c9c242d0060034b83173054ed5a8c35078abaaUtkarsh Sanghi  std::string auth_in(10, 'A');
14988c9c242d0060034b83173054ed5a8c35078abaaUtkarsh Sanghi  std::string auth_out(10, 'B');
15088c9c242d0060034b83173054ed5a8c35078abaaUtkarsh Sanghi  std::string auth_size("\x00\x00\x00\x0A", 4);
15188c9c242d0060034b83173054ed5a8c35078abaaUtkarsh Sanghi  std::string handle_in("\x40\x00\x00\x07", 4);  // primary_handle = TPM_RH_NULL
15288c9c242d0060034b83173054ed5a8c35078abaaUtkarsh Sanghi  std::string handle_out("\x80\x00\x00\x01", 4);  // out_handle
15388c9c242d0060034b83173054ed5a8c35078abaaUtkarsh Sanghi  std::string sensitive("\x00\x05"   // sensitive.size = 5
15488c9c242d0060034b83173054ed5a8c35078abaaUtkarsh Sanghi                        "\x00\x01"   // sensitive.auth.size = 1
15588c9c242d0060034b83173054ed5a8c35078abaaUtkarsh Sanghi                        "\x61"       // sensitive.auth.buffer[0] = 0x65
15688c9c242d0060034b83173054ed5a8c35078abaaUtkarsh Sanghi                        "\x00\x00",  // sensitive.data.size = 0
15788c9c242d0060034b83173054ed5a8c35078abaaUtkarsh Sanghi                        7);
15888c9c242d0060034b83173054ed5a8c35078abaaUtkarsh Sanghi  std::string public_data("\x00\x12"    // public.size = 18
15988c9c242d0060034b83173054ed5a8c35078abaaUtkarsh Sanghi                          "\x00\x25"    // public.type = TPM_ALG_SYMCIPHER
16088c9c242d0060034b83173054ed5a8c35078abaaUtkarsh Sanghi                          "\x00\x0B"    // public.name_alg = SHA256
16188c9c242d0060034b83173054ed5a8c35078abaaUtkarsh Sanghi                          "\x00\x00\x00\x00"
16288c9c242d0060034b83173054ed5a8c35078abaaUtkarsh Sanghi                          "\x00\x00"    // public.auth_policy.size = 0
16388c9c242d0060034b83173054ed5a8c35078abaaUtkarsh Sanghi                          "\x00\x06"    // public.sym.alg = TPM_ALG_AES
16488c9c242d0060034b83173054ed5a8c35078abaaUtkarsh Sanghi                          "\x00\x80"    // public.sym.key_bits = 128
16588c9c242d0060034b83173054ed5a8c35078abaaUtkarsh Sanghi                          "\x00\x43"    // public.sym.mode = TPM_ALG_CFB
16688c9c242d0060034b83173054ed5a8c35078abaaUtkarsh Sanghi                          "\x00\x00",   // public.unique.size = 0
16788c9c242d0060034b83173054ed5a8c35078abaaUtkarsh Sanghi                          20);
16888c9c242d0060034b83173054ed5a8c35078abaaUtkarsh Sanghi  std::string outside("\x00\x00", 2);  // outside_info.size = 0
16988c9c242d0060034b83173054ed5a8c35078abaaUtkarsh Sanghi  std::string pcr_select("\x00\x00\x00\x00", 4);  // pcr_select.size = 0
17088c9c242d0060034b83173054ed5a8c35078abaaUtkarsh Sanghi
17188c9c242d0060034b83173054ed5a8c35078abaaUtkarsh Sanghi  std::string data("\x00\x0F"           // creation_data.size = 15
17288c9c242d0060034b83173054ed5a8c35078abaaUtkarsh Sanghi                   "\x00\x00\x00\x00"   // creation.pcr = 0
17388c9c242d0060034b83173054ed5a8c35078abaaUtkarsh Sanghi                   "\x00\x00"           // creation.digest.size = 0
17488c9c242d0060034b83173054ed5a8c35078abaaUtkarsh Sanghi                   "\x00"               // creation.locality = 0
17588c9c242d0060034b83173054ed5a8c35078abaaUtkarsh Sanghi                   "\x00\x00"           // creation.parent_alg = 0
17688c9c242d0060034b83173054ed5a8c35078abaaUtkarsh Sanghi                   "\x00\x00"           // creation.parent_name.size = 0
17788c9c242d0060034b83173054ed5a8c35078abaaUtkarsh Sanghi                   "\x00\x00"
17888c9c242d0060034b83173054ed5a8c35078abaaUtkarsh Sanghi                   "\x00\x00",          // creation.outside.size = 0
17988c9c242d0060034b83173054ed5a8c35078abaaUtkarsh Sanghi                   17);
18088c9c242d0060034b83173054ed5a8c35078abaaUtkarsh Sanghi  std::string hash("\x00\x01"
18188c9c242d0060034b83173054ed5a8c35078abaaUtkarsh Sanghi                   "\x62", 3);
18288c9c242d0060034b83173054ed5a8c35078abaaUtkarsh Sanghi  std::string ticket("\x80\x02"           // tag = TPM_ST_SESSIONS
18388c9c242d0060034b83173054ed5a8c35078abaaUtkarsh Sanghi                     "\x40\x00\x00\x07"   // parent = TPM_RH_NULL
18488c9c242d0060034b83173054ed5a8c35078abaaUtkarsh Sanghi                     "\x00\x00", 8);
18588c9c242d0060034b83173054ed5a8c35078abaaUtkarsh Sanghi  std::string name("\x00\x03" "KEY", 5);
18688c9c242d0060034b83173054ed5a8c35078abaaUtkarsh Sanghi  std::string parameter_size("\x00\x00\x00\x35", 4);  // param_size = 38
18788c9c242d0060034b83173054ed5a8c35078abaaUtkarsh Sanghi
18888c9c242d0060034b83173054ed5a8c35078abaaUtkarsh Sanghi  std::string command_tag("\x80\x02"           // tag = TPM_ST_SESSIONS
18988c9c242d0060034b83173054ed5a8c35078abaaUtkarsh Sanghi                          "\x00\x00\x00\x3D"   // size = 61
19088c9c242d0060034b83173054ed5a8c35078abaaUtkarsh Sanghi                          "\x00\x00\x01\x31",  // code = TPM_CC_CreatePrimary
19188c9c242d0060034b83173054ed5a8c35078abaaUtkarsh Sanghi                         10);
19288c9c242d0060034b83173054ed5a8c35078abaaUtkarsh Sanghi  std::string response_tag("\x80\x02"           // tag = TPM_ST_SESSIONS
19388c9c242d0060034b83173054ed5a8c35078abaaUtkarsh Sanghi                           "\x00\x00\x00\x51"   // size = 79
19488c9c242d0060034b83173054ed5a8c35078abaaUtkarsh Sanghi                           "\x00\x00\x00\x00",  // rc = TPM_RC_SUCCESS
19588c9c242d0060034b83173054ed5a8c35078abaaUtkarsh Sanghi                           10);
19688c9c242d0060034b83173054ed5a8c35078abaaUtkarsh Sanghi
19788c9c242d0060034b83173054ed5a8c35078abaaUtkarsh Sanghi  std::string expected_command = command_tag + handle_in + auth_size + auth_in +
19888c9c242d0060034b83173054ed5a8c35078abaaUtkarsh Sanghi                                 sensitive + public_data + outside + pcr_select;
19988c9c242d0060034b83173054ed5a8c35078abaaUtkarsh Sanghi  std::string command_response = response_tag + handle_out + parameter_size +
20088c9c242d0060034b83173054ed5a8c35078abaaUtkarsh Sanghi                                 public_data + data + hash + ticket + name +
20188c9c242d0060034b83173054ed5a8c35078abaaUtkarsh Sanghi                                 auth_out;
20288c9c242d0060034b83173054ed5a8c35078abaaUtkarsh Sanghi
20388c9c242d0060034b83173054ed5a8c35078abaaUtkarsh Sanghi  StrictMock<MockCommandTransceiver> transceiver;
20488c9c242d0060034b83173054ed5a8c35078abaaUtkarsh Sanghi  EXPECT_CALL(transceiver, SendCommandAndWait(expected_command, _))
20588c9c242d0060034b83173054ed5a8c35078abaaUtkarsh Sanghi      .WillOnce(DoAll(SetArgPointee<1>(command_response),
20688c9c242d0060034b83173054ed5a8c35078abaaUtkarsh Sanghi                      Return(TPM_RC_SUCCESS)));
20788c9c242d0060034b83173054ed5a8c35078abaaUtkarsh Sanghi  StrictMock<MockAuthorizationDelegate> authorization;
20888c9c242d0060034b83173054ed5a8c35078abaaUtkarsh Sanghi  EXPECT_CALL(authorization, GetCommandAuthorization(_, _))
20988c9c242d0060034b83173054ed5a8c35078abaaUtkarsh Sanghi      .WillOnce(DoAll(SetArgPointee<1>(auth_in), Return(true)));
21088c9c242d0060034b83173054ed5a8c35078abaaUtkarsh Sanghi  EXPECT_CALL(authorization, CheckResponseAuthorization(_, auth_out))
21188c9c242d0060034b83173054ed5a8c35078abaaUtkarsh Sanghi      .WillOnce(Return(true));
21288c9c242d0060034b83173054ed5a8c35078abaaUtkarsh Sanghi  EXPECT_CALL(authorization, EncryptCommandParameter(_))
21388c9c242d0060034b83173054ed5a8c35078abaaUtkarsh Sanghi      .WillOnce(Return(true));
21488c9c242d0060034b83173054ed5a8c35078abaaUtkarsh Sanghi  EXPECT_CALL(authorization, DecryptResponseParameter(_))
21588c9c242d0060034b83173054ed5a8c35078abaaUtkarsh Sanghi      .WillOnce(Return(true));
21688c9c242d0060034b83173054ed5a8c35078abaaUtkarsh Sanghi
21788c9c242d0060034b83173054ed5a8c35078abaaUtkarsh Sanghi  TPM2B_SENSITIVE_CREATE in_sensitive;
21888c9c242d0060034b83173054ed5a8c35078abaaUtkarsh Sanghi  in_sensitive.size = 5;
21988c9c242d0060034b83173054ed5a8c35078abaaUtkarsh Sanghi  in_sensitive.sensitive.user_auth.size = 1;
22088c9c242d0060034b83173054ed5a8c35078abaaUtkarsh Sanghi  in_sensitive.sensitive.user_auth.buffer[0] = 'a';
22188c9c242d0060034b83173054ed5a8c35078abaaUtkarsh Sanghi  in_sensitive.sensitive.data.size = 0;
22288c9c242d0060034b83173054ed5a8c35078abaaUtkarsh Sanghi  TPM2B_PUBLIC in_public;
22388c9c242d0060034b83173054ed5a8c35078abaaUtkarsh Sanghi  in_public.size = 18;
22488c9c242d0060034b83173054ed5a8c35078abaaUtkarsh Sanghi  in_public.public_area.type = TPM_ALG_SYMCIPHER;
22588c9c242d0060034b83173054ed5a8c35078abaaUtkarsh Sanghi  in_public.public_area.name_alg = TPM_ALG_SHA256;
22688c9c242d0060034b83173054ed5a8c35078abaaUtkarsh Sanghi  in_public.public_area.object_attributes = 0;
22788c9c242d0060034b83173054ed5a8c35078abaaUtkarsh Sanghi  in_public.public_area.auth_policy.size = 0;
22888c9c242d0060034b83173054ed5a8c35078abaaUtkarsh Sanghi  in_public.public_area.parameters.sym_detail.sym.algorithm = TPM_ALG_AES;
22988c9c242d0060034b83173054ed5a8c35078abaaUtkarsh Sanghi  in_public.public_area.parameters.sym_detail.sym.key_bits.aes = 128;
23088c9c242d0060034b83173054ed5a8c35078abaaUtkarsh Sanghi  in_public.public_area.parameters.sym_detail.sym.mode.aes = TPM_ALG_CFB;
23188c9c242d0060034b83173054ed5a8c35078abaaUtkarsh Sanghi  in_public.public_area.unique.sym.size = 0;
23288c9c242d0060034b83173054ed5a8c35078abaaUtkarsh Sanghi  TPM2B_DATA outside_info;
23388c9c242d0060034b83173054ed5a8c35078abaaUtkarsh Sanghi  outside_info.size = 0;
23488c9c242d0060034b83173054ed5a8c35078abaaUtkarsh Sanghi  TPML_PCR_SELECTION create_pcr;
23588c9c242d0060034b83173054ed5a8c35078abaaUtkarsh Sanghi  create_pcr.count = 0;
23688c9c242d0060034b83173054ed5a8c35078abaaUtkarsh Sanghi
23788c9c242d0060034b83173054ed5a8c35078abaaUtkarsh Sanghi  TPM_HANDLE key_handle;
23888c9c242d0060034b83173054ed5a8c35078abaaUtkarsh Sanghi  TPM2B_PUBLIC out_public;
23988c9c242d0060034b83173054ed5a8c35078abaaUtkarsh Sanghi  TPM2B_CREATION_DATA creation_data;
24088c9c242d0060034b83173054ed5a8c35078abaaUtkarsh Sanghi  TPM2B_DIGEST creation_hash;
24188c9c242d0060034b83173054ed5a8c35078abaaUtkarsh Sanghi  TPMT_TK_CREATION creation_ticket;
24288c9c242d0060034b83173054ed5a8c35078abaaUtkarsh Sanghi  TPM2B_NAME key_name;
24388c9c242d0060034b83173054ed5a8c35078abaaUtkarsh Sanghi
24488c9c242d0060034b83173054ed5a8c35078abaaUtkarsh Sanghi  Tpm tpm(&transceiver);
24588c9c242d0060034b83173054ed5a8c35078abaaUtkarsh Sanghi  TPM_RC rc = tpm.CreatePrimarySync(trunks::TPM_RH_NULL,
24688c9c242d0060034b83173054ed5a8c35078abaaUtkarsh Sanghi                                    "",
24788c9c242d0060034b83173054ed5a8c35078abaaUtkarsh Sanghi                                    in_sensitive,
24888c9c242d0060034b83173054ed5a8c35078abaaUtkarsh Sanghi                                    in_public,
24988c9c242d0060034b83173054ed5a8c35078abaaUtkarsh Sanghi                                    outside_info,
25088c9c242d0060034b83173054ed5a8c35078abaaUtkarsh Sanghi                                    create_pcr,
25188c9c242d0060034b83173054ed5a8c35078abaaUtkarsh Sanghi                                    &key_handle,
25288c9c242d0060034b83173054ed5a8c35078abaaUtkarsh Sanghi                                    &out_public,
25388c9c242d0060034b83173054ed5a8c35078abaaUtkarsh Sanghi                                    &creation_data,
25488c9c242d0060034b83173054ed5a8c35078abaaUtkarsh Sanghi                                    &creation_hash,
25588c9c242d0060034b83173054ed5a8c35078abaaUtkarsh Sanghi                                    &creation_ticket,
25688c9c242d0060034b83173054ed5a8c35078abaaUtkarsh Sanghi                                    &key_name,
25788c9c242d0060034b83173054ed5a8c35078abaaUtkarsh Sanghi                                    &authorization);
25888c9c242d0060034b83173054ed5a8c35078abaaUtkarsh Sanghi  ASSERT_EQ(rc, TPM_RC_SUCCESS);
25988c9c242d0060034b83173054ed5a8c35078abaaUtkarsh Sanghi  EXPECT_EQ(key_handle, 0x80000001);
26088c9c242d0060034b83173054ed5a8c35078abaaUtkarsh Sanghi  EXPECT_EQ(out_public.size, 18);
26188c9c242d0060034b83173054ed5a8c35078abaaUtkarsh Sanghi  EXPECT_EQ(creation_data.size, 15);
26288c9c242d0060034b83173054ed5a8c35078abaaUtkarsh Sanghi  EXPECT_EQ(creation_hash.size, 1);
26388c9c242d0060034b83173054ed5a8c35078abaaUtkarsh Sanghi  EXPECT_EQ(creation_hash.buffer[0], 'b');
26488c9c242d0060034b83173054ed5a8c35078abaaUtkarsh Sanghi  EXPECT_EQ(creation_ticket.tag, 0x8002);
26588c9c242d0060034b83173054ed5a8c35078abaaUtkarsh Sanghi  EXPECT_EQ(creation_ticket.hierarchy, 0x40000007);
26688c9c242d0060034b83173054ed5a8c35078abaaUtkarsh Sanghi  EXPECT_EQ(creation_ticket.digest.size, 0);
26788c9c242d0060034b83173054ed5a8c35078abaaUtkarsh Sanghi  EXPECT_EQ(key_name.size, 3);
26888c9c242d0060034b83173054ed5a8c35078abaaUtkarsh Sanghi  EXPECT_EQ(key_name.name[0], 'K');
26988c9c242d0060034b83173054ed5a8c35078abaaUtkarsh Sanghi  EXPECT_EQ(key_name.name[1], 'E');
27088c9c242d0060034b83173054ed5a8c35078abaaUtkarsh Sanghi  EXPECT_EQ(key_name.name[2], 'Y');
27188c9c242d0060034b83173054ed5a8c35078abaaUtkarsh Sanghi}
27288c9c242d0060034b83173054ed5a8c35078abaaUtkarsh Sanghi
273a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn// A fixture for asynchronous command flow tests.
274a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahnclass CommandFlowTest : public testing::Test {
275a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn public:
276a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn  CommandFlowTest() : response_code_(TPM_RC_SUCCESS) {}
277a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn  virtual ~CommandFlowTest() {}
278a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn
279a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn  void StartupCallback(TPM_RC response_code) {
280a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn    response_code_ = response_code;
281a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn  }
282a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn
283a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn  void CertifyCallback(TPM_RC response_code,
2846a5f9fd320f2bd202653d09bad15a75474d49360Darren Krahn                       const TPM2B_ATTEST& certify_info,
2856a5f9fd320f2bd202653d09bad15a75474d49360Darren Krahn                       const TPMT_SIGNATURE& signature) {
286a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn    response_code_ = response_code;
287a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn    signed_data_ = StringFrom_TPM2B_ATTEST(certify_info);
288a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn    signature_ = StringFrom_TPM2B_PUBLIC_KEY_RSA(
289a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn        signature.signature.rsassa.sig);
290a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn  }
291a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn
292a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn protected:
293a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn  void Run() {
294a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn    base::RunLoop run_loop;
295a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn    run_loop.RunUntilIdle();
296a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn  }
297a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn
298a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn  base::MessageLoop message_loop_;
299a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn  TPM_RC response_code_;
300a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn  std::string signature_;
301a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn  std::string signed_data_;
302a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn};
303a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn
304a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn// A functor for posting command responses. This is different than invoking the
305a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn// callback directly (e.g. via InvokeArgument) in that the original call will
306a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn// return before the response callback is invoked. This more closely matches how
307a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn// this code is expected to work when integrated.
308a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahnclass PostResponse {
309a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn public:
310a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn  explicit PostResponse(const std::string& response) : response_(response) {}
311a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn  void operator() (const base::Callback<void(const std::string&)>& callback) {
312a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn    base::MessageLoop::current()->PostTask(FROM_HERE,
313a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn                                           base::Bind(callback, response_));
314a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn  }
315a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn
316a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn private:
317a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn  std::string response_;
318a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn};
319a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn
320a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn// A functor to handle fake encryption / decryption of parameters.
321a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahnclass Encryptor {
322a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn public:
323a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn  Encryptor(const std::string& expected_input, const std::string& output)
324a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn      : expected_input_(expected_input),
325a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn        output_(output) {}
326a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn  bool operator() (std::string* value) {
327a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn    EXPECT_EQ(expected_input_, *value);
328a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn    value->assign(output_);
329a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn    return true;
330a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn  }
331a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn
332a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn private:
333a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn  std::string expected_input_;
334a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn  std::string output_;
335a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn};
336a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn
337a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren KrahnTEST_F(CommandFlowTest, SimpleCommandFlow) {
33858a6ad9e4e634f7dbafaea963ad43076e0ed1733Darren Krahn  // A hand-rolled TPM2_Startup command.
339a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn  std::string expected_command("\x80\x01"          // tag=TPM_ST_NO_SESSIONS
340a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn                               "\x00\x00\x00\x0C"  // size=12
341a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn                               "\x00\x00\x01\x44"  // code=TPM_CC_Startup
342a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn                               "\x00\x00",         // param=TPM_SU_CLEAR
343a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn                               12);
344a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn  std::string command_response("\x80\x01"           // tag=TPM_ST_NO_SESSIONS
345a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn                               "\x00\x00\x00\x0A"   // size=10
346a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn                               "\x00\x00\x00\x00",  // code=TPM_RC_SUCCESS
347a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn                               10);
348a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn  StrictMock<MockCommandTransceiver> transceiver;
349a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn  EXPECT_CALL(transceiver, SendCommand(expected_command, _))
35088c9c242d0060034b83173054ed5a8c35078abaaUtkarsh Sanghi      .WillOnce(WithArg<1>(Invoke(PostResponse(command_response))));
351a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn  StrictMock<MockAuthorizationDelegate> authorization;
352a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn  EXPECT_CALL(authorization, GetCommandAuthorization(_, _))
35388c9c242d0060034b83173054ed5a8c35078abaaUtkarsh Sanghi      .WillOnce(Return(true));
354a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn  Tpm tpm(&transceiver);
355a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn  response_code_ = TPM_RC_FAILURE;
356a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn  tpm.Startup(TPM_SU_CLEAR,
357a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn              &authorization,
358a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn              base::Bind(&CommandFlowTest::StartupCallback,
359a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn                         base::Unretained(this)));
360a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn  Run();
361a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn  EXPECT_EQ(TPM_RC_SUCCESS, response_code_);
362a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn}
363a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn
364a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren KrahnTEST_F(CommandFlowTest, SimpleCommandFlowWithError) {
365a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn  // A hand-rolled TPM2_Startup command.
366a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn  std::string expected_command("\x80\x01"          // tag=TPM_ST_NO_SESSIONS
367a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn                               "\x00\x00\x00\x0C"  // size=12
368a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn                               "\x00\x00\x01\x44"  // code=TPM_CC_Startup
369a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn                               "\x00\x00",         // param=TPM_SU_CLEAR
370a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn                               12);
371a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn  std::string command_response("\x80\x01"           // tag=TPM_ST_NO_SESSIONS
372a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn                               "\x00\x00\x00\x0A"   // size=10
373a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn                               "\x00\x00\x01\x01",  // code=TPM_RC_FAILURE
374a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn                               10);
375a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn  StrictMock<MockCommandTransceiver> transceiver;
376a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn  EXPECT_CALL(transceiver, SendCommand(expected_command, _))
37788c9c242d0060034b83173054ed5a8c35078abaaUtkarsh Sanghi      .WillOnce(WithArg<1>(Invoke(PostResponse(command_response))));
378a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn  StrictMock<MockAuthorizationDelegate> authorization;
379a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn  EXPECT_CALL(authorization, GetCommandAuthorization(_, _))
38088c9c242d0060034b83173054ed5a8c35078abaaUtkarsh Sanghi      .WillOnce(Return(true));
381a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn  Tpm tpm(&transceiver);
382a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn  tpm.Startup(TPM_SU_CLEAR,
383a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn              &authorization,
384a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn              base::Bind(&CommandFlowTest::StartupCallback,
385a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn                         base::Unretained(this)));
386a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn  Run();
387a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn  EXPECT_EQ(TPM_RC_FAILURE, response_code_);
388a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn}
389a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn
390a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn// This test is designed to get good coverage of the different types of code
391a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn// generated for command / response processing. It covers:
392a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn// - input handles
393a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn// - authorization
394a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn// - multiple input and output parameters
395a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn// - parameter encryption and decryption
396a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren KrahnTEST_F(CommandFlowTest, FullCommandFlow) {
397a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn  // A hand-rolled TPM2_Certify command.
398a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn  std::string auth_in(10, 'A');
399a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn  std::string auth_out(20, 'B');
400a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn  std::string user_data("\x00\x0C" "ct_user_data", 14);
401a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn  std::string scheme("\x00\x10", 2);  // scheme=TPM_ALG_NULL
402a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn  std::string signed_data("\x00\x0E" "ct_signed_data", 16);
403a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn  std::string signature("\x00\x14"    // sig_scheme=RSASSA
404a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn                        "\x00\x0B"    // hash_scheme=SHA256
405a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn                        "\x00\x09"    // signature size
406a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn                        "signature",  // signature bytes
407a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn                        15);
408a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn  std::string expected_command("\x80\x02"           // tag=TPM_ST_SESSIONS
409a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn                               "\x00\x00\x00\x30"   // size=48
410a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn                               "\x00\x00\x01\x48"   // code=TPM_CC_Certify
411a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn                               "\x11\x22\x33\x44"   // @objectHandle
412a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn                               "\x55\x66\x77\x88"   // @signHandle
413a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn                               "\x00\x00\x00\x0A",  // auth_size=10
414a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn                               22);
415a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn  expected_command += auth_in + user_data + scheme;
416a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn  std::string command_response("\x80\x02"           // tag=TPM_ST_SESSIONS
417a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn                               "\x00\x00\x00\x41"   // size=65
418a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn                               "\x00\x00\x00\x00"   // code=TPM_RC_SUCCESS
419a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn                               "\x00\x00\x00\x1F",  // param_size=31
420a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn                               14);
421a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn  command_response += signed_data + signature + auth_out;
422a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn
423a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn  StrictMock<MockCommandTransceiver> transceiver;
424a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn  EXPECT_CALL(transceiver, SendCommand(expected_command, _))
42588c9c242d0060034b83173054ed5a8c35078abaaUtkarsh Sanghi      .WillOnce(WithArg<1>(Invoke(PostResponse(command_response))));
426a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn  StrictMock<MockAuthorizationDelegate> authorization;
427a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn  EXPECT_CALL(authorization, GetCommandAuthorization(_, _))
42888c9c242d0060034b83173054ed5a8c35078abaaUtkarsh Sanghi      .WillOnce(DoAll(SetArgPointee<1>(auth_in), Return(true)));
429a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn  EXPECT_CALL(authorization, CheckResponseAuthorization(_, auth_out))
43088c9c242d0060034b83173054ed5a8c35078abaaUtkarsh Sanghi      .WillOnce(Return(true));
431a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn  EXPECT_CALL(authorization, EncryptCommandParameter(_))
43288c9c242d0060034b83173054ed5a8c35078abaaUtkarsh Sanghi      .WillOnce(Invoke(Encryptor("pt_user_data", "ct_user_data")));
433a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn  EXPECT_CALL(authorization, DecryptResponseParameter(_))
43488c9c242d0060034b83173054ed5a8c35078abaaUtkarsh Sanghi      .WillOnce(Invoke(Encryptor("ct_signed_data", "pt_signed_data")));
435a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn
436a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn  TPMT_SIG_SCHEME null_scheme;
437a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn  null_scheme.scheme = TPM_ALG_NULL;
438a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn  null_scheme.details.rsassa.hash_alg = TPM_ALG_SHA256;
439a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn  Tpm tpm(&transceiver);
440a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn  tpm.Certify(0x11223344u, "object_handle",
441a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn              0x55667788u, "sign_handle",
442a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn              Make_TPM2B_DATA("pt_user_data"),
443a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn              null_scheme,
444a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn              &authorization,
445a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn              base::Bind(&CommandFlowTest::CertifyCallback,
446a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn                         base::Unretained(this)));
447a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn  Run();
448a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn  ASSERT_EQ(TPM_RC_SUCCESS, response_code_);
449a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn  EXPECT_EQ("pt_signed_data", signed_data_);
450a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn  EXPECT_EQ("signature", signature_);
451a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn}
452a4118a03f3a3e910d9e6db9c06b2d93ca85ddd0dDarren Krahn
45387496dd0090ac4f9188297e05573207db41ba2b6Darren Krahn}  // namespace trunks
454