UNPKG

@tidecloak/js

Version:

TideCloak client side JS SDK

96 lines 4.5 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const Hash_js_1 = require("../Cryptide/Hashing/Hash.js"); const Serialization_js_1 = require("../Cryptide/Serialization.js"); const Math_js_1 = require("../Cryptide/Math.js"); const index_js_1 = require("../Cryptide/index.js"); const AES_js_1 = require("../Cryptide/Encryption/AES.js"); const Datum_js_1 = __importDefault(require("../Models/Datum.js")); const SerializedField_js_1 = __importDefault(require("../Models/SerializedField.js")); const Ed25519_js_1 = require("../Cryptide/Ed25519.js"); class EncryptRequest { /** * * @param {Point} gCVK * @param {Uint8Array} fieldDatum * @param {number} timestamp */ static async generatePartialRequest(gCVK, fieldDatum, timestamp) { const ephKey = (0, Math_js_1.RandomBigInt)(); // not to be stored const fieldKey = await (0, Hash_js_1.SHA256_Digest)((gCVK.mul(ephKey).toRawBytes())); // not to be stored const encField = await (0, AES_js_1.encryptDataRawOutput)(fieldDatum, fieldKey); const data = { C1: Ed25519_js_1.Point.BASE.mul(ephKey), EncField: encField, EncFieldChk: await (0, Hash_js_1.SHA256_Digest)(encField), timestamp: timestamp }; return data; } /** * @param {{ C1: Point; EncField: Uint8Array; EncFieldChk: Uint8Array; timestamp: number; }[]} partialRequests * @param {bigint} li * @param {Datum[]} datums * @param {Point[]} gCVKRi * @param {Uint8Array} ECDHi */ static async generateEncryptedRequest(partialRequests, li, datums, gCVKRi, ECDHi) { const toEncrypt = { Timestamp: partialRequests[0].timestamp, // using first as theyre all the same EncFieldChks: partialRequests.map(p => (0, Serialization_js_1.bytesToBase64)(p.EncFieldChk)), C1s: partialRequests.map(p => p.C1.toBase64()), Tags: datums.map(d => d.tag), GCVKRi: gCVKRi.map(gcvkr => gcvkr.toBase64()), Li: li.toString() }; const encrypted = await (0, AES_js_1.encryptData)(JSON.stringify(toEncrypt), ECDHi); return encrypted; } /** * Will decrypt encrypted sigs, validate those sigs, and generate the serialized fields for the vendor to store * @param {string[]} encryptedS * @param {{ EncFields: Uint8Array[]; EncFieldChks: Uint8Array[]; C1s: Point[]; Tags: number[]; GCVKRi: Point[]; Timestamp: number; }} plainRequest * @param {bigint[]} lis * @param {Uint8Array[]} ECDHi * @param {Point} gCVK */ static async generateSerializedFields(encryptedS, plainRequest, lis, ECDHi, gCVK) { const pre_decryptedData = encryptedS.map(async (encS, i) => JSON.parse(await (0, AES_js_1.decryptData)(encS, ECDHi[i]))); const decryptedData = await Promise.all(pre_decryptedData); const CVKSi = plainRequest.C1s.map((_, i) => (0, Math_js_1.mod)(decryptedData.reduce((sum, next, j) => sum + (0, Math_js_1.mod)(BigInt(next.Si[i]) * lis[j]), BigInt(0)))); // validate signatures for (let i = 0; i < plainRequest.C1s.length; i++) { const M = await (0, Hash_js_1.SHA256_Digest)((0, Serialization_js_1.ConcatUint8Arrays)([ plainRequest.EncFieldChks[i], plainRequest.C1s[i].toRawBytes(), (0, Serialization_js_1.numberToUint8Array)(plainRequest.Tags[i], 8), (0, Serialization_js_1.numberToUint8Array)(plainRequest.Timestamp, 8) ])); const valid = await index_js_1.EdDSA.verifyRaw(CVKSi[i], plainRequest.GCVKRi[i], gCVK, M); if (valid == false) { throw Error("Generalize Serialized Fields: Not all fields passed verification"); } } ; // Create Serialized Fields as neat little byte arrays const serializedFields = CVKSi.map((CVKS, i) => SerializedField_js_1.default.create(plainRequest.EncFields[i], plainRequest.C1s[i], plainRequest.Tags[i], plainRequest.Timestamp, plainRequest.GCVKRi[i], CVKS)); return serializedFields; } } exports.default = EncryptRequest; //# sourceMappingURL=EncryptRequest.js.map