Exemplo n.º 1
0
 /**
  * Computes the shared secret from the private DH value $dh and the other
  * party's public value in $pub_key
  *
  * @param string $pub_key other party's public value
  * @param mixed $dh Diffie-Hellman key
  * @return string
  * @throws Zend\OpenId\Exception
  */
 public static function computeDhSecret($pub_key, $dh)
 {
     if (function_exists('openssl_dh_compute_key')) {
         $ret = openssl_dh_compute_key($pub_key, $dh);
         if (ord($ret[0]) > 127) {
             $ret = "" . $ret;
         }
         return $ret;
     } else {
         if (extension_loaded('gmp')) {
             $bn_pub_key = self::binToBigNum($pub_key);
             $bn_secret = gmp_powm($bn_pub_key, $dh['priv_key'], $dh['p']);
             return self::bigNumToBin($bn_secret);
         } else {
             if (extension_loaded('bcmath')) {
                 $bn_pub_key = self::binToBigNum($pub_key);
                 $bn_secret = bcpowmod($bn_pub_key, $dh['priv_key'], $dh['p']);
                 return self::bigNumToBin($bn_secret);
             }
         }
     }
     throw new Exception('The system doesn\'t have proper big integer extension', Exception::UNSUPPORTED_LONG_MATH);
 }
Exemplo n.º 2
0
 public static function dhComputeKey($pubKey, PKey $dhKey)
 {
     $return = openssl_dh_compute_key($pubKey, $dhKey->getResource());
     self::handleReturn($return);
     return $return;
 }
Exemplo n.º 3
0
 /**
  * Compute the shared secret key based on the public key received from the
  * the second party to this transaction. This should agree to the secret
  * key the second party computes on our own public key.
  * Once in agreement, the key is known to only to both parties.
  * By default, the function expects the public key to be in binary form
  * which is the typical format when being transmitted.
  *
  * If you need the binary form of the shared secret key, call
  * getSharedSecretKey() with the optional parameter for Binary output.
  *
  * @param string $publicKey
  * @param string $type
  * @return mixed
  */
 public function computeSecretKey($publicKey, $type = self::NUMBER, $output = self::NUMBER)
 {
     if ($type == self::BINARY) {
         $publicKey = $this->_math->fromBinary($publicKey);
     }
     if (!preg_match("/^\\d+\$/", $publicKey)) {
         #require_once('Zend/Crypt/DiffieHellman/Exception.php');
         throw new Zend_Crypt_DiffieHellman_Exception('invalid parameter; not a positive natural number');
     }
     if (function_exists('openssl_dh_compute_key') && self::$useOpenssl !== false) {
         $this->_secretKey = openssl_dh_compute_key($publicKey, $this->getPublicKey());
     } else {
         $this->_secretKey = $this->_math->powmod($publicKey, $this->getPrivateKey(), $this->getPrime());
     }
     return $this->getSharedSecretKey($output);
 }
Exemplo n.º 4
0
 /**
  * Compute the shared secret key based on the public key received from the
  * the second party to this transaction. This should agree to the secret
  * key the second party computes on our own public key.
  * Once in agreement, the key is known to only to both parties.
  * By default, the function expects the public key to be in binary form
  * which is the typical format when being transmitted.
  *
  * If you need the binary form of the shared secret key, call
  * getSharedSecretKey() with the optional parameter for Binary output.
  *
  * @param string $publicKey
  * @param string $publicKeyFormat
  * @param string $secretKeyFormat
  * @return string
  * @throws \Zend\Crypt\Exception\InvalidArgumentException
  * @throws \Zend\Crypt\Exception\RuntimeException
  */
 public function computeSecretKey($publicKey, $publicKeyFormat = self::FORMAT_NUMBER, $secretKeyFormat = self::FORMAT_NUMBER)
 {
     if (function_exists('openssl_dh_compute_key') && static::$useOpenssl !== false) {
         $publicKey = $this->convert($publicKey, $publicKeyFormat, self::FORMAT_BINARY);
         $secretKey = openssl_dh_compute_key($publicKey, $this->opensslKeyResource);
         if (false === $secretKey) {
             throw new Exception\RuntimeException('Can not compute key; openssl ' . openssl_error_string());
         }
         $this->secretKey = $this->convert($secretKey, self::FORMAT_BINARY, self::FORMAT_NUMBER);
     } else {
         $publicKey = $this->convert($publicKey, $publicKeyFormat, self::FORMAT_NUMBER);
         if (!preg_match('/^\\d+$/', $publicKey)) {
             throw new Exception\InvalidArgumentException('Invalid parameter; not a positive natural number');
         }
         $this->secretKey = $this->math->powmod($publicKey, $this->getPrivateKey(), $this->getPrime());
     }
     return $this->getSharedSecretKey($secretKeyFormat);
 }