chiark / gitweb /
Update for new keydata interface.
[catacomb-perl] / algs.PL
1 # -*-perl-*-
2 #
3 # $Id$
4 #
5 # Create tables of algorithms
6 #
7 # (c) 2001 Straylight/Edgeware
8 #
9
10 #----- Licensing notice -----------------------------------------------------
11 #
12 # This file is part of the Perl interface to Catacomb.
13 #
14 # Catacomb/Perl is free software; you can redistribute it and/or modify
15 # it under the terms of the GNU General Public License as published by
16 # the Free Software Foundation; either version 2 of the License, or
17 # (at your option) any later version.
18
19 # Catacomb/Perl is distributed in the hope that it will be useful,
20 # but WITHOUT ANY WARRANTY; without even the implied warranty of
21 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
22 # GNU General Public License for more details.
23
24 # You should have received a copy of the GNU General Public License
25 # along with Catacomb/Perl; if not, write to the Free Software Foundation,
26 # Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
27
28 @cipher = qw(des desx des3
29              blowfish twofish
30              cast128 cast256
31              idea safer safersk
32              rc2 rc5
33              square rijndael rijndael192 rijndael256
34              serpent noekeon
35              skipjack
36              mars
37              tea xtea);
38 @stream = qw(rc4 seal);
39 @hash = qw(md5 md4 md2 tiger has160
40            sha sha224 sha256 sha384 sha512 
41            rmd128 rmd160 rmd256 rmd320
42            whirlpool whirlpool256);
43
44 sub enum {
45   $x = shift;
46   if (!ref($x)) { return $x; }
47   elsif (ref($x) eq ARRAY) { return @$x }
48   else { die "bad ref"; }
49 }
50
51 sub cross {
52   my $x = [];
53   foreach my $i (@_) {
54     my @y = enum($i);
55     if (@$x) {
56       my @x = ();
57       foreach my $j (@$x) { foreach my $k (@y) { push(@x, $j.$k); } }
58       $x = \@x;
59     } else {
60       $x = \@y;
61     }
62   }
63   return @$x;
64 }
65
66 open OUT, "> $ARGV[0]" or die "couldn't write `$ARGV[0]': $!";
67
68 print OUT <<EOF;
69 /* -*-c-*-
70  *
71  * algs.c [generated]
72  */
73
74 #include "catacomb-perl.h"
75
76 EOF
77 print OUT cross("#include <catacomb/", \@cipher, ".h>\n"), "\n";
78 print OUT cross("#include <catacomb/", \@cipher, "-",
79                 [qw(counter ofb)], ".h>\n"), "\n";
80 print OUT cross("#include <catacomb/", \@hash, "-mgf.h>\n"), "\n";
81
82 print OUT <<EOF;
83
84 const struct randtab mgftab[] = {
85 EOF
86 foreach my $i (@hash) { print OUT "  { \"$i\", ${i}_mgfrand },\n"; }
87 print OUT <<EOF;
88   { 0, 0 }
89 };
90
91 const struct randtab ctrtab[] = {
92 EOF
93 foreach my $i (@cipher) { print OUT "  { \"$i\", ${i}_counterrand },\n"; }
94 print OUT <<EOF;
95   { 0, 0 }
96 };
97
98 const struct randtab ofbtab[] = {
99 EOF
100 foreach my $i (@cipher) { print OUT "  { \"$i\", ${i}_ofbrand },\n"; }
101 print OUT <<EOF;
102   { 0, 0 }
103 };
104 EOF
105
106 foreach my $i (@cipher) {
107   my $I = uc($i);
108   print OUT <<EOF;
109
110 static void init_$i(void *ctx, const void *k, size_t ksz) {
111   ${i}_init(ctx, k, ksz);
112 }
113 static void eblk_$i(const void *ctx, const void *in, void *out) {
114   uint32 w[${I}_BLKSZ / 4];
115   BLKC_LOAD(${I}, w, in);
116   ${i}_eblk(ctx, w, w);
117   BLKC_STORE(${I}, out, w);
118 }
119 static void dblk_$i(const void *ctx, const void *in, void *out) {
120   uint32 w[${I}_BLKSZ / 4];
121   BLKC_LOAD(${I}, w, in);
122   ${i}_dblk(ctx, w, w);
123   BLKC_STORE(${I}, out, w);
124 }
125 static PRPClass prp_$i = {
126   "$i",
127   ${i}_keysz, sizeof(${i}_ctx), ${I}_BLKSZ,
128   init_$i, eblk_$i, dblk_$i
129 };
130 EOF
131 }
132
133 print OUT <<EOF;
134
135 PRPClass *const prptab[] = {
136 EOF
137 foreach my $i (@cipher) {
138   print OUT "  &prp_$i,\n";
139 }
140 print OUT "  0\n};\n";
141
142 #----- That's all, folks ----------------------------------------------------