| // |
| // 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 "trunks/password_authorization_delegate.h" |
| |
| #include <base/logging.h> |
| |
| #include "trunks/tpm_generated.h" |
| |
| namespace trunks { |
| |
| const uint8_t kContinueSession = 1; |
| |
| PasswordAuthorizationDelegate::PasswordAuthorizationDelegate( |
| const std::string& password) { |
| password_ = Make_TPM2B_DIGEST(password); |
| } |
| |
| PasswordAuthorizationDelegate::~PasswordAuthorizationDelegate() {} |
| |
| bool PasswordAuthorizationDelegate::GetCommandAuthorization( |
| const std::string& command_hash, |
| bool is_command_parameter_encryption_possible, |
| bool is_response_parameter_encryption_possible, |
| std::string* authorization) { |
| TPMS_AUTH_COMMAND auth; |
| auth.session_handle = TPM_RS_PW; |
| auth.nonce.size = 0; |
| auth.session_attributes = kContinueSession; |
| auth.hmac = password_; |
| |
| TPM_RC serialize_error = Serialize_TPMS_AUTH_COMMAND(auth, authorization); |
| if (serialize_error != TPM_RC_SUCCESS) { |
| LOG(ERROR) << __func__ << ": could not serialize command auth."; |
| return false; |
| } |
| return true; |
| } |
| |
| bool PasswordAuthorizationDelegate::CheckResponseAuthorization( |
| const std::string& response_hash, |
| const std::string& authorization) { |
| TPMS_AUTH_RESPONSE auth_response; |
| std::string mutable_auth_string(authorization); |
| std::string auth_bytes; |
| TPM_RC parse_error; |
| parse_error = Parse_TPMS_AUTH_RESPONSE(&mutable_auth_string, &auth_response, |
| &auth_bytes); |
| if (authorization.size() != auth_bytes.size()) { |
| LOG(ERROR) << __func__ << ": Authorization string was of wrong length."; |
| return false; |
| } |
| if (parse_error != TPM_RC_SUCCESS) { |
| LOG(ERROR) << __func__ << ": could not parse authorization response."; |
| return false; |
| } |
| if (auth_response.nonce.size != 0) { |
| LOG(ERROR) << __func__ << ": received a non zero length nonce."; |
| return false; |
| } |
| if (auth_response.hmac.size != 0) { |
| LOG(ERROR) << __func__ << ": received a non zero length hmac."; |
| return false; |
| } |
| if (auth_response.session_attributes != kContinueSession) { |
| LOG(ERROR) << __func__ << ": received wrong session attributes."; |
| return false; |
| } |
| return true; |
| } |
| |
| bool PasswordAuthorizationDelegate::EncryptCommandParameter( |
| std::string* parameter) { |
| return true; |
| } |
| |
| bool PasswordAuthorizationDelegate::DecryptResponseParameter( |
| std::string* parameter) { |
| return true; |
| } |
| |
| } // namespace trunks |