From 49d812d62cfdf445df9ac8b5c43839aefdb1b6b5 Mon Sep 17 00:00:00 2001 From: drHuangMHT Date: Fri, 5 May 2023 20:53:24 +0800 Subject: [PATCH 1/2] allow im/export secp256k1 keys in protobuf --- identity/src/keypair.rs | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/identity/src/keypair.rs b/identity/src/keypair.rs index 0b36ea31be9..b9a260b6669 100644 --- a/identity/src/keypair.rs +++ b/identity/src/keypair.rs @@ -236,7 +236,10 @@ impl Keypair { #[cfg(all(feature = "rsa", not(target_arch = "wasm32")))] Self::Rsa(_) => return Err(DecodingError::encoding_unsupported("RSA")), #[cfg(feature = "secp256k1")] - Self::Secp256k1(_) => return Err(DecodingError::encoding_unsupported("secp256k1")), + Self::Secp256k1(data) => proto::PrivateKey { + Type: proto::KeyType::Secp256k1, + Data: data.secret().to_bytes().to_vec(), + }, #[cfg(feature = "ecdsa")] Self::Ecdsa(data) => proto::PrivateKey { Type: proto::KeyType::ECDSA, @@ -269,7 +272,12 @@ impl Keypair { Err(DecodingError::missing_feature("ed25519")) } proto::KeyType::RSA => Err(DecodingError::decoding_unsupported("RSA")), - proto::KeyType::Secp256k1 => Err(DecodingError::decoding_unsupported("secp256k1")), + proto::KeyType::Secp256k1 => { + #[cfg(feature = "secp256k1")] + return secp256k1::SecretKey::try_from_bytes(&mut private_key.Data) + .map(|key| Keypair::Secp256k1(key.into())); + Err(DecodingError::missing_feature("secp256k1")) + } proto::KeyType::ECDSA => { #[cfg(feature = "ecdsa")] return ecdsa::SecretKey::try_decode_der(&mut private_key.Data) @@ -726,6 +734,18 @@ mod tests { roundtrip_protobuf_encoding(&priv_key, &pub_key); } + #[test] + #[cfg(all(feature = "secp256k1", feature = "peerid"))] + fn keypair_protobuf_roundtrip_secp256k1() { + let priv_key = Keypair::from_protobuf_encoding(&hex_literal::hex!( + "0802122053DADF1D5A164D6B4ACDB15E24AA4C5B1D3461BDBD42ABEDB0A4404D56CED8FB" + )) + .unwrap(); + let pub_key = PublicKey::try_decode_protobuf(&hex_literal::hex!("08021221037777e994e452c21604f91de093ce415f5432f701dd8cd1a7a6fea0e630bfca99")).unwrap(); + + roundtrip_protobuf_encoding(&priv_key, &pub_key); + } + #[cfg(feature = "peerid")] fn roundtrip_protobuf_encoding(private_key: &Keypair, public_key: &PublicKey) { assert_eq!(&private_key.public(), public_key); From 7274d0dd9eeaa0d0fc8f53a4451ea56d3056fc79 Mon Sep 17 00:00:00 2001 From: drHuangMHT Date: Fri, 5 May 2023 20:58:44 +0800 Subject: [PATCH 2/2] formatting --- identity/src/keypair.rs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/identity/src/keypair.rs b/identity/src/keypair.rs index b9a260b6669..e2cdb399788 100644 --- a/identity/src/keypair.rs +++ b/identity/src/keypair.rs @@ -741,7 +741,10 @@ mod tests { "0802122053DADF1D5A164D6B4ACDB15E24AA4C5B1D3461BDBD42ABEDB0A4404D56CED8FB" )) .unwrap(); - let pub_key = PublicKey::try_decode_protobuf(&hex_literal::hex!("08021221037777e994e452c21604f91de093ce415f5432f701dd8cd1a7a6fea0e630bfca99")).unwrap(); + let pub_key = PublicKey::try_decode_protobuf(&hex_literal::hex!( + "08021221037777e994e452c21604f91de093ce415f5432f701dd8cd1a7a6fea0e630bfca99" + )) + .unwrap(); roundtrip_protobuf_encoding(&priv_key, &pub_key); }