function verify($signatureB64, $data, $publicKeyRaw) { if ($publicKeyRaw == null) { global $thisEntity; // Load the public key if needed (from a hex string): if (!isset($thisEntity['PublicKeyBytes'])) { // Load it now: $thisEntity['PublicKeyBytes'] = hex2bin($thisEntity['Key']); } // Grab the raw public key (bytes): $publicKeyRaw = $thisEntity['PublicKeyBytes']; } // Decode the signature from base64: $decodedSignature = base64_decode($signatureB64, true); if ($decodedSignature === false) { // Invalid signature. error('field/invalid', 'signature'); } // Get the double hash of the data: $msg32 = hash('sha256', hash('sha256', $data, true), true); // Create a context: $ctx = secp256k1_context_create(SECP256K1_CONTEXT_VERIFY); // Load up the public key from its bytes (into $publicKey): $publicKey; secp256k1_ec_pubkey_parse($ctx, $publicKeyRaw, $publicKey); // Load up the signature from its bytes (into $signature): $signature; secp256k1_ecdsa_signature_parse_der($ctx, $decodedSignature, $signature); if ($signature == null) { // Not a valid signature. error('field/invalid', 'signature'); } // Verify: return secp256k1_ecdsa_verify($ctx, $msg32, $signature, $publicKey); }
/** * @param $privkey * @param $msg * @param $sig * @param $ePubCreate * @param $eSigCreate */ private function genericTest($context, $privkey, $msg, $sig, $ePubCreate, $eSigCreate) { $seckey = $this->toBinary32($privkey); $msg = $this->toBinary32($msg); $sig = pack("H*", $sig); /** @var resource $pubkey */ $pubkey = ''; $this->assertEquals($ePubCreate, \secp256k1_ec_pubkey_create($context, $pubkey, $seckey)); /** @var resource $s */ $s = ''; secp256k1_ecdsa_signature_parse_der($context, $s, $sig); $this->assertEquals($eSigCreate, \secp256k1_ecdsa_verify($context, $s, $msg, $pubkey)); }
<?php $publicKey = pack("H*", "0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798"); $msg = pack("H*", "fb3a3384783921e1bc394229481209f29f70c588f1c8092cb7e43fdcadcfe241"); $sig = pack("H*", "3045022100987ceade6a304fc5823ab38f99fc3c5f772a2d3e89ea05931e2726105fc53b9e0220601fc3231f35962c714fcbce5c95b427496edc7ae8b3d12e93791d7629795b62"); for ($i = 0; $i < 100000; $i++) { secp256k1_ecdsa_verify($msg, $sig, $publicKey); }
<?php $context = secp256k1_context_create(SECP256K1_CONTEXT_VERIFY | SECP256K1_CONTEXT_SIGN); $context = secp256k1_context_create(SECP256K1_CONTEXT_SIGN | SECP256K1_CONTEXT_VERIFY); $msg32 = hash('sha256', 'this is a message!', true); $signatureRaw = pack("H*", "3044022055ef6953afd139d917d947ba7823ab5dfb9239ba8a26295a218cad88fb7299ef022057147cf4233ff3b87fa64d82a0b9a327e9b6d5d0070ab3f671b795934c4f2074"); $publicKeyRaw = pack("H*", '04fae8f5e64c9997749ef65c5db9f0ec3e121dc6901096c30da0f105a13212b6db4315e65a2d63cc667c034fac05cdb3c7bc1abfc2ad90f7f97321613f901758c9'); // Load up the public key from its bytes (into $publicKey): /** @var resource $publicKey */ $publicKey = ''; secp256k1_ec_pubkey_parse($context, $publicKey, $publicKeyRaw); // Load up the signature from its bytes (into $signature): /** @var resource $signature */ $signature = ''; secp256k1_ecdsa_signature_parse_der($context, $signature, $signatureRaw); // Verify: for ($i = 0; $i < 10000; $i++) { $result = secp256k1_ecdsa_verify($context, $signature, $msg32, $publicKey); }
/** * @param Buffer $messageHash * @param PublicKeyInterface $publicKey * @param SignatureInterface $signature * @return bool * @throws \Exception */ public function verify(Buffer $messageHash, PublicKeyInterface $publicKey, SignatureInterface $signature) { $ret = \secp256k1_ecdsa_verify($messageHash->getBinary(), $signature->getBuffer()->getBinary(), $publicKey->getBuffer()->getBinary()); if ($ret === -1) { throw new \Exception('Secp256k1 verify: Invalid public key'); } else { if ($ret === -2) { throw new \Exception('Secp256k1 verify: Invalid signature'); } } return $ret === 1 ? true : false; }
/** * @param BufferInterface $msg32 * @param PublicKey $publicKey * @param Signature $signature * @return bool */ private function doVerify(BufferInterface $msg32, PublicKey $publicKey, Signature $signature) { return (bool) secp256k1_ecdsa_verify($this->context, $msg32->getBinary(), $signature->getResource(), $publicKey->getResource()); }