Example #1
0
function sign($data, $privateKeyRaw = NULL)
{
    if ($privateKeyRaw == null) {
        global $thisEntity;
        // Load the private key if needed (from a hex string):
        if (!isset($thisEntity['PrivateKeyBytes'])) {
            // Load it now:
            $thisEntity['PrivateKeyBytes'] = hex2bin($thisEntity['PrivateKey']);
        }
        // Grab the raw private key (bytes):
        $privateKeyRaw = $thisEntity['PrivateKeyBytes'];
    }
    // Get the double hash of the data:
    $msg32 = hash('sha256', hash('sha256', $data, true), true);
    // Create a context:
    $ctx = secp256k1_context_create(SECP256K1_CONTEXT_SIGN);
    // Sign:
    $signature;
    if (secp256k1_ecdsa_sign($ctx, $msg32, $privateKeyRaw, $signature) != 1) {
        // This is a 500 error. Unable to sign.
        serverError();
    }
    // Serialize the signature:
    $serialized = '';
    secp256k1_ecdsa_signature_serialize_der($ctx, $signature, $serialized);
    return $serialized;
}
 public function test()
 {
     $privKey = hash('sha256', 'private key', true);
     $msg32 = hash('sha256', 'msg', true);
     $pub_t = '';
     /** @var resource $pub_t */
     $context = TestCase::getContext();
     // Create public key of our private key
     $this->assertEquals(1, secp256k1_ec_pubkey_create($context, $pub_t, $privKey));
     // Create recoverable signature
     $r_sig_t = '';
     /** @var resource $r_sig_t */
     $this->assertEquals(1, secp256k1_ecdsa_sign_recoverable($context, $r_sig_t, $msg32, $privKey));
     $this->assertEquals(SECP256K1_TYPE_RECOVERABLE_SIG, get_resource_type($r_sig_t));
     // Recover public key from the signature
     $r_pubkey_t = '';
     /** @var resource $r_pubkey_t */
     $this->assertEquals(1, secp256k1_ecdsa_recover($context, $r_pubkey_t, $r_sig_t, $msg32));
     // Compare the two public keys
     $sPubkey = '';
     $srPubkey = '';
     $this->assertEquals(1, secp256k1_ec_pubkey_serialize($context, $sPubkey, $pub_t, 0));
     $this->assertEquals(1, secp256k1_ec_pubkey_serialize($context, $srPubkey, $r_pubkey_t, 0));
     $this->assertEquals($sPubkey, $srPubkey);
     // Double check that serialize(sig) == serialize(parse(serialize(sig))
     $sSig = '';
     /** @var resource $sSig */
     $recid = '';
     secp256k1_ecdsa_recoverable_signature_serialize_compact($context, $r_sig_t, $sSig, $recid);
     $parsedSig = '';
     /** @var resource $parsedSig */
     $this->assertEquals(1, secp256k1_ecdsa_recoverable_signature_parse_compact($context, $parsedSig, $sSig, $recid));
     $sSigAgain = '';
     $recidAgain = '';
     secp256k1_ecdsa_recoverable_signature_serialize_compact($context, $parsedSig, $sSigAgain, $recidAgain);
     // Prepare expected DER sig
     $rl = 32;
     $r = substr($sSig, 0, 32);
     if (ord($sSig[0]) > 0x80) {
         $rl++;
         $r = "" . $r;
     }
     $sl = 32;
     $s = substr($sSig, 32, 32);
     if (ord($sSig[32]) > 0x80) {
         $sl++;
         $s = "" . $s;
     }
     $t = 4 + $rl + $sl;
     $der = "0" . chr($t) . "" . chr($rl) . $r . "" . chr($sl) . $s;
     $plain = '';
     /** @var resource $plain */
     // Test that conversion is successful
     $this->assertEquals(1, secp256k1_ecdsa_recoverable_signature_convert($context, $plain, $r_sig_t));
     // Test the converted sig's DER output matches what we expect
     $derSer = '';
     $this->assertEquals(1, secp256k1_ecdsa_signature_serialize_der($context, $derSer, $plain));
     $this->assertEquals($der, $derSer);
 }
 /**
  * @param Signature $signature
  * @return Buffer
  */
 private function doSerialize(Signature $signature)
 {
     $signatureOut = '';
     if (!secp256k1_ecdsa_signature_serialize_der($this->ecAdapter->getContext(), $signature->getResource(), $signatureOut)) {
         throw new \RuntimeException('Secp256k1: serialize der failure');
     }
     return new Buffer($signatureOut);
 }
Example #4
0
 /**
  * @param BufferInterface $msg32
  * @param PrivateKey $privateKey
  * @return Signature
  */
 private function doSign(BufferInterface $msg32, PrivateKey $privateKey)
 {
     /** @var resource $sig_t */
     $sig_t = '';
     if (1 !== secp256k1_ecdsa_sign($this->context, $msg32->getBinary(), $privateKey->getBinary(), $sig_t)) {
         throw new \RuntimeException('Secp256k1: failed to sign');
     }
     $derSig = '';
     secp256k1_ecdsa_signature_serialize_der($this->context, $sig_t, $derSig);
     $rL = ord($derSig[3]);
     $r = (new Buffer(substr($derSig, 4, $rL), $rL, $this->math))->getInt();
     $sL = ord($derSig[4 + $rL + 1]);
     $s = (new Buffer(substr($derSig, 4 + $rL + 2, $sL), $rL, $this->math))->getInt();
     return new Signature($this, $r, $s, $sig_t);
 }