Anahtar ve Kimlik Onayı

Anahtar deposu, kriptografik anahtarları kontrollü bir şekilde oluşturmak, depolamak ve kullanmak için daha güvenli bir yer sağlar. Donanım destekli anahtar depolama mevcut olduğunda ve kullanıldığında, anahtar malzemesi cihazdan çıkarılmaya karşı daha güvenli olur ve Keymaster, yıkılması zor kısıtlamalar uygular.

Ancak bu yalnızca anahtar deposu anahtarlarının donanım destekli depolamada olduğu biliniyorsa geçerlidir. Keymaster 1'de uygulamaların veya uzak sunucuların durumun böyle olup olmadığını güvenilir bir şekilde doğrulamasının bir yolu yoktu. Anahtar deposu arka plan programı, mevcut anahtar yöneticisi HAL'i yükledi ve anahtarların donanım desteğiyle ilgili olarak HAL'in söylediği her şeye inandı.

Bu duruma çözüm bulmak için Keymaster, Android 7.0'da (Keymaster 2) anahtar doğrulamayı ve Android 8.0'da (Keymaster 3) kimlik doğrulamayı tanıttı.

Anahtar doğrulama, asimetrik bir anahtar çiftinin donanım destekli olup olmadığını, anahtarın özelliklerinin neler olduğunu ve kullanımına hangi kısıtlamaların uygulandığını güçlü bir şekilde belirlemenin bir yolunu sağlamayı amaçlamaktadır.

Kimlik doğrulaması, cihazın seri numarası veya IMEI gibi donanım tanımlayıcılarının kanıtını sağlamasına olanak tanır.

Anahtar tasdiki

Anahtar doğrulamayı desteklemek için Android 7.1, HAL'a bir dizi etiket, tür ve yöntem ekledi.

Etiketler

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

Tip

Keymaster 2 ve altı

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

AttestKey yöntemi

Anahtar Yöneticisi 3

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

Keymaster 2 ve altı

keymaster_error_t (*attest_key)(const struct keymaster2_device* dev,
        const keymaster_key_blob_t* key_to_attest,
        const keymaster_key_param_set_t* attest_params,
        keymaster_cert_chain_t* cert_chain);
  • dev , keymaster cihaz yapısıdır.
  • keyToAttest , kanıtın oluşturulacağı generateKey döndürülen anahtar bloğudur.
  • attestParams doğrulama için gerekli parametrelerin listesidir. Buna Tag::ATTESTATION_CHALLENGE ve muhtemelen Tag::RESET_SINCE_ID_ROTATION ile Tag::APPLICATION_ID ve Tag::APPLICATION_DATA dahildir. Son ikisi, anahtar oluşturma sırasında belirtilmişse anahtar bloğunun şifresini çözmek için gereklidir.
  • certChain , bir dizi sertifika döndüren çıktı parametresidir. Giriş 0, doğrulama sertifikasıdır, yani keyToAttest anahtarı onaylar ve doğrulama uzantısını içerir.

attestKey yöntemi, herhangi bir zamanda çağrılabileceğinden ve yetkilendirme kısıtlamalarını karşılaması gerekmediğinden, onaylanmış anahtar üzerinde bir ortak anahtar işlemi olarak kabul edilir. Örneğin, onaylanmış anahtarın kullanım için kullanıcı kimlik doğrulamasına ihtiyacı varsa, kullanıcı kimlik doğrulaması olmadan bir doğrulama oluşturulabilir.

Onay sertifikası

Onay sertifikası, onaylanmış anahtarın açıklamasını içeren isteğe bağlı bir doğrulama uzantısına sahip standart bir X.509 sertifikasıdır. Sertifika, sertifikalı bir doğrulama anahtarıyla imzalanır. Doğrulama anahtarı, doğrulanan anahtardan farklı bir algoritma kullanabilir.

Onay sertifikası aşağıdaki tabloda yer alan alanları içerir ve herhangi bir ek alan içeremez. Bazı alanlar sabit bir alan değeri belirtir. CTS testleri, sertifika içeriğinin tam olarak tanımlandığı gibi olduğunu doğrular.

Sertifika SIRASI

Alan adı (bkz. RFC 5280 ) Değer
tbsSertifikası TBSCertifika SIRASI
imzaAlgoritması AlgoritmaAnahtarı imzalamak için kullanılan algoritmanın tanımlayıcısı:
EC anahtarları için ECDSA, RSA anahtarları için RSA.
imzaDeğeri BIT STRING, imza ASN.1 DER kodlu tbsCertificate üzerinde hesaplanır.

TBSCertifika SIRASI

Alan adı (bkz. RFC 5280 ) Değer
version TAM SAYI 2 (v3 sertifikası anlamına gelir)
serialNumber TAM SAYI 1 (sabit değer: tüm sertifikalarda aynı)
signature AlgoritmaAnahtarı imzalamak için kullanılan algoritmanın tanımlayıcısı: EC anahtarları için ECDSA, RSA anahtarları için RSA.
issuer Toplu onay anahtarının konu alanıyla aynıdır.
validity Tag::ACTIVE_DATETIME ve Tag::USAGE_EXPIRE_DATETIME değerlerini içeren iki tarihin SEQUENCE'ı. Bu değerler 1 Ocak 1970'ten bu yana milisaniye cinsindendir. Sertifikalardaki doğru tarih gösterimleri için RFC 5280'e bakın.
Tag::ACTIVE_DATETIME mevcut değilse Tag::CREATION_DATETIME değerini kullanın. Tag::USAGE_EXPIRE_DATETIME mevcut değilse toplu onay anahtarı sertifikasının son kullanma tarihini kullanın.
subject CN = "Android Anahtar Deposu Anahtarı" (sabit değer: tüm sertifikalarda aynı)
subjectPublicKeyInfo Onaylanmış ortak anahtarı içeren SubjectPublicKeyInfo.
extensions/Key Usage digitalSignature: anahtarın KeyPurpose::SIGN veya KeyPurpose::VERIFY amacı olup olmadığını ayarlayın. Diğer tüm bitler ayarlanmamış.
extensions/CRL Distribution Points Değer Belirlenecek
extensions/"attestation" OID 1.3.6.1.4.1.11129.2.1.17'dir; içerik aşağıdaki Onay Uzantısı bölümünde tanımlanmıştır. Tüm X.509 sertifika uzantılarında olduğu gibi içerik, SEQUENCE doğrulamasının DER kodlamasını içeren bir OCTET_STRING olarak temsil edilir.

Onay uzantısı

attestation uzantısı, Android'de ve anahtar yöneticisi HAL'de kullanılan yetkilendirme listelerine doğrudan karşılık gelen bir yapıda, anahtarla ilişkili anahtar yöneticisi yetkilerinin tam bir açıklamasını içerir. Yetkilendirme listesindeki her etiket, açık bir şekilde anahtar yöneticisi etiket numarasıyla etiketlenmiş, ancak tür tanımlayıcısı (dört yüksek dereceli bit) maskelenmiş bir ASN.1 SEQUENCE girişi ile temsil edilir.

Örneğin Keymaster 3'te Tag::PURPOSE , type.hal dosyasında ENUM_REP | 1 . Doğrulama uzantısı için ENUM_REP değeri kaldırılarak etiket 1 bırakılır. (Keymaster 2 ve altı için, KM_TAG_PURPOSE keymaster_defs.h'de tanımlanmıştır.)

Değerler, bu tabloya göre basit bir şekilde ASN.1 türlerine çevrilir:

Anahtar yöneticisi türü ASN.1 tipi
ENUM TAM SAYI
ENUM_REP TAM SAYI KÜMESİ
UINT TAM SAYI
UINT_REP TAM SAYI KÜMESİ
ULONG TAM SAYI
ULONG_REP TAM SAYI KÜMESİ
DATE TAM SAYI (1 Ocak 1970 00:00:00 GMT'den bu yana milisaniye)
BOOL NULL (anahtar yöneticisinde, etiketin mevcut olması doğru, yok olması ise yanlış anlamına gelir.
Aynı anlambilim ASN.1 kodlaması için de geçerlidir)
BIGNUM Şu anda kullanılmadığından eşleme tanımlanmadı
BYTES OCTET_STRING

Şema

Doğrulama uzantısı içeriği aşağıdaki ASN.1 şemasıyla açıklanmaktadır.

KeyDescription ::= SEQUENCE {
  attestationVersion         INTEGER, # KM2 value is 1. KM3 value is 2. KM4 value is 3.
  attestationSecurityLevel   SecurityLevel,
  keymasterVersion           INTEGER,
  keymasterSecurityLevel     SecurityLevel,
  attestationChallenge       OCTET_STRING,
  uniqueId                   OCTET_STRING,
  softwareEnforced           AuthorizationList,
  teeEnforced                AuthorizationList,
}

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

AuthorizationList ::= SEQUENCE {
  purpose                     [1] EXPLICIT SET OF INTEGER OPTIONAL,
  algorithm                   [2] EXPLICIT INTEGER OPTIONAL,
  keySize                     [3] EXPLICIT INTEGER OPTIONAL.
  digest                      [5] EXPLICIT SET OF INTEGER OPTIONAL,
  padding                     [6] EXPLICIT SET OF INTEGER OPTIONAL,
  ecCurve                     [10] EXPLICIT INTEGER OPTIONAL,
  rsaPublicExponent           [200] EXPLICIT INTEGER OPTIONAL,
  rollbackResistance          [303] EXPLICIT NULL OPTIONAL, # KM4
  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, # KM4
  trustedConfirmationRequired [508] EXPLICIT NULL OPTIONAL, # KM4
  unlockedDeviceRequired      [509] EXPLICIT NULL OPTIONAL, # KM4
  allApplications             [600] EXPLICIT NULL OPTIONAL,
  applicationId               [601] EXPLICIT OCTET_STRING OPTIONAL,
  creationDateTime            [701] EXPLICIT INTEGER OPTIONAL,
  origin                      [702] EXPLICIT INTEGER OPTIONAL,
  rollbackResistant           [703] EXPLICIT NULL OPTIONAL, # KM2 and KM3 only.
  rootOfTrust                 [704] EXPLICIT RootOfTrust OPTIONAL,
  osVersion                   [705] EXPLICIT INTEGER OPTIONAL,
  osPatchLevel                [706] EXPLICIT INTEGER OPTIONAL,
  attestationApplicationId    [709] EXPLICIT OCTET_STRING OPTIONAL, # KM3
  attestationIdBrand          [710] EXPLICIT OCTET_STRING OPTIONAL, # KM3
  attestationIdDevice         [711] EXPLICIT OCTET_STRING OPTIONAL, # KM3
  attestationIdProduct        [712] EXPLICIT OCTET_STRING OPTIONAL, # KM3
  attestationIdSerial         [713] EXPLICIT OCTET_STRING OPTIONAL, # KM3
  attestationIdImei           [714] EXPLICIT OCTET_STRING OPTIONAL, # KM3
  attestationIdMeid           [715] EXPLICIT OCTET_STRING OPTIONAL, # KM3
  attestationIdManufacturer   [716] EXPLICIT OCTET_STRING OPTIONAL, # KM3
  attestationIdModel          [717] EXPLICIT OCTET_STRING OPTIONAL, # KM3
  vendorPatchLevel            [718] EXPLICIT INTEGER OPTIONAL, # KM4
  bootPatchLevel              [719] EXPLICIT INTEGER OPTIONAL, # KM4
}

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

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

Anahtar Açıklama alanları

keymasterVersion ve attestationChallenge alanları etiket yerine konumsal olarak tanımlanır; böylece kodlanmış formdaki etiketler yalnızca alan türünü belirtir. Geri kalan alanlar şemada belirtildiği gibi örtülü olarak etiketlenir.

Alan adı Tip Değer
attestationVersion TAM SAYI Doğrulama şemasının sürümü: 1, 2 veya 3.
attestationSecurity Güvenlik seviyesi Bu doğrulamanın güvenlik düzeyi. Donanım destekli anahtarların yazılım onaylarını almak mümkündür. Android sisteminin güvenliği ihlal edilmişse bu tür onaylara güvenilemez.
keymasterVersion TAM SAYI Keymaster cihazının sürümü: 0, 1, 2, 3 veya 4.
keymasterSecurity Güvenlik seviyesi Anahtar yöneticisi uygulamasının güvenlik düzeyi.
attestationChallenge OCTET_STRING Onay isteğine belirtilen Tag::ATTESTATION_CHALLENGE değeri.
uniqueId OCTET_STRING İsteğe bağlı benzersiz kimlik, anahtarda Tag::INCLUDE_UNIQUE_ID varsa mevcut
softwareEnforced Yetki Listesi Varsa, TEE tarafından zorunlu tutulmayan isteğe bağlı anahtar yöneticisi yetkilendirmeleri.
teeEnforced Yetki Listesi İsteğe bağlı, varsa TEE tarafından uygulanan Keymaster yetkilendirmeleri.

Yetki Listesi alanları

AuthorizationList alanlarının tümü isteğe bağlıdır ve tür bitleri maskelenmiş şekilde keymaster etiketi değeriyle tanımlanır. Açık etiketleme kullanıldığında alanlar, daha kolay ayrıştırma için ASN.1 türünü belirten bir etiket de içerir.

Her alanın değerlerine ilişkin ayrıntılar için Keymaster 3 için types.hal ve Keymaster 2 ve altı için keymaster_defs.h bakın. Keymaster etiketi adları, KM_TAG öneki çıkarılarak ve geri kalanı camel harfine değiştirilerek alan adlarına dönüştürüldü, böylece Tag::KEY_SIZE keySize oldu.

RootOfTrust alanları

RootOfTrust Alanları konumsal olarak tanımlanır.

Alan adı Tip Değer
verifiedBootKey OCTET_STRING Sistem görüntüsünü doğrulamak için kullanılan anahtarın güvenli karması. SHA-256 önerilir.
deviceLocked BOOLE Önyükleyici kilitliyse doğrudur; bu, yalnızca imzalı görüntülerin flaşlanabileceği ve doğrulanmış önyükleme denetiminin yapıldığı anlamına gelir.
verifiedBootState VerifiedBootState Doğrulanmış önyükleme durumu.
verifiedBootHash OCTET_STRING Doğrulanmış Önyükleme tarafından korunan tüm verilerin özeti. Verified Boot'un Android Verified Boot uygulamasını kullanan cihazlar için bu değer, VBMeta yapısının özetini veya Verified Boot meta veri yapısını içerir. Bu değerin nasıl hesaplanacağı hakkında daha fazla bilgi edinmek için bkz.VBMeta Digest

VerifiedBootState değerleri

verifiedBootState değerleri aşağıdaki anlamlara sahiptir:

Değer Anlam
Verified Önyükleyici, önyükleme bölümü ve tüm doğrulanmış bölümler de dahil olmak üzere, önyükleyiciden doğrulanmış bölümlere kadar uzanan tam bir güven zincirini belirtir.
Bu durumda, verifiedBootKey değeri katıştırılmış sertifikanın karma değeridir, yani ROM'a yazılan değiştirilemez sertifika anlamına gelir.
Bu durum, doğrulanmış önyükleme akışı belgelerinde belgelendiği gibi yeşil önyükleme durumuna karşılık gelir.
SelfSigned Önyükleme bölümünün katıştırılmış sertifika kullanılarak doğrulandığını ve imzanın geçerli olduğunu belirtir. Önyükleyici, önyükleme işleminin devam etmesine izin vermeden önce bir uyarı ve ortak anahtarın parmak izini görüntüler.
Bu durumda, verifiedBootKey değeri, otomatik imzalayan sertifikanın karmasıdır.
Bu durum, doğrulanmış önyükleme akışı belgelerinde belgelendiği gibi sarı önyükleme durumuna karşılık gelir.
Unverified Bir cihazın serbestçe değiştirilebileceğini belirtir. Cihaz bütünlüğünün bant dışı olup olmadığının doğrulanması kullanıcıya bırakılmıştır. Önyükleyici, önyükleme işleminin devam etmesine izin vermeden önce kullanıcıya bir uyarı görüntüler.
Bu durumda, verifiedBootKey değeri boştur.
Bu durum, doğrulanmış önyükleme akışı belgelerinde belgelendiği gibi turuncu önyükleme durumuna karşılık gelir.
Failed Cihazın doğrulamada başarısız olduğunu gösterir. Hiçbir doğrulama sertifikası aslında bu değeri içermez, çünkü bu durumda önyükleyici durur. Bütünlük sağlamak için buraya dahil edilmiştir.
Bu durum, doğrulanmış önyükleme akışı belgelerinde belgelendiği gibi kırmızı önyükleme durumuna karşılık gelir.

Güvenlik Düzeyi değerleri

securityLevel değerleri aşağıdaki anlamlara sahiptir:

Değer Anlam
Software İlgili öğeyi (onay veya anahtar) oluşturan veya yöneten kod, Android sisteminde uygulanır ve sistemin güvenliği ihlal edilirse değiştirilebilir.
TrustedEnvironment İlgili öğeyi (doğrulama veya anahtar) oluşturan veya yöneten kod, Güvenilir Yürütme Ortamında (TEE) uygulanır. TEE'nin güvenliği ihlal edilirse değiştirilebilir, ancak TEE uzaktan erişime karşı yüksek derecede dirençlidir ve doğrudan donanım saldırısı yoluyla uzlaşmaya karşı orta derecede dirençlidir.
StrongBox İlgili öğeyi (onay veya anahtar) oluşturan veya yöneten kod, özel bir donanım güvenlik modülünde uygulanır. Donanım güvenlik modülü tehlikeye girerse değiştirilebilir, ancak uzaktan tehlikeye karşı oldukça dayanıklıdır ve doğrudan donanım saldırısıyla tehlikeye atılmaya karşı da oldukça dayanıklıdır.

Benzersiz kimlik

Benzersiz Kimlik, cihazı yalnızca sınırlı bir süre için tanımlayan 128 bitlik bir değerdir. Değer şu şekilde hesaplanır:

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

Nerede:

  • T , Tag::CREATION_DATETIME değerinin 2592000000'e bölünmesi ve kalanların çıkarılmasıyla hesaplanan "geçici sayaç değeridir". T her 30 günde bir değişir (2592000000 = 30 * 24 * 60 * 60 * 1000).
  • C Tag::APPLICATION_ID değeridir
  • R attest_key çağrısının attest_params parametresinde Tag::RESET_SINCE_ID_ROTATION mevcutsa 1'dir veya etiket mevcut değilse 0'dır.
  • HBK , Güvenilir Yürütme Ortamı tarafından bilinen ve asla açıklanmayan, donanıma bağlı benzersiz bir sırdır. Sır, en az 128 bit entropi içerir ve her bir cihaza özgüdür (olasılıksal benzersizlik, 128 bit entropi göz önüne alındığında kabul edilebilir). HBK, HMAC veya AES_CMAC aracılığıyla birleştirilmiş anahtar materyalinden türetilmelidir.

HMAC_SHA256 çıkışını 128 bit'e kesin.

Onay anahtarları ve sertifikalar

Biri RSA ve biri ECDSA olmak üzere iki anahtar ve ilgili sertifika zincirleri cihaza güvenli bir şekilde sağlanır.

Android 12, Uzaktan Anahtar Hazırlamayı sunar ve Android 13, cihazların bunu uygulamasını gerektirir. Uzaktan Anahtar Hazırlama, sahadaki cihazlara uygulama başına ECDSA P256 doğrulama sertifikaları sağlar. Bu sertifikalar fabrikada sağlanan sertifikalara göre daha kısa ömürlüdür.

Birden fazla IMEI

Android 14, Android Anahtar Kanıtlama kaydına birden fazla IMEI desteği ekler. OEM'ler bu özelliği ikinci bir IMEI için KeyMint etiketi ekleyerek uygulayabilirler. Cihazların birden fazla hücresel radyoya sahip olması giderek daha yaygın hale geliyor ve OEM'ler artık iki IMEI'ye sahip cihazları destekleyebiliyor.

OEM'lerin, cihazlarında mevcutsa, KeyMint uygulamalarına sağlanacak ikincil bir IMEI'ye sahip olmaları gerekir; böylece bu uygulamalar, ilk IMEI'yi doğruladıkları şekilde bunu doğrulayabilirler.

Kimlik onayı

Android 8.0, Keymaster 3'e sahip cihazlar için isteğe bağlı kimlik doğrulama desteği içerir. Kimlik doğrulama, cihazın seri numarası veya IMEI gibi donanım tanımlayıcılarının kanıtını sağlamasına olanak tanır. İsteğe bağlı bir özellik olmasına rağmen, tüm Keymaster 3 uygulamalarının bunu desteklemesi önemle tavsiye edilir çünkü cihazın kimliğini kanıtlayabilmek, gerçek sıfır dokunuşlu uzaktan yapılandırma gibi kullanım durumlarının daha güvenli olmasını sağlar (çünkü uzak taraf, bunun sağlandığından emin olabilir). kimliğini taklit eden bir cihazla değil, doğru cihazla konuşuyor).

Kimlik onayı, cihaz fabrikadan çıkmadan önce yalnızca Güvenilir Yürütme Ortamı'nın (TEE) erişebileceği, cihazın donanım tanımlayıcılarının kopyalarını oluşturarak çalışır. Kullanıcı, cihazın önyükleyicisinin kilidini açabilir ve sistem yazılımını ve Android çerçeveleri tarafından bildirilen tanımlayıcıları değiştirebilir. TEE tarafından tutulan tanımlayıcıların kopyaları bu şekilde manipüle edilemez; bu, cihaz kimliği doğrulamasının yalnızca cihazın orijinal donanım tanımlayıcılarını doğrulayacağını ve böylece sahtekarlık girişimlerini önleyeceğini garanti eder.

Kimlik doğrulaması için ana API yüzeyi, Keymaster 2 ile sunulan mevcut anahtar doğrulama mekanizmasının üzerine kuruludur. Anahtar yöneticisi tarafından tutulan bir anahtar için bir doğrulama sertifikası talep edilirken, arayan kişi cihazın donanım tanımlayıcılarının doğrulama sertifikasının meta verilerine dahil edilmesini talep edebilir. Anahtar TEE'de tutuluyorsa, sertifika bilinen bir güven köküne zincirlenecektir. Böyle bir sertifikanın alıcısı, sertifikanın ve donanım tanımlayıcıları dahil içeriğinin TEE tarafından yazıldığını doğrulayabilir. Onay sertifikasına donanım tanımlayıcılarını dahil etmesi istendiğinde TEE, yalnızca fabrika ortamında doldurulan, deposunda tutulan tanımlayıcıları doğrular.

Depolama özellikleri

Cihazın tanımlayıcılarını tutan depolamanın şu özelliklere sahip olması gerekir:

  • Cihazın orijinal tanımlayıcılarından elde edilen değerler, cihaz fabrikadan çıkmadan önce depoya kopyalanır.
  • destroyAttestationIds() yöntemi, tanımlayıcıdan türetilmiş verilerin bu kopyasını kalıcı olarak yok edebilir. Kalıcı imha, verilerin tamamen kaldırılması anlamına gelir; dolayısıyla ne fabrika ayarlarına sıfırlama ne de cihazda gerçekleştirilen başka herhangi bir prosedür verileri geri yükleyemez. Bu, özellikle kullanıcının önyükleyicinin kilidini açtığı, sistem yazılımını değiştirdiği ve Android çerçevelerinin döndürdüğü tanımlayıcıları değiştirdiği cihazlar için önemlidir.
  • RMA tesisleri, donanım tanımlayıcısından türetilmiş verilerin yeni kopyalarını oluşturma yeteneğine sahip olmalıdır. Bu sayede RMA'dan geçen bir cihaz tekrar kimlik doğrulaması yapabilir. RMA tesisleri tarafından kullanılan mekanizma, kullanıcıların sahte kimlik doğrulamalarını elde etmelerine olanak tanıyacağından, kullanıcıların kendilerinin başlatamayacağı şekilde korunmalıdır.
  • TEE'deki Keymaster güvenilir uygulamasından başka hiçbir kod, depolamada saklanan tanımlayıcıdan türetilmiş verileri okuyamaz.
  • Depolamanın kurcalanmaya açık olması: Depolamanın içeriği değiştirilmişse, TEE bunu içeriğin kopyaları yok edilmiş gibi ele alır ve tüm kimlik doğrulama girişimlerini reddeder. Bu, aşağıda açıklandığı gibi depolamayı imzalayarak veya MAC'leyerek uygulanır.
  • Depolama orijinal tanımlayıcıları tutmuyor. Kimlik doğrulaması bir zorluk içerdiğinden, arayan kişi her zaman doğrulanacak tanımlayıcıları sağlar. TEE'nin yalnızca bunların başlangıçta sahip oldukları değerlerle eşleştiğini doğrulaması gerekir. Değerler yerine orijinal değerlerin güvenli karmalarının saklanması bu doğrulamayı mümkün kılar.

Yapı

Yukarıda listelenen özelliklere sahip bir uygulama oluşturmak için, kimlikten türetilmiş değerleri aşağıdaki yapı S'de saklayın. Cihaz sahibinin köklendirme yoluyla değiştirebileceği sistemdeki normal yerler dışında, kimlik değerlerinin diğer kopyalarını saklamayın:

S = D || HMAC(HBK, D)

Neresi:

  • D = HMAC(HBK, ID 1 ) || HMAC(HBK, ID 2 ) || ... || HMAC(HBK, ID n )
  • HMAC uygun güvenli hash'e sahip HMAC yapısıdır (SHA-256 önerilir)
  • HBK , başka herhangi bir amaçla kullanılmayan, donanıma bağlı bir anahtardır
  • ID 1 ...ID n orijinal ID değerleridir; Farklı cihazlar farklı sayıda tanımlayıcıya sahip olacağından, belirli bir değerin belirli bir endeksle ilişkilendirilmesi uygulamaya bağlıdır.
  • || birleştirmeyi temsil eder

HMAC çıkışları sabit boyutta olduğundan, bireysel kimlik karmalarını veya D'nin HMAC'sini bulmak için hiçbir başlık veya başka yapıya gerek yoktur. Doğrulama gerçekleştirmek için sağlanan değerleri kontrol etmenin yanı sıra, uygulamaların S'yi S'den çıkararak S'yi doğrulaması gerekir. , HMAC(HBK, D)'yi hesaplıyor ve hiçbir kimliğin değiştirilmediğini/bozulmadığını doğrulamak için bunu S'deki değerle karşılaştırıyor. Ayrıca uygulamalar, tüm bireysel kimlik öğeleri için sabit zamanlı karşılaştırmaları ve S'nin doğrulanmasını kullanmalıdır. Karşılaştırma süresi, sağlanan kimlik sayısına ve testin herhangi bir bölümünün doğru eşleşmesine bakılmaksızın sabit olmalıdır.

Donanım tanımlayıcıları

Kimlik doğrulaması aşağıdaki donanım tanımlayıcılarını destekler:

  1. Android'de Build.BRAND tarafından döndürülen marka adı
  2. Android'de Build.DEVICE tarafından döndürülen cihaz adı
  3. Android'de Build.PRODUCT tarafından döndürülen ürün adı
  4. Android'de Build.MANUFACTURER tarafından döndürülen üretici adı
  5. Android'de Build.MODEL tarafından döndürülen model adı
  6. Seri numarası
  7. Tüm radyoların IMEI'leri
  8. Tüm radyoların MEID'leri

Cihaz kimliği doğrulamasını desteklemek için bir cihaz bu tanımlayıcıları doğrular. Android çalıştıran tüm cihazlarda ilk altı özellik bulunur ve bu özelliğin çalışması için bunlar gereklidir. Cihazda herhangi bir entegre hücresel radyo varsa, cihazın aynı zamanda radyoların IMEI'leri ve/veya MEID'leri için doğrulamayı da desteklemesi gerekir.

Kimlik doğrulaması, bir anahtar doğrulama gerçekleştirilerek ve isteğe onaylanacak cihaz tanımlayıcıları dahil edilerek talep edilir. Tanımlayıcılar şu şekilde etiketlenir:

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

Doğrulanacak tanımlayıcı UTF-8 kodlu bir bayt dizesidir. Bu format sayısal tanımlayıcılar için de geçerlidir. Doğrulanacak her tanımlayıcı, UTF-8 kodlu bir dize olarak ifade edilir.

Cihaz kimlik doğrulamasını desteklemiyorsa (veya destroyAttestationIds() daha önce çağrılmışsa ve cihaz artık kimliklerini doğrulayamıyorsa), bu etiketlerden bir veya daha fazlasını içeren herhangi bir anahtar doğrulama isteği ErrorCode::CANNOT_ATTEST_IDS ile başarısız olur.

Cihaz kimlik doğrulamayı destekliyorsa ve yukarıdaki etiketlerden bir veya daha fazlası bir anahtar doğrulama isteğine dahil edilmişse TEE, etiketlerin her biriyle sağlanan tanımlayıcının donanım tanımlayıcılarının kopyasıyla eşleştiğini doğrular. Bir veya daha fazla tanımlayıcı eşleşmezse doğrulamanın tamamı ErrorCode::CANNOT_ATTEST_IDS ile başarısız olur. Aynı etiketin birden çok kez sağlanması geçerlidir. Bu, örneğin IMEI'leri doğrularken faydalı olabilir: Bir cihazın birden fazla IMEI'ye sahip birden fazla radyosu olabilir. Her ATTESTATION_ID_IMEI ile sağlanan değer cihazın radyolarından biriyle eşleşiyorsa bir doğrulama isteği geçerlidir. Aynı durum diğer tüm etiketler için de geçerlidir.

Onaylama başarılı olursa, onaylanmış kimlikler , yukarıdaki şema kullanılarak verilen doğrulama sertifikasının doğrulama uzantısına (OID 1.3.6.1.4.1.11129.2.1.17) eklenir. Keymaster 2 doğrulama şemasındaki değişiklikler açıklamalarla birlikte kalın harflerle yazılmıştır.

Java API'si

Bu bölüm yalnızca bilgilendirme amaçlıdır. Keymaster uygulayıcıları Java API'yi ne uygular ne de kullanır. Bu, uygulayıcıların özelliğin uygulamalar tarafından nasıl kullanıldığını anlamalarına yardımcı olmak için sağlanmıştır. Sistem bileşenleri bunu farklı şekilde kullanabilir; bu nedenle bu bölümün normatif olarak ele alınmaması çok önemlidir.