lemonldap-ng/lemonldap-ng-portal/lib/Lemonldap/NG/Portal/Lib/U2F.pm
2019-02-12 18:21:38 +01:00

64 lines
1.3 KiB
Perl

package Lemonldap::NG::Portal::Lib::U2F;
use strict;
use Mouse;
use MIME::Base64 qw(encode_base64 decode_base64);
our $VERSION = '2.1.0';
has origin => ( is => 'rw', );
sub init {
my ($self) = @_;
eval 'use Crypt::U2F::Server::Simple';
if ($@) {
$self->error("Can't load U2F library: $@");
return 0;
}
my $p = $_[0]->{conf}->{portal};
$p =~ s#^(https?://[^/]+).*$#$1#;
$self->origin($p);
# Test if a new object can be created
unless (
Crypt::U2F::Server::Simple->new(
appId => $self->origin,
origin => $self->origin,
( $self->conf->{logLevel} eq 'debug' ? ( debug => 1 ) : () ),
)
)
{
$self->error( Crypt::U2F::Server::Simple::lastError() );
return 0;
}
return 1;
}
sub crypter {
my ( $self, %args ) = @_;
return Crypt::U2F::Server::Simple->new(
appId => $self->origin,
origin => $self->origin,
( $self->conf->{logLevel} eq 'debug' ? ( debug => 1 ) : () ),
%args,
);
}
sub encode_base64url {
shift;
my $e = encode_base64( shift, '' );
$e =~ s/=+\z//;
$e =~ tr[+/][-_];
return $e;
}
sub decode_base64url {
shift;
my $s = shift;
$s =~ tr[-_][+/];
$s .= '=' while length($s) % 4;
return decode_base64($s);
}
1;