diff options
author | Stuart Stock <stuart@int08h.com> | 2018-09-29 23:48:01 -0500 |
---|---|---|
committer | Stuart Stock <stuart@int08h.com> | 2018-09-29 23:48:01 -0500 |
commit | 146ed83d361ffd44d09e3879dde809150bb07a7a (patch) | |
tree | c5d4defd34d1f58feb36a9b5fa5b55e490683749 /src/sign.rs | |
parent | 606b144dc40ed418253d26bb56bcbe9469d04cf1 (diff) | |
download | roughenough-146ed83d361ffd44d09e3879dde809150bb07a7a.zip |
Major refeactoring for better code structure
* Extract distinct types for online and long-term keys
* Extract and create separate configuration trait and implementation(s)
* Clean-ups, renames, tidying
Diffstat (limited to 'src/sign.rs')
-rw-r--r-- | src/sign.rs | 43 |
1 files changed, 37 insertions, 6 deletions
diff --git a/src/sign.rs b/src/sign.rs index a990a2f..ec77dc5 100644 --- a/src/sign.rs +++ b/src/sign.rs @@ -1,4 +1,4 @@ -// Copyright 2017 int08h LLC +// Copyright 2017-2018 int08h LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -25,8 +25,13 @@ extern crate untrusted; use self::ring::signature; use self::ring::signature::Ed25519KeyPair; +use self::ring::rand; +use self::ring::rand::SecureRandom; use self::untrusted::Input; +use std::fmt; +use std::fmt::Formatter; + /// A multi-step (init-update-finish) interface for verifying an /// Ed25519 signature #[derive(Debug)] @@ -67,9 +72,18 @@ pub struct Signer { } impl Signer { - pub fn new(seed: &[u8]) -> Self { + pub fn new() -> Self { + let rng = rand::SystemRandom::new(); + let mut seed = [0u8; 32]; + rng.fill(&mut seed).unwrap(); + + Signer::from_seed(&seed) + } + + pub fn from_seed(seed: &[u8]) -> Self { + let seed_input = Input::from(seed); Signer { - key_pair: Ed25519KeyPair::from_seed_unchecked(Input::from(seed)).unwrap(), + key_pair: Ed25519KeyPair::from_seed_unchecked(seed_input).unwrap(), buf: Vec::with_capacity(256), } } @@ -91,6 +105,23 @@ impl Signer { } } +impl fmt::Display for Signer { + fn fmt(&self, f: &mut Formatter) -> fmt::Result { + write!(f, "{}", hex::encode(self.public_key_bytes())) + } +} + +impl fmt::Debug for Signer { + fn fmt(&self, f: &mut Formatter) -> fmt::Result { + write!( + f, + "Signer({}, {:?})", + hex::encode(self.public_key_bytes()), + self.buf + ) + } +} + #[cfg_attr(rustfmt, rustfmt_skip)] // rustfmt errors on the long signature strings #[cfg(test)] mod test { @@ -138,7 +169,7 @@ mod test { "e5564300c360ac729086e2cc806e828a84877f1eb8e5d974d873e065224901555fb8821590a33bacc61e39701cf9b46bd25bf5f0595bbe24655141438e7a100b" ).unwrap(); - let mut s = Signer::new(&seed); + let mut s = Signer::from_seed(&seed); let sig = s.sign(); assert_eq!(sig, expected_sig); } @@ -154,7 +185,7 @@ mod test { "d9868d52c2bebce5f3fa5a79891970f309cb6591e3e1702a70276fa97c24b3a8e58606c38c9758529da50ee31b8219cba45271c689afa60b0ea26c99db19b00c" ).unwrap(); - let mut s = Signer::new(&seed); + let mut s = Signer::from_seed(&seed); s.update(&message); let sig = s.sign(); assert_eq!(sig, expected_sig); @@ -167,7 +198,7 @@ mod test { let message = "Hello world".as_bytes(); - let mut signer = Signer::new(&seed); + let mut signer = Signer::from_seed(&seed); signer.update(&message); let signature = signer.sign(); |