📄 osrng_8cpp-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.cpp 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.cpp</h1><div class="fragment"><pre>00001 <span class="comment">// osrng.cpp - written and placed in the public domain by Wei Dai</span>00002 00003 <span class="comment">// Thanks to Leonard Janke for the suggestion for AutoSeededRandomPool.</span>00004 00005 <span class="preprocessor">#include "pch.h"</span>00006 00007 <span class="preprocessor">#ifndef CRYPTOPP_IMPORTS</span>00008 <span class="preprocessor"></span>00009 <span class="preprocessor">#include "osrng.h"</span>00010 00011 <span class="preprocessor">#ifdef OS_RNG_AVAILABLE</span>00012 <span class="preprocessor"></span>00013 <span class="preprocessor">#include "rng.h"</span>00014 00015 <span class="preprocessor">#ifdef CRYPTOPP_WIN32_AVAILABLE</span>00016 <span class="preprocessor"></span><span class="preprocessor">#ifndef _WIN32_WINNT</span>00017 <span class="preprocessor"></span><span class="preprocessor">#define _WIN32_WINNT 0x0400</span>00018 <span class="preprocessor"></span><span class="preprocessor">#endif</span>00019 <span class="preprocessor"></span><span class="preprocessor">#include <windows.h></span>00020 <span class="preprocessor">#include <wincrypt.h></span>00021 <span class="preprocessor">#else</span>00022 <span class="preprocessor"></span><span class="preprocessor">#include <errno.h></span>00023 <span class="preprocessor">#include <fcntl.h></span>00024 <span class="preprocessor">#include <unistd.h></span>00025 <span class="preprocessor">#endif</span>00026 <span class="preprocessor"></span>00027 NAMESPACE_BEGIN(CryptoPP)00028 00029 #<span class="keywordflow">if</span> defined(NONBLOCKING_RNG_AVAILABLE) || defined(BLOCKING_RNG_AVAILABLE)00030 OS_RNG_Err::OS_RNG_Err(<span class="keyword">const</span> std::string &operation)00031 : <a class="code" href="class_exception.html">Exception</a>(OTHER_ERROR, "OS_Rng: " + operation + " operation failed with error " + 00032 #ifdef CRYPTOPP_WIN32_AVAILABLE00033 "0x" + IntToString(GetLastError(), 16)00034 #else00035 IntToString(errno)00036 #endif00037 )00038 {00039 }00040 <span class="preprocessor">#endif</span>00041 <span class="preprocessor"></span>00042 <span class="preprocessor">#ifdef NONBLOCKING_RNG_AVAILABLE</span>00043 <span class="preprocessor"></span>00044 <span class="preprocessor">#ifdef CRYPTOPP_WIN32_AVAILABLE</span>00045 <span class="preprocessor"></span>00046 MicrosoftCryptoProvider::MicrosoftCryptoProvider()00047 {00048 <span class="keywordflow">if</span>(!CryptAcquireContext(&m_hProvider, 0, 0, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT))00049 <span class="keywordflow">throw</span> <a class="code" href="class_o_s___r_n_g___err.html">OS_RNG_Err</a>(<span class="stringliteral">"CryptAcquireContext"</span>);00050 }00051 00052 MicrosoftCryptoProvider::~MicrosoftCryptoProvider()00053 {00054 CryptReleaseContext(m_hProvider, 0);00055 }00056 00057 <span class="preprocessor">#endif</span>00058 <span class="preprocessor"></span>00059 NonblockingRng::NonblockingRng()00060 {00061 <span class="preprocessor">#ifndef CRYPTOPP_WIN32_AVAILABLE</span>00062 <span class="preprocessor"></span> m_fd = open(<span class="stringliteral">"/dev/urandom"</span>,O_RDONLY);00063 <span class="keywordflow">if</span> (m_fd == -1)00064 <span class="keywordflow">throw</span> <a class="code" href="class_o_s___r_n_g___err.html">OS_RNG_Err</a>(<span class="stringliteral">"open /dev/urandom"</span>);00065 <span class="preprocessor">#endif</span>00066 <span class="preprocessor"></span>}00067 00068 NonblockingRng::~NonblockingRng()00069 {00070 <span class="preprocessor">#ifndef CRYPTOPP_WIN32_AVAILABLE</span>00071 <span class="preprocessor"></span> close(m_fd);00072 <span class="preprocessor">#endif</span>00073 <span class="preprocessor"></span>}00074 <a name="l00075"></a><a class="code" href="class_nonblocking_rng.html#_nonblocking_rnga2">00075</a> byte <a class="code" href="class_nonblocking_rng.html#_nonblocking_rnga2">NonblockingRng::GenerateByte</a>()00076 {00077 byte b;00078 <a class="code" href="class_nonblocking_rng.html#_nonblocking_rnga3">GenerateBlock</a>(&b, 1);00079 <span class="keywordflow">return</span> b;00080 }00081 <a name="l00082"></a><a class="code" href="class_nonblocking_rng.html#_nonblocking_rnga3">00082</a> <span class="keywordtype">void</span> <a class="code" href="class_nonblocking_rng.html#_nonblocking_rnga3">NonblockingRng::GenerateBlock</a>(byte *output, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> size)00083 {00084 <span class="preprocessor">#ifdef CRYPTOPP_WIN32_AVAILABLE</span>00085 <span class="preprocessor"></span><span class="preprocessor"># ifdef WORKAROUND_MS_BUG_Q258000</span>00086 <span class="preprocessor"></span> <span class="keyword">static</span> MicrosoftCryptoProvider m_Provider;00087 <span class="preprocessor"># endif</span>00088 <span class="preprocessor"></span> <span class="keywordflow">if</span> (!CryptGenRandom(m_Provider.GetProviderHandle(), size, output))00089 <span class="keywordflow">throw</span> <a class="code" href="class_o_s___r_n_g___err.html">OS_RNG_Err</a>(<span class="stringliteral">"CryptGenRandom"</span>);00090 <span class="preprocessor">#else</span>00091 <span class="preprocessor"></span> <span class="keywordflow">if</span> (read(m_fd, output, size) != size)00092 <span class="keywordflow">throw</span> <a class="code" href="class_o_s___r_n_g___err.html">OS_RNG_Err</a>(<span class="stringliteral">"read /dev/urandom"</span>);00093 <span class="preprocessor">#endif</span>00094 <span class="preprocessor"></span>}00095 00096 <span class="preprocessor">#endif</span>00097 <span class="preprocessor"></span>00098 <span class="comment">// *************************************************************</span>00099 00100 <span class="preprocessor">#ifdef BLOCKING_RNG_AVAILABLE</span>00101 <span class="preprocessor"></span>00102 BlockingRng::BlockingRng()00103 {00104 m_fd = open(<span class="stringliteral">"/dev/random"</span>,O_RDONLY);00105 <span class="keywordflow">if</span> (m_fd == -1)00106 <span class="keywordflow">throw</span> <a class="code" href="class_o_s___r_n_g___err.html">OS_RNG_Err</a>(<span class="stringliteral">"open /dev/random"</span>);00107 }00108 00109 BlockingRng::~BlockingRng()00110 {00111 close(m_fd);00112 }00113 <a name="l00114"></a><a class="code" href="class_blocking_rng.html#_blocking_rnga2">00114</a> byte <a class="code" href="class_blocking_rng.html#_blocking_rnga2">BlockingRng::GenerateByte</a>()00115 {00116 byte b;00117 <a class="code" href="class_blocking_rng.html#_blocking_rnga3">GenerateBlock</a>(&b, 1);00118 <span class="keywordflow">return</span> b;00119 }00120 <a name="l00121"></a><a class="code" href="class_blocking_rng.html#_blocking_rnga3">00121</a> <span class="keywordtype">void</span> <a class="code" href="class_blocking_rng.html#_blocking_rnga3">BlockingRng::GenerateBlock</a>(byte *output, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> size)00122 {00123 <span class="keywordflow">while</span> (size)00124 {00125 <span class="comment">// on some systems /dev/random will block until all bytes</span>00126 <span class="comment">// are available, on others it will returns immediately</span>00127 <span class="keywordtype">int</span> len = read(m_fd, output, STDMIN(size, (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span>)INT_MAX));00128 <span class="keywordflow">if</span> (len == -1)00129 <span class="keywordflow">throw</span> <a class="code" href="class_o_s___r_n_g___err.html">OS_RNG_Err</a>(<span class="stringliteral">"read /dev/random"</span>);00130 size -= len;00131 output += len;00132 <span class="keywordflow">if</span> (size)00133 sleep(1);00134 }00135 }00136 00137 <span class="preprocessor">#endif</span>00138 <span class="preprocessor"></span>00139 <span class="comment">// *************************************************************</span>00140 00141 <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)00142 {00143 <span class="preprocessor">#ifdef NONBLOCKING_RNG_AVAILABLE</span>00144 <span class="preprocessor"></span> <span class="keywordflow">if</span> (blocking)00145 <span class="preprocessor">#endif</span>00146 <span class="preprocessor"></span> {00147 <span class="preprocessor">#ifdef BLOCKING_RNG_AVAILABLE</span>00148 <span class="preprocessor"></span> <a class="code" href="class_blocking_rng.html">BlockingRng</a> rng;00149 rng.<a class="code" href="class_blocking_rng.html#_blocking_rnga3">GenerateBlock</a>(output, size);00150 <span class="preprocessor">#endif</span>00151 <span class="preprocessor"></span> }00152 00153 <span class="preprocessor">#ifdef BLOCKING_RNG_AVAILABLE</span>00154 <span class="preprocessor"></span> <span class="keywordflow">if</span> (!blocking)00155 <span class="preprocessor">#endif</span>00156 <span class="preprocessor"></span> {00157 <span class="preprocessor">#ifdef NONBLOCKING_RNG_AVAILABLE</span>00158 <span class="preprocessor"></span> <a class="code" href="class_nonblocking_rng.html">NonblockingRng</a> rng;00159 rng.<a class="code" href="class_nonblocking_rng.html#_nonblocking_rnga3">GenerateBlock</a>(output, size);00160 <span class="preprocessor">#endif</span>00161 <span class="preprocessor"></span> }00162 }00163 00164 <span class="keywordtype">void</span> AutoSeededRandomPool::Reseed(<span class="keywordtype">bool</span> blocking, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> seedSize)00165 {00166 <a class="code" href="class_sec_block.html">SecByteBlock</a> seed(seedSize);00167 OS_GenerateRandomBlock(blocking, seed, seedSize);00168 <a class="code" href="class_buffered_transformation.html#_zlib_decompressorz1_0">Put</a>(seed, seedSize);00169 }00170 00171 NAMESPACE_END00172 00173 <span class="preprocessor">#endif</span>00174 <span class="preprocessor"></span>00175 <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 + -