Skip to content
Snippets Groups Projects
Commit 4955d86e authored by Zdravko Iliev's avatar Zdravko Iliev
Browse files

Resolve "[VPO]Generation of QR Code for NodeJS"

parent a2d657c1
Branches
Tags
1 merge request!84Resolve "[VPO]Generation of QR Code for NodeJS"
Showing
with 33 additions and 313 deletions
image: node:12.22-alpine
image: node:16.13.1-bullseye
include:
- template: 'Workflows/MergeRequest-Pipelines.gitlab-ci.yml'
......@@ -11,14 +11,15 @@ install:
tags:
- amd64-docker
script:
- apk add --no-cache git openssh
- apt update
- apt install git build-essential libcairo2-dev libpango1.0-dev libjpeg-dev libgif-dev librsvg2-dev -y
- npm config set '//registry.npmjs.org/:_authToken' $NPM_TOKEN
- git config --global url."https://gitlab-ci-token:$CI_JOB_TOKEN@code.vereign.com/".insteadOf "git@code.vereign.com:"
- echo '[http "https://code.vereign.com"]' >> $HOME/.gitconfig
- echo " sslVerify = false" >> $HOME/.gitconfig
- git submodule init
- git submodule update
- yarn install --frozen-lockfile
- yarn install
- ./generateProto.sh
cache:
paths:
......
......@@ -32,7 +32,7 @@ class CloudflareService {
}
fetchFile(fileName, bucket = this._defaultBucket) {
return __awaiter(this, void 0, void 0, function* () {
const response = yield axios_1.default(`${this._cdnUrl}/file/${bucket}/${fileName}`);
const response = yield (0, axios_1.default)(`${this._cdnUrl}/file/${bucket}/${fileName}`);
const data = response.data;
const uploadTime = response.headers["x-bz-upload-timestamp"]
? parseInt(response.headers["x-bz-upload-timestamp"])
......@@ -45,7 +45,7 @@ class CloudflareService {
const { data: rawStatusData, uploadTime, } = yield this.fetchFile(statusFileName);
let decodedResult;
try {
decodedResult = this._statusesService.decodeStatusObject(new Uint8Array(common_1.base64ToArrayBuffer(rawStatusData.Status)));
decodedResult = this._statusesService.decodeStatusObject(new Uint8Array((0, common_1.base64ToArrayBuffer)(rawStatusData.Status)));
}
catch (e) {
throw new Error("Error decoding status object");
......
......@@ -57,7 +57,7 @@ const decryptAESGCM = (data, key, iv) => __awaiter(void 0, void 0, void 0, funct
const decipher = crypto.createDecipheriv(AES_GCM_ALGO, Buffer.from(key), Buffer.from(iv));
const authTag = data.slice(data.byteLength - 16, data.byteLength);
const encrypted = data.slice(0, data.byteLength - 16);
let str = decipher.update(common_1.arrayBufferToBase64(encrypted), "base64", "utf8");
let str = decipher.update((0, common_1.arrayBufferToBase64)(encrypted), "base64", "utf8");
decipher.setAuthTag(Buffer.from(authTag));
str += decipher.final("utf8");
return str;
......
......@@ -32,7 +32,7 @@ const convertPemToBinary = (pem) => {
encoded += lines[i].trim();
}
}
return common_1.base64ToArrayBuffer(encoded);
return (0, common_1.base64ToArrayBuffer)(encoded);
};
const encryptRSA = (publicKeyPEM, data) => __awaiter(void 0, void 0, void 0, function* () {
const publicKey = yield crypto.subtle.importKey("spki", convertPemToBinary(publicKeyPEM), {
......@@ -96,7 +96,7 @@ const getBytes = (value, encoding) => {
let bytes;
if (typeof value === "string") {
if (encoding === "base64") {
bytes = common_1.base64ToArrayBuffer(value);
bytes = (0, common_1.base64ToArrayBuffer)(value);
}
else {
const encoder = new TextEncoder();
......
......@@ -31,17 +31,17 @@ const encodeEmailData = (emailData) => {
};
const wrappedDataMessage = WrapperDataMessage.fromObject(wrappedData);
const wrappedDataBuffer = WrapperDataMessage.encode(wrappedDataMessage).finish();
return common_1.arrayBufferToBase64(wrappedDataBuffer);
return (0, common_1.arrayBufferToBase64)(wrappedDataBuffer);
};
const decodeEmailData = (binary) => {
const wrappedDataMessage = WrapperDataMessage.decode(common_1.ensureUint8Array(binary));
const wrappedDataMessage = WrapperDataMessage.decode((0, common_1.ensureUint8Array)(binary));
const wrappedData = WrapperDataMessage.toObject(wrappedDataMessage);
if (wrappedData.className === EMAIL_DATA_V1) {
const emailDataMessage = EmailDataMessageV1.decode(common_1.ensureUint8Array(wrappedData.data));
const emailDataMessage = EmailDataMessageV1.decode((0, common_1.ensureUint8Array)(wrappedData.data));
const messageData = EmailDataMessageV1.toObject(emailDataMessage, {
bytes: String,
arrays: true,
objects: true,
objects: true, // populates empty objects (map fields) even if defaults=false
});
return messageData;
}
......@@ -52,10 +52,10 @@ const decodeEmailData = (binary) => {
const encodeKeyDataPair = (keyData) => {
const keyDataMessage = KeyDataMessageV1.fromObject(keyData);
const buffer = KeyDataMessageV1.encode(keyDataMessage).finish();
return common_1.arrayBufferToBase64(buffer);
return (0, common_1.arrayBufferToBase64)(buffer);
};
const decodeKeyDataPair = (binary) => {
const keyDataPairMessage = KeyDataMessageV1.decode(common_1.ensureUint8Array(binary));
const keyDataPairMessage = KeyDataMessageV1.decode((0, common_1.ensureUint8Array)(binary));
return KeyDataMessageV1.toObject(keyDataPairMessage, {
bytes: String,
});
......@@ -119,14 +119,14 @@ const computeQrCodeHash = (emailData) => __awaiter(void 0, void 0, void 0, funct
.sort()
.join("\n");
const resultBuffer = yield index_1.CryptoService.SHA256(hashesAsAstring);
return common_1.arrayBufferToBase64(resultBuffer);
return (0, common_1.arrayBufferToBase64)(resultBuffer);
});
const calculateQRCodeSignature = (accountPrivateKey, qrCodeHash) => __awaiter(void 0, void 0, void 0, function* () {
const signature = yield index_1.CryptoService.signRSA(accountPrivateKey, Buffer.from(qrCodeHash));
return common_1.arrayBufferToBase64(signature);
return (0, common_1.arrayBufferToBase64)(signature);
});
const verifyQrCodeSignature = (publicKey, qrCodeSignature, recipientQRCodeHash) => __awaiter(void 0, void 0, void 0, function* () {
const qrCodeSignatureAsBuffer = common_1.base64ToArrayBuffer(qrCodeSignature);
const qrCodeSignatureAsBuffer = (0, common_1.base64ToArrayBuffer)(qrCodeSignature);
const recipientQRCodeHashAsBuffer = Buffer.from(recipientQRCodeHash);
const result = yield index_1.CryptoService.verifyRSASignature(publicKey, recipientQRCodeHashAsBuffer, qrCodeSignatureAsBuffer);
return result;
......@@ -149,11 +149,11 @@ const withServices = (cloudFlareServiceInstance, landingPageServiceUrl, cryptoSe
getMessageDataFromBase64: (base64) => __awaiter(void 0, void 0, void 0, function* () {
const qrCodeDataPart = decodeKeyDataPair(base64);
const base64SHA256 = yield cryptoService.SHA256(base64);
const { data: backblazeDataPart, } = yield cloudFlareServiceInstance.fetchFile(`qrcode-${common_1.arrayBufferToHex(base64SHA256)}`);
const assembledData = assembleQrCodeData(common_1.base64ToArrayBuffer(qrCodeDataPart.data), common_1.base64ToArrayBuffer(backblazeDataPart.qr_code_data));
const { data: backblazeDataPart, } = yield cloudFlareServiceInstance.fetchFile(`qrcode-${(0, common_1.arrayBufferToHex)(base64SHA256)}`);
const assembledData = assembleQrCodeData((0, common_1.base64ToArrayBuffer)(qrCodeDataPart.data), (0, common_1.base64ToArrayBuffer)(backblazeDataPart.qr_code_data));
const { key: aesEncryptedSessionKey, data: storageIv, } = decodeKeyDataPair(backblazeDataPart.session_key);
const rsaEncryptedSessionKey = yield cryptoService.decryptAESGCM(common_1.base64ToArrayBuffer(aesEncryptedSessionKey), common_1.base64ToArrayBuffer(qrCodeDataPart.key), common_1.base64ToArrayBuffer(storageIv));
const { data: { key: encodedSessionKey }, } = yield axios_1.default({
const rsaEncryptedSessionKey = yield cryptoService.decryptAESGCM((0, common_1.base64ToArrayBuffer)(aesEncryptedSessionKey), (0, common_1.base64ToArrayBuffer)(qrCodeDataPart.key), (0, common_1.base64ToArrayBuffer)(storageIv));
const { data: { key: encodedSessionKey }, } = yield (0, axios_1.default)({
url: `${landingPageServiceUrl}/api/hsm/decrypt`,
method: "POST",
headers: {
......@@ -165,8 +165,8 @@ const withServices = (cloudFlareServiceInstance, landingPageServiceUrl, cryptoSe
},
});
const decodedSessionKey = decodeKeyDataPair(encodedSessionKey);
const decryptedEmailData = yield cryptoService.decryptAESGCM(assembledData, common_1.base64ToArrayBuffer(decodedSessionKey.key), common_1.base64ToArrayBuffer(decodedSessionKey.data));
const decompressedEmailData = common_1.decompressData(decryptedEmailData);
const decryptedEmailData = yield cryptoService.decryptAESGCM(assembledData, (0, common_1.base64ToArrayBuffer)(decodedSessionKey.key), (0, common_1.base64ToArrayBuffer)(decodedSessionKey.data));
const decompressedEmailData = (0, common_1.decompressData)(decryptedEmailData);
return decodeEmailData(decompressedEmailData);
}),
};
......
export declare const SEAL_READING_ERROR = "SealReadingError";
export declare const SEAL_NOT_FOUND = "SEAL_NOT_FOUND";
export declare const MESSAGE_NOT_SEALED = "MESSAGE_NOT_SEALED";
export declare const SEAL_NOT_TRUSTWORTHY = "SEAL_NOT_TRUSTWORTHY";
export declare const UNKNOWN_EMAIL_PROVIDER = "UNKNOWN_EMAIL_PROVIDER";
export declare const SEVERITY_INFO = 0;
export declare const SEVERITY_WARNING = 1;
export declare const SEVERITY_ERROR = 2;
declare class SealReadingError extends Error {
static SEAL_READING_ERROR: string;
static SEAL_NOT_FOUND: string;
static MESSAGE_NOT_SEALED: string;
static SEAL_NOT_TRUSTWORTHY: string;
static UNKNOWN_EMAIL_PROVIDER: string;
static SEVERITY_INFO: number;
static SEVERITY_WARNING: number;
static SEVERITY_ERROR: number;
type: string;
severity: number;
constructor(message: string, type: string, severity?: number);
}
export default SealReadingError;
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.SEVERITY_ERROR = exports.SEVERITY_WARNING = exports.SEVERITY_INFO = exports.UNKNOWN_EMAIL_PROVIDER = exports.SEAL_NOT_TRUSTWORTHY = exports.MESSAGE_NOT_SEALED = exports.SEAL_NOT_FOUND = exports.SEAL_READING_ERROR = void 0;
exports.SEAL_READING_ERROR = "SealReadingError";
exports.SEAL_NOT_FOUND = "SEAL_NOT_FOUND";
exports.MESSAGE_NOT_SEALED = "MESSAGE_NOT_SEALED";
exports.SEAL_NOT_TRUSTWORTHY = "SEAL_NOT_TRUSTWORTHY";
exports.UNKNOWN_EMAIL_PROVIDER = "UNKNOWN_EMAIL_PROVIDER";
exports.SEVERITY_INFO = 0;
exports.SEVERITY_WARNING = 1;
exports.SEVERITY_ERROR = 2;
class SealReadingError extends Error {
constructor(message, type, severity) {
super(message);
this.severity = exports.SEVERITY_ERROR;
this.name = exports.SEAL_READING_ERROR;
this.type = type;
this.severity = severity;
}
}
SealReadingError.SEAL_READING_ERROR = exports.SEAL_READING_ERROR;
SealReadingError.SEAL_NOT_FOUND = exports.SEAL_NOT_FOUND;
SealReadingError.MESSAGE_NOT_SEALED = exports.MESSAGE_NOT_SEALED;
SealReadingError.SEAL_NOT_TRUSTWORTHY = exports.SEAL_NOT_TRUSTWORTHY;
SealReadingError.UNKNOWN_EMAIL_PROVIDER = exports.UNKNOWN_EMAIL_PROVIDER;
SealReadingError.SEVERITY_INFO = exports.SEVERITY_INFO;
SealReadingError.SEVERITY_WARNING = exports.SEVERITY_WARNING;
SealReadingError.SEVERITY_ERROR = exports.SEVERITY_ERROR;
exports.default = SealReadingError;
import MIMEParser from "@vereign/lib-mime";
declare const _default: (mime: string | MIMEParser, parseHTML?: (htmlString: string) => HTMLDocument) => Promise<{
sealUrl: string;
publicKey: string;
sealId: string;
}>;
export default _default;
/**
* BFS for HTML tree
* @param root
*/
export declare const findSealContainer: (root: HTMLElement) => HTMLAnchorElement;
"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
}) : (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 (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.findSealContainer = void 0;
const lib_mime_1 = __importDefault(require("@vereign/lib-mime"));
const lib_png_1 = __importStar(require("@vereign/lib-png"));
const url_parse_1 = __importDefault(require("url-parse"));
const SealReadingError_1 = __importDefault(require("./SealReadingError"));
const __1 = require("../..");
const sealTemplate_1 = require("./sealTemplate");
const getSealId_1 = __importDefault(require("./getSealId"));
/**
* An array of possible URL wrappings created by email Vendors
*/
const OUTLOOK_SAFELINKS_WRAPPER = "safelinks.protection.outlook.com";
exports.default = (mime, parseHTML = null) => __awaiter(void 0, void 0, void 0, function* () {
if (typeof mime === "string") {
mime = new lib_mime_1.default(mime);
}
if (parseHTML) {
mime.parseHTML = parseHTML;
}
const { htmlDocument } = yield mime.extractQuotedPartFromHTML();
const sealContainer = exports.findSealContainer(htmlDocument.body);
if (!sealContainer) {
throw new SealReadingError_1.default("Message not sealed", SealReadingError_1.default.MESSAGE_NOT_SEALED, SealReadingError_1.default.SEVERITY_INFO);
}
const sealUrl = extractSealUrl(sealContainer);
const sealId = yield getSealId_1.default(sealUrl);
const publicKey = extractSealPublicKey(sealContainer, mime);
return { sealUrl, sealId, publicKey };
});
/**
* BFS for HTML tree
* @param root
*/
const findSealContainer = (root) => {
const queue = [];
queue.unshift(root);
while (queue.length) {
const element = queue.shift();
const id = element.getAttribute("id");
if (element.nodeName === "A" && (id === null || id === void 0 ? void 0 : id.includes(sealTemplate_1.SEAL_CONTAINER_PREFIX))) {
return element;
}
for (const childNode of element.childNodes) {
childNode.nodeType === 1 && queue.push(childNode);
}
}
};
exports.findSealContainer = findSealContainer;
const extractSealPublicKey = (sealContainer, mime) => {
const sealImages = sealContainer.getElementsByTagName("img");
if (sealImages.length === 0) {
throw new SealReadingError_1.default("Seal not found", SealReadingError_1.default.SEAL_NOT_FOUND, SealReadingError_1.default.SEVERITY_WARNING);
}
else if (sealImages.length > 1) {
throw new SealReadingError_1.default("Multiple seal images found", SealReadingError_1.default.SEAL_NOT_TRUSTWORTHY);
}
const sealImage = sealImages[0];
const attachmentsParts = mime.getAttachments();
const sealImageAttachmentPart = attachmentsParts.find((part) => {
var _a;
const contentId = ((_a = part.headers["content-id"]) === null || _a === void 0 ? void 0 : _a.length) ? part.headers["content-id"][0].replace(/[<>]/g, "")
: "";
return `cid:${contentId}` === sealImage.getAttribute("src");
});
const sealImageAttachment = sealImageAttachmentPart && mime.getAttachment(sealImageAttachmentPart);
if (!sealImageAttachment) {
throw new SealReadingError_1.default("Seal not found", SealReadingError_1.default.SEAL_NOT_FOUND, SealReadingError_1.default.SEVERITY_WARNING);
}
const png = lib_png_1.default.readPng(new Uint8Array(__1.base64ToArrayBuffer(sealImageAttachment.base64)));
const metadata = lib_png_1.getMetaData(png);
const sealMarker = metadata["v-seal"];
if (!sealMarker) {
throw new SealReadingError_1.default('Seal not found. Seal marker "v-seal" is missing in picture metadata', SealReadingError_1.default.SEAL_NOT_FOUND, SealReadingError_1.default.SEVERITY_WARNING);
}
const { publicKey } = metadata;
return publicKey;
};
const extractSealUrl = (sealContainer) => {
const sealUrl = sealContainer === null || sealContainer === void 0 ? void 0 : sealContainer.getAttribute("href");
let parsedSealUrl = new url_parse_1.default(sealUrl, true);
if (parsedSealUrl.host.includes(OUTLOOK_SAFELINKS_WRAPPER)) {
parsedSealUrl = new url_parse_1.default(parsedSealUrl.query.url, true);
}
if (!(parsedSealUrl === null || parsedSealUrl === void 0 ? void 0 : parsedSealUrl.href)) {
throw new SealReadingError_1.default("Seal URL not found", SealReadingError_1.default.SEAL_NOT_FOUND, SealReadingError_1.default.SEVERITY_WARNING);
}
return parsedSealUrl.href;
};
declare const _default: (sealUrl: string) => Promise<string>;
export default _default;
"use strict";
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
Object.defineProperty(exports, "__esModule", { value: true });
const index_1 = require("../../index");
exports.default = (sealUrl) => __awaiter(void 0, void 0, void 0, function* () {
const sealHash = yield index_1.CryptoService.SHA256(sealUrl);
return index_1.arrayBufferToHex(sealHash);
});
import SealReadingError from "./SealReadingError";
declare const _default: {
SealReadingError: typeof SealReadingError;
extractSealFromMime: (mime: string | import("@vereign/lib-mime/dist/MIMEParser").default, parseHTML?: (htmlString: string) => HTMLDocument) => Promise<{
sealUrl: string;
publicKey: string;
sealId: string;
}>;
SEAL_IMAGE_ALT: string;
SEAL_IMAGE_PREFIX: string;
SEAL_CONTAINER_PREFIX: string;
SRC_PLACEHOLDER: string;
getSealTemplate: (sealId: string, sealUrl: string) => string;
createSealUrl: (baseUrl: string, sealHeadBase64: string) => string;
getSealHead: (sealUrl: string) => string;
getSealId: (sealUrl: string) => Promise<string>;
};
export default _default;
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const SealReadingError_1 = __importDefault(require("./SealReadingError"));
const extractSealFromMime_1 = __importDefault(require("./extractSealFromMime"));
const sealTemplate_1 = require("./sealTemplate");
const sealUrl_1 = require("./sealUrl");
const getSealId_1 = __importDefault(require("./getSealId"));
exports.default = {
SealReadingError: SealReadingError_1.default,
extractSealFromMime: extractSealFromMime_1.default,
SEAL_IMAGE_ALT: sealTemplate_1.SEAL_IMAGE_ALT,
SEAL_IMAGE_PREFIX: sealTemplate_1.SEAL_IMAGE_PREFIX,
SEAL_CONTAINER_PREFIX: sealTemplate_1.SEAL_CONTAINER_PREFIX,
SRC_PLACEHOLDER: sealTemplate_1.SRC_PLACEHOLDER,
getSealTemplate: sealTemplate_1.getSealTemplate,
createSealUrl: sealUrl_1.createSealUrl,
getSealHead: sealUrl_1.getSealHead,
getSealId: getSealId_1.default,
};
export declare const SEAL_CONTAINER_PREFIX = "seal-container-v1-";
export declare const SEAL_IMAGE_PREFIX = "seal-image-";
export declare const SEAL_IMAGE_ALT = "Vereign Seal";
export declare const SRC_PLACEHOLDER = "<src-placeholder>";
export declare const getSealTemplate: (sealId: string, sealUrl: string) => string;
"use strict";
// https://code.vereign.com/seal/documentation/-/merge_requests/26
Object.defineProperty(exports, "__esModule", { value: true });
exports.getSealTemplate = exports.SRC_PLACEHOLDER = exports.SEAL_IMAGE_ALT = exports.SEAL_IMAGE_PREFIX = exports.SEAL_CONTAINER_PREFIX = void 0;
exports.SEAL_CONTAINER_PREFIX = "seal-container-v1-";
exports.SEAL_IMAGE_PREFIX = "seal-image-";
// TODO: Point out importance of the constant image alt for MIME normalisation
exports.SEAL_IMAGE_ALT = "Vereign Seal";
exports.SRC_PLACEHOLDER = "<src-placeholder>";
const getSealTemplate = (sealId, sealUrl) => {
return `<a id=${exports.SEAL_CONTAINER_PREFIX}${sealId} href="${sealUrl}" target="_blank" rel="noopener noreferrer"><img id="${exports.SEAL_IMAGE_PREFIX}${sealId}" alt="${exports.SEAL_IMAGE_ALT}" src="${exports.SRC_PLACEHOLDER}"></a>`;
};
exports.getSealTemplate = getSealTemplate;
export declare const createSealUrl: (baseUrl: string, sealHeadBase64: string) => string;
export declare const getSealHead: (sealUrl: string) => string;
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.getSealHead = exports.createSealUrl = void 0;
const url_parse_1 = __importDefault(require("url-parse"));
const common_1 = require("../../utils/common");
const createSealUrl = (baseUrl, sealHeadBase64) => {
if (!baseUrl.endsWith("/")) {
baseUrl = baseUrl + "/";
}
return `${baseUrl}#${common_1.encodeBase64Url(sealHeadBase64)}`;
};
exports.createSealUrl = createSealUrl;
const getSealHead = (sealUrl) => {
const url = new url_parse_1.default(sealUrl);
return common_1.decodeBase64URL(url.hash.replace("#", ""));
};
exports.getSealHead = getSealHead;
......@@ -26,7 +26,7 @@ class StatusesService {
return SenderStatusObjectMessage.encode(senderStatusObjectMessage).finish();
}
decodeSenderStatusObject(bytes) {
const senderStatusObjectMessage = SenderStatusObjectMessage.decode(common_1.ensureUint8Array(bytes));
const senderStatusObjectMessage = SenderStatusObjectMessage.decode((0, common_1.ensureUint8Array)(bytes));
return SenderStatusObjectMessage.toObject(senderStatusObjectMessage, {
bytes: String,
longs: Number,
......@@ -42,7 +42,7 @@ class StatusesService {
return RecipientStatusObjectMessage.encode(recipientStatusObjectMessage).finish();
}
decodeRecipientStatusObject(bytes) {
const recipientStatusObjectMessage = RecipientStatusObjectMessage.decode(common_1.ensureUint8Array(bytes));
const recipientStatusObjectMessage = RecipientStatusObjectMessage.decode((0, common_1.ensureUint8Array)(bytes));
return RecipientStatusObjectMessage.toObject(recipientStatusObjectMessage, {
bytes: String,
longs: Number,
......@@ -57,7 +57,7 @@ class StatusesService {
return RecipientStatusDataMessage.encode(recipientStatusDataMessage).finish();
}
decodeRecipientStatusData(bytes) {
const recipientStatusDataMessage = RecipientStatusDataMessage.decode(common_1.ensureUint8Array(bytes));
const recipientStatusDataMessage = RecipientStatusDataMessage.decode((0, common_1.ensureUint8Array)(bytes));
return RecipientStatusDataMessage.toObject(recipientStatusDataMessage, {
bytes: String,
longs: Number,
......@@ -78,7 +78,7 @@ class StatusesService {
return WrapperDataMessage.encode(wrapperDataMessage).finish();
}
decodeWrapperData(bytes) {
const wrappedDataMessage = WrapperDataMessage.decode(common_1.ensureUint8Array(bytes));
const wrappedDataMessage = WrapperDataMessage.decode((0, common_1.ensureUint8Array)(bytes));
return WrapperDataMessage.toObject(wrappedDataMessage, {
bytes: String,
});
......
......@@ -184,14 +184,14 @@ class VerificationService extends EventEmitter {
}
verifyStatusSHA256Batch(status, statusesBatchData) {
return __awaiter(this, void 0, void 0, function* () {
const statusSha256 = index_1.arrayBufferToBase64(yield index_1.CryptoService.SHA256(status, "base64"));
const statusSha256 = (0, index_1.arrayBufferToBase64)(yield index_1.CryptoService.SHA256(status, "base64"));
let verified = false;
const statusPosition = statusesBatchData.items.indexOf(statusSha256) + 1;
if (statusPosition > 0) {
const bytesToHash = [];
let hashesTotalByteLength = 0;
for (const statusHash of statusesBatchData.items) {
const statusHashBytes = index_1.base64ToArrayBuffer(statusHash);
const statusHashBytes = (0, index_1.base64ToArrayBuffer)(statusHash);
hashesTotalByteLength += statusHashBytes.byteLength;
bytesToHash.push(new Uint8Array(statusHashBytes));
}
......@@ -201,7 +201,7 @@ class VerificationService extends EventEmitter {
batchBytes.set(statusHashBytes, bytesOffset);
bytesOffset += statusHashBytes.byteLength;
});
const batchHash = index_1.arrayBufferToBase64(yield index_1.CryptoService.SHA256(batchBytes));
const batchHash = (0, index_1.arrayBufferToBase64)(yield index_1.CryptoService.SHA256(batchBytes));
verified = batchHash === statusesBatchData.hash;
}
else {
......@@ -219,7 +219,7 @@ class VerificationService extends EventEmitter {
verifyStatusesMerkleTree(nodeToVerify, merkleTree) {
return __awaiter(this, void 0, void 0, function* () {
const leaves = yield Promise.all(merkleTree.items.map((x) => __awaiter(this, void 0, void 0, function* () { return Buffer.from(yield index_1.CryptoService.SHA256(x)); })));
const rootHash = (yield index_1.getMerkleTreeRootHash(leaves)).toString("base64");
const rootHash = (yield (0, index_1.getMerkleTreeRootHash)(leaves)).toString("base64");
const verified = rootHash === merkleTree.hash;
if (!verified) {
throw new VerificationError_1.default(`Merkle tree not verified.`);
......
......@@ -10,6 +10,7 @@ export declare const arrayBufferToHex: (buffer: ArrayBuffer) => string;
export declare const encodeBase64Url: (base64: string) => string;
export declare const decodeBase64URL: (input: string) => string;
export declare const getMerkleTreeRootHash: (leaves: Buffer[]) => Promise<Buffer>;
export declare const isNode: boolean;
declare const _default: {
compressData: (binary: string | ArrayBuffer) => ArrayBuffer;
decompressData: (binary: string | ArrayBuffer) => ArrayBuffer;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment