📄 asn_8cpp-source.html
字号:
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> &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 >> i) & 0x7f)));00202 bt.<a class="code" href="class_buffered_transformation.html#_zlib_decompressorz1_0">Put</a>((byte)(v & 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> &bt, <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> &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 <<= 7;00216 v += b & 0x7f;00217 <span class="keywordflow">if</span> (!(b & 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> &bt)<span class="keyword"> const</span>00223 <span class="keyword"></span>{00224 assert(m_values.size() >= 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<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> &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 < 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 > 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 > 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> &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> & EncodedObjectFilter::CurrentTarget()00271 {00272 <span class="keywordflow">if</span> (m_flags & 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>()-><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 > 0 && m_id == 0 && m_queue.Peek(b) && 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 & CONSTRUCTED) || definiteLength))00313 BERDecodeError();00314 <span class="keywordflow">if</span> (!definiteLength)00315 {00316 <span class="keywordflow">if</span> (!(m_id & 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 && 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 & PUT_MESSANGE_END_AFTER_EACH_OBJECT)00337 <a class="code" href="class_filter.html#_zlib_decompressora8">AttachedTransformation</a>()-><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 & PUT_MESSANGE_END_AFTER_ALL_OBJECTS)00342 <a class="code" href="class_filter.html#_zlib_decompressora8">AttachedTransformation</a>()-><a class="code" href="class_buffered_transformation.html#_zlib_decompressorz1_7">MessageEnd</a>();00343 00344 <span class="keywordflow">if</span> (m_flags & PUT_MESSANGE_SERIES_END_AFTER_ALL_OBJECTS)00345 <a class="code" href="class_filter.html#_zlib_decompressora8">AttachedTransformation</a>()-><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> &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> &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 && !(asnTag & 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 + -