%PDF- %PDF-
Direktori : /home/opti/optisoftcom/.cpanm/work/1544535406.20768/Authen-SCRAM-0.011/t/lib/ |
Current File : /home/opti/optisoftcom/.cpanm/work/1544535406.20768/Authen-SCRAM-0.011/t/lib/TestSCRAM.pm |
use 5.008001; use strict; use warnings; package TestSCRAM; use Encode qw/encode_utf8/; use MIME::Base64 qw/decode_base64/; use PBKDF2::Tiny qw/derive digest_fcn hmac/; use base 'Exporter'; our @EXPORT = qw/get_client get_server get_cred check_proxy/; my ( $sha1, $sha1_block ) = digest_fcn('SHA-1'); # username => [ base64-salt, password, iterations ] # entry 'user' matches example from RFC 5802 my %CRED_INPUTS = ( user => [ 'QSXCR+Q6sek8bf92', 'pencil', 4096 ], johndoe => [ 'saltSALTsaltSALT', 'passPASSpass', 4096 ], "johnd\N{U+110B}oe" => [ 'salt', "pass\N{U+110B}PASSpass", 4096 ], ); # username => [ salt, stored key, server key, iterations ]; my %CRED; for my $user ( keys %CRED_INPUTS ) { my ( $salt, $pw, $i ) = @{ $CRED_INPUTS{$user} }; $salt = decode_base64($salt); my $salted_password = derive( 'SHA-1', encode_utf8($pw), $salt, $i ); my $client_key = _hmac( $salted_password, "Client Key" ); my $stored_key = $sha1->($client_key); my $server_key = _hmac( $salted_password, "Server Key" ); $CRED{$user} = [ $salt, $stored_key, $server_key, $i ]; } # username (can act as) authz_id my %VALID_PROXY = ( johndoe => 'admin', "johnd\N{U+110B}oe" => "admi\N{U+110B}n" ); sub _hmac { my ( $key, $data ) = @_; $key = $sha1->($key) if length($key) > $sha1_block; return hmac( $data, $key, $sha1, $sha1_block ); } sub check_proxy { my ( $user, $authz ) = @_; return ( ( $VALID_PROXY{$user} || '' ) eq $authz ); } sub get_cred { my $user = shift; return @{ $CRED{$user} || [] }; } sub get_client { require Authen::SCRAM::Client; return Authen::SCRAM::Client->new( username => 'user', password => 'pencil', @_ ); } sub get_server { require Authen::SCRAM::Server; return Authen::SCRAM::Server->new( credential_cb => \&get_cred, auth_proxy_cb => \&check_proxy, @_ ); } 1;