|  | // | 
|  | // Copyright (C) 2014 The Android Open Source Project | 
|  | // | 
|  | // Licensed under the Apache License, Version 2.0 (the "License"); | 
|  | // you may not use this file except in compliance with the License. | 
|  | // You may obtain a copy of the License at | 
|  | // | 
|  | //      http://www.apache.org/licenses/LICENSE-2.0 | 
|  | // | 
|  | // Unless required by applicable law or agreed to in writing, software | 
|  | // distributed under the License is distributed on an "AS IS" BASIS, | 
|  | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
|  | // See the License for the specific language governing permissions and | 
|  | // limitations under the License. | 
|  | // | 
|  |  | 
|  | #include <string> | 
|  |  | 
|  | #include <gtest/gtest.h> | 
|  |  | 
|  | #include "trunks/password_authorization_delegate.h" | 
|  |  | 
|  | namespace trunks { | 
|  |  | 
|  | // This test looks at initialization of the delegate with no password. | 
|  | // It should initailize with a zero length internal password buffer. | 
|  | TEST(PasswordAuthorizationDelegateTest, NullInitialization) { | 
|  | PasswordAuthorizationDelegate delegate(""); | 
|  | EXPECT_EQ(delegate.password_.size, 0); | 
|  | } | 
|  |  | 
|  | // This test checks the generation of an authorization structure by the | 
|  | // delegate. It compared the serialized structure generated by the delegate | 
|  | // to the expected authorization string. | 
|  | TEST(PasswordAuthorizationDelegateTest, SerializationTest) { | 
|  | std::string expected_auth("\x40\x00\x00\x09"  // session_handle = TPM_RS_PW | 
|  | "\x00\x00"          // nonce = zero length buffer | 
|  | "\x01"     // session_attributes = continueSession | 
|  | "\x00\x06"          // password length | 
|  | "secret",           // password | 
|  | 15); | 
|  | PasswordAuthorizationDelegate delegate("secret"); | 
|  | std::string authorization; | 
|  | std::string command_hash; | 
|  | bool authorization_result = delegate.GetCommandAuthorization(command_hash, | 
|  | false, false, | 
|  | &authorization); | 
|  | EXPECT_EQ(authorization_result, true); | 
|  | EXPECT_EQ(authorization.length(), expected_auth.length()); | 
|  | EXPECT_EQ(expected_auth.compare(authorization), 0); | 
|  | } | 
|  |  | 
|  | // This test looks at the delegate's ability to parse and check authorization | 
|  | // responses when the response is well formed. | 
|  | TEST(PasswordAuthorizationDelegateTest, ParseGoodParams) { | 
|  | std::string auth_response("\x00\x00"   // nonceTpm = zero length buffer | 
|  | "\x01"       // session_attributes = continueSession | 
|  | "\x00\x00",  // hmac = zero length buffer | 
|  | 5); | 
|  | PasswordAuthorizationDelegate delegate("secret"); | 
|  | std::string response_hash; | 
|  | bool authorization_result = delegate.CheckResponseAuthorization( | 
|  | response_hash, | 
|  | auth_response); | 
|  | EXPECT_EQ(authorization_result, true); | 
|  | } | 
|  |  | 
|  | // This test checks the delegate's ability to correctly identify an incorrect | 
|  | // authorization response. | 
|  | TEST(PasswordAuthorizationDelegateTest, ParseBadParams) { | 
|  | std::string auth_response("\x00\x00"  // nonceTpm = zero length buffer | 
|  | "\x01"      // session_attributes = continueSession | 
|  | "\x00\x06"  // password length | 
|  | "secret",   // password | 
|  | 11); | 
|  | PasswordAuthorizationDelegate delegate("secret"); | 
|  | std::string response_hash; | 
|  | bool authorization_result = delegate.CheckResponseAuthorization( | 
|  | response_hash, | 
|  | auth_response); | 
|  | EXPECT_EQ(authorization_result, false); | 
|  | } | 
|  |  | 
|  | // This test confirms that after encrypting and decrypting a parameter, | 
|  | // we get the original parameter back. | 
|  | TEST(PasswordAuthorizationDelegateTest, EncryptDecrypt) { | 
|  | PasswordAuthorizationDelegate delegate("secret"); | 
|  | std::string plaintext_parameter("parameter"); | 
|  | std::string encrypted_parameter(plaintext_parameter); | 
|  | ASSERT_EQ(plaintext_parameter.compare(encrypted_parameter), 0); | 
|  | delegate.EncryptCommandParameter(&encrypted_parameter); | 
|  | delegate.DecryptResponseParameter(&encrypted_parameter); | 
|  | EXPECT_EQ(plaintext_parameter.compare(encrypted_parameter), 0); | 
|  | } | 
|  |  | 
|  | }  // namespace trunks |