gabriel / muse public

test_agent_seed_zeroing.py file-level

at sha256:e · View file ↗ · Intel ↗

History
1 files
1 commits
0 hotspots
0 🧊 dead
0 💥 blast risk
sha256:9 docs: revert migrate hub-scoping/domain-integers rows from agent-guide.… · gabriel · Sep 18, 2026
1 """Tests for DerivedKey zeroing in muse/cli/commands/agent.py.
2
3 _sub_seed_to_public derives an Ed25519 key from a sub-seed via derive_identity_key(),
4 then calls dk.zero() to overwrite the private scalar and chain code before returning.
5 DerivedKey fields are bytearray, so dk.zero() genuinely overwrites the live buffer.
6
7 Coverage
8 --------
9 I _sub_seed_to_public zeroes DerivedKey
10 I1 DerivedKey.private_bytes is zeroed after _sub_seed_to_public returns
11 I2 DerivedKey.chain_code is zeroed after _sub_seed_to_public returns
12 """
13
14 from __future__ import annotations
15
16 from unittest.mock import patch
17
18 from muse.core import hdkeys as _hdkeys
19 from muse.core.bip39 import mnemonic_to_seed
20 from muse.core.hdkeys import derive_agent_sub_seed, hub_index, DOMAIN_IDENTITY
21 from muse.core.slip010 import DerivedKey
22
23 _MNEMONIC = (
24 "abandon abandon abandon abandon abandon abandon abandon abandon "
25 "abandon abandon abandon about"
26 )
27 _SEED = mnemonic_to_seed(_MNEMONIC)
28 _SUB_SEED = derive_agent_sub_seed(_SEED, domain=DOMAIN_IDENTITY, agent_id=0)
29 _HUB = hub_index("localhost:1337")
30
31
32 class TestSubSeedToPublicZeroesDerivedKey:
33 def test_I1_private_bytes_zeroed(self) -> None:
34 """I1: DerivedKey.private_bytes is zeroed after _sub_seed_to_public returns."""
35 from muse.cli.commands.agent import _sub_seed_to_public
36
37 captured: list[DerivedKey] = []
38 original_derive = _hdkeys.derive_identity_key
39
40 def capturing_derive(*args: int | bytes, **kwargs: int) -> DerivedKey:
41 dk = original_derive(*args, **kwargs)
42 captured.append(dk)
43 return dk
44
45 with patch.object(_hdkeys, "derive_identity_key", side_effect=capturing_derive):
46 _sub_seed_to_public(bytes(_SUB_SEED), _HUB)
47
48 assert captured, "derive_identity_key was not called"
49 dk = captured[0]
50 assert dk.private_bytes == bytearray(32), (
51 "DerivedKey.private_bytes must be zeroed after _sub_seed_to_public"
52 )
53
54 def test_I2_chain_code_zeroed(self) -> None:
55 """I2: DerivedKey.chain_code is zeroed after _sub_seed_to_public returns."""
56 from muse.cli.commands.agent import _sub_seed_to_public
57
58 captured: list[DerivedKey] = []
59 original_derive = _hdkeys.derive_identity_key
60
61 def capturing_derive(*args: int | bytes, **kwargs: int) -> DerivedKey:
62 dk = original_derive(*args, **kwargs)
63 captured.append(dk)
64 return dk
65
66 with patch.object(_hdkeys, "derive_identity_key", side_effect=capturing_derive):
67 _sub_seed_to_public(bytes(_SUB_SEED), _HUB)
68
69 assert captured, "derive_identity_key was not called"
70 dk = captured[0]
71 assert dk.chain_code == bytearray(32), (
72 "DerivedKey.chain_code must be zeroed after _sub_seed_to_public"
73 )