ksjsb/tests/test_h5_sig3.py
2026-07-30 20:25:56 +08:00

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