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

📄 asn_8cpp-source.html

📁 Crypto++是一个非常强大的密码学库,主要是功能全
💻 HTML
📖 第 1 页 / 共 3 页
字号:
00186                 BERDecodeError();00187 00188         byte unused;00189         <span class="keywordflow">if</span> (!bt.<a class="code" href="class_buffered_transformation.html#_zlib_decompressorz7_2">Get</a>(unused))00190                 BERDecodeError();00191         unusedBits = unused;00192         str.<a class="code" href="class_sec_block.html#_sec_block_with_hinta23">resize</a>(bc-1);00193         <span class="keywordflow">if</span> ((bc-1) != bt.<a class="code" href="class_buffered_transformation.html#_zlib_decompressorz7_2">Get</a>(str, bc-1))00194                 BERDecodeError();00195         <span class="keywordflow">return</span> bc-1;00196 }00197 00198 <span class="keywordtype">void</span> OID::EncodeValue(<a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &amp;bt, <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> v)00199 {00200         <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i=RoundUpToMultipleOf(STDMAX(7U,BitPrecision(v)), 7U)-7; i != 0; i-=7)00201                 bt.<a class="code" href="class_buffered_transformation.html#_zlib_decompressorz1_0">Put</a>((byte)(0x80 | ((v &gt;&gt; i) &amp; 0x7f)));00202         bt.<a class="code" href="class_buffered_transformation.html#_zlib_decompressorz1_0">Put</a>((byte)(v &amp; 0x7f));00203 }00204 00205 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> OID::DecodeValue(<a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &amp;bt, <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> &amp;v)00206 {00207         byte b;00208         <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i=0;00209         v = 0;00210         <span class="keywordflow">while</span> (<span class="keyword">true</span>)00211         {00212                 <span class="keywordflow">if</span> (!bt.<a class="code" href="class_buffered_transformation.html#_zlib_decompressorz7_2">Get</a>(b))00213                         BERDecodeError();00214                 i++;00215                 v &lt;&lt;= 7;00216                 v += b &amp; 0x7f;00217                 <span class="keywordflow">if</span> (!(b &amp; 0x80))00218                         <span class="keywordflow">return</span> i;00219         }00220 }00221 00222 <span class="keywordtype">void</span> OID::DEREncode(<a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &amp;bt)<span class="keyword"> const</span>00223 <span class="keyword"></span>{00224         assert(m_values.size() &gt;= 2);00225         <a class="code" href="class_byte_queue.html">ByteQueue</a> temp;00226         temp.<a class="code" href="class_buffered_transformation.html#_zlib_decompressorz1_0">Put</a>(byte(m_values[0] * 40 + m_values[1]));00227         <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i=2; i&lt;m_values.size(); i++)00228                 EncodeValue(temp, m_values[i]);00229         bt.<a class="code" href="class_buffered_transformation.html#_zlib_decompressorz1_0">Put</a>(OBJECT_IDENTIFIER);00230         DERLengthEncode(bt, temp.<a class="code" href="class_byte_queue.html#_d_e_r_set_encodera15">CurrentSize</a>());00231         temp.<a class="code" href="class_buffered_transformation.html#_zlib_decompressorz7_10">TransferTo</a>(bt);00232 }00233 00234 <span class="keywordtype">void</span> OID::BERDecode(<a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &amp;bt)00235 {00236         byte b;00237         <span class="keywordflow">if</span> (!bt.<a class="code" href="class_buffered_transformation.html#_zlib_decompressorz7_2">Get</a>(b) || b != OBJECT_IDENTIFIER)00238                 BERDecodeError();00239 00240         <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> length;00241         <span class="keywordflow">if</span> (!BERLengthDecode(bt, length) || length &lt; 1)00242                 BERDecodeError();00243 00244         <span class="keywordflow">if</span> (!bt.<a class="code" href="class_buffered_transformation.html#_zlib_decompressorz7_2">Get</a>(b))00245                 BERDecodeError();00246         00247         length--;00248         m_values.resize(2);00249         m_values[0] = b / 40;00250         m_values[1] = b % 40;00251 00252         <span class="keywordflow">while</span> (length &gt; 0)00253         {00254                 <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> v;00255                 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> valueLen = DecodeValue(bt, v);00256                 <span class="keywordflow">if</span> (valueLen &gt; length)00257                         BERDecodeError();00258                 m_values.push_back(v);00259                 length -= valueLen;00260         }00261 }00262 00263 <span class="keywordtype">void</span> OID::BERDecodeAndCheck(<a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &amp;bt)<span class="keyword"> const</span>00264 <span class="keyword"></span>{00265         <a class="code" href="class_o_i_d.html">OID</a> oid(bt);00266         <span class="keywordflow">if</span> (*<span class="keyword">this</span> != oid)00267                 BERDecodeError();00268 }00269 00270 <span class="keyword">inline</span> <a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &amp; EncodedObjectFilter::CurrentTarget()00271 {00272         <span class="keywordflow">if</span> (m_flags &amp; PUT_OBJECTS) 00273                 <span class="keywordflow">return</span> *<a class="code" href="class_filter.html#_zlib_decompressora8">AttachedTransformation</a>();00274         <span class="keywordflow">else</span>00275                 <span class="keywordflow">return</span> TheBitBucket();00276 }00277 00278 <span class="keywordtype">void</span> <a class="code" href="class_buffered_transformation.html#_zlib_decompressorz1_0">EncodedObjectFilter::Put</a>(<span class="keyword">const</span> byte *inString, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> length)00279 {00280         <span class="keywordflow">if</span> (m_nCurrentObject == m_nObjects)00281         {00282                 <a class="code" href="class_filter.html#_zlib_decompressora8">AttachedTransformation</a>()-&gt;<a class="code" href="class_buffered_transformation.html#_zlib_decompressorz1_0">Put</a>(inString, length);00283                 <span class="keywordflow">return</span>;00284         }00285 00286         <a class="code" href="class_lazy_putter.html">LazyPutter</a> lazyPutter(m_queue, inString, length);00287 00288         <span class="keywordflow">while</span> (m_queue.AnyRetrievable())00289         {00290                 <span class="keywordflow">switch</span> (m_state)00291                 {00292                 <span class="keywordflow">case</span> IDENTIFIER:00293                         <span class="keywordflow">if</span> (!m_queue.Get(m_id))00294                                 <span class="keywordflow">return</span>;00295                         m_queue.TransferTo(CurrentTarget(), 1);00296                         m_state = LENGTH;       <span class="comment">// fall through</span>00297                 <span class="keywordflow">case</span> LENGTH:00298                 {00299                         byte b;00300                         <span class="keywordflow">if</span> (m_level &gt; 0 &amp;&amp; m_id == 0 &amp;&amp; m_queue.Peek(b) &amp;&amp; b == 0)00301                         {00302                                 m_queue.TransferTo(CurrentTarget(), 1);00303                                 m_level--;00304                                 m_state = IDENTIFIER;00305                                 <span class="keywordflow">break</span>;00306                         }00307                         ByteQueue::Walker walker(m_queue);00308                         <span class="keywordtype">bool</span> definiteLength;00309                         <span class="keywordflow">if</span> (!BERLengthDecode(walker, m_lengthRemaining, definiteLength))00310                                 <span class="keywordflow">return</span>;00311                         m_queue.TransferTo(CurrentTarget(), walker.GetCurrentPosition());00312                         <span class="keywordflow">if</span> (!((m_id &amp; CONSTRUCTED) || definiteLength))00313                                 BERDecodeError();00314                         <span class="keywordflow">if</span> (!definiteLength)00315                         {00316                                 <span class="keywordflow">if</span> (!(m_id &amp; CONSTRUCTED))00317                                         BERDecodeError();00318                                 m_level++;00319                                 m_state = IDENTIFIER;00320                                 <span class="keywordflow">break</span>;00321                         }00322                         m_state = BODY;         <span class="comment">// fall through</span>00323                 }00324                 <span class="keywordflow">case</span> BODY:00325                         m_lengthRemaining -= m_queue.TransferTo(CurrentTarget(), m_lengthRemaining);00326 00327                         <span class="keywordflow">if</span> (m_lengthRemaining == 0)00328                                 m_state = IDENTIFIER;00329                 }00330 00331                 <span class="keywordflow">if</span> (m_state == IDENTIFIER &amp;&amp; m_level == 0)00332                 {00333                         <span class="comment">// just finished processing a level 0 object</span>00334                         ++m_nCurrentObject;00335 00336                         <span class="keywordflow">if</span> (m_flags &amp; PUT_MESSANGE_END_AFTER_EACH_OBJECT)00337                                 <a class="code" href="class_filter.html#_zlib_decompressora8">AttachedTransformation</a>()-&gt;<a class="code" href="class_buffered_transformation.html#_zlib_decompressorz1_7">MessageEnd</a>();00338 00339                         <span class="keywordflow">if</span> (m_nCurrentObject == m_nObjects)00340                         {00341                                 <span class="keywordflow">if</span> (m_flags &amp; PUT_MESSANGE_END_AFTER_ALL_OBJECTS)00342                                         <a class="code" href="class_filter.html#_zlib_decompressora8">AttachedTransformation</a>()-&gt;<a class="code" href="class_buffered_transformation.html#_zlib_decompressorz1_7">MessageEnd</a>();00343 00344                                 <span class="keywordflow">if</span> (m_flags &amp; PUT_MESSANGE_SERIES_END_AFTER_ALL_OBJECTS)00345                                         <a class="code" href="class_filter.html#_zlib_decompressora8">AttachedTransformation</a>()-&gt;<a class="code" href="class_buffered_transformation.html#_windows_pipe_sinkz5_4">MessageSeriesEnd</a>();00346 00347                                 m_queue.TransferAllTo(*<a class="code" href="class_filter.html#_zlib_decompressora8">AttachedTransformation</a>());00348                                 <span class="keywordflow">return</span>;00349                         }00350                 }00351         }00352 }00353 00354 BERGeneralDecoder::BERGeneralDecoder(<a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &amp;inQueue, byte asnTag)00355         : m_inQueue(inQueue), m_finished(false)00356 {00357         byte b;00358         <span class="keywordflow">if</span> (!m_inQueue.Get(b) || b != asnTag)00359                 BERDecodeError();00360 00361         m_definiteLength = BERLengthDecode(m_inQueue, m_length);00362 }00363 00364 BERGeneralDecoder::BERGeneralDecoder(<a class="code" href="class_b_e_r_general_decoder.html">BERGeneralDecoder</a> &amp;inQueue, byte asnTag)00365         : m_inQueue(inQueue), m_finished(false)00366 {00367         byte b;00368         <span class="keywordflow">if</span> (!m_inQueue.Get(b) || b != asnTag)00369                 BERDecodeError();00370 00371         m_definiteLength = BERLengthDecode(m_inQueue, m_length);00372         <span class="keywordflow">if</span> (!m_definiteLength &amp;&amp; !(asnTag &amp; CONSTRUCTED))00373                 BERDecodeError();       <span class="comment">// cannot be primitive have indefinite length</span>00374 }00375 00376 BERGeneralDecoder::~BERGeneralDecoder()00377 {

⌨️ 快捷键说明

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