<!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 `/home/travis/.cargo/registry/src/github.com-1ecc6299db9ec823/openssl-0.7.14/src/dh/mod.rs`."> <meta name="keywords" content="rust, rustlang, rust-lang"> <title>mod.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> </pre><pre class='rust '> <span class='kw'>use</span> <span class='ident'>ffi</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'>io</span>::<span class='ident'>prelude</span>::<span class='op'>*</span>; <span class='kw'>use</span> <span class='ident'>ssl</span>::<span class='ident'>error</span>::{<span class='ident'>SslError</span>, <span class='ident'>StreamError</span>}; <span class='kw'>use</span> <span class='ident'>bio</span>::<span class='ident'>MemBio</span>; <span class='kw'>use</span> <span class='ident'>bn</span>::<span class='ident'>BigNum</span>; <span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>mem</span>; <span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>ptr</span>; <span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>DH</span>(<span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>ffi</span>::<span class='ident'>DH</span>); <span class='kw'>impl</span> <span class='ident'>DH</span> { <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>from_params</span>(<span class='ident'>p</span>: <span class='ident'>BigNum</span>, <span class='ident'>g</span>: <span class='ident'>BigNum</span>, <span class='ident'>q</span>: <span class='ident'>BigNum</span>) <span class='op'>-></span> <span class='prelude-ty'>Result</span><span class='op'><</span><span class='ident'>DH</span>, <span class='ident'>SslError</span><span class='op'>></span> { <span class='kw'>let</span> <span class='ident'>dh</span> <span class='op'>=</span> <span class='macro'>try_ssl_null</span><span class='macro'>!</span>(<span class='kw'>unsafe</span> { <span class='ident'>ffi</span>::<span class='ident'>DH_new_from_params</span>(<span class='ident'>p</span>.<span class='ident'>raw</span>(), <span class='ident'>g</span>.<span class='ident'>raw</span>(), <span class='ident'>q</span>.<span class='ident'>raw</span>()) }); <span class='ident'>mem</span>::<span class='ident'>forget</span>(<span class='ident'>p</span>); <span class='ident'>mem</span>::<span class='ident'>forget</span>(<span class='ident'>g</span>); <span class='ident'>mem</span>::<span class='ident'>forget</span>(<span class='ident'>q</span>); <span class='prelude-val'>Ok</span>(<span class='ident'>DH</span>(<span class='ident'>dh</span>)) } <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>from_pem</span><span class='op'><</span><span class='ident'>R</span><span class='op'>></span>(<span class='ident'>reader</span>: <span class='kw-2'>&</span><span class='kw-2'>mut</span> <span class='ident'>R</span>) <span class='op'>-></span> <span class='prelude-ty'>Result</span><span class='op'><</span><span class='ident'>DH</span>, <span class='ident'>SslError</span><span class='op'>></span> <span class='kw'>where</span> <span class='ident'>R</span>: <span class='ident'>Read</span> { <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>mem_bio</span> <span class='op'>=</span> <span class='macro'>try</span><span class='macro'>!</span>(<span class='ident'>MemBio</span>::<span class='ident'>new</span>()); <span class='macro'>try</span><span class='macro'>!</span>(<span class='ident'>io</span>::<span class='ident'>copy</span>(<span class='ident'>reader</span>, <span class='kw-2'>&</span><span class='kw-2'>mut</span> <span class='ident'>mem_bio</span>).<span class='ident'>map_err</span>(<span class='ident'>StreamError</span>)); <span class='kw'>let</span> <span class='ident'>dh</span> <span class='op'>=</span> <span class='kw'>unsafe</span> { <span class='ident'>ffi</span>::<span class='ident'>PEM_read_bio_DHparams</span>(<span class='ident'>mem_bio</span>.<span class='ident'>get_handle</span>(), <span class='ident'>ptr</span>::<span class='ident'>null_mut</span>(), <span class='prelude-val'>None</span>, <span class='ident'>ptr</span>::<span class='ident'>null_mut</span>()) }; <span class='macro'>try_ssl_null</span><span class='macro'>!</span>(<span class='ident'>dh</span>); <span class='prelude-val'>Ok</span>(<span class='ident'>DH</span>(<span class='ident'>dh</span>)) } <span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>feature</span> <span class='op'>=</span> <span class='string'>"rfc5114"</span>)]</span> <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>get_1024_160</span>() <span class='op'>-></span> <span class='prelude-ty'>Result</span><span class='op'><</span><span class='ident'>DH</span>, <span class='ident'>SslError</span><span class='op'>></span> { <span class='kw'>let</span> <span class='ident'>dh</span> <span class='op'>=</span> <span class='macro'>try_ssl_null</span><span class='macro'>!</span>(<span class='kw'>unsafe</span> { <span class='ident'>ffi</span>::<span class='ident'>DH_get_1024_160</span>() }); <span class='prelude-val'>Ok</span>(<span class='ident'>DH</span>(<span class='ident'>dh</span>)) } <span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>feature</span> <span class='op'>=</span> <span class='string'>"rfc5114"</span>)]</span> <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>get_2048_224</span>() <span class='op'>-></span> <span class='prelude-ty'>Result</span><span class='op'><</span><span class='ident'>DH</span>, <span class='ident'>SslError</span><span class='op'>></span> { <span class='kw'>let</span> <span class='ident'>dh</span> <span class='op'>=</span> <span class='macro'>try_ssl_null</span><span class='macro'>!</span>(<span class='kw'>unsafe</span> { <span class='ident'>ffi</span>::<span class='ident'>DH_get_2048_224</span>() }); <span class='prelude-val'>Ok</span>(<span class='ident'>DH</span>(<span class='ident'>dh</span>)) } <span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>feature</span> <span class='op'>=</span> <span class='string'>"rfc5114"</span>)]</span> <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>get_2048_256</span>() <span class='op'>-></span> <span class='prelude-ty'>Result</span><span class='op'><</span><span class='ident'>DH</span>, <span class='ident'>SslError</span><span class='op'>></span> { <span class='kw'>let</span> <span class='ident'>dh</span> <span class='op'>=</span> <span class='macro'>try_ssl_null</span><span class='macro'>!</span>(<span class='kw'>unsafe</span> { <span class='ident'>ffi</span>::<span class='ident'>DH_get_2048_256</span>() }); <span class='prelude-val'>Ok</span>(<span class='ident'>DH</span>(<span class='ident'>dh</span>)) } <span class='kw'>pub</span> <span class='kw'>unsafe</span> <span class='kw'>fn</span> <span class='ident'>raw</span>(<span class='kw-2'>&</span><span class='self'>self</span>) <span class='op'>-></span> <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>ffi</span>::<span class='ident'>DH</span> { <span class='kw'>let</span> <span class='ident'>DH</span>(<span class='ident'>n</span>) <span class='op'>=</span> <span class='op'>*</span><span class='self'>self</span>; <span class='ident'>n</span> } <span class='kw'>pub</span> <span class='kw'>unsafe</span> <span class='kw'>fn</span> <span class='ident'>raw_ptr</span>(<span class='kw-2'>&</span><span class='self'>self</span>) <span class='op'>-></span> <span class='op'>*</span><span class='kw'>const</span> <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>ffi</span>::<span class='ident'>DH</span> { <span class='kw'>let</span> <span class='ident'>DH</span>(<span class='kw-2'>ref</span> <span class='ident'>n</span>) <span class='op'>=</span> <span class='op'>*</span><span class='self'>self</span>; <span class='ident'>n</span> } } <span class='kw'>impl</span> <span class='ident'>Drop</span> <span class='kw'>for</span> <span class='ident'>DH</span> { <span class='kw'>fn</span> <span class='ident'>drop</span>(<span class='kw-2'>&</span><span class='kw-2'>mut</span> <span class='self'>self</span>) { <span class='kw'>unsafe</span> { <span class='kw'>if</span> <span class='op'>!</span><span class='self'>self</span>.<span class='ident'>raw</span>().<span class='ident'>is_null</span>() { <span class='ident'>ffi</span>::<span class='ident'>DH_free</span>(<span class='self'>self</span>.<span class='ident'>raw</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> { <span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>fs</span>::<span class='ident'>File</span>; <span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>path</span>::<span class='ident'>Path</span>; <span class='kw'>use</span> <span class='kw'>super</span>::<span class='ident'>DH</span>; <span class='kw'>use</span> <span class='ident'>bn</span>::<span class='ident'>BigNum</span>; <span class='kw'>use</span> <span class='ident'>ssl</span>::<span class='ident'>SslContext</span>; <span class='kw'>use</span> <span class='ident'>ssl</span>::<span class='ident'>SslMethod</span>::<span class='ident'>Sslv23</span>; <span class='attribute'>#[<span class='ident'>test</span>]</span> <span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>feature</span> <span class='op'>=</span> <span class='string'>"rfc5114"</span>)]</span> <span class='kw'>fn</span> <span class='ident'>test_dh_rfc5114</span>() { <span class='kw'>let</span> <span class='ident'>ctx</span> <span class='op'>=</span> <span class='ident'>SslContext</span>::<span class='ident'>new</span>(<span class='ident'>Sslv23</span>).<span class='ident'>unwrap</span>(); <span class='kw'>let</span> <span class='ident'>dh1</span> <span class='op'>=</span> <span class='ident'>DH</span>::<span class='ident'>get_1024_160</span>().<span class='ident'>unwrap</span>(); <span class='ident'>ctx</span>.<span class='ident'>set_tmp_dh</span>(<span class='ident'>dh1</span>).<span class='ident'>unwrap</span>(); <span class='kw'>let</span> <span class='ident'>dh2</span> <span class='op'>=</span> <span class='ident'>DH</span>::<span class='ident'>get_2048_224</span>().<span class='ident'>unwrap</span>(); <span class='ident'>ctx</span>.<span class='ident'>set_tmp_dh</span>(<span class='ident'>dh2</span>).<span class='ident'>unwrap</span>(); <span class='kw'>let</span> <span class='ident'>dh3</span> <span class='op'>=</span> <span class='ident'>DH</span>::<span class='ident'>get_2048_256</span>().<span class='ident'>unwrap</span>(); <span class='ident'>ctx</span>.<span class='ident'>set_tmp_dh</span>(<span class='ident'>dh3</span>).<span class='ident'>unwrap</span>(); } <span class='attribute'>#[<span class='ident'>test</span>]</span> <span class='kw'>fn</span> <span class='ident'>test_dh</span>() { <span class='kw'>let</span> <span class='ident'>ctx</span> <span class='op'>=</span> <span class='ident'>SslContext</span>::<span class='ident'>new</span>(<span class='ident'>Sslv23</span>).<span class='ident'>unwrap</span>(); <span class='kw'>let</span> <span class='ident'>p</span> <span class='op'>=</span> <span class='ident'>BigNum</span>::<span class='ident'>from_hex_str</span>(<span class='string'>"87A8E61DB4B6663CFFBBD19C651959998CEEF608660DD0F25D2CEED4435\ E3B00E00DF8F1D61957D4FAF7DF4561B2AA3016C3D91134096FAA3BF429\ 6D830E9A7C209E0C6497517ABD5A8A9D306BCF67ED91F9E6725B4758C02\ 2E0B1EF4275BF7B6C5BFC11D45F9088B941F54EB1E59BB8BC39A0BF1230\ 7F5C4FDB70C581B23F76B63ACAE1CAA6B7902D52526735488A0EF13C6D9\ A51BFA4AB3AD8347796524D8EF6A167B5A41825D967E144E5140564251C\ CACB83E6B486F6B3CA3F7971506026C0B857F689962856DED4010ABD0BE\ 621C3A3960A54E710C375F26375D7014103A4B54330C198AF126116D227\ 6E11715F693877FAD7EF09CADB094AE91E1A1597"</span>) .<span class='ident'>unwrap</span>(); <span class='kw'>let</span> <span class='ident'>g</span> <span class='op'>=</span> <span class='ident'>BigNum</span>::<span class='ident'>from_hex_str</span>(<span class='string'>"3FB32C9B73134D0B2E77506660EDBD484CA7B18F21EF205407F4793A1A0\ BA12510DBC15077BE463FFF4FED4AAC0BB555BE3A6C1B0C6B47B1BC3773\ BF7E8C6F62901228F8C28CBB18A55AE31341000A650196F931C77A57F2D\ DF463E5E9EC144B777DE62AAAB8A8628AC376D282D6ED3864E67982428E\ BC831D14348F6F2F9193B5045AF2767164E1DFC967C1FB3F2E55A4BD1BF\ FE83B9C80D052B985D182EA0ADB2A3B7313D3FE14C8484B1E052588B9B7\ D2BBD2DF016199ECD06E1557CD0915B3353BBB64E0EC377FD028370DF92\ B52C7891428CDC67EB6184B523D1DB246C32F63078490F00EF8D647D148\ D47954515E2327CFEF98C582664B4C0F6CC41659"</span>) .<span class='ident'>unwrap</span>(); <span class='kw'>let</span> <span class='ident'>q</span> <span class='op'>=</span> <span class='ident'>BigNum</span>::<span class='ident'>from_hex_str</span>(<span class='string'>"8CF83642A709A097B447997640129DA299B1A47D1EB3750BA308B0FE64F\ 5FBD3"</span>) .<span class='ident'>unwrap</span>(); <span class='kw'>let</span> <span class='ident'>dh</span> <span class='op'>=</span> <span class='ident'>DH</span>::<span class='ident'>from_params</span>(<span class='ident'>p</span>, <span class='ident'>g</span>, <span class='ident'>q</span>).<span class='ident'>unwrap</span>(); <span class='ident'>ctx</span>.<span class='ident'>set_tmp_dh</span>(<span class='ident'>dh</span>).<span class='ident'>unwrap</span>(); } <span class='attribute'>#[<span class='ident'>test</span>]</span> <span class='kw'>fn</span> <span class='ident'>test_dh_from_pem</span>() { <span class='kw'>let</span> <span class='ident'>ctx</span> <span class='op'>=</span> <span class='ident'>SslContext</span>::<span class='ident'>new</span>(<span class='ident'>Sslv23</span>).<span class='ident'>unwrap</span>(); <span class='kw'>let</span> <span class='ident'>pem_path</span> <span class='op'>=</span> <span class='ident'>Path</span>::<span class='ident'>new</span>(<span class='string'>"test/dhparams.pem"</span>); <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>file</span> <span class='op'>=</span> <span class='ident'>File</span>::<span class='ident'>open</span>(<span class='kw-2'>&</span><span class='ident'>pem_path</span>) .<span class='ident'>ok</span>() .<span class='ident'>expect</span>(<span class='string'>"Failed to open `test/dhparams.pem`"</span>); <span class='kw'>let</span> <span class='ident'>dh</span> <span class='op'>=</span> <span class='ident'>DH</span>::<span class='ident'>from_pem</span>(<span class='kw-2'>&</span><span class='kw-2'>mut</span> <span class='ident'>file</span>).<span class='ident'>ok</span>().<span class='ident'>expect</span>(<span class='string'>"Failed to load PEM"</span>); <span class='ident'>ctx</span>.<span class='ident'>set_tmp_dh</span>(<span class='ident'>dh</span>).<span class='ident'>unwrap</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>⇤</dt> <dd>Move up in search results</dd> <dt>⇥</dt> <dd>Move down in search results</dd> <dt>⏎</dt> <dd>Go to active search result</dd> <dt>+</dt> <dd>Collapse/expand all sections</dd> </dl> </div> <div class="infos"> <h2>Search Tricks</h2> <p> Prefix searches with a type followed by a colon (e.g. <code>fn:</code>) to restrict the search to a given type. </p> <p> Accepted types are: <code>fn</code>, <code>mod</code>, <code>struct</code>, <code>enum</code>, <code>trait</code>, <code>type</code>, <code>macro</code>, and <code>const</code>. </p> <p> Search functions by type signature (e.g. <code>vec -> usize</code> or <code>* -> vec</code>) </p> </div> </div> </aside> <script> window.rootPath = "../../../"; window.currentCrate = "openssl"; window.playgroundUrl = ""; </script> <script src="../../../jquery.js"></script> <script src="../../../main.js"></script> <script defer src="../../../search-index.js"></script> </body> </html>