No empty .Rs/.Re
[netbsd-mini2440.git] / crypto / dist / heimdal / lib / hcrypto / gen-des.pl
blob98a354bba61505318102e6441d3f99fb2acd0d8a
1 #!/usr/pkg/bin/perl
3 # $Heimdal: gen-des.pl 14606 2005-03-01 11:43:01Z lha $
4 # $NetBSD$
6 use strict;
8 print "/* GENERATE FILE from gen-des.pl, do not edit */\n\n";
10 my $gen = 1;
12 sub gen_pattern
14 my $n = shift;
15 my $r = shift;
16 my $a = shift;
17 my $o = shift;
18 my $s = shift;
19 print "/* $n bit pattern ";
20 foreach my $k (@$a) {
21 print "$k ";
23 print "*/\n";
24 print "static int $n\[", $r + 1, "\] = {\n ";
25 foreach my $i (0..$r) {
26 my $j = 0;
27 my $b = 1;
28 foreach my $k (reverse @$a) {
29 if ($i & $b) {
30 $j |= ($s >>($k - $o - 1));
32 $b = $b << 1;
34 printf "0x%08x", $j;
35 print ", " if ($i != $r);
36 if (($i % 4) == 3) {
37 print "\n";
38 print " " if ($i != $r);
41 print "};\n";
44 if ($gen) {
45 gen_pattern("pc1_c_3", 7, [ 5, 13, 21 ], 0, 0x1000000);
46 gen_pattern("pc1_c_4", 15, [ 1, 9, 17, 25 ], 0, 0x1000000);
47 gen_pattern("pc1_d_3", 7, [ 49, 41, 33 ], 32, 0x1000000);
48 gen_pattern("pc1_d_4", 15, [ 57, 53, 45, 37 ], 32, 0x1000000);
50 gen_pattern("pc2_c_1", 63, [ 5, 24, 7, 16, 6, 10 ], 0, 0x800000);
51 gen_pattern("pc2_c_2", 63, [ 20, 18, 12, 3, 15, 23 ], 0, 0x800000);
52 gen_pattern("pc2_c_3", 63, [ 1, 9, 19, 2, 14, 22 ], 0, 0x800000);
53 gen_pattern("pc2_c_4", 63, [ 11, 13, 4, 17, 21, 8 ], 0, 0x800000);
55 gen_pattern("pc2_d_1", 63, [ 51, 35, 31, 52, 39, 45 ], 28, 0x800000);
56 gen_pattern("pc2_d_2", 63, [ 50, 32, 43, 36, 29, 48 ], 28, 0x800000);
57 gen_pattern("pc2_d_3", 63, [ 41, 38, 47, 33, 40, 42 ], 28, 0x800000);
58 gen_pattern("pc2_d_4", 63, [ 49, 37, 30, 46, 34, 44 ], 28, 0x800000);
61 sub
62 pbox_mutation
64 my $n = shift;
65 my $res = 0;
67 my @pbox = (
68 16, 7, 20, 21,
69 29, 12, 28, 17,
70 1, 15, 23, 26,
71 5, 18, 31, 10,
72 2, 8, 24, 14,
73 32, 27, 3, 9,
74 19, 13, 30, 6,
75 22, 11, 4, 25
78 foreach my $i (0..31) {
79 if ($n & (1 << ($pbox[$i] - 1))) {
80 # print "$i ", ($pbox[$i] - 1), "\n";
81 $res |= 1 << $i;
85 return $res;
89 my @S1 = (
90 14, 4, 13, 1, 2, 15, 11, 8, 3, 10, 6, 12, 5, 9, 0, 7,
91 0, 15, 7, 4, 14, 2, 13, 1, 10, 6, 12, 11, 9, 5, 3, 8,
92 4, 1, 14, 8, 13, 6, 2, 11, 15, 12, 9, 7, 3, 10, 5, 0,
93 15, 12, 8, 2, 4, 9, 1, 7, 5, 11, 3, 14, 10, 0, 6, 13,
95 my @S2 = (
96 15, 1, 8, 14, 6, 11, 3, 4, 9, 7, 2, 13, 12, 0, 5, 10,
97 3, 13, 4, 7, 15, 2, 8, 14, 12, 0, 1, 10, 6, 9, 11, 5,
98 0, 14, 7, 11, 10, 4, 13, 1, 5, 8, 12, 6, 9, 3, 2, 15,
99 13, 8, 10, 1, 3, 15, 4, 2, 11, 6, 7, 12, 0, 5, 14, 9,
101 my @S3 = (
102 10, 0, 9, 14, 6, 3, 15, 5, 1, 13, 12, 7, 11, 4, 2, 8,
103 13, 7, 0, 9, 3, 4, 6, 10, 2, 8, 5, 14, 12, 11, 15, 1,
104 13, 6, 4, 9, 8, 15, 3, 0, 11, 1, 2, 12, 5, 10, 14, 7,
105 1, 10, 13, 0, 6, 9, 8, 7, 4, 15, 14, 3, 11, 5, 2, 12,
107 my @S4 = (
108 7, 13, 14, 3, 0, 6, 9, 10, 1, 2, 8, 5, 11, 12, 4, 15,
109 13, 8, 11, 5, 6, 15, 0, 3, 4, 7, 2, 12, 1, 10, 14, 9,
110 10, 6, 9, 0, 12, 11, 7, 13, 15, 1, 3, 14, 5, 2, 8, 4,
111 3, 15, 0, 6, 10, 1, 13, 8, 9, 4, 5, 11, 12, 7, 2, 14,
113 my @S5 = (
114 2, 12, 4, 1, 7, 10, 11, 6, 8, 5, 3, 15, 13, 0, 14, 9,
115 14, 11, 2, 12, 4, 7, 13, 1, 5, 0, 15, 10, 3, 9, 8, 6,
116 4, 2, 1, 11, 10, 13, 7, 8, 15, 9, 12, 5, 6, 3, 0, 14,
117 11, 8, 12, 7, 1, 14, 2, 13, 6, 15, 0, 9, 10, 4, 5, 3,
119 my @S6 = (
120 12, 1, 10, 15, 9, 2, 6, 8, 0, 13, 3, 4, 14, 7, 5, 11,
121 10, 15, 4, 2, 7, 12, 9, 5, 6, 1, 13, 14, 0, 11, 3, 8,
122 9, 14, 15, 5, 2, 8, 12, 3, 7, 0, 4, 10, 1, 13, 11, 6,
123 4, 3, 2, 12, 9, 5, 15, 10, 11, 14, 1, 7, 6, 0, 8, 13,
125 my @S7 = (
126 4, 11, 2, 14, 15, 0, 8, 13, 3, 12, 9, 7, 5, 10, 6, 1,
127 13, 0, 11, 7, 4, 9, 1, 10, 14, 3, 5, 12, 2, 15, 8, 6,
128 1, 4, 11, 13, 12, 3, 7, 14, 10, 15, 6, 8, 0, 5, 9, 2,
129 6, 11, 13, 8, 1, 4, 10, 7, 9, 5, 0, 15, 14, 2, 3, 12,
132 my @S8 = (
133 13, 2, 8, 4, 6, 15, 11, 1, 10, 9, 3, 14, 5, 0, 12, 7,
134 1, 15, 13, 8, 10, 3, 7, 4, 12, 5, 6, 11, 0, 14, 9, 2,
135 7, 11, 4, 1, 9, 12, 14, 2, 0, 6, 10, 13, 15, 3, 5, 8,
136 2, 1, 14, 7, 4, 10, 8, 13, 15, 12, 9, 0, 3, 5, 6, 11,
139 my @SBox = ( \@S1, \@S2, \@S3, \@S4, \@S5, \@S6, \@S7, \@S8 );
142 one_num_in_one_sbox
144 my $i = shift;
145 my $n = shift;
146 my $r = shift;
148 my $index = (($n & 1) << 4) | (($n & 0x20)) |
149 (($n >> 1) & 0x1) << 0 |
150 (($n >> 2) & 0x1) << 1 |
151 (($n >> 3) & 0x1) << 2 |
152 (($n >> 4) & 0x1) << 3;
154 die "argh" if ($index > 63 || $index < 0);
156 my $S = $SBox[$i - 1];
157 my $val = $$S[$index];
159 my $res = $val << (($i - 1) * 4);
161 my $p = &pbox_mutation($res);
163 print " $r ";
165 # $p = ($p >> $r) | ($p << (32 - $r - 1));
167 printf "0x%08x", $p;
168 print ", " if ($n != 63 or 1);
169 if (($n % 4) == 3) {
170 print " /* $i */" if ($n == 3);
171 print "\n";
172 print "\t" if ($n != 63);
177 one_sbox
179 my $i = shift;
180 my $s = 0;
182 # print "static uint32_t sbox". $i ."[] = {\n\t";
183 print "\t";
184 foreach my $n (0..63) {
185 one_num_in_one_sbox($i, $n, $s);
187 print "\n";
188 # print "};\n";
191 if ($gen and 0) {
192 foreach my $sbox (7, 1, 3, 5, 4, 6, 8, 2) {
193 one_sbox($sbox, 1);
197 #my $num = 1;
198 #printf "pbox: %d -> 0x%08x\n", $num, pbox_mutation($num);
199 #$num = 0xc000000;
200 #printf "pbox: 0x%08x -> 0x%08x\n", $num, pbox_mutation($num);
202 print "static unsigned char odd_parity[256] = { \n";
203 foreach my $i (0..255) {
204 my $num = 0;
205 foreach my $b (1..7) {
206 $num++ if (($i >> $b) & 1);
208 my $t;
209 if (($num & 1) == 0) {
210 $t = $i | 1;
211 } else {
212 $t = 0xfe & $i;
214 printf "%3d,", $t;
215 printf "\n" if (($i % 16) == 15);
218 print " };\n";