48 lines
1.2 KiB
Perl
48 lines
1.2 KiB
Perl
use LWP::Protocol::PSGI;
|
|
use MIME::Base64;
|
|
use Digest::HMAC_SHA1 qw(hmac_sha1 hmac_sha1_hex);
|
|
|
|
# Fake yubikeyserver will succed for any OTP whose unique partbegins with 1
|
|
# and fail when it begins with 2
|
|
# eg of valid OTP
|
|
# cccccccccccc 10000000000000000000
|
|
# ^ ^
|
|
# \-token ID \- time-dependant code
|
|
#
|
|
my $fake_yubikey_server = sub {
|
|
my $req = Plack::Request->new(@_);
|
|
my $otp = $req->parameters->{otp};
|
|
my $nonce = $req->parameters->{nonce};
|
|
my $id = substr $otp, 0, 12;
|
|
my $unique = substr $otp, 12;
|
|
my $status;
|
|
|
|
if ( $unique =~ /^1/ ) {
|
|
$status = "OK";
|
|
}
|
|
|
|
if ( $unique =~ /^2/ ) {
|
|
$status = "BAD_OTP";
|
|
}
|
|
|
|
my %res_without_hash = (
|
|
status => $status,
|
|
nonce => $nonce,
|
|
otp => $otp,
|
|
);
|
|
|
|
my $str = join '&',
|
|
map { $_ . "=" . $res_without_hash{$_} } sort keys(%res_without_hash);
|
|
my $hmac =
|
|
encode_base64( hmac_sha1( $str, decode_base64("cG9uZXk=") ), '' );
|
|
my %res = ( %res_without_hash, h => $hmac );
|
|
|
|
my $bytes = join "\r\n", map { $_ . "=" . $res{$_} } keys(%res);
|
|
return [ 200, [], [$bytes] ];
|
|
|
|
};
|
|
|
|
LWP::Protocol::PSGI->register($fake_yubikey_server);
|
|
|
|
1;
|