1
- pub use secp256k1:: util:: { MESSAGE_SIZE , SIGNATURE_SIZE } ;
1
+ pub use secp256k1:: constants:: { COMPACT_SIGNATURE_SIZE as SIGNATURE_SIZE , MESSAGE_SIZE } ;
2
+ use secp256k1:: ecdsa:: Signature as SecpSignature ;
2
3
3
- use cosmwasm_std:: StdError ;
4
+ use cosmwasm_std:: { Api , StdError } ;
4
5
5
- pub const PRIVATE_KEY_SIZE : usize = secp256k1:: util :: SECRET_KEY_SIZE ;
6
- pub const PUBLIC_KEY_SIZE : usize = secp256k1:: util :: FULL_PUBLIC_KEY_SIZE ;
7
- pub const COMPRESSED_PUBLIC_KEY_SIZE : usize = secp256k1:: util :: COMPRESSED_PUBLIC_KEY_SIZE ;
6
+ pub const PRIVATE_KEY_SIZE : usize = secp256k1:: constants :: SECRET_KEY_SIZE ;
7
+ pub const PUBLIC_KEY_SIZE : usize = secp256k1:: constants :: UNCOMPRESSED_PUBLIC_KEY_SIZE ;
8
+ pub const COMPRESSED_PUBLIC_KEY_SIZE : usize = secp256k1:: constants :: PUBLIC_KEY_SIZE ;
8
9
9
10
pub struct PrivateKey {
10
11
inner : secp256k1:: SecretKey ,
@@ -15,70 +16,75 @@ pub struct PublicKey {
15
16
}
16
17
17
18
pub struct Signature {
18
- inner : secp256k1 :: Signature ,
19
+ inner : SecpSignature ,
19
20
}
20
21
21
22
impl PrivateKey {
22
23
pub fn parse ( raw : & [ u8 ; PRIVATE_KEY_SIZE ] ) -> Result < Self , StdError > {
23
- secp256k1:: SecretKey :: parse ( raw)
24
+ secp256k1:: SecretKey :: from_slice ( raw)
24
25
. map ( |key| PrivateKey { inner : key } )
25
26
. map_err ( |err| StdError :: generic_err ( format ! ( "Error parsing PrivateKey: {}" , err) ) )
26
27
}
27
28
28
29
pub fn serialize ( & self ) -> [ u8 ; PRIVATE_KEY_SIZE ] {
29
- self . inner . serialize ( )
30
+ self . inner . serialize_secret ( )
30
31
}
31
32
32
33
pub fn pubkey ( & self ) -> PublicKey {
34
+ let secp = secp256k1:: Secp256k1 :: new ( ) ;
33
35
PublicKey {
34
- inner : secp256k1:: PublicKey :: from_secret_key ( & self . inner ) ,
36
+ inner : secp256k1:: PublicKey :: from_secret_key ( & secp , & self . inner ) ,
35
37
}
36
38
}
37
39
38
- pub fn sign ( & self , data : & [ u8 ; MESSAGE_SIZE ] ) -> Signature {
39
- let msg = secp256k1:: Message :: parse ( data) ;
40
- let sig = secp256k1:: sign ( & msg, & self . inner ) ;
40
+ pub fn sign < A : Api > ( & self , data : & [ u8 ] , api : A ) -> Signature {
41
+ let serialized_key = & self . serialize ( ) ;
42
+ // will never fail since we guarantee that the inputs are valid.
43
+ let sig_bytes = api. secp256k1_sign ( data, serialized_key) . unwrap ( ) ;
44
+ let sig = SecpSignature :: from_compact ( & sig_bytes) . unwrap ( ) ;
41
45
42
- Signature { inner : sig. 0 }
46
+ Signature { inner : sig }
43
47
}
44
48
}
45
49
46
50
impl PublicKey {
47
51
pub fn parse ( p : & [ u8 ] ) -> Result < PublicKey , StdError > {
48
- secp256k1:: PublicKey :: parse_slice ( p , None )
52
+ secp256k1:: PublicKey :: from_slice ( p )
49
53
. map ( |key| PublicKey { inner : key } )
50
54
. map_err ( |err| StdError :: generic_err ( format ! ( "Error parsing PublicKey: {}" , err) ) )
51
55
}
52
56
53
57
pub fn serialize ( & self ) -> [ u8 ; PUBLIC_KEY_SIZE ] {
54
- self . inner . serialize ( )
58
+ self . inner . serialize_uncompressed ( )
55
59
}
56
60
57
61
pub fn serialize_compressed ( & self ) -> [ u8 ; COMPRESSED_PUBLIC_KEY_SIZE ] {
58
- self . inner . serialize_compressed ( )
62
+ self . inner . serialize ( )
59
63
}
60
64
61
- pub fn verify ( & self , data : & [ u8 ; MESSAGE_SIZE ] , signature : Signature ) -> bool {
62
- let msg = secp256k1:: Message :: parse ( data) ;
63
- secp256k1:: verify ( & msg, & signature. inner , & self . inner )
65
+ pub fn verify < A : Api > ( & self , data : & [ u8 ; MESSAGE_SIZE ] , signature : Signature , api : A ) -> bool {
66
+ let sig = & signature. serialize ( ) ;
67
+ let pk = & self . serialize ( ) ;
68
+ // will never fail since we guarantee that the inputs are valid.
69
+ api. secp256k1_verify ( data, sig, pk) . unwrap ( )
64
70
}
65
71
}
66
72
67
73
impl Signature {
68
- pub fn parse ( p : & [ u8 ; SIGNATURE_SIZE ] ) -> Signature {
69
- Signature {
70
- inner : secp256k1 :: Signature :: parse ( p ) ,
71
- }
74
+ pub fn parse ( p : & [ u8 ; SIGNATURE_SIZE ] ) -> Result < Signature , StdError > {
75
+ SecpSignature :: from_compact ( p )
76
+ . map ( |sig| Signature { inner : sig } )
77
+ . map_err ( |err| StdError :: generic_err ( format ! ( "Error parsing Signature: {}" , err ) ) )
72
78
}
73
79
74
80
pub fn parse_slice ( p : & [ u8 ] ) -> Result < Signature , StdError > {
75
- secp256k1 :: Signature :: parse_slice ( p)
81
+ SecpSignature :: from_compact ( p)
76
82
. map ( |sig| Signature { inner : sig } )
77
83
. map_err ( |err| StdError :: generic_err ( format ! ( "Error parsing Signature: {}" , err) ) )
78
84
}
79
85
80
86
pub fn serialize ( & self ) -> [ u8 ; SIGNATURE_SIZE ] {
81
- self . inner . serialize ( )
87
+ self . inner . serialize_compact ( )
82
88
}
83
89
}
84
90
0 commit comments