113 lines
4.0 KiB
Python
113 lines
4.0 KiB
Python
import unittest
|
|
|
|
from core.h5_sig3 import h5_encode_sha_digest, h5_sig3_crc32_from_sign_input, h5_sig3_from_fields, h5_sig3_mix, parse_h5_sig3
|
|
from core.reward_sign import (
|
|
kwsg_10418_reward_sign_from_digest_hex,
|
|
kwsg_10418_reward_sign_to_digest_hex,
|
|
)
|
|
|
|
|
|
H5_JSBRIDGE_SDK = "5bbcf3cd-727b-48ab-b4b4-5f01e61ee9a5"
|
|
|
|
SAMPLES = {
|
|
"treasure_open": {
|
|
"sig3": "c1d196a640dbd8d9029de89e9998ac137d863bcbcdcb1c8399448e8e88888b8ab595",
|
|
"counter": 0x77,
|
|
"crc32": 0x02F88937,
|
|
"elapsed_ms": 0x4B4C4DBC,
|
|
"state_value": 0x0001C814,
|
|
},
|
|
"sign_in_report": {
|
|
"sig3": "6d7d3a0aec777475ae3159323534784487e4c6706667b02f5d2b2222242427261939",
|
|
"counter": 0x6A,
|
|
"crc32": 0xCCAE724F,
|
|
"elapsed_ms": 0x4B4B5AED,
|
|
"state_value": 0x00010B7C,
|
|
},
|
|
"sign_in_resource": {
|
|
"sig3": "48581f2fc95251508b147e171011efcc6c21d15e4342950a69260707010102033c1c",
|
|
"counter": 0x68,
|
|
"crc32": 0x2C60DFFD,
|
|
"elapsed_ms": 0x4B4B51DF,
|
|
"state_value": 0x0001236D,
|
|
},
|
|
"treasure_info": {
|
|
"sig3": "8d9ddaea0c9794954ed1b6d2d5d45114206ec985868750cff1d6c2c2c4c4c7c6f9d9",
|
|
"counter": 0x65,
|
|
"crc32": 0xA6E9C286,
|
|
"elapsed_ms": 0x4B4B4F02,
|
|
"state_value": 0x00011630,
|
|
},
|
|
}
|
|
|
|
|
|
class H5Sig3Tests(unittest.TestCase):
|
|
def test_parse_har_samples(self):
|
|
for name, sample in SAMPLES.items():
|
|
with self.subTest(name=name):
|
|
parsed = parse_h5_sig3(sample["sig3"])
|
|
self.assertTrue(parsed.ok)
|
|
self.assertEqual(parsed.session_seed, 0x4B4B4BD1)
|
|
self.assertEqual(parsed.counter, sample["counter"])
|
|
self.assertEqual(parsed.crc32, sample["crc32"])
|
|
self.assertEqual(parsed.elapsed_ms, sample["elapsed_ms"])
|
|
self.assertEqual(parsed.state_value, sample["state_value"])
|
|
|
|
def test_mix_roundtrip(self):
|
|
for name, sample in SAMPLES.items():
|
|
with self.subTest(name=name):
|
|
parsed = parse_h5_sig3(sample["sig3"])
|
|
self.assertEqual(h5_sig3_mix(parsed.preimage).hex(), sample["sig3"])
|
|
|
|
def test_build_from_fields_roundtrip(self):
|
|
for name, sample in SAMPLES.items():
|
|
with self.subTest(name=name):
|
|
generated = h5_sig3_from_fields(
|
|
crc32_value=sample["crc32"],
|
|
counter=sample["counter"],
|
|
elapsed_ms=sample["elapsed_ms"],
|
|
state_value=sample["state_value"],
|
|
)
|
|
self.assertEqual(generated, sample["sig3"])
|
|
|
|
def test_h5_jsbridge_atlas_outer_wrap_for_sdk_5bb(self):
|
|
inner_digest = "0b1a4a4965484604c84340412b8a30b7c8430a335e525c4a"
|
|
atlas64 = "5a54eecdd3ce5ab6677f2b25087e247cad0e010363b942e6a4266b5f33643e32"
|
|
|
|
self.assertEqual(
|
|
kwsg_10418_reward_sign_from_digest_hex(inner_digest, H5_JSBRIDGE_SDK),
|
|
atlas64,
|
|
)
|
|
self.assertEqual(
|
|
kwsg_10418_reward_sign_to_digest_hex(atlas64, H5_JSBRIDGE_SDK),
|
|
inner_digest,
|
|
)
|
|
|
|
def test_h5_encode_sha_digest_matches_vm_trace(self):
|
|
digest = h5_encode_sha_digest("sigCatVer=1")
|
|
|
|
self.assertEqual(
|
|
digest.hex(),
|
|
"2099d6e518c94b75765bb0feb48173e1ce4433757c5e16e7b80b2481a6389829",
|
|
)
|
|
self.assertEqual(h5_sig3_crc32_from_sign_input("sigCatVer=1"), 0xE5D69920)
|
|
|
|
def test_h5_encode_crc_corpus(self):
|
|
samples = {
|
|
"": 0xB55FE1DF,
|
|
"a": 0xC4225AD1,
|
|
"b": 0xC5AB513D,
|
|
"abc": 0x5D78E777,
|
|
"sigCatVer=1a=1": 0x5948ABF2,
|
|
"a=1sigCatVer=1": 0x20E88D0E,
|
|
"source=bottom_guide_firstsigCatVer=1": 0xF63DAE04,
|
|
}
|
|
|
|
for sign_input, expected in samples.items():
|
|
with self.subTest(sign_input=sign_input):
|
|
self.assertEqual(h5_sig3_crc32_from_sign_input(sign_input), expected)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|