Arborescence des pages

Vous regardez une version antérieure (v. /wiki/pages/viewpage.action?pageId=614990172) de cette page.

afficher les différences afficher l'historique de la page

« Afficher la version précédente Vous regardez la version actuelle de cette page. (v. 11) afficher la version suivante »

esup-nfc-tag est capable de lancer les commandes Desfire EV1, ces commandes (APDU) sont calculées par esup-nfc-tag-server et transmises une à une jusqu'au lecteur NFC grâce aux différents clients qui ne font que transmettre les commandes et retourner les réponses à ces commandes.

Le code qui permet cela se situe dans la classe DESFireEV1Service.java d'esup-nfc-tag-server

Cette implémentation Desfire EV1 permet ainsi de lire, écrire ou mettre à jour des cartes en relation avec esup-sgc notamment : les informations à écrire/mettre à jour dans les fichiers Desfire pouvant être récupérées/interprétées par/depuis esup-sgc.

Vous verrez ci-dessous que les configurations XML à la Spring reprenent pour l'écriture et/ou  la mise à jour des cartes Desfire la structure d'une carte Desfire (master key, applications, fichiers et clefs) avec des configurations typiques de Desfire (amks pour application master key settings, nok, etc.).

On y explique au passage quelques élements de ces configurations bien sûr, et les intégrateurs ayant une bonne connaissance de Desfire s'y retrouveront sans problème. 

Cependant, Desfire EV1 reste une technologie NXP relativement fermée, même si des librairies et documentations sont librement accessibles sur internet aujourd'hui (et depuis plus de 10 ans maintenant).

Reste donc que pour avoir une vision et une compréhension exacte de la structuration Desfire EV1, un document comme le "datasheet" complet de "mifare DESFire Contactless Multi-Application IC with DES and 3DES Security MF3 IC D40" peut s'avérer utile à consulter. Ce document disponible depuis le nom de fichier M075031_desfire.pdf est un document d'Avril 2004 qui est noté comme confidentiel et qui peut normalement être consulté uniquement après signature d'un accord de non divulgation (NDA), comme le relève ce thread dans le forum de mifare.net : https://www.mifare.net/support/forum/topic/desfire-ev1-aes-2k3des-clrc663-examples/


applicationContext-desfire.xml

Dans le ficher applicationContext-desfire.xml on trouve la structure et les données qui seront écrites sur la carte lors de l’encodage.

En premier lieu on déclare un bean de type DesfireWriteConfig qui ajoutera une application externe (AppliExtApi) d'écriture. Cette "api" sera disponible dans l'interface graphique pour permettre de configurer une application d'encodage comme décrit ici :

https://www.esup-portail.org/wiki/display/SGC/Configurations+ESUP-SGC+et+ESUP-NFC-TAG-SERVER#ConfigurationsESUP-SGCetESUP-NFC-TAG-SERVER-ESUP-NFC-TAG-SERVER

On lui passe en argument un objet DesfireTag qui décrit le format de la carte en elle même (structure et données) :

  • p:formatBeforeWrite précise si la carte doit être formatée avant l'encodage
  • p:keyStart spécifie la PICC Master Key qui sera utilisée pour s'authentifier sur la carte avant l'encodage
  • p:keyTypeStart est le type de la clé (DES ou AES) pré-positionnée sur la carte avant l'encodage
  • p:keyFinish spécifie la PICC Master Key qui sera positionnée sur la carte après l'encodage (si pas de changement de clé, il faut saisir la même valeur de pour p:keyStart)
  • p:keyTypeFinish est le type de la clé (DES ou AES) positionnée sur la carte après encodage (si pas de changement de clé, il faut saisir la même valeur de pour p:keyTypeStart)
  • p:keyVersionFinish est le numéro de version attribué à la nouvelle clé en fin d'encodage (n'a aucune incidence sur le fonctionnement de la carte mais peut permettre de s'assurer que l'encodage est bien complet)

Voici un exemple complet :

<bean id="desfireAuthConfigComueWriteEsupSgc" class="org.esupportail.nfctag.service.api.impl.DesfireWriteConfig">
	<property name="desfireTag" ref="desfireComueTagEsupSgc" />
	<property name="description" value="Ecriture ESUP SGC"/>
</bean>


<bean id="desfireComueTagEsupSgc" class="org.esupportail.nfctag.beans.DesfireTag" p:formatBeforeWrite="false" p:keyStart="0000000000000000" p:keyTypeStart="DES" p:keyFinish="0000000000000000" p:keyTypeFinish="DES" p:keyVersionFinish="00">
 <property name="applications">
  <util:list>
   <bean class="org.esupportail.nfctag.beans.DesfireApplication" p:desfireAppId="AB0123" p:amks="0B" p:nok="84">
    <property name="files">
     <util:list>
      <bean class="org.esupportail.nfctag.beans.DesfireFile" p:fileNumber="00" p:communicationSettings="03" p:accessRights="1223" p:fileSize="1F0000" p:tagWriteApi-ref="idp2sTagWriteEsupSgc"/>
     </util:list>
    </property>
    <property name="keys">
     <util:list>
      <bean class="org.esupportail.nfctag.beans.DesfireKey" p:keyNo="00" p:keyVer="01" p:key="00000000000000000000000000000000"/>
      <bean class="org.esupportail.nfctag.beans.DesfireKey" p:keyNo="01" p:keyVer="01" p:key="00000000000000000000000000000000"/>
      <bean class="org.esupportail.nfctag.beans.DesfireKey" p:keyNo="02" p:keyVer="01" p:key="00000000000000000000000000000000"/>
      <bean class="org.esupportail.nfctag.beans.DesfireKey" p:keyNo="03" p:keyVer="01" p:key="00000000000000000000000000000000"/>
     </util:list>
    </property>
   </bean>
  </util:list>
 </property>
</bean>

Une clé de type p:keyStart="0000000000000000" p:keyTypeStart="DES"  est une clé PICC par défaut pour une carte Desfire. Avec cette clé la carte reste formatable facilement à l'aide d'un smartphone par exemple.

Si l'on détail, l'objet DesfireTag peut contenir une liste de DesfireApplication.

Voici la structure d’une application DesfireApplication:

<bean class="org.esupportail.nfctag.beans.DesfireApplication" p:desfireAppId="AB0123" p:amks="0B" p:nok="84">
 <property name="files">
  <util:list>
   <bean class="org.esupportail.nfctag.beans.DesfireFile" p:fileNumber="00" p:communicationSettings="03" p:accessRights="1223" p:fileSize="1F0000" p:tagWriteApi-ref="idp2sTagWriteEsupSgc"/>
  </util:list>
 </property>
 <property name="keys">
  <util:list>
   <bean class="org.esupportail.nfctag.beans.DesfireKey" p:keyNo="00" p:keyVer="01" p:key="00000000000000000000000000000000"/>
   <bean class="org.esupportail.nfctag.beans.DesfireKey" p:keyNo="01" p:keyVer="01" p:key="00000000000000000000000000000000"/>
   <bean class="org.esupportail.nfctag.beans.DesfireKey" p:keyNo="02" p:keyVer="01" p:key="00000000000000000000000000000000"/>
   <bean class="org.esupportail.nfctag.beans.DesfireKey" p:keyNo="03" p:keyVer="01" p:key="00000000000000000000000000000000"/>
  </util:list>
 </property>
</bean>

 

Dans cet exemple, l'application a pour identifiant p:desfireAppId="AB0123", elle est configurée avec p:nok  à 84 qui indique 4 clés AES  

p:amks="0B" correspond à "application master key settings", la gestion des droits sur l'application (0B indique que la configuration de l'application est modifiable à condition de s'authentifier avec la clé 0 de l'application, qu'on appelle aussi clef master/maitre de l'application Desfire)

L'application  peut contenir des fichiers de type DesfireFile et des clés DesfireKey

Dans notre cas l'application possède un fichier numéro "00" (p:fileNumber="00")

Le ficher est paramétré avec les autorisations suivantes p:accessRights="1223" :

  • clé 1 pour la lecture

  • clé 2 pour l’écriture

  • clé 2 pour lecture et écriture

  • clé 3 pour le changement d’autorisations

La clé 0 est la Master Key de l'application, dans l’exemple toutes les clés sont à zéro et insérées en tant que version "01" (p:keyVer="01")

Il n'est plus nécessaire de préciser le type de clé au niveau des beans DesfireKey, celui-ci est déterminé par la valeur de l'attribut p:nok de la DesfireApplication :

  • le premier chiffre représente de type (0 : DES, 8 : AES)
  • le deuxième est le nombre de clés

L'attribut p:type doit etre supprimé au niveau des clés

La valeur à écrire dans le fichier est définie par p:tagWriteApi-ref

Il faut configurer l’url qui permet de récupérer cette valeur (ici c'est esup-sgc qui fournit la donnée) :

<bean id="idp2sTagWriteEsupSgc" class="org.esupportail.nfctag.service.api.impl.TagWriteRestWs">
 <property name="idFromEppnInitUrl" value="https://esup-sgc-test.univ-rouen.fr/wsrest/nfc/idFromEppnInit"/>
</bean>

applicationContext-custom.xml

Ajout d'une configuration NFC pour une authentification en DESFIRE (NfcAuthConfig)

 

<bean id="desfireAuthSiServices" class="org.esupportail.nfctag.service.api.impl.DesfireReadConfig">
	<property name="desfireKeyNumber" value="01"/>
	<property name="desfireFileNumber" value="00"/>
	<property name="desfireAppId" value="AB0123"/>
	<property name="desfireAppName" value="si-service"/>
	<property name="desfireFileOffset" value="000000"/>
	<property name="desfireKey" value="00000000000000000000000000000000"/> 
	<property name="description" value="Authentification SI Service COMUE"/>
</bean>

 

Avec cet exemple le client ira lire le fichier desfireFileNumber "00" de l'application desfire desfireAppId : AB0123 présente sur la carte à l'aide de la clé desfireKey : 00000000000000000000000000000000.
Le desfireFileOffset permet de préciser à partir de quel octet on démarre la lecture. 

 

L'attribut desfireFileSize n'est plus nécessaire, il doit etre supprimé.

Esup-nfc-tag-server enverra le contenu du fichier desfire ainsi que le desfireAppName : si-service (dans notre cas) à l'application TagIdCheck paramétrée dans esup-nfc-tag-server. Je web-service tagIdCheck associé à cette application doit contôler si une carte correspond effectivement à l'identifiant contenu dans le fichier defire et doit renvoyer un tagLog (voir Implémentation du Web Service TagIdCheck)

Ajout d'une application d' affichage du verso de la carte (AppliExtApi)

 

    <bean id="esupSgcVersoExtApi" class="org.esupportail.nfctag.service.api.impl.AppliExtRestWs">
    	<property name="isTagableUrl" value="https://esup-sgc-test.univ-ville.fr/wsrest/nfc/isTagable"/>
    	<property name="validateTagUrl" value="https://esup-sgc-test.univ-ville.fr/wsrest/nfc/validateTag"/>
    	<property name="getLocationsUrl" value="https://esup-sgc-test.univ-ville.fr/wsrest/nfc/locationsVerso"/>
    	<property name="displayUrl" value="https://esup-sgc-test.univ-ville.fr/wsrest/nfc/verso"/>
    	<property name="description" value="Web Service Verso"/>
    </bean>

La nouvelle propriété displayUrl permet de définir l'emplacement des données qui seront affichées suite à la validation d'un tag. Esup-sgc peut retourner le verso en fonction du csn via cette adresse https://esup-sgc-test.univ-ville.fr/wsrest/nfc/verso.

 

  • Aucune étiquette