Skip to content
Snippets Groups Projects
Commit 441e2051 authored by Igor Markin's avatar Igor Markin
Browse files

Implement prepare script

parent 474c45bf
No related branches found
No related tags found
1 merge request!38Implement prepare script
Showing
with 1 addition and 3370 deletions
......@@ -2,3 +2,4 @@ node_modules
.idea
yarn-error.log
src/generated
dist
export = $root;
declare var $root: {};
This diff is collapsed.
export = $root;
declare var $root: {};
This diff is collapsed.
export * from "./types";
export * from "./utils/common";
export { default as CloudflareService } from "./services/CloudflareService";
export { default as VerificationService } from "./services/VerificationService";
export { default as MimeVerificationService } from "./services/MimeVerificationService";
export { default as StatusesService } from "./services/StatusesService";
export { default as CommonUtils } from "./utils/common";
export { default as QrCodeDataService } from "./services/QrCodeDataService";
export { default as CryptoService } from "./services/CryptoService";
export { default as VerificationError } from "./services/VerificationService/VerificationError";
export { default as MailParser } from "./services/MailParser";
export { default as QrCodeTemplate } from "./utils/qrCodeTemplateUtils";
export { default as RKAUtility } from "./utils/rka";
/**
* @deprecated Will be removed in version 1.0.1. Please use RKAUtility instead.
*/
export declare const RollingHash: {
getRabinFingerprint: (string: string) => string;
searchFingerprintInText: (text: string, keywordHashHexString: string, size: number) => number;
getRollingHash: (string: string) => string;
searchHashInText: (text: string, keywordHashHexString: string, size: number) => number;
};
import CloudflareService from "./services/CloudflareService";
/**
* @deprecated Will be removed in version 1.0.1. Please use CloudflareService instead.
*/
export declare const CDNService: typeof CloudflareService;
"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 __exportStar = (this && this.__exportStar) || function(m, exports) {
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.CDNService = exports.RollingHash = exports.RKAUtility = exports.QrCodeTemplate = exports.MailParser = exports.VerificationError = exports.CryptoService = exports.QrCodeDataService = exports.CommonUtils = exports.StatusesService = exports.MimeVerificationService = exports.VerificationService = exports.CloudflareService = void 0;
__exportStar(require("./types"), exports);
__exportStar(require("./utils/common"), exports);
var CloudflareService_1 = require("./services/CloudflareService");
Object.defineProperty(exports, "CloudflareService", { enumerable: true, get: function () { return CloudflareService_1.default; } });
var VerificationService_1 = require("./services/VerificationService");
Object.defineProperty(exports, "VerificationService", { enumerable: true, get: function () { return VerificationService_1.default; } });
var MimeVerificationService_1 = require("./services/MimeVerificationService");
Object.defineProperty(exports, "MimeVerificationService", { enumerable: true, get: function () { return MimeVerificationService_1.default; } });
var StatusesService_1 = require("./services/StatusesService");
Object.defineProperty(exports, "StatusesService", { enumerable: true, get: function () { return StatusesService_1.default; } });
var common_1 = require("./utils/common");
Object.defineProperty(exports, "CommonUtils", { enumerable: true, get: function () { return common_1.default; } });
var QrCodeDataService_1 = require("./services/QrCodeDataService");
Object.defineProperty(exports, "QrCodeDataService", { enumerable: true, get: function () { return QrCodeDataService_1.default; } });
var CryptoService_1 = require("./services/CryptoService");
Object.defineProperty(exports, "CryptoService", { enumerable: true, get: function () { return CryptoService_1.default; } });
var VerificationError_1 = require("./services/VerificationService/VerificationError");
Object.defineProperty(exports, "VerificationError", { enumerable: true, get: function () { return VerificationError_1.default; } });
var MailParser_1 = require("./services/MailParser");
Object.defineProperty(exports, "MailParser", { enumerable: true, get: function () { return MailParser_1.default; } });
var qrCodeTemplateUtils_1 = require("./utils/qrCodeTemplateUtils");
Object.defineProperty(exports, "QrCodeTemplate", { enumerable: true, get: function () { return qrCodeTemplateUtils_1.default; } });
var rka_1 = require("./utils/rka");
Object.defineProperty(exports, "RKAUtility", { enumerable: true, get: function () { return rka_1.default; } });
const rka_2 = require("./utils/rka");
/**
* @deprecated Will be removed in version 1.0.1. Please use RKAUtility instead.
*/
exports.RollingHash = rka_2.default;
const CloudflareService_2 = require("./services/CloudflareService");
/**
* @deprecated Will be removed in version 1.0.1. Please use CloudflareService instead.
*/
exports.CDNService = CloudflareService_2.default;
import { BlockData, TxData, TxMerkleTreeData } from "../types";
declare class AeternityService {
private _nodeUrl;
private _compilerUrl;
private _contractBytecode;
constructor(nodeUrl: string, compilerUrl: string, contractBytecode: string);
getTxDataByHash(hash: string): Promise<TxData>;
decodeContractCallData(callData: string): Promise<TxMerkleTreeData>;
getBlockData(height: number): Promise<BlockData>;
getBlockhainHeight(): Promise<number>;
}
export default AeternityService;
"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 axios_1 = require("axios");
class AeternityService {
constructor(nodeUrl, compilerUrl, contractBytecode) {
this._nodeUrl = "";
this._compilerUrl = "";
this._contractBytecode = "";
this._nodeUrl = nodeUrl;
this._compilerUrl = compilerUrl;
this._contractBytecode = contractBytecode;
if (!nodeUrl) {
throw new Error("Aeternity node URL not defined");
}
if (!compilerUrl) {
throw new Error("Aeternity compiler URL not defined");
}
if (!contractBytecode) {
throw new Error("Aeternity contract bytecode not defined");
}
}
getTxDataByHash(hash) {
return __awaiter(this, void 0, void 0, function* () {
const { data } = yield axios_1.default(`${this._nodeUrl}/v2/transactions/${hash}`);
return {
hash: data.hash,
blockHeight: data.block_height,
tx: {
callData: data.tx.call_data,
},
};
});
}
decodeContractCallData(callData) {
var _a, _b, _c, _d, _e, _f;
return __awaiter(this, void 0, void 0, function* () {
const { data } = yield axios_1.default({
url: `${this._compilerUrl}/decode-calldata/bytecode/`,
method: "POST",
headers: {
"Content-Type": "application/json",
},
data: {
calldata: callData,
bytecode: this._contractBytecode,
},
});
return {
merkleeTreeFileName: (_c = (_b = (_a = data.arguments[0]) === null || _a === void 0 ? void 0 : _a.value[0]) === null || _b === void 0 ? void 0 : _b.key) === null || _c === void 0 ? void 0 : _c.value,
rootNodeHash: (_f = (_e = (_d = data.arguments[0]) === null || _d === void 0 ? void 0 : _d.value[0]) === null || _e === void 0 ? void 0 : _e.val) === null || _f === void 0 ? void 0 : _f.value,
};
});
}
getBlockData(height) {
return __awaiter(this, void 0, void 0, function* () {
const [blockInfo, blockchainHeight] = yield Promise.all([
axios_1.default(`${this._nodeUrl}/v2/key-blocks/height/${height}`).then(({ data }) => data),
this.getBlockhainHeight(),
]);
return {
blockHeight: blockInfo.height,
timestamp: blockInfo.time,
confirmationsAmount: blockchainHeight - blockInfo.height,
};
});
}
getBlockhainHeight() {
return __awaiter(this, void 0, void 0, function* () {
const { data } = yield axios_1.default(`${this._nodeUrl}/v2/key-blocks/current/height`);
return data.height;
});
}
}
exports.default = AeternityService;
import { StatusData } from "../types";
declare class CloudflareService {
private _cdnUrl;
private _defaultBucket;
private _statusesService;
constructor(cdnUrl: string, defaultBucket: string);
fetchFile(fileName: string, bucket?: string): Promise<unknown>;
fetchStatusData(statusFileName: string): Promise<StatusData>;
readStatuses(statusId: string): Promise<Array<StatusData>>;
getMerkleTree(fileName: string): Promise<Array<string>>;
}
export default CloudflareService;
"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 axios_1 = require("axios");
const StatusesService_1 = require("./StatusesService");
const common_1 = require("../utils/common");
const STATUS_FILE_PREFIX = "bs";
class CloudflareService {
constructor(cdnUrl, defaultBucket) {
this._cdnUrl = "";
this._defaultBucket = "";
if (!cdnUrl) {
throw new Error("CDN URL Must not be empty");
}
if (!defaultBucket) {
throw new Error("Default bucket must not be empty");
}
this._cdnUrl = cdnUrl;
this._defaultBucket = defaultBucket;
this._statusesService = new StatusesService_1.default();
}
fetchFile(fileName, bucket = this._defaultBucket) {
return __awaiter(this, void 0, void 0, function* () {
// v?= is a dirty fix to prevent caching of the CORS error response in case file is missing.
// Because of browser caching CORS error in case of missing file, it's not possible to retrieve it when it's being uploaded.
// Dig into https://www.backblaze.com/b2/docs/cors_rules.html and fix
const { data } = yield axios_1.default(`${this._cdnUrl}/file/${bucket}/${fileName}?v=${Math.random()}`);
return data;
});
}
fetchStatusData(statusFileName) {
return __awaiter(this, void 0, void 0, function* () {
const rawStatusData = (yield this.fetchFile(statusFileName));
let decodedResult;
try {
decodedResult = this._statusesService.decodeStatusObject(new Uint8Array(common_1.base64ToArrayBuffer(rawStatusData.Status)));
}
catch (e) {
throw new Error("Error decoding status object");
}
return {
status: decodedResult.statusObject,
merkleTreeId: rawStatusData.MerkleTreeID,
transactionHash: rawStatusData.TransactionID,
statusRaw: rawStatusData.Status,
statusClassName: decodedResult.className,
};
});
}
readStatuses(statusId) {
return __awaiter(this, void 0, void 0, function* () {
let finished = false;
let currentIndex = 1;
const statuses = [];
while (!finished) {
try {
const statusData = yield this.fetchStatusData(`${STATUS_FILE_PREFIX}_${statusId}_${currentIndex}`);
statuses.push(statusData);
currentIndex++;
}
catch (error) {
// Axios error. Finishing fetching statuses.
if (error.isAxiosError) {
finished = true;
}
else {
throw error;
}
}
}
return statuses;
});
}
getMerkleTree(fileName) {
return __awaiter(this, void 0, void 0, function* () {
const merkleTreeFileContents = (yield this.fetchFile(fileName));
const statusesData = yield Promise.all(merkleTreeFileContents.map((statusFileName) => {
return this.fetchStatusData(statusFileName);
}));
const statusesMap = statusesData.reduce((acc, statusData, index) => {
Object.assign(acc, {
[merkleTreeFileContents[index].toLowerCase()]: statusData,
});
return acc;
}, {});
return Object.keys(statusesMap)
.sort()
.map((key) => statusesMap[key].statusRaw);
});
}
}
exports.default = CloudflareService;
import { ICryptoService } from "./ICryptoService";
declare const implementation: ICryptoService;
export default implementation;
"use strict";
// All functions are async in order to be compatible with the ICryptoService API
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 crypto = require("crypto");
const common_1 = require("../../utils/common");
const AES_GCM_ALGO = "aes-256-gcm";
const encryptAESGCM = (data) => __awaiter(void 0, void 0, void 0, function* () {
const key = crypto.randomBytes(32);
const iv = crypto.randomBytes(12);
const cipher = crypto.createCipheriv(AES_GCM_ALGO, key, iv);
const encrypted = cipher.update(data, "utf8");
cipher.final();
const authTag = cipher.getAuthTag();
const encryptedWithTag = Buffer.concat([
Buffer.from(encrypted),
Buffer.from(authTag),
]);
return {
key: key.buffer,
iv: iv.buffer,
data: encryptedWithTag,
};
});
const decryptAESGCM = (data, key, iv) => __awaiter(void 0, void 0, void 0, function* () {
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");
decipher.setAuthTag(Buffer.from(authTag));
str += decipher.final("utf8");
return str;
});
const generateRSAKeys = () => __awaiter(void 0, void 0, void 0, function* () {
const { privateKey, publicKey } = crypto.generateKeyPairSync("rsa", {
modulusLength: 4096,
publicKeyEncoding: {
type: "spki",
format: "pem",
},
privateKeyEncoding: {
type: "pkcs8",
format: "pem",
},
});
return {
publicKeyPEM: publicKey,
privateKeyPEM: privateKey,
};
});
const encryptRSA = (publicKeyPEM, data) => __awaiter(void 0, void 0, void 0, function* () {
const encryptedData = crypto.publicEncrypt({
key: publicKeyPEM,
padding: crypto.constants.RSA_PKCS1_OAEP_PADDING,
oaepHash: "sha256",
},
// We convert the data string to a buffer using `Buffer.from`
Buffer.from(data));
return encryptedData.buffer;
});
const decryptRSA = (privateKeyPEM, data) => __awaiter(void 0, void 0, void 0, function* () {
const encryptedData = crypto.privateDecrypt({
key: privateKeyPEM,
padding: crypto.constants.RSA_PKCS1_OAEP_PADDING,
oaepHash: "sha256",
},
// We convert the data string to a buffer using `Buffer.from`
Buffer.from(data));
return encryptedData.buffer;
});
const signRSA = (privateKeyPEM, data) => __awaiter(void 0, void 0, void 0, function* () {
const sign = crypto.createSign("SHA256");
sign.update(Buffer.from(data));
sign.end();
return sign.sign(privateKeyPEM).buffer;
});
const SHA256 = (string) => __awaiter(void 0, void 0, void 0, function* () {
return crypto.createHash("sha256").update(string, "utf8").digest();
});
const verifyRSASignature = (publicKeyPEM, data, signature) => __awaiter(void 0, void 0, void 0, function* () {
const verify = crypto.createVerify("SHA256");
verify.update(Buffer.from(data));
verify.end();
const publicKey = crypto.createPublicKey(Buffer.from(publicKeyPEM, "utf-8"));
return verify.verify(publicKey, Buffer.from(signature));
});
const implementation = {
encryptAESGCM,
decryptAESGCM,
generateRSAKeys,
encryptRSA,
decryptRSA,
SHA256,
signRSA,
verifyRSASignature,
};
exports.default = implementation;
import { ICryptoService } from "./ICryptoService";
export declare const verifyRSASignature: (publicKeyPEM: string, data: ArrayBuffer, signature: ArrayBuffer) => Promise<boolean>;
declare const implementation: ICryptoService;
export default implementation;
"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 });
exports.verifyRSASignature = void 0;
const common_1 = require("../../utils/common");
function exportKey(key) {
return __awaiter(this, void 0, void 0, function* () {
return crypto.subtle.exportKey("raw", key);
});
}
const convertPemToBinary = (pem) => {
const lines = pem.split("\n");
let encoded = "";
for (let i = 0; i < lines.length; i++) {
if (lines[i].trim().length > 0 &&
lines[i].indexOf("-BEGIN PRIVATE KEY-") < 0 &&
lines[i].indexOf("-BEGIN PUBLIC KEY-") < 0 &&
lines[i].indexOf("-END PRIVATE KEY-") < 0 &&
lines[i].indexOf("-END PUBLIC KEY-") < 0) {
encoded += lines[i].trim();
}
}
return common_1.base64ToArrayBuffer(encoded);
};
exports.verifyRSASignature = (publicKeyPEM, data, signature) => __awaiter(void 0, void 0, void 0, function* () {
const publicKey = yield crypto.subtle.importKey("spki", convertPemToBinary(publicKeyPEM), {
name: "RSASSA-PKCS1-v1_5",
hash: "SHA-256",
}, true, ["verify"]);
return yield crypto.subtle.verify({
name: "RSASSA-PKCS1-v1_5",
hash: "SHA-256",
}, publicKey, signature, data);
});
const encryptAESGCM = (data) => __awaiter(void 0, void 0, void 0, function* () {
const key = yield crypto.subtle.generateKey({
name: "AES-GCM",
length: 256,
}, true, ["encrypt", "decrypt"]);
const encoded = new TextEncoder().encode(data);
const iv = crypto.getRandomValues(new Buffer(12));
const encrypted = yield crypto.subtle.encrypt({ name: "AES-GCM", iv: iv }, key, encoded);
return { data: encrypted, key: yield exportKey(key), iv };
});
const decryptAESGCM = (data, key, iv) => __awaiter(void 0, void 0, void 0, function* () {
const importedKey = yield crypto.subtle.importKey("raw", key, {
name: "AES-GCM",
length: 256,
}, true, ["encrypt", "decrypt"]);
const decrypted = yield crypto.subtle.decrypt({ name: "AES-GCM", iv: iv }, importedKey, data);
return new TextDecoder().decode(decrypted);
});
const SHA256 = (string) => __awaiter(void 0, void 0, void 0, function* () {
const encoder = new TextEncoder();
return yield crypto.subtle.digest("SHA-256", encoder.encode(string));
});
const implementation = {
encryptAESGCM,
decryptAESGCM,
verifyRSASignature: exports.verifyRSASignature,
generateRSAKeys() {
throw new Error("Surprise. Not implemented yet :)");
},
encryptRSA(publicKeyPEM, data) {
throw new Error("Surprise. Not implemented yet :)");
},
decryptRSA(privateKeyPEM, data) {
throw new Error("Surprise. Not implemented yet :)");
},
signRSA(privateKeyPEM, data) {
throw new Error("Surprise. Not implemented yet :)");
},
SHA256,
};
exports.default = implementation;
export interface AESGCMOutput {
data: ArrayBuffer;
key: ArrayBuffer;
iv: ArrayBuffer;
}
export interface RSAKeys {
publicKeyPEM: string;
privateKeyPEM: string;
}
export interface ICryptoService {
encryptAESGCM: (data: string) => Promise<AESGCMOutput>;
decryptAESGCM: (data: ArrayBuffer, key: ArrayBuffer, iv: ArrayBuffer) => Promise<string>;
generateRSAKeys: () => Promise<RSAKeys>;
encryptRSA: (publicKeyPEM: string, data: ArrayBuffer) => Promise<ArrayBuffer>;
decryptRSA: (privateKeyPEM: string, data: ArrayBuffer) => Promise<ArrayBuffer>;
signRSA: (privateKeyPEM: string, data: ArrayBuffer) => Promise<ArrayBuffer>;
verifyRSASignature: (publicKeyPEM: string, data: ArrayBuffer, signature: ArrayBuffer) => Promise<boolean>;
SHA256: (string: string) => Promise<ArrayBuffer>;
}
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
declare const service: import("./ICryptoService").ICryptoService;
export default service;
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const CryptoServiceNode_1 = require("./CryptoServiceNode");
const CryptoServiceWeb_1 = require("./CryptoServiceWeb");
const service = typeof crypto !== "undefined" && crypto.subtle
? CryptoServiceWeb_1.default
: CryptoServiceNode_1.default;
exports.default = service;
export function fixNewLines(mime: any): any;
export function extractMessageID(mime: any): any;
export function parseMIME(mime: any): any;
export function getHeaderValue(header: any, part: any): any;
export function getGlobalHeaderValue(header: any, parts: any): any;
export function getAttachments(mime: any, parts: any): any[];
export function getAttachment(mime: any, part: any): {
contentType: any;
base64: any;
contentId: any;
};
export function getFilenameFromHeaders(headers: any): string;
export function extractHtmlBodyFromString(string: any): any;
declare namespace _default {
export { parseMIME };
export { getHTML };
export { getPlain };
}
export default _default;
declare function getHTML(mime: any, parts: any): any;
declare function getPlain(mime: any, parts: any): any;
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment