gdle/Source/crc.cpp

123 lines
2.4 KiB
C++
Raw Permalink Normal View History

2018-03-29 17:01:57 -04:00
2019-07-07 20:56:15 +00:00
#include <StdAfx.h>
2018-03-29 17:01:57 -04:00
#include "crc.h"
2019-07-07 20:56:15 +00:00
uint32_t GetMagicNumber(BYTE *pbBuf, WORD wSize, BOOL fIncludeSize)
2018-03-29 17:01:57 -04:00
{
2019-07-07 20:56:15 +00:00
uint32_t dwCS = 0;
2018-03-29 17:01:57 -04:00
int i;
//if ( fIncludeSize ) // PRE_TOD only
dwCS += wSize << 16;
for (i = 0; i < (wSize >> 2); ++i)
2019-07-07 20:56:15 +00:00
dwCS += ((uint32_t *)pbBuf)[i];
2018-03-29 17:01:57 -04:00
int iShift = 3;
for (i = (i << 2); i < wSize; ++i)
{
dwCS += pbBuf[i] << (iShift * 8);
--iShift;
}
return dwCS;
}
2019-07-07 20:56:15 +00:00
uint32_t CalcTransportCRC(uint32_t *pdwWoot)
2018-03-29 17:01:57 -04:00
{
2019-07-07 20:56:15 +00:00
uint32_t dwOrg = pdwWoot[2];
uint32_t dwCrc = 0;
2018-03-29 17:01:57 -04:00
pdwWoot[2] = 0xBADD70DD;
dwCrc += GetMagicNumber((BYTE *)pdwWoot, 20, TRUE);
pdwWoot[2] = dwOrg;
return dwCrc;
}
2019-07-07 20:56:15 +00:00
uint32_t GenericCRC(BlobPacket_s *p)
2018-03-29 17:01:57 -04:00
{
2019-07-07 20:56:15 +00:00
uint32_t dwCrc1, dwCrc2, *pdwCrc;
2018-03-29 17:01:57 -04:00
pdwCrc = &p->header.dwCRC;
*pdwCrc = 0xBADD70DD;
2019-07-07 20:56:15 +00:00
dwCrc1 = CalcTransportCRC((uint32_t *)p);
2018-03-29 17:01:57 -04:00
dwCrc2 = GetMagicNumber(p->data, p->header.wSize, FALSE);
*pdwCrc = dwCrc1 + dwCrc2;
return (dwCrc1 + dwCrc2);
}
2019-07-07 20:56:15 +00:00
uint32_t BlobCRC(BlobPacket_s *p, uint32_t dwXOR)
2018-03-29 17:01:57 -04:00
{
BYTE *pbPayload = p->data;
BYTE *pbPayloadEnd = p->data + p->header.wSize;
2019-07-07 20:56:15 +00:00
uint32_t dwFlags = p->header.dwFlags;
2018-03-29 17:01:57 -04:00
2019-07-07 20:56:15 +00:00
uint32_t dwHeaderCRC = CalcTransportCRC((uint32_t *)p);
uint32_t dwPayloadCRC = 0;
2018-03-29 17:01:57 -04:00
2019-11-24 15:40:46 -06:00
uint16_t optionSize = 0;
if (dwFlags & BT_ACKSEQUENCE)
{
optionSize += sizeof(uint32_t);
//dwPayloadCRC += GetMagicNumber(pbPayload, sizeof(uint32_t), TRUE);
//pbPayload +=
}
2018-03-29 17:01:57 -04:00
if (dwFlags & BT_TIMEUPDATE)
{
2019-11-24 15:40:46 -06:00
optionSize += sizeof(double);
//dwPayloadCRC += GetMagicNumber(pbPayload, sizeof(double), TRUE);
//pbPayload += sizeof(double);
2018-03-29 17:01:57 -04:00
}
if (dwFlags & BT_ECHOREQUEST)
{
2019-11-24 15:40:46 -06:00
optionSize += sizeof(uint32_t);
//dwPayloadCRC += GetMagicNumber(pbPayload, 4, TRUE);
//pbPayload += 4;
2018-03-29 17:01:57 -04:00
}
if (dwFlags & BT_ECHORESPONSE)
{
2019-11-24 15:40:46 -06:00
optionSize += 8;
//dwPayloadCRC += GetMagicNumber(pbPayload, 8, TRUE);
//pbPayload += 8;
2018-03-29 17:01:57 -04:00
}
if (dwFlags & BT_FLOW)
{
2019-11-24 15:40:46 -06:00
optionSize += 6;
//dwPayloadCRC += GetMagicNumber(pbPayload, 6, TRUE);
//pbPayload += 6;
}
if (optionSize > 0)
{
dwPayloadCRC += GetMagicNumber(pbPayload, optionSize, TRUE);
pbPayload += optionSize;
2018-03-29 17:01:57 -04:00
}
if (dwFlags & BT_FRAGMENTS)
{
while (pbPayload < pbPayloadEnd)
{
WORD wLength = reinterpret_cast<FragHeader_s *>(pbPayload)->wSize;
dwPayloadCRC += GetMagicNumber(pbPayload, sizeof(FragHeader_s), TRUE) + GetMagicNumber(pbPayload + sizeof(FragHeader_s), wLength - sizeof(FragHeader_s), TRUE);
pbPayload += wLength;
}
}
2019-07-07 20:56:15 +00:00
uint32_t dwFinalCRC = dwHeaderCRC + (dwPayloadCRC ^ dwXOR);
2018-03-29 17:01:57 -04:00
return dwFinalCRC;
}