@tidecloak/js
Version:
TideCloak client side JS SDK
96 lines • 4.5 kB
JavaScript
;
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