PHP WebShell
Текущая директория: /opt/BitGoJS/modules/sdk-lib-mpc/dist/src/tss/ecdsa
Просмотр файла: zkVProof.js
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.createZkVProof = createZkVProof;
exports.verifyZkVProof = verifyZkVProof;
/**
* Zero Knowledge Proof of knowledge of the s and l that are behind the public value V = sR + lG.
* The V value is calculated in step 5A and the proof is created in step 5B of the GG18 signing protocol.
* @see {@link https://eprint.iacr.org/2019/114.pdf} section 4.3 for reference.
*/
const crypto_1 = require("crypto");
const util_1 = require("../../util");
/**
* Create a ZK Proof of knowledge of the s and l that are behind the public value V = sR + lG.
* @param V The curve point V.
* @param s The s that multiplies R.
* @param l The l that multiplies the curve genreator G.
* @param R The curve point R shared by all participants.
* @param curve The elliptic curve.
* @param additionalCtx Additional contextual information to associate with the proof.
* @returns The created proof.
*/
function createZkVProof(V, s, l, R, curve, additionalCtx = Buffer.from('')) {
const a = curve.scalarRandom();
const b = curve.scalarRandom();
const Alpha = curve.pointAdd(curve.pointMultiply(R, a), curve.basePointMult(b));
const c = nonInteractiveChallenge(V, R, Alpha, curve, additionalCtx);
const t = curve.scalarAdd(a, curve.scalarMult(c, s));
const u = curve.scalarAdd(b, curve.scalarMult(c, l));
return {
Alpha: Alpha,
t: t,
u: u,
};
}
/**
* Calculate challenge for NIZK proof of V using Fiat-Shamir transform.
*
* @param V The point to be proven.
* @param R The point R shared by all participants in the ECDSA signing protocol.
* @param Alpha The point/public value corresponding to the random scalar values a and b chosen by the prover.
* @param curve The elliptic curve.
* @param additionalCtx Additional contextual information to associate with the proof.
* @returns The calculated challenge.
*/
function nonInteractiveChallenge(V, R, Alpha, curve, additionalCtx) {
const G = curve.basePointMult(BigInt(1));
const hash = (0, crypto_1.createHash)('sha256');
hash.update((0, util_1.bigIntToBufferBE)(G, curve.pointBytes));
hash.update((0, util_1.bigIntToBufferBE)(R, curve.pointBytes));
hash.update((0, util_1.bigIntToBufferBE)(V, curve.pointBytes));
hash.update((0, util_1.bigIntToBufferBE)(Alpha, curve.pointBytes));
hash.update(additionalCtx);
return (0, util_1.bigIntFromBufferBE)(hash.digest());
}
/**
* Verify a ZK Proof of knowledge of the s and l that are behind the public value V = sR + lG.
* @param V The curve point V.
* @param proof The ZK proof.
* @param R The curve point R shared by all participants.
* @param curve The elliptic curve.
* @param additionalCtx Additional contextual information that is supposed to associate with the proof.
* @returns True if the proof checks out.
*/
function verifyZkVProof(V, proof, R, curve, additionalCtx = Buffer.from('')) {
const c = nonInteractiveChallenge(V, R, proof.Alpha, curve, additionalCtx);
const lhs = curve.pointAdd(curve.pointMultiply(R, proof.t), curve.basePointMult(proof.u));
const rhs = curve.pointAdd(proof.Alpha, curve.pointMultiply(V, curve.scalarReduce(c)));
return lhs === rhs;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiemtWUHJvb2YuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvdHNzL2VjZHNhL3prVlByb29mLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBb0JBLHdDQXNCQztBQWtDRCx3Q0FhQztBQXpGRDs7OztHQUlHO0FBQ0gsbUNBQW9DO0FBR3BDLHFDQUFrRTtBQUVsRTs7Ozs7Ozs7O0dBU0c7QUFDSCxTQUFnQixjQUFjLENBQzVCLENBQVMsRUFDVCxDQUFTLEVBQ1QsQ0FBUyxFQUNULENBQVMsRUFDVCxLQUFZLEVBQ1osZ0JBQXdCLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO0lBRXZDLE1BQU0sQ0FBQyxHQUFHLEtBQUssQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUMvQixNQUFNLENBQUMsR0FBRyxLQUFLLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDL0IsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFFaEYsTUFBTSxDQUFDLEdBQUcsdUJBQXVCLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLGFBQWEsQ0FBQyxDQUFDO0lBRXJFLE1BQU0sQ0FBQyxHQUFHLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDckQsTUFBTSxDQUFDLEdBQUcsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUVyRCxPQUFPO1FBQ0wsS0FBSyxFQUFFLEtBQUs7UUFDWixDQUFDLEVBQUUsQ0FBQztRQUNKLENBQUMsRUFBRSxDQUFDO0tBQ0wsQ0FBQztBQUNKLENBQUM7QUFFRDs7Ozs7Ozs7O0dBU0c7QUFDSCxTQUFTLHVCQUF1QixDQUFDLENBQVMsRUFBRSxDQUFTLEVBQUUsS0FBYSxFQUFFLEtBQVksRUFBRSxhQUFxQjtJQUN2RyxNQUFNLENBQUMsR0FBRyxLQUFLLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBRXpDLE1BQU0sSUFBSSxHQUFHLElBQUEsbUJBQVUsRUFBQyxRQUFRLENBQUMsQ0FBQztJQUNsQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUEsdUJBQWdCLEVBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO0lBQ25ELElBQUksQ0FBQyxNQUFNLENBQUMsSUFBQSx1QkFBZ0IsRUFBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7SUFDbkQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFBLHVCQUFnQixFQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztJQUNuRCxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUEsdUJBQWdCLEVBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO0lBQ3ZELElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUM7SUFFM0IsT0FBTyxJQUFBLHlCQUFrQixFQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO0FBQzNDLENBQUM7QUFFRDs7Ozs7Ozs7R0FRRztBQUNILFNBQWdCLGNBQWMsQ0FDNUIsQ0FBUyxFQUNULEtBQWUsRUFDZixDQUFTLEVBQ1QsS0FBWSxFQUNaLGdCQUF3QixNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztJQUV2QyxNQUFNLENBQUMsR0FBRyx1QkFBdUIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEtBQUssQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLGFBQWEsQ0FBQyxDQUFDO0lBRTNFLE1BQU0sR0FBRyxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDMUYsTUFBTSxHQUFHLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxhQUFhLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBRXZGLE9BQU8sR0FBRyxLQUFLLEdBQUcsQ0FBQztBQUNyQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBaZXJvIEtub3dsZWRnZSBQcm9vZiBvZiBrbm93bGVkZ2Ugb2YgdGhlIHMgYW5kIGwgdGhhdCBhcmUgYmVoaW5kIHRoZSBwdWJsaWMgdmFsdWUgViA9IHNSICsgbEcuXG4gKiBUaGUgViB2YWx1ZSBpcyBjYWxjdWxhdGVkIGluIHN0ZXAgNUEgYW5kIHRoZSBwcm9vZiBpcyBjcmVhdGVkIGluIHN0ZXAgNUIgb2YgdGhlIEdHMTggc2lnbmluZyBwcm90b2NvbC5cbiAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZXByaW50LmlhY3Iub3JnLzIwMTkvMTE0LnBkZn0gc2VjdGlvbiA0LjMgZm9yIHJlZmVyZW5jZS5cbiAqL1xuaW1wb3J0IHsgY3JlYXRlSGFzaCB9IGZyb20gJ2NyeXB0byc7XG5pbXBvcnQgeyBCYXNlQ3VydmUgYXMgQ3VydmUgfSBmcm9tICcuLi8uLi9jdXJ2ZXMnO1xuaW1wb3J0IHsgWmtWUHJvb2YgfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IGJpZ0ludEZyb21CdWZmZXJCRSwgYmlnSW50VG9CdWZmZXJCRSB9IGZyb20gJy4uLy4uL3V0aWwnO1xuXG4vKipcbiAqIENyZWF0ZSBhIFpLIFByb29mIG9mIGtub3dsZWRnZSBvZiB0aGUgcyBhbmQgbCB0aGF0IGFyZSBiZWhpbmQgdGhlIHB1YmxpYyB2YWx1ZSBWID0gc1IgKyBsRy5cbiAqIEBwYXJhbSBWIFRoZSBjdXJ2ZSBwb2ludCBWLlxuICogQHBhcmFtIHMgVGhlIHMgdGhhdCBtdWx0aXBsaWVzIFIuXG4gKiBAcGFyYW0gbCBUaGUgbCB0aGF0IG11bHRpcGxpZXMgdGhlIGN1cnZlIGdlbnJlYXRvciBHLlxuICogQHBhcmFtIFIgVGhlIGN1cnZlIHBvaW50IFIgc2hhcmVkIGJ5IGFsbCBwYXJ0aWNpcGFudHMuXG4gKiBAcGFyYW0gY3VydmUgVGhlIGVsbGlwdGljIGN1cnZlLlxuICogQHBhcmFtIGFkZGl0aW9uYWxDdHggQWRkaXRpb25hbCBjb250ZXh0dWFsIGluZm9ybWF0aW9uIHRvIGFzc29jaWF0ZSB3aXRoIHRoZSBwcm9vZi5cbiAqIEByZXR1cm5zIFRoZSBjcmVhdGVkIHByb29mLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlWmtWUHJvb2YoXG4gIFY6IGJpZ2ludCxcbiAgczogYmlnaW50LFxuICBsOiBiaWdpbnQsXG4gIFI6IGJpZ2ludCxcbiAgY3VydmU6IEN1cnZlLFxuICBhZGRpdGlvbmFsQ3R4OiBCdWZmZXIgPSBCdWZmZXIuZnJvbSgnJylcbik6IFprVlByb29mIHtcbiAgY29uc3QgYSA9IGN1cnZlLnNjYWxhclJhbmRvbSgpO1xuICBjb25zdCBiID0gY3VydmUuc2NhbGFyUmFuZG9tKCk7XG4gIGNvbnN0IEFscGhhID0gY3VydmUucG9pbnRBZGQoY3VydmUucG9pbnRNdWx0aXBseShSLCBhKSwgY3VydmUuYmFzZVBvaW50TXVsdChiKSk7XG5cbiAgY29uc3QgYyA9IG5vbkludGVyYWN0aXZlQ2hhbGxlbmdlKFYsIFIsIEFscGhhLCBjdXJ2ZSwgYWRkaXRpb25hbEN0eCk7XG5cbiAgY29uc3QgdCA9IGN1cnZlLnNjYWxhckFkZChhLCBjdXJ2ZS5zY2FsYXJNdWx0KGMsIHMpKTtcbiAgY29uc3QgdSA9IGN1cnZlLnNjYWxhckFkZChiLCBjdXJ2ZS5zY2FsYXJNdWx0KGMsIGwpKTtcblxuICByZXR1cm4ge1xuICAgIEFscGhhOiBBbHBoYSxcbiAgICB0OiB0LFxuICAgIHU6IHUsXG4gIH07XG59XG5cbi8qKlxuICogQ2FsY3VsYXRlIGNoYWxsZW5nZSBmb3IgTklaSyBwcm9vZiBvZiBWIHVzaW5nIEZpYXQtU2hhbWlyIHRyYW5zZm9ybS5cbiAqXG4gKiBAcGFyYW0gViBUaGUgcG9pbnQgdG8gYmUgcHJvdmVuLlxuICogQHBhcmFtIFIgVGhlIHBvaW50IFIgc2hhcmVkIGJ5IGFsbCBwYXJ0aWNpcGFudHMgaW4gdGhlIEVDRFNBIHNpZ25pbmcgcHJvdG9jb2wuXG4gKiBAcGFyYW0gQWxwaGEgVGhlIHBvaW50L3B1YmxpYyB2YWx1ZSBjb3JyZXNwb25kaW5nIHRvIHRoZSByYW5kb20gc2NhbGFyIHZhbHVlcyBhIGFuZCBiIGNob3NlbiBieSB0aGUgcHJvdmVyLlxuICogQHBhcmFtIGN1cnZlIFRoZSBlbGxpcHRpYyBjdXJ2ZS5cbiAqIEBwYXJhbSBhZGRpdGlvbmFsQ3R4IEFkZGl0aW9uYWwgY29udGV4dHVhbCBpbmZvcm1hdGlvbiB0byBhc3NvY2lhdGUgd2l0aCB0aGUgcHJvb2YuXG4gKiBAcmV0dXJucyBUaGUgY2FsY3VsYXRlZCBjaGFsbGVuZ2UuXG4gKi9cbmZ1bmN0aW9uIG5vbkludGVyYWN0aXZlQ2hhbGxlbmdlKFY6IGJpZ2ludCwgUjogYmlnaW50LCBBbHBoYTogYmlnaW50LCBjdXJ2ZTogQ3VydmUsIGFkZGl0aW9uYWxDdHg6IEJ1ZmZlcik6IGJpZ2ludCB7XG4gIGNvbnN0IEcgPSBjdXJ2ZS5iYXNlUG9pbnRNdWx0KEJpZ0ludCgxKSk7XG5cbiAgY29uc3QgaGFzaCA9IGNyZWF0ZUhhc2goJ3NoYTI1NicpO1xuICBoYXNoLnVwZGF0ZShiaWdJbnRUb0J1ZmZlckJFKEcsIGN1cnZlLnBvaW50Qnl0ZXMpKTtcbiAgaGFzaC51cGRhdGUoYmlnSW50VG9CdWZmZXJCRShSLCBjdXJ2ZS5wb2ludEJ5dGVzKSk7XG4gIGhhc2gudXBkYXRlKGJpZ0ludFRvQnVmZmVyQkUoViwgY3VydmUucG9pbnRCeXRlcykpO1xuICBoYXNoLnVwZGF0ZShiaWdJbnRUb0J1ZmZlckJFKEFscGhhLCBjdXJ2ZS5wb2ludEJ5dGVzKSk7XG4gIGhhc2gudXBkYXRlKGFkZGl0aW9uYWxDdHgpO1xuXG4gIHJldHVybiBiaWdJbnRGcm9tQnVmZmVyQkUoaGFzaC5kaWdlc3QoKSk7XG59XG5cbi8qKlxuICogVmVyaWZ5IGEgWksgUHJvb2Ygb2Yga25vd2xlZGdlIG9mIHRoZSBzIGFuZCBsIHRoYXQgYXJlIGJlaGluZCB0aGUgcHVibGljIHZhbHVlIFYgPSBzUiArIGxHLlxuICogQHBhcmFtIFYgVGhlIGN1cnZlIHBvaW50IFYuXG4gKiBAcGFyYW0gcHJvb2YgVGhlIFpLIHByb29mLlxuICogQHBhcmFtIFIgVGhlIGN1cnZlIHBvaW50IFIgc2hhcmVkIGJ5IGFsbCBwYXJ0aWNpcGFudHMuXG4gKiBAcGFyYW0gY3VydmUgVGhlIGVsbGlwdGljIGN1cnZlLlxuICogQHBhcmFtIGFkZGl0aW9uYWxDdHggQWRkaXRpb25hbCBjb250ZXh0dWFsIGluZm9ybWF0aW9uIHRoYXQgaXMgc3VwcG9zZWQgdG8gYXNzb2NpYXRlIHdpdGggdGhlIHByb29mLlxuICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgcHJvb2YgY2hlY2tzIG91dC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZlcmlmeVprVlByb29mKFxuICBWOiBiaWdpbnQsXG4gIHByb29mOiBaa1ZQcm9vZixcbiAgUjogYmlnaW50LFxuICBjdXJ2ZTogQ3VydmUsXG4gIGFkZGl0aW9uYWxDdHg6IEJ1ZmZlciA9IEJ1ZmZlci5mcm9tKCcnKVxuKTogYm9vbGVhbiB7XG4gIGNvbnN0IGMgPSBub25JbnRlcmFjdGl2ZUNoYWxsZW5nZShWLCBSLCBwcm9vZi5BbHBoYSwgY3VydmUsIGFkZGl0aW9uYWxDdHgpO1xuXG4gIGNvbnN0IGxocyA9IGN1cnZlLnBvaW50QWRkKGN1cnZlLnBvaW50TXVsdGlwbHkoUiwgcHJvb2YudCksIGN1cnZlLmJhc2VQb2ludE11bHQocHJvb2YudSkpO1xuICBjb25zdCByaHMgPSBjdXJ2ZS5wb2ludEFkZChwcm9vZi5BbHBoYSwgY3VydmUucG9pbnRNdWx0aXBseShWLCBjdXJ2ZS5zY2FsYXJSZWR1Y2UoYykpKTtcblxuICByZXR1cm4gbGhzID09PSByaHM7XG59XG4iXX0=Выполнить команду
Для локальной разработки. Не используйте в интернете!