Support 2nd IMEI and bump KeyMint version to 3

Part of the changes to include the 2nd IMEI in the attestation record.

Bug: 244732345
Test: atest android.keystore.cts.DeviceOwnerKeyManagementTest
Change-Id: I2f455dd54e9aa017a741656482dd89059de15a91
diff --git a/android_keymaster/keymaster_enforcement.cpp b/android_keymaster/keymaster_enforcement.cpp
index de768cb..5c3bf01 100644
--- a/android_keymaster/keymaster_enforcement.cpp
+++ b/android_keymaster/keymaster_enforcement.cpp
@@ -313,6 +313,7 @@
         case KM_TAG_ATTESTATION_ID_PRODUCT:
         case KM_TAG_ATTESTATION_ID_SERIAL:
         case KM_TAG_ATTESTATION_ID_IMEI:
+        case KM_TAG_ATTESTATION_ID_SECOND_IMEI:
         case KM_TAG_ATTESTATION_ID_MEID:
         case KM_TAG_ATTESTATION_ID_MANUFACTURER:
         case KM_TAG_ATTESTATION_ID_MODEL:
diff --git a/android_keymaster/keymaster_tags.cpp b/android_keymaster/keymaster_tags.cpp
index dc42061..f1aafea 100644
--- a/android_keymaster/keymaster_tags.cpp
+++ b/android_keymaster/keymaster_tags.cpp
@@ -131,6 +131,8 @@
         return "KM_TAG_ATTESTATION_ID_SERIAL";
     case KM_TAG_ATTESTATION_ID_IMEI:
         return "KM_TAG_ATTESTATION_ID_IMEI";
+    case KM_TAG_ATTESTATION_ID_SECOND_IMEI:
+        return "KM_TAG_ATTESTATION_ID_SECOND_IMEI";
     case KM_TAG_ATTESTATION_ID_MEID:
         return "KM_TAG_ATTESTATION_ID_MEID";
     case KM_TAG_ATTESTATION_ID_MANUFACTURER:
@@ -214,6 +216,7 @@
 DEFINE_KEYMASTER_TAG(KM_BYTES, TAG_ATTESTATION_ID_PRODUCT);
 DEFINE_KEYMASTER_TAG(KM_BYTES, TAG_ATTESTATION_ID_SERIAL);
 DEFINE_KEYMASTER_TAG(KM_BYTES, TAG_ATTESTATION_ID_IMEI);
+DEFINE_KEYMASTER_TAG(KM_BYTES, TAG_ATTESTATION_ID_SECOND_IMEI);
 DEFINE_KEYMASTER_TAG(KM_BYTES, TAG_ATTESTATION_ID_MEID);
 DEFINE_KEYMASTER_TAG(KM_BYTES, TAG_ATTESTATION_ID_MANUFACTURER);
 DEFINE_KEYMASTER_TAG(KM_BYTES, TAG_ATTESTATION_ID_MODEL);
diff --git a/include/keymaster/android_keymaster_messages.h b/include/keymaster/android_keymaster_messages.h
index 0e594d0..a576af8 100644
--- a/include/keymaster/android_keymaster_messages.h
+++ b/include/keymaster/android_keymaster_messages.h
@@ -135,6 +135,7 @@
         return 3;
     case KmVersion::KEYMINT_1:
     case KmVersion::KEYMINT_2:
+    case KmVersion::KEYMINT_3:
         return 4;
     }
     return kInvalidMessageVersion;
diff --git a/include/keymaster/keymaster_tags.h b/include/keymaster/keymaster_tags.h
index f620dfb..e8188e8 100644
--- a/include/keymaster/keymaster_tags.h
+++ b/include/keymaster/keymaster_tags.h
@@ -180,6 +180,7 @@
 DECLARE_KEYMASTER_TAG(KM_BYTES, TAG_ATTESTATION_ID_PRODUCT);
 DECLARE_KEYMASTER_TAG(KM_BYTES, TAG_ATTESTATION_ID_SERIAL);
 DECLARE_KEYMASTER_TAG(KM_BYTES, TAG_ATTESTATION_ID_IMEI);
