📄 datatest_8cpp-source.html
字号:
<a name="l00337"></a>00337 xx.Pump(256); xx.Flush(<span class="keyword">false</span>);<a name="l00338"></a>00338 std::cout << <span class="stringliteral">"\n"</span>;<a name="l00339"></a>00339 SignalTestFailure();<a name="l00340"></a>00340 }<a name="l00341"></a>00341 }<a name="l00342"></a>00342 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (test == <span class="stringliteral">"Decrypt"</span>)<a name="l00343"></a>00343 {<a name="l00344"></a>00344 }<a name="l00345"></a>00345 <span class="keywordflow">else</span><a name="l00346"></a>00346 {<a name="l00347"></a>00347 SignalTestError();<a name="l00348"></a>00348 assert(<span class="keyword">false</span>);<a name="l00349"></a>00349 }<a name="l00350"></a>00350 }<a name="l00351"></a>00351 <a name="l00352"></a>00352 <span class="keywordtype">void</span> TestDigestOrMAC(TestData &v, <span class="keywordtype">bool</span> testDigest)<a name="l00353"></a>00353 {<a name="l00354"></a>00354 std::string name = GetRequiredDatum(v, <span class="stringliteral">"Name"</span>);<a name="l00355"></a>00355 std::string test = GetRequiredDatum(v, <span class="stringliteral">"Test"</span>);<a name="l00356"></a>00356 <a name="l00357"></a>00357 <a class="code" href="classmember__ptr.html">member_ptr<MessageAuthenticationCode></a> mac;<a name="l00358"></a>00358 <a class="code" href="classmember__ptr.html">member_ptr<HashTransformation></a> hash;<a name="l00359"></a>00359 <a class="code" href="class_hash_transformation.html" title="interface for hash functions and data processing part of MACs">HashTransformation</a> *pHash = NULL;<a name="l00360"></a>00360 <a name="l00361"></a>00361 <a class="code" href="class_test_data_name_value_pairs.html">TestDataNameValuePairs</a> pairs(v);<a name="l00362"></a>00362 <a name="l00363"></a>00363 <span class="keywordflow">if</span> (testDigest)<a name="l00364"></a>00364 {<a name="l00365"></a>00365 hash.<a class="code" href="classmember__ptr.html#0191c833924d93e9093b07bab31010fe">reset</a>(<a class="code" href="class_object_factory_registry.html" title="_">ObjectFactoryRegistry<HashTransformation>::Registry</a>().CreateObject(name.c_str()));<a name="l00366"></a>00366 pHash = hash.<a class="code" href="classmember__ptr.html#2d10dec2a51691b589d56b71ec78e59a">get</a>();<a name="l00367"></a>00367 }<a name="l00368"></a>00368 <span class="keywordflow">else</span><a name="l00369"></a>00369 {<a name="l00370"></a>00370 mac.<a class="code" href="classmember__ptr.html#0191c833924d93e9093b07bab31010fe">reset</a>(<a class="code" href="class_object_factory_registry.html" title="_">ObjectFactoryRegistry<MessageAuthenticationCode>::Registry</a>().CreateObject(name.c_str()));<a name="l00371"></a>00371 pHash = mac.<a class="code" href="classmember__ptr.html#2d10dec2a51691b589d56b71ec78e59a">get</a>();<a name="l00372"></a>00372 <a class="code" href="class_const_byte_array_parameter.html" title="used to pass byte array input as part of a NameValuePairs object">ConstByteArrayParameter</a> iv;<a name="l00373"></a>00373 <span class="keywordflow">if</span> (pairs.GetValue(<a class="code" href="namespace_name.html#9b6839240a8bdf1f5bcbebf1866f4733" title="const byte *">Name::IV</a>(), iv) && iv.<a class="code" href="class_const_byte_array_parameter.html#b83dbf7e4d80c0304917a3cc1d3cf144">size</a>() != mac->IVSize())<a name="l00374"></a>00374 SignalTestFailure();<a name="l00375"></a>00375 std::string key = GetDecodedDatum(v, <span class="stringliteral">"Key"</span>);<a name="l00376"></a>00376 mac->SetKey((<span class="keyword">const</span> byte *)key.c_str(), key.size(), pairs);<a name="l00377"></a>00377 }<a name="l00378"></a>00378 <a name="l00379"></a>00379 <span class="keywordflow">if</span> (test == <span class="stringliteral">"Verify"</span> || test == <span class="stringliteral">"VerifyTruncated"</span> || test == <span class="stringliteral">"NotVerify"</span>)<a name="l00380"></a>00380 {<a name="l00381"></a>00381 <span class="keywordtype">int</span> digestSize = pHash-><a class="code" href="class_hash_transformation.html#41faf8b1293a6c72390cb0c8bd668097" title="size of the hash returned by Final()">DigestSize</a>();<a name="l00382"></a>00382 <span class="keywordflow">if</span> (test == <span class="stringliteral">"VerifyTruncated"</span>)<a name="l00383"></a>00383 digestSize = atoi(GetRequiredDatum(v, <span class="stringliteral">"TruncatedSize"</span>).c_str());<a name="l00384"></a>00384 <a class="code" href="class_truncated_hash_template.html" title="construct new HashModule with smaller DigestSize() from existing one">TruncatedHashModule</a> thash(*pHash, digestSize);<a name="l00385"></a>00385 <a class="code" href="class_hash_verification_filter.html" title="Filter Wrapper for HashTransformation.">HashVerificationFilter</a> verifierFilter(thash, NULL, <a class="code" href="class_hash_verification_filter.html#4e171785f3f9b00d0a10f4c2afa1cc703974fb63ec975408ce7ab672d99ee004">HashVerificationFilter::HASH_AT_BEGIN</a>);<a name="l00386"></a>00386 PutDecodedDatumInto(v, <span class="stringliteral">"Digest"</span>, verifierFilter);<a name="l00387"></a>00387 PutDecodedDatumInto(v, <span class="stringliteral">"Message"</span>, verifierFilter);<a name="l00388"></a>00388 verifierFilter.MessageEnd();<a name="l00389"></a>00389 <span class="keywordflow">if</span> (verifierFilter.GetLastResult() == (test == <span class="stringliteral">"NotVerify"</span>))<a name="l00390"></a>00390 SignalTestFailure();<a name="l00391"></a>00391 }<a name="l00392"></a>00392 <span class="keywordflow">else</span><a name="l00393"></a>00393 {<a name="l00394"></a>00394 SignalTestError();<a name="l00395"></a>00395 assert(<span class="keyword">false</span>);<a name="l00396"></a>00396 }<a name="l00397"></a>00397 }<a name="l00398"></a>00398 <a name="l00399"></a>00399 <span class="keywordtype">bool</span> GetField(std::istream &is, std::string &name, std::string &value)<a name="l00400"></a>00400 {<a name="l00401"></a>00401 name.resize(0); <span class="comment">// GCC workaround: 2.95.3 doesn't have clear()</span><a name="l00402"></a>00402 is >> name;<a name="l00403"></a>00403 <span class="keywordflow">if</span> (name.empty())<a name="l00404"></a>00404 <span class="keywordflow">return</span> <span class="keyword">false</span>;<a name="l00405"></a>00405 <a name="l00406"></a>00406 <span class="keywordflow">if</span> (name[name.size()-1] != <span class="charliteral">':'</span>)<a name="l00407"></a>00407 SignalTestError();<a name="l00408"></a>00408 name.erase(name.size()-1);<a name="l00409"></a>00409 <a name="l00410"></a>00410 <span class="keywordflow">while</span> (is.peek() == <span class="charliteral">' '</span>)<a name="l00411"></a>00411 is.ignore(1);<a name="l00412"></a>00412 <a name="l00413"></a>00413 <span class="comment">// VC60 workaround: getline bug</span><a name="l00414"></a>00414 <span class="keywordtype">char</span> buffer[128];<a name="l00415"></a>00415 value.resize(0); <span class="comment">// GCC workaround: 2.95.3 doesn't have clear()</span><a name="l00416"></a>00416 <span class="keywordtype">bool</span> continueLine;<a name="l00417"></a>00417 <a name="l00418"></a>00418 <span class="keywordflow">do</span><a name="l00419"></a>00419 {<a name="l00420"></a>00420 <span class="keywordflow">do</span><a name="l00421"></a>00421 {<a name="l00422"></a>00422 is.get(buffer, <span class="keyword">sizeof</span>(buffer));<a name="l00423"></a>00423 value += buffer;<a name="l00424"></a>00424 }<a name="l00425"></a>00425 <span class="keywordflow">while</span> (buffer[0] != 0);<a name="l00426"></a>00426 is.clear();<a name="l00427"></a>00427 is.ignore();<a name="l00428"></a>00428 <a name="l00429"></a>00429 <span class="keywordflow">if</span> (!value.empty() && value[value.size()-1] == <span class="charliteral">'\r'</span>)<a name="l00430"></a>00430 value.resize(value.size()-1);<a name="l00431"></a>00431 <a name="l00432"></a>00432 <span class="keywordflow">if</span> (!value.empty() && value[value.size()-1] == <span class="charliteral">'\\'</span>)<a name="l00433"></a>00433 {<a name="l00434"></a>00434 value.resize(value.size()-1);<a name="l00435"></a>00435 continueLine = <span class="keyword">true</span>;<a name="l00436"></a>00436 }<a name="l00437"></a>00437 <span class="keywordflow">else</span><a name="l00438"></a>00438 continueLine = <span class="keyword">false</span>;<a name="l00439"></a>00439 <a name="l00440"></a>00440 std::string::size_type i = value.find(<span class="charliteral">'#'</span>);<a name="l00441"></a>00441 <span class="keywordflow">if</span> (i != std::string::npos)<a name="l00442"></a>00442 value.erase(i);<a name="l00443"></a>00443 }<a name="l00444"></a>00444 <span class="keywordflow">while</span> (continueLine);<a name="l00445"></a>00445 <a name="l00446"></a>00446 <span class="keywordflow">return</span> <span class="keyword">true</span>;<a name="l00447"></a>00447 }<a name="l00448"></a>00448 <a name="l00449"></a>00449 <span class="keywordtype">void</span> OutputPair(<span class="keyword">const</span> <a class="code" href="class_name_value_pairs.html" title="interface for retrieving values given their names">NameValuePairs</a> &v, <span class="keyword">const</span> <span class="keywordtype">char</span> *name)<a name="l00450"></a>00450 {<a name="l00451"></a>00451 <a class="code" href="class_integer.html" title="multiple precision integer and basic arithmetics">Integer</a> x;<a name="l00452"></a>00452 <span class="keywordtype">bool</span> b = v.<a class="code" href="class_name_value_pairs.html#96686e9f8d6ce3ab870e516fb72b608e" title="get a named value, returns true if the name exists">GetValue</a>(name, x);<a name="l00453"></a>00453 assert(b);<a name="l00454"></a>00454 cout << name << <span class="stringliteral">": \\\n "</span>;<a name="l00455"></a>00455 x.<a class="code" href="class_integer.html#c12ea467de9a609b86ec03d8cb8837e4" title="encode in big-endian format">Encode</a>(<a class="code" href="class_hex_encoder.html" title="Converts given data to base 16.">HexEncoder</a>(<span class="keyword">new</span> <a class="code" href="class_file_sink.html" title="file-based implementation of Sink interface">FileSink</a>(cout), <span class="keyword">false</span>, 64, <span class="stringliteral">"\\\n "</span>).Ref(), x.<a class="code" href="class_integer.html#3b269bbf8a91faf217c0dd76222182bb" title="minimum number of bytes to encode this integer">MinEncodedSize</a>());
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -