3 * Copyright (C) 1998 Ross Anderson, Eli Biham, Lars Knudsen
5 * For more information see http://www.cl.cam.ac.uk/users/rja14/serpent.html
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2, or (at your option)
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software Foundation,
19 * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
27 #include "serpentsboxes.h"
29 #ifdef SERPENT_BIGENDIAN
31 #define GETPUT_CP(bytenum) \
32 (((basep) + (lenbytes) - (offset) - 4)[(bytenum)])
34 #define SERPENT_DECORATE(func) serpentbe_##func
36 #else /* !defined(SERPENT_BIGENDIAN) */
38 #define GETPUT_CP(bytenum) \
39 (((basep) + (offset))[3-(bytenum)])
41 #define SERPENT_DECORATE(func) serpent_##func
43 #endif /* !defined(SERPENT_BIGENDIAN) */
49 static void SERP_DEBUG(const char *str1
,
50 const void *ary
, int sz
,
53 fprintf(stderr
,"%s",str1
);
54 hexdebug(stderr
,ary
,sz
);
55 fprintf(stderr
,"%s",str2
);
60 #define SERP_DEBUG(str1,aryv,sz,str2) /*empty*/
65 static uint32_t serpent_get_32bit(const uint8_t *basep
,
66 int lenbytes
, int offset
)
68 return (((uint32_t)GETPUT_CP(0) << 24) |
69 ((uint32_t)GETPUT_CP(1) << 16) |
70 ((uint32_t)GETPUT_CP(2) << +8) |
71 ((uint32_t)GETPUT_CP(3)));
74 static void serpent_put_32bit(uint8_t *basep
, int lenbytes
, int offset
, uint32_t value
)
76 GETPUT_CP(0) = (char)((value
) >> 24);
77 GETPUT_CP(1) = (char)((value
) >> 16);
78 GETPUT_CP(2) = (char)((value
) >> 8);
79 GETPUT_CP(3) = (char)(value
);
82 void SERPENT_DECORATE(makekey
)(struct keyInstance
*key
, int keyLen
,
83 const uint8_t *keyMaterial
)
87 uint32_t w
[132],k
[132];
89 SERP_DEBUG("SERPENT makekey ",keyMaterial
,keyLen
/8,"\n");
91 for(i
=0; i
<keyLen
/32; i
++)
92 w
[i
]=serpent_get_32bit(keyMaterial
, keyLen
/8, i
*4);
94 w
[i
]=(serpent_get_32bit(keyMaterial
, keyLen
/8, i
*4)
95 & ((1L<<((keyLen
&31)))-1)) | (1L<<((keyLen
&31)));
99 w
[i
]=ROL(w
[i
-8]^w
[i
-5]^w
[i
-3]^w
[i
-1]^PHI
^(i
-8),11);
103 w
[i
]=ROL(w
[i
-8]^w
[i
-5]^w
[i
-3]^w
[i
-1]^PHI
^i
,11);
105 RND03(w
[ 0], w
[ 1], w
[ 2], w
[ 3], k
[ 0], k
[ 1], k
[ 2], k
[ 3]);
106 RND02(w
[ 4], w
[ 5], w
[ 6], w
[ 7], k
[ 4], k
[ 5], k
[ 6], k
[ 7]);
107 RND01(w
[ 8], w
[ 9], w
[ 10], w
[ 11], k
[ 8], k
[ 9], k
[ 10], k
[ 11]);
108 RND00(w
[ 12], w
[ 13], w
[ 14], w
[ 15], k
[ 12], k
[ 13], k
[ 14], k
[ 15]);
109 RND31(w
[ 16], w
[ 17], w
[ 18], w
[ 19], k
[ 16], k
[ 17], k
[ 18], k
[ 19]);
110 RND30(w
[ 20], w
[ 21], w
[ 22], w
[ 23], k
[ 20], k
[ 21], k
[ 22], k
[ 23]);
111 RND29(w
[ 24], w
[ 25], w
[ 26], w
[ 27], k
[ 24], k
[ 25], k
[ 26], k
[ 27]);
112 RND28(w
[ 28], w
[ 29], w
[ 30], w
[ 31], k
[ 28], k
[ 29], k
[ 30], k
[ 31]);
113 RND27(w
[ 32], w
[ 33], w
[ 34], w
[ 35], k
[ 32], k
[ 33], k
[ 34], k
[ 35]);
114 RND26(w
[ 36], w
[ 37], w
[ 38], w
[ 39], k
[ 36], k
[ 37], k
[ 38], k
[ 39]);
115 RND25(w
[ 40], w
[ 41], w
[ 42], w
[ 43], k
[ 40], k
[ 41], k
[ 42], k
[ 43]);
116 RND24(w
[ 44], w
[ 45], w
[ 46], w
[ 47], k
[ 44], k
[ 45], k
[ 46], k
[ 47]);
117 RND23(w
[ 48], w
[ 49], w
[ 50], w
[ 51], k
[ 48], k
[ 49], k
[ 50], k
[ 51]);
118 RND22(w
[ 52], w
[ 53], w
[ 54], w
[ 55], k
[ 52], k
[ 53], k
[ 54], k
[ 55]);
119 RND21(w
[ 56], w
[ 57], w
[ 58], w
[ 59], k
[ 56], k
[ 57], k
[ 58], k
[ 59]);
120 RND20(w
[ 60], w
[ 61], w
[ 62], w
[ 63], k
[ 60], k
[ 61], k
[ 62], k
[ 63]);
121 RND19(w
[ 64], w
[ 65], w
[ 66], w
[ 67], k
[ 64], k
[ 65], k
[ 66], k
[ 67]);
122 RND18(w
[ 68], w
[ 69], w
[ 70], w
[ 71], k
[ 68], k
[ 69], k
[ 70], k
[ 71]);
123 RND17(w
[ 72], w
[ 73], w
[ 74], w
[ 75], k
[ 72], k
[ 73], k
[ 74], k
[ 75]);
124 RND16(w
[ 76], w
[ 77], w
[ 78], w
[ 79], k
[ 76], k
[ 77], k
[ 78], k
[ 79]);
125 RND15(w
[ 80], w
[ 81], w
[ 82], w
[ 83], k
[ 80], k
[ 81], k
[ 82], k
[ 83]);
126 RND14(w
[ 84], w
[ 85], w
[ 86], w
[ 87], k
[ 84], k
[ 85], k
[ 86], k
[ 87]);
127 RND13(w
[ 88], w
[ 89], w
[ 90], w
[ 91], k
[ 88], k
[ 89], k
[ 90], k
[ 91]);
128 RND12(w
[ 92], w
[ 93], w
[ 94], w
[ 95], k
[ 92], k
[ 93], k
[ 94], k
[ 95]);
129 RND11(w
[ 96], w
[ 97], w
[ 98], w
[ 99], k
[ 96], k
[ 97], k
[ 98], k
[ 99]);
130 RND10(w
[100], w
[101], w
[102], w
[103], k
[100], k
[101], k
[102], k
[103]);
131 RND09(w
[104], w
[105], w
[106], w
[107], k
[104], k
[105], k
[106], k
[107]);
132 RND08(w
[108], w
[109], w
[110], w
[111], k
[108], k
[109], k
[110], k
[111]);
133 RND07(w
[112], w
[113], w
[114], w
[115], k
[112], k
[113], k
[114], k
[115]);
134 RND06(w
[116], w
[117], w
[118], w
[119], k
[116], k
[117], k
[118], k
[119]);
135 RND05(w
[120], w
[121], w
[122], w
[123], k
[120], k
[121], k
[122], k
[123]);
136 RND04(w
[124], w
[125], w
[126], w
[127], k
[124], k
[125], k
[126], k
[127]);
137 RND03(w
[128], w
[129], w
[130], w
[131], k
[128], k
[129], k
[130], k
[131]);
141 key
->subkeys
[i
][j
] = k
[4*i
+j
];
144 void SERPENT_DECORATE(encrypt
)(struct keyInstance
*key
,
145 const uint8_t plaintext
[16],
146 uint8_t ciphertext
[16])
148 register uint32_t x0
, x1
, x2
, x3
;
149 register uint32_t y0
, y1
, y2
, y3
;
151 SERP_DEBUG("SERPENT encrypt ",plaintext
,16," ->");
153 x0
=serpent_get_32bit(plaintext
,16,+0);
154 x1
=serpent_get_32bit(plaintext
,16,+4);
155 x2
=serpent_get_32bit(plaintext
,16,+8);
156 x3
=serpent_get_32bit(plaintext
,16,12);
158 /* Start to encrypt the plaintext x */
159 keying(x0
, x1
, x2
, x3
, key
->subkeys
[ 0]);
160 RND00(x0
, x1
, x2
, x3
, y0
, y1
, y2
, y3
);
161 transform(y0
, y1
, y2
, y3
, x0
, x1
, x2
, x3
);
162 keying(x0
, x1
, x2
, x3
, key
->subkeys
[ 1]);
163 RND01(x0
, x1
, x2
, x3
, y0
, y1
, y2
, y3
);
164 transform(y0
, y1
, y2
, y3
, x0
, x1
, x2
, x3
);
165 keying(x0
, x1
, x2
, x3
, key
->subkeys
[ 2]);
166 RND02(x0
, x1
, x2
, x3
, y0
, y1
, y2
, y3
);
167 transform(y0
, y1
, y2
, y3
, x0
, x1
, x2
, x3
);
168 keying(x0
, x1
, x2
, x3
, key
->subkeys
[ 3]);
169 RND03(x0
, x1
, x2
, x3
, y0
, y1
, y2
, y3
);
170 transform(y0
, y1
, y2
, y3
, x0
, x1
, x2
, x3
);
171 keying(x0
, x1
, x2
, x3
, key
->subkeys
[ 4]);
172 RND04(x0
, x1
, x2
, x3
, y0
, y1
, y2
, y3
);
173 transform(y0
, y1
, y2
, y3
, x0
, x1
, x2
, x3
);
174 keying(x0
, x1
, x2
, x3
, key
->subkeys
[ 5]);
175 RND05(x0
, x1
, x2
, x3
, y0
, y1
, y2
, y3
);
176 transform(y0
, y1
, y2
, y3
, x0
, x1
, x2
, x3
);
177 keying(x0
, x1
, x2
, x3
, key
->subkeys
[ 6]);
178 RND06(x0
, x1
, x2
, x3
, y0
, y1
, y2
, y3
);
179 transform(y0
, y1
, y2
, y3
, x0
, x1
, x2
, x3
);
180 keying(x0
, x1
, x2
, x3
, key
->subkeys
[ 7]);
181 RND07(x0
, x1
, x2
, x3
, y0
, y1
, y2
, y3
);
182 transform(y0
, y1
, y2
, y3
, x0
, x1
, x2
, x3
);
183 keying(x0
, x1
, x2
, x3
, key
->subkeys
[ 8]);
184 RND08(x0
, x1
, x2
, x3
, y0
, y1
, y2
, y3
);
185 transform(y0
, y1
, y2
, y3
, x0
, x1
, x2
, x3
);
186 keying(x0
, x1
, x2
, x3
, key
->subkeys
[ 9]);
187 RND09(x0
, x1
, x2
, x3
, y0
, y1
, y2
, y3
);
188 transform(y0
, y1
, y2
, y3
, x0
, x1
, x2
, x3
);
189 keying(x0
, x1
, x2
, x3
, key
->subkeys
[10]);
190 RND10(x0
, x1
, x2
, x3
, y0
, y1
, y2
, y3
);
191 transform(y0
, y1
, y2
, y3
, x0
, x1
, x2
, x3
);
192 keying(x0
, x1
, x2
, x3
, key
->subkeys
[11]);
193 RND11(x0
, x1
, x2
, x3
, y0
, y1
, y2
, y3
);
194 transform(y0
, y1
, y2
, y3
, x0
, x1
, x2
, x3
);
195 keying(x0
, x1
, x2
, x3
, key
->subkeys
[12]);
196 RND12(x0
, x1
, x2
, x3
, y0
, y1
, y2
, y3
);
197 transform(y0
, y1
, y2
, y3
, x0
, x1
, x2
, x3
);
198 keying(x0
, x1
, x2
, x3
, key
->subkeys
[13]);
199 RND13(x0
, x1
, x2
, x3
, y0
, y1
, y2
, y3
);
200 transform(y0
, y1
, y2
, y3
, x0
, x1
, x2
, x3
);
201 keying(x0
, x1
, x2
, x3
, key
->subkeys
[14]);
202 RND14(x0
, x1
, x2
, x3
, y0
, y1
, y2
, y3
);
203 transform(y0
, y1
, y2
, y3
, x0
, x1
, x2
, x3
);
204 keying(x0
, x1
, x2
, x3
, key
->subkeys
[15]);
205 RND15(x0
, x1
, x2
, x3
, y0
, y1
, y2
, y3
);
206 transform(y0
, y1
, y2
, y3
, x0
, x1
, x2
, x3
);
207 keying(x0
, x1
, x2
, x3
, key
->subkeys
[16]);
208 RND16(x0
, x1
, x2
, x3
, y0
, y1
, y2
, y3
);
209 transform(y0
, y1
, y2
, y3
, x0
, x1
, x2
, x3
);
210 keying(x0
, x1
, x2
, x3
, key
->subkeys
[17]);
211 RND17(x0
, x1
, x2
, x3
, y0
, y1
, y2
, y3
);
212 transform(y0
, y1
, y2
, y3
, x0
, x1
, x2
, x3
);
213 keying(x0
, x1
, x2
, x3
, key
->subkeys
[18]);
214 RND18(x0
, x1
, x2
, x3
, y0
, y1
, y2
, y3
);
215 transform(y0
, y1
, y2
, y3
, x0
, x1
, x2
, x3
);
216 keying(x0
, x1
, x2
, x3
, key
->subkeys
[19]);
217 RND19(x0
, x1
, x2
, x3
, y0
, y1
, y2
, y3
);
218 transform(y0
, y1
, y2
, y3
, x0
, x1
, x2
, x3
);
219 keying(x0
, x1
, x2
, x3
, key
->subkeys
[20]);
220 RND20(x0
, x1
, x2
, x3
, y0
, y1
, y2
, y3
);
221 transform(y0
, y1
, y2
, y3
, x0
, x1
, x2
, x3
);
222 keying(x0
, x1
, x2
, x3
, key
->subkeys
[21]);
223 RND21(x0
, x1
, x2
, x3
, y0
, y1
, y2
, y3
);
224 transform(y0
, y1
, y2
, y3
, x0
, x1
, x2
, x3
);
225 keying(x0
, x1
, x2
, x3
, key
->subkeys
[22]);
226 RND22(x0
, x1
, x2
, x3
, y0
, y1
, y2
, y3
);
227 transform(y0
, y1
, y2
, y3
, x0
, x1
, x2
, x3
);
228 keying(x0
, x1
, x2
, x3
, key
->subkeys
[23]);
229 RND23(x0
, x1
, x2
, x3
, y0
, y1
, y2
, y3
);
230 transform(y0
, y1
, y2
, y3
, x0
, x1
, x2
, x3
);
231 keying(x0
, x1
, x2
, x3
, key
->subkeys
[24]);
232 RND24(x0
, x1
, x2
, x3
, y0
, y1
, y2
, y3
);
233 transform(y0
, y1
, y2
, y3
, x0
, x1
, x2
, x3
);
234 keying(x0
, x1
, x2
, x3
, key
->subkeys
[25]);
235 RND25(x0
, x1
, x2
, x3
, y0
, y1
, y2
, y3
);
236 transform(y0
, y1
, y2
, y3
, x0
, x1
, x2
, x3
);
237 keying(x0
, x1
, x2
, x3
, key
->subkeys
[26]);
238 RND26(x0
, x1
, x2
, x3
, y0
, y1
, y2
, y3
);
239 transform(y0
, y1
, y2
, y3
, x0
, x1
, x2
, x3
);
240 keying(x0
, x1
, x2
, x3
, key
->subkeys
[27]);
241 RND27(x0
, x1
, x2
, x3
, y0
, y1
, y2
, y3
);
242 transform(y0
, y1
, y2
, y3
, x0
, x1
, x2
, x3
);
243 keying(x0
, x1
, x2
, x3
, key
->subkeys
[28]);
244 RND28(x0
, x1
, x2
, x3
, y0
, y1
, y2
, y3
);
245 transform(y0
, y1
, y2
, y3
, x0
, x1
, x2
, x3
);
246 keying(x0
, x1
, x2
, x3
, key
->subkeys
[29]);
247 RND29(x0
, x1
, x2
, x3
, y0
, y1
, y2
, y3
);
248 transform(y0
, y1
, y2
, y3
, x0
, x1
, x2
, x3
);
249 keying(x0
, x1
, x2
, x3
, key
->subkeys
[30]);
250 RND30(x0
, x1
, x2
, x3
, y0
, y1
, y2
, y3
);
251 transform(y0
, y1
, y2
, y3
, x0
, x1
, x2
, x3
);
252 keying(x0
, x1
, x2
, x3
, key
->subkeys
[31]);
253 RND31(x0
, x1
, x2
, x3
, y0
, y1
, y2
, y3
);
254 x0
= y0
; x1
= y1
; x2
= y2
; x3
= y3
;
255 keying(x0
, x1
, x2
, x3
, key
->subkeys
[32]);
256 /* The ciphertext is now in x */
258 serpent_put_32bit(ciphertext
,16,+0, x0
);
259 serpent_put_32bit(ciphertext
,16,+4, x1
);
260 serpent_put_32bit(ciphertext
,16,+8, x2
);
261 serpent_put_32bit(ciphertext
,16,12, x3
);
263 SERP_DEBUG(" ",ciphertext
,16,"\n");
266 void SERPENT_DECORATE(decrypt
)(struct keyInstance
*key
,
267 const uint8_t ciphertext
[16],
268 uint8_t plaintext
[16])
270 register uint32_t x0
, x1
, x2
, x3
;
271 register uint32_t y0
, y1
, y2
, y3
;
273 SERP_DEBUG("SERPENT decrypt ",ciphertext
,16," ->");
275 x0
=serpent_get_32bit(ciphertext
,16,+0);
276 x1
=serpent_get_32bit(ciphertext
,16,+4);
277 x2
=serpent_get_32bit(ciphertext
,16,+8);
278 x3
=serpent_get_32bit(ciphertext
,16,12);
280 /* Start to decrypt the ciphertext x */
281 keying(x0
, x1
, x2
, x3
, key
->subkeys
[32]);
282 InvRND31(x0
, x1
, x2
, x3
, y0
, y1
, y2
, y3
);
283 keying(y0
, y1
, y2
, y3
, key
->subkeys
[31]);
284 inv_transform(y0
, y1
, y2
, y3
, x0
, x1
, x2
, x3
);
285 InvRND30(x0
, x1
, x2
, x3
, y0
, y1
, y2
, y3
);
286 keying(y0
, y1
, y2
, y3
, key
->subkeys
[30]);
287 inv_transform(y0
, y1
, y2
, y3
, x0
, x1
, x2
, x3
);
288 InvRND29(x0
, x1
, x2
, x3
, y0
, y1
, y2
, y3
);
289 keying(y0
, y1
, y2
, y3
, key
->subkeys
[29]);
290 inv_transform(y0
, y1
, y2
, y3
, x0
, x1
, x2
, x3
);
291 InvRND28(x0
, x1
, x2
, x3
, y0
, y1
, y2
, y3
);
292 keying(y0
, y1
, y2
, y3
, key
->subkeys
[28]);
293 inv_transform(y0
, y1
, y2
, y3
, x0
, x1
, x2
, x3
);
294 InvRND27(x0
, x1
, x2
, x3
, y0
, y1
, y2
, y3
);
295 keying(y0
, y1
, y2
, y3
, key
->subkeys
[27]);
296 inv_transform(y0
, y1
, y2
, y3
, x0
, x1
, x2
, x3
);
297 InvRND26(x0
, x1
, x2
, x3
, y0
, y1
, y2
, y3
);
298 keying(y0
, y1
, y2
, y3
, key
->subkeys
[26]);
299 inv_transform(y0
, y1
, y2
, y3
, x0
, x1
, x2
, x3
);
300 InvRND25(x0
, x1
, x2
, x3
, y0
, y1
, y2
, y3
);
301 keying(y0
, y1
, y2
, y3
, key
->subkeys
[25]);
302 inv_transform(y0
, y1
, y2
, y3
, x0
, x1
, x2
, x3
);
303 InvRND24(x0
, x1
, x2
, x3
, y0
, y1
, y2
, y3
);
304 keying(y0
, y1
, y2
, y3
, key
->subkeys
[24]);
305 inv_transform(y0
, y1
, y2
, y3
, x0
, x1
, x2
, x3
);
306 InvRND23(x0
, x1
, x2
, x3
, y0
, y1
, y2
, y3
);
307 keying(y0
, y1
, y2
, y3
, key
->subkeys
[23]);
308 inv_transform(y0
, y1
, y2
, y3
, x0
, x1
, x2
, x3
);
309 InvRND22(x0
, x1
, x2
, x3
, y0
, y1
, y2
, y3
);
310 keying(y0
, y1
, y2
, y3
, key
->subkeys
[22]);
311 inv_transform(y0
, y1
, y2
, y3
, x0
, x1
, x2
, x3
);
312 InvRND21(x0
, x1
, x2
, x3
, y0
, y1
, y2
, y3
);
313 keying(y0
, y1
, y2
, y3
, key
->subkeys
[21]);
314 inv_transform(y0
, y1
, y2
, y3
, x0
, x1
, x2
, x3
);
315 InvRND20(x0
, x1
, x2
, x3
, y0
, y1
, y2
, y3
);
316 keying(y0
, y1
, y2
, y3
, key
->subkeys
[20]);
317 inv_transform(y0
, y1
, y2
, y3
, x0
, x1
, x2
, x3
);
318 InvRND19(x0
, x1
, x2
, x3
, y0
, y1
, y2
, y3
);
319 keying(y0
, y1
, y2
, y3
, key
->subkeys
[19]);
320 inv_transform(y0
, y1
, y2
, y3
, x0
, x1
, x2
, x3
);
321 InvRND18(x0
, x1
, x2
, x3
, y0
, y1
, y2
, y3
);
322 keying(y0
, y1
, y2
, y3
, key
->subkeys
[18]);
323 inv_transform(y0
, y1
, y2
, y3
, x0
, x1
, x2
, x3
);
324 InvRND17(x0
, x1
, x2
, x3
, y0
, y1
, y2
, y3
);
325 keying(y0
, y1
, y2
, y3
, key
->subkeys
[17]);
326 inv_transform(y0
, y1
, y2
, y3
, x0
, x1
, x2
, x3
);
327 InvRND16(x0
, x1
, x2
, x3
, y0
, y1
, y2
, y3
);
328 keying(y0
, y1
, y2
, y3
, key
->subkeys
[16]);
329 inv_transform(y0
, y1
, y2
, y3
, x0
, x1
, x2
, x3
);
330 InvRND15(x0
, x1
, x2
, x3
, y0
, y1
, y2
, y3
);
331 keying(y0
, y1
, y2
, y3
, key
->subkeys
[15]);
332 inv_transform(y0
, y1
, y2
, y3
, x0
, x1
, x2
, x3
);
333 InvRND14(x0
, x1
, x2
, x3
, y0
, y1
, y2
, y3
);
334 keying(y0
, y1
, y2
, y3
, key
->subkeys
[14]);
335 inv_transform(y0
, y1
, y2
, y3
, x0
, x1
, x2
, x3
);
336 InvRND13(x0
, x1
, x2
, x3
, y0
, y1
, y2
, y3
);
337 keying(y0
, y1
, y2
, y3
, key
->subkeys
[13]);
338 inv_transform(y0
, y1
, y2
, y3
, x0
, x1
, x2
, x3
);
339 InvRND12(x0
, x1
, x2
, x3
, y0
, y1
, y2
, y3
);
340 keying(y0
, y1
, y2
, y3
, key
->subkeys
[12]);
341 inv_transform(y0
, y1
, y2
, y3
, x0
, x1
, x2
, x3
);
342 InvRND11(x0
, x1
, x2
, x3
, y0
, y1
, y2
, y3
);
343 keying(y0
, y1
, y2
, y3
, key
->subkeys
[11]);
344 inv_transform(y0
, y1
, y2
, y3
, x0
, x1
, x2
, x3
);
345 InvRND10(x0
, x1
, x2
, x3
, y0
, y1
, y2
, y3
);
346 keying(y0
, y1
, y2
, y3
, key
->subkeys
[10]);
347 inv_transform(y0
, y1
, y2
, y3
, x0
, x1
, x2
, x3
);
348 InvRND09(x0
, x1
, x2
, x3
, y0
, y1
, y2
, y3
);
349 keying(y0
, y1
, y2
, y3
, key
->subkeys
[ 9]);
350 inv_transform(y0
, y1
, y2
, y3
, x0
, x1
, x2
, x3
);
351 InvRND08(x0
, x1
, x2
, x3
, y0
, y1
, y2
, y3
);
352 keying(y0
, y1
, y2
, y3
, key
->subkeys
[ 8]);
353 inv_transform(y0
, y1
, y2
, y3
, x0
, x1
, x2
, x3
);
354 InvRND07(x0
, x1
, x2
, x3
, y0
, y1
, y2
, y3
);
355 keying(y0
, y1
, y2
, y3
, key
->subkeys
[ 7]);
356 inv_transform(y0
, y1
, y2
, y3
, x0
, x1
, x2
, x3
);
357 InvRND06(x0
, x1
, x2
, x3
, y0
, y1
, y2
, y3
);
358 keying(y0
, y1
, y2
, y3
, key
->subkeys
[ 6]);
359 inv_transform(y0
, y1
, y2
, y3
, x0
, x1
, x2
, x3
);
360 InvRND05(x0
, x1
, x2
, x3
, y0
, y1
, y2
, y3
);
361 keying(y0
, y1
, y2
, y3
, key
->subkeys
[ 5]);
362 inv_transform(y0
, y1
, y2
, y3
, x0
, x1
, x2
, x3
);
363 InvRND04(x0
, x1
, x2
, x3
, y0
, y1
, y2
, y3
);
364 keying(y0
, y1
, y2
, y3
, key
->subkeys
[ 4]);
365 inv_transform(y0
, y1
, y2
, y3
, x0
, x1
, x2
, x3
);
366 InvRND03(x0
, x1
, x2
, x3
, y0
, y1
, y2
, y3
);
367 keying(y0
, y1
, y2
, y3
, key
->subkeys
[ 3]);
368 inv_transform(y0
, y1
, y2
, y3
, x0
, x1
, x2
, x3
);
369 InvRND02(x0
, x1
, x2
, x3
, y0
, y1
, y2
, y3
);
370 keying(y0
, y1
, y2
, y3
, key
->subkeys
[ 2]);
371 inv_transform(y0
, y1
, y2
, y3
, x0
, x1
, x2
, x3
);
372 InvRND01(x0
, x1
, x2
, x3
, y0
, y1
, y2
, y3
);
373 keying(y0
, y1
, y2
, y3
, key
->subkeys
[ 1]);
374 inv_transform(y0
, y1
, y2
, y3
, x0
, x1
, x2
, x3
);
375 InvRND00(x0
, x1
, x2
, x3
, y0
, y1
, y2
, y3
);
376 x0
= y0
; x1
= y1
; x2
= y2
; x3
= y3
;
377 keying(x0
, x1
, x2
, x3
, key
->subkeys
[ 0]);
378 /* The plaintext is now in x */
380 serpent_put_32bit(plaintext
,16,+0, x0
);
381 serpent_put_32bit(plaintext
,16,+4, x1
);
382 serpent_put_32bit(plaintext
,16,+8, x2
);
383 serpent_put_32bit(plaintext
,16,12, x3
);
385 SERP_DEBUG(" ",plaintext
,16,"\n");