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