キー構成証明を使用してハードウェア格納型キーペアを検証する

キー構成証明を活用すると、デバイスのハードウェア格納型キーストア内に、アプリで使用するキーが格納されるため、信頼性が向上します。以下のセクションでは、ハードウェア格納型キーのプロパティを検証する方法と、構成証明書の拡張機能データのスキーマを解釈する方法について説明します。

注: 実稼働レベルの環境でデバイスのハードウェア格納型キーのプロパティを検証する前に、デバイスがハードウェア レベルのキー構成証明をサポートしているか確認する必要があります。そのためには、Google 構成証明ルートキーによって署名されたルート証明書が構成証明書チェーン内に含まれているか、キー説明データ構造内の attestationSecurityLevel 要素が TrustedEnvironment セキュリティ レベルに設定されているか確認する必要があります。

また、証明書チェーン内の署名を検証し、証明書失効ステータス リストをチェックすることで、チェーン内のどのキーも失効していないことを確認することが必要です。すべてが有効な状態で、かつ、ルートが上記の Google ルートキーでない限り、構成証明を全面的に信頼しないようにしてください。ただし、失効済み証明書を含むデバイスであっても、少なくとも、ソフトウェア構成証明だけをサポートしているデバイスと同程度には信頼性があります。完全に有効な構成証明を持つことは、大きなプラスの指標です。持っていないということは、中立的な指標であり、マイナスの指標ではありません。

ハードウェア格納型キーペアを取得して検証する

キーの構成証明中に、キーペアのエイリアスを指定します。そうすると、構成証明ツールによって証明書チェーンが提供されます。この証明書チェーンを使用して、キーペアのプロパティを検証できます。

デバイスがハードウェア レベルのキー構成証明をサポートしている場合、構成証明ルートキーを使用して、このチェーン内のルート証明書が署名されます。このルートキーは、デバイス メーカーが出荷前にデバイスのハードウェア格納型キーストアに挿入しています。

注: 出荷段階でハードウェア レベルのキー構成証明、Android 7.0(API レベル 24)以降、および Google Play 開発者サービスが搭載されていたデバイスの場合、ルート証明書は Google 構成証明ルートキーによって署名されます。このルート証明書が下記に掲載したものと一致するか検証する必要があります。

キー構成証明を実装する手順は次のとおりです。

  1. KeyStore オブジェクトの getCertificateChain() メソッドを使用して、ハードウェア格納型キーストアに関連付けられた X.509 証明書のチェーンへの参照を取得します。
  2. X509Certificate オブジェクトの checkValidity() メソッドを使用して、各証明書の有効性をチェックします。また、ルート証明書が信頼できるものであるのか検証します。

    注: アプリ内でこのプロセスを直接完了することもできますが、信頼できる別のサーバー上で証明書失効ステータスをチェックする方が安全です。

  3. 信頼できる別サーバー上で、ツールセットに最も適した ASN.1 パーサー ライブラリへの参照を取得します。このパーサーを使用して、証明書チェーンの最初の要素内にある構成証明書拡張機能データを抽出します。

    こちらのキー構成証明サンプルでは、Bouncy Castle の ASN.1 パーサーを使用して、構成証明書の拡張機能データを抽出しています。このサンプルは、独自のパーサーを作成する際のリファレンスとして利用できます。

    拡張機能データのスキーマについては、証明書の拡張機能データのスキーマをご覧ください。

  4. ASN.1 パーサーから取得した拡張機能データと、ハードウェア格納型キーに含まれると想定される値のセットを比較します。

    注: アプリ内でこのプロセスを直接完了することもできますが、信頼できる別のサーバー上で証明書の拡張機能データをチェックする方が安全です。

ルート証明書

構成証明の信頼性は、チェーンのルート証明書によって決まります。Google Play などの各種 Google アプリを利用するうえで必要とされるテストに合格し、Android 7.0(API レベル 24)以降を搭載している Android デバイスの場合は、Google Hardware Attestation Root 証明書で署名された構成証明キーを使用している必要があります。この証明書は次のとおりです。

      -----BEGIN CERTIFICATE-----
      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
      -----END CERTIFICATE-----
    

受け取った構成証明チェーンのルート証明書が上記の証明書であり、チェーン内のどの証明書も失効していない場合は、以下のことが判明します。

  1. あなたのキーは、Google がセキュアだと考えているハードウェア内にあります。
  2. そのキーには、構成証明書に記載されているプロパティがあります。

構成証明チェーンが別のルート証明書を持っていた場合、Google は、そのハードウェアのセキュリティについて何も主張しません。これは、「あなたのキーにセキュリティ上の問題がある」という意味ではなく、「その構成証明では、キーがセキュリティ ハードウェア内にあることが証明されない」ということを意味しています。これに応じて、セキュリティの想定を調整する必要があります。

ルート証明書が上記以外の場合、2 つの理由が考えられます。

  • よくある理由として、デバイスが Android 7.0 より前のバージョンを搭載していて、ハードウェア構成証明をサポートしていない可能性があります。この場合、Android は、同じタイプの構成証明書を生成する構成証明をソフトウェア レベルで実装していますが、この構成証明書は Android ソースコード内にハードコーディングされたキーで署名されています。この署名キーはシークレットではないため、この構成証明は、セキュア ハードウェアを提供するふりをした攻撃者によって作成されたものである可能性があります。
  • ほかに考えられる理由として、デバイスが Google Play デバイスではない可能性があります。その場合、デバイス メーカーは、独自のルートを自由に作成し、構成証明の意味する内容についても自由に主張することができます。デバイス メーカーのマニュアルをご覧ください。なお、この記事の執筆時点において、このような設定を行っているデバイス メーカーは、Google が知る範囲では存在しません。

証明書失効ステータス リスト

構成証明キーは、誤操作や攻撃者による抽出の疑いなど、さまざまな理由で失効することがあります。そのため、構成証明チェーン内の各証明書のステータスを、公式の証明書失効ステータス リストと照合する必要があります。このリストは Google によって管理され、https://android.googleapis.com/attestation/status で公開されています。この URL は、通常の有効なステータスを持たない証明書の失効ステータスを格納する JSON ファイルを返します。JSON ファイルの形式は、次の JSON スキーマ(Draft 07)定義に準拠しています。

{
      "$schema": "http://json-schema.org/draft-07/schema#",
      "type": "object",
      "properties": {
        "entries": {
          "description" : "Each entry represents the status of an attestation key. The dictionary-key is the certificate serial number in lowercase hex.",
          "type": "object",
          "propertyNames": {
             "pattern": "^[a-f0-9]*$"
          },
          "additionalProperties": {
            "type": "object",
            "properties": {
              "status": {
                "description": "[REQUIRED] Current status of the key.",
                "type": "string",
                "enum": ["REVOKED", "SUSPENDED"]
              },
              "expires": {
                "description": "[OPTIONAL] UTC date when certificate expires in ISO8601 format (YYYY-MM-DD). Can be used to clear expired certificates from the status list.",
                "type": "string",
                "format": "date"
              },
              "reason": {
                "description": "[OPTIONAL] Reason for the current status.",
                "type": "string",
                "enum": ["UNSPECIFIED", "KEY_COMPROMISE", "CA_COMPROMISE", "SUPERSEDED", "SOFTWARE_FLAW"]
              },
              "comment": {
                "description": "[OPTIONAL] Free form comment about the key status.",
                "type": "string",
                "maxLength": 140
              }
            },
            "required": ["status"],
            "additionalProperties": false
          }
        }
      },
      "required": ["entries"],
      "additionalProperties": false
    }

証明書失効ステータス リストの例は次のとおりです。

{
      "entries": {
        "2c8cdddfd5e03bfc": {
          "status": "REVOKED",
          "expires": "2020-11-13",
          "reason": "KEY_COMPROMISE",
          "comment": "Key stored on unsecure system"
        },
        "c8966fcb2fbb0d7a": {
          "status": "SUSPENDED",
          "reason": "SOFTWARE_FLAW",
          "comment": "Bug in keystore causes this key malfunction b/555555"
        }
      }
    }
    

従来型の CRL

従来型の構成証明書に埋め込まれている CRL URL は引き続き利用可能です。新しい構成証明書には、CRL URL 拡張機能が含まれていません。従来型の構成証明書のステータスも構成証明ステータス リストに含まれているため、デベロッパーは、新しい証明書と従来型の証明書の両方に対して構成証明ステータス リストを使用するよう安全に切り替えることができます。Android 構成証明キーを正しく検証する方法の例については、キー構成証明サンプルをご覧ください。

証明書の拡張機能データのスキーマ

キー構成証明は、デバイスのハードウェア格納型キーストアのチェーン内にある最初の証明書に表示される拡張機能データを検証します。証明書は、ASN.1 スキーマに沿って情報を格納しています。使用している構成証明バージョンに対応するスキーマを表示するには、以下のスキーマリストで、対応するタブを選択してください。

バージョン 3

    KeyDescription ::= SEQUENCE {
        attestationVersion  3,
        attestationSecurityLevel  SecurityLevel,
        keymasterVersion  INTEGER,
        keymasterSecurityLevel  SecurityLevel,
        attestationChallenge  OCTET_STRING,
        uniqueId  OCTET_STRING,
        softwareEnforced  AuthorizationList,
        teeEnforced  AuthorizationList,
    }

    SecurityLevel ::= ENUMERATED {
        Software  (0),
        TrustedEnvironment  (1),
        StrongBox  (2),
    }

    AuthorizationList ::= SEQUENCE {
        purpose  [1] EXPLICIT SET OF INTEGER OPTIONAL,
        algorithm  [2] EXPLICIT INTEGER OPTIONAL,
        keySize  [3] EXPLICIT INTEGER OPTIONAL,
        digest  [5] EXPLICIT SET OF INTEGER OPTIONAL,
        padding  [6] EXPLICIT SET OF INTEGER OPTIONAL,
        ecCurve  [10] EXPLICIT INTEGER OPTIONAL,
        rsaPublicExponent  [200] EXPLICIT INTEGER OPTIONAL,
        rollbackResistance  [303] EXPLICIT NULL OPTIONAL,
        activeDateTime  [400] EXPLICIT INTEGER OPTIONAL,
        originationExpireDateTime  [401] EXPLICIT INTEGER OPTIONAL,
        usageExpireDateTime  [402] EXPLICIT INTEGER OPTIONAL,
        noAuthRequired  [503] EXPLICIT NULL OPTIONAL,
        userAuthType  [504] EXPLICIT INTEGER OPTIONAL,
        authTimeout  [505] EXPLICIT INTEGER OPTIONAL,
        allowWhileOnBody  [506] EXPLICIT NULL OPTIONAL,
        trustedUserPresenceRequired  [507] EXPLICIT NULL OPTIONAL,
        trustedConfirmationRequired  [508] EXPLICIT NULL OPTIONAL,
        unlockedDeviceRequired  [509] EXPLICIT NULL OPTIONAL,
        allApplications  [600] EXPLICIT NULL OPTIONAL,
        applicationId  [601] EXPLICIT OCTET_STRING OPTIONAL,
        creationDateTime  [701] EXPLICIT INTEGER OPTIONAL,
        origin  [702] EXPLICIT INTEGER OPTIONAL,
        rootOfTrust  [704] EXPLICIT RootOfTrust OPTIONAL,
        osVersion  [705] EXPLICIT INTEGER OPTIONAL,
        osPatchLevel  [706] EXPLICIT INTEGER OPTIONAL,
        attestationApplicationId  [709] EXPLICIT OCTET_STRING OPTIONAL,
        attestationIdBrand  [710] EXPLICIT OCTET_STRING OPTIONAL,
        attestationIdDevice  [711] EXPLICIT OCTET_STRING OPTIONAL,
        attestationIdProduct  [712] EXPLICIT OCTET_STRING OPTIONAL,
        attestationIdSerial  [713] EXPLICIT OCTET_STRING OPTIONAL,
        attestationIdImei  [714] EXPLICIT OCTET_STRING OPTIONAL,
        attestationIdMeid  [715] EXPLICIT OCTET_STRING OPTIONAL,
        attestationIdManufacturer  [716] EXPLICIT OCTET_STRING OPTIONAL,
        attestationIdModel  [717] EXPLICIT OCTET_STRING OPTIONAL,
        vendorPatchLevel  [718] EXPLICIT INTEGER OPTIONAL,
        bootPatchLevel  [719] EXPLICIT INTEGER OPTIONAL,
    }

    RootOfTrust ::= SEQUENCE {
        verifiedBootKey  OCTET_STRING,
        deviceLocked  BOOLEAN,
        verifiedBootState  VerifiedBootState,
        verifiedBootHash OCTET_STRING,
    }

    VerifiedBootState ::= ENUMERATED {
        Verified  (0),
        SelfSigned  (1),
        Unverified  (2),
        Failed  (3),
    }
    

