5 * Generate tables for Whirlpool hash function
7 * (c) 2005 Straylight/Edgeware
10 /*----- Licensing notice --------------------------------------------------*
12 * This file is part of Catacomb.
14 * Catacomb is free software; you can redistribute it and/or modify
15 * it under the terms of the GNU Library General Public License as
16 * published by the Free Software Foundation; either version 2 of the
17 * License, or (at your option) any later version.
19 * Catacomb is distributed in the hope that it will be useful,
20 * but WITHOUT ANY WARRANTY; without even the implied warranty of
21 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
22 * GNU Library General Public License for more details.
24 * You should have received a copy of the GNU Library General Public
25 * License along with Catacomb; if not, write to the Free
26 * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
30 /*----- Header files ------------------------------------------------------*/
36 #include <mLib/bits.h>
38 /*----- Static variables --------------------------------------------------*/
40 static const octet E[] = {
41 0x1, 0xb, 0x9, 0xc, 0xd, 0x6, 0xf, 0x3,
42 0xe, 0x8, 0x7, 0x4, 0xa, 0x2, 0x5, 0x0
44 0x7, 0xc, 0xb, 0xd, 0xe, 0x4, 0x9, 0xf,
45 0x6, 0x3, 0x8, 0xa, 0x2, 0x5, 0x1, 0x0
47 0x1, 0x1, 0x4, 0x1, 0x8, 0x5, 0x2, 0x9
50 static octet S[256], T[256][8], log[256], alog[256];
52 /*----- Main code ---------------------------------------------------------*/
56 static void logtable(void)
60 for (i = 0, x = 1; i < 255; i++) {
64 if (x & 0x100) x ^= S_MOD;
68 static octet mul(octet x, octet y)
69 { if (!x || !y) return (0); return (alog[(log[x] + log[y]) % 255]); }
71 static void sbox(void)
77 for (i = 0; i < 16; i++) EI[E[i]] = i;
78 for (i = 0; i < 256; i++) {
83 l = E[l ^ y]; r = EI[r ^ y];
87 for (i = 0; i < 256; i++) {
88 for (j = 0; j < 8; j++)
89 T[i][j] = mul(S[i], C[j]);
93 static unsigned long w32(int i, int j, int k)
98 return (k ? LO64(x) : HI64(x));
108 * Whirlpool tables [generated]\n\
111 #ifndef CATACOMB_WHIRLPOOL_TAB_H\n\
112 #define CATACOMB_WHIRLPOOL_TAB_H\n\
115 /* --- Write out the S-box --- */
120 /* --- The byte substitution --- */\n\
122 #define WHIRLPOOL_S { \\\n\
124 for (i = 0; i < 256; i++) {
125 printf("0x%02x", S[i]);
127 fputs(" \\\n}\n\n", stdout);
129 fputs(", \\\n ", stdout);
134 /* --- Write out the key constant tables --- */
137 /* --- The key generation constants --- */\n\
139 #define WHIRLPOOL_C { \\\n\
141 for (i = 0; i < 10; i++) {
142 printf("X64(%08lx, %08lx)",
143 (unsigned long)LOAD32_L(&S[i * 8 + 4]),
144 (unsigned long)LOAD32_L(&S[i * 8 + 0]));
146 fputs(" \\\n}\n\n", stdout);
148 fputs(", \\\n ", stdout);
153 /* --- Write out the big T tables --- */
156 /* --- The 64-bit big round tables --- */\n\
158 #define WHIRLPOOL_T { \\\n\
160 for (j = 0; j < 8; j++) {
161 for (i = 0; i < 256; i++) {
162 printf("X64(%08lx, %08lx)", w32(j, i, 0), w32(j, i, 1));
165 fputs(" } \\\n}\n\n", stdout);
170 } else if (i % 2 == 1)
171 fputs(", \\\n ", stdout);
177 /* --- Write out the smaller U and V tables --- */
180 /* --- The 32-bit round tables --- */\n\
182 #define WHIRLPOOL_U { \\\n\
184 for (j = 0; j < 4; j++) {
185 for (i = 0; i < 256; i++) {
186 printf("0x%08lx", w32(j, i, 1));
189 fputs(" } \\\n}\n\n", stdout);
194 } else if (i % 4 == 3)
195 fputs(", \\\n ", stdout);
202 #define WHIRLPOOL_V { \\\n\
204 for (j = 0; j < 4; j++) {
205 for (i = 0; i < 256; i++) {
206 printf("0x%08lx", w32(j, i, 0));
209 fputs(" } \\\n}\n\n", stdout);
214 } else if (i % 4 == 3)
215 fputs(", \\\n ", stdout);
225 if (fclose(stdout)) {
226 fprintf(stderr, "error writing data\n");
233 /*----- That's all, folks -------------------------------------------------*/