15
15
// along with Parity. If not, see <http://www.gnu.org/licenses/>.
16
16
17
17
use std:: collections:: BTreeSet ;
18
- use std:: thread;
19
18
use std:: sync:: Arc ;
20
- use std:: sync:: mpsc;
21
- use futures:: { self , Future } ;
22
19
use parking_lot:: Mutex ;
23
- use tokio:: runtime;
24
20
use crypto:: DEFAULT_MAC ;
25
21
use ethkey:: crypto;
22
+ use parity_runtime:: Executor ;
26
23
use super :: acl_storage:: AclStorage ;
27
24
use super :: key_storage:: KeyStorage ;
28
25
use super :: key_server_set:: KeyServerSet ;
@@ -39,16 +36,16 @@ pub struct KeyServerImpl {
39
36
40
37
/// Secret store key server data.
41
38
pub struct KeyServerCore {
42
- close : Option < futures:: Complete < ( ) > > ,
43
- handle : Option < thread:: JoinHandle < ( ) > > ,
44
39
cluster : Arc < ClusterClient > ,
45
40
}
46
41
47
42
impl KeyServerImpl {
48
43
/// Create new key server instance
49
- pub fn new ( config : & ClusterConfiguration , key_server_set : Arc < KeyServerSet > , self_key_pair : Arc < NodeKeyPair > , acl_storage : Arc < AclStorage > , key_storage : Arc < KeyStorage > ) -> Result < Self , Error > {
44
+ pub fn new ( config : & ClusterConfiguration , key_server_set : Arc < KeyServerSet > , self_key_pair : Arc < NodeKeyPair > ,
45
+ acl_storage : Arc < AclStorage > , key_storage : Arc < KeyStorage > , executor : Executor ) -> Result < Self , Error >
46
+ {
50
47
Ok ( KeyServerImpl {
51
- data : Arc :: new ( Mutex :: new ( KeyServerCore :: new ( config, key_server_set, self_key_pair, acl_storage, key_storage) ?) ) ,
48
+ data : Arc :: new ( Mutex :: new ( KeyServerCore :: new ( config, key_server_set, self_key_pair, acl_storage, key_storage, executor ) ?) ) ,
52
49
} )
53
50
}
54
51
@@ -175,9 +172,10 @@ impl MessageSigner for KeyServerImpl {
175
172
}
176
173
177
174
impl KeyServerCore {
178
- pub fn new ( config : & ClusterConfiguration , key_server_set : Arc < KeyServerSet > , self_key_pair : Arc < NodeKeyPair > , acl_storage : Arc < AclStorage > , key_storage : Arc < KeyStorage > ) -> Result < Self , Error > {
175
+ pub fn new ( config : & ClusterConfiguration , key_server_set : Arc < KeyServerSet > , self_key_pair : Arc < NodeKeyPair > ,
176
+ acl_storage : Arc < AclStorage > , key_storage : Arc < KeyStorage > , executor : Executor ) -> Result < Self , Error >
177
+ {
179
178
let config = NetClusterConfiguration {
180
- threads : config. threads ,
181
179
self_key_pair : self_key_pair. clone ( ) ,
182
180
listen_address : ( config. listener_address . address . clone ( ) , config. listener_address . port ) ,
183
181
key_server_set : key_server_set,
@@ -188,45 +186,16 @@ impl KeyServerCore {
188
186
auto_migrate_enabled : config. auto_migrate_enabled ,
189
187
} ;
190
188
191
- let ( stop, stopped) = futures:: oneshot ( ) ;
192
- let ( tx, rx) = mpsc:: channel ( ) ;
193
- let handle = thread:: Builder :: new ( ) . name ( "KeyServerLoop" . into ( ) ) . spawn ( move || {
194
- let runtime_res = runtime:: Builder :: new ( )
195
- . core_threads ( config. threads )
196
- . build ( ) ;
197
-
198
- let mut el = match runtime_res {
199
- Ok ( el) => el,
200
- Err ( e) => {
201
- tx. send ( Err ( Error :: Internal ( format ! ( "error initializing event loop: {}" , e) ) ) ) . expect ( "Rx is blocking upper thread." ) ;
202
- return ;
203
- } ,
204
- } ;
205
-
206
- let cluster = ClusterCore :: new ( el. executor ( ) , config) ;
207
- let cluster_client = cluster. and_then ( |c| c. run ( ) . map ( |_| c. client ( ) ) ) ;
208
- tx. send ( cluster_client. map_err ( Into :: into) ) . expect ( "Rx is blocking upper thread." ) ;
209
- let _ = el. block_on ( futures:: empty ( ) . select ( stopped) ) ;
210
-
211
- trace ! ( target: "secretstore_net" , "{}: KeyServerLoop thread stopped" , self_key_pair. public( ) ) ;
212
- } ) . map_err ( |e| Error :: Internal ( format ! ( "{}" , e) ) ) ?;
213
- let cluster = rx. recv ( ) . map_err ( |e| Error :: Internal ( format ! ( "error initializing event loop: {}" , e) ) ) ??;
189
+ let cluster = ClusterCore :: new ( executor, config)
190
+ . and_then ( |c| c. run ( ) . map ( |_| c. client ( ) ) )
191
+ . map_err ( |err| Error :: from ( err) ) ?;
214
192
215
193
Ok ( KeyServerCore {
216
- close : Some ( stop) ,
217
- handle : Some ( handle) ,
218
- cluster : cluster,
194
+ cluster,
219
195
} )
220
196
}
221
197
}
222
198
223
- impl Drop for KeyServerCore {
224
- fn drop ( & mut self ) {
225
- self . close . take ( ) . map ( |v| v. send ( ( ) ) ) ;
226
- self . handle . take ( ) . map ( |h| h. join ( ) ) ;
227
- }
228
- }
229
-
230
199
#[ cfg( test) ]
231
200
pub mod tests {
232
201
use std:: collections:: BTreeSet ;
@@ -243,6 +212,7 @@ pub mod tests {
243
212
use key_server_set:: tests:: MapKeyServerSet ;
244
213
use key_server_cluster:: math;
245
214
use ethereum_types:: { H256 , H520 } ;
215
+ use parity_runtime:: Runtime ;
246
216
use types:: { Error , Public , ClusterConfiguration , NodeAddress , RequestSignature , ServerKeyId ,
247
217
EncryptedDocumentKey , EncryptedDocumentKeyShadow , MessageHash , EncryptedMessageSignature ,
248
218
Requester , NodeId } ;
@@ -294,10 +264,9 @@ pub mod tests {
294
264
}
295
265
}
296
266
297
- fn make_key_servers ( start_port : u16 , num_nodes : usize ) -> ( Vec < KeyServerImpl > , Vec < Arc < DummyKeyStorage > > ) {
267
+ fn make_key_servers ( start_port : u16 , num_nodes : usize ) -> ( Vec < KeyServerImpl > , Vec < Arc < DummyKeyStorage > > , Runtime ) {
298
268
let key_pairs: Vec < _ > = ( 0 ..num_nodes) . map ( |_| Random . generate ( ) . unwrap ( ) ) . collect ( ) ;
299
269
let configs: Vec < _ > = ( 0 ..num_nodes) . map ( |i| ClusterConfiguration {
300
- threads : 1 ,
301
270
listener_address : NodeAddress {
302
271
address : "127.0.0.1" . into ( ) ,
303
272
port : start_port + ( i as u16 ) ,
@@ -316,11 +285,12 @@ pub mod tests {
316
285
. map ( |( k, a) | ( k. clone ( ) , format ! ( "{}:{}" , a. address, a. port) . parse ( ) . unwrap ( ) ) )
317
286
. collect ( ) ;
318
287
let key_storages = ( 0 ..num_nodes) . map ( |_| Arc :: new ( DummyKeyStorage :: default ( ) ) ) . collect :: < Vec < _ > > ( ) ;
288
+ let runtime = Runtime :: with_thread_count ( 4 ) ;
319
289
let key_servers: Vec < _ > = configs. into_iter ( ) . enumerate ( ) . map ( |( i, cfg) |
320
290
KeyServerImpl :: new ( & cfg, Arc :: new ( MapKeyServerSet :: new ( false , key_servers_set. clone ( ) ) ) ,
321
291
Arc :: new ( PlainNodeKeyPair :: new ( key_pairs[ i] . clone ( ) ) ) ,
322
292
Arc :: new ( DummyAclStorage :: default ( ) ) ,
323
- key_storages[ i] . clone ( ) ) . unwrap ( )
293
+ key_storages[ i] . clone ( ) , runtime . executor ( ) ) . unwrap ( )
324
294
) . collect ( ) ;
325
295
326
296
// wait until connections are established. It is fast => do not bother with events here
@@ -350,13 +320,13 @@ pub mod tests {
350
320
}
351
321
}
352
322
353
- ( key_servers, key_storages)
323
+ ( key_servers, key_storages, runtime )
354
324
}
355
325
356
326
#[ test]
357
327
fn document_key_generation_and_retrievement_works_over_network_with_single_node ( ) {
358
328
//::logger::init_log();
359
- let ( key_servers, _) = make_key_servers ( 6070 , 1 ) ;
329
+ let ( key_servers, _, runtime ) = make_key_servers ( 6070 , 1 ) ;
360
330
361
331
// generate document key
362
332
let threshold = 0 ;
@@ -372,12 +342,13 @@ pub mod tests {
372
342
let retrieved_key = crypto:: ecies:: decrypt ( & secret, & DEFAULT_MAC , & retrieved_key) . unwrap ( ) ;
373
343
assert_eq ! ( retrieved_key, generated_key) ;
374
344
}
345
+ drop ( runtime) ;
375
346
}
376
347
377
348
#[ test]
378
349
fn document_key_generation_and_retrievement_works_over_network_with_3_nodes ( ) {
379
350
//::logger::init_log();
380
- let ( key_servers, key_storages) = make_key_servers ( 6080 , 3 ) ;
351
+ let ( key_servers, key_storages, runtime ) = make_key_servers ( 6080 , 3 ) ;
381
352
382
353
let test_cases = [ 0 , 1 , 2 ] ;
383
354
for threshold in & test_cases {
@@ -399,12 +370,13 @@ pub mod tests {
399
370
assert ! ( key_share. encrypted_point. is_some( ) ) ;
400
371
}
401
372
}
373
+ drop ( runtime) ;
402
374
}
403
375
404
376
#[ test]
405
377
fn server_key_generation_and_storing_document_key_works_over_network_with_3_nodes ( ) {
406
378
//::logger::init_log();
407
- let ( key_servers, _) = make_key_servers ( 6090 , 3 ) ;
379
+ let ( key_servers, _, runtime ) = make_key_servers ( 6090 , 3 ) ;
408
380
409
381
let test_cases = [ 0 , 1 , 2 ] ;
410
382
for threshold in & test_cases {
@@ -430,12 +402,13 @@ pub mod tests {
430
402
assert_eq ! ( retrieved_key, generated_key) ;
431
403
}
432
404
}
405
+ drop ( runtime) ;
433
406
}
434
407
435
408
#[ test]
436
409
fn server_key_generation_and_message_signing_works_over_network_with_3_nodes ( ) {
437
410
//::logger::init_log();
438
- let ( key_servers, _) = make_key_servers ( 6100 , 3 ) ;
411
+ let ( key_servers, _, runtime ) = make_key_servers ( 6100 , 3 ) ;
439
412
440
413
let test_cases = [ 0 , 1 , 2 ] ;
441
414
for threshold in & test_cases {
@@ -455,12 +428,13 @@ pub mod tests {
455
428
// check signature
456
429
assert_eq ! ( math:: verify_schnorr_signature( & server_public, & ( signature_c, signature_s) , & message_hash) , Ok ( true ) ) ;
457
430
}
431
+ drop ( runtime) ;
458
432
}
459
433
460
434
#[ test]
461
435
fn decryption_session_is_delegated_when_node_does_not_have_key_share ( ) {
462
436
//::logger::init_log();
463
- let ( key_servers, _) = make_key_servers ( 6110 , 3 ) ;
437
+ let ( key_servers, _, runtime ) = make_key_servers ( 6110 , 3 ) ;
464
438
465
439
// generate document key
466
440
let threshold = 0 ;
@@ -477,12 +451,13 @@ pub mod tests {
477
451
let retrieved_key = key_servers[ 0 ] . restore_document_key ( & document, & signature. into ( ) ) . unwrap ( ) ;
478
452
let retrieved_key = crypto:: ecies:: decrypt ( & secret, & DEFAULT_MAC , & retrieved_key) . unwrap ( ) ;
479
453
assert_eq ! ( retrieved_key, generated_key) ;
454
+ drop ( runtime) ;
480
455
}
481
456
482
457
#[ test]
483
458
fn schnorr_signing_session_is_delegated_when_node_does_not_have_key_share ( ) {
484
459
//::logger::init_log();
485
- let ( key_servers, _) = make_key_servers ( 6114 , 3 ) ;
460
+ let ( key_servers, _, runtime ) = make_key_servers ( 6114 , 3 ) ;
486
461
let threshold = 1 ;
487
462
488
463
// generate server key
@@ -503,12 +478,13 @@ pub mod tests {
503
478
504
479
// check signature
505
480
assert_eq ! ( math:: verify_schnorr_signature( & server_public, & ( signature_c, signature_s) , & message_hash) , Ok ( true ) ) ;
481
+ drop ( runtime) ;
506
482
}
507
483
508
484
#[ test]
509
485
fn ecdsa_signing_session_is_delegated_when_node_does_not_have_key_share ( ) {
510
486
//::logger::init_log();
511
- let ( key_servers, _) = make_key_servers ( 6117 , 4 ) ;
487
+ let ( key_servers, _, runtime ) = make_key_servers ( 6117 , 4 ) ;
512
488
let threshold = 1 ;
513
489
514
490
// generate server key
@@ -528,6 +504,7 @@ pub mod tests {
528
504
529
505
// check signature
530
506
assert ! ( verify_public( & server_public, & signature. into( ) , & message_hash) . unwrap( ) ) ;
507
+ drop ( runtime) ;
531
508
}
532
509
533
510
#[ test]
0 commit comments