github.com/piotrnar/gocoin@v0.0.0-20240512203912-faa0448c5e96/client/www/resources/crypto.js (about)

     1  /**
     2   * [js-sha256]{@link https://github.com/emn178/js-sha256}
     3   *
     4   * @version 0.6.0
     5   * @author Chen, Yi-Cyuan [emn178@gmail.com]
     6   * @copyright Chen, Yi-Cyuan 2014-2017
     7   * @license MIT
     8   */
     9  /*jslint bitwise: true */
    10  function ROL(t, r) {
    11      return new Number(t << r | t >>> 32 - r)
    12  }
    13  
    14  function F(t, r, e) {
    15      return new Number(t ^ r ^ e)
    16  }
    17  
    18  function G(t, r, e) {
    19      return new Number(t & r | ~t & e)
    20  }
    21  
    22  function H(t, r, e) {
    23      return new Number((t | ~r) ^ e)
    24  }
    25  
    26  function I(t, r, e) {
    27      return new Number(t & e | r & ~e)
    28  }
    29  
    30  function J(t, r, e) {
    31      return new Number(t ^ (r | ~e))
    32  }
    33  
    34  function mixOneRound(t, r, e, i, h, s, n, o) {
    35      switch (o) {
    36          case 0:
    37              t += F(r, e, i) + s + 0;
    38              break;
    39          case 1:
    40              t += G(r, e, i) + s + 1518500249;
    41              break;
    42          case 2:
    43              t += H(r, e, i) + s + 1859775393;
    44              break;
    45          case 3:
    46              t += I(r, e, i) + s + 2400959708;
    47              break;
    48          case 4:
    49              t += J(r, e, i) + s + 2840853838;
    50              break;
    51          case 5:
    52              t += J(r, e, i) + s + 1352829926;
    53              break;
    54          case 6:
    55              t += I(r, e, i) + s + 1548603684;
    56              break;
    57          case 7:
    58              t += H(r, e, i) + s + 1836072691;
    59              break;
    60          case 8:
    61              t += G(r, e, i) + s + 2053994217;
    62              break;
    63          case 9:
    64              t += F(r, e, i) + s + 0;
    65              break;
    66          default:
    67              document.write("Bogus round number")
    68      }
    69      t = ROL(t, n) + h, e = ROL(e, 10), t &= 4294967295, r &= 4294967295, e &= 4294967295, i &= 4294967295, h &= 4294967295;
    70      var a = new Array;
    71      return a[0] = t, a[1] = r, a[2] = e, a[3] = i, a[4] = h, a[5] = s, a[6] = n, a
    72  }
    73  
    74  function MDinit(t) {
    75      t[0] = 1732584193, t[1] = 4023233417, t[2] = 2562383102, t[3] = 271733878, t[4] = 3285377520
    76  }
    77  
    78  function compress(t, r) {
    79      blockA = new Array, blockB = new Array;
    80      for (var e, i = 0; i < 5; i++) blockA[i] = new Number(t[i]), blockB[i] = new Number(t[i]);
    81      for (var h = 0, s = 0; s < 5; s++)
    82          for (i = 0; i < 16; i++) e = mixOneRound(blockA[(h + 0) % 5], blockA[(h + 1) % 5], blockA[(h + 2) % 5], blockA[(h + 3) % 5], blockA[(h + 4) % 5], r[indexes[s][i]], ROLs[s][i], s), blockA[(h + 0) % 5] = e[0], blockA[(h + 1) % 5] = e[1], blockA[(h + 2) % 5] = e[2], blockA[(h + 3) % 5] = e[3], blockA[(h + 4) % 5] = e[4], h += 4;
    83      h = 0;
    84      for (s = 5; s < 10; s++)
    85          for (i = 0; i < 16; i++) e = mixOneRound(blockB[(h + 0) % 5], blockB[(h + 1) % 5], blockB[(h + 2) % 5], blockB[(h + 3) % 5], blockB[(h + 4) % 5], r[indexes[s][i]], ROLs[s][i], s), blockB[(h + 0) % 5] = e[0], blockB[(h + 1) % 5] = e[1], blockB[(h + 2) % 5] = e[2], blockB[(h + 3) % 5] = e[3], blockB[(h + 4) % 5] = e[4], h += 4;
    86      blockB[3] += blockA[2] + t[1], t[1] = t[2] + blockA[3] + blockB[4], t[2] = t[3] + blockA[4] + blockB[0], t[3] = t[4] + blockA[0] + blockB[1], t[4] = t[0] + blockA[1] + blockB[2], t[0] = blockB[3]
    87  }
    88  
    89  function zeroX(t) {
    90      for (var r = 0; r < 16; r++) t[r] = 0
    91  }
    92  
    93  function MDfinish(t, r, e, i) {
    94      var h = new Array(16);
    95      zeroX(h);
    96      for (var s = 0, n = 0; n < (63 & e); n++) h[n >>> 2] ^= (255 & r[s++]) << 8 * (3 & n);
    97      h[e >>> 2 & 15] ^= 1 << 8 * (3 & e) + 7, (63 & e) > 55 && (compress(t, h), zeroX(h = new Array(16))), h[14] = e << 3, h[15] = e >>> 29 | i << 3, compress(t, h)
    98  }
    99  
   100  function BYTES_TO_DWORD(t) {
   101      var r = (255 & t.charCodeAt(3)) << 24;
   102      return r |= (255 & t.charCodeAt(2)) << 16, r |= (255 & t.charCodeAt(1)) << 8, r |= 255 & t.charCodeAt(0)
   103  }
   104  
   105  function RMD(t) {
   106      var r, e = new Array(RMDsize / 32),
   107          i = new Array(RMDsize / 8);
   108      MDinit(e), r = t.length;
   109      var h = new Array(16);
   110      zeroX(h);
   111      for (var s = 0, n = r; n > 63; n -= 64) {
   112          for (o = 0; o < 16; o++) h[o] = BYTES_TO_DWORD(t.slice(s, s + 4)), s += 4;
   113          compress(e, h)
   114      }
   115      MDfinish(e, t.slice(s, r), r, 0);
   116      for (var o = 0; o < RMDsize / 8; o += 4) i[o] = 255 & e[o >>> 2], i[o + 1] = e[o >>> 2] >>> 8 & 255, i[o + 2] = e[o >>> 2] >>> 16 & 255, i[o + 3] = e[o >>> 2] >>> 24 & 255;
   117      return i
   118  }
   119  
   120  function p2kh_to_witness_p2sh(t) {
   121      var r = Base58.decode(t);
   122      if (25 != r.length || (0 != r[0] && 111 != r[0])) return "";
   123      var e = new Uint8Array(22);
   124      e[0] = 0, e[1] = 20;
   125      for (s = 0; s < 20; s++) e[2 + s] = r[1 + s];
   126      var i = RMD(sha256.update(e).array()),
   127          h = new Uint8Array(25);
   128      h[0] = 5;
   129      for (var s = 0; s < 20; s++) h[1 + s] = i[s];
   130      var n = sha256.update(sha256.update(h.slice(0, 21)).array()).array();
   131      return h[21] = n[0], h[22] = n[1], h[23] = n[2], h[24] = n[3], Base58.encode(h)
   132  }! function() {
   133      "use strict";
   134  
   135      function t(t, r) {
   136          r ? (d[0] = d[16] = d[1] = d[2] = d[3] = d[4] = d[5] = d[6] = d[7] = d[8] = d[9] = d[10] = d[11] = d[12] = d[13] = d[14] = d[15] = 0, this.blocks = d) : this.blocks = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], t ? (this.h0 = 3238371032, this.h1 = 914150663, this.h2 = 812702999, this.h3 = 4144912697, this.h4 = 4290775857, this.h5 = 1750603025, this.h6 = 1694076839, this.h7 = 3204075428) : (this.h0 = 1779033703, this.h1 = 3144134277, this.h2 = 1013904242, this.h3 = 2773480762, this.h4 = 1359893119, this.h5 = 2600822924, this.h6 = 528734635, this.h7 = 1541459225), this.block = this.start = this.bytes = 0, this.finalized = this.hashed = !1, this.first = !0, this.is224 = t
   137      }
   138  
   139      function r(r, h, s) {
   140          var n = "string" != typeof r;
   141          if (n) {
   142              if (null === r || void 0 === r) throw e;
   143              r.constructor === i.ArrayBuffer && (r = new Uint8Array(r))
   144          }
   145          f = r.length;
   146          if (n) {
   147              if ("number" != typeof f || !Array.isArray(r) && (!o || !ArrayBuffer.isView(r))) throw e
   148          } else {
   149              for (var a, c = [], f = r.length, u = 0, l = 0; l < f; ++l)(a = r.charCodeAt(l)) < 128 ? c[u++] = a : a < 2048 ? (c[u++] = 192 | a >> 6, c[u++] = 128 | 63 & a) : a < 55296 || a >= 57344 ? (c[u++] = 224 | a >> 12, c[u++] = 128 | a >> 6 & 63, c[u++] = 128 | 63 & a) : (a = 65536 + ((1023 & a) << 10 | 1023 & r.charCodeAt(++l)), c[u++] = 240 | a >> 18, c[u++] = 128 | a >> 12 & 63, c[u++] = 128 | a >> 6 & 63, c[u++] = 128 | 63 & a);
   150              r = c
   151          }
   152          r.length > 64 && (r = new t(h, !0).update(r).array());
   153          for (var d = [], y = [], l = 0; l < 64; ++l) {
   154              var p = r[l] || 0;
   155              d[l] = 92 ^ p, y[l] = 54 ^ p
   156          }
   157          t.call(this, h, s), this.update(y), this.oKeyPad = d, this.inner = !0, this.sharedMemory = s
   158      }
   159      var e = "input is invalid type",
   160          i = "object" == typeof window ? window : {},
   161          h = !i.JS_SHA256_NO_NODE_JS && "object" == typeof process && process.versions && process.versions.node;
   162      h && (i = global);
   163      var s = !i.JS_SHA256_NO_COMMON_JS && "object" == typeof module && module.exports,
   164          n = "function" == typeof define && define.amd,
   165          o = "undefined" != typeof ArrayBuffer,
   166          a = "0123456789abcdef".split(""),
   167          c = [-2147483648, 8388608, 32768, 128],
   168          f = [24, 16, 8, 0],
   169          u = [1116352408, 1899447441, 3049323471, 3921009573, 961987163, 1508970993, 2453635748, 2870763221, 3624381080, 310598401, 607225278, 1426881987, 1925078388, 2162078206, 2614888103, 3248222580, 3835390401, 4022224774, 264347078, 604807628, 770255983, 1249150122, 1555081692, 1996064986, 2554220882, 2821834349, 2952996808, 3210313671, 3336571891, 3584528711, 113926993, 338241895, 666307205, 773529912, 1294757372, 1396182291, 1695183700, 1986661051, 2177026350, 2456956037, 2730485921, 2820302411, 3259730800, 3345764771, 3516065817, 3600352804, 4094571909, 275423344, 430227734, 506948616, 659060556, 883997877, 958139571, 1322822218, 1537002063, 1747873779, 1955562222, 2024104815, 2227730452, 2361852424, 2428436474, 2756734187, 3204031479, 3329325298],
   170          l = ["hex", "array", "digest", "arrayBuffer"],
   171          d = [];
   172      !i.JS_SHA256_NO_NODE_JS && Array.isArray || (Array.isArray = function(t) {
   173          return "[object Array]" === Object.prototype.toString.call(t)
   174      });
   175      var y = function(r, e) {
   176              return function(i) {
   177                  return new t(e, !0).update(i)[r]()
   178              }
   179          },
   180          p = function(r) {
   181              var e = y("hex", r);
   182              h && (e = b(e, r)), e.create = function() {
   183                  return new t(r)
   184              }, e.update = function(t) {
   185                  return e.create().update(t)
   186              };
   187              for (var i = 0; i < l.length; ++i) {
   188                  var s = l[i];
   189                  e[s] = y(s, r)
   190              }
   191              return e
   192          },
   193          b = function(t, r) {
   194              var i = require("crypto"),
   195                  h = require("buffer").Buffer,
   196                  s = r ? "sha224" : "sha256";
   197              return function(r) {
   198                  if ("string" == typeof r) return i.createHash(s).update(r, "utf8").digest("hex");
   199                  if (null === r || void 0 === r) throw e;
   200                  return r.constructor === ArrayBuffer && (r = new Uint8Array(r)), Array.isArray(r) || ArrayBuffer.isView(r) || r.constructor === h ? i.createHash(s).update(new h(r)).digest("hex") : t(r)
   201              }
   202          },
   203          A = function(t, e) {
   204              return function(i, h) {
   205                  return new r(i, e, !0).update(h)[t]()
   206              }
   207          },
   208          k = function(t) {
   209              var e = A("hex", t);
   210              e.create = function(e) {
   211                  return new r(e, t)
   212              }, e.update = function(t, r) {
   213                  return e.create(t).update(r)
   214              };
   215              for (var i = 0; i < l.length; ++i) {
   216                  var h = l[i];
   217                  e[h] = A(h, t)
   218              }
   219              return e
   220          };
   221      t.prototype.update = function(t) {
   222          if (!this.finalized) {
   223              var r = "string" != typeof t;
   224              if (r) {
   225                  if (null === t || void 0 === t) throw e;
   226                  t.constructor === i.ArrayBuffer && (t = new Uint8Array(t))
   227              }
   228              var h = t.length;
   229              if (r && ("number" != typeof h || !Array.isArray(t) && (!o || !ArrayBuffer.isView(t)))) throw e;
   230              for (var s, n, a = 0, c = this.blocks; a < h;) {
   231                  if (this.hashed && (this.hashed = !1, c[0] = this.block, c[16] = c[1] = c[2] = c[3] = c[4] = c[5] = c[6] = c[7] = c[8] = c[9] = c[10] = c[11] = c[12] = c[13] = c[14] = c[15] = 0), r)
   232                      for (n = this.start; a < h && n < 64; ++a) c[n >> 2] |= t[a] << f[3 & n++];
   233                  else
   234                      for (n = this.start; a < h && n < 64; ++a)(s = t.charCodeAt(a)) < 128 ? c[n >> 2] |= s << f[3 & n++] : s < 2048 ? (c[n >> 2] |= (192 | s >> 6) << f[3 & n++], c[n >> 2] |= (128 | 63 & s) << f[3 & n++]) : s < 55296 || s >= 57344 ? (c[n >> 2] |= (224 | s >> 12) << f[3 & n++], c[n >> 2] |= (128 | s >> 6 & 63) << f[3 & n++], c[n >> 2] |= (128 | 63 & s) << f[3 & n++]) : (s = 65536 + ((1023 & s) << 10 | 1023 & t.charCodeAt(++a)), c[n >> 2] |= (240 | s >> 18) << f[3 & n++], c[n >> 2] |= (128 | s >> 12 & 63) << f[3 & n++], c[n >> 2] |= (128 | s >> 6 & 63) << f[3 & n++], c[n >> 2] |= (128 | 63 & s) << f[3 & n++]);
   235                  this.lastByteIndex = n, this.bytes += n - this.start, n >= 64 ? (this.block = c[16], this.start = n - 64, this.hash(), this.hashed = !0) : this.start = n
   236              }
   237              return this
   238          }
   239      }, t.prototype.finalize = function() {
   240          if (!this.finalized) {
   241              this.finalized = !0;
   242              var t = this.blocks,
   243                  r = this.lastByteIndex;
   244              t[16] = this.block, t[r >> 2] |= c[3 & r], this.block = t[16], r >= 56 && (this.hashed || this.hash(), t[0] = this.block, t[16] = t[1] = t[2] = t[3] = t[4] = t[5] = t[6] = t[7] = t[8] = t[9] = t[10] = t[11] = t[12] = t[13] = t[14] = t[15] = 0), t[15] = this.bytes << 3, this.hash()
   245          }
   246      }, t.prototype.hash = function() {
   247          var t, r, e, i, h, s, n, o, a, c = this.h0,
   248              f = this.h1,
   249              l = this.h2,
   250              d = this.h3,
   251              y = this.h4,
   252              p = this.h5,
   253              b = this.h6,
   254              A = this.h7,
   255              k = this.blocks;
   256          for (t = 16; t < 64; ++t) r = ((h = k[t - 15]) >>> 7 | h << 25) ^ (h >>> 18 | h << 14) ^ h >>> 3, e = ((h = k[t - 2]) >>> 17 | h << 15) ^ (h >>> 19 | h << 13) ^ h >>> 10, k[t] = k[t - 16] + r + k[t - 7] + e << 0;
   257          for (a = f & l, t = 0; t < 64; t += 4) this.first ? (this.is224 ? (s = 300032, A = (h = k[0] - 1413257819) - 150054599 << 0, d = h + 24177077 << 0) : (s = 704751109, A = (h = k[0] - 210244248) - 1521486534 << 0, d = h + 143694565 << 0), this.first = !1) : (r = (c >>> 2 | c << 30) ^ (c >>> 13 | c << 19) ^ (c >>> 22 | c << 10), i = (s = c & f) ^ c & l ^ a, A = d + (h = A + (e = (y >>> 6 | y << 26) ^ (y >>> 11 | y << 21) ^ (y >>> 25 | y << 7)) + (y & p ^ ~y & b) + u[t] + k[t]) << 0, d = h + (r + i) << 0), r = (d >>> 2 | d << 30) ^ (d >>> 13 | d << 19) ^ (d >>> 22 | d << 10), i = (n = d & c) ^ d & f ^ s, b = l + (h = b + (e = (A >>> 6 | A << 26) ^ (A >>> 11 | A << 21) ^ (A >>> 25 | A << 7)) + (A & y ^ ~A & p) + u[t + 1] + k[t + 1]) << 0, r = ((l = h + (r + i) << 0) >>> 2 | l << 30) ^ (l >>> 13 | l << 19) ^ (l >>> 22 | l << 10), i = (o = l & d) ^ l & c ^ n, p = f + (h = p + (e = (b >>> 6 | b << 26) ^ (b >>> 11 | b << 21) ^ (b >>> 25 | b << 7)) + (b & A ^ ~b & y) + u[t + 2] + k[t + 2]) << 0, r = ((f = h + (r + i) << 0) >>> 2 | f << 30) ^ (f >>> 13 | f << 19) ^ (f >>> 22 | f << 10), i = (a = f & l) ^ f & d ^ o, y = c + (h = y + (e = (p >>> 6 | p << 26) ^ (p >>> 11 | p << 21) ^ (p >>> 25 | p << 7)) + (p & b ^ ~p & A) + u[t + 3] + k[t + 3]) << 0, c = h + (r + i) << 0;
   258          this.h0 = this.h0 + c << 0, this.h1 = this.h1 + f << 0, this.h2 = this.h2 + l << 0, this.h3 = this.h3 + d << 0, this.h4 = this.h4 + y << 0, this.h5 = this.h5 + p << 0, this.h6 = this.h6 + b << 0, this.h7 = this.h7 + A << 0
   259      }, t.prototype.hex = function() {
   260          this.finalize();
   261          var t = this.h0,
   262              r = this.h1,
   263              e = this.h2,
   264              i = this.h3,
   265              h = this.h4,
   266              s = this.h5,
   267              n = this.h6,
   268              o = this.h7,
   269              c = a[t >> 28 & 15] + a[t >> 24 & 15] + a[t >> 20 & 15] + a[t >> 16 & 15] + a[t >> 12 & 15] + a[t >> 8 & 15] + a[t >> 4 & 15] + a[15 & t] + a[r >> 28 & 15] + a[r >> 24 & 15] + a[r >> 20 & 15] + a[r >> 16 & 15] + a[r >> 12 & 15] + a[r >> 8 & 15] + a[r >> 4 & 15] + a[15 & r] + a[e >> 28 & 15] + a[e >> 24 & 15] + a[e >> 20 & 15] + a[e >> 16 & 15] + a[e >> 12 & 15] + a[e >> 8 & 15] + a[e >> 4 & 15] + a[15 & e] + a[i >> 28 & 15] + a[i >> 24 & 15] + a[i >> 20 & 15] + a[i >> 16 & 15] + a[i >> 12 & 15] + a[i >> 8 & 15] + a[i >> 4 & 15] + a[15 & i] + a[h >> 28 & 15] + a[h >> 24 & 15] + a[h >> 20 & 15] + a[h >> 16 & 15] + a[h >> 12 & 15] + a[h >> 8 & 15] + a[h >> 4 & 15] + a[15 & h] + a[s >> 28 & 15] + a[s >> 24 & 15] + a[s >> 20 & 15] + a[s >> 16 & 15] + a[s >> 12 & 15] + a[s >> 8 & 15] + a[s >> 4 & 15] + a[15 & s] + a[n >> 28 & 15] + a[n >> 24 & 15] + a[n >> 20 & 15] + a[n >> 16 & 15] + a[n >> 12 & 15] + a[n >> 8 & 15] + a[n >> 4 & 15] + a[15 & n];
   270          return this.is224 || (c += a[o >> 28 & 15] + a[o >> 24 & 15] + a[o >> 20 & 15] + a[o >> 16 & 15] + a[o >> 12 & 15] + a[o >> 8 & 15] + a[o >> 4 & 15] + a[15 & o]), c
   271      }, t.prototype.toString = t.prototype.hex, t.prototype.digest = function() {
   272          this.finalize();
   273          var t = this.h0,
   274              r = this.h1,
   275              e = this.h2,
   276              i = this.h3,
   277              h = this.h4,
   278              s = this.h5,
   279              n = this.h6,
   280              o = this.h7,
   281              a = [t >> 24 & 255, t >> 16 & 255, t >> 8 & 255, 255 & t, r >> 24 & 255, r >> 16 & 255, r >> 8 & 255, 255 & r, e >> 24 & 255, e >> 16 & 255, e >> 8 & 255, 255 & e, i >> 24 & 255, i >> 16 & 255, i >> 8 & 255, 255 & i, h >> 24 & 255, h >> 16 & 255, h >> 8 & 255, 255 & h, s >> 24 & 255, s >> 16 & 255, s >> 8 & 255, 255 & s, n >> 24 & 255, n >> 16 & 255, n >> 8 & 255, 255 & n];
   282          return this.is224 || a.push(o >> 24 & 255, o >> 16 & 255, o >> 8 & 255, 255 & o), a
   283      }, t.prototype.array = t.prototype.digest, t.prototype.arrayBuffer = function() {
   284          this.finalize();
   285          var t = new ArrayBuffer(this.is224 ? 28 : 32),
   286              r = new DataView(t);
   287          return r.setUint32(0, this.h0), r.setUint32(4, this.h1), r.setUint32(8, this.h2), r.setUint32(12, this.h3), r.setUint32(16, this.h4), r.setUint32(20, this.h5), r.setUint32(24, this.h6), this.is224 || r.setUint32(28, this.h7), t
   288      }, (r.prototype = new t).finalize = function() {
   289          if (t.prototype.finalize.call(this), this.inner) {
   290              this.inner = !1;
   291              var r = this.array();
   292              t.call(this, this.is224, this.sharedMemory), this.update(this.oKeyPad), this.update(r), t.prototype.finalize.call(this)
   293          }
   294      };
   295      var v = p();
   296      v.sha256 = v, v.sha224 = p(!0), v.sha256.hmac = k(), v.sha224.hmac = k(!0), s ? module.exports = v : (i.sha256 = v.sha256, i.sha224 = v.sha224, n && define(function() {
   297          return v
   298      }))
   299  }();
   300  var RMDsize = 160,
   301      X = new Array,
   302      ROLs = [
   303          [11, 14, 15, 12, 5, 8, 7, 9, 11, 13, 14, 15, 6, 7, 9, 8],
   304          [7, 6, 8, 13, 11, 9, 7, 15, 7, 12, 15, 9, 11, 7, 13, 12],
   305          [11, 13, 6, 7, 14, 9, 13, 15, 14, 8, 13, 6, 5, 12, 7, 5],
   306          [11, 12, 14, 15, 14, 15, 9, 8, 9, 14, 5, 6, 8, 6, 5, 12],
   307          [9, 15, 5, 11, 6, 8, 13, 12, 5, 12, 13, 14, 11, 8, 5, 6],
   308          [8, 9, 9, 11, 13, 15, 15, 5, 7, 7, 8, 11, 14, 14, 12, 6],
   309          [9, 13, 15, 7, 12, 8, 9, 11, 7, 7, 12, 7, 6, 15, 13, 11],
   310          [9, 7, 15, 11, 8, 6, 6, 14, 12, 13, 5, 14, 13, 13, 7, 5],
   311          [15, 5, 8, 11, 14, 14, 6, 14, 6, 9, 12, 9, 12, 5, 15, 8],
   312          [8, 5, 12, 9, 12, 5, 14, 6, 8, 13, 6, 5, 15, 13, 11, 11]
   313      ],
   314      indexes = [
   315          [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15],
   316          [7, 4, 13, 1, 10, 6, 15, 3, 12, 0, 9, 5, 2, 14, 11, 8],
   317          [3, 10, 14, 4, 9, 15, 8, 1, 2, 7, 0, 6, 13, 11, 5, 12],
   318          [1, 9, 11, 10, 0, 8, 12, 4, 13, 3, 7, 15, 14, 5, 6, 2],
   319          [4, 0, 5, 9, 7, 12, 2, 10, 14, 1, 3, 8, 11, 6, 15, 13],
   320          [5, 14, 7, 0, 9, 2, 11, 4, 13, 6, 15, 8, 1, 10, 3, 12],
   321          [6, 11, 3, 7, 0, 13, 5, 10, 14, 15, 8, 12, 4, 9, 1, 2],
   322          [15, 5, 1, 3, 7, 14, 6, 9, 11, 8, 12, 2, 10, 0, 4, 13],
   323          [8, 6, 4, 1, 3, 11, 15, 0, 5, 12, 2, 13, 9, 7, 10, 14],
   324          [12, 15, 10, 4, 1, 5, 8, 7, 6, 2, 13, 14, 0, 3, 9, 11]
   325      ];
   326  (function() {
   327      var t, r, e, i;
   328      for (e = ("undefined" != typeof module && null !== module ? module.exports : void 0) || (window.Base58 = {}), t = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz", r = {}, i = 0; i < t.length;) r[t.charAt(i)] = i, i++;
   329      e.encode = function(r) {
   330          var e, h, s;
   331          if (0 === r.length) return "";
   332          for (i = void 0, s = void 0, h = [0], i = 0; i < r.length;) {
   333              for (s = 0; s < h.length;) h[s] <<= 8, s++;
   334              for (h[0] += r[i], e = 0, s = 0; s < h.length;) h[s] += e, e = h[s] / 58 | 0, h[s] %= 58, ++s;
   335              for (; e;) h.push(e % 58), e = e / 58 | 0;
   336              i++
   337          }
   338          for (i = 0; 0 === r[i] && i < r.length - 1;) h.push(0), i++;
   339          return h.reverse().map(function(r) {
   340              return t[r]
   341          }).join("")
   342      }, e.decode = function(t) {
   343          var e, h, s, n;
   344          if (0 === t.length) return new("undefined" != typeof Uint8Array && null !== Uint8Array ? Uint8Array : Buffer)(0);
   345          for (i = void 0, n = void 0, e = [0], i = 0; i < t.length;) {
   346              if (!((h = t[i]) in r)) throw "Base58.decode received unacceptable input. Character '" + h + "' is not in the Base58 alphabet.";
   347              for (n = 0; n < e.length;) e[n] *= 58, n++;
   348              for (e[0] += r[h], s = 0, n = 0; n < e.length;) e[n] += s, s = e[n] >> 8, e[n] &= 255, ++n;
   349              for (; s;) e.push(255 & s), s >>= 8;
   350              i++
   351          }
   352          for (i = 0;
   353              "1" === t[i] && i < t.length - 1;) e.push(0), i++;
   354          return new("undefined" != typeof Uint8Array && null !== Uint8Array ? Uint8Array : Buffer)(e.reverse())
   355      }
   356  }).call(this)
   357  
   358  function pubkey_to_p2kh(pkb) {
   359  	var i = RMD(sha256.update(pkb).array())
   360  	var h = new Uint8Array(25)
   361  	h[0] = testnet ? 111 : 0
   362  	for (var s = 0; s < 20; s++) h[1 + s] = i[s]
   363  	var n = sha256.update(sha256.update(h.slice(0, 21)).array()).array()
   364  	h[21] = n[0]
   365  	h[22] = n[1]
   366  	h[23] = n[2]
   367  	h[24] = n[3]
   368  	return Base58.encode(h)
   369  }
   370