You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
127 lines
4.6 KiB
127 lines
4.6 KiB
// |
|
// Copyright (C) 2015 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/blob_parser.h" |
|
|
|
#include <base/logging.h> |
|
#include <base/stl_util.h> |
|
|
|
#include "trunks/error_codes.h" |
|
|
|
namespace trunks { |
|
|
|
bool BlobParser::SerializeKeyBlob(const TPM2B_PUBLIC& public_info, |
|
const TPM2B_PRIVATE& private_info, |
|
std::string* key_blob) { |
|
CHECK(key_blob) << "KeyBlob not defined."; |
|
key_blob->clear(); |
|
if ((public_info.size == 0) && (private_info.size == 0)) { |
|
return true; |
|
} |
|
TPM_RC result = Serialize_TPM2B_PUBLIC(public_info, key_blob); |
|
if (result != TPM_RC_SUCCESS) { |
|
LOG(ERROR) << "Error serializing public info: " << GetErrorString(result); |
|
return false; |
|
} |
|
result = Serialize_TPM2B_PRIVATE(private_info, key_blob); |
|
if (result != TPM_RC_SUCCESS) { |
|
LOG(ERROR) << "Error serializing private info: " << GetErrorString(result); |
|
return false; |
|
} |
|
return true; |
|
} |
|
|
|
bool BlobParser::ParseKeyBlob(const std::string& key_blob, |
|
TPM2B_PUBLIC* public_info, |
|
TPM2B_PRIVATE* private_info) { |
|
CHECK(public_info) << "Public info not defined."; |
|
CHECK(private_info) << "Private info not defined."; |
|
if (key_blob.empty()) { |
|
public_info->size = 0; |
|
private_info->size = 0; |
|
return true; |
|
} |
|
std::string mutable_key_blob = key_blob; |
|
TPM_RC result = Parse_TPM2B_PUBLIC(&mutable_key_blob, public_info, nullptr); |
|
if (result != TPM_RC_SUCCESS) { |
|
LOG(ERROR) << "Error parsing public info: " << GetErrorString(result); |
|
return false; |
|
} |
|
result = Parse_TPM2B_PRIVATE(&mutable_key_blob, private_info, nullptr); |
|
if (result != TPM_RC_SUCCESS) { |
|
LOG(ERROR) << "Error parsing private info: " << GetErrorString(result); |
|
return false; |
|
} |
|
return true; |
|
} |
|
|
|
bool BlobParser::SerializeCreationBlob(const TPM2B_CREATION_DATA& creation_data, |
|
const TPM2B_DIGEST& creation_hash, |
|
const TPMT_TK_CREATION& creation_ticket, |
|
std::string* creation_blob) { |
|
CHECK(creation_blob) << "CreationBlob not defined."; |
|
creation_blob->clear(); |
|
TPM_RC result = Serialize_TPM2B_CREATION_DATA(creation_data, creation_blob); |
|
if (result != TPM_RC_SUCCESS) { |
|
LOG(ERROR) << "Error serializing creation_data: " << GetErrorString(result); |
|
return false; |
|
} |
|
result = Serialize_TPM2B_DIGEST(creation_hash, creation_blob); |
|
if (result != TPM_RC_SUCCESS) { |
|
LOG(ERROR) << "Error serializing creation_hash: " << GetErrorString(result); |
|
return false; |
|
} |
|
result = Serialize_TPMT_TK_CREATION(creation_ticket, creation_blob); |
|
if (result != TPM_RC_SUCCESS) { |
|
LOG(ERROR) << "Error serializing creation_ticket: " |
|
<< GetErrorString(result); |
|
return false; |
|
} |
|
return true; |
|
} |
|
|
|
bool BlobParser::ParseCreationBlob(const std::string& creation_blob, |
|
TPM2B_CREATION_DATA* creation_data, |
|
TPM2B_DIGEST* creation_hash, |
|
TPMT_TK_CREATION* creation_ticket) { |
|
CHECK(creation_data) << "CreationData not defined."; |
|
CHECK(creation_hash) << "CreationHash not defined."; |
|
CHECK(creation_ticket) << "CreationTicket not defined."; |
|
if (creation_blob.empty()) { |
|
return false; |
|
} |
|
std::string mutable_creation_blob = creation_blob; |
|
TPM_RC result = |
|
Parse_TPM2B_CREATION_DATA(&mutable_creation_blob, creation_data, nullptr); |
|
if (result != TPM_RC_SUCCESS) { |
|
LOG(ERROR) << "Error parsing creation_data: " << GetErrorString(result); |
|
return false; |
|
} |
|
result = Parse_TPM2B_DIGEST(&mutable_creation_blob, creation_hash, nullptr); |
|
if (result != TPM_RC_SUCCESS) { |
|
LOG(ERROR) << "Error parsing creation_hash: " << GetErrorString(result); |
|
return false; |
|
} |
|
result = |
|
Parse_TPMT_TK_CREATION(&mutable_creation_blob, creation_ticket, nullptr); |
|
if (result != TPM_RC_SUCCESS) { |
|
LOG(ERROR) << "Error parsing creation_ticket: " << GetErrorString(result); |
|
return false; |
|
} |
|
return true; |
|
} |
|
|
|
} // namespace trunks
|
|
|