📄 strciphr_8h-source.html
字号:
<a name="l00064"></a>00064 <a name="l00065"></a><a class="code" href="struct_additive_cipher_abstract_policy.html">00065</a> <span class="keyword">struct </span>CRYPTOPP_DLL CRYPTOPP_NO_VTABLE <a class="code" href="struct_additive_cipher_abstract_policy.html">AdditiveCipherAbstractPolicy</a><a name="l00066"></a>00066 {<a name="l00067"></a><a class="code" href="struct_additive_cipher_abstract_policy.html#c7ef878b3a8fd2e87649f8c242781aab">00067</a> <span class="keyword">virtual</span> ~<a class="code" href="struct_additive_cipher_abstract_policy.html">AdditiveCipherAbstractPolicy</a>() {}<a name="l00068"></a><a class="code" href="struct_additive_cipher_abstract_policy.html#156c179304f2a5d119f74806b5b263ec">00068</a> <span class="keyword">virtual</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> GetAlignment()<span class="keyword"> const </span>{<span class="keywordflow">return</span> 1;}<a name="l00069"></a>00069 <span class="keyword">virtual</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> GetBytesPerIteration() <span class="keyword">const</span> =0;<a name="l00070"></a><a class="code" href="struct_additive_cipher_abstract_policy.html#32bbafa12b59e77d4d8bc67e9d5a4004">00070</a> <span class="keyword">virtual</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> GetOptimalBlockSize()<span class="keyword"> const </span>{<span class="keywordflow">return</span> GetBytesPerIteration();}<a name="l00071"></a>00071 <span class="keyword">virtual</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> GetIterationsToBuffer() <span class="keyword">const</span> =0;<a name="l00072"></a><a class="code" href="struct_additive_cipher_abstract_policy.html#ea8268ee42cbc98cf9be638bf77aafef">00072</a> <span class="keyword">virtual</span> <span class="keywordtype">void</span> WriteKeystream(byte *keystream, <span class="keywordtype">size_t</span> iterationCount)<a name="l00073"></a>00073 {OperateKeystream(<a class="code" href="strciphr_8h.html#b4a226527d2bd01ff19bfa14d0974227">KeystreamOperation</a>(<a class="code" href="strciphr_8h.html#cd7ca957d2fd1c24ecc2a4db7145d93f0fc3580c2832e59fe9e21673160e6042">INPUT_NULL</a> | (<a class="code" href="strciphr_8h.html#cd7ca957d2fd1c24ecc2a4db7145d93f">KeystreamOperationFlags</a>)IsAlignedOn(keystream, GetAlignment())), keystream, NULL, iterationCount);}<a name="l00074"></a><a class="code" href="struct_additive_cipher_abstract_policy.html#02d1a81c11cf52ed48a5c10357a39717">00074</a> <span class="keyword">virtual</span> <span class="keywordtype">bool</span> CanOperateKeystream()<span class="keyword"> const </span>{<span class="keywordflow">return</span> <span class="keyword">false</span>;}<a name="l00075"></a><a class="code" href="struct_additive_cipher_abstract_policy.html#e948f2e69229ba39837e498a464606d4">00075</a> <span class="keyword">virtual</span> <span class="keywordtype">void</span> OperateKeystream(<a class="code" href="strciphr_8h.html#b4a226527d2bd01ff19bfa14d0974227">KeystreamOperation</a> operation, byte *output, <span class="keyword">const</span> byte *input, <span class="keywordtype">size_t</span> iterationCount) {assert(<span class="keyword">false</span>);}<a name="l00076"></a>00076 <span class="keyword">virtual</span> <span class="keywordtype">void</span> CipherSetKey(<span class="keyword">const</span> <a class="code" href="class_name_value_pairs.html" title="interface for retrieving values given their names">NameValuePairs</a> &params, <span class="keyword">const</span> byte *key, <span class="keywordtype">size_t</span> length) =0;<a name="l00077"></a><a class="code" href="struct_additive_cipher_abstract_policy.html#98b9150cb6f67e39d8e3e1067b475515">00077</a> <span class="keyword">virtual</span> <span class="keywordtype">void</span> CipherResynchronize(byte *keystreamBuffer, <span class="keyword">const</span> byte *iv) {<span class="keywordflow">throw</span> <a class="code" href="class_not_implemented.html" title="exception thrown by a class if a non-implemented method is called">NotImplemented</a>(<span class="stringliteral">"SimpleKeyingInterface: this object doesn't support resynchronization"</span>);}<a name="l00078"></a>00078 <span class="keyword">virtual</span> <span class="keywordtype">bool</span> IsRandomAccess() <span class="keyword">const</span> =0;<a name="l00079"></a><a class="code" href="struct_additive_cipher_abstract_policy.html#8fce38d2b7d84732fc3efea410b82d54">00079</a> <span class="keyword">virtual</span> <span class="keywordtype">void</span> SeekToIteration(lword iterationCount) {assert(!IsRandomAccess()); <span class="keywordflow">throw</span> <a class="code" href="class_not_implemented.html" title="exception thrown by a class if a non-implemented method is called">NotImplemented</a>(<span class="stringliteral">"StreamTransformation: this object doesn't support random access"</span>);}<a name="l00080"></a>00080 };<a name="l00081"></a>00081 <a name="l00082"></a>00082 <span class="keyword">template</span> <<span class="keyword">typename</span> WT, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> W, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> X = 1, <span class="keyword">class</span> BASE = AdditiveCipherAbstractPolicy><a name="l00083"></a><a class="code" href="struct_additive_cipher_concrete_policy.html">00083</a> <span class="keyword">struct </span>CRYPTOPP_NO_VTABLE <a class="code" href="struct_additive_cipher_concrete_policy.html">AdditiveCipherConcretePolicy</a> : <span class="keyword">public</span> BASE<a name="l00084"></a>00084 {<a name="l00085"></a><a class="code" href="struct_additive_cipher_concrete_policy.html#94149b18cb6bf530f196ba0132ba904f">00085</a> <span class="keyword">typedef</span> WT WordType;<a name="l00086"></a><a class="code" href="struct_additive_cipher_concrete_policy.html#0c584b68c2f3a8208ff245cd8d09fcd5">00086</a> CRYPTOPP_CONSTANT(BYTES_PER_ITERATION = <span class="keyword">sizeof</span>(WordType) * W)<a name="l00087"></a>00087 <a name="l00088"></a>00088 <span class="preprocessor">#if !(CRYPTOPP_BOOL_X86 || CRYPTOPP_BOOL_X64)</span><a name="l00089"></a><a class="code" href="struct_additive_cipher_concrete_policy.html#5bdc1cb44b0ddc8df0fb6953aec93602">00089</a> <span class="preprocessor"></span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> GetAlignment()<span class="keyword"> const </span>{<span class="keywordflow">return</span> GetAlignmentOf<WordType>();}<a name="l00090"></a>00090 <span class="preprocessor">#endif</span><a name="l00091"></a><a class="code" href="struct_additive_cipher_concrete_policy.html#3518c4f5404dd2eb483599bb1109d715">00091</a> <span class="preprocessor"></span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> GetBytesPerIteration()<span class="keyword"> const </span>{<span class="keywordflow">return</span> BYTES_PER_ITERATION;}<a name="l00092"></a><a class="code" href="struct_additive_cipher_concrete_policy.html#d7d421c4073891ad3522c50052d32f60">00092</a> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> GetIterationsToBuffer()<span class="keyword"> const </span>{<span class="keywordflow">return</span> X;}<a name="l00093"></a><a class="code" href="struct_additive_cipher_concrete_policy.html#4d61dfcd462d71960fe8567e2d475f14">00093</a> <span class="keywordtype">bool</span> CanOperateKeystream()<span class="keyword"> const </span>{<span class="keywordflow">return</span> <span class="keyword">true</span>;}<a name="l00094"></a>00094 <span class="keyword">virtual</span> <span class="keywordtype">void</span> OperateKeystream(<a class="code" href="strciphr_8h.html#b4a226527d2bd01ff19bfa14d0974227">KeystreamOperation</a> operation, byte *output, <span class="keyword">const</span> byte *input, <span class="keywordtype">size_t</span> iterationCount) =0;<a name="l00095"></a>00095 };<a name="l00096"></a>00096 <a name="l00097"></a>00097 <span class="comment">// use these to implement OperateKeystream</span><a name="l00098"></a><a class="code" href="strciphr_8h.html#4a86c9df41d368440348bcc835a56706">00098</a> <span class="preprocessor">#define CRYPTOPP_KEYSTREAM_OUTPUT_WORD(x, b, i, a) \</span><a name="l00099"></a>00099 <span class="preprocessor"> PutWord(bool(x & OUTPUT_ALIGNED), b, output+i*sizeof(WordType), (x & INPUT_NULL) ? a : a ^ GetWord<WordType>(bool(x & INPUT_ALIGNED), b, input+i*sizeof(WordType)));</span><a name="l00100"></a><a class="code" href="strciphr_8h.html#3a30bda92ececdc86efced76e074eeaa">00100</a> <span class="preprocessor"></span><span class="preprocessor">#define CRYPTOPP_KEYSTREAM_OUTPUT_XMM(x, i, a) {\</span><a name="l00101"></a>00101 <span class="preprocessor"> __m128i t = (x & INPUT_NULL) ? a : _mm_xor_si128(a, (x & INPUT_ALIGNED) ? _mm_load_si128((__m128i *)input+i) : _mm_loadu_si128((__m128i *)input+i));\</span><a name="l00102"></a>00102 <span class="preprocessor"> if (x & OUTPUT_ALIGNED) _mm_store_si128((__m128i *)output+i, t);\</span><a name="l00103"></a>00103 <span class="preprocessor"> else _mm_storeu_si128((__m128i *)output+i, t);}</span><a name="l00104"></a><a class="code" href="strciphr_8h.html#4f82514b5ab874259ac783ff9b96c4e5">00104</a> <span class="preprocessor"></span><span class="preprocessor">#define CRYPTOPP_KEYSTREAM_OUTPUT_SWITCH(x, y) \</span><a name="l00105"></a>00105 <span class="preprocessor"> switch (operation) \</span><a name="l00106"></a>00106 <span class="preprocessor"> { \</span><a name="l00107"></a>00107 <span class="preprocessor"> case WRITE_KEYSTREAM: \</span><a name="l00108"></a>00108 <span class="preprocessor"> x(WRITE_KEYSTREAM) \</span><a name="l00109"></a>00109 <span class="preprocessor"> break; \</span><a name="l00110"></a>00110 <span class="preprocessor"> case XOR_KEYSTREAM: \</span><a name="l00111"></a>00111 <span class="preprocessor"> x(XOR_KEYSTREAM) \</span><a name="l00112"></a>00112 <span class="preprocessor"> input += y; \</span><a name="l00113"></a>00113 <span class="preprocessor"> break; \</span><a name="l00114"></a>00114 <span class="preprocessor"> case XOR_KEYSTREAM_INPUT_ALIGNED: \</span><a name="l00115"></a>00115 <span class="preprocessor"> x(XOR_KEYSTREAM_INPUT_ALIGNED) \</span><a name="l00116"></a>00116 <span class="preprocessor"> input += y; \</span><a name="l00117"></a>00117 <span class="preprocessor"> break; \</span><a name="l00118"></a>00118 <span class="preprocessor"> case XOR_KEYSTREAM_OUTPUT_ALIGNED: \</span><a name="l00119"></a>00119 <span class="preprocessor"> x(XOR_KEYSTREAM_OUTPUT_ALIGNED) \</span><a name="l00120"></a>00120 <span class="preprocessor"> input += y; \</span><a name="l00121"></a>00121 <span class="preprocessor"> break; \</span><a name="l00122"></a>00122 <span class="preprocessor"> case WRITE_KEYSTREAM_ALIGNED: \</span><a name="l00123"></a>00123 <span class="preprocessor"> x(WRITE_KEYSTREAM_ALIGNED) \</span><a name="l00124"></a>00124 <span class="preprocessor"> break; \</span><a name="l00125"></a>00125 <span class="preprocessor"> case XOR_KEYSTREAM_BOTH_ALIGNED: \</span><a name="l00126"></a>00126 <span class="preprocessor"> x(XOR_KEYSTREAM_BOTH_ALIGNED) \</span><a name="l00127"></a>00127 <span class="preprocessor"> input += y; \</span><a name="l00128"></a>00128 <span class="preprocessor"> break; \</span><a name="l00129"></a>00129 <span class="preprocessor"> } \</span><a name="l00130"></a>00130 <span class="preprocessor"> output += y;</span><a name="l00131"></a>00131 <span class="preprocessor"></span><a name="l00132"></a>00132 <span class="keyword">template</span> <<span class="keyword">class</span> BASE = AbstractPolicyHolder<AdditiveCipherAbstractPolicy, TwoBases<SymmetricCipher, RandomNumberGenerator> > ><a name="l00133"></a><a class="code" href="class_additive_cipher_template.html">00133</a> <span class="keyword">class </span>CRYPTOPP_NO_VTABLE AdditiveCipherTemplate : <span class="keyword">public</span> BASE<a name="l00134"></a>00134 {<a name="l00135"></a>00135 <span class="keyword">public</span>:<a name="l00136"></a>00136 <span class="keywordtype">void</span> GenerateBlock(byte *output, <span class="keywordtype">size_t</span> size);<a name="l00137"></a>00137 <span class="keywordtype">void</span> ProcessData(byte *outString, <span class="keyword">const</span> byte *inString, <span class="keywordtype">size_t</span> length);<a name="l00138"></a>00138 <span class="keywordtype">void</span> Resynchronize(<span class="keyword">const</span> byte *iv);<a name="l00139"></a><a class="code" href="class_additive_cipher_template.html#0004338eef2392895a4dae77465aa64a">00139</a> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> OptimalBlockSize()<span class="keyword"> const </span>{<span class="keywordflow">return</span> this->GetPolicy().GetOptimalBlockSize();}<a name="l00140"></a><a class="code" href="class_additive_cipher_template.html#53950e34007c5cc84529e9199c84c7d2">00140</a> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> GetOptimalNextBlockSize()<span class="keyword"> const </span>{<span class="keywordflow">return</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span>)this->m_leftOver;}<a name="l00141"></a><a class="code" href="class_additive_cipher_template.html#d4330a5797c37ffca92f34b532624b3c">00141</a> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> OptimalDataAlignment()<span class="keyword"> const </span>{<span class="keywordflow">return</span> this->GetPolicy().GetAlignment();}<a name="l00142"></a><a class="code" href="class_additive_cipher_template.html#a5381b39bce5e7041fcbe2c8e53d85a7">00142</a> <span class="keywordtype">bool</span> IsSelfInverting()<span class="keyword"> const </span>{<span class="keywordflow">return</span> <span class="keyword">true</span>;}<a name="l00143"></a><a class="code" href="class_additive_cipher_template.html#cabcddee5c7f5ccb5149c232741a2b1d">00143</a> <span class="keywordtype">bool</span> IsForwardTransformation()<span class="keyword"> const </span>{<span class="keywordflow">return</span> <span class="keyword">true</span>;}<a name="l00144"></a><a class="code" href="class_additive_cipher_template.html#348e17f577eee091fa06029123944467">00144</a> <span class="keywordtype">bool</span> IsRandomAccess()<span class="keyword"> const </span>{<span class="keywordflow">return</span> this->GetPolicy().IsRandomAccess();}<a name="l00145"></a>00145 <span class="keywordtype">void</span> Seek(lword position);<a name="l00146"></a>00146 <a name="l00147"></a><a class="code" href="class_additive_cipher_template.html#79b269d3b9def1c573eb8b73926bbfdf">00147</a> <span class="keyword">typedef</span> <span class="keyword">typename</span> BASE::PolicyInterface PolicyInterface;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -