аутентификация cram-md5

аутентификация cram-md5

не могу пройти её. в сети практически нет инфы на эту тему. нашел только один скрипт, но и тот не работает.
<?
function hmac($key, $data, $hash='md5', $blocksize=64) {
if (strlen($key)>$blocksize) {
$key = pack('H*', $hash($key));
}
$key = str_pad($key, $blocksize, chr(0));//вот тут почему-то одни шестёрки
$ipad = str_repeat(chr(0x36), $blocksize);//тут слеши
$opad = str_repeat(chr(0x5c), $blocksize);
return $hash(($key^$opad).pack('H*',$hash(($key^$ipad).$data))); //домик - это двоичное смещение
}
$login='[email protected]'; $pass='YJ9LoB7Y';
$our_string='<[email protected]>';//раскодированая строка ответа сервера на команду auth cram-md5. В инструкции написано что кавычки на краях обязательны

$keys= hmac($pass, $our_string,'md5', 64);

echo base64_encode("$login $keys").'<br>'; //пробовал как с пробелом так и без.
?>

данные в примере рабочие. аутентификацию по логину прохожу нормально.
вот нашел еще один пример на перле, но ничего из него не понял, так как и сам перл не знаю.

su-2.05a# perl -MMIME::Base64 -MDigest::HMAC_MD5 -e \
'print MIME::Base64::encode_base64($ARGV[0] . " " . \
Digest::HMAC_MD5::hmac_md5_hex($ARGV[2], $ARGV[1]))' \
'[email protected]' 'my-secret-pass' '<[email protected]>'

-~{}~ 18.09.06 16:26:

скрипт рабочий. просто не было учнено что $our_string каждый раз новая.
а так вот еще один альтернативный код.
function _HMAC_MD5($key, $data) {
$pass = $key;
if (strlen($key)>64) {
$key = pack('H32',md5($pass));
}
if (strlen($key)<64) {
$key = str_pad($key, 64, chr(0));
}
$k_ipad = '';
$k_opad = '';
for( $i = 0; $i < 64; $i++ ) {
$byte = ord($key{$i});
$k_ipad .= chr( $byte ^ 0x36);
$k_opad .= chr( $byte ^ 0x5C);
}
$inner = pack('H32', md5($k_ipad . $data));
$digest = md5($k_opad . $inner);

return $digest;
}
 
Сверху