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

📄 filters_8cpp-source.html

📁 Crypto++是一个非常强大的密码学库,主要是功能全
💻 HTML
📖 第 1 页 / 共 5 页
字号:
00480         <span class="keywordtype">bool</span> isBlockCipher = (c.MandatoryBlockSize() &gt; 1 &amp;&amp; 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 &amp;&amp; (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 &lt; 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>()-&gt;<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 &gt; 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>()-&gt;<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 &gt; 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 &amp;&amp; m_padding == ZEROS_PADDING &amp;&amp; (minLastBlockSize == 0 || length &lt; 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>()-&gt;<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>()-&gt;<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 &gt; 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 &lt; s);00584                         memcpy(space, inString, length);00585                         <span class="keywordflow">if</span> (m_padding == PKCS_PADDING)00586                         {00587                                 assert(s &lt; 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>()-&gt;<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 &lt; 1 || pad &gt; s || std::find_if(space+s-pad, space+s, std::bind2nd(std::not_equal_to&lt;byte&gt;(), 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 &gt; 1 &amp;&amp; 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>()-&gt;<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> &amp;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 + -