UNPKG

@zlattice/lattice-js

Version:

Lattice blockchain TypeScript SDK with dual module support (CJS + ESM)

105 lines 4.29 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || (function () { var ownKeys = function(o) { ownKeys = Object.getOwnPropertyNames || function (o) { var ar = []; for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; return ar; }; return ownKeys(o); }; return function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); __setModuleDefault(result, mod); return result; }; })(); Object.defineProperty(exports, "__esModule", { value: true }); exports.calculateSharedKey = calculateSharedKey; const utils = __importStar(require("@noble/curves/abstract/utils")); const _1 = require("./index.js"); const ec_1 = require("./ec.js"); const sm3_1 = require("./sm3.js"); const utils_1 = require("./utils.js"); // 用到的常数 const wPow2 = utils.hexToNumber('80000000000000000000000000000000'); const wPow2Sub1 = utils.hexToNumber('7fffffffffffffffffffffffffffffff'); // from sm2 sign part, extracted for code reusable. function hkdf(z, keylen) { const msg = new Uint8Array(keylen); let ct = 1; let offset = 0; let t = _1.EmptyArray; const ctShift = new Uint8Array(4); const nextT = () => { // (1) Hai = hash(z || ct) // (2) ct++ ctShift[0] = ct >> 24 & 0x00ff; ctShift[1] = ct >> 16 & 0x00ff; ctShift[2] = ct >> 8 & 0x00ff; ctShift[3] = ct & 0x00ff; //t = sm3(utils.concatBytes(z, ctShift)) t = (0, sm3_1.sm3)(utils.concatBytes(z, ctShift)); ct++; offset = 0; }; nextT(); // 先生成 Ha1 for (let i = 0, len = msg.length; i < len; i++) { // t = Ha1 || Ha2 || Ha3 || Ha4 if (offset === t.length) nextT(); // 输出 stream msg[i] = t[offset++] & 0xff; } return msg; } function calculateSharedKey(keypairA, ephemeralKeypairA, publicKeyB, ephemeralPublicKeyB, sharedKeyLength, isRecipient = false, idA = '1234567812345678', idB = '1234567812345678') { const RA = ec_1.sm2Curve.ProjectivePoint.fromHex(ephemeralKeypairA.publicKey); const RB = ec_1.sm2Curve.ProjectivePoint.fromHex(ephemeralPublicKeyB); // const PA = sm2Curve.ProjectivePoint.fromHex(keypairA.publicKey) // 用不到 const PB = ec_1.sm2Curve.ProjectivePoint.fromHex(publicKeyB); let ZA = (0, _1.getZ)(keypairA.publicKey, idA); let ZB = (0, _1.getZ)(publicKeyB, idB); if (isRecipient) { [ZA, ZB] = [ZB, ZA]; } const rA = utils.hexToNumber(ephemeralKeypairA.privateKey); const dA = utils.hexToNumber(keypairA.privateKey); // 1.先算 tA const x1 = RA.x; // x1_ = 2^w + (x1 & (2^w - 1)) const x1_ = wPow2 + (x1 & wPow2Sub1); // tA = (dA + x1b * rA) mod n const tA = ec_1.field.add(dA, ec_1.field.mulN(x1_, rA)); // 2.算 U // x2_ = 2^w + (x2 & (2^w - 1)) const x2 = RB.x; const x2_ = ec_1.field.add(wPow2, (x2 & wPow2Sub1)); // U = [h * tA](PB + x2_ * RB) const U = RB.multiply(x2_).add(PB).multiply(tA); // 3.算 KDF // KA = KDF(xU || yU || ZA || ZB, kLen) const xU = (0, utils_1.hexToArray)((0, utils_1.leftPad)(utils.numberToHexUnpadded(U.x), 64)); const yU = (0, utils_1.hexToArray)((0, utils_1.leftPad)(utils.numberToHexUnpadded(U.y), 64)); const KA = hkdf(utils.concatBytes(xU, yU, ZA, ZB), sharedKeyLength); return KA; } //# sourceMappingURL=kx.js.map