Advertisement
Guest User

Untitled

a guest
Sep 2nd, 2016
214
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. <html>
  2. <head>
  3. <title>My small part of the cccam protocol implementation demonstration in javascript</title>
  4. <script type='text/javascript'>
  5.  
  6.     function print_r( array, return_val ) {
  7.         // Prints human-readable information about a variable
  8.         //
  9.         // +    discuss at: http://kevin.vanzonneveld.net/techblog/article/javascript_equivalent_for_phps_print_r/
  10.         // +       version: 809.2411
  11.         // +   original by: Michael White (http://getsprink.com)
  12.         // +   improved by: Ben Bryan
  13.         // *     example 1: print_r(1, true);
  14.         // *     returns 1: 1
  15.    
  16.         var output = "", pad_char = " ", pad_val = 4;
  17.  
  18.         var formatArray = function (obj, cur_depth, pad_val, pad_char) {
  19.             if (cur_depth > 0) {
  20.                 cur_depth++;
  21.             }
  22.  
  23.             var base_pad = repeat_char(pad_val*cur_depth, pad_char);
  24.             var thick_pad = repeat_char(pad_val*(cur_depth+1), pad_char);
  25.             var str = "";
  26.  
  27.             if (obj instanceof Array || obj instanceof Object) {
  28.                 str += "Array\n" + base_pad + "(\n";
  29.                 for (var key in obj) {
  30.                     if (obj[key] instanceof Array) {
  31.                         str += thick_pad + "["+key+"] => "+formatArray(obj[key], cur_depth+1, pad_val, pad_char);
  32.                     } else {
  33.                         str += thick_pad + "["+key+"] => " + obj[key] + "\n";
  34.                     }
  35.                 }
  36.                 str += base_pad + ")\n";
  37.             } else if(obj == null || obj == undefined) {
  38.                 str = '';
  39.             } else {
  40.                 str = obj.toString();
  41.             }
  42.  
  43.             return str;
  44.         };
  45.  
  46.         var repeat_char = function (len, pad_char) {
  47.             var str = "";
  48.             for (var i=0; i < len; i++) {
  49.                 str += pad_char;
  50.             };
  51.             return str;
  52.         };
  53.         output = formatArray(array, 0, pad_val, pad_char);
  54.  
  55.         if (return_val !== true) {
  56.             document.write("<pre>" + output + "</pre>");
  57.             return true;
  58.         } else {
  59.             return output;
  60.         }
  61.     }
  62.  
  63.     function count(mixed_var, mode) {
  64.         // Count elements in an array, or properties in an object
  65.         //
  66.         // +    discuss at: http://kevin.vanzonneveld.net/techblog/article/javascript_equivalent_for_phps_count/
  67.         // +       version: 809.522
  68.         // +   original by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
  69.         // +      input by: _argos
  70.         // *     example 1: count([[0,0],[0,-4]], 'COUNT_RECURSIVE');
  71.         // *     returns 1: 6
  72.         // *     example 2: count({'one' : [1,2,3,4,5]}, 'COUNT_RECURSIVE');
  73.         // *     returns 2: 6
  74.  
  75.         var key, cnt = 0;
  76.  
  77.         if (mode == 'COUNT_RECURSIVE') mode = 1;
  78.         if (mode != 1) mode = 0;
  79.  
  80.         for (key in mixed_var){
  81.             cnt++;
  82.             if (mode==1 && mixed_var[key] && (mixed_var[key].constructor === Array || mixed_var[key].constructor === Object)) {
  83.                 cnt += count(mixed_var[key], 1);
  84.             }
  85.         }
  86.  
  87.         return cnt;
  88.     }
  89.  
  90.     function strlen(string) {
  91.         // Get string length
  92.         //
  93.         // +    discuss at: http://kevin.vanzonneveld.net/techblog/article/javascript_equivalent_for_phps_strlen/
  94.         // +       version: 810.616
  95.         // +   original by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
  96.         // +   improved by: Sakimori
  97.         // +      input by: Kirk Strobeck
  98.         // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
  99.         // +   bugfixed by: Onno Marsman
  100.         // *     example 1: strlen('Kevin van Zonneveld');
  101.         // *     returns 1: 19
  102.  
  103.         return (string+'').length;
  104.     }
  105.  
  106.     function substr(f_string, f_start, f_length) {
  107.         // Return part of a string
  108.         //
  109.         // +    discuss at: http://kevin.vanzonneveld.net/techblog/article/javascript_equivalent_for_phps_substr/
  110.         // +       version: 810.819
  111.         // +     original by: Martijn Wieringa
  112.         // +     bugfixed by: T.Wild
  113.         // +      tweaked by: Onno Marsman
  114.         // *       example 1: substr('abcdef', 0, -1);
  115.         // *       returns 1: 'abcde'
  116.         // *       example 2: substr(2, 0, -6);
  117.         // *       returns 2: ''
  118.  
  119.         f_string += '';
  120.  
  121.         if(f_start < 0) {
  122.             f_start += f_string.length;
  123.         }
  124.  
  125.         if (f_length == undefined) {
  126.             f_length = f_string.length;
  127.         } else if (f_length < 0){
  128.             f_length += f_string.length;
  129.         } else {
  130.             f_length += f_start;
  131.         }
  132.  
  133.         if (f_length < f_start) {
  134.             f_length = f_start;
  135.         }
  136.  
  137.         return f_string.substring(f_start, f_length);
  138.     }
  139.  
  140.     function sprintf( ) {
  141.         // Return a formatted string
  142.         //
  143.         // +    discuss at: http://kevin.vanzonneveld.net/techblog/article/javascript_equivalent_for_phps_sprintf/
  144.         // +       version: 810.1015
  145.         // +   original by: Ash Searle (http://hexmen.com/blog/)
  146.         // + namespaced by: Michael White (http://getsprink.com)
  147.         // +    tweaked by: Jack
  148.         // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
  149.         // *     example 1: sprintf("%01.2f", 123.1);
  150.         // *     returns 1: 123.10
  151.  
  152.         var regex = /%%|%(\d+\$)?([-+#0 ]*)(\*\d+\$|\*|\d+)?(\.(\*\d+\$|\*|\d+))?([scboxXuidfegEG])/g;
  153.         var a = arguments, i = 0, format = a[i++];
  154.  
  155.         // pad()
  156.         var pad = function(str, len, chr, leftJustify) {
  157.             var padding = (str.length >= len) ? '' : Array(1 + len - str.length >>> 0).join(chr);
  158.             return leftJustify ? str + padding : padding + str;
  159.         };
  160.  
  161.         // justify()
  162.         var justify = function(value, prefix, leftJustify, minWidth, zeroPad) {
  163.             var diff = minWidth - value.length;
  164.             if (diff > 0) {
  165.                 if (leftJustify || !zeroPad) {
  166.                     value = pad(value, minWidth, ' ', leftJustify);
  167.                 } else {
  168.                     value = value.slice(0, prefix.length) + pad('', diff, '0', true) + value.slice(prefix.length);
  169.                 }
  170.             }
  171.             return value;
  172.         };
  173.  
  174.         // formatBaseX()
  175.         var formatBaseX = function(value, base, prefix, leftJustify, minWidth, precision, zeroPad) {
  176.             // Note: casts negative numbers to positive ones
  177.             var number = value >>> 0;
  178.             prefix = prefix && number && {'2': '0b', '8': '0', '16': '0x'}[base] || '';
  179.             value = prefix + pad(number.toString(base), precision || 0, '0', false);
  180.             return justify(value, prefix, leftJustify, minWidth, zeroPad);
  181.         };
  182.  
  183.         // formatString()
  184.         var formatString = function(value, leftJustify, minWidth, precision, zeroPad) {
  185.             if (precision != null) {
  186.                 value = value.slice(0, precision);
  187.             }
  188.             return justify(value, '', leftJustify, minWidth, zeroPad);
  189.         };
  190.  
  191.         // finalFormat()
  192.         var doFormat = function(substring, valueIndex, flags, minWidth, _, precision, type) {
  193.             if (substring == '%%') return '%';
  194.  
  195.             // parse flags
  196.             var leftJustify = false, positivePrefix = '', zeroPad = false, prefixBaseX = false;
  197.             var flagsl = flags.length;
  198.             for (var j = 0; flags && j < flagsl; j++) switch (flags.charAt(j)) {
  199.                 case ' ': positivePrefix = ' '; break;
  200.                 case '+': positivePrefix = '+'; break;
  201.                 case '-': leftJustify = true; break;
  202.                 case '0': zeroPad = true; break;
  203.                 case '#': prefixBaseX = true; break;
  204.             }
  205.  
  206.             // parameters may be null, undefined, empty-string or real valued
  207.             // we want to ignore null, undefined and empty-string values
  208.             if (!minWidth) {
  209.                 minWidth = 0;
  210.             } else if (minWidth == '*') {
  211.                 minWidth = +a[i++];
  212.             } else if (minWidth.charAt(0) == '*') {
  213.                 minWidth = +a[minWidth.slice(1, -1)];
  214.             } else {
  215.                 minWidth = +minWidth;
  216.             }
  217.  
  218.             // Note: undocumented perl feature:
  219.             if (minWidth < 0) {
  220.                 minWidth = -minWidth;
  221.                 leftJustify = true;
  222.             }
  223.  
  224.             if (!isFinite(minWidth)) {
  225.                 throw new Error('sprintf: (minimum-)width must be finite');
  226.             }
  227.  
  228.             if (!precision) {
  229.                 precision = 'fFeE'.indexOf(type) > -1 ? 6 : (type == 'd') ? 0 : void(0);
  230.             } else if (precision == '*') {
  231.                 precision = +a[i++];
  232.             } else if (precision.charAt(0) == '*') {
  233.                 precision = +a[precision.slice(1, -1)];
  234.             } else {
  235.                 precision = +precision;
  236.             }
  237.  
  238.             // grab value using valueIndex if required?
  239.             var value = valueIndex ? a[valueIndex.slice(0, -1)] : a[i++];
  240.  
  241.             switch (type) {
  242.                 case 's': return formatString(String(value), leftJustify, minWidth, precision, zeroPad);
  243.                 case 'c': return formatString(String.fromCharCode(+value), leftJustify, minWidth, precision, zeroPad);
  244.                 case 'b': return formatBaseX(value, 2, prefixBaseX, leftJustify, minWidth, precision, zeroPad);
  245.                 case 'o': return formatBaseX(value, 8, prefixBaseX, leftJustify, minWidth, precision, zeroPad);
  246.                 case 'x': return formatBaseX(value, 16, prefixBaseX, leftJustify, minWidth, precision, zeroPad);
  247.                 case 'X': return formatBaseX(value, 16, prefixBaseX, leftJustify, minWidth, precision, zeroPad).toUpperCase();
  248.                 case 'u': return formatBaseX(value, 10, prefixBaseX, leftJustify, minWidth, precision, zeroPad);
  249.                 case 'i':
  250.                 case 'd':
  251.                 {
  252.                     var number = parseInt(+value);
  253.                     var prefix = number < 0 ? '-' : positivePrefix;
  254.                     value = prefix + pad(String(Math.abs(number)), precision, '0', false);
  255.                     return justify(value, prefix, leftJustify, minWidth, zeroPad);
  256.                 }
  257.                 case 'e':
  258.                 case 'E':
  259.                 case 'f':
  260.                 case 'F':
  261.                 case 'g':
  262.                 case 'G':
  263.                 {
  264.                     var number = +value;
  265.                     var prefix = number < 0 ? '-' : positivePrefix;
  266.                     var method = ['toExponential', 'toFixed', 'toPrecision']['efg'.indexOf(type.toLowerCase())];
  267.                     var textTransform = ['toString', 'toUpperCase']['eEfFgG'.indexOf(type) % 2];
  268.                     value = prefix + Math.abs(number)[method](precision);
  269.                     return justify(value, prefix, leftJustify, minWidth, zeroPad)[textTransform]();
  270.                 }
  271.                 default: return substring;
  272.             }
  273.         };
  274.  
  275.         return format.replace(regex, doFormat);
  276.     }
  277.  
  278.     function str_split(f_string, f_split_length) {
  279.         // Convert a string to an array
  280.         //
  281.         // +    discuss at: http://kevin.vanzonneveld.net/techblog/article/javascript_equivalent_for_phps_str_split/
  282.         // +       version: 810.621
  283.         // +     original by: Martijn Wieringa
  284.         // +     improved by: Brett Zamir
  285.         // +     bugfixed by: Onno Marsman
  286.         // *         example 1: str_split('Hello Friend', 3);
  287.         // *         returns 1: ['Hel', 'lo ', 'Fri', 'end']
  288.  
  289.         f_string += '';
  290.  
  291.         if (f_split_length == undefined) {
  292.             f_split_length = 1;
  293.         }
  294.         if (f_split_length > 0) {
  295.             var result = [];
  296.             while(f_string.length > f_split_length) {
  297.                 result[result.length] = f_string.substring(0, f_split_length);
  298.                 f_string = f_string.substring(f_split_length);
  299.             }
  300.             result[result.length] = f_string;
  301.             return result;
  302.         }
  303.         return false;
  304.     }
  305.  
  306.     function chr(ascii) {
  307.         // Return a specific character
  308.         //
  309.         // +    discuss at: http://kevin.vanzonneveld.net/techblog/article/javascript_equivalent_for_phps_chr/
  310.         // +       version: 809.522
  311.         // +   original by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
  312.         // *     example 1: chr(75);
  313.         // *     returns 1: 'K'
  314.  
  315.         return String.fromCharCode(ascii);
  316.     }
  317.  
  318.     function ord(string) {
  319.         // Return ASCII value of character
  320.         //
  321.         // +    discuss at: http://kevin.vanzonneveld.net/techblog/article/javascript_equivalent_for_phps_ord/
  322.         // +       version: 810.621
  323.         // +   original by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
  324.         // +   bugfixed by: Onno Marsman
  325.         // *     example 1: ord('K');
  326.         // *     returns 1: 75
  327.  
  328.         return (string+'').charCodeAt(0);
  329.     }
  330.  
  331.     function dechex(number) {
  332.         // Decimal to hexadecimal
  333.         //
  334.         // +    discuss at: http://kevin.vanzonneveld.net/techblog/article/javascript_equivalent_for_phps_dechex/
  335.         // +       version: 810.612
  336.         // +   original by: Philippe Baumann
  337.         // +   bugfixed by: Onno Marsman
  338.         // *     example 1: dechex(10);
  339.         // *     returns 1: 'a'
  340.         // *     example 2: dechex(47);
  341.         // *     returns 2: '2f'
  342.  
  343.         return parseInt(number).toString(16).toUpperCase();
  344.     }
  345.  
  346.     function hexdec(hex_string) {
  347.         // Hexadecimal to decimal
  348.         //
  349.         // +    discuss at: http://kevin.vanzonneveld.net/techblog/article/javascript_equivalent_for_phps_hexdec/
  350.         // +       version: 810.300
  351.         // +   original by: Philippe Baumann
  352.         // *     example 1: hexdec('that');
  353.         // *     returns 1: 10
  354.         // *     example 2: hexdec('a0');
  355.         // *     returns 2: 160
  356.  
  357.         hex_string = (hex_string+'').replace(/[^a-f0-9]/gi, '');
  358.         return parseInt(hex_string, 16);
  359.     }
  360.  
  361.     function sha1(str, is_binary=0) {
  362.         //  discuss at: http://locutus.io/php/sha1/
  363.         // original by: Webtoolkit.info (http://www.webtoolkit.info/)
  364.         // improved by: Michael White (http://getsprink.com)
  365.         // improved by: Kevin van Zonneveld (http://kvz.io)
  366.         // modified by: savan (added parameter to switch between hashing binary or text mode)
  367.         //    input by: Brett Zamir (http://brett-zamir.me)
  368.         //      note 1: Keep in mind that in accordance with PHP, the whole string is buffered and then
  369.         //      note 1: hashed. If available, we'd recommend using Node's native crypto modules directly
  370.         //      note 1: in a steaming fashion for faster and more efficient hashing
  371.         //   example 1: sha1('Kevin van Zonneveld')
  372.         //   returns 1: '54916d2e62f65b3afa6e192e6a601cdbe5cb5897'
  373.  
  374.         var hash
  375.         try {
  376.             var crypto = require('crypto')
  377.             var sha1sum = crypto.createHash('sha1')
  378.             sha1sum.update(str)
  379.             hash = sha1sum.digest('hex')
  380.         } catch (e) {
  381.             hash = undefined
  382.         }
  383.  
  384.         if (hash !== undefined) {
  385.             return hash
  386.         }
  387.  
  388.         var _rotLeft = function (n, s) {
  389.             var t4 = (n << s) | (n >>> (32 - s))
  390.             return t4
  391.         }
  392.  
  393.         var _cvtHex = function (val) {
  394.             var str = ''
  395.             var i
  396.             var v
  397.  
  398.             for (i = 7; i >= 0; i--) {
  399.                 v = (val >>> (i * 4)) & 0x0f
  400.                 str += v.toString(16)
  401.             }
  402.             return str
  403.         }
  404.  
  405.         var blockstart
  406.         var i, j
  407.         var W = new Array(80)
  408.         var H0 = 0x67452301
  409.         var H1 = 0xEFCDAB89
  410.         var H2 = 0x98BADCFE
  411.         var H3 = 0x10325476
  412.         var H4 = 0xC3D2E1F0
  413.         var A, B, C, D, E
  414.         var temp
  415.  
  416.         // utf8_encode
  417.         if (is_binary==0) {
  418.             str = unescape(encodeURIComponent(str))
  419.         }
  420.         var strLen = str.length
  421.  
  422.         var wordArray = []
  423.         for (i = 0; i < strLen - 3; i += 4) {
  424.             j = str.charCodeAt(i) << 24 |
  425.             str.charCodeAt(i + 1) << 16 |
  426.             str.charCodeAt(i + 2) << 8 |
  427.             str.charCodeAt(i + 3)
  428.             wordArray.push(j)
  429.         }
  430.  
  431.         switch (strLen % 4) {
  432.             case 0:
  433.                 i = 0x080000000
  434.                 break
  435.             case 1:
  436.                 i = str.charCodeAt(strLen - 1) << 24 | 0x0800000
  437.                 break
  438.             case 2:
  439.                 i = str.charCodeAt(strLen - 2) << 24 | str.charCodeAt(strLen - 1) << 16 | 0x08000
  440.                 break
  441.             case 3:
  442.                 i = str.charCodeAt(strLen - 3) << 24 | str.charCodeAt(strLen - 2) << 16 | str.charCodeAt(strLen - 1) << 8 | 0x80
  443.                 break
  444.         }
  445.  
  446.         wordArray.push(i)
  447.  
  448.         while ((wordArray.length % 16) !== 14) {
  449.             wordArray.push(0)
  450.         }
  451.  
  452.         wordArray.push(strLen >>> 29)
  453.         wordArray.push((strLen << 3) & 0x0ffffffff)
  454.  
  455.         for (blockstart = 0; blockstart < wordArray.length; blockstart += 16) {
  456.             for (i = 0; i < 16; i++) {
  457.                 W[i] = wordArray[blockstart + i]
  458.             }
  459.             for (i = 16; i <= 79; i++) {
  460.                 W[i] = _rotLeft(W[i - 3] ^ W[i - 8] ^ W[i - 14] ^ W[i - 16], 1)
  461.             }
  462.  
  463.             A = H0
  464.             B = H1
  465.             C = H2
  466.             D = H3
  467.             E = H4
  468.  
  469.             for (i = 0; i <= 19; i++) {
  470.                 temp = (_rotLeft(A, 5) + ((B & C) | (~B & D)) + E + W[i] + 0x5A827999) & 0x0ffffffff
  471.                 E = D
  472.                 D = C
  473.                 C = _rotLeft(B, 30)
  474.                 B = A
  475.                 A = temp
  476.             }
  477.  
  478.             for (i = 20; i <= 39; i++) {
  479.                 temp = (_rotLeft(A, 5) + (B ^ C ^ D) + E + W[i] + 0x6ED9EBA1) & 0x0ffffffff
  480.                 E = D
  481.                 D = C
  482.                 C = _rotLeft(B, 30)
  483.                 B = A
  484.                 A = temp
  485.             }
  486.  
  487.             for (i = 40; i <= 59; i++) {
  488.                 temp = (_rotLeft(A, 5) + ((B & C) | (B & D) | (C & D)) + E + W[i] + 0x8F1BBCDC) & 0x0ffffffff
  489.                 E = D
  490.                 D = C
  491.                 C = _rotLeft(B, 30)
  492.                 B = A
  493.                 A = temp
  494.             }
  495.  
  496.             for (i = 60; i <= 79; i++) {
  497.                 temp = (_rotLeft(A, 5) + (B ^ C ^ D) + E + W[i] + 0xCA62C1D6) & 0x0ffffffff
  498.                 E = D
  499.                 D = C
  500.                 C = _rotLeft(B, 30)
  501.                 B = A
  502.                 A = temp
  503.             }
  504.  
  505.             H0 = (H0 + A) & 0x0ffffffff
  506.             H1 = (H1 + B) & 0x0ffffffff
  507.             H2 = (H2 + C) & 0x0ffffffff
  508.             H3 = (H3 + D) & 0x0ffffffff
  509.             H4 = (H4 + E) & 0x0ffffffff
  510.         }
  511.  
  512.         temp = _cvtHex(H0) + _cvtHex(H1) + _cvtHex(H2) + _cvtHex(H3) + _cvtHex(H4)
  513.         return temp.toLowerCase()
  514.     }
  515.  
  516.     // by savan: all part from here until the end of file is port from oscam and my php cccam protocol code
  517.  
  518.     var keytable = {};
  519.     keytable['client'] = {};
  520.     keytable['client']['table'] = {};
  521.     keytable['client']['state'] = "00";
  522.     keytable['client']['counter'] = 0;
  523.     keytable['client']['sum'] = 0;
  524.     keytable['server'] = {};
  525.     keytable['server']['table'] = {};
  526.     keytable['server']['state'] = "00";
  527.     keytable['server']['counter'] = 0;
  528.     keytable['server']['sum'] = 0;
  529.  
  530.     function hexToStr(hex) {
  531.         var string = "";
  532.  
  533.         for (var i=0; i < strlen(hex)-1; i+=2) {
  534.             string += chr(hexdec(hex[i] + "" + hex[i+1]));
  535.         }
  536.  
  537.         return string;
  538.     }
  539.  
  540.     function strToHex(string) {
  541.         var hex_string = "";
  542.  
  543.         for (var i=0; i < strlen(string); i++) {
  544.             hex_string += sprintf("%02X", ord(string[i]));
  545.         }
  546.  
  547.         return hex_string;
  548.     }
  549.  
  550.     function hexToBin(hexString) {
  551.         var hexLenght = strlen(hexString);
  552.         if (hexLenght % 2 != 0 || hexString.match("/[^\da-fA-F]/")) return hexString;
  553.         else {
  554.             var binString = "";
  555.             for (var x = 1; x <= hexLenght/2; x++) {
  556.                 binString += chr(hexdec(substr(hexString, 2*x-2, 2)));
  557.             }        
  558.             return binString;
  559.         }
  560.     }
  561.  
  562.     function initialize_encryption(sourcetable, keybin, len) {
  563.         var i = 0;
  564.         var j = 0;
  565.  
  566.         var key = {};  
  567.  
  568.         for (i=0; i<len; i++) key[i] = strToHex(substr(keybin, i, 1));
  569.         for (i=0; i<256; i++) keytable[sourcetable]['table'][i] = i;
  570.  
  571.         for (i=0; i<256; i++) {
  572.             j += hexdec(key[i % len]) + keytable[sourcetable]['table'][i];
  573.             j = j & 0xff;
  574.  
  575.             //swap
  576.             var tmp = keytable[sourcetable]['table'][i];
  577.             keytable[sourcetable]['table'][i] = keytable[sourcetable]['table'][j];
  578.             keytable[sourcetable]['table'][j] = tmp;
  579.         }
  580.  
  581.         keytable[sourcetable]['state'] = key[0];
  582.         keytable[sourcetable]['counter'] = 0;
  583.         keytable[sourcetable]['sum'] = 0;
  584.  
  585.         for (i=0; i<256; i++) keytable[sourcetable]['table'][i] = sprintf("%02X", keytable[sourcetable]['table'][i] & 0xff);
  586.     }
  587.  
  588.     function xorr(bufbin) {
  589.         var cccam = str_split("CCcam");
  590.         var buf = {};
  591.         var out = "";
  592.         var i = 0;
  593.  
  594.         for (i=0; i<strlen(bufbin); i++) buf[i] = strToHex(substr(bufbin, i, 1));
  595.  
  596.         for (i=0; i<8; i++) {
  597.             buf[8 + i] = sprintf("%02X", (i * hexdec(buf[i])) & 0xff);
  598.             if (i < 5) buf[i] = sprintf("%02X", ord(hexToBin(buf[i])) ^ ord(cccam[i]));
  599.         }
  600.  
  601.         for (i=0; i<count(buf); i++) out +=  buf[i];
  602.  
  603.         return out;
  604.     }
  605.  
  606.     function encrypt(sourcetable, databin, len) {
  607.         var out = "";
  608.         var i = 0;
  609.         var data = {};
  610.  
  611.         for (i=0; i<len; i++) data[i] = strToHex(substr(databin, i, 1));
  612.  
  613.         for (i=0; i<len; i++) {
  614.             keytable[sourcetable]['counter'] = 0xff & (keytable[sourcetable]['counter']+1);
  615.             keytable[sourcetable]['sum'] += hexdec(keytable[sourcetable]['table'][keytable[sourcetable]['counter']]);
  616.             keytable[sourcetable]['sum'] = keytable[sourcetable]['sum'] & 0xff;
  617.  
  618.             //swap
  619.             var tmp = keytable[sourcetable]['table'][keytable[sourcetable]['counter']];
  620.             keytable[sourcetable]['table'][keytable[sourcetable]['counter']] = keytable[sourcetable]['table'][keytable[sourcetable]['sum']];
  621.             keytable[sourcetable]['table'][keytable[sourcetable]['sum']] = tmp;
  622.  
  623.             var z = data[i];
  624.             data[i] = ord(hexToBin(z)) ^ ord(hexToBin(keytable[sourcetable]['table'][ (hexdec(keytable[sourcetable]['table'][keytable[sourcetable]['counter']]) + hexdec(keytable[sourcetable]['table'][keytable[sourcetable]['sum']])) & 0xff ]));
  625.             data[i] ^= ord(hexToBin(keytable[sourcetable]['state']));
  626.             data[i] = sprintf("%02X", data[i] & 0xff);
  627.             keytable[sourcetable]['state'] = sprintf("%02X", ord(hexToBin(keytable[sourcetable]['state'])) ^ ord(hexToBin(z)));
  628.         }
  629.  
  630.         for (i=0; i<len; i++) out +=  data[i];
  631.  
  632.         return out;
  633.     }
  634.  
  635.     function decrypt(sourcetable, databin, len) {
  636.         var out = "";
  637.         var i = 0;
  638.         var data = {};
  639.  
  640.         for (i=0; i<len; i++) data[i] = strToHex(substr(databin, i, 1));
  641.  
  642.         for (i=0; i<len; i++) {
  643.             keytable[sourcetable]['counter'] = 0xff & (keytable[sourcetable]['counter']+1);
  644.             keytable[sourcetable]['sum'] += hexdec(keytable[sourcetable]['table'][keytable[sourcetable]['counter']]);
  645.             keytable[sourcetable]['sum'] = keytable[sourcetable]['sum'] & 0xff;
  646.  
  647.             //swap
  648.             var tmp = keytable[sourcetable]['table'][keytable[sourcetable]['counter']];
  649.             keytable[sourcetable]['table'][keytable[sourcetable]['counter']] = keytable[sourcetable]['table'][keytable[sourcetable]['sum']];
  650.             keytable[sourcetable]['table'][keytable[sourcetable]['sum']] = tmp;
  651.  
  652.             var z = data[i];
  653.             data[i] = ord(hexToBin(z)) ^ ord(hexToBin(keytable[sourcetable]['table'][ (hexdec(keytable[sourcetable]['table'][keytable[sourcetable]['counter']]) + hexdec(keytable[sourcetable]['table'][keytable[sourcetable]['sum']])) & 0xff ]));
  654.             data[i] ^= ord(hexToBin(keytable[sourcetable]['state']));
  655.             data[i] = sprintf("%02X", data[i] & 0xff);
  656.             z = data[i];
  657.             keytable[sourcetable]['state'] = sprintf("%02X", ord(hexToBin(keytable[sourcetable]['state'])) ^ ord(hexToBin(z)));
  658.         }
  659.  
  660.         for (i=0; i<len; i++) out +=  data[i];
  661.  
  662.         return out;
  663.     }
  664.  
  665.     function cc_crypt_cw(nodeid, card_id, cws) {
  666.         var n = 0;
  667.         var nod = {};
  668.         var i=0;
  669.  
  670.         for(i=0; i<8; i++) nod[i] = nodeid[7-i];
  671.         for (i=0; i<16; i++) {
  672.             if (i & 1) {
  673.                 if (i != 15) n = (nod[i>>1]>>4) | (nod[(i>>1)+1]<<4);
  674.                 else n = nod[i>>1]>>4;
  675.             } else {
  676.                 n = nod[i>>1];
  677.             }
  678.             n = n & 0xff;
  679.             var tmp = cws[i] ^ n;
  680.             if (i & 1) tmp = ~tmp;
  681.             cws[i] = dechex(((card_id >> (2 * i)) ^ tmp) & 0xff);
  682.         }
  683.         return cws;
  684.     }
  685. </script>
  686. </head>
  687. <body>
  688. <script type='text/javascript'>
  689.     /**
  690.      * got seed from server: 61E26A37037920BF4881CE23ACDC5819
  691.      * Checksum of connection packet is valid.
  692.      * seed xor = 22A109566E7920BF00E2D4A50C5DC039
  693.      * Using this encryption key: DB6C27ABEC0CFCAAF3C7CB3FCEE0609DF3DA787A
  694.      * decrypt = 534F94D4037D54C03D06FE1AC56035C9
  695.      * decrypt hash = 81A3506833762E4929646A8BD6A264023420919A
  696.      * encrypt hash = 8CF20A81EAF066994F3872C6267D013B82644F94
  697.      * user = exampleuser
  698.      * password = 57961D2F13521DDABED3B0B0E98D6E
  699.      * cccam = 95C4384FAE6E
  700.      **/
  701.  
  702.     // changeable variables
  703.     var USER = "exampleuser";
  704.     var PASSWORD = "examplepassword";
  705.     var REMOTECCCAMHOST = "example.dyndns.org";
  706.     var REMOTECCCAMPORT = 1234;
  707.  
  708.     // variables
  709.     var data = "";
  710.     var enc_key = "";
  711.     var decrypt_seed = "";
  712.     var decrypt_hash = "";
  713.     var encrypt_hash = "";
  714.     var username = {};
  715.     var user = "";
  716.     var userenc = "";
  717.     var password = "";
  718.     var cccam = "";
  719.  
  720.     var example_seed_received_from_first_cccam_packet = "61E26A37037920BF4881CE23ACDC5819";
  721.  
  722.     document.write("got seed from server: " + example_seed_received_from_first_cccam_packet + "<br />\n");
  723.     data = hexToBin(example_seed_received_from_first_cccam_packet);
  724.     data = xorr(data);
  725.     document.write("seed xor = " + data + "<br />\n");
  726.  
  727.     data = hexToBin(data);
  728.     enc_key = sha1(data, 1).toUpperCase();
  729.     document.write("Using this encryption key: " + enc_key + "<br />\n");
  730.  
  731.     enc_key = hexToBin(enc_key);
  732.     initialize_encryption('client', enc_key, strlen(enc_key));
  733.     decrypt_seed = decrypt('client', data, strlen(data));
  734.     document.write("decrypt = " + decrypt_seed + "<br />\n");
  735.  
  736.     // copy table
  737.     keytable['server'] = keytable['client'];
  738.  
  739.     decrypt_seed = hexToBin(decrypt_seed);
  740.     initialize_encryption('client', decrypt_seed, strlen(decrypt_seed));
  741.     decrypt_hash = decrypt('client', enc_key, strlen(enc_key));
  742.     document.write("decrypt hash = " + decrypt_hash + "<br />\n");
  743.  
  744.     decrypt_hash = hexToBin(decrypt_hash);
  745.     encrypt_hash = encrypt('client', decrypt_hash, strlen(decrypt_hash));
  746.     document.write("encrypt hash = " + encrypt_hash + "<br />\n");
  747.  
  748.     encrypt_hash = hexToBin(encrypt_hash);
  749.  
  750.     for (i=0; i<20; i++) username[i] = "00";
  751.     for (i=0; i<strlen(USER); i++) username[i] = strToHex(substr(USER, i, 1));
  752.     for (i=0; i<20; i++) user += username[i];
  753.     user = hexToBin(user);
  754.     userenc = encrypt('client', user, strlen(user));
  755.     document.write("user = " + user + "<br />\n");
  756.  
  757.     userenc = hexToBin(userenc);
  758.     password = encrypt('client', PASSWORD, strlen(PASSWORD));
  759.     document.write("password = " + password + "<br />\n");
  760.  
  761.     password = hexToBin(password);
  762.     cccam = encrypt('client', "CCcam" + "\x00", 6);
  763.     document.write("cccam = " + cccam + "<br />\n");
  764.  
  765.     cccam = hexToBin(cccam);
  766.  
  767. </script>
  768. </body>
  769. </html>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement