blob: c5446a40dc0ea82d1f86464dffa286627049d8f8 [file] [log] [blame]
Leo Laid045adc2022-03-31 07:42:521// Copyright 2022 The Chromium OS Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "trunks/real_response_serializer.h"
6
Leo Laiaa020c02022-03-31 07:42:527#include <algorithm>
Leo Laid6475cf2022-03-31 07:42:528#include <cstring>
Leo Laiaa020c02022-03-31 07:42:529
Leo Laid045adc2022-03-31 07:42:5210#include <gmock/gmock.h>
11#include <gtest/gtest.h>
12
13#include "trunks/command_parser.h"
Leo Laiaa020c02022-03-31 07:42:5214#include "trunks/password_authorization_delegate.h"
Leo Laid045adc2022-03-31 07:42:5215#include "trunks/tpm_generated.h"
16
17namespace trunks {
18
Leo Lai40e33d52022-03-31 07:42:5219namespace {
20
21void InitializeFake(TPMS_CAPABILITY_DATA* data) {
22 memset(data, 0, sizeof(*data));
23 data->capability = TPM_CAP_HANDLES;
24 for (int i = 0; i < 3; ++i) {
25 data->data.handles.handle[data->data.handles.count] = i;
26 ++data->data.handles.count;
27 }
28}
29
30} // namespace
31
Leo Laid045adc2022-03-31 07:42:5232// A placeholder test fixture.
33class RealResponseSerializerTest : public testing::Test {
34 protected:
35 RealResponseSerializer serializer_;
36};
37
38namespace {
39
40TEST_F(RealResponseSerializerTest, SerializeHeaderOnlyResponse) {
41 std::string response;
42 const TPM_RC rc = TPM_RC_LOCKOUT;
43 serializer_.SerializeHeaderOnlyResponse(rc, &response);
44
45 TPMI_ST_COMMAND_TAG tag = TPM_ST_NULL;
46 EXPECT_EQ(Parse_TPMI_ST_COMMAND_TAG(&response, &tag, nullptr),
47 TPM_RC_SUCCESS);
48 EXPECT_EQ(tag, TPM_ST_NO_SESSIONS);
49
50 UINT32 size = 0;
51 EXPECT_EQ(Parse_UINT32(&response, &size, nullptr), TPM_RC_SUCCESS);
52 EXPECT_EQ(size, kHeaderSize);
53
54 TPM_RC rc_out = TPM_RC_SUCCESS;
55 EXPECT_EQ(Parse_TPM_RC(&response, &rc_out, nullptr), TPM_RC_SUCCESS);
56 EXPECT_EQ(rc_out, rc);
57}
58
59TEST_F(RealResponseSerializerTest, SerializeHeaderOnlyResponseBadTag) {
60 std::string response;
61 const TPM_RC rc = TPM_RC_BAD_TAG;
62 serializer_.SerializeHeaderOnlyResponse(rc, &response);
63
64 TPMI_ST_COMMAND_TAG tag = TPM_ST_NULL;
65 EXPECT_EQ(Parse_TPMI_ST_COMMAND_TAG(&response, &tag, nullptr),
66 TPM_RC_SUCCESS);
67 EXPECT_EQ(tag, TPM_ST_RSP_COMMAND);
68
69 UINT32 size = 0;
70 EXPECT_EQ(Parse_UINT32(&response, &size, nullptr), TPM_RC_SUCCESS);
71 EXPECT_EQ(size, kHeaderSize);
72
73 TPM_RC rc_out = TPM_RC_SUCCESS;
74 EXPECT_EQ(Parse_TPM_RC(&response, &rc_out, nullptr), TPM_RC_SUCCESS);
75 EXPECT_EQ(rc_out, rc);
76}
77
Leo Lai40e33d52022-03-31 07:42:5278TEST_F(RealResponseSerializerTest, SerializeResponseGetCapability) {
79 const TPMI_YES_NO more = YES;
80 TPMS_CAPABILITY_DATA data;
81 InitializeFake(&data);
82 std::string response;
83 serializer_.SerializeResponseGetCapability(more, data, &response);
84
85 TPMI_YES_NO more_out = NO;
86 TPMS_CAPABILITY_DATA data_out = {};
87
88 ASSERT_EQ(
89 Tpm::ParseResponse_GetCapability(response, &more_out, &data_out,
90 /*authorization_delegate=*/nullptr),
91 TPM_RC_SUCCESS);
92 EXPECT_EQ(more_out, more);
93 EXPECT_EQ(memcmp(&data, &data_out, sizeof(data_out)), 0);
94}
95
Leo Laiaa020c02022-03-31 07:42:5296TEST_F(RealResponseSerializerTest, SerializeResponseNvRead) {
97 const std::string fake_data = "fake data";
98 const TPM2B_MAX_NV_BUFFER data = Make_TPM2B_MAX_NV_BUFFER(fake_data);
99
100 std::string response;
101 serializer_.SerializeResponseNvRead(data, &response);
102
103 TPM2B_MAX_NV_BUFFER data_out = {};
104
105 PasswordAuthorizationDelegate fake_password_authorization(
106 "password placeholder");
107
108 ASSERT_EQ(Tpm::ParseResponse_NV_Read(response, &data_out,
109 &fake_password_authorization),
110 TPM_RC_SUCCESS);
111 EXPECT_EQ(std::string(data_out.buffer, data_out.buffer + data_out.size),
112 fake_data);
113}
114
Leo Laid6475cf2022-03-31 07:42:52115TEST_F(RealResponseSerializerTest, SerializeResponseNvReadPublic) {
116 const std::string kFakeAuthPolicy = "fake auth policy";
117 const TPMS_NV_PUBLIC tpms_nv_public = {
118 .nv_index = 222,
119 .name_alg = TPM_ALG_SHA256,
120 .attributes = 123,
121 .auth_policy = Make_TPM2B_DIGEST(kFakeAuthPolicy),
122 .data_size = 66,
123 };
124 const TPM2B_NV_PUBLIC nv_public = Make_TPM2B_NV_PUBLIC(tpms_nv_public);
125 const std::string kFakeNvName = "fake nv name";
126 const TPM2B_NAME nv_name = Make_TPM2B_NAME(kFakeNvName);
127
128 std::string response;
129 serializer_.SerializeResponseNvReadPublic(nv_public, nv_name, &response);
130
131 TPM2B_NV_PUBLIC nv_public_out = {};
132 TPM2B_NAME nv_name_out = {};
133
134 ASSERT_EQ(Tpm::ParseResponse_NV_ReadPublic(response, &nv_public_out,
135 &nv_name_out, nullptr),
136 TPM_RC_SUCCESS);
137
138 EXPECT_EQ(nv_public_out.size, nv_public.size);
139 EXPECT_EQ(nv_public_out.nv_public.nv_index, nv_public.nv_public.nv_index);
140 EXPECT_EQ(nv_public_out.nv_public.name_alg, nv_public.nv_public.name_alg);
141 EXPECT_EQ(nv_public_out.nv_public.attributes, nv_public.nv_public.attributes);
142 EXPECT_EQ(nv_public_out.nv_public.auth_policy.size,
143 nv_public.nv_public.auth_policy.size);
144 ASSERT_LE(nv_public_out.nv_public.auth_policy.size,
145 sizeof(nv_public_out.nv_public.auth_policy.buffer));
146 EXPECT_EQ(memcmp(nv_public_out.nv_public.auth_policy.buffer,
147 nv_public.nv_public.auth_policy.buffer,
148 nv_public_out.nv_public.auth_policy.size),
149 0);
150 EXPECT_EQ(nv_public_out.nv_public.auth_policy.size,
151 nv_public.nv_public.auth_policy.size);
152 EXPECT_EQ(nv_public_out.nv_public.data_size, nv_public.nv_public.data_size);
153
154 ASSERT_LE(sizeof(nv_name_out.size) + nv_name_out.size, sizeof(nv_name_out));
155 EXPECT_EQ(memcmp(&nv_name_out, &nv_name,
156 sizeof(nv_name_out.size) + nv_name_out.size),
157 0);
158}
159
Leo Laid045adc2022-03-31 07:42:52160} // namespace
161
162} // namespace trunks