/** * Convert EC public key to PEM. * * @return PEM */ public function toPEM() { $curve_oid = CurveParameter::nameToOID($this->curveParameter()->value()); $x = ECConversion::octetsToNumber($this->XCoordinateParameter()->coordinateOctets()); $y = ECConversion::octetsToNumber($this->YCoordinateParameter()->coordinateOctets()); $ec = ECPublicKey::fromCoordinates($x, $y, $curve_oid); return $ec->publicKeyInfo()->toPEM(); }
/** * * @see \JWX\JWS\Algorithm\OpenSSLSignatureAlgorithm::validateSignature() * @return bool */ public function validateSignature($data, $signature) { if (strlen($signature) != $this->_signatureSize) { throw new \UnexpectedValueException("Invalid signature length."); } list($r_octets, $s_octets) = str_split($signature, intval(floor($this->_signatureSize / 2))); // convert signature to DER sequence for OpenSSL $r = ECConversion::octetsToNumber($r_octets); $s = ECConversion::octetsToNumber($s_octets); $sig = new ECDSASigValue($r, $s); return parent::validateSignature($data, $sig->toDER()); }
/** * Convert EC private key to PEM. * * @return PEM */ public function toPEM() { $curve_oid = CurveParameter::nameToOID($this->curveParameter()->value()); $x = ECConversion::octetsToNumber($this->XCoordinateParameter()->coordinateOctets()); $y = ECConversion::octetsToNumber($this->YCoordinateParameter()->coordinateOctets()); $pubkey = ECPublicKey::fromCoordinates($x, $y, $curve_oid); $priv = $this->ECCPrivateKeyParameter()->privateKeyOctets(); $ec = new ECPrivateKey($priv, $curve_oid, $pubkey->ECPoint()); return $ec->privateKeyInfo()->toPEM(); }
/** * Get curve point coordinates. * * @return string[] Tuple of X and Y coordinates as base-10 numbers */ public function curvePoint() { return array_map(function ($str) { return ECConversion::octetsToNumber($str); }, $this->curvePointOctets()); }