5 # Cryptographic algorithms
7 # (c) 2004 Straylight/Edgeware
10 #----- Licensing notice -----------------------------------------------------
12 # This file is part of the Perl interface to Catacomb.
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.
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.
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.
28 #----- Symmetric crypto algorithms -----------------------------------------
34 foreach my $i (qw(PRP Cipher Hash MAC
)) {
37 my $cl = "Catacomb::${i}Class";
38 foreach my $c (Catacomb
::list
($tag)) {
39 (my $x = $c) =~ tr/a-zA-Z0-9/_/cs;
44 $EXPORT_TAGS{$tag} = \
@v;
45 Exporter
::export_ok_tags
($tag);
48 package Catacomb
::PRPClass
;
52 croak
("Usage: Catacomb::PRPClass::eblk(pc, k, pt)") unless @_ == 3;
53 my ($pc, $k, $pt) = @_;
54 my $P = $pc->init($k);
59 croak
("Usage: Catacomb::PRPClass::dblk(pc, k, ct)") unless @_ == 3;
60 my ($pc, $k, $pt) = @_;
61 my $P = $pc->init($k);
65 package Catacomb
::CipherClass
;
69 croak
("Usage: Catacomb::CipherClass::encrypt(cc, k, [iv], plain)")
71 my ($cc, $k, $iv, $p) = @_;
76 my $c = $cc->init($k);
77 $c->setiv($iv) if defined($iv);
78 return $c->encrypt($p);
82 croak
("Usage: Catacomb::CipherClass::fill(cc, k, [iv], len)")
84 my ($cc, $k, $iv, $len) = @_;
89 my $c = $cc->init($k);
90 $c->setiv($iv) if defined($iv);
91 return $c->fill($len);
95 croak
("Usage: Catacomb::CipherClass::decrypt(cc, k, [iv], cipher)")
97 my ($cc, $k, $iv, $p) = @_;
102 my $c = $cc->init($k);
103 $c->setiv($iv) if defined($iv);
104 return $c->decrypt($p);
108 croak
("Usage: Catacomb::CipherClass::filldecrypt(cc, k, [iv], len)")
110 my ($cc, $k, $iv, $len) = @_;
115 my $c = $cc->init($k);
116 $c->setiv($iv) if defined($iv);
117 return $c->filldecrypt($len);
120 package Catacomb
::HashClass
;
124 croak
("Usage: Catacomb::HashClass::hash(hc, p)") unless @_ == 2;
131 package Catacomb
::MACClass
;
135 croak
("Usage: Catacomb::MACClass::mac(mc, k, p)") unless @_ == 3;
136 my ($mc, $k, $p) = @_;
137 my $m = $mc->key($k);
141 package Catacomb
::MAC
;
145 croak
("Usage: Catacomb::MAC::hash(m, p)") unless @_ == 2;
152 #----- DSA and KCDSA signing ------------------------------------------------
154 package Catacomb
::DSA
;
157 croak
("Usage: ${me}::new(me, info)") unless @_ == 2;
158 my ($me, $info) = @_;
159 return bless $info, $me;
162 *Catacomb
::KCDSA
::new
= \
&new
;
164 foreach my $i (qw(DSA KCDSA
)) {
165 @
{"Catacomb::${i}::Public::ISA"} = ("Catacomb::${i}");
166 @
{"Catacomb::${i}::Private::ISA"} = ("Catacomb::${i}::Public");
169 #----- RSA signing and encryption -------------------------------------------
171 package Catacomb
::RSA
::Pad
;
175 croak
("Usage: ${me}::new(me, info)") unless @_ == 2;
176 my ($me, $info) = @_;
177 return bless $info, $me;
180 foreach my $i (qw(PKCS1Crypt PKCS1Sign OAEP PSS
)) {
181 @
{"Catacomb::RSA::${i}::ISA"} = qw(Catacomb
::RSA
::Pad
);
184 package Catacomb
::RSA
::Public
;
190 croak
("Usage: Catacomb::RSA::Public::encrypt(pub, pad, msg)")
192 my ($pub, $pad, $msg) = @_;
194 my $r = $pad->pad($msg, $n->octets(), $n->bits());
195 return undef unless defined($r);
200 croak
("Usage: Catacomb::RSA::Public::verify(pub, pad, sig, [msg])")
201 unless @_ >= 3 && @_ <= 4;
202 my ($pub, $pad, $sig, $msg) = @_;
204 my $rc = $pad->unpad($pub->op($sig), $msg, $n->octets(), $n->bits());
205 return undef unless defined($rc);
207 return undef unless $rc eq "" || $rc eq $msg;
214 package Catacomb
::RSA
::Private
;
220 croak
("Usage: Catacomb::RSA::Private::sign(priv, pad, msg, [rng]")
221 unless @_ >= 3 && @_ <= 4;
222 my ($priv, $pad, $msg, $rng) = @_;
224 my $r = $pad->pad($msg, $n->octets(), $n->bits());
225 return undef unless defined($r);
226 return $priv->op($r, $rng);
230 croak
("Usage: Catacomb::RSA::Private::decrypt(priv, pad, ct, [rng]")
231 unless @_ >= 3 && @_ <= 4;
232 my ($priv, $pad, $ct, $rng) = @_;
234 return $pad->unpad($priv->op($ct, $rng), $n->octets(), $n->bits());
237 #----- That's all, folks ----------------------------------------------------