mirror of
https://github.com/mii443/lamport_sigs.rs.git
synced 2025-08-22 15:05:49 +00:00
Linting (#7)
This commit is contained in:
@ -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"
|
||||
|
10
docs/implementors/core/clone/trait.Clone.js
Normal file
10
docs/implementors/core/clone/trait.Clone.js
Normal 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;
|
||||
}
|
||||
|
||||
})()
|
@ -1,5 +1,5 @@
|
||||
(function() {var implementors = {};
|
||||
implementors["lamport"] = ["impl<T: Digest + <a class='trait' href='https://doc.rust-lang.org/nightly/core/clone/trait.Clone.html' title='core::clone::Clone'>Clone</a>> <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><T>",];
|
||||
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);
|
||||
|
10
docs/implementors/core/convert/trait.From.js
Normal file
10
docs/implementors/core/convert/trait.From.js
Normal 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><<a class='struct' href='lamport_sigs/struct.PublicKey.html' title='lamport_sigs::PublicKey'>PublicKey</a>> for <a class='struct' href='https://doc.rust-lang.org/nightly/collections/vec/struct.Vec.html' title='collections::vec::Vec'>Vec</a><<a class='primitive' href='https://doc.rust-lang.org/nightly/std/primitive.u8.html'>u8</a>>",];
|
||||
|
||||
if (window.register_implementors) {
|
||||
window.register_implementors(implementors);
|
||||
} else {
|
||||
window.pending_implementors = implementors;
|
||||
}
|
||||
|
||||
})()
|
10
docs/implementors/core/fmt/trait.Debug.js
Normal file
10
docs/implementors/core/fmt/trait.Debug.js
Normal 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;
|
||||
}
|
||||
|
||||
})()
|
@ -1,5 +1,5 @@
|
||||
(function() {var implementors = {};
|
||||
implementors["lamport"] = ["impl<T: Digest + <a class='trait' href='https://doc.rust-lang.org/nightly/core/clone/trait.Clone.html' title='core::clone::Clone'>Clone</a>> <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><T>",];
|
||||
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);
|
||||
|
@ -1 +0,0 @@
|
||||
initSidebarItems({"struct":[["PrivateKey","A one-time signing private key"],["PublicKey","A one-time signing public key"]]});
|
10
docs/lamport_sigs/LamportSignatureData.t.html
Normal file
10
docs/lamport_sigs/LamportSignatureData.t.html
Normal 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>
|
@ -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'>−</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>
|
1
docs/lamport_sigs/sidebar-items.js
Normal file
1
docs/lamport_sigs/sidebar-items.js
Normal 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"]]});
|
@ -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'>−</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<T: Digest + <a class='trait' href='https://doc.rust-lang.org/nightly/core/clone/trait.Clone.html' title='core::clone::Clone'>Clone</a>> { /* 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<T: Digest + <a class='trait' href='https://doc.rust-lang.org/nightly/core/clone/trait.Clone.html' title='core::clone::Clone'>Clone</a>> <a class='struct' href='../lamport/struct.PrivateKey.html' title='lamport::PrivateKey'>PrivateKey</a><T></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) -> <a class='struct' href='../lamport/struct.PrivateKey.html' title='lamport::PrivateKey'>PrivateKey</a><T></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: &'static <a class='struct' href='https://briansmith.org/rustdoc/ring/digest/struct.Algorithm.html' title='ring::digest::Algorithm'>Algorithm</a>) -> <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>(&self) -> <a class='struct' href='../lamport/struct.PublicKey.html' title='lamport::PublicKey'>PublicKey</a><T></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>(&self) -> <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>(&mut self, data: <a class='primitive' href='https://doc.rust-lang.org/nightly/std/primitive.slice.html'>&[</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>) -> <a class='enum' href='https://doc.rust-lang.org/nightly/core/result/enum.Result.html' title='core::result::Result'>Result</a><<a class='struct' href='https://doc.rust-lang.org/nightly/collections/vec/struct.Vec.html' title='collections::vec::Vec'>Vec</a><<a class='struct' href='https://doc.rust-lang.org/nightly/collections/vec/struct.Vec.html' title='collections::vec::Vec'>Vec</a><<a class='primitive' href='https://doc.rust-lang.org/nightly/std/primitive.u8.html'>u8</a>>>, &'static <a class='primitive' href='https://doc.rust-lang.org/nightly/std/primitive.str.html'>str</a>></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>(&mut self, data: <a class='primitive' href='https://doc.rust-lang.org/nightly/std/primitive.slice.html'>&[</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>) -> <a class='enum' href='https://doc.rust-lang.org/nightly/core/result/enum.Result.html' title='core::result::Result'>Result</a><<a class='type' href='../lamport_sigs/type.LamportSignatureData.html' title='lamport_sigs::LamportSignatureData'>LamportSignatureData</a>, &'static <a class='primitive' href='https://doc.rust-lang.org/nightly/std/primitive.str.html'>str</a>></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<T: Digest + <a class='trait' href='https://doc.rust-lang.org/nightly/core/clone/trait.Clone.html' title='core::clone::Clone'>Clone</a>> <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><T></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>(&self) -> <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>(&mut self, source: &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>(&self, __arg_0: &mut <a class='struct' href='https://doc.rust-lang.org/nightly/core/fmt/struct.Formatter.html' title='core::fmt::Formatter'>Formatter</a>) -> <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>(&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<T: Digest + <a class='trait' href='https://doc.rust-lang.org/nightly/core/clone/trait.Clone.html' title='core::clone::Clone'>Clone</a>> <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><T></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>(&self, other: &<a class='struct' href='../lamport/struct.PrivateKey.html' title='lamport::PrivateKey'>PrivateKey</a><T>) -> <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>(&self, other: &<a class='struct' href='../lamport_sigs/struct.PrivateKey.html' title='lamport_sigs::PrivateKey'>PrivateKey</a>) -> <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>(&self, other: &Rhs) -> <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>
|
131
docs/lamport_sigs/struct.PublicKey.html
Normal file
131
docs/lamport_sigs/struct.PublicKey.html
Normal 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'>−</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><<a class='primitive' href='https://doc.rust-lang.org/nightly/std/primitive.u8.html'>u8</a>>, algorithm: &'static <a class='struct' href='https://briansmith.org/rustdoc/ring/digest/struct.Algorithm.html' title='ring::digest::Algorithm'>Algorithm</a>) -> <a class='enum' href='https://doc.rust-lang.org/nightly/core/option/enum.Option.html' title='core::option::Option'>Option</a><<a class='struct' href='../lamport_sigs/struct.PublicKey.html' title='lamport_sigs::PublicKey'>PublicKey</a>></code></span></h4>
|
||||
<div class='docblock'><p>Intializes a public key with a byte vector.
|
||||
Returns <code>None</code> if it couldn'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>(&self) -> <a class='struct' href='https://doc.rust-lang.org/nightly/collections/vec/struct.Vec.html' title='collections::vec::Vec'>Vec</a><<a class='primitive' href='https://doc.rust-lang.org/nightly/std/primitive.u8.html'>u8</a>></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>(&self, signature: &<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'>&[</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>) -> <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>(&self) -> <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>(&mut self, source: &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>(&self, __arg_0: &mut <a class='struct' href='https://doc.rust-lang.org/nightly/core/fmt/struct.Formatter.html' title='core::fmt::Formatter'>Formatter</a>) -> <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>⇤</dt>
|
||||
<dd>Move up in search results</dd>
|
||||
<dt>⇥</dt>
|
||||
<dd>Move down in search results</dd>
|
||||
<dt>⏎</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>
|
@ -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'>−</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<T: Digest + <a class='trait' href='https://doc.rust-lang.org/nightly/core/clone/trait.Clone.html' title='core::clone::Clone'>Clone</a>> { /* 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<T: Digest + <a class='trait' href='https://doc.rust-lang.org/nightly/core/clone/trait.Clone.html' title='core::clone::Clone'>Clone</a>> <a class='struct' href='../lamport/struct.PublicKey.html' title='lamport::PublicKey'>PublicKey</a><T></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>(&self, signature: &<a class='struct' href='https://doc.rust-lang.org/nightly/collections/vec/struct.Vec.html' title='collections::vec::Vec'>Vec</a><<a class='struct' href='https://doc.rust-lang.org/nightly/collections/vec/struct.Vec.html' title='collections::vec::Vec'>Vec</a><<a class='primitive' href='https://doc.rust-lang.org/nightly/std/primitive.u8.html'>u8</a>>>, data: <a class='primitive' href='https://doc.rust-lang.org/nightly/std/primitive.slice.html'>&[</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>) -> <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><<a class='struct' href='https://doc.rust-lang.org/nightly/collections/vec/struct.Vec.html' title='collections::vec::Vec'>Vec</a><<a class='primitive' href='https://doc.rust-lang.org/nightly/std/primitive.u8.html'>u8</a>>>;</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
43
docs/playpen.js
Normal 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);
|
||||
};
|
||||
});
|
||||
});
|
@ -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 {
|
||||
|
@ -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'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);
|
||||
|
@ -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'><</span><span class='ident'>Vec</span><span class='op'><</span><span class='ident'>u8</span><span class='op'>>></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'><</span><span class='ident'>T</span>: <span class='ident'>Digest</span> <span class='op'>+</span> <span class='ident'>Clone</span><span class='op'>></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'><</span><span class='ident'>Vec</span><span class='op'><</span><span class='ident'>u8</span><span class='op'>>></span>,
|
||||
<span class='ident'>one_values</span>: <span class='ident'>Vec</span><span class='op'><</span><span class='ident'>Vec</span><span class='op'><</span><span class='ident'>u8</span><span class='op'>>></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'><</span><span class='ident'>Vec</span><span class='op'><</span><span class='ident'>u8</span><span class='op'>>></span>,
|
||||
<span class='ident'>algorithm</span>: <span class='kw-2'>&</span><span class='lifetime'>'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'><</span><span class='ident'>T</span>: <span class='ident'>Digest</span> <span class='op'>+</span> <span class='ident'>Clone</span><span class='op'>></span> {
|
||||
<span class='ident'>zero_values</span>: <span class='ident'>Vec</span><span class='op'><</span><span class='ident'>Vec</span><span class='op'><</span><span class='ident'>u8</span><span class='op'>>></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'><</span><span class='ident'>Vec</span><span class='op'><</span><span class='ident'>u8</span><span class='op'>>></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'><</span><span class='ident'>Vec</span><span class='op'><</span><span class='ident'>u8</span><span class='op'>>></span>,
|
||||
<span class='ident'>one_values</span>: <span class='ident'>Vec</span><span class='op'><</span><span class='ident'>Vec</span><span class='op'><</span><span class='ident'>u8</span><span class='op'>>></span>,
|
||||
<span class='ident'>algorithm</span>: <span class='kw-2'>&</span><span class='lifetime'>'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'><</span><span class='ident'>T</span>: <span class='ident'>Digest</span> <span class='op'>+</span> <span class='ident'>Clone</span><span class='op'>></span> <span class='ident'>PublicKey</span><span class='op'><</span><span class='ident'>T</span><span class='op'>></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'>&</span><span class='self'>self</span>,
|
||||
<span class='ident'>signature</span>: <span class='kw-2'>&</span><span class='ident'>Vec</span><span class='op'><</span><span class='ident'>Vec</span><span class='op'><</span><span class='ident'>u8</span><span class='op'>>></span>,
|
||||
<span class='ident'>data</span>:<span class='kw-2'>&</span>[<span class='ident'>u8</span>],
|
||||
) <span class='op'>-></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'><</span><span class='ident'>PublicKey</span><span class='op'>></span> <span class='kw'>for</span> <span class='ident'>Vec</span><span class='op'><</span><span class='ident'>u8</span><span class='op'>></span> {
|
||||
<span class='kw'>fn</span> <span class='ident'>from</span>(<span class='ident'>original</span>: <span class='ident'>PublicKey</span>) <span class='op'>-></span> <span class='ident'>Vec</span><span class='op'><</span><span class='ident'>u8</span><span class='op'>></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'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'><</span><span class='ident'>u8</span><span class='op'>></span>, <span class='ident'>algorithm</span>: <span class='kw-2'>&</span><span class='lifetime'>'static</span> <span class='ident'>Algorithm</span>) <span class='op'>-></span> <span class='prelude-ty'>Option</span><span class='op'><</span><span class='ident'>PublicKey</span><span class='op'>></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'>&</span><span class='self'>self</span>) <span class='op'>-></span> <span class='ident'>Vec</span><span class='op'><</span><span class='ident'>u8</span><span class='op'>></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'>&</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'>&</span><span class='self'>self</span>, <span class='ident'>signature</span>: <span class='kw-2'>&</span><span class='ident'>LamportSignatureData</span>, <span class='ident'>data</span>: <span class='kw-2'>&</span>[<span class='ident'>u8</span>]) <span class='op'>-></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'>&</span> (<span class='number'>1</span><span class='op'><<</span><span class='ident'>j</span>)) <span class='op'>></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'>&</span> (<span class='number'>1</span> <span class='op'><<</span> <span class='ident'>j</span>)) <span class='op'>></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'><</span><span class='ident'>T</span>: <span class='ident'>Digest</span> <span class='op'>+</span> <span class='ident'>Clone</span><span class='op'>></span> <span class='ident'>PrivateKey</span><span class='op'><</span><span class='ident'>T</span><span class='op'>></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'>-></span> <span class='ident'>PrivateKey</span><span class='op'><</span><span class='ident'>T</span><span class='op'>></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'>&</span><span class='ident'>T</span><span class='op'>|</span> <span class='op'>-></span> <span class='ident'>Vec</span><span class='op'><</span><span class='ident'>Vec</span><span class='op'><</span><span class='ident'>u8</span><span class='op'>>></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'>&</span><span class='lifetime'>'static</span> <span class='ident'>Algorithm</span>) <span class='op'>-></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'>-></span> <span class='ident'>Vec</span><span class='op'><</span><span class='ident'>Vec</span><span class='op'><</span><span class='ident'>u8</span><span class='op'>>></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'>=></span> <span class='ident'>g</span>,
|
||||
<span class='prelude-val'>Err</span>(<span class='ident'>e</span>) <span class='op'>=></span> <span class='macro'>panic</span><span class='macro'>!</span>(<span class='string'>"Failed to obtain OS RNG: {}"</span>, <span class='ident'>e</span>)
|
||||
<span class='prelude-val'>Err</span>(<span class='ident'>e</span>) <span class='op'>=></span> <span class='macro'>panic</span><span class='macro'>!</span>(<span class='string'>"Failed to obtain OS RNG: {}"</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'>&</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'>&</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'>&</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'>&</span><span class='self'>self</span>) <span class='op'>-></span> <span class='ident'>PublicKey</span><span class='op'><</span><span class='ident'>T</span><span class='op'>></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'>&</span><span class='self'>self</span>) <span class='op'>-></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'>&</span><span class='ident'>Vec</span><span class='op'><</span><span class='ident'>Vec</span><span class='op'><</span><span class='ident'>u8</span><span class='op'>>></span><span class='op'>|</span> <span class='op'>-></span> <span class='ident'>Vec</span><span class='op'><</span><span class='ident'>Vec</span><span class='op'><</span><span class='ident'>u8</span><span class='op'>>></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'>&</span><span class='ident'>Vec</span><span class='op'><</span><span class='ident'>Vec</span><span class='op'><</span><span class='ident'>u8</span><span class='op'>>></span>, <span class='ident'>hash_func</span>: <span class='kw-2'>&</span><span class='kw-2'>mut</span> <span class='ident'>Digest</span> <span class='op'>|</span> <span class='op'>-></span> <span class='ident'>Vec</span><span class='op'><</span><span class='ident'>Vec</span><span class='op'><</span><span class='ident'>u8</span><span class='op'>>></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'>&</span><span class='self'>self</span>.<span class='ident'>zero_values</span>, <span class='kw-2'>&</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'>&</span><span class='self'>self</span>.<span class='ident'>one_values</span>, <span class='kw-2'>&</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'>&</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'>&</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'>&</span><span class='kw-2'>mut</span> <span class='self'>self</span>, <span class='ident'>data</span>: <span class='kw-2'>&</span>[<span class='ident'>u8</span>]) <span class='op'>-></span> <span class='prelude-ty'>Result</span><span class='op'><</span><span class='ident'>Vec</span><span class='op'><</span><span class='ident'>Vec</span><span class='op'><</span><span class='ident'>u8</span><span class='op'>>></span>, <span class='kw-2'>&</span><span class='lifetime'>'static</span> <span class='ident'>str</span><span class='op'>></span> {
|
||||
<span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>sign</span>(<span class='kw-2'>&</span><span class='kw-2'>mut</span> <span class='self'>self</span>, <span class='ident'>data</span>: <span class='kw-2'>&</span>[<span class='ident'>u8</span>]) <span class='op'>-></span> <span class='prelude-ty'>Result</span><span class='op'><</span><span class='ident'>LamportSignatureData</span>, <span class='kw-2'>&</span><span class='lifetime'>'static</span> <span class='ident'>str</span><span class='op'>></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'>"Attempting to sign more than once."</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'>&</span> (<span class='number'>1</span><span class='op'><<</span><span class='ident'>j</span>)) <span class='op'>></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'>&</span> (<span class='number'>1</span> <span class='op'><<</span> <span class='ident'>j</span>)) <span class='op'>></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'><</span><span class='ident'>T</span>: <span class='ident'>Digest</span> <span class='op'>+</span> <span class='ident'>Clone</span><span class='op'>></span> <span class='ident'>Drop</span> <span class='kw'>for</span> <span class='ident'>PrivateKey</span><span class='op'><</span><span class='ident'>T</span><span class='op'>></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'>&</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'>&</span><span class='kw-2'>mut</span> <span class='ident'>Vec</span><span class='op'><</span><span class='ident'>Vec</span><span class='op'><</span><span class='ident'>u8</span><span class='op'>>></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'><</span><span class='ident'>T</span>: <span class='ident'>Digest</span> <span class='op'>+</span> <span class='ident'>Clone</span><span class='op'>></span> <span class='ident'>PartialEq</span> <span class='kw'>for</span> <span class='ident'>PrivateKey</span><span class='op'><</span><span class='ident'>T</span><span class='op'>></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'>&</span><span class='self'>self</span>, <span class='ident'>other</span>: <span class='kw-2'>&</span><span class='ident'>PrivateKey</span><span class='op'><</span><span class='ident'>T</span><span class='op'>></span>) <span class='op'>-></span> <span class='ident'>bool</span> {
|
||||
<span class='kw'>fn</span> <span class='ident'>eq</span>(<span class='kw-2'>&</span><span class='self'>self</span>, <span class='ident'>other</span>: <span class='kw-2'>&</span><span class='ident'>PrivateKey</span>) <span class='op'>-></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'>&&</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'>&&</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>
|
24
src/lib.rs
24
src/lib.rs
@ -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 {
|
||||
|
Reference in New Issue
Block a user