From 52951f72369f983436839e761ac5389e5676d5f9 Mon Sep 17 00:00:00 2001 From: Henry de Valence Date: Tue, 3 Dec 2019 15:39:55 -0800 Subject: [PATCH] Add keygen. --- Cargo.toml | 1 + src/secret_key.rs | 17 +++++++++++++++++ 2 files changed, 18 insertions(+) diff --git a/Cargo.toml b/Cargo.toml index 62d2706..d5d0dcc 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -5,6 +5,7 @@ authors = ["Henry de Valence "] edition = "2018" [dependencies] +rand_core = "0.5" thiserror = "1.0" blake2b_simd = "0.5" jubjub = { git = "https://github.com/zkcrypto/jubjub", rev = "e83f7d2bd136498a27f9d943fea635d8682bf2c6" } diff --git a/src/secret_key.rs b/src/secret_key.rs index 54a6fdd..aae0dc6 100644 --- a/src/secret_key.rs +++ b/src/secret_key.rs @@ -2,6 +2,8 @@ use std::{convert::TryFrom, marker::PhantomData}; use crate::{Binding, Error, PublicKey, Randomizer, Scalar, SigType, Signature, SpendAuth}; +use rand_core::{CryptoRng, RngCore}; + /// A refinement type indicating that the inner `[u8; 32]` represents an /// encoding of a RedJubJub secret key. #[derive(Copy, Clone, PartialEq, Eq, Debug)] @@ -63,6 +65,21 @@ impl TryFrom> for SecretKey { } } +impl From for SecretKey +where + R: RngCore + CryptoRng, + T: SigType, +{ + fn from(mut rng: R) -> SecretKey { + let mut bytes = [0; 64]; + rng.fill_bytes(&mut bytes); + SecretKey { + sk: Scalar::from_bytes_wide(&bytes), + _marker: PhantomData, + } + } +} + impl<'a> From<&'a SecretKey> for PublicKey { fn from(sk: &'a SecretKey) -> PublicKey { // XXX-jubjub: this is pretty baroque