From 01cddd493be144b516e801943a2edc2bb29f06b1 Mon Sep 17 00:00:00 2001 From: Henry de Valence Date: Tue, 3 Dec 2019 15:01:54 -0800 Subject: [PATCH] Add SecretKey -> PublicKey conversion. --- src/public_key.rs | 6 +++--- src/secret_key.rs | 29 +++++++++++++++++++++++++---- 2 files changed, 28 insertions(+), 7 deletions(-) diff --git a/src/public_key.rs b/src/public_key.rs index a08bfba..c6d773c 100644 --- a/src/public_key.rs +++ b/src/public_key.rs @@ -30,10 +30,10 @@ impl From> for [u8; 32] { #[derive(Copy, Clone, Debug)] pub struct PublicKey { // XXX-jubjub: this should just be Point - point: jubjub::ExtendedPoint, + pub(crate) point: jubjub::ExtendedPoint, // XXX should this just store a PublicKeyBytes? - bytes: [u8; 32], - _marker: PhantomData, + pub(crate) bytes: [u8; 32], + pub(crate) _marker: PhantomData, } impl From> for PublicKeyBytes { diff --git a/src/secret_key.rs b/src/secret_key.rs index d9a64dd..54a6fdd 100644 --- a/src/secret_key.rs +++ b/src/secret_key.rs @@ -65,15 +65,36 @@ impl TryFrom> for SecretKey { impl<'a> From<&'a SecretKey> for PublicKey { fn from(sk: &'a SecretKey) -> PublicKey { - // XXX refactor jubjub API - //let basepoint: jubjub::ExtendedPoint = jubjub::AffinePoint::from_bytes(&crate::constants::SPENDAUTHSIG_BASEPOINT_BYTES).unwrap().into(); - unimplemented!(); + // XXX-jubjub: this is pretty baroque + // XXX-jubjub: provide basepoint tables for generators + let basepoint: jubjub::ExtendedPoint = + jubjub::AffinePoint::from_bytes(crate::constants::SPENDAUTHSIG_BASEPOINT_BYTES) + .unwrap() + .into(); + pk_from_sk_inner(sk, basepoint) } } impl<'a> From<&'a SecretKey> for PublicKey { fn from(sk: &'a SecretKey) -> PublicKey { - unimplemented!(); + let basepoint: jubjub::ExtendedPoint = + jubjub::AffinePoint::from_bytes(crate::constants::BINDINGSIG_BASEPOINT_BYTES) + .unwrap() + .into(); + pk_from_sk_inner(sk, basepoint) + } +} + +fn pk_from_sk_inner( + sk: &SecretKey, + basepoint: jubjub::ExtendedPoint, +) -> PublicKey { + let point = &basepoint * &sk.sk; + let bytes = jubjub::AffinePoint::from(&point).to_bytes(); + PublicKey { + point, + bytes, + _marker: PhantomData, } }