📄 validat1_8cpp-source.html
字号:
<a name="l00331"></a>00331 cout << <span class="stringliteral">"passed:"</span>;<a name="l00332"></a>00332 cout << <span class="stringliteral">" "</span> << total << <span class="stringliteral">" generated bytes compressed to "</span> << (size_t)sink-><a class="code" href="class_array_sink.html#36374569bfaf3711c3a7a306a46ea6d9">TotalPutLength</a>() << <span class="stringliteral">" bytes by DEFLATE"</span> << endl;<a name="l00333"></a>00333 }<a name="l00334"></a>00334 <span class="keywordflow">else</span><a name="l00335"></a>00335 cout << <span class="stringliteral">"\nNo operating system provided blocking random number generator, skipping test."</span> << endl;<a name="l00336"></a>00336 <a name="l00337"></a>00337 rng.<a class="code" href="classmember__ptr.html#0191c833924d93e9093b07bab31010fe">reset</a>(NULL);<a name="l00338"></a>00338 <span class="preprocessor">#ifdef NONBLOCKING_RNG_AVAILABLE</span><a name="l00339"></a>00339 <span class="preprocessor"></span> <span class="keywordflow">try</span> {rng.<a class="code" href="classmember__ptr.html#0191c833924d93e9093b07bab31010fe">reset</a>(<span class="keyword">new</span> <a class="code" href="class_nonblocking_rng.html" title="encapsulate CryptoAPI's CryptGenRandom or /dev/urandom">NonblockingRng</a>);}<a name="l00340"></a>00340 <span class="keywordflow">catch</span> (<a class="code" href="class_o_s___r_n_g___err.html" title="Exception class for Operating-System Random Number Generator.">OS_RNG_Err</a> &) {}<a name="l00341"></a>00341 <span class="preprocessor">#endif</span><a name="l00342"></a>00342 <span class="preprocessor"></span><a name="l00343"></a>00343 <span class="keywordflow">if</span> (rng.<a class="code" href="classmember__ptr.html#2d10dec2a51691b589d56b71ec78e59a">get</a>())<a name="l00344"></a>00344 {<a name="l00345"></a>00345 cout << <span class="stringliteral">"\nTesting operating system provided nonblocking random number generator...\n\n"</span>;<a name="l00346"></a>00346 <a name="l00347"></a>00347 <a class="code" href="class_array_sink.html" title="Copy input to a memory buffer.">ArraySink</a> *sink;<a name="l00348"></a>00348 <a class="code" href="class_random_number_source.html" title="RNG-based implementation of Source interface.">RandomNumberSource</a> test(*rng, 100000, <span class="keyword">true</span>, <span class="keyword">new</span> <a class="code" href="class_deflator.html" title="DEFLATE (RFC 1951) compressor.">Deflator</a>(sink=<span class="keyword">new</span> <a class="code" href="class_array_sink.html" title="Copy input to a memory buffer.">ArraySink</a>(NULL, 0)));<a name="l00349"></a>00349 <a name="l00350"></a>00350 <span class="keywordflow">if</span> (sink-><a class="code" href="class_array_sink.html#36374569bfaf3711c3a7a306a46ea6d9">TotalPutLength</a>() < 100000)<a name="l00351"></a>00351 {<a name="l00352"></a>00352 cout << <span class="stringliteral">"FAILED:"</span>;<a name="l00353"></a>00353 pass = <span class="keyword">false</span>;<a name="l00354"></a>00354 }<a name="l00355"></a>00355 <span class="keywordflow">else</span><a name="l00356"></a>00356 cout << <span class="stringliteral">"passed:"</span>;<a name="l00357"></a>00357 cout << <span class="stringliteral">" 100000 generated bytes compressed to "</span> << (size_t)sink-><a class="code" href="class_array_sink.html#36374569bfaf3711c3a7a306a46ea6d9">TotalPutLength</a>() << <span class="stringliteral">" bytes by DEFLATE"</span> << endl;<a name="l00358"></a>00358 }<a name="l00359"></a>00359 <span class="keywordflow">else</span><a name="l00360"></a>00360 cout << <span class="stringliteral">"\nNo operating system provided nonblocking random number generator, skipping test."</span> << endl;<a name="l00361"></a>00361 <a name="l00362"></a>00362 <span class="keywordflow">return</span> pass;<a name="l00363"></a>00363 }<a name="l00364"></a>00364 <a name="l00365"></a>00365 <span class="comment">// VC50 workaround</span><a name="l00366"></a>00366 <span class="keyword">typedef</span> auto_ptr<BlockTransformation> apbt;<a name="l00367"></a>00367 <a name="l00368"></a><a class="code" href="class_cipher_factory.html">00368</a> <span class="keyword">class </span><a class="code" href="class_cipher_factory.html">CipherFactory</a><a name="l00369"></a>00369 {<a name="l00370"></a>00370 <span class="keyword">public</span>:<a name="l00371"></a>00371 <span class="keyword">virtual</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> BlockSize() <span class="keyword">const</span> =0;<a name="l00372"></a>00372 <span class="keyword">virtual</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> KeyLength() <span class="keyword">const</span> =0;<a name="l00373"></a>00373 <a name="l00374"></a>00374 <span class="keyword">virtual</span> apbt NewEncryption(<span class="keyword">const</span> byte *key) <span class="keyword">const</span> =0;<a name="l00375"></a>00375 <span class="keyword">virtual</span> apbt NewDecryption(<span class="keyword">const</span> byte *key) <span class="keyword">const</span> =0;<a name="l00376"></a>00376 };<a name="l00377"></a>00377 <a name="l00378"></a><a class="code" href="class_fixed_rounds_cipher_factory.html">00378</a> <span class="keyword">template</span> <<span class="keyword">class</span> E, <span class="keyword">class</span> D> <span class="keyword">class </span><a class="code" href="class_fixed_rounds_cipher_factory.html">FixedRoundsCipherFactory</a> : <span class="keyword">public</span> <a class="code" href="class_cipher_factory.html">CipherFactory</a><a name="l00379"></a>00379 {<a name="l00380"></a>00380 <span class="keyword">public</span>:<a name="l00381"></a><a class="code" href="class_fixed_rounds_cipher_factory.html#cee52fd2a76dc77f6d02e5fe08affa88">00381</a> <a class="code" href="class_fixed_rounds_cipher_factory.html#cee52fd2a76dc77f6d02e5fe08affa88">FixedRoundsCipherFactory</a>(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> keylen=0) : <a class="code" href="class_fixed_rounds_cipher_factory.html#25e5a44482e0b8011cf4356ab75f57ac">m_keylen</a>(keylen?keylen:E::DEFAULT_KEYLENGTH) {}<a name="l00382"></a><a class="code" href="class_fixed_rounds_cipher_factory.html#b769fbfa9132253631770a410a007c9c">00382</a> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="class_fixed_rounds_cipher_factory.html#b769fbfa9132253631770a410a007c9c">BlockSize</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> E::BLOCKSIZE;}<a name="l00383"></a><a class="code" href="class_fixed_rounds_cipher_factory.html#ac83502a42d49402741fbd6d731318ee">00383</a> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="class_fixed_rounds_cipher_factory.html#ac83502a42d49402741fbd6d731318ee">KeyLength</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> <a class="code" href="class_fixed_rounds_cipher_factory.html#25e5a44482e0b8011cf4356ab75f57ac">m_keylen</a>;}<a name="l00384"></a>00384 <a name="l00385"></a><a class="code" href="class_fixed_rounds_cipher_factory.html#5bb903c37685c6ec3a89d855be23926d">00385</a> apbt <a class="code" href="class_fixed_rounds_cipher_factory.html#5bb903c37685c6ec3a89d855be23926d">NewEncryption</a>(<span class="keyword">const</span> byte *key)<span class="keyword"> const</span><a name="l00386"></a>00386 <span class="keyword"> </span>{<span class="keywordflow">return</span> apbt(<span class="keyword">new</span> E(key, <a class="code" href="class_fixed_rounds_cipher_factory.html#25e5a44482e0b8011cf4356ab75f57ac">m_keylen</a>));}<a name="l00387"></a><a class="code" href="class_fixed_rounds_cipher_factory.html#13359a21647665e8ef98a9502abaab30">00387</a> apbt <a class="code" href="class_fixed_rounds_cipher_factory.html#13359a21647665e8ef98a9502abaab30">NewDecryption</a>(<span class="keyword">const</span> byte *key)<span class="keyword"> const</span><a name="l00388"></a>00388 <span class="keyword"> </span>{<span class="keywordflow">return</span> apbt(<span class="keyword">new</span> D(key, <a class="code" href="class_fixed_rounds_cipher_factory.html#25e5a44482e0b8011cf4356ab75f57ac">m_keylen</a>));}<a name="l00389"></a>00389 <a name="l00390"></a><a class="code" href="class_fixed_rounds_cipher_factory.html#25e5a44482e0b8011cf4356ab75f57ac">00390</a> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="class_fixed_rounds_cipher_factory.html#25e5a44482e0b8011cf4356ab75f57ac">m_keylen</a>;<a name="l00391"></a>00391 };<a name="l00392"></a>00392 <a name="l00393"></a><a class="code" href="class_variable_rounds_cipher_factory.html">00393</a> <span class="keyword">template</span> <<span class="keyword">class</span> E, <span class="keyword">class</span> D> <span class="keyword">class </span><a class="code" href="class_variable_rounds_cipher_factory.html">VariableRoundsCipherFactory</a> : <span class="keyword">public</span> <a class="code" href="class_cipher_factory.html">CipherFactory</a><a name="l00394"></a>00394 {<a name="l00395"></a>00395 <span class="keyword">public</span>:<a name="l00396"></a><a class="code" href="class_variable_rounds_cipher_factory.html#da38c98b445d8ac28802b3358ec8bb02">00396</a> <a class="code" href="class_variable_rounds_cipher_factory.html#da38c98b445d8ac28802b3358ec8bb02">VariableRoundsCipherFactory</a>(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> keylen=0, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> rounds=0)<a name="l00397"></a>00397 : <a class="code" href="class_variable_rounds_cipher_factory.html#403f4ea480da6a52147989a11124491b">m_keylen</a>(keylen ? keylen : E::DEFAULT_KEYLENGTH), <a class="code" href="class_variable_rounds_cipher_factory.html#5f70618f2aeb41e00cef9d3437c54d90">m_rounds</a>(rounds ? rounds : E::DEFAULT_ROUNDS) {}<a name="l00398"></a><a class="code" href="class_variable_rounds_cipher_factory.html#f5cfa1ab6dcd4c5d991d900cd3ba59d1">00398</a> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="class_variable_rounds_cipher_factory.html#f5cfa1ab6dcd4c5d991d900cd3ba59d1">BlockSize</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> E::BLOCKSIZE;}<a name="l00399"></a><a class="code" href="class_variable_rounds_cipher_factory.html#1a6683c8b73f6b67c31f2a6532b8cdd4">00399</a> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="class_variable_rounds_cipher_factory.html#1a6683c8b73f6b67c31f2a6532b8cdd4">KeyLength</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> <a class="code" href="class_variable_rounds_cipher_factory.html#403f4ea480da6a52147989a11124491b">m_keylen</a>;}<a name="l00400"></a>00400 <a name="l00401"></a><a class="code" href="class_variable_rounds_cipher_factory.html#34e8586f5c2a5d3094b5ef1d8c846ab0">00401</a> apbt <a class="code" href="class_variable_rounds_cipher_factory.html#34e8586f5c2a5d3094b5ef1d8c846ab0">NewEncryption</a>(<span class="keyword">const</span> byte *key)<span class="keyword"> const</span><a name="l00402"></a>00402 <span class="keyword"> </span>{<span class="keywordflow">return</span> apbt(<span class="keyword">new</span> E(key, <a class="code" href="class_variable_rounds_cipher_factory.html#403f4ea480da6a52147989a11124491b">m_keylen</a>, <a class="code" href="class_variable_rounds_cipher_factory.html#5f70618f2aeb41e00cef9d3437c54d90">m_rounds</a>));}<a name="l00403"></a><a class="code" href="class_variable_rounds_cipher_factory.html#47fefa72ff96108d67f634d0646ccfdb">00403</a> apbt <a class="code" href="class_variable_rounds_cipher_factory.html#47fefa72ff96108d67f634d0646ccfdb">NewDecryption</a>(<span class="keyword">const</span> byte *key)<span class="keyword"> const</span><a name="l00404"></a>00404 <span class="keyword"> </span>{<span class="keywordflow">return</span> apbt(<span class="keyword">new</span> D(key, <a class="code" href="class_variable_rounds_cipher_factory.html#403f4ea480da6a52147989a11124491b">m_keylen</a>, <a class="code" href="class_variable_rounds_cipher_factory.html#5f70618f2aeb41e00cef9d3437c54d90">m_rounds</a>));}<a name="l00405"></a>00405 <a name="l00406"></a><a class="code" href="class_variable_rounds_cipher_factory.html#5f70618f2aeb41e00cef9d3437c54d90">00406</a> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="class_variable_rounds_cipher_factory.html#403f4ea480da6a52147989a11124491b">m_keylen</a>, <a class="code" href="class_variable_rounds_cipher_factory.html#5f70618f2aeb41e00cef9d3437c54d90">m_rounds</a>;<a name="l00407"></a>00407 };<a name="l00408"></a>00408 <a name="l00409"></a>00409 <span class="keywordtype">bool</span> BlockTransformationTest(<span class="keyword">const</span> <a class="code" href="class_cipher_factory.html">CipherFactory</a> &cg, <a class="code" href="class_buffered_transformation.html" title="interface for buffered transformations">BufferedTransformation</a> &valdata, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> tuples = 0xffff)<a name="l00410"></a>00410 {<a name="l00411"></a>00411 <a class="code" href="class_hex_encoder.html" title="Converts given data to base 16.">HexEncoder</a> output(<span class="keyword">new</span> <a class="code" href="class_file_sink.html" title="file-based implementation of Sink interface">FileSink</a>(cout));<a name="l00412"></a>00412 <a class="code" href="class_sec_block.html" title="a block of memory allocated using A">SecByteBlock</a> plain(cg.<a class="code" href="class_cipher_factory.html#96bc164e7c86740205db1e83ba6d0f1d">BlockSize</a>()), cipher(cg.<a class="code" href="class_cipher_factory.html#96bc164e7c86740205db1e83ba6d0f1d">BlockSize</a>()), out(cg.<a class="code" href="class_cipher_factory.html#96bc164e7c86740205db1e83ba6d0f1d">BlockSize</a>()), outplain(cg.<a class="code" href="class_cipher_factory.html#96bc164e7c86740205db1e83ba6d0f1d">BlockSize</a>());<a name="l00413"></a>00413 <a class="code" href="class_sec_block.html" title="a block of memory allocated using A">SecByteBlock</a> key(cg.<a class="code" href="class_cipher_factory.html#b12ff234308a16f8e45d8b9f4dbbd9d7">KeyLength</a>());<a name="l00414"></a>00414 <span class="keywordtype">bool</span> pass=<span class="keyword">true</span>, fail;<a name="l00415"></a>00415 <a name="l00416"></a>00416 <span class="keywordflow">while</span> (valdata.<a class="code" href="class_buffered_transformation.html#30b2076bce5fb29e992b6457485c67c2" title="returns number of bytes that is currently ready for retrieval">MaxRetrievable</a>() && tuples--)<a name="l00417"></a>00417 {<a name="l00418"></a>00418 valdata.<a class="code" href="class_buffered_transformation.html#9e1ad913c8fe697d269f408a7d5928fc" title="try to retrieve a single byte">Get</a>(key, cg.<a class="code" href="class_cipher_factory.html#b12ff234308a16f8e45d8b9f4dbbd9d7">KeyLength</a>());<a name="l00419"></a>00419 valdata.<a class="code" href="class_buffered_transformation.html#9e1ad913c8fe697d269f408a7d5928fc" title="try to retrieve a single byte">Get</a>(plain, cg.<a class="code" href="class_cipher_factory.html#96bc164e7c86740205db1e83ba6d0f1d">BlockSize</a>());<a name="l00420"></a>00420 valdata.<a class="code" href="class_buffered_transformation.html#9e1ad913c8fe697d269f408a7d5928fc" title="try to retrieve a single byte">Get</a>(cipher, cg.<a class="code" href="class_cipher_factory.html#96bc164e7c86740205db1e83ba6d0f1d">BlockSize</a>());<a name="l00421"></a>00421 <a name="l00422"></a>00422 apbt transE = cg.<a class="code" href="class_cipher_factory.html#d18cf69b9fc6b64729d95995aba8408c">NewEncryption</a>(key);<a name="l00423"></a>00423 transE->ProcessBlock(plain, out);<a name="l00424"></a>00424 fail = memcmp(out, cipher, cg.<a class="code" href="class_cipher_factory.html#96bc164e7c86740205db1e83ba6d0f1d">BlockSize</a>()) != 0;<a name="l00425"></a>00425 <a name="l00426"></a>00426 apbt transD = cg.<a class="code" href="class_cipher_factory.html#55cad48078e9d09e074aca211d4ece93">NewDecryption</a>(key);<a name="l00427"></a>00427 transD->ProcessBlock(out, outplain);<a name="l00428"></a>00428 fail=fail || memcmp(outplain, plain, cg.<a class="code" href="class_cipher_factory.html#96bc164e7c86740205db1e83ba6d0f1d">BlockSize</a>());<a name="l00429"></a>00429 <a name="l00430"></a>00430 pass = pass && !fail;<a name="l00431"></a>00431 <a name="l00432"></a>00432 cout << (fail ? <span class="stringliteral">"FAILED "</span> : <span class="stringliteral">"passed "</span>);<a name="l00433"></a>00433 output.<a class="code" href="class_buffered_transformation.html#e70658b0d271f8e114ac6c3cc9774ede" title="input a byte for processing">Put</a>(key, cg.<a class="code" href="class_cipher_factory.html#b12ff234308a16f8e45d8b9f4dbbd9d7">KeyLength</a>());<a name="l00434"></a>00434 cout << <span class="stringliteral">" "</span>;<a name="l00435"></a>00435 output.<a class="code" href="class_buffered_transformation.html#e70658b0d271f8e114ac6c3cc9774ede" title="input a byte for processing">Put</a>(outplain, cg.<a class="code" href="class_cipher_factory.html#96bc164e7c86740205db1e83ba6d0f1d">BlockSize</a>());<a name="l00436"></a>00436 cout << <span class="stringliteral">" "</span>;<a name="l00437"></a>00437 output.<a class="code" href="class_buffered_transformation.html#e70658b0d271f8e114ac6c3cc9774ede" title="input a byte for processing">Put</a>(out, cg.<a class="code" href="class_cipher_factory.html#96bc164e7c86740205db1e83ba6d0f1d">BlockSize</a>());<a name="l00438"></a>00438 cout << endl;<a name="l00439"></a>00439 }<a name="l00440"></a>00440 <span class="keywordflow">return</span> pass;<a name="l00441"></a>00441 }<a name="l00442"></a>00442 <a name="l00443"></a><a class="code" href="class_filter_tester.html">00443</a> <span class="keyword">class </span><a class="code" href="class_filter_tester.html">FilterTester</a> : <span class="keyword">public</span> <a class="code" href="class_unflushable.html" title="_">Unflushable</a><Sink><a name="l00444"></a>00444 {<a name="l00445"></a>00445 <span class="keyword">public</span>:<a name="l00446"></a><a class="code" href="class_filter_tester.html#c42153f5b435216ee9c4d8b85eeb2de8">00446</a> <a class="code" href="class_filter_tester.html#c42153f5b435216ee9c4d8b85eeb2de8">FilterTester</a>(<span class="keyword">const</span> byte *<a class="code" href="class_filter_tester.html#d91cd562a429625366ebb4c7c98310c8">validOutput</a>, <span class="keywordtype">size_t</span> <a class="code" href="class_filter_tester.html#8d1589ead4c76565940de6dce40eaab8">outputLen</a>)<a name="l00447"></a>00447 : validOutput(validOutput), outputLen(outputLen), <a class="code" href="class_filter_tester.html#3e682b1d1263042b724052d22fe7514a">counter</a>(0), <a class="code" href="class_filter_tester.html#5009d4d3daa271c88c150c98c771be57">fail</a>(false) {}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -