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

📄 asn_8cpp-source.html

📁 著名的密码库Crypto++的文档 C++语言的杰作。程序员必备。
💻 HTML
📖 第 1 页 / 共 5 页
字号:
<a name="l00216"></a>00216 }<a name="l00217"></a>00217 <a name="l00218"></a>00218 <span class="keywordtype">void</span> OID::EncodeValue(<a class="code" href="class_buffered_transformation.html" title="interface for buffered transformations">BufferedTransformation</a> &amp;bt, word32 v)<a name="l00219"></a>00219 {<a name="l00220"></a>00220         <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)<a name="l00221"></a>00221                 bt.<a class="code" href="class_buffered_transformation.html#e70658b0d271f8e114ac6c3cc9774ede" title="input a byte for processing">Put</a>((byte)(0x80 | ((v &gt;&gt; i) &amp; 0x7f)));<a name="l00222"></a>00222         bt.<a class="code" href="class_buffered_transformation.html#e70658b0d271f8e114ac6c3cc9774ede" title="input a byte for processing">Put</a>((byte)(v &amp; 0x7f));<a name="l00223"></a>00223 }<a name="l00224"></a>00224 <a name="l00225"></a>00225 <span class="keywordtype">size_t</span> OID::DecodeValue(<a class="code" href="class_buffered_transformation.html" title="interface for buffered transformations">BufferedTransformation</a> &amp;bt, word32 &amp;v)<a name="l00226"></a>00226 {<a name="l00227"></a>00227         byte b;<a name="l00228"></a>00228         <span class="keywordtype">size_t</span> i=0;<a name="l00229"></a>00229         v = 0;<a name="l00230"></a>00230         <span class="keywordflow">while</span> (<span class="keyword">true</span>)<a name="l00231"></a>00231         {<a name="l00232"></a>00232                 <span class="keywordflow">if</span> (!bt.<a class="code" href="class_buffered_transformation.html#9e1ad913c8fe697d269f408a7d5928fc" title="try to retrieve a single byte">Get</a>(b))<a name="l00233"></a>00233                         BERDecodeError();<a name="l00234"></a>00234                 i++;<a name="l00235"></a>00235                 v &lt;&lt;= 7;<a name="l00236"></a>00236                 v += b &amp; 0x7f;<a name="l00237"></a>00237                 <span class="keywordflow">if</span> (!(b &amp; 0x80))<a name="l00238"></a>00238                         <span class="keywordflow">return</span> i;<a name="l00239"></a>00239         }<a name="l00240"></a>00240 }<a name="l00241"></a>00241 <a name="l00242"></a><a class="code" href="class_o_i_d.html#bd0adbb886e0f33f9017ab234b831ab7">00242</a> <span class="keywordtype">void</span> <a class="code" href="class_o_i_d.html#bd0adbb886e0f33f9017ab234b831ab7">OID::DEREncode</a>(<a class="code" href="class_buffered_transformation.html" title="interface for buffered transformations">BufferedTransformation</a> &amp;bt)<span class="keyword"> const</span><a name="l00243"></a>00243 <span class="keyword"></span>{<a name="l00244"></a>00244         assert(<a class="code" href="class_o_i_d.html#93dfb8399e6a30832dc7eebd2e602997">m_values</a>.size() &gt;= 2);<a name="l00245"></a>00245         <a class="code" href="class_byte_queue.html" title="Byte Queue.">ByteQueue</a> temp;<a name="l00246"></a>00246         temp.Put(byte(<a class="code" href="class_o_i_d.html#93dfb8399e6a30832dc7eebd2e602997">m_values</a>[0] * 40 + <a class="code" href="class_o_i_d.html#93dfb8399e6a30832dc7eebd2e602997">m_values</a>[1]));<a name="l00247"></a>00247         <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i=2; i&lt;<a class="code" href="class_o_i_d.html#93dfb8399e6a30832dc7eebd2e602997">m_values</a>.size(); i++)<a name="l00248"></a>00248                 EncodeValue(temp, <a class="code" href="class_o_i_d.html#93dfb8399e6a30832dc7eebd2e602997">m_values</a>[i]);<a name="l00249"></a>00249         bt.<a class="code" href="class_buffered_transformation.html#e70658b0d271f8e114ac6c3cc9774ede" title="input a byte for processing">Put</a>(OBJECT_IDENTIFIER);<a name="l00250"></a>00250         DERLengthEncode(bt, temp.CurrentSize());<a name="l00251"></a>00251         temp.TransferTo(bt);<a name="l00252"></a>00252 }<a name="l00253"></a>00253 <a name="l00254"></a><a class="code" href="class_o_i_d.html#f6953d01afcf947c3e869b089fedf550">00254</a> <span class="keywordtype">void</span> <a class="code" href="class_o_i_d.html#f6953d01afcf947c3e869b089fedf550">OID::BERDecode</a>(<a class="code" href="class_buffered_transformation.html" title="interface for buffered transformations">BufferedTransformation</a> &amp;bt)<a name="l00255"></a>00255 {<a name="l00256"></a>00256         byte b;<a name="l00257"></a>00257         <span class="keywordflow">if</span> (!bt.<a class="code" href="class_buffered_transformation.html#9e1ad913c8fe697d269f408a7d5928fc" title="try to retrieve a single byte">Get</a>(b) || b != OBJECT_IDENTIFIER)<a name="l00258"></a>00258                 BERDecodeError();<a name="l00259"></a>00259 <a name="l00260"></a>00260         <span class="keywordtype">size_t</span> length;<a name="l00261"></a>00261         <span class="keywordflow">if</span> (!BERLengthDecode(bt, length) || length &lt; 1)<a name="l00262"></a>00262                 BERDecodeError();<a name="l00263"></a>00263 <a name="l00264"></a>00264         <span class="keywordflow">if</span> (!bt.<a class="code" href="class_buffered_transformation.html#9e1ad913c8fe697d269f408a7d5928fc" title="try to retrieve a single byte">Get</a>(b))<a name="l00265"></a>00265                 BERDecodeError();<a name="l00266"></a>00266         <a name="l00267"></a>00267         length--;<a name="l00268"></a>00268         <a class="code" href="class_o_i_d.html#93dfb8399e6a30832dc7eebd2e602997">m_values</a>.resize(2);<a name="l00269"></a>00269         <a class="code" href="class_o_i_d.html#93dfb8399e6a30832dc7eebd2e602997">m_values</a>[0] = b / 40;<a name="l00270"></a>00270         <a class="code" href="class_o_i_d.html#93dfb8399e6a30832dc7eebd2e602997">m_values</a>[1] = b % 40;<a name="l00271"></a>00271 <a name="l00272"></a>00272         <span class="keywordflow">while</span> (length &gt; 0)<a name="l00273"></a>00273         {<a name="l00274"></a>00274                 word32 v;<a name="l00275"></a>00275                 <span class="keywordtype">size_t</span> valueLen = DecodeValue(bt, v);<a name="l00276"></a>00276                 <span class="keywordflow">if</span> (valueLen &gt; length)<a name="l00277"></a>00277                         BERDecodeError();<a name="l00278"></a>00278                 <a class="code" href="class_o_i_d.html#93dfb8399e6a30832dc7eebd2e602997">m_values</a>.push_back(v);<a name="l00279"></a>00279                 length -= valueLen;<a name="l00280"></a>00280         }<a name="l00281"></a>00281 }<a name="l00282"></a>00282 <a name="l00283"></a><a class="code" href="class_o_i_d.html#525fbe10cb64751914dd6316ab5ea047">00283</a> <span class="keywordtype">void</span> <a class="code" href="class_o_i_d.html#525fbe10cb64751914dd6316ab5ea047">OID::BERDecodeAndCheck</a>(<a class="code" href="class_buffered_transformation.html" title="interface for buffered transformations">BufferedTransformation</a> &amp;bt)<span class="keyword"> const</span><a name="l00284"></a>00284 <span class="keyword"></span>{<a name="l00285"></a>00285         <a class="code" href="class_o_i_d.html" title="Object Identifier.">OID</a> oid(bt);<a name="l00286"></a>00286         <span class="keywordflow">if</span> (*<span class="keyword">this</span> != oid)<a name="l00287"></a>00287                 BERDecodeError();<a name="l00288"></a>00288 }<a name="l00289"></a>00289 <a name="l00290"></a>00290 <span class="keyword">inline</span> <a class="code" href="class_buffered_transformation.html" title="interface for buffered transformations">BufferedTransformation</a> &amp; EncodedObjectFilter::CurrentTarget()<a name="l00291"></a>00291 {<a name="l00292"></a>00292         <span class="keywordflow">if</span> (m_flags &amp; <a class="code" href="class_encoded_object_filter.html#79e83aa124d042a26fba07ca3ede9d08d15616e9c6ca1060eef75928b433e83d">PUT_OBJECTS</a>) <a name="l00293"></a>00293                 <span class="keywordflow">return</span> *<a class="code" href="class_filter.html#c8fc888888b2dad88bf64fc703044a93" title="returns the object immediately attached to this object or NULL for no attachment">AttachedTransformation</a>();<a name="l00294"></a>00294         <span class="keywordflow">else</span><a name="l00295"></a>00295                 <span class="keywordflow">return</span> TheBitBucket();<a name="l00296"></a>00296 }<a name="l00297"></a>00297 <a name="l00298"></a><a class="code" href="class_encoded_object_filter.html#ecdfd9aa4a927b559472d80339bfb9c1">00298</a> <span class="keywordtype">void</span> <a class="code" href="class_encoded_object_filter.html#ecdfd9aa4a927b559472d80339bfb9c1">EncodedObjectFilter::Put</a>(<span class="keyword">const</span> byte *inString, <span class="keywordtype">size_t</span> length)<a name="l00299"></a>00299 {<a name="l00300"></a>00300         <span class="keywordflow">if</span> (m_nCurrentObject == m_nObjects)<a name="l00301"></a>00301         {<a name="l00302"></a>00302                 <a class="code" href="class_filter.html#c8fc888888b2dad88bf64fc703044a93" title="returns the object immediately attached to this object or NULL for no attachment">AttachedTransformation</a>()-&gt;<a class="code" href="class_buffered_transformation.html#e70658b0d271f8e114ac6c3cc9774ede" title="input a byte for processing">Put</a>(inString, length);<a name="l00303"></a>00303                 <span class="keywordflow">return</span>;<a name="l00304"></a>00304         }<a name="l00305"></a>00305 <a name="l00306"></a>00306         <a class="code" href="class_lazy_putter.html" title="use this to make sure LazyPut is finalized in event of exception">LazyPutter</a> lazyPutter(m_queue, inString, length);<a name="l00307"></a>00307 <a name="l00308"></a>00308         <span class="keywordflow">while</span> (m_queue.<a class="code" href="class_byte_queue.html#e0d701bf528a1131917b77c0bb3fb369" title="returns whether any bytes are currently ready for retrieval">AnyRetrievable</a>())<a name="l00309"></a>00309         {<a name="l00310"></a>00310                 <span class="keywordflow">switch</span> (m_state)<a name="l00311"></a>00311                 {<a name="l00312"></a>00312                 <span class="keywordflow">case</span> IDENTIFIER:<a name="l00313"></a>00313                         <span class="keywordflow">if</span> (!m_queue.<a class="code" href="class_byte_queue.html#19413e3aa72b749e3771d617e8eca632" title="try to retrieve a single byte">Get</a>(m_id))<a name="l00314"></a>00314                                 <span class="keywordflow">return</span>;<a name="l00315"></a>00315                         m_queue.<a class="code" href="class_buffered_transformation.html#91c4526148274ae9cb68803bb2d2a2aa" title="move transferMax bytes of the buffered output to target as input">TransferTo</a>(CurrentTarget(), 1);<a name="l00316"></a>00316                         m_state = LENGTH;       <span class="comment">// fall through</span><a name="l00317"></a>00317                 <span class="keywordflow">case</span> LENGTH:<a name="l00318"></a>00318                 {<a name="l00319"></a>00319                         byte b;<a name="l00320"></a>00320                         <span class="keywordflow">if</span> (m_level &gt; 0 &amp;&amp; m_id == 0 &amp;&amp; m_queue.<a class="code" href="class_byte_queue.html#67e9cc7f56a2be014ee4c9f033bb2ada" title="peek at the next byte without removing it from the output buffer">Peek</a>(b) &amp;&amp; b == 0)<a name="l00321"></a>00321                         {<a name="l00322"></a>00322                                 m_queue.<a class="code" href="class_buffered_transformation.html#91c4526148274ae9cb68803bb2d2a2aa" title="move transferMax bytes of the buffered output to target as input">TransferTo</a>(CurrentTarget(), 1);<a name="l00323"></a>00323                                 m_level--;<a name="l00324"></a>00324                                 m_state = IDENTIFIER;<a name="l00325"></a>00325                                 <span class="keywordflow">break</span>;<a name="l00326"></a>00326                         }<a name="l00327"></a>00327                         <a class="code" href="class_byte_queue_1_1_walker.html">ByteQueue::Walker</a> walker(m_queue);<a name="l00328"></a>00328                         <span class="keywordtype">bool</span> definiteLength;<a name="l00329"></a>00329                         <span class="keywordflow">if</span> (!BERLengthDecode(walker, m_lengthRemaining, definiteLength))<a name="l00330"></a>00330                                 <span class="keywordflow">return</span>;<a name="l00331"></a>00331                         m_queue.<a class="code" href="class_buffered_transformation.html#91c4526148274ae9cb68803bb2d2a2aa" title="move transferMax bytes of the buffered output to target as input">TransferTo</a>(CurrentTarget(), walker.<a class="code" href="class_byte_queue_1_1_walker.html#4ea60c7d732acbf91e4fb2b3bc3abaad">GetCurrentPosition</a>());<a name="l00332"></a>00332                         <span class="keywordflow">if</span> (!((m_id &amp; CONSTRUCTED) || definiteLength))<a name="l00333"></a>00333                                 BERDecodeError();

⌨️ 快捷键说明

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