"Fossies" - the Fresh Open Source Software Archive

Member "Digest-HMAC-1.04/lib/Digest/HMAC.pm" (1 Apr 2021, 3013 Bytes) of package /linux/privat/Digest-HMAC-1.04.tar.gz:


As a special service "Fossies" has tried to format the requested source page into HTML format using (guessed) Perl source code syntax highlighting (style: standard) with prefixed line numbers and code folding option. Alternatively you can here view or download the uninterpreted source code file. For more information about "HMAC.pm" see the Fossies "Dox" file reference documentation and the latest Fossies "Diffs" side-by-side code changes report: 1.03_vs_1.04.

    1 package Digest::HMAC;
    2 our $VERSION = '1.04'; # VERSION
    3 our $AUTHORITY = 'cpan:ARODLAND'; # AUTHORITY
    4 
    5 use strict;
    6 
    7 # OO interface
    8 
    9 sub new
   10 {
   11     my($class, $key, $hasher, $block_size) =  @_;
   12     $block_size ||= 64;
   13     $key = $hasher->new->add($key)->digest if length($key) > $block_size;
   14 
   15     my $self = bless {}, $class;
   16     $self->{k_ipad} = $key ^ (chr(0x36) x $block_size);
   17     $self->{k_opad} = $key ^ (chr(0x5c) x $block_size);
   18     $self->{hasher} = $hasher->new->add($self->{k_ipad});
   19     $self;
   20 }
   21 
   22 sub reset
   23 {
   24     my $self = shift;
   25     $self->{hasher}->reset->add($self->{k_ipad});
   26     $self;
   27 }
   28 
   29 sub add     { my $self = shift; $self->{hasher}->add(@_);     $self; }
   30 sub addfile { my $self = shift; $self->{hasher}->addfile(@_); $self; }
   31 
   32 sub _digest
   33 {
   34     my $self = shift;
   35     my $inner_digest = $self->{hasher}->digest;
   36     $self->{hasher}->reset->add($self->{k_opad}, $inner_digest);
   37 }
   38 
   39 sub digest    { shift->_digest->digest;    }
   40 sub hexdigest { shift->_digest->hexdigest; }
   41 sub b64digest { shift->_digest->b64digest; }
   42 
   43 
   44 # Functional interface
   45 
   46 require Exporter;
   47 *import = \&Exporter::import;
   48 use vars qw(@EXPORT_OK);
   49 @EXPORT_OK = qw(hmac hmac_hex);
   50 
   51 sub hmac
   52 {
   53     my($data, $key, $hash_func, $block_size) = @_;
   54     $block_size ||= 64;
   55     $key = &$hash_func($key) if length($key) > $block_size;
   56 
   57     my $k_ipad = $key ^ (chr(0x36) x $block_size);
   58     my $k_opad = $key ^ (chr(0x5c) x $block_size);
   59 
   60     &$hash_func($k_opad, &$hash_func($k_ipad, $data));
   61 }
   62 
   63 sub hmac_hex { unpack("H*", &hmac); }
   64 
   65 1;
   66 
   67 __END__
   68 
   69 =head1 NAME
   70 
   71 Digest::HMAC - Keyed-Hashing for Message Authentication
   72 
   73 =head1 SYNOPSIS
   74 
   75  # Functional style
   76  use Digest::HMAC qw(hmac hmac_hex);
   77  $digest = hmac($data, $key, \&myhash);
   78  print hmac_hex($data, $key, \&myhash);
   79 
   80  # OO style
   81  use Digest::HMAC;
   82  $hmac = Digest::HMAC->new($key, "Digest::MyHash");
   83 
   84  $hmac->add($data);
   85  $hmac->addfile(*FILE);
   86 
   87  $digest = $hmac->digest;
   88  $digest = $hmac->hexdigest;
   89  $digest = $hmac->b64digest;
   90 
   91 =head1 DESCRIPTION
   92 
   93 HMAC is used for message integrity checks between two parties that
   94 share a secret key, and works in combination with some other Digest
   95 algorithm, usually MD5 or SHA-1.  The HMAC mechanism is described in
   96 RFC 2104.
   97 
   98 HMAC follow the common C<Digest::> interface, but the constructor
   99 takes the secret key and the name of some other simple C<Digest::>
  100 as argument.
  101 
  102 The hmac() and hmac_hex() functions and the Digest::HMAC->new() constructor
  103 takes an optional $blocksize argument as well.  The HMAC algorithm assumes the
  104 digester to hash by iterating a basic compression function on blocks of data
  105 and the $blocksize should match the byte-length of such blocks.
  106 
  107 The default $blocksize is 64 which is suitable for the MD5 and SHA-1 digest
  108 functions.  For stronger algorithms the blocksize probably needs to be
  109 increased.
  110 
  111 =head1 SEE ALSO
  112 
  113 L<Digest::HMAC_MD5>, L<Digest::HMAC_SHA1>
  114 
  115 RFC 2104
  116 
  117 =head1 MAINTAINER
  118 
  119 Andrew Rodland <arodland@cpan.org>
  120 
  121 =head1 ORIGINAL AUTHORS
  122 
  123 Graham Barr <gbarr@ti.com>, Gisle Aas <gisle@aas.no>
  124 
  125 =cut