X-Git-Url: https://git.zerfleddert.de/cgi-bin/gitweb.cgi/proxmark3-svn/blobdiff_plain/71cb7328e3f65b7245ab8d38c6f9351d28f46658..581b31fb8aa7af6d83f58217a2e8016edc9f4f76:/client/cmdlfpyramid.c diff --git a/client/cmdlfpyramid.c b/client/cmdlfpyramid.c index 23c44059..06790012 100644 --- a/client/cmdlfpyramid.c +++ b/client/cmdlfpyramid.c @@ -48,26 +48,29 @@ int GetPyramidBits(uint32_t fc, uint32_t cn, uint8_t *pyramidBits) { uint8_t pre[128]; memset(pre, 0x00, sizeof(pre)); - // add preamble - pyramidBits[7]=1; - num_to_bytebits(26, 8, pre); - - // get wiegand + // 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 - wiegand_add_parity(pre+8, wiegand, 24); - - // add paritybits - addParity(pre, pyramidBits+8, 66, 4, 1); + // add wiegand parity bits (dest, source, len) + wiegand_add_parity(pre+80, wiegand, 24); - // add checksum - // this is wrong. - uint32_t crc = CRC8Maxim(wiegand, 13); - num_to_bytebits(crc, 8, pre+120); + // add paritybits (bitsource, dest, sourcelen, paritylen, parityType (odd, even,) + addParity(pre+8, pyramidBits+8, 112, 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; } @@ -85,28 +88,24 @@ int CmdPyramidClone(const char *Cmd) { char cmdp = param_getchar(Cmd, 0); if (strlen(Cmd) == 0 || cmdp == 'h' || cmdp == 'H') return usage_lf_pyramid_clone(); - uint32_t facilitycode=0, cardnumber=0; - uint8_t bits[128]; - uint8_t *bs = bits; - memset(bs,0,sizeof(bits)); + uint32_t facilitycode=0, cardnumber=0, fc = 0, cn = 0; + + uint8_t bs[129]; + memset(bs, 0x00, sizeof(bs)); + //Pyramid - compat mode, FSK2a, data rate 50, 4 data blocks uint32_t blocks[5] = {T55x7_MODULATION_FSK2a | T55x7_BITRATE_RF_50 | 4<