1bbef5dff2b94fef72012e721cd6124cd87621af4Utkarsh Sanghi//
2bbef5dff2b94fef72012e721cd6124cd87621af4Utkarsh Sanghi// Copyright (C) 2014 The Android Open Source Project
3bbef5dff2b94fef72012e721cd6124cd87621af4Utkarsh Sanghi//
4bbef5dff2b94fef72012e721cd6124cd87621af4Utkarsh Sanghi// Licensed under the Apache License, Version 2.0 (the "License");
5bbef5dff2b94fef72012e721cd6124cd87621af4Utkarsh Sanghi// you may not use this file except in compliance with the License.
6bbef5dff2b94fef72012e721cd6124cd87621af4Utkarsh Sanghi// You may obtain a copy of the License at
7bbef5dff2b94fef72012e721cd6124cd87621af4Utkarsh Sanghi//
8bbef5dff2b94fef72012e721cd6124cd87621af4Utkarsh Sanghi//      http://www.apache.org/licenses/LICENSE-2.0
9bbef5dff2b94fef72012e721cd6124cd87621af4Utkarsh Sanghi//
10bbef5dff2b94fef72012e721cd6124cd87621af4Utkarsh Sanghi// Unless required by applicable law or agreed to in writing, software
11bbef5dff2b94fef72012e721cd6124cd87621af4Utkarsh Sanghi// distributed under the License is distributed on an "AS IS" BASIS,
12bbef5dff2b94fef72012e721cd6124cd87621af4Utkarsh Sanghi// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13bbef5dff2b94fef72012e721cd6124cd87621af4Utkarsh Sanghi// See the License for the specific language governing permissions and
14bbef5dff2b94fef72012e721cd6124cd87621af4Utkarsh Sanghi// limitations under the License.
15bbef5dff2b94fef72012e721cd6124cd87621af4Utkarsh Sanghi//
164261114797a2793bae83fbabe0459cc465203dd2Utkarsh Sanghi
174261114797a2793bae83fbabe0459cc465203dd2Utkarsh Sanghi#include <string>
184261114797a2793bae83fbabe0459cc465203dd2Utkarsh Sanghi
194261114797a2793bae83fbabe0459cc465203dd2Utkarsh Sanghi#include <gtest/gtest.h>
204261114797a2793bae83fbabe0459cc465203dd2Utkarsh Sanghi
21343cb530db4edbc0f09718af0a96ddb6c5430b18Utkarsh Sanghi#include "trunks/hmac_authorization_delegate.h"
22343cb530db4edbc0f09718af0a96ddb6c5430b18Utkarsh Sanghi
234261114797a2793bae83fbabe0459cc465203dd2Utkarsh Sanghinamespace trunks {
244261114797a2793bae83fbabe0459cc465203dd2Utkarsh Sanghi
25a19238f46d4341489fd1d3140df1bb09bdbd8f01Darren KrahnTEST(HmacAuthorizationDelegateTest, UninitializedSessionTest) {
260adc864900a88490fe92897438e13f00940b69b0Utkarsh Sanghi  HmacAuthorizationDelegate delegate;
274261114797a2793bae83fbabe0459cc465203dd2Utkarsh Sanghi  std::string dummy;
284261114797a2793bae83fbabe0459cc465203dd2Utkarsh Sanghi  std::string p_hash("test");
291aeb5969d4f286e36fe88152ad8c96cff668c25fDarren Krahn  EXPECT_FALSE(delegate.GetCommandAuthorization(p_hash, false, false, &dummy));
309caf492818a4cc51ba471534d3fcaa84c9ce0278Darren Krahn  EXPECT_EQ(0u, dummy.size());
311aeb5969d4f286e36fe88152ad8c96cff668c25fDarren Krahn  EXPECT_FALSE(delegate.CheckResponseAuthorization(p_hash, dummy));
321aeb5969d4f286e36fe88152ad8c96cff668c25fDarren Krahn  EXPECT_FALSE(delegate.EncryptCommandParameter(&dummy));
331aeb5969d4f286e36fe88152ad8c96cff668c25fDarren Krahn  EXPECT_FALSE(delegate.DecryptResponseParameter(&dummy));
344261114797a2793bae83fbabe0459cc465203dd2Utkarsh Sanghi}
354261114797a2793bae83fbabe0459cc465203dd2Utkarsh Sanghi
36a19238f46d4341489fd1d3140df1bb09bdbd8f01Darren KrahnTEST(HmacAuthorizationDelegateTest, SessionKeyTest) {
370adc864900a88490fe92897438e13f00940b69b0Utkarsh Sanghi  HmacAuthorizationDelegate delegate;
384261114797a2793bae83fbabe0459cc465203dd2Utkarsh Sanghi  TPM2B_NONCE nonce;
394261114797a2793bae83fbabe0459cc465203dd2Utkarsh Sanghi  nonce.size = kAesKeySize;
404261114797a2793bae83fbabe0459cc465203dd2Utkarsh Sanghi  memset(nonce.buffer, 0, nonce.size);
414261114797a2793bae83fbabe0459cc465203dd2Utkarsh Sanghi  TPM_HANDLE dummy_handle = HMAC_SESSION_FIRST;
421aeb5969d4f286e36fe88152ad8c96cff668c25fDarren Krahn  EXPECT_TRUE(delegate.InitSession(dummy_handle, nonce, nonce, std::string(),
431aeb5969d4f286e36fe88152ad8c96cff668c25fDarren Krahn                                   std::string(), false));
449caf492818a4cc51ba471534d3fcaa84c9ce0278Darren Krahn  EXPECT_EQ(0u, delegate.session_key_.size());
454261114797a2793bae83fbabe0459cc465203dd2Utkarsh Sanghi
464261114797a2793bae83fbabe0459cc465203dd2Utkarsh Sanghi  std::string dummy_auth = std::string("authorization");
474261114797a2793bae83fbabe0459cc465203dd2Utkarsh Sanghi  std::string dummy_salt = std::string("salt");
481aeb5969d4f286e36fe88152ad8c96cff668c25fDarren Krahn  EXPECT_TRUE(delegate.InitSession(dummy_handle, nonce, nonce, dummy_salt,
491aeb5969d4f286e36fe88152ad8c96cff668c25fDarren Krahn                                   dummy_auth, false));
501aeb5969d4f286e36fe88152ad8c96cff668c25fDarren Krahn  EXPECT_EQ(kHashDigestSize, delegate.session_key_.size());
514261114797a2793bae83fbabe0459cc465203dd2Utkarsh Sanghi  // TODO(usanghi): Use TCG TPM2.0 test vectors when available.
524dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn  std::string expected_key(
534dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn      "\xfb\x2f\x3c\x33\x65\x3e\xdc\x47"
544dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn      "\xda\xbe\x4e\xb7\xf4\x6c\x19\x4d"
554dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn      "\xea\x50\xb2\x11\x54\x45\x32\x73"
564dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn      "\x47\x38\xef\xb3\x4a\x82\x29\x94",
574dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn      kHashDigestSize);
581aeb5969d4f286e36fe88152ad8c96cff668c25fDarren Krahn  EXPECT_EQ(0, expected_key.compare(delegate.session_key_));
594261114797a2793bae83fbabe0459cc465203dd2Utkarsh Sanghi}
604261114797a2793bae83fbabe0459cc465203dd2Utkarsh Sanghi
61a19238f46d4341489fd1d3140df1bb09bdbd8f01Darren KrahnTEST(HmacAuthorizationDelegateTest, EncryptDecryptTest) {
620adc864900a88490fe92897438e13f00940b69b0Utkarsh Sanghi  HmacAuthorizationDelegate delegate;
634261114797a2793bae83fbabe0459cc465203dd2Utkarsh Sanghi  std::string plaintext_parameter("parameter");
644261114797a2793bae83fbabe0459cc465203dd2Utkarsh Sanghi  std::string encrypted_parameter(plaintext_parameter);
651aeb5969d4f286e36fe88152ad8c96cff668c25fDarren Krahn  // Test with session not initialized.
661aeb5969d4f286e36fe88152ad8c96cff668c25fDarren Krahn  EXPECT_FALSE(delegate.EncryptCommandParameter(&encrypted_parameter));
671aeb5969d4f286e36fe88152ad8c96cff668c25fDarren Krahn  EXPECT_FALSE(delegate.DecryptResponseParameter(&encrypted_parameter));
681aeb5969d4f286e36fe88152ad8c96cff668c25fDarren Krahn  // Test with encryption not enabled.
694261114797a2793bae83fbabe0459cc465203dd2Utkarsh Sanghi  TPM_HANDLE dummy_handle = HMAC_SESSION_FIRST;
704261114797a2793bae83fbabe0459cc465203dd2Utkarsh Sanghi  TPM2B_NONCE nonce;
714261114797a2793bae83fbabe0459cc465203dd2Utkarsh Sanghi  nonce.size = kAesKeySize;
7202135c88d5400e674ba2835ac60a54ec01c5e90fUtkarsh Sanghi  std::string salt("salt");
731aeb5969d4f286e36fe88152ad8c96cff668c25fDarren Krahn  ASSERT_TRUE(delegate.InitSession(dummy_handle, nonce, nonce, salt,
741aeb5969d4f286e36fe88152ad8c96cff668c25fDarren Krahn                                   std::string(), false));
751aeb5969d4f286e36fe88152ad8c96cff668c25fDarren Krahn  EXPECT_TRUE(delegate.EncryptCommandParameter(&encrypted_parameter));
761aeb5969d4f286e36fe88152ad8c96cff668c25fDarren Krahn  EXPECT_EQ(0, plaintext_parameter.compare(encrypted_parameter));
771aeb5969d4f286e36fe88152ad8c96cff668c25fDarren Krahn  EXPECT_TRUE(delegate.DecryptResponseParameter(&encrypted_parameter));
781aeb5969d4f286e36fe88152ad8c96cff668c25fDarren Krahn  EXPECT_EQ(0, plaintext_parameter.compare(encrypted_parameter));
791aeb5969d4f286e36fe88152ad8c96cff668c25fDarren Krahn  // Test with encryption enabled.
801aeb5969d4f286e36fe88152ad8c96cff668c25fDarren Krahn  ASSERT_TRUE(delegate.InitSession(dummy_handle, nonce, nonce, salt,
811aeb5969d4f286e36fe88152ad8c96cff668c25fDarren Krahn                                   std::string(), true));
821aeb5969d4f286e36fe88152ad8c96cff668c25fDarren Krahn  EXPECT_TRUE(delegate.EncryptCommandParameter(&encrypted_parameter));
831aeb5969d4f286e36fe88152ad8c96cff668c25fDarren Krahn  EXPECT_NE(0, plaintext_parameter.compare(encrypted_parameter));
84e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh Sanghi  // Calling EncryptCommandParameter regenerated the caller_nonce.
85e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh Sanghi  // We need to manually switch tpm_nonce and caller_nonce to ensure
86e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh Sanghi  // that DecryptResponseParameter has the correct nonces.
87e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh Sanghi  delegate.tpm_nonce_ = delegate.caller_nonce_;
88e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh Sanghi  delegate.caller_nonce_ = nonce;
891aeb5969d4f286e36fe88152ad8c96cff668c25fDarren Krahn  EXPECT_TRUE(delegate.DecryptResponseParameter(&encrypted_parameter));
901aeb5969d4f286e36fe88152ad8c96cff668c25fDarren Krahn  EXPECT_EQ(0, plaintext_parameter.compare(encrypted_parameter));
914261114797a2793bae83fbabe0459cc465203dd2Utkarsh Sanghi}
924261114797a2793bae83fbabe0459cc465203dd2Utkarsh Sanghi
931aeb5969d4f286e36fe88152ad8c96cff668c25fDarren Krahnclass HmacAuthorizationDelegateFixture : public testing::Test {
941aeb5969d4f286e36fe88152ad8c96cff668c25fDarren Krahn public:
951aeb5969d4f286e36fe88152ad8c96cff668c25fDarren Krahn  HmacAuthorizationDelegateFixture() {}
961aeb5969d4f286e36fe88152ad8c96cff668c25fDarren Krahn  ~HmacAuthorizationDelegateFixture() override {}
971aeb5969d4f286e36fe88152ad8c96cff668c25fDarren Krahn
98887ccbcc4db5fa0b5221018296aa49b86a5ac26fUtkarsh Sanghi  void SetUp() override {
991aeb5969d4f286e36fe88152ad8c96cff668c25fDarren Krahn    session_handle_ = HMAC_SESSION_FIRST;
1001aeb5969d4f286e36fe88152ad8c96cff668c25fDarren Krahn    session_nonce_.size = kAesKeySize;
1011aeb5969d4f286e36fe88152ad8c96cff668c25fDarren Krahn    memset(session_nonce_.buffer, 0, kAesKeySize);
1021aeb5969d4f286e36fe88152ad8c96cff668c25fDarren Krahn    ASSERT_TRUE(delegate_.InitSession(session_handle_,
1031aeb5969d4f286e36fe88152ad8c96cff668c25fDarren Krahn                                      session_nonce_,  // TPM nonce.
1041aeb5969d4f286e36fe88152ad8c96cff668c25fDarren Krahn                                      session_nonce_,  // Caller nonce.
1051aeb5969d4f286e36fe88152ad8c96cff668c25fDarren Krahn                                      std::string(),   // Salt.
1061aeb5969d4f286e36fe88152ad8c96cff668c25fDarren Krahn                                      std::string(),   // Bind auth value.
1071aeb5969d4f286e36fe88152ad8c96cff668c25fDarren Krahn                                      false));         // Enable encryption.
1081aeb5969d4f286e36fe88152ad8c96cff668c25fDarren Krahn  }
1091aeb5969d4f286e36fe88152ad8c96cff668c25fDarren Krahn
1101aeb5969d4f286e36fe88152ad8c96cff668c25fDarren Krahn protected:
1111aeb5969d4f286e36fe88152ad8c96cff668c25fDarren Krahn  TPM_HANDLE session_handle_;
1121aeb5969d4f286e36fe88152ad8c96cff668c25fDarren Krahn  TPM2B_NONCE session_nonce_;
1131aeb5969d4f286e36fe88152ad8c96cff668c25fDarren Krahn  HmacAuthorizationDelegate delegate_;
1141aeb5969d4f286e36fe88152ad8c96cff668c25fDarren Krahn};
1151aeb5969d4f286e36fe88152ad8c96cff668c25fDarren Krahn
116e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh SanghiTEST_F(HmacAuthorizationDelegateFixture, NonceRegenerationTest) {
117e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh Sanghi  ASSERT_TRUE(delegate_.InitSession(session_handle_,
118e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh Sanghi                                    session_nonce_,  // TPM nonce.
119e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh Sanghi                                    session_nonce_,  // Caller nonce.
120e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh Sanghi                                    std::string(),   // Salt.
121e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh Sanghi                                    std::string(),   // Bind auth value.
122e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh Sanghi                                    true));          // Enable encryption.
123e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh Sanghi  TPM2B_NONCE original_nonce = session_nonce_;
124e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh Sanghi  EXPECT_EQ(delegate_.caller_nonce_.size, original_nonce.size);
1254dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn  EXPECT_EQ(0, memcmp(delegate_.caller_nonce_.buffer, original_nonce.buffer,
126e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh Sanghi                      original_nonce.size));
127e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh Sanghi  // First we check that performing GetCommandAuthorization resets the nonce.
128e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh Sanghi  std::string command_hash;
129e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh Sanghi  std::string authorization;
130a7174e9848a6cfadda5eb1d8d312daa2c12a65a2Utkarsh Sanghi  TPMS_AUTH_COMMAND auth_command;
131e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh Sanghi  EXPECT_TRUE(delegate_.GetCommandAuthorization(command_hash, false, false,
132e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh Sanghi                                                &authorization));
1334dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn  EXPECT_EQ(TPM_RC_SUCCESS,
1344dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn            Parse_TPMS_AUTH_COMMAND(&authorization, &auth_command, nullptr));
135e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh Sanghi  EXPECT_EQ(delegate_.caller_nonce_.size, original_nonce.size);
136a7174e9848a6cfadda5eb1d8d312daa2c12a65a2Utkarsh Sanghi  EXPECT_EQ(auth_command.nonce.size, original_nonce.size);
1374dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn  EXPECT_NE(0, memcmp(delegate_.caller_nonce_.buffer, original_nonce.buffer,
138e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh Sanghi                      original_nonce.size));
1394dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn  EXPECT_EQ(0, memcmp(delegate_.caller_nonce_.buffer, auth_command.nonce.buffer,
140a7174e9848a6cfadda5eb1d8d312daa2c12a65a2Utkarsh Sanghi                      auth_command.nonce.size));
141e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh Sanghi  // Now we check that GetCommandAuthorization does not reset nonce
142e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh Sanghi  // when EncryptCommandParameter is called first.
143e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh Sanghi  original_nonce = delegate_.caller_nonce_;
144e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh Sanghi  std::string parameter;
145e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh Sanghi  EXPECT_TRUE(delegate_.EncryptCommandParameter(&parameter));
146e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh Sanghi  EXPECT_EQ(delegate_.caller_nonce_.size, original_nonce.size);
1474dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn  EXPECT_NE(0, memcmp(delegate_.caller_nonce_.buffer, original_nonce.buffer,
148e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh Sanghi                      original_nonce.size));
149a7174e9848a6cfadda5eb1d8d312daa2c12a65a2Utkarsh Sanghi  EXPECT_TRUE(delegate_.nonce_generated_);
150e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh Sanghi  original_nonce = delegate_.caller_nonce_;
151e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh Sanghi  EXPECT_TRUE(delegate_.GetCommandAuthorization(command_hash, false, false,
152e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh Sanghi                                                &authorization));
1534dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn  EXPECT_EQ(TPM_RC_SUCCESS,
1544dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn            Parse_TPMS_AUTH_COMMAND(&authorization, &auth_command, nullptr));
155e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh Sanghi  EXPECT_EQ(delegate_.caller_nonce_.size, original_nonce.size);
156a7174e9848a6cfadda5eb1d8d312daa2c12a65a2Utkarsh Sanghi  EXPECT_EQ(auth_command.nonce.size, original_nonce.size);
1574dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn  EXPECT_EQ(0, memcmp(delegate_.caller_nonce_.buffer, original_nonce.buffer,
158e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh Sanghi                      original_nonce.size));
1594dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn  EXPECT_EQ(0, memcmp(delegate_.caller_nonce_.buffer, auth_command.nonce.buffer,
160a7174e9848a6cfadda5eb1d8d312daa2c12a65a2Utkarsh Sanghi                      auth_command.nonce.size));
161e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh Sanghi}
162e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh Sanghi
1631aeb5969d4f286e36fe88152ad8c96cff668c25fDarren KrahnTEST_F(HmacAuthorizationDelegateFixture, CommandAuthTest) {
1644261114797a2793bae83fbabe0459cc465203dd2Utkarsh Sanghi  std::string command_hash;
1654261114797a2793bae83fbabe0459cc465203dd2Utkarsh Sanghi  std::string authorization;
1661aeb5969d4f286e36fe88152ad8c96cff668c25fDarren Krahn  EXPECT_TRUE(delegate_.GetCommandAuthorization(command_hash, false, false,
1671aeb5969d4f286e36fe88152ad8c96cff668c25fDarren Krahn                                                &authorization));
1684261114797a2793bae83fbabe0459cc465203dd2Utkarsh Sanghi  TPMS_AUTH_COMMAND auth_command;
1694261114797a2793bae83fbabe0459cc465203dd2Utkarsh Sanghi  std::string auth_bytes;
1704dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn  EXPECT_EQ(TPM_RC_SUCCESS, Parse_TPMS_AUTH_COMMAND(
1714dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn                                &authorization, &auth_command, &auth_bytes));
1721aeb5969d4f286e36fe88152ad8c96cff668c25fDarren Krahn  EXPECT_EQ(auth_command.session_handle, session_handle_);
1731aeb5969d4f286e36fe88152ad8c96cff668c25fDarren Krahn  EXPECT_EQ(auth_command.nonce.size, session_nonce_.size);
1741aeb5969d4f286e36fe88152ad8c96cff668c25fDarren Krahn  EXPECT_EQ(kContinueSession, auth_command.session_attributes);
1751aeb5969d4f286e36fe88152ad8c96cff668c25fDarren Krahn  EXPECT_EQ(kHashDigestSize, auth_command.hmac.size);
1764261114797a2793bae83fbabe0459cc465203dd2Utkarsh Sanghi}
1774261114797a2793bae83fbabe0459cc465203dd2Utkarsh Sanghi
1781aeb5969d4f286e36fe88152ad8c96cff668c25fDarren KrahnTEST_F(HmacAuthorizationDelegateFixture, ResponseAuthTest) {
1794261114797a2793bae83fbabe0459cc465203dd2Utkarsh Sanghi  TPMS_AUTH_RESPONSE auth_response;
1804261114797a2793bae83fbabe0459cc465203dd2Utkarsh Sanghi  auth_response.session_attributes = kContinueSession;
1814261114797a2793bae83fbabe0459cc465203dd2Utkarsh Sanghi  auth_response.nonce.size = kAesKeySize;
1824261114797a2793bae83fbabe0459cc465203dd2Utkarsh Sanghi  memset(auth_response.nonce.buffer, 0, kAesKeySize);
1834261114797a2793bae83fbabe0459cc465203dd2Utkarsh Sanghi  auth_response.hmac.size = kHashDigestSize;
1844261114797a2793bae83fbabe0459cc465203dd2Utkarsh Sanghi  // TODO(usanghi): Use TCG TPM2.0 test vectors when available.
1854dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn  uint8_t hmac_buffer[kHashDigestSize] = {
1864dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn      0x37, 0x69, 0xaf, 0x12, 0xff, 0x4d, 0xbf, 0x44, 0xe5, 0x16, 0xa2,
1874dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn      0x2d, 0x1d, 0x05, 0x12, 0xe8, 0xbc, 0x42, 0x51, 0x6d, 0x59, 0xe8,
1884dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn      0xbf, 0x40, 0x1e, 0xa3, 0x46, 0xa4, 0xd6, 0x0d, 0xcc, 0xf7};
1894261114797a2793bae83fbabe0459cc465203dd2Utkarsh Sanghi  memcpy(auth_response.hmac.buffer, hmac_buffer, kHashDigestSize);
1904261114797a2793bae83fbabe0459cc465203dd2Utkarsh Sanghi  std::string response_hash;
1914261114797a2793bae83fbabe0459cc465203dd2Utkarsh Sanghi  std::string authorization;
1924dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn  EXPECT_EQ(TPM_RC_SUCCESS,
1934dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn            Serialize_TPMS_AUTH_RESPONSE(auth_response, &authorization));
1944dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn  EXPECT_TRUE(
1954dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn      delegate_.CheckResponseAuthorization(response_hash, authorization));
1961aeb5969d4f286e36fe88152ad8c96cff668c25fDarren Krahn}
1971aeb5969d4f286e36fe88152ad8c96cff668c25fDarren Krahn
1981aeb5969d4f286e36fe88152ad8c96cff668c25fDarren KrahnTEST_F(HmacAuthorizationDelegateFixture, SessionAttributes) {
1994dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn  const uint8_t kDecryptSession = 1 << 5;
2004dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn  const uint8_t kEncryptSession = 1 << 6;
2011aeb5969d4f286e36fe88152ad8c96cff668c25fDarren Krahn
2021aeb5969d4f286e36fe88152ad8c96cff668c25fDarren Krahn  // Encryption disabled and not possible for command.
2031aeb5969d4f286e36fe88152ad8c96cff668c25fDarren Krahn  std::string authorization;
2041aeb5969d4f286e36fe88152ad8c96cff668c25fDarren Krahn  EXPECT_TRUE(delegate_.GetCommandAuthorization(std::string(), false, false,
2051aeb5969d4f286e36fe88152ad8c96cff668c25fDarren Krahn                                                &authorization));
2061aeb5969d4f286e36fe88152ad8c96cff668c25fDarren Krahn  TPMS_AUTH_COMMAND auth_command;
2071aeb5969d4f286e36fe88152ad8c96cff668c25fDarren Krahn  std::string auth_bytes;
2084dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn  EXPECT_EQ(TPM_RC_SUCCESS, Parse_TPMS_AUTH_COMMAND(
2094dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn                                &authorization, &auth_command, &auth_bytes));
2101aeb5969d4f286e36fe88152ad8c96cff668c25fDarren Krahn  EXPECT_EQ(kContinueSession, auth_command.session_attributes);
2111aeb5969d4f286e36fe88152ad8c96cff668c25fDarren Krahn
2121aeb5969d4f286e36fe88152ad8c96cff668c25fDarren Krahn  // Encryption disabled and possible for command.
2131aeb5969d4f286e36fe88152ad8c96cff668c25fDarren Krahn  EXPECT_TRUE(delegate_.GetCommandAuthorization(std::string(), true, true,
2141aeb5969d4f286e36fe88152ad8c96cff668c25fDarren Krahn                                                &authorization));
2154dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn  EXPECT_EQ(TPM_RC_SUCCESS, Parse_TPMS_AUTH_COMMAND(
2164dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn                                &authorization, &auth_command, &auth_bytes));
2171aeb5969d4f286e36fe88152ad8c96cff668c25fDarren Krahn  EXPECT_EQ(kContinueSession, auth_command.session_attributes);
2181aeb5969d4f286e36fe88152ad8c96cff668c25fDarren Krahn
2191aeb5969d4f286e36fe88152ad8c96cff668c25fDarren Krahn  // Encryption enabled and not possible for command.
2201aeb5969d4f286e36fe88152ad8c96cff668c25fDarren Krahn  ASSERT_TRUE(delegate_.InitSession(session_handle_,
2211aeb5969d4f286e36fe88152ad8c96cff668c25fDarren Krahn                                    session_nonce_,  // TPM nonce.
2221aeb5969d4f286e36fe88152ad8c96cff668c25fDarren Krahn                                    session_nonce_,  // Caller nonce.
2231aeb5969d4f286e36fe88152ad8c96cff668c25fDarren Krahn                                    std::string(),   // Salt.
2241aeb5969d4f286e36fe88152ad8c96cff668c25fDarren Krahn                                    std::string(),   // Bind auth value.
2251aeb5969d4f286e36fe88152ad8c96cff668c25fDarren Krahn                                    true));          // Enable encryption.
2261aeb5969d4f286e36fe88152ad8c96cff668c25fDarren Krahn  EXPECT_TRUE(delegate_.GetCommandAuthorization(std::string(), false, false,
2271aeb5969d4f286e36fe88152ad8c96cff668c25fDarren Krahn                                                &authorization));
2284dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn  EXPECT_EQ(TPM_RC_SUCCESS, Parse_TPMS_AUTH_COMMAND(
2294dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn                                &authorization, &auth_command, &auth_bytes));
2301aeb5969d4f286e36fe88152ad8c96cff668c25fDarren Krahn  EXPECT_EQ(kContinueSession, auth_command.session_attributes);
2311aeb5969d4f286e36fe88152ad8c96cff668c25fDarren Krahn
2321aeb5969d4f286e36fe88152ad8c96cff668c25fDarren Krahn  // Encryption enabled and possible only for command input.
2331aeb5969d4f286e36fe88152ad8c96cff668c25fDarren Krahn  EXPECT_TRUE(delegate_.GetCommandAuthorization(std::string(), true, false,
2341aeb5969d4f286e36fe88152ad8c96cff668c25fDarren Krahn                                                &authorization));
2354dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn  EXPECT_EQ(TPM_RC_SUCCESS, Parse_TPMS_AUTH_COMMAND(
2364dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn                                &authorization, &auth_command, &auth_bytes));
237e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh Sanghi  EXPECT_EQ(kContinueSession | kDecryptSession,
2381aeb5969d4f286e36fe88152ad8c96cff668c25fDarren Krahn            auth_command.session_attributes);
2391aeb5969d4f286e36fe88152ad8c96cff668c25fDarren Krahn
2401aeb5969d4f286e36fe88152ad8c96cff668c25fDarren Krahn  // Encryption enabled and possible only for command output.
2411aeb5969d4f286e36fe88152ad8c96cff668c25fDarren Krahn  EXPECT_TRUE(delegate_.GetCommandAuthorization(std::string(), false, true,
2421aeb5969d4f286e36fe88152ad8c96cff668c25fDarren Krahn                                                &authorization));
2434dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn  EXPECT_EQ(TPM_RC_SUCCESS, Parse_TPMS_AUTH_COMMAND(
2444dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn                                &authorization, &auth_command, &auth_bytes));
245e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh Sanghi  EXPECT_EQ(kContinueSession | kEncryptSession,
2461aeb5969d4f286e36fe88152ad8c96cff668c25fDarren Krahn            auth_command.session_attributes);
2471aeb5969d4f286e36fe88152ad8c96cff668c25fDarren Krahn
2481aeb5969d4f286e36fe88152ad8c96cff668c25fDarren Krahn  // Encryption enabled and possible for command input and output.
2491aeb5969d4f286e36fe88152ad8c96cff668c25fDarren Krahn  EXPECT_TRUE(delegate_.GetCommandAuthorization(std::string(), true, true,
2501aeb5969d4f286e36fe88152ad8c96cff668c25fDarren Krahn                                                &authorization));
2514dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn  EXPECT_EQ(TPM_RC_SUCCESS, Parse_TPMS_AUTH_COMMAND(
2524dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn                                &authorization, &auth_command, &auth_bytes));
2531aeb5969d4f286e36fe88152ad8c96cff668c25fDarren Krahn  EXPECT_EQ(kContinueSession | kEncryptSession | kDecryptSession,
2541aeb5969d4f286e36fe88152ad8c96cff668c25fDarren Krahn            auth_command.session_attributes);
2554261114797a2793bae83fbabe0459cc465203dd2Utkarsh Sanghi}
2564261114797a2793bae83fbabe0459cc465203dd2Utkarsh Sanghi
2574261114797a2793bae83fbabe0459cc465203dd2Utkarsh Sanghi}  // namespace trunks
258