blob: 2c965b77cb1d51a79b1017d260fed639b24303fc [file] [log] [blame]
Shawn Willden5ada7b62014-07-29 09:44:17 -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 <gtest/gtest.h>
18
19#include "authorization_set.h"
20#include "google_keymaster_utils.h"
21
22int main(int argc, char** argv) {
23 ::testing::InitGoogleTest(&argc, argv);
24 int result = RUN_ALL_TESTS();
25 return result;
26}
27
28namespace keymaster {
29namespace test {
30
31TEST(Construction, ListProvided) {
32 keymaster_key_param_t params[] = {
33 Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN),
34 Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY),
35 Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA),
36 Authorization(TAG_USER_ID, 7),
37 Authorization(TAG_USER_AUTH_ID, 8),
38 Authorization(TAG_APPLICATION_ID, "my_app", 6),
39 Authorization(TAG_KEY_SIZE, 256),
40 Authorization(TAG_AUTH_TIMEOUT, 300),
41 };
42 AuthorizationSet set(params, array_length(params));
43 EXPECT_EQ(8U, set.size());
44}
45
46TEST(Lookup, NonRepeated) {
47 keymaster_key_param_t params[] = {
48 Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN),
49 Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY),
50 Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA),
51 Authorization(TAG_USER_ID, 7),
52 Authorization(TAG_USER_AUTH_ID, 8),
53 Authorization(TAG_APPLICATION_ID, "my_app", 6),
54 Authorization(TAG_KEY_SIZE, 256),
55 Authorization(TAG_AUTH_TIMEOUT, 300),
56 };
57 AuthorizationSet set(params, array_length(params));
58 EXPECT_EQ(8U, set.size());
59
60 int pos = set.find(TAG_ALGORITHM);
61 ASSERT_NE(-1, pos);
62 EXPECT_EQ(KM_TAG_ALGORITHM, set[pos].tag);
63 EXPECT_EQ(KM_ALGORITHM_RSA, set[pos].enumerated);
64
65 pos = set.find(TAG_MAC_LENGTH);
66 EXPECT_EQ(-1, pos);
67
68 uint32_t int_val = 0;
69 EXPECT_TRUE(set.GetTagValue(TAG_USER_ID, &int_val));
70 EXPECT_EQ(7U, int_val);
71
72 keymaster_blob_t blob_val;
73 EXPECT_TRUE(set.GetTagValue(TAG_APPLICATION_ID, &blob_val));
74 EXPECT_EQ(6U, blob_val.data_length);
75 EXPECT_EQ(0, memcmp(blob_val.data, "my_app", 6));
76}
77
78TEST(Lookup, Repeated) {
79 keymaster_key_param_t params[] = {
80 Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN),
81 Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY),
82 Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA),
83 Authorization(TAG_USER_ID, 7),
84 Authorization(TAG_USER_AUTH_ID, 8),
85 Authorization(TAG_APPLICATION_ID, "my_app", 6),
86 Authorization(TAG_KEY_SIZE, 256),
87 Authorization(TAG_AUTH_TIMEOUT, 300),
88 };
89 AuthorizationSet set(params, array_length(params));
90 EXPECT_EQ(8U, set.size());
91
92 int pos = set.find(TAG_PURPOSE);
93 ASSERT_FALSE(pos == -1);
94 EXPECT_EQ(KM_TAG_PURPOSE, set[pos].tag);
95 EXPECT_EQ(KM_PURPOSE_SIGN, set[pos].enumerated);
96
97 pos = set.find(TAG_PURPOSE, pos);
98 EXPECT_EQ(KM_TAG_PURPOSE, set[pos].tag);
99 EXPECT_EQ(KM_PURPOSE_VERIFY, set[pos].enumerated);
100
101 EXPECT_EQ(-1, set.find(TAG_PURPOSE, pos));
102}
103
104TEST(Lookup, Indexed) {
105 keymaster_key_param_t params[] = {
106 Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN),
107 Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY),
108 Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA),
109 Authorization(TAG_USER_ID, 7),
110 Authorization(TAG_USER_AUTH_ID, 8),
111 Authorization(TAG_APPLICATION_ID, "my_app", 6),
112 Authorization(TAG_KEY_SIZE, 256),
113 Authorization(TAG_AUTH_TIMEOUT, 300),
114 };
115 AuthorizationSet set(params, array_length(params));
116 EXPECT_EQ(8U, set.size());
117
118 EXPECT_EQ(KM_TAG_PURPOSE, set[0].tag);
119 EXPECT_EQ(KM_PURPOSE_SIGN, set[0].enumerated);
120
121 // Lookup beyond end doesn't work, just returns zeros, but doens't blow up either (verify by
122 // running under valgrind).
123 EXPECT_EQ(KM_TAG_INVALID, set[10].tag);
124}
125
126TEST(Serialization, RoundTrip) {
127 keymaster_key_param_t params[] = {
128 Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN),
129 Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY),
130 Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA),
131 Authorization(TAG_USER_ID, 7),
132 Authorization(TAG_USER_AUTH_ID, 8),
133 Authorization(TAG_APPLICATION_ID, "my_app", 6),
134 Authorization(TAG_KEY_SIZE, 256),
135 Authorization(TAG_AUTH_TIMEOUT, 300),
136 };
137 AuthorizationSet set(params, array_length(params));
138
139 size_t size = set.SerializedSize();
140 EXPECT_TRUE(size > 0);
141
142 UniquePtr<uint8_t[]> buf(new uint8_t[size]);
Shawn Willden58e1a542014-08-08 21:58:29 -0600143 EXPECT_EQ(buf.get() + size, set.Serialize(buf.get(), buf.get() + size));
Shawn Willden5ada7b62014-07-29 09:44:17 -0600144 AuthorizationSet deserialized(buf.get(), size);
145
Shawn Willden58e1a542014-08-08 21:58:29 -0600146 EXPECT_EQ(AuthorizationSet::OK, deserialized.is_valid());
Shawn Willden5ada7b62014-07-29 09:44:17 -0600147
148 EXPECT_EQ(set.size(), deserialized.size());
149 for (size_t i = 0; i < set.size(); ++i) {
150 EXPECT_EQ(set[i].tag, deserialized[i].tag);
151 }
152
153 int pos = deserialized.find(TAG_APPLICATION_ID);
154 ASSERT_NE(-1, pos);
155 EXPECT_EQ(KM_TAG_APPLICATION_ID, deserialized[pos].tag);
156 EXPECT_EQ(6U, deserialized[pos].blob.data_length);
157 EXPECT_EQ(0, memcmp(deserialized[pos].blob.data, "my_app", 6));
158}
159
Shawn Willden58e1a542014-08-08 21:58:29 -0600160TEST(Deserialization, Deserialize) {
Shawn Willden5ada7b62014-07-29 09:44:17 -0600161 keymaster_key_param_t params[] = {
162 Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN),
163 Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY),
164 Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA),
165 Authorization(TAG_USER_ID, 7),
166 Authorization(TAG_USER_AUTH_ID, 8),
167 Authorization(TAG_APPLICATION_ID, "my_app", 6),
168 Authorization(TAG_KEY_SIZE, 256),
169 Authorization(TAG_AUTH_TIMEOUT, 300),
170 };
171 AuthorizationSet set(params, array_length(params));
172
173 size_t size = set.SerializedSize();
174 EXPECT_TRUE(size > 0);
175
176 UniquePtr<uint8_t[]> buf(new uint8_t[size]);
Shawn Willden58e1a542014-08-08 21:58:29 -0600177 EXPECT_EQ(buf.get() + size, set.Serialize(buf.get(), buf.get() + size));
Shawn Willden5ada7b62014-07-29 09:44:17 -0600178 AuthorizationSet deserialized;
179 const uint8_t* p = buf.get();
Shawn Willden58e1a542014-08-08 21:58:29 -0600180 EXPECT_TRUE(deserialized.Deserialize(&p, p + size));
Shawn Willden5ada7b62014-07-29 09:44:17 -0600181 EXPECT_EQ(p, buf.get() + size);
182
Shawn Willden58e1a542014-08-08 21:58:29 -0600183 EXPECT_EQ(AuthorizationSet::OK, deserialized.is_valid());
Shawn Willden5ada7b62014-07-29 09:44:17 -0600184
185 EXPECT_EQ(set.size(), deserialized.size());
186 for (size_t i = 0; i < set.size(); ++i) {
187 EXPECT_EQ(set[i].tag, deserialized[i].tag);
188 }
189
190 int pos = deserialized.find(TAG_APPLICATION_ID);
191 ASSERT_NE(-1, pos);
192 EXPECT_EQ(KM_TAG_APPLICATION_ID, deserialized[pos].tag);
193 EXPECT_EQ(6U, deserialized[pos].blob.data_length);
194 EXPECT_EQ(0, memcmp(deserialized[pos].blob.data, "my_app", 6));
195}
196
197TEST(Deserialization, TooShortBuffer) {
198 uint8_t buf[] = {0, 0, 0};
199 AuthorizationSet deserialized(buf, array_length(buf));
200 EXPECT_EQ(AuthorizationSet::MALFORMED_DATA, deserialized.is_valid());
201
202 const uint8_t* p = buf;
Shawn Willden58e1a542014-08-08 21:58:29 -0600203 EXPECT_FALSE(deserialized.Deserialize(&p, p + array_length(buf)));
Shawn Willden5ada7b62014-07-29 09:44:17 -0600204 EXPECT_EQ(AuthorizationSet::MALFORMED_DATA, deserialized.is_valid());
205}
206
207TEST(Deserialization, InvalidLengthField) {
208 keymaster_key_param_t params[] = {
209 Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN),
210 Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY),
211 Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA),
212 Authorization(TAG_USER_ID, 7),
213 Authorization(TAG_USER_AUTH_ID, 8),
214 Authorization(TAG_APPLICATION_ID, "my_app", 6),
215 Authorization(TAG_KEY_SIZE, 256),
216 Authorization(TAG_AUTH_TIMEOUT, 300),
217 };
218 AuthorizationSet set(params, array_length(params));
219
220 size_t size = set.SerializedSize();
221 EXPECT_TRUE(size > 0);
222
223 UniquePtr<uint8_t[]> buf(new uint8_t[size]);
Shawn Willden58e1a542014-08-08 21:58:29 -0600224 EXPECT_EQ(buf.get() + size, set.Serialize(buf.get(), buf.get() + size));
Shawn Willden5ada7b62014-07-29 09:44:17 -0600225 *reinterpret_cast<uint32_t*>(buf.get()) = 9;
226
227 AuthorizationSet deserialized(buf.get(), size);
228 EXPECT_EQ(AuthorizationSet::MALFORMED_DATA, deserialized.is_valid());
229
230 const uint8_t* p = buf.get();
Shawn Willden58e1a542014-08-08 21:58:29 -0600231 EXPECT_FALSE(deserialized.Deserialize(&p, p + size));
Shawn Willden5ada7b62014-07-29 09:44:17 -0600232 EXPECT_EQ(AuthorizationSet::MALFORMED_DATA, deserialized.is_valid());
233}
234
235TEST(Deserialization, MalformedIndirectData) {
236 keymaster_key_param_t params[] = {
237 Authorization(TAG_APPLICATION_ID, "my_app", 6),
238 Authorization(TAG_APPLICATION_DATA, "foo", 3),
239 };
240 AuthorizationSet set(params, array_length(params));
241 size_t size = set.SerializedSize();
242
243 UniquePtr<uint8_t[]> buf(new uint8_t[size]);
Shawn Willden58e1a542014-08-08 21:58:29 -0600244 EXPECT_EQ(buf.get() + size, set.Serialize(buf.get(), buf.get() + size));
Shawn Willden5ada7b62014-07-29 09:44:17 -0600245
246 keymaster_key_param_t* ptr =
247 reinterpret_cast<keymaster_key_param_t*>(buf.get() + sizeof(uint32_t));
248
249 // Check that the offsets we expect are present.
250 EXPECT_EQ(0, ptr[0].blob.data);
251 EXPECT_EQ(6U, ptr[0].blob.data_length);
252 EXPECT_EQ(6, reinterpret_cast<ptrdiff_t>(ptr[1].blob.data));
253 EXPECT_EQ(3U, ptr[1].blob.data_length);
254 EXPECT_EQ(9U, size - sizeof(uint32_t) * 2 - sizeof(*ptr) * 2);
255
256 // Check that deserialization works.
257 AuthorizationSet deserialized1(buf.get(), size);
Shawn Willden58e1a542014-08-08 21:58:29 -0600258 EXPECT_EQ(AuthorizationSet::OK, deserialized1.is_valid());
Shawn Willden5ada7b62014-07-29 09:44:17 -0600259
260 const uint8_t* p = buf.get();
Shawn Willden58e1a542014-08-08 21:58:29 -0600261 EXPECT_TRUE(deserialized1.Deserialize(&p, p + size));
262 EXPECT_EQ(AuthorizationSet::OK, deserialized1.is_valid());
Shawn Willden5ada7b62014-07-29 09:44:17 -0600263
264 //
265 // Now mess them up in various ways:
266 //
267
268 // Make one point past the end.
269 (*reinterpret_cast<long*>(&(ptr[1].blob.data)))++;
270 AuthorizationSet deserialized2;
271 p = buf.get();
Shawn Willden58e1a542014-08-08 21:58:29 -0600272 deserialized2.Deserialize(&p, p + size);
Shawn Willden5ada7b62014-07-29 09:44:17 -0600273 EXPECT_EQ(AuthorizationSet::BOUNDS_CHECKING_FAILURE, deserialized2.is_valid());
274
275 p = buf.get();
Shawn Willden58e1a542014-08-08 21:58:29 -0600276 EXPECT_FALSE(deserialized2.Deserialize(&p, p + size));
Shawn Willden5ada7b62014-07-29 09:44:17 -0600277 EXPECT_EQ(AuthorizationSet::BOUNDS_CHECKING_FAILURE, deserialized2.is_valid());
278
279 (*reinterpret_cast<long*>(&(ptr[1].blob.data)))--;
280
281 // Make a gap between the blobs.
282 ptr[0].blob.data_length--;
283 AuthorizationSet deserialized3(buf.get(), size);
284 EXPECT_EQ(AuthorizationSet::MALFORMED_DATA, deserialized3.is_valid());
285
286 p = buf.get();
Shawn Willden58e1a542014-08-08 21:58:29 -0600287 deserialized3.Deserialize(&p, p + size);
Shawn Willden5ada7b62014-07-29 09:44:17 -0600288 EXPECT_EQ(AuthorizationSet::MALFORMED_DATA, deserialized3.is_valid());
289
290 ptr[0].blob.data_length++;
291
292 // Make them overlap. We don't currently detect this. We should.
293 ptr[0].blob.data_length++;
294 (*reinterpret_cast<long*>(&(ptr[1].blob.data)))--;
295 ptr[1].blob.data_length--;
296 AuthorizationSet deserialized4(buf.get(), size);
Shawn Willden58e1a542014-08-08 21:58:29 -0600297 EXPECT_EQ(AuthorizationSet::OK, deserialized4.is_valid());
Shawn Willden5ada7b62014-07-29 09:44:17 -0600298}
299
300TEST(Growable, SuccessfulRoundTrip) {
301 keymaster_key_param_t elems_buf[20];
302 uint8_t data_buf[200];
303
304 AuthorizationSet growable;
305 EXPECT_TRUE(growable.push_back(Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA)));
306 EXPECT_EQ(1U, growable.size());
307
308 EXPECT_TRUE(growable.push_back(Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY)));
309 EXPECT_EQ(2U, growable.size());
310
311 EXPECT_TRUE(growable.push_back(Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN)));
312 EXPECT_EQ(3U, growable.size());
313
314 EXPECT_TRUE(growable.push_back(Authorization(TAG_APPLICATION_ID, "data", 4)));
315 EXPECT_EQ(4U, growable.size());
316
317 size_t serialize_size = growable.SerializedSize();
318 UniquePtr<uint8_t[]> serialized(new uint8_t[serialize_size]);
Shawn Willden58e1a542014-08-08 21:58:29 -0600319 EXPECT_EQ(serialized.get() + serialize_size,
320 growable.Serialize(serialized.get(), serialized.get() + serialize_size));
Shawn Willden5ada7b62014-07-29 09:44:17 -0600321}
322
323TEST(Growable, InsufficientElemBuf) {
324 keymaster_key_param_t elems_buf[1];
325 uint8_t data_buf[200];
326
327 AuthorizationSet growable;
Shawn Willden58e1a542014-08-08 21:58:29 -0600328 EXPECT_EQ(AuthorizationSet::OK, growable.is_valid());
Shawn Willden5ada7b62014-07-29 09:44:17 -0600329
330 // First insertion fits.
331 EXPECT_TRUE(growable.push_back(Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA)));
332 EXPECT_EQ(1U, growable.size());
Shawn Willden58e1a542014-08-08 21:58:29 -0600333 EXPECT_EQ(AuthorizationSet::OK, growable.is_valid());
Shawn Willden5ada7b62014-07-29 09:44:17 -0600334
335 // Second does too.
336 EXPECT_TRUE(growable.push_back(Authorization(TAG_RSA_PUBLIC_EXPONENT, 3)));
337 EXPECT_EQ(2U, growable.size());
338}
339
340TEST(Growable, InsufficientIndirectBuf) {
341 keymaster_key_param_t elems_buf[3];
342 uint8_t data_buf[10];
343
344 AuthorizationSet growable;
Shawn Willden58e1a542014-08-08 21:58:29 -0600345 EXPECT_EQ(AuthorizationSet::OK, growable.is_valid());
Shawn Willden5ada7b62014-07-29 09:44:17 -0600346
347 EXPECT_TRUE(growable.push_back(Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA)));
348 EXPECT_EQ(1U, growable.size());
Shawn Willden58e1a542014-08-08 21:58:29 -0600349 EXPECT_EQ(AuthorizationSet::OK, growable.is_valid());
Shawn Willden5ada7b62014-07-29 09:44:17 -0600350
351 EXPECT_TRUE(growable.push_back(Authorization(TAG_APPLICATION_ID, "1234567890", 10)));
352 EXPECT_EQ(2U, growable.size());
Shawn Willden58e1a542014-08-08 21:58:29 -0600353 EXPECT_EQ(AuthorizationSet::OK, growable.is_valid());
Shawn Willden5ada7b62014-07-29 09:44:17 -0600354
355 EXPECT_TRUE(growable.push_back(Authorization(TAG_APPLICATION_DATA, "1", 1)));
356 EXPECT_EQ(3U, growable.size());
Shawn Willden58e1a542014-08-08 21:58:29 -0600357 EXPECT_EQ(AuthorizationSet::OK, growable.is_valid());
Shawn Willden5ada7b62014-07-29 09:44:17 -0600358
359 // Can still add another entry without indirect data. Now it's full.
360 EXPECT_TRUE(growable.push_back(Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN)));
361 EXPECT_EQ(4U, growable.size());
Shawn Willden58e1a542014-08-08 21:58:29 -0600362 EXPECT_EQ(AuthorizationSet::OK, growable.is_valid());
Shawn Willden5ada7b62014-07-29 09:44:17 -0600363}
364
365TEST(GetValue, GetInt) {
366 keymaster_key_param_t params[] = {
367 Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN),
368 Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY),
369 Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA),
370 Authorization(TAG_USER_ID, 7),
371 Authorization(TAG_USER_AUTH_ID, 8),
372 Authorization(TAG_APPLICATION_ID, "my_app", 6),
373 Authorization(TAG_AUTH_TIMEOUT, 300),
374 };
375 AuthorizationSet set(params, array_length(params));
376
377 uint32_t val;
378 EXPECT_TRUE(set.GetTagValue(TAG_USER_ID, &val));
379 EXPECT_EQ(7U, val);
380
381 // Find one that isn't there
382 EXPECT_FALSE(set.GetTagValue(TAG_KEY_SIZE, &val));
383}
384
385TEST(GetValue, GetIntRep) {
386 keymaster_key_param_t params[] = {
387 Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN),
388 Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY),
389 Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA),
390 Authorization(TAG_USER_ID, 7),
391 Authorization(TAG_USER_AUTH_ID, 8),
392 Authorization(TAG_APPLICATION_ID, "my_app", 6),
393 Authorization(TAG_AUTH_TIMEOUT, 300),
394 };
395 AuthorizationSet set(params, array_length(params));
396
397 uint32_t val;
398 EXPECT_TRUE(set.GetTagValue(TAG_USER_AUTH_ID, 0, &val));
399 EXPECT_EQ(8U, val);
400
401 // Find one that isn't there
402 EXPECT_FALSE(set.GetTagValue(TAG_USER_AUTH_ID, 1, &val));
403}
404
405TEST(GetValue, GetLong) {
406 keymaster_key_param_t params1[] = {
407 Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN), Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY),
408 Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA),
409 keymaster_param_long(TAG_RSA_PUBLIC_EXPONENT, 3),
410 };
411 AuthorizationSet set1(params1, array_length(params1));
412
413 keymaster_key_param_t params2[] = {
414 Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN), Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY),
415 Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA),
416 };
417 AuthorizationSet set2(params2, array_length(params2));
418
419 uint64_t val;
420 EXPECT_TRUE(set1.GetTagValue(TAG_RSA_PUBLIC_EXPONENT, &val));
421 EXPECT_EQ(3U, val);
422
423 // Find one that isn't there
424 EXPECT_FALSE(set2.GetTagValue(TAG_RSA_PUBLIC_EXPONENT, &val));
425}
426
427TEST(GetValue, GetEnum) {
428 keymaster_key_param_t params[] = {
429 Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN),
430 Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY),
431 Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA),
432 Authorization(TAG_USER_ID, 7),
433 Authorization(TAG_USER_AUTH_ID, 8),
434 Authorization(TAG_APPLICATION_ID, "my_app", 6),
435 Authorization(TAG_AUTH_TIMEOUT, 300),
436 };
437 AuthorizationSet set(params, array_length(params));
438
439 keymaster_algorithm_t val;
440 EXPECT_TRUE(set.GetTagValue(TAG_ALGORITHM, &val));
441 EXPECT_EQ(KM_ALGORITHM_RSA, val);
442
443 // Find one that isn't there
444 keymaster_padding_t val2;
445 EXPECT_FALSE(set.GetTagValue(TAG_PADDING, &val2));
446}
447
448TEST(GetValue, GetEnumRep) {
449 keymaster_key_param_t params[] = {
450 Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN),
451 Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY),
452 Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA),
453 Authorization(TAG_USER_ID, 7),
454 Authorization(TAG_USER_AUTH_ID, 8),
455 Authorization(TAG_APPLICATION_ID, "my_app", 6),
456 Authorization(TAG_AUTH_TIMEOUT, 300),
457 };
458 AuthorizationSet set(params, array_length(params));
459
460 keymaster_purpose_t val;
461 EXPECT_TRUE(set.GetTagValue(TAG_PURPOSE, 0, &val));
462 EXPECT_EQ(KM_PURPOSE_SIGN, val);
463 EXPECT_TRUE(set.GetTagValue(TAG_PURPOSE, 1, &val));
464 EXPECT_EQ(KM_PURPOSE_VERIFY, val);
465
466 // Find one that isn't there
467 EXPECT_FALSE(set.GetTagValue(TAG_PURPOSE, 2, &val));
468}
469
470TEST(GetValue, GetDate) {
471 keymaster_key_param_t params[] = {
472 Authorization(TAG_ACTIVE_DATETIME, 10),
473 Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY),
474 Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA),
475 Authorization(TAG_USER_ID, 7),
476 Authorization(TAG_USER_AUTH_ID, 8),
477 Authorization(TAG_APPLICATION_ID, "my_app", 6),
478 Authorization(TAG_AUTH_TIMEOUT, 300),
479 };
480 AuthorizationSet set(params, array_length(params));
481
482 uint64_t val;
483 EXPECT_TRUE(set.GetTagValue(TAG_ACTIVE_DATETIME, &val));
484 EXPECT_EQ(10U, val);
485
486 // Find one that isn't there
487 EXPECT_FALSE(set.GetTagValue(TAG_USAGE_EXPIRE_DATETIME, &val));
488}
489
490TEST(GetValue, GetBlob) {
491 keymaster_key_param_t params[] = {
492 Authorization(TAG_ACTIVE_DATETIME, 10),
493 Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY),
494 Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA),
495 Authorization(TAG_USER_ID, 7),
496 Authorization(TAG_USER_AUTH_ID, 8),
497 Authorization(TAG_APPLICATION_ID, "my_app", 6),
498 Authorization(TAG_AUTH_TIMEOUT, 300),
499 };
500 AuthorizationSet set(params, array_length(params));
501
502 keymaster_blob_t val;
503 EXPECT_TRUE(set.GetTagValue(TAG_APPLICATION_ID, &val));
504 EXPECT_EQ(6U, val.data_length);
505 EXPECT_EQ(0, memcmp(val.data, "my_app", 6));
506
507 // Find one that isn't there
508 EXPECT_FALSE(set.GetTagValue(TAG_APPLICATION_DATA, &val));
509}
510
511} // namespace test
512} // namespace keymaster