aboutsummaryrefslogtreecommitdiff
path: root/lib/Net/Hawk/Crypto.pm
diff options
context:
space:
mode:
authordakkar <dakkar@thenautilus.net>2014-12-20 15:22:39 +0000
committerdakkar <dakkar@thenautilus.net>2014-12-20 15:22:39 +0000
commitfcbd04d14f7e1c54118984eb6cb09bce9b0102f0 (patch)
treea2191dea055cb08b0f22e7bd481c80bced2c5451 /lib/Net/Hawk/Crypto.pm
parentfirst tests passing (diff)
downloadnet-hawk-fcbd04d14f7e1c54118984eb6cb09bce9b0102f0.tar.gz
net-hawk-fcbd04d14f7e1c54118984eb6cb09bce9b0102f0.tar.bz2
net-hawk-fcbd04d14f7e1c54118984eb6cb09bce9b0102f0.zip
first client tests passing
Diffstat (limited to 'lib/Net/Hawk/Crypto.pm')
-rw-r--r--lib/Net/Hawk/Crypto.pm54
1 files changed, 46 insertions, 8 deletions
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;