X-Git-Url: https://hackdaworld.org/gitweb/?p=rfid%2Flibrfid.git;a=blobdiff_plain;f=gemtag%2Fgemtag.c;fp=gemtag%2Fgemtag.c;h=d6191ba3bb42beed1720f97aeafd7e9ded005635;hp=48dc427f47d7fd46da21be1c96a540505584c091;hb=d78e768b132a7fe1e87410cc07daf555271c018b;hpb=229997e05d754107f8d6cfad9dbc5b496c424b72 diff --git a/gemtag/gemtag.c b/gemtag/gemtag.c index 48dc427..d6191ba 100644 --- a/gemtag/gemtag.c +++ b/gemtag/gemtag.c @@ -29,7 +29,7 @@ int asciidump(unsigned char *data,int len) { for(i=0;i0x19)&&(data[i]<0x7f)) printf("%c",data[i]); - else printf("_"); + else printf("."); //printf("\n"); return 0; @@ -261,7 +261,7 @@ int gemtag_auth_mifare_key(struct gemtag_handle *gh, gemtag_transform_mifare_key(gh,key6,key12); - buf[0]=0x60; /* auth mode */ + buf[0]=GEMTAG_PICC_AUTHENT1A; /* auth mode */ memcpy(buf+1,gh->serial,4); /* sreial */ memcpy(buf+5,key12,12); /* transformed key */ buf[17]=sector; /* sector */ @@ -272,21 +272,32 @@ int gemtag_auth_mifare_key(struct gemtag_handle *gh, return 0; } -int gemtag_read16(struct gemtag_handle *gh,int sector, - unsigned char *data) { +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); + 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) { +int gemtag_write16(struct gemtag_handle *gh,int sector,unsigned char *data) { + + unsigned char buf[32]; + int ret,len; + + buf[0]=GEMTAG_PICC_WRITE16; + buf[1]=sector; + memcpy(buf+2,data,16); + ret=gemtag_transceive(gh,GEMTAG_CMD_COMMON_WRITE,buf,18,buf,&len); + + return ret; +} + +int gemtag_select_picc(struct gemtag_handle *gh) { unsigned char buf[16]; unsigned int len; @@ -309,13 +320,13 @@ int gemtag_pick_picc(struct gemtag_handle *gh) { return 0; } - + int main(int argc, char **argv) { struct gemtag_handle *gh; unsigned char buf[256]; unsigned char key6[6]; - int i; + int i,ret; gh=gemtag_open(); @@ -330,7 +341,7 @@ int main(int argc, char **argv) { printf("\n"); */ - if(gemtag_pick_picc(gh)) { + if(gemtag_select_picc(gh)) { printf("no card found!\n"); return -NO_PICC; } @@ -338,17 +349,29 @@ int main(int argc, char **argv) { 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; + i=0; + while(!gemtag_auth_mifare_key(gh,key6,i)) { + gemtag_read16(gh,i,buf); + printf("%02x: ",i); + hexdump(buf,16); + printf(" | "); + asciidump(buf,16); + printf("\n"); + i+=1; } + printf("\n"); + + /* try to write some data + printf("write some data to the 5th sector:\n"); + for(i=0;i<16;i++) buf[i]=i; + i=4; + ret=gemtag_write16(gh,i,buf); + printf("return = %d\n",ret); + gemtag_read16(gh,i,buf); + printf("%02x: ",i); + hexdump(buf,16); + printf("\n"); + */ gemtag_close(gh);