diff --git a/javascript/src/iframe/viamapi-iframe.js b/javascript/src/iframe/viamapi-iframe.js
index 30d09656ae9256225d4d64ed847f8a6e473a083a..487aa5b7d1e3a3c95e4e3ed184a78d05c3b91ca6 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 45c41446ea72a64e18a704e66a0efd7bee7399c7..3ecb0fd520d9872954d42dfbb478fe0e63c19bed 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();