summaryrefslogtreecommitdiff
path: root/src/sign.rs
diff options
context:
space:
mode:
authorStuart Stock <stuart@int08h.com>2018-09-29 23:48:01 -0500
committerStuart Stock <stuart@int08h.com>2018-09-29 23:48:01 -0500
commit146ed83d361ffd44d09e3879dde809150bb07a7a (patch)
treec5d4defd34d1f58feb36a9b5fa5b55e490683749 /src/sign.rs
parent606b144dc40ed418253d26bb56bcbe9469d04cf1 (diff)
downloadroughenough-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.rs43
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();