Skip to content

Instantly share code, notes, and snippets.

@plambrechtsen
Created March 14, 2021 08:47
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save plambrechtsen/8187ec88349520e1ada67e30add28030 to your computer and use it in GitHub Desktop.
Save plambrechtsen/8187ec88349520e1ada67e30add28030 to your computer and use it in GitHub Desktop.
Pet hub crc calculations
import crccheck
from operator import xor
from pathlib import Path
#Xor key from surepetpacket.xorkey
xorkey='000000589e6c5a71ba9633f8c7fc4eafce9ee203c3a89ee498822ba00d9bc7bde054d5dd4ab02ba61a01fa477aec124811273f59ee848b9303903b3acd74678f8305d5ef33df79d5d56e159656aff90055ae'
def tohex(ba):
return ''.join(format(x, '02x') for x in ba)
#Convert a int to hex
def hexb(hexbyte):
return format(hexbyte,'02x')
#Convert a int to hex
def crcpoly(hexbyte, checkbyteval):
poly=0
print("hex",tohex(hexbyte),"check",checkbyteval
#Loop through all polynomials as one of them should work right??
while poly<255:
#Poly as counter
crcpolyval = hexb(crccheck.crc.Crc(8, poly, initvalue=0, reflect_input=False, reflect_output=False, xor_output=0, check_result=0).calc(hexbyte))
if crcpolyval == checkbyteval:
print("PolyVal0: Match", crcpolyval == checkbyteval , "Checkbyte", checkbyteval, "Calc checksum", crcpolyval, "Poly",poly)
#Poly as counter with initval = ff
crcpolyvalf = hexb(crccheck.crc.Crc(8, poly, initvalue=0xff, reflect_input=False, reflect_output=False, xor_output=0, check_result=0).calc(hexbyte))
if crcpolyvalf == checkbyteval:
print("PolyValF: Match", crcpolyvalf == checkbyteval , "Checkbyte", checkbyteval, "Calc checksum", crcpolyvalf, "Poly",poly)
#Poly as counter xor output
crcpolyvalx = hexb(crccheck.crc.Crc(8, poly, initvalue=0, reflect_input=False, reflect_output=False, xor_output=1, check_result=0).calc(hexbyte))
if crcpolyvalx == checkbyteval:
print("PolyVal0X:Match", crcpolyvalx == checkbyteval , "Checkbyte", checkbyteval, "Calc checksum", crcpolyvalx, "Poly",poly)
#Poly as counter with initval = ff
crcpolyvalxf = hexb(crccheck.crc.Crc(8, poly, initvalue=0xff, reflect_input=False, reflect_output=False, xor_output=1, check_result=0).calc(hexbyte))
if crcpolyvalxf == checkbyteval:
print("PolyValFX:Match", crcpolyvalxf == checkbyteval , "Checkbyte", checkbyteval, "Calc checksum", crcpolyvalxf, "Poly",poly)
poly += 1
#Sample standard packets, the last byte is what we are trying to calculate.
packetarray = [ '01a13c58946c5a4aba973063','01b53c58946c5a4aba973764','01c73c58946c5a4dba973662','01323c58946c5a55ba97307c','01df3c58946c5a55ba97317d','014a3c58946c5a55ba97327e','01ef3c58946c5a55ba97337f','01263c58946c5a55ba97377b','01f03c58946c5a59ba973171','014c3c58916c5b30ba9032f4c6f04cae2c','01982a58b76c5171ba8e336c4c581aa6ce9ee903c3bf9e7013267fa90d9bccbde042d549c1147faf1a0199','01062a58b76c5171babe33104b581aa6ce9ee903c3829e0c14267fa90d9bccbde07dd535c6147faf1a01d0','010c2d58876c5771b0969e7263a84eb6ce9ee200c3a89ee4998143','01ec2d58876c5771b296527263a84eb6ce9ee200c3a89ee499818d','01022d58876c5771b396b97263a84eb6ce9ee200c3a89ee4998167','01fe2d58876c5771b396b97263a84eb6ce9ee200c3a89ee4998167','01992d58876c5771bc96507163a84eb6ce9ee200c3a89ee4998083','01cf2d58876c5771bd96257263a84eb6ce9ee200c3a89ee49980f4' ]
for packet in packetarray:
#convert to byte array
packetba = bytearray.fromhex(packet)
#Copy check byte
checkbyte = tohex(packetba[-1:])
print("Standard:", tohex(packetba), "Checkbyte",checkbyte)
#Offset to copy from for validation
stdoffset=5
#Copy from offset and exclude check byte
checkba = packetba[stdoffset:-1]
#checksum8
checksumval = hexb(crccheck.checksum.Checksum8.calc(checkba))
#checksum8xor
checksumxorval = hexb(crccheck.checksum.ChecksumXor8.calc(checkba))
if checksumval == checkbyte:
print("Standard: Match", checksumval == checkbyte , "Checkbyte", checkbyte, "Calc checksum", checksumval)
if checksumxorval == checkbyte:
print("Standard: Match", checksumxorval == checkbyte , "Checkbyte", checkbyte, "Calc checksumxor", checksumxorval)
crcpoly(checkba, checkbyte)
xorpacketba = list(map(xor, packetba, xorkey))
#Copy check byte
xorcheckbyte = tohex(xorpacketba[-1:])
print("Dexor :",tohex(xorpacketba),"Checkbyte",xorcheckbyte)
xoroffset = 0
count=0
#Loop through updating the packet type as it might be an xored value we don't know
while count<255:
print("Byte ",packetba[0:2],"packet",packetba[2], "xorvalue",packetba[2] ^ count)
# xorpacketba[2] = map(xor, packetba[2], count)
xorpacketba[2] = packetba[2] ^ count
# xorpacketba[2] = count
#Set where to start copying from
#Copy from offset and exclude check byte
xorcheckba = xorpacketba[xoroffset:-1]
xorcrcval = hexb(crccheck.crc.Crc8.calc(xorcheckba))
if xorcrcval == xorcheckbyte:
# print("Dexor - :",tohex(xorcheckba))
print("Dexor : Match", xorcrcval == xorcheckbyte , "Count", hexb(count), "Checkbyte", xorcheckbyte, "Calc checksum", xorcrcval)
xorchecksumval = hexb(crccheck.checksum.Checksum8.calc(xorcheckba))
if xorchecksumval == xorcheckbyte:
# print("Dexor - :",tohex(xorcheckba))
print("Dexor : Match", xorchecksumval == xorcheckbyte ,"Count", hexb(count), "Checkbyte", xorcheckbyte, "Calc checksum", xorchecksumval)
xorchecksumxorval = hexb(crccheck.checksum.ChecksumXor8.calc(xorcheckba))
if xorchecksumxorval == xorcheckbyte:
# print("Dexor - :",tohex(xorcheckba))
print("Dexor : Match", xorchecksumxorval == xorcheckbyte , "Count", hexb(count), "Checkbyte", xorcheckbyte, "Calc checksumxor", xorchecksumxorval)
crcpoly(xorcheckba, xorcheckbyte)
count += 1
#Check with the non xored checkbyte
print("Dexor 2 :",tohex(xorpacketba),"Checkbyte",checkbyte)
count=0
#Loop through updating the packet type as it might be an xored value we don't know
while count<255:
print("Byte ",packetba[0:2],"packet",packetba[2], "xorvalue",packetba[2] ^ count)
# xorpacketba[2] = map(xor, packetba[2], count)
xorpacketba[2] = packetba[2] ^ count
# xorpacketba[2] = count
#Set where to start copying from
#Copy from offset and exclude check byte
xorcheckba = xorpacketba[xoroffset:-1]
xorcrcval = hexb(crccheck.crc.Crc8.calc(xorcheckba))
if xorcrcval == checkbyte:
# print("Dexor - :",tohex(xorcheckba))
print("Dexor 2 : Match", xorcrcval == checkbyte , "Count", hexb(count), "Checkbyte", checkbyte, "Calc checksum", xorcrcval)
xorchecksumval = hexb(crccheck.checksum.Checksum8.calc(xorcheckba))
if xorchecksumval == checkbyte:
# print("Dexor - :",tohex(xorcheckba))
print("Dexor 2 : Match", xorchecksumval == checkbyte ,"Count", hexb(count), "Checkbyte", checkbyte, "Calc checksum", xorchecksumval)
xorchecksumxorval = hexb(crccheck.checksum.ChecksumXor8.calc(xorcheckba))
if xorchecksumxorval == checkbyte:
# print("Dexor - :",tohex(xorcheckba))
print("Dexor 2 : Match", xorchecksumxorval == checkbyte , "Count", hexb(count), "Checkbyte", checkbyte, "Calc checksumxor", xorchecksumxorval)
crcpoly(xorcheckba, checkbyte)
count += 1
#hexstringba = bytearray.fromhex(hexstring)
#offset=0
#checkba = hexstringba[3:-1]
#checkbyte = tohex(hexstringba[-1:])
#print(tohex(nhb))
#print(shb)
#print(hexb(Crc8.calc(checkba)))
#print(hexb(Checksum8.calc(checkba)))
#sum(checkba) & 0xff == checkbyte
#print("Current Digest", checkbyte, "crc", sum(checkba) & 0xff == checkbyte )
'''
count=0
while count<255:
# print("FirstByte C", hexb(nhb[0]))
checkba[offset] = count
# print("FirstByte U", hexb(nhb[0]))
count += 1
# hash = crc8.crc8()
# hash.update(nhb)
crcval = hexb(crccheck.crc.Crc8.calc(checkba))
# crcval = hexb(crccheck.crc.Crc(8, count, initvalue=255, reflect_input=False, reflect_output=False, xor_output=0, check_result=0).calc(checkba))
# print("Current Digest", checkbyte, "crc", crcval )
checksumval = hexb(crccheck.checksum.Checksum8.calc(checkba))
checksumxorval = hexb(crccheck.checksum.ChecksumXor8.calc(checkba))
if crcval == checkbyte:
print("Current Digest", checkbyte, "crc", crcval, "count", count )
print("OriMsg", hexstring, "Msg:",tohex(checkba), "Key:",hexb(checkba[offset]), "Current Digest", checkbyte , "crc", crcval )
if checksumval == checkbyte:
print("OriMsg", hexstring, "Msg:",tohex(checkba), "Key:",hexb(checkba[offset]), "Current Digest", checkbyte , "checksum", checksumval )
if checksumxorval == checkbyte:
print("OriMsg", hexstring, "Msg:",tohex(checkba), "Key:",hexb(checkba[offset]), "Current Digest", checkbyte , "checksumxor", checksumxorval )
# dig = hash.hexdigest()
# print("dig", nhb[0]," ", dig, " ", shb)
# if dig == checkbyte:
# print("OriMsg", hexstring, "Msg:",tohex(nhb), "Key:",hexb(nhb[2]), "Current Digest", shb , "Calc", hash.hexdigest() )
'''
#Packet:01ff2d588e6c5a718b94447c61a856afce1d
#Packet:01542d588e6c5a718c94927361a856afcec3
#Packet:017e2d588e6c5a718d94c27d66a856ffce82
#Packet:016b2d588e6c5a718d94d27361a856afce82
#Packet:01382d588e6c5a718e94657361a856afce36
#Packet:014e2d588e6c5a718f94a47361a856afcef6
#Packet:01ef2d588e6c5a7190948be062a858afce58
#Packet:01f32d588e6c5a7190948be062a858afce58
#Packet:01ee2d588e6c5a7191948be062a856afce57
#Packet:01d52d588e6c5a71929440e062a856afce9f
#Packet:01ea2d588e6c5a7193949de062a858afce4d
#Packet:01e62d588e6c5a719494518062a842afcefc
#Packet:01e52d588e6c5a719594518062a85eafcee1
#Packet:01f62d588e6c5a719694e6e062a856afce3d
#Packet:013b2d588e6c5a71979498e162a856afce43
#Packet:01bd2d588e6c5a71989476e062a856afcea3
#Packet:01c32d588e6c5a7199947ce062a858afcea6
#Packet:01bb2d588e6c5a719a9476e062a847afceb0
#Packet:01bc2d588e6c5a719b9476e062a847afceb1
#Packet:01cf2d588e6c5a719c945be062a858afce84
#Dexor :01c82d001000000025025918a55418000026
#Dexor :01cf2d001000000026026818a5541600001a
#Dexor :01d02d001000000027026818a5541600001b
#Dexor :01d52d001000000028027318a55418000001
#Dexor :01ea2d00100000002902ae18a554160000d3
#Dexor :01ef2d00100000002a02b818a554160000c6
#Dexor :01f32d00100000002a02b818a554160000c6
#Dexor :01ee2d00100000002b02b818a554180000c9
#Dexor :01f62d00100000002c02d518a554180000a3
#Dexor :013b2d00100000002d02ab19a554180000dd
#Dexor :01e62d00100000002e026278a5540c000062
#Dexor :01e52d00100000002f026278a5541000007f
#Dexor :01ba2d001000000030029c83a6541800006e
#Dexor :01ff2d001000000031027784a65418000083
#Dexor :010b2d00100000003202cb8aa65418000032
#Dexor :01332d00100000003302478ba654180000be
#Dexor :01382d00100000003402568ba654180000a8
#Dexor :014e2d00100000003502978ba65418000068
'''
Packet:01a13c58946c5a4aba973063
Dexor :01a13c000a00003b0001039b 63
Packet:01b53c58946c5a4aba973764
Dexor :01b53c000a00003b0001049c 64
Packet:01c73c58946c5a4dba973662
Dexor :01c73c000a00003c0001059a 62
Packet:01323c58946c5a55ba97307c
Dexor :01323c000a00002400010384 7c
Packet:01df3c58946c5a55ba97317d
Dexor :01df3c000a00002400010285 7d
Packet:014a3c58946c5a55ba97327e
Dexor :018d3c000a00002400010186 7e
Packet:01ef3c58946c5a55ba97337f
Dexor :01ef3c000a00002400010087 7f
Packet:01263c58946c5a55ba97377b
Dexor :01ff3c000a00002400010483 7b
Packet:01f03c58946c5a59ba973171
Dexor :01f03c000a00002800010289 71
Packet:014c3c58916c5b30ba9032f4c6f04cae2c
Dexor :014c3c000f0001410006010c010c0201e2 2c
Packet:01982a58b76c5171ba8e336c4c581aa6ce9ee903c3bf9e7013267fa90d9bccbde042d549c1147faf1a0199
Dexor :01982a0029000b00001800948ba4540900000b00001700948ba4540900000b00001600948ba45409000063 99
Packet:01062a58b76c5171babe33104b581aa6ce9ee903c3829e0c14267fa90d9bccbde07dd535c6147faf1a01d0
Dexor :01062a0029000b00002800e88ca4540900000b00002a00e88ca4540900000b00002900e88ca4540900002a d0
Packet:010c2d58876c5771b0969e7263a84eb6ce9ee200c3a89ee4998143
Dexor :010c2d0019000d000a00ad8aa45400190000000300000000010368 43
Packet:01ec2d58876c5771b296527263a84eb6ce9ee200c3a89ee499818d
Dexor :01ec2d0019000d000800618aa454001900000003000000000103a6 8d
Packet:01022d58876c5771b396b97263a84eb6ce9ee200c3a89ee4998167
Dexor :01022d0019000d0009008a8aa4540019000000030000000001034c 67
Packet:01fe2d58876c5771b396b97263a84eb6ce9ee200c3a89ee4998167
Dexor :01fe2d0019000d0009008a8aa4540019000000030000000001034c 67
Packet:01992d58876c5771bc96507163a84eb6ce9ee200c3a89ee4998083
Dexor :01992d0019000d0006006389a454001900000003000000000102a8 83
Packet:01cf2d58876c5771bd96257263a84eb6ce9ee200c3a89ee49980f4
Dexor :01cf2d0019000d000700168aa454001900000003000000000102df f4
Dexor :01b63c000a000006cde1448f 77
Dexor :010b3c000a00002400010087 7f
Dexor :011d3c000a00002400010087 7f
Dexor :013e3c000a00002400010087 7f
Dexor :014e3c000a00002400010087 7f
Dexor :01503c000a00002400010087 7f
Dexor :015a3c000a00002400010087 7f
Dexor :015d3c000a00002400010087 7f
Dexor :01913c000a00002400010087 7f
Dexor :019a3c000a00002400010087 7f
Dexor :01ca3c000a00002400010087 7f
Dexor :01ee3c000a00002400010087 7f
Dexor :01ef3c000a00002400010087 7f
Dexor :014a3c000a00002400010186 7e
Dexor :01323c000a00002400010384 7c
Dexor :01fc3c000a00002400010384 7c
Dexor :01263c000a00002400010483 7b
Dexor :016c3c000a00002400010483 7b
Dexor :017e3c000a00002400010483 7b
Dexor :01ff3c000a00002400010483 7b
Dexor :01e03c000a00002800010388 70
Dexor :01fd3c000a00002800010388 70
Dexor :01823c000a000028b6510289 71
Dexor :01823c000a00003b0001049c 64
Dexor :01b53c000a00003b0001049c 64
'''
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment