@@ -5,6 +5,12 @@ extern crate alloc;
5
5
#[ global_allocator]
6
6
static ALLOC : mini_alloc:: MiniAlloc = mini_alloc:: MiniAlloc :: INIT ;
7
7
8
+ #[ cfg( not( feature = "std" ) ) ]
9
+ #[ panic_handler]
10
+ fn panic ( _info : & core:: panic:: PanicInfo ) -> ! {
11
+ loop { }
12
+ }
13
+
8
14
use alloc:: vec:: Vec ;
9
15
use stylus_sdk:: {
10
16
prelude:: { entrypoint, public, storage, SolidityError } ,
@@ -13,8 +19,7 @@ use stylus_sdk::{
13
19
} ;
14
20
use alloy_sol_types:: { SolValue , sol} ;
15
21
use stylus_sdk:: alloy_primitives:: keccak256;
16
- use sha3:: { Digest , Keccak256 } ;
17
- use libsecp256k1:: { recover, Message , Signature , RecoveryId } ;
22
+ use k256:: ecdsa:: { RecoveryId , Signature , VerifyingKey } ;
18
23
19
24
#[ derive( Clone , Debug , PartialEq , Default ) ]
20
25
pub struct GuardianSet {
@@ -392,9 +397,7 @@ impl WormholeContract {
392
397
Ok ( ( ) )
393
398
}
394
399
395
- fn compute_hash ( & self , body : & [ u8 ] ) -> Result < FixedBytes < 32 > , WormholeError > {
396
- Self :: compute_hash_static ( body)
397
- }
400
+
398
401
399
402
fn compute_hash_static ( body : & [ u8 ] ) -> Result < FixedBytes < 32 > , WormholeError > {
400
403
use stylus_sdk:: alloy_primitives:: keccak256;
@@ -436,27 +439,32 @@ impl WormholeContract {
436
439
return Err ( WormholeError :: InvalidSignature ( InvalidSignature { } ) ) ;
437
440
}
438
441
439
- let recovery_id_raw = signature[ 64 ] ;
440
-
441
- let recovery_id = RecoveryId :: parse_rpc ( recovery_id_raw)
442
- . map_err ( |_| WormholeError :: InvalidSignature ( InvalidSignature { } ) ) ?;
443
-
444
442
let sig_bytes: [ u8 ; 64 ] = signature[ ..64 ] . try_into ( )
445
443
. map_err ( |_| WormholeError :: InvalidSignature ( InvalidSignature { } ) ) ?;
446
- let sig = Signature :: parse_standard ( & sig_bytes)
447
- . map_err ( |_| WormholeError :: InvalidSignature ( InvalidSignature { } ) ) ?;
444
+ let recovery_id_byte = signature[ 64 ] ;
445
+
446
+ let recovery_id = if recovery_id_byte >= 27 {
447
+ RecoveryId :: try_from ( recovery_id_byte - 27 )
448
+ . map_err ( |_| WormholeError :: InvalidSignature ( InvalidSignature { } ) ) ?
449
+ } else {
450
+ RecoveryId :: try_from ( recovery_id_byte)
451
+ . map_err ( |_| WormholeError :: InvalidSignature ( InvalidSignature { } ) ) ?
452
+ } ;
448
453
454
+ let sig = Signature :: try_from ( & sig_bytes[ ..] )
455
+ . map_err ( |_| WormholeError :: InvalidSignature ( InvalidSignature { } ) ) ?;
456
+
449
457
let hash_array: [ u8 ; 32 ] = hash. as_slice ( ) . try_into ( )
450
458
. map_err ( |_| WormholeError :: InvalidInput ( InvalidInput { } ) ) ?;
451
- let message = Message :: parse ( & hash_array) ;
452
459
453
- let recovered_pubkey = recover ( & message , & sig, & recovery_id)
460
+ let verifying_key = VerifyingKey :: recover_from_prehash ( & hash_array , & sig, recovery_id)
454
461
. map_err ( |_| WormholeError :: InvalidSignature ( InvalidSignature { } ) ) ?;
455
462
456
- let pubkey_bytes = recovered_pubkey. serialize ( ) ;
463
+ let public_key_bytes = verifying_key. to_encoded_point ( false ) ;
464
+ let public_key_slice = & public_key_bytes. as_bytes ( ) [ 1 ..] ;
457
465
458
- let address_hash: [ u8 ; 32 ] = Keccak256 :: new_with_prefix ( & pubkey_bytes [ 1 .. ] ) . finalize ( ) . into ( ) ;
459
- let address_bytes: [ u8 ; 20 ] = address_hash[ 12 ..32 ] . try_into ( )
466
+ let address_hash = keccak256 ( public_key_slice ) ;
467
+ let address_bytes: [ u8 ; 20 ] = address_hash[ 12 ..] . try_into ( )
460
468
. map_err ( |_| WormholeError :: InvalidAddressLength ( InvalidAddressLength { } ) ) ?;
461
469
462
470
Ok ( Address :: from ( address_bytes) == guardian_address)
@@ -538,7 +546,7 @@ mod tests {
538
546
use alloc:: vec;
539
547
use motsu:: prelude:: DefaultStorage ;
540
548
use core:: str:: FromStr ;
541
- use libsecp256k1 :: { sign , Message , SecretKey , PublicKey } ;
549
+ use k256 :: ecdsa :: { SigningKey , Signature as K256Signature } ;
542
550
use stylus_sdk:: alloy_primitives:: keccak256;
543
551
use base64:: engine:: general_purpose;
544
552
use base64:: Engine ;
@@ -582,21 +590,23 @@ mod tests {
582
590
583
591
fn test_guardian_address1 ( ) -> Address {
584
592
let secret = test_guardian_secret1 ( ) ;
585
- let secret_key = SecretKey :: parse ( & secret) . expect ( "Valid secret key" ) ;
586
- let pubkey = PublicKey :: from_secret_key ( & secret_key) ;
587
- let pubkey_bytes = pubkey. serialize ( ) ;
588
- let hash = Keccak256 :: digest ( & pubkey_bytes[ 1 ..] ) ;
593
+ let signing_key = SigningKey :: from_bytes ( & secret. into ( ) ) . expect ( "Valid secret key" ) ;
594
+ let verifying_key = signing_key. verifying_key ( ) ;
595
+ let public_key_bytes = verifying_key. to_encoded_point ( false ) ;
596
+ let public_key_slice = & public_key_bytes. as_bytes ( ) [ 1 ..] ;
597
+ let hash = keccak256 ( public_key_slice) ;
589
598
let address_bytes: [ u8 ; 20 ] = hash[ 12 ..] . try_into ( ) . unwrap ( ) ;
590
599
Address :: from ( address_bytes)
591
600
}
592
601
593
602
594
603
fn test_guardian_address2 ( ) -> Address {
595
604
let secret = test_guardian_secret2 ( ) ;
596
- let secret_key = SecretKey :: parse ( & secret) . expect ( "Valid secret key" ) ;
597
- let pubkey = PublicKey :: from_secret_key ( & secret_key) ;
598
- let pubkey_bytes = pubkey. serialize ( ) ;
599
- let hash = Keccak256 :: digest ( & pubkey_bytes[ 1 ..] ) ;
605
+ let signing_key = SigningKey :: from_bytes ( & secret. into ( ) ) . expect ( "Valid secret key" ) ;
606
+ let verifying_key = signing_key. verifying_key ( ) ;
607
+ let public_key_bytes = verifying_key. to_encoded_point ( false ) ;
608
+ let public_key_slice = & public_key_bytes. as_bytes ( ) [ 1 ..] ;
609
+ let hash = keccak256 ( public_key_slice) ;
600
610
let address_bytes: [ u8 ; 20 ] = hash[ 12 ..] . try_into ( ) . unwrap ( ) ;
601
611
Address :: from ( address_bytes)
602
612
}
@@ -736,18 +746,18 @@ mod tests {
736
746
_ => test_guardian_secret1 ( ) ,
737
747
} ;
738
748
739
- let secret_key = SecretKey :: parse ( & secret_bytes)
749
+ let signing_key = SigningKey :: from_bytes ( & secret_bytes. into ( ) )
740
750
. map_err ( |_| WormholeError :: InvalidInput ( InvalidInput { } ) ) ?;
741
751
742
752
let hash_array: [ u8 ; 32 ] = hash. as_slice ( ) . try_into ( )
743
753
. map_err ( |_| WormholeError :: InvalidInput ( InvalidInput { } ) ) ?;
744
- let message = Message :: parse ( & hash_array) ;
745
754
746
- let ( signature, recovery_id) = sign ( & message, & secret_key) ;
755
+ let ( signature, recovery_id) = signing_key. sign_prehash_recoverable ( & hash_array)
756
+ . map_err ( |_| WormholeError :: InvalidInput ( InvalidInput { } ) ) ?;
747
757
748
758
let mut signature_bytes = [ 0u8 ; 65 ] ;
749
- signature_bytes[ ..64 ] . copy_from_slice ( & signature. serialize ( ) ) ;
750
- signature_bytes[ 64 ] = recovery_id. serialize ( ) ;
759
+ signature_bytes[ ..64 ] . copy_from_slice ( & signature. to_bytes ( ) ) ;
760
+ signature_bytes[ 64 ] = recovery_id. to_byte ( ) + 27 ;
751
761
752
762
Ok ( GuardianSignature {
753
763
guardian_index,
0 commit comments