]>
cvs.zerfleddert.de Git - proxmark3-svn/blob - client/cmdlfawid26.c
0e1fca8ed44fe1384bb75d3fc7513dfa48d5d2a8
   1 //----------------------------------------------------------------------------- 
   3 // This code is licensed to you under the terms of the GNU GPL, version 2 or, 
   4 // at your option, any later version. See the LICENSE.txt file for the text of 
   6 //----------------------------------------------------------------------------- 
   7 // Low frequency AWID26 commands 
   8 //----------------------------------------------------------------------------- 
  13 #include "proxmark3.h" 
  17 #include "cmdparser.h" 
  18 //#include "cmddata.h" 
  20 #include "cmdlfawid26.h" 
  25 static int CmdHelp(const char *Cmd
); 
  27 int CmdClone(const char *Cmd
) 
  29         char cmdp 
= param_getchar(Cmd
, 0); 
  31         if (strlen(Cmd
) < 1 || cmdp 
== 'h' || cmdp 
== 'H') { 
  32                 PrintAndLog("Usage:  lf awid26 clone  <facility> <id>"); 
  35                 PrintAndLog("     sample: lf awid26 clone 15 2233"); 
  39         //sscanf(Cmd, "%d %d", &facilitycode, &cardno); 
  41         // char block0 = "00107060";   
  42         // char block1 = "00107060";   
  43         // char block2 = "00107060";   
  44         // char block3 = "00107060";   
  48         // PrintAndLog("Writing block %d with data %08X", Block, Data); 
  53 // convert 96 bit AWID FSK data to 8 digit BCD UID 
  54 bool awid26_hex_to_uid(unsigned char *response
, unsigned char *awid26
) 
  56         // uint8_t i, tmp[96], tmp1[7]; 
  60     // if(!hextobinarray(tmp, awid26)) 
  63     // // data is in blocks of 4 bits - every 4th bit is parity, except the first 
  64     // // block which is all zeros 
  65     // for(i= 0 ; i < 4 ; ++i) 
  69     // // discard 1st block 
  70     // memcpy(tmp, tmp + 4, 92); 
  72     // // check and strip parity on the rest 
  73     // for(i= 1 ; i < 23 ; ++i) 
  74         // if(tmp[(i * 4) - 1] != parity(tmp + (i - 1) * 4, ODD, 3)) 
  77             // memcpy((tmp + (i - 1) * 3), tmp + (i - 1) * 4, 3); 
  79     // // discard the rest of the header - 1 more 3 bit block 
  80     // memcpy(tmp, tmp + 3, 66); 
  82     // // next 8 bits is data length - should be 26: 0x1A 
  83     // binarraytohex(tmp1, tmp, 8); 
  84     // if(strcmp(tmp1, "1A") != 0) 
  86     // memcpy(tmp, tmp +8, 58); 
  88     // // standard wiegand parity check - even for 1st 12 bits, odd for 2nd 12 
  89     // if(tmp[0] != parity(tmp + 1, EVEN, 12)) 
  91     // if(tmp[25] != parity(tmp + 13, ODD, 12)) 
  94     // // convert to hex, ignoring parity bits 
  95     // if(!binarraytohex(tmp1, tmp + 1, 24)) 
  98     // // convert hex to site/id 
  99     // sscanf(tmp1,"%2X%4X", &site, &id); 
 101     // // final output 8 byte BCD 
 102     // sprintf(response,"%03d%05d", site, id); 
 107 // convert null-terminated BCD UID (8 digits) to 96 bit awid26 encoded binary array 
 108 bool bcd_to_awid26_bin(unsigned char *awid26
, unsigned char *bcd
) 
 110     // char i, p, tmp1[8], tmp2[26]; 
 113     // if(strlen(bcd) != 8) 
 116     // // convert BCD site code to HEX 
 117     // sscanf(bcd, "%03d", &tmpint); 
 118     // sprintf(tmp2, "%02x", tmpint); 
 119     // memcpy(tmp1, tmp2, 2); 
 121     // // convert BCD ID to HEX 
 122     // sscanf(bcd + 3, "%05d", &tmpint);; 
 123     // sprintf(tmp2, "%04x", tmpint); 
 125     // // copy with trailing NULL 
 126     // memcpy(tmp1 + 2, tmp2, 5); 
 128     // // convert full HEX to binary, leaving room for parity prefix 
 129     // hextobinarray(tmp2 + 1, tmp1); 
 131     // wiegand_add_parity(tmp2, tmp2 + 1, 24); 
 133     // memset(awid26, '\x0', 96); 
 135     // // magic 18 bit awid26 header (we will overwrite the last two bits) 
 136     // hextobinarray(awid26, "011D8"); 
 138     // // copy to target leaving space for parity bits 
 139     // for(i= 0, p= 18 ; i < 26 ; ++i, ++p) 
 141         // // skip target bit if this is a parity location 
 142         // if(!((p + 1) % 4)) 
 144         // awid26[p]= tmp2[i]; 
 147     // // add parity bits 
 148     // for(i= 1 ; i < 24 ; ++i) 
 149         // awid26[((i + 1) * 4) - 1]= parity(&awid26[i * 4], ODD, 3); 
 154 // int CmdReadTrace(const char *Cmd) 
 157         // uint8_t bits[LF_BITSSTREAM_LEN] = {0x00}; 
 158         // uint8_t * bitstream = bits; 
 161         // uint32_t bl0     = PackBits(si, 32, bitstream); 
 162         // uint32_t bl1     = PackBits(si+32, 32, bitstream); 
 164         // uint32_t acl     = PackBits(si,  8, bitstream); si += 8; 
 165         // uint32_t mfc     = PackBits(si, 8, bitstream); si += 8; 
 166         // uint32_t cid     = PackBits(si, 5, bitstream); si += 5; 
 167         // uint32_t icr     = PackBits(si, 3, bitstream); si += 3; 
 168         // uint32_t year    = PackBits(si, 4, bitstream); si += 4; 
 169         // uint32_t quarter = PackBits(si, 2, bitstream); si += 2; 
 170         // uint32_t lotid    = PackBits(si, 12, bitstream); si += 12; 
 171         // uint32_t wafer   = PackBits(si, 5, bitstream); si += 5; 
 172         // uint32_t dw      = PackBits(si, 15, bitstream);  
 175         // PrintAndLog("-- T55xx Trace Information ----------------------------------"); 
 176         // PrintAndLog("-------------------------------------------------------------"); 
 177         // PrintAndLog(" ACL Allocation class (ISO/IEC 15963-1)  : 0x%02X (%d)", acl, acl); 
 178         // PrintAndLog(" MFC Manufacturer ID (ISO/IEC 7816-6)    : 0x%02X (%d)", mfc, mfc); 
 179         // PrintAndLog(" CID                                     : 0x%02X (%d)", cid, cid); 
 180         // PrintAndLog(" ICR IC Revision                         : %d",icr ); 
 186 static command_t CommandTable
[] = 
 188   {"help",   CmdHelp
,     1, "This help"}, 
 189   {"clone",  CmdClone
,    1, "<facility> <id> -- clone AWID26 to t55xx tag"}, 
 190   {NULL
, NULL
, 0, NULL
} 
 193 int CmdLFAWID26(const char *Cmd
) 
 195   CmdsParse(CommandTable
, Cmd
); 
 199 int CmdHelp(const char *Cmd
) 
 201   CmdsHelp(CommandTable
);