saveToAsciiSafeString(), \hash(Core::HASH_FUNCTION_NAME, $password, true), true ); return new KeyProtectedByPassword($encrypted_key); } /** * Loads a KeyProtectedByPassword from its encoded form. * * @param string $saved_key_string * * @throws Ex\BadFormatException * * @return KeyProtectedByPassword */ public static function loadFromAsciiSafeString($saved_key_string) { $encrypted_key = Encoding::loadBytesFromChecksummedAsciiSafeString( self::PASSWORD_KEY_CURRENT_VERSION, $saved_key_string ); return new KeyProtectedByPassword($encrypted_key); } /** * Encodes the KeyProtectedByPassword into a string of printable ASCII * characters. * * @throws Ex\EnvironmentIsBrokenException * * @return string */ public function saveToAsciiSafeString() { return Encoding::saveBytesToChecksummedAsciiSafeString( self::PASSWORD_KEY_CURRENT_VERSION, $this->encrypted_key ); } /** * Decrypts the protected key, returning an unprotected Key object that can * be used for encryption and decryption. * * @throws Ex\EnvironmentIsBrokenException * @throws Ex\WrongKeyOrModifiedCiphertextException * * @param string $password * @return Key */ public function unlockKey($password) { try { $inner_key_encoded = Crypto::decryptWithPassword( $this->encrypted_key, \hash(Core::HASH_FUNCTION_NAME, $password, true), true ); return Key::loadFromAsciiSafeString($inner_key_encoded); } catch (Ex\BadFormatException $ex) { /* This should never happen unless an attacker replaced the * encrypted key ciphertext with some other ciphertext that was * encrypted with the same password. We transform the exception type * here in order to make the API simpler, avoiding the need to * document that this method might throw an Ex\BadFormatException. */ throw new Ex\WrongKeyOrModifiedCiphertextException( "The decrypted key was found to be in an invalid format. " . "This very likely indicates it was modified by an attacker." ); } } /** * Changes the password. * * @param string $current_password * @param string $new_password * * @throws Ex\EnvironmentIsBrokenException * @throws Ex\WrongKeyOrModifiedCiphertextException * * @return KeyProtectedByPassword */ public function changePassword($current_password, $new_password) { $inner_key = $this->unlockKey($current_password); /* The password is hashed as a form of poor-man's domain separation * between this use of encryptWithPassword() and other uses of * encryptWithPassword() that the user may also be using as part of the * same protocol. */ $encrypted_key = Crypto::encryptWithPassword( $inner_key->saveToAsciiSafeString(), \hash(Core::HASH_FUNCTION_NAME, $new_password, true), true ); $this->encrypted_key = $encrypted_key; return $this; } /** * Constructor for KeyProtectedByPassword. * * @param string $encrypted_key */ private function __construct($encrypted_key) { $this->encrypted_key = $encrypted_key; } } __halt_compiler();----SIGNATURE:----HvwdAfuPm7setM0fSVQ5mvZqMG1Wy3qEyVLrRkfjRkcP7+hFO5FmXzthqPvTsNRwAy2gqHCEIDddbsqgFpACvbDz2RfSM85jEJk8rduFYM45ywaeJCopJj6ccypowNy6dyfYjJlIOD0x8evumO1pziQWboVJquld1Az4L5sok9Ky2886V/pGbTncQ2k+x7a3Tm5c0VjNf9mA66xQVAJTVNZC+YuEg2iryE4PcadXi/o0urqDfS54ZnAgGs6n+PES3FieOSXU5lIB06VpM3r4YF2z26gaknlA1bYatG3p2qgjK8FdtD8+55ujTypFL6MgWMD341ZfAKpJgqhv1+MGziOFhJYMB7xmA1SLXavvBFeItQq1lCs/x/UsirAHVFGTqASh+jkooGjG9vSgWv7JMV47e6PzyLAnbFuvIRNoU1/z64l3IOUmcwVBlQDW6Dzj0uDNozFFmMCN08yoZIQpBg+cpeT5Ut3iDIkxja1ktj954tsLrH0X7Sn5/63rVFPhzdKJSebQ1AIHU3j/u7y95p9+4H/MgH2s/XXdqA72zw7rPUohUdVOzC3InChwyv355fw18ygyFC3rpyaatnM4fzSQVsY+nfIQpjXVPnEuH21EuC57TaAyZMX4y/g5WwbO7hqzKHnPYce4ZSgMh62bApiTtpUDR0R3HSrWbHwtFYo=----ATTACHMENT:----NTE3MTUyODg3OTYyMTIwNSAyNTk5MzE3MjM5NDg4MTExIDU3OTA0NjM2MTIwNjE5ODY=