1 /* 2 * Copyright 2016 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 "attestation_record.h" 18 19 #include <assert.h> 20 21 #include <openssl/asn1t.h> 22 23 #include "openssl_err.h" 24 #include "openssl_utils.h" 25 26 #include <keymaster/android_keymaster_utils.h> 27 #include <keymaster/keymaster_context.h> 28 29 namespace keymaster { 30 31 namespace { 32 33 bool Uint64ToBignum(uint64_t value, BIGNUM* bn) { 34 static_assert(sizeof(unsigned long) == sizeof(uint64_t) || 35 sizeof(unsigned long) == sizeof(uint32_t), 36 "Only 32 and 64-bit platforms supported"); 37 38 if (sizeof(unsigned long) == sizeof(uint64_t)) { 39 return BN_set_word(bn, value); 40 } else if (sizeof(unsigned long) == sizeof(uint32_t)) { 41 uint32_t low_order = value & 0xFFFFFFFF; 42 uint32_t high_order = value >> 32; 43 return BN_set_word(bn, high_order) && // 44 BN_lshift(bn, bn, 32) && // 45 BN_add_word(bn, low_order); 46 } else { 47 return false; 48 } 49 } 50 51 } // anonymous namespace 52 53 struct stack_st_ASN1_TYPE_Delete { 54 void operator()(stack_st_ASN1_TYPE* p) { sk_ASN1_TYPE_free(p); } 55 }; 56 57 struct ASN1_STRING_Delete { 58 void operator()(ASN1_STRING* p) { ASN1_STRING_free(p); } 59 }; 60 61 struct ASN1_TYPE_Delete { 62 void operator()(ASN1_TYPE* p) { ASN1_TYPE_free(p); } 63 }; 64 65 #define ASN1_INTEGER_SET STACK_OF(ASN1_INTEGER) 66 67 typedef struct km_root_of_trust { 68 ASN1_OCTET_STRING* verified_boot_key; 69 ASN1_BOOLEAN* device_locked; 70 ASN1_ENUMERATED* verified_boot_state; 71 } KM_ROOT_OF_TRUST; 72 73 ASN1_SEQUENCE(KM_ROOT_OF_TRUST) = { 74 ASN1_SIMPLE(KM_ROOT_OF_TRUST, verified_boot_key, ASN1_OCTET_STRING), 75 ASN1_SIMPLE(KM_ROOT_OF_TRUST, device_locked, ASN1_BOOLEAN), 76 ASN1_SIMPLE(KM_ROOT_OF_TRUST, verified_boot_state, ASN1_ENUMERATED), 77 } ASN1_SEQUENCE_END(KM_ROOT_OF_TRUST); 78 IMPLEMENT_ASN1_FUNCTIONS(KM_ROOT_OF_TRUST); 79 80 typedef struct km_auth_list { 81 ASN1_INTEGER_SET* purpose; 82 ASN1_INTEGER* algorithm; 83 ASN1_INTEGER* key_size; 84 ASN1_INTEGER_SET* digest; 85 ASN1_INTEGER_SET* padding; 86 ASN1_INTEGER_SET* kdf; 87 ASN1_INTEGER* ec_curve; 88 ASN1_INTEGER* rsa_public_exponent; 89 ASN1_INTEGER* active_date_time; 90 ASN1_INTEGER* origination_expire_date_time; 91 ASN1_INTEGER* usage_expire_date_time; 92 ASN1_NULL* no_auth_required; 93 ASN1_INTEGER* user_auth_type; 94 ASN1_INTEGER* auth_timeout; 95 ASN1_NULL* allow_while_on_body; 96 ASN1_NULL* all_applications; 97 ASN1_OCTET_STRING* application_id; 98 ASN1_INTEGER* creation_date_time; 99 ASN1_INTEGER* origin; 100 ASN1_NULL* rollback_resistant; 101 KM_ROOT_OF_TRUST* root_of_trust; 102 ASN1_INTEGER* os_version; 103 ASN1_INTEGER* os_patchlevel; 104 } KM_AUTH_LIST; 105 106 ASN1_SEQUENCE(KM_AUTH_LIST) = { 107 ASN1_EXP_SET_OF_OPT(KM_AUTH_LIST, purpose, ASN1_INTEGER, TAG_PURPOSE.masked_tag()), 108 ASN1_EXP_OPT(KM_AUTH_LIST, algorithm, ASN1_INTEGER, TAG_ALGORITHM.masked_tag()), 109 ASN1_EXP_OPT(KM_AUTH_LIST, key_size, ASN1_INTEGER, TAG_KEY_SIZE.masked_tag()), 110 ASN1_EXP_SET_OF_OPT(KM_AUTH_LIST, digest, ASN1_INTEGER, TAG_DIGEST.masked_tag()), 111 ASN1_EXP_SET_OF_OPT(KM_AUTH_LIST, padding, ASN1_INTEGER, TAG_PADDING.masked_tag()), 112 ASN1_EXP_SET_OF_OPT(KM_AUTH_LIST, kdf, ASN1_INTEGER, TAG_KDF.masked_tag()), 113 ASN1_EXP_OPT(KM_AUTH_LIST, ec_curve, ASN1_INTEGER, TAG_EC_CURVE.masked_tag()), 114 ASN1_EXP_OPT(KM_AUTH_LIST, rsa_public_exponent, ASN1_INTEGER, 115 TAG_RSA_PUBLIC_EXPONENT.masked_tag()), 116 ASN1_EXP_OPT(KM_AUTH_LIST, active_date_time, ASN1_INTEGER, TAG_ACTIVE_DATETIME.masked_tag()), 117 ASN1_EXP_OPT(KM_AUTH_LIST, origination_expire_date_time, ASN1_INTEGER, 118 TAG_ORIGINATION_EXPIRE_DATETIME.masked_tag()), 119 ASN1_EXP_OPT(KM_AUTH_LIST, usage_expire_date_time, ASN1_INTEGER, 120 TAG_USAGE_EXPIRE_DATETIME.masked_tag()), 121 ASN1_EXP_OPT(KM_AUTH_LIST, no_auth_required, ASN1_NULL, TAG_NO_AUTH_REQUIRED.masked_tag()), 122 ASN1_EXP_OPT(KM_AUTH_LIST, user_auth_type, ASN1_INTEGER, TAG_USER_AUTH_TYPE.masked_tag()), 123 ASN1_EXP_OPT(KM_AUTH_LIST, auth_timeout, ASN1_INTEGER, TAG_AUTH_TIMEOUT.masked_tag()), 124 ASN1_EXP_OPT(KM_AUTH_LIST, allow_while_on_body, ASN1_NULL, 125 TAG_ALLOW_WHILE_ON_BODY.masked_tag()), 126 ASN1_EXP_OPT(KM_AUTH_LIST, all_applications, ASN1_NULL, TAG_ALL_APPLICATIONS.masked_tag()), 127 ASN1_EXP_OPT(KM_AUTH_LIST, application_id, ASN1_OCTET_STRING, TAG_APPLICATION_ID.masked_tag()), 128 ASN1_EXP_OPT(KM_AUTH_LIST, creation_date_time, ASN1_INTEGER, 129 TAG_CREATION_DATETIME.masked_tag()), 130 ASN1_EXP_OPT(KM_AUTH_LIST, origin, ASN1_INTEGER, TAG_ORIGIN.masked_tag()), 131 ASN1_EXP_OPT(KM_AUTH_LIST, rollback_resistant, ASN1_NULL, TAG_ROLLBACK_RESISTANT.masked_tag()), 132 ASN1_EXP_OPT(KM_AUTH_LIST, root_of_trust, KM_ROOT_OF_TRUST, TAG_ROOT_OF_TRUST.masked_tag()), 133 ASN1_EXP_OPT(KM_AUTH_LIST, os_version, ASN1_INTEGER, TAG_OS_VERSION.masked_tag()), 134 ASN1_EXP_OPT(KM_AUTH_LIST, os_patchlevel, ASN1_INTEGER, TAG_OS_PATCHLEVEL.masked_tag()), 135 } ASN1_SEQUENCE_END(KM_AUTH_LIST); 136 IMPLEMENT_ASN1_FUNCTIONS(KM_AUTH_LIST); 137 138 typedef struct km_key_description { 139 ASN1_INTEGER* attestation_version; 140 ASN1_ENUMERATED* attestation_security_level; 141 ASN1_INTEGER* keymaster_version; 142 ASN1_ENUMERATED* keymaster_security_level; 143 ASN1_OCTET_STRING* attestation_challenge; 144 KM_AUTH_LIST* software_enforced; 145 KM_AUTH_LIST* tee_enforced; 146 ASN1_INTEGER* unique_id; 147 } KM_KEY_DESCRIPTION; 148 149 ASN1_SEQUENCE(KM_KEY_DESCRIPTION) = { 150 ASN1_SIMPLE(KM_KEY_DESCRIPTION, attestation_version, ASN1_INTEGER), 151 ASN1_SIMPLE(KM_KEY_DESCRIPTION, attestation_security_level, ASN1_ENUMERATED), 152 ASN1_SIMPLE(KM_KEY_DESCRIPTION, keymaster_version, ASN1_INTEGER), 153 ASN1_SIMPLE(KM_KEY_DESCRIPTION, keymaster_security_level, ASN1_ENUMERATED), 154 ASN1_SIMPLE(KM_KEY_DESCRIPTION, attestation_challenge, ASN1_OCTET_STRING), 155 ASN1_SIMPLE(KM_KEY_DESCRIPTION, unique_id, ASN1_OCTET_STRING), 156 ASN1_SIMPLE(KM_KEY_DESCRIPTION, software_enforced, KM_AUTH_LIST), 157 ASN1_SIMPLE(KM_KEY_DESCRIPTION, tee_enforced, KM_AUTH_LIST), 158 } ASN1_SEQUENCE_END(KM_KEY_DESCRIPTION); 159 IMPLEMENT_ASN1_FUNCTIONS(KM_KEY_DESCRIPTION); 160 161 struct KM_AUTH_LIST_Delete { 162 void operator()(KM_AUTH_LIST* p) { KM_AUTH_LIST_free(p); } 163 }; 164 165 struct KM_KEY_DESCRIPTION_Delete { 166 void operator()(KM_KEY_DESCRIPTION* p) { KM_KEY_DESCRIPTION_free(p); } 167 }; 168 169 static uint32_t get_uint32_value(const keymaster_key_param_t& param) { 170 switch (keymaster_tag_get_type(param.tag)) { 171 case KM_ENUM: 172 case KM_ENUM_REP: 173 return param.enumerated; 174 case KM_UINT: 175 case KM_UINT_REP: 176 return param.integer; 177 default: 178 assert(false); 179 return 0xFFFFFFFF; 180 } 181 } 182 183 // Insert value in either the dest_integer or the dest_integer_set, whichever is provided. 184 static keymaster_error_t insert_integer(ASN1_INTEGER* value, ASN1_INTEGER** dest_integer, 185 ASN1_INTEGER_SET** dest_integer_set) { 186 assert((dest_integer == nullptr) ^ (dest_integer_set == nullptr)); 187 assert(value); 188 189 if (dest_integer_set) { 190 if (!*dest_integer_set) 191 *dest_integer_set = sk_ASN1_INTEGER_new_null(); 192 if (!*dest_integer_set) 193 return KM_ERROR_MEMORY_ALLOCATION_FAILED; 194 if (!sk_ASN1_INTEGER_push(*dest_integer_set, value)) 195 return KM_ERROR_MEMORY_ALLOCATION_FAILED; 196 return KM_ERROR_OK; 197 198 } else if (dest_integer) { 199 if (*dest_integer) 200 ASN1_INTEGER_free(*dest_integer); 201 *dest_integer = value; 202 return KM_ERROR_OK; 203 } 204 205 assert(false); // Should never get here. 206 return KM_ERROR_OK; 207 } 208 209 // Put the contents of the keymaster AuthorizationSet auth_list in to the ASN.1 record structure, 210 // record. 211 static keymaster_error_t build_auth_list(const AuthorizationSet& auth_list, KM_AUTH_LIST* record) { 212 assert(record); 213 214 if (auth_list.empty()) 215 return KM_ERROR_OK; 216 217 for (auto entry : auth_list) { 218 219 ASN1_INTEGER_SET** integer_set = nullptr; 220 ASN1_INTEGER** integer_ptr = nullptr; 221 ASN1_OCTET_STRING** string_ptr = nullptr; 222 ASN1_NULL** bool_ptr = nullptr; 223 224 switch (entry.tag) { 225 226 /* Ignored tags */ 227 case KM_TAG_INVALID: 228 case KM_TAG_ASSOCIATED_DATA: 229 case KM_TAG_NONCE: 230 case KM_TAG_AUTH_TOKEN: 231 case KM_TAG_MAC_LENGTH: 232 case KM_TAG_ALL_USERS: 233 case KM_TAG_USER_ID: 234 case KM_TAG_USER_SECURE_ID: 235 case KM_TAG_EXPORTABLE: 236 case KM_TAG_RESET_SINCE_ID_ROTATION: 237 case KM_TAG_ATTESTATION_CHALLENGE: 238 case KM_TAG_BLOCK_MODE: 239 case KM_TAG_CALLER_NONCE: 240 case KM_TAG_MIN_MAC_LENGTH: 241 case KM_TAG_ECIES_SINGLE_HASH_MODE: 242 case KM_TAG_INCLUDE_UNIQUE_ID: 243 case KM_TAG_BLOB_USAGE_REQUIREMENTS: 244 case KM_TAG_BOOTLOADER_ONLY: 245 case KM_TAG_MIN_SECONDS_BETWEEN_OPS: 246 case KM_TAG_MAX_USES_PER_BOOT: 247 case KM_TAG_APPLICATION_DATA: 248 case KM_TAG_UNIQUE_ID: 249 case KM_TAG_ROOT_OF_TRUST: 250 continue; 251 252 /* Non-repeating enumerations */ 253 case KM_TAG_ALGORITHM: 254 integer_ptr = &record->algorithm; 255 break; 256 case KM_TAG_EC_CURVE: 257 integer_ptr = &record->ec_curve; 258 break; 259 case KM_TAG_USER_AUTH_TYPE: 260 integer_ptr = &record->user_auth_type; 261 break; 262 case KM_TAG_ORIGIN: 263 integer_ptr = &record->origin; 264 break; 265 266 /* Repeating enumerations */ 267 case KM_TAG_PURPOSE: 268 integer_set = &record->purpose; 269 break; 270 case KM_TAG_PADDING: 271 integer_set = &record->padding; 272 break; 273 case KM_TAG_DIGEST: 274 integer_set = &record->digest; 275 break; 276 case KM_TAG_KDF: 277 integer_set = &record->kdf; 278 break; 279 280 /* Non-repeating unsigned integers */ 281 case KM_TAG_KEY_SIZE: 282 integer_ptr = &record->key_size; 283 break; 284 case KM_TAG_AUTH_TIMEOUT: 285 integer_ptr = &record->auth_timeout; 286 break; 287 case KM_TAG_OS_VERSION: 288 integer_ptr = &record->os_version; 289 break; 290 case KM_TAG_OS_PATCHLEVEL: 291 integer_ptr = &record->os_patchlevel; 292 break; 293 294 /* Non-repeating long unsigned integers */ 295 case KM_TAG_RSA_PUBLIC_EXPONENT: 296 integer_ptr = &record->rsa_public_exponent; 297 break; 298 299 /* Dates */ 300 case KM_TAG_ACTIVE_DATETIME: 301 integer_ptr = &record->active_date_time; 302 break; 303 case KM_TAG_ORIGINATION_EXPIRE_DATETIME: 304 integer_ptr = &record->origination_expire_date_time; 305 break; 306 case KM_TAG_USAGE_EXPIRE_DATETIME: 307 integer_ptr = &record->usage_expire_date_time; 308 break; 309 case KM_TAG_CREATION_DATETIME: 310 integer_ptr = &record->creation_date_time; 311 break; 312 313 /* Booleans */ 314 case KM_TAG_NO_AUTH_REQUIRED: 315 bool_ptr = &record->no_auth_required; 316 break; 317 case KM_TAG_ALL_APPLICATIONS: 318 bool_ptr = &record->all_applications; 319 break; 320 case KM_TAG_ROLLBACK_RESISTANT: 321 bool_ptr = &record->rollback_resistant; 322 break; 323 case KM_TAG_ALLOW_WHILE_ON_BODY: 324 bool_ptr = &record->allow_while_on_body; 325 break; 326 327 /* Byte arrays*/ 328 case KM_TAG_APPLICATION_ID: 329 string_ptr = &record->application_id; 330 break; 331 } 332 333 keymaster_tag_type_t type = keymaster_tag_get_type(entry.tag); 334 switch (type) { 335 case KM_ENUM: 336 case KM_ENUM_REP: 337 case KM_UINT: 338 case KM_UINT_REP: { 339 assert((keymaster_tag_repeatable(entry.tag) && integer_set) || 340 (!keymaster_tag_repeatable(entry.tag) && integer_ptr)); 341 342 UniquePtr<ASN1_INTEGER, ASN1_INTEGER_Delete> value(ASN1_INTEGER_new()); 343 if (!value.get()) 344 return KM_ERROR_MEMORY_ALLOCATION_FAILED; 345 if (!ASN1_INTEGER_set(value.get(), get_uint32_value(entry))) 346 return TranslateLastOpenSslError(); 347 348 insert_integer(value.release(), integer_ptr, integer_set); 349 break; 350 } 351 352 case KM_ULONG: 353 case KM_ULONG_REP: 354 case KM_DATE: { 355 assert((keymaster_tag_repeatable(entry.tag) && integer_set) || 356 (!keymaster_tag_repeatable(entry.tag) && integer_ptr)); 357 358 UniquePtr<BIGNUM, BIGNUM_Delete> bn_value(BN_new()); 359 if (!bn_value.get()) 360 return KM_ERROR_MEMORY_ALLOCATION_FAILED; 361 362 if (type == KM_DATE) { 363 if (!Uint64ToBignum(entry.date_time, bn_value.get())) { 364 return TranslateLastOpenSslError(); 365 } 366 } else { 367 if (!Uint64ToBignum(entry.long_integer, bn_value.get())) { 368 return TranslateLastOpenSslError(); 369 } 370 } 371 372 UniquePtr<ASN1_INTEGER, ASN1_INTEGER_Delete> value( 373 BN_to_ASN1_INTEGER(bn_value.get(), nullptr)); 374 if (!value.get()) 375 return KM_ERROR_MEMORY_ALLOCATION_FAILED; 376 377 insert_integer(value.release(), integer_ptr, integer_set); 378 break; 379 } 380 381 case KM_BOOL: 382 assert(bool_ptr); 383 if (!*bool_ptr) 384 *bool_ptr = ASN1_NULL_new(); 385 if (!*bool_ptr) 386 return KM_ERROR_MEMORY_ALLOCATION_FAILED; 387 break; 388 389 /* Byte arrays*/ 390 case KM_BYTES: 391 assert(string_ptr); 392 if (!*string_ptr) 393 *string_ptr = ASN1_OCTET_STRING_new(); 394 if (!*string_ptr) 395 return KM_ERROR_MEMORY_ALLOCATION_FAILED; 396 if (!ASN1_OCTET_STRING_set(*string_ptr, entry.blob.data, entry.blob.data_length)) 397 return TranslateLastOpenSslError(); 398 break; 399 400 default: 401 return KM_ERROR_UNIMPLEMENTED; 402 } 403 } 404 405 keymaster_ec_curve_t ec_curve; 406 uint32_t key_size; 407 if (auth_list.Contains(TAG_ALGORITHM, KM_ALGORITHM_EC) && // 408 !auth_list.Contains(TAG_EC_CURVE) && // 409 auth_list.GetTagValue(TAG_KEY_SIZE, &key_size)) { 410 // This must be a keymaster1 key. It's an EC key with no curve. Insert the curve. 411 412 keymaster_error_t error = EcKeySizeToCurve(key_size, &ec_curve); 413 if (error != KM_ERROR_OK) 414 return error; 415 416 UniquePtr<ASN1_INTEGER, ASN1_INTEGER_Delete> value(ASN1_INTEGER_new()); 417 if (!value.get()) 418 return KM_ERROR_MEMORY_ALLOCATION_FAILED; 419 420 if (!ASN1_INTEGER_set(value.get(), ec_curve)) 421 return TranslateLastOpenSslError(); 422 423 insert_integer(value.release(), &record->ec_curve, nullptr); 424 } 425 426 return KM_ERROR_OK; 427 } 428 429 // Construct an ASN1.1 DER-encoded attestation record containing the values from sw_enforced and 430 // tee_enforced. 431 keymaster_error_t build_attestation_record(const AuthorizationSet& attestation_params, 432 const AuthorizationSet& sw_enforced, 433 const AuthorizationSet& tee_enforced, 434 const KeymasterContext& context, 435 UniquePtr<uint8_t[]>* asn1_key_desc, 436 size_t* asn1_key_desc_len) { 437 assert(asn1_key_desc && asn1_key_desc_len); 438 439 UniquePtr<KM_KEY_DESCRIPTION, KM_KEY_DESCRIPTION_Delete> key_desc(KM_KEY_DESCRIPTION_new()); 440 if (!key_desc.get()) 441 return KM_ERROR_MEMORY_ALLOCATION_FAILED; 442 443 keymaster_security_level_t keymaster_security_level; 444 uint32_t keymaster_version = UINT32_MAX; 445 if (tee_enforced.empty()) { 446 // Software key. 447 keymaster_security_level = KM_SECURITY_LEVEL_SOFTWARE; 448 keymaster_version = 2; 449 } else { 450 keymaster_security_level = KM_SECURITY_LEVEL_TRUSTED_ENVIRONMENT; 451 switch (context.GetSecurityLevel()) { 452 case KM_SECURITY_LEVEL_TRUSTED_ENVIRONMENT: 453 // We're running in a TEE, so the key is KM2. 454 keymaster_version = 2; 455 break; 456 457 case KM_SECURITY_LEVEL_SOFTWARE: 458 // We're running in software, wrapping some KM hardware. Is it KM0 or KM1? KM1 keys 459 // have the purpose in the tee_enforced list. It's possible that a key could be created 460 // without a purpose, which would fool this test into reporting it's a KM0 key. That 461 // corner case doesn't matter much, because purpose-less keys are not usable anyway. 462 // Also, KM1 TEEs should disappear rapidly. 463 keymaster_version = tee_enforced.Contains(TAG_PURPOSE) ? 1 : 0; 464 break; 465 } 466 467 if (keymaster_version == UINT32_MAX) 468 return KM_ERROR_UNKNOWN_ERROR; 469 } 470 471 if (!ASN1_INTEGER_set(key_desc->attestation_version, 1) || 472 !ASN1_ENUMERATED_set(key_desc->attestation_security_level, context.GetSecurityLevel()) || 473 !ASN1_INTEGER_set(key_desc->keymaster_version, keymaster_version) || 474 !ASN1_ENUMERATED_set(key_desc->keymaster_security_level, keymaster_security_level)) 475 return TranslateLastOpenSslError(); 476 477 keymaster_blob_t attestation_challenge = {nullptr, 0}; 478 if (!attestation_params.GetTagValue(TAG_ATTESTATION_CHALLENGE, &attestation_challenge)) 479 return KM_ERROR_ATTESTATION_CHALLENGE_MISSING; 480 if (!ASN1_OCTET_STRING_set(key_desc->attestation_challenge, attestation_challenge.data, 481 attestation_challenge.data_length)) 482 return TranslateLastOpenSslError(); 483 484 keymaster_error_t error = build_auth_list(sw_enforced, key_desc->software_enforced); 485 if (error != KM_ERROR_OK) 486 return error; 487 488 error = build_auth_list(tee_enforced, key_desc->tee_enforced); 489 if (error != KM_ERROR_OK) 490 return error; 491 492 // Only check tee_enforced for TAG_INCLUDE_UNIQUE_ID. If we don't have hardware we can't 493 // generate unique IDs. 494 if (tee_enforced.GetTagValue(TAG_INCLUDE_UNIQUE_ID)) { 495 uint64_t creation_datetime; 496 // Only check sw_enforced for TAG_CREATION_DATETIME, since it shouldn't be in tee_enforced, 497 // since this implementation has no secure wall clock. 498 if (!sw_enforced.GetTagValue(TAG_CREATION_DATETIME, &creation_datetime)) { 499 LOG_E("Unique ID cannot be created without creation datetime", 0); 500 return KM_ERROR_INVALID_KEY_BLOB; 501 } 502 503 keymaster_blob_t application_id = {nullptr, 0}; 504 sw_enforced.GetTagValue(TAG_APPLICATION_ID, &application_id); 505 506 Buffer unique_id; 507 error = context.GenerateUniqueId( 508 creation_datetime, application_id, 509 attestation_params.GetTagValue(TAG_RESET_SINCE_ID_ROTATION), &unique_id); 510 if (error != KM_ERROR_OK) 511 return error; 512 513 key_desc->unique_id = ASN1_OCTET_STRING_new(); 514 if (!key_desc->unique_id || 515 !ASN1_OCTET_STRING_set(key_desc->unique_id, unique_id.peek_read(), 516 unique_id.available_read())) 517 return TranslateLastOpenSslError(); 518 } 519 520 int len = i2d_KM_KEY_DESCRIPTION(key_desc.get(), nullptr); 521 if (len < 0) 522 return TranslateLastOpenSslError(); 523 *asn1_key_desc_len = len; 524 asn1_key_desc->reset(new uint8_t[*asn1_key_desc_len]); 525 if (!asn1_key_desc->get()) 526 return KM_ERROR_MEMORY_ALLOCATION_FAILED; 527 uint8_t* p = asn1_key_desc->get(); 528 len = i2d_KM_KEY_DESCRIPTION(key_desc.get(), &p); 529 if (len < 0) 530 return TranslateLastOpenSslError(); 531 532 return KM_ERROR_OK; 533 } 534 535 // Copy all enumerated values with the specified tag from stack to auth_list. 536 static bool get_repeated_enums(const stack_st_ASN1_INTEGER* stack, keymaster_tag_t tag, 537 AuthorizationSet* auth_list) { 538 assert(keymaster_tag_get_type(tag) == KM_ENUM_REP); 539 for (size_t i = 0; i < sk_ASN1_INTEGER_num(stack); ++i) { 540 if (!auth_list->push_back( 541 keymaster_param_enum(tag, ASN1_INTEGER_get(sk_ASN1_INTEGER_value(stack, i))))) 542 return false; 543 } 544 return true; 545 } 546 547 // Add the specified integer tag/value pair to auth_list. 548 template <keymaster_tag_type_t Type, keymaster_tag_t Tag, typename KeymasterEnum> 549 static bool get_enum(const ASN1_INTEGER* asn1_int, TypedEnumTag<Type, Tag, KeymasterEnum> tag, 550 AuthorizationSet* auth_list) { 551 if (!asn1_int) 552 return true; 553 return auth_list->push_back(tag, static_cast<KeymasterEnum>(ASN1_INTEGER_get(asn1_int))); 554 } 555 556 // Add the specified ulong tag/value pair to auth_list. 557 static bool get_ulong(const ASN1_INTEGER* asn1_int, keymaster_tag_t tag, 558 AuthorizationSet* auth_list) { 559 if (!asn1_int) 560 return true; 561 UniquePtr<BIGNUM, BIGNUM_Delete> bn(ASN1_INTEGER_to_BN(asn1_int, nullptr)); 562 if (!bn.get()) 563 return false; 564 uint64_t ulong = BN_get_word(bn.get()); 565 return auth_list->push_back(keymaster_param_long(tag, ulong)); 566 } 567 568 // Extract the values from the specified ASN.1 record and place them in auth_list. 569 static keymaster_error_t extract_auth_list(const KM_AUTH_LIST* record, 570 AuthorizationSet* auth_list) { 571 if (!record) 572 return KM_ERROR_OK; 573 574 // Purpose 575 if (!get_repeated_enums(record->purpose, TAG_PURPOSE, auth_list)) 576 return KM_ERROR_MEMORY_ALLOCATION_FAILED; 577 578 // Algorithm 579 if (!get_enum(record->algorithm, TAG_ALGORITHM, auth_list)) 580 return KM_ERROR_MEMORY_ALLOCATION_FAILED; 581 582 // Key size 583 if (record->key_size && !auth_list->push_back(TAG_KEY_SIZE, ASN1_INTEGER_get(record->key_size))) 584 return KM_ERROR_MEMORY_ALLOCATION_FAILED; 585 586 // Digest 587 if (!get_repeated_enums(record->digest, TAG_DIGEST, auth_list)) 588 return KM_ERROR_MEMORY_ALLOCATION_FAILED; 589 590 // Padding 591 if (!get_repeated_enums(record->padding, TAG_PADDING, auth_list)) 592 return KM_ERROR_MEMORY_ALLOCATION_FAILED; 593 594 // EC curve 595 if (!get_enum(record->ec_curve, TAG_EC_CURVE, auth_list)) 596 return KM_ERROR_MEMORY_ALLOCATION_FAILED; 597 598 // RSA public exponent 599 if (!get_ulong(record->rsa_public_exponent, TAG_RSA_PUBLIC_EXPONENT, auth_list)) 600 return KM_ERROR_MEMORY_ALLOCATION_FAILED; 601 602 // Active date time 603 if (!get_ulong(record->active_date_time, TAG_ACTIVE_DATETIME, auth_list)) 604 return KM_ERROR_MEMORY_ALLOCATION_FAILED; 605 606 // Origination expire date time 607 if (!get_ulong(record->origination_expire_date_time, TAG_ORIGINATION_EXPIRE_DATETIME, 608 auth_list)) 609 return KM_ERROR_MEMORY_ALLOCATION_FAILED; 610 611 // Usage Expire date time 612 if (!get_ulong(record->usage_expire_date_time, TAG_USAGE_EXPIRE_DATETIME, auth_list)) 613 return KM_ERROR_MEMORY_ALLOCATION_FAILED; 614 615 // No auth required 616 if (record->no_auth_required && !auth_list->push_back(TAG_NO_AUTH_REQUIRED)) 617 return KM_ERROR_MEMORY_ALLOCATION_FAILED; 618 619 // User auth type 620 if (!get_enum(record->user_auth_type, TAG_USER_AUTH_TYPE, auth_list)) 621 return KM_ERROR_MEMORY_ALLOCATION_FAILED; 622 623 // Auth timeout 624 if (record->auth_timeout && 625 !auth_list->push_back(TAG_AUTH_TIMEOUT, ASN1_INTEGER_get(record->auth_timeout))) 626 return KM_ERROR_MEMORY_ALLOCATION_FAILED; 627 628 // All applications 629 if (record->all_applications && !auth_list->push_back(TAG_ALL_APPLICATIONS)) 630 return KM_ERROR_MEMORY_ALLOCATION_FAILED; 631 632 // Application ID 633 if (record->application_id && 634 !auth_list->push_back(TAG_APPLICATION_ID, record->application_id->data, 635 record->application_id->length)) 636 return KM_ERROR_MEMORY_ALLOCATION_FAILED; 637 638 // Creation date time 639 if (!get_ulong(record->creation_date_time, TAG_CREATION_DATETIME, auth_list)) 640 return KM_ERROR_MEMORY_ALLOCATION_FAILED; 641 642 // Origin 643 if (!get_enum(record->origin, TAG_ORIGIN, auth_list)) 644 return KM_ERROR_MEMORY_ALLOCATION_FAILED; 645 646 // Rollback resistant 647 if (record->rollback_resistant && !auth_list->push_back(TAG_ROLLBACK_RESISTANT)) 648 return KM_ERROR_MEMORY_ALLOCATION_FAILED; 649 650 // Root of trust 651 if (record->root_of_trust) { 652 KM_ROOT_OF_TRUST* rot = record->root_of_trust; 653 if (!rot->verified_boot_key) 654 return KM_ERROR_INVALID_KEY_BLOB; 655 656 // Other root of trust fields are not mapped to auth set entries. 657 } 658 659 // OS Version 660 if (record->os_version && 661 !auth_list->push_back(TAG_OS_VERSION, ASN1_INTEGER_get(record->os_version))) 662 return KM_ERROR_MEMORY_ALLOCATION_FAILED; 663 664 // OS Patch level 665 if (record->os_patchlevel && 666 !auth_list->push_back(TAG_OS_PATCHLEVEL, ASN1_INTEGER_get(record->os_patchlevel))) 667 return KM_ERROR_MEMORY_ALLOCATION_FAILED; 668 669 return KM_ERROR_OK; 670 } 671 672 // Parse the DER-encoded attestation record, placing the results in keymaster_version, 673 // attestation_challenge, software_enforced, tee_enforced and unique_id. 674 keymaster_error_t parse_attestation_record(const uint8_t* asn1_key_desc, size_t asn1_key_desc_len, 675 uint32_t* attestation_version, // 676 keymaster_security_level_t* attestation_security_level, 677 uint32_t* keymaster_version, 678 keymaster_security_level_t* keymaster_security_level, 679 keymaster_blob_t* attestation_challenge, 680 AuthorizationSet* software_enforced, 681 AuthorizationSet* tee_enforced, 682 keymaster_blob_t* unique_id) { 683 const uint8_t* p = asn1_key_desc; 684 UniquePtr<KM_KEY_DESCRIPTION, KM_KEY_DESCRIPTION_Delete> record( 685 d2i_KM_KEY_DESCRIPTION(nullptr, &p, asn1_key_desc_len)); 686 if (!record.get()) 687 return TranslateLastOpenSslError(); 688 689 *attestation_version = ASN1_INTEGER_get(record->attestation_version); 690 *attestation_security_level = static_cast<keymaster_security_level_t>( 691 ASN1_ENUMERATED_get(record->attestation_security_level)); 692 *keymaster_version = ASN1_INTEGER_get(record->keymaster_version); 693 *keymaster_security_level = static_cast<keymaster_security_level_t>( 694 ASN1_ENUMERATED_get(record->keymaster_security_level)); 695 696 attestation_challenge->data = 697 dup_buffer(record->attestation_challenge->data, record->attestation_challenge->length); 698 attestation_challenge->data_length = record->attestation_challenge->length; 699 700 unique_id->data = dup_buffer(record->unique_id->data, record->unique_id->length); 701 unique_id->data_length = record->unique_id->length; 702 703 keymaster_error_t error = extract_auth_list(record->software_enforced, software_enforced); 704 if (error != KM_ERROR_OK) 705 return error; 706 707 return extract_auth_list(record->tee_enforced, tee_enforced); 708 } 709 710 } // namepace keymaster 711