+static int ulev1_readSignature( uint8_t *response, uint16_t responseLength ){
+
+ uint8_t cmd[] = {MIFARE_ULEV1_READSIG, 0x00};
+ int len = ul_send_cmd_raw(cmd, sizeof(cmd), response, responseLength);
+ if (len == -1)
+ ul_switch_off_field();
+ return len;
+}
+
+static int ul_print_default( uint8_t *data){
+
+ uint8_t uid[7];
+
+ uid[0] = data[0];
+ uid[1] = data[1];
+ uid[2] = data[2];
+ uid[3] = data[4];
+ uid[4] = data[5];
+ uid[5] = data[6];
+ uid[6] = data[7];
+
+ PrintAndLog(" UID : %s ", sprint_hex(uid, 7));
+ PrintAndLog(" UID[0] : (Manufacturer Byte) = %02x, Manufacturer: %s", uid[0], getTagInfo(uid[0]) );
+
+ // BBC
+ // CT (cascade tag byte) 0x88 xor SN0 xor SN1 xor SN2
+ int crc0 = 0x88 ^ data[0] ^ data[1] ^data[2];
+ if ( data[3] == crc0 )
+ PrintAndLog(" BCC0 : 0x%02X - Ok", data[3]);
+ else
+ PrintAndLog(" BCC0 : 0x%02X - crc should be %02x", data[3], crc0);
+
+ int crc1 = data[4] ^ data[5] ^ data[6] ^data[7];
+ if ( data[8] == crc1 )
+ PrintAndLog(" BCC1 : 0x%02X - Ok", data[8]);
+ else
+ PrintAndLog(" BCC1 : 0x%02X - crc should be 0x%02X", data[8], crc1 );
+
+ PrintAndLog(" Internal : 0x%02X - %s default", data[9], (data[9]==0x48)?"":"not" );
+ PrintAndLog(" Lock : %s - %s", sprint_hex(data+10, 2),printBits( 2, data+10) );
+ PrintAndLog("OneTimePad : %s ", sprint_hex(data + 12, 4));
+ PrintAndLog("");
+ return 0;
+}
+
+static int ntag_print_CC(uint8_t *data) {