123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475 |
- <?php
- namespace 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);
- }
- }
|