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