Skip to content
This repository was archived by the owner on Nov 20, 2023. It is now read-only.

Commit 280a5d6

Browse files
vorot93tarcieri
andauthored
Use ECDSA APIs from k256 (#15)
* Use new APIs from k256 * Update src/keys/k256.rs Co-authored-by: Tony Arcieri <[email protected]> * fmt Co-authored-by: Tony Arcieri <[email protected]>
1 parent 2d429d2 commit 280a5d6

File tree

3 files changed

+26
-29
lines changed

3 files changed

+26
-29
lines changed

Cargo.toml

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@ rlp = "0.4.5"
2424
tiny-keccak = { version = "2.0.2", features = ["keccak"] }
2525
zeroize = "1.1.0"
2626
libsecp256k1 = { version = "0.3.5", optional = true }
27-
ecdsa = { version = "0.8", optional = true }
2827
sha3 = { version = "0.9", optional = true }
2928
k256-crate = { package = "k256", version = "0.5", features = ["ecdsa"], optional = true }
3029
serde = { version = "1.0.110", optional = true }
@@ -38,7 +37,7 @@ c-secp256k1 = { package = "secp256k1", features = ["rand-std"], version = "0.19"
3837
default = ["serde", "libsecp256k1" ]
3938
ed25519 = ["ed25519-dalek"]
4039
rust-secp256k1 = ["c-secp256k1"]
41-
k256 = ["k256-crate", "ecdsa", "sha3"]
40+
k256 = ["k256-crate", "sha3"]
4241

4342
[lib]
4443
name = "enr"

src/keys/k256.rs

Lines changed: 22 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,14 @@
1-
//! An implementation for `EnrKey` for `k256::SecretKey`
1+
//! An implementation for `EnrKey` for `k256::ecdsa::SigningKey`
22
33
use super::{EnrKey, EnrPublicKey, SigningError};
44
use crate::Key;
5-
use ecdsa::elliptic_curve::sec1::{FromEncodedPoint, ToEncodedPoint};
6-
use k256_crate::ecdsa::signature::{DigestVerifier, RandomizedDigestSigner, Signature};
5+
use k256_crate::{
6+
ecdsa::{
7+
signature::{DigestVerifier, RandomizedDigestSigner, Signature as _},
8+
Signature, SigningKey, VerifyKey,
9+
},
10+
EncodedPoint,
11+
};
712
use rand::rngs::OsRng;
813
use rlp::DecoderError;
914
use sha3::{Digest, Keccak256};
@@ -12,24 +17,21 @@ use std::{collections::BTreeMap, convert::TryFrom};
1217
/// The ENR key that stores the public key in the ENR record.
1318
pub const ENR_KEY: &str = "secp256k1";
1419

15-
type Signer = ecdsa::SigningKey<k256_crate::Secp256k1>;
16-
type Verifier = ecdsa::VerifyKey<k256_crate::Secp256k1>;
17-
18-
impl EnrKey for k256_crate::SecretKey {
19-
type PublicKey = k256_crate::EncodedPoint;
20+
impl EnrKey for SigningKey {
21+
type PublicKey = VerifyKey;
2022

2123
fn sign_v4(&self, msg: &[u8]) -> Result<Vec<u8>, SigningError> {
2224
// take a keccak256 hash then sign.
2325
let digest = Keccak256::new().chain(msg);
24-
let signature: k256_crate::ecdsa::Signature = Signer::new(self.to_bytes().as_slice())
25-
.map_err(|_| SigningError::new("failed to create signer"))?
26-
.sign_digest_with_rng(&mut OsRng, digest);
26+
let signature: Signature = self
27+
.try_sign_digest_with_rng(&mut OsRng, digest)
28+
.map_err(|_| SigningError::new("failed to sign"))?;
2729

2830
Ok(signature.as_bytes().to_vec())
2931
}
3032

3133
fn public(&self) -> Self::PublicKey {
32-
k256_crate::EncodedPoint::from_secret_key(self, false)
34+
self.verify_key()
3335
}
3436

3537
fn enr_to_public(content: &BTreeMap<Key, Vec<u8>>) -> Result<Self::PublicKey, DecoderError> {
@@ -38,34 +40,30 @@ impl EnrKey for k256_crate::SecretKey {
3840
.ok_or_else(|| DecoderError::Custom("Unknown signature"))?;
3941

4042
// should be encoded in compressed form, i.e 33 byte raw secp256k1 public key
41-
Ok(k256_crate::EncodedPoint::from_bytes(pubkey_bytes)
43+
Ok(VerifyKey::new(pubkey_bytes)
4244
.map_err(|_| DecoderError::Custom("Invalid Secp256k1 Signature"))?)
4345
}
4446
}
4547

46-
impl EnrPublicKey for k256_crate::EncodedPoint {
48+
impl EnrPublicKey for VerifyKey {
4749
fn verify_v4(&self, msg: &[u8], sig: &[u8]) -> bool {
48-
let digest = Keccak256::new().chain(msg);
4950
if let Ok(sig) = k256_crate::ecdsa::Signature::try_from(sig) {
50-
if let Ok(verifier) = Verifier::new(self.as_bytes()) {
51-
if verifier.verify_digest(digest, &sig).is_ok() {
52-
return true;
53-
}
54-
}
51+
return self
52+
.verify_digest(Keccak256::new().chain(msg), &sig)
53+
.is_ok();
5554
}
5655
false
5756
}
5857

5958
fn encode(&self) -> Vec<u8> {
6059
// serialize in compressed form: 33 bytes
61-
self.compress().as_bytes().to_vec()
60+
self.to_bytes().to_vec()
6261
}
6362

6463
fn encode_uncompressed(&self) -> Vec<u8> {
65-
k256_crate::AffinePoint::from_encoded_point(self)
64+
EncodedPoint::from(self)
65+
.to_untagged_bytes()
6666
.unwrap()
67-
.to_encoded_point(false)
68-
.as_bytes()[1..]
6967
.to_vec()
7068
}
7169

src/lib.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -932,7 +932,7 @@ mod tests {
932932
hex::decode("03ca634cae0d49acb401d8a4c6b6fe8c55b70d115bf400769cc1400f3258cd3138")
933933
.unwrap();
934934

935-
let enr = rlp::decode::<Enr<k256_crate::SecretKey>>(&valid_record).unwrap();
935+
let enr = rlp::decode::<Enr<k256_crate::ecdsa::SigningKey>>(&valid_record).unwrap();
936936

937937
let pubkey = enr.public_key().encode();
938938

@@ -985,7 +985,7 @@ mod tests {
985985
hex::decode("a448f24c6d18e575453db13171562b71999873db5b286df957af199ec94617f7")
986986
.unwrap();
987987

988-
let enr = text.parse::<Enr<k256_crate::SecretKey>>().unwrap();
988+
let enr = text.parse::<Enr<k256_crate::ecdsa::SigningKey>>().unwrap();
989989
let pubkey = enr.public_key().encode();
990990
assert_eq!(enr.ip(), Some(Ipv4Addr::new(127, 0, 0, 1)));
991991
assert_eq!(enr.ip6(), None);
@@ -1116,7 +1116,7 @@ mod tests {
11161116
#[cfg(feature = "k256")]
11171117
#[test]
11181118
fn test_encode_decode_k256() {
1119-
let key = k256_crate::SecretKey::random(&mut rand::rngs::OsRng);
1119+
let key = k256_crate::ecdsa::SigningKey::random(&mut rand::rngs::OsRng);
11201120
let ip = Ipv4Addr::new(127, 0, 0, 1);
11211121
let tcp = 3000;
11221122

0 commit comments

Comments
 (0)