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

📄 validat1_8cpp-source.html

📁 Crypto++是一个非常强大的密码学库,主要是功能全
💻 HTML
📖 第 1 页 / 共 5 页
字号:
00314         }00315 <span class="preprocessor">#else</span>00316 <span class="preprocessor"></span>        cout &lt;&lt; <span class="stringliteral">"\nNo operating system provided nonblocking random number generator, skipping test."</span> &lt;&lt; endl;00317 <span class="preprocessor">#endif</span>00318 <span class="preprocessor"></span>00319         <span class="keywordflow">return</span> pass;00320 }00321 00322 <span class="comment">// VC50 workaround</span>00323 <span class="keyword">typedef</span> auto_ptr&lt;BlockTransformation&gt; apbt;00324 00325 <span class="keyword">class </span>CipherFactory00326 {00327 <span class="keyword">public</span>:00328         <span class="keyword">virtual</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="namespace_name.html#a9">BlockSize</a>() <span class="keyword">const</span> =0;00329         <span class="keyword">virtual</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> KeyLength() <span class="keyword">const</span> =0;00330 00331         <span class="keyword">virtual</span> apbt NewEncryption(<span class="keyword">const</span> byte *key) <span class="keyword">const</span> =0;00332         <span class="keyword">virtual</span> apbt NewDecryption(<span class="keyword">const</span> byte *key) <span class="keyword">const</span> =0;00333 };00334 00335 <span class="keyword">template</span> &lt;<span class="keyword">class</span> E, <span class="keyword">class</span> D&gt; <span class="keyword">class </span>FixedRoundsCipherFactory : <span class="keyword">public</span> CipherFactory00336 {00337 <span class="keyword">public</span>:00338         FixedRoundsCipherFactory(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> keylen=0) : m_keylen(keylen?keylen:E::DEFAULT_KEYLENGTH) {}00339         <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="namespace_name.html#a9">BlockSize</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> E::BLOCKSIZE;}00340         <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> KeyLength()<span class="keyword"> const </span>{<span class="keywordflow">return</span> m_keylen;}00341 00342         apbt NewEncryption(<span class="keyword">const</span> byte *key)<span class="keyword"> const</span>00343 <span class="keyword">                </span>{<span class="keywordflow">return</span> apbt(<span class="keyword">new</span> E(key, m_keylen));}00344         apbt NewDecryption(<span class="keyword">const</span> byte *key)<span class="keyword"> const</span>00345 <span class="keyword">                </span>{<span class="keywordflow">return</span> apbt(<span class="keyword">new</span> D(key, m_keylen));}00346 00347         <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> m_keylen;00348 };00349 00350 <span class="keyword">template</span> &lt;<span class="keyword">class</span> E, <span class="keyword">class</span> D&gt; <span class="keyword">class </span>VariableRoundsCipherFactory : <span class="keyword">public</span> CipherFactory00351 {00352 <span class="keyword">public</span>:00353         VariableRoundsCipherFactory(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> keylen=0, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> rounds=0)00354                 : m_keylen(keylen ? keylen : E::DEFAULT_KEYLENGTH), m_rounds(rounds ? rounds : E::DEFAULT_ROUNDS) {}00355         <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="namespace_name.html#a9">BlockSize</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> E::BLOCKSIZE;}00356         <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> KeyLength()<span class="keyword"> const </span>{<span class="keywordflow">return</span> m_keylen;}00357 00358         apbt NewEncryption(<span class="keyword">const</span> byte *key)<span class="keyword"> const</span>00359 <span class="keyword">                </span>{<span class="keywordflow">return</span> apbt(<span class="keyword">new</span> E(key, m_keylen, m_rounds));}00360         apbt NewDecryption(<span class="keyword">const</span> byte *key)<span class="keyword"> const</span>00361 <span class="keyword">                </span>{<span class="keywordflow">return</span> apbt(<span class="keyword">new</span> D(key, m_keylen, m_rounds));}00362 00363         <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> m_keylen, m_rounds;00364 };00365 00366 <span class="keywordtype">bool</span> BlockTransformationTest(<span class="keyword">const</span> CipherFactory &amp;cg, <a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &amp;valdata, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> tuples = 0xffff)00367 {00368         <a class="code" href="class_hex_encoder.html">HexEncoder</a> output(<span class="keyword">new</span> <a class="code" href="class_file_sink.html">FileSink</a>(cout));00369         <a class="code" href="class_sec_block.html">SecByteBlock</a> plain(cg.BlockSize()), cipher(cg.BlockSize()), out(cg.BlockSize()), outplain(cg.BlockSize());00370         <a class="code" href="class_sec_block.html">SecByteBlock</a> key(cg.KeyLength());00371         <span class="keywordtype">bool</span> pass=<span class="keyword">true</span>, fail;00372 00373         <span class="keywordflow">while</span> (valdata.<a class="code" href="class_buffered_transformation.html#_zlib_decompressorz7_0">MaxRetrievable</a>() &amp;&amp; tuples--)00374         {00375                 valdata.<a class="code" href="class_buffered_transformation.html#_zlib_decompressorz7_2">Get</a>(key, cg.KeyLength());00376                 valdata.<a class="code" href="class_buffered_transformation.html#_zlib_decompressorz7_2">Get</a>(plain, cg.BlockSize());00377                 valdata.<a class="code" href="class_buffered_transformation.html#_zlib_decompressorz7_2">Get</a>(cipher, cg.BlockSize());00378 00379                 apbt transE = cg.NewEncryption(key);00380                 transE-&gt;ProcessBlock(plain, out);00381                 fail = memcmp(out, cipher, cg.BlockSize()) != 0;00382 00383                 apbt transD = cg.NewDecryption(key);00384                 transD-&gt;ProcessBlock(out, outplain);00385                 fail=fail || memcmp(outplain, plain, cg.BlockSize());00386 00387                 pass = pass &amp;&amp; !fail;00388 00389                 cout &lt;&lt; (fail ? <span class="stringliteral">"FAILED   "</span> : <span class="stringliteral">"passed   "</span>);00390                 output.<a class="code" href="class_buffered_transformation.html#_zlib_decompressorz1_0">Put</a>(key, cg.KeyLength());00391                 cout &lt;&lt; <span class="stringliteral">"   "</span>;00392                 output.<a class="code" href="class_buffered_transformation.html#_zlib_decompressorz1_0">Put</a>(outplain, cg.BlockSize());00393                 cout &lt;&lt; <span class="stringliteral">"   "</span>;00394                 output.<a class="code" href="class_buffered_transformation.html#_zlib_decompressorz1_0">Put</a>(out, cg.BlockSize());00395                 cout &lt;&lt; endl;00396         }00397         <span class="keywordflow">return</span> pass;00398 }00399 00400 <span class="keyword">class </span>FilterTester : <span class="keyword">public</span> Unflushable&lt;Sink&gt;00401 {00402 <span class="keyword">public</span>:00403         FilterTester(<span class="keyword">const</span> byte *validOutput, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> outputLen)00404                 : validOutput(validOutput), outputLen(outputLen), counter(0), fail(false) {}00405         <span class="keywordtype">void</span> PutByte(byte inByte)00406         {00407                 <span class="keywordflow">if</span> (counter &gt;= outputLen || validOutput[counter] != inByte)00408                 {00409                         fail = <span class="keyword">true</span>;00410                         assert(<span class="keyword">false</span>);00411                 }00412                 counter++;00413         }00414         <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> Put2(<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)00415         {00416                 <span class="keywordflow">while</span> (length--)00417                         FilterTester::PutByte(*inString++);00418 00419                 <span class="keywordflow">if</span> (messageEnd)00420                         <span class="keywordflow">if</span> (counter != outputLen)00421                         {00422                                 fail = <span class="keyword">true</span>;00423                                 assert(<span class="keyword">false</span>);00424                         }00425 00426                 <span class="keywordflow">return</span> 0;00427         }00428         <span class="keywordtype">bool</span> GetResult()00429         {00430                 <span class="keywordflow">return</span> !fail;00431         }00432 00433         <span class="keyword">const</span> byte *validOutput;00434         <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> outputLen, counter;00435         <span class="keywordtype">bool</span> fail;00436 };00437 00438 <span class="keywordtype">bool</span> TestFilter(<a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &amp;bt, <span class="keyword">const</span> byte *in, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> inLen, <span class="keyword">const</span> byte *out, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> outLen)00439 {00440         FilterTester *ft;00441         bt.<a class="code" href="class_buffered_transformation.html#_zlib_decompressorz15_0">Attach</a>(ft = <span class="keyword">new</span> FilterTester(out, outLen));00442 00443         <span class="keywordflow">while</span> (inLen)00444         {00445                 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> randomLen = GlobalRNG().<a class="code" href="class_random_number_generator.html#_x917_r_n_ga3">GenerateWord32</a>(0, inLen);00446                 bt.<a class="code" href="class_buffered_transformation.html#_zlib_decompressorz1_0">Put</a>(in, randomLen);00447                 in += randomLen;00448                 inLen -= randomLen;00449         }00450         bt.<a class="code" href="class_buffered_transformation.html#_zlib_decompressorz1_7">MessageEnd</a>();00451         <span class="keywordflow">return</span> ft-&gt;GetResult();00452 }00453 00454 <span class="keywordtype">bool</span> ValidateDES()00455 {00456         cout &lt;&lt; <span class="stringliteral">"\nDES validation suite running...\n\n"</span>;00457 00458         <a class="code" href="class_file_source.html">FileSource</a> valdata(<span class="stringliteral">"descert.dat"</span>, <span class="keyword">true</span>, <span class="keyword">new</span> <a class="code" href="class_hex_decoder.html">HexDecoder</a>);00459         <span class="keywordtype">bool</span> pass = BlockTransformationTest(FixedRoundsCipherFactory&lt;DESEncryption, DESDecryption&gt;(), valdata);00460 00461         cout &lt;&lt; <span class="stringliteral">"\nTesting EDE2, EDE3, and XEX3 variants...\n\n"</span>;00462 00463         <a class="code" href="class_file_source.html">FileSource</a> valdata1(<span class="stringliteral">"3desval.dat"</span>, <span class="keyword">true</span>, <span class="keyword">new</span> <a class="code" href="class_hex_decoder.html">HexDecoder</a>);00464         pass = BlockTransformationTest(FixedRoundsCipherFactory&lt;DES_EDE2_Encryption, DES_EDE2_Decryption&gt;(), valdata1, 1) &amp;&amp; pass;00465         pass = BlockTransformationTest(FixedRoundsCipherFactory&lt;DES_EDE3_Encryption, DES_EDE3_Decryption&gt;(), valdata1, 1) &amp;&amp; pass;00466         pass = BlockTransformationTest(FixedRoundsCipherFactory&lt;DES_XEX3_Encryption, DES_XEX3_Decryption&gt;(), valdata1, 1) &amp;&amp; pass;00467 00468         <span class="keywordflow">return</span> pass;00469 }00470 00471 <span class="keywordtype">bool</span> TestModeIV(<a class="code" href="class_symmetric_cipher.html">SymmetricCipher</a> &amp;e, <a class="code" href="class_symmetric_cipher.html">SymmetricCipher</a> &amp;d)00472 {00473         <a class="code" href="class_sec_block.html">SecByteBlock</a> lastIV;

⌨️ 快捷键说明

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