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

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

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

برای رفع این مشکل، Keymaster گواهینامه کلید را در Android 7.0 (Keymaster 2) و گواهی ID را در Android 8.0 (Keymaster 3) معرفی کرد.

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

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

گواهی کلیدی

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

برچسب ها

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

تایپ کنید

Keymaster 2 و پایین تر

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

روش AttestKey

کی مستر 3

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

Keymaster 2 و پایین تر

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 ساختار دستگاه کی مستر است.
  • keyToAttest حباب کلیدی است که از generateKey بازگردانده شده است که گواهی برای آن ایجاد شده است.
  • attestParams لیستی از پارامترهای لازم برای تأیید است. این شامل Tag::ATTESTATION_CHALLENGE و احتمالاً Tag::RESET_SINCE_ID_ROTATION ، و همچنین Tag::APPLICATION_ID و Tag::APPLICATION_DATA است. دو مورد آخر برای رمزگشایی حباب کلید در صورتی که در طول تولید کلید مشخص شده باشند، ضروری هستند.
  • certChain پارامتر خروجی است که آرایه ای از گواهی ها را برمی گرداند. ورودی 0 گواهی گواهی است، به این معنی که کلید را از keyToAttest تأیید می کند و حاوی پسوند گواهی است.

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

گواهی تصدیق

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

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

SEQUENCE گواهی

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

SEQUENCE گواهی TBSC

نام فیلد (به RFC 5280 مراجعه کنید) ارزش
version INTEGER 2 (به معنای گواهی v3)
serialNumber INTEGER 1 (مقدار ثابت: در همه گواهی ها یکسان است)
signature AlgorithmIdentifier الگوریتم مورد استفاده برای علامت گذاری کلید: ECDSA برای کلیدهای EC، RSA برای کلیدهای RSA.
issuer مانند فیلد موضوع کلید تأیید دسته ای.
validity SEQUENCE از دو تاریخ، حاوی مقادیر Tag::ACTIVE_DATETIME و Tag::USAGE_EXPIRE_DATETIME . این مقادیر از 1 ژانویه 1970 بر حسب میلی ثانیه هستند. برای نمایش صحیح تاریخ در گواهی ها به RFC 5280 مراجعه کنید.
اگر Tag::ACTIVE_DATETIME وجود ندارد، از مقدار Tag::CREATION_DATETIME استفاده کنید. اگر Tag::USAGE_EXPIRE_DATETIME وجود ندارد، از تاریخ انقضای گواهی کلید تأیید دسته استفاده کنید.
subject CN = "Android Keystore Key" (مقدار ثابت: در همه گواهی ها یکسان است)
subjectPublicKeyInfo SubjectPublicKeyInfo حاوی کلید عمومی تایید شده.
extensions/Key Usage DigitalSignature: تنظیم کنید که آیا کلید هدفی دارد KeyPurpose::SIGN یا KeyPurpose::VERIFY . همه بیت های دیگر تنظیم نشده است.
extensions/CRL Distribution Points ارزش TBD
extensions/"attestation" OID 1.3.6.1.4.1.11129.2.1.17 است. محتوا در بخش پسوند گواهی در زیر تعریف شده است. مانند تمام پسوندهای گواهی X.509، محتوا به صورت OCTET_STRING حاوی رمزگذاری DER از SEQUENCE گواهی نمایش داده می شود.

تمدید تصدیق

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

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

نوع Keymaster/KeyMint نوع 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 میلی ثانیه از 1 ژانویه 1970 ساعت 00:00:00 GMT.
BOOL NULL تگ حضور به معنای واقعی است، غیبت به معنای نادرست است.
BIGNUM هیچ برچسبی این نوع را ندارد، بنابراین هیچ نقشه برداری تعریف نشده است.
BYTES OCTET_STRING

طرحواره

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

نسخه 300

KeyDescription ::= SEQUENCE {
    attestationVersion  300,
    attestationSecurityLevel  SecurityLevel,
    keyMintVersion  INTEGER,
    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,
    trustedUserPresenceRequired  [507] EXPLICIT NULL OPTIONAL,
    trustedConfirmationRequired  [508] EXPLICIT NULL OPTIONAL,
    unlockedDeviceRequired  [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),
}

نسخه 200

KeyDescription ::= SEQUENCE {
    attestationVersion  200,
    attestationSecurityLevel  SecurityLevel,
    keyMintVersion  INTEGER,
    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,
    trustedUserPresenceRequired  [507] EXPLICIT NULL OPTIONAL,
    trustedConfirmationRequired  [508] EXPLICIT NULL OPTIONAL,
    unlockedDeviceRequired  [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),
}

نسخه 100

KeyDescription ::= SEQUENCE {
    attestationVersion  100,
    attestationSecurityLevel  SecurityLevel,
    keyMintVersion  INTEGER,
    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,
    trustedUserPresenceRequired  [507] EXPLICIT NULL OPTIONAL,
    trustedConfirmationRequired  [508] EXPLICIT NULL OPTIONAL,
    unlockedDeviceRequired  [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),
}

نسخه 4

KeyDescription ::= SEQUENCE {
    attestationVersion  4,
    attestationSecurityLevel  SecurityLevel,
    keymasterVersion  INTEGER,
    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,
    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,
    earlyBootOnly  [305] 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,
    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),
}

نسخه 3

KeyDescription ::= SEQUENCE {
    attestationVersion  3,
    attestationSecurityLevel  SecurityLevel,
    keymasterVersion  INTEGER,
    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,
    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,
    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,
    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),
}

نسخه 1

KeyDescription ::= SEQUENCE {
    attestationVersion  1,
    attestationSecurityLevel  SecurityLevel,
    keymasterVersion  INTEGER,
    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.
ارزش نسخه Keymaster/KeyMint
1 کی مستر نسخه 2.0
2 کی مستر نسخه 3.0
3 کی مستر نسخه 4.0
4 کی مستر نسخه 4.1
100 KeyMint نسخه 1.0
200 KeyMint نسخه 2.0
300 KeyMint نسخه 3.0
attestationSecurityLevel

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

keymasterVersion / keyMintVersion
نسخه اجرای لایه انتزاعی سخت افزاری Keymaster/KeyMint (HAL).
ارزش نسخه Keymaster/KeyMint
2 کی مستر نسخه 2.0
3 کی مستر نسخه 3.0
4 کی مستر نسخه 4.0
41 کی مستر نسخه 4.1
100 KeyMint نسخه 1.0
200 KeyMint نسخه 2.0
300 KeyMint نسخه 3.0
keymasterSecurityLevel / keyMintSecurityLevel
سطح امنیتی اجرای Keymaster/KeyMint.
attestationChallenge
چالش ارائه شده در زمان تولید کلید.
uniqueId
یک شناسه دستگاه حساس به حریم خصوصی که برنامه‌های سیستم می‌توانند در زمان تولید کلید درخواست کنند. اگر شناسه منحصر به فرد درخواست نشود، این قسمت خالی است. برای جزئیات، بخش شناسه منحصر به فرد را ببینید.
softwareEnforced
لیست مجوزهای Keymaster/KeyMint که توسط سیستم Android اعمال می شود. این اطلاعات توسط کد در پلتفرم جمع آوری یا تولید می شود و در پارتیشن سیستم دستگاه ذخیره می شود. تا زمانی که دستگاه دارای سیستم عاملی است که با مدل امنیتی پلتفرم Android مطابقت دارد (یعنی بوت لودر دستگاه قفل شده و verifiedBootState Verified باشد) قابل اعتماد است.
hardwareEnforced
لیست مجوز Keymaster/KeyMint که توسط Trusted Execution Environment (TEE) یا StrongBox دستگاه اعمال می‌شود. این اطلاعات با کد موجود در سخت افزار امن جمع آوری یا تولید می شود و توسط پلتفرم کنترل نمی شود. به عنوان مثال، اطلاعات می تواند از بوت لودر یا از طریق یک کانال ارتباطی امن که شامل اعتماد به پلت فرم نیست، به دست آید.

مقادیر SecurityLevel

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

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

فیلدهای AuthorizationList

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

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

purpose
مربوط به Tag::PURPOSE است که از مقدار شناسه برچسب 1 استفاده می کند.
algorithm

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

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

keySize
مربوط به برچسب مجوز Tag::KEY_SIZE است که از مقدار شناسه برچسب 3 استفاده می کند.
digest
مربوط به تگ مجوز Tag::DIGEST است که از مقدار شناسه برچسب 5 استفاده می کند.
padding
مربوط به برچسب مجوز Tag::PADDING است که از مقدار شناسه برچسب 6 استفاده می کند.
ecCurve

مربوط به برچسب مجوز Tag::EC_CURVE است که از مقدار شناسه برچسب 10 استفاده می کند.

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

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

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

مربوط به Tag::RSA_OAEP_MGF_DIGEST مجوز KeyMint است که از مقدار شناسه برچسب 203 استفاده می کند.
rollbackResistance

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

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

earlyBootOnly

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

مربوط به برچسب مجوز Tag::EARLY_BOOT_ONLY است که از مقدار شناسه برچسب 305 استفاده می کند.

activeDateTime
مربوط به برچسب مجوز Tag::ACTIVE_DATETIME است که از مقدار شناسه برچسب 400 استفاده می کند.
originationExpireDateTime
مربوط به Tag::ORIGINATION_EXPIRE_DATETIME مجوز Keymaster است که از مقدار شناسه برچسب 401 استفاده می کند.
usageExpireDateTime
مربوط به برچسب مجوز Tag::USAGE_EXPIRE_DATETIME است که از مقدار شناسه برچسب 402 استفاده می کند.
usageCountLimit
مربوط به Tag::USAGE_COUNT_LIMIT است که از مقدار شناسه برچسب 405 استفاده می کند.
noAuthRequired

مربوط به برچسب مجوز Tag::NO_AUTH_REQUIRED است که از مقدار شناسه برچسب 503 استفاده می کند.

userAuthType
مربوط به برچسب مجوز Tag::USER_AUTH_TYPE است که از مقدار شناسه برچسب 504 استفاده می کند.
authTimeout
مربوط به برچسب مجوز Tag::AUTH_TIMEOUT است که از مقدار شناسه برچسب 505 استفاده می کند.
allowWhileOnBody

مربوط به برچسب مجوز Tag::ALLOW_WHILE_ON_BODY است که از مقدار شناسه برچسب 506 استفاده می کند.

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

trustedUserPresenceRequired

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

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

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

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

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

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

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

توجه: این تگ فقط برای کلیدهایی که از هدف SIGN استفاده می کنند قابل استفاده است.

unlockedDeviceRequired

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

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

allApplications

مربوط به برچسب مجوز Tag::ALL_APPLICATIONS است که از مقدار شناسه برچسب 600 استفاده می کند.

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

applicationId
مربوط به تگ مجوز Tag::APPLICATION_ID است که از مقدار شناسه برچسب 601 استفاده می کند.
creationDateTime
مربوط به برچسب مجوز Tag::CREATION_DATETIME است که از مقدار شناسه برچسب 701 استفاده می کند.
origin

مربوط به تگ مجوز Tag::ORIGIN است که از مقدار شناسه برچسب 702 استفاده می کند.

rollbackResistant

فقط در گواهینامه های کلیدی نسخه های 1 و 2 ارائه شود.

مربوط به برچسب مجوز Tag::ROLLBACK_RESISTANT است که از مقدار شناسه برچسب 703 استفاده می کند.

rootOfTrust

مربوط به تگ مجوز Tag::ROOT_OF_TRUST است که از مقدار شناسه برچسب 704 استفاده می کند.

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

osVersion

مربوط به تگ مجوز Tag::OS_VERSION است که از مقدار شناسه برچسب 705 استفاده می کند.

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

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

osPatchLevel

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

ماه و سال مرتبط با وصله امنیتی که در Keymaster استفاده می شود، به عنوان یک عدد صحیح شش رقمی مشخص شده است. به عنوان مثال، پچ آگوست 2018 به عنوان 201808 نشان داده شده است.

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

attestationApplicationId

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

مربوط به Tag::ATTESTATION_APPLICATION_ID مجوز Keymaster است که از مقدار شناسه برچسب 709 استفاده می کند.

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

attestationIdBrand

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

مربوط به Tag::ATTESTATION_ID_BRAND Keymaster است که از مقدار شناسه برچسب 710 استفاده می کند.

attestationIdDevice

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

مربوط به Tag::ATTESTATION_ID_DEVICE Keymaster است که از مقدار شناسه برچسب 711 استفاده می کند.

attestationIdProduct

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

مربوط به Tag::ATTESTATION_ID_PRODUCT Keymaster است که از مقدار شناسه برچسب 712 استفاده می کند.

attestationIdSerial

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

مربوط به تگ Tag::ATTESTATION_ID_SERIAL Keymaster است که از مقدار شناسه برچسب 713 استفاده می کند.

attestationIdImei

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

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

attestationIdMeid

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

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

attestationIdManufacturer

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

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

attestationIdModel

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

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

vendorPatchLevel

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

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

سطح وصله امنیتی تصویر فروشنده را که برای استفاده از این کلید باید روی دستگاه نصب شود، مشخص می کند. مقدار به شکل YYYYMMDD ظاهر می شود که نشان دهنده تاریخ وصله امنیتی فروشنده است. به عنوان مثال، اگر کلیدی در یک دستگاه اندرویدی با نصب وصله امنیتی 1 آگوست 2018 فروشنده تولید شود، این مقدار 20180801 خواهد بود.

bootPatchLevel

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

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

سطح وصله امنیتی تصویر هسته را مشخص می کند که برای استفاده از این کلید باید روی دستگاه نصب شود. مقدار به شکل YYYYMMDD ظاهر می شود که نشان دهنده تاریخ وصله امنیتی سیستم است. به عنوان مثال، اگر کلیدی در دستگاه اندرویدی با نصب وصله امنیتی 5 آگوست 2018 سیستم تولید شود، این مقدار 20180805 خواهد بود.

deviceUniqueAttestation

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

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

attestationIdSecondImei

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

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

فیلدهای RootOfTrust

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

مقادیر VerifiedBootState

ارزش وضعیت بوت مربوطه معنی
Verified GREEN یک زنجیره کامل از اعتماد از یک ریشه اعتماد محافظت شده توسط سخت افزار تا بوت لودر و تمام پارتیشن های تایید شده توسط Verified Boot گسترش می یابد. در این حالت، فیلد verifiedBootKey حاوی هش ریشه اعتماد جاسازی شده است، که گواهی تعبیه شده در رام دستگاه توسط سازنده دستگاه در کارخانه است.
SelfSigned YELLOW مانند Verified ، با این تفاوت که تأیید با استفاده از ریشه اعتماد پیکربندی شده توسط کاربر به جای ریشه اعتماد تعبیه شده توسط سازنده در کارخانه انجام شد. در این حالت، فیلد verifiedBootKey حاوی هش کلید عمومی است که توسط کاربر پیکربندی شده است.
Unverified ORANGE بوت لودر دستگاه باز است، بنابراین نمی توان زنجیره ای از اعتماد ایجاد کرد. دستگاه را می توان آزادانه تغییر داد، بنابراین یکپارچگی دستگاه باید توسط کاربر خارج از باند تأیید شود. در این حالت فیلد verifiedBootKey حاوی 32 بایت صفر است.
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 از گواهی‌های امضای برنامه. یک برنامه می‌تواند چندین زنجیره گواهی کلید امضاکننده داشته باشد. برای هر کدام، گواهی "برگ" هضم شده و در قسمت signature_digests قرار می گیرد. نام فیلد گمراه‌کننده است، زیرا داده‌های هضم شده گواهی‌های امضای برنامه هستند، نه امضاهای برنامه، زیرا برای کلاس Signature نامگذاری شده است که با فراخوانی به getPackageInfo() بازگردانده شده است. قطعه کد زیر یک مجموعه نمونه را نشان می دهد:

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

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

شناسه منحصر به فرد یک مقدار 128 بیتی است که دستگاه را شناسایی می کند، اما فقط برای مدت زمان محدود. مقدار با:

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

کجا:

  • T "مقدار شمارشگر زمانی" است که با تقسیم مقدار Tag::CREATION_DATETIME بر 2592000000 محاسبه می شود و باقی مانده را حذف می کند. T هر 30 روز تغییر می کند (2592000000 = 30 * 24 * 60 * 60 * 1000).
  • C مقدار Tag::APPLICATION_ID است
  • اگر Tag::RESET_SINCE_ID_ROTATION در پارامتر attest_params برای فراخوانی attest_key وجود داشته باشد، R برابر 1 است، یا اگر برچسب وجود نداشته باشد، 0 است.
  • HBK یک راز منحصربفرد سخت افزاری است که توسط Trusted Execution Environment شناخته شده و هرگز توسط آن فاش نشده است. راز حاوی حداقل 128 بیت آنتروپی است و برای هر دستگاه منحصر به فرد است (یکتایی احتمالی با توجه به 128 بیت آنتروپی قابل قبول است). HBK باید از مواد کلید ذوب شده از طریق HMAC یا AES_CMAC مشتق شود.

خروجی HMAC_SHA256 را به 128 بیت کوتاه کنید.

کلیدهای تصدیق و گواهی

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

Android 12 Remote Key Provisioning را معرفی می‌کند و Android 13 نیازمند اجرای آن توسط دستگاه‌ها است. Remote Key Provisioning دستگاه هایی را در این زمینه با هر برنامه، گواهی گواهی ECDSA P256 ارائه می دهد. این گواهی ها نسبت به گواهی های ارائه شده در کارخانه عمر کوتاه تری دارند.

چندین IMEI

اندروید 14 پشتیبانی از چندین IMEI را در رکورد تأیید کلید اندروید اضافه می کند. OEM ها می توانند این ویژگی را با افزودن یک تگ KeyMint برای IMEI دوم پیاده سازی کنند. به طور فزاینده ای رایج می شود که دستگاه ها چندین رادیو سلولی داشته باشند و OEM ها اکنون می توانند دستگاه هایی با دو IMEI را پشتیبانی کنند.

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

ارائه پسوند اطلاعات

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

طرحواره

پسوند از طرح CDDL زیر پیروی می کند:

  {
        1 : int,   ; certificates issued
  }

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

certs_issued

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

گواهی شناسایی

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

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

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

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

فضای ذخیره‌سازی که شناسه‌های دستگاه را در خود جای می‌دهد باید این ویژگی‌ها را داشته باشد:

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

ساخت و ساز

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

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 اندازه ثابتی دارند، هیچ هدر یا ساختار دیگری برای یافتن هش‌های ID یا HMAC از D لازم نیست. علاوه بر بررسی مقادیر ارائه‌شده برای انجام تأیید، پیاده‌سازی‌ها باید S را با استخراج D از S تأیید کنند. ، محاسبه HMAC(HBK, D) و مقایسه آن با مقدار S برای تأیید اینکه هیچ شناسه فردی تغییر یا خراب نشده است. همچنین، پیاده‌سازی‌ها باید از مقایسه‌های زمان ثابت برای همه عناصر ID استفاده کنند و اعتبار S. زمان مقایسه باید بدون توجه به تعداد شناسه‌های ارائه‌شده و تطابق صحیح هر بخش از آزمون ثابت باشد.

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

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

  1. نام تجاری، همانطور که توسط Build.BRAND در Android برگردانده شده است
  2. نام دستگاه، همانطور که توسط Build.DEVICE در Android برگردانده شده است
  3. نام محصول، همانطور که توسط Build.PRODUCT در Android بازگردانده شده است
  4. نام سازنده، همانطور که Build.MANUFACTURER در Android برگردانده است
  5. نام مدل، همانطور که توسط Build.MODEL در Android برگردانده شده است
  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 پررنگ ، همراه با نظرات است.

Java API

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

،

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

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

برای رفع این مشکل، Keymaster گواهینامه کلید را در Android 7.0 (Keymaster 2) و گواهی ID را در Android 8.0 (Keymaster 3) معرفی کرد.

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

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

گواهی کلیدی

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

برچسب ها

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

تایپ کنید

Keymaster 2 و پایین تر

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

روش AttestKey

کی مستر 3

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

Keymaster 2 و پایین تر

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 ساختار دستگاه کی مستر است.
  • keyToAttest حباب کلیدی است که از generateKey بازگردانده شده است که گواهی برای آن ایجاد شده است.
  • attestParams لیستی از پارامترهای لازم برای تأیید است. این شامل Tag::ATTESTATION_CHALLENGE و احتمالاً Tag::RESET_SINCE_ID_ROTATION ، و همچنین Tag::APPLICATION_ID و Tag::APPLICATION_DATA است. دو مورد آخر برای رمزگشایی حباب کلید در صورتی که در طول تولید کلید مشخص شده باشند، ضروری هستند.
  • certChain پارامتر خروجی است که آرایه ای از گواهی ها را برمی گرداند. ورودی 0 گواهی گواهی است، به این معنی که کلید را از keyToAttest تأیید می کند و حاوی پسوند گواهی است.

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

گواهی تصدیق

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

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

SEQUENCE گواهی

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

SEQUENCE گواهی TBSC

نام فیلد (به RFC 5280 مراجعه کنید) ارزش
version INTEGER 2 (به معنای گواهی v3)
serialNumber INTEGER 1 (مقدار ثابت: در همه گواهی ها یکسان است)
signature AlgorithmIdentifier الگوریتم مورد استفاده برای علامت گذاری کلید: ECDSA برای کلیدهای EC، RSA برای کلیدهای RSA.
issuer مانند فیلد موضوع کلید تأیید دسته ای.
validity SEQUENCE از دو تاریخ، حاوی مقادیر Tag::ACTIVE_DATETIME و Tag::USAGE_EXPIRE_DATETIME . این مقادیر از 1 ژانویه 1970 بر حسب میلی ثانیه هستند. برای نمایش صحیح تاریخ در گواهی ها به RFC 5280 مراجعه کنید.
اگر Tag::ACTIVE_DATETIME وجود ندارد، از مقدار Tag::CREATION_DATETIME استفاده کنید. اگر Tag::USAGE_EXPIRE_DATETIME وجود ندارد، از تاریخ انقضای گواهی کلید تأیید دسته استفاده کنید.
subject CN = "Android Keystore Key" (مقدار ثابت: در همه گواهی ها یکسان است)
subjectPublicKeyInfo SubjectPublicKeyInfo حاوی کلید عمومی تایید شده.
extensions/Key Usage DigitalSignature: تنظیم کنید که آیا کلید هدفی دارد KeyPurpose::SIGN یا KeyPurpose::VERIFY . همه بیت های دیگر تنظیم نشده است.
extensions/CRL Distribution Points ارزش TBD
extensions/"attestation" OID 1.3.6.1.4.1.11129.2.1.17 است. محتوا در بخش پسوند گواهی در زیر تعریف شده است. مانند تمام پسوندهای گواهی X.509، محتوا به صورت OCTET_STRING حاوی رمزگذاری DER از SEQUENCE گواهی نمایش داده می شود.

تمدید تصدیق

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

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

نوع Keymaster/KeyMint نوع 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 میلی ثانیه از 1 ژانویه 1970 ساعت 00:00:00 GMT.
BOOL NULL تگ حضور به معنای واقعی است، غیبت به معنای نادرست است.
BIGNUM هیچ برچسبی این نوع را ندارد، بنابراین هیچ نقشه برداری تعریف نشده است.
BYTES OCTET_STRING

طرحواره

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

نسخه 300

KeyDescription ::= SEQUENCE {
    attestationVersion  300,
    attestationSecurityLevel  SecurityLevel,
    keyMintVersion  INTEGER,
    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,
    trustedUserPresenceRequired  [507] EXPLICIT NULL OPTIONAL,
    trustedConfirmationRequired  [508] EXPLICIT NULL OPTIONAL,
    unlockedDeviceRequired  [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),
}

نسخه 200

KeyDescription ::= SEQUENCE {
    attestationVersion  200,
    attestationSecurityLevel  SecurityLevel,
    keyMintVersion  INTEGER,
    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,
    trustedUserPresenceRequired  [507] EXPLICIT NULL OPTIONAL,
    trustedConfirmationRequired  [508] EXPLICIT NULL OPTIONAL,
    unlockedDeviceRequired  [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),
}

نسخه 100

KeyDescription ::= SEQUENCE {
    attestationVersion  100,
    attestationSecurityLevel  SecurityLevel,
    keyMintVersion  INTEGER,
    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,
    trustedUserPresenceRequired  [507] EXPLICIT NULL OPTIONAL,
    trustedConfirmationRequired  [508] EXPLICIT NULL OPTIONAL,
    unlockedDeviceRequired  [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),
}

نسخه 4

KeyDescription ::= SEQUENCE {
    attestationVersion  4,
    attestationSecurityLevel  SecurityLevel,
    keymasterVersion  INTEGER,
    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,
    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,
    earlyBootOnly  [305] 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,
    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),
}

