/** * @param \Jose\Object\JWKInterface $private_key * @param \Jose\Object\JWKInterface $public_key * * @throws \InvalidArgumentException * * @return int|string|void */ public function calculateAgreementKey(JWKInterface $private_key, JWKInterface $public_key) { switch ($public_key->get('crv')) { case 'P-256': case 'P-384': case 'P-521': $p = $this->getGenerator($private_key); $rec_x = $this->convertBase64ToGmp($public_key->get('x')); $rec_y = $this->convertBase64ToGmp($public_key->get('y')); $sen_d = $this->convertBase64ToGmp($private_key->get('d')); $priv_key = $p->getPrivateKeyFrom($sen_d); $pub_key = $p->getPublicKeyFrom($rec_x, $rec_y); $ecdh = new EcDH(EccFactory::getAdapter()); $ecdh->setSenderKey($priv_key); $ecdh->setRecipientKey($pub_key); return $this->convertDecToBin($ecdh->calculateSharedKey()); case 'X25519': return curve25519_shared(Base64Url::decode($private_key->get('d')), Base64Url::decode($public_key->get('x'))); default: throw new \InvalidArgumentException(sprintf('The curve "%s" is not supported', $public_key->get('crv'))); } }
/** * {@inheritDoc} * @see \Mdanter\Ecc\Crypto\Key\PrivateKeyInterface::createExchange() */ public function createExchange(MessageFactory $messageFactory, PublicKeyInterface $recipient = null) { $exchange = new EcDH($this->adapter, $messageFactory); $exchange->setSenderKey($this); $exchange->setRecipientKey($recipient); return $exchange; }