@@ -25,6 +25,9 @@ use crate::Error::{self, InvalidPublicKey, InvalidPublicKeySum, InvalidSecretKey
25
25
use crate :: ffi:: { self , CPtr , impl_array_newtype} ;
26
26
use crate :: ffi:: types:: c_uint;
27
27
28
+ #[ cfg( feature = "serde" ) ]
29
+ use serde:: ser:: SerializeTuple ;
30
+
28
31
#[ cfg( feature = "global-context" ) ]
29
32
use crate :: { Message , ecdsa, SECP256K1 } ;
30
33
#[ cfg( all( feature = "global-context" , feature = "rand-std" ) ) ]
@@ -322,7 +325,11 @@ impl serde::Serialize for SecretKey {
322
325
let mut buf = [ 0u8 ; constants:: SECRET_KEY_SIZE * 2 ] ;
323
326
s. serialize_str ( crate :: to_hex ( & self . 0 , & mut buf) . expect ( "fixed-size hex serialization" ) )
324
327
} else {
325
- s. serialize_bytes ( & self [ ..] )
328
+ let mut tuple = s. serialize_tuple ( constants:: SECRET_KEY_SIZE ) ?;
329
+ for byte in self . 0 . iter ( ) {
330
+ tuple. serialize_element ( byte) ?;
331
+ }
332
+ tuple. end ( )
326
333
}
327
334
}
328
335
}
@@ -336,10 +343,11 @@ impl<'de> serde::Deserialize<'de> for SecretKey {
336
343
"a hex string representing 32 byte SecretKey"
337
344
) )
338
345
} else {
339
- d . deserialize_bytes ( super :: serde_util:: BytesVisitor :: new (
346
+ let visitor = super :: serde_util:: Tuple32Visitor :: new (
340
347
"raw 32 bytes SecretKey" ,
341
348
SecretKey :: from_slice
342
- ) )
349
+ ) ;
350
+ d. deserialize_tuple ( constants:: SECRET_KEY_SIZE , visitor)
343
351
}
344
352
}
345
353
}
@@ -664,7 +672,11 @@ impl serde::Serialize for PublicKey {
664
672
if s. is_human_readable ( ) {
665
673
s. collect_str ( self )
666
674
} else {
667
- s. serialize_bytes ( & self . serialize ( ) )
675
+ let mut tuple = s. serialize_tuple ( constants:: PUBLIC_KEY_SIZE ) ?;
676
+ for byte in self . serialize ( ) . iter ( ) { // Serialize in compressed form.
677
+ tuple. serialize_element ( & byte) ?;
678
+ }
679
+ tuple. end ( )
668
680
}
669
681
}
670
682
}
@@ -678,10 +690,11 @@ impl<'de> serde::Deserialize<'de> for PublicKey {
678
690
"an ASCII hex string representing a public key"
679
691
) )
680
692
} else {
681
- d . deserialize_bytes ( super :: serde_util:: BytesVisitor :: new (
682
- "a bytestring representing a public key" ,
693
+ let visitor = super :: serde_util:: Tuple33Visitor :: new (
694
+ "33 bytes compressed public key" ,
683
695
PublicKey :: from_slice
684
- ) )
696
+ ) ;
697
+ d. deserialize_tuple ( constants:: PUBLIC_KEY_SIZE , visitor)
685
698
}
686
699
}
687
700
}
@@ -987,7 +1000,11 @@ impl serde::Serialize for KeyPair {
987
1000
s. serialize_str ( crate :: to_hex ( & self . secret_bytes ( ) , & mut buf)
988
1001
. expect ( "fixed-size hex serialization" ) )
989
1002
} else {
990
- s. serialize_bytes ( & self . 0 [ ..] )
1003
+ let mut tuple = s. serialize_tuple ( constants:: SECRET_KEY_SIZE ) ?;
1004
+ for byte in self . secret_bytes ( ) . iter ( ) {
1005
+ tuple. serialize_element ( & byte) ?;
1006
+ }
1007
+ tuple. end ( )
991
1008
}
992
1009
}
993
1010
}
@@ -1001,13 +1018,14 @@ impl<'de> serde::Deserialize<'de> for KeyPair {
1001
1018
"a hex string representing 32 byte KeyPair"
1002
1019
) )
1003
1020
} else {
1004
- d . deserialize_bytes ( super :: serde_util:: BytesVisitor :: new (
1021
+ let visitor = super :: serde_util:: Tuple32Visitor :: new (
1005
1022
"raw 32 bytes KeyPair" ,
1006
1023
|data| unsafe {
1007
1024
let ctx = Secp256k1 :: from_raw_all ( ffi:: secp256k1_context_no_precomp as * mut ffi:: Context ) ;
1008
1025
KeyPair :: from_seckey_slice ( & ctx, data)
1009
1026
}
1010
- ) )
1027
+ ) ;
1028
+ d. deserialize_tuple ( constants:: SECRET_KEY_SIZE , visitor)
1011
1029
}
1012
1030
}
1013
1031
}
@@ -1438,7 +1456,11 @@ impl serde::Serialize for XOnlyPublicKey {
1438
1456
if s. is_human_readable ( ) {
1439
1457
s. collect_str ( self )
1440
1458
} else {
1441
- s. serialize_bytes ( & self . serialize ( ) )
1459
+ let mut tuple = s. serialize_tuple ( constants:: SCHNORR_PUBLIC_KEY_SIZE ) ?;
1460
+ for byte in self . serialize ( ) . iter ( ) {
1461
+ tuple. serialize_element ( & byte) ?;
1462
+ }
1463
+ tuple. end ( )
1442
1464
}
1443
1465
}
1444
1466
}
@@ -1452,10 +1474,11 @@ impl<'de> serde::Deserialize<'de> for XOnlyPublicKey {
1452
1474
"a hex string representing 32 byte schnorr public key"
1453
1475
) )
1454
1476
} else {
1455
- d . deserialize_bytes ( super :: serde_util:: BytesVisitor :: new (
1477
+ let visitor = super :: serde_util:: Tuple32Visitor :: new (
1456
1478
"raw 32 bytes schnorr public key" ,
1457
1479
XOnlyPublicKey :: from_slice
1458
- ) )
1480
+ ) ;
1481
+ d. deserialize_tuple ( constants:: SCHNORR_PUBLIC_KEY_SIZE , visitor)
1459
1482
}
1460
1483
}
1461
1484
}
@@ -1501,6 +1524,8 @@ pub mod serde_keypair {
1501
1524
#[ cfg( test) ]
1502
1525
#[ allow( unused_imports) ]
1503
1526
mod test {
1527
+ use super :: * ;
1528
+
1504
1529
use core:: str:: FromStr ;
1505
1530
1506
1531
#[ cfg( any( feature = "alloc" , feature = "std" ) ) ]
@@ -1953,6 +1978,7 @@ mod test {
1953
1978
static SK_STR : & ' static str = "\
1954
1979
01010101010101010001020304050607ffff0000ffff00006363636363636363\
1955
1980
";
1981
+ #[ cfg( fuzzing) ]
1956
1982
static PK_BYTES : [ u8 ; 33 ] = [
1957
1983
0x02 ,
1958
1984
0x18 , 0x84 , 0x57 , 0x81 , 0xf6 , 0x31 , 0xc4 , 0x8f ,
@@ -1975,22 +2001,32 @@ mod test {
1975
2001
#[ cfg( fuzzing) ]
1976
2002
let pk = PublicKey :: from_slice ( & PK_BYTES ) . expect ( "pk" ) ;
1977
2003
1978
- assert_tokens ( & sk. compact ( ) , & [ Token :: BorrowedBytes ( & SK_BYTES [ ..] ) ] ) ;
1979
- assert_tokens ( & sk. compact ( ) , & [ Token :: Bytes ( & SK_BYTES ) ] ) ;
1980
- assert_tokens ( & sk. compact ( ) , & [ Token :: ByteBuf ( & SK_BYTES ) ] ) ;
2004
+ assert_tokens ( & sk. compact ( ) , & [
2005
+ Token :: Tuple { len : 32 } ,
2006
+ Token :: U8 ( 1 ) , Token :: U8 ( 1 ) , Token :: U8 ( 1 ) , Token :: U8 ( 1 ) , Token :: U8 ( 1 ) , Token :: U8 ( 1 ) , Token :: U8 ( 1 ) , Token :: U8 ( 1 ) ,
2007
+ Token :: U8 ( 0 ) , Token :: U8 ( 1 ) , Token :: U8 ( 2 ) , Token :: U8 ( 3 ) , Token :: U8 ( 4 ) , Token :: U8 ( 5 ) , Token :: U8 ( 6 ) , Token :: U8 ( 7 ) ,
2008
+ Token :: U8 ( 0xff ) , Token :: U8 ( 0xff ) , Token :: U8 ( 0 ) , Token :: U8 ( 0 ) , Token :: U8 ( 0xff ) , Token :: U8 ( 0xff ) , Token :: U8 ( 0 ) , Token :: U8 ( 0 ) ,
2009
+ Token :: U8 ( 99 ) , Token :: U8 ( 99 ) , Token :: U8 ( 99 ) , Token :: U8 ( 99 ) , Token :: U8 ( 99 ) , Token :: U8 ( 99 ) , Token :: U8 ( 99 ) , Token :: U8 ( 99 ) ,
2010
+ Token :: TupleEnd
2011
+ ] ) ;
1981
2012
1982
2013
assert_tokens ( & sk. readable ( ) , & [ Token :: BorrowedStr ( SK_STR ) ] ) ;
1983
2014
assert_tokens ( & sk. readable ( ) , & [ Token :: Str ( SK_STR ) ] ) ;
1984
2015
assert_tokens ( & sk. readable ( ) , & [ Token :: String ( SK_STR ) ] ) ;
1985
2016
1986
- assert_tokens ( & pk. compact ( ) , & [ Token :: BorrowedBytes ( & PK_BYTES [ ..] ) ] ) ;
1987
- assert_tokens ( & pk. compact ( ) , & [ Token :: Bytes ( & PK_BYTES ) ] ) ;
1988
- assert_tokens ( & pk. compact ( ) , & [ Token :: ByteBuf ( & PK_BYTES ) ] ) ;
2017
+ assert_tokens ( & pk. compact ( ) , & [
2018
+ Token :: Tuple { len : 33 } ,
2019
+ Token :: U8 ( 0x02 ) ,
2020
+ Token :: U8 ( 0x18 ) , Token :: U8 ( 0x84 ) , Token :: U8 ( 0x57 ) , Token :: U8 ( 0x81 ) , Token :: U8 ( 0xf6 ) , Token :: U8 ( 0x31 ) , Token :: U8 ( 0xc4 ) , Token :: U8 ( 0x8f ) ,
2021
+ Token :: U8 ( 0x1c ) , Token :: U8 ( 0x97 ) , Token :: U8 ( 0x09 ) , Token :: U8 ( 0xe2 ) , Token :: U8 ( 0x30 ) , Token :: U8 ( 0x92 ) , Token :: U8 ( 0x06 ) , Token :: U8 ( 0x7d ) ,
2022
+ Token :: U8 ( 0x06 ) , Token :: U8 ( 0x83 ) , Token :: U8 ( 0x7f ) , Token :: U8 ( 0x30 ) , Token :: U8 ( 0xaa ) , Token :: U8 ( 0x0c ) , Token :: U8 ( 0xd0 ) , Token :: U8 ( 0x54 ) ,
2023
+ Token :: U8 ( 0x4a ) , Token :: U8 ( 0xc8 ) , Token :: U8 ( 0x87 ) , Token :: U8 ( 0xfe ) , Token :: U8 ( 0x91 ) , Token :: U8 ( 0xdd ) , Token :: U8 ( 0xd1 ) , Token :: U8 ( 0x66 ) ,
2024
+ Token :: TupleEnd
2025
+ ] ) ;
1989
2026
1990
2027
assert_tokens ( & pk. readable ( ) , & [ Token :: BorrowedStr ( PK_STR ) ] ) ;
1991
2028
assert_tokens ( & pk. readable ( ) , & [ Token :: Str ( PK_STR ) ] ) ;
1992
2029
assert_tokens ( & pk. readable ( ) , & [ Token :: String ( PK_STR ) ] ) ;
1993
-
1994
2030
}
1995
2031
1996
2032
#[ test]
@@ -2071,10 +2107,14 @@ mod test {
2071
2107
";
2072
2108
2073
2109
let sk = KeyPairWrapper ( KeyPair :: from_seckey_slice ( & crate :: SECP256K1 , & SK_BYTES ) . unwrap ( ) ) ;
2074
-
2075
- assert_tokens ( & sk. compact ( ) , & [ Token :: BorrowedBytes ( & SK_BYTES [ ..] ) ] ) ;
2076
- assert_tokens ( & sk. compact ( ) , & [ Token :: Bytes ( & SK_BYTES ) ] ) ;
2077
- assert_tokens ( & sk. compact ( ) , & [ Token :: ByteBuf ( & SK_BYTES ) ] ) ;
2110
+ assert_tokens ( & sk. compact ( ) , & [
2111
+ Token :: Tuple { len : 32 } ,
2112
+ Token :: U8 ( 1 ) , Token :: U8 ( 1 ) , Token :: U8 ( 1 ) , Token :: U8 ( 1 ) , Token :: U8 ( 1 ) , Token :: U8 ( 1 ) , Token :: U8 ( 1 ) , Token :: U8 ( 1 ) ,
2113
+ Token :: U8 ( 0 ) , Token :: U8 ( 1 ) , Token :: U8 ( 2 ) , Token :: U8 ( 3 ) , Token :: U8 ( 4 ) , Token :: U8 ( 5 ) , Token :: U8 ( 6 ) , Token :: U8 ( 7 ) ,
2114
+ Token :: U8 ( 0xff ) , Token :: U8 ( 0xff ) , Token :: U8 ( 0 ) , Token :: U8 ( 0 ) , Token :: U8 ( 0xff ) , Token :: U8 ( 0xff ) , Token :: U8 ( 0 ) , Token :: U8 ( 0 ) ,
2115
+ Token :: U8 ( 99 ) , Token :: U8 ( 99 ) , Token :: U8 ( 99 ) , Token :: U8 ( 99 ) , Token :: U8 ( 99 ) , Token :: U8 ( 99 ) , Token :: U8 ( 99 ) , Token :: U8 ( 99 ) ,
2116
+ Token :: TupleEnd
2117
+ ] ) ;
2078
2118
2079
2119
assert_tokens ( & sk. readable ( ) , & [ Token :: BorrowedStr ( SK_STR ) ] ) ;
2080
2120
assert_tokens ( & sk. readable ( ) , & [ Token :: Str ( SK_STR ) ] ) ;
@@ -2226,4 +2266,38 @@ mod test {
2226
2266
2227
2267
assert_eq ! ( got, want)
2228
2268
}
2269
+
2270
+ #[ test]
2271
+ #[ cfg( not( fuzzing) ) ]
2272
+ #[ cfg( all( feature = "global-context" , feature = "serde" ) ) ]
2273
+ fn test_serde_x_only_pubkey ( ) {
2274
+ use serde_test:: { Configure , Token , assert_tokens} ;
2275
+
2276
+ static SK_BYTES : [ u8 ; 32 ] = [
2277
+ 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 ,
2278
+ 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 ,
2279
+ 0xff , 0xff , 0 , 0 , 0xff , 0xff , 0 , 0 ,
2280
+ 99 , 99 , 99 , 99 , 99 , 99 , 99 , 99
2281
+ ] ;
2282
+
2283
+ static PK_STR : & ' static str = "\
2284
+ 18845781f631c48f1c9709e23092067d06837f30aa0cd0544ac887fe91ddd166\
2285
+ ";
2286
+
2287
+ let kp = KeyPair :: from_seckey_slice ( & crate :: SECP256K1 , & SK_BYTES ) . unwrap ( ) ;
2288
+ let ( pk, _parity) = XOnlyPublicKey :: from_keypair ( & kp) ;
2289
+
2290
+ assert_tokens ( & pk. compact ( ) , & [
2291
+ Token :: Tuple { len : 32 } ,
2292
+ Token :: U8 ( 0x18 ) , Token :: U8 ( 0x84 ) , Token :: U8 ( 0x57 ) , Token :: U8 ( 0x81 ) , Token :: U8 ( 0xf6 ) , Token :: U8 ( 0x31 ) , Token :: U8 ( 0xc4 ) , Token :: U8 ( 0x8f ) ,
2293
+ Token :: U8 ( 0x1c ) , Token :: U8 ( 0x97 ) , Token :: U8 ( 0x09 ) , Token :: U8 ( 0xe2 ) , Token :: U8 ( 0x30 ) , Token :: U8 ( 0x92 ) , Token :: U8 ( 0x06 ) , Token :: U8 ( 0x7d ) ,
2294
+ Token :: U8 ( 0x06 ) , Token :: U8 ( 0x83 ) , Token :: U8 ( 0x7f ) , Token :: U8 ( 0x30 ) , Token :: U8 ( 0xaa ) , Token :: U8 ( 0x0c ) , Token :: U8 ( 0xd0 ) , Token :: U8 ( 0x54 ) ,
2295
+ Token :: U8 ( 0x4a ) , Token :: U8 ( 0xc8 ) , Token :: U8 ( 0x87 ) , Token :: U8 ( 0xfe ) , Token :: U8 ( 0x91 ) , Token :: U8 ( 0xdd ) , Token :: U8 ( 0xd1 ) , Token :: U8 ( 0x66 ) ,
2296
+ Token :: TupleEnd
2297
+ ] ) ;
2298
+
2299
+ assert_tokens ( & pk. readable ( ) , & [ Token :: BorrowedStr ( PK_STR ) ] ) ;
2300
+ assert_tokens ( & pk. readable ( ) , & [ Token :: Str ( PK_STR ) ] ) ;
2301
+ assert_tokens ( & pk. readable ( ) , & [ Token :: String ( PK_STR ) ] ) ;
2302
+ }
2229
2303
}
0 commit comments