[ Index ]

PHP Cross Reference of Joomla 4.2.2 documentation

title

Body

[close]

/libraries/vendor/phpseclib/phpseclib/phpseclib/Crypt/DSA/ -> PublicKey.php (source)

   1  <?php
   2  
   3  /**
   4   * DSA Public Key
   5   *
   6   * @category  Crypt
   7   * @package   DSA
   8   * @author    Jim Wigginton <[email protected]>
   9   * @copyright 2015 Jim Wigginton
  10   * @license   http://www.opensource.org/licenses/mit-license.html  MIT License
  11   * @link      http://phpseclib.sourceforge.net
  12   */
  13  
  14  namespace phpseclib3\Crypt\DSA;
  15  
  16  use phpseclib3\Crypt\Common;
  17  use phpseclib3\Crypt\DSA;
  18  use phpseclib3\Crypt\DSA\Formats\Signature\ASN1 as ASN1Signature;
  19  
  20  /**
  21   * DSA Public Key
  22   *
  23   * @package DSA
  24   * @author  Jim Wigginton <[email protected]>
  25   * @access  public
  26   */
  27  class PublicKey extends DSA implements Common\PublicKey
  28  {
  29      use Common\Traits\Fingerprint;
  30  
  31      /**
  32       * Verify a signature
  33       *
  34       * @see self::verify()
  35       * @access public
  36       * @param string $message
  37       * @param string $signature
  38       * @return mixed
  39       */
  40      public function verify($message, $signature)
  41      {
  42          $format = $this->sigFormat;
  43  
  44          $params = $format::load($signature);
  45          if ($params === false || count($params) != 2) {
  46              return false;
  47          }
  48          extract($params);
  49  
  50          if (self::$engines['OpenSSL'] && in_array($this->hash->getHash(), openssl_get_md_methods())) {
  51              $sig = $format != 'ASN1' ? ASN1Signature::save($r, $s) : $signature;
  52  
  53              $result = openssl_verify($message, $sig, $this->toString('PKCS8'), $this->hash->getHash());
  54  
  55              if ($result != -1) {
  56                  return (bool) $result;
  57              }
  58          }
  59  
  60          $q_1 = $this->q->subtract(self::$one);
  61          if (!$r->between(self::$one, $q_1) || !$s->between(self::$one, $q_1)) {
  62              return false;
  63          }
  64  
  65          $w = $s->modInverse($this->q);
  66          $h = $this->hash->hash($message);
  67          $h = $this->bits2int($h);
  68          list(, $u1) = $h->multiply($w)->divide($this->q);
  69          list(, $u2) = $r->multiply($w)->divide($this->q);
  70          $v1 = $this->g->powMod($u1, $this->p);
  71          $v2 = $this->y->powMod($u2, $this->p);
  72          list(, $v) = $v1->multiply($v2)->divide($this->p);
  73          list(, $v) = $v->divide($this->q);
  74  
  75          return $v->equals($r);
  76      }
  77  
  78      /**
  79       * Returns the public key
  80       *
  81       * @param string $type
  82       * @param array $options optional
  83       * @return string
  84       */
  85      public function toString($type, array $options = [])
  86      {
  87          $type = self::validatePlugin('Keys', $type, 'savePublicKey');
  88  
  89          return $type::savePublicKey($this->p, $this->q, $this->g, $this->y, $options);
  90      }
  91  }


Generated: Wed Sep 7 05:41:13 2022 Chilli.vc Blog - For Webmaster,Blog-Writer,System Admin and Domainer