From fcbd04d14f7e1c54118984eb6cb09bce9b0102f0 Mon Sep 17 00:00:00 2001 From: dakkar Date: Sat, 20 Dec 2014 15:22:39 +0000 Subject: first client tests passing --- lib/Net/Hawk/Crypto.pm | 54 ++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 46 insertions(+), 8 deletions(-) (limited to 'lib/Net/Hawk/Crypto.pm') diff --git a/lib/Net/Hawk/Crypto.pm b/lib/Net/Hawk/Crypto.pm index a730ca6..57ac4bc 100644 --- a/lib/Net/Hawk/Crypto.pm +++ b/lib/Net/Hawk/Crypto.pm @@ -3,12 +3,15 @@ use strict; use warnings; use 5.010; use Moo; -use Types::Standard 1.000003 qw(Str Int Object Dict Optional Undef Any HasMethods slurpy); +use Types::Standard 1.000003 qw(Str Int Object Dict Optional Undef Any HasMethods HashRef slurpy); use Types::URI qw(Uri); use Type::Params qw(compile); use Try::Tiny; -use Net::Hawk::Utils; use Digest; +use Digest::HMAC; +use Net::Hawk::Role::WithUtils; + +with WithUtils(qw(parse_content_type)); sub header_version() { 1 } @@ -53,7 +56,7 @@ sub generate_normalized_string { } sub calculate_payload_hash { - state $argcheck = compile(Object,Str|Undef,Str,Str); + state $argcheck = compile(Object,Str|Undef,Str,Str|Undef); my ($self,$payload,$algorithm,$content_type) = $argcheck->(@_); my $hash = $self->initialize_payload_hash($algorithm,$content_type); @@ -61,20 +64,48 @@ sub calculate_payload_hash { return $self->finalize_payload_hash($hash); } -sub initialize_payload_hash { - state $argcheck = compile(Object,Str,Str); - my ($self,$algorithm,$content_type) = $argcheck->(@_); +sub calculate_mac { + state $argcheck = compile( + Object,Str, + Dict[ + algorithm => Str, + key => Str, + slurpy Any, + ], + HashRef, + ); + my ($self,$type,$credentials,$options) = $argcheck->(@_); - my $digest = try { + my $normalized = $self->generate_normalized_string($type,$options); + my $hmac = Digest::HMAC->new( + $credentials->{key}, + $self->make_digest($credentials->{algorithm}), + ); + $hmac->add($normalized); + return $self->finalize_digest($hmac); +} + +sub make_digest { + state $argcheck = compile(Object,Str); + my ($self,$algorithm) = $argcheck->(@_); + + return try { Digest->new($algorithm); } catch { $algorithm =~ s{(?<=[a-z])(?=[0-9])}{-}; Digest->new(uc($algorithm)); }; +} + +sub initialize_payload_hash { + state $argcheck = compile(Object,Str,Str|Undef); + my ($self,$algorithm,$content_type) = $argcheck->(@_); + + my $digest = $self->make_digest($algorithm); $digest->add(sprintf("hawk.%d.payload\n",header_version())); - $digest->add(Net::Hawk::Utils::parse_content_type($content_type),"\n"); + $digest->add($self->_utils->parse_content_type($content_type),"\n"); return $digest; } @@ -83,6 +114,13 @@ sub finalize_payload_hash { my ($self,$digest) = $argcheck->(@_); $digest->add("\n"); + return $self->finalize_digest($digest); +} + +sub finalize_digest { + state $argcheck = compile(Object,HasMethods[qw(b64digest)]); + my ($self,$digest) = $argcheck->(@_); + my $ret = $digest->b64digest(); $ret .= '=' while length($ret) % 4; return $ret; -- cgit v1.2.3