From 7b2c43987973e738cec1eb5b14bf9b2b90660bab Mon Sep 17 00:00:00 2001 From: Tony Arcieri Date: Wed, 2 Sep 2020 12:45:30 -0700 Subject: [PATCH] ecdsa: add serialization methods to SigningKey/VerifyKey --- ecdsa/src/sign.rs | 16 +++++++++------- ecdsa/src/verify.rs | 13 ++++++++++++- 2 files changed, 21 insertions(+), 8 deletions(-) diff --git a/ecdsa/src/sign.rs b/ecdsa/src/sign.rs index 0b2d100a..81b2f436 100644 --- a/ecdsa/src/sign.rs +++ b/ecdsa/src/sign.rs @@ -12,7 +12,7 @@ use crate::{ use core::convert::TryInto; use elliptic_curve::{ generic_array::ArrayLength, ops::Invert, scalar::NonZeroScalar, weierstrass::Curve, - zeroize::Zeroize, Arithmetic, FromBytes, FromDigest, SecretKey, + zeroize::Zeroize, Arithmetic, ElementBytes, FromBytes, FromDigest, SecretKey, }; use signature::{ digest::{BlockInput, Digest, FixedOutput, Reset, Update}, @@ -20,12 +20,9 @@ use signature::{ }; #[cfg(feature = "rand")] -use { - elliptic_curve::ElementBytes, - signature::{ - rand_core::{CryptoRng, RngCore}, - RandomizedDigestSigner, RandomizedSigner, - }, +use signature::{ + rand_core::{CryptoRng, RngCore}, + RandomizedDigestSigner, RandomizedSigner, }; #[cfg(feature = "verify")] @@ -77,6 +74,11 @@ where public_key: C::AffinePoint::generator() * self.secret_scalar, } } + + /// Serialize this [`SigningKey`] as bytes + pub fn to_bytes(&self) -> ElementBytes { + self.secret_scalar.to_bytes() + } } impl DigestSigner> for SigningKey diff --git a/ecdsa/src/verify.rs b/ecdsa/src/verify.rs index 0925fa9a..3353134d 100644 --- a/ecdsa/src/verify.rs +++ b/ecdsa/src/verify.rs @@ -11,7 +11,9 @@ use core::ops::Add; use elliptic_curve::{ consts::U1, generic_array::ArrayLength, - sec1::{EncodedPoint, FromEncodedPoint, UncompressedPointSize, UntaggedPointSize}, + sec1::{ + EncodedPoint, FromEncodedPoint, ToEncodedPoint, UncompressedPointSize, UntaggedPointSize, + }, weierstrass::Curve, Arithmetic, FromDigest, }; @@ -50,6 +52,15 @@ where Err(Error::new()) } } + + /// Serialize this [`VerifyKey`] as a SEC1 [`EncodedPoint`], optionally + /// applying point compression. + pub fn to_encoded_point(&self, compress: bool) -> EncodedPoint + where + C::AffinePoint: ToEncodedPoint, + { + self.public_key.to_encoded_point(compress) + } } impl DigestVerifier> for VerifyKey