function HOTP($secret, $cnt, $digits = 6) { if (CUtil::BinStrlen($secret) <= 25) { $sha_hash = CSecurityUser::hmacsha1(pack("NN", 0, $cnt), $secret); } else { $sha_hash = CSecurityUser::hmacsha256(pack("NN", 0, $cnt), $secret); } if ($sha_hash !== false) { $dwOffset = hexdec(substr($sha_hash, -1, 1)); $dbc1 = hexdec(substr($sha_hash, $dwOffset * 2, 8)); $dbc2 = $dbc1 & 0x7fffffff; $hotp = $dbc2 % pow(10, $digits); return $hotp; } else { return false; } }