📄 filters_8cpp-source.html
字号:
00480 <span class="keywordtype">bool</span> isBlockCipher = (c.MandatoryBlockSize() > 1 && c.MinLastBlockSize() == 0);00481 00482 <span class="keywordflow">if</span> (padding == DEFAULT_PADDING)00483 {00484 <span class="keywordflow">if</span> (isBlockCipher)00485 m_padding = PKCS_PADDING;00486 <span class="keywordflow">else</span>00487 m_padding = NO_PADDING;00488 }00489 <span class="keywordflow">else</span>00490 m_padding = padding;00491 00492 <span class="keywordflow">if</span> (!isBlockCipher && (m_padding == PKCS_PADDING || m_padding == ONE_AND_ZEROS_PADDING))00493 <span class="keywordflow">throw</span> <a class="code" href="class_invalid_argument.html">InvalidArgument</a>(<span class="stringliteral">"StreamTransformationFilter: PKCS_PADDING and ONE_AND_ZEROS_PADDING cannot be used with "</span> + c.AlgorithmName());00494 }00495 00496 <span class="keywordtype">void</span> StreamTransformationFilter::FirstPut(<span class="keyword">const</span> byte *inString)00497 {00498 m_optimalBufferSize = m_cipher.<a class="code" href="class_stream_transformation.html#_symmetric_ciphera2">OptimalBlockSize</a>();00499 m_optimalBufferSize = STDMAX(m_optimalBufferSize, RoundDownToMultipleOf(4096U, m_optimalBufferSize));00500 }00501 00502 <span class="keywordtype">void</span> StreamTransformationFilter::NextPutMultiple(<span class="keyword">const</span> byte *inString, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> length)00503 {00504 <span class="keywordflow">if</span> (!length)00505 <span class="keywordflow">return</span>;00506 00507 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> s = m_cipher.<a class="code" href="class_stream_transformation.html#_symmetric_ciphera1">MandatoryBlockSize</a>();00508 00509 <span class="keywordflow">do</span>00510 {00511 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> len = m_optimalBufferSize;00512 byte *space = HelpCreatePutSpace(*<a class="code" href="class_filter.html#_zlib_decompressora8">AttachedTransformation</a>(), NULL_CHANNEL, s, length, len);00513 <span class="keywordflow">if</span> (len < length)00514 {00515 <span class="keywordflow">if</span> (len == m_optimalBufferSize)00516 len -= m_cipher.<a class="code" href="class_stream_transformation.html#_symmetric_ciphera3">GetOptimalBlockSizeUsed</a>();00517 len = RoundDownToMultipleOf(len, s);00518 }00519 <span class="keywordflow">else</span>00520 len = length;00521 m_cipher.<a class="code" href="class_stream_transformation.html#_symmetric_ciphera8">ProcessString</a>(space, inString, len);00522 <a class="code" href="class_filter.html#_zlib_decompressora8">AttachedTransformation</a>()-><a class="code" href="class_buffered_transformation.html#_zlib_decompressorz1_6">PutModifiable</a>(space, len);00523 inString += len;00524 length -= len;00525 }00526 <span class="keywordflow">while</span> (length > 0);00527 }00528 00529 <span class="keywordtype">void</span> StreamTransformationFilter::NextPutModifiable(byte *inString, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> length)00530 {00531 m_cipher.<a class="code" href="class_stream_transformation.html#_symmetric_ciphera8">ProcessString</a>(inString, length);00532 <a class="code" href="class_filter.html#_zlib_decompressora8">AttachedTransformation</a>()-><a class="code" href="class_buffered_transformation.html#_zlib_decompressorz1_6">PutModifiable</a>(inString, length);00533 }00534 00535 <span class="keywordtype">void</span> StreamTransformationFilter::LastPut(<span class="keyword">const</span> byte *inString, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> length)00536 {00537 byte *space = NULL;00538 00539 <span class="keywordflow">switch</span> (m_padding)00540 {00541 <span class="keywordflow">case</span> NO_PADDING:00542 <span class="keywordflow">case</span> ZEROS_PADDING:00543 <span class="keywordflow">if</span> (length > 0)00544 {00545 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> minLastBlockSize = m_cipher.<a class="code" href="class_stream_transformation.html#_symmetric_ciphera7">MinLastBlockSize</a>();00546 <span class="keywordtype">bool</span> isForwardTransformation = m_cipher.<a class="code" href="class_stream_transformation.html#_symmetric_ciphera14">IsForwardTransformation</a>();00547 00548 <span class="keywordflow">if</span> (isForwardTransformation && m_padding == ZEROS_PADDING && (minLastBlockSize == 0 || length < minLastBlockSize))00549 {00550 <span class="comment">// do padding</span>00551 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> blockSize = STDMAX(minLastBlockSize, m_cipher.<a class="code" href="class_stream_transformation.html#_symmetric_ciphera1">MandatoryBlockSize</a>());00552 space = HelpCreatePutSpace(*<a class="code" href="class_filter.html#_zlib_decompressora8">AttachedTransformation</a>(), NULL_CHANNEL, blockSize);00553 memcpy(space, inString, length);00554 memset(space + length, 0, blockSize - length);00555 m_cipher.<a class="code" href="class_stream_transformation.html#_symmetric_ciphera6">ProcessLastBlock</a>(space, space, blockSize);00556 <a class="code" href="class_filter.html#_zlib_decompressora8">AttachedTransformation</a>()-><a class="code" href="class_buffered_transformation.html#_zlib_decompressorz1_0">Put</a>(space, blockSize);00557 }00558 <span class="keywordflow">else</span>00559 {00560 <span class="keywordflow">if</span> (minLastBlockSize == 0)00561 {00562 <span class="keywordflow">if</span> (isForwardTransformation)00563 <span class="keywordflow">throw</span> <a class="code" href="class_invalid_data_format.html">InvalidDataFormat</a>(<span class="stringliteral">"StreamTransformationFilter: plaintext length is not a multiple of block size and NO_PADDING is specified"</span>);00564 <span class="keywordflow">else</span>00565 <span class="keywordflow">throw</span> <a class="code" href="class_invalid_ciphertext.html">InvalidCiphertext</a>(<span class="stringliteral">"StreamTransformationFilter: ciphertext length is not a multiple of block size"</span>);00566 }00567 00568 space = HelpCreatePutSpace(*<a class="code" href="class_filter.html#_zlib_decompressora8">AttachedTransformation</a>(), NULL_CHANNEL, length, m_optimalBufferSize);00569 m_cipher.<a class="code" href="class_stream_transformation.html#_symmetric_ciphera6">ProcessLastBlock</a>(space, inString, length);00570 <a class="code" href="class_filter.html#_zlib_decompressora8">AttachedTransformation</a>()-><a class="code" href="class_buffered_transformation.html#_zlib_decompressorz1_0">Put</a>(space, length);00571 }00572 }00573 <span class="keywordflow">break</span>;00574 00575 <span class="keywordflow">case</span> PKCS_PADDING:00576 <span class="keywordflow">case</span> ONE_AND_ZEROS_PADDING:00577 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> s;00578 s = m_cipher.<a class="code" href="class_stream_transformation.html#_symmetric_ciphera1">MandatoryBlockSize</a>();00579 assert(s > 1);00580 space = HelpCreatePutSpace(*<a class="code" href="class_filter.html#_zlib_decompressora8">AttachedTransformation</a>(), NULL_CHANNEL, s, m_optimalBufferSize);00581 <span class="keywordflow">if</span> (m_cipher.<a class="code" href="class_stream_transformation.html#_symmetric_ciphera14">IsForwardTransformation</a>())00582 {00583 assert(length < s);00584 memcpy(space, inString, length);00585 <span class="keywordflow">if</span> (m_padding == PKCS_PADDING)00586 {00587 assert(s < 256);00588 byte pad = s-length;00589 memset(space+length, pad, s-length);00590 }00591 <span class="keywordflow">else</span>00592 {00593 space[length] = 1;00594 memset(space+length+1, 0, s-length-1);00595 }00596 m_cipher.<a class="code" href="class_stream_transformation.html#_symmetric_ciphera5">ProcessData</a>(space, space, s);00597 <a class="code" href="class_filter.html#_zlib_decompressora8">AttachedTransformation</a>()-><a class="code" href="class_buffered_transformation.html#_zlib_decompressorz1_0">Put</a>(space, s);00598 }00599 <span class="keywordflow">else</span>00600 {00601 <span class="keywordflow">if</span> (length != s)00602 <span class="keywordflow">throw</span> <a class="code" href="class_invalid_ciphertext.html">InvalidCiphertext</a>(<span class="stringliteral">"StreamTransformationFilter: ciphertext length is not a multiple of block size"</span>);00603 m_cipher.<a class="code" href="class_stream_transformation.html#_symmetric_ciphera5">ProcessData</a>(space, inString, s);00604 <span class="keywordflow">if</span> (m_padding == PKCS_PADDING)00605 {00606 byte pad = space[s-1];00607 <span class="keywordflow">if</span> (pad < 1 || pad > s || std::find_if(space+s-pad, space+s, std::bind2nd(std::not_equal_to<byte>(), pad)) != space+s)00608 <span class="keywordflow">throw</span> <a class="code" href="class_invalid_ciphertext.html">InvalidCiphertext</a>(<span class="stringliteral">"StreamTransformationFilter: invalid PKCS #7 block padding found"</span>);00609 length = s-pad;00610 }00611 <span class="keywordflow">else</span>00612 {00613 <span class="keywordflow">while</span> (length > 1 && space[length-1] == <span class="charliteral">'\0'</span>)00614 --length;00615 <span class="keywordflow">if</span> (space[--length] != <span class="charliteral">'\1'</span>)00616 <span class="keywordflow">throw</span> <a class="code" href="class_invalid_ciphertext.html">InvalidCiphertext</a>(<span class="stringliteral">"StreamTransformationFilter: invalid ones-and-zeros padding found"</span>);00617 }00618 <a class="code" href="class_filter.html#_zlib_decompressora8">AttachedTransformation</a>()-><a class="code" href="class_buffered_transformation.html#_zlib_decompressorz1_0">Put</a>(space, length);00619 }00620 <span class="keywordflow">break</span>;00621 00622 <span class="keywordflow">default</span>:00623 assert(<span class="keyword">false</span>);00624 }00625 }00626 00627 <span class="comment">// *************************************************************</span>00628 00629 <span class="keywordtype">void</span> HashFilter::IsolatedInitialize(<span class="keyword">const</span> <a class="code" href="class_name_value_pairs.html">NameValuePairs</a> &parameters)00630 {00631 m_putMessage = parameters.<a class="code" href="class_name_value_pairs.html#_x_t_r___d_ha40">GetValueWithDefault</a>(Name::PutMessage(), <span class="keyword">false</span>);00632 m_hashModule.<a class="code" href="class_hash_transformation.html#_x_m_a_c_ca8">Restart</a>();00633 }00634 <a name="l00635"></a><a class="code" href="class_hash_filter.html#_hash_filtera2">00635</a> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="class_hash_filter.html#_hash_filtera2">HashFilter::Put2</a>(<span class="keyword">const</span> byte *inString, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> length, <span class="keywordtype">int</span> messageEnd, <span class="keywordtype">bool</span> blocking)00636 {00637 FILTER_BEGIN;00638 m_hashModule.<a class="code" href="class_hash_transformation.html#_x_m_a_c_ca5">Update</a>(inString, length);00639 <span class="keywordflow">if</span> (m_putMessage)00640 FILTER_OUTPUT(1, inString, length, 0);00641 <span class="keywordflow">if</span> (messageEnd)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -