Ana makineye dayalı kart emülasyonuna genel bakış

NFC işlevi sunan birçok Android cihaz, NFC kart emülasyonunu zaten destekler. Çoğu durumda kart, cihazdaki güvenli öğe adı verilen ayrı bir çip tarafından taklit edilir. Kablosuz operatörler tarafından sağlanan birçok SIM kart da güvenli bir öğe içerir.

Android 4.4 ve sonraki sürümler, ana makineye dayalı kart emülasyonu adı verilen, güvenli öğe içermeyen ek bir kart emülasyonu yöntemi sunar. Bu sayede, tüm Android uygulamaları bir kartı taklit edebilir ve doğrudan NFC okuyucuyla iletişim kurabilir. Bu konuda, ana makineye dayalı kart emülasyonunun (HCE) Android'de nasıl çalıştığı ve bu tekniği kullanarak NFC kartı taklit eden bir uygulama nasıl geliştirebileceğiniz açıklanmaktadır.

Güvenlik öğesi içeren kart emülasyonu

NFC kart emülasyonu güvenli bir öğe kullanılarak sağlandığında, emülasyon yapılacak kart bir Android uygulaması aracılığıyla cihazdaki güvenli öğeye hazırlanır. Ardından, kullanıcı cihazı bir NFC terminalinin üzerine tuttuğunda cihazdaki NFC denetleyicisi, okuyucudaki tüm verileri doğrudan güvenli öğeye yönlendirir. Şekil 1'de bu kavram gösterilmektedir:

Güvenli öğeden bilgi almak için NFC denetleyicisinden geçen NFC okuyucunun bulunduğu şema
Şekil 1. Güvenlik unsuru içeren NFC kart emülasyonu.

NFC terminaliyle iletişimi güvenli öğe gerçekleştirir ve işleme hiçbir Android uygulaması dahil edilmez. İşlem tamamlandıktan sonra Android uygulaması, güvenli öğeyi doğrudan işlem durumu için sorgulayabilir ve kullanıcıyı bilgilendirebilir.

Ana makineye dayalı kart emülasyonu

Bir NFC kartı, ana makineye dayalı kart emülasyonu kullanılarak taklit edildiğinde veriler güvenli bir öğeye yönlendirilmek yerine doğrudan ana makinenin CPU'suna yönlendirilir. Şekil 2'de ana makineye dayalı kart emülasyonunun işleyiş şekli gösterilmektedir:

CPU'dan bilgi almak için NFC denetleyiciden geçen NFC okuyucunun bulunduğu şema
Şekil 2. Güvenlik unsuru olmadan NFC kartı taklit etme.

Desteklenen NFC kartları ve protokolleri

HCE protokol yığınını gösteren şema
Şekil 3. Android'in HCE protokol yığını.

NFC standartları birçok farklı protokolü destekler ve taklit edebileceğiniz farklı kart türleri vardır.

Android 4.4 ve sonraki sürümler, günümüzde pazarda yaygın olarak kullanılan çeşitli protokolleri destekler. Temassız ödeme kartları gibi mevcut temassız kartların çoğu bu protokolleri zaten temel alır. Bu protokoller, okuyucu olarak işlev gören Android NFC cihazlar da dahil olmak üzere günümüzde piyasadaki birçok NFC okuyucu tarafından da desteklenir (IsoDep sınıfına bakın). Bu sayede, yalnızca Android destekli cihazları kullanarak HCE ile ilgili uçtan uca bir NFC çözümü oluşturup dağıtabilirsiniz.

Özellikle Android 4.4 ve sonraki sürümler, NFC-Forum ISO-DEP spesifikasyonuna (ISO/IEC 14443-4'e dayalı) dayalı kartları taklit etmeyi ve ISO/IEC 7816-4 spesifikasyonunda tanımlandığı şekilde Uygulama Protokolü Veri Birimleri'ni (APDU'lar) işlemeyi destekler. Android, ISO-DEP'nin yalnızca Nfc-A (ISO/IEC 14443-3 A Tipi) teknolojisinin üzerinde taklit edilmesini zorunlu kılar. Nfc-B (ISO/IEC 14443-4 B Tipi) teknolojisi desteği isteğe bağlıdır. Şekil 3'te bu özelliklerin tümünün katmanlandırılması gösterilmektedir.

HCE hizmetleri

Android'deki HCE mimarisi, Android Service bileşenlerine (HCE hizmetleri olarak bilinir) dayanır. Bir hizmetin en önemli avantajlarından biri, herhangi bir kullanıcı arayüzü olmadan arka planda çalışabilmesidir. Bu, kullanıcının kullanmak için bir uygulamayı başlatması gerekmeyen bağlılık veya toplu taşıma kartları gibi birçok HCE uygulaması için doğal bir seçimdir. Bunun yerine, cihazı NFC okuyucuya dokundurarak doğru hizmeti başlatır (henüz çalışmıyorsa) ve işlemi arka planda yürütür. Elbette uygun olduğunda hizmetinizden ek kullanıcı arayüzü (kullanıcı bildirimleri gibi) başlatabilirsiniz.

Hizmet seçimi

Kullanıcı bir cihazı NFC okuyucuya dokunduğunda Android sisteminin, NFC okuyucunun hangi HCE hizmetiyle iletişim kurmak istediğini bilmesi gerekir. ISO/IEC 7816-4 spesifikasyonu, bir uygulama kimliği (AID) etrafında uygulamaların seçilmesini sağlayan bir yöntem tanımlar. AID en fazla 16 bayttan oluşur. Mevcut bir NFC okuyucu altyapısı için kartları taklit ediyorsanız bu okuyucuların aradığı AID'ler genellikle iyi bilinen ve herkese açık olarak kayıtlı olanlardır (ör. Visa ve MasterCard gibi ödeme ağlarının AID'leri).

Kendi uygulamanız için yeni bir okuyucu altyapısı dağıtmak istiyorsanız kendi AID'lerinizi kaydetmeniz gerekir. AID'lerin kayıt prosedürü ISO/IEC 7816-5 spesifikasyonunda tanımlanmıştır. Android için HCE uygulaması dağıtıyorsanız diğer uygulamalarla çakışmayı önlemek amacıyla 7816-5'e göre bir AID kaydettirmenizi öneririz.

AID grupları

Bazı durumlarda, belirli bir uygulamayı uygulamak için HCE hizmetinin birden fazla AID kaydetmesi ve tüm AID'ler için varsayılan işleyici olarak ayarlanması gerekebilir. Gruptaki başka bir hizmete giden bazı AID'ler desteklenmez.

Birlikte tutulan AID'lerin listesine AID grubu denir. Android, bir AID grubundaki tüm AID'ler için aşağıdakilerden birini garanti eder:

  • Gruptaki tüm AID'ler bu HCE hizmetine yönlendirilir.
  • Gruptaki hiçbir AID bu HCE hizmetine yönlendirilmez (örneğin, kullanıcı gruptaki bir veya daha fazla AID'yi isteyen başka bir hizmeti tercih ettiği için).

Diğer bir deyişle, gruptaki bazı AID'lerin bir HCE hizmetine, bazılarının ise başka bir HCE hizmetine yönlendirilebileceği bir ara durum yoktur.

AID grupları ve kategorileri

Her AID grubunu bir kategoriyle ilişkilendirebilirsiniz. Bu sayede Android, HCE hizmetlerini kategoriye göre gruplandırabilir. Bu da kullanıcının varsayılanları AID düzeyi yerine kategori düzeyinde belirlemesine olanak tanır. AID'ler ortalama bir kullanıcı için hiçbir şey ifade etmediğinden, uygulamanızın kullanıcılara yönelik bölümlerinde AID'lerden bahsetmeyin.

Android 4.4 ve sonraki sürümler iki kategoriyi destekler:

HCE hizmeti uygulama

Ana makine tabanlı kart emülasyonu kullanarak NFC kartı taklit etmek için NFC işlemlerini yöneten bir Service bileşeni oluşturmanız gerekir.

HCE desteği olup olmadığını kontrol etme

Uygulamanız, FEATURE_NFC_HOST_CARD_EMULATION özelliğini kontrol ederek bir cihazın HCE'yi destekleyip desteklemediğini kontrol edebilir. Uygulamanızın HCE özelliğini kullandığını ve bu özelliğin uygulamanın çalışması için gerekli olup olmadığını beyan etmek üzere uygulamanızın manifest dosyasında <uses-feature> etiketini kullanın.

Hizmet uygulama

Android 4.4 ve sonraki sürümler, HCE hizmeti uygulamak için temel olarak kullanabileceğiniz kullanışlı bir Service sınıfı sağlar: HostApduService sınıfı.

İlk adım, aşağıdaki kod örneğinde gösterildiği gibi HostApduService öğesini genişletmektir:

Kotlin

class MyHostApduService : HostApduService() {

    override fun processCommandApdu(commandApdu: ByteArray, extras: Bundle?): ByteArray {
       ...
    }

    override fun onDeactivated(reason: Int) {
       ...
    }
}

Java

public class MyHostApduService extends HostApduService {
    @Override
    public byte[] processCommandApdu(byte[] apdu, Bundle extras) {
       ...
    }
    @Override
    public void onDeactivated(int reason) {
       ...
    }
}

HostApduService, geçersiz kılmanız ve uygulamanız gereken iki soyut yöntem tanımlar. Bunlardan biri olan processCommandApdu(), bir NFC okuyucu hizmetinize Uygulama Protokolü Veri Birimi (APDU) gönderdiğinde çağrılır. APDU'lar ISO/IEC 7816-4 spesifikasyonunda tanımlanır. APDU'lar, NFC okuyucu ile HCE hizmetiniz arasında paylaşılan uygulama düzeyindeki paketlerdir. Bu uygulama düzeyindeki protokol yarı çift yönlüdür: NFC okuyucu size bir komut APDU'su gönderir ve karşılığında bir yanıt APDU'su göndermenizi bekler.

Daha önce de belirtildiği gibi Android, okuyucunun hangi HCE hizmetiyle iletişim kurmak istediğini belirlemek için AID'yi kullanır. NFC okuyucunun cihazınıza gönderdiği ilk APDU genellikle bir SELECT AID APDU'dur. Bu APDU, okuyucunun iletişime geçmek istediği AID'yi içerir. Android, bu AID'yi APDU'dan ayıklayıp bir HCE hizmetine çözer ve ardından bu APDU'yu çözülen hizmete iletir.

Yanıt APDU'sunun baytlarını processCommandApdu()'den döndürerek yanıt APDU'su gönderebilirsiniz. Bu yöntemin, uygulamanızın ana iş akışında çağrıldığını ve bu iş akışını engellememeniz gerektiğini unutmayın. Hemen bir yanıt APDU'su hesaplayıp döndüremiyorsanız null döndürün. Ardından, başka bir mesaj dizisinde gerekli işlemleri yapabilir ve HostApduService sınıfında tanımlanan sendResponseApdu() yöntemini kullanarak yanıtı gönderebilirsiniz.

Android, aşağıdakilerden biri gerçekleşene kadar okuyucudan yeni APDU'ları hizmetinize yönlendirmeye devam eder:

  • NFC okuyucu, işletim sisteminin farklı bir hizmete çözdüğü başka bir SELECT AID APDU gönderir.
  • NFC okuyucu ile cihazınız arasındaki NFC bağlantısı bozuk.

Bu iki durumda da sınıfınızın onDeactivated() uygulaması, iki durumdan hangisinin gerçekleştiğini belirten bir bağımsız değişkenle çağrılır.

Mevcut okuyucu altyapısıyla çalışıyorsanız okuyucuların HCE hizmetinizde beklediği mevcut uygulama düzeyindeki protokolü uygulamanız gerekir.

Kontrol ettiğiniz yeni bir okuyucu altyapısı dağıtıyorsanız kendi protokolünüzü ve APDU sıranızı tanımlayabilirsiniz. Değiştirilecek APDU'ların miktarını ve verilerin boyutunu sınırlamaya çalışın. Bu sayede kullanıcılarınızın cihazlarını NFC okuyucunun üzerinde yalnızca kısa bir süre tutması gerekir. Makul bir üst sınır, genellikle 300 ms içinde değiştirilebilen yaklaşık 1 KB veridir.

Hizmet manifesti beyanı ve AID kaydı

Hizmetinizi manifest'te her zamanki gibi belirtmeniz gerekir ancak hizmet beyanına bazı ek parçalar da eklemeniz gerekir:

  1. Platforma bunun bir HostApduService arayüzü uygulayan HCE hizmeti olduğunu bildirmek için hizmet beyanınıza SERVICE_INTERFACE işlemi için bir intent filtresi ekleyin.

  2. Platforma bu hizmet tarafından hangi AID gruplarının istendiğini bildirmek için hizmetin beyanına, HCE hizmetiyle ilgili ek bilgiler içeren bir XML kaynağına işaret eden bir SERVICE_META_DATA <meta-data> etiketi ekleyin.

  3. android:exported özelliğini true olarak ayarlayın ve hizmet beyanınızda android.permission.BIND_NFC_SERVICE iznini zorunlu kılın. İlki, hizmetin harici uygulamalar tarafından bağlanabilmesini sağlar. Bu durumda, yalnızca android.permission.BIND_NFC_SERVICE iznine sahip harici uygulamaların hizmetinize bağlanabileceği zorunlu kılınır. android.permission.BIND_NFC_SERVICE bir sistem izni olduğundan bu, hizmetinize yalnızca Android OS'in bağlanabileceğini etkili bir şekilde zorunlu kılar.

Aşağıda, HostApduService manifest beyanına dair bir örnek verilmiştir:

<service android:name=".MyHostApduService" android:exported="true"
         android:permission="android.permission.BIND_NFC_SERVICE">
    <intent-filter>
        <action android:name="android.nfc.cardemulation.action.HOST_APDU_SERVICE"/>
    </intent-filter>
    <meta-data android:name="android.nfc.cardemulation.host_apdu_service"
               android:resource="@xml/apduservice"/>
</service>

Bu meta veri etiketi bir apduservice.xml dosyasını işaret ediyor. Aşağıda, iki özel AID içeren tek bir AID grubu beyanı içeren bu tür bir dosyanın örneği verilmiştir:

<host-apdu-service xmlns:android="http://schemas.android.com/apk/res/android"
           android:description="@string/servicedesc"
           android:requireDeviceUnlock="false">
    <aid-group android:description="@string/aiddescription"
               android:category="other">
        <aid-filter android:name="F0010203040506"/>
        <aid-filter android:name="F0394148148100"/>
    </aid-group>
</host-apdu-service>

<host-apdu-service> etiketi, uygulama kullanıcı arayüzünde gösterebileceğiniz hizmetin kullanıcı dostu bir açıklamasını içeren bir <android:description> özelliği içermelidir. APDU'ları işlemek için bu hizmeti çağırmadan önce cihazın kilidinin açıldığını belirtmek için requireDeviceUnlock özelliğini kullanabilirsiniz.

<host-apdu-service>, bir veya daha fazla <aid-group> etiketi içermelidir. Her <aid-group> etiketinin aşağıdakileri yapması gerekir:

  • AID grubunun kullanıcı dostu bir açıklamasını içeren ve kullanıcı arayüzünde gösterilmeye uygun bir android:description özelliği içermelidir.
  • android:category özelliğini, AID grubunun ait olduğu kategoriyi (ör. CATEGORY_PAYMENT veya CATEGORY_OTHER tarafından tanımlanan dize sabitleri) belirtecek şekilde ayarlayın.
  • Her biri tek bir AID içeren bir veya daha fazla <aid-filter> etiketi içerir. AID'yi on altılık sayı biçiminde belirtin ve çift sayıda karakter içerdiğinden emin olun.

Uygulamanızın HCE hizmeti olarak kaydolmak için NFC iznine de sahip olması gerekir.

AID çakışması çözümü

Tek bir cihaza birden fazla HostApduService bileşeni yüklenebilir ve aynı AID birden fazla hizmet tarafından kaydedilebilir. Android, aşağıdaki adımları kullanarak hangi hizmetin çağrılacağını belirler:

  1. Kullanıcının seçtiği varsayılan cüzdan uygulaması AID'yi kaydettiyse bu uygulama çağrılır.
  2. Varsayılan cüzdan uygulaması AID'yi kaydetmediyse AID'yi kaydeden hizmet çağrılır.
  3. AID'yi birden fazla hizmet kaydettiyse Android, kullanıcıya hangi hizmetin çağrılacağını sorar.

Ön plan hizmeti tercihi

Ön plandaki uygulamalar, belirli bir etkinlik ön plandayken hangi kart taklit hizmetinin tercih edilmesi gerektiğini belirtmek için setPreferredService çağrılabilir. Bu ön plan uygulama tercihi, AID çakışması çözümünü geçersiz kılar. Uygulama, kullanıcının NFC kart emülasyonunu kullanabileceğini tahmin ettiğinde bu uygulama önerilir.

Android 13 ve sonraki sürümler

Ayarlar kullanıcı arayüzündeki varsayılan ödeme seçme listesine daha iyi sığması için banner koşulunu kare simge olarak ayarlayın. İdeal olarak, uygulama başlatıcı simgesi tasarımıyla aynı olmalıdır. Bu ayar, daha fazla tutarlılık ve daha temiz bir görünüm sağlar.

Android 12 ve önceki sürümler

Hizmet banner'ının boyutunu 260x96 dp olarak ayarlayın, ardından meta veri XML dosyanızdaki <host-apdu-service> etiketine android:apduServiceBanner özelliğini ekleyerek hizmet banner'ının boyutunu çizilebilir kaynağı işaret edecek şekilde ayarlayın. Aşağıda bir örnek verilmiştir:

<host-apdu-service xmlns:android="http://schemas.android.com/apk/res/android"
        android:description="@string/servicedesc"
        android:requireDeviceUnlock="false"
        android:apduServiceBanner="@drawable/my_banner">
    <aid-group android:description="@string/aiddescription"
               android:category="payment">
        <aid-filter android:name="F0010203040506"/>
        <aid-filter android:name="F0394148148100"/>
    </aid-group>
</host-apdu-service>

Cüzdan uygulamaları

Android 15 ve sonraki sürümlerde, kullanıcının Ayarlar > Uygulamalar > Varsayılan Uygulamalar'a giderek seçebileceği varsayılan bir cüzdan uygulaması rolü bulunur. Bu, bir ödeme terminaline dokunulduğunda çağrılacak varsayılan cüzdan uygulamasını tanımlar. Android, ödeme kategorisine sahip bir AID grubu beyan eden HCE hizmetlerini cüzdan uygulamaları olarak kabul eder.

Uygulamanızın varsayılan cüzdan uygulaması olup olmadığını kontrol etme

Uygulamalar, RoleManager.isRoleHeld()'e RoleManager.ROLE_WALLET göndererek varsayılan cüzdan uygulaması olup olmadıklarını kontrol edebilir.

Uygulamanız varsayılan değilse RoleManager.ROLE_WALLET değerini RoleManager.createRequestRoleIntent() değerine ileterek varsayılan cüzdan rolünü isteyebilirsiniz.

Cüzdan uygulamaları için gerekli öğeler

Daha görsel açıdan ilgi çekici bir kullanıcı deneyimi sunmak için HCE cüzdan uygulamalarının bir hizmet banner'ı sağlaması gerekir.

Gözlem Modu

Android 15'te İzleme Modu özelliği kullanıma sunulmuştur. Etkinleştirildiğinde gözlem modu, cihazın NFC anket döngülerini gözlemlemesine ve belirli bir NFC terminaliyle etkileşime geçmeye hazırlanabilmeleri için bunlarla ilgili bildirimleri uygun HostApduService bileşenlerine göndermesine olanak tanır. HostApduService, true öğesini setObserveModeEnabled()'a ileterek cihazı Gözlem Modu'na geçirebilir. Bu, NFC yığınına NFC işlemlerine izin vermemesini ve bunun yerine anket döngülerini pasif olarak gözlemlemesini söyler.

Anket döngüsü filtreleri

Aşağıdaki yöntemlerden birini kullanarak bir HostApduService için anket döngüsü filtreleri kaydedebilirsiniz:

Bir anket döngüsü filtresi standart olmayan anket çerçeveleriyle eşleştiğinde NFC yığını, processPollingFrames() yöntemini çağırarak bu anket çerçevelerini ilgili HostApduService'e yönlendirir. Bu sayede hizmet, kullanıcının işlem yapmaya hazır olduğundan ve işlem yapma niyetinde olduğundan emin olmak için gerekli tüm adımları (ör. kullanıcının kimliğini doğrulama) atabilir. Bir NFC okuyucu, anket döngüsünde yalnızca standart çerçeveler kullanıyorsa NFC yığını, bu anket çerçevelerini ön planda olan tercih edilen ön plan hizmetine veya aksi takdirde varsayılan cüzdan rolü sahibine yönlendirir.

Anket çerçevesi bildirimleri, getVendorSpecificGain() çağrısını yaparak alabileceğiniz, tedarikçi firmaya özgü bir alan gücü ölçümü de içerir. Tedarikçiler, tek bir bayta sığdığı sürece kendi ölçeklerini kullanarak ölçümler sağlayabilir.

Anket döngülerine yanıt verme ve gözlem modundan çıkma

Hizmet işlem yapmaya hazır olduğunda false değerini setObserveModeEnabled() değerine ileterek gözlem modundan çıkabilir. NFC yığını, işlemlerin devam etmesine izin verir.

HostApduService bileşenleri, tercih edilen ödeme hizmeti olduklarında gözlem modunun etkinleştirilmesi gerektiğini belirtmek için manifest dosyasında shouldDefaultToObserveMode değerini true olarak ayarlayabilir veya CardEmulation.setShouldDefaultToObserveModeForService() işlevini çağırabilir.

HostApduService ve OffHostApduService bileşenleri, alınan anket döngüsü çerçeveleriyle eşleşen anket döngüsü filtrelerinin, manifest'teki PollingLoopFilter beyanında autoTransact değerini true olarak ayarlayarak gözlem modunu otomatik olarak devre dışı bırakması ve işlemlerin devam etmesine izin vermesi gerektiğini de belirtebilir.

Ön plan hizmeti tercihi

Ön plandaki uygulamalar, belirli bir etkinlik ön plandayken hangi kart taklit hizmetinin tercih edilmesi gerektiğini belirtmek için setPreferredService çağrılabilir. Bu ön plan uygulama tercihi, cihazın belirli bir hizmet için shouldDefaultToObserveMode değerine karşılık gelen Gözlem Modu durumunu geçersiz kılar. Bu değer aşağıdaki yöntemlerden biriyle ayarlanabilir:

Ekran kapalı ve kilit ekranı davranışı

HCE hizmetlerinin davranışı, cihazda çalışan Android sürümüne göre değişir.

Android 15 ve sonraki sürümler

Varsayılan cüzdan uygulaması, destekleyen bir cihazda İzleme Modu'nu etkinleştirirse bu uygulama, işlemin ne zaman devam edebileceğini kontrol ettiği için kilit açma ve ekran kapatma davranışını geçersiz kılar. Gözlem Modu, tanımlanabilir bir anket döngüsü algılamazsa bazı cüzdan uygulamaları, işlemin devam edebilmesi için cihazın kilidinin açılmasını gerektirebilir.

Geliştiricilerin, tanımlanabilir anket döngüsü kalıpları yayınlamak için okuyucu cihazlarıyla çalışmaları ve uygulamalarından bu kalıpları işlemek için kayıt yapmaları önerilir.

Android 12 ve sonraki sürümler

Android 12 (API düzeyi 31) ve sonraki sürümleri hedefleyen uygulamalarda, requireDeviceScreenOn değerini false olarak ayarlayarak NFC ödemelerini cihazın ekranı açık olmadan etkinleştirebilirsiniz.

Android 10 ve sonraki sürümler

Android 10 (API düzeyi 29) veya sonraki sürümleri çalıştıran cihazlar Güvenli NFC'yi destekler. Güvenli NFC açıkken cihaz ekranı kapalıyken tüm kart emülatörleri (ana makine uygulamaları ve ana makine dışı uygulamalar) kullanılamaz. Güvenli NFC kapalıyken cihaz ekranı kapalıyken ana makine dışı uygulamalar kullanılabilir. isSecureNfcSupported() simgesini kullanarak Güvenli NFC desteği olup olmadığını kontrol edebilirsiniz.

Android 10 ve sonraki sürümleri çalıştıran cihazlarda, android:requireDeviceUnlock ayarının true olarak ayarlanması Android 9 ve önceki sürümleri çalıştıran cihazlarla aynı işlevi sağlar ancak yalnızca Güvenli NFC kapalıyken geçerlidir. Yani Güvenli NFC açıksa HCE hizmetleri, android:requireDeviceUnlock ayarından bağımsız olarak kilit ekranından çalışamaz.

Android 9 ve önceki sürümler

Android 9 (API düzeyi 28) ve önceki sürümleri çalıştıran cihazlarda, cihazın ekranı kapalıyken NFC denetleyicisi ve uygulama işlemcisi tamamen kapatılır. Bu nedenle, HCE hizmetleri ekran kapalıyken çalışmaz.

HCE hizmetleri, Android 9 ve önceki sürümlerde de kilit ekranından çalışabilir. Ancak bu, HCE hizmetinizin <host-apdu-service> etiketindeki android:requireDeviceUnlock özelliği tarafından kontrol edilir. Varsayılan olarak cihaz kilidinin açılması gerekmez ve cihaz kilitli olsa bile hizmetiniz çağrılır.

HCE hizmetiniz için android:requireDeviceUnlock özelliğini true olarak ayarlarsanız Android aşağıdaki durumlarda kullanıcıdan cihazın kilidini açmasını ister:

  • Kullanıcı bir NFC okuyucuya dokunur.
  • NFC okuyucu, hizmetinize çözümlenen bir AID seçer.

Android, kilidi açtıktan sonra kullanıcıdan işlemi tamamlamak için tekrar dokunmasını isteyen bir iletişim kutusu gösterir. Kullanıcı, kilidi açmak için cihazı NFC okuyucunun uzağına çekmiş olabileceğinden bu işlem gereklidir.

Güvenlik unsuru kartlarıyla birlikte kullanım

Bu bölüm, kart emülasyonu için güvenli öğeye dayalı bir uygulama dağıtmış geliştiriciler için faydalıdır. Android'in HCE uygulaması, güvenli öğelerin kullanımı da dahil olmak üzere kart taklidini uygulamanın diğer yöntemleriyle paralel olarak çalışacak şekilde tasarlanmıştır.

Bu birlikte yaşama durumu, AID yönlendirme adı verilen bir ilkeye dayanır. NFC denetleyicisi, yönlendirme kurallarının (sonlu) bir listesinden oluşan bir yönlendirme tablosu tutar. Her yönlendirme kuralı bir AID ve bir hedef içerir. Hedef, Android uygulamalarının çalıştığı ana makine CPU'su veya bağlı bir güvenli öğe olabilir.

NFC okuyucu, SELECT AID içeren bir APDU gönderdiğinde NFC denetleyicisi bu APDU'yu ayrıştırır ve AID'lerin yönlendirme tablosundaki herhangi bir AID ile eşleşip eşleşmediğini kontrol eder. Eşleşirse bu APDU ve ardından gelen tüm APDU'lar, başka bir SELECT AID APDU alınana veya NFC bağlantısı kesilene kadar AID ile ilişkili hedefe gönderilir.

Şekil 4'te bu mimari gösterilmektedir:

Hem güvenli öğe hem de CPU ile iletişim kuran NFC okuyucunun bulunduğu şema
Şekil 4. Hem güvenli unsur hem de ana kart emülasyonu ile çalışan Android.

NFC denetleyicisi genellikle APDU'lar için varsayılan bir rota da içerir. Yönlendirme tablosunda AID bulunmadığında varsayılan rota kullanılır. Bu ayar cihazdan cihaza farklılık gösterebilir ancak Android cihazların, uygulamanız tarafından kaydedilen AID'lerin ana makineye düzgün şekilde yönlendirildiğinden emin olması gerekir.

HCE hizmeti uygulayan veya güvenli öğe kullanan Android uygulamalarının yönlendirme tablosunu yapılandırma konusunda endişelenmesi gerekmez. Bu işlem Android tarafından otomatik olarak gerçekleştirilir. Android'in yalnızca hangi AID'lerin HCE hizmetleri tarafından, hangilerinin ise güvenli öğe tarafından işlenebileceğini bilmesi gerekir. Yönlendirme tablosu, hangi hizmetlerin yüklü olduğuna ve kullanıcının tercih ettiği şekilde yapılandırdığı hizmetlere göre otomatik olarak yapılandırılır.

Aşağıdaki bölümde, kart taklidi için güvenli öğe kullanan uygulamalarda AID'lerin nasıl tanımlanacağı açıklanmaktadır.

Güvenlik unsuru AID kaydı

Kart emülasyonu için güvenli öğe kullanan uygulamalar, manifest dosyalarında barındırıcı dışında bir hizmet tanımlayabilir. Bu tür bir hizmetin beyanı, HCE hizmetinin beyanıyla neredeyse aynıdır. İstisnalar aşağıdaki gibidir:

  • Amaç filtresinde kullanılan işlem SERVICE_INTERFACE olarak ayarlanmalıdır.
  • Meta veri adı özelliği SERVICE_META_DATA olarak ayarlanmalıdır.
  • Meta veri XML dosyası, <offhost-apdu-service> kök etiketini kullanmalıdır.

    <service android:name=".MyOffHostApduService" android:exported="true"
           android:permission="android.permission.BIND_NFC_SERVICE">
      <intent-filter>
          <action android:name="android.nfc.cardemulation.action.OFF_HOST_APDU_SERVICE"/>
      </intent-filter>
      <meta-data android:name="android.nfc.cardemulation.off_host_apdu_service"
                 android:resource="@xml/apduservice"/>
    </service>

Aşağıda, iki AID'yi kaydeden ilgili apduservice.xml dosya örneği verilmiştir:

<offhost-apdu-service xmlns:android="http://schemas.android.com/apk/res/android"
           android:description="@string/servicedesc">
    <aid-group android:description="@string/subscription" android:category="other">
        <aid-filter android:name="F0010203040506"/>
        <aid-filter android:name="F0394148148100"/>
    </aid-group>
</offhost-apdu-service>

Ana makine CPU'su işleme dahil olmadığı ve bu nedenle cihaz kilitliyken güvenli öğenin işlemleri yürütmesini engelleyemediği için android:requireDeviceUnlock özelliği, ana makine dışındaki hizmetler için geçerli değildir.

android:apduServiceBanner özelliği, ödeme uygulaması olan ve varsayılan ödeme uygulaması olarak seçilebilen barındırma dışı hizmetler için gereklidir.

Ana makine dışında hizmet çağırma

Gerçek işlemler Android hizmeti tarafından değil, güvenli öğe tarafından yürütüldüğü için Android hiçbir zaman "off-host" olarak tanımlanan bir hizmeti başlatmaz veya bu hizmete bağlanmaz. Hizmet beyanı, uygulamaların yalnızca güvenli öğede bulunan AID'leri kaydettirmesine olanak tanır.

HCE ve güvenlik

HCE mimarisi, temel bir güvenlik unsuru sağlar: Hizmetiniz BIND_NFC_SERVICE sistem izniyle korunduğundan yalnızca işletim sistemi hizmetinize bağlanabilir ve hizmetinizle iletişim kurabilir. Bu sayede, aldığınız APDU'ların aslında NFC denetleyicisinden işletim sistemi tarafından alınan APDU'lar olduğundan ve geri gönderdiğiniz APDU'ların yalnızca işletim sistemine gittiğinden, işletim sistemi de APDU'ları doğrudan NFC denetleyiciye yönlendirdiğinden emin olabilirsiniz.

Geriye kalan son endişe, uygulamanızın NFC okuyucuya gönderdiği verileri nereden aldığınızdır. Bu, HCE tasarımında kasıtlı olarak birbirinden ayrılmıştır. Verilerin nereden geldiği önemli değildir, yalnızca NFC denetleyicisine ve NFC okuyucuya güvenli bir şekilde aktarıldığından emin olunur.

HCE hizmetinizden göndermek istediğiniz verileri güvenli bir şekilde depolamak ve almak için örneğin, uygulamanızın verilerini diğer uygulamalardan ayıran Android Uygulama Korumalı Alanı'nı kullanabilirsiniz. Android güvenliği hakkında daha fazla bilgi için Güvenlik ipuçları başlıklı makaleyi okuyun.

Protokol parametreleri ve ayrıntıları

Bu bölüm, NFC protokollerinin çarpışma önleme ve etkinleştirme aşamalarında HCE cihazlarının hangi protokol parametrelerini kullandığını anlamak isteyen geliştiriciler için faydalıdır. Bu sayede Android HCE cihazlarıyla uyumlu bir okuyucu altyapısı oluşturabilirsiniz.

Nfc-A (ISO/IEC 14443 A tipi) protokolü çarpışma önleme ve etkinleştirme

Nfc-A protokolü etkinleştirme işlemi kapsamında birden fazla kare alışverişi yapılır.

Değişimin ilk bölümünde HCE cihazı UID'sini sunar. HCE cihazlarının rastgele bir UID'ye sahip olduğu varsayılmalıdır. Bu, her dokunuşta okuyucuya sunulan UID'nin rastgele oluşturulmuş bir UID olduğu anlamına gelir. Bu nedenle, NFC okuyucular kimlik doğrulama veya tanımlama biçimi olarak HCE cihazlarının UID'sine bağlı olmamalıdır.

NFC okuyucu daha sonra SEL_REQ komutu göndererek HCE cihazını seçebilir. HCE cihazının SEL_RES yanıtında en az 6. bit (0x20) ayarlanmıştır. Bu, cihazın ISO-DEP'yi desteklediğini gösterir. SEL_RES'teki diğer bitlerin de ayarlanabileceğini unutmayın. Bu, örneğin NFC-DEP (p2p) protokolü için destek olduğunu gösterir. Diğer bitler ayarlanmış olabileceğinden, HCE cihazlarla etkileşime geçmek isteyen okuyucular yalnızca 6. biti açıkça kontrol etmeli ve SEL_RES değerinin tamamını 0x20 değeriyle karşılaştırmamalıdır.

ISO-DEP etkinleştirme

Nfc-A protokolü etkinleştirildikten sonra NFC okuyucu, ISO-DEP protokolü etkinleştirme işlemini başlatır. RATS (Request for Answer To Select) komutu gönderir. NFC denetleyicisi RATS yanıtını, ATS'yi oluşturur; ATS, HCE hizmetleri tarafından yapılandırılamaz. Ancak HCE uygulamalarının ATS yanıtı için NFC Forum şartlarını karşılaması gerekir. Bu nedenle NFC okuyucular, bu parametrelerin herhangi bir HCE cihaz için NFC Forum şartlarına uygun şekilde ayarlandığından emin olabilir.

Aşağıdaki bölümde, HCE cihazındaki NFC denetleyicisi tarafından sağlanan ATS yanıtının ayrı baytları hakkında daha fazla ayrıntı verilmektedir:

  • TL: ATS yanıtının uzunluğu. 20 bayttan uzun bir uzunluk belirtmemelidir.
  • T0: 5, 6 ve 7 bitleri tüm HCE cihazlarında ayarlanmalıdır. Bu, ATS yanıtına TA(1), TB(1) ve TC(1)'nin dahil edildiğini gösterir. 1 ile 4 arasındaki bitler, maksimum kare boyutunu kodlayan FSCI'yi gösterir. HCE cihazlarda FSCI değeri 0 ile 8 saat arasında olmalıdır.
  • T(A)1: Okuyucu ile emülatör arasındaki bit hızlarını ve bunların asimetrik olup olamayacağını tanımlar. HCE cihazlar için bit hızı şartları veya garantileri yoktur.
  • T(B)1: 1 ile 4 arasındaki bitler, Başlangıç Çerçeve Koruması zamanı tam sayı değerini (SFGI) gösterir. HCE cihazlarda SFGI 8 saatten kısa olmalıdır. 5 ila 8. bitler, kare bekleme süresi tam sayısını (FWI) gösterir ve kare bekleme süresini (FWT) kodlar. HCE cihazlarda FWI 8 saatten kısa olmalıdır.
  • T(C)1: 5. bit, "Gelişmiş Protokol özellikleri" için desteği gösterir. HCE cihazlar "Gelişmiş Protokol özelliklerini" destekleyebilir veya desteklemeyebilir. 2. bit, DID desteğini gösterir. HCE cihazlar DID'yi destekleyebilir veya desteklemeyebilir. 1. bit, NAD desteğini gösterir. HCE cihazlar NAD'yi desteklememeli ve 1. biti sıfıra ayarlamalıdır.
  • Geçmiş baytlar: HCE cihazlar 15'e kadar geçmiş bayt döndürebilir. HCE hizmetleriyle etkileşime geçmek isteyen NFC okuyucuları, geçmiş baytların içerikleri veya varlığı hakkında hiçbir varsayımda bulunmamalıdır.

Birçok HCE cihazın, EMVCo'da birleşen ödeme ağlarının "Temassız İletişim Protokolü" spesifikasyonunda belirttiği protokol şartlarına uygun hale getirildiğini unutmayın. Özellikle:

  • T0'daki FSCI, 2 ile 8 saat arasında olmalıdır.
  • T(A)1, yalnızca 106 kbit/sn bit hızının desteklendiğini ve okuyucu ile emülatör arasındaki asimetrik bit hızlarının desteklenmediğini belirten 0x80 olarak ayarlanmalıdır.
  • T(B)1'deki FWI 7 saatten kısa olmalıdır.

APDU veri değişimi

Daha önce de belirtildiği gibi, HCE uygulamaları yalnızca tek bir mantıksal kanalı destekler. Farklı mantıksal kanallarda uygulama seçmeye çalışmak HCE cihazlarda işe yaramaz.