diff --git a/dist/index.d.ts b/dist/index.d.ts index c116b57ea3b5d35efc783c395e9c6dcd01b755bd..ec88b41fb0067f9c86c0122335dbb7205a16e0c4 100644 --- a/dist/index.d.ts +++ b/dist/index.d.ts @@ -1,5 +1,6 @@ export * from "./types"; export * from "./utils/common"; +export { default as getMerkleTreeRootHash } from "./utils/getMerkleTreeRootHash"; export { default as CloudflareService } from "./services/CloudflareService"; export { default as VerificationService } from "./services/VerificationService"; export { default as StatusesService } from "./services/StatusesService"; diff --git a/dist/index.js b/dist/index.js index 72d2d74973809087f2cfe7be991f07f7d536d536..0143f9a797d7fef5e8799f82215b11d2a312aa93 100644 --- a/dist/index.js +++ b/dist/index.js @@ -17,9 +17,11 @@ var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); -exports.QrCodeTemplate = exports.VerificationError = exports.CryptoService = exports.IPFSService = exports.QrCodeDataService = exports.CommonUtils = exports.StatusesService = exports.VerificationService = exports.CloudflareService = void 0; +exports.QrCodeTemplate = exports.VerificationError = exports.CryptoService = exports.IPFSService = exports.QrCodeDataService = exports.CommonUtils = exports.StatusesService = exports.VerificationService = exports.CloudflareService = exports.getMerkleTreeRootHash = void 0; __exportStar(require("./types"), exports); __exportStar(require("./utils/common"), exports); +var getMerkleTreeRootHash_1 = require("./utils/getMerkleTreeRootHash"); +Object.defineProperty(exports, "getMerkleTreeRootHash", { enumerable: true, get: function () { return __importDefault(getMerkleTreeRootHash_1).default; } }); var CloudflareService_1 = require("./services/CloudflareService"); Object.defineProperty(exports, "CloudflareService", { enumerable: true, get: function () { return __importDefault(CloudflareService_1).default; } }); var VerificationService_1 = require("./services/VerificationService"); diff --git a/dist/services/CryptoService/index.js b/dist/services/CryptoService/index.js index 5405c3e09c38920b8948c36167f3410dc3b30817..449752907df27b28e1438efa16041476592dec9d 100644 --- a/dist/services/CryptoService/index.js +++ b/dist/services/CryptoService/index.js @@ -14,11 +14,12 @@ class CryptoServiceProxy { // this._target = typeof crypto !== "undefined" && crypto.subtle // ? new CryptoServiceWeb() // : new CryptoServiceNode(); - if (typeof document !== 'undefined') { + if (typeof document !== "undefined") { // I'm on the web! console.log("I'm on the web!"); } - else if (typeof navigator !== 'undefined' && navigator.product === 'ReactNative') { + else if (typeof navigator !== "undefined" && + navigator.product === "ReactNative") { // I'm in react-native console.log("I'm in react-native"); } diff --git a/dist/services/QrCodeDataService.js b/dist/services/QrCodeDataService.js index 1c668db6c7598507da2882538839fcad47506bd2..049d590053f1774e724166a01d75bb325a289a3b 100644 --- a/dist/services/QrCodeDataService.js +++ b/dist/services/QrCodeDataService.js @@ -8,10 +8,13 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge 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 }); const qrcode_data_pb_1 = require("../generated/qrcode_data_pb"); const common_1 = require("../utils/common"); -const index_1 = require("../index"); +const CryptoService_1 = __importDefault(require("./CryptoService")); const EmailDataMessageV1 = qrcode_data_pb_1.vereign.protobuf.qrcode_data.EmailData_V1; const KeyDataMessageV1 = qrcode_data_pb_1.vereign.protobuf.qrcode_data.KeyData_V1; const WrapperDataMessage = qrcode_data_pb_1.vereign.protobuf.qrcode_data.WrapperData; @@ -74,13 +77,13 @@ const assembleQrCodeData = (head, tail) => { return Buffer.concat([Buffer.from(head), Buffer.from(tail)]); }; const calculateQRCodeSignature = (accountPrivateKey, qrCodeHash) => __awaiter(void 0, void 0, void 0, function* () { - const signature = yield index_1.CryptoService.signRSA(accountPrivateKey, Buffer.from(qrCodeHash)); + const signature = yield CryptoService_1.default.signRSA(accountPrivateKey, Buffer.from(qrCodeHash)); return (0, common_1.arrayBufferToBase64)(signature); }); const verifyQrCodeSignature = (publicKey, qrCodeSignature, recipientQRCodeHash) => __awaiter(void 0, void 0, void 0, function* () { const qrCodeSignatureAsBuffer = (0, common_1.base64ToArrayBuffer)(qrCodeSignature); const recipientQRCodeHashAsBuffer = Buffer.from(recipientQRCodeHash); - const result = yield index_1.CryptoService.verifyRSASignature(publicKey, recipientQRCodeHashAsBuffer, qrCodeSignatureAsBuffer); + const result = yield CryptoService_1.default.verifyRSASignature(publicKey, recipientQRCodeHashAsBuffer, qrCodeSignatureAsBuffer); return result; }); exports.default = { diff --git a/dist/services/VerificationService/VerificationService.js b/dist/services/VerificationService/VerificationService.js index 1fab029b9dab146e4a585fea013d6533213695e9..d9b0a3305666f7a4cbe0a1f574f945ad85343976 100644 --- a/dist/services/VerificationService/VerificationService.js +++ b/dist/services/VerificationService/VerificationService.js @@ -13,7 +13,9 @@ var __importDefault = (this && this.__importDefault) || function (mod) { }; Object.defineProperty(exports, "__esModule", { value: true }); exports.BLOCK_DATA_RETRIEVED = exports.STATUS_BATCH_VERIFIED = exports.TRANSACTION_RETRIEVED = void 0; -const index_1 = require("../../index"); +const CryptoService_1 = __importDefault(require("../CryptoService")); +const common_1 = require("../../utils/common"); +const getMerkleTreeRootHash_1 = __importDefault(require("../../utils/getMerkleTreeRootHash")); const EventEmitter = require("eventemitter2"); const AeternityService_1 = __importDefault(require("../AeternityService/AeternityService")); const CloudflareService_1 = __importDefault(require("../CloudflareService")); @@ -184,14 +186,14 @@ class VerificationService extends EventEmitter { } verifyStatusSHA256Batch(status, statusesBatchData) { return __awaiter(this, void 0, void 0, function* () { - const statusSha256 = (0, index_1.arrayBufferToBase64)(yield index_1.CryptoService.SHA256(status, "base64")); + const statusSha256 = (0, common_1.arrayBufferToBase64)(yield CryptoService_1.default.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 = (0, index_1.base64ToArrayBuffer)(statusHash); + const statusHashBytes = (0, common_1.base64ToArrayBuffer)(statusHash); hashesTotalByteLength += statusHashBytes.byteLength; bytesToHash.push(new Uint8Array(statusHashBytes)); } @@ -201,7 +203,7 @@ class VerificationService extends EventEmitter { batchBytes.set(statusHashBytes, bytesOffset); bytesOffset += statusHashBytes.byteLength; }); - const batchHash = (0, index_1.arrayBufferToBase64)(yield index_1.CryptoService.SHA256(batchBytes)); + const batchHash = (0, common_1.arrayBufferToBase64)(yield CryptoService_1.default.SHA256(batchBytes)); verified = batchHash === statusesBatchData.hash; } else { @@ -218,8 +220,8 @@ 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 (0, index_1.getMerkleTreeRootHash)(leaves)).toString("base64"); + const leaves = yield Promise.all(merkleTree.items.map((x) => __awaiter(this, void 0, void 0, function* () { return Buffer.from(yield CryptoService_1.default.SHA256(x)); }))); + const rootHash = (yield (0, getMerkleTreeRootHash_1.default)(leaves)).toString("base64"); const verified = rootHash === merkleTree.hash; if (!verified) { throw new VerificationError_1.default(`Merkle tree not verified.`); diff --git a/dist/utils/common.d.ts b/dist/utils/common.d.ts index 068ccd68e178219e1d5f156122a353dde1c885a7..77609cbf71dbacca462ea86a60ba0224848b546c 100644 --- a/dist/utils/common.d.ts +++ b/dist/utils/common.d.ts @@ -1,4 +1,3 @@ -/// <reference types="node" /> export declare const arrayBufferToBase64: (buffer: ArrayBuffer) => string; export declare const base64ToArrayBuffer: (base64: string) => ArrayBuffer; export declare const ensureBase64: (data: string | ArrayBuffer) => string; @@ -9,7 +8,6 @@ export declare const decompressData: (binary: string | ArrayBuffer) => ArrayBuff 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; diff --git a/dist/utils/common.js b/dist/utils/common.js index 86fbc868c752fad0bb056fd8c8249aa1f7a2ae61..d1f4af0d9549428f7045e9b032310ee4f61d9b74 100644 --- a/dist/utils/common.js +++ b/dist/utils/common.js @@ -22,19 +22,9 @@ var __importStar = (this && this.__importStar) || function (mod) { __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()); - }); -}; Object.defineProperty(exports, "__esModule", { value: true }); -exports.isNode = exports.getMerkleTreeRootHash = exports.decodeBase64URL = exports.encodeBase64Url = exports.arrayBufferToHex = exports.decompressData = exports.compressData = exports.ensureUint8Array = exports.ensureArrayBuffer = exports.ensureBase64 = exports.base64ToArrayBuffer = exports.arrayBufferToBase64 = void 0; +exports.isNode = exports.decodeBase64URL = exports.encodeBase64Url = exports.arrayBufferToHex = exports.decompressData = exports.compressData = exports.ensureUint8Array = exports.ensureArrayBuffer = exports.ensureBase64 = exports.base64ToArrayBuffer = exports.arrayBufferToBase64 = void 0; const fflate = __importStar(require("fflate")); -const index_1 = require("../index"); const arrayBufferToBase64 = (buffer) => { return Buffer.from(buffer).toString("base64"); }; @@ -83,30 +73,6 @@ const decodeBase64URL = (input) => { return input.replace(/_/g, "/").replace(/-/g, "+"); }; exports.decodeBase64URL = decodeBase64URL; -const getMerkleTreeRootHash = (leaves) => __awaiter(void 0, void 0, void 0, function* () { - let hashes = [...leaves]; - while (hashes.length != 1) { - let pair; - const newHashes = []; - for (let i = 0; i < hashes.length; i++) { - const hash = hashes[i]; - pair = pair ? Buffer.concat([pair, hash]) : hash; - if (i % 2) { - newHashes.push(yield index_1.CryptoService.SHA256(pair)); - pair = null; - } - else { - // If array has odd items, transfer the last one to the upper level of the tree - if (i === hashes.length - 1) { - newHashes.push(hash); - } - } - } - hashes = newHashes; - } - return hashes[0]; -}); -exports.getMerkleTreeRootHash = getMerkleTreeRootHash; exports.isNode = typeof process !== "undefined" && process.versions != null && process.versions.node != null; diff --git a/dist/utils/getMerkleTreeRootHash.d.ts b/dist/utils/getMerkleTreeRootHash.d.ts new file mode 100644 index 0000000000000000000000000000000000000000..1f2888022b2e3bef5f43928c79cd68f81ff27444 --- /dev/null +++ b/dist/utils/getMerkleTreeRootHash.d.ts @@ -0,0 +1,3 @@ +/// <reference types="node" /> +declare const getMerkleTreeRootHash: (leaves: Buffer[]) => Promise<Buffer>; +export default getMerkleTreeRootHash; diff --git a/dist/utils/getMerkleTreeRootHash.js b/dist/utils/getMerkleTreeRootHash.js new file mode 100644 index 0000000000000000000000000000000000000000..4d2fdb90e3b488eebe4ef012abd2c795f9a5bc83 --- /dev/null +++ b/dist/utils/getMerkleTreeRootHash.js @@ -0,0 +1,39 @@ +"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()); + }); +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const CryptoService_1 = __importDefault(require("../services/CryptoService")); +const getMerkleTreeRootHash = (leaves) => __awaiter(void 0, void 0, void 0, function* () { + let hashes = [...leaves]; + while (hashes.length != 1) { + let pair; + const newHashes = []; + for (let i = 0; i < hashes.length; i++) { + const hash = hashes[i]; + pair = pair ? Buffer.concat([pair, hash]) : hash; + if (i % 2) { + newHashes.push(yield CryptoService_1.default.SHA256(pair)); + pair = null; + } + else { + // If array has odd items, transfer the last one to the upper level of the tree + if (i === hashes.length - 1) { + newHashes.push(hash); + } + } + } + hashes = newHashes; + } + return hashes[0]; +}); +exports.default = getMerkleTreeRootHash; diff --git a/src/index.ts b/src/index.ts index c116b57ea3b5d35efc783c395e9c6dcd01b755bd..ec88b41fb0067f9c86c0122335dbb7205a16e0c4 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,5 +1,6 @@ export * from "./types"; export * from "./utils/common"; +export { default as getMerkleTreeRootHash } from "./utils/getMerkleTreeRootHash"; export { default as CloudflareService } from "./services/CloudflareService"; export { default as VerificationService } from "./services/VerificationService"; export { default as StatusesService } from "./services/StatusesService"; diff --git a/src/services/QrCodeDataService.ts b/src/services/QrCodeDataService.ts index 03bc827ef1452d97d5059839e28c31167d668879..b7e6feb92e03449d7e0433f2d9816950cb7aa5dc 100644 --- a/src/services/QrCodeDataService.ts +++ b/src/services/QrCodeDataService.ts @@ -7,7 +7,7 @@ import { ensureUint8Array, } from "../utils/common"; -import { CryptoService } from "../index"; +import CryptoService from "./CryptoService"; const EmailDataMessageV1 = vereign.protobuf.qrcode_data.EmailData_V1; const KeyDataMessageV1 = vereign.protobuf.qrcode_data.KeyData_V1; diff --git a/src/services/VerificationService/VerificationService.ts b/src/services/VerificationService/VerificationService.ts index 5bc1a3c8131264a3879a4ccbe4d1865a8b00998a..4db6bacca25ee5c9a7c283a6ae61c6f50d20ca54 100644 --- a/src/services/VerificationService/VerificationService.ts +++ b/src/services/VerificationService/VerificationService.ts @@ -1,10 +1,7 @@ -import { - arrayBufferToBase64, - base64ToArrayBuffer, - CryptoService, - DecodedCallData, - getMerkleTreeRootHash, -} from "../../index"; +import CryptoService from "../CryptoService"; +import { arrayBufferToBase64, base64ToArrayBuffer } from "../../utils/common"; +import getMerkleTreeRootHash from "../../utils/getMerkleTreeRootHash"; +import { DecodedCallData } from "../../types"; const EventEmitter = require("eventemitter2"); import AeternityService from "../AeternityService/AeternityService"; @@ -118,21 +115,17 @@ class VerificationService extends EventEmitter { let statusVerified; let statusPosition = -1; if (verificationMethod === VERIFICATION_METHOD_MERKLE_TREE) { - ({ - verified: statusVerified, - statusPosition, - } = await this.verifyStatusesMerkleTree( - statusData.statusRaw, - statusBatchData - )); + ({ verified: statusVerified, statusPosition } = + await this.verifyStatusesMerkleTree( + statusData.statusRaw, + statusBatchData + )); } else if (verificationMethod === VERIFICATION_METHOD_SHA256_BATCH) { - ({ - verified: statusVerified, - statusPosition, - } = await this.verifyStatusSHA256Batch( - statusData.statusRaw, - statusBatchData - )); + ({ verified: statusVerified, statusPosition } = + await this.verifyStatusSHA256Batch( + statusData.statusRaw, + statusBatchData + )); } batchVerificationDetails = { diff --git a/src/utils/common.ts b/src/utils/common.ts index b74f072010809c6785e1c1460a03dde5f842fd66..bc33f49a01b05d05756e041313f9184782c6c5e6 100644 --- a/src/utils/common.ts +++ b/src/utils/common.ts @@ -1,5 +1,4 @@ import * as fflate from "fflate"; -import { CryptoService } from "../index"; export const arrayBufferToBase64 = (buffer: ArrayBuffer): string => { return Buffer.from(buffer).toString("base64"); @@ -51,35 +50,6 @@ export const decodeBase64URL = (input: string): string => { return input.replace(/_/g, "/").replace(/-/g, "+"); }; -export const getMerkleTreeRootHash = async ( - leaves: Buffer[] -): Promise<Buffer> => { - let hashes = [...leaves]; - while (hashes.length != 1) { - let pair: Buffer; - - const newHashes = []; - for (let i = 0; i < hashes.length; i++) { - const hash = hashes[i]; - pair = pair ? Buffer.concat([pair, hash]) : hash; - - if (i % 2) { - newHashes.push(await CryptoService.SHA256(pair)); - pair = null; - } else { - // If array has odd items, transfer the last one to the upper level of the tree - if (i === hashes.length - 1) { - newHashes.push(hash); - } - } - } - - hashes = newHashes; - } - - return hashes[0]; -}; - export const isNode = typeof process !== "undefined" && process.versions != null && diff --git a/src/utils/getMerkleTreeRootHash.ts b/src/utils/getMerkleTreeRootHash.ts new file mode 100644 index 0000000000000000000000000000000000000000..fecb0893b528af17436bad43bb70461dcb4c4401 --- /dev/null +++ b/src/utils/getMerkleTreeRootHash.ts @@ -0,0 +1,30 @@ +import CryptoService from "../services/CryptoService"; + +const getMerkleTreeRootHash = async (leaves: Buffer[]): Promise<Buffer> => { + let hashes = [...leaves]; + while (hashes.length != 1) { + let pair: Buffer; + + const newHashes = []; + for (let i = 0; i < hashes.length; i++) { + const hash = hashes[i]; + pair = pair ? Buffer.concat([pair, hash]) : hash; + + if (i % 2) { + newHashes.push(await CryptoService.SHA256(pair)); + pair = null; + } else { + // If array has odd items, transfer the last one to the upper level of the tree + if (i === hashes.length - 1) { + newHashes.push(hash); + } + } + } + + hashes = newHashes; + } + + return hashes[0]; +}; + +export default getMerkleTreeRootHash;