@tgrospic/rnode-http-js
Version:
HTTP client support for RNode
92 lines • 4.68 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.deployDataProtobufSerialize = exports.verifyDeploy = exports.signDeploy = void 0;
// @ts-ignore
var blakejs_1 = __importDefault(require("blakejs"));
var elliptic_1 = require("elliptic");
var google_protobuf_1 = __importDefault(require("google-protobuf"));
/**
* Sign deploy data.
*/
var signDeploy = function (privateKey, deployObj) {
var term = deployObj.term, timestamp = deployObj.timestamp, phloPrice = deployObj.phloPrice, phloLimit = deployObj.phloLimit, validAfterBlockNumber = deployObj.validAfterBlockNumber;
// Currently supported algorithm
var sigAlgorithm = 'secp256k1';
// Serialize deploy data for signing
var deploySerialized = exports.deployDataProtobufSerialize({
term: term, timestamp: timestamp, phloPrice: phloPrice, phloLimit: phloLimit, validAfterBlockNumber: validAfterBlockNumber,
});
// Signing key
var crypt = new elliptic_1.ec(sigAlgorithm);
var key = getSignKey(crypt, privateKey);
var deployer = Uint8Array.from(key.getPublic('array'));
// Hash and sign serialized deploy
var hashed = blakejs_1.default.blake2bHex(deploySerialized, void 666, 32);
var sigArray = key.sign(hashed, { canonical: true }).toDER('array');
var sig = Uint8Array.from(sigArray);
// Return deploy object / ready for sending to RNode
return {
term: term, timestamp: timestamp, phloPrice: phloPrice, phloLimit: phloLimit, validAfterBlockNumber: validAfterBlockNumber,
sigAlgorithm: sigAlgorithm, deployer: deployer, sig: sig,
};
};
exports.signDeploy = signDeploy;
/**
* Verify deploy signature.
*/
var verifyDeploy = function (deployObj) {
var term = deployObj.term, timestamp = deployObj.timestamp, phloPrice = deployObj.phloPrice, phloLimit = deployObj.phloLimit, validAfterBlockNumber = deployObj.validAfterBlockNumber, sigAlgorithm = deployObj.sigAlgorithm, deployer = deployObj.deployer, sig = deployObj.sig;
// Serialize deploy data for signing
var deploySerialized = exports.deployDataProtobufSerialize({
term: term, timestamp: timestamp, phloPrice: phloPrice, phloLimit: phloLimit, validAfterBlockNumber: validAfterBlockNumber,
});
// Signing public key to verify
var crypt = new elliptic_1.ec(sigAlgorithm);
var key = crypt.keyFromPublic(deployer);
// Hash and verify signature
var hashed = blakejs_1.default.blake2bHex(deploySerialized, void 666, 32);
var isValid = key.verify(hashed, sig);
return isValid;
};
exports.verifyDeploy = verifyDeploy;
/**
* Serialization of DeployDataProto object without generated JS code.
*/
var deployDataProtobufSerialize = function (deployData) {
var term = deployData.term, timestamp = deployData.timestamp, phloPrice = deployData.phloPrice, phloLimit = deployData.phloLimit, validAfterBlockNumber = deployData.validAfterBlockNumber;
// Create binary stream writer
var writer = new google_protobuf_1.default.BinaryWriter();
// Write fields (protobuf doesn't serialize default values)
var writeString = function (order, val) { return val != "" && writer.writeString(order, val); };
var writeInt64 = function (order, val) { return val != 0 && writer.writeInt64(order, val); };
// https://github.com/rchain/rchain/blob/f7e46a9/models/src/main/protobuf/CasperMessage.proto#L134-L143
// message DeployDataProto {
// bytes deployer = 1; //public key
// string term = 2; //rholang source code to deploy (will be parsed into `Par`)
// int64 timestamp = 3; //millisecond timestamp
// bytes sig = 4; //signature of (hash(term) + timestamp) using private key
// string sigAlgorithm = 5; //name of the algorithm used to sign
// int64 phloPrice = 7; //phlo price
// int64 phloLimit = 8; //phlo limit for the deployment
// int64 validAfterBlockNumber = 10;
// }
// Serialize fields
writeString(2, term);
writeInt64(3, timestamp);
writeInt64(7, phloPrice);
writeInt64(8, phloLimit);
writeInt64(10, validAfterBlockNumber);
return writer.getResultBuffer();
};
exports.deployDataProtobufSerialize = deployDataProtobufSerialize;
/**
* Fix for ec.keyFromPrivate not accepting KeyPair.
* - detect KeyPair if it have `sign` function
*/
var getSignKey = function (crypt, pk) {
return pk && typeof pk != 'string' && pk.sign && pk.sign.constructor == Function ? pk : crypt.keyFromPrivate(pk);
};
//# sourceMappingURL=rnode-sign.js.map