Support for wrapped_secrets containing versioning and MIME info.

This commit is contained in:
Frederic Jacobs
2017-01-05 20:57:10 +01:00
committed by GitHub
parent ef4d525703
commit 4b73faf3e4
43 changed files with 2902 additions and 396 deletions

View File

@ -2,7 +2,7 @@
name = "rusty_secrets"
version = "0.0.3"
authors = ["Frederic Jacobs <github@fredericjacobs.com>", "sellibitze"]
description = "Implementation of threshold Shamir secret sharing in the Rust programming language."
description = "Implementation of threshold Shamir's secret sharing in the Rust programming language."
homepage = "https://github.com/freedomofpress/RustySecrets"
license = "BSD-3-Clause"
readme = "README.md"

View File

@ -1,5 +1,5 @@
(function() {var implementors = {};
implementors["rusty_secrets"] = ["impl <a class='trait' href='https://doc.rust-lang.org/nightly/core/convert/trait.From.html' title='core::convert::From'>From</a>&lt;Error&gt; for <a class='struct' href='https://doc.rust-lang.org/nightly/std/io/error/struct.Error.html' title='std::io::error::Error'>Error</a>",];
implementors["rusty_secrets"] = ["impl <a class='trait' href='https://doc.rust-lang.org/nightly/core/convert/trait.From.html' title='core::convert::From'>From</a>&lt;<a class='struct' href='https://doc.rust-lang.org/nightly/std/io/error/struct.Error.html' title='std::io::error::Error'>Error</a>&gt; for <a class='struct' href='rusty_secrets/struct.RustyError.html' title='rusty_secrets::RustyError'>RustyError</a>","impl <a class='trait' href='https://doc.rust-lang.org/nightly/core/convert/trait.From.html' title='core::convert::From'>From</a>&lt;<a class='struct' href='rusty_secrets/struct.RustyError.html' title='rusty_secrets::RustyError'>RustyError</a>&gt; for <a class='struct' href='https://doc.rust-lang.org/nightly/std/io/error/struct.Error.html' title='std::io::error::Error'>Error</a>",];
if (window.register_implementors) {
window.register_implementors(implementors);

View File

@ -0,0 +1,10 @@
(function() {var implementors = {};
implementors["rusty_secrets"] = ["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='rusty_secrets/struct.RustyError.html' title='rusty_secrets::RustyError'>RustyError</a>",];
if (window.register_implementors) {
window.register_implementors(implementors);
} else {
window.pending_implementors = implementors;
}
})()

View File

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

View File

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

View File

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

View File

@ -570,8 +570,11 @@ 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);
@ -585,6 +588,7 @@ a.test-arrow {
}
a.test-arrow:hover{
background-color: #4e8bca;
text-decoration: none;
}
.section-header:hover a:after {

View File

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

View File

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

View File

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

View File

@ -47,22 +47,30 @@
<a id="toggle-all-docs" href="javascript:void(0)" title="collapse all docs">
[<span class='inner'>&#x2212;</span>]
</a>
</span><a id='src-0' class='srclink' href='../src/rusty_secrets/src/lib.rs.html#1-33' title='goto source code'>[src]</a></span></h1>
<div class='docblock'><p><code>RustySecrets</code> implements Shamir Secret Sharing in Rust. It provides the possibility to sign shares.</p>
</div><h2 id='functions' class='section-header'><a href="#functions">Functions</a></h2>
</span><a id='src-0' class='srclink' href='../src/rusty_secrets/src/lib.rs.html#1-35' title='goto source code'>[src]</a></span></h1>
<div class='docblock'><p><code>RustySecrets</code> implements Shamir&#39;s secret sharing in Rust. It provides the possibility to sign shares.</p>
</div><h2 id='modules' class='section-header'><a href="#modules">Modules</a></h2>
<table>
<tr class=' module-item'>
<td><a class='fn' href='fn.generate_shares.html'
title='rusty_secrets::generate_shares'>generate_shares</a></td>
<td><a class='mod' href='sss/index.html'
title='rusty_secrets::sss'>sss</a></td>
<td class='docblock-short'>
<p>Performs threshold k-out-of-n Shamir secret sharing.</p>
<p>SSS provides Shamir&#39;s secret sharing with raw data.</p>
</td>
</tr>
<tr class=' module-item'>
<td><a class='fn' href='fn.recover_secret.html'
title='rusty_secrets::recover_secret'>recover_secret</a></td>
<td><a class='mod' href='wrapped_secrets/index.html'
title='rusty_secrets::wrapped_secrets'>wrapped_secrets</a></td>
<td class='docblock-short'>
<p>Recovers the secret from a k-out-of-n Shamir secret sharing.</p>
<p>(Beta) <code>wrapped_secrets</code> provides Shamir&#39;s secret sharing with a wrapped secret. It currently offers versioning and MIME information about the data.</p>
</td>
</tr></table><h2 id='structs' class='section-header'><a href="#structs">Structs</a></h2>
<table>
<tr class=' module-item'>
<td><a class='struct' href='struct.RustyError.html'
title='rusty_secrets::RustyError'>RustyError</a></td>
<td class='docblock-short'>
<p>Error struct used for generating an <code>io::Error</code> from a generic description.</p>
</td>
</tr></table></section>
<section id='search' class="content hidden"></section>
@ -120,11 +128,9 @@
<script>
window.rootPath = "../";
window.currentCrate = "rusty_secrets";
window.playgroundUrl = "";
</script>
<script src="../jquery.js"></script>
<script src="../main.js"></script>
<script defer src="../search-index.js"></script>
</body>
</html>

View File

@ -1 +1 @@
initSidebarItems({"fn":[["generate_shares","Performs threshold k-out-of-n Shamir secret sharing."],["recover_secret","Recovers the secret from a k-out-of-n Shamir secret sharing."]]});
initSidebarItems({"mod":[["sss","SSS provides Shamir's secret sharing with raw data."],["wrapped_secrets","(Beta) `wrapped_secrets` provides Shamir's secret sharing with a wrapped secret. It currently offers versioning and MIME information about the data."]],"struct":[["RustyError","Error struct used for generating an `io::Error` from a generic description."]]});

View File

@ -1,10 +1,126 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta http-equiv="refresh" content="0;URL=../../rusty_secrets/fn.generate_shares.html">
<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 `generate_shares` fn in crate `rusty_secrets`.">
<meta name="keywords" content="rust, rustlang, rust-lang, generate_shares">
<title>rusty_secrets::sss::generate_shares - Rust</title>
<link rel="stylesheet" type="text/css" href="../../rustdoc.css">
<link rel="stylesheet" type="text/css" href="../../main.css">
</head>
<body>
<p>Redirecting to <a href="../../rusty_secrets/fn.generate_shares.html">../../rusty_secrets/fn.generate_shares.html</a>...</p>
<script>location.replace("../../rusty_secrets/fn.generate_shares.html" + location.search + location.hash);</script>
<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'>rusty_secrets</a>::<wbr><a href='index.html'>sss</a></p><script>window.sidebarCurrent = {name: 'generate_shares', ty: 'fn', 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 fn">
<h1 class='fqn'><span class='in-band'>Function <a href='../index.html'>rusty_secrets</a>::<wbr><a href='index.html'>sss</a>::<wbr><a class='fn' href=''>generate_shares</a></span><span class='out-of-band'><span id='render-detail'>
<a id="toggle-all-docs" href="javascript:void(0)" title="collapse all docs">
[<span class='inner'>&#x2212;</span>]
</a>
</span><a id='src-463' class='srclink' href='../../src/rusty_secrets/src/sss.rs.html#34-69' title='goto source code'>[src]</a></span></h1>
<pre class='rust fn'>pub fn generate_shares(k: <a class='primitive' href='https://doc.rust-lang.org/nightly/std/primitive.u8.html'>u8</a>,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; n: <a class='primitive' href='https://doc.rust-lang.org/nightly/std/primitive.u8.html'>u8</a>,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; secret: <a class='primitive' href='https://doc.rust-lang.org/nightly/std/primitive.slice.html'>&amp;[</a><a class='primitive' href='https://doc.rust-lang.org/nightly/std/primitive.u8.html'>u8</a><a class='primitive' href='https://doc.rust-lang.org/nightly/std/primitive.slice.html'>]</a>,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sign_shares: <a class='primitive' href='https://doc.rust-lang.org/nightly/std/primitive.bool.html'>bool</a>)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -&gt; <a class='type' href='https://doc.rust-lang.org/nightly/std/io/error/type.Result.html' title='std::io::error::Result'>Result</a>&lt;<a class='struct' href='https://doc.rust-lang.org/nightly/collections/vec/struct.Vec.html' title='collections::vec::Vec'>Vec</a>&lt;<a class='struct' href='https://doc.rust-lang.org/nightly/collections/string/struct.String.html' title='collections::string::String'>String</a>&gt;&gt;</pre><div class='docblock'><p>Performs threshold k-out-of-n Shamir&#39;s secret sharing.</p>
<h1 id='examples' class='section-header'><a href='#examples'>Examples</a></h1>
<pre class='rust rust-example-rendered'>
<span class='kw'>use</span> <span class='ident'>rusty_secrets</span>::<span class='ident'>sss</span>::<span class='ident'>generate_shares</span>;
<span class='kw'>let</span> <span class='ident'>secret</span> <span class='op'>=</span> <span class='string'>&quot;These programs were never about terrorism: theyre about economic spying,
social control, and diplomatic manipulation. Theyre about power.&quot;</span>.<span class='ident'>to_string</span>();
<span class='kw'>match</span> <span class='ident'>generate_shares</span>(<span class='number'>7</span>, <span class='number'>10</span>, <span class='kw-2'>&amp;</span><span class='ident'>secret</span>.<span class='ident'>into_bytes</span>(), <span class='bool-val'>true</span>){
<span class='prelude-val'>Ok</span>(<span class='ident'>shares</span>) <span class='op'>=&gt;</span> {
<span class='comment'>// Do something with the shares</span>
},
<span class='prelude-val'>Err</span>(_) <span class='op'>=&gt;</span> {}<span class='comment'>// Deal with error}</span>
}</pre>
</div></section>
<section id='search' class="content hidden"></section>
<section class="footer"></section>
<aside id="help" class="hidden">
<div>
<h1 class="hidden">Help</h1>
<div class="shortcuts">
<h2>Keyboard Shortcuts</h2>
<dl>
<dt>?</dt>
<dd>Show this help dialog</dd>
<dt>S</dt>
<dd>Focus the search field</dd>
<dt>&larrb;</dt>
<dd>Move up in search results</dd>
<dt>&rarrb;</dt>
<dd>Move down in search results</dd>
<dt>&#9166;</dt>
<dd>Go to active search result</dd>
<dt>+</dt>
<dd>Collapse/expand all sections</dd>
</dl>
</div>
<div class="infos">
<h2>Search Tricks</h2>
<p>
Prefix searches with a type followed by a colon (e.g.
<code>fn:</code>) to restrict the search to a given type.
</p>
<p>
Accepted types are: <code>fn</code>, <code>mod</code>,
<code>struct</code>, <code>enum</code>,
<code>trait</code>, <code>type</code>, <code>macro</code>,
and <code>const</code>.
</p>
<p>
Search functions by type signature (e.g.
<code>vec -> usize</code> or <code>* -> vec</code>)
</p>
</div>
</div>
</aside>
<script>
window.rootPath = "../../";
window.currentCrate = "rusty_secrets";
</script>
<script src="../../jquery.js"></script>
<script src="../../main.js"></script>
<script defer src="../../search-index.js"></script>
</body>
</html>

View File

@ -1,10 +1,131 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta http-equiv="refresh" content="0;URL=../../rusty_secrets/fn.recover_secret.html">
<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 `recover_secret` fn in crate `rusty_secrets`.">
<meta name="keywords" content="rust, rustlang, rust-lang, recover_secret">
<title>rusty_secrets::sss::recover_secret - Rust</title>
<link rel="stylesheet" type="text/css" href="../../rustdoc.css">
<link rel="stylesheet" type="text/css" href="../../main.css">
</head>
<body>
<p>Redirecting to <a href="../../rusty_secrets/fn.recover_secret.html">../../rusty_secrets/fn.recover_secret.html</a>...</p>
<script>location.replace("../../rusty_secrets/fn.recover_secret.html" + location.search + location.hash);</script>
<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'>rusty_secrets</a>::<wbr><a href='index.html'>sss</a></p><script>window.sidebarCurrent = {name: 'recover_secret', ty: 'fn', 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 fn">
<h1 class='fqn'><span class='in-band'>Function <a href='../index.html'>rusty_secrets</a>::<wbr><a href='index.html'>sss</a>::<wbr><a class='fn' href=''>recover_secret</a></span><span class='out-of-band'><span id='render-detail'>
<a id="toggle-all-docs" href="javascript:void(0)" title="collapse all docs">
[<span class='inner'>&#x2212;</span>]
</a>
</span><a id='src-493' class='srclink' href='../../src/rusty_secrets/src/sss.rs.html#113-128' title='goto source code'>[src]</a></span></h1>
<pre class='rust fn'>pub fn recover_secret(shares: <a class='struct' href='https://doc.rust-lang.org/nightly/collections/vec/struct.Vec.html' title='collections::vec::Vec'>Vec</a>&lt;<a class='struct' href='https://doc.rust-lang.org/nightly/collections/string/struct.String.html' title='collections::string::String'>String</a>&gt;,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; verify_signatures: <a class='primitive' href='https://doc.rust-lang.org/nightly/std/primitive.bool.html'>bool</a>)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -&gt; <a class='enum' href='https://doc.rust-lang.org/nightly/core/result/enum.Result.html' title='core::result::Result'>Result</a>&lt;<a class='struct' href='https://doc.rust-lang.org/nightly/collections/vec/struct.Vec.html' title='collections::vec::Vec'>Vec</a>&lt;<a class='primitive' href='https://doc.rust-lang.org/nightly/std/primitive.u8.html'>u8</a>&gt;, <a class='struct' href='../../rusty_secrets/struct.RustyError.html' title='rusty_secrets::RustyError'>RustyError</a>&gt;</pre><div class='docblock'><p>Recovers the secret from a k-out-of-n Shamir&#39;s secret sharing.</p>
<p>At least <code>k</code> distinct shares need to be provided to recover the share.</p>
<h1 id='examples' class='section-header'><a href='#examples'>Examples</a></h1>
<pre class='rust rust-example-rendered'>
<span class='kw'>use</span> <span class='ident'>rusty_secrets</span>::<span class='ident'>sss</span>::<span class='ident'>recover_secret</span>;
<span class='kw'>let</span> <span class='ident'>share1</span> <span class='op'>=</span> <span class='string'>&quot;2-1-Cha7s14Q/mSwWko0ittr+/Uf79RHQMIP&quot;</span>.<span class='ident'>to_string</span>();
<span class='kw'>let</span> <span class='ident'>share2</span> <span class='op'>=</span> <span class='string'>&quot;2-4-ChaydsUJDypD9ZWxwvIICh/cmZvzusOF&quot;</span>.<span class='ident'>to_string</span>();
<span class='kw'>let</span> <span class='ident'>shares</span> <span class='op'>=</span> <span class='macro'>vec</span><span class='macro'>!</span>[<span class='ident'>share1</span>, <span class='ident'>share2</span>];
<span class='kw'>match</span> <span class='ident'>recover_secret</span>(<span class='ident'>shares</span>, <span class='bool-val'>false</span>) {
<span class='prelude-val'>Ok</span>(<span class='ident'>secret</span>) <span class='op'>=&gt;</span> {
<span class='comment'>// Do something with the secret</span>
},
<span class='prelude-val'>Err</span>(<span class='ident'>e</span>) <span class='op'>=&gt;</span> {
<span class='comment'>// Deal with the error</span>
}
}</pre>
</div></section>
<section id='search' class="content hidden"></section>
<section class="footer"></section>
<aside id="help" class="hidden">
<div>
<h1 class="hidden">Help</h1>
<div class="shortcuts">
<h2>Keyboard Shortcuts</h2>
<dl>
<dt>?</dt>
<dd>Show this help dialog</dd>
<dt>S</dt>
<dd>Focus the search field</dd>
<dt>&larrb;</dt>
<dd>Move up in search results</dd>
<dt>&rarrb;</dt>
<dd>Move down in search results</dd>
<dt>&#9166;</dt>
<dd>Go to active search result</dd>
<dt>+</dt>
<dd>Collapse/expand all sections</dd>
</dl>
</div>
<div class="infos">
<h2>Search Tricks</h2>
<p>
Prefix searches with a type followed by a colon (e.g.
<code>fn:</code>) to restrict the search to a given type.
</p>
<p>
Accepted types are: <code>fn</code>, <code>mod</code>,
<code>struct</code>, <code>enum</code>,
<code>trait</code>, <code>type</code>, <code>macro</code>,
and <code>const</code>.
</p>
<p>
Search functions by type signature (e.g.
<code>vec -> usize</code> or <code>* -> vec</code>)
</p>
</div>
</div>
</aside>
<script>
window.rootPath = "../../";
window.currentCrate = "rusty_secrets";
</script>
<script src="../../jquery.js"></script>
<script src="../../main.js"></script>
<script defer src="../../search-index.js"></script>
</body>
</html>

View File

@ -0,0 +1,128 @@
<!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 `sss` mod in crate `rusty_secrets`.">
<meta name="keywords" content="rust, rustlang, rust-lang, sss">
<title>rusty_secrets::sss - 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'>rusty_secrets</a></p><script>window.sidebarCurrent = {name: 'sss', ty: 'mod', 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 mod">
<h1 class='fqn'><span class='in-band'>Module <a href='../index.html'>rusty_secrets</a>::<wbr><a class='mod' href=''>sss</a></span><span class='out-of-band'><span id='render-detail'>
<a id="toggle-all-docs" href="javascript:void(0)" title="collapse all docs">
[<span class='inner'>&#x2212;</span>]
</a>
</span><a id='src-448' class='srclink' href='../../src/rusty_secrets/src/sss.rs.html#1-128' title='goto source code'>[src]</a></span></h1>
<div class='docblock'><p>SSS provides Shamir&#39;s secret sharing with raw data.</p>
</div><h2 id='functions' class='section-header'><a href="#functions">Functions</a></h2>
<table>
<tr class=' module-item'>
<td><a class='fn' href='fn.generate_shares.html'
title='rusty_secrets::sss::generate_shares'>generate_shares</a></td>
<td class='docblock-short'>
<p>Performs threshold k-out-of-n Shamir&#39;s secret sharing.</p>
</td>
</tr>
<tr class=' module-item'>
<td><a class='fn' href='fn.recover_secret.html'
title='rusty_secrets::sss::recover_secret'>recover_secret</a></td>
<td class='docblock-short'>
<p>Recovers the secret from a k-out-of-n Shamir&#39;s secret sharing.</p>
</td>
</tr></table></section>
<section id='search' class="content hidden"></section>
<section class="footer"></section>
<aside id="help" class="hidden">
<div>
<h1 class="hidden">Help</h1>
<div class="shortcuts">
<h2>Keyboard Shortcuts</h2>
<dl>
<dt>?</dt>
<dd>Show this help dialog</dd>
<dt>S</dt>
<dd>Focus the search field</dd>
<dt>&larrb;</dt>
<dd>Move up in search results</dd>
<dt>&rarrb;</dt>
<dd>Move down in search results</dd>
<dt>&#9166;</dt>
<dd>Go to active search result</dd>
<dt>+</dt>
<dd>Collapse/expand all sections</dd>
</dl>
</div>
<div class="infos">
<h2>Search Tricks</h2>
<p>
Prefix searches with a type followed by a colon (e.g.
<code>fn:</code>) to restrict the search to a given type.
</p>
<p>
Accepted types are: <code>fn</code>, <code>mod</code>,
<code>struct</code>, <code>enum</code>,
<code>trait</code>, <code>type</code>, <code>macro</code>,
and <code>const</code>.
</p>
<p>
Search functions by type signature (e.g.
<code>vec -> usize</code> or <code>* -> vec</code>)
</p>
</div>
</div>
</aside>
<script>
window.rootPath = "../../";
window.currentCrate = "rusty_secrets";
</script>
<script src="../../jquery.js"></script>
<script src="../../main.js"></script>
<script defer src="../../search-index.js"></script>
</body>
</html>

View File

@ -0,0 +1 @@
initSidebarItems({"fn":[["generate_shares","Performs threshold k-out-of-n Shamir's secret sharing."],["recover_secret","Recovers the secret from a k-out-of-n Shamir's secret sharing."]]});

View File

@ -0,0 +1,135 @@
<!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 `RustyError` struct in crate `rusty_secrets`.">
<meta name="keywords" content="rust, rustlang, rust-lang, RustyError">
<title>rusty_secrets::RustyError - 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'>rusty_secrets</a></p><script>window.sidebarCurrent = {name: 'RustyError', 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'>rusty_secrets</a>::<wbr><a class='struct' href=''>RustyError</a></span><span class='out-of-band'><span id='render-detail'>
<a id="toggle-all-docs" href="javascript:void(0)" title="collapse all docs">
[<span class='inner'>&#x2212;</span>]
</a>
</span><a id='src-522' class='srclink' href='../src/rusty_secrets/src/custom_error.rs.html#9-14' title='goto source code'>[src]</a></span></h1>
<pre class='rust struct'>pub struct RustyError { /* fields omitted */ }</pre><div class='docblock'><p>Error struct used for generating an <code>io::Error</code> from a generic description.</p>
</div><h2 id='methods'>Methods</h2><h3 class='impl'><span class='in-band'><code>impl <a class='struct' href='../rusty_secrets/struct.RustyError.html' title='rusty_secrets::RustyError'>RustyError</a></code></span><span class='out-of-band'><div class='ghost'></div><a id='src-17' class='srclink' href='../src/rusty_secrets/src/custom_error.rs.html#29-102' title='goto source code'>[src]</a></span></h3>
<div class='impl-items'><h4 id='method.with_type' class='method'><span id='with_type.v' class='invisible'><code>fn <a href='#method.with_type' class='fnname'>with_type</a>(error_type: RustyErrorTypes) -&gt; <a class='struct' href='../rusty_secrets/struct.RustyError.html' title='rusty_secrets::RustyError'>RustyError</a></code></span></h4>
<div class='docblock'><p>Returns a <code>RustyError</code> with a given <code>RustyErrorType</code>.</p>
</div><h4 id='method.share_index' class='method'><span id='share_index.v' class='invisible'><code>fn <a href='#method.share_index' class='fnname'>share_index</a>(&amp;self) -&gt; <a class='enum' href='https://doc.rust-lang.org/nightly/core/option/enum.Option.html' title='core::option::Option'>Option</a>&lt;<a class='primitive' href='https://doc.rust-lang.org/nightly/std/primitive.u8.html'>u8</a>&gt;</code></span></h4>
<div class='docblock'><p>Returns the index of the share that raised the error, if any.</p>
</div><h4 id='method.share_groups' class='method'><span id='share_groups.v' class='invisible'><code>fn <a href='#method.share_groups' class='fnname'>share_groups</a>(&amp;self) -&gt; <a class='enum' href='https://doc.rust-lang.org/nightly/core/option/enum.Option.html' title='core::option::Option'>Option</a>&lt;<a class='struct' href='https://doc.rust-lang.org/nightly/collections/vec/struct.Vec.html' title='collections::vec::Vec'>Vec</a>&lt;<a class='struct' href='https://doc.rust-lang.org/nightly/collections/vec/struct.Vec.html' title='collections::vec::Vec'>Vec</a>&lt;<a class='primitive' href='https://doc.rust-lang.org/nightly/std/primitive.u8.html'>u8</a>&gt;&gt;&gt;</code></span></h4>
<div class='docblock'><p>Returns the group of shares that were generated during the same secret share.
It can be used to provide a debug message to the user telling him what shares are incompatible.</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/fmt/trait.Debug.html' title='core::fmt::Debug'>Debug</a> for <a class='struct' href='../rusty_secrets/struct.RustyError.html' title='rusty_secrets::RustyError'>RustyError</a></code></span><span class='out-of-band'><div class='ghost'></div><a id='src-527' class='srclink' href='../src/rusty_secrets/src/custom_error.rs.html#8' title='goto source code'>[src]</a></span></h3>
<div class='impl-items'><h4 id='method.fmt' class='method'><span id='fmt.v' class='invisible'><code>fn <a href='https://doc.rust-lang.org/nightly/core/fmt/trait.Debug.html#tymethod.fmt' class='fnname'>fmt</a>(&amp;self, __arg_0: &amp;mut <a class='struct' href='https://doc.rust-lang.org/nightly/core/fmt/struct.Formatter.html' title='core::fmt::Formatter'>Formatter</a>) -&gt; <a class='type' href='https://doc.rust-lang.org/nightly/core/fmt/type.Result.html' title='core::fmt::Result'>Result</a></code></span></h4>
<div class='docblock'><p>Formats the value using the given formatter.</p>
</div></div><h3 class='impl'><span class='in-band'><code>impl <a class='trait' href='https://doc.rust-lang.org/nightly/core/fmt/trait.Display.html' title='core::fmt::Display'>Display</a> for <a class='struct' href='../rusty_secrets/struct.RustyError.html' title='rusty_secrets::RustyError'>RustyError</a></code></span><span class='out-of-band'><div class='ghost'></div><a id='src-46' class='srclink' href='../src/rusty_secrets/src/custom_error.rs.html#104-111' title='goto source code'>[src]</a></span></h3>
<div class='impl-items'><h4 id='method.fmt-1' class='method'><span id='fmt.v-1' class='invisible'><code>fn <a href='https://doc.rust-lang.org/nightly/core/fmt/trait.Display.html#tymethod.fmt' class='fnname'>fmt</a>(&amp;self, f: &amp;mut <a class='struct' href='https://doc.rust-lang.org/nightly/core/fmt/struct.Formatter.html' title='core::fmt::Formatter'>Formatter</a>) -&gt; <a class='type' href='https://doc.rust-lang.org/nightly/core/fmt/type.Result.html' title='core::fmt::Result'>Result</a></code></span></h4>
<div class='docblock'><p>Formats the value using the given formatter.</p>
</div></div><h3 class='impl'><span class='in-band'><code>impl <a class='trait' href='https://doc.rust-lang.org/nightly/std/error/trait.Error.html' title='std::error::Error'>Error</a> for <a class='struct' href='../rusty_secrets/struct.RustyError.html' title='rusty_secrets::RustyError'>RustyError</a></code></span><span class='out-of-band'><div class='ghost'></div><a id='src-52' class='srclink' href='../src/rusty_secrets/src/custom_error.rs.html#113-120' title='goto source code'>[src]</a></span></h3>
<div class='impl-items'><h4 id='method.description' class='method'><span id='description.v' class='invisible'><code>fn <a href='https://doc.rust-lang.org/nightly/std/error/trait.Error.html#tymethod.description' class='fnname'>description</a>(&amp;self) -&gt; &amp;<a class='primitive' href='https://doc.rust-lang.org/nightly/std/primitive.str.html'>str</a></code></span></h4>
<div class='docblock'><p>A short description of the error. <a href="https://doc.rust-lang.org/nightly/std/error/trait.Error.html#tymethod.description">Read more</a></p>
</div><h4 id='method.cause' class='method'><span id='cause.v' class='invisible'><code>fn <a href='https://doc.rust-lang.org/nightly/std/error/trait.Error.html#method.cause' class='fnname'>cause</a>(&amp;self) -&gt; <a class='enum' href='https://doc.rust-lang.org/nightly/core/option/enum.Option.html' title='core::option::Option'>Option</a>&lt;&amp;<a class='trait' href='https://doc.rust-lang.org/nightly/std/error/trait.Error.html' title='std::error::Error'>Error</a>&gt;</code></span></h4>
<div class='docblock'><p>The lower-level cause of this error, if any. <a href="https://doc.rust-lang.org/nightly/std/error/trait.Error.html#method.cause">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/convert/trait.From.html' title='core::convert::From'>From</a>&lt;<a class='struct' href='https://doc.rust-lang.org/nightly/std/io/error/struct.Error.html' title='std::io::error::Error'>Error</a>&gt; for <a class='struct' href='../rusty_secrets/struct.RustyError.html' title='rusty_secrets::RustyError'>RustyError</a></code></span><span class='out-of-band'><div class='ghost'></div><a id='src-57' class='srclink' href='../src/rusty_secrets/src/custom_error.rs.html#122-128' title='goto source code'>[src]</a></span></h3>
<div class='impl-items'><h4 id='method.from' class='method'><span id='from.v' class='invisible'><code>fn <a href='https://doc.rust-lang.org/nightly/core/convert/trait.From.html#tymethod.from' class='fnname'>from</a>(err: <a class='struct' href='https://doc.rust-lang.org/nightly/std/io/error/struct.Error.html' title='std::io::error::Error'>Error</a>) -&gt; <a class='struct' href='../rusty_secrets/struct.RustyError.html' title='rusty_secrets::RustyError'>RustyError</a></code></span></h4>
<div class='docblock'><p>Performs the conversion.</p>
</div></div></section>
<section id='search' class="content hidden"></section>
<section class="footer"></section>
<aside id="help" class="hidden">
<div>
<h1 class="hidden">Help</h1>
<div class="shortcuts">
<h2>Keyboard Shortcuts</h2>
<dl>
<dt>?</dt>
<dd>Show this help dialog</dd>
<dt>S</dt>
<dd>Focus the search field</dd>
<dt>&larrb;</dt>
<dd>Move up in search results</dd>
<dt>&rarrb;</dt>
<dd>Move down in search results</dd>
<dt>&#9166;</dt>
<dd>Go to active search result</dd>
<dt>+</dt>
<dd>Collapse/expand all sections</dd>
</dl>
</div>
<div class="infos">
<h2>Search Tricks</h2>
<p>
Prefix searches with a type followed by a colon (e.g.
<code>fn:</code>) to restrict the search to a given type.
</p>
<p>
Accepted types are: <code>fn</code>, <code>mod</code>,
<code>struct</code>, <code>enum</code>,
<code>trait</code>, <code>type</code>, <code>macro</code>,
and <code>const</code>.
</p>
<p>
Search functions by type signature (e.g.
<code>vec -> usize</code> or <code>* -> vec</code>)
</p>
</div>
</div>
</aside>
<script>
window.rootPath = "../";
window.currentCrate = "rusty_secrets";
</script>
<script src="../jquery.js"></script>
<script src="../main.js"></script>
<script defer src="../search-index.js"></script>
</body>
</html>

View File

@ -7,10 +7,10 @@
<meta name="description" content="API documentation for the Rust `generate_shares` fn in crate `rusty_secrets`.">
<meta name="keywords" content="rust, rustlang, rust-lang, generate_shares">
<title>rusty_secrets::generate_shares - Rust</title>
<title>rusty_secrets::wrapped_secrets::generate_shares - Rust</title>
<link rel="stylesheet" type="text/css" href="../rustdoc.css">
<link rel="stylesheet" type="text/css" href="../main.css">
<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'>rusty_secrets</a></p><script>window.sidebarCurrent = {name: 'generate_shares', ty: 'fn', relpath: ''};</script><script defer src="sidebar-items.js"></script>
<p class='location'><a href='../index.html'>rusty_secrets</a>::<wbr><a href='index.html'>wrapped_secrets</a></p><script>window.sidebarCurrent = {name: 'generate_shares', ty: 'fn', relpath: ''};</script><script defer src="sidebar-items.js"></script>
</nav>
<nav class="sub">
@ -43,25 +43,25 @@
</nav>
<section id='main' class="content fn">
<h1 class='fqn'><span class='in-band'>Function <a href='index.html'>rusty_secrets</a>::<wbr><a class='fn' href=''>generate_shares</a></span><span class='out-of-band'><span id='render-detail'>
<h1 class='fqn'><span class='in-band'>Function <a href='../index.html'>rusty_secrets</a>::<wbr><a href='index.html'>wrapped_secrets</a>::<wbr><a class='fn' href=''>generate_shares</a></span><span class='out-of-band'><span id='render-detail'>
<a id="toggle-all-docs" href="javascript:void(0)" title="collapse all docs">
[<span class='inner'>&#x2212;</span>]
</a>
</span><a id='src-370' class='srclink' href='../src/rusty_secrets/src/sss.rs.html#32-67' title='goto source code'>[src]</a></span></h1>
<pre class='rust fn'>pub fn generate_shares(k: <a class='primitive' href='https://doc.rust-lang.org/nightly/std/primitive.u8.html'>u8</a>, n: <a class='primitive' href='https://doc.rust-lang.org/nightly/std/primitive.u8.html'>u8</a>, secret: <a class='primitive' href='https://doc.rust-lang.org/nightly/std/primitive.slice.html'>&amp;[</a><a class='primitive' href='https://doc.rust-lang.org/nightly/std/primitive.u8.html'>u8</a><a class='primitive' href='https://doc.rust-lang.org/nightly/std/primitive.slice.html'>]</a>, sign_shares: <a class='primitive' href='https://doc.rust-lang.org/nightly/std/primitive.bool.html'>bool</a>) -&gt; <a class='type' href='https://doc.rust-lang.org/nightly/std/io/error/type.Result.html' title='std::io::error::Result'>Result</a>&lt;<a class='struct' href='https://doc.rust-lang.org/nightly/collections/vec/struct.Vec.html' title='collections::vec::Vec'>Vec</a>&lt;<a class='struct' href='https://doc.rust-lang.org/nightly/collections/string/struct.String.html' title='collections::string::String'>String</a>&gt;&gt;</pre><div class='docblock'><p>Performs threshold k-out-of-n Shamir secret sharing.</p>
</span><a id='src-510' class='srclink' href='../../src/rusty_secrets/src/wrapped_secrets.rs.html#26-33' title='goto source code'>[src]</a></span></h1>
<pre class='rust fn'>pub fn generate_shares(k: <a class='primitive' href='https://doc.rust-lang.org/nightly/std/primitive.u8.html'>u8</a>,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; n: <a class='primitive' href='https://doc.rust-lang.org/nightly/std/primitive.u8.html'>u8</a>,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; secret: <a class='primitive' href='https://doc.rust-lang.org/nightly/std/primitive.slice.html'>&amp;[</a><a class='primitive' href='https://doc.rust-lang.org/nightly/std/primitive.u8.html'>u8</a><a class='primitive' href='https://doc.rust-lang.org/nightly/std/primitive.slice.html'>]</a>,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mime_type: &amp;<a class='primitive' href='https://doc.rust-lang.org/nightly/std/primitive.str.html'>str</a>,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sign_shares: <a class='primitive' href='https://doc.rust-lang.org/nightly/std/primitive.bool.html'>bool</a>)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -&gt; <a class='type' href='https://doc.rust-lang.org/nightly/std/io/error/type.Result.html' title='std::io::error::Result'>Result</a>&lt;<a class='struct' href='https://doc.rust-lang.org/nightly/collections/vec/struct.Vec.html' title='collections::vec::Vec'>Vec</a>&lt;<a class='struct' href='https://doc.rust-lang.org/nightly/collections/string/struct.String.html' title='collections::string::String'>String</a>&gt;&gt;</pre><div class='docblock'><p>Performs threshold k-out-of-n Shamir&#39;s secret sharing.</p>
<h1 id='examples' class='section-header'><a href='#examples'>Examples</a></h1>
<pre class='rust rust-example-rendered'>
<span class='kw'>use</span> <span class='ident'>rusty_secrets</span>::<span class='ident'>generate_shares</span>;
<span class='kw'>use</span> <span class='ident'>rusty_secrets</span>::<span class='ident'>wrapped_secrets</span>::<span class='ident'>generate_shares</span>;
<span class='kw'>let</span> <span class='ident'>secret</span> <span class='op'>=</span> <span class='string'>&quot;These programs were never about terrorism: theyre about economic spying,
social control, and diplomatic manipulation. Theyre about power.&quot;</span>.<span class='ident'>to_string</span>();
<span class='kw'>match</span> <span class='ident'>generate_shares</span>(<span class='number'>7</span>, <span class='number'>10</span>, <span class='kw-2'>&amp;</span><span class='ident'>secret</span>.<span class='ident'>into_bytes</span>(), <span class='bool-val'>true</span>){
<span class='kw'>match</span> <span class='ident'>generate_shares</span>(<span class='number'>7</span>, <span class='number'>10</span>, <span class='kw-2'>&amp;</span><span class='ident'>secret</span>.<span class='ident'>into_bytes</span>(), <span class='string'>&quot;text/html&quot;</span>, <span class='bool-val'>true</span>){
<span class='prelude-val'>Ok</span>(<span class='ident'>shares</span>) <span class='op'>=&gt;</span> {
<span class='comment'>// Do something with the shares</span>
},
<span class='prelude-val'>Err</span>(_) <span class='op'>=&gt;</span> {}<span class='comment'>// Deal with error}</span>
}<a class='test-arrow' target='_blank' href=''>Run</a></pre>
}</pre>
</div></section>
<section id='search' class="content hidden"></section>
@ -116,13 +116,11 @@
<script>
window.rootPath = "../";
window.rootPath = "../../";
window.currentCrate = "rusty_secrets";
window.playgroundUrl = "";
</script>
<script src="../jquery.js"></script>
<script src="../main.js"></script>
<script defer src="../search-index.js"></script>
<script src="../../jquery.js"></script>
<script src="../../main.js"></script>
<script defer src="../../search-index.js"></script>
</body>
</html>

View File

@ -7,10 +7,10 @@
<meta name="description" content="API documentation for the Rust `recover_secret` fn in crate `rusty_secrets`.">
<meta name="keywords" content="rust, rustlang, rust-lang, recover_secret">
<title>rusty_secrets::recover_secret - Rust</title>
<title>rusty_secrets::wrapped_secrets::recover_secret - Rust</title>
<link rel="stylesheet" type="text/css" href="../rustdoc.css">
<link rel="stylesheet" type="text/css" href="../main.css">
<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'>rusty_secrets</a></p><script>window.sidebarCurrent = {name: 'recover_secret', ty: 'fn', relpath: ''};</script><script defer src="sidebar-items.js"></script>
<p class='location'><a href='../index.html'>rusty_secrets</a>::<wbr><a href='index.html'>wrapped_secrets</a></p><script>window.sidebarCurrent = {name: 'recover_secret', ty: 'fn', relpath: ''};</script><script defer src="sidebar-items.js"></script>
</nav>
<nav class="sub">
@ -43,18 +43,18 @@
</nav>
<section id='main' class="content fn">
<h1 class='fqn'><span class='in-band'>Function <a href='index.html'>rusty_secrets</a>::<wbr><a class='fn' href=''>recover_secret</a></span><span class='out-of-band'><span id='render-detail'>
<h1 class='fqn'><span class='in-band'>Function <a href='../index.html'>rusty_secrets</a>::<wbr><a href='index.html'>wrapped_secrets</a>::<wbr><a class='fn' href=''>recover_secret</a></span><span class='out-of-band'><span id='render-detail'>
<a id="toggle-all-docs" href="javascript:void(0)" title="collapse all docs">
[<span class='inner'>&#x2212;</span>]
</a>
</span><a id='src-406' class='srclink' href='../src/rusty_secrets/src/sss.rs.html#111-126' title='goto source code'>[src]</a></span></h1>
<pre class='rust fn'>pub fn recover_secret(shares: <a class='struct' href='https://doc.rust-lang.org/nightly/collections/vec/struct.Vec.html' title='collections::vec::Vec'>Vec</a>&lt;<a class='struct' href='https://doc.rust-lang.org/nightly/collections/string/struct.String.html' title='collections::string::String'>String</a>&gt;, verify_signatures: <a class='primitive' href='https://doc.rust-lang.org/nightly/std/primitive.bool.html'>bool</a>) -&gt; <a class='type' href='https://doc.rust-lang.org/nightly/std/io/error/type.Result.html' title='std::io::error::Result'>Result</a>&lt;<a class='struct' href='https://doc.rust-lang.org/nightly/collections/vec/struct.Vec.html' title='collections::vec::Vec'>Vec</a>&lt;<a class='primitive' href='https://doc.rust-lang.org/nightly/std/primitive.u8.html'>u8</a>&gt;&gt;</pre><div class='docblock'><p>Recovers the secret from a k-out-of-n Shamir secret sharing.</p>
</span><a id='src-517' class='srclink' href='../../src/rusty_secrets/src/wrapped_secrets.rs.html#56-61' title='goto source code'>[src]</a></span></h1>
<pre class='rust fn'>pub fn recover_secret(shares: <a class='struct' href='https://doc.rust-lang.org/nightly/collections/vec/struct.Vec.html' title='collections::vec::Vec'>Vec</a>&lt;<a class='struct' href='https://doc.rust-lang.org/nightly/collections/string/struct.String.html' title='collections::string::String'>String</a>&gt;,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; verify_signatures: <a class='primitive' href='https://doc.rust-lang.org/nightly/std/primitive.bool.html'>bool</a>)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -&gt; <a class='enum' href='https://doc.rust-lang.org/nightly/core/result/enum.Result.html' title='core::result::Result'>Result</a>&lt;RustySecret, <a class='struct' href='../../rusty_secrets/struct.RustyError.html' title='rusty_secrets::RustyError'>RustyError</a>&gt;</pre><div class='docblock'><p>Recovers the secret from a k-out-of-n Shamir&#39;s secret sharing.</p>
<p>At least <code>k</code> distinct shares need to be provided to recover the share.</p>
<h1 id='examples' class='section-header'><a href='#examples'>Examples</a></h1>
<pre class='rust rust-example-rendered'>
<span class='kw'>use</span> <span class='ident'>rusty_secrets</span>::<span class='ident'>recover_secret</span>;
<span class='kw'>use</span> <span class='ident'>rusty_secrets</span>::<span class='ident'>wrapped_secrets</span>::<span class='ident'>recover_secret</span>;
<span class='kw'>let</span> <span class='ident'>share1</span> <span class='op'>=</span> <span class='string'>&quot;2-1-Cha7s14Q/mSwWko0ittr+/Uf79RHQMIP&quot;</span>.<span class='ident'>to_string</span>();
<span class='kw'>let</span> <span class='ident'>share2</span> <span class='op'>=</span> <span class='string'>&quot;2-4-ChaydsUJDypD9ZWxwvIICh/cmZvzusOF&quot;</span>.<span class='ident'>to_string</span>();
<span class='kw'>let</span> <span class='ident'>shares</span> <span class='op'>=</span> <span class='macro'>vec</span><span class='macro'>!</span>[<span class='ident'>share1</span>, <span class='ident'>share2</span>];
@ -66,7 +66,7 @@
<span class='prelude-val'>Err</span>(<span class='ident'>e</span>) <span class='op'>=&gt;</span> {
<span class='comment'>// Deal with the error</span>
}
}<a class='test-arrow' target='_blank' href=''>Run</a></pre>
}</pre>
</div></section>
<section id='search' class="content hidden"></section>
@ -121,13 +121,11 @@
<script>
window.rootPath = "../";
window.rootPath = "../../";
window.currentCrate = "rusty_secrets";
window.playgroundUrl = "";
</script>
<script src="../jquery.js"></script>
<script src="../main.js"></script>
<script defer src="../search-index.js"></script>
<script src="../../jquery.js"></script>
<script src="../../main.js"></script>
<script defer src="../../search-index.js"></script>
</body>
</html>

View File

@ -0,0 +1,128 @@
<!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 `wrapped_secrets` mod in crate `rusty_secrets`.">
<meta name="keywords" content="rust, rustlang, rust-lang, wrapped_secrets">
<title>rusty_secrets::wrapped_secrets - 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'>rusty_secrets</a></p><script>window.sidebarCurrent = {name: 'wrapped_secrets', ty: 'mod', 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 mod">
<h1 class='fqn'><span class='in-band'>Module <a href='../index.html'>rusty_secrets</a>::<wbr><a class='mod' href=''>wrapped_secrets</a></span><span class='out-of-band'><span id='render-detail'>
<a id="toggle-all-docs" href="javascript:void(0)" title="collapse all docs">
[<span class='inner'>&#x2212;</span>]
</a>
</span><a id='src-503' class='srclink' href='../../src/rusty_secrets/src/wrapped_secrets.rs.html#1-61' title='goto source code'>[src]</a></span></h1>
<div class='docblock'><p>(Beta) <code>wrapped_secrets</code> provides Shamir&#39;s secret sharing with a wrapped secret. It currently offers versioning and MIME information about the data.</p>
</div><h2 id='functions' class='section-header'><a href="#functions">Functions</a></h2>
<table>
<tr class=' module-item'>
<td><a class='fn' href='fn.generate_shares.html'
title='rusty_secrets::wrapped_secrets::generate_shares'>generate_shares</a></td>
<td class='docblock-short'>
<p>Performs threshold k-out-of-n Shamir&#39;s secret sharing.</p>
</td>
</tr>
<tr class=' module-item'>
<td><a class='fn' href='fn.recover_secret.html'
title='rusty_secrets::wrapped_secrets::recover_secret'>recover_secret</a></td>
<td class='docblock-short'>
<p>Recovers the secret from a k-out-of-n Shamir&#39;s secret sharing.</p>
</td>
</tr></table></section>
<section id='search' class="content hidden"></section>
<section class="footer"></section>
<aside id="help" class="hidden">
<div>
<h1 class="hidden">Help</h1>
<div class="shortcuts">
<h2>Keyboard Shortcuts</h2>
<dl>
<dt>?</dt>
<dd>Show this help dialog</dd>
<dt>S</dt>
<dd>Focus the search field</dd>
<dt>&larrb;</dt>
<dd>Move up in search results</dd>
<dt>&rarrb;</dt>
<dd>Move down in search results</dd>
<dt>&#9166;</dt>
<dd>Go to active search result</dd>
<dt>+</dt>
<dd>Collapse/expand all sections</dd>
</dl>
</div>
<div class="infos">
<h2>Search Tricks</h2>
<p>
Prefix searches with a type followed by a colon (e.g.
<code>fn:</code>) to restrict the search to a given type.
</p>
<p>
Accepted types are: <code>fn</code>, <code>mod</code>,
<code>struct</code>, <code>enum</code>,
<code>trait</code>, <code>type</code>, <code>macro</code>,
and <code>const</code>.
</p>
<p>
Search functions by type signature (e.g.
<code>vec -> usize</code> or <code>* -> vec</code>)
</p>
</div>
</div>
</aside>
<script>
window.rootPath = "../../";
window.currentCrate = "rusty_secrets";
</script>
<script src="../../jquery.js"></script>
<script src="../../main.js"></script>
<script defer src="../../search-index.js"></script>
</body>
</html>

View File

@ -0,0 +1 @@
initSidebarItems({"fn":[["generate_shares","Performs threshold k-out-of-n Shamir's secret sharing."],["recover_secret","Recovers the secret from a k-out-of-n Shamir's secret sharing."]]});

View File

@ -1,3 +1,3 @@
var searchIndex = {};
searchIndex["rusty_secrets"] = {"doc":"`RustySecrets` implements Shamir Secret Sharing in Rust. It provides the possibility to sign shares.","items":[[5,"generate_shares","rusty_secrets","Performs threshold k-out-of-n Shamir secret sharing.",null,null],[5,"recover_secret","","Recovers the secret from a k-out-of-n Shamir secret sharing.",null,{"inputs":[{"name":"vec"},{"name":"bool"}],"output":{"name":"result"}}]],"paths":[]};
searchIndex["rusty_secrets"] = {"doc":"`RustySecrets` implements Shamir&#39;s secret sharing in Rust. It provides the possibility to sign shares.","items":[[3,"RustyError","rusty_secrets","Error struct used for generating an `io::Error` from a generic description.",null,null],[11,"fmt","","",0,null],[11,"with_type","","Returns a `RustyError` with a given `RustyErrorType`.",0,{"inputs":[{"name":"rustyerrortypes"}],"output":{"name":"rustyerror"}}],[11,"share_index","","Returns the index of the share that raised the error, if any.",0,null],[11,"share_groups","","Returns the group of shares that were generated during the same secret share.\nIt can be used to provide a debug message to the user telling him what shares are incompatible.",0,null],[11,"fmt","","",0,null],[11,"description","","",0,null],[11,"cause","","",0,null],[11,"from","","",0,{"inputs":[{"name":"error"}],"output":{"name":"rustyerror"}}],[0,"sss","","SSS provides Shamir&#39;s secret sharing with raw data.",null,null],[5,"generate_shares","rusty_secrets::sss","Performs threshold k-out-of-n Shamir&#39;s secret sharing.",null,null],[5,"recover_secret","","Recovers the secret from a k-out-of-n Shamir&#39;s secret sharing.",null,{"inputs":[{"name":"vec"},{"name":"bool"}],"output":{"name":"result"}}],[0,"wrapped_secrets","rusty_secrets","(Beta) `wrapped_secrets` provides Shamir&#39;s secret sharing with a wrapped secret. It currently offers versioning and MIME information about the data.",null,null],[5,"generate_shares","rusty_secrets::wrapped_secrets","Performs threshold k-out-of-n Shamir&#39;s secret sharing.",null,null],[5,"recover_secret","","Recovers the secret from a k-out-of-n Shamir&#39;s secret sharing.",null,{"inputs":[{"name":"vec"},{"name":"bool"}],"output":{"name":"result"}}]],"paths":[[3,"RustyError"]]};
initSearch(searchIndex);

View File

@ -42,125 +42,294 @@
</form>
</nav>
<section id='main' class="content source"><pre class="line-numbers"><span id="1"> 1</span>
<span id="2"> 2</span>
<span id="3"> 3</span>
<span id="4"> 4</span>
<span id="5"> 5</span>
<span id="6"> 6</span>
<span id="7"> 7</span>
<span id="8"> 8</span>
<span id="9"> 9</span>
<span id="10">10</span>
<span id="11">11</span>
<span id="12">12</span>
<span id="13">13</span>
<span id="14">14</span>
<span id="15">15</span>
<span id="16">16</span>
<span id="17">17</span>
<span id="18">18</span>
<span id="19">19</span>
<span id="20">20</span>
<span id="21">21</span>
<span id="22">22</span>
<span id="23">23</span>
<span id="24">24</span>
<span id="25">25</span>
<span id="26">26</span>
<span id="27">27</span>
<span id="28">28</span>
<span id="29">29</span>
<span id="30">30</span>
<span id="31">31</span>
<span id="32">32</span>
<span id="33">33</span>
<span id="34">34</span>
<span id="35">35</span>
<span id="36">36</span>
<span id="37">37</span>
<span id="38">38</span>
<span id="39">39</span>
<span id="40">40</span>
<span id="41">41</span>
<span id="42">42</span>
<span id="43">43</span>
<span id="44">44</span>
<span id="45">45</span>
<span id="46">46</span>
<span id="47">47</span>
<span id="48">48</span>
<span id="49">49</span>
<span id="50">50</span>
<span id="51">51</span>
<span id="52">52</span>
<span id="53">53</span>
<span id="54">54</span>
<span id="55">55</span>
<span id="56">56</span>
<span id="57">57</span>
<span id="58">58</span>
<span id="59">59</span>
<span id="60">60</span>
<span id="61">61</span>
<span id="62">62</span>
<span id="63">63</span>
<span id="64">64</span>
<span id="65">65</span>
<span id="66">66</span>
<span id="67">67</span>
<span id="68">68</span>
<span id="69">69</span>
<span id="70">70</span>
<span id="71">71</span>
<span id="72">72</span>
<span id="73">73</span>
<span id="74">74</span>
<span id="75">75</span>
<span id="76">76</span>
<span id="77">77</span>
<span id="78">78</span>
<span id="79">79</span>
<span id="80">80</span>
<span id="81">81</span>
<span id="82">82</span>
<span id="83">83</span>
<span id="84">84</span>
<span id="85">85</span>
<span id="86">86</span>
<span id="87">87</span>
<span id="88">88</span>
<span id="89">89</span>
<span id="90">90</span>
<span id="91">91</span>
<span id="92">92</span>
<span id="93">93</span>
<span id="94">94</span>
<section id='main' class="content source"><pre class="line-numbers"><span id="1"> 1</span>
<span id="2"> 2</span>
<span id="3"> 3</span>
<span id="4"> 4</span>
<span id="5"> 5</span>
<span id="6"> 6</span>
<span id="7"> 7</span>
<span id="8"> 8</span>
<span id="9"> 9</span>
<span id="10"> 10</span>
<span id="11"> 11</span>
<span id="12"> 12</span>
<span id="13"> 13</span>
<span id="14"> 14</span>
<span id="15"> 15</span>
<span id="16"> 16</span>
<span id="17"> 17</span>
<span id="18"> 18</span>
<span id="19"> 19</span>
<span id="20"> 20</span>
<span id="21"> 21</span>
<span id="22"> 22</span>
<span id="23"> 23</span>
<span id="24"> 24</span>
<span id="25"> 25</span>
<span id="26"> 26</span>
<span id="27"> 27</span>
<span id="28"> 28</span>
<span id="29"> 29</span>
<span id="30"> 30</span>
<span id="31"> 31</span>
<span id="32"> 32</span>
<span id="33"> 33</span>
<span id="34"> 34</span>
<span id="35"> 35</span>
<span id="36"> 36</span>
<span id="37"> 37</span>
<span id="38"> 38</span>
<span id="39"> 39</span>
<span id="40"> 40</span>
<span id="41"> 41</span>
<span id="42"> 42</span>
<span id="43"> 43</span>
<span id="44"> 44</span>
<span id="45"> 45</span>
<span id="46"> 46</span>
<span id="47"> 47</span>
<span id="48"> 48</span>
<span id="49"> 49</span>
<span id="50"> 50</span>
<span id="51"> 51</span>
<span id="52"> 52</span>
<span id="53"> 53</span>
<span id="54"> 54</span>
<span id="55"> 55</span>
<span id="56"> 56</span>
<span id="57"> 57</span>
<span id="58"> 58</span>
<span id="59"> 59</span>
<span id="60"> 60</span>
<span id="61"> 61</span>
<span id="62"> 62</span>
<span id="63"> 63</span>
<span id="64"> 64</span>
<span id="65"> 65</span>
<span id="66"> 66</span>
<span id="67"> 67</span>
<span id="68"> 68</span>
<span id="69"> 69</span>
<span id="70"> 70</span>
<span id="71"> 71</span>
<span id="72"> 72</span>
<span id="73"> 73</span>
<span id="74"> 74</span>
<span id="75"> 75</span>
<span id="76"> 76</span>
<span id="77"> 77</span>
<span id="78"> 78</span>
<span id="79"> 79</span>
<span id="80"> 80</span>
<span id="81"> 81</span>
<span id="82"> 82</span>
<span id="83"> 83</span>
<span id="84"> 84</span>
<span id="85"> 85</span>
<span id="86"> 86</span>
<span id="87"> 87</span>
<span id="88"> 88</span>
<span id="89"> 89</span>
<span id="90"> 90</span>
<span id="91"> 91</span>
<span id="92"> 92</span>
<span id="93"> 93</span>
<span id="94"> 94</span>
<span id="95"> 95</span>
<span id="96"> 96</span>
<span id="97"> 97</span>
<span id="98"> 98</span>
<span id="99"> 99</span>
<span id="100">100</span>
<span id="101">101</span>
<span id="102">102</span>
<span id="103">103</span>
<span id="104">104</span>
<span id="105">105</span>
<span id="106">106</span>
<span id="107">107</span>
<span id="108">108</span>
<span id="109">109</span>
<span id="110">110</span>
<span id="111">111</span>
<span id="112">112</span>
<span id="113">113</span>
<span id="114">114</span>
<span id="115">115</span>
<span id="116">116</span>
<span id="117">117</span>
<span id="118">118</span>
<span id="119">119</span>
<span id="120">120</span>
<span id="121">121</span>
<span id="122">122</span>
<span id="123">123</span>
<span id="124">124</span>
<span id="125">125</span>
<span id="126">126</span>
<span id="127">127</span>
<span id="128">128</span>
<span id="129">129</span>
<span id="130">130</span>
<span id="131">131</span>
<span id="132">132</span>
<span id="133">133</span>
<span id="134">134</span>
<span id="135">135</span>
<span id="136">136</span>
<span id="137">137</span>
<span id="138">138</span>
<span id="139">139</span>
<span id="140">140</span>
<span id="141">141</span>
<span id="142">142</span>
<span id="143">143</span>
<span id="144">144</span>
<span id="145">145</span>
<span id="146">146</span>
<span id="147">147</span>
<span id="148">148</span>
<span id="149">149</span>
<span id="150">150</span>
<span id="151">151</span>
<span id="152">152</span>
<span id="153">153</span>
<span id="154">154</span>
<span id="155">155</span>
<span id="156">156</span>
<span id="157">157</span>
<span id="158">158</span>
<span id="159">159</span>
<span id="160">160</span>
<span id="161">161</span>
<span id="162">162</span>
<span id="163">163</span>
<span id="164">164</span>
<span id="165">165</span>
<span id="166">166</span>
<span id="167">167</span>
<span id="168">168</span>
<span id="169">169</span>
<span id="170">170</span>
<span id="171">171</span>
<span id="172">172</span>
<span id="173">173</span>
<span id="174">174</span>
<span id="175">175</span>
<span id="176">176</span>
<span id="177">177</span>
<span id="178">178</span>
<span id="179">179</span>
<span id="180">180</span>
<span id="181">181</span>
<span id="182">182</span>
<span id="183">183</span>
</pre><pre class='rust '>
<span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>convert</span>;
<span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>error</span>;
<span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>error</span>::<span class='ident'>Error</span>;
<span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>fmt</span>;
<span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>io</span>;
<span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>num</span>;
<span class='doccomment'>/// Error struct used for generating an `io::Error` from a generic description.</span>
<span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Debug</span>)]</span>
<span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>Error</span> {
<span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>RustyError</span> {
<span class='ident'>descr</span>: <span class='kw-2'>&amp;</span><span class='lifetime'>&#39;static</span> <span class='ident'>str</span>,
<span class='ident'>detail</span>: <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>String</span><span class='op'>&gt;</span>,
<span class='ident'>share_index</span>: <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>u8</span><span class='op'>&gt;</span>,
<span class='ident'>share_groups</span>: <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>u8</span><span class='op'>&gt;&gt;</span><span class='op'>&gt;</span>
}
<span class='kw'>impl</span> <span class='ident'>Error</span> {
<span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Debug</span>)]</span>
<span class='kw'>pub</span> <span class='kw'>enum</span> <span class='ident'>RustyErrorTypes</span> {
<span class='ident'>DuplicateShareNum</span>(<span class='ident'>u8</span>),
<span class='ident'>DuplicateShareData</span>(<span class='ident'>u8</span>),
<span class='ident'>EmptyShares</span>,
<span class='ident'>IncompatibleSets</span>(<span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>u8</span><span class='op'>&gt;&gt;</span>),
<span class='ident'>InvalidSignature</span>(<span class='ident'>u8</span>, <span class='ident'>String</span>),
<span class='ident'>MissingShares</span>(<span class='ident'>u8</span>, <span class='ident'>usize</span>),
<span class='ident'>MissingSignature</span>(<span class='ident'>u8</span>),
<span class='ident'>SecretDeserializationIssue</span>,
<span class='ident'>ShareParsingError</span>(<span class='ident'>u8</span>, <span class='ident'>String</span>)
}
<span class='kw'>impl</span> <span class='ident'>RustyError</span> {
<span class='doccomment'>/// Initializes a new error with a description and optional detail string.</span>
<span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>new</span>(<span class='ident'>descr</span>: <span class='kw-2'>&amp;</span><span class='lifetime'>&#39;static</span> <span class='ident'>str</span>, <span class='ident'>detail</span>: <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>String</span><span class='op'>&gt;</span>) <span class='op'>-&gt;</span> <span class='ident'>Error</span> {
<span class='ident'>Error</span> {
<span class='kw'>fn</span> <span class='ident'>new</span>(<span class='ident'>descr</span>: <span class='kw-2'>&amp;</span><span class='lifetime'>&#39;static</span> <span class='ident'>str</span>, <span class='ident'>detail</span>: <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>String</span><span class='op'>&gt;</span>, <span class='ident'>share_index</span>: <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>u8</span><span class='op'>&gt;</span>, <span class='ident'>share_groups</span>: <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>u8</span><span class='op'>&gt;&gt;</span><span class='op'>&gt;</span>) <span class='op'>-&gt;</span> <span class='ident'>RustyError</span> {
<span class='ident'>RustyError</span> {
<span class='ident'>descr</span>: <span class='ident'>descr</span>,
<span class='ident'>detail</span>: <span class='ident'>detail</span>,
<span class='ident'>share_index</span>: <span class='ident'>share_index</span>,
<span class='ident'>share_groups</span>: <span class='ident'>share_groups</span>
}
}
<span class='doccomment'>/// Returns a `RustyError` with a given `RustyErrorType`.</span>
<span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>with_type</span>(<span class='ident'>error_type</span>: <span class='ident'>RustyErrorTypes</span>) <span class='op'>-&gt;</span> <span class='ident'>RustyError</span> {
<span class='ident'>RustyError</span> {
<span class='ident'>descr</span>: <span class='ident'>RustyError</span>::<span class='ident'>descr_for_type</span>(<span class='kw-2'>&amp;</span><span class='ident'>error_type</span>),
<span class='ident'>detail</span>: <span class='ident'>RustyError</span>::<span class='ident'>detail_for_type</span>(<span class='kw-2'>&amp;</span><span class='ident'>error_type</span>),
<span class='ident'>share_index</span>: <span class='ident'>RustyError</span>::<span class='ident'>share_num_for_type</span>(<span class='kw-2'>&amp;</span><span class='ident'>error_type</span>),
<span class='ident'>share_groups</span>: <span class='ident'>RustyError</span>::<span class='ident'>share_groups_for_type</span>(<span class='ident'>error_type</span>),
}
}
<span class='doccomment'>/// Returns the index of the share that raised the error, if any.</span>
<span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>share_index</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>u8</span><span class='op'>&gt;</span> {
<span class='self'>self</span>.<span class='ident'>share_index</span>
}
<span class='doccomment'>/// Returns the group of shares that were generated during the same secret share.</span>
<span class='doccomment'>/// It can be used to provide a debug message to the user telling him what shares are incompatible.</span>
<span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>share_groups</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>u8</span><span class='op'>&gt;&gt;</span><span class='op'>&gt;</span> {
<span class='self'>self</span>.<span class='ident'>share_groups</span>.<span class='ident'>clone</span>()
}
<span class='kw'>fn</span> <span class='ident'>descr_for_type</span>(<span class='ident'>error_type</span>: <span class='kw-2'>&amp;</span><span class='ident'>RustyErrorTypes</span>) <span class='op'>-&gt;</span> <span class='kw-2'>&amp;</span><span class='lifetime'>&#39;static</span> <span class='ident'>str</span> {
<span class='kw'>match</span> <span class='op'>*</span><span class='ident'>error_type</span> {
<span class='ident'>RustyErrorTypes</span>::<span class='ident'>EmptyShares</span> <span class='op'>=&gt;</span> <span class='string'>&quot;No shares were provided.&quot;</span>,
<span class='ident'>RustyErrorTypes</span>::<span class='ident'>IncompatibleSets</span>(_) <span class='op'>=&gt;</span> <span class='string'>&quot;The shares are incompatible with each other.&quot;</span>,
<span class='ident'>RustyErrorTypes</span>::<span class='ident'>InvalidSignature</span>(_, _) <span class='op'>=&gt;</span> <span class='string'>&quot;The signature of this share is not valid.&quot;</span>,
<span class='ident'>RustyErrorTypes</span>::<span class='ident'>MissingShares</span>(_, _) <span class='op'>=&gt;</span> <span class='string'>&quot;The number of shares provided is insufficient to recover the secret.&quot;</span>,
<span class='ident'>RustyErrorTypes</span>::<span class='ident'>MissingSignature</span>(_) <span class='op'>=&gt;</span> <span class='string'>&quot;Signature is missing while shares are required to be signed.&quot;</span>,
<span class='ident'>RustyErrorTypes</span>::<span class='ident'>SecretDeserializationIssue</span> <span class='op'>=&gt;</span> <span class='string'>&quot;An issue was encountered deserializing the secret.
Updating to the latest version of RustySecrets might help fix this.&quot;</span>,
<span class='ident'>RustyErrorTypes</span>::<span class='ident'>ShareParsingError</span>(_, _) <span class='op'>=&gt;</span> <span class='string'>&quot;This share is incorrectly formatted.&quot;</span>,
<span class='ident'>RustyErrorTypes</span>::<span class='ident'>DuplicateShareNum</span>(_) <span class='op'>=&gt;</span> <span class='string'>&quot;This share number has already been used by a previous share.&quot;</span>,
<span class='ident'>RustyErrorTypes</span>::<span class='ident'>DuplicateShareData</span>(_) <span class='op'>=&gt;</span> <span class='string'>&quot;The data encoded in this share is the same as the one found in a previous share.&quot;</span>
}
}
<span class='kw'>fn</span> <span class='ident'>detail_for_type</span>(<span class='ident'>error_type</span>: <span class='kw-2'>&amp;</span><span class='ident'>RustyErrorTypes</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>String</span><span class='op'>&gt;</span> {
<span class='kw'>match</span> <span class='op'>*</span><span class='ident'>error_type</span> {
<span class='ident'>RustyErrorTypes</span>::<span class='ident'>MissingShares</span>(<span class='ident'>required</span>, <span class='ident'>found</span>) <span class='op'>=&gt;</span> <span class='prelude-val'>Some</span>(<span class='macro'>format</span><span class='macro'>!</span>(<span class='string'>&quot;{} shares are required to recover the secret,
found only {}.&quot;</span>, <span class='ident'>required</span>, <span class='ident'>found</span>)),
<span class='ident'>RustyErrorTypes</span>::<span class='ident'>ShareParsingError</span>(_, <span class='kw-2'>ref</span> <span class='ident'>description</span>) <span class='op'>=&gt;</span> <span class='prelude-val'>Some</span>(<span class='ident'>description</span>.<span class='ident'>clone</span>()),
_ <span class='op'>=&gt;</span> <span class='prelude-val'>None</span>
}
}
<span class='kw'>fn</span> <span class='ident'>share_groups_for_type</span>(<span class='ident'>error_type</span>: <span class='ident'>RustyErrorTypes</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>u8</span><span class='op'>&gt;&gt;</span><span class='op'>&gt;</span>{
<span class='kw'>match</span> <span class='ident'>error_type</span> {
<span class='ident'>RustyErrorTypes</span>::<span class='ident'>IncompatibleSets</span>(<span class='ident'>groups</span>) <span class='op'>=&gt;</span> <span class='prelude-val'>Some</span>(<span class='ident'>groups</span>),
_ <span class='op'>=&gt;</span> <span class='prelude-val'>None</span>
}
}
<span class='kw'>fn</span> <span class='ident'>share_num_for_type</span>(<span class='ident'>error_type</span>: <span class='kw-2'>&amp;</span><span class='ident'>RustyErrorTypes</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>u8</span><span class='op'>&gt;</span> {
<span class='kw'>match</span> <span class='op'>*</span><span class='ident'>error_type</span> {
<span class='ident'>RustyErrorTypes</span>::<span class='ident'>InvalidSignature</span>(<span class='ident'>share_num</span>, _)
<span class='op'>|</span> <span class='ident'>RustyErrorTypes</span>::<span class='ident'>MissingSignature</span>(<span class='ident'>share_num</span>)
<span class='op'>|</span> <span class='ident'>RustyErrorTypes</span>::<span class='ident'>ShareParsingError</span>(<span class='ident'>share_num</span>, _)
<span class='op'>|</span> <span class='ident'>RustyErrorTypes</span>::<span class='ident'>DuplicateShareNum</span>(<span class='ident'>share_num</span>)
<span class='op'>|</span> <span class='ident'>RustyErrorTypes</span>::<span class='ident'>DuplicateShareData</span>(<span class='ident'>share_num</span>) <span class='op'>=&gt;</span> <span class='prelude-val'>Some</span>(<span class='ident'>share_num</span>),
_ <span class='op'>=&gt;</span> <span class='prelude-val'>None</span>
}
}
}
<span class='kw'>impl</span> <span class='ident'>fmt</span>::<span class='ident'>Display</span> <span class='kw'>for</span> <span class='ident'>Error</span> {
<span class='kw'>impl</span> <span class='ident'>fmt</span>::<span class='ident'>Display</span> <span class='kw'>for</span> <span class='ident'>RustyError</span> {
<span class='kw'>fn</span> <span class='ident'>fmt</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>f</span>: <span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='ident'>fmt</span>::<span class='ident'>Formatter</span>) <span class='op'>-&gt;</span> <span class='ident'>fmt</span>::<span class='prelude-ty'>Result</span> {
<span class='kw'>match</span> <span class='self'>self</span>.<span class='ident'>detail</span> {
<span class='prelude-val'>None</span> <span class='op'>=&gt;</span> <span class='macro'>write</span><span class='macro'>!</span>(<span class='ident'>f</span>, <span class='string'>&quot;{}&quot;</span>, <span class='self'>self</span>.<span class='ident'>descr</span>),
@ -169,42 +338,51 @@
}
}
<span class='kw'>impl</span> <span class='ident'>error</span>::<span class='ident'>Error</span> <span class='kw'>for</span> <span class='ident'>Error</span> {
<span class='kw'>impl</span> <span class='ident'>Error</span> <span class='kw'>for</span> <span class='ident'>RustyError</span> {
<span class='kw'>fn</span> <span class='ident'>description</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='kw-2'>&amp;</span><span class='ident'>str</span> {
<span class='self'>self</span>.<span class='ident'>descr</span>
}
<span class='kw'>fn</span> <span class='ident'>cause</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='kw-2'>&amp;</span><span class='ident'>error</span>::<span class='ident'>Error</span><span class='op'>&gt;</span> {
<span class='kw'>fn</span> <span class='ident'>cause</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='kw-2'>&amp;</span><span class='ident'>Error</span><span class='op'>&gt;</span> {
<span class='prelude-val'>None</span>
}
}
<span class='kw'>impl</span> <span class='ident'>From</span><span class='op'>&lt;</span><span class='ident'>Error</span><span class='op'>&gt;</span> <span class='kw'>for</span> <span class='ident'>io</span>::<span class='ident'>Error</span> {
<span class='kw'>fn</span> <span class='ident'>from</span>(<span class='ident'>me</span>: <span class='ident'>Error</span>) <span class='op'>-&gt;</span> <span class='ident'>io</span>::<span class='ident'>Error</span> {
<span class='kw'>impl</span> <span class='ident'>From</span><span class='op'>&lt;</span><span class='ident'>io</span>::<span class='ident'>Error</span><span class='op'>&gt;</span> <span class='kw'>for</span> <span class='ident'>RustyError</span> {
<span class='kw'>fn</span> <span class='ident'>from</span>(<span class='ident'>err</span>: <span class='ident'>io</span>::<span class='ident'>Error</span>) <span class='op'>-&gt;</span> <span class='ident'>RustyError</span> {
<span class='kw'>let</span> <span class='ident'>descr</span> <span class='op'>=</span> <span class='ident'>err</span>.<span class='ident'>description</span>().<span class='ident'>to_owned</span>();
<span class='ident'>RustyError</span>::<span class='ident'>new</span>(<span class='string'>&quot;from io:Error&quot;</span>, <span class='prelude-val'>Some</span>(<span class='ident'>descr</span>), <span class='prelude-val'>None</span>, <span class='prelude-val'>None</span>)
}
}
<span class='kw'>impl</span> <span class='ident'>From</span><span class='op'>&lt;</span><span class='ident'>RustyError</span><span class='op'>&gt;</span> <span class='kw'>for</span> <span class='ident'>io</span>::<span class='ident'>Error</span> {
<span class='kw'>fn</span> <span class='ident'>from</span>(<span class='ident'>me</span>: <span class='ident'>RustyError</span>) <span class='op'>-&gt;</span> <span class='ident'>io</span>::<span class='ident'>Error</span> {
<span class='ident'>io</span>::<span class='ident'>Error</span>::<span class='ident'>new</span>(<span class='ident'>io</span>::<span class='ident'>ErrorKind</span>::<span class='ident'>Other</span>, <span class='ident'>me</span>)
}
}
<span class='doccomment'>/// Returns an `io::Error` from description string and optional detail string.</span>
<span class='doccomment'>/// Particularly useful in `Result` expressions.</span>
<span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>other_io_err</span>(<span class='ident'>descr</span>: <span class='kw-2'>&amp;</span><span class='lifetime'>&#39;static</span> <span class='ident'>str</span>, <span class='ident'>detail</span>: <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>String</span><span class='op'>&gt;</span>) <span class='op'>-&gt;</span> <span class='ident'>io</span>::<span class='ident'>Error</span> {
<span class='ident'>convert</span>::<span class='ident'>From</span>::<span class='ident'>from</span>(<span class='ident'>Error</span>::<span class='ident'>new</span>(<span class='ident'>descr</span>, <span class='ident'>detail</span>))
<span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>other_io_err</span>(<span class='ident'>descr</span>: <span class='kw-2'>&amp;</span><span class='lifetime'>&#39;static</span> <span class='ident'>str</span>, <span class='ident'>detail</span>: <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>String</span><span class='op'>&gt;</span>,
<span class='ident'>share_num</span>: <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>u8</span><span class='op'>&gt;</span>, <span class='ident'>share_groups</span>: <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>u8</span><span class='op'>&gt;&gt;</span><span class='op'>&gt;</span>) <span class='op'>-&gt;</span> <span class='ident'>io</span>::<span class='ident'>Error</span> {
<span class='ident'>convert</span>::<span class='ident'>From</span>::<span class='ident'>from</span>(<span class='ident'>RustyError</span>::<span class='ident'>new</span>(<span class='ident'>descr</span>, <span class='ident'>detail</span>, <span class='ident'>share_num</span>, <span class='ident'>share_groups</span>))
}
<span class='doccomment'>/// maps a `ParseIntError` to an `io::Error`</span>
<span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>pie2io</span>(<span class='ident'>p</span>: <span class='ident'>num</span>::<span class='ident'>ParseIntError</span>) <span class='op'>-&gt;</span> <span class='ident'>io</span>::<span class='ident'>Error</span> {
<span class='ident'>convert</span>::<span class='ident'>From</span>::<span class='ident'>from</span>(<span class='ident'>Error</span>::<span class='ident'>new</span>(<span class='string'>&quot;Integer parsing error&quot;</span>, <span class='prelude-val'>Some</span>(<span class='ident'>p</span>.<span class='ident'>to_string</span>())))
<span class='doccomment'>/// maps a `ParseIntError` to an `Error`</span>
<span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>pie2error</span>(<span class='ident'>p</span>: <span class='ident'>num</span>::<span class='ident'>ParseIntError</span>) <span class='op'>-&gt;</span> <span class='ident'>RustyError</span> {
<span class='ident'>RustyError</span>::<span class='ident'>new</span>(<span class='string'>&quot;Integer parsing error&quot;</span>, <span class='prelude-val'>Some</span>(<span class='ident'>p</span>.<span class='ident'>to_string</span>()), <span class='prelude-val'>None</span>, <span class='prelude-val'>None</span>)
}
<span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>test</span>)]</span>
<span class='kw'>mod</span> <span class='ident'>tests_custom_err</span> {
<span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>error</span>;
<span class='kw'>use</span> <span class='ident'>custom_error</span>;
<span class='kw'>use</span> <span class='ident'>custom_error</span>::<span class='ident'>RustyError</span>;
<span class='attribute'>#[<span class='ident'>test</span>]</span>
<span class='kw'>fn</span> <span class='ident'>test_custom_error</span>() {
<span class='kw'>let</span> <span class='ident'>desc</span> <span class='op'>=</span> <span class='string'>&quot;Boring error description&quot;</span>;
<span class='kw'>let</span> <span class='ident'>detail</span> <span class='op'>=</span> <span class='string'>&quot;More of it&quot;</span>;
<span class='kw'>let</span> <span class='ident'>ewd</span> <span class='op'>=</span> <span class='ident'>custom_error</span>::<span class='ident'>Error</span>::<span class='ident'>new</span>(<span class='ident'>desc</span>, <span class='prelude-val'>Some</span>(<span class='ident'>detail</span>.<span class='ident'>to_string</span>()));
<span class='kw'>let</span> <span class='ident'>ewd</span> <span class='op'>=</span> <span class='ident'>RustyError</span>::<span class='ident'>new</span>(<span class='ident'>desc</span>, <span class='prelude-val'>Some</span>(<span class='ident'>detail</span>.<span class='ident'>to_string</span>()), <span class='prelude-val'>None</span>, <span class='prelude-val'>None</span>);
<span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>error</span>::<span class='ident'>Error</span>::<span class='ident'>description</span>(<span class='kw-2'>&amp;</span><span class='ident'>ewd</span>), <span class='ident'>desc</span>);
<span class='kw'>match</span> <span class='ident'>error</span>::<span class='ident'>Error</span>::<span class='ident'>cause</span>(<span class='kw-2'>&amp;</span><span class='ident'>ewd</span>) {
@ -212,7 +390,7 @@
<span class='prelude-val'>None</span> <span class='op'>=&gt;</span> <span class='macro'>assert</span><span class='macro'>!</span>(<span class='bool-val'>true</span>),
}
<span class='kw'>let</span> <span class='ident'>_formated_err</span> <span class='op'>=</span> <span class='macro'>format</span><span class='macro'>!</span>(<span class='string'>&quot;{}&quot;</span>, <span class='ident'>ewd</span>);
<span class='kw'>let</span> <span class='ident'>ewod</span> <span class='op'>=</span> <span class='ident'>custom_error</span>::<span class='ident'>Error</span>::<span class='ident'>new</span>(<span class='ident'>desc</span>, <span class='prelude-val'>None</span>);
<span class='kw'>let</span> <span class='ident'>ewod</span> <span class='op'>=</span> <span class='ident'>RustyError</span>::<span class='ident'>new</span>(<span class='ident'>desc</span>, <span class='prelude-val'>None</span>, <span class='prelude-val'>None</span>, <span class='prelude-val'>None</span>);
<span class='kw'>let</span> <span class='ident'>_formated_err</span> <span class='op'>=</span> <span class='macro'>format</span><span class='macro'>!</span>(<span class='string'>&quot;{}&quot;</span>, <span class='ident'>ewod</span>);
}
}
@ -220,12 +398,12 @@
<span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>test</span>)]</span>
<span class='kw'>mod</span> <span class='ident'>tests_std_err</span> {
<span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>error</span>::<span class='ident'>Error</span>;
<span class='kw'>use</span> <span class='ident'>custom_error</span>::<span class='ident'>pie2io</span>;
<span class='kw'>use</span> <span class='ident'>custom_error</span>::<span class='ident'>pie2error</span>;
<span class='attribute'>#[<span class='ident'>test</span>]</span>
<span class='kw'>fn</span> <span class='ident'>test_parse_errors</span>() {
<span class='kw'>let</span> <span class='ident'>nan</span> <span class='op'>=</span> <span class='string'>&quot;2a&quot;</span>.<span class='ident'>to_string</span>();
<span class='kw'>match</span> <span class='ident'>nan</span>.<span class='ident'>parse</span>::<span class='op'>&lt;</span><span class='ident'>u8</span><span class='op'>&gt;</span>().<span class='ident'>map_err</span>(<span class='ident'>pie2io</span>) {
<span class='kw'>match</span> <span class='ident'>nan</span>.<span class='ident'>parse</span>::<span class='op'>&lt;</span><span class='ident'>u8</span><span class='op'>&gt;</span>().<span class='ident'>map_err</span>(<span class='ident'>pie2error</span>) {
<span class='prelude-val'>Ok</span>(_) <span class='op'>=&gt;</span> <span class='macro'>assert</span><span class='macro'>!</span>(<span class='bool-val'>false</span>),
<span class='prelude-val'>Err</span>(<span class='ident'>x</span>) <span class='op'>=&gt;</span> <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='string'>&quot;Integer parsing error&quot;</span>, <span class='ident'>x</span>.<span class='ident'>description</span>()),
}
@ -288,11 +466,9 @@
<script>
window.rootPath = "../../../";
window.currentCrate = "rusty_secrets";
window.playgroundUrl = "";
</script>
<script src="../../../jquery.js"></script>
<script src="../../../main.js"></script>
<script defer src="../../../search-index.js"></script>
</body>
</html>

View File

@ -280,11 +280,9 @@
<script>
window.rootPath = "../../../";
window.currentCrate = "rusty_secrets";
window.playgroundUrl = "";
</script>
<script src="../../../jquery.js"></script>
<script src="../../../main.js"></script>
<script defer src="../../../search-index.js"></script>
</body>
</html>

View File

@ -180,11 +180,9 @@
<script>
window.rootPath = "../../../";
window.currentCrate = "rusty_secrets";
window.playgroundUrl = "";
</script>
<script src="../../../jquery.js"></script>
<script src="../../../main.js"></script>
<script defer src="../../../search-index.js"></script>
</body>
</html>

View File

@ -75,7 +75,11 @@
<span id="31">31</span>
<span id="32">32</span>
<span id="33">33</span>
<span id="34">34</span>
<span id="35">35</span>
</pre><pre class='rust '>
<span class='doccomment'>//! `RustySecrets` implements Shamir&#39;s secret sharing in Rust. It provides the possibility to sign shares.</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>,
@ -84,8 +88,6 @@
<span class='ident'>unused_import_braces</span>, <span class='ident'>unused_qualifications</span>
)]</span>
<span class='doccomment'>//! `RustySecrets` implements Shamir Secret Sharing in Rust. It provides the possibility to sign shares.</span>
<span class='kw'>extern</span> <span class='kw'>crate</span> <span class='ident'>protobuf</span>;
<span class='kw'>extern</span> <span class='kw'>crate</span> <span class='ident'>rustc_serialize</span> <span class='kw'>as</span> <span class='ident'>serialize</span>;
<span class='kw'>extern</span> <span class='kw'>crate</span> <span class='ident'>rand</span>;
@ -99,13 +101,15 @@
<span class='kw'>mod</span> <span class='ident'>custom_error</span>;
<span class='kw'>mod</span> <span class='ident'>gf256</span>;
<span class='kw'>mod</span> <span class='ident'>interpolation</span>;
<span class='kw'>mod</span> <span class='ident'>secret</span>;
<span class='kw'>mod</span> <span class='ident'>share_data</span>;
<span class='kw'>mod</span> <span class='ident'>share_format</span>;
<span class='kw'>mod</span> <span class='ident'>sss</span>;
<span class='kw'>mod</span> <span class='ident'>validation</span>;
<span class='kw'>pub</span> <span class='kw'>use</span> <span class='ident'>sss</span>::<span class='ident'>generate_shares</span>;
<span class='kw'>pub</span> <span class='kw'>use</span> <span class='ident'>sss</span>::<span class='ident'>recover_secret</span>;
<span class='kw'>pub</span> <span class='kw'>use</span> <span class='ident'>custom_error</span>::<span class='ident'>RustyError</span>;
<span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>sss</span>;
<span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>wrapped_secrets</span>;
<span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>test</span>)]</span>
<span class='kw'>mod</span> <span class='ident'>tests</span>;
@ -166,11 +170,9 @@
<script>
window.rootPath = "../../../";
window.currentCrate = "rusty_secrets";
window.playgroundUrl = "";
</script>
<script src="../../../jquery.js"></script>
<script src="../../../main.js"></script>
<script defer src="../../../search-index.js"></script>
</body>
</html>

View File

@ -0,0 +1,890 @@
<!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="Source to the Rust file `src/secret.rs`.">
<meta name="keywords" content="rust, rustlang, rust-lang">
<title>secret.rs.html -- source</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">
</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 source"><pre class="line-numbers"><span id="1"> 1</span>
<span id="2"> 2</span>
<span id="3"> 3</span>
<span id="4"> 4</span>
<span id="5"> 5</span>
<span id="6"> 6</span>
<span id="7"> 7</span>
<span id="8"> 8</span>
<span id="9"> 9</span>
<span id="10"> 10</span>
<span id="11"> 11</span>
<span id="12"> 12</span>
<span id="13"> 13</span>
<span id="14"> 14</span>
<span id="15"> 15</span>
<span id="16"> 16</span>
<span id="17"> 17</span>
<span id="18"> 18</span>
<span id="19"> 19</span>
<span id="20"> 20</span>
<span id="21"> 21</span>
<span id="22"> 22</span>
<span id="23"> 23</span>
<span id="24"> 24</span>
<span id="25"> 25</span>
<span id="26"> 26</span>
<span id="27"> 27</span>
<span id="28"> 28</span>
<span id="29"> 29</span>
<span id="30"> 30</span>
<span id="31"> 31</span>
<span id="32"> 32</span>
<span id="33"> 33</span>
<span id="34"> 34</span>
<span id="35"> 35</span>
<span id="36"> 36</span>
<span id="37"> 37</span>
<span id="38"> 38</span>
<span id="39"> 39</span>
<span id="40"> 40</span>
<span id="41"> 41</span>
<span id="42"> 42</span>
<span id="43"> 43</span>
<span id="44"> 44</span>
<span id="45"> 45</span>
<span id="46"> 46</span>
<span id="47"> 47</span>
<span id="48"> 48</span>
<span id="49"> 49</span>
<span id="50"> 50</span>
<span id="51"> 51</span>
<span id="52"> 52</span>
<span id="53"> 53</span>
<span id="54"> 54</span>
<span id="55"> 55</span>
<span id="56"> 56</span>
<span id="57"> 57</span>
<span id="58"> 58</span>
<span id="59"> 59</span>
<span id="60"> 60</span>
<span id="61"> 61</span>
<span id="62"> 62</span>
<span id="63"> 63</span>
<span id="64"> 64</span>
<span id="65"> 65</span>
<span id="66"> 66</span>
<span id="67"> 67</span>
<span id="68"> 68</span>
<span id="69"> 69</span>
<span id="70"> 70</span>
<span id="71"> 71</span>
<span id="72"> 72</span>
<span id="73"> 73</span>
<span id="74"> 74</span>
<span id="75"> 75</span>
<span id="76"> 76</span>
<span id="77"> 77</span>
<span id="78"> 78</span>
<span id="79"> 79</span>
<span id="80"> 80</span>
<span id="81"> 81</span>
<span id="82"> 82</span>
<span id="83"> 83</span>
<span id="84"> 84</span>
<span id="85"> 85</span>
<span id="86"> 86</span>
<span id="87"> 87</span>
<span id="88"> 88</span>
<span id="89"> 89</span>
<span id="90"> 90</span>
<span id="91"> 91</span>
<span id="92"> 92</span>
<span id="93"> 93</span>
<span id="94"> 94</span>
<span id="95"> 95</span>
<span id="96"> 96</span>
<span id="97"> 97</span>
<span id="98"> 98</span>
<span id="99"> 99</span>
<span id="100">100</span>
<span id="101">101</span>
<span id="102">102</span>
<span id="103">103</span>
<span id="104">104</span>
<span id="105">105</span>
<span id="106">106</span>
<span id="107">107</span>
<span id="108">108</span>
<span id="109">109</span>
<span id="110">110</span>
<span id="111">111</span>
<span id="112">112</span>
<span id="113">113</span>
<span id="114">114</span>
<span id="115">115</span>
<span id="116">116</span>
<span id="117">117</span>
<span id="118">118</span>
<span id="119">119</span>
<span id="120">120</span>
<span id="121">121</span>
<span id="122">122</span>
<span id="123">123</span>
<span id="124">124</span>
<span id="125">125</span>
<span id="126">126</span>
<span id="127">127</span>
<span id="128">128</span>
<span id="129">129</span>
<span id="130">130</span>
<span id="131">131</span>
<span id="132">132</span>
<span id="133">133</span>
<span id="134">134</span>
<span id="135">135</span>
<span id="136">136</span>
<span id="137">137</span>
<span id="138">138</span>
<span id="139">139</span>
<span id="140">140</span>
<span id="141">141</span>
<span id="142">142</span>
<span id="143">143</span>
<span id="144">144</span>
<span id="145">145</span>
<span id="146">146</span>
<span id="147">147</span>
<span id="148">148</span>
<span id="149">149</span>
<span id="150">150</span>
<span id="151">151</span>
<span id="152">152</span>
<span id="153">153</span>
<span id="154">154</span>
<span id="155">155</span>
<span id="156">156</span>
<span id="157">157</span>
<span id="158">158</span>
<span id="159">159</span>
<span id="160">160</span>
<span id="161">161</span>
<span id="162">162</span>
<span id="163">163</span>
<span id="164">164</span>
<span id="165">165</span>
<span id="166">166</span>
<span id="167">167</span>
<span id="168">168</span>
<span id="169">169</span>
<span id="170">170</span>
<span id="171">171</span>
<span id="172">172</span>
<span id="173">173</span>
<span id="174">174</span>
<span id="175">175</span>
<span id="176">176</span>
<span id="177">177</span>
<span id="178">178</span>
<span id="179">179</span>
<span id="180">180</span>
<span id="181">181</span>
<span id="182">182</span>
<span id="183">183</span>
<span id="184">184</span>
<span id="185">185</span>
<span id="186">186</span>
<span id="187">187</span>
<span id="188">188</span>
<span id="189">189</span>
<span id="190">190</span>
<span id="191">191</span>
<span id="192">192</span>
<span id="193">193</span>
<span id="194">194</span>
<span id="195">195</span>
<span id="196">196</span>
<span id="197">197</span>
<span id="198">198</span>
<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>
<span id="249">249</span>
<span id="250">250</span>
<span id="251">251</span>
<span id="252">252</span>
<span id="253">253</span>
<span id="254">254</span>
<span id="255">255</span>
<span id="256">256</span>
<span id="257">257</span>
<span id="258">258</span>
<span id="259">259</span>
<span id="260">260</span>
<span id="261">261</span>
<span id="262">262</span>
<span id="263">263</span>
<span id="264">264</span>
<span id="265">265</span>
<span id="266">266</span>
<span id="267">267</span>
<span id="268">268</span>
<span id="269">269</span>
<span id="270">270</span>
<span id="271">271</span>
<span id="272">272</span>
<span id="273">273</span>
<span id="274">274</span>
<span id="275">275</span>
<span id="276">276</span>
<span id="277">277</span>
<span id="278">278</span>
<span id="279">279</span>
<span id="280">280</span>
<span id="281">281</span>
<span id="282">282</span>
<span id="283">283</span>
<span id="284">284</span>
<span id="285">285</span>
<span id="286">286</span>
<span id="287">287</span>
<span id="288">288</span>
<span id="289">289</span>
<span id="290">290</span>
<span id="291">291</span>
<span id="292">292</span>
<span id="293">293</span>
<span id="294">294</span>
<span id="295">295</span>
<span id="296">296</span>
<span id="297">297</span>
<span id="298">298</span>
<span id="299">299</span>
<span id="300">300</span>
<span id="301">301</span>
<span id="302">302</span>
<span id="303">303</span>
<span id="304">304</span>
<span id="305">305</span>
<span id="306">306</span>
<span id="307">307</span>
<span id="308">308</span>
<span id="309">309</span>
<span id="310">310</span>
<span id="311">311</span>
<span id="312">312</span>
<span id="313">313</span>
<span id="314">314</span>
<span id="315">315</span>
<span id="316">316</span>
<span id="317">317</span>
<span id="318">318</span>
<span id="319">319</span>
<span id="320">320</span>
<span id="321">321</span>
<span id="322">322</span>
<span id="323">323</span>
<span id="324">324</span>
<span id="325">325</span>
<span id="326">326</span>
<span id="327">327</span>
<span id="328">328</span>
<span id="329">329</span>
<span id="330">330</span>
<span id="331">331</span>
<span id="332">332</span>
<span id="333">333</span>
<span id="334">334</span>
<span id="335">335</span>
<span id="336">336</span>
<span id="337">337</span>
<span id="338">338</span>
<span id="339">339</span>
<span id="340">340</span>
<span id="341">341</span>
<span id="342">342</span>
<span id="343">343</span>
<span id="344">344</span>
<span id="345">345</span>
<span id="346">346</span>
<span id="347">347</span>
<span id="348">348</span>
<span id="349">349</span>
<span id="350">350</span>
<span id="351">351</span>
<span id="352">352</span>
<span id="353">353</span>
<span id="354">354</span>
<span id="355">355</span>
<span id="356">356</span>
<span id="357">357</span>
<span id="358">358</span>
<span id="359">359</span>
<span id="360">360</span>
<span id="361">361</span>
<span id="362">362</span>
<span id="363">363</span>
<span id="364">364</span>
<span id="365">365</span>
<span id="366">366</span>
<span id="367">367</span>
<span id="368">368</span>
<span id="369">369</span>
<span id="370">370</span>
<span id="371">371</span>
<span id="372">372</span>
<span id="373">373</span>
<span id="374">374</span>
<span id="375">375</span>
<span id="376">376</span>
<span id="377">377</span>
<span id="378">378</span>
<span id="379">379</span>
<span id="380">380</span>
<span id="381">381</span>
<span id="382">382</span>
<span id="383">383</span>
<span id="384">384</span>
<span id="385">385</span>
<span id="386">386</span>
<span id="387">387</span>
<span id="388">388</span>
<span id="389">389</span>
<span id="390">390</span>
<span id="391">391</span>
</pre><pre class='rust '>
<span class='comment'>// This file is generated. Do not edit</span>
<span class='comment'>// @generated</span>
<span class='comment'>// https://github.com/Manishearth/rust-clippy/issues/702</span>
<span class='attribute'>#<span class='op'>!</span>[<span class='ident'>allow</span>(<span class='ident'>unknown_lints</span>)]</span>
<span class='attribute'>#<span class='op'>!</span>[<span class='ident'>allow</span>(<span class='ident'>clippy</span>)]</span>
<span class='attribute'>#<span class='op'>!</span>[<span class='ident'>cfg_attr</span>(<span class='ident'>rustfmt</span>, <span class='ident'>rustfmt_skip</span>)]</span>
<span class='attribute'>#<span class='op'>!</span>[<span class='ident'>allow</span>(<span class='ident'>box_pointers</span>)]</span>
<span class='attribute'>#<span class='op'>!</span>[<span class='ident'>allow</span>(<span class='ident'>dead_code</span>)]</span>
<span class='attribute'>#<span class='op'>!</span>[<span class='ident'>allow</span>(<span class='ident'>non_camel_case_types</span>)]</span>
<span class='attribute'>#<span class='op'>!</span>[<span class='ident'>allow</span>(<span class='ident'>non_snake_case</span>)]</span>
<span class='attribute'>#<span class='op'>!</span>[<span class='ident'>allow</span>(<span class='ident'>non_upper_case_globals</span>)]</span>
<span class='attribute'>#<span class='op'>!</span>[<span class='ident'>allow</span>(<span class='ident'>trivial_casts</span>)]</span>
<span class='attribute'>#<span class='op'>!</span>[<span class='ident'>allow</span>(<span class='ident'>unsafe_code</span>)]</span>
<span class='attribute'>#<span class='op'>!</span>[<span class='ident'>allow</span>(<span class='ident'>unused_imports</span>)]</span>
<span class='attribute'>#<span class='op'>!</span>[<span class='ident'>allow</span>(<span class='ident'>unused_results</span>)]</span>
<span class='kw'>use</span> <span class='ident'>protobuf</span>::<span class='ident'>Message</span> <span class='kw'>as</span> <span class='ident'>Message_imported_for_functions</span>;
<span class='kw'>use</span> <span class='ident'>protobuf</span>::<span class='ident'>ProtobufEnum</span> <span class='kw'>as</span> <span class='ident'>ProtobufEnum_imported_for_functions</span>;
<span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Clone</span>,<span class='ident'>Default</span>)]</span>
<span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>RustySecret</span> {
<span class='comment'>// message fields</span>
<span class='ident'>version</span>: ::<span class='ident'>std</span>::<span class='ident'>option</span>::<span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>RustySecretsVersions</span><span class='op'>&gt;</span>,
<span class='ident'>secret</span>: ::<span class='ident'>protobuf</span>::<span class='ident'>SingularField</span><span class='op'>&lt;</span>::<span class='ident'>std</span>::<span class='ident'>vec</span>::<span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>u8</span><span class='op'>&gt;&gt;</span>,
<span class='ident'>mime_type</span>: ::<span class='ident'>protobuf</span>::<span class='ident'>SingularField</span><span class='op'>&lt;</span>::<span class='ident'>std</span>::<span class='ident'>string</span>::<span class='ident'>String</span><span class='op'>&gt;</span>,
<span class='comment'>// special fields</span>
<span class='ident'>unknown_fields</span>: ::<span class='ident'>protobuf</span>::<span class='ident'>UnknownFields</span>,
<span class='ident'>cached_size</span>: ::<span class='ident'>std</span>::<span class='ident'>cell</span>::<span class='ident'>Cell</span><span class='op'>&lt;</span><span class='ident'>u32</span><span class='op'>&gt;</span>,
}
<span class='comment'>// see codegen.rs for the explanation why impl Sync explicitly</span>
<span class='kw'>unsafe</span> <span class='kw'>impl</span> ::<span class='ident'>std</span>::<span class='ident'>marker</span>::<span class='ident'>Sync</span> <span class='kw'>for</span> <span class='ident'>RustySecret</span> {}
<span class='kw'>impl</span> <span class='ident'>RustySecret</span> {
<span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>new</span>() <span class='op'>-&gt;</span> <span class='ident'>RustySecret</span> {
::<span class='ident'>std</span>::<span class='ident'>default</span>::<span class='ident'>Default</span>::<span class='ident'>default</span>()
}
<span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>default_instance</span>() <span class='op'>-&gt;</span> <span class='kw-2'>&amp;</span><span class='lifetime'>&#39;static</span> <span class='ident'>RustySecret</span> {
<span class='kw'>static</span> <span class='kw-2'>mut</span> <span class='ident'>instance</span>: ::<span class='ident'>protobuf</span>::<span class='ident'>lazy</span>::<span class='ident'>Lazy</span><span class='op'>&lt;</span><span class='ident'>RustySecret</span><span class='op'>&gt;</span> <span class='op'>=</span> ::<span class='ident'>protobuf</span>::<span class='ident'>lazy</span>::<span class='ident'>Lazy</span> {
<span class='ident'>lock</span>: ::<span class='ident'>protobuf</span>::<span class='ident'>lazy</span>::<span class='ident'>ONCE_INIT</span>,
<span class='ident'>ptr</span>: <span class='number'>0</span> <span class='kw'>as</span> <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>RustySecret</span>,
};
<span class='kw'>unsafe</span> {
<span class='ident'>instance</span>.<span class='ident'>get</span>(<span class='op'>||</span> {
<span class='ident'>RustySecret</span> {
<span class='ident'>version</span>: ::<span class='ident'>std</span>::<span class='ident'>option</span>::<span class='prelude-ty'>Option</span>::<span class='prelude-val'>None</span>,
<span class='ident'>secret</span>: ::<span class='ident'>protobuf</span>::<span class='ident'>SingularField</span>::<span class='ident'>none</span>(),
<span class='ident'>mime_type</span>: ::<span class='ident'>protobuf</span>::<span class='ident'>SingularField</span>::<span class='ident'>none</span>(),
<span class='ident'>unknown_fields</span>: ::<span class='ident'>protobuf</span>::<span class='ident'>UnknownFields</span>::<span class='ident'>new</span>(),
<span class='ident'>cached_size</span>: ::<span class='ident'>std</span>::<span class='ident'>cell</span>::<span class='ident'>Cell</span>::<span class='ident'>new</span>(<span class='number'>0</span>),
}
})
}
}
<span class='comment'>// optional .RustySecretsVersions version = 1;</span>
<span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>clear_version</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>) {
<span class='self'>self</span>.<span class='ident'>version</span> <span class='op'>=</span> ::<span class='ident'>std</span>::<span class='ident'>option</span>::<span class='prelude-ty'>Option</span>::<span class='prelude-val'>None</span>;
}
<span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>has_version</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>bool</span> {
<span class='self'>self</span>.<span class='ident'>version</span>.<span class='ident'>is_some</span>()
}
<span class='comment'>// Param is passed by value, moved</span>
<span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>set_version</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>, <span class='ident'>v</span>: <span class='ident'>RustySecretsVersions</span>) {
<span class='self'>self</span>.<span class='ident'>version</span> <span class='op'>=</span> ::<span class='ident'>std</span>::<span class='ident'>option</span>::<span class='prelude-ty'>Option</span>::<span class='prelude-val'>Some</span>(<span class='ident'>v</span>);
}
<span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>get_version</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>RustySecretsVersions</span> {
<span class='self'>self</span>.<span class='ident'>version</span>.<span class='ident'>unwrap_or</span>(<span class='ident'>RustySecretsVersions</span>::<span class='ident'>INITIAL_RELEASE</span>)
}
<span class='comment'>// optional bytes secret = 2;</span>
<span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>clear_secret</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>) {
<span class='self'>self</span>.<span class='ident'>secret</span>.<span class='ident'>clear</span>();
}
<span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>has_secret</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>bool</span> {
<span class='self'>self</span>.<span class='ident'>secret</span>.<span class='ident'>is_some</span>()
}
<span class='comment'>// Param is passed by value, moved</span>
<span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>set_secret</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>, <span class='ident'>v</span>: ::<span class='ident'>std</span>::<span class='ident'>vec</span>::<span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>u8</span><span class='op'>&gt;</span>) {
<span class='self'>self</span>.<span class='ident'>secret</span> <span class='op'>=</span> ::<span class='ident'>protobuf</span>::<span class='ident'>SingularField</span>::<span class='ident'>some</span>(<span class='ident'>v</span>);
}
<span class='comment'>// Mutable pointer to the field.</span>
<span class='comment'>// If field is not initialized, it is initialized with default value first.</span>
<span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>mut_secret</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> ::<span class='ident'>std</span>::<span class='ident'>vec</span>::<span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>u8</span><span class='op'>&gt;</span> {
<span class='kw'>if</span> <span class='self'>self</span>.<span class='ident'>secret</span>.<span class='ident'>is_none</span>() {
<span class='self'>self</span>.<span class='ident'>secret</span>.<span class='ident'>set_default</span>();
};
<span class='self'>self</span>.<span class='ident'>secret</span>.<span class='ident'>as_mut</span>().<span class='ident'>unwrap</span>()
}
<span class='comment'>// Take field</span>
<span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>take_secret</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>) <span class='op'>-&gt;</span> ::<span class='ident'>std</span>::<span class='ident'>vec</span>::<span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>u8</span><span class='op'>&gt;</span> {
<span class='self'>self</span>.<span class='ident'>secret</span>.<span class='ident'>take</span>().<span class='ident'>unwrap_or_else</span>(<span class='op'>||</span> ::<span class='ident'>std</span>::<span class='ident'>vec</span>::<span class='ident'>Vec</span>::<span class='ident'>new</span>())
}
<span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>get_secret</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='kw-2'>&amp;</span>[<span class='ident'>u8</span>] {
<span class='kw'>match</span> <span class='self'>self</span>.<span class='ident'>secret</span>.<span class='ident'>as_ref</span>() {
<span class='prelude-val'>Some</span>(<span class='ident'>v</span>) <span class='op'>=&gt;</span> <span class='kw-2'>&amp;</span><span class='ident'>v</span>,
<span class='prelude-val'>None</span> <span class='op'>=&gt;</span> <span class='kw-2'>&amp;</span>[],
}
}
<span class='comment'>// optional string mime_type = 3;</span>
<span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>clear_mime_type</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>) {
<span class='self'>self</span>.<span class='ident'>mime_type</span>.<span class='ident'>clear</span>();
}
<span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>has_mime_type</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>bool</span> {
<span class='self'>self</span>.<span class='ident'>mime_type</span>.<span class='ident'>is_some</span>()
}
<span class='comment'>// Param is passed by value, moved</span>
<span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>set_mime_type</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>, <span class='ident'>v</span>: ::<span class='ident'>std</span>::<span class='ident'>string</span>::<span class='ident'>String</span>) {
<span class='self'>self</span>.<span class='ident'>mime_type</span> <span class='op'>=</span> ::<span class='ident'>protobuf</span>::<span class='ident'>SingularField</span>::<span class='ident'>some</span>(<span class='ident'>v</span>);
}
<span class='comment'>// Mutable pointer to the field.</span>
<span class='comment'>// If field is not initialized, it is initialized with default value first.</span>
<span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>mut_mime_type</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> ::<span class='ident'>std</span>::<span class='ident'>string</span>::<span class='ident'>String</span> {
<span class='kw'>if</span> <span class='self'>self</span>.<span class='ident'>mime_type</span>.<span class='ident'>is_none</span>() {
<span class='self'>self</span>.<span class='ident'>mime_type</span>.<span class='ident'>set_default</span>();
};
<span class='self'>self</span>.<span class='ident'>mime_type</span>.<span class='ident'>as_mut</span>().<span class='ident'>unwrap</span>()
}
<span class='comment'>// Take field</span>
<span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>take_mime_type</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>) <span class='op'>-&gt;</span> ::<span class='ident'>std</span>::<span class='ident'>string</span>::<span class='ident'>String</span> {
<span class='self'>self</span>.<span class='ident'>mime_type</span>.<span class='ident'>take</span>().<span class='ident'>unwrap_or_else</span>(<span class='op'>||</span> ::<span class='ident'>std</span>::<span class='ident'>string</span>::<span class='ident'>String</span>::<span class='ident'>new</span>())
}
<span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>get_mime_type</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='kw-2'>&amp;</span><span class='ident'>str</span> {
<span class='kw'>match</span> <span class='self'>self</span>.<span class='ident'>mime_type</span>.<span class='ident'>as_ref</span>() {
<span class='prelude-val'>Some</span>(<span class='ident'>v</span>) <span class='op'>=&gt;</span> <span class='kw-2'>&amp;</span><span class='ident'>v</span>,
<span class='prelude-val'>None</span> <span class='op'>=&gt;</span> <span class='string'>&quot;&quot;</span>,
}
}
}
<span class='kw'>impl</span> ::<span class='ident'>protobuf</span>::<span class='ident'>Message</span> <span class='kw'>for</span> <span class='ident'>RustySecret</span> {
<span class='kw'>fn</span> <span class='ident'>is_initialized</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>bool</span> {
<span class='bool-val'>true</span>
}
<span class='kw'>fn</span> <span class='ident'>merge_from</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>, <span class='ident'>is</span>: <span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> ::<span class='ident'>protobuf</span>::<span class='ident'>CodedInputStream</span>) <span class='op'>-&gt;</span> ::<span class='ident'>protobuf</span>::<span class='ident'>ProtobufResult</span><span class='op'>&lt;</span>()<span class='op'>&gt;</span> {
<span class='kw'>while</span> <span class='op'>!</span><span class='macro'>try</span><span class='macro'>!</span>(<span class='ident'>is</span>.<span class='ident'>eof</span>()) {
<span class='kw'>let</span> (<span class='ident'>field_number</span>, <span class='ident'>wire_type</span>) <span class='op'>=</span> <span class='macro'>try</span><span class='macro'>!</span>(<span class='ident'>is</span>.<span class='ident'>read_tag_unpack</span>());
<span class='kw'>match</span> <span class='ident'>field_number</span> {
<span class='number'>1</span> <span class='op'>=&gt;</span> {
<span class='kw'>if</span> <span class='ident'>wire_type</span> <span class='op'>!=</span> ::<span class='ident'>protobuf</span>::<span class='ident'>wire_format</span>::<span class='ident'>WireTypeVarint</span> {
<span class='kw'>return</span> ::<span class='ident'>std</span>::<span class='ident'>result</span>::<span class='prelude-ty'>Result</span>::<span class='prelude-val'>Err</span>(::<span class='ident'>protobuf</span>::<span class='ident'>rt</span>::<span class='ident'>unexpected_wire_type</span>(<span class='ident'>wire_type</span>));
};
<span class='kw'>let</span> <span class='ident'>tmp</span> <span class='op'>=</span> <span class='macro'>try</span><span class='macro'>!</span>(<span class='ident'>is</span>.<span class='ident'>read_enum</span>());
<span class='self'>self</span>.<span class='ident'>version</span> <span class='op'>=</span> ::<span class='ident'>std</span>::<span class='ident'>option</span>::<span class='prelude-ty'>Option</span>::<span class='prelude-val'>Some</span>(<span class='ident'>tmp</span>);
},
<span class='number'>2</span> <span class='op'>=&gt;</span> {
<span class='macro'>try</span><span class='macro'>!</span>(::<span class='ident'>protobuf</span>::<span class='ident'>rt</span>::<span class='ident'>read_singular_bytes_into</span>(<span class='ident'>wire_type</span>, <span class='ident'>is</span>, <span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>.<span class='ident'>secret</span>));
},
<span class='number'>3</span> <span class='op'>=&gt;</span> {
<span class='macro'>try</span><span class='macro'>!</span>(::<span class='ident'>protobuf</span>::<span class='ident'>rt</span>::<span class='ident'>read_singular_string_into</span>(<span class='ident'>wire_type</span>, <span class='ident'>is</span>, <span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>.<span class='ident'>mime_type</span>));
},
_ <span class='op'>=&gt;</span> {
<span class='macro'>try</span><span class='macro'>!</span>(::<span class='ident'>protobuf</span>::<span class='ident'>rt</span>::<span class='ident'>read_unknown_or_skip_group</span>(<span class='ident'>field_number</span>, <span class='ident'>wire_type</span>, <span class='ident'>is</span>, <span class='self'>self</span>.<span class='ident'>mut_unknown_fields</span>()));
},
};
}
::<span class='ident'>std</span>::<span class='ident'>result</span>::<span class='prelude-ty'>Result</span>::<span class='prelude-val'>Ok</span>(())
}
<span class='comment'>// Compute sizes of nested messages</span>
<span class='attribute'>#[<span class='ident'>allow</span>(<span class='ident'>unused_variables</span>)]</span>
<span class='kw'>fn</span> <span class='ident'>compute_size</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>u32</span> {
<span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>my_size</span> <span class='op'>=</span> <span class='number'>0</span>;
<span class='kw'>for</span> <span class='ident'>value</span> <span class='kw'>in</span> <span class='kw-2'>&amp;</span><span class='self'>self</span>.<span class='ident'>version</span> {
<span class='ident'>my_size</span> <span class='op'>+=</span> ::<span class='ident'>protobuf</span>::<span class='ident'>rt</span>::<span class='ident'>enum_size</span>(<span class='number'>1</span>, <span class='op'>*</span><span class='ident'>value</span>);
};
<span class='kw'>for</span> <span class='ident'>value</span> <span class='kw'>in</span> <span class='kw-2'>&amp;</span><span class='self'>self</span>.<span class='ident'>secret</span> {
<span class='ident'>my_size</span> <span class='op'>+=</span> ::<span class='ident'>protobuf</span>::<span class='ident'>rt</span>::<span class='ident'>bytes_size</span>(<span class='number'>2</span>, <span class='kw-2'>&amp;</span><span class='ident'>value</span>);
};
<span class='kw'>for</span> <span class='ident'>value</span> <span class='kw'>in</span> <span class='kw-2'>&amp;</span><span class='self'>self</span>.<span class='ident'>mime_type</span> {
<span class='ident'>my_size</span> <span class='op'>+=</span> ::<span class='ident'>protobuf</span>::<span class='ident'>rt</span>::<span class='ident'>string_size</span>(<span class='number'>3</span>, <span class='kw-2'>&amp;</span><span class='ident'>value</span>);
};
<span class='ident'>my_size</span> <span class='op'>+=</span> ::<span class='ident'>protobuf</span>::<span class='ident'>rt</span>::<span class='ident'>unknown_fields_size</span>(<span class='self'>self</span>.<span class='ident'>get_unknown_fields</span>());
<span class='self'>self</span>.<span class='ident'>cached_size</span>.<span class='ident'>set</span>(<span class='ident'>my_size</span>);
<span class='ident'>my_size</span>
}
<span class='kw'>fn</span> <span class='ident'>write_to_with_cached_sizes</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>os</span>: <span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> ::<span class='ident'>protobuf</span>::<span class='ident'>CodedOutputStream</span>) <span class='op'>-&gt;</span> ::<span class='ident'>protobuf</span>::<span class='ident'>ProtobufResult</span><span class='op'>&lt;</span>()<span class='op'>&gt;</span> {
<span class='kw'>if</span> <span class='kw'>let</span> <span class='prelude-val'>Some</span>(<span class='ident'>v</span>) <span class='op'>=</span> <span class='self'>self</span>.<span class='ident'>version</span> {
<span class='macro'>try</span><span class='macro'>!</span>(<span class='ident'>os</span>.<span class='ident'>write_enum</span>(<span class='number'>1</span>, <span class='ident'>v</span>.<span class='ident'>value</span>()));
};
<span class='kw'>if</span> <span class='kw'>let</span> <span class='prelude-val'>Some</span>(<span class='ident'>v</span>) <span class='op'>=</span> <span class='self'>self</span>.<span class='ident'>secret</span>.<span class='ident'>as_ref</span>() {
<span class='macro'>try</span><span class='macro'>!</span>(<span class='ident'>os</span>.<span class='ident'>write_bytes</span>(<span class='number'>2</span>, <span class='kw-2'>&amp;</span><span class='ident'>v</span>));
};
<span class='kw'>if</span> <span class='kw'>let</span> <span class='prelude-val'>Some</span>(<span class='ident'>v</span>) <span class='op'>=</span> <span class='self'>self</span>.<span class='ident'>mime_type</span>.<span class='ident'>as_ref</span>() {
<span class='macro'>try</span><span class='macro'>!</span>(<span class='ident'>os</span>.<span class='ident'>write_string</span>(<span class='number'>3</span>, <span class='kw-2'>&amp;</span><span class='ident'>v</span>));
};
<span class='macro'>try</span><span class='macro'>!</span>(<span class='ident'>os</span>.<span class='ident'>write_unknown_fields</span>(<span class='self'>self</span>.<span class='ident'>get_unknown_fields</span>()));
::<span class='ident'>std</span>::<span class='ident'>result</span>::<span class='prelude-ty'>Result</span>::<span class='prelude-val'>Ok</span>(())
}
<span class='kw'>fn</span> <span class='ident'>get_cached_size</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>u32</span> {
<span class='self'>self</span>.<span class='ident'>cached_size</span>.<span class='ident'>get</span>()
}
<span class='kw'>fn</span> <span class='ident'>get_unknown_fields</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='kw-2'>&amp;</span>::<span class='ident'>protobuf</span>::<span class='ident'>UnknownFields</span> {
<span class='kw-2'>&amp;</span><span class='self'>self</span>.<span class='ident'>unknown_fields</span>
}
<span class='kw'>fn</span> <span class='ident'>mut_unknown_fields</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> ::<span class='ident'>protobuf</span>::<span class='ident'>UnknownFields</span> {
<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>.<span class='ident'>unknown_fields</span>
}
<span class='kw'>fn</span> <span class='ident'>type_id</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> ::<span class='ident'>std</span>::<span class='ident'>any</span>::<span class='ident'>TypeId</span> {
::<span class='ident'>std</span>::<span class='ident'>any</span>::<span class='ident'>TypeId</span>::<span class='ident'>of</span>::<span class='op'>&lt;</span><span class='ident'>RustySecret</span><span class='op'>&gt;</span>()
}
<span class='kw'>fn</span> <span class='ident'>as_any</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='kw-2'>&amp;</span>::<span class='ident'>std</span>::<span class='ident'>any</span>::<span class='ident'>Any</span> {
<span class='self'>self</span> <span class='kw'>as</span> <span class='kw-2'>&amp;</span>::<span class='ident'>std</span>::<span class='ident'>any</span>::<span class='ident'>Any</span>
}
<span class='kw'>fn</span> <span class='ident'>descriptor</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='kw-2'>&amp;</span><span class='lifetime'>&#39;static</span> ::<span class='ident'>protobuf</span>::<span class='ident'>reflect</span>::<span class='ident'>MessageDescriptor</span> {
::<span class='ident'>protobuf</span>::<span class='ident'>MessageStatic</span>::<span class='ident'>descriptor_static</span>(<span class='prelude-val'>None</span>::<span class='op'>&lt;</span><span class='self'>Self</span><span class='op'>&gt;</span>)
}
}
<span class='kw'>impl</span> ::<span class='ident'>protobuf</span>::<span class='ident'>MessageStatic</span> <span class='kw'>for</span> <span class='ident'>RustySecret</span> {
<span class='kw'>fn</span> <span class='ident'>new</span>() <span class='op'>-&gt;</span> <span class='ident'>RustySecret</span> {
<span class='ident'>RustySecret</span>::<span class='ident'>new</span>()
}
<span class='kw'>fn</span> <span class='ident'>descriptor_static</span>(_: ::<span class='ident'>std</span>::<span class='ident'>option</span>::<span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>RustySecret</span><span class='op'>&gt;</span>) <span class='op'>-&gt;</span> <span class='kw-2'>&amp;</span><span class='lifetime'>&#39;static</span> ::<span class='ident'>protobuf</span>::<span class='ident'>reflect</span>::<span class='ident'>MessageDescriptor</span> {
<span class='kw'>static</span> <span class='kw-2'>mut</span> <span class='ident'>descriptor</span>: ::<span class='ident'>protobuf</span>::<span class='ident'>lazy</span>::<span class='ident'>Lazy</span><span class='op'>&lt;</span>::<span class='ident'>protobuf</span>::<span class='ident'>reflect</span>::<span class='ident'>MessageDescriptor</span><span class='op'>&gt;</span> <span class='op'>=</span> ::<span class='ident'>protobuf</span>::<span class='ident'>lazy</span>::<span class='ident'>Lazy</span> {
<span class='ident'>lock</span>: ::<span class='ident'>protobuf</span>::<span class='ident'>lazy</span>::<span class='ident'>ONCE_INIT</span>,
<span class='ident'>ptr</span>: <span class='number'>0</span> <span class='kw'>as</span> <span class='op'>*</span><span class='kw'>const</span> ::<span class='ident'>protobuf</span>::<span class='ident'>reflect</span>::<span class='ident'>MessageDescriptor</span>,
};
<span class='kw'>unsafe</span> {
<span class='ident'>descriptor</span>.<span class='ident'>get</span>(<span class='op'>||</span> {
<span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>fields</span> <span class='op'>=</span> ::<span class='ident'>std</span>::<span class='ident'>vec</span>::<span class='ident'>Vec</span>::<span class='ident'>new</span>();
<span class='ident'>fields</span>.<span class='ident'>push</span>(::<span class='ident'>protobuf</span>::<span class='ident'>reflect</span>::<span class='ident'>accessor</span>::<span class='ident'>make_singular_enum_accessor</span>(
<span class='string'>&quot;version&quot;</span>,
<span class='ident'>RustySecret</span>::<span class='ident'>has_version</span>,
<span class='ident'>RustySecret</span>::<span class='ident'>get_version</span>,
));
<span class='ident'>fields</span>.<span class='ident'>push</span>(::<span class='ident'>protobuf</span>::<span class='ident'>reflect</span>::<span class='ident'>accessor</span>::<span class='ident'>make_singular_bytes_accessor</span>(
<span class='string'>&quot;secret&quot;</span>,
<span class='ident'>RustySecret</span>::<span class='ident'>has_secret</span>,
<span class='ident'>RustySecret</span>::<span class='ident'>get_secret</span>,
));
<span class='ident'>fields</span>.<span class='ident'>push</span>(::<span class='ident'>protobuf</span>::<span class='ident'>reflect</span>::<span class='ident'>accessor</span>::<span class='ident'>make_singular_string_accessor</span>(
<span class='string'>&quot;mime_type&quot;</span>,
<span class='ident'>RustySecret</span>::<span class='ident'>has_mime_type</span>,
<span class='ident'>RustySecret</span>::<span class='ident'>get_mime_type</span>,
));
::<span class='ident'>protobuf</span>::<span class='ident'>reflect</span>::<span class='ident'>MessageDescriptor</span>::<span class='ident'>new</span>::<span class='op'>&lt;</span><span class='ident'>RustySecret</span><span class='op'>&gt;</span>(
<span class='string'>&quot;RustySecret&quot;</span>,
<span class='ident'>fields</span>,
<span class='ident'>file_descriptor_proto</span>()
)
})
}
}
}
<span class='kw'>impl</span> ::<span class='ident'>protobuf</span>::<span class='ident'>Clear</span> <span class='kw'>for</span> <span class='ident'>RustySecret</span> {
<span class='kw'>fn</span> <span class='ident'>clear</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>) {
<span class='self'>self</span>.<span class='ident'>clear_version</span>();
<span class='self'>self</span>.<span class='ident'>clear_secret</span>();
<span class='self'>self</span>.<span class='ident'>clear_mime_type</span>();
<span class='self'>self</span>.<span class='ident'>unknown_fields</span>.<span class='ident'>clear</span>();
}
}
<span class='kw'>impl</span> ::<span class='ident'>std</span>::<span class='ident'>cmp</span>::<span class='ident'>PartialEq</span> <span class='kw'>for</span> <span class='ident'>RustySecret</span> {
<span class='kw'>fn</span> <span class='ident'>eq</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>other</span>: <span class='kw-2'>&amp;</span><span class='ident'>RustySecret</span>) <span class='op'>-&gt;</span> <span class='ident'>bool</span> {
<span class='self'>self</span>.<span class='ident'>version</span> <span class='op'>==</span> <span class='ident'>other</span>.<span class='ident'>version</span> <span class='op'>&amp;&amp;</span>
<span class='self'>self</span>.<span class='ident'>secret</span> <span class='op'>==</span> <span class='ident'>other</span>.<span class='ident'>secret</span> <span class='op'>&amp;&amp;</span>
<span class='self'>self</span>.<span class='ident'>mime_type</span> <span class='op'>==</span> <span class='ident'>other</span>.<span class='ident'>mime_type</span> <span class='op'>&amp;&amp;</span>
<span class='self'>self</span>.<span class='ident'>unknown_fields</span> <span class='op'>==</span> <span class='ident'>other</span>.<span class='ident'>unknown_fields</span>
}
}
<span class='kw'>impl</span> ::<span class='ident'>std</span>::<span class='ident'>fmt</span>::<span class='ident'>Debug</span> <span class='kw'>for</span> <span class='ident'>RustySecret</span> {
<span class='kw'>fn</span> <span class='ident'>fmt</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>f</span>: <span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> ::<span class='ident'>std</span>::<span class='ident'>fmt</span>::<span class='ident'>Formatter</span>) <span class='op'>-&gt;</span> ::<span class='ident'>std</span>::<span class='ident'>fmt</span>::<span class='prelude-ty'>Result</span> {
::<span class='ident'>protobuf</span>::<span class='ident'>text_format</span>::<span class='ident'>fmt</span>(<span class='self'>self</span>, <span class='ident'>f</span>)
}
}
<span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Clone</span>,<span class='ident'>PartialEq</span>,<span class='ident'>Eq</span>,<span class='ident'>Debug</span>,<span class='ident'>Hash</span>)]</span>
<span class='kw'>pub</span> <span class='kw'>enum</span> <span class='ident'>RustySecretsVersions</span> {
<span class='ident'>INITIAL_RELEASE</span> <span class='op'>=</span> <span class='number'>0</span>,
}
<span class='kw'>impl</span> ::<span class='ident'>protobuf</span>::<span class='ident'>ProtobufEnum</span> <span class='kw'>for</span> <span class='ident'>RustySecretsVersions</span> {
<span class='kw'>fn</span> <span class='ident'>value</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>i32</span> {
<span class='op'>*</span><span class='self'>self</span> <span class='kw'>as</span> <span class='ident'>i32</span>
}
<span class='kw'>fn</span> <span class='ident'>from_i32</span>(<span class='ident'>value</span>: <span class='ident'>i32</span>) <span class='op'>-&gt;</span> ::<span class='ident'>std</span>::<span class='ident'>option</span>::<span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>RustySecretsVersions</span><span class='op'>&gt;</span> {
<span class='kw'>match</span> <span class='ident'>value</span> {
<span class='number'>0</span> <span class='op'>=&gt;</span> ::<span class='ident'>std</span>::<span class='ident'>option</span>::<span class='prelude-ty'>Option</span>::<span class='prelude-val'>Some</span>(<span class='ident'>RustySecretsVersions</span>::<span class='ident'>INITIAL_RELEASE</span>),
_ <span class='op'>=&gt;</span> ::<span class='ident'>std</span>::<span class='ident'>option</span>::<span class='prelude-ty'>Option</span>::<span class='prelude-val'>None</span>
}
}
<span class='kw'>fn</span> <span class='ident'>values</span>() <span class='op'>-&gt;</span> <span class='kw-2'>&amp;</span><span class='lifetime'>&#39;static</span> [<span class='self'>Self</span>] {
<span class='kw'>static</span> <span class='ident'>values</span>: <span class='kw-2'>&amp;</span><span class='lifetime'>&#39;static</span> [<span class='ident'>RustySecretsVersions</span>] <span class='op'>=</span> <span class='kw-2'>&amp;</span>[
<span class='ident'>RustySecretsVersions</span>::<span class='ident'>INITIAL_RELEASE</span>,
];
<span class='ident'>values</span>
}
<span class='kw'>fn</span> <span class='ident'>enum_descriptor_static</span>(_: <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>RustySecretsVersions</span><span class='op'>&gt;</span>) <span class='op'>-&gt;</span> <span class='kw-2'>&amp;</span><span class='lifetime'>&#39;static</span> ::<span class='ident'>protobuf</span>::<span class='ident'>reflect</span>::<span class='ident'>EnumDescriptor</span> {
<span class='kw'>static</span> <span class='kw-2'>mut</span> <span class='ident'>descriptor</span>: ::<span class='ident'>protobuf</span>::<span class='ident'>lazy</span>::<span class='ident'>Lazy</span><span class='op'>&lt;</span>::<span class='ident'>protobuf</span>::<span class='ident'>reflect</span>::<span class='ident'>EnumDescriptor</span><span class='op'>&gt;</span> <span class='op'>=</span> ::<span class='ident'>protobuf</span>::<span class='ident'>lazy</span>::<span class='ident'>Lazy</span> {
<span class='ident'>lock</span>: ::<span class='ident'>protobuf</span>::<span class='ident'>lazy</span>::<span class='ident'>ONCE_INIT</span>,
<span class='ident'>ptr</span>: <span class='number'>0</span> <span class='kw'>as</span> <span class='op'>*</span><span class='kw'>const</span> ::<span class='ident'>protobuf</span>::<span class='ident'>reflect</span>::<span class='ident'>EnumDescriptor</span>,
};
<span class='kw'>unsafe</span> {
<span class='ident'>descriptor</span>.<span class='ident'>get</span>(<span class='op'>||</span> {
::<span class='ident'>protobuf</span>::<span class='ident'>reflect</span>::<span class='ident'>EnumDescriptor</span>::<span class='ident'>new</span>(<span class='string'>&quot;RustySecretsVersions&quot;</span>, <span class='ident'>file_descriptor_proto</span>())
})
}
}
}
<span class='kw'>impl</span> ::<span class='ident'>std</span>::<span class='ident'>marker</span>::<span class='ident'>Copy</span> <span class='kw'>for</span> <span class='ident'>RustySecretsVersions</span> {
}
<span class='kw'>static</span> <span class='ident'>file_descriptor_proto_data</span>: <span class='kw-2'>&amp;</span><span class='lifetime'>&#39;static</span> [<span class='ident'>u8</span>] <span class='op'>=</span> <span class='kw-2'>&amp;</span>[
<span class='number'>0x0a</span>, <span class='number'>0x0c</span>, <span class='number'>0x53</span>, <span class='number'>0x65</span>, <span class='number'>0x63</span>, <span class='number'>0x72</span>, <span class='number'>0x65</span>, <span class='number'>0x74</span>, <span class='number'>0x2e</span>, <span class='number'>0x70</span>, <span class='number'>0x72</span>, <span class='number'>0x6f</span>, <span class='number'>0x74</span>, <span class='number'>0x6f</span>, <span class='number'>0x22</span>, <span class='number'>0x73</span>,
<span class='number'>0x0a</span>, <span class='number'>0x0b</span>, <span class='number'>0x52</span>, <span class='number'>0x75</span>, <span class='number'>0x73</span>, <span class='number'>0x74</span>, <span class='number'>0x79</span>, <span class='number'>0x53</span>, <span class='number'>0x65</span>, <span class='number'>0x63</span>, <span class='number'>0x72</span>, <span class='number'>0x65</span>, <span class='number'>0x74</span>, <span class='number'>0x12</span>, <span class='number'>0x2f</span>, <span class='number'>0x0a</span>,
<span class='number'>0x07</span>, <span class='number'>0x76</span>, <span class='number'>0x65</span>, <span class='number'>0x72</span>, <span class='number'>0x73</span>, <span class='number'>0x69</span>, <span class='number'>0x6f</span>, <span class='number'>0x6e</span>, <span class='number'>0x18</span>, <span class='number'>0x01</span>, <span class='number'>0x20</span>, <span class='number'>0x01</span>, <span class='number'>0x28</span>, <span class='number'>0x0e</span>, <span class='number'>0x32</span>, <span class='number'>0x15</span>,
<span class='number'>0x2e</span>, <span class='number'>0x52</span>, <span class='number'>0x75</span>, <span class='number'>0x73</span>, <span class='number'>0x74</span>, <span class='number'>0x79</span>, <span class='number'>0x53</span>, <span class='number'>0x65</span>, <span class='number'>0x63</span>, <span class='number'>0x72</span>, <span class='number'>0x65</span>, <span class='number'>0x74</span>, <span class='number'>0x73</span>, <span class='number'>0x56</span>, <span class='number'>0x65</span>, <span class='number'>0x72</span>,
<span class='number'>0x73</span>, <span class='number'>0x69</span>, <span class='number'>0x6f</span>, <span class='number'>0x6e</span>, <span class='number'>0x73</span>, <span class='number'>0x52</span>, <span class='number'>0x07</span>, <span class='number'>0x76</span>, <span class='number'>0x65</span>, <span class='number'>0x72</span>, <span class='number'>0x73</span>, <span class='number'>0x69</span>, <span class='number'>0x6f</span>, <span class='number'>0x6e</span>, <span class='number'>0x12</span>, <span class='number'>0x16</span>,
<span class='number'>0x0a</span>, <span class='number'>0x06</span>, <span class='number'>0x73</span>, <span class='number'>0x65</span>, <span class='number'>0x63</span>, <span class='number'>0x72</span>, <span class='number'>0x65</span>, <span class='number'>0x74</span>, <span class='number'>0x18</span>, <span class='number'>0x02</span>, <span class='number'>0x20</span>, <span class='number'>0x01</span>, <span class='number'>0x28</span>, <span class='number'>0x0c</span>, <span class='number'>0x52</span>, <span class='number'>0x06</span>,
<span class='number'>0x73</span>, <span class='number'>0x65</span>, <span class='number'>0x63</span>, <span class='number'>0x72</span>, <span class='number'>0x65</span>, <span class='number'>0x74</span>, <span class='number'>0x12</span>, <span class='number'>0x1b</span>, <span class='number'>0x0a</span>, <span class='number'>0x09</span>, <span class='number'>0x6d</span>, <span class='number'>0x69</span>, <span class='number'>0x6d</span>, <span class='number'>0x65</span>, <span class='number'>0x5f</span>, <span class='number'>0x74</span>,
<span class='number'>0x79</span>, <span class='number'>0x70</span>, <span class='number'>0x65</span>, <span class='number'>0x18</span>, <span class='number'>0x03</span>, <span class='number'>0x20</span>, <span class='number'>0x01</span>, <span class='number'>0x28</span>, <span class='number'>0x09</span>, <span class='number'>0x52</span>, <span class='number'>0x08</span>, <span class='number'>0x6d</span>, <span class='number'>0x69</span>, <span class='number'>0x6d</span>, <span class='number'>0x65</span>, <span class='number'>0x54</span>,
<span class='number'>0x79</span>, <span class='number'>0x70</span>, <span class='number'>0x65</span>, <span class='number'>0x2a</span>, <span class='number'>0x2b</span>, <span class='number'>0x0a</span>, <span class='number'>0x14</span>, <span class='number'>0x52</span>, <span class='number'>0x75</span>, <span class='number'>0x73</span>, <span class='number'>0x74</span>, <span class='number'>0x79</span>, <span class='number'>0x53</span>, <span class='number'>0x65</span>, <span class='number'>0x63</span>, <span class='number'>0x72</span>,
<span class='number'>0x65</span>, <span class='number'>0x74</span>, <span class='number'>0x73</span>, <span class='number'>0x56</span>, <span class='number'>0x65</span>, <span class='number'>0x72</span>, <span class='number'>0x73</span>, <span class='number'>0x69</span>, <span class='number'>0x6f</span>, <span class='number'>0x6e</span>, <span class='number'>0x73</span>, <span class='number'>0x12</span>, <span class='number'>0x13</span>, <span class='number'>0x0a</span>, <span class='number'>0x0f</span>, <span class='number'>0x49</span>,
<span class='number'>0x4e</span>, <span class='number'>0x49</span>, <span class='number'>0x54</span>, <span class='number'>0x49</span>, <span class='number'>0x41</span>, <span class='number'>0x4c</span>, <span class='number'>0x5f</span>, <span class='number'>0x52</span>, <span class='number'>0x45</span>, <span class='number'>0x4c</span>, <span class='number'>0x45</span>, <span class='number'>0x41</span>, <span class='number'>0x53</span>, <span class='number'>0x45</span>, <span class='number'>0x10</span>, <span class='number'>0x00</span>,
<span class='number'>0x4a</span>, <span class='number'>0xbd</span>, <span class='number'>0x02</span>, <span class='number'>0x0a</span>, <span class='number'>0x06</span>, <span class='number'>0x12</span>, <span class='number'>0x04</span>, <span class='number'>0x00</span>, <span class='number'>0x00</span>, <span class='number'>0x0a</span>, <span class='number'>0x01</span>, <span class='number'>0x0a</span>, <span class='number'>0x08</span>, <span class='number'>0x0a</span>, <span class='number'>0x01</span>, <span class='number'>0x0c</span>,
<span class='number'>0x12</span>, <span class='number'>0x03</span>, <span class='number'>0x00</span>, <span class='number'>0x00</span>, <span class='number'>0x12</span>, <span class='number'>0x0a</span>, <span class='number'>0x0a</span>, <span class='number'>0x0a</span>, <span class='number'>0x02</span>, <span class='number'>0x05</span>, <span class='number'>0x00</span>, <span class='number'>0x12</span>, <span class='number'>0x04</span>, <span class='number'>0x02</span>, <span class='number'>0x00</span>, <span class='number'>0x04</span>,
<span class='number'>0x01</span>, <span class='number'>0x0a</span>, <span class='number'>0x0a</span>, <span class='number'>0x0a</span>, <span class='number'>0x03</span>, <span class='number'>0x05</span>, <span class='number'>0x00</span>, <span class='number'>0x01</span>, <span class='number'>0x12</span>, <span class='number'>0x03</span>, <span class='number'>0x02</span>, <span class='number'>0x05</span>, <span class='number'>0x19</span>, <span class='number'>0x0a</span>, <span class='number'>0x0b</span>, <span class='number'>0x0a</span>,
<span class='number'>0x04</span>, <span class='number'>0x05</span>, <span class='number'>0x00</span>, <span class='number'>0x02</span>, <span class='number'>0x00</span>, <span class='number'>0x12</span>, <span class='number'>0x03</span>, <span class='number'>0x03</span>, <span class='number'>0x08</span>, <span class='number'>0x1c</span>, <span class='number'>0x0a</span>, <span class='number'>0x0c</span>, <span class='number'>0x0a</span>, <span class='number'>0x05</span>, <span class='number'>0x05</span>, <span class='number'>0x00</span>,
<span class='number'>0x02</span>, <span class='number'>0x00</span>, <span class='number'>0x01</span>, <span class='number'>0x12</span>, <span class='number'>0x03</span>, <span class='number'>0x03</span>, <span class='number'>0x08</span>, <span class='number'>0x17</span>, <span class='number'>0x0a</span>, <span class='number'>0x0c</span>, <span class='number'>0x0a</span>, <span class='number'>0x05</span>, <span class='number'>0x05</span>, <span class='number'>0x00</span>, <span class='number'>0x02</span>, <span class='number'>0x00</span>,
<span class='number'>0x02</span>, <span class='number'>0x12</span>, <span class='number'>0x03</span>, <span class='number'>0x03</span>, <span class='number'>0x1a</span>, <span class='number'>0x1b</span>, <span class='number'>0x0a</span>, <span class='number'>0x0a</span>, <span class='number'>0x0a</span>, <span class='number'>0x02</span>, <span class='number'>0x04</span>, <span class='number'>0x00</span>, <span class='number'>0x12</span>, <span class='number'>0x04</span>, <span class='number'>0x06</span>, <span class='number'>0x00</span>,
<span class='number'>0x0a</span>, <span class='number'>0x01</span>, <span class='number'>0x0a</span>, <span class='number'>0x0a</span>, <span class='number'>0x0a</span>, <span class='number'>0x03</span>, <span class='number'>0x04</span>, <span class='number'>0x00</span>, <span class='number'>0x01</span>, <span class='number'>0x12</span>, <span class='number'>0x03</span>, <span class='number'>0x06</span>, <span class='number'>0x08</span>, <span class='number'>0x13</span>, <span class='number'>0x0a</span>, <span class='number'>0x0b</span>,
<span class='number'>0x0a</span>, <span class='number'>0x04</span>, <span class='number'>0x04</span>, <span class='number'>0x00</span>, <span class='number'>0x02</span>, <span class='number'>0x00</span>, <span class='number'>0x12</span>, <span class='number'>0x03</span>, <span class='number'>0x07</span>, <span class='number'>0x08</span>, <span class='number'>0x29</span>, <span class='number'>0x0a</span>, <span class='number'>0x0d</span>, <span class='number'>0x0a</span>, <span class='number'>0x05</span>, <span class='number'>0x04</span>,
<span class='number'>0x00</span>, <span class='number'>0x02</span>, <span class='number'>0x00</span>, <span class='number'>0x04</span>, <span class='number'>0x12</span>, <span class='number'>0x04</span>, <span class='number'>0x07</span>, <span class='number'>0x08</span>, <span class='number'>0x06</span>, <span class='number'>0x15</span>, <span class='number'>0x0a</span>, <span class='number'>0x0c</span>, <span class='number'>0x0a</span>, <span class='number'>0x05</span>, <span class='number'>0x04</span>, <span class='number'>0x00</span>,
<span class='number'>0x02</span>, <span class='number'>0x00</span>, <span class='number'>0x06</span>, <span class='number'>0x12</span>, <span class='number'>0x03</span>, <span class='number'>0x07</span>, <span class='number'>0x08</span>, <span class='number'>0x1c</span>, <span class='number'>0x0a</span>, <span class='number'>0x0c</span>, <span class='number'>0x0a</span>, <span class='number'>0x05</span>, <span class='number'>0x04</span>, <span class='number'>0x00</span>, <span class='number'>0x02</span>, <span class='number'>0x00</span>,
<span class='number'>0x01</span>, <span class='number'>0x12</span>, <span class='number'>0x03</span>, <span class='number'>0x07</span>, <span class='number'>0x1d</span>, <span class='number'>0x24</span>, <span class='number'>0x0a</span>, <span class='number'>0x0c</span>, <span class='number'>0x0a</span>, <span class='number'>0x05</span>, <span class='number'>0x04</span>, <span class='number'>0x00</span>, <span class='number'>0x02</span>, <span class='number'>0x00</span>, <span class='number'>0x03</span>, <span class='number'>0x12</span>,
<span class='number'>0x03</span>, <span class='number'>0x07</span>, <span class='number'>0x27</span>, <span class='number'>0x28</span>, <span class='number'>0x0a</span>, <span class='number'>0x0b</span>, <span class='number'>0x0a</span>, <span class='number'>0x04</span>, <span class='number'>0x04</span>, <span class='number'>0x00</span>, <span class='number'>0x02</span>, <span class='number'>0x01</span>, <span class='number'>0x12</span>, <span class='number'>0x03</span>, <span class='number'>0x08</span>, <span class='number'>0x08</span>,
<span class='number'>0x19</span>, <span class='number'>0x0a</span>, <span class='number'>0x0d</span>, <span class='number'>0x0a</span>, <span class='number'>0x05</span>, <span class='number'>0x04</span>, <span class='number'>0x00</span>, <span class='number'>0x02</span>, <span class='number'>0x01</span>, <span class='number'>0x04</span>, <span class='number'>0x12</span>, <span class='number'>0x04</span>, <span class='number'>0x08</span>, <span class='number'>0x08</span>, <span class='number'>0x07</span>, <span class='number'>0x29</span>,
<span class='number'>0x0a</span>, <span class='number'>0x0c</span>, <span class='number'>0x0a</span>, <span class='number'>0x05</span>, <span class='number'>0x04</span>, <span class='number'>0x00</span>, <span class='number'>0x02</span>, <span class='number'>0x01</span>, <span class='number'>0x05</span>, <span class='number'>0x12</span>, <span class='number'>0x03</span>, <span class='number'>0x08</span>, <span class='number'>0x08</span>, <span class='number'>0x0d</span>, <span class='number'>0x0a</span>, <span class='number'>0x0c</span>,
<span class='number'>0x0a</span>, <span class='number'>0x05</span>, <span class='number'>0x04</span>, <span class='number'>0x00</span>, <span class='number'>0x02</span>, <span class='number'>0x01</span>, <span class='number'>0x01</span>, <span class='number'>0x12</span>, <span class='number'>0x03</span>, <span class='number'>0x08</span>, <span class='number'>0x0e</span>, <span class='number'>0x14</span>, <span class='number'>0x0a</span>, <span class='number'>0x0c</span>, <span class='number'>0x0a</span>, <span class='number'>0x05</span>,
<span class='number'>0x04</span>, <span class='number'>0x00</span>, <span class='number'>0x02</span>, <span class='number'>0x01</span>, <span class='number'>0x03</span>, <span class='number'>0x12</span>, <span class='number'>0x03</span>, <span class='number'>0x08</span>, <span class='number'>0x17</span>, <span class='number'>0x18</span>, <span class='number'>0x0a</span>, <span class='number'>0x0b</span>, <span class='number'>0x0a</span>, <span class='number'>0x04</span>, <span class='number'>0x04</span>, <span class='number'>0x00</span>,
<span class='number'>0x02</span>, <span class='number'>0x02</span>, <span class='number'>0x12</span>, <span class='number'>0x03</span>, <span class='number'>0x09</span>, <span class='number'>0x08</span>, <span class='number'>0x1d</span>, <span class='number'>0x0a</span>, <span class='number'>0x0d</span>, <span class='number'>0x0a</span>, <span class='number'>0x05</span>, <span class='number'>0x04</span>, <span class='number'>0x00</span>, <span class='number'>0x02</span>, <span class='number'>0x02</span>, <span class='number'>0x04</span>,
<span class='number'>0x12</span>, <span class='number'>0x04</span>, <span class='number'>0x09</span>, <span class='number'>0x08</span>, <span class='number'>0x08</span>, <span class='number'>0x19</span>, <span class='number'>0x0a</span>, <span class='number'>0x0c</span>, <span class='number'>0x0a</span>, <span class='number'>0x05</span>, <span class='number'>0x04</span>, <span class='number'>0x00</span>, <span class='number'>0x02</span>, <span class='number'>0x02</span>, <span class='number'>0x05</span>, <span class='number'>0x12</span>,
<span class='number'>0x03</span>, <span class='number'>0x09</span>, <span class='number'>0x08</span>, <span class='number'>0x0e</span>, <span class='number'>0x0a</span>, <span class='number'>0x0c</span>, <span class='number'>0x0a</span>, <span class='number'>0x05</span>, <span class='number'>0x04</span>, <span class='number'>0x00</span>, <span class='number'>0x02</span>, <span class='number'>0x02</span>, <span class='number'>0x01</span>, <span class='number'>0x12</span>, <span class='number'>0x03</span>, <span class='number'>0x09</span>,
<span class='number'>0x0f</span>, <span class='number'>0x18</span>, <span class='number'>0x0a</span>, <span class='number'>0x0c</span>, <span class='number'>0x0a</span>, <span class='number'>0x05</span>, <span class='number'>0x04</span>, <span class='number'>0x00</span>, <span class='number'>0x02</span>, <span class='number'>0x02</span>, <span class='number'>0x03</span>, <span class='number'>0x12</span>, <span class='number'>0x03</span>, <span class='number'>0x09</span>, <span class='number'>0x1b</span>, <span class='number'>0x1c</span>,
<span class='number'>0x62</span>, <span class='number'>0x06</span>, <span class='number'>0x70</span>, <span class='number'>0x72</span>, <span class='number'>0x6f</span>, <span class='number'>0x74</span>, <span class='number'>0x6f</span>, <span class='number'>0x33</span>,
];
<span class='kw'>static</span> <span class='kw-2'>mut</span> <span class='ident'>file_descriptor_proto_lazy</span>: ::<span class='ident'>protobuf</span>::<span class='ident'>lazy</span>::<span class='ident'>Lazy</span><span class='op'>&lt;</span>::<span class='ident'>protobuf</span>::<span class='ident'>descriptor</span>::<span class='ident'>FileDescriptorProto</span><span class='op'>&gt;</span> <span class='op'>=</span> ::<span class='ident'>protobuf</span>::<span class='ident'>lazy</span>::<span class='ident'>Lazy</span> {
<span class='ident'>lock</span>: ::<span class='ident'>protobuf</span>::<span class='ident'>lazy</span>::<span class='ident'>ONCE_INIT</span>,
<span class='ident'>ptr</span>: <span class='number'>0</span> <span class='kw'>as</span> <span class='op'>*</span><span class='kw'>const</span> ::<span class='ident'>protobuf</span>::<span class='ident'>descriptor</span>::<span class='ident'>FileDescriptorProto</span>,
};
<span class='kw'>fn</span> <span class='ident'>parse_descriptor_proto</span>() <span class='op'>-&gt;</span> ::<span class='ident'>protobuf</span>::<span class='ident'>descriptor</span>::<span class='ident'>FileDescriptorProto</span> {
::<span class='ident'>protobuf</span>::<span class='ident'>parse_from_bytes</span>(<span class='ident'>file_descriptor_proto_data</span>).<span class='ident'>unwrap</span>()
}
<span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>file_descriptor_proto</span>() <span class='op'>-&gt;</span> <span class='kw-2'>&amp;</span><span class='lifetime'>&#39;static</span> ::<span class='ident'>protobuf</span>::<span class='ident'>descriptor</span>::<span class='ident'>FileDescriptorProto</span> {
<span class='kw'>unsafe</span> {
<span class='ident'>file_descriptor_proto_lazy</span>.<span class='ident'>get</span>(<span class='op'>||</span> {
<span class='ident'>parse_descriptor_proto</span>()
})
}
}
</pre>
</section>
<section id='search' class="content hidden"></section>
<section class="footer"></section>
<aside id="help" class="hidden">
<div>
<h1 class="hidden">Help</h1>
<div class="shortcuts">
<h2>Keyboard Shortcuts</h2>
<dl>
<dt>?</dt>
<dd>Show this help dialog</dd>
<dt>S</dt>
<dd>Focus the search field</dd>
<dt>&larrb;</dt>
<dd>Move up in search results</dd>
<dt>&rarrb;</dt>
<dd>Move down in search results</dd>
<dt>&#9166;</dt>
<dd>Go to active search result</dd>
<dt>+</dt>
<dd>Collapse/expand all sections</dd>
</dl>
</div>
<div class="infos">
<h2>Search Tricks</h2>
<p>
Prefix searches with a type followed by a colon (e.g.
<code>fn:</code>) to restrict the search to a given type.
</p>
<p>
Accepted types are: <code>fn</code>, <code>mod</code>,
<code>struct</code>, <code>enum</code>,
<code>trait</code>, <code>type</code>, <code>macro</code>,
and <code>const</code>.
</p>
<p>
Search functions by type signature (e.g.
<code>vec -> usize</code> or <code>* -> vec</code>)
</p>
</div>
</div>
</aside>
<script>
window.rootPath = "../../../";
window.currentCrate = "rusty_secrets";
</script>
<script src="../../../jquery.js"></script>
<script src="../../../main.js"></script>
<script defer src="../../../search-index.js"></script>
</body>
</html>

