/IronPython_Main/Runtime/Tests/LinqDlrTests/testenv/perl/site/lib/digest/hmac.pm
Perl | 111 lines | 74 code | 33 blank | 4 comment | 4 complexity | 77e704acffbaadf6b182dc63642a6527 MD5 | raw file
Possible License(s): GPL-2.0, MPL-2.0-no-copyleft-exception, CPL-1.0, CC-BY-SA-3.0, BSD-3-Clause, ISC, AGPL-3.0, LGPL-2.1, Apache-2.0
- package Digest::HMAC;
- $VERSION = "1.00";
-
- use strict;
-
- # OO interface
-
- sub new
- {
- my($class, $key, $hasher, $block_size) = @_;
- $block_size ||= 64;
- $key = $hasher->new->add($key)->digest if length($key) > $block_size;
-
- my $self = bless {}, $class;
- $self->{k_ipad} = $key ^ (chr(0x36) x $block_size);
- $self->{k_opad} = $key ^ (chr(0x5c) x $block_size);
- $self->{hasher} = $hasher->new->add($self->{k_ipad});
- $self;
- }
-
- sub reset
- {
- my $self = shift;
- $self->{hasher}->reset->add($self->{k_ipad});
- $self;
- }
-
- sub add { my $self = shift; $self->{hasher}->add(@_); $self; }
- sub addfile { my $self = shift; $self->{hasher}->addfile(@_); $self; }
-
- sub _digest
- {
- my $self = shift;
- my $inner_digest = $self->{hasher}->digest;
- $self->{hasher}->reset->add($self->{k_opad}, $inner_digest);
- }
-
- sub digest { shift->_digest->digest; }
- sub hexdigest { shift->_digest->hexdigest; }
- sub b64digest { shift->_digest->b64digest; }
-
-
- # Functional interface
-
- require Exporter;
- *import = \&Exporter::import;
- use vars qw(@EXPORT_OK);
- @EXPORT_OK = qw(hmac hmac_hex);
-
- sub hmac
- {
- my($data, $key, $hash_func, $block_size) = @_;
- $block_size ||= 64;
- $key = &$hash_func($key) if length($key) > $block_size;
-
- my $k_ipad = $key ^ (chr(0x36) x $block_size);
- my $k_opad = $key ^ (chr(0x5c) x $block_size);
-
- &$hash_func($k_opad, &$hash_func($k_ipad, $data));
- }
-
- sub hmac_hex { unpack("H*", &hmac); }
-
- 1;
-
- __END__
-
- =head1 NAME
-
- Digest::HMAC - Keyed-Hashing for Message Authentication
-
- =head1 SYNOPSIS
-
- # Functional style
- use Digest::HMAC qw(hmac hmac_hex);
- $digest = hmac($data, $key, \&myhash);
- print hmac_hex($data, $key, \&myhash);
-
- # OO style
- use Digest::HMAC;
- $hmac = Digest::HMAC->new($key, "Digest::MyHash");
-
- $hmac->add($data);
- $hmac->addfile(*FILE);
-
- $digest = $hmac->digest;
- $digest = $hmac->hexdigest;
- $digest = $hmac->b64digest;
-
- =head1 DESCRIPTION
-
- HMAC is used for message integrity checks between two parties that
- share a secret key, and works in combination with some other Digest
- algorithm, usually MD5 or SHA-1. The HMAC mechanism is described in
- RFC 2104.
-
- HMAC follow the common C<Digest::> interface, but the constructor
- takes the secret key and the name of some other simple C<Digest::>
- as argument.
-
- =head1 SEE ALSO
-
- L<Digest::HMAC_MD5>, L<Digest::HMAC_SHA1>
-
- RFC 2104
-
- =head1 AUTHORS
-
- Graham Barr <gbarr@ti.com>, Gisle Aas <gisle@aas.no>
-
- =cut