+DECLARE_KEYMASTER_TAG(KM_BYTES, TAG_ATTESTATION_ID_SECOND_IMEI);
 DECLARE_KEYMASTER_TAG(KM_BYTES, TAG_ATTESTATION_ID_MEID);
 DECLARE_KEYMASTER_TAG(KM_BYTES, TAG_ATTESTATION_ID_MANUFACTURER);
 DECLARE_KEYMASTER_TAG(KM_BYTES, TAG_ATTESTATION_ID_MODEL);
diff --git a/include/keymaster/km_openssl/attestation_record.h b/include/keymaster/km_openssl/attestation_record.h
index f9ab811..a224246 100644
--- a/include/keymaster/km_openssl/attestation_record.h
+++ b/include/keymaster/km_openssl/attestation_record.h
@@ -121,6 +121,7 @@
     ASN1_INTEGER* boot_patch_level;
     ASN1_NULL* device_unique_attestation;
     ASN1_NULL* identity_credential_key;
+    ASN1_OCTET_STRING* attestation_id_second_imei;
 } KM_AUTH_LIST;
 
 ASN1_SEQUENCE(KM_AUTH_LIST) = {
@@ -191,6 +192,8 @@
                  TAG_DEVICE_UNIQUE_ATTESTATION.masked_tag()),
     ASN1_EXP_OPT(KM_AUTH_LIST, identity_credential_key, ASN1_NULL,
                  TAG_IDENTITY_CREDENTIAL_KEY.masked_tag()),
+    ASN1_EXP_OPT(KM_AUTH_LIST, attestation_id_second_imei, ASN1_OCTET_STRING,
+                 TAG_ATTESTATION_ID_SECOND_IMEI.masked_tag()),
 } ASN1_SEQUENCE_END(KM_AUTH_LIST);
 DECLARE_ASN1_FUNCTIONS(KM_AUTH_LIST);
 
@@ -418,6 +421,8 @@
         return 100;
     case KmVersion::KEYMINT_2:
         return 200;
+    case KmVersion::KEYMINT_3:
+        return 300;
     }
 }
 
@@ -441,6 +446,8 @@
         return 100;
     case KmVersion::KEYMINT_2:
         return 200;
+    case KmVersion::KEYMINT_3:
+        return 300;
     }
 }
 
diff --git a/include/keymaster/km_version.h b/include/keymaster/km_version.h
index 122d045..6287aa3 100644
--- a/include/keymaster/km_version.h
+++ b/include/keymaster/km_version.h
@@ -32,6 +32,7 @@
     KEYMASTER_4_1 = 41,
     KEYMINT_1 = 100,
     KEYMINT_2 = 200,
+    KEYMINT_3 = 300,
 };
 
 };  // namespace keymaster
diff --git a/key_blob_utils/software_keyblobs.cpp b/key_blob_utils/software_keyblobs.cpp
index 8266326..056068c 100644
--- a/key_blob_utils/software_keyblobs.cpp
+++ b/key_blob_utils/software_keyblobs.cpp
@@ -318,6 +318,7 @@
         case KM_TAG_ATTESTATION_ID_BRAND:
         case KM_TAG_ATTESTATION_ID_DEVICE:
         case KM_TAG_ATTESTATION_ID_IMEI:
+        case KM_TAG_ATTESTATION_ID_SECOND_IMEI:
         case KM_TAG_ATTESTATION_ID_MANUFACTURER:
         case KM_TAG_ATTESTATION_ID_MEID:
         case KM_TAG_ATTESTATION_ID_MODEL:
