Exemplo n.º 1
0
 /**
  * before_request
  * Hook for PHP Requests
  *
  * @param $url
  * @param $headers
  * @param $data
  */
 public function before_request(&$url, &$headers, &$data)
 {
     // generate a date string
     $date = new \DateTime('NOW', new \DateTimeZone("GMT"));
     $headers['Date'] = $date->format("D, d M Y H:i:s \\G\\M\\T");
     // build up the data to be signed
     $request_data = $headers['Date'] . "\n" . $url . "\n";
     if (!empty($data)) {
         $request_data .= http_build_query($data);
     }
     // get a signature for our request
     // private key is in hex form, needs to be converted into PrivateKey Object
     $generator = EccFactory::getNistCurves()->generator256();
     $private_key = new PrivateKey($this->math_adapter, $generator, $this->math_adapter->hexDec($this->private_key));
     $hash = $this->math_adapter->hexDec(hash("sha256", $request_data));
     $signer = EccFactory::getSigner();
     $randomK = RandomGeneratorFactory::getRandomGenerator()->generate($private_key->getPoint()->getOrder());
     $signatureObj = $signer->sign($private_key, $hash, $randomK);
     $signature = $this->math_adapter->decHex($signatureObj->getR()) . $this->math_adapter->decHex($signatureObj->getS());
     // apply the HTTP headers and send the request
     $headers['X-Service'] = $this->service_name;
     $headers['X-Signature'] = $signature;
     if ($this->debug) {
         echo "\n\nRequest Data\n\n";
         echo "URL:\n";
         var_dump($url);
         echo "HEADERS:\n";
         var_dump($headers);
         echo "DATA:\n";
         var_dump($data);
     }
 }
Exemplo n.º 2
0
 /**
  * @param string $content
  * @param Binary $key
  * @return string
  */
 public function sign($content, Binary $key)
 {
     $math = MathAdapterFactory::getAdapter();
     $inflatedPrivateKey = $this->deserializePrivate($key->getData(), $math);
     $rng = RandomGeneratorFactory::getRandomGenerator();
     $hash = $this->hash($content);
     $signer = new Signer($math);
     $signature = $signer->sign($inflatedPrivateKey, $hash, $rng->generate($inflatedPrivateKey->getPoint()->getOrder()));
     return $signature->getR() . self::$SIGNATURE_GLUE . $signature->getS();
 }
Exemplo n.º 3
0
 /**
  * @param \Jose\Object\JWKInterface $key
  * @param string                    $data
  *
  * @return string
  */
 private function getPHPECCSignature(JWKInterface $key, $data)
 {
     $p = $this->getGenerator();
     $d = $this->convertBase64ToGmp($key->get('d'));
     $hash = $this->convertHexToGmp(hash($this->getHashAlgorithm(), $data));
     $k = RandomGeneratorFactory::getRandomGenerator()->generate($p->getOrder());
     $signer = EccFactory::getSigner();
     $private_key = $p->getPrivateKeyFrom($d);
     $signature = $signer->sign($private_key, $hash, $k);
     $part_length = $this->getSignaturePartLength();
     $R = str_pad($this->convertDecToHex($signature->getR()), $part_length, '0', STR_PAD_LEFT);
     $S = str_pad($this->convertDecToHex($signature->getS()), $part_length, '0', STR_PAD_LEFT);
     return $this->convertHexToBin($R . $S);
 }
Exemplo n.º 4
0
 /**
  *
  * @dataProvider getAdapters
  */
 public function testSecp256r1EquivalenceToNistP192(MathAdapterInterface $adapter)
 {
     $secpFactory = EccFactory::getSecgCurves($adapter);
     $nistFactory = EccFactory::getNistCurves($adapter);
     $signer = new Signer($adapter);
     $secret = $adapter->hexDec('DC51D3866A15BACDE33D96F992FCA99DA7E6EF0934E7097559C27F1614C88A7F');
     $secpKey = $secpFactory->generator256r1()->getPrivateKeyFrom($secret);
     $nistKey = $nistFactory->generator256()->getPrivateKeyFrom($secret);
     $randomK = RandomGeneratorFactory::getRandomGenerator()->generate($secpKey->getPoint()->getOrder());
     $message = RandomGeneratorFactory::getRandomGenerator()->generate($secpKey->getPoint()->getOrder());
     $sigSecp = $signer->sign($secpKey, $message, $randomK);
     $sigNist = $signer->sign($nistKey, $message, $randomK);
     $this->assertEquals($sigNist->getR(), $sigSecp->getR());
     $this->assertEquals($sigNist->getS(), $sigSecp->getS());
 }
Exemplo n.º 5
0
 /**
  * {@inheritdoc}
  */
 public function sign(JWKInterface $key, $data)
 {
     $this->checkKey($key);
     if (!$key->has('d')) {
         throw new \InvalidArgumentException('The EC key is not private');
     }
     $p = $this->getGenerator();
     $d = $this->convertBase64ToDec($key->get('d'));
     $hash = $this->convertHexToDec(hash($this->getHashAlgorithm(), $data));
     $k = RandomGeneratorFactory::getRandomGenerator()->generate($p->getOrder());
     $signer = EccFactory::getSigner();
     $private_key = $p->getPrivateKeyFrom($d);
     $signature = $signer->sign($private_key, $hash, $k);
     $part_length = $this->getSignaturePartLength();
     $R = str_pad($this->convertDecToHex($signature->getR()), $part_length, '0', STR_PAD_LEFT);
     $S = str_pad($this->convertDecToHex($signature->getS()), $part_length, '0', STR_PAD_LEFT);
     return $this->convertHextoBin($R . $S);
 }
Exemplo n.º 6
0
 /**
  * {@inheritdoc}
  */
 public function createHash(string $payload, Key $key, RandomNumberGeneratorInterface $generator = null) : string
 {
     $privateKey = $this->parser->getPrivateKey($key);
     $generator = $generator ?: RandomGeneratorFactory::getRandomGenerator();
     return $this->createSignatureHash($this->signer->sign($privateKey, $this->createSigningHash($payload), $generator->generate($privateKey->getPoint()->getOrder())));
 }
Exemplo n.º 7
0
 /**
  * @param MathAdapterInterface           $adapter
  * @param CurveFpInterface               $curve
  * @param int|string                     $x
  * @param int|string                     $y
  * @param null                           $order
  * @param RandomNumberGeneratorInterface $generator
  */
 public function __construct(MathAdapterInterface $adapter, CurveFpInterface $curve, $x, $y, $order = null, RandomNumberGeneratorInterface $generator = null)
 {
     $this->generator = $generator ?: RandomGeneratorFactory::getRandomGenerator();
     parent::__construct($adapter, $curve, $x, $y, $order);
 }