バージョン 2

    KeyDescription ::= SEQUENCE {
        attestationVersion  2,
        attestationSecurityLevel  SecurityLevel,
        keymasterVersion  INTEGER,
        keymasterSecurityLevel  SecurityLevel,
        attestationChallenge  OCTET_STRING,
        uniqueId  OCTET_STRING,
        softwareEnforced  AuthorizationList,
        teeEnforced  AuthorizationList,
    }

    SecurityLevel ::= ENUMERATED {
        Software  (0),
        TrustedEnvironment  (1),
    }

    AuthorizationList ::= SEQUENCE {
        purpose  [1] EXPLICIT SET OF INTEGER OPTIONAL,
        algorithm  [2] EXPLICIT INTEGER OPTIONAL,
        keySize  [3] EXPLICIT INTEGER OPTIONAL,
        digest  [5] EXPLICIT SET OF INTEGER OPTIONAL,
        padding  [6] EXPLICIT SET OF INTEGER OPTIONAL,
        ecCurve  [10] EXPLICIT INTEGER OPTIONAL,
        rsaPublicExponent  [200] EXPLICIT INTEGER OPTIONAL,
        activeDateTime  [400] EXPLICIT INTEGER OPTIONAL,
        originationExpireDateTime  [401] EXPLICIT INTEGER OPTIONAL,
        usageExpireDateTime  [402] EXPLICIT INTEGER OPTIONAL,
        noAuthRequired  [503] EXPLICIT NULL OPTIONAL,
        userAuthType  [504] EXPLICIT INTEGER OPTIONAL,
        authTimeout  [505] EXPLICIT INTEGER OPTIONAL,
        allowWhileOnBody  [506] EXPLICIT NULL OPTIONAL,
        allApplications  [600] EXPLICIT NULL OPTIONAL,
        applicationId  [601] EXPLICIT OCTET_STRING OPTIONAL,
        creationDateTime  [701] EXPLICIT INTEGER OPTIONAL,
        origin  [702] EXPLICIT INTEGER OPTIONAL,
        rollbackResistant  [703] EXPLICIT NULL OPTIONAL,
        rootOfTrust  [704] EXPLICIT RootOfTrust OPTIONAL,
        osVersion  [705] EXPLICIT INTEGER OPTIONAL,
        osPatchLevel  [706] EXPLICIT INTEGER OPTIONAL,
        attestationApplicationId  [709] EXPLICIT OCTET_STRING OPTIONAL,
        attestationIdBrand  [710] EXPLICIT OCTET_STRING OPTIONAL,
        attestationIdDevice  [711] EXPLICIT OCTET_STRING OPTIONAL,
        attestationIdProduct  [712] EXPLICIT OCTET_STRING OPTIONAL,
        attestationIdSerial  [713] EXPLICIT OCTET_STRING OPTIONAL,
        attestationIdImei  [714] EXPLICIT OCTET_STRING OPTIONAL,
        attestationIdMeid  [715] EXPLICIT OCTET_STRING OPTIONAL,
        attestationIdManufacturer  [716] EXPLICIT OCTET_STRING OPTIONAL,
        attestationIdModel  [717] EXPLICIT OCTET_STRING OPTIONAL,
    }

    RootOfTrust ::= SEQUENCE {
        verifiedBootKey  OCTET_STRING,
        deviceLocked  BOOLEAN,
        verifiedBootState  VerifiedBootState,
    }

    VerifiedBootState ::= ENUMERATED {
        Verified  (0),
        SelfSigned  (1),
        Unverified  (2),
        Failed  (3),
    }
    

バージョン 1

    KeyDescription ::= SEQUENCE {
        attestationVersion  1,
        attestationSecurityLevel  SecurityLevel,
        keymasterVersion  INTEGER,
        keymasterSecurityLevel  SecurityLevel,
        attestationChallenge  OCTET_STRING,
        uniqueId  OCTET_STRING,
        softwareEnforced  AuthorizationList,
        teeEnforced  AuthorizationList,
    }

    SecurityLevel ::= ENUMERATED {
        Software  (0),
        TrustedEnvironment  (1),
    }

    AuthorizationList ::= SEQUENCE {
        purpose  [1] EXPLICIT SET OF INTEGER OPTIONAL,
        algorithm  [2] EXPLICIT INTEGER OPTIONAL,
        keySize  [3] EXPLICIT INTEGER OPTIONAL,
        digest  [5] EXPLICIT SET OF INTEGER OPTIONAL,
        padding  [6] EXPLICIT SET OF INTEGER OPTIONAL,
        ecCurve  [10] EXPLICIT INTEGER OPTIONAL,
        rsaPublicExponent  [200] EXPLICIT INTEGER OPTIONAL,
        activeDateTime  [400] EXPLICIT INTEGER OPTIONAL,
        originationExpireDateTime  [401] EXPLICIT INTEGER OPTIONAL,
        usageExpireDateTime  [402] EXPLICIT INTEGER OPTIONAL,
        noAuthRequired  [503] EXPLICIT NULL OPTIONAL,
        userAuthType  [504] EXPLICIT INTEGER OPTIONAL,
        authTimeout  [505] EXPLICIT INTEGER OPTIONAL,
        allowWhileOnBody  [506] EXPLICIT NULL OPTIONAL,
        allApplications  [600] EXPLICIT NULL OPTIONAL,
        applicationId  [601] EXPLICIT OCTET_STRING OPTIONAL,
        creationDateTime  [701] EXPLICIT INTEGER OPTIONAL,
        origin  [702] EXPLICIT INTEGER OPTIONAL,
        rollbackResistant  [703] EXPLICIT NULL OPTIONAL,
        rootOfTrust  [704] EXPLICIT RootOfTrust OPTIONAL,
        osVersion  [705] EXPLICIT INTEGER OPTIONAL,
        osPatchLevel  [706] EXPLICIT INTEGER OPTIONAL,
    }

    RootOfTrust ::= SEQUENCE {
        verifiedBootKey  OCTET_STRING,
        deviceLocked  BOOLEAN,
        verifiedBootState  VerifiedBootState,
    }

    VerifiedBootState ::= ENUMERATED {
        Verified  (0),
        SelfSigned  (1),
        Unverified  (2),
        Failed  (3),
    }
    

スキーマ内の各要素について、以下のリストで説明します。

KeyDescription

この一連の値は、キー構成証明を通じて検証されるキーペアに関する一般情報を示しており、各値から、追加の詳細情報に簡単にアクセスすることができます。

attestationVersion
キー構成証明機能のバージョン。
attestationSecurityLevel

構成証明のセキュリティ レベル

警告: Android システム内に格納されているキーの構成証明を行うことは可能です(attestationSecurityLevel の値が Software に設定されている場合)が、Android システムが不正使用されている場合、このような構成証明を信頼することはできません。

keymasterVersion
Keymaster ハードウェア抽象化レイヤ(HAL)のバージョン。「0」はバージョン 0.2 または 0.3 を、「1」はバージョン 1.0 を、「2」はバージョン 2.0 を示します。
keymasterSecurityLevel
Keymaster 実装のセキュリティ レベル
uniqueId
デバイスを識別する値(ただし、一定期間内のみ)。計算によって求められた値であり、使用するのはシステムアプリだけに限られます。他のすべてのアプリで、uniqueId は空になります。
softwareEnforced
(省略可)デバイスの TEE ではなく、Android システムによって適用される Keymaster 承認リスト
teeEnforced
(省略可)デバイスの TEE によって適用される Keymaster 承認リスト

SecurityLevel

このデータ構造は、キーペアなどのソフトウェア機能がデバイス内の場所に基づいて保護される範囲を示します。

データ構造は列挙型であるため、次のいずれかの値を取ります。

Software
この機能を作成、管理するロジックは、Android システム内に実装されています。キーペアを作成して保存する目的の場合、この場所は TEE よりも安全性が低くなりますが、アプリのプロセス領域よりも安全です。
TrustedEnvironment
この機能を作成、管理するロジックは、TEE などのセキュア ハードウェアに実装されています。キーペアを作成して保存する目的の場合、セキュア ハードウェアはリモートからのセキュリティ侵害に対して堅牢性が高いため、この場所は比較的安全です。
StrongBox
この機能を作成、管理するロジックは、専用のハードウェア セキュリティ モジュール内に実装されています。キーペアを作成して保存する目的の場合、リモートからのセキュリティ侵害やモジュールへのハードウェア攻撃に対して堅牢性が高いため、この場所は、優れた安全性を備えています。

AuthorizationList

