home *** CD-ROM | disk | FTP | other *** search
/ Il Mio Computer 2006 May / Mico05CD.bin / Utility / CryptoMX / conv.js < prev    next >
Encoding:
Text File  |  2006-02-11  |  5.6 KB  |  266 lines

  1.     var maxLineLength = 64;
  2.     
  3.     var hexSentinel = "?HX?", hexEndSentinel = "?H";
  4.     
  5.     function armour_hex(b) {
  6.         var h = hexSentinel + byteArrayToHex(b) + hexEndSentinel;
  7.     var t = "";
  8.     while (h.length > maxLineLength) {
  9.         t += h.substring(0, maxLineLength) + "\n";
  10.         h = h.substring(maxLineLength, h.length);
  11.     }
  12.     t += h + "\n";
  13.     return t;
  14.     }
  15.     
  16.     function disarm_hex(s) {
  17.         var hexDigits = "0123456789abcdefABCDEF";
  18.     var hs = "", i;
  19.     
  20.     if ((i = s.indexOf(hexSentinel)) >= 0) {
  21.         s = s.substring(i + hexSentinel.length, s.length);
  22.     }
  23.     if ((i = s.indexOf(hexEndSentinel)) >= 0) {
  24.         s = s.substring(0, i);
  25.     }
  26.     
  27.     for (i = 0; i < s.length; i++) {
  28.         var c = s.charAt(i);
  29.         if (hexDigits.indexOf(c) >= 0) {
  30.             hs += c;
  31.         }
  32.     }
  33.     return hexToByteArray(hs);
  34.     }
  35.     
  36.     var acgcl, acgt, acgg;
  37.     
  38.     function armour_cg_outgroup() {
  39.         if (acgcl.length > maxLineLength) {
  40.         acgt += acgcl + "\n";
  41.         acgcl = "";
  42.         }
  43.     if (acgcl.length > 0) {
  44.         acgcl += " ";
  45.     }
  46.     acgcl += acgg;
  47.     acgg = "";
  48.     }
  49.     
  50.     function armour_cg_outletter(l) {
  51.         if (acgg.length >= 5) {
  52.         armour_cg_outgroup();
  53.     }
  54.     acgg += l;
  55.     }
  56.     
  57.     var codegroupSentinel = "ZZZZZ";
  58.     
  59.     function armour_codegroup(b) {
  60.         var charBase = ("A").charCodeAt(0);
  61.     
  62.     acgcl = codegroupSentinel;
  63.     acgt = "";
  64.     acgg = "";
  65.     
  66.     var cgrng = new LEcuyer(0xbadf00d);
  67.     for (i = 0; i < b.length; i++) {
  68.        var r = cgrng.nextInt(23);
  69.        armour_cg_outletter(String.fromCharCode(charBase + ((((b[i] >> 4) & 0xF)) + r) % 24));
  70.        r = cgrng.nextInt(23);
  71.        armour_cg_outletter(String.fromCharCode(charBase + ((((b[i] & 0xF)) + r) % 24)));
  72.     }
  73.     delete cgrng;
  74.     
  75.     while (acgg.length < 5) {
  76.         armour_cg_outletter("Z");
  77.     }
  78.     armour_cg_outgroup();
  79.     
  80.     acgg = "YYYYY";
  81.     armour_cg_outgroup();
  82.     
  83.     acgt += acgcl + "\n";
  84.     
  85.     return acgt;
  86.     }
  87.     
  88.     var dcgs, dcgi;
  89.     
  90.     function disarm_cg_insig() {
  91.         while (dcgi < dcgs.length) {
  92.         var c = dcgs.charAt(dcgi++).toUpperCase();
  93.         if ((c >= "A") && (c <= "Z")) {
  94.             return c;
  95.             }
  96.         }
  97.     return "";
  98.     }
  99.     
  100.     function disarm_codegroup(s) {
  101.         var b = new Array();
  102.     var nz = 0, ba, bal = 0, c;
  103.     
  104.         dcgs = s;
  105.     dcgi = 0;
  106.     
  107.     while (nz < 5) {
  108.         c = disarm_cg_insig();
  109.         
  110.         if (c == "Z") {
  111.             nz++;
  112.         } else if (c == "") {
  113.             nz = 0;
  114.             break;
  115.         } else {
  116.             nz = 0;
  117.         }
  118.         }
  119.     
  120.     if (nz == 0) {
  121.         alert("No codegroup starting symbol found in message.");
  122.         return "";
  123.     }
  124.     
  125.     var charBase = ("A").charCodeAt(0);    
  126.     var cgrng = new LEcuyer(0xbadf00d);
  127.     for (nz = 0; nz < 2; ) {
  128.         c = disarm_cg_insig();
  129.         
  130.         if ((c == "Y") || (c == "")) {
  131.             break;
  132.         } else if (c != "Z") {
  133.             var r = cgrng.nextInt(23);
  134.             var n = c.charCodeAt(0) - charBase;
  135.         n = (n + (24 - r)) % 24;
  136.         if (nz == 0) {
  137.             ba = (n << 4);
  138.             nz++;
  139.         } else {
  140.             ba |= n;
  141.             b[bal++] = ba;
  142.             nz = 0;
  143.         }
  144.         }
  145.     }
  146.     delete cgrng;
  147.     
  148.     var kbo = "  Attempting decoding with data received.";
  149.     if (nz != 0) {
  150.         alert("Codegroup data truncated." + kbo);
  151.     } else {
  152.         if (c == "Y") {
  153.         nz = 1;
  154.         while (nz < 5) {
  155.             c = disarm_cg_insig();
  156.                 if (c != "Y") {
  157.             break;
  158.             }
  159.             nz++;
  160.         }
  161.         if (nz != 5) {
  162.             alert("Codegroup end group incomplete." + kbo);
  163.         }
  164.         } else {
  165.         alert("Codegroup end group missing." + kbo);
  166.         }
  167.     }
  168.     
  169.     return b;
  170.     }
  171.  
  172.     var base64code = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",
  173.         base64sent = "?b64", base64esent = "?64b", base64addsent = true;
  174.     
  175.     function armour_base64(b) {
  176.         var b64t = "";
  177.     var b64l = base64addsent ? base64sent : "";
  178.     
  179.     var i;
  180.     for (i = 0; i <= b.length - 3; i += 3) {
  181.         if ((b64l.length + 4) > maxLineLength) {
  182.             b64t += b64l + "\n";
  183.             b64l = "";
  184.             }
  185.         b64l += base64code.charAt(b[i] >> 2);
  186.         b64l += base64code.charAt(((b[i] & 3) << 4) | (b[i + 1] >> 4));
  187.         b64l += base64code.charAt(((b[i + 1] & 0xF) << 2) | (b[i + 2] >> 6));
  188.         b64l += base64code.charAt(b[i + 2] & 0x3F);
  189.     }
  190.  
  191.     if ((b.length - i) == 1) {
  192.         b64l += base64code.charAt(b[i] >> 2);
  193.         b64l += base64code.charAt(((b[i] & 3) << 4));
  194.         b64l += "==";
  195.     } else if ((b.length - i) == 2) {
  196.         b64l += base64code.charAt(b[i] >> 2);
  197.         b64l += base64code.charAt(((b[i] & 3) << 4) | (b[i + 1] >> 4));
  198.         b64l += base64code.charAt(((b[i + 1] & 0xF) << 2));
  199.         b64l += "=";
  200.     }
  201.  
  202.     if ((b64l.length + 4) > maxLineLength) {
  203.         b64t += b64l + "\n";
  204.         b64l = "";
  205.         }
  206.     if (base64addsent) {
  207.         b64l += base64esent;
  208.     }
  209.     b64t += b64l + "\n";
  210.     return b64t;
  211.     }
  212.     
  213.     function disarm_base64(s) {
  214.         var b = new Array();
  215.     var i = 0, j, c, shortgroup = 0, n = 0;
  216.     var d = new Array();
  217.     
  218.     if ((j = s.indexOf(base64sent)) >= 0) {
  219.         s = s.substring(j + base64sent.length, s.length);
  220.     }
  221.     if ((j = s.indexOf(base64esent)) >= 0) {
  222.         s = s.substring(0, j);
  223.     }
  224.  
  225.     while (i < s.length) {
  226.         if (base64code.indexOf(s.charAt(i)) != -1) {
  227.             break;
  228.         }
  229.         i++;
  230.     }
  231.     
  232.     while (i < s.length) {
  233.         for (j = 0; j < 4; ) {
  234.             if (i >= s.length) {
  235.             if (j > 0) {
  236.                 alert("Base64 cipher text truncated.");
  237.                 return b;
  238.             }
  239.             break;
  240.         }
  241.         c = base64code.indexOf(s.charAt(i));
  242.         if (c >= 0) {
  243.             d[j++] = c;
  244.         } else if (s.charAt(i) == "=") {
  245.             d[j++] = 0;
  246.             shortgroup++;
  247.         } else if (s.substring(i, i + base64esent.length) == base64esent) {
  248.             i = s.length;
  249.             continue;
  250.         } else {
  251.         }
  252.         i++;
  253.         }
  254.         if (j == 4) {
  255.             b[n++] = ((d[0] << 2) | (d[1] >> 4)) & 0xFF;
  256.         if (shortgroup < 2) {
  257.             b[n++] = ((d[1] << 4) | (d[2] >> 2)) & 0xFF;
  258.             if (shortgroup < 1) {
  259.                 b[n++] = ((d[2] << 6) | d[3]) & 0xFF;
  260.             }
  261.         }
  262.         }
  263.         }
  264.     return b;
  265.     }
  266.