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()