گواهی کلید و شناسه، گواهی کلید و شناسه

کی‌استور (Keystore) مکانی امن‌تر برای ایجاد، ذخیره و استفاده از کلیدهای رمزنگاری به روشی کنترل‌شده فراهم می‌کند. هنگامی که ذخیره‌سازی کلید با پشتیبانی سخت‌افزاری در دسترس و مورد استفاده قرار می‌گیرد، محتوای کلید در برابر استخراج از دستگاه ایمن‌تر است و کی‌مینت (که قبلاً کی‌مستر (Keymaster) نام داشت) محدودیت‌هایی را اعمال می‌کند که دور زدن آنها دشوار است.

با این حال، این تنها در صورتی صادق است که کلیدهای Keystore در حافظه‌ی پشتیبانی‌شده توسط سخت‌افزار قرار داشته باشند. در Keymaster 1، هیچ راهی برای برنامه‌ها یا سرورهای راه دور وجود نداشت که بتوانند به طور قابل اعتمادی تأیید کنند که آیا این مورد وجود دارد یا خیر. سرویس Keystore، لایه انتزاعی سخت‌افزاری Keymaster (HAL) موجود را بارگذاری می‌کرد و هر آنچه HAL در مورد پشتیبانی سخت‌افزاری کلیدها می‌گفت را باور می‌کرد.

برای رفع این مشکل، قابلیت تصدیق کلید در اندروید ۷.۰ (Keymaster 2) و قابلیت تصدیق شناسه در اندروید ۸.۰ (Keymaster 3) معرفی شدند.

هدف از تصدیق کلید، ارائه روشی برای تعیین دقیق این است که آیا یک جفت کلید نامتقارن دارای پشتیبانی سخت‌افزاری است یا خیر، ویژگی‌های کلید چیست و چه محدودیت‌هایی برای استفاده از آن اعمال می‌شود.

تأیید شناسه به دستگاه اجازه می‌دهد تا مدرکی دال بر شناسه‌های سخت‌افزاری خود، مانند شماره سریال یا IMEI، ارائه دهد.

گواهی کلیدی

برای پشتیبانی از گواهی کلید، اندروید ۷.۰ مجموعه‌ای از برچسب‌ها، نوع‌ها و متدها را به HAL معرفی کرد.

برچسب‌ها

  • Tag::ATTESTATION_CHALLENGE
  • Tag::INCLUDE_UNIQUE_ID
  • Tag::RESET_SINCE_ID_ROTATION

نوع

کلیدساز ۲ و پایین‌تر

typedef struct {
    keymaster_blob_t* entries;
    size_t entry_count;
} keymaster_cert_chain_t;

روش AttestKey

کلیدساز ۳

    attestKey(vec<uint8_t> keyToAttest, vec<KeyParameter> attestParams)
        generates(ErrorCode error, vec<vec<uint8_t>> certChain);

کلیدساز ۲ و پایین‌تر

keymaster_error_t (*attest_key)(const struct keymaster2_device* dev,
        const keymaster_key_blob_t* key_to_attest,
        const keymaster_key_param_set_t* attest_params,
        keymaster_cert_chain_t* cert_chain);
  • dev ساختار دستگاه Keymaster است.
  • keyToAttest قطعه کلید برگردانده شده از generateKey است که گواهی برای آن ایجاد شده است.
  • attestParams فهرستی از پارامترهای لازم برای تصدیق است. این شامل Tag::ATTESTATION_CHALLENGE و احتمالاً Tag::RESET_SINCE_ID_ROTATION و همچنین Tag::APPLICATION_ID و Tag::APPLICATION_DATA می‌شود. دو مورد آخر در صورتی که در طول تولید کلید مشخص شده باشند، برای رمزگشایی key blob ضروری هستند.
  • certChain پارامتر خروجی است که آرایه‌ای از گواهی‌ها را برمی‌گرداند. ورودی ۰ گواهی گواهی است، به این معنی که کلید را از keyToAttest گواهی می‌کند و شامل پسوند گواهی است.

متد attestKey یک عملیات کلید عمومی روی کلید تایید شده در نظر گرفته می‌شود، زیرا می‌تواند در هر زمانی فراخوانی شود و نیازی به رعایت محدودیت‌های مجوز ندارد. به عنوان مثال، اگر کلید تایید شده برای استفاده نیاز به احراز هویت کاربر داشته باشد، می‌توان بدون احراز هویت کاربر، یک تاییدیه ایجاد کرد.

گواهی تأیید

گواهی تأیید، یک گواهی استاندارد X.509 است، با یک افزونه تأیید اختیاری که شامل توضیحی از کلید تأیید شده است. گواهی با یک کلید تأیید گواهی شده امضا شده است. کلید تأیید ممکن است از الگوریتمی متفاوت از کلید مورد تأیید استفاده کند.

گواهی تأیید شامل فیلدهای جدول زیر است و نمی‌تواند شامل هیچ فیلد اضافی باشد. برخی از فیلدها مقدار فیلد ثابتی را مشخص می‌کنند. آزمون‌های CTS تأیید می‌کنند که محتوای گواهی دقیقاً مطابق تعریف است.

توالی گواهی

نام فیلد (به RFC 5280 مراجعه کنید) ارزش
گواهی tbs توالی گواهی TBSC
الگوریتم امضا شناسه الگوریتم مورد استفاده برای امضای کلید:
ECDSA برای کلیدهای EC، RSA برای کلیدهای RSA.
مقدار امضا رشته بیتی، امضا روی tbsCertificate کدگذاری شده توسط ASN.1 DER محاسبه شده است.

توالی گواهی TBSC

نام فیلد (به RFC 5280 مراجعه کنید) ارزش
version عدد صحیح ۲ (به معنی گواهی نسخه ۳)
serialNumber عدد صحیح ۱ (مقدار ثابت: در همه گواهی‌ها یکسان است)
signature شناسه الگوریتم مورد استفاده برای امضای کلید: ECDSA برای کلیدهای EC، RSA برای کلیدهای RSA.
issuer همانند فیلد موضوع کلید تأیید دسته‌ای.
validity توالی دو تاریخ، شامل مقادیر Tag::ACTIVE_DATETIME و Tag::USAGE_EXPIRE_DATETIME . این مقادیر از اول ژانویه ۱۹۷۰ به میلی‌ثانیه هستند. برای نمایش صحیح تاریخ در گواهی‌ها به RFC 5280 مراجعه کنید.
اگر Tag::ACTIVE_DATETIME وجود ندارد، از مقدار Tag::CREATION_DATETIME استفاده کنید. اگر Tag::USAGE_EXPIRE_DATETIME وجود ندارد، از تاریخ انقضای گواهی کلید تایید دسته‌ای استفاده کنید.
subject CN = "کلید ذخیره کلید اندروید" (مقدار ثابت: در همه گواهی‌ها یکسان است)
subjectPublicKeyInfo SubjectPublicKeyInfo حاوی کلید عمومی تأیید شده.
extensions/Key Usage امضای دیجیتال: اگر کلید هدفی داشته باشد، تنظیم می‌شود. KeyPurpose::SIGN یا KeyPurpose::VERIFY . تمام بیت‌های دیگر تنظیم نشده‌اند.
extensions/CRL Distribution Points ارزش نامشخص
extensions/"attestation" شناسه OID برابر با ۱.۳.۶.۱.۴.۱.۱۱۱۲۹.۲.۱.۱۷ است؛ محتوا در بخش افزونه گواهی در زیر تعریف شده است. همانند تمام افزونه‌های گواهی X.۵۰۹، محتوا به صورت یک OCTET_STRING نمایش داده می‌شود که حاوی یک کدگذاری DER از توالی گواهی است.

تمدید گواهینامه

افزونه‌ی attestation دارای OID 1.3.6.1.4.1.11129.2.1.17 است که حاوی اطلاعاتی در مورد جفت کلید مورد گواهی و وضعیت دستگاه در زمان تولید کلید است.

انواع برچسب Keymaster/KeyMint که در مشخصات رابط AIDL تعریف شده‌اند، به صورت زیر به انواع ASN.1 ترجمه می‌شوند:

نوع KeyMint یا Keymaster نوع ASN.1 یادداشت‌ها
ENUM INTEGER
ENUM_REP SET of INTEGER
UINT INTEGER
UINT_REP SET of INTEGER
ULONG INTEGER
ULONG_REP SET of INTEGER
DATE INTEGER میلی‌ثانیه از ۱ ژانویه ۱۹۷۰، ساعت ۰۰:۰۰:۰۰ به وقت گرینویچ.
BOOL NULL حضور در برچسب به معنای درست و غیبت به معنای نادرست است.
BIGNUM هیچ تگی این نوع را ندارد، بنابراین هیچ نگاشتی تعریف نشده است.
BYTES OCTET_STRING

طرحواره

محتوای افزونه‌ی گواهی‌دهی توسط طرح ASN.1 زیر توصیف می‌شود:

نسخه ۴۰۰

KeyDescription ::= SEQUENCE {
    attestationVersion           INTEGER, # Value 400
    attestationSecurityLevel     SecurityLevel,
    keyMintVersion               INTEGER, # Value 400
    keyMintSecurityLevel         SecurityLevel,
    attestationChallenge         OCTET_STRING,
    uniqueId                     OCTET_STRING,
    softwareEnforced             AuthorizationList,
    hardwareEnforced             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,
    blockMode                    [4] EXPLICIT SET OF INTEGER OPTIONAL,
    digest                       [5] EXPLICIT SET OF INTEGER OPTIONAL,
    padding                      [6] EXPLICIT SET OF INTEGER OPTIONAL,
    callerNonce                  [7] EXPLICIT NULL OPTIONAL,
    minMacLength                 [8] EXPLICIT INTEGER OPTIONAL,
    ecCurve                     [10] EXPLICIT INTEGER OPTIONAL,
    rsaPublicExponent          [200] EXPLICIT INTEGER OPTIONAL,
    mgfDigest                  [203] EXPLICIT SET OF INTEGER OPTIONAL,
    rollbackResistance         [303] EXPLICIT NULL OPTIONAL,
    earlyBootOnly              [305] EXPLICIT NULL OPTIONAL,
    activeDateTime             [400] EXPLICIT INTEGER OPTIONAL,
    originationExpireDateTime  [401] EXPLICIT INTEGER OPTIONAL,
    usageExpireDateTime        [402] EXPLICIT INTEGER OPTIONAL,
    usageCountLimit            [405] EXPLICIT INTEGER OPTIONAL,
    userSecureId               [502] EXPLICIT INTEGER OPTIONAL,
    noAuthRequired             [503] EXPLICIT NULL OPTIONAL,
    userAuthType               [504] EXPLICIT INTEGER OPTIONAL,
    authTimeout                [505] EXPLICIT INTEGER OPTIONAL,
    allowWhileOnBody           [506] EXPLICIT NULL OPTIONAL,
    trustedUserPresenceReq     [507] EXPLICIT NULL OPTIONAL,
    trustedConfirmationReq     [508] EXPLICIT NULL OPTIONAL,
    unlockedDeviceReq          [509] EXPLICIT NULL 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,
    deviceUniqueAttestation    [720] EXPLICIT NULL OPTIONAL,
    attestationIdSecondImei    [723] EXPLICIT OCTET_STRING OPTIONAL,
    moduleHash                 [724] EXPLICIT OCTET_STRING OPTIONAL,
}

Modules ::= SET OF Module
Module ::= SEQUENCE {
    packageName                OCTET_STRING,
    version                    INTEGER,
}

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

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

نسخه ۳۰۰

KeyDescription ::= SEQUENCE {
    attestationVersion           INTEGER, # Value 300
    attestationSecurityLevel     SecurityLevel,
    keyMintVersion               INTEGER, # Value 300
    keymintSecurityLevel         SecurityLevel,
    attestationChallenge         OCTET_STRING,
    uniqueId                     OCTET_STRING,
    softwareEnforced             AuthorizationList,
    hardwareEnforced             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,
    blockMode                    [4] EXPLICIT SET OF INTEGER OPTIONAL,
    digest                       [5] EXPLICIT SET OF INTEGER OPTIONAL,
    padding                      [6] EXPLICIT SET OF INTEGER OPTIONAL,
    callerNonce                  [7] EXPLICIT NULL OPTIONAL,
    minMacLength                 [8] EXPLICIT INTEGER OPTIONAL,
    ecCurve                     [10] EXPLICIT INTEGER OPTIONAL,
    rsaPublicExponent          [200] EXPLICIT INTEGER OPTIONAL,
    mgfDigest                  [203] EXPLICIT SET OF INTEGER OPTIONAL,
    rollbackResistance         [303] EXPLICIT NULL OPTIONAL,
    earlyBootOnly              [305] EXPLICIT NULL OPTIONAL,
    activeDateTime             [400] EXPLICIT INTEGER OPTIONAL,
    originationExpireDateTime  [401] EXPLICIT INTEGER OPTIONAL,
    usageExpireDateTime        [402] EXPLICIT INTEGER OPTIONAL,
    usageCountLimit            [405] EXPLICIT INTEGER OPTIONAL,
    userSecureId               [502] EXPLICIT INTEGER OPTIONAL,
    noAuthRequired             [503] EXPLICIT NULL OPTIONAL,
    userAuthType               [504] EXPLICIT INTEGER OPTIONAL,
    authTimeout                [505] EXPLICIT INTEGER OPTIONAL,
    allowWhileOnBody           [506] EXPLICIT NULL OPTIONAL,
    trustedUserPresenceReq     [507] EXPLICIT NULL OPTIONAL,
    trustedConfirmationReq     [508] EXPLICIT NULL OPTIONAL,
    unlockedDeviceReq          [509] EXPLICIT NULL 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,
    deviceUniqueAttestation    [720] EXPLICIT NULL OPTIONAL,
    attestationIdSecondImei    [723] EXPLICIT OCTET_STRING OPTIONAL,
}

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

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

نسخه ۲۰۰

KeyDescription ::= SEQUENCE {
    attestationVersion           INTEGER, # Value 200
    attestationSecurityLevel     SecurityLevel,
    keyMintVersion               INTEGER, # Value 200
    keymintSecurityLevel         SecurityLevel,
    attestationChallenge         OCTET_STRING,
    uniqueId                     OCTET_STRING,
    softwareEnforced             AuthorizationList,
    hardwareEnforced             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,
    mgfDigest                  [203] EXPLICIT SET OF INTEGER OPTIONAL,
    rollbackResistance         [303] EXPLICIT NULL OPTIONAL,
    earlyBootOnly              [305] EXPLICIT NULL OPTIONAL,
    activeDateTime             [400] EXPLICIT INTEGER OPTIONAL,
    originationExpireDateTime  [401] EXPLICIT INTEGER OPTIONAL,
    usageExpireDateTime        [402] EXPLICIT INTEGER OPTIONAL,
    usageCountLimit            [405] EXPLICIT INTEGER OPTIONAL,
    noAuthRequired             [503] EXPLICIT NULL OPTIONAL,
    userAuthType               [504] EXPLICIT INTEGER OPTIONAL,
    authTimeout                [505] EXPLICIT INTEGER OPTIONAL,
    allowWhileOnBody           [506] EXPLICIT NULL OPTIONAL,
    trustedUserPresenceReq     [507] EXPLICIT NULL OPTIONAL,
    trustedConfirmationReq     [508] EXPLICIT NULL OPTIONAL,
    unlockedDeviceReq          [509] EXPLICIT NULL 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,
    deviceUniqueAttestation    [720] EXPLICIT NULL OPTIONAL,
}

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

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