نسخه 3

KeyDescription ::= SEQUENCE {
    attestationVersion  3,
    attestationSecurityLevel  SecurityLevel,
    keymasterVersion  INTEGER,
    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,
    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,
    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,
    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),
}

نسخه 1

KeyDescription ::= SEQUENCE {
    attestationVersion  1,
    attestationSecurityLevel  SecurityLevel,
    keymasterVersion  INTEGER,
    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.
ارزش نسخه Keymaster/KeyMint
1 کی مستر نسخه 2.0
2 کی مستر نسخه 3.0
3 کی مستر نسخه 4.0
4 کی مستر نسخه 4.1
100 KeyMint نسخه 1.0
200 KeyMint نسخه 2.0
300 KeyMint نسخه 3.0
attestationSecurityLevel

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

keymasterVersion / keyMintVersion
نسخه اجرای لایه انتزاعی سخت افزاری Keymaster/KeyMint (HAL).
ارزش نسخه Keymaster/KeyMint
2 کی مستر نسخه 2.0
3 کی مستر نسخه 3.0
4 کی مستر نسخه 4.0
41 کی مستر نسخه 4.1
100 KeyMint نسخه 1.0
200 KeyMint نسخه 2.0
300 KeyMint نسخه 3.0
keymasterSecurityLevel / keyMintSecurityLevel
سطح امنیتی اجرای Keymaster/KeyMint.
attestationChallenge
چالش ارائه شده در زمان تولید کلید.
uniqueId
یک شناسه دستگاه حساس به حریم خصوصی که برنامه‌های سیستم می‌توانند در زمان تولید کلید درخواست کنند. اگر شناسه منحصر به فرد درخواست نشود، این قسمت خالی است. برای جزئیات، بخش شناسه منحصر به فرد را ببینید.
softwareEnforced
لیست مجوزهای Keymaster/KeyMint که توسط سیستم Android اعمال می شود. این اطلاعات توسط کد در پلتفرم جمع آوری یا تولید می شود و در پارتیشن سیستم دستگاه ذخیره می شود. تا زمانی که دستگاه دارای سیستم عاملی است که با مدل امنیتی پلتفرم Android مطابقت دارد (یعنی بوت لودر دستگاه قفل شده و verifiedBootState Verified باشد) قابل اعتماد است.
hardwareEnforced
لیست مجوز Keymaster/KeyMint که توسط Trusted Execution Environment (TEE) یا StrongBox دستگاه اعمال می‌شود. این اطلاعات با کد موجود در سخت افزار امن جمع آوری یا تولید می شود و توسط پلتفرم کنترل نمی شود. به عنوان مثال، اطلاعات می تواند از بوت لودر یا از طریق یک کانال ارتباطی امن که شامل اعتماد به پلت فرم نیست، به دست آید.

مقادیر SecurityLevel

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

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

فیلدهای AuthorizationList

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

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

purpose
مربوط به Tag::PURPOSE است که از مقدار شناسه برچسب 1 استفاده می کند.
algorithm

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

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

keySize
مربوط به برچسب مجوز Tag::KEY_SIZE است که از مقدار شناسه برچسب 3 استفاده می کند.
digest
مربوط به تگ مجوز Tag::DIGEST است که از مقدار شناسه برچسب 5 استفاده می کند.
padding
مربوط به برچسب مجوز Tag::PADDING است که از مقدار شناسه برچسب 6 استفاده می کند.
ecCurve

مربوط به برچسب مجوز Tag::EC_CURVE است که از مقدار شناسه برچسب 10 استفاده می کند.

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

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

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

مربوط به Tag::RSA_OAEP_MGF_DIGEST مجوز KeyMint است که از مقدار شناسه برچسب 203 استفاده می کند.
rollbackResistance

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

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

earlyBootOnly

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

مربوط به برچسب مجوز Tag::EARLY_BOOT_ONLY است که از مقدار شناسه برچسب 305 استفاده می کند.

activeDateTime
مربوط به برچسب مجوز Tag::ACTIVE_DATETIME است که از مقدار شناسه برچسب 400 استفاده می کند.
originationExpireDateTime
مربوط به Tag::ORIGINATION_EXPIRE_DATETIME مجوز Keymaster است که از مقدار شناسه برچسب 401 استفاده می کند.
usageExpireDateTime
مربوط به برچسب مجوز Tag::USAGE_EXPIRE_DATETIME است که از مقدار شناسه برچسب 402 استفاده می کند.
usageCountLimit
مربوط به Tag::USAGE_COUNT_LIMIT است که از مقدار شناسه برچسب 405 استفاده می کند.
noAuthRequired

مربوط به برچسب مجوز Tag::NO_AUTH_REQUIRED است که از مقدار شناسه برچسب 503 استفاده می کند.

userAuthType
مربوط به برچسب مجوز Tag::USER_AUTH_TYPE است که از مقدار شناسه برچسب 504 استفاده می کند.
authTimeout
مربوط به برچسب مجوز Tag::AUTH_TIMEOUT است که از مقدار شناسه برچسب 505 استفاده می کند.
allowWhileOnBody

مربوط به برچسب مجوز Tag::ALLOW_WHILE_ON_BODY است که از مقدار شناسه برچسب 506 استفاده می کند.

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

trustedUserPresenceRequired

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

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

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

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

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

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

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

توجه: این تگ فقط برای کلیدهایی که از هدف SIGN استفاده می کنند قابل استفاده است.

unlockedDeviceRequired

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

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

allApplications

مربوط به برچسب مجوز Tag::ALL_APPLICATIONS است که از مقدار شناسه برچسب 600 استفاده می کند.

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

applicationId
مربوط به تگ مجوز Tag::APPLICATION_ID است که از مقدار شناسه برچسب 601 استفاده می کند.
creationDateTime
مربوط به برچسب مجوز Tag::CREATION_DATETIME است که از مقدار شناسه برچسب 701 استفاده می کند.
origin

مربوط به تگ مجوز Tag::ORIGIN است که از مقدار شناسه برچسب 702 استفاده می کند.

rollbackResistant

فقط در گواهینامه های کلیدی نسخه های 1 و 2 ارائه شود.

مربوط به برچسب مجوز Tag::ROLLBACK_RESISTANT است که از مقدار شناسه برچسب 703 استفاده می کند.

rootOfTrust

مربوط به تگ مجوز Tag::ROOT_OF_TRUST است که از مقدار شناسه برچسب 704 استفاده می کند.

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

osVersion

مربوط به تگ مجوز Tag::OS_VERSION است که از مقدار شناسه برچسب 705 استفاده می کند.

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

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

osPatchLevel

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

ماه و سال مرتبط با وصله امنیتی که در Keymaster استفاده می شود، به عنوان یک عدد صحیح شش رقمی مشخص شده است. به عنوان مثال، پچ آگوست 2018 به عنوان 201808 نشان داده شده است.

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

attestationApplicationId

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

مربوط به Tag::ATTESTATION_APPLICATION_ID مجوز Keymaster است که از مقدار شناسه برچسب 709 استفاده می کند.

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

attestationIdBrand

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

مربوط به Tag::ATTESTATION_ID_BRAND Keymaster است که از مقدار شناسه برچسب 710 استفاده می کند.

attestationIdDevice

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

مربوط به Tag::ATTESTATION_ID_DEVICE Keymaster است که از مقدار شناسه برچسب 711 استفاده می کند.

attestationIdProduct

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

مربوط به Tag::ATTESTATION_ID_PRODUCT Keymaster است که از مقدار شناسه برچسب 712 استفاده می کند.

attestationIdSerial

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

مربوط به تگ Tag::ATTESTATION_ID_SERIAL Keymaster است که از مقدار شناسه برچسب 713 استفاده می کند.

attestationIdImei

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

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

attestationIdMeid

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

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

attestationIdManufacturer

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

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

attestationIdModel

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

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

vendorPatchLevel

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

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

سطح وصله امنیتی تصویر فروشنده را که برای استفاده از این کلید باید روی دستگاه نصب شود، مشخص می کند. مقدار به شکل YYYYMMDD ظاهر می شود که نشان دهنده تاریخ وصله امنیتی فروشنده است. به عنوان مثال، اگر کلیدی در یک دستگاه اندرویدی با نصب وصله امنیتی 1 آگوست 2018 فروشنده تولید شود، این مقدار 20180801 خواهد بود.

bootPatchLevel

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

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

سطح وصله امنیتی تصویر هسته را مشخص می کند که برای استفاده از این کلید باید روی دستگاه نصب شود. مقدار به شکل YYYYMMDD ظاهر می شود که نشان دهنده تاریخ وصله امنیتی سیستم است. به عنوان مثال، اگر کلیدی در دستگاه اندرویدی با نصب وصله امنیتی 5 آگوست 2018 سیستم تولید شود، این مقدار 20180805 خواهد بود.

deviceUniqueAttestation

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

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

attestationIdSecondImei

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

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

فیلدهای RootOfTrust

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

مقادیر VerifiedBootState

ارزش وضعیت بوت مربوطه معنی
Verified GREEN یک زنجیره کامل از اعتماد از یک ریشه اعتماد محافظت شده توسط سخت افزار تا بوت لودر و تمام پارتیشن های تایید شده توسط Verified Boot گسترش می یابد. در این حالت، فیلد verifiedBootKey حاوی هش ریشه اعتماد جاسازی شده است، که گواهی تعبیه شده در رام دستگاه توسط سازنده دستگاه در کارخانه است.
SelfSigned YELLOW مانند Verified ، با این تفاوت که تأیید با استفاده از ریشه اعتماد پیکربندی شده توسط کاربر به جای ریشه اعتماد تعبیه شده توسط سازنده در کارخانه انجام شد. در این حالت، فیلد verifiedBootKey حاوی هش کلید عمومی است که توسط کاربر پیکربندی شده است.
Unverified ORANGE بوت لودر دستگاه باز است، بنابراین نمی توان زنجیره ای از اعتماد ایجاد کرد. دستگاه را می توان آزادانه تغییر داد، بنابراین یکپارچگی دستگاه باید توسط کاربر خارج از باند تأیید شود. در این حالت فیلد verifiedBootKey حاوی 32 بایت صفر است.
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 از گواهی‌های امضای برنامه. یک برنامه می‌تواند چندین زنجیره گواهی کلید امضاکننده داشته باشد. برای هر کدام، گواهی "برگ" هضم شده و در قسمت signature_digests قرار می گیرد. نام فیلد گمراه‌کننده است، زیرا داده‌های هضم شده گواهی‌های امضای برنامه هستند، نه امضاهای برنامه، زیرا برای کلاس Signature نامگذاری شده است که با فراخوانی به getPackageInfo() بازگردانده شده است. قطعه کد زیر یک مجموعه نمونه را نشان می دهد:

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

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

شناسه منحصر به فرد یک مقدار 128 بیتی است که دستگاه را شناسایی می کند، اما فقط برای مدت زمان محدود. مقدار با:

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

کجا:

  • T "مقدار شمارشگر زمانی" است که با تقسیم مقدار Tag::CREATION_DATETIME بر 2592000000 محاسبه می شود و باقی مانده را حذف می کند. T هر 30 روز تغییر می کند (2592000000 = 30 * 24 * 60 * 60 * 1000).
  • C مقدار Tag::APPLICATION_ID است
  • اگر Tag::RESET_SINCE_ID_ROTATION در پارامتر attest_params برای فراخوانی attest_key وجود داشته باشد، R برابر 1 است، یا اگر برچسب وجود نداشته باشد، 0 است.
  • HBK یک راز منحصربفرد سخت افزاری است که توسط Trusted Execution Environment شناخته شده و هرگز توسط آن فاش نشده است. راز حاوی حداقل 128 بیت آنتروپی است و برای هر دستگاه منحصر به فرد است (یکتایی احتمالی با توجه به 128 بیت آنتروپی قابل قبول است). HBK باید از مواد کلید ذوب شده از طریق HMAC یا AES_CMAC مشتق شود.

خروجی HMAC_SHA256 را به 128 بیت کوتاه کنید.

کلیدهای تصدیق و گواهی

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

Android 12 Remote Key Provisioning را معرفی می‌کند و Android 13 نیازمند اجرای آن توسط دستگاه‌ها است. Remote Key Provisioning دستگاه هایی را در این زمینه با هر برنامه، گواهی گواهی ECDSA P256 ارائه می دهد. این گواهی ها نسبت به گواهی های ارائه شده در کارخانه عمر کوتاه تری دارند.

چندین IMEI

اندروید 14 پشتیبانی از چندین IMEI را در رکورد تأیید کلید اندروید اضافه می کند. OEM ها می توانند این ویژگی را با افزودن یک تگ KeyMint برای IMEI دوم پیاده سازی کنند. به طور فزاینده ای رایج می شود که دستگاه ها چندین رادیو سلولی داشته باشند و OEM ها اکنون می توانند دستگاه هایی با دو IMEI را پشتیبانی کنند.

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

ارائه پسوند اطلاعات

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

طرحواره

پسوند از طرح CDDL زیر پیروی می کند:

  {
        1 : int,   ; certificates issued
  }

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

certs_issued

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

گواهی شناسایی

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

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

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

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

فضای ذخیره‌سازی که شناسه‌های دستگاه را در خود جای می‌دهد باید این ویژگی‌ها را داشته باشد:

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

ساخت و ساز

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

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 اندازه ثابتی دارند، هیچ هدر یا ساختار دیگری برای یافتن هش‌های ID یا HMAC از D لازم نیست. علاوه بر بررسی مقادیر ارائه‌شده برای انجام تأیید، پیاده‌سازی‌ها باید S را با استخراج D از S تأیید کنند. ، محاسبه HMAC(HBK, D) و مقایسه آن با مقدار S برای تأیید اینکه هیچ شناسه فردی تغییر یا خراب نشده است. همچنین، پیاده‌سازی‌ها باید از مقایسه‌های زمان ثابت برای همه عناصر ID استفاده کنند و اعتبار S. زمان مقایسه باید بدون توجه به تعداد شناسه‌های ارائه‌شده و تطابق صحیح هر بخش از آزمون ثابت باشد.

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

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

  1. نام تجاری، همانطور که توسط Build.BRAND در Android برگردانده شده است
  2. نام دستگاه، همانطور که توسط Build.DEVICE در Android برگردانده شده است
  3. نام محصول، همانطور که توسط Build.PRODUCT در Android بازگردانده شده است
  4. نام سازنده، همانطور که Build.MANUFACTURER در Android برگردانده است
  5. نام مدل، همانطور که توسط Build.MODEL در Android برگردانده شده است
  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 پررنگ ، همراه با نظرات است.

Java API

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