bebeboutik/tools/swift/Swift/Authenticator/CRAMMD5.php
Srv Bebeboutik 340bc7c146 push site
2016-01-04 12:48:08 +01:00

74 lines
2.1 KiB
PHP
Executable File

<?php
/**
* Swift Mailer CRAM-MD5 Authenticator Mechanism
* Please read the LICENSE file
* @author Chris Corbyn <chris@w3style.co.uk>
* @package Swift_Authenticator
* @license GNU Lesser General Public License
*/
require_once dirname(__FILE__) . "/../ClassLoader.php";
Swift_ClassLoader::load("Swift_Authenticator");
/**
* Swift CRAM-MD5 Authenticator
* This form of authentication is a secure challenge-response method
* @package Swift_Authenticator
* @author Chris Corbyn <chris@w3style.co.uk>
*/
class Swift_Authenticator_CRAMMD5 implements Swift_Authenticator
{
/**
* Try to authenticate using the username and password
* Returns false on failure
* @param string The username
* @param string The password
* @param Swift The instance of Swift this authenticator is used in
* @return boolean
*/
public function isAuthenticated($user, $pass, Swift $swift)
{
try {
$encoded_challenge = substr($swift->command("AUTH CRAM-MD5", 334)->getString(), 4);
$challenge = base64_decode($encoded_challenge);
$response = base64_encode($user . " " . self::generateCRAMMD5Hash($pass, $challenge));
$swift->command($response, 235);
} catch (Swift_ConnectionException $e) {
$swift->reset();
return false;
}
return true;
}
/**
* Return the name of the AUTH extension this is for
* @return string
*/
public function getAuthExtensionName()
{
return "CRAM-MD5";
}
/**
* Generate a CRAM-MD5 hash from a challenge
* @param string The string to get a hash from
* @param string The challenge to use to make the hash
* @return string
*/
public static function generateCRAMMD5Hash($password, $challenge)
{
if (strlen($password) > 64)
$password = pack('H32', md5($password));
if (strlen($password) < 64)
$password = str_pad($password, 64, chr(0));
$k_ipad = substr($password, 0, 64) ^ str_repeat(chr(0x36), 64);
$k_opad = substr($password, 0, 64) ^ str_repeat(chr(0x5C), 64);
$inner = pack('H32', md5($k_ipad.$challenge));
$digest = md5($k_opad.$inner);
return $digest;
}
}