⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 osrng_8h-source.html

📁 Crypto++是一个非常强大的密码学库,主要是功能全
💻 HTML
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1"><title>Crypto++: osrng.h Source File</title><link href="doxygen.css" rel="stylesheet" type="text/css"></head><body><!-- Generated by Doxygen 1.3.2 --><div class="qindex"><a class="qindex" href="index.html">Main&nbsp;Page</a> | <a class="qindex" href="namespaces.html">Namespace List</a> | <a class="qindex" href="hierarchy.html">Class&nbsp;Hierarchy</a> | <a class="qindex" href="classes.html">Alphabetical&nbsp;List</a> | <a class="qindex" href="annotated.html">Compound&nbsp;List</a> | <a class="qindex" href="files.html">File&nbsp;List</a> | <a class="qindex" href="namespacemembers.html">Namespace&nbsp;Members</a> | <a class="qindex" href="functions.html">Compound&nbsp;Members</a> | <a class="qindex" href="globals.html">File&nbsp;Members</a></div><h1>osrng.h</h1><div class="fragment"><pre>00001 <span class="preprocessor">#ifndef CRYPTOPP_OSRNG_H</span>00002 <span class="preprocessor"></span><span class="preprocessor">#define CRYPTOPP_OSRNG_H</span>00003 <span class="preprocessor"></span>00004 <span class="preprocessor">#include "config.h"</span>00005 00006 <span class="preprocessor">#ifdef OS_RNG_AVAILABLE</span>00007 <span class="preprocessor"></span>00008 <span class="preprocessor">#include "randpool.h"</span>00009 <span class="preprocessor">#include "rng.h"</span>00010 <span class="preprocessor">#include "<a class="code" href="des_8h.html">des.h</a>"</span>00011 00012 NAMESPACE_BEGIN(CryptoPP)00013 00014 <span class="comment">//! Exception class for Operating-System Random Number Generator.</span><a name="l00015"></a><a class="code" href="class_o_s___r_n_g___err.html">00015</a> <span class="comment"></span><span class="keyword">class </span>CRYPTOPP_DLL OS_RNG_Err : <span class="keyword">public</span> <a class="code" href="class_exception.html">Exception</a>00016 {00017 <span class="keyword">public</span>:00018         OS_RNG_Err(<span class="keyword">const</span> std::string &amp;operation);00019 };00020 00021 <span class="preprocessor">#ifdef NONBLOCKING_RNG_AVAILABLE</span>00022 <span class="preprocessor"></span>00023 <span class="preprocessor">#ifdef CRYPTOPP_WIN32_AVAILABLE</span>00024 <span class="preprocessor"></span><span class="keyword">class </span>CRYPTOPP_DLL MicrosoftCryptoProvider00025 {00026 <span class="keyword">public</span>:00027         MicrosoftCryptoProvider();00028         ~MicrosoftCryptoProvider();00029 <span class="preprocessor">#if defined(_WIN64)</span>00030 <span class="preprocessor"></span>        <span class="keyword">typedef</span> <span class="keywordtype">unsigned</span> __int64 ProviderHandle;        <span class="comment">// type HCRYPTPROV, avoid #include &lt;windows.h&gt;</span>00031 <span class="preprocessor">#else</span>00032 <span class="preprocessor"></span>        <span class="keyword">typedef</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> ProviderHandle;00033 <span class="preprocessor">#endif</span>00034 <span class="preprocessor"></span>        ProviderHandle GetProviderHandle()<span class="keyword"> const </span>{<span class="keywordflow">return</span> m_hProvider;}00035 <span class="keyword">private</span>:00036         ProviderHandle m_hProvider;00037 };00038 <span class="preprocessor">#endif</span>00039 <span class="preprocessor"></span><span class="comment"></span>00040 <span class="comment">//! encapsulate CryptoAPI's CryptGenRandom or /dev/urandom</span><a name="l00041"></a><a class="code" href="class_nonblocking_rng.html">00041</a> <span class="comment"></span><span class="keyword">class </span>CRYPTOPP_DLL NonblockingRng : <span class="keyword">public</span> <a class="code" href="class_random_number_generator.html">RandomNumberGenerator</a>00042 {00043 <span class="keyword">public</span>:00044         NonblockingRng();00045         ~NonblockingRng();00046         byte <a class="code" href="class_random_number_generator.html#_sapphire_r_n_ga2">GenerateByte</a>();00047         <span class="keywordtype">void</span> <a class="code" href="class_random_number_generator.html#_x917_r_n_ga4">GenerateBlock</a>(byte *output, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> size);00048 00049 <span class="keyword">protected</span>:00050 <span class="preprocessor">#ifdef CRYPTOPP_WIN32_AVAILABLE</span>00051 <span class="preprocessor"></span><span class="preprocessor">#       ifndef WORKAROUND_MS_BUG_Q258000</span>00052 <span class="preprocessor"></span>                MicrosoftCryptoProvider m_Provider;00053 <span class="preprocessor">#       endif</span>00054 <span class="preprocessor"></span><span class="preprocessor">#else</span>00055 <span class="preprocessor"></span>        <span class="keywordtype">int</span> m_fd;00056 <span class="preprocessor">#endif</span>00057 <span class="preprocessor"></span>};00058 00059 <span class="preprocessor">#endif</span>00060 <span class="preprocessor"></span>00061 <span class="preprocessor">#ifdef BLOCKING_RNG_AVAILABLE</span>00062 <span class="preprocessor"></span><span class="comment"></span>00063 <span class="comment">//! encapsulate /dev/random</span><a name="l00064"></a><a class="code" href="class_blocking_rng.html">00064</a> <span class="comment"></span><span class="keyword">class </span>CRYPTOPP_DLL BlockingRng : <span class="keyword">public</span> <a class="code" href="class_random_number_generator.html">RandomNumberGenerator</a>00065 {00066 <span class="keyword">public</span>:00067         BlockingRng();00068         ~BlockingRng();00069         byte <a class="code" href="class_random_number_generator.html#_sapphire_r_n_ga2">GenerateByte</a>();00070         <span class="keywordtype">void</span> <a class="code" href="class_random_number_generator.html#_x917_r_n_ga4">GenerateBlock</a>(byte *output, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> size);00071 00072 <span class="keyword">protected</span>:00073         <span class="keywordtype">int</span> m_fd;00074 };00075 00076 <span class="preprocessor">#endif</span>00077 <span class="preprocessor"></span>00078 CRYPTOPP_DLL <span class="keywordtype">void</span> OS_GenerateRandomBlock(<span class="keywordtype">bool</span> blocking, byte *output, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> size);00079 <span class="comment"></span>00080 <span class="comment">//! Automaticly Seeded Randomness Pool</span>00081 <span class="comment"></span><span class="comment">/*! This class seeds itself using an operating system provided RNG. */</span><a name="l00082"></a><a class="code" href="class_auto_seeded_random_pool.html">00082</a> <span class="keyword">class </span>CRYPTOPP_DLL AutoSeededRandomPool : <span class="keyword">public</span> <a class="code" href="class_random_pool.html">RandomPool</a>00083 {00084 <span class="keyword">public</span>:<span class="comment"></span>00085 <span class="comment">        //! blocking will be ignored if the prefered RNG isn't available</span><a name="l00086"></a><a class="code" href="class_auto_seeded_random_pool.html#_auto_seeded_random_poola0">00086</a> <span class="comment"></span>        <span class="keyword">explicit</span> AutoSeededRandomPool(<span class="keywordtype">bool</span> blocking = <span class="keyword">false</span>, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> seedSize = 32)00087                 {Reseed(blocking, seedSize);}00088         <span class="keywordtype">void</span> Reseed(<span class="keywordtype">bool</span> blocking = <span class="keyword">false</span>, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> seedSize = 32);00089 };00090 <span class="comment"></span>00091 <span class="comment">//! RNG from ANSI X9.17 Appendix C, seeded using an OS provided RNG</span>00092 <span class="comment"></span><span class="keyword">template</span> &lt;<span class="keyword">class</span> BLOCK_CIPHER&gt;<a name="l00093"></a><a class="code" href="class_auto_seeded_x917_r_n_g.html">00093</a> <span class="keyword">class </span><a class="code" href="class_auto_seeded_x917_r_n_g.html">AutoSeededX917RNG</a> : <span class="keyword">public</span> <a class="code" href="class_random_number_generator.html">RandomNumberGenerator</a>, <span class="keyword">public</span> NotCopyable00094 {00095 <span class="keyword">public</span>:<span class="comment"></span>00096 <span class="comment">        //! blocking will be ignored if the prefered RNG isn't available</span><a name="l00097"></a><a class="code" href="class_auto_seeded_x917_r_n_g.html#_auto_seeded_x917_r_n_ga0">00097</a> <span class="comment"></span>        <span class="keyword">explicit</span> <a class="code" href="class_auto_seeded_x917_r_n_g.html#_auto_seeded_x917_r_n_ga0">AutoSeededX917RNG</a>(<span class="keywordtype">bool</span> blocking = <span class="keyword">false</span>)00098                 {Reseed(blocking);}00099         <span class="keywordtype">void</span> Reseed(<span class="keywordtype">bool</span> blocking = <span class="keyword">false</span>);00100         <span class="comment">// exposed for testing</span>00101         <span class="keywordtype">void</span> Reseed(<span class="keyword">const</span> byte *key, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> keylength, <span class="keyword">const</span> byte *seed, <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> timeVector);00102 00103         byte <a class="code" href="class_auto_seeded_x917_r_n_g.html#_auto_seeded_x917_r_n_ga3">GenerateByte</a>();00104 00105 <span class="keyword">private</span>:00106         member_ptr&lt;RandomNumberGenerator&gt; m_rng;00107         <a class="code" href="class_sec_block.html">SecByteBlock</a> m_lastBlock;00108         <span class="keywordtype">bool</span> m_isDifferent;00109         <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> m_counter;00110 };00111 00112 CRYPTOPP_DLL_TEMPLATE_CLASS <a class="code" href="class_auto_seeded_x917_r_n_g.html">AutoSeededX917RNG&lt;DES_EDE3&gt;</a>;00113 00114 <span class="keyword">template</span> &lt;<span class="keyword">class</span> BLOCK_CIPHER&gt;00115 <span class="keywordtype">void</span> <a class="code" href="class_auto_seeded_x917_r_n_g.html">AutoSeededX917RNG&lt;BLOCK_CIPHER&gt;::Reseed</a>(<span class="keyword">const</span> byte *key, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> keylength, <span class="keyword">const</span> byte *seed, <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> timeVector)00116 {00117         m_rng.reset(<span class="keyword">new</span> <a class="code" href="class_x917_r_n_g.html">X917RNG</a>(<span class="keyword">new</span> <span class="keyword">typename</span> BLOCK_CIPHER::Encryption(key, keylength), seed, timeVector));00118 00119         <span class="keywordflow">if</span> (FIPS_140_2_ComplianceEnabled())00120         {00121                 m_lastBlock.<a class="code" href="class_sec_block.html#_sec_block_with_hinta23">resize</a>(16);00122                 m_rng-&gt;GenerateBlock(m_lastBlock, m_lastBlock.<a class="code" href="class_sec_block.html#_sec_block_with_hinta13">size</a>());00123                 m_counter = 0;00124                 m_isDifferent = <span class="keyword">false</span>;00125         }00126 }00127 00128 <span class="keyword">template</span> &lt;<span class="keyword">class</span> BLOCK_CIPHER&gt;00129 <span class="keywordtype">void</span> AutoSeededX917RNG&lt;BLOCK_CIPHER&gt;::Reseed(<span class="keywordtype">bool</span> blocking)00130 {00131         <a class="code" href="class_sec_block.html">SecByteBlock</a> seed(BLOCK_CIPHER::BLOCKSIZE + BLOCK_CIPHER::DEFAULT_KEYLENGTH);00132         <span class="keyword">const</span> byte *key;00133         <span class="keywordflow">do</span>00134         {00135                 OS_GenerateRandomBlock(blocking, seed, seed.<a class="code" href="class_sec_block.html#_sec_block_with_hinta13">size</a>());00136                 key = seed + BLOCK_CIPHER::BLOCKSIZE;00137         }       <span class="comment">// check that seed and key don't have same value</span>00138         <span class="keywordflow">while</span> (memcmp(key, seed, STDMIN((<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span>)BLOCK_CIPHER::BLOCKSIZE, (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span>)BLOCK_CIPHER::DEFAULT_KEYLENGTH)) == 0);00139 00140         Reseed(key, BLOCK_CIPHER::DEFAULT_KEYLENGTH, seed, 0);00141 }00142 00143 <span class="keyword">template</span> &lt;<span class="keyword">class</span> BLOCK_CIPHER&gt;<a name="l00144"></a><a class="code" href="class_auto_seeded_x917_r_n_g.html#_auto_seeded_x917_r_n_ga3">00144</a> byte <a class="code" href="class_auto_seeded_x917_r_n_g.html#_auto_seeded_x917_r_n_ga3">AutoSeededX917RNG&lt;BLOCK_CIPHER&gt;::GenerateByte</a>()00145 {00146         byte b = m_rng-&gt;GenerateByte();00147 00148         <span class="keywordflow">if</span> (FIPS_140_2_ComplianceEnabled())00149         {00150                 m_isDifferent = m_isDifferent || b != m_lastBlock[m_counter];00151                 m_lastBlock[m_counter] = b;00152                 ++m_counter;00153                 <span class="keywordflow">if</span> (m_counter == m_lastBlock.<a class="code" href="class_sec_block.html#_sec_block_with_hinta13">size</a>())00154                 {00155                         <span class="keywordflow">if</span> (!m_isDifferent)00156                                 <span class="keywordflow">throw</span> <a class="code" href="class_self_test_failure.html">SelfTestFailure</a>(<span class="stringliteral">"AutoSeededX917RNG: Continuous random number generator test failed."</span>);00157                         m_counter = 0;00158                         m_isDifferent = <span class="keyword">false</span>;00159                 }00160         }00161 00162         <span class="keywordflow">return</span> b;00163 }00164 00165 NAMESPACE_END00166 00167 <span class="preprocessor">#endif</span>00168 <span class="preprocessor"></span>00169 <span class="preprocessor">#endif</span></pre></div><hr size="1"><address style="align: right;"><small>Generated on Tue Jul 8 23:34:21 2003 for Crypto++ by<a href="http://www.doxygen.org/index.html"><img src="doxygen.png" alt="doxygen" align="middle" border=0 > </a>1.3.2 </small></address></body></html>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -