예제 #1
0
 /**
  * @see AbstractPublicKey::verify($message, $signature)
  */
 public function verify($message, $signature)
 {
     $params = DSAKeyPair::$KEYSIZES[$this->keysize];
     $hash_alg = $params["hashAlg"];
     $hexlength = $params["q_bitlength"] / 4;
     // we pre-pad with 0s because encoding may have gotten rid of some
     $signature = Utils::hex_lpad(bin2hex($signature), $hexlength * 2);
     // now this should only happen if the signature was longer
     if (strlen($signature) != $hexlength * 2) {
         throw new \Exception("problem with r/s combo: " . sizeof($signature) . "/" . $hexlength . " - " . $signature);
     }
     $r = new MathBigInteger(substr($signature, 0, $hexlength), 16);
     $s = new MathBigInteger(substr($signature, $hexlength, $hexlength), 16);
     // check rangeconstraints
     if ($r->compare(DSAKeyPair::$zero) < 0 || $r->compare($this->key_q) > 0) {
         throw new \Exception("problem with r: " . $r->toString());
     }
     if ($s->compare(DSAKeyPair::$zero) < 0 || $s->compare($this->key_q) > 0) {
         throw new \Exception("problem with s: " . $r->toString());
     }
     return CryptDSA::verify($message, $hash_alg, $r, $s, $this->key_p, $this->key_q, $this->key_g, $this->key_y);
 }
예제 #2
0
 /**
  * @see AbstractSecretKey::sign($message)
  */
 public function sign($message)
 {
     $params = DSAKeyPair::$KEYSIZES[$this->keysize];
     $hash_alg = $params["hashAlg"];
     $hexlength = $params["q_bitlength"] / 4;
     $keys = CryptDSA::sign($message, $hash_alg, $this->key_p, $this->key_q, $this->key_g, $this->key_x);
     $signature = Utils::hex_lpad($keys["r"]->toHex(), $hexlength) . Utils::hex_lpad($keys["s"]->toHex(), $hexlength);
     return pack("H*", $signature);
 }