نسخه ۱۰۰

KeyDescription ::= SEQUENCE {
    attestationVersion           INTEGER, # Value 100
    attestationSecurityLevel     SecurityLevel,
    keyMintVersion               INTEGER, # Value 100
    keymintSecurityLevel         SecurityLevel,
    attestationChallenge         OCTET_STRING,
    uniqueId                     OCTET_STRING,
    softwareEnforced             AuthorizationList,
    hardwareEnforced             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,
    mgfDigest                  [203] EXPLICIT SET OF INTEGER OPTIONAL,
    rollbackResistance         [303] EXPLICIT NULL OPTIONAL,
    earlyBootOnly              [305] EXPLICIT NULL OPTIONAL,
    activeDateTime             [400] EXPLICIT INTEGER OPTIONAL,
    originationExpireDateTime  [401] EXPLICIT INTEGER OPTIONAL,
    usageExpireDateTime        [402] EXPLICIT INTEGER OPTIONAL,
    usageCountLimit            [405] EXPLICIT INTEGER OPTIONAL,
    noAuthRequired             [503] EXPLICIT NULL OPTIONAL,
    userAuthType               [504] EXPLICIT INTEGER OPTIONAL,
    authTimeout                [505] EXPLICIT INTEGER OPTIONAL,
    allowWhileOnBody           [506] EXPLICIT NULL OPTIONAL,
    trustedUserPresenceReq     [507] EXPLICIT NULL OPTIONAL,
    trustedConfirmationReq     [508] EXPLICIT NULL OPTIONAL,
    unlockedDeviceReq          [509] EXPLICIT NULL 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,
    deviceUniqueAttestation    [720] EXPLICIT NULL OPTIONAL,
}

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

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

نسخه ۴

KeyDescription ::= SEQUENCE {
    attestationVersion           INTEGER, # Value 4
    attestationSecurityLevel     SecurityLevel,
    keymasterVersion             INTEGER, # Value 41
    keymasterSecurityLevel       SecurityLevel,
    attestationChallenge         OCTET_STRING,
    uniqueId                     OCTET_STRING,
    softwareEnforced             AuthorizationList,
    hardwareEnforced             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,
    blockMode                    [4] EXPLICIT SET OF INTEGER OPTIONAL,
    digest                       [5] EXPLICIT SET OF INTEGER OPTIONAL,
    padding                      [6] EXPLICIT SET OF INTEGER OPTIONAL,
    callerNonce                  [7] EXPLICIT NULL OPTIONAL,
    minMacLength                 [8] EXPLICIT 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,
    userSecureId               [502] EXPLICIT INTEGER OPTIONAL,
    noAuthRequired             [503] EXPLICIT NULL OPTIONAL,
    userAuthType               [504] EXPLICIT INTEGER OPTIONAL,
    authTimeout                [505] EXPLICIT INTEGER OPTIONAL,
    allowWhileOnBody           [506] EXPLICIT NULL OPTIONAL,
    trustedUserPresenceReq     [507] EXPLICIT NULL OPTIONAL,
    trustedConfirmationReq     [508] EXPLICIT NULL OPTIONAL,
    unlockedDeviceReq          [509] EXPLICIT NULL 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,
    deviceUniqueAttestation    [720] EXPLICIT NULL OPTIONAL,
}

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

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

نسخه ۳

KeyDescription ::= SEQUENCE {
    attestationVersion           INTEGER, # Value 3
    attestationSecurityLevel     SecurityLevel,
    keymasterVersion             INTEGER, # Value 4
    keymasterSecurityLevel       SecurityLevel,
    attestationChallenge         OCTET_STRING,
    uniqueId                     OCTET_STRING,
    softwareEnforced             AuthorizationList,
    hardwareEnforced             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,
    blockMode                    [4] EXPLICIT SET OF INTEGER OPTIONAL,
    digest                       [5] EXPLICIT SET OF INTEGER OPTIONAL,
    padding                      [6] EXPLICIT SET OF INTEGER OPTIONAL,
    callerNonce                  [7] EXPLICIT NULL OPTIONAL,
    minMacLength                 [8] EXPLICIT 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,
    userSecureId               [502] EXPLICIT INTEGER OPTIONAL,
    noAuthRequired             [503] EXPLICIT NULL OPTIONAL,
    userAuthType               [504] EXPLICIT INTEGER OPTIONAL,
    authTimeout                [505] EXPLICIT INTEGER OPTIONAL,
    allowWhileOnBody           [506] EXPLICIT NULL OPTIONAL,
    trustedUserPresenceReq     [507] EXPLICIT NULL OPTIONAL,
    trustedConfirmationReq     [508] EXPLICIT NULL OPTIONAL,
    unlockedDeviceReq          [509] EXPLICIT NULL 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),
}

نسخه ۲

KeyDescription ::= SEQUENCE {
    attestationVersion           INTEGER, # Value 2
    attestationSecurityLevel     SecurityLevel,
    keymasterVersion             INTEGER, # Value 3
    keymasterSecurityLevel       SecurityLevel,
    attestationChallenge         OCTET_STRING,
    uniqueId                     OCTET_STRING,
    softwareEnforced             AuthorizationList,
    hardwareEnforced             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,
    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),
}

نسخه ۱

KeyDescription ::= SEQUENCE {
    attestationVersion           INTEGER, # Value 1
    attestationSecurityLevel     SecurityLevel,
    keymasterVersion             INTEGER, # Value 2
    keymasterSecurityLevel       SecurityLevel,
    attestationChallenge         OCTET_STRING,
    uniqueId                     OCTET_STRING,
    softwareEnforced             AuthorizationList,
    hardwareEnforced             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,
    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),
}

فیلدهای توضیحات کلید

attestationVersion
نسخه طرحواره ASN.1.
ارزش نسخه KeyMint یا Keymaster
۱ نسخه ۲.۰ کی‌مستر
۲ نسخه ۳.۰ کی‌مستر
۳ نسخه ۴.۰ کی‌مستر
۴ نسخه ۴.۱ کی‌مستر
۱۰۰ نسخه ۱.۰ کی‌مینت
۲۰۰ نسخه ۲.۰ کی‌مینت
۳۰۰ نسخه ۳.۰ کی‌مینت
۴۰۰ نسخه ۴.۰ کی‌مینت
attestationSecurityLevel

سطح امنیتی مکانی که کلید گواهی‌شده در آن ذخیره شده است.

