Home | History | Annotate | Download | only in trunks
      1 //
      2 // Copyright (C) 2014 The Android Open Source Project
      3 //
      4 // Licensed under the Apache License, Version 2.0 (the "License");
      5 // you may not use this file except in compliance with the License.
      6 // You may obtain a copy of the License at
      7 //
      8 //      http://www.apache.org/licenses/LICENSE-2.0
      9 //
     10 // Unless required by applicable law or agreed to in writing, software
     11 // distributed under the License is distributed on an "AS IS" BASIS,
     12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13 // See the License for the specific language governing permissions and
     14 // limitations under the License.
     15 //
     16 
     17 #include <string>
     18 
     19 #include <gtest/gtest.h>
     20 
     21 #include "trunks/password_authorization_delegate.h"
     22 
     23 namespace trunks {
     24 
     25 // This test looks at initialization of the delegate with no password.
     26 // It should initailize with a zero length internal password buffer.
     27 TEST(PasswordAuthorizationDelegateTest, NullInitialization) {
     28   PasswordAuthorizationDelegate delegate("");
     29   EXPECT_EQ(delegate.password_.size, 0);
     30 }
     31 
     32 // This test checks the generation of an authorization structure by the
     33 // delegate. It compared the serialized structure generated by the delegate
     34 // to the expected authorization string.
     35 TEST(PasswordAuthorizationDelegateTest, SerializationTest) {
     36   std::string expected_auth("\x40\x00\x00\x09"  // session_handle = TPM_RS_PW
     37                             "\x00\x00"          // nonce = zero length buffer
     38                             "\x01"     // session_attributes = continueSession
     39                             "\x00\x06"          // password length
     40                             "secret",           // password
     41                             15);
     42   PasswordAuthorizationDelegate delegate("secret");
     43   std::string authorization;
     44   std::string command_hash;
     45   bool authorization_result = delegate.GetCommandAuthorization(command_hash,
     46                                                                false, false,
     47                                                                &authorization);
     48   EXPECT_EQ(authorization_result, true);
     49   EXPECT_EQ(authorization.length(), expected_auth.length());
     50   EXPECT_EQ(expected_auth.compare(authorization), 0);
     51 }
     52 
     53 // This test looks at the delegate's ability to parse and check authorization
     54 // responses when the response is well formed.
     55 TEST(PasswordAuthorizationDelegateTest, ParseGoodParams) {
     56   std::string auth_response("\x00\x00"   // nonceTpm = zero length buffer
     57                             "\x01"       // session_attributes = continueSession
     58                             "\x00\x00",  // hmac = zero length buffer
     59                             5);
     60   PasswordAuthorizationDelegate delegate("secret");
     61   std::string response_hash;
     62   bool authorization_result = delegate.CheckResponseAuthorization(
     63       response_hash,
     64       auth_response);
     65   EXPECT_EQ(authorization_result, true);
     66 }
     67 
     68 // This test checks the delegate's ability to correctly identify an incorrect
     69 // authorization response.
     70 TEST(PasswordAuthorizationDelegateTest, ParseBadParams) {
     71   std::string auth_response("\x00\x00"  // nonceTpm = zero length buffer
     72                             "\x01"      // session_attributes = continueSession
     73                             "\x00\x06"  // password length
     74                             "secret",   // password
     75                             11);
     76   PasswordAuthorizationDelegate delegate("secret");
     77   std::string response_hash;
     78   bool authorization_result = delegate.CheckResponseAuthorization(
     79       response_hash,
     80       auth_response);
     81   EXPECT_EQ(authorization_result, false);
     82 }
     83 
     84 // This test confirms that after encrypting and decrypting a parameter,
     85 // we get the original parameter back.
     86 TEST(PasswordAuthorizationDelegateTest, EncryptDecrypt) {
     87   PasswordAuthorizationDelegate delegate("secret");
     88   std::string plaintext_parameter("parameter");
     89   std::string encrypted_parameter(plaintext_parameter);
     90   ASSERT_EQ(plaintext_parameter.compare(encrypted_parameter), 0);
     91   delegate.EncryptCommandParameter(&encrypted_parameter);
     92   delegate.DecryptResponseParameter(&encrypted_parameter);
     93   EXPECT_EQ(plaintext_parameter.compare(encrypted_parameter), 0);
     94 }
     95 
     96 }  // namespace trunks
     97