blob: 01fcf7b62dc21bac2ee6ea94a76f93b6b52cd4c4 [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 Willden7b38f442015-01-22 13:07:34 -0700212 msg.output_params.push_back(Authorization(TAG_NONCE, "foo", 3));
Shawn Willdenda8485e2014-08-17 08:00:01 -0600213
Shawn Willden7b38f442015-01-22 13:07:34 -0700214 UniquePtr<BeginOperationResponse> deserialized;
215 switch (ver) {
216 case 0:
217 deserialized.reset(round_trip(ver, msg, 12));
218 break;
219 case 1:
220 deserialized.reset(round_trip(ver, msg, 39));
221 break;
222 default:
223 FAIL();
224 }
225
Shawn Willden2665e862014-11-24 14:46:21 -0700226 EXPECT_EQ(KM_ERROR_OK, deserialized->error);
227 EXPECT_EQ(0xDEADBEEF, deserialized->op_handle);
Shawn Willden7b38f442015-01-22 13:07:34 -0700228
229 switch (ver) {
230 case 0:
231 EXPECT_EQ(0, deserialized->output_params.size());
232 break;
233 case 1:
234 EXPECT_EQ(msg.output_params, deserialized->output_params);
235 break;
236 default:
237 FAIL();
238 }
Shawn Willden2665e862014-11-24 14:46:21 -0700239 }
Shawn Willdenda8485e2014-08-17 08:00:01 -0600240}
241
242TEST(RoundTrip, BeginOperationResponseError) {
Shawn Willden2665e862014-11-24 14:46:21 -0700243 for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) {
244 BeginOperationResponse msg(ver);
245 msg.error = KM_ERROR_INVALID_OPERATION_HANDLE;
246 msg.op_handle = 0xDEADBEEF;
Shawn Willdenda8485e2014-08-17 08:00:01 -0600247
Shawn Willden2665e862014-11-24 14:46:21 -0700248 UniquePtr<BeginOperationResponse> deserialized(round_trip(ver, msg, 4));
249 EXPECT_EQ(KM_ERROR_INVALID_OPERATION_HANDLE, deserialized->error);
250 }
Shawn Willdenda8485e2014-08-17 08:00:01 -0600251}
252
253TEST(RoundTrip, UpdateOperationRequest) {
Shawn Willden2665e862014-11-24 14:46:21 -0700254 for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) {
255 UpdateOperationRequest msg(ver);
256 msg.op_handle = 0xDEADBEEF;
257 msg.input.Reinitialize("foo", 3);
Shawn Willdenda8485e2014-08-17 08:00:01 -0600258
Shawn Willden2665e862014-11-24 14:46:21 -0700259 UniquePtr<UpdateOperationRequest> deserialized(round_trip(ver, msg, 15));
260 EXPECT_EQ(3U, deserialized->input.available_read());
261 EXPECT_EQ(0, memcmp(deserialized->input.peek_read(), "foo", 3));
262 }
Shawn Willdenda8485e2014-08-17 08:00:01 -0600263}
264
265TEST(RoundTrip, UpdateOperationResponse) {
Shawn Willden2665e862014-11-24 14:46:21 -0700266 for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) {
267 UpdateOperationResponse msg(ver);
268 msg.error = KM_ERROR_OK;
269 msg.output.Reinitialize("foo", 3);
Shawn Willdenb7361132014-12-08 08:15:14 -0700270 msg.input_consumed = 99;
Shawn Willdenda8485e2014-08-17 08:00:01 -0600271
Shawn Willdenb7361132014-12-08 08:15:14 -0700272 UniquePtr<UpdateOperationResponse> deserialized;
273 switch (ver) {
274 case 0:
275 deserialized.reset(round_trip(ver, msg, 11));
276 break;
277 case 1:
278 deserialized.reset(round_trip(ver, msg, 15));
279 break;
280 default:
281 FAIL();
282 }
Shawn Willden2665e862014-11-24 14:46:21 -0700283 EXPECT_EQ(KM_ERROR_OK, deserialized->error);
284 EXPECT_EQ(3U, deserialized->output.available_read());
285 EXPECT_EQ(0, memcmp(deserialized->output.peek_read(), "foo", 3));
Shawn Willdenb7361132014-12-08 08:15:14 -0700286
287 switch (ver) {
288 case 0:
289 EXPECT_EQ(0, deserialized->input_consumed);
290 break;
291 case 1:
292 EXPECT_EQ(99, deserialized->input_consumed);
293 break;
294 default:
295 FAIL();
296 }
Shawn Willden2665e862014-11-24 14:46:21 -0700297 }
Shawn Willdenda8485e2014-08-17 08:00:01 -0600298}
299
300TEST(RoundTrip, FinishOperationRequest) {
Shawn Willden2665e862014-11-24 14:46:21 -0700301 for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) {
302 FinishOperationRequest msg(ver);
303 msg.op_handle = 0xDEADBEEF;
304 msg.signature.Reinitialize("bar", 3);
Shawn Willdenda8485e2014-08-17 08:00:01 -0600305
Shawn Willden2665e862014-11-24 14:46:21 -0700306 UniquePtr<FinishOperationRequest> deserialized(round_trip(ver, msg, 15));
307 EXPECT_EQ(0xDEADBEEF, deserialized->op_handle);
308 EXPECT_EQ(3U, deserialized->signature.available_read());
309 EXPECT_EQ(0, memcmp(deserialized->signature.peek_read(), "bar", 3));
310 }
Shawn Willdenda8485e2014-08-17 08:00:01 -0600311}
312
313TEST(Round_Trip, FinishOperationResponse) {
Shawn Willden2665e862014-11-24 14:46:21 -0700314 for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) {
315 FinishOperationResponse msg(ver);
316 msg.error = KM_ERROR_OK;
317 msg.output.Reinitialize("foo", 3);
Shawn Willdenda8485e2014-08-17 08:00:01 -0600318
Shawn Willden2665e862014-11-24 14:46:21 -0700319 UniquePtr<FinishOperationResponse> deserialized(round_trip(ver, msg, 11));
320 EXPECT_EQ(msg.error, deserialized->error);
321 EXPECT_EQ(msg.output.available_read(), deserialized->output.available_read());
322 EXPECT_EQ(0, memcmp(msg.output.peek_read(), deserialized->output.peek_read(),
323 msg.output.available_read()));
324 }
Shawn Willdenda8485e2014-08-17 08:00:01 -0600325}
326
327TEST(RoundTrip, ImportKeyRequest) {
Shawn Willden2665e862014-11-24 14:46:21 -0700328 for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) {
329 ImportKeyRequest msg(ver);
330 msg.key_description.Reinitialize(params, array_length(params));
331 msg.key_format = KM_KEY_FORMAT_X509;
332 msg.SetKeyMaterial("foo", 3);
Shawn Willdenda8485e2014-08-17 08:00:01 -0600333
Shawn Willden2665e862014-11-24 14:46:21 -0700334 UniquePtr<ImportKeyRequest> deserialized(round_trip(ver, msg, 89));
335 EXPECT_EQ(msg.key_description, deserialized->key_description);
336 EXPECT_EQ(msg.key_format, deserialized->key_format);
337 EXPECT_EQ(msg.key_data_length, deserialized->key_data_length);
338 EXPECT_EQ(0, memcmp(msg.key_data, deserialized->key_data, msg.key_data_length));
339 }
Shawn Willdenda8485e2014-08-17 08:00:01 -0600340}
341
342TEST(RoundTrip, ImportKeyResponse) {
Shawn Willden2665e862014-11-24 14:46:21 -0700343 for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) {
344 ImportKeyResponse msg(ver);
345 msg.error = KM_ERROR_OK;
346 msg.SetKeyMaterial("foo", 3);
347 msg.enforced.Reinitialize(params, array_length(params));
348 msg.unenforced.Reinitialize(params, array_length(params));
Shawn Willdenda8485e2014-08-17 08:00:01 -0600349
Shawn Willden2665e862014-11-24 14:46:21 -0700350 UniquePtr<ImportKeyResponse> deserialized(round_trip(ver, msg, 167));
351 EXPECT_EQ(msg.error, deserialized->error);
352 EXPECT_EQ(msg.key_blob.key_material_size, deserialized->key_blob.key_material_size);
353 EXPECT_EQ(0, memcmp(msg.key_blob.key_material, deserialized->key_blob.key_material,
354 msg.key_blob.key_material_size));
355 EXPECT_EQ(msg.enforced, deserialized->enforced);
356 EXPECT_EQ(msg.unenforced, deserialized->unenforced);
357 }
Shawn Willdenda8485e2014-08-17 08:00:01 -0600358}
359
360TEST(RoundTrip, ExportKeyRequest) {
Shawn Willden2665e862014-11-24 14:46:21 -0700361 for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) {
362 ExportKeyRequest msg(ver);
363 msg.additional_params.Reinitialize(params, array_length(params));
364 msg.key_format = KM_KEY_FORMAT_X509;
365 msg.SetKeyMaterial("foo", 3);
Shawn Willdenda8485e2014-08-17 08:00:01 -0600366
Shawn Willden2665e862014-11-24 14:46:21 -0700367 UniquePtr<ExportKeyRequest> deserialized(round_trip(ver, msg, 89));
368 EXPECT_EQ(msg.additional_params, deserialized->additional_params);
369 EXPECT_EQ(msg.key_format, deserialized->key_format);
370 EXPECT_EQ(3U, deserialized->key_blob.key_material_size);
371 EXPECT_EQ(0, memcmp("foo", deserialized->key_blob.key_material, 3));
372 }
Shawn Willdenda8485e2014-08-17 08:00:01 -0600373}
374
375TEST(RoundTrip, ExportKeyResponse) {
Shawn Willden2665e862014-11-24 14:46:21 -0700376 for (int ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) {
377 ExportKeyResponse msg(ver);
378 msg.error = KM_ERROR_OK;
379 msg.SetKeyMaterial("foo", 3);
Shawn Willdenda8485e2014-08-17 08:00:01 -0600380
Shawn Willden2665e862014-11-24 14:46:21 -0700381 UniquePtr<ExportKeyResponse> deserialized(round_trip(ver, msg, 11));
382 EXPECT_EQ(3U, deserialized->key_data_length);
383 EXPECT_EQ(0, memcmp("foo", deserialized->key_data, 3));
384 }
385}
386
387TEST(RoundTrip, GetVersionRequest) {
388 GetVersionRequest msg;
389
390 size_t size = msg.SerializedSize();
391 ASSERT_EQ(0, size);
392
393 UniquePtr<uint8_t[]> buf(new uint8_t[size]);
394 EXPECT_EQ(buf.get() + size, msg.Serialize(buf.get(), buf.get() + size));
395
396 GetVersionRequest deserialized;
397 const uint8_t* p = buf.get();
398 EXPECT_TRUE(deserialized.Deserialize(&p, p + size));
399 EXPECT_EQ((ptrdiff_t)size, p - buf.get());
400}
401
402TEST(RoundTrip, GetVersionResponse) {
403 GetVersionResponse msg;
404 msg.error = KM_ERROR_OK;
405 msg.major_ver = 9;
406 msg.minor_ver = 98;
407 msg.subminor_ver = 38;
408
409 size_t size = msg.SerializedSize();
410 ASSERT_EQ(7, size);
411
412 UniquePtr<uint8_t[]> buf(new uint8_t[size]);
413 EXPECT_EQ(buf.get() + size, msg.Serialize(buf.get(), buf.get() + size));
414
415 GetVersionResponse deserialized;
416 const uint8_t* p = buf.get();
417 EXPECT_TRUE(deserialized.Deserialize(&p, p + size));
418 EXPECT_EQ((ptrdiff_t)size, p - buf.get());
419 EXPECT_EQ(9, msg.major_ver);
420 EXPECT_EQ(98, msg.minor_ver);
421 EXPECT_EQ(38, msg.subminor_ver);
Shawn Willden128ffe02014-08-06 12:31:33 -0600422}
423
Shawn Willdenf2282b32014-08-25 06:49:54 -0600424uint8_t msgbuf[] = {
425 220, 88, 183, 255, 71, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
426 0, 173, 0, 0, 0, 228, 174, 98, 187, 191, 135, 253, 200, 51, 230, 114, 247, 151, 109,
427 237, 79, 87, 32, 94, 5, 204, 46, 154, 30, 91, 6, 103, 148, 254, 129, 65, 171, 228,
428 167, 224, 163, 9, 15, 206, 90, 58, 11, 205, 55, 211, 33, 87, 178, 149, 91, 28, 236,
429 218, 112, 231, 34, 82, 82, 134, 103, 137, 115, 27, 156, 102, 159, 220, 226, 89, 42, 25,
430 37, 9, 84, 239, 76, 161, 198, 72, 167, 163, 39, 91, 148, 191, 17, 191, 87, 169, 179,
431 136, 10, 194, 154, 4, 40, 107, 109, 61, 161, 20, 176, 247, 13, 214, 106, 229, 45, 17,
432 5, 60, 189, 64, 39, 166, 208, 14, 57, 25, 140, 148, 25, 177, 246, 189, 43, 181, 88,
433 204, 29, 126, 224, 100, 143, 93, 60, 57, 249, 55, 0, 87, 83, 227, 224, 166, 59, 214,
434 81, 144, 129, 58, 6, 57, 46, 254, 232, 41, 220, 209, 230, 167, 138, 158, 94, 180, 125,
435 247, 26, 162, 116, 238, 202, 187, 100, 65, 13, 180, 44, 245, 159, 83, 161, 176, 58, 72,
436 236, 109, 105, 160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
437 0, 11, 0, 0, 0, 98, 0, 0, 0, 1, 0, 0, 32, 2, 0, 0, 0, 1, 0,
438 0, 32, 3, 0, 0, 0, 2, 0, 0, 16, 1, 0, 0, 0, 3, 0, 0, 48, 0,
439 1, 0, 0, 200, 0, 0, 80, 3, 0, 0, 0, 0, 0, 0, 0, 244, 1, 0, 112,
440 1, 246, 1, 0, 112, 1, 189, 2, 0, 96, 144, 178, 236, 250, 255, 255, 255, 255, 145,
441 1, 0, 96, 144, 226, 33, 60, 222, 2, 0, 0, 189, 2, 0, 96, 0, 0, 0, 0,
442 0, 0, 0, 0, 190, 2, 0, 16, 1, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0,
443 0, 0, 0, 0, 0, 0, 0, 0, 0, 110, 0, 0, 0, 0, 0, 0, 0, 11, 0,
444 0, 0, 98, 0, 0, 0, 1, 0, 0, 32, 2, 0, 0, 0, 1, 0, 0, 32, 3,
445 0, 0, 0, 2, 0, 0, 16, 1, 0, 0, 0, 3, 0, 0, 48, 0, 1, 0, 0,
446 200, 0, 0, 80, 3, 0, 0, 0, 0, 0, 0, 0, 244, 1, 0, 112, 1, 246, 1,
447 0, 112, 1, 189, 2, 0, 96, 144, 178, 236, 250, 255, 255, 255, 255, 145, 1, 0, 96,
448 144, 226, 33, 60, 222, 2, 0, 0, 189, 2, 0, 96, 0, 0, 0, 0, 0, 0, 0,
449 0, 190, 2, 0, 16, 1, 0, 0, 0,
450};
451
452/*
453 * These tests don't have any assertions or expectations. They just try to parse garbage, to see if
454 * the result will be a crash. This is especially informative when run under Valgrind memcheck.
455 */
456
457template <typename Message> void parse_garbage() {
Shawn Willden2665e862014-11-24 14:46:21 -0700458 for (int32_t ver = 0; ver <= MAX_MESSAGE_VERSION; ++ver) {
459 Message msg(ver);
460 const uint8_t* end = msgbuf + array_length(msgbuf);
461 for (size_t i = 0; i < array_length(msgbuf); ++i) {
462 const uint8_t* begin = msgbuf + i;
463 const uint8_t* p = begin;
464 msg.Deserialize(&p, end);
465 }
Shawn Willdenf2282b32014-08-25 06:49:54 -0600466 }
467}
468
469#define GARBAGE_TEST(Message) \
470 TEST(GarbageTest, Message) { parse_garbage<Message>(); }
471
472GARBAGE_TEST(SupportedAlgorithmsResponse)
473GARBAGE_TEST(GenerateKeyRequest);
474GARBAGE_TEST(GenerateKeyResponse);
475GARBAGE_TEST(GetKeyCharacteristicsRequest);
476GARBAGE_TEST(GetKeyCharacteristicsResponse);
477GARBAGE_TEST(BeginOperationRequest);
478GARBAGE_TEST(BeginOperationResponse);
479GARBAGE_TEST(UpdateOperationRequest);
480GARBAGE_TEST(UpdateOperationResponse);
481GARBAGE_TEST(FinishOperationRequest);
482GARBAGE_TEST(FinishOperationResponse);
483// GARBAGE_TEST(AddEntropyRequest);
484GARBAGE_TEST(ImportKeyRequest);
485GARBAGE_TEST(ImportKeyResponse);
486GARBAGE_TEST(ExportKeyRequest);
487GARBAGE_TEST(ExportKeyResponse);
488// GARBAGE_TEST(RescopeRequest);
489// GARBAGE_TEST(RescopeResponse);
490
491// The macro doesn't work on this one.
492TEST(GarbageTest, SupportedResponse) {
493 parse_garbage<SupportedResponse<keymaster_digest_t>>();
494}
495
Shawn Willden128ffe02014-08-06 12:31:33 -0600496} // namespace test
Shawn Willden2665e862014-11-24 14:46:21 -0700497
Shawn Willden128ffe02014-08-06 12:31:33 -0600498} // namespace keymaster