1 | <?php |
||
20 | class ExtendedKeySerializer |
||
21 | { |
||
22 | /** |
||
23 | * @var EcAdapterInterface |
||
24 | */ |
||
25 | private $ecAdapter; |
||
26 | |||
27 | /** |
||
28 | * @var RawExtendedKeySerializer |
||
29 | */ |
||
30 | private $rawSerializer; |
||
31 | |||
32 | /** |
||
33 | * @var P2pkhScriptDataFactory |
||
34 | */ |
||
35 | private $defaultScriptFactory; |
||
36 | |||
37 | /** |
||
38 | * @var GlobalPrefixConfig |
||
39 | */ |
||
40 | private $prefixConfig; |
||
41 | |||
42 | /** |
||
43 | * @var PrivateKeySerializerInterface |
||
44 | */ |
||
45 | private $privateKeySerializer; |
||
46 | |||
47 | /** |
||
48 | * @var PublicKeySerializerInterface |
||
49 | */ |
||
50 | private $publicKeySerializer; |
||
51 | |||
52 | /** |
||
53 | * @param EcAdapterInterface $ecAdapter |
||
54 | * @param GlobalPrefixConfig|null $config |
||
55 | */ |
||
56 | 79 | public function __construct(EcAdapterInterface $ecAdapter, GlobalPrefixConfig $config = null) |
|
66 | |||
67 | /** |
||
68 | * @param NetworkInterface $network |
||
69 | * @param HierarchicalKey $key |
||
70 | * @return BufferInterface |
||
71 | */ |
||
72 | 28 | public function serialize(NetworkInterface $network, HierarchicalKey $key): BufferInterface |
|
108 | |||
109 | /** |
||
110 | * @param NetworkInterface $network |
||
111 | * @param Parser $parser |
||
112 | * @return HierarchicalKey |
||
113 | * @throws ParserOutOfRange |
||
114 | */ |
||
115 | 42 | public function fromParser(NetworkInterface $network, Parser $parser): HierarchicalKey |
|
116 | { |
||
117 | 42 | $params = $this->rawSerializer->fromParser($parser); |
|
118 | |||
119 | 39 | if (null === $this->prefixConfig) { |
|
120 | 37 | if (!($params->getPrefix() === $network->getHDPubByte() || $params->getPrefix() === $network->getHDPrivByte())) { |
|
121 | 1 | throw new \InvalidArgumentException('HD key magic bytes do not match network magic bytes'); |
|
122 | } |
||
123 | 36 | $privatePrefix = $network->getHDPrivByte(); |
|
124 | 36 | $scriptFactory = $this->defaultScriptFactory; |
|
125 | } else { |
||
126 | 2 | $scriptConfig = $this->prefixConfig |
|
127 | 2 | ->getNetworkConfig($network) |
|
128 | 2 | ->getConfigForPrefix($params->getPrefix()) |
|
129 | ; |
||
130 | 2 | $privatePrefix = $scriptConfig->getPrivatePrefix(); |
|
131 | 2 | $scriptFactory = $scriptConfig->getScriptDataFactory(); |
|
132 | } |
||
133 | |||
134 | 38 | if ($params->getPrefix() === $privatePrefix) { |
|
135 | 16 | $key = $this->privateKeySerializer->parse($params->getKeyData()->slice(1), true); |
|
136 | } else { |
||
137 | 26 | $key = $this->publicKeySerializer->parse($params->getKeyData()); |
|
138 | } |
||
139 | |||
140 | 38 | return new HierarchicalKey( |
|
141 | 38 | $this->ecAdapter, |
|
142 | 38 | $scriptFactory, |
|
143 | 38 | $params->getDepth(), |
|
144 | 38 | $params->getParentFingerprint(), |
|
145 | 38 | $params->getSequence(), |
|
146 | 38 | $params->getChainCode(), |
|
147 | 38 | $key |
|
148 | ); |
||
149 | } |
||
150 | |||
151 | /** |
||
152 | * @param NetworkInterface $network |
||
153 | * @param BufferInterface $buffer |
||
154 | * @return HierarchicalKey |
||
155 | * @throws ParserOutOfRange |
||
156 | */ |
||
157 | 42 | public function parse(NetworkInterface $network, BufferInterface $buffer): HierarchicalKey |
|
161 | } |
||
162 |