UNPKG

@tgrospic/rnode-http-js

Version:
92 lines 4.68 kB
"use strict"; 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