@@ -28,6 +28,9 @@ use Verification;
2828use constants;
2929use ffi:: { self , CPtr } ;
3030
31+ #[ cfg( feature = "serde" ) ]
32+ use serde:: ser:: SerializeTuple ;
33+
3134#[ cfg( feature = "global-context" ) ]
3235use { Message , ecdsa, SECP256K1 } ;
3336#[ cfg( all( feature = "global-context" , feature = "rand-std" ) ) ]
@@ -302,21 +305,25 @@ impl ::serde::Serialize for SecretKey {
302305 let mut buf = [ 0u8 ; 64 ] ;
303306 s. serialize_str ( :: to_hex ( & self . 0 , & mut buf) . expect ( "fixed-size hex serialization" ) )
304307 } else {
305- s. serialize_bytes ( & self [ ..] )
308+ let mut seq = s. serialize_tuple ( constants:: SECRET_KEY_SIZE ) ?;
309+ for byte in self . 0 . iter ( ) {
310+ seq. serialize_element ( byte) ?;
311+ }
312+ seq. end ( )
306313 }
307314 }
308315}
309316
310- #[ cfg( feature = "serde" ) ]
311- #[ cfg_attr( docsrs, doc( cfg( feature = "serde" ) ) ) ]
317+ #[ cfg( all ( feature = "serde" , any ( feature = "std" , feature = "alloc" ) ) ) ]
318+ #[ cfg_attr( docsrs, doc( cfg( all ( feature = "serde" , any ( feature = "std" , feature = "alloc" ) ) ) ) ) ]
312319impl < ' de > :: serde:: Deserialize < ' de > for SecretKey {
313320 fn deserialize < D : :: serde:: Deserializer < ' de > > ( d : D ) -> Result < Self , D :: Error > {
314321 if d. is_human_readable ( ) {
315322 d. deserialize_str ( super :: serde_util:: FromStrVisitor :: new (
316323 "a hex string representing 32 byte SecretKey"
317324 ) )
318325 } else {
319- d. deserialize_bytes ( super :: serde_util:: BytesVisitor :: new (
326+ d. deserialize_seq ( super :: serde_util:: SeqVisitor :: new (
320327 "raw 32 bytes SecretKey" ,
321328 SecretKey :: from_slice
322329 ) )
@@ -615,24 +622,29 @@ impl From<ffi::PublicKey> for PublicKey {
615622#[ cfg_attr( docsrs, doc( cfg( feature = "serde" ) ) ) ]
616623impl :: serde:: Serialize for PublicKey {
617624 fn serialize < S : :: serde:: Serializer > ( & self , s : S ) -> Result < S :: Ok , S :: Error > {
625+ // FIXME: human_readable serializes the whole 64 bytes but non-human-readable does 33 (compressed). Is this correct?
618626 if s. is_human_readable ( ) {
619627 s. collect_str ( self )
620628 } else {
621- s. serialize_bytes ( & self . serialize ( ) )
629+ let mut seq = s. serialize_tuple ( constants:: PUBLIC_KEY_SIZE ) ?;
630+ for byte in self . serialize ( ) . iter ( ) { // Serialize in compressed form.
631+ seq. serialize_element ( & byte) ?;
632+ }
633+ seq. end ( )
622634 }
623635 }
624636}
625637
626- #[ cfg( feature = "serde" ) ]
627- #[ cfg_attr( docsrs, doc( cfg( feature = "serde" ) ) ) ]
638+ #[ cfg( all ( feature = "serde" , any ( feature = "std" , feature = "alloc" ) ) ) ]
639+ #[ cfg_attr( docsrs, doc( cfg( all ( feature = "serde" , any ( feature = "std" , feature = "alloc" ) ) ) ) ) ]
628640impl < ' de > :: serde:: Deserialize < ' de > for PublicKey {
629641 fn deserialize < D : :: serde:: Deserializer < ' de > > ( d : D ) -> Result < PublicKey , D :: Error > {
630642 if d. is_human_readable ( ) {
631643 d. deserialize_str ( super :: serde_util:: FromStrVisitor :: new (
632644 "an ASCII hex string representing a public key"
633645 ) )
634646 } else {
635- d. deserialize_bytes ( super :: serde_util:: BytesVisitor :: new (
647+ d. deserialize_seq ( super :: serde_util:: SeqVisitor :: new (
636648 "a bytestring representing a public key" ,
637649 PublicKey :: from_slice
638650 ) )
@@ -929,21 +941,25 @@ impl ::serde::Serialize for KeyPair {
929941 s. serialize_str ( :: to_hex ( & self . serialize_secret ( ) , & mut buf)
930942 . expect ( "fixed-size hex serialization" ) )
931943 } else {
932- s. serialize_bytes ( & self . 0 [ ..] )
944+ let mut seq = s. serialize_tuple ( constants:: SECRET_KEY_SIZE ) ?;
945+ for byte in self . serialize_secret ( ) . iter ( ) {
946+ seq. serialize_element ( & byte) ?;
947+ }
948+ seq. end ( )
933949 }
934950 }
935951}
936952
937- #[ cfg( feature = "serde" ) ]
938- #[ cfg_attr( docsrs, doc( cfg( feature = "serde" ) ) ) ]
953+ #[ cfg( all ( feature = "serde" , any ( feature = "std" , feature = "alloc" ) ) ) ]
954+ #[ cfg_attr( docsrs, doc( cfg( all ( feature = "serde" , any ( feature = "std" , feature = "alloc" ) ) ) ) ) ]
939955impl < ' de > :: serde:: Deserialize < ' de > for KeyPair {
940956 fn deserialize < D : :: serde:: Deserializer < ' de > > ( d : D ) -> Result < Self , D :: Error > {
941957 if d. is_human_readable ( ) {
942958 d. deserialize_str ( super :: serde_util:: FromStrVisitor :: new (
943959 "a hex string representing 32 byte KeyPair"
944960 ) )
945961 } else {
946- d. deserialize_bytes ( super :: serde_util:: BytesVisitor :: new (
962+ d. deserialize_seq ( super :: serde_util:: SeqVisitor :: new (
947963 "raw 32 bytes KeyPair" ,
948964 |data| unsafe {
949965 let ctx = Secp256k1 :: from_raw_all ( ffi:: secp256k1_context_no_precomp as * mut ffi:: Context ) ;
@@ -1350,24 +1366,29 @@ impl From<::key::PublicKey> for XOnlyPublicKey {
13501366#[ cfg_attr( docsrs, doc( cfg( feature = "serde" ) ) ) ]
13511367impl :: serde:: Serialize for XOnlyPublicKey {
13521368 fn serialize < S : :: serde:: Serializer > ( & self , s : S ) -> Result < S :: Ok , S :: Error > {
1369+ // FIXME: human_readable serializes the whole 64 bytes but non-human-readable does 32 bytes (x co-ordinate). Is this correct?
13531370 if s. is_human_readable ( ) {
13541371 s. collect_str ( self )
13551372 } else {
1356- s. serialize_bytes ( & self . serialize ( ) )
1373+ let mut seq = s. serialize_tuple ( constants:: SCHNORRSIG_PUBLIC_KEY_SIZE ) ?;
1374+ for byte in self . serialize ( ) . iter ( ) {
1375+ seq. serialize_element ( & byte) ?;
1376+ }
1377+ seq. end ( )
13571378 }
13581379 }
13591380}
13601381
1361- #[ cfg( feature = "serde" ) ]
1362- #[ cfg_attr( docsrs, doc( cfg( feature = "serde" ) ) ) ]
1382+ #[ cfg( all ( feature = "serde" , any ( feature = "std" , feature = "alloc" ) ) ) ]
1383+ #[ cfg_attr( docsrs, doc( cfg( all ( feature = "serde" , any ( feature = "std" , feature = "alloc" ) ) ) ) ) ]
13631384impl < ' de > :: serde:: Deserialize < ' de > for XOnlyPublicKey {
13641385 fn deserialize < D : :: serde:: Deserializer < ' de > > ( d : D ) -> Result < Self , D :: Error > {
13651386 if d. is_human_readable ( ) {
13661387 d. deserialize_str ( super :: serde_util:: FromStrVisitor :: new (
13671388 "a hex string representing 32 byte schnorr public key"
13681389 ) )
13691390 } else {
1370- d. deserialize_bytes ( super :: serde_util:: BytesVisitor :: new (
1391+ d. deserialize_seq ( super :: serde_util:: SeqVisitor :: new (
13711392 "raw 32 bytes schnorr public key" ,
13721393 XOnlyPublicKey :: from_slice
13731394 ) )
@@ -1911,6 +1932,7 @@ mod test {
19111932 static SK_STR : & ' static str = "\
19121933 01010101010101010001020304050607ffff0000ffff00006363636363636363\
19131934 ";
1935+ #[ cfg( fuzzing) ]
19141936 static PK_BYTES : [ u8 ; 33 ] = [
19151937 0x02 ,
19161938 0x18 , 0x84 , 0x57 , 0x81 , 0xf6 , 0x31 , 0xc4 , 0x8f ,
@@ -1933,22 +1955,32 @@ mod test {
19331955 #[ cfg( fuzzing) ]
19341956 let pk = PublicKey :: from_slice ( & PK_BYTES ) . expect ( "pk" ) ;
19351957
1936- assert_tokens ( & sk. compact ( ) , & [ Token :: BorrowedBytes ( & SK_BYTES [ ..] ) ] ) ;
1937- assert_tokens ( & sk. compact ( ) , & [ Token :: Bytes ( & SK_BYTES ) ] ) ;
1938- assert_tokens ( & sk. compact ( ) , & [ Token :: ByteBuf ( & SK_BYTES ) ] ) ;
1958+ assert_tokens ( & sk. compact ( ) , & [
1959+ Token :: Tuple { len : 32 } ,
1960+ Token :: U8 ( 1 ) , Token :: U8 ( 1 ) , Token :: U8 ( 1 ) , Token :: U8 ( 1 ) , Token :: U8 ( 1 ) , Token :: U8 ( 1 ) , Token :: U8 ( 1 ) , Token :: U8 ( 1 ) ,
1961+ Token :: U8 ( 0 ) , Token :: U8 ( 1 ) , Token :: U8 ( 2 ) , Token :: U8 ( 3 ) , Token :: U8 ( 4 ) , Token :: U8 ( 5 ) , Token :: U8 ( 6 ) , Token :: U8 ( 7 ) ,
1962+ Token :: U8 ( 0xff ) , Token :: U8 ( 0xff ) , Token :: U8 ( 0 ) , Token :: U8 ( 0 ) , Token :: U8 ( 0xff ) , Token :: U8 ( 0xff ) , Token :: U8 ( 0 ) , Token :: U8 ( 0 ) ,
1963+ Token :: U8 ( 99 ) , Token :: U8 ( 99 ) , Token :: U8 ( 99 ) , Token :: U8 ( 99 ) , Token :: U8 ( 99 ) , Token :: U8 ( 99 ) , Token :: U8 ( 99 ) , Token :: U8 ( 99 ) ,
1964+ Token :: TupleEnd
1965+ ] ) ;
19391966
19401967 assert_tokens ( & sk. readable ( ) , & [ Token :: BorrowedStr ( SK_STR ) ] ) ;
19411968 assert_tokens ( & sk. readable ( ) , & [ Token :: Str ( SK_STR ) ] ) ;
19421969 assert_tokens ( & sk. readable ( ) , & [ Token :: String ( SK_STR ) ] ) ;
19431970
1944- assert_tokens ( & pk. compact ( ) , & [ Token :: BorrowedBytes ( & PK_BYTES [ ..] ) ] ) ;
1945- assert_tokens ( & pk. compact ( ) , & [ Token :: Bytes ( & PK_BYTES ) ] ) ;
1946- assert_tokens ( & pk. compact ( ) , & [ Token :: ByteBuf ( & PK_BYTES ) ] ) ;
1971+ assert_tokens ( & pk. compact ( ) , & [
1972+ Token :: Tuple { len : 33 } ,
1973+ Token :: U8 ( 0x02 ) ,
1974+ Token :: U8 ( 0x18 ) , Token :: U8 ( 0x84 ) , Token :: U8 ( 0x57 ) , Token :: U8 ( 0x81 ) , Token :: U8 ( 0xf6 ) , Token :: U8 ( 0x31 ) , Token :: U8 ( 0xc4 ) , Token :: U8 ( 0x8f ) ,
1975+ Token :: U8 ( 0x1c ) , Token :: U8 ( 0x97 ) , Token :: U8 ( 0x09 ) , Token :: U8 ( 0xe2 ) , Token :: U8 ( 0x30 ) , Token :: U8 ( 0x92 ) , Token :: U8 ( 0x06 ) , Token :: U8 ( 0x7d ) ,
1976+ Token :: U8 ( 0x06 ) , Token :: U8 ( 0x83 ) , Token :: U8 ( 0x7f ) , Token :: U8 ( 0x30 ) , Token :: U8 ( 0xaa ) , Token :: U8 ( 0x0c ) , Token :: U8 ( 0xd0 ) , Token :: U8 ( 0x54 ) ,
1977+ Token :: U8 ( 0x4a ) , Token :: U8 ( 0xc8 ) , Token :: U8 ( 0x87 ) , Token :: U8 ( 0xfe ) , Token :: U8 ( 0x91 ) , Token :: U8 ( 0xdd ) , Token :: U8 ( 0xd1 ) , Token :: U8 ( 0x66 ) ,
1978+ Token :: TupleEnd
1979+ ] ) ;
19471980
19481981 assert_tokens ( & pk. readable ( ) , & [ Token :: BorrowedStr ( PK_STR ) ] ) ;
19491982 assert_tokens ( & pk. readable ( ) , & [ Token :: Str ( PK_STR ) ] ) ;
19501983 assert_tokens ( & pk. readable ( ) , & [ Token :: String ( PK_STR ) ] ) ;
1951-
19521984 }
19531985
19541986 #[ test]
@@ -2027,12 +2059,52 @@ mod test {
20272059
20282060 let sk = KeyPairWrapper ( KeyPair :: from_seckey_slice ( & :: SECP256K1 , & SK_BYTES ) . unwrap ( ) ) ;
20292061
2030- assert_tokens ( & sk. compact ( ) , & [ Token :: BorrowedBytes ( & SK_BYTES [ ..] ) ] ) ;
2031- assert_tokens ( & sk. compact ( ) , & [ Token :: Bytes ( & SK_BYTES ) ] ) ;
2032- assert_tokens ( & sk. compact ( ) , & [ Token :: ByteBuf ( & SK_BYTES ) ] ) ;
2062+ assert_tokens ( & sk. compact ( ) , & [
2063+ Token :: Tuple { len : 32 } ,
2064+ Token :: U8 ( 1 ) , Token :: U8 ( 1 ) , Token :: U8 ( 1 ) , Token :: U8 ( 1 ) , Token :: U8 ( 1 ) , Token :: U8 ( 1 ) , Token :: U8 ( 1 ) , Token :: U8 ( 1 ) ,
2065+ Token :: U8 ( 0 ) , Token :: U8 ( 1 ) , Token :: U8 ( 2 ) , Token :: U8 ( 3 ) , Token :: U8 ( 4 ) , Token :: U8 ( 5 ) , Token :: U8 ( 6 ) , Token :: U8 ( 7 ) ,
2066+ Token :: U8 ( 0xff ) , Token :: U8 ( 0xff ) , Token :: U8 ( 0 ) , Token :: U8 ( 0 ) , Token :: U8 ( 0xff ) , Token :: U8 ( 0xff ) , Token :: U8 ( 0 ) , Token :: U8 ( 0 ) ,
2067+ Token :: U8 ( 99 ) , Token :: U8 ( 99 ) , Token :: U8 ( 99 ) , Token :: U8 ( 99 ) , Token :: U8 ( 99 ) , Token :: U8 ( 99 ) , Token :: U8 ( 99 ) , Token :: U8 ( 99 ) ,
2068+ Token :: TupleEnd
2069+ ] ) ;
20332070
20342071 assert_tokens ( & sk. readable ( ) , & [ Token :: BorrowedStr ( SK_STR ) ] ) ;
20352072 assert_tokens ( & sk. readable ( ) , & [ Token :: Str ( SK_STR ) ] ) ;
20362073 assert_tokens ( & sk. readable ( ) , & [ Token :: String ( SK_STR ) ] ) ;
20372074 }
2075+
2076+ #[ test]
2077+ #[ cfg( all( feature = "global-context" , feature = "serde" ) ) ]
2078+ fn test_serde_x_only_pubkey ( ) {
2079+ use serde_test:: { Configure , Token , assert_tokens} ;
2080+ use key:: KeyPair ;
2081+
2082+ static SK_BYTES : [ u8 ; 32 ] = [
2083+ 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 ,
2084+ 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 ,
2085+ 0xff , 0xff , 0 , 0 , 0xff , 0xff , 0 , 0 ,
2086+ 99 , 99 , 99 , 99 , 99 , 99 , 99 , 99
2087+ ] ;
2088+
2089+ static PK_STR : & ' static str = "\
2090+ 18845781f631c48f1c9709e23092067d06837f30aa0cd0544ac887fe91ddd166\
2091+ ";
2092+
2093+ // FIXME: Do we need to cfg fuzzing/not-fuzzing keypair?
2094+ let kp = KeyPair :: from_seckey_slice ( & :: SECP256K1 , & SK_BYTES ) . unwrap ( ) ;
2095+ let pk = XOnlyPublicKey :: from_keypair ( & kp) ;
2096+
2097+ assert_tokens ( & pk. compact ( ) , & [
2098+ Token :: Tuple { len : 32 } ,
2099+ Token :: U8 ( 0x18 ) , Token :: U8 ( 0x84 ) , Token :: U8 ( 0x57 ) , Token :: U8 ( 0x81 ) , Token :: U8 ( 0xf6 ) , Token :: U8 ( 0x31 ) , Token :: U8 ( 0xc4 ) , Token :: U8 ( 0x8f ) ,
2100+ Token :: U8 ( 0x1c ) , Token :: U8 ( 0x97 ) , Token :: U8 ( 0x09 ) , Token :: U8 ( 0xe2 ) , Token :: U8 ( 0x30 ) , Token :: U8 ( 0x92 ) , Token :: U8 ( 0x06 ) , Token :: U8 ( 0x7d ) ,
2101+ Token :: U8 ( 0x06 ) , Token :: U8 ( 0x83 ) , Token :: U8 ( 0x7f ) , Token :: U8 ( 0x30 ) , Token :: U8 ( 0xaa ) , Token :: U8 ( 0x0c ) , Token :: U8 ( 0xd0 ) , Token :: U8 ( 0x54 ) ,
2102+ Token :: U8 ( 0x4a ) , Token :: U8 ( 0xc8 ) , Token :: U8 ( 0x87 ) , Token :: U8 ( 0xfe ) , Token :: U8 ( 0x91 ) , Token :: U8 ( 0xdd ) , Token :: U8 ( 0xd1 ) , Token :: U8 ( 0x66 ) ,
2103+ Token :: TupleEnd
2104+ ] ) ;
2105+
2106+ assert_tokens ( & pk. readable ( ) , & [ Token :: BorrowedStr ( PK_STR ) ] ) ;
2107+ assert_tokens ( & pk. readable ( ) , & [ Token :: Str ( PK_STR ) ] ) ;
2108+ assert_tokens ( & pk. readable ( ) , & [ Token :: String ( PK_STR ) ] ) ;
2109+ }
20382110}
0 commit comments