Sophie

Sophie

distrib > Fedora > 13 > i386 > media > os > by-pkgid > 07dfcfe50d66c9a48a3c5e6c1693f12a > files > 1730

cryptopp-doc-5.6.1-0.1.svn479.fc13.i686.rpm

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<title>Crypto++: fipsalgt.cpp Source File</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<link href="doxygen.css" rel="stylesheet" type="text/css"/>
</head>
<body>
<!-- Generated by Doxygen 1.6.1 -->
<div class="navigation" id="top">
  <div class="tabs">
    <ul>
      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
      <li><a href="annotated.html"><span>Classes</span></a></li>
      <li class="current"><a href="files.html"><span>Files</span></a></li>
    </ul>
  </div>
  <div class="tabs">
    <ul>
      <li><a href="files.html"><span>File&nbsp;List</span></a></li>
      <li><a href="globals.html"><span>File&nbsp;Members</span></a></li>
    </ul>
  </div>
<h1>fipsalgt.cpp</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">// fipsalgt.cpp - written and placed in the public domain by Wei Dai</span>
<a name="l00002"></a>00002 
<a name="l00003"></a>00003 <span class="comment">// This file implements the various algorithm tests needed to pass FIPS 140 validation.</span>
<a name="l00004"></a>00004 <span class="comment">// They&apos;re preserved here (commented out) in case Crypto++ needs to be revalidated.</span>
<a name="l00005"></a>00005 
<a name="l00006"></a>00006 <span class="preprocessor">#if 0</span>
<a name="l00007"></a>00007 <span class="preprocessor"></span><span class="preprocessor">#ifndef CRYPTOPP_IMPORTS</span>
<a name="l00008"></a>00008 <span class="preprocessor"></span><span class="preprocessor">#define CRYPTOPP_DEFAULT_NO_DLL</span>
<a name="l00009"></a>00009 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
<a name="l00010"></a>00010 <span class="preprocessor"></span><span class="preprocessor">#include &quot;dll.h&quot;</span>
<a name="l00011"></a>00011 <span class="preprocessor">#include &quot;oids.h&quot;</span>
<a name="l00012"></a>00012 
<a name="l00013"></a>00013 USING_NAMESPACE(CryptoPP)
<a name="l00014"></a>00014 USING_NAMESPACE(std)
<a name="l00015"></a>00015 
<a name="l00016"></a>00016 class LineBreakParser : public <a class="code" href="class_auto_signaling.html" title="_">AutoSignaling</a>&lt;<a class="code" href="class_bufferless.html" title="_">Bufferless</a>&lt;<a class="code" href="class_filter.html" title="provides an implementation of BufferedTransformation&amp;#39;s attachment interface">Filter</a>&gt; &gt;
<a name="l00017"></a>00017 {
<a name="l00018"></a>00018 <span class="keyword">public</span>:
<a name="l00019"></a>00019         LineBreakParser(<a class="code" href="class_buffered_transformation.html" title="interface for buffered transformations">BufferedTransformation</a> *attachment=NULL, byte lineEnd=<span class="charliteral">&apos;\n&apos;</span>)
<a name="l00020"></a>00020                 : m_lineEnd(lineEnd) {Detach(attachment);}
<a name="l00021"></a>00021 
<a name="l00022"></a>00022         <span class="keywordtype">size_t</span> Put2(<span class="keyword">const</span> byte *begin, <span class="keywordtype">size_t</span> length, <span class="keywordtype">int</span> messageEnd, <span class="keywordtype">bool</span> blocking)
<a name="l00023"></a>00023         {
<a name="l00024"></a>00024                 <span class="keywordflow">if</span> (!blocking)
<a name="l00025"></a>00025                         <span class="keywordflow">throw</span> BlockingInputOnly(<span class="stringliteral">&quot;LineBreakParser&quot;</span>);
<a name="l00026"></a>00026                 
<a name="l00027"></a>00027                 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i, last = 0;
<a name="l00028"></a>00028                 <span class="keywordflow">for</span> (i=0; i&lt;length; i++)
<a name="l00029"></a>00029                 {
<a name="l00030"></a>00030                         <span class="keywordflow">if</span> (begin[i] == m_lineEnd)
<a name="l00031"></a>00031                         {
<a name="l00032"></a>00032                                 AttachedTransformation()-&gt;Put2(begin+last, i-last, GetAutoSignalPropagation(), blocking);
<a name="l00033"></a>00033                                 last = i+1;
<a name="l00034"></a>00034                         }
<a name="l00035"></a>00035                 }
<a name="l00036"></a>00036                 <span class="keywordflow">if</span> (last != i)
<a name="l00037"></a>00037                         AttachedTransformation()-&gt;Put2(begin+last, i-last, 0, blocking);
<a name="l00038"></a>00038 
<a name="l00039"></a>00039                 <span class="keywordflow">if</span> (messageEnd &amp;&amp; GetAutoSignalPropagation())
<a name="l00040"></a>00040                 {
<a name="l00041"></a>00041                         AttachedTransformation()-&gt;MessageEnd(GetAutoSignalPropagation()-1, blocking);
<a name="l00042"></a>00042                         AttachedTransformation()-&gt;MessageSeriesEnd(GetAutoSignalPropagation()-1, blocking);
<a name="l00043"></a>00043                 }
<a name="l00044"></a>00044 
<a name="l00045"></a>00045                 <span class="keywordflow">return</span> 0;
<a name="l00046"></a>00046         }
<a name="l00047"></a>00047 
<a name="l00048"></a>00048 <span class="keyword">private</span>:
<a name="l00049"></a>00049         byte m_lineEnd;
<a name="l00050"></a>00050 };
<a name="l00051"></a>00051 
<a name="l00052"></a>00052 <span class="keyword">class </span>TestDataParser : <span class="keyword">public</span> <a class="code" href="class_unflushable.html" title="_">Unflushable</a>&lt;FilterWithInputQueue&gt;
<a name="l00053"></a>00053 {
<a name="l00054"></a>00054 <span class="keyword">public</span>:
<a name="l00055"></a>00055         <span class="keyword">enum</span> DataType {OTHER, COUNT, KEY_T, IV, INPUT, OUTPUT};
<a name="l00056"></a>00056 
<a name="l00057"></a>00057         TestDataParser(std::string algorithm, std::string test, std::string mode, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> feedbackSize, <span class="keywordtype">bool</span> encrypt, <a class="code" href="class_buffered_transformation.html" title="interface for buffered transformations">BufferedTransformation</a> *attachment)
<a name="l00058"></a>00058                 : m_algorithm(algorithm), m_test(test), m_mode(mode), m_feedbackSize(feedbackSize)
<a name="l00059"></a>00059                 , m_firstLine(true), m_blankLineTransition(0)
<a name="l00060"></a>00060         {
<a name="l00061"></a>00061                 Detach(attachment);
<a name="l00062"></a>00062 
<a name="l00063"></a>00063                 m_typeToName[COUNT] = <span class="stringliteral">&quot;COUNT&quot;</span>;
<a name="l00064"></a>00064 
<a name="l00065"></a>00065                 m_nameToType[<span class="stringliteral">&quot;COUNT&quot;</span>] = COUNT;
<a name="l00066"></a>00066                 m_nameToType[<span class="stringliteral">&quot;KEY&quot;</span>] = KEY_T;
<a name="l00067"></a>00067                 m_nameToType[<span class="stringliteral">&quot;KEYs&quot;</span>] = KEY_T;
<a name="l00068"></a>00068                 m_nameToType[<span class="stringliteral">&quot;key&quot;</span>] = KEY_T;
<a name="l00069"></a>00069                 m_nameToType[<span class="stringliteral">&quot;Key&quot;</span>] = KEY_T;
<a name="l00070"></a>00070                 m_nameToType[<span class="stringliteral">&quot;IV&quot;</span>] = IV;
<a name="l00071"></a>00071                 m_nameToType[<span class="stringliteral">&quot;IV1&quot;</span>] = IV;
<a name="l00072"></a>00072                 m_nameToType[<span class="stringliteral">&quot;CV&quot;</span>] = IV;
<a name="l00073"></a>00073                 m_nameToType[<span class="stringliteral">&quot;CV1&quot;</span>] = IV;
<a name="l00074"></a>00074                 m_nameToType[<span class="stringliteral">&quot;IB&quot;</span>] = IV;
<a name="l00075"></a>00075                 m_nameToType[<span class="stringliteral">&quot;TEXT&quot;</span>] = INPUT;
<a name="l00076"></a>00076                 m_nameToType[<span class="stringliteral">&quot;RESULT&quot;</span>] = OUTPUT;
<a name="l00077"></a>00077                 m_nameToType[<span class="stringliteral">&quot;Msg&quot;</span>] = INPUT;
<a name="l00078"></a>00078                 m_nameToType[<span class="stringliteral">&quot;Seed&quot;</span>] = INPUT;
<a name="l00079"></a>00079                 m_nameToType[<span class="stringliteral">&quot;V&quot;</span>] = INPUT;
<a name="l00080"></a>00080                 m_nameToType[<span class="stringliteral">&quot;DT&quot;</span>] = IV;
<a name="l00081"></a>00081                 SetEncrypt(encrypt);
<a name="l00082"></a>00082 
<a name="l00083"></a>00083                 <span class="keywordflow">if</span> (m_algorithm == <span class="stringliteral">&quot;DSA&quot;</span> || m_algorithm == <span class="stringliteral">&quot;ECDSA&quot;</span>)
<a name="l00084"></a>00084                 {
<a name="l00085"></a>00085                         <span class="keywordflow">if</span> (m_test == <span class="stringliteral">&quot;PKV&quot;</span>)
<a name="l00086"></a>00086                                 m_trigger = <span class="stringliteral">&quot;Qy&quot;</span>;
<a name="l00087"></a>00087                         <span class="keywordflow">else</span> <span class="keywordflow">if</span> (m_test == <span class="stringliteral">&quot;KeyPair&quot;</span>)
<a name="l00088"></a>00088                                 m_trigger = <span class="stringliteral">&quot;N&quot;</span>;
<a name="l00089"></a>00089                         <span class="keywordflow">else</span> <span class="keywordflow">if</span> (m_test == <span class="stringliteral">&quot;SigGen&quot;</span>)
<a name="l00090"></a>00090                                 m_trigger = <span class="stringliteral">&quot;Msg&quot;</span>;
<a name="l00091"></a>00091                         <span class="keywordflow">else</span> <span class="keywordflow">if</span> (m_test == <span class="stringliteral">&quot;SigVer&quot;</span>)
<a name="l00092"></a>00092                                 m_trigger = <span class="stringliteral">&quot;S&quot;</span>;
<a name="l00093"></a>00093                         <span class="keywordflow">else</span> <span class="keywordflow">if</span> (m_test == <span class="stringliteral">&quot;PQGGen&quot;</span>)
<a name="l00094"></a>00094                                 m_trigger = <span class="stringliteral">&quot;N&quot;</span>;
<a name="l00095"></a>00095                         <span class="keywordflow">else</span> <span class="keywordflow">if</span> (m_test == <span class="stringliteral">&quot;PQGVer&quot;</span>)
<a name="l00096"></a>00096                                 m_trigger = <span class="stringliteral">&quot;H&quot;</span>;
<a name="l00097"></a>00097                 }
<a name="l00098"></a>00098                 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (m_algorithm == <span class="stringliteral">&quot;HMAC&quot;</span>)
<a name="l00099"></a>00099                         m_trigger = <span class="stringliteral">&quot;Msg&quot;</span>;
<a name="l00100"></a>00100                 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (m_algorithm == <span class="stringliteral">&quot;SHA&quot;</span>)
<a name="l00101"></a>00101                         m_trigger = (m_test == <span class="stringliteral">&quot;MONTE&quot;</span>) ? <span class="stringliteral">&quot;Seed&quot;</span> : <span class="stringliteral">&quot;Msg&quot;</span>;
<a name="l00102"></a>00102                 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (m_algorithm == <span class="stringliteral">&quot;RNG&quot;</span>)
<a name="l00103"></a>00103                         m_trigger = <span class="stringliteral">&quot;V&quot;</span>;
<a name="l00104"></a>00104                 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (m_algorithm == <span class="stringliteral">&quot;RSA&quot;</span>)
<a name="l00105"></a>00105                         m_trigger = (m_test == <span class="stringliteral">&quot;Ver&quot;</span>) ? <span class="stringliteral">&quot;S&quot;</span> : <span class="stringliteral">&quot;Msg&quot;</span>;
<a name="l00106"></a>00106         }
<a name="l00107"></a>00107 
<a name="l00108"></a>00108         <span class="keywordtype">void</span> SetEncrypt(<span class="keywordtype">bool</span> encrypt)
<a name="l00109"></a>00109         {
<a name="l00110"></a>00110                 m_encrypt = encrypt;
<a name="l00111"></a>00111                 <span class="keywordflow">if</span> (encrypt)
<a name="l00112"></a>00112                 {
<a name="l00113"></a>00113                         m_nameToType[<span class="stringliteral">&quot;PLAINTEXT&quot;</span>] = INPUT;
<a name="l00114"></a>00114                         m_nameToType[<span class="stringliteral">&quot;CIPHERTEXT&quot;</span>] = OUTPUT;
<a name="l00115"></a>00115                         m_nameToType[<span class="stringliteral">&quot;PT&quot;</span>] = INPUT;
<a name="l00116"></a>00116                         m_nameToType[<span class="stringliteral">&quot;CT&quot;</span>] = OUTPUT;
<a name="l00117"></a>00117                 }
<a name="l00118"></a>00118                 <span class="keywordflow">else</span>
<a name="l00119"></a>00119                 {
<a name="l00120"></a>00120                         m_nameToType[<span class="stringliteral">&quot;PLAINTEXT&quot;</span>] = OUTPUT;
<a name="l00121"></a>00121                         m_nameToType[<span class="stringliteral">&quot;CIPHERTEXT&quot;</span>] = INPUT;
<a name="l00122"></a>00122                         m_nameToType[<span class="stringliteral">&quot;PT&quot;</span>] = OUTPUT;
<a name="l00123"></a>00123                         m_nameToType[<span class="stringliteral">&quot;CT&quot;</span>] = INPUT;
<a name="l00124"></a>00124                 }
<a name="l00125"></a>00125 
<a name="l00126"></a>00126                 <span class="keywordflow">if</span> (m_algorithm == <span class="stringliteral">&quot;AES&quot;</span> || m_algorithm == <span class="stringliteral">&quot;TDES&quot;</span>)
<a name="l00127"></a>00127                 {
<a name="l00128"></a>00128                         <span class="keywordflow">if</span> (encrypt)
<a name="l00129"></a>00129                         {
<a name="l00130"></a>00130                                 m_trigger = <span class="stringliteral">&quot;PLAINTEXT&quot;</span>;
<a name="l00131"></a>00131                                 m_typeToName[OUTPUT] = <span class="stringliteral">&quot;CIPHERTEXT&quot;</span>;
<a name="l00132"></a>00132                         }
<a name="l00133"></a>00133                         <span class="keywordflow">else</span>
<a name="l00134"></a>00134                         {
<a name="l00135"></a>00135                                 m_trigger = <span class="stringliteral">&quot;CIPHERTEXT&quot;</span>;
<a name="l00136"></a>00136                                 m_typeToName[OUTPUT] = <span class="stringliteral">&quot;PLAINTEXT&quot;</span>;
<a name="l00137"></a>00137                         }
<a name="l00138"></a>00138                         m_count = 0;
<a name="l00139"></a>00139                 }
<a name="l00140"></a>00140         }
<a name="l00141"></a>00141 
<a name="l00142"></a>00142 <span class="keyword">protected</span>:
<a name="l00143"></a>00143         <span class="keywordtype">void</span> OutputData(std::string &amp;output, <span class="keyword">const</span> std::string &amp;key, <span class="keyword">const</span> std::string &amp;data)
<a name="l00144"></a>00144         {
<a name="l00145"></a>00145                 output += key;
<a name="l00146"></a>00146                 output += <span class="stringliteral">&quot;= &quot;</span>;
<a name="l00147"></a>00147                 output += data;
<a name="l00148"></a>00148                 output += <span class="stringliteral">&quot;\n&quot;</span>;
<a name="l00149"></a>00149         }
<a name="l00150"></a>00150 
<a name="l00151"></a>00151         <span class="keywordtype">void</span> OutputData(std::string &amp;output, <span class="keyword">const</span> std::string &amp;key, <span class="keywordtype">int</span> data)
<a name="l00152"></a>00152         {
<a name="l00153"></a>00153                 OutputData(output, key, IntToString(data));
<a name="l00154"></a>00154         }
<a name="l00155"></a>00155 
<a name="l00156"></a>00156         <span class="keywordtype">void</span> OutputData(std::string &amp;output, <span class="keyword">const</span> std::string &amp;key, <span class="keyword">const</span> <a class="code" href="class_sec_block.html" title="a block of memory allocated using A">SecByteBlock</a> &amp;data)
<a name="l00157"></a>00157         {
<a name="l00158"></a>00158                 output += key;
<a name="l00159"></a>00159                 output += <span class="stringliteral">&quot;= &quot;</span>;
<a name="l00160"></a>00160                 <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_string_sink_template.html" title="Append input to a string object.">StringSink</a>(output), <span class="keyword">false</span>).Put(data, data.size());
<a name="l00161"></a>00161                 output += <span class="stringliteral">&quot;\n&quot;</span>;
<a name="l00162"></a>00162         }
<a name="l00163"></a>00163 
<a name="l00164"></a>00164         <span class="keywordtype">void</span> OutputData(std::string &amp;output, <span class="keyword">const</span> std::string &amp;key, <span class="keyword">const</span> <a class="code" href="class_integer.html" title="multiple precision integer and basic arithmetics">Integer</a> &amp;data, <span class="keywordtype">int</span> size=-1)
<a name="l00165"></a>00165         {
<a name="l00166"></a>00166                 <a class="code" href="class_sec_block.html" title="a block of memory allocated using A">SecByteBlock</a> s(size &lt; 0 ? data.<a class="code" href="class_integer.html#a3b269bbf8a91faf217c0dd76222182bb" title="minimum number of bytes to encode this integer">MinEncodedSize</a>() : size);
<a name="l00167"></a>00167                 data.<a class="code" href="class_integer.html#ac12ea467de9a609b86ec03d8cb8837e4" title="encode in big-endian format">Encode</a>(s, s.size());
<a name="l00168"></a>00168                 OutputData(output, key, s);
<a name="l00169"></a>00169         }
<a name="l00170"></a>00170 
<a name="l00171"></a>00171         <span class="keywordtype">void</span> OutputData(std::string &amp;output, <span class="keyword">const</span> std::string &amp;key, <span class="keyword">const</span> <a class="code" href="class_polynomial_mod2.html" title="Polynomial with Coefficients in GF(2).">PolynomialMod2</a> &amp;data, <span class="keywordtype">int</span> size=-1)
<a name="l00172"></a>00172         {
<a name="l00173"></a>00173                 <a class="code" href="class_sec_block.html" title="a block of memory allocated using A">SecByteBlock</a> s(size &lt; 0 ? data.<a class="code" href="class_polynomial_mod2.html#a9e71cfb010cde2d755cf59bcb213abda" title="minimum number of bytes to encode this polynomial">MinEncodedSize</a>() : size);
<a name="l00174"></a>00174                 data.<a class="code" href="class_polynomial_mod2.html#a5e50bea6c06c2acb63e257c0ab568e72" title="encode in big-endian format">Encode</a>(s, s.size());
<a name="l00175"></a>00175                 OutputData(output, key, s);
<a name="l00176"></a>00176         }
<a name="l00177"></a>00177 
<a name="l00178"></a>00178         <span class="keywordtype">void</span> OutputData(std::string &amp;output, DataType t, <span class="keyword">const</span> std::string &amp;data)
<a name="l00179"></a>00179         {
<a name="l00180"></a>00180                 <span class="keywordflow">if</span> (m_algorithm == <span class="stringliteral">&quot;SKIPJACK&quot;</span>)
<a name="l00181"></a>00181                 {
<a name="l00182"></a>00182                         <span class="keywordflow">if</span> (m_test == <span class="stringliteral">&quot;KAT&quot;</span>)
<a name="l00183"></a>00183                         {
<a name="l00184"></a>00184                                 <span class="keywordflow">if</span> (t == OUTPUT)
<a name="l00185"></a>00185                                         output = m_line + data + <span class="stringliteral">&quot;\n&quot;</span>;
<a name="l00186"></a>00186                         }
<a name="l00187"></a>00187                         <span class="keywordflow">else</span>
<a name="l00188"></a>00188                         {
<a name="l00189"></a>00189                                 <span class="keywordflow">if</span> (t != COUNT)
<a name="l00190"></a>00190                                 {
<a name="l00191"></a>00191                                         output += m_typeToName[t];
<a name="l00192"></a>00192                                         output += <span class="stringliteral">&quot;=&quot;</span>;
<a name="l00193"></a>00193                                 }
<a name="l00194"></a>00194                                 output += data;
<a name="l00195"></a>00195                                 output += t == OUTPUT ? <span class="stringliteral">&quot;\n&quot;</span> : <span class="stringliteral">&quot;  &quot;</span>;
<a name="l00196"></a>00196                         }
<a name="l00197"></a>00197                 }
<a name="l00198"></a>00198                 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (m_algorithm == <span class="stringliteral">&quot;TDES&quot;</span> &amp;&amp; t == KEY_T &amp;&amp; m_typeToName[KEY_T].empty())
<a name="l00199"></a>00199                 {
<a name="l00200"></a>00200                         output += <span class="stringliteral">&quot;KEY1 = &quot;</span>;
<a name="l00201"></a>00201                         output += data.substr(0, 16);
<a name="l00202"></a>00202                         output += <span class="stringliteral">&quot;\nKEY2 = &quot;</span>;
<a name="l00203"></a>00203                         output += data.size() &gt; 16 ? data.substr(16, 16) : data.substr(0, 16);
<a name="l00204"></a>00204                         output += <span class="stringliteral">&quot;\nKEY3 = &quot;</span>;
<a name="l00205"></a>00205                         output += data.size() &gt; 32 ? data.substr(32, 16) : data.substr(0, 16);
<a name="l00206"></a>00206                         output += <span class="stringliteral">&quot;\n&quot;</span>;
<a name="l00207"></a>00207                 }
<a name="l00208"></a>00208                 <span class="keywordflow">else</span>
<a name="l00209"></a>00209                 {
<a name="l00210"></a>00210                         output += m_typeToName[t];
<a name="l00211"></a>00211                         output += <span class="stringliteral">&quot; = &quot;</span>;
<a name="l00212"></a>00212                         output += data;
<a name="l00213"></a>00213                         output += <span class="stringliteral">&quot;\n&quot;</span>;
<a name="l00214"></a>00214                 }
<a name="l00215"></a>00215         }
<a name="l00216"></a>00216 
<a name="l00217"></a>00217         <span class="keywordtype">void</span> OutputData(std::string &amp;output, DataType t, <span class="keywordtype">int</span> i)
<a name="l00218"></a>00218         {
<a name="l00219"></a>00219                 OutputData(output, t, IntToString(i));
<a name="l00220"></a>00220         }
<a name="l00221"></a>00221 
<a name="l00222"></a>00222         <span class="keywordtype">void</span> OutputData(std::string &amp;output, DataType t, <span class="keyword">const</span> <a class="code" href="class_sec_block.html" title="a block of memory allocated using A">SecByteBlock</a> &amp;data)
<a name="l00223"></a>00223         {
<a name="l00224"></a>00224                 std::string hexData;
<a name="l00225"></a>00225                 <a class="code" href="class_string_source.html" title="string-based implementation of Source interface">StringSource</a>(data.begin(), data.size(), <span class="keyword">true</span>, <span class="keyword">new</span> <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_string_sink_template.html" title="Append input to a string object.">StringSink</a>(hexData), <span class="keyword">false</span>));
<a name="l00226"></a>00226                 OutputData(output, t, hexData);
<a name="l00227"></a>00227         }
<a name="l00228"></a>00228 
<a name="l00229"></a>00229         <span class="keywordtype">void</span> OutputGivenData(std::string &amp;output, DataType t, <span class="keywordtype">bool</span> optional = <span class="keyword">false</span>)
<a name="l00230"></a>00230         {
<a name="l00231"></a>00231                 <span class="keywordflow">if</span> (m_data.find(m_typeToName[t]) == m_data.end())
<a name="l00232"></a>00232                 {
<a name="l00233"></a>00233                         <span class="keywordflow">if</span> (optional)
<a name="l00234"></a>00234                                 <span class="keywordflow">return</span>;
<a name="l00235"></a>00235                         <span class="keywordflow">throw</span> <a class="code" href="class_exception.html" title="base class for all exceptions thrown by Crypto++">Exception</a>(<a class="code" href="class_exception.html#a8e53909d979479380e0274807c074c0aa27d9ee7704100a88e4ae4adcc4072015" title="some error not belong to any of the above categories">Exception::OTHER_ERROR</a>, <span class="stringliteral">&quot;TestDataParser: key not found: &quot;</span> + m_typeToName[t]);
<a name="l00236"></a>00236                 }
<a name="l00237"></a>00237 
<a name="l00238"></a>00238                 OutputData(output, t, m_data[m_typeToName[t]]);
<a name="l00239"></a>00239         }
<a name="l00240"></a>00240 
<a name="l00241"></a>00241         <span class="keyword">template</span> &lt;<span class="keyword">class</span> T&gt;
<a name="l00242"></a>00242                 <a class="code" href="class_block_cipher.html" title="interface for one direction (encryption or decryption) of a block cipher">BlockCipher</a> * NewBT(T *)
<a name="l00243"></a>00243         {
<a name="l00244"></a>00244                 <span class="keywordflow">if</span> (!m_encrypt &amp;&amp; (m_mode == <span class="stringliteral">&quot;ECB&quot;</span> || m_mode == <span class="stringliteral">&quot;CBC&quot;</span>))
<a name="l00245"></a>00245                         <span class="keywordflow">return</span> <span class="keyword">new</span> <span class="keyword">typename</span> T::Decryption;
<a name="l00246"></a>00246                 <span class="keywordflow">else</span>
<a name="l00247"></a>00247                         <span class="keywordflow">return</span> <span class="keyword">new</span> <span class="keyword">typename</span> T::Encryption;
<a name="l00248"></a>00248         }
<a name="l00249"></a>00249 
<a name="l00250"></a>00250         <span class="keyword">template</span> &lt;<span class="keyword">class</span> T&gt;
<a name="l00251"></a>00251                 <a class="code" href="class_symmetric_cipher.html" title="interface for one direction (encryption or decryption) of a stream cipher or cipher...">SymmetricCipher</a> * NewMode(T *, <a class="code" href="class_block_cipher.html" title="interface for one direction (encryption or decryption) of a block cipher">BlockCipher</a> &amp;bt, <span class="keyword">const</span> byte *iv)
<a name="l00252"></a>00252         {
<a name="l00253"></a>00253                 <span class="keywordflow">if</span> (!m_encrypt)
<a name="l00254"></a>00254                         <span class="keywordflow">return</span> <span class="keyword">new</span> <span class="keyword">typename</span> T::Decryption(bt, iv, m_feedbackSize/8);
<a name="l00255"></a>00255                 <span class="keywordflow">else</span>
<a name="l00256"></a>00256                         <span class="keywordflow">return</span> <span class="keyword">new</span> <span class="keyword">typename</span> T::Encryption(bt, iv, m_feedbackSize/8);
<a name="l00257"></a>00257         }
<a name="l00258"></a>00258 
<a name="l00259"></a>00259         <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> Xor(<a class="code" href="class_sec_block.html" title="a block of memory allocated using A">SecByteBlock</a> &amp;z, <span class="keyword">const</span> <a class="code" href="class_sec_block.html" title="a block of memory allocated using A">SecByteBlock</a> &amp;x, <span class="keyword">const</span> <a class="code" href="class_sec_block.html" title="a block of memory allocated using A">SecByteBlock</a> &amp;y)
<a name="l00260"></a>00260         {
<a name="l00261"></a>00261                 assert(x.size() == y.size());
<a name="l00262"></a>00262                 z.<a class="code" href="class_sec_block.html#af9e98d3f4a7af1156fcf3e6e68f4ae5a" title="change size and preserve contents">resize</a>(x.size());
<a name="l00263"></a>00263                 xorbuf(z, x, y, x.size());
<a name="l00264"></a>00264         }
<a name="l00265"></a>00265 
<a name="l00266"></a>00266         <a class="code" href="class_sec_block.html" title="a block of memory allocated using A">SecByteBlock</a> UpdateKey(<a class="code" href="class_sec_block.html" title="a block of memory allocated using A">SecByteBlock</a> key, <span class="keyword">const</span> <a class="code" href="class_sec_block.html" title="a block of memory allocated using A">SecByteBlock</a> *text)
<a name="l00267"></a>00267         {
<a name="l00268"></a>00268                 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> innerCount = (m_algorithm == <span class="stringliteral">&quot;AES&quot;</span>) ? 1000 : 10000;
<a name="l00269"></a>00269                 <span class="keywordtype">int</span> keySize = key.size(), blockSize = text[0].size();
<a name="l00270"></a>00270                 <a class="code" href="class_sec_block.html" title="a block of memory allocated using A">SecByteBlock</a> x(keySize);
<a name="l00271"></a>00271                 <span class="keywordflow">for</span> (<span class="keywordtype">int</span> k=0; k&lt;keySize;)
<a name="l00272"></a>00272                 {
<a name="l00273"></a>00273                         <span class="keywordtype">int</span> pos = innerCount * blockSize - keySize + k;
<a name="l00274"></a>00274                         memcpy(x + k, text[pos / blockSize] + pos % blockSize, blockSize - pos % blockSize);
<a name="l00275"></a>00275                         k += blockSize - pos % blockSize;
<a name="l00276"></a>00276                 }
<a name="l00277"></a>00277 
<a name="l00278"></a>00278                 <span class="keywordflow">if</span> (m_algorithm == <span class="stringliteral">&quot;TDES&quot;</span> || m_algorithm == <span class="stringliteral">&quot;DES&quot;</span>)
<a name="l00279"></a>00279                 {
<a name="l00280"></a>00280                         <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i=0; i&lt;keySize; i+=8)
<a name="l00281"></a>00281                         {
<a name="l00282"></a>00282                                 xorbuf(key+i, x+keySize-8-i, 8);
<a name="l00283"></a>00283                                 <a class="code" href="class_d_e_s.html#ab4b48b141706addb33c955c694dd9ead" title="correct DES key parity bits">DES::CorrectKeyParityBits</a>(key+i);
<a name="l00284"></a>00284                         }
<a name="l00285"></a>00285                 }
<a name="l00286"></a>00286                 <span class="keywordflow">else</span>
<a name="l00287"></a>00287                         xorbuf(key, x, keySize);
<a name="l00288"></a>00288 
<a name="l00289"></a>00289                 <span class="keywordflow">return</span> key;
<a name="l00290"></a>00290         }
<a name="l00291"></a>00291 
<a name="l00292"></a>00292         <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> AssignLeftMostBits(<a class="code" href="class_sec_block.html" title="a block of memory allocated using A">SecByteBlock</a> &amp;z, <span class="keyword">const</span> <a class="code" href="class_sec_block.html" title="a block of memory allocated using A">SecByteBlock</a> &amp;x, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> K)
<a name="l00293"></a>00293         {
<a name="l00294"></a>00294                 z.<a class="code" href="class_sec_block.html#a2cf5dc5e31c63eb927f935af6104f36a" title="set contents and size">Assign</a>(x, K/8);
<a name="l00295"></a>00295         }
<a name="l00296"></a>00296 
<a name="l00297"></a>00297         <span class="keyword">template</span> &lt;<span class="keyword">class</span> EC&gt;
<a name="l00298"></a>00298         <span class="keywordtype">void</span> EC_KeyPair(<span class="keywordtype">string</span> &amp;output, <span class="keywordtype">int</span> n, <span class="keyword">const</span> <a class="code" href="class_o_i_d.html" title="Object Identifier.">OID</a> &amp;oid)
<a name="l00299"></a>00299         {
<a name="l00300"></a>00300                 <a class="code" href="class_d_l___group_parameters___e_c.html" title="Elliptic Curve Parameters.">DL_GroupParameters_EC&lt;EC&gt;</a> params(oid);
<a name="l00301"></a>00301                 <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i=0; i&lt;n; i++)
<a name="l00302"></a>00302                 {
<a name="l00303"></a>00303                         <a class="code" href="class_d_l___private_key___e_c.html" title="EC private key.">DL_PrivateKey_EC&lt;EC&gt;</a> priv;
<a name="l00304"></a>00304                         <a class="code" href="class_d_l___public_key___e_c.html" title="EC public key.">DL_PublicKey_EC&lt;EC&gt;</a> pub;
<a name="l00305"></a>00305                         priv.Initialize(m_rng, params);
<a name="l00306"></a>00306                         priv.MakePublicKey(pub);
<a name="l00307"></a>00307 
<a name="l00308"></a>00308                         OutputData(output, <span class="stringliteral">&quot;d &quot;</span>, priv.GetPrivateExponent());
<a name="l00309"></a>00309                         OutputData(output, <span class="stringliteral">&quot;Qx &quot;</span>, pub.GetPublicElement().x, params.GetCurve().GetField().MaxElementByteLength());
<a name="l00310"></a>00310                         OutputData(output, <span class="stringliteral">&quot;Qy &quot;</span>, pub.GetPublicElement().y, params.GetCurve().GetField().MaxElementByteLength());
<a name="l00311"></a>00311                 }
<a name="l00312"></a>00312         }
<a name="l00313"></a>00313 
<a name="l00314"></a>00314         <span class="keyword">template</span> &lt;<span class="keyword">class</span> EC&gt;
<a name="l00315"></a>00315         <span class="keywordtype">void</span> EC_SigGen(<span class="keywordtype">string</span> &amp;output, <span class="keyword">const</span> <a class="code" href="class_o_i_d.html" title="Object Identifier.">OID</a> &amp;oid)
<a name="l00316"></a>00316         {
<a name="l00317"></a>00317                 <a class="code" href="class_d_l___group_parameters___e_c.html" title="Elliptic Curve Parameters.">DL_GroupParameters_EC&lt;EC&gt;</a> params(oid);
<a name="l00318"></a>00318                 <span class="keyword">typename</span> <a class="code" href="class_d_l___private_key___with_signature_pairwise_consistency_test.html" title="_">ECDSA&lt;EC, SHA1&gt;::PrivateKey</a> priv;
<a name="l00319"></a>00319                 <span class="keyword">typename</span> <a class="code" href="class_d_l___public_key___e_c.html" title="EC public key.">ECDSA&lt;EC, SHA1&gt;::PublicKey</a> pub;
<a name="l00320"></a>00320                 priv.Initialize(m_rng, params);
<a name="l00321"></a>00321                 priv.MakePublicKey(pub);
<a name="l00322"></a>00322 
<a name="l00323"></a>00323                 <span class="keyword">typename</span> <a class="code" href="class_p_k___final_template.html" title="A template implementing constructors for public key algorithm classes.">ECDSA&lt;EC, SHA1&gt;::Signer</a> signer(priv);
<a name="l00324"></a>00324                 <a class="code" href="class_sec_block.html" title="a block of memory allocated using A">SecByteBlock</a> sig(signer.SignatureLength());
<a name="l00325"></a>00325                 <a class="code" href="class_string_source.html" title="string-based implementation of Source interface">StringSource</a>(m_data[<span class="stringliteral">&quot;Msg&quot;</span>], <span class="keyword">true</span>, <span class="keyword">new</span> <a class="code" href="class_hex_decoder.html" title="Decode base 16 data back to bytes.">HexDecoder</a>(<span class="keyword">new</span> <a class="code" href="class_signer_filter.html" title="Filter Wrapper for PK_Signer.">SignerFilter</a>(m_rng, signer, <span class="keyword">new</span> <a class="code" href="class_array_sink.html" title="Copy input to a memory buffer.">ArraySink</a>(sig, sig.size()))));
<a name="l00326"></a>00326                 <a class="code" href="class_sec_block.html" title="a block of memory allocated using A">SecByteBlock</a> R(sig, sig.size()/2), S(sig+sig.size()/2, sig.size()/2);
<a name="l00327"></a>00327 
<a name="l00328"></a>00328                 OutputData(output, <span class="stringliteral">&quot;Qx &quot;</span>, pub.GetPublicElement().x, params.GetCurve().GetField().MaxElementByteLength());
<a name="l00329"></a>00329                 OutputData(output, <span class="stringliteral">&quot;Qy &quot;</span>, pub.GetPublicElement().y, params.GetCurve().GetField().MaxElementByteLength());
<a name="l00330"></a>00330                 OutputData(output, <span class="stringliteral">&quot;R &quot;</span>, R);
<a name="l00331"></a>00331                 OutputData(output, <span class="stringliteral">&quot;S &quot;</span>, S);
<a name="l00332"></a>00332         }
<a name="l00333"></a>00333 
<a name="l00334"></a>00334         <span class="keyword">template</span> &lt;<span class="keyword">class</span> EC&gt;
<a name="l00335"></a>00335         <span class="keywordtype">void</span> EC_SigVer(<span class="keywordtype">string</span> &amp;output, <span class="keyword">const</span> <a class="code" href="class_o_i_d.html" title="Object Identifier.">OID</a> &amp;oid)
<a name="l00336"></a>00336         {
<a name="l00337"></a>00337                 <a class="code" href="class_sec_block.html" title="a block of memory allocated using A">SecByteBlock</a> x(DecodeHex(m_data[<span class="stringliteral">&quot;Qx&quot;</span>]));
<a name="l00338"></a>00338                 <a class="code" href="class_sec_block.html" title="a block of memory allocated using A">SecByteBlock</a> y(DecodeHex(m_data[<span class="stringliteral">&quot;Qy&quot;</span>]));
<a name="l00339"></a>00339                 <a class="code" href="class_integer.html" title="multiple precision integer and basic arithmetics">Integer</a> r((m_data[<span class="stringliteral">&quot;R&quot;</span>]+<span class="stringliteral">&quot;h&quot;</span>).c_str());
<a name="l00340"></a>00340                 <a class="code" href="class_integer.html" title="multiple precision integer and basic arithmetics">Integer</a> s((m_data[<span class="stringliteral">&quot;S&quot;</span>]+<span class="stringliteral">&quot;h&quot;</span>).c_str());
<a name="l00341"></a>00341 
<a name="l00342"></a>00342                 <span class="keyword">typename</span> EC::FieldElement Qx(x, x.size());
<a name="l00343"></a>00343                 <span class="keyword">typename</span> EC::FieldElement Qy(y, y.size());
<a name="l00344"></a>00344                 <span class="keyword">typename</span> EC::Element Q(Qx, Qy);
<a name="l00345"></a>00345 
<a name="l00346"></a>00346                 <a class="code" href="class_d_l___group_parameters___e_c.html" title="Elliptic Curve Parameters.">DL_GroupParameters_EC&lt;EC&gt;</a> params(oid);
<a name="l00347"></a>00347                 <span class="keyword">typename</span> <a class="code" href="class_d_l___public_key___e_c.html" title="EC public key.">ECDSA&lt;EC, SHA1&gt;::PublicKey</a> pub;
<a name="l00348"></a>00348                 pub.Initialize(params, Q);
<a name="l00349"></a>00349                 <span class="keyword">typename</span> <a class="code" href="class_p_k___final_template.html" title="A template implementing constructors for public key algorithm classes.">ECDSA&lt;EC, SHA1&gt;::Verifier</a> verifier(pub);
<a name="l00350"></a>00350 
<a name="l00351"></a>00351                 <a class="code" href="class_sec_block.html" title="a block of memory allocated using A">SecByteBlock</a> sig(verifier.SignatureLength());
<a name="l00352"></a>00352                 r.Encode(sig, sig.size()/2);
<a name="l00353"></a>00353                 s.Encode(sig+sig.size()/2, sig.size()/2);
<a name="l00354"></a>00354 
<a name="l00355"></a>00355                 <a class="code" href="class_signature_verification_filter.html" title="Filter Wrapper for PK_Verifier.">SignatureVerificationFilter</a> filter(verifier);
<a name="l00356"></a>00356                 filter.Put(sig, sig.size());
<a name="l00357"></a>00357                 <a class="code" href="class_string_source.html" title="string-based implementation of Source interface">StringSource</a>(m_data[<span class="stringliteral">&quot;Msg&quot;</span>], <span class="keyword">true</span>, <span class="keyword">new</span> <a class="code" href="class_hex_decoder.html" title="Decode base 16 data back to bytes.">HexDecoder</a>(<span class="keyword">new</span> <a class="code" href="class_redirector.html" title="Redirect input to another BufferedTransformation without owning it.">Redirector</a>(filter, Redirector::DATA_ONLY)));
<a name="l00358"></a>00358                 filter.MessageEnd();
<a name="l00359"></a>00359                 byte b;
<a name="l00360"></a>00360                 filter.Get(b);
<a name="l00361"></a>00361                 OutputData(output, <span class="stringliteral">&quot;Result &quot;</span>, b ? <span class="stringliteral">&quot;P&quot;</span> : <span class="stringliteral">&quot;F&quot;</span>);
<a name="l00362"></a>00362         }
<a name="l00363"></a>00363 
<a name="l00364"></a>00364         <span class="keyword">template</span> &lt;<span class="keyword">class</span> EC&gt;
<a name="l00365"></a>00365         <span class="keyword">static</span> <span class="keywordtype">bool</span> EC_PKV(<a class="code" href="class_random_number_generator.html" title="interface for random number generators">RandomNumberGenerator</a> &amp;rng, <span class="keyword">const</span> <a class="code" href="class_sec_block.html" title="a block of memory allocated using A">SecByteBlock</a> &amp;x, <span class="keyword">const</span> <a class="code" href="class_sec_block.html" title="a block of memory allocated using A">SecByteBlock</a> &amp;y, <span class="keyword">const</span> <a class="code" href="class_o_i_d.html" title="Object Identifier.">OID</a> &amp;oid)
<a name="l00366"></a>00366         {
<a name="l00367"></a>00367                 <span class="keyword">typename</span> EC::FieldElement Qx(x, x.size());
<a name="l00368"></a>00368                 <span class="keyword">typename</span> EC::FieldElement Qy(y, y.size());
<a name="l00369"></a>00369                 <span class="keyword">typename</span> EC::Element Q(Qx, Qy);
<a name="l00370"></a>00370 
<a name="l00371"></a>00371                 <a class="code" href="class_d_l___group_parameters___e_c.html" title="Elliptic Curve Parameters.">DL_GroupParameters_EC&lt;EC&gt;</a> params(oid);
<a name="l00372"></a>00372                 <span class="keyword">typename</span> <a class="code" href="class_d_l___public_key___e_c.html" title="EC public key.">ECDSA&lt;EC, SHA1&gt;::PublicKey</a> pub;
<a name="l00373"></a>00373                 pub.Initialize(params, Q);
<a name="l00374"></a>00374                 <span class="keywordflow">return</span> pub.<a class="code" href="class_d_l___public_key_impl.html#a85fab6591b1420642f414d6d9669b298" title="check this object for errors">Validate</a>(rng, 3);
<a name="l00375"></a>00375         }
<a name="l00376"></a>00376 
<a name="l00377"></a>00377         <span class="keyword">template</span> &lt;<span class="keyword">class</span> H, <span class="keyword">class</span> Result&gt;
<a name="l00378"></a>00378         Result * CreateRSA2(<span class="keyword">const</span> std::string &amp;standard)
<a name="l00379"></a>00379         {
<a name="l00380"></a>00380                 <span class="keywordflow">if</span> (<span class="keyword">typeid</span>(Result) == <span class="keyword">typeid</span>(<a class="code" href="class_p_k___verifier.html" title="interface for public-key signature verifiers">PK_Verifier</a>))
<a name="l00381"></a>00381                 {
<a name="l00382"></a>00382                         <span class="keywordflow">if</span> (standard == <span class="stringliteral">&quot;R&quot;</span>)
<a name="l00383"></a>00383                                 <span class="keywordflow">return</span> (Result *) <span class="keyword">new</span> <span class="keyword">typename</span> <a class="code" href="class_p_k___final_template.html" title="A template implementing constructors for public key algorithm classes.">RSASS_ISO&lt;H&gt;::Verifier</a>;
<a name="l00384"></a>00384                         <span class="keywordflow">else</span> <span class="keywordflow">if</span> (standard == <span class="stringliteral">&quot;P&quot;</span>)
<a name="l00385"></a>00385                                 <span class="keywordflow">return</span> (Result *) <span class="keyword">new</span> <span class="keyword">typename</span> <a class="code" href="class_p_k___final_template.html" title="A template implementing constructors for public key algorithm classes.">RSASS&lt;PSS, H&gt;::Verifier</a>;
<a name="l00386"></a>00386                         <span class="keywordflow">else</span> <span class="keywordflow">if</span> (standard == <span class="stringliteral">&quot;1&quot;</span>)
<a name="l00387"></a>00387                                 <span class="keywordflow">return</span> (Result *) <span class="keyword">new</span> <span class="keyword">typename</span> <a class="code" href="class_p_k___final_template.html" title="A template implementing constructors for public key algorithm classes.">RSASS&lt;PKCS1v15, H&gt;::Verifier</a>;
<a name="l00388"></a>00388                 }
<a name="l00389"></a>00389                 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<span class="keyword">typeid</span>(Result) == <span class="keyword">typeid</span>(<a class="code" href="class_p_k___signer.html" title="interface for public-key signers">PK_Signer</a>))
<a name="l00390"></a>00390                 {
<a name="l00391"></a>00391                         <span class="keywordflow">if</span> (standard == <span class="stringliteral">&quot;R&quot;</span>)
<a name="l00392"></a>00392                                 <span class="keywordflow">return</span> (Result *) <span class="keyword">new</span> <span class="keyword">typename</span> <a class="code" href="class_p_k___final_template.html" title="A template implementing constructors for public key algorithm classes.">RSASS_ISO&lt;H&gt;::Signer</a>;
<a name="l00393"></a>00393                         <span class="keywordflow">else</span> <span class="keywordflow">if</span> (standard == <span class="stringliteral">&quot;P&quot;</span>)
<a name="l00394"></a>00394                                 <span class="keywordflow">return</span> (Result *) <span class="keyword">new</span> <span class="keyword">typename</span> <a class="code" href="class_p_k___final_template.html" title="A template implementing constructors for public key algorithm classes.">RSASS&lt;PSS, H&gt;::Signer</a>;
<a name="l00395"></a>00395                         <span class="keywordflow">else</span> <span class="keywordflow">if</span> (standard == <span class="stringliteral">&quot;1&quot;</span>)
<a name="l00396"></a>00396                                 <span class="keywordflow">return</span> (Result *) <span class="keyword">new</span> <span class="keyword">typename</span> <a class="code" href="class_p_k___final_template.html" title="A template implementing constructors for public key algorithm classes.">RSASS&lt;PKCS1v15, H&gt;::Signer</a>;
<a name="l00397"></a>00397                 }
<a name="l00398"></a>00398 
<a name="l00399"></a>00399                 <span class="keywordflow">return</span> NULL;
<a name="l00400"></a>00400         }
<a name="l00401"></a>00401 
<a name="l00402"></a>00402         <span class="keyword">template</span> &lt;<span class="keyword">class</span> Result&gt;
<a name="l00403"></a>00403         Result * CreateRSA(<span class="keyword">const</span> std::string &amp;standard, <span class="keyword">const</span> std::string &amp;hash)
<a name="l00404"></a>00404         {
<a name="l00405"></a>00405                 <span class="keywordflow">if</span> (hash == <span class="stringliteral">&quot;1&quot;</span>)
<a name="l00406"></a>00406                         <span class="keywordflow">return</span> CreateRSA2&lt;SHA1, Result&gt;(standard);
<a name="l00407"></a>00407                 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (hash == <span class="stringliteral">&quot;224&quot;</span>)
<a name="l00408"></a>00408                         <span class="keywordflow">return</span> CreateRSA2&lt;SHA224, Result&gt;(standard);
<a name="l00409"></a>00409                 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (hash == <span class="stringliteral">&quot;256&quot;</span>)
<a name="l00410"></a>00410                         <span class="keywordflow">return</span> CreateRSA2&lt;SHA256, Result&gt;(standard);
<a name="l00411"></a>00411                 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (hash == <span class="stringliteral">&quot;384&quot;</span>)
<a name="l00412"></a>00412                         <span class="keywordflow">return</span> CreateRSA2&lt;SHA384, Result&gt;(standard);
<a name="l00413"></a>00413                 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (hash == <span class="stringliteral">&quot;512&quot;</span>)
<a name="l00414"></a>00414                         <span class="keywordflow">return</span> CreateRSA2&lt;SHA512, Result&gt;(standard);
<a name="l00415"></a>00415                 <span class="keywordflow">else</span>
<a name="l00416"></a>00416                         <span class="keywordflow">return</span> NULL;
<a name="l00417"></a>00417         }
<a name="l00418"></a>00418 
<a name="l00419"></a>00419         <span class="keyword">virtual</span> <span class="keywordtype">void</span> DoTest()
<a name="l00420"></a>00420         {
<a name="l00421"></a>00421                 std::string output;
<a name="l00422"></a>00422 
<a name="l00423"></a>00423                 <span class="keywordflow">if</span> (m_algorithm == <span class="stringliteral">&quot;DSA&quot;</span>)
<a name="l00424"></a>00424                 {
<a name="l00425"></a>00425                         <span class="keywordflow">if</span> (m_test == <span class="stringliteral">&quot;KeyPair&quot;</span>)
<a name="l00426"></a>00426                         {
<a name="l00427"></a>00427                                 <a class="code" href="class_d_l___group_parameters___d_s_a.html" title="DSA group parameters, these are GF(p) group parameters that are allowed by the DSA...">DL_GroupParameters_DSA</a> pqg;
<a name="l00428"></a>00428                                 <span class="keywordtype">int</span> modLen = atol(m_bracketString.substr(6).c_str());
<a name="l00429"></a>00429                                 pqg.<a class="code" href="class_generatable_crypto_material.html#a38d492343c32e530a5c2781b5797f755" title="calls the above function with a NameValuePairs object that just specifies &amp;quot;KeySize&amp;quot;...">GenerateRandomWithKeySize</a>(m_rng, modLen);
<a name="l00430"></a>00430 
<a name="l00431"></a>00431                                 OutputData(output, <span class="stringliteral">&quot;P &quot;</span>, pqg.GetModulus());
<a name="l00432"></a>00432                                 OutputData(output, <span class="stringliteral">&quot;Q &quot;</span>, pqg.GetSubgroupOrder());
<a name="l00433"></a>00433                                 OutputData(output, <span class="stringliteral">&quot;G &quot;</span>, pqg.GetSubgroupGenerator());
<a name="l00434"></a>00434 
<a name="l00435"></a>00435                                 <span class="keywordtype">int</span> n = atol(m_data[<span class="stringliteral">&quot;N&quot;</span>].c_str());
<a name="l00436"></a>00436                                 <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i=0; i&lt;n; i++)
<a name="l00437"></a>00437                                 {
<a name="l00438"></a>00438                                         <a class="code" href="class_p_k___final_template.html" title="A template implementing constructors for public key algorithm classes.">DSA::Signer</a> priv;
<a name="l00439"></a>00439                                         priv.AccessKey().GenerateRandom(m_rng, pqg);
<a name="l00440"></a>00440                                         <a class="code" href="class_p_k___final_template.html" title="A template implementing constructors for public key algorithm classes.">DSA::Verifier</a> pub(priv);
<a name="l00441"></a>00441 
<a name="l00442"></a>00442                                         OutputData(output, <span class="stringliteral">&quot;X &quot;</span>, priv.GetKey().GetPrivateExponent());
<a name="l00443"></a>00443                                         OutputData(output, <span class="stringliteral">&quot;Y &quot;</span>, pub.GetKey().GetPublicElement());
<a name="l00444"></a>00444                                         AttachedTransformation()-&gt;Put((byte *)output.data(), output.size());
<a name="l00445"></a>00445                                         output.resize(0);
<a name="l00446"></a>00446                                 }
<a name="l00447"></a>00447                         }
<a name="l00448"></a>00448                         <span class="keywordflow">else</span> <span class="keywordflow">if</span> (m_test == <span class="stringliteral">&quot;PQGGen&quot;</span>)
<a name="l00449"></a>00449                         {
<a name="l00450"></a>00450                                 <span class="keywordtype">int</span> n = atol(m_data[<span class="stringliteral">&quot;N&quot;</span>].c_str());
<a name="l00451"></a>00451                                 <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i=0; i&lt;n; i++)
<a name="l00452"></a>00452                                 {
<a name="l00453"></a>00453                                         <a class="code" href="class_integer.html" title="multiple precision integer and basic arithmetics">Integer</a> p, q, h, g;
<a name="l00454"></a>00454                                         <span class="keywordtype">int</span> counter;
<a name="l00455"></a>00455                                         
<a name="l00456"></a>00456                                         <a class="code" href="class_sec_block.html" title="a block of memory allocated using A">SecByteBlock</a> seed(SHA::DIGESTSIZE);
<a name="l00457"></a>00457                                         <span class="keywordflow">do</span>
<a name="l00458"></a>00458                                         {
<a name="l00459"></a>00459                                                 m_rng.GenerateBlock(seed, seed.size());
<a name="l00460"></a>00460                                         }
<a name="l00461"></a>00461                                         <span class="keywordflow">while</span> (!<a class="code" href="struct_d_s_a.html#a48eab0da4234a2d20f3ef7250fbad5f5" title="Generate DSA primes according to NIST standard.">DSA::GeneratePrimes</a>(seed, seed.size()*8, counter, p, 1024, q));
<a name="l00462"></a>00462                                         h.Randomize(m_rng, 2, p-2);
<a name="l00463"></a>00463                                         g = a_exp_b_mod_c(h, (p-1)/q, p);
<a name="l00464"></a>00464 
<a name="l00465"></a>00465                                         OutputData(output, <span class="stringliteral">&quot;P &quot;</span>, p);
<a name="l00466"></a>00466                                         OutputData(output, <span class="stringliteral">&quot;Q &quot;</span>, q);
<a name="l00467"></a>00467                                         OutputData(output, <span class="stringliteral">&quot;G &quot;</span>, g);
<a name="l00468"></a>00468                                         OutputData(output, <span class="stringliteral">&quot;Seed &quot;</span>, seed);
<a name="l00469"></a>00469                                         OutputData(output, <span class="stringliteral">&quot;c &quot;</span>, counter);
<a name="l00470"></a>00470                                         OutputData(output, <span class="stringliteral">&quot;H &quot;</span>, h, p.<a class="code" href="class_integer.html#aea4f2d31725ab02c67d9ea0288767670" title="number of significant bytes = ceiling(BitCount()/8)">ByteCount</a>());
<a name="l00471"></a>00471                                         AttachedTransformation()-&gt;Put((byte *)output.data(), output.size());
<a name="l00472"></a>00472                                         output.resize(0);
<a name="l00473"></a>00473                                 }
<a name="l00474"></a>00474                         }
<a name="l00475"></a>00475                         <span class="keywordflow">else</span> <span class="keywordflow">if</span> (m_test == <span class="stringliteral">&quot;SigGen&quot;</span>)
<a name="l00476"></a>00476                         {
<a name="l00477"></a>00477                                 std::string &amp;encodedKey = m_data[<span class="stringliteral">&quot;PrivKey&quot;</span>];
<a name="l00478"></a>00478                                 <span class="keywordtype">int</span> modLen = atol(m_bracketString.substr(6).c_str());
<a name="l00479"></a>00479                                 <a class="code" href="class_d_l___private_key___with_signature_pairwise_consistency_test.html" title="_">DSA::PrivateKey</a> priv;
<a name="l00480"></a>00480 
<a name="l00481"></a>00481                                 <span class="keywordflow">if</span> (!encodedKey.empty())
<a name="l00482"></a>00482                                 {
<a name="l00483"></a>00483                                         <a class="code" href="class_string_store.html" title="string-based implementation of Store interface">StringStore</a> s(encodedKey);
<a name="l00484"></a>00484                                         priv.BERDecode(s);
<a name="l00485"></a>00485                                         <span class="keywordflow">if</span> (priv.GetGroupParameters().GetModulus().BitCount() != modLen)
<a name="l00486"></a>00486                                                 encodedKey.clear();
<a name="l00487"></a>00487                                 }
<a name="l00488"></a>00488 
<a name="l00489"></a>00489                                 <span class="keywordflow">if</span> (encodedKey.empty())
<a name="l00490"></a>00490                                 {
<a name="l00491"></a>00491                                         priv.Initialize(m_rng, modLen);
<a name="l00492"></a>00492                                         <a class="code" href="class_string_sink_template.html" title="Append input to a string object.">StringSink</a> s(encodedKey);
<a name="l00493"></a>00493                                         priv.DEREncode(s);
<a name="l00494"></a>00494                                         OutputData(output, <span class="stringliteral">&quot;P &quot;</span>, priv.GetGroupParameters().GetModulus());
<a name="l00495"></a>00495                                         OutputData(output, <span class="stringliteral">&quot;Q &quot;</span>, priv.GetGroupParameters().GetSubgroupOrder());
<a name="l00496"></a>00496                                         OutputData(output, <span class="stringliteral">&quot;G &quot;</span>, priv.GetGroupParameters().GetSubgroupGenerator());
<a name="l00497"></a>00497                                 }
<a name="l00498"></a>00498 
<a name="l00499"></a>00499                                 <a class="code" href="class_p_k___final_template.html" title="A template implementing constructors for public key algorithm classes.">DSA::Signer</a> signer(priv);
<a name="l00500"></a>00500                                 <a class="code" href="class_p_k___final_template.html" title="A template implementing constructors for public key algorithm classes.">DSA::Verifier</a> pub(signer);
<a name="l00501"></a>00501                                 OutputData(output, <span class="stringliteral">&quot;Msg &quot;</span>, m_data[<span class="stringliteral">&quot;Msg&quot;</span>]);
<a name="l00502"></a>00502                                 OutputData(output, <span class="stringliteral">&quot;Y &quot;</span>, pub.GetKey().GetPublicElement());
<a name="l00503"></a>00503 
<a name="l00504"></a>00504                                 <a class="code" href="class_sec_block.html" title="a block of memory allocated using A">SecByteBlock</a> sig(signer.SignatureLength());
<a name="l00505"></a>00505                                 <a class="code" href="class_string_source.html" title="string-based implementation of Source interface">StringSource</a>(m_data[<span class="stringliteral">&quot;Msg&quot;</span>], <span class="keyword">true</span>, <span class="keyword">new</span> <a class="code" href="class_hex_decoder.html" title="Decode base 16 data back to bytes.">HexDecoder</a>(<span class="keyword">new</span> <a class="code" href="class_signer_filter.html" title="Filter Wrapper for PK_Signer.">SignerFilter</a>(m_rng, signer, <span class="keyword">new</span> <a class="code" href="class_array_sink.html" title="Copy input to a memory buffer.">ArraySink</a>(sig, sig.size()))));
<a name="l00506"></a>00506                                 <a class="code" href="class_sec_block.html" title="a block of memory allocated using A">SecByteBlock</a> R(sig, sig.size()/2), S(sig+sig.size()/2, sig.size()/2);
<a name="l00507"></a>00507                                 OutputData(output, <span class="stringliteral">&quot;R &quot;</span>, R);
<a name="l00508"></a>00508                                 OutputData(output, <span class="stringliteral">&quot;S &quot;</span>, S);
<a name="l00509"></a>00509                                 AttachedTransformation()-&gt;Put((byte *)output.data(), output.size());
<a name="l00510"></a>00510                                 output.resize(0);
<a name="l00511"></a>00511                         }
<a name="l00512"></a>00512                         <span class="keywordflow">else</span> <span class="keywordflow">if</span> (m_test == <span class="stringliteral">&quot;SigVer&quot;</span>)
<a name="l00513"></a>00513                         {
<a name="l00514"></a>00514                                 <a class="code" href="class_integer.html" title="multiple precision integer and basic arithmetics">Integer</a> p((m_data[<span class="stringliteral">&quot;P&quot;</span>] + <span class="stringliteral">&quot;h&quot;</span>).c_str());
<a name="l00515"></a>00515                                 <a class="code" href="class_integer.html" title="multiple precision integer and basic arithmetics">Integer</a> q((m_data[<span class="stringliteral">&quot;Q&quot;</span>] + <span class="stringliteral">&quot;h&quot;</span>).c_str());
<a name="l00516"></a>00516                                 <a class="code" href="class_integer.html" title="multiple precision integer and basic arithmetics">Integer</a> g((m_data[<span class="stringliteral">&quot;G&quot;</span>] + <span class="stringliteral">&quot;h&quot;</span>).c_str());
<a name="l00517"></a>00517                                 <a class="code" href="class_integer.html" title="multiple precision integer and basic arithmetics">Integer</a> y((m_data[<span class="stringliteral">&quot;Y&quot;</span>] + <span class="stringliteral">&quot;h&quot;</span>).c_str());
<a name="l00518"></a>00518                                 <a class="code" href="class_p_k___final_template.html" title="A template implementing constructors for public key algorithm classes.">DSA::Verifier</a> verifier(p, q, g, y);
<a name="l00519"></a>00519 
<a name="l00520"></a>00520                                 <a class="code" href="class_hex_decoder.html" title="Decode base 16 data back to bytes.">HexDecoder</a> filter(<span class="keyword">new</span> <a class="code" href="class_signature_verification_filter.html" title="Filter Wrapper for PK_Verifier.">SignatureVerificationFilter</a>(verifier));
<a name="l00521"></a>00521                                 <a class="code" href="class_string_source.html" title="string-based implementation of Source interface">StringSource</a>(m_data[<span class="stringliteral">&quot;R&quot;</span>], <span class="keyword">true</span>, <span class="keyword">new</span> <a class="code" href="class_redirector.html" title="Redirect input to another BufferedTransformation without owning it.">Redirector</a>(filter, Redirector::DATA_ONLY));
<a name="l00522"></a>00522                                 <a class="code" href="class_string_source.html" title="string-based implementation of Source interface">StringSource</a>(m_data[<span class="stringliteral">&quot;S&quot;</span>], <span class="keyword">true</span>, <span class="keyword">new</span> <a class="code" href="class_redirector.html" title="Redirect input to another BufferedTransformation without owning it.">Redirector</a>(filter, Redirector::DATA_ONLY));
<a name="l00523"></a>00523                                 <a class="code" href="class_string_source.html" title="string-based implementation of Source interface">StringSource</a>(m_data[<span class="stringliteral">&quot;Msg&quot;</span>], <span class="keyword">true</span>, <span class="keyword">new</span> <a class="code" href="class_redirector.html" title="Redirect input to another BufferedTransformation without owning it.">Redirector</a>(filter, Redirector::DATA_ONLY));
<a name="l00524"></a>00524                                 filter.MessageEnd();
<a name="l00525"></a>00525                                 byte b;
<a name="l00526"></a>00526                                 filter.Get(b);
<a name="l00527"></a>00527                                 OutputData(output, <span class="stringliteral">&quot;Result &quot;</span>, b ? <span class="stringliteral">&quot;P&quot;</span> : <span class="stringliteral">&quot;F&quot;</span>);
<a name="l00528"></a>00528                                 AttachedTransformation()-&gt;Put((byte *)output.data(), output.size());
<a name="l00529"></a>00529                                 output.resize(0);
<a name="l00530"></a>00530                         }
<a name="l00531"></a>00531                         <span class="keywordflow">else</span> <span class="keywordflow">if</span> (m_test == <span class="stringliteral">&quot;PQGVer&quot;</span>)
<a name="l00532"></a>00532                         {
<a name="l00533"></a>00533                                 <a class="code" href="class_integer.html" title="multiple precision integer and basic arithmetics">Integer</a> p((m_data[<span class="stringliteral">&quot;P&quot;</span>] + <span class="stringliteral">&quot;h&quot;</span>).c_str());
<a name="l00534"></a>00534                                 <a class="code" href="class_integer.html" title="multiple precision integer and basic arithmetics">Integer</a> q((m_data[<span class="stringliteral">&quot;Q&quot;</span>] + <span class="stringliteral">&quot;h&quot;</span>).c_str());
<a name="l00535"></a>00535                                 <a class="code" href="class_integer.html" title="multiple precision integer and basic arithmetics">Integer</a> g((m_data[<span class="stringliteral">&quot;G&quot;</span>] + <span class="stringliteral">&quot;h&quot;</span>).c_str());
<a name="l00536"></a>00536                                 <a class="code" href="class_integer.html" title="multiple precision integer and basic arithmetics">Integer</a> h((m_data[<span class="stringliteral">&quot;H&quot;</span>] + <span class="stringliteral">&quot;h&quot;</span>).c_str());
<a name="l00537"></a>00537                                 <span class="keywordtype">int</span> c = atol(m_data[<span class="stringliteral">&quot;c&quot;</span>].c_str());
<a name="l00538"></a>00538                                 <a class="code" href="class_sec_block.html" title="a block of memory allocated using A">SecByteBlock</a> seed(m_data[<span class="stringliteral">&quot;Seed&quot;</span>].size()/2);
<a name="l00539"></a>00539                                 <a class="code" href="class_string_source.html" title="string-based implementation of Source interface">StringSource</a>(m_data[<span class="stringliteral">&quot;Seed&quot;</span>], <span class="keyword">true</span>, <span class="keyword">new</span> <a class="code" href="class_hex_decoder.html" title="Decode base 16 data back to bytes.">HexDecoder</a>(<span class="keyword">new</span> <a class="code" href="class_array_sink.html" title="Copy input to a memory buffer.">ArraySink</a>(seed, seed.size())));
<a name="l00540"></a>00540 
<a name="l00541"></a>00541                                 <a class="code" href="class_integer.html" title="multiple precision integer and basic arithmetics">Integer</a> p1, q1;
<a name="l00542"></a>00542                                 <span class="keywordtype">bool</span> result = <a class="code" href="struct_d_s_a.html#a48eab0da4234a2d20f3ef7250fbad5f5" title="Generate DSA primes according to NIST standard.">DSA::GeneratePrimes</a>(seed, seed.size()*8, c, p1, 1024, q1, <span class="keyword">true</span>);
<a name="l00543"></a>00543                                 result = result &amp;&amp; (p1 == p &amp;&amp; q1 == q);
<a name="l00544"></a>00544                                 result = result &amp;&amp; g == a_exp_b_mod_c(h, (p-1)/q, p);
<a name="l00545"></a>00545 
<a name="l00546"></a>00546                                 OutputData(output, <span class="stringliteral">&quot;Result &quot;</span>, result ? <span class="stringliteral">&quot;P&quot;</span> : <span class="stringliteral">&quot;F&quot;</span>);
<a name="l00547"></a>00547                                 AttachedTransformation()-&gt;Put((byte *)output.data(), output.size());
<a name="l00548"></a>00548                                 output.resize(0);
<a name="l00549"></a>00549                         }
<a name="l00550"></a>00550 
<a name="l00551"></a>00551                         <span class="keywordflow">return</span>;
<a name="l00552"></a>00552                 }
<a name="l00553"></a>00553 
<a name="l00554"></a>00554                 <span class="keywordflow">if</span> (m_algorithm == <span class="stringliteral">&quot;ECDSA&quot;</span>)
<a name="l00555"></a>00555                 {
<a name="l00556"></a>00556                         std::map&lt;std::string, OID&gt; name2oid;
<a name="l00557"></a>00557                         name2oid[<span class="stringliteral">&quot;P-192&quot;</span>] = ASN1::secp192r1();
<a name="l00558"></a>00558                         name2oid[<span class="stringliteral">&quot;P-224&quot;</span>] = ASN1::secp224r1();
<a name="l00559"></a>00559                         name2oid[<span class="stringliteral">&quot;P-256&quot;</span>] = ASN1::secp256r1();
<a name="l00560"></a>00560                         name2oid[<span class="stringliteral">&quot;P-384&quot;</span>] = ASN1::secp384r1();
<a name="l00561"></a>00561                         name2oid[<span class="stringliteral">&quot;P-521&quot;</span>] = ASN1::secp521r1();
<a name="l00562"></a>00562                         name2oid[<span class="stringliteral">&quot;K-163&quot;</span>] = ASN1::sect163k1();
<a name="l00563"></a>00563                         name2oid[<span class="stringliteral">&quot;K-233&quot;</span>] = ASN1::sect233k1();
<a name="l00564"></a>00564                         name2oid[<span class="stringliteral">&quot;K-283&quot;</span>] = ASN1::sect283k1();
<a name="l00565"></a>00565                         name2oid[<span class="stringliteral">&quot;K-409&quot;</span>] = ASN1::sect409k1();
<a name="l00566"></a>00566                         name2oid[<span class="stringliteral">&quot;K-571&quot;</span>] = ASN1::sect571k1();
<a name="l00567"></a>00567                         name2oid[<span class="stringliteral">&quot;B-163&quot;</span>] = ASN1::sect163r2();
<a name="l00568"></a>00568                         name2oid[<span class="stringliteral">&quot;B-233&quot;</span>] = ASN1::sect233r1();
<a name="l00569"></a>00569                         name2oid[<span class="stringliteral">&quot;B-283&quot;</span>] = ASN1::sect283r1();
<a name="l00570"></a>00570                         name2oid[<span class="stringliteral">&quot;B-409&quot;</span>] = ASN1::sect409r1();
<a name="l00571"></a>00571                         name2oid[<span class="stringliteral">&quot;B-571&quot;</span>] = ASN1::sect571r1();
<a name="l00572"></a>00572 
<a name="l00573"></a>00573                         <span class="keywordflow">if</span> (m_test == <span class="stringliteral">&quot;PKV&quot;</span>)
<a name="l00574"></a>00574                         {
<a name="l00575"></a>00575                                 <span class="keywordtype">bool</span> pass;
<a name="l00576"></a>00576                                 <span class="keywordflow">if</span> (m_bracketString[0] == <span class="charliteral">&apos;P&apos;</span>)
<a name="l00577"></a>00577                                         pass = EC_PKV&lt;ECP&gt;(m_rng, DecodeHex(m_data[<span class="stringliteral">&quot;Qx&quot;</span>]), DecodeHex(m_data[<span class="stringliteral">&quot;Qy&quot;</span>]), name2oid[m_bracketString]);
<a name="l00578"></a>00578                                 <span class="keywordflow">else</span>
<a name="l00579"></a>00579                                         pass = EC_PKV&lt;EC2N&gt;(m_rng, DecodeHex(m_data[<span class="stringliteral">&quot;Qx&quot;</span>]), DecodeHex(m_data[<span class="stringliteral">&quot;Qy&quot;</span>]), name2oid[m_bracketString]);
<a name="l00580"></a>00580 
<a name="l00581"></a>00581                                 OutputData(output, <span class="stringliteral">&quot;Result &quot;</span>, pass ? <span class="stringliteral">&quot;P&quot;</span> : <span class="stringliteral">&quot;F&quot;</span>);
<a name="l00582"></a>00582                         }
<a name="l00583"></a>00583                         <span class="keywordflow">else</span> <span class="keywordflow">if</span> (m_test == <span class="stringliteral">&quot;KeyPair&quot;</span>)
<a name="l00584"></a>00584                         {
<a name="l00585"></a>00585                                 <span class="keywordflow">if</span> (m_bracketString[0] == <span class="charliteral">&apos;P&apos;</span>)
<a name="l00586"></a>00586                                         EC_KeyPair&lt;ECP&gt;(output, atol(m_data[<span class="stringliteral">&quot;N&quot;</span>].c_str()), name2oid[m_bracketString]);
<a name="l00587"></a>00587                                 <span class="keywordflow">else</span>
<a name="l00588"></a>00588                                         EC_KeyPair&lt;EC2N&gt;(output, atol(m_data[<span class="stringliteral">&quot;N&quot;</span>].c_str()), name2oid[m_bracketString]);
<a name="l00589"></a>00589                         }
<a name="l00590"></a>00590                         <span class="keywordflow">else</span> <span class="keywordflow">if</span> (m_test == <span class="stringliteral">&quot;SigGen&quot;</span>)
<a name="l00591"></a>00591                         {
<a name="l00592"></a>00592                                 <span class="keywordflow">if</span> (m_bracketString[0] == <span class="charliteral">&apos;P&apos;</span>)
<a name="l00593"></a>00593                                         EC_SigGen&lt;ECP&gt;(output, name2oid[m_bracketString]);
<a name="l00594"></a>00594                                 <span class="keywordflow">else</span>
<a name="l00595"></a>00595                                         EC_SigGen&lt;EC2N&gt;(output, name2oid[m_bracketString]);
<a name="l00596"></a>00596                         }
<a name="l00597"></a>00597                         <span class="keywordflow">else</span> <span class="keywordflow">if</span> (m_test == <span class="stringliteral">&quot;SigVer&quot;</span>)
<a name="l00598"></a>00598                         {
<a name="l00599"></a>00599                                 <span class="keywordflow">if</span> (m_bracketString[0] == <span class="charliteral">&apos;P&apos;</span>)
<a name="l00600"></a>00600                                         EC_SigVer&lt;ECP&gt;(output, name2oid[m_bracketString]);
<a name="l00601"></a>00601                                 <span class="keywordflow">else</span>
<a name="l00602"></a>00602                                         EC_SigVer&lt;EC2N&gt;(output, name2oid[m_bracketString]);
<a name="l00603"></a>00603                         }
<a name="l00604"></a>00604 
<a name="l00605"></a>00605                         AttachedTransformation()-&gt;Put((byte *)output.data(), output.size());
<a name="l00606"></a>00606                         output.resize(0);
<a name="l00607"></a>00607                         <span class="keywordflow">return</span>;
<a name="l00608"></a>00608                 }
<a name="l00609"></a>00609 
<a name="l00610"></a>00610                 <span class="keywordflow">if</span> (m_algorithm == <span class="stringliteral">&quot;RSA&quot;</span>)
<a name="l00611"></a>00611                 {
<a name="l00612"></a>00612                         std::string shaAlg = m_data[<span class="stringliteral">&quot;SHAAlg&quot;</span>].substr(3);
<a name="l00613"></a>00613 
<a name="l00614"></a>00614                         <span class="keywordflow">if</span> (m_test == <span class="stringliteral">&quot;Ver&quot;</span>)
<a name="l00615"></a>00615                         {
<a name="l00616"></a>00616                                 <a class="code" href="class_integer.html" title="multiple precision integer and basic arithmetics">Integer</a> n((m_data[<span class="stringliteral">&quot;n&quot;</span>] + <span class="stringliteral">&quot;h&quot;</span>).c_str());
<a name="l00617"></a>00617                                 <a class="code" href="class_integer.html" title="multiple precision integer and basic arithmetics">Integer</a> e((m_data[<span class="stringliteral">&quot;e&quot;</span>] + <span class="stringliteral">&quot;h&quot;</span>).c_str());
<a name="l00618"></a>00618                                 <a class="code" href="class_r_s_a_function.html" title="_">RSA::PublicKey</a> pub;
<a name="l00619"></a>00619                                 pub.Initialize(n, e);
<a name="l00620"></a>00620 
<a name="l00621"></a>00621                                 <a class="code" href="classmember__ptr.html">member_ptr&lt;PK_Verifier&gt;</a> pV(CreateRSA&lt;PK_Verifier&gt;(m_mode, shaAlg));
<a name="l00622"></a>00622                                 pV-&gt;AccessMaterial().AssignFrom(pub);
<a name="l00623"></a>00623 
<a name="l00624"></a>00624                                 <a class="code" href="class_hex_decoder.html" title="Decode base 16 data back to bytes.">HexDecoder</a> filter(<span class="keyword">new</span> <a class="code" href="class_signature_verification_filter.html" title="Filter Wrapper for PK_Verifier.">SignatureVerificationFilter</a>(*pV));
<a name="l00625"></a>00625                                 <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i=m_data[<span class="stringliteral">&quot;S&quot;</span>].size(); i&lt;pV-&gt;SignatureLength()*2; i++)
<a name="l00626"></a>00626                                         filter.Put(<span class="charliteral">&apos;0&apos;</span>);
<a name="l00627"></a>00627                                 <a class="code" href="class_string_source.html" title="string-based implementation of Source interface">StringSource</a>(m_data[<span class="stringliteral">&quot;S&quot;</span>], <span class="keyword">true</span>, <span class="keyword">new</span> <a class="code" href="class_redirector.html" title="Redirect input to another BufferedTransformation without owning it.">Redirector</a>(filter, Redirector::DATA_ONLY));
<a name="l00628"></a>00628                                 <a class="code" href="class_string_source.html" title="string-based implementation of Source interface">StringSource</a>(m_data[<span class="stringliteral">&quot;Msg&quot;</span>], <span class="keyword">true</span>, <span class="keyword">new</span> <a class="code" href="class_redirector.html" title="Redirect input to another BufferedTransformation without owning it.">Redirector</a>(filter, Redirector::DATA_ONLY));
<a name="l00629"></a>00629                                 filter.MessageEnd();
<a name="l00630"></a>00630                                 byte b;
<a name="l00631"></a>00631                                 filter.Get(b);
<a name="l00632"></a>00632                                 OutputData(output, <span class="stringliteral">&quot;Result &quot;</span>, b ? <span class="stringliteral">&quot;P&quot;</span> : <span class="stringliteral">&quot;F&quot;</span>);
<a name="l00633"></a>00633                         }
<a name="l00634"></a>00634                         <span class="keywordflow">else</span>
<a name="l00635"></a>00635                         {
<a name="l00636"></a>00636                                 assert(m_test == <span class="stringliteral">&quot;Gen&quot;</span>);
<a name="l00637"></a>00637                                 <span class="keywordtype">int</span> modLen = atol(m_bracketString.substr(6).c_str());
<a name="l00638"></a>00638                                 std::string &amp;encodedKey = m_data[<span class="stringliteral">&quot;PrivKey&quot;</span>];
<a name="l00639"></a>00639                                 <a class="code" href="class_invertible_r_s_a_function.html" title="_">RSA::PrivateKey</a> priv;
<a name="l00640"></a>00640 
<a name="l00641"></a>00641                                 <span class="keywordflow">if</span> (!encodedKey.empty())
<a name="l00642"></a>00642                                 {
<a name="l00643"></a>00643                                         <a class="code" href="class_string_store.html" title="string-based implementation of Store interface">StringStore</a> s(encodedKey);
<a name="l00644"></a>00644                                         priv.<a class="code" href="class_invertible_r_s_a_function.html#a315fea96cb04dc41150d92cf5d1ce3e0" title="decode this object from a BufferedTransformation, using BER (Basic Encoding Rules)...">BERDecode</a>(s);
<a name="l00645"></a>00645                                         <span class="keywordflow">if</span> (priv.GetModulus().<a class="code" href="class_integer.html#a178398002ab175e788a3bc224e5e5a8d" title="number of significant bits = floor(log2(abs(*this))) + 1">BitCount</a>() != modLen)
<a name="l00646"></a>00646                                                 encodedKey.clear();
<a name="l00647"></a>00647                                 }
<a name="l00648"></a>00648 
<a name="l00649"></a>00649                                 <span class="keywordflow">if</span> (encodedKey.empty())
<a name="l00650"></a>00650                                 {
<a name="l00651"></a>00651                                         priv.Initialize(m_rng, modLen);
<a name="l00652"></a>00652                                         <a class="code" href="class_string_sink_template.html" title="Append input to a string object.">StringSink</a> s(encodedKey);
<a name="l00653"></a>00653                                         priv.<a class="code" href="class_invertible_r_s_a_function.html#af8c59c737c96b4809734971d0703707d" title="encode this object into a BufferedTransformation, using DER (Distinguished Encoding...">DEREncode</a>(s);
<a name="l00654"></a>00654                                         OutputData(output, <span class="stringliteral">&quot;n &quot;</span>, priv.GetModulus());
<a name="l00655"></a>00655                                         OutputData(output, <span class="stringliteral">&quot;e &quot;</span>, priv.GetPublicExponent(), modLen/8);
<a name="l00656"></a>00656                                 }
<a name="l00657"></a>00657 
<a name="l00658"></a>00658                                 <a class="code" href="classmember__ptr.html">member_ptr&lt;PK_Signer&gt;</a> pS(CreateRSA&lt;PK_Signer&gt;(m_mode, shaAlg));
<a name="l00659"></a>00659                                 pS-&gt;AccessMaterial().AssignFrom(priv);
<a name="l00660"></a>00660 
<a name="l00661"></a>00661                                 <a class="code" href="class_sec_block.html" title="a block of memory allocated using A">SecByteBlock</a> sig(pS-&gt;SignatureLength());
<a name="l00662"></a>00662                                 <a class="code" href="class_string_source.html" title="string-based implementation of Source interface">StringSource</a>(m_data[<span class="stringliteral">&quot;Msg&quot;</span>], <span class="keyword">true</span>, <span class="keyword">new</span> <a class="code" href="class_hex_decoder.html" title="Decode base 16 data back to bytes.">HexDecoder</a>(<span class="keyword">new</span> <a class="code" href="class_signer_filter.html" title="Filter Wrapper for PK_Signer.">SignerFilter</a>(m_rng, *pS, <span class="keyword">new</span> <a class="code" href="class_array_sink.html" title="Copy input to a memory buffer.">ArraySink</a>(sig, sig.size()))));
<a name="l00663"></a>00663                                 OutputData(output, <span class="stringliteral">&quot;SHAAlg &quot;</span>, m_data[<span class="stringliteral">&quot;SHAAlg&quot;</span>]);
<a name="l00664"></a>00664                                 OutputData(output, <span class="stringliteral">&quot;Msg &quot;</span>, m_data[<span class="stringliteral">&quot;Msg&quot;</span>]);
<a name="l00665"></a>00665                                 OutputData(output, <span class="stringliteral">&quot;S &quot;</span>, sig);
<a name="l00666"></a>00666                         }
<a name="l00667"></a>00667 
<a name="l00668"></a>00668                         AttachedTransformation()-&gt;Put((byte *)output.data(), output.size());
<a name="l00669"></a>00669                         output.resize(0);
<a name="l00670"></a>00670                         <span class="keywordflow">return</span>;
<a name="l00671"></a>00671                 }
<a name="l00672"></a>00672 
<a name="l00673"></a>00673                 <span class="keywordflow">if</span> (m_algorithm == <span class="stringliteral">&quot;SHA&quot;</span>)
<a name="l00674"></a>00674                 {
<a name="l00675"></a>00675                         <a class="code" href="classmember__ptr.html">member_ptr&lt;HashFunction&gt;</a> pHF;
<a name="l00676"></a>00676 
<a name="l00677"></a>00677                         <span class="keywordflow">if</span> (m_mode == <span class="stringliteral">&quot;1&quot;</span>)
<a name="l00678"></a>00678                                 pHF.reset(<span class="keyword">new</span> <a class="code" href="class_s_h_a1.html" title="SHA-1">SHA1</a>);
<a name="l00679"></a>00679                         <span class="keywordflow">else</span> <span class="keywordflow">if</span> (m_mode == <span class="stringliteral">&quot;224&quot;</span>)
<a name="l00680"></a>00680                                 pHF.reset(<span class="keyword">new</span> <a class="code" href="class_s_h_a224.html" title="implements the SHA-224 standard">SHA224</a>);
<a name="l00681"></a>00681                         <span class="keywordflow">else</span> <span class="keywordflow">if</span> (m_mode == <span class="stringliteral">&quot;256&quot;</span>)
<a name="l00682"></a>00682                                 pHF.reset(<span class="keyword">new</span> <a class="code" href="class_s_h_a256.html" title="implements the SHA-256 standard">SHA256</a>);
<a name="l00683"></a>00683                         <span class="keywordflow">else</span> <span class="keywordflow">if</span> (m_mode == <span class="stringliteral">&quot;384&quot;</span>)
<a name="l00684"></a>00684                                 pHF.reset(<span class="keyword">new</span> <a class="code" href="class_s_h_a384.html" title="implements the SHA-384 standard">SHA384</a>);
<a name="l00685"></a>00685                         <span class="keywordflow">else</span> <span class="keywordflow">if</span> (m_mode == <span class="stringliteral">&quot;512&quot;</span>)
<a name="l00686"></a>00686                                 pHF.reset(<span class="keyword">new</span> <a class="code" href="class_s_h_a512.html" title="implements the SHA-512 standard">SHA512</a>);
<a name="l00687"></a>00687 
<a name="l00688"></a>00688                         <span class="keywordflow">if</span> (m_test == <span class="stringliteral">&quot;MONTE&quot;</span>)
<a name="l00689"></a>00689                         {
<a name="l00690"></a>00690                                 <a class="code" href="class_sec_block.html" title="a block of memory allocated using A">SecByteBlock</a> seed = m_data2[INPUT];
<a name="l00691"></a>00691                                 <a class="code" href="class_sec_block.html" title="a block of memory allocated using A">SecByteBlock</a> MD[1003];
<a name="l00692"></a>00692                                 <span class="keywordtype">int</span> i,j;
<a name="l00693"></a>00693 
<a name="l00694"></a>00694                                 <span class="keywordflow">for</span> (j=0; j&lt;100; j++)
<a name="l00695"></a>00695                                 {
<a name="l00696"></a>00696                                         MD[0] = MD[1] = MD[2] = seed;
<a name="l00697"></a>00697                                         <span class="keywordflow">for</span> (i=3; i&lt;1003; i++)
<a name="l00698"></a>00698                                         {
<a name="l00699"></a>00699                                                 <a class="code" href="class_sec_block.html" title="a block of memory allocated using A">SecByteBlock</a> Mi = MD[i-3] + MD[i-2] + MD[i-1];
<a name="l00700"></a>00700                                                 MD[i].<a class="code" href="class_sec_block.html#af9e98d3f4a7af1156fcf3e6e68f4ae5a" title="change size and preserve contents">resize</a>(pHF-&gt;DigestSize());
<a name="l00701"></a>00701                                                 pHF-&gt;CalculateDigest(MD[i], Mi, Mi.size());
<a name="l00702"></a>00702                                         }
<a name="l00703"></a>00703                                         seed = MD[1002];
<a name="l00704"></a>00704                                         OutputData(output, <span class="stringliteral">&quot;COUNT &quot;</span>, j);
<a name="l00705"></a>00705                                         OutputData(output, <span class="stringliteral">&quot;MD &quot;</span>, seed);
<a name="l00706"></a>00706                                         AttachedTransformation()-&gt;Put((byte *)output.data(), output.size());
<a name="l00707"></a>00707                                         output.resize(0);
<a name="l00708"></a>00708                                 }
<a name="l00709"></a>00709                         }
<a name="l00710"></a>00710                         <span class="keywordflow">else</span>
<a name="l00711"></a>00711                         {
<a name="l00712"></a>00712                                 <a class="code" href="class_sec_block.html" title="a block of memory allocated using A">SecByteBlock</a> tag(pHF-&gt;DigestSize());
<a name="l00713"></a>00713                                 <a class="code" href="class_sec_block.html" title="a block of memory allocated using A">SecByteBlock</a> &amp;msg(m_data2[INPUT]);
<a name="l00714"></a>00714                                 <span class="keywordtype">int</span> len = atol(m_data[<span class="stringliteral">&quot;Len&quot;</span>].c_str());
<a name="l00715"></a>00715                                 <a class="code" href="class_string_source.html" title="string-based implementation of Source interface">StringSource</a>(msg.begin(), len/8, <span class="keyword">true</span>, <span class="keyword">new</span> <a class="code" href="class_hash_filter.html" title="Filter Wrapper for HashTransformation.">HashFilter</a>(*pHF, <span class="keyword">new</span> <a class="code" href="class_array_sink.html" title="Copy input to a memory buffer.">ArraySink</a>(tag, tag.size())));
<a name="l00716"></a>00716                                 OutputData(output, <span class="stringliteral">&quot;MD &quot;</span>, tag);
<a name="l00717"></a>00717                                 AttachedTransformation()-&gt;Put((byte *)output.data(), output.size());
<a name="l00718"></a>00718                                 output.resize(0);
<a name="l00719"></a>00719                         }
<a name="l00720"></a>00720                         <span class="keywordflow">return</span>;
<a name="l00721"></a>00721                 }
<a name="l00722"></a>00722 
<a name="l00723"></a>00723                 <a class="code" href="class_sec_block.html" title="a block of memory allocated using A">SecByteBlock</a> &amp;key = m_data2[KEY_T];
<a name="l00724"></a>00724 
<a name="l00725"></a>00725                 <span class="keywordflow">if</span> (m_algorithm == <span class="stringliteral">&quot;TDES&quot;</span>)
<a name="l00726"></a>00726                 {
<a name="l00727"></a>00727                         <span class="keywordflow">if</span> (!m_data[<span class="stringliteral">&quot;KEY1&quot;</span>].empty())
<a name="l00728"></a>00728                         {
<a name="l00729"></a>00729                                 <span class="keyword">const</span> std::string keys[3] = {m_data[<span class="stringliteral">&quot;KEY1&quot;</span>], m_data[<span class="stringliteral">&quot;KEY2&quot;</span>], m_data[<span class="stringliteral">&quot;KEY3&quot;</span>]};
<a name="l00730"></a>00730                                 key.<a class="code" href="class_sec_block.html#af9e98d3f4a7af1156fcf3e6e68f4ae5a" title="change size and preserve contents">resize</a>(24);
<a name="l00731"></a>00731                                 <a class="code" href="class_hex_decoder.html" title="Decode base 16 data back to bytes.">HexDecoder</a> hexDec(<span class="keyword">new</span> <a class="code" href="class_array_sink.html" title="Copy input to a memory buffer.">ArraySink</a>(key, key.size()));
<a name="l00732"></a>00732                                 <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i=0; i&lt;3; i++)
<a name="l00733"></a>00733                                         hexDec.Put((byte *)keys[i].data(), keys[i].size());
<a name="l00734"></a>00734 
<a name="l00735"></a>00735                                 <span class="keywordflow">if</span> (keys[0] == keys[2])
<a name="l00736"></a>00736                                 {
<a name="l00737"></a>00737                                         <span class="keywordflow">if</span> (keys[0] == keys[1])
<a name="l00738"></a>00738                                                 key.<a class="code" href="class_sec_block.html#af9e98d3f4a7af1156fcf3e6e68f4ae5a" title="change size and preserve contents">resize</a>(8);
<a name="l00739"></a>00739                                         <span class="keywordflow">else</span>
<a name="l00740"></a>00740                                                 key.<a class="code" href="class_sec_block.html#af9e98d3f4a7af1156fcf3e6e68f4ae5a" title="change size and preserve contents">resize</a>(16);
<a name="l00741"></a>00741                                 }
<a name="l00742"></a>00742                                 <span class="keywordflow">else</span>
<a name="l00743"></a>00743                                         key.<a class="code" href="class_sec_block.html#af9e98d3f4a7af1156fcf3e6e68f4ae5a" title="change size and preserve contents">resize</a>(24);
<a name="l00744"></a>00744                         }
<a name="l00745"></a>00745                 }
<a name="l00746"></a>00746 
<a name="l00747"></a>00747                 <span class="keywordflow">if</span> (m_algorithm == <span class="stringliteral">&quot;RNG&quot;</span>)
<a name="l00748"></a>00748                 {
<a name="l00749"></a>00749                         key.<a class="code" href="class_sec_block.html#af9e98d3f4a7af1156fcf3e6e68f4ae5a" title="change size and preserve contents">resize</a>(24);
<a name="l00750"></a>00750                         <a class="code" href="class_string_source.html" title="string-based implementation of Source interface">StringSource</a>(m_data[<span class="stringliteral">&quot;Key1&quot;</span>] + m_data[<span class="stringliteral">&quot;Key2&quot;</span>] + m_data[<span class="stringliteral">&quot;Key3&quot;</span>], <span class="keyword">true</span>, <span class="keyword">new</span> <a class="code" href="class_hex_decoder.html" title="Decode base 16 data back to bytes.">HexDecoder</a>(<span class="keyword">new</span> <a class="code" href="class_array_sink.html" title="Copy input to a memory buffer.">ArraySink</a>(key, key.size())));
<a name="l00751"></a>00751 
<a name="l00752"></a>00752                         <a class="code" href="class_sec_block.html" title="a block of memory allocated using A">SecByteBlock</a> seed(m_data2[INPUT]), dt(m_data2[IV]), r(8);
<a name="l00753"></a>00753                         <a class="code" href="class_x917_r_n_g.html" title="RNG derived from ANSI X9.17 Appendix C.">X917RNG</a> rng(<span class="keyword">new</span> <a class="code" href="class_block_cipher_final.html" title="_">DES_EDE3::Encryption</a>(key, key.size()), seed, dt);
<a name="l00754"></a>00754 
<a name="l00755"></a>00755                         <span class="keywordflow">if</span> (m_test == <span class="stringliteral">&quot;MCT&quot;</span>)
<a name="l00756"></a>00756                         {
<a name="l00757"></a>00757                                 <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i=0; i&lt;10000; i++)
<a name="l00758"></a>00758                                         rng.<a class="code" href="class_random_number_generator.html#a497145546d24e6d4abaf10b7e0f1ba17" title="generate random array of bytes">GenerateBlock</a>(r, r.size());
<a name="l00759"></a>00759                         }
<a name="l00760"></a>00760                         <span class="keywordflow">else</span>
<a name="l00761"></a>00761                         {
<a name="l00762"></a>00762                                 rng.<a class="code" href="class_random_number_generator.html#a497145546d24e6d4abaf10b7e0f1ba17" title="generate random array of bytes">GenerateBlock</a>(r, r.size());
<a name="l00763"></a>00763                         }
<a name="l00764"></a>00764 
<a name="l00765"></a>00765                         OutputData(output, <span class="stringliteral">&quot;R &quot;</span>, r);
<a name="l00766"></a>00766                         AttachedTransformation()-&gt;Put((byte *)output.data(), output.size());
<a name="l00767"></a>00767                         output.resize(0);
<a name="l00768"></a>00768                         <span class="keywordflow">return</span>;
<a name="l00769"></a>00769                 }
<a name="l00770"></a>00770 
<a name="l00771"></a>00771                 <span class="keywordflow">if</span> (m_algorithm == <span class="stringliteral">&quot;HMAC&quot;</span>)
<a name="l00772"></a>00772                 {
<a name="l00773"></a>00773                         <a class="code" href="classmember__ptr.html">member_ptr&lt;MessageAuthenticationCode&gt;</a> pMAC;
<a name="l00774"></a>00774 
<a name="l00775"></a>00775                         <span class="keywordflow">if</span> (m_bracketString == <span class="stringliteral">&quot;L=20&quot;</span>)
<a name="l00776"></a>00776                                 pMAC.reset(<span class="keyword">new</span> <a class="code" href="class_h_m_a_c.html" title="HMAC">HMAC&lt;SHA1&gt;</a>);
<a name="l00777"></a>00777                         <span class="keywordflow">else</span> <span class="keywordflow">if</span> (m_bracketString == <span class="stringliteral">&quot;L=28&quot;</span>)
<a name="l00778"></a>00778                                 pMAC.reset(<span class="keyword">new</span> <a class="code" href="class_h_m_a_c.html" title="HMAC">HMAC&lt;SHA224&gt;</a>);
<a name="l00779"></a>00779                         <span class="keywordflow">else</span> <span class="keywordflow">if</span> (m_bracketString == <span class="stringliteral">&quot;L=32&quot;</span>)
<a name="l00780"></a>00780                                 pMAC.reset(<span class="keyword">new</span> <a class="code" href="class_h_m_a_c.html" title="HMAC">HMAC&lt;SHA256&gt;</a>);
<a name="l00781"></a>00781                         <span class="keywordflow">else</span> <span class="keywordflow">if</span> (m_bracketString == <span class="stringliteral">&quot;L=48&quot;</span>)
<a name="l00782"></a>00782                                 pMAC.reset(<span class="keyword">new</span> <a class="code" href="class_h_m_a_c.html" title="HMAC">HMAC&lt;SHA384&gt;</a>);
<a name="l00783"></a>00783                         <span class="keywordflow">else</span> <span class="keywordflow">if</span> (m_bracketString == <span class="stringliteral">&quot;L=64&quot;</span>)
<a name="l00784"></a>00784                                 pMAC.reset(<span class="keyword">new</span> <a class="code" href="class_h_m_a_c.html" title="HMAC">HMAC&lt;SHA512&gt;</a>);
<a name="l00785"></a>00785                         <span class="keywordflow">else</span>
<a name="l00786"></a>00786                                 <span class="keywordflow">throw</span> <a class="code" href="class_exception.html" title="base class for all exceptions thrown by Crypto++">Exception</a>(<a class="code" href="class_exception.html#a8e53909d979479380e0274807c074c0aa27d9ee7704100a88e4ae4adcc4072015" title="some error not belong to any of the above categories">Exception::OTHER_ERROR</a>, <span class="stringliteral">&quot;TestDataParser: unexpected HMAC bracket string: &quot;</span> + m_bracketString);
<a name="l00787"></a>00787 
<a name="l00788"></a>00788                         pMAC-&gt;SetKey(key, key.size());
<a name="l00789"></a>00789                         <span class="keywordtype">int</span> Tlen = atol(m_data[<span class="stringliteral">&quot;Tlen&quot;</span>].c_str());
<a name="l00790"></a>00790                         <a class="code" href="class_sec_block.html" title="a block of memory allocated using A">SecByteBlock</a> tag(Tlen);
<a name="l00791"></a>00791                         <a class="code" href="class_string_source.html" title="string-based implementation of Source interface">StringSource</a>(m_data[<span class="stringliteral">&quot;Msg&quot;</span>], <span class="keyword">true</span>, <span class="keyword">new</span> <a class="code" href="class_hex_decoder.html" title="Decode base 16 data back to bytes.">HexDecoder</a>(<span class="keyword">new</span> <a class="code" href="class_hash_filter.html" title="Filter Wrapper for HashTransformation.">HashFilter</a>(*pMAC, <span class="keyword">new</span> <a class="code" href="class_array_sink.html" title="Copy input to a memory buffer.">ArraySink</a>(tag, Tlen), <span class="keyword">false</span>, Tlen)));
<a name="l00792"></a>00792                         OutputData(output, <span class="stringliteral">&quot;Mac &quot;</span>, tag);
<a name="l00793"></a>00793                         AttachedTransformation()-&gt;Put((byte *)output.data(), output.size());
<a name="l00794"></a>00794                         output.resize(0);
<a name="l00795"></a>00795                         <span class="keywordflow">return</span>;
<a name="l00796"></a>00796                 }
<a name="l00797"></a>00797 
<a name="l00798"></a>00798                 <a class="code" href="classmember__ptr.html">member_ptr&lt;BlockCipher&gt;</a> pBT;
<a name="l00799"></a>00799                 <span class="keywordflow">if</span> (m_algorithm == <span class="stringliteral">&quot;DES&quot;</span>)
<a name="l00800"></a>00800                         pBT.reset(NewBT((<a class="code" href="class_d_e_s.html" title="DES">DES</a>*)0));
<a name="l00801"></a>00801                 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (m_algorithm == <span class="stringliteral">&quot;TDES&quot;</span>)
<a name="l00802"></a>00802                 {
<a name="l00803"></a>00803                         <span class="keywordflow">if</span> (key.size() == 8)
<a name="l00804"></a>00804                                 pBT.reset(NewBT((<a class="code" href="class_d_e_s.html" title="DES">DES</a>*)0));
<a name="l00805"></a>00805                         <span class="keywordflow">else</span> <span class="keywordflow">if</span> (key.size() == 16)
<a name="l00806"></a>00806                                 pBT.reset(NewBT((<a class="code" href="class_d_e_s___e_d_e2.html" title="DES-EDE2">DES_EDE2</a>*)0));
<a name="l00807"></a>00807                         <span class="keywordflow">else</span>
<a name="l00808"></a>00808                                 pBT.reset(NewBT((<a class="code" href="class_d_e_s___e_d_e3.html" title="DES-EDE3">DES_EDE3</a>*)0));
<a name="l00809"></a>00809                 }
<a name="l00810"></a>00810                 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (m_algorithm == <span class="stringliteral">&quot;SKIPJACK&quot;</span>)
<a name="l00811"></a>00811                         pBT.reset(NewBT((<a class="code" href="class_s_k_i_p_j_a_c_k.html" title="SKIPJACK">SKIPJACK</a>*)0));
<a name="l00812"></a>00812                 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (m_algorithm == <span class="stringliteral">&quot;AES&quot;</span>)
<a name="l00813"></a>00813                         pBT.reset(NewBT((AES*)0));
<a name="l00814"></a>00814                 <span class="keywordflow">else</span>
<a name="l00815"></a>00815                         <span class="keywordflow">throw</span> <a class="code" href="class_exception.html" title="base class for all exceptions thrown by Crypto++">Exception</a>(<a class="code" href="class_exception.html#a8e53909d979479380e0274807c074c0aa27d9ee7704100a88e4ae4adcc4072015" title="some error not belong to any of the above categories">Exception::OTHER_ERROR</a>, <span class="stringliteral">&quot;TestDataParser: unexpected algorithm: &quot;</span> + m_algorithm);
<a name="l00816"></a>00816 
<a name="l00817"></a>00817                 <span class="keywordflow">if</span> (!pBT-&gt;IsValidKeyLength(key.size()))
<a name="l00818"></a>00818                         key.<a class="code" href="class_sec_block.html#a2d78e75002fd02e5b89bd72a9e65e769" title="change size and set contents to 0">CleanNew</a>(pBT-&gt;DefaultKeyLength());  <span class="comment">// for Scbcvrct</span>
<a name="l00819"></a>00819                 pBT-&gt;SetKey(key.data(), key.size());
<a name="l00820"></a>00820 
<a name="l00821"></a>00821                 <a class="code" href="class_sec_block.html" title="a block of memory allocated using A">SecByteBlock</a> &amp;iv = m_data2[IV];
<a name="l00822"></a>00822                 <span class="keywordflow">if</span> (iv.empty())
<a name="l00823"></a>00823                         iv.<a class="code" href="class_sec_block.html#a2d78e75002fd02e5b89bd72a9e65e769" title="change size and set contents to 0">CleanNew</a>(pBT-&gt;BlockSize());
<a name="l00824"></a>00824 
<a name="l00825"></a>00825                 <a class="code" href="classmember__ptr.html">member_ptr&lt;SymmetricCipher&gt;</a> pCipher;
<a name="l00826"></a>00826                 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> K = m_feedbackSize;
<a name="l00827"></a>00827 
<a name="l00828"></a>00828                 <span class="keywordflow">if</span> (m_mode == <span class="stringliteral">&quot;ECB&quot;</span>)
<a name="l00829"></a>00829                         pCipher.reset(NewMode((<a class="code" href="struct_e_c_b___mode___external_cipher.html" title="ECB mode, external cipher.">ECB_Mode_ExternalCipher</a>*)0, *pBT, iv));
<a name="l00830"></a>00830                 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (m_mode == <span class="stringliteral">&quot;CBC&quot;</span>)
<a name="l00831"></a>00831                         pCipher.reset(NewMode((<a class="code" href="struct_c_b_c___mode___external_cipher.html" title="CBC mode, external cipher.">CBC_Mode_ExternalCipher</a>*)0, *pBT, iv));
<a name="l00832"></a>00832                 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (m_mode == <span class="stringliteral">&quot;CFB&quot;</span>)
<a name="l00833"></a>00833                         pCipher.reset(NewMode((<a class="code" href="struct_c_f_b___mode___external_cipher.html" title="CFB mode, external cipher.">CFB_Mode_ExternalCipher</a>*)0, *pBT, iv));
<a name="l00834"></a>00834                 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (m_mode == <span class="stringliteral">&quot;OFB&quot;</span>)
<a name="l00835"></a>00835                         pCipher.reset(NewMode((<a class="code" href="struct_o_f_b___mode___external_cipher.html" title="OFB mode, external cipher.">OFB_Mode_ExternalCipher</a>*)0, *pBT, iv));
<a name="l00836"></a>00836                 <span class="keywordflow">else</span>
<a name="l00837"></a>00837                         <span class="keywordflow">throw</span> <a class="code" href="class_exception.html" title="base class for all exceptions thrown by Crypto++">Exception</a>(<a class="code" href="class_exception.html#a8e53909d979479380e0274807c074c0aa27d9ee7704100a88e4ae4adcc4072015" title="some error not belong to any of the above categories">Exception::OTHER_ERROR</a>, <span class="stringliteral">&quot;TestDataParser: unexpected mode: &quot;</span> + m_mode);
<a name="l00838"></a>00838 
<a name="l00839"></a>00839                 <span class="keywordtype">bool</span> encrypt = m_encrypt;
<a name="l00840"></a>00840 
<a name="l00841"></a>00841                 <span class="keywordflow">if</span> (m_test == <span class="stringliteral">&quot;MONTE&quot;</span>)
<a name="l00842"></a>00842                 {
<a name="l00843"></a>00843                         <a class="code" href="class_sec_block.html" title="a block of memory allocated using A">SecByteBlock</a> KEY[401];
<a name="l00844"></a>00844                         KEY[0] = key;
<a name="l00845"></a>00845                         <span class="keywordtype">int</span> keySize = key.size();
<a name="l00846"></a>00846                         <span class="keywordtype">int</span> blockSize = pBT-&gt;BlockSize();
<a name="l00847"></a>00847 
<a name="l00848"></a>00848                         std::vector&lt;SecByteBlock&gt; IB(10001), OB(10001), PT(10001), CT(10001), RESULT(10001), TXT(10001), CV(10001);
<a name="l00849"></a>00849                         PT[0] = GetData(<span class="stringliteral">&quot;PLAINTEXT&quot;</span>);
<a name="l00850"></a>00850                         CT[0] = GetData(<span class="stringliteral">&quot;CIPHERTEXT&quot;</span>);
<a name="l00851"></a>00851                         CV[0] = IB[0] = iv;
<a name="l00852"></a>00852                         TXT[0] = GetData(<span class="stringliteral">&quot;TEXT&quot;</span>);
<a name="l00853"></a>00853 
<a name="l00854"></a>00854                         <span class="keywordtype">int</span> outerCount = (m_algorithm == <span class="stringliteral">&quot;AES&quot;</span>) ? 100 : 400;
<a name="l00855"></a>00855                         <span class="keywordtype">int</span> innerCount = (m_algorithm == <span class="stringliteral">&quot;AES&quot;</span>) ? 1000 : 10000;
<a name="l00856"></a>00856 
<a name="l00857"></a>00857                         <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i=0; i&lt;outerCount; i++)
<a name="l00858"></a>00858                         {
<a name="l00859"></a>00859                                 pBT-&gt;SetKey(KEY[i], keySize);
<a name="l00860"></a>00860 
<a name="l00861"></a>00861                                 <span class="keywordflow">for</span> (<span class="keywordtype">int</span> j=0; j&lt;innerCount; j++)
<a name="l00862"></a>00862                                 {
<a name="l00863"></a>00863                                         <span class="keywordflow">if</span> (m_mode == <span class="stringliteral">&quot;ECB&quot;</span>)
<a name="l00864"></a>00864                                         {
<a name="l00865"></a>00865                                                 <span class="keywordflow">if</span> (encrypt)
<a name="l00866"></a>00866                                                 {
<a name="l00867"></a>00867                                                         IB[j] = PT[j];
<a name="l00868"></a>00868                                                         CT[j].resize(blockSize);
<a name="l00869"></a>00869                                                         pBT-&gt;ProcessBlock(IB[j], CT[j]);
<a name="l00870"></a>00870                                                         PT[j+1] = CT[j];
<a name="l00871"></a>00871                                                 }
<a name="l00872"></a>00872                                                 <span class="keywordflow">else</span>
<a name="l00873"></a>00873                                                 {
<a name="l00874"></a>00874                                                         IB[j] = CT[j];
<a name="l00875"></a>00875                                                         PT[j].resize(blockSize);
<a name="l00876"></a>00876                                                         pBT-&gt;ProcessBlock(IB[j], PT[j]);
<a name="l00877"></a>00877                                                         CT[j+1] = PT[j];
<a name="l00878"></a>00878                                                 }
<a name="l00879"></a>00879                                         }
<a name="l00880"></a>00880                                         <span class="keywordflow">else</span> <span class="keywordflow">if</span> (m_mode == <span class="stringliteral">&quot;OFB&quot;</span>)
<a name="l00881"></a>00881                                         {
<a name="l00882"></a>00882                                                 OB[j].resize(blockSize);
<a name="l00883"></a>00883                                                 pBT-&gt;ProcessBlock(IB[j], OB[j]);
<a name="l00884"></a>00884                                                 Xor(RESULT[j], OB[j], TXT[j]);
<a name="l00885"></a>00885                                                 TXT[j+1] = IB[j];
<a name="l00886"></a>00886                                                 IB[j+1] = OB[j];
<a name="l00887"></a>00887                                         }
<a name="l00888"></a>00888                                         <span class="keywordflow">else</span> <span class="keywordflow">if</span> (m_mode == <span class="stringliteral">&quot;CBC&quot;</span>)
<a name="l00889"></a>00889                                         {
<a name="l00890"></a>00890                                                 <span class="keywordflow">if</span> (encrypt)
<a name="l00891"></a>00891                                                 {
<a name="l00892"></a>00892                                                         Xor(IB[j], PT[j], CV[j]);
<a name="l00893"></a>00893                                                         CT[j].resize(blockSize);
<a name="l00894"></a>00894                                                         pBT-&gt;ProcessBlock(IB[j], CT[j]);
<a name="l00895"></a>00895                                                         PT[j+1] = CV[j];
<a name="l00896"></a>00896                                                         CV[j+1] = CT[j];
<a name="l00897"></a>00897                                                 }
<a name="l00898"></a>00898                                                 <span class="keywordflow">else</span>
<a name="l00899"></a>00899                                                 {
<a name="l00900"></a>00900                                                         IB[j] = CT[j];
<a name="l00901"></a>00901                                                         OB[j].resize(blockSize);
<a name="l00902"></a>00902                                                         pBT-&gt;ProcessBlock(IB[j], OB[j]);
<a name="l00903"></a>00903                                                         Xor(PT[j], OB[j], CV[j]);
<a name="l00904"></a>00904                                                         CV[j+1] = CT[j];
<a name="l00905"></a>00905                                                         CT[j+1] = PT[j];
<a name="l00906"></a>00906                                                 }
<a name="l00907"></a>00907                                         }
<a name="l00908"></a>00908                                         <span class="keywordflow">else</span> <span class="keywordflow">if</span> (m_mode == <span class="stringliteral">&quot;CFB&quot;</span>)
<a name="l00909"></a>00909                                         {
<a name="l00910"></a>00910                                                 <span class="keywordflow">if</span> (encrypt)
<a name="l00911"></a>00911                                                 {
<a name="l00912"></a>00912                                                         OB[j].resize(blockSize);
<a name="l00913"></a>00913                                                         pBT-&gt;ProcessBlock(IB[j], OB[j]);
<a name="l00914"></a>00914                                                         AssignLeftMostBits(CT[j], OB[j], K);
<a name="l00915"></a>00915                                                         Xor(CT[j], CT[j], PT[j]);
<a name="l00916"></a>00916                                                         AssignLeftMostBits(PT[j+1], IB[j], K);
<a name="l00917"></a>00917                                                         IB[j+1].resize(blockSize);
<a name="l00918"></a>00918                                                         memcpy(IB[j+1], IB[j]+K/8, blockSize-K/8);
<a name="l00919"></a>00919                                                         memcpy(IB[j+1]+blockSize-K/8, CT[j], K/8);
<a name="l00920"></a>00920                                                 }
<a name="l00921"></a>00921                                                 <span class="keywordflow">else</span>
<a name="l00922"></a>00922                                                 {
<a name="l00923"></a>00923                                                         OB[j].resize(blockSize);
<a name="l00924"></a>00924                                                         pBT-&gt;ProcessBlock(IB[j], OB[j]);
<a name="l00925"></a>00925                                                         AssignLeftMostBits(PT[j], OB[j], K);
<a name="l00926"></a>00926                                                         Xor(PT[j], PT[j], CT[j]);
<a name="l00927"></a>00927                                                         IB[j+1].resize(blockSize);
<a name="l00928"></a>00928                                                         memcpy(IB[j+1], IB[j]+K/8, blockSize-K/8);
<a name="l00929"></a>00929                                                         memcpy(IB[j+1]+blockSize-K/8, CT[j], K/8);
<a name="l00930"></a>00930                                                         AssignLeftMostBits(CT[j+1], OB[j], K);
<a name="l00931"></a>00931                                                 }
<a name="l00932"></a>00932                                         }
<a name="l00933"></a>00933                                         <span class="keywordflow">else</span>
<a name="l00934"></a>00934                                                 <span class="keywordflow">throw</span> <a class="code" href="class_exception.html" title="base class for all exceptions thrown by Crypto++">Exception</a>(<a class="code" href="class_exception.html#a8e53909d979479380e0274807c074c0aa27d9ee7704100a88e4ae4adcc4072015" title="some error not belong to any of the above categories">Exception::OTHER_ERROR</a>, <span class="stringliteral">&quot;TestDataParser: unexpected mode: &quot;</span> + m_mode);
<a name="l00935"></a>00935                                 }
<a name="l00936"></a>00936 
<a name="l00937"></a>00937                                 OutputData(output, COUNT, IntToString(i));
<a name="l00938"></a>00938                                 OutputData(output, KEY_T, KEY[i]);
<a name="l00939"></a>00939                                 <span class="keywordflow">if</span> (m_mode == <span class="stringliteral">&quot;CBC&quot;</span>)
<a name="l00940"></a>00940                                         OutputData(output, IV, CV[0]);
<a name="l00941"></a>00941                                 <span class="keywordflow">if</span> (m_mode == <span class="stringliteral">&quot;OFB&quot;</span> || m_mode == <span class="stringliteral">&quot;CFB&quot;</span>)
<a name="l00942"></a>00942                                         OutputData(output, IV, IB[0]);
<a name="l00943"></a>00943                                 <span class="keywordflow">if</span> (m_mode == <span class="stringliteral">&quot;ECB&quot;</span> || m_mode == <span class="stringliteral">&quot;CBC&quot;</span> || m_mode == <span class="stringliteral">&quot;CFB&quot;</span>)
<a name="l00944"></a>00944                                 {
<a name="l00945"></a>00945                                         <span class="keywordflow">if</span> (encrypt)
<a name="l00946"></a>00946                                         {
<a name="l00947"></a>00947                                                 OutputData(output, INPUT, PT[0]);
<a name="l00948"></a>00948                                                 OutputData(output, OUTPUT, CT[innerCount-1]);
<a name="l00949"></a>00949                                                 KEY[i+1] = UpdateKey(KEY[i], &amp;CT[0]);
<a name="l00950"></a>00950                                         }
<a name="l00951"></a>00951                                         <span class="keywordflow">else</span>
<a name="l00952"></a>00952                                         {
<a name="l00953"></a>00953                                                 OutputData(output, INPUT, CT[0]);
<a name="l00954"></a>00954                                                 OutputData(output, OUTPUT, PT[innerCount-1]);
<a name="l00955"></a>00955                                                 KEY[i+1] = UpdateKey(KEY[i], &amp;PT[0]);
<a name="l00956"></a>00956                                         }
<a name="l00957"></a>00957                                         PT[0] = PT[innerCount];
<a name="l00958"></a>00958                                         IB[0] = IB[innerCount];
<a name="l00959"></a>00959                                         CV[0] = CV[innerCount];
<a name="l00960"></a>00960                                         CT[0] = CT[innerCount];
<a name="l00961"></a>00961                                 }
<a name="l00962"></a>00962                                 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (m_mode == <span class="stringliteral">&quot;OFB&quot;</span>)
<a name="l00963"></a>00963                                 {
<a name="l00964"></a>00964                                         OutputData(output, INPUT, TXT[0]);
<a name="l00965"></a>00965                                         OutputData(output, OUTPUT, RESULT[innerCount-1]);
<a name="l00966"></a>00966                                         KEY[i+1] = UpdateKey(KEY[i], &amp;RESULT[0]);
<a name="l00967"></a>00967                                         Xor(TXT[0], TXT[0], IB[innerCount-1]);
<a name="l00968"></a>00968                                         IB[0] = OB[innerCount-1];
<a name="l00969"></a>00969                                 }
<a name="l00970"></a>00970                                 output += <span class="stringliteral">&quot;\n&quot;</span>;
<a name="l00971"></a>00971                                 AttachedTransformation()-&gt;Put((byte *)output.data(), output.size());
<a name="l00972"></a>00972                                 output.resize(0);
<a name="l00973"></a>00973                         }
<a name="l00974"></a>00974                 }
<a name="l00975"></a>00975                 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (m_test == <span class="stringliteral">&quot;MCT&quot;</span>)
<a name="l00976"></a>00976                 {
<a name="l00977"></a>00977                         <a class="code" href="class_sec_block.html" title="a block of memory allocated using A">SecByteBlock</a> KEY[101];
<a name="l00978"></a>00978                         KEY[0] = key;
<a name="l00979"></a>00979                         <span class="keywordtype">int</span> keySize = key.size();
<a name="l00980"></a>00980                         <span class="keywordtype">int</span> blockSize = pBT-&gt;BlockSize();
<a name="l00981"></a>00981 
<a name="l00982"></a>00982                         <a class="code" href="class_sec_block.html" title="a block of memory allocated using A">SecByteBlock</a> ivs[101], inputs[1001], outputs[1001];
<a name="l00983"></a>00983                         ivs[0] = iv;
<a name="l00984"></a>00984                         inputs[0] = m_data2[INPUT];
<a name="l00985"></a>00985 
<a name="l00986"></a>00986                         <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i=0; i&lt;100; i++)
<a name="l00987"></a>00987                         {
<a name="l00988"></a>00988                                 pCipher-&gt;SetKey(KEY[i], keySize, MakeParameters(Name::IV(), (<span class="keyword">const</span> byte *)ivs[i])(Name::FeedbackSize(), (<span class="keywordtype">int</span>)K/8, <span class="keyword">false</span>));
<a name="l00989"></a>00989 
<a name="l00990"></a>00990                                 <span class="keywordflow">for</span> (<span class="keywordtype">int</span> j=0; j&lt;1000; j++)
<a name="l00991"></a>00991                                 {
<a name="l00992"></a>00992                                         outputs[j] = inputs[j];
<a name="l00993"></a>00993                                         pCipher-&gt;ProcessString(outputs[j], outputs[j].size());
<a name="l00994"></a>00994                                         <span class="keywordflow">if</span> (K==8 &amp;&amp; m_mode == <span class="stringliteral">&quot;CFB&quot;</span>)
<a name="l00995"></a>00995                                         {
<a name="l00996"></a>00996                                                 <span class="keywordflow">if</span> (j&lt;16)
<a name="l00997"></a>00997                                                         inputs[j+1].<a class="code" href="class_sec_block.html#a2cf5dc5e31c63eb927f935af6104f36a" title="set contents and size">Assign</a>(ivs[i]+j, 1);
<a name="l00998"></a>00998                                                 <span class="keywordflow">else</span>
<a name="l00999"></a>00999                                                         inputs[j+1] = outputs[j-16];
<a name="l01000"></a>01000                                         }
<a name="l01001"></a>01001                                         <span class="keywordflow">else</span> <span class="keywordflow">if</span> (m_mode == <span class="stringliteral">&quot;ECB&quot;</span>)
<a name="l01002"></a>01002                                                 inputs[j+1] = outputs[j];
<a name="l01003"></a>01003                                         <span class="keywordflow">else</span> <span class="keywordflow">if</span> (j == 0)
<a name="l01004"></a>01004                                                 inputs[j+1] = ivs[i];
<a name="l01005"></a>01005                                         <span class="keywordflow">else</span>
<a name="l01006"></a>01006                                                 inputs[j+1] = outputs[j-1];
<a name="l01007"></a>01007                                 }
<a name="l01008"></a>01008 
<a name="l01009"></a>01009                                 <span class="keywordflow">if</span> (m_algorithm == <span class="stringliteral">&quot;AES&quot;</span>)
<a name="l01010"></a>01010                                         OutputData(output, COUNT, m_count++);
<a name="l01011"></a>01011                                 OutputData(output, KEY_T, KEY[i]);
<a name="l01012"></a>01012                                 <span class="keywordflow">if</span> (m_mode != <span class="stringliteral">&quot;ECB&quot;</span>)
<a name="l01013"></a>01013                                         OutputData(output, IV, ivs[i]);
<a name="l01014"></a>01014                                 OutputData(output, INPUT, inputs[0]);
<a name="l01015"></a>01015                                 OutputData(output, OUTPUT, outputs[999]);
<a name="l01016"></a>01016                                 output += <span class="stringliteral">&quot;\n&quot;</span>;
<a name="l01017"></a>01017                                 AttachedTransformation()-&gt;Put((byte *)output.data(), output.size());
<a name="l01018"></a>01018                                 output.resize(0);
<a name="l01019"></a>01019 
<a name="l01020"></a>01020                                 KEY[i+1] = UpdateKey(KEY[i], outputs);
<a name="l01021"></a>01021                                 ivs[i+1].<a class="code" href="class_sec_block.html#a2d78e75002fd02e5b89bd72a9e65e769" title="change size and set contents to 0">CleanNew</a>(pCipher-&gt;IVSize());
<a name="l01022"></a>01022                                 ivs[i+1] = UpdateKey(ivs[i+1], outputs);
<a name="l01023"></a>01023                                 <span class="keywordflow">if</span> (K==8 &amp;&amp; m_mode == <span class="stringliteral">&quot;CFB&quot;</span>)
<a name="l01024"></a>01024                                         inputs[0] = outputs[999-16];
<a name="l01025"></a>01025                                 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (m_mode == <span class="stringliteral">&quot;ECB&quot;</span>)
<a name="l01026"></a>01026                                         inputs[0] = outputs[999];
<a name="l01027"></a>01027                                 <span class="keywordflow">else</span>
<a name="l01028"></a>01028                                         inputs[0] = outputs[998];
<a name="l01029"></a>01029                         }
<a name="l01030"></a>01030                 }
<a name="l01031"></a>01031                 <span class="keywordflow">else</span>
<a name="l01032"></a>01032                 {
<a name="l01033"></a>01033                         assert(m_test == <span class="stringliteral">&quot;KAT&quot;</span>);
<a name="l01034"></a>01034 
<a name="l01035"></a>01035                         <a class="code" href="class_sec_block.html" title="a block of memory allocated using A">SecByteBlock</a> &amp;input = m_data2[INPUT];
<a name="l01036"></a>01036                         <a class="code" href="class_sec_block.html" title="a block of memory allocated using A">SecByteBlock</a> result(input.size());
<a name="l01037"></a>01037                         <a class="code" href="classmember__ptr.html">member_ptr&lt;Filter&gt;</a> pFilter(<span class="keyword">new</span> <a class="code" href="class_stream_transformation_filter.html" title="Filter Wrapper for StreamTransformation, optionally handling padding/unpadding when...">StreamTransformationFilter</a>(*pCipher, <span class="keyword">new</span> <a class="code" href="class_array_sink.html" title="Copy input to a memory buffer.">ArraySink</a>(result, result.size()), StreamTransformationFilter::NO_PADDING));
<a name="l01038"></a>01038                         <a class="code" href="class_string_source.html" title="string-based implementation of Source interface">StringSource</a>(input.data(), input.size(), <span class="keyword">true</span>, pFilter.release());
<a name="l01039"></a>01039 
<a name="l01040"></a>01040                         OutputGivenData(output, COUNT, <span class="keyword">true</span>);
<a name="l01041"></a>01041                         OutputData(output, KEY_T, key);
<a name="l01042"></a>01042                         OutputGivenData(output, IV, <span class="keyword">true</span>);
<a name="l01043"></a>01043                         OutputGivenData(output, INPUT);
<a name="l01044"></a>01044                         OutputData(output, OUTPUT, result);
<a name="l01045"></a>01045                         output += <span class="stringliteral">&quot;\n&quot;</span>;
<a name="l01046"></a>01046                         AttachedTransformation()-&gt;Put((byte *)output.data(), output.size());
<a name="l01047"></a>01047                 }
<a name="l01048"></a>01048         }
<a name="l01049"></a>01049 
<a name="l01050"></a>01050         std::vector&lt;std::string&gt; Tokenize(<span class="keyword">const</span> std::string &amp;line)
<a name="l01051"></a>01051         {
<a name="l01052"></a>01052                 std::vector&lt;std::string&gt; result;
<a name="l01053"></a>01053                 std::string s;
<a name="l01054"></a>01054                 <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i=0; i&lt;line.size(); i++)
<a name="l01055"></a>01055                 {
<a name="l01056"></a>01056                         <span class="keywordflow">if</span> (isalnum(line[i]) || line[i] == <span class="charliteral">&apos;^&apos;</span>)
<a name="l01057"></a>01057                                 s += line[i];
<a name="l01058"></a>01058                         <span class="keywordflow">else</span> <span class="keywordflow">if</span> (!s.empty())
<a name="l01059"></a>01059                         {
<a name="l01060"></a>01060                                 result.push_back(s);
<a name="l01061"></a>01061                                 s = <span class="stringliteral">&quot;&quot;</span>;
<a name="l01062"></a>01062                         }
<a name="l01063"></a>01063                         <span class="keywordflow">if</span> (line[i] == <span class="charliteral">&apos;=&apos;</span>)
<a name="l01064"></a>01064                                 result.push_back(<span class="stringliteral">&quot;=&quot;</span>);
<a name="l01065"></a>01065                 }
<a name="l01066"></a>01066                 <span class="keywordflow">if</span> (!s.empty())
<a name="l01067"></a>01067                         result.push_back(s);
<a name="l01068"></a>01068                 <span class="keywordflow">return</span> result;
<a name="l01069"></a>01069         }
<a name="l01070"></a>01070 
<a name="l01071"></a>01071         <span class="keywordtype">bool</span> IsolatedMessageEnd(<span class="keywordtype">bool</span> blocking)
<a name="l01072"></a>01072         {
<a name="l01073"></a>01073                 <span class="keywordflow">if</span> (!blocking)
<a name="l01074"></a>01074                         <span class="keywordflow">throw</span> BlockingInputOnly(<span class="stringliteral">&quot;TestDataParser&quot;</span>);
<a name="l01075"></a>01075 
<a name="l01076"></a>01076                 m_line.resize(0);
<a name="l01077"></a>01077                 m_inQueue.TransferTo(<a class="code" href="class_string_sink_template.html" title="Append input to a string object.">StringSink</a>(m_line).Ref());
<a name="l01078"></a>01078 
<a name="l01079"></a>01079                 <span class="keywordflow">if</span> (m_line[0] == <span class="charliteral">&apos;#&apos;</span>)
<a name="l01080"></a>01080                         <span class="keywordflow">return</span> <span class="keyword">false</span>;
<a name="l01081"></a>01081 
<a name="l01082"></a>01082                 <span class="keywordtype">bool</span> copyLine = <span class="keyword">false</span>;
<a name="l01083"></a>01083 
<a name="l01084"></a>01084                 <span class="keywordflow">if</span> (m_line[0] == <span class="charliteral">&apos;[&apos;</span>)
<a name="l01085"></a>01085                 {
<a name="l01086"></a>01086                         m_bracketString = m_line.substr(1, m_line.size()-2);
<a name="l01087"></a>01087                         <span class="keywordflow">if</span> (m_bracketString == <span class="stringliteral">&quot;ENCRYPT&quot;</span>)
<a name="l01088"></a>01088                                 SetEncrypt(<span class="keyword">true</span>);
<a name="l01089"></a>01089                         <span class="keywordflow">if</span> (m_bracketString == <span class="stringliteral">&quot;DECRYPT&quot;</span>)
<a name="l01090"></a>01090                                 SetEncrypt(<span class="keyword">false</span>);
<a name="l01091"></a>01091                         copyLine = <span class="keyword">true</span>;
<a name="l01092"></a>01092                 }
<a name="l01093"></a>01093 
<a name="l01094"></a>01094                 <span class="keywordflow">if</span> (m_line.substr(0, 2) == <span class="stringliteral">&quot;H&gt;&quot;</span>)
<a name="l01095"></a>01095                 {
<a name="l01096"></a>01096                         assert(m_test == <span class="stringliteral">&quot;sha&quot;</span>);
<a name="l01097"></a>01097                         m_bracketString = m_line.substr(2, m_line.size()-4);
<a name="l01098"></a>01098                         m_line = m_line.substr(0, 13) + <span class="stringliteral">&quot;Hashes&lt;H&quot;</span>;
<a name="l01099"></a>01099                         copyLine = <span class="keyword">true</span>;
<a name="l01100"></a>01100                 }
<a name="l01101"></a>01101 
<a name="l01102"></a>01102                 <span class="keywordflow">if</span> (m_line == <span class="stringliteral">&quot;D&gt;&quot;</span>)
<a name="l01103"></a>01103                         copyLine = <span class="keyword">true</span>;
<a name="l01104"></a>01104 
<a name="l01105"></a>01105                 <span class="keywordflow">if</span> (m_line == <span class="stringliteral">&quot;&lt;D&quot;</span>)
<a name="l01106"></a>01106                 {
<a name="l01107"></a>01107                         m_line += <span class="stringliteral">&quot;\n&quot;</span>;
<a name="l01108"></a>01108                         copyLine = <span class="keyword">true</span>;
<a name="l01109"></a>01109                 }
<a name="l01110"></a>01110 
<a name="l01111"></a>01111                 <span class="keywordflow">if</span> (copyLine)
<a name="l01112"></a>01112                 {
<a name="l01113"></a>01113                         m_line += <span class="charliteral">&apos;\n&apos;</span>;
<a name="l01114"></a>01114                         AttachedTransformation()-&gt;Put((byte *)m_line.data(), m_line.size(), blocking);
<a name="l01115"></a>01115                         <span class="keywordflow">return</span> <span class="keyword">false</span>;
<a name="l01116"></a>01116                 }
<a name="l01117"></a>01117 
<a name="l01118"></a>01118                 std::vector&lt;std::string&gt; tokens = Tokenize(m_line);
<a name="l01119"></a>01119 
<a name="l01120"></a>01120                 <span class="keywordflow">if</span> (m_algorithm == <span class="stringliteral">&quot;DSA&quot;</span> &amp;&amp; m_test == <span class="stringliteral">&quot;sha&quot;</span>)
<a name="l01121"></a>01121                 {
<a name="l01122"></a>01122                         <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i = 0; i &lt; tokens.size(); i++)
<a name="l01123"></a>01123                         {
<a name="l01124"></a>01124                                 <span class="keywordflow">if</span> (tokens[i] == <span class="stringliteral">&quot;^&quot;</span>)
<a name="l01125"></a>01125                                         DoTest();
<a name="l01126"></a>01126                                 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (tokens[i] != <span class="stringliteral">&quot;&quot;</span>)
<a name="l01127"></a>01127                                         m_compactString.push_back(atol(tokens[i].c_str()));
<a name="l01128"></a>01128                         }
<a name="l01129"></a>01129                 }
<a name="l01130"></a>01130                 <span class="keywordflow">else</span>
<a name="l01131"></a>01131                 {
<a name="l01132"></a>01132                         <span class="keywordflow">if</span> (!m_line.empty() &amp;&amp; ((m_algorithm == <span class="stringliteral">&quot;RSA&quot;</span> &amp;&amp; m_test != <span class="stringliteral">&quot;Gen&quot;</span>) || m_algorithm == <span class="stringliteral">&quot;RNG&quot;</span> || m_algorithm == <span class="stringliteral">&quot;HMAC&quot;</span> || m_algorithm == <span class="stringliteral">&quot;SHA&quot;</span> || (m_algorithm == <span class="stringliteral">&quot;ECDSA&quot;</span> &amp;&amp; m_test != <span class="stringliteral">&quot;KeyPair&quot;</span>) || (m_algorithm == <span class="stringliteral">&quot;DSA&quot;</span> &amp;&amp; (m_test == <span class="stringliteral">&quot;PQGVer&quot;</span> || m_test == <span class="stringliteral">&quot;SigVer&quot;</span>))))
<a name="l01133"></a>01133                         {
<a name="l01134"></a>01134                                 <span class="comment">// copy input to output</span>
<a name="l01135"></a>01135                                 std::string output = m_line + <span class="charliteral">&apos;\n&apos;</span>;
<a name="l01136"></a>01136                                 AttachedTransformation()-&gt;Put((byte *)output.data(), output.size());
<a name="l01137"></a>01137                         }
<a name="l01138"></a>01138 
<a name="l01139"></a>01139                         <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i = 0; i &lt; tokens.size(); i++)
<a name="l01140"></a>01140                         {
<a name="l01141"></a>01141                                 <span class="keywordflow">if</span> (m_firstLine &amp;&amp; m_algorithm != <span class="stringliteral">&quot;DSA&quot;</span>)
<a name="l01142"></a>01142                                 {
<a name="l01143"></a>01143                                         <span class="keywordflow">if</span> (tokens[i] == <span class="stringliteral">&quot;Encrypt&quot;</span> || tokens[i] == <span class="stringliteral">&quot;OFB&quot;</span>)
<a name="l01144"></a>01144                                                 SetEncrypt(<span class="keyword">true</span>);
<a name="l01145"></a>01145                                         <span class="keywordflow">else</span> <span class="keywordflow">if</span> (tokens[i] == <span class="stringliteral">&quot;Decrypt&quot;</span>)
<a name="l01146"></a>01146                                                 SetEncrypt(<span class="keyword">false</span>);
<a name="l01147"></a>01147                                         <span class="keywordflow">else</span> <span class="keywordflow">if</span> (tokens[i] == <span class="stringliteral">&quot;Modes&quot;</span>)
<a name="l01148"></a>01148                                                 m_test = <span class="stringliteral">&quot;MONTE&quot;</span>;
<a name="l01149"></a>01149                                 }
<a name="l01150"></a>01150                                 <span class="keywordflow">else</span>
<a name="l01151"></a>01151                                 {
<a name="l01152"></a>01152                                         <span class="keywordflow">if</span> (tokens[i] != <span class="stringliteral">&quot;=&quot;</span>)
<a name="l01153"></a>01153                                                 <span class="keywordflow">continue</span>;
<a name="l01154"></a>01154 
<a name="l01155"></a>01155                                         <span class="keywordflow">if</span> (i == 0)
<a name="l01156"></a>01156                                                 <span class="keywordflow">throw</span> <a class="code" href="class_exception.html" title="base class for all exceptions thrown by Crypto++">Exception</a>(<a class="code" href="class_exception.html#a8e53909d979479380e0274807c074c0aa27d9ee7704100a88e4ae4adcc4072015" title="some error not belong to any of the above categories">Exception::OTHER_ERROR</a>, <span class="stringliteral">&quot;TestDataParser: unexpected data: &quot;</span> + m_line);
<a name="l01157"></a>01157 
<a name="l01158"></a>01158                                         <span class="keyword">const</span> std::string &amp;key = tokens[i-1];
<a name="l01159"></a>01159                                         std::string &amp;data = m_data[key];
<a name="l01160"></a>01160                                         data = (tokens.size() &gt; i+1) ? tokens[i+1] : <span class="stringliteral">&quot;&quot;</span>;
<a name="l01161"></a>01161                                         DataType t = m_nameToType[key];
<a name="l01162"></a>01162                                         m_typeToName[t] = key;
<a name="l01163"></a>01163                                         m_data2[t] = DecodeHex(data);
<a name="l01164"></a>01164 
<a name="l01165"></a>01165                                         <span class="keywordflow">if</span> (key == m_trigger || (t == OUTPUT &amp;&amp; !m_data2[INPUT].empty() &amp;&amp; !isspace(m_line[0])))
<a name="l01166"></a>01166                                                 DoTest();
<a name="l01167"></a>01167                                 }
<a name="l01168"></a>01168                         }
<a name="l01169"></a>01169                 }
<a name="l01170"></a>01170 
<a name="l01171"></a>01171                 m_firstLine = <span class="keyword">false</span>;
<a name="l01172"></a>01172 
<a name="l01173"></a>01173                 <span class="keywordflow">return</span> <span class="keyword">false</span>;
<a name="l01174"></a>01174         }
<a name="l01175"></a>01175 
<a name="l01176"></a>01176         <span class="keyword">inline</span> <span class="keyword">const</span> <a class="code" href="class_sec_block.html" title="a block of memory allocated using A">SecByteBlock</a> &amp; GetData(<span class="keyword">const</span> std::string &amp;key)
<a name="l01177"></a>01177         {
<a name="l01178"></a>01178                 <span class="keywordflow">return</span> m_data2[m_nameToType[key]];
<a name="l01179"></a>01179         }
<a name="l01180"></a>01180 
<a name="l01181"></a>01181         <span class="keyword">static</span> <a class="code" href="class_sec_block.html" title="a block of memory allocated using A">SecByteBlock</a> DecodeHex(<span class="keyword">const</span> std::string &amp;data)
<a name="l01182"></a>01182         {
<a name="l01183"></a>01183                 <a class="code" href="class_sec_block.html" title="a block of memory allocated using A">SecByteBlock</a> data2(data.size() / 2);
<a name="l01184"></a>01184                 <a class="code" href="class_string_source.html" title="string-based implementation of Source interface">StringSource</a>(data, <span class="keyword">true</span>, <span class="keyword">new</span> <a class="code" href="class_hex_decoder.html" title="Decode base 16 data back to bytes.">HexDecoder</a>(<span class="keyword">new</span> <a class="code" href="class_array_sink.html" title="Copy input to a memory buffer.">ArraySink</a>(data2, data2.size())));
<a name="l01185"></a>01185                 <span class="keywordflow">return</span> data2;
<a name="l01186"></a>01186         }
<a name="l01187"></a>01187 
<a name="l01188"></a>01188         std::string m_algorithm, m_test, m_mode, m_line, m_bracketString, m_trigger;
<a name="l01189"></a>01189         <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> m_feedbackSize, m_blankLineTransition;
<a name="l01190"></a>01190         <span class="keywordtype">bool</span> m_encrypt, m_firstLine;
<a name="l01191"></a>01191 
<a name="l01192"></a>01192         <span class="keyword">typedef</span> std::map&lt;std::string, DataType&gt; NameToTypeMap;
<a name="l01193"></a>01193         NameToTypeMap m_nameToType;
<a name="l01194"></a>01194         <span class="keyword">typedef</span> std::map&lt;DataType, std::string&gt; TypeToNameMap;
<a name="l01195"></a>01195         TypeToNameMap m_typeToName;
<a name="l01196"></a>01196 
<a name="l01197"></a>01197         <span class="keyword">typedef</span> std::map&lt;std::string, std::string&gt; Map;
<a name="l01198"></a>01198         Map m_data;             <span class="comment">// raw data</span>
<a name="l01199"></a>01199         <span class="keyword">typedef</span> std::map&lt;DataType, SecByteBlock&gt; Map2;
<a name="l01200"></a>01200         Map2 m_data2;
<a name="l01201"></a>01201         <span class="keywordtype">int</span> m_count;
<a name="l01202"></a>01202 
<a name="l01203"></a>01203         <a class="code" href="class_auto_seeded_x917_r_n_g.html" title="RNG from ANSI X9.17 Appendix C, seeded using an OS provided RNG.">AutoSeededX917RNG&lt;AES&gt;</a> m_rng;
<a name="l01204"></a>01204         std::vector&lt;unsigned int&gt; m_compactString;
<a name="l01205"></a>01205 };
<a name="l01206"></a>01206 
<a name="l01207"></a>01207 <span class="keywordtype">int</span> FIPS_140_AlgorithmTest(<span class="keywordtype">int</span> argc, <span class="keywordtype">char</span> **argv)
<a name="l01208"></a>01208 {
<a name="l01209"></a>01209         argc--;
<a name="l01210"></a>01210         argv++;
<a name="l01211"></a>01211 
<a name="l01212"></a>01212         std::string algorithm = argv[1];
<a name="l01213"></a>01213         std::string pathname = argv[2];
<a name="l01214"></a>01214         <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i = pathname.find_last_of(<span class="stringliteral">&quot;\\/&quot;</span>);
<a name="l01215"></a>01215         std::string filename = pathname.substr(i == std::string::npos ? 0 : i+1);
<a name="l01216"></a>01216         std::string dirname = pathname.substr(0, i);
<a name="l01217"></a>01217 
<a name="l01218"></a>01218         <span class="keywordflow">if</span> (algorithm == <span class="stringliteral">&quot;auto&quot;</span>)
<a name="l01219"></a>01219         {
<a name="l01220"></a>01220                 <span class="keywordtype">string</span> algTable[] = {<span class="stringliteral">&quot;AES&quot;</span>, <span class="stringliteral">&quot;ECDSA&quot;</span>, <span class="stringliteral">&quot;DSA&quot;</span>, <span class="stringliteral">&quot;HMAC&quot;</span>, <span class="stringliteral">&quot;RNG&quot;</span>, <span class="stringliteral">&quot;RSA&quot;</span>, <span class="stringliteral">&quot;TDES&quot;</span>, <span class="stringliteral">&quot;SKIPJACK&quot;</span>, <span class="stringliteral">&quot;SHA&quot;</span>};   <span class="comment">// order is important here</span>
<a name="l01221"></a>01221                 <span class="keywordflow">for</span> (i=0; i&lt;<span class="keyword">sizeof</span>(algTable)/<span class="keyword">sizeof</span>(algTable[0]); i++)
<a name="l01222"></a>01222                 {
<a name="l01223"></a>01223                         <span class="keywordflow">if</span> (dirname.find(algTable[i]) != std::string::npos)
<a name="l01224"></a>01224                         {
<a name="l01225"></a>01225                                 algorithm = algTable[i];
<a name="l01226"></a>01226                                 <span class="keywordflow">break</span>;
<a name="l01227"></a>01227                         }
<a name="l01228"></a>01228                 }
<a name="l01229"></a>01229         }
<a name="l01230"></a>01230 
<a name="l01231"></a>01231         <span class="keywordflow">try</span>
<a name="l01232"></a>01232         {
<a name="l01233"></a>01233                 std::string mode;
<a name="l01234"></a>01234                 <span class="keywordflow">if</span> (algorithm == <span class="stringliteral">&quot;SHA&quot;</span>)
<a name="l01235"></a>01235                         mode = IntToString(atol(filename.substr(3, 3).c_str()));
<a name="l01236"></a>01236                 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (algorithm == <span class="stringliteral">&quot;RSA&quot;</span>)
<a name="l01237"></a>01237                         mode = filename.substr(6, 1);
<a name="l01238"></a>01238                 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (filename[0] == <span class="charliteral">&apos;S&apos;</span> || filename[0] == <span class="charliteral">&apos;T&apos;</span>)
<a name="l01239"></a>01239                         mode = filename.substr(1, 3);
<a name="l01240"></a>01240                 <span class="keywordflow">else</span>
<a name="l01241"></a>01241                         mode = filename.substr(0, 3);
<a name="l01242"></a>01242                 <span class="keywordflow">for</span> (i = 0; i&lt;mode.size(); i++)
<a name="l01243"></a>01243                         mode[i] = toupper(mode[i]);
<a name="l01244"></a>01244                 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> feedbackSize = mode == <span class="stringliteral">&quot;CFB&quot;</span> ? atoi(filename.substr(filename.find_first_of(<span class="stringliteral">&quot;0123456789&quot;</span>)).c_str()) : 0;
<a name="l01245"></a>01245                 std::string test;
<a name="l01246"></a>01246                 <span class="keywordflow">if</span> (algorithm == <span class="stringliteral">&quot;DSA&quot;</span> || algorithm == <span class="stringliteral">&quot;ECDSA&quot;</span>)
<a name="l01247"></a>01247                         test = filename.substr(0, filename.size() - 4);
<a name="l01248"></a>01248                 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (algorithm == <span class="stringliteral">&quot;RSA&quot;</span>)
<a name="l01249"></a>01249                         test = filename.substr(3, 3);
<a name="l01250"></a>01250                 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (filename.find(<span class="stringliteral">&quot;Monte&quot;</span>) != std::string::npos)
<a name="l01251"></a>01251                         test = <span class="stringliteral">&quot;MONTE&quot;</span>;
<a name="l01252"></a>01252                 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (filename.find(<span class="stringliteral">&quot;MCT&quot;</span>) != std::string::npos)
<a name="l01253"></a>01253                         test = <span class="stringliteral">&quot;MCT&quot;</span>;
<a name="l01254"></a>01254                 <span class="keywordflow">else</span>
<a name="l01255"></a>01255                         test = <span class="stringliteral">&quot;KAT&quot;</span>;
<a name="l01256"></a>01256                 <span class="keywordtype">bool</span> encrypt = (filename.find(<span class="stringliteral">&quot;vrct&quot;</span>) == std::string::npos);
<a name="l01257"></a>01257 
<a name="l01258"></a>01258                 <a class="code" href="class_buffered_transformation.html" title="interface for buffered transformations">BufferedTransformation</a> *pSink = NULL;
<a name="l01259"></a>01259 
<a name="l01260"></a>01260                 <span class="keywordflow">if</span> (argc &gt; 3)
<a name="l01261"></a>01261                 {
<a name="l01262"></a>01262                         std::string outDir = argv[3];
<a name="l01263"></a>01263 
<a name="l01264"></a>01264                         <span class="keywordflow">if</span> (outDir == <span class="stringliteral">&quot;auto&quot;</span>)
<a name="l01265"></a>01265                         {
<a name="l01266"></a>01266                                 <span class="keywordflow">if</span> (dirname.substr(dirname.size()-3) == <span class="stringliteral">&quot;req&quot;</span>)
<a name="l01267"></a>01267                                         outDir = dirname.substr(0, dirname.size()-3) + <span class="stringliteral">&quot;resp&quot;</span>;
<a name="l01268"></a>01268                         }
<a name="l01269"></a>01269 
<a name="l01270"></a>01270                         <span class="keywordflow">if</span> (*outDir.rbegin() != <span class="charliteral">&apos;\\&apos;</span> &amp;&amp; *outDir.rbegin() != <span class="charliteral">&apos;/&apos;</span>)
<a name="l01271"></a>01271                                 outDir += <span class="charliteral">&apos;/&apos;</span>;
<a name="l01272"></a>01272                         std::string outPathname = outDir + filename.substr(0, filename.size() - 3) + <span class="stringliteral">&quot;rsp&quot;</span>;
<a name="l01273"></a>01273                         pSink = <span class="keyword">new</span> <a class="code" href="class_file_sink.html" title="file-based implementation of Sink interface">FileSink</a>(outPathname.c_str(), <span class="keyword">false</span>);
<a name="l01274"></a>01274                 }
<a name="l01275"></a>01275                 <span class="keywordflow">else</span>
<a name="l01276"></a>01276                         pSink = <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="l01277"></a>01277 
<a name="l01278"></a>01278                 <a class="code" href="class_file_source.html" title="file-based implementation of Source interface">FileSource</a>(pathname.c_str(), <span class="keyword">true</span>, <span class="keyword">new</span> LineBreakParser(<span class="keyword">new</span> TestDataParser(algorithm, test, mode, feedbackSize, encrypt, pSink)), <span class="keyword">false</span>);
<a name="l01279"></a>01279         }
<a name="l01280"></a>01280         <span class="keywordflow">catch</span> (...)
<a name="l01281"></a>01281         {
<a name="l01282"></a>01282                 cout &lt;&lt; <span class="stringliteral">&quot;file: &quot;</span> &lt;&lt; filename &lt;&lt; endl;
<a name="l01283"></a>01283                 <span class="keywordflow">throw</span>;
<a name="l01284"></a>01284         }
<a name="l01285"></a>01285         <span class="keywordflow">return</span> 0;
<a name="l01286"></a>01286 }
<a name="l01287"></a>01287 
<a name="l01288"></a>01288 <span class="keyword">extern</span> int (*AdhocTest)(<span class="keywordtype">int</span> argc, <span class="keywordtype">char</span> *argv[]);
<a name="l01289"></a>01289 <span class="keyword">static</span> <span class="keywordtype">int</span> s_i = (AdhocTest = &amp;FIPS_140_AlgorithmTest, 0);
<a name="l01290"></a>01290 <span class="preprocessor">#endif</span>
</pre></div></div>
<hr size="1"/><address style="text-align: right;"><small>Generated on 9 Dec 2009 for Crypto++ by&nbsp;
<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.6.1 </small></address>
</body>
</html>