From 052c6212a828c44c6e951a58ac2fe355978d9e92 Mon Sep 17 00:00:00 2001
From: Damyan Mitev <damyan.mitev@vereign.com>
Date: Wed, 13 Nov 2019 23:13:36 +0200
Subject: [PATCH] introduce ImageData class

---
 javascript/src/iframe/viamapi-iframe.js      |  6 +-
 javascript/src/utilities/signingUtilities.js | 79 +++++++++++++++++++-
 2 files changed, 82 insertions(+), 3 deletions(-)

diff --git a/javascript/src/iframe/viamapi-iframe.js b/javascript/src/iframe/viamapi-iframe.js
index 30d0965..487aa5b 100644
--- a/javascript/src/iframe/viamapi-iframe.js
+++ b/javascript/src/iframe/viamapi-iframe.js
@@ -21,6 +21,7 @@ import {
 import { LOGIN_MODES } from "../constants/authentication";
 import {
   CertificateData,
+  ImageData,
   createOneTimePassportCertificate,
   createPassportCertificate,
   decryptMessage,
@@ -1439,7 +1440,7 @@ const connection = Penpal.connectToParent({
         return encodeResponse("400", "", vCardImageResponse.status);
       }
 
-      const vCardImageData = vCardImageResponse.data;
+      const vCardImageData = new ImageData(vCardImageResponse.data);
 
       if (vCardImageData.contentType !== "image/png") {
         return encodeResponse("400", "", "Content type of vCard mmust be 'image/png'");
@@ -1514,7 +1515,8 @@ const connection = Penpal.connectToParent({
         return encodeResponse("400", "", signVCardResponse.status);
       }
 
-      return encodeResponse("200", signVCardResponse.data, "vCard signed");
+      const signedVCardImageData = new ImageData(signVCardResponse.data);
+      return encodeResponse("200", signedVCardImageData, "vCard signed");
     },
     documentCreateDocument: async (passportUUID, path, contentType, title) => {
       const authenticationPublicKey = localStorage.getItem(
diff --git a/javascript/src/utilities/signingUtilities.js b/javascript/src/utilities/signingUtilities.js
index 45c4144..3ecb0fd 100644
--- a/javascript/src/utilities/signingUtilities.js
+++ b/javascript/src/utilities/signingUtilities.js
@@ -26,7 +26,14 @@ import {
   getFilenameFromHeaders,
   SIGNATURE_CONTENT_TYPE
 } from "./emailUtilities";
-
+import {
+  stringToUtf8ByteArray,
+  utf8ByteArrayToString,
+  stringToUtf8Base64,
+  utf8Base64ToString,
+  base64ToByteArray,
+  byteArrayToBase64
+} from "../utilities/stringUtilities";
 const libmime = require("libmime");
 const pkijs = require("pkijs");
 const asn1js = require("asn1js");
@@ -1446,5 +1453,75 @@ export const verifySMIME = (smimeString, rootCaPem) => {
   });
 };
 
+export class ImageData {
+
+  /**
+   * Constructor for ImageData class
+   * @param {Object} [parameters] Object in format
+   * {
+   *   contentType: String,
+   *   content: String -- base64 encoded
+   * }
+   */
+  constructor(parameters = {}) {
+    this.contentType = null; //string: the content type
+    this.content = null; // Uint8Array: decoded content
+    this.contentBase64 = null; // string: base64 encoded content
+
+    if (typeof parameters === "object") {
+      this.fromParameters(parameters);
+    }
+  }
+
+  fromParameters(parameters) {
+    if ("contentType" in parameters) {
+      this.contentType = parameters.contentType;
+    }
+
+    if ("content" in parameters) {
+      this.content = parameters.content;
+    }
+
+    if ("contentBase64" in parameters) {
+      this.contentBase64 = parameters.contentBase64;
+    }
+
+    this.getContent();
+    this.getContentBase64();
+  }
+
+  //fromDataURL()
+  //fromContentTypeAndContentAsByteArray()
+
+  toDataURL() {
+    return "data:" + this.contentType + ";base64," + this.getContentBase64();
+  }
+
+  getContent() {
+    if (!this.content) {
+      if (this.contentBase64) {
+        this.content = base64ToByteArray(this.contentBase64);
+      }
+    }
+    return this.content;
+  }
+
+  getContentBase64() {
+    if (!this.contentBase64) {
+      if (this.content) {
+        this.contentBase64 = byteArrayToBase64(this.content);
+      }
+    }
+    return this.contentBase64;
+  }
+
+  toJSON() {
+    return {
+      "contentType": this.contentType,
+      "contentBase64": this.getContentBase64()
+    };
+  }
+}
+
 //Initialization block
 fixPkijsRDN();
-- 
GitLab