Rearrange the file tree.
[u/mdw/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 -------------------------------------------------*/