⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 camellia_8cpp-source.html

📁 著名的密码库Crypto++的文档 C++语言的杰作。程序员必备。
💻 HTML
📖 第 1 页 / 共 4 页
字号:
<a name="l00121"></a>00121 <span class="preprocessor">        else _mm_storel_epi64((__m128i*)CALC_ADDR(ks32, i+EFI(0)), temp);                                                                                       \</span><a name="l00122"></a>00122 <span class="preprocessor">        }</span><a name="l00123"></a>00123 <span class="preprocessor"></span><span class="preprocessor">#endif</span><a name="l00124"></a>00124 <span class="preprocessor"></span><a name="l00125"></a>00125         <span class="keywordflow">if</span> (keylen == 16)<a name="l00126"></a>00126         {<a name="l00127"></a>00127                 <span class="comment">// KL</span><a name="l00128"></a>00128                 PREPARE_KS_ROUNDS;<a name="l00129"></a>00129                 KS_ROUND_0(0);<a name="l00130"></a>00130                 KS_ROUND(4, 15, 3);<a name="l00131"></a>00131                 KS_ROUND(10, 45, 3);<a name="l00132"></a>00132                 KS_ROUND(12, 60, 2);<a name="l00133"></a>00133                 KS_ROUND(16, 77, 3);<a name="l00134"></a>00134                 KS_ROUND(18, 94, 3);<a name="l00135"></a>00135                 KS_ROUND(22, 111, 3);<a name="l00136"></a>00136 <a name="l00137"></a>00137                 <span class="comment">// KA</span><a name="l00138"></a>00138                 k0=kl0, k1=kl1, k2=kl2, k3=kl3;<a name="l00139"></a>00139                 DOUBLE_ROUND(k0, k1, k2, k3, 0xA09E667Ful, 0x3BCC908Bul, 0xB67AE858ul, 0x4CAA73B2ul);<a name="l00140"></a>00140                 k0^=kl0, k1^=kl1, k2^=kl2, k3^=kl3;<a name="l00141"></a>00141                 DOUBLE_ROUND(k0, k1, k2, k3, 0xC6EF372Ful, 0xE94F82BEul, 0x54FF53A5ul, 0xF1D36F1Cul);<a name="l00142"></a>00142 <a name="l00143"></a>00143                 PREPARE_KS_ROUNDS;<a name="l00144"></a>00144                 KS_ROUND_0(2);<a name="l00145"></a>00145                 KS_ROUND(6, 15, 3);<a name="l00146"></a>00146                 KS_ROUND(8, 30, 3);<a name="l00147"></a>00147                 KS_ROUND(12, 45, 1);<a name="l00148"></a>00148                 KS_ROUND(14, 60, 3);<a name="l00149"></a>00149                 KS_ROUND(20, 94, 3);<a name="l00150"></a>00150                 KS_ROUND(24, 47, 3);<a name="l00151"></a>00151         }<a name="l00152"></a>00152         <span class="keywordflow">else</span><a name="l00153"></a>00153         {<a name="l00154"></a>00154                 <span class="comment">// KL</span><a name="l00155"></a>00155                 PREPARE_KS_ROUNDS;<a name="l00156"></a>00156                 KS_ROUND_0(0);<a name="l00157"></a>00157                 KS_ROUND(12, 45, 3);<a name="l00158"></a>00158                 KS_ROUND(16, 60, 3);<a name="l00159"></a>00159                 KS_ROUND(22, 77, 3);<a name="l00160"></a>00160                 KS_ROUND(30, 111, 3);<a name="l00161"></a>00161 <a name="l00162"></a>00162                 <span class="comment">// KR</span><a name="l00163"></a>00163                 word32 kr0, kr1, kr2, kr3;<a name="l00164"></a>00164                 <a class="code" href="class_get_block.html">GetBlock&lt;word32, BigEndian, false&gt;</a>(key+16)(kr0)(kr1);<a name="l00165"></a>00165                 <span class="keywordflow">if</span> (keylen == 24)<a name="l00166"></a>00166                         kr2 = ~kr0, kr3 = ~kr1;<a name="l00167"></a>00167                 <span class="keywordflow">else</span><a name="l00168"></a>00168                         <a class="code" href="class_get_block.html">GetBlock&lt;word32, BigEndian, false&gt;</a>(key+24)(kr2)(kr3);<a name="l00169"></a>00169                 k0=kr0, k1=kr1, k2=kr2, k3=kr3;<a name="l00170"></a>00170 <a name="l00171"></a>00171                 PREPARE_KS_ROUNDS;<a name="l00172"></a>00172                 KS_ROUND(4, 15, 3);<a name="l00173"></a>00173                 KS_ROUND(8, 30, 3);<a name="l00174"></a>00174                 KS_ROUND(18, 60, 3);<a name="l00175"></a>00175                 KS_ROUND(26, 94, 3);<a name="l00176"></a>00176 <a name="l00177"></a>00177                 <span class="comment">// KA</span><a name="l00178"></a>00178                 k0^=kl0, k1^=kl1, k2^=kl2, k3^=kl3;<a name="l00179"></a>00179                 DOUBLE_ROUND(k0, k1, k2, k3, 0xA09E667Ful, 0x3BCC908Bul, 0xB67AE858ul, 0x4CAA73B2ul);<a name="l00180"></a>00180                 k0^=kl0, k1^=kl1, k2^=kl2, k3^=kl3;<a name="l00181"></a>00181                 DOUBLE_ROUND(k0, k1, k2, k3, 0xC6EF372Ful, 0xE94F82BEul, 0x54FF53A5ul, 0xF1D36F1Cul);<a name="l00182"></a>00182 <a name="l00183"></a>00183                 PREPARE_KS_ROUNDS;<a name="l00184"></a>00184                 KS_ROUND(6, 15, 3);<a name="l00185"></a>00185                 KS_ROUND(14, 45, 3);<a name="l00186"></a>00186                 KS_ROUND(24, 77, 3);<a name="l00187"></a>00187                 KS_ROUND(28, 94, 3);<a name="l00188"></a>00188 <a name="l00189"></a>00189                 <span class="comment">// KB</span><a name="l00190"></a>00190                 k0^=kr0, k1^=kr1, k2^=kr2, k3^=kr3;<a name="l00191"></a>00191                 DOUBLE_ROUND(k0, k1, k2, k3, 0x10E527FAul, 0xDE682D1Dul, 0xB05688C2ul, 0xB3E6C1FDul);<a name="l00192"></a>00192 <a name="l00193"></a>00193                 PREPARE_KS_ROUNDS;<a name="l00194"></a>00194                 KS_ROUND_0(2);<a name="l00195"></a>00195                 KS_ROUND(10, 30, 3);<a name="l00196"></a>00196                 KS_ROUND(20, 60, 3);<a name="l00197"></a>00197                 KS_ROUND(32, 47, 3);<a name="l00198"></a>00198         }<a name="l00199"></a>00199 }<a name="l00200"></a>00200 <a name="l00201"></a>00201 <span class="keywordtype">void</span> Camellia::Base::ProcessAndXorBlock(<span class="keyword">const</span> byte *inBlock, <span class="keyword">const</span> byte *xorBlock, byte *outBlock)<span class="keyword"> const</span><a name="l00202"></a>00202 <span class="keyword"></span>{<a name="l00203"></a>00203 <span class="preprocessor">#define KS(i, j) ks[i*4 + EFI(j/2)*2 + EFI(j%2)]</span><a name="l00204"></a>00204 <span class="preprocessor"></span><a name="l00205"></a>00205 <span class="preprocessor">#define FL(klh, kll, krh, krl)          \</span><a name="l00206"></a>00206 <span class="preprocessor">        ll ^= rotlFixed(lh &amp; klh, 1);   \</span><a name="l00207"></a>00207 <span class="preprocessor">        lh ^= (ll | kll);                               \</span><a name="l00208"></a>00208 <span class="preprocessor">        rh ^= (rl | krl);                               \</span><a name="l00209"></a>00209 <span class="preprocessor">        rl ^= rotlFixed(rh &amp; krh, 1);</span><a name="l00210"></a>00210 <span class="preprocessor"></span><a name="l00211"></a>00211         word32 lh, ll, rh, rl;<a name="l00212"></a>00212         <span class="keyword">typedef</span> <a class="code" href="struct_block_get_and_put.html">BlockGetAndPut&lt;word32, BigEndian&gt;</a> <a class="code" href="struct_block_get_and_put.html">Block</a>;<a name="l00213"></a>00213         <a class="code" href="struct_block_get_and_put.html#07781cc0817613fe47e8070999cf4b95">Block::Get</a>(inBlock)(lh)(ll)(rh)(rl);<a name="l00214"></a>00214         <span class="keyword">const</span> word32 *ks = m_key.data();<a name="l00215"></a>00215         lh ^= KS(0,0);<a name="l00216"></a>00216         ll ^= KS(0,1);<a name="l00217"></a>00217         rh ^= KS(0,2);<a name="l00218"></a>00218         rl ^= KS(0,3);<a name="l00219"></a>00219 <a name="l00220"></a>00220         <span class="comment">// timing attack countermeasure. see comments at top for more details</span><a name="l00221"></a>00221         <span class="keyword">const</span> <span class="keywordtype">int</span> cacheLineSize = GetCacheLineSize();<a name="l00222"></a>00222         <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i;<a name="l00223"></a>00223         word32 u = 0;<a name="l00224"></a>00224         <span class="keywordflow">for</span> (i=0; i&lt;256; i+=cacheLineSize)<a name="l00225"></a>00225                 u &amp;= *(<span class="keyword">const</span> word32 *)(s1+i);<a name="l00226"></a>00226         u &amp;= *(<span class="keyword">const</span> word32 *)(s1+252);<a name="l00227"></a>00227         lh |= u; ll |= u;<a name="l00228"></a>00228 <a name="l00229"></a>00229         SLOW_ROUND(lh, ll, rh, rl, KS(1,0), KS(1,1))<a name="l00230"></a>00230         SLOW_ROUND(rh, rl, lh, ll, KS(1,2), KS(1,3))<a name="l00231"></a>00231         for (i = m_rounds-1; i &gt; 0; --i)<a name="l00232"></a>00232         {<a name="l00233"></a>00233                 DOUBLE_ROUND(lh, ll, rh, rl, KS(2,0), KS(2,1), KS(2,2), KS(2,3))<a name="l00234"></a>00234                 DOUBLE_ROUND(lh, ll, rh, rl, KS(3,0), KS(3,1), KS(3,2), KS(3,3))<a name="l00235"></a>00235                 FL(KS(4,0), KS(4,1), KS(4,2), KS(4,3));<a name="l00236"></a>00236                 DOUBLE_ROUND(lh, ll, rh, rl, KS(5,0), KS(5,1), KS(5,2), KS(5,3))<a name="l00237"></a>00237                 ks += 16;<a name="l00238"></a>00238         }<a name="l00239"></a>00239         DOUBLE_ROUND(lh, ll, rh, rl, KS(2,0), KS(2,1), KS(2,2), KS(2,3))<a name="l00240"></a>00240         ROUND(lh, ll, rh, rl, KS(3,0), KS(3,1))<a name="l00241"></a>00241         SLOW_ROUND(rh, rl, lh, ll, KS(3,2), KS(3,3))<a name="l00242"></a>00242         lh ^= KS(4,0);<a name="l00243"></a>00243         ll ^= KS(4,1);<a name="l00244"></a>00244         rh ^= KS(4,2);<a name="l00245"></a>00245         rl ^= KS(4,3);<a name="l00246"></a>00246         Block::Put(xorBlock, outBlock)(rh)(rl)(lh)(ll);<a name="l00247"></a>00247 }<a name="l00248"></a>00248 <a name="l00249"></a>00249 <span class="comment">// The Camellia s-boxes</span><a name="l00250"></a>00250 <a name="l00251"></a>00251 const byte <a class="code" href="class_camellia.html" title="Camellia">Camellia</a>::Base::s1[256] =<a name="l00252"></a>00252 {<a name="l00253"></a>00253         112,130,44,236,179,39,192,229,228,133,87,53,234,12,174,65,<a name="l00254"></a>00254         35,239,107,147,69,25,165,33,237,14,79,78,29,101,146,189,<a name="l00255"></a>00255         134,184,175,143,124,235,31,206,62,48,220,95,94,197,11,26,<a name="l00256"></a>00256         166,225,57,202,213,71,93,61,217,1,90,214,81,86,108,77,<a name="l00257"></a>00257         139,13,154,102,251,204,176,45,116,18,43,32,240,177,132,153,<a name="l00258"></a>00258         223,76,203,194,52,126,118,5,109,183,169,49,209,23,4,215,<a name="l00259"></a>00259         20,88,58,97,222,27,17,28,50,15,156,22,83,24,242,34,<a name="l00260"></a>00260         254,68,207,178,195,181,122,145,36,8,232,168,96,252,105,80,<a name="l00261"></a>00261         170,208,160,125,161,137,98,151,84,91,30,149,224,255,100,210,

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -