Skip to content

Commit 9ca7362

Browse files
committed
Fix broken serde::Deserialize and FromStr impl of keyPair
Fixes #491
1 parent 5e1e012 commit 9ca7362

File tree

1 file changed

+16
-8
lines changed

1 file changed

+16
-8
lines changed

src/key.rs

+16-8
Original file line numberDiff line numberDiff line change
@@ -1053,14 +1053,12 @@ impl<'a> From<&'a KeyPair> for PublicKey {
10531053
}
10541054
}
10551055

1056+
#[cfg(feature = "global-context")]
10561057
impl str::FromStr for KeyPair {
10571058
type Err = Error;
10581059

10591060
fn from_str(s: &str) -> Result<Self, Self::Err> {
1060-
let ctx = unsafe {
1061-
Secp256k1::from_raw_all(ffi::secp256k1_context_no_precomp as *mut ffi::Context)
1062-
};
1063-
KeyPair::from_seckey_str(&ctx, s)
1061+
KeyPair::from_seckey_str(SECP256K1, s)
10641062
}
10651063
}
10661064

@@ -1082,7 +1080,7 @@ impl serde::Serialize for KeyPair {
10821080
}
10831081
}
10841082

1085-
#[cfg(feature = "serde")]
1083+
#[cfg(all(feature = "serde", feature = "global-context"))]
10861084
#[cfg_attr(docsrs, doc(cfg(feature = "serde")))]
10871085
impl<'de> serde::Deserialize<'de> for KeyPair {
10881086
fn deserialize<D: serde::Deserializer<'de>>(d: D) -> Result<Self, D::Error> {
@@ -1093,9 +1091,8 @@ impl<'de> serde::Deserialize<'de> for KeyPair {
10931091
} else {
10941092
let visitor = super::serde_util::Tuple32Visitor::new(
10951093
"raw 32 bytes KeyPair",
1096-
|data| unsafe {
1097-
let ctx = Secp256k1::from_raw_all(ffi::secp256k1_context_no_precomp as *mut ffi::Context);
1098-
KeyPair::from_seckey_slice(&ctx, data)
1094+
|data| {
1095+
KeyPair::from_seckey_slice(SECP256K1, data)
10991096
}
11001097
);
11011098
d.deserialize_tuple(constants::SECRET_KEY_SIZE, visitor)
@@ -1630,6 +1627,7 @@ pub mod serde_keypair {
16301627
#[cfg(test)]
16311628
#[allow(unused_imports)]
16321629
mod test {
1630+
use bitcoin_hashes::hex::ToHex;
16331631
use super::*;
16341632

16351633
use core::str::FromStr;
@@ -2431,6 +2429,16 @@ mod test {
24312429
assert_tokens(&pk.readable(), &[Token::Str(PK_STR)]);
24322430
assert_tokens(&pk.readable(), &[Token::String(PK_STR)]);
24332431
}
2432+
2433+
#[test]
2434+
#[cfg(feature = "global-context")]
2435+
fn test_keypair_from_str() {
2436+
let ctx = crate::Secp256k1::new();
2437+
let keypair = KeyPair::new(&ctx, &mut thread_rng());
2438+
let msg = keypair.secret_key().secret_bytes().to_hex();
2439+
let parsed_key: KeyPair = msg.parse().unwrap();
2440+
assert_eq!(parsed_key, keypair);
2441+
}
24342442
}
24352443

24362444
#[cfg(bench)]

0 commit comments

Comments
 (0)