Keymaster ハードウェア抽象化レイヤ(HAL)内で定義されているように、このデータ構造には、キーペアのプロパティ自体が含まれます。各値を、デバイスの現在の状態または想定される値セットと比較することで、キーペアがアプリでの使用に対して引き続き有効であるのか検証します。

各フィールド名は、同様に命名された Keymaster 承認タグに対応します。たとえば、承認リスト内の keySize フィールドは、Tag::KEY_SIZE Keymaster 承認タグに対応します。

以下のリストの各フィールドは省略可能です。

purpose
Tag::PURPOSE Keymaster 承認タグに対応し、タグ ID 値 1 を使用します。
algorithm

Tag::ALGORITHM Keymaster 承認タグに対応し、タグ ID 値 2 を使用します。

構成証明 AuthorizationList オブジェクト内では、アルゴリズム値は常に RSA または EC になります。

keySize
Tag::KEY_SIZE Keymaster 承認タグに対応し、タグ ID 値 3 を使用します。
digest
Tag::DIGEST Keymaster 承認タグに対応し、タグ ID 値 5 を使用します。
padding
Tag::PADDING Keymaster 承認タグに対応し、タグ ID 値 6 を使用します。
ecCurve

Tag::EC_CURVE Keymaster 承認タグに対応し、タグ ID 値 10 を使用します。

Android システムのキーストア内で楕円曲線(EC)キーペアを生成する際に使用するパラメータ セットであり、ECDSA を使用して署名と検証を行います。

rsaPublicExponent
Tag::RSA_PUBLIC_EXPONENT Keymaster 承認タグに対応し、タグ ID 値 200 を使用します。
rollbackResistance

キー構成証明バージョン 3 の場合に限り存在します。

Tag::ROLLBACK_RESISTANT Keymaster 承認タグに対応し、タグ ID 値 303 を使用します。

activeDateTime
Tag::ACTIVE_DATETIME Keymaster 承認タグに対応し、タグ ID 値 400 を使用します。
originationExpireDateTime
Tag::ORIGINATION_EXPIRE_DATETIME Keymaster 承認タグに対応し、タグ ID 値 401 を使用します。
usageExpireDateTime
Tag::USAGE_EXPIRE_DATETIME Keymaster 承認タグに対応し、タグ ID 値 402 を使用します。
noAuthRequired

Tag::NO_AUTH_REQUIRED Keymaster 承認タグに対応し、タグ ID 値 503 を使用します。

userAuthType
Tag::USER_AUTH_TYPE Keymaster 承認タグに対応し、タグ ID 値 504 を使用します。
authTimeout
Tag::AUTH_TIMEOUT Keymaster 承認タグに対応し、タグ ID 値 505 を使用します。
allowWhileOnBody

Tag::ALLOW_WHILE_ON_BODY Keymaster 承認タグに対応し、タグ ID 値 506 を使用します。

ユーザーがデバイスを身に付け続けている場合、認証のタイムアウト期限後もキーを使用できるようにします。セキュアな内蔵センサーにより、ユーザーがデバイスを身に付けているかどうかが判定されます。

trustedUserPresenceRequired

キー構成証明バージョン 3 の場合に限り存在します。

Tag::TRUSTED_USER_PRESENCE_REQUIRED Keymaster 承認タグに対応し、タグ ID 値 507 を使用します。

「ユーザーが物理的存在の証明を提供した場合に限り、このキーが使用可能になる」と指定します。たとえば、次のようになります。

  • StrongBox キーの場合、StrongBox デバイス上のピンに組み込まれたハードウェア ボタン。
  • TEE キーの場合、TEE がスキャナを排他的に制御し、指紋照合プロセスを実行する間は、指紋認証によって、存在の証明が提供されます。
trustedConfirmationRequired

キー構成証明バージョン 3 の場合に限り存在します。

Tag::TRUSTED_CONFIRMATION_REQUIRED Keymaster 承認タグに対応し、タグ ID 値 508 を使用します。

「承認トークンを使用してデータに署名することをユーザーが同意した場合に限り、キーが使用可能になる」と指定します。ユーザーの同意を取得する方法については、Android Protected Confirmation をご覧ください。

注: このタグが適用されるのは、SIGN 目的を使用するキーに限られます。

unlockedDeviceRequired

キー構成証明バージョン 3 の場合に限り存在します。

