+static int
+mifare_classic_dump(struct rfid_protocol_handle *ph)
+{
+ unsigned int size;
+ unsigned int size_len = sizeof(size);
+ int sector, num_sectors;
+
+ if (rfid_protocol_getopt(ph, RFID_OPT_PROTO_SIZE,
+ &size, &size_len) == 0) {
+ printf("Size: %u bytes\n", size);
+ } else {
+ printf("Size: unknown ?!?\n");
+ return -EINVAL;
+ }
+
+ switch (size) {
+ case 320:
+ num_sectors = 5;
+ break;
+ case 1024:
+ num_sectors = 16;
+ break;
+ case 4096:
+ num_sectors = 40;
+ break;
+ default:
+ return -EINVAL;
+ }
+
+ for (sector = 0; sector < num_sectors; sector++) {
+ int rc;
+
+ printf("Authenticating sector %u: ", sector);
+ fflush(stdout);
+
+ rc = mfcl_set_key(ph, MIFARE_CL_KEYA_DEFAULT_INFINEON);
+ if (rc < 0) {
+ printf("key format error\n");
+ exit(1);
+ }
+
+ rc = mfcl_auth(ph, RFID_CMD_MIFARE_AUTH1A,
+ mfcl_sector2block(sector));
+ if (rc < 0) {
+ printf("mifare auth error\n");
+ exit(1);
+ } else
+ printf("mifare auth succeeded!\n");
+
+ mifare_classic_read_sector(ph, sector);
+ }
+}
+
+void
+iso15693_write(struct rfid_reader_handle *rh,int layer2,int sector,
+ unsigned char *data, unsigned int len)
+{
+ int rc;
+ unsigned char uid_buf[16];
+ unsigned int uid_len = sizeof(uid_buf);
+
+ if (rh->reader->l2_supported & (1 << layer2)) {
+ l2h = rfid_layer2_init(rh, layer2);
+ if (!l2h) {
+ printf("error during layer2(%d)_init (0=14a,1=14b,3=15)\n",layer2);
+ return;
+ }
+ printf("Layer2 init ok\n");
+ rc = rfid_layer2_open(l2h);
+ if (rc>0){
+ rfid_layer2_getopt(l2h, RFID_OPT_LAYER2_UID, &uid_buf, &uid_len);
+ printf("Layer 2 success (%s)[%d]: '%s'\n", rfid_layer2_name(l2h), uid_len, hexdump(uid_buf, uid_len));
+ rc = iso15693_write_block(l2h,sector,data,len);
+ printf("write>>rc: %d\n",rc);
+
+ }else {
+ printf("error during layer2_open\n");
+ return ;
+ }
+ rfid_layer2_close(l2h);
+ rfid_layer2_fini(l2h);
+ }
+}
+
+void iso15693_dump(struct rfid_reader_handle *rh,int layer2,int sector){
+ unsigned int size;
+ unsigned int size_len = sizeof(size);
+ unsigned char buf[1024];
+ int rc,i;
+ unsigned char uid_buf[16], block_sec;
+ unsigned int uid_len = sizeof(uid_buf);
+
+
+ if (rh->reader->l2_supported & (1 << layer2)) {
+ l2h = rfid_layer2_init(rh, layer2);
+ if (!l2h) {
+ printf("error during layer2(%d)_init (0=14a,1=14b,3=15)\n",layer2);
+ return;
+ }
+ printf("Layer2 init ok\n");
+ rc = rfid_layer2_open(l2h);
+ if (rc>0){
+ rfid_layer2_getopt(l2h, RFID_OPT_LAYER2_UID, &uid_buf, &uid_len);
+ printf("Layer 2 success (%s)[%d]: '%s'\n", rfid_layer2_name(l2h), uid_len, hexdump(uid_buf, uid_len));
+
+ if (sector < 0){
+ if (sector<=-3)
+ iso15693_select(l2h);
+ for(i=0;i<=255;i++){
+ rc = iso15693_read_block(l2h,i,buf,sizeof(buf),&block_sec);
+ if (rc>=0)
+ printf("block[%3d:%02x]sec:0x%0x data(%d): %s\n",i,i,block_sec,rc,hexdump(buf,rc));
+ else{
+ printf("no data(read_block(%d)>> %d)\n",i,rc);
+ if ((sector == -1)||(sector == -3))
+ break;
+ }
+ }
+ }else{
+ if (sector>255)
+ sector=255;
+ rc = iso15693_read_block(l2h,sector,buf,sizeof(buf));
+ if (rc>=0)
+ printf("block[%d]data(%d): %s\n",i,rc,hexdump(buf,rc));
+ else
+ printf("no data(read_block(%d)>> %d)\n",i,rc);
+ }
+ } else {
+ printf("error during layer2_open\n");
+ return ;
+ }
+ rfid_layer2_close(l2h);
+ rfid_layer2_fini(l2h);
+ }
+}
+