github.com/cryptotooltop/go-ethereum@v0.0.0-20231103184714-151d1922f3e5/internal/jsre/deps/web3.js (about) 1 require=(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){ 2 module.exports=[ 3 { 4 "constant": true, 5 "inputs": [ 6 { 7 "name": "_owner", 8 "type": "address" 9 } 10 ], 11 "name": "name", 12 "outputs": [ 13 { 14 "name": "o_name", 15 "type": "bytes32" 16 } 17 ], 18 "type": "function" 19 }, 20 { 21 "constant": true, 22 "inputs": [ 23 { 24 "name": "_name", 25 "type": "bytes32" 26 } 27 ], 28 "name": "owner", 29 "outputs": [ 30 { 31 "name": "", 32 "type": "address" 33 } 34 ], 35 "type": "function" 36 }, 37 { 38 "constant": true, 39 "inputs": [ 40 { 41 "name": "_name", 42 "type": "bytes32" 43 } 44 ], 45 "name": "content", 46 "outputs": [ 47 { 48 "name": "", 49 "type": "bytes32" 50 } 51 ], 52 "type": "function" 53 }, 54 { 55 "constant": true, 56 "inputs": [ 57 { 58 "name": "_name", 59 "type": "bytes32" 60 } 61 ], 62 "name": "addr", 63 "outputs": [ 64 { 65 "name": "", 66 "type": "address" 67 } 68 ], 69 "type": "function" 70 }, 71 { 72 "constant": false, 73 "inputs": [ 74 { 75 "name": "_name", 76 "type": "bytes32" 77 } 78 ], 79 "name": "reserve", 80 "outputs": [], 81 "type": "function" 82 }, 83 { 84 "constant": true, 85 "inputs": [ 86 { 87 "name": "_name", 88 "type": "bytes32" 89 } 90 ], 91 "name": "subRegistrar", 92 "outputs": [ 93 { 94 "name": "", 95 "type": "address" 96 } 97 ], 98 "type": "function" 99 }, 100 { 101 "constant": false, 102 "inputs": [ 103 { 104 "name": "_name", 105 "type": "bytes32" 106 }, 107 { 108 "name": "_newOwner", 109 "type": "address" 110 } 111 ], 112 "name": "transfer", 113 "outputs": [], 114 "type": "function" 115 }, 116 { 117 "constant": false, 118 "inputs": [ 119 { 120 "name": "_name", 121 "type": "bytes32" 122 }, 123 { 124 "name": "_registrar", 125 "type": "address" 126 } 127 ], 128 "name": "setSubRegistrar", 129 "outputs": [], 130 "type": "function" 131 }, 132 { 133 "constant": false, 134 "inputs": [], 135 "name": "Registrar", 136 "outputs": [], 137 "type": "function" 138 }, 139 { 140 "constant": false, 141 "inputs": [ 142 { 143 "name": "_name", 144 "type": "bytes32" 145 }, 146 { 147 "name": "_a", 148 "type": "address" 149 }, 150 { 151 "name": "_primary", 152 "type": "bool" 153 } 154 ], 155 "name": "setAddress", 156 "outputs": [], 157 "type": "function" 158 }, 159 { 160 "constant": false, 161 "inputs": [ 162 { 163 "name": "_name", 164 "type": "bytes32" 165 }, 166 { 167 "name": "_content", 168 "type": "bytes32" 169 } 170 ], 171 "name": "setContent", 172 "outputs": [], 173 "type": "function" 174 }, 175 { 176 "constant": false, 177 "inputs": [ 178 { 179 "name": "_name", 180 "type": "bytes32" 181 } 182 ], 183 "name": "disown", 184 "outputs": [], 185 "type": "function" 186 }, 187 { 188 "anonymous": false, 189 "inputs": [ 190 { 191 "indexed": true, 192 "name": "_name", 193 "type": "bytes32" 194 }, 195 { 196 "indexed": false, 197 "name": "_winner", 198 "type": "address" 199 } 200 ], 201 "name": "AuctionEnded", 202 "type": "event" 203 }, 204 { 205 "anonymous": false, 206 "inputs": [ 207 { 208 "indexed": true, 209 "name": "_name", 210 "type": "bytes32" 211 }, 212 { 213 "indexed": false, 214 "name": "_bidder", 215 "type": "address" 216 }, 217 { 218 "indexed": false, 219 "name": "_value", 220 "type": "uint256" 221 } 222 ], 223 "name": "NewBid", 224 "type": "event" 225 }, 226 { 227 "anonymous": false, 228 "inputs": [ 229 { 230 "indexed": true, 231 "name": "name", 232 "type": "bytes32" 233 } 234 ], 235 "name": "Changed", 236 "type": "event" 237 }, 238 { 239 "anonymous": false, 240 "inputs": [ 241 { 242 "indexed": true, 243 "name": "name", 244 "type": "bytes32" 245 }, 246 { 247 "indexed": true, 248 "name": "addr", 249 "type": "address" 250 } 251 ], 252 "name": "PrimaryChanged", 253 "type": "event" 254 } 255 ] 256 257 },{}],2:[function(require,module,exports){ 258 module.exports=[ 259 { 260 "constant": true, 261 "inputs": [ 262 { 263 "name": "_name", 264 "type": "bytes32" 265 } 266 ], 267 "name": "owner", 268 "outputs": [ 269 { 270 "name": "", 271 "type": "address" 272 } 273 ], 274 "type": "function" 275 }, 276 { 277 "constant": false, 278 "inputs": [ 279 { 280 "name": "_name", 281 "type": "bytes32" 282 }, 283 { 284 "name": "_refund", 285 "type": "address" 286 } 287 ], 288 "name": "disown", 289 "outputs": [], 290 "type": "function" 291 }, 292 { 293 "constant": true, 294 "inputs": [ 295 { 296 "name": "_name", 297 "type": "bytes32" 298 } 299 ], 300 "name": "addr", 301 "outputs": [ 302 { 303 "name": "", 304 "type": "address" 305 } 306 ], 307 "type": "function" 308 }, 309 { 310 "constant": false, 311 "inputs": [ 312 { 313 "name": "_name", 314 "type": "bytes32" 315 } 316 ], 317 "name": "reserve", 318 "outputs": [], 319 "type": "function" 320 }, 321 { 322 "constant": false, 323 "inputs": [ 324 { 325 "name": "_name", 326 "type": "bytes32" 327 }, 328 { 329 "name": "_newOwner", 330 "type": "address" 331 } 332 ], 333 "name": "transfer", 334 "outputs": [], 335 "type": "function" 336 }, 337 { 338 "constant": false, 339 "inputs": [ 340 { 341 "name": "_name", 342 "type": "bytes32" 343 }, 344 { 345 "name": "_a", 346 "type": "address" 347 } 348 ], 349 "name": "setAddr", 350 "outputs": [], 351 "type": "function" 352 }, 353 { 354 "anonymous": false, 355 "inputs": [ 356 { 357 "indexed": true, 358 "name": "name", 359 "type": "bytes32" 360 } 361 ], 362 "name": "Changed", 363 "type": "event" 364 } 365 ] 366 367 },{}],3:[function(require,module,exports){ 368 module.exports=[ 369 { 370 "constant": false, 371 "inputs": [ 372 { 373 "name": "from", 374 "type": "bytes32" 375 }, 376 { 377 "name": "to", 378 "type": "address" 379 }, 380 { 381 "name": "value", 382 "type": "uint256" 383 } 384 ], 385 "name": "transfer", 386 "outputs": [], 387 "type": "function" 388 }, 389 { 390 "constant": false, 391 "inputs": [ 392 { 393 "name": "from", 394 "type": "bytes32" 395 }, 396 { 397 "name": "to", 398 "type": "address" 399 }, 400 { 401 "name": "indirectId", 402 "type": "bytes32" 403 }, 404 { 405 "name": "value", 406 "type": "uint256" 407 } 408 ], 409 "name": "icapTransfer", 410 "outputs": [], 411 "type": "function" 412 }, 413 { 414 "constant": false, 415 "inputs": [ 416 { 417 "name": "to", 418 "type": "bytes32" 419 } 420 ], 421 "name": "deposit", 422 "outputs": [], 423 "payable": true, 424 "type": "function" 425 }, 426 { 427 "anonymous": false, 428 "inputs": [ 429 { 430 "indexed": true, 431 "name": "from", 432 "type": "address" 433 }, 434 { 435 "indexed": false, 436 "name": "value", 437 "type": "uint256" 438 } 439 ], 440 "name": "AnonymousDeposit", 441 "type": "event" 442 }, 443 { 444 "anonymous": false, 445 "inputs": [ 446 { 447 "indexed": true, 448 "name": "from", 449 "type": "address" 450 }, 451 { 452 "indexed": true, 453 "name": "to", 454 "type": "bytes32" 455 }, 456 { 457 "indexed": false, 458 "name": "value", 459 "type": "uint256" 460 } 461 ], 462 "name": "Deposit", 463 "type": "event" 464 }, 465 { 466 "anonymous": false, 467 "inputs": [ 468 { 469 "indexed": true, 470 "name": "from", 471 "type": "bytes32" 472 }, 473 { 474 "indexed": true, 475 "name": "to", 476 "type": "address" 477 }, 478 { 479 "indexed": false, 480 "name": "value", 481 "type": "uint256" 482 } 483 ], 484 "name": "Transfer", 485 "type": "event" 486 }, 487 { 488 "anonymous": false, 489 "inputs": [ 490 { 491 "indexed": true, 492 "name": "from", 493 "type": "bytes32" 494 }, 495 { 496 "indexed": true, 497 "name": "to", 498 "type": "address" 499 }, 500 { 501 "indexed": false, 502 "name": "indirectId", 503 "type": "bytes32" 504 }, 505 { 506 "indexed": false, 507 "name": "value", 508 "type": "uint256" 509 } 510 ], 511 "name": "IcapTransfer", 512 "type": "event" 513 } 514 ] 515 516 },{}],4:[function(require,module,exports){ 517 var f = require('./formatters'); 518 var SolidityType = require('./type'); 519 520 /** 521 * SolidityTypeAddress is a prootype that represents address type 522 * It matches: 523 * address 524 * address[] 525 * address[4] 526 * address[][] 527 * address[3][] 528 * address[][6][], ... 529 */ 530 var SolidityTypeAddress = function () { 531 this._inputFormatter = f.formatInputInt; 532 this._outputFormatter = f.formatOutputAddress; 533 }; 534 535 SolidityTypeAddress.prototype = new SolidityType({}); 536 SolidityTypeAddress.prototype.constructor = SolidityTypeAddress; 537 538 SolidityTypeAddress.prototype.isType = function (name) { 539 return !!name.match(/address(\[([0-9]*)\])?/); 540 }; 541 542 module.exports = SolidityTypeAddress; 543 544 },{"./formatters":9,"./type":14}],5:[function(require,module,exports){ 545 var f = require('./formatters'); 546 var SolidityType = require('./type'); 547 548 /** 549 * SolidityTypeBool is a prootype that represents bool type 550 * It matches: 551 * bool 552 * bool[] 553 * bool[4] 554 * bool[][] 555 * bool[3][] 556 * bool[][6][], ... 557 */ 558 var SolidityTypeBool = function () { 559 this._inputFormatter = f.formatInputBool; 560 this._outputFormatter = f.formatOutputBool; 561 }; 562 563 SolidityTypeBool.prototype = new SolidityType({}); 564 SolidityTypeBool.prototype.constructor = SolidityTypeBool; 565 566 SolidityTypeBool.prototype.isType = function (name) { 567 return !!name.match(/^bool(\[([0-9]*)\])*$/); 568 }; 569 570 module.exports = SolidityTypeBool; 571 572 },{"./formatters":9,"./type":14}],6:[function(require,module,exports){ 573 var f = require('./formatters'); 574 var SolidityType = require('./type'); 575 576 /** 577 * SolidityTypeBytes is a prototype that represents the bytes type. 578 * It matches: 579 * bytes 580 * bytes[] 581 * bytes[4] 582 * bytes[][] 583 * bytes[3][] 584 * bytes[][6][], ... 585 * bytes32 586 * bytes8[4] 587 * bytes[3][] 588 */ 589 var SolidityTypeBytes = function () { 590 this._inputFormatter = f.formatInputBytes; 591 this._outputFormatter = f.formatOutputBytes; 592 }; 593 594 SolidityTypeBytes.prototype = new SolidityType({}); 595 SolidityTypeBytes.prototype.constructor = SolidityTypeBytes; 596 597 SolidityTypeBytes.prototype.isType = function (name) { 598 return !!name.match(/^bytes([0-9]{1,})(\[([0-9]*)\])*$/); 599 }; 600 601 module.exports = SolidityTypeBytes; 602 603 },{"./formatters":9,"./type":14}],7:[function(require,module,exports){ 604 /* 605 This file is part of web3.js. 606 607 web3.js is free software: you can redistribute it and/or modify 608 it under the terms of the GNU Lesser General Public License as published by 609 the Free Software Foundation, either version 3 of the License, or 610 (at your option) any later version. 611 612 web3.js is distributed in the hope that it will be useful, 613 but WITHOUT ANY WARRANTY; without even the implied warranty of 614 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 615 GNU Lesser General Public License for more details. 616 617 You should have received a copy of the GNU Lesser General Public License 618 along with web3.js. If not, see <http://www.gnu.org/licenses/>. 619 */ 620 /** 621 * @file coder.js 622 * @author Marek Kotewicz <marek@ethdev.com> 623 * @date 2015 624 */ 625 626 var f = require('./formatters'); 627 628 var SolidityTypeAddress = require('./address'); 629 var SolidityTypeBool = require('./bool'); 630 var SolidityTypeInt = require('./int'); 631 var SolidityTypeUInt = require('./uint'); 632 var SolidityTypeDynamicBytes = require('./dynamicbytes'); 633 var SolidityTypeString = require('./string'); 634 var SolidityTypeReal = require('./real'); 635 var SolidityTypeUReal = require('./ureal'); 636 var SolidityTypeBytes = require('./bytes'); 637 638 var isDynamic = function (solidityType, type) { 639 return solidityType.isDynamicType(type) || 640 solidityType.isDynamicArray(type); 641 }; 642 643 /** 644 * SolidityCoder prototype should be used to encode/decode solidity params of any type 645 */ 646 var SolidityCoder = function (types) { 647 this._types = types; 648 }; 649 650 /** 651 * This method should be used to transform type to SolidityType 652 * 653 * @method _requireType 654 * @param {String} type 655 * @returns {SolidityType} 656 * @throws {Error} throws if no matching type is found 657 */ 658 SolidityCoder.prototype._requireType = function (type) { 659 var solidityType = this._types.filter(function (t) { 660 return t.isType(type); 661 })[0]; 662 663 if (!solidityType) { 664 throw Error('invalid solidity type!: ' + type); 665 } 666 667 return solidityType; 668 }; 669 670 /** 671 * Should be used to encode plain param 672 * 673 * @method encodeParam 674 * @param {String} type 675 * @param {Object} plain param 676 * @return {String} encoded plain param 677 */ 678 SolidityCoder.prototype.encodeParam = function (type, param) { 679 return this.encodeParams([type], [param]); 680 }; 681 682 /** 683 * Should be used to encode list of params 684 * 685 * @method encodeParams 686 * @param {Array} types 687 * @param {Array} params 688 * @return {String} encoded list of params 689 */ 690 SolidityCoder.prototype.encodeParams = function (types, params) { 691 var solidityTypes = this.getSolidityTypes(types); 692 693 var encodeds = solidityTypes.map(function (solidityType, index) { 694 return solidityType.encode(params[index], types[index]); 695 }); 696 697 var dynamicOffset = solidityTypes.reduce(function (acc, solidityType, index) { 698 var staticPartLength = solidityType.staticPartLength(types[index]); 699 var roundedStaticPartLength = Math.floor((staticPartLength + 31) / 32) * 32; 700 701 return acc + (isDynamic(solidityTypes[index], types[index]) ? 702 32 : 703 roundedStaticPartLength); 704 }, 0); 705 706 var result = this.encodeMultiWithOffset(types, solidityTypes, encodeds, dynamicOffset); 707 708 return result; 709 }; 710 711 SolidityCoder.prototype.encodeMultiWithOffset = function (types, solidityTypes, encodeds, dynamicOffset) { 712 var result = ""; 713 var self = this; 714 715 types.forEach(function (type, i) { 716 if (isDynamic(solidityTypes[i], types[i])) { 717 result += f.formatInputInt(dynamicOffset).encode(); 718 var e = self.encodeWithOffset(types[i], solidityTypes[i], encodeds[i], dynamicOffset); 719 dynamicOffset += e.length / 2; 720 } else { 721 // don't add length to dynamicOffset. it's already counted 722 result += self.encodeWithOffset(types[i], solidityTypes[i], encodeds[i], dynamicOffset); 723 } 724 725 // TODO: figure out nested arrays 726 }); 727 728 types.forEach(function (type, i) { 729 if (isDynamic(solidityTypes[i], types[i])) { 730 var e = self.encodeWithOffset(types[i], solidityTypes[i], encodeds[i], dynamicOffset); 731 dynamicOffset += e.length / 2; 732 result += e; 733 } 734 }); 735 return result; 736 }; 737 738 // TODO: refactor whole encoding! 739 SolidityCoder.prototype.encodeWithOffset = function (type, solidityType, encoded, offset) { 740 var self = this; 741 if (solidityType.isDynamicArray(type)) { 742 return (function () { 743 // offset was already set 744 var nestedName = solidityType.nestedName(type); 745 var nestedStaticPartLength = solidityType.staticPartLength(nestedName); 746 var result = encoded[0]; 747 748 (function () { 749 var previousLength = 2; // in int 750 if (solidityType.isDynamicArray(nestedName)) { 751 for (var i = 1; i < encoded.length; i++) { 752 previousLength += +(encoded[i - 1])[0] || 0; 753 result += f.formatInputInt(offset + i * nestedStaticPartLength + previousLength * 32).encode(); 754 } 755 } 756 })(); 757 758 // first element is length, skip it 759 (function () { 760 for (var i = 0; i < encoded.length - 1; i++) { 761 var additionalOffset = result / 2; 762 result += self.encodeWithOffset(nestedName, solidityType, encoded[i + 1], offset + additionalOffset); 763 } 764 })(); 765 766 return result; 767 })(); 768 769 } else if (solidityType.isStaticArray(type)) { 770 return (function () { 771 var nestedName = solidityType.nestedName(type); 772 var nestedStaticPartLength = solidityType.staticPartLength(nestedName); 773 var result = ""; 774 775 776 if (solidityType.isDynamicArray(nestedName)) { 777 (function () { 778 var previousLength = 0; // in int 779 for (var i = 0; i < encoded.length; i++) { 780 // calculate length of previous item 781 previousLength += +(encoded[i - 1] || [])[0] || 0; 782 result += f.formatInputInt(offset + i * nestedStaticPartLength + previousLength * 32).encode(); 783 } 784 })(); 785 } 786 787 (function () { 788 for (var i = 0; i < encoded.length; i++) { 789 var additionalOffset = result / 2; 790 result += self.encodeWithOffset(nestedName, solidityType, encoded[i], offset + additionalOffset); 791 } 792 })(); 793 794 return result; 795 })(); 796 } 797 798 return encoded; 799 }; 800 801 /** 802 * Should be used to decode bytes to plain param 803 * 804 * @method decodeParam 805 * @param {String} type 806 * @param {String} bytes 807 * @return {Object} plain param 808 */ 809 SolidityCoder.prototype.decodeParam = function (type, bytes) { 810 return this.decodeParams([type], bytes)[0]; 811 }; 812 813 /** 814 * Should be used to decode list of params 815 * 816 * @method decodeParam 817 * @param {Array} types 818 * @param {String} bytes 819 * @return {Array} array of plain params 820 */ 821 SolidityCoder.prototype.decodeParams = function (types, bytes) { 822 var solidityTypes = this.getSolidityTypes(types); 823 var offsets = this.getOffsets(types, solidityTypes); 824 825 return solidityTypes.map(function (solidityType, index) { 826 return solidityType.decode(bytes, offsets[index], types[index], index); 827 }); 828 }; 829 830 SolidityCoder.prototype.getOffsets = function (types, solidityTypes) { 831 var lengths = solidityTypes.map(function (solidityType, index) { 832 return solidityType.staticPartLength(types[index]); 833 }); 834 835 for (var i = 1; i < lengths.length; i++) { 836 // sum with length of previous element 837 lengths[i] += lengths[i - 1]; 838 } 839 840 return lengths.map(function (length, index) { 841 // remove the current length, so the length is sum of previous elements 842 var staticPartLength = solidityTypes[index].staticPartLength(types[index]); 843 return length - staticPartLength; 844 }); 845 }; 846 847 SolidityCoder.prototype.getSolidityTypes = function (types) { 848 var self = this; 849 return types.map(function (type) { 850 return self._requireType(type); 851 }); 852 }; 853 854 var coder = new SolidityCoder([ 855 new SolidityTypeAddress(), 856 new SolidityTypeBool(), 857 new SolidityTypeInt(), 858 new SolidityTypeUInt(), 859 new SolidityTypeDynamicBytes(), 860 new SolidityTypeBytes(), 861 new SolidityTypeString(), 862 new SolidityTypeReal(), 863 new SolidityTypeUReal() 864 ]); 865 866 module.exports = coder; 867 868 },{"./address":4,"./bool":5,"./bytes":6,"./dynamicbytes":8,"./formatters":9,"./int":10,"./real":12,"./string":13,"./uint":15,"./ureal":16}],8:[function(require,module,exports){ 869 var f = require('./formatters'); 870 var SolidityType = require('./type'); 871 872 var SolidityTypeDynamicBytes = function () { 873 this._inputFormatter = f.formatInputDynamicBytes; 874 this._outputFormatter = f.formatOutputDynamicBytes; 875 }; 876 877 SolidityTypeDynamicBytes.prototype = new SolidityType({}); 878 SolidityTypeDynamicBytes.prototype.constructor = SolidityTypeDynamicBytes; 879 880 SolidityTypeDynamicBytes.prototype.isType = function (name) { 881 return !!name.match(/^bytes(\[([0-9]*)\])*$/); 882 }; 883 884 SolidityTypeDynamicBytes.prototype.isDynamicType = function () { 885 return true; 886 }; 887 888 module.exports = SolidityTypeDynamicBytes; 889 890 },{"./formatters":9,"./type":14}],9:[function(require,module,exports){ 891 /* 892 This file is part of web3.js. 893 894 web3.js is free software: you can redistribute it and/or modify 895 it under the terms of the GNU Lesser General Public License as published by 896 the Free Software Foundation, either version 3 of the License, or 897 (at your option) any later version. 898 899 web3.js is distributed in the hope that it will be useful, 900 but WITHOUT ANY WARRANTY; without even the implied warranty of 901 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 902 GNU Lesser General Public License for more details. 903 904 You should have received a copy of the GNU Lesser General Public License 905 along with web3.js. If not, see <http://www.gnu.org/licenses/>. 906 */ 907 /** 908 * @file formatters.js 909 * @author Marek Kotewicz <marek@ethdev.com> 910 * @date 2015 911 */ 912 913 var BigNumber = require('bignumber.js'); 914 var utils = require('../utils/utils'); 915 var c = require('../utils/config'); 916 var SolidityParam = require('./param'); 917 918 919 /** 920 * Formats input value to byte representation of int 921 * If value is negative, return it's two's complement 922 * If the value is floating point, round it down 923 * 924 * @method formatInputInt 925 * @param {String|Number|BigNumber} value that needs to be formatted 926 * @returns {SolidityParam} 927 */ 928 var formatInputInt = function (value) { 929 BigNumber.config(c.ETH_BIGNUMBER_ROUNDING_MODE); 930 var result = utils.padLeft(utils.toTwosComplement(value).toString(16), 64); 931 return new SolidityParam(result); 932 }; 933 934 /** 935 * Formats input bytes 936 * 937 * @method formatInputBytes 938 * @param {String} 939 * @returns {SolidityParam} 940 */ 941 var formatInputBytes = function (value) { 942 var result = utils.toHex(value).substr(2); 943 var l = Math.floor((result.length + 63) / 64); 944 result = utils.padRight(result, l * 64); 945 return new SolidityParam(result); 946 }; 947 948 /** 949 * Formats input bytes 950 * 951 * @method formatDynamicInputBytes 952 * @param {String} 953 * @returns {SolidityParam} 954 */ 955 var formatInputDynamicBytes = function (value) { 956 var result = utils.toHex(value).substr(2); 957 var length = result.length / 2; 958 var l = Math.floor((result.length + 63) / 64); 959 result = utils.padRight(result, l * 64); 960 return new SolidityParam(formatInputInt(length).value + result); 961 }; 962 963 /** 964 * Formats input value to byte representation of string 965 * 966 * @method formatInputString 967 * @param {String} 968 * @returns {SolidityParam} 969 */ 970 var formatInputString = function (value) { 971 var result = utils.fromUtf8(value).substr(2); 972 var length = result.length / 2; 973 var l = Math.floor((result.length + 63) / 64); 974 result = utils.padRight(result, l * 64); 975 return new SolidityParam(formatInputInt(length).value + result); 976 }; 977 978 /** 979 * Formats input value to byte representation of bool 980 * 981 * @method formatInputBool 982 * @param {Boolean} 983 * @returns {SolidityParam} 984 */ 985 var formatInputBool = function (value) { 986 var result = '000000000000000000000000000000000000000000000000000000000000000' + (value ? '1' : '0'); 987 return new SolidityParam(result); 988 }; 989 990 /** 991 * Formats input value to byte representation of real 992 * Values are multiplied by 2^m and encoded as integers 993 * 994 * @method formatInputReal 995 * @param {String|Number|BigNumber} 996 * @returns {SolidityParam} 997 */ 998 var formatInputReal = function (value) { 999 return formatInputInt(new BigNumber(value).times(new BigNumber(2).pow(128))); 1000 }; 1001 1002 /** 1003 * Check if input value is negative 1004 * 1005 * @method signedIsNegative 1006 * @param {String} value is hex format 1007 * @returns {Boolean} true if it is negative, otherwise false 1008 */ 1009 var signedIsNegative = function (value) { 1010 return (new BigNumber(value.substr(0, 1), 16).toString(2).substr(0, 1)) === '1'; 1011 }; 1012 1013 /** 1014 * Formats right-aligned output bytes to int 1015 * 1016 * @method formatOutputInt 1017 * @param {SolidityParam} param 1018 * @returns {BigNumber} right-aligned output bytes formatted to big number 1019 */ 1020 var formatOutputInt = function (param) { 1021 var value = param.staticPart() || "0"; 1022 1023 // check if it's negative number 1024 // it is, return two's complement 1025 if (signedIsNegative(value)) { 1026 return new BigNumber(value, 16).minus(new BigNumber('ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff', 16)).minus(1); 1027 } 1028 return new BigNumber(value, 16); 1029 }; 1030 1031 /** 1032 * Formats right-aligned output bytes to uint 1033 * 1034 * @method formatOutputUInt 1035 * @param {SolidityParam} 1036 * @returns {BigNumeber} right-aligned output bytes formatted to uint 1037 */ 1038 var formatOutputUInt = function (param) { 1039 var value = param.staticPart() || "0"; 1040 return new BigNumber(value, 16); 1041 }; 1042 1043 /** 1044 * Formats right-aligned output bytes to real 1045 * 1046 * @method formatOutputReal 1047 * @param {SolidityParam} 1048 * @returns {BigNumber} input bytes formatted to real 1049 */ 1050 var formatOutputReal = function (param) { 1051 return formatOutputInt(param).dividedBy(new BigNumber(2).pow(128)); 1052 }; 1053 1054 /** 1055 * Formats right-aligned output bytes to ureal 1056 * 1057 * @method formatOutputUReal 1058 * @param {SolidityParam} 1059 * @returns {BigNumber} input bytes formatted to ureal 1060 */ 1061 var formatOutputUReal = function (param) { 1062 return formatOutputUInt(param).dividedBy(new BigNumber(2).pow(128)); 1063 }; 1064 1065 /** 1066 * Should be used to format output bool 1067 * 1068 * @method formatOutputBool 1069 * @param {SolidityParam} 1070 * @returns {Boolean} right-aligned input bytes formatted to bool 1071 */ 1072 var formatOutputBool = function (param) { 1073 return param.staticPart() === '0000000000000000000000000000000000000000000000000000000000000001' ? true : false; 1074 }; 1075 1076 /** 1077 * Should be used to format output bytes 1078 * 1079 * @method formatOutputBytes 1080 * @param {SolidityParam} left-aligned hex representation of string 1081 * @param {String} name type name 1082 * @returns {String} hex string 1083 */ 1084 var formatOutputBytes = function (param, name) { 1085 var matches = name.match(/^bytes([0-9]*)/); 1086 var size = parseInt(matches[1]); 1087 return '0x' + param.staticPart().slice(0, 2 * size); 1088 }; 1089 1090 /** 1091 * Should be used to format output bytes 1092 * 1093 * @method formatOutputDynamicBytes 1094 * @param {SolidityParam} left-aligned hex representation of string 1095 * @returns {String} hex string 1096 */ 1097 var formatOutputDynamicBytes = function (param) { 1098 var length = (new BigNumber(param.dynamicPart().slice(0, 64), 16)).toNumber() * 2; 1099 return '0x' + param.dynamicPart().substr(64, length); 1100 }; 1101 1102 /** 1103 * Should be used to format output string 1104 * 1105 * @method formatOutputString 1106 * @param {SolidityParam} left-aligned hex representation of string 1107 * @returns {String} ascii string 1108 */ 1109 var formatOutputString = function (param) { 1110 var length = (new BigNumber(param.dynamicPart().slice(0, 64), 16)).toNumber() * 2; 1111 return utils.toUtf8(param.dynamicPart().substr(64, length)); 1112 }; 1113 1114 /** 1115 * Should be used to format output address 1116 * 1117 * @method formatOutputAddress 1118 * @param {SolidityParam} right-aligned input bytes 1119 * @returns {String} address 1120 */ 1121 var formatOutputAddress = function (param) { 1122 var value = param.staticPart(); 1123 return "0x" + value.slice(value.length - 40, value.length); 1124 }; 1125 1126 module.exports = { 1127 formatInputInt: formatInputInt, 1128 formatInputBytes: formatInputBytes, 1129 formatInputDynamicBytes: formatInputDynamicBytes, 1130 formatInputString: formatInputString, 1131 formatInputBool: formatInputBool, 1132 formatInputReal: formatInputReal, 1133 formatOutputInt: formatOutputInt, 1134 formatOutputUInt: formatOutputUInt, 1135 formatOutputReal: formatOutputReal, 1136 formatOutputUReal: formatOutputUReal, 1137 formatOutputBool: formatOutputBool, 1138 formatOutputBytes: formatOutputBytes, 1139 formatOutputDynamicBytes: formatOutputDynamicBytes, 1140 formatOutputString: formatOutputString, 1141 formatOutputAddress: formatOutputAddress 1142 }; 1143 1144 },{"../utils/config":18,"../utils/utils":20,"./param":11,"bignumber.js":"bignumber.js"}],10:[function(require,module,exports){ 1145 var f = require('./formatters'); 1146 var SolidityType = require('./type'); 1147 1148 /** 1149 * SolidityTypeInt is a prootype that represents int type 1150 * It matches: 1151 * int 1152 * int[] 1153 * int[4] 1154 * int[][] 1155 * int[3][] 1156 * int[][6][], ... 1157 * int32 1158 * int64[] 1159 * int8[4] 1160 * int256[][] 1161 * int[3][] 1162 * int64[][6][], ... 1163 */ 1164 var SolidityTypeInt = function () { 1165 this._inputFormatter = f.formatInputInt; 1166 this._outputFormatter = f.formatOutputInt; 1167 }; 1168 1169 SolidityTypeInt.prototype = new SolidityType({}); 1170 SolidityTypeInt.prototype.constructor = SolidityTypeInt; 1171 1172 SolidityTypeInt.prototype.isType = function (name) { 1173 return !!name.match(/^int([0-9]*)?(\[([0-9]*)\])*$/); 1174 }; 1175 1176 module.exports = SolidityTypeInt; 1177 1178 },{"./formatters":9,"./type":14}],11:[function(require,module,exports){ 1179 /* 1180 This file is part of web3.js. 1181 1182 web3.js is free software: you can redistribute it and/or modify 1183 it under the terms of the GNU Lesser General Public License as published by 1184 the Free Software Foundation, either version 3 of the License, or 1185 (at your option) any later version. 1186 1187 web3.js is distributed in the hope that it will be useful, 1188 but WITHOUT ANY WARRANTY; without even the implied warranty of 1189 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 1190 GNU Lesser General Public License for more details. 1191 1192 You should have received a copy of the GNU Lesser General Public License 1193 along with web3.js. If not, see <http://www.gnu.org/licenses/>. 1194 */ 1195 /** 1196 * @file param.js 1197 * @author Marek Kotewicz <marek@ethdev.com> 1198 * @date 2015 1199 */ 1200 1201 var utils = require('../utils/utils'); 1202 1203 /** 1204 * SolidityParam object prototype. 1205 * Should be used when encoding, decoding solidity bytes 1206 */ 1207 var SolidityParam = function (value, offset) { 1208 this.value = value || ''; 1209 this.offset = offset; // offset in bytes 1210 }; 1211 1212 /** 1213 * This method should be used to get length of params's dynamic part 1214 * 1215 * @method dynamicPartLength 1216 * @returns {Number} length of dynamic part (in bytes) 1217 */ 1218 SolidityParam.prototype.dynamicPartLength = function () { 1219 return this.dynamicPart().length / 2; 1220 }; 1221 1222 /** 1223 * This method should be used to create copy of solidity param with different offset 1224 * 1225 * @method withOffset 1226 * @param {Number} offset length in bytes 1227 * @returns {SolidityParam} new solidity param with applied offset 1228 */ 1229 SolidityParam.prototype.withOffset = function (offset) { 1230 return new SolidityParam(this.value, offset); 1231 }; 1232 1233 /** 1234 * This method should be used to combine solidity params together 1235 * eg. when appending an array 1236 * 1237 * @method combine 1238 * @param {SolidityParam} param with which we should combine 1239 * @param {SolidityParam} result of combination 1240 */ 1241 SolidityParam.prototype.combine = function (param) { 1242 return new SolidityParam(this.value + param.value); 1243 }; 1244 1245 /** 1246 * This method should be called to check if param has dynamic size. 1247 * If it has, it returns true, otherwise false 1248 * 1249 * @method isDynamic 1250 * @returns {Boolean} 1251 */ 1252 SolidityParam.prototype.isDynamic = function () { 1253 return this.offset !== undefined; 1254 }; 1255 1256 /** 1257 * This method should be called to transform offset to bytes 1258 * 1259 * @method offsetAsBytes 1260 * @returns {String} bytes representation of offset 1261 */ 1262 SolidityParam.prototype.offsetAsBytes = function () { 1263 return !this.isDynamic() ? '' : utils.padLeft(utils.toTwosComplement(this.offset).toString(16), 64); 1264 }; 1265 1266 /** 1267 * This method should be called to get static part of param 1268 * 1269 * @method staticPart 1270 * @returns {String} offset if it is a dynamic param, otherwise value 1271 */ 1272 SolidityParam.prototype.staticPart = function () { 1273 if (!this.isDynamic()) { 1274 return this.value; 1275 } 1276 return this.offsetAsBytes(); 1277 }; 1278 1279 /** 1280 * This method should be called to get dynamic part of param 1281 * 1282 * @method dynamicPart 1283 * @returns {String} returns a value if it is a dynamic param, otherwise empty string 1284 */ 1285 SolidityParam.prototype.dynamicPart = function () { 1286 return this.isDynamic() ? this.value : ''; 1287 }; 1288 1289 /** 1290 * This method should be called to encode param 1291 * 1292 * @method encode 1293 * @returns {String} 1294 */ 1295 SolidityParam.prototype.encode = function () { 1296 return this.staticPart() + this.dynamicPart(); 1297 }; 1298 1299 /** 1300 * This method should be called to encode array of params 1301 * 1302 * @method encodeList 1303 * @param {Array[SolidityParam]} params 1304 * @returns {String} 1305 */ 1306 SolidityParam.encodeList = function (params) { 1307 1308 // updating offsets 1309 var totalOffset = params.length * 32; 1310 var offsetParams = params.map(function (param) { 1311 if (!param.isDynamic()) { 1312 return param; 1313 } 1314 var offset = totalOffset; 1315 totalOffset += param.dynamicPartLength(); 1316 return param.withOffset(offset); 1317 }); 1318 1319 // encode everything! 1320 return offsetParams.reduce(function (result, param) { 1321 return result + param.dynamicPart(); 1322 }, offsetParams.reduce(function (result, param) { 1323 return result + param.staticPart(); 1324 }, '')); 1325 }; 1326 1327 1328 1329 module.exports = SolidityParam; 1330 1331 1332 },{"../utils/utils":20}],12:[function(require,module,exports){ 1333 var f = require('./formatters'); 1334 var SolidityType = require('./type'); 1335 1336 /** 1337 * SolidityTypeReal is a prootype that represents real type 1338 * It matches: 1339 * real 1340 * real[] 1341 * real[4] 1342 * real[][] 1343 * real[3][] 1344 * real[][6][], ... 1345 * real32 1346 * real64[] 1347 * real8[4] 1348 * real256[][] 1349 * real[3][] 1350 * real64[][6][], ... 1351 */ 1352 var SolidityTypeReal = function () { 1353 this._inputFormatter = f.formatInputReal; 1354 this._outputFormatter = f.formatOutputReal; 1355 }; 1356 1357 SolidityTypeReal.prototype = new SolidityType({}); 1358 SolidityTypeReal.prototype.constructor = SolidityTypeReal; 1359 1360 SolidityTypeReal.prototype.isType = function (name) { 1361 return !!name.match(/real([0-9]*)?(\[([0-9]*)\])?/); 1362 }; 1363 1364 module.exports = SolidityTypeReal; 1365 1366 },{"./formatters":9,"./type":14}],13:[function(require,module,exports){ 1367 var f = require('./formatters'); 1368 var SolidityType = require('./type'); 1369 1370 var SolidityTypeString = function () { 1371 this._inputFormatter = f.formatInputString; 1372 this._outputFormatter = f.formatOutputString; 1373 }; 1374 1375 SolidityTypeString.prototype = new SolidityType({}); 1376 SolidityTypeString.prototype.constructor = SolidityTypeString; 1377 1378 SolidityTypeString.prototype.isType = function (name) { 1379 return !!name.match(/^string(\[([0-9]*)\])*$/); 1380 }; 1381 1382 SolidityTypeString.prototype.isDynamicType = function () { 1383 return true; 1384 }; 1385 1386 module.exports = SolidityTypeString; 1387 1388 },{"./formatters":9,"./type":14}],14:[function(require,module,exports){ 1389 var f = require('./formatters'); 1390 var SolidityParam = require('./param'); 1391 1392 /** 1393 * SolidityType prototype is used to encode/decode solidity params of certain type 1394 */ 1395 var SolidityType = function (config) { 1396 this._inputFormatter = config.inputFormatter; 1397 this._outputFormatter = config.outputFormatter; 1398 }; 1399 1400 /** 1401 * Should be used to determine if this SolidityType do match given name 1402 * 1403 * @method isType 1404 * @param {String} name 1405 * @return {Bool} true if type match this SolidityType, otherwise false 1406 */ 1407 SolidityType.prototype.isType = function (name) { 1408 throw "this method should be overrwritten for type " + name; 1409 }; 1410 1411 /** 1412 * Should be used to determine what is the length of static part in given type 1413 * 1414 * @method staticPartLength 1415 * @param {String} name 1416 * @return {Number} length of static part in bytes 1417 */ 1418 SolidityType.prototype.staticPartLength = function (name) { 1419 // If name isn't an array then treat it like a single element array. 1420 return (this.nestedTypes(name) || ['[1]']) 1421 .map(function (type) { 1422 // the length of the nested array 1423 return parseInt(type.slice(1, -1), 10) || 1; 1424 }) 1425 .reduce(function (previous, current) { 1426 return previous * current; 1427 // all basic types are 32 bytes long 1428 }, 32); 1429 }; 1430 1431 /** 1432 * Should be used to determine if type is dynamic array 1433 * eg: 1434 * "type[]" => true 1435 * "type[4]" => false 1436 * 1437 * @method isDynamicArray 1438 * @param {String} name 1439 * @return {Bool} true if the type is dynamic array 1440 */ 1441 SolidityType.prototype.isDynamicArray = function (name) { 1442 var nestedTypes = this.nestedTypes(name); 1443 return !!nestedTypes && !nestedTypes[nestedTypes.length - 1].match(/[0-9]{1,}/g); 1444 }; 1445 1446 /** 1447 * Should be used to determine if type is static array 1448 * eg: 1449 * "type[]" => false 1450 * "type[4]" => true 1451 * 1452 * @method isStaticArray 1453 * @param {String} name 1454 * @return {Bool} true if the type is static array 1455 */ 1456 SolidityType.prototype.isStaticArray = function (name) { 1457 var nestedTypes = this.nestedTypes(name); 1458 return !!nestedTypes && !!nestedTypes[nestedTypes.length - 1].match(/[0-9]{1,}/g); 1459 }; 1460 1461 /** 1462 * Should return length of static array 1463 * eg. 1464 * "int[32]" => 32 1465 * "int256[14]" => 14 1466 * "int[2][3]" => 3 1467 * "int" => 1 1468 * "int[1]" => 1 1469 * "int[]" => 1 1470 * 1471 * @method staticArrayLength 1472 * @param {String} name 1473 * @return {Number} static array length 1474 */ 1475 SolidityType.prototype.staticArrayLength = function (name) { 1476 var nestedTypes = this.nestedTypes(name); 1477 if (nestedTypes) { 1478 return parseInt(nestedTypes[nestedTypes.length - 1].match(/[0-9]{1,}/g) || 1); 1479 } 1480 return 1; 1481 }; 1482 1483 /** 1484 * Should return nested type 1485 * eg. 1486 * "int[32]" => "int" 1487 * "int256[14]" => "int256" 1488 * "int[2][3]" => "int[2]" 1489 * "int" => "int" 1490 * "int[]" => "int" 1491 * 1492 * @method nestedName 1493 * @param {String} name 1494 * @return {String} nested name 1495 */ 1496 SolidityType.prototype.nestedName = function (name) { 1497 // remove last [] in name 1498 var nestedTypes = this.nestedTypes(name); 1499 if (!nestedTypes) { 1500 return name; 1501 } 1502 1503 return name.substr(0, name.length - nestedTypes[nestedTypes.length - 1].length); 1504 }; 1505 1506 /** 1507 * Should return true if type has dynamic size by default 1508 * such types are "string", "bytes" 1509 * 1510 * @method isDynamicType 1511 * @param {String} name 1512 * @return {Bool} true if is dynamic, otherwise false 1513 */ 1514 SolidityType.prototype.isDynamicType = function () { 1515 return false; 1516 }; 1517 1518 /** 1519 * Should return array of nested types 1520 * eg. 1521 * "int[2][3][]" => ["[2]", "[3]", "[]"] 1522 * "int[] => ["[]"] 1523 * "int" => null 1524 * 1525 * @method nestedTypes 1526 * @param {String} name 1527 * @return {Array} array of nested types 1528 */ 1529 SolidityType.prototype.nestedTypes = function (name) { 1530 // return list of strings eg. "[]", "[3]", "[]", "[2]" 1531 return name.match(/(\[[0-9]*\])/g); 1532 }; 1533 1534 /** 1535 * Should be used to encode the value 1536 * 1537 * @method encode 1538 * @param {Object} value 1539 * @param {String} name 1540 * @return {String} encoded value 1541 */ 1542 SolidityType.prototype.encode = function (value, name) { 1543 var self = this; 1544 if (this.isDynamicArray(name)) { 1545 1546 return (function () { 1547 var length = value.length; // in int 1548 var nestedName = self.nestedName(name); 1549 1550 var result = []; 1551 result.push(f.formatInputInt(length).encode()); 1552 1553 value.forEach(function (v) { 1554 result.push(self.encode(v, nestedName)); 1555 }); 1556 1557 return result; 1558 })(); 1559 1560 } else if (this.isStaticArray(name)) { 1561 1562 return (function () { 1563 var length = self.staticArrayLength(name); // in int 1564 var nestedName = self.nestedName(name); 1565 1566 var result = []; 1567 for (var i = 0; i < length; i++) { 1568 result.push(self.encode(value[i], nestedName)); 1569 } 1570 1571 return result; 1572 })(); 1573 1574 } 1575 1576 return this._inputFormatter(value, name).encode(); 1577 }; 1578 1579 /** 1580 * Should be used to decode value from bytes 1581 * 1582 * @method decode 1583 * @param {String} bytes 1584 * @param {Number} offset in bytes 1585 * @param {String} name type name 1586 * @returns {Object} decoded value 1587 */ 1588 SolidityType.prototype.decode = function (bytes, offset, name) { 1589 var self = this; 1590 1591 if (this.isDynamicArray(name)) { 1592 1593 return (function () { 1594 var arrayOffset = parseInt('0x' + bytes.substr(offset * 2, 64)); // in bytes 1595 var length = parseInt('0x' + bytes.substr(arrayOffset * 2, 64)); // in int 1596 var arrayStart = arrayOffset + 32; // array starts after length; // in bytes 1597 1598 var nestedName = self.nestedName(name); 1599 var nestedStaticPartLength = self.staticPartLength(nestedName); // in bytes 1600 var roundedNestedStaticPartLength = Math.floor((nestedStaticPartLength + 31) / 32) * 32; 1601 var result = []; 1602 1603 for (var i = 0; i < length * roundedNestedStaticPartLength; i += roundedNestedStaticPartLength) { 1604 result.push(self.decode(bytes, arrayStart + i, nestedName)); 1605 } 1606 1607 return result; 1608 })(); 1609 1610 } else if (this.isStaticArray(name)) { 1611 1612 return (function () { 1613 var length = self.staticArrayLength(name); // in int 1614 var arrayStart = offset; // in bytes 1615 1616 var nestedName = self.nestedName(name); 1617 var nestedStaticPartLength = self.staticPartLength(nestedName); // in bytes 1618 var roundedNestedStaticPartLength = Math.floor((nestedStaticPartLength + 31) / 32) * 32; 1619 var result = []; 1620 1621 for (var i = 0; i < length * roundedNestedStaticPartLength; i += roundedNestedStaticPartLength) { 1622 result.push(self.decode(bytes, arrayStart + i, nestedName)); 1623 } 1624 1625 return result; 1626 })(); 1627 } else if (this.isDynamicType(name)) { 1628 1629 return (function () { 1630 var dynamicOffset = parseInt('0x' + bytes.substr(offset * 2, 64)); // in bytes 1631 var length = parseInt('0x' + bytes.substr(dynamicOffset * 2, 64)); // in bytes 1632 var roundedLength = Math.floor((length + 31) / 32); // in int 1633 var param = new SolidityParam(bytes.substr(dynamicOffset * 2, ( 1 + roundedLength) * 64), 0); 1634 return self._outputFormatter(param, name); 1635 })(); 1636 } 1637 1638 var length = this.staticPartLength(name); 1639 var param = new SolidityParam(bytes.substr(offset * 2, length * 2)); 1640 return this._outputFormatter(param, name); 1641 }; 1642 1643 module.exports = SolidityType; 1644 1645 },{"./formatters":9,"./param":11}],15:[function(require,module,exports){ 1646 var f = require('./formatters'); 1647 var SolidityType = require('./type'); 1648 1649 /** 1650 * SolidityTypeUInt is a prootype that represents uint type 1651 * It matches: 1652 * uint 1653 * uint[] 1654 * uint[4] 1655 * uint[][] 1656 * uint[3][] 1657 * uint[][6][], ... 1658 * uint32 1659 * uint64[] 1660 * uint8[4] 1661 * uint256[][] 1662 * uint[3][] 1663 * uint64[][6][], ... 1664 */ 1665 var SolidityTypeUInt = function () { 1666 this._inputFormatter = f.formatInputInt; 1667 this._outputFormatter = f.formatOutputUInt; 1668 }; 1669 1670 SolidityTypeUInt.prototype = new SolidityType({}); 1671 SolidityTypeUInt.prototype.constructor = SolidityTypeUInt; 1672 1673 SolidityTypeUInt.prototype.isType = function (name) { 1674 return !!name.match(/^uint([0-9]*)?(\[([0-9]*)\])*$/); 1675 }; 1676 1677 module.exports = SolidityTypeUInt; 1678 1679 },{"./formatters":9,"./type":14}],16:[function(require,module,exports){ 1680 var f = require('./formatters'); 1681 var SolidityType = require('./type'); 1682 1683 /** 1684 * SolidityTypeUReal is a prootype that represents ureal type 1685 * It matches: 1686 * ureal 1687 * ureal[] 1688 * ureal[4] 1689 * ureal[][] 1690 * ureal[3][] 1691 * ureal[][6][], ... 1692 * ureal32 1693 * ureal64[] 1694 * ureal8[4] 1695 * ureal256[][] 1696 * ureal[3][] 1697 * ureal64[][6][], ... 1698 */ 1699 var SolidityTypeUReal = function () { 1700 this._inputFormatter = f.formatInputReal; 1701 this._outputFormatter = f.formatOutputUReal; 1702 }; 1703 1704 SolidityTypeUReal.prototype = new SolidityType({}); 1705 SolidityTypeUReal.prototype.constructor = SolidityTypeUReal; 1706 1707 SolidityTypeUReal.prototype.isType = function (name) { 1708 return !!name.match(/^ureal([0-9]*)?(\[([0-9]*)\])*$/); 1709 }; 1710 1711 module.exports = SolidityTypeUReal; 1712 1713 },{"./formatters":9,"./type":14}],17:[function(require,module,exports){ 1714 'use strict'; 1715 1716 // go env doesn't have and need XMLHttpRequest 1717 if (typeof XMLHttpRequest === 'undefined') { 1718 exports.XMLHttpRequest = {}; 1719 } else { 1720 exports.XMLHttpRequest = XMLHttpRequest; // jshint ignore:line 1721 } 1722 1723 1724 },{}],18:[function(require,module,exports){ 1725 /* 1726 This file is part of web3.js. 1727 1728 web3.js is free software: you can redistribute it and/or modify 1729 it under the terms of the GNU Lesser General Public License as published by 1730 the Free Software Foundation, either version 3 of the License, or 1731 (at your option) any later version. 1732 1733 web3.js is distributed in the hope that it will be useful, 1734 but WITHOUT ANY WARRANTY; without even the implied warranty of 1735 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 1736 GNU Lesser General Public License for more details. 1737 1738 You should have received a copy of the GNU Lesser General Public License 1739 along with web3.js. If not, see <http://www.gnu.org/licenses/>. 1740 */ 1741 /** @file config.js 1742 * @authors: 1743 * Marek Kotewicz <marek@ethdev.com> 1744 * @date 2015 1745 */ 1746 1747 /** 1748 * Utils 1749 * 1750 * @module utils 1751 */ 1752 1753 /** 1754 * Utility functions 1755 * 1756 * @class [utils] config 1757 * @constructor 1758 */ 1759 1760 1761 /// required to define ETH_BIGNUMBER_ROUNDING_MODE 1762 var BigNumber = require('bignumber.js'); 1763 1764 var ETH_UNITS = [ 1765 'wei', 1766 'kwei', 1767 'Mwei', 1768 'Gwei', 1769 'szabo', 1770 'finney', 1771 'femtoether', 1772 'picoether', 1773 'nanoether', 1774 'microether', 1775 'milliether', 1776 'nano', 1777 'micro', 1778 'milli', 1779 'ether', 1780 'grand', 1781 'Mether', 1782 'Gether', 1783 'Tether', 1784 'Pether', 1785 'Eether', 1786 'Zether', 1787 'Yether', 1788 'Nether', 1789 'Dether', 1790 'Vether', 1791 'Uether' 1792 ]; 1793 1794 module.exports = { 1795 ETH_PADDING: 32, 1796 ETH_SIGNATURE_LENGTH: 4, 1797 ETH_UNITS: ETH_UNITS, 1798 ETH_BIGNUMBER_ROUNDING_MODE: { ROUNDING_MODE: BigNumber.ROUND_DOWN }, 1799 ETH_POLLING_TIMEOUT: 1000/2, 1800 defaultBlock: 'latest', 1801 defaultAccount: undefined 1802 }; 1803 1804 1805 },{"bignumber.js":"bignumber.js"}],19:[function(require,module,exports){ 1806 /* 1807 This file is part of web3.js. 1808 1809 web3.js is free software: you can redistribute it and/or modify 1810 it under the terms of the GNU Lesser General Public License as published by 1811 the Free Software Foundation, either version 3 of the License, or 1812 (at your option) any later version. 1813 1814 web3.js is distributed in the hope that it will be useful, 1815 but WITHOUT ANY WARRANTY; without even the implied warranty of 1816 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 1817 GNU Lesser General Public License for more details. 1818 1819 You should have received a copy of the GNU Lesser General Public License 1820 along with web3.js. If not, see <http://www.gnu.org/licenses/>. 1821 */ 1822 /** 1823 * @file sha3.js 1824 * @author Marek Kotewicz <marek@ethdev.com> 1825 * @date 2015 1826 */ 1827 1828 var CryptoJS = require('crypto-js'); 1829 var sha3 = require('crypto-js/sha3'); 1830 1831 module.exports = function (value, options) { 1832 if (options && options.encoding === 'hex') { 1833 if (value.length > 2 && value.substr(0, 2) === '0x') { 1834 value = value.substr(2); 1835 } 1836 value = CryptoJS.enc.Hex.parse(value); 1837 } 1838 1839 return sha3(value, { 1840 outputLength: 256 1841 }).toString(); 1842 }; 1843 1844 1845 },{"crypto-js":59,"crypto-js/sha3":80}],20:[function(require,module,exports){ 1846 /* 1847 This file is part of web3.js. 1848 1849 web3.js is free software: you can redistribute it and/or modify 1850 it under the terms of the GNU Lesser General Public License as published by 1851 the Free Software Foundation, either version 3 of the License, or 1852 (at your option) any later version. 1853 1854 web3.js is distributed in the hope that it will be useful, 1855 but WITHOUT ANY WARRANTY; without even the implied warranty of 1856 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 1857 GNU Lesser General Public License for more details. 1858 1859 You should have received a copy of the GNU Lesser General Public License 1860 along with web3.js. If not, see <http://www.gnu.org/licenses/>. 1861 */ 1862 /** 1863 * @file utils.js 1864 * @author Marek Kotewicz <marek@ethdev.com> 1865 * @date 2015 1866 */ 1867 1868 /** 1869 * Utils 1870 * 1871 * @module utils 1872 */ 1873 1874 /** 1875 * Utility functions 1876 * 1877 * @class [utils] utils 1878 * @constructor 1879 */ 1880 1881 1882 var BigNumber = require('bignumber.js'); 1883 var sha3 = require('./sha3.js'); 1884 var utf8 = require('utf8'); 1885 1886 var unitMap = { 1887 'noether': '0', 1888 'wei': '1', 1889 'kwei': '1000', 1890 'Kwei': '1000', 1891 'babbage': '1000', 1892 'femtoether': '1000', 1893 'mwei': '1000000', 1894 'Mwei': '1000000', 1895 'lovelace': '1000000', 1896 'picoether': '1000000', 1897 'gwei': '1000000000', 1898 'Gwei': '1000000000', 1899 'shannon': '1000000000', 1900 'nanoether': '1000000000', 1901 'nano': '1000000000', 1902 'szabo': '1000000000000', 1903 'microether': '1000000000000', 1904 'micro': '1000000000000', 1905 'finney': '1000000000000000', 1906 'milliether': '1000000000000000', 1907 'milli': '1000000000000000', 1908 'ether': '1000000000000000000', 1909 'kether': '1000000000000000000000', 1910 'grand': '1000000000000000000000', 1911 'mether': '1000000000000000000000000', 1912 'gether': '1000000000000000000000000000', 1913 'tether': '1000000000000000000000000000000' 1914 }; 1915 1916 /** 1917 * Should be called to pad string to expected length 1918 * 1919 * @method padLeft 1920 * @param {String} string to be padded 1921 * @param {Number} characters that result string should have 1922 * @param {String} sign, by default 0 1923 * @returns {String} right aligned string 1924 */ 1925 var padLeft = function (string, chars, sign) { 1926 return new Array(chars - string.length + 1).join(sign ? sign : "0") + string; 1927 }; 1928 1929 /** 1930 * Should be called to pad string to expected length 1931 * 1932 * @method padRight 1933 * @param {String} string to be padded 1934 * @param {Number} characters that result string should have 1935 * @param {String} sign, by default 0 1936 * @returns {String} right aligned string 1937 */ 1938 var padRight = function (string, chars, sign) { 1939 return string + (new Array(chars - string.length + 1).join(sign ? sign : "0")); 1940 }; 1941 1942 /** 1943 * Should be called to get utf8 from it's hex representation 1944 * 1945 * @method toUtf8 1946 * @param {String} string in hex 1947 * @returns {String} ascii string representation of hex value 1948 */ 1949 var toUtf8 = function(hex) { 1950 // Find termination 1951 var str = ""; 1952 var i = 0, l = hex.length; 1953 if (hex.substring(0, 2) === '0x') { 1954 i = 2; 1955 } 1956 for (; i < l; i+=2) { 1957 var code = parseInt(hex.substr(i, 2), 16); 1958 if (code === 0) 1959 break; 1960 str += String.fromCharCode(code); 1961 } 1962 1963 return utf8.decode(str); 1964 }; 1965 1966 /** 1967 * Should be called to get ascii from it's hex representation 1968 * 1969 * @method toAscii 1970 * @param {String} string in hex 1971 * @returns {String} ascii string representation of hex value 1972 */ 1973 var toAscii = function(hex) { 1974 // Find termination 1975 var str = ""; 1976 var i = 0, l = hex.length; 1977 if (hex.substring(0, 2) === '0x') { 1978 i = 2; 1979 } 1980 for (; i < l; i+=2) { 1981 var code = parseInt(hex.substr(i, 2), 16); 1982 str += String.fromCharCode(code); 1983 } 1984 1985 return str; 1986 }; 1987 1988 /** 1989 * Should be called to get hex representation (prefixed by 0x) of utf8 string 1990 * 1991 * @method fromUtf8 1992 * @param {String} string 1993 * @param {Number} optional padding 1994 * @returns {String} hex representation of input string 1995 */ 1996 var fromUtf8 = function(str) { 1997 str = utf8.encode(str); 1998 var hex = ""; 1999 for(var i = 0; i < str.length; i++) { 2000 var code = str.charCodeAt(i); 2001 if (code === 0) 2002 break; 2003 var n = code.toString(16); 2004 hex += n.length < 2 ? '0' + n : n; 2005 } 2006 2007 return "0x" + hex; 2008 }; 2009 2010 /** 2011 * Should be called to get hex representation (prefixed by 0x) of ascii string 2012 * 2013 * @method fromAscii 2014 * @param {String} string 2015 * @param {Number} optional padding 2016 * @returns {String} hex representation of input string 2017 */ 2018 var fromAscii = function(str) { 2019 var hex = ""; 2020 for(var i = 0; i < str.length; i++) { 2021 var code = str.charCodeAt(i); 2022 var n = code.toString(16); 2023 hex += n.length < 2 ? '0' + n : n; 2024 } 2025 2026 return "0x" + hex; 2027 }; 2028 2029 /** 2030 * Should be used to create full function/event name from json abi 2031 * 2032 * @method transformToFullName 2033 * @param {Object} json-abi 2034 * @return {String} full fnction/event name 2035 */ 2036 var transformToFullName = function (json) { 2037 if (json.name.indexOf('(') !== -1) { 2038 return json.name; 2039 } 2040 2041 var typeName = json.inputs.map(function(i){return i.type; }).join(); 2042 return json.name + '(' + typeName + ')'; 2043 }; 2044 2045 /** 2046 * Should be called to get display name of contract function 2047 * 2048 * @method extractDisplayName 2049 * @param {String} name of function/event 2050 * @returns {String} display name for function/event eg. multiply(uint256) -> multiply 2051 */ 2052 var extractDisplayName = function (name) { 2053 var length = name.indexOf('('); 2054 return length !== -1 ? name.substr(0, length) : name; 2055 }; 2056 2057 /// @returns overloaded part of function/event name 2058 var extractTypeName = function (name) { 2059 /// TODO: make it invulnerable 2060 var length = name.indexOf('('); 2061 return length !== -1 ? name.substr(length + 1, name.length - 1 - (length + 1)).replace(' ', '') : ""; 2062 }; 2063 2064 /** 2065 * Converts value to it's decimal representation in string 2066 * 2067 * @method toDecimal 2068 * @param {String|Number|BigNumber} 2069 * @return {String} 2070 */ 2071 var toDecimal = function (value) { 2072 return toBigNumber(value).toNumber(); 2073 }; 2074 2075 /** 2076 * Converts value to it's hex representation 2077 * 2078 * @method fromDecimal 2079 * @param {String|Number|BigNumber} 2080 * @return {String} 2081 */ 2082 var fromDecimal = function (value) { 2083 var number = toBigNumber(value); 2084 var result = number.toString(16); 2085 2086 return number.lessThan(0) ? '-0x' + result.substr(1) : '0x' + result; 2087 }; 2088 2089 /** 2090 * Auto converts any given value into it's hex representation. 2091 * 2092 * And even stringifys objects before. 2093 * 2094 * @method toHex 2095 * @param {String|Number|BigNumber|Object} 2096 * @return {String} 2097 */ 2098 var toHex = function (val) { 2099 /*jshint maxcomplexity: 8 */ 2100 2101 if (isBoolean(val)) 2102 return fromDecimal(+val); 2103 2104 if (isBigNumber(val)) 2105 return fromDecimal(val); 2106 2107 if (typeof val === 'object') 2108 return fromUtf8(JSON.stringify(val)); 2109 2110 // if its a negative number, pass it through fromDecimal 2111 if (isString(val)) { 2112 if (val.indexOf('-0x') === 0) 2113 return fromDecimal(val); 2114 else if(val.indexOf('0x') === 0) 2115 return val; 2116 else if (!isFinite(val)) 2117 return fromAscii(val); 2118 } 2119 2120 return fromDecimal(val); 2121 }; 2122 2123 /** 2124 * Returns value of unit in Wei 2125 * 2126 * @method getValueOfUnit 2127 * @param {String} unit the unit to convert to, default ether 2128 * @returns {BigNumber} value of the unit (in Wei) 2129 * @throws error if the unit is not correct:w 2130 */ 2131 var getValueOfUnit = function (unit) { 2132 unit = unit ? unit.toLowerCase() : 'ether'; 2133 var unitValue = unitMap[unit]; 2134 if (unitValue === undefined) { 2135 throw new Error('This unit doesn\'t exists, please use the one of the following units' + JSON.stringify(unitMap, null, 2)); 2136 } 2137 return new BigNumber(unitValue, 10); 2138 }; 2139 2140 /** 2141 * Takes a number of wei and converts it to any other ether unit. 2142 * 2143 * Possible units are: 2144 * SI Short SI Full Effigy Other 2145 * - kwei femtoether babbage 2146 * - mwei picoether lovelace 2147 * - gwei nanoether shannon nano 2148 * - -- microether szabo micro 2149 * - -- milliether finney milli 2150 * - ether -- -- 2151 * - kether -- grand 2152 * - mether 2153 * - gether 2154 * - tether 2155 * 2156 * @method fromWei 2157 * @param {Number|String} number can be a number, number string or a HEX of a decimal 2158 * @param {String} unit the unit to convert to, default ether 2159 * @return {String|Object} When given a BigNumber object it returns one as well, otherwise a number 2160 */ 2161 var fromWei = function(number, unit) { 2162 var returnValue = toBigNumber(number).dividedBy(getValueOfUnit(unit)); 2163 2164 return isBigNumber(number) ? returnValue : returnValue.toString(10); 2165 }; 2166 2167 /** 2168 * Takes a number of a unit and converts it to wei. 2169 * 2170 * Possible units are: 2171 * SI Short SI Full Effigy Other 2172 * - kwei femtoether babbage 2173 * - mwei picoether lovelace 2174 * - gwei nanoether shannon nano 2175 * - -- microether szabo micro 2176 * - -- microether szabo micro 2177 * - -- milliether finney milli 2178 * - ether -- -- 2179 * - kether -- grand 2180 * - mether 2181 * - gether 2182 * - tether 2183 * 2184 * @method toWei 2185 * @param {Number|String|BigNumber} number can be a number, number string or a HEX of a decimal 2186 * @param {String} unit the unit to convert from, default ether 2187 * @return {String|Object} When given a BigNumber object it returns one as well, otherwise a number 2188 */ 2189 var toWei = function(number, unit) { 2190 var returnValue = toBigNumber(number).times(getValueOfUnit(unit)); 2191 2192 return isBigNumber(number) ? returnValue : returnValue.toString(10); 2193 }; 2194 2195 /** 2196 * Takes an input and transforms it into a bignumber 2197 * 2198 * @method toBigNumber 2199 * @param {Number|String|BigNumber} a number, string, HEX string or BigNumber 2200 * @return {BigNumber} BigNumber 2201 */ 2202 var toBigNumber = function(number) { 2203 /*jshint maxcomplexity:5 */ 2204 number = number || 0; 2205 if (isBigNumber(number)) 2206 return number; 2207 2208 if (isString(number) && (number.indexOf('0x') === 0 || number.indexOf('-0x') === 0)) { 2209 return new BigNumber(number.replace('0x',''), 16); 2210 } 2211 2212 return new BigNumber(number.toString(10), 10); 2213 }; 2214 2215 /** 2216 * Takes and input transforms it into bignumber and if it is negative value, into two's complement 2217 * 2218 * @method toTwosComplement 2219 * @param {Number|String|BigNumber} 2220 * @return {BigNumber} 2221 */ 2222 var toTwosComplement = function (number) { 2223 var bigNumber = toBigNumber(number).round(); 2224 if (bigNumber.lessThan(0)) { 2225 return new BigNumber("ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", 16).plus(bigNumber).plus(1); 2226 } 2227 return bigNumber; 2228 }; 2229 2230 /** 2231 * Checks if the given string is strictly an address 2232 * 2233 * @method isStrictAddress 2234 * @param {String} address the given HEX address 2235 * @return {Boolean} 2236 */ 2237 var isStrictAddress = function (address) { 2238 return /^0x[0-9a-f]{40}$/i.test(address); 2239 }; 2240 2241 /** 2242 * Checks if the given string is an address 2243 * 2244 * @method isAddress 2245 * @param {String} address the given HEX address 2246 * @return {Boolean} 2247 */ 2248 var isAddress = function (address) { 2249 if (!/^(0x)?[0-9a-f]{40}$/i.test(address)) { 2250 // check if it has the basic requirements of an address 2251 return false; 2252 } else if (/^(0x)?[0-9a-f]{40}$/.test(address) || /^(0x)?[0-9A-F]{40}$/.test(address)) { 2253 // If it's all small caps or all caps, return true 2254 return true; 2255 } else { 2256 // Otherwise check each case 2257 return isChecksumAddress(address); 2258 } 2259 }; 2260 2261 /** 2262 * Checks if the given string is a checksummed address 2263 * 2264 * @method isChecksumAddress 2265 * @param {String} address the given HEX address 2266 * @return {Boolean} 2267 */ 2268 var isChecksumAddress = function (address) { 2269 // Check each case 2270 address = address.replace('0x',''); 2271 var addressHash = sha3(address.toLowerCase()); 2272 2273 for (var i = 0; i < 40; i++ ) { 2274 // the nth letter should be uppercase if the nth digit of casemap is 1 2275 if ((parseInt(addressHash[i], 16) > 7 && address[i].toUpperCase() !== address[i]) || (parseInt(addressHash[i], 16) <= 7 && address[i].toLowerCase() !== address[i])) { 2276 return false; 2277 } 2278 } 2279 return true; 2280 }; 2281 2282 2283 2284 /** 2285 * Makes a checksum address 2286 * 2287 * @method toChecksumAddress 2288 * @param {String} address the given HEX address 2289 * @return {String} 2290 */ 2291 var toChecksumAddress = function (address) { 2292 if (typeof address === 'undefined') return ''; 2293 2294 address = address.toLowerCase().replace('0x',''); 2295 var addressHash = sha3(address); 2296 var checksumAddress = '0x'; 2297 2298 for (var i = 0; i < address.length; i++ ) { 2299 // If ith character is 9 to f then make it uppercase 2300 if (parseInt(addressHash[i], 16) > 7) { 2301 checksumAddress += address[i].toUpperCase(); 2302 } else { 2303 checksumAddress += address[i]; 2304 } 2305 } 2306 return checksumAddress; 2307 }; 2308 2309 /** 2310 * Transforms given string to valid 20 bytes-length addres with 0x prefix 2311 * 2312 * @method toAddress 2313 * @param {String} address 2314 * @return {String} formatted address 2315 */ 2316 var toAddress = function (address) { 2317 if (isStrictAddress(address)) { 2318 return address; 2319 } 2320 2321 if (/^[0-9a-f]{40}$/.test(address)) { 2322 return '0x' + address; 2323 } 2324 2325 return '0x' + padLeft(toHex(address).substr(2), 40); 2326 }; 2327 2328 /** 2329 * Returns true if object is BigNumber, otherwise false 2330 * 2331 * @method isBigNumber 2332 * @param {Object} 2333 * @return {Boolean} 2334 */ 2335 var isBigNumber = function (object) { 2336 return object instanceof BigNumber || 2337 (object && object.constructor && object.constructor.name === 'BigNumber'); 2338 }; 2339 2340 /** 2341 * Returns true if object is string, otherwise false 2342 * 2343 * @method isString 2344 * @param {Object} 2345 * @return {Boolean} 2346 */ 2347 var isString = function (object) { 2348 return typeof object === 'string' || 2349 (object && object.constructor && object.constructor.name === 'String'); 2350 }; 2351 2352 /** 2353 * Returns true if object is function, otherwise false 2354 * 2355 * @method isFunction 2356 * @param {Object} 2357 * @return {Boolean} 2358 */ 2359 var isFunction = function (object) { 2360 return typeof object === 'function'; 2361 }; 2362 2363 /** 2364 * Returns true if object is Objet, otherwise false 2365 * 2366 * @method isObject 2367 * @param {Object} 2368 * @return {Boolean} 2369 */ 2370 var isObject = function (object) { 2371 return object !== null && !(object instanceof Array) && typeof object === 'object'; 2372 }; 2373 2374 /** 2375 * Returns true if object is boolean, otherwise false 2376 * 2377 * @method isBoolean 2378 * @param {Object} 2379 * @return {Boolean} 2380 */ 2381 var isBoolean = function (object) { 2382 return typeof object === 'boolean'; 2383 }; 2384 2385 /** 2386 * Returns true if object is array, otherwise false 2387 * 2388 * @method isArray 2389 * @param {Object} 2390 * @return {Boolean} 2391 */ 2392 var isArray = function (object) { 2393 return object instanceof Array; 2394 }; 2395 2396 /** 2397 * Returns true if given string is valid json object 2398 * 2399 * @method isJson 2400 * @param {String} 2401 * @return {Boolean} 2402 */ 2403 var isJson = function (str) { 2404 try { 2405 return !!JSON.parse(str); 2406 } catch (e) { 2407 return false; 2408 } 2409 }; 2410 2411 /** 2412 * Returns true if given string is a valid Ethereum block header bloom. 2413 * 2414 * @method isBloom 2415 * @param {String} hex encoded bloom filter 2416 * @return {Boolean} 2417 */ 2418 var isBloom = function (bloom) { 2419 if (!/^(0x)?[0-9a-f]{512}$/i.test(bloom)) { 2420 return false; 2421 } else if (/^(0x)?[0-9a-f]{512}$/.test(bloom) || /^(0x)?[0-9A-F]{512}$/.test(bloom)) { 2422 return true; 2423 } 2424 return false; 2425 }; 2426 2427 /** 2428 * Returns true if given string is a valid log topic. 2429 * 2430 * @method isTopic 2431 * @param {String} hex encoded topic 2432 * @return {Boolean} 2433 */ 2434 var isTopic = function (topic) { 2435 if (!/^(0x)?[0-9a-f]{64}$/i.test(topic)) { 2436 return false; 2437 } else if (/^(0x)?[0-9a-f]{64}$/.test(topic) || /^(0x)?[0-9A-F]{64}$/.test(topic)) { 2438 return true; 2439 } 2440 return false; 2441 }; 2442 2443 module.exports = { 2444 padLeft: padLeft, 2445 padRight: padRight, 2446 toHex: toHex, 2447 toDecimal: toDecimal, 2448 fromDecimal: fromDecimal, 2449 toUtf8: toUtf8, 2450 toAscii: toAscii, 2451 fromUtf8: fromUtf8, 2452 fromAscii: fromAscii, 2453 transformToFullName: transformToFullName, 2454 extractDisplayName: extractDisplayName, 2455 extractTypeName: extractTypeName, 2456 toWei: toWei, 2457 fromWei: fromWei, 2458 toBigNumber: toBigNumber, 2459 toTwosComplement: toTwosComplement, 2460 toAddress: toAddress, 2461 isBigNumber: isBigNumber, 2462 isStrictAddress: isStrictAddress, 2463 isAddress: isAddress, 2464 isChecksumAddress: isChecksumAddress, 2465 toChecksumAddress: toChecksumAddress, 2466 isFunction: isFunction, 2467 isString: isString, 2468 isObject: isObject, 2469 isBoolean: isBoolean, 2470 isArray: isArray, 2471 isJson: isJson, 2472 isBloom: isBloom, 2473 isTopic: isTopic, 2474 }; 2475 2476 },{"./sha3.js":19,"bignumber.js":"bignumber.js","utf8":85}],21:[function(require,module,exports){ 2477 module.exports={ 2478 "version": "0.20.1" 2479 } 2480 2481 },{}],22:[function(require,module,exports){ 2482 /* 2483 This file is part of web3.js. 2484 2485 web3.js is free software: you can redistribute it and/or modify 2486 it under the terms of the GNU Lesser General Public License as published by 2487 the Free Software Foundation, either version 3 of the License, or 2488 (at your option) any later version. 2489 2490 web3.js is distributed in the hope that it will be useful, 2491 but WITHOUT ANY WARRANTY; without even the implied warranty of 2492 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 2493 GNU Lesser General Public License for more details. 2494 2495 You should have received a copy of the GNU Lesser General Public License 2496 along with web3.js. If not, see <http://www.gnu.org/licenses/>. 2497 */ 2498 /** 2499 * @file web3.js 2500 * @authors: 2501 * Jeffrey Wilcke <jeff@ethdev.com> 2502 * Marek Kotewicz <marek@ethdev.com> 2503 * Marian Oancea <marian@ethdev.com> 2504 * Fabian Vogelsteller <fabian@ethdev.com> 2505 * Gav Wood <g@ethdev.com> 2506 * @date 2014 2507 */ 2508 2509 var RequestManager = require('./web3/requestmanager'); 2510 var Iban = require('./web3/iban'); 2511 var Eth = require('./web3/methods/eth'); 2512 var DB = require('./web3/methods/db'); 2513 var Shh = require('./web3/methods/shh'); 2514 var Net = require('./web3/methods/net'); 2515 var Personal = require('./web3/methods/personal'); 2516 var Swarm = require('./web3/methods/swarm'); 2517 var Settings = require('./web3/settings'); 2518 var version = require('./version.json'); 2519 var utils = require('./utils/utils'); 2520 var sha3 = require('./utils/sha3'); 2521 var extend = require('./web3/extend'); 2522 var Batch = require('./web3/batch'); 2523 var Property = require('./web3/property'); 2524 var HttpProvider = require('./web3/httpprovider'); 2525 var IpcProvider = require('./web3/ipcprovider'); 2526 var BigNumber = require('bignumber.js'); 2527 2528 2529 2530 function Web3 (provider) { 2531 this._requestManager = new RequestManager(provider); 2532 this.currentProvider = provider; 2533 this.eth = new Eth(this); 2534 this.db = new DB(this); 2535 this.shh = new Shh(this); 2536 this.net = new Net(this); 2537 this.personal = new Personal(this); 2538 this.bzz = new Swarm(this); 2539 this.settings = new Settings(); 2540 this.version = { 2541 api: version.version 2542 }; 2543 this.providers = { 2544 HttpProvider: HttpProvider, 2545 IpcProvider: IpcProvider 2546 }; 2547 this._extend = extend(this); 2548 this._extend({ 2549 properties: properties() 2550 }); 2551 } 2552 2553 // expose providers on the class 2554 Web3.providers = { 2555 HttpProvider: HttpProvider, 2556 IpcProvider: IpcProvider 2557 }; 2558 2559 Web3.prototype.setProvider = function (provider) { 2560 this._requestManager.setProvider(provider); 2561 this.currentProvider = provider; 2562 }; 2563 2564 Web3.prototype.reset = function (keepIsSyncing) { 2565 this._requestManager.reset(keepIsSyncing); 2566 this.settings = new Settings(); 2567 }; 2568 2569 Web3.prototype.BigNumber = BigNumber; 2570 Web3.prototype.toHex = utils.toHex; 2571 Web3.prototype.toAscii = utils.toAscii; 2572 Web3.prototype.toUtf8 = utils.toUtf8; 2573 Web3.prototype.fromAscii = utils.fromAscii; 2574 Web3.prototype.fromUtf8 = utils.fromUtf8; 2575 Web3.prototype.toDecimal = utils.toDecimal; 2576 Web3.prototype.fromDecimal = utils.fromDecimal; 2577 Web3.prototype.toBigNumber = utils.toBigNumber; 2578 Web3.prototype.toWei = utils.toWei; 2579 Web3.prototype.fromWei = utils.fromWei; 2580 Web3.prototype.isAddress = utils.isAddress; 2581 Web3.prototype.isChecksumAddress = utils.isChecksumAddress; 2582 Web3.prototype.toChecksumAddress = utils.toChecksumAddress; 2583 Web3.prototype.isIBAN = utils.isIBAN; 2584 Web3.prototype.padLeft = utils.padLeft; 2585 Web3.prototype.padRight = utils.padRight; 2586 2587 2588 Web3.prototype.sha3 = function(string, options) { 2589 return '0x' + sha3(string, options); 2590 }; 2591 2592 /** 2593 * Transforms direct icap to address 2594 */ 2595 Web3.prototype.fromICAP = function (icap) { 2596 var iban = new Iban(icap); 2597 return iban.address(); 2598 }; 2599 2600 var properties = function () { 2601 return [ 2602 new Property({ 2603 name: 'version.node', 2604 getter: 'web3_clientVersion' 2605 }), 2606 new Property({ 2607 name: 'version.network', 2608 getter: 'net_version', 2609 inputFormatter: utils.toDecimal 2610 }), 2611 new Property({ 2612 name: 'version.ethereum', 2613 getter: 'eth_protocolVersion', 2614 inputFormatter: utils.toDecimal 2615 }), 2616 new Property({ 2617 name: 'version.whisper', 2618 getter: 'shh_version', 2619 inputFormatter: utils.toDecimal 2620 }) 2621 ]; 2622 }; 2623 2624 Web3.prototype.isConnected = function(){ 2625 return (this.currentProvider && this.currentProvider.isConnected()); 2626 }; 2627 2628 Web3.prototype.createBatch = function () { 2629 return new Batch(this); 2630 }; 2631 2632 module.exports = Web3; 2633 2634 2635 },{"./utils/sha3":19,"./utils/utils":20,"./version.json":21,"./web3/batch":24,"./web3/extend":28,"./web3/httpprovider":32,"./web3/iban":33,"./web3/ipcprovider":34,"./web3/methods/db":37,"./web3/methods/eth":38,"./web3/methods/net":39,"./web3/methods/personal":40,"./web3/methods/shh":41,"./web3/methods/swarm":42,"./web3/property":45,"./web3/requestmanager":46,"./web3/settings":47,"bignumber.js":"bignumber.js"}],23:[function(require,module,exports){ 2636 /* 2637 This file is part of web3.js. 2638 2639 web3.js is free software: you can redistribute it and/or modify 2640 it under the terms of the GNU Lesser General Public License as published by 2641 the Free Software Foundation, either version 3 of the License, or 2642 (at your option) any later version. 2643 2644 web3.js is distributed in the hope that it will be useful, 2645 but WITHOUT ANY WARRANTY; without even the implied warranty of 2646 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 2647 GNU Lesser General Public License for more details. 2648 2649 You should have received a copy of the GNU Lesser General Public License 2650 along with web3.js. If not, see <http://www.gnu.org/licenses/>. 2651 */ 2652 /** 2653 * @file allevents.js 2654 * @author Marek Kotewicz <marek@ethdev.com> 2655 * @date 2014 2656 */ 2657 2658 var sha3 = require('../utils/sha3'); 2659 var SolidityEvent = require('./event'); 2660 var formatters = require('./formatters'); 2661 var utils = require('../utils/utils'); 2662 var Filter = require('./filter'); 2663 var watches = require('./methods/watches'); 2664 2665 var AllSolidityEvents = function (requestManager, json, address) { 2666 this._requestManager = requestManager; 2667 this._json = json; 2668 this._address = address; 2669 }; 2670 2671 AllSolidityEvents.prototype.encode = function (options) { 2672 options = options || {}; 2673 var result = {}; 2674 2675 ['fromBlock', 'toBlock'].filter(function (f) { 2676 return options[f] !== undefined; 2677 }).forEach(function (f) { 2678 result[f] = formatters.inputBlockNumberFormatter(options[f]); 2679 }); 2680 2681 result.address = this._address; 2682 2683 return result; 2684 }; 2685 2686 AllSolidityEvents.prototype.decode = function (data) { 2687 data.data = data.data || ''; 2688 data.topics = data.topics || []; 2689 2690 var eventTopic = data.topics[0].slice(2); 2691 var match = this._json.filter(function (j) { 2692 return eventTopic === sha3(utils.transformToFullName(j)); 2693 })[0]; 2694 2695 if (!match) { // cannot find matching event? 2696 console.warn('cannot find event for log'); 2697 return data; 2698 } 2699 2700 var event = new SolidityEvent(this._requestManager, match, this._address); 2701 return event.decode(data); 2702 }; 2703 2704 AllSolidityEvents.prototype.execute = function (options, callback) { 2705 2706 if (utils.isFunction(arguments[arguments.length - 1])) { 2707 callback = arguments[arguments.length - 1]; 2708 if(arguments.length === 1) 2709 options = null; 2710 } 2711 2712 var o = this.encode(options); 2713 var formatter = this.decode.bind(this); 2714 return new Filter(o, 'eth', this._requestManager, watches.eth(), formatter, callback); 2715 }; 2716 2717 AllSolidityEvents.prototype.attachToContract = function (contract) { 2718 var execute = this.execute.bind(this); 2719 contract.allEvents = execute; 2720 }; 2721 2722 module.exports = AllSolidityEvents; 2723 2724 2725 },{"../utils/sha3":19,"../utils/utils":20,"./event":27,"./filter":29,"./formatters":30,"./methods/watches":43}],24:[function(require,module,exports){ 2726 /* 2727 This file is part of web3.js. 2728 2729 web3.js is free software: you can redistribute it and/or modify 2730 it under the terms of the GNU Lesser General Public License as published by 2731 the Free Software Foundation, either version 3 of the License, or 2732 (at your option) any later version. 2733 2734 web3.js is distributed in the hope that it will be useful, 2735 but WITHOUT ANY WARRANTY; without even the implied warranty of 2736 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 2737 GNU Lesser General Public License for more details. 2738 2739 You should have received a copy of the GNU Lesser General Public License 2740 along with web3.js. If not, see <http://www.gnu.org/licenses/>. 2741 */ 2742 /** 2743 * @file batch.js 2744 * @author Marek Kotewicz <marek@ethdev.com> 2745 * @date 2015 2746 */ 2747 2748 var Jsonrpc = require('./jsonrpc'); 2749 var errors = require('./errors'); 2750 2751 var Batch = function (web3) { 2752 this.requestManager = web3._requestManager; 2753 this.requests = []; 2754 }; 2755 2756 /** 2757 * Should be called to add create new request to batch request 2758 * 2759 * @method add 2760 * @param {Object} jsonrpc requet object 2761 */ 2762 Batch.prototype.add = function (request) { 2763 this.requests.push(request); 2764 }; 2765 2766 /** 2767 * Should be called to execute batch request 2768 * 2769 * @method execute 2770 */ 2771 Batch.prototype.execute = function () { 2772 var requests = this.requests; 2773 this.requestManager.sendBatch(requests, function (err, results) { 2774 results = results || []; 2775 requests.map(function (request, index) { 2776 return results[index] || {}; 2777 }).forEach(function (result, index) { 2778 if (requests[index].callback) { 2779 2780 if (!Jsonrpc.isValidResponse(result)) { 2781 return requests[index].callback(errors.InvalidResponse(result)); 2782 } 2783 2784 requests[index].callback(null, (requests[index].format ? requests[index].format(result.result) : result.result)); 2785 } 2786 }); 2787 }); 2788 }; 2789 2790 module.exports = Batch; 2791 2792 2793 },{"./errors":26,"./jsonrpc":35}],25:[function(require,module,exports){ 2794 /* 2795 This file is part of web3.js. 2796 2797 web3.js is free software: you can redistribute it and/or modify 2798 it under the terms of the GNU Lesser General Public License as published by 2799 the Free Software Foundation, either version 3 of the License, or 2800 (at your option) any later version. 2801 2802 web3.js is distributed in the hope that it will be useful, 2803 but WITHOUT ANY WARRANTY; without even the implied warranty of 2804 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 2805 GNU Lesser General Public License for more details. 2806 2807 You should have received a copy of the GNU Lesser General Public License 2808 along with web3.js. If not, see <http://www.gnu.org/licenses/>. 2809 */ 2810 /** 2811 * @file contract.js 2812 * @author Marek Kotewicz <marek@ethdev.com> 2813 * @date 2014 2814 */ 2815 2816 var utils = require('../utils/utils'); 2817 var coder = require('../solidity/coder'); 2818 var SolidityEvent = require('./event'); 2819 var SolidityFunction = require('./function'); 2820 var AllEvents = require('./allevents'); 2821 2822 /** 2823 * Should be called to encode constructor params 2824 * 2825 * @method encodeConstructorParams 2826 * @param {Array} abi 2827 * @param {Array} constructor params 2828 */ 2829 var encodeConstructorParams = function (abi, params) { 2830 return abi.filter(function (json) { 2831 return json.type === 'constructor' && json.inputs.length === params.length; 2832 }).map(function (json) { 2833 return json.inputs.map(function (input) { 2834 return input.type; 2835 }); 2836 }).map(function (types) { 2837 return coder.encodeParams(types, params); 2838 })[0] || ''; 2839 }; 2840 2841 /** 2842 * Should be called to add functions to contract object 2843 * 2844 * @method addFunctionsToContract 2845 * @param {Contract} contract 2846 * @param {Array} abi 2847 */ 2848 var addFunctionsToContract = function (contract) { 2849 contract.abi.filter(function (json) { 2850 return json.type === 'function'; 2851 }).map(function (json) { 2852 return new SolidityFunction(contract._eth, json, contract.address); 2853 }).forEach(function (f) { 2854 f.attachToContract(contract); 2855 }); 2856 }; 2857 2858 /** 2859 * Should be called to add events to contract object 2860 * 2861 * @method addEventsToContract 2862 * @param {Contract} contract 2863 * @param {Array} abi 2864 */ 2865 var addEventsToContract = function (contract) { 2866 var events = contract.abi.filter(function (json) { 2867 return json.type === 'event'; 2868 }); 2869 2870 var All = new AllEvents(contract._eth._requestManager, events, contract.address); 2871 All.attachToContract(contract); 2872 2873 events.map(function (json) { 2874 return new SolidityEvent(contract._eth._requestManager, json, contract.address); 2875 }).forEach(function (e) { 2876 e.attachToContract(contract); 2877 }); 2878 }; 2879 2880 2881 /** 2882 * Should be called to check if the contract gets properly deployed on the blockchain. 2883 * 2884 * @method checkForContractAddress 2885 * @param {Object} contract 2886 * @param {Function} callback 2887 * @returns {Undefined} 2888 */ 2889 var checkForContractAddress = function(contract, callback){ 2890 var count = 0, 2891 callbackFired = false; 2892 2893 // wait for receipt 2894 var filter = contract._eth.filter('latest', function(e){ 2895 if (!e && !callbackFired) { 2896 count++; 2897 2898 // stop watching after 50 blocks (timeout) 2899 if (count > 50) { 2900 2901 filter.stopWatching(function() {}); 2902 callbackFired = true; 2903 2904 if (callback) 2905 callback(new Error('Contract transaction couldn\'t be found after 50 blocks')); 2906 else 2907 throw new Error('Contract transaction couldn\'t be found after 50 blocks'); 2908 2909 2910 } else { 2911 2912 contract._eth.getTransactionReceipt(contract.transactionHash, function(e, receipt){ 2913 if(receipt && !callbackFired) { 2914 2915 contract._eth.getCode(receipt.contractAddress, function(e, code){ 2916 /*jshint maxcomplexity: 6 */ 2917 2918 if(callbackFired || !code) 2919 return; 2920 2921 filter.stopWatching(function() {}); 2922 callbackFired = true; 2923 2924 if(code.length > 3) { 2925 2926 // console.log('Contract code deployed!'); 2927 2928 contract.address = receipt.contractAddress; 2929 2930 // attach events and methods again after we have 2931 addFunctionsToContract(contract); 2932 addEventsToContract(contract); 2933 2934 // call callback for the second time 2935 if(callback) 2936 callback(null, contract); 2937 2938 } else { 2939 if(callback) 2940 callback(new Error('The contract code couldn\'t be stored, please check your gas amount.')); 2941 else 2942 throw new Error('The contract code couldn\'t be stored, please check your gas amount.'); 2943 } 2944 }); 2945 } 2946 }); 2947 } 2948 } 2949 }); 2950 }; 2951 2952 /** 2953 * Should be called to create new ContractFactory instance 2954 * 2955 * @method ContractFactory 2956 * @param {Array} abi 2957 */ 2958 var ContractFactory = function (eth, abi) { 2959 this.eth = eth; 2960 this.abi = abi; 2961 2962 /** 2963 * Should be called to create new contract on a blockchain 2964 * 2965 * @method new 2966 * @param {Any} contract constructor param1 (optional) 2967 * @param {Any} contract constructor param2 (optional) 2968 * @param {Object} contract transaction object (required) 2969 * @param {Function} callback 2970 * @returns {Contract} returns contract instance 2971 */ 2972 this.new = function () { 2973 /*jshint maxcomplexity: 7 */ 2974 2975 var contract = new Contract(this.eth, this.abi); 2976 2977 // parse arguments 2978 var options = {}; // required! 2979 var callback; 2980 2981 var args = Array.prototype.slice.call(arguments); 2982 if (utils.isFunction(args[args.length - 1])) { 2983 callback = args.pop(); 2984 } 2985 2986 var last = args[args.length - 1]; 2987 if (utils.isObject(last) && !utils.isArray(last)) { 2988 options = args.pop(); 2989 } 2990 2991 if (options.value > 0) { 2992 var constructorAbi = abi.filter(function (json) { 2993 return json.type === 'constructor' && json.inputs.length === args.length; 2994 })[0] || {}; 2995 2996 if (!constructorAbi.payable) { 2997 throw new Error('Cannot send value to non-payable constructor'); 2998 } 2999 } 3000 3001 var bytes = encodeConstructorParams(this.abi, args); 3002 options.data += bytes; 3003 3004 if (callback) { 3005 3006 // wait for the contract address and check if the code was deployed 3007 this.eth.sendTransaction(options, function (err, hash) { 3008 if (err) { 3009 callback(err); 3010 } else { 3011 // add the transaction hash 3012 contract.transactionHash = hash; 3013 3014 // call callback for the first time 3015 callback(null, contract); 3016 3017 checkForContractAddress(contract, callback); 3018 } 3019 }); 3020 } else { 3021 var hash = this.eth.sendTransaction(options); 3022 // add the transaction hash 3023 contract.transactionHash = hash; 3024 checkForContractAddress(contract); 3025 } 3026 3027 return contract; 3028 }; 3029 3030 this.new.getData = this.getData.bind(this); 3031 }; 3032 3033 /** 3034 * Should be called to create new ContractFactory 3035 * 3036 * @method contract 3037 * @param {Array} abi 3038 * @returns {ContractFactory} new contract factory 3039 */ 3040 //var contract = function (abi) { 3041 //return new ContractFactory(abi); 3042 //}; 3043 3044 3045 3046 /** 3047 * Should be called to get access to existing contract on a blockchain 3048 * 3049 * @method at 3050 * @param {Address} contract address (required) 3051 * @param {Function} callback {optional) 3052 * @returns {Contract} returns contract if no callback was passed, 3053 * otherwise calls callback function (err, contract) 3054 */ 3055 ContractFactory.prototype.at = function (address, callback) { 3056 var contract = new Contract(this.eth, this.abi, address); 3057 3058 // this functions are not part of prototype, 3059 // because we don't want to spoil the interface 3060 addFunctionsToContract(contract); 3061 addEventsToContract(contract); 3062 3063 if (callback) { 3064 callback(null, contract); 3065 } 3066 return contract; 3067 }; 3068 3069 /** 3070 * Gets the data, which is data to deploy plus constructor params 3071 * 3072 * @method getData 3073 */ 3074 ContractFactory.prototype.getData = function () { 3075 var options = {}; // required! 3076 var args = Array.prototype.slice.call(arguments); 3077 3078 var last = args[args.length - 1]; 3079 if (utils.isObject(last) && !utils.isArray(last)) { 3080 options = args.pop(); 3081 } 3082 3083 var bytes = encodeConstructorParams(this.abi, args); 3084 options.data += bytes; 3085 3086 return options.data; 3087 }; 3088 3089 /** 3090 * Should be called to create new contract instance 3091 * 3092 * @method Contract 3093 * @param {Array} abi 3094 * @param {Address} contract address 3095 */ 3096 var Contract = function (eth, abi, address) { 3097 this._eth = eth; 3098 this.transactionHash = null; 3099 this.address = address; 3100 this.abi = abi; 3101 }; 3102 3103 module.exports = ContractFactory; 3104 3105 },{"../solidity/coder":7,"../utils/utils":20,"./allevents":23,"./event":27,"./function":31}],26:[function(require,module,exports){ 3106 /* 3107 This file is part of web3.js. 3108 3109 web3.js is free software: you can redistribute it and/or modify 3110 it under the terms of the GNU Lesser General Public License as published by 3111 the Free Software Foundation, either version 3 of the License, or 3112 (at your option) any later version. 3113 3114 web3.js is distributed in the hope that it will be useful, 3115 but WITHOUT ANY WARRANTY; without even the implied warranty of 3116 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 3117 GNU Lesser General Public License for more details. 3118 3119 You should have received a copy of the GNU Lesser General Public License 3120 along with web3.js. If not, see <http://www.gnu.org/licenses/>. 3121 */ 3122 /** 3123 * @file errors.js 3124 * @author Marek Kotewicz <marek@ethdev.com> 3125 * @date 2015 3126 */ 3127 3128 module.exports = { 3129 InvalidNumberOfSolidityArgs: function () { 3130 return new Error('Invalid number of arguments to Solidity function'); 3131 }, 3132 InvalidNumberOfRPCParams: function () { 3133 return new Error('Invalid number of input parameters to RPC method'); 3134 }, 3135 InvalidConnection: function (host){ 3136 return new Error('CONNECTION ERROR: Couldn\'t connect to node '+ host +'.'); 3137 }, 3138 InvalidProvider: function () { 3139 return new Error('Provider not set or invalid'); 3140 }, 3141 InvalidResponse: function (result){ 3142 var message = !!result && !!result.error && !!result.error.message ? result.error.message : 'Invalid JSON RPC response: ' + JSON.stringify(result); 3143 return new Error(message); 3144 }, 3145 ConnectionTimeout: function (ms){ 3146 return new Error('CONNECTION TIMEOUT: timeout of ' + ms + ' ms achived'); 3147 } 3148 }; 3149 3150 },{}],27:[function(require,module,exports){ 3151 /* 3152 This file is part of web3.js. 3153 3154 web3.js is free software: you can redistribute it and/or modify 3155 it under the terms of the GNU Lesser General Public License as published by 3156 the Free Software Foundation, either version 3 of the License, or 3157 (at your option) any later version. 3158 3159 web3.js is distributed in the hope that it will be useful, 3160 but WITHOUT ANY WARRANTY; without even the implied warranty of 3161 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 3162 GNU Lesser General Public License for more details. 3163 3164 You should have received a copy of the GNU Lesser General Public License 3165 along with web3.js. If not, see <http://www.gnu.org/licenses/>. 3166 */ 3167 /** 3168 * @file event.js 3169 * @author Marek Kotewicz <marek@ethdev.com> 3170 * @date 2014 3171 */ 3172 3173 var utils = require('../utils/utils'); 3174 var coder = require('../solidity/coder'); 3175 var formatters = require('./formatters'); 3176 var sha3 = require('../utils/sha3'); 3177 var Filter = require('./filter'); 3178 var watches = require('./methods/watches'); 3179 3180 /** 3181 * This prototype should be used to create event filters 3182 */ 3183 var SolidityEvent = function (requestManager, json, address) { 3184 this._requestManager = requestManager; 3185 this._params = json.inputs; 3186 this._name = utils.transformToFullName(json); 3187 this._address = address; 3188 this._anonymous = json.anonymous; 3189 }; 3190 3191 /** 3192 * Should be used to get filtered param types 3193 * 3194 * @method types 3195 * @param {Bool} decide if returned typed should be indexed 3196 * @return {Array} array of types 3197 */ 3198 SolidityEvent.prototype.types = function (indexed) { 3199 return this._params.filter(function (i) { 3200 return i.indexed === indexed; 3201 }).map(function (i) { 3202 return i.type; 3203 }); 3204 }; 3205 3206 /** 3207 * Should be used to get event display name 3208 * 3209 * @method displayName 3210 * @return {String} event display name 3211 */ 3212 SolidityEvent.prototype.displayName = function () { 3213 return utils.extractDisplayName(this._name); 3214 }; 3215 3216 /** 3217 * Should be used to get event type name 3218 * 3219 * @method typeName 3220 * @return {String} event type name 3221 */ 3222 SolidityEvent.prototype.typeName = function () { 3223 return utils.extractTypeName(this._name); 3224 }; 3225 3226 /** 3227 * Should be used to get event signature 3228 * 3229 * @method signature 3230 * @return {String} event signature 3231 */ 3232 SolidityEvent.prototype.signature = function () { 3233 return sha3(this._name); 3234 }; 3235 3236 /** 3237 * Should be used to encode indexed params and options to one final object 3238 * 3239 * @method encode 3240 * @param {Object} indexed 3241 * @param {Object} options 3242 * @return {Object} everything combined together and encoded 3243 */ 3244 SolidityEvent.prototype.encode = function (indexed, options) { 3245 indexed = indexed || {}; 3246 options = options || {}; 3247 var result = {}; 3248 3249 ['fromBlock', 'toBlock'].filter(function (f) { 3250 return options[f] !== undefined; 3251 }).forEach(function (f) { 3252 result[f] = formatters.inputBlockNumberFormatter(options[f]); 3253 }); 3254 3255 result.topics = []; 3256 3257 result.address = this._address; 3258 if (!this._anonymous) { 3259 result.topics.push('0x' + this.signature()); 3260 } 3261 3262 var indexedTopics = this._params.filter(function (i) { 3263 return i.indexed === true; 3264 }).map(function (i) { 3265 var value = indexed[i.name]; 3266 if (value === undefined || value === null) { 3267 return null; 3268 } 3269 3270 if (utils.isArray(value)) { 3271 return value.map(function (v) { 3272 return '0x' + coder.encodeParam(i.type, v); 3273 }); 3274 } 3275 return '0x' + coder.encodeParam(i.type, value); 3276 }); 3277 3278 result.topics = result.topics.concat(indexedTopics); 3279 3280 return result; 3281 }; 3282 3283 /** 3284 * Should be used to decode indexed params and options 3285 * 3286 * @method decode 3287 * @param {Object} data 3288 * @return {Object} result object with decoded indexed && not indexed params 3289 */ 3290 SolidityEvent.prototype.decode = function (data) { 3291 3292 data.data = data.data || ''; 3293 data.topics = data.topics || []; 3294 3295 var argTopics = this._anonymous ? data.topics : data.topics.slice(1); 3296 var indexedData = argTopics.map(function (topics) { return topics.slice(2); }).join(""); 3297 var indexedParams = coder.decodeParams(this.types(true), indexedData); 3298 3299 var notIndexedData = data.data.slice(2); 3300 var notIndexedParams = coder.decodeParams(this.types(false), notIndexedData); 3301 3302 var result = formatters.outputLogFormatter(data); 3303 result.event = this.displayName(); 3304 result.address = data.address; 3305 3306 result.args = this._params.reduce(function (acc, current) { 3307 acc[current.name] = current.indexed ? indexedParams.shift() : notIndexedParams.shift(); 3308 return acc; 3309 }, {}); 3310 3311 delete result.data; 3312 delete result.topics; 3313 3314 return result; 3315 }; 3316 3317 /** 3318 * Should be used to create new filter object from event 3319 * 3320 * @method execute 3321 * @param {Object} indexed 3322 * @param {Object} options 3323 * @return {Object} filter object 3324 */ 3325 SolidityEvent.prototype.execute = function (indexed, options, callback) { 3326 3327 if (utils.isFunction(arguments[arguments.length - 1])) { 3328 callback = arguments[arguments.length - 1]; 3329 if(arguments.length === 2) 3330 options = null; 3331 if(arguments.length === 1) { 3332 options = null; 3333 indexed = {}; 3334 } 3335 } 3336 3337 var o = this.encode(indexed, options); 3338 var formatter = this.decode.bind(this); 3339 return new Filter(o, 'eth', this._requestManager, watches.eth(), formatter, callback); 3340 }; 3341 3342 /** 3343 * Should be used to attach event to contract object 3344 * 3345 * @method attachToContract 3346 * @param {Contract} 3347 */ 3348 SolidityEvent.prototype.attachToContract = function (contract) { 3349 var execute = this.execute.bind(this); 3350 var displayName = this.displayName(); 3351 if (!contract[displayName]) { 3352 contract[displayName] = execute; 3353 } 3354 contract[displayName][this.typeName()] = this.execute.bind(this, contract); 3355 }; 3356 3357 module.exports = SolidityEvent; 3358 3359 3360 },{"../solidity/coder":7,"../utils/sha3":19,"../utils/utils":20,"./filter":29,"./formatters":30,"./methods/watches":43}],28:[function(require,module,exports){ 3361 var formatters = require('./formatters'); 3362 var utils = require('./../utils/utils'); 3363 var Method = require('./method'); 3364 var Property = require('./property'); 3365 3366 // TODO: refactor, so the input params are not altered. 3367 // it's necessary to make same 'extension' work with multiple providers 3368 var extend = function (web3) { 3369 /* jshint maxcomplexity:5 */ 3370 var ex = function (extension) { 3371 3372 var extendedObject; 3373 if (extension.property) { 3374 if (!web3[extension.property]) { 3375 web3[extension.property] = {}; 3376 } 3377 extendedObject = web3[extension.property]; 3378 } else { 3379 extendedObject = web3; 3380 } 3381 3382 if (extension.methods) { 3383 extension.methods.forEach(function (method) { 3384 method.attachToObject(extendedObject); 3385 method.setRequestManager(web3._requestManager); 3386 }); 3387 } 3388 3389 if (extension.properties) { 3390 extension.properties.forEach(function (property) { 3391 property.attachToObject(extendedObject); 3392 property.setRequestManager(web3._requestManager); 3393 }); 3394 } 3395 }; 3396 3397 ex.formatters = formatters; 3398 ex.utils = utils; 3399 ex.Method = Method; 3400 ex.Property = Property; 3401 3402 return ex; 3403 }; 3404 3405 3406 3407 module.exports = extend; 3408 3409 3410 },{"./../utils/utils":20,"./formatters":30,"./method":36,"./property":45}],29:[function(require,module,exports){ 3411 /* 3412 This file is part of web3.js. 3413 3414 web3.js is free software: you can redistribute it and/or modify 3415 it under the terms of the GNU Lesser General Public License as published by 3416 the Free Software Foundation, either version 3 of the License, or 3417 (at your option) any later version. 3418 3419 web3.js is distributed in the hope that it will be useful, 3420 but WITHOUT ANY WARRANTY; without even the implied warranty of 3421 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 3422 GNU Lesser General Public License for more details. 3423 3424 You should have received a copy of the GNU Lesser General Public License 3425 along with web3.js. If not, see <http://www.gnu.org/licenses/>. 3426 */ 3427 /** @file filter.js 3428 * @authors: 3429 * Jeffrey Wilcke <jeff@ethdev.com> 3430 * Marek Kotewicz <marek@ethdev.com> 3431 * Marian Oancea <marian@ethdev.com> 3432 * Fabian Vogelsteller <fabian@ethdev.com> 3433 * Gav Wood <g@ethdev.com> 3434 * @date 2014 3435 */ 3436 3437 var formatters = require('./formatters'); 3438 var utils = require('../utils/utils'); 3439 3440 /** 3441 * Converts a given topic to a hex string, but also allows null values. 3442 * 3443 * @param {Mixed} value 3444 * @return {String} 3445 */ 3446 var toTopic = function(value){ 3447 3448 if(value === null || typeof value === 'undefined') 3449 return null; 3450 3451 value = String(value); 3452 3453 if(value.indexOf('0x') === 0) 3454 return value; 3455 else 3456 return utils.fromUtf8(value); 3457 }; 3458 3459 /// This method should be called on options object, to verify deprecated properties && lazy load dynamic ones 3460 /// @param should be string or object 3461 /// @returns options string or object 3462 var getOptions = function (options, type) { 3463 /*jshint maxcomplexity: 6 */ 3464 3465 if (utils.isString(options)) { 3466 return options; 3467 } 3468 3469 options = options || {}; 3470 3471 3472 switch(type) { 3473 case 'eth': 3474 3475 // make sure topics, get converted to hex 3476 options.topics = options.topics || []; 3477 options.topics = options.topics.map(function(topic){ 3478 return (utils.isArray(topic)) ? topic.map(toTopic) : toTopic(topic); 3479 }); 3480 3481 return { 3482 topics: options.topics, 3483 from: options.from, 3484 to: options.to, 3485 address: options.address, 3486 fromBlock: formatters.inputBlockNumberFormatter(options.fromBlock), 3487 toBlock: formatters.inputBlockNumberFormatter(options.toBlock) 3488 }; 3489 case 'shh': 3490 return options; 3491 } 3492 }; 3493 3494 /** 3495 Adds the callback and sets up the methods, to iterate over the results. 3496 3497 @method getLogsAtStart 3498 @param {Object} self 3499 @param {function} callback 3500 */ 3501 var getLogsAtStart = function(self, callback){ 3502 // call getFilterLogs for the first watch callback start 3503 if (!utils.isString(self.options)) { 3504 self.get(function (err, messages) { 3505 // don't send all the responses to all the watches again... just to self one 3506 if (err) { 3507 callback(err); 3508 } 3509 3510 if(utils.isArray(messages)) { 3511 messages.forEach(function (message) { 3512 callback(null, message); 3513 }); 3514 } 3515 }); 3516 } 3517 }; 3518 3519 /** 3520 Adds the callback and sets up the methods, to iterate over the results. 3521 3522 @method pollFilter 3523 @param {Object} self 3524 */ 3525 var pollFilter = function(self) { 3526 3527 var onMessage = function (error, messages) { 3528 if (error) { 3529 return self.callbacks.forEach(function (callback) { 3530 callback(error); 3531 }); 3532 } 3533 3534 if(utils.isArray(messages)) { 3535 messages.forEach(function (message) { 3536 message = self.formatter ? self.formatter(message) : message; 3537 self.callbacks.forEach(function (callback) { 3538 callback(null, message); 3539 }); 3540 }); 3541 } 3542 }; 3543 3544 self.requestManager.startPolling({ 3545 method: self.implementation.poll.call, 3546 params: [self.filterId], 3547 }, self.filterId, onMessage, self.stopWatching.bind(self)); 3548 3549 }; 3550 3551 var Filter = function (options, type, requestManager, methods, formatter, callback, filterCreationErrorCallback) { 3552 var self = this; 3553 var implementation = {}; 3554 methods.forEach(function (method) { 3555 method.setRequestManager(requestManager); 3556 method.attachToObject(implementation); 3557 }); 3558 this.requestManager = requestManager; 3559 this.options = getOptions(options, type); 3560 this.implementation = implementation; 3561 this.filterId = null; 3562 this.callbacks = []; 3563 this.getLogsCallbacks = []; 3564 this.pollFilters = []; 3565 this.formatter = formatter; 3566 this.implementation.newFilter(this.options, function(error, id){ 3567 if(error) { 3568 self.callbacks.forEach(function(cb){ 3569 cb(error); 3570 }); 3571 if (typeof filterCreationErrorCallback === 'function') { 3572 filterCreationErrorCallback(error); 3573 } 3574 } else { 3575 self.filterId = id; 3576 3577 // check if there are get pending callbacks as a consequence 3578 // of calling get() with filterId unassigned. 3579 self.getLogsCallbacks.forEach(function (cb){ 3580 self.get(cb); 3581 }); 3582 self.getLogsCallbacks = []; 3583 3584 // get filter logs for the already existing watch calls 3585 self.callbacks.forEach(function(cb){ 3586 getLogsAtStart(self, cb); 3587 }); 3588 if(self.callbacks.length > 0) 3589 pollFilter(self); 3590 3591 // start to watch immediately 3592 if(typeof callback === 'function') { 3593 return self.watch(callback); 3594 } 3595 } 3596 }); 3597 3598 return this; 3599 }; 3600 3601 Filter.prototype.watch = function (callback) { 3602 this.callbacks.push(callback); 3603 3604 if(this.filterId) { 3605 getLogsAtStart(this, callback); 3606 pollFilter(this); 3607 } 3608 3609 return this; 3610 }; 3611 3612 Filter.prototype.stopWatching = function (callback) { 3613 this.requestManager.stopPolling(this.filterId); 3614 this.callbacks = []; 3615 // remove filter async 3616 if (callback) { 3617 this.implementation.uninstallFilter(this.filterId, callback); 3618 } else { 3619 return this.implementation.uninstallFilter(this.filterId); 3620 } 3621 }; 3622 3623 Filter.prototype.get = function (callback) { 3624 var self = this; 3625 if (utils.isFunction(callback)) { 3626 if (this.filterId === null) { 3627 // If filterId is not set yet, call it back 3628 // when newFilter() assigns it. 3629 this.getLogsCallbacks.push(callback); 3630 } else { 3631 this.implementation.getLogs(this.filterId, function(err, res){ 3632 if (err) { 3633 callback(err); 3634 } else { 3635 callback(null, res.map(function (log) { 3636 return self.formatter ? self.formatter(log) : log; 3637 })); 3638 } 3639 }); 3640 } 3641 } else { 3642 if (this.filterId === null) { 3643 throw new Error('Filter ID Error: filter().get() can\'t be chained synchronous, please provide a callback for the get() method.'); 3644 } 3645 var logs = this.implementation.getLogs(this.filterId); 3646 return logs.map(function (log) { 3647 return self.formatter ? self.formatter(log) : log; 3648 }); 3649 } 3650 3651 return this; 3652 }; 3653 3654 module.exports = Filter; 3655 3656 3657 },{"../utils/utils":20,"./formatters":30}],30:[function(require,module,exports){ 3658 'use strict' 3659 3660 /* 3661 This file is part of web3.js. 3662 3663 web3.js is free software: you can redistribute it and/or modify 3664 it under the terms of the GNU Lesser General Public License as published by 3665 the Free Software Foundation, either version 3 of the License, or 3666 (at your option) any later version. 3667 3668 web3.js is distributed in the hope that it will be useful, 3669 but WITHOUT ANY WARRANTY; without even the implied warranty of 3670 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 3671 GNU Lesser General Public License for more details. 3672 3673 You should have received a copy of the GNU Lesser General Public License 3674 along with web3.js. If not, see <http://www.gnu.org/licenses/>. 3675 */ 3676 /** 3677 * @file formatters.js 3678 * @author Marek Kotewicz <marek@ethdev.com> 3679 * @author Fabian Vogelsteller <fabian@ethdev.com> 3680 * @date 2015 3681 */ 3682 3683 var utils = require('../utils/utils'); 3684 var config = require('../utils/config'); 3685 var Iban = require('./iban'); 3686 3687 /** 3688 * Should the format output to a big number 3689 * 3690 * @method outputBigNumberFormatter 3691 * @param {String|Number|BigNumber} 3692 * @returns {BigNumber} object 3693 */ 3694 var outputBigNumberFormatter = function (number) { 3695 return utils.toBigNumber(number); 3696 }; 3697 3698 var isPredefinedBlockNumber = function (blockNumber) { 3699 return blockNumber === 'latest' || blockNumber === 'pending' || blockNumber === 'earliest'; 3700 }; 3701 3702 var inputDefaultBlockNumberFormatter = function (blockNumber) { 3703 if (blockNumber === undefined) { 3704 return config.defaultBlock; 3705 } 3706 return inputBlockNumberFormatter(blockNumber); 3707 }; 3708 3709 var inputBlockNumberFormatter = function (blockNumber) { 3710 if (blockNumber === undefined) { 3711 return undefined; 3712 } else if (isPredefinedBlockNumber(blockNumber)) { 3713 return blockNumber; 3714 } 3715 return utils.toHex(blockNumber); 3716 }; 3717 3718 /** 3719 * Formats the input of a transaction and converts all values to HEX 3720 * 3721 * @method inputCallFormatter 3722 * @param {Object} transaction options 3723 * @returns object 3724 */ 3725 var inputCallFormatter = function (options){ 3726 3727 options.from = options.from || config.defaultAccount; 3728 3729 if (options.from) { 3730 options.from = inputAddressFormatter(options.from); 3731 } 3732 3733 if (options.to) { // it might be contract creation 3734 options.to = inputAddressFormatter(options.to); 3735 } 3736 3737 ['maxFeePerGas', 'maxPriorityFeePerGas', 'gasPrice', 'gas', 'value', 'nonce'].filter(function (key) { 3738 return options[key] !== undefined; 3739 }).forEach(function(key){ 3740 options[key] = utils.fromDecimal(options[key]); 3741 }); 3742 3743 return options; 3744 }; 3745 3746 /** 3747 * Formats the input of a transaction and converts all values to HEX 3748 * 3749 * @method inputTransactionFormatter 3750 * @param {Object} transaction options 3751 * @returns object 3752 */ 3753 var inputTransactionFormatter = function (options){ 3754 3755 options.from = options.from || config.defaultAccount; 3756 options.from = inputAddressFormatter(options.from); 3757 3758 if (options.to) { // it might be contract creation 3759 options.to = inputAddressFormatter(options.to); 3760 } 3761 3762 ['maxFeePerGas', 'maxPriorityFeePerGas', 'gasPrice', 'gas', 'value', 'nonce'].filter(function (key) { 3763 return options[key] !== undefined; 3764 }).forEach(function(key){ 3765 options[key] = utils.fromDecimal(options[key]); 3766 }); 3767 3768 return options; 3769 }; 3770 3771 /** 3772 * Formats the output of a transaction to its proper values 3773 * 3774 * @method outputTransactionFormatter 3775 * @param {Object} tx 3776 * @returns {Object} 3777 */ 3778 var outputTransactionFormatter = function (tx){ 3779 if(tx.blockNumber !== null) 3780 tx.blockNumber = utils.toDecimal(tx.blockNumber); 3781 if(tx.transactionIndex !== null) 3782 tx.transactionIndex = utils.toDecimal(tx.transactionIndex); 3783 tx.nonce = utils.toDecimal(tx.nonce); 3784 tx.gas = utils.toDecimal(tx.gas); 3785 tx.gasPrice = utils.toBigNumber(tx.gasPrice); 3786 if(tx.maxFeePerGas !== undefined) { 3787 tx.maxFeePerGas = utils.toBigNumber(tx.maxFeePerGas); 3788 } 3789 if(tx.maxPriorityFeePerGas !== undefined) { 3790 tx.maxPriorityFeePerGas = utils.toBigNumber(tx.maxPriorityFeePerGas); 3791 } 3792 tx.value = utils.toBigNumber(tx.value); 3793 if(tx.queueIndex !== undefined) { 3794 tx.queueIndex = utils.toBigNumber(tx.queueIndex); 3795 } 3796 return tx; 3797 }; 3798 3799 /** 3800 * Formats the output of a transaction receipt to its proper values 3801 * 3802 * @method outputTransactionReceiptFormatter 3803 * @param {Object} receipt 3804 * @returns {Object} 3805 */ 3806 var outputTransactionReceiptFormatter = function (receipt){ 3807 if(receipt.blockNumber !== null) 3808 receipt.blockNumber = utils.toDecimal(receipt.blockNumber); 3809 if(receipt.transactionIndex !== null) 3810 receipt.transactionIndex = utils.toDecimal(receipt.transactionIndex); 3811 receipt.cumulativeGasUsed = utils.toDecimal(receipt.cumulativeGasUsed); 3812 receipt.gasUsed = utils.toDecimal(receipt.gasUsed); 3813 if(receipt.effectiveGasPrice !== undefined) { 3814 receipt.effectiveGasPrice = utils.toBigNumber(receipt.effectiveGasPrice); 3815 } 3816 if(utils.isArray(receipt.logs)) { 3817 receipt.logs = receipt.logs.map(function(log){ 3818 return outputLogFormatter(log); 3819 }); 3820 } 3821 3822 return receipt; 3823 }; 3824 3825 /** 3826 * Formats the output of a block to its proper values 3827 * 3828 * @method outputBlockFormatter 3829 * @param {Object} block 3830 * @returns {Object} 3831 */ 3832 var outputBlockFormatter = function(block) { 3833 // transform to number 3834 if (block.baseFeePerGas !== undefined) { 3835 block.baseFeePerGas = utils.toBigNumber(block.baseFeePerGas); 3836 } 3837 block.gasLimit = utils.toDecimal(block.gasLimit); 3838 block.gasUsed = utils.toDecimal(block.gasUsed); 3839 block.size = utils.toDecimal(block.size); 3840 block.timestamp = utils.toDecimal(block.timestamp); 3841 if(block.number !== null) 3842 block.number = utils.toDecimal(block.number); 3843 3844 block.difficulty = utils.toBigNumber(block.difficulty); 3845 block.totalDifficulty = utils.toBigNumber(block.totalDifficulty); 3846 3847 if (utils.isArray(block.transactions)) { 3848 block.transactions.forEach(function(item){ 3849 if(!utils.isString(item)) 3850 return outputTransactionFormatter(item); 3851 }); 3852 } 3853 3854 return block; 3855 }; 3856 3857 /** 3858 * Formats the output of a log 3859 * 3860 * @method outputLogFormatter 3861 * @param {Object} log object 3862 * @returns {Object} log 3863 */ 3864 var outputLogFormatter = function(log) { 3865 if(log.blockNumber) 3866 log.blockNumber = utils.toDecimal(log.blockNumber); 3867 if(log.transactionIndex) 3868 log.transactionIndex = utils.toDecimal(log.transactionIndex); 3869 if(log.logIndex) 3870 log.logIndex = utils.toDecimal(log.logIndex); 3871 3872 return log; 3873 }; 3874 3875 /** 3876 * Formats the input of a whisper post and converts all values to HEX 3877 * 3878 * @method inputPostFormatter 3879 * @param {Object} transaction object 3880 * @returns {Object} 3881 */ 3882 var inputPostFormatter = function(post) { 3883 3884 // post.payload = utils.toHex(post.payload); 3885 post.ttl = utils.fromDecimal(post.ttl); 3886 post.workToProve = utils.fromDecimal(post.workToProve); 3887 post.priority = utils.fromDecimal(post.priority); 3888 3889 // fallback 3890 if (!utils.isArray(post.topics)) { 3891 post.topics = post.topics ? [post.topics] : []; 3892 } 3893 3894 // format the following options 3895 post.topics = post.topics.map(function(topic){ 3896 // convert only if not hex 3897 return (topic.indexOf('0x') === 0) ? topic : utils.fromUtf8(topic); 3898 }); 3899 3900 return post; 3901 }; 3902 3903 /** 3904 * Formats the output of a received post message 3905 * 3906 * @method outputPostFormatter 3907 * @param {Object} 3908 * @returns {Object} 3909 */ 3910 var outputPostFormatter = function(post){ 3911 3912 post.expiry = utils.toDecimal(post.expiry); 3913 post.sent = utils.toDecimal(post.sent); 3914 post.ttl = utils.toDecimal(post.ttl); 3915 post.workProved = utils.toDecimal(post.workProved); 3916 // post.payloadRaw = post.payload; 3917 // post.payload = utils.toAscii(post.payload); 3918 3919 // if (utils.isJson(post.payload)) { 3920 // post.payload = JSON.parse(post.payload); 3921 // } 3922 3923 // format the following options 3924 if (!post.topics) { 3925 post.topics = []; 3926 } 3927 post.topics = post.topics.map(function(topic){ 3928 return utils.toAscii(topic); 3929 }); 3930 3931 return post; 3932 }; 3933 3934 var inputAddressFormatter = function (address) { 3935 var iban = new Iban(address); 3936 if (iban.isValid() && iban.isDirect()) { 3937 return '0x' + iban.address(); 3938 } else if (utils.isStrictAddress(address)) { 3939 return address; 3940 } else if (utils.isAddress(address)) { 3941 return '0x' + address; 3942 } 3943 throw new Error('invalid address'); 3944 }; 3945 3946 3947 var outputSyncingFormatter = function(result) { 3948 if (!result) { 3949 return result; 3950 } 3951 3952 result.startingBlock = utils.toDecimal(result.startingBlock); 3953 result.currentBlock = utils.toDecimal(result.currentBlock); 3954 result.highestBlock = utils.toDecimal(result.highestBlock); 3955 if (result.knownStates) { 3956 result.knownStates = utils.toDecimal(result.knownStates); 3957 result.pulledStates = utils.toDecimal(result.pulledStates); 3958 } 3959 3960 return result; 3961 }; 3962 3963 module.exports = { 3964 inputDefaultBlockNumberFormatter: inputDefaultBlockNumberFormatter, 3965 inputBlockNumberFormatter: inputBlockNumberFormatter, 3966 inputCallFormatter: inputCallFormatter, 3967 inputTransactionFormatter: inputTransactionFormatter, 3968 inputAddressFormatter: inputAddressFormatter, 3969 inputPostFormatter: inputPostFormatter, 3970 outputBigNumberFormatter: outputBigNumberFormatter, 3971 outputTransactionFormatter: outputTransactionFormatter, 3972 outputTransactionReceiptFormatter: outputTransactionReceiptFormatter, 3973 outputBlockFormatter: outputBlockFormatter, 3974 outputLogFormatter: outputLogFormatter, 3975 outputPostFormatter: outputPostFormatter, 3976 outputSyncingFormatter: outputSyncingFormatter 3977 }; 3978 3979 3980 },{"../utils/config":18,"../utils/utils":20,"./iban":33}],31:[function(require,module,exports){ 3981 /* 3982 This file is part of web3.js. 3983 3984 web3.js is free software: you can redistribute it and/or modify 3985 it under the terms of the GNU Lesser General Public License as published by 3986 the Free Software Foundation, either version 3 of the License, or 3987 (at your option) any later version. 3988 3989 web3.js is distributed in the hope that it will be useful, 3990 but WITHOUT ANY WARRANTY; without even the implied warranty of 3991 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 3992 GNU Lesser General Public License for more details. 3993 3994 You should have received a copy of the GNU Lesser General Public License 3995 along with web3.js. If not, see <http://www.gnu.org/licenses/>. 3996 */ 3997 /** 3998 * @file function.js 3999 * @author Marek Kotewicz <marek@ethdev.com> 4000 * @date 2015 4001 */ 4002 4003 var coder = require('../solidity/coder'); 4004 var utils = require('../utils/utils'); 4005 var errors = require('./errors'); 4006 var formatters = require('./formatters'); 4007 var sha3 = require('../utils/sha3'); 4008 4009 /** 4010 * This prototype should be used to call/sendTransaction to solidity functions 4011 */ 4012 var SolidityFunction = function (eth, json, address) { 4013 this._eth = eth; 4014 this._inputTypes = json.inputs.map(function (i) { 4015 return i.type; 4016 }); 4017 this._outputTypes = json.outputs.map(function (i) { 4018 return i.type; 4019 }); 4020 this._constant = json.constant; 4021 this._payable = json.payable; 4022 this._name = utils.transformToFullName(json); 4023 this._address = address; 4024 }; 4025 4026 SolidityFunction.prototype.extractCallback = function (args) { 4027 if (utils.isFunction(args[args.length - 1])) { 4028 return args.pop(); // modify the args array! 4029 } 4030 }; 4031 4032 SolidityFunction.prototype.extractDefaultBlock = function (args) { 4033 if (args.length > this._inputTypes.length && !utils.isObject(args[args.length -1])) { 4034 return formatters.inputDefaultBlockNumberFormatter(args.pop()); // modify the args array! 4035 } 4036 }; 4037 4038 /** 4039 * Should be called to check if the number of arguments is correct 4040 * 4041 * @method validateArgs 4042 * @param {Array} arguments 4043 * @throws {Error} if it is not 4044 */ 4045 SolidityFunction.prototype.validateArgs = function (args) { 4046 var inputArgs = args.filter(function (a) { 4047 // filter the options object but not arguments that are arrays 4048 return !( (utils.isObject(a) === true) && 4049 (utils.isArray(a) === false) && 4050 (utils.isBigNumber(a) === false) 4051 ); 4052 }); 4053 if (inputArgs.length !== this._inputTypes.length) { 4054 throw errors.InvalidNumberOfSolidityArgs(); 4055 } 4056 }; 4057 4058 /** 4059 * Should be used to create payload from arguments 4060 * 4061 * @method toPayload 4062 * @param {Array} solidity function params 4063 * @param {Object} optional payload options 4064 */ 4065 SolidityFunction.prototype.toPayload = function (args) { 4066 var options = {}; 4067 if (args.length > this._inputTypes.length && utils.isObject(args[args.length -1])) { 4068 options = args[args.length - 1]; 4069 } 4070 this.validateArgs(args); 4071 options.to = this._address; 4072 options.data = '0x' + this.signature() + coder.encodeParams(this._inputTypes, args); 4073 return options; 4074 }; 4075 4076 /** 4077 * Should be used to get function signature 4078 * 4079 * @method signature 4080 * @return {String} function signature 4081 */ 4082 SolidityFunction.prototype.signature = function () { 4083 return sha3(this._name).slice(0, 8); 4084 }; 4085 4086 4087 SolidityFunction.prototype.unpackOutput = function (output) { 4088 if (!output) { 4089 return; 4090 } 4091 4092 output = output.length >= 2 ? output.slice(2) : output; 4093 var result = coder.decodeParams(this._outputTypes, output); 4094 return result.length === 1 ? result[0] : result; 4095 }; 4096 4097 /** 4098 * Calls a contract function. 4099 * 4100 * @method call 4101 * @param {...Object} Contract function arguments 4102 * @param {function} If the last argument is a function, the contract function 4103 * call will be asynchronous, and the callback will be passed the 4104 * error and result. 4105 * @return {String} output bytes 4106 */ 4107 SolidityFunction.prototype.call = function () { 4108 var args = Array.prototype.slice.call(arguments).filter(function (a) {return a !== undefined; }); 4109 var callback = this.extractCallback(args); 4110 var defaultBlock = this.extractDefaultBlock(args); 4111 var payload = this.toPayload(args); 4112 4113 4114 if (!callback) { 4115 var output = this._eth.call(payload, defaultBlock); 4116 return this.unpackOutput(output); 4117 } 4118 4119 var self = this; 4120 this._eth.call(payload, defaultBlock, function (error, output) { 4121 if (error) return callback(error, null); 4122 4123 var unpacked = null; 4124 try { 4125 unpacked = self.unpackOutput(output); 4126 } 4127 catch (e) { 4128 error = e; 4129 } 4130 4131 callback(error, unpacked); 4132 }); 4133 }; 4134 4135 /** 4136 * Should be used to sendTransaction to solidity function 4137 * 4138 * @method sendTransaction 4139 */ 4140 SolidityFunction.prototype.sendTransaction = function () { 4141 var args = Array.prototype.slice.call(arguments).filter(function (a) {return a !== undefined; }); 4142 var callback = this.extractCallback(args); 4143 var payload = this.toPayload(args); 4144 4145 if (payload.value > 0 && !this._payable) { 4146 throw new Error('Cannot send value to non-payable function'); 4147 } 4148 4149 if (!callback) { 4150 return this._eth.sendTransaction(payload); 4151 } 4152 4153 this._eth.sendTransaction(payload, callback); 4154 }; 4155 4156 /** 4157 * Should be used to estimateGas of solidity function 4158 * 4159 * @method estimateGas 4160 */ 4161 SolidityFunction.prototype.estimateGas = function () { 4162 var args = Array.prototype.slice.call(arguments); 4163 var callback = this.extractCallback(args); 4164 var payload = this.toPayload(args); 4165 4166 if (!callback) { 4167 return this._eth.estimateGas(payload); 4168 } 4169 4170 this._eth.estimateGas(payload, callback); 4171 }; 4172 4173 /** 4174 * Return the encoded data of the call 4175 * 4176 * @method getData 4177 * @return {String} the encoded data 4178 */ 4179 SolidityFunction.prototype.getData = function () { 4180 var args = Array.prototype.slice.call(arguments); 4181 var payload = this.toPayload(args); 4182 4183 return payload.data; 4184 }; 4185 4186 /** 4187 * Should be used to get function display name 4188 * 4189 * @method displayName 4190 * @return {String} display name of the function 4191 */ 4192 SolidityFunction.prototype.displayName = function () { 4193 return utils.extractDisplayName(this._name); 4194 }; 4195 4196 /** 4197 * Should be used to get function type name 4198 * 4199 * @method typeName 4200 * @return {String} type name of the function 4201 */ 4202 SolidityFunction.prototype.typeName = function () { 4203 return utils.extractTypeName(this._name); 4204 }; 4205 4206 /** 4207 * Should be called to get rpc requests from solidity function 4208 * 4209 * @method request 4210 * @returns {Object} 4211 */ 4212 SolidityFunction.prototype.request = function () { 4213 var args = Array.prototype.slice.call(arguments); 4214 var callback = this.extractCallback(args); 4215 var payload = this.toPayload(args); 4216 var format = this.unpackOutput.bind(this); 4217 4218 return { 4219 method: this._constant ? 'eth_call' : 'eth_sendTransaction', 4220 callback: callback, 4221 params: [payload], 4222 format: format 4223 }; 4224 }; 4225 4226 /** 4227 * Should be called to execute function 4228 * 4229 * @method execute 4230 */ 4231 SolidityFunction.prototype.execute = function () { 4232 var transaction = !this._constant; 4233 4234 // send transaction 4235 if (transaction) { 4236 return this.sendTransaction.apply(this, Array.prototype.slice.call(arguments)); 4237 } 4238 4239 // call 4240 return this.call.apply(this, Array.prototype.slice.call(arguments)); 4241 }; 4242 4243 /** 4244 * Should be called to attach function to contract 4245 * 4246 * @method attachToContract 4247 * @param {Contract} 4248 */ 4249 SolidityFunction.prototype.attachToContract = function (contract) { 4250 var execute = this.execute.bind(this); 4251 execute.request = this.request.bind(this); 4252 execute.call = this.call.bind(this); 4253 execute.sendTransaction = this.sendTransaction.bind(this); 4254 execute.estimateGas = this.estimateGas.bind(this); 4255 execute.getData = this.getData.bind(this); 4256 var displayName = this.displayName(); 4257 if (!contract[displayName]) { 4258 contract[displayName] = execute; 4259 } 4260 contract[displayName][this.typeName()] = execute; // circular!!!! 4261 }; 4262 4263 module.exports = SolidityFunction; 4264 4265 },{"../solidity/coder":7,"../utils/sha3":19,"../utils/utils":20,"./errors":26,"./formatters":30}],32:[function(require,module,exports){ 4266 /* 4267 This file is part of web3.js. 4268 4269 web3.js is free software: you can redistribute it and/or modify 4270 it under the terms of the GNU Lesser General Public License as published by 4271 the Free Software Foundation, either version 3 of the License, or 4272 (at your option) any later version. 4273 4274 web3.js is distributed in the hope that it will be useful, 4275 but WITHOUT ANY WARRANTY; without even the implied warranty of 4276 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 4277 GNU Lesser General Public License for more details. 4278 4279 You should have received a copy of the GNU Lesser General Public License 4280 along with web3.js. If not, see <http://www.gnu.org/licenses/>. 4281 */ 4282 /** @file httpprovider.js 4283 * @authors: 4284 * Marek Kotewicz <marek@ethdev.com> 4285 * Marian Oancea <marian@ethdev.com> 4286 * Fabian Vogelsteller <fabian@ethdev.com> 4287 * @date 2015 4288 */ 4289 4290 var errors = require('./errors'); 4291 4292 // workaround to use httpprovider in different envs 4293 4294 // browser 4295 if (typeof window !== 'undefined' && window.XMLHttpRequest) { 4296 XMLHttpRequest = window.XMLHttpRequest; // jshint ignore: line 4297 // node 4298 } else { 4299 XMLHttpRequest = require('xmlhttprequest').XMLHttpRequest; // jshint ignore: line 4300 } 4301 4302 var XHR2 = require('xhr2'); // jshint ignore: line 4303 4304 /** 4305 * HttpProvider should be used to send rpc calls over http 4306 */ 4307 var HttpProvider = function (host, timeout, user, password) { 4308 this.host = host || 'http://localhost:8545'; 4309 this.timeout = timeout || 0; 4310 this.user = user; 4311 this.password = password; 4312 }; 4313 4314 /** 4315 * Should be called to prepare new XMLHttpRequest 4316 * 4317 * @method prepareRequest 4318 * @param {Boolean} true if request should be async 4319 * @return {XMLHttpRequest} object 4320 */ 4321 HttpProvider.prototype.prepareRequest = function (async) { 4322 var request; 4323 4324 if (async) { 4325 request = new XHR2(); 4326 request.timeout = this.timeout; 4327 } else { 4328 request = new XMLHttpRequest(); 4329 } 4330 4331 request.open('POST', this.host, async); 4332 if (this.user && this.password) { 4333 var auth = 'Basic ' + new Buffer(this.user + ':' + this.password).toString('base64'); 4334 request.setRequestHeader('Authorization', auth); 4335 } request.setRequestHeader('Content-Type', 'application/json'); 4336 return request; 4337 }; 4338 4339 /** 4340 * Should be called to make sync request 4341 * 4342 * @method send 4343 * @param {Object} payload 4344 * @return {Object} result 4345 */ 4346 HttpProvider.prototype.send = function (payload) { 4347 var request = this.prepareRequest(false); 4348 4349 try { 4350 request.send(JSON.stringify(payload)); 4351 } catch (error) { 4352 throw errors.InvalidConnection(this.host); 4353 } 4354 4355 var result = request.responseText; 4356 4357 try { 4358 result = JSON.parse(result); 4359 } catch (e) { 4360 throw errors.InvalidResponse(request.responseText); 4361 } 4362 4363 return result; 4364 }; 4365 4366 /** 4367 * Should be used to make async request 4368 * 4369 * @method sendAsync 4370 * @param {Object} payload 4371 * @param {Function} callback triggered on end with (err, result) 4372 */ 4373 HttpProvider.prototype.sendAsync = function (payload, callback) { 4374 var request = this.prepareRequest(true); 4375 4376 request.onreadystatechange = function () { 4377 if (request.readyState === 4 && request.timeout !== 1) { 4378 var result = request.responseText; 4379 var error = null; 4380 4381 try { 4382 result = JSON.parse(result); 4383 } catch (e) { 4384 error = errors.InvalidResponse(request.responseText); 4385 } 4386 4387 callback(error, result); 4388 } 4389 }; 4390 4391 request.ontimeout = function () { 4392 callback(errors.ConnectionTimeout(this.timeout)); 4393 }; 4394 4395 try { 4396 request.send(JSON.stringify(payload)); 4397 } catch (error) { 4398 callback(errors.InvalidConnection(this.host)); 4399 } 4400 }; 4401 4402 /** 4403 * Synchronously tries to make Http request 4404 * 4405 * @method isConnected 4406 * @return {Boolean} returns true if request haven't failed. Otherwise false 4407 */ 4408 HttpProvider.prototype.isConnected = function () { 4409 try { 4410 this.send({ 4411 id: 9999999999, 4412 jsonrpc: '2.0', 4413 method: 'net_listening', 4414 params: [] 4415 }); 4416 return true; 4417 } catch (e) { 4418 return false; 4419 } 4420 }; 4421 4422 module.exports = HttpProvider; 4423 4424 },{"./errors":26,"xhr2":86,"xmlhttprequest":17}],33:[function(require,module,exports){ 4425 /* 4426 This file is part of web3.js. 4427 4428 web3.js is free software: you can redistribute it and/or modify 4429 it under the terms of the GNU Lesser General Public License as published by 4430 the Free Software Foundation, either version 3 of the License, or 4431 (at your option) any later version. 4432 4433 web3.js is distributed in the hope that it will be useful, 4434 but WITHOUT ANY WARRANTY; without even the implied warranty of 4435 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 4436 GNU Lesser General Public License for more details. 4437 4438 You should have received a copy of the GNU Lesser General Public License 4439 along with web3.js. If not, see <http://www.gnu.org/licenses/>. 4440 */ 4441 /** 4442 * @file iban.js 4443 * @author Marek Kotewicz <marek@ethdev.com> 4444 * @date 2015 4445 */ 4446 4447 var BigNumber = require('bignumber.js'); 4448 4449 var padLeft = function (string, bytes) { 4450 var result = string; 4451 while (result.length < bytes * 2) { 4452 result = '0' + result; 4453 } 4454 return result; 4455 }; 4456 4457 /** 4458 * Prepare an IBAN for mod 97 computation by moving the first 4 chars to the end and transforming the letters to 4459 * numbers (A = 10, B = 11, ..., Z = 35), as specified in ISO13616. 4460 * 4461 * @method iso13616Prepare 4462 * @param {String} iban the IBAN 4463 * @returns {String} the prepared IBAN 4464 */ 4465 var iso13616Prepare = function (iban) { 4466 var A = 'A'.charCodeAt(0); 4467 var Z = 'Z'.charCodeAt(0); 4468 4469 iban = iban.toUpperCase(); 4470 iban = iban.substr(4) + iban.substr(0,4); 4471 4472 return iban.split('').map(function(n){ 4473 var code = n.charCodeAt(0); 4474 if (code >= A && code <= Z){ 4475 // A = 10, B = 11, ... Z = 35 4476 return code - A + 10; 4477 } else { 4478 return n; 4479 } 4480 }).join(''); 4481 }; 4482 4483 /** 4484 * Calculates the MOD 97 10 of the passed IBAN as specified in ISO7064. 4485 * 4486 * @method mod9710 4487 * @param {String} iban 4488 * @returns {Number} 4489 */ 4490 var mod9710 = function (iban) { 4491 var remainder = iban, 4492 block; 4493 4494 while (remainder.length > 2){ 4495 block = remainder.slice(0, 9); 4496 remainder = parseInt(block, 10) % 97 + remainder.slice(block.length); 4497 } 4498 4499 return parseInt(remainder, 10) % 97; 4500 }; 4501 4502 /** 4503 * This prototype should be used to create iban object from iban correct string 4504 * 4505 * @param {String} iban 4506 */ 4507 var Iban = function (iban) { 4508 this._iban = iban; 4509 }; 4510 4511 /** 4512 * This method should be used to create iban object from ethereum address 4513 * 4514 * @method fromAddress 4515 * @param {String} address 4516 * @return {Iban} the IBAN object 4517 */ 4518 Iban.fromAddress = function (address) { 4519 var asBn = new BigNumber(address, 16); 4520 var base36 = asBn.toString(36); 4521 var padded = padLeft(base36, 15); 4522 return Iban.fromBban(padded.toUpperCase()); 4523 }; 4524 4525 /** 4526 * Convert the passed BBAN to an IBAN for this country specification. 4527 * Please note that <i>"generation of the IBAN shall be the exclusive responsibility of the bank/branch servicing the account"</i>. 4528 * This method implements the preferred algorithm described in http://en.wikipedia.org/wiki/International_Bank_Account_Number#Generating_IBAN_check_digits 4529 * 4530 * @method fromBban 4531 * @param {String} bban the BBAN to convert to IBAN 4532 * @returns {Iban} the IBAN object 4533 */ 4534 Iban.fromBban = function (bban) { 4535 var countryCode = 'XE'; 4536 4537 var remainder = mod9710(iso13616Prepare(countryCode + '00' + bban)); 4538 var checkDigit = ('0' + (98 - remainder)).slice(-2); 4539 4540 return new Iban(countryCode + checkDigit + bban); 4541 }; 4542 4543 /** 4544 * Should be used to create IBAN object for given institution and identifier 4545 * 4546 * @method createIndirect 4547 * @param {Object} options, required options are "institution" and "identifier" 4548 * @return {Iban} the IBAN object 4549 */ 4550 Iban.createIndirect = function (options) { 4551 return Iban.fromBban('ETH' + options.institution + options.identifier); 4552 }; 4553 4554 /** 4555 * Thos method should be used to check if given string is valid iban object 4556 * 4557 * @method isValid 4558 * @param {String} iban string 4559 * @return {Boolean} true if it is valid IBAN 4560 */ 4561 Iban.isValid = function (iban) { 4562 var i = new Iban(iban); 4563 return i.isValid(); 4564 }; 4565 4566 /** 4567 * Should be called to check if iban is correct 4568 * 4569 * @method isValid 4570 * @returns {Boolean} true if it is, otherwise false 4571 */ 4572 Iban.prototype.isValid = function () { 4573 return /^XE[0-9]{2}(ETH[0-9A-Z]{13}|[0-9A-Z]{30,31})$/.test(this._iban) && 4574 mod9710(iso13616Prepare(this._iban)) === 1; 4575 }; 4576 4577 /** 4578 * Should be called to check if iban number is direct 4579 * 4580 * @method isDirect 4581 * @returns {Boolean} true if it is, otherwise false 4582 */ 4583 Iban.prototype.isDirect = function () { 4584 return this._iban.length === 34 || this._iban.length === 35; 4585 }; 4586 4587 /** 4588 * Should be called to check if iban number if indirect 4589 * 4590 * @method isIndirect 4591 * @returns {Boolean} true if it is, otherwise false 4592 */ 4593 Iban.prototype.isIndirect = function () { 4594 return this._iban.length === 20; 4595 }; 4596 4597 /** 4598 * Should be called to get iban checksum 4599 * Uses the mod-97-10 checksumming protocol (ISO/IEC 7064:2003) 4600 * 4601 * @method checksum 4602 * @returns {String} checksum 4603 */ 4604 Iban.prototype.checksum = function () { 4605 return this._iban.substr(2, 2); 4606 }; 4607 4608 /** 4609 * Should be called to get institution identifier 4610 * eg. XREG 4611 * 4612 * @method institution 4613 * @returns {String} institution identifier 4614 */ 4615 Iban.prototype.institution = function () { 4616 return this.isIndirect() ? this._iban.substr(7, 4) : ''; 4617 }; 4618 4619 /** 4620 * Should be called to get client identifier within institution 4621 * eg. GAVOFYORK 4622 * 4623 * @method client 4624 * @returns {String} client identifier 4625 */ 4626 Iban.prototype.client = function () { 4627 return this.isIndirect() ? this._iban.substr(11) : ''; 4628 }; 4629 4630 /** 4631 * Should be called to get client direct address 4632 * 4633 * @method address 4634 * @returns {String} client direct address 4635 */ 4636 Iban.prototype.address = function () { 4637 if (this.isDirect()) { 4638 var base36 = this._iban.substr(4); 4639 var asBn = new BigNumber(base36, 36); 4640 return padLeft(asBn.toString(16), 20); 4641 } 4642 4643 return ''; 4644 }; 4645 4646 Iban.prototype.toString = function () { 4647 return this._iban; 4648 }; 4649 4650 module.exports = Iban; 4651 4652 4653 },{"bignumber.js":"bignumber.js"}],34:[function(require,module,exports){ 4654 /* 4655 This file is part of web3.js. 4656 4657 web3.js is free software: you can redistribute it and/or modify 4658 it under the terms of the GNU Lesser General Public License as published by 4659 the Free Software Foundation, either version 3 of the License, or 4660 (at your option) any later version. 4661 4662 web3.js is distributed in the hope that it will be useful, 4663 but WITHOUT ANY WARRANTY; without even the implied warranty of 4664 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 4665 GNU Lesser General Public License for more details. 4666 4667 You should have received a copy of the GNU Lesser General Public License 4668 along with web3.js. If not, see <http://www.gnu.org/licenses/>. 4669 */ 4670 /** @file ipcprovider.js 4671 * @authors: 4672 * Fabian Vogelsteller <fabian@ethdev.com> 4673 * @date 2015 4674 */ 4675 4676 "use strict"; 4677 4678 var utils = require('../utils/utils'); 4679 var errors = require('./errors'); 4680 4681 4682 var IpcProvider = function (path, net) { 4683 var _this = this; 4684 this.responseCallbacks = {}; 4685 this.path = path; 4686 4687 this.connection = net.connect({path: this.path}); 4688 4689 this.connection.on('error', function(e){ 4690 console.error('IPC Connection Error', e); 4691 _this._timeout(); 4692 }); 4693 4694 this.connection.on('end', function(){ 4695 _this._timeout(); 4696 }); 4697 4698 4699 // LISTEN FOR CONNECTION RESPONSES 4700 this.connection.on('data', function(data) { 4701 /*jshint maxcomplexity: 6 */ 4702 4703 _this._parseResponse(data.toString()).forEach(function(result){ 4704 4705 var id = null; 4706 4707 // get the id which matches the returned id 4708 if(utils.isArray(result)) { 4709 result.forEach(function(load){ 4710 if(_this.responseCallbacks[load.id]) 4711 id = load.id; 4712 }); 4713 } else { 4714 id = result.id; 4715 } 4716 4717 // fire the callback 4718 if(_this.responseCallbacks[id]) { 4719 _this.responseCallbacks[id](null, result); 4720 delete _this.responseCallbacks[id]; 4721 } 4722 }); 4723 }); 4724 }; 4725 4726 /** 4727 Will parse the response and make an array out of it. 4728 4729 @method _parseResponse 4730 @param {String} data 4731 */ 4732 IpcProvider.prototype._parseResponse = function(data) { 4733 var _this = this, 4734 returnValues = []; 4735 4736 // DE-CHUNKER 4737 var dechunkedData = data 4738 .replace(/\}[\n\r]?\{/g,'}|--|{') // }{ 4739 .replace(/\}\][\n\r]?\[\{/g,'}]|--|[{') // }][{ 4740 .replace(/\}[\n\r]?\[\{/g,'}|--|[{') // }[{ 4741 .replace(/\}\][\n\r]?\{/g,'}]|--|{') // }]{ 4742 .split('|--|'); 4743 4744 dechunkedData.forEach(function(data){ 4745 4746 // prepend the last chunk 4747 if(_this.lastChunk) 4748 data = _this.lastChunk + data; 4749 4750 var result = null; 4751 4752 try { 4753 result = JSON.parse(data); 4754 4755 } catch(e) { 4756 4757 _this.lastChunk = data; 4758 4759 // start timeout to cancel all requests 4760 clearTimeout(_this.lastChunkTimeout); 4761 _this.lastChunkTimeout = setTimeout(function(){ 4762 _this._timeout(); 4763 throw errors.InvalidResponse(data); 4764 }, 1000 * 15); 4765 4766 return; 4767 } 4768 4769 // cancel timeout and set chunk to null 4770 clearTimeout(_this.lastChunkTimeout); 4771 _this.lastChunk = null; 4772 4773 if(result) 4774 returnValues.push(result); 4775 }); 4776 4777 return returnValues; 4778 }; 4779 4780 4781 /** 4782 Get the adds a callback to the responseCallbacks object, 4783 which will be called if a response matching the response Id will arrive. 4784 4785 @method _addResponseCallback 4786 */ 4787 IpcProvider.prototype._addResponseCallback = function(payload, callback) { 4788 var id = payload.id || payload[0].id; 4789 var method = payload.method || payload[0].method; 4790 4791 this.responseCallbacks[id] = callback; 4792 this.responseCallbacks[id].method = method; 4793 }; 4794 4795 /** 4796 Timeout all requests when the end/error event is fired 4797 4798 @method _timeout 4799 */ 4800 IpcProvider.prototype._timeout = function() { 4801 for(var key in this.responseCallbacks) { 4802 if(this.responseCallbacks.hasOwnProperty(key)){ 4803 this.responseCallbacks[key](errors.InvalidConnection('on IPC')); 4804 delete this.responseCallbacks[key]; 4805 } 4806 } 4807 }; 4808 4809 4810 /** 4811 Check if the current connection is still valid. 4812 4813 @method isConnected 4814 */ 4815 IpcProvider.prototype.isConnected = function() { 4816 var _this = this; 4817 4818 // try reconnect, when connection is gone 4819 if(!_this.connection.writable) 4820 _this.connection.connect({path: _this.path}); 4821 4822 return !!this.connection.writable; 4823 }; 4824 4825 IpcProvider.prototype.send = function (payload) { 4826 4827 if(this.connection.writeSync) { 4828 var result; 4829 4830 // try reconnect, when connection is gone 4831 if(!this.connection.writable) 4832 this.connection.connect({path: this.path}); 4833 4834 var data = this.connection.writeSync(JSON.stringify(payload)); 4835 4836 try { 4837 result = JSON.parse(data); 4838 } catch(e) { 4839 throw errors.InvalidResponse(data); 4840 } 4841 4842 return result; 4843 4844 } else { 4845 throw new Error('You tried to send "'+ payload.method +'" synchronously. Synchronous requests are not supported by the IPC provider.'); 4846 } 4847 }; 4848 4849 IpcProvider.prototype.sendAsync = function (payload, callback) { 4850 // try reconnect, when connection is gone 4851 if(!this.connection.writable) 4852 this.connection.connect({path: this.path}); 4853 4854 4855 this.connection.write(JSON.stringify(payload)); 4856 this._addResponseCallback(payload, callback); 4857 }; 4858 4859 module.exports = IpcProvider; 4860 4861 4862 },{"../utils/utils":20,"./errors":26}],35:[function(require,module,exports){ 4863 /* 4864 This file is part of web3.js. 4865 4866 web3.js is free software: you can redistribute it and/or modify 4867 it under the terms of the GNU Lesser General Public License as published by 4868 the Free Software Foundation, either version 3 of the License, or 4869 (at your option) any later version. 4870 4871 web3.js is distributed in the hope that it will be useful, 4872 but WITHOUT ANY WARRANTY; without even the implied warranty of 4873 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 4874 GNU Lesser General Public License for more details. 4875 4876 You should have received a copy of the GNU Lesser General Public License 4877 along with web3.js. If not, see <http://www.gnu.org/licenses/>. 4878 */ 4879 /** @file jsonrpc.js 4880 * @authors: 4881 * Marek Kotewicz <marek@ethdev.com> 4882 * Aaron Kumavis <aaron@kumavis.me> 4883 * @date 2015 4884 */ 4885 4886 // Initialize Jsonrpc as a simple object with utility functions. 4887 var Jsonrpc = { 4888 messageId: 0 4889 }; 4890 4891 /** 4892 * Should be called to valid json create payload object 4893 * 4894 * @method toPayload 4895 * @param {Function} method of jsonrpc call, required 4896 * @param {Array} params, an array of method params, optional 4897 * @returns {Object} valid jsonrpc payload object 4898 */ 4899 Jsonrpc.toPayload = function (method, params) { 4900 if (!method) 4901 console.error('jsonrpc method should be specified!'); 4902 4903 // advance message ID 4904 Jsonrpc.messageId++; 4905 4906 return { 4907 jsonrpc: '2.0', 4908 id: Jsonrpc.messageId, 4909 method: method, 4910 params: params || [] 4911 }; 4912 }; 4913 4914 /** 4915 * Should be called to check if jsonrpc response is valid 4916 * 4917 * @method isValidResponse 4918 * @param {Object} 4919 * @returns {Boolean} true if response is valid, otherwise false 4920 */ 4921 Jsonrpc.isValidResponse = function (response) { 4922 return Array.isArray(response) ? response.every(validateSingleMessage) : validateSingleMessage(response); 4923 4924 function validateSingleMessage(message){ 4925 return !!message && 4926 !message.error && 4927 message.jsonrpc === '2.0' && 4928 typeof message.id === 'number' && 4929 message.result !== undefined; // only undefined is not valid json object 4930 } 4931 }; 4932 4933 /** 4934 * Should be called to create batch payload object 4935 * 4936 * @method toBatchPayload 4937 * @param {Array} messages, an array of objects with method (required) and params (optional) fields 4938 * @returns {Array} batch payload 4939 */ 4940 Jsonrpc.toBatchPayload = function (messages) { 4941 return messages.map(function (message) { 4942 return Jsonrpc.toPayload(message.method, message.params); 4943 }); 4944 }; 4945 4946 module.exports = Jsonrpc; 4947 4948 4949 },{}],36:[function(require,module,exports){ 4950 /* 4951 This file is part of web3.js. 4952 4953 web3.js is free software: you can redistribute it and/or modify 4954 it under the terms of the GNU Lesser General Public License as published by 4955 the Free Software Foundation, either version 3 of the License, or 4956 (at your option) any later version. 4957 4958 web3.js is distributed in the hope that it will be useful, 4959 but WITHOUT ANY WARRANTY; without even the implied warranty of 4960 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 4961 GNU Lesser General Public License for more details. 4962 4963 You should have received a copy of the GNU Lesser General Public License 4964 along with web3.js. If not, see <http://www.gnu.org/licenses/>. 4965 */ 4966 /** 4967 * @file method.js 4968 * @author Marek Kotewicz <marek@ethdev.com> 4969 * @date 2015 4970 */ 4971 4972 var utils = require('../utils/utils'); 4973 var errors = require('./errors'); 4974 4975 var Method = function (options) { 4976 this.name = options.name; 4977 this.call = options.call; 4978 this.params = options.params || 0; 4979 this.inputFormatter = options.inputFormatter; 4980 this.outputFormatter = options.outputFormatter; 4981 this.requestManager = null; 4982 }; 4983 4984 Method.prototype.setRequestManager = function (rm) { 4985 this.requestManager = rm; 4986 }; 4987 4988 /** 4989 * Should be used to determine name of the jsonrpc method based on arguments 4990 * 4991 * @method getCall 4992 * @param {Array} arguments 4993 * @return {String} name of jsonrpc method 4994 */ 4995 Method.prototype.getCall = function (args) { 4996 return utils.isFunction(this.call) ? this.call(args) : this.call; 4997 }; 4998 4999 /** 5000 * Should be used to extract callback from array of arguments. Modifies input param 5001 * 5002 * @method extractCallback 5003 * @param {Array} arguments 5004 * @return {Function|Null} callback, if exists 5005 */ 5006 Method.prototype.extractCallback = function (args) { 5007 if (utils.isFunction(args[args.length - 1])) { 5008 return args.pop(); // modify the args array! 5009 } 5010 }; 5011 5012 /** 5013 * Should be called to check if the number of arguments is correct 5014 * 5015 * @method validateArgs 5016 * @param {Array} arguments 5017 * @throws {Error} if it is not 5018 */ 5019 Method.prototype.validateArgs = function (args) { 5020 if (args.length !== this.params) { 5021 throw errors.InvalidNumberOfRPCParams(); 5022 } 5023 }; 5024 5025 /** 5026 * Should be called to format input args of method 5027 * 5028 * @method formatInput 5029 * @param {Array} 5030 * @return {Array} 5031 */ 5032 Method.prototype.formatInput = function (args) { 5033 if (!this.inputFormatter) { 5034 return args; 5035 } 5036 5037 return this.inputFormatter.map(function (formatter, index) { 5038 return formatter ? formatter(args[index]) : args[index]; 5039 }); 5040 }; 5041 5042 /** 5043 * Should be called to format output(result) of method 5044 * 5045 * @method formatOutput 5046 * @param {Object} 5047 * @return {Object} 5048 */ 5049 Method.prototype.formatOutput = function (result) { 5050 return this.outputFormatter && result ? this.outputFormatter(result) : result; 5051 }; 5052 5053 /** 5054 * Should create payload from given input args 5055 * 5056 * @method toPayload 5057 * @param {Array} args 5058 * @return {Object} 5059 */ 5060 Method.prototype.toPayload = function (args) { 5061 var call = this.getCall(args); 5062 var callback = this.extractCallback(args); 5063 var params = this.formatInput(args); 5064 this.validateArgs(params); 5065 5066 return { 5067 method: call, 5068 params: params, 5069 callback: callback 5070 }; 5071 }; 5072 5073 Method.prototype.attachToObject = function (obj) { 5074 var func = this.buildCall(); 5075 func.call = this.call; // TODO!!! that's ugly. filter.js uses it 5076 var name = this.name.split('.'); 5077 if (name.length > 1) { 5078 obj[name[0]] = obj[name[0]] || {}; 5079 obj[name[0]][name[1]] = func; 5080 } else { 5081 obj[name[0]] = func; 5082 } 5083 }; 5084 5085 Method.prototype.buildCall = function() { 5086 var method = this; 5087 var send = function () { 5088 var payload = method.toPayload(Array.prototype.slice.call(arguments)); 5089 if (payload.callback) { 5090 return method.requestManager.sendAsync(payload, function (err, result) { 5091 payload.callback(err, method.formatOutput(result)); 5092 }); 5093 } 5094 return method.formatOutput(method.requestManager.send(payload)); 5095 }; 5096 send.request = this.request.bind(this); 5097 return send; 5098 }; 5099 5100 /** 5101 * Should be called to create pure JSONRPC request which can be used in batch request 5102 * 5103 * @method request 5104 * @param {...} params 5105 * @return {Object} jsonrpc request 5106 */ 5107 Method.prototype.request = function () { 5108 var payload = this.toPayload(Array.prototype.slice.call(arguments)); 5109 payload.format = this.formatOutput.bind(this); 5110 return payload; 5111 }; 5112 5113 module.exports = Method; 5114 5115 },{"../utils/utils":20,"./errors":26}],37:[function(require,module,exports){ 5116 /* 5117 This file is part of web3.js. 5118 5119 web3.js is free software: you can redistribute it and/or modify 5120 it under the terms of the GNU Lesser General Public License as published by 5121 the Free Software Foundation, either version 3 of the License, or 5122 (at your option) any later version. 5123 5124 web3.js is distributed in the hope that it will be useful, 5125 but WITHOUT ANY WARRANTY; without even the implied warranty of 5126 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 5127 GNU Lesser General Public License for more details. 5128 5129 You should have received a copy of the GNU Lesser General Public License 5130 along with web3.js. If not, see <http://www.gnu.org/licenses/>. 5131 */ 5132 /** @file db.js 5133 * @authors: 5134 * Marek Kotewicz <marek@ethdev.com> 5135 * @date 2015 5136 */ 5137 5138 var Method = require('../method'); 5139 5140 var DB = function (web3) { 5141 this._requestManager = web3._requestManager; 5142 5143 var self = this; 5144 5145 methods().forEach(function(method) { 5146 method.attachToObject(self); 5147 method.setRequestManager(web3._requestManager); 5148 }); 5149 }; 5150 5151 var methods = function () { 5152 var putString = new Method({ 5153 name: 'putString', 5154 call: 'db_putString', 5155 params: 3 5156 }); 5157 5158 var getString = new Method({ 5159 name: 'getString', 5160 call: 'db_getString', 5161 params: 2 5162 }); 5163 5164 var putHex = new Method({ 5165 name: 'putHex', 5166 call: 'db_putHex', 5167 params: 3 5168 }); 5169 5170 var getHex = new Method({ 5171 name: 'getHex', 5172 call: 'db_getHex', 5173 params: 2 5174 }); 5175 5176 return [ 5177 putString, getString, putHex, getHex 5178 ]; 5179 }; 5180 5181 module.exports = DB; 5182 5183 },{"../method":36}],38:[function(require,module,exports){ 5184 /* 5185 This file is part of web3.js. 5186 5187 web3.js is free software: you can redistribute it and/or modify 5188 it under the terms of the GNU Lesser General Public License as published by 5189 the Free Software Foundation, either version 3 of the License, or 5190 (at your option) any later version. 5191 5192 web3.js is distributed in the hope that it will be useful, 5193 but WITHOUT ANY WARRANTY; without even the implied warranty of 5194 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 5195 GNU Lesser General Public License for more details. 5196 5197 You should have received a copy of the GNU Lesser General Public License 5198 along with web3.js. If not, see <http://www.gnu.org/licenses/>. 5199 */ 5200 /** 5201 * @file eth.js 5202 * @author Marek Kotewicz <marek@ethdev.com> 5203 * @author Fabian Vogelsteller <fabian@ethdev.com> 5204 * @date 2015 5205 */ 5206 5207 "use strict"; 5208 5209 var formatters = require('../formatters'); 5210 var utils = require('../../utils/utils'); 5211 var Method = require('../method'); 5212 var Property = require('../property'); 5213 var c = require('../../utils/config'); 5214 var Contract = require('../contract'); 5215 var watches = require('./watches'); 5216 var Filter = require('../filter'); 5217 var IsSyncing = require('../syncing'); 5218 var namereg = require('../namereg'); 5219 var Iban = require('../iban'); 5220 var transfer = require('../transfer'); 5221 5222 var blockCall = function (args) { 5223 return (utils.isString(args[0]) && args[0].indexOf('0x') === 0) ? "eth_getBlockByHash" : "eth_getBlockByNumber"; 5224 }; 5225 5226 var transactionFromBlockCall = function (args) { 5227 return (utils.isString(args[0]) && args[0].indexOf('0x') === 0) ? 'eth_getTransactionByBlockHashAndIndex' : 'eth_getTransactionByBlockNumberAndIndex'; 5228 }; 5229 5230 var uncleCall = function (args) { 5231 return (utils.isString(args[0]) && args[0].indexOf('0x') === 0) ? 'eth_getUncleByBlockHashAndIndex' : 'eth_getUncleByBlockNumberAndIndex'; 5232 }; 5233 5234 var getBlockTransactionCountCall = function (args) { 5235 return (utils.isString(args[0]) && args[0].indexOf('0x') === 0) ? 'eth_getBlockTransactionCountByHash' : 'eth_getBlockTransactionCountByNumber'; 5236 }; 5237 5238 var uncleCountCall = function (args) { 5239 return (utils.isString(args[0]) && args[0].indexOf('0x') === 0) ? 'eth_getUncleCountByBlockHash' : 'eth_getUncleCountByBlockNumber'; 5240 }; 5241 5242 function Eth(web3) { 5243 this._requestManager = web3._requestManager; 5244 5245 var self = this; 5246 5247 methods().forEach(function(method) { 5248 method.attachToObject(self); 5249 method.setRequestManager(self._requestManager); 5250 }); 5251 5252 properties().forEach(function(p) { 5253 p.attachToObject(self); 5254 p.setRequestManager(self._requestManager); 5255 }); 5256 5257 5258 this.iban = Iban; 5259 this.sendIBANTransaction = transfer.bind(null, this); 5260 } 5261 5262 Object.defineProperty(Eth.prototype, 'defaultBlock', { 5263 get: function () { 5264 return c.defaultBlock; 5265 }, 5266 set: function (val) { 5267 c.defaultBlock = val; 5268 return val; 5269 } 5270 }); 5271 5272 Object.defineProperty(Eth.prototype, 'defaultAccount', { 5273 get: function () { 5274 return c.defaultAccount; 5275 }, 5276 set: function (val) { 5277 c.defaultAccount = val; 5278 return val; 5279 } 5280 }); 5281 5282 var methods = function () { 5283 var getBalance = new Method({ 5284 name: 'getBalance', 5285 call: 'eth_getBalance', 5286 params: 2, 5287 inputFormatter: [formatters.inputAddressFormatter, formatters.inputDefaultBlockNumberFormatter], 5288 outputFormatter: formatters.outputBigNumberFormatter 5289 }); 5290 5291 var getStorageAt = new Method({ 5292 name: 'getStorageAt', 5293 call: 'eth_getStorageAt', 5294 params: 3, 5295 inputFormatter: [null, utils.toHex, formatters.inputDefaultBlockNumberFormatter] 5296 }); 5297 5298 var getCode = new Method({ 5299 name: 'getCode', 5300 call: 'eth_getCode', 5301 params: 2, 5302 inputFormatter: [formatters.inputAddressFormatter, formatters.inputDefaultBlockNumberFormatter] 5303 }); 5304 5305 var getBlock = new Method({ 5306 name: 'getBlock', 5307 call: blockCall, 5308 params: 2, 5309 inputFormatter: [formatters.inputBlockNumberFormatter, function (val) { return !!val; }], 5310 outputFormatter: formatters.outputBlockFormatter 5311 }); 5312 5313 var getUncle = new Method({ 5314 name: 'getUncle', 5315 call: uncleCall, 5316 params: 2, 5317 inputFormatter: [formatters.inputBlockNumberFormatter, utils.toHex], 5318 outputFormatter: formatters.outputBlockFormatter, 5319 5320 }); 5321 5322 var getCompilers = new Method({ 5323 name: 'getCompilers', 5324 call: 'eth_getCompilers', 5325 params: 0 5326 }); 5327 5328 var getBlockTransactionCount = new Method({ 5329 name: 'getBlockTransactionCount', 5330 call: getBlockTransactionCountCall, 5331 params: 1, 5332 inputFormatter: [formatters.inputBlockNumberFormatter], 5333 outputFormatter: utils.toDecimal 5334 }); 5335 5336 var getBlockUncleCount = new Method({ 5337 name: 'getBlockUncleCount', 5338 call: uncleCountCall, 5339 params: 1, 5340 inputFormatter: [formatters.inputBlockNumberFormatter], 5341 outputFormatter: utils.toDecimal 5342 }); 5343 5344 var getTransaction = new Method({ 5345 name: 'getTransaction', 5346 call: 'eth_getTransactionByHash', 5347 params: 1, 5348 outputFormatter: formatters.outputTransactionFormatter 5349 }); 5350 5351 var getTransactionFromBlock = new Method({ 5352 name: 'getTransactionFromBlock', 5353 call: transactionFromBlockCall, 5354 params: 2, 5355 inputFormatter: [formatters.inputBlockNumberFormatter, utils.toHex], 5356 outputFormatter: formatters.outputTransactionFormatter 5357 }); 5358 5359 var getTransactionReceipt = new Method({ 5360 name: 'getTransactionReceipt', 5361 call: 'eth_getTransactionReceipt', 5362 params: 1, 5363 outputFormatter: formatters.outputTransactionReceiptFormatter 5364 }); 5365 5366 var getTransactionCount = new Method({ 5367 name: 'getTransactionCount', 5368 call: 'eth_getTransactionCount', 5369 params: 2, 5370 inputFormatter: [null, formatters.inputDefaultBlockNumberFormatter], 5371 outputFormatter: utils.toDecimal 5372 }); 5373 5374 var sendRawTransaction = new Method({ 5375 name: 'sendRawTransaction', 5376 call: 'eth_sendRawTransaction', 5377 params: 1, 5378 inputFormatter: [null] 5379 }); 5380 5381 var sendTransaction = new Method({ 5382 name: 'sendTransaction', 5383 call: 'eth_sendTransaction', 5384 params: 1, 5385 inputFormatter: [formatters.inputTransactionFormatter] 5386 }); 5387 5388 var signTransaction = new Method({ 5389 name: 'signTransaction', 5390 call: 'eth_signTransaction', 5391 params: 1, 5392 inputFormatter: [formatters.inputTransactionFormatter] 5393 }); 5394 5395 var sign = new Method({ 5396 name: 'sign', 5397 call: 'eth_sign', 5398 params: 2, 5399 inputFormatter: [formatters.inputAddressFormatter, null] 5400 }); 5401 5402 var call = new Method({ 5403 name: 'call', 5404 call: 'eth_call', 5405 params: 2, 5406 inputFormatter: [formatters.inputCallFormatter, formatters.inputDefaultBlockNumberFormatter] 5407 }); 5408 5409 var estimateGas = new Method({ 5410 name: 'estimateGas', 5411 call: 'eth_estimateGas', 5412 params: 1, 5413 inputFormatter: [formatters.inputCallFormatter], 5414 outputFormatter: utils.toDecimal 5415 }); 5416 5417 var compileSolidity = new Method({ 5418 name: 'compile.solidity', 5419 call: 'eth_compileSolidity', 5420 params: 1 5421 }); 5422 5423 var compileLLL = new Method({ 5424 name: 'compile.lll', 5425 call: 'eth_compileLLL', 5426 params: 1 5427 }); 5428 5429 var compileSerpent = new Method({ 5430 name: 'compile.serpent', 5431 call: 'eth_compileSerpent', 5432 params: 1 5433 }); 5434 5435 var submitWork = new Method({ 5436 name: 'submitWork', 5437 call: 'eth_submitWork', 5438 params: 3 5439 }); 5440 5441 var getWork = new Method({ 5442 name: 'getWork', 5443 call: 'eth_getWork', 5444 params: 0 5445 }); 5446 5447 return [ 5448 getBalance, 5449 getStorageAt, 5450 getCode, 5451 getBlock, 5452 getUncle, 5453 getCompilers, 5454 getBlockTransactionCount, 5455 getBlockUncleCount, 5456 getTransaction, 5457 getTransactionFromBlock, 5458 getTransactionReceipt, 5459 getTransactionCount, 5460 call, 5461 estimateGas, 5462 sendRawTransaction, 5463 signTransaction, 5464 sendTransaction, 5465 sign, 5466 compileSolidity, 5467 compileLLL, 5468 compileSerpent, 5469 submitWork, 5470 getWork 5471 ]; 5472 }; 5473 5474 5475 var properties = function () { 5476 return [ 5477 new Property({ 5478 name: 'coinbase', 5479 getter: 'eth_coinbase' 5480 }), 5481 new Property({ 5482 name: 'mining', 5483 getter: 'eth_mining' 5484 }), 5485 new Property({ 5486 name: 'hashrate', 5487 getter: 'eth_hashrate', 5488 outputFormatter: utils.toDecimal 5489 }), 5490 new Property({ 5491 name: 'syncing', 5492 getter: 'eth_syncing', 5493 outputFormatter: formatters.outputSyncingFormatter 5494 }), 5495 new Property({ 5496 name: 'gasPrice', 5497 getter: 'eth_gasPrice', 5498 outputFormatter: formatters.outputBigNumberFormatter 5499 }), 5500 new Property({ 5501 name: 'accounts', 5502 getter: 'eth_accounts' 5503 }), 5504 new Property({ 5505 name: 'blockNumber', 5506 getter: 'eth_blockNumber', 5507 outputFormatter: utils.toDecimal 5508 }), 5509 new Property({ 5510 name: 'protocolVersion', 5511 getter: 'eth_protocolVersion' 5512 }) 5513 ]; 5514 }; 5515 5516 Eth.prototype.contract = function (abi) { 5517 var factory = new Contract(this, abi); 5518 return factory; 5519 }; 5520 5521 Eth.prototype.filter = function (options, callback, filterCreationErrorCallback) { 5522 return new Filter(options, 'eth', this._requestManager, watches.eth(), formatters.outputLogFormatter, callback, filterCreationErrorCallback); 5523 }; 5524 5525 Eth.prototype.namereg = function () { 5526 return this.contract(namereg.global.abi).at(namereg.global.address); 5527 }; 5528 5529 Eth.prototype.icapNamereg = function () { 5530 return this.contract(namereg.icap.abi).at(namereg.icap.address); 5531 }; 5532 5533 Eth.prototype.isSyncing = function (callback) { 5534 return new IsSyncing(this._requestManager, callback); 5535 }; 5536 5537 module.exports = Eth; 5538 5539 },{"../../utils/config":18,"../../utils/utils":20,"../contract":25,"../filter":29,"../formatters":30,"../iban":33,"../method":36,"../namereg":44,"../property":45,"../syncing":48,"../transfer":49,"./watches":43}],39:[function(require,module,exports){ 5540 /* 5541 This file is part of web3.js. 5542 5543 web3.js is free software: you can redistribute it and/or modify 5544 it under the terms of the GNU Lesser General Public License as published by 5545 the Free Software Foundation, either version 3 of the License, or 5546 (at your option) any later version. 5547 5548 web3.js is distributed in the hope that it will be useful, 5549 but WITHOUT ANY WARRANTY; without even the implied warranty of 5550 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 5551 GNU Lesser General Public License for more details. 5552 5553 You should have received a copy of the GNU Lesser General Public License 5554 along with web3.js. If not, see <http://www.gnu.org/licenses/>. 5555 */ 5556 /** @file eth.js 5557 * @authors: 5558 * Marek Kotewicz <marek@ethdev.com> 5559 * @date 2015 5560 */ 5561 5562 var utils = require('../../utils/utils'); 5563 var Property = require('../property'); 5564 5565 var Net = function (web3) { 5566 this._requestManager = web3._requestManager; 5567 5568 var self = this; 5569 5570 properties().forEach(function(p) { 5571 p.attachToObject(self); 5572 p.setRequestManager(web3._requestManager); 5573 }); 5574 }; 5575 5576 /// @returns an array of objects describing web3.eth api properties 5577 var properties = function () { 5578 return [ 5579 new Property({ 5580 name: 'listening', 5581 getter: 'net_listening' 5582 }), 5583 new Property({ 5584 name: 'peerCount', 5585 getter: 'net_peerCount', 5586 outputFormatter: utils.toDecimal 5587 }) 5588 ]; 5589 }; 5590 5591 module.exports = Net; 5592 5593 },{"../../utils/utils":20,"../property":45}],40:[function(require,module,exports){ 5594 /* 5595 This file is part of web3.js. 5596 5597 web3.js is free software: you can redistribute it and/or modify 5598 it under the terms of the GNU Lesser General Public License as published by 5599 the Free Software Foundation, either version 3 of the License, or 5600 (at your option) any later version. 5601 5602 web3.js is distributed in the hope that it will be useful, 5603 but WITHOUT ANY WARRANTY; without even the implied warranty of 5604 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 5605 GNU Lesser General Public License for more details. 5606 5607 You should have received a copy of the GNU Lesser General Public License 5608 along with web3.js. If not, see <http://www.gnu.org/licenses/>. 5609 */ 5610 /** 5611 * @file eth.js 5612 * @author Marek Kotewicz <marek@ethdev.com> 5613 * @author Fabian Vogelsteller <fabian@ethdev.com> 5614 * @date 2015 5615 */ 5616 5617 "use strict"; 5618 5619 var Method = require('../method'); 5620 var Property = require('../property'); 5621 var formatters = require('../formatters'); 5622 5623 function Personal(web3) { 5624 this._requestManager = web3._requestManager; 5625 5626 var self = this; 5627 5628 methods().forEach(function(method) { 5629 method.attachToObject(self); 5630 method.setRequestManager(self._requestManager); 5631 }); 5632 5633 properties().forEach(function(p) { 5634 p.attachToObject(self); 5635 p.setRequestManager(self._requestManager); 5636 }); 5637 } 5638 5639 var methods = function () { 5640 var newAccount = new Method({ 5641 name: 'newAccount', 5642 call: 'personal_newAccount', 5643 params: 1, 5644 inputFormatter: [null] 5645 }); 5646 5647 var importRawKey = new Method({ 5648 name: 'importRawKey', 5649 call: 'personal_importRawKey', 5650 params: 2 5651 }); 5652 5653 var sign = new Method({ 5654 name: 'sign', 5655 call: 'personal_sign', 5656 params: 3, 5657 inputFormatter: [null, formatters.inputAddressFormatter, null] 5658 }); 5659 5660 var ecRecover = new Method({ 5661 name: 'ecRecover', 5662 call: 'personal_ecRecover', 5663 params: 2 5664 }); 5665 5666 var unlockAccount = new Method({ 5667 name: 'unlockAccount', 5668 call: 'personal_unlockAccount', 5669 params: 3, 5670 inputFormatter: [formatters.inputAddressFormatter, null, null] 5671 }); 5672 5673 var sendTransaction = new Method({ 5674 name: 'sendTransaction', 5675 call: 'personal_sendTransaction', 5676 params: 2, 5677 inputFormatter: [formatters.inputTransactionFormatter, null] 5678 }); 5679 5680 var lockAccount = new Method({ 5681 name: 'lockAccount', 5682 call: 'personal_lockAccount', 5683 params: 1, 5684 inputFormatter: [formatters.inputAddressFormatter] 5685 }); 5686 5687 return [ 5688 newAccount, 5689 importRawKey, 5690 unlockAccount, 5691 ecRecover, 5692 sign, 5693 sendTransaction, 5694 lockAccount 5695 ]; 5696 }; 5697 5698 var properties = function () { 5699 return [ 5700 new Property({ 5701 name: 'listAccounts', 5702 getter: 'personal_listAccounts' 5703 }) 5704 ]; 5705 }; 5706 5707 5708 module.exports = Personal; 5709 5710 },{"../formatters":30,"../method":36,"../property":45}],41:[function(require,module,exports){ 5711 /* 5712 This file is part of web3.js. 5713 5714 web3.js is free software: you can redistribute it and/or modify 5715 it under the terms of the GNU Lesser General Public License as published by 5716 the Free Software Foundation, either version 3 of the License, or 5717 (at your option) any later version. 5718 5719 web3.js is distributed in the hope that it will be useful, 5720 but WITHOUT ANY WARRANTY; without even the implied warranty of 5721 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 5722 GNU Lesser General Public License for more details. 5723 5724 You should have received a copy of the GNU Lesser General Public License 5725 along with web3.js. If not, see <http://www.gnu.org/licenses/>. 5726 */ 5727 /** @file shh.js 5728 * @authors: 5729 * Fabian Vogelsteller <fabian@ethereum.org> 5730 * Marek Kotewicz <marek@ethcore.io> 5731 * @date 2017 5732 */ 5733 5734 var Method = require('../method'); 5735 var Filter = require('../filter'); 5736 var watches = require('./watches'); 5737 5738 var Shh = function (web3) { 5739 this._requestManager = web3._requestManager; 5740 5741 var self = this; 5742 5743 methods().forEach(function(method) { 5744 method.attachToObject(self); 5745 method.setRequestManager(self._requestManager); 5746 }); 5747 }; 5748 5749 Shh.prototype.newMessageFilter = function (options, callback, filterCreationErrorCallback) { 5750 return new Filter(options, 'shh', this._requestManager, watches.shh(), null, callback, filterCreationErrorCallback); 5751 }; 5752 5753 var methods = function () { 5754 5755 return [ 5756 new Method({ 5757 name: 'version', 5758 call: 'shh_version', 5759 params: 0 5760 }), 5761 new Method({ 5762 name: 'info', 5763 call: 'shh_info', 5764 params: 0 5765 }), 5766 new Method({ 5767 name: 'setMaxMessageSize', 5768 call: 'shh_setMaxMessageSize', 5769 params: 1 5770 }), 5771 new Method({ 5772 name: 'setMinPoW', 5773 call: 'shh_setMinPoW', 5774 params: 1 5775 }), 5776 new Method({ 5777 name: 'markTrustedPeer', 5778 call: 'shh_markTrustedPeer', 5779 params: 1 5780 }), 5781 new Method({ 5782 name: 'newKeyPair', 5783 call: 'shh_newKeyPair', 5784 params: 0 5785 }), 5786 new Method({ 5787 name: 'addPrivateKey', 5788 call: 'shh_addPrivateKey', 5789 params: 1 5790 }), 5791 new Method({ 5792 name: 'deleteKeyPair', 5793 call: 'shh_deleteKeyPair', 5794 params: 1 5795 }), 5796 new Method({ 5797 name: 'hasKeyPair', 5798 call: 'shh_hasKeyPair', 5799 params: 1 5800 }), 5801 new Method({ 5802 name: 'getPublicKey', 5803 call: 'shh_getPublicKey', 5804 params: 1 5805 }), 5806 new Method({ 5807 name: 'getPrivateKey', 5808 call: 'shh_getPrivateKey', 5809 params: 1 5810 }), 5811 new Method({ 5812 name: 'newSymKey', 5813 call: 'shh_newSymKey', 5814 params: 0 5815 }), 5816 new Method({ 5817 name: 'addSymKey', 5818 call: 'shh_addSymKey', 5819 params: 1 5820 }), 5821 new Method({ 5822 name: 'generateSymKeyFromPassword', 5823 call: 'shh_generateSymKeyFromPassword', 5824 params: 1 5825 }), 5826 new Method({ 5827 name: 'hasSymKey', 5828 call: 'shh_hasSymKey', 5829 params: 1 5830 }), 5831 new Method({ 5832 name: 'getSymKey', 5833 call: 'shh_getSymKey', 5834 params: 1 5835 }), 5836 new Method({ 5837 name: 'deleteSymKey', 5838 call: 'shh_deleteSymKey', 5839 params: 1 5840 }), 5841 5842 // subscribe and unsubscribe missing 5843 5844 new Method({ 5845 name: 'post', 5846 call: 'shh_post', 5847 params: 1, 5848 inputFormatter: [null] 5849 }) 5850 ]; 5851 }; 5852 5853 module.exports = Shh; 5854 5855 5856 },{"../filter":29,"../method":36,"./watches":43}],42:[function(require,module,exports){ 5857 /* 5858 This file is part of web3.js. 5859 5860 web3.js is free software: you can redistribute it and/or modify 5861 it under the terms of the GNU Lesser General Public License as published by 5862 the Free Software Foundation, either version 3 of the License, or 5863 (at your option) any later version. 5864 5865 web3.js is distributed in the hope that it will be useful, 5866 but WITHOUT ANY WARRANTY; without even the implied warranty of 5867 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 5868 GNU Lesser General Public License for more details. 5869 5870 You should have received a copy of the GNU Lesser General Public License 5871 along with web3.js. If not, see <http://www.gnu.org/licenses/>. 5872 */ 5873 /** 5874 * @file bzz.js 5875 * @author Alex Beregszaszi <alex@rtfs.hu> 5876 * @date 2016 5877 * 5878 * Reference: https://github.com/scroll-tech/go-ethereum/blob/swarm/internal/web3ext/web3ext.go#L33 5879 */ 5880 5881 "use strict"; 5882 5883 var Method = require('../method'); 5884 var Property = require('../property'); 5885 5886 function Swarm(web3) { 5887 this._requestManager = web3._requestManager; 5888 5889 var self = this; 5890 5891 methods().forEach(function(method) { 5892 method.attachToObject(self); 5893 method.setRequestManager(self._requestManager); 5894 }); 5895 5896 properties().forEach(function(p) { 5897 p.attachToObject(self); 5898 p.setRequestManager(self._requestManager); 5899 }); 5900 } 5901 5902 var methods = function () { 5903 var blockNetworkRead = new Method({ 5904 name: 'blockNetworkRead', 5905 call: 'bzz_blockNetworkRead', 5906 params: 1, 5907 inputFormatter: [null] 5908 }); 5909 5910 var syncEnabled = new Method({ 5911 name: 'syncEnabled', 5912 call: 'bzz_syncEnabled', 5913 params: 1, 5914 inputFormatter: [null] 5915 }); 5916 5917 var swapEnabled = new Method({ 5918 name: 'swapEnabled', 5919 call: 'bzz_swapEnabled', 5920 params: 1, 5921 inputFormatter: [null] 5922 }); 5923 5924 var download = new Method({ 5925 name: 'download', 5926 call: 'bzz_download', 5927 params: 2, 5928 inputFormatter: [null, null] 5929 }); 5930 5931 var upload = new Method({ 5932 name: 'upload', 5933 call: 'bzz_upload', 5934 params: 2, 5935 inputFormatter: [null, null] 5936 }); 5937 5938 var retrieve = new Method({ 5939 name: 'retrieve', 5940 call: 'bzz_retrieve', 5941 params: 1, 5942 inputFormatter: [null] 5943 }); 5944 5945 var store = new Method({ 5946 name: 'store', 5947 call: 'bzz_store', 5948 params: 2, 5949 inputFormatter: [null, null] 5950 }); 5951 5952 var get = new Method({ 5953 name: 'get', 5954 call: 'bzz_get', 5955 params: 1, 5956 inputFormatter: [null] 5957 }); 5958 5959 var put = new Method({ 5960 name: 'put', 5961 call: 'bzz_put', 5962 params: 2, 5963 inputFormatter: [null, null] 5964 }); 5965 5966 var modify = new Method({ 5967 name: 'modify', 5968 call: 'bzz_modify', 5969 params: 4, 5970 inputFormatter: [null, null, null, null] 5971 }); 5972 5973 return [ 5974 blockNetworkRead, 5975 syncEnabled, 5976 swapEnabled, 5977 download, 5978 upload, 5979 retrieve, 5980 store, 5981 get, 5982 put, 5983 modify 5984 ]; 5985 }; 5986 5987 var properties = function () { 5988 return [ 5989 new Property({ 5990 name: 'hive', 5991 getter: 'bzz_hive' 5992 }), 5993 new Property({ 5994 name: 'info', 5995 getter: 'bzz_info' 5996 }) 5997 ]; 5998 }; 5999 6000 6001 module.exports = Swarm; 6002 6003 },{"../method":36,"../property":45}],43:[function(require,module,exports){ 6004 /* 6005 This file is part of web3.js. 6006 6007 web3.js is free software: you can redistribute it and/or modify 6008 it under the terms of the GNU Lesser General Public License as published by 6009 the Free Software Foundation, either version 3 of the License, or 6010 (at your option) any later version. 6011 6012 web3.js is distributed in the hope that it will be useful, 6013 but WITHOUT ANY WARRANTY; without even the implied warranty of 6014 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 6015 GNU Lesser General Public License for more details. 6016 6017 You should have received a copy of the GNU Lesser General Public License 6018 along with web3.js. If not, see <http://www.gnu.org/licenses/>. 6019 */ 6020 /** @file watches.js 6021 * @authors: 6022 * Marek Kotewicz <marek@ethdev.com> 6023 * @date 2015 6024 */ 6025 6026 var Method = require('../method'); 6027 6028 /// @returns an array of objects describing web3.eth.filter api methods 6029 var eth = function () { 6030 var newFilterCall = function (args) { 6031 var type = args[0]; 6032 6033 switch(type) { 6034 case 'latest': 6035 args.shift(); 6036 this.params = 0; 6037 return 'eth_newBlockFilter'; 6038 case 'pending': 6039 args.shift(); 6040 this.params = 0; 6041 return 'eth_newPendingTransactionFilter'; 6042 default: 6043 return 'eth_newFilter'; 6044 } 6045 }; 6046 6047 var newFilter = new Method({ 6048 name: 'newFilter', 6049 call: newFilterCall, 6050 params: 1 6051 }); 6052 6053 var uninstallFilter = new Method({ 6054 name: 'uninstallFilter', 6055 call: 'eth_uninstallFilter', 6056 params: 1 6057 }); 6058 6059 var getLogs = new Method({ 6060 name: 'getLogs', 6061 call: 'eth_getFilterLogs', 6062 params: 1 6063 }); 6064 6065 var poll = new Method({ 6066 name: 'poll', 6067 call: 'eth_getFilterChanges', 6068 params: 1 6069 }); 6070 6071 return [ 6072 newFilter, 6073 uninstallFilter, 6074 getLogs, 6075 poll 6076 ]; 6077 }; 6078 6079 /// @returns an array of objects describing web3.shh.watch api methods 6080 var shh = function () { 6081 6082 return [ 6083 new Method({ 6084 name: 'newFilter', 6085 call: 'shh_newMessageFilter', 6086 params: 1 6087 }), 6088 new Method({ 6089 name: 'uninstallFilter', 6090 call: 'shh_deleteMessageFilter', 6091 params: 1 6092 }), 6093 new Method({ 6094 name: 'getLogs', 6095 call: 'shh_getFilterMessages', 6096 params: 1 6097 }), 6098 new Method({ 6099 name: 'poll', 6100 call: 'shh_getFilterMessages', 6101 params: 1 6102 }) 6103 ]; 6104 }; 6105 6106 module.exports = { 6107 eth: eth, 6108 shh: shh 6109 }; 6110 6111 6112 },{"../method":36}],44:[function(require,module,exports){ 6113 /* 6114 This file is part of web3.js. 6115 6116 web3.js is free software: you can redistribute it and/or modify 6117 it under the terms of the GNU Lesser General Public License as published by 6118 the Free Software Foundation, either version 3 of the License, or 6119 (at your option) any later version. 6120 6121 web3.js is distributed in the hope that it will be useful, 6122 but WITHOUT ANY WARRANTY; without even the implied warranty of 6123 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 6124 GNU Lesser General Public License for more details. 6125 6126 You should have received a copy of the GNU Lesser General Public License 6127 along with web3.js. If not, see <http://www.gnu.org/licenses/>. 6128 */ 6129 /** 6130 * @file namereg.js 6131 * @author Marek Kotewicz <marek@ethdev.com> 6132 * @date 2015 6133 */ 6134 6135 var globalRegistrarAbi = require('../contracts/GlobalRegistrar.json'); 6136 var icapRegistrarAbi= require('../contracts/ICAPRegistrar.json'); 6137 6138 var globalNameregAddress = '0xc6d9d2cd449a754c494264e1809c50e34d64562b'; 6139 var icapNameregAddress = '0xa1a111bc074c9cfa781f0c38e63bd51c91b8af00'; 6140 6141 module.exports = { 6142 global: { 6143 abi: globalRegistrarAbi, 6144 address: globalNameregAddress 6145 }, 6146 icap: { 6147 abi: icapRegistrarAbi, 6148 address: icapNameregAddress 6149 } 6150 }; 6151 6152 6153 },{"../contracts/GlobalRegistrar.json":1,"../contracts/ICAPRegistrar.json":2}],45:[function(require,module,exports){ 6154 /* 6155 This file is part of web3.js. 6156 6157 web3.js is free software: you can redistribute it and/or modify 6158 it under the terms of the GNU Lesser General Public License as published by 6159 the Free Software Foundation, either version 3 of the License, or 6160 (at your option) any later version. 6161 6162 web3.js is distributed in the hope that it will be useful, 6163 but WITHOUT ANY WARRANTY; without even the implied warranty of 6164 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 6165 GNU Lesser General Public License for more details. 6166 6167 You should have received a copy of the GNU Lesser General Public License 6168 along with web3.js. If not, see <http://www.gnu.org/licenses/>. 6169 */ 6170 /** 6171 * @file property.js 6172 * @author Fabian Vogelsteller <fabian@frozeman.de> 6173 * @author Marek Kotewicz <marek@ethdev.com> 6174 * @date 2015 6175 */ 6176 6177 var utils = require('../utils/utils'); 6178 6179 var Property = function (options) { 6180 this.name = options.name; 6181 this.getter = options.getter; 6182 this.setter = options.setter; 6183 this.outputFormatter = options.outputFormatter; 6184 this.inputFormatter = options.inputFormatter; 6185 this.requestManager = null; 6186 }; 6187 6188 Property.prototype.setRequestManager = function (rm) { 6189 this.requestManager = rm; 6190 }; 6191 6192 /** 6193 * Should be called to format input args of method 6194 * 6195 * @method formatInput 6196 * @param {Array} 6197 * @return {Array} 6198 */ 6199 Property.prototype.formatInput = function (arg) { 6200 return this.inputFormatter ? this.inputFormatter(arg) : arg; 6201 }; 6202 6203 /** 6204 * Should be called to format output(result) of method 6205 * 6206 * @method formatOutput 6207 * @param {Object} 6208 * @return {Object} 6209 */ 6210 Property.prototype.formatOutput = function (result) { 6211 return this.outputFormatter && result !== null && result !== undefined ? this.outputFormatter(result) : result; 6212 }; 6213 6214 /** 6215 * Should be used to extract callback from array of arguments. Modifies input param 6216 * 6217 * @method extractCallback 6218 * @param {Array} arguments 6219 * @return {Function|Null} callback, if exists 6220 */ 6221 Property.prototype.extractCallback = function (args) { 6222 if (utils.isFunction(args[args.length - 1])) { 6223 return args.pop(); // modify the args array! 6224 } 6225 }; 6226 6227 6228 /** 6229 * Should attach function to method 6230 * 6231 * @method attachToObject 6232 * @param {Object} 6233 * @param {Function} 6234 */ 6235 Property.prototype.attachToObject = function (obj) { 6236 var proto = { 6237 get: this.buildGet(), 6238 enumerable: true 6239 }; 6240 6241 var names = this.name.split('.'); 6242 var name = names[0]; 6243 if (names.length > 1) { 6244 obj[names[0]] = obj[names[0]] || {}; 6245 obj = obj[names[0]]; 6246 name = names[1]; 6247 } 6248 6249 Object.defineProperty(obj, name, proto); 6250 obj[asyncGetterName(name)] = this.buildAsyncGet(); 6251 }; 6252 6253 var asyncGetterName = function (name) { 6254 return 'get' + name.charAt(0).toUpperCase() + name.slice(1); 6255 }; 6256 6257 Property.prototype.buildGet = function () { 6258 var property = this; 6259 return function get() { 6260 return property.formatOutput(property.requestManager.send({ 6261 method: property.getter 6262 })); 6263 }; 6264 }; 6265 6266 Property.prototype.buildAsyncGet = function () { 6267 var property = this; 6268 var get = function (callback) { 6269 property.requestManager.sendAsync({ 6270 method: property.getter 6271 }, function (err, result) { 6272 callback(err, property.formatOutput(result)); 6273 }); 6274 }; 6275 get.request = this.request.bind(this); 6276 return get; 6277 }; 6278 6279 /** 6280 * Should be called to create pure JSONRPC request which can be used in batch request 6281 * 6282 * @method request 6283 * @param {...} params 6284 * @return {Object} jsonrpc request 6285 */ 6286 Property.prototype.request = function () { 6287 var payload = { 6288 method: this.getter, 6289 params: [], 6290 callback: this.extractCallback(Array.prototype.slice.call(arguments)) 6291 }; 6292 payload.format = this.formatOutput.bind(this); 6293 return payload; 6294 }; 6295 6296 module.exports = Property; 6297 6298 6299 },{"../utils/utils":20}],46:[function(require,module,exports){ 6300 /* 6301 This file is part of web3.js. 6302 6303 web3.js is free software: you can redistribute it and/or modify 6304 it under the terms of the GNU Lesser General Public License as published by 6305 the Free Software Foundation, either version 3 of the License, or 6306 (at your option) any later version. 6307 6308 web3.js is distributed in the hope that it will be useful, 6309 but WITHOUT ANY WARRANTY; without even the implied warranty of 6310 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 6311 GNU Lesser General Public License for more details. 6312 6313 You should have received a copy of the GNU Lesser General Public License 6314 along with web3.js. If not, see <http://www.gnu.org/licenses/>. 6315 */ 6316 /** 6317 * @file requestmanager.js 6318 * @author Jeffrey Wilcke <jeff@ethdev.com> 6319 * @author Marek Kotewicz <marek@ethdev.com> 6320 * @author Marian Oancea <marian@ethdev.com> 6321 * @author Fabian Vogelsteller <fabian@ethdev.com> 6322 * @author Gav Wood <g@ethdev.com> 6323 * @date 2014 6324 */ 6325 6326 var Jsonrpc = require('./jsonrpc'); 6327 var utils = require('../utils/utils'); 6328 var c = require('../utils/config'); 6329 var errors = require('./errors'); 6330 6331 /** 6332 * It's responsible for passing messages to providers 6333 * It's also responsible for polling the ethereum node for incoming messages 6334 * Default poll timeout is 1 second 6335 * Singleton 6336 */ 6337 var RequestManager = function (provider) { 6338 this.provider = provider; 6339 this.polls = {}; 6340 this.timeout = null; 6341 }; 6342 6343 /** 6344 * Should be used to synchronously send request 6345 * 6346 * @method send 6347 * @param {Object} data 6348 * @return {Object} 6349 */ 6350 RequestManager.prototype.send = function (data) { 6351 if (!this.provider) { 6352 console.error(errors.InvalidProvider()); 6353 return null; 6354 } 6355 6356 var payload = Jsonrpc.toPayload(data.method, data.params); 6357 var result = this.provider.send(payload); 6358 6359 if (!Jsonrpc.isValidResponse(result)) { 6360 throw errors.InvalidResponse(result); 6361 } 6362 6363 return result.result; 6364 }; 6365 6366 /** 6367 * Should be used to asynchronously send request 6368 * 6369 * @method sendAsync 6370 * @param {Object} data 6371 * @param {Function} callback 6372 */ 6373 RequestManager.prototype.sendAsync = function (data, callback) { 6374 if (!this.provider) { 6375 return callback(errors.InvalidProvider()); 6376 } 6377 6378 var payload = Jsonrpc.toPayload(data.method, data.params); 6379 this.provider.sendAsync(payload, function (err, result) { 6380 if (err) { 6381 return callback(err); 6382 } 6383 6384 if (!Jsonrpc.isValidResponse(result)) { 6385 return callback(errors.InvalidResponse(result)); 6386 } 6387 6388 callback(null, result.result); 6389 }); 6390 }; 6391 6392 /** 6393 * Should be called to asynchronously send batch request 6394 * 6395 * @method sendBatch 6396 * @param {Array} batch data 6397 * @param {Function} callback 6398 */ 6399 RequestManager.prototype.sendBatch = function (data, callback) { 6400 if (!this.provider) { 6401 return callback(errors.InvalidProvider()); 6402 } 6403 6404 var payload = Jsonrpc.toBatchPayload(data); 6405 6406 this.provider.sendAsync(payload, function (err, results) { 6407 if (err) { 6408 return callback(err); 6409 } 6410 6411 if (!utils.isArray(results)) { 6412 return callback(errors.InvalidResponse(results)); 6413 } 6414 6415 callback(err, results); 6416 }); 6417 }; 6418 6419 /** 6420 * Should be used to set provider of request manager 6421 * 6422 * @method setProvider 6423 * @param {Object} 6424 */ 6425 RequestManager.prototype.setProvider = function (p) { 6426 this.provider = p; 6427 }; 6428 6429 /** 6430 * Should be used to start polling 6431 * 6432 * @method startPolling 6433 * @param {Object} data 6434 * @param {Number} pollId 6435 * @param {Function} callback 6436 * @param {Function} uninstall 6437 * 6438 * @todo cleanup number of params 6439 */ 6440 RequestManager.prototype.startPolling = function (data, pollId, callback, uninstall) { 6441 this.polls[pollId] = {data: data, id: pollId, callback: callback, uninstall: uninstall}; 6442 6443 6444 // start polling 6445 if (!this.timeout) { 6446 this.poll(); 6447 } 6448 }; 6449 6450 /** 6451 * Should be used to stop polling for filter with given id 6452 * 6453 * @method stopPolling 6454 * @param {Number} pollId 6455 */ 6456 RequestManager.prototype.stopPolling = function (pollId) { 6457 delete this.polls[pollId]; 6458 6459 // stop polling 6460 if(Object.keys(this.polls).length === 0 && this.timeout) { 6461 clearTimeout(this.timeout); 6462 this.timeout = null; 6463 } 6464 }; 6465 6466 /** 6467 * Should be called to reset the polling mechanism of the request manager 6468 * 6469 * @method reset 6470 */ 6471 RequestManager.prototype.reset = function (keepIsSyncing) { 6472 /*jshint maxcomplexity:5 */ 6473 6474 for (var key in this.polls) { 6475 // remove all polls, except sync polls, 6476 // they need to be removed manually by calling syncing.stopWatching() 6477 if(!keepIsSyncing || key.indexOf('syncPoll_') === -1) { 6478 this.polls[key].uninstall(); 6479 delete this.polls[key]; 6480 } 6481 } 6482 6483 // stop polling 6484 if(Object.keys(this.polls).length === 0 && this.timeout) { 6485 clearTimeout(this.timeout); 6486 this.timeout = null; 6487 } 6488 }; 6489 6490 /** 6491 * Should be called to poll for changes on filter with given id 6492 * 6493 * @method poll 6494 */ 6495 RequestManager.prototype.poll = function () { 6496 /*jshint maxcomplexity: 6 */ 6497 this.timeout = setTimeout(this.poll.bind(this), c.ETH_POLLING_TIMEOUT); 6498 6499 if (Object.keys(this.polls).length === 0) { 6500 return; 6501 } 6502 6503 if (!this.provider) { 6504 console.error(errors.InvalidProvider()); 6505 return; 6506 } 6507 6508 var pollsData = []; 6509 var pollsIds = []; 6510 for (var key in this.polls) { 6511 pollsData.push(this.polls[key].data); 6512 pollsIds.push(key); 6513 } 6514 6515 if (pollsData.length === 0) { 6516 return; 6517 } 6518 6519 var payload = Jsonrpc.toBatchPayload(pollsData); 6520 6521 // map the request id to they poll id 6522 var pollsIdMap = {}; 6523 payload.forEach(function(load, index){ 6524 pollsIdMap[load.id] = pollsIds[index]; 6525 }); 6526 6527 6528 var self = this; 6529 this.provider.sendAsync(payload, function (error, results) { 6530 6531 6532 // TODO: console log? 6533 if (error) { 6534 return; 6535 } 6536 6537 if (!utils.isArray(results)) { 6538 throw errors.InvalidResponse(results); 6539 } 6540 results.map(function (result) { 6541 var id = pollsIdMap[result.id]; 6542 6543 // make sure the filter is still installed after arrival of the request 6544 if (self.polls[id]) { 6545 result.callback = self.polls[id].callback; 6546 return result; 6547 } else 6548 return false; 6549 }).filter(function (result) { 6550 return !!result; 6551 }).filter(function (result) { 6552 var valid = Jsonrpc.isValidResponse(result); 6553 if (!valid) { 6554 result.callback(errors.InvalidResponse(result)); 6555 } 6556 return valid; 6557 }).forEach(function (result) { 6558 result.callback(null, result.result); 6559 }); 6560 }); 6561 }; 6562 6563 module.exports = RequestManager; 6564 6565 6566 },{"../utils/config":18,"../utils/utils":20,"./errors":26,"./jsonrpc":35}],47:[function(require,module,exports){ 6567 6568 6569 var Settings = function () { 6570 this.defaultBlock = 'latest'; 6571 this.defaultAccount = undefined; 6572 }; 6573 6574 module.exports = Settings; 6575 6576 6577 },{}],48:[function(require,module,exports){ 6578 /* 6579 This file is part of web3.js. 6580 6581 web3.js is free software: you can redistribute it and/or modify 6582 it under the terms of the GNU Lesser General Public License as published by 6583 the Free Software Foundation, either version 3 of the License, or 6584 (at your option) any later version. 6585 6586 web3.js is distributed in the hope that it will be useful, 6587 but WITHOUT ANY WARRANTY; without even the implied warranty of 6588 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 6589 GNU Lesser General Public License for more details. 6590 6591 You should have received a copy of the GNU Lesser General Public License 6592 along with web3.js. If not, see <http://www.gnu.org/licenses/>. 6593 */ 6594 /** @file syncing.js 6595 * @authors: 6596 * Fabian Vogelsteller <fabian@ethdev.com> 6597 * @date 2015 6598 */ 6599 6600 var formatters = require('./formatters'); 6601 var utils = require('../utils/utils'); 6602 6603 var count = 1; 6604 6605 /** 6606 Adds the callback and sets up the methods, to iterate over the results. 6607 6608 @method pollSyncing 6609 @param {Object} self 6610 */ 6611 var pollSyncing = function(self) { 6612 6613 var onMessage = function (error, sync) { 6614 if (error) { 6615 return self.callbacks.forEach(function (callback) { 6616 callback(error); 6617 }); 6618 } 6619 6620 if(utils.isObject(sync) && sync.startingBlock) 6621 sync = formatters.outputSyncingFormatter(sync); 6622 6623 self.callbacks.forEach(function (callback) { 6624 if (self.lastSyncState !== sync) { 6625 6626 // call the callback with true first so the app can stop anything, before receiving the sync data 6627 if(!self.lastSyncState && utils.isObject(sync)) 6628 callback(null, true); 6629 6630 // call on the next CPU cycle, so the actions of the sync stop can be processes first 6631 setTimeout(function() { 6632 callback(null, sync); 6633 }, 0); 6634 6635 self.lastSyncState = sync; 6636 } 6637 }); 6638 }; 6639 6640 self.requestManager.startPolling({ 6641 method: 'eth_syncing', 6642 params: [], 6643 }, self.pollId, onMessage, self.stopWatching.bind(self)); 6644 6645 }; 6646 6647 var IsSyncing = function (requestManager, callback) { 6648 this.requestManager = requestManager; 6649 this.pollId = 'syncPoll_'+ count++; 6650 this.callbacks = []; 6651 this.addCallback(callback); 6652 this.lastSyncState = false; 6653 pollSyncing(this); 6654 6655 return this; 6656 }; 6657 6658 IsSyncing.prototype.addCallback = function (callback) { 6659 if(callback) 6660 this.callbacks.push(callback); 6661 return this; 6662 }; 6663 6664 IsSyncing.prototype.stopWatching = function () { 6665 this.requestManager.stopPolling(this.pollId); 6666 this.callbacks = []; 6667 }; 6668 6669 module.exports = IsSyncing; 6670 6671 6672 },{"../utils/utils":20,"./formatters":30}],49:[function(require,module,exports){ 6673 /* 6674 This file is part of web3.js. 6675 6676 web3.js is free software: you can redistribute it and/or modify 6677 it under the terms of the GNU Lesser General Public License as published by 6678 the Free Software Foundation, either version 3 of the License, or 6679 (at your option) any later version. 6680 6681 web3.js is distributed in the hope that it will be useful, 6682 but WITHOUT ANY WARRANTY; without even the implied warranty of 6683 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 6684 GNU Lesser General Public License for more details. 6685 6686 You should have received a copy of the GNU Lesser General Public License 6687 along with web3.js. If not, see <http://www.gnu.org/licenses/>. 6688 */ 6689 /** 6690 * @file transfer.js 6691 * @author Marek Kotewicz <marek@ethdev.com> 6692 * @date 2015 6693 */ 6694 6695 var Iban = require('./iban'); 6696 var exchangeAbi = require('../contracts/SmartExchange.json'); 6697 6698 /** 6699 * Should be used to make Iban transfer 6700 * 6701 * @method transfer 6702 * @param {String} from 6703 * @param {String} to iban 6704 * @param {Value} value to be tranfered 6705 * @param {Function} callback, callback 6706 */ 6707 var transfer = function (eth, from, to, value, callback) { 6708 var iban = new Iban(to); 6709 if (!iban.isValid()) { 6710 throw new Error('invalid iban address'); 6711 } 6712 6713 if (iban.isDirect()) { 6714 return transferToAddress(eth, from, iban.address(), value, callback); 6715 } 6716 6717 if (!callback) { 6718 var address = eth.icapNamereg().addr(iban.institution()); 6719 return deposit(eth, from, address, value, iban.client()); 6720 } 6721 6722 eth.icapNamereg().addr(iban.institution(), function (err, address) { 6723 return deposit(eth, from, address, value, iban.client(), callback); 6724 }); 6725 6726 }; 6727 6728 /** 6729 * Should be used to transfer funds to certain address 6730 * 6731 * @method transferToAddress 6732 * @param {String} from 6733 * @param {String} to 6734 * @param {Value} value to be tranfered 6735 * @param {Function} callback, callback 6736 */ 6737 var transferToAddress = function (eth, from, to, value, callback) { 6738 return eth.sendTransaction({ 6739 address: to, 6740 from: from, 6741 value: value 6742 }, callback); 6743 }; 6744 6745 /** 6746 * Should be used to deposit funds to generic Exchange contract (must implement deposit(bytes32) method!) 6747 * 6748 * @method deposit 6749 * @param {String} from 6750 * @param {String} to 6751 * @param {Value} value to be transferred 6752 * @param {String} client unique identifier 6753 * @param {Function} callback, callback 6754 */ 6755 var deposit = function (eth, from, to, value, client, callback) { 6756 var abi = exchangeAbi; 6757 return eth.contract(abi).at(to).deposit(client, { 6758 from: from, 6759 value: value 6760 }, callback); 6761 }; 6762 6763 module.exports = transfer; 6764 6765 6766 },{"../contracts/SmartExchange.json":3,"./iban":33}],50:[function(require,module,exports){ 6767 6768 },{}],51:[function(require,module,exports){ 6769 ;(function (root, factory, undef) { 6770 if (typeof exports === "object") { 6771 // CommonJS 6772 module.exports = exports = factory(require("./core"), require("./enc-base64"), require("./md5"), require("./evpkdf"), require("./cipher-core")); 6773 } 6774 else if (typeof define === "function" && define.amd) { 6775 // AMD 6776 define(["./core", "./enc-base64", "./md5", "./evpkdf", "./cipher-core"], factory); 6777 } 6778 else { 6779 // Global (browser) 6780 factory(root.CryptoJS); 6781 } 6782 }(this, function (CryptoJS) { 6783 6784 (function () { 6785 // Shortcuts 6786 var C = CryptoJS; 6787 var C_lib = C.lib; 6788 var BlockCipher = C_lib.BlockCipher; 6789 var C_algo = C.algo; 6790 6791 // Lookup tables 6792 var SBOX = []; 6793 var INV_SBOX = []; 6794 var SUB_MIX_0 = []; 6795 var SUB_MIX_1 = []; 6796 var SUB_MIX_2 = []; 6797 var SUB_MIX_3 = []; 6798 var INV_SUB_MIX_0 = []; 6799 var INV_SUB_MIX_1 = []; 6800 var INV_SUB_MIX_2 = []; 6801 var INV_SUB_MIX_3 = []; 6802 6803 // Compute lookup tables 6804 (function () { 6805 // Compute double table 6806 var d = []; 6807 for (var i = 0; i < 256; i++) { 6808 if (i < 128) { 6809 d[i] = i << 1; 6810 } else { 6811 d[i] = (i << 1) ^ 0x11b; 6812 } 6813 } 6814 6815 // Walk GF(2^8) 6816 var x = 0; 6817 var xi = 0; 6818 for (var i = 0; i < 256; i++) { 6819 // Compute sbox 6820 var sx = xi ^ (xi << 1) ^ (xi << 2) ^ (xi << 3) ^ (xi << 4); 6821 sx = (sx >>> 8) ^ (sx & 0xff) ^ 0x63; 6822 SBOX[x] = sx; 6823 INV_SBOX[sx] = x; 6824 6825 // Compute multiplication 6826 var x2 = d[x]; 6827 var x4 = d[x2]; 6828 var x8 = d[x4]; 6829 6830 // Compute sub bytes, mix columns tables 6831 var t = (d[sx] * 0x101) ^ (sx * 0x1010100); 6832 SUB_MIX_0[x] = (t << 24) | (t >>> 8); 6833 SUB_MIX_1[x] = (t << 16) | (t >>> 16); 6834 SUB_MIX_2[x] = (t << 8) | (t >>> 24); 6835 SUB_MIX_3[x] = t; 6836 6837 // Compute inv sub bytes, inv mix columns tables 6838 var t = (x8 * 0x1010101) ^ (x4 * 0x10001) ^ (x2 * 0x101) ^ (x * 0x1010100); 6839 INV_SUB_MIX_0[sx] = (t << 24) | (t >>> 8); 6840 INV_SUB_MIX_1[sx] = (t << 16) | (t >>> 16); 6841 INV_SUB_MIX_2[sx] = (t << 8) | (t >>> 24); 6842 INV_SUB_MIX_3[sx] = t; 6843 6844 // Compute next counter 6845 if (!x) { 6846 x = xi = 1; 6847 } else { 6848 x = x2 ^ d[d[d[x8 ^ x2]]]; 6849 xi ^= d[d[xi]]; 6850 } 6851 } 6852 }()); 6853 6854 // Precomputed Rcon lookup 6855 var RCON = [0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36]; 6856 6857 /** 6858 * AES block cipher algorithm. 6859 */ 6860 var AES = C_algo.AES = BlockCipher.extend({ 6861 _doReset: function () { 6862 // Skip reset of nRounds has been set before and key did not change 6863 if (this._nRounds && this._keyPriorReset === this._key) { 6864 return; 6865 } 6866 6867 // Shortcuts 6868 var key = this._keyPriorReset = this._key; 6869 var keyWords = key.words; 6870 var keySize = key.sigBytes / 4; 6871 6872 // Compute number of rounds 6873 var nRounds = this._nRounds = keySize + 6; 6874 6875 // Compute number of key schedule rows 6876 var ksRows = (nRounds + 1) * 4; 6877 6878 // Compute key schedule 6879 var keySchedule = this._keySchedule = []; 6880 for (var ksRow = 0; ksRow < ksRows; ksRow++) { 6881 if (ksRow < keySize) { 6882 keySchedule[ksRow] = keyWords[ksRow]; 6883 } else { 6884 var t = keySchedule[ksRow - 1]; 6885 6886 if (!(ksRow % keySize)) { 6887 // Rot word 6888 t = (t << 8) | (t >>> 24); 6889 6890 // Sub word 6891 t = (SBOX[t >>> 24] << 24) | (SBOX[(t >>> 16) & 0xff] << 16) | (SBOX[(t >>> 8) & 0xff] << 8) | SBOX[t & 0xff]; 6892 6893 // Mix Rcon 6894 t ^= RCON[(ksRow / keySize) | 0] << 24; 6895 } else if (keySize > 6 && ksRow % keySize == 4) { 6896 // Sub word 6897 t = (SBOX[t >>> 24] << 24) | (SBOX[(t >>> 16) & 0xff] << 16) | (SBOX[(t >>> 8) & 0xff] << 8) | SBOX[t & 0xff]; 6898 } 6899 6900 keySchedule[ksRow] = keySchedule[ksRow - keySize] ^ t; 6901 } 6902 } 6903 6904 // Compute inv key schedule 6905 var invKeySchedule = this._invKeySchedule = []; 6906 for (var invKsRow = 0; invKsRow < ksRows; invKsRow++) { 6907 var ksRow = ksRows - invKsRow; 6908 6909 if (invKsRow % 4) { 6910 var t = keySchedule[ksRow]; 6911 } else { 6912 var t = keySchedule[ksRow - 4]; 6913 } 6914 6915 if (invKsRow < 4 || ksRow <= 4) { 6916 invKeySchedule[invKsRow] = t; 6917 } else { 6918 invKeySchedule[invKsRow] = INV_SUB_MIX_0[SBOX[t >>> 24]] ^ INV_SUB_MIX_1[SBOX[(t >>> 16) & 0xff]] ^ 6919 INV_SUB_MIX_2[SBOX[(t >>> 8) & 0xff]] ^ INV_SUB_MIX_3[SBOX[t & 0xff]]; 6920 } 6921 } 6922 }, 6923 6924 encryptBlock: function (M, offset) { 6925 this._doCryptBlock(M, offset, this._keySchedule, SUB_MIX_0, SUB_MIX_1, SUB_MIX_2, SUB_MIX_3, SBOX); 6926 }, 6927 6928 decryptBlock: function (M, offset) { 6929 // Swap 2nd and 4th rows 6930 var t = M[offset + 1]; 6931 M[offset + 1] = M[offset + 3]; 6932 M[offset + 3] = t; 6933 6934 this._doCryptBlock(M, offset, this._invKeySchedule, INV_SUB_MIX_0, INV_SUB_MIX_1, INV_SUB_MIX_2, INV_SUB_MIX_3, INV_SBOX); 6935 6936 // Inv swap 2nd and 4th rows 6937 var t = M[offset + 1]; 6938 M[offset + 1] = M[offset + 3]; 6939 M[offset + 3] = t; 6940 }, 6941 6942 _doCryptBlock: function (M, offset, keySchedule, SUB_MIX_0, SUB_MIX_1, SUB_MIX_2, SUB_MIX_3, SBOX) { 6943 // Shortcut 6944 var nRounds = this._nRounds; 6945 6946 // Get input, add round key 6947 var s0 = M[offset] ^ keySchedule[0]; 6948 var s1 = M[offset + 1] ^ keySchedule[1]; 6949 var s2 = M[offset + 2] ^ keySchedule[2]; 6950 var s3 = M[offset + 3] ^ keySchedule[3]; 6951 6952 // Key schedule row counter 6953 var ksRow = 4; 6954 6955 // Rounds 6956 for (var round = 1; round < nRounds; round++) { 6957 // Shift rows, sub bytes, mix columns, add round key 6958 var t0 = SUB_MIX_0[s0 >>> 24] ^ SUB_MIX_1[(s1 >>> 16) & 0xff] ^ SUB_MIX_2[(s2 >>> 8) & 0xff] ^ SUB_MIX_3[s3 & 0xff] ^ keySchedule[ksRow++]; 6959 var t1 = SUB_MIX_0[s1 >>> 24] ^ SUB_MIX_1[(s2 >>> 16) & 0xff] ^ SUB_MIX_2[(s3 >>> 8) & 0xff] ^ SUB_MIX_3[s0 & 0xff] ^ keySchedule[ksRow++]; 6960 var t2 = SUB_MIX_0[s2 >>> 24] ^ SUB_MIX_1[(s3 >>> 16) & 0xff] ^ SUB_MIX_2[(s0 >>> 8) & 0xff] ^ SUB_MIX_3[s1 & 0xff] ^ keySchedule[ksRow++]; 6961 var t3 = SUB_MIX_0[s3 >>> 24] ^ SUB_MIX_1[(s0 >>> 16) & 0xff] ^ SUB_MIX_2[(s1 >>> 8) & 0xff] ^ SUB_MIX_3[s2 & 0xff] ^ keySchedule[ksRow++]; 6962 6963 // Update state 6964 s0 = t0; 6965 s1 = t1; 6966 s2 = t2; 6967 s3 = t3; 6968 } 6969 6970 // Shift rows, sub bytes, add round key 6971 var t0 = ((SBOX[s0 >>> 24] << 24) | (SBOX[(s1 >>> 16) & 0xff] << 16) | (SBOX[(s2 >>> 8) & 0xff] << 8) | SBOX[s3 & 0xff]) ^ keySchedule[ksRow++]; 6972 var t1 = ((SBOX[s1 >>> 24] << 24) | (SBOX[(s2 >>> 16) & 0xff] << 16) | (SBOX[(s3 >>> 8) & 0xff] << 8) | SBOX[s0 & 0xff]) ^ keySchedule[ksRow++]; 6973 var t2 = ((SBOX[s2 >>> 24] << 24) | (SBOX[(s3 >>> 16) & 0xff] << 16) | (SBOX[(s0 >>> 8) & 0xff] << 8) | SBOX[s1 & 0xff]) ^ keySchedule[ksRow++]; 6974 var t3 = ((SBOX[s3 >>> 24] << 24) | (SBOX[(s0 >>> 16) & 0xff] << 16) | (SBOX[(s1 >>> 8) & 0xff] << 8) | SBOX[s2 & 0xff]) ^ keySchedule[ksRow++]; 6975 6976 // Set output 6977 M[offset] = t0; 6978 M[offset + 1] = t1; 6979 M[offset + 2] = t2; 6980 M[offset + 3] = t3; 6981 }, 6982 6983 keySize: 256/32 6984 }); 6985 6986 /** 6987 * Shortcut functions to the cipher's object interface. 6988 * 6989 * @example 6990 * 6991 * var ciphertext = CryptoJS.AES.encrypt(message, key, cfg); 6992 * var plaintext = CryptoJS.AES.decrypt(ciphertext, key, cfg); 6993 */ 6994 C.AES = BlockCipher._createHelper(AES); 6995 }()); 6996 6997 6998 return CryptoJS.AES; 6999 7000 })); 7001 },{"./cipher-core":52,"./core":53,"./enc-base64":54,"./evpkdf":56,"./md5":61}],52:[function(require,module,exports){ 7002 ;(function (root, factory) { 7003 if (typeof exports === "object") { 7004 // CommonJS 7005 module.exports = exports = factory(require("./core")); 7006 } 7007 else if (typeof define === "function" && define.amd) { 7008 // AMD 7009 define(["./core"], factory); 7010 } 7011 else { 7012 // Global (browser) 7013 factory(root.CryptoJS); 7014 } 7015 }(this, function (CryptoJS) { 7016 7017 /** 7018 * Cipher core components. 7019 */ 7020 CryptoJS.lib.Cipher || (function (undefined) { 7021 // Shortcuts 7022 var C = CryptoJS; 7023 var C_lib = C.lib; 7024 var Base = C_lib.Base; 7025 var WordArray = C_lib.WordArray; 7026 var BufferedBlockAlgorithm = C_lib.BufferedBlockAlgorithm; 7027 var C_enc = C.enc; 7028 var Utf8 = C_enc.Utf8; 7029 var Base64 = C_enc.Base64; 7030 var C_algo = C.algo; 7031 var EvpKDF = C_algo.EvpKDF; 7032 7033 /** 7034 * Abstract base cipher template. 7035 * 7036 * @property {number} keySize This cipher's key size. Default: 4 (128 bits) 7037 * @property {number} ivSize This cipher's IV size. Default: 4 (128 bits) 7038 * @property {number} _ENC_XFORM_MODE A constant representing encryption mode. 7039 * @property {number} _DEC_XFORM_MODE A constant representing decryption mode. 7040 */ 7041 var Cipher = C_lib.Cipher = BufferedBlockAlgorithm.extend({ 7042 /** 7043 * Configuration options. 7044 * 7045 * @property {WordArray} iv The IV to use for this operation. 7046 */ 7047 cfg: Base.extend(), 7048 7049 /** 7050 * Creates this cipher in encryption mode. 7051 * 7052 * @param {WordArray} key The key. 7053 * @param {Object} cfg (Optional) The configuration options to use for this operation. 7054 * 7055 * @return {Cipher} A cipher instance. 7056 * 7057 * @static 7058 * 7059 * @example 7060 * 7061 * var cipher = CryptoJS.algo.AES.createEncryptor(keyWordArray, { iv: ivWordArray }); 7062 */ 7063 createEncryptor: function (key, cfg) { 7064 return this.create(this._ENC_XFORM_MODE, key, cfg); 7065 }, 7066 7067 /** 7068 * Creates this cipher in decryption mode. 7069 * 7070 * @param {WordArray} key The key. 7071 * @param {Object} cfg (Optional) The configuration options to use for this operation. 7072 * 7073 * @return {Cipher} A cipher instance. 7074 * 7075 * @static 7076 * 7077 * @example 7078 * 7079 * var cipher = CryptoJS.algo.AES.createDecryptor(keyWordArray, { iv: ivWordArray }); 7080 */ 7081 createDecryptor: function (key, cfg) { 7082 return this.create(this._DEC_XFORM_MODE, key, cfg); 7083 }, 7084 7085 /** 7086 * Initializes a newly created cipher. 7087 * 7088 * @param {number} xformMode Either the encryption or decryption transormation mode constant. 7089 * @param {WordArray} key The key. 7090 * @param {Object} cfg (Optional) The configuration options to use for this operation. 7091 * 7092 * @example 7093 * 7094 * var cipher = CryptoJS.algo.AES.create(CryptoJS.algo.AES._ENC_XFORM_MODE, keyWordArray, { iv: ivWordArray }); 7095 */ 7096 init: function (xformMode, key, cfg) { 7097 // Apply config defaults 7098 this.cfg = this.cfg.extend(cfg); 7099 7100 // Store transform mode and key 7101 this._xformMode = xformMode; 7102 this._key = key; 7103 7104 // Set initial values 7105 this.reset(); 7106 }, 7107 7108 /** 7109 * Resets this cipher to its initial state. 7110 * 7111 * @example 7112 * 7113 * cipher.reset(); 7114 */ 7115 reset: function () { 7116 // Reset data buffer 7117 BufferedBlockAlgorithm.reset.call(this); 7118 7119 // Perform concrete-cipher logic 7120 this._doReset(); 7121 }, 7122 7123 /** 7124 * Adds data to be encrypted or decrypted. 7125 * 7126 * @param {WordArray|string} dataUpdate The data to encrypt or decrypt. 7127 * 7128 * @return {WordArray} The data after processing. 7129 * 7130 * @example 7131 * 7132 * var encrypted = cipher.process('data'); 7133 * var encrypted = cipher.process(wordArray); 7134 */ 7135 process: function (dataUpdate) { 7136 // Append 7137 this._append(dataUpdate); 7138 7139 // Process available blocks 7140 return this._process(); 7141 }, 7142 7143 /** 7144 * Finalizes the encryption or decryption process. 7145 * Note that the finalize operation is effectively a destructive, read-once operation. 7146 * 7147 * @param {WordArray|string} dataUpdate The final data to encrypt or decrypt. 7148 * 7149 * @return {WordArray} The data after final processing. 7150 * 7151 * @example 7152 * 7153 * var encrypted = cipher.finalize(); 7154 * var encrypted = cipher.finalize('data'); 7155 * var encrypted = cipher.finalize(wordArray); 7156 */ 7157 finalize: function (dataUpdate) { 7158 // Final data update 7159 if (dataUpdate) { 7160 this._append(dataUpdate); 7161 } 7162 7163 // Perform concrete-cipher logic 7164 var finalProcessedData = this._doFinalize(); 7165 7166 return finalProcessedData; 7167 }, 7168 7169 keySize: 128/32, 7170 7171 ivSize: 128/32, 7172 7173 _ENC_XFORM_MODE: 1, 7174 7175 _DEC_XFORM_MODE: 2, 7176 7177 /** 7178 * Creates shortcut functions to a cipher's object interface. 7179 * 7180 * @param {Cipher} cipher The cipher to create a helper for. 7181 * 7182 * @return {Object} An object with encrypt and decrypt shortcut functions. 7183 * 7184 * @static 7185 * 7186 * @example 7187 * 7188 * var AES = CryptoJS.lib.Cipher._createHelper(CryptoJS.algo.AES); 7189 */ 7190 _createHelper: (function () { 7191 function selectCipherStrategy(key) { 7192 if (typeof key == 'string') { 7193 return PasswordBasedCipher; 7194 } else { 7195 return SerializableCipher; 7196 } 7197 } 7198 7199 return function (cipher) { 7200 return { 7201 encrypt: function (message, key, cfg) { 7202 return selectCipherStrategy(key).encrypt(cipher, message, key, cfg); 7203 }, 7204 7205 decrypt: function (ciphertext, key, cfg) { 7206 return selectCipherStrategy(key).decrypt(cipher, ciphertext, key, cfg); 7207 } 7208 }; 7209 }; 7210 }()) 7211 }); 7212 7213 /** 7214 * Abstract base stream cipher template. 7215 * 7216 * @property {number} blockSize The number of 32-bit words this cipher operates on. Default: 1 (32 bits) 7217 */ 7218 var StreamCipher = C_lib.StreamCipher = Cipher.extend({ 7219 _doFinalize: function () { 7220 // Process partial blocks 7221 var finalProcessedBlocks = this._process(!!'flush'); 7222 7223 return finalProcessedBlocks; 7224 }, 7225 7226 blockSize: 1 7227 }); 7228 7229 /** 7230 * Mode namespace. 7231 */ 7232 var C_mode = C.mode = {}; 7233 7234 /** 7235 * Abstract base block cipher mode template. 7236 */ 7237 var BlockCipherMode = C_lib.BlockCipherMode = Base.extend({ 7238 /** 7239 * Creates this mode for encryption. 7240 * 7241 * @param {Cipher} cipher A block cipher instance. 7242 * @param {Array} iv The IV words. 7243 * 7244 * @static 7245 * 7246 * @example 7247 * 7248 * var mode = CryptoJS.mode.CBC.createEncryptor(cipher, iv.words); 7249 */ 7250 createEncryptor: function (cipher, iv) { 7251 return this.Encryptor.create(cipher, iv); 7252 }, 7253 7254 /** 7255 * Creates this mode for decryption. 7256 * 7257 * @param {Cipher} cipher A block cipher instance. 7258 * @param {Array} iv The IV words. 7259 * 7260 * @static 7261 * 7262 * @example 7263 * 7264 * var mode = CryptoJS.mode.CBC.createDecryptor(cipher, iv.words); 7265 */ 7266 createDecryptor: function (cipher, iv) { 7267 return this.Decryptor.create(cipher, iv); 7268 }, 7269 7270 /** 7271 * Initializes a newly created mode. 7272 * 7273 * @param {Cipher} cipher A block cipher instance. 7274 * @param {Array} iv The IV words. 7275 * 7276 * @example 7277 * 7278 * var mode = CryptoJS.mode.CBC.Encryptor.create(cipher, iv.words); 7279 */ 7280 init: function (cipher, iv) { 7281 this._cipher = cipher; 7282 this._iv = iv; 7283 } 7284 }); 7285 7286 /** 7287 * Cipher Block Chaining mode. 7288 */ 7289 var CBC = C_mode.CBC = (function () { 7290 /** 7291 * Abstract base CBC mode. 7292 */ 7293 var CBC = BlockCipherMode.extend(); 7294 7295 /** 7296 * CBC encryptor. 7297 */ 7298 CBC.Encryptor = CBC.extend({ 7299 /** 7300 * Processes the data block at offset. 7301 * 7302 * @param {Array} words The data words to operate on. 7303 * @param {number} offset The offset where the block starts. 7304 * 7305 * @example 7306 * 7307 * mode.processBlock(data.words, offset); 7308 */ 7309 processBlock: function (words, offset) { 7310 // Shortcuts 7311 var cipher = this._cipher; 7312 var blockSize = cipher.blockSize; 7313 7314 // XOR and encrypt 7315 xorBlock.call(this, words, offset, blockSize); 7316 cipher.encryptBlock(words, offset); 7317 7318 // Remember this block to use with next block 7319 this._prevBlock = words.slice(offset, offset + blockSize); 7320 } 7321 }); 7322 7323 /** 7324 * CBC decryptor. 7325 */ 7326 CBC.Decryptor = CBC.extend({ 7327 /** 7328 * Processes the data block at offset. 7329 * 7330 * @param {Array} words The data words to operate on. 7331 * @param {number} offset The offset where the block starts. 7332 * 7333 * @example 7334 * 7335 * mode.processBlock(data.words, offset); 7336 */ 7337 processBlock: function (words, offset) { 7338 // Shortcuts 7339 var cipher = this._cipher; 7340 var blockSize = cipher.blockSize; 7341 7342 // Remember this block to use with next block 7343 var thisBlock = words.slice(offset, offset + blockSize); 7344 7345 // Decrypt and XOR 7346 cipher.decryptBlock(words, offset); 7347 xorBlock.call(this, words, offset, blockSize); 7348 7349 // This block becomes the previous block 7350 this._prevBlock = thisBlock; 7351 } 7352 }); 7353 7354 function xorBlock(words, offset, blockSize) { 7355 // Shortcut 7356 var iv = this._iv; 7357 7358 // Choose mixing block 7359 if (iv) { 7360 var block = iv; 7361 7362 // Remove IV for subsequent blocks 7363 this._iv = undefined; 7364 } else { 7365 var block = this._prevBlock; 7366 } 7367 7368 // XOR blocks 7369 for (var i = 0; i < blockSize; i++) { 7370 words[offset + i] ^= block[i]; 7371 } 7372 } 7373 7374 return CBC; 7375 }()); 7376 7377 /** 7378 * Padding namespace. 7379 */ 7380 var C_pad = C.pad = {}; 7381 7382 /** 7383 * PKCS #5/7 padding strategy. 7384 */ 7385 var Pkcs7 = C_pad.Pkcs7 = { 7386 /** 7387 * Pads data using the algorithm defined in PKCS #5/7. 7388 * 7389 * @param {WordArray} data The data to pad. 7390 * @param {number} blockSize The multiple that the data should be padded to. 7391 * 7392 * @static 7393 * 7394 * @example 7395 * 7396 * CryptoJS.pad.Pkcs7.pad(wordArray, 4); 7397 */ 7398 pad: function (data, blockSize) { 7399 // Shortcut 7400 var blockSizeBytes = blockSize * 4; 7401 7402 // Count padding bytes 7403 var nPaddingBytes = blockSizeBytes - data.sigBytes % blockSizeBytes; 7404 7405 // Create padding word 7406 var paddingWord = (nPaddingBytes << 24) | (nPaddingBytes << 16) | (nPaddingBytes << 8) | nPaddingBytes; 7407 7408 // Create padding 7409 var paddingWords = []; 7410 for (var i = 0; i < nPaddingBytes; i += 4) { 7411 paddingWords.push(paddingWord); 7412 } 7413 var padding = WordArray.create(paddingWords, nPaddingBytes); 7414 7415 // Add padding 7416 data.concat(padding); 7417 }, 7418 7419 /** 7420 * Unpads data that had been padded using the algorithm defined in PKCS #5/7. 7421 * 7422 * @param {WordArray} data The data to unpad. 7423 * 7424 * @static 7425 * 7426 * @example 7427 * 7428 * CryptoJS.pad.Pkcs7.unpad(wordArray); 7429 */ 7430 unpad: function (data) { 7431 // Get number of padding bytes from last byte 7432 var nPaddingBytes = data.words[(data.sigBytes - 1) >>> 2] & 0xff; 7433 7434 // Remove padding 7435 data.sigBytes -= nPaddingBytes; 7436 } 7437 }; 7438 7439 /** 7440 * Abstract base block cipher template. 7441 * 7442 * @property {number} blockSize The number of 32-bit words this cipher operates on. Default: 4 (128 bits) 7443 */ 7444 var BlockCipher = C_lib.BlockCipher = Cipher.extend({ 7445 /** 7446 * Configuration options. 7447 * 7448 * @property {Mode} mode The block mode to use. Default: CBC 7449 * @property {Padding} padding The padding strategy to use. Default: Pkcs7 7450 */ 7451 cfg: Cipher.cfg.extend({ 7452 mode: CBC, 7453 padding: Pkcs7 7454 }), 7455 7456 reset: function () { 7457 // Reset cipher 7458 Cipher.reset.call(this); 7459 7460 // Shortcuts 7461 var cfg = this.cfg; 7462 var iv = cfg.iv; 7463 var mode = cfg.mode; 7464 7465 // Reset block mode 7466 if (this._xformMode == this._ENC_XFORM_MODE) { 7467 var modeCreator = mode.createEncryptor; 7468 } else /* if (this._xformMode == this._DEC_XFORM_MODE) */ { 7469 var modeCreator = mode.createDecryptor; 7470 7471 // Keep at least one block in the buffer for unpadding 7472 this._minBufferSize = 1; 7473 } 7474 this._mode = modeCreator.call(mode, this, iv && iv.words); 7475 }, 7476 7477 _doProcessBlock: function (words, offset) { 7478 this._mode.processBlock(words, offset); 7479 }, 7480 7481 _doFinalize: function () { 7482 // Shortcut 7483 var padding = this.cfg.padding; 7484 7485 // Finalize 7486 if (this._xformMode == this._ENC_XFORM_MODE) { 7487 // Pad data 7488 padding.pad(this._data, this.blockSize); 7489 7490 // Process final blocks 7491 var finalProcessedBlocks = this._process(!!'flush'); 7492 } else /* if (this._xformMode == this._DEC_XFORM_MODE) */ { 7493 // Process final blocks 7494 var finalProcessedBlocks = this._process(!!'flush'); 7495 7496 // Unpad data 7497 padding.unpad(finalProcessedBlocks); 7498 } 7499 7500 return finalProcessedBlocks; 7501 }, 7502 7503 blockSize: 128/32 7504 }); 7505 7506 /** 7507 * A collection of cipher parameters. 7508 * 7509 * @property {WordArray} ciphertext The raw ciphertext. 7510 * @property {WordArray} key The key to this ciphertext. 7511 * @property {WordArray} iv The IV used in the ciphering operation. 7512 * @property {WordArray} salt The salt used with a key derivation function. 7513 * @property {Cipher} algorithm The cipher algorithm. 7514 * @property {Mode} mode The block mode used in the ciphering operation. 7515 * @property {Padding} padding The padding scheme used in the ciphering operation. 7516 * @property {number} blockSize The block size of the cipher. 7517 * @property {Format} formatter The default formatting strategy to convert this cipher params object to a string. 7518 */ 7519 var CipherParams = C_lib.CipherParams = Base.extend({ 7520 /** 7521 * Initializes a newly created cipher params object. 7522 * 7523 * @param {Object} cipherParams An object with any of the possible cipher parameters. 7524 * 7525 * @example 7526 * 7527 * var cipherParams = CryptoJS.lib.CipherParams.create({ 7528 * ciphertext: ciphertextWordArray, 7529 * key: keyWordArray, 7530 * iv: ivWordArray, 7531 * salt: saltWordArray, 7532 * algorithm: CryptoJS.algo.AES, 7533 * mode: CryptoJS.mode.CBC, 7534 * padding: CryptoJS.pad.PKCS7, 7535 * blockSize: 4, 7536 * formatter: CryptoJS.format.OpenSSL 7537 * }); 7538 */ 7539 init: function (cipherParams) { 7540 this.mixIn(cipherParams); 7541 }, 7542 7543 /** 7544 * Converts this cipher params object to a string. 7545 * 7546 * @param {Format} formatter (Optional) The formatting strategy to use. 7547 * 7548 * @return {string} The stringified cipher params. 7549 * 7550 * @throws Error If neither the formatter nor the default formatter is set. 7551 * 7552 * @example 7553 * 7554 * var string = cipherParams + ''; 7555 * var string = cipherParams.toString(); 7556 * var string = cipherParams.toString(CryptoJS.format.OpenSSL); 7557 */ 7558 toString: function (formatter) { 7559 return (formatter || this.formatter).stringify(this); 7560 } 7561 }); 7562 7563 /** 7564 * Format namespace. 7565 */ 7566 var C_format = C.format = {}; 7567 7568 /** 7569 * OpenSSL formatting strategy. 7570 */ 7571 var OpenSSLFormatter = C_format.OpenSSL = { 7572 /** 7573 * Converts a cipher params object to an OpenSSL-compatible string. 7574 * 7575 * @param {CipherParams} cipherParams The cipher params object. 7576 * 7577 * @return {string} The OpenSSL-compatible string. 7578 * 7579 * @static 7580 * 7581 * @example 7582 * 7583 * var openSSLString = CryptoJS.format.OpenSSL.stringify(cipherParams); 7584 */ 7585 stringify: function (cipherParams) { 7586 // Shortcuts 7587 var ciphertext = cipherParams.ciphertext; 7588 var salt = cipherParams.salt; 7589 7590 // Format 7591 if (salt) { 7592 var wordArray = WordArray.create([0x53616c74, 0x65645f5f]).concat(salt).concat(ciphertext); 7593 } else { 7594 var wordArray = ciphertext; 7595 } 7596 7597 return wordArray.toString(Base64); 7598 }, 7599 7600 /** 7601 * Converts an OpenSSL-compatible string to a cipher params object. 7602 * 7603 * @param {string} openSSLStr The OpenSSL-compatible string. 7604 * 7605 * @return {CipherParams} The cipher params object. 7606 * 7607 * @static 7608 * 7609 * @example 7610 * 7611 * var cipherParams = CryptoJS.format.OpenSSL.parse(openSSLString); 7612 */ 7613 parse: function (openSSLStr) { 7614 // Parse base64 7615 var ciphertext = Base64.parse(openSSLStr); 7616 7617 // Shortcut 7618 var ciphertextWords = ciphertext.words; 7619 7620 // Test for salt 7621 if (ciphertextWords[0] == 0x53616c74 && ciphertextWords[1] == 0x65645f5f) { 7622 // Extract salt 7623 var salt = WordArray.create(ciphertextWords.slice(2, 4)); 7624 7625 // Remove salt from ciphertext 7626 ciphertextWords.splice(0, 4); 7627 ciphertext.sigBytes -= 16; 7628 } 7629 7630 return CipherParams.create({ ciphertext: ciphertext, salt: salt }); 7631 } 7632 }; 7633 7634 /** 7635 * A cipher wrapper that returns ciphertext as a serializable cipher params object. 7636 */ 7637 var SerializableCipher = C_lib.SerializableCipher = Base.extend({ 7638 /** 7639 * Configuration options. 7640 * 7641 * @property {Formatter} format The formatting strategy to convert cipher param objects to and from a string. Default: OpenSSL 7642 */ 7643 cfg: Base.extend({ 7644 format: OpenSSLFormatter 7645 }), 7646 7647 /** 7648 * Encrypts a message. 7649 * 7650 * @param {Cipher} cipher The cipher algorithm to use. 7651 * @param {WordArray|string} message The message to encrypt. 7652 * @param {WordArray} key The key. 7653 * @param {Object} cfg (Optional) The configuration options to use for this operation. 7654 * 7655 * @return {CipherParams} A cipher params object. 7656 * 7657 * @static 7658 * 7659 * @example 7660 * 7661 * var ciphertextParams = CryptoJS.lib.SerializableCipher.encrypt(CryptoJS.algo.AES, message, key); 7662 * var ciphertextParams = CryptoJS.lib.SerializableCipher.encrypt(CryptoJS.algo.AES, message, key, { iv: iv }); 7663 * var ciphertextParams = CryptoJS.lib.SerializableCipher.encrypt(CryptoJS.algo.AES, message, key, { iv: iv, format: CryptoJS.format.OpenSSL }); 7664 */ 7665 encrypt: function (cipher, message, key, cfg) { 7666 // Apply config defaults 7667 cfg = this.cfg.extend(cfg); 7668 7669 // Encrypt 7670 var encryptor = cipher.createEncryptor(key, cfg); 7671 var ciphertext = encryptor.finalize(message); 7672 7673 // Shortcut 7674 var cipherCfg = encryptor.cfg; 7675 7676 // Create and return serializable cipher params 7677 return CipherParams.create({ 7678 ciphertext: ciphertext, 7679 key: key, 7680 iv: cipherCfg.iv, 7681 algorithm: cipher, 7682 mode: cipherCfg.mode, 7683 padding: cipherCfg.padding, 7684 blockSize: cipher.blockSize, 7685 formatter: cfg.format 7686 }); 7687 }, 7688 7689 /** 7690 * Decrypts serialized ciphertext. 7691 * 7692 * @param {Cipher} cipher The cipher algorithm to use. 7693 * @param {CipherParams|string} ciphertext The ciphertext to decrypt. 7694 * @param {WordArray} key The key. 7695 * @param {Object} cfg (Optional) The configuration options to use for this operation. 7696 * 7697 * @return {WordArray} The plaintext. 7698 * 7699 * @static 7700 * 7701 * @example 7702 * 7703 * var plaintext = CryptoJS.lib.SerializableCipher.decrypt(CryptoJS.algo.AES, formattedCiphertext, key, { iv: iv, format: CryptoJS.format.OpenSSL }); 7704 * var plaintext = CryptoJS.lib.SerializableCipher.decrypt(CryptoJS.algo.AES, ciphertextParams, key, { iv: iv, format: CryptoJS.format.OpenSSL }); 7705 */ 7706 decrypt: function (cipher, ciphertext, key, cfg) { 7707 // Apply config defaults 7708 cfg = this.cfg.extend(cfg); 7709 7710 // Convert string to CipherParams 7711 ciphertext = this._parse(ciphertext, cfg.format); 7712 7713 // Decrypt 7714 var plaintext = cipher.createDecryptor(key, cfg).finalize(ciphertext.ciphertext); 7715 7716 return plaintext; 7717 }, 7718 7719 /** 7720 * Converts serialized ciphertext to CipherParams, 7721 * else assumed CipherParams already and returns ciphertext unchanged. 7722 * 7723 * @param {CipherParams|string} ciphertext The ciphertext. 7724 * @param {Formatter} format The formatting strategy to use to parse serialized ciphertext. 7725 * 7726 * @return {CipherParams} The unserialized ciphertext. 7727 * 7728 * @static 7729 * 7730 * @example 7731 * 7732 * var ciphertextParams = CryptoJS.lib.SerializableCipher._parse(ciphertextStringOrParams, format); 7733 */ 7734 _parse: function (ciphertext, format) { 7735 if (typeof ciphertext == 'string') { 7736 return format.parse(ciphertext, this); 7737 } else { 7738 return ciphertext; 7739 } 7740 } 7741 }); 7742 7743 /** 7744 * Key derivation function namespace. 7745 */ 7746 var C_kdf = C.kdf = {}; 7747 7748 /** 7749 * OpenSSL key derivation function. 7750 */ 7751 var OpenSSLKdf = C_kdf.OpenSSL = { 7752 /** 7753 * Derives a key and IV from a password. 7754 * 7755 * @param {string} password The password to derive from. 7756 * @param {number} keySize The size in words of the key to generate. 7757 * @param {number} ivSize The size in words of the IV to generate. 7758 * @param {WordArray|string} salt (Optional) A 64-bit salt to use. If omitted, a salt will be generated randomly. 7759 * 7760 * @return {CipherParams} A cipher params object with the key, IV, and salt. 7761 * 7762 * @static 7763 * 7764 * @example 7765 * 7766 * var derivedParams = CryptoJS.kdf.OpenSSL.execute('Password', 256/32, 128/32); 7767 * var derivedParams = CryptoJS.kdf.OpenSSL.execute('Password', 256/32, 128/32, 'saltsalt'); 7768 */ 7769 execute: function (password, keySize, ivSize, salt) { 7770 // Generate random salt 7771 if (!salt) { 7772 salt = WordArray.random(64/8); 7773 } 7774 7775 // Derive key and IV 7776 var key = EvpKDF.create({ keySize: keySize + ivSize }).compute(password, salt); 7777 7778 // Separate key and IV 7779 var iv = WordArray.create(key.words.slice(keySize), ivSize * 4); 7780 key.sigBytes = keySize * 4; 7781 7782 // Return params 7783 return CipherParams.create({ key: key, iv: iv, salt: salt }); 7784 } 7785 }; 7786 7787 /** 7788 * A serializable cipher wrapper that derives the key from a password, 7789 * and returns ciphertext as a serializable cipher params object. 7790 */ 7791 var PasswordBasedCipher = C_lib.PasswordBasedCipher = SerializableCipher.extend({ 7792 /** 7793 * Configuration options. 7794 * 7795 * @property {KDF} kdf The key derivation function to use to generate a key and IV from a password. Default: OpenSSL 7796 */ 7797 cfg: SerializableCipher.cfg.extend({ 7798 kdf: OpenSSLKdf 7799 }), 7800 7801 /** 7802 * Encrypts a message using a password. 7803 * 7804 * @param {Cipher} cipher The cipher algorithm to use. 7805 * @param {WordArray|string} message The message to encrypt. 7806 * @param {string} password The password. 7807 * @param {Object} cfg (Optional) The configuration options to use for this operation. 7808 * 7809 * @return {CipherParams} A cipher params object. 7810 * 7811 * @static 7812 * 7813 * @example 7814 * 7815 * var ciphertextParams = CryptoJS.lib.PasswordBasedCipher.encrypt(CryptoJS.algo.AES, message, 'password'); 7816 * var ciphertextParams = CryptoJS.lib.PasswordBasedCipher.encrypt(CryptoJS.algo.AES, message, 'password', { format: CryptoJS.format.OpenSSL }); 7817 */ 7818 encrypt: function (cipher, message, password, cfg) { 7819 // Apply config defaults 7820 cfg = this.cfg.extend(cfg); 7821 7822 // Derive key and other params 7823 var derivedParams = cfg.kdf.execute(password, cipher.keySize, cipher.ivSize); 7824 7825 // Add IV to config 7826 cfg.iv = derivedParams.iv; 7827 7828 // Encrypt 7829 var ciphertext = SerializableCipher.encrypt.call(this, cipher, message, derivedParams.key, cfg); 7830 7831 // Mix in derived params 7832 ciphertext.mixIn(derivedParams); 7833 7834 return ciphertext; 7835 }, 7836 7837 /** 7838 * Decrypts serialized ciphertext using a password. 7839 * 7840 * @param {Cipher} cipher The cipher algorithm to use. 7841 * @param {CipherParams|string} ciphertext The ciphertext to decrypt. 7842 * @param {string} password The password. 7843 * @param {Object} cfg (Optional) The configuration options to use for this operation. 7844 * 7845 * @return {WordArray} The plaintext. 7846 * 7847 * @static 7848 * 7849 * @example 7850 * 7851 * var plaintext = CryptoJS.lib.PasswordBasedCipher.decrypt(CryptoJS.algo.AES, formattedCiphertext, 'password', { format: CryptoJS.format.OpenSSL }); 7852 * var plaintext = CryptoJS.lib.PasswordBasedCipher.decrypt(CryptoJS.algo.AES, ciphertextParams, 'password', { format: CryptoJS.format.OpenSSL }); 7853 */ 7854 decrypt: function (cipher, ciphertext, password, cfg) { 7855 // Apply config defaults 7856 cfg = this.cfg.extend(cfg); 7857 7858 // Convert string to CipherParams 7859 ciphertext = this._parse(ciphertext, cfg.format); 7860 7861 // Derive key and other params 7862 var derivedParams = cfg.kdf.execute(password, cipher.keySize, cipher.ivSize, ciphertext.salt); 7863 7864 // Add IV to config 7865 cfg.iv = derivedParams.iv; 7866 7867 // Decrypt 7868 var plaintext = SerializableCipher.decrypt.call(this, cipher, ciphertext, derivedParams.key, cfg); 7869 7870 return plaintext; 7871 } 7872 }); 7873 }()); 7874 7875 7876 })); 7877 },{"./core":53}],53:[function(require,module,exports){ 7878 ;(function (root, factory) { 7879 if (typeof exports === "object") { 7880 // CommonJS 7881 module.exports = exports = factory(); 7882 } 7883 else if (typeof define === "function" && define.amd) { 7884 // AMD 7885 define([], factory); 7886 } 7887 else { 7888 // Global (browser) 7889 root.CryptoJS = factory(); 7890 } 7891 }(this, function () { 7892 7893 /** 7894 * CryptoJS core components. 7895 */ 7896 var CryptoJS = CryptoJS || (function (Math, undefined) { 7897 /* 7898 * Local polyfil of Object.create 7899 */ 7900 var create = Object.create || (function () { 7901 function F() {}; 7902 7903 return function (obj) { 7904 var subtype; 7905 7906 F.prototype = obj; 7907 7908 subtype = new F(); 7909 7910 F.prototype = null; 7911 7912 return subtype; 7913 }; 7914 }()) 7915 7916 /** 7917 * CryptoJS namespace. 7918 */ 7919 var C = {}; 7920 7921 /** 7922 * Library namespace. 7923 */ 7924 var C_lib = C.lib = {}; 7925 7926 /** 7927 * Base object for prototypal inheritance. 7928 */ 7929 var Base = C_lib.Base = (function () { 7930 7931 7932 return { 7933 /** 7934 * Creates a new object that inherits from this object. 7935 * 7936 * @param {Object} overrides Properties to copy into the new object. 7937 * 7938 * @return {Object} The new object. 7939 * 7940 * @static 7941 * 7942 * @example 7943 * 7944 * var MyType = CryptoJS.lib.Base.extend({ 7945 * field: 'value', 7946 * 7947 * method: function () { 7948 * } 7949 * }); 7950 */ 7951 extend: function (overrides) { 7952 // Spawn 7953 var subtype = create(this); 7954 7955 // Augment 7956 if (overrides) { 7957 subtype.mixIn(overrides); 7958 } 7959 7960 // Create default initializer 7961 if (!subtype.hasOwnProperty('init') || this.init === subtype.init) { 7962 subtype.init = function () { 7963 subtype.$super.init.apply(this, arguments); 7964 }; 7965 } 7966 7967 // Initializer's prototype is the subtype object 7968 subtype.init.prototype = subtype; 7969 7970 // Reference supertype 7971 subtype.$super = this; 7972 7973 return subtype; 7974 }, 7975 7976 /** 7977 * Extends this object and runs the init method. 7978 * Arguments to create() will be passed to init(). 7979 * 7980 * @return {Object} The new object. 7981 * 7982 * @static 7983 * 7984 * @example 7985 * 7986 * var instance = MyType.create(); 7987 */ 7988 create: function () { 7989 var instance = this.extend(); 7990 instance.init.apply(instance, arguments); 7991 7992 return instance; 7993 }, 7994 7995 /** 7996 * Initializes a newly created object. 7997 * Override this method to add some logic when your objects are created. 7998 * 7999 * @example 8000 * 8001 * var MyType = CryptoJS.lib.Base.extend({ 8002 * init: function () { 8003 * // ... 8004 * } 8005 * }); 8006 */ 8007 init: function () { 8008 }, 8009 8010 /** 8011 * Copies properties into this object. 8012 * 8013 * @param {Object} properties The properties to mix in. 8014 * 8015 * @example 8016 * 8017 * MyType.mixIn({ 8018 * field: 'value' 8019 * }); 8020 */ 8021 mixIn: function (properties) { 8022 for (var propertyName in properties) { 8023 if (properties.hasOwnProperty(propertyName)) { 8024 this[propertyName] = properties[propertyName]; 8025 } 8026 } 8027 8028 // IE won't copy toString using the loop above 8029 if (properties.hasOwnProperty('toString')) { 8030 this.toString = properties.toString; 8031 } 8032 }, 8033 8034 /** 8035 * Creates a copy of this object. 8036 * 8037 * @return {Object} The clone. 8038 * 8039 * @example 8040 * 8041 * var clone = instance.clone(); 8042 */ 8043 clone: function () { 8044 return this.init.prototype.extend(this); 8045 } 8046 }; 8047 }()); 8048 8049 /** 8050 * An array of 32-bit words. 8051 * 8052 * @property {Array} words The array of 32-bit words. 8053 * @property {number} sigBytes The number of significant bytes in this word array. 8054 */ 8055 var WordArray = C_lib.WordArray = Base.extend({ 8056 /** 8057 * Initializes a newly created word array. 8058 * 8059 * @param {Array} words (Optional) An array of 32-bit words. 8060 * @param {number} sigBytes (Optional) The number of significant bytes in the words. 8061 * 8062 * @example 8063 * 8064 * var wordArray = CryptoJS.lib.WordArray.create(); 8065 * var wordArray = CryptoJS.lib.WordArray.create([0x00010203, 0x04050607]); 8066 * var wordArray = CryptoJS.lib.WordArray.create([0x00010203, 0x04050607], 6); 8067 */ 8068 init: function (words, sigBytes) { 8069 words = this.words = words || []; 8070 8071 if (sigBytes != undefined) { 8072 this.sigBytes = sigBytes; 8073 } else { 8074 this.sigBytes = words.length * 4; 8075 } 8076 }, 8077 8078 /** 8079 * Converts this word array to a string. 8080 * 8081 * @param {Encoder} encoder (Optional) The encoding strategy to use. Default: CryptoJS.enc.Hex 8082 * 8083 * @return {string} The stringified word array. 8084 * 8085 * @example 8086 * 8087 * var string = wordArray + ''; 8088 * var string = wordArray.toString(); 8089 * var string = wordArray.toString(CryptoJS.enc.Utf8); 8090 */ 8091 toString: function (encoder) { 8092 return (encoder || Hex).stringify(this); 8093 }, 8094 8095 /** 8096 * Concatenates a word array to this word array. 8097 * 8098 * @param {WordArray} wordArray The word array to append. 8099 * 8100 * @return {WordArray} This word array. 8101 * 8102 * @example 8103 * 8104 * wordArray1.concat(wordArray2); 8105 */ 8106 concat: function (wordArray) { 8107 // Shortcuts 8108 var thisWords = this.words; 8109 var thatWords = wordArray.words; 8110 var thisSigBytes = this.sigBytes; 8111 var thatSigBytes = wordArray.sigBytes; 8112 8113 // Clamp excess bits 8114 this.clamp(); 8115 8116 // Concat 8117 if (thisSigBytes % 4) { 8118 // Copy one byte at a time 8119 for (var i = 0; i < thatSigBytes; i++) { 8120 var thatByte = (thatWords[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff; 8121 thisWords[(thisSigBytes + i) >>> 2] |= thatByte << (24 - ((thisSigBytes + i) % 4) * 8); 8122 } 8123 } else { 8124 // Copy one word at a time 8125 for (var i = 0; i < thatSigBytes; i += 4) { 8126 thisWords[(thisSigBytes + i) >>> 2] = thatWords[i >>> 2]; 8127 } 8128 } 8129 this.sigBytes += thatSigBytes; 8130 8131 // Chainable 8132 return this; 8133 }, 8134 8135 /** 8136 * Removes insignificant bits. 8137 * 8138 * @example 8139 * 8140 * wordArray.clamp(); 8141 */ 8142 clamp: function () { 8143 // Shortcuts 8144 var words = this.words; 8145 var sigBytes = this.sigBytes; 8146 8147 // Clamp 8148 words[sigBytes >>> 2] &= 0xffffffff << (32 - (sigBytes % 4) * 8); 8149 words.length = Math.ceil(sigBytes / 4); 8150 }, 8151 8152 /** 8153 * Creates a copy of this word array. 8154 * 8155 * @return {WordArray} The clone. 8156 * 8157 * @example 8158 * 8159 * var clone = wordArray.clone(); 8160 */ 8161 clone: function () { 8162 var clone = Base.clone.call(this); 8163 clone.words = this.words.slice(0); 8164 8165 return clone; 8166 }, 8167 8168 /** 8169 * Creates a word array filled with random bytes. 8170 * 8171 * @param {number} nBytes The number of random bytes to generate. 8172 * 8173 * @return {WordArray} The random word array. 8174 * 8175 * @static 8176 * 8177 * @example 8178 * 8179 * var wordArray = CryptoJS.lib.WordArray.random(16); 8180 */ 8181 random: function (nBytes) { 8182 var words = []; 8183 8184 var r = (function (m_w) { 8185 var m_w = m_w; 8186 var m_z = 0x3ade68b1; 8187 var mask = 0xffffffff; 8188 8189 return function () { 8190 m_z = (0x9069 * (m_z & 0xFFFF) + (m_z >> 0x10)) & mask; 8191 m_w = (0x4650 * (m_w & 0xFFFF) + (m_w >> 0x10)) & mask; 8192 var result = ((m_z << 0x10) + m_w) & mask; 8193 result /= 0x100000000; 8194 result += 0.5; 8195 return result * (Math.random() > .5 ? 1 : -1); 8196 } 8197 }); 8198 8199 for (var i = 0, rcache; i < nBytes; i += 4) { 8200 var _r = r((rcache || Math.random()) * 0x100000000); 8201 8202 rcache = _r() * 0x3ade67b7; 8203 words.push((_r() * 0x100000000) | 0); 8204 } 8205 8206 return new WordArray.init(words, nBytes); 8207 } 8208 }); 8209 8210 /** 8211 * Encoder namespace. 8212 */ 8213 var C_enc = C.enc = {}; 8214 8215 /** 8216 * Hex encoding strategy. 8217 */ 8218 var Hex = C_enc.Hex = { 8219 /** 8220 * Converts a word array to a hex string. 8221 * 8222 * @param {WordArray} wordArray The word array. 8223 * 8224 * @return {string} The hex string. 8225 * 8226 * @static 8227 * 8228 * @example 8229 * 8230 * var hexString = CryptoJS.enc.Hex.stringify(wordArray); 8231 */ 8232 stringify: function (wordArray) { 8233 // Shortcuts 8234 var words = wordArray.words; 8235 var sigBytes = wordArray.sigBytes; 8236 8237 // Convert 8238 var hexChars = []; 8239 for (var i = 0; i < sigBytes; i++) { 8240 var bite = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff; 8241 hexChars.push((bite >>> 4).toString(16)); 8242 hexChars.push((bite & 0x0f).toString(16)); 8243 } 8244 8245 return hexChars.join(''); 8246 }, 8247 8248 /** 8249 * Converts a hex string to a word array. 8250 * 8251 * @param {string} hexStr The hex string. 8252 * 8253 * @return {WordArray} The word array. 8254 * 8255 * @static 8256 * 8257 * @example 8258 * 8259 * var wordArray = CryptoJS.enc.Hex.parse(hexString); 8260 */ 8261 parse: function (hexStr) { 8262 // Shortcut 8263 var hexStrLength = hexStr.length; 8264 8265 // Convert 8266 var words = []; 8267 for (var i = 0; i < hexStrLength; i += 2) { 8268 words[i >>> 3] |= parseInt(hexStr.substr(i, 2), 16) << (24 - (i % 8) * 4); 8269 } 8270 8271 return new WordArray.init(words, hexStrLength / 2); 8272 } 8273 }; 8274 8275 /** 8276 * Latin1 encoding strategy. 8277 */ 8278 var Latin1 = C_enc.Latin1 = { 8279 /** 8280 * Converts a word array to a Latin1 string. 8281 * 8282 * @param {WordArray} wordArray The word array. 8283 * 8284 * @return {string} The Latin1 string. 8285 * 8286 * @static 8287 * 8288 * @example 8289 * 8290 * var latin1String = CryptoJS.enc.Latin1.stringify(wordArray); 8291 */ 8292 stringify: function (wordArray) { 8293 // Shortcuts 8294 var words = wordArray.words; 8295 var sigBytes = wordArray.sigBytes; 8296 8297 // Convert 8298 var latin1Chars = []; 8299 for (var i = 0; i < sigBytes; i++) { 8300 var bite = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff; 8301 latin1Chars.push(String.fromCharCode(bite)); 8302 } 8303 8304 return latin1Chars.join(''); 8305 }, 8306 8307 /** 8308 * Converts a Latin1 string to a word array. 8309 * 8310 * @param {string} latin1Str The Latin1 string. 8311 * 8312 * @return {WordArray} The word array. 8313 * 8314 * @static 8315 * 8316 * @example 8317 * 8318 * var wordArray = CryptoJS.enc.Latin1.parse(latin1String); 8319 */ 8320 parse: function (latin1Str) { 8321 // Shortcut 8322 var latin1StrLength = latin1Str.length; 8323 8324 // Convert 8325 var words = []; 8326 for (var i = 0; i < latin1StrLength; i++) { 8327 words[i >>> 2] |= (latin1Str.charCodeAt(i) & 0xff) << (24 - (i % 4) * 8); 8328 } 8329 8330 return new WordArray.init(words, latin1StrLength); 8331 } 8332 }; 8333 8334 /** 8335 * UTF-8 encoding strategy. 8336 */ 8337 var Utf8 = C_enc.Utf8 = { 8338 /** 8339 * Converts a word array to a UTF-8 string. 8340 * 8341 * @param {WordArray} wordArray The word array. 8342 * 8343 * @return {string} The UTF-8 string. 8344 * 8345 * @static 8346 * 8347 * @example 8348 * 8349 * var utf8String = CryptoJS.enc.Utf8.stringify(wordArray); 8350 */ 8351 stringify: function (wordArray) { 8352 try { 8353 return decodeURIComponent(escape(Latin1.stringify(wordArray))); 8354 } catch (e) { 8355 throw new Error('Malformed UTF-8 data'); 8356 } 8357 }, 8358 8359 /** 8360 * Converts a UTF-8 string to a word array. 8361 * 8362 * @param {string} utf8Str The UTF-8 string. 8363 * 8364 * @return {WordArray} The word array. 8365 * 8366 * @static 8367 * 8368 * @example 8369 * 8370 * var wordArray = CryptoJS.enc.Utf8.parse(utf8String); 8371 */ 8372 parse: function (utf8Str) { 8373 return Latin1.parse(unescape(encodeURIComponent(utf8Str))); 8374 } 8375 }; 8376 8377 /** 8378 * Abstract buffered block algorithm template. 8379 * 8380 * The property blockSize must be implemented in a concrete subtype. 8381 * 8382 * @property {number} _minBufferSize The number of blocks that should be kept unprocessed in the buffer. Default: 0 8383 */ 8384 var BufferedBlockAlgorithm = C_lib.BufferedBlockAlgorithm = Base.extend({ 8385 /** 8386 * Resets this block algorithm's data buffer to its initial state. 8387 * 8388 * @example 8389 * 8390 * bufferedBlockAlgorithm.reset(); 8391 */ 8392 reset: function () { 8393 // Initial values 8394 this._data = new WordArray.init(); 8395 this._nDataBytes = 0; 8396 }, 8397 8398 /** 8399 * Adds new data to this block algorithm's buffer. 8400 * 8401 * @param {WordArray|string} data The data to append. Strings are converted to a WordArray using UTF-8. 8402 * 8403 * @example 8404 * 8405 * bufferedBlockAlgorithm._append('data'); 8406 * bufferedBlockAlgorithm._append(wordArray); 8407 */ 8408 _append: function (data) { 8409 // Convert string to WordArray, else assume WordArray already 8410 if (typeof data == 'string') { 8411 data = Utf8.parse(data); 8412 } 8413 8414 // Append 8415 this._data.concat(data); 8416 this._nDataBytes += data.sigBytes; 8417 }, 8418 8419 /** 8420 * Processes available data blocks. 8421 * 8422 * This method invokes _doProcessBlock(offset), which must be implemented by a concrete subtype. 8423 * 8424 * @param {boolean} doFlush Whether all blocks and partial blocks should be processed. 8425 * 8426 * @return {WordArray} The processed data. 8427 * 8428 * @example 8429 * 8430 * var processedData = bufferedBlockAlgorithm._process(); 8431 * var processedData = bufferedBlockAlgorithm._process(!!'flush'); 8432 */ 8433 _process: function (doFlush) { 8434 // Shortcuts 8435 var data = this._data; 8436 var dataWords = data.words; 8437 var dataSigBytes = data.sigBytes; 8438 var blockSize = this.blockSize; 8439 var blockSizeBytes = blockSize * 4; 8440 8441 // Count blocks ready 8442 var nBlocksReady = dataSigBytes / blockSizeBytes; 8443 if (doFlush) { 8444 // Round up to include partial blocks 8445 nBlocksReady = Math.ceil(nBlocksReady); 8446 } else { 8447 // Round down to include only full blocks, 8448 // less the number of blocks that must remain in the buffer 8449 nBlocksReady = Math.max((nBlocksReady | 0) - this._minBufferSize, 0); 8450 } 8451 8452 // Count words ready 8453 var nWordsReady = nBlocksReady * blockSize; 8454 8455 // Count bytes ready 8456 var nBytesReady = Math.min(nWordsReady * 4, dataSigBytes); 8457 8458 // Process blocks 8459 if (nWordsReady) { 8460 for (var offset = 0; offset < nWordsReady; offset += blockSize) { 8461 // Perform concrete-algorithm logic 8462 this._doProcessBlock(dataWords, offset); 8463 } 8464 8465 // Remove processed words 8466 var processedWords = dataWords.splice(0, nWordsReady); 8467 data.sigBytes -= nBytesReady; 8468 } 8469 8470 // Return processed words 8471 return new WordArray.init(processedWords, nBytesReady); 8472 }, 8473 8474 /** 8475 * Creates a copy of this object. 8476 * 8477 * @return {Object} The clone. 8478 * 8479 * @example 8480 * 8481 * var clone = bufferedBlockAlgorithm.clone(); 8482 */ 8483 clone: function () { 8484 var clone = Base.clone.call(this); 8485 clone._data = this._data.clone(); 8486 8487 return clone; 8488 }, 8489 8490 _minBufferSize: 0 8491 }); 8492 8493 /** 8494 * Abstract hasher template. 8495 * 8496 * @property {number} blockSize The number of 32-bit words this hasher operates on. Default: 16 (512 bits) 8497 */ 8498 var Hasher = C_lib.Hasher = BufferedBlockAlgorithm.extend({ 8499 /** 8500 * Configuration options. 8501 */ 8502 cfg: Base.extend(), 8503 8504 /** 8505 * Initializes a newly created hasher. 8506 * 8507 * @param {Object} cfg (Optional) The configuration options to use for this hash computation. 8508 * 8509 * @example 8510 * 8511 * var hasher = CryptoJS.algo.SHA256.create(); 8512 */ 8513 init: function (cfg) { 8514 // Apply config defaults 8515 this.cfg = this.cfg.extend(cfg); 8516 8517 // Set initial values 8518 this.reset(); 8519 }, 8520 8521 /** 8522 * Resets this hasher to its initial state. 8523 * 8524 * @example 8525 * 8526 * hasher.reset(); 8527 */ 8528 reset: function () { 8529 // Reset data buffer 8530 BufferedBlockAlgorithm.reset.call(this); 8531 8532 // Perform concrete-hasher logic 8533 this._doReset(); 8534 }, 8535 8536 /** 8537 * Updates this hasher with a message. 8538 * 8539 * @param {WordArray|string} messageUpdate The message to append. 8540 * 8541 * @return {Hasher} This hasher. 8542 * 8543 * @example 8544 * 8545 * hasher.update('message'); 8546 * hasher.update(wordArray); 8547 */ 8548 update: function (messageUpdate) { 8549 // Append 8550 this._append(messageUpdate); 8551 8552 // Update the hash 8553 this._process(); 8554 8555 // Chainable 8556 return this; 8557 }, 8558 8559 /** 8560 * Finalizes the hash computation. 8561 * Note that the finalize operation is effectively a destructive, read-once operation. 8562 * 8563 * @param {WordArray|string} messageUpdate (Optional) A final message update. 8564 * 8565 * @return {WordArray} The hash. 8566 * 8567 * @example 8568 * 8569 * var hash = hasher.finalize(); 8570 * var hash = hasher.finalize('message'); 8571 * var hash = hasher.finalize(wordArray); 8572 */ 8573 finalize: function (messageUpdate) { 8574 // Final message update 8575 if (messageUpdate) { 8576 this._append(messageUpdate); 8577 } 8578 8579 // Perform concrete-hasher logic 8580 var hash = this._doFinalize(); 8581 8582 return hash; 8583 }, 8584 8585 blockSize: 512/32, 8586 8587 /** 8588 * Creates a shortcut function to a hasher's object interface. 8589 * 8590 * @param {Hasher} hasher The hasher to create a helper for. 8591 * 8592 * @return {Function} The shortcut function. 8593 * 8594 * @static 8595 * 8596 * @example 8597 * 8598 * var SHA256 = CryptoJS.lib.Hasher._createHelper(CryptoJS.algo.SHA256); 8599 */ 8600 _createHelper: function (hasher) { 8601 return function (message, cfg) { 8602 return new hasher.init(cfg).finalize(message); 8603 }; 8604 }, 8605 8606 /** 8607 * Creates a shortcut function to the HMAC's object interface. 8608 * 8609 * @param {Hasher} hasher The hasher to use in this HMAC helper. 8610 * 8611 * @return {Function} The shortcut function. 8612 * 8613 * @static 8614 * 8615 * @example 8616 * 8617 * var HmacSHA256 = CryptoJS.lib.Hasher._createHmacHelper(CryptoJS.algo.SHA256); 8618 */ 8619 _createHmacHelper: function (hasher) { 8620 return function (message, key) { 8621 return new C_algo.HMAC.init(hasher, key).finalize(message); 8622 }; 8623 } 8624 }); 8625 8626 /** 8627 * Algorithm namespace. 8628 */ 8629 var C_algo = C.algo = {}; 8630 8631 return C; 8632 }(Math)); 8633 8634 8635 return CryptoJS; 8636 8637 })); 8638 },{}],54:[function(require,module,exports){ 8639 ;(function (root, factory) { 8640 if (typeof exports === "object") { 8641 // CommonJS 8642 module.exports = exports = factory(require("./core")); 8643 } 8644 else if (typeof define === "function" && define.amd) { 8645 // AMD 8646 define(["./core"], factory); 8647 } 8648 else { 8649 // Global (browser) 8650 factory(root.CryptoJS); 8651 } 8652 }(this, function (CryptoJS) { 8653 8654 (function () { 8655 // Shortcuts 8656 var C = CryptoJS; 8657 var C_lib = C.lib; 8658 var WordArray = C_lib.WordArray; 8659 var C_enc = C.enc; 8660 8661 /** 8662 * Base64 encoding strategy. 8663 */ 8664 var Base64 = C_enc.Base64 = { 8665 /** 8666 * Converts a word array to a Base64 string. 8667 * 8668 * @param {WordArray} wordArray The word array. 8669 * 8670 * @return {string} The Base64 string. 8671 * 8672 * @static 8673 * 8674 * @example 8675 * 8676 * var base64String = CryptoJS.enc.Base64.stringify(wordArray); 8677 */ 8678 stringify: function (wordArray) { 8679 // Shortcuts 8680 var words = wordArray.words; 8681 var sigBytes = wordArray.sigBytes; 8682 var map = this._map; 8683 8684 // Clamp excess bits 8685 wordArray.clamp(); 8686 8687 // Convert 8688 var base64Chars = []; 8689 for (var i = 0; i < sigBytes; i += 3) { 8690 var byte1 = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff; 8691 var byte2 = (words[(i + 1) >>> 2] >>> (24 - ((i + 1) % 4) * 8)) & 0xff; 8692 var byte3 = (words[(i + 2) >>> 2] >>> (24 - ((i + 2) % 4) * 8)) & 0xff; 8693 8694 var triplet = (byte1 << 16) | (byte2 << 8) | byte3; 8695 8696 for (var j = 0; (j < 4) && (i + j * 0.75 < sigBytes); j++) { 8697 base64Chars.push(map.charAt((triplet >>> (6 * (3 - j))) & 0x3f)); 8698 } 8699 } 8700 8701 // Add padding 8702 var paddingChar = map.charAt(64); 8703 if (paddingChar) { 8704 while (base64Chars.length % 4) { 8705 base64Chars.push(paddingChar); 8706 } 8707 } 8708 8709 return base64Chars.join(''); 8710 }, 8711 8712 /** 8713 * Converts a Base64 string to a word array. 8714 * 8715 * @param {string} base64Str The Base64 string. 8716 * 8717 * @return {WordArray} The word array. 8718 * 8719 * @static 8720 * 8721 * @example 8722 * 8723 * var wordArray = CryptoJS.enc.Base64.parse(base64String); 8724 */ 8725 parse: function (base64Str) { 8726 // Shortcuts 8727 var base64StrLength = base64Str.length; 8728 var map = this._map; 8729 var reverseMap = this._reverseMap; 8730 8731 if (!reverseMap) { 8732 reverseMap = this._reverseMap = []; 8733 for (var j = 0; j < map.length; j++) { 8734 reverseMap[map.charCodeAt(j)] = j; 8735 } 8736 } 8737 8738 // Ignore padding 8739 var paddingChar = map.charAt(64); 8740 if (paddingChar) { 8741 var paddingIndex = base64Str.indexOf(paddingChar); 8742 if (paddingIndex !== -1) { 8743 base64StrLength = paddingIndex; 8744 } 8745 } 8746 8747 // Convert 8748 return parseLoop(base64Str, base64StrLength, reverseMap); 8749 8750 }, 8751 8752 _map: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=' 8753 }; 8754 8755 function parseLoop(base64Str, base64StrLength, reverseMap) { 8756 var words = []; 8757 var nBytes = 0; 8758 for (var i = 0; i < base64StrLength; i++) { 8759 if (i % 4) { 8760 var bits1 = reverseMap[base64Str.charCodeAt(i - 1)] << ((i % 4) * 2); 8761 var bits2 = reverseMap[base64Str.charCodeAt(i)] >>> (6 - (i % 4) * 2); 8762 words[nBytes >>> 2] |= (bits1 | bits2) << (24 - (nBytes % 4) * 8); 8763 nBytes++; 8764 } 8765 } 8766 return WordArray.create(words, nBytes); 8767 } 8768 }()); 8769 8770 8771 return CryptoJS.enc.Base64; 8772 8773 })); 8774 },{"./core":53}],55:[function(require,module,exports){ 8775 ;(function (root, factory) { 8776 if (typeof exports === "object") { 8777 // CommonJS 8778 module.exports = exports = factory(require("./core")); 8779 } 8780 else if (typeof define === "function" && define.amd) { 8781 // AMD 8782 define(["./core"], factory); 8783 } 8784 else { 8785 // Global (browser) 8786 factory(root.CryptoJS); 8787 } 8788 }(this, function (CryptoJS) { 8789 8790 (function () { 8791 // Shortcuts 8792 var C = CryptoJS; 8793 var C_lib = C.lib; 8794 var WordArray = C_lib.WordArray; 8795 var C_enc = C.enc; 8796 8797 /** 8798 * UTF-16 BE encoding strategy. 8799 */ 8800 var Utf16BE = C_enc.Utf16 = C_enc.Utf16BE = { 8801 /** 8802 * Converts a word array to a UTF-16 BE string. 8803 * 8804 * @param {WordArray} wordArray The word array. 8805 * 8806 * @return {string} The UTF-16 BE string. 8807 * 8808 * @static 8809 * 8810 * @example 8811 * 8812 * var utf16String = CryptoJS.enc.Utf16.stringify(wordArray); 8813 */ 8814 stringify: function (wordArray) { 8815 // Shortcuts 8816 var words = wordArray.words; 8817 var sigBytes = wordArray.sigBytes; 8818 8819 // Convert 8820 var utf16Chars = []; 8821 for (var i = 0; i < sigBytes; i += 2) { 8822 var codePoint = (words[i >>> 2] >>> (16 - (i % 4) * 8)) & 0xffff; 8823 utf16Chars.push(String.fromCharCode(codePoint)); 8824 } 8825 8826 return utf16Chars.join(''); 8827 }, 8828 8829 /** 8830 * Converts a UTF-16 BE string to a word array. 8831 * 8832 * @param {string} utf16Str The UTF-16 BE string. 8833 * 8834 * @return {WordArray} The word array. 8835 * 8836 * @static 8837 * 8838 * @example 8839 * 8840 * var wordArray = CryptoJS.enc.Utf16.parse(utf16String); 8841 */ 8842 parse: function (utf16Str) { 8843 // Shortcut 8844 var utf16StrLength = utf16Str.length; 8845 8846 // Convert 8847 var words = []; 8848 for (var i = 0; i < utf16StrLength; i++) { 8849 words[i >>> 1] |= utf16Str.charCodeAt(i) << (16 - (i % 2) * 16); 8850 } 8851 8852 return WordArray.create(words, utf16StrLength * 2); 8853 } 8854 }; 8855 8856 /** 8857 * UTF-16 LE encoding strategy. 8858 */ 8859 C_enc.Utf16LE = { 8860 /** 8861 * Converts a word array to a UTF-16 LE string. 8862 * 8863 * @param {WordArray} wordArray The word array. 8864 * 8865 * @return {string} The UTF-16 LE string. 8866 * 8867 * @static 8868 * 8869 * @example 8870 * 8871 * var utf16Str = CryptoJS.enc.Utf16LE.stringify(wordArray); 8872 */ 8873 stringify: function (wordArray) { 8874 // Shortcuts 8875 var words = wordArray.words; 8876 var sigBytes = wordArray.sigBytes; 8877 8878 // Convert 8879 var utf16Chars = []; 8880 for (var i = 0; i < sigBytes; i += 2) { 8881 var codePoint = swapEndian((words[i >>> 2] >>> (16 - (i % 4) * 8)) & 0xffff); 8882 utf16Chars.push(String.fromCharCode(codePoint)); 8883 } 8884 8885 return utf16Chars.join(''); 8886 }, 8887 8888 /** 8889 * Converts a UTF-16 LE string to a word array. 8890 * 8891 * @param {string} utf16Str The UTF-16 LE string. 8892 * 8893 * @return {WordArray} The word array. 8894 * 8895 * @static 8896 * 8897 * @example 8898 * 8899 * var wordArray = CryptoJS.enc.Utf16LE.parse(utf16Str); 8900 */ 8901 parse: function (utf16Str) { 8902 // Shortcut 8903 var utf16StrLength = utf16Str.length; 8904 8905 // Convert 8906 var words = []; 8907 for (var i = 0; i < utf16StrLength; i++) { 8908 words[i >>> 1] |= swapEndian(utf16Str.charCodeAt(i) << (16 - (i % 2) * 16)); 8909 } 8910 8911 return WordArray.create(words, utf16StrLength * 2); 8912 } 8913 }; 8914 8915 function swapEndian(word) { 8916 return ((word << 8) & 0xff00ff00) | ((word >>> 8) & 0x00ff00ff); 8917 } 8918 }()); 8919 8920 8921 return CryptoJS.enc.Utf16; 8922 8923 })); 8924 },{"./core":53}],56:[function(require,module,exports){ 8925 ;(function (root, factory, undef) { 8926 if (typeof exports === "object") { 8927 // CommonJS 8928 module.exports = exports = factory(require("./core"), require("./sha1"), require("./hmac")); 8929 } 8930 else if (typeof define === "function" && define.amd) { 8931 // AMD 8932 define(["./core", "./sha1", "./hmac"], factory); 8933 } 8934 else { 8935 // Global (browser) 8936 factory(root.CryptoJS); 8937 } 8938 }(this, function (CryptoJS) { 8939 8940 (function () { 8941 // Shortcuts 8942 var C = CryptoJS; 8943 var C_lib = C.lib; 8944 var Base = C_lib.Base; 8945 var WordArray = C_lib.WordArray; 8946 var C_algo = C.algo; 8947 var MD5 = C_algo.MD5; 8948 8949 /** 8950 * This key derivation function is meant to conform with EVP_BytesToKey. 8951 * www.openssl.org/docs/crypto/EVP_BytesToKey.html 8952 */ 8953 var EvpKDF = C_algo.EvpKDF = Base.extend({ 8954 /** 8955 * Configuration options. 8956 * 8957 * @property {number} keySize The key size in words to generate. Default: 4 (128 bits) 8958 * @property {Hasher} hasher The hash algorithm to use. Default: MD5 8959 * @property {number} iterations The number of iterations to perform. Default: 1 8960 */ 8961 cfg: Base.extend({ 8962 keySize: 128/32, 8963 hasher: MD5, 8964 iterations: 1 8965 }), 8966 8967 /** 8968 * Initializes a newly created key derivation function. 8969 * 8970 * @param {Object} cfg (Optional) The configuration options to use for the derivation. 8971 * 8972 * @example 8973 * 8974 * var kdf = CryptoJS.algo.EvpKDF.create(); 8975 * var kdf = CryptoJS.algo.EvpKDF.create({ keySize: 8 }); 8976 * var kdf = CryptoJS.algo.EvpKDF.create({ keySize: 8, iterations: 1000 }); 8977 */ 8978 init: function (cfg) { 8979 this.cfg = this.cfg.extend(cfg); 8980 }, 8981 8982 /** 8983 * Derives a key from a password. 8984 * 8985 * @param {WordArray|string} password The password. 8986 * @param {WordArray|string} salt A salt. 8987 * 8988 * @return {WordArray} The derived key. 8989 * 8990 * @example 8991 * 8992 * var key = kdf.compute(password, salt); 8993 */ 8994 compute: function (password, salt) { 8995 // Shortcut 8996 var cfg = this.cfg; 8997 8998 // Init hasher 8999 var hasher = cfg.hasher.create(); 9000 9001 // Initial values 9002 var derivedKey = WordArray.create(); 9003 9004 // Shortcuts 9005 var derivedKeyWords = derivedKey.words; 9006 var keySize = cfg.keySize; 9007 var iterations = cfg.iterations; 9008 9009 // Generate key 9010 while (derivedKeyWords.length < keySize) { 9011 if (block) { 9012 hasher.update(block); 9013 } 9014 var block = hasher.update(password).finalize(salt); 9015 hasher.reset(); 9016 9017 // Iterations 9018 for (var i = 1; i < iterations; i++) { 9019 block = hasher.finalize(block); 9020 hasher.reset(); 9021 } 9022 9023 derivedKey.concat(block); 9024 } 9025 derivedKey.sigBytes = keySize * 4; 9026 9027 return derivedKey; 9028 } 9029 }); 9030 9031 /** 9032 * Derives a key from a password. 9033 * 9034 * @param {WordArray|string} password The password. 9035 * @param {WordArray|string} salt A salt. 9036 * @param {Object} cfg (Optional) The configuration options to use for this computation. 9037 * 9038 * @return {WordArray} The derived key. 9039 * 9040 * @static 9041 * 9042 * @example 9043 * 9044 * var key = CryptoJS.EvpKDF(password, salt); 9045 * var key = CryptoJS.EvpKDF(password, salt, { keySize: 8 }); 9046 * var key = CryptoJS.EvpKDF(password, salt, { keySize: 8, iterations: 1000 }); 9047 */ 9048 C.EvpKDF = function (password, salt, cfg) { 9049 return EvpKDF.create(cfg).compute(password, salt); 9050 }; 9051 }()); 9052 9053 9054 return CryptoJS.EvpKDF; 9055 9056 })); 9057 },{"./core":53,"./hmac":58,"./sha1":77}],57:[function(require,module,exports){ 9058 ;(function (root, factory, undef) { 9059 if (typeof exports === "object") { 9060 // CommonJS 9061 module.exports = exports = factory(require("./core"), require("./cipher-core")); 9062 } 9063 else if (typeof define === "function" && define.amd) { 9064 // AMD 9065 define(["./core", "./cipher-core"], factory); 9066 } 9067 else { 9068 // Global (browser) 9069 factory(root.CryptoJS); 9070 } 9071 }(this, function (CryptoJS) { 9072 9073 (function (undefined) { 9074 // Shortcuts 9075 var C = CryptoJS; 9076 var C_lib = C.lib; 9077 var CipherParams = C_lib.CipherParams; 9078 var C_enc = C.enc; 9079 var Hex = C_enc.Hex; 9080 var C_format = C.format; 9081 9082 var HexFormatter = C_format.Hex = { 9083 /** 9084 * Converts the ciphertext of a cipher params object to a hexadecimally encoded string. 9085 * 9086 * @param {CipherParams} cipherParams The cipher params object. 9087 * 9088 * @return {string} The hexadecimally encoded string. 9089 * 9090 * @static 9091 * 9092 * @example 9093 * 9094 * var hexString = CryptoJS.format.Hex.stringify(cipherParams); 9095 */ 9096 stringify: function (cipherParams) { 9097 return cipherParams.ciphertext.toString(Hex); 9098 }, 9099 9100 /** 9101 * Converts a hexadecimally encoded ciphertext string to a cipher params object. 9102 * 9103 * @param {string} input The hexadecimally encoded string. 9104 * 9105 * @return {CipherParams} The cipher params object. 9106 * 9107 * @static 9108 * 9109 * @example 9110 * 9111 * var cipherParams = CryptoJS.format.Hex.parse(hexString); 9112 */ 9113 parse: function (input) { 9114 var ciphertext = Hex.parse(input); 9115 return CipherParams.create({ ciphertext: ciphertext }); 9116 } 9117 }; 9118 }()); 9119 9120 9121 return CryptoJS.format.Hex; 9122 9123 })); 9124 },{"./cipher-core":52,"./core":53}],58:[function(require,module,exports){ 9125 ;(function (root, factory) { 9126 if (typeof exports === "object") { 9127 // CommonJS 9128 module.exports = exports = factory(require("./core")); 9129 } 9130 else if (typeof define === "function" && define.amd) { 9131 // AMD 9132 define(["./core"], factory); 9133 } 9134 else { 9135 // Global (browser) 9136 factory(root.CryptoJS); 9137 } 9138 }(this, function (CryptoJS) { 9139 9140 (function () { 9141 // Shortcuts 9142 var C = CryptoJS; 9143 var C_lib = C.lib; 9144 var Base = C_lib.Base; 9145 var C_enc = C.enc; 9146 var Utf8 = C_enc.Utf8; 9147 var C_algo = C.algo; 9148 9149 /** 9150 * HMAC algorithm. 9151 */ 9152 var HMAC = C_algo.HMAC = Base.extend({ 9153 /** 9154 * Initializes a newly created HMAC. 9155 * 9156 * @param {Hasher} hasher The hash algorithm to use. 9157 * @param {WordArray|string} key The secret key. 9158 * 9159 * @example 9160 * 9161 * var hmacHasher = CryptoJS.algo.HMAC.create(CryptoJS.algo.SHA256, key); 9162 */ 9163 init: function (hasher, key) { 9164 // Init hasher 9165 hasher = this._hasher = new hasher.init(); 9166 9167 // Convert string to WordArray, else assume WordArray already 9168 if (typeof key == 'string') { 9169 key = Utf8.parse(key); 9170 } 9171 9172 // Shortcuts 9173 var hasherBlockSize = hasher.blockSize; 9174 var hasherBlockSizeBytes = hasherBlockSize * 4; 9175 9176 // Allow arbitrary length keys 9177 if (key.sigBytes > hasherBlockSizeBytes) { 9178 key = hasher.finalize(key); 9179 } 9180 9181 // Clamp excess bits 9182 key.clamp(); 9183 9184 // Clone key for inner and outer pads 9185 var oKey = this._oKey = key.clone(); 9186 var iKey = this._iKey = key.clone(); 9187 9188 // Shortcuts 9189 var oKeyWords = oKey.words; 9190 var iKeyWords = iKey.words; 9191 9192 // XOR keys with pad constants 9193 for (var i = 0; i < hasherBlockSize; i++) { 9194 oKeyWords[i] ^= 0x5c5c5c5c; 9195 iKeyWords[i] ^= 0x36363636; 9196 } 9197 oKey.sigBytes = iKey.sigBytes = hasherBlockSizeBytes; 9198 9199 // Set initial values 9200 this.reset(); 9201 }, 9202 9203 /** 9204 * Resets this HMAC to its initial state. 9205 * 9206 * @example 9207 * 9208 * hmacHasher.reset(); 9209 */ 9210 reset: function () { 9211 // Shortcut 9212 var hasher = this._hasher; 9213 9214 // Reset 9215 hasher.reset(); 9216 hasher.update(this._iKey); 9217 }, 9218 9219 /** 9220 * Updates this HMAC with a message. 9221 * 9222 * @param {WordArray|string} messageUpdate The message to append. 9223 * 9224 * @return {HMAC} This HMAC instance. 9225 * 9226 * @example 9227 * 9228 * hmacHasher.update('message'); 9229 * hmacHasher.update(wordArray); 9230 */ 9231 update: function (messageUpdate) { 9232 this._hasher.update(messageUpdate); 9233 9234 // Chainable 9235 return this; 9236 }, 9237 9238 /** 9239 * Finalizes the HMAC computation. 9240 * Note that the finalize operation is effectively a destructive, read-once operation. 9241 * 9242 * @param {WordArray|string} messageUpdate (Optional) A final message update. 9243 * 9244 * @return {WordArray} The HMAC. 9245 * 9246 * @example 9247 * 9248 * var hmac = hmacHasher.finalize(); 9249 * var hmac = hmacHasher.finalize('message'); 9250 * var hmac = hmacHasher.finalize(wordArray); 9251 */ 9252 finalize: function (messageUpdate) { 9253 // Shortcut 9254 var hasher = this._hasher; 9255 9256 // Compute HMAC 9257 var innerHash = hasher.finalize(messageUpdate); 9258 hasher.reset(); 9259 var hmac = hasher.finalize(this._oKey.clone().concat(innerHash)); 9260 9261 return hmac; 9262 } 9263 }); 9264 }()); 9265 9266 9267 })); 9268 },{"./core":53}],59:[function(require,module,exports){ 9269 ;(function (root, factory, undef) { 9270 if (typeof exports === "object") { 9271 // CommonJS 9272 module.exports = exports = factory(require("./core"), require("./x64-core"), require("./lib-typedarrays"), require("./enc-utf16"), require("./enc-base64"), require("./md5"), require("./sha1"), require("./sha256"), require("./sha224"), require("./sha512"), require("./sha384"), require("./sha3"), require("./ripemd160"), require("./hmac"), require("./pbkdf2"), require("./evpkdf"), require("./cipher-core"), require("./mode-cfb"), require("./mode-ctr"), require("./mode-ctr-gladman"), require("./mode-ofb"), require("./mode-ecb"), require("./pad-ansix923"), require("./pad-iso10126"), require("./pad-iso97971"), require("./pad-zeropadding"), require("./pad-nopadding"), require("./format-hex"), require("./aes"), require("./tripledes"), require("./rc4"), require("./rabbit"), require("./rabbit-legacy")); 9273 } 9274 else if (typeof define === "function" && define.amd) { 9275 // AMD 9276 define(["./core", "./x64-core", "./lib-typedarrays", "./enc-utf16", "./enc-base64", "./md5", "./sha1", "./sha256", "./sha224", "./sha512", "./sha384", "./sha3", "./ripemd160", "./hmac", "./pbkdf2", "./evpkdf", "./cipher-core", "./mode-cfb", "./mode-ctr", "./mode-ctr-gladman", "./mode-ofb", "./mode-ecb", "./pad-ansix923", "./pad-iso10126", "./pad-iso97971", "./pad-zeropadding", "./pad-nopadding", "./format-hex", "./aes", "./tripledes", "./rc4", "./rabbit", "./rabbit-legacy"], factory); 9277 } 9278 else { 9279 // Global (browser) 9280 root.CryptoJS = factory(root.CryptoJS); 9281 } 9282 }(this, function (CryptoJS) { 9283 9284 return CryptoJS; 9285 9286 })); 9287 },{"./aes":51,"./cipher-core":52,"./core":53,"./enc-base64":54,"./enc-utf16":55,"./evpkdf":56,"./format-hex":57,"./hmac":58,"./lib-typedarrays":60,"./md5":61,"./mode-cfb":62,"./mode-ctr":64,"./mode-ctr-gladman":63,"./mode-ecb":65,"./mode-ofb":66,"./pad-ansix923":67,"./pad-iso10126":68,"./pad-iso97971":69,"./pad-nopadding":70,"./pad-zeropadding":71,"./pbkdf2":72,"./rabbit":74,"./rabbit-legacy":73,"./rc4":75,"./ripemd160":76,"./sha1":77,"./sha224":78,"./sha256":79,"./sha3":80,"./sha384":81,"./sha512":82,"./tripledes":83,"./x64-core":84}],60:[function(require,module,exports){ 9288 ;(function (root, factory) { 9289 if (typeof exports === "object") { 9290 // CommonJS 9291 module.exports = exports = factory(require("./core")); 9292 } 9293 else if (typeof define === "function" && define.amd) { 9294 // AMD 9295 define(["./core"], factory); 9296 } 9297 else { 9298 // Global (browser) 9299 factory(root.CryptoJS); 9300 } 9301 }(this, function (CryptoJS) { 9302 9303 (function () { 9304 // Check if typed arrays are supported 9305 if (typeof ArrayBuffer != 'function') { 9306 return; 9307 } 9308 9309 // Shortcuts 9310 var C = CryptoJS; 9311 var C_lib = C.lib; 9312 var WordArray = C_lib.WordArray; 9313 9314 // Reference original init 9315 var superInit = WordArray.init; 9316 9317 // Augment WordArray.init to handle typed arrays 9318 var subInit = WordArray.init = function (typedArray) { 9319 // Convert buffers to uint8 9320 if (typedArray instanceof ArrayBuffer) { 9321 typedArray = new Uint8Array(typedArray); 9322 } 9323 9324 // Convert other array views to uint8 9325 if ( 9326 typedArray instanceof Int8Array || 9327 (typeof Uint8ClampedArray !== "undefined" && typedArray instanceof Uint8ClampedArray) || 9328 typedArray instanceof Int16Array || 9329 typedArray instanceof Uint16Array || 9330 typedArray instanceof Int32Array || 9331 typedArray instanceof Uint32Array || 9332 typedArray instanceof Float32Array || 9333 typedArray instanceof Float64Array 9334 ) { 9335 typedArray = new Uint8Array(typedArray.buffer, typedArray.byteOffset, typedArray.byteLength); 9336 } 9337 9338 // Handle Uint8Array 9339 if (typedArray instanceof Uint8Array) { 9340 // Shortcut 9341 var typedArrayByteLength = typedArray.byteLength; 9342 9343 // Extract bytes 9344 var words = []; 9345 for (var i = 0; i < typedArrayByteLength; i++) { 9346 words[i >>> 2] |= typedArray[i] << (24 - (i % 4) * 8); 9347 } 9348 9349 // Initialize this word array 9350 superInit.call(this, words, typedArrayByteLength); 9351 } else { 9352 // Else call normal init 9353 superInit.apply(this, arguments); 9354 } 9355 }; 9356 9357 subInit.prototype = WordArray; 9358 }()); 9359 9360 9361 return CryptoJS.lib.WordArray; 9362 9363 })); 9364 },{"./core":53}],61:[function(require,module,exports){ 9365 ;(function (root, factory) { 9366 if (typeof exports === "object") { 9367 // CommonJS 9368 module.exports = exports = factory(require("./core")); 9369 } 9370 else if (typeof define === "function" && define.amd) { 9371 // AMD 9372 define(["./core"], factory); 9373 } 9374 else { 9375 // Global (browser) 9376 factory(root.CryptoJS); 9377 } 9378 }(this, function (CryptoJS) { 9379 9380 (function (Math) { 9381 // Shortcuts 9382 var C = CryptoJS; 9383 var C_lib = C.lib; 9384 var WordArray = C_lib.WordArray; 9385 var Hasher = C_lib.Hasher; 9386 var C_algo = C.algo; 9387 9388 // Constants table 9389 var T = []; 9390 9391 // Compute constants 9392 (function () { 9393 for (var i = 0; i < 64; i++) { 9394 T[i] = (Math.abs(Math.sin(i + 1)) * 0x100000000) | 0; 9395 } 9396 }()); 9397 9398 /** 9399 * MD5 hash algorithm. 9400 */ 9401 var MD5 = C_algo.MD5 = Hasher.extend({ 9402 _doReset: function () { 9403 this._hash = new WordArray.init([ 9404 0x67452301, 0xefcdab89, 9405 0x98badcfe, 0x10325476 9406 ]); 9407 }, 9408 9409 _doProcessBlock: function (M, offset) { 9410 // Swap endian 9411 for (var i = 0; i < 16; i++) { 9412 // Shortcuts 9413 var offset_i = offset + i; 9414 var M_offset_i = M[offset_i]; 9415 9416 M[offset_i] = ( 9417 (((M_offset_i << 8) | (M_offset_i >>> 24)) & 0x00ff00ff) | 9418 (((M_offset_i << 24) | (M_offset_i >>> 8)) & 0xff00ff00) 9419 ); 9420 } 9421 9422 // Shortcuts 9423 var H = this._hash.words; 9424 9425 var M_offset_0 = M[offset + 0]; 9426 var M_offset_1 = M[offset + 1]; 9427 var M_offset_2 = M[offset + 2]; 9428 var M_offset_3 = M[offset + 3]; 9429 var M_offset_4 = M[offset + 4]; 9430 var M_offset_5 = M[offset + 5]; 9431 var M_offset_6 = M[offset + 6]; 9432 var M_offset_7 = M[offset + 7]; 9433 var M_offset_8 = M[offset + 8]; 9434 var M_offset_9 = M[offset + 9]; 9435 var M_offset_10 = M[offset + 10]; 9436 var M_offset_11 = M[offset + 11]; 9437 var M_offset_12 = M[offset + 12]; 9438 var M_offset_13 = M[offset + 13]; 9439 var M_offset_14 = M[offset + 14]; 9440 var M_offset_15 = M[offset + 15]; 9441 9442 // Working varialbes 9443 var a = H[0]; 9444 var b = H[1]; 9445 var c = H[2]; 9446 var d = H[3]; 9447 9448 // Computation 9449 a = FF(a, b, c, d, M_offset_0, 7, T[0]); 9450 d = FF(d, a, b, c, M_offset_1, 12, T[1]); 9451 c = FF(c, d, a, b, M_offset_2, 17, T[2]); 9452 b = FF(b, c, d, a, M_offset_3, 22, T[3]); 9453 a = FF(a, b, c, d, M_offset_4, 7, T[4]); 9454 d = FF(d, a, b, c, M_offset_5, 12, T[5]); 9455 c = FF(c, d, a, b, M_offset_6, 17, T[6]); 9456 b = FF(b, c, d, a, M_offset_7, 22, T[7]); 9457 a = FF(a, b, c, d, M_offset_8, 7, T[8]); 9458 d = FF(d, a, b, c, M_offset_9, 12, T[9]); 9459 c = FF(c, d, a, b, M_offset_10, 17, T[10]); 9460 b = FF(b, c, d, a, M_offset_11, 22, T[11]); 9461 a = FF(a, b, c, d, M_offset_12, 7, T[12]); 9462 d = FF(d, a, b, c, M_offset_13, 12, T[13]); 9463 c = FF(c, d, a, b, M_offset_14, 17, T[14]); 9464 b = FF(b, c, d, a, M_offset_15, 22, T[15]); 9465 9466 a = GG(a, b, c, d, M_offset_1, 5, T[16]); 9467 d = GG(d, a, b, c, M_offset_6, 9, T[17]); 9468 c = GG(c, d, a, b, M_offset_11, 14, T[18]); 9469 b = GG(b, c, d, a, M_offset_0, 20, T[19]); 9470 a = GG(a, b, c, d, M_offset_5, 5, T[20]); 9471 d = GG(d, a, b, c, M_offset_10, 9, T[21]); 9472 c = GG(c, d, a, b, M_offset_15, 14, T[22]); 9473 b = GG(b, c, d, a, M_offset_4, 20, T[23]); 9474 a = GG(a, b, c, d, M_offset_9, 5, T[24]); 9475 d = GG(d, a, b, c, M_offset_14, 9, T[25]); 9476 c = GG(c, d, a, b, M_offset_3, 14, T[26]); 9477 b = GG(b, c, d, a, M_offset_8, 20, T[27]); 9478 a = GG(a, b, c, d, M_offset_13, 5, T[28]); 9479 d = GG(d, a, b, c, M_offset_2, 9, T[29]); 9480 c = GG(c, d, a, b, M_offset_7, 14, T[30]); 9481 b = GG(b, c, d, a, M_offset_12, 20, T[31]); 9482 9483 a = HH(a, b, c, d, M_offset_5, 4, T[32]); 9484 d = HH(d, a, b, c, M_offset_8, 11, T[33]); 9485 c = HH(c, d, a, b, M_offset_11, 16, T[34]); 9486 b = HH(b, c, d, a, M_offset_14, 23, T[35]); 9487 a = HH(a, b, c, d, M_offset_1, 4, T[36]); 9488 d = HH(d, a, b, c, M_offset_4, 11, T[37]); 9489 c = HH(c, d, a, b, M_offset_7, 16, T[38]); 9490 b = HH(b, c, d, a, M_offset_10, 23, T[39]); 9491 a = HH(a, b, c, d, M_offset_13, 4, T[40]); 9492 d = HH(d, a, b, c, M_offset_0, 11, T[41]); 9493 c = HH(c, d, a, b, M_offset_3, 16, T[42]); 9494 b = HH(b, c, d, a, M_offset_6, 23, T[43]); 9495 a = HH(a, b, c, d, M_offset_9, 4, T[44]); 9496 d = HH(d, a, b, c, M_offset_12, 11, T[45]); 9497 c = HH(c, d, a, b, M_offset_15, 16, T[46]); 9498 b = HH(b, c, d, a, M_offset_2, 23, T[47]); 9499 9500 a = II(a, b, c, d, M_offset_0, 6, T[48]); 9501 d = II(d, a, b, c, M_offset_7, 10, T[49]); 9502 c = II(c, d, a, b, M_offset_14, 15, T[50]); 9503 b = II(b, c, d, a, M_offset_5, 21, T[51]); 9504 a = II(a, b, c, d, M_offset_12, 6, T[52]); 9505 d = II(d, a, b, c, M_offset_3, 10, T[53]); 9506 c = II(c, d, a, b, M_offset_10, 15, T[54]); 9507 b = II(b, c, d, a, M_offset_1, 21, T[55]); 9508 a = II(a, b, c, d, M_offset_8, 6, T[56]); 9509 d = II(d, a, b, c, M_offset_15, 10, T[57]); 9510 c = II(c, d, a, b, M_offset_6, 15, T[58]); 9511 b = II(b, c, d, a, M_offset_13, 21, T[59]); 9512 a = II(a, b, c, d, M_offset_4, 6, T[60]); 9513 d = II(d, a, b, c, M_offset_11, 10, T[61]); 9514 c = II(c, d, a, b, M_offset_2, 15, T[62]); 9515 b = II(b, c, d, a, M_offset_9, 21, T[63]); 9516 9517 // Intermediate hash value 9518 H[0] = (H[0] + a) | 0; 9519 H[1] = (H[1] + b) | 0; 9520 H[2] = (H[2] + c) | 0; 9521 H[3] = (H[3] + d) | 0; 9522 }, 9523 9524 _doFinalize: function () { 9525 // Shortcuts 9526 var data = this._data; 9527 var dataWords = data.words; 9528 9529 var nBitsTotal = this._nDataBytes * 8; 9530 var nBitsLeft = data.sigBytes * 8; 9531 9532 // Add padding 9533 dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32); 9534 9535 var nBitsTotalH = Math.floor(nBitsTotal / 0x100000000); 9536 var nBitsTotalL = nBitsTotal; 9537 dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 15] = ( 9538 (((nBitsTotalH << 8) | (nBitsTotalH >>> 24)) & 0x00ff00ff) | 9539 (((nBitsTotalH << 24) | (nBitsTotalH >>> 8)) & 0xff00ff00) 9540 ); 9541 dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = ( 9542 (((nBitsTotalL << 8) | (nBitsTotalL >>> 24)) & 0x00ff00ff) | 9543 (((nBitsTotalL << 24) | (nBitsTotalL >>> 8)) & 0xff00ff00) 9544 ); 9545 9546 data.sigBytes = (dataWords.length + 1) * 4; 9547 9548 // Hash final blocks 9549 this._process(); 9550 9551 // Shortcuts 9552 var hash = this._hash; 9553 var H = hash.words; 9554 9555 // Swap endian 9556 for (var i = 0; i < 4; i++) { 9557 // Shortcut 9558 var H_i = H[i]; 9559 9560 H[i] = (((H_i << 8) | (H_i >>> 24)) & 0x00ff00ff) | 9561 (((H_i << 24) | (H_i >>> 8)) & 0xff00ff00); 9562 } 9563 9564 // Return final computed hash 9565 return hash; 9566 }, 9567 9568 clone: function () { 9569 var clone = Hasher.clone.call(this); 9570 clone._hash = this._hash.clone(); 9571 9572 return clone; 9573 } 9574 }); 9575 9576 function FF(a, b, c, d, x, s, t) { 9577 var n = a + ((b & c) | (~b & d)) + x + t; 9578 return ((n << s) | (n >>> (32 - s))) + b; 9579 } 9580 9581 function GG(a, b, c, d, x, s, t) { 9582 var n = a + ((b & d) | (c & ~d)) + x + t; 9583 return ((n << s) | (n >>> (32 - s))) + b; 9584 } 9585 9586 function HH(a, b, c, d, x, s, t) { 9587 var n = a + (b ^ c ^ d) + x + t; 9588 return ((n << s) | (n >>> (32 - s))) + b; 9589 } 9590 9591 function II(a, b, c, d, x, s, t) { 9592 var n = a + (c ^ (b | ~d)) + x + t; 9593 return ((n << s) | (n >>> (32 - s))) + b; 9594 } 9595 9596 /** 9597 * Shortcut function to the hasher's object interface. 9598 * 9599 * @param {WordArray|string} message The message to hash. 9600 * 9601 * @return {WordArray} The hash. 9602 * 9603 * @static 9604 * 9605 * @example 9606 * 9607 * var hash = CryptoJS.MD5('message'); 9608 * var hash = CryptoJS.MD5(wordArray); 9609 */ 9610 C.MD5 = Hasher._createHelper(MD5); 9611 9612 /** 9613 * Shortcut function to the HMAC's object interface. 9614 * 9615 * @param {WordArray|string} message The message to hash. 9616 * @param {WordArray|string} key The secret key. 9617 * 9618 * @return {WordArray} The HMAC. 9619 * 9620 * @static 9621 * 9622 * @example 9623 * 9624 * var hmac = CryptoJS.HmacMD5(message, key); 9625 */ 9626 C.HmacMD5 = Hasher._createHmacHelper(MD5); 9627 }(Math)); 9628 9629 9630 return CryptoJS.MD5; 9631 9632 })); 9633 },{"./core":53}],62:[function(require,module,exports){ 9634 ;(function (root, factory, undef) { 9635 if (typeof exports === "object") { 9636 // CommonJS 9637 module.exports = exports = factory(require("./core"), require("./cipher-core")); 9638 } 9639 else if (typeof define === "function" && define.amd) { 9640 // AMD 9641 define(["./core", "./cipher-core"], factory); 9642 } 9643 else { 9644 // Global (browser) 9645 factory(root.CryptoJS); 9646 } 9647 }(this, function (CryptoJS) { 9648 9649 /** 9650 * Cipher Feedback block mode. 9651 */ 9652 CryptoJS.mode.CFB = (function () { 9653 var CFB = CryptoJS.lib.BlockCipherMode.extend(); 9654 9655 CFB.Encryptor = CFB.extend({ 9656 processBlock: function (words, offset) { 9657 // Shortcuts 9658 var cipher = this._cipher; 9659 var blockSize = cipher.blockSize; 9660 9661 generateKeystreamAndEncrypt.call(this, words, offset, blockSize, cipher); 9662 9663 // Remember this block to use with next block 9664 this._prevBlock = words.slice(offset, offset + blockSize); 9665 } 9666 }); 9667 9668 CFB.Decryptor = CFB.extend({ 9669 processBlock: function (words, offset) { 9670 // Shortcuts 9671 var cipher = this._cipher; 9672 var blockSize = cipher.blockSize; 9673 9674 // Remember this block to use with next block 9675 var thisBlock = words.slice(offset, offset + blockSize); 9676 9677 generateKeystreamAndEncrypt.call(this, words, offset, blockSize, cipher); 9678 9679 // This block becomes the previous block 9680 this._prevBlock = thisBlock; 9681 } 9682 }); 9683 9684 function generateKeystreamAndEncrypt(words, offset, blockSize, cipher) { 9685 // Shortcut 9686 var iv = this._iv; 9687 9688 // Generate keystream 9689 if (iv) { 9690 var keystream = iv.slice(0); 9691 9692 // Remove IV for subsequent blocks 9693 this._iv = undefined; 9694 } else { 9695 var keystream = this._prevBlock; 9696 } 9697 cipher.encryptBlock(keystream, 0); 9698 9699 // Encrypt 9700 for (var i = 0; i < blockSize; i++) { 9701 words[offset + i] ^= keystream[i]; 9702 } 9703 } 9704 9705 return CFB; 9706 }()); 9707 9708 9709 return CryptoJS.mode.CFB; 9710 9711 })); 9712 },{"./cipher-core":52,"./core":53}],63:[function(require,module,exports){ 9713 ;(function (root, factory, undef) { 9714 if (typeof exports === "object") { 9715 // CommonJS 9716 module.exports = exports = factory(require("./core"), require("./cipher-core")); 9717 } 9718 else if (typeof define === "function" && define.amd) { 9719 // AMD 9720 define(["./core", "./cipher-core"], factory); 9721 } 9722 else { 9723 // Global (browser) 9724 factory(root.CryptoJS); 9725 } 9726 }(this, function (CryptoJS) { 9727 9728 /** @preserve 9729 * Counter block mode compatible with Dr Brian Gladman fileenc.c 9730 * derived from CryptoJS.mode.CTR 9731 * Jan Hruby jhruby.web@gmail.com 9732 */ 9733 CryptoJS.mode.CTRGladman = (function () { 9734 var CTRGladman = CryptoJS.lib.BlockCipherMode.extend(); 9735 9736 function incWord(word) 9737 { 9738 if (((word >> 24) & 0xff) === 0xff) { //overflow 9739 var b1 = (word >> 16)&0xff; 9740 var b2 = (word >> 8)&0xff; 9741 var b3 = word & 0xff; 9742 9743 if (b1 === 0xff) // overflow b1 9744 { 9745 b1 = 0; 9746 if (b2 === 0xff) 9747 { 9748 b2 = 0; 9749 if (b3 === 0xff) 9750 { 9751 b3 = 0; 9752 } 9753 else 9754 { 9755 ++b3; 9756 } 9757 } 9758 else 9759 { 9760 ++b2; 9761 } 9762 } 9763 else 9764 { 9765 ++b1; 9766 } 9767 9768 word = 0; 9769 word += (b1 << 16); 9770 word += (b2 << 8); 9771 word += b3; 9772 } 9773 else 9774 { 9775 word += (0x01 << 24); 9776 } 9777 return word; 9778 } 9779 9780 function incCounter(counter) 9781 { 9782 if ((counter[0] = incWord(counter[0])) === 0) 9783 { 9784 // encr_data in fileenc.c from Dr Brian Gladman's counts only with DWORD j < 8 9785 counter[1] = incWord(counter[1]); 9786 } 9787 return counter; 9788 } 9789 9790 var Encryptor = CTRGladman.Encryptor = CTRGladman.extend({ 9791 processBlock: function (words, offset) { 9792 // Shortcuts 9793 var cipher = this._cipher 9794 var blockSize = cipher.blockSize; 9795 var iv = this._iv; 9796 var counter = this._counter; 9797 9798 // Generate keystream 9799 if (iv) { 9800 counter = this._counter = iv.slice(0); 9801 9802 // Remove IV for subsequent blocks 9803 this._iv = undefined; 9804 } 9805 9806 incCounter(counter); 9807 9808 var keystream = counter.slice(0); 9809 cipher.encryptBlock(keystream, 0); 9810 9811 // Encrypt 9812 for (var i = 0; i < blockSize; i++) { 9813 words[offset + i] ^= keystream[i]; 9814 } 9815 } 9816 }); 9817 9818 CTRGladman.Decryptor = Encryptor; 9819 9820 return CTRGladman; 9821 }()); 9822 9823 9824 9825 9826 return CryptoJS.mode.CTRGladman; 9827 9828 })); 9829 },{"./cipher-core":52,"./core":53}],64:[function(require,module,exports){ 9830 ;(function (root, factory, undef) { 9831 if (typeof exports === "object") { 9832 // CommonJS 9833 module.exports = exports = factory(require("./core"), require("./cipher-core")); 9834 } 9835 else if (typeof define === "function" && define.amd) { 9836 // AMD 9837 define(["./core", "./cipher-core"], factory); 9838 } 9839 else { 9840 // Global (browser) 9841 factory(root.CryptoJS); 9842 } 9843 }(this, function (CryptoJS) { 9844 9845 /** 9846 * Counter block mode. 9847 */ 9848 CryptoJS.mode.CTR = (function () { 9849 var CTR = CryptoJS.lib.BlockCipherMode.extend(); 9850 9851 var Encryptor = CTR.Encryptor = CTR.extend({ 9852 processBlock: function (words, offset) { 9853 // Shortcuts 9854 var cipher = this._cipher 9855 var blockSize = cipher.blockSize; 9856 var iv = this._iv; 9857 var counter = this._counter; 9858 9859 // Generate keystream 9860 if (iv) { 9861 counter = this._counter = iv.slice(0); 9862 9863 // Remove IV for subsequent blocks 9864 this._iv = undefined; 9865 } 9866 var keystream = counter.slice(0); 9867 cipher.encryptBlock(keystream, 0); 9868 9869 // Increment counter 9870 counter[blockSize - 1] = (counter[blockSize - 1] + 1) | 0 9871 9872 // Encrypt 9873 for (var i = 0; i < blockSize; i++) { 9874 words[offset + i] ^= keystream[i]; 9875 } 9876 } 9877 }); 9878 9879 CTR.Decryptor = Encryptor; 9880 9881 return CTR; 9882 }()); 9883 9884 9885 return CryptoJS.mode.CTR; 9886 9887 })); 9888 },{"./cipher-core":52,"./core":53}],65:[function(require,module,exports){ 9889 ;(function (root, factory, undef) { 9890 if (typeof exports === "object") { 9891 // CommonJS 9892 module.exports = exports = factory(require("./core"), require("./cipher-core")); 9893 } 9894 else if (typeof define === "function" && define.amd) { 9895 // AMD 9896 define(["./core", "./cipher-core"], factory); 9897 } 9898 else { 9899 // Global (browser) 9900 factory(root.CryptoJS); 9901 } 9902 }(this, function (CryptoJS) { 9903 9904 /** 9905 * Electronic Codebook block mode. 9906 */ 9907 CryptoJS.mode.ECB = (function () { 9908 var ECB = CryptoJS.lib.BlockCipherMode.extend(); 9909 9910 ECB.Encryptor = ECB.extend({ 9911 processBlock: function (words, offset) { 9912 this._cipher.encryptBlock(words, offset); 9913 } 9914 }); 9915 9916 ECB.Decryptor = ECB.extend({ 9917 processBlock: function (words, offset) { 9918 this._cipher.decryptBlock(words, offset); 9919 } 9920 }); 9921 9922 return ECB; 9923 }()); 9924 9925 9926 return CryptoJS.mode.ECB; 9927 9928 })); 9929 },{"./cipher-core":52,"./core":53}],66:[function(require,module,exports){ 9930 ;(function (root, factory, undef) { 9931 if (typeof exports === "object") { 9932 // CommonJS 9933 module.exports = exports = factory(require("./core"), require("./cipher-core")); 9934 } 9935 else if (typeof define === "function" && define.amd) { 9936 // AMD 9937 define(["./core", "./cipher-core"], factory); 9938 } 9939 else { 9940 // Global (browser) 9941 factory(root.CryptoJS); 9942 } 9943 }(this, function (CryptoJS) { 9944 9945 /** 9946 * Output Feedback block mode. 9947 */ 9948 CryptoJS.mode.OFB = (function () { 9949 var OFB = CryptoJS.lib.BlockCipherMode.extend(); 9950 9951 var Encryptor = OFB.Encryptor = OFB.extend({ 9952 processBlock: function (words, offset) { 9953 // Shortcuts 9954 var cipher = this._cipher 9955 var blockSize = cipher.blockSize; 9956 var iv = this._iv; 9957 var keystream = this._keystream; 9958 9959 // Generate keystream 9960 if (iv) { 9961 keystream = this._keystream = iv.slice(0); 9962 9963 // Remove IV for subsequent blocks 9964 this._iv = undefined; 9965 } 9966 cipher.encryptBlock(keystream, 0); 9967 9968 // Encrypt 9969 for (var i = 0; i < blockSize; i++) { 9970 words[offset + i] ^= keystream[i]; 9971 } 9972 } 9973 }); 9974 9975 OFB.Decryptor = Encryptor; 9976 9977 return OFB; 9978 }()); 9979 9980 9981 return CryptoJS.mode.OFB; 9982 9983 })); 9984 },{"./cipher-core":52,"./core":53}],67:[function(require,module,exports){ 9985 ;(function (root, factory, undef) { 9986 if (typeof exports === "object") { 9987 // CommonJS 9988 module.exports = exports = factory(require("./core"), require("./cipher-core")); 9989 } 9990 else if (typeof define === "function" && define.amd) { 9991 // AMD 9992 define(["./core", "./cipher-core"], factory); 9993 } 9994 else { 9995 // Global (browser) 9996 factory(root.CryptoJS); 9997 } 9998 }(this, function (CryptoJS) { 9999 10000 /** 10001 * ANSI X.923 padding strategy. 10002 */ 10003 CryptoJS.pad.AnsiX923 = { 10004 pad: function (data, blockSize) { 10005 // Shortcuts 10006 var dataSigBytes = data.sigBytes; 10007 var blockSizeBytes = blockSize * 4; 10008 10009 // Count padding bytes 10010 var nPaddingBytes = blockSizeBytes - dataSigBytes % blockSizeBytes; 10011 10012 // Compute last byte position 10013 var lastBytePos = dataSigBytes + nPaddingBytes - 1; 10014 10015 // Pad 10016 data.clamp(); 10017 data.words[lastBytePos >>> 2] |= nPaddingBytes << (24 - (lastBytePos % 4) * 8); 10018 data.sigBytes += nPaddingBytes; 10019 }, 10020 10021 unpad: function (data) { 10022 // Get number of padding bytes from last byte 10023 var nPaddingBytes = data.words[(data.sigBytes - 1) >>> 2] & 0xff; 10024 10025 // Remove padding 10026 data.sigBytes -= nPaddingBytes; 10027 } 10028 }; 10029 10030 10031 return CryptoJS.pad.Ansix923; 10032 10033 })); 10034 },{"./cipher-core":52,"./core":53}],68:[function(require,module,exports){ 10035 ;(function (root, factory, undef) { 10036 if (typeof exports === "object") { 10037 // CommonJS 10038 module.exports = exports = factory(require("./core"), require("./cipher-core")); 10039 } 10040 else if (typeof define === "function" && define.amd) { 10041 // AMD 10042 define(["./core", "./cipher-core"], factory); 10043 } 10044 else { 10045 // Global (browser) 10046 factory(root.CryptoJS); 10047 } 10048 }(this, function (CryptoJS) { 10049 10050 /** 10051 * ISO 10126 padding strategy. 10052 */ 10053 CryptoJS.pad.Iso10126 = { 10054 pad: function (data, blockSize) { 10055 // Shortcut 10056 var blockSizeBytes = blockSize * 4; 10057 10058 // Count padding bytes 10059 var nPaddingBytes = blockSizeBytes - data.sigBytes % blockSizeBytes; 10060 10061 // Pad 10062 data.concat(CryptoJS.lib.WordArray.random(nPaddingBytes - 1)). 10063 concat(CryptoJS.lib.WordArray.create([nPaddingBytes << 24], 1)); 10064 }, 10065 10066 unpad: function (data) { 10067 // Get number of padding bytes from last byte 10068 var nPaddingBytes = data.words[(data.sigBytes - 1) >>> 2] & 0xff; 10069 10070 // Remove padding 10071 data.sigBytes -= nPaddingBytes; 10072 } 10073 }; 10074 10075 10076 return CryptoJS.pad.Iso10126; 10077 10078 })); 10079 },{"./cipher-core":52,"./core":53}],69:[function(require,module,exports){ 10080 ;(function (root, factory, undef) { 10081 if (typeof exports === "object") { 10082 // CommonJS 10083 module.exports = exports = factory(require("./core"), require("./cipher-core")); 10084 } 10085 else if (typeof define === "function" && define.amd) { 10086 // AMD 10087 define(["./core", "./cipher-core"], factory); 10088 } 10089 else { 10090 // Global (browser) 10091 factory(root.CryptoJS); 10092 } 10093 }(this, function (CryptoJS) { 10094 10095 /** 10096 * ISO/IEC 9797-1 Padding Method 2. 10097 */ 10098 CryptoJS.pad.Iso97971 = { 10099 pad: function (data, blockSize) { 10100 // Add 0x80 byte 10101 data.concat(CryptoJS.lib.WordArray.create([0x80000000], 1)); 10102 10103 // Zero pad the rest 10104 CryptoJS.pad.ZeroPadding.pad(data, blockSize); 10105 }, 10106 10107 unpad: function (data) { 10108 // Remove zero padding 10109 CryptoJS.pad.ZeroPadding.unpad(data); 10110 10111 // Remove one more byte -- the 0x80 byte 10112 data.sigBytes--; 10113 } 10114 }; 10115 10116 10117 return CryptoJS.pad.Iso97971; 10118 10119 })); 10120 },{"./cipher-core":52,"./core":53}],70:[function(require,module,exports){ 10121 ;(function (root, factory, undef) { 10122 if (typeof exports === "object") { 10123 // CommonJS 10124 module.exports = exports = factory(require("./core"), require("./cipher-core")); 10125 } 10126 else if (typeof define === "function" && define.amd) { 10127 // AMD 10128 define(["./core", "./cipher-core"], factory); 10129 } 10130 else { 10131 // Global (browser) 10132 factory(root.CryptoJS); 10133 } 10134 }(this, function (CryptoJS) { 10135 10136 /** 10137 * A noop padding strategy. 10138 */ 10139 CryptoJS.pad.NoPadding = { 10140 pad: function () { 10141 }, 10142 10143 unpad: function () { 10144 } 10145 }; 10146 10147 10148 return CryptoJS.pad.NoPadding; 10149 10150 })); 10151 },{"./cipher-core":52,"./core":53}],71:[function(require,module,exports){ 10152 ;(function (root, factory, undef) { 10153 if (typeof exports === "object") { 10154 // CommonJS 10155 module.exports = exports = factory(require("./core"), require("./cipher-core")); 10156 } 10157 else if (typeof define === "function" && define.amd) { 10158 // AMD 10159 define(["./core", "./cipher-core"], factory); 10160 } 10161 else { 10162 // Global (browser) 10163 factory(root.CryptoJS); 10164 } 10165 }(this, function (CryptoJS) { 10166 10167 /** 10168 * Zero padding strategy. 10169 */ 10170 CryptoJS.pad.ZeroPadding = { 10171 pad: function (data, blockSize) { 10172 // Shortcut 10173 var blockSizeBytes = blockSize * 4; 10174 10175 // Pad 10176 data.clamp(); 10177 data.sigBytes += blockSizeBytes - ((data.sigBytes % blockSizeBytes) || blockSizeBytes); 10178 }, 10179 10180 unpad: function (data) { 10181 // Shortcut 10182 var dataWords = data.words; 10183 10184 // Unpad 10185 var i = data.sigBytes - 1; 10186 while (!((dataWords[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff)) { 10187 i--; 10188 } 10189 data.sigBytes = i + 1; 10190 } 10191 }; 10192 10193 10194 return CryptoJS.pad.ZeroPadding; 10195 10196 })); 10197 },{"./cipher-core":52,"./core":53}],72:[function(require,module,exports){ 10198 ;(function (root, factory, undef) { 10199 if (typeof exports === "object") { 10200 // CommonJS 10201 module.exports = exports = factory(require("./core"), require("./sha1"), require("./hmac")); 10202 } 10203 else if (typeof define === "function" && define.amd) { 10204 // AMD 10205 define(["./core", "./sha1", "./hmac"], factory); 10206 } 10207 else { 10208 // Global (browser) 10209 factory(root.CryptoJS); 10210 } 10211 }(this, function (CryptoJS) { 10212 10213 (function () { 10214 // Shortcuts 10215 var C = CryptoJS; 10216 var C_lib = C.lib; 10217 var Base = C_lib.Base; 10218 var WordArray = C_lib.WordArray; 10219 var C_algo = C.algo; 10220 var SHA1 = C_algo.SHA1; 10221 var HMAC = C_algo.HMAC; 10222 10223 /** 10224 * Password-Based Key Derivation Function 2 algorithm. 10225 */ 10226 var PBKDF2 = C_algo.PBKDF2 = Base.extend({ 10227 /** 10228 * Configuration options. 10229 * 10230 * @property {number} keySize The key size in words to generate. Default: 4 (128 bits) 10231 * @property {Hasher} hasher The hasher to use. Default: SHA1 10232 * @property {number} iterations The number of iterations to perform. Default: 1 10233 */ 10234 cfg: Base.extend({ 10235 keySize: 128/32, 10236 hasher: SHA1, 10237 iterations: 1 10238 }), 10239 10240 /** 10241 * Initializes a newly created key derivation function. 10242 * 10243 * @param {Object} cfg (Optional) The configuration options to use for the derivation. 10244 * 10245 * @example 10246 * 10247 * var kdf = CryptoJS.algo.PBKDF2.create(); 10248 * var kdf = CryptoJS.algo.PBKDF2.create({ keySize: 8 }); 10249 * var kdf = CryptoJS.algo.PBKDF2.create({ keySize: 8, iterations: 1000 }); 10250 */ 10251 init: function (cfg) { 10252 this.cfg = this.cfg.extend(cfg); 10253 }, 10254 10255 /** 10256 * Computes the Password-Based Key Derivation Function 2. 10257 * 10258 * @param {WordArray|string} password The password. 10259 * @param {WordArray|string} salt A salt. 10260 * 10261 * @return {WordArray} The derived key. 10262 * 10263 * @example 10264 * 10265 * var key = kdf.compute(password, salt); 10266 */ 10267 compute: function (password, salt) { 10268 // Shortcut 10269 var cfg = this.cfg; 10270 10271 // Init HMAC 10272 var hmac = HMAC.create(cfg.hasher, password); 10273 10274 // Initial values 10275 var derivedKey = WordArray.create(); 10276 var blockIndex = WordArray.create([0x00000001]); 10277 10278 // Shortcuts 10279 var derivedKeyWords = derivedKey.words; 10280 var blockIndexWords = blockIndex.words; 10281 var keySize = cfg.keySize; 10282 var iterations = cfg.iterations; 10283 10284 // Generate key 10285 while (derivedKeyWords.length < keySize) { 10286 var block = hmac.update(salt).finalize(blockIndex); 10287 hmac.reset(); 10288 10289 // Shortcuts 10290 var blockWords = block.words; 10291 var blockWordsLength = blockWords.length; 10292 10293 // Iterations 10294 var intermediate = block; 10295 for (var i = 1; i < iterations; i++) { 10296 intermediate = hmac.finalize(intermediate); 10297 hmac.reset(); 10298 10299 // Shortcut 10300 var intermediateWords = intermediate.words; 10301 10302 // XOR intermediate with block 10303 for (var j = 0; j < blockWordsLength; j++) { 10304 blockWords[j] ^= intermediateWords[j]; 10305 } 10306 } 10307 10308 derivedKey.concat(block); 10309 blockIndexWords[0]++; 10310 } 10311 derivedKey.sigBytes = keySize * 4; 10312 10313 return derivedKey; 10314 } 10315 }); 10316 10317 /** 10318 * Computes the Password-Based Key Derivation Function 2. 10319 * 10320 * @param {WordArray|string} password The password. 10321 * @param {WordArray|string} salt A salt. 10322 * @param {Object} cfg (Optional) The configuration options to use for this computation. 10323 * 10324 * @return {WordArray} The derived key. 10325 * 10326 * @static 10327 * 10328 * @example 10329 * 10330 * var key = CryptoJS.PBKDF2(password, salt); 10331 * var key = CryptoJS.PBKDF2(password, salt, { keySize: 8 }); 10332 * var key = CryptoJS.PBKDF2(password, salt, { keySize: 8, iterations: 1000 }); 10333 */ 10334 C.PBKDF2 = function (password, salt, cfg) { 10335 return PBKDF2.create(cfg).compute(password, salt); 10336 }; 10337 }()); 10338 10339 10340 return CryptoJS.PBKDF2; 10341 10342 })); 10343 },{"./core":53,"./hmac":58,"./sha1":77}],73:[function(require,module,exports){ 10344 ;(function (root, factory, undef) { 10345 if (typeof exports === "object") { 10346 // CommonJS 10347 module.exports = exports = factory(require("./core"), require("./enc-base64"), require("./md5"), require("./evpkdf"), require("./cipher-core")); 10348 } 10349 else if (typeof define === "function" && define.amd) { 10350 // AMD 10351 define(["./core", "./enc-base64", "./md5", "./evpkdf", "./cipher-core"], factory); 10352 } 10353 else { 10354 // Global (browser) 10355 factory(root.CryptoJS); 10356 } 10357 }(this, function (CryptoJS) { 10358 10359 (function () { 10360 // Shortcuts 10361 var C = CryptoJS; 10362 var C_lib = C.lib; 10363 var StreamCipher = C_lib.StreamCipher; 10364 var C_algo = C.algo; 10365 10366 // Reusable objects 10367 var S = []; 10368 var C_ = []; 10369 var G = []; 10370 10371 /** 10372 * Rabbit stream cipher algorithm. 10373 * 10374 * This is a legacy version that neglected to convert the key to little-endian. 10375 * This error doesn't affect the cipher's security, 10376 * but it does affect its compatibility with other implementations. 10377 */ 10378 var RabbitLegacy = C_algo.RabbitLegacy = StreamCipher.extend({ 10379 _doReset: function () { 10380 // Shortcuts 10381 var K = this._key.words; 10382 var iv = this.cfg.iv; 10383 10384 // Generate initial state values 10385 var X = this._X = [ 10386 K[0], (K[3] << 16) | (K[2] >>> 16), 10387 K[1], (K[0] << 16) | (K[3] >>> 16), 10388 K[2], (K[1] << 16) | (K[0] >>> 16), 10389 K[3], (K[2] << 16) | (K[1] >>> 16) 10390 ]; 10391 10392 // Generate initial counter values 10393 var C = this._C = [ 10394 (K[2] << 16) | (K[2] >>> 16), (K[0] & 0xffff0000) | (K[1] & 0x0000ffff), 10395 (K[3] << 16) | (K[3] >>> 16), (K[1] & 0xffff0000) | (K[2] & 0x0000ffff), 10396 (K[0] << 16) | (K[0] >>> 16), (K[2] & 0xffff0000) | (K[3] & 0x0000ffff), 10397 (K[1] << 16) | (K[1] >>> 16), (K[3] & 0xffff0000) | (K[0] & 0x0000ffff) 10398 ]; 10399 10400 // Carry bit 10401 this._b = 0; 10402 10403 // Iterate the system four times 10404 for (var i = 0; i < 4; i++) { 10405 nextState.call(this); 10406 } 10407 10408 // Modify the counters 10409 for (var i = 0; i < 8; i++) { 10410 C[i] ^= X[(i + 4) & 7]; 10411 } 10412 10413 // IV setup 10414 if (iv) { 10415 // Shortcuts 10416 var IV = iv.words; 10417 var IV_0 = IV[0]; 10418 var IV_1 = IV[1]; 10419 10420 // Generate four subvectors 10421 var i0 = (((IV_0 << 8) | (IV_0 >>> 24)) & 0x00ff00ff) | (((IV_0 << 24) | (IV_0 >>> 8)) & 0xff00ff00); 10422 var i2 = (((IV_1 << 8) | (IV_1 >>> 24)) & 0x00ff00ff) | (((IV_1 << 24) | (IV_1 >>> 8)) & 0xff00ff00); 10423 var i1 = (i0 >>> 16) | (i2 & 0xffff0000); 10424 var i3 = (i2 << 16) | (i0 & 0x0000ffff); 10425 10426 // Modify counter values 10427 C[0] ^= i0; 10428 C[1] ^= i1; 10429 C[2] ^= i2; 10430 C[3] ^= i3; 10431 C[4] ^= i0; 10432 C[5] ^= i1; 10433 C[6] ^= i2; 10434 C[7] ^= i3; 10435 10436 // Iterate the system four times 10437 for (var i = 0; i < 4; i++) { 10438 nextState.call(this); 10439 } 10440 } 10441 }, 10442 10443 _doProcessBlock: function (M, offset) { 10444 // Shortcut 10445 var X = this._X; 10446 10447 // Iterate the system 10448 nextState.call(this); 10449 10450 // Generate four keystream words 10451 S[0] = X[0] ^ (X[5] >>> 16) ^ (X[3] << 16); 10452 S[1] = X[2] ^ (X[7] >>> 16) ^ (X[5] << 16); 10453 S[2] = X[4] ^ (X[1] >>> 16) ^ (X[7] << 16); 10454 S[3] = X[6] ^ (X[3] >>> 16) ^ (X[1] << 16); 10455 10456 for (var i = 0; i < 4; i++) { 10457 // Swap endian 10458 S[i] = (((S[i] << 8) | (S[i] >>> 24)) & 0x00ff00ff) | 10459 (((S[i] << 24) | (S[i] >>> 8)) & 0xff00ff00); 10460 10461 // Encrypt 10462 M[offset + i] ^= S[i]; 10463 } 10464 }, 10465 10466 blockSize: 128/32, 10467 10468 ivSize: 64/32 10469 }); 10470 10471 function nextState() { 10472 // Shortcuts 10473 var X = this._X; 10474 var C = this._C; 10475 10476 // Save old counter values 10477 for (var i = 0; i < 8; i++) { 10478 C_[i] = C[i]; 10479 } 10480 10481 // Calculate new counter values 10482 C[0] = (C[0] + 0x4d34d34d + this._b) | 0; 10483 C[1] = (C[1] + 0xd34d34d3 + ((C[0] >>> 0) < (C_[0] >>> 0) ? 1 : 0)) | 0; 10484 C[2] = (C[2] + 0x34d34d34 + ((C[1] >>> 0) < (C_[1] >>> 0) ? 1 : 0)) | 0; 10485 C[3] = (C[3] + 0x4d34d34d + ((C[2] >>> 0) < (C_[2] >>> 0) ? 1 : 0)) | 0; 10486 C[4] = (C[4] + 0xd34d34d3 + ((C[3] >>> 0) < (C_[3] >>> 0) ? 1 : 0)) | 0; 10487 C[5] = (C[5] + 0x34d34d34 + ((C[4] >>> 0) < (C_[4] >>> 0) ? 1 : 0)) | 0; 10488 C[6] = (C[6] + 0x4d34d34d + ((C[5] >>> 0) < (C_[5] >>> 0) ? 1 : 0)) | 0; 10489 C[7] = (C[7] + 0xd34d34d3 + ((C[6] >>> 0) < (C_[6] >>> 0) ? 1 : 0)) | 0; 10490 this._b = (C[7] >>> 0) < (C_[7] >>> 0) ? 1 : 0; 10491 10492 // Calculate the g-values 10493 for (var i = 0; i < 8; i++) { 10494 var gx = X[i] + C[i]; 10495 10496 // Construct high and low argument for squaring 10497 var ga = gx & 0xffff; 10498 var gb = gx >>> 16; 10499 10500 // Calculate high and low result of squaring 10501 var gh = ((((ga * ga) >>> 17) + ga * gb) >>> 15) + gb * gb; 10502 var gl = (((gx & 0xffff0000) * gx) | 0) + (((gx & 0x0000ffff) * gx) | 0); 10503 10504 // High XOR low 10505 G[i] = gh ^ gl; 10506 } 10507 10508 // Calculate new state values 10509 X[0] = (G[0] + ((G[7] << 16) | (G[7] >>> 16)) + ((G[6] << 16) | (G[6] >>> 16))) | 0; 10510 X[1] = (G[1] + ((G[0] << 8) | (G[0] >>> 24)) + G[7]) | 0; 10511 X[2] = (G[2] + ((G[1] << 16) | (G[1] >>> 16)) + ((G[0] << 16) | (G[0] >>> 16))) | 0; 10512 X[3] = (G[3] + ((G[2] << 8) | (G[2] >>> 24)) + G[1]) | 0; 10513 X[4] = (G[4] + ((G[3] << 16) | (G[3] >>> 16)) + ((G[2] << 16) | (G[2] >>> 16))) | 0; 10514 X[5] = (G[5] + ((G[4] << 8) | (G[4] >>> 24)) + G[3]) | 0; 10515 X[6] = (G[6] + ((G[5] << 16) | (G[5] >>> 16)) + ((G[4] << 16) | (G[4] >>> 16))) | 0; 10516 X[7] = (G[7] + ((G[6] << 8) | (G[6] >>> 24)) + G[5]) | 0; 10517 } 10518 10519 /** 10520 * Shortcut functions to the cipher's object interface. 10521 * 10522 * @example 10523 * 10524 * var ciphertext = CryptoJS.RabbitLegacy.encrypt(message, key, cfg); 10525 * var plaintext = CryptoJS.RabbitLegacy.decrypt(ciphertext, key, cfg); 10526 */ 10527 C.RabbitLegacy = StreamCipher._createHelper(RabbitLegacy); 10528 }()); 10529 10530 10531 return CryptoJS.RabbitLegacy; 10532 10533 })); 10534 },{"./cipher-core":52,"./core":53,"./enc-base64":54,"./evpkdf":56,"./md5":61}],74:[function(require,module,exports){ 10535 ;(function (root, factory, undef) { 10536 if (typeof exports === "object") { 10537 // CommonJS 10538 module.exports = exports = factory(require("./core"), require("./enc-base64"), require("./md5"), require("./evpkdf"), require("./cipher-core")); 10539 } 10540 else if (typeof define === "function" && define.amd) { 10541 // AMD 10542 define(["./core", "./enc-base64", "./md5", "./evpkdf", "./cipher-core"], factory); 10543 } 10544 else { 10545 // Global (browser) 10546 factory(root.CryptoJS); 10547 } 10548 }(this, function (CryptoJS) { 10549 10550 (function () { 10551 // Shortcuts 10552 var C = CryptoJS; 10553 var C_lib = C.lib; 10554 var StreamCipher = C_lib.StreamCipher; 10555 var C_algo = C.algo; 10556 10557 // Reusable objects 10558 var S = []; 10559 var C_ = []; 10560 var G = []; 10561 10562 /** 10563 * Rabbit stream cipher algorithm 10564 */ 10565 var Rabbit = C_algo.Rabbit = StreamCipher.extend({ 10566 _doReset: function () { 10567 // Shortcuts 10568 var K = this._key.words; 10569 var iv = this.cfg.iv; 10570 10571 // Swap endian 10572 for (var i = 0; i < 4; i++) { 10573 K[i] = (((K[i] << 8) | (K[i] >>> 24)) & 0x00ff00ff) | 10574 (((K[i] << 24) | (K[i] >>> 8)) & 0xff00ff00); 10575 } 10576 10577 // Generate initial state values 10578 var X = this._X = [ 10579 K[0], (K[3] << 16) | (K[2] >>> 16), 10580 K[1], (K[0] << 16) | (K[3] >>> 16), 10581 K[2], (K[1] << 16) | (K[0] >>> 16), 10582 K[3], (K[2] << 16) | (K[1] >>> 16) 10583 ]; 10584 10585 // Generate initial counter values 10586 var C = this._C = [ 10587 (K[2] << 16) | (K[2] >>> 16), (K[0] & 0xffff0000) | (K[1] & 0x0000ffff), 10588 (K[3] << 16) | (K[3] >>> 16), (K[1] & 0xffff0000) | (K[2] & 0x0000ffff), 10589 (K[0] << 16) | (K[0] >>> 16), (K[2] & 0xffff0000) | (K[3] & 0x0000ffff), 10590 (K[1] << 16) | (K[1] >>> 16), (K[3] & 0xffff0000) | (K[0] & 0x0000ffff) 10591 ]; 10592 10593 // Carry bit 10594 this._b = 0; 10595 10596 // Iterate the system four times 10597 for (var i = 0; i < 4; i++) { 10598 nextState.call(this); 10599 } 10600 10601 // Modify the counters 10602 for (var i = 0; i < 8; i++) { 10603 C[i] ^= X[(i + 4) & 7]; 10604 } 10605 10606 // IV setup 10607 if (iv) { 10608 // Shortcuts 10609 var IV = iv.words; 10610 var IV_0 = IV[0]; 10611 var IV_1 = IV[1]; 10612 10613 // Generate four subvectors 10614 var i0 = (((IV_0 << 8) | (IV_0 >>> 24)) & 0x00ff00ff) | (((IV_0 << 24) | (IV_0 >>> 8)) & 0xff00ff00); 10615 var i2 = (((IV_1 << 8) | (IV_1 >>> 24)) & 0x00ff00ff) | (((IV_1 << 24) | (IV_1 >>> 8)) & 0xff00ff00); 10616 var i1 = (i0 >>> 16) | (i2 & 0xffff0000); 10617 var i3 = (i2 << 16) | (i0 & 0x0000ffff); 10618 10619 // Modify counter values 10620 C[0] ^= i0; 10621 C[1] ^= i1; 10622 C[2] ^= i2; 10623 C[3] ^= i3; 10624 C[4] ^= i0; 10625 C[5] ^= i1; 10626 C[6] ^= i2; 10627 C[7] ^= i3; 10628 10629 // Iterate the system four times 10630 for (var i = 0; i < 4; i++) { 10631 nextState.call(this); 10632 } 10633 } 10634 }, 10635 10636 _doProcessBlock: function (M, offset) { 10637 // Shortcut 10638 var X = this._X; 10639 10640 // Iterate the system 10641 nextState.call(this); 10642 10643 // Generate four keystream words 10644 S[0] = X[0] ^ (X[5] >>> 16) ^ (X[3] << 16); 10645 S[1] = X[2] ^ (X[7] >>> 16) ^ (X[5] << 16); 10646 S[2] = X[4] ^ (X[1] >>> 16) ^ (X[7] << 16); 10647 S[3] = X[6] ^ (X[3] >>> 16) ^ (X[1] << 16); 10648 10649 for (var i = 0; i < 4; i++) { 10650 // Swap endian 10651 S[i] = (((S[i] << 8) | (S[i] >>> 24)) & 0x00ff00ff) | 10652 (((S[i] << 24) | (S[i] >>> 8)) & 0xff00ff00); 10653 10654 // Encrypt 10655 M[offset + i] ^= S[i]; 10656 } 10657 }, 10658 10659 blockSize: 128/32, 10660 10661 ivSize: 64/32 10662 }); 10663 10664 function nextState() { 10665 // Shortcuts 10666 var X = this._X; 10667 var C = this._C; 10668 10669 // Save old counter values 10670 for (var i = 0; i < 8; i++) { 10671 C_[i] = C[i]; 10672 } 10673 10674 // Calculate new counter values 10675 C[0] = (C[0] + 0x4d34d34d + this._b) | 0; 10676 C[1] = (C[1] + 0xd34d34d3 + ((C[0] >>> 0) < (C_[0] >>> 0) ? 1 : 0)) | 0; 10677 C[2] = (C[2] + 0x34d34d34 + ((C[1] >>> 0) < (C_[1] >>> 0) ? 1 : 0)) | 0; 10678 C[3] = (C[3] + 0x4d34d34d + ((C[2] >>> 0) < (C_[2] >>> 0) ? 1 : 0)) | 0; 10679 C[4] = (C[4] + 0xd34d34d3 + ((C[3] >>> 0) < (C_[3] >>> 0) ? 1 : 0)) | 0; 10680 C[5] = (C[5] + 0x34d34d34 + ((C[4] >>> 0) < (C_[4] >>> 0) ? 1 : 0)) | 0; 10681 C[6] = (C[6] + 0x4d34d34d + ((C[5] >>> 0) < (C_[5] >>> 0) ? 1 : 0)) | 0; 10682 C[7] = (C[7] + 0xd34d34d3 + ((C[6] >>> 0) < (C_[6] >>> 0) ? 1 : 0)) | 0; 10683 this._b = (C[7] >>> 0) < (C_[7] >>> 0) ? 1 : 0; 10684 10685 // Calculate the g-values 10686 for (var i = 0; i < 8; i++) { 10687 var gx = X[i] + C[i]; 10688 10689 // Construct high and low argument for squaring 10690 var ga = gx & 0xffff; 10691 var gb = gx >>> 16; 10692 10693 // Calculate high and low result of squaring 10694 var gh = ((((ga * ga) >>> 17) + ga * gb) >>> 15) + gb * gb; 10695 var gl = (((gx & 0xffff0000) * gx) | 0) + (((gx & 0x0000ffff) * gx) | 0); 10696 10697 // High XOR low 10698 G[i] = gh ^ gl; 10699 } 10700 10701 // Calculate new state values 10702 X[0] = (G[0] + ((G[7] << 16) | (G[7] >>> 16)) + ((G[6] << 16) | (G[6] >>> 16))) | 0; 10703 X[1] = (G[1] + ((G[0] << 8) | (G[0] >>> 24)) + G[7]) | 0; 10704 X[2] = (G[2] + ((G[1] << 16) | (G[1] >>> 16)) + ((G[0] << 16) | (G[0] >>> 16))) | 0; 10705 X[3] = (G[3] + ((G[2] << 8) | (G[2] >>> 24)) + G[1]) | 0; 10706 X[4] = (G[4] + ((G[3] << 16) | (G[3] >>> 16)) + ((G[2] << 16) | (G[2] >>> 16))) | 0; 10707 X[5] = (G[5] + ((G[4] << 8) | (G[4] >>> 24)) + G[3]) | 0; 10708 X[6] = (G[6] + ((G[5] << 16) | (G[5] >>> 16)) + ((G[4] << 16) | (G[4] >>> 16))) | 0; 10709 X[7] = (G[7] + ((G[6] << 8) | (G[6] >>> 24)) + G[5]) | 0; 10710 } 10711 10712 /** 10713 * Shortcut functions to the cipher's object interface. 10714 * 10715 * @example 10716 * 10717 * var ciphertext = CryptoJS.Rabbit.encrypt(message, key, cfg); 10718 * var plaintext = CryptoJS.Rabbit.decrypt(ciphertext, key, cfg); 10719 */ 10720 C.Rabbit = StreamCipher._createHelper(Rabbit); 10721 }()); 10722 10723 10724 return CryptoJS.Rabbit; 10725 10726 })); 10727 },{"./cipher-core":52,"./core":53,"./enc-base64":54,"./evpkdf":56,"./md5":61}],75:[function(require,module,exports){ 10728 ;(function (root, factory, undef) { 10729 if (typeof exports === "object") { 10730 // CommonJS 10731 module.exports = exports = factory(require("./core"), require("./enc-base64"), require("./md5"), require("./evpkdf"), require("./cipher-core")); 10732 } 10733 else if (typeof define === "function" && define.amd) { 10734 // AMD 10735 define(["./core", "./enc-base64", "./md5", "./evpkdf", "./cipher-core"], factory); 10736 } 10737 else { 10738 // Global (browser) 10739 factory(root.CryptoJS); 10740 } 10741 }(this, function (CryptoJS) { 10742 10743 (function () { 10744 // Shortcuts 10745 var C = CryptoJS; 10746 var C_lib = C.lib; 10747 var StreamCipher = C_lib.StreamCipher; 10748 var C_algo = C.algo; 10749 10750 /** 10751 * RC4 stream cipher algorithm. 10752 */ 10753 var RC4 = C_algo.RC4 = StreamCipher.extend({ 10754 _doReset: function () { 10755 // Shortcuts 10756 var key = this._key; 10757 var keyWords = key.words; 10758 var keySigBytes = key.sigBytes; 10759 10760 // Init sbox 10761 var S = this._S = []; 10762 for (var i = 0; i < 256; i++) { 10763 S[i] = i; 10764 } 10765 10766 // Key setup 10767 for (var i = 0, j = 0; i < 256; i++) { 10768 var keyByteIndex = i % keySigBytes; 10769 var keyByte = (keyWords[keyByteIndex >>> 2] >>> (24 - (keyByteIndex % 4) * 8)) & 0xff; 10770 10771 j = (j + S[i] + keyByte) % 256; 10772 10773 // Swap 10774 var t = S[i]; 10775 S[i] = S[j]; 10776 S[j] = t; 10777 } 10778 10779 // Counters 10780 this._i = this._j = 0; 10781 }, 10782 10783 _doProcessBlock: function (M, offset) { 10784 M[offset] ^= generateKeystreamWord.call(this); 10785 }, 10786 10787 keySize: 256/32, 10788 10789 ivSize: 0 10790 }); 10791 10792 function generateKeystreamWord() { 10793 // Shortcuts 10794 var S = this._S; 10795 var i = this._i; 10796 var j = this._j; 10797 10798 // Generate keystream word 10799 var keystreamWord = 0; 10800 for (var n = 0; n < 4; n++) { 10801 i = (i + 1) % 256; 10802 j = (j + S[i]) % 256; 10803 10804 // Swap 10805 var t = S[i]; 10806 S[i] = S[j]; 10807 S[j] = t; 10808 10809 keystreamWord |= S[(S[i] + S[j]) % 256] << (24 - n * 8); 10810 } 10811 10812 // Update counters 10813 this._i = i; 10814 this._j = j; 10815 10816 return keystreamWord; 10817 } 10818 10819 /** 10820 * Shortcut functions to the cipher's object interface. 10821 * 10822 * @example 10823 * 10824 * var ciphertext = CryptoJS.RC4.encrypt(message, key, cfg); 10825 * var plaintext = CryptoJS.RC4.decrypt(ciphertext, key, cfg); 10826 */ 10827 C.RC4 = StreamCipher._createHelper(RC4); 10828 10829 /** 10830 * Modified RC4 stream cipher algorithm. 10831 */ 10832 var RC4Drop = C_algo.RC4Drop = RC4.extend({ 10833 /** 10834 * Configuration options. 10835 * 10836 * @property {number} drop The number of keystream words to drop. Default 192 10837 */ 10838 cfg: RC4.cfg.extend({ 10839 drop: 192 10840 }), 10841 10842 _doReset: function () { 10843 RC4._doReset.call(this); 10844 10845 // Drop 10846 for (var i = this.cfg.drop; i > 0; i--) { 10847 generateKeystreamWord.call(this); 10848 } 10849 } 10850 }); 10851 10852 /** 10853 * Shortcut functions to the cipher's object interface. 10854 * 10855 * @example 10856 * 10857 * var ciphertext = CryptoJS.RC4Drop.encrypt(message, key, cfg); 10858 * var plaintext = CryptoJS.RC4Drop.decrypt(ciphertext, key, cfg); 10859 */ 10860 C.RC4Drop = StreamCipher._createHelper(RC4Drop); 10861 }()); 10862 10863 10864 return CryptoJS.RC4; 10865 10866 })); 10867 },{"./cipher-core":52,"./core":53,"./enc-base64":54,"./evpkdf":56,"./md5":61}],76:[function(require,module,exports){ 10868 ;(function (root, factory) { 10869 if (typeof exports === "object") { 10870 // CommonJS 10871 module.exports = exports = factory(require("./core")); 10872 } 10873 else if (typeof define === "function" && define.amd) { 10874 // AMD 10875 define(["./core"], factory); 10876 } 10877 else { 10878 // Global (browser) 10879 factory(root.CryptoJS); 10880 } 10881 }(this, function (CryptoJS) { 10882 10883 /** @preserve 10884 (c) 2012 by Cédric Mesnil. All rights reserved. 10885 10886 Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 10887 10888 - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 10889 - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 10890 10891 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 10892 */ 10893 10894 (function (Math) { 10895 // Shortcuts 10896 var C = CryptoJS; 10897 var C_lib = C.lib; 10898 var WordArray = C_lib.WordArray; 10899 var Hasher = C_lib.Hasher; 10900 var C_algo = C.algo; 10901 10902 // Constants table 10903 var _zl = WordArray.create([ 10904 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 10905 7, 4, 13, 1, 10, 6, 15, 3, 12, 0, 9, 5, 2, 14, 11, 8, 10906 3, 10, 14, 4, 9, 15, 8, 1, 2, 7, 0, 6, 13, 11, 5, 12, 10907 1, 9, 11, 10, 0, 8, 12, 4, 13, 3, 7, 15, 14, 5, 6, 2, 10908 4, 0, 5, 9, 7, 12, 2, 10, 14, 1, 3, 8, 11, 6, 15, 13]); 10909 var _zr = WordArray.create([ 10910 5, 14, 7, 0, 9, 2, 11, 4, 13, 6, 15, 8, 1, 10, 3, 12, 10911 6, 11, 3, 7, 0, 13, 5, 10, 14, 15, 8, 12, 4, 9, 1, 2, 10912 15, 5, 1, 3, 7, 14, 6, 9, 11, 8, 12, 2, 10, 0, 4, 13, 10913 8, 6, 4, 1, 3, 11, 15, 0, 5, 12, 2, 13, 9, 7, 10, 14, 10914 12, 15, 10, 4, 1, 5, 8, 7, 6, 2, 13, 14, 0, 3, 9, 11]); 10915 var _sl = WordArray.create([ 10916 11, 14, 15, 12, 5, 8, 7, 9, 11, 13, 14, 15, 6, 7, 9, 8, 10917 7, 6, 8, 13, 11, 9, 7, 15, 7, 12, 15, 9, 11, 7, 13, 12, 10918 11, 13, 6, 7, 14, 9, 13, 15, 14, 8, 13, 6, 5, 12, 7, 5, 10919 11, 12, 14, 15, 14, 15, 9, 8, 9, 14, 5, 6, 8, 6, 5, 12, 10920 9, 15, 5, 11, 6, 8, 13, 12, 5, 12, 13, 14, 11, 8, 5, 6 ]); 10921 var _sr = WordArray.create([ 10922 8, 9, 9, 11, 13, 15, 15, 5, 7, 7, 8, 11, 14, 14, 12, 6, 10923 9, 13, 15, 7, 12, 8, 9, 11, 7, 7, 12, 7, 6, 15, 13, 11, 10924 9, 7, 15, 11, 8, 6, 6, 14, 12, 13, 5, 14, 13, 13, 7, 5, 10925 15, 5, 8, 11, 14, 14, 6, 14, 6, 9, 12, 9, 12, 5, 15, 8, 10926 8, 5, 12, 9, 12, 5, 14, 6, 8, 13, 6, 5, 15, 13, 11, 11 ]); 10927 10928 var _hl = WordArray.create([ 0x00000000, 0x5A827999, 0x6ED9EBA1, 0x8F1BBCDC, 0xA953FD4E]); 10929 var _hr = WordArray.create([ 0x50A28BE6, 0x5C4DD124, 0x6D703EF3, 0x7A6D76E9, 0x00000000]); 10930 10931 /** 10932 * RIPEMD160 hash algorithm. 10933 */ 10934 var RIPEMD160 = C_algo.RIPEMD160 = Hasher.extend({ 10935 _doReset: function () { 10936 this._hash = WordArray.create([0x67452301, 0xEFCDAB89, 0x98BADCFE, 0x10325476, 0xC3D2E1F0]); 10937 }, 10938 10939 _doProcessBlock: function (M, offset) { 10940 10941 // Swap endian 10942 for (var i = 0; i < 16; i++) { 10943 // Shortcuts 10944 var offset_i = offset + i; 10945 var M_offset_i = M[offset_i]; 10946 10947 // Swap 10948 M[offset_i] = ( 10949 (((M_offset_i << 8) | (M_offset_i >>> 24)) & 0x00ff00ff) | 10950 (((M_offset_i << 24) | (M_offset_i >>> 8)) & 0xff00ff00) 10951 ); 10952 } 10953 // Shortcut 10954 var H = this._hash.words; 10955 var hl = _hl.words; 10956 var hr = _hr.words; 10957 var zl = _zl.words; 10958 var zr = _zr.words; 10959 var sl = _sl.words; 10960 var sr = _sr.words; 10961 10962 // Working variables 10963 var al, bl, cl, dl, el; 10964 var ar, br, cr, dr, er; 10965 10966 ar = al = H[0]; 10967 br = bl = H[1]; 10968 cr = cl = H[2]; 10969 dr = dl = H[3]; 10970 er = el = H[4]; 10971 // Computation 10972 var t; 10973 for (var i = 0; i < 80; i += 1) { 10974 t = (al + M[offset+zl[i]])|0; 10975 if (i<16){ 10976 t += f1(bl,cl,dl) + hl[0]; 10977 } else if (i<32) { 10978 t += f2(bl,cl,dl) + hl[1]; 10979 } else if (i<48) { 10980 t += f3(bl,cl,dl) + hl[2]; 10981 } else if (i<64) { 10982 t += f4(bl,cl,dl) + hl[3]; 10983 } else {// if (i<80) { 10984 t += f5(bl,cl,dl) + hl[4]; 10985 } 10986 t = t|0; 10987 t = rotl(t,sl[i]); 10988 t = (t+el)|0; 10989 al = el; 10990 el = dl; 10991 dl = rotl(cl, 10); 10992 cl = bl; 10993 bl = t; 10994 10995 t = (ar + M[offset+zr[i]])|0; 10996 if (i<16){ 10997 t += f5(br,cr,dr) + hr[0]; 10998 } else if (i<32) { 10999 t += f4(br,cr,dr) + hr[1]; 11000 } else if (i<48) { 11001 t += f3(br,cr,dr) + hr[2]; 11002 } else if (i<64) { 11003 t += f2(br,cr,dr) + hr[3]; 11004 } else {// if (i<80) { 11005 t += f1(br,cr,dr) + hr[4]; 11006 } 11007 t = t|0; 11008 t = rotl(t,sr[i]) ; 11009 t = (t+er)|0; 11010 ar = er; 11011 er = dr; 11012 dr = rotl(cr, 10); 11013 cr = br; 11014 br = t; 11015 } 11016 // Intermediate hash value 11017 t = (H[1] + cl + dr)|0; 11018 H[1] = (H[2] + dl + er)|0; 11019 H[2] = (H[3] + el + ar)|0; 11020 H[3] = (H[4] + al + br)|0; 11021 H[4] = (H[0] + bl + cr)|0; 11022 H[0] = t; 11023 }, 11024 11025 _doFinalize: function () { 11026 // Shortcuts 11027 var data = this._data; 11028 var dataWords = data.words; 11029 11030 var nBitsTotal = this._nDataBytes * 8; 11031 var nBitsLeft = data.sigBytes * 8; 11032 11033 // Add padding 11034 dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32); 11035 dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = ( 11036 (((nBitsTotal << 8) | (nBitsTotal >>> 24)) & 0x00ff00ff) | 11037 (((nBitsTotal << 24) | (nBitsTotal >>> 8)) & 0xff00ff00) 11038 ); 11039 data.sigBytes = (dataWords.length + 1) * 4; 11040 11041 // Hash final blocks 11042 this._process(); 11043 11044 // Shortcuts 11045 var hash = this._hash; 11046 var H = hash.words; 11047 11048 // Swap endian 11049 for (var i = 0; i < 5; i++) { 11050 // Shortcut 11051 var H_i = H[i]; 11052 11053 // Swap 11054 H[i] = (((H_i << 8) | (H_i >>> 24)) & 0x00ff00ff) | 11055 (((H_i << 24) | (H_i >>> 8)) & 0xff00ff00); 11056 } 11057 11058 // Return final computed hash 11059 return hash; 11060 }, 11061 11062 clone: function () { 11063 var clone = Hasher.clone.call(this); 11064 clone._hash = this._hash.clone(); 11065 11066 return clone; 11067 } 11068 }); 11069 11070 11071 function f1(x, y, z) { 11072 return ((x) ^ (y) ^ (z)); 11073 11074 } 11075 11076 function f2(x, y, z) { 11077 return (((x)&(y)) | ((~x)&(z))); 11078 } 11079 11080 function f3(x, y, z) { 11081 return (((x) | (~(y))) ^ (z)); 11082 } 11083 11084 function f4(x, y, z) { 11085 return (((x) & (z)) | ((y)&(~(z)))); 11086 } 11087 11088 function f5(x, y, z) { 11089 return ((x) ^ ((y) |(~(z)))); 11090 11091 } 11092 11093 function rotl(x,n) { 11094 return (x<<n) | (x>>>(32-n)); 11095 } 11096 11097 11098 /** 11099 * Shortcut function to the hasher's object interface. 11100 * 11101 * @param {WordArray|string} message The message to hash. 11102 * 11103 * @return {WordArray} The hash. 11104 * 11105 * @static 11106 * 11107 * @example 11108 * 11109 * var hash = CryptoJS.RIPEMD160('message'); 11110 * var hash = CryptoJS.RIPEMD160(wordArray); 11111 */ 11112 C.RIPEMD160 = Hasher._createHelper(RIPEMD160); 11113 11114 /** 11115 * Shortcut function to the HMAC's object interface. 11116 * 11117 * @param {WordArray|string} message The message to hash. 11118 * @param {WordArray|string} key The secret key. 11119 * 11120 * @return {WordArray} The HMAC. 11121 * 11122 * @static 11123 * 11124 * @example 11125 * 11126 * var hmac = CryptoJS.HmacRIPEMD160(message, key); 11127 */ 11128 C.HmacRIPEMD160 = Hasher._createHmacHelper(RIPEMD160); 11129 }(Math)); 11130 11131 11132 return CryptoJS.RIPEMD160; 11133 11134 })); 11135 },{"./core":53}],77:[function(require,module,exports){ 11136 ;(function (root, factory) { 11137 if (typeof exports === "object") { 11138 // CommonJS 11139 module.exports = exports = factory(require("./core")); 11140 } 11141 else if (typeof define === "function" && define.amd) { 11142 // AMD 11143 define(["./core"], factory); 11144 } 11145 else { 11146 // Global (browser) 11147 factory(root.CryptoJS); 11148 } 11149 }(this, function (CryptoJS) { 11150 11151 (function () { 11152 // Shortcuts 11153 var C = CryptoJS; 11154 var C_lib = C.lib; 11155 var WordArray = C_lib.WordArray; 11156 var Hasher = C_lib.Hasher; 11157 var C_algo = C.algo; 11158 11159 // Reusable object 11160 var W = []; 11161 11162 /** 11163 * SHA-1 hash algorithm. 11164 */ 11165 var SHA1 = C_algo.SHA1 = Hasher.extend({ 11166 _doReset: function () { 11167 this._hash = new WordArray.init([ 11168 0x67452301, 0xefcdab89, 11169 0x98badcfe, 0x10325476, 11170 0xc3d2e1f0 11171 ]); 11172 }, 11173 11174 _doProcessBlock: function (M, offset) { 11175 // Shortcut 11176 var H = this._hash.words; 11177 11178 // Working variables 11179 var a = H[0]; 11180 var b = H[1]; 11181 var c = H[2]; 11182 var d = H[3]; 11183 var e = H[4]; 11184 11185 // Computation 11186 for (var i = 0; i < 80; i++) { 11187 if (i < 16) { 11188 W[i] = M[offset + i] | 0; 11189 } else { 11190 var n = W[i - 3] ^ W[i - 8] ^ W[i - 14] ^ W[i - 16]; 11191 W[i] = (n << 1) | (n >>> 31); 11192 } 11193 11194 var t = ((a << 5) | (a >>> 27)) + e + W[i]; 11195 if (i < 20) { 11196 t += ((b & c) | (~b & d)) + 0x5a827999; 11197 } else if (i < 40) { 11198 t += (b ^ c ^ d) + 0x6ed9eba1; 11199 } else if (i < 60) { 11200 t += ((b & c) | (b & d) | (c & d)) - 0x70e44324; 11201 } else /* if (i < 80) */ { 11202 t += (b ^ c ^ d) - 0x359d3e2a; 11203 } 11204 11205 e = d; 11206 d = c; 11207 c = (b << 30) | (b >>> 2); 11208 b = a; 11209 a = t; 11210 } 11211 11212 // Intermediate hash value 11213 H[0] = (H[0] + a) | 0; 11214 H[1] = (H[1] + b) | 0; 11215 H[2] = (H[2] + c) | 0; 11216 H[3] = (H[3] + d) | 0; 11217 H[4] = (H[4] + e) | 0; 11218 }, 11219 11220 _doFinalize: function () { 11221 // Shortcuts 11222 var data = this._data; 11223 var dataWords = data.words; 11224 11225 var nBitsTotal = this._nDataBytes * 8; 11226 var nBitsLeft = data.sigBytes * 8; 11227 11228 // Add padding 11229 dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32); 11230 dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = Math.floor(nBitsTotal / 0x100000000); 11231 dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 15] = nBitsTotal; 11232 data.sigBytes = dataWords.length * 4; 11233 11234 // Hash final blocks 11235 this._process(); 11236 11237 // Return final computed hash 11238 return this._hash; 11239 }, 11240 11241 clone: function () { 11242 var clone = Hasher.clone.call(this); 11243 clone._hash = this._hash.clone(); 11244 11245 return clone; 11246 } 11247 }); 11248 11249 /** 11250 * Shortcut function to the hasher's object interface. 11251 * 11252 * @param {WordArray|string} message The message to hash. 11253 * 11254 * @return {WordArray} The hash. 11255 * 11256 * @static 11257 * 11258 * @example 11259 * 11260 * var hash = CryptoJS.SHA1('message'); 11261 * var hash = CryptoJS.SHA1(wordArray); 11262 */ 11263 C.SHA1 = Hasher._createHelper(SHA1); 11264 11265 /** 11266 * Shortcut function to the HMAC's object interface. 11267 * 11268 * @param {WordArray|string} message The message to hash. 11269 * @param {WordArray|string} key The secret key. 11270 * 11271 * @return {WordArray} The HMAC. 11272 * 11273 * @static 11274 * 11275 * @example 11276 * 11277 * var hmac = CryptoJS.HmacSHA1(message, key); 11278 */ 11279 C.HmacSHA1 = Hasher._createHmacHelper(SHA1); 11280 }()); 11281 11282 11283 return CryptoJS.SHA1; 11284 11285 })); 11286 },{"./core":53}],78:[function(require,module,exports){ 11287 ;(function (root, factory, undef) { 11288 if (typeof exports === "object") { 11289 // CommonJS 11290 module.exports = exports = factory(require("./core"), require("./sha256")); 11291 } 11292 else if (typeof define === "function" && define.amd) { 11293 // AMD 11294 define(["./core", "./sha256"], factory); 11295 } 11296 else { 11297 // Global (browser) 11298 factory(root.CryptoJS); 11299 } 11300 }(this, function (CryptoJS) { 11301 11302 (function () { 11303 // Shortcuts 11304 var C = CryptoJS; 11305 var C_lib = C.lib; 11306 var WordArray = C_lib.WordArray; 11307 var C_algo = C.algo; 11308 var SHA256 = C_algo.SHA256; 11309 11310 /** 11311 * SHA-224 hash algorithm. 11312 */ 11313 var SHA224 = C_algo.SHA224 = SHA256.extend({ 11314 _doReset: function () { 11315 this._hash = new WordArray.init([ 11316 0xc1059ed8, 0x367cd507, 0x3070dd17, 0xf70e5939, 11317 0xffc00b31, 0x68581511, 0x64f98fa7, 0xbefa4fa4 11318 ]); 11319 }, 11320 11321 _doFinalize: function () { 11322 var hash = SHA256._doFinalize.call(this); 11323 11324 hash.sigBytes -= 4; 11325 11326 return hash; 11327 } 11328 }); 11329 11330 /** 11331 * Shortcut function to the hasher's object interface. 11332 * 11333 * @param {WordArray|string} message The message to hash. 11334 * 11335 * @return {WordArray} The hash. 11336 * 11337 * @static 11338 * 11339 * @example 11340 * 11341 * var hash = CryptoJS.SHA224('message'); 11342 * var hash = CryptoJS.SHA224(wordArray); 11343 */ 11344 C.SHA224 = SHA256._createHelper(SHA224); 11345 11346 /** 11347 * Shortcut function to the HMAC's object interface. 11348 * 11349 * @param {WordArray|string} message The message to hash. 11350 * @param {WordArray|string} key The secret key. 11351 * 11352 * @return {WordArray} The HMAC. 11353 * 11354 * @static 11355 * 11356 * @example 11357 * 11358 * var hmac = CryptoJS.HmacSHA224(message, key); 11359 */ 11360 C.HmacSHA224 = SHA256._createHmacHelper(SHA224); 11361 }()); 11362 11363 11364 return CryptoJS.SHA224; 11365 11366 })); 11367 },{"./core":53,"./sha256":79}],79:[function(require,module,exports){ 11368 ;(function (root, factory) { 11369 if (typeof exports === "object") { 11370 // CommonJS 11371 module.exports = exports = factory(require("./core")); 11372 } 11373 else if (typeof define === "function" && define.amd) { 11374 // AMD 11375 define(["./core"], factory); 11376 } 11377 else { 11378 // Global (browser) 11379 factory(root.CryptoJS); 11380 } 11381 }(this, function (CryptoJS) { 11382 11383 (function (Math) { 11384 // Shortcuts 11385 var C = CryptoJS; 11386 var C_lib = C.lib; 11387 var WordArray = C_lib.WordArray; 11388 var Hasher = C_lib.Hasher; 11389 var C_algo = C.algo; 11390 11391 // Initialization and round constants tables 11392 var H = []; 11393 var K = []; 11394 11395 // Compute constants 11396 (function () { 11397 function isPrime(n) { 11398 var sqrtN = Math.sqrt(n); 11399 for (var factor = 2; factor <= sqrtN; factor++) { 11400 if (!(n % factor)) { 11401 return false; 11402 } 11403 } 11404 11405 return true; 11406 } 11407 11408 function getFractionalBits(n) { 11409 return ((n - (n | 0)) * 0x100000000) | 0; 11410 } 11411 11412 var n = 2; 11413 var nPrime = 0; 11414 while (nPrime < 64) { 11415 if (isPrime(n)) { 11416 if (nPrime < 8) { 11417 H[nPrime] = getFractionalBits(Math.pow(n, 1 / 2)); 11418 } 11419 K[nPrime] = getFractionalBits(Math.pow(n, 1 / 3)); 11420 11421 nPrime++; 11422 } 11423 11424 n++; 11425 } 11426 }()); 11427 11428 // Reusable object 11429 var W = []; 11430 11431 /** 11432 * SHA-256 hash algorithm. 11433 */ 11434 var SHA256 = C_algo.SHA256 = Hasher.extend({ 11435 _doReset: function () { 11436 this._hash = new WordArray.init(H.slice(0)); 11437 }, 11438 11439 _doProcessBlock: function (M, offset) { 11440 // Shortcut 11441 var H = this._hash.words; 11442 11443 // Working variables 11444 var a = H[0]; 11445 var b = H[1]; 11446 var c = H[2]; 11447 var d = H[3]; 11448 var e = H[4]; 11449 var f = H[5]; 11450 var g = H[6]; 11451 var h = H[7]; 11452 11453 // Computation 11454 for (var i = 0; i < 64; i++) { 11455 if (i < 16) { 11456 W[i] = M[offset + i] | 0; 11457 } else { 11458 var gamma0x = W[i - 15]; 11459 var gamma0 = ((gamma0x << 25) | (gamma0x >>> 7)) ^ 11460 ((gamma0x << 14) | (gamma0x >>> 18)) ^ 11461 (gamma0x >>> 3); 11462 11463 var gamma1x = W[i - 2]; 11464 var gamma1 = ((gamma1x << 15) | (gamma1x >>> 17)) ^ 11465 ((gamma1x << 13) | (gamma1x >>> 19)) ^ 11466 (gamma1x >>> 10); 11467 11468 W[i] = gamma0 + W[i - 7] + gamma1 + W[i - 16]; 11469 } 11470 11471 var ch = (e & f) ^ (~e & g); 11472 var maj = (a & b) ^ (a & c) ^ (b & c); 11473 11474 var sigma0 = ((a << 30) | (a >>> 2)) ^ ((a << 19) | (a >>> 13)) ^ ((a << 10) | (a >>> 22)); 11475 var sigma1 = ((e << 26) | (e >>> 6)) ^ ((e << 21) | (e >>> 11)) ^ ((e << 7) | (e >>> 25)); 11476 11477 var t1 = h + sigma1 + ch + K[i] + W[i]; 11478 var t2 = sigma0 + maj; 11479 11480 h = g; 11481 g = f; 11482 f = e; 11483 e = (d + t1) | 0; 11484 d = c; 11485 c = b; 11486 b = a; 11487 a = (t1 + t2) | 0; 11488 } 11489 11490 // Intermediate hash value 11491 H[0] = (H[0] + a) | 0; 11492 H[1] = (H[1] + b) | 0; 11493 H[2] = (H[2] + c) | 0; 11494 H[3] = (H[3] + d) | 0; 11495 H[4] = (H[4] + e) | 0; 11496 H[5] = (H[5] + f) | 0; 11497 H[6] = (H[6] + g) | 0; 11498 H[7] = (H[7] + h) | 0; 11499 }, 11500 11501 _doFinalize: function () { 11502 // Shortcuts 11503 var data = this._data; 11504 var dataWords = data.words; 11505 11506 var nBitsTotal = this._nDataBytes * 8; 11507 var nBitsLeft = data.sigBytes * 8; 11508 11509 // Add padding 11510 dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32); 11511 dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = Math.floor(nBitsTotal / 0x100000000); 11512 dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 15] = nBitsTotal; 11513 data.sigBytes = dataWords.length * 4; 11514 11515 // Hash final blocks 11516 this._process(); 11517 11518 // Return final computed hash 11519 return this._hash; 11520 }, 11521 11522 clone: function () { 11523 var clone = Hasher.clone.call(this); 11524 clone._hash = this._hash.clone(); 11525 11526 return clone; 11527 } 11528 }); 11529 11530 /** 11531 * Shortcut function to the hasher's object interface. 11532 * 11533 * @param {WordArray|string} message The message to hash. 11534 * 11535 * @return {WordArray} The hash. 11536 * 11537 * @static 11538 * 11539 * @example 11540 * 11541 * var hash = CryptoJS.SHA256('message'); 11542 * var hash = CryptoJS.SHA256(wordArray); 11543 */ 11544 C.SHA256 = Hasher._createHelper(SHA256); 11545 11546 /** 11547 * Shortcut function to the HMAC's object interface. 11548 * 11549 * @param {WordArray|string} message The message to hash. 11550 * @param {WordArray|string} key The secret key. 11551 * 11552 * @return {WordArray} The HMAC. 11553 * 11554 * @static 11555 * 11556 * @example 11557 * 11558 * var hmac = CryptoJS.HmacSHA256(message, key); 11559 */ 11560 C.HmacSHA256 = Hasher._createHmacHelper(SHA256); 11561 }(Math)); 11562 11563 11564 return CryptoJS.SHA256; 11565 11566 })); 11567 },{"./core":53}],80:[function(require,module,exports){ 11568 ;(function (root, factory, undef) { 11569 if (typeof exports === "object") { 11570 // CommonJS 11571 module.exports = exports = factory(require("./core"), require("./x64-core")); 11572 } 11573 else if (typeof define === "function" && define.amd) { 11574 // AMD 11575 define(["./core", "./x64-core"], factory); 11576 } 11577 else { 11578 // Global (browser) 11579 factory(root.CryptoJS); 11580 } 11581 }(this, function (CryptoJS) { 11582 11583 (function (Math) { 11584 // Shortcuts 11585 var C = CryptoJS; 11586 var C_lib = C.lib; 11587 var WordArray = C_lib.WordArray; 11588 var Hasher = C_lib.Hasher; 11589 var C_x64 = C.x64; 11590 var X64Word = C_x64.Word; 11591 var C_algo = C.algo; 11592 11593 // Constants tables 11594 var RHO_OFFSETS = []; 11595 var PI_INDEXES = []; 11596 var ROUND_CONSTANTS = []; 11597 11598 // Compute Constants 11599 (function () { 11600 // Compute rho offset constants 11601 var x = 1, y = 0; 11602 for (var t = 0; t < 24; t++) { 11603 RHO_OFFSETS[x + 5 * y] = ((t + 1) * (t + 2) / 2) % 64; 11604 11605 var newX = y % 5; 11606 var newY = (2 * x + 3 * y) % 5; 11607 x = newX; 11608 y = newY; 11609 } 11610 11611 // Compute pi index constants 11612 for (var x = 0; x < 5; x++) { 11613 for (var y = 0; y < 5; y++) { 11614 PI_INDEXES[x + 5 * y] = y + ((2 * x + 3 * y) % 5) * 5; 11615 } 11616 } 11617 11618 // Compute round constants 11619 var LFSR = 0x01; 11620 for (var i = 0; i < 24; i++) { 11621 var roundConstantMsw = 0; 11622 var roundConstantLsw = 0; 11623 11624 for (var j = 0; j < 7; j++) { 11625 if (LFSR & 0x01) { 11626 var bitPosition = (1 << j) - 1; 11627 if (bitPosition < 32) { 11628 roundConstantLsw ^= 1 << bitPosition; 11629 } else /* if (bitPosition >= 32) */ { 11630 roundConstantMsw ^= 1 << (bitPosition - 32); 11631 } 11632 } 11633 11634 // Compute next LFSR 11635 if (LFSR & 0x80) { 11636 // Primitive polynomial over GF(2): x^8 + x^6 + x^5 + x^4 + 1 11637 LFSR = (LFSR << 1) ^ 0x71; 11638 } else { 11639 LFSR <<= 1; 11640 } 11641 } 11642 11643 ROUND_CONSTANTS[i] = X64Word.create(roundConstantMsw, roundConstantLsw); 11644 } 11645 }()); 11646 11647 // Reusable objects for temporary values 11648 var T = []; 11649 (function () { 11650 for (var i = 0; i < 25; i++) { 11651 T[i] = X64Word.create(); 11652 } 11653 }()); 11654 11655 /** 11656 * SHA-3 hash algorithm. 11657 */ 11658 var SHA3 = C_algo.SHA3 = Hasher.extend({ 11659 /** 11660 * Configuration options. 11661 * 11662 * @property {number} outputLength 11663 * The desired number of bits in the output hash. 11664 * Only values permitted are: 224, 256, 384, 512. 11665 * Default: 512 11666 */ 11667 cfg: Hasher.cfg.extend({ 11668 outputLength: 512 11669 }), 11670 11671 _doReset: function () { 11672 var state = this._state = [] 11673 for (var i = 0; i < 25; i++) { 11674 state[i] = new X64Word.init(); 11675 } 11676 11677 this.blockSize = (1600 - 2 * this.cfg.outputLength) / 32; 11678 }, 11679 11680 _doProcessBlock: function (M, offset) { 11681 // Shortcuts 11682 var state = this._state; 11683 var nBlockSizeLanes = this.blockSize / 2; 11684 11685 // Absorb 11686 for (var i = 0; i < nBlockSizeLanes; i++) { 11687 // Shortcuts 11688 var M2i = M[offset + 2 * i]; 11689 var M2i1 = M[offset + 2 * i + 1]; 11690 11691 // Swap endian 11692 M2i = ( 11693 (((M2i << 8) | (M2i >>> 24)) & 0x00ff00ff) | 11694 (((M2i << 24) | (M2i >>> 8)) & 0xff00ff00) 11695 ); 11696 M2i1 = ( 11697 (((M2i1 << 8) | (M2i1 >>> 24)) & 0x00ff00ff) | 11698 (((M2i1 << 24) | (M2i1 >>> 8)) & 0xff00ff00) 11699 ); 11700 11701 // Absorb message into state 11702 var lane = state[i]; 11703 lane.high ^= M2i1; 11704 lane.low ^= M2i; 11705 } 11706 11707 // Rounds 11708 for (var round = 0; round < 24; round++) { 11709 // Theta 11710 for (var x = 0; x < 5; x++) { 11711 // Mix column lanes 11712 var tMsw = 0, tLsw = 0; 11713 for (var y = 0; y < 5; y++) { 11714 var lane = state[x + 5 * y]; 11715 tMsw ^= lane.high; 11716 tLsw ^= lane.low; 11717 } 11718 11719 // Temporary values 11720 var Tx = T[x]; 11721 Tx.high = tMsw; 11722 Tx.low = tLsw; 11723 } 11724 for (var x = 0; x < 5; x++) { 11725 // Shortcuts 11726 var Tx4 = T[(x + 4) % 5]; 11727 var Tx1 = T[(x + 1) % 5]; 11728 var Tx1Msw = Tx1.high; 11729 var Tx1Lsw = Tx1.low; 11730 11731 // Mix surrounding columns 11732 var tMsw = Tx4.high ^ ((Tx1Msw << 1) | (Tx1Lsw >>> 31)); 11733 var tLsw = Tx4.low ^ ((Tx1Lsw << 1) | (Tx1Msw >>> 31)); 11734 for (var y = 0; y < 5; y++) { 11735 var lane = state[x + 5 * y]; 11736 lane.high ^= tMsw; 11737 lane.low ^= tLsw; 11738 } 11739 } 11740 11741 // Rho Pi 11742 for (var laneIndex = 1; laneIndex < 25; laneIndex++) { 11743 // Shortcuts 11744 var lane = state[laneIndex]; 11745 var laneMsw = lane.high; 11746 var laneLsw = lane.low; 11747 var rhoOffset = RHO_OFFSETS[laneIndex]; 11748 11749 // Rotate lanes 11750 if (rhoOffset < 32) { 11751 var tMsw = (laneMsw << rhoOffset) | (laneLsw >>> (32 - rhoOffset)); 11752 var tLsw = (laneLsw << rhoOffset) | (laneMsw >>> (32 - rhoOffset)); 11753 } else /* if (rhoOffset >= 32) */ { 11754 var tMsw = (laneLsw << (rhoOffset - 32)) | (laneMsw >>> (64 - rhoOffset)); 11755 var tLsw = (laneMsw << (rhoOffset - 32)) | (laneLsw >>> (64 - rhoOffset)); 11756 } 11757 11758 // Transpose lanes 11759 var TPiLane = T[PI_INDEXES[laneIndex]]; 11760 TPiLane.high = tMsw; 11761 TPiLane.low = tLsw; 11762 } 11763 11764 // Rho pi at x = y = 0 11765 var T0 = T[0]; 11766 var state0 = state[0]; 11767 T0.high = state0.high; 11768 T0.low = state0.low; 11769 11770 // Chi 11771 for (var x = 0; x < 5; x++) { 11772 for (var y = 0; y < 5; y++) { 11773 // Shortcuts 11774 var laneIndex = x + 5 * y; 11775 var lane = state[laneIndex]; 11776 var TLane = T[laneIndex]; 11777 var Tx1Lane = T[((x + 1) % 5) + 5 * y]; 11778 var Tx2Lane = T[((x + 2) % 5) + 5 * y]; 11779 11780 // Mix rows 11781 lane.high = TLane.high ^ (~Tx1Lane.high & Tx2Lane.high); 11782 lane.low = TLane.low ^ (~Tx1Lane.low & Tx2Lane.low); 11783 } 11784 } 11785 11786 // Iota 11787 var lane = state[0]; 11788 var roundConstant = ROUND_CONSTANTS[round]; 11789 lane.high ^= roundConstant.high; 11790 lane.low ^= roundConstant.low;; 11791 } 11792 }, 11793 11794 _doFinalize: function () { 11795 // Shortcuts 11796 var data = this._data; 11797 var dataWords = data.words; 11798 var nBitsTotal = this._nDataBytes * 8; 11799 var nBitsLeft = data.sigBytes * 8; 11800 var blockSizeBits = this.blockSize * 32; 11801 11802 // Add padding 11803 dataWords[nBitsLeft >>> 5] |= 0x1 << (24 - nBitsLeft % 32); 11804 dataWords[((Math.ceil((nBitsLeft + 1) / blockSizeBits) * blockSizeBits) >>> 5) - 1] |= 0x80; 11805 data.sigBytes = dataWords.length * 4; 11806 11807 // Hash final blocks 11808 this._process(); 11809 11810 // Shortcuts 11811 var state = this._state; 11812 var outputLengthBytes = this.cfg.outputLength / 8; 11813 var outputLengthLanes = outputLengthBytes / 8; 11814 11815 // Squeeze 11816 var hashWords = []; 11817 for (var i = 0; i < outputLengthLanes; i++) { 11818 // Shortcuts 11819 var lane = state[i]; 11820 var laneMsw = lane.high; 11821 var laneLsw = lane.low; 11822 11823 // Swap endian 11824 laneMsw = ( 11825 (((laneMsw << 8) | (laneMsw >>> 24)) & 0x00ff00ff) | 11826 (((laneMsw << 24) | (laneMsw >>> 8)) & 0xff00ff00) 11827 ); 11828 laneLsw = ( 11829 (((laneLsw << 8) | (laneLsw >>> 24)) & 0x00ff00ff) | 11830 (((laneLsw << 24) | (laneLsw >>> 8)) & 0xff00ff00) 11831 ); 11832 11833 // Squeeze state to retrieve hash 11834 hashWords.push(laneLsw); 11835 hashWords.push(laneMsw); 11836 } 11837 11838 // Return final computed hash 11839 return new WordArray.init(hashWords, outputLengthBytes); 11840 }, 11841 11842 clone: function () { 11843 var clone = Hasher.clone.call(this); 11844 11845 var state = clone._state = this._state.slice(0); 11846 for (var i = 0; i < 25; i++) { 11847 state[i] = state[i].clone(); 11848 } 11849 11850 return clone; 11851 } 11852 }); 11853 11854 /** 11855 * Shortcut function to the hasher's object interface. 11856 * 11857 * @param {WordArray|string} message The message to hash. 11858 * 11859 * @return {WordArray} The hash. 11860 * 11861 * @static 11862 * 11863 * @example 11864 * 11865 * var hash = CryptoJS.SHA3('message'); 11866 * var hash = CryptoJS.SHA3(wordArray); 11867 */ 11868 C.SHA3 = Hasher._createHelper(SHA3); 11869 11870 /** 11871 * Shortcut function to the HMAC's object interface. 11872 * 11873 * @param {WordArray|string} message The message to hash. 11874 * @param {WordArray|string} key The secret key. 11875 * 11876 * @return {WordArray} The HMAC. 11877 * 11878 * @static 11879 * 11880 * @example 11881 * 11882 * var hmac = CryptoJS.HmacSHA3(message, key); 11883 */ 11884 C.HmacSHA3 = Hasher._createHmacHelper(SHA3); 11885 }(Math)); 11886 11887 11888 return CryptoJS.SHA3; 11889 11890 })); 11891 },{"./core":53,"./x64-core":84}],81:[function(require,module,exports){ 11892 ;(function (root, factory, undef) { 11893 if (typeof exports === "object") { 11894 // CommonJS 11895 module.exports = exports = factory(require("./core"), require("./x64-core"), require("./sha512")); 11896 } 11897 else if (typeof define === "function" && define.amd) { 11898 // AMD 11899 define(["./core", "./x64-core", "./sha512"], factory); 11900 } 11901 else { 11902 // Global (browser) 11903 factory(root.CryptoJS); 11904 } 11905 }(this, function (CryptoJS) { 11906 11907 (function () { 11908 // Shortcuts 11909 var C = CryptoJS; 11910 var C_x64 = C.x64; 11911 var X64Word = C_x64.Word; 11912 var X64WordArray = C_x64.WordArray; 11913 var C_algo = C.algo; 11914 var SHA512 = C_algo.SHA512; 11915 11916 /** 11917 * SHA-384 hash algorithm. 11918 */ 11919 var SHA384 = C_algo.SHA384 = SHA512.extend({ 11920 _doReset: function () { 11921 this._hash = new X64WordArray.init([ 11922 new X64Word.init(0xcbbb9d5d, 0xc1059ed8), new X64Word.init(0x629a292a, 0x367cd507), 11923 new X64Word.init(0x9159015a, 0x3070dd17), new X64Word.init(0x152fecd8, 0xf70e5939), 11924 new X64Word.init(0x67332667, 0xffc00b31), new X64Word.init(0x8eb44a87, 0x68581511), 11925 new X64Word.init(0xdb0c2e0d, 0x64f98fa7), new X64Word.init(0x47b5481d, 0xbefa4fa4) 11926 ]); 11927 }, 11928 11929 _doFinalize: function () { 11930 var hash = SHA512._doFinalize.call(this); 11931 11932 hash.sigBytes -= 16; 11933 11934 return hash; 11935 } 11936 }); 11937 11938 /** 11939 * Shortcut function to the hasher's object interface. 11940 * 11941 * @param {WordArray|string} message The message to hash. 11942 * 11943 * @return {WordArray} The hash. 11944 * 11945 * @static 11946 * 11947 * @example 11948 * 11949 * var hash = CryptoJS.SHA384('message'); 11950 * var hash = CryptoJS.SHA384(wordArray); 11951 */ 11952 C.SHA384 = SHA512._createHelper(SHA384); 11953 11954 /** 11955 * Shortcut function to the HMAC's object interface. 11956 * 11957 * @param {WordArray|string} message The message to hash. 11958 * @param {WordArray|string} key The secret key. 11959 * 11960 * @return {WordArray} The HMAC. 11961 * 11962 * @static 11963 * 11964 * @example 11965 * 11966 * var hmac = CryptoJS.HmacSHA384(message, key); 11967 */ 11968 C.HmacSHA384 = SHA512._createHmacHelper(SHA384); 11969 }()); 11970 11971 11972 return CryptoJS.SHA384; 11973 11974 })); 11975 },{"./core":53,"./sha512":82,"./x64-core":84}],82:[function(require,module,exports){ 11976 ;(function (root, factory, undef) { 11977 if (typeof exports === "object") { 11978 // CommonJS 11979 module.exports = exports = factory(require("./core"), require("./x64-core")); 11980 } 11981 else if (typeof define === "function" && define.amd) { 11982 // AMD 11983 define(["./core", "./x64-core"], factory); 11984 } 11985 else { 11986 // Global (browser) 11987 factory(root.CryptoJS); 11988 } 11989 }(this, function (CryptoJS) { 11990 11991 (function () { 11992 // Shortcuts 11993 var C = CryptoJS; 11994 var C_lib = C.lib; 11995 var Hasher = C_lib.Hasher; 11996 var C_x64 = C.x64; 11997 var X64Word = C_x64.Word; 11998 var X64WordArray = C_x64.WordArray; 11999 var C_algo = C.algo; 12000 12001 function X64Word_create() { 12002 return X64Word.create.apply(X64Word, arguments); 12003 } 12004 12005 // Constants 12006 var K = [ 12007 X64Word_create(0x428a2f98, 0xd728ae22), X64Word_create(0x71374491, 0x23ef65cd), 12008 X64Word_create(0xb5c0fbcf, 0xec4d3b2f), X64Word_create(0xe9b5dba5, 0x8189dbbc), 12009 X64Word_create(0x3956c25b, 0xf348b538), X64Word_create(0x59f111f1, 0xb605d019), 12010 X64Word_create(0x923f82a4, 0xaf194f9b), X64Word_create(0xab1c5ed5, 0xda6d8118), 12011 X64Word_create(0xd807aa98, 0xa3030242), X64Word_create(0x12835b01, 0x45706fbe), 12012 X64Word_create(0x243185be, 0x4ee4b28c), X64Word_create(0x550c7dc3, 0xd5ffb4e2), 12013 X64Word_create(0x72be5d74, 0xf27b896f), X64Word_create(0x80deb1fe, 0x3b1696b1), 12014 X64Word_create(0x9bdc06a7, 0x25c71235), X64Word_create(0xc19bf174, 0xcf692694), 12015 X64Word_create(0xe49b69c1, 0x9ef14ad2), X64Word_create(0xefbe4786, 0x384f25e3), 12016 X64Word_create(0x0fc19dc6, 0x8b8cd5b5), X64Word_create(0x240ca1cc, 0x77ac9c65), 12017 X64Word_create(0x2de92c6f, 0x592b0275), X64Word_create(0x4a7484aa, 0x6ea6e483), 12018 X64Word_create(0x5cb0a9dc, 0xbd41fbd4), X64Word_create(0x76f988da, 0x831153b5), 12019 X64Word_create(0x983e5152, 0xee66dfab), X64Word_create(0xa831c66d, 0x2db43210), 12020 X64Word_create(0xb00327c8, 0x98fb213f), X64Word_create(0xbf597fc7, 0xbeef0ee4), 12021 X64Word_create(0xc6e00bf3, 0x3da88fc2), X64Word_create(0xd5a79147, 0x930aa725), 12022 X64Word_create(0x06ca6351, 0xe003826f), X64Word_create(0x14292967, 0x0a0e6e70), 12023 X64Word_create(0x27b70a85, 0x46d22ffc), X64Word_create(0x2e1b2138, 0x5c26c926), 12024 X64Word_create(0x4d2c6dfc, 0x5ac42aed), X64Word_create(0x53380d13, 0x9d95b3df), 12025 X64Word_create(0x650a7354, 0x8baf63de), X64Word_create(0x766a0abb, 0x3c77b2a8), 12026 X64Word_create(0x81c2c92e, 0x47edaee6), X64Word_create(0x92722c85, 0x1482353b), 12027 X64Word_create(0xa2bfe8a1, 0x4cf10364), X64Word_create(0xa81a664b, 0xbc423001), 12028 X64Word_create(0xc24b8b70, 0xd0f89791), X64Word_create(0xc76c51a3, 0x0654be30), 12029 X64Word_create(0xd192e819, 0xd6ef5218), X64Word_create(0xd6990624, 0x5565a910), 12030 X64Word_create(0xf40e3585, 0x5771202a), X64Word_create(0x106aa070, 0x32bbd1b8), 12031 X64Word_create(0x19a4c116, 0xb8d2d0c8), X64Word_create(0x1e376c08, 0x5141ab53), 12032 X64Word_create(0x2748774c, 0xdf8eeb99), X64Word_create(0x34b0bcb5, 0xe19b48a8), 12033 X64Word_create(0x391c0cb3, 0xc5c95a63), X64Word_create(0x4ed8aa4a, 0xe3418acb), 12034 X64Word_create(0x5b9cca4f, 0x7763e373), X64Word_create(0x682e6ff3, 0xd6b2b8a3), 12035 X64Word_create(0x748f82ee, 0x5defb2fc), X64Word_create(0x78a5636f, 0x43172f60), 12036 X64Word_create(0x84c87814, 0xa1f0ab72), X64Word_create(0x8cc70208, 0x1a6439ec), 12037 X64Word_create(0x90befffa, 0x23631e28), X64Word_create(0xa4506ceb, 0xde82bde9), 12038 X64Word_create(0xbef9a3f7, 0xb2c67915), X64Word_create(0xc67178f2, 0xe372532b), 12039 X64Word_create(0xca273ece, 0xea26619c), X64Word_create(0xd186b8c7, 0x21c0c207), 12040 X64Word_create(0xeada7dd6, 0xcde0eb1e), X64Word_create(0xf57d4f7f, 0xee6ed178), 12041 X64Word_create(0x06f067aa, 0x72176fba), X64Word_create(0x0a637dc5, 0xa2c898a6), 12042 X64Word_create(0x113f9804, 0xbef90dae), X64Word_create(0x1b710b35, 0x131c471b), 12043 X64Word_create(0x28db77f5, 0x23047d84), X64Word_create(0x32caab7b, 0x40c72493), 12044 X64Word_create(0x3c9ebe0a, 0x15c9bebc), X64Word_create(0x431d67c4, 0x9c100d4c), 12045 X64Word_create(0x4cc5d4be, 0xcb3e42b6), X64Word_create(0x597f299c, 0xfc657e2a), 12046 X64Word_create(0x5fcb6fab, 0x3ad6faec), X64Word_create(0x6c44198c, 0x4a475817) 12047 ]; 12048 12049 // Reusable objects 12050 var W = []; 12051 (function () { 12052 for (var i = 0; i < 80; i++) { 12053 W[i] = X64Word_create(); 12054 } 12055 }()); 12056 12057 /** 12058 * SHA-512 hash algorithm. 12059 */ 12060 var SHA512 = C_algo.SHA512 = Hasher.extend({ 12061 _doReset: function () { 12062 this._hash = new X64WordArray.init([ 12063 new X64Word.init(0x6a09e667, 0xf3bcc908), new X64Word.init(0xbb67ae85, 0x84caa73b), 12064 new X64Word.init(0x3c6ef372, 0xfe94f82b), new X64Word.init(0xa54ff53a, 0x5f1d36f1), 12065 new X64Word.init(0x510e527f, 0xade682d1), new X64Word.init(0x9b05688c, 0x2b3e6c1f), 12066 new X64Word.init(0x1f83d9ab, 0xfb41bd6b), new X64Word.init(0x5be0cd19, 0x137e2179) 12067 ]); 12068 }, 12069 12070 _doProcessBlock: function (M, offset) { 12071 // Shortcuts 12072 var H = this._hash.words; 12073 12074 var H0 = H[0]; 12075 var H1 = H[1]; 12076 var H2 = H[2]; 12077 var H3 = H[3]; 12078 var H4 = H[4]; 12079 var H5 = H[5]; 12080 var H6 = H[6]; 12081 var H7 = H[7]; 12082 12083 var H0h = H0.high; 12084 var H0l = H0.low; 12085 var H1h = H1.high; 12086 var H1l = H1.low; 12087 var H2h = H2.high; 12088 var H2l = H2.low; 12089 var H3h = H3.high; 12090 var H3l = H3.low; 12091 var H4h = H4.high; 12092 var H4l = H4.low; 12093 var H5h = H5.high; 12094 var H5l = H5.low; 12095 var H6h = H6.high; 12096 var H6l = H6.low; 12097 var H7h = H7.high; 12098 var H7l = H7.low; 12099 12100 // Working variables 12101 var ah = H0h; 12102 var al = H0l; 12103 var bh = H1h; 12104 var bl = H1l; 12105 var ch = H2h; 12106 var cl = H2l; 12107 var dh = H3h; 12108 var dl = H3l; 12109 var eh = H4h; 12110 var el = H4l; 12111 var fh = H5h; 12112 var fl = H5l; 12113 var gh = H6h; 12114 var gl = H6l; 12115 var hh = H7h; 12116 var hl = H7l; 12117 12118 // Rounds 12119 for (var i = 0; i < 80; i++) { 12120 // Shortcut 12121 var Wi = W[i]; 12122 12123 // Extend message 12124 if (i < 16) { 12125 var Wih = Wi.high = M[offset + i * 2] | 0; 12126 var Wil = Wi.low = M[offset + i * 2 + 1] | 0; 12127 } else { 12128 // Gamma0 12129 var gamma0x = W[i - 15]; 12130 var gamma0xh = gamma0x.high; 12131 var gamma0xl = gamma0x.low; 12132 var gamma0h = ((gamma0xh >>> 1) | (gamma0xl << 31)) ^ ((gamma0xh >>> 8) | (gamma0xl << 24)) ^ (gamma0xh >>> 7); 12133 var gamma0l = ((gamma0xl >>> 1) | (gamma0xh << 31)) ^ ((gamma0xl >>> 8) | (gamma0xh << 24)) ^ ((gamma0xl >>> 7) | (gamma0xh << 25)); 12134 12135 // Gamma1 12136 var gamma1x = W[i - 2]; 12137 var gamma1xh = gamma1x.high; 12138 var gamma1xl = gamma1x.low; 12139 var gamma1h = ((gamma1xh >>> 19) | (gamma1xl << 13)) ^ ((gamma1xh << 3) | (gamma1xl >>> 29)) ^ (gamma1xh >>> 6); 12140 var gamma1l = ((gamma1xl >>> 19) | (gamma1xh << 13)) ^ ((gamma1xl << 3) | (gamma1xh >>> 29)) ^ ((gamma1xl >>> 6) | (gamma1xh << 26)); 12141 12142 // W[i] = gamma0 + W[i - 7] + gamma1 + W[i - 16] 12143 var Wi7 = W[i - 7]; 12144 var Wi7h = Wi7.high; 12145 var Wi7l = Wi7.low; 12146 12147 var Wi16 = W[i - 16]; 12148 var Wi16h = Wi16.high; 12149 var Wi16l = Wi16.low; 12150 12151 var Wil = gamma0l + Wi7l; 12152 var Wih = gamma0h + Wi7h + ((Wil >>> 0) < (gamma0l >>> 0) ? 1 : 0); 12153 var Wil = Wil + gamma1l; 12154 var Wih = Wih + gamma1h + ((Wil >>> 0) < (gamma1l >>> 0) ? 1 : 0); 12155 var Wil = Wil + Wi16l; 12156 var Wih = Wih + Wi16h + ((Wil >>> 0) < (Wi16l >>> 0) ? 1 : 0); 12157 12158 Wi.high = Wih; 12159 Wi.low = Wil; 12160 } 12161 12162 var chh = (eh & fh) ^ (~eh & gh); 12163 var chl = (el & fl) ^ (~el & gl); 12164 var majh = (ah & bh) ^ (ah & ch) ^ (bh & ch); 12165 var majl = (al & bl) ^ (al & cl) ^ (bl & cl); 12166 12167 var sigma0h = ((ah >>> 28) | (al << 4)) ^ ((ah << 30) | (al >>> 2)) ^ ((ah << 25) | (al >>> 7)); 12168 var sigma0l = ((al >>> 28) | (ah << 4)) ^ ((al << 30) | (ah >>> 2)) ^ ((al << 25) | (ah >>> 7)); 12169 var sigma1h = ((eh >>> 14) | (el << 18)) ^ ((eh >>> 18) | (el << 14)) ^ ((eh << 23) | (el >>> 9)); 12170 var sigma1l = ((el >>> 14) | (eh << 18)) ^ ((el >>> 18) | (eh << 14)) ^ ((el << 23) | (eh >>> 9)); 12171 12172 // t1 = h + sigma1 + ch + K[i] + W[i] 12173 var Ki = K[i]; 12174 var Kih = Ki.high; 12175 var Kil = Ki.low; 12176 12177 var t1l = hl + sigma1l; 12178 var t1h = hh + sigma1h + ((t1l >>> 0) < (hl >>> 0) ? 1 : 0); 12179 var t1l = t1l + chl; 12180 var t1h = t1h + chh + ((t1l >>> 0) < (chl >>> 0) ? 1 : 0); 12181 var t1l = t1l + Kil; 12182 var t1h = t1h + Kih + ((t1l >>> 0) < (Kil >>> 0) ? 1 : 0); 12183 var t1l = t1l + Wil; 12184 var t1h = t1h + Wih + ((t1l >>> 0) < (Wil >>> 0) ? 1 : 0); 12185 12186 // t2 = sigma0 + maj 12187 var t2l = sigma0l + majl; 12188 var t2h = sigma0h + majh + ((t2l >>> 0) < (sigma0l >>> 0) ? 1 : 0); 12189 12190 // Update working variables 12191 hh = gh; 12192 hl = gl; 12193 gh = fh; 12194 gl = fl; 12195 fh = eh; 12196 fl = el; 12197 el = (dl + t1l) | 0; 12198 eh = (dh + t1h + ((el >>> 0) < (dl >>> 0) ? 1 : 0)) | 0; 12199 dh = ch; 12200 dl = cl; 12201 ch = bh; 12202 cl = bl; 12203 bh = ah; 12204 bl = al; 12205 al = (t1l + t2l) | 0; 12206 ah = (t1h + t2h + ((al >>> 0) < (t1l >>> 0) ? 1 : 0)) | 0; 12207 } 12208 12209 // Intermediate hash value 12210 H0l = H0.low = (H0l + al); 12211 H0.high = (H0h + ah + ((H0l >>> 0) < (al >>> 0) ? 1 : 0)); 12212 H1l = H1.low = (H1l + bl); 12213 H1.high = (H1h + bh + ((H1l >>> 0) < (bl >>> 0) ? 1 : 0)); 12214 H2l = H2.low = (H2l + cl); 12215 H2.high = (H2h + ch + ((H2l >>> 0) < (cl >>> 0) ? 1 : 0)); 12216 H3l = H3.low = (H3l + dl); 12217 H3.high = (H3h + dh + ((H3l >>> 0) < (dl >>> 0) ? 1 : 0)); 12218 H4l = H4.low = (H4l + el); 12219 H4.high = (H4h + eh + ((H4l >>> 0) < (el >>> 0) ? 1 : 0)); 12220 H5l = H5.low = (H5l + fl); 12221 H5.high = (H5h + fh + ((H5l >>> 0) < (fl >>> 0) ? 1 : 0)); 12222 H6l = H6.low = (H6l + gl); 12223 H6.high = (H6h + gh + ((H6l >>> 0) < (gl >>> 0) ? 1 : 0)); 12224 H7l = H7.low = (H7l + hl); 12225 H7.high = (H7h + hh + ((H7l >>> 0) < (hl >>> 0) ? 1 : 0)); 12226 }, 12227 12228 _doFinalize: function () { 12229 // Shortcuts 12230 var data = this._data; 12231 var dataWords = data.words; 12232 12233 var nBitsTotal = this._nDataBytes * 8; 12234 var nBitsLeft = data.sigBytes * 8; 12235 12236 // Add padding 12237 dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32); 12238 dataWords[(((nBitsLeft + 128) >>> 10) << 5) + 30] = Math.floor(nBitsTotal / 0x100000000); 12239 dataWords[(((nBitsLeft + 128) >>> 10) << 5) + 31] = nBitsTotal; 12240 data.sigBytes = dataWords.length * 4; 12241 12242 // Hash final blocks 12243 this._process(); 12244 12245 // Convert hash to 32-bit word array before returning 12246 var hash = this._hash.toX32(); 12247 12248 // Return final computed hash 12249 return hash; 12250 }, 12251 12252 clone: function () { 12253 var clone = Hasher.clone.call(this); 12254 clone._hash = this._hash.clone(); 12255 12256 return clone; 12257 }, 12258 12259 blockSize: 1024/32 12260 }); 12261 12262 /** 12263 * Shortcut function to the hasher's object interface. 12264 * 12265 * @param {WordArray|string} message The message to hash. 12266 * 12267 * @return {WordArray} The hash. 12268 * 12269 * @static 12270 * 12271 * @example 12272 * 12273 * var hash = CryptoJS.SHA512('message'); 12274 * var hash = CryptoJS.SHA512(wordArray); 12275 */ 12276 C.SHA512 = Hasher._createHelper(SHA512); 12277 12278 /** 12279 * Shortcut function to the HMAC's object interface. 12280 * 12281 * @param {WordArray|string} message The message to hash. 12282 * @param {WordArray|string} key The secret key. 12283 * 12284 * @return {WordArray} The HMAC. 12285 * 12286 * @static 12287 * 12288 * @example 12289 * 12290 * var hmac = CryptoJS.HmacSHA512(message, key); 12291 */ 12292 C.HmacSHA512 = Hasher._createHmacHelper(SHA512); 12293 }()); 12294 12295 12296 return CryptoJS.SHA512; 12297 12298 })); 12299 },{"./core":53,"./x64-core":84}],83:[function(require,module,exports){ 12300 ;(function (root, factory, undef) { 12301 if (typeof exports === "object") { 12302 // CommonJS 12303 module.exports = exports = factory(require("./core"), require("./enc-base64"), require("./md5"), require("./evpkdf"), require("./cipher-core")); 12304 } 12305 else if (typeof define === "function" && define.amd) { 12306 // AMD 12307 define(["./core", "./enc-base64", "./md5", "./evpkdf", "./cipher-core"], factory); 12308 } 12309 else { 12310 // Global (browser) 12311 factory(root.CryptoJS); 12312 } 12313 }(this, function (CryptoJS) { 12314 12315 (function () { 12316 // Shortcuts 12317 var C = CryptoJS; 12318 var C_lib = C.lib; 12319 var WordArray = C_lib.WordArray; 12320 var BlockCipher = C_lib.BlockCipher; 12321 var C_algo = C.algo; 12322 12323 // Permuted Choice 1 constants 12324 var PC1 = [ 12325 57, 49, 41, 33, 25, 17, 9, 1, 12326 58, 50, 42, 34, 26, 18, 10, 2, 12327 59, 51, 43, 35, 27, 19, 11, 3, 12328 60, 52, 44, 36, 63, 55, 47, 39, 12329 31, 23, 15, 7, 62, 54, 46, 38, 12330 30, 22, 14, 6, 61, 53, 45, 37, 12331 29, 21, 13, 5, 28, 20, 12, 4 12332 ]; 12333 12334 // Permuted Choice 2 constants 12335 var PC2 = [ 12336 14, 17, 11, 24, 1, 5, 12337 3, 28, 15, 6, 21, 10, 12338 23, 19, 12, 4, 26, 8, 12339 16, 7, 27, 20, 13, 2, 12340 41, 52, 31, 37, 47, 55, 12341 30, 40, 51, 45, 33, 48, 12342 44, 49, 39, 56, 34, 53, 12343 46, 42, 50, 36, 29, 32 12344 ]; 12345 12346 // Cumulative bit shift constants 12347 var BIT_SHIFTS = [1, 2, 4, 6, 8, 10, 12, 14, 15, 17, 19, 21, 23, 25, 27, 28]; 12348 12349 // SBOXes and round permutation constants 12350 var SBOX_P = [ 12351 { 12352 0x0: 0x808200, 12353 0x10000000: 0x8000, 12354 0x20000000: 0x808002, 12355 0x30000000: 0x2, 12356 0x40000000: 0x200, 12357 0x50000000: 0x808202, 12358 0x60000000: 0x800202, 12359 0x70000000: 0x800000, 12360 0x80000000: 0x202, 12361 0x90000000: 0x800200, 12362 0xa0000000: 0x8200, 12363 0xb0000000: 0x808000, 12364 0xc0000000: 0x8002, 12365 0xd0000000: 0x800002, 12366 0xe0000000: 0x0, 12367 0xf0000000: 0x8202, 12368 0x8000000: 0x0, 12369 0x18000000: 0x808202, 12370 0x28000000: 0x8202, 12371 0x38000000: 0x8000, 12372 0x48000000: 0x808200, 12373 0x58000000: 0x200, 12374 0x68000000: 0x808002, 12375 0x78000000: 0x2, 12376 0x88000000: 0x800200, 12377 0x98000000: 0x8200, 12378 0xa8000000: 0x808000, 12379 0xb8000000: 0x800202, 12380 0xc8000000: 0x800002, 12381 0xd8000000: 0x8002, 12382 0xe8000000: 0x202, 12383 0xf8000000: 0x800000, 12384 0x1: 0x8000, 12385 0x10000001: 0x2, 12386 0x20000001: 0x808200, 12387 0x30000001: 0x800000, 12388 0x40000001: 0x808002, 12389 0x50000001: 0x8200, 12390 0x60000001: 0x200, 12391 0x70000001: 0x800202, 12392 0x80000001: 0x808202, 12393 0x90000001: 0x808000, 12394 0xa0000001: 0x800002, 12395 0xb0000001: 0x8202, 12396 0xc0000001: 0x202, 12397 0xd0000001: 0x800200, 12398 0xe0000001: 0x8002, 12399 0xf0000001: 0x0, 12400 0x8000001: 0x808202, 12401 0x18000001: 0x808000, 12402 0x28000001: 0x800000, 12403 0x38000001: 0x200, 12404 0x48000001: 0x8000, 12405 0x58000001: 0x800002, 12406 0x68000001: 0x2, 12407 0x78000001: 0x8202, 12408 0x88000001: 0x8002, 12409 0x98000001: 0x800202, 12410 0xa8000001: 0x202, 12411 0xb8000001: 0x808200, 12412 0xc8000001: 0x800200, 12413 0xd8000001: 0x0, 12414 0xe8000001: 0x8200, 12415 0xf8000001: 0x808002 12416 }, 12417 { 12418 0x0: 0x40084010, 12419 0x1000000: 0x4000, 12420 0x2000000: 0x80000, 12421 0x3000000: 0x40080010, 12422 0x4000000: 0x40000010, 12423 0x5000000: 0x40084000, 12424 0x6000000: 0x40004000, 12425 0x7000000: 0x10, 12426 0x8000000: 0x84000, 12427 0x9000000: 0x40004010, 12428 0xa000000: 0x40000000, 12429 0xb000000: 0x84010, 12430 0xc000000: 0x80010, 12431 0xd000000: 0x0, 12432 0xe000000: 0x4010, 12433 0xf000000: 0x40080000, 12434 0x800000: 0x40004000, 12435 0x1800000: 0x84010, 12436 0x2800000: 0x10, 12437 0x3800000: 0x40004010, 12438 0x4800000: 0x40084010, 12439 0x5800000: 0x40000000, 12440 0x6800000: 0x80000, 12441 0x7800000: 0x40080010, 12442 0x8800000: 0x80010, 12443 0x9800000: 0x0, 12444 0xa800000: 0x4000, 12445 0xb800000: 0x40080000, 12446 0xc800000: 0x40000010, 12447 0xd800000: 0x84000, 12448 0xe800000: 0x40084000, 12449 0xf800000: 0x4010, 12450 0x10000000: 0x0, 12451 0x11000000: 0x40080010, 12452 0x12000000: 0x40004010, 12453 0x13000000: 0x40084000, 12454 0x14000000: 0x40080000, 12455 0x15000000: 0x10, 12456 0x16000000: 0x84010, 12457 0x17000000: 0x4000, 12458 0x18000000: 0x4010, 12459 0x19000000: 0x80000, 12460 0x1a000000: 0x80010, 12461 0x1b000000: 0x40000010, 12462 0x1c000000: 0x84000, 12463 0x1d000000: 0x40004000, 12464 0x1e000000: 0x40000000, 12465 0x1f000000: 0x40084010, 12466 0x10800000: 0x84010, 12467 0x11800000: 0x80000, 12468 0x12800000: 0x40080000, 12469 0x13800000: 0x4000, 12470 0x14800000: 0x40004000, 12471 0x15800000: 0x40084010, 12472 0x16800000: 0x10, 12473 0x17800000: 0x40000000, 12474 0x18800000: 0x40084000, 12475 0x19800000: 0x40000010, 12476 0x1a800000: 0x40004010, 12477 0x1b800000: 0x80010, 12478 0x1c800000: 0x0, 12479 0x1d800000: 0x4010, 12480 0x1e800000: 0x40080010, 12481 0x1f800000: 0x84000 12482 }, 12483 { 12484 0x0: 0x104, 12485 0x100000: 0x0, 12486 0x200000: 0x4000100, 12487 0x300000: 0x10104, 12488 0x400000: 0x10004, 12489 0x500000: 0x4000004, 12490 0x600000: 0x4010104, 12491 0x700000: 0x4010000, 12492 0x800000: 0x4000000, 12493 0x900000: 0x4010100, 12494 0xa00000: 0x10100, 12495 0xb00000: 0x4010004, 12496 0xc00000: 0x4000104, 12497 0xd00000: 0x10000, 12498 0xe00000: 0x4, 12499 0xf00000: 0x100, 12500 0x80000: 0x4010100, 12501 0x180000: 0x4010004, 12502 0x280000: 0x0, 12503 0x380000: 0x4000100, 12504 0x480000: 0x4000004, 12505 0x580000: 0x10000, 12506 0x680000: 0x10004, 12507 0x780000: 0x104, 12508 0x880000: 0x4, 12509 0x980000: 0x100, 12510 0xa80000: 0x4010000, 12511 0xb80000: 0x10104, 12512 0xc80000: 0x10100, 12513 0xd80000: 0x4000104, 12514 0xe80000: 0x4010104, 12515 0xf80000: 0x4000000, 12516 0x1000000: 0x4010100, 12517 0x1100000: 0x10004, 12518 0x1200000: 0x10000, 12519 0x1300000: 0x4000100, 12520 0x1400000: 0x100, 12521 0x1500000: 0x4010104, 12522 0x1600000: 0x4000004, 12523 0x1700000: 0x0, 12524 0x1800000: 0x4000104, 12525 0x1900000: 0x4000000, 12526 0x1a00000: 0x4, 12527 0x1b00000: 0x10100, 12528 0x1c00000: 0x4010000, 12529 0x1d00000: 0x104, 12530 0x1e00000: 0x10104, 12531 0x1f00000: 0x4010004, 12532 0x1080000: 0x4000000, 12533 0x1180000: 0x104, 12534 0x1280000: 0x4010100, 12535 0x1380000: 0x0, 12536 0x1480000: 0x10004, 12537 0x1580000: 0x4000100, 12538 0x1680000: 0x100, 12539 0x1780000: 0x4010004, 12540 0x1880000: 0x10000, 12541 0x1980000: 0x4010104, 12542 0x1a80000: 0x10104, 12543 0x1b80000: 0x4000004, 12544 0x1c80000: 0x4000104, 12545 0x1d80000: 0x4010000, 12546 0x1e80000: 0x4, 12547 0x1f80000: 0x10100 12548 }, 12549 { 12550 0x0: 0x80401000, 12551 0x10000: 0x80001040, 12552 0x20000: 0x401040, 12553 0x30000: 0x80400000, 12554 0x40000: 0x0, 12555 0x50000: 0x401000, 12556 0x60000: 0x80000040, 12557 0x70000: 0x400040, 12558 0x80000: 0x80000000, 12559 0x90000: 0x400000, 12560 0xa0000: 0x40, 12561 0xb0000: 0x80001000, 12562 0xc0000: 0x80400040, 12563 0xd0000: 0x1040, 12564 0xe0000: 0x1000, 12565 0xf0000: 0x80401040, 12566 0x8000: 0x80001040, 12567 0x18000: 0x40, 12568 0x28000: 0x80400040, 12569 0x38000: 0x80001000, 12570 0x48000: 0x401000, 12571 0x58000: 0x80401040, 12572 0x68000: 0x0, 12573 0x78000: 0x80400000, 12574 0x88000: 0x1000, 12575 0x98000: 0x80401000, 12576 0xa8000: 0x400000, 12577 0xb8000: 0x1040, 12578 0xc8000: 0x80000000, 12579 0xd8000: 0x400040, 12580 0xe8000: 0x401040, 12581 0xf8000: 0x80000040, 12582 0x100000: 0x400040, 12583 0x110000: 0x401000, 12584 0x120000: 0x80000040, 12585 0x130000: 0x0, 12586 0x140000: 0x1040, 12587 0x150000: 0x80400040, 12588 0x160000: 0x80401000, 12589 0x170000: 0x80001040, 12590 0x180000: 0x80401040, 12591 0x190000: 0x80000000, 12592 0x1a0000: 0x80400000, 12593 0x1b0000: 0x401040, 12594 0x1c0000: 0x80001000, 12595 0x1d0000: 0x400000, 12596 0x1e0000: 0x40, 12597 0x1f0000: 0x1000, 12598 0x108000: 0x80400000, 12599 0x118000: 0x80401040, 12600 0x128000: 0x0, 12601 0x138000: 0x401000, 12602 0x148000: 0x400040, 12603 0x158000: 0x80000000, 12604 0x168000: 0x80001040, 12605 0x178000: 0x40, 12606 0x188000: 0x80000040, 12607 0x198000: 0x1000, 12608 0x1a8000: 0x80001000, 12609 0x1b8000: 0x80400040, 12610 0x1c8000: 0x1040, 12611 0x1d8000: 0x80401000, 12612 0x1e8000: 0x400000, 12613 0x1f8000: 0x401040 12614 }, 12615 { 12616 0x0: 0x80, 12617 0x1000: 0x1040000, 12618 0x2000: 0x40000, 12619 0x3000: 0x20000000, 12620 0x4000: 0x20040080, 12621 0x5000: 0x1000080, 12622 0x6000: 0x21000080, 12623 0x7000: 0x40080, 12624 0x8000: 0x1000000, 12625 0x9000: 0x20040000, 12626 0xa000: 0x20000080, 12627 0xb000: 0x21040080, 12628 0xc000: 0x21040000, 12629 0xd000: 0x0, 12630 0xe000: 0x1040080, 12631 0xf000: 0x21000000, 12632 0x800: 0x1040080, 12633 0x1800: 0x21000080, 12634 0x2800: 0x80, 12635 0x3800: 0x1040000, 12636 0x4800: 0x40000, 12637 0x5800: 0x20040080, 12638 0x6800: 0x21040000, 12639 0x7800: 0x20000000, 12640 0x8800: 0x20040000, 12641 0x9800: 0x0, 12642 0xa800: 0x21040080, 12643 0xb800: 0x1000080, 12644 0xc800: 0x20000080, 12645 0xd800: 0x21000000, 12646 0xe800: 0x1000000, 12647 0xf800: 0x40080, 12648 0x10000: 0x40000, 12649 0x11000: 0x80, 12650 0x12000: 0x20000000, 12651 0x13000: 0x21000080, 12652 0x14000: 0x1000080, 12653 0x15000: 0x21040000, 12654 0x16000: 0x20040080, 12655 0x17000: 0x1000000, 12656 0x18000: 0x21040080, 12657 0x19000: 0x21000000, 12658 0x1a000: 0x1040000, 12659 0x1b000: 0x20040000, 12660 0x1c000: 0x40080, 12661 0x1d000: 0x20000080, 12662 0x1e000: 0x0, 12663 0x1f000: 0x1040080, 12664 0x10800: 0x21000080, 12665 0x11800: 0x1000000, 12666 0x12800: 0x1040000, 12667 0x13800: 0x20040080, 12668 0x14800: 0x20000000, 12669 0x15800: 0x1040080, 12670 0x16800: 0x80, 12671 0x17800: 0x21040000, 12672 0x18800: 0x40080, 12673 0x19800: 0x21040080, 12674 0x1a800: 0x0, 12675 0x1b800: 0x21000000, 12676 0x1c800: 0x1000080, 12677 0x1d800: 0x40000, 12678 0x1e800: 0x20040000, 12679 0x1f800: 0x20000080 12680 }, 12681 { 12682 0x0: 0x10000008, 12683 0x100: 0x2000, 12684 0x200: 0x10200000, 12685 0x300: 0x10202008, 12686 0x400: 0x10002000, 12687 0x500: 0x200000, 12688 0x600: 0x200008, 12689 0x700: 0x10000000, 12690 0x800: 0x0, 12691 0x900: 0x10002008, 12692 0xa00: 0x202000, 12693 0xb00: 0x8, 12694 0xc00: 0x10200008, 12695 0xd00: 0x202008, 12696 0xe00: 0x2008, 12697 0xf00: 0x10202000, 12698 0x80: 0x10200000, 12699 0x180: 0x10202008, 12700 0x280: 0x8, 12701 0x380: 0x200000, 12702 0x480: 0x202008, 12703 0x580: 0x10000008, 12704 0x680: 0x10002000, 12705 0x780: 0x2008, 12706 0x880: 0x200008, 12707 0x980: 0x2000, 12708 0xa80: 0x10002008, 12709 0xb80: 0x10200008, 12710 0xc80: 0x0, 12711 0xd80: 0x10202000, 12712 0xe80: 0x202000, 12713 0xf80: 0x10000000, 12714 0x1000: 0x10002000, 12715 0x1100: 0x10200008, 12716 0x1200: 0x10202008, 12717 0x1300: 0x2008, 12718 0x1400: 0x200000, 12719 0x1500: 0x10000000, 12720 0x1600: 0x10000008, 12721 0x1700: 0x202000, 12722 0x1800: 0x202008, 12723 0x1900: 0x0, 12724 0x1a00: 0x8, 12725 0x1b00: 0x10200000, 12726 0x1c00: 0x2000, 12727 0x1d00: 0x10002008, 12728 0x1e00: 0x10202000, 12729 0x1f00: 0x200008, 12730 0x1080: 0x8, 12731 0x1180: 0x202000, 12732 0x1280: 0x200000, 12733 0x1380: 0x10000008, 12734 0x1480: 0x10002000, 12735 0x1580: 0x2008, 12736 0x1680: 0x10202008, 12737 0x1780: 0x10200000, 12738 0x1880: 0x10202000, 12739 0x1980: 0x10200008, 12740 0x1a80: 0x2000, 12741 0x1b80: 0x202008, 12742 0x1c80: 0x200008, 12743 0x1d80: 0x0, 12744 0x1e80: 0x10000000, 12745 0x1f80: 0x10002008 12746 }, 12747 { 12748 0x0: 0x100000, 12749 0x10: 0x2000401, 12750 0x20: 0x400, 12751 0x30: 0x100401, 12752 0x40: 0x2100401, 12753 0x50: 0x0, 12754 0x60: 0x1, 12755 0x70: 0x2100001, 12756 0x80: 0x2000400, 12757 0x90: 0x100001, 12758 0xa0: 0x2000001, 12759 0xb0: 0x2100400, 12760 0xc0: 0x2100000, 12761 0xd0: 0x401, 12762 0xe0: 0x100400, 12763 0xf0: 0x2000000, 12764 0x8: 0x2100001, 12765 0x18: 0x0, 12766 0x28: 0x2000401, 12767 0x38: 0x2100400, 12768 0x48: 0x100000, 12769 0x58: 0x2000001, 12770 0x68: 0x2000000, 12771 0x78: 0x401, 12772 0x88: 0x100401, 12773 0x98: 0x2000400, 12774 0xa8: 0x2100000, 12775 0xb8: 0x100001, 12776 0xc8: 0x400, 12777 0xd8: 0x2100401, 12778 0xe8: 0x1, 12779 0xf8: 0x100400, 12780 0x100: 0x2000000, 12781 0x110: 0x100000, 12782 0x120: 0x2000401, 12783 0x130: 0x2100001, 12784 0x140: 0x100001, 12785 0x150: 0x2000400, 12786 0x160: 0x2100400, 12787 0x170: 0x100401, 12788 0x180: 0x401, 12789 0x190: 0x2100401, 12790 0x1a0: 0x100400, 12791 0x1b0: 0x1, 12792 0x1c0: 0x0, 12793 0x1d0: 0x2100000, 12794 0x1e0: 0x2000001, 12795 0x1f0: 0x400, 12796 0x108: 0x100400, 12797 0x118: 0x2000401, 12798 0x128: 0x2100001, 12799 0x138: 0x1, 12800 0x148: 0x2000000, 12801 0x158: 0x100000, 12802 0x168: 0x401, 12803 0x178: 0x2100400, 12804 0x188: 0x2000001, 12805 0x198: 0x2100000, 12806 0x1a8: 0x0, 12807 0x1b8: 0x2100401, 12808 0x1c8: 0x100401, 12809 0x1d8: 0x400, 12810 0x1e8: 0x2000400, 12811 0x1f8: 0x100001 12812 }, 12813 { 12814 0x0: 0x8000820, 12815 0x1: 0x20000, 12816 0x2: 0x8000000, 12817 0x3: 0x20, 12818 0x4: 0x20020, 12819 0x5: 0x8020820, 12820 0x6: 0x8020800, 12821 0x7: 0x800, 12822 0x8: 0x8020000, 12823 0x9: 0x8000800, 12824 0xa: 0x20800, 12825 0xb: 0x8020020, 12826 0xc: 0x820, 12827 0xd: 0x0, 12828 0xe: 0x8000020, 12829 0xf: 0x20820, 12830 0x80000000: 0x800, 12831 0x80000001: 0x8020820, 12832 0x80000002: 0x8000820, 12833 0x80000003: 0x8000000, 12834 0x80000004: 0x8020000, 12835 0x80000005: 0x20800, 12836 0x80000006: 0x20820, 12837 0x80000007: 0x20, 12838 0x80000008: 0x8000020, 12839 0x80000009: 0x820, 12840 0x8000000a: 0x20020, 12841 0x8000000b: 0x8020800, 12842 0x8000000c: 0x0, 12843 0x8000000d: 0x8020020, 12844 0x8000000e: 0x8000800, 12845 0x8000000f: 0x20000, 12846 0x10: 0x20820, 12847 0x11: 0x8020800, 12848 0x12: 0x20, 12849 0x13: 0x800, 12850 0x14: 0x8000800, 12851 0x15: 0x8000020, 12852 0x16: 0x8020020, 12853 0x17: 0x20000, 12854 0x18: 0x0, 12855 0x19: 0x20020, 12856 0x1a: 0x8020000, 12857 0x1b: 0x8000820, 12858 0x1c: 0x8020820, 12859 0x1d: 0x20800, 12860 0x1e: 0x820, 12861 0x1f: 0x8000000, 12862 0x80000010: 0x20000, 12863 0x80000011: 0x800, 12864 0x80000012: 0x8020020, 12865 0x80000013: 0x20820, 12866 0x80000014: 0x20, 12867 0x80000015: 0x8020000, 12868 0x80000016: 0x8000000, 12869 0x80000017: 0x8000820, 12870 0x80000018: 0x8020820, 12871 0x80000019: 0x8000020, 12872 0x8000001a: 0x8000800, 12873 0x8000001b: 0x0, 12874 0x8000001c: 0x20800, 12875 0x8000001d: 0x820, 12876 0x8000001e: 0x20020, 12877 0x8000001f: 0x8020800 12878 } 12879 ]; 12880 12881 // Masks that select the SBOX input 12882 var SBOX_MASK = [ 12883 0xf8000001, 0x1f800000, 0x01f80000, 0x001f8000, 12884 0x0001f800, 0x00001f80, 0x000001f8, 0x8000001f 12885 ]; 12886 12887 /** 12888 * DES block cipher algorithm. 12889 */ 12890 var DES = C_algo.DES = BlockCipher.extend({ 12891 _doReset: function () { 12892 // Shortcuts 12893 var key = this._key; 12894 var keyWords = key.words; 12895 12896 // Select 56 bits according to PC1 12897 var keyBits = []; 12898 for (var i = 0; i < 56; i++) { 12899 var keyBitPos = PC1[i] - 1; 12900 keyBits[i] = (keyWords[keyBitPos >>> 5] >>> (31 - keyBitPos % 32)) & 1; 12901 } 12902 12903 // Assemble 16 subkeys 12904 var subKeys = this._subKeys = []; 12905 for (var nSubKey = 0; nSubKey < 16; nSubKey++) { 12906 // Create subkey 12907 var subKey = subKeys[nSubKey] = []; 12908 12909 // Shortcut 12910 var bitShift = BIT_SHIFTS[nSubKey]; 12911 12912 // Select 48 bits according to PC2 12913 for (var i = 0; i < 24; i++) { 12914 // Select from the left 28 key bits 12915 subKey[(i / 6) | 0] |= keyBits[((PC2[i] - 1) + bitShift) % 28] << (31 - i % 6); 12916 12917 // Select from the right 28 key bits 12918 subKey[4 + ((i / 6) | 0)] |= keyBits[28 + (((PC2[i + 24] - 1) + bitShift) % 28)] << (31 - i % 6); 12919 } 12920 12921 // Since each subkey is applied to an expanded 32-bit input, 12922 // the subkey can be broken into 8 values scaled to 32-bits, 12923 // which allows the key to be used without expansion 12924 subKey[0] = (subKey[0] << 1) | (subKey[0] >>> 31); 12925 for (var i = 1; i < 7; i++) { 12926 subKey[i] = subKey[i] >>> ((i - 1) * 4 + 3); 12927 } 12928 subKey[7] = (subKey[7] << 5) | (subKey[7] >>> 27); 12929 } 12930 12931 // Compute inverse subkeys 12932 var invSubKeys = this._invSubKeys = []; 12933 for (var i = 0; i < 16; i++) { 12934 invSubKeys[i] = subKeys[15 - i]; 12935 } 12936 }, 12937 12938 encryptBlock: function (M, offset) { 12939 this._doCryptBlock(M, offset, this._subKeys); 12940 }, 12941 12942 decryptBlock: function (M, offset) { 12943 this._doCryptBlock(M, offset, this._invSubKeys); 12944 }, 12945 12946 _doCryptBlock: function (M, offset, subKeys) { 12947 // Get input 12948 this._lBlock = M[offset]; 12949 this._rBlock = M[offset + 1]; 12950 12951 // Initial permutation 12952 exchangeLR.call(this, 4, 0x0f0f0f0f); 12953 exchangeLR.call(this, 16, 0x0000ffff); 12954 exchangeRL.call(this, 2, 0x33333333); 12955 exchangeRL.call(this, 8, 0x00ff00ff); 12956 exchangeLR.call(this, 1, 0x55555555); 12957 12958 // Rounds 12959 for (var round = 0; round < 16; round++) { 12960 // Shortcuts 12961 var subKey = subKeys[round]; 12962 var lBlock = this._lBlock; 12963 var rBlock = this._rBlock; 12964 12965 // Feistel function 12966 var f = 0; 12967 for (var i = 0; i < 8; i++) { 12968 f |= SBOX_P[i][((rBlock ^ subKey[i]) & SBOX_MASK[i]) >>> 0]; 12969 } 12970 this._lBlock = rBlock; 12971 this._rBlock = lBlock ^ f; 12972 } 12973 12974 // Undo swap from last round 12975 var t = this._lBlock; 12976 this._lBlock = this._rBlock; 12977 this._rBlock = t; 12978 12979 // Final permutation 12980 exchangeLR.call(this, 1, 0x55555555); 12981 exchangeRL.call(this, 8, 0x00ff00ff); 12982 exchangeRL.call(this, 2, 0x33333333); 12983 exchangeLR.call(this, 16, 0x0000ffff); 12984 exchangeLR.call(this, 4, 0x0f0f0f0f); 12985 12986 // Set output 12987 M[offset] = this._lBlock; 12988 M[offset + 1] = this._rBlock; 12989 }, 12990 12991 keySize: 64/32, 12992 12993 ivSize: 64/32, 12994 12995 blockSize: 64/32 12996 }); 12997 12998 // Swap bits across the left and right words 12999 function exchangeLR(offset, mask) { 13000 var t = ((this._lBlock >>> offset) ^ this._rBlock) & mask; 13001 this._rBlock ^= t; 13002 this._lBlock ^= t << offset; 13003 } 13004 13005 function exchangeRL(offset, mask) { 13006 var t = ((this._rBlock >>> offset) ^ this._lBlock) & mask; 13007 this._lBlock ^= t; 13008 this._rBlock ^= t << offset; 13009 } 13010 13011 /** 13012 * Shortcut functions to the cipher's object interface. 13013 * 13014 * @example 13015 * 13016 * var ciphertext = CryptoJS.DES.encrypt(message, key, cfg); 13017 * var plaintext = CryptoJS.DES.decrypt(ciphertext, key, cfg); 13018 */ 13019 C.DES = BlockCipher._createHelper(DES); 13020 13021 /** 13022 * Triple-DES block cipher algorithm. 13023 */ 13024 var TripleDES = C_algo.TripleDES = BlockCipher.extend({ 13025 _doReset: function () { 13026 // Shortcuts 13027 var key = this._key; 13028 var keyWords = key.words; 13029 13030 // Create DES instances 13031 this._des1 = DES.createEncryptor(WordArray.create(keyWords.slice(0, 2))); 13032 this._des2 = DES.createEncryptor(WordArray.create(keyWords.slice(2, 4))); 13033 this._des3 = DES.createEncryptor(WordArray.create(keyWords.slice(4, 6))); 13034 }, 13035 13036 encryptBlock: function (M, offset) { 13037 this._des1.encryptBlock(M, offset); 13038 this._des2.decryptBlock(M, offset); 13039 this._des3.encryptBlock(M, offset); 13040 }, 13041 13042 decryptBlock: function (M, offset) { 13043 this._des3.decryptBlock(M, offset); 13044 this._des2.encryptBlock(M, offset); 13045 this._des1.decryptBlock(M, offset); 13046 }, 13047 13048 keySize: 192/32, 13049 13050 ivSize: 64/32, 13051 13052 blockSize: 64/32 13053 }); 13054 13055 /** 13056 * Shortcut functions to the cipher's object interface. 13057 * 13058 * @example 13059 * 13060 * var ciphertext = CryptoJS.TripleDES.encrypt(message, key, cfg); 13061 * var plaintext = CryptoJS.TripleDES.decrypt(ciphertext, key, cfg); 13062 */ 13063 C.TripleDES = BlockCipher._createHelper(TripleDES); 13064 }()); 13065 13066 13067 return CryptoJS.TripleDES; 13068 13069 })); 13070 },{"./cipher-core":52,"./core":53,"./enc-base64":54,"./evpkdf":56,"./md5":61}],84:[function(require,module,exports){ 13071 ;(function (root, factory) { 13072 if (typeof exports === "object") { 13073 // CommonJS 13074 module.exports = exports = factory(require("./core")); 13075 } 13076 else if (typeof define === "function" && define.amd) { 13077 // AMD 13078 define(["./core"], factory); 13079 } 13080 else { 13081 // Global (browser) 13082 factory(root.CryptoJS); 13083 } 13084 }(this, function (CryptoJS) { 13085 13086 (function (undefined) { 13087 // Shortcuts 13088 var C = CryptoJS; 13089 var C_lib = C.lib; 13090 var Base = C_lib.Base; 13091 var X32WordArray = C_lib.WordArray; 13092 13093 /** 13094 * x64 namespace. 13095 */ 13096 var C_x64 = C.x64 = {}; 13097 13098 /** 13099 * A 64-bit word. 13100 */ 13101 var X64Word = C_x64.Word = Base.extend({ 13102 /** 13103 * Initializes a newly created 64-bit word. 13104 * 13105 * @param {number} high The high 32 bits. 13106 * @param {number} low The low 32 bits. 13107 * 13108 * @example 13109 * 13110 * var x64Word = CryptoJS.x64.Word.create(0x00010203, 0x04050607); 13111 */ 13112 init: function (high, low) { 13113 this.high = high; 13114 this.low = low; 13115 } 13116 13117 /** 13118 * Bitwise NOTs this word. 13119 * 13120 * @return {X64Word} A new x64-Word object after negating. 13121 * 13122 * @example 13123 * 13124 * var negated = x64Word.not(); 13125 */ 13126 // not: function () { 13127 // var high = ~this.high; 13128 // var low = ~this.low; 13129 13130 // return X64Word.create(high, low); 13131 // }, 13132 13133 /** 13134 * Bitwise ANDs this word with the passed word. 13135 * 13136 * @param {X64Word} word The x64-Word to AND with this word. 13137 * 13138 * @return {X64Word} A new x64-Word object after ANDing. 13139 * 13140 * @example 13141 * 13142 * var anded = x64Word.and(anotherX64Word); 13143 */ 13144 // and: function (word) { 13145 // var high = this.high & word.high; 13146 // var low = this.low & word.low; 13147 13148 // return X64Word.create(high, low); 13149 // }, 13150 13151 /** 13152 * Bitwise ORs this word with the passed word. 13153 * 13154 * @param {X64Word} word The x64-Word to OR with this word. 13155 * 13156 * @return {X64Word} A new x64-Word object after ORing. 13157 * 13158 * @example 13159 * 13160 * var ored = x64Word.or(anotherX64Word); 13161 */ 13162 // or: function (word) { 13163 // var high = this.high | word.high; 13164 // var low = this.low | word.low; 13165 13166 // return X64Word.create(high, low); 13167 // }, 13168 13169 /** 13170 * Bitwise XORs this word with the passed word. 13171 * 13172 * @param {X64Word} word The x64-Word to XOR with this word. 13173 * 13174 * @return {X64Word} A new x64-Word object after XORing. 13175 * 13176 * @example 13177 * 13178 * var xored = x64Word.xor(anotherX64Word); 13179 */ 13180 // xor: function (word) { 13181 // var high = this.high ^ word.high; 13182 // var low = this.low ^ word.low; 13183 13184 // return X64Word.create(high, low); 13185 // }, 13186 13187 /** 13188 * Shifts this word n bits to the left. 13189 * 13190 * @param {number} n The number of bits to shift. 13191 * 13192 * @return {X64Word} A new x64-Word object after shifting. 13193 * 13194 * @example 13195 * 13196 * var shifted = x64Word.shiftL(25); 13197 */ 13198 // shiftL: function (n) { 13199 // if (n < 32) { 13200 // var high = (this.high << n) | (this.low >>> (32 - n)); 13201 // var low = this.low << n; 13202 // } else { 13203 // var high = this.low << (n - 32); 13204 // var low = 0; 13205 // } 13206 13207 // return X64Word.create(high, low); 13208 // }, 13209 13210 /** 13211 * Shifts this word n bits to the right. 13212 * 13213 * @param {number} n The number of bits to shift. 13214 * 13215 * @return {X64Word} A new x64-Word object after shifting. 13216 * 13217 * @example 13218 * 13219 * var shifted = x64Word.shiftR(7); 13220 */ 13221 // shiftR: function (n) { 13222 // if (n < 32) { 13223 // var low = (this.low >>> n) | (this.high << (32 - n)); 13224 // var high = this.high >>> n; 13225 // } else { 13226 // var low = this.high >>> (n - 32); 13227 // var high = 0; 13228 // } 13229 13230 // return X64Word.create(high, low); 13231 // }, 13232 13233 /** 13234 * Rotates this word n bits to the left. 13235 * 13236 * @param {number} n The number of bits to rotate. 13237 * 13238 * @return {X64Word} A new x64-Word object after rotating. 13239 * 13240 * @example 13241 * 13242 * var rotated = x64Word.rotL(25); 13243 */ 13244 // rotL: function (n) { 13245 // return this.shiftL(n).or(this.shiftR(64 - n)); 13246 // }, 13247 13248 /** 13249 * Rotates this word n bits to the right. 13250 * 13251 * @param {number} n The number of bits to rotate. 13252 * 13253 * @return {X64Word} A new x64-Word object after rotating. 13254 * 13255 * @example 13256 * 13257 * var rotated = x64Word.rotR(7); 13258 */ 13259 // rotR: function (n) { 13260 // return this.shiftR(n).or(this.shiftL(64 - n)); 13261 // }, 13262 13263 /** 13264 * Adds this word with the passed word. 13265 * 13266 * @param {X64Word} word The x64-Word to add with this word. 13267 * 13268 * @return {X64Word} A new x64-Word object after adding. 13269 * 13270 * @example 13271 * 13272 * var added = x64Word.add(anotherX64Word); 13273 */ 13274 // add: function (word) { 13275 // var low = (this.low + word.low) | 0; 13276 // var carry = (low >>> 0) < (this.low >>> 0) ? 1 : 0; 13277 // var high = (this.high + word.high + carry) | 0; 13278 13279 // return X64Word.create(high, low); 13280 // } 13281 }); 13282 13283 /** 13284 * An array of 64-bit words. 13285 * 13286 * @property {Array} words The array of CryptoJS.x64.Word objects. 13287 * @property {number} sigBytes The number of significant bytes in this word array. 13288 */ 13289 var X64WordArray = C_x64.WordArray = Base.extend({ 13290 /** 13291 * Initializes a newly created word array. 13292 * 13293 * @param {Array} words (Optional) An array of CryptoJS.x64.Word objects. 13294 * @param {number} sigBytes (Optional) The number of significant bytes in the words. 13295 * 13296 * @example 13297 * 13298 * var wordArray = CryptoJS.x64.WordArray.create(); 13299 * 13300 * var wordArray = CryptoJS.x64.WordArray.create([ 13301 * CryptoJS.x64.Word.create(0x00010203, 0x04050607), 13302 * CryptoJS.x64.Word.create(0x18191a1b, 0x1c1d1e1f) 13303 * ]); 13304 * 13305 * var wordArray = CryptoJS.x64.WordArray.create([ 13306 * CryptoJS.x64.Word.create(0x00010203, 0x04050607), 13307 * CryptoJS.x64.Word.create(0x18191a1b, 0x1c1d1e1f) 13308 * ], 10); 13309 */ 13310 init: function (words, sigBytes) { 13311 words = this.words = words || []; 13312 13313 if (sigBytes != undefined) { 13314 this.sigBytes = sigBytes; 13315 } else { 13316 this.sigBytes = words.length * 8; 13317 } 13318 }, 13319 13320 /** 13321 * Converts this 64-bit word array to a 32-bit word array. 13322 * 13323 * @return {CryptoJS.lib.WordArray} This word array's data as a 32-bit word array. 13324 * 13325 * @example 13326 * 13327 * var x32WordArray = x64WordArray.toX32(); 13328 */ 13329 toX32: function () { 13330 // Shortcuts 13331 var x64Words = this.words; 13332 var x64WordsLength = x64Words.length; 13333 13334 // Convert 13335 var x32Words = []; 13336 for (var i = 0; i < x64WordsLength; i++) { 13337 var x64Word = x64Words[i]; 13338 x32Words.push(x64Word.high); 13339 x32Words.push(x64Word.low); 13340 } 13341 13342 return X32WordArray.create(x32Words, this.sigBytes); 13343 }, 13344 13345 /** 13346 * Creates a copy of this word array. 13347 * 13348 * @return {X64WordArray} The clone. 13349 * 13350 * @example 13351 * 13352 * var clone = x64WordArray.clone(); 13353 */ 13354 clone: function () { 13355 var clone = Base.clone.call(this); 13356 13357 // Clone "words" array 13358 var words = clone.words = this.words.slice(0); 13359 13360 // Clone each X64Word object 13361 var wordsLength = words.length; 13362 for (var i = 0; i < wordsLength; i++) { 13363 words[i] = words[i].clone(); 13364 } 13365 13366 return clone; 13367 } 13368 }); 13369 }()); 13370 13371 13372 return CryptoJS; 13373 13374 })); 13375 },{"./core":53}],85:[function(require,module,exports){ 13376 /*! https://mths.be/utf8js v2.1.2 by @mathias */ 13377 ;(function(root) { 13378 13379 // Detect free variables `exports` 13380 var freeExports = typeof exports == 'object' && exports; 13381 13382 // Detect free variable `module` 13383 var freeModule = typeof module == 'object' && module && 13384 module.exports == freeExports && module; 13385 13386 // Detect free variable `global`, from Node.js or Browserified code, 13387 // and use it as `root` 13388 var freeGlobal = typeof global == 'object' && global; 13389 if (freeGlobal.global === freeGlobal || freeGlobal.window === freeGlobal) { 13390 root = freeGlobal; 13391 } 13392 13393 /*--------------------------------------------------------------------------*/ 13394 13395 var stringFromCharCode = String.fromCharCode; 13396 13397 // Taken from https://mths.be/punycode 13398 function ucs2decode(string) { 13399 var output = []; 13400 var counter = 0; 13401 var length = string.length; 13402 var value; 13403 var extra; 13404 while (counter < length) { 13405 value = string.charCodeAt(counter++); 13406 if (value >= 0xD800 && value <= 0xDBFF && counter < length) { 13407 // high surrogate, and there is a next character 13408 extra = string.charCodeAt(counter++); 13409 if ((extra & 0xFC00) == 0xDC00) { // low surrogate 13410 output.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000); 13411 } else { 13412 // unmatched surrogate; only append this code unit, in case the next 13413 // code unit is the high surrogate of a surrogate pair 13414 output.push(value); 13415 counter--; 13416 } 13417 } else { 13418 output.push(value); 13419 } 13420 } 13421 return output; 13422 } 13423 13424 // Taken from https://mths.be/punycode 13425 function ucs2encode(array) { 13426 var length = array.length; 13427 var index = -1; 13428 var value; 13429 var output = ''; 13430 while (++index < length) { 13431 value = array[index]; 13432 if (value > 0xFFFF) { 13433 value -= 0x10000; 13434 output += stringFromCharCode(value >>> 10 & 0x3FF | 0xD800); 13435 value = 0xDC00 | value & 0x3FF; 13436 } 13437 output += stringFromCharCode(value); 13438 } 13439 return output; 13440 } 13441 13442 function checkScalarValue(codePoint) { 13443 if (codePoint >= 0xD800 && codePoint <= 0xDFFF) { 13444 throw Error( 13445 'Lone surrogate U+' + codePoint.toString(16).toUpperCase() + 13446 ' is not a scalar value' 13447 ); 13448 } 13449 } 13450 /*--------------------------------------------------------------------------*/ 13451 13452 function createByte(codePoint, shift) { 13453 return stringFromCharCode(((codePoint >> shift) & 0x3F) | 0x80); 13454 } 13455 13456 function encodeCodePoint(codePoint) { 13457 if ((codePoint & 0xFFFFFF80) == 0) { // 1-byte sequence 13458 return stringFromCharCode(codePoint); 13459 } 13460 var symbol = ''; 13461 if ((codePoint & 0xFFFFF800) == 0) { // 2-byte sequence 13462 symbol = stringFromCharCode(((codePoint >> 6) & 0x1F) | 0xC0); 13463 } 13464 else if ((codePoint & 0xFFFF0000) == 0) { // 3-byte sequence 13465 checkScalarValue(codePoint); 13466 symbol = stringFromCharCode(((codePoint >> 12) & 0x0F) | 0xE0); 13467 symbol += createByte(codePoint, 6); 13468 } 13469 else if ((codePoint & 0xFFE00000) == 0) { // 4-byte sequence 13470 symbol = stringFromCharCode(((codePoint >> 18) & 0x07) | 0xF0); 13471 symbol += createByte(codePoint, 12); 13472 symbol += createByte(codePoint, 6); 13473 } 13474 symbol += stringFromCharCode((codePoint & 0x3F) | 0x80); 13475 return symbol; 13476 } 13477 13478 function utf8encode(string) { 13479 var codePoints = ucs2decode(string); 13480 var length = codePoints.length; 13481 var index = -1; 13482 var codePoint; 13483 var byteString = ''; 13484 while (++index < length) { 13485 codePoint = codePoints[index]; 13486 byteString += encodeCodePoint(codePoint); 13487 } 13488 return byteString; 13489 } 13490 13491 /*--------------------------------------------------------------------------*/ 13492 13493 function readContinuationByte() { 13494 if (byteIndex >= byteCount) { 13495 throw Error('Invalid byte index'); 13496 } 13497 13498 var continuationByte = byteArray[byteIndex] & 0xFF; 13499 byteIndex++; 13500 13501 if ((continuationByte & 0xC0) == 0x80) { 13502 return continuationByte & 0x3F; 13503 } 13504 13505 // If we end up here, it’s not a continuation byte 13506 throw Error('Invalid continuation byte'); 13507 } 13508 13509 function decodeSymbol() { 13510 var byte1; 13511 var byte2; 13512 var byte3; 13513 var byte4; 13514 var codePoint; 13515 13516 if (byteIndex > byteCount) { 13517 throw Error('Invalid byte index'); 13518 } 13519 13520 if (byteIndex == byteCount) { 13521 return false; 13522 } 13523 13524 // Read first byte 13525 byte1 = byteArray[byteIndex] & 0xFF; 13526 byteIndex++; 13527 13528 // 1-byte sequence (no continuation bytes) 13529 if ((byte1 & 0x80) == 0) { 13530 return byte1; 13531 } 13532 13533 // 2-byte sequence 13534 if ((byte1 & 0xE0) == 0xC0) { 13535 byte2 = readContinuationByte(); 13536 codePoint = ((byte1 & 0x1F) << 6) | byte2; 13537 if (codePoint >= 0x80) { 13538 return codePoint; 13539 } else { 13540 throw Error('Invalid continuation byte'); 13541 } 13542 } 13543 13544 // 3-byte sequence (may include unpaired surrogates) 13545 if ((byte1 & 0xF0) == 0xE0) { 13546 byte2 = readContinuationByte(); 13547 byte3 = readContinuationByte(); 13548 codePoint = ((byte1 & 0x0F) << 12) | (byte2 << 6) | byte3; 13549 if (codePoint >= 0x0800) { 13550 checkScalarValue(codePoint); 13551 return codePoint; 13552 } else { 13553 throw Error('Invalid continuation byte'); 13554 } 13555 } 13556 13557 // 4-byte sequence 13558 if ((byte1 & 0xF8) == 0xF0) { 13559 byte2 = readContinuationByte(); 13560 byte3 = readContinuationByte(); 13561 byte4 = readContinuationByte(); 13562 codePoint = ((byte1 & 0x07) << 0x12) | (byte2 << 0x0C) | 13563 (byte3 << 0x06) | byte4; 13564 if (codePoint >= 0x010000 && codePoint <= 0x10FFFF) { 13565 return codePoint; 13566 } 13567 } 13568 13569 throw Error('Invalid UTF-8 detected'); 13570 } 13571 13572 var byteArray; 13573 var byteCount; 13574 var byteIndex; 13575 function utf8decode(byteString) { 13576 byteArray = ucs2decode(byteString); 13577 byteCount = byteArray.length; 13578 byteIndex = 0; 13579 var codePoints = []; 13580 var tmp; 13581 while ((tmp = decodeSymbol()) !== false) { 13582 codePoints.push(tmp); 13583 } 13584 return ucs2encode(codePoints); 13585 } 13586 13587 /*--------------------------------------------------------------------------*/ 13588 13589 var utf8 = { 13590 'version': '2.1.2', 13591 'encode': utf8encode, 13592 'decode': utf8decode 13593 }; 13594 13595 // Some AMD build optimizers, like r.js, check for specific condition patterns 13596 // like the following: 13597 if ( 13598 typeof define == 'function' && 13599 typeof define.amd == 'object' && 13600 define.amd 13601 ) { 13602 define(function() { 13603 return utf8; 13604 }); 13605 } else if (freeExports && !freeExports.nodeType) { 13606 if (freeModule) { // in Node.js or RingoJS v0.8.0+ 13607 freeModule.exports = utf8; 13608 } else { // in Narwhal or RingoJS v0.7.0- 13609 var object = {}; 13610 var hasOwnProperty = object.hasOwnProperty; 13611 for (var key in utf8) { 13612 hasOwnProperty.call(utf8, key) && (freeExports[key] = utf8[key]); 13613 } 13614 } 13615 } else { // in Rhino or a web browser 13616 root.utf8 = utf8; 13617 } 13618 13619 }(this)); 13620 13621 },{}],86:[function(require,module,exports){ 13622 module.exports = XMLHttpRequest; 13623 13624 },{}],"bignumber.js":[function(require,module,exports){ 13625 'use strict'; 13626 13627 module.exports = BigNumber; // jshint ignore:line 13628 13629 13630 },{}],"web3":[function(require,module,exports){ 13631 var Web3 = require('./lib/web3'); 13632 13633 // don't override global variable 13634 if (typeof window !== 'undefined' && typeof window.Web3 === 'undefined') { 13635 window.Web3 = Web3; 13636 } 13637 13638 module.exports = Web3; 13639 13640 },{"./lib/web3":22}]},{},["web3"]) 13641