Tag::UNLOCKED_DEVICE_REQUIRED Keymaster 承認タグに対応し、タグ ID 値 509 を使用します。

allApplications

Tag::ALL_APPLICATIONS Keymaster 承認タグに対応し、タグ ID 値 600 を使用します。

デバイス上のすべてのアプリがキーペアにアクセスできるかどうかを示します。

applicationId
Tag::APPLICATION_ID Keymaster 承認タグに対応し、タグ ID 値 601 を使用します。
creationDateTime
Tag::CREATION_DATETIME Keymaster 承認タグに対応し、タグ ID 値 701 を使用します。
origin

Tag::ORIGIN Keymaster 承認タグに対応し、タグ ID 値 702 を使用します。

rollbackResistant

キー構成証明バージョン 1 およびバージョン 2 の場合に限り存在します。

Tag::ROLLBACK_RESISTANT Keymaster 承認タグに対応し、タグ ID 値 703 を使用します。

rootOfTrust

Tag::ROOT_OF_TRUST Keymaster 承認タグに対応し、タグ ID 値 704 を使用します。

詳細については、RootOfTrust データ構造をご覧ください。

osVersion

Tag::OS_VERSION Keymaster 承認タグに対応し、タグ ID 値 705 を使用します。

Keymaster に関連付けられている Android オペレーティング システムのバージョンが、6 桁の整数で指定されます。たとえば、バージョン 8.1.0 は「080100」になります。

承認リストにこの値が含まれるのは、Keymaster バージョン 1.0 以降に限られます。

osPatchLevel

Tag::PATCHLEVEL Keymaster 承認タグに対応し、タグ ID 値 706 を使用します。

Keymaster 内で使用されているセキュリティ パッチに関連付けられている月と年が、6 桁の整数で指定されます。たとえば、2018 年 8 月のパッチは「201808」になります。

承認リストにこの値が含まれるのは、Keymaster バージョン 1.0 以降に限られます。

attestationApplicationId

キー構成証明バージョン 2 およびバージョン 3 の場合に限り存在します。

Tag::ATTESTATION_APPLICATION_ID Keymaster 承認タグに対応し、タグ ID 値 709 を使用します。

詳細については、AttestationApplicationId データ構造をご覧ください。

attestationIdBrand

キー構成証明バージョン 2 およびバージョン 3 の場合に限り存在します。

Tag::ATTESTATION_ID_BRAND Keymaster タグに対応し、タグ ID 値 710 を使用します。

attestationIdDevice

キー構成証明バージョン 2 およびバージョン 3 の場合に限り存在します。

Tag::ATTESTATION_ID_DEVICE Keymaster タグに対応し、タグ ID 値 711 を使用します。

attestationIdProduct

キー構成証明バージョン 2 およびバージョン 3 の場合に限り存在します。

Tag::ATTESTATION_ID_PRODUCT Keymaster タグに対応し、タグ ID 値 712 を使用します。

attestationIdSerial

キー構成証明バージョン 2 およびバージョン 3 の場合に限り存在します。

Tag::ATTESTATION_ID_SERIAL Keymaster タグに対応し、タグ ID 値 713 を使用します。

attestationIdImei

キー構成証明バージョン 2 およびバージョン 3 の場合に限り存在します。

Tag::ATTESTATION_ID_IMEI Keymaster 承認タグに対応し、タグ ID 値 714 を使用します。

attestationIdMeid

キー構成証明バージョン 2 およびバージョン 3 の場合に限り存在します。

Tag::ATTESTATION_ID_MEID Keymaster 承認タグに対応し、タグ ID 値 715 を使用します。

attestationIdManufacturer

キー構成証明バージョン 2 およびバージョン 3 の場合に限り存在します。

Tag::ATTESTATION_ID_MANUFACTURER Keymaster 承認タグに対応し、タグ ID 値 716 を使用します。

attestationIdModel

キー構成証明バージョン 2 およびバージョン 3 の場合に限り存在します。

Tag::ATTESTATION_ID_MODEL Keymaster タグに対応し、タグ ID 値 717 を使用します。

vendorPatchLevel

キー構成証明バージョン 3 の場合に限り存在します。

Tag::VENDOR_PATCHLEVEL Keymaster 承認タグに対応し、タグ ID 値 718 を使用します。

このキーを使用するためにデバイスにインストールする必要があるベンダー イメージ セキュリティ パッチ レベルを指定します。値は「YYYYMMDD」の形式で表示され、ベンダー セキュリティ パッチの日付を示します。たとえば、2018 年 8 月 1 日付けのベンダー セキュリティ パッチがインストールされている Android デバイス上でキーが生成された場合、この値は「20180801」になります。

bootPatchLevel

キー構成証明バージョン 3 の場合に限り存在します。

Tag::BOOT_PATCHLEVEL Keymaster 承認タグに対応し、タグ ID 値 719 を使用します。

このキーを使用するためにデバイスにインストールする必要があるカーネル イメージ セキュリティ パッチ レベルを指定します。値は「YYYYMMDD」の形式で表示され、システム セキュリティ パッチの日付を示します。たとえば、2018 年 8 月 5 日付けのシステム セキュリティ パッチがインストールされている Android デバイス上でキーが生成された場合、この値は「20180805」になります。

RootOfTrust

この一式の値により、デバイスのステータスに関するキー情報が定義されます。

以下の各フィールドは必須です。

verifiedBootKey

システム イメージを検証するためのキーのセキュア ハッシュ。このハッシュには SHA-256 アルゴリズムを使用することをおすすめします。

deviceLocked
デバイスのブートローダーがロックされている場合、この値は true になり、セキュアブート チェックが有効になり、署名されていないデバイス イメージがデバイスにフラッシュされることを防止します。この機能の詳細については、ブートを検証するをご覧ください。
verifiedBootState
セキュアブート機能に応じたデバイスのブート状態
verifiedBootHash

キー構成証明バージョン 3 の場合に限り存在します。

セキュアブートによって保護されているすべてのデータのダイジェスト。セキュアブートの Android セキュアブート実装を使用しているデバイスの場合、この値には、VBMeta 構造体(セキュアブート メタデータ構造体)のダイジェストが含まれます。

この値の計算方法については、VBMeta ダイジェストをご覧ください。

VerifiedBootState

このデータ構造は、デバイスの現在のブート状態を示します。これは、デバイスのブートが完了した後にユーザーやアプリに提供される保護のレベルを示します。この機能の詳細については、「ブートを検証する」のブートの状態をご覧ください。

このデータ構造は列挙型であるため、次のいずれかの値を取ります。

Verified

ブートローダーや、ブート パーティション、すべての検証済みパーティションなどを含む信頼チェーン全体を示します。

デバイスがこのブート状態のときは、デバイスに組み込まれた証明書のハッシュが verifiedBootKey になります。この証明書は、デバイス メーカーが出荷前にデバイスの ROM に追加します。

SelfSigned

デバイスに組み込まれた証明書によってデバイスのブート パーティションが検証されていること、署名が有効であることを示します。

デバイスがこのブート状態のときは、ユーザーによりインストールされた証明書のハッシュが verifiedBootKey になります。この証明書により、メーカーが提供する元のブート パーティションの代わりに、ユーザーがデバイスに追加したブート パーティションが署名されます。

Unverified
ユーザーがデバイスに自由に変更を加えられることを示します。そのため、デバイスの整合性を検証する責任はユーザーにあります。
Failed
デバイスの検証に失敗したことを示します。構成証明書が、VerifiedBootState に対してこの値を使用することはありません。

AttestationApplicationId

このデータ構造は、構成証明の下でシークレット キー マテリアルを使用することを許可されるアプリに関する Android プラットフォームの考えを反映します。複数のパッケージが同じ UID を共有する場合に限り、この ID に複数のパッケージを含めることができます。オクテット文字列自体は、次の ASN.1 スキーマに沿ってフォーマットされます。

    AttestationApplicationId ::= SEQUENCE {
        package_infos  SET OF AttestationPackageInfo,
        signature_digests  SET OF OCTET_STRING,
    }

    AttestationPackageInfo ::= SEQUENCE {
        package_name  OCTET_STRING,
        version  INTEGER,
    }
package_infos
AttestationPackageInfo オブジェクトのセット。オブジェクトごとにパッケージの名前とバージョン番号を示します。
signature_digests

アプリの署名 blob の SHA-256 ダイジェストのセット。getPackageInfo() の呼び出し時に返される PackageInfosignatures フィールド内に格納されます。サンプルセットのコード スニペットを以下に示します。

    {SHA256(PackageInfo.signature[0]), SHA256(PackageInfo.signature[1]), ...}