blob: 2951b4dc7c47e6fee46024a108b759bd100fa2bf [file] [log] [blame]
Shawn Willden128ffe02014-08-06 12:31:33 -06001/*
2 * Copyright (C) 2014 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#include <UniquePtr.h>
18
19#include <gtest/gtest.h>
20
Shawn Willden98d9b922014-08-26 08:14:10 -060021#include <keymaster/keymaster_tags.h>
22#include <keymaster/google_keymaster_utils.h>
23
Shawn Willdenda8485e2014-08-17 08:00:01 -060024#include "google_keymaster_test_utils.h"
Shawn Willden128ffe02014-08-06 12:31:33 -060025#include "google_softkeymaster.h"
26
27int main(int argc, char** argv) {
28 ::testing::InitGoogleTest(&argc, argv);
29 int result = RUN_ALL_TESTS();
30 return result;
31}
32
33namespace keymaster {
34namespace test {
35
Shawn Willdenda8485e2014-08-17 08:00:01 -060036/**
37 * Serialize and deserialize a message.
38 */
Shawn Willden2665e862014-11-24 14:46:21 -070039template <typename Message>
40Message* round_trip(int32_t ver, const Message& message, size_t expected_size) {
Shawn Willdenda8485e2014-08-17 08:00:01 -060041 size_t size = message.SerializedSize();
42 EXPECT_EQ(expected_size, size);
43 if (size == 0)
44 return NULL;
Shawn Willden128ffe02014-08-06 12:31:33 -060045
46 UniquePtr<uint8_t[]> buf(new uint8_t[size]);
Shawn Willdenda8485e2014-08-17 08:00:01 -060047 EXPECT_EQ(buf.get() + size, message.Serialize(buf.get(), buf.get() + size));
Shawn Willden128ffe02014-08-06 12:31:33 -060048
Shawn Willden2665e862014-11-24 14:46:21 -070049 Message* deserialized = new Message(ver);
Shawn Willden58e1a542014-08-08 21:58:29 -060050 const uint8_t* p = buf.get();
Shawn Willdenda8485e2014-08-17 08:00:01 -060051 EXPECT_TRUE(deserialized->Deserialize(&p, p + size));
52 EXPECT_EQ((ptrdiff_t)size, p - buf.get());
53 return deserialized;
Shawn Willden128ffe02014-08-06 12:31:33 -060054}
55
Shawn Willden2665e862014-11-24 14:46:21 -070056struct EmptyKeymasterResponse : public KeymasterResponse {
57 EmptyKeymasterResponse(int32_t ver) : KeymasterResponse(ver) {}
Shawn Willdenda8485e2014-08-17 08:00:01 -060058 size_t NonErrorSerializedSize() const { return 1; }
59 uint8_t* NonErrorSerialize(uint8_t* buf, const uint8_t* /* end */) const {
60 *buf++ = 0;
61 return buf;
62 }
63 bool NonErrorDeserialize(const uint8_t** buf_ptr, const uint8_t* end) {
64 if (*buf_ptr >= end)
65 return false;
66 EXPECT_EQ(0, **buf_ptr);
67 (*buf_ptr)++;
68 return true;
69 }
70};
71
72TEST(RoundTrip, EmptyKeymasterResponse) {
Shawn Willden2665e862014-11-24 14:46:21 -070073 for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) {
74 EmptyKeymasterResponse msg(ver);
75 msg.error = KM_ERROR_OK;
Shawn Willdenda8485e2014-08-17 08:00:01 -060076
Shawn Willden2665e862014-11-24 14:46:21 -070077 UniquePtr<EmptyKeymasterResponse> deserialized(round_trip(ver, msg, 5));
78 }
Shawn Willdenda8485e2014-08-17 08:00:01 -060079}
80
81TEST(RoundTrip, EmptyKeymasterResponseError) {
Shawn Willden2665e862014-11-24 14:46:21 -070082 for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) {
83 EmptyKeymasterResponse msg(ver);
84 msg.error = KM_ERROR_MEMORY_ALLOCATION_FAILED;
Shawn Willdenda8485e2014-08-17 08:00:01 -060085
Shawn Willden2665e862014-11-24 14:46:21 -070086 UniquePtr<EmptyKeymasterResponse> deserialized(round_trip(ver, msg, 4));
87 }
Shawn Willdenda8485e2014-08-17 08:00:01 -060088}
89
90TEST(RoundTrip, SupportedAlgorithmsResponse) {
Shawn Willden2665e862014-11-24 14:46:21 -070091 for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) {
92 SupportedAlgorithmsResponse rsp(ver);
93 keymaster_algorithm_t algorithms[] = {KM_ALGORITHM_RSA, KM_ALGORITHM_DSA,
94 KM_ALGORITHM_ECDSA};
95 rsp.error = KM_ERROR_OK;
96 rsp.algorithms = dup_array(algorithms);
97 rsp.algorithms_length = array_length(algorithms);
Shawn Willdenda8485e2014-08-17 08:00:01 -060098
Shawn Willden2665e862014-11-24 14:46:21 -070099 UniquePtr<SupportedAlgorithmsResponse> deserialized(round_trip(ver, rsp, 20));
100 EXPECT_EQ(array_length(algorithms), deserialized->algorithms_length);
101 EXPECT_EQ(0, memcmp(deserialized->algorithms, algorithms, array_size(algorithms)));
102 }
Shawn Willdenda8485e2014-08-17 08:00:01 -0600103}
104
105TEST(RoundTrip, SupportedResponse) {
Shawn Willden2665e862014-11-24 14:46:21 -0700106 for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) {
107 SupportedResponse<keymaster_digest_t> rsp(ver);
108 keymaster_digest_t digests[] = {KM_DIGEST_NONE, KM_DIGEST_MD5, KM_DIGEST_SHA1};
109 rsp.error = KM_ERROR_OK;
110 rsp.SetResults(digests);
Shawn Willdenda8485e2014-08-17 08:00:01 -0600111
Shawn Willden2665e862014-11-24 14:46:21 -0700112 UniquePtr<SupportedResponse<keymaster_digest_t>> deserialized(round_trip(ver, rsp, 20));
113 EXPECT_EQ(array_length(digests), deserialized->results_length);
114 EXPECT_EQ(0, memcmp(deserialized->results, digests, array_size(digests)));
115 }
Shawn Willdenda8485e2014-08-17 08:00:01 -0600116}
117
118static keymaster_key_param_t params[] = {
Shawn Willden2665e862014-11-24 14:46:21 -0700119 Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN), Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY),
Shawn Willdenda8485e2014-08-17 08:00:01 -0600120 Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA), Authorization(TAG_USER_ID, 7),
Shawn Willden2665e862014-11-24 14:46:21 -0700121 Authorization(TAG_USER_AUTH_ID, 8), Authorization(TAG_APPLICATION_ID, "app_id", 6),
Shawn Willdenda8485e2014-08-17 08:00:01 -0600122 Authorization(TAG_AUTH_TIMEOUT, 300),
123};
Shawn Willden128ffe02014-08-06 12:31:33 -0600124uint8_t TEST_DATA[] = "a key blob";
125
Shawn Willdenda8485e2014-08-17 08:00:01 -0600126TEST(RoundTrip, GenerateKeyRequest) {
Shawn Willden2665e862014-11-24 14:46:21 -0700127 for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) {
128 GenerateKeyRequest req(ver);
129 req.key_description.Reinitialize(params, array_length(params));
130 UniquePtr<GenerateKeyRequest> deserialized(round_trip(ver, req, 78));
131 EXPECT_EQ(deserialized->key_description, req.key_description);
132 }
Shawn Willdenda8485e2014-08-17 08:00:01 -0600133}
134
135TEST(RoundTrip, GenerateKeyResponse) {
Shawn Willden2665e862014-11-24 14:46:21 -0700136 for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) {
137 GenerateKeyResponse rsp(ver);
138 rsp.error = KM_ERROR_OK;
139 rsp.key_blob.key_material = dup_array(TEST_DATA);
140 rsp.key_blob.key_material_size = array_length(TEST_DATA);
141 rsp.enforced.Reinitialize(params, array_length(params));
Shawn Willden128ffe02014-08-06 12:31:33 -0600142
Shawn Willden2665e862014-11-24 14:46:21 -0700143 UniquePtr<GenerateKeyResponse> deserialized(round_trip(ver, rsp, 109));
144 EXPECT_EQ(KM_ERROR_OK, deserialized->error);
145 EXPECT_EQ(deserialized->enforced, rsp.enforced);
146 EXPECT_EQ(deserialized->unenforced, rsp.unenforced);
147 }
Shawn Willden128ffe02014-08-06 12:31:33 -0600148}
149
Shawn Willdenda8485e2014-08-17 08:00:01 -0600150TEST(RoundTrip, GenerateKeyResponseTestError) {
Shawn Willden2665e862014-11-24 14:46:21 -0700151 for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) {
152 GenerateKeyResponse rsp(ver);
153 rsp.error = KM_ERROR_UNSUPPORTED_ALGORITHM;
154 rsp.key_blob.key_material = dup_array(TEST_DATA);
155 rsp.key_blob.key_material_size = array_length(TEST_DATA);
156 rsp.enforced.Reinitialize(params, array_length(params));
Shawn Willden128ffe02014-08-06 12:31:33 -0600157
Shawn Willden2665e862014-11-24 14:46:21 -0700158 UniquePtr<GenerateKeyResponse> deserialized(round_trip(ver, rsp, 4));
159 EXPECT_EQ(KM_ERROR_UNSUPPORTED_ALGORITHM, deserialized->error);
160 EXPECT_EQ(0U, deserialized->enforced.size());
161 EXPECT_EQ(0U, deserialized->unenforced.size());
162 EXPECT_EQ(0U, deserialized->key_blob.key_material_size);
163 }
Shawn Willdenda8485e2014-08-17 08:00:01 -0600164}
Shawn Willden128ffe02014-08-06 12:31:33 -0600165
Shawn Willdenda8485e2014-08-17 08:00:01 -0600166TEST(RoundTrip, GetKeyCharacteristicsRequest) {
Shawn Willden2665e862014-11-24 14:46:21 -0700167 for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) {
168 GetKeyCharacteristicsRequest req(ver);
169 req.additional_params.Reinitialize(params, array_length(params));
170 req.SetKeyMaterial("foo", 3);
Shawn Willden128ffe02014-08-06 12:31:33 -0600171
Shawn Willden2665e862014-11-24 14:46:21 -0700172 UniquePtr<GetKeyCharacteristicsRequest> deserialized(round_trip(ver, req, 85));
173 EXPECT_EQ(7U, deserialized->additional_params.size());
174 EXPECT_EQ(3U, deserialized->key_blob.key_material_size);
175 EXPECT_EQ(0, memcmp(deserialized->key_blob.key_material, "foo", 3));
176 }
Shawn Willdenda8485e2014-08-17 08:00:01 -0600177}
178
179TEST(RoundTrip, GetKeyCharacteristicsResponse) {
Shawn Willden2665e862014-11-24 14:46:21 -0700180 for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) {
181 GetKeyCharacteristicsResponse msg(ver);
182 msg.error = KM_ERROR_OK;
183 msg.enforced.Reinitialize(params, array_length(params));
184 msg.unenforced.Reinitialize(params, array_length(params));
Shawn Willdenda8485e2014-08-17 08:00:01 -0600185
Shawn Willden2665e862014-11-24 14:46:21 -0700186 UniquePtr<GetKeyCharacteristicsResponse> deserialized(round_trip(ver, msg, 160));
187 EXPECT_EQ(msg.enforced, deserialized->enforced);
188 EXPECT_EQ(msg.unenforced, deserialized->unenforced);
189 }
Shawn Willdenda8485e2014-08-17 08:00:01 -0600190}
191
192TEST(RoundTrip, BeginOperationRequest) {
Shawn Willden2665e862014-11-24 14:46:21 -0700193 for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) {
194 BeginOperationRequest msg(ver);
195 msg.purpose = KM_PURPOSE_SIGN;
196 msg.SetKeyMaterial("foo", 3);
197 msg.additional_params.Reinitialize(params, array_length(params));
Shawn Willdenda8485e2014-08-17 08:00:01 -0600198
Shawn Willden2665e862014-11-24 14:46:21 -0700199 UniquePtr<BeginOperationRequest> deserialized(round_trip(ver, msg, 89));
200 EXPECT_EQ(KM_PURPOSE_SIGN, deserialized->purpose);
201 EXPECT_EQ(3U, deserialized->key_blob.key_material_size);
202 EXPECT_EQ(0, memcmp(deserialized->key_blob.key_material, "foo", 3));
203 EXPECT_EQ(msg.additional_params, deserialized->additional_params);
204 }
Shawn Willdenda8485e2014-08-17 08:00:01 -0600205}
206
207TEST(RoundTrip, BeginOperationResponse) {
Shawn Willden2665e862014-11-24 14:46:21 -0700208 for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) {
209 BeginOperationResponse msg(ver);
210 msg.error = KM_ERROR_OK;
211 msg.op_handle = 0xDEADBEEF;
Shawn Willdenda8485e2014-08-17 08:00:01 -0600212
Shawn Willden2665e862014-11-24 14:46:21 -0700213 UniquePtr<BeginOperationResponse> deserialized(round_trip(ver, msg, 12));
214 EXPECT_EQ(KM_ERROR_OK, deserialized->error);
215 EXPECT_EQ(0xDEADBEEF, deserialized->op_handle);
216 }
Shawn Willdenda8485e2014-08-17 08:00:01 -0600217}
218
219TEST(RoundTrip, BeginOperationResponseError) {
Shawn Willden2665e862014-11-24 14:46:21 -0700220 for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) {
221 BeginOperationResponse msg(ver);
222 msg.error = KM_ERROR_INVALID_OPERATION_HANDLE;
223 msg.op_handle = 0xDEADBEEF;
Shawn Willdenda8485e2014-08-17 08:00:01 -0600224
Shawn Willden2665e862014-11-24 14:46:21 -0700225 UniquePtr<BeginOperationResponse> deserialized(round_trip(ver, msg, 4));
226 EXPECT_EQ(KM_ERROR_INVALID_OPERATION_HANDLE, deserialized->error);
227 }
Shawn Willdenda8485e2014-08-17 08:00:01 -0600228}
229
230TEST(RoundTrip, UpdateOperationRequest) {
Shawn Willden2665e862014-11-24 14:46:21 -0700231 for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) {
232 UpdateOperationRequest msg(ver);
233 msg.op_handle = 0xDEADBEEF;
234 msg.input.Reinitialize("foo", 3);
Shawn Willdenda8485e2014-08-17 08:00:01 -0600235
Shawn Willden2665e862014-11-24 14:46:21 -0700236 UniquePtr<UpdateOperationRequest> deserialized(round_trip(ver, msg, 15));
237 EXPECT_EQ(3U, deserialized->input.available_read());
238 EXPECT_EQ(0, memcmp(deserialized->input.peek_read(), "foo", 3));
239 }
Shawn Willdenda8485e2014-08-17 08:00:01 -0600240}
241
242TEST(RoundTrip, UpdateOperationResponse) {
Shawn Willden2665e862014-11-24 14:46:21 -0700243 for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) {
244 UpdateOperationResponse msg(ver);
245 msg.error = KM_ERROR_OK;
246 msg.output.Reinitialize("foo", 3);
Shawn Willdenb7361132014-12-08 08:15:14 -0700247 msg.input_consumed = 99;
Shawn Willdenda8485e2014-08-17 08:00:01 -0600248
Shawn Willdenb7361132014-12-08 08:15:14 -0700249 UniquePtr<UpdateOperationResponse> deserialized;
250 switch (ver) {
251 case 0:
252 deserialized.reset(round_trip(ver, msg, 11));
253 break;
254 case 1:
255 deserialized.reset(round_trip(ver, msg, 15));
256 break;
257 default:
258 FAIL();
259 }
Shawn Willden2665e862014-11-24 14:46:21 -0700260 EXPECT_EQ(KM_ERROR_OK, deserialized->error);
261 EXPECT_EQ(3U, deserialized->output.available_read());
262 EXPECT_EQ(0, memcmp(deserialized->output.peek_read(), "foo", 3));
Shawn Willdenb7361132014-12-08 08:15:14 -0700263
264 switch (ver) {
265 case 0:
266 EXPECT_EQ(0, deserialized->input_consumed);
267 break;
268 case 1:
269 EXPECT_EQ(99, deserialized->input_consumed);
270 break;
271 default:
272 FAIL();
273 }
Shawn Willden2665e862014-11-24 14:46:21 -0700274 }
Shawn Willdenda8485e2014-08-17 08:00:01 -0600275}
276
277TEST(RoundTrip, FinishOperationRequest) {
Shawn Willden2665e862014-11-24 14:46:21 -0700278 for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) {
279 FinishOperationRequest msg(ver);
280 msg.op_handle = 0xDEADBEEF;
281 msg.signature.Reinitialize("bar", 3);
Shawn Willdenda8485e2014-08-17 08:00:01 -0600282
Shawn Willden2665e862014-11-24 14:46:21 -0700283 UniquePtr<FinishOperationRequest> deserialized(round_trip(ver, msg, 15));
284 EXPECT_EQ(0xDEADBEEF, deserialized->op_handle);
285 EXPECT_EQ(3U, deserialized->signature.available_read());
286 EXPECT_EQ(0, memcmp(deserialized->signature.peek_read(), "bar", 3));
287 }
Shawn Willdenda8485e2014-08-17 08:00:01 -0600288}
289
290TEST(Round_Trip, FinishOperationResponse) {
Shawn Willden2665e862014-11-24 14:46:21 -0700291 for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) {
292 FinishOperationResponse msg(ver);
293 msg.error = KM_ERROR_OK;
294 msg.output.Reinitialize("foo", 3);
Shawn Willdenda8485e2014-08-17 08:00:01 -0600295
Shawn Willden2665e862014-11-24 14:46:21 -0700296 UniquePtr<FinishOperationResponse> deserialized(round_trip(ver, msg, 11));
297 EXPECT_EQ(msg.error, deserialized->error);
298 EXPECT_EQ(msg.output.available_read(), deserialized->output.available_read());
299 EXPECT_EQ(0, memcmp(msg.output.peek_read(), deserialized->output.peek_read(),
300 msg.output.available_read()));
301 }
Shawn Willdenda8485e2014-08-17 08:00:01 -0600302}
303
304TEST(RoundTrip, ImportKeyRequest) {
Shawn Willden2665e862014-11-24 14:46:21 -0700305 for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) {
306 ImportKeyRequest msg(ver);
307 msg.key_description.Reinitialize(params, array_length(params));
308 msg.key_format = KM_KEY_FORMAT_X509;
309 msg.SetKeyMaterial("foo", 3);
Shawn Willdenda8485e2014-08-17 08:00:01 -0600310
Shawn Willden2665e862014-11-24 14:46:21 -0700311 UniquePtr<ImportKeyRequest> deserialized(round_trip(ver, msg, 89));
312 EXPECT_EQ(msg.key_description, deserialized->key_description);
313 EXPECT_EQ(msg.key_format, deserialized->key_format);
314 EXPECT_EQ(msg.key_data_length, deserialized->key_data_length);
315 EXPECT_EQ(0, memcmp(msg.key_data, deserialized->key_data, msg.key_data_length));
316 }
Shawn Willdenda8485e2014-08-17 08:00:01 -0600317}
318
319TEST(RoundTrip, ImportKeyResponse) {
Shawn Willden2665e862014-11-24 14:46:21 -0700320 for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) {
321 ImportKeyResponse msg(ver);
322 msg.error = KM_ERROR_OK;
323 msg.SetKeyMaterial("foo", 3);
324 msg.enforced.Reinitialize(params, array_length(params));
325 msg.unenforced.Reinitialize(params, array_length(params));
Shawn Willdenda8485e2014-08-17 08:00:01 -0600326
Shawn Willden2665e862014-11-24 14:46:21 -0700327 UniquePtr<ImportKeyResponse> deserialized(round_trip(ver, msg, 167));
328 EXPECT_EQ(msg.error, deserialized->error);
329 EXPECT_EQ(msg.key_blob.key_material_size, deserialized->key_blob.key_material_size);
330 EXPECT_EQ(0, memcmp(msg.key_blob.key_material, deserialized->key_blob.key_material,
331 msg.key_blob.key_material_size));
332 EXPECT_EQ(msg.enforced, deserialized->enforced);
333 EXPECT_EQ(msg.unenforced, deserialized->unenforced);
334 }
Shawn Willdenda8485e2014-08-17 08:00:01 -0600335}
336
337TEST(RoundTrip, ExportKeyRequest) {
Shawn Willden2665e862014-11-24 14:46:21 -0700338 for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) {
339 ExportKeyRequest msg(ver);
340 msg.additional_params.Reinitialize(params, array_length(params));
341 msg.key_format = KM_KEY_FORMAT_X509;
342 msg.SetKeyMaterial("foo", 3);
Shawn Willdenda8485e2014-08-17 08:00:01 -0600343
Shawn Willden2665e862014-11-24 14:46:21 -0700344 UniquePtr<ExportKeyRequest> deserialized(round_trip(ver, msg, 89));
345 EXPECT_EQ(msg.additional_params, deserialized->additional_params);
346 EXPECT_EQ(msg.key_format, deserialized->key_format);
347 EXPECT_EQ(3U, deserialized->key_blob.key_material_size);
348 EXPECT_EQ(0, memcmp("foo", deserialized->key_blob.key_material, 3));
349 }
Shawn Willdenda8485e2014-08-17 08:00:01 -0600350}
351
352TEST(RoundTrip, ExportKeyResponse) {
Shawn Willden2665e862014-11-24 14:46:21 -0700353 for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) {
354 ExportKeyResponse msg(ver);
355 msg.error = KM_ERROR_OK;
356 msg.SetKeyMaterial("foo", 3);
Shawn Willdenda8485e2014-08-17 08:00:01 -0600357
Shawn Willden2665e862014-11-24 14:46:21 -0700358 UniquePtr<ExportKeyResponse> deserialized(round_trip(ver, msg, 11));
359 EXPECT_EQ(3U, deserialized->key_data_length);
360 EXPECT_EQ(0, memcmp("foo", deserialized->key_data, 3));
361 }
362}
363
364TEST(RoundTrip, GetVersionRequest) {
365 GetVersionRequest msg;
366
367 size_t size = msg.SerializedSize();
368 ASSERT_EQ(0, size);
369
370 UniquePtr<uint8_t[]> buf(new uint8_t[size]);
371 EXPECT_EQ(buf.get() + size, msg.Serialize(buf.get(), buf.get() + size));
372
373 GetVersionRequest deserialized;
374 const uint8_t* p = buf.get();
375 EXPECT_TRUE(deserialized.Deserialize(&p, p + size));
376 EXPECT_EQ((ptrdiff_t)size, p - buf.get());
377}
378
379TEST(RoundTrip, GetVersionResponse) {
380 GetVersionResponse msg;
381 msg.error = KM_ERROR_OK;
382 msg.major_ver = 9;
383 msg.minor_ver = 98;
384 msg.subminor_ver = 38;
385
386 size_t size = msg.SerializedSize();
387 ASSERT_EQ(7, size);
388
389 UniquePtr<uint8_t[]> buf(new uint8_t[size]);
390 EXPECT_EQ(buf.get() + size, msg.Serialize(buf.get(), buf.get() + size));
391
392 GetVersionResponse deserialized;
393 const uint8_t* p = buf.get();
394 EXPECT_TRUE(deserialized.Deserialize(&p, p + size));
395 EXPECT_EQ((ptrdiff_t)size, p - buf.get());
396 EXPECT_EQ(9, msg.major_ver);
397 EXPECT_EQ(98, msg.minor_ver);
398 EXPECT_EQ(38, msg.subminor_ver);
Shawn Willden128ffe02014-08-06 12:31:33 -0600399}
400
Shawn Willdenf2282b32014-08-25 06:49:54 -0600401uint8_t msgbuf[] = {
402 220, 88, 183, 255, 71, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
403 0, 173, 0, 0, 0, 228, 174, 98, 187, 191, 135, 253, 200, 51, 230, 114, 247, 151, 109,
404 237, 79, 87, 32, 94, 5, 204, 46, 154, 30, 91, 6, 103, 148, 254, 129, 65, 171, 228,
405 167, 224, 163, 9, 15, 206, 90, 58, 11, 205, 55, 211, 33, 87, 178, 149, 91, 28, 236,
406 218, 112, 231, 34, 82, 82, 134, 103, 137, 115, 27, 156, 102, 159, 220, 226, 89, 42, 25,
407 37, 9, 84, 239, 76, 161, 198, 72, 167, 163, 39, 91, 148, 191, 17, 191, 87, 169, 179,
408 136, 10, 194, 154, 4, 40, 107, 109, 61, 161, 20, 176, 247, 13, 214, 106, 229, 45, 17,
409 5, 60, 189, 64, 39, 166, 208, 14, 57, 25, 140, 148, 25, 177, 246, 189, 43, 181, 88,
410 204, 29, 126, 224, 100, 143, 93, 60, 57, 249, 55, 0, 87, 83, 227, 224, 166, 59, 214,
411 81, 144, 129, 58, 6, 57, 46, 254, 232, 41, 220, 209, 230, 167, 138, 158, 94, 180, 125,
412 247, 26, 162, 116, 238, 202, 187, 100, 65, 13, 180, 44, 245, 159, 83, 161, 176, 58, 72,
413 236, 109, 105, 160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
414 0, 11, 0, 0, 0, 98, 0, 0, 0, 1, 0, 0, 32, 2, 0, 0, 0, 1, 0,
415 0, 32, 3, 0, 0, 0, 2, 0, 0, 16, 1, 0, 0, 0, 3, 0, 0, 48, 0,
416 1, 0, 0, 200, 0, 0, 80, 3, 0, 0, 0, 0, 0, 0, 0, 244, 1, 0, 112,
417 1, 246, 1, 0, 112, 1, 189, 2, 0, 96, 144, 178, 236, 250, 255, 255, 255, 255, 145,
418 1, 0, 96, 144, 226, 33, 60, 222, 2, 0, 0, 189, 2, 0, 96, 0, 0, 0, 0,
419 0, 0, 0, 0, 190, 2, 0, 16, 1, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0,
420 0, 0, 0, 0, 0, 0, 0, 0, 0, 110, 0, 0, 0, 0, 0, 0, 0, 11, 0,
421 0, 0, 98, 0, 0, 0, 1, 0, 0, 32, 2, 0, 0, 0, 1, 0, 0, 32, 3,
422 0, 0, 0, 2, 0, 0, 16, 1, 0, 0, 0, 3, 0, 0, 48, 0, 1, 0, 0,
423 200, 0, 0, 80, 3, 0, 0, 0, 0, 0, 0, 0, 244, 1, 0, 112, 1, 246, 1,
424 0, 112, 1, 189, 2, 0, 96, 144, 178, 236, 250, 255, 255, 255, 255, 145, 1, 0, 96,
425 144, 226, 33, 60, 222, 2, 0, 0, 189, 2, 0, 96, 0, 0, 0, 0, 0, 0, 0,
426 0, 190, 2, 0, 16, 1, 0, 0, 0,
427};
428
429/*
430 * These tests don't have any assertions or expectations. They just try to parse garbage, to see if
431 * the result will be a crash. This is especially informative when run under Valgrind memcheck.
432 */
433
434template <typename Message> void parse_garbage() {
Shawn Willden2665e862014-11-24 14:46:21 -0700435 for (int32_t ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) {
436 Message msg(ver);
437 const uint8_t* end = msgbuf + array_length(msgbuf);
438 for (size_t i = 0; i < array_length(msgbuf); ++i) {
439 const uint8_t* begin = msgbuf + i;
440 const uint8_t* p = begin;
441 msg.Deserialize(&p, end);
442 }
Shawn Willdenf2282b32014-08-25 06:49:54 -0600443 }
444}
445
446#define GARBAGE_TEST(Message) \
447 TEST(GarbageTest, Message) { parse_garbage<Message>(); }
448
449GARBAGE_TEST(SupportedAlgorithmsResponse)
450GARBAGE_TEST(GenerateKeyRequest);
451GARBAGE_TEST(GenerateKeyResponse);
452GARBAGE_TEST(GetKeyCharacteristicsRequest);
453GARBAGE_TEST(GetKeyCharacteristicsResponse);
454GARBAGE_TEST(BeginOperationRequest);
455GARBAGE_TEST(BeginOperationResponse);
456GARBAGE_TEST(UpdateOperationRequest);
457GARBAGE_TEST(UpdateOperationResponse);
458GARBAGE_TEST(FinishOperationRequest);
459GARBAGE_TEST(FinishOperationResponse);
460// GARBAGE_TEST(AddEntropyRequest);
461GARBAGE_TEST(ImportKeyRequest);
462GARBAGE_TEST(ImportKeyResponse);
463GARBAGE_TEST(ExportKeyRequest);
464GARBAGE_TEST(ExportKeyResponse);
465// GARBAGE_TEST(RescopeRequest);
466// GARBAGE_TEST(RescopeResponse);
467
468// The macro doesn't work on this one.
469TEST(GarbageTest, SupportedResponse) {
470 parse_garbage<SupportedResponse<keymaster_digest_t>>();
471}
472
Shawn Willden128ffe02014-08-06 12:31:33 -0600473} // namespace test
Shawn Willden2665e862014-11-24 14:46:21 -0700474
Shawn Willden128ffe02014-08-06 12:31:33 -0600475} // namespace keymaster