fix issue by outputing proper pubkey format
The way I was outputting the pubkeys would be incorrect if the first byte of one of the coordinates was 0, since it would print the first non-zero byte first. The solution was to use the standard openssl function that outputs a public key to oct.
This commit is contained in:
parent
d11361be9e
commit
a686e63b0b
12
src/eckey.cc
12
src/eckey.cc
|
@ -435,12 +435,10 @@ Key::AddUncompressed(const Arguments& args)
|
||||||
EC_KEY *eckey = EC_KEY_new_by_curve_name(NID_secp256k1);
|
EC_KEY *eckey = EC_KEY_new_by_curve_name(NID_secp256k1);
|
||||||
const EC_GROUP *group = EC_KEY_get0_group(eckey);
|
const EC_GROUP *group = EC_KEY_get0_group(eckey);
|
||||||
|
|
||||||
|
|
||||||
BN_CTX *ctx;
|
BN_CTX *ctx;
|
||||||
EC_POINT *p0, *p1, *r;
|
EC_POINT *p0, *p1, *r;
|
||||||
BIGNUM *p0x, *p0y, *p1x, *p1y, *rx, *ry;
|
BIGNUM *p0x, *p0y, *p1x, *p1y, *rx, *ry;
|
||||||
Buffer *rbuf;
|
Buffer *rbuf;
|
||||||
unsigned char *rcx, *rcy;
|
|
||||||
|
|
||||||
p0 = EC_POINT_new(group);
|
p0 = EC_POINT_new(group);
|
||||||
p1 = EC_POINT_new(group);
|
p1 = EC_POINT_new(group);
|
||||||
|
@ -463,17 +461,9 @@ Key::AddUncompressed(const Arguments& args)
|
||||||
EC_POINT_get_affine_coordinates_GFp(group, r, rx, ry, ctx);
|
EC_POINT_get_affine_coordinates_GFp(group, r, rx, ry, ctx);
|
||||||
|
|
||||||
rbuf = Buffer::New(65);
|
rbuf = Buffer::New(65);
|
||||||
rcx = (unsigned char *)malloc(32);
|
EC_POINT_point2oct(group, r, POINT_CONVERSION_UNCOMPRESSED, (unsigned char *)Buffer::Data(rbuf), 65, ctx);
|
||||||
rcy = (unsigned char *)malloc(32);
|
|
||||||
BN_bn2bin(rx, rcx);
|
|
||||||
BN_bn2bin(ry, rcy);
|
|
||||||
memcpy(&(((unsigned char *)Buffer::Data(rbuf))[1]), rcx, 32);
|
|
||||||
memcpy(&(((unsigned char *)Buffer::Data(rbuf))[33]), rcy, 32);
|
|
||||||
((unsigned char *)Buffer::Data(rbuf))[0] = 0x04;
|
|
||||||
|
|
||||||
//free: eckey, p0, p1, r, p0x, p0y, p1x, p1y, ctx, rx, ry, /*rbuf,*/ rcx, rcy
|
//free: eckey, p0, p1, r, p0x, p0y, p1x, p1y, ctx, rx, ry, /*rbuf,*/ rcx, rcy
|
||||||
free(rcy); //TODO: also clear
|
|
||||||
free(rcx); //TODO: also clear
|
|
||||||
BN_clear_free(ry);
|
BN_clear_free(ry);
|
||||||
BN_clear_free(rx);
|
BN_clear_free(rx);
|
||||||
//do not free rbuf - this is returned
|
//do not free rbuf - this is returned
|
||||||
|
|
|
@ -1,8 +1,9 @@
|
||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
|
var assert = require('assert');
|
||||||
var chai = chai || require('chai');
|
var chai = chai || require('chai');
|
||||||
var bitcore = bitcore || require('../bitcore');
|
var bitcore = bitcore || require('../bitcore');
|
||||||
|
var coinUtil = coinUtil || require('../util/util');
|
||||||
var buffertools = require('buffertools');
|
var buffertools = require('buffertools');
|
||||||
|
|
||||||
var should = chai.should();
|
var should = chai.should();
|
||||||
|
@ -118,6 +119,7 @@ describe('Key', function() {
|
||||||
it('should exist', function() {
|
it('should exist', function() {
|
||||||
should.exist(Key.addUncompressed);
|
should.exist(Key.addUncompressed);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should add two uncompressed public keys', function() {
|
it('should add two uncompressed public keys', function() {
|
||||||
var key1 = Key.generateSync();
|
var key1 = Key.generateSync();
|
||||||
key1.compressed = false;
|
key1.compressed = false;
|
||||||
|
@ -128,6 +130,56 @@ describe('Key', function() {
|
||||||
var pubkey = Key.addUncompressed(pubkey1, pubkey2);
|
var pubkey = Key.addUncompressed(pubkey1, pubkey2);
|
||||||
pubkey.length.should.equal(65);
|
pubkey.length.should.equal(65);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('a + b should equal b + a', function() {
|
||||||
|
var key1 = Key.generateSync();
|
||||||
|
key1.compressed = false;
|
||||||
|
var key2 = Key.generateSync();
|
||||||
|
key2.compressed = false;
|
||||||
|
var pubkey1 = key1.public;
|
||||||
|
var pubkey2 = key2.public;
|
||||||
|
var r1 = Key.addUncompressed(pubkey1, pubkey2);
|
||||||
|
var r2 = Key.addUncompressed(pubkey2, pubkey1);
|
||||||
|
r1.toString('hex').should.equal(r2.toString('hex'));
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should be able to add these two public keys without error', function() {
|
||||||
|
var key1 = new Key();
|
||||||
|
key1.private = coinUtil.sha256("first " + 3);
|
||||||
|
key1.compressed = false;
|
||||||
|
key1.regenerateSync();
|
||||||
|
var key2 = new Key();
|
||||||
|
key2.private = coinUtil.sha256("second " + 3);
|
||||||
|
key2.compressed = false;
|
||||||
|
key2.regenerateSync();
|
||||||
|
var pubkey1 = key1.public;
|
||||||
|
var pubkey2 = key2.public;
|
||||||
|
var pubkey = Key.addUncompressed(pubkey1, pubkey2);
|
||||||
|
pubkey.length.should.equal(65);
|
||||||
|
var key = new Key();
|
||||||
|
key.public = pubkey;
|
||||||
|
assert(key.public !== null);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should be able to add many public keys without error', function() {
|
||||||
|
for (var i = 0; i <= 1000; i++) {
|
||||||
|
var key1 = new Key();
|
||||||
|
key1.private = coinUtil.sha256("first " + i);
|
||||||
|
key1.compressed = false;
|
||||||
|
key1.regenerateSync();
|
||||||
|
var key2 = new Key();
|
||||||
|
key2.private = coinUtil.sha256("second " + i);
|
||||||
|
key2.compressed = false;
|
||||||
|
key2.regenerateSync();
|
||||||
|
var pubkey1 = key1.public;
|
||||||
|
var pubkey2 = key2.public;
|
||||||
|
var pubkey = Key.addUncompressed(pubkey1, pubkey2);
|
||||||
|
pubkey.length.should.equal(65);
|
||||||
|
var key = new Key();
|
||||||
|
key.public = pubkey;
|
||||||
|
assert(key.public !== null);
|
||||||
|
};
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
Loading…
Reference in New Issue