65 lines
1.2 KiB
Perl
65 lines
1.2 KiB
Perl
package Digest::OMAC2;
|
|
|
|
use base qw(Digest::OMAC::Base);
|
|
|
|
use strict;
|
|
#use warnings;
|
|
use Carp;
|
|
use MIME::Base64;
|
|
|
|
# we still call it Lu2 even though it's actually no longer squared ;-)
|
|
|
|
sub _lu2 {
|
|
my ( $self, $blocksize, $L ) = @_;
|
|
$self->_shift_lu2( $L, $self->_lu2_constant($blocksize) );
|
|
}
|
|
|
|
sub _shift_lu2 {
|
|
my ( $self, $L, $constant ) = @_;
|
|
|
|
# used to do Bit::Vector's shift_left but that's broken
|
|
my $unpacked = unpack("B*",$L);
|
|
my $lsb = chop $unpacked;
|
|
my $Lt = pack("B*", "0" . $unpacked);
|
|
|
|
if ( $lsb ) {
|
|
return $Lt ^ $constant;
|
|
} else {
|
|
return $Lt;
|
|
}
|
|
}
|
|
|
|
sub _lu2_constant {
|
|
my ( $self, $blocksize ) = @_;
|
|
|
|
if ( $blocksize == 16 ) { # 128
|
|
return ("\x80" . ("\x00" x 14) . "\x43");
|
|
} elsif ( $blocksize == 8 ) { # 64
|
|
return ("\x80" . ("\x00" x 6) . "\x0d");
|
|
} else {
|
|
die "Blocksize $blocksize is not supported by OMAC";
|
|
}
|
|
}
|
|
|
|
1;
|
|
__END__
|
|
|
|
=pod
|
|
|
|
=head1 NAME
|
|
|
|
Digest::OMAC2 - OMAC 2 implementation
|
|
|
|
=head1 SYNOPSIS
|
|
|
|
use Digest::OMAC2;
|
|
|
|
my $d = Digest::OMAC2->new( $key, $cipher );
|
|
|
|
=head1 DESCRIPTION
|
|
|
|
OMAC 2 is a variant of the CMAC/OMAC 1 algorithm. The initialization routines
|
|
are slightly different. OMAC2 actually precedes OMAC1, so
|
|
L<Digest::CMAC>/L<Digest::OMAC1> is the reccomended version. Supposedly OMAC1
|
|
was more rigorously analyzed.
|