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