// Works for 26bits. int GetPyramidBits(uint32_t fc, uint32_t cn, uint8_t *pyramidBits) { uint8_t pre[128]; memset(pre, 0x00, sizeof(pre)); // format start bit pre[79] = 1; // Get 26 wiegand from FacilityCode, CardNumber uint8_t wiegand[24]; memset(wiegand, 0x00, sizeof(wiegand)); num_to_bytebits(fc, 8, wiegand); num_to_bytebits(cn, 16, wiegand+8); // add wiegand parity bits (dest, source, len) wiegand_add_parity(pre+80, wiegand, 24); // add paritybits (bitsource, dest, sourcelen, paritylen, parityType (odd, even,) addParity(pre+8, pyramidBits+8, 102, 8, 1); // add checksum uint8_t csBuff[13]; for (uint8_t i = 0; i < 13; i++) csBuff[i] = bytebits_to_byte(pyramidBits + 16 + (i*8), 8); uint32_t crc = CRC8Maxim(csBuff, 13); num_to_bytebits(crc, 8, pyramidBits+120); return 1; }
// convert null-terminated BCD UID (8 digits) to 96 bit hid26 encoded binary array BOOL bcd_to_hid26_bin(unsigned char *hid26, unsigned char *bcd) { unsigned char tmp1[8], tmp2[26]; unsigned int tmpint; if(strlen(bcd) != 8) return FALSE; // convert BCD site code to HEX sscanf(bcd, "%03d", &tmpint); sprintf(tmp2, "%02x", tmpint); memcpy(tmp1, tmp2, 2); // convert BCD ID to HEX sscanf(bcd + 3, "%05d", &tmpint);; sprintf(tmp2, "%04x", tmpint); // copy with trailing NULL memcpy(tmp1 + 2, tmp2, 5); // convert full HEX to binary, leaving room for parity prefix hextobinarray(tmp2 + 1, tmp1); wiegand_add_parity(tmp2, tmp2 + 1, 24); // magic 44 bit hid26 header hextobinarray(hid26, "1D555955556"); // add manchester encoded hid data manchester_encode(hid26 + 44, tmp2, 26); return TRUE; }
// convert null-terminated BCD UID (8 digits) to 96 bit awid26 encoded binary array BOOL bcd_to_awid26_bin(unsigned char *awid26, unsigned char *bcd) { unsigned char i, p, tmp1[8], tmp2[26]; unsigned int tmpint; if(strlen(bcd) != 8) return FALSE; // convert BCD site code to HEX sscanf(bcd, "%03d", &tmpint); sprintf(tmp2, "%02x", tmpint); memcpy(tmp1, tmp2, 2); // convert BCD ID to HEX sscanf(bcd + 3, "%05d", &tmpint);; sprintf(tmp2, "%04x", tmpint); // copy with trailing NULL memcpy(tmp1 + 2, tmp2, 5); // convert full HEX to binary, leaving room for parity prefix hextobinarray(tmp2 + 1, tmp1); wiegand_add_parity(tmp2, tmp2 + 1, 24); memset(awid26, '\x0', 96); // magic 18 bit awid26 header (we will overwrite the last two bits) hextobinarray(awid26, "011D8"); // copy to target leaving space for parity bits for(i= 0, p= 18 ; i < 26 ; ++i, ++p) { // skip target bit if this is a parity location if(!((p + 1) % 4)) p += 1; awid26[p]= tmp2[i]; } // add parity bits for(i= 1 ; i < 24 ; ++i) awid26[((i + 1) * 4) - 1]= parity(&awid26[i * 4], ODD, 3); return TRUE; }