diff --git a/km_openssl/attestation_record.cpp b/km_openssl/attestation_record.cpp
index f413064..33d74fa 100644
--- a/km_openssl/attestation_record.cpp
+++ b/km_openssl/attestation_record.cpp
@@ -47,10 +47,11 @@
 IMPLEMENT_ASN1_FUNCTIONS(KM_KEY_DESCRIPTION);
 
 static const keymaster_tag_t kDeviceAttestationTags[] = {
-    KM_TAG_ATTESTATION_ID_BRAND,        KM_TAG_ATTESTATION_ID_DEVICE, KM_TAG_ATTESTATION_ID_PRODUCT,
-    KM_TAG_ATTESTATION_ID_SERIAL,       KM_TAG_ATTESTATION_ID_IMEI,   KM_TAG_ATTESTATION_ID_MEID,
+    KM_TAG_ATTESTATION_ID_BRAND,        KM_TAG_ATTESTATION_ID_DEVICE,
+    KM_TAG_ATTESTATION_ID_PRODUCT,      KM_TAG_ATTESTATION_ID_SERIAL,
+    KM_TAG_ATTESTATION_ID_IMEI,         KM_TAG_ATTESTATION_ID_MEID,
     KM_TAG_ATTESTATION_ID_MANUFACTURER, KM_TAG_ATTESTATION_ID_MODEL,
-};
+    KM_TAG_ATTESTATION_ID_SECOND_IMEI};
 
 struct KM_AUTH_LIST_Delete {
     void operator()(KM_AUTH_LIST* p) { KM_AUTH_LIST_free(p); }
@@ -679,6 +680,9 @@
         case KM_TAG_ATTESTATION_ID_IMEI:
             string_ptr = &record->attestation_id_imei;
             break;
+        case KM_TAG_ATTESTATION_ID_SECOND_IMEI:
+            string_ptr = &record->attestation_id_second_imei;
+            break;
         case KM_TAG_ATTESTATION_ID_MEID:
             string_ptr = &record->attestation_id_meid;
             break;
@@ -1388,6 +1392,14 @@
         return KM_ERROR_MEMORY_ALLOCATION_FAILED;
     }
 
+    // Second IMEI
+    if (record->attestation_id_second_imei &&
+        !auth_list->push_back(TAG_ATTESTATION_ID_SECOND_IMEI,
+                              record->attestation_id_second_imei->data,
+                              record->attestation_id_second_imei->length)) {
+        return KM_ERROR_MEMORY_ALLOCATION_FAILED;
+    }
+
     return KM_ERROR_OK;
 }
 
diff --git a/ng/AndroidKeyMintDevice.cpp b/ng/AndroidKeyMintDevice.cpp
index 25ad463..fb7b632 100644
--- a/ng/AndroidKeyMintDevice.cpp
+++ b/ng/AndroidKeyMintDevice.cpp
@@ -108,6 +108,7 @@
         case KM_TAG_ATTESTATION_ID_BRAND:
         case KM_TAG_ATTESTATION_ID_DEVICE:
         case KM_TAG_ATTESTATION_ID_IMEI:
+        case KM_TAG_ATTESTATION_ID_SECOND_IMEI:
         case KM_TAG_ATTESTATION_ID_MANUFACTURER:
         case KM_TAG_ATTESTATION_ID_MEID:
         case KM_TAG_ATTESTATION_ID_MODEL:
@@ -213,10 +214,10 @@
 constexpr size_t kOperationTableSize = 16;
 
 AndroidKeyMintDevice::AndroidKeyMintDevice(SecurityLevel securityLevel)
-    : impl_(new (std::nothrow)::keymaster::AndroidKeymaster(
+    : impl_(new(std::nothrow)::keymaster::AndroidKeymaster(
           [&]() -> auto{
               auto context = new (std::nothrow) PureSoftKeymasterContext(
-                  KmVersion::KEYMINT_2, static_cast<keymaster_security_level_t>(securityLevel));
+                  KmVersion::KEYMINT_3, static_cast<keymaster_security_level_t>(securityLevel));
               context->SetSystemVersion(::keymaster::GetOsVersion(),
                                         ::keymaster::GetOsPatchlevel());
               context->SetVendorPatchlevel(::keymaster::GetVendorPatchlevel());
@@ -241,7 +242,7 @@
 AndroidKeyMintDevice::~AndroidKeyMintDevice() {}
 
 ScopedAStatus AndroidKeyMintDevice::getHardwareInfo(KeyMintHardwareInfo* info) {
-    info->versionNumber = 2;
+    info->versionNumber = 3;
     info->securityLevel = securityLevel_;
     info->keyMintName = "FakeKeyMintDevice";
     info->keyMintAuthorName = "Google";