1 /* 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 <keymaster/authorization_set.h> 20 #include <keymaster/google_keymaster_utils.h> 21 22 #include "google_keymaster_test_utils.h" 23 24 int main(int argc, char** argv) { 25 ::testing::InitGoogleTest(&argc, argv); 26 int result = RUN_ALL_TESTS(); 27 return result; 28 } 29 30 namespace keymaster { 31 32 namespace test { 33 34 TEST(Construction, ListProvided) { 35 keymaster_key_param_t params[] = { 36 Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN), 37 Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY), 38 Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA), 39 Authorization(TAG_USER_ID, 7), 40 Authorization(TAG_USER_AUTH_ID, 8), 41 Authorization(TAG_APPLICATION_ID, "my_app", 6), 42 Authorization(TAG_KEY_SIZE, 256), 43 Authorization(TAG_AUTH_TIMEOUT, 300), 44 }; 45 AuthorizationSet set(params, array_length(params)); 46 EXPECT_EQ(8U, set.size()); 47 } 48 49 TEST(Construction, Copy) { 50 keymaster_key_param_t params[] = { 51 Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN), 52 Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY), 53 Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA), 54 Authorization(TAG_USER_ID, 7), 55 Authorization(TAG_USER_AUTH_ID, 8), 56 Authorization(TAG_APPLICATION_ID, "my_app", 6), 57 Authorization(TAG_KEY_SIZE, 256), 58 Authorization(TAG_AUTH_TIMEOUT, 300), 59 }; 60 AuthorizationSet set(params, array_length(params)); 61 AuthorizationSet set2(set); 62 EXPECT_EQ(set, set2); 63 } 64 65 TEST(Lookup, NonRepeated) { 66 keymaster_key_param_t params[] = { 67 Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN), 68 Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY), 69 Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA), 70 Authorization(TAG_USER_ID, 7), 71 Authorization(TAG_USER_AUTH_ID, 8), 72 Authorization(TAG_APPLICATION_ID, "my_app", 6), 73 Authorization(TAG_KEY_SIZE, 256), 74 Authorization(TAG_AUTH_TIMEOUT, 300), 75 }; 76 AuthorizationSet set(params, array_length(params)); 77 EXPECT_EQ(8U, set.size()); 78 79 int pos = set.find(TAG_ALGORITHM); 80 ASSERT_NE(-1, pos); 81 EXPECT_EQ(KM_TAG_ALGORITHM, set[pos].tag); 82 EXPECT_EQ(KM_ALGORITHM_RSA, set[pos].enumerated); 83 84 pos = set.find(TAG_MAC_LENGTH); 85 EXPECT_EQ(-1, pos); 86 87 uint32_t int_val = 0; 88 EXPECT_TRUE(set.GetTagValue(TAG_USER_ID, &int_val)); 89 EXPECT_EQ(7U, int_val); 90 91 keymaster_blob_t blob_val; 92 EXPECT_TRUE(set.GetTagValue(TAG_APPLICATION_ID, &blob_val)); 93 EXPECT_EQ(6U, blob_val.data_length); 94 EXPECT_EQ(0, memcmp(blob_val.data, "my_app", 6)); 95 } 96 97 TEST(Lookup, Repeated) { 98 keymaster_key_param_t params[] = { 99 Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN), 100 Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY), 101 Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA), 102 Authorization(TAG_USER_ID, 7), 103 Authorization(TAG_USER_AUTH_ID, 8), 104 Authorization(TAG_APPLICATION_ID, "my_app", 6), 105 Authorization(TAG_KEY_SIZE, 256), 106 Authorization(TAG_AUTH_TIMEOUT, 300), 107 }; 108 AuthorizationSet set(params, array_length(params)); 109 EXPECT_EQ(8U, set.size()); 110 111 int pos = set.find(TAG_PURPOSE); 112 ASSERT_FALSE(pos == -1); 113 EXPECT_EQ(KM_TAG_PURPOSE, set[pos].tag); 114 EXPECT_EQ(KM_PURPOSE_SIGN, set[pos].enumerated); 115 116 pos = set.find(TAG_PURPOSE, pos); 117 EXPECT_EQ(KM_TAG_PURPOSE, set[pos].tag); 118 EXPECT_EQ(KM_PURPOSE_VERIFY, set[pos].enumerated); 119 120 EXPECT_EQ(-1, set.find(TAG_PURPOSE, pos)); 121 } 122 123 TEST(Lookup, Indexed) { 124 keymaster_key_param_t params[] = { 125 Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN), 126 Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY), 127 Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA), 128 Authorization(TAG_USER_ID, 7), 129 Authorization(TAG_USER_AUTH_ID, 8), 130 Authorization(TAG_APPLICATION_ID, "my_app", 6), 131 Authorization(TAG_KEY_SIZE, 256), 132 Authorization(TAG_AUTH_TIMEOUT, 300), 133 }; 134 AuthorizationSet set(params, array_length(params)); 135 EXPECT_EQ(8U, set.size()); 136 137 EXPECT_EQ(KM_TAG_PURPOSE, set[0].tag); 138 EXPECT_EQ(KM_PURPOSE_SIGN, set[0].enumerated); 139 140 // Lookup beyond end doesn't work, just returns zeros, but doens't blow up either (verify by 141 // running under valgrind). 142 EXPECT_EQ(KM_TAG_INVALID, set[10].tag); 143 } 144 145 TEST(Serialization, RoundTrip) { 146 keymaster_key_param_t params[] = { 147 Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN), 148 Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY), 149 Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA), 150 Authorization(TAG_USER_ID, 7), 151 Authorization(TAG_USER_AUTH_ID, 8), 152 Authorization(TAG_APPLICATION_ID, "my_app", 6), 153 Authorization(TAG_KEY_SIZE, 256), 154 Authorization(TAG_AUTH_TIMEOUT, 300), 155 Authorization(TAG_ALL_USERS), 156 Authorization(TAG_RSA_PUBLIC_EXPONENT, 3), 157 Authorization(TAG_ACTIVE_DATETIME, 10), 158 }; 159 AuthorizationSet set(params, array_length(params)); 160 161 size_t size = set.SerializedSize(); 162 EXPECT_TRUE(size > 0); 163 164 UniquePtr<uint8_t[]> buf(new uint8_t[size]); 165 EXPECT_EQ(buf.get() + size, set.Serialize(buf.get(), buf.get() + size)); 166 AuthorizationSet deserialized(buf.get(), size); 167 168 EXPECT_EQ(AuthorizationSet::OK, deserialized.is_valid()); 169 EXPECT_EQ(set, deserialized); 170 171 int pos = deserialized.find(TAG_APPLICATION_ID); 172 ASSERT_NE(-1, pos); 173 EXPECT_EQ(KM_TAG_APPLICATION_ID, deserialized[pos].tag); 174 EXPECT_EQ(6U, deserialized[pos].blob.data_length); 175 EXPECT_EQ(0, memcmp(deserialized[pos].blob.data, "my_app", 6)); 176 } 177 178 TEST(Deserialization, Deserialize) { 179 keymaster_key_param_t params[] = { 180 Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN), 181 Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY), 182 Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA), 183 Authorization(TAG_USER_ID, 7), 184 Authorization(TAG_USER_AUTH_ID, 8), 185 Authorization(TAG_APPLICATION_ID, "my_app", 6), 186 Authorization(TAG_KEY_SIZE, 256), 187 Authorization(TAG_AUTH_TIMEOUT, 300), 188 }; 189 AuthorizationSet set(params, array_length(params)); 190 191 size_t size = set.SerializedSize(); 192 EXPECT_TRUE(size > 0); 193 194 UniquePtr<uint8_t[]> buf(new uint8_t[size]); 195 EXPECT_EQ(buf.get() + size, set.Serialize(buf.get(), buf.get() + size)); 196 AuthorizationSet deserialized; 197 const uint8_t* p = buf.get(); 198 EXPECT_TRUE(deserialized.Deserialize(&p, p + size)); 199 EXPECT_EQ(p, buf.get() + size); 200 201 EXPECT_EQ(AuthorizationSet::OK, deserialized.is_valid()); 202 203 EXPECT_EQ(set.size(), deserialized.size()); 204 for (size_t i = 0; i < set.size(); ++i) { 205 EXPECT_EQ(set[i].tag, deserialized[i].tag); 206 } 207 208 int pos = deserialized.find(TAG_APPLICATION_ID); 209 ASSERT_NE(-1, pos); 210 EXPECT_EQ(KM_TAG_APPLICATION_ID, deserialized[pos].tag); 211 EXPECT_EQ(6U, deserialized[pos].blob.data_length); 212 EXPECT_EQ(0, memcmp(deserialized[pos].blob.data, "my_app", 6)); 213 } 214 215 TEST(Deserialization, TooShortBuffer) { 216 uint8_t buf[] = {0, 0, 0}; 217 AuthorizationSet deserialized(buf, array_length(buf)); 218 EXPECT_EQ(AuthorizationSet::MALFORMED_DATA, deserialized.is_valid()); 219 220 const uint8_t* p = buf; 221 EXPECT_FALSE(deserialized.Deserialize(&p, p + array_length(buf))); 222 EXPECT_EQ(AuthorizationSet::MALFORMED_DATA, deserialized.is_valid()); 223 } 224 225 TEST(Deserialization, InvalidLengthField) { 226 keymaster_key_param_t params[] = { 227 Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN), 228 Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY), 229 Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA), 230 Authorization(TAG_USER_ID, 7), 231 Authorization(TAG_USER_AUTH_ID, 8), 232 Authorization(TAG_APPLICATION_ID, "my_app", 6), 233 Authorization(TAG_KEY_SIZE, 256), 234 Authorization(TAG_AUTH_TIMEOUT, 300), 235 }; 236 AuthorizationSet set(params, array_length(params)); 237 238 size_t size = set.SerializedSize(); 239 EXPECT_TRUE(size > 0); 240 241 UniquePtr<uint8_t[]> buf(new uint8_t[size]); 242 EXPECT_EQ(buf.get() + size, set.Serialize(buf.get(), buf.get() + size)); 243 *reinterpret_cast<uint32_t*>(buf.get()) = 9; 244 245 AuthorizationSet deserialized(buf.get(), size); 246 EXPECT_EQ(AuthorizationSet::MALFORMED_DATA, deserialized.is_valid()); 247 248 const uint8_t* p = buf.get(); 249 EXPECT_FALSE(deserialized.Deserialize(&p, p + size)); 250 EXPECT_EQ(AuthorizationSet::MALFORMED_DATA, deserialized.is_valid()); 251 } 252 253 static uint32_t read_uint32(const uint8_t* buf) { 254 uint32_t val; 255 memcpy(&val, buf, sizeof(val)); 256 return val; 257 } 258 259 static void add_to_uint32(uint8_t* buf, int delta) { 260 uint32_t val; 261 memcpy(&val, buf, sizeof(val)); 262 val += delta; 263 memcpy(buf, &val, sizeof(val)); 264 } 265 266 TEST(Deserialization, MalformedIndirectData) { 267 keymaster_key_param_t params[] = { 268 Authorization(TAG_APPLICATION_ID, "my_app", 6), 269 Authorization(TAG_APPLICATION_DATA, "foo", 3), 270 }; 271 AuthorizationSet set(params, array_length(params)); 272 size_t size = set.SerializedSize(); 273 274 UniquePtr<uint8_t[]> buf(new uint8_t[size]); 275 EXPECT_EQ(buf.get() + size, set.Serialize(buf.get(), buf.get() + size)); 276 277 // This sucks. This test, as written, requires intimate knowledge of the serialized layout of 278 // this particular set, which means it's brittle. But it's important to test that we handle 279 // broken serialized data and I can't think of a better way to write this. 280 // 281 // The contents of buf are: 282 // 283 // Bytes: Content: 284 // 0-3 Length of string data, which is 9. 285 // 4-9 "my_app" 286 // 10-12 "foo" 287 // 13-16 Number of elements, which is 2. 288 // 17-20 Length of elements, which is 24. 289 // 21-24 First tag, TAG_APPLICATION_ID 290 // 25-28 Length of string "my_app", 6 291 // 29-32 Offset of string "my_app", 0 292 // 33-36 Second tag, TAG_APPLICATION_DATA 293 // 37-40 Length of string "foo", 3 294 // 41-44 Offset of string "foo", 6 295 296 // Check that stuff is where we think. 297 EXPECT_EQ('m', buf[4]); 298 EXPECT_EQ('f', buf[10]); 299 // Length of "my_app" 300 EXPECT_EQ(6U, read_uint32(buf.get() + 25)); 301 // Offset of "my_app" 302 EXPECT_EQ(0U, read_uint32(buf.get() + 29)); 303 // Length of "foo" 304 EXPECT_EQ(3U, read_uint32(buf.get() + 37)); 305 // Offset of "foo" 306 EXPECT_EQ(6U, read_uint32(buf.get() + 41)); 307 308 // Check that deserialization works. 309 AuthorizationSet deserialized1(buf.get(), size); 310 EXPECT_EQ(AuthorizationSet::OK, deserialized1.is_valid()); 311 312 const uint8_t* p = buf.get(); 313 EXPECT_TRUE(deserialized1.Deserialize(&p, p + size)); 314 EXPECT_EQ(AuthorizationSet::OK, deserialized1.is_valid()); 315 316 // 317 // Now mess them up in various ways: 318 // 319 320 // Move "foo" offset so offset + length goes off the end 321 add_to_uint32(buf.get() + 41, 1); 322 AuthorizationSet deserialized2(buf.get(), size); 323 EXPECT_EQ(AuthorizationSet::MALFORMED_DATA, deserialized2.is_valid()); 324 add_to_uint32(buf.get() + 41, -1); 325 326 // Shorten the "my_app" length to make a gap between the blobs. 327 add_to_uint32(buf.get() + 25, -1); 328 AuthorizationSet deserialized3(buf.get(), size); 329 EXPECT_EQ(AuthorizationSet::MALFORMED_DATA, deserialized3.is_valid()); 330 add_to_uint32(buf.get() + 25, 1); 331 332 // Extend the "my_app" length to make them overlap, and decrease the "foo" length to keep the 333 // total length the same. We don't detect this but should. 334 // TODO(swillden): Detect overlaps and holes that leave total size correct. 335 add_to_uint32(buf.get() + 25, 1); 336 add_to_uint32(buf.get() + 37, -1); 337 AuthorizationSet deserialized4(buf.get(), size); 338 EXPECT_EQ(AuthorizationSet::OK, deserialized4.is_valid()); 339 } 340 341 TEST(Growable, SuccessfulRoundTrip) { 342 keymaster_key_param_t elems_buf[20]; 343 uint8_t data_buf[200]; 344 345 AuthorizationSet growable; 346 EXPECT_TRUE(growable.push_back(Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA))); 347 EXPECT_EQ(1U, growable.size()); 348 349 EXPECT_TRUE(growable.push_back(Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY))); 350 EXPECT_EQ(2U, growable.size()); 351 352 EXPECT_TRUE(growable.push_back(Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN))); 353 EXPECT_EQ(3U, growable.size()); 354 355 EXPECT_TRUE(growable.push_back(Authorization(TAG_APPLICATION_ID, "data", 4))); 356 EXPECT_EQ(4U, growable.size()); 357 358 EXPECT_TRUE(growable.push_back(Authorization(TAG_APPLICATION_DATA, "some more data", 14))); 359 EXPECT_EQ(5U, growable.size()); 360 361 size_t serialize_size = growable.SerializedSize(); 362 UniquePtr<uint8_t[]> serialized(new uint8_t[serialize_size]); 363 EXPECT_EQ(serialized.get() + serialize_size, 364 growable.Serialize(serialized.get(), serialized.get() + serialize_size)); 365 366 AuthorizationSet deserialized(serialized.get(), serialize_size); 367 EXPECT_EQ(growable, deserialized); 368 } 369 370 TEST(Growable, InsufficientElemBuf) { 371 keymaster_key_param_t elems_buf[1]; 372 uint8_t data_buf[200]; 373 374 AuthorizationSet growable; 375 EXPECT_EQ(AuthorizationSet::OK, growable.is_valid()); 376 377 // First insertion fits. 378 EXPECT_TRUE(growable.push_back(Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA))); 379 EXPECT_EQ(1U, growable.size()); 380 EXPECT_EQ(AuthorizationSet::OK, growable.is_valid()); 381 382 // Second does too. 383 EXPECT_TRUE(growable.push_back(Authorization(TAG_RSA_PUBLIC_EXPONENT, 3))); 384 EXPECT_EQ(2U, growable.size()); 385 } 386 387 TEST(Growable, InsufficientIndirectBuf) { 388 keymaster_key_param_t elems_buf[3]; 389 uint8_t data_buf[10]; 390 391 AuthorizationSet growable; 392 EXPECT_EQ(AuthorizationSet::OK, growable.is_valid()); 393 394 EXPECT_TRUE(growable.push_back(Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA))); 395 EXPECT_EQ(1U, growable.size()); 396 EXPECT_EQ(AuthorizationSet::OK, growable.is_valid()); 397 398 EXPECT_TRUE(growable.push_back(Authorization(TAG_APPLICATION_ID, "1234567890", 10))); 399 EXPECT_EQ(2U, growable.size()); 400 EXPECT_EQ(AuthorizationSet::OK, growable.is_valid()); 401 402 EXPECT_TRUE(growable.push_back(Authorization(TAG_APPLICATION_DATA, "1", 1))); 403 EXPECT_EQ(3U, growable.size()); 404 EXPECT_EQ(AuthorizationSet::OK, growable.is_valid()); 405 406 // Can still add another entry without indirect data. Now it's full. 407 EXPECT_TRUE(growable.push_back(Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN))); 408 EXPECT_EQ(4U, growable.size()); 409 EXPECT_EQ(AuthorizationSet::OK, growable.is_valid()); 410 } 411 412 TEST(Growable, PushBackSets) { 413 keymaster_key_param_t params[] = { 414 Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN), 415 Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY), 416 Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA), 417 Authorization(TAG_USER_ID, 7), 418 Authorization(TAG_USER_AUTH_ID, 8), 419 Authorization(TAG_APPLICATION_ID, "my_app", 6), 420 Authorization(TAG_KEY_SIZE, 256), 421 Authorization(TAG_AUTH_TIMEOUT, 300), 422 }; 423 AuthorizationSet set1(params, array_length(params)); 424 AuthorizationSet set2(params, array_length(params)); 425 426 AuthorizationSet combined; 427 EXPECT_TRUE(combined.push_back(set1)); 428 EXPECT_TRUE(combined.push_back(set2)); 429 EXPECT_EQ(array_length(params) * 2, combined.size()); 430 EXPECT_EQ(12U, combined.indirect_size()); 431 } 432 433 TEST(GetValue, GetInt) { 434 keymaster_key_param_t params[] = { 435 Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN), 436 Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY), 437 Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA), 438 Authorization(TAG_USER_ID, 7), 439 Authorization(TAG_USER_AUTH_ID, 8), 440 Authorization(TAG_APPLICATION_ID, "my_app", 6), 441 Authorization(TAG_AUTH_TIMEOUT, 300), 442 }; 443 AuthorizationSet set(params, array_length(params)); 444 445 uint32_t val; 446 EXPECT_TRUE(set.GetTagValue(TAG_USER_ID, &val)); 447 EXPECT_EQ(7U, val); 448 449 // Find one that isn't there 450 EXPECT_FALSE(set.GetTagValue(TAG_KEY_SIZE, &val)); 451 } 452 453 TEST(GetValue, GetIntRep) { 454 keymaster_key_param_t params[] = { 455 Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN), 456 Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY), 457 Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA), 458 Authorization(TAG_USER_ID, 7), 459 Authorization(TAG_USER_AUTH_ID, 8), 460 Authorization(TAG_APPLICATION_ID, "my_app", 6), 461 Authorization(TAG_AUTH_TIMEOUT, 300), 462 }; 463 AuthorizationSet set(params, array_length(params)); 464 465 uint32_t val; 466 EXPECT_TRUE(set.GetTagValue(TAG_USER_AUTH_ID, 0, &val)); 467 EXPECT_EQ(8U, val); 468 469 // Find one that isn't there 470 EXPECT_FALSE(set.GetTagValue(TAG_USER_AUTH_ID, 1, &val)); 471 } 472 473 TEST(GetValue, GetLong) { 474 keymaster_key_param_t params1[] = { 475 Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN), Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY), 476 Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA), 477 keymaster_param_long(TAG_RSA_PUBLIC_EXPONENT, 3), 478 }; 479 AuthorizationSet set1(params1, array_length(params1)); 480 481 keymaster_key_param_t params2[] = { 482 Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN), Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY), 483 Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA), 484 }; 485 AuthorizationSet set2(params2, array_length(params2)); 486 487 uint64_t val; 488 EXPECT_TRUE(set1.GetTagValue(TAG_RSA_PUBLIC_EXPONENT, &val)); 489 EXPECT_EQ(3U, val); 490 491 // Find one that isn't there 492 EXPECT_FALSE(set2.GetTagValue(TAG_RSA_PUBLIC_EXPONENT, &val)); 493 } 494 495 TEST(GetValue, GetEnum) { 496 keymaster_key_param_t params[] = { 497 Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN), 498 Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY), 499 Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA), 500 Authorization(TAG_USER_ID, 7), 501 Authorization(TAG_USER_AUTH_ID, 8), 502 Authorization(TAG_APPLICATION_ID, "my_app", 6), 503 Authorization(TAG_AUTH_TIMEOUT, 300), 504 }; 505 AuthorizationSet set(params, array_length(params)); 506 507 keymaster_algorithm_t val; 508 EXPECT_TRUE(set.GetTagValue(TAG_ALGORITHM, &val)); 509 EXPECT_EQ(KM_ALGORITHM_RSA, val); 510 511 // Find one that isn't there 512 keymaster_padding_t val2; 513 EXPECT_FALSE(set.GetTagValue(TAG_PADDING, &val2)); 514 } 515 516 TEST(GetValue, GetEnumRep) { 517 keymaster_key_param_t params[] = { 518 Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN), 519 Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY), 520 Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA), 521 Authorization(TAG_USER_ID, 7), 522 Authorization(TAG_USER_AUTH_ID, 8), 523 Authorization(TAG_APPLICATION_ID, "my_app", 6), 524 Authorization(TAG_AUTH_TIMEOUT, 300), 525 }; 526 AuthorizationSet set(params, array_length(params)); 527 528 keymaster_purpose_t val; 529 EXPECT_TRUE(set.GetTagValue(TAG_PURPOSE, 0, &val)); 530 EXPECT_EQ(KM_PURPOSE_SIGN, val); 531 EXPECT_TRUE(set.GetTagValue(TAG_PURPOSE, 1, &val)); 532 EXPECT_EQ(KM_PURPOSE_VERIFY, val); 533 534 // Find one that isn't there 535 EXPECT_FALSE(set.GetTagValue(TAG_PURPOSE, 2, &val)); 536 } 537 538 TEST(GetValue, GetDate) { 539 keymaster_key_param_t params[] = { 540 Authorization(TAG_ACTIVE_DATETIME, 10), 541 Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY), 542 Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA), 543 Authorization(TAG_USER_ID, 7), 544 Authorization(TAG_USER_AUTH_ID, 8), 545 Authorization(TAG_APPLICATION_ID, "my_app", 6), 546 Authorization(TAG_AUTH_TIMEOUT, 300), 547 }; 548 AuthorizationSet set(params, array_length(params)); 549 550 uint64_t val; 551 EXPECT_TRUE(set.GetTagValue(TAG_ACTIVE_DATETIME, &val)); 552 EXPECT_EQ(10U, val); 553 554 // Find one that isn't there 555 EXPECT_FALSE(set.GetTagValue(TAG_USAGE_EXPIRE_DATETIME, &val)); 556 } 557 558 TEST(GetValue, GetBlob) { 559 keymaster_key_param_t params[] = { 560 Authorization(TAG_ACTIVE_DATETIME, 10), 561 Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY), 562 Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA), 563 Authorization(TAG_USER_ID, 7), 564 Authorization(TAG_USER_AUTH_ID, 8), 565 Authorization(TAG_APPLICATION_ID, "my_app", 6), 566 Authorization(TAG_AUTH_TIMEOUT, 300), 567 }; 568 AuthorizationSet set(params, array_length(params)); 569 570 keymaster_blob_t val; 571 EXPECT_TRUE(set.GetTagValue(TAG_APPLICATION_ID, &val)); 572 EXPECT_EQ(6U, val.data_length); 573 EXPECT_EQ(0, memcmp(val.data, "my_app", 6)); 574 575 // Find one that isn't there 576 EXPECT_FALSE(set.GetTagValue(TAG_APPLICATION_DATA, &val)); 577 } 578 579 } // namespace test 580 } // namespace keymaster 581