comparison libtomcrypt/notes/etc/whirlgen.c @ 399:a707e6148060

merge of '5fdf69ca60d1683cdd9f4c2595134bed26394834' and '6b61c50f4cf888bea302ac8fcf5dbb573b443251'
author Matt Johnston <matt@ucc.asn.au>
date Sat, 03 Feb 2007 08:20:34 +0000
parents 1b9e69c058d2
children f849a5ca2efc
comparison
equal deleted inserted replaced
394:17d097fc111c 399:a707e6148060
1 #include <stdio.h>
2
3 unsigned E[16] = { 1, 0xb, 9, 0xc, 0xd, 6, 0xf, 3, 0xe, 8, 7, 4, 0xa, 2, 5, 0 };
4 unsigned Ei[16];
5 unsigned R[16] = { 7, 0xc, 0xb, 0xd, 0xe, 4, 9, 0xf, 6, 3, 8, 0xa, 2, 5, 1, 0 };
6 unsigned cir[8][8] = {
7 {1, 1, 4, 1, 8, 5, 2, 9 },
8 };
9
10
11 unsigned gf_mul(unsigned a, unsigned b)
12 {
13 unsigned r;
14
15 r = 0;
16 while (a) {
17 if (a & 1) r ^= b;
18 a >>= 1;
19 b = (b << 1) ^ (b & 0x80 ? 0x11d : 0x00);
20 }
21 return r;
22 }
23
24 unsigned sbox(unsigned x)
25 {
26 unsigned a, b, w;
27
28 a = x >> 4;
29 b = x & 15;
30
31 a = E[a]; b = Ei[b];
32 w = a ^ b; w = R[w];
33 a = E[a ^ w]; b = Ei[b ^ w];
34
35
36 return (a << 4) | b;
37 }
38
39 int main(void)
40 {
41 unsigned x, y;
42
43 for (x = 0; x < 16; x++) Ei[E[x]] = x;
44
45 // for (x = 0; x < 16; x++) printf("%2x ", sbox(x));
46 for (y = 1; y < 8; y++) {
47 for (x = 0; x < 8; x++) {
48 cir[y][x] = cir[y-1][(x-1)&7];
49 }
50 }
51
52 /*
53 printf("\n");
54 for (y = 0; y < 8; y++) {
55 for (x = 0; x < 8; x++) printf("%2d ", cir[y][x]);
56 printf("\n");
57 }
58 */
59
60 for (y = 0; y < 8; y++) {
61 printf("static const ulong64 sbox%d[] = {\n", y);
62 for (x = 0; x < 256; ) {
63 printf("CONST64(0x%02x%02x%02x%02x%02x%02x%02x%02x)",
64 gf_mul(sbox(x), cir[y][0]),
65 gf_mul(sbox(x), cir[y][1]),
66 gf_mul(sbox(x), cir[y][2]),
67 gf_mul(sbox(x), cir[y][3]),
68 gf_mul(sbox(x), cir[y][4]),
69 gf_mul(sbox(x), cir[y][5]),
70 gf_mul(sbox(x), cir[y][6]),
71 gf_mul(sbox(x), cir[y][7]));
72 if (x < 255) printf(", ");
73 if (!(++x & 3)) printf("\n");
74 }
75 printf("};\n\n");
76 }
77
78 printf("static const ulong64 cont[] = {\n");
79 for (y = 0; y <= 10; y++) {
80 printf("CONST64(0x");
81 for (x = 0; x < 8; x++) {
82 printf("%02x", sbox((8*y + x)&255));
83 }
84 printf("),\n");
85 }
86 printf("};\n\n");
87 return 0;
88
89 }
90
91
92
93 /* $Source: /cvs/libtom/libtomcrypt/notes/etc/whirlgen.c,v $ */
94 /* $Revision: 1.2 $ */
95 /* $Date: 2005/05/05 14:35:58 $ */