@@ -459,6 +459,135 @@ async fn keygen_ok() -> anyhow::Result<()> {
459459 Ok ( ( ) )
460460}
461461
462+ #[ tokio:: test]
463+ #[ serial( db) ]
464+ async fn keygen_ok_catchup_positive ( ) -> anyhow:: Result < ( ) > {
465+ keygen_ok_catchup_gen ( true ) . await
466+ }
467+
468+ #[ tokio:: test]
469+ #[ serial( db) ]
470+ async fn keygen_ok_catchup_negative ( ) -> anyhow:: Result < ( ) > {
471+ keygen_ok_catchup_gen ( false ) . await
472+ }
473+
474+ async fn keygen_ok_catchup_gen ( positive : bool ) -> anyhow:: Result < ( ) > {
475+ use aws_sdk_s3:: operation:: get_object:: GetObjectOutput ;
476+ use aws_sdk_s3:: primitives:: ByteStream ;
477+ use aws_sdk_s3:: Client ;
478+ use aws_smithy_mocks:: RuleMode ;
479+ use aws_smithy_mocks:: { mock, mock_client} ;
480+ use gw_listener:: KeyType ;
481+
482+ // see ../contracts/KMSGeneration.sol
483+ let buckets = [
484+ "test-bucket1/PUB-P1" ,
485+ "test-bucket2/PUB-P2" ,
486+ "test-bucket3/PUB-P3" ,
487+ "test-bucket4/PUB-P4" ,
488+ ] ;
489+
490+ let keys_digests = [ KeyType :: PublicKey , KeyType :: ServerKey ] ;
491+
492+ let key_id = U256 :: from ( 16 ) ;
493+
494+ let mut rules = vec ! [ ] ;
495+ for & bucket in & buckets {
496+ for key_type in & keys_digests {
497+ let key_type_str: & str = to_bucket_key_prefix ( * key_type) ;
498+ let key_id_no_0x = key_id_to_key_bucket ( key_id) ;
499+ let key = format ! ( "{}/{}" , key_type_str, key_id_no_0x) ;
500+ eprintln ! ( "Adding {}/{}" , bucket, key) ;
501+ let get_object_rule = mock ! ( Client :: get_object)
502+ . match_requests ( move |req| req. bucket ( ) == Some ( bucket) && req. key ( ) == Some ( & key) )
503+ . then_output ( || {
504+ GetObjectOutput :: builder ( )
505+ . body ( ByteStream :: from_static ( b"key_bytes" ) )
506+ . build ( )
507+ } ) ;
508+ rules. push ( get_object_rule) ;
509+ }
510+ }
511+ for & bucket in & buckets {
512+ let key_id_no_0x = & format ! ( "{key_id:064X}" ) ;
513+ let key = format ! ( "PUB/CRS/{key_id_no_0x}" ) ;
514+ eprintln ! ( "Adding {}/{}" , bucket, key) ;
515+ let get_object_rule = mock ! ( Client :: get_object)
516+ . match_requests ( move |req| req. bucket ( ) == Some ( bucket) && req. key ( ) == Some ( & key) )
517+ . then_output ( || {
518+ GetObjectOutput :: builder ( )
519+ . body ( ByteStream :: from_static ( b"key_bytes" ) )
520+ . build ( )
521+ } ) ;
522+ rules. push ( get_object_rule) ;
523+ }
524+ let rules_ref: Vec < _ > = rules. iter ( ) . collect ( ) ;
525+
526+ // Create a mocked client with the rule
527+ let s3 = mock_client ! ( aws_sdk_s3, RuleMode :: MatchAny , & rules_ref) ;
528+
529+ let env = TestEnvironment :: new ( ) . await ?;
530+ let provider = ProviderBuilder :: new ( )
531+ . wallet ( env. wallet )
532+ . connect_ws ( WsConnect :: new ( env. anvil . ws_endpoint_url ( ) ) )
533+ . await ?;
534+ let aws_s3_client = AwsS3ClientMocked ( s3) ;
535+ let input_verification = InputVerification :: deploy ( & provider) . await ?;
536+ let kms_generation = KMSGeneration :: deploy ( & provider) . await ?;
537+
538+ assert ! ( provider. get_block_number( ) . await ? > 0 ) ;
539+
540+ let txn_req = kms_generation
541+ . keygen_public_key ( )
542+ . into_transaction_request ( ) ;
543+ let pending_txn = provider. send_transaction ( txn_req) . await ?;
544+ let receipt = pending_txn. get_receipt ( ) . await ?;
545+ assert ! ( receipt. status( ) ) ;
546+
547+ let txn_req = kms_generation
548+ . keygen_server_key ( )
549+ . into_transaction_request ( ) ;
550+ let pending_txn = provider. send_transaction ( txn_req) . await ?;
551+ let receipt = pending_txn. get_receipt ( ) . await ?;
552+ assert ! ( receipt. status( ) ) ;
553+
554+ let txn_req = kms_generation. crsgen ( ) . into_transaction_request ( ) ;
555+ let pending_txn = provider. send_transaction ( txn_req) . await ?;
556+ let receipt = pending_txn. get_receipt ( ) . await ?;
557+ assert ! ( receipt. status( ) ) ;
558+
559+ assert ! ( has_not_public_key( & env. db_pool. clone( ) ) . await ?) ;
560+ assert ! ( has_not_server_key( & env. db_pool. clone( ) ) . await ?) ;
561+ assert ! ( has_not_crs( & env. db_pool. clone( ) ) . await ?) ;
562+
563+ let catchup_kms_generation_from_block = if positive {
564+ Some ( 0 )
565+ } else {
566+ Some ( -( provider. get_block_number ( ) . await ? as i64 ) )
567+ } ;
568+ let conf = ConfigSettings {
569+ catchup_kms_generation_from_block,
570+ ..env. conf . clone ( )
571+ } ;
572+ let gw_listener = GatewayListener :: new (
573+ * input_verification. address ( ) ,
574+ * kms_generation. address ( ) ,
575+ conf,
576+ env. cancel_token . clone ( ) ,
577+ provider. clone ( ) ,
578+ aws_s3_client. clone ( ) ,
579+ ) ;
580+ let listener = tokio:: spawn ( async move { gw_listener. run ( ) . await } ) ;
581+
582+ assert ! ( has_public_key( & env. db_pool. clone( ) ) . await ?) ;
583+ assert ! ( has_server_key( & env. db_pool. clone( ) ) . await ?) ;
584+ assert ! ( has_crs( & env. db_pool. clone( ) ) . await ?) ;
585+
586+ env. cancel_token . cancel ( ) ;
587+ listener. abort ( ) ;
588+ Ok ( ( ) )
589+ }
590+
462591#[ tokio:: test]
463592#[ serial( db) ]
464593async fn keygen_compromised_key ( ) -> anyhow:: Result < ( ) > {
0 commit comments