📄 ida_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++: ida.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>ida.cpp</h1><div class="fragment"><pre>00001 <span class="comment">// ida.cpp - written and placed in the public domain by Wei Dai</span>00002 00003 <span class="preprocessor">#include "pch.h"</span>00004 <span class="preprocessor">#include "ida.h"</span>00005 00006 <span class="preprocessor">#include "algebra.h"</span>00007 <span class="preprocessor">#include "gf2_32.h"</span>00008 <span class="preprocessor">#include "<a class="code" href="polynomi_8h.html">polynomi.h</a>"</span>00009 00010 <span class="preprocessor">#include "polynomi.cpp"</span>00011 00012 ANONYMOUS_NAMESPACE_BEGIN00013 <span class="keyword">static</span> <span class="keyword">const</span> CryptoPP::GF2_32 field;00014 NAMESPACE_END00015 00016 <span class="keyword">using</span> <span class="keyword">namespace </span>std;00017 00018 NAMESPACE_BEGIN(CryptoPP)00019 00020 <span class="keywordtype">void</span> RawIDA::ChannelInitialize(<span class="keyword">const</span> string &channel, <span class="keyword">const</span> <a class="code" href="class_name_value_pairs.html">NameValuePairs</a> &parameters, <span class="keywordtype">int</span> propagation)00021 {00022 <span class="keywordflow">if</span> (!channel.empty())00023 <span class="keywordflow">throw</span> <a class="code" href="class_not_implemented.html">NotImplemented</a>(<span class="stringliteral">"RawIDA: can't reinitialize a channel"</span>);00024 00025 <span class="keywordflow">if</span> (!parameters.<a class="code" href="class_name_value_pairs.html#_x_t_r___d_ha42">GetIntValue</a>(<span class="stringliteral">"RecoveryThreshold"</span>, m_threshold))00026 <span class="keywordflow">throw</span> <a class="code" href="class_invalid_argument.html">InvalidArgument</a>(<span class="stringliteral">"RawIDA: missing RecoveryThreshold argument"</span>);00027 00028 <span class="keywordflow">if</span> (m_threshold <= 0)00029 <span class="keywordflow">throw</span> <a class="code" href="class_invalid_argument.html">InvalidArgument</a>(<span class="stringliteral">"RawIDA: RecoveryThreshold must be greater than 0"</span>);00030 00031 m_lastMapPosition = m_inputChannelMap.end();00032 m_channelsReady = 0;00033 m_channelsFinished = 0;00034 m_w.<a class="code" href="class_sec_block.html#_sec_block_with_hinta19">New</a>(m_threshold);00035 m_y.<a class="code" href="class_sec_block.html#_sec_block_with_hinta19">New</a>(m_threshold);00036 m_inputQueues.reserve(m_threshold);00037 00038 m_outputChannelIds.clear();00039 m_outputChannelIdStrings.clear();00040 m_outputQueues.clear();00041 00042 word32 outputChannelID;00043 <span class="keywordflow">if</span> (parameters.<a class="code" href="class_name_value_pairs.html#_x_t_r___d_ha39">GetValue</a>(<span class="stringliteral">"OutputChannelID"</span>, outputChannelID))00044 AddOutputChannel(outputChannelID);00045 <span class="keywordflow">else</span>00046 {00047 <span class="keywordtype">int</span> nShares = parameters.<a class="code" href="class_name_value_pairs.html#_x_t_r___d_ha43">GetIntValueWithDefault</a>(<span class="stringliteral">"NumberOfShares"</span>, m_threshold);00048 <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i=0; i<nShares; i++)00049 AddOutputChannel(i);00050 }00051 00052 <span class="keywordflow">if</span> (propagation)00053 <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i=0; i<m_outputChannelIds.size(); i++)00054 <a class="code" href="class_filter.html#_zlib_decompressora8">AttachedTransformation</a>()-><a class="code" href="class_buffered_transformation.html#_zlib_decompressorz13_10">ChannelInitialize</a>(m_outputChannelIdStrings[i], parameters, propagation-1);00055 }00056 00057 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> RawIDA::InsertInputChannel(word32 channelId)00058 {00059 <span class="keywordflow">if</span> (m_lastMapPosition != m_inputChannelMap.end())00060 {00061 <span class="keywordflow">if</span> (m_lastMapPosition->first == channelId)00062 <span class="keywordflow">goto</span> skipFind;00063 ++m_lastMapPosition;00064 <span class="keywordflow">if</span> (m_lastMapPosition != m_inputChannelMap.end() && m_lastMapPosition->first == channelId)00065 <span class="keywordflow">goto</span> skipFind;00066 }00067 m_lastMapPosition = m_inputChannelMap.find(channelId);00068 00069 skipFind:00070 <span class="keywordflow">if</span> (m_lastMapPosition == m_inputChannelMap.end())00071 {00072 <span class="keywordflow">if</span> (m_inputChannelIds.size() == m_threshold)00073 <span class="keywordflow">return</span> m_threshold;00074 00075 m_lastMapPosition = m_inputChannelMap.insert(pair<const unsigned long, unsigned int>(channelId, m_inputChannelIds.size())).first;00076 m_inputQueues.push_back(<a class="code" href="class_message_queue.html">MessageQueue</a>());00077 m_inputChannelIds.push_back(channelId);00078 00079 <span class="keywordflow">if</span> (m_inputChannelIds.size() == m_threshold)00080 PrepareInterpolation();00081 }00082 <span class="keywordflow">return</span> m_lastMapPosition->second;00083 }00084 00085 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> RawIDA::LookupInputChannel(word32 channelId)<span class="keyword"> const</span>00086 <span class="keyword"></span>{00087 map<word32, unsigned int>::const_iterator it = m_inputChannelMap.find(channelId);00088 <span class="keywordflow">if</span> (it == m_inputChannelMap.end())00089 <span class="keywordflow">return</span> m_threshold;00090 <span class="keywordflow">else</span>00091 <span class="keywordflow">return</span> it->second;00092 }00093 00094 <span class="keywordtype">void</span> RawIDA::ChannelData(word32 channelId, <span class="keyword">const</span> byte *inString, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> length, <span class="keywordtype">bool</span> messageEnd)00095 {00096 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i = InsertInputChannel(channelId);00097 <span class="keywordflow">if</span> (i < m_threshold)00098 {00099 <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> size = m_inputQueues[i].MaxRetrievable();00100 m_inputQueues[i].Put(inString, length);00101 <span class="keywordflow">if</span> (size < 4 && size + length >= 4)00102 {00103 m_channelsReady++;00104 <span class="keywordflow">if</span> (m_channelsReady == m_threshold)00105 ProcessInputQueues();00106 }00107 00108 <span class="keywordflow">if</span> (messageEnd)00109 {00110 m_inputQueues[i].MessageEnd();00111 <span class="keywordflow">if</span> (m_inputQueues[i].NumberOfMessages() == 1)00112 {00113 m_channelsFinished++;00114 <span class="keywordflow">if</span> (m_channelsFinished == m_threshold)00115 {00116 m_channelsReady = 0;00117 <span class="keywordflow">for</span> (i=0; i<m_threshold; i++)00118 m_channelsReady += m_inputQueues[i].AnyRetrievable();00119 ProcessInputQueues();00120 }00121 }00122 }00123 }00124 }00125 00126 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> RawIDA::InputBuffered(word32 channelId)<span class="keyword"> const</span>00127 <span class="keyword"></span>{00128 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i = LookupInputChannel(channelId);00129 <span class="keywordflow">return</span> i < m_threshold ? m_inputQueues[i].MaxRetrievable() : 0;00130 }00131 00132 <span class="keywordtype">void</span> RawIDA::ComputeV(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i)00133 {00134 <span class="keywordflow">if</span> (i >= m_v.size())00135 {00136 m_v.resize(i+1);00137 m_outputToInput.resize(i+1);00138 }00139 00140 m_outputToInput[i] = LookupInputChannel(m_outputChannelIds[i]);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -