Esempio n. 1
0
// 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;
}
Esempio n. 2
0
// 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;
}
Esempio n. 3
0
File: awid.c Progetto: 10to7/RFIDler
// 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;
}