1*789431f2SAndroid Build Coastguard Worker /*
2*789431f2SAndroid Build Coastguard Worker * Copyright (C) 2014 The Android Open Source Project
3*789431f2SAndroid Build Coastguard Worker *
4*789431f2SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
5*789431f2SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
6*789431f2SAndroid Build Coastguard Worker * You may obtain a copy of the License at
7*789431f2SAndroid Build Coastguard Worker *
8*789431f2SAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
9*789431f2SAndroid Build Coastguard Worker *
10*789431f2SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
11*789431f2SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
12*789431f2SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*789431f2SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
14*789431f2SAndroid Build Coastguard Worker * limitations under the License.
15*789431f2SAndroid Build Coastguard Worker */
16*789431f2SAndroid Build Coastguard Worker
17*789431f2SAndroid Build Coastguard Worker #include <keymaster/UniquePtr.h>
18*789431f2SAndroid Build Coastguard Worker
19*789431f2SAndroid Build Coastguard Worker #include <gtest/gtest.h>
20*789431f2SAndroid Build Coastguard Worker
21*789431f2SAndroid Build Coastguard Worker #include <keymaster/android_keymaster.h>
22*789431f2SAndroid Build Coastguard Worker #include <keymaster/android_keymaster_utils.h>
23*789431f2SAndroid Build Coastguard Worker #include <keymaster/keymaster_tags.h>
24*789431f2SAndroid Build Coastguard Worker
25*789431f2SAndroid Build Coastguard Worker #include "android_keymaster_test_utils.h"
26*789431f2SAndroid Build Coastguard Worker #include "fuzzers/serializable_types.h"
27*789431f2SAndroid Build Coastguard Worker
28*789431f2SAndroid Build Coastguard Worker namespace keymaster {
29*789431f2SAndroid Build Coastguard Worker namespace test {
30*789431f2SAndroid Build Coastguard Worker
31*789431f2SAndroid Build Coastguard Worker /**
32*789431f2SAndroid Build Coastguard Worker * Serialize and deserialize a message.
33*789431f2SAndroid Build Coastguard Worker */
34*789431f2SAndroid Build Coastguard Worker template <typename Message>
round_trip(int32_t ver,const Message & message,size_t expected_size)35*789431f2SAndroid Build Coastguard Worker Message* round_trip(int32_t ver, const Message& message, size_t expected_size) {
36*789431f2SAndroid Build Coastguard Worker size_t size = message.SerializedSize();
37*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(expected_size, size);
38*789431f2SAndroid Build Coastguard Worker if (size == 0) return nullptr;
39*789431f2SAndroid Build Coastguard Worker
40*789431f2SAndroid Build Coastguard Worker UniquePtr<uint8_t[]> buf(new uint8_t[size]);
41*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(buf.get() + size, message.Serialize(buf.get(), buf.get() + size));
42*789431f2SAndroid Build Coastguard Worker
43*789431f2SAndroid Build Coastguard Worker Message* deserialized = new Message(ver);
44*789431f2SAndroid Build Coastguard Worker const uint8_t* p = buf.get();
45*789431f2SAndroid Build Coastguard Worker EXPECT_TRUE(deserialized->Deserialize(&p, p + size));
46*789431f2SAndroid Build Coastguard Worker EXPECT_EQ((ptrdiff_t)size, p - buf.get());
47*789431f2SAndroid Build Coastguard Worker return deserialized;
48*789431f2SAndroid Build Coastguard Worker }
49*789431f2SAndroid Build Coastguard Worker
TEST(RoundTrip,EmptyKeymasterResponse)50*789431f2SAndroid Build Coastguard Worker TEST(RoundTrip, EmptyKeymasterResponse) {
51*789431f2SAndroid Build Coastguard Worker for (int ver = 0; ver <= kMaxMessageVersion; ++ver) {
52*789431f2SAndroid Build Coastguard Worker EmptyKeymasterResponse msg(ver);
53*789431f2SAndroid Build Coastguard Worker msg.error = KM_ERROR_OK;
54*789431f2SAndroid Build Coastguard Worker
55*789431f2SAndroid Build Coastguard Worker UniquePtr<EmptyKeymasterResponse> deserialized(round_trip(ver, msg, 4));
56*789431f2SAndroid Build Coastguard Worker }
57*789431f2SAndroid Build Coastguard Worker }
58*789431f2SAndroid Build Coastguard Worker
TEST(RoundTrip,EmptyKeymasterResponseError)59*789431f2SAndroid Build Coastguard Worker TEST(RoundTrip, EmptyKeymasterResponseError) {
60*789431f2SAndroid Build Coastguard Worker for (int ver = 0; ver <= kMaxMessageVersion; ++ver) {
61*789431f2SAndroid Build Coastguard Worker EmptyKeymasterResponse msg(ver);
62*789431f2SAndroid Build Coastguard Worker msg.error = KM_ERROR_MEMORY_ALLOCATION_FAILED;
63*789431f2SAndroid Build Coastguard Worker
64*789431f2SAndroid Build Coastguard Worker UniquePtr<EmptyKeymasterResponse> deserialized(round_trip(ver, msg, 4));
65*789431f2SAndroid Build Coastguard Worker }
66*789431f2SAndroid Build Coastguard Worker }
67*789431f2SAndroid Build Coastguard Worker
68*789431f2SAndroid Build Coastguard Worker static keymaster_key_param_t params[] = {
69*789431f2SAndroid Build Coastguard Worker Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN),
70*789431f2SAndroid Build Coastguard Worker Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY),
71*789431f2SAndroid Build Coastguard Worker Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA),
72*789431f2SAndroid Build Coastguard Worker Authorization(TAG_USER_ID, 7),
73*789431f2SAndroid Build Coastguard Worker Authorization(TAG_USER_AUTH_TYPE, HW_AUTH_PASSWORD),
74*789431f2SAndroid Build Coastguard Worker Authorization(TAG_APPLICATION_ID, "app_id", 6),
75*789431f2SAndroid Build Coastguard Worker Authorization(TAG_AUTH_TIMEOUT, 300),
76*789431f2SAndroid Build Coastguard Worker };
77*789431f2SAndroid Build Coastguard Worker uint8_t TEST_DATA[] = "a key blob";
78*789431f2SAndroid Build Coastguard Worker
TEST(RoundTrip,GenerateKeyRequest)79*789431f2SAndroid Build Coastguard Worker TEST(RoundTrip, GenerateKeyRequest) {
80*789431f2SAndroid Build Coastguard Worker for (int ver = 0; ver <= kMaxMessageVersion; ++ver) {
81*789431f2SAndroid Build Coastguard Worker GenerateKeyRequest req(ver);
82*789431f2SAndroid Build Coastguard Worker req.key_description.Reinitialize(params, array_length(params));
83*789431f2SAndroid Build Coastguard Worker req.attestation_signing_key_blob =
84*789431f2SAndroid Build Coastguard Worker KeymasterKeyBlob(reinterpret_cast<const uint8_t*>("foo"), 3);
85*789431f2SAndroid Build Coastguard Worker req.attest_key_params.Reinitialize(params, array_length(params));
86*789431f2SAndroid Build Coastguard Worker req.issuer_subject = KeymasterBlob(reinterpret_cast<const uint8_t*>("bar"), 3);
87*789431f2SAndroid Build Coastguard Worker
88*789431f2SAndroid Build Coastguard Worker UniquePtr<GenerateKeyRequest> deserialized(round_trip(ver, req, ver < 4 ? 78 : 170));
89*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(deserialized->key_description, req.key_description);
90*789431f2SAndroid Build Coastguard Worker if (ver < 4) {
91*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(0U, deserialized->attestation_signing_key_blob.key_material_size);
92*789431f2SAndroid Build Coastguard Worker } else {
93*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(3U, deserialized->attestation_signing_key_blob.key_material_size);
94*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(0, memcmp(req.attestation_signing_key_blob.key_material,
95*789431f2SAndroid Build Coastguard Worker deserialized->attestation_signing_key_blob.key_material,
96*789431f2SAndroid Build Coastguard Worker deserialized->attestation_signing_key_blob.key_material_size));
97*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(deserialized->attest_key_params, req.attest_key_params);
98*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(0, memcmp(req.issuer_subject.data, deserialized->issuer_subject.data,
99*789431f2SAndroid Build Coastguard Worker deserialized->issuer_subject.data_length));
100*789431f2SAndroid Build Coastguard Worker }
101*789431f2SAndroid Build Coastguard Worker }
102*789431f2SAndroid Build Coastguard Worker }
103*789431f2SAndroid Build Coastguard Worker
TEST(RoundTrip,GenerateKeyResponse)104*789431f2SAndroid Build Coastguard Worker TEST(RoundTrip, GenerateKeyResponse) {
105*789431f2SAndroid Build Coastguard Worker for (int ver = 0; ver <= kMaxMessageVersion; ++ver) {
106*789431f2SAndroid Build Coastguard Worker GenerateKeyResponse rsp(ver);
107*789431f2SAndroid Build Coastguard Worker rsp.error = KM_ERROR_OK;
108*789431f2SAndroid Build Coastguard Worker rsp.key_blob.key_material = dup_array(TEST_DATA);
109*789431f2SAndroid Build Coastguard Worker rsp.key_blob.key_material_size = array_length(TEST_DATA);
110*789431f2SAndroid Build Coastguard Worker rsp.enforced.Reinitialize(params, array_length(params));
111*789431f2SAndroid Build Coastguard Worker
112*789431f2SAndroid Build Coastguard Worker rsp.certificate_chain = CertificateChain(3);
113*789431f2SAndroid Build Coastguard Worker rsp.certificate_chain.entries[0] = {dup_buffer("foo", 3), 3};
114*789431f2SAndroid Build Coastguard Worker rsp.certificate_chain.entries[1] = {dup_buffer("bar", 3), 3};
115*789431f2SAndroid Build Coastguard Worker rsp.certificate_chain.entries[2] = {dup_buffer("baz", 3), 3};
116*789431f2SAndroid Build Coastguard Worker
117*789431f2SAndroid Build Coastguard Worker UniquePtr<GenerateKeyResponse> deserialized;
118*789431f2SAndroid Build Coastguard Worker if (ver < 4) {
119*789431f2SAndroid Build Coastguard Worker deserialized.reset(round_trip(ver, rsp, 109));
120*789431f2SAndroid Build Coastguard Worker } else {
121*789431f2SAndroid Build Coastguard Worker deserialized.reset(round_trip(ver, rsp, 134));
122*789431f2SAndroid Build Coastguard Worker }
123*789431f2SAndroid Build Coastguard Worker
124*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(KM_ERROR_OK, deserialized->error);
125*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(deserialized->enforced, rsp.enforced);
126*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(deserialized->unenforced, rsp.unenforced);
127*789431f2SAndroid Build Coastguard Worker
128*789431f2SAndroid Build Coastguard Worker keymaster_cert_chain_t* chain = &deserialized->certificate_chain;
129*789431f2SAndroid Build Coastguard Worker if (ver < 4) {
130*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(nullptr, chain->entries);
131*789431f2SAndroid Build Coastguard Worker } else {
132*789431f2SAndroid Build Coastguard Worker EXPECT_NE(nullptr, chain->entries);
133*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(3U, chain->entry_count);
134*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(3U, chain->entries[0].data_length);
135*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(0, memcmp("foo", chain->entries[0].data, 3));
136*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(3U, chain->entries[1].data_length);
137*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(0, memcmp("bar", chain->entries[1].data, 3));
138*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(3U, chain->entries[2].data_length);
139*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(0, memcmp("baz", chain->entries[2].data, 3));
140*789431f2SAndroid Build Coastguard Worker }
141*789431f2SAndroid Build Coastguard Worker }
142*789431f2SAndroid Build Coastguard Worker }
143*789431f2SAndroid Build Coastguard Worker
TEST(RoundTrip,GenerateKeyResponseTestError)144*789431f2SAndroid Build Coastguard Worker TEST(RoundTrip, GenerateKeyResponseTestError) {
145*789431f2SAndroid Build Coastguard Worker for (int ver = 0; ver <= kMaxMessageVersion; ++ver) {
146*789431f2SAndroid Build Coastguard Worker GenerateKeyResponse rsp(ver);
147*789431f2SAndroid Build Coastguard Worker rsp.error = KM_ERROR_UNSUPPORTED_ALGORITHM;
148*789431f2SAndroid Build Coastguard Worker rsp.key_blob.key_material = dup_array(TEST_DATA);
149*789431f2SAndroid Build Coastguard Worker rsp.key_blob.key_material_size = array_length(TEST_DATA);
150*789431f2SAndroid Build Coastguard Worker rsp.enforced.Reinitialize(params, array_length(params));
151*789431f2SAndroid Build Coastguard Worker
152*789431f2SAndroid Build Coastguard Worker UniquePtr<GenerateKeyResponse> deserialized(round_trip(ver, rsp, 4));
153*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(KM_ERROR_UNSUPPORTED_ALGORITHM, deserialized->error);
154*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(0U, deserialized->enforced.size());
155*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(0U, deserialized->unenforced.size());
156*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(0U, deserialized->key_blob.key_material_size);
157*789431f2SAndroid Build Coastguard Worker }
158*789431f2SAndroid Build Coastguard Worker }
159*789431f2SAndroid Build Coastguard Worker
TEST(RoundTrip,GenerateRkpKeyRequest)160*789431f2SAndroid Build Coastguard Worker TEST(RoundTrip, GenerateRkpKeyRequest) {
161*789431f2SAndroid Build Coastguard Worker for (int ver = 0; ver <= kMaxMessageVersion; ++ver) {
162*789431f2SAndroid Build Coastguard Worker GenerateRkpKeyRequest req(ver);
163*789431f2SAndroid Build Coastguard Worker req.test_mode = true;
164*789431f2SAndroid Build Coastguard Worker
165*789431f2SAndroid Build Coastguard Worker UniquePtr<GenerateRkpKeyRequest> deserialized(round_trip(ver, req, 1));
166*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(deserialized->test_mode, req.test_mode);
167*789431f2SAndroid Build Coastguard Worker }
168*789431f2SAndroid Build Coastguard Worker }
169*789431f2SAndroid Build Coastguard Worker
TEST(RoundTrip,GenerateRkpKeyResponse)170*789431f2SAndroid Build Coastguard Worker TEST(RoundTrip, GenerateRkpKeyResponse) {
171*789431f2SAndroid Build Coastguard Worker for (int ver = 0; ver <= kMaxMessageVersion; ++ver) {
172*789431f2SAndroid Build Coastguard Worker GenerateRkpKeyResponse rsp(ver);
173*789431f2SAndroid Build Coastguard Worker rsp.error = KM_ERROR_OK;
174*789431f2SAndroid Build Coastguard Worker rsp.key_blob.key_material = dup_array(TEST_DATA);
175*789431f2SAndroid Build Coastguard Worker rsp.key_blob.key_material_size = array_length(TEST_DATA);
176*789431f2SAndroid Build Coastguard Worker rsp.maced_public_key.data = dup_array(TEST_DATA);
177*789431f2SAndroid Build Coastguard Worker rsp.maced_public_key.data_length = array_length(TEST_DATA);
178*789431f2SAndroid Build Coastguard Worker
179*789431f2SAndroid Build Coastguard Worker UniquePtr<GenerateRkpKeyResponse> deserialized;
180*789431f2SAndroid Build Coastguard Worker deserialized.reset(round_trip(ver, rsp, 34));
181*789431f2SAndroid Build Coastguard Worker
182*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(KM_ERROR_OK, deserialized->error);
183*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(deserialized->key_blob.key_material_size, rsp.key_blob.key_material_size);
184*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(0, std::memcmp(deserialized->key_blob.key_material, rsp.key_blob.key_material,
185*789431f2SAndroid Build Coastguard Worker deserialized->key_blob.key_material_size));
186*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(deserialized->maced_public_key.data_length, rsp.maced_public_key.data_length);
187*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(0, std::memcmp(deserialized->maced_public_key.data, rsp.maced_public_key.data,
188*789431f2SAndroid Build Coastguard Worker deserialized->maced_public_key.data_length));
189*789431f2SAndroid Build Coastguard Worker }
190*789431f2SAndroid Build Coastguard Worker }
191*789431f2SAndroid Build Coastguard Worker
TEST(RoundTrip,GenerateCsrRequest)192*789431f2SAndroid Build Coastguard Worker TEST(RoundTrip, GenerateCsrRequest) {
193*789431f2SAndroid Build Coastguard Worker for (int ver = 0; ver <= kMaxMessageVersion; ++ver) {
194*789431f2SAndroid Build Coastguard Worker GenerateCsrRequest req(ver);
195*789431f2SAndroid Build Coastguard Worker req.test_mode = true;
196*789431f2SAndroid Build Coastguard Worker req.num_keys = 2;
197*789431f2SAndroid Build Coastguard Worker req.keys_to_sign_array = new KeymasterBlob[req.num_keys];
198*789431f2SAndroid Build Coastguard Worker for (size_t i = 0; i < req.num_keys; i++) {
199*789431f2SAndroid Build Coastguard Worker req.SetKeyToSign(i, dup_array(TEST_DATA), array_length(TEST_DATA));
200*789431f2SAndroid Build Coastguard Worker }
201*789431f2SAndroid Build Coastguard Worker req.SetEndpointEncCertChain(dup_array(TEST_DATA), array_length(TEST_DATA));
202*789431f2SAndroid Build Coastguard Worker req.SetChallenge(dup_array(TEST_DATA), array_length(TEST_DATA));
203*789431f2SAndroid Build Coastguard Worker UniquePtr<GenerateCsrRequest> deserialized(round_trip(ver, req, 65));
204*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(deserialized->test_mode, req.test_mode);
205*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(deserialized->num_keys, req.num_keys);
206*789431f2SAndroid Build Coastguard Worker for (int i = 0; i < (int)req.num_keys; i++) {
207*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(deserialized->keys_to_sign_array[i].data_length,
208*789431f2SAndroid Build Coastguard Worker req.keys_to_sign_array[i].data_length);
209*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(0, std::memcmp(deserialized->keys_to_sign_array[i].data,
210*789431f2SAndroid Build Coastguard Worker req.keys_to_sign_array[i].data,
211*789431f2SAndroid Build Coastguard Worker req.keys_to_sign_array[i].data_length));
212*789431f2SAndroid Build Coastguard Worker }
213*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(deserialized->endpoint_enc_cert_chain.data_length,
214*789431f2SAndroid Build Coastguard Worker req.endpoint_enc_cert_chain.data_length);
215*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(0, std::memcmp(deserialized->endpoint_enc_cert_chain.data,
216*789431f2SAndroid Build Coastguard Worker req.endpoint_enc_cert_chain.data,
217*789431f2SAndroid Build Coastguard Worker req.endpoint_enc_cert_chain.data_length));
218*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(deserialized->challenge.data_length, req.challenge.data_length);
219*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(0, std::memcmp(deserialized->challenge.data, req.challenge.data,
220*789431f2SAndroid Build Coastguard Worker req.challenge.data_length));
221*789431f2SAndroid Build Coastguard Worker }
222*789431f2SAndroid Build Coastguard Worker }
223*789431f2SAndroid Build Coastguard Worker
TEST(RoundTrip,GenerateCsrResponse)224*789431f2SAndroid Build Coastguard Worker TEST(RoundTrip, GenerateCsrResponse) {
225*789431f2SAndroid Build Coastguard Worker for (int ver = 0; ver <= kMaxMessageVersion; ++ver) {
226*789431f2SAndroid Build Coastguard Worker GenerateCsrResponse rsp(ver);
227*789431f2SAndroid Build Coastguard Worker rsp.error = KM_ERROR_OK;
228*789431f2SAndroid Build Coastguard Worker rsp.keys_to_sign_mac.data = dup_array(TEST_DATA);
229*789431f2SAndroid Build Coastguard Worker rsp.keys_to_sign_mac.data_length = array_length(TEST_DATA);
230*789431f2SAndroid Build Coastguard Worker rsp.device_info_blob.data = dup_array(TEST_DATA);
231*789431f2SAndroid Build Coastguard Worker rsp.device_info_blob.data_length = array_length(TEST_DATA);
232*789431f2SAndroid Build Coastguard Worker rsp.protected_data_blob.data = dup_array(TEST_DATA);
233*789431f2SAndroid Build Coastguard Worker rsp.protected_data_blob.data_length = array_length(TEST_DATA);
234*789431f2SAndroid Build Coastguard Worker
235*789431f2SAndroid Build Coastguard Worker UniquePtr<GenerateCsrResponse> deserialized;
236*789431f2SAndroid Build Coastguard Worker deserialized.reset(round_trip(ver, rsp, 49));
237*789431f2SAndroid Build Coastguard Worker
238*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(KM_ERROR_OK, deserialized->error);
239*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(deserialized->keys_to_sign_mac.data_length, rsp.keys_to_sign_mac.data_length);
240*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(0, std::memcmp(deserialized->keys_to_sign_mac.data, rsp.keys_to_sign_mac.data,
241*789431f2SAndroid Build Coastguard Worker deserialized->keys_to_sign_mac.data_length));
242*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(deserialized->device_info_blob.data_length, rsp.device_info_blob.data_length);
243*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(0, std::memcmp(deserialized->device_info_blob.data, rsp.device_info_blob.data,
244*789431f2SAndroid Build Coastguard Worker deserialized->device_info_blob.data_length));
245*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(deserialized->protected_data_blob.data_length,
246*789431f2SAndroid Build Coastguard Worker rsp.protected_data_blob.data_length);
247*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(0,
248*789431f2SAndroid Build Coastguard Worker std::memcmp(deserialized->protected_data_blob.data, rsp.protected_data_blob.data,
249*789431f2SAndroid Build Coastguard Worker deserialized->protected_data_blob.data_length));
250*789431f2SAndroid Build Coastguard Worker }
251*789431f2SAndroid Build Coastguard Worker }
252*789431f2SAndroid Build Coastguard Worker
TEST(RoundTrip,GenerateCsrV2Request)253*789431f2SAndroid Build Coastguard Worker TEST(RoundTrip, GenerateCsrV2Request) {
254*789431f2SAndroid Build Coastguard Worker for (int ver = 0; ver <= kMaxMessageVersion; ++ver) {
255*789431f2SAndroid Build Coastguard Worker GenerateCsrV2Request req(ver);
256*789431f2SAndroid Build Coastguard Worker EXPECT_TRUE(req.InitKeysToSign(2));
257*789431f2SAndroid Build Coastguard Worker for (size_t i = 0; i < req.num_keys; i++) {
258*789431f2SAndroid Build Coastguard Worker req.SetKeyToSign(i, dup_array(TEST_DATA), array_length(TEST_DATA));
259*789431f2SAndroid Build Coastguard Worker }
260*789431f2SAndroid Build Coastguard Worker req.SetChallenge(dup_array(TEST_DATA), array_length(TEST_DATA));
261*789431f2SAndroid Build Coastguard Worker UniquePtr<GenerateCsrV2Request> deserialized(round_trip(ver, req, 49));
262*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(deserialized->num_keys, req.num_keys);
263*789431f2SAndroid Build Coastguard Worker for (int i = 0; i < (int)req.num_keys; i++) {
264*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(deserialized->keys_to_sign_array[i].data_length,
265*789431f2SAndroid Build Coastguard Worker req.keys_to_sign_array[i].data_length);
266*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(0, std::memcmp(deserialized->keys_to_sign_array[i].data,
267*789431f2SAndroid Build Coastguard Worker req.keys_to_sign_array[i].data,
268*789431f2SAndroid Build Coastguard Worker req.keys_to_sign_array[i].data_length));
269*789431f2SAndroid Build Coastguard Worker }
270*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(deserialized->challenge.data_length, req.challenge.data_length);
271*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(0, std::memcmp(deserialized->challenge.data, req.challenge.data,
272*789431f2SAndroid Build Coastguard Worker req.challenge.data_length));
273*789431f2SAndroid Build Coastguard Worker }
274*789431f2SAndroid Build Coastguard Worker }
275*789431f2SAndroid Build Coastguard Worker
TEST(RoundTrip,GenerateCsrV2Response)276*789431f2SAndroid Build Coastguard Worker TEST(RoundTrip, GenerateCsrV2Response) {
277*789431f2SAndroid Build Coastguard Worker for (int ver = 0; ver <= kMaxMessageVersion; ++ver) {
278*789431f2SAndroid Build Coastguard Worker GenerateCsrV2Response rsp(ver);
279*789431f2SAndroid Build Coastguard Worker rsp.error = KM_ERROR_OK;
280*789431f2SAndroid Build Coastguard Worker rsp.csr.data = dup_array(TEST_DATA);
281*789431f2SAndroid Build Coastguard Worker rsp.csr.data_length = array_length(TEST_DATA);
282*789431f2SAndroid Build Coastguard Worker
283*789431f2SAndroid Build Coastguard Worker UniquePtr<GenerateCsrV2Response> deserialized;
284*789431f2SAndroid Build Coastguard Worker deserialized.reset(round_trip(ver, rsp, 19));
285*789431f2SAndroid Build Coastguard Worker
286*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(KM_ERROR_OK, deserialized->error);
287*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(deserialized->csr.data_length, rsp.csr.data_length);
288*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(0,
289*789431f2SAndroid Build Coastguard Worker std::memcmp(deserialized->csr.data, rsp.csr.data, deserialized->csr.data_length));
290*789431f2SAndroid Build Coastguard Worker }
291*789431f2SAndroid Build Coastguard Worker }
292*789431f2SAndroid Build Coastguard Worker
TEST(RoundTrip,GetKeyCharacteristicsRequest)293*789431f2SAndroid Build Coastguard Worker TEST(RoundTrip, GetKeyCharacteristicsRequest) {
294*789431f2SAndroid Build Coastguard Worker for (int ver = 0; ver <= kMaxMessageVersion; ++ver) {
295*789431f2SAndroid Build Coastguard Worker GetKeyCharacteristicsRequest req(ver);
296*789431f2SAndroid Build Coastguard Worker req.additional_params.Reinitialize(params, array_length(params));
297*789431f2SAndroid Build Coastguard Worker req.SetKeyMaterial("foo", 3);
298*789431f2SAndroid Build Coastguard Worker
299*789431f2SAndroid Build Coastguard Worker UniquePtr<GetKeyCharacteristicsRequest> deserialized(round_trip(ver, req, 85));
300*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(7U, deserialized->additional_params.size());
301*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(3U, deserialized->key_blob.key_material_size);
302*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(0, memcmp(deserialized->key_blob.key_material, "foo", 3));
303*789431f2SAndroid Build Coastguard Worker }
304*789431f2SAndroid Build Coastguard Worker }
305*789431f2SAndroid Build Coastguard Worker
TEST(RoundTrip,GetKeyCharacteristicsResponse)306*789431f2SAndroid Build Coastguard Worker TEST(RoundTrip, GetKeyCharacteristicsResponse) {
307*789431f2SAndroid Build Coastguard Worker for (int ver = 0; ver <= kMaxMessageVersion; ++ver) {
308*789431f2SAndroid Build Coastguard Worker GetKeyCharacteristicsResponse msg(ver);
309*789431f2SAndroid Build Coastguard Worker msg.error = KM_ERROR_OK;
310*789431f2SAndroid Build Coastguard Worker msg.enforced.Reinitialize(params, array_length(params));
311*789431f2SAndroid Build Coastguard Worker msg.unenforced.Reinitialize(params, array_length(params));
312*789431f2SAndroid Build Coastguard Worker
313*789431f2SAndroid Build Coastguard Worker UniquePtr<GetKeyCharacteristicsResponse> deserialized(round_trip(ver, msg, 160));
314*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(msg.enforced, deserialized->enforced);
315*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(msg.unenforced, deserialized->unenforced);
316*789431f2SAndroid Build Coastguard Worker }
317*789431f2SAndroid Build Coastguard Worker }
318*789431f2SAndroid Build Coastguard Worker
TEST(RoundTrip,BeginOperationRequest)319*789431f2SAndroid Build Coastguard Worker TEST(RoundTrip, BeginOperationRequest) {
320*789431f2SAndroid Build Coastguard Worker for (int ver = 0; ver <= kMaxMessageVersion; ++ver) {
321*789431f2SAndroid Build Coastguard Worker BeginOperationRequest msg(ver);
322*789431f2SAndroid Build Coastguard Worker msg.purpose = KM_PURPOSE_SIGN;
323*789431f2SAndroid Build Coastguard Worker msg.SetKeyMaterial("foo", 3);
324*789431f2SAndroid Build Coastguard Worker msg.additional_params.Reinitialize(params, array_length(params));
325*789431f2SAndroid Build Coastguard Worker
326*789431f2SAndroid Build Coastguard Worker UniquePtr<BeginOperationRequest> deserialized(round_trip(ver, msg, 89));
327*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(KM_PURPOSE_SIGN, deserialized->purpose);
328*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(3U, deserialized->key_blob.key_material_size);
329*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(0, memcmp(deserialized->key_blob.key_material, "foo", 3));
330*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(msg.additional_params, deserialized->additional_params);
331*789431f2SAndroid Build Coastguard Worker }
332*789431f2SAndroid Build Coastguard Worker }
333*789431f2SAndroid Build Coastguard Worker
TEST(RoundTrip,BeginOperationResponse)334*789431f2SAndroid Build Coastguard Worker TEST(RoundTrip, BeginOperationResponse) {
335*789431f2SAndroid Build Coastguard Worker for (int ver = 0; ver <= kMaxMessageVersion; ++ver) {
336*789431f2SAndroid Build Coastguard Worker BeginOperationResponse msg(ver);
337*789431f2SAndroid Build Coastguard Worker msg.error = KM_ERROR_OK;
338*789431f2SAndroid Build Coastguard Worker msg.op_handle = 0xDEADBEEF;
339*789431f2SAndroid Build Coastguard Worker msg.output_params.push_back(Authorization(TAG_NONCE, "foo", 3));
340*789431f2SAndroid Build Coastguard Worker
341*789431f2SAndroid Build Coastguard Worker UniquePtr<BeginOperationResponse> deserialized;
342*789431f2SAndroid Build Coastguard Worker switch (ver) {
343*789431f2SAndroid Build Coastguard Worker case 0:
344*789431f2SAndroid Build Coastguard Worker deserialized.reset(round_trip(ver, msg, 12));
345*789431f2SAndroid Build Coastguard Worker break;
346*789431f2SAndroid Build Coastguard Worker case 1:
347*789431f2SAndroid Build Coastguard Worker case 2:
348*789431f2SAndroid Build Coastguard Worker case 3:
349*789431f2SAndroid Build Coastguard Worker case 4:
350*789431f2SAndroid Build Coastguard Worker deserialized.reset(round_trip(ver, msg, 39));
351*789431f2SAndroid Build Coastguard Worker break;
352*789431f2SAndroid Build Coastguard Worker default:
353*789431f2SAndroid Build Coastguard Worker FAIL();
354*789431f2SAndroid Build Coastguard Worker }
355*789431f2SAndroid Build Coastguard Worker
356*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(KM_ERROR_OK, deserialized->error);
357*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(0xDEADBEEF, deserialized->op_handle);
358*789431f2SAndroid Build Coastguard Worker
359*789431f2SAndroid Build Coastguard Worker switch (ver) {
360*789431f2SAndroid Build Coastguard Worker case 0:
361*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(0U, deserialized->output_params.size());
362*789431f2SAndroid Build Coastguard Worker break;
363*789431f2SAndroid Build Coastguard Worker case 1:
364*789431f2SAndroid Build Coastguard Worker case 2:
365*789431f2SAndroid Build Coastguard Worker case 3:
366*789431f2SAndroid Build Coastguard Worker case 4:
367*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(msg.output_params, deserialized->output_params);
368*789431f2SAndroid Build Coastguard Worker break;
369*789431f2SAndroid Build Coastguard Worker default:
370*789431f2SAndroid Build Coastguard Worker FAIL();
371*789431f2SAndroid Build Coastguard Worker }
372*789431f2SAndroid Build Coastguard Worker }
373*789431f2SAndroid Build Coastguard Worker }
374*789431f2SAndroid Build Coastguard Worker
TEST(RoundTrip,BeginOperationResponseError)375*789431f2SAndroid Build Coastguard Worker TEST(RoundTrip, BeginOperationResponseError) {
376*789431f2SAndroid Build Coastguard Worker for (int ver = 0; ver <= kMaxMessageVersion; ++ver) {
377*789431f2SAndroid Build Coastguard Worker BeginOperationResponse msg(ver);
378*789431f2SAndroid Build Coastguard Worker msg.error = KM_ERROR_INVALID_OPERATION_HANDLE;
379*789431f2SAndroid Build Coastguard Worker msg.op_handle = 0xDEADBEEF;
380*789431f2SAndroid Build Coastguard Worker
381*789431f2SAndroid Build Coastguard Worker UniquePtr<BeginOperationResponse> deserialized(round_trip(ver, msg, 4));
382*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(KM_ERROR_INVALID_OPERATION_HANDLE, deserialized->error);
383*789431f2SAndroid Build Coastguard Worker }
384*789431f2SAndroid Build Coastguard Worker }
385*789431f2SAndroid Build Coastguard Worker
TEST(RoundTrip,UpdateOperationRequest)386*789431f2SAndroid Build Coastguard Worker TEST(RoundTrip, UpdateOperationRequest) {
387*789431f2SAndroid Build Coastguard Worker for (int ver = 0; ver <= kMaxMessageVersion; ++ver) {
388*789431f2SAndroid Build Coastguard Worker UpdateOperationRequest msg(ver);
389*789431f2SAndroid Build Coastguard Worker msg.op_handle = 0xDEADBEEF;
390*789431f2SAndroid Build Coastguard Worker msg.input.Reinitialize("foo", 3);
391*789431f2SAndroid Build Coastguard Worker
392*789431f2SAndroid Build Coastguard Worker UniquePtr<UpdateOperationRequest> deserialized;
393*789431f2SAndroid Build Coastguard Worker switch (ver) {
394*789431f2SAndroid Build Coastguard Worker case 0:
395*789431f2SAndroid Build Coastguard Worker deserialized.reset(round_trip(ver, msg, 15));
396*789431f2SAndroid Build Coastguard Worker break;
397*789431f2SAndroid Build Coastguard Worker case 1:
398*789431f2SAndroid Build Coastguard Worker case 2:
399*789431f2SAndroid Build Coastguard Worker case 3:
400*789431f2SAndroid Build Coastguard Worker case 4:
401*789431f2SAndroid Build Coastguard Worker deserialized.reset(round_trip(ver, msg, 27));
402*789431f2SAndroid Build Coastguard Worker break;
403*789431f2SAndroid Build Coastguard Worker default:
404*789431f2SAndroid Build Coastguard Worker FAIL();
405*789431f2SAndroid Build Coastguard Worker }
406*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(3U, deserialized->input.available_read());
407*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(0, memcmp(deserialized->input.peek_read(), "foo", 3));
408*789431f2SAndroid Build Coastguard Worker }
409*789431f2SAndroid Build Coastguard Worker }
410*789431f2SAndroid Build Coastguard Worker
TEST(RoundTrip,UpdateOperationResponse)411*789431f2SAndroid Build Coastguard Worker TEST(RoundTrip, UpdateOperationResponse) {
412*789431f2SAndroid Build Coastguard Worker for (int ver = 0; ver <= kMaxMessageVersion; ++ver) {
413*789431f2SAndroid Build Coastguard Worker UpdateOperationResponse msg(ver);
414*789431f2SAndroid Build Coastguard Worker msg.error = KM_ERROR_OK;
415*789431f2SAndroid Build Coastguard Worker msg.output.Reinitialize("foo", 3);
416*789431f2SAndroid Build Coastguard Worker msg.input_consumed = 99;
417*789431f2SAndroid Build Coastguard Worker msg.output_params.push_back(TAG_APPLICATION_ID, "bar", 3);
418*789431f2SAndroid Build Coastguard Worker
419*789431f2SAndroid Build Coastguard Worker UniquePtr<UpdateOperationResponse> deserialized;
420*789431f2SAndroid Build Coastguard Worker switch (ver) {
421*789431f2SAndroid Build Coastguard Worker case 0:
422*789431f2SAndroid Build Coastguard Worker deserialized.reset(round_trip(ver, msg, 11));
423*789431f2SAndroid Build Coastguard Worker break;
424*789431f2SAndroid Build Coastguard Worker case 1:
425*789431f2SAndroid Build Coastguard Worker deserialized.reset(round_trip(ver, msg, 15));
426*789431f2SAndroid Build Coastguard Worker break;
427*789431f2SAndroid Build Coastguard Worker case 2:
428*789431f2SAndroid Build Coastguard Worker case 3:
429*789431f2SAndroid Build Coastguard Worker case 4:
430*789431f2SAndroid Build Coastguard Worker deserialized.reset(round_trip(ver, msg, 42));
431*789431f2SAndroid Build Coastguard Worker break;
432*789431f2SAndroid Build Coastguard Worker default:
433*789431f2SAndroid Build Coastguard Worker FAIL();
434*789431f2SAndroid Build Coastguard Worker }
435*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(KM_ERROR_OK, deserialized->error);
436*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(3U, deserialized->output.available_read());
437*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(0, memcmp(deserialized->output.peek_read(), "foo", 3));
438*789431f2SAndroid Build Coastguard Worker
439*789431f2SAndroid Build Coastguard Worker switch (ver) {
440*789431f2SAndroid Build Coastguard Worker case 0:
441*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(0U, deserialized->input_consumed);
442*789431f2SAndroid Build Coastguard Worker break;
443*789431f2SAndroid Build Coastguard Worker case 1:
444*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(99U, deserialized->input_consumed);
445*789431f2SAndroid Build Coastguard Worker break;
446*789431f2SAndroid Build Coastguard Worker case 2:
447*789431f2SAndroid Build Coastguard Worker case 3:
448*789431f2SAndroid Build Coastguard Worker case 4:
449*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(99U, deserialized->input_consumed);
450*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(1U, deserialized->output_params.size());
451*789431f2SAndroid Build Coastguard Worker break;
452*789431f2SAndroid Build Coastguard Worker default:
453*789431f2SAndroid Build Coastguard Worker FAIL();
454*789431f2SAndroid Build Coastguard Worker }
455*789431f2SAndroid Build Coastguard Worker }
456*789431f2SAndroid Build Coastguard Worker }
457*789431f2SAndroid Build Coastguard Worker
TEST(RoundTrip,FinishOperationRequest)458*789431f2SAndroid Build Coastguard Worker TEST(RoundTrip, FinishOperationRequest) {
459*789431f2SAndroid Build Coastguard Worker for (int ver = 0; ver <= kMaxMessageVersion; ++ver) {
460*789431f2SAndroid Build Coastguard Worker FinishOperationRequest msg(ver);
461*789431f2SAndroid Build Coastguard Worker msg.op_handle = 0xDEADBEEF;
462*789431f2SAndroid Build Coastguard Worker msg.signature.Reinitialize("bar", 3);
463*789431f2SAndroid Build Coastguard Worker msg.input.Reinitialize("baz", 3);
464*789431f2SAndroid Build Coastguard Worker
465*789431f2SAndroid Build Coastguard Worker UniquePtr<FinishOperationRequest> deserialized;
466*789431f2SAndroid Build Coastguard Worker switch (ver) {
467*789431f2SAndroid Build Coastguard Worker case 0:
468*789431f2SAndroid Build Coastguard Worker deserialized.reset(round_trip(ver, msg, 15));
469*789431f2SAndroid Build Coastguard Worker break;
470*789431f2SAndroid Build Coastguard Worker case 1:
471*789431f2SAndroid Build Coastguard Worker case 2:
472*789431f2SAndroid Build Coastguard Worker deserialized.reset(round_trip(ver, msg, 27));
473*789431f2SAndroid Build Coastguard Worker break;
474*789431f2SAndroid Build Coastguard Worker case 3:
475*789431f2SAndroid Build Coastguard Worker case 4:
476*789431f2SAndroid Build Coastguard Worker deserialized.reset(round_trip(ver, msg, 34));
477*789431f2SAndroid Build Coastguard Worker break;
478*789431f2SAndroid Build Coastguard Worker default:
479*789431f2SAndroid Build Coastguard Worker FAIL();
480*789431f2SAndroid Build Coastguard Worker }
481*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(0xDEADBEEF, deserialized->op_handle);
482*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(3U, deserialized->signature.available_read());
483*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(0, memcmp(deserialized->signature.peek_read(), "bar", 3));
484*789431f2SAndroid Build Coastguard Worker }
485*789431f2SAndroid Build Coastguard Worker }
486*789431f2SAndroid Build Coastguard Worker
TEST(Round_Trip,FinishOperationResponse)487*789431f2SAndroid Build Coastguard Worker TEST(Round_Trip, FinishOperationResponse) {
488*789431f2SAndroid Build Coastguard Worker for (int ver = 0; ver <= kMaxMessageVersion; ++ver) {
489*789431f2SAndroid Build Coastguard Worker FinishOperationResponse msg(ver);
490*789431f2SAndroid Build Coastguard Worker msg.error = KM_ERROR_OK;
491*789431f2SAndroid Build Coastguard Worker msg.output.Reinitialize("foo", 3);
492*789431f2SAndroid Build Coastguard Worker
493*789431f2SAndroid Build Coastguard Worker UniquePtr<FinishOperationResponse> deserialized;
494*789431f2SAndroid Build Coastguard Worker switch (ver) {
495*789431f2SAndroid Build Coastguard Worker case 0:
496*789431f2SAndroid Build Coastguard Worker case 1:
497*789431f2SAndroid Build Coastguard Worker deserialized.reset(round_trip(ver, msg, 11));
498*789431f2SAndroid Build Coastguard Worker break;
499*789431f2SAndroid Build Coastguard Worker case 2:
500*789431f2SAndroid Build Coastguard Worker case 3:
501*789431f2SAndroid Build Coastguard Worker case 4:
502*789431f2SAndroid Build Coastguard Worker deserialized.reset(round_trip(ver, msg, 23));
503*789431f2SAndroid Build Coastguard Worker break;
504*789431f2SAndroid Build Coastguard Worker default:
505*789431f2SAndroid Build Coastguard Worker FAIL();
506*789431f2SAndroid Build Coastguard Worker }
507*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(msg.error, deserialized->error);
508*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(msg.output.available_read(), deserialized->output.available_read());
509*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(0, memcmp(msg.output.peek_read(), deserialized->output.peek_read(),
510*789431f2SAndroid Build Coastguard Worker msg.output.available_read()));
511*789431f2SAndroid Build Coastguard Worker }
512*789431f2SAndroid Build Coastguard Worker }
513*789431f2SAndroid Build Coastguard Worker
TEST(RoundTrip,ImportKeyRequest)514*789431f2SAndroid Build Coastguard Worker TEST(RoundTrip, ImportKeyRequest) {
515*789431f2SAndroid Build Coastguard Worker for (int ver = 0; ver <= kMaxMessageVersion; ++ver) {
516*789431f2SAndroid Build Coastguard Worker ImportKeyRequest msg(ver);
517*789431f2SAndroid Build Coastguard Worker msg.key_description.Reinitialize(params, array_length(params));
518*789431f2SAndroid Build Coastguard Worker msg.key_format = KM_KEY_FORMAT_X509;
519*789431f2SAndroid Build Coastguard Worker msg.key_data = KeymasterKeyBlob(reinterpret_cast<const uint8_t*>("foo"), 3);
520*789431f2SAndroid Build Coastguard Worker msg.attestation_signing_key_blob =
521*789431f2SAndroid Build Coastguard Worker KeymasterKeyBlob(reinterpret_cast<const uint8_t*>("bar"), 3);
522*789431f2SAndroid Build Coastguard Worker msg.attest_key_params.Reinitialize(params, array_length(params));
523*789431f2SAndroid Build Coastguard Worker msg.issuer_subject = KeymasterBlob(reinterpret_cast<const uint8_t*>("bar"), 3);
524*789431f2SAndroid Build Coastguard Worker
525*789431f2SAndroid Build Coastguard Worker UniquePtr<ImportKeyRequest> deserialized(round_trip(ver, msg, ver < 4 ? 89 : 181));
526*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(msg.key_description, deserialized->key_description);
527*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(msg.key_format, deserialized->key_format);
528*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(msg.key_data.key_material_size, deserialized->key_data.key_material_size);
529*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(0, memcmp(msg.key_data.key_material, deserialized->key_data.key_material,
530*789431f2SAndroid Build Coastguard Worker msg.key_data.key_material_size));
531*789431f2SAndroid Build Coastguard Worker if (ver < 4) {
532*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(0U, deserialized->attestation_signing_key_blob.key_material_size);
533*789431f2SAndroid Build Coastguard Worker } else {
534*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(3U, deserialized->attestation_signing_key_blob.key_material_size);
535*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(0, memcmp(msg.attestation_signing_key_blob.key_material,
536*789431f2SAndroid Build Coastguard Worker deserialized->attestation_signing_key_blob.key_material,
537*789431f2SAndroid Build Coastguard Worker msg.attestation_signing_key_blob.key_material_size));
538*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(deserialized->attest_key_params, msg.attest_key_params);
539*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(0, memcmp(msg.issuer_subject.data, deserialized->issuer_subject.data,
540*789431f2SAndroid Build Coastguard Worker deserialized->issuer_subject.data_length));
541*789431f2SAndroid Build Coastguard Worker }
542*789431f2SAndroid Build Coastguard Worker }
543*789431f2SAndroid Build Coastguard Worker }
544*789431f2SAndroid Build Coastguard Worker
TEST(RoundTrip,ImportKeyResponse)545*789431f2SAndroid Build Coastguard Worker TEST(RoundTrip, ImportKeyResponse) {
546*789431f2SAndroid Build Coastguard Worker for (int ver = 0; ver <= kMaxMessageVersion; ++ver) {
547*789431f2SAndroid Build Coastguard Worker ImportKeyResponse msg(ver);
548*789431f2SAndroid Build Coastguard Worker msg.error = KM_ERROR_OK;
549*789431f2SAndroid Build Coastguard Worker msg.SetKeyMaterial("foo", 3);
550*789431f2SAndroid Build Coastguard Worker msg.enforced.Reinitialize(params, array_length(params));
551*789431f2SAndroid Build Coastguard Worker msg.unenforced.Reinitialize(params, array_length(params));
552*789431f2SAndroid Build Coastguard Worker
553*789431f2SAndroid Build Coastguard Worker msg.certificate_chain = CertificateChain(3);
554*789431f2SAndroid Build Coastguard Worker msg.certificate_chain.entries[0] = {dup_buffer("foo", 3), 3};
555*789431f2SAndroid Build Coastguard Worker msg.certificate_chain.entries[1] = {dup_buffer("bar", 3), 3};
556*789431f2SAndroid Build Coastguard Worker msg.certificate_chain.entries[2] = {dup_buffer("baz", 3), 3};
557*789431f2SAndroid Build Coastguard Worker
558*789431f2SAndroid Build Coastguard Worker UniquePtr<ImportKeyResponse> deserialized;
559*789431f2SAndroid Build Coastguard Worker if (ver < 4) {
560*789431f2SAndroid Build Coastguard Worker deserialized.reset(round_trip(ver, msg, 167));
561*789431f2SAndroid Build Coastguard Worker } else {
562*789431f2SAndroid Build Coastguard Worker deserialized.reset(round_trip(ver, msg, 192));
563*789431f2SAndroid Build Coastguard Worker }
564*789431f2SAndroid Build Coastguard Worker
565*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(msg.error, deserialized->error);
566*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(msg.key_blob.key_material_size, deserialized->key_blob.key_material_size);
567*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(0, memcmp(msg.key_blob.key_material, deserialized->key_blob.key_material,
568*789431f2SAndroid Build Coastguard Worker msg.key_blob.key_material_size));
569*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(msg.enforced, deserialized->enforced);
570*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(msg.unenforced, deserialized->unenforced);
571*789431f2SAndroid Build Coastguard Worker
572*789431f2SAndroid Build Coastguard Worker keymaster_cert_chain_t* chain = &deserialized->certificate_chain;
573*789431f2SAndroid Build Coastguard Worker if (ver < 4) {
574*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(nullptr, chain->entries);
575*789431f2SAndroid Build Coastguard Worker } else {
576*789431f2SAndroid Build Coastguard Worker EXPECT_NE(nullptr, chain->entries);
577*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(3U, chain->entry_count);
578*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(3U, chain->entries[0].data_length);
579*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(0, memcmp("foo", chain->entries[0].data, 3));
580*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(3U, chain->entries[1].data_length);
581*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(0, memcmp("bar", chain->entries[1].data, 3));
582*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(3U, chain->entries[2].data_length);
583*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(0, memcmp("baz", chain->entries[2].data, 3));
584*789431f2SAndroid Build Coastguard Worker }
585*789431f2SAndroid Build Coastguard Worker }
586*789431f2SAndroid Build Coastguard Worker }
587*789431f2SAndroid Build Coastguard Worker
TEST(RoundTrip,ExportKeyRequest)588*789431f2SAndroid Build Coastguard Worker TEST(RoundTrip, ExportKeyRequest) {
589*789431f2SAndroid Build Coastguard Worker for (int ver = 0; ver <= kMaxMessageVersion; ++ver) {
590*789431f2SAndroid Build Coastguard Worker ExportKeyRequest msg(ver);
591*789431f2SAndroid Build Coastguard Worker msg.additional_params.Reinitialize(params, array_length(params));
592*789431f2SAndroid Build Coastguard Worker msg.key_format = KM_KEY_FORMAT_X509;
593*789431f2SAndroid Build Coastguard Worker msg.SetKeyMaterial("foo", 3);
594*789431f2SAndroid Build Coastguard Worker
595*789431f2SAndroid Build Coastguard Worker UniquePtr<ExportKeyRequest> deserialized(round_trip(ver, msg, 89));
596*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(msg.additional_params, deserialized->additional_params);
597*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(msg.key_format, deserialized->key_format);
598*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(3U, deserialized->key_blob.key_material_size);
599*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(0, memcmp("foo", deserialized->key_blob.key_material, 3));
600*789431f2SAndroid Build Coastguard Worker }
601*789431f2SAndroid Build Coastguard Worker }
602*789431f2SAndroid Build Coastguard Worker
TEST(RoundTrip,ExportKeyResponse)603*789431f2SAndroid Build Coastguard Worker TEST(RoundTrip, ExportKeyResponse) {
604*789431f2SAndroid Build Coastguard Worker for (int ver = 0; ver <= kMaxMessageVersion; ++ver) {
605*789431f2SAndroid Build Coastguard Worker ExportKeyResponse msg(ver);
606*789431f2SAndroid Build Coastguard Worker msg.error = KM_ERROR_OK;
607*789431f2SAndroid Build Coastguard Worker msg.SetKeyMaterial("foo", 3);
608*789431f2SAndroid Build Coastguard Worker
609*789431f2SAndroid Build Coastguard Worker UniquePtr<ExportKeyResponse> deserialized(round_trip(ver, msg, 11));
610*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(3U, deserialized->key_data_length);
611*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(0, memcmp("foo", deserialized->key_data, 3));
612*789431f2SAndroid Build Coastguard Worker }
613*789431f2SAndroid Build Coastguard Worker }
614*789431f2SAndroid Build Coastguard Worker
TEST(RoundTrip,DeleteKeyRequest)615*789431f2SAndroid Build Coastguard Worker TEST(RoundTrip, DeleteKeyRequest) {
616*789431f2SAndroid Build Coastguard Worker for (int ver = 0; ver <= kMaxMessageVersion; ++ver) {
617*789431f2SAndroid Build Coastguard Worker DeleteKeyRequest msg(ver);
618*789431f2SAndroid Build Coastguard Worker msg.SetKeyMaterial("foo", 3);
619*789431f2SAndroid Build Coastguard Worker
620*789431f2SAndroid Build Coastguard Worker UniquePtr<DeleteKeyRequest> deserialized(round_trip(ver, msg, 7));
621*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(3U, deserialized->key_blob.key_material_size);
622*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(0, memcmp("foo", deserialized->key_blob.key_material, 3));
623*789431f2SAndroid Build Coastguard Worker }
624*789431f2SAndroid Build Coastguard Worker }
625*789431f2SAndroid Build Coastguard Worker
TEST(RoundTrip,DeleteAllKeysRequest)626*789431f2SAndroid Build Coastguard Worker TEST(RoundTrip, DeleteAllKeysRequest) {
627*789431f2SAndroid Build Coastguard Worker for (int ver = 0; ver <= kMaxMessageVersion; ++ver) {
628*789431f2SAndroid Build Coastguard Worker DeleteAllKeysRequest msg(ver);
629*789431f2SAndroid Build Coastguard Worker UniquePtr<DeleteAllKeysRequest> deserialized(round_trip(ver, msg, 0));
630*789431f2SAndroid Build Coastguard Worker }
631*789431f2SAndroid Build Coastguard Worker }
632*789431f2SAndroid Build Coastguard Worker
TEST(RoundTrip,GetVersionRequest)633*789431f2SAndroid Build Coastguard Worker TEST(RoundTrip, GetVersionRequest) {
634*789431f2SAndroid Build Coastguard Worker GetVersionRequest msg(0);
635*789431f2SAndroid Build Coastguard Worker
636*789431f2SAndroid Build Coastguard Worker size_t size = msg.SerializedSize();
637*789431f2SAndroid Build Coastguard Worker ASSERT_EQ(0U, size);
638*789431f2SAndroid Build Coastguard Worker
639*789431f2SAndroid Build Coastguard Worker UniquePtr<uint8_t[]> buf(new uint8_t[size]);
640*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(buf.get() + size, msg.Serialize(buf.get(), buf.get() + size));
641*789431f2SAndroid Build Coastguard Worker
642*789431f2SAndroid Build Coastguard Worker GetVersionRequest deserialized;
643*789431f2SAndroid Build Coastguard Worker const uint8_t* p = buf.get();
644*789431f2SAndroid Build Coastguard Worker EXPECT_TRUE(deserialized.Deserialize(&p, p + size));
645*789431f2SAndroid Build Coastguard Worker EXPECT_EQ((ptrdiff_t)size, p - buf.get());
646*789431f2SAndroid Build Coastguard Worker }
647*789431f2SAndroid Build Coastguard Worker
TEST(RoundTrip,GetVersionResponse)648*789431f2SAndroid Build Coastguard Worker TEST(RoundTrip, GetVersionResponse) {
649*789431f2SAndroid Build Coastguard Worker GetVersionResponse msg(0);
650*789431f2SAndroid Build Coastguard Worker msg.error = KM_ERROR_OK;
651*789431f2SAndroid Build Coastguard Worker msg.major_ver = 9;
652*789431f2SAndroid Build Coastguard Worker msg.minor_ver = 98;
653*789431f2SAndroid Build Coastguard Worker msg.subminor_ver = 38;
654*789431f2SAndroid Build Coastguard Worker
655*789431f2SAndroid Build Coastguard Worker size_t size = msg.SerializedSize();
656*789431f2SAndroid Build Coastguard Worker ASSERT_EQ(7U, size);
657*789431f2SAndroid Build Coastguard Worker
658*789431f2SAndroid Build Coastguard Worker UniquePtr<uint8_t[]> buf(new uint8_t[size]);
659*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(buf.get() + size, msg.Serialize(buf.get(), buf.get() + size));
660*789431f2SAndroid Build Coastguard Worker
661*789431f2SAndroid Build Coastguard Worker GetVersionResponse deserialized;
662*789431f2SAndroid Build Coastguard Worker const uint8_t* p = buf.get();
663*789431f2SAndroid Build Coastguard Worker EXPECT_TRUE(deserialized.Deserialize(&p, p + size));
664*789431f2SAndroid Build Coastguard Worker EXPECT_EQ((ptrdiff_t)size, p - buf.get());
665*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(9U, msg.major_ver);
666*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(98U, msg.minor_ver);
667*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(38U, msg.subminor_ver);
668*789431f2SAndroid Build Coastguard Worker }
669*789431f2SAndroid Build Coastguard Worker
TEST(RoundTrip,GetVersion2Request)670*789431f2SAndroid Build Coastguard Worker TEST(RoundTrip, GetVersion2Request) {
671*789431f2SAndroid Build Coastguard Worker GetVersion2Request msg;
672*789431f2SAndroid Build Coastguard Worker
673*789431f2SAndroid Build Coastguard Worker msg.max_message_version = 0xDEADBEEF;
674*789431f2SAndroid Build Coastguard Worker size_t size = msg.SerializedSize();
675*789431f2SAndroid Build Coastguard Worker ASSERT_EQ(4U, size);
676*789431f2SAndroid Build Coastguard Worker
677*789431f2SAndroid Build Coastguard Worker UniquePtr<uint8_t[]> buf(new uint8_t[size]);
678*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(buf.get() + size, msg.Serialize(buf.get(), buf.get() + size));
679*789431f2SAndroid Build Coastguard Worker
680*789431f2SAndroid Build Coastguard Worker GetVersion2Request deserialized;
681*789431f2SAndroid Build Coastguard Worker const uint8_t* p = buf.get();
682*789431f2SAndroid Build Coastguard Worker EXPECT_TRUE(deserialized.Deserialize(&p, p + size));
683*789431f2SAndroid Build Coastguard Worker EXPECT_EQ((ptrdiff_t)size, p - buf.get());
684*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(0xDEADBEEF, msg.max_message_version);
685*789431f2SAndroid Build Coastguard Worker }
686*789431f2SAndroid Build Coastguard Worker
TEST(RoundTrip,GetVersion2Response)687*789431f2SAndroid Build Coastguard Worker TEST(RoundTrip, GetVersion2Response) {
688*789431f2SAndroid Build Coastguard Worker GetVersion2Response msg;
689*789431f2SAndroid Build Coastguard Worker msg.error = KM_ERROR_OK;
690*789431f2SAndroid Build Coastguard Worker msg.km_version = KmVersion::KEYMINT_1;
691*789431f2SAndroid Build Coastguard Worker msg.km_date = 20121900;
692*789431f2SAndroid Build Coastguard Worker
693*789431f2SAndroid Build Coastguard Worker size_t size = msg.SerializedSize();
694*789431f2SAndroid Build Coastguard Worker ASSERT_EQ(16U, size);
695*789431f2SAndroid Build Coastguard Worker
696*789431f2SAndroid Build Coastguard Worker UniquePtr<uint8_t[]> buf(new uint8_t[size]);
697*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(buf.get() + size, msg.Serialize(buf.get(), buf.get() + size));
698*789431f2SAndroid Build Coastguard Worker
699*789431f2SAndroid Build Coastguard Worker GetVersion2Response deserialized;
700*789431f2SAndroid Build Coastguard Worker const uint8_t* p = buf.get();
701*789431f2SAndroid Build Coastguard Worker EXPECT_TRUE(deserialized.Deserialize(&p, p + size));
702*789431f2SAndroid Build Coastguard Worker EXPECT_EQ((ptrdiff_t)size, p - buf.get());
703*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(KmVersion::KEYMINT_1, msg.km_version);
704*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(20121900U, msg.km_date);
705*789431f2SAndroid Build Coastguard Worker }
706*789431f2SAndroid Build Coastguard Worker
TEST(RoundTrip,ConfigureRequest)707*789431f2SAndroid Build Coastguard Worker TEST(RoundTrip, ConfigureRequest) {
708*789431f2SAndroid Build Coastguard Worker for (int ver = 0; ver <= kMaxMessageVersion; ++ver) {
709*789431f2SAndroid Build Coastguard Worker ConfigureRequest req(ver);
710*789431f2SAndroid Build Coastguard Worker req.os_version = 1;
711*789431f2SAndroid Build Coastguard Worker req.os_patchlevel = 1;
712*789431f2SAndroid Build Coastguard Worker
713*789431f2SAndroid Build Coastguard Worker UniquePtr<ConfigureRequest> deserialized(round_trip(ver, req, 8));
714*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(deserialized->os_version, req.os_version);
715*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(deserialized->os_patchlevel, req.os_patchlevel);
716*789431f2SAndroid Build Coastguard Worker }
717*789431f2SAndroid Build Coastguard Worker }
718*789431f2SAndroid Build Coastguard Worker
TEST(RoundTrip,ConfigureResponse)719*789431f2SAndroid Build Coastguard Worker TEST(RoundTrip, ConfigureResponse) {
720*789431f2SAndroid Build Coastguard Worker for (int ver = 0; ver <= kMaxMessageVersion; ++ver) {
721*789431f2SAndroid Build Coastguard Worker ConfigureResponse rsp(ver);
722*789431f2SAndroid Build Coastguard Worker UniquePtr<ConfigureResponse> deserialized(round_trip(ver, rsp, 4));
723*789431f2SAndroid Build Coastguard Worker }
724*789431f2SAndroid Build Coastguard Worker }
725*789431f2SAndroid Build Coastguard Worker
TEST(RoundTrip,ConfigureVendorPatchlevelRequest)726*789431f2SAndroid Build Coastguard Worker TEST(RoundTrip, ConfigureVendorPatchlevelRequest) {
727*789431f2SAndroid Build Coastguard Worker for (int ver = 0; ver <= kMaxMessageVersion; ++ver) {
728*789431f2SAndroid Build Coastguard Worker ConfigureVendorPatchlevelRequest req(ver);
729*789431f2SAndroid Build Coastguard Worker req.vendor_patchlevel = 2;
730*789431f2SAndroid Build Coastguard Worker
731*789431f2SAndroid Build Coastguard Worker UniquePtr<ConfigureVendorPatchlevelRequest> deserialized(round_trip(ver, req, 4));
732*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(deserialized->vendor_patchlevel, req.vendor_patchlevel);
733*789431f2SAndroid Build Coastguard Worker }
734*789431f2SAndroid Build Coastguard Worker }
735*789431f2SAndroid Build Coastguard Worker
TEST(RoundTrip,ConfigureVendorPatchlevelResponse)736*789431f2SAndroid Build Coastguard Worker TEST(RoundTrip, ConfigureVendorPatchlevelResponse) {
737*789431f2SAndroid Build Coastguard Worker for (int ver = 0; ver <= kMaxMessageVersion; ++ver) {
738*789431f2SAndroid Build Coastguard Worker ConfigureVendorPatchlevelResponse rsp(ver);
739*789431f2SAndroid Build Coastguard Worker UniquePtr<ConfigureVendorPatchlevelResponse> deserialized(round_trip(ver, rsp, 4));
740*789431f2SAndroid Build Coastguard Worker }
741*789431f2SAndroid Build Coastguard Worker }
742*789431f2SAndroid Build Coastguard Worker
TEST(RoundTrip,ConfigureBootPatchlevelRequest)743*789431f2SAndroid Build Coastguard Worker TEST(RoundTrip, ConfigureBootPatchlevelRequest) {
744*789431f2SAndroid Build Coastguard Worker for (int ver = 0; ver <= kMaxMessageVersion; ++ver) {
745*789431f2SAndroid Build Coastguard Worker ConfigureBootPatchlevelRequest req(ver);
746*789431f2SAndroid Build Coastguard Worker req.boot_patchlevel = 2;
747*789431f2SAndroid Build Coastguard Worker
748*789431f2SAndroid Build Coastguard Worker UniquePtr<ConfigureBootPatchlevelRequest> deserialized(round_trip(ver, req, 4));
749*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(deserialized->boot_patchlevel, req.boot_patchlevel);
750*789431f2SAndroid Build Coastguard Worker }
751*789431f2SAndroid Build Coastguard Worker }
752*789431f2SAndroid Build Coastguard Worker
TEST(RoundTrip,ConfigureBootPatchlevelResponse)753*789431f2SAndroid Build Coastguard Worker TEST(RoundTrip, ConfigureBootPatchlevelResponse) {
754*789431f2SAndroid Build Coastguard Worker for (int ver = 0; ver <= kMaxMessageVersion; ++ver) {
755*789431f2SAndroid Build Coastguard Worker ConfigureBootPatchlevelResponse rsp(ver);
756*789431f2SAndroid Build Coastguard Worker UniquePtr<ConfigureBootPatchlevelResponse> deserialized(round_trip(ver, rsp, 4));
757*789431f2SAndroid Build Coastguard Worker }
758*789431f2SAndroid Build Coastguard Worker }
759*789431f2SAndroid Build Coastguard Worker
TEST(RoundTrip,ConfigureVerifiedBootInfoRequest)760*789431f2SAndroid Build Coastguard Worker TEST(RoundTrip, ConfigureVerifiedBootInfoRequest) {
761*789431f2SAndroid Build Coastguard Worker for (int32_t ver = 0; ver <= kMaxMessageVersion; ++ver) {
762*789431f2SAndroid Build Coastguard Worker ConfigureVerifiedBootInfoRequest req(ver, "super", "duper", {1, 2, 3, 4, 5, 6});
763*789431f2SAndroid Build Coastguard Worker
764*789431f2SAndroid Build Coastguard Worker UniquePtr<ConfigureVerifiedBootInfoRequest> deserialized(round_trip(ver, req, 28));
765*789431f2SAndroid Build Coastguard Worker ASSERT_NE(deserialized, nullptr);
766*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(deserialized->boot_state, req.boot_state);
767*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(deserialized->bootloader_state, req.bootloader_state);
768*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(deserialized->vbmeta_digest, req.vbmeta_digest);
769*789431f2SAndroid Build Coastguard Worker }
770*789431f2SAndroid Build Coastguard Worker }
771*789431f2SAndroid Build Coastguard Worker
TEST(RoundTrip,ConfigureVerifiedBootInfoResponse)772*789431f2SAndroid Build Coastguard Worker TEST(RoundTrip, ConfigureVerifiedBootInfoResponse) {
773*789431f2SAndroid Build Coastguard Worker for (int ver = 0; ver <= kMaxMessageVersion; ++ver) {
774*789431f2SAndroid Build Coastguard Worker ConfigureVerifiedBootInfoResponse rsp(ver);
775*789431f2SAndroid Build Coastguard Worker UniquePtr<ConfigureVerifiedBootInfoResponse> deserialized(round_trip(ver, rsp, 4));
776*789431f2SAndroid Build Coastguard Worker }
777*789431f2SAndroid Build Coastguard Worker }
778*789431f2SAndroid Build Coastguard Worker
TEST(RoundTrip,AddEntropyRequest)779*789431f2SAndroid Build Coastguard Worker TEST(RoundTrip, AddEntropyRequest) {
780*789431f2SAndroid Build Coastguard Worker for (int ver = 0; ver <= kMaxMessageVersion; ++ver) {
781*789431f2SAndroid Build Coastguard Worker AddEntropyRequest msg(ver);
782*789431f2SAndroid Build Coastguard Worker msg.random_data.Reinitialize("foo", 3);
783*789431f2SAndroid Build Coastguard Worker
784*789431f2SAndroid Build Coastguard Worker UniquePtr<AddEntropyRequest> deserialized(round_trip(ver, msg, 7));
785*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(3U, deserialized->random_data.available_read());
786*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(0, memcmp("foo", deserialized->random_data.peek_read(), 3));
787*789431f2SAndroid Build Coastguard Worker }
788*789431f2SAndroid Build Coastguard Worker }
789*789431f2SAndroid Build Coastguard Worker
TEST(RoundTrip,AbortOperationRequest)790*789431f2SAndroid Build Coastguard Worker TEST(RoundTrip, AbortOperationRequest) {
791*789431f2SAndroid Build Coastguard Worker for (int ver = 0; ver <= kMaxMessageVersion; ++ver) {
792*789431f2SAndroid Build Coastguard Worker AbortOperationRequest msg(ver);
793*789431f2SAndroid Build Coastguard Worker UniquePtr<AbortOperationRequest> deserialized(round_trip(ver, msg, 8));
794*789431f2SAndroid Build Coastguard Worker }
795*789431f2SAndroid Build Coastguard Worker }
796*789431f2SAndroid Build Coastguard Worker
TEST(RoundTrip,AttestKeyRequest)797*789431f2SAndroid Build Coastguard Worker TEST(RoundTrip, AttestKeyRequest) {
798*789431f2SAndroid Build Coastguard Worker for (int ver = 0; ver <= kMaxMessageVersion; ++ver) {
799*789431f2SAndroid Build Coastguard Worker AttestKeyRequest msg(ver);
800*789431f2SAndroid Build Coastguard Worker msg.SetKeyMaterial("foo", 3);
801*789431f2SAndroid Build Coastguard Worker msg.attest_params.Reinitialize(params, array_length(params));
802*789431f2SAndroid Build Coastguard Worker
803*789431f2SAndroid Build Coastguard Worker UniquePtr<AttestKeyRequest> deserialized(round_trip(ver, msg, 85));
804*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(3U, deserialized->key_blob.key_material_size);
805*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(0, memcmp("foo", deserialized->key_blob.key_material, 3));
806*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(msg.attest_params, deserialized->attest_params);
807*789431f2SAndroid Build Coastguard Worker }
808*789431f2SAndroid Build Coastguard Worker }
809*789431f2SAndroid Build Coastguard Worker
TEST(RoundTrip,AttestKeyResponse)810*789431f2SAndroid Build Coastguard Worker TEST(RoundTrip, AttestKeyResponse) {
811*789431f2SAndroid Build Coastguard Worker for (int ver = 0; ver <= kMaxMessageVersion; ++ver) {
812*789431f2SAndroid Build Coastguard Worker AttestKeyResponse msg(ver);
813*789431f2SAndroid Build Coastguard Worker msg.error = KM_ERROR_OK;
814*789431f2SAndroid Build Coastguard Worker msg.certificate_chain = CertificateChain(3);
815*789431f2SAndroid Build Coastguard Worker EXPECT_TRUE(!!msg.certificate_chain.entries);
816*789431f2SAndroid Build Coastguard Worker msg.certificate_chain.entries[0] = {dup_buffer("foo", 3), 3};
817*789431f2SAndroid Build Coastguard Worker msg.certificate_chain.entries[1] = {dup_buffer("bar", 3), 3};
818*789431f2SAndroid Build Coastguard Worker msg.certificate_chain.entries[2] = {dup_buffer("baz", 3), 3};
819*789431f2SAndroid Build Coastguard Worker
820*789431f2SAndroid Build Coastguard Worker UniquePtr<AttestKeyResponse> deserialized(round_trip(ver, msg, 29));
821*789431f2SAndroid Build Coastguard Worker keymaster_cert_chain_t* chain = &deserialized->certificate_chain;
822*789431f2SAndroid Build Coastguard Worker
823*789431f2SAndroid Build Coastguard Worker EXPECT_NE(nullptr, chain->entries);
824*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(3U, chain->entry_count);
825*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(3U, chain->entries[0].data_length);
826*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(0, memcmp("foo", chain->entries[0].data, 3));
827*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(3U, chain->entries[1].data_length);
828*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(0, memcmp("bar", chain->entries[1].data, 3));
829*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(3U, chain->entries[2].data_length);
830*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(0, memcmp("baz", chain->entries[2].data, 3));
831*789431f2SAndroid Build Coastguard Worker }
832*789431f2SAndroid Build Coastguard Worker }
833*789431f2SAndroid Build Coastguard Worker
TEST(RoundTrip,UpgradeKeyRequest)834*789431f2SAndroid Build Coastguard Worker TEST(RoundTrip, UpgradeKeyRequest) {
835*789431f2SAndroid Build Coastguard Worker for (int ver = 0; ver <= kMaxMessageVersion; ++ver) {
836*789431f2SAndroid Build Coastguard Worker UpgradeKeyRequest msg(ver);
837*789431f2SAndroid Build Coastguard Worker msg.SetKeyMaterial("foo", 3);
838*789431f2SAndroid Build Coastguard Worker msg.upgrade_params.Reinitialize(params, array_length(params));
839*789431f2SAndroid Build Coastguard Worker
840*789431f2SAndroid Build Coastguard Worker UniquePtr<UpgradeKeyRequest> deserialized(round_trip(ver, msg, 85));
841*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(3U, deserialized->key_blob.key_material_size);
842*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(0, memcmp("foo", deserialized->key_blob.key_material, 3));
843*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(msg.upgrade_params, deserialized->upgrade_params);
844*789431f2SAndroid Build Coastguard Worker }
845*789431f2SAndroid Build Coastguard Worker }
846*789431f2SAndroid Build Coastguard Worker
TEST(RoundTrip,UpgradeKeyResponse)847*789431f2SAndroid Build Coastguard Worker TEST(RoundTrip, UpgradeKeyResponse) {
848*789431f2SAndroid Build Coastguard Worker for (int ver = 0; ver <= kMaxMessageVersion; ++ver) {
849*789431f2SAndroid Build Coastguard Worker UpgradeKeyResponse req(ver);
850*789431f2SAndroid Build Coastguard Worker req.error = KM_ERROR_OK;
851*789431f2SAndroid Build Coastguard Worker req.upgraded_key.key_material = dup_array(TEST_DATA);
852*789431f2SAndroid Build Coastguard Worker req.upgraded_key.key_material_size = array_length(TEST_DATA);
853*789431f2SAndroid Build Coastguard Worker
854*789431f2SAndroid Build Coastguard Worker UniquePtr<UpgradeKeyResponse> deserialized(round_trip(ver, req, 19));
855*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(KM_ERROR_OK, deserialized->error);
856*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(req.upgraded_key.key_material_size, deserialized->upgraded_key.key_material_size);
857*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(0, memcmp(req.upgraded_key.key_material, deserialized->upgraded_key.key_material,
858*789431f2SAndroid Build Coastguard Worker req.upgraded_key.key_material_size));
859*789431f2SAndroid Build Coastguard Worker }
860*789431f2SAndroid Build Coastguard Worker }
861*789431f2SAndroid Build Coastguard Worker
TEST(RoundTrip,GenerateTimestampTokenRequest)862*789431f2SAndroid Build Coastguard Worker TEST(RoundTrip, GenerateTimestampTokenRequest) {
863*789431f2SAndroid Build Coastguard Worker for (int ver = 0; ver <= kMaxMessageVersion; ++ver) {
864*789431f2SAndroid Build Coastguard Worker GenerateTimestampTokenRequest msg(ver);
865*789431f2SAndroid Build Coastguard Worker msg.challenge = 1;
866*789431f2SAndroid Build Coastguard Worker UniquePtr<GenerateTimestampTokenRequest> deserialized(round_trip(ver, msg, 8));
867*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(1U, deserialized->challenge);
868*789431f2SAndroid Build Coastguard Worker }
869*789431f2SAndroid Build Coastguard Worker }
870*789431f2SAndroid Build Coastguard Worker
TEST(RoundTrip,GenerateTimestampTokenResponse)871*789431f2SAndroid Build Coastguard Worker TEST(RoundTrip, GenerateTimestampTokenResponse) {
872*789431f2SAndroid Build Coastguard Worker for (int ver = 0; ver <= kMaxMessageVersion; ++ver) {
873*789431f2SAndroid Build Coastguard Worker GenerateTimestampTokenResponse msg(ver);
874*789431f2SAndroid Build Coastguard Worker msg.error = KM_ERROR_OK;
875*789431f2SAndroid Build Coastguard Worker msg.token.challenge = 1;
876*789431f2SAndroid Build Coastguard Worker msg.token.timestamp = 2;
877*789431f2SAndroid Build Coastguard Worker msg.token.security_level = KM_SECURITY_LEVEL_SOFTWARE;
878*789431f2SAndroid Build Coastguard Worker msg.token.mac.data = dup_array(TEST_DATA);
879*789431f2SAndroid Build Coastguard Worker msg.token.mac.data_length = array_length(TEST_DATA);
880*789431f2SAndroid Build Coastguard Worker UniquePtr<GenerateTimestampTokenResponse> deserialized(round_trip(ver, msg, 39));
881*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(1U, deserialized->token.challenge);
882*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(2U, deserialized->token.timestamp);
883*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(KM_SECURITY_LEVEL_SOFTWARE, deserialized->token.security_level);
884*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(msg.token.mac.data_length, deserialized->token.mac.data_length);
885*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(
886*789431f2SAndroid Build Coastguard Worker 0, memcmp(msg.token.mac.data, deserialized->token.mac.data, msg.token.mac.data_length));
887*789431f2SAndroid Build Coastguard Worker }
888*789431f2SAndroid Build Coastguard Worker }
889*789431f2SAndroid Build Coastguard Worker
TEST(RoundTrip,GetRootOfTrustRequest)890*789431f2SAndroid Build Coastguard Worker TEST(RoundTrip, GetRootOfTrustRequest) {
891*789431f2SAndroid Build Coastguard Worker for (int ver = 0; ver <= kMaxMessageVersion; ++ver) {
892*789431f2SAndroid Build Coastguard Worker std::vector<uint8_t> challenge{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15};
893*789431f2SAndroid Build Coastguard Worker GetRootOfTrustRequest msg(ver, challenge);
894*789431f2SAndroid Build Coastguard Worker
895*789431f2SAndroid Build Coastguard Worker UniquePtr<GetRootOfTrustRequest> deserialized(round_trip(ver, msg, 20));
896*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(deserialized->challenge, challenge);
897*789431f2SAndroid Build Coastguard Worker }
898*789431f2SAndroid Build Coastguard Worker }
899*789431f2SAndroid Build Coastguard Worker
TEST(RoundTrip,GetRootOfTrustResponse)900*789431f2SAndroid Build Coastguard Worker TEST(RoundTrip, GetRootOfTrustResponse) {
901*789431f2SAndroid Build Coastguard Worker for (int ver = 0; ver <= kMaxMessageVersion; ++ver) {
902*789431f2SAndroid Build Coastguard Worker std::vector<uint8_t> rootOfTrust{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15};
903*789431f2SAndroid Build Coastguard Worker GetRootOfTrustResponse msg(ver, rootOfTrust);
904*789431f2SAndroid Build Coastguard Worker msg.error = KM_ERROR_OK;
905*789431f2SAndroid Build Coastguard Worker
906*789431f2SAndroid Build Coastguard Worker UniquePtr<GetRootOfTrustResponse> deserialized(round_trip(ver, msg, 24));
907*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(deserialized->rootOfTrust, rootOfTrust);
908*789431f2SAndroid Build Coastguard Worker }
909*789431f2SAndroid Build Coastguard Worker }
910*789431f2SAndroid Build Coastguard Worker
TEST(RoundTrip,GetHwInfoResponse)911*789431f2SAndroid Build Coastguard Worker TEST(RoundTrip, GetHwInfoResponse) {
912*789431f2SAndroid Build Coastguard Worker for (int ver = 0; ver <= kMaxMessageVersion; ++ver) {
913*789431f2SAndroid Build Coastguard Worker GetHwInfoResponse rsp(ver);
914*789431f2SAndroid Build Coastguard Worker rsp.error = KM_ERROR_OK;
915*789431f2SAndroid Build Coastguard Worker rsp.version = 17;
916*789431f2SAndroid Build Coastguard Worker rsp.rpcAuthorName = "AAAAA";
917*789431f2SAndroid Build Coastguard Worker rsp.supportedEekCurve = 48;
918*789431f2SAndroid Build Coastguard Worker rsp.uniqueId = "BBBBB";
919*789431f2SAndroid Build Coastguard Worker rsp.supportedNumKeysInCsr = 549;
920*789431f2SAndroid Build Coastguard Worker
921*789431f2SAndroid Build Coastguard Worker UniquePtr<GetHwInfoResponse> deserialized;
922*789431f2SAndroid Build Coastguard Worker deserialized.reset(round_trip(ver, rsp, 34));
923*789431f2SAndroid Build Coastguard Worker
924*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(KM_ERROR_OK, deserialized->error);
925*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(deserialized->version, rsp.version);
926*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(deserialized->rpcAuthorName, rsp.rpcAuthorName);
927*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(deserialized->supportedEekCurve, rsp.supportedEekCurve);
928*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(deserialized->uniqueId, rsp.uniqueId);
929*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(deserialized->supportedNumKeysInCsr, rsp.supportedNumKeysInCsr);
930*789431f2SAndroid Build Coastguard Worker }
931*789431f2SAndroid Build Coastguard Worker }
932*789431f2SAndroid Build Coastguard Worker
933*789431f2SAndroid Build Coastguard Worker #define SET_ATTESTATION_ID(x) msg.x.Reinitialize(#x, strlen(#x))
934*789431f2SAndroid Build Coastguard Worker
check_id(const Buffer & id,const char * value)935*789431f2SAndroid Build Coastguard Worker void check_id(const Buffer& id, const char* value) {
936*789431f2SAndroid Build Coastguard Worker auto len = strlen(value);
937*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(id.available_read(), len) << "On " << value;
938*789431f2SAndroid Build Coastguard Worker EXPECT_TRUE(memcmp(id.peek_read(), value, len) == 0) << "On " << value;
939*789431f2SAndroid Build Coastguard Worker }
940*789431f2SAndroid Build Coastguard Worker
941*789431f2SAndroid Build Coastguard Worker #define CHECK_ID(x) check_id(deserialized->x, #x);
942*789431f2SAndroid Build Coastguard Worker
TEST(RoundTrip,SetAttestationIdsRequest)943*789431f2SAndroid Build Coastguard Worker TEST(RoundTrip, SetAttestationIdsRequest) {
944*789431f2SAndroid Build Coastguard Worker for (int ver = 0; ver <= kMaxMessageVersion; ++ver) {
945*789431f2SAndroid Build Coastguard Worker SetAttestationIdsRequest msg(ver);
946*789431f2SAndroid Build Coastguard Worker SET_ATTESTATION_ID(brand);
947*789431f2SAndroid Build Coastguard Worker SET_ATTESTATION_ID(device);
948*789431f2SAndroid Build Coastguard Worker SET_ATTESTATION_ID(product);
949*789431f2SAndroid Build Coastguard Worker SET_ATTESTATION_ID(serial);
950*789431f2SAndroid Build Coastguard Worker SET_ATTESTATION_ID(imei);
951*789431f2SAndroid Build Coastguard Worker SET_ATTESTATION_ID(meid);
952*789431f2SAndroid Build Coastguard Worker SET_ATTESTATION_ID(manufacturer);
953*789431f2SAndroid Build Coastguard Worker SET_ATTESTATION_ID(model);
954*789431f2SAndroid Build Coastguard Worker
955*789431f2SAndroid Build Coastguard Worker UniquePtr<SetAttestationIdsRequest> deserialized(round_trip(ver, msg, 81));
956*789431f2SAndroid Build Coastguard Worker ASSERT_TRUE(deserialized);
957*789431f2SAndroid Build Coastguard Worker CHECK_ID(brand);
958*789431f2SAndroid Build Coastguard Worker CHECK_ID(device);
959*789431f2SAndroid Build Coastguard Worker CHECK_ID(product);
960*789431f2SAndroid Build Coastguard Worker CHECK_ID(serial);
961*789431f2SAndroid Build Coastguard Worker CHECK_ID(imei);
962*789431f2SAndroid Build Coastguard Worker CHECK_ID(model);
963*789431f2SAndroid Build Coastguard Worker }
964*789431f2SAndroid Build Coastguard Worker }
965*789431f2SAndroid Build Coastguard Worker
TEST(RoundTrip,SetAttestationIdsKM3Request)966*789431f2SAndroid Build Coastguard Worker TEST(RoundTrip, SetAttestationIdsKM3Request) {
967*789431f2SAndroid Build Coastguard Worker for (int ver = 0; ver <= kMaxMessageVersion; ++ver) {
968*789431f2SAndroid Build Coastguard Worker SetAttestationIdsKM3Request msg(ver);
969*789431f2SAndroid Build Coastguard Worker SET_ATTESTATION_ID(base.brand);
970*789431f2SAndroid Build Coastguard Worker SET_ATTESTATION_ID(base.device);
971*789431f2SAndroid Build Coastguard Worker SET_ATTESTATION_ID(base.product);
972*789431f2SAndroid Build Coastguard Worker SET_ATTESTATION_ID(base.serial);
973*789431f2SAndroid Build Coastguard Worker SET_ATTESTATION_ID(base.imei);
974*789431f2SAndroid Build Coastguard Worker SET_ATTESTATION_ID(base.meid);
975*789431f2SAndroid Build Coastguard Worker SET_ATTESTATION_ID(base.manufacturer);
976*789431f2SAndroid Build Coastguard Worker SET_ATTESTATION_ID(base.model);
977*789431f2SAndroid Build Coastguard Worker SET_ATTESTATION_ID(second_imei);
978*789431f2SAndroid Build Coastguard Worker
979*789431f2SAndroid Build Coastguard Worker UniquePtr<SetAttestationIdsKM3Request> deserialized(round_trip(ver, msg, 136));
980*789431f2SAndroid Build Coastguard Worker ASSERT_TRUE(deserialized);
981*789431f2SAndroid Build Coastguard Worker CHECK_ID(base.brand);
982*789431f2SAndroid Build Coastguard Worker CHECK_ID(base.device);
983*789431f2SAndroid Build Coastguard Worker CHECK_ID(base.product);
984*789431f2SAndroid Build Coastguard Worker CHECK_ID(base.serial);
985*789431f2SAndroid Build Coastguard Worker CHECK_ID(base.imei);
986*789431f2SAndroid Build Coastguard Worker CHECK_ID(base.model);
987*789431f2SAndroid Build Coastguard Worker CHECK_ID(second_imei);
988*789431f2SAndroid Build Coastguard Worker }
989*789431f2SAndroid Build Coastguard Worker }
990*789431f2SAndroid Build Coastguard Worker
TEST(Serialize,ShortBuffer)991*789431f2SAndroid Build Coastguard Worker TEST(Serialize, ShortBuffer) {
992*789431f2SAndroid Build Coastguard Worker for (int typ = 0; typ <= static_cast<int>(keymaster::SerializableType::kMaxValue); typ++) {
993*789431f2SAndroid Build Coastguard Worker // Get a default-constructed object of the relevant serializable type, and ask it
994*789431f2SAndroid Build Coastguard Worker // how much space it needs for serialization.
995*789431f2SAndroid Build Coastguard Worker auto stype = static_cast<keymaster::SerializableType>(typ);
996*789431f2SAndroid Build Coastguard Worker std::unique_ptr<keymaster::Serializable> ser = keymaster::getSerializable(stype);
997*789431f2SAndroid Build Coastguard Worker uint16_t expected_size = ser->SerializedSize();
998*789431f2SAndroid Build Coastguard Worker
999*789431f2SAndroid Build Coastguard Worker // Perform serialization of the object into variously sized buffers, mostly too small.
1000*789431f2SAndroid Build Coastguard Worker // There's no mechanism for indicating failure, so this test mostly just checks for
1001*789431f2SAndroid Build Coastguard Worker // memory errors (and so is a good candidate for running under ASAN/HWASAN).
1002*789431f2SAndroid Build Coastguard Worker for (uint16_t actual_size = 0; actual_size <= expected_size; actual_size++) {
1003*789431f2SAndroid Build Coastguard Worker std::unique_ptr<uint8_t[]> out_buf =
1004*789431f2SAndroid Build Coastguard Worker std::unique_ptr<uint8_t[]>(new uint8_t[actual_size]);
1005*789431f2SAndroid Build Coastguard Worker uint8_t* next = ser->Serialize(out_buf.get(), out_buf.get() + actual_size);
1006*789431f2SAndroid Build Coastguard Worker EXPECT_TRUE(next <= out_buf.get() + actual_size)
1007*789431f2SAndroid Build Coastguard Worker << "Serialization of " << typ << " returned a next offset beyond end+1";
1008*789431f2SAndroid Build Coastguard Worker }
1009*789431f2SAndroid Build Coastguard Worker }
1010*789431f2SAndroid Build Coastguard Worker }
1011*789431f2SAndroid Build Coastguard Worker
1012*789431f2SAndroid Build Coastguard Worker uint8_t msgbuf[] = {
1013*789431f2SAndroid Build Coastguard Worker 220, 88, 183, 255, 71, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1014*789431f2SAndroid Build Coastguard Worker 0, 173, 0, 0, 0, 228, 174, 98, 187, 191, 135, 253, 200, 51, 230, 114, 247, 151, 109,
1015*789431f2SAndroid Build Coastguard Worker 237, 79, 87, 32, 94, 5, 204, 46, 154, 30, 91, 6, 103, 148, 254, 129, 65, 171, 228,
1016*789431f2SAndroid Build Coastguard Worker 167, 224, 163, 9, 15, 206, 90, 58, 11, 205, 55, 211, 33, 87, 178, 149, 91, 28, 236,
1017*789431f2SAndroid Build Coastguard Worker 218, 112, 231, 34, 82, 82, 134, 103, 137, 115, 27, 156, 102, 159, 220, 226, 89, 42, 25,
1018*789431f2SAndroid Build Coastguard Worker 37, 9, 84, 239, 76, 161, 198, 72, 167, 163, 39, 91, 148, 191, 17, 191, 87, 169, 179,
1019*789431f2SAndroid Build Coastguard Worker 136, 10, 194, 154, 4, 40, 107, 109, 61, 161, 20, 176, 247, 13, 214, 106, 229, 45, 17,
1020*789431f2SAndroid Build Coastguard Worker 5, 60, 189, 64, 39, 166, 208, 14, 57, 25, 140, 148, 25, 177, 246, 189, 43, 181, 88,
1021*789431f2SAndroid Build Coastguard Worker 204, 29, 126, 224, 100, 143, 93, 60, 57, 249, 55, 0, 87, 83, 227, 224, 166, 59, 214,
1022*789431f2SAndroid Build Coastguard Worker 81, 144, 129, 58, 6, 57, 46, 254, 232, 41, 220, 209, 230, 167, 138, 158, 94, 180, 125,
1023*789431f2SAndroid Build Coastguard Worker 247, 26, 162, 116, 238, 202, 187, 100, 65, 13, 180, 44, 245, 159, 83, 161, 176, 58, 72,
1024*789431f2SAndroid Build Coastguard Worker 236, 109, 105, 160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1025*789431f2SAndroid Build Coastguard Worker 0, 11, 0, 0, 0, 98, 0, 0, 0, 1, 0, 0, 32, 2, 0, 0, 0, 1, 0,
1026*789431f2SAndroid Build Coastguard Worker 0, 32, 3, 0, 0, 0, 2, 0, 0, 16, 1, 0, 0, 0, 3, 0, 0, 48, 0,
1027*789431f2SAndroid Build Coastguard Worker 1, 0, 0, 200, 0, 0, 80, 3, 0, 0, 0, 0, 0, 0, 0, 244, 1, 0, 112,
1028*789431f2SAndroid Build Coastguard Worker 1, 246, 1, 0, 112, 1, 189, 2, 0, 96, 144, 178, 236, 250, 255, 255, 255, 255, 145,
1029*789431f2SAndroid Build Coastguard Worker 1, 0, 96, 144, 226, 33, 60, 222, 2, 0, 0, 189, 2, 0, 96, 0, 0, 0, 0,
1030*789431f2SAndroid Build Coastguard Worker 0, 0, 0, 0, 190, 2, 0, 16, 1, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0,
1031*789431f2SAndroid Build Coastguard Worker 0, 0, 0, 0, 0, 0, 0, 0, 0, 110, 0, 0, 0, 0, 0, 0, 0, 11, 0,
1032*789431f2SAndroid Build Coastguard Worker 0, 0, 98, 0, 0, 0, 1, 0, 0, 32, 2, 0, 0, 0, 1, 0, 0, 32, 3,
1033*789431f2SAndroid Build Coastguard Worker 0, 0, 0, 2, 0, 0, 16, 1, 0, 0, 0, 3, 0, 0, 48, 0, 1, 0, 0,
1034*789431f2SAndroid Build Coastguard Worker 200, 0, 0, 80, 3, 0, 0, 0, 0, 0, 0, 0, 244, 1, 0, 112, 1, 246, 1,
1035*789431f2SAndroid Build Coastguard Worker 0, 112, 1, 189, 2, 0, 96, 144, 178, 236, 250, 255, 255, 255, 255, 145, 1, 0, 96,
1036*789431f2SAndroid Build Coastguard Worker 144, 226, 33, 60, 222, 2, 0, 0, 189, 2, 0, 96, 0, 0, 0, 0, 0, 0, 0,
1037*789431f2SAndroid Build Coastguard Worker 0, 190, 2, 0, 16, 1, 0, 0, 0,
1038*789431f2SAndroid Build Coastguard Worker };
1039*789431f2SAndroid Build Coastguard Worker
1040*789431f2SAndroid Build Coastguard Worker /*
1041*789431f2SAndroid Build Coastguard Worker * These tests don't have any assertions or expectations. They just try to parse garbage, to see if
1042*789431f2SAndroid Build Coastguard Worker * the result will be a crash. This is especially informative when run under Valgrind memcheck.
1043*789431f2SAndroid Build Coastguard Worker */
1044*789431f2SAndroid Build Coastguard Worker
parse_garbage()1045*789431f2SAndroid Build Coastguard Worker template <typename Message> void parse_garbage() {
1046*789431f2SAndroid Build Coastguard Worker for (int32_t ver = 0; ver <= kMaxMessageVersion; ++ver) {
1047*789431f2SAndroid Build Coastguard Worker Message msg(ver);
1048*789431f2SAndroid Build Coastguard Worker const uint8_t* end = msgbuf + array_length(msgbuf);
1049*789431f2SAndroid Build Coastguard Worker for (size_t i = 0; i < array_length(msgbuf); ++i) {
1050*789431f2SAndroid Build Coastguard Worker const uint8_t* begin = msgbuf + i;
1051*789431f2SAndroid Build Coastguard Worker const uint8_t* p = begin;
1052*789431f2SAndroid Build Coastguard Worker msg.Deserialize(&p, end);
1053*789431f2SAndroid Build Coastguard Worker }
1054*789431f2SAndroid Build Coastguard Worker }
1055*789431f2SAndroid Build Coastguard Worker
1056*789431f2SAndroid Build Coastguard Worker time_t now = time(nullptr);
1057*789431f2SAndroid Build Coastguard Worker std::cout << "Seeding rand() with " << now << " for fuzz test." << std::endl;
1058*789431f2SAndroid Build Coastguard Worker srand(now);
1059*789431f2SAndroid Build Coastguard Worker
1060*789431f2SAndroid Build Coastguard Worker // Fill large buffer with random bytes.
1061*789431f2SAndroid Build Coastguard Worker const int kBufSize = 10000;
1062*789431f2SAndroid Build Coastguard Worker UniquePtr<uint8_t[]> buf(new uint8_t[kBufSize]);
1063*789431f2SAndroid Build Coastguard Worker for (size_t i = 0; i < kBufSize; ++i)
1064*789431f2SAndroid Build Coastguard Worker buf[i] = static_cast<uint8_t>(rand());
1065*789431f2SAndroid Build Coastguard Worker
1066*789431f2SAndroid Build Coastguard Worker for (uint32_t ver = 0; ver < kMaxMessageVersion; ++ver) {
1067*789431f2SAndroid Build Coastguard Worker Message msg(ver);
1068*789431f2SAndroid Build Coastguard Worker const uint8_t* end = buf.get() + kBufSize;
1069*789431f2SAndroid Build Coastguard Worker for (size_t i = 0; i < kBufSize; ++i) {
1070*789431f2SAndroid Build Coastguard Worker const uint8_t* begin = buf.get() + i;
1071*789431f2SAndroid Build Coastguard Worker const uint8_t* p = begin;
1072*789431f2SAndroid Build Coastguard Worker msg.Deserialize(&p, end);
1073*789431f2SAndroid Build Coastguard Worker }
1074*789431f2SAndroid Build Coastguard Worker }
1075*789431f2SAndroid Build Coastguard Worker }
1076*789431f2SAndroid Build Coastguard Worker
1077*789431f2SAndroid Build Coastguard Worker #define GARBAGE_TEST(Message) \
1078*789431f2SAndroid Build Coastguard Worker TEST(GarbageTest, Message) { \
1079*789431f2SAndroid Build Coastguard Worker parse_garbage<Message>(); \
1080*789431f2SAndroid Build Coastguard Worker }
1081*789431f2SAndroid Build Coastguard Worker
1082*789431f2SAndroid Build Coastguard Worker GARBAGE_TEST(AbortOperationRequest);
1083*789431f2SAndroid Build Coastguard Worker GARBAGE_TEST(EmptyKeymasterResponse);
1084*789431f2SAndroid Build Coastguard Worker GARBAGE_TEST(AddEntropyRequest);
1085*789431f2SAndroid Build Coastguard Worker GARBAGE_TEST(BeginOperationRequest);
1086*789431f2SAndroid Build Coastguard Worker GARBAGE_TEST(BeginOperationResponse);
1087*789431f2SAndroid Build Coastguard Worker GARBAGE_TEST(DeleteAllKeysRequest);
1088*789431f2SAndroid Build Coastguard Worker GARBAGE_TEST(DeleteKeyRequest);
1089*789431f2SAndroid Build Coastguard Worker GARBAGE_TEST(ExportKeyRequest);
1090*789431f2SAndroid Build Coastguard Worker GARBAGE_TEST(ExportKeyResponse);
1091*789431f2SAndroid Build Coastguard Worker GARBAGE_TEST(FinishOperationRequest);
1092*789431f2SAndroid Build Coastguard Worker GARBAGE_TEST(FinishOperationResponse);
1093*789431f2SAndroid Build Coastguard Worker GARBAGE_TEST(GenerateKeyRequest);
1094*789431f2SAndroid Build Coastguard Worker GARBAGE_TEST(GenerateKeyResponse);
1095*789431f2SAndroid Build Coastguard Worker GARBAGE_TEST(GetKeyCharacteristicsRequest);
1096*789431f2SAndroid Build Coastguard Worker GARBAGE_TEST(GetKeyCharacteristicsResponse);
1097*789431f2SAndroid Build Coastguard Worker GARBAGE_TEST(ImportKeyRequest);
1098*789431f2SAndroid Build Coastguard Worker GARBAGE_TEST(ImportKeyResponse);
1099*789431f2SAndroid Build Coastguard Worker GARBAGE_TEST(UpdateOperationRequest);
1100*789431f2SAndroid Build Coastguard Worker GARBAGE_TEST(UpdateOperationResponse);
1101*789431f2SAndroid Build Coastguard Worker GARBAGE_TEST(AttestKeyRequest);
1102*789431f2SAndroid Build Coastguard Worker GARBAGE_TEST(AttestKeyResponse);
1103*789431f2SAndroid Build Coastguard Worker GARBAGE_TEST(UpgradeKeyRequest);
1104*789431f2SAndroid Build Coastguard Worker GARBAGE_TEST(UpgradeKeyResponse);
1105*789431f2SAndroid Build Coastguard Worker GARBAGE_TEST(GenerateTimestampTokenRequest);
1106*789431f2SAndroid Build Coastguard Worker GARBAGE_TEST(GenerateTimestampTokenResponse);
1107*789431f2SAndroid Build Coastguard Worker GARBAGE_TEST(SetAttestationIdsRequest);
1108*789431f2SAndroid Build Coastguard Worker GARBAGE_TEST(SetAttestationIdsKM3Request);
1109*789431f2SAndroid Build Coastguard Worker GARBAGE_TEST(ConfigureVerifiedBootInfoRequest);
1110*789431f2SAndroid Build Coastguard Worker GARBAGE_TEST(GetRootOfTrustRequest);
1111*789431f2SAndroid Build Coastguard Worker GARBAGE_TEST(GetRootOfTrustResponse);
1112*789431f2SAndroid Build Coastguard Worker
1113*789431f2SAndroid Build Coastguard Worker } // namespace test
1114*789431f2SAndroid Build Coastguard Worker
1115*789431f2SAndroid Build Coastguard Worker } // namespace keymaster
1116