package Crypt;
# $Id: Crypt.pm,v 1.8 2000/08/05 16:03:16 tom Exp $
################################################################

=head1 NAME

Crypt - 暗号化パッケージ

=head1 SYNOPSIS

  $encrypted = Encrypt($password, $username);
  print "OK" if IsLegalPassword($inputed, $encrypted);

=cut

use strict;
use Exporter;
use vars qw(@EXPORT @ISA);
@ISA = qw(Exporter);
@EXPORT = qw(Encrypt IsLegalPassword);


=head2 Encrypt($password, $username);

$username をシードの一部として $password を暗号化する。

=cut

sub Encrypt($;$)
{
    my ($passwd, $username) = @_;

#    $username ||= substr($crypted, 0, 2);
    
    my ($p1, $p2) = unpack("C2", $username);
    
    my @saltset = ('a' .. 'z', 'A' .. 'Z', '0' .. '9', '.', '/');
    my $now = time;
    my $week = $now / (60*60*24*7) + $p1 + $p2;
    my $salt = $saltset[$week % 64] . $saltset[$now % 64];
    my $crypted = eval 'crypt($passwd, $salt)';
    $crypted = $passwd if ($crypted eq '');     # システムが実装していない
    return $crypted;
}


=head2 IsLegalPassword($password, $crypted);

パスワードが正しいか

=cut

sub IsLegalPassword($$)
{
    my ($passwd, $crypted) = @_;
    return 0 if ($crypted eq '');

    my $origin_crypted = eval q(crypt("$passwd", "$crypted"));
#    print STDERR "$passwd: $origin_crypted, $crypted\n";
    if ($@){                    # システムが実装していない
	return $passwd eq $crypted;   # 平文で比較
    } else {
	return $origin_crypted eq $crypted;
    }
}
1;
