chiark / gitweb /
Rearrange the file tree.
[catacomb] / symm / whirlpool-mktab.c
1 /* -*-c-*-
2  *
3  * Generate tables for Whirlpool hash function
4  *
5  * (c) 2005 Straylight/Edgeware
6  */
7
8 /*----- Licensing notice --------------------------------------------------*
9  *
10  * This file is part of Catacomb.
11  *
12  * Catacomb is free software; you can redistribute it and/or modify
13  * it under the terms of the GNU Library General Public License as
14  * published by the Free Software Foundation; either version 2 of the
15  * License, or (at your option) any later version.
16  *
17  * Catacomb is distributed in the hope that it will be useful,
18  * but WITHOUT ANY WARRANTY; without even the implied warranty of
19  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
20  * GNU Library General Public License for more details.
21  *
22  * You should have received a copy of the GNU Library General Public
23  * License along with Catacomb; if not, write to the Free
24  * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
25  * MA 02111-1307, USA.
26  */
27
28 /*----- Header files ------------------------------------------------------*/
29
30 #include <assert.h>
31 #include <stdio.h>
32 #include <stdlib.h>
33
34 #include <mLib/bits.h>
35
36 /*----- Static variables --------------------------------------------------*/
37
38 static const octet E[] = {
39   0x1, 0xb, 0x9, 0xc, 0xd, 0x6, 0xf, 0x3,
40   0xe, 0x8, 0x7, 0x4, 0xa, 0x2, 0x5, 0x0
41 }, R[] = {
42   0x7, 0xc, 0xb, 0xd, 0xe, 0x4, 0x9, 0xf,
43   0x6, 0x3, 0x8, 0xa, 0x2, 0x5, 0x1, 0x0
44 }, C[] = {
45   0x1, 0x1, 0x4, 0x1, 0x8, 0x5, 0x2, 0x9
46 };
47
48 static octet S[256], T[256][8], log[256], alog[256];
49
50 /*----- Main code ---------------------------------------------------------*/
51
52 #define S_MOD 0x11d
53
54 static void logtable(void)
55 {
56   unsigned i, x;
57
58   for (i = 0, x = 1; i < 255; i++) {
59     log[x] = i;
60     alog[i] = x;
61     x <<= 1;
62     if (x & 0x100) x ^= S_MOD;
63   }
64 }
65
66 static octet mul(octet x, octet y)
67   { if (!x || !y) return (0); return (alog[(log[x] + log[y]) % 255]); }
68
69 static void sbox(void)
70 {
71   unsigned i, j;
72   octet EI[16];
73   octet l, r, y;
74
75   for (i = 0; i < 16; i++) EI[E[i]] = i;
76   for (i = 0; i < 256; i++) {
77     l = (i >> 4) & 0xf;
78     r = (i >> 0) & 0xf;
79     l = E[l]; r = EI[r];
80     y = R[l ^ r];
81     l = E[l ^ y]; r = EI[r ^ y];
82     S[i] = (l << 4) | r;
83   }
84
85   for (i = 0; i < 256; i++) {
86     for (j = 0; j < 8; j++)
87       T[i][j] = mul(S[i], C[j]);
88   }
89 }
90
91 static unsigned long w32(int i, int j, int k)
92 {
93   kludge64 x;
94   LOAD64_L_(x, T[j]);
95   ROL64_(x, x, i * 8);
96   return (k ? LO64(x) : HI64(x));
97 }
98
99 int main(void)
100 {
101   int i, j;
102
103   puts("\
104 /* -*-c-*-\n\
105  *\n\
106  * Whirlpool tables [generated]\n\
107  */\n\
108 \n\
109 #ifndef CATACOMB_WHIRLPOOL_TAB_H\n\
110 #define CATACOMB_WHIRLPOOL_TAB_H\n\
111 ");
112
113   /* --- Write out the S-box --- */
114
115   logtable();
116   sbox();
117   fputs("\
118 /* --- The byte substitution --- */\n\
119 \n\
120 #define WHIRLPOOL_S {                                                   \\\n\
121   ", stdout);
122   for (i = 0; i < 256; i++) {
123     printf("0x%02x", S[i]);
124     if (i == 255)
125       fputs("                   \\\n}\n\n", stdout);
126     else if (i % 8 == 7)
127       fputs(",                  \\\n  ", stdout);
128     else
129       fputs(", ", stdout);
130   }
131
132   /* --- Write out the key constant tables --- */
133
134   fputs("\
135 /* --- The key generation constants --- */\n\
136 \n\
137 #define WHIRLPOOL_C {                                                   \\\n\
138   ", stdout);
139   for (i = 0; i < 10; i++) {
140     printf("X64(%08lx, %08lx)",
141            (unsigned long)LOAD32_L(&S[i * 8 + 4]),
142            (unsigned long)LOAD32_L(&S[i * 8 + 0]));
143     if (i == 9)
144       fputs("                   \\\n}\n\n", stdout);
145     else if (i % 2 == 1)
146       fputs(",                  \\\n  ", stdout);
147     else
148       fputs(", ", stdout);
149   }
150
151   /* --- Write out the big T tables --- */
152
153   fputs("\
154 /* --- The 64-bit big round tables --- */\n\
155 \n\
156 #define WHIRLPOOL_T {                                                   \\\n\
157   { ", stdout);
158   for (j = 0; j < 8; j++) {
159     for (i = 0; i < 256; i++) {
160       printf("X64(%08lx, %08lx)", w32(j, i, 0), w32(j, i, 1));
161       if (i == 255) {
162         if (j == 7)
163           fputs(" }                     \\\n}\n\n", stdout);
164         else
165           fputs(" },                    \\\n\
166                                                                         \\\n\
167   { ", stdout);
168       } else if (i % 2 == 1)
169         fputs(",                        \\\n    ", stdout);
170       else
171         fputs(", ", stdout);
172     }
173   }
174
175   /* --- Write out the smaller U and V tables --- */
176
177   fputs("\
178 /* --- The 32-bit round tables --- */\n\
179 \n\
180 #define WHIRLPOOL_U {                                                   \\\n\
181   { ", stdout);
182   for (j = 0; j < 4; j++) {
183     for (i = 0; i < 256; i++) {
184       printf("0x%08lx", w32(j, i, 1));
185       if (i == 255) {
186         if (j == 3)
187           fputs(" }                     \\\n}\n\n", stdout);
188         else
189           fputs(" },                    \\\n\
190                                                                         \\\n\
191   { ", stdout);
192       } else if (i % 4 == 3)
193         fputs(",                        \\\n    ", stdout);
194       else
195         fputs(", ", stdout);
196     }
197   }
198
199   fputs("\
200 #define WHIRLPOOL_V {                                                   \\\n\
201   { ", stdout);
202   for (j = 0; j < 4; j++) {
203     for (i = 0; i < 256; i++) {
204       printf("0x%08lx", w32(j, i, 0));
205       if (i == 255) {
206         if (j == 3)
207           fputs(" }                     \\\n}\n\n", stdout);
208         else
209           fputs(" },                    \\\n\
210                                                                         \\\n\
211   { ", stdout);
212       } else if (i % 4 == 3)
213         fputs(",                        \\\n    ", stdout);
214       else
215         fputs(", ", stdout);
216     }
217   }
218
219   /* --- Done --- */
220
221   puts("#endif");
222
223   if (fclose(stdout)) {
224     fprintf(stderr, "error writing data\n");
225     exit(EXIT_FAILURE);
226   }
227
228   return (0);
229 }
230
231 /*----- That's all, folks -------------------------------------------------*/