Guest User

Untitled

a guest
Apr 20th, 2018
69
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 10.79 KB | None | 0 0
  1. /* serpent.c */
  2.  
  3. #include "serpent.h"
  4. #include "serpentmac.h"
  5. #include <string.h>
  6.  
  7. #define KEY_LEN 32
  8.  
  9. void make_key(serpentkey *sk, void *key, int len)
  10. {
  11.     register int i, j;
  12.     word w[132], k[132];
  13.  
  14.     /* Расширение ключа.  */
  15.     memset(sk->key, 0, KEY_LEN);
  16.     memcpy(sk->key, key, len < KEY_LEN ? len : KEY_LEN);
  17.     /* Добавляем байт 0x80.  */
  18.     if (len < KEY_LEN)
  19.         sk->key[len / 4] |= 1 << (len % 4 * 8 + 7);
  20.  
  21.     /* Выбор подключей.  */
  22.     for (i = 0; i < 132; i++) {
  23.         w[i] = sk->key[i % 8] ^ sk->key[(i + 3) % 8] ^ sk->key[(i + 5) % 8] ^
  24.             sk->key[(i + 7) % 8] ^ PHI ^ i;
  25.     }
  26.    
  27.     S3(w[  0], w[  1], w[  2], w[  3], k[  0], k[  1], k[  2], k[  3]);
  28.     S2(w[  4], w[  5], w[  6], w[  7], k[  4], k[  5], k[  6], k[  7]);
  29.     S1(w[  8], w[  9], w[ 10], w[ 11], k[  8], k[  9], k[ 10], k[ 11]);
  30.     S0(w[ 12], w[ 13], w[ 14], w[ 15], k[ 12], k[ 13], k[ 14], k[ 15]);
  31.     S7(w[ 16], w[ 17], w[ 18], w[ 19], k[ 16], k[ 17], k[ 18], k[ 19]);
  32.     S6(w[ 20], w[ 21], w[ 22], w[ 23], k[ 20], k[ 21], k[ 22], k[ 23]);
  33.     S5(w[ 24], w[ 25], w[ 26], w[ 27], k[ 24], k[ 25], k[ 26], k[ 27]);
  34.     S4(w[ 28], w[ 29], w[ 30], w[ 31], k[ 28], k[ 29], k[ 30], k[ 31]);
  35.     S3(w[ 32], w[ 33], w[ 34], w[ 35], k[ 32], k[ 33], k[ 34], k[ 35]);
  36.     S2(w[ 36], w[ 37], w[ 38], w[ 39], k[ 36], k[ 37], k[ 38], k[ 39]);
  37.     S1(w[ 40], w[ 41], w[ 42], w[ 43], k[ 40], k[ 41], k[ 42], k[ 43]);
  38.     S0(w[ 44], w[ 45], w[ 46], w[ 47], k[ 44], k[ 45], k[ 46], k[ 47]);
  39.     S7(w[ 48], w[ 49], w[ 50], w[ 51], k[ 48], k[ 49], k[ 50], k[ 51]);
  40.     S6(w[ 52], w[ 53], w[ 54], w[ 55], k[ 52], k[ 53], k[ 54], k[ 55]);
  41.     S5(w[ 56], w[ 57], w[ 58], w[ 59], k[ 56], k[ 57], k[ 58], k[ 59]);
  42.     S4(w[ 60], w[ 61], w[ 62], w[ 63], k[ 60], k[ 61], k[ 62], k[ 63]);
  43.     S3(w[ 64], w[ 65], w[ 66], w[ 67], k[ 64], k[ 65], k[ 66], k[ 67]);
  44.     S2(w[ 68], w[ 69], w[ 70], w[ 71], k[ 68], k[ 69], k[ 70], k[ 71]);
  45.     S1(w[ 72], w[ 73], w[ 74], w[ 75], k[ 72], k[ 73], k[ 74], k[ 75]);
  46.     S0(w[ 76], w[ 77], w[ 78], w[ 79], k[ 76], k[ 77], k[ 78], k[ 79]);
  47.     S7(w[ 80], w[ 81], w[ 82], w[ 83], k[ 80], k[ 81], k[ 82], k[ 83]);
  48.     S6(w[ 84], w[ 85], w[ 86], w[ 87], k[ 84], k[ 85], k[ 86], k[ 87]);
  49.     S5(w[ 88], w[ 89], w[ 90], w[ 91], k[ 88], k[ 89], k[ 90], k[ 91]);
  50.     S4(w[ 92], w[ 93], w[ 94], w[ 95], k[ 92], k[ 93], k[ 94], k[ 95]);
  51.     S3(w[ 96], w[ 97], w[ 98], w[ 99], k[ 96], k[ 97], k[ 98], k[ 99]);
  52.     S2(w[100], w[101], w[102], w[103], k[100], k[101], k[102], k[103]);
  53.     S1(w[104], w[105], w[106], w[107], k[104], k[105], k[106], k[107]);
  54.     S0(w[108], w[109], w[110], w[111], k[108], k[109], k[110], k[111]);
  55.     S7(w[112], w[113], w[114], w[115], k[112], k[113], k[114], k[115]);
  56.     S6(w[116], w[117], w[118], w[119], k[116], k[117], k[118], k[119]);
  57.     S5(w[120], w[121], w[122], w[123], k[120], k[121], k[122], k[123]);
  58.     S4(w[124], w[125], w[126], w[127], k[124], k[125], k[126], k[127]);
  59.     S3(w[128], w[129], w[130], w[131], k[128], k[129], k[130], k[131]);
  60.  
  61.     for (i = 0; i < 33; i++)
  62.         for (j = 0; j < 4; j++)
  63.             sk->subkeys[i][j] = k[4 * i + j];
  64. }
  65.  
  66. /* SPLIT: разбивает 128-битный блок на 4 32-битных слова.  */
  67. #define SPLIT(w0, w1, w2, w3, B)                \
  68.     do {                                        \
  69.         w0 = ((word *)B)[0];                    \
  70.         w1 = ((word *)B)[1];                    \
  71.         w2 = ((word *)B)[2];                    \
  72.         w3 = ((word *)B)[3];                    \
  73.     } while (0)
  74.  
  75. /* MERGE: объединяет 4 32-битных слова в 128-битный блок.  */
  76. #define MERGE(w0, w1, w2, w3, B)                \
  77.     do {                                        \
  78.         ((word *)B)[0] = w0;                    \
  79.         ((word *)B)[1] = w1;                    \
  80.         ((word *)B)[2] = w2;                    \
  81.         ((word *)B)[3] = w3;                    \
  82.     } while (0)
  83.  
  84. void serpent_encrypt(serpentkey *sk, void *b)
  85. {
  86.     word x0, x1, x2, x3;
  87.     word y0, y1, y2, y3;
  88.  
  89.     SPLIT(x0, x1, x2, x3, b);
  90.  
  91.     KEYING(x0, x1, x2, x3, sk->subkeys[ 0]); S0(x0, x1, x2, x3, y0, y1, y2, y3); LT(y0, y1, y2, y3);
  92.     KEYING(y0, y1, y2, y3, sk->subkeys[ 1]); S1(y0, y1, y2, y3, x0, x1, x2, x3); LT(x0, x1, x2, x3);
  93.     KEYING(x0, x1, x2, x3, sk->subkeys[ 2]); S2(x0, x1, x2, x3, y0, y1, y2, y3); LT(y0, y1, y2, y3);
  94.     KEYING(y0, y1, y2, y3, sk->subkeys[ 3]); S3(y0, y1, y2, y3, x0, x1, x2, x3); LT(x0, x1, x2, x3);
  95.     KEYING(x0, x1, x2, x3, sk->subkeys[ 4]); S4(x0, x1, x2, x3, y0, y1, y2, y3); LT(y0, y1, y2, y3);
  96.     KEYING(y0, y1, y2, y3, sk->subkeys[ 5]); S5(y0, y1, y2, y3, x0, x1, x2, x3); LT(x0, x1, x2, x3);
  97.     KEYING(x0, x1, x2, x3, sk->subkeys[ 6]); S6(x0, x1, x2, x3, y0, y1, y2, y3); LT(y0, y1, y2, y3);
  98.     KEYING(y0, y1, y2, y3, sk->subkeys[ 7]); S7(y0, y1, y2, y3, x0, x1, x2, x3); LT(x0, x1, x2, x3);
  99.     KEYING(x0, x1, x2, x3, sk->subkeys[ 8]); S0(x0, x1, x2, x3, y0, y1, y2, y3); LT(y0, y1, y2, y3);
  100.     KEYING(y0, y1, y2, y3, sk->subkeys[ 9]); S1(y0, y1, y2, y3, x0, x1, x2, x3); LT(x0, x1, x2, x3);
  101.     KEYING(x0, x1, x2, x3, sk->subkeys[10]); S2(x0, x1, x2, x3, y0, y1, y2, y3); LT(y0, y1, y2, y3);
  102.     KEYING(y0, y1, y2, y3, sk->subkeys[11]); S3(y0, y1, y2, y3, x0, x1, x2, x3); LT(x0, x1, x2, x3);
  103.     KEYING(x0, x1, x2, x3, sk->subkeys[12]); S4(x0, x1, x2, x3, y0, y1, y2, y3); LT(y0, y1, y2, y3);
  104.     KEYING(y0, y1, y2, y3, sk->subkeys[13]); S5(y0, y1, y2, y3, x0, x1, x2, x3); LT(x0, x1, x2, x3);
  105.     KEYING(x0, x1, x2, x3, sk->subkeys[14]); S6(x0, x1, x2, x3, y0, y1, y2, y3); LT(y0, y1, y2, y3);
  106.     KEYING(y0, y1, y2, y3, sk->subkeys[15]); S7(y0, y1, y2, y3, x0, x1, x2, x3); LT(x0, x1, x2, x3);
  107.     KEYING(x0, x1, x2, x3, sk->subkeys[16]); S0(x0, x1, x2, x3, y0, y1, y2, y3); LT(y0, y1, y2, y3);
  108.     KEYING(y0, y1, y2, y3, sk->subkeys[17]); S1(y0, y1, y2, y3, x0, x1, x2, x3); LT(x0, x1, x2, x3);
  109.     KEYING(x0, x1, x2, x3, sk->subkeys[18]); S2(x0, x1, x2, x3, y0, y1, y2, y3); LT(y0, y1, y2, y3);
  110.     KEYING(y0, y1, y2, y3, sk->subkeys[19]); S3(y0, y1, y2, y3, x0, x1, x2, x3); LT(x0, x1, x2, x3);
  111.     KEYING(x0, x1, x2, x3, sk->subkeys[20]); S4(x0, x1, x2, x3, y0, y1, y2, y3); LT(y0, y1, y2, y3);
  112.     KEYING(y0, y1, y2, y3, sk->subkeys[21]); S5(y0, y1, y2, y3, x0, x1, x2, x3); LT(x0, x1, x2, x3);
  113.     KEYING(x0, x1, x2, x3, sk->subkeys[22]); S6(x0, x1, x2, x3, y0, y1, y2, y3); LT(y0, y1, y2, y3);
  114.     KEYING(y0, y1, y2, y3, sk->subkeys[23]); S7(y0, y1, y2, y3, x0, x1, x2, x3); LT(x0, x1, x2, x3);
  115.     KEYING(x0, x1, x2, x3, sk->subkeys[24]); S0(x0, x1, x2, x3, y0, y1, y2, y3); LT(y0, y1, y2, y3);
  116.     KEYING(y0, y1, y2, y3, sk->subkeys[25]); S1(y0, y1, y2, y3, x0, x1, x2, x3); LT(x0, x1, x2, x3);
  117.     KEYING(x0, x1, x2, x3, sk->subkeys[26]); S2(x0, x1, x2, x3, y0, y1, y2, y3); LT(y0, y1, y2, y3);
  118.     KEYING(y0, y1, y2, y3, sk->subkeys[27]); S3(y0, y1, y2, y3, x0, x1, x2, x3); LT(x0, x1, x2, x3);
  119.     KEYING(x0, x1, x2, x3, sk->subkeys[28]); S4(x0, x1, x2, x3, y0, y1, y2, y3); LT(y0, y1, y2, y3);
  120.     KEYING(y0, y1, y2, y3, sk->subkeys[29]); S5(y0, y1, y2, y3, x0, x1, x2, x3); LT(x0, x1, x2, x3);
  121.     KEYING(x0, x1, x2, x3, sk->subkeys[30]); S6(x0, x1, x2, x3, y0, y1, y2, y3); LT(y0, y1, y2, y3);
  122.     KEYING(y0, y1, y2, y3, sk->subkeys[31]); S7(y0, y1, y2, y3, x0, x1, x2, x3);
  123.     KEYING(x0, x1, x2, x3, sk->subkeys[32]);
  124.  
  125.     MERGE(x0, x1, x2, x3, b);
  126. }
  127.  
  128. void serpent_decrypt(serpentkey *sk, void *b)
  129. {
  130.     word x0, x1, x2, x3;
  131.     word y0, y1, y2, y3;
  132.  
  133.     SPLIT(x0, x1, x2, x3, b);
  134.  
  135.     KEYING(x0, x1, x2, x3, sk->subkeys[32]); IS7(x0, x1, x2, x3, y0, y1, y2, y3);
  136.     KEYING(y0, y1, y2, y3, sk->subkeys[31]);
  137.     ILT(y0, y1, y2, y3); IS6(y0, y1, y2, y3, x0, x1, x2, x3); KEYING(x0, x1, x2, x3, sk->subkeys[30]);
  138.     ILT(x0, x1, x2, x3); IS5(x0, x1, x2, x3, y0, y1, y2, y3); KEYING(y0, y1, y2, y3, sk->subkeys[29]);
  139.     ILT(y0, y1, y2, y3); IS4(y0, y1, y2, y3, x0, x1, x2, x3); KEYING(x0, x1, x2, x3, sk->subkeys[28]);
  140.     ILT(x0, x1, x2, x3); IS3(x0, x1, x2, x3, y0, y1, y2, y3); KEYING(y0, y1, y2, y3, sk->subkeys[27]);
  141.     ILT(y0, y1, y2, y3); IS2(y0, y1, y2, y3, x0, x1, x2, x3); KEYING(x0, x1, x2, x3, sk->subkeys[26]);
  142.     ILT(x0, x1, x2, x3); IS1(x0, x1, x2, x3, y0, y1, y2, y3); KEYING(y0, y1, y2, y3, sk->subkeys[25]);
  143.     ILT(y0, y1, y2, y3); IS0(y0, y1, y2, y3, x0, x1, x2, x3); KEYING(x0, x1, x2, x3, sk->subkeys[24]);
  144.     ILT(x0, x1, x2, x3); IS7(x0, x1, x2, x3, y0, y1, y2, y3); KEYING(y0, y1, y2, y3, sk->subkeys[23]);
  145.     ILT(y0, y1, y2, y3); IS6(y0, y1, y2, y3, x0, x1, x2, x3); KEYING(x0, x1, x2, x3, sk->subkeys[22]);
  146.     ILT(x0, x1, x2, x3); IS5(x0, x1, x2, x3, y0, y1, y2, y3); KEYING(y0, y1, y2, y3, sk->subkeys[21]);
  147.     ILT(y0, y1, y2, y3); IS4(y0, y1, y2, y3, x0, x1, x2, x3); KEYING(x0, x1, x2, x3, sk->subkeys[20]);
  148.     ILT(x0, x1, x2, x3); IS3(x0, x1, x2, x3, y0, y1, y2, y3); KEYING(y0, y1, y2, y3, sk->subkeys[19]);
  149.     ILT(y0, y1, y2, y3); IS2(y0, y1, y2, y3, x0, x1, x2, x3); KEYING(x0, x1, x2, x3, sk->subkeys[18]);
  150.     ILT(x0, x1, x2, x3); IS1(x0, x1, x2, x3, y0, y1, y2, y3); KEYING(y0, y1, y2, y3, sk->subkeys[17]);
  151.     ILT(y0, y1, y2, y3); IS0(y0, y1, y2, y3, x0, x1, x2, x3); KEYING(x0, x1, x2, x3, sk->subkeys[16]);
  152.     ILT(x0, x1, x2, x3); IS7(x0, x1, x2, x3, y0, y1, y2, y3); KEYING(y0, y1, y2, y3, sk->subkeys[15]);
  153.     ILT(y0, y1, y2, y3); IS6(y0, y1, y2, y3, x0, x1, x2, x3); KEYING(x0, x1, x2, x3, sk->subkeys[14]);
  154.     ILT(x0, x1, x2, x3); IS5(x0, x1, x2, x3, y0, y1, y2, y3); KEYING(y0, y1, y2, y3, sk->subkeys[13]);
  155.     ILT(y0, y1, y2, y3); IS4(y0, y1, y2, y3, x0, x1, x2, x3); KEYING(x0, x1, x2, x3, sk->subkeys[12]);
  156.     ILT(x0, x1, x2, x3); IS3(x0, x1, x2, x3, y0, y1, y2, y3); KEYING(y0, y1, y2, y3, sk->subkeys[11]);
  157.     ILT(y0, y1, y2, y3); IS2(y0, y1, y2, y3, x0, x1, x2, x3); KEYING(x0, x1, x2, x3, sk->subkeys[10]);
  158.     ILT(x0, x1, x2, x3); IS1(x0, x1, x2, x3, y0, y1, y2, y3); KEYING(y0, y1, y2, y3, sk->subkeys[ 9]);
  159.     ILT(y0, y1, y2, y3); IS0(y0, y1, y2, y3, x0, x1, x2, x3); KEYING(x0, x1, x2, x3, sk->subkeys[ 8]);
  160.     ILT(x0, x1, x2, x3); IS7(x0, x1, x2, x3, y0, y1, y2, y3); KEYING(y0, y1, y2, y3, sk->subkeys[ 7]);
  161.     ILT(y0, y1, y2, y3); IS6(y0, y1, y2, y3, x0, x1, x2, x3); KEYING(x0, x1, x2, x3, sk->subkeys[ 6]);
  162.     ILT(x0, x1, x2, x3); IS5(x0, x1, x2, x3, y0, y1, y2, y3); KEYING(y0, y1, y2, y3, sk->subkeys[ 5]);
  163.     ILT(y0, y1, y2, y3); IS4(y0, y1, y2, y3, x0, x1, x2, x3); KEYING(x0, x1, x2, x3, sk->subkeys[ 4]);
  164.     ILT(x0, x1, x2, x3); IS3(x0, x1, x2, x3, y0, y1, y2, y3); KEYING(y0, y1, y2, y3, sk->subkeys[ 3]);
  165.     ILT(y0, y1, y2, y3); IS2(y0, y1, y2, y3, x0, x1, x2, x3); KEYING(x0, x1, x2, x3, sk->subkeys[ 2]);
  166.     ILT(x0, x1, x2, x3); IS1(x0, x1, x2, x3, y0, y1, y2, y3); KEYING(y0, y1, y2, y3, sk->subkeys[ 1]);
  167.     ILT(y0, y1, y2, y3); IS0(y0, y1, y2, y3, x0, x1, x2, x3); KEYING(x0, x1, x2, x3, sk->subkeys[ 0]);
  168.  
  169.     MERGE(x0, x1, x2, x3, b);
  170. }
Add Comment
Please, Sign In to add comment