. */ namespace SP\Core\Crypt; use SP\Core\Context\SessionLifecycleHandler; use SP\Domain\Core\Context\SessionContext; use SP\Domain\Core\Exceptions\CryptException; use SP\Domain\Core\Exceptions\SPException; use function SP\logger; /** * Class Session * * @package SP\Core\Crypt */ class Session { /** * Devolver la clave maestra de la sesión * * @throws CryptException */ public static function getSessionKey(SessionContext $sessionContext): string { return $sessionContext->getVault()->getData(self::getKey($sessionContext)); } private static function getKey(SessionContext $sessionContext): string { return self::buildSeed(session_id(), (string)$sessionContext->getSidStartTime()); } private static function buildSeed(string ...$parts): string { return sha1(implode('', $parts)); } /** * Guardar la clave maestra en la sesión * * @throws CryptException */ public static function saveSessionKey(string $data, SessionContext $sessionContext): void { $sessionContext->setVault(Vault::factory(new Crypt())->saveData($data, self::getKey($sessionContext))); } /** * Regenerar la clave de sesión * * @throws CryptException * @throws SPException */ public static function reKey(SessionContext $sessionContext): void { logger(__METHOD__); $oldSeed = self::getKey($sessionContext); SessionLifecycleHandler::regenerate(); $newSeed = self::buildSeed(session_id(), (string)$sessionContext->setSidStartTime(time())); $sessionContext->setVault($sessionContext->getVault()->reKey($newSeed, $oldSeed)); } }