keymasterVersion / keyMintVersion
نسخه پیاده‌سازی KeyMint یا Keymaster HAL.
ارزش نسخه KeyMint یا Keymaster
۲ نسخه ۲.۰ کی‌مستر
۳ نسخه ۳.۰ کی‌مستر
۴ نسخه ۴.۰ کی‌مستر
۴۱ نسخه ۴.۱ کی‌مستر
۱۰۰ نسخه ۱.۰ کی‌مینت
۲۰۰ نسخه ۲.۰ کی‌مینت
۳۰۰ نسخه ۳.۰ کی‌مینت
۴۰۰ نسخه ۴.۰ کی‌مینت
keymasterSecurityLevel / keyMintSecurityLevel
سطح امنیتی پیاده‌سازی KeyMint یا Keymaster.
attestationChallenge
چالشی که در زمان تولید کلید ارائه می‌شود.
uniqueId
یک شناسه دستگاه حساس به حریم خصوصی که برنامه‌های سیستم می‌توانند در زمان تولید کلید درخواست کنند. اگر شناسه منحصر به فرد درخواست نشود، این فیلد خالی است. برای جزئیات بیشتر، به بخش شناسه منحصر به فرد مراجعه کنید.
softwareEnforced
فهرست مجوزهای KeyMint یا Keymaster که توسط سیستم اندروید اعمال می‌شود. این اطلاعات توسط کد موجود در پلتفرم جمع‌آوری یا تولید می‌شوند. تا زمانی که دستگاه سیستم عاملی را اجرا می‌کند که با مدل امنیتی پلتفرم اندروید مطابقت دارد (یعنی بوت لودر دستگاه قفل شده و وضعیت بوت verifiedBootState ، Verified باشد)، می‌توان به آن اعتماد کرد.
hardwareEnforced
فهرست مجوزهای KeyMint یا Keymaster که توسط محیط اجرای مطمئن (TEE) یا StrongBox دستگاه اعمال می‌شود. این اطلاعات توسط کد موجود در سخت‌افزار امن جمع‌آوری یا تولید می‌شود و توسط پلتفرم کنترل نمی‌شود. به عنوان مثال، اطلاعات می‌توانند از طریق بوت لودر یا از طریق یک کانال ارتباطی امن که شامل اعتماد به پلتفرم نمی‌شود، دریافت شوند.

مقادیر SecurityLevel

مقدار SecurityLevel نشان می‌دهد که یک عنصر مرتبط با Keystore (برای مثال، جفت کلید و گواهی) تا چه حد در برابر حملات مقاوم است.

ارزش معنی
Software تا زمانی که سیستم اندروید دستگاه با مدل امنیتی پلتفرم اندروید مطابقت داشته باشد (یعنی بوت لودر دستگاه قفل شده و verifiedBootState ) Verified باشد)، ایمن است.
TrustedEnvironment تا زمانی که TEE به خطر نیفتد، ایمن است. الزامات جداسازی برای TEEها در بخش‌های 9.11 [C-1-1] تا [C-1-4] از سند تعریف سازگاری اندروید تعریف شده‌اند. TEEها در برابر نفوذ از راه دور بسیار مقاوم و در برابر نفوذ از طریق حمله مستقیم سخت‌افزاری نسبتاً مقاوم هستند.
StrongBox تا زمانی که StrongBox به خطر نیفتد، امن است. StrongBox در یک عنصر امن مشابه یک ماژول امنیتی سخت‌افزاری پیاده‌سازی شده است. الزامات پیاده‌سازی برای StrongBox در بخش 9.11.2 از سند تعریف سازگاری اندروید تعریف شده است. StrongBox در برابر نفوذ از راه دور و نفوذ از طریق حمله مستقیم سخت‌افزاری (به عنوان مثال، دستکاری فیزیکی و حملات کانال جانبی) بسیار مقاوم است.

فیلدهای لیست مجوز

هر فیلد مربوط به یک برچسب مجوز Keymaster/KeyMint از مشخصات رابط AIDL است. این مشخصات منبع حقیقت در مورد برچسب‌های مجوز است: معنی آنها، قالب محتوای آنها، اینکه آیا انتظار می‌رود در فیلدهای softwareEnforced یا hardwareEnforced در شیء KeyDescription ظاهر شوند، اینکه آیا با سایر برچسب‌ها ناسازگار هستند و غیره. همه فیلدهای AuthorizationList اختیاری هستند.

هر فیلد دارای یک برچسب مختص به زمینه EXPLICIT برابر با شماره برچسب KeyMint یا Keymaster است که امکان نمایش فشرده‌تر داده‌ها در AuthorizationList را فراهم می‌کند. بنابراین، تجزیه‌کننده ASN.1 باید نوع داده مورد انتظار برای هر برچسب مختص به زمینه را بداند. برای مثال، Tag::USER_AUTH_TYPE به صورت ENUM | 504 تعریف شده است. در طرحواره توسعه گواهی، فیلد purpose در AuthorizationList به صورت userAuthType [504] EXPLICIT INTEGER OPTIONAL مشخص شده است. بنابراین، کدگذاری ASN.1 آن به جای برچسب کلاس UNIVERSAL برای نوع ASN.1 INTEGER که 10 است، حاوی برچسب مختص به زمینه 504 خواهد بود.

فیلدهای زیر در گواهی‌های تولید شده توسط KeyMint 4 وجود دارند:
purpose
مربوط به تگ مجوز Tag::PURPOSE است که از مقدار شناسه تگ ۱ استفاده می‌کند.
algorithm

مربوط به تگ مجوز Tag::ALGORITHM است که از مقدار شناسه تگ ۲ استفاده می‌کند.

در یک شیء Attestation AuthorizationList ، مقدار الگوریتم همیشه RSA یا EC است.

keySize
مربوط به تگ مجوز Tag::KEY_SIZE است که از مقدار شناسه تگ ۳ استفاده می‌کند.
blockMode
مربوط به تگ مجوز Tag::BLOCK_MODE است که از مقدار شناسه تگ ۴ استفاده می‌کند.
digest
مربوط به تگ مجوز Tag::DIGEST است که از مقدار شناسه تگ ۵ استفاده می‌کند.
padding
مربوط به تگ مجوز Tag::PADDING است که از مقدار شناسه تگ ۶ استفاده می‌کند.
callerNonce
مربوط به تگ مجوز Tag::CALLER_NONCE است که از مقدار شناسه تگ ۷ استفاده می‌کند.
minMacLength
مربوط به تگ مجوز Tag::MIN_MAC_LENGTH است که از مقدار شناسه تگ ۸ استفاده می‌کند.
ecCurve

مربوط به تگ مجوز Tag::EC_CURVE است که از مقدار شناسه تگ ۱۰ استفاده می‌کند.

مجموعه‌ای از پارامترهای مورد استفاده برای تولید یک جفت کلید منحنی بیضوی (EC)، که از ECDSA برای امضا و تأیید، در مخزن کلید سیستم اندروید استفاده می‌کند.

rsaPublicExponent
مربوط به تگ مجوز Tag::RSA_PUBLIC_EXPONENT است که از مقدار شناسه تگ ۲۰۰ استفاده می‌کند.
mgfDigest

فقط در نسخه گواهی کلید >= 100 ارائه شود.

مربوط به تگ مجوز Tag::RSA_OAEP_MGF_DIGEST در KeyMint است که از شناسه تگ با مقدار ۲۰۳ استفاده می‌کند.
rollbackResistance

فقط در نسخه گواهی کلید >= 3 ارائه شود.

مربوط به تگ مجوز Tag::ROLLBACK_RESISTANCE است که از مقدار شناسه تگ 303 استفاده می‌کند.

earlyBootOnly

فقط در نسخه گواهی کلید >= 4 ارائه شود.

مربوط به تگ مجوز Tag::EARLY_BOOT_ONLY است که از مقدار شناسه تگ ۳۰۵ استفاده می‌کند.

activeDateTime
مربوط به تگ مجوز Tag::ACTIVE_DATETIME است که از مقدار شناسه تگ ۴۰۰ استفاده می‌کند.
originationExpireDateTime
مربوط به تگ مجوز Tag::ORIGINATION_EXPIRE_DATETIME است که از مقدار شناسه تگ ۴۰۱ استفاده می‌کند.
usageExpireDateTime
مربوط به تگ مجوز Tag::USAGE_EXPIRE_DATETIME است که از مقدار شناسه تگ ۴۰۲ استفاده می‌کند.
usageCountLimit
مربوط به تگ مجوز Tag::USAGE_COUNT_LIMIT است که از مقدار شناسه تگ ۴۰۵ استفاده می‌کند.
userSecureId
مربوط به تگ مجوز Tag::USER_SECURE_ID است که از مقدار شناسه تگ ۵۰۲ استفاده می‌کند.
noAuthRequired

مربوط به تگ مجوز Tag::NO_AUTH_REQUIRED است که از مقدار شناسه تگ ۵۰۳ استفاده می‌کند.

userAuthType
مربوط به تگ مجوز Tag::USER_AUTH_TYPE است که از مقدار شناسه تگ ۵۰۴ استفاده می‌کند.
authTimeout
مربوط به تگ مجوز Tag::AUTH_TIMEOUT است که از مقدار شناسه تگ ۵۰۵ استفاده می‌کند.
allowWhileOnBody

مربوط به تگ مجوز Tag::ALLOW_WHILE_ON_BODY است که از مقدار شناسه تگ ۵۰۶ استفاده می‌کند.

اگر کاربر هنوز دستگاه را روی بدن خود داشته باشد، پس از پایان مهلت احراز هویت، امکان استفاده از کلید را فراهم می‌کند. توجه داشته باشید که یک حسگر ایمن روی بدن تعیین می‌کند که آیا دستگاه روی بدن کاربر پوشیده شده است یا خیر.

trustedUserPresenceReq

فقط در نسخه گواهی کلید >= 3 ارائه شود.

مربوط به Tag::TRUSTED_USER_PRESENCE_REQUIRED است که از مقدار شناسه برچسب ۵۰۷ استفاده می‌کند.

مشخص می‌کند که این کلید فقط در صورتی قابل استفاده است که کاربر مدرک حضور فیزیکی ارائه داده باشد. چندین مثال شامل موارد زیر است:

  • برای یک کلید StrongBox، یک دکمه سخت‌افزاری که به یک پین روی دستگاه StrongBox متصل شده است.
  • برای یک کلید TEE، احراز هویت اثر انگشت تا زمانی که TEE کنترل انحصاری اسکنر را داشته باشد و فرآیند تطبیق اثر انگشت را انجام دهد، اثبات حضور را ارائه می‌دهد.
trustedConfirmationReq

فقط در نسخه گواهی کلید >= 3 ارائه شود.

مربوط به Tag::TRUSTED_CONFIRMATION_REQUIRED است که از مقدار شناسه برچسب ۵۰۸ استفاده می‌کند.

مشخص می‌کند که کلید فقط در صورتی قابل استفاده است که کاربر با استفاده از یک توکن تأیید، تأیید داده‌هایی که قرار است امضا شوند را ارائه دهد. برای اطلاعات بیشتر در مورد نحوه دریافت تأیید کاربر، به تأیید محافظت‌شده اندروید مراجعه کنید.

نکته: این برچسب فقط برای کلیدهایی که از هدف SIGN استفاده می‌کنند، قابل استفاده است.

unlockedDeviceReq

فقط در نسخه گواهی کلید >= 3 ارائه شود.

مربوط به Tag::UNLOCKED_DEVICE_REQUIRED است که از مقدار شناسه برچسب ۵۰۹ استفاده می‌کند.

creationDateTime
مربوط به تگ مجوز Tag::CREATION_DATETIME است که از مقدار شناسه تگ ۷۰۱ استفاده می‌کند.
origin

مربوط به تگ مجوز Tag::ORIGIN است که از مقدار شناسه تگ ۷۰۲ استفاده می‌کند.

rootOfTrust

مربوط به تگ مجوز Tag::ROOT_OF_TRUST است که از مقدار شناسه تگ ۷۰۴ استفاده می‌کند.

برای جزئیات بیشتر، به بخش توصیف ساختار داده RootOfTrust مراجعه کنید.

osVersion

مربوط به تگ مجوز Tag::OS_VERSION است که از مقدار شناسه تگ ۷۰۵ استفاده می‌کند.

نسخه سیستم عامل اندروید مرتبط با Keymaster که به صورت یک عدد صحیح شش رقمی مشخص می‌شود. برای مثال، نسخه ۸.۱.۰ به صورت ۰۸۰۱۰۰ نمایش داده می‌شود.

فقط Keymaster نسخه ۱.۰ یا بالاتر این مقدار را در لیست مجوزها قرار می‌دهد.

osPatchLevel

مربوط به برچسب مجوز Tag::PATCHLEVEL است که از مقدار شناسه برچسب ۷۰۶ استفاده می‌کند.

ماه و سال مرتبط با وصله امنیتی که در Keymaster استفاده می‌شود، که به صورت یک عدد صحیح شش رقمی مشخص شده است. به عنوان مثال، وصله آگوست ۲۰۱۸ به صورت ۲۰۱۸۰۸ نمایش داده می‌شود.

فقط Keymaster نسخه ۱.۰ یا بالاتر این مقدار را در لیست مجوزها قرار می‌دهد.

attestationApplicationId

فقط در نسخه‌های گواهی کلید >= ۲ ارائه می‌شود.

مربوط به برچسب مجوز Tag::ATTESTATION_APPLICATION_ID است که از مقدار شناسه برچسب ۷۰۹ استفاده می‌کند.

برای جزئیات بیشتر، به بخش توصیف ساختار داده‌ی AttestationApplicationId مراجعه کنید.

attestationIdBrand

فقط در نسخه‌های گواهی کلید >= ۲ ارائه می‌شود.

مربوط به برچسب مجوز Tag::ATTESTATION_ID_BRAND است که از مقدار شناسه برچسب ۷۱۰ استفاده می‌کند.

attestationIdDevice

فقط در نسخه‌های گواهی کلید >= ۲ ارائه می‌شود.

مربوط به برچسب مجوز Tag::ATTESTATION_ID_DEVICE است که از مقدار شناسه برچسب ۷۱۱ استفاده می‌کند.

attestationIdProduct

فقط در نسخه‌های گواهی کلید >= ۲ ارائه می‌شود.

مربوط به برچسب مجوز Tag::ATTESTATION_ID_PRODUCT است که از مقدار شناسه برچسب ۷۱۲ استفاده می‌کند.

attestationIdSerial

فقط در نسخه‌های گواهی کلید >= ۲ ارائه می‌شود.

مربوط به برچسب مجوز Tag::ATTESTATION_ID_SERIAL است که از مقدار شناسه برچسب ۷۱۳ استفاده می‌کند.

attestationIdImei

فقط در نسخه‌های گواهی کلید >= ۲ ارائه می‌شود.

مربوط به برچسب مجوز Tag::ATTESTATION_ID_IMEI است که از مقدار شناسه برچسب ۷۱۴ استفاده می‌کند.

attestationIdMeid

فقط در نسخه‌های گواهی کلید >= ۲ ارائه می‌شود.

مربوط به برچسب مجوز Tag::ATTESTATION_ID_MEID است که از مقدار شناسه برچسب ۷۱۵ استفاده می‌کند.

attestationIdManufacturer

فقط در نسخه‌های گواهی کلید >= ۲ ارائه می‌شود.

مربوط به Tag::ATTESTATION_ID_MANUFACTURER است که از مقدار شناسه برچسب ۷۱۶ استفاده می‌کند.

attestationIdModel

فقط در نسخه‌های گواهی کلید >= ۲ ارائه می‌شود.

مربوط به برچسب مجوز Tag::ATTESTATION_ID_MODEL است که از مقدار شناسه برچسب ۷۱۷ استفاده می‌کند.

vendorPatchLevel

فقط در نسخه‌های گواهی کلید >= 3 ارائه می‌شود.

مربوط به برچسب مجوز Tag::VENDOR_PATCHLEVEL است که از مقدار شناسه برچسب ۷۱۸ استفاده می‌کند.

سطح وصله امنیتی تصویر فروشنده را که باید برای استفاده از این کلید روی دستگاه نصب شود، مشخص می‌کند. مقدار به شکل YYYYMMDD ظاهر می‌شود که نشان دهنده تاریخ وصله امنیتی فروشنده است. برای مثال، اگر کلیدی در دستگاه اندرویدی با نصب وصله امنیتی ۱ آگوست ۲۰۱۸ فروشنده ایجاد شود، این مقدار ۲۰۱۸۰۸۰۱ خواهد بود.

bootPatchLevel

فقط در نسخه‌های گواهی کلید >= 3 ارائه می‌شود.

مربوط به برچسب مجوز Tag::BOOT_PATCHLEVEL است که از مقدار شناسه برچسب ۷۱۹ استفاده می‌کند.

سطح وصله امنیتی تصویر هسته را که باید برای استفاده از این کلید روی دستگاه نصب شود، مشخص می‌کند. مقدار به شکل YYYYMMDD ظاهر می‌شود که نشان دهنده تاریخ وصله امنیتی سیستم است. به عنوان مثال، اگر کلیدی در دستگاه اندرویدی با وصله امنیتی ۵ آگوست ۲۰۱۸ سیستم ایجاد شود، این مقدار ۲۰۱۸۰۸۰۵ خواهد بود.

deviceUniqueAttestation

فقط در نسخه‌های گواهی کلید >= 4 ارائه می‌شود.

مربوط به Tag::DEVICE_UNIQUE_ATTESTATION است که از مقدار شناسه برچسب ۷۲۰ استفاده می‌کند.

attestationIdSecondImei

فقط در نسخه‌های گواهی کلید >= 300 ارائه می‌شود.

مربوط به برچسب مجوز Tag::ATTESTATION_ID_SECOND_IMEI است که از مقدار شناسه برچسب ۷۲۳ استفاده می‌کند.

moduleHash

فقط در نسخه‌های گواهی کلید >= ۴۰۰ ارائه می‌شود.

مربوط به تگ مجوز Tag::MODULE_HASH است که از مقدار شناسه تگ ۷۲۴ استفاده می‌کند.

فیلدهای RootOfTrust

verifiedBootKey
یک هش امن از کلید عمومی که برای تأیید صحت و اعتبار تمام کدهایی که هنگام بوت شدن دستگاه به عنوان بخشی از Verified Boot اجرا می‌شوند، استفاده می‌شود. SHA-256 توصیه می‌شود.
deviceLocked
آیا بوت لودر دستگاه قفل شده است یا خیر. true به این معنی است که دستگاه یک ایمیج امضا شده را بوت کرده است که با موفقیت توسط Verified Boot تأیید شده است.
verifiedBootState
وضعیت بوت تأیید شده دستگاه.
verifiedBootHash
خلاصه‌ای از تمام داده‌های محافظت‌شده توسط Verified Boot . برای دستگاه‌هایی که از پیاده‌سازی مرجع Android Verified Boot استفاده می‌کنند، این فیلد حاوی خلاصه VBMeta است.

مقادیر تأیید شده‌ی BootState

ارزش وضعیت بوت مربوطه معنی
Verified GREEN یک زنجیره کامل اعتماد از یک ریشه اعتماد محافظت‌شده توسط سخت‌افزار تا بوت‌لودر و تمام پارتیشن‌های تأییدشده توسط Verified Boot امتداد می‌یابد. در این حالت، فیلد verifiedBootKey حاوی هش ریشه اعتماد تعبیه‌شده است که همان گواهی تعبیه‌شده در ROM دستگاه توسط سازنده دستگاه در کارخانه است.
SelfSigned YELLOW همانند حالت Verified است، با این تفاوت که تأیید با استفاده از ریشه اعتمادی که توسط کاربر پیکربندی شده است، به جای ریشه اعتمادی که توسط سازنده در کارخانه تعبیه شده است، انجام شده است. در این حالت، فیلد verifiedBootKey حاوی هش کلید عمومی پیکربندی شده توسط کاربر است.
Unverified ORANGE بوت لودر دستگاه قفل‌گشایی شده است، بنابراین نمی‌توان زنجیره اعتمادی ایجاد کرد. دستگاه را می‌توان آزادانه تغییر داد، بنابراین یکپارچگی دستگاه باید توسط کاربر خارج از باند تأیید شود. در این حالت، فیلد verifiedBootKey حاوی ۳۲ بایت صفر است.
Failed RED تأیید دستگاه ناموفق بود. در این حالت، هیچ تضمینی در مورد محتوای سایر فیلدهای RootOfTrust وجود ندارد.

شناسه برنامه گواهی

این فیلد، باور پلتفرم اندروید را در مورد اینکه کدام برنامه‌ها مجاز به استفاده از کلید مخفی تحت گواهی هستند، منعکس می‌کند. این فیلد می‌تواند شامل چندین بسته باشد، اگر و تنها اگر چندین بسته، UID یکسانی داشته باشند. فیلد AttestationApplicationId در AuthorizationList از نوع OCTET_STRING است و طبق طرح 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

مجموعه‌ای از خلاصه‌های SHA-256 از گواهی‌های امضای برنامه. یک برنامه می‌تواند چندین زنجیره گواهی کلید امضا داشته باشد. برای هر کدام، گواهی "leaf" خلاصه شده و در فیلد signature_digests قرار می‌گیرد. نام فیلد گمراه‌کننده است، زیرا داده‌های خلاصه شده گواهی‌های امضای برنامه هستند، نه امضاهای برنامه، زیرا برای کلاس Signature که توسط فراخوانی getPackageInfo() برگردانده می‌شود، نامگذاری شده است. قطعه کد زیر یک مجموعه مثال را نشان می‌دهد:

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

افزونه‌ی اطلاعات تأمین‌کننده

افزونه‌ی اطلاعات تأمین‌کننده دارای OID 1.3.6.1.4.1.11129.2.1.30 است. این افزونه اطلاعاتی را که توسط سرور تأمین‌کننده در مورد دستگاه شناخته شده است، ارائه می‌دهد.

طرحواره

مقدار افزونه شامل داده‌های نمایش مختصر شیء دودویی (CBOR) است که با این طرحواره زبان تعریف مختصر داده‌ها (CDDL) مطابقت دارد:

  {
        1 : int,       ; certificates issued
        4 : string,    ; validated attested entity (STRONG_BOX/TEE)
  }

نقشه بدون نسخه است و ممکن است فیلدهای اختیاری جدیدی اضافه شود.

certs_issued

تعداد تقریبی گواهی‌های صادر شده برای دستگاه در 30 روز گذشته. اگر این مقدار چند برابر بیشتر از میانگین باشد، می‌تواند به عنوان نشانه‌ای برای سوءاستفاده احتمالی مورد استفاده قرار گیرد.

validated_attested_entity

موجودیت گواهی‌شده‌ی اعتبارسنجی‌شده، رشته‌ای است که نوع دستگاهی را که توسط سرور تأمین‌کننده برای گواهی شدن تأیید شده است، توصیف می‌کند. برای مثال، STRONG_BOX یا TEE .

کلیدهای تأیید

دو کلید، یکی RSA و یکی ECDSA، و زنجیره‌های گواهی مربوطه، به طور ایمن در دستگاه تعبیه شده‌اند.

اندروید ۱۲ قابلیت تأمین کلید از راه دور (Remote Key Provisioning) را معرفی کرد و اندروید ۱۵ از همه دستگاه‌ها می‌خواهد که آن را پیاده‌سازی کنند. تأمین کلید از راه دور، گواهی‌های تأیید ECDSA P256 را برای هر برنامه در اختیار دستگاه‌های موجود در محل قرار می‌دهد. این گواهی‌ها نسبت به گواهی‌های تأمین‌شده توسط کارخانه، عمر کوتاه‌تری دارند.

شناسه منحصر به فرد

شناسه منحصر به فرد یک مقدار ۱۲۸ بیتی است که دستگاه را شناسایی می‌کند، اما فقط برای مدت زمان محدودی. این مقدار با فرمول زیر محاسبه می‌شود:

HMAC_SHA256(T || C || R, HBK)

کجا:

  • T «مقدار شمارنده زمانی» است که با تقسیم مقدار Tag::CREATION_DATETIME بر ۲۵۹۲۰۰۰۰۰۰ و حذف باقیمانده محاسبه می‌شود. T هر ۳۰ روز یکبار تغییر می‌کند (۲۵۹۲۰۰۰۰۰۰ = ۳۰ * ۲۴ * ۶۰ * ۶۰ * ۱۰۰۰).
  • C مقدار Tag::APPLICATION_ID است.
  • اگر Tag::RESET_SINCE_ID_ROTATION در پارامتر attest_params در فراخوانی attest_key وجود داشته باشد، R برابر با ۱ است، و اگر برچسب وجود نداشته باشد، برابر با ۰ است.
  • HBK یک راز منحصر به فرد وابسته به سخت‌افزار است که برای محیط اجرای قابل اعتماد (Trusted Execution Environment) شناخته شده است و هرگز توسط آن فاش نشده است. این راز حاوی حداقل ۱۲۸ بیت آنتروپی است و برای هر دستگاه منحصر به فرد است (با توجه به ۱۲۸ بیت آنتروپی، منحصر به فرد بودن احتمالی قابل قبول است). HBK باید از طریق HMAC یا AES_CMAC از مواد کلید ترکیبی استخراج شود.

خروجی HMAC_SHA256 را به ۱۲۸ بیت کوتاه کنید.

چندین IMEI

اندروید ۱۴ پشتیبانی از چندین IMEI را در رکورد Android Key Attestation اضافه می‌کند. تولیدکنندگان اصلی تجهیزات (OEM) می‌توانند این ویژگی را با اضافه کردن یک برچسب KeyMint برای IMEI دوم پیاده‌سازی کنند. داشتن چندین رادیوی سلولی برای دستگاه‌ها به طور فزاینده‌ای رایج شده است و تولیدکنندگان اصلی تجهیزات اکنون می‌توانند از دستگاه‌هایی با دو IMEI پشتیبانی کنند.

تولیدکنندگان اصلی تجهیزات (OEM) موظفند در صورت وجود IMEI ثانویه در دستگاه‌های خود، آن را برای پیاده‌سازی (یا پیاده‌سازی‌های) KeyMint آماده کنند تا آن پیاده‌سازی‌ها بتوانند آن را به همان روشی که IMEI اول را تأیید می‌کنند، تأیید کنند.

تأیید هویت

اندروید ۸.۰ شامل پشتیبانی اختیاری برای تأیید هویت برای دستگاه‌هایی با Keymaster 3 است. تأیید هویت به دستگاه اجازه می‌دهد تا مدرکی برای شناسه‌های سخت‌افزاری خود، مانند شماره سریال یا IMEI، ارائه دهد. اگرچه یک ویژگی اختیاری است، اکیداً توصیه می‌شود که تمام پیاده‌سازی‌های Keymaster 3 از آن پشتیبانی کنند زیرا توانایی اثبات هویت دستگاه، موارد استفاده مانند پیکربندی از راه دور بدون تماس واقعی را ایمن‌تر می‌کند (زیرا طرف از راه دور می‌تواند مطمئن باشد که با دستگاه درست صحبت می‌کند، نه دستگاهی که هویت آن را جعل می‌کند).

گواهی شناسه با ایجاد کپی‌هایی از شناسه‌های سخت‌افزاری دستگاه کار می‌کند که فقط TEE می‌تواند قبل از خروج دستگاه از کارخانه به آنها دسترسی داشته باشد. کاربر می‌تواند بوت‌لودر دستگاه را باز کند و نرم‌افزار سیستم و شناسه‌های گزارش شده توسط چارچوب‌های اندروید را تغییر دهد. کپی‌های شناسه‌های نگهداری شده توسط TEE را نمی‌توان از این طریق دستکاری کرد، و تضمین می‌کند که گواهی شناسه دستگاه فقط شناسه‌های سخت‌افزاری اصلی دستگاه را تأیید می‌کند و در نتیجه تلاش‌های جعل را خنثی می‌کند.

سطح اصلی API برای گواهی شناسه بر روی مکانیزم گواهی کلید موجود که با Keymaster 2 معرفی شد، ساخته شده است. هنگام درخواست گواهی گواهی برای کلیدی که در اختیار Keymaster است، تماس‌گیرنده می‌تواند درخواست کند که شناسه‌های سخت‌افزاری دستگاه در فراداده گواهی گواهی گنجانده شوند. اگر کلید در TEE نگهداری شود، گواهی به یک ریشه اعتماد شناخته‌شده زنجیر می‌شود. گیرنده چنین گواهی می‌تواند تأیید کند که گواهی و محتویات آن، از جمله شناسه‌های سخت‌افزاری، توسط TEE نوشته شده است. هنگامی که از TEE خواسته می‌شود شناسه‌های سخت‌افزاری را در گواهی گواهی بگنجاند، TEE فقط شناسه‌های موجود در انبار خود را، همانطور که در کارخانه قرار گرفته‌اند، گواهی می‌دهد.

خواص ذخیره سازی

حافظه‌ای که شناسه‌های دستگاه را در خود نگه می‌دارد، باید این ویژگی‌ها را داشته باشد:

  • مقادیر به‌دست‌آمده از شناسه‌های اصلی دستگاه، قبل از خروج دستگاه از کارخانه، در حافظه کپی می‌شوند.
  • متد destroyAttestationIds() می‌تواند این کپی از داده‌های مشتق‌شده از شناسه را به‌طور دائم از بین ببرد. تخریب دائمی به این معنی است که داده‌ها به‌طور کامل حذف می‌شوند، به‌طوری که نه تنظیم مجدد کارخانه و نه هیچ روش دیگری که روی دستگاه انجام می‌شود، نمی‌تواند آن را بازیابی کند. این امر به‌ویژه برای دستگاه‌هایی که کاربر قفل بوت‌لودر را باز کرده و نرم‌افزار سیستم را تغییر داده و شناسه‌های برگردانده‌شده توسط چارچوب‌های اندروید را اصلاح کرده است، اهمیت دارد.
  • مراکز RMA باید توانایی تولید کپی‌های جدید از داده‌های مشتق‌شده از شناسه سخت‌افزاری را داشته باشند. به این ترتیب، دستگاهی که از RMA عبور می‌کند می‌تواند دوباره گواهی شناسه را انجام دهد. مکانیسم مورد استفاده مراکز RMA باید محافظت شود تا کاربران نتوانند خودشان آن را فراخوانی کنند، زیرا این امر به آنها اجازه می‌دهد گواهی شناسه‌های جعلی را دریافت کنند.
  • هیچ کدی غیر از برنامه‌ی مورد اعتماد Keymaster در TEE قادر به خواندن داده‌های مشتق‌شده از شناسه‌ی نگهداری‌شده در حافظه نیست.
  • فضای ذخیره‌سازی در برابر دستکاری مقاوم است: اگر محتوای فضای ذخیره‌سازی تغییر کرده باشد، TEE با آن مانند زمانی که کپی‌های محتوا از بین رفته‌اند رفتار می‌کند و تمام تلاش‌های تأیید هویت را رد می‌کند. این کار با امضا یا MAC کردن فضای ذخیره‌سازی همانطور که در زیر توضیح داده شده است، پیاده‌سازی می‌شود.
  • این ذخیره‌سازی، شناسه‌های اصلی را در خود نگه نمی‌دارد. از آنجا که تأیید شناسه با چالشی همراه است، فراخوانی‌کننده همیشه شناسه‌هایی را که باید تأیید شوند، ارائه می‌دهد. TEE فقط باید تأیید کند که این شناسه‌ها با مقادیری که در ابتدا داشته‌اند، مطابقت دارند. ذخیره‌سازی هش‌های امن از مقادیر اصلی به جای خود مقادیر، این تأیید را امکان‌پذیر می‌کند.

ساخت و ساز

برای ایجاد پیاده‌سازی که ویژگی‌های ذکر شده در بالا را داشته باشد، مقادیر مشتق شده از شناسه را در ساختار S زیر ذخیره کنید. کپی‌های دیگری از مقادیر شناسه را ذخیره نکنید، به جز مکان‌های عادی در سیستم که صاحب دستگاه می‌تواند با روت کردن آنها را تغییر دهد:

S = D || HMAC(HBK, D)

کجا:

  • D = HMAC(HBK, ID 1 ) || HMAC(HBK, ID 2 ) || ... || HMAC(HBK, ID n )
  • HMAC ساختار HMAC با یک هش امن مناسب است (توصیه می‌شود از SHA-256 استفاده شود)
  • HBK یک کلید سخت‌افزاری است که برای هیچ هدف دیگری استفاده نمی‌شود.
  • ID 1 ...ID n مقادیر اصلی ID هستند؛ ارتباط یک مقدار خاص با یک شاخص خاص وابسته به پیاده‌سازی است، زیرا دستگاه‌های مختلف تعداد شناسه‌های متفاوتی دارند.
  • || نشان دهنده الحاق است

از آنجا که خروجی‌های HMAC اندازه ثابتی دارند، برای یافتن هش‌های شناسه منفرد یا HMAC مربوط به D، نیازی به هدر یا ساختار دیگری نیست. علاوه بر بررسی مقادیر ارائه شده برای انجام گواهی، پیاده‌سازی‌ها باید S را با استخراج D از S، محاسبه HMAC(HBK, D) و مقایسه آن با مقدار موجود در S اعتبارسنجی کنند تا تأیید شود که هیچ شناسه منفردی تغییر/خراب نشده است. همچنین، پیاده‌سازی‌ها باید از مقایسه‌های زمان ثابت برای همه عناصر شناسه منفرد و اعتبارسنجی S استفاده کنند. زمان مقایسه باید صرف نظر از تعداد شناسه‌های ارائه شده و تطابق صحیح هر بخش از آزمون، ثابت باشد.

شناسه‌های سخت‌افزاری

گواهی شناسایی از شناسه‌های سخت‌افزاری زیر پشتیبانی می‌کند:

  1. نام تجاری، همانطور که توسط Build.BRAND در اندروید برگردانده می‌شود
  2. نام دستگاه، همانطور که توسط Build.DEVICE در اندروید برگردانده می‌شود
  3. نام محصول، همانطور که توسط Build.PRODUCT در اندروید برگردانده می‌شود
  4. نام سازنده، همانطور که توسط Build.MANUFACTURER در اندروید برگردانده می‌شود
  5. نام مدل، همانطور که توسط Build.MODEL در اندروید برگردانده می‌شود
  6. شماره سریال
  7. IMEI همه رادیوها
  8. شناسه‌های MEID همه رادیوها

برای پشتیبانی از گواهی شناسه دستگاه، دستگاه این شناسه‌ها را گواهی می‌کند. همه دستگاه‌هایی که اندروید را اجرا می‌کنند، شش مورد اول را دارند و برای عملکرد این ویژگی ضروری هستند. اگر دستگاه دارای هرگونه رادیوی تلفن همراه یکپارچه باشد، دستگاه باید از گواهی IMEI و/یا MEID رادیوها نیز پشتیبانی کند.

تأیید شناسه با انجام یک تأیید کلید و گنجاندن شناسه‌های دستگاه برای تأیید در درخواست، درخواست می‌شود. شناسه‌ها به صورت زیر برچسب‌گذاری می‌شوند:

  • ATTESTATION_ID_BRAND
  • ATTESTATION_ID_DEVICE
  • ATTESTATION_ID_PRODUCT
  • ATTESTATION_ID_MANUFACTURER
  • ATTESTATION_ID_MODEL
  • ATTESTATION_ID_SERIAL
  • ATTESTATION_ID_IMEI
  • ATTESTATION_ID_MEID

شناسه‌ای که باید گواهی شود، یک رشته بایت کدگذاری شده با UTF-8 است. این قالب برای شناسه‌های عددی نیز اعمال می‌شود. هر شناسه‌ای که باید گواهی شود، به صورت یک رشته کدگذاری شده با UTF-8 بیان می‌شود.

اگر دستگاه از تأیید شناسه پشتیبانی نکند (یا قبلاً تابع destroyAttestationIds() فراخوانی شده باشد و دستگاه دیگر نتواند شناسه‌های خود را تأیید کند)، هرگونه درخواست تأیید کلید که شامل یک یا چند مورد از این برچسب‌ها باشد، با ErrorCode::CANNOT_ATTEST_IDS مواجه می‌شود.

اگر دستگاه از گواهی شناسه پشتیبانی کند و یک یا چند مورد از برچسب‌های فوق در درخواست گواهی کلید گنجانده شده باشند، TEE تأیید می‌کند که شناسه ارائه شده با هر یک از برچسب‌ها با کپی شناسه‌های سخت‌افزاری آن مطابقت دارد. اگر یک یا چند شناسه مطابقت نداشته باشند، کل گواهی با ErrorCode::CANNOT_ATTEST_IDS رد می‌شود. معتبر است که یک برچسب چندین بار ارائه شود. این می‌تواند مفید باشد، به عنوان مثال، هنگام تأیید IMEIها: یک دستگاه می‌تواند چندین رادیو با چندین IMEI داشته باشد. یک درخواست گواهی در صورتی معتبر است که مقدار ارائه شده با هر ATTESTATION_ID_IMEI با یکی از رادیوهای دستگاه مطابقت داشته باشد. همین امر در مورد سایر برچسب‌ها نیز صدق می‌کند.

اگر گواهی موفقیت‌آمیز باشد، شناسه‌های گواهی‌شده با استفاده از طرحواره‌ی بالا به افزونه‌ی گواهی (OID 1.3.6.1.4.1.11129.2.1.17) گواهی گواهی صادرشده اضافه می‌شوند. تغییرات نسبت به طرحواره‌ی گواهی Keymaster 2 پررنگ شده و توضیحاتی در مورد آنها ارائه شده است.

رابط برنامه‌نویسی جاوا

این بخش صرفاً جهت اطلاع‌رسانی است. مجریان اصلی نه API جاوا را پیاده‌سازی می‌کنند و نه از آن استفاده می‌کنند. این بخش برای کمک به مجریان در درک نحوه استفاده از این ویژگی توسط برنامه‌ها ارائه شده است. اجزای سیستم ممکن است از آن به طور متفاوتی استفاده کنند، به همین دلیل بسیار مهم است که این بخش به عنوان یک بخش عادی تلقی نشود.