1#!/usr/pkg/bin/perl
2#
3# $Id$
4
5use strict;
6
7print "/* GENERATE FILE from gen-des.pl, do not edit */\n\n";
8
9my $gen = 1;
10
11sub gen_pattern
12{
13    my $n = shift;
14    my $r = shift;
15    my $a = shift;
16    my $o = shift;
17    my $s = shift;
18    print "/* $n bit pattern ";
19    foreach my $k (@$a) {
20	print "$k ";
21    }
22    print "*/\n";
23    print "static int $n\[", $r + 1, "\] = {\n    ";
24    foreach my $i (0..$r) {
25	my $j = 0;
26	my $b = 1;
27	foreach my $k (reverse @$a) {
28	    if ($i & $b) {
29		$j |= ($s >>($k - $o - 1));
30	    }
31	    $b = $b << 1;
32	}
33        printf "0x%08x", $j;
34	print ", " if ($i != $r);
35        if (($i % 4) == 3) {
36		print "\n";
37		print "    " if ($i != $r);
38	}
39    }
40    print "};\n";
41}
42
43if ($gen) {
44    gen_pattern("pc1_c_3", 7,  [ 5, 13, 21 ], 0, 0x1000000);
45    gen_pattern("pc1_c_4", 15, [ 1, 9, 17, 25 ], 0, 0x1000000);
46    gen_pattern("pc1_d_3", 7, [ 49, 41, 33 ], 32, 0x1000000);
47    gen_pattern("pc1_d_4", 15, [ 57, 53, 45, 37 ], 32, 0x1000000);
48
49    gen_pattern("pc2_c_1", 63, [  5, 24,  7, 16,  6, 10 ], 0, 0x800000);
50    gen_pattern("pc2_c_2", 63, [ 20, 18, 12,  3, 15, 23 ], 0, 0x800000);
51    gen_pattern("pc2_c_3", 63, [  1,  9, 19,  2, 14, 22 ], 0, 0x800000);
52    gen_pattern("pc2_c_4", 63, [ 11, 13,  4, 17, 21,  8 ], 0, 0x800000);
53
54    gen_pattern("pc2_d_1", 63, [ 51, 35, 31, 52, 39, 45 ], 28, 0x800000);
55    gen_pattern("pc2_d_2", 63, [ 50, 32, 43, 36, 29, 48 ], 28, 0x800000);
56    gen_pattern("pc2_d_3", 63, [ 41, 38, 47, 33, 40, 42 ], 28, 0x800000);
57    gen_pattern("pc2_d_4", 63, [ 49, 37, 30, 46, 34, 44 ], 28, 0x800000);
58}
59
60sub
61pbox_mutation
62{
63    my $n = shift;
64    my $res = 0;
65
66    my @pbox = (
67		16,   7,  20,  21,
68		29,  12,  28,  17,
69		1,   15,  23,  26,
70		5,   18,  31,  10,
71		2,    8,  24,  14,
72		32,  27,   3,   9,
73		19,  13,  30,   6,
74		22,  11,   4,  25
75		);
76
77    foreach my $i (0..31) {
78	if ($n & (1 << ($pbox[$i] - 1))) {
79#	    print "$i ", ($pbox[$i] - 1), "\n";
80	    $res |= 1 << $i;
81	}
82    }
83
84    return $res;
85}
86
87
88my @S1 = (
89	  14, 4, 13, 1, 2, 15, 11, 8, 3, 10, 6, 12, 5, 9, 0, 7,
90	  0, 15, 7, 4, 14, 2, 13, 1, 10, 6, 12, 11, 9, 5, 3, 8,
91	  4, 1, 14, 8, 13, 6, 2, 11, 15, 12, 9, 7, 3, 10, 5, 0,
92	  15, 12, 8, 2, 4, 9, 1, 7, 5, 11, 3, 14, 10, 0, 6, 13,
93	  );
94my @S2 = (
95	  15, 1, 8, 14, 6, 11, 3, 4, 9, 7, 2, 13, 12, 0, 5, 10,
96	  3, 13, 4, 7, 15, 2, 8, 14, 12, 0, 1, 10, 6, 9, 11, 5,
97	  0, 14, 7, 11, 10, 4, 13, 1, 5, 8, 12, 6, 9, 3, 2, 15,
98	  13, 8, 10, 1, 3, 15, 4, 2, 11, 6, 7, 12, 0, 5, 14, 9,
99	  );
100my @S3 = (
101	  10, 0, 9, 14, 6, 3, 15, 5, 1, 13, 12, 7, 11, 4, 2, 8,
102	  13, 7, 0, 9, 3, 4, 6, 10, 2, 8, 5, 14, 12, 11, 15, 1,
103	  13, 6, 4, 9, 8, 15, 3, 0, 11, 1, 2, 12, 5, 10, 14, 7,
104	  1, 10, 13, 0, 6, 9, 8, 7, 4, 15, 14, 3, 11, 5, 2, 12,
105	  );
106my @S4 = (
107	  7, 13, 14, 3, 0, 6, 9, 10, 1, 2, 8, 5, 11, 12, 4, 15,
108	  13, 8, 11, 5, 6, 15, 0, 3, 4, 7, 2, 12, 1, 10, 14, 9,
109	  10, 6, 9, 0, 12, 11, 7, 13, 15, 1, 3, 14, 5, 2, 8, 4,
110	  3, 15, 0, 6, 10, 1, 13, 8, 9, 4, 5, 11, 12, 7, 2, 14,
111	  );
112my @S5 = (
113	  2, 12, 4, 1, 7, 10, 11, 6, 8, 5, 3, 15, 13, 0, 14, 9,
114	  14, 11, 2, 12, 4, 7, 13, 1, 5, 0, 15, 10, 3, 9, 8, 6,
115	  4, 2, 1, 11, 10, 13, 7, 8, 15, 9, 12, 5, 6, 3, 0, 14,
116	  11, 8, 12, 7, 1, 14, 2, 13, 6, 15, 0, 9, 10, 4, 5, 3,
117	  );
118my @S6 = (
119	  12, 1, 10, 15, 9, 2, 6, 8, 0, 13, 3, 4, 14, 7, 5, 11,
120	  10, 15, 4, 2, 7, 12, 9, 5, 6, 1, 13, 14, 0, 11, 3, 8,
121	  9, 14, 15, 5, 2, 8, 12, 3, 7, 0, 4, 10, 1, 13, 11, 6,
122	  4, 3, 2, 12, 9, 5, 15, 10, 11, 14, 1, 7, 6, 0, 8, 13,
123	  );
124my @S7 = (
125	  4, 11, 2, 14, 15, 0, 8, 13, 3, 12, 9, 7, 5, 10, 6, 1,
126	  13, 0, 11, 7, 4, 9, 1, 10, 14, 3, 5, 12, 2, 15, 8, 6,
127	  1, 4, 11, 13, 12, 3, 7, 14, 10, 15, 6, 8, 0, 5, 9, 2,
128	  6, 11, 13, 8, 1, 4, 10, 7, 9, 5, 0, 15, 14, 2, 3, 12,
129	  );
130
131my @S8 = (
132	  13, 2, 8, 4, 6, 15, 11, 1, 10, 9, 3, 14, 5, 0, 12, 7,
133	  1, 15, 13, 8, 10, 3, 7, 4, 12, 5, 6, 11, 0, 14, 9, 2,
134	  7, 11, 4, 1, 9, 12, 14, 2, 0, 6, 10, 13, 15, 3, 5, 8,
135	  2, 1, 14, 7, 4, 10, 8, 13, 15, 12, 9, 0, 3, 5, 6, 11,
136	  );
137
138my @SBox = ( \@S1, \@S2, \@S3, \@S4, \@S5, \@S6, \@S7, \@S8 );
139
140sub
141one_num_in_one_sbox
142{
143    my $i = shift;
144    my $n = shift;
145    my $r = shift;
146
147    my $index = (($n & 1) << 4) | (($n & 0x20)) |
148	(($n >> 1) & 0x1) << 0 |
149	(($n >> 2) & 0x1) << 1 |
150	(($n >> 3) & 0x1) << 2 |
151	(($n >> 4) & 0x1) << 3;
152
153    die "argh" if ($index > 63 || $index < 0);
154
155    my $S = $SBox[$i - 1];
156    my $val = $$S[$index];
157
158    my $res = $val << (($i - 1) * 4);
159
160    my $p = &pbox_mutation($res);
161
162    print " $r ";
163
164#    $p = ($p >> $r) | ($p << (32 - $r - 1));
165
166    printf "0x%08x", $p;
167    print ", " if ($n != 63 or 1);
168    if (($n % 4) == 3) {
169	print " /* $i */" if ($n == 3);
170	print "\n";
171	print "\t" if ($n != 63);
172    }
173}
174
175sub
176one_sbox
177{
178    my $i = shift;
179    my $s = 0;
180
181#    print "static uint32_t sbox". $i ."[] = {\n\t";
182    print "\t";
183    foreach my $n (0..63) {
184	one_num_in_one_sbox($i, $n, $s);
185    }
186    print "\n";
187#    print "};\n";
188}
189
190if ($gen and 0) {
191    foreach my $sbox (7, 1, 3, 5, 4, 6, 8, 2) {
192	one_sbox($sbox, 1);
193    }
194}
195
196#my $num = 1;
197#printf "pbox: %d -> 0x%08x\n", $num, pbox_mutation($num);
198#$num = 0xc000000;
199#printf "pbox: 0x%08x -> 0x%08x\n", $num, pbox_mutation($num);
200
201print "static unsigned char odd_parity[256] = { \n";
202foreach my $i (0..255) {
203    my $num = 0;
204    foreach my $b (1..7) {
205	$num++ if (($i >> $b) & 1);
206    }
207    my $t;
208    if (($num & 1) == 0) {
209	$t = $i | 1;
210    } else {
211	$t = 0xfe & $i;
212    }
213    printf "%3d,", $t;
214    printf "\n" if (($i % 16) == 15);
215
216};
217print " };\n";
218