mirror of
https://github.com/RfidResearchGroup/proxmark3.git
synced 2025-08-21 22:03:42 -07:00
Merge remote-tracking branch 'upstream/master' into feat/hf-gallagher-remove-aid-limits
This commit is contained in:
commit
a1c3465525
21 changed files with 202 additions and 53 deletions
|
@ -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...
|
||||
|
||||
## [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)
|
||||
|
||||
## [Frostbit.4.14831] [2022-01-11]
|
||||
|
|
|
@ -90,6 +90,8 @@ We define generic Proxmark3 platforms as following devices.
|
|||
**Unknown support status**
|
||||
- ⚠ VX
|
||||
- **Note**: unknown device hw
|
||||
- ⚠ Proxmark3 X
|
||||
- **Note**: unknown device hw.
|
||||
|
||||
|
||||
**256kb flash memory size of generic Proxmark3 platforms**
|
||||
|
|
|
@ -24,6 +24,7 @@ a0a1a2a3a4a5a6a7a0a1a2a3a4a5a6a7
|
|||
b0b1b2b3b4b5b6b7b0b1b2b3b4b5b6b7
|
||||
b0b1b2b3b4b5b6b7b8b9babbbcbdbebf
|
||||
d3f7d3f7d3f7d3f7d3f7d3f7d3f7d3f7
|
||||
C238E449F725B1510EAA699550CABA16 # J2A040
|
||||
11111111111111111111111111111111
|
||||
22222222222222222222222222222222
|
||||
33333333333333333333333333333333
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
47454D5850524553534F53414D504C45 # Gemalto
|
||||
C238E449F725B1510EAA699550CABA16 # J2A040
|
||||
ffffffffffffffffffffffffffffffff
|
||||
00000000000000000000000000000000
|
||||
a0a1a2a3a4a5a6a7a0a1a2a3a4a5a6a7
|
||||
|
|
|
@ -23,4 +23,4 @@ def main(argv):
|
|||
file_out.write(data)
|
||||
|
||||
if __name__ == '__main__':
|
||||
main(sys.argv)
|
||||
sys.exit(main(sys.argv))
|
||||
|
|
|
@ -25,4 +25,4 @@ def main(argv):
|
|||
file_out.write("\n")
|
||||
|
||||
if __name__ == '__main__':
|
||||
main(sys.argv)
|
||||
sys.exit(main(sys.argv))
|
||||
|
|
|
@ -38,7 +38,7 @@ def main():
|
|||
Should produce the output:
|
||||
|
||||
\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)
|
||||
|
||||
|
@ -48,4 +48,4 @@ def main():
|
|||
print('\nTarget (%02X) requires final LRC XOR byte value: %02X\n' % (target,lrc))
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
sys.exit(main())
|
||||
|
|
|
@ -605,7 +605,7 @@ const static atr_t AtrTable[] = {
|
|||
{ "3B6900002494010000000001A9", "Kazakhstan Helios gas station debit card\nhttp://helios.kz/" },
|
||||
{ "3B6900002494010201000101A9", "Chipcard from SUN to be used in SunRay's\n370-4328-01 (31091)" },
|
||||
{ "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/" },
|
||||
{ "3B6900004A434F503331563232", "Visa Europe Sample Card / Axalto" },
|
||||
{ "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" },
|
||||
{ "3B6F00008031E06B04310502D1555555555555", "Pockit Pre-Paid Mastercard (Contact Chip). (Bank)\nhttps://revolut.com/" },
|
||||
{ "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" },
|
||||
{ "3B6F00008031E06B04520502FE555555555555", "CITIBanamex 'Perfiles' debit card (Bank)\nhttps://www.banamex.com/es/personas/cuentas/cuenta-perfiles.html" },
|
||||
{ "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)" },
|
||||
{ "3B6F0000805A28114210122B275DCF41829000", "Pass 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)" },
|
||||
{ "3B6F0000805A28114210122B276780D9829000", "Navigo (Transport)\nhttps://www.navigo.fr/" },
|
||||
{ "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)" },
|
||||
{ "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)" },
|
||||
{ "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/" },
|
||||
{ "3B8F8001804F0CA0000003060300020000000069", "RFID - ISO 14443 Type A - NXP Mifare card with 4k EEPROM" },
|
||||
{ "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" },
|
||||
{ "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" },
|
||||
{ "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" },
|
||||
{ "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/" },
|
||||
|
@ -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" },
|
||||
{ "3BEE00008131804380318066B1A1110100F683009000", "Optelio/Desineo Cards (D72 FXR1)" },
|
||||
{ "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)" },
|
||||
{ "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" },
|
||||
|
@ -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" },
|
||||
{ "3BFF1800008131FE45006B05051017012101434E531031805E", "Regional Card - Regione Liguria, Veneto - Italy (eID)\nTessera Sanitaria - Carta Regionale dei Servizi" },
|
||||
{ "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/" },
|
||||
{ "3BFF1800008131FE4D8025A00000005657444B3430300600DD", "DataKey 400 (DK400)" },
|
||||
{ "3BFF1800008131FE55006B02090403010101434E5310318065", "Italian Chambers of Commerce CNS (PKI)\nhttp://www.card.infocamere.it/infocard/pub/" },
|
||||
|
|
|
@ -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) {
|
||||
|
||||
if (! is_response) {
|
||||
if (is_response == false) {
|
||||
if ((gs_ntag_i2c_state == 1) && (cmdsize == 6) && (memcmp(cmd + 1, "\x00\x00\x00", 3) == 0)) {
|
||||
snprintf(exp, size, "SECTOR(%d)", cmd[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)) {
|
||||
snprintf(exp, size, "ECP");
|
||||
return 1;
|
||||
return PM3_SUCCESS;
|
||||
}
|
||||
|
||||
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;
|
||||
case MIFARE_CMD_RESTORE:
|
||||
|
||||
if (cmdsize == 4)
|
||||
if (cmdsize == 4) {
|
||||
// cmd0 == 0xC2 and cmd1 == 0xFF
|
||||
// high probability its SELECT SECTOR COMMAND:
|
||||
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;
|
||||
} else {
|
||||
snprintf(exp, size, "RESTORE(%d)", cmd[1]);
|
||||
} else
|
||||
return 0;
|
||||
}
|
||||
} else {
|
||||
return PM3_ESOFT;
|
||||
}
|
||||
|
||||
break;
|
||||
case MIFARE_CMD_TRANSFER:
|
||||
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;
|
||||
} else {
|
||||
return 0;
|
||||
return PM3_ESOFT;
|
||||
}
|
||||
break;
|
||||
case MIFARE_ULEV1_AUTH:
|
||||
|
@ -386,7 +389,7 @@ int applyIso14443a(char *exp, size_t size, uint8_t *cmd, uint8_t cmdsize, bool i
|
|||
|
||||
break;
|
||||
default:
|
||||
return 0;
|
||||
return PM3_ESOFT;
|
||||
}
|
||||
} else {
|
||||
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) {
|
||||
snprintf(exp, size, "AUTH-2 ANSW OK");
|
||||
gs_mfuc_state = 0;
|
||||
return 1;
|
||||
return PM3_SUCCESS;
|
||||
}
|
||||
}
|
||||
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) {
|
||||
|
@ -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) {
|
||||
|
||||
// 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
|
||||
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
|
||||
// 1 = read
|
||||
|
|
|
@ -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 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 NTParityChk(AuthData_t *ad, uint32_t ntx);
|
||||
bool NestedCheckKey(uint64_t key, AuthData_t *ad, uint8_t *cmd, uint8_t cmdsize, uint8_t *parity);
|
||||
|
|
|
@ -282,7 +282,7 @@ static int CmdQuit(const char *Cmd) {
|
|||
};
|
||||
CLIExecWithReturn(ctx, Cmd, argtable, true);
|
||||
CLIParserFree(ctx);
|
||||
return PM3_EFATAL;
|
||||
return PM3_SQUIT;
|
||||
}
|
||||
|
||||
static int CmdRev(const char *Cmd) {
|
||||
|
|
|
@ -206,6 +206,7 @@ static uint16_t printTraceLine(uint16_t tracepos, uint16_t traceLen, uint8_t *tr
|
|||
case ISO_14443A:
|
||||
case MFDES:
|
||||
case LTO:
|
||||
case SEOS:
|
||||
crcStatus = iso14443A_CRC_check(hdr->isResponse, frame, data_len);
|
||||
break;
|
||||
case ISO_7816_4:
|
||||
|
@ -265,7 +266,7 @@ static uint16_t printTraceLine(uint16_t tracepos, uint16_t traceLen, uint8_t *tr
|
|||
&& protocol != FELICA
|
||||
&& protocol != LTO
|
||||
&& 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))) {
|
||||
|
||||
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:
|
||||
annotateCryptoRF(explanation, sizeof(explanation), frame, data_len);
|
||||
break;
|
||||
case SEOS:
|
||||
annotateSeos(explanation, sizeof(explanation), frame, data_len);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
@ -703,22 +707,25 @@ int CmdTraceList(const char *Cmd) {
|
|||
"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",
|
||||
"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 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 7816 -> interpret as " _YELLOW_("ISO7816-4") "\n"
|
||||
"trace list -t 15 -> interpret as " _YELLOW_("ISO15693") "\n"
|
||||
"trace list -t iclass -> interpret as " _YELLOW_("iCLASS") "\n"
|
||||
"trace list -t legic -> interpret as " _YELLOW_("LEGIC") "\n"
|
||||
"trace list -t 7816 -> interpret as " _YELLOW_("ISO7816-4") "\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 hitag1 -> interpret as " _YELLOW_("Hitag1") "\n"
|
||||
"trace list -t hitag2 -> interpret as " _YELLOW_("Hitag2") "\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 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 14a -f -> show frame delay times\n"
|
||||
"trace list -t 14a -1 -> use trace buffer "
|
||||
|
@ -766,23 +773,24 @@ int CmdTraceList(const char *Cmd) {
|
|||
uint8_t protocol = -1;
|
||||
|
||||
// validate type of output
|
||||
if (strcmp(type, "iclass") == 0) protocol = ICLASS;
|
||||
else if (strcmp(type, "14a") == 0) protocol = ISO_14443A;
|
||||
if (strcmp(type, "14a") == 0) protocol = ISO_14443A;
|
||||
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, "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, "mf") == 0) protocol = PROTO_MIFARE;
|
||||
else if (strcmp(type, "hitag1") == 0) protocol = PROTO_HITAG1;
|
||||
else if (strcmp(type, "hitag2") == 0) protocol = PROTO_HITAG2;
|
||||
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, "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, "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 {
|
||||
PrintAndLogEx(FAILED, "Unknown protocol \"%s\"", type);
|
||||
|
|
|
@ -38,6 +38,14 @@ extern "C" void ShowPictureWindow(char *fn) {
|
|||
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 RepaintPictureWindow(void) {}
|
||||
|
||||
|
|
|
@ -22,12 +22,13 @@
|
|||
#include <stdlib.h>
|
||||
|
||||
#include "ui.h"
|
||||
#include "util.h" // sprint_hex...
|
||||
#include "util.h" // sprint_hex
|
||||
#include "crypto/asn1utils.h"
|
||||
#include "crypto/libpcrypto.h"
|
||||
#include "ecp.h"
|
||||
#include "commonutil.h" // ARRAYLEN
|
||||
#include "commonutil.h" // ARRAYLEN
|
||||
#include "pm3_cmd.h"
|
||||
#include "proxgui.h" // Base64 Picture Window
|
||||
|
||||
#define STRBOOL(p) ((p) ? "1" : "0")
|
||||
|
||||
|
@ -520,10 +521,36 @@ static int ndefDecodeMime_wifi(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"));
|
||||
if (ndef->PayloadLen > 1) {
|
||||
PrintAndLogEx(INFO, "");
|
||||
PrintAndLogEx(INFO, "%.*s", (int)ndef->PayloadLen, ndef->Payload);
|
||||
PrintAndLogEx(INFO, "");
|
||||
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;
|
||||
}
|
||||
|
|
|
@ -81,6 +81,20 @@ extern "C" void ShowPictureWindow(char *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) {
|
||||
if (!gui)
|
||||
return;
|
||||
|
|
|
@ -33,6 +33,7 @@ void RepaintGraphWindow(void);
|
|||
|
||||
// hook up picture viewer
|
||||
void ShowPictureWindow(char *fn);
|
||||
void ShowBase64PictureWindow(char *b64);
|
||||
void HidePictureWindow(void);
|
||||
void RepaintPictureWindow(void);
|
||||
|
||||
|
|
|
@ -69,6 +69,10 @@ void ProxGuiQT::ShowPictureWindow(char *fn) {
|
|||
emit ShowPictureWindowSignal(fn);
|
||||
}
|
||||
|
||||
void ProxGuiQT::ShowBase64PictureWindow(char *b64) {
|
||||
emit ShowBase64PictureWindowSignal(b64);
|
||||
}
|
||||
|
||||
void ProxGuiQT::RepaintPictureWindow(void) {
|
||||
emit RepaintPictureWindowSignal();
|
||||
}
|
||||
|
@ -161,6 +165,55 @@ void ProxGuiQT::_ShowPictureWindow(char *fn) {
|
|||
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) {
|
||||
if (!plotapp || !pictureWidget)
|
||||
return;
|
||||
|
@ -214,6 +267,7 @@ void ProxGuiQT::MainLoop() {
|
|||
|
||||
// hook up picture viewer signals
|
||||
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(HidePictureWindowSignal()), this, SLOT(_HidePictureWindow()));
|
||||
|
||||
|
|
|
@ -157,6 +157,7 @@ class ProxGuiQT : public QObject {
|
|||
|
||||
// hook up picture viewer
|
||||
void ShowPictureWindow(char *fn);
|
||||
void ShowBase64PictureWindow(char *b64);
|
||||
void HidePictureWindow(void);
|
||||
void RepaintPictureWindow(void);
|
||||
|
||||
|
@ -170,6 +171,7 @@ class ProxGuiQT : public QObject {
|
|||
|
||||
// hook up picture viewer
|
||||
void _ShowPictureWindow(char *fn);
|
||||
void _ShowBase64PictureWindow(char *b64);
|
||||
void _HidePictureWindow(void);
|
||||
void _RepaintPictureWindow(void);
|
||||
|
||||
|
@ -184,6 +186,7 @@ class ProxGuiQT : public QObject {
|
|||
|
||||
// hook up picture viewer signals
|
||||
void ShowPictureWindowSignal(char *fn);
|
||||
void ShowBase64PictureWindowSignal(char *b64);
|
||||
void HidePictureWindowSignal(void);
|
||||
void RepaintPictureWindowSignal(void);
|
||||
};
|
||||
|
|
|
@ -44,6 +44,8 @@
|
|||
|
||||
typedef enum LogoMode { UTF8, ANSI, ASCII } LogoMode;
|
||||
|
||||
static int mainret = PM3_ESOFT;
|
||||
|
||||
static void showBanner_logo(LogoMode mode) {
|
||||
switch (mode) {
|
||||
case UTF8: {
|
||||
|
@ -398,13 +400,16 @@ check_script:
|
|||
}
|
||||
// process cmd
|
||||
g_pendingPrompt = false;
|
||||
int ret = CommandReceived(cmd);
|
||||
#if defined ICOPYX
|
||||
PrintAndLogEx(NORMAL, "\nNikola.D: %d", ret);
|
||||
#endif
|
||||
mainret = CommandReceived(cmd);
|
||||
|
||||
// exit or quit
|
||||
if (ret == PM3_EFATAL)
|
||||
if (mainret == PM3_EFATAL)
|
||||
break;
|
||||
if (mainret == PM3_SQUIT) {
|
||||
// Normal quit, map to 0
|
||||
mainret = PM3_SUCCESS;
|
||||
break;
|
||||
}
|
||||
}
|
||||
free(cmd);
|
||||
cmd = NULL;
|
||||
|
@ -1070,6 +1075,6 @@ int main(int argc, char *argv[]) {
|
|||
|
||||
if (g_session.window_changed) // Plot/Overlay moved or resized
|
||||
preferences_save();
|
||||
exit(EXIT_SUCCESS);
|
||||
return mainret;
|
||||
}
|
||||
#endif //LIBPM3
|
||||
|
|
|
@ -706,6 +706,8 @@ typedef struct {
|
|||
|
||||
// Error codes Usages:
|
||||
|
||||
// Success, regular quit
|
||||
#define PM3_SQUIT 2
|
||||
// Success, transfer nonces pm3: Sending nonces back to client
|
||||
#define PM3_SNONCES 1
|
||||
// Success (no error)
|
||||
|
|
|
@ -393,6 +393,7 @@ ISO 7816-4 Basic interindustry commands. For command APDU's.
|
|||
#define PROTO_HITAG2 13
|
||||
#define PROTO_HITAGS 14
|
||||
#define PROTO_CRYPTORF 15
|
||||
#define SEOS 16
|
||||
|
||||
// Picopass fuses
|
||||
#define FUSE_FPERS 0x80
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue