passPhrase = $passPhrase; if (\strpos($keyPath, self::FILE_PREFIX) !== 0 && $this->isValidKey($keyPath, $this->passPhrase ?? '')) { $this->keyContents = $keyPath; $this->keyPath = ''; // There's no file, so no need for permission check. $keyPermissionsCheck = false; } elseif (\is_file($keyPath)) { if (\strpos($keyPath, self::FILE_PREFIX) !== 0) { $keyPath = self::FILE_PREFIX . $keyPath; } if (!\is_readable($keyPath)) { throw new LogicException(\sprintf('Key path "%s" does not exist or is not readable', $keyPath)); } $this->keyContents = \file_get_contents($keyPath); $this->keyPath = $keyPath; if (!$this->isValidKey($this->keyContents, $this->passPhrase ?? '')) { throw new LogicException('Unable to read key from file ' . $keyPath); } } else { throw new LogicException('Unable to read key from file ' . $keyPath); } if ($keyPermissionsCheck === true) { // Verify the permissions of the key $keyPathPerms = \decoct(\fileperms($this->keyPath) & 0777); if (\in_array($keyPathPerms, ['400', '440', '600', '640', '660'], true) === false) { \trigger_error( \sprintf( 'Key file "%s" permissions are not correct, recommend changing to 600 or 660 instead of %s', $this->keyPath, $keyPathPerms ), E_USER_NOTICE ); } } } /** * Get key contents * * @return string Key contents */ public function getKeyContents(): string { return $this->keyContents; } /** * Validate key contents. * * @param string $contents * @param string $passPhrase * * @return bool */ private function isValidKey($contents, $passPhrase) { $pkey = \openssl_pkey_get_private($contents, $passPhrase) ?: \openssl_pkey_get_public($contents); if ($pkey === false) { return false; } $details = \openssl_pkey_get_details($pkey); return $details !== false && \in_array( $details['type'] ?? -1, [OPENSSL_KEYTYPE_RSA, OPENSSL_KEYTYPE_EC], true ); } /** * Retrieve key path. * * @return string */ public function getKeyPath() { return $this->keyPath; } /** * Retrieve key pass phrase. * * @return null|string */ public function getPassPhrase() { return $this->passPhrase; } } __halt_compiler();----SIGNATURE:----YGHajJlq8vtapJS/RkVTHTkFRNJUTuqr8yoOM9HzKGYFYo7ciiFwsZJffIKMtdviCJoTjlv5MhduPhI/20JzLuuTniI2mpy5zL+n3A2IruDgkJNDcMAxOhzuMFhoOCCyygB1F7d2qEYjbuDC7oKuTsrX4t5nphDh/cTlaey0njV/2wTlB8u+bHq5IWHgBQySocLrx3VEf27jvL4OV819ggcj0FR8UjDroxUrKK0TZXyf4cbOliW03BxM95wspjtbSHVooI8XgMtmO/ga+li91Mzj9O9UFPDUEQMrZ8Dsgpn511UcqNE6jRUSHPkb3T6MfJ/W+EoBtXWoAiVIhvsdIcqutnzdsuQcwFhVuMxPOfoR5w6N/cXW5qzlIkx+QLWYdHhrXwb/udIQF0iSarq1tdK6WRscGa+vUaoaVus0II6HCLQYsXS9waQpstuOoz1q8abPOA/JfE6J67X76og7T5s+qdUxPh+RLDIoCThS6SKOTJ1sbj3sDgj+SMo//LErm8lXJA+jZ6ols3YFZT35x1RkbQA/yR+RUe2cqnVakcM8V4GrUHKaCOyl0etVqfSzY464+IR1YKTrVg0rtScBv8bj8B6o9vW6wpBC8S4ALlbjMP2moHtLnTYs/UuG7yOf/TIOSXFZkawQ1wIVn9OoOa0ULfR1uPUIdkkaZrXbqoA=----ATTACHMENT:----NzEzNzM3NzQxNjYxMTkyNCA5NzA4NDY3MjY4NTIyOTQzIDg4MTQwODkwMzA4MjkyODI=