Exemple #1
0
 /**
  * Generate a HOTP key collection based on a timestamp and window size
  * all keys that could exist between a start and end time will be included
  * in the returned array
  * @param string $key the key to use for hashing
  * @param int $window the size of the window a key is valid for in seconds
  * @param int $min the minimum window to accept before $timestamp
  * @param int $max the maximum window to accept after $timestamp
  * @param int $timestamp a timestamp to calculate for, defaults to time()
  * @return array of HOTPResult
  */
 public static function generateByTimeWindow($key, $window, $min = -1, $max = 1, $timestamp = false)
 {
     if (!$timestamp && $timestamp !== 0) {
         $timestamp = HOTP::getTime();
     }
     $counter = intval($timestamp / $window);
     $window = range($min, $max);
     $out = array();
     for ($i = 0; $i < count($window); $i++) {
         $shift_counter = $window[$i];
         $out[$shift_counter] = HOTP::generateByCounter($key, $counter + $shift_counter);
     }
     return $out;
 }
Exemple #2
0
$table = array('HOTP' => array(0 => array('HMAC' => 'cc93cf18508d94934c64b65d8ba7667fb7cde4b0', 'hex' => '4c93cf18', 'dec' => '1284755224', 'hotp' => '755224'), 1 => array('HMAC' => '75a48a19d4cbe100644e8ac1397eea747a2d33ab', 'hex' => '41397eea', 'dec' => '1094287082', 'hotp' => '287082'), 2 => array('HMAC' => '0bacb7fa082fef30782211938bc1c5e70416ff44', 'hex' => '82fef30', 'dec' => '137359152', 'hotp' => '359152'), 3 => array('HMAC' => '66c28227d03a2d5529262ff016a1e6ef76557ece', 'hex' => '66ef7655', 'dec' => '1726969429', 'hotp' => '969429'), 4 => array('HMAC' => 'a904c900a64b35909874b33e61c5938a8e15ed1c', 'hex' => '61c5938a', 'dec' => '1640338314', 'hotp' => '338314'), 5 => array('HMAC' => 'a37e783d7b7233c083d4f62926c7a25f238d0316', 'hex' => '33c083d4', 'dec' => '868254676', 'hotp' => '254676'), 6 => array('HMAC' => 'bc9cd28561042c83f219324d3c607256c03272ae', 'hex' => '7256c032', 'dec' => '1918287922', 'hotp' => '287922'), 7 => array('HMAC' => 'a4fb960c0bc06e1eabb804e5b397cdc4b45596fa', 'hex' => '4e5b397', 'dec' => '82162583', 'hotp' => '162583'), 8 => array('HMAC' => '1b3c89f65e6c9e883012052823443f048b4332db', 'hex' => '2823443f', 'dec' => '673399871', 'hotp' => '399871'), 9 => array('HMAC' => '1637409809a679dc698207310c8c7fc07290d9e5', 'hex' => '2679dc69', 'dec' => '645520489', 'hotp' => '520489')), 'TOTP' => array('59' => array('totp' => '94287082'), '1111111109' => array('totp' => '07081804'), '1111111111' => array('totp' => '14050471'), '1234567890' => array('totp' => '89005924'), '2000000000' => array('totp' => '69279037')));
echo <<<DOCBLOCK
<!DOCTYPE><html><head></head><body><pre>
http://www.ietf.org/rfc/rfc4226.txt
http://tools.ietf.org/html/draft-mraihi-totp-timebased-06

TEST VECTOR VERIFICATION

HOTP Tests:

DOCBLOCK;
echo "Count Method Value                                           Pass/Fail\n";
echo "----------------------------------------------------------------------\n";
// loop over all HOTP table results, and calculate the matching value
foreach ($table['HOTP'] as $seed => $results) {
    $hotp = HOTP::generateByCounter($key, $seed);
    $first = true;
    foreach ($results as $type => $calc) {
        if ($first) {
            echo str_pad($seed, 4, ' ', STR_PAD_LEFT);
            $first = false;
        } else {
            echo '    ';
        }
        echo '  ';
        echo str_pad($type, 5, ' ', STR_PAD_RIGHT);
        echo '  ';
        echo str_pad($calc, 47, ' ', STR_PAD_RIGHT);
        echo '  ';
        $method = 'to' . ucfirst(str_replace('HMAC', 'string', $type));
        echo str_pad($calc == $hotp->{$method}(6) ? '[OK]' : '[FAIL]', 9, ' ', STR_PAD_LEFT);