blob: cff2074213b01699d221b387d541ac5f837be015 [file] [log] [blame]
Mike Frysinger3a446f22022-09-08 07:37:141// Copyright 2022 The ChromiumOS Authors
Leo Laid045adc2022-03-31 07:42:522// 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;
Yi Chou9e496c12023-01-10 06:45:4824 data->data = TPMU_CAPABILITIES{.handles = TPML_HANDLE{}};
Leo Lai40e33d52022-03-31 07:42:5225 for (int i = 0; i < 3; ++i) {
26 data->data.handles.handle[data->data.handles.count] = i;
27 ++data->data.handles.count;
28 }
29}
30
31} // namespace
32
Leo Laid045adc2022-03-31 07:42:5233// A placeholder test fixture.
34class RealResponseSerializerTest : public testing::Test {
35 protected:
36 RealResponseSerializer serializer_;
37};
38
39namespace {
40
41TEST_F(RealResponseSerializerTest, SerializeHeaderOnlyResponse) {
42 std::string response;
43 const TPM_RC rc = TPM_RC_LOCKOUT;
44 serializer_.SerializeHeaderOnlyResponse(rc, &response);
45
46 TPMI_ST_COMMAND_TAG tag = TPM_ST_NULL;
47 EXPECT_EQ(Parse_TPMI_ST_COMMAND_TAG(&response, &tag, nullptr),
48 TPM_RC_SUCCESS);
49 EXPECT_EQ(tag, TPM_ST_NO_SESSIONS);
50
51 UINT32 size = 0;
52 EXPECT_EQ(Parse_UINT32(&response, &size, nullptr), TPM_RC_SUCCESS);
53 EXPECT_EQ(size, kHeaderSize);
54
55 TPM_RC rc_out = TPM_RC_SUCCESS;
56 EXPECT_EQ(Parse_TPM_RC(&response, &rc_out, nullptr), TPM_RC_SUCCESS);
57 EXPECT_EQ(rc_out, rc);
58}
59
60TEST_F(RealResponseSerializerTest, SerializeHeaderOnlyResponseBadTag) {
61 std::string response;
62 const TPM_RC rc = TPM_RC_BAD_TAG;
63 serializer_.SerializeHeaderOnlyResponse(rc, &response);
64
65 TPMI_ST_COMMAND_TAG tag = TPM_ST_NULL;
66 EXPECT_EQ(Parse_TPMI_ST_COMMAND_TAG(&response, &tag, nullptr),
67 TPM_RC_SUCCESS);
68 EXPECT_EQ(tag, TPM_ST_RSP_COMMAND);
69
70 UINT32 size = 0;
71 EXPECT_EQ(Parse_UINT32(&response, &size, nullptr), TPM_RC_SUCCESS);
72 EXPECT_EQ(size, kHeaderSize);
73
74 TPM_RC rc_out = TPM_RC_SUCCESS;
75 EXPECT_EQ(Parse_TPM_RC(&response, &rc_out, nullptr), TPM_RC_SUCCESS);
76 EXPECT_EQ(rc_out, rc);
77}
78
Leo Lai40e33d52022-03-31 07:42:5279TEST_F(RealResponseSerializerTest, SerializeResponseGetCapability) {
80 const TPMI_YES_NO more = YES;
81 TPMS_CAPABILITY_DATA data;
82 InitializeFake(&data);
83 std::string response;
84 serializer_.SerializeResponseGetCapability(more, data, &response);
85
86 TPMI_YES_NO more_out = NO;
87 TPMS_CAPABILITY_DATA data_out = {};
88
89 ASSERT_EQ(
90 Tpm::ParseResponse_GetCapability(response, &more_out, &data_out,
91 /*authorization_delegate=*/nullptr),
92 TPM_RC_SUCCESS);
93 EXPECT_EQ(more_out, more);
Yi Chou9e496c12023-01-10 06:45:4894 EXPECT_EQ(data.capability, data_out.capability);
95 EXPECT_EQ(data.capability, TPM_CAP_HANDLES);
96 EXPECT_EQ(data.data.handles.count, data_out.data.handles.count);
97 EXPECT_EQ(memcmp(data.data.handles.handle, data_out.data.handles.handle,
98 sizeof(TPM_HANDLE) * data_out.data.handles.count),
99 0);
Leo Lai40e33d52022-03-31 07:42:52100}
101
Leo Laiaa020c02022-03-31 07:42:52102TEST_F(RealResponseSerializerTest, SerializeResponseNvRead) {
103 const std::string fake_data = "fake data";
104 const TPM2B_MAX_NV_BUFFER data = Make_TPM2B_MAX_NV_BUFFER(fake_data);
105
106 std::string response;
107 serializer_.SerializeResponseNvRead(data, &response);
108
109 TPM2B_MAX_NV_BUFFER data_out = {};
110
111 PasswordAuthorizationDelegate fake_password_authorization(
112 "password placeholder");
113
114 ASSERT_EQ(Tpm::ParseResponse_NV_Read(response, &data_out,
115 &fake_password_authorization),
116 TPM_RC_SUCCESS);
117 EXPECT_EQ(std::string(data_out.buffer, data_out.buffer + data_out.size),
118 fake_data);
119}
120
Leo Laid6475cf2022-03-31 07:42:52121TEST_F(RealResponseSerializerTest, SerializeResponseNvReadPublic) {
122 const std::string kFakeAuthPolicy = "fake auth policy";
123 const TPMS_NV_PUBLIC tpms_nv_public = {
124 .nv_index = 222,
125 .name_alg = TPM_ALG_SHA256,
126 .attributes = 123,
127 .auth_policy = Make_TPM2B_DIGEST(kFakeAuthPolicy),
128 .data_size = 66,
129 };
130 const TPM2B_NV_PUBLIC nv_public = Make_TPM2B_NV_PUBLIC(tpms_nv_public);
131 const std::string kFakeNvName = "fake nv name";
132 const TPM2B_NAME nv_name = Make_TPM2B_NAME(kFakeNvName);
133
134 std::string response;
135 serializer_.SerializeResponseNvReadPublic(nv_public, nv_name, &response);
136
137 TPM2B_NV_PUBLIC nv_public_out = {};
138 TPM2B_NAME nv_name_out = {};
139
140 ASSERT_EQ(Tpm::ParseResponse_NV_ReadPublic(response, &nv_public_out,
141 &nv_name_out, nullptr),
142 TPM_RC_SUCCESS);
143
144 EXPECT_EQ(nv_public_out.size, nv_public.size);
145 EXPECT_EQ(nv_public_out.nv_public.nv_index, nv_public.nv_public.nv_index);
146 EXPECT_EQ(nv_public_out.nv_public.name_alg, nv_public.nv_public.name_alg);
147 EXPECT_EQ(nv_public_out.nv_public.attributes, nv_public.nv_public.attributes);
148 EXPECT_EQ(nv_public_out.nv_public.auth_policy.size,
149 nv_public.nv_public.auth_policy.size);
150 ASSERT_LE(nv_public_out.nv_public.auth_policy.size,
151 sizeof(nv_public_out.nv_public.auth_policy.buffer));
152 EXPECT_EQ(memcmp(nv_public_out.nv_public.auth_policy.buffer,
153 nv_public.nv_public.auth_policy.buffer,
154 nv_public_out.nv_public.auth_policy.size),
155 0);
156 EXPECT_EQ(nv_public_out.nv_public.auth_policy.size,
157 nv_public.nv_public.auth_policy.size);
158 EXPECT_EQ(nv_public_out.nv_public.data_size, nv_public.nv_public.data_size);
159
160 ASSERT_LE(sizeof(nv_name_out.size) + nv_name_out.size, sizeof(nv_name_out));
161 EXPECT_EQ(memcmp(&nv_name_out, &nv_name,
162 sizeof(nv_name_out.size) + nv_name_out.size),
163 0);
164}
165
Leo Laid045adc2022-03-31 07:42:52166} // namespace
167
168} // namespace trunks