📄 validat1_8cpp-source.html
字号:
00314 }00315 <span class="preprocessor">#else</span>00316 <span class="preprocessor"></span> cout << <span class="stringliteral">"\nNo operating system provided nonblocking random number generator, skipping test."</span> << 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<BlockTransformation> 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> <<span class="keyword">class</span> E, <span class="keyword">class</span> D> <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> <<span class="keyword">class</span> E, <span class="keyword">class</span> D> <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 &cg, <a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &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>() && 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->ProcessBlock(plain, out);00381 fail = memcmp(out, cipher, cg.BlockSize()) != 0;00382 00383 apbt transD = cg.NewDecryption(key);00384 transD->ProcessBlock(out, outplain);00385 fail=fail || memcmp(outplain, plain, cg.BlockSize());00386 00387 pass = pass && !fail;00388 00389 cout << (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 << <span class="stringliteral">" "</span>;00392 output.<a class="code" href="class_buffered_transformation.html#_zlib_decompressorz1_0">Put</a>(outplain, cg.BlockSize());00393 cout << <span class="stringliteral">" "</span>;00394 output.<a class="code" href="class_buffered_transformation.html#_zlib_decompressorz1_0">Put</a>(out, cg.BlockSize());00395 cout << endl;00396 }00397 <span class="keywordflow">return</span> pass;00398 }00399 00400 <span class="keyword">class </span>FilterTester : <span class="keyword">public</span> Unflushable<Sink>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 >= 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> &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->GetResult();00452 }00453 00454 <span class="keywordtype">bool</span> ValidateDES()00455 {00456 cout << <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<DESEncryption, DESDecryption>(), valdata);00460 00461 cout << <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<DES_EDE2_Encryption, DES_EDE2_Decryption>(), valdata1, 1) && pass;00465 pass = BlockTransformationTest(FixedRoundsCipherFactory<DES_EDE3_Encryption, DES_EDE3_Decryption>(), valdata1, 1) && pass;00466 pass = BlockTransformationTest(FixedRoundsCipherFactory<DES_XEX3_Encryption, DES_XEX3_Decryption>(), valdata1, 1) && 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> &e, <a class="code" href="class_symmetric_cipher.html">SymmetricCipher</a> &d)00472 {00473 <a class="code" href="class_sec_block.html">SecByteBlock</a> lastIV;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -