Merge remote-tracking branch 'upstream/master' into feat/hf-gallagher-remove-aid-limits

This commit is contained in:
Matt Moran 2022-01-17 23:28:06 +13:00
commit a1c3465525
21 changed files with 202 additions and 53 deletions

View file

@ -3,6 +3,7 @@ All notable changes to this project will be documented in this file.
This project uses the changelog in accordance with [keepchangelog](http://keepachangelog.com/). Please use this to write notable changes, which is not the same as git commit log... This project uses the changelog in accordance with [keepchangelog](http://keepachangelog.com/). Please use this to write notable changes, which is not the same as git commit log...
## [unreleased][unreleased] ## [unreleased][unreleased]
- Add `nfc decode` - now NDEF vCard messages with a PHOTO in base64 format is shown (@iceman1001)
- Remove AID limitations when using Gallagher key diversification (@DarkMatterMatt) - Remove AID limitations when using Gallagher key diversification (@DarkMatterMatt)
## [Frostbit.4.14831] [2022-01-11] ## [Frostbit.4.14831] [2022-01-11]

View file

@ -90,6 +90,8 @@ We define generic Proxmark3 platforms as following devices.
**Unknown support status** **Unknown support status**
- ⚠ VX - ⚠ VX
- **Note**: unknown device hw - **Note**: unknown device hw
- ⚠ Proxmark3 X
- **Note**: unknown device hw.
**256kb flash memory size of generic Proxmark3 platforms** **256kb flash memory size of generic Proxmark3 platforms**

View file

@ -24,6 +24,7 @@ a0a1a2a3a4a5a6a7a0a1a2a3a4a5a6a7
b0b1b2b3b4b5b6b7b0b1b2b3b4b5b6b7 b0b1b2b3b4b5b6b7b0b1b2b3b4b5b6b7
b0b1b2b3b4b5b6b7b8b9babbbcbdbebf b0b1b2b3b4b5b6b7b8b9babbbcbdbebf
d3f7d3f7d3f7d3f7d3f7d3f7d3f7d3f7 d3f7d3f7d3f7d3f7d3f7d3f7d3f7d3f7
C238E449F725B1510EAA699550CABA16 # J2A040
11111111111111111111111111111111 11111111111111111111111111111111
22222222222222222222222222222222 22222222222222222222222222222222
33333333333333333333333333333333 33333333333333333333333333333333

View file

@ -1,4 +1,5 @@
47454D5850524553534F53414D504C45 # Gemalto 47454D5850524553534F53414D504C45 # Gemalto
C238E449F725B1510EAA699550CABA16 # J2A040
ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff
00000000000000000000000000000000 00000000000000000000000000000000
a0a1a2a3a4a5a6a7a0a1a2a3a4a5a6a7 a0a1a2a3a4a5a6a7a0a1a2a3a4a5a6a7

View file

@ -23,4 +23,4 @@ def main(argv):
file_out.write(data) file_out.write(data)
if __name__ == '__main__': if __name__ == '__main__':
main(sys.argv) sys.exit(main(sys.argv))

View file

@ -25,4 +25,4 @@ def main(argv):
file_out.write("\n") file_out.write("\n")
if __name__ == '__main__': if __name__ == '__main__':
main(sys.argv) sys.exit(main(sys.argv))

View file

@ -38,7 +38,7 @@ def main():
Should produce the output: Should produce the output:
\tTarget (BA) requires final LRC XOR byte value: 5A\n""".format(sys.argv[0])) \tTarget (BA) requires final LRC XOR byte value: 5A\n""".format(sys.argv[0]))
return 0 return 1
target= int(sys.argv[len(sys.argv) - 1],16) target= int(sys.argv[len(sys.argv) - 1],16)
@ -48,4 +48,4 @@ def main():
print('\nTarget (%02X) requires final LRC XOR byte value: %02X\n' % (target,lrc)) print('\nTarget (%02X) requires final LRC XOR byte value: %02X\n' % (target,lrc))
if __name__ == "__main__": if __name__ == "__main__":
main() sys.exit(main())

View file

@ -605,7 +605,7 @@ const static atr_t AtrTable[] = {
{ "3B6900002494010000000001A9", "Kazakhstan Helios gas station debit card\nhttp://helios.kz/" }, { "3B6900002494010000000001A9", "Kazakhstan Helios gas station debit card\nhttp://helios.kz/" },
{ "3B6900002494010201000101A9", "Chipcard from SUN to be used in SunRay's\n370-4328-01 (31091)" }, { "3B6900002494010201000101A9", "Chipcard from SUN to be used in SunRay's\n370-4328-01 (31091)" },
{ "3B6900002494010301000100A9", "Schlumberger MicroPayflex S card" }, { "3B6900002494010301000100A9", "Schlumberger MicroPayflex S card" },
{ "3B6900004944353056312E....", "eID Card to user autheticate and save paswords in the Card. Product ID50 Password manager from IDENTOS GmbH (eID)\nhttps://identos.com/id50-password-manager/" }, { "3B6900004944353056312E....", "eID Card to user authenticate and save paswords in the Card. Product ID50 Password manager from IDENTOS GmbH (eID)\nhttps://identos.com/id50-password-manager/" },
{ "3B6900004944363056312E....", "token appidkey ID60-USB (Other)\nhttps://identsmart.com/en/products/id60-datasafe/" }, { "3B6900004944363056312E....", "token appidkey ID60-USB (Other)\nhttps://identsmart.com/en/products/id60-datasafe/" },
{ "3B6900004A434F503331563232", "Visa Europe Sample Card / Axalto" }, { "3B6900004A434F503331563232", "Visa Europe Sample Card / Axalto" },
{ "3B6900005001010401000101A9", "Sample card given to all attendees of the CTST 2004 SmartCard Conference" }, { "3B6900005001010401000101A9", "Sample card given to all attendees of the CTST 2004 SmartCard Conference" },
@ -991,7 +991,7 @@ const static atr_t AtrTable[] = {
{ "3B6F00008031E06B04310502AF555555555555", "debit card (Bank)\nhttps://www.usaa.com/inet/wc/banking" }, { "3B6F00008031E06B04310502AF555555555555", "debit card (Bank)\nhttps://www.usaa.com/inet/wc/banking" },
{ "3B6F00008031E06B04310502D1555555555555", "Pockit Pre-Paid Mastercard (Contact Chip). (Bank)\nhttps://revolut.com/" }, { "3B6F00008031E06B04310502D1555555555555", "Pockit Pre-Paid Mastercard (Contact Chip). (Bank)\nhttps://revolut.com/" },
{ "3B6F00008031E06B04310502D6555555555555", "Bank IN - Slovenian bank (Bank)\nhttps://www.bankain.si/BIN/vstopna.seam" }, { "3B6F00008031E06B04310502D6555555555555", "Bank IN - Slovenian bank (Bank)\nhttps://www.bankain.si/BIN/vstopna.seam" },
{ "3B6F00008031E06B04520502BB555555555555", "AlfaBROU - Mastercard (prepaid card emited by Banco Republica - Uruguay) (Bank)\nhttps://www.brou.com.uy/personas/tarjetas/prepaga-alfabrou" }, { "3B6F00008031E06B04520502BB555555555555", "AlfaBROU - Mastercard (prepaid card emitted by Banco Republica - Uruguay) (Bank)\nhttps://www.brou.com.uy/personas/tarjetas/prepaga-alfabrou" },
{ "3B6F00008031E06B04520502FD555555555555", "C6 Bank Mastercard Global Account (Bank)\nhttps://www.c6bank.com.br/conta-global\nC6 Bank Mastercard Brazil Account (Bank)\nhttps://www.c6bank.com.br/nossos-produtos" }, { "3B6F00008031E06B04520502FD555555555555", "C6 Bank Mastercard Global Account (Bank)\nhttps://www.c6bank.com.br/conta-global\nC6 Bank Mastercard Brazil Account (Bank)\nhttps://www.c6bank.com.br/nossos-produtos" },
{ "3B6F00008031E06B04520502FE555555555555", "CITIBanamex 'Perfiles' debit card (Bank)\nhttps://www.banamex.com/es/personas/cuentas/cuenta-perfiles.html" }, { "3B6F00008031E06B04520502FE555555555555", "CITIBanamex 'Perfiles' debit card (Bank)\nhttps://www.banamex.com/es/personas/cuentas/cuenta-perfiles.html" },
{ "3B6F00008031E06B0505050280555555555555", "Banamex cuenta perfiles (Bank)\nhttp://banamex.com" }, { "3B6F00008031E06B0505050280555555555555", "Banamex cuenta perfiles (Bank)\nhttp://banamex.com" },
@ -1099,7 +1099,7 @@ const static atr_t AtrTable[] = {
{ "3B6F0000805A28114210122B27558E85829000", "Stif Navigo Pass (French Syndicate of Transport in Ile de France) (Transport)" }, { "3B6F0000805A28114210122B27558E85829000", "Stif Navigo Pass (French Syndicate of Transport in Ile de France) (Transport)" },
{ "3B6F0000805A28114210122B275DCF41829000", "Pass navigo (Transport)" }, { "3B6F0000805A28114210122B275DCF41829000", "Pass navigo (Transport)" },
{ "3B6F0000805A28114210122B276132D6829000", "Navigo (Transport)" }, { "3B6F0000805A28114210122B276132D6829000", "Navigo (Transport)" },
{ "3B6F0000805A28114210122B2764E735829000", "Navigo pass, Paris (France) trasport network (https://en.wikipedia.org/wiki/Navigo_pass) (Transport)" }, { "3B6F0000805A28114210122B2764E735829000", "Navigo pass, Paris (France) transport network (https://en.wikipedia.org/wiki/Navigo_pass) (Transport)" },
{ "3B6F0000805A28114210122B276562F7829000", "French NAVIGO Card (simple Navigo model, not annual or Imagin'R) (Transport)" }, { "3B6F0000805A28114210122B276562F7829000", "French NAVIGO Card (simple Navigo model, not annual or Imagin'R) (Transport)" },
{ "3B6F0000805A28114210122B276780D9829000", "Navigo (Transport)\nhttps://www.navigo.fr/" }, { "3B6F0000805A28114210122B276780D9829000", "Navigo (Transport)\nhttps://www.navigo.fr/" },
{ "3B6F0000805A28114210122B276D6BB5829000", "Navigo (Transport)" }, { "3B6F0000805A28114210122B276D6BB5829000", "Navigo (Transport)" },
@ -2060,7 +2060,7 @@ const static atr_t AtrTable[] = {
{ "3B8F8001804F0CA00000030601....00000000..", "RFID - ISO 14443 Type A Part 1 (as per PCSC std part3)" }, { "3B8F8001804F0CA00000030601....00000000..", "RFID - ISO 14443 Type A Part 1 (as per PCSC std part3)" },
{ "3B8F8001804F0CA00000030602....00000000..", "RFID - ISO 14443 Type A Part 2 (as per PCSC std part3)" }, { "3B8F8001804F0CA00000030602....00000000..", "RFID - ISO 14443 Type A Part 2 (as per PCSC std part3)" },
{ "3B8F8001804F0CA00000030603....00000000..", "RFID - ISO 14443 Type A Part 3 (as per PCSC std part3)" }, { "3B8F8001804F0CA00000030603....00000000..", "RFID - ISO 14443 Type A Part 3 (as per PCSC std part3)" },
{ "3B8F8001804F0CA000000306030000000000006B", "buss/train pass for use with Skanetrafiken (www.skanetrafiken.se) busses and trains.\npublic libary of Dusseldorf\nhttp://www.duesseldorf.de/stadtbuechereien/\nspecialized Mifare Ultralight card" }, { "3B8F8001804F0CA000000306030000000000006B", "buss/train pass for use with Skanetrafiken (www.skanetrafiken.se) busses and trains.\npublic library of Dusseldorf\nhttp://www.duesseldorf.de/stadtbuechereien/\nspecialized Mifare Ultralight card" },
{ "3B8F8001804F0CA000000306030001000000006A", "NXP/Philips MIFARE Classic 1K (as per PCSC std part3)\nhttp://www.nxp.com/#/pip/pip=[pfp=41863]|pp=[t=pfp,i=41863]\nOyster card - Transport for London (first-gen)\nhttps://en.wikipedia.org/wiki/Oyster_card\nACOS5/1k Mirfare\nvivotech ViVOcard Contactless Test Card\nBangkok BTS Sky SmartPass\nMifare Classic 1K (block 0 re-writeable)\nElectic vehicle charging card of the German Telekom, acting as EMSP GetCharge\nElectic vehicle charging card of the EMSP Stadtwerke Muenchen (SWM), ladenetz.de, Germany\nElectic vehicle charging card of the EMSP EinfachStromLaden of Maingau-Energie, Germany\nScouter carsharing customer card in Germany\nhttps://scouter.de/" }, { "3B8F8001804F0CA000000306030001000000006A", "NXP/Philips MIFARE Classic 1K (as per PCSC std part3)\nhttp://www.nxp.com/#/pip/pip=[pfp=41863]|pp=[t=pfp,i=41863]\nOyster card - Transport for London (first-gen)\nhttps://en.wikipedia.org/wiki/Oyster_card\nACOS5/1k Mirfare\nvivotech ViVOcard Contactless Test Card\nBangkok BTS Sky SmartPass\nMifare Classic 1K (block 0 re-writeable)\nElectic vehicle charging card of the German Telekom, acting as EMSP GetCharge\nElectic vehicle charging card of the EMSP Stadtwerke Muenchen (SWM), ladenetz.de, Germany\nElectic vehicle charging card of the EMSP EinfachStromLaden of Maingau-Energie, Germany\nScouter carsharing customer card in Germany\nhttps://scouter.de/" },
{ "3B8F8001804F0CA0000003060300020000000069", "RFID - ISO 14443 Type A - NXP Mifare card with 4k EEPROM" }, { "3B8F8001804F0CA0000003060300020000000069", "RFID - ISO 14443 Type A - NXP Mifare card with 4k EEPROM" },
{ "3B8F8001804F0CA0000003060300030000000068", "RFID - ISO 14443 Type A - NXP Mifare Ultralight or UltralightC" }, { "3B8F8001804F0CA0000003060300030000000068", "RFID - ISO 14443 Type A - NXP Mifare Ultralight or UltralightC" },
@ -3017,7 +3017,7 @@ const static atr_t AtrTable[] = {
{ "3BDF18008131FE7D006B150C0180011101434E53103180E9", "Provider: Actalis S.p.A.\ncode: AT00006181\nhttp://www.actalis.it" }, { "3BDF18008131FE7D006B150C0180011101434E53103180E9", "Provider: Actalis S.p.A.\ncode: AT00006181\nhttp://www.actalis.it" },
{ "3BDF18008131FE7D006B150C0181011101434E53103180E8", "Italian healthcare card (TS) National Service Card (CNS)\nCarta Regionale dei Servizi - Regione Lombardia\nTuscany TS-CNS\nhttp://www.regione.toscana.it/cartasanitaria" }, { "3BDF18008131FE7D006B150C0181011101434E53103180E8", "Italian healthcare card (TS) National Service Card (CNS)\nCarta Regionale dei Servizi - Regione Lombardia\nTuscany TS-CNS\nhttp://www.regione.toscana.it/cartasanitaria" },
{ "3BDF18FF8131FE4580590180484944433730307300011B33", "Crescendo C700 + MiFare 4K\nhttp://www.smartcardfocus.com/shop/ilp/id~265/p/index.shtml" }, { "3BDF18FF8131FE4580590180484944433730307300011B33", "Crescendo C700 + MiFare 4K\nhttp://www.smartcardfocus.com/shop/ilp/id~265/p/index.shtml" },
{ "3BDF18FF8191FE1FC3003138644790ECC273140150829000BA", "Card store authentification and signature keys (JavaCard)\nhttps://ants.gouv.fr/Les-titres/Cartes-Agents/Adhesion/Telechargement-et-support" }, { "3BDF18FF8191FE1FC3003138644790ECC273140150829000BA", "Card store authentication and signature keys (JavaCard)\nhttps://ants.gouv.fr/Les-titres/Cartes-Agents/Adhesion/Telechargement-et-support" },
{ "3BDF18FF8191FE1FC30031B8640000EC0073940000829000FE", "NXP Jcop3 P60 ChipDoc v7b4 (JavaCard)\nhttps://www.javacardos.com/store/products/10029" }, { "3BDF18FF8191FE1FC30031B8640000EC0073940000829000FE", "NXP Jcop3 P60 ChipDoc v7b4 (JavaCard)\nhttps://www.javacardos.com/store/products/10029" },
{ "3BDF18FF8191FE1FC30031B86404216010739401C005900001", "Dutch Governement Identity Card using physical (eID)\nhttps://nl.wikipedia.org/wiki/Rijkspas" }, { "3BDF18FF8191FE1FC30031B86404216010739401C005900001", "Dutch Governement Identity Card using physical (eID)\nhttps://nl.wikipedia.org/wiki/Rijkspas" },
{ "3BDF18FF8191FE1FC30031B8640C01ECC173940180829000B3", "ebee card\nhttps://www.ebeeoffice.ca/ebee-home/public\nDigital Signature Costa Rica (issued since 09/2019) (eID)\nhttps://www.mifirmadigital.go.cr/" }, { "3BDF18FF8191FE1FC30031B8640C01ECC173940180829000B3", "ebee card\nhttps://www.ebeeoffice.ca/ebee-home/public\nDigital Signature Costa Rica (issued since 09/2019) (eID)\nhttps://www.mifirmadigital.go.cr/" },
@ -3131,7 +3131,7 @@ const static atr_t AtrTable[] = {
{ "3BEE00008131804280318066B0840C016E01830090008E", "MultiApp Cards (Easy 72K Type B and Combi 72K Type B)\nE.SUN Commercial bank debit master card (Bank)\nTaiwan EasyCard (Transport)\nhttps://www.easycard.com.tw/english/index.asp" }, { "3BEE00008131804280318066B0840C016E01830090008E", "MultiApp Cards (Easy 72K Type B and Combi 72K Type B)\nE.SUN Commercial bank debit master card (Bank)\nTaiwan EasyCard (Transport)\nhttps://www.easycard.com.tw/english/index.asp" },
{ "3BEE00008131804380318066B1A1110100F683009000", "Optelio/Desineo Cards (D72 FXR1)" }, { "3BEE00008131804380318066B1A1110100F683009000", "Optelio/Desineo Cards (D72 FXR1)" },
{ "3BEE00008131804380318066B1A11101A0F683009000", "Optelio D72 FXR1 (MD) T=1" }, { "3BEE00008131804380318066B1A11101A0F683009000", "Optelio D72 FXR1 (MD) T=1" },
{ "3BEE00008131FE45003180718665016702A00A8390001B", "IBM JCOP 'Java Card 2.1.1' et 'Open Plaform 2.0.1'" }, { "3BEE00008131FE45003180718665016702A00A8390001B", "IBM JCOP 'Java Card 2.1.1' et 'Open Platform 2.0.1'" },
{ "3BEE00008131FE4580318066409093060F1783019000FD", "Health insurance (HealthCare)" }, { "3BEE00008131FE4580318066409093060F1783019000FD", "Health insurance (HealthCare)" },
{ "3BEE00008131FE4580318066409093060F17830F9000F3", "IC card for the National Health Insurance, Taiwan" }, { "3BEE00008131FE4580318066409093060F17830F9000F3", "IC card for the National Health Insurance, Taiwan" },
{ "3BEF..0040148025434552455357....0101039000", "Electronic Identification Card from the FNMT, the Spanish Official\nCertification Authority (Fabrica Nacional de Moneda y Timbre)\nFNMT-Ceres Siemens Infineon SLE 19" }, { "3BEF..0040148025434552455357....0101039000", "Electronic Identification Card from the FNMT, the Spanish Official\nCertification Authority (Fabrica Nacional de Moneda y Timbre)\nFNMT-Ceres Siemens Infineon SLE 19" },
@ -3518,7 +3518,7 @@ const static atr_t AtrTable[] = {
{ "3BFF1800008131FE45006B04050100012101434E5310318059", "CNS - Carta Nazionale dei Servizi (Italia)\nPA emittente: Regione Autonoma della Sardegna\nCarta del Servizio Sanitario Regionale - Emilia Romagna" }, { "3BFF1800008131FE45006B04050100012101434E5310318059", "CNS - Carta Nazionale dei Servizi (Italia)\nPA emittente: Regione Autonoma della Sardegna\nCarta del Servizio Sanitario Regionale - Emilia Romagna" },
{ "3BFF1800008131FE45006B05051017012101434E531031805E", "Regional Card - Regione Liguria, Veneto - Italy (eID)\nTessera Sanitaria - Carta Regionale dei Servizi" }, { "3BFF1800008131FE45006B05051017012101434E531031805E", "Regional Card - Regione Liguria, Veneto - Italy (eID)\nTessera Sanitaria - Carta Regionale dei Servizi" },
{ "3BFF1800008131FE45006B05052000012101434E5310318079", "health card (HealthCare)\nhttps://tscns.regione.sardegna.it/" }, { "3BFF1800008131FE45006B05052000012101434E5310318079", "health card (HealthCare)\nhttps://tscns.regione.sardegna.it/" },
{ "3BFF1800008131FE45006B11050700011101434E531131807B", "Italian National Fire Corps -special indentification card (eID)" }, { "3BFF1800008131FE45006B11050700011101434E531131807B", "Italian National Fire Corps -special identification card (eID)" },
{ "3BFF1800008131FE45006B11050700012101434E531031804A", "Oberthur ID-One Cosmo V7-n it's a java card 2.2.2\nIzenpe Certificado Ciudadano (eID)\nhttps://www.izenpe.eus/informacion/certificado-ciudadano/s15-content/es/" }, { "3BFF1800008131FE45006B11050700012101434E531031804A", "Oberthur ID-One Cosmo V7-n it's a java card 2.2.2\nIzenpe Certificado Ciudadano (eID)\nhttps://www.izenpe.eus/informacion/certificado-ciudadano/s15-content/es/" },
{ "3BFF1800008131FE4D8025A00000005657444B3430300600DD", "DataKey 400 (DK400)" }, { "3BFF1800008131FE4D8025A00000005657444B3430300600DD", "DataKey 400 (DK400)" },
{ "3BFF1800008131FE55006B02090403010101434E5310318065", "Italian Chambers of Commerce CNS (PKI)\nhttp://www.card.infocamere.it/infocard/pub/" }, { "3BFF1800008131FE55006B02090403010101434E5310318065", "Italian Chambers of Commerce CNS (PKI)\nhttp://www.card.infocamere.it/infocard/pub/" },

View file

@ -174,16 +174,16 @@ uint8_t iclass_CRC_check(bool isResponse, uint8_t *d, uint8_t n) {
int applyIso14443a(char *exp, size_t size, uint8_t *cmd, uint8_t cmdsize, bool is_response) { int applyIso14443a(char *exp, size_t size, uint8_t *cmd, uint8_t cmdsize, bool is_response) {
if (! is_response) { if (is_response == false) {
if ((gs_ntag_i2c_state == 1) && (cmdsize == 6) && (memcmp(cmd + 1, "\x00\x00\x00", 3) == 0)) { if ((gs_ntag_i2c_state == 1) && (cmdsize == 6) && (memcmp(cmd + 1, "\x00\x00\x00", 3) == 0)) {
snprintf(exp, size, "SECTOR(%d)", cmd[0]); snprintf(exp, size, "SECTOR(%d)", cmd[0]);
gs_ntag_i2c_state = 0; gs_ntag_i2c_state = 0;
return 1; return PM3_SUCCESS;
} }
if (cmdsize > 10 && (memcmp(cmd, "\x6a\x02\xC8\x01\x00\x03\x00\x02\x79", 9) == 0)) { if (cmdsize > 10 && (memcmp(cmd, "\x6a\x02\xC8\x01\x00\x03\x00\x02\x79", 9) == 0)) {
snprintf(exp, size, "ECP"); snprintf(exp, size, "ECP");
return 1; return PM3_SUCCESS;
} }
gs_ntag_i2c_state = 0; gs_ntag_i2c_state = 0;
@ -263,7 +263,7 @@ int applyIso14443a(char *exp, size_t size, uint8_t *cmd, uint8_t cmdsize, bool i
break; break;
case MIFARE_CMD_RESTORE: case MIFARE_CMD_RESTORE:
if (cmdsize == 4) if (cmdsize == 4) {
// cmd0 == 0xC2 and cmd1 == 0xFF // cmd0 == 0xC2 and cmd1 == 0xFF
// high probability its SELECT SECTOR COMMAND: // high probability its SELECT SECTOR COMMAND:
if (cmd[1] == 0xFF) { if (cmd[1] == 0xFF) {
@ -271,8 +271,11 @@ int applyIso14443a(char *exp, size_t size, uint8_t *cmd, uint8_t cmdsize, bool i
gs_ntag_i2c_state = 1; gs_ntag_i2c_state = 1;
} else { } else {
snprintf(exp, size, "RESTORE(%d)", cmd[1]); snprintf(exp, size, "RESTORE(%d)", cmd[1]);
} else }
return 0; } else {
return PM3_ESOFT;
}
break; break;
case MIFARE_CMD_TRANSFER: case MIFARE_CMD_TRANSFER:
snprintf(exp, size, "TRANSFER(%d)", cmd[1]); snprintf(exp, size, "TRANSFER(%d)", cmd[1]);
@ -318,7 +321,7 @@ int applyIso14443a(char *exp, size_t size, uint8_t *cmd, uint8_t cmdsize, bool i
} }
gs_mfuc_state = 3; gs_mfuc_state = 3;
} else { } else {
return 0; return PM3_ESOFT;
} }
break; break;
case MIFARE_ULEV1_AUTH: case MIFARE_ULEV1_AUTH:
@ -386,7 +389,7 @@ int applyIso14443a(char *exp, size_t size, uint8_t *cmd, uint8_t cmdsize, bool i
break; break;
default: default:
return 0; return PM3_ESOFT;
} }
} else { } else {
if (gs_mfuc_state == 1) { if (gs_mfuc_state == 1) {
@ -405,14 +408,14 @@ int applyIso14443a(char *exp, size_t size, uint8_t *cmd, uint8_t cmdsize, bool i
if (trace_mfuc_try_default_3des_keys(&gs_mfuc_key, gs_mfuc_state, gs_mfuc_authdata) == PM3_SUCCESS) { if (trace_mfuc_try_default_3des_keys(&gs_mfuc_key, gs_mfuc_state, gs_mfuc_authdata) == PM3_SUCCESS) {
snprintf(exp, size, "AUTH-2 ANSW OK"); snprintf(exp, size, "AUTH-2 ANSW OK");
gs_mfuc_state = 0; gs_mfuc_state = 0;
return 1; return PM3_SUCCESS;
} }
} }
gs_mfuc_state = 0; gs_mfuc_state = 0;
} }
return 0; return PM3_ESOFT;
} }
return 1; return PM3_SUCCESS;
} }
void annotateIso14443a(char *exp, size_t size, uint8_t *cmd, uint8_t cmdsize, bool is_response) { void annotateIso14443a(char *exp, size_t size, uint8_t *cmd, uint8_t cmdsize, bool is_response) {
@ -829,7 +832,7 @@ void annotateIso7816(char *exp, size_t size, uint8_t *cmd, uint8_t cmdsize) {
void annotateMfDesfire(char *exp, size_t size, uint8_t *cmd, uint8_t cmdsize) { void annotateMfDesfire(char *exp, size_t size, uint8_t *cmd, uint8_t cmdsize) {
// it's basically a ISO14443a tag, so try annotation from there // it's basically a ISO14443a tag, so try annotation from there
if (applyIso14443a(exp, size, cmd, cmdsize, false) == 0) { if (applyIso14443a(exp, size, cmd, cmdsize, false) != PM3_SUCCESS ) {
// S-block 11xxx010 // S-block 11xxx010
if ((cmd[0] & 0xC0) && (cmdsize == 3)) { if ((cmd[0] & 0xC0) && (cmdsize == 3)) {
@ -1173,6 +1176,22 @@ void annotateCryptoRF(char *exp, size_t size, uint8_t *cmd, uint8_t cmdsize) {
} }
} }
void annotateSeos(char *exp, size_t size, uint8_t *cmd, uint8_t cmdsize) {
// it's basically a ISO14443a tag, so try annotation from there
if (applyIso14443a(exp, size, cmd, cmdsize, false) != PM3_SUCCESS) {
// switch (cmd[0]) {
// default:
// break;
// };
// apply ISO7816 annotations?
// if (annotateIso7816(exp, size, cmd, cmdsize) == 0) {
// }
// apply SEOS annotations?
}
}
// LEGIC // LEGIC
// 1 = read // 1 = read

View file

@ -61,6 +61,8 @@ void annotateMifare(char *exp, size_t size, uint8_t *cmd, uint8_t cmdsize,
void annotateLTO(char *exp, size_t size, uint8_t *cmd, uint8_t cmdsize); void annotateLTO(char *exp, size_t size, uint8_t *cmd, uint8_t cmdsize);
void annotateCryptoRF(char *exp, size_t size, uint8_t *cmd, uint8_t cmdsize); void annotateCryptoRF(char *exp, size_t size, uint8_t *cmd, uint8_t cmdsize);
void annotateSeos(char *exp, size_t size, uint8_t *cmd, uint8_t cmdsize);
bool DecodeMifareData(uint8_t *cmd, uint8_t cmdsize, uint8_t *parity, bool isResponse, uint8_t *mfData, size_t *mfDataLen, const uint64_t *dicKeys, uint32_t dicKeysCount); bool DecodeMifareData(uint8_t *cmd, uint8_t cmdsize, uint8_t *parity, bool isResponse, uint8_t *mfData, size_t *mfDataLen, const uint64_t *dicKeys, uint32_t dicKeysCount);
bool NTParityChk(AuthData_t *ad, uint32_t ntx); bool NTParityChk(AuthData_t *ad, uint32_t ntx);
bool NestedCheckKey(uint64_t key, AuthData_t *ad, uint8_t *cmd, uint8_t cmdsize, uint8_t *parity); bool NestedCheckKey(uint64_t key, AuthData_t *ad, uint8_t *cmd, uint8_t cmdsize, uint8_t *parity);

View file

@ -282,7 +282,7 @@ static int CmdQuit(const char *Cmd) {
}; };
CLIExecWithReturn(ctx, Cmd, argtable, true); CLIExecWithReturn(ctx, Cmd, argtable, true);
CLIParserFree(ctx); CLIParserFree(ctx);
return PM3_EFATAL; return PM3_SQUIT;
} }
static int CmdRev(const char *Cmd) { static int CmdRev(const char *Cmd) {

View file

@ -206,6 +206,7 @@ static uint16_t printTraceLine(uint16_t tracepos, uint16_t traceLen, uint8_t *tr
case ISO_14443A: case ISO_14443A:
case MFDES: case MFDES:
case LTO: case LTO:
case SEOS:
crcStatus = iso14443A_CRC_check(hdr->isResponse, frame, data_len); crcStatus = iso14443A_CRC_check(hdr->isResponse, frame, data_len);
break; break;
case ISO_7816_4: case ISO_7816_4:
@ -265,7 +266,7 @@ static uint16_t printTraceLine(uint16_t tracepos, uint16_t traceLen, uint8_t *tr
&& protocol != FELICA && protocol != FELICA
&& protocol != LTO && protocol != LTO
&& protocol != PROTO_CRYPTORF && protocol != PROTO_CRYPTORF
&& (hdr->isResponse || protocol == ISO_14443A || protocol == PROTO_MIFARE) && (hdr->isResponse || protocol == ISO_14443A || protocol == PROTO_MIFARE || protocol == SEOS)
&& (oddparity8(frame[j]) != ((parityBits >> (7 - (j & 0x0007))) & 0x01))) { && (oddparity8(frame[j]) != ((parityBits >> (7 - (j & 0x0007))) & 0x01))) {
snprintf(line[j / 18] + ((j % 18) * 4), 120, "%02x! ", frame[j]); snprintf(line[j / 18] + ((j % 18) * 4), 120, "%02x! ", frame[j]);
@ -418,6 +419,9 @@ static uint16_t printTraceLine(uint16_t tracepos, uint16_t traceLen, uint8_t *tr
case PROTO_CRYPTORF: case PROTO_CRYPTORF:
annotateCryptoRF(explanation, sizeof(explanation), frame, data_len); annotateCryptoRF(explanation, sizeof(explanation), frame, data_len);
break; break;
case SEOS:
annotateSeos(explanation, sizeof(explanation), frame, data_len);
break;
default: default:
break; break;
} }
@ -703,22 +707,25 @@ int CmdTraceList(const char *Cmd) {
"Annotate trace buffer with selected protocol data\n" "Annotate trace buffer with selected protocol data\n"
"You can load a trace from file (see `trace load -h`) or it be downloaded from device by default\n", "You can load a trace from file (see `trace load -h`) or it be downloaded from device by default\n",
"trace list -t raw -> just show raw data without annotations\n" "trace list -t raw -> just show raw data without annotations\n"
"\n"
"trace list -t 14a -> interpret as " _YELLOW_("ISO14443-A") "\n" "trace list -t 14a -> interpret as " _YELLOW_("ISO14443-A") "\n"
"trace list -t thinfilm -> interpret as " _YELLOW_("Thinfilm") "\n"
"trace list -t topaz -> interpret as " _YELLOW_("Topaz") "\n"
"trace list -t mf -> interpret as " _YELLOW_("MIFARE Classic") " and decrypt crypto1 stream\n"
"trace list -t des -> interpret as " _YELLOW_("MIFARE DESFire") "\n"
"trace list -t 14b -> interpret as " _YELLOW_("ISO14443-B") "\n" "trace list -t 14b -> interpret as " _YELLOW_("ISO14443-B") "\n"
"trace list -t 7816 -> interpret as " _YELLOW_("ISO7816-4") "\n"
"trace list -t 15 -> interpret as " _YELLOW_("ISO15693") "\n" "trace list -t 15 -> interpret as " _YELLOW_("ISO15693") "\n"
"trace list -t iclass -> interpret as " _YELLOW_("iCLASS") "\n" "trace list -t 7816 -> interpret as " _YELLOW_("ISO7816-4") "\n"
"trace list -t legic -> interpret as " _YELLOW_("LEGIC") "\n" "trace list -t cryptorf -> interpret as " _YELLOW_("CryptoRF") "\n\n"
"trace list -t des -> interpret as " _YELLOW_("MIFARE DESFire") "\n"
"trace list -t felica -> interpret as " _YELLOW_("ISO18092 / FeliCa") "\n" "trace list -t felica -> interpret as " _YELLOW_("ISO18092 / FeliCa") "\n"
"trace list -t hitag1 -> interpret as " _YELLOW_("Hitag1") "\n" "trace list -t hitag1 -> interpret as " _YELLOW_("Hitag1") "\n"
"trace list -t hitag2 -> interpret as " _YELLOW_("Hitag2") "\n" "trace list -t hitag2 -> interpret as " _YELLOW_("Hitag2") "\n"
"trace list -t hitags -> interpret as " _YELLOW_("HitagS") "\n" "trace list -t hitags -> interpret as " _YELLOW_("HitagS") "\n"
"trace list -t iclass -> interpret as " _YELLOW_("iCLASS") "\n"
"trace list -t legic -> interpret as " _YELLOW_("LEGIC") "\n"
"trace list -t lto -> interpret as " _YELLOW_("LTO-CM") "\n" "trace list -t lto -> interpret as " _YELLOW_("LTO-CM") "\n"
"trace list -t cryptorf -> interpret as " _YELLOW_("CryptoRF") "\n\n" "trace list -t mf -> interpret as " _YELLOW_("MIFARE Classic") " and decrypt crypto1 stream\n"
"trace list -t seos -> interpret as " _YELLOW_("SEOS") "\n"
"trace list -t thinfilm -> interpret as " _YELLOW_("Thinfilm") "\n"
"trace list -t topaz -> interpret as " _YELLOW_("Topaz") "\n"
"\n"
"trace list -t mf --dict <mfc_default_keys> -> use dictionary keys file\n" "trace list -t mf --dict <mfc_default_keys> -> use dictionary keys file\n"
"trace list -t 14a -f -> show frame delay times\n" "trace list -t 14a -f -> show frame delay times\n"
"trace list -t 14a -1 -> use trace buffer " "trace list -t 14a -1 -> use trace buffer "
@ -766,23 +773,24 @@ int CmdTraceList(const char *Cmd) {
uint8_t protocol = -1; uint8_t protocol = -1;
// validate type of output // validate type of output
if (strcmp(type, "iclass") == 0) protocol = ICLASS; if (strcmp(type, "14a") == 0) protocol = ISO_14443A;
else if (strcmp(type, "14a") == 0) protocol = ISO_14443A;
else if (strcmp(type, "14b") == 0) protocol = ISO_14443B; else if (strcmp(type, "14b") == 0) protocol = ISO_14443B;
else if (strcmp(type, "topaz") == 0) protocol = TOPAZ;
else if (strcmp(type, "7816") == 0) protocol = ISO_7816_4;
else if (strcmp(type, "des") == 0) protocol = MFDES;
else if (strcmp(type, "legic") == 0) protocol = LEGIC;
else if (strcmp(type, "15") == 0) protocol = ISO_15693; else if (strcmp(type, "15") == 0) protocol = ISO_15693;
else if (strcmp(type, "7816") == 0) protocol = ISO_7816_4;
else if (strcmp(type, "cryptorf") == 0) protocol = PROTO_CRYPTORF;
else if (strcmp(type, "des") == 0) protocol = MFDES;
else if (strcmp(type, "felica") == 0) protocol = FELICA; else if (strcmp(type, "felica") == 0) protocol = FELICA;
else if (strcmp(type, "mf") == 0) protocol = PROTO_MIFARE;
else if (strcmp(type, "hitag1") == 0) protocol = PROTO_HITAG1; else if (strcmp(type, "hitag1") == 0) protocol = PROTO_HITAG1;
else if (strcmp(type, "hitag2") == 0) protocol = PROTO_HITAG2; else if (strcmp(type, "hitag2") == 0) protocol = PROTO_HITAG2;
else if (strcmp(type, "hitags") == 0) protocol = PROTO_HITAGS; else if (strcmp(type, "hitags") == 0) protocol = PROTO_HITAGS;
else if (strcmp(type, "thinfilm") == 0) protocol = THINFILM; else if (strcmp(type, "iclass") == 0) protocol = ICLASS;
else if (strcmp(type, "legic") == 0) protocol = LEGIC;
else if (strcmp(type, "lto") == 0) protocol = LTO; else if (strcmp(type, "lto") == 0) protocol = LTO;
else if (strcmp(type, "cryptorf") == 0) protocol = PROTO_CRYPTORF; else if (strcmp(type, "mf") == 0) protocol = PROTO_MIFARE;
else if (strcmp(type, "raw") == 0) protocol = -1; else if (strcmp(type, "raw") == 0) protocol = -1;
else if (strcmp(type, "seos") == 0) protocol = SEOS;
else if (strcmp(type, "thinfilm") == 0) protocol = THINFILM;
else if (strcmp(type, "topaz") == 0) protocol = TOPAZ;
else if (strcmp(type, "") == 0) protocol = -1; else if (strcmp(type, "") == 0) protocol = -1;
else { else {
PrintAndLogEx(FAILED, "Unknown protocol \"%s\"", type); PrintAndLogEx(FAILED, "Unknown protocol \"%s\"", type);

View file

@ -38,6 +38,14 @@ extern "C" void ShowPictureWindow(char *fn) {
warned = 1; warned = 1;
} }
} }
extern "C" void ShowBase64PictureWindow(char *b64) {
static int warned = 0;
if (!warned) {
printf("No GUI in this build!\n");
warned = 1;
}
}
extern "C" void HidePictureWindow(void) {} extern "C" void HidePictureWindow(void) {}
extern "C" void RepaintPictureWindow(void) {} extern "C" void RepaintPictureWindow(void) {}

View file

@ -22,12 +22,13 @@
#include <stdlib.h> #include <stdlib.h>
#include "ui.h" #include "ui.h"
#include "util.h" // sprint_hex... #include "util.h" // sprint_hex
#include "crypto/asn1utils.h" #include "crypto/asn1utils.h"
#include "crypto/libpcrypto.h" #include "crypto/libpcrypto.h"
#include "ecp.h" #include "ecp.h"
#include "commonutil.h" // ARRAYLEN #include "commonutil.h" // ARRAYLEN
#include "pm3_cmd.h" #include "pm3_cmd.h"
#include "proxgui.h" // Base64 Picture Window
#define STRBOOL(p) ((p) ? "1" : "0") #define STRBOOL(p) ((p) ? "1" : "0")
@ -520,10 +521,36 @@ static int ndefDecodeMime_wifi(NDEFHeader_t *ndef) {
} }
static int ndefDecodeMime_vcard(NDEFHeader_t *ndef) { static int ndefDecodeMime_vcard(NDEFHeader_t *ndef) {
if (ndef->PayloadLen == 0) {
PrintAndLogEx(INFO, "no payload");
return PM3_SUCCESS;
}
PrintAndLogEx(INFO, _CYAN_("VCARD details")); PrintAndLogEx(INFO, _CYAN_("VCARD details"));
if (ndef->PayloadLen > 1) { PrintAndLogEx(INFO, "");
PrintAndLogEx(INFO, ""); PrintAndLogEx(INFO, "%.*s", (int)ndef->PayloadLen, ndef->Payload);
PrintAndLogEx(INFO, "%.*s", (int)ndef->PayloadLen, ndef->Payload);
char *s = strstr((char*)ndef->Payload, "PHOTO");
if (s) {
s = strtok(s, ";");
while (s) {
char *tmp = s;
if (strncmp(tmp, "ENCODING", 8) == 0) {
} else if (strncmp(tmp, "TYPE", 4) == 0) {
char *part = strtok(tmp + 4, ":");
while (part) {
if (strncmp(part, "=image/", 7) == 0) {
} else if (strncmp(part, "VCARD", 5) == 0) {
} else {
// should be in the BASE64 data part now.
ShowBase64PictureWindow(part);
}
part = strtok(NULL, ":");
}
}
s = strtok(NULL, ";");
}
} }
return PM3_SUCCESS; return PM3_SUCCESS;
} }

View file

@ -81,6 +81,20 @@ extern "C" void ShowPictureWindow(char *fn) {
gui->ShowPictureWindow(fn); gui->ShowPictureWindow(fn);
} }
extern "C" void ShowBase64PictureWindow(char *b64) {
if (!gui) {
// Show a notice if X11/XQuartz isn't available
#if defined(__MACH__) && defined(__APPLE__)
PrintAndLogEx(WARNING, "You appear to be on a MacOS device without XQuartz.\nYou may need to install XQuartz (https://www.xquartz.org/) to make the plot work.");
#else
PrintAndLogEx(WARNING, "You appear to be on an environment without an X11 server or without DISPLAY environment variable set.\nPlot may not work until you resolve these issues.");
#endif
return;
}
gui->ShowBase64PictureWindow(b64);
}
extern "C" void HidePictureWindow(void) { extern "C" void HidePictureWindow(void) {
if (!gui) if (!gui)
return; return;

View file

@ -33,6 +33,7 @@ void RepaintGraphWindow(void);
// hook up picture viewer // hook up picture viewer
void ShowPictureWindow(char *fn); void ShowPictureWindow(char *fn);
void ShowBase64PictureWindow(char *b64);
void HidePictureWindow(void); void HidePictureWindow(void);
void RepaintPictureWindow(void); void RepaintPictureWindow(void);

View file

@ -69,6 +69,10 @@ void ProxGuiQT::ShowPictureWindow(char *fn) {
emit ShowPictureWindowSignal(fn); emit ShowPictureWindowSignal(fn);
} }
void ProxGuiQT::ShowBase64PictureWindow(char *b64) {
emit ShowBase64PictureWindowSignal(b64);
}
void ProxGuiQT::RepaintPictureWindow(void) { void ProxGuiQT::RepaintPictureWindow(void) {
emit RepaintPictureWindowSignal(); emit RepaintPictureWindowSignal();
} }
@ -161,6 +165,55 @@ void ProxGuiQT::_ShowPictureWindow(char *fn) {
pictureWidget->show(); pictureWidget->show();
} }
void ProxGuiQT::_ShowBase64PictureWindow(char *b64) {
if (!plotapp)
return;
if (b64 == NULL)
return;
size_t slen = strlen(b64);
if (slen == 0)
return;
char *myb64data = (char *)calloc(slen + 1, sizeof(uint8_t));
if (myb64data == NULL)
return;
memcpy(myb64data, b64, slen);
if (!pictureWidget) {
#if defined(__MACH__) && defined(__APPLE__)
makeFocusable();
#endif
pictureWidget = new PictureWidget();
}
QPixmap pm;
if (pm.loadFromData(QByteArray::fromBase64(myb64data), "PNG") == false) {
qWarning("Failed to read base64 data: %s", myb64data);
}
free(myb64data);
//free(b64);
pictureController->lbl_pm->setPixmap(pm);
pictureController->lbl_pm->setScaledContents(false);
pictureController->lbl_pm->setAlignment(Qt::AlignCenter);
QString s = QString("w: %1 h: %2")
.arg(pm.size().width())
.arg(pm.size().height()
);
pictureController->lbl_sz->setText(s);
pictureWidget->show();
if(!pm.isNull())
pm.save("img", "png");
}
void ProxGuiQT::_RepaintPictureWindow(void) { void ProxGuiQT::_RepaintPictureWindow(void) {
if (!plotapp || !pictureWidget) if (!plotapp || !pictureWidget)
return; return;
@ -214,6 +267,7 @@ void ProxGuiQT::MainLoop() {
// hook up picture viewer signals // hook up picture viewer signals
connect(this, SIGNAL(ShowPictureWindowSignal(char *)), this, SLOT(_ShowPictureWindow(char *))); connect(this, SIGNAL(ShowPictureWindowSignal(char *)), this, SLOT(_ShowPictureWindow(char *)));
connect(this, SIGNAL(ShowBase64PictureWindowSignal(char *)), this, SLOT(_ShowBase64PictureWindow(char *)));
connect(this, SIGNAL(RepaintPictureWindowSignal()), this, SLOT(_RepaintPictureWindow())); connect(this, SIGNAL(RepaintPictureWindowSignal()), this, SLOT(_RepaintPictureWindow()));
connect(this, SIGNAL(HidePictureWindowSignal()), this, SLOT(_HidePictureWindow())); connect(this, SIGNAL(HidePictureWindowSignal()), this, SLOT(_HidePictureWindow()));

View file

@ -157,6 +157,7 @@ class ProxGuiQT : public QObject {
// hook up picture viewer // hook up picture viewer
void ShowPictureWindow(char *fn); void ShowPictureWindow(char *fn);
void ShowBase64PictureWindow(char *b64);
void HidePictureWindow(void); void HidePictureWindow(void);
void RepaintPictureWindow(void); void RepaintPictureWindow(void);
@ -170,6 +171,7 @@ class ProxGuiQT : public QObject {
// hook up picture viewer // hook up picture viewer
void _ShowPictureWindow(char *fn); void _ShowPictureWindow(char *fn);
void _ShowBase64PictureWindow(char *b64);
void _HidePictureWindow(void); void _HidePictureWindow(void);
void _RepaintPictureWindow(void); void _RepaintPictureWindow(void);
@ -184,6 +186,7 @@ class ProxGuiQT : public QObject {
// hook up picture viewer signals // hook up picture viewer signals
void ShowPictureWindowSignal(char *fn); void ShowPictureWindowSignal(char *fn);
void ShowBase64PictureWindowSignal(char *b64);
void HidePictureWindowSignal(void); void HidePictureWindowSignal(void);
void RepaintPictureWindowSignal(void); void RepaintPictureWindowSignal(void);
}; };

View file

@ -44,6 +44,8 @@
typedef enum LogoMode { UTF8, ANSI, ASCII } LogoMode; typedef enum LogoMode { UTF8, ANSI, ASCII } LogoMode;
static int mainret = PM3_ESOFT;
static void showBanner_logo(LogoMode mode) { static void showBanner_logo(LogoMode mode) {
switch (mode) { switch (mode) {
case UTF8: { case UTF8: {
@ -398,13 +400,16 @@ check_script:
} }
// process cmd // process cmd
g_pendingPrompt = false; g_pendingPrompt = false;
int ret = CommandReceived(cmd); mainret = CommandReceived(cmd);
#if defined ICOPYX
PrintAndLogEx(NORMAL, "\nNikola.D: %d", ret);
#endif
// exit or quit // exit or quit
if (ret == PM3_EFATAL) if (mainret == PM3_EFATAL)
break; break;
if (mainret == PM3_SQUIT) {
// Normal quit, map to 0
mainret = PM3_SUCCESS;
break;
}
} }
free(cmd); free(cmd);
cmd = NULL; cmd = NULL;
@ -1070,6 +1075,6 @@ int main(int argc, char *argv[]) {
if (g_session.window_changed) // Plot/Overlay moved or resized if (g_session.window_changed) // Plot/Overlay moved or resized
preferences_save(); preferences_save();
exit(EXIT_SUCCESS); return mainret;
} }
#endif //LIBPM3 #endif //LIBPM3

View file

@ -706,6 +706,8 @@ typedef struct {
// Error codes Usages: // Error codes Usages:
// Success, regular quit
#define PM3_SQUIT 2
// Success, transfer nonces pm3: Sending nonces back to client // Success, transfer nonces pm3: Sending nonces back to client
#define PM3_SNONCES 1 #define PM3_SNONCES 1
// Success (no error) // Success (no error)

View file

@ -393,6 +393,7 @@ ISO 7816-4 Basic interindustry commands. For command APDU's.
#define PROTO_HITAG2 13 #define PROTO_HITAG2 13
#define PROTO_HITAGS 14 #define PROTO_HITAGS 14
#define PROTO_CRYPTORF 15 #define PROTO_CRYPTORF 15
#define SEOS 16
// Picopass fuses // Picopass fuses
#define FUSE_FPERS 0x80 #define FUSE_FPERS 0x80