@@ -17,24 +17,18 @@ mod tests;
17
17
pub struct PeerHandshake {
18
18
state : Option < HandshakeState > ,
19
19
private_key : SecretKey ,
20
+ ephemeral_private_key : SecretKey ,
20
21
21
- preset_ephemeral_private_key : Option < SecretKey > ,
22
22
read_buffer : Vec < u8 > ,
23
23
}
24
24
25
25
impl PeerHandshake {
26
- pub fn new ( private_key : & SecretKey , ephemeral_private_key : Option < & SecretKey > ) -> Self {
27
- let preset_ephemeral_private_key = if let Some ( key) = ephemeral_private_key {
28
- // deref and clone
29
- Some ( ( * key) . clone ( ) )
30
- } else {
31
- None
32
- } ;
26
+ pub fn new ( private_key : & SecretKey , ephemeral_private_key : & SecretKey ) -> Self {
33
27
34
28
let handshake = PeerHandshake {
35
29
state : Some ( HandshakeState :: Blank ) ,
36
30
private_key : ( * private_key) . clone ( ) ,
37
- preset_ephemeral_private_key ,
31
+ ephemeral_private_key : ( * ephemeral_private_key ) . clone ( ) ,
38
32
read_buffer : Vec :: new ( ) ,
39
33
} ;
40
34
handshake
@@ -80,9 +74,7 @@ impl PeerHandshake {
80
74
match & self . state {
81
75
Some ( HandshakeState :: Blank ) => {
82
76
let remote_public_key = remote_public_key. ok_or ( "Call make_initiator() first" ) ?;
83
- let ephemeral_private_key = self . obtain_ephemeral_private_key ( ) ;
84
-
85
- let act_one = self . initiate ( & ephemeral_private_key, & remote_public_key) ?;
77
+ let act_one = self . initiate ( & remote_public_key) ?;
86
78
response = act_one. 0 . to_vec ( ) ;
87
79
}
88
80
Some ( HandshakeState :: AwaitingActOne ( _) ) => {
@@ -95,9 +87,7 @@ impl PeerHandshake {
95
87
act_one_buffer. copy_from_slice ( & self . read_buffer [ ..act_length] ) ;
96
88
self . read_buffer . drain ( ..act_length) ;
97
89
98
- let ephemeral_private_key = self . obtain_ephemeral_private_key ( ) ;
99
-
100
- let act_two = self . process_act_one ( ActOne ( act_one_buffer) , & ephemeral_private_key) ?;
90
+ let act_two = self . process_act_one ( ActOne ( act_one_buffer) ) ?;
101
91
response = act_two. 0 . to_vec ( ) ;
102
92
}
103
93
Some ( HandshakeState :: AwaitingActTwo ( _) ) => {
@@ -147,7 +137,7 @@ impl PeerHandshake {
147
137
Ok ( ( response, connected_peer, remote_pubkey) )
148
138
}
149
139
150
- pub fn initiate ( & mut self , ephemeral_private_key : & SecretKey , remote_public_key : & PublicKey ) -> Result < ActOne , String > {
140
+ pub fn initiate ( & mut self , remote_public_key : & PublicKey ) -> Result < ActOne , String > {
151
141
if let Some ( HandshakeState :: Blank ) = & self . state { } else {
152
142
return Err ( "incorrect state" . to_string ( ) ) ;
153
143
}
@@ -156,7 +146,7 @@ impl PeerHandshake {
156
146
157
147
// serialize act one
158
148
let ( act_one, chaining_key, temporary_key) = self . calculate_act_message (
159
- ephemeral_private_key,
149
+ & self . ephemeral_private_key ,
160
150
remote_public_key,
161
151
chaining_key,
162
152
& mut hash,
@@ -166,13 +156,13 @@ impl PeerHandshake {
166
156
hash,
167
157
chaining_key,
168
158
temporary_key,
169
- ephemeral_private_key : ( * ephemeral_private_key) . clone ( ) ,
159
+ ephemeral_private_key : ( * & self . ephemeral_private_key ) . clone ( ) ,
170
160
} ) ) ;
171
161
172
162
Ok ( ActOne ( act_one) )
173
163
}
174
164
175
- pub ( crate ) fn process_act_one ( & mut self , act : ActOne , ephemeral_private_key : & SecretKey ) -> Result < ActTwo , String > {
165
+ pub ( crate ) fn process_act_one ( & mut self , act : ActOne ) -> Result < ActTwo , String > {
176
166
let state = self . state . take ( ) ;
177
167
let act_one_expectation = match state {
178
168
Some ( HandshakeState :: AwaitingActOne ( act_state) ) => act_state,
@@ -200,8 +190,10 @@ impl PeerHandshake {
200
190
& mut hash,
201
191
) ?;
202
192
193
+ let ephemeral_private_key = ( * & self . ephemeral_private_key ) . clone ( ) ;
194
+
203
195
let ( act_two, chaining_key, temporary_key) = self . calculate_act_message (
204
- ephemeral_private_key,
196
+ & ephemeral_private_key,
205
197
& remote_ephemeral_public_key,
206
198
chaining_key,
207
199
& mut hash,
@@ -211,7 +203,7 @@ impl PeerHandshake {
211
203
hash,
212
204
chaining_key,
213
205
temporary_key,
214
- ephemeral_private_key : ( * ephemeral_private_key ) . clone ( ) ,
206
+ ephemeral_private_key,
215
207
remote_ephemeral_public_key,
216
208
} ) ) ;
217
209
@@ -315,18 +307,6 @@ impl PeerHandshake {
315
307
Ok ( ( remote_pubkey, connected_peer) )
316
308
}
317
309
318
- fn obtain_ephemeral_private_key ( & mut self ) -> SecretKey {
319
- if let Some ( key) = self . preset_ephemeral_private_key . take ( ) {
320
- key
321
- } else {
322
- // generate a random ephemeral private key right here
323
- let mut rng = thread_rng ( ) ;
324
- let mut ephemeral_bytes = [ 0 ; 32 ] ;
325
- rng. fill_bytes ( & mut ephemeral_bytes) ;
326
- SecretKey :: from_slice ( & ephemeral_bytes) . expect ( "You broke elliptic curve cryptography" )
327
- }
328
- }
329
-
330
310
fn calculate_act_message ( & self , local_private_key : & SecretKey , remote_public_key : & PublicKey , chaining_key : [ u8 ; 32 ] , hash : & mut HandshakeHash ) -> ( [ u8 ; 50 ] , [ u8 ; 32 ] , [ u8 ; 32 ] ) {
331
311
let local_public_key = Self :: private_key_to_public_key ( local_private_key) ;
332
312
0 commit comments