Skip to content

Commit 274c54c

Browse files
committed
add zeam signature
1 parent e4098c8 commit 274c54c

1 file changed

Lines changed: 191 additions & 19 deletions

File tree

tests/lean_spec/subspecs/xmss/test_cross_client_compat.py

Lines changed: 191 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -36,12 +36,12 @@ class ProdSignature(Container):
3636
hashes: ProdHashDigestList
3737

3838

39-
PUBLIC_KEY_HEX = (
39+
REAM_PUBLIC_KEY_HEX = (
4040
"7bbaf95bd653c827b5775e00b973b24d50ab4743db3373244f29c95fdf4ccc62"
4141
"8788ba2b5b9d635acdb25770e8ceef66bfdecd0a"
4242
)
4343

44-
SIGNATURE_HEX = (
44+
REAM_SIGNATURE_HEX = (
4545
"240000006590c5180f52a57ef4d12153ace9dd1bb346ea1299402d32978bd56f"
4646
"2804000004000000903b927d2ee9cf14087b2164dd418115962e322a6da10a58"
4747
"821ee20dd54f3c6a3f6dba14ebc2340b1aa7cc5647e08d0151024229312973331f"
@@ -142,68 +142,240 @@ class ProdSignature(Container):
142142
"035ca0e3022270b628"
143143
)
144144

145-
EPOCH = 5
146-
MESSAGE = Bytes32(b"\x00" * 32)
145+
REAM_EPOCH = 5
146+
REAM_MESSAGE = Bytes32(b"\x00" * 32)
147+
148+
ZEAM_PUBLIC_KEY_HEX = (
149+
"88119868a1228b6b710ece77f9064d5c9c90ba4e3be5a9246ab3086fc5863d57"
150+
"042575326f573f573016c520398daa7bea98d837"
151+
)
152+
153+
ZEAM_SIGNATURE_HEX = (
154+
"2400000013abb160455288173880bb66b439784aaa87fa3e82048858ed545056"
155+
"2804000004000000117cc94e1a3b8c08b057451a7246e86d5e3fe92e12def85a"
156+
"aff7e127b315a22a7ce76405dda87f4b44b15a39edc78759d7e17b3334230907"
157+
"df8bca769709aa106b12672a2870f47c035be3598a64355250575f32e9ea881b"
158+
"9de1fa4d930bca74d919a63a350f5a1b14ebef5b06c2dc1d031abb4cc224436b"
159+
"559c501d9e6f2c47be269772a0f05f77d7fd251bb1013d14bb8dcd64e98a1d0"
160+
"52524f913e713c500c9d67f4914bcd879c073d60c5fc0f36e4dae7e0d4883294"
161+
"25c2e8f354bcc2c72cb2d863fb7ef26257260e64a479d5e31902a373f2e6d613"
162+
"e4c2640403eb13407cb27872896f5931d367e6e5695e27102fde00a56b28c4c0"
163+
"df38a2c34d4dd383a58a96a3607ed3071f832e24d8b711625da8a7a7eda213e5"
164+
"970ee5121834a57434114724725b3e34621157c33b717d307f789b414e1b8585"
165+
"0b9e4e422a6f70f0482a011210185e54e0b1b9e6ab987147c3cbe6a022e3d965"
166+
"152fa3238aa1ac67454c40d4af450c145d65e37211c49e8529348f41e43baaa3"
167+
"0b426086881d1e442794c8624f6275a39faf3402895d96801d315112e7ef9f34"
168+
"b018c135dfa70f62d32049a6052c3315bf706495b53386479c042dd304a80184"
169+
"aea07e7185acd811ab961e02beb9067633b3d8749b94d052437d2ed3f3f046e2"
170+
"683ea2c52b9e84d576fd1114a6a06254a7f741634f25b0b33e7d264053979af6"
171+
"ad9310b5aad0cac2a325c88739fc54a703343b073e216fb0e1e68ed59b107b06"
172+
"aeebbe75ff80869238323ae60a30154194dfd7e55a196a854d1955533a07b4e0"
173+
"3e9b52b7e6cadd8706dcde83fafc13b64a3b7762269fea336a58f9a48608c966"
174+
"41cf6e536cb91af55ada33011b8d594516e1405117ec35a17e19e1741843d7f3"
175+
"4d2810f4b270d3177f72ca51e5b44e822b966260375686505d359f92aac91cd2"
176+
"7c707764f9eff0e57f897c20615af84457a25c629a8f12a2a420f0335902e0f6"
177+
"393f27c1536bcb87c8cbb273530add32fbab7ea5cdb992676d3ea6c7e86f1df4"
178+
"ff4ceae6ed2892f52717a431e712e2c4df5201d41f43bb128632d8c48d1b4737"
179+
"0c50bf9332937be7a162fe7540cf2c846dc7de876d751f9428caf4d34e1c6530"
180+
"59b6eca646414905780d0e0031fa7e43b094eed4ae4131a33d94dca39f5324a1"
181+
"0d2e7412a8aecc01b9a6c6d334ad1f34f401f3440b92fb60f2821f81b8a192a5"
182+
"df4ac9c01ac51570fc474c91c320cbe66e663f21fff66a2427dc050655c74f36"
183+
"a4d5b423251aea456635e9c73bd49826fd553a6544439b46390ec1012ab748d0"
184+
"bcd82be138af0670eaeb3ca0cb484033e0070da124dacd61c5efb746f238ff63"
185+
"268bd7251cd624c2f021d0924fd7f18545211495612f49e42d8e0b249132bf13"
186+
"37b84ea0f8f9af378e79f3c2d1a28180ecf30e12d4aedfa4e95bdb629de28d34"
187+
"45b0cfb028a710a741d3fd67457056860e3e8c932d23ae828f939f32527690a1"
188+
"bb0e2ff2fd333aa4a80679f3261a4fc3f19afe040046aae4a23edb363eb0f1e6"
189+
"eeaafc936a5fc185ea6eb62741e2cf3460ba1ad32c070de428a519a49ff8eec2"
190+
"24abf9a489bdf1271a4460919143ac6549ce67b7a6edcb374b7563a00a111e84"
191+
"350f8754b8f1cf110b91ab16a6e485d4d47313357923bae4c559e700ad09b7b3"
192+
"baba4f40f95dfa82c57fb555cd2336165ad2a8866d9c7c429f4cf395cc1b5da6"
193+
"b6d752640f2c0947a11aa3a4d353d480d54bf5428277c6c18748a640cdb2b735"
194+
"46ab50c326db23e51092a7d3cd2c6a90517738d31bef36b2a4d36a75a575f374"
195+
"afdf32f5222a16e0372413e18a7ef3d39795c1d59dac8842314975b5c9f2fdc6"
196+
"10fe5bd011d8a833f75e7ef32d75b236559806b631fb03c676c71de78cac5b32"
197+
"f704e9a2421429765a1e4f062b681c90466001c0db689e334e9e06e69b37e335"
198+
"53658e61517b9372c9537092826d83907c7fb72106840de5a96fbf769d8bf8f6"
199+
"ca839432891a1802bf1b9e917ae674641e0959631aec0dd04c7404e4c3278480"
200+
"f361aec15af575240ce0951627b761209816040105d058364601b4458a8f82a5"
201+
"032a38c4fe043066b61bbd5301e0e366e83b319232e85283b47d8db3a272c7a7"
202+
"03384ec2cee851510b7eda437b66eef2192de155ac239866b43c4415a89141e7"
203+
"821a94d60a7f8806b48f5dd3694b782325079fa1ba68c1d340fc1c73450aa162"
204+
"6222f191a1a417a4c16b184410917a01d9d93a05ce926173cda9a8e2af8c2e11"
205+
"ad7031e5084341b3f2e43c01a7601347a5d80167dfa184b4e20d5db146e00ae0"
206+
"f22c4e53808f78b5aa1411b0e396d993766536b097d737a321fb3ad3c035ed62"
207+
"013ec673f2c4e0c7c6994407e16de9b445c818a57595bd64784219703db57616"
208+
"4d2ad116cca3f2734a0ddf51bf68cce7cfd4c0745c3e2147b7d684d28374a0a3"
209+
"bc2b0e723c06e263a28711b5f1ad36251abcb774b6223f47190e4b3203891ec1"
210+
"fb57c7d2b67d22e1ff72c6a2b377fe5115ff9eb1a61f88521c1b74575d3dda30"
211+
"8f304373a274d57641dcb9c3c325ae9578a1d3b582357a719dc7c74235a89d07"
212+
"ce82eea1e43bf7d269847657e71bc072b01bf36692d610608996ddb21fa0b0f7"
213+
"49cc52f31318e741cbafc520d79385a049404646d7a53bf411783214ec62da95"
214+
"3094187310e742b7a87cf0e04c50c34304d920767cff314436747d663fee0516"
215+
"b65d6b6460e682965d2ab34096f5ce50fab2ab1518220973873eac403a570496"
216+
"3d6758f07e11382273b53690d7e632e72cb4a457852bbab55dc5d035d7e8a9f3"
217+
"4649e10493d4d2d60efd3484b09acba40dc72b23c4c59ca759b6b3a29cb250a5"
218+
"754c28a79f4c413303ee0ad10aa03086dd4cd5e3d13cccf3d41517c7cdaeacc6"
219+
"b88038b3714839f104051c3238189612ecd94b0230f4f6758b1f41b02d191f80"
220+
"bd93db84789c92d2f73252f4e5b068a3b2bc8c65d4eb94b442784773540f40f4"
221+
"67d033235c526166bff17941c93e95e2afc2b37005035ea03d9456f4d952e052"
222+
"c3504a805009842524cb5cd035c2b2f12b1e24764de13f70db3f97b4e71f4de3"
223+
"5b86fcf04e997c657baf32b4b4478521b61a8d200bb02f0792556af0f5516b11"
224+
"ef8eb4d744413e07efed491758a8cb359d54934538d0acb4096f3795e4cecd11"
225+
"b849be92710df224282e2832c5494dc1e7bdc5476376557376c493020e0c6b30"
226+
"000fe7f0733a99e126036cd3672efda1ae05773288e04dd48c6e4164e5d64936"
227+
"009960e134cb38b0c4033406d7580ea0bb38d3443b644b416743a7c69648ede6"
228+
"06f93042d9601d568da767d20f4d9ca5363f19f1e3ddb1c3cfbeb5f3ba8bdad5"
229+
"85e725d54510ea85038e2322c33dfc6674d5f4d06f980086ccf719023f56c2d7"
230+
"18e649c014a16283d4cc45d0b0ec59b7a38397c76ebed2559a9d98b6504f70c5"
231+
"385b94a1e48b1a311b8842d66cc4cc850cf87c02f07d981414db0f204777fe37"
232+
"0705b2872ec83e935ec403c71e708570733277e4ee2e6366ee41d6d749577590"
233+
"09f24dd5775123a0a8829ab36d193897e6dbda05dfe76966bfd28c52a69ab8f1"
234+
"340785d3cc971d116e34184797e15746bf4b8bc0b0ed5240f12c820004d3c254"
235+
"91c514a6c5fbbbb2ca390020a60708e1fc31ef369de3f083e3f6b9968fffb064"
236+
"3f536e1330f371e481d44ef32c43ee73b13f908771c328c5ce71bd32859e0805"
237+
"1d5727657156dda123b20e0270b443d359183a675eaf5f065468b3a60be2a137"
238+
"8f3b3cb58175efc05934aa65322cffb30f2291f125239d8742e4f781b4638f65"
239+
"c4eac24706be8bb6e542b1b0d70db5563280ebe77b3e1146503e22b28a8056a4"
240+
"c5e0100073e6c9223237e0d16eb5175154b9557746cc3bd006639a9666519cd4"
241+
"19bab55344b1907194556b2453e195e3d8ce0a038f4cdba5ddd8c44567a5dca4"
242+
"69dcc0e4baaf3f3231d5912014991f328cb2b872be9ed197ea032c76c25c7e10"
243+
"43238376b03c1d23151a82a29a8b71e5c2d715c0adfa300396720fe7ceef8254"
244+
"e3f5a535b50331d31bc550f130958ad1ba1d0823ea357d72624692c027536e00"
245+
"59a642c06bc47ca7c34d3776cf577ba42bff18e7ac5bb7a0898fa573da5e9e53"
246+
"79c3d5c3f2b49f71afb0e79517b718c3ff87c5475a33e086c7e3ee05d6138977"
247+
"0a21b5f3e768d8404c565150456b2a808bef5c56878bf757824814e7066b3037"
248+
"5421e22359ce7cf23a688c2499081805f821a0561215ab62e5b38f51d3b4cd41"
249+
"956efa112d03db865afd8f510cd155e01ee54746d4f0ee0325854cb524f17826"
250+
"89948a071403f7a44f6d0493a27f3751a426a714335452b2cc131f54254a5673"
251+
"b772f9f7d5e2dc418"
252+
)
253+
254+
ZEAM_EPOCH = 10
255+
ZEAM_MESSAGE = Bytes32(b"\x01" + b"\x00" * 31)
147256

148257

149258
@pytest.fixture()
150259
def ream_public_key() -> PublicKey:
151260
"""Decode the ream-generated public key from raw SSZ bytes."""
152-
return PublicKey.decode_bytes(bytes.fromhex(PUBLIC_KEY_HEX))
261+
return PublicKey.decode_bytes(bytes.fromhex(REAM_PUBLIC_KEY_HEX))
153262

154263

155264
@pytest.fixture()
156265
def ream_signature() -> ProdSignature:
157266
"""Decode the ream-generated signature from raw SSZ bytes."""
158-
return ProdSignature.decode_bytes(bytes.fromhex(SIGNATURE_HEX))
267+
return ProdSignature.decode_bytes(bytes.fromhex(REAM_SIGNATURE_HEX))
268+
269+
270+
@pytest.fixture()
271+
def zeam_public_key() -> PublicKey:
272+
"""Decode the zeam-generated public key from raw SSZ bytes."""
273+
return PublicKey.decode_bytes(bytes.fromhex(ZEAM_PUBLIC_KEY_HEX))
274+
275+
276+
@pytest.fixture()
277+
def zeam_signature() -> ProdSignature:
278+
"""Decode the zeam-generated signature from raw SSZ bytes."""
279+
return ProdSignature.decode_bytes(bytes.fromhex(ZEAM_SIGNATURE_HEX))
159280

160281

161-
class TestCrossClientCompat:
282+
class TestReamCrossClientCompat:
162283
"""Verify ream-produced XMSS artifacts decode and verify in leanSpec."""
163284

164-
def test_decode_ream_public_key(self, ream_public_key: PublicKey) -> None:
285+
def test_decode_public_key(self, ream_public_key: PublicKey) -> None:
165286
"""SSZ decode + re-encode roundtrip for the public key."""
166-
raw = bytes.fromhex(PUBLIC_KEY_HEX)
287+
raw = bytes.fromhex(REAM_PUBLIC_KEY_HEX)
167288
assert len(raw) == PROD_CONFIG.PUBLIC_KEY_LEN_BYTES
168289
assert ream_public_key.encode_bytes() == raw
169290

170-
def test_decode_ream_signature(self, ream_signature: ProdSignature) -> None:
291+
def test_decode_signature(self, ream_signature: ProdSignature) -> None:
171292
"""SSZ decode + re-encode roundtrip for the signature."""
172-
raw = bytes.fromhex(SIGNATURE_HEX)
293+
raw = bytes.fromhex(REAM_SIGNATURE_HEX)
173294
assert len(raw) == PROD_CONFIG.SIGNATURE_LEN_BYTES
174295
assert ream_signature.encode_bytes() == raw
175296

176-
def test_verify_ream_signature(
297+
def test_verify_signature(
177298
self, ream_public_key: PublicKey, ream_signature: ProdSignature
178299
) -> None:
179300
"""Full XMSS verification of a ream-produced signature."""
180301
assert PROD_SIGNATURE_SCHEME.verify(
181302
ream_public_key,
182-
Slot(EPOCH),
183-
MESSAGE,
303+
Slot(REAM_EPOCH),
304+
REAM_MESSAGE,
184305
ream_signature, # type: ignore[arg-type]
185306
)
186307

187-
def test_ream_signature_rejects_wrong_message(
308+
def test_rejects_wrong_message(
188309
self, ream_public_key: PublicKey, ream_signature: ProdSignature
189310
) -> None:
190311
"""Signature must not verify against a different message."""
191312
wrong_message = Bytes32(b"\xff" * 32)
192313
assert not PROD_SIGNATURE_SCHEME.verify(
193314
ream_public_key,
194-
Slot(EPOCH),
315+
Slot(REAM_EPOCH),
195316
wrong_message,
196317
ream_signature, # type: ignore[arg-type]
197318
)
198319

199-
def test_ream_signature_rejects_wrong_slot(
320+
def test_rejects_wrong_slot(
200321
self, ream_public_key: PublicKey, ream_signature: ProdSignature
201322
) -> None:
202323
"""Signature must not verify for a different slot."""
203-
wrong_slot = Slot(EPOCH + 1)
324+
wrong_slot = Slot(REAM_EPOCH + 1)
204325
assert not PROD_SIGNATURE_SCHEME.verify(
205326
ream_public_key,
206327
wrong_slot,
207-
MESSAGE,
328+
REAM_MESSAGE,
208329
ream_signature, # type: ignore[arg-type]
209330
)
331+
332+
333+
class TestZeamCrossClientCompat:
334+
"""Verify zeam-produced XMSS artifacts decode and verify in leanSpec."""
335+
336+
def test_decode_public_key(self, zeam_public_key: PublicKey) -> None:
337+
"""SSZ decode + re-encode roundtrip for the public key."""
338+
raw = bytes.fromhex(ZEAM_PUBLIC_KEY_HEX)
339+
assert len(raw) == PROD_CONFIG.PUBLIC_KEY_LEN_BYTES
340+
assert zeam_public_key.encode_bytes() == raw
341+
342+
def test_decode_signature(self, zeam_signature: ProdSignature) -> None:
343+
"""SSZ decode + re-encode roundtrip for the signature."""
344+
raw = bytes.fromhex(ZEAM_SIGNATURE_HEX)
345+
assert len(raw) == PROD_CONFIG.SIGNATURE_LEN_BYTES
346+
assert zeam_signature.encode_bytes() == raw
347+
348+
def test_verify_signature(
349+
self, zeam_public_key: PublicKey, zeam_signature: ProdSignature
350+
) -> None:
351+
"""Full XMSS verification of a zeam-produced signature."""
352+
assert PROD_SIGNATURE_SCHEME.verify(
353+
zeam_public_key,
354+
Slot(ZEAM_EPOCH),
355+
ZEAM_MESSAGE,
356+
zeam_signature, # type: ignore[arg-type]
357+
)
358+
359+
def test_rejects_wrong_message(
360+
self, zeam_public_key: PublicKey, zeam_signature: ProdSignature
361+
) -> None:
362+
"""Signature must not verify against a different message."""
363+
wrong_message = Bytes32(b"\xff" * 32)
364+
assert not PROD_SIGNATURE_SCHEME.verify(
365+
zeam_public_key,
366+
Slot(ZEAM_EPOCH),
367+
wrong_message,
368+
zeam_signature, # type: ignore[arg-type]
369+
)
370+
371+
def test_rejects_wrong_slot(
372+
self, zeam_public_key: PublicKey, zeam_signature: ProdSignature
373+
) -> None:
374+
"""Signature must not verify for a different slot."""
375+
wrong_slot = Slot(ZEAM_EPOCH + 1)
376+
assert not PROD_SIGNATURE_SCHEME.verify(
377+
zeam_public_key,
378+
wrong_slot,
379+
ZEAM_MESSAGE,
380+
zeam_signature, # type: ignore[arg-type]
381+
)

0 commit comments

Comments
 (0)