Much wider support for Catacomb in all its glory.
[catacomb-perl] / algs.PL
CommitLineData
660b443c 1# -*-perl-*-
2#
a1a90aaf 3# $Id$
660b443c 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
660b443c 28@cipher = qw(des desx des3
29 blowfish twofish
30 cast128 cast256
31 idea safer safersk
32 rc2 rc5
33 square rijndael rijndael192 rijndael256
a1a90aaf 34 serpent noekeon
660b443c 35 skipjack
36 mars
37 tea xtea);
38@stream = qw(rc4 seal);
a1a90aaf 39@hash = qw(md5 md4 md2 tiger has160
40 sha sha224 sha256 sha384 sha512
660b443c 41 rmd128 rmd160 rmd256 rmd320);
42
43sub enum {
44 $x = shift;
45 if (!ref($x)) { return $x; }
46 elsif (ref($x) eq ARRAY) { return @$x }
47 else { die "bad ref"; }
48}
49
50sub cross {
51 my $x = [];
52 foreach my $i (@_) {
53 my @y = enum($i);
54 if (@$x) {
55 my @x = ();
56 foreach my $j (@$x) { foreach my $k (@y) { push(@x, $j.$k); } }
57 $x = \@x;
58 } else {
59 $x = \@y;
60 }
61 }
62 return @$x;
63}
64
fcd15e0b 65open OUT, "> $ARGV[0]" or die "couldn't write `$ARGV[0]': $!";
660b443c 66
67print OUT <<EOF;
68/* -*-c-*-
69 *
70 * algs.c [generated]
71 */
72
73#include "catacomb-perl.h"
74
660b443c 75EOF
fcd15e0b 76print OUT cross("#include <catacomb/", \@cipher, ".h>\n"), "\n";
660b443c 77print OUT cross("#include <catacomb/", \@cipher, "-",
a1a90aaf 78 [qw(counter ofb)], ".h>\n"), "\n";
79print OUT cross("#include <catacomb/", \@hash, "-mgf.h>\n"), "\n";
660b443c 80
660b443c 81print OUT <<EOF;
660b443c 82
83const struct randtab mgftab[] = {
84EOF
85foreach my $i (@hash) { print OUT " { \"$i\", ${i}_mgfrand },\n"; }
86print OUT <<EOF;
87 { 0, 0 }
88};
89
90const struct randtab ctrtab[] = {
91EOF
92foreach my $i (@cipher) { print OUT " { \"$i\", ${i}_counterrand },\n"; }
93print OUT <<EOF;
94 { 0, 0 }
95};
96
97const struct randtab ofbtab[] = {
98EOF
99foreach my $i (@cipher) { print OUT " { \"$i\", ${i}_ofbrand },\n"; }
100print OUT <<EOF;
101 { 0, 0 }
102};
103EOF
104
fcd15e0b 105foreach my $i (@cipher) {
106 my $I = uc($i);
107 print OUT <<EOF;
108
109static void init_$i(void *ctx, const void *k, size_t ksz) {
110 ${i}_init(ctx, k, ksz);
111}
112static void eblk_$i(const void *ctx, const void *in, void *out) {
113 uint32 w[${I}_BLKSZ / 4];
114 BLKC_LOAD(${I}, w, in);
115 ${i}_eblk(ctx, w, w);
116 BLKC_STORE(${I}, out, w);
117}
118static void dblk_$i(const void *ctx, const void *in, void *out) {
119 uint32 w[${I}_BLKSZ / 4];
120 BLKC_LOAD(${I}, w, in);
121 ${i}_dblk(ctx, w, w);
122 BLKC_STORE(${I}, out, w);
123}
124static PRPClass prp_$i = {
125 "$i",
126 ${i}_keysz, sizeof(${i}_ctx), ${I}_BLKSZ,
127 init_$i, eblk_$i, dblk_$i
128};
129EOF
130}
131
132print OUT <<EOF;
133
134PRPClass *const prptab[] = {
135EOF
136foreach my $i (@cipher) {
137 print OUT " &prp_$i,\n";
138}
139print OUT " 0\n};\n";
140
660b443c 141#----- That's all, folks ----------------------------------------------------