8000 sign and verify contracts with secp256k1 by littleskunk · Pull Request #766 · storj-archived/core · GitHub
[go: up one dir, main page]
More Web Proxy on the site http://driver.im/
Skip to content
This repository was archived by the owner on Oct 30, 2018. It is now read-only.

sign and verify contracts with secp256k1 #766

Merged
merged 5 commits into from
Mar 12, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 18 additions & 0 deletions bench/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -116,6 +116,16 @@ function signMessage(deferred) {
});
}

function signContract(deferred) {
contract1.sign('renter', renterPrivateKey);
deferred.resolve();
}

function verifyContract(deferred) {
contract1.verify('renter', renterID);
deferred.resolve();
}

suite.add('new hd contract', newHDContract, {maxTime: maxTime});
suite.add('new contract', newContract, {maxTime: maxTime});
suite.add('verify message with hd contact', verifyHDContact, {
Expand All @@ -130,6 +140,14 @@ suite.add('sign message', signMessage, {
maxTime: maxTime,
defer: true
});
suite.add('sign contract', signContract, {
maxTime: maxTime,
defer: true
});
suite.add('verify contract', verifyContract, {
maxTime: maxTime,
defer: true
});

suite.on('cycle', function(event) {
console.log(String(event.target));
Expand Down
46 changes: 31 additions & 15 deletions lib/contract/index.js
Original file line number Diff line number Diff line change
@@ -1,14 +1,16 @@
'use strict';

var assert = require('assert');
var crypto = require('crypto');
var merge = require('merge');
var JSONSchema = require('jsen');
var stringify = require('json-stable-stringify');
var bitcore = require('bitcore-lib');
var constants = require('../constants');
var Message = require('bitcore-message');
var ms = require('ms');
const assert = require('assert');
const crypto = require('crypto');
const merge = require('merge');
const JSONSchema = require('jsen');
const stringify = require('json-stable-stringify');
const bitcore = require('bitcore-lib');
const constants = require('../constants');
const KeyPair = require('../crypto-tools/keypair');
const secp256k1 = require('secp256k1');
const Message = require('bitcore-message');
const ms = require('ms');

/**
* Represents a storage contract between a renter and a farmer
Expand Down Expand Up @@ -258,8 +260,17 @@ Contract.prototype.verify = function(actor, pubkeyhash) {
* @returns {String} externalSignature
*/
Contract.prototype.signExternal = function(secret) {
var message = Message(this.getSigningData());
return message.sign(bitcore.PrivateKey.fromString(secret));
var keypair = KeyPair(secret);
var hash = Message(this.getSigningData()).magicHash();
var signobj = secp256k1.sign(hash,
new Buffer (keypair.getPrivateKeyPadded(), 'hex'));
var sign = bitcore.crypto.Signature.fromDER(
secp256k1.signatureExport(signobj.signature)
).toCompact(
signobj.recovery,
keypair.getPublicKey.compressed
).toString('base64');
return sign;
};

/**
Expand All @@ -273,14 +284,19 @@ Contract.prototype.verifyExternal = function(signature, pubkeyhash) {
return false;
}

var message = Message(this.getSigningData());
var address = bitcore.Address.fromPublicKeyHash(Buffer(pubkeyhash, 'hex'));

var magic = Message(this.getSigningData()).magicHash();

try {
return message.verify(address, signature);
var signobj = bitcore.crypto.Signature.fromCompact(
new Buffer(signature, 'base64'));
var sig = secp256k1.signatureImport(signobj.toBuffer());
var recovery = signobj.i;
var pubKey = secp256k1.recover(magic, sig, recovery, true);
} catch (err) {
return false;
}
return secp256k1.verify(magic, sig, pubKey) &&
bitcore.crypto.Hash.sha256ripemd160(pubKey).toString('hex') === pubkeyhash;
};

/**
Expand Down
3 changes: 2 additions & 1 deletion test/contract/index.unit.js
Original file line number Diff line number Diff line change
Expand Up @@ -259,7 +259,8 @@ describe('Contract (private)', function() {

it('should return true if fields are not null', function() {
var kp1 = KeyPair();
var kp2 = KeyPair();
var kp2 = KeyPair(
'00008b387bed22aff9ca560416d7b13ecbad16f28bc41ef5acaff3019bfa5134');
var contract = new Contract({
renter_id: kp1.getNodeID(),
farmer_id: kp2.getNodeID(),
Expand Down
0