-int getAWIDBits(unsigned int fc, unsigned int cn, uint8_t *AWIDBits)
-{
- int i;
- uint32_t fcode=(fc & 0x000000FF), cnum=(cn & 0x0000FFFF), uBits=0;
- if (fcode != fc)
- PrintAndLog("NOTE: Facility code truncated for AWID26 format (8-bit facility code)");
- if (cnum!=cn)
- PrintAndLog("NOTE: Card number was truncated for AWID26 format (16-bit card number)");
-
- AWIDBits[0] = 0x01; // 6-bit Preamble with 2 parity bits
- AWIDBits[1] = 0x1D; // First byte from card format (26-bit) plus parity bits
- AWIDBits[2] = 0x80; // Set the next two bits as 0b10 to finish card format
- uBits = (fcode<<4) + (cnum>>12);
- if (!parityTest(uBits,12,0))
- AWIDBits[2] |= (1<<5); // If not already even parity, set bit to make even
- uBits = AWIDBits[2]>>5;
- if (!parityTest(uBits, 3, 1))
- AWIDBits[2] |= (1<<4);
- uBits = fcode>>5; // first 3 bits of facility-code
- AWIDBits[2] += (uBits<<1);
- if (!parityTest(uBits, 3, 1))
- AWIDBits[2]++; // Set parity bit to make odd parity
- uBits = (fcode & 0x1C)>>2;
- AWIDBits[3] = 0;
- if (!parityTest(uBits,3,1))
- AWIDBits[3] |= (1<<4);
- AWIDBits[3] += (uBits<<5);
- uBits = ((fcode & 0x3)<<1) + ((cnum & 0x8000)>>15); // Grab/shift 2 LSBs from facility code and add shifted MSB from cardnum
- if (!parityTest(uBits,3,1))
- AWIDBits[3]++; // Set LSB for parity
- AWIDBits[3]+= (uBits<<1);
- uBits = (cnum & 0x7000)>>12;
- AWIDBits[4] = uBits<<5;
- if (!parityTest(uBits,3,1))
- AWIDBits[4] |= (1<<4);
- uBits = (cnum & 0x0E00)>>9;
- AWIDBits[4] += (uBits<<1);
- if (!parityTest(uBits,3,1))
- AWIDBits[4]++; // Set LSB for parity
- uBits = (cnum & 0x1C0)>>6; // Next bits from card number
- AWIDBits[5]=(uBits<<5);
- if (!parityTest(uBits,3,1))
- AWIDBits[5] |= (1<<4); // Set odd parity bit as needed
- uBits = (cnum & 0x38)>>3;
- AWIDBits[5]+= (uBits<<1);
- if (!parityTest(uBits,3,1))
- AWIDBits[5]++; // Set odd parity bit as needed
- uBits = (cnum & 0x7); // Last three bits from card number!
- AWIDBits[6] = (uBits<<5);
- if (!parityTest(uBits,3,1))
- AWIDBits[6] |= (1<<4);
- uBits = (cnum & 0x0FFF);
- if (!parityTest(uBits,12,1))
- AWIDBits[6] |= (1<<3);
- else
- AWIDBits[6]++;
- for (i = 7; i<12; i++)
- AWIDBits[i]=0x11;
- return 1;
+//refactored by marshmellow
+int getAWIDBits(uint32_t fc, uint32_t cn, uint8_t *AWIDBits) {
+ uint8_t pre[66];
+ memset(pre, 0, sizeof(pre));
+ AWIDBits[7]=1;
+ num_to_bytebits(26, 8, pre);
+
+ uint8_t wiegand[24];
+ num_to_bytebits(fc, 8, wiegand);
+ num_to_bytebits(cn, 16, wiegand+8);
+
+ wiegand_add_parity(pre+8, wiegand, 24);
+
+ size_t bitLen = addParity(pre, AWIDBits+8, 66, 4, 1);
+ if (bitLen != 88) return 0;
+ //for (uint8_t i = 0; i<3; i++){
+ // PrintAndLog("DEBUG: %08X", bytebits_to_byte(AWIDBits+(32*i),32));
+ //}
+ return 1;