📄 fipsalgt_8cpp-source.html
字号:
<a name="l00198"></a>00198 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (m_algorithm == <span class="stringliteral">"TDES"</span> && t == KEY_T && m_typeToName[KEY_T].empty())<a name="l00199"></a>00199 {<a name="l00200"></a>00200 output += <span class="stringliteral">"KEY1 = "</span>;<a name="l00201"></a>00201 output += data.substr(0, 16);<a name="l00202"></a>00202 output += <span class="stringliteral">"\nKEY2 = "</span>;<a name="l00203"></a>00203 output += data.size() > 16 ? data.substr(16, 16) : data.substr(0, 16);<a name="l00204"></a>00204 output += <span class="stringliteral">"\nKEY3 = "</span>;<a name="l00205"></a>00205 output += data.size() > 32 ? data.substr(32, 16) : data.substr(0, 16);<a name="l00206"></a>00206 output += <span class="stringliteral">"\n"</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">" = "</span>;<a name="l00212"></a>00212 output += data;<a name="l00213"></a>00213 output += <span class="stringliteral">"\n"</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 &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 &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> &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.<a class="code" href="class_sec_block.html#11a05906688172579cd3520816799446">begin</a>(), data.<a class="code" href="class_sec_block.html#f5999bffe3193e62719cc0792b0282a7">size</a>(), <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 &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#8e53909d979479380e0274807c074c0a27d9ee7704100a88e4ae4adcc4072015" title="some error not belong to any of the above categories">Exception::OTHER_ERROR</a>, <span class="stringliteral">"TestDataParser: key not found: "</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> <<span class="keyword">class</span> T><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 && (m_mode == <span class="stringliteral">"ECB"</span> || m_mode == <span class="stringliteral">"CBC"</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> <<span class="keyword">class</span> T><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> &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> &z, <span class="keyword">const</span> <a class="code" href="class_sec_block.html" title="a block of memory allocated using A">SecByteBlock</a> &x, <span class="keyword">const</span> <a class="code" href="class_sec_block.html" title="a block of memory allocated using A">SecByteBlock</a> &y)<a name="l00260"></a>00260 {<a name="l00261"></a>00261 assert(x.<a class="code" href="class_sec_block.html#f5999bffe3193e62719cc0792b0282a7">size</a>() == y.<a class="code" href="class_sec_block.html#f5999bffe3193e62719cc0792b0282a7">size</a>());<a name="l00262"></a>00262 z.<a class="code" href="class_sec_block.html#f9e98d3f4a7af1156fcf3e6e68f4ae5a" title="change size and preserve contents">resize</a>(x.<a class="code" href="class_sec_block.html#f5999bffe3193e62719cc0792b0282a7">size</a>());<a name="l00263"></a>00263 xorbuf(z, x, y, x.<a class="code" href="class_sec_block.html#f5999bffe3193e62719cc0792b0282a7">size</a>());<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">"AES"</span>) ? 1000 : 10000;<a name="l00269"></a>00269 <span class="keywordtype">int</span> keySize = key.<a class="code" href="class_sec_block.html#f5999bffe3193e62719cc0792b0282a7">size</a>(), blockSize = text[0].<a class="code" href="class_sec_block.html#f5999bffe3193e62719cc0792b0282a7">size</a>();<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<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">"TDES"</span> || m_algorithm == <span class="stringliteral">"DES"</span>)<a name="l00279"></a>00279 {<a name="l00280"></a>00280 <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i=0; i<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#b4b48b141706addb33c955c694dd9ead" 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> &z, <span class="keyword">const</span> <a class="code" href="class_sec_block.html" title="a block of memory allocated using A">SecByteBlock</a> &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#2cf5dc5e31c63eb927f935af6104f36a" 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> <<span class="keyword">class</span> EC><a name="l00298"></a>00298 <span class="keywordtype">void</span> EC_KeyPair(<span class="keywordtype">string</span> &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> &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<EC></a> params(oid);<a name="l00301"></a>00301 <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i=0; i<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<EC></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<EC></a> pub;<a name="l00305"></a>00305 priv.Initialize(m_rng, params);<a name="l00306"></a>00306 priv.MakePublicKey(pub);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -