
La carte que l'on trouve un peu partout est la Mifare Classic 1k, elle fonctionne sur la fréquence 13,56 MHz (HF : High Frequency).
Nom | Surnom | EEPROM |
---|---|---|
Mifare Classic 1k | MF1 S50 | 1Koctet |
Mifare Classic 4k | MF1 S70 | 4Koctet |
Mifare Plus X | MF1 PLUS S60 | 2Koctet |
MF1 PLUS S80 | 4Koctet | |
Mifare Plus S | MF1 SPLUS S60 | 2Koctet |
MF1 SPLUS S80 | 4Koctet |
Stockage des données (mémoire)
Pour une carte de 1ko de stockage EEPROM, réparti dans 16 secteurs de 4 blocs de 16 octets : 16*4*16 = 1024 octets (donc 1ko).Chaque secteur contient 4 blocs de 16 octets, le dernier bloc s'appelle le sector trailer.
Ces secteurs de 4 blocs individuels (contenant 64 octets par secteur) dispose de fonctionnalités sécuritaires de base. Ces fonctionnalités sont:
- Configuration de droit d'accès lecture/ecriture configurable pour chaque secteur.
- Deux clés d'authentification différentes pour chaque secteur (6 octets par clé, ces clés peuvent être différentes pour chaque secteur)
Ce qui signifie que l'espace mémoire disponible pour une carte 1k n'est que de:
$15_{secteurs}\times 3_{blocs}\times 16_{octets}+2_{blocs}\times 16_{octets}=752_{octets}$
Les MIFARE Classic ne sont pas lisibles par tous les smartphones
Secteur | Bloc | Octets | Description | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | |||
0 | 0 | Données Fabricant | Bloc Fabricant ("Manufacturer block") | |||||||||||||||
1 | Données | Données | ||||||||||||||||
2 | Données | Données | ||||||||||||||||
3 | CLE A | Bits d'accès | CLE B | Fin de secteur ("Sector Trailer") | ||||||||||||||
1 | 4 | Données | Données | |||||||||||||||
5 | Données | Données | ||||||||||||||||
6 | Données | Données | ||||||||||||||||
7 | CLE A | Bits d'accès | CLE B | Fin de secteur ("Sector Trailer") |
Les secteurs sont numérotés de 0 à 15.
Le premier bloc du secteur 0 est spécial car il contient l'identifiant du tag (manufacturer block).
On l'appelle vulgairement le "block 0" car c'est là qu'est écrit le numéro de série du tag UID (Unique ID), normalement inscrit en usine et pouvant être écrit (normalement) une seule fois.
Dans notre cas l'UID est sur 4 octets.
Exemple
Secteur | ||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
dec | 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | ||
000110 | 00 | 24 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 |
000110 | 01 | 25 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 |
000110 | 10 | 26 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 |
000110 | 11 | 27 | 48 | 45 | 58 | 41 | 43 | 54 | 78 | 77 | 88 | 00 | AA | 07 | 20 | 01 | 87 | 38 |
Accéder à la mémoire de l'EEPROM
Vous devez effectuer les opérations suivantes pour accéder à l'EEPROM de la carte:- Vous devez retrouver les 4-octetse NUID de la carte (ce NUID peut également avoir 7-octets de long, cela reste cependant rare pour une carte Mifare Classic). Cette opération est nécessaire pour le processus d'accès qui va suivre.
- Vous devez vous authentifier sur le secteur auquel vous voulez accéder en accord avec les règles d'accès (définis sur le bloc de fin de secteur/Trailer Bloc), en fournissant la clé d'authentification appropriée (clé de 6 octets) qui est à 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF pour une nouvelle carte.
- Une fois l'authentification réussie, et en fonction des persmissions sur le secteur, vous pouvez lire/écrire/incrémenter/décrémenter le contenu d'un bloc spécifique. Notez que vous devez vous authentifier sur chaque secteur auquel vous voulez avoir accès étant donné que chaque secteur dispose ses propres droits et ses propres clés d'accès!
Access bits | Access condition for | Application | |||||
---|---|---|---|---|---|---|---|
C10 | C20 | C30 | read | write | increment | decrement, transfer, restore | |
0 | 0 | 0 | key A|B1 | key A|B1 | key A|B1 | key A|B1 | transport configuration |
0 | 1 | 0 | key A|B1 | never | never | never | read/write block |
1 | 0 | 0 | key A|B1 | key B1 | never | never | read/write block |
1 | 1 | 0 | key A|B1 | key B1 | key B1 | key A|B1 | value block |
0 | 0 | 1 | key A|B1 | never | never | key A|B1 | value block |
0 | 1 | 1 | key B1 | key B1 | never | never | read/write block |
1 | 0 | 1 | key B1 | never | never | never | read/write block |
1 | 1 | 1 | never | never | never | never | read/write block |
1 si la clé B peut être lue dans la fin de secteur correspondante, elle ne peut pas servir à l'authentification (toutes les lignes grisées du dernier tableau).
En conséquence, si le lecteur authentifie un bloc d’un secteur qui utilise les conditions d’accès grisées et utilise la clé B, la carte refusera tout accès ultérieur à la mémoire après l’authentification.
Access bits | Access condition for | Remark | |||||||
---|---|---|---|---|---|---|---|---|---|
KEYA | Access bits | KEYB | |||||||
C13 | C23 | C33 | read | write | read | write | read | write | |
0 | 0 | 0 | never | key A | key A | never | key A | key A | Key B may be read[1] |
0 | 1 | 0 | never | never | key A | never | key A | never | Key B may be read[1] |
1 | 0 | 0 | never | key B | key A|B | never | never | key B | |
1 | 1 | 0 | never | never | key A|B | never | never | never | |
0 | 0 | 1 | never | key A | key A | key A | key A | key A | Key B may be read, transport configuration[1] |
0 | 1 | 1 | never | key B | key A|B | key B | never | key B | |
1 | 0 | 1 | never | never | key A|B | key B | never | never | |
1 | 1 | 1 | never | never | key A|B | never | never | never |
NTAG
Type: | NTAG 203 | NTAG 210 | NTAG 212 | NTAG 213 | NTAG 215 | NTAG 216 |
---|---|---|---|---|---|---|
Mémoire totale (octets) | 168 | 80 | 144 | 180 | 540 | 924 |
organized | 45 pages of 4 byte/page | 135 pages of 4 byte/page | 231 pages of 4 byte/page | |||
reserved for manufacturer and configuration data (octets) | 26 | 26 | 26 | |||
used for the read-only locking mechanism (octets) | 34 | 28 | 37 | |||
available as capability container (octets) | 4 | 4 | 4 | |||
Mémoire utilisateur (octets) | 144 | 48 | 128 | 144 | 504 | 888 |
UID | ||||||
URL Max (caractères) | 138 | 40 | 120 | 136 | 488 | 872 |
Data Trans. Rate |
Organisation de la mémoire
NTAG | Adr Page | ||||
---|---|---|---|---|---|
0 | 1 | 2 | 3 | ||
All | 0x00 | ||||
SN0 | SN1 | SN2 | BCC0 : check byte SN0,SN1,SN2 | ||
0x01 | |||||
SN3 | SN4 | SN5 | SN6 | ||
0x02 | Numéro de série BCC1 : check byte SN3,SN4,SN5,SN6 | Reservé interne | lock bytes 0 | lock bytes 1 | |
0x03 | |||||
0x04 | |||||
0x05 | |||||
… | |||||
216 | 0xE2 | RFUI | |||
0xE3 | |||||
MIRROR | RFUI | MIRROR_PAGE | AUTH0 | ||
0xE4 | |||||
ACCESS | RFUI | RFUI | RFUI | ||
0xE5 | valeur par défaut : 0xFFFFFFFF | ||||
0xE6 | PACK : Accusé de réception de mot de passe 16 bits utilisé lors du processus de vérification du mot de passe valeur par défaut : 0x0000 | RFUI |
Lock bytes
Les pages de 0x03 (CC) à 0x0F peuvent être verrouillées individuellement en réglant le bit de verrouillage correspondant Lx à 1.Le vérouillage empêche tout accès ultérieur en écriture.
lock bytes 0 | lock bytes 1 | ||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
L7 | L6 | L5 | L4 | LCC | BL15-10 | BL9-4 | BLCC | L15 | L14 | L13 | L12 | L11 | L10 | L9 | L8 |
0x07 | 0x06 | 0x05 | 0x04 | 0x03 | page 0x0A à 0x0F | page 0x04 à 0x09 | Page 0x03 (CC) |
0x0F | 0x0E | 0x0D | 0x0C | 0x0B | 0x0A | 0x09 | 0x08 |
Tout vérouillage de bit à 1 est irréversible!
Conteneur de capacité CC
0x03 | Octets | |||
---|---|---|---|---|
0 | 1 | 2 | 3 | |
0xE1 | 0x10 | Capacité/8 | 0 |
Exemple : Capactité 0x12 : 0x12*8=144 octets disponibles, normal pour un NTAG 213.
NTAG216: 0x6D pour 872 octets
Octets de verrouillage dynamique
Octet | ||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
Page | 0x80 0x8F | 0x70 0x7F | 0x60 0x6F | 0x50 0x5F | 0x40 0x4F | 0x30 0x3F | 0x20 0x2F | 0x10 0x1F |
RFUI | RFUI | 0xE0 0xE1 | 0xD0 0xDF | 0xC0 0xCF | 0xB0 0xBF | 0xA0 0xAF | 0x90 0x9F |
RFUI | 0xD0 0xE1 | 0xB0 0xCF | 0x90 0xAF | 0x70 0x8F | 0x50 0x6F | 0x30 0x4F | 0x10 0x2F |
Remarque: Définissez tous les bits marqués avec RFUI sur 0 lors de l'écriture dans les octets de verrouillage dynamique.
Octet de configuration MIRROR
Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|
MIRROR_CONF | MIRROR_BYTE | RFUI | STRG_MOD_EN | RDUI | ||||
Config | 00 pas de miroir ASCII 01 UID miroir ASCII 10 Miroir ASCII de compteur NFC 11 Miroir ASCII des compteurs UID et NFC |
Position de l'octet dans la page définie par MIRROR_PAGE | 0 | 0 mode de modulation forte désactivée 1 mode de modulation forte activée | 0 |
Définit quel miroir ASCII doit être utilisé, si le miroir ASCII est activé par un octet MIRROR_PAGE valide.
MIRROR_Page définit la page pour le début de la mise en miroir ASCII
Une valeur> 03h active la fonction de miroir ASCII
AUTH0 définit l'adresse de la page à partir de laquelle la vérification du mot de passe est requise.
La plage d'adresses valide pour l'octet AUTH0 va de 00h à FFh.
Si AUTH0 est défini sur une adresse de page supérieure à la dernière page de l'dernière page de la configuration de l'utilisateur, la protection par mot de passe est désactivée.
Octet de configuration ACCESS
Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|
PROT | CFGLCK | RFUI | NFC_CNT_EN | NFC_CNT_PWD_PROT | AUTHLIM | |||
0 l'accès en écriture est protégé par la vérification du mot de passe 1 l'accès en lecture et en écriture est protégé par la vérification du mot de passe |
Écrire un bit de verrouillage pour la configuration de l'utilisateur 0 configuration utilisateur ouverte pour l'accès en écriture 1 configuration utilisateur verrouillée en permanence contre l'accès en écriture, à l'exception des PWD et PACK | 0 | Configuration du compteur NFC 0 compteur NFC désactivé 1 Compteur NFC activé Si le compteur NFC est activé, le compteur NFC sera automatiquement augmenté à la première commande READ ou FAST_READ après une réinitialisation à la mise sous tension |
Protection par mot de passe du compteur NFC 0 compteur NFC non protégé 1 protection du mot de passe du compteur NFC activée Si la protection par mot de passe du compteur NFC est activé, le tag NFC ne répond que à une commande READ_CNT avec la valeur de compteur NFC après vérification du mot de passe |
Limite des tentatives de vérification du mot de passe négatif 000 tentatives de vérification de mot de passe négative désactivée 001-111 nombre maximum de tentatives de vérification de mot de passe négatif (7 maxi) |
Mifare access bytes
~C2 | ~C1 | C1 | ~C3 | C3 | C2 | ||
~C23 | ~C22 | ~C21 | ~C20 | ~C3 | ~C12 | ~C11 | ~C10 |
---|---|---|---|---|---|---|---|
C13 | C12 | C11 | C10 | ~C33 | ~C32 | ~C31 | ~C30 |
C33 | C32 | C31 | C30 | C23 | C22 | C21 | C20 |
Access Bits | Valid Commands | BlockDescription | |
---|---|---|---|
C13 C23 C33 | read, write | 3 | sector trailer |
C12 C22 C32 | read, write, increment, decrement, transfer, restore | 2 | data block |
C11 C21 C31 | read, write, increment, decrement, transfer, restore | 1 | data block |
C10 C20 C30 | read, write, increment, decrement, transfer, restore | 0 | data block |
Format NDEF
APDU
APDU Command | |||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Header | Body | ||||||||||||
CLA | INS | P1 | P2 | Lc | DATA (7 bytes) | Le | |||||||
00 | A4 | 04 | 00 | 07 | A0 | 00 | 00 | 02 | 47 | 10 | 01 | 00 |
CLA
l'octet Classe est utilisé pour indiquer dans quelle mesure la commande est conforme à la norme ISO7816 et, le cas échéant, quel type de «messagerie sécurisée» sera utilisé. Pour que les choses restent simples, nous n'utiliserons pas cet octet dans notre exemple et nous passerons 0x00 tout le temps.INS
l'octet Instruction est utilisé pour indiquer la méthode à exécuter. Il peut s'agir de plusieurs méthodes telles que: 0xA4 pour sélectionner un fichier ou une applet,0xB0 pour lire un fichier binaire, 0xD0 pour écrire un fichier binaire … (Voir la liste complète des instructions ici)P1 et P2
ces deux octets de paramètre sont utilisés pour personnaliser davantage l'instruction, ils dépendent des commandes personnalisées spécifiées par la carte. Cliquez ici pour la liste des cas possiblesLc
est la longueur des données à envoyerDATA
correspond aux données réelles pour l'instruction.Le
est la longueur de la réponse attendueAinsi, un exemple pour sélectionner un fichier ou une applet avec un
ID = A0000002471001 sera le suivant: 00 A4 0400 07 A0000002471001 00
Une fois que la carte a reçu la commande, elle répondra par une réponse APDU comme suit:
APDU Response | ||
---|---|---|
Body | Tailer | |
Data Field | SW1 | SW2 |
Data Field
Champ de données: est le corps de la réponseSW1 et SW2
sont les octets d'état, ils sont séparés car parfois, le premier octet peut nous indiquer l'état actuel, et le deuxième octet peut spécifier davantage d'informations sur cet état. Par exemple, si nous utilisons une commande pour "Vérifier un code confidentiel" avec un code confidentiel incorrect, la carte renverra un statut de 0x63 0xCX où X est le nombre de tentatives restantes.Ainsi, l'application du lecteur peut facilement vérifier le premier octet pour le statut et deuxième pour le nombre de tentatives restantes. Lorsque la commande a été exécutée avec succès, nous obtenons généralement le statut 0x90 0x00 (voir la liste complète des réponses possibles ici).
Le code d'identification de l'URI (URI Identifier Code) est utilisé pour raccourcir la longueur de l'URI et peut avoir l'une des valeurs suivantes:
Valeur Protocole ----- -------- 0x00 Pas d'utilisation de préfix... l'URI est entièrement inclus dans le champ URI 0x01 http://www. 0x02 https://www. 0x03 http:// 0x04 https:// 0x05 tel: 0x06 mailto: 0x07 ftp://anonymous:anonymous@ 0x08 ftp://ftp. 0x09 ftps:// 0x0A sftp:// 0x0B smb:// 0x0C nfs:// 0x0D ftp:// 0x0E dav:// 0x0F news: 0x10 telnet:// 0x11 imap: 0x12 rtsp:// 0x13 urn: 0x14 pop: 0x15 sip: 0x16 sips: 0x17 tftp: 0x18 btspp:// 0x19 btl2cap:// 0x1A btgoep:// 0x1B tcpobex:// 0x1C irdaobex:// 0x1D file:// 0x1E urn:epc:id: 0x1F urn:epc:tag: 0x20 urn:epc:pat: 0x21 urn:epc:raw: 0x22 urn:epc: 0x23 urn:nfc: 0x24-0xFF RFU