Sophie

Sophie

distrib > Mandriva > 10.2 > i586 > media > contrib > by-pkgid > 7457b841ac8136d3a1a9d3d960c5252e > files > 1398

libcryptopp-doc-5.2.1-2mdk.i586.rpm

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
<title>Crypto++: serpent.cpp Source File</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
</head><body>
<!-- Generated by Doxygen 1.3.7 -->
<div class="qindex"><a class="qindex" href="index.html">Main&nbsp;Page</a> | <a class="qindex" href="namespaces.html">Namespace List</a> | <a class="qindex" href="hierarchy.html">Class&nbsp;Hierarchy</a> | <a class="qindex" href="classes.html">Alphabetical&nbsp;List</a> | <a class="qindex" href="annotated.html">Class&nbsp;List</a> | <a class="qindex" href="files.html">File&nbsp;List</a> | <a class="qindex" href="namespacemembers.html">Namespace&nbsp;Members</a> | <a class="qindex" href="functions.html">Class&nbsp;Members</a> | <a class="qindex" href="globals.html">File&nbsp;Members</a></div>
<h1>serpent.cpp</h1><pre class="fragment"><div>00001 <span class="comment">// serpent.cpp - written and placed in the public domain by Wei Dai</span>
00002 
00003 <span class="preprocessor">#include "pch.h"</span>
00004 <span class="preprocessor">#include "<a class="code" href="serpent_8h.html">serpent.h</a>"</span>
00005 <span class="preprocessor">#include "misc.h"</span>
00006 
00007 NAMESPACE_BEGIN(CryptoPP)
00008 
00009 <span class="comment">// linear transformation</span>
00010 #define LT(i,a,b,c,d,e) {\
00011         a = rotlFixed(a, 13);   \
00012         c = rotlFixed(c, 3);    \
00013         d = rotlFixed(d ^ c ^ (a &lt;&lt; 3), 7);     \
00014         b = rotlFixed(b ^ a ^ c, 1);    \
00015         a = rotlFixed(a ^ b ^ d, 5);            \
00016         c = rotlFixed(c ^ d ^ (b &lt;&lt; 7), 22);}
00017 
00018 <span class="comment">// inverse linear transformation</span>
00019 <span class="preprocessor">#define ILT(i,a,b,c,d,e)        {\</span>
00020 <span class="preprocessor">        c = rotrFixed(c, 22);   \</span>
00021 <span class="preprocessor">        a = rotrFixed(a, 5);    \</span>
00022 <span class="preprocessor">        c ^= d ^ (b &lt;&lt; 7);      \</span>
00023 <span class="preprocessor">        a ^= b ^ d;             \</span>
00024 <span class="preprocessor">        b = rotrFixed(b, 1);    \</span>
00025 <span class="preprocessor">        d = rotrFixed(d, 7) ^ c ^ (a &lt;&lt; 3);     \</span>
00026 <span class="preprocessor">        b ^= a ^ c;             \</span>
00027 <span class="preprocessor">        c = rotrFixed(c, 3);    \</span>
00028 <span class="preprocessor">        a = rotrFixed(a, 13);}</span>
00029 <span class="preprocessor"></span>
00030 <span class="comment">// order of output from S-box functions</span>
00031 <span class="preprocessor">#define beforeS0(f) f(0,a,b,c,d,e)</span>
00032 <span class="preprocessor"></span><span class="preprocessor">#define afterS0(f) f(1,b,e,c,a,d)</span>
00033 <span class="preprocessor"></span><span class="preprocessor">#define afterS1(f) f(2,c,b,a,e,d)</span>
00034 <span class="preprocessor"></span><span class="preprocessor">#define afterS2(f) f(3,a,e,b,d,c)</span>
00035 <span class="preprocessor"></span><span class="preprocessor">#define afterS3(f) f(4,e,b,d,c,a)</span>
00036 <span class="preprocessor"></span><span class="preprocessor">#define afterS4(f) f(5,b,a,e,c,d)</span>
00037 <span class="preprocessor"></span><span class="preprocessor">#define afterS5(f) f(6,a,c,b,e,d)</span>
00038 <span class="preprocessor"></span><span class="preprocessor">#define afterS6(f) f(7,a,c,d,b,e)</span>
00039 <span class="preprocessor"></span><span class="preprocessor">#define afterS7(f) f(8,d,e,b,a,c)</span>
00040 <span class="preprocessor"></span>
00041 <span class="comment">// order of output from inverse S-box functions</span>
00042 <span class="preprocessor">#define beforeI7(f) f(8,a,b,c,d,e)</span>
00043 <span class="preprocessor"></span><span class="preprocessor">#define afterI7(f) f(7,d,a,b,e,c)</span>
00044 <span class="preprocessor"></span><span class="preprocessor">#define afterI6(f) f(6,a,b,c,e,d)</span>
00045 <span class="preprocessor"></span><span class="preprocessor">#define afterI5(f) f(5,b,d,e,c,a)</span>
00046 <span class="preprocessor"></span><span class="preprocessor">#define afterI4(f) f(4,b,c,e,a,d)</span>
00047 <span class="preprocessor"></span><span class="preprocessor">#define afterI3(f) f(3,a,b,e,c,d)</span>
00048 <span class="preprocessor"></span><span class="preprocessor">#define afterI2(f) f(2,b,d,e,c,a)</span>
00049 <span class="preprocessor"></span><span class="preprocessor">#define afterI1(f) f(1,a,b,c,e,d)</span>
00050 <span class="preprocessor"></span><span class="preprocessor">#define afterI0(f) f(0,a,d,b,e,c)</span>
00051 <span class="preprocessor"></span>
00052 <span class="comment">// The instruction sequences for the S-box functions </span>
00053 <span class="comment">// come from Dag Arne Osvik's paper "Speeding up Serpent".</span>
00054 
00055 <span class="preprocessor">#define S0(i, r0, r1, r2, r3, r4) \</span>
00056 <span class="preprocessor">       {           \</span>
00057 <span class="preprocessor">    r3 ^= r0;   \</span>
00058 <span class="preprocessor">    r4 = r1;   \</span>
00059 <span class="preprocessor">    r1 &amp;= r3;   \</span>
00060 <span class="preprocessor">    r4 ^= r2;   \</span>
00061 <span class="preprocessor">    r1 ^= r0;   \</span>
00062 <span class="preprocessor">    r0 |= r3;   \</span>
00063 <span class="preprocessor">    r0 ^= r4;   \</span>
00064 <span class="preprocessor">    r4 ^= r3;   \</span>
00065 <span class="preprocessor">    r3 ^= r2;   \</span>
00066 <span class="preprocessor">    r2 |= r1;   \</span>
00067 <span class="preprocessor">    r2 ^= r4;   \</span>
00068 <span class="preprocessor">    r4 = ~r4;      \</span>
00069 <span class="preprocessor">    r4 |= r1;   \</span>
00070 <span class="preprocessor">    r1 ^= r3;   \</span>
00071 <span class="preprocessor">    r1 ^= r4;   \</span>
00072 <span class="preprocessor">    r3 |= r0;   \</span>
00073 <span class="preprocessor">    r1 ^= r3;   \</span>
00074 <span class="preprocessor">    r4 ^= r3;   \</span>
00075 <span class="preprocessor">            }</span>
00076 <span class="preprocessor"></span>
00077 <span class="preprocessor">#define I0(i, r0, r1, r2, r3, r4) \</span>
00078 <span class="preprocessor">       {           \</span>
00079 <span class="preprocessor">    r2 = ~r2;      \</span>
00080 <span class="preprocessor">    r4 = r1;   \</span>
00081 <span class="preprocessor">    r1 |= r0;   \</span>
00082 <span class="preprocessor">    r4 = ~r4;      \</span>
00083 <span class="preprocessor">    r1 ^= r2;   \</span>
00084 <span class="preprocessor">    r2 |= r4;   \</span>
00085 <span class="preprocessor">    r1 ^= r3;   \</span>
00086 <span class="preprocessor">    r0 ^= r4;   \</span>
00087 <span class="preprocessor">    r2 ^= r0;   \</span>
00088 <span class="preprocessor">    r0 &amp;= r3;   \</span>
00089 <span class="preprocessor">    r4 ^= r0;   \</span>
00090 <span class="preprocessor">    r0 |= r1;   \</span>
00091 <span class="preprocessor">    r0 ^= r2;   \</span>
00092 <span class="preprocessor">    r3 ^= r4;   \</span>
00093 <span class="preprocessor">    r2 ^= r1;   \</span>
00094 <span class="preprocessor">    r3 ^= r0;   \</span>
00095 <span class="preprocessor">    r3 ^= r1;   \</span>
00096 <span class="preprocessor">    r2 &amp;= r3;   \</span>
00097 <span class="preprocessor">    r4 ^= r2;   \</span>
00098 <span class="preprocessor">            }</span>
00099 <span class="preprocessor"></span>
00100 <span class="preprocessor">#define S1(i, r0, r1, r2, r3, r4) \</span>
00101 <span class="preprocessor">       {           \</span>
00102 <span class="preprocessor">    r0 = ~r0;      \</span>
00103 <span class="preprocessor">    r2 = ~r2;      \</span>
00104 <span class="preprocessor">    r4 = r0;   \</span>
00105 <span class="preprocessor">    r0 &amp;= r1;   \</span>
00106 <span class="preprocessor">    r2 ^= r0;   \</span>
00107 <span class="preprocessor">    r0 |= r3;   \</span>
00108 <span class="preprocessor">    r3 ^= r2;   \</span>
00109 <span class="preprocessor">    r1 ^= r0;   \</span>
00110 <span class="preprocessor">    r0 ^= r4;   \</span>
00111 <span class="preprocessor">    r4 |= r1;   \</span>
00112 <span class="preprocessor">    r1 ^= r3;   \</span>
00113 <span class="preprocessor">    r2 |= r0;   \</span>
00114 <span class="preprocessor">    r2 &amp;= r4;   \</span>
00115 <span class="preprocessor">    r0 ^= r1;   \</span>
00116 <span class="preprocessor">    r1 &amp;= r2;   \</span>
00117 <span class="preprocessor">    r1 ^= r0;   \</span>
00118 <span class="preprocessor">    r0 &amp;= r2;   \</span>
00119 <span class="preprocessor">    r0 ^= r4;   \</span>
00120 <span class="preprocessor">            }</span>
00121 <span class="preprocessor"></span>
00122 <span class="preprocessor">#define I1(i, r0, r1, r2, r3, r4) \</span>
00123 <span class="preprocessor">       {           \</span>
00124 <span class="preprocessor">    r4 = r1;   \</span>
00125 <span class="preprocessor">    r1 ^= r3;   \</span>
00126 <span class="preprocessor">    r3 &amp;= r1;   \</span>
00127 <span class="preprocessor">    r4 ^= r2;   \</span>
00128 <span class="preprocessor">    r3 ^= r0;   \</span>
00129 <span class="preprocessor">    r0 |= r1;   \</span>
00130 <span class="preprocessor">    r2 ^= r3;   \</span>
00131 <span class="preprocessor">    r0 ^= r4;   \</span>
00132 <span class="preprocessor">    r0 |= r2;   \</span>
00133 <span class="preprocessor">    r1 ^= r3;   \</span>
00134 <span class="preprocessor">    r0 ^= r1;   \</span>
00135 <span class="preprocessor">    r1 |= r3;   \</span>
00136 <span class="preprocessor">    r1 ^= r0;   \</span>
00137 <span class="preprocessor">    r4 = ~r4;      \</span>
00138 <span class="preprocessor">    r4 ^= r1;   \</span>
00139 <span class="preprocessor">    r1 |= r0;   \</span>
00140 <span class="preprocessor">    r1 ^= r0;   \</span>
00141 <span class="preprocessor">    r1 |= r4;   \</span>
00142 <span class="preprocessor">    r3 ^= r1;   \</span>
00143 <span class="preprocessor">            }</span>
00144 <span class="preprocessor"></span>
00145 <span class="preprocessor">#define S2(i, r0, r1, r2, r3, r4) \</span>
00146 <span class="preprocessor">       {           \</span>
00147 <span class="preprocessor">    r4 = r0;   \</span>
00148 <span class="preprocessor">    r0 &amp;= r2;   \</span>
00149 <span class="preprocessor">    r0 ^= r3;   \</span>
00150 <span class="preprocessor">    r2 ^= r1;   \</span>
00151 <span class="preprocessor">    r2 ^= r0;   \</span>
00152 <span class="preprocessor">    r3 |= r4;   \</span>
00153 <span class="preprocessor">    r3 ^= r1;   \</span>
00154 <span class="preprocessor">    r4 ^= r2;   \</span>
00155 <span class="preprocessor">    r1 = r3;   \</span>
00156 <span class="preprocessor">    r3 |= r4;   \</span>
00157 <span class="preprocessor">    r3 ^= r0;   \</span>
00158 <span class="preprocessor">    r0 &amp;= r1;   \</span>
00159 <span class="preprocessor">    r4 ^= r0;   \</span>
00160 <span class="preprocessor">    r1 ^= r3;   \</span>
00161 <span class="preprocessor">    r1 ^= r4;   \</span>
00162 <span class="preprocessor">    r4 = ~r4;      \</span>
00163 <span class="preprocessor">            }</span>
00164 <span class="preprocessor"></span>
00165 <span class="preprocessor">#define I2(i, r0, r1, r2, r3, r4) \</span>
00166 <span class="preprocessor">       {           \</span>
00167 <span class="preprocessor">    r2 ^= r3;   \</span>
00168 <span class="preprocessor">    r3 ^= r0;   \</span>
00169 <span class="preprocessor">    r4 = r3;   \</span>
00170 <span class="preprocessor">    r3 &amp;= r2;   \</span>
00171 <span class="preprocessor">    r3 ^= r1;   \</span>
00172 <span class="preprocessor">    r1 |= r2;   \</span>
00173 <span class="preprocessor">    r1 ^= r4;   \</span>
00174 <span class="preprocessor">    r4 &amp;= r3;   \</span>
00175 <span class="preprocessor">    r2 ^= r3;   \</span>
00176 <span class="preprocessor">    r4 &amp;= r0;   \</span>
00177 <span class="preprocessor">    r4 ^= r2;   \</span>
00178 <span class="preprocessor">    r2 &amp;= r1;   \</span>
00179 <span class="preprocessor">    r2 |= r0;   \</span>
00180 <span class="preprocessor">    r3 = ~r3;      \</span>
00181 <span class="preprocessor">    r2 ^= r3;   \</span>
00182 <span class="preprocessor">    r0 ^= r3;   \</span>
00183 <span class="preprocessor">    r0 &amp;= r1;   \</span>
00184 <span class="preprocessor">    r3 ^= r4;   \</span>
00185 <span class="preprocessor">    r3 ^= r0;   \</span>
00186 <span class="preprocessor">            }</span>
00187 <span class="preprocessor"></span>
00188 <span class="preprocessor">#define S3(i, r0, r1, r2, r3, r4) \</span>
00189 <span class="preprocessor">       {           \</span>
00190 <span class="preprocessor">    r4 = r0;   \</span>
00191 <span class="preprocessor">    r0 |= r3;   \</span>
00192 <span class="preprocessor">    r3 ^= r1;   \</span>
00193 <span class="preprocessor">    r1 &amp;= r4;   \</span>
00194 <span class="preprocessor">    r4 ^= r2;   \</span>
00195 <span class="preprocessor">    r2 ^= r3;   \</span>
00196 <span class="preprocessor">    r3 &amp;= r0;   \</span>
00197 <span class="preprocessor">    r4 |= r1;   \</span>
00198 <span class="preprocessor">    r3 ^= r4;   \</span>
00199 <span class="preprocessor">    r0 ^= r1;   \</span>
00200 <span class="preprocessor">    r4 &amp;= r0;   \</span>
00201 <span class="preprocessor">    r1 ^= r3;   \</span>
00202 <span class="preprocessor">    r4 ^= r2;   \</span>
00203 <span class="preprocessor">    r1 |= r0;   \</span>
00204 <span class="preprocessor">    r1 ^= r2;   \</span>
00205 <span class="preprocessor">    r0 ^= r3;   \</span>
00206 <span class="preprocessor">    r2 = r1;   \</span>
00207 <span class="preprocessor">    r1 |= r3;   \</span>
00208 <span class="preprocessor">    r1 ^= r0;   \</span>
00209 <span class="preprocessor">            }</span>
00210 <span class="preprocessor"></span>
00211 <span class="preprocessor">#define I3(i, r0, r1, r2, r3, r4) \</span>
00212 <span class="preprocessor">       {           \</span>
00213 <span class="preprocessor">    r4 = r2;   \</span>
00214 <span class="preprocessor">    r2 ^= r1;   \</span>
00215 <span class="preprocessor">    r1 &amp;= r2;   \</span>
00216 <span class="preprocessor">    r1 ^= r0;   \</span>
00217 <span class="preprocessor">    r0 &amp;= r4;   \</span>
00218 <span class="preprocessor">    r4 ^= r3;   \</span>
00219 <span class="preprocessor">    r3 |= r1;   \</span>
00220 <span class="preprocessor">    r3 ^= r2;   \</span>
00221 <span class="preprocessor">    r0 ^= r4;   \</span>
00222 <span class="preprocessor">    r2 ^= r0;   \</span>
00223 <span class="preprocessor">    r0 |= r3;   \</span>
00224 <span class="preprocessor">    r0 ^= r1;   \</span>
00225 <span class="preprocessor">    r4 ^= r2;   \</span>
00226 <span class="preprocessor">    r2 &amp;= r3;   \</span>
00227 <span class="preprocessor">    r1 |= r3;   \</span>
00228 <span class="preprocessor">    r1 ^= r2;   \</span>
00229 <span class="preprocessor">    r4 ^= r0;   \</span>
00230 <span class="preprocessor">    r2 ^= r4;   \</span>
00231 <span class="preprocessor">            }</span>
00232 <span class="preprocessor"></span>
00233 <span class="preprocessor">#define S4(i, r0, r1, r2, r3, r4) \</span>
00234 <span class="preprocessor">       {           \</span>
00235 <span class="preprocessor">    r1 ^= r3;   \</span>
00236 <span class="preprocessor">    r3 = ~r3;      \</span>
00237 <span class="preprocessor">    r2 ^= r3;   \</span>
00238 <span class="preprocessor">    r3 ^= r0;   \</span>
00239 <span class="preprocessor">    r4 = r1;   \</span>
00240 <span class="preprocessor">    r1 &amp;= r3;   \</span>
00241 <span class="preprocessor">    r1 ^= r2;   \</span>
00242 <span class="preprocessor">    r4 ^= r3;   \</span>
00243 <span class="preprocessor">    r0 ^= r4;   \</span>
00244 <span class="preprocessor">    r2 &amp;= r4;   \</span>
00245 <span class="preprocessor">    r2 ^= r0;   \</span>
00246 <span class="preprocessor">    r0 &amp;= r1;   \</span>
00247 <span class="preprocessor">    r3 ^= r0;   \</span>
00248 <span class="preprocessor">    r4 |= r1;   \</span>
00249 <span class="preprocessor">    r4 ^= r0;   \</span>
00250 <span class="preprocessor">    r0 |= r3;   \</span>
00251 <span class="preprocessor">    r0 ^= r2;   \</span>
00252 <span class="preprocessor">    r2 &amp;= r3;   \</span>
00253 <span class="preprocessor">    r0 = ~r0;      \</span>
00254 <span class="preprocessor">    r4 ^= r2;   \</span>
00255 <span class="preprocessor">            }</span>
00256 <span class="preprocessor"></span>
00257 <span class="preprocessor">#define I4(i, r0, r1, r2, r3, r4) \</span>
00258 <span class="preprocessor">       {           \</span>
00259 <span class="preprocessor">    r4 = r2;   \</span>
00260 <span class="preprocessor">    r2 &amp;= r3;   \</span>
00261 <span class="preprocessor">    r2 ^= r1;   \</span>
00262 <span class="preprocessor">    r1 |= r3;   \</span>
00263 <span class="preprocessor">    r1 &amp;= r0;   \</span>
00264 <span class="preprocessor">    r4 ^= r2;   \</span>
00265 <span class="preprocessor">    r4 ^= r1;   \</span>
00266 <span class="preprocessor">    r1 &amp;= r2;   \</span>
00267 <span class="preprocessor">    r0 = ~r0;      \</span>
00268 <span class="preprocessor">    r3 ^= r4;   \</span>
00269 <span class="preprocessor">    r1 ^= r3;   \</span>
00270 <span class="preprocessor">    r3 &amp;= r0;   \</span>
00271 <span class="preprocessor">    r3 ^= r2;   \</span>
00272 <span class="preprocessor">    r0 ^= r1;   \</span>
00273 <span class="preprocessor">    r2 &amp;= r0;   \</span>
00274 <span class="preprocessor">    r3 ^= r0;   \</span>
00275 <span class="preprocessor">    r2 ^= r4;   \</span>
00276 <span class="preprocessor">    r2 |= r3;   \</span>
00277 <span class="preprocessor">    r3 ^= r0;   \</span>
00278 <span class="preprocessor">    r2 ^= r1;   \</span>
00279 <span class="preprocessor">            }</span>
00280 <span class="preprocessor"></span>
00281 <span class="preprocessor">#define S5(i, r0, r1, r2, r3, r4) \</span>
00282 <span class="preprocessor">       {           \</span>
00283 <span class="preprocessor">    r0 ^= r1;   \</span>
00284 <span class="preprocessor">    r1 ^= r3;   \</span>
00285 <span class="preprocessor">    r3 = ~r3;      \</span>
00286 <span class="preprocessor">    r4 = r1;   \</span>
00287 <span class="preprocessor">    r1 &amp;= r0;   \</span>
00288 <span class="preprocessor">    r2 ^= r3;   \</span>
00289 <span class="preprocessor">    r1 ^= r2;   \</span>
00290 <span class="preprocessor">    r2 |= r4;   \</span>
00291 <span class="preprocessor">    r4 ^= r3;   \</span>
00292 <span class="preprocessor">    r3 &amp;= r1;   \</span>
00293 <span class="preprocessor">    r3 ^= r0;   \</span>
00294 <span class="preprocessor">    r4 ^= r1;   \</span>
00295 <span class="preprocessor">    r4 ^= r2;   \</span>
00296 <span class="preprocessor">    r2 ^= r0;   \</span>
00297 <span class="preprocessor">    r0 &amp;= r3;   \</span>
00298 <span class="preprocessor">    r2 = ~r2;      \</span>
00299 <span class="preprocessor">    r0 ^= r4;   \</span>
00300 <span class="preprocessor">    r4 |= r3;   \</span>
00301 <span class="preprocessor">    r2 ^= r4;   \</span>
00302 <span class="preprocessor">            }</span>
00303 <span class="preprocessor"></span>
00304 <span class="preprocessor">#define I5(i, r0, r1, r2, r3, r4) \</span>
00305 <span class="preprocessor">       {           \</span>
00306 <span class="preprocessor">    r1 = ~r1;      \</span>
00307 <span class="preprocessor">    r4 = r3;   \</span>
00308 <span class="preprocessor">    r2 ^= r1;   \</span>
00309 <span class="preprocessor">    r3 |= r0;   \</span>
00310 <span class="preprocessor">    r3 ^= r2;   \</span>
00311 <span class="preprocessor">    r2 |= r1;   \</span>
00312 <span class="preprocessor">    r2 &amp;= r0;   \</span>
00313 <span class="preprocessor">    r4 ^= r3;   \</span>
00314 <span class="preprocessor">    r2 ^= r4;   \</span>
00315 <span class="preprocessor">    r4 |= r0;   \</span>
00316 <span class="preprocessor">    r4 ^= r1;   \</span>
00317 <span class="preprocessor">    r1 &amp;= r2;   \</span>
00318 <span class="preprocessor">    r1 ^= r3;   \</span>
00319 <span class="preprocessor">    r4 ^= r2;   \</span>
00320 <span class="preprocessor">    r3 &amp;= r4;   \</span>
00321 <span class="preprocessor">    r4 ^= r1;   \</span>
00322 <span class="preprocessor">    r3 ^= r0;   \</span>
00323 <span class="preprocessor">    r3 ^= r4;   \</span>
00324 <span class="preprocessor">    r4 = ~r4;      \</span>
00325 <span class="preprocessor">            }</span>
00326 <span class="preprocessor"></span>
00327 <span class="preprocessor">#define S6(i, r0, r1, r2, r3, r4) \</span>
00328 <span class="preprocessor">       {           \</span>
00329 <span class="preprocessor">    r2 = ~r2;      \</span>
00330 <span class="preprocessor">    r4 = r3;   \</span>
00331 <span class="preprocessor">    r3 &amp;= r0;   \</span>
00332 <span class="preprocessor">    r0 ^= r4;   \</span>
00333 <span class="preprocessor">    r3 ^= r2;   \</span>
00334 <span class="preprocessor">    r2 |= r4;   \</span>
00335 <span class="preprocessor">    r1 ^= r3;   \</span>
00336 <span class="preprocessor">    r2 ^= r0;   \</span>
00337 <span class="preprocessor">    r0 |= r1;   \</span>
00338 <span class="preprocessor">    r2 ^= r1;   \</span>
00339 <span class="preprocessor">    r4 ^= r0;   \</span>
00340 <span class="preprocessor">    r0 |= r3;   \</span>
00341 <span class="preprocessor">    r0 ^= r2;   \</span>
00342 <span class="preprocessor">    r4 ^= r3;   \</span>
00343 <span class="preprocessor">    r4 ^= r0;   \</span>
00344 <span class="preprocessor">    r3 = ~r3;      \</span>
00345 <span class="preprocessor">    r2 &amp;= r4;   \</span>
00346 <span class="preprocessor">    r2 ^= r3;   \</span>
00347 <span class="preprocessor">            }</span>
00348 <span class="preprocessor"></span>
00349 <span class="preprocessor">#define I6(i, r0, r1, r2, r3, r4) \</span>
00350 <span class="preprocessor">       {           \</span>
00351 <span class="preprocessor">    r0 ^= r2;   \</span>
00352 <span class="preprocessor">    r4 = r2;   \</span>
00353 <span class="preprocessor">    r2 &amp;= r0;   \</span>
00354 <span class="preprocessor">    r4 ^= r3;   \</span>
00355 <span class="preprocessor">    r2 = ~r2;      \</span>
00356 <span class="preprocessor">    r3 ^= r1;   \</span>
00357 <span class="preprocessor">    r2 ^= r3;   \</span>
00358 <span class="preprocessor">    r4 |= r0;   \</span>
00359 <span class="preprocessor">    r0 ^= r2;   \</span>
00360 <span class="preprocessor">    r3 ^= r4;   \</span>
00361 <span class="preprocessor">    r4 ^= r1;   \</span>
00362 <span class="preprocessor">    r1 &amp;= r3;   \</span>
00363 <span class="preprocessor">    r1 ^= r0;   \</span>
00364 <span class="preprocessor">    r0 ^= r3;   \</span>
00365 <span class="preprocessor">    r0 |= r2;   \</span>
00366 <span class="preprocessor">    r3 ^= r1;   \</span>
00367 <span class="preprocessor">    r4 ^= r0;   \</span>
00368 <span class="preprocessor">            }</span>
00369 <span class="preprocessor"></span>
00370 <span class="preprocessor">#define S7(i, r0, r1, r2, r3, r4) \</span>
00371 <span class="preprocessor">       {           \</span>
00372 <span class="preprocessor">    r4 = r2;   \</span>
00373 <span class="preprocessor">    r2 &amp;= r1;   \</span>
00374 <span class="preprocessor">    r2 ^= r3;   \</span>
00375 <span class="preprocessor">    r3 &amp;= r1;   \</span>
00376 <span class="preprocessor">    r4 ^= r2;   \</span>
00377 <span class="preprocessor">    r2 ^= r1;   \</span>
00378 <span class="preprocessor">    r1 ^= r0;   \</span>
00379 <span class="preprocessor">    r0 |= r4;   \</span>
00380 <span class="preprocessor">    r0 ^= r2;   \</span>
00381 <span class="preprocessor">    r3 ^= r1;   \</span>
00382 <span class="preprocessor">    r2 ^= r3;   \</span>
00383 <span class="preprocessor">    r3 &amp;= r0;   \</span>
00384 <span class="preprocessor">    r3 ^= r4;   \</span>
00385 <span class="preprocessor">    r4 ^= r2;   \</span>
00386 <span class="preprocessor">    r2 &amp;= r0;   \</span>
00387 <span class="preprocessor">    r4 = ~r4;      \</span>
00388 <span class="preprocessor">    r2 ^= r4;   \</span>
00389 <span class="preprocessor">    r4 &amp;= r0;   \</span>
00390 <span class="preprocessor">    r1 ^= r3;   \</span>
00391 <span class="preprocessor">    r4 ^= r1;   \</span>
00392 <span class="preprocessor">            }</span>
00393 <span class="preprocessor"></span>
00394 <span class="preprocessor">#define I7(i, r0, r1, r2, r3, r4) \</span>
00395 <span class="preprocessor">       {           \</span>
00396 <span class="preprocessor">    r4 = r2;   \</span>
00397 <span class="preprocessor">    r2 ^= r0;   \</span>
00398 <span class="preprocessor">    r0 &amp;= r3;   \</span>
00399 <span class="preprocessor">    r2 = ~r2;      \</span>
00400 <span class="preprocessor">    r4 |= r3;   \</span>
00401 <span class="preprocessor">    r3 ^= r1;   \</span>
00402 <span class="preprocessor">    r1 |= r0;   \</span>
00403 <span class="preprocessor">    r0 ^= r2;   \</span>
00404 <span class="preprocessor">    r2 &amp;= r4;   \</span>
00405 <span class="preprocessor">    r1 ^= r2;   \</span>
00406 <span class="preprocessor">    r2 ^= r0;   \</span>
00407 <span class="preprocessor">    r0 |= r2;   \</span>
00408 <span class="preprocessor">    r3 &amp;= r4;   \</span>
00409 <span class="preprocessor">    r0 ^= r3;   \</span>
00410 <span class="preprocessor">    r4 ^= r1;   \</span>
00411 <span class="preprocessor">    r3 ^= r4;   \</span>
00412 <span class="preprocessor">    r4 |= r0;   \</span>
00413 <span class="preprocessor">    r3 ^= r2;   \</span>
00414 <span class="preprocessor">    r4 ^= r2;   \</span>
00415 <span class="preprocessor">            }</span>
00416 <span class="preprocessor"></span>
00417 <span class="comment">// key xor</span>
00418 <span class="preprocessor">#define KX(r, a, b, c, d, e)    {\</span>
00419 <span class="preprocessor">        a ^= k[4 * r + 0]; \</span>
00420 <span class="preprocessor">        b ^= k[4 * r + 1]; \</span>
00421 <span class="preprocessor">        c ^= k[4 * r + 2]; \</span>
00422 <span class="preprocessor">        d ^= k[4 * r + 3];}</span>
00423 <span class="preprocessor"></span>
00424 <span class="keywordtype">void</span> Serpent::Base::UncheckedSetKey(CipherDir direction, <span class="keyword">const</span> byte *userKey, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> keylen)
00425 {
00426         AssertValidKeyLength(keylen);
00427 
00428         word32 *k = m_key;
00429         GetUserKey(LITTLE_ENDIAN_ORDER, k, 8, userKey, keylen);
00430 
00431         <span class="keywordflow">if</span> (keylen &lt; 32)
00432                 k[keylen/4] |= word32(1) &lt;&lt; ((keylen%4)*8);
00433 
00434         k += 8;
00435         word32 t = k[-1];
00436         <span class="keywordtype">signed</span> <span class="keywordtype">int</span> i;
00437         <span class="keywordflow">for</span> (i = 0; i &lt; 132; ++i)
00438                 k[i] = t = rotlFixed(k[i-8] ^ k[i-5] ^ k[i-3] ^ t ^ 0x9e3779b9 ^ i, 11);
00439         k -= 20;
00440 
00441 <span class="preprocessor">#define LK(r, a, b, c, d, e)    {\</span>
00442 <span class="preprocessor">        a = k[(8-r)*4 + 0];             \</span>
00443 <span class="preprocessor">        b = k[(8-r)*4 + 1];             \</span>
00444 <span class="preprocessor">        c = k[(8-r)*4 + 2];             \</span>
00445 <span class="preprocessor">        d = k[(8-r)*4 + 3];}</span>
00446 <span class="preprocessor"></span>
00447 <span class="preprocessor">#define SK(r, a, b, c, d, e)    {\</span>
00448 <span class="preprocessor">        k[(8-r)*4 + 4] = a;             \</span>
00449 <span class="preprocessor">        k[(8-r)*4 + 5] = b;             \</span>
00450 <span class="preprocessor">        k[(8-r)*4 + 6] = c;             \</span>
00451 <span class="preprocessor">        k[(8-r)*4 + 7] = d;}    \</span>
00452 <span class="preprocessor"></span>
00453 <span class="preprocessor"></span>        word32 a,b,c,d,e;
00454         <span class="keywordflow">for</span> (i=0; i&lt;4; i++)
00455         {
00456                 afterS2(LK); afterS2(S3); afterS3(SK);
00457                 afterS1(LK); afterS1(S2); afterS2(SK);
00458                 afterS0(LK); afterS0(S1); afterS1(SK);
00459                 beforeS0(LK); beforeS0(S0); afterS0(SK);
00460                 k += 8*4;
00461                 afterS6(LK); afterS6(S7); afterS7(SK);
00462                 afterS5(LK); afterS5(S6); afterS6(SK);
00463                 afterS4(LK); afterS4(S5); afterS5(SK);
00464                 afterS3(LK); afterS3(S4); afterS4(SK);
00465         }
00466         afterS2(LK); afterS2(S3); afterS3(SK);
00467 }
00468 
00469 <span class="keyword">typedef</span> BlockGetAndPut&lt;word32, LittleEndian&gt; Block;
00470 
00471 <span class="keywordtype">void</span> Serpent::Enc::ProcessAndXorBlock(<span class="keyword">const</span> byte *inBlock, <span class="keyword">const</span> byte *xorBlock, byte *outBlock)<span class="keyword"> const</span>
00472 <span class="keyword"></span>{
00473         word32 a, b, c, d, e;
00474         
00475         Block::Get(inBlock)(a)(b)(c)(d);
00476 
00477         <span class="keyword">const</span> word32 *k = m_key + 8;
00478         <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i=1;
00479 
00480         <span class="keywordflow">do</span>
00481         {
00482                 beforeS0(KX); beforeS0(S0); afterS0(LT);
00483                 afterS0(KX); afterS0(S1); afterS1(LT);
00484                 afterS1(KX); afterS1(S2); afterS2(LT);
00485                 afterS2(KX); afterS2(S3); afterS3(LT);
00486                 afterS3(KX); afterS3(S4); afterS4(LT);
00487                 afterS4(KX); afterS4(S5); afterS5(LT);
00488                 afterS5(KX); afterS5(S6); afterS6(LT);
00489                 afterS6(KX); afterS6(S7);
00490 
00491                 <span class="keywordflow">if</span> (i == 4)
00492                         <span class="keywordflow">break</span>;
00493 
00494                 ++i;
00495                 c = b;
00496                 b = e;
00497                 e = d;
00498                 d = a;
00499                 a = e;
00500                 k += 32;
00501                 beforeS0(LT);
00502         }
00503         <span class="keywordflow">while</span> (<span class="keyword">true</span>);
00504 
00505         afterS7(KX);
00506         
00507         Block::Put(xorBlock, outBlock)(d)(e)(b)(a);
00508 }
00509 
00510 <span class="keywordtype">void</span> Serpent::Dec::ProcessAndXorBlock(<span class="keyword">const</span> byte *inBlock, <span class="keyword">const</span> byte *xorBlock, byte *outBlock)<span class="keyword"> const</span>
00511 <span class="keyword"></span>{
00512         word32 a, b, c, d, e;
00513         
00514         Block::Get(inBlock)(a)(b)(c)(d);
00515 
00516         <span class="keyword">const</span> word32 *k = m_key + 104;
00517         <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i=4;
00518 
00519         beforeI7(KX);
00520         <span class="keywordflow">goto</span> start;
00521 
00522         <span class="keywordflow">do</span>
00523         {
00524                 c = b;
00525                 b = d;
00526                 d = e;
00527                 k -= 32;
00528                 beforeI7(ILT);
00529 start:
00530                             beforeI7(I7); afterI7(KX); 
00531                 afterI7(ILT); afterI7(I6); afterI6(KX); 
00532                 afterI6(ILT); afterI6(I5); afterI5(KX); 
00533                 afterI5(ILT); afterI5(I4); afterI4(KX); 
00534                 afterI4(ILT); afterI4(I3); afterI3(KX); 
00535                 afterI3(ILT); afterI3(I2); afterI2(KX); 
00536                 afterI2(ILT); afterI2(I1); afterI1(KX); 
00537                 afterI1(ILT); afterI1(I0); afterI0(KX);
00538         }
00539         <span class="keywordflow">while</span> (--i != 0);
00540         
00541         Block::Put(xorBlock, outBlock)(a)(d)(b)(e);
00542 }
00543 
00544 NAMESPACE_END
</div></pre><hr size="1"><address style="align: right;"><small>Generated on Sun Nov 7 08:23:59 2004 for Crypto++ by
<a href="http://www.doxygen.org/index.html">
<img src="doxygen.png" alt="doxygen" align="middle" border=0 ></a> 1.3.7 </small></address>
</body>
</html>