From 8769244febb9721013956fffb79c8d59694049be Mon Sep 17 00:00:00 2001 From: katelyn martin Date: Mon, 18 Mar 2024 15:12:49 -0400 Subject: [PATCH 1/8] tendermint: `VerificationKey` is `From` --- tendermint/src/crypto/ed25519/verification_key.rs | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/tendermint/src/crypto/ed25519/verification_key.rs b/tendermint/src/crypto/ed25519/verification_key.rs index 305614f07..9ef90c3e8 100644 --- a/tendermint/src/crypto/ed25519/verification_key.rs +++ b/tendermint/src/crypto/ed25519/verification_key.rs @@ -51,3 +51,10 @@ impl TryFrom for ed25519_consensus::VerificationKey { .map_err(|_| Error::invalid_key("malformed Ed25519 public key".into())) } } + +#[cfg(feature = "rust-crypto")] +impl From for VerificationKey { + fn from(vk: ed25519_consensus::VerificationKey) -> Self { + Self::new(vk.to_bytes()) + } +} From ad24ea540275fbd4a53ef3b63bc4169de033b212 Mon Sep 17 00:00:00 2001 From: katelyn martin Date: Mon, 18 Mar 2024 15:14:53 -0400 Subject: [PATCH 2/8] tendermint: `PublicKey` is `From` --- tendermint/src/public_key.rs | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/tendermint/src/public_key.rs b/tendermint/src/public_key.rs index dc287d4d0..fce77ddd1 100644 --- a/tendermint/src/public_key.rs +++ b/tendermint/src/public_key.rs @@ -240,6 +240,13 @@ impl From for PublicKey { } } +#[cfg(feature = "rust-crypto")] +impl From for PublicKey { + fn from(vk: ed25519_consensus::VerificationKey) -> PublicKey { + PublicKey::Ed25519(vk.into()) + } +} + impl PartialOrd for PublicKey { fn partial_cmp(&self, other: &PublicKey) -> Option { Some(self.cmp(other)) From 80b373d451f425b07c6de264c93bc96cbf873c8b Mon Sep 17 00:00:00 2001 From: katelyn martin Date: Mon, 18 Mar 2024 15:24:06 -0400 Subject: [PATCH 3/8] tendermint: `PublicKey::from_ed25519_consensus` --- tendermint/src/public_key.rs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/tendermint/src/public_key.rs b/tendermint/src/public_key.rs index fce77ddd1..8b35ede57 100644 --- a/tendermint/src/public_key.rs +++ b/tendermint/src/public_key.rs @@ -175,6 +175,12 @@ impl PublicKey { Ed25519::try_from(bytes).map(PublicKey::Ed25519).ok() } + /// From an [`ed25519_consensus::VerificationKey`] + #[cfg(feature = "rust-crypto")] + pub fn from_ed25519_consensus(vk: ed25519_consensus::VerificationKey) -> Self { + Self::from(vk) + } + /// Get Ed25519 public key pub fn ed25519(self) -> Option { #[allow(unreachable_patterns)] From 35110f850fb25f70929c7d25eb0da7a945f818d1 Mon Sep 17 00:00:00 2001 From: katelyn martin Date: Mon, 18 Mar 2024 15:29:29 -0400 Subject: [PATCH 4/8] tendermint: private `SigningKey::new()` constructor this mimics the same constructor found on `VerificationKey`, for consistency. --- tendermint/src/crypto/ed25519/signing_key.rs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/tendermint/src/crypto/ed25519/signing_key.rs b/tendermint/src/crypto/ed25519/signing_key.rs index 034557859..2658d3173 100644 --- a/tendermint/src/crypto/ed25519/signing_key.rs +++ b/tendermint/src/crypto/ed25519/signing_key.rs @@ -7,6 +7,11 @@ use crate::Error; pub struct SigningKey([u8; 32]); impl SigningKey { + #[allow(dead_code)] + pub(super) fn new(bytes: [u8; 32]) -> Self { + Self(bytes) + } + pub fn as_bytes(&self) -> &[u8] { &self.0 } From 4f1a95a426181e99518652e94caf9b558fdcf1c2 Mon Sep 17 00:00:00 2001 From: katelyn martin Date: Mon, 18 Mar 2024 15:31:18 -0400 Subject: [PATCH 5/8] tendermint: `SigningKey` is `From` --- tendermint/src/crypto/ed25519/signing_key.rs | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/tendermint/src/crypto/ed25519/signing_key.rs b/tendermint/src/crypto/ed25519/signing_key.rs index 2658d3173..a7a18007e 100644 --- a/tendermint/src/crypto/ed25519/signing_key.rs +++ b/tendermint/src/crypto/ed25519/signing_key.rs @@ -46,3 +46,10 @@ impl TryFrom for ed25519_consensus::SigningKey { Ok(ed25519_consensus::SigningKey::from(src.0)) } } + +#[cfg(feature = "rust-crypto")] +impl From for SigningKey { + fn from(sk: ed25519_consensus::SigningKey) -> Self { + Self::new(sk.to_bytes()) + } +} From 649dd37e5b34269ce6c38c3811ba37f4428c21da Mon Sep 17 00:00:00 2001 From: katelyn martin Date: Mon, 18 Mar 2024 15:31:51 -0400 Subject: [PATCH 6/8] tendermint: `PrivateKey` is `From` --- tendermint/src/private_key.rs | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/tendermint/src/private_key.rs b/tendermint/src/private_key.rs index 052899d56..4e3ec8b0c 100644 --- a/tendermint/src/private_key.rs +++ b/tendermint/src/private_key.rs @@ -70,6 +70,13 @@ impl PrivateKey { } } +#[cfg(feature = "rust-crypto")] +impl From for PrivateKey { + fn from(sk: ed25519_consensus::SigningKey) -> Self { + Self::Ed25519(sk.into()) + } +} + /// Serialize a Secp256k1 privkey as Base64 #[cfg(feature = "secp256k1")] fn serialize_secp256k1_privkey(signing_key: &Secp256k1, serializer: S) -> Result From 7b3c2a9391accb1a7b745cf207bfdc662e635eb6 Mon Sep 17 00:00:00 2001 From: katelyn martin Date: Mon, 18 Mar 2024 15:50:28 -0400 Subject: [PATCH 7/8] tendermint: `PrivateKey::from_ed25519_consensus` --- tendermint/src/private_key.rs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/tendermint/src/private_key.rs b/tendermint/src/private_key.rs index 4e3ec8b0c..4b2bc5510 100644 --- a/tendermint/src/private_key.rs +++ b/tendermint/src/private_key.rs @@ -68,6 +68,12 @@ impl PrivateKey { PrivateKey::Secp256k1(_signing_key) => None, } } + + /// From an [`ed25519_consensus::SigningKey`] + #[cfg(feature = "rust-crypto")] + pub fn from_ed25519_consensus(sk: ed25519_consensus::SigningKey) -> Self { + Self::Ed25519(sk.into()) + } } #[cfg(feature = "rust-crypto")] From 34e0c1373e93f35dd7bc49b134646801b9d874f3 Mon Sep 17 00:00:00 2001 From: Romain Ruetschi Date: Tue, 19 Mar 2024 10:20:46 +0100 Subject: [PATCH 8/8] Add changelog entry --- .../features/1401-ed25519-consensus-from-impls.md | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 .changelog/unreleased/features/1401-ed25519-consensus-from-impls.md diff --git a/.changelog/unreleased/features/1401-ed25519-consensus-from-impls.md b/.changelog/unreleased/features/1401-ed25519-consensus-from-impls.md new file mode 100644 index 000000000..be5bc5b21 --- /dev/null +++ b/.changelog/unreleased/features/1401-ed25519-consensus-from-impls.md @@ -0,0 +1,6 @@ +- `[tendermint]` Add the following impls for `ed25519-consensus`: + * `From` for `tendermint::SigningKey` + * `From` for `tendermint::PublicKey` + * `From` for `tendermint::VerificationKey` + ([\#1401](https://github.com/informalsystems/tendermint-rs/pull/1401))