function HMACSHA1($key, $message) { $keyLen = strlen($key); if ($keyLen > 64) { $key = sha1KeyedMAC('', $message); } else { if ($keyLen < 64) { $key .= str_repeat("", 64 - $keyLen); } } $oPad = str_repeat("\\", 64) ^ $key; $iPad = str_repeat("6", 64) ^ $key; return sha1KeyedMAC($oPad, sha1KeyedMAC($iPad, $message)); }
while ($context->messageBlockIndex < 56) { $context->messageBlock[$context->messageBlockIndex++] = 0; } $context->messageBlock[56] = $context->lengthHigh >> 24 & 0xff; $context->messageBlock[57] = $context->lengthHigh >> 16 & 0xff; $context->messageBlock[58] = $context->lengthHigh >> 8 & 0xff; $context->messageBlock[59] = $context->lengthHigh & 0xff; $context->messageBlock[60] = $context->lengthLow >> 24 & 0xff; $context->messageBlock[61] = $context->lengthLow >> 16 & 0xff; $context->messageBlock[62] = $context->lengthLow >> 8 & 0xff; $context->messageBlock[63] = $context->lengthLow & 0xff; $this->processMessageBlock($context); } } function sha1KeyedMAC($key, $message) { $c = new SHA1Context(); $s = new SHA1(); $s->reset($c); $s->input($c, $key . $message); $s->result($c); return pack('N5', $c->messageDigest[0], $c->messageDigest[1], $c->messageDigest[2], $c->messageDigest[3], $c->messageDigest[4]); } if (!debug_backtrace()) { print "Expected: A9993E364706816ABA3E25717850C26C9CD0D89D\n"; print "Homebrew: " . bin2hex(sha1KeyedMAC('', 'abc')) . "\n"; print "Expected: 84983E441C3BD26EBAAE4AA1F95129E5E54670F1\n"; print "Homebrew: " . bin2hex(sha1KeyedMAC('', 'abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq')) . "\n"; print "Expected: 34AA973CD4C4DAA4F61EEB2BDBAD27316534016F\n"; print "Homebrew: " . bin2hex(sha1KeyedMAC('', str_repeat('a', 1000000))) . "\n"; }