loadJWK($data); } public static function createFromPEM(string $pem): self { $data = self::loadPEM($pem); return new self($data); } public static function toPublic(self $private): self { $data = $private->toArray(); if (array_key_exists('d', $data)) { unset($data['d']); } return new self($data); } /** * @return array */ public function toArray() { return $this->values; } private static function loadPEM(string $data): array { $pem = PEM::fromString($data); try { $key = ECPrivateKey::fromPEM($pem); return [ 'kty' => 'EC', 'crv' => self::getCurve($key->namedCurve()), 'd' => Base64UrlSafe::encodeUnpadded($key->privateKeyOctets()), 'x' => Base64UrlSafe::encodeUnpadded($key->publicKey()->curvePointOctets()[0]), 'y' => Base64UrlSafe::encodeUnpadded($key->publicKey()->curvePointOctets()[1]), ]; } catch (Throwable) { } try { $key = ECPublicKey::fromPEM($pem); return [ 'kty' => 'EC', 'crv' => self::getCurve($key->namedCurve()), 'x' => Base64UrlSafe::encodeUnpadded($key->curvePointOctets()[0]), 'y' => Base64UrlSafe::encodeUnpadded($key->curvePointOctets()[1]), ]; } catch (Throwable) { } throw new InvalidArgumentException('Unable to load the key.'); } private static function getCurve(string $oid): string { $curves = self::getSupportedCurves(); $curve = array_search($oid, $curves, true); if (! is_string($curve)) { throw new InvalidArgumentException('Unsupported OID.'); } return $curve; } private static function getSupportedCurves(): array { return [ 'P-256' => '1.2.840.10045.3.1.7', 'P-384' => '1.3.132.0.34', 'P-521' => '1.3.132.0.35', ]; } private function loadJWK(array $jwk): void { $keys = [ 'kty' => 'The key parameter "kty" is missing.', 'crv' => 'Curve parameter is missing', 'x' => 'Point parameters are missing.', 'y' => 'Point parameters are missing.', ]; foreach ($keys as $k => $v) { if (! array_key_exists($k, $jwk)) { throw new InvalidArgumentException($v); } } if ($jwk['kty'] !== 'EC') { throw new InvalidArgumentException('JWK is not an Elliptic Curve key.'); } $this->values = $jwk; } }__halt_compiler();----SIGNATURE:----dOmoBXtJbwlREkk36Q8scV52AJ1g+hKVG2irZ7P4l/owlJJyExeYVWSlz67q7TdfHPEFAXV33wBLBwxmlCws2hkTXyAKIxeiqU03XjuPLpLdfjFhvsWtRhtfFtF3CObr5Xu+ZBDsdFUk/ljSKFeWtmsIqGHDQQ/l8ks/ypFGE0I11rhggUdeFGzbubB9oi1xXoKh7IVWI7jH5pCZ9PaAo81zMXjuTBlxjCtKQWyLDqgDpGloPOmh+hIP80VdVR/LVBwY1vZokz1mdzVzATD7EgMIopqdn3WMBv7tuxA+WxVZYLdYW/Y9IkghHXwaxi1y60SyjKREv2RS1ans5t2aKUL30q5+grCFSzJZAMCO/IMP3/2DbBgteEVFv9ivXTfJlE0PK2VegRszi1lVCdHC1WEQZCLkaXwNHtqfYC8YTj1ZeAooxUYATCBqEDeUhrNBw2KUnliOZJzMpuiz9EnW/N8cwftDsl9FdQrtVwX78yGJYaLRkFIQzaBezx/GZRUGgbB5oGTHopXZh5LU9tjwwzGxR0T95qc+7LT2Z2agtH80y+UJb3A2xUezKz8IySbjNi63XGuJd3VnCgIiX1U0He/PKeT4itrJOI0VvUydT+kBDcBCfay9x/QZn+l1W6bhJ96YdWka8f0QPQOhcHy+LdL1LQLviSPhvbtiwFvQMUg=----ATTACHMENT:----NzQ1ODM5MTU1NzE3NjU5IDM0Njg4ODQ3ODAxMTc1MzggNzQ0MDI0ODM2MDg3MzE3