@@ -17,9 +17,11 @@ use strict_encoding::net::{
17
17
AddrFormat , DecodeError , RawAddr , Transport , Uniform , UniformAddr ,
18
18
} ;
19
19
#[ cfg( feature = "tor" ) ]
20
- use torut:: onion:: { TorPublicKeyV3 , TORV3_PUBLIC_KEY_LENGTH } ;
20
+ use torut:: onion:: { OnionAddressV3 , TorPublicKeyV3 , TORV3_PUBLIC_KEY_LENGTH } ;
21
21
22
22
use crate :: inet:: PartialSocketAddr ;
23
+ #[ cfg( feature = "tor" ) ]
24
+ use crate :: inet:: TorAddrV3 ;
23
25
use crate :: { InetAddr , InetSocketAddr , InetSocketAddrExt } ;
24
26
25
27
impl strict_encoding:: Strategy for InetAddr {
@@ -58,17 +60,21 @@ impl Uniform for InetAddr {
58
60
InetAddr :: Tor ( tor) => {
59
61
use strict_encoding:: net:: ADDR_LEN ;
60
62
let mut buf = [ 0u8 ; ADDR_LEN ] ;
61
- buf[ 1 ..] . copy_from_slice ( & tor. to_bytes ( ) ) ;
63
+ buf[ 1 ..] . copy_from_slice ( & tor. get_public_key ( ) . to_bytes ( ) ) ;
62
64
buf
63
65
}
64
66
}
65
67
}
66
68
67
69
#[ inline]
68
- fn port ( & self ) -> Option < u16 > { None }
70
+ fn port ( & self ) -> Option < u16 > {
71
+ None
72
+ }
69
73
70
74
#[ inline]
71
- fn transport ( & self ) -> Option < Transport > { None }
75
+ fn transport ( & self ) -> Option < Transport > {
76
+ None
77
+ }
72
78
73
79
#[ inline]
74
80
fn from_uniform_addr ( addr : UniformAddr ) -> Result < Self , DecodeError >
@@ -101,13 +107,21 @@ impl Uniform for InetAddr {
101
107
}
102
108
103
109
impl Uniform for PartialSocketAddr {
104
- fn addr_format ( & self ) -> AddrFormat { self . address ( ) . addr_format ( ) }
110
+ fn addr_format ( & self ) -> AddrFormat {
111
+ self . address ( ) . addr_format ( )
112
+ }
105
113
106
- fn addr ( & self ) -> RawAddr { self . address ( ) . addr ( ) }
114
+ fn addr ( & self ) -> RawAddr {
115
+ self . address ( ) . addr ( )
116
+ }
107
117
108
- fn port ( & self ) -> Option < u16 > { PartialSocketAddr :: port ( * self ) }
118
+ fn port ( & self ) -> Option < u16 > {
119
+ PartialSocketAddr :: port ( * self )
120
+ }
109
121
110
- fn transport ( & self ) -> Option < Transport > { None }
122
+ fn transport ( & self ) -> Option < Transport > {
123
+ None
124
+ }
111
125
112
126
fn from_uniform_addr ( addr : UniformAddr ) -> Result < Self , DecodeError >
113
127
where
@@ -134,10 +148,14 @@ impl Uniform for PartialSocketAddr {
134
148
135
149
impl Uniform for InetSocketAddr {
136
150
#[ inline]
137
- fn addr_format ( & self ) -> AddrFormat { self . address ( ) . addr_format ( ) }
151
+ fn addr_format ( & self ) -> AddrFormat {
152
+ self . address ( ) . addr_format ( )
153
+ }
138
154
139
155
#[ inline]
140
- fn addr ( & self ) -> RawAddr { self . address ( ) . addr ( ) }
156
+ fn addr ( & self ) -> RawAddr {
157
+ self . address ( ) . addr ( )
158
+ }
141
159
142
160
#[ inline]
143
161
fn port ( & self ) -> Option < u16 > {
@@ -150,7 +168,9 @@ impl Uniform for InetSocketAddr {
150
168
}
151
169
152
170
#[ inline]
153
- fn transport ( & self ) -> Option < Transport > { None }
171
+ fn transport ( & self ) -> Option < Transport > {
172
+ None
173
+ }
154
174
155
175
#[ inline]
156
176
fn from_uniform_addr ( addr : UniformAddr ) -> Result < Self , DecodeError >
@@ -177,7 +197,14 @@ impl Uniform for InetSocketAddr {
177
197
) ,
178
198
#[ cfg( feature = "tor" ) ]
179
199
AddrFormat :: OnionV3 => {
180
- InetSocketAddr :: Tor ( tor_from_raw_addr ( addr. addr ) ?)
200
+ if let Some ( port) = addr. port {
201
+ InetSocketAddr :: Tor ( TorAddrV3 :: new (
202
+ tor_from_raw_addr ( addr. addr ) ?,
203
+ port,
204
+ ) )
205
+ } else {
206
+ return Err ( DecodeError :: InsufficientData ) ;
207
+ }
181
208
}
182
209
_ => return Err ( DecodeError :: UnsupportedAddrFormat ) ,
183
210
} )
@@ -186,13 +213,19 @@ impl Uniform for InetSocketAddr {
186
213
187
214
impl Uniform for InetSocketAddrExt {
188
215
#[ inline]
189
- fn addr_format ( & self ) -> AddrFormat { self . 1 . addr_format ( ) }
216
+ fn addr_format ( & self ) -> AddrFormat {
217
+ self . 1 . addr_format ( )
218
+ }
190
219
191
220
#[ inline]
192
- fn addr ( & self ) -> RawAddr { self . 1 . addr ( ) }
221
+ fn addr ( & self ) -> RawAddr {
222
+ self . 1 . addr ( )
223
+ }
193
224
194
225
#[ inline]
195
- fn port ( & self ) -> Option < u16 > { self . 1 . port ( ) }
226
+ fn port ( & self ) -> Option < u16 > {
227
+ self . 1 . port ( )
228
+ }
196
229
197
230
#[ inline]
198
231
fn transport ( & self ) -> Option < Transport > {
@@ -234,8 +267,10 @@ impl Uniform for InetSocketAddrExt {
234
267
}
235
268
236
269
#[ cfg( feature = "tor" ) ]
237
- fn tor_from_raw_addr ( raw : RawAddr ) -> Result < TorPublicKeyV3 , DecodeError > {
270
+ fn tor_from_raw_addr ( raw : RawAddr ) -> Result < OnionAddressV3 , DecodeError > {
238
271
let mut a = [ 0u8 ; TORV3_PUBLIC_KEY_LENGTH ] ;
239
272
a. copy_from_slice ( & raw [ 1 ..] ) ;
240
- TorPublicKeyV3 :: from_bytes ( & a) . map_err ( |_| DecodeError :: InvalidPubkey )
273
+ TorPublicKeyV3 :: from_bytes ( & a)
274
+ . map_err ( |_| DecodeError :: InvalidPubkey )
275
+ . map ( |key| key. get_onion_address ( ) )
241
276
}
0 commit comments