This commit is contained in:
Frederic Jacobs
2016-12-01 19:08:42 +01:00
committed by GitHub
parent 4ddf030e15
commit 2084932607
20 changed files with 485 additions and 154 deletions

View File

@ -1,6 +1,6 @@
[package]
name = "lamport_sigs"
version = "0.1.1"
version = "1.0.0"
authors = ["Frederic Jacobs <github@fredericjacobs.com>"]
description = "lamport_sigs is a Rust implementation of the Lamport one-time signature scheme."
license = "BSD-3-Clause"

View File

@ -0,0 +1,10 @@
(function() {var implementors = {};
implementors["lamport_sigs"] = ["impl <a class='trait' href='https://doc.rust-lang.org/nightly/core/clone/trait.Clone.html' title='core::clone::Clone'>Clone</a> for <a class='struct' href='lamport_sigs/struct.PublicKey.html' title='lamport_sigs::PublicKey'>PublicKey</a>","impl <a class='trait' href='https://doc.rust-lang.org/nightly/core/clone/trait.Clone.html' title='core::clone::Clone'>Clone</a> for <a class='struct' href='lamport_sigs/struct.PrivateKey.html' title='lamport_sigs::PrivateKey'>PrivateKey</a>",];
if (window.register_implementors) {
window.register_implementors(implementors);
} else {
window.pending_implementors = implementors;
}
})()

View File

@ -1,5 +1,5 @@
(function() {var implementors = {};
implementors["lamport"] = ["impl&lt;T:&nbsp;Digest + <a class='trait' href='https://doc.rust-lang.org/nightly/core/clone/trait.Clone.html' title='core::clone::Clone'>Clone</a>&gt; <a class='trait' href='https://doc.rust-lang.org/nightly/core/cmp/trait.PartialEq.html' title='core::cmp::PartialEq'>PartialEq</a> for <a class='struct' href='lamport/struct.PrivateKey.html' title='lamport::PrivateKey'>PrivateKey</a>&lt;T&gt;",];
implementors["lamport_sigs"] = ["impl <a class='trait' href='https://doc.rust-lang.org/nightly/core/cmp/trait.PartialEq.html' title='core::cmp::PartialEq'>PartialEq</a> for <a class='struct' href='lamport_sigs/struct.PrivateKey.html' title='lamport_sigs::PrivateKey'>PrivateKey</a>",];
if (window.register_implementors) {
window.register_implementors(implementors);

View File

@ -0,0 +1,10 @@
(function() {var implementors = {};
implementors["lamport_sigs"] = ["impl <a class='trait' href='https://doc.rust-lang.org/nightly/core/convert/trait.From.html' title='core::convert::From'>From</a>&lt;<a class='struct' href='lamport_sigs/struct.PublicKey.html' title='lamport_sigs::PublicKey'>PublicKey</a>&gt; for <a class='struct' href='https://doc.rust-lang.org/nightly/collections/vec/struct.Vec.html' title='collections::vec::Vec'>Vec</a>&lt;<a class='primitive' href='https://doc.rust-lang.org/nightly/std/primitive.u8.html'>u8</a>&gt;",];
if (window.register_implementors) {
window.register_implementors(implementors);
} else {
window.pending_implementors = implementors;
}
})()

View File

@ -0,0 +1,10 @@
(function() {var implementors = {};
implementors["lamport_sigs"] = ["impl <a class='trait' href='https://doc.rust-lang.org/nightly/core/fmt/trait.Debug.html' title='core::fmt::Debug'>Debug</a> for <a class='struct' href='lamport_sigs/struct.PublicKey.html' title='lamport_sigs::PublicKey'>PublicKey</a>","impl <a class='trait' href='https://doc.rust-lang.org/nightly/core/fmt/trait.Debug.html' title='core::fmt::Debug'>Debug</a> for <a class='struct' href='lamport_sigs/struct.PrivateKey.html' title='lamport_sigs::PrivateKey'>PrivateKey</a>",];
if (window.register_implementors) {
window.register_implementors(implementors);
} else {
window.pending_implementors = implementors;
}
})()

View File

@ -1,5 +1,5 @@
(function() {var implementors = {};
implementors["lamport"] = ["impl&lt;T:&nbsp;Digest + <a class='trait' href='https://doc.rust-lang.org/nightly/core/clone/trait.Clone.html' title='core::clone::Clone'>Clone</a>&gt; <a class='trait' href='https://doc.rust-lang.org/nightly/core/ops/trait.Drop.html' title='core::ops::Drop'>Drop</a> for <a class='struct' href='lamport/struct.PrivateKey.html' title='lamport::PrivateKey'>PrivateKey</a>&lt;T&gt;",];
implementors["lamport_sigs"] = ["impl <a class='trait' href='https://doc.rust-lang.org/nightly/core/ops/trait.Drop.html' title='core::ops::Drop'>Drop</a> for <a class='struct' href='lamport_sigs/struct.PrivateKey.html' title='lamport_sigs::PrivateKey'>PrivateKey</a>",];
if (window.register_implementors) {
window.register_implementors(implementors);

View File

@ -1 +0,0 @@
initSidebarItems({"struct":[["PrivateKey","A one-time signing private key"],["PublicKey","A one-time signing public key"]]});

View File

@ -0,0 +1,10 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta http-equiv="refresh" content="0;URL=type.LamportSignatureData.html">
</head>
<body>
<p>Redirecting to <a href="type.LamportSignatureData.html">type.LamportSignatureData.html</a>...</p>
<script>location.replace("type.LamportSignatureData.html" + location.search + location.hash);</script>
</body>
</html>

View File

@ -4,10 +4,10 @@
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="generator" content="rustdoc">
<meta name="description" content="API documentation for the Rust `lamport` crate.">
<meta name="keywords" content="rust, rustlang, rust-lang, lamport">
<meta name="description" content="API documentation for the Rust `lamport_sigs` crate.">
<meta name="keywords" content="rust, rustlang, rust-lang, lamport_sigs">
<title>lamport - Rust</title>
<title>lamport_sigs - Rust</title>
<link rel="stylesheet" type="text/css" href="../rustdoc.css">
<link rel="stylesheet" type="text/css" href="../main.css">
@ -28,7 +28,7 @@
<nav class="sidebar">
<p class='location'></p><script>window.sidebarCurrent = {name: 'lamport', ty: 'mod', relpath: '../'};</script>
<p class='location'></p><script>window.sidebarCurrent = {name: 'lamport_sigs', ty: 'mod', relpath: '../'};</script>
</nav>
<nav class="sub">
@ -43,27 +43,35 @@
</nav>
<section id='main' class="content mod">
<h1 class='fqn'><span class='in-band'>Crate <a class='mod' href=''>lamport</a></span><span class='out-of-band'><span id='render-detail'>
<h1 class='fqn'><span class='in-band'>Crate <a class='mod' href=''>lamport_sigs</a></span><span class='out-of-band'><span id='render-detail'>
<a id="toggle-all-docs" href="javascript:void(0)" title="collapse all docs">
[<span class='inner'>&#x2212;</span>]
</a>
</span><a id='src-0' class='srclink' href='../src/lamport/src/lib.rs.html#1-201' title='goto source code'>[src]</a></span></h1>
</span><a id='src-0' class='srclink' href='../src/lamport_sigs/src/lib.rs.html#1-248' title='goto source code'>[src]</a></span></h1>
<div class='docblock'><p><em>lamport</em> implements one-time hash-based signatures using the Lamport signature scheme.</p>
</div><h2 id='structs' class='section-header'><a href="#structs">Structs</a></h2>
<table>
<tr class=' module-item'>
<td><a class='struct' href='struct.PrivateKey.html'
title='lamport::PrivateKey'>PrivateKey</a></td>
title='lamport_sigs::PrivateKey'>PrivateKey</a></td>
<td class='docblock-short'>
<p>A one-time signing private key</p>
</td>
</tr>
<tr class=' module-item'>
<td><a class='struct' href='struct.PublicKey.html'
title='lamport::PublicKey'>PublicKey</a></td>
title='lamport_sigs::PublicKey'>PublicKey</a></td>
<td class='docblock-short'>
<p>A one-time signing public key</p>
</td>
</tr></table><h2 id='types' class='section-header'><a href="#types">Type Definitions</a></h2>
<table>
<tr class=' module-item'>
<td><a class='type' href='type.LamportSignatureData.html'
title='lamport_sigs::LamportSignatureData'>LamportSignatureData</a></td>
<td class='docblock-short'>
<p>A type alias defining a Lamport signature</p>
</td>
</tr></table></section>
<section id='search' class="content hidden"></section>
@ -119,10 +127,12 @@
<script>
window.rootPath = "../";
window.currentCrate = "lamport";
window.currentCrate = "lamport_sigs";
window.playgroundUrl = "";
</script>
<script src="../jquery.js"></script>
<script src="../main.js"></script>
<script defer src="../search-index.js"></script>
</body>
</html>

View File

@ -0,0 +1 @@
initSidebarItems({"struct":[["PrivateKey","A one-time signing private key"],["PublicKey","A one-time signing public key"]],"type":[["LamportSignatureData","A type alias defining a Lamport signature"]]});

View File

@ -4,10 +4,10 @@
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="generator" content="rustdoc">
<meta name="description" content="API documentation for the Rust `PrivateKey` struct in crate `lamport`.">
<meta name="description" content="API documentation for the Rust `PrivateKey` struct in crate `lamport_sigs`.">
<meta name="keywords" content="rust, rustlang, rust-lang, PrivateKey">
<title>lamport::PrivateKey - Rust</title>
<title>lamport_sigs::PrivateKey - Rust</title>
<link rel="stylesheet" type="text/css" href="../rustdoc.css">
<link rel="stylesheet" type="text/css" href="../main.css">
@ -28,7 +28,7 @@
<nav class="sidebar">
<p class='location'><a href='index.html'>lamport</a></p><script>window.sidebarCurrent = {name: 'PrivateKey', ty: 'struct', relpath: ''};</script><script defer src="sidebar-items.js"></script>
<p class='location'><a href='index.html'>lamport_sigs</a></p><script>window.sidebarCurrent = {name: 'PrivateKey', ty: 'struct', relpath: ''};</script><script defer src="sidebar-items.js"></script>
</nav>
<nav class="sub">
@ -43,25 +43,33 @@
</nav>
<section id='main' class="content struct">
<h1 class='fqn'><span class='in-band'>Struct <a href='index.html'>lamport</a>::<wbr><a class='struct' href=''>PrivateKey</a></span><span class='out-of-band'><span id='render-detail'>
<h1 class='fqn'><span class='in-band'>Struct <a href='index.html'>lamport_sigs</a>::<wbr><a class='struct' href=''>PrivateKey</a></span><span class='out-of-band'><span id='render-detail'>
<a id="toggle-all-docs" href="javascript:void(0)" title="collapse all docs">
[<span class='inner'>&#x2212;</span>]
</a>
</span><a id='src-14' class='srclink' href='../src/lamport/src/lib.rs.html#18-23' title='goto source code'>[src]</a></span></h1>
<pre class='rust struct'>pub struct PrivateKey&lt;T:&nbsp;Digest + <a class='trait' href='https://doc.rust-lang.org/nightly/core/clone/trait.Clone.html' title='core::clone::Clone'>Clone</a>&gt; { /* fields omitted */ }</pre><div class='docblock'><p>A one-time signing private key</p>
</div><h2 id='methods'>Methods</h2><h3 class='impl'><span class='in-band'><code>impl&lt;T:&nbsp;Digest + <a class='trait' href='https://doc.rust-lang.org/nightly/core/clone/trait.Clone.html' title='core::clone::Clone'>Clone</a>&gt; <a class='struct' href='../lamport/struct.PrivateKey.html' title='lamport::PrivateKey'>PrivateKey</a>&lt;T&gt;</code></span><span class='out-of-band'><div class='ghost'></div><a id='src-34' class='srclink' href='../src/lamport/src/lib.rs.html#66-148' title='goto source code'>[src]</a></span></h3>
<div class='impl-items'><h4 id='method.new' class='method'><span id='new.v' class='invisible'><code>fn <a href='#method.new' class='fnname'>new</a>(digest: T) -&gt; <a class='struct' href='../lamport/struct.PrivateKey.html' title='lamport::PrivateKey'>PrivateKey</a>&lt;T&gt;</code></span></h4>
</span><a id='src-28' class='srclink' href='../src/lamport_sigs/src/lib.rs.html#31-37' title='goto source code'>[src]</a></span></h1>
<pre class='rust struct'>pub struct PrivateKey { /* fields omitted */ }</pre><div class='docblock'><p>A one-time signing private key</p>
</div><h2 id='methods'>Methods</h2><h3 class='impl'><span class='in-band'><code>impl <a class='struct' href='../lamport_sigs/struct.PrivateKey.html' title='lamport_sigs::PrivateKey'>PrivateKey</a></code></span><span class='out-of-band'><div class='ghost'></div><a id='src-92' class='srclink' href='../src/lamport_sigs/src/lib.rs.html#126-210' title='goto source code'>[src]</a></span></h3>
<div class='impl-items'><h4 id='method.new' class='method'><span id='new.v' class='invisible'><code>fn <a href='#method.new' class='fnname'>new</a>(algorithm: &amp;'static <a class='struct' href='https://briansmith.org/rustdoc/ring/digest/struct.Algorithm.html' title='ring::digest::Algorithm'>Algorithm</a>) -&gt; <a class='struct' href='../lamport_sigs/struct.PrivateKey.html' title='lamport_sigs::PrivateKey'>PrivateKey</a></code></span></h4>
<div class='docblock'><p>Generates a new random one-time signing key. This method can panic if OS RNG fails</p>
</div><h4 id='method.public_key' class='method'><span id='public_key.v' class='invisible'><code>fn <a href='#method.public_key' class='fnname'>public_key</a>(&amp;self) -&gt; <a class='struct' href='../lamport/struct.PublicKey.html' title='lamport::PublicKey'>PublicKey</a>&lt;T&gt;</code></span></h4>
</div><h4 id='method.public_key' class='method'><span id='public_key.v' class='invisible'><code>fn <a href='#method.public_key' class='fnname'>public_key</a>(&amp;self) -&gt; <a class='struct' href='../lamport_sigs/struct.PublicKey.html' title='lamport_sigs::PublicKey'>PublicKey</a></code></span></h4>
<div class='docblock'><p>Returns the public key associated with this private key</p>
</div><h4 id='method.sign' class='method'><span id='sign.v' class='invisible'><code>fn <a href='#method.sign' class='fnname'>sign</a>(&amp;mut self, data: <a class='primitive' href='https://doc.rust-lang.org/nightly/std/primitive.slice.html'>&amp;[</a><a class='primitive' href='https://doc.rust-lang.org/nightly/std/primitive.u8.html'>u8</a><a class='primitive' href='https://doc.rust-lang.org/nightly/std/primitive.slice.html'>]</a>) -&gt; <a class='enum' href='https://doc.rust-lang.org/nightly/core/result/enum.Result.html' title='core::result::Result'>Result</a>&lt;<a class='struct' href='https://doc.rust-lang.org/nightly/collections/vec/struct.Vec.html' title='collections::vec::Vec'>Vec</a>&lt;<a class='struct' href='https://doc.rust-lang.org/nightly/collections/vec/struct.Vec.html' title='collections::vec::Vec'>Vec</a>&lt;<a class='primitive' href='https://doc.rust-lang.org/nightly/std/primitive.u8.html'>u8</a>&gt;&gt;, &amp;'static <a class='primitive' href='https://doc.rust-lang.org/nightly/std/primitive.str.html'>str</a>&gt;</code></span></h4>
</div><h4 id='method.sign' class='method'><span id='sign.v' class='invisible'><code>fn <a href='#method.sign' class='fnname'>sign</a>(&amp;mut self, data: <a class='primitive' href='https://doc.rust-lang.org/nightly/std/primitive.slice.html'>&amp;[</a><a class='primitive' href='https://doc.rust-lang.org/nightly/std/primitive.u8.html'>u8</a><a class='primitive' href='https://doc.rust-lang.org/nightly/std/primitive.slice.html'>]</a>) -&gt; <a class='enum' href='https://doc.rust-lang.org/nightly/core/result/enum.Result.html' title='core::result::Result'>Result</a>&lt;<a class='type' href='../lamport_sigs/type.LamportSignatureData.html' title='lamport_sigs::LamportSignatureData'>LamportSignatureData</a>,&nbsp;&amp;'static <a class='primitive' href='https://doc.rust-lang.org/nightly/std/primitive.str.html'>str</a>&gt;</code></span></h4>
<div class='docblock'><p>Signs the data with the private key and returns the result if successful.
If unsuccesful, an explanation string is returned</p>
</div></div><h2 id='implementations'>Trait Implementations</h2><h3 class='impl'><span class='in-band'><code>impl&lt;T:&nbsp;Digest + <a class='trait' href='https://doc.rust-lang.org/nightly/core/clone/trait.Clone.html' title='core::clone::Clone'>Clone</a>&gt; <a class='trait' href='https://doc.rust-lang.org/nightly/core/ops/trait.Drop.html' title='core::ops::Drop'>Drop</a> for <a class='struct' href='../lamport/struct.PrivateKey.html' title='lamport::PrivateKey'>PrivateKey</a>&lt;T&gt;</code></span><span class='out-of-band'><div class='ghost'></div><a id='src-71' class='srclink' href='../src/lamport/src/lib.rs.html#150-163' title='goto source code'>[src]</a></span></h3>
</div></div><h2 id='implementations'>Trait Implementations</h2><h3 class='impl'><span class='in-band'><code>impl <a class='trait' href='https://doc.rust-lang.org/nightly/core/clone/trait.Clone.html' title='core::clone::Clone'>Clone</a> for <a class='struct' href='../lamport_sigs/struct.PrivateKey.html' title='lamport_sigs::PrivateKey'>PrivateKey</a></code></span><span class='out-of-band'><div class='ghost'></div><a id='src-33' class='srclink' href='../src/lamport_sigs/src/lib.rs.html#30' title='goto source code'>[src]</a></span></h3>
<div class='impl-items'><h4 id='method.clone' class='method'><span id='clone.v' class='invisible'><code>fn <a href='https://doc.rust-lang.org/nightly/core/clone/trait.Clone.html#tymethod.clone' class='fnname'>clone</a>(&amp;self) -&gt; <a class='struct' href='../lamport_sigs/struct.PrivateKey.html' title='lamport_sigs::PrivateKey'>PrivateKey</a></code></span></h4>
<div class='docblock'><p>Returns a copy of the value. <a href="https://doc.rust-lang.org/nightly/core/clone/trait.Clone.html#tymethod.clone">Read more</a></p>
</div><h4 id='method.clone_from' class='method'><span id='clone_from.v' class='invisible'><code>fn <a href='https://doc.rust-lang.org/nightly/core/clone/trait.Clone.html#method.clone_from' class='fnname'>clone_from</a>(&amp;mut self, source: &amp;Self)</code><div class='since' title='Stable since Rust version 1.0.0'>1.0.0</div></span></h4>
<div class='docblock'><p>Performs copy-assignment from <code>source</code>. <a href="https://doc.rust-lang.org/nightly/core/clone/trait.Clone.html#method.clone_from">Read more</a></p>
</div></div><h3 class='impl'><span class='in-band'><code>impl <a class='trait' href='https://doc.rust-lang.org/nightly/core/fmt/trait.Debug.html' title='core::fmt::Debug'>Debug</a> for <a class='struct' href='../lamport_sigs/struct.PrivateKey.html' title='lamport_sigs::PrivateKey'>PrivateKey</a></code></span><span class='out-of-band'><div class='ghost'></div><a id='src-40' class='srclink' href='../src/lamport_sigs/src/lib.rs.html#30' title='goto source code'>[src]</a></span></h3>
<div class='impl-items'><h4 id='method.fmt' class='method'><span id='fmt.v' class='invisible'><code>fn <a href='https://doc.rust-lang.org/nightly/core/fmt/trait.Debug.html#tymethod.fmt' class='fnname'>fmt</a>(&amp;self, __arg_0: &amp;mut <a class='struct' href='https://doc.rust-lang.org/nightly/core/fmt/struct.Formatter.html' title='core::fmt::Formatter'>Formatter</a>) -&gt; <a class='type' href='https://doc.rust-lang.org/nightly/core/fmt/type.Result.html' title='core::fmt::Result'>Result</a></code></span></h4>
<div class='docblock'><p>Formats the value using the given formatter.</p>
</div></div><h3 class='impl'><span class='in-band'><code>impl <a class='trait' href='https://doc.rust-lang.org/nightly/core/ops/trait.Drop.html' title='core::ops::Drop'>Drop</a> for <a class='struct' href='../lamport_sigs/struct.PrivateKey.html' title='lamport_sigs::PrivateKey'>PrivateKey</a></code></span><span class='out-of-band'><div class='ghost'></div><a id='src-131' class='srclink' href='../src/lamport_sigs/src/lib.rs.html#212-225' title='goto source code'>[src]</a></span></h3>
<div class='impl-items'><h4 id='method.drop' class='method'><span id='drop.v' class='invisible'><code>fn <a href='https://doc.rust-lang.org/nightly/core/ops/trait.Drop.html#tymethod.drop' class='fnname'>drop</a>(&amp;mut self)</code></span></h4>
<div class='docblock'><p>A method called when the value goes out of scope. <a href="https://doc.rust-lang.org/nightly/core/ops/trait.Drop.html#tymethod.drop">Read more</a></p>
</div></div><h3 class='impl'><span class='in-band'><code>impl&lt;T:&nbsp;Digest + <a class='trait' href='https://doc.rust-lang.org/nightly/core/clone/trait.Clone.html' title='core::clone::Clone'>Clone</a>&gt; <a class='trait' href='https://doc.rust-lang.org/nightly/core/cmp/trait.PartialEq.html' title='core::cmp::PartialEq'>PartialEq</a> for <a class='struct' href='../lamport/struct.PrivateKey.html' title='lamport::PrivateKey'>PrivateKey</a>&lt;T&gt;</code></span><span class='out-of-band'><div class='ghost'></div><a id='src-80' class='srclink' href='../src/lamport/src/lib.rs.html#165-182' title='goto source code'>[src]</a></span></h3>
<div class='impl-items'><h4 id='method.eq' class='method'><span id='eq.v' class='invisible'><code>fn <a href='https://doc.rust-lang.org/nightly/core/cmp/trait.PartialEq.html#tymethod.eq' class='fnname'>eq</a>(&amp;self, other: &amp;<a class='struct' href='../lamport/struct.PrivateKey.html' title='lamport::PrivateKey'>PrivateKey</a>&lt;T&gt;) -&gt; <a class='primitive' href='https://doc.rust-lang.org/nightly/std/primitive.bool.html'>bool</a></code></span></h4>
</div></div><h3 class='impl'><span class='in-band'><code>impl <a class='trait' href='https://doc.rust-lang.org/nightly/core/cmp/trait.PartialEq.html' title='core::cmp::PartialEq'>PartialEq</a> for <a class='struct' href='../lamport_sigs/struct.PrivateKey.html' title='lamport_sigs::PrivateKey'>PrivateKey</a></code></span><span class='out-of-band'><div class='ghost'></div><a id='src-139' class='srclink' href='../src/lamport_sigs/src/lib.rs.html#227-245' title='goto source code'>[src]</a></span></h3>
<div class='impl-items'><h4 id='method.eq' class='method'><span id='eq.v' class='invisible'><code>fn <a href='https://doc.rust-lang.org/nightly/core/cmp/trait.PartialEq.html#tymethod.eq' class='fnname'>eq</a>(&amp;self, other: &amp;<a class='struct' href='../lamport_sigs/struct.PrivateKey.html' title='lamport_sigs::PrivateKey'>PrivateKey</a>) -&gt; <a class='primitive' href='https://doc.rust-lang.org/nightly/std/primitive.bool.html'>bool</a></code></span></h4>
<div class='docblock'><p>This method tests for <code>self</code> and <code>other</code> values to be equal, and is used by <code>==</code>. <a href="https://doc.rust-lang.org/nightly/core/cmp/trait.PartialEq.html#tymethod.eq">Read more</a></p>
</div><h4 id='method.ne' class='method'><span id='ne.v' class='invisible'><code>fn <a href='https://doc.rust-lang.org/nightly/core/cmp/trait.PartialEq.html#method.ne' class='fnname'>ne</a>(&amp;self, other: &amp;Rhs) -&gt; <a class='primitive' href='https://doc.rust-lang.org/nightly/std/primitive.bool.html'>bool</a></code><div class='since' title='Stable since Rust version 1.0.0'>1.0.0</div></span></h4>
<div class='docblock'><p>This method tests for <code>!=</code>.</p>
@ -120,10 +128,12 @@ If unsuccesful, an explanation string is returned</p>
<script>
window.rootPath = "../";
window.currentCrate = "lamport";
window.currentCrate = "lamport_sigs";
window.playgroundUrl = "";
</script>
<script src="../jquery.js"></script>
<script src="../main.js"></script>
<script defer src="../search-index.js"></script>
</body>
</html>

View File

@ -0,0 +1,131 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="generator" content="rustdoc">
<meta name="description" content="API documentation for the Rust `PublicKey` struct in crate `lamport_sigs`.">
<meta name="keywords" content="rust, rustlang, rust-lang, PublicKey">
<title>lamport_sigs::PublicKey - Rust</title>
<link rel="stylesheet" type="text/css" href="../rustdoc.css">
<link rel="stylesheet" type="text/css" href="../main.css">
</head>
<body class="rustdoc">
<!--[if lte IE 8]>
<div class="warning">
This old browser is unsupported and will most likely display funky
things.
</div>
<![endif]-->
<nav class="sidebar">
<p class='location'><a href='index.html'>lamport_sigs</a></p><script>window.sidebarCurrent = {name: 'PublicKey', ty: 'struct', relpath: ''};</script><script defer src="sidebar-items.js"></script>
</nav>
<nav class="sub">
<form class="search-form js-only">
<div class="search-container">
<input class="search-input" name="search"
autocomplete="off"
placeholder="Click or press S to search, ? for more options…"
type="search">
</div>
</form>
</nav>
<section id='main' class="content struct">
<h1 class='fqn'><span class='in-band'>Struct <a href='index.html'>lamport_sigs</a>::<wbr><a class='struct' href=''>PublicKey</a></span><span class='out-of-band'><span id='render-detail'>
<a id="toggle-all-docs" href="javascript:void(0)" title="collapse all docs">
[<span class='inner'>&#x2212;</span>]
</a>
</span><a id='src-10' class='srclink' href='../src/lamport_sigs/src/lib.rs.html#23-27' title='goto source code'>[src]</a></span></h1>
<pre class='rust struct'>pub struct PublicKey { /* fields omitted */ }</pre><div class='docblock'><p>A one-time signing public key</p>
</div><h2 id='methods'>Methods</h2><h3 class='impl'><span class='in-band'><code>impl <a class='struct' href='../lamport_sigs/struct.PublicKey.html' title='lamport_sigs::PublicKey'>PublicKey</a></code></span><span class='out-of-band'><div class='ghost'></div><a id='src-52' class='srclink' href='../src/lamport_sigs/src/lib.rs.html#45-124' title='goto source code'>[src]</a></span></h3>
<div class='impl-items'><h4 id='method.from_vec' class='method'><span id='from_vec.v' class='invisible'><code>fn <a href='#method.from_vec' class='fnname'>from_vec</a>(vec: <a class='struct' href='https://doc.rust-lang.org/nightly/collections/vec/struct.Vec.html' title='collections::vec::Vec'>Vec</a>&lt;<a class='primitive' href='https://doc.rust-lang.org/nightly/std/primitive.u8.html'>u8</a>&gt;, algorithm: &amp;'static <a class='struct' href='https://briansmith.org/rustdoc/ring/digest/struct.Algorithm.html' title='ring::digest::Algorithm'>Algorithm</a>) -&gt; <a class='enum' href='https://doc.rust-lang.org/nightly/core/option/enum.Option.html' title='core::option::Option'>Option</a>&lt;<a class='struct' href='../lamport_sigs/struct.PublicKey.html' title='lamport_sigs::PublicKey'>PublicKey</a>&gt;</code></span></h4>
<div class='docblock'><p>Intializes a public key with a byte vector.
Returns <code>None</code> if it couldn&#39;t parse the provided data</p>
</div><h4 id='method.to_bytes' class='method'><span id='to_bytes.v' class='invisible'><code>fn <a href='#method.to_bytes' class='fnname'>to_bytes</a>(&amp;self) -&gt; <a class='struct' href='https://doc.rust-lang.org/nightly/collections/vec/struct.Vec.html' title='collections::vec::Vec'>Vec</a>&lt;<a class='primitive' href='https://doc.rust-lang.org/nightly/std/primitive.u8.html'>u8</a>&gt;</code></span></h4>
<div class='docblock'><p>Serializes a public key into a byte vector</p>
</div><h4 id='method.verify_signature' class='method'><span id='verify_signature.v' class='invisible'><code>fn <a href='#method.verify_signature' class='fnname'>verify_signature</a>(&amp;self, signature: &amp;<a class='type' href='../lamport_sigs/type.LamportSignatureData.html' title='lamport_sigs::LamportSignatureData'>LamportSignatureData</a>, data: <a class='primitive' href='https://doc.rust-lang.org/nightly/std/primitive.slice.html'>&amp;[</a><a class='primitive' href='https://doc.rust-lang.org/nightly/std/primitive.u8.html'>u8</a><a class='primitive' href='https://doc.rust-lang.org/nightly/std/primitive.slice.html'>]</a>) -&gt; <a class='primitive' href='https://doc.rust-lang.org/nightly/std/primitive.bool.html'>bool</a></code></span></h4>
<div class='docblock'><p>Verifies that the signature of the data is correctly signed with the given key</p>
</div></div><h2 id='implementations'>Trait Implementations</h2><h3 class='impl'><span class='in-band'><code>impl <a class='trait' href='https://doc.rust-lang.org/nightly/core/clone/trait.Clone.html' title='core::clone::Clone'>Clone</a> for <a class='struct' href='../lamport_sigs/struct.PublicKey.html' title='lamport_sigs::PublicKey'>PublicKey</a></code></span><span class='out-of-band'><div class='ghost'></div><a id='src-14' class='srclink' href='../src/lamport_sigs/src/lib.rs.html#22' title='goto source code'>[src]</a></span></h3>
<div class='impl-items'><h4 id='method.clone' class='method'><span id='clone.v' class='invisible'><code>fn <a href='https://doc.rust-lang.org/nightly/core/clone/trait.Clone.html#tymethod.clone' class='fnname'>clone</a>(&amp;self) -&gt; <a class='struct' href='../lamport_sigs/struct.PublicKey.html' title='lamport_sigs::PublicKey'>PublicKey</a></code></span></h4>
<div class='docblock'><p>Returns a copy of the value. <a href="https://doc.rust-lang.org/nightly/core/clone/trait.Clone.html#tymethod.clone">Read more</a></p>
</div><h4 id='method.clone_from' class='method'><span id='clone_from.v' class='invisible'><code>fn <a href='https://doc.rust-lang.org/nightly/core/clone/trait.Clone.html#method.clone_from' class='fnname'>clone_from</a>(&amp;mut self, source: &amp;Self)</code><div class='since' title='Stable since Rust version 1.0.0'>1.0.0</div></span></h4>
<div class='docblock'><p>Performs copy-assignment from <code>source</code>. <a href="https://doc.rust-lang.org/nightly/core/clone/trait.Clone.html#method.clone_from">Read more</a></p>
</div></div><h3 class='impl'><span class='in-band'><code>impl <a class='trait' href='https://doc.rust-lang.org/nightly/core/fmt/trait.Debug.html' title='core::fmt::Debug'>Debug</a> for <a class='struct' href='../lamport_sigs/struct.PublicKey.html' title='lamport_sigs::PublicKey'>PublicKey</a></code></span><span class='out-of-band'><div class='ghost'></div><a id='src-20' class='srclink' href='../src/lamport_sigs/src/lib.rs.html#22' title='goto source code'>[src]</a></span></h3>
<div class='impl-items'><h4 id='method.fmt' class='method'><span id='fmt.v' class='invisible'><code>fn <a href='https://doc.rust-lang.org/nightly/core/fmt/trait.Debug.html#tymethod.fmt' class='fnname'>fmt</a>(&amp;self, __arg_0: &amp;mut <a class='struct' href='https://doc.rust-lang.org/nightly/core/fmt/struct.Formatter.html' title='core::fmt::Formatter'>Formatter</a>) -&gt; <a class='type' href='https://doc.rust-lang.org/nightly/core/fmt/type.Result.html' title='core::fmt::Result'>Result</a></code></span></h4>
<div class='docblock'><p>Formats the value using the given formatter.</p>
</div></div></section>
<section id='search' class="content hidden"></section>
<section class="footer"></section>
<aside id="help" class="hidden">
<div>
<h1 class="hidden">Help</h1>
<div class="shortcuts">
<h2>Keyboard Shortcuts</h2>
<dl>
<dt>?</dt>
<dd>Show this help dialog</dd>
<dt>S</dt>
<dd>Focus the search field</dd>
<dt>&larrb;</dt>
<dd>Move up in search results</dd>
<dt>&rarrb;</dt>
<dd>Move down in search results</dd>
<dt>&#9166;</dt>
<dd>Go to active search result</dd>
<dt>+</dt>
<dd>Collapse/expand all sections</dd>
</dl>
</div>
<div class="infos">
<h2>Search Tricks</h2>
<p>
Prefix searches with a type followed by a colon (e.g.
<code>fn:</code>) to restrict the search to a given type.
</p>
<p>
Accepted types are: <code>fn</code>, <code>mod</code>,
<code>struct</code>, <code>enum</code>,
<code>trait</code>, <code>type</code>, <code>macro</code>,
and <code>const</code>.
</p>
<p>
Search functions by type signature (e.g.
<code>vec -> usize</code> or <code>* -> vec</code>)
</p>
</div>
</div>
</aside>
<script>
window.rootPath = "../";
window.currentCrate = "lamport_sigs";
window.playgroundUrl = "";
</script>
<script src="../jquery.js"></script>
<script src="../main.js"></script>
<script defer src="../search-index.js"></script>
</body>
</html>

View File

@ -4,10 +4,10 @@
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="generator" content="rustdoc">
<meta name="description" content="API documentation for the Rust `PublicKey` struct in crate `lamport`.">
<meta name="keywords" content="rust, rustlang, rust-lang, PublicKey">
<meta name="description" content="API documentation for the Rust `LamportSignatureData` type in crate `lamport_sigs`.">
<meta name="keywords" content="rust, rustlang, rust-lang, LamportSignatureData">
<title>lamport::PublicKey - Rust</title>
<title>lamport_sigs::LamportSignatureData - Rust</title>
<link rel="stylesheet" type="text/css" href="../rustdoc.css">
<link rel="stylesheet" type="text/css" href="../main.css">
@ -28,7 +28,7 @@
<nav class="sidebar">
<p class='location'><a href='index.html'>lamport</a></p><script>window.sidebarCurrent = {name: 'PublicKey', ty: 'struct', relpath: ''};</script><script defer src="sidebar-items.js"></script>
<p class='location'><a href='index.html'>lamport_sigs</a></p><script>window.sidebarCurrent = {name: 'LamportSignatureData', ty: 'type', relpath: ''};</script><script defer src="sidebar-items.js"></script>
</nav>
<nav class="sub">
@ -42,17 +42,14 @@
</form>
</nav>
<section id='main' class="content struct">
<h1 class='fqn'><span class='in-band'>Struct <a href='index.html'>lamport</a>::<wbr><a class='struct' href=''>PublicKey</a></span><span class='out-of-band'><span id='render-detail'>
<section id='main' class="content type">
<h1 class='fqn'><span class='in-band'>Type Definition <a href='index.html'>lamport_sigs</a>::<wbr><a class='type' href=''>LamportSignatureData</a></span><span class='out-of-band'><span id='render-detail'>
<a id="toggle-all-docs" href="javascript:void(0)" title="collapse all docs">
[<span class='inner'>&#x2212;</span>]
</a>
</span><a id='src-9' class='srclink' href='../src/lamport/src/lib.rs.html#11-15' title='goto source code'>[src]</a></span></h1>
<pre class='rust struct'>pub struct PublicKey&lt;T:&nbsp;Digest + <a class='trait' href='https://doc.rust-lang.org/nightly/core/clone/trait.Clone.html' title='core::clone::Clone'>Clone</a>&gt; { /* fields omitted */ }</pre><div class='docblock'><p>A one-time signing public key</p>
</div><h2 id='methods'>Methods</h2><h3 class='impl'><span class='in-band'><code>impl&lt;T:&nbsp;Digest + <a class='trait' href='https://doc.rust-lang.org/nightly/core/clone/trait.Clone.html' title='core::clone::Clone'>Clone</a>&gt; <a class='struct' href='../lamport/struct.PublicKey.html' title='lamport::PublicKey'>PublicKey</a>&lt;T&gt;</code></span><span class='out-of-band'><div class='ghost'></div><a id='src-20' class='srclink' href='../src/lamport/src/lib.rs.html#25-64' title='goto source code'>[src]</a></span></h3>
<div class='impl-items'><h4 id='method.verify_signature' class='method'><span id='verify_signature.v' class='invisible'><code>fn <a href='#method.verify_signature' class='fnname'>verify_signature</a>(&amp;self, signature: &amp;<a class='struct' href='https://doc.rust-lang.org/nightly/collections/vec/struct.Vec.html' title='collections::vec::Vec'>Vec</a>&lt;<a class='struct' href='https://doc.rust-lang.org/nightly/collections/vec/struct.Vec.html' title='collections::vec::Vec'>Vec</a>&lt;<a class='primitive' href='https://doc.rust-lang.org/nightly/std/primitive.u8.html'>u8</a>&gt;&gt;, data: <a class='primitive' href='https://doc.rust-lang.org/nightly/std/primitive.slice.html'>&amp;[</a><a class='primitive' href='https://doc.rust-lang.org/nightly/std/primitive.u8.html'>u8</a><a class='primitive' href='https://doc.rust-lang.org/nightly/std/primitive.slice.html'>]</a>) -&gt; <a class='primitive' href='https://doc.rust-lang.org/nightly/std/primitive.bool.html'>bool</a></code></span></h4>
<div class='docblock'><p>Verifies that the signature of the data is correctly signed with the given key</p>
</div></div></section>
</span><a id='src-9' class='srclink' href='../src/lamport_sigs/src/lib.rs.html#19' title='goto source code'>[src]</a></span></h1>
<pre class='rust typedef'>type LamportSignatureData = <a class='struct' href='https://doc.rust-lang.org/nightly/collections/vec/struct.Vec.html' title='collections::vec::Vec'>Vec</a>&lt;<a class='struct' href='https://doc.rust-lang.org/nightly/collections/vec/struct.Vec.html' title='collections::vec::Vec'>Vec</a>&lt;<a class='primitive' href='https://doc.rust-lang.org/nightly/std/primitive.u8.html'>u8</a>&gt;&gt;;</pre><div class='docblock'><p>A type alias defining a Lamport signature</p>
</div></section>
<section id='search' class="content hidden"></section>
<section class="footer"></section>
@ -107,10 +104,12 @@
<script>
window.rootPath = "../";
window.currentCrate = "lamport";
window.currentCrate = "lamport_sigs";
window.playgroundUrl = "";
</script>
<script src="../jquery.js"></script>
<script src="../main.js"></script>
<script defer src="../search-index.js"></script>
</body>
</html>

43
docs/playpen.js Normal file
View File

@ -0,0 +1,43 @@
// Copyright 2014-2015 The Rust Project Developers. See the COPYRIGHT
// file at the top-level directory of this distribution and at
// http://rust-lang.org/COPYRIGHT.
//
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.
/*jslint browser: true, es5: true */
/*globals $: true, rootPath: true */
document.addEventListener('DOMContentLoaded', function() {
'use strict';
if (!window.playgroundUrl) {
return;
}
var featureRegexp = new RegExp('^\s*#!\\[feature\\(\.*?\\)\\]');
var elements = document.querySelectorAll('pre.rust-example-rendered');
Array.prototype.forEach.call(elements, function(el) {
el.onmouseover = function(e) {
if (el.contains(e.relatedTarget)) {
return;
}
var a = el.querySelectorAll('a.test-arrow')[0];
var code = el.previousElementSibling.textContent;
var channel = '';
if (featureRegexp.test(code)) {
channel = '&version=nightly';
}
a.setAttribute('href', window.playgroundUrl + '?code=' +
encodeURIComponent(code) + channel);
};
});
});

View File

@ -570,11 +570,8 @@ pre.rust .self, pre.rust .bool-val, pre.rust .prelude-val,
pre.rust .attribute, pre.rust .attribute .ident { color: #C82829; }
pre.rust .macro, pre.rust .macro-nonterminal { color: #3E999F; }
pre.rust .lifetime { color: #B76514; }
pre.rust .question-mark {
color: #ff9011;
font-weight: bold;
}
.rusttest { display: none; }
pre.rust { position: relative; }
a.test-arrow {
background-color: rgba(78, 139, 202, 0.2);
@ -588,7 +585,6 @@ a.test-arrow {
}
a.test-arrow:hover{
background-color: #4e8bca;
text-decoration: none;
}
.section-header:hover a:after {

View File

@ -1,3 +1,3 @@
var searchIndex = {};
searchIndex["lamport"] = {"doc":"*lamport* implements one-time hash-based signatures using the Lamport signature scheme.","items":[[3,"PublicKey","lamport","A one-time signing public key",null,null],[3,"PrivateKey","","A one-time signing private key",null,null],[11,"verify_signature","","Verifies that the signature of the data is correctly signed with the given key",0,null],[11,"new","","Generates a new random one-time signing key. This method can panic if OS RNG fails",1,{"inputs":[{"name":"t"}],"output":{"name":"privatekey"}}],[11,"public_key","","Returns the public key associated with this private key",1,null],[11,"sign","","Signs the data with the private key and returns the result if successful.\nIf unsuccesful, an explanation string is returned",1,null],[11,"drop","","",1,null],[11,"eq","","",1,null]],"paths":[[3,"PublicKey"],[3,"PrivateKey"]]};
searchIndex["lamport_sigs"] = {"doc":"*lamport* implements one-time hash-based signatures using the Lamport signature scheme.","items":[[3,"PublicKey","lamport_sigs","A one-time signing public key",null,null],[3,"PrivateKey","","A one-time signing private key",null,null],[6,"LamportSignatureData","","A type alias defining a Lamport signature",null,null],[11,"clone","","",0,null],[11,"fmt","","",0,null],[11,"clone","","",1,null],[11,"fmt","","",1,null],[11,"from_vec","","Intializes a public key with a byte vector.\nReturns `None` if it couldn&#39;t parse the provided data",0,{"inputs":[{"name":"vec"},{"name":"algorithm"}],"output":{"name":"option"}}],[11,"to_bytes","","Serializes a public key into a byte vector",0,null],[11,"verify_signature","","Verifies that the signature of the data is correctly signed with the given key",0,null],[11,"new","","Generates a new random one-time signing key. This method can panic if OS RNG fails",1,{"inputs":[{"name":"algorithm"}],"output":{"name":"privatekey"}}],[11,"public_key","","Returns the public key associated with this private key",1,null],[11,"sign","","Signs the data with the private key and returns the result if successful.\nIf unsuccesful, an explanation string is returned",1,null],[11,"drop","","",1,null],[11,"eq","","",1,null]],"paths":[[3,"PublicKey"],[3,"PrivateKey"]]};
initSearch(searchIndex);

View File

@ -243,61 +243,168 @@
<span id="199">199</span>
<span id="200">200</span>
<span id="201">201</span>
<span id="202">202</span>
<span id="203">203</span>
<span id="204">204</span>
<span id="205">205</span>
<span id="206">206</span>
<span id="207">207</span>
<span id="208">208</span>
<span id="209">209</span>
<span id="210">210</span>
<span id="211">211</span>
<span id="212">212</span>
<span id="213">213</span>
<span id="214">214</span>
<span id="215">215</span>
<span id="216">216</span>
<span id="217">217</span>
<span id="218">218</span>
<span id="219">219</span>
<span id="220">220</span>
<span id="221">221</span>
<span id="222">222</span>
<span id="223">223</span>
<span id="224">224</span>
<span id="225">225</span>
<span id="226">226</span>
<span id="227">227</span>
<span id="228">228</span>
<span id="229">229</span>
<span id="230">230</span>
<span id="231">231</span>
<span id="232">232</span>
<span id="233">233</span>
<span id="234">234</span>
<span id="235">235</span>
<span id="236">236</span>
<span id="237">237</span>
<span id="238">238</span>
<span id="239">239</span>
<span id="240">240</span>
<span id="241">241</span>
<span id="242">242</span>
<span id="243">243</span>
<span id="244">244</span>
<span id="245">245</span>
<span id="246">246</span>
<span id="247">247</span>
<span id="248">248</span>
</pre><pre class='rust '>
<span class='doccomment'>//! *lamport* implements one-time hash-based signatures using the Lamport signature scheme.</span>
<span class='kw'>extern</span> <span class='kw'>crate</span> <span class='ident'>crypto</span>;
<span class='attribute'>#<span class='op'>!</span>[<span class='ident'>deny</span>(
<span class='ident'>missing_docs</span>,
<span class='ident'>missing_debug_implementations</span>, <span class='ident'>missing_copy_implementations</span>,
<span class='ident'>trivial_casts</span>, <span class='ident'>trivial_numeric_casts</span>,
<span class='ident'>unsafe_code</span>, <span class='ident'>unstable_features</span>,
<span class='ident'>unused_import_braces</span>, <span class='ident'>unused_qualifications</span>
)]</span>
<span class='kw'>extern</span> <span class='kw'>crate</span> <span class='ident'>ring</span>;
<span class='kw'>extern</span> <span class='kw'>crate</span> <span class='ident'>rand</span>;
<span class='kw'>use</span> <span class='ident'>rand</span>::<span class='ident'>OsRng</span>;
<span class='kw'>use</span> <span class='ident'>rand</span>::<span class='ident'>Rng</span>;
<span class='kw'>use</span> <span class='ident'>crypto</span>::<span class='ident'>digest</span>::<span class='ident'>Digest</span>;
<span class='kw'>use</span> <span class='ident'>ring</span>::<span class='ident'>digest</span>::{ <span class='ident'>Algorithm</span>, <span class='ident'>Context</span> };
<span class='doccomment'>/// A type alias defining a Lamport signature</span>
<span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>LamportSignatureData</span> <span class='op'>=</span> <span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>u8</span><span class='op'>&gt;&gt;</span>;
<span class='doccomment'>/// A one-time signing public key</span>
<span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>PublicKey</span><span class='op'>&lt;</span><span class='ident'>T</span>: <span class='ident'>Digest</span> <span class='op'>+</span> <span class='ident'>Clone</span><span class='op'>&gt;</span> {
<span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Clone</span>, <span class='ident'>Debug</span>)]</span>
<span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>PublicKey</span> {
<span class='ident'>zero_values</span>: <span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>u8</span><span class='op'>&gt;&gt;</span>,
<span class='ident'>one_values</span>: <span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>u8</span><span class='op'>&gt;&gt;</span>,
<span class='ident'>digest</span>: <span class='ident'>T</span>
<span class='ident'>one_values</span>: <span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>u8</span><span class='op'>&gt;&gt;</span>,
<span class='ident'>algorithm</span>: <span class='kw-2'>&amp;</span><span class='lifetime'>&#39;static</span> <span class='ident'>Algorithm</span>,
}
<span class='doccomment'>/// A one-time signing private key</span>
<span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>PrivateKey</span><span class='op'>&lt;</span><span class='ident'>T</span>: <span class='ident'>Digest</span> <span class='op'>+</span> <span class='ident'>Clone</span><span class='op'>&gt;</span> {
<span class='ident'>zero_values</span>: <span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>u8</span><span class='op'>&gt;&gt;</span>, <span class='comment'>// For a n bits hash function: (n * n/8 bytes) for zero_values and one_values</span>
<span class='ident'>one_values</span>: <span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>u8</span><span class='op'>&gt;&gt;</span>,
<span class='ident'>digest</span>: <span class='ident'>T</span>,
<span class='ident'>used</span>: <span class='ident'>bool</span>
<span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Clone</span>, <span class='ident'>Debug</span>)]</span>
<span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>PrivateKey</span> {
<span class='comment'>// For a n bits hash function: (n * n/8 bytes) for zero_values and one_values</span>
<span class='ident'>zero_values</span>: <span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>u8</span><span class='op'>&gt;&gt;</span>,
<span class='ident'>one_values</span>: <span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>u8</span><span class='op'>&gt;&gt;</span>,
<span class='ident'>algorithm</span>: <span class='kw-2'>&amp;</span><span class='lifetime'>&#39;static</span> <span class='ident'>Algorithm</span>,
<span class='ident'>used</span>: <span class='ident'>bool</span>,
}
<span class='kw'>impl</span><span class='op'>&lt;</span><span class='ident'>T</span>: <span class='ident'>Digest</span> <span class='op'>+</span> <span class='ident'>Clone</span><span class='op'>&gt;</span> <span class='ident'>PublicKey</span><span class='op'>&lt;</span><span class='ident'>T</span><span class='op'>&gt;</span> {
<span class='doccomment'>/// Verifies that the signature of the data is correctly signed with the given key</span>
<span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>verify_signature</span>( <span class='kw-2'>&amp;</span><span class='self'>self</span>,
<span class='ident'>signature</span>: <span class='kw-2'>&amp;</span><span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>u8</span><span class='op'>&gt;&gt;</span>,
<span class='ident'>data</span>:<span class='kw-2'>&amp;</span>[<span class='ident'>u8</span>],
) <span class='op'>-&gt;</span> <span class='ident'>bool</span>
{
<span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>digest</span> <span class='op'>=</span> <span class='self'>self</span>.<span class='ident'>digest</span>.<span class='ident'>clone</span>();
<span class='ident'>digest</span>.<span class='ident'>input</span>(<span class='ident'>data</span>);
<span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>data_hash</span> <span class='op'>=</span> <span class='macro'>vec</span><span class='macro'>!</span>[<span class='number'>0</span> <span class='kw'>as</span> <span class='ident'>u8</span>; <span class='ident'>digest</span>.<span class='ident'>output_bytes</span>()];
<span class='ident'>digest</span>.<span class='ident'>result</span>(<span class='ident'>data_hash</span>.<span class='ident'>as_mut_slice</span>());
<span class='ident'>digest</span>.<span class='ident'>reset</span>();
<span class='kw'>impl</span> <span class='ident'>From</span><span class='op'>&lt;</span><span class='ident'>PublicKey</span><span class='op'>&gt;</span> <span class='kw'>for</span> <span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>u8</span><span class='op'>&gt;</span> {
<span class='kw'>fn</span> <span class='ident'>from</span>(<span class='ident'>original</span>: <span class='ident'>PublicKey</span>) <span class='op'>-&gt;</span> <span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>u8</span><span class='op'>&gt;</span> {
<span class='ident'>original</span>.<span class='ident'>to_bytes</span>()
}
}
<span class='kw'>for</span> <span class='ident'>i</span> <span class='kw'>in</span> <span class='number'>0</span>..<span class='ident'>data_hash</span>.<span class='ident'>len</span>() {
<span class='kw'>let</span> <span class='ident'>byte</span> <span class='op'>=</span> <span class='ident'>data_hash</span>[<span class='ident'>i</span>];
<span class='kw'>impl</span> <span class='ident'>PublicKey</span> {
<span class='doccomment'>/// Intializes a public key with a byte vector.</span>
<span class='doccomment'>/// Returns `None` if it couldn&#39;t parse the provided data</span>
<span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>from_vec</span>(<span class='ident'>vec</span>: <span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>u8</span><span class='op'>&gt;</span>, <span class='ident'>algorithm</span>: <span class='kw-2'>&amp;</span><span class='lifetime'>&#39;static</span> <span class='ident'>Algorithm</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>PublicKey</span><span class='op'>&gt;</span> {
<span class='kw'>let</span> <span class='ident'>size</span> <span class='op'>=</span> <span class='ident'>vec</span>.<span class='ident'>len</span>();
<span class='kw'>let</span> <span class='ident'>hash_output_size</span> <span class='op'>=</span> <span class='ident'>algorithm</span>.<span class='ident'>output_len</span>;
<span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>zero_values_merged</span> <span class='op'>=</span> <span class='ident'>vec</span>;
<span class='kw'>let</span> <span class='ident'>one_values_merged</span> <span class='op'>=</span> <span class='ident'>zero_values_merged</span>.<span class='ident'>split_off</span>(<span class='ident'>size</span> <span class='op'>/</span> <span class='number'>2</span>);
<span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>zero_values</span> <span class='op'>=</span> <span class='ident'>Vec</span>::<span class='ident'>new</span>();
<span class='kw'>for</span> <span class='ident'>i</span> <span class='kw'>in</span> (<span class='number'>0</span>..<span class='ident'>zero_values_merged</span>.<span class='ident'>len</span>()).<span class='ident'>filter</span>(<span class='op'>|</span><span class='ident'>x</span><span class='op'>|</span> <span class='ident'>x</span> <span class='op'>%</span> <span class='ident'>hash_output_size</span> <span class='op'>==</span> <span class='number'>0</span>) {
<span class='comment'>// indexes for heads</span>
<span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>sub_vec</span> <span class='op'>=</span> <span class='ident'>Vec</span>::<span class='ident'>new</span>();
<span class='kw'>for</span> <span class='ident'>j</span> <span class='kw'>in</span> <span class='number'>0</span>..<span class='ident'>hash_output_size</span> {
<span class='ident'>sub_vec</span>.<span class='ident'>push</span>(<span class='ident'>zero_values_merged</span>[<span class='ident'>i</span> <span class='op'>+</span> <span class='ident'>j</span>]);
}
<span class='ident'>zero_values</span>.<span class='ident'>push</span>(<span class='ident'>sub_vec</span>);
}
<span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>one_values</span> <span class='op'>=</span> <span class='ident'>Vec</span>::<span class='ident'>new</span>();
<span class='kw'>for</span> <span class='ident'>i</span> <span class='kw'>in</span> (<span class='number'>0</span>..<span class='ident'>one_values_merged</span>.<span class='ident'>len</span>()).<span class='ident'>filter</span>(<span class='op'>|</span><span class='ident'>x</span><span class='op'>|</span> <span class='ident'>x</span> <span class='op'>%</span> <span class='ident'>hash_output_size</span> <span class='op'>==</span> <span class='number'>0</span>) {
<span class='comment'>// indexes for heads</span>
<span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>sub_vec</span> <span class='op'>=</span> <span class='ident'>Vec</span>::<span class='ident'>new</span>();
<span class='kw'>for</span> <span class='ident'>j</span> <span class='kw'>in</span> <span class='number'>0</span>..<span class='ident'>hash_output_size</span> {
<span class='ident'>sub_vec</span>.<span class='ident'>push</span>(<span class='ident'>one_values_merged</span>[<span class='ident'>i</span> <span class='op'>+</span> <span class='ident'>j</span>]);
}
<span class='ident'>one_values</span>.<span class='ident'>push</span>(<span class='ident'>sub_vec</span>);
}
<span class='prelude-val'>Some</span>(<span class='ident'>PublicKey</span> {
<span class='ident'>zero_values</span>: <span class='ident'>zero_values</span>,
<span class='ident'>one_values</span>: <span class='ident'>one_values</span>,
<span class='ident'>algorithm</span>: <span class='ident'>algorithm</span>,
})
}
<span class='doccomment'>/// Serializes a public key into a byte vector</span>
<span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>to_bytes</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>u8</span><span class='op'>&gt;</span> {
<span class='self'>self</span>.<span class='ident'>zero_values</span>.<span class='ident'>iter</span>().<span class='ident'>chain</span>(<span class='self'>self</span>.<span class='ident'>one_values</span>.<span class='ident'>iter</span>()).<span class='ident'>fold</span>(<span class='ident'>Vec</span>::<span class='ident'>new</span>(), <span class='op'>|</span><span class='kw-2'>mut</span> <span class='ident'>acc</span>, <span class='ident'>i</span><span class='op'>|</span> {
<span class='ident'>acc</span>.<span class='ident'>append</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='ident'>i</span>.<span class='ident'>clone</span>());
<span class='ident'>acc</span>
})
}
<span class='doccomment'>/// Verifies that the signature of the data is correctly signed with the given key</span>
<span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>verify_signature</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>signature</span>: <span class='kw-2'>&amp;</span><span class='ident'>LamportSignatureData</span>, <span class='ident'>data</span>: <span class='kw-2'>&amp;</span>[<span class='ident'>u8</span>]) <span class='op'>-&gt;</span> <span class='ident'>bool</span> {
<span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>context</span> <span class='op'>=</span> <span class='ident'>Context</span>::<span class='ident'>new</span>(<span class='self'>self</span>.<span class='ident'>algorithm</span>);
<span class='ident'>context</span>.<span class='ident'>update</span>(<span class='ident'>data</span>);
<span class='kw'>let</span> <span class='ident'>result</span> <span class='op'>=</span> <span class='ident'>context</span>.<span class='ident'>finish</span>();
<span class='kw'>let</span> <span class='ident'>data_hash</span> <span class='op'>=</span> <span class='ident'>result</span>.<span class='ident'>as_ref</span>();
<span class='kw'>for</span> (<span class='ident'>i</span>, <span class='ident'>byte</span>) <span class='kw'>in</span> <span class='ident'>data_hash</span>.<span class='ident'>iter</span>().<span class='ident'>enumerate</span>() {
<span class='kw'>for</span> <span class='ident'>j</span> <span class='kw'>in</span> <span class='number'>0</span>..<span class='number'>8</span> {
<span class='kw'>let</span> <span class='ident'>offset</span> <span class='op'>=</span> <span class='ident'>i</span><span class='op'>*</span><span class='number'>8</span> <span class='op'>+</span> <span class='ident'>j</span>;
<span class='kw'>if</span> (<span class='ident'>byte</span> <span class='kw-2'>&amp;</span> (<span class='number'>1</span><span class='op'>&lt;&lt;</span><span class='ident'>j</span>)) <span class='op'>&gt;</span> <span class='number'>0</span> {
<span class='ident'>digest</span>.<span class='ident'>input</span>(<span class='ident'>signature</span>[<span class='ident'>offset</span>].<span class='ident'>as_slice</span>());
<span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>hashed_value</span> <span class='op'>=</span> <span class='macro'>vec</span><span class='macro'>!</span>[<span class='number'>0</span> <span class='kw'>as</span> <span class='ident'>u8</span>; <span class='ident'>digest</span>.<span class='ident'>output_bytes</span>()];
<span class='ident'>digest</span>.<span class='ident'>result</span>(<span class='ident'>hashed_value</span>.<span class='ident'>as_mut_slice</span>());
<span class='ident'>digest</span>.<span class='ident'>reset</span>();
<span class='kw'>let</span> <span class='ident'>offset</span> <span class='op'>=</span> <span class='ident'>i</span> <span class='op'>*</span> <span class='number'>8</span> <span class='op'>+</span> <span class='ident'>j</span>;
<span class='kw'>if</span> (<span class='ident'>byte</span> <span class='kw-2'>&amp;</span> (<span class='number'>1</span> <span class='op'>&lt;&lt;</span> <span class='ident'>j</span>)) <span class='op'>&gt;</span> <span class='number'>0</span> {
<span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>context</span> <span class='op'>=</span> <span class='ident'>Context</span>::<span class='ident'>new</span>(<span class='self'>self</span>.<span class='ident'>algorithm</span>);
<span class='ident'>context</span>.<span class='ident'>update</span>(<span class='ident'>signature</span>[<span class='ident'>offset</span>].<span class='ident'>as_slice</span>());
<span class='kw'>let</span> <span class='ident'>hashed_value</span> <span class='op'>=</span> <span class='ident'>Vec</span>::<span class='ident'>from</span>(<span class='ident'>context</span>.<span class='ident'>finish</span>().<span class='ident'>as_ref</span>());
<span class='kw'>if</span> <span class='ident'>hashed_value</span> <span class='op'>!=</span> <span class='self'>self</span>.<span class='ident'>one_values</span>[<span class='ident'>offset</span>] {
<span class='kw'>return</span> <span class='bool-val'>false</span>;
}
} <span class='kw'>else</span> {
<span class='ident'>digest</span>.<span class='ident'>input</span>(<span class='ident'>signature</span>[<span class='ident'>offset</span>].<span class='ident'>as_slice</span>());
<span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>hashed_value</span> <span class='op'>=</span> <span class='macro'>vec</span><span class='macro'>!</span>[<span class='number'>0</span> <span class='kw'>as</span> <span class='ident'>u8</span>; <span class='ident'>digest</span>.<span class='ident'>output_bytes</span>()];
<span class='ident'>digest</span>.<span class='ident'>result</span>(<span class='ident'>hashed_value</span>.<span class='ident'>as_mut_slice</span>());
<span class='ident'>digest</span>.<span class='ident'>reset</span>();
<span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>context</span> <span class='op'>=</span> <span class='ident'>Context</span>::<span class='ident'>new</span>(<span class='self'>self</span>.<span class='ident'>algorithm</span>);
<span class='ident'>context</span>.<span class='ident'>update</span>(<span class='ident'>signature</span>[<span class='ident'>offset</span>].<span class='ident'>as_slice</span>());
<span class='kw'>let</span> <span class='ident'>hashed_value</span> <span class='op'>=</span> <span class='ident'>Vec</span>::<span class='ident'>from</span>(<span class='ident'>context</span>.<span class='ident'>finish</span>().<span class='ident'>as_ref</span>());
<span class='kw'>if</span> <span class='ident'>hashed_value</span> <span class='op'>!=</span> <span class='self'>self</span>.<span class='ident'>zero_values</span>[<span class='ident'>offset</span>] {
<span class='kw'>return</span> <span class='bool-val'>false</span>;
}
@ -305,81 +412,83 @@
}
}
<span class='kw'>return</span> <span class='bool-val'>true</span>;
<span class='bool-val'>true</span>
}
}
<span class='kw'>impl</span> <span class='op'>&lt;</span><span class='ident'>T</span>: <span class='ident'>Digest</span> <span class='op'>+</span> <span class='ident'>Clone</span><span class='op'>&gt;</span> <span class='ident'>PrivateKey</span><span class='op'>&lt;</span><span class='ident'>T</span><span class='op'>&gt;</span> {
<span class='kw'>impl</span> <span class='ident'>PrivateKey</span> {
<span class='doccomment'>/// Generates a new random one-time signing key. This method can panic if OS RNG fails</span>
<span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>new</span>(<span class='ident'>digest</span>: <span class='ident'>T</span>) <span class='op'>-&gt;</span> <span class='ident'>PrivateKey</span><span class='op'>&lt;</span><span class='ident'>T</span><span class='op'>&gt;</span> {
<span class='kw'>let</span> <span class='ident'>generate_bit_hash_values</span> <span class='op'>=</span> <span class='op'>|</span><span class='ident'>hasher</span>: <span class='kw-2'>&amp;</span><span class='ident'>T</span><span class='op'>|</span> <span class='op'>-&gt;</span> <span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>u8</span><span class='op'>&gt;&gt;</span> {
<span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>new</span>(<span class='ident'>algorithm</span>: <span class='kw-2'>&amp;</span><span class='lifetime'>&#39;static</span> <span class='ident'>Algorithm</span>) <span class='op'>-&gt;</span> <span class='ident'>PrivateKey</span> {
<span class='kw'>let</span> <span class='ident'>generate_bit_hash_values</span> <span class='op'>=</span> <span class='op'>||</span> <span class='op'>-&gt;</span> <span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>u8</span><span class='op'>&gt;&gt;</span> {
<span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>rng</span> <span class='op'>=</span> <span class='kw'>match</span> <span class='ident'>OsRng</span>::<span class='ident'>new</span>() {
<span class='prelude-val'>Ok</span>(<span class='ident'>g</span>) <span class='op'>=&gt;</span> <span class='ident'>g</span>,
<span class='prelude-val'>Err</span>(<span class='ident'>e</span>) <span class='op'>=&gt;</span> <span class='macro'>panic</span><span class='macro'>!</span>(<span class='string'>&quot;Failed to obtain OS RNG: {}&quot;</span>, <span class='ident'>e</span>)
<span class='prelude-val'>Err</span>(<span class='ident'>e</span>) <span class='op'>=&gt;</span> <span class='macro'>panic</span><span class='macro'>!</span>(<span class='string'>&quot;Failed to obtain OS RNG: {}&quot;</span>, <span class='ident'>e</span>),
};
<span class='kw'>let</span> <span class='ident'>buffer_byte</span> <span class='op'>=</span> <span class='macro'>vec</span><span class='macro'>!</span>[<span class='number'>0</span> <span class='kw'>as</span> <span class='ident'>u8</span>; <span class='ident'>hasher</span>.<span class='ident'>output_bytes</span>()];
<span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>buffer</span> <span class='op'>=</span> <span class='macro'>vec</span><span class='macro'>!</span>[<span class='ident'>buffer_byte</span>; <span class='ident'>hasher</span>.<span class='ident'>output_bits</span>()];
<span class='kw'>let</span> <span class='ident'>buffer_byte</span> <span class='op'>=</span> <span class='macro'>vec</span><span class='macro'>!</span>[<span class='number'>0u8</span>; <span class='ident'>algorithm</span>.<span class='ident'>output_len</span>];
<span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>buffer</span> <span class='op'>=</span> <span class='macro'>vec</span><span class='macro'>!</span>[<span class='ident'>buffer_byte</span>; <span class='ident'>algorithm</span>.<span class='ident'>output_len</span> <span class='op'>*</span> <span class='number'>8</span>];
<span class='kw'>for</span> <span class='ident'>hash</span> <span class='kw'>in</span> <span class='ident'>buffer</span>.<span class='ident'>iter_mut</span>() {
<span class='kw'>for</span> <span class='ident'>hash</span> <span class='kw'>in</span> <span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='ident'>buffer</span> {
<span class='ident'>rng</span>.<span class='ident'>fill_bytes</span>(<span class='ident'>hash</span>)
}
<span class='kw'>return</span> <span class='ident'>buffer</span>;
<span class='ident'>buffer</span>
};
<span class='kw'>let</span> <span class='ident'>zero_values</span> <span class='op'>=</span> <span class='ident'>generate_bit_hash_values</span>(<span class='kw-2'>&amp;</span><span class='ident'>digest</span>);
<span class='kw'>let</span> <span class='ident'>one_values</span> <span class='op'>=</span> <span class='ident'>generate_bit_hash_values</span>(<span class='kw-2'>&amp;</span><span class='ident'>digest</span>);
<span class='kw'>let</span> <span class='ident'>zero_values</span> <span class='op'>=</span> <span class='ident'>generate_bit_hash_values</span>();
<span class='kw'>let</span> <span class='ident'>one_values</span> <span class='op'>=</span> <span class='ident'>generate_bit_hash_values</span>();
<span class='kw'>return</span> <span class='ident'>PrivateKey</span> { <span class='ident'>zero_values</span>: <span class='ident'>zero_values</span>,
<span class='ident'>one_values</span>: <span class='ident'>one_values</span>,
<span class='ident'>digest</span>: <span class='ident'>digest</span>,
<span class='ident'>used</span>: <span class='bool-val'>false</span> }
<span class='ident'>PrivateKey</span> {
<span class='ident'>zero_values</span>: <span class='ident'>zero_values</span>,
<span class='ident'>one_values</span>: <span class='ident'>one_values</span>,
<span class='ident'>algorithm</span>: <span class='ident'>algorithm</span>,
<span class='ident'>used</span>: <span class='bool-val'>false</span>,
}
}
<span class='doccomment'>/// Returns the public key associated with this private key</span>
<span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>public_key</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>PublicKey</span><span class='op'>&lt;</span><span class='ident'>T</span><span class='op'>&gt;</span> {
<span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>digest</span> <span class='op'>=</span> <span class='self'>self</span>.<span class='ident'>digest</span>.<span class='ident'>clone</span>();
<span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>public_key</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>PublicKey</span> {
<span class='kw'>let</span> <span class='ident'>hash_values</span> <span class='op'>=</span> <span class='op'>|</span><span class='ident'>x</span>: <span class='kw-2'>&amp;</span><span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>u8</span><span class='op'>&gt;&gt;</span><span class='op'>|</span> <span class='op'>-&gt;</span> <span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>u8</span><span class='op'>&gt;&gt;</span> {
<span class='kw'>let</span> <span class='ident'>buffer_byte</span> <span class='op'>=</span> <span class='macro'>vec</span><span class='macro'>!</span>[<span class='number'>0u8</span>; <span class='self'>self</span>.<span class='ident'>algorithm</span>.<span class='ident'>output_len</span>];
<span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>buffer</span> <span class='op'>=</span> <span class='macro'>vec</span><span class='macro'>!</span>[<span class='ident'>buffer_byte</span>; <span class='self'>self</span>.<span class='ident'>algorithm</span>.<span class='ident'>output_len</span> <span class='op'>*</span> <span class='number'>8</span>];
<span class='kw'>let</span> <span class='ident'>hash_values</span> <span class='op'>=</span> <span class='op'>|</span><span class='ident'>x</span>: <span class='kw-2'>&amp;</span><span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>u8</span><span class='op'>&gt;&gt;</span>, <span class='ident'>hash_func</span>: <span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='ident'>Digest</span> <span class='op'>|</span> <span class='op'>-&gt;</span> <span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>u8</span><span class='op'>&gt;&gt;</span> {
<span class='kw'>let</span> <span class='ident'>buffer_byte</span> <span class='op'>=</span> <span class='macro'>vec</span><span class='macro'>!</span>[<span class='number'>0</span> <span class='kw'>as</span> <span class='ident'>u8</span>; <span class='ident'>hash_func</span>.<span class='ident'>output_bytes</span>()];
<span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>buffer</span> <span class='op'>=</span> <span class='macro'>vec</span><span class='macro'>!</span>[<span class='ident'>buffer_byte</span>; <span class='ident'>hash_func</span>.<span class='ident'>output_bits</span>()];
<span class='kw'>for</span> <span class='ident'>i</span> <span class='kw'>in</span> <span class='number'>0</span>..<span class='ident'>hash_func</span>.<span class='ident'>output_bits</span>(){
<span class='ident'>hash_func</span>.<span class='ident'>input</span>(<span class='ident'>x</span>[<span class='ident'>i</span>].<span class='ident'>as_slice</span>());
<span class='ident'>hash_func</span>.<span class='ident'>result</span>(<span class='ident'>buffer</span>[<span class='ident'>i</span>].<span class='ident'>as_mut_slice</span>());
<span class='ident'>hash_func</span>.<span class='ident'>reset</span>();
<span class='kw'>for</span> <span class='ident'>i</span> <span class='kw'>in</span> <span class='number'>0</span> .. <span class='self'>self</span>.<span class='ident'>algorithm</span>.<span class='ident'>output_len</span> <span class='op'>*</span> <span class='number'>8</span> {
<span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>context</span> <span class='op'>=</span> <span class='ident'>Context</span>::<span class='ident'>new</span>(<span class='self'>self</span>.<span class='ident'>algorithm</span>);
<span class='ident'>context</span>.<span class='ident'>update</span>(<span class='ident'>x</span>[<span class='ident'>i</span>].<span class='ident'>as_slice</span>());
<span class='ident'>buffer</span>[<span class='ident'>i</span>] <span class='op'>=</span> <span class='ident'>Vec</span>::<span class='ident'>from</span>(<span class='ident'>context</span>.<span class='ident'>finish</span>().<span class='ident'>as_ref</span>());
}
<span class='kw'>return</span> <span class='ident'>buffer</span>;
<span class='ident'>buffer</span>
};
<span class='kw'>let</span> <span class='ident'>hashed_zero_values</span> <span class='op'>=</span> <span class='ident'>hash_values</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>.<span class='ident'>zero_values</span>, <span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='ident'>digest</span>);
<span class='kw'>let</span> <span class='ident'>hashed_one_values</span> <span class='op'>=</span> <span class='ident'>hash_values</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>.<span class='ident'>one_values</span>, <span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='ident'>digest</span>);
<span class='kw'>let</span> <span class='ident'>hashed_zero_values</span> <span class='op'>=</span> <span class='ident'>hash_values</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>.<span class='ident'>zero_values</span>);
<span class='kw'>let</span> <span class='ident'>hashed_one_values</span> <span class='op'>=</span> <span class='ident'>hash_values</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>.<span class='ident'>one_values</span>);
<span class='kw'>return</span> <span class='ident'>PublicKey</span> { <span class='ident'>zero_values</span>: <span class='ident'>hashed_zero_values</span>,
<span class='ident'>one_values</span>: <span class='ident'>hashed_one_values</span>,
<span class='ident'>digest</span>: <span class='ident'>digest</span> }
<span class='ident'>PublicKey</span> {
<span class='ident'>zero_values</span>: <span class='ident'>hashed_zero_values</span>,
<span class='ident'>one_values</span>: <span class='ident'>hashed_one_values</span>,
<span class='ident'>algorithm</span>: <span class='self'>self</span>.<span class='ident'>algorithm</span>,
}
}
<span class='doccomment'>/// Signs the data with the private key and returns the result if successful.</span>
<span class='doccomment'>/// If unsuccesful, an explanation string is returned</span>
<span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>sign</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>, <span class='ident'>data</span>: <span class='kw-2'>&amp;</span>[<span class='ident'>u8</span>]) <span class='op'>-&gt;</span> <span class='prelude-ty'>Result</span><span class='op'>&lt;</span><span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>u8</span><span class='op'>&gt;&gt;</span>, <span class='kw-2'>&amp;</span><span class='lifetime'>&#39;static</span> <span class='ident'>str</span><span class='op'>&gt;</span> {
<span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>sign</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>, <span class='ident'>data</span>: <span class='kw-2'>&amp;</span>[<span class='ident'>u8</span>]) <span class='op'>-&gt;</span> <span class='prelude-ty'>Result</span><span class='op'>&lt;</span><span class='ident'>LamportSignatureData</span>, <span class='kw-2'>&amp;</span><span class='lifetime'>&#39;static</span> <span class='ident'>str</span><span class='op'>&gt;</span> {
<span class='kw'>if</span> <span class='self'>self</span>.<span class='ident'>used</span> {
<span class='kw'>return</span> <span class='prelude-val'>Err</span>(<span class='string'>&quot;Attempting to sign more than once.&quot;</span>);
}
<span class='self'>self</span>.<span class='ident'>digest</span>.<span class='ident'>input</span>(<span class='ident'>data</span>);
<span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>data_hash</span> <span class='op'>=</span> <span class='macro'>vec</span><span class='macro'>!</span>[<span class='number'>0</span> <span class='kw'>as</span> <span class='ident'>u8</span>; <span class='self'>self</span>.<span class='ident'>digest</span>.<span class='ident'>output_bytes</span>()];
<span class='self'>self</span>.<span class='ident'>digest</span>.<span class='ident'>result</span>(<span class='ident'>data_hash</span>.<span class='ident'>as_mut_slice</span>());
<span class='self'>self</span>.<span class='ident'>digest</span>.<span class='ident'>reset</span>();
<span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>context</span> <span class='op'>=</span> <span class='ident'>Context</span>::<span class='ident'>new</span>(<span class='self'>self</span>.<span class='ident'>algorithm</span>);
<span class='ident'>context</span>.<span class='ident'>update</span>(<span class='ident'>data</span>);
<span class='kw'>let</span> <span class='ident'>result</span> <span class='op'>=</span> <span class='ident'>context</span>.<span class='ident'>finish</span>();
<span class='kw'>let</span> <span class='ident'>data_hash</span> <span class='op'>=</span> <span class='ident'>result</span>.<span class='ident'>as_ref</span>();
<span class='kw'>let</span> <span class='ident'>signature_len</span> <span class='op'>=</span> <span class='ident'>data_hash</span>.<span class='ident'>len</span>() <span class='op'>*</span> <span class='number'>8</span>;
<span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>signature</span> <span class='op'>=</span> <span class='ident'>Vec</span>::<span class='ident'>with_capacity</span>(<span class='ident'>signature_len</span>);
<span class='kw'>for</span> <span class='ident'>i</span> <span class='kw'>in</span> <span class='number'>0</span>..<span class='ident'>data_hash</span>.<span class='ident'>len</span>() {
<span class='kw'>let</span> <span class='ident'>byte</span> <span class='op'>=</span> <span class='ident'>data_hash</span>[<span class='ident'>i</span>];
<span class='kw'>for</span> (<span class='ident'>i</span>, <span class='ident'>byte</span>) <span class='kw'>in</span> <span class='ident'>data_hash</span>.<span class='ident'>iter</span>().<span class='ident'>enumerate</span>() {
<span class='kw'>for</span> <span class='ident'>j</span> <span class='kw'>in</span> <span class='number'>0</span>..<span class='number'>8</span> {
<span class='kw'>let</span> <span class='ident'>offset</span> <span class='op'>=</span> <span class='ident'>i</span><span class='op'>*</span><span class='number'>8</span> <span class='op'>+</span> <span class='ident'>j</span>;
<span class='kw'>if</span> (<span class='ident'>byte</span> <span class='kw-2'>&amp;</span> (<span class='number'>1</span><span class='op'>&lt;&lt;</span><span class='ident'>j</span>)) <span class='op'>&gt;</span> <span class='number'>0</span> {
<span class='kw'>let</span> <span class='ident'>offset</span> <span class='op'>=</span> <span class='ident'>i</span> <span class='op'>*</span> <span class='number'>8</span> <span class='op'>+</span> <span class='ident'>j</span>;
<span class='kw'>if</span> (<span class='ident'>byte</span> <span class='kw-2'>&amp;</span> (<span class='number'>1</span> <span class='op'>&lt;&lt;</span> <span class='ident'>j</span>)) <span class='op'>&gt;</span> <span class='number'>0</span> {
<span class='comment'>// Bit is 1</span>
<span class='ident'>signature</span>.<span class='ident'>push</span>(<span class='self'>self</span>.<span class='ident'>one_values</span>[<span class='ident'>offset</span>].<span class='ident'>clone</span>());
} <span class='kw'>else</span> {
@ -389,11 +498,11 @@
}
}
<span class='self'>self</span>.<span class='ident'>used</span> <span class='op'>=</span> <span class='bool-val'>true</span>;
<span class='kw'>return</span> <span class='prelude-val'>Ok</span>(<span class='ident'>signature</span>);
<span class='prelude-val'>Ok</span>(<span class='ident'>signature</span>)
}
}
<span class='kw'>impl</span> <span class='op'>&lt;</span><span class='ident'>T</span>: <span class='ident'>Digest</span> <span class='op'>+</span> <span class='ident'>Clone</span><span class='op'>&gt;</span> <span class='ident'>Drop</span> <span class='kw'>for</span> <span class='ident'>PrivateKey</span><span class='op'>&lt;</span><span class='ident'>T</span><span class='op'>&gt;</span> {
<span class='kw'>impl</span> <span class='ident'>Drop</span> <span class='kw'>for</span> <span class='ident'>PrivateKey</span> {
<span class='kw'>fn</span> <span class='ident'>drop</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>) {
<span class='kw'>let</span> <span class='ident'>zeroize_vector</span> <span class='op'>=</span> <span class='op'>|</span><span class='ident'>vector</span>: <span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>u8</span><span class='op'>&gt;&gt;</span><span class='op'>|</span> {
<span class='kw'>for</span> <span class='ident'>v2</span> <span class='kw'>in</span> <span class='ident'>vector</span>.<span class='ident'>iter_mut</span>() {
@ -408,9 +517,9 @@
}
}
<span class='kw'>impl</span><span class='op'>&lt;</span><span class='ident'>T</span>: <span class='ident'>Digest</span> <span class='op'>+</span> <span class='ident'>Clone</span><span class='op'>&gt;</span> <span class='ident'>PartialEq</span> <span class='kw'>for</span> <span class='ident'>PrivateKey</span><span class='op'>&lt;</span><span class='ident'>T</span><span class='op'>&gt;</span> {
<span class='kw'>impl</span> <span class='ident'>PartialEq</span> <span class='kw'>for</span> <span class='ident'>PrivateKey</span> {
<span class='comment'>// ⚠️ This is not a constant-time implementation</span>
<span class='kw'>fn</span> <span class='ident'>eq</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>other</span>: <span class='kw-2'>&amp;</span><span class='ident'>PrivateKey</span><span class='op'>&lt;</span><span class='ident'>T</span><span class='op'>&gt;</span>) <span class='op'>-&gt;</span> <span class='ident'>bool</span> {
<span class='kw'>fn</span> <span class='ident'>eq</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>other</span>: <span class='kw-2'>&amp;</span><span class='ident'>PrivateKey</span>) <span class='op'>-&gt;</span> <span class='ident'>bool</span> {
<span class='kw'>if</span> <span class='self'>self</span>.<span class='ident'>one_values</span>.<span class='ident'>len</span>() <span class='op'>!=</span> <span class='ident'>other</span>.<span class='ident'>one_values</span>.<span class='ident'>len</span>() {
<span class='kw'>return</span> <span class='bool-val'>false</span>;
}
@ -419,32 +528,17 @@
}
<span class='kw'>for</span> <span class='ident'>i</span> <span class='kw'>in</span> <span class='number'>0</span>..<span class='self'>self</span>.<span class='ident'>zero_values</span>.<span class='ident'>len</span>() {
<span class='kw'>if</span> <span class='self'>self</span>.<span class='ident'>zero_values</span>[<span class='ident'>i</span>] <span class='op'>!=</span> <span class='ident'>other</span>.<span class='ident'>zero_values</span>[<span class='ident'>i</span>] <span class='op'>||</span> <span class='self'>self</span>.<span class='ident'>one_values</span>[<span class='ident'>i</span>] <span class='op'>!=</span> <span class='ident'>other</span>.<span class='ident'>one_values</span>[<span class='ident'>i</span>] {
<span class='kw'>return</span> <span class='bool-val'>false</span>
<span class='kw'>if</span> <span class='self'>self</span>.<span class='ident'>zero_values</span>[<span class='ident'>i</span>] <span class='op'>!=</span> <span class='ident'>other</span>.<span class='ident'>zero_values</span>[<span class='ident'>i</span>] <span class='op'>||</span>
<span class='self'>self</span>.<span class='ident'>one_values</span>[<span class='ident'>i</span>] <span class='op'>!=</span> <span class='ident'>other</span>.<span class='ident'>one_values</span>[<span class='ident'>i</span>] {
<span class='kw'>return</span> <span class='bool-val'>false</span>;
}
}
<span class='kw'>return</span> <span class='bool-val'>true</span>;
<span class='bool-val'>true</span>
}
}
<span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>test</span>)]</span>
<span class='kw'>use</span> <span class='ident'>crypto</span>::<span class='ident'>sha3</span>::<span class='ident'>Sha3</span>;
<span class='attribute'>#[<span class='ident'>test</span>]</span>
<span class='kw'>fn</span> <span class='ident'>test_public_key_length_256</span>() {
<span class='kw'>let</span> <span class='ident'>pk</span> <span class='op'>=</span> <span class='ident'>PrivateKey</span>::<span class='ident'>new</span>(<span class='ident'>Sha3</span>::<span class='ident'>sha3_256</span>());
<span class='macro'>assert</span><span class='macro'>!</span>( <span class='ident'>pk</span>.<span class='ident'>public_key</span>().<span class='ident'>one_values</span>.<span class='ident'>len</span>() <span class='op'>==</span> <span class='number'>256</span> <span class='op'>&amp;&amp;</span>
<span class='ident'>pk</span>.<span class='ident'>public_key</span>().<span class='ident'>zero_values</span>.<span class='ident'>len</span>() <span class='op'>==</span> <span class='number'>256</span>);
}
<span class='attribute'>#[<span class='ident'>test</span>]</span>
<span class='kw'>fn</span> <span class='ident'>test_public_key_length_512</span>() {
<span class='kw'>let</span> <span class='ident'>pk</span> <span class='op'>=</span> <span class='ident'>PrivateKey</span>::<span class='ident'>new</span>(<span class='ident'>Sha3</span>::<span class='ident'>sha3_512</span>());
<span class='macro'>assert</span><span class='macro'>!</span>( <span class='ident'>pk</span>.<span class='ident'>public_key</span>().<span class='ident'>one_values</span>.<span class='ident'>len</span>() <span class='op'>==</span> <span class='number'>512</span> <span class='op'>&amp;&amp;</span>
<span class='ident'>pk</span>.<span class='ident'>public_key</span>().<span class='ident'>zero_values</span>.<span class='ident'>len</span>() <span class='op'>==</span> <span class='number'>512</span>);
}
<span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>test</span>)]</span>
<span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>test</span>;
<span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>tests</span>;
</pre>
</section>
<section id='search' class="content hidden"></section>
@ -501,10 +595,12 @@
<script>
window.rootPath = "../../../";
window.currentCrate = "lamport";
window.currentCrate = "lamport_sigs";
window.playgroundUrl = "";
</script>
<script src="../../../jquery.js"></script>
<script src="../../../main.js"></script>
<script defer src="../../../search-index.js"></script>
</body>
</html>

View File

@ -1,5 +1,13 @@
//! *lamport* implements one-time hash-based signatures using the Lamport signature scheme.
#![deny(
missing_docs,
missing_debug_implementations, missing_copy_implementations,
trivial_casts, trivial_numeric_casts,
unsafe_code, unstable_features,
unused_import_braces, unused_qualifications
)]
extern crate ring;
extern crate rand;
@ -7,10 +15,11 @@ use rand::OsRng;
use rand::Rng;
use ring::digest::{ Algorithm, Context };
/// A type alias defining a Lamport signature
pub type LamportSignatureData = Vec<Vec<u8>>;
/// A one-time signing public key
#[derive(Clone)]
#[derive(Clone, Debug)]
pub struct PublicKey {
zero_values: Vec<Vec<u8>>,
one_values: Vec<Vec<u8>>,
@ -18,7 +27,7 @@ pub struct PublicKey {
}
/// A one-time signing private key
#[derive(Clone)]
#[derive(Clone, Debug)]
pub struct PrivateKey {
// For a n bits hash function: (n * n/8 bytes) for zero_values and one_values
zero_values: Vec<Vec<u8>>,
@ -34,10 +43,8 @@ impl From<PublicKey> for Vec<u8> {
}
impl PublicKey {
pub fn values(&self) -> (Vec<Vec<u8>>, Vec<Vec<u8>>) {
(self.zero_values.clone(), self.one_values.clone())
}
/// Intializes a public key with a byte vector.
/// Returns `None` if it couldn't parse the provided data
pub fn from_vec(vec: Vec<u8>, algorithm: &'static Algorithm) -> Option<PublicKey> {
let size = vec.len();
let hash_output_size = algorithm.output_len;
@ -74,6 +81,7 @@ impl PublicKey {
})
}
/// Serializes a public key into a byte vector
pub fn to_bytes(&self) -> Vec<u8> {
self.zero_values.iter().chain(self.one_values.iter()).fold(Vec::new(), |mut acc, i| {
acc.append(&mut i.clone());
@ -130,8 +138,6 @@ impl PrivateKey {
rng.fill_bytes(hash)
}
println!("{:?}", buffer);
buffer
};
@ -149,7 +155,7 @@ impl PrivateKey {
/// Returns the public key associated with this private key
pub fn public_key(&self) -> PublicKey {
let hash_values = |x: &Vec<Vec<u8>>| -> Vec<Vec<u8>> {
let buffer_byte = vec![0 as u8; self.algorithm.output_len];
let buffer_byte = vec![0u8; self.algorithm.output_len];
let mut buffer = vec![buffer_byte; self.algorithm.output_len * 8];
for i in 0 .. self.algorithm.output_len * 8 {