2010/08/12(木)Digest::SHA を使って HMAC-SHA1 を生成するPerlのコード
Digest::SHA ないしは Digest::SHA::PurePerl を使います。よって PurePerl でも動作します。
HMAC署名についてはwikipediaを参照。
sub hmac_sha1 { # my $self = shift; my ($key, $msg) = @_; my $sha1; if ($Digest::SHA::PurePerl::VERSION) { $sha1 = Digest::SHA::PurePerl->new(1); } else { eval { require Digest::SHA; $sha1 = Digest::SHA->new; }; if ($@) { require Digest::SHA::PurePerl; $sha1 = Digest::SHA::PurePerl->new(1); } } my $bs = 64; if (length($key) > $bs) { $key = $sha1->add($key)->digest; $sha1->reset; } my $k_opad = $key ^ ("\x5c" x $bs); my $k_ipad = $key ^ ("\x36" x $bs); $sha1->add($k_ipad); $sha1->add($msg); my $hk_ipad = $sha1->digest; $sha1->reset; $sha1->add($k_opad, $hk_ipad); my $b64d = $sha1->b64digest; $b64d = substr($b64d.'====', 0, ((length($b64d)+3)>>2)<<2); return $b64d; }
最後に「====」を付けてやるのがポイントで、これがないとOAuthで盛大にコケます。
なおこのソースコードはPDS扱いとします。