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

add compute,sign and verify qr code

parent f29c2cbf
No related branches found
No related tags found
1 merge request!39Resolve "QR Code Data Signing & Verification flow"
...@@ -13,6 +13,7 @@ import { ...@@ -13,6 +13,7 @@ import {
import CloudflareService from "./CloudflareService"; import CloudflareService from "./CloudflareService";
import CryptoServiceDefault from "./CryptoService"; import CryptoServiceDefault from "./CryptoService";
import { ICryptoService } from "./CryptoService/ICryptoService"; import { ICryptoService } from "./CryptoService/ICryptoService";
import { CryptoService } from "../index";
const EmailDataMessageV1 = vereign.protobuf.qrcode_data.EmailData_V1; const EmailDataMessageV1 = vereign.protobuf.qrcode_data.EmailData_V1;
const KeyDataMessageV1 = vereign.protobuf.qrcode_data.KeyData_V1; const KeyDataMessageV1 = vereign.protobuf.qrcode_data.KeyData_V1;
...@@ -109,6 +110,70 @@ const assembleQrCodeData = ( ...@@ -109,6 +110,70 @@ const assembleQrCodeData = (
return Buffer.concat([Buffer.from(head), Buffer.from(tail)]); return Buffer.concat([Buffer.from(head), Buffer.from(tail)]);
}; };
const computeQrCodeHash = async (emailData: MessageData): Promise<string> => {
const attachments = emailData.attachments.map((attachment) => {
//TODO: check if we can use attachment hash, attachment hashAlg
if (attachment.url) {
return {
name: attachment.name,
size: attachment.size,
url: attachment.url,
};
}
return {
name: attachment.name,
size: attachment.size,
};
});
const dataForHashing = {
statusId: emailData.statusId,
sender: emailData.sender,
subject: emailData.subject,
date: emailData.date,
recipients: emailData.recipients,
attachments,
};
const promises = Object.values(dataForHashing).map(async (value) => {
const base64 = Buffer.from(JSON.stringify(value)).toString("base64");
return CryptoService.SHA256(base64);
});
const hashArray = await Promise.all(promises);
return hashArray.sort().join("\n");
};
const calculateQRCodeSignature = async (
accountPrivateKey: string,
qrCodeHash: string
): Promise<string> => {
const signature = await CryptoService.signRSA(
accountPrivateKey,
Buffer.from(qrCodeHash)
);
return arrayBufferToBase64(signature);
};
const verifyQrCodeSignature = async (
publicKey: string,
qrCodeSignature: string,
recipientQRCodeHash: string
): Promise<boolean> => {
const qrCodeSignatureAsBuffer = base64ToArrayBuffer(qrCodeSignature);
const recipientQRCodeHashAsBuffer = Buffer.from(recipientQRCodeHash);
const result = await CryptoService.verifyRSASignature(
publicKey,
recipientQRCodeHashAsBuffer,
qrCodeSignatureAsBuffer
);
return result;
};
interface WithServices { interface WithServices {
getMessageDataFromBase64: (base64: string) => Promise<MessageData>; getMessageDataFromBase64: (base64: string) => Promise<MessageData>;
} }
...@@ -198,5 +263,8 @@ export default { ...@@ -198,5 +263,8 @@ export default {
decodeKeyDataPair, decodeKeyDataPair,
breakQrCodeData, breakQrCodeData,
assembleQrCodeData, assembleQrCodeData,
computeQrCodeHash,
calculateQRCodeSignature,
verifyQrCodeSignature,
withServices, withServices,
}; };
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment