PROGRES – Projet 4 : Lecture des cartes NFC et HCE
Le but de ce projet est d’introduire le principe de la communication sans contact NFC afin de pouvoir développer des applications NFC dans le future. La maitrise
« du langage Java et la programmation Android » est indispensable. Ainsi que, il faut avoir au moins un smartphone Android intégrant une antenne NFC et au moins une carte bancaire NFC ou une carte Navigo.
Les AIDs internationales des cartes bancaires sont en ligne :
https://www.eftlab.co.uk/index.php/site-map/knowledge-base/211-emv-aid- rid-pix
Partie I : Détection des cartes NFC
Dans cette partie, vous aurez besoin d’un seul smartphone NFC pour l’utiliser comme un lecteur NFC et une ou plusieurs cartes NFC.
Application lecteur NFC :
- Activer le NFC dans le manifest :
<uses-permission android:name="android.permission.NFC" />
<uses-feature android:name="android.hardware.nfc"
android:required="true" />
- Créer un nouveau projet Android : Empty
- Créer une interface graphique de votre choix avec un bouton Read et un EditText.
- Chercher l’AID de votre carte NFC et utiliser la commande APDU suivante : SELECT AID pour accéder à votre carte.
- Afficher la réponse APDU de la carte dans l’EditText.
- Si vous avez plusieurs cartes NFC, refaire la même chose avec leurs AIDs.
Utiliser les variables et les fonctions suivantes :
private static final String SELECT_APDU_HEADER = "00A40400";
private static final byte[] SELECT_OK_SW = {(byte) 0x90, (byte) 0x00};
public static byte[] HexStringToByteArray(String s) { int len = s.length();
byte[] data = new byte[len / 2];
for (int i = 0; i < len; i += 2) {
data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4)
+ Character.digit(s.charAt(i+1), 16));
}
return data;
}
public static String ByteArrayToHexString(byte[] bytes) { final char[] hexArray =
{'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
char[] hexChars = new char[bytes.length * 2];
int v;
for ( int j = 0; j < bytes.length; j++ ) { v = bytes[j] & 0xFF;
hexChars[j * 2] = hexArray[v >>> 4];
hexChars[j * 2 + 1] = hexArray[v & 0x0F];
}
return new String(hexChars);
}
public static byte[] BuildSelectApdu(String aid) {
// Format: [CLASS | INSTRUCTION | PARAMETER 1 | PARAMETER 2 | LENGTH | DATA]
return HexStringToByteArray(SELECT_APDU_HEADER +aid);
}
public void onPause() { ////////////////////////
disableReaderMode();
/////////////////////
}
public void onResume() { //////////////////
enableReaderMode();
//////////////////
}
private void enableReaderMode() { ////////////////////////
Activity activity = getActivity();
NfcAdapter nfc = NfcAdapter.getDefaultAdapter(activity);
if (nfc != null) {
nfc.enableReaderMode(activity, this, READER_FLAGS, null);
}
//////////////////////
}
private void disableReaderMode() { ////////////////////////////
Activity activity = getActivity();
NfcAdapter nfc = NfcAdapter.getDefaultAdapter(activity);
if (nfc != null) {
nfc.disableReaderMode(activity);
}
//////////////////////////
}
public void onTagDiscovered(Tag tag) {
////////////////////////
}
Indications :
-
Il ne faut pas oublier :
implements ReaderCallbackPartie II: Implémentation d’une application HCE
Dans cette partie, vous aurez besoin de deux smartphones Android. Comme vu en cours, vous allez programmer une application Android HCE qui émule une carte NFC.
Application Lecteur :
- Vous pouvez utiliser la même application de la partie précédente avec ces indications :
public void onTagDiscovered(Tag tag) { ///////////////////////
IsoDep isoDep = IsoDep.get(tag);
if (isoDep != null) { try {
// Connect to the remote NFC device isoDep.connect();
byte[] command = BuildSelectApdu(………) byte[] result = isoDep.transceive(command);
///////////////////////////////////
///////////////////////////////////
///////////////////////////////////
}
Application HCE
- Préparer un AID de votre choix pour l’application HCE.
- Créer le fichier apduservice.xml dans le dossier res :
<host-apdu-service
xmlns:android="http://schemas.android.com/apk/res/android"
android:requireDeviceUnlock="false">
<aid-group
android:category="other">
<aid-filter android:name="AID de votre choix"/>
</aid-group>
</host-apdu-service>
- Activer le NFC dans le manifest :
<uses-permission android:name="android.permission.NFC" />
<uses-feature android:name="android.hardware.nfc"
android:required="true" />
- Déclarer votre service HCE dans le manifest
<service
android:name=".HceService"
android:exported="true"
android:permission="android.permission.BIND_NFC_SERVICE" >
<intent-filter>
<action android:name="……….HOST_APDU_SERVICE" />
</intent-filter>
<meta-data
android:name="…………host_apdu_service"
android:resource="@xml/apduservice" />
</service>
- Créer un nouveau projet Android : Empty - Créer une interface graphique de votre choix.
- Créer la classe
HceServicequi
extendsde
HostApduService. Utiliser les variables et les fonctions suivantes :
private static final byte[] SELECT_AID = {0x00, (byte) 0xA4, 0x04,0x00,0x07,……….}; // pour comparer avec le Select reçu private static final byte[] ResponseOK= {0x01, 0x02, 0x03, 0x04, 0x90, 0x00}; // pour répondre au lecteur avec succès à la section
private static final byte[] ResponseError = {0x6F, 0x00}; // répondre avec erreur à la selection
public byte[] processCommandApdu(byte[] apdu, Bundle extras) { ///////////////////////
if (Arrays.equals(SELECT_AID, apdu)) {
return ResponseOK;
}
else return ResponseError;
////////////////////////////////////////
}