| Current Path : /usr/local/assp/ |
| Current File : //usr/local/assp/crypt.pl |
#!/usr/local/bin/perl
# crypting
# /usr/local/perls/perl-5.16.3/bin/perl crypt.pl SSLKeyFile /var/cpanel/ssl/cpanel/asspkey.pem
# SSLKeyFile /var/cpanel/ssl/cpanel/asspkey.pem fe8f3323a76b60b6ecf934dd4d6d11b6adb181181ad8feb95e31ca69a2435cc0d2e988ac61cafa510022180cdc
use strict;
use Net::POP3;
use Net::SMTP;
use IO::Socket;
use Time::Local;
use re 'eval';
STDOUT->autoflush;
STDERR->autoflush;
our $VERSION = $1 if('$Id: assp_pop3.pl,v 1.13 2013/09/12 09:30:00 TE Exp $' =~ /,v ([\d.]+) /);
##############################################################################
# set the next values to 1 if you want to test your POP3 collection externaly
# or use the command line option -nofork -debug
our $preventFORK = 0;
our $debug = 0;
##############################################################################
our %Config;
our $decriptthis = $ARGV[0];
our $value = $ARGV[1];
$preventFORK = 1 if (lc $ARGV[1] =~ /nofork/i || lc $ARGV[2] =~ /nofork/i);
$debug = 1 if (lc $ARGV[1] =~ /debug/i || lc $ARGV[2] =~ /debug/i);
# SSLKeyFile /var/cpanel/ssl/cpanel/asspkey.pem
&loadconfig();
our $asspCfgVersion = $Config{asspCfgVersion};
$asspCfgVersion =~ s/^(\d+\.\d+\.\d+).*/$1/;
$debug = $debug || $Config{debug} || $Config{POP3debug};
my $w = 'a-zA-Z0-9_';
my $d = '0-9';
our $punyRE = 'xn--[a-zA-Z0-9\-]+';
our $EmailAdrRe=qr/[^()<>@,;:"\[\]\000-\040\x7F-\xFF]+/o;
our $EmailDomainRe=qr/(?:[$w][$w\-]*(?:\.[$w][$w\-]*)*\.(?:$punyRE|[$w][$w]+)|\[[$d][$d\.]*\.[$d]+\])/o;
our $HeaderNameRe=qr/\S[^\r\n]*/o;
our $HeaderValueRe=qr/[ \t]*[^\r\n]*(?:\r?\n[ \t]+\S[^\r\n]*)*(?:\r?\n)?/o;
our $HeaderRe=qr/(?:$HeaderNameRe:$HeaderValueRe)/o;
our %accounts;
our $usedCrypt;
our $AvailCryptGhost = ASSP::CRYPT->new('a',0,0)->ENCRYPT('a') ne ASSP::CRYPT->new('a',0,1)->ENCRYPT('a');
#print "\n $decriptthis $value \n";
if ($value && $value =~ /^(?:[a-fA-F0-9]{2}){5,}$/o) {
if ($AvailCryptGhost && defined ASSP::CRYPT->new($Config{webAdminPassword},0,1)->DECRYPT($value)) {
$usedCrypt = 1; # can and use Crypt::GOST
} elsif ($AvailCryptGhost && defined ASSP::CRYPT->new($Config{webAdminPassword},0,0)->DECRYPT($value)) {
$usedCrypt = 0; # can but don't use Crypt::GOST
} elsif (defined ASSP::CRYPT->new($Config{webAdminPassword},0,0)->DECRYPT($value)) {
$usedCrypt = 0; # can't and don't use Crypt::GOST
} else {
print "";
}
} else {
$usedCrypt = 1;
}
sub loadconfig {
open( my $confFile, '<', "/usr/local/assp/assp.cfg" ) || die "error: cannot open \"/usr/local/assp/assp.cfg\": $!";
while (<$confFile>) {
s/\r|\n//go;
my ($k,$v) = split(/:=/,$_,2);
$Config{$k} = $v;
}
close $confFile;
}
sub tzStr {
my $minoffset = (Time::Local::timelocal(localtime()) - Time::Local::timelocal(gmtime()))/60;
my $sign=$minoffset<0?-1:+1;
$minoffset = abs($minoffset)+0.5;
my $tzoffset = 0;
$tzoffset = $sign * (int($minoffset/60)*100 + ($minoffset%60)) if $minoffset;
return sprintf("%+05d", $tzoffset);
}
sub headerWrap {
my $header=shift;
$header=~s/(?:([^\r\n]{60,75}?;)|([^\r\n]{60,75}) ) {0,5}(?=[^\r\n]{10,})/$1$2\r\n\t/g;
return $header;
}
package ASSP::CRYPT;
##################################
# based on GOST 28147-89 (Vipul Ved Prakash, 1997)
#
# GOST 28147-89 is a 64-bit symmetric block cipher
# with a 256-bit key developed in the former Soviet Union .
#
# redesigned and improved by Thomas Eckardt (2009,2013)
##################################
use strict qw(vars subs);
sub new {
my ($argument,$pass,$bin,$enh) = @_;
my $class = ref ($argument) || $argument;
my $self = {};
use bytes;
{
local $SIG{__WARN__} = sub {1};
$self->{useXS} = (defined($enh) ? $enh : ($main::usedCrypt > 0)) && $pass && eval('use Crypt::GOST();1;');
}
$self->{KEY} = [];
$self->{SBOX} = [];
$self->{BIN} = $bin;
if ($self->{useXS}) {
$pass .= $pass x int(32 / length($pass) + 1);
$pass = substr($pass , 0, 32);
$self->{useXS} = Crypt::GOST->new($pass);
}
$self->{PASS} = $pass;
if (! $self->{useXS} && $pass) {
_generate_sbox($self,$pass);
_generate_keys($self,$pass);
}
bless $self, $class;
return $self;
}
sub _generate_sbox {
my $self = shift;
my $passphrase = shift;
if (ref ($passphrase)) {
@{$self->{SBOX}} = @$passphrase;
} else {
my ($i, $x, $y, $random, @tmp) = 0;
my @temp = (0..15);
for ($i=0; $i <= (length $passphrase); $i+=4)
{ $random = $random ^ (unpack 'L', pack 'a4', substr ($passphrase, $i, $i+4)) };
srand $random;
for ($i=0; $i < 8; $i++) {
@tmp = @temp;
map { $x = _rand (15); $y = $tmp[$x]; $tmp[$x] = $tmp[$_]; $tmp[$_] = $y; } (0..15);
map {$self->{SBOX}->[$i][$_] = $tmp[$_] } (0..15);
}
}
}
sub _generate_keys {
my ($self, $passphrase) = @_;
if (ref ($passphrase)) {
@{$self->{KEY}} = @$passphrase;
} else {
my ($i, $random) = 0;
for ($i=0; $i <= (length $passphrase); $i+=4)
{ $random = $random ^ (unpack 'L', pack 'a4', substr ($passphrase, $i, $i+4))};
srand $random; map { $self->{KEY}[$_] = _rand (2**32) } (0..7);
}
}
sub _crypt {
my ($self, $data, $decrypt, $bin) = @_;
return $data unless $self->{PASS};
$bin = $bin || $self->{BIN};
my $l;
my $check;
my $cl = $bin ? 3 : 6;
my $ll = $bin ? 2 : 4;
if ($decrypt) {
$check = substr($data,length($data)-$cl,$cl);
$data = substr($data,0,length($data)-$cl);
$l = int(hex(_IH(substr($data,length($data)-$ll,$ll),$bin)));
$data = substr($data,0,length($data)-$ll);
$data = _HI($data,! $bin);
} else {
$check = _XOR_SYSV($data,$bin);
$l = length($data);
my $s = $l % 8;
$l = _HI(sprintf("%04x",($l % 65536)),$bin);
$data .= "\x5A" x (8-$s) if $s;
}
my ($d1, $d2) = (0,0);
my $return = '';
if ($self->{useXS}) {
for (unpack('(a8)*',$data)) {
$return .= ($decrypt) ? $self->{useXS}->decrypt($_) : $self->{useXS}->encrypt($_);
}
} else {
my @j =
map { $decrypt ? (($_ > 7) ? (31 - $_) % 8 : ($_ % 8))
: (($_ > 23) ? (31 - $_) : ($_ % 8));
} (0..31);
for (unpack('(a8)*',$data)) {
($d1,$d2) = unpack 'L2';
map { ($_ % 2) ? ($d1 ^= _substitute ($self, ($d2 + $self->{KEY}[$j[$_]])))
: ($d2 ^= _substitute ($self, ($d1 + $self->{KEY}[$j[$_]])));
} (0..31);
$return .= pack 'L2', $d2, $d1;
}
}
return _IH($return,! $bin).$l.$check unless ($decrypt);
$l += int(length($return)/65536) * 65536 if (length($return) > 65535);
$return = substr($return,0,$l);
return if _XOR_SYSV($return,$bin) ne $check;
return $return;
}
sub ENCRYPT {_crypt(shift,shift,0,0);}
sub DECRYPT {_crypt(shift,shift,1,0);}
sub ENCRYPTHEX {_crypt(shift,shift,0,1);}
sub DECRYPTHEX {_crypt(shift,shift,1,1);}
sub _substitute {
my ($self, $d) = @_;
my $return = 0;
map {$return |= $self->{SBOX}->[$_][$d >> ($_ << 2) & 15] << ($_ << 2)} reverse (0..7);
return $return << 11 | $return >> 21;
}
sub _rand {
return int (((shift) / 100) * ((rand) * 100));
}
sub _XOR_SYSV {
my ($d,$bin) = @_;
my $xor = 0x03 ^ 0x0d;
map { $xor ^= ord($_); } split(//o, $d);
return _HI(sprintf ("%02x", $xor),$bin) . _HI(sprintf("%04x",unpack("%32W*",$d) % 65535),$bin);
}
sub _SYSV {
my $d = shift;
my $checksum = 0;
foreach (split(//o,$d)) { $checksum += unpack("%16C*", $_) }
$checksum %= 65535;
return $checksum;
}
sub _IH {
my ($s,$do) = @_;
return $s unless $do;
return join('',unpack 'H*',$s);
}
sub _HI {
my ($h,$do) = @_;
return $h unless $do;
return pack 'H*',$h;
}
#1;
our $usedCrypt;
our $AvailCryptGhost = ASSP::CRYPT->new('a',0,0)->ENCRYPT('a') ne ASSP::CRYPT->new('a',0,1)->ENCRYPT('a');
if ($value && $value =~ /^(?:[a-fA-F0-9]{2}){5,}$/o) {
if ($AvailCryptGhost && defined ASSP::CRYPT->new($Config{webAdminPassword},0,1)->DECRYPT($value)) {
$usedCrypt = 1; # can and use Crypt::GOST
} elsif ($AvailCryptGhost && defined ASSP::CRYPT->new($Config{webAdminPassword},0,0)->DECRYPT($value)) {
$usedCrypt = 0; # can but don't use Crypt::GOST
} elsif (defined ASSP::CRYPT->new($Config{webAdminPassword},0,0)->DECRYPT($Config{adminusersdbpass})) {
$usedCrypt = 0; # can't and don't use Crypt::GOST
} else {
}
} else {
$usedCrypt = 1;
}
my $popcfg = $value;
my $enc = ASSP::CRYPT->new($Config{webAdminPassword},0);
$popcfg = $enc->ENCRYPT($popcfg);
print "$decriptthis $value $popcfg\n";