2018-06-17 23:32:57 +03:00
|
|
|
'use strict';
|
|
|
|
var __importStar = (this && this.__importStar) || function (mod) {
|
|
|
|
if (mod && mod.__esModule) return mod;
|
|
|
|
var result = {};
|
|
|
|
if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
|
|
|
|
result["default"] = mod;
|
|
|
|
return result;
|
|
|
|
};
|
|
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
2018-07-13 03:14:04 +03:00
|
|
|
var elliptic_1 = require("elliptic");
|
|
|
|
var curve = new elliptic_1.ec('secp256k1');
|
2018-06-17 23:32:57 +03:00
|
|
|
var address_1 = require("./address");
|
2018-06-17 23:47:28 +03:00
|
|
|
var bytes_1 = require("./bytes");
|
2018-06-17 23:32:57 +03:00
|
|
|
var keccak256_1 = require("./keccak256");
|
2018-06-17 23:47:28 +03:00
|
|
|
var properties_1 = require("./properties");
|
|
|
|
var errors = __importStar(require("./errors"));
|
2018-06-17 23:32:57 +03:00
|
|
|
exports.N = '0x' + curve.n.toString(16);
|
|
|
|
var KeyPair = /** @class */ (function () {
|
|
|
|
function KeyPair(privateKey) {
|
2018-06-17 23:47:28 +03:00
|
|
|
var keyPair = curve.keyFromPrivate(bytes_1.arrayify(privateKey));
|
|
|
|
properties_1.defineReadOnly(this, 'privateKey', bytes_1.hexlify(keyPair.priv.toArray('be', 32)));
|
2018-06-17 23:32:57 +03:00
|
|
|
properties_1.defineReadOnly(this, 'publicKey', '0x' + keyPair.getPublic(false, 'hex'));
|
|
|
|
properties_1.defineReadOnly(this, 'compressedPublicKey', '0x' + keyPair.getPublic(true, 'hex'));
|
|
|
|
properties_1.defineReadOnly(this, 'publicKeyBytes', keyPair.getPublic().encode(null, true));
|
|
|
|
}
|
|
|
|
KeyPair.prototype.sign = function (digest) {
|
2018-06-17 23:47:28 +03:00
|
|
|
var keyPair = curve.keyFromPrivate(bytes_1.arrayify(this.privateKey));
|
|
|
|
var signature = keyPair.sign(bytes_1.arrayify(digest), { canonical: true });
|
2018-06-17 23:32:57 +03:00
|
|
|
return {
|
|
|
|
recoveryParam: signature.recoveryParam,
|
2018-06-18 12:42:41 +03:00
|
|
|
r: bytes_1.hexZeroPad('0x' + signature.r.toString(16), 32),
|
|
|
|
s: bytes_1.hexZeroPad('0x' + signature.s.toString(16), 32),
|
2018-06-17 23:32:57 +03:00
|
|
|
v: 27 + signature.recoveryParam
|
|
|
|
};
|
|
|
|
};
|
|
|
|
return KeyPair;
|
|
|
|
}());
|
|
|
|
exports.KeyPair = KeyPair;
|
|
|
|
function recoverPublicKey(digest, signature) {
|
|
|
|
var sig = {
|
2018-06-17 23:47:28 +03:00
|
|
|
r: bytes_1.arrayify(signature.r),
|
|
|
|
s: bytes_1.arrayify(signature.s)
|
2018-06-17 23:32:57 +03:00
|
|
|
};
|
2018-06-17 23:47:28 +03:00
|
|
|
return '0x' + curve.recoverPubKey(bytes_1.arrayify(digest), sig, signature.recoveryParam).encode('hex', false);
|
2018-06-17 23:32:57 +03:00
|
|
|
}
|
|
|
|
exports.recoverPublicKey = recoverPublicKey;
|
|
|
|
function computePublicKey(key, compressed) {
|
2018-06-17 23:47:28 +03:00
|
|
|
var bytes = bytes_1.arrayify(key);
|
2018-06-17 23:32:57 +03:00
|
|
|
if (bytes.length === 32) {
|
|
|
|
var keyPair = new KeyPair(bytes);
|
|
|
|
if (compressed) {
|
|
|
|
return keyPair.compressedPublicKey;
|
|
|
|
}
|
|
|
|
return keyPair.publicKey;
|
|
|
|
}
|
|
|
|
else if (bytes.length === 33) {
|
|
|
|
if (compressed) {
|
2018-06-17 23:47:28 +03:00
|
|
|
return bytes_1.hexlify(bytes);
|
2018-06-17 23:32:57 +03:00
|
|
|
}
|
|
|
|
return '0x' + curve.keyFromPublic(bytes).getPublic(false, 'hex');
|
|
|
|
}
|
|
|
|
else if (bytes.length === 65) {
|
|
|
|
if (!compressed) {
|
2018-06-17 23:47:28 +03:00
|
|
|
return bytes_1.hexlify(bytes);
|
2018-06-17 23:32:57 +03:00
|
|
|
}
|
|
|
|
return '0x' + curve.keyFromPublic(bytes).getPublic(true, 'hex');
|
|
|
|
}
|
|
|
|
errors.throwError('invalid public or private key', errors.INVALID_ARGUMENT, { arg: 'key', value: '[REDACTED]' });
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
exports.computePublicKey = computePublicKey;
|
|
|
|
function recoverAddress(digest, signature) {
|
|
|
|
return computeAddress(recoverPublicKey(digest, signature));
|
|
|
|
}
|
|
|
|
exports.recoverAddress = recoverAddress;
|
|
|
|
function computeAddress(key) {
|
|
|
|
// Strip off the leading "0x04"
|
|
|
|
var publicKey = '0x' + computePublicKey(key).slice(4);
|
|
|
|
return address_1.getAddress('0x' + keccak256_1.keccak256(publicKey).substring(26));
|
|
|
|
}
|
|
|
|
exports.computeAddress = computeAddress;
|