/tools/swift/Swift/Authenticator/CRAMMD5.php
PHP | 73 lines | 35 code | 7 blank | 31 comment | 2 complexity | fe5ff3f695359b2bda22ebd792f370d1 MD5 | raw file
Possible License(s): CC-BY-SA-3.0, LGPL-2.1, LGPL-3.0
- <?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;
- }
- }