| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475 | <?phpnamespace Aws\Crypto\Polyfill;/** * Class Key * * Wraps a string to keep it hidden from stack traces. */class Key{    /**     * @var string $internalString     */    private $internalString;    /**     * Hide contents of      *     * @return array     */    public function __debugInfo()    {        return [];    }    /**     * Key constructor.     * @param string $str     */    public function __construct($str)    {        $this->internalString = $str;    }    /**     * Defense in depth:     *     * PHP 7.2 includes the Sodium cryptography library, which (among other things)     * exposes a function called sodium_memzero() that we can use to zero-fill strings     * to minimize the risk of sensitive cryptographic materials persisting in memory.     *     * If this function is not available, we XOR the string in-place with itself as a     * best-effort attempt.     */    public function __destruct()    {        if (extension_loaded('sodium') && function_exists('sodium_memzero')) {            try {                \sodium_memzero($this->internalString);            } catch (\SodiumException $ex) {                // This is a best effort, but does not provide the same guarantees as sodium_memzero():                $this->internalString ^= $this->internalString;            }        }    }    /**     * @return string     */    public function get()    {        return $this->internalString;    }    /**     * @return int     */    public function length()    {        if (\is_callable('\\mb_strlen')) {            return (int) \mb_strlen($this->internalString, '8bit');        }        return (int) \strlen($this->internalString);    }}
 |