5 Author: Pekka Riikonen <priikone@silcnet.org>
7 Copyright (C) 1999 - 2008 Pekka Riikonen
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; version 2 of the License.
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
26 /* General definitions for algorithms */
27 typedef unsigned char u1byte;
28 typedef SilcUInt32 u4byte;
29 typedef SilcUInt32 u32;
30 typedef SilcUInt32 uint_32t;
31 typedef SilcUInt8 uint_8t;
33 #define rotr(x, nr) silc_ror(x, nr)
34 #define rotl(x, nr) silc_rol(x, nr)
35 #define byte(x, nr) ((x) >> (nr * 8) & 255)
37 /* Byte key to words */
38 #define SILC_GET_WORD_KEY(s, d, len) \
41 for (_i = 0; _i < (len / 8) / 4; _i++) \
42 SILC_GET32_LSB(d[_i], s + (_i * 4)); \
45 /* CBC mode 128-bit block, LSB, 32-bit block argument must be encrypted */
47 #define SILC_CBC_ENC_LSB_128_32(len, iv, block, src, dst, i, enc) \
49 SILC_ASSERT((len & (16 - 1)) == 0); \
53 SILC_GET32_LSB(block[0], &iv[0]); \
54 SILC_GET32_LSB(block[1], &iv[4]); \
55 SILC_GET32_LSB(block[2], &iv[8]); \
56 SILC_GET32_LSB(block[3], &iv[12]); \
58 for (i = 0; i < len; i += 16) { \
59 SILC_GET32_X_LSB(block[0], &src[0]); \
60 SILC_GET32_X_LSB(block[1], &src[4]); \
61 SILC_GET32_X_LSB(block[2], &src[8]); \
62 SILC_GET32_X_LSB(block[3], &src[12]); \
66 SILC_PUT32_LSB(block[0], &dst[0]); \
67 SILC_PUT32_LSB(block[1], &dst[4]); \
68 SILC_PUT32_LSB(block[2], &dst[8]); \
69 SILC_PUT32_LSB(block[3], &dst[12]); \
75 SILC_PUT32_LSB(block[0], &iv[0]); \
76 SILC_PUT32_LSB(block[1], &iv[4]); \
77 SILC_PUT32_LSB(block[2], &iv[8]); \
78 SILC_PUT32_LSB(block[3], &iv[12]); \
81 /* CBC mode 128-bit block, LSB, decrypt block to block_dec. */
83 #define SILC_CBC_DEC_LSB_128_32(len, iv, block_prev, block, \
84 block_dec, src, dst, i, dec) \
86 if (!len || len & (16 - 1)) \
89 SILC_GET32_LSB(block_prev[0], &iv[0]); \
90 SILC_GET32_LSB(block_prev[1], &iv[4]); \
91 SILC_GET32_LSB(block_prev[2], &iv[8]); \
92 SILC_GET32_LSB(block_prev[3], &iv[12]); \
94 for (i = 0; i < len; i += 16) { \
95 SILC_GET32_LSB(block[0], &src[0]); \
96 SILC_GET32_LSB(block[1], &src[4]); \
97 SILC_GET32_LSB(block[2], &src[8]); \
98 SILC_GET32_LSB(block[3], &src[12]); \
102 block_dec[0] ^= block_prev[0]; \
103 block_dec[1] ^= block_prev[1]; \
104 block_dec[2] ^= block_prev[2]; \
105 block_dec[3] ^= block_prev[3]; \
107 SILC_PUT32_LSB(block_dec[0], &dst[0]); \
108 SILC_PUT32_LSB(block_dec[1], &dst[4]); \
109 SILC_PUT32_LSB(block_dec[2], &dst[8]); \
110 SILC_PUT32_LSB(block_dec[3], &dst[12]); \
112 block_prev[0] = block[0]; \
113 block_prev[1] = block[1]; \
114 block_prev[2] = block[2]; \
115 block_prev[3] = block[3]; \
121 SILC_PUT32_LSB(block[0], &iv[0]); \
122 SILC_PUT32_LSB(block[1], &iv[4]); \
123 SILC_PUT32_LSB(block[2], &iv[8]); \
124 SILC_PUT32_LSB(block[3], &iv[12]); \
127 /* CBC mode 128-bit block, MSB, 32-bit block argument must be encrypted */
129 #define SILC_CBC_ENC_MSB_128_32(len, iv, block, src, dst, i, enc) \
131 SILC_ASSERT((len & (16 - 1)) == 0); \
132 if (len & (16 - 1)) \
135 SILC_GET32_MSB(block[0], &iv[0]); \
136 SILC_GET32_MSB(block[1], &iv[4]); \
137 SILC_GET32_MSB(block[2], &iv[8]); \
138 SILC_GET32_MSB(block[3], &iv[12]); \
140 for (i = 0; i < len; i += 16) { \
141 SILC_GET32_X_MSB(block[0], &src[0]); \
142 SILC_GET32_X_MSB(block[1], &src[4]); \
143 SILC_GET32_X_MSB(block[2], &src[8]); \
144 SILC_GET32_X_MSB(block[3], &src[12]); \
148 SILC_PUT32_MSB(block[0], &dst[0]); \
149 SILC_PUT32_MSB(block[1], &dst[4]); \
150 SILC_PUT32_MSB(block[2], &dst[8]); \
151 SILC_PUT32_MSB(block[3], &dst[12]); \
157 SILC_PUT32_MSB(block[0], &iv[0]); \
158 SILC_PUT32_MSB(block[1], &iv[4]); \
159 SILC_PUT32_MSB(block[2], &iv[8]); \
160 SILC_PUT32_MSB(block[3], &iv[12]); \
163 /* CBC mode 128-bit block, MSB, decrypt block to block_dec. */
165 #define SILC_CBC_DEC_MSB_128_32(len, iv, block_prev, block, \
166 block_dec, src, dst, i, dec) \
168 if (!len || len & (16 - 1)) \
171 SILC_GET32_MSB(block_prev[0], &iv[0]); \
172 SILC_GET32_MSB(block_prev[1], &iv[4]); \
173 SILC_GET32_MSB(block_prev[2], &iv[8]); \
174 SILC_GET32_MSB(block_prev[3], &iv[12]); \
176 for (i = 0; i < len; i += 16) { \
177 SILC_GET32_MSB(block[0], &src[0]); \
178 SILC_GET32_MSB(block[1], &src[4]); \
179 SILC_GET32_MSB(block[2], &src[8]); \
180 SILC_GET32_MSB(block[3], &src[12]); \
184 block_dec[0] ^= block_prev[0]; \
185 block_dec[1] ^= block_prev[1]; \
186 block_dec[2] ^= block_prev[2]; \
187 block_dec[3] ^= block_prev[3]; \
189 SILC_PUT32_MSB(block_dec[0], &dst[0]); \
190 SILC_PUT32_MSB(block_dec[1], &dst[4]); \
191 SILC_PUT32_MSB(block_dec[2], &dst[8]); \
192 SILC_PUT32_MSB(block_dec[3], &dst[12]); \
194 block_prev[0] = block[0]; \
195 block_prev[1] = block[1]; \
196 block_prev[2] = block[2]; \
197 block_prev[3] = block[3]; \
203 SILC_PUT32_MSB(block[0], &iv[0]); \
204 SILC_PUT32_MSB(block[1], &iv[4]); \
205 SILC_PUT32_MSB(block[2], &iv[8]); \
206 SILC_PUT32_MSB(block[3], &iv[12]); \
209 /* CBC mode 64-bit block, MSB, 32-bit block argument must be encrypted */
211 #define SILC_CBC_ENC_MSB_64_32(len, iv, block, src, dst, i, enc) \
213 SILC_ASSERT((len & (8 - 1)) == 0); \
217 SILC_GET32_MSB(block[0], &iv[0]); \
218 SILC_GET32_MSB(block[1], &iv[4]); \
220 for (i = 0; i < len; i += 8) { \
221 SILC_GET32_X_MSB(block[0], &src[0]); \
222 SILC_GET32_X_MSB(block[1], &src[4]); \
226 SILC_PUT32_MSB(block[0], &dst[0]); \
227 SILC_PUT32_MSB(block[1], &dst[4]); \
233 SILC_PUT32_MSB(block[0], &iv[0]); \
234 SILC_PUT32_MSB(block[1], &iv[4]); \
237 /* CBC mode 64-bit block, MSB, decrypt block to block_dec. */
239 #define SILC_CBC_DEC_MSB_64_32(len, iv, block_prev, block, \
240 block_dec, src, dst, i, dec) \
242 if (!len || len & (8 - 1)) \
245 SILC_GET32_MSB(block_prev[0], &iv[0]); \
246 SILC_GET32_MSB(block_prev[1], &iv[4]); \
248 for (i = 0; i < len; i += 8) { \
249 SILC_GET32_MSB(block[0], &src[0]); \
250 SILC_GET32_MSB(block[1], &src[4]); \
254 block_dec[0] ^= block_prev[0]; \
255 block_dec[1] ^= block_prev[1]; \
257 SILC_PUT32_MSB(block_dec[0], &dst[0]); \
258 SILC_PUT32_MSB(block_dec[1], &dst[4]); \
260 block_prev[0] = block[0]; \
261 block_prev[1] = block[1]; \
267 SILC_PUT32_MSB(block[0], &iv[0]); \
268 SILC_PUT32_MSB(block[1], &iv[4]); \
271 #ifndef WORDS_BIGENDIAN
273 /* CTR mode 128-bit block, MSB, MSB counter, the 8-bit ctr argument must
274 be encrypted to enc_ctr */
276 #define SILC_CTR_MSB_128_8(ctr, enc_ctr, pad, src, dst, enc) \
280 for (i = 15; i >= 0; i--) \
287 *(SilcUInt64 *)dst = *(SilcUInt64 *)src ^ *(SilcUInt64 *)enc_ctr; \
288 *(SilcUInt64 *)(dst + 8) = *(SilcUInt64 *)(src + 8) ^ \
289 *(SilcUInt64 *)(enc_ctr + 8); \
293 silc_prefetch((void *)src, 0, 0); \
298 *dst++ = *src++ ^ enc_ctr[pad++]; \
303 #else /* WORDS_BIGENDIAN */
305 #define SILC_CTR_MSB_128_8(ctr, enc_ctr, pad, src, dst, enc) \
307 while (len-- > 0) { \
309 for (i = 15; i >= 0; i--) \
316 *dst++ = *src++ ^ enc_ctr[pad++]; \
320 #endif /* !WORDS_BIGENDIAN */
322 /* CTR mode 128-bit block, LSB, MSB counter, the 32-bit tmp argument
323 must be encrypted, enc_ctr must have the encrypted data too. */
325 #define SILC_CTR_LSB_128_32(ctr, tmp, enc_ctr, pad, src, dst, enc) \
327 while (len-- > 0) { \
329 for (i = 15; i >= 0; i--) \
333 SILC_GET32_LSB(tmp[0], ctr); \
334 SILC_GET32_LSB(tmp[1], ctr + 4); \
335 SILC_GET32_LSB(tmp[2], ctr + 8); \
336 SILC_GET32_LSB(tmp[3], ctr + 12); \
338 SILC_PUT32_LSB(tmp[0], enc_ctr); \
339 SILC_PUT32_LSB(tmp[1], enc_ctr + 4); \
340 SILC_PUT32_LSB(tmp[2], enc_ctr + 8); \
341 SILC_PUT32_LSB(tmp[3], enc_ctr + 12); \
344 *dst++ = *src++ ^ enc_ctr[pad++]; \
348 /* CTR mode 128-bit block, LSB, MSB counter, the 32-bit tmp argument
349 must be encrypted, enc_ctr must have the encrypted data too. */
351 #define SILC_CTR_MSB_64_32(ctr, tmp, enc_ctr, pad, src, dst, enc) \
353 while (len-- > 0) { \
355 for (i = 7; i >= 0; i--) \
359 SILC_GET32_MSB(tmp[0], ctr); \
360 SILC_GET32_MSB(tmp[1], ctr + 4); \
362 SILC_PUT32_MSB(tmp[0], enc_ctr); \
363 SILC_PUT32_MSB(tmp[1], enc_ctr + 4); \
366 *dst++ = *src++ ^ enc_ctr[pad++]; \
370 /* CFB 128-bit block, LSB, the 32-bit cfb argument must be encrypted. */
372 #define SILC_CFB_ENC_LSB_128_32(iv, cfb, pad, src, dst, enc) \
374 while (len-- > 0) { \
376 SILC_GET32_LSB(cfb[0], iv); \
377 SILC_GET32_LSB(cfb[1], iv + 4); \
378 SILC_GET32_LSB(cfb[2], iv + 8); \
379 SILC_GET32_LSB(cfb[3], iv + 12); \
383 SILC_PUT32_LSB(cfb[0], iv); \
384 SILC_PUT32_LSB(cfb[1], iv + 4); \
385 SILC_PUT32_LSB(cfb[2], iv + 8); \
386 SILC_PUT32_LSB(cfb[3], iv + 12); \
389 iv[pad] = (*dst = *src ^ iv[pad]); \
396 /* CFB 128-bit block, LSB, the 32-bit cfb argument must be decrypted. */
398 #define SILC_CFB_DEC_LSB_128_32(iv, cfb, pad, src, dst, dec) \
400 unsigned char temp; \
401 while (len-- > 0) { \
403 SILC_GET32_LSB(cfb[0], iv); \
404 SILC_GET32_LSB(cfb[1], iv + 4); \
405 SILC_GET32_LSB(cfb[2], iv + 8); \
406 SILC_GET32_LSB(cfb[3], iv + 12); \
410 SILC_PUT32_LSB(cfb[0], iv); \
411 SILC_PUT32_LSB(cfb[1], iv + 4); \
412 SILC_PUT32_LSB(cfb[2], iv + 8); \
413 SILC_PUT32_LSB(cfb[3], iv + 12); \
417 *dst = temp ^ iv[pad]; \
424 /* CFB 128-bit block, MSB, the 32-bit cfb argument must be encrypted. */
426 #define SILC_CFB_ENC_MSB_128_32(iv, cfb, pad, src, dst, enc) \
428 while (len-- > 0) { \
430 SILC_GET32_MSB(cfb[0], iv); \
431 SILC_GET32_MSB(cfb[1], iv + 4); \
432 SILC_GET32_MSB(cfb[2], iv + 8); \
433 SILC_GET32_MSB(cfb[3], iv + 12); \
437 SILC_PUT32_MSB(cfb[0], iv); \
438 SILC_PUT32_MSB(cfb[1], iv + 4); \
439 SILC_PUT32_MSB(cfb[2], iv + 8); \
440 SILC_PUT32_MSB(cfb[3], iv + 12); \
443 iv[pad] = (*dst = *src ^ iv[pad]); \
450 /* CFB 128-bit block, MSB, the 32-bit cfb argument must be decrypted. */
452 #define SILC_CFB_DEC_MSB_128_32(iv, cfb, pad, src, dst, dec) \
454 unsigned char temp; \
455 while (len-- > 0) { \
457 SILC_GET32_MSB(cfb[0], iv); \
458 SILC_GET32_MSB(cfb[1], iv + 4); \
459 SILC_GET32_MSB(cfb[2], iv + 8); \
460 SILC_GET32_MSB(cfb[3], iv + 12); \
464 SILC_PUT32_MSB(cfb[0], iv); \
465 SILC_PUT32_MSB(cfb[1], iv + 4); \
466 SILC_PUT32_MSB(cfb[2], iv + 8); \
467 SILC_PUT32_MSB(cfb[3], iv + 12); \
471 *dst = temp ^ iv[pad]; \
478 /* CFB 64-bit block, MSB, the 32-bit cfb argument must be encrypted. */
480 #define SILC_CFB_ENC_MSB_64_32(iv, cfb, pad, src, dst, enc) \
482 while (len-- > 0) { \
484 SILC_GET32_MSB(cfb[0], iv); \
485 SILC_GET32_MSB(cfb[1], iv + 4); \
489 SILC_PUT32_MSB(cfb[0], iv); \
490 SILC_PUT32_MSB(cfb[1], iv + 4); \
493 iv[pad] = (*dst = *src ^ iv[pad]); \
500 /* CFB 64-bit block, MSB, the 32-bit cfb argument must be decrypted. */
502 #define SILC_CFB_DEC_MSB_64_32(iv, cfb, pad, src, dst, dec) \
504 unsigned char temp; \
505 while (len-- > 0) { \
507 SILC_GET32_MSB(cfb[0], iv); \
508 SILC_GET32_MSB(cfb[1], iv + 4); \
512 SILC_PUT32_MSB(cfb[0], iv); \
513 SILC_PUT32_MSB(cfb[1], iv + 4); \
517 *dst = temp ^ iv[pad]; \
524 /* CFB 128-bit block, MSB, the 8-bit iv argument must be encrypted. */
526 #define SILC_CFB_ENC_MSB_128_8(iv, pad, src, dst, enc) \
528 while (len-- > 0) { \
533 iv[pad] = (*dst = *src ^ iv[pad]); \
540 /* CFB 128-bit block, MSB, the 8-bit iv argument must be decrypted. */
542 #define SILC_CFB_DEC_MSB_128_8(iv, pad, src, dst, dec) \
544 unsigned char temp; \
545 while (len-- > 0) { \
551 *dst = temp ^ iv[pad]; \