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扱いとします。