<!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 Page</a> | <a class="qindex" href="namespaces.html">Namespace List</a> | <a class="qindex" href="hierarchy.html">Class Hierarchy</a> | <a class="qindex" href="classes.html">Alphabetical List</a> | <a class="qindex" href="annotated.html">Class List</a> | <a class="qindex" href="files.html">File List</a> | <a class="qindex" href="namespacemembers.html">Namespace Members</a> | <a class="qindex" href="functions.html">Class Members</a> | <a class="qindex" href="globals.html">File 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 << 3), 7); \ 00014 b = rotlFixed(b ^ a ^ c, 1); \ 00015 a = rotlFixed(a ^ b ^ d, 5); \ 00016 c = rotlFixed(c ^ d ^ (b << 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 << 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 << 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 &= 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 &= 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 &= 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 &= 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 &= r4; \</span> 00115 <span class="preprocessor"> r0 ^= r1; \</span> 00116 <span class="preprocessor"> r1 &= r2; \</span> 00117 <span class="preprocessor"> r1 ^= r0; \</span> 00118 <span class="preprocessor"> r0 &= 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 &= 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 &= 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 &= 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 &= 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 &= r3; \</span> 00175 <span class="preprocessor"> r2 ^= r3; \</span> 00176 <span class="preprocessor"> r4 &= r0; \</span> 00177 <span class="preprocessor"> r4 ^= r2; \</span> 00178 <span class="preprocessor"> r2 &= 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 &= 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 &= r4; \</span> 00194 <span class="preprocessor"> r4 ^= r2; \</span> 00195 <span class="preprocessor"> r2 ^= r3; \</span> 00196 <span class="preprocessor"> r3 &= 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 &= 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 &= r2; \</span> 00216 <span class="preprocessor"> r1 ^= r0; \</span> 00217 <span class="preprocessor"> r0 &= 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 &= 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 &= 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 &= r4; \</span> 00245 <span class="preprocessor"> r2 ^= r0; \</span> 00246 <span class="preprocessor"> r0 &= 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 &= 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 &= r3; \</span> 00261 <span class="preprocessor"> r2 ^= r1; \</span> 00262 <span class="preprocessor"> r1 |= r3; \</span> 00263 <span class="preprocessor"> r1 &= r0; \</span> 00264 <span class="preprocessor"> r4 ^= r2; \</span> 00265 <span class="preprocessor"> r4 ^= r1; \</span> 00266 <span class="preprocessor"> r1 &= 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 &= r0; \</span> 00271 <span class="preprocessor"> r3 ^= r2; \</span> 00272 <span class="preprocessor"> r0 ^= r1; \</span> 00273 <span class="preprocessor"> r2 &= 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 &= 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 &= 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 &= 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 &= 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 &= r2; \</span> 00318 <span class="preprocessor"> r1 ^= r3; \</span> 00319 <span class="preprocessor"> r4 ^= r2; \</span> 00320 <span class="preprocessor"> r3 &= 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 &= 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 &= 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 &= 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 &= 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 &= r1; \</span> 00374 <span class="preprocessor"> r2 ^= r3; \</span> 00375 <span class="preprocessor"> r3 &= 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 &= r0; \</span> 00384 <span class="preprocessor"> r3 ^= r4; \</span> 00385 <span class="preprocessor"> r4 ^= r2; \</span> 00386 <span class="preprocessor"> r2 &= r0; \</span> 00387 <span class="preprocessor"> r4 = ~r4; \</span> 00388 <span class="preprocessor"> r2 ^= r4; \</span> 00389 <span class="preprocessor"> r4 &= 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 &= 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 &= 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 &= 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 < 32) 00432 k[keylen/4] |= word32(1) << ((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 < 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<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<word32, LittleEndian> 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>