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

NFC işlevi sunan Android destekli birçok cihaz, NFC kart emülasyonunu zaten desteklemektedir. Çoğu durumda kart, cihazda güvenli öğe adı verilen ayrı bir çip tarafından emüle edilir. Kablosuz operatörler tarafından sağlanan birçok SIM kartta güvenlik unsuru da bulunur.

Android 4.4 ve sonraki sürümler, güvenli öğe içermeyen ek bir kart emülasyonu yöntemi sunar. Bu yönteme ana makine tabanlı kart emülasyonu denir. Bu, herhangi bir Android uygulamasının bir kart emüle etmesine ve doğrudan NFC okuyucuyla iletişim kurmasına olanak tanır. Bu konuda, ana makine tabanlı kart emülasyonunun (HCE) Android'de nasıl çalıştığı ve bu tekniği kullanarak bir NFC kartı emülasyonu yapan bir uygulamayı nasıl geliştirebileceğiniz açıklanmaktadır.

Güvenlik unsuru içeren kart emülasyonu

NFC kart emülasyonu bir güvenlik unsuru kullanılarak sağlandığında emüle edilecek kart, bir Android uygulaması aracılığıyla cihazdaki güvenlik unsuruna sağlanır. Daha sonra, kullanıcı cihazı bir NFC terminalinin üzerinde tuttuğunda, cihazdaki NFC denetleyicisi okuyucudaki tüm verileri doğrudan güvenli öğeye yönlendirir. Şekil 1'de bu kavram gösterilmektedir:

Güvenlik unsurundan bilgi almak için NFC denetleyiciden geçen NFC okuyucuyu gösteren şema
Şekil 1. Güvenlik unsuru içeren NFC kart emülasyonu

Güvenlik unsurunun kendisi NFC terminaliyle iletişimi gerçekleştirir ve işleme herhangi bir Android uygulaması dahil edilmez. İşlem tamamlandıktan sonra bir Android uygulaması, güvenli öğeyi doğrudan işlem durumu için sorgulayabilir ve kullanıcıya bildirim gönderebilir.

Ana makineye dayalı kart emülasyonu

Ana makine tabanlı kart emülasyonu kullanılarak bir NFC kartı emülasyonu yapıldığında veriler, güvenli öğeye yönlendirilmek yerine doğrudan ana makinenin CPU'suna yönlendirilir. Şekil 2'de ana makine tabanlı kart emülasyonunun nasıl çalıştığı gösterilmiştir:

CPU'dan bilgi almak için NFC denetleyicisini kullanan NFC okuyucuyu gösteren şema
Şekil 2. Güvenlik unsuru olmadan NFC kart emülasyonu

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 emüle 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 desteklemektedir. Temassız ödeme kartları gibi mevcut temassız kartların çoğu, bu protokolleri 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 desteklenmektedir (IsoDep sınıfına bakın). Böylece yalnızca Android destekli cihazları kullanarak HCE çevresinde uçtan uca NFC çözümü oluşturup dağıtabilirsiniz.

Özellikle Android 4.4 ve sonraki sürümler, NFC-Forumu ISO-DEP spesifikasyonuna (ISO/IEC 14443-4'e göre) dayalı emülasyon kartlarını ve ISO/IEC 7816-4 spesifikasyonunda tanımlandığı şekilde Uygulama Protokolü Veri Birimlerini (APDU) işler. Android, yalnızca Nfc-A (ISO/IEC 14443-3 Type A) teknolojisinin üstünde ISO-DEP'nin emülasyonunu zorunlu kılar. Nfc-B (ISO/IEC 14443-4 Tip B) teknolojisi için destek isteğe bağlıdır. Şekil 3'te tüm bu özelliklerin katmanları gösterilmektedir.

HCE hizmetleri

Android'deki HCE mimarisi, Android Service bileşenlerini (HCE hizmetleri olarak bilinir) temel alır. Bir hizmetin temel avantajlarından biri, herhangi bir kullanıcı arayüzü olmadan arka planda çalışabilmesidir. Bu, kullanıcının kullanmak için bir uygulama başlatması gerekmeyen bağlılık veya toplu taşıma kartları gibi birçok HCE uygulaması için doğaldır. Bunun yerine, henüz çalışmıyorsa doğru hizmeti başlatan cihazı NFC okuyucuya dokundurur ve işlemi arka planda gerçekleştirir. Uygun durumlarda 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, uygulama seçmek için bir Uygulama Kimliği (AID) merkezli şekilde bir yöntem tanımlar. AID, en fazla 16 bayttan oluşur. Mevcut bir NFC okuyucu altyapısı için kartlar emüle ediyorsanız bu okuyucuların aradığı AID'ler genellikle iyi bilinen ve herkese açık olarak kayıtlıdır (örneğin Visa ve MasterCard gibi ödeme ağlarının AI'ları).

Kendi uygulamanız için yeni okuyucu altyapısı dağıtmak istiyorsanız kendi AID'lerinizi kaydetmeniz gerekir. AID'lerin tescil prosedürü, ISO/IEC 7816-5 spesifikasyonunda tanımlanmıştır. Android için bir HCE uygulaması dağıtıyorsanız diğer uygulamalarla çakışmaları önleyeceğinden AID'yi 7816-5 uyarınca kaydettirmenizi öneririz.

AID grupları

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

Bir arada tutulan AID'lerin listesine AID grubu adı verilir. 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ı, grubunuzda bir veya daha fazla AID isteyen başka bir hizmeti tercih ettiği için).

Yani gruptaki bazı AID'lerin bir HCE hizmetine, bazılarıysa diğerine yönlendirilebileceği ara durum yoktur.

AID grupları ve kategorileri

Her AID grubunu bir kategoriyle ilişkilendirebilirsiniz. Bu, Android'in HCE hizmetlerini kategoriye göre gruplandırmasına ve böylece kullanıcının, varsayılanları AID düzeyi yerine kategori düzeyinde belirlemesine olanak tanır. Ortalama kullanıcı için bir şey ifade etmediklerinden uygulamanızın kullanıcılara yönelik kısımlarında AID'lerden bahsetmekten kaçının.

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

Bir HCE hizmeti uygulayın

Ana makineye dayalı kart emülasyonunu kullanarak bir NFC kartı emülasyonu yapmak için NFC işlemlerini gerçekleştiren bir Service bileşeni oluşturmanız gerekir.

HCE desteğini kontrol et

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 uygulamanın çalışması için gerekli olup olmadığını beyan etmek için uygulamanızın manifest dosyasındaki <uses-feature> etiketini kullanın.

Hizmet uygulaması

Android 4.4 ve sonraki sürümler, bir HCE hizmetini uygularken temel olarak kullanabileceğiniz bir kolaylık Service sınıfı sunar: HostApduService sınıfı.

İlk adım, aşağıdaki kod örneğinde gösterildiği gibi HostApduService alanını 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 açıklar. NFC okuyucu, hizmetinize Uygulama Protokolü Veri Birimi (APDU) gönderdiğinde bunlardan processCommandApdu() çağrılır. APDU'lar, ISO/IEC 7816-4 spesifikasyonunda tanımlanmıştır. APDU'lar, NFC okuyucu ve HCE hizmetiniz arasında iletilen uygulama düzeyinde paketlerdir. Uygulama düzeyindeki protokol yarı çift yönlüdür: NFC okuyucu size bir komut APDU gönderir, siz de buna karşılık APDU göndermenizi bekler.

Daha önce de belirtildiği gibi Android, okuyucunun hangi HCE hizmetiyle konuşmak istediğini belirlemek için AID'yi kullanır. Genellikle, bir NFC okuyucusunun cihazınıza gönderdiği ilk APDU bir SELECT AID APDU'dur. Bu APDU, okuyucunun konuşmak istediği AID'yi içerir. Android bu AID'yi APDU'dan alır, bir HCE hizmetine çözer ve ardından bu APDU'yu çözümlenen hizmete yönlendirir.

processCommandApdu() öğesinden yanıt APDU'nun baytlarını döndürerek bir yanıt APDU gönderebilirsiniz. Bu yöntemin, uygulamanızın engellenmemeniz gereken ana iş parçacığında çağrıldığını unutmayın. Bir yanıt APDU'sunu hesaplayıp hemen döndüremiyorsanız null değerini döndürün. Daha sonra, gerekli çalışmaları başka bir iş parçacığı üzerinde yapabilir ve işiniz bittiğinde yanıtı göndermek için HostApduService sınıfında tanımlanan sendResponseApdu() yöntemini kullanabilirsiniz.

Android, aşağıdaki durumlardan biri gerçekleşene kadar yeni APDU'ları okuyucudan 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.

Her iki durumda da sınıfınızın onDeactivated() uygulaması, bunlardan 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üzeyinde protokolü uygulamanız gerekir.

Sizin kontrolünüzde olan yeni okuyucu altyapısını dağıtıyorsanız kendi protokolünüzü ve APDU sıranızı tanımlayabilirsiniz. APDU sayısını ve değiştirilecek verilerin boyutunu sınırlandırmaya çalışın: Böylece kullanıcılarınızın cihazlarını NFC okuyucu üzerinde yalnızca kısa bir süre tutmaları yeterli olur. Makul bir üst sınır yaklaşık 1 KB veridir ve genellikle 300 ms içinde değiştirilebilir.

Hizmet manifesti beyanı ve AID kaydı

Hizmetinizi manifest dosyasında her zamanki gibi beyan etmeniz gerekir ancak hizmet beyanına bazı ek bilgiler de eklemeniz gerekir:

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

  2. Platforma bu hizmetin hangi AID gruplarını istediğini bildirmek için hizmet bildirimine HCE hizmeti hakkında ek bilgiler içeren bir XML kaynağına işaret eden SERVICE_META_DATA <meta-data> etiketi ekleyin.

  3. android:exported özelliğini true olarak ayarlayın ve hizmet bildiriminizde android.permission.BIND_NFC_SERVICE iznini gerekli kılın. İlki, hizmetin harici uygulamalara bağlanabilmesini sağlar. Üçüncü taraf uygulama daha sonra yalnızca android.permission.BIND_NFC_SERVICE iznine sahip harici uygulamaların hizmetinize bağlanmasını zorunlu kılar. android.permission.BIND_NFC_SERVICE bir sistem izni olduğundan, hizmetinize yalnızca Android OS'in bağlanmasını etkili bir şekilde zorunlu kılar.

Aşağıda, HostApduService manifest beyanının bir örneği 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 eder. Aşağıda, iki özel AID içeren tek bir AID grubu bildirimine sahip bir dosya ö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, uygulamanın kullanıcı arayüzünde gösterebileceğiniz kullanıcı dostu bir hizmet açıklamasını içeren <android:description> özelliği içermelidir. APDU'ları işlemek için bu hizmeti çağırmadan önce cihazın kilidinin açılacağını belirtmek için requireDeviceUnlock özelliğini kullanabilirsiniz.

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

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

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

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

Tek bir cihaza birden fazla HostApduService bileşeni yüklenebilir ve aynı AID birden fazla hizmet tarafından kaydedilebilir. Android, AID'nin ait olduğu kategoriye bağlı olarak AID çakışmalarını farklı şekillerde çözer. Her kategorinin farklı bir çatışma çözümü politikası olabilir.

Kullanıcının, ödeme gibi bazı kategoriler için Android ayarları kullanıcı arayüzünde varsayılan bir hizmet seçmesi mümkün olabilir. Diğer kategoriler için politika, çakışma durumunda her zaman kullanıcıya hangi hizmeti çağıracağını sormak olabilir. Belirli bir kategori için anlaşmazlık çözümü politikasını sorgulama hakkında bilgi edinmek için getSelectionModeForCategory() sayfasını inceleyin.

Hizmetinizin varsayılan olup olmadığını kontrol etme

Uygulamalar, isDefaultServiceForCategory() API'yi kullanarak HCE hizmetlerinin belirli bir kategori için varsayılan hizmet olup olmadığını kontrol edebilir.

Hizmetiniz varsayılan değilse ACTION_CHANGE_DEFAULT kullanılarak varsayılan hale getirilmesini isteyebilirsiniz.

Ödeme uygulamaları

Android, ödeme kategorisinde AID grubu beyan eden HCE hizmetlerini ödeme uygulaması olarak kabul eder. Android 4.4 ve sonraki sürümler, dokundur ve öde adlı üst düzey bir Ayarlar menü girişi içerir. Bu giriş, bu tür tüm ödeme uygulamalarını içerir. Bu ayarlar menüsünde, kullanıcı bir ödeme noktasına dokunulduğunda çağrılacak varsayılan ödeme uygulamasını seçebilir.

Ödeme uygulamaları için gerekli öğeler

Görsel olarak daha ilgi çekici bir kullanıcı deneyimi sunmak için HCE ödeme uygulamalarının hizmet banner'ı sağlaması gerekir.

Android 13 ve sonraki sürümler

Ayarlar kullanıcı arayüzündeki varsayılan ödeme seçimi listesine daha iyi sığdırmak için banner şartını kare simge olarak ayarlayın. İdeal olarak bu simge, uygulama başlatıcı simgesinin tasarımıyla aynı olmalıdır. Bu ayarlama 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 çekilebilir kaynağı işaret eden <host-apdu-service> etiketine android:apduServiceBanner özelliğini ekleyerek meta veri XML dosyanızda hizmet banner'ının boyutunu 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>

Ekran kapatma ve kilit ekranı davranışı

HCE hizmetlerinin davranışı, cihazda çalışan Android sürümüne bağlı olarak değişiklik gösterir.

Android 12 ve sonraki sürümler

Android 12 (API düzeyi 31) ve sonraki sürümleri hedefleyen uygulamalarda requireDeviceScreenOn özelliğini false seçeneğine 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 hiçbir kart emülatörleri (barındırıcı uygulamalar ve ana makine dışı uygulamalar) kullanılamaz. Güvenli NFC kapalıyken, ana makine dışı uygulamalar cihaz ekranı kapalıyken kullanılabilir. Güvenli NFC desteğini isSecureNfcSupported() kullanarak kontrol edebilirsiniz.

Android 10 ve sonraki sürümleri çalıştıran cihazlarda android:requireDeviceUnlock değerini true olarak ayarlama işlevi, Android 9 ve önceki sürümleri çalıştıran cihazlarda olduğu gibi geçerlidir. Ancak bu işlev yalnızca Güvenli NFC kapalı olduğunda geçerlidir. Diğer bir deyişle, Güvenli NFC özelliği açıkken 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 denetleyici ve uygulama işlemcisi tamamen kapanır. Bu nedenle, HCE hizmetleri ekran kapalıyken çalışmaz.

Ayrıca, Android 9 ve önceki sürümlerde HCE hizmetleri 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ın kilidinin açılması gerekmez ve hizmetiniz cihaz kilitli olsa bile ç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 dokunduğunda.
  • NFC okuyucu, hizmetinize çözümlenen bir AID seçer.

Kilit açıldıktan sonra Android, kullanıcının işlemi tamamlamak için tekrar dokunmasını isteyen bir iletişim kutusu gösteriyor. Kullanıcı, kilidini açmak için cihazı NFC okuyucudan uzağa taşımış olabileceğinden bu gereklidir.

Güvenlik unsuru kartlarıyla birlikte kullanım

Bu bölüm, kart emülasyonu için güvenlik unsuruna dayanan bir uygulama dağıtan geliştiricilerin ilgisini çeker. Android'in HCE uygulaması, güvenli öğelerin kullanımı da dahil olmak üzere diğer kart emülasyonu uygulama yöntemleriyle paralel çalışacak şekilde tasarlanmıştır.

Bu birlikte kullanım, AID yönlendirmesi adlı bir ilkeye dayanır. NFC denetleyicisi, (sonlu) yönlendirme kuralları 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üvenlik öğesi olabilir.

NFC okuyucu, SELECT AID ile bir APDU gönderdiğinde NFC denetleyicisi bunu 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 söz konusu APDU ve onu takip eden 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:

NFC okuyucunun hem güvenlik unsuru hem de CPU ile iletişim kurduğu şema
Şekil 4. Android hem güvenli öğe hem de ana makine kartı emülasyonu ile çalışır.

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

HCE hizmeti kullanan veya güvenlik unsuru kullanan Android uygulamalarının, Android tarafından otomatik olarak gerçekleştirilen yönlendirme tablosunu yapılandırmayla ilgili endişe duymanıza gerek yoktur. Android'in tek yapması gereken, hangi AID'lerin HCE hizmetleri tarafından, hangilerinin ise güvenlik unsuru tarafından işlenebileceğini. Yönlendirme tablosu, yüklenen hizmetlere ve kullanıcının tercih edilen olarak yapılandırdığı hizmetlere göre otomatik olarak yapılandırılır.

Aşağıdaki bölümde, kart emülasyonu 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üvenlik unsuru kullanan uygulamalar, manifest dosyalarında ana makine dışı hizmet beyan edebilir. Bu tür bir hizmetin beyanı, HCE hizmetinin beyanıyla neredeyse aynıdır. İstisnalar ise şunlardır:

  • 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 kaydeden karşılık gelen apduservice.xml dosyası ö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 makinenin CPU'su işleme dahil olmadığından ve bu nedenle, cihaz kilitliyken güvenli öğenin işlemleri yürütmesini engelleyemediğinden android:requireDeviceUnlock özelliği ana makine dışı hizmetler için geçerli değildir.

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

Ana makine dışı hizmet çağrısı

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 "ana makine dışında" olarak tanımlanan bir hizmeti başlatmaz veya bu hizmete bağlanmaz. Hizmet beyanı yalnızca uygulamaların güvenli öğede bulunan AID'leri kaydetmesine izin verir.

HCE ve güvenlik

HCE mimarisi tek bir güvenlik unsuru sağlar: Hizmetiniz BIND_NFC_SERVICE sistem izniyle korunduğu için hizmetinize yalnızca işletim sistemi bağlanıp onunla iletişim kurabilir. Bu, aldığınız herhangi bir APDU'nun aslında işletim sistemi tarafından NFC denetleyicisinden alınan bir APDU olmasını ve geri gönderdiğiniz herhangi bir APDU'nun yalnızca işletim sistemine gittiğini ve böylece APDU'ları doğrudan NFC denetleyicisine yönlendirmesini sağlar.

Kalan son sorun, uygulamanızın NFC okuyucuya gönderdiği verilerinizi nereden aldığınızdır. Bu, HCE tasarımında kasıtlı olarak ayrıştırılmıştır. Verilerin nereden geldiği dikkate alınmaz, sadece NFC denetleyicisine ve NFC okuyucuya güvenli bir şekilde aktarılması sağlanır.

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 izole eden Android Uygulama Korumalı Alanı'ndan yararlanabilirsiniz. Android güvenliği hakkında daha fazla ayrıntı için Güvenlik ipuçlarını 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ştiricilerin ilgisini çeker. Böylece Android HCE cihazlarıyla uyumlu bir okuyucu altyapısı oluşturabilirsiniz.

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

Nfc-A protokolü etkinleştirmesinin bir parçası olarak 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'si 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 yöntemi olarak HCE cihazlarının UID'sini kullanmamalıdır.

NFC okuyucu daha sonra bir SEL_REQ komutu göndererek HCE cihazını seçebilir. HCE cihazının SEL_RES yanıtında, cihazın ISO-DEP'yi desteklediğini gösteren en az 6. bit (0x20) seti vardır. Bu, SEL_RES içindeki diğer bitlerin de ayarlanmış olabileceğini ve bunun, örneğin NFC-DEP (p2p) protokolünü desteklediğini gösterir. Başka bitler de ayarlanabildiğinden, HCE cihazlarıyla etkileşim kurmak isteyen okuyucular açık bir şekilde yalnızca 6. biti kontrol etmeli ve SEL_RES öğesinin tamamını 0x20 değeriyle karşılaştırmamalıdır.

ISO-DEP'yi etkinleştirme

Nfc-A protokolü etkinleştirildikten sonra NFC okuyucu, ISO-DEP protokolü etkinleştirmesini başlatır. Bir RATS (Seçme Yanıtı İsteği) komutu gönderir. NFC denetleyici, RATS yanıtını (ATS) oluşturur. ATS, HCE hizmetleri tarafından yapılandırılamaz. Bununla birlikte, HCE uygulamalarının ATS yanıtı için NFC Forum şartlarını karşılaması gerekir. Böylece NFC okuyucular, herhangi bir HCE cihazı için NFC Forum şartlarına uygun olarak bu parametrelerin ayarlanacağına güvenebilir.

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

  • Özet: ATS yanıtının uzunluğu. 20 bayttan büyük bir uzunluk belirtilmemelidir.
  • T0: Tüm HCE cihazlarında 5, 6 ve 7 bitleri ayarlanarak TA(1), TB(1) ve TC(1) ATS yanıtına dahil edilir. 1 ile 4 arasındaki bitler, maksimum kare boyutunu kodlayarak FSCI'yı belirtir. HCE cihazlarında FSCI değeri 0 - 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ı gerekliliği veya garantisi yoktur.
  • T(B)1: 1 ila 4 arasındaki bitler, Başlangıç Çerçeve Koruması zaman Tam sayısını (SFGI) belirtir. HCE cihazlarında SFGI <= 8 saat olmalıdır. 5-8 arasındaki bitler Kare Bekleme Süresi Tam Sayısını (FWI) belirtir ve Çerçeve Bekleme Süresi'ni (FWT) kodlar. HCE cihazlarda FWI <= 8 saat olmalıdır.
  • T(C)1: bit 5, "Gelişmiş Protokol özellikleri" desteği olduğunu belirtir. HCE cihazlarının "Gelişmiş Protokol özellikleri"ni desteklemesi veya desteklememesi mümkündür. Bit 2, DID desteğini gösterir. HCE cihazlarının DID'yi desteklemesi veya desteklememesi mümkündür. Bit 1, NAD'nin desteklendiğini gösterir. HCE cihazları NAD'yi desteklememeli ve bit 1'i sıfır olarak ayarlamalıdır.
  • Geçmiş baytlar: HCE cihazları en fazla 15 geçmiş baytı döndürebilir. HCE hizmetleriyle etkileşim kurmak isteyen NFC okuyucular, geçmiş baytların içeriği veya bunların varlığı hakkında varsayımda bulunmamalıdır.

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

  • T0'daki FSCI, 2 - 8 saat arasında olmalıdır.
  • T(A)1, 0x80 olarak ayarlanmalıdır. Bu, 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 gösterir.
  • T(B)1'deki FWI değeri <= 7 saat olmalıdır.

APDU veri alışverişi

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