@zlattice/lattice-js
Version:
Lattice blockchain TypeScript SDK with dual module support (CJS + ESM)
105 lines • 4.29 kB
JavaScript
;
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