📄 osrng_8h-source.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 Page</a> | <a class="qindex" href="namespaces.html">Namespace List</a> | <a class="qindex" href="hierarchy.html">Class Hierarchy</a> | <a class="qindex" href="classes.html">Alphabetical List</a> | <a class="qindex" href="annotated.html">Compound List</a> | <a class="qindex" href="files.html">File List</a> | <a class="qindex" href="namespacemembers.html">Namespace Members</a> | <a class="qindex" href="functions.html">Compound Members</a> | <a class="qindex" href="globals.html">File 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 &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 <windows.h></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> <<span class="keyword">class</span> BLOCK_CIPHER><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<RandomNumberGenerator> 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<DES_EDE3></a>;00113 00114 <span class="keyword">template</span> <<span class="keyword">class</span> BLOCK_CIPHER>00115 <span class="keywordtype">void</span> <a class="code" href="class_auto_seeded_x917_r_n_g.html">AutoSeededX917RNG<BLOCK_CIPHER>::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->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> <<span class="keyword">class</span> BLOCK_CIPHER>00129 <span class="keywordtype">void</span> AutoSeededX917RNG<BLOCK_CIPHER>::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> <<span class="keyword">class</span> BLOCK_CIPHER><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<BLOCK_CIPHER>::GenerateByte</a>()00145 {00146 byte b = m_rng->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 + -