Advertisement
Guest User

Untitled

a guest
Mar 28th, 2014
103
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /*
  2.     NXT address class, simple version (check only).
  3.  
  4.     Version: 1.0, license: Public Domain, coder: NxtChg (admin@nxtchg.com).
  5. */
  6.  
  7. function NxtAddress()
  8. {
  9.         var codeword = [1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];
  10.         var syndrome = [0,0,0,0,0];
  11.  
  12.         var gexp = [ 1, 2, 4, 8, 16, 5, 10, 20, 13, 26, 17, 7, 14, 28, 29, 31, 27, 19, 3, 6, 12, 24, 21, 15, 30, 25, 23, 11, 22, 9, 18, 1 ];
  13.         var glog = [ 0, 0, 1, 18, 2, 5, 19, 11, 3, 29, 6, 27, 20, 8, 12, 23, 4, 10, 30, 17, 7, 22, 28, 26, 21, 25, 9, 16, 13, 14, 24, 15 ];
  14.  
  15.         var cwmap = [ 3, 2, 1, 0, 7, 6, 5, 4, 13, 14, 15, 16, 12, 8, 9, 10, 11 ];
  16.  
  17.         var alphabet = '23456789ABCDEFGHJKLMNPQRSTUVWXYZ';
  18.         //var alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ345679';
  19.  
  20.         function gmult(a, b)
  21.         {
  22.                 if(a == 0 || b == 0) return 0;
  23.        
  24.                 var idx = (glog[a] + glog[b]) % 31;
  25.        
  26.                 return gexp[idx];
  27.         }//__________________________
  28.  
  29.         function encode()
  30.         {
  31.                 var p = [0,0,0,0];
  32.                
  33.                 for(var i = 12; i >= 0; i--)
  34.                 {
  35.                         var fb = codeword[i] ^ p[3];
  36.        
  37.                         p[3] = p[2] ^ gmult(30, fb);
  38.                         p[2] = p[1] ^ gmult( 6, fb);
  39.                         p[1] = p[0] ^ gmult( 9, fb);
  40.                         p[0] =        gmult(17, fb);
  41.                 }
  42.        
  43.                 codeword[13] = p[0]; codeword[14] = p[1];
  44.                 codeword[15] = p[2]; codeword[16] = p[3];
  45.         }//__________________________
  46.  
  47.         function reset()
  48.         {
  49.                 for(var i = 0; i < 17; i++) codeword[i] = 0;
  50.                
  51.                 codeword[0] = 1;
  52.         }
  53.  
  54.         this.ok = function()
  55.         {
  56.                 var sum = 0;
  57.        
  58.                 for(var i = 1; i < 5; i++)
  59.                 {
  60.                         for(var j = 0, t = 0; j < 31; j++)
  61.                         {
  62.                     if(j > 12 && j < 27) continue;
  63.        
  64.                                 pos = j; if(j > 26) pos -= 14;
  65.        
  66.                                 t ^= gmult(codeword[pos], gexp[(i*j)%31]);
  67.                         }
  68.        
  69.                         sum |= t; syndrome[i] = t;
  70.                 }
  71.        
  72.                 return (sum == 0);
  73.         }//__________________________
  74.  
  75.         function from_acc(acc)
  76.         {
  77.                 var inp = [], out = [], pos = 0, len = acc.length;
  78.        
  79.                 if(len == 20 && acc.charAt(0) != '1') return false;
  80.  
  81.                 for(var i = 0; i < len; i++)
  82.                 {
  83.                         inp[i] = acc.charCodeAt(i) - '0'.charCodeAt(0);
  84.                 }
  85.        
  86.                 do // base 10 to base 32 conversion
  87.                 {
  88.                         var divide = 0, newlen = 0;
  89.        
  90.                         for(i = 0; i < len; i++)
  91.                         {
  92.                                 divide = divide * 10 + inp[i];
  93.        
  94.                                 if(divide >= 32)
  95.                                 {
  96.                                         inp[newlen++] = divide >> 5; divide &= 31;
  97.                                 }
  98.                                 else if(newlen > 0)
  99.                                 {
  100.                                         inp[newlen++] = 0;
  101.                                 }
  102.                         }
  103.        
  104.                         len = newlen; out[pos++] = divide;
  105.                 }
  106.                 while(newlen);
  107.        
  108.                 for(i = 0; i < 13; i++) // copy to codeword in reverse, pad with 0's
  109.                 {
  110.                         codeword[i] = (--pos >= 0 ? out[i] : 0);
  111.                 }
  112.        
  113.                 encode();
  114.        
  115.                 return true;
  116.         }//__________________________
  117.  
  118.         this.toString = function(prefix)
  119.         {
  120.                 var out = (prefix ? 'NXT-' : '');
  121.        
  122.                 for(var i = 0; i < 17; i++)
  123.                 {
  124.                         out += alphabet[codeword[cwmap[i]]];
  125.        
  126.                         if((i & 3) == 3 && i < 13) out += '-';
  127.                 }
  128.        
  129.                 return out;
  130.         }//__________________________
  131.  
  132.         this.account_id = function()
  133.         {
  134.                 var out = '', inp = [], len = 13;
  135.        
  136.                 for(var i = 0; i < 13; i++)
  137.                 {
  138.                         inp[i] = codeword[12-i];
  139.                 }
  140.        
  141.                 do // base 32 to base 10 conversion
  142.                 {
  143.                         var divide = 0, newlen = 0;
  144.        
  145.                         for(i = 0; i < len; i++)
  146.                         {
  147.                                 divide = divide * 32 + inp[i];
  148.        
  149.                                 if(divide >= 10)
  150.                                 {
  151.                                         inp[newlen++] = Math.floor(divide / 10); divide %= 10;
  152.                                 }
  153.                                 else if(newlen > 0)
  154.                                 {
  155.                                         inp[newlen++] = 0;
  156.                                 }
  157.                         }
  158.        
  159.                         len = newlen; out += String.fromCharCode(divide + '0'.charCodeAt(0));
  160.                 }
  161.                 while(newlen);
  162.        
  163.                 return out.split("").reverse().join("");
  164.         }//__________________________
  165.  
  166.         this.set = function(adr, allow_accounts)
  167.         {
  168.                 if(typeof allow_accounts === 'undefined') allow_accounts = true;
  169.        
  170.                 var len = 0; reset();
  171.        
  172.                 adr = adr.replace(/(^\s+)|(\s+$)/g, '').toUpperCase();
  173.        
  174.                 if(adr.indexOf('NXT-') == 0) adr = adr.substr(4);
  175.        
  176.                 if(adr.match(/^\d{6,20}$/g)) // account id
  177.                 {
  178.                         if(allow_accounts) return from_acc(adr);
  179.                 }
  180.                 else // address
  181.                 {
  182.                         for(var i = 0; i < adr.length; i++)
  183.                         {
  184.                                 var pos = alphabet.indexOf(adr[i]);
  185.                                
  186.                                 if(pos >= 0)
  187.                                 {
  188.                                         if(len > 16) return false;
  189.                
  190.                                         codeword[cwmap[len++]] = pos;
  191.                                 }
  192.                         }
  193.                 }
  194.  
  195.                 return (len == 17 ? this.ok() : false);
  196.         }
  197. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement