diff --git a/javascript/src/iframe/viamapi-iframe.js b/javascript/src/iframe/viamapi-iframe.js
index 903055f08b58f575bf29aa8526f615885dfdaed7..04dd65b8cd79c14376d1d9d977cdfc5332b98fae 100644
--- a/javascript/src/iframe/viamapi-iframe.js
+++ b/javascript/src/iframe/viamapi-iframe.js
@@ -1,3 +1,4 @@
+import '../lib/textencoder.polyfill';
 import {
   parseSMIME,
   prepareVCardParts
@@ -43,7 +44,6 @@ const penpalMethods = require("../../temp/penpal-methods").default;
 const WopiAPI = require("./wopiapi-iframe");
 const CollaboraAPI = require("./collaboraapi-iframe");
 const ViamAPI = require("../../temp/viamapi");
-const asmCrypto = require('asmcrypto.js');
 
 const identityColors = ["#994392", "#cb0767", "#e51d31", "#ec671b", "#fab610"];
 
@@ -527,11 +527,6 @@ const connection = Penpal.connectToParent({
     },
     ...penpalMethods,
     createIdentity(pinCode) {
-      console.log("Our awesome log from create identity");
-      console.log({asmCrypto});
-      const sha1 = new asmCrypto.Sha1();
-      console.log({sha1});
-
       return new Penpal.Promise(result => {
         createPassportCertificate(makeid()).then(function (keys) {
           const newIdentity = new Identity();
diff --git a/javascript/src/lib/textencoder.polyfill.js b/javascript/src/lib/textencoder.polyfill.js
new file mode 100644
index 0000000000000000000000000000000000000000..461089a7607e798226cab949f9de7d814fd5ef7a
--- /dev/null
+++ b/javascript/src/lib/textencoder.polyfill.js
@@ -0,0 +1,58 @@
+if (typeof window.TextEncoder === "undefined") {
+  window.TextEncoder = function TextEncoder(){};
+  TextEncoder.prototype.encode = function encode(str) {
+    "use strict";
+    var Len = str.length, resPos = -1;
+    // The Uint8Array's length must be at least 3x the length of the string because an invalid UTF-16
+    //  takes up the equivelent space of 3 UTF-8 characters to encode it properly. However, Array's
+    //  have an auto expanding length and 1.5x should be just the right balance for most uses.
+    var resArr = typeof Uint8Array === "undefined" ? new Array(Len * 1.5) : new Uint8Array(Len * 3);
+    for (var point=0, nextcode=0, i = 0; i !== Len; ) {
+      point = str.charCodeAt(i), i += 1;
+      if (point >= 0xD800 && point <= 0xDBFF) {
+        if (i === Len) {
+          resArr[resPos += 1] = 0xef/*0b11101111*/; resArr[resPos += 1] = 0xbf/*0b10111111*/;
+          resArr[resPos += 1] = 0xbd/*0b10111101*/; break;
+        }
+        // https://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae
+        nextcode = str.charCodeAt(i);
+        if (nextcode >= 0xDC00 && nextcode <= 0xDFFF) {
+          point = (point - 0xD800) * 0x400 + nextcode - 0xDC00 + 0x10000;
+          i += 1;
+          if (point > 0xffff) {
+            resArr[resPos += 1] = (0x1e/*0b11110*/<<3) | (point>>>18);
+            resArr[resPos += 1] = (0x2/*0b10*/<<6) | ((point>>>12)&0x3f/*0b00111111*/);
+            resArr[resPos += 1] = (0x2/*0b10*/<<6) | ((point>>>6)&0x3f/*0b00111111*/);
+            resArr[resPos += 1] = (0x2/*0b10*/<<6) | (point&0x3f/*0b00111111*/);
+            continue;
+          }
+        } else {
+          resArr[resPos += 1] = 0xef/*0b11101111*/; resArr[resPos += 1] = 0xbf/*0b10111111*/;
+          resArr[resPos += 1] = 0xbd/*0b10111101*/; continue;
+        }
+      }
+      if (point <= 0x007f) {
+        resArr[resPos += 1] = (0x0/*0b0*/<<7) | point;
+      } else if (point <= 0x07ff) {
+        resArr[resPos += 1] = (0x6/*0b110*/<<5) | (point>>>6);
+        resArr[resPos += 1] = (0x2/*0b10*/<<6)  | (point&0x3f/*0b00111111*/);
+      } else {
+        resArr[resPos += 1] = (0xe/*0b1110*/<<4) | (point>>>12);
+        resArr[resPos += 1] = (0x2/*0b10*/<<6)    | ((point>>>6)&0x3f/*0b00111111*/);
+        resArr[resPos += 1] = (0x2/*0b10*/<<6)    | (point&0x3f/*0b00111111*/);
+      }
+    }
+    if (typeof Uint8Array !== "undefined") return resArr.subarray(0, resPos + 1);
+    // else // IE 6-9
+    resArr.length = resPos + 1; // trim off extra weight
+    return resArr;
+  };
+  TextEncoder.prototype.toString = function(){return "[object TextEncoder]"};
+  try { // Object.defineProperty only works on DOM prototypes in IE8
+    Object.defineProperty(TextEncoder.prototype,"encoding",{
+      get:function(){if(TextEncoder.prototype.isPrototypeOf(this)) return"utf-8";
+      else throw TypeError("Illegal invocation");}
+    });
+  } catch(e) { /*IE6-8 fallback*/ TextEncoder.prototype.encoding = "utf-8"; }
+  if(typeof Symbol!=="undefined")TextEncoder.prototype[Symbol.toStringTag]="TextEncoder";
+}
\ No newline at end of file