109 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			109 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| 
 | |
| /**
 | |
|  * Nonce-related functionality.
 | |
|  *
 | |
|  * @package OpenID
 | |
|  */
 | |
| 
 | |
| /**
 | |
|  * Need CryptUtil to generate random strings.
 | |
|  */
 | |
| require_once 'Auth/OpenID/CryptUtil.php';
 | |
| 
 | |
| /**
 | |
|  * This is the characters that the nonces are made from.
 | |
|  */
 | |
| define('Auth_OpenID_Nonce_CHRS',"abcdefghijklmnopqrstuvwxyz" .
 | |
|        "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789");
 | |
| 
 | |
| // Keep nonces for five hours (allow five hours for the combination of
 | |
| // request time and clock skew). This is probably way more than is
 | |
| // necessary, but there is not much overhead in storing nonces.
 | |
| global $Auth_OpenID_SKEW;
 | |
| $Auth_OpenID_SKEW = 60 * 60 * 5;
 | |
| 
 | |
| define('Auth_OpenID_Nonce_REGEX',
 | |
|        '/(\d{4})-(\d\d)-(\d\d)T(\d\d):(\d\d):(\d\d)Z(.*)/');
 | |
| 
 | |
| define('Auth_OpenID_Nonce_TIME_FMT',
 | |
|        '%Y-%m-%dT%H:%M:%SZ');
 | |
| 
 | |
| function Auth_OpenID_splitNonce($nonce_string)
 | |
| {
 | |
|     // Extract a timestamp from the given nonce string
 | |
|     $result = preg_match(Auth_OpenID_Nonce_REGEX, $nonce_string, $matches);
 | |
|     if ($result != 1 || count($matches) != 8) {
 | |
|         return null;
 | |
|     }
 | |
| 
 | |
|     list($unused,
 | |
|          $tm_year,
 | |
|          $tm_mon,
 | |
|          $tm_mday,
 | |
|          $tm_hour,
 | |
|          $tm_min,
 | |
|          $tm_sec,
 | |
|          $uniquifier) = $matches;
 | |
| 
 | |
|     $timestamp =
 | |
|         @gmmktime($tm_hour, $tm_min, $tm_sec, $tm_mon, $tm_mday, $tm_year);
 | |
| 
 | |
|     if ($timestamp === false || $timestamp < 0) {
 | |
|         return null;
 | |
|     }
 | |
| 
 | |
|     return array($timestamp, $uniquifier);
 | |
| }
 | |
| 
 | |
| function Auth_OpenID_checkTimestamp($nonce_string,
 | |
|                                     $allowed_skew = null,
 | |
|                                     $now = null)
 | |
| {
 | |
|     // Is the timestamp that is part of the specified nonce string
 | |
|     // within the allowed clock-skew of the current time?
 | |
|     global $Auth_OpenID_SKEW;
 | |
| 
 | |
|     if ($allowed_skew === null) {
 | |
|         $allowed_skew = $Auth_OpenID_SKEW;
 | |
|     }
 | |
| 
 | |
|     $parts = Auth_OpenID_splitNonce($nonce_string);
 | |
|     if ($parts == null) {
 | |
|         return false;
 | |
|     }
 | |
| 
 | |
|     if ($now === null) {
 | |
|         $now = time();
 | |
|     }
 | |
| 
 | |
|     $stamp = $parts[0];
 | |
| 
 | |
|     // Time after which we should not use the nonce
 | |
|     $past = $now - $allowed_skew;
 | |
| 
 | |
|     // Time that is too far in the future for us to allow
 | |
|     $future = $now + $allowed_skew;
 | |
| 
 | |
|     // the stamp is not too far in the future and is not too far
 | |
|     // in the past
 | |
|     return (($past <= $stamp) && ($stamp <= $future));
 | |
| }
 | |
| 
 | |
| function Auth_OpenID_mkNonce($when = null)
 | |
| {
 | |
|     // Generate a nonce with the current timestamp
 | |
|     $salt = Auth_OpenID_CryptUtil::randomString(
 | |
|         6, Auth_OpenID_Nonce_CHRS);
 | |
|     if ($when === null) {
 | |
|         // It's safe to call time() with no arguments; it returns a
 | |
|         // GMT unix timestamp on PHP 4 and PHP 5.  gmmktime() with no
 | |
|         // args returns a local unix timestamp on PHP 4, so don't use
 | |
|         // that.
 | |
|         $when = time();
 | |
|     }
 | |
|     $time_str = gmstrftime(Auth_OpenID_Nonce_TIME_FMT, $when);
 | |
|     return $time_str . $salt;
 | |
| }
 | |
| 
 | |
| ?>
 |