freebsd-dev/crypto/libdes/shifts.pl
1999-09-04 12:45:43 +00:00

199 lines
2.3 KiB
Perl

#!/usr/local/bin/perl
sub lab_shift
{
local(*a,$n)=@_;
local(@r,$i,$j,$k,$d,@z);
@r=&shift(*a,$n);
foreach $i (0 .. 31)
{
@z=split(/\^/,$r[$i]);
for ($j=0; $j <= $#z; $j++)
{
($d)=($z[$j] =~ /^(..)/);
($k)=($z[$j] =~ /\[(.*)\]$/);
$k.=",$n" if ($k ne "");
$k="$n" if ($k eq "");
$d="$d[$k]";
$z[$j]=$d;
}
$r[$i]=join('^',@z);
}
return(@r);
}
sub shift
{
local(*a,$n)=@_;
local(@f);
if ($n > 0)
{
@f=&shiftl(*a,$n);
}
else
{
@f=&shiftr(*a,-$n);
}
return(@f);
}
sub rotate
{
local(*a,$n)=@_;
local(@f);
if ($n > 0)
{ @f=&rotatel(*a,$n); }
else
{ @f=&rotater(*a,-$n); }
return(@f);
}
sub rotater
{
local(*a,$n)=@_;
local(@f,@g);
@f=&shiftr(*a,$n);
@g=&shiftl(*a,32-$n);
$#f=31;
$#g=31;
return(&or(*f,*g));
}
sub rotatel
{
local(*a,$n)=@_;
local(@f,@g);
@f=&shiftl(*a,$n);
@g=&shiftr(*a,32-$n);
$#f=31;
$#g=31;
return(&or(*f,*g));
}
sub shiftr
{
local(*a,$n)=@_;
local(@r,$i);
$#r=31;
foreach $i (0 .. 31)
{
if (($i+$n) > 31)
{
$r[$i]="--";
}
else
{
$r[$i]=$a[$i+$n];
}
}
return(@r);
}
sub shiftl
{
local(*a,$n)=@_;
local(@r,$i);
$#r=31;
foreach $i (0 .. 31)
{
if ($i < $n)
{
$r[$i]="--";
}
else
{
$r[$i]=$a[$i-$n];
}
}
return(@r);
}
sub printit
{
local(@a)=@_;
local($i);
foreach $i (0 .. 31)
{
printf "%2s ",$a[$i];
print "\n" if (($i%8) == 7);
}
print "\n";
}
sub xor
{
local(*a,*b)=@_;
local(@r,$i);
$#r=31;
foreach $i (0 .. 31)
{
$r[$i]=&compress($a[$i].'^'.$b[$i]);
# $r[$i]=$a[$i]."^".$b[$i];
}
return(@r);
}
sub and
{
local(*a,$m)=@_;
local(@r,$i);
$#r=31;
foreach $i (0 .. 31)
{
$r[$i]=(($m & (1<<$i))?($a[$i]):('--'));
}
return(@r);
}
sub or
{
local(*a,*b)=@_;
local(@r,$i);
$#r=31;
foreach $i (0 .. 31)
{
$r[$i]='--' if (($a[$i] eq '--') && ($b[$i] eq '--'));
$r[$i]=$a[$i] if (($a[$i] ne '--') && ($b[$i] eq '--'));
$r[$i]=$b[$i] if (($a[$i] eq '--') && ($b[$i] ne '--'));
$r[$i]='++' if (($a[$i] ne '--') && ($b[$i] ne '--'));
}
return(@r);
}
sub compress
{
local($s)=@_;
local($_,$i,@a,%a,$r);
$s =~ s/\^\^/\^/g;
$s =~ s/^\^//;
$s =~ s/\^$//;
@a=split(/\^/,$s);
while ($#a >= 0)
{
$_=shift(@a);
next unless /\d/;
$a{$_}++;
}
foreach $i (sort keys %a)
{
next if ($a{$i}%2 == 0);
$r.="$i^";
}
chop($r);
return($r);
}
1;