source: heimdal/trunk/lib/hcrypto/gen-des.pl@ 4

Last change on this file since 4 was 1, checked in by Paul Smedley, 10 years ago

Initial commit of Heimdal 1.5.3

File size: 5.4 KB
Line 
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";
Note: See TracBrowser for help on using the repository browser.