xref: /aosp_15_r20/system/keymaster/tests/android_keymaster_messages_test.cpp (revision 789431f29546679ab5188a97751fb38e3018d44d)
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