X-Git-Url: https://hackdaworld.org/gitweb/?p=rfid%2Flibrfid.git;a=blobdiff_plain;f=gemtag%2Fgemtag.c;h=48dc427f47d7fd46da21be1c96a540505584c091;hp=c2b24d7f19350f53fdd5ada62cadfd2b204891b0;hb=d72a365a0f044de71ae7c13dd7782895f531a944;hpb=b9ec871784f1408d26e24bd29e9084017239543d diff --git a/gemtag/gemtag.c b/gemtag/gemtag.c index c2b24d7..48dc427 100644 --- a/gemtag/gemtag.c +++ b/gemtag/gemtag.c @@ -30,7 +30,7 @@ int asciidump(unsigned char *data,int len) { for(i=0;i0x19)&&(data[i]<0x7f)) printf("%c",data[i]); else printf("_"); - printf("\n"); + //printf("\n"); return 0; } @@ -39,7 +39,7 @@ int hexdump(unsigned char *data,int len) { int i; for(i=0;icaps&GEMTAG_CAP_VERB_TRANSMIT) - printf("short answer (%d)\n",ret); - return -SHORT_ANSWER; + return -SHORT_ANSWER; } *rx_len=rxbuf[3]|(rxbuf[4]<<8); @@ -166,17 +165,15 @@ int gemtag_transcieve(struct gemtag_handle *gh,unsigned char cmd, size-=2; crcptr=(u_int16_t *)(rxbuf+size); crc=gemtag_calc_crc(rxbuf,size); - if(((crc>>8)!=rxbuf[size+1])||((crc&0xff)!=rxbuf[size])) { - printf("bad crc! (%04x)\n",crc); + if(((crc>>8)!=rxbuf[size+1])||((crc&0xff)!=rxbuf[size])) return -BAD_CRC; - } } /* check sequence number */ - if(rxhdr->seq!=txhdr->seq) { - puts("transmitted/recieved sequence number do not match"); - return -SEQ_MISMATCH; - } + if(rxhdr->seq!=txhdr->seq) return -SEQ_MISMATCH; + + /* check return code */ + if(rxbuf[2]) return -CMD_FAILED; memcpy(rx,rxbuf+sizeof(struct gemtag_cmd_hdr),*rx_len); @@ -222,11 +219,13 @@ struct gemtag_handle *gemtag_open(void) { perror("claim interface"); goto out_free; } - printf("claimed interface 0, "); + printf("claimed interface 0\n"); + /* if(usb_set_altinterface(gh->handle,0)) perror("set alt interface"); printf("activated alt setting 0\n"); + */ return gh; @@ -243,49 +242,116 @@ int gemtag_close(struct gemtag_handle *gh) { return 0; } +int gemtag_transform_mifare_key(struct gemtag_handle *gh, + unsigned char *key6,unsigned char *key12) { + + unsigned int len; + + gemtag_transceive(gh,GEMTAG_CMD_HOST_CODE_KEY,key6,6,key12,&len); + + return 0; +} + +int gemtag_auth_mifare_key(struct gemtag_handle *gh, + unsigned char *key6,int sector) { + + unsigned char key12[12]; + unsigned char buf[32]; + unsigned int len,ret; + + gemtag_transform_mifare_key(gh,key6,key12); + + buf[0]=0x60; /* auth mode */ + memcpy(buf+1,gh->serial,4); /* sreial */ + memcpy(buf+5,key12,12); /* transformed key */ + buf[17]=sector; /* sector */ + ret=gemtag_transceive(gh,GEMTAG_CMD_PICC_AUTH_KEY,buf,18, + buf,&len); + if(ret) return -AUTH_FAILED; + + return 0; +} + +int gemtag_read16(struct gemtag_handle *gh,int sector, + unsigned char *data) { + + unsigned char buf[32]; + int len,ret; + + buf[0]=sector; + ret=gemtag_transceive(gh,GEMTAG_CMD_PICC_READ, + buf,1,data,&len); + if(ret) return -READ_FAILED; + + return 0; +} + +int gemtag_pick_picc(struct gemtag_handle *gh) { + + unsigned char buf[16]; + unsigned int len; + int ret; + + buf[0]=GEMTAG_PICC_REQIDL; + ret=gemtag_transceive(gh,GEMTAG_CMD_PICC_REQUEST,buf,1,buf,&len); + if(ret) return -NO_PICC; + + buf[0]=GEMTAG_PICC_STD_SELECT_CODE; + memset(buf+1,0,5); + ret=gemtag_transceive(gh,GEMTAG_CMD_PICC_CASC_ANTICOLL,buf,6,buf,&len); + if(ret) return -NO_PICC; + memcpy(gh->serial,buf,4); + + buf[0]=GEMTAG_PICC_STD_SELECT_CODE; + memcpy(buf+1,gh->serial,4); + ret=gemtag_transceive(gh,GEMTAG_CMD_PICC_CASC_SELECT,buf,5,buf,&len); + if(ret) return -PICC_SELECT_ERROR; + + return 0; +} int main(int argc, char **argv) { struct gemtag_handle *gh; unsigned char buf[256]; - unsigned int buflen; + unsigned char key6[6]; + int i; gh=gemtag_open(); gh->caps|=GEMTAG_CAP_CRC; - gh->caps|=GEMTAG_CAP_VERB_TRANSMIT; + //gh->caps|=GEMTAG_CAP_VERB_TRANSMIT; + /* printf("Device:\n"); - gemtag_transcieve(gh,GEMTAG_CMD_GET_FW_VERSION, + gemtag_transceive(gh,GEMTAG_CMD_GET_FW_VERSION, NULL,0,buf,&buflen); asciidump(buf,buflen); printf("\n"); + */ - printf("Serial Number:\n"); - gemtag_transcieve(gh,GEMTAG_CMD_GET_SERIAL_NUMBER, - NULL,0,buf,&buflen); - printf("Snr: %d (%04x)\n",buf[1]<<8|buf[0],buf[1]<<8|buf[0]); - printf("\n"); - - printf("RC632 Version:\n"); - gemtag_transcieve(gh,GEMTAG_CMD_GET_RIC_VERSION, - NULL,0,buf,&buflen); - printf("\n"); - - printf("Switching off the LED!\n"); - buf[0]=GEMTAG_LED_OFF; - gemtag_transcieve(gh,GEMTAG_CMD_SWITCH_LED, - buf,1,buf,&buflen); - printf("\n"); + if(gemtag_pick_picc(gh)) { + printf("no card found!\n"); + return -NO_PICC; + } - printf("Detecting Card ...\n"); - gemtag_transcieve(gh,GEMTAG_CMD_DETECT_CARD, - NULL,0,buf,&buflen); - asciidump(buf,buflen); - printf("\n"); + memset(key6,0xff,6); + printf("\nreading sectors ... (serial: %02x %02x %02x %02x)\n\n", + gh->serial[3],gh->serial[2],gh->serial[1],gh->serial[0]); + for(i=0;i<256;i++) { + gemtag_auth_mifare_key(gh,key6,i); + if(!gemtag_read16(gh,i,buf)) { + printf("%02x: ",i++); + hexdump(buf,16); + printf(" | "); + asciidump(buf,16); + printf("\n"); + } + else return 0; + } gemtag_close(gh); - return 1; + return 0; }