@@ -40,8 +40,10 @@ const LENGTH_SHA256_HASH: usize = 32;
40
40
/// Max length of a serialized signature
41
41
const MAX_LENGTH_SIGNATURE : usize = 64 ;
42
42
43
- /// Max length of a serialized public key
44
- const MAX_LENGTH_PUBKEY : usize = 33 ;
43
+ /// Max length of a compressed serialized public key
44
+ const MAX_LENGTH_COMPRESSED_PUBKEY : usize = 33 ;
45
+ /// Max length of an uncompressed serialized public key
46
+ const MAX_LENGTH_UNCOMPRESSED_PUBKEY : usize = 65 ;
45
47
46
48
/// Max length for a debug message
47
49
const MAX_LENGTH_DEBUG : usize = 2 * MI ;
@@ -265,7 +267,12 @@ fn do_secp256k1_verify<A: Api, S: Storage, Q: Querier>(
265
267
266
268
let signature = read_region ( & env. memory ( ) , signature_ptr, MAX_LENGTH_SIGNATURE ) ?;
267
269
268
- let pubkey = read_region ( & env. memory ( ) , pubkey_ptr, MAX_LENGTH_PUBKEY ) ?;
270
+ let pubkey_prefix = read_region ( & env. memory ( ) , pubkey_ptr, 1 ) ?;
271
+ let pubkey = match pubkey_prefix[ 0 ] {
272
+ 0x02 | 0x03 => read_region ( & env. memory ( ) , pubkey_ptr, MAX_LENGTH_COMPRESSED_PUBKEY ) ?,
273
+ 0x04 => read_region ( & env. memory ( ) , pubkey_ptr, MAX_LENGTH_UNCOMPRESSED_PUBKEY ) ?,
274
+ p => return Err ( VmError :: crypto_err ( format ! ( "unsupported pubkey prefix: {}" , p) ) ) ,
275
+ } ;
269
276
270
277
let result = secp256k1_verify ( & hash, & signature, & pubkey) ;
271
278
let gas_info = GasInfo :: with_cost ( GAS_COST_VERIFY_SECP256K1_SIGNATURE ) ;
0 commit comments