View File

@ -790,11 +790,9 @@
<script>
window.rootPath = "../../../";
window.currentCrate = "rusty_secrets";
window.playgroundUrl = "";
</script>
<script src="../../../jquery.js"></script>
<script src="../../../main.js"></script>
<script defer src="../../../search-index.js"></script>
</body>
</html>

View File

@ -128,26 +128,27 @@
<span id="84">84</span>
<span id="85">85</span>
<span id="86">86</span>
<span id="87">87</span>
</pre><pre class='rust '>
<span class='kw'>use</span> <span class='ident'>custom_error</span>::{<span class='ident'>other_io_err</span>, <span class='ident'>pie2io</span>};
<span class='kw'>use</span> <span class='ident'>custom_error</span>::{<span class='ident'>RustyError</span>, <span class='ident'>RustyErrorTypes</span>};
<span class='kw'>use</span> <span class='ident'>custom_error</span>::<span class='ident'>pie2error</span>;
<span class='kw'>use</span> <span class='ident'>digest</span>;
<span class='kw'>use</span> <span class='ident'>merkle_sigs</span>::<span class='ident'>Proof</span>;
<span class='kw'>use</span> <span class='ident'>merkle_sigs</span>::<span class='ident'>PublicKey</span>;
<span class='kw'>use</span> <span class='ident'>merkle_sigs</span>::{<span class='ident'>MerklePublicKey</span>, <span class='ident'>Proof</span>, <span class='ident'>PublicKey</span>};
<span class='kw'>use</span> <span class='ident'>protobuf</span>;
<span class='kw'>use</span> <span class='ident'>protobuf</span>::{<span class='ident'>Message</span>, <span class='ident'>RepeatedField</span>};
<span class='kw'>use</span> <span class='ident'>serialize</span>;
<span class='kw'>use</span> <span class='ident'>serialize</span>::<span class='ident'>base64</span>::{<span class='self'>self</span>, <span class='ident'>FromBase64</span>, <span class='ident'>ToBase64</span>};
<span class='kw'>use</span> <span class='ident'>share_data</span>::<span class='ident'>ShareData</span>;
<span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>io</span>;
<span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>error</span>::<span class='ident'>Error</span>;
<span class='kw'>type</span> <span class='ident'>ParsedShare</span> <span class='op'>=</span> <span class='prelude-ty'>Result</span><span class='op'>&lt;</span>(<span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>u8</span><span class='op'>&gt;</span>, <span class='ident'>u8</span>, <span class='ident'>u8</span>, <span class='prelude-ty'>Option</span><span class='op'>&lt;</span>(<span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>u8</span><span class='op'>&gt;&gt;</span>, <span class='ident'>Proof</span><span class='op'>&lt;</span><span class='ident'>MerklePublicKey</span><span class='op'>&gt;</span>)<span class='op'>&gt;</span>), <span class='ident'>RustyError</span><span class='op'>&gt;</span>;
<span class='kw'>fn</span> <span class='ident'>base64_config</span>() <span class='op'>-&gt;</span> <span class='ident'>serialize</span>::<span class='ident'>base64</span>::<span class='ident'>Config</span> {
<span class='ident'>base64</span>::<span class='ident'>Config</span> { <span class='ident'>pad</span>: <span class='bool-val'>false</span>, ..<span class='ident'>base64</span>::<span class='ident'>STANDARD</span> }
}
<span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>share_string_from</span>(<span class='ident'>share</span>: <span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>u8</span><span class='op'>&gt;</span>,
<span class='ident'>threshold</span>: <span class='ident'>u8</span>,
<span class='ident'>share_num</span>: <span class='ident'>u8</span>,
<span class='ident'>signature_pair</span>: <span class='prelude-ty'>Option</span><span class='op'>&lt;</span>(<span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>u8</span><span class='op'>&gt;&gt;</span>, <span class='ident'>Proof</span><span class='op'>&lt;</span><span class='ident'>PublicKey</span><span class='op'>&gt;</span>)<span class='op'>&gt;</span>)
<span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>share_string_from</span>(<span class='ident'>share</span>: <span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>u8</span><span class='op'>&gt;</span>, <span class='ident'>threshold</span>: <span class='ident'>u8</span>, <span class='ident'>share_num</span>: <span class='ident'>u8</span>,
<span class='ident'>signature_pair</span>: <span class='prelude-ty'>Option</span><span class='op'>&lt;</span>(<span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>u8</span><span class='op'>&gt;&gt;</span>, <span class='ident'>Proof</span><span class='op'>&lt;</span><span class='ident'>MerklePublicKey</span><span class='op'>&gt;</span>)<span class='op'>&gt;</span>)
<span class='op'>-&gt;</span> <span class='ident'>String</span> {
<span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>share_protobuf</span> <span class='op'>=</span> <span class='ident'>ShareData</span>::<span class='ident'>new</span>();
<span class='ident'>share_protobuf</span>.<span class='ident'>set_shamir_data</span>(<span class='ident'>share</span>);
@ -164,44 +165,45 @@
<span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>share_from_string</span>
(<span class='ident'>s</span>: <span class='kw-2'>&amp;</span><span class='ident'>str</span>,
<span class='ident'>index</span>: <span class='ident'>u8</span>,
<span class='ident'>is_signed</span>: <span class='ident'>bool</span>)
<span class='op'>-&gt;</span> <span class='ident'>io</span>::<span class='prelude-ty'>Result</span><span class='op'>&lt;</span>(<span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>u8</span><span class='op'>&gt;</span>, <span class='ident'>u8</span>, <span class='ident'>u8</span>, <span class='prelude-ty'>Option</span><span class='op'>&lt;</span>(<span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>u8</span><span class='op'>&gt;&gt;</span>, <span class='ident'>Proof</span><span class='op'>&lt;</span><span class='ident'>PublicKey</span><span class='op'>&gt;</span>)<span class='op'>&gt;</span>)<span class='op'>&gt;</span> {
<span class='op'>-&gt;</span> <span class='ident'>ParsedShare</span> {
<span class='kw'>let</span> <span class='ident'>parts</span>: <span class='ident'>Vec</span><span class='op'>&lt;</span>_<span class='op'>&gt;</span> <span class='op'>=</span> <span class='ident'>s</span>.<span class='ident'>trim</span>().<span class='ident'>split</span>(<span class='string'>&#39;-&#39;</span>).<span class='ident'>collect</span>();
<span class='kw'>if</span> <span class='ident'>parts</span>.<span class='ident'>len</span>() <span class='op'>!=</span> <span class='number'>3</span> {
<span class='kw'>return</span> <span class='prelude-val'>Err</span>(<span class='ident'>other_io_err</span>(<span class='string'>&quot;Share parse error: Expected 3 parts separated by a minus sign&quot;</span>,
<span class='prelude-val'>None</span>));
<span class='kw'>return</span> <span class='prelude-val'>Err</span>(<span class='ident'>RustyError</span>::<span class='ident'>with_type</span>(<span class='ident'>RustyErrorTypes</span>::<span class='ident'>ShareParsingError</span>(<span class='ident'>index</span>, <span class='macro'>format</span><span class='macro'>!</span>(<span class='string'>&quot;Expected 3 parts separated by a minus sign. Found {}.&quot;</span>, <span class='ident'>s</span>))));
}
<span class='kw'>let</span> (<span class='ident'>k</span>, <span class='ident'>n</span>, <span class='ident'>p3</span>) <span class='op'>=</span> {
<span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>iter</span> <span class='op'>=</span> <span class='ident'>parts</span>.<span class='ident'>into_iter</span>();
<span class='kw'>let</span> <span class='ident'>k</span> <span class='op'>=</span> <span class='macro'>try</span><span class='macro'>!</span>(<span class='ident'>iter</span>.<span class='ident'>next</span>().<span class='ident'>unwrap</span>().<span class='ident'>parse</span>::<span class='op'>&lt;</span><span class='ident'>u8</span><span class='op'>&gt;</span>().<span class='ident'>map_err</span>(<span class='ident'>pie2io</span>));
<span class='kw'>let</span> <span class='ident'>n</span> <span class='op'>=</span> <span class='macro'>try</span><span class='macro'>!</span>(<span class='ident'>iter</span>.<span class='ident'>next</span>().<span class='ident'>unwrap</span>().<span class='ident'>parse</span>::<span class='op'>&lt;</span><span class='ident'>u8</span><span class='op'>&gt;</span>().<span class='ident'>map_err</span>(<span class='ident'>pie2io</span>));
<span class='kw'>let</span> <span class='ident'>k</span> <span class='op'>=</span> <span class='macro'>try</span><span class='macro'>!</span>(<span class='ident'>iter</span>.<span class='ident'>next</span>().<span class='ident'>unwrap</span>().<span class='ident'>parse</span>::<span class='op'>&lt;</span><span class='ident'>u8</span><span class='op'>&gt;</span>().<span class='ident'>map_err</span>(<span class='ident'>pie2error</span>));
<span class='kw'>let</span> <span class='ident'>n</span> <span class='op'>=</span> <span class='macro'>try</span><span class='macro'>!</span>(<span class='ident'>iter</span>.<span class='ident'>next</span>().<span class='ident'>unwrap</span>().<span class='ident'>parse</span>::<span class='op'>&lt;</span><span class='ident'>u8</span><span class='op'>&gt;</span>().<span class='ident'>map_err</span>(<span class='ident'>pie2error</span>));
<span class='kw'>let</span> <span class='ident'>p3</span> <span class='op'>=</span> <span class='ident'>iter</span>.<span class='ident'>next</span>().<span class='ident'>unwrap</span>();
(<span class='ident'>k</span>, <span class='ident'>n</span>, <span class='ident'>p3</span>)
};
<span class='kw'>if</span> <span class='ident'>k</span> <span class='op'>&lt;</span> <span class='number'>1</span> <span class='op'>||</span> <span class='ident'>n</span> <span class='op'>&lt;</span> <span class='number'>1</span> {
<span class='kw'>return</span> <span class='prelude-val'>Err</span>(<span class='ident'>other_io_err</span>(<span class='string'>&quot;Share parse error: Illegal K,N parameters&quot;</span>, <span class='prelude-val'>None</span>));
<span class='kw'>return</span> <span class='prelude-val'>Err</span>(<span class='ident'>RustyError</span>::<span class='ident'>with_type</span>(<span class='ident'>RustyErrorTypes</span>::<span class='ident'>ShareParsingError</span>(<span class='ident'>index</span>, <span class='macro'>format</span><span class='macro'>!</span>(<span class='string'>&quot;Found illegal parameters K: {} N: {}.&quot;</span>, <span class='ident'>k</span>, <span class='ident'>n</span>))));
}
<span class='kw'>let</span> <span class='ident'>raw_data</span> <span class='op'>=</span> <span class='macro'>try</span><span class='macro'>!</span>(<span class='ident'>p3</span>.<span class='ident'>from_base64</span>().<span class='ident'>map_err</span>(<span class='op'>|</span>_<span class='op'>|</span> {
<span class='ident'>other_io_err</span>(<span class='string'>&quot;Share parse error: Base64 decoding of data block failed&quot;</span>,
<span class='prelude-val'>None</span>)
<span class='ident'>RustyError</span>::<span class='ident'>with_type</span>(<span class='ident'>RustyErrorTypes</span>::<span class='ident'>ShareParsingError</span>(<span class='ident'>index</span>, <span class='string'>&quot;Base64 decoding of data block failed&quot;</span>.<span class='ident'>to_owned</span>()))
}));
<span class='kw'>let</span> <span class='ident'>protobuf_data</span> <span class='op'>=</span> <span class='macro'>try</span><span class='macro'>!</span>(<span class='ident'>protobuf</span>::<span class='ident'>parse_from_bytes</span>::<span class='op'>&lt;</span><span class='ident'>ShareData</span><span class='op'>&gt;</span>(<span class='ident'>raw_data</span>.<span class='ident'>as_slice</span>())
.<span class='ident'>map_err</span>(<span class='op'>|</span>_<span class='op'>|</span> <span class='ident'>other_io_err</span>(<span class='string'>&quot;Share parse error: Protobuffer could not be decoded.&quot;</span>, <span class='prelude-val'>None</span>)));
.<span class='ident'>map_err</span>(<span class='op'>|</span><span class='ident'>e</span><span class='op'>|</span> <span class='ident'>RustyError</span>::<span class='ident'>with_type</span>(<span class='ident'>RustyErrorTypes</span>::<span class='ident'>ShareParsingError</span>(<span class='ident'>index</span>, <span class='macro'>format</span><span class='macro'>!</span>(<span class='string'>&quot;Protobuf decoding of data block failed with error: {} .&quot;</span>, <span class='ident'>e</span>.<span class='ident'>description</span>())))));
<span class='kw'>let</span> <span class='ident'>share</span> <span class='op'>=</span> <span class='ident'>Vec</span>::<span class='ident'>from</span>(<span class='ident'>protobuf_data</span>.<span class='ident'>get_shamir_data</span>());
<span class='kw'>if</span> <span class='ident'>is_signed</span> {
<span class='kw'>let</span> <span class='ident'>p</span> <span class='op'>=</span> <span class='ident'>Proof</span>::<span class='ident'>parse_from_bytes</span>(<span class='ident'>protobuf_data</span>.<span class='ident'>get_proof</span>(), <span class='ident'>digest</span>).<span class='ident'>unwrap</span>().<span class='ident'>unwrap</span>();
<span class='kw'>let</span> <span class='ident'>p_result</span> <span class='op'>=</span> <span class='ident'>Proof</span>::<span class='ident'>parse_from_bytes</span>(<span class='ident'>protobuf_data</span>.<span class='ident'>get_proof</span>(), <span class='ident'>digest</span>);
<span class='kw'>let</span> <span class='ident'>p_opt</span> <span class='op'>=</span> <span class='ident'>p_result</span>.<span class='ident'>unwrap</span>();
<span class='kw'>let</span> <span class='ident'>p</span> <span class='op'>=</span> <span class='ident'>p_opt</span>.<span class='ident'>unwrap</span>();
<span class='kw'>let</span> <span class='ident'>proof</span> <span class='op'>=</span> <span class='ident'>Proof</span> {
<span class='ident'>algorithm</span>: <span class='ident'>digest</span>,
<span class='ident'>lemma</span>: <span class='ident'>p</span>.<span class='ident'>lemma</span>,
<span class='ident'>root_hash</span>: <span class='ident'>p</span>.<span class='ident'>root_hash</span>,
<span class='ident'>value</span>: <span class='ident'>PublicKey</span>::<span class='ident'>from_vec</span>(<span class='ident'>p</span>.<span class='ident'>value</span>, <span class='ident'>digest</span>).<span class='ident'>unwrap</span>(),
<span class='ident'>value</span>: <span class='ident'>MerklePublicKey</span>::<span class='ident'>new</span>(<span class='ident'>PublicKey</span>::<span class='ident'>from_vec</span>(<span class='ident'>p</span>.<span class='ident'>value</span>, <span class='ident'>digest</span>).<span class='ident'>unwrap</span>()),
};
<span class='kw'>let</span> <span class='ident'>signature</span> <span class='op'>=</span> <span class='ident'>protobuf_data</span>.<span class='ident'>get_signature</span>();
@ -272,11 +274,9 @@
<script>
window.rootPath = "../../../";
window.currentCrate = "rusty_secrets";
window.playgroundUrl = "";
</script>
<script src="../../../jquery.js"></script>
<script src="../../../main.js"></script>
<script defer src="../../../search-index.js"></script>
</body>
</html>

View File

@ -168,8 +168,12 @@
<span id="124">124</span>
<span id="125">125</span>
<span id="126">126</span>
<span id="127">127</span>
<span id="128">128</span>
</pre><pre class='rust '>
<span class='kw'>use</span> <span class='ident'>custom_error</span>::<span class='ident'>other_io_err</span>;
<span class='doccomment'>//! SSS provides Shamir&#39;s secret sharing with raw data.</span>
<span class='kw'>use</span> <span class='ident'>custom_error</span>::{<span class='ident'>RustyError</span>, <span class='ident'>other_io_err</span>};
<span class='kw'>use</span> <span class='ident'>digest</span>;
<span class='kw'>use</span> <span class='ident'>interpolation</span>::{<span class='ident'>encode</span>, <span class='ident'>lagrange_interpolate</span>};
<span class='kw'>use</span> <span class='ident'>merkle_sigs</span>::<span class='ident'>sign_data_vec</span>;
@ -184,12 +188,12 @@
<span class='ident'>repeat</span>(<span class='ident'>x</span>).<span class='ident'>take</span>(<span class='ident'>n</span>).<span class='ident'>collect</span>()
}
<span class='doccomment'>/// Performs threshold k-out-of-n Shamir secret sharing.</span>
<span class='doccomment'>/// Performs threshold k-out-of-n Shamir&#39;s secret sharing.</span>
<span class='doccomment'>///</span>
<span class='doccomment'>/// # Examples</span>
<span class='doccomment'>///</span>
<span class='doccomment'>/// ```</span>
<span class='doccomment'>/// use rusty_secrets::generate_shares;</span>
<span class='doccomment'>/// use rusty_secrets::sss::generate_shares;</span>
<span class='doccomment'>/// let secret = &quot;These programs were never about terrorism: theyre about economic spying,</span>
<span class='doccomment'>/// social control, and diplomatic manipulation. Theyre about power.&quot;.to_string();</span>
<span class='doccomment'>///</span>
@ -202,10 +206,10 @@
<span class='doccomment'>/// ```</span>
<span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>generate_shares</span>(<span class='ident'>k</span>: <span class='ident'>u8</span>, <span class='ident'>n</span>: <span class='ident'>u8</span>, <span class='ident'>secret</span>: <span class='kw-2'>&amp;</span>[<span class='ident'>u8</span>], <span class='ident'>sign_shares</span>: <span class='ident'>bool</span>) <span class='op'>-&gt;</span> <span class='ident'>io</span>::<span class='prelude-ty'>Result</span><span class='op'>&lt;</span><span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>String</span><span class='op'>&gt;&gt;</span> {
<span class='kw'>if</span> <span class='ident'>k</span> <span class='op'>&gt;</span> <span class='ident'>n</span> {
<span class='kw'>return</span> <span class='prelude-val'>Err</span>(<span class='ident'>other_io_err</span>(<span class='string'>&quot;Threshold K can not be larger than N&quot;</span>, <span class='prelude-val'>None</span>));
<span class='kw'>return</span> <span class='prelude-val'>Err</span>(<span class='ident'>other_io_err</span>(<span class='string'>&quot;Threshold K can not be larger than N&quot;</span>, <span class='prelude-val'>None</span>, <span class='prelude-val'>None</span>, <span class='prelude-val'>None</span>));
}
<span class='kw'>let</span> <span class='ident'>shares</span> <span class='op'>=</span> <span class='macro'>try</span><span class='macro'>!</span>(<span class='ident'>secret_share</span>(<span class='kw-2'>&amp;</span><span class='op'>*</span><span class='ident'>secret</span>, <span class='ident'>k</span>, <span class='ident'>n</span>));
<span class='kw'>let</span> <span class='ident'>shares</span> <span class='op'>=</span> <span class='macro'>try</span><span class='macro'>!</span>(<span class='ident'>secret_share</span>(<span class='ident'>secret</span>, <span class='ident'>k</span>, <span class='ident'>n</span>));
<span class='kw'>let</span> <span class='ident'>signatures</span> <span class='op'>=</span> <span class='kw'>if</span> <span class='ident'>sign_shares</span> {
<span class='kw'>let</span> <span class='ident'>shares_to_sign</span> <span class='op'>=</span> <span class='ident'>shares</span>.<span class='ident'>iter</span>()
@ -237,7 +241,7 @@
<span class='prelude-val'>Ok</span>(<span class='ident'>result</span>)
}
<span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>secret_share</span>(<span class='ident'>src</span>: <span class='kw-2'>&amp;</span>[<span class='ident'>u8</span>], <span class='ident'>k</span>: <span class='ident'>u8</span>, <span class='ident'>n</span>: <span class='ident'>u8</span>) <span class='op'>-&gt;</span> <span class='ident'>io</span>::<span class='prelude-ty'>Result</span><span class='op'>&lt;</span><span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>u8</span><span class='op'>&gt;&gt;</span><span class='op'>&gt;</span> {
<span class='kw'>fn</span> <span class='ident'>secret_share</span>(<span class='ident'>src</span>: <span class='kw-2'>&amp;</span>[<span class='ident'>u8</span>], <span class='ident'>k</span>: <span class='ident'>u8</span>, <span class='ident'>n</span>: <span class='ident'>u8</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Result</span><span class='op'>&lt;</span><span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>u8</span><span class='op'>&gt;&gt;</span>, <span class='ident'>RustyError</span><span class='op'>&gt;</span> {
<span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>result</span> <span class='op'>=</span> <span class='ident'>Vec</span>::<span class='ident'>with_capacity</span>(<span class='ident'>n</span> <span class='kw'>as</span> <span class='ident'>usize</span>);
<span class='kw'>for</span> _ <span class='kw'>in</span> <span class='number'>0</span>..(<span class='ident'>n</span> <span class='kw'>as</span> <span class='ident'>usize</span>) {
<span class='ident'>result</span>.<span class='ident'>push</span>(<span class='ident'>new_vec</span>(<span class='ident'>src</span>.<span class='ident'>len</span>(), <span class='number'>0u8</span>));
@ -258,14 +262,14 @@
}
<span class='doccomment'>/// Recovers the secret from a k-out-of-n Shamir secret sharing.</span>
<span class='doccomment'>/// Recovers the secret from a k-out-of-n Shamir&#39;s secret sharing.</span>
<span class='doccomment'>///</span>
<span class='doccomment'>/// At least `k` distinct shares need to be provided to recover the share.</span>
<span class='doccomment'>///</span>
<span class='doccomment'>/// # Examples</span>
<span class='doccomment'>///</span>
<span class='doccomment'>/// ```</span>
<span class='doccomment'>/// use rusty_secrets::recover_secret;</span>
<span class='doccomment'>/// use rusty_secrets::sss::recover_secret;</span>
<span class='doccomment'>/// let share1 = &quot;2-1-Cha7s14Q/mSwWko0ittr+/Uf79RHQMIP&quot;.to_string();</span>
<span class='doccomment'>/// let share2 = &quot;2-4-ChaydsUJDypD9ZWxwvIICh/cmZvzusOF&quot;.to_string();</span>
<span class='doccomment'>/// let shares = vec![share1, share2];</span>
@ -279,7 +283,7 @@
<span class='doccomment'>/// }</span>
<span class='doccomment'>/// }</span>
<span class='doccomment'>/// ```</span>
<span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>recover_secret</span>(<span class='ident'>shares</span>: <span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>String</span><span class='op'>&gt;</span>, <span class='ident'>verify_signatures</span>: <span class='ident'>bool</span>) <span class='op'>-&gt;</span> <span class='ident'>io</span>::<span class='prelude-ty'>Result</span><span class='op'>&lt;</span><span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>u8</span><span class='op'>&gt;&gt;</span> {
<span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>recover_secret</span>(<span class='ident'>shares</span>: <span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>String</span><span class='op'>&gt;</span>, <span class='ident'>verify_signatures</span>: <span class='ident'>bool</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Result</span><span class='op'>&lt;</span><span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>u8</span><span class='op'>&gt;</span>, <span class='ident'>RustyError</span><span class='op'>&gt;</span> {
<span class='kw'>let</span> (<span class='ident'>k</span>, <span class='ident'>shares</span>) <span class='op'>=</span> <span class='macro'>try</span><span class='macro'>!</span>(<span class='ident'>process_and_validate_shares</span>(<span class='ident'>shares</span>, <span class='ident'>verify_signatures</span>));
<span class='kw'>let</span> <span class='ident'>slen</span> <span class='op'>=</span> <span class='ident'>shares</span>[<span class='number'>0</span>].<span class='number'>1</span>.<span class='ident'>len</span>();
@ -352,11 +356,9 @@
<script>
window.rootPath = "../../../";
window.currentCrate = "rusty_secrets";
window.playgroundUrl = "";
</script>
<script src="../../../jquery.js"></script>
<script src="../../../main.js"></script>
<script defer src="../../../search-index.js"></script>
</body>
</html>

View File

@ -42,144 +42,224 @@
</form>
</nav>
<section id='main' class="content source"><pre class="line-numbers"><span id="1"> 1</span>
<span id="2"> 2</span>
<span id="3"> 3</span>
<span id="4"> 4</span>
<span id="5"> 5</span>
<span id="6"> 6</span>
<span id="7"> 7</span>
<span id="8"> 8</span>
<span id="9"> 9</span>
<span id="10">10</span>
<span id="11">11</span>
<span id="12">12</span>
<span id="13">13</span>
<span id="14">14</span>
<span id="15">15</span>
<span id="16">16</span>
<span id="17">17</span>
<span id="18">18</span>
<span id="19">19</span>
<span id="20">20</span>
<span id="21">21</span>
<span id="22">22</span>
<span id="23">23</span>
<span id="24">24</span>
<span id="25">25</span>
<span id="26">26</span>
<span id="27">27</span>
<span id="28">28</span>
<span id="29">29</span>
<span id="30">30</span>
<span id="31">31</span>
<span id="32">32</span>
<span id="33">33</span>
<span id="34">34</span>
<span id="35">35</span>
<span id="36">36</span>
<span id="37">37</span>
<span id="38">38</span>
<span id="39">39</span>
<span id="40">40</span>
<span id="41">41</span>
<span id="42">42</span>
<span id="43">43</span>
<span id="44">44</span>
<span id="45">45</span>
<span id="46">46</span>
<span id="47">47</span>
<span id="48">48</span>
<span id="49">49</span>
<span id="50">50</span>
<span id="51">51</span>
<span id="52">52</span>
<span id="53">53</span>
<span id="54">54</span>
<span id="55">55</span>
<span id="56">56</span>
<span id="57">57</span>
<span id="58">58</span>
<span id="59">59</span>
<span id="60">60</span>
<span id="61">61</span>
<span id="62">62</span>
<span id="63">63</span>
<span id="64">64</span>
<span id="65">65</span>
<span id="66">66</span>
<span id="67">67</span>
<span id="68">68</span>
<span id="69">69</span>
<section id='main' class="content source"><pre class="line-numbers"><span id="1"> 1</span>
<span id="2"> 2</span>
<span id="3"> 3</span>
<span id="4"> 4</span>
<span id="5"> 5</span>
<span id="6"> 6</span>
<span id="7"> 7</span>
<span id="8"> 8</span>
<span id="9"> 9</span>
<span id="10"> 10</span>
<span id="11"> 11</span>
<span id="12"> 12</span>
<span id="13"> 13</span>
<span id="14"> 14</span>
<span id="15"> 15</span>
<span id="16"> 16</span>
<span id="17"> 17</span>
<span id="18"> 18</span>
<span id="19"> 19</span>
<span id="20"> 20</span>
<span id="21"> 21</span>
<span id="22"> 22</span>
<span id="23"> 23</span>
<span id="24"> 24</span>
<span id="25"> 25</span>
<span id="26"> 26</span>
<span id="27"> 27</span>
<span id="28"> 28</span>
<span id="29"> 29</span>
<span id="30"> 30</span>
<span id="31"> 31</span>
<span id="32"> 32</span>
<span id="33"> 33</span>
<span id="34"> 34</span>
<span id="35"> 35</span>
<span id="36"> 36</span>
<span id="37"> 37</span>
<span id="38"> 38</span>
<span id="39"> 39</span>
<span id="40"> 40</span>
<span id="41"> 41</span>
<span id="42"> 42</span>
<span id="43"> 43</span>
<span id="44"> 44</span>
<span id="45"> 45</span>
<span id="46"> 46</span>
<span id="47"> 47</span>
<span id="48"> 48</span>
<span id="49"> 49</span>
<span id="50"> 50</span>
<span id="51"> 51</span>
<span id="52"> 52</span>
<span id="53"> 53</span>
<span id="54"> 54</span>
<span id="55"> 55</span>
<span id="56"> 56</span>
<span id="57"> 57</span>
<span id="58"> 58</span>
<span id="59"> 59</span>
<span id="60"> 60</span>
<span id="61"> 61</span>
<span id="62"> 62</span>
<span id="63"> 63</span>
<span id="64"> 64</span>
<span id="65"> 65</span>
<span id="66"> 66</span>
<span id="67"> 67</span>
<span id="68"> 68</span>
<span id="69"> 69</span>
<span id="70"> 70</span>
<span id="71"> 71</span>
<span id="72"> 72</span>
<span id="73"> 73</span>
<span id="74"> 74</span>
<span id="75"> 75</span>
<span id="76"> 76</span>
<span id="77"> 77</span>
<span id="78"> 78</span>
<span id="79"> 79</span>
<span id="80"> 80</span>
<span id="81"> 81</span>
<span id="82"> 82</span>
<span id="83"> 83</span>
<span id="84"> 84</span>
<span id="85"> 85</span>
<span id="86"> 86</span>
<span id="87"> 87</span>
<span id="88"> 88</span>
<span id="89"> 89</span>
<span id="90"> 90</span>
<span id="91"> 91</span>
<span id="92"> 92</span>
<span id="93"> 93</span>
<span id="94"> 94</span>
<span id="95"> 95</span>
<span id="96"> 96</span>
<span id="97"> 97</span>
<span id="98"> 98</span>
<span id="99"> 99</span>
<span id="100">100</span>
<span id="101">101</span>
<span id="102">102</span>
<span id="103">103</span>
<span id="104">104</span>
<span id="105">105</span>
<span id="106">106</span>
<span id="107">107</span>
<span id="108">108</span>
<span id="109">109</span>
</pre><pre class='rust '>
<span class='kw'>use</span> <span class='ident'>custom_error</span>::<span class='ident'>other_io_err</span>;
<span class='kw'>use</span> <span class='ident'>custom_error</span>::{<span class='ident'>RustyError</span>, <span class='ident'>RustyErrorTypes</span>};
<span class='kw'>use</span> <span class='ident'>merkle_sigs</span>::<span class='ident'>verify_data_vec_signature</span>;
<span class='kw'>use</span> <span class='ident'>share_format</span>;
<span class='kw'>use</span> <span class='ident'>share_format</span>::<span class='ident'>format_share_for_signing</span>;
<span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>collections</span>::<span class='ident'>HashMap</span>;
<span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>error</span>::<span class='ident'>Error</span>;
<span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>io</span>;
<span class='kw'>type</span> <span class='ident'>ProcessedShares</span> <span class='op'>=</span> <span class='prelude-ty'>Result</span><span class='op'>&lt;</span>(<span class='ident'>u8</span>, <span class='ident'>Vec</span><span class='op'>&lt;</span>(<span class='ident'>u8</span>, <span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>u8</span><span class='op'>&gt;</span>)<span class='op'>&gt;</span>), <span class='ident'>RustyError</span><span class='op'>&gt;</span>;
<span class='comment'>// The order of validation that we think makes the most sense is the following:</span>
<span class='comment'>// 1) Validate shares individually</span>
<span class='comment'>// 2) Validate duplicate shares share num &amp;&amp; data</span>
<span class='comment'>// 2) Validate group consistency</span>
<span class='comment'>// 3) Validate other properties, in no specific order</span>
<span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>process_and_validate_shares</span>(<span class='ident'>shares_strings</span>: <span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>String</span><span class='op'>&gt;</span>,
<span class='ident'>verify_signatures</span>: <span class='ident'>bool</span>)
<span class='op'>-&gt;</span> <span class='ident'>io</span>::<span class='prelude-ty'>Result</span><span class='op'>&lt;</span>(<span class='ident'>u8</span>, <span class='ident'>Vec</span><span class='op'>&lt;</span>(<span class='ident'>u8</span>, <span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>u8</span><span class='op'>&gt;</span>)<span class='op'>&gt;</span>)<span class='op'>&gt;</span> {
<span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>opt_k</span>: <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>u8</span><span class='op'>&gt;</span> <span class='op'>=</span> <span class='prelude-val'>None</span>;
<span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>opt_root_hash</span>: <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>u8</span><span class='op'>&gt;&gt;</span> <span class='op'>=</span> <span class='prelude-val'>None</span>;
<span class='op'>-&gt;</span> <span class='ident'>ProcessedShares</span> {
<span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>shares</span>: <span class='ident'>Vec</span><span class='op'>&lt;</span>(<span class='ident'>u8</span>, <span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>u8</span><span class='op'>&gt;</span>)<span class='op'>&gt;</span> <span class='op'>=</span> <span class='ident'>Vec</span>::<span class='ident'>new</span>();
<span class='kw'>for</span> (<span class='ident'>counter</span>, <span class='ident'>line</span>) <span class='kw'>in</span> <span class='ident'>shares_strings</span>.<span class='ident'>iter</span>().<span class='ident'>enumerate</span>() {
<span class='kw'>let</span> (<span class='ident'>share_data</span>, <span class='ident'>k</span>, <span class='ident'>n</span>, <span class='ident'>sig_pair</span>) <span class='op'>=</span> <span class='macro'>try</span><span class='macro'>!</span>(<span class='ident'>share_format</span>::<span class='ident'>share_from_string</span>(<span class='ident'>line</span>,
<span class='ident'>verify_signatures</span>));
<span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>k_compatibility_sets</span> <span class='op'>=</span> <span class='ident'>HashMap</span>::<span class='ident'>new</span>();
<span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>rh_compatibility_sets</span> <span class='op'>=</span> <span class='ident'>HashMap</span>::<span class='ident'>new</span>();
<span class='kw'>for</span> (<span class='ident'>counter</span>, <span class='ident'>line</span>) <span class='kw'>in</span> <span class='ident'>shares_strings</span>.<span class='ident'>iter</span>().<span class='ident'>enumerate</span>() {
<span class='kw'>if</span> <span class='ident'>k_compatibility_sets</span>.<span class='ident'>len</span>() <span class='op'>==</span> <span class='number'>1</span> {
<span class='kw'>let</span> <span class='ident'>k</span> <span class='op'>=</span> <span class='ident'>k_compatibility_sets</span>.<span class='ident'>keys</span>().<span class='ident'>last</span>().<span class='ident'>unwrap</span>();
<span class='kw'>if</span> <span class='op'>*</span><span class='ident'>k</span> <span class='op'>==</span> <span class='ident'>shares</span>.<span class='ident'>len</span>() <span class='kw'>as</span> <span class='ident'>u8</span> {
<span class='kw'>break</span>;
}
}
<span class='kw'>let</span> <span class='ident'>share_index</span> <span class='op'>=</span> <span class='ident'>counter</span> <span class='kw'>as</span> <span class='ident'>u8</span>;
<span class='kw'>let</span> (<span class='ident'>share_data</span>, <span class='ident'>k</span>, <span class='ident'>n</span>, <span class='ident'>sig_pair</span>) <span class='op'>=</span> <span class='macro'>try</span><span class='macro'>!</span>(<span class='ident'>share_format</span>::<span class='ident'>share_from_string</span>(<span class='ident'>line</span>,
<span class='ident'>counter</span> <span class='kw'>as</span> <span class='ident'>u8</span>,
<span class='ident'>verify_signatures</span>));
<span class='kw'>if</span> <span class='ident'>verify_signatures</span> {
<span class='kw'>if</span> <span class='ident'>sig_pair</span>.<span class='ident'>is_none</span>() {
<span class='kw'>return</span> <span class='prelude-val'>Err</span>(<span class='ident'>other_io_err</span>(<span class='string'>&quot;Signature is missing while shares are required to be \
signed.&quot;</span>,
<span class='prelude-val'>None</span>));
<span class='kw'>return</span> <span class='prelude-val'>Err</span>(<span class='ident'>RustyError</span>::<span class='ident'>with_type</span>(<span class='ident'>RustyErrorTypes</span>::<span class='ident'>MissingSignature</span>(<span class='ident'>share_index</span>)));
}
<span class='kw'>let</span> (<span class='ident'>signature</span>, <span class='ident'>p</span>) <span class='op'>=</span> <span class='ident'>sig_pair</span>.<span class='ident'>unwrap</span>();
<span class='kw'>let</span> <span class='ident'>root_hash</span> <span class='op'>=</span> <span class='ident'>p</span>.<span class='ident'>root_hash</span>.<span class='ident'>clone</span>();
<span class='kw'>if</span> <span class='kw'>let</span> <span class='prelude-val'>Some</span>(<span class='ident'>rh</span>) <span class='op'>=</span> <span class='ident'>opt_root_hash</span>.<span class='ident'>clone</span>() {
<span class='kw'>if</span> <span class='ident'>root_hash</span> <span class='op'>!=</span> <span class='ident'>rh</span> {
<span class='kw'>return</span> <span class='prelude-val'>Err</span>(<span class='ident'>other_io_err</span>(<span class='string'>&quot;Root hash not matching&quot;</span>, <span class='prelude-val'>None</span>));
}
<span class='ident'>p</span>.<span class='ident'>validate</span>(<span class='kw-2'>&amp;</span><span class='ident'>rh</span>);
} <span class='kw'>else</span> {
<span class='ident'>opt_root_hash</span> <span class='op'>=</span> <span class='prelude-val'>Some</span>(<span class='ident'>root_hash</span>.<span class='ident'>clone</span>());
}
<span class='macro'>try</span><span class='macro'>!</span>(<span class='ident'>verify_data_vec_signature</span>(<span class='ident'>format_share_for_signing</span>(<span class='ident'>k</span>,
<span class='ident'>n</span>,
<span class='kw-2'>&amp;</span><span class='ident'>share_data</span>.<span class='ident'>as_slice</span>()),
<span class='kw-2'>&amp;</span>(<span class='ident'>signature</span>.<span class='ident'>to_vec</span>(), <span class='ident'>p</span>),
<span class='kw-2'>&amp;</span><span class='ident'>root_hash</span>)
.<span class='ident'>map_err</span>(<span class='op'>|</span><span class='ident'>e</span><span class='op'>|</span> <span class='ident'>other_io_err</span>(<span class='string'>&quot;Invalid signature&quot;</span>, <span class='prelude-val'>Some</span>(<span class='ident'>String</span>::<span class='ident'>from</span>(<span class='ident'>e</span>.<span class='ident'>description</span>())))));
.<span class='ident'>map_err</span>(<span class='op'>|</span><span class='ident'>e</span><span class='op'>|</span> <span class='ident'>RustyError</span>::<span class='ident'>with_type</span>(<span class='ident'>RustyErrorTypes</span>::<span class='ident'>InvalidSignature</span>(<span class='ident'>share_index</span>, <span class='ident'>String</span>::<span class='ident'>from</span>(<span class='ident'>e</span>.<span class='ident'>description</span>())))));
<span class='ident'>rh_compatibility_sets</span>.<span class='ident'>entry</span>(<span class='ident'>root_hash</span>.<span class='ident'>clone</span>()).<span class='ident'>or_insert_with</span>(<span class='ident'>Vec</span>::<span class='ident'>new</span>);
<span class='kw'>let</span> <span class='ident'>vec</span> <span class='op'>=</span> <span class='ident'>rh_compatibility_sets</span>.<span class='ident'>get_mut</span>(<span class='kw-2'>&amp;</span><span class='ident'>root_hash</span>).<span class='ident'>unwrap</span>();
<span class='ident'>vec</span>.<span class='ident'>push</span>(<span class='ident'>share_index</span>);
}
<span class='kw'>if</span> <span class='kw'>let</span> <span class='prelude-val'>Some</span>(<span class='ident'>k_global</span>) <span class='op'>=</span> <span class='ident'>opt_k</span> {
<span class='kw'>if</span> <span class='ident'>k</span> <span class='op'>!=</span> <span class='ident'>k_global</span> {
<span class='kw'>return</span> <span class='prelude-val'>Err</span>(<span class='ident'>other_io_err</span>(<span class='string'>&quot;Incompatible shares&quot;</span>, <span class='prelude-val'>None</span>));
}
} <span class='kw'>else</span> {
<span class='ident'>opt_k</span> <span class='op'>=</span> <span class='prelude-val'>Some</span>(<span class='ident'>k</span>);
}
<span class='ident'>k_compatibility_sets</span>.<span class='ident'>entry</span>(<span class='ident'>k</span>).<span class='ident'>or_insert_with</span>(<span class='ident'>Vec</span>::<span class='ident'>new</span>);
<span class='kw'>let</span> <span class='ident'>vec</span> <span class='op'>=</span> <span class='ident'>k_compatibility_sets</span>.<span class='ident'>get_mut</span>(<span class='kw-2'>&amp;</span><span class='ident'>k</span>).<span class='ident'>unwrap</span>();
<span class='ident'>vec</span>.<span class='ident'>push</span>(<span class='ident'>share_index</span>);
<span class='kw'>if</span> <span class='ident'>shares</span>.<span class='ident'>iter</span>().<span class='ident'>any</span>(<span class='op'>|</span><span class='ident'>s</span><span class='op'>|</span> <span class='ident'>s</span>.<span class='number'>0</span> <span class='op'>==</span> <span class='ident'>n</span>) {
<span class='kw'>return</span> <span class='prelude-val'>Err</span>(<span class='ident'>other_io_err</span>(<span class='string'>&quot;Duplicate Share Number&quot;</span>, <span class='prelude-val'>None</span>));
<span class='kw'>return</span> <span class='prelude-val'>Err</span>(<span class='ident'>RustyError</span>::<span class='ident'>with_type</span>(<span class='ident'>RustyErrorTypes</span>::<span class='ident'>DuplicateShareNum</span>(<span class='ident'>share_index</span>)));
};
<span class='kw'>if</span> <span class='ident'>shares</span>.<span class='ident'>iter</span>().<span class='ident'>any</span>(<span class='op'>|</span><span class='ident'>s</span><span class='op'>|</span> <span class='ident'>s</span>.<span class='number'>1</span> <span class='op'>==</span> <span class='ident'>share_data</span>) {
<span class='kw'>return</span> <span class='prelude-val'>Err</span>(<span class='ident'>other_io_err</span>(<span class='string'>&quot;Duplicate Share Data&quot;</span>, <span class='prelude-val'>None</span>));
<span class='kw'>return</span> <span class='prelude-val'>Err</span>(<span class='ident'>RustyError</span>::<span class='ident'>with_type</span>(<span class='ident'>RustyErrorTypes</span>::<span class='ident'>DuplicateShareData</span>(<span class='ident'>share_index</span>)));
};
<span class='ident'>shares</span>.<span class='ident'>push</span>((<span class='ident'>n</span>, <span class='ident'>share_data</span>));
<span class='kw'>if</span> <span class='ident'>counter</span> <span class='op'>+</span> <span class='number'>1</span> <span class='op'>==</span> <span class='ident'>k</span> <span class='kw'>as</span> <span class='ident'>usize</span> {
<span class='kw'>return</span> <span class='prelude-val'>Ok</span>((<span class='ident'>k</span>, <span class='ident'>shares</span>));
}
<span class='comment'>// Validate k</span>
<span class='kw'>let</span> <span class='ident'>k_sets</span> <span class='op'>=</span> <span class='ident'>k_compatibility_sets</span>.<span class='ident'>keys</span>().<span class='ident'>count</span>();
<span class='kw'>let</span> <span class='ident'>rh_sets</span> <span class='op'>=</span> <span class='ident'>rh_compatibility_sets</span>.<span class='ident'>keys</span>().<span class='ident'>count</span>();
<span class='kw'>if</span> <span class='ident'>verify_signatures</span> {
<span class='kw'>match</span> <span class='ident'>rh_sets</span> {
<span class='number'>0</span> <span class='op'>=&gt;</span> {
<span class='kw'>return</span> <span class='prelude-val'>Err</span>(<span class='ident'>RustyError</span>::<span class='ident'>with_type</span>(<span class='ident'>RustyErrorTypes</span>::<span class='ident'>EmptyShares</span>))
}
<span class='number'>1</span> <span class='op'>=&gt;</span> { } <span class='comment'>// All shares have the same roothash.</span>
_ <span class='op'>=&gt;</span> {
<span class='kw'>return</span> <span class='prelude-val'>Err</span>(<span class='ident'>RustyError</span>::<span class='ident'>with_type</span>(<span class='ident'>RustyErrorTypes</span>::<span class='ident'>IncompatibleSets</span>(<span class='ident'>rh_compatibility_sets</span>.<span class='ident'>values</span>()
.<span class='ident'>map</span>(<span class='op'>|</span><span class='ident'>x</span><span class='op'>|</span> <span class='ident'>x</span>.<span class='ident'>to_owned</span>()).<span class='ident'>collect</span>())))
}
}
}
<span class='prelude-val'>Err</span>(<span class='ident'>other_io_err</span>(<span class='string'>&quot;Not enough shares provided!&quot;</span>, <span class='prelude-val'>None</span>))
<span class='kw'>match</span> <span class='ident'>k_sets</span> {
<span class='number'>0</span> <span class='op'>=&gt;</span> {
<span class='kw'>return</span> <span class='prelude-val'>Err</span>(<span class='ident'>RustyError</span>::<span class='ident'>with_type</span>(<span class='ident'>RustyErrorTypes</span>::<span class='ident'>EmptyShares</span>))
}
<span class='number'>1</span> <span class='op'>=&gt;</span> { } <span class='comment'>// All shares have the same roothash.</span>
_ <span class='op'>=&gt;</span> {
<span class='kw'>return</span> <span class='prelude-val'>Err</span>(<span class='ident'>RustyError</span>::<span class='ident'>with_type</span>(<span class='ident'>RustyErrorTypes</span>::<span class='ident'>IncompatibleSets</span>(<span class='ident'>k_compatibility_sets</span>.<span class='ident'>values</span>()
.<span class='ident'>map</span>(<span class='op'>|</span><span class='ident'>x</span><span class='op'>|</span> <span class='ident'>x</span>.<span class='ident'>to_owned</span>()).<span class='ident'>collect</span>())))
}
}
<span class='comment'>// It is safe to unwrap because k_sets == 1</span>
<span class='kw'>let</span> <span class='ident'>k</span> <span class='op'>=</span> <span class='op'>*</span><span class='ident'>k_compatibility_sets</span>.<span class='ident'>keys</span>().<span class='ident'>last</span>().<span class='ident'>unwrap</span>();
<span class='kw'>let</span> <span class='ident'>shares_num</span> <span class='op'>=</span> <span class='ident'>shares</span>.<span class='ident'>len</span>();
<span class='kw'>if</span> <span class='ident'>shares_num</span> <span class='op'>&gt;=</span> <span class='ident'>k</span> <span class='kw'>as</span> <span class='ident'>usize</span> {
<span class='ident'>shares</span>.<span class='ident'>truncate</span>(<span class='ident'>k</span> <span class='kw'>as</span> <span class='ident'>usize</span>);
<span class='prelude-val'>Ok</span>((<span class='ident'>k</span>, <span class='ident'>shares</span>))
} <span class='kw'>else</span> {
<span class='prelude-val'>Err</span>(<span class='ident'>RustyError</span>::<span class='ident'>with_type</span>(<span class='ident'>RustyErrorTypes</span>::<span class='ident'>MissingShares</span>(<span class='ident'>k</span>, <span class='ident'>shares_num</span>)))
}
}
</pre>
</section>
@ -238,11 +318,9 @@
<script>
window.rootPath = "../../../";
window.currentCrate = "rusty_secrets";
window.playgroundUrl = "";
</script>
<script src="../../../jquery.js"></script>
<script src="../../../main.js"></script>
<script defer src="../../../search-index.js"></script>
</body>
</html>

View File

@ -0,0 +1,230 @@
<!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="Source to the Rust file `src/wrapped_secrets.rs`.">
<meta name="keywords" content="rust, rustlang, rust-lang">
<title>wrapped_secrets.rs.html -- source</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">
</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 source"><pre class="line-numbers"><span id="1"> 1</span>
<span id="2"> 2</span>
<span id="3"> 3</span>
<span id="4"> 4</span>
<span id="5"> 5</span>
<span id="6"> 6</span>
<span id="7"> 7</span>
<span id="8"> 8</span>
<span id="9"> 9</span>
<span id="10">10</span>
<span id="11">11</span>
<span id="12">12</span>
<span id="13">13</span>
<span id="14">14</span>
<span id="15">15</span>
<span id="16">16</span>
<span id="17">17</span>
<span id="18">18</span>
<span id="19">19</span>
<span id="20">20</span>
<span id="21">21</span>
<span id="22">22</span>
<span id="23">23</span>
<span id="24">24</span>
<span id="25">25</span>
<span id="26">26</span>
<span id="27">27</span>
<span id="28">28</span>
<span id="29">29</span>
<span id="30">30</span>
<span id="31">31</span>
<span id="32">32</span>
<span id="33">33</span>
<span id="34">34</span>
<span id="35">35</span>
<span id="36">36</span>
<span id="37">37</span>
<span id="38">38</span>
<span id="39">39</span>
<span id="40">40</span>
<span id="41">41</span>
<span id="42">42</span>
<span id="43">43</span>
<span id="44">44</span>
<span id="45">45</span>
<span id="46">46</span>
<span id="47">47</span>
<span id="48">48</span>
<span id="49">49</span>
<span id="50">50</span>
<span id="51">51</span>
<span id="52">52</span>
<span id="53">53</span>
<span id="54">54</span>
<span id="55">55</span>
<span id="56">56</span>
<span id="57">57</span>
<span id="58">58</span>
<span id="59">59</span>
<span id="60">60</span>
<span id="61">61</span>
</pre><pre class='rust '>
<span class='doccomment'>//! (Beta) `wrapped_secrets` provides Shamir&#39;s secret sharing with a wrapped secret. It currently offers versioning and MIME information about the data.</span>
<span class='kw'>use</span> <span class='ident'>custom_error</span>::{<span class='ident'>RustyError</span>, <span class='ident'>RustyErrorTypes</span>};
<span class='kw'>use</span> <span class='ident'>protobuf</span>;
<span class='kw'>use</span> <span class='ident'>protobuf</span>::<span class='ident'>Message</span>;
<span class='kw'>use</span> <span class='ident'>secret</span>::{<span class='ident'>RustySecret</span>, <span class='ident'>RustySecretsVersions</span>};
<span class='kw'>use</span> <span class='ident'>sss</span>;
<span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>io</span>;
<span class='doccomment'>/// Performs threshold k-out-of-n Shamir&#39;s secret sharing.</span>
<span class='doccomment'>///</span>
<span class='doccomment'>/// # Examples</span>
<span class='doccomment'>///</span>
<span class='doccomment'>/// ```</span>
<span class='doccomment'>/// use rusty_secrets::wrapped_secrets::generate_shares;</span>
<span class='doccomment'>/// let secret = &quot;These programs were never about terrorism: theyre about economic spying,</span>
<span class='doccomment'>/// social control, and diplomatic manipulation. Theyre about power.&quot;.to_string();</span>
<span class='doccomment'>///</span>
<span class='doccomment'>/// match generate_shares(7, 10, &amp;secret.into_bytes(), &quot;text/html&quot;, true){</span>
<span class='doccomment'>/// Ok(shares) =&gt; {</span>
<span class='doccomment'>/// // Do something with the shares</span>
<span class='doccomment'>/// },</span>
<span class='doccomment'>/// Err(_) =&gt; {}// Deal with error}</span>
<span class='doccomment'>/// }</span>
<span class='doccomment'>/// ```</span>
<span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>generate_shares</span>(<span class='ident'>k</span>: <span class='ident'>u8</span>, <span class='ident'>n</span>: <span class='ident'>u8</span>, <span class='ident'>secret</span>: <span class='kw-2'>&amp;</span>[<span class='ident'>u8</span>], <span class='ident'>mime_type</span>: <span class='kw-2'>&amp;</span><span class='ident'>str</span>, <span class='ident'>sign_shares</span>: <span class='ident'>bool</span>) <span class='op'>-&gt;</span> <span class='ident'>io</span>::<span class='prelude-ty'>Result</span><span class='op'>&lt;</span><span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>String</span><span class='op'>&gt;&gt;</span> {
<span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>rusty_secret</span> <span class='op'>=</span> <span class='ident'>RustySecret</span>::<span class='ident'>new</span>();
<span class='ident'>rusty_secret</span>.<span class='ident'>set_version</span>(<span class='ident'>RustySecretsVersions</span>::<span class='ident'>INITIAL_RELEASE</span>);
<span class='ident'>rusty_secret</span>.<span class='ident'>set_mime_type</span>(<span class='ident'>mime_type</span>.<span class='ident'>to_owned</span>());
<span class='ident'>rusty_secret</span>.<span class='ident'>set_secret</span>(<span class='ident'>secret</span>.<span class='ident'>to_owned</span>());
<span class='ident'>sss</span>::<span class='ident'>generate_shares</span>(<span class='ident'>k</span>, <span class='ident'>n</span>, <span class='ident'>rusty_secret</span>.<span class='ident'>write_to_bytes</span>().<span class='ident'>unwrap</span>().<span class='ident'>as_slice</span>(), <span class='ident'>sign_shares</span>)
}
<span class='doccomment'>/// Recovers the secret from a k-out-of-n Shamir&#39;s secret sharing.</span>
<span class='doccomment'>///</span>
<span class='doccomment'>/// At least `k` distinct shares need to be provided to recover the share.</span>
<span class='doccomment'>///</span>
<span class='doccomment'>/// # Examples</span>
<span class='doccomment'>///</span>
<span class='doccomment'>/// ```</span>
<span class='doccomment'>/// use rusty_secrets::wrapped_secrets::recover_secret;</span>
<span class='doccomment'>/// let share1 = &quot;2-1-Cha7s14Q/mSwWko0ittr+/Uf79RHQMIP&quot;.to_string();</span>
<span class='doccomment'>/// let share2 = &quot;2-4-ChaydsUJDypD9ZWxwvIICh/cmZvzusOF&quot;.to_string();</span>
<span class='doccomment'>/// let shares = vec![share1, share2];</span>
<span class='doccomment'>///</span>
<span class='doccomment'>/// match recover_secret(shares, false) {</span>
<span class='doccomment'>/// Ok(secret) =&gt; {</span>
<span class='doccomment'>/// // Do something with the secret</span>
<span class='doccomment'>/// },</span>
<span class='doccomment'>/// Err(e) =&gt; {</span>
<span class='doccomment'>/// // Deal with the error</span>
<span class='doccomment'>/// }</span>
<span class='doccomment'>/// }</span>
<span class='doccomment'>/// ```</span>
<span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>recover_secret</span>(<span class='ident'>shares</span>: <span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>String</span><span class='op'>&gt;</span>, <span class='ident'>verify_signatures</span>: <span class='ident'>bool</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Result</span><span class='op'>&lt;</span><span class='ident'>RustySecret</span>, <span class='ident'>RustyError</span><span class='op'>&gt;</span> {
<span class='kw'>let</span> <span class='ident'>secret</span> <span class='op'>=</span> <span class='macro'>try</span><span class='macro'>!</span>(<span class='ident'>sss</span>::<span class='ident'>recover_secret</span>(<span class='ident'>shares</span>, <span class='ident'>verify_signatures</span>));
<span class='ident'>protobuf</span>::<span class='ident'>parse_from_bytes</span>::<span class='op'>&lt;</span><span class='ident'>RustySecret</span><span class='op'>&gt;</span>(<span class='ident'>secret</span>.<span class='ident'>as_slice</span>())
.<span class='ident'>map_err</span>(<span class='op'>|</span>_<span class='op'>|</span> <span class='ident'>RustyError</span>::<span class='ident'>with_type</span>(<span class='ident'>RustyErrorTypes</span>::<span class='ident'>SecretDeserializationIssue</span>))
}
</pre>
</section>
<section id='search' class="content hidden"></section>
<section class="footer"></section>
<aside id="help" class="hidden">
<div>
<h1 class="hidden">Help</h1>
<div class="shortcuts">
<h2>Keyboard Shortcuts</h2>
<dl>
<dt>?</dt>
<dd>Show this help dialog</dd>
<dt>S</dt>
<dd>Focus the search field</dd>
<dt>&larrb;</dt>
<dd>Move up in search results</dd>
<dt>&rarrb;</dt>
<dd>Move down in search results</dd>
<dt>&#9166;</dt>
<dd>Go to active search result</dd>
<dt>+</dt>
<dd>Collapse/expand all sections</dd>
</dl>
</div>
<div class="infos">
<h2>Search Tricks</h2>
<p>
Prefix searches with a type followed by a colon (e.g.
<code>fn:</code>) to restrict the search to a given type.
</p>
<p>
Accepted types are: <code>fn</code>, <code>mod</code>,
<code>struct</code>, <code>enum</code>,
<code>trait</code>, <code>type</code>, <code>macro</code>,
and <code>const</code>.
</p>
<p>
Search functions by type signature (e.g.
<code>vec -> usize</code> or <code>* -> vec</code>)
</p>
</div>
</div>
</aside>
<script>
window.rootPath = "../../../";
window.currentCrate = "rusty_secrets";
</script>
<script src="../../../jquery.js"></script>
<script src="../../../main.js"></script>
<script defer src="../../../search-index.js"></script>
</body>
</html>

11
protobuf/Secret.proto Normal file
View File

@ -0,0 +1,11 @@
syntax = "proto3";
enum RustySecretsVersions {
INITIAL_RELEASE = 0;
}
message RustySecret {
RustySecretsVersions version = 1;
bytes secret = 2;
string mime_type = 3;
}

View File

@ -1,5 +1,4 @@
use std::convert;
use std::error;
use std::error::Error;
use std::fmt;
use std::io;
@ -10,10 +9,11 @@ use std::num;
pub struct RustyError {
descr: &'static str,
detail: Option<String>,
share_num: Option<u8>,
share_index: Option<u8>,
share_groups: Option<Vec<Vec<u8>>>
}
#[derive(Debug)]
pub enum RustyErrorTypes {
DuplicateShareNum(u8),
DuplicateShareData(u8),
@ -22,33 +22,38 @@ pub enum RustyErrorTypes {
InvalidSignature(u8, String),
MissingShares(u8, usize),
MissingSignature(u8),
SecretDeserializationIssue,
ShareParsingError(u8, String)
}
impl RustyError {
/// Initializes a new error with a description and optional detail string.
fn new(descr: &'static str, detail: Option<String>, share_num: Option<u8>, share_groups: Option<Vec<Vec<u8>>>) -> RustyError {
fn new(descr: &'static str, detail: Option<String>, share_index: Option<u8>, share_groups: Option<Vec<Vec<u8>>>) -> RustyError {
RustyError {
descr: descr,
detail: detail,
share_num: share_num,
share_index: share_index,
share_groups: share_groups
}
}
/// Returns a `RustyError` with a given `RustyErrorType`.
pub fn with_type(error_type: RustyErrorTypes) -> RustyError {
RustyError {
descr: RustyError::descr_for_type(&error_type),
detail: RustyError::detail_for_type(&error_type),
share_num: RustyError::share_num_for_type(&error_type),
share_index: RustyError::share_num_for_type(&error_type),
share_groups: RustyError::share_groups_for_type(error_type),
}
}
pub fn share_num(&self) -> Option<u8> {
self.share_num
/// Returns the index of the share that raised the error, if any.
pub fn share_index(&self) -> Option<u8> {
self.share_index
}
/// Returns the group of shares that were generated during the same secret share.
/// It can be used to provide a debug message to the user telling him what shares are incompatible.
pub fn share_groups(&self) -> Option<Vec<Vec<u8>>> {
self.share_groups.clone()
}
@ -60,6 +65,8 @@ impl RustyError {
RustyErrorTypes::InvalidSignature(_, _) => "The signature of this share is not valid.",
RustyErrorTypes::MissingShares(_, _) => "The number of shares provided is insufficient to recover the secret.",
RustyErrorTypes::MissingSignature(_) => "Signature is missing while shares are required to be signed.",
RustyErrorTypes::SecretDeserializationIssue => "An issue was encountered deserializing the secret.
Updating to the latest version of RustySecrets might help fix this.",
RustyErrorTypes::ShareParsingError(_, _) => "This share is incorrectly formatted.",
RustyErrorTypes::DuplicateShareNum(_) => "This share number has already been used by a previous share.",
RustyErrorTypes::DuplicateShareData(_) => "The data encoded in this share is the same as the one found in a previous share."
@ -103,11 +110,11 @@ impl fmt::Display for RustyError {
}
}
impl error::Error for RustyError {
impl Error for RustyError {
fn description(&self) -> &str {
self.descr
}
fn cause(&self) -> Option<&error::Error> {
fn cause(&self) -> Option<&Error> {
None
}
}

View File

@ -1,12 +1,12 @@
// #![deny(
// missing_docs,
// missing_debug_implementations, missing_copy_implementations,
// trivial_casts, trivial_numeric_casts,
// unsafe_code, unstable_features,
// unused_import_braces, unused_qualifications
// )]
//! `RustySecrets` implements Shamir's secret sharing in Rust. It provides the possibility to sign shares.
//! `RustySecrets` implements Shamir Secret Sharing in Rust. It provides the possibility to sign shares.
#![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 protobuf;
extern crate rustc_serialize as serialize;
@ -21,14 +21,17 @@ static digest: &'static Algorithm = &SHA512;
mod custom_error;
mod gf256;
mod interpolation;
#[allow(unused_qualifications)]
mod secret;
#[allow(unused_qualifications)]
mod share_data;
mod share_format;
mod sss;
mod validation;
pub use sss::generate_shares;
pub use sss::recover_secret;
pub use custom_error::RustyError;
pub mod sss;
pub mod wrapped_secrets;
#[cfg(test)]
mod tests;

391
src/secret.rs Normal file
View File

@ -0,0 +1,391 @@
// This file is generated. Do not edit
// @generated
// https://github.com/Manishearth/rust-clippy/issues/702
#![allow(unknown_lints)]
#![allow(clippy)]
#![cfg_attr(rustfmt, rustfmt_skip)]
#![allow(box_pointers)]
#![allow(dead_code)]
#![allow(non_camel_case_types)]
#![allow(non_snake_case)]
#![allow(non_upper_case_globals)]
#![allow(trivial_casts)]
#![allow(unsafe_code)]
#![allow(unused_imports)]
#![allow(unused_results)]
use protobuf::Message as Message_imported_for_functions;
use protobuf::ProtobufEnum as ProtobufEnum_imported_for_functions;
#[derive(Clone,Default)]
pub struct RustySecret {
// message fields
version: ::std::option::Option<RustySecretsVersions>,
secret: ::protobuf::SingularField<::std::vec::Vec<u8>>,
mime_type: ::protobuf::SingularField<::std::string::String>,
// special fields
unknown_fields: ::protobuf::UnknownFields,
cached_size: ::std::cell::Cell<u32>,
}
// see codegen.rs for the explanation why impl Sync explicitly
unsafe impl ::std::marker::Sync for RustySecret {}
impl RustySecret {
pub fn new() -> RustySecret {
::std::default::Default::default()
}
pub fn default_instance() -> &'static RustySecret {
static mut instance: ::protobuf::lazy::Lazy<RustySecret> = ::protobuf::lazy::Lazy {
lock: ::protobuf::lazy::ONCE_INIT,
ptr: 0 as *const RustySecret,
};
unsafe {
instance.get(|| {
RustySecret {
version: ::std::option::Option::None,
secret: ::protobuf::SingularField::none(),
mime_type: ::protobuf::SingularField::none(),
unknown_fields: ::protobuf::UnknownFields::new(),
cached_size: ::std::cell::Cell::new(0),
}
})
}
}
// optional .RustySecretsVersions version = 1;
pub fn clear_version(&mut self) {
self.version = ::std::option::Option::None;
}
pub fn has_version(&self) -> bool {
self.version.is_some()
}
// Param is passed by value, moved
pub fn set_version(&mut self, v: RustySecretsVersions) {
self.version = ::std::option::Option::Some(v);
}
pub fn get_version(&self) -> RustySecretsVersions {
self.version.unwrap_or(RustySecretsVersions::INITIAL_RELEASE)
}
// optional bytes secret = 2;
pub fn clear_secret(&mut self) {
self.secret.clear();
}
pub fn has_secret(&self) -> bool {
self.secret.is_some()
}
// Param is passed by value, moved
pub fn set_secret(&mut self, v: ::std::vec::Vec<u8>) {
self.secret = ::protobuf::SingularField::some(v);
}
// Mutable pointer to the field.
// If field is not initialized, it is initialized with default value first.
pub fn mut_secret(&mut self) -> &mut ::std::vec::Vec<u8> {
if self.secret.is_none() {
self.secret.set_default();
};
self.secret.as_mut().unwrap()
}
// Take field
pub fn take_secret(&mut self) -> ::std::vec::Vec<u8> {
self.secret.take().unwrap_or_else(|| ::std::vec::Vec::new())
}
pub fn get_secret(&self) -> &[u8] {
match self.secret.as_ref() {
Some(v) => &v,
None => &[],
}
}
// optional string mime_type = 3;
pub fn clear_mime_type(&mut self) {
self.mime_type.clear();
}
pub fn has_mime_type(&self) -> bool {
self.mime_type.is_some()
}
// Param is passed by value, moved
pub fn set_mime_type(&mut self, v: ::std::string::String) {
self.mime_type = ::protobuf::SingularField::some(v);
}
// Mutable pointer to the field.
// If field is not initialized, it is initialized with default value first.
pub fn mut_mime_type(&mut self) -> &mut ::std::string::String {
if self.mime_type.is_none() {
self.mime_type.set_default();
};
self.mime_type.as_mut().unwrap()
}
// Take field
pub fn take_mime_type(&mut self) -> ::std::string::String {
self.mime_type.take().unwrap_or_else(|| ::std::string::String::new())
}
pub fn get_mime_type(&self) -> &str {
match self.mime_type.as_ref() {
Some(v) => &v,
None => "",
}
}
}
impl ::protobuf::Message for RustySecret {
fn is_initialized(&self) -> bool {
true
}
fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream) -> ::protobuf::ProtobufResult<()> {
while !try!(is.eof()) {
let (field_number, wire_type) = try!(is.read_tag_unpack());
match field_number {
1 => {
if wire_type != ::protobuf::wire_format::WireTypeVarint {
return ::std::result::Result::Err(::protobuf::rt::unexpected_wire_type(wire_type));
};
let tmp = try!(is.read_enum());
self.version = ::std::option::Option::Some(tmp);
},
2 => {
try!(::protobuf::rt::read_singular_bytes_into(wire_type, is, &mut self.secret));
},
3 => {
try!(::protobuf::rt::read_singular_string_into(wire_type, is, &mut self.mime_type));
},
_ => {
try!(::protobuf::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields()));
},
};
}
::std::result::Result::Ok(())
}
// Compute sizes of nested messages
#[allow(unused_variables)]
fn compute_size(&self) -> u32 {
let mut my_size = 0;
for value in &self.version {
my_size += ::protobuf::rt::enum_size(1, *value);
};
for value in &self.secret {
my_size += ::protobuf::rt::bytes_size(2, &value);
};
for value in &self.mime_type {
my_size += ::protobuf::rt::string_size(3, &value);
};
my_size += ::protobuf::rt::unknown_fields_size(self.get_unknown_fields());
self.cached_size.set(my_size);
my_size
}
fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream) -> ::protobuf::ProtobufResult<()> {
if let Some(v) = self.version {
try!(os.write_enum(1, v.value()));
};
if let Some(v) = self.secret.as_ref() {
try!(os.write_bytes(2, &v));
};
if let Some(v) = self.mime_type.as_ref() {
try!(os.write_string(3, &v));
};
try!(os.write_unknown_fields(self.get_unknown_fields()));
::std::result::Result::Ok(())
}
fn get_cached_size(&self) -> u32 {
self.cached_size.get()
}
fn get_unknown_fields(&self) -> &::protobuf::UnknownFields {
&self.unknown_fields
}
fn mut_unknown_fields(&mut self) -> &mut ::protobuf::UnknownFields {
&mut self.unknown_fields
}
fn type_id(&self) -> ::std::any::TypeId {
::std::any::TypeId::of::<RustySecret>()
}
fn as_any(&self) -> &::std::any::Any {
self as &::std::any::Any
}
fn descriptor(&self) -> &'static ::protobuf::reflect::MessageDescriptor {
::protobuf::MessageStatic::descriptor_static(None::<Self>)
}
}
impl ::protobuf::MessageStatic for RustySecret {
fn new() -> RustySecret {
RustySecret::new()
}
fn descriptor_static(_: ::std::option::Option<RustySecret>) -> &'static ::protobuf::reflect::MessageDescriptor {
static mut descriptor: ::protobuf::lazy::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::lazy::Lazy {
lock: ::protobuf::lazy::ONCE_INIT,
ptr: 0 as *const ::protobuf::reflect::MessageDescriptor,
};
unsafe {
descriptor.get(|| {
let mut fields = ::std::vec::Vec::new();
fields.push(::protobuf::reflect::accessor::make_singular_enum_accessor(
"version",
RustySecret::has_version,
RustySecret::get_version,
));
fields.push(::protobuf::reflect::accessor::make_singular_bytes_accessor(
"secret",
RustySecret::has_secret,
RustySecret::get_secret,
));
fields.push(::protobuf::reflect::accessor::make_singular_string_accessor(
"mime_type",
RustySecret::has_mime_type,
RustySecret::get_mime_type,
));
::protobuf::reflect::MessageDescriptor::new::<RustySecret>(
"RustySecret",
fields,
file_descriptor_proto()
)
})
}
}
}
impl ::protobuf::Clear for RustySecret {
fn clear(&mut self) {
self.clear_version();
self.clear_secret();
self.clear_mime_type();
self.unknown_fields.clear();
}
}
impl ::std::cmp::PartialEq for RustySecret {
fn eq(&self, other: &RustySecret) -> bool {
self.version == other.version &&
self.secret == other.secret &&
self.mime_type == other.mime_type &&
self.unknown_fields == other.unknown_fields
}
}
impl ::std::fmt::Debug for RustySecret {
fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
::protobuf::text_format::fmt(self, f)
}
}
#[derive(Clone,PartialEq,Eq,Debug,Hash)]
pub enum RustySecretsVersions {
INITIAL_RELEASE = 0,
}
impl ::protobuf::ProtobufEnum for RustySecretsVersions {
fn value(&self) -> i32 {
*self as i32
}
fn from_i32(value: i32) -> ::std::option::Option<RustySecretsVersions> {
match value {
0 => ::std::option::Option::Some(RustySecretsVersions::INITIAL_RELEASE),
_ => ::std::option::Option::None
}
}
fn values() -> &'static [Self] {
static values: &'static [RustySecretsVersions] = &[
RustySecretsVersions::INITIAL_RELEASE,
];
values
}
fn enum_descriptor_static(_: Option<RustySecretsVersions>) -> &'static ::protobuf::reflect::EnumDescriptor {
static mut descriptor: ::protobuf::lazy::Lazy<::protobuf::reflect::EnumDescriptor> = ::protobuf::lazy::Lazy {
lock: ::protobuf::lazy::ONCE_INIT,
ptr: 0 as *const ::protobuf::reflect::EnumDescriptor,
};
unsafe {
descriptor.get(|| {
::protobuf::reflect::EnumDescriptor::new("RustySecretsVersions", file_descriptor_proto())
})
}
}
}
impl ::std::marker::Copy for RustySecretsVersions {
}
static file_descriptor_proto_data: &'static [u8] = &[
0x0a, 0x0c, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x73,
0x0a, 0x0b, 0x52, 0x75, 0x73, 0x74, 0x79, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x12, 0x2f, 0x0a,
0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15,
0x2e, 0x52, 0x75, 0x73, 0x74, 0x79, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x56, 0x65, 0x72,
0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x16,
0x0a, 0x06, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06,
0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x69, 0x6d, 0x65, 0x5f, 0x74,
0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6d, 0x69, 0x6d, 0x65, 0x54,
0x79, 0x70, 0x65, 0x2a, 0x2b, 0x0a, 0x14, 0x52, 0x75, 0x73, 0x74, 0x79, 0x53, 0x65, 0x63, 0x72,
0x65, 0x74, 0x73, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x13, 0x0a, 0x0f, 0x49,
0x4e, 0x49, 0x54, 0x49, 0x41, 0x4c, 0x5f, 0x52, 0x45, 0x4c, 0x45, 0x41, 0x53, 0x45, 0x10, 0x00,
0x4a, 0xbd, 0x02, 0x0a, 0x06, 0x12, 0x04, 0x00, 0x00, 0x0a, 0x01, 0x0a, 0x08, 0x0a, 0x01, 0x0c,
0x12, 0x03, 0x00, 0x00, 0x12, 0x0a, 0x0a, 0x0a, 0x02, 0x05, 0x00, 0x12, 0x04, 0x02, 0x00, 0x04,
0x01, 0x0a, 0x0a, 0x0a, 0x03, 0x05, 0x00, 0x01, 0x12, 0x03, 0x02, 0x05, 0x19, 0x0a, 0x0b, 0x0a,
0x04, 0x05, 0x00, 0x02, 0x00, 0x12, 0x03, 0x03, 0x08, 0x1c, 0x0a, 0x0c, 0x0a, 0x05, 0x05, 0x00,
0x02, 0x00, 0x01, 0x12, 0x03, 0x03, 0x08, 0x17, 0x0a, 0x0c, 0x0a, 0x05, 0x05, 0x00, 0x02, 0x00,
0x02, 0x12, 0x03, 0x03, 0x1a, 0x1b, 0x0a, 0x0a, 0x0a, 0x02, 0x04, 0x00, 0x12, 0x04, 0x06, 0x00,
0x0a, 0x01, 0x0a, 0x0a, 0x0a, 0x03, 0x04, 0x00, 0x01, 0x12, 0x03, 0x06, 0x08, 0x13, 0x0a, 0x0b,
0x0a, 0x04, 0x04, 0x00, 0x02, 0x00, 0x12, 0x03, 0x07, 0x08, 0x29, 0x0a, 0x0d, 0x0a, 0x05, 0x04,
0x00, 0x02, 0x00, 0x04, 0x12, 0x04, 0x07, 0x08, 0x06, 0x15, 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x00,
0x02, 0x00, 0x06, 0x12, 0x03, 0x07, 0x08, 0x1c, 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x00, 0x02, 0x00,
0x01, 0x12, 0x03, 0x07, 0x1d, 0x24, 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x00, 0x02, 0x00, 0x03, 0x12,
0x03, 0x07, 0x27, 0x28, 0x0a, 0x0b, 0x0a, 0x04, 0x04, 0x00, 0x02, 0x01, 0x12, 0x03, 0x08, 0x08,
0x19, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x00, 0x02, 0x01, 0x04, 0x12, 0x04, 0x08, 0x08, 0x07, 0x29,
0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x00, 0x02, 0x01, 0x05, 0x12, 0x03, 0x08, 0x08, 0x0d, 0x0a, 0x0c,
0x0a, 0x05, 0x04, 0x00, 0x02, 0x01, 0x01, 0x12, 0x03, 0x08, 0x0e, 0x14, 0x0a, 0x0c, 0x0a, 0x05,
0x04, 0x00, 0x02, 0x01, 0x03, 0x12, 0x03, 0x08, 0x17, 0x18, 0x0a, 0x0b, 0x0a, 0x04, 0x04, 0x00,
0x02, 0x02, 0x12, 0x03, 0x09, 0x08, 0x1d, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x00, 0x02, 0x02, 0x04,
0x12, 0x04, 0x09, 0x08, 0x08, 0x19, 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x00, 0x02, 0x02, 0x05, 0x12,
0x03, 0x09, 0x08, 0x0e, 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x00, 0x02, 0x02, 0x01, 0x12, 0x03, 0x09,
0x0f, 0x18, 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x00, 0x02, 0x02, 0x03, 0x12, 0x03, 0x09, 0x1b, 0x1c,
0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
];
static mut file_descriptor_proto_lazy: ::protobuf::lazy::Lazy<::protobuf::descriptor::FileDescriptorProto> = ::protobuf::lazy::Lazy {
lock: ::protobuf::lazy::ONCE_INIT,
ptr: 0 as *const ::protobuf::descriptor::FileDescriptorProto,
};
fn parse_descriptor_proto() -> ::protobuf::descriptor::FileDescriptorProto {
::protobuf::parse_from_bytes(file_descriptor_proto_data).unwrap()
}
pub fn file_descriptor_proto() -> &'static ::protobuf::descriptor::FileDescriptorProto {
unsafe {
file_descriptor_proto_lazy.get(|| {
parse_descriptor_proto()
})
}
}

View File

@ -1,3 +1,5 @@
//! SSS provides Shamir's secret sharing with raw data.
use custom_error::{RustyError, other_io_err};
use digest;
use interpolation::{encode, lagrange_interpolate};
@ -13,12 +15,12 @@ fn new_vec<T: Clone>(n: usize, x: T) -> Vec<T> {
repeat(x).take(n).collect()
}
/// Performs threshold k-out-of-n Shamir secret sharing.
/// Performs threshold k-out-of-n Shamir's secret sharing.
///
/// # Examples
///
/// ```
/// use rusty_secrets::generate_shares;
/// use rusty_secrets::sss::generate_shares;
/// let secret = "These programs were never about terrorism: theyre about economic spying,
/// social control, and diplomatic manipulation. Theyre about power.".to_string();
///
@ -34,7 +36,7 @@ pub fn generate_shares(k: u8, n: u8, secret: &[u8], sign_shares: bool) -> io::Re
return Err(other_io_err("Threshold K can not be larger than N", None, None, None));
}
let shares = try!(secret_share(&*secret, k, n));
let shares = try!(secret_share(secret, k, n));
let signatures = if sign_shares {
let shares_to_sign = shares.iter()
@ -66,7 +68,7 @@ pub fn generate_shares(k: u8, n: u8, secret: &[u8], sign_shares: bool) -> io::Re
Ok(result)
}
pub fn secret_share(src: &[u8], k: u8, n: u8) -> Result<Vec<Vec<u8>>, RustyError> {
fn secret_share(src: &[u8], k: u8, n: u8) -> Result<Vec<Vec<u8>>, RustyError> {
let mut result = Vec::with_capacity(n as usize);
for _ in 0..(n as usize) {
result.push(new_vec(src.len(), 0u8));
@ -87,14 +89,14 @@ pub fn secret_share(src: &[u8], k: u8, n: u8) -> Result<Vec<Vec<u8>>, RustyError
}
/// Recovers the secret from a k-out-of-n Shamir secret sharing.
/// Recovers the secret from a k-out-of-n Shamir's secret sharing.
///
/// At least `k` distinct shares need to be provided to recover the share.
///
/// # Examples
///
/// ```
/// use rusty_secrets::recover_secret;
/// use rusty_secrets::sss::recover_secret;
/// let share1 = "2-1-Cha7s14Q/mSwWko0ittr+/Uf79RHQMIP".to_string();
/// let share2 = "2-4-ChaydsUJDypD9ZWxwvIICh/cmZvzusOF".to_string();
/// let shares = vec![share1, share2];

61
src/wrapped_secrets.rs Normal file
View File

@ -0,0 +1,61 @@
//! (Beta) `wrapped_secrets` provides Shamir's secret sharing with a wrapped secret. It currently offers versioning and MIME information about the data.
use custom_error::{RustyError, RustyErrorTypes};
use protobuf;
use protobuf::Message;
use secret::{RustySecret, RustySecretsVersions};
use sss;
use std::io;
/// Performs threshold k-out-of-n Shamir's secret sharing.
///
/// # Examples
///
/// ```
/// use rusty_secrets::wrapped_secrets::generate_shares;
/// let secret = "These programs were never about terrorism: theyre about economic spying,
/// social control, and diplomatic manipulation. Theyre about power.".to_string();
///
/// match generate_shares(7, 10, &secret.into_bytes(), "text/html", true){
/// Ok(shares) => {
/// // Do something with the shares
/// },
/// Err(_) => {}// Deal with error}
/// }
/// ```
pub fn generate_shares(k: u8, n: u8, secret: &[u8], mime_type: &str, sign_shares: bool) -> io::Result<Vec<String>> {
let mut rusty_secret = RustySecret::new();
rusty_secret.set_version(RustySecretsVersions::INITIAL_RELEASE);
rusty_secret.set_mime_type(mime_type.to_owned());
rusty_secret.set_secret(secret.to_owned());
sss::generate_shares(k, n, rusty_secret.write_to_bytes().unwrap().as_slice(), sign_shares)
}
/// Recovers the secret from a k-out-of-n Shamir's secret sharing.
///
/// At least `k` distinct shares need to be provided to recover the share.
///
/// # Examples
///
/// ```
/// use rusty_secrets::wrapped_secrets::recover_secret;
/// let share1 = "2-1-Cha7s14Q/mSwWko0ittr+/Uf79RHQMIP".to_string();
/// let share2 = "2-4-ChaydsUJDypD9ZWxwvIICh/cmZvzusOF".to_string();
/// let shares = vec![share1, share2];
///
/// match recover_secret(shares, false) {
/// Ok(secret) => {
/// // Do something with the secret
/// },
/// Err(e) => {
/// // Deal with the error
/// }
/// }
/// ```
pub fn recover_secret(shares: Vec<String>, verify_signatures: bool) -> Result<RustySecret, RustyError> {
let secret = try!(sss::recover_secret(shares, verify_signatures));
protobuf::parse_from_bytes::<RustySecret>(secret.as_slice())
.map_err(|_| RustyError::with_type(RustyErrorTypes::SecretDeserializationIssue))
}

View File

@ -1,6 +1,6 @@
extern crate rusty_secrets;
use rusty_secrets::generate_shares;
use rusty_secrets::sss::generate_shares;
#[test]
#[should_panic(expected = "Threshold K can not be larger than N")]

View File

@ -1,6 +1,6 @@
extern crate rusty_secrets;
use rusty_secrets::{generate_shares, recover_secret};
use rusty_secrets::*;
#[ignore]
#[test]
@ -13,12 +13,18 @@ fn test_reasonable_splits() {
across public lines."
.to_string()
.into_bytes();
let mime_type = "image/jpeg";
for is_signing in &[true, false] {
for k in 1..max_shares {
for n in k..max_shares {
let shares = generate_shares(k, n, &secret, *is_signing).unwrap();
let shares = wrapped_secrets::generate_shares(k, n, &secret, mime_type,*is_signing).unwrap();
println!("Testing {} out-of- {}", k, n);
assert_eq!(secret, recover_secret(shares, *is_signing).unwrap());
let s = wrapped_secrets::recover_secret(shares, *is_signing).unwrap();
assert_eq!(s.get_secret().to_owned(), secret);
assert_eq!(mime_type, s.get_mime_type());
}
}
}

View File

@ -1,6 +1,6 @@
extern crate rusty_secrets;
use rusty_secrets::recover_secret;
use rusty_secrets::sss::recover_secret;
#[test]
#[should_panic(expected = "No shares were provided.")]