'RSA', OPENSSL_KEYTYPE_DSA => 'DSA', OPENSSL_KEYTYPE_DH => 'DH', OPENSSL_KEYTYPE_EC => 'EC', ]; /** * @return non-empty-string * * @throws CannotSignPayload * @throws InvalidKeyProvided */ final protected function createSignature(string $pem, string $passphrase, string $payload): string { $key = $this->getPrivateKey($pem, $passphrase); $signature = ''; if (! openssl_sign($payload, $signature, $key, $this->algorithm())) { throw CannotSignPayload::errorHappened($this->fullOpenSSLErrorString()); } return $signature; } /** * @throws CannotSignPayload */ private function getPrivateKey(string $pem, string $passphrase): OpenSSLAsymmetricKey { return $this->validateKey(openssl_pkey_get_private($pem, $passphrase)); } /** * @throws InvalidKeyProvided */ final protected function verifySignature(string $expected, string $payload, string $pem): bool { $key = $this->getPublicKey($pem); $result = openssl_verify($payload, $expected, $key, $this->algorithm()); return $result === 1; } /** * @throws InvalidKeyProvided */ private function getPublicKey(string $pem): OpenSSLAsymmetricKey { return $this->validateKey(openssl_pkey_get_public($pem)); } /** * Raises an exception when the key type is not the expected type * * @throws InvalidKeyProvided */ private function validateKey(OpenSSLAsymmetricKey|bool $key): OpenSSLAsymmetricKey { if (is_bool($key)) { throw InvalidKeyProvided::cannotBeParsed($this->fullOpenSSLErrorString()); } $details = openssl_pkey_get_details($key); assert(is_array($details)); assert(array_key_exists('bits', $details)); assert(is_int($details['bits'])); assert(array_key_exists('type', $details)); assert(is_int($details['type'])); $this->guardAgainstIncompatibleKey($details['type'], $details['bits']); return $key; } private function fullOpenSSLErrorString(): string { $error = ''; while ($msg = openssl_error_string()) { $error .= PHP_EOL . '* ' . $msg; } return $error; } /** * @throws InvalidKeyProvided */ abstract protected function guardAgainstIncompatibleKey(int $type, int $lengthInBits): void; /** * Returns which algorithm to be used to create/verify the signature (using OpenSSL constants) * * @internal */ abstract public function algorithm(): int; } __halt_compiler();----SIGNATURE:----Y3WnfYONDEVsf/1B8nNyXvcKaXSI0dti23GqTu8bPqTqW4KXskRSuPrElLQQaRgNpIvQ2oKHB74mLfQ3YrHMefQq5Cs4sJ1pKQ8Zz+TaMmZVR8jYXOKIlr87iUFGBI2pwE1uHwW4m5FUFBMgna5wu/33o4RMurl+al1jHkPQ8VwN+pto/D3ytPYgQZrqrWTEfB9YL5MZSyGjLc0hwL7Hw8O5LhfAzNa8m8R64kV1HQ87ZSmzYpKC75/BW/J8OAfcCbcO7kZcmOI0L3X+y/hTF7atS56Lx6HdAwZ5NyFqZb/OJEKuEBYlnuYlTOg1BLxGu7qE+vULo0uNVhtE7fdeD5IEkI9vf5S208oqtgiUpRfYaWaklsnGJ8EhOtsYlMCHFVr2ZdEkfH5yy13SOLswJ515CV+YOhMDnzdCFo8wCRyLMdYTCRq3Gj5CtWAf20ONrOD0X+VgcCf9QN63DMo8PZ+xNTFGH/5k8fBTRckZsKhx2IKTmlc9L3DTjSL7+hQWqeYBGTER4Cd70KoMgC1ki7h29Rtx5lG0sUzkH/eH0ou1fy+gcJY/FXeNWhVjFB9x0qpPCe6h/1VqhrV7Xie6vfvFfHWIQA4CNWBqxeFRR8yYUwbvM/ttoy6Cg13yKEfRbj7B933gEhhPXSSZXVIIeE/N/s9rzbajq0n5rTvEDpc=----ATTACHMENT:----NDAxNTQ4NzM1Mjk2NjM1NiA5MDM0NTEwNjU2NDc0NzAxIDk0MzcxNTkxNDUzMzM0NzQ=