+ switch (len) {
+ case -1:
+ tagtype = (UL | UL_C);
+ break;
+ case 0x0A: {
+
+ if ( version[2] == 0x03 && version[6] == 0x0B )
+ tagtype = UL_EV1_48;
+ else if ( version[2] == 0x03 && version[6] != 0x0B )
+ tagtype = UL_EV1_128;
+ else if ( version[2] == 0x04 && version[6] == 0x0F )
+ tagtype = NTAG_213;
+ else if ( version[2] == 0x04 && version[6] != 0x11 )
+ tagtype = NTAG_215;
+ else if ( version[2] == 0x04 && version[6] == 0x13 )
+ tagtype = NTAG_216;
+ else if ( version[2] == 0x04 )
+ tagtype = NTAG;
+
+ break;
+ }
+ case 0x01:{
+ tagtype = UL_C;
+ break;
+ }
+ case 0x00: {
+ tagtype = UL;
+ break;
+ }
+ default :{
+ tagtype = UNKNOWN;
+ break;
+ }
+ }
+
+ if ((tagtype & ( UL_C | UL ))) {
+ // Magic UL-C, by observation,
+ // it seems to have a static nonce response to 0x1A command.
+ status = ul_select(&card);
+ status = ulc_requestAuthentication(0, nonce1, sizeof(nonce1));
+ if ( status > 0 ) {
+
+ status = ulc_requestAuthentication(0, nonce2, sizeof(nonce2));
+
+ tagtype =( !memcmp(nonce1, nonce2, 11) ) ? UL_C_MAGIC : UL_C;
+
+ } else {
+ tagtype = UL;
+ }
+ }
+
+ //PrintAndLog("ICE %d", tagtype);
+ //Magic Ultralight test here. It takes present UID, and tries to write it back.
+ if ( (tagtype & UL) ){
+ // read 3des key or PWD,
+ // if response bytes == all zeros its a NORMAL tag.
+ //return UL_MAGIC;
+ }
+
+ ul_switch_off_field();
+ return tagtype;
+}
+
+int CmdHF14AMfUInfo(const char *Cmd){
+
+
+ uint8_t data[16] = {0x00};
+ iso14a_card_select_t card;
+ uint8_t *key;
+ int status;
+
+ PrintAndLog("\n--- Tag Information ---------");
+ PrintAndLog("-------------------------------------------------------------");
+
+ TagTypeUL_t tagtype = GetHF14AMfU_Type();
+ if (tagtype == UL_ERROR) return -1;
+
+ ul_print_type(tagtype);
+
+ status = ul_select(&card);
+ if ( status < 1 ){
+ PrintAndLog("Error: couldn't select");
+ ul_switch_off_field();
+ return status;
+ }
+
+ // read pages 0,1,2,4 (should read 4pages)
+ status = ul_read(0, data, sizeof(data));
+ if ( status == -1 ){
+ PrintAndLog("Error: tag didn't answer to READ");
+ ul_switch_off_field();
+ return status;
+ }
+
+ ul_print_default(data);
+
+
+ if ((tagtype & UL_C)){
+
+ // read pages 0x28, 0x29, 0x2A, 0x2B
+ uint8_t ulc_conf[16] = {0x00};
+ status = ul_read(0x28, ulc_conf, sizeof(ulc_conf));
+ if ( status == -1 ){
+ PrintAndLog("Error: tag didn't answer to READ");
+ ul_switch_off_field();
+ return status;
+ }
+
+ ulc_print_configuration(ulc_conf);
+
+ if ((tagtype & UL_C_MAGIC)){
+
+ uint8_t ulc_deskey[16] = {0x00};
+ status = ul_read(0x2C, ulc_deskey, sizeof(ulc_deskey));
+ if ( status == -1 ){
+ PrintAndLog("Error: tag didn't answer to READ");
+ ul_switch_off_field();
+ return status;
+ }
+
+ ulc_print_3deskey(ulc_deskey);
+
+ }
+ else {
+ PrintAndLog("Trying some default 3des keys");
+ for (uint8_t i = 0; i < 7; ++i ){
+ key = default_3des_keys[i];
+ if (try3DesAuthentication(key) == 1){
+ PrintAndLog("Found default 3des key: %s", sprint_hex(key,16));
+ return 0;
+ }
+ }
+ }
+ }
+
+ if ((tagtype & (UL_EV1_48 | UL_EV1_128))) {
+
+ ulev1_print_counters();
+
+ uint8_t startconfigblock = (tagtype & UL_EV1_48) ? 0x10 : 0x24;
+ uint8_t ulev1_conf[16] = {0x00};
+ status = ul_read(startconfigblock, ulev1_conf, sizeof(ulev1_conf));
+ if ( status == -1 ){
+ PrintAndLog("Error: tag didn't answer to READ");
+ ul_switch_off_field();
+ return status;
+ }
+
+ ulev1_print_configuration(ulev1_conf);
+ }
+
+ if ((tagtype & (UL_EV1_48 | UL_EV1_128 | NTAG_213 | NTAG_215 | NTAG_216))) {
+
+ uint8_t version[10] = {0x00};
+ status = ulev1_getVersion(version, sizeof(version));
+ if ( status == -1 ){
+ PrintAndLog("Error: tag didn't answer to GETVERSION");
+ ul_switch_off_field();
+ return status;
+ }
+ ul_print_version(version);
+
+ //********** TODO ********************************
+ // --problem, there is a failed pwd tries counter in UL-EV1
+ PrintAndLog("\nTrying some known EV1/NTAG passwords.");
+
+ uint8_t password[4] ={0xff,0xff,0xff,0xff};
+ uint8_t pack[4] = {0,0,0,0};
+ status = ulev1_requestAuthentication(password, pack, sizeof(pack));
+ if ( status == -1 ){
+ PrintAndLog("Error: tag didn't answer to AUTHENTICATE");
+ ul_switch_off_field();
+ return status;
+ }
+ PrintAndLog("Found default password: %s",sprint_hex(password, sizeof(password)));
+ PrintAndLog("Got PACK : %s", sprint_hex(pack,sizeof(pack)));
+ }
+
+ if ((tagtype & (NTAG_213 | NTAG_215 | NTAG_216))){
+
+ PrintAndLog("\n--- NTAG NDEF Message");
+ uint8_t cc[16] = {0x00};
+ status = ul_read(2, cc, sizeof(cc));
+ if ( status == -1 ){
+ PrintAndLog("Error: tag didn't answer to READ");
+ ul_switch_off_field();
+ return status;
+ }
+ ul_print_CC(cc);
+ }
+
+ ul_switch_off_field();