gitee.com/liu-zhao234568/cntest@v1.0.0/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 return tx; 3794 }; 3795 3796 /** 3797 * Formats the output of a transaction receipt to its proper values 3798 * 3799 * @method outputTransactionReceiptFormatter 3800 * @param {Object} receipt 3801 * @returns {Object} 3802 */ 3803 var outputTransactionReceiptFormatter = function (receipt){ 3804 if(receipt.blockNumber !== null) 3805 receipt.blockNumber = utils.toDecimal(receipt.blockNumber); 3806 if(receipt.transactionIndex !== null) 3807 receipt.transactionIndex = utils.toDecimal(receipt.transactionIndex); 3808 receipt.cumulativeGasUsed = utils.toDecimal(receipt.cumulativeGasUsed); 3809 receipt.gasUsed = utils.toDecimal(receipt.gasUsed); 3810 if(receipt.effectiveGasPrice !== undefined) { 3811 receipt.effectiveGasPrice = utils.toBigNumber(receipt.effectiveGasPrice); 3812 } 3813 if(utils.isArray(receipt.logs)) { 3814 receipt.logs = receipt.logs.map(function(log){ 3815 return outputLogFormatter(log); 3816 }); 3817 } 3818 3819 return receipt; 3820 }; 3821 3822 /** 3823 * Formats the output of a block to its proper values 3824 * 3825 * @method outputBlockFormatter 3826 * @param {Object} block 3827 * @returns {Object} 3828 */ 3829 var outputBlockFormatter = function(block) { 3830 // transform to number 3831 if (block.baseFeePerGas !== undefined) { 3832 block.baseFeePerGas = utils.toBigNumber(block.baseFeePerGas); 3833 } 3834 block.gasLimit = utils.toDecimal(block.gasLimit); 3835 block.gasUsed = utils.toDecimal(block.gasUsed); 3836 block.size = utils.toDecimal(block.size); 3837 block.timestamp = utils.toDecimal(block.timestamp); 3838 if(block.number !== null) 3839 block.number = utils.toDecimal(block.number); 3840 3841 block.difficulty = utils.toBigNumber(block.difficulty); 3842 block.totalDifficulty = utils.toBigNumber(block.totalDifficulty); 3843 3844 if (utils.isArray(block.transactions)) { 3845 block.transactions.forEach(function(item){ 3846 if(!utils.isString(item)) 3847 return outputTransactionFormatter(item); 3848 }); 3849 } 3850 3851 return block; 3852 }; 3853 3854 /** 3855 * Formats the output of a log 3856 * 3857 * @method outputLogFormatter 3858 * @param {Object} log object 3859 * @returns {Object} log 3860 */ 3861 var outputLogFormatter = function(log) { 3862 if(log.blockNumber) 3863 log.blockNumber = utils.toDecimal(log.blockNumber); 3864 if(log.transactionIndex) 3865 log.transactionIndex = utils.toDecimal(log.transactionIndex); 3866 if(log.logIndex) 3867 log.logIndex = utils.toDecimal(log.logIndex); 3868 3869 return log; 3870 }; 3871 3872 /** 3873 * Formats the input of a whisper post and converts all values to HEX 3874 * 3875 * @method inputPostFormatter 3876 * @param {Object} transaction object 3877 * @returns {Object} 3878 */ 3879 var inputPostFormatter = function(post) { 3880 3881 // post.payload = utils.toHex(post.payload); 3882 post.ttl = utils.fromDecimal(post.ttl); 3883 post.workToProve = utils.fromDecimal(post.workToProve); 3884 post.priority = utils.fromDecimal(post.priority); 3885 3886 // fallback 3887 if (!utils.isArray(post.topics)) { 3888 post.topics = post.topics ? [post.topics] : []; 3889 } 3890 3891 // format the following options 3892 post.topics = post.topics.map(function(topic){ 3893 // convert only if not hex 3894 return (topic.indexOf('0x') === 0) ? topic : utils.fromUtf8(topic); 3895 }); 3896 3897 return post; 3898 }; 3899 3900 /** 3901 * Formats the output of a received post message 3902 * 3903 * @method outputPostFormatter 3904 * @param {Object} 3905 * @returns {Object} 3906 */ 3907 var outputPostFormatter = function(post){ 3908 3909 post.expiry = utils.toDecimal(post.expiry); 3910 post.sent = utils.toDecimal(post.sent); 3911 post.ttl = utils.toDecimal(post.ttl); 3912 post.workProved = utils.toDecimal(post.workProved); 3913 // post.payloadRaw = post.payload; 3914 // post.payload = utils.toAscii(post.payload); 3915 3916 // if (utils.isJson(post.payload)) { 3917 // post.payload = JSON.parse(post.payload); 3918 // } 3919 3920 // format the following options 3921 if (!post.topics) { 3922 post.topics = []; 3923 } 3924 post.topics = post.topics.map(function(topic){ 3925 return utils.toAscii(topic); 3926 }); 3927 3928 return post; 3929 }; 3930 3931 var inputAddressFormatter = function (address) { 3932 var iban = new Iban(address); 3933 if (iban.isValid() && iban.isDirect()) { 3934 return '0x' + iban.address(); 3935 } else if (utils.isStrictAddress(address)) { 3936 return address; 3937 } else if (utils.isAddress(address)) { 3938 return '0x' + address; 3939 } 3940 throw new Error('invalid address'); 3941 }; 3942 3943 3944 var outputSyncingFormatter = function(result) { 3945 if (!result) { 3946 return result; 3947 } 3948 3949 result.startingBlock = utils.toDecimal(result.startingBlock); 3950 result.currentBlock = utils.toDecimal(result.currentBlock); 3951 result.highestBlock = utils.toDecimal(result.highestBlock); 3952 if (result.knownStates) { 3953 result.knownStates = utils.toDecimal(result.knownStates); 3954 result.pulledStates = utils.toDecimal(result.pulledStates); 3955 } 3956 3957 return result; 3958 }; 3959 3960 module.exports = { 3961 inputDefaultBlockNumberFormatter: inputDefaultBlockNumberFormatter, 3962 inputBlockNumberFormatter: inputBlockNumberFormatter, 3963 inputCallFormatter: inputCallFormatter, 3964 inputTransactionFormatter: inputTransactionFormatter, 3965 inputAddressFormatter: inputAddressFormatter, 3966 inputPostFormatter: inputPostFormatter, 3967 outputBigNumberFormatter: outputBigNumberFormatter, 3968 outputTransactionFormatter: outputTransactionFormatter, 3969 outputTransactionReceiptFormatter: outputTransactionReceiptFormatter, 3970 outputBlockFormatter: outputBlockFormatter, 3971 outputLogFormatter: outputLogFormatter, 3972 outputPostFormatter: outputPostFormatter, 3973 outputSyncingFormatter: outputSyncingFormatter 3974 }; 3975 3976 3977 },{"../utils/config":18,"../utils/utils":20,"./iban":33}],31:[function(require,module,exports){ 3978 /* 3979 This file is part of web3.js. 3980 3981 web3.js is free software: you can redistribute it and/or modify 3982 it under the terms of the GNU Lesser General Public License as published by 3983 the Free Software Foundation, either version 3 of the License, or 3984 (at your option) any later version. 3985 3986 web3.js is distributed in the hope that it will be useful, 3987 but WITHOUT ANY WARRANTY; without even the implied warranty of 3988 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 3989 GNU Lesser General Public License for more details. 3990 3991 You should have received a copy of the GNU Lesser General Public License 3992 along with web3.js. If not, see <http://www.gnu.org/licenses/>. 3993 */ 3994 /** 3995 * @file function.js 3996 * @author Marek Kotewicz <marek@ethdev.com> 3997 * @date 2015 3998 */ 3999 4000 var coder = require('../solidity/coder'); 4001 var utils = require('../utils/utils'); 4002 var errors = require('./errors'); 4003 var formatters = require('./formatters'); 4004 var sha3 = require('../utils/sha3'); 4005 4006 /** 4007 * This prototype should be used to call/sendTransaction to solidity functions 4008 */ 4009 var SolidityFunction = function (eth, json, address) { 4010 this._eth = eth; 4011 this._inputTypes = json.inputs.map(function (i) { 4012 return i.type; 4013 }); 4014 this._outputTypes = json.outputs.map(function (i) { 4015 return i.type; 4016 }); 4017 this._constant = json.constant; 4018 this._payable = json.payable; 4019 this._name = utils.transformToFullName(json); 4020 this._address = address; 4021 }; 4022 4023 SolidityFunction.prototype.extractCallback = function (args) { 4024 if (utils.isFunction(args[args.length - 1])) { 4025 return args.pop(); // modify the args array! 4026 } 4027 }; 4028 4029 SolidityFunction.prototype.extractDefaultBlock = function (args) { 4030 if (args.length > this._inputTypes.length && !utils.isObject(args[args.length -1])) { 4031 return formatters.inputDefaultBlockNumberFormatter(args.pop()); // modify the args array! 4032 } 4033 }; 4034 4035 /** 4036 * Should be called to check if the number of arguments is correct 4037 * 4038 * @method validateArgs 4039 * @param {Array} arguments 4040 * @throws {Error} if it is not 4041 */ 4042 SolidityFunction.prototype.validateArgs = function (args) { 4043 var inputArgs = args.filter(function (a) { 4044 // filter the options object but not arguments that are arrays 4045 return !( (utils.isObject(a) === true) && 4046 (utils.isArray(a) === false) && 4047 (utils.isBigNumber(a) === false) 4048 ); 4049 }); 4050 if (inputArgs.length !== this._inputTypes.length) { 4051 throw errors.InvalidNumberOfSolidityArgs(); 4052 } 4053 }; 4054 4055 /** 4056 * Should be used to create payload from arguments 4057 * 4058 * @method toPayload 4059 * @param {Array} solidity function params 4060 * @param {Object} optional payload options 4061 */ 4062 SolidityFunction.prototype.toPayload = function (args) { 4063 var options = {}; 4064 if (args.length > this._inputTypes.length && utils.isObject(args[args.length -1])) { 4065 options = args[args.length - 1]; 4066 } 4067 this.validateArgs(args); 4068 options.to = this._address; 4069 options.data = '0x' + this.signature() + coder.encodeParams(this._inputTypes, args); 4070 return options; 4071 }; 4072 4073 /** 4074 * Should be used to get function signature 4075 * 4076 * @method signature 4077 * @return {String} function signature 4078 */ 4079 SolidityFunction.prototype.signature = function () { 4080 return sha3(this._name).slice(0, 8); 4081 }; 4082 4083 4084 SolidityFunction.prototype.unpackOutput = function (output) { 4085 if (!output) { 4086 return; 4087 } 4088 4089 output = output.length >= 2 ? output.slice(2) : output; 4090 var result = coder.decodeParams(this._outputTypes, output); 4091 return result.length === 1 ? result[0] : result; 4092 }; 4093 4094 /** 4095 * Calls a contract function. 4096 * 4097 * @method call 4098 * @param {...Object} Contract function arguments 4099 * @param {function} If the last argument is a function, the contract function 4100 * call will be asynchronous, and the callback will be passed the 4101 * error and result. 4102 * @return {String} output bytes 4103 */ 4104 SolidityFunction.prototype.call = function () { 4105 var args = Array.prototype.slice.call(arguments).filter(function (a) {return a !== undefined; }); 4106 var callback = this.extractCallback(args); 4107 var defaultBlock = this.extractDefaultBlock(args); 4108 var payload = this.toPayload(args); 4109 4110 4111 if (!callback) { 4112 var output = this._eth.call(payload, defaultBlock); 4113 return this.unpackOutput(output); 4114 } 4115 4116 var self = this; 4117 this._eth.call(payload, defaultBlock, function (error, output) { 4118 if (error) return callback(error, null); 4119 4120 var unpacked = null; 4121 try { 4122 unpacked = self.unpackOutput(output); 4123 } 4124 catch (e) { 4125 error = e; 4126 } 4127 4128 callback(error, unpacked); 4129 }); 4130 }; 4131 4132 /** 4133 * Should be used to sendTransaction to solidity function 4134 * 4135 * @method sendTransaction 4136 */ 4137 SolidityFunction.prototype.sendTransaction = function () { 4138 var args = Array.prototype.slice.call(arguments).filter(function (a) {return a !== undefined; }); 4139 var callback = this.extractCallback(args); 4140 var payload = this.toPayload(args); 4141 4142 if (payload.value > 0 && !this._payable) { 4143 throw new Error('Cannot send value to non-payable function'); 4144 } 4145 4146 if (!callback) { 4147 return this._eth.sendTransaction(payload); 4148 } 4149 4150 this._eth.sendTransaction(payload, callback); 4151 }; 4152 4153 /** 4154 * Should be used to estimateGas of solidity function 4155 * 4156 * @method estimateGas 4157 */ 4158 SolidityFunction.prototype.estimateGas = function () { 4159 var args = Array.prototype.slice.call(arguments); 4160 var callback = this.extractCallback(args); 4161 var payload = this.toPayload(args); 4162 4163 if (!callback) { 4164 return this._eth.estimateGas(payload); 4165 } 4166 4167 this._eth.estimateGas(payload, callback); 4168 }; 4169 4170 /** 4171 * Return the encoded data of the call 4172 * 4173 * @method getData 4174 * @return {String} the encoded data 4175 */ 4176 SolidityFunction.prototype.getData = function () { 4177 var args = Array.prototype.slice.call(arguments); 4178 var payload = this.toPayload(args); 4179 4180 return payload.data; 4181 }; 4182 4183 /** 4184 * Should be used to get function display name 4185 * 4186 * @method displayName 4187 * @return {String} display name of the function 4188 */ 4189 SolidityFunction.prototype.displayName = function () { 4190 return utils.extractDisplayName(this._name); 4191 }; 4192 4193 /** 4194 * Should be used to get function type name 4195 * 4196 * @method typeName 4197 * @return {String} type name of the function 4198 */ 4199 SolidityFunction.prototype.typeName = function () { 4200 return utils.extractTypeName(this._name); 4201 }; 4202 4203 /** 4204 * Should be called to get rpc requests from solidity function 4205 * 4206 * @method request 4207 * @returns {Object} 4208 */ 4209 SolidityFunction.prototype.request = function () { 4210 var args = Array.prototype.slice.call(arguments); 4211 var callback = this.extractCallback(args); 4212 var payload = this.toPayload(args); 4213 var format = this.unpackOutput.bind(this); 4214 4215 return { 4216 method: this._constant ? 'eth_call' : 'eth_sendTransaction', 4217 callback: callback, 4218 params: [payload], 4219 format: format 4220 }; 4221 }; 4222 4223 /** 4224 * Should be called to execute function 4225 * 4226 * @method execute 4227 */ 4228 SolidityFunction.prototype.execute = function () { 4229 var transaction = !this._constant; 4230 4231 // send transaction 4232 if (transaction) { 4233 return this.sendTransaction.apply(this, Array.prototype.slice.call(arguments)); 4234 } 4235 4236 // call 4237 return this.call.apply(this, Array.prototype.slice.call(arguments)); 4238 }; 4239 4240 /** 4241 * Should be called to attach function to contract 4242 * 4243 * @method attachToContract 4244 * @param {Contract} 4245 */ 4246 SolidityFunction.prototype.attachToContract = function (contract) { 4247 var execute = this.execute.bind(this); 4248 execute.request = this.request.bind(this); 4249 execute.call = this.call.bind(this); 4250 execute.sendTransaction = this.sendTransaction.bind(this); 4251 execute.estimateGas = this.estimateGas.bind(this); 4252 execute.getData = this.getData.bind(this); 4253 var displayName = this.displayName(); 4254 if (!contract[displayName]) { 4255 contract[displayName] = execute; 4256 } 4257 contract[displayName][this.typeName()] = execute; // circular!!!! 4258 }; 4259 4260 module.exports = SolidityFunction; 4261 4262 },{"../solidity/coder":7,"../utils/sha3":19,"../utils/utils":20,"./errors":26,"./formatters":30}],32:[function(require,module,exports){ 4263 /* 4264 This file is part of web3.js. 4265 4266 web3.js is free software: you can redistribute it and/or modify 4267 it under the terms of the GNU Lesser General Public License as published by 4268 the Free Software Foundation, either version 3 of the License, or 4269 (at your option) any later version. 4270 4271 web3.js is distributed in the hope that it will be useful, 4272 but WITHOUT ANY WARRANTY; without even the implied warranty of 4273 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 4274 GNU Lesser General Public License for more details. 4275 4276 You should have received a copy of the GNU Lesser General Public License 4277 along with web3.js. If not, see <http://www.gnu.org/licenses/>. 4278 */ 4279 /** @file httpprovider.js 4280 * @authors: 4281 * Marek Kotewicz <marek@ethdev.com> 4282 * Marian Oancea <marian@ethdev.com> 4283 * Fabian Vogelsteller <fabian@ethdev.com> 4284 * @date 2015 4285 */ 4286 4287 var errors = require('./errors'); 4288 4289 // workaround to use httpprovider in different envs 4290 4291 // browser 4292 if (typeof window !== 'undefined' && window.XMLHttpRequest) { 4293 XMLHttpRequest = window.XMLHttpRequest; // jshint ignore: line 4294 // node 4295 } else { 4296 XMLHttpRequest = require('xmlhttprequest').XMLHttpRequest; // jshint ignore: line 4297 } 4298 4299 var XHR2 = require('xhr2'); // jshint ignore: line 4300 4301 /** 4302 * HttpProvider should be used to send rpc calls over http 4303 */ 4304 var HttpProvider = function (host, timeout, user, password) { 4305 this.host = host || 'http://localhost:8545'; 4306 this.timeout = timeout || 0; 4307 this.user = user; 4308 this.password = password; 4309 }; 4310 4311 /** 4312 * Should be called to prepare new XMLHttpRequest 4313 * 4314 * @method prepareRequest 4315 * @param {Boolean} true if request should be async 4316 * @return {XMLHttpRequest} object 4317 */ 4318 HttpProvider.prototype.prepareRequest = function (async) { 4319 var request; 4320 4321 if (async) { 4322 request = new XHR2(); 4323 request.timeout = this.timeout; 4324 } else { 4325 request = new XMLHttpRequest(); 4326 } 4327 4328 request.open('POST', this.host, async); 4329 if (this.user && this.password) { 4330 var auth = 'Basic ' + new Buffer(this.user + ':' + this.password).toString('base64'); 4331 request.setRequestHeader('Authorization', auth); 4332 } request.setRequestHeader('Content-Type', 'application/json'); 4333 return request; 4334 }; 4335 4336 /** 4337 * Should be called to make sync request 4338 * 4339 * @method send 4340 * @param {Object} payload 4341 * @return {Object} result 4342 */ 4343 HttpProvider.prototype.send = function (payload) { 4344 var request = this.prepareRequest(false); 4345 4346 try { 4347 request.send(JSON.stringify(payload)); 4348 } catch (error) { 4349 throw errors.InvalidConnection(this.host); 4350 } 4351 4352 var result = request.responseText; 4353 4354 try { 4355 result = JSON.parse(result); 4356 } catch (e) { 4357 throw errors.InvalidResponse(request.responseText); 4358 } 4359 4360 return result; 4361 }; 4362 4363 /** 4364 * Should be used to make async request 4365 * 4366 * @method sendAsync 4367 * @param {Object} payload 4368 * @param {Function} callback triggered on end with (err, result) 4369 */ 4370 HttpProvider.prototype.sendAsync = function (payload, callback) { 4371 var request = this.prepareRequest(true); 4372 4373 request.onreadystatechange = function () { 4374 if (request.readyState === 4 && request.timeout !== 1) { 4375 var result = request.responseText; 4376 var error = null; 4377 4378 try { 4379 result = JSON.parse(result); 4380 } catch (e) { 4381 error = errors.InvalidResponse(request.responseText); 4382 } 4383 4384 callback(error, result); 4385 } 4386 }; 4387 4388 request.ontimeout = function () { 4389 callback(errors.ConnectionTimeout(this.timeout)); 4390 }; 4391 4392 try { 4393 request.send(JSON.stringify(payload)); 4394 } catch (error) { 4395 callback(errors.InvalidConnection(this.host)); 4396 } 4397 }; 4398 4399 /** 4400 * Synchronously tries to make Http request 4401 * 4402 * @method isConnected 4403 * @return {Boolean} returns true if request haven't failed. Otherwise false 4404 */ 4405 HttpProvider.prototype.isConnected = function () { 4406 try { 4407 this.send({ 4408 id: 9999999999, 4409 jsonrpc: '2.0', 4410 method: 'net_listening', 4411 params: [] 4412 }); 4413 return true; 4414 } catch (e) { 4415 return false; 4416 } 4417 }; 4418 4419 module.exports = HttpProvider; 4420 4421 },{"./errors":26,"xhr2":86,"xmlhttprequest":17}],33:[function(require,module,exports){ 4422 /* 4423 This file is part of web3.js. 4424 4425 web3.js is free software: you can redistribute it and/or modify 4426 it under the terms of the GNU Lesser General Public License as published by 4427 the Free Software Foundation, either version 3 of the License, or 4428 (at your option) any later version. 4429 4430 web3.js is distributed in the hope that it will be useful, 4431 but WITHOUT ANY WARRANTY; without even the implied warranty of 4432 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 4433 GNU Lesser General Public License for more details. 4434 4435 You should have received a copy of the GNU Lesser General Public License 4436 along with web3.js. If not, see <http://www.gnu.org/licenses/>. 4437 */ 4438 /** 4439 * @file iban.js 4440 * @author Marek Kotewicz <marek@ethdev.com> 4441 * @date 2015 4442 */ 4443 4444 var BigNumber = require('bignumber.js'); 4445 4446 var padLeft = function (string, bytes) { 4447 var result = string; 4448 while (result.length < bytes * 2) { 4449 result = '0' + result; 4450 } 4451 return result; 4452 }; 4453 4454 /** 4455 * Prepare an IBAN for mod 97 computation by moving the first 4 chars to the end and transforming the letters to 4456 * numbers (A = 10, B = 11, ..., Z = 35), as specified in ISO13616. 4457 * 4458 * @method iso13616Prepare 4459 * @param {String} iban the IBAN 4460 * @returns {String} the prepared IBAN 4461 */ 4462 var iso13616Prepare = function (iban) { 4463 var A = 'A'.charCodeAt(0); 4464 var Z = 'Z'.charCodeAt(0); 4465 4466 iban = iban.toUpperCase(); 4467 iban = iban.substr(4) + iban.substr(0,4); 4468 4469 return iban.split('').map(function(n){ 4470 var code = n.charCodeAt(0); 4471 if (code >= A && code <= Z){ 4472 // A = 10, B = 11, ... Z = 35 4473 return code - A + 10; 4474 } else { 4475 return n; 4476 } 4477 }).join(''); 4478 }; 4479 4480 /** 4481 * Calculates the MOD 97 10 of the passed IBAN as specified in ISO7064. 4482 * 4483 * @method mod9710 4484 * @param {String} iban 4485 * @returns {Number} 4486 */ 4487 var mod9710 = function (iban) { 4488 var remainder = iban, 4489 block; 4490 4491 while (remainder.length > 2){ 4492 block = remainder.slice(0, 9); 4493 remainder = parseInt(block, 10) % 97 + remainder.slice(block.length); 4494 } 4495 4496 return parseInt(remainder, 10) % 97; 4497 }; 4498 4499 /** 4500 * This prototype should be used to create iban object from iban correct string 4501 * 4502 * @param {String} iban 4503 */ 4504 var Iban = function (iban) { 4505 this._iban = iban; 4506 }; 4507 4508 /** 4509 * This method should be used to create iban object from ethereum address 4510 * 4511 * @method fromAddress 4512 * @param {String} address 4513 * @return {Iban} the IBAN object 4514 */ 4515 Iban.fromAddress = function (address) { 4516 var asBn = new BigNumber(address, 16); 4517 var base36 = asBn.toString(36); 4518 var padded = padLeft(base36, 15); 4519 return Iban.fromBban(padded.toUpperCase()); 4520 }; 4521 4522 /** 4523 * Convert the passed BBAN to an IBAN for this country specification. 4524 * Please note that <i>"generation of the IBAN shall be the exclusive responsibility of the bank/branch servicing the account"</i>. 4525 * This method implements the preferred algorithm described in http://en.wikipedia.org/wiki/International_Bank_Account_Number#Generating_IBAN_check_digits 4526 * 4527 * @method fromBban 4528 * @param {String} bban the BBAN to convert to IBAN 4529 * @returns {Iban} the IBAN object 4530 */ 4531 Iban.fromBban = function (bban) { 4532 var countryCode = 'XE'; 4533 4534 var remainder = mod9710(iso13616Prepare(countryCode + '00' + bban)); 4535 var checkDigit = ('0' + (98 - remainder)).slice(-2); 4536 4537 return new Iban(countryCode + checkDigit + bban); 4538 }; 4539 4540 /** 4541 * Should be used to create IBAN object for given institution and identifier 4542 * 4543 * @method createIndirect 4544 * @param {Object} options, required options are "institution" and "identifier" 4545 * @return {Iban} the IBAN object 4546 */ 4547 Iban.createIndirect = function (options) { 4548 return Iban.fromBban('ETH' + options.institution + options.identifier); 4549 }; 4550 4551 /** 4552 * Thos method should be used to check if given string is valid iban object 4553 * 4554 * @method isValid 4555 * @param {String} iban string 4556 * @return {Boolean} true if it is valid IBAN 4557 */ 4558 Iban.isValid = function (iban) { 4559 var i = new Iban(iban); 4560 return i.isValid(); 4561 }; 4562 4563 /** 4564 * Should be called to check if iban is correct 4565 * 4566 * @method isValid 4567 * @returns {Boolean} true if it is, otherwise false 4568 */ 4569 Iban.prototype.isValid = function () { 4570 return /^XE[0-9]{2}(ETH[0-9A-Z]{13}|[0-9A-Z]{30,31})$/.test(this._iban) && 4571 mod9710(iso13616Prepare(this._iban)) === 1; 4572 }; 4573 4574 /** 4575 * Should be called to check if iban number is direct 4576 * 4577 * @method isDirect 4578 * @returns {Boolean} true if it is, otherwise false 4579 */ 4580 Iban.prototype.isDirect = function () { 4581 return this._iban.length === 34 || this._iban.length === 35; 4582 }; 4583 4584 /** 4585 * Should be called to check if iban number if indirect 4586 * 4587 * @method isIndirect 4588 * @returns {Boolean} true if it is, otherwise false 4589 */ 4590 Iban.prototype.isIndirect = function () { 4591 return this._iban.length === 20; 4592 }; 4593 4594 /** 4595 * Should be called to get iban checksum 4596 * Uses the mod-97-10 checksumming protocol (ISO/IEC 7064:2003) 4597 * 4598 * @method checksum 4599 * @returns {String} checksum 4600 */ 4601 Iban.prototype.checksum = function () { 4602 return this._iban.substr(2, 2); 4603 }; 4604 4605 /** 4606 * Should be called to get institution identifier 4607 * eg. XREG 4608 * 4609 * @method institution 4610 * @returns {String} institution identifier 4611 */ 4612 Iban.prototype.institution = function () { 4613 return this.isIndirect() ? this._iban.substr(7, 4) : ''; 4614 }; 4615 4616 /** 4617 * Should be called to get client identifier within institution 4618 * eg. GAVOFYORK 4619 * 4620 * @method client 4621 * @returns {String} client identifier 4622 */ 4623 Iban.prototype.client = function () { 4624 return this.isIndirect() ? this._iban.substr(11) : ''; 4625 }; 4626 4627 /** 4628 * Should be called to get client direct address 4629 * 4630 * @method address 4631 * @returns {String} client direct address 4632 */ 4633 Iban.prototype.address = function () { 4634 if (this.isDirect()) { 4635 var base36 = this._iban.substr(4); 4636 var asBn = new BigNumber(base36, 36); 4637 return padLeft(asBn.toString(16), 20); 4638 } 4639 4640 return ''; 4641 }; 4642 4643 Iban.prototype.toString = function () { 4644 return this._iban; 4645 }; 4646 4647 module.exports = Iban; 4648 4649 4650 },{"bignumber.js":"bignumber.js"}],34:[function(require,module,exports){ 4651 /* 4652 This file is part of web3.js. 4653 4654 web3.js is free software: you can redistribute it and/or modify 4655 it under the terms of the GNU Lesser General Public License as published by 4656 the Free Software Foundation, either version 3 of the License, or 4657 (at your option) any later version. 4658 4659 web3.js is distributed in the hope that it will be useful, 4660 but WITHOUT ANY WARRANTY; without even the implied warranty of 4661 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 4662 GNU Lesser General Public License for more details. 4663 4664 You should have received a copy of the GNU Lesser General Public License 4665 along with web3.js. If not, see <http://www.gnu.org/licenses/>. 4666 */ 4667 /** @file ipcprovider.js 4668 * @authors: 4669 * Fabian Vogelsteller <fabian@ethdev.com> 4670 * @date 2015 4671 */ 4672 4673 "use strict"; 4674 4675 var utils = require('../utils/utils'); 4676 var errors = require('./errors'); 4677 4678 4679 var IpcProvider = function (path, net) { 4680 var _this = this; 4681 this.responseCallbacks = {}; 4682 this.path = path; 4683 4684 this.connection = net.connect({path: this.path}); 4685 4686 this.connection.on('error', function(e){ 4687 console.error('IPC Connection Error', e); 4688 _this._timeout(); 4689 }); 4690 4691 this.connection.on('end', function(){ 4692 _this._timeout(); 4693 }); 4694 4695 4696 // LISTEN FOR CONNECTION RESPONSES 4697 this.connection.on('data', function(data) { 4698 /*jshint maxcomplexity: 6 */ 4699 4700 _this._parseResponse(data.toString()).forEach(function(result){ 4701 4702 var id = null; 4703 4704 // get the id which matches the returned id 4705 if(utils.isArray(result)) { 4706 result.forEach(function(load){ 4707 if(_this.responseCallbacks[load.id]) 4708 id = load.id; 4709 }); 4710 } else { 4711 id = result.id; 4712 } 4713 4714 // fire the callback 4715 if(_this.responseCallbacks[id]) { 4716 _this.responseCallbacks[id](null, result); 4717 delete _this.responseCallbacks[id]; 4718 } 4719 }); 4720 }); 4721 }; 4722 4723 /** 4724 Will parse the response and make an array out of it. 4725 4726 @method _parseResponse 4727 @param {String} data 4728 */ 4729 IpcProvider.prototype._parseResponse = function(data) { 4730 var _this = this, 4731 returnValues = []; 4732 4733 // DE-CHUNKER 4734 var dechunkedData = data 4735 .replace(/\}[\n\r]?\{/g,'}|--|{') // }{ 4736 .replace(/\}\][\n\r]?\[\{/g,'}]|--|[{') // }][{ 4737 .replace(/\}[\n\r]?\[\{/g,'}|--|[{') // }[{ 4738 .replace(/\}\][\n\r]?\{/g,'}]|--|{') // }]{ 4739 .split('|--|'); 4740 4741 dechunkedData.forEach(function(data){ 4742 4743 // prepend the last chunk 4744 if(_this.lastChunk) 4745 data = _this.lastChunk + data; 4746 4747 var result = null; 4748 4749 try { 4750 result = JSON.parse(data); 4751 4752 } catch(e) { 4753 4754 _this.lastChunk = data; 4755 4756 // start timeout to cancel all requests 4757 clearTimeout(_this.lastChunkTimeout); 4758 _this.lastChunkTimeout = setTimeout(function(){ 4759 _this._timeout(); 4760 throw errors.InvalidResponse(data); 4761 }, 1000 * 15); 4762 4763 return; 4764 } 4765 4766 // cancel timeout and set chunk to null 4767 clearTimeout(_this.lastChunkTimeout); 4768 _this.lastChunk = null; 4769 4770 if(result) 4771 returnValues.push(result); 4772 }); 4773 4774 return returnValues; 4775 }; 4776 4777 4778 /** 4779 Get the adds a callback to the responseCallbacks object, 4780 which will be called if a response matching the response Id will arrive. 4781 4782 @method _addResponseCallback 4783 */ 4784 IpcProvider.prototype._addResponseCallback = function(payload, callback) { 4785 var id = payload.id || payload[0].id; 4786 var method = payload.method || payload[0].method; 4787 4788 this.responseCallbacks[id] = callback; 4789 this.responseCallbacks[id].method = method; 4790 }; 4791 4792 /** 4793 Timeout all requests when the end/error event is fired 4794 4795 @method _timeout 4796 */ 4797 IpcProvider.prototype._timeout = function() { 4798 for(var key in this.responseCallbacks) { 4799 if(this.responseCallbacks.hasOwnProperty(key)){ 4800 this.responseCallbacks[key](errors.InvalidConnection('on IPC')); 4801 delete this.responseCallbacks[key]; 4802 } 4803 } 4804 }; 4805 4806 4807 /** 4808 Check if the current connection is still valid. 4809 4810 @method isConnected 4811 */ 4812 IpcProvider.prototype.isConnected = function() { 4813 var _this = this; 4814 4815 // try reconnect, when connection is gone 4816 if(!_this.connection.writable) 4817 _this.connection.connect({path: _this.path}); 4818 4819 return !!this.connection.writable; 4820 }; 4821 4822 IpcProvider.prototype.send = function (payload) { 4823 4824 if(this.connection.writeSync) { 4825 var result; 4826 4827 // try reconnect, when connection is gone 4828 if(!this.connection.writable) 4829 this.connection.connect({path: this.path}); 4830 4831 var data = this.connection.writeSync(JSON.stringify(payload)); 4832 4833 try { 4834 result = JSON.parse(data); 4835 } catch(e) { 4836 throw errors.InvalidResponse(data); 4837 } 4838 4839 return result; 4840 4841 } else { 4842 throw new Error('You tried to send "'+ payload.method +'" synchronously. Synchronous requests are not supported by the IPC provider.'); 4843 } 4844 }; 4845 4846 IpcProvider.prototype.sendAsync = function (payload, callback) { 4847 // try reconnect, when connection is gone 4848 if(!this.connection.writable) 4849 this.connection.connect({path: this.path}); 4850 4851 4852 this.connection.write(JSON.stringify(payload)); 4853 this._addResponseCallback(payload, callback); 4854 }; 4855 4856 module.exports = IpcProvider; 4857 4858 4859 },{"../utils/utils":20,"./errors":26}],35:[function(require,module,exports){ 4860 /* 4861 This file is part of web3.js. 4862 4863 web3.js is free software: you can redistribute it and/or modify 4864 it under the terms of the GNU Lesser General Public License as published by 4865 the Free Software Foundation, either version 3 of the License, or 4866 (at your option) any later version. 4867 4868 web3.js is distributed in the hope that it will be useful, 4869 but WITHOUT ANY WARRANTY; without even the implied warranty of 4870 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 4871 GNU Lesser General Public License for more details. 4872 4873 You should have received a copy of the GNU Lesser General Public License 4874 along with web3.js. If not, see <http://www.gnu.org/licenses/>. 4875 */ 4876 /** @file jsonrpc.js 4877 * @authors: 4878 * Marek Kotewicz <marek@ethdev.com> 4879 * Aaron Kumavis <aaron@kumavis.me> 4880 * @date 2015 4881 */ 4882 4883 // Initialize Jsonrpc as a simple object with utility functions. 4884 var Jsonrpc = { 4885 messageId: 0 4886 }; 4887 4888 /** 4889 * Should be called to valid json create payload object 4890 * 4891 * @method toPayload 4892 * @param {Function} method of jsonrpc call, required 4893 * @param {Array} params, an array of method params, optional 4894 * @returns {Object} valid jsonrpc payload object 4895 */ 4896 Jsonrpc.toPayload = function (method, params) { 4897 if (!method) 4898 console.error('jsonrpc method should be specified!'); 4899 4900 // advance message ID 4901 Jsonrpc.messageId++; 4902 4903 return { 4904 jsonrpc: '2.0', 4905 id: Jsonrpc.messageId, 4906 method: method, 4907 params: params || [] 4908 }; 4909 }; 4910 4911 /** 4912 * Should be called to check if jsonrpc response is valid 4913 * 4914 * @method isValidResponse 4915 * @param {Object} 4916 * @returns {Boolean} true if response is valid, otherwise false 4917 */ 4918 Jsonrpc.isValidResponse = function (response) { 4919 return Array.isArray(response) ? response.every(validateSingleMessage) : validateSingleMessage(response); 4920 4921 function validateSingleMessage(message){ 4922 return !!message && 4923 !message.error && 4924 message.jsonrpc === '2.0' && 4925 typeof message.id === 'number' && 4926 message.result !== undefined; // only undefined is not valid json object 4927 } 4928 }; 4929 4930 /** 4931 * Should be called to create batch payload object 4932 * 4933 * @method toBatchPayload 4934 * @param {Array} messages, an array of objects with method (required) and params (optional) fields 4935 * @returns {Array} batch payload 4936 */ 4937 Jsonrpc.toBatchPayload = function (messages) { 4938 return messages.map(function (message) { 4939 return Jsonrpc.toPayload(message.method, message.params); 4940 }); 4941 }; 4942 4943 module.exports = Jsonrpc; 4944 4945 4946 },{}],36:[function(require,module,exports){ 4947 /* 4948 This file is part of web3.js. 4949 4950 web3.js is free software: you can redistribute it and/or modify 4951 it under the terms of the GNU Lesser General Public License as published by 4952 the Free Software Foundation, either version 3 of the License, or 4953 (at your option) any later version. 4954 4955 web3.js is distributed in the hope that it will be useful, 4956 but WITHOUT ANY WARRANTY; without even the implied warranty of 4957 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 4958 GNU Lesser General Public License for more details. 4959 4960 You should have received a copy of the GNU Lesser General Public License 4961 along with web3.js. If not, see <http://www.gnu.org/licenses/>. 4962 */ 4963 /** 4964 * @file method.js 4965 * @author Marek Kotewicz <marek@ethdev.com> 4966 * @date 2015 4967 */ 4968 4969 var utils = require('../utils/utils'); 4970 var errors = require('./errors'); 4971 4972 var Method = function (options) { 4973 this.name = options.name; 4974 this.call = options.call; 4975 this.params = options.params || 0; 4976 this.inputFormatter = options.inputFormatter; 4977 this.outputFormatter = options.outputFormatter; 4978 this.requestManager = null; 4979 }; 4980 4981 Method.prototype.setRequestManager = function (rm) { 4982 this.requestManager = rm; 4983 }; 4984 4985 /** 4986 * Should be used to determine name of the jsonrpc method based on arguments 4987 * 4988 * @method getCall 4989 * @param {Array} arguments 4990 * @return {String} name of jsonrpc method 4991 */ 4992 Method.prototype.getCall = function (args) { 4993 return utils.isFunction(this.call) ? this.call(args) : this.call; 4994 }; 4995 4996 /** 4997 * Should be used to extract callback from array of arguments. Modifies input param 4998 * 4999 * @method extractCallback 5000 * @param {Array} arguments 5001 * @return {Function|Null} callback, if exists 5002 */ 5003 Method.prototype.extractCallback = function (args) { 5004 if (utils.isFunction(args[args.length - 1])) { 5005 return args.pop(); // modify the args array! 5006 } 5007 }; 5008 5009 /** 5010 * Should be called to check if the number of arguments is correct 5011 * 5012 * @method validateArgs 5013 * @param {Array} arguments 5014 * @throws {Error} if it is not 5015 */ 5016 Method.prototype.validateArgs = function (args) { 5017 if (args.length !== this.params) { 5018 throw errors.InvalidNumberOfRPCParams(); 5019 } 5020 }; 5021 5022 /** 5023 * Should be called to format input args of method 5024 * 5025 * @method formatInput 5026 * @param {Array} 5027 * @return {Array} 5028 */ 5029 Method.prototype.formatInput = function (args) { 5030 if (!this.inputFormatter) { 5031 return args; 5032 } 5033 5034 return this.inputFormatter.map(function (formatter, index) { 5035 return formatter ? formatter(args[index]) : args[index]; 5036 }); 5037 }; 5038 5039 /** 5040 * Should be called to format output(result) of method 5041 * 5042 * @method formatOutput 5043 * @param {Object} 5044 * @return {Object} 5045 */ 5046 Method.prototype.formatOutput = function (result) { 5047 return this.outputFormatter && result ? this.outputFormatter(result) : result; 5048 }; 5049 5050 /** 5051 * Should create payload from given input args 5052 * 5053 * @method toPayload 5054 * @param {Array} args 5055 * @return {Object} 5056 */ 5057 Method.prototype.toPayload = function (args) { 5058 var call = this.getCall(args); 5059 var callback = this.extractCallback(args); 5060 var params = this.formatInput(args); 5061 this.validateArgs(params); 5062 5063 return { 5064 method: call, 5065 params: params, 5066 callback: callback 5067 }; 5068 }; 5069 5070 Method.prototype.attachToObject = function (obj) { 5071 var func = this.buildCall(); 5072 func.call = this.call; // TODO!!! that's ugly. filter.js uses it 5073 var name = this.name.split('.'); 5074 if (name.length > 1) { 5075 obj[name[0]] = obj[name[0]] || {}; 5076 obj[name[0]][name[1]] = func; 5077 } else { 5078 obj[name[0]] = func; 5079 } 5080 }; 5081 5082 Method.prototype.buildCall = function() { 5083 var method = this; 5084 var send = function () { 5085 var payload = method.toPayload(Array.prototype.slice.call(arguments)); 5086 if (payload.callback) { 5087 return method.requestManager.sendAsync(payload, function (err, result) { 5088 payload.callback(err, method.formatOutput(result)); 5089 }); 5090 } 5091 return method.formatOutput(method.requestManager.send(payload)); 5092 }; 5093 send.request = this.request.bind(this); 5094 return send; 5095 }; 5096 5097 /** 5098 * Should be called to create pure JSONRPC request which can be used in batch request 5099 * 5100 * @method request 5101 * @param {...} params 5102 * @return {Object} jsonrpc request 5103 */ 5104 Method.prototype.request = function () { 5105 var payload = this.toPayload(Array.prototype.slice.call(arguments)); 5106 payload.format = this.formatOutput.bind(this); 5107 return payload; 5108 }; 5109 5110 module.exports = Method; 5111 5112 },{"../utils/utils":20,"./errors":26}],37:[function(require,module,exports){ 5113 /* 5114 This file is part of web3.js. 5115 5116 web3.js is free software: you can redistribute it and/or modify 5117 it under the terms of the GNU Lesser General Public License as published by 5118 the Free Software Foundation, either version 3 of the License, or 5119 (at your option) any later version. 5120 5121 web3.js is distributed in the hope that it will be useful, 5122 but WITHOUT ANY WARRANTY; without even the implied warranty of 5123 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 5124 GNU Lesser General Public License for more details. 5125 5126 You should have received a copy of the GNU Lesser General Public License 5127 along with web3.js. If not, see <http://www.gnu.org/licenses/>. 5128 */ 5129 /** @file db.js 5130 * @authors: 5131 * Marek Kotewicz <marek@ethdev.com> 5132 * @date 2015 5133 */ 5134 5135 var Method = require('../method'); 5136 5137 var DB = function (web3) { 5138 this._requestManager = web3._requestManager; 5139 5140 var self = this; 5141 5142 methods().forEach(function(method) { 5143 method.attachToObject(self); 5144 method.setRequestManager(web3._requestManager); 5145 }); 5146 }; 5147 5148 var methods = function () { 5149 var putString = new Method({ 5150 name: 'putString', 5151 call: 'db_putString', 5152 params: 3 5153 }); 5154 5155 var getString = new Method({ 5156 name: 'getString', 5157 call: 'db_getString', 5158 params: 2 5159 }); 5160 5161 var putHex = new Method({ 5162 name: 'putHex', 5163 call: 'db_putHex', 5164 params: 3 5165 }); 5166 5167 var getHex = new Method({ 5168 name: 'getHex', 5169 call: 'db_getHex', 5170 params: 2 5171 }); 5172 5173 return [ 5174 putString, getString, putHex, getHex 5175 ]; 5176 }; 5177 5178 module.exports = DB; 5179 5180 },{"../method":36}],38:[function(require,module,exports){ 5181 /* 5182 This file is part of web3.js. 5183 5184 web3.js is free software: you can redistribute it and/or modify 5185 it under the terms of the GNU Lesser General Public License as published by 5186 the Free Software Foundation, either version 3 of the License, or 5187 (at your option) any later version. 5188 5189 web3.js is distributed in the hope that it will be useful, 5190 but WITHOUT ANY WARRANTY; without even the implied warranty of 5191 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 5192 GNU Lesser General Public License for more details. 5193 5194 You should have received a copy of the GNU Lesser General Public License 5195 along with web3.js. If not, see <http://www.gnu.org/licenses/>. 5196 */ 5197 /** 5198 * @file eth.js 5199 * @author Marek Kotewicz <marek@ethdev.com> 5200 * @author Fabian Vogelsteller <fabian@ethdev.com> 5201 * @date 2015 5202 */ 5203 5204 "use strict"; 5205 5206 var formatters = require('../formatters'); 5207 var utils = require('../../utils/utils'); 5208 var Method = require('../method'); 5209 var Property = require('../property'); 5210 var c = require('../../utils/config'); 5211 var Contract = require('../contract'); 5212 var watches = require('./watches'); 5213 var Filter = require('../filter'); 5214 var IsSyncing = require('../syncing'); 5215 var namereg = require('../namereg'); 5216 var Iban = require('../iban'); 5217 var transfer = require('../transfer'); 5218 5219 var blockCall = function (args) { 5220 return (utils.isString(args[0]) && args[0].indexOf('0x') === 0) ? "eth_getBlockByHash" : "eth_getBlockByNumber"; 5221 }; 5222 5223 var transactionFromBlockCall = function (args) { 5224 return (utils.isString(args[0]) && args[0].indexOf('0x') === 0) ? 'eth_getTransactionByBlockHashAndIndex' : 'eth_getTransactionByBlockNumberAndIndex'; 5225 }; 5226 5227 var uncleCall = function (args) { 5228 return (utils.isString(args[0]) && args[0].indexOf('0x') === 0) ? 'eth_getUncleByBlockHashAndIndex' : 'eth_getUncleByBlockNumberAndIndex'; 5229 }; 5230 5231 var getBlockTransactionCountCall = function (args) { 5232 return (utils.isString(args[0]) && args[0].indexOf('0x') === 0) ? 'eth_getBlockTransactionCountByHash' : 'eth_getBlockTransactionCountByNumber'; 5233 }; 5234 5235 var uncleCountCall = function (args) { 5236 return (utils.isString(args[0]) && args[0].indexOf('0x') === 0) ? 'eth_getUncleCountByBlockHash' : 'eth_getUncleCountByBlockNumber'; 5237 }; 5238 5239 function Eth(web3) { 5240 this._requestManager = web3._requestManager; 5241 5242 var self = this; 5243 5244 methods().forEach(function(method) { 5245 method.attachToObject(self); 5246 method.setRequestManager(self._requestManager); 5247 }); 5248 5249 properties().forEach(function(p) { 5250 p.attachToObject(self); 5251 p.setRequestManager(self._requestManager); 5252 }); 5253 5254 5255 this.iban = Iban; 5256 this.sendIBANTransaction = transfer.bind(null, this); 5257 } 5258 5259 Object.defineProperty(Eth.prototype, 'defaultBlock', { 5260 get: function () { 5261 return c.defaultBlock; 5262 }, 5263 set: function (val) { 5264 c.defaultBlock = val; 5265 return val; 5266 } 5267 }); 5268 5269 Object.defineProperty(Eth.prototype, 'defaultAccount', { 5270 get: function () { 5271 return c.defaultAccount; 5272 }, 5273 set: function (val) { 5274 c.defaultAccount = val; 5275 return val; 5276 } 5277 }); 5278 5279 var methods = function () { 5280 var getBalance = new Method({ 5281 name: 'getBalance', 5282 call: 'eth_getBalance', 5283 params: 2, 5284 inputFormatter: [formatters.inputAddressFormatter, formatters.inputDefaultBlockNumberFormatter], 5285 outputFormatter: formatters.outputBigNumberFormatter 5286 }); 5287 5288 var getStorageAt = new Method({ 5289 name: 'getStorageAt', 5290 call: 'eth_getStorageAt', 5291 params: 3, 5292 inputFormatter: [null, utils.toHex, formatters.inputDefaultBlockNumberFormatter] 5293 }); 5294 5295 var getCode = new Method({ 5296 name: 'getCode', 5297 call: 'eth_getCode', 5298 params: 2, 5299 inputFormatter: [formatters.inputAddressFormatter, formatters.inputDefaultBlockNumberFormatter] 5300 }); 5301 5302 var getBlock = new Method({ 5303 name: 'getBlock', 5304 call: blockCall, 5305 params: 2, 5306 inputFormatter: [formatters.inputBlockNumberFormatter, function (val) { return !!val; }], 5307 outputFormatter: formatters.outputBlockFormatter 5308 }); 5309 5310 var getUncle = new Method({ 5311 name: 'getUncle', 5312 call: uncleCall, 5313 params: 2, 5314 inputFormatter: [formatters.inputBlockNumberFormatter, utils.toHex], 5315 outputFormatter: formatters.outputBlockFormatter, 5316 5317 }); 5318 5319 var getCompilers = new Method({ 5320 name: 'getCompilers', 5321 call: 'eth_getCompilers', 5322 params: 0 5323 }); 5324 5325 var getBlockTransactionCount = new Method({ 5326 name: 'getBlockTransactionCount', 5327 call: getBlockTransactionCountCall, 5328 params: 1, 5329 inputFormatter: [formatters.inputBlockNumberFormatter], 5330 outputFormatter: utils.toDecimal 5331 }); 5332 5333 var getBlockUncleCount = new Method({ 5334 name: 'getBlockUncleCount', 5335 call: uncleCountCall, 5336 params: 1, 5337 inputFormatter: [formatters.inputBlockNumberFormatter], 5338 outputFormatter: utils.toDecimal 5339 }); 5340 5341 var getTransaction = new Method({ 5342 name: 'getTransaction', 5343 call: 'eth_getTransactionByHash', 5344 params: 1, 5345 outputFormatter: formatters.outputTransactionFormatter 5346 }); 5347 5348 var getTransactionFromBlock = new Method({ 5349 name: 'getTransactionFromBlock', 5350 call: transactionFromBlockCall, 5351 params: 2, 5352 inputFormatter: [formatters.inputBlockNumberFormatter, utils.toHex], 5353 outputFormatter: formatters.outputTransactionFormatter 5354 }); 5355 5356 var getTransactionReceipt = new Method({ 5357 name: 'getTransactionReceipt', 5358 call: 'eth_getTransactionReceipt', 5359 params: 1, 5360 outputFormatter: formatters.outputTransactionReceiptFormatter 5361 }); 5362 5363 var getTransactionCount = new Method({ 5364 name: 'getTransactionCount', 5365 call: 'eth_getTransactionCount', 5366 params: 2, 5367 inputFormatter: [null, formatters.inputDefaultBlockNumberFormatter], 5368 outputFormatter: utils.toDecimal 5369 }); 5370 5371 var sendRawTransaction = new Method({ 5372 name: 'sendRawTransaction', 5373 call: 'eth_sendRawTransaction', 5374 params: 1, 5375 inputFormatter: [null] 5376 }); 5377 5378 var sendTransaction = new Method({ 5379 name: 'sendTransaction', 5380 call: 'eth_sendTransaction', 5381 params: 1, 5382 inputFormatter: [formatters.inputTransactionFormatter] 5383 }); 5384 5385 var signTransaction = new Method({ 5386 name: 'signTransaction', 5387 call: 'eth_signTransaction', 5388 params: 1, 5389 inputFormatter: [formatters.inputTransactionFormatter] 5390 }); 5391 5392 var sign = new Method({ 5393 name: 'sign', 5394 call: 'eth_sign', 5395 params: 2, 5396 inputFormatter: [formatters.inputAddressFormatter, null] 5397 }); 5398 5399 var call = new Method({ 5400 name: 'call', 5401 call: 'eth_call', 5402 params: 2, 5403 inputFormatter: [formatters.inputCallFormatter, formatters.inputDefaultBlockNumberFormatter] 5404 }); 5405 5406 var estimateGas = new Method({ 5407 name: 'estimateGas', 5408 call: 'eth_estimateGas', 5409 params: 1, 5410 inputFormatter: [formatters.inputCallFormatter], 5411 outputFormatter: utils.toDecimal 5412 }); 5413 5414 var compileSolidity = new Method({ 5415 name: 'compile.solidity', 5416 call: 'eth_compileSolidity', 5417 params: 1 5418 }); 5419 5420 var compileLLL = new Method({ 5421 name: 'compile.lll', 5422 call: 'eth_compileLLL', 5423 params: 1 5424 }); 5425 5426 var compileSerpent = new Method({ 5427 name: 'compile.serpent', 5428 call: 'eth_compileSerpent', 5429 params: 1 5430 }); 5431 5432 var submitWork = new Method({ 5433 name: 'submitWork', 5434 call: 'eth_submitWork', 5435 params: 3 5436 }); 5437 5438 var getWork = new Method({ 5439 name: 'getWork', 5440 call: 'eth_getWork', 5441 params: 0 5442 }); 5443 5444 return [ 5445 getBalance, 5446 getStorageAt, 5447 getCode, 5448 getBlock, 5449 getUncle, 5450 getCompilers, 5451 getBlockTransactionCount, 5452 getBlockUncleCount, 5453 getTransaction, 5454 getTransactionFromBlock, 5455 getTransactionReceipt, 5456 getTransactionCount, 5457 call, 5458 estimateGas, 5459 sendRawTransaction, 5460 signTransaction, 5461 sendTransaction, 5462 sign, 5463 compileSolidity, 5464 compileLLL, 5465 compileSerpent, 5466 submitWork, 5467 getWork 5468 ]; 5469 }; 5470 5471 5472 var properties = function () { 5473 return [ 5474 new Property({ 5475 name: 'coinbase', 5476 getter: 'eth_coinbase' 5477 }), 5478 new Property({ 5479 name: 'mining', 5480 getter: 'eth_mining' 5481 }), 5482 new Property({ 5483 name: 'hashrate', 5484 getter: 'eth_hashrate', 5485 outputFormatter: utils.toDecimal 5486 }), 5487 new Property({ 5488 name: 'syncing', 5489 getter: 'eth_syncing', 5490 outputFormatter: formatters.outputSyncingFormatter 5491 }), 5492 new Property({ 5493 name: 'gasPrice', 5494 getter: 'eth_gasPrice', 5495 outputFormatter: formatters.outputBigNumberFormatter 5496 }), 5497 new Property({ 5498 name: 'accounts', 5499 getter: 'eth_accounts' 5500 }), 5501 new Property({ 5502 name: 'blockNumber', 5503 getter: 'eth_blockNumber', 5504 outputFormatter: utils.toDecimal 5505 }), 5506 new Property({ 5507 name: 'protocolVersion', 5508 getter: 'eth_protocolVersion' 5509 }) 5510 ]; 5511 }; 5512 5513 Eth.prototype.contract = function (abi) { 5514 var factory = new Contract(this, abi); 5515 return factory; 5516 }; 5517 5518 Eth.prototype.filter = function (options, callback, filterCreationErrorCallback) { 5519 return new Filter(options, 'eth', this._requestManager, watches.eth(), formatters.outputLogFormatter, callback, filterCreationErrorCallback); 5520 }; 5521 5522 Eth.prototype.namereg = function () { 5523 return this.contract(namereg.global.abi).at(namereg.global.address); 5524 }; 5525 5526 Eth.prototype.icapNamereg = function () { 5527 return this.contract(namereg.icap.abi).at(namereg.icap.address); 5528 }; 5529 5530 Eth.prototype.isSyncing = function (callback) { 5531 return new IsSyncing(this._requestManager, callback); 5532 }; 5533 5534 module.exports = Eth; 5535 5536 },{"../../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){ 5537 /* 5538 This file is part of web3.js. 5539 5540 web3.js is free software: you can redistribute it and/or modify 5541 it under the terms of the GNU Lesser General Public License as published by 5542 the Free Software Foundation, either version 3 of the License, or 5543 (at your option) any later version. 5544 5545 web3.js is distributed in the hope that it will be useful, 5546 but WITHOUT ANY WARRANTY; without even the implied warranty of 5547 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 5548 GNU Lesser General Public License for more details. 5549 5550 You should have received a copy of the GNU Lesser General Public License 5551 along with web3.js. If not, see <http://www.gnu.org/licenses/>. 5552 */ 5553 /** @file eth.js 5554 * @authors: 5555 * Marek Kotewicz <marek@ethdev.com> 5556 * @date 2015 5557 */ 5558 5559 var utils = require('../../utils/utils'); 5560 var Property = require('../property'); 5561 5562 var Net = function (web3) { 5563 this._requestManager = web3._requestManager; 5564 5565 var self = this; 5566 5567 properties().forEach(function(p) { 5568 p.attachToObject(self); 5569 p.setRequestManager(web3._requestManager); 5570 }); 5571 }; 5572 5573 /// @returns an array of objects describing web3.eth api properties 5574 var properties = function () { 5575 return [ 5576 new Property({ 5577 name: 'listening', 5578 getter: 'net_listening' 5579 }), 5580 new Property({ 5581 name: 'peerCount', 5582 getter: 'net_peerCount', 5583 outputFormatter: utils.toDecimal 5584 }) 5585 ]; 5586 }; 5587 5588 module.exports = Net; 5589 5590 },{"../../utils/utils":20,"../property":45}],40:[function(require,module,exports){ 5591 /* 5592 This file is part of web3.js. 5593 5594 web3.js is free software: you can redistribute it and/or modify 5595 it under the terms of the GNU Lesser General Public License as published by 5596 the Free Software Foundation, either version 3 of the License, or 5597 (at your option) any later version. 5598 5599 web3.js is distributed in the hope that it will be useful, 5600 but WITHOUT ANY WARRANTY; without even the implied warranty of 5601 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 5602 GNU Lesser General Public License for more details. 5603 5604 You should have received a copy of the GNU Lesser General Public License 5605 along with web3.js. If not, see <http://www.gnu.org/licenses/>. 5606 */ 5607 /** 5608 * @file eth.js 5609 * @author Marek Kotewicz <marek@ethdev.com> 5610 * @author Fabian Vogelsteller <fabian@ethdev.com> 5611 * @date 2015 5612 */ 5613 5614 "use strict"; 5615 5616 var Method = require('../method'); 5617 var Property = require('../property'); 5618 var formatters = require('../formatters'); 5619 5620 function Personal(web3) { 5621 this._requestManager = web3._requestManager; 5622 5623 var self = this; 5624 5625 methods().forEach(function(method) { 5626 method.attachToObject(self); 5627 method.setRequestManager(self._requestManager); 5628 }); 5629 5630 properties().forEach(function(p) { 5631 p.attachToObject(self); 5632 p.setRequestManager(self._requestManager); 5633 }); 5634 } 5635 5636 var methods = function () { 5637 var newAccount = new Method({ 5638 name: 'newAccount', 5639 call: 'personal_newAccount', 5640 params: 1, 5641 inputFormatter: [null] 5642 }); 5643 5644 var importRawKey = new Method({ 5645 name: 'importRawKey', 5646 call: 'personal_importRawKey', 5647 params: 2 5648 }); 5649 5650 var sign = new Method({ 5651 name: 'sign', 5652 call: 'personal_sign', 5653 params: 3, 5654 inputFormatter: [null, formatters.inputAddressFormatter, null] 5655 }); 5656 5657 var ecRecover = new Method({ 5658 name: 'ecRecover', 5659 call: 'personal_ecRecover', 5660 params: 2 5661 }); 5662 5663 var unlockAccount = new Method({ 5664 name: 'unlockAccount', 5665 call: 'personal_unlockAccount', 5666 params: 3, 5667 inputFormatter: [formatters.inputAddressFormatter, null, null] 5668 }); 5669 5670 var sendTransaction = new Method({ 5671 name: 'sendTransaction', 5672 call: 'personal_sendTransaction', 5673 params: 2, 5674 inputFormatter: [formatters.inputTransactionFormatter, null] 5675 }); 5676 5677 var lockAccount = new Method({ 5678 name: 'lockAccount', 5679 call: 'personal_lockAccount', 5680 params: 1, 5681 inputFormatter: [formatters.inputAddressFormatter] 5682 }); 5683 5684 return [ 5685 newAccount, 5686 importRawKey, 5687 unlockAccount, 5688 ecRecover, 5689 sign, 5690 sendTransaction, 5691 lockAccount 5692 ]; 5693 }; 5694 5695 var properties = function () { 5696 return [ 5697 new Property({ 5698 name: 'listAccounts', 5699 getter: 'personal_listAccounts' 5700 }) 5701 ]; 5702 }; 5703 5704 5705 module.exports = Personal; 5706 5707 },{"../formatters":30,"../method":36,"../property":45}],41:[function(require,module,exports){ 5708 /* 5709 This file is part of web3.js. 5710 5711 web3.js is free software: you can redistribute it and/or modify 5712 it under the terms of the GNU Lesser General Public License as published by 5713 the Free Software Foundation, either version 3 of the License, or 5714 (at your option) any later version. 5715 5716 web3.js is distributed in the hope that it will be useful, 5717 but WITHOUT ANY WARRANTY; without even the implied warranty of 5718 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 5719 GNU Lesser General Public License for more details. 5720 5721 You should have received a copy of the GNU Lesser General Public License 5722 along with web3.js. If not, see <http://www.gnu.org/licenses/>. 5723 */ 5724 /** @file shh.js 5725 * @authors: 5726 * Fabian Vogelsteller <fabian@ethereum.org> 5727 * Marek Kotewicz <marek@ethcore.io> 5728 * @date 2017 5729 */ 5730 5731 var Method = require('../method'); 5732 var Filter = require('../filter'); 5733 var watches = require('./watches'); 5734 5735 var Shh = function (web3) { 5736 this._requestManager = web3._requestManager; 5737 5738 var self = this; 5739 5740 methods().forEach(function(method) { 5741 method.attachToObject(self); 5742 method.setRequestManager(self._requestManager); 5743 }); 5744 }; 5745 5746 Shh.prototype.newMessageFilter = function (options, callback, filterCreationErrorCallback) { 5747 return new Filter(options, 'shh', this._requestManager, watches.shh(), null, callback, filterCreationErrorCallback); 5748 }; 5749 5750 var methods = function () { 5751 5752 return [ 5753 new Method({ 5754 name: 'version', 5755 call: 'shh_version', 5756 params: 0 5757 }), 5758 new Method({ 5759 name: 'info', 5760 call: 'shh_info', 5761 params: 0 5762 }), 5763 new Method({ 5764 name: 'setMaxMessageSize', 5765 call: 'shh_setMaxMessageSize', 5766 params: 1 5767 }), 5768 new Method({ 5769 name: 'setMinPoW', 5770 call: 'shh_setMinPoW', 5771 params: 1 5772 }), 5773 new Method({ 5774 name: 'markTrustedPeer', 5775 call: 'shh_markTrustedPeer', 5776 params: 1 5777 }), 5778 new Method({ 5779 name: 'newKeyPair', 5780 call: 'shh_newKeyPair', 5781 params: 0 5782 }), 5783 new Method({ 5784 name: 'addPrivateKey', 5785 call: 'shh_addPrivateKey', 5786 params: 1 5787 }), 5788 new Method({ 5789 name: 'deleteKeyPair', 5790 call: 'shh_deleteKeyPair', 5791 params: 1 5792 }), 5793 new Method({ 5794 name: 'hasKeyPair', 5795 call: 'shh_hasKeyPair', 5796 params: 1 5797 }), 5798 new Method({ 5799 name: 'getPublicKey', 5800 call: 'shh_getPublicKey', 5801 params: 1 5802 }), 5803 new Method({ 5804 name: 'getPrivateKey', 5805 call: 'shh_getPrivateKey', 5806 params: 1 5807 }), 5808 new Method({ 5809 name: 'newSymKey', 5810 call: 'shh_newSymKey', 5811 params: 0 5812 }), 5813 new Method({ 5814 name: 'addSymKey', 5815 call: 'shh_addSymKey', 5816 params: 1 5817 }), 5818 new Method({ 5819 name: 'generateSymKeyFromPassword', 5820 call: 'shh_generateSymKeyFromPassword', 5821 params: 1 5822 }), 5823 new Method({ 5824 name: 'hasSymKey', 5825 call: 'shh_hasSymKey', 5826 params: 1 5827 }), 5828 new Method({ 5829 name: 'getSymKey', 5830 call: 'shh_getSymKey', 5831 params: 1 5832 }), 5833 new Method({ 5834 name: 'deleteSymKey', 5835 call: 'shh_deleteSymKey', 5836 params: 1 5837 }), 5838 5839 // subscribe and unsubscribe missing 5840 5841 new Method({ 5842 name: 'post', 5843 call: 'shh_post', 5844 params: 1, 5845 inputFormatter: [null] 5846 }) 5847 ]; 5848 }; 5849 5850 module.exports = Shh; 5851 5852 5853 },{"../filter":29,"../method":36,"./watches":43}],42:[function(require,module,exports){ 5854 /* 5855 This file is part of web3.js. 5856 5857 web3.js is free software: you can redistribute it and/or modify 5858 it under the terms of the GNU Lesser General Public License as published by 5859 the Free Software Foundation, either version 3 of the License, or 5860 (at your option) any later version. 5861 5862 web3.js is distributed in the hope that it will be useful, 5863 but WITHOUT ANY WARRANTY; without even the implied warranty of 5864 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 5865 GNU Lesser General Public License for more details. 5866 5867 You should have received a copy of the GNU Lesser General Public License 5868 along with web3.js. If not, see <http://www.gnu.org/licenses/>. 5869 */ 5870 /** 5871 * @file bzz.js 5872 * @author Alex Beregszaszi <alex@rtfs.hu> 5873 * @date 2016 5874 * 5875 * Reference: https://github.com/ethereum/go-ethereum/blob/swarm/internal/web3ext/web3ext.go#L33 5876 */ 5877 5878 "use strict"; 5879 5880 var Method = require('../method'); 5881 var Property = require('../property'); 5882 5883 function Swarm(web3) { 5884 this._requestManager = web3._requestManager; 5885 5886 var self = this; 5887 5888 methods().forEach(function(method) { 5889 method.attachToObject(self); 5890 method.setRequestManager(self._requestManager); 5891 }); 5892 5893 properties().forEach(function(p) { 5894 p.attachToObject(self); 5895 p.setRequestManager(self._requestManager); 5896 }); 5897 } 5898 5899 var methods = function () { 5900 var blockNetworkRead = new Method({ 5901 name: 'blockNetworkRead', 5902 call: 'bzz_blockNetworkRead', 5903 params: 1, 5904 inputFormatter: [null] 5905 }); 5906 5907 var syncEnabled = new Method({ 5908 name: 'syncEnabled', 5909 call: 'bzz_syncEnabled', 5910 params: 1, 5911 inputFormatter: [null] 5912 }); 5913 5914 var swapEnabled = new Method({ 5915 name: 'swapEnabled', 5916 call: 'bzz_swapEnabled', 5917 params: 1, 5918 inputFormatter: [null] 5919 }); 5920 5921 var download = new Method({ 5922 name: 'download', 5923 call: 'bzz_download', 5924 params: 2, 5925 inputFormatter: [null, null] 5926 }); 5927 5928 var upload = new Method({ 5929 name: 'upload', 5930 call: 'bzz_upload', 5931 params: 2, 5932 inputFormatter: [null, null] 5933 }); 5934 5935 var retrieve = new Method({ 5936 name: 'retrieve', 5937 call: 'bzz_retrieve', 5938 params: 1, 5939 inputFormatter: [null] 5940 }); 5941 5942 var store = new Method({ 5943 name: 'store', 5944 call: 'bzz_store', 5945 params: 2, 5946 inputFormatter: [null, null] 5947 }); 5948 5949 var get = new Method({ 5950 name: 'get', 5951 call: 'bzz_get', 5952 params: 1, 5953 inputFormatter: [null] 5954 }); 5955 5956 var put = new Method({ 5957 name: 'put', 5958 call: 'bzz_put', 5959 params: 2, 5960 inputFormatter: [null, null] 5961 }); 5962 5963 var modify = new Method({ 5964 name: 'modify', 5965 call: 'bzz_modify', 5966 params: 4, 5967 inputFormatter: [null, null, null, null] 5968 }); 5969 5970 return [ 5971 blockNetworkRead, 5972 syncEnabled, 5973 swapEnabled, 5974 download, 5975 upload, 5976 retrieve, 5977 store, 5978 get, 5979 put, 5980 modify 5981 ]; 5982 }; 5983 5984 var properties = function () { 5985 return [ 5986 new Property({ 5987 name: 'hive', 5988 getter: 'bzz_hive' 5989 }), 5990 new Property({ 5991 name: 'info', 5992 getter: 'bzz_info' 5993 }) 5994 ]; 5995 }; 5996 5997 5998 module.exports = Swarm; 5999 6000 },{"../method":36,"../property":45}],43:[function(require,module,exports){ 6001 /* 6002 This file is part of web3.js. 6003 6004 web3.js is free software: you can redistribute it and/or modify 6005 it under the terms of the GNU Lesser General Public License as published by 6006 the Free Software Foundation, either version 3 of the License, or 6007 (at your option) any later version. 6008 6009 web3.js is distributed in the hope that it will be useful, 6010 but WITHOUT ANY WARRANTY; without even the implied warranty of 6011 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 6012 GNU Lesser General Public License for more details. 6013 6014 You should have received a copy of the GNU Lesser General Public License 6015 along with web3.js. If not, see <http://www.gnu.org/licenses/>. 6016 */ 6017 /** @file watches.js 6018 * @authors: 6019 * Marek Kotewicz <marek@ethdev.com> 6020 * @date 2015 6021 */ 6022 6023 var Method = require('../method'); 6024 6025 /// @returns an array of objects describing web3.eth.filter api methods 6026 var eth = function () { 6027 var newFilterCall = function (args) { 6028 var type = args[0]; 6029 6030 switch(type) { 6031 case 'latest': 6032 args.shift(); 6033 this.params = 0; 6034 return 'eth_newBlockFilter'; 6035 case 'pending': 6036 args.shift(); 6037 this.params = 0; 6038 return 'eth_newPendingTransactionFilter'; 6039 default: 6040 return 'eth_newFilter'; 6041 } 6042 }; 6043 6044 var newFilter = new Method({ 6045 name: 'newFilter', 6046 call: newFilterCall, 6047 params: 1 6048 }); 6049 6050 var uninstallFilter = new Method({ 6051 name: 'uninstallFilter', 6052 call: 'eth_uninstallFilter', 6053 params: 1 6054 }); 6055 6056 var getLogs = new Method({ 6057 name: 'getLogs', 6058 call: 'eth_getFilterLogs', 6059 params: 1 6060 }); 6061 6062 var poll = new Method({ 6063 name: 'poll', 6064 call: 'eth_getFilterChanges', 6065 params: 1 6066 }); 6067 6068 return [ 6069 newFilter, 6070 uninstallFilter, 6071 getLogs, 6072 poll 6073 ]; 6074 }; 6075 6076 /// @returns an array of objects describing web3.shh.watch api methods 6077 var shh = function () { 6078 6079 return [ 6080 new Method({ 6081 name: 'newFilter', 6082 call: 'shh_newMessageFilter', 6083 params: 1 6084 }), 6085 new Method({ 6086 name: 'uninstallFilter', 6087 call: 'shh_deleteMessageFilter', 6088 params: 1 6089 }), 6090 new Method({ 6091 name: 'getLogs', 6092 call: 'shh_getFilterMessages', 6093 params: 1 6094 }), 6095 new Method({ 6096 name: 'poll', 6097 call: 'shh_getFilterMessages', 6098 params: 1 6099 }) 6100 ]; 6101 }; 6102 6103 module.exports = { 6104 eth: eth, 6105 shh: shh 6106 }; 6107 6108 6109 },{"../method":36}],44:[function(require,module,exports){ 6110 /* 6111 This file is part of web3.js. 6112 6113 web3.js is free software: you can redistribute it and/or modify 6114 it under the terms of the GNU Lesser General Public License as published by 6115 the Free Software Foundation, either version 3 of the License, or 6116 (at your option) any later version. 6117 6118 web3.js is distributed in the hope that it will be useful, 6119 but WITHOUT ANY WARRANTY; without even the implied warranty of 6120 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 6121 GNU Lesser General Public License for more details. 6122 6123 You should have received a copy of the GNU Lesser General Public License 6124 along with web3.js. If not, see <http://www.gnu.org/licenses/>. 6125 */ 6126 /** 6127 * @file namereg.js 6128 * @author Marek Kotewicz <marek@ethdev.com> 6129 * @date 2015 6130 */ 6131 6132 var globalRegistrarAbi = require('../contracts/GlobalRegistrar.json'); 6133 var icapRegistrarAbi= require('../contracts/ICAPRegistrar.json'); 6134 6135 var globalNameregAddress = '0xc6d9d2cd449a754c494264e1809c50e34d64562b'; 6136 var icapNameregAddress = '0xa1a111bc074c9cfa781f0c38e63bd51c91b8af00'; 6137 6138 module.exports = { 6139 global: { 6140 abi: globalRegistrarAbi, 6141 address: globalNameregAddress 6142 }, 6143 icap: { 6144 abi: icapRegistrarAbi, 6145 address: icapNameregAddress 6146 } 6147 }; 6148 6149 6150 },{"../contracts/GlobalRegistrar.json":1,"../contracts/ICAPRegistrar.json":2}],45:[function(require,module,exports){ 6151 /* 6152 This file is part of web3.js. 6153 6154 web3.js is free software: you can redistribute it and/or modify 6155 it under the terms of the GNU Lesser General Public License as published by 6156 the Free Software Foundation, either version 3 of the License, or 6157 (at your option) any later version. 6158 6159 web3.js is distributed in the hope that it will be useful, 6160 but WITHOUT ANY WARRANTY; without even the implied warranty of 6161 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 6162 GNU Lesser General Public License for more details. 6163 6164 You should have received a copy of the GNU Lesser General Public License 6165 along with web3.js. If not, see <http://www.gnu.org/licenses/>. 6166 */ 6167 /** 6168 * @file property.js 6169 * @author Fabian Vogelsteller <fabian@frozeman.de> 6170 * @author Marek Kotewicz <marek@ethdev.com> 6171 * @date 2015 6172 */ 6173 6174 var utils = require('../utils/utils'); 6175 6176 var Property = function (options) { 6177 this.name = options.name; 6178 this.getter = options.getter; 6179 this.setter = options.setter; 6180 this.outputFormatter = options.outputFormatter; 6181 this.inputFormatter = options.inputFormatter; 6182 this.requestManager = null; 6183 }; 6184 6185 Property.prototype.setRequestManager = function (rm) { 6186 this.requestManager = rm; 6187 }; 6188 6189 /** 6190 * Should be called to format input args of method 6191 * 6192 * @method formatInput 6193 * @param {Array} 6194 * @return {Array} 6195 */ 6196 Property.prototype.formatInput = function (arg) { 6197 return this.inputFormatter ? this.inputFormatter(arg) : arg; 6198 }; 6199 6200 /** 6201 * Should be called to format output(result) of method 6202 * 6203 * @method formatOutput 6204 * @param {Object} 6205 * @return {Object} 6206 */ 6207 Property.prototype.formatOutput = function (result) { 6208 return this.outputFormatter && result !== null && result !== undefined ? this.outputFormatter(result) : result; 6209 }; 6210 6211 /** 6212 * Should be used to extract callback from array of arguments. Modifies input param 6213 * 6214 * @method extractCallback 6215 * @param {Array} arguments 6216 * @return {Function|Null} callback, if exists 6217 */ 6218 Property.prototype.extractCallback = function (args) { 6219 if (utils.isFunction(args[args.length - 1])) { 6220 return args.pop(); // modify the args array! 6221 } 6222 }; 6223 6224 6225 /** 6226 * Should attach function to method 6227 * 6228 * @method attachToObject 6229 * @param {Object} 6230 * @param {Function} 6231 */ 6232 Property.prototype.attachToObject = function (obj) { 6233 var proto = { 6234 get: this.buildGet(), 6235 enumerable: true 6236 }; 6237 6238 var names = this.name.split('.'); 6239 var name = names[0]; 6240 if (names.length > 1) { 6241 obj[names[0]] = obj[names[0]] || {}; 6242 obj = obj[names[0]]; 6243 name = names[1]; 6244 } 6245 6246 Object.defineProperty(obj, name, proto); 6247 obj[asyncGetterName(name)] = this.buildAsyncGet(); 6248 }; 6249 6250 var asyncGetterName = function (name) { 6251 return 'get' + name.charAt(0).toUpperCase() + name.slice(1); 6252 }; 6253 6254 Property.prototype.buildGet = function () { 6255 var property = this; 6256 return function get() { 6257 return property.formatOutput(property.requestManager.send({ 6258 method: property.getter 6259 })); 6260 }; 6261 }; 6262 6263 Property.prototype.buildAsyncGet = function () { 6264 var property = this; 6265 var get = function (callback) { 6266 property.requestManager.sendAsync({ 6267 method: property.getter 6268 }, function (err, result) { 6269 callback(err, property.formatOutput(result)); 6270 }); 6271 }; 6272 get.request = this.request.bind(this); 6273 return get; 6274 }; 6275 6276 /** 6277 * Should be called to create pure JSONRPC request which can be used in batch request 6278 * 6279 * @method request 6280 * @param {...} params 6281 * @return {Object} jsonrpc request 6282 */ 6283 Property.prototype.request = function () { 6284 var payload = { 6285 method: this.getter, 6286 params: [], 6287 callback: this.extractCallback(Array.prototype.slice.call(arguments)) 6288 }; 6289 payload.format = this.formatOutput.bind(this); 6290 return payload; 6291 }; 6292 6293 module.exports = Property; 6294 6295 6296 },{"../utils/utils":20}],46:[function(require,module,exports){ 6297 /* 6298 This file is part of web3.js. 6299 6300 web3.js is free software: you can redistribute it and/or modify 6301 it under the terms of the GNU Lesser General Public License as published by 6302 the Free Software Foundation, either version 3 of the License, or 6303 (at your option) any later version. 6304 6305 web3.js is distributed in the hope that it will be useful, 6306 but WITHOUT ANY WARRANTY; without even the implied warranty of 6307 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 6308 GNU Lesser General Public License for more details. 6309 6310 You should have received a copy of the GNU Lesser General Public License 6311 along with web3.js. If not, see <http://www.gnu.org/licenses/>. 6312 */ 6313 /** 6314 * @file requestmanager.js 6315 * @author Jeffrey Wilcke <jeff@ethdev.com> 6316 * @author Marek Kotewicz <marek@ethdev.com> 6317 * @author Marian Oancea <marian@ethdev.com> 6318 * @author Fabian Vogelsteller <fabian@ethdev.com> 6319 * @author Gav Wood <g@ethdev.com> 6320 * @date 2014 6321 */ 6322 6323 var Jsonrpc = require('./jsonrpc'); 6324 var utils = require('../utils/utils'); 6325 var c = require('../utils/config'); 6326 var errors = require('./errors'); 6327 6328 /** 6329 * It's responsible for passing messages to providers 6330 * It's also responsible for polling the ethereum node for incoming messages 6331 * Default poll timeout is 1 second 6332 * Singleton 6333 */ 6334 var RequestManager = function (provider) { 6335 this.provider = provider; 6336 this.polls = {}; 6337 this.timeout = null; 6338 }; 6339 6340 /** 6341 * Should be used to synchronously send request 6342 * 6343 * @method send 6344 * @param {Object} data 6345 * @return {Object} 6346 */ 6347 RequestManager.prototype.send = function (data) { 6348 if (!this.provider) { 6349 console.error(errors.InvalidProvider()); 6350 return null; 6351 } 6352 6353 var payload = Jsonrpc.toPayload(data.method, data.params); 6354 var result = this.provider.send(payload); 6355 6356 if (!Jsonrpc.isValidResponse(result)) { 6357 throw errors.InvalidResponse(result); 6358 } 6359 6360 return result.result; 6361 }; 6362 6363 /** 6364 * Should be used to asynchronously send request 6365 * 6366 * @method sendAsync 6367 * @param {Object} data 6368 * @param {Function} callback 6369 */ 6370 RequestManager.prototype.sendAsync = function (data, callback) { 6371 if (!this.provider) { 6372 return callback(errors.InvalidProvider()); 6373 } 6374 6375 var payload = Jsonrpc.toPayload(data.method, data.params); 6376 this.provider.sendAsync(payload, function (err, result) { 6377 if (err) { 6378 return callback(err); 6379 } 6380 6381 if (!Jsonrpc.isValidResponse(result)) { 6382 return callback(errors.InvalidResponse(result)); 6383 } 6384 6385 callback(null, result.result); 6386 }); 6387 }; 6388 6389 /** 6390 * Should be called to asynchronously send batch request 6391 * 6392 * @method sendBatch 6393 * @param {Array} batch data 6394 * @param {Function} callback 6395 */ 6396 RequestManager.prototype.sendBatch = function (data, callback) { 6397 if (!this.provider) { 6398 return callback(errors.InvalidProvider()); 6399 } 6400 6401 var payload = Jsonrpc.toBatchPayload(data); 6402 6403 this.provider.sendAsync(payload, function (err, results) { 6404 if (err) { 6405 return callback(err); 6406 } 6407 6408 if (!utils.isArray(results)) { 6409 return callback(errors.InvalidResponse(results)); 6410 } 6411 6412 callback(err, results); 6413 }); 6414 }; 6415 6416 /** 6417 * Should be used to set provider of request manager 6418 * 6419 * @method setProvider 6420 * @param {Object} 6421 */ 6422 RequestManager.prototype.setProvider = function (p) { 6423 this.provider = p; 6424 }; 6425 6426 /** 6427 * Should be used to start polling 6428 * 6429 * @method startPolling 6430 * @param {Object} data 6431 * @param {Number} pollId 6432 * @param {Function} callback 6433 * @param {Function} uninstall 6434 * 6435 * @todo cleanup number of params 6436 */ 6437 RequestManager.prototype.startPolling = function (data, pollId, callback, uninstall) { 6438 this.polls[pollId] = {data: data, id: pollId, callback: callback, uninstall: uninstall}; 6439 6440 6441 // start polling 6442 if (!this.timeout) { 6443 this.poll(); 6444 } 6445 }; 6446 6447 /** 6448 * Should be used to stop polling for filter with given id 6449 * 6450 * @method stopPolling 6451 * @param {Number} pollId 6452 */ 6453 RequestManager.prototype.stopPolling = function (pollId) { 6454 delete this.polls[pollId]; 6455 6456 // stop polling 6457 if(Object.keys(this.polls).length === 0 && this.timeout) { 6458 clearTimeout(this.timeout); 6459 this.timeout = null; 6460 } 6461 }; 6462 6463 /** 6464 * Should be called to reset the polling mechanism of the request manager 6465 * 6466 * @method reset 6467 */ 6468 RequestManager.prototype.reset = function (keepIsSyncing) { 6469 /*jshint maxcomplexity:5 */ 6470 6471 for (var key in this.polls) { 6472 // remove all polls, except sync polls, 6473 // they need to be removed manually by calling syncing.stopWatching() 6474 if(!keepIsSyncing || key.indexOf('syncPoll_') === -1) { 6475 this.polls[key].uninstall(); 6476 delete this.polls[key]; 6477 } 6478 } 6479 6480 // stop polling 6481 if(Object.keys(this.polls).length === 0 && this.timeout) { 6482 clearTimeout(this.timeout); 6483 this.timeout = null; 6484 } 6485 }; 6486 6487 /** 6488 * Should be called to poll for changes on filter with given id 6489 * 6490 * @method poll 6491 */ 6492 RequestManager.prototype.poll = function () { 6493 /*jshint maxcomplexity: 6 */ 6494 this.timeout = setTimeout(this.poll.bind(this), c.ETH_POLLING_TIMEOUT); 6495 6496 if (Object.keys(this.polls).length === 0) { 6497 return; 6498 } 6499 6500 if (!this.provider) { 6501 console.error(errors.InvalidProvider()); 6502 return; 6503 } 6504 6505 var pollsData = []; 6506 var pollsIds = []; 6507 for (var key in this.polls) { 6508 pollsData.push(this.polls[key].data); 6509 pollsIds.push(key); 6510 } 6511 6512 if (pollsData.length === 0) { 6513 return; 6514 } 6515 6516 var payload = Jsonrpc.toBatchPayload(pollsData); 6517 6518 // map the request id to they poll id 6519 var pollsIdMap = {}; 6520 payload.forEach(function(load, index){ 6521 pollsIdMap[load.id] = pollsIds[index]; 6522 }); 6523 6524 6525 var self = this; 6526 this.provider.sendAsync(payload, function (error, results) { 6527 6528 6529 // TODO: console log? 6530 if (error) { 6531 return; 6532 } 6533 6534 if (!utils.isArray(results)) { 6535 throw errors.InvalidResponse(results); 6536 } 6537 results.map(function (result) { 6538 var id = pollsIdMap[result.id]; 6539 6540 // make sure the filter is still installed after arrival of the request 6541 if (self.polls[id]) { 6542 result.callback = self.polls[id].callback; 6543 return result; 6544 } else 6545 return false; 6546 }).filter(function (result) { 6547 return !!result; 6548 }).filter(function (result) { 6549 var valid = Jsonrpc.isValidResponse(result); 6550 if (!valid) { 6551 result.callback(errors.InvalidResponse(result)); 6552 } 6553 return valid; 6554 }).forEach(function (result) { 6555 result.callback(null, result.result); 6556 }); 6557 }); 6558 }; 6559 6560 module.exports = RequestManager; 6561 6562 6563 },{"../utils/config":18,"../utils/utils":20,"./errors":26,"./jsonrpc":35}],47:[function(require,module,exports){ 6564 6565 6566 var Settings = function () { 6567 this.defaultBlock = 'latest'; 6568 this.defaultAccount = undefined; 6569 }; 6570 6571 module.exports = Settings; 6572 6573 6574 },{}],48:[function(require,module,exports){ 6575 /* 6576 This file is part of web3.js. 6577 6578 web3.js is free software: you can redistribute it and/or modify 6579 it under the terms of the GNU Lesser General Public License as published by 6580 the Free Software Foundation, either version 3 of the License, or 6581 (at your option) any later version. 6582 6583 web3.js is distributed in the hope that it will be useful, 6584 but WITHOUT ANY WARRANTY; without even the implied warranty of 6585 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 6586 GNU Lesser General Public License for more details. 6587 6588 You should have received a copy of the GNU Lesser General Public License 6589 along with web3.js. If not, see <http://www.gnu.org/licenses/>. 6590 */ 6591 /** @file syncing.js 6592 * @authors: 6593 * Fabian Vogelsteller <fabian@ethdev.com> 6594 * @date 2015 6595 */ 6596 6597 var formatters = require('./formatters'); 6598 var utils = require('../utils/utils'); 6599 6600 var count = 1; 6601 6602 /** 6603 Adds the callback and sets up the methods, to iterate over the results. 6604 6605 @method pollSyncing 6606 @param {Object} self 6607 */ 6608 var pollSyncing = function(self) { 6609 6610 var onMessage = function (error, sync) { 6611 if (error) { 6612 return self.callbacks.forEach(function (callback) { 6613 callback(error); 6614 }); 6615 } 6616 6617 if(utils.isObject(sync) && sync.startingBlock) 6618 sync = formatters.outputSyncingFormatter(sync); 6619 6620 self.callbacks.forEach(function (callback) { 6621 if (self.lastSyncState !== sync) { 6622 6623 // call the callback with true first so the app can stop anything, before receiving the sync data 6624 if(!self.lastSyncState && utils.isObject(sync)) 6625 callback(null, true); 6626 6627 // call on the next CPU cycle, so the actions of the sync stop can be processes first 6628 setTimeout(function() { 6629 callback(null, sync); 6630 }, 0); 6631 6632 self.lastSyncState = sync; 6633 } 6634 }); 6635 }; 6636 6637 self.requestManager.startPolling({ 6638 method: 'eth_syncing', 6639 params: [], 6640 }, self.pollId, onMessage, self.stopWatching.bind(self)); 6641 6642 }; 6643 6644 var IsSyncing = function (requestManager, callback) { 6645 this.requestManager = requestManager; 6646 this.pollId = 'syncPoll_'+ count++; 6647 this.callbacks = []; 6648 this.addCallback(callback); 6649 this.lastSyncState = false; 6650 pollSyncing(this); 6651 6652 return this; 6653 }; 6654 6655 IsSyncing.prototype.addCallback = function (callback) { 6656 if(callback) 6657 this.callbacks.push(callback); 6658 return this; 6659 }; 6660 6661 IsSyncing.prototype.stopWatching = function () { 6662 this.requestManager.stopPolling(this.pollId); 6663 this.callbacks = []; 6664 }; 6665 6666 module.exports = IsSyncing; 6667 6668 6669 },{"../utils/utils":20,"./formatters":30}],49:[function(require,module,exports){ 6670 /* 6671 This file is part of web3.js. 6672 6673 web3.js is free software: you can redistribute it and/or modify 6674 it under the terms of the GNU Lesser General Public License as published by 6675 the Free Software Foundation, either version 3 of the License, or 6676 (at your option) any later version. 6677 6678 web3.js is distributed in the hope that it will be useful, 6679 but WITHOUT ANY WARRANTY; without even the implied warranty of 6680 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 6681 GNU Lesser General Public License for more details. 6682 6683 You should have received a copy of the GNU Lesser General Public License 6684 along with web3.js. If not, see <http://www.gnu.org/licenses/>. 6685 */ 6686 /** 6687 * @file transfer.js 6688 * @author Marek Kotewicz <marek@ethdev.com> 6689 * @date 2015 6690 */ 6691 6692 var Iban = require('./iban'); 6693 var exchangeAbi = require('../contracts/SmartExchange.json'); 6694 6695 /** 6696 * Should be used to make Iban transfer 6697 * 6698 * @method transfer 6699 * @param {String} from 6700 * @param {String} to iban 6701 * @param {Value} value to be tranfered 6702 * @param {Function} callback, callback 6703 */ 6704 var transfer = function (eth, from, to, value, callback) { 6705 var iban = new Iban(to); 6706 if (!iban.isValid()) { 6707 throw new Error('invalid iban address'); 6708 } 6709 6710 if (iban.isDirect()) { 6711 return transferToAddress(eth, from, iban.address(), value, callback); 6712 } 6713 6714 if (!callback) { 6715 var address = eth.icapNamereg().addr(iban.institution()); 6716 return deposit(eth, from, address, value, iban.client()); 6717 } 6718 6719 eth.icapNamereg().addr(iban.institution(), function (err, address) { 6720 return deposit(eth, from, address, value, iban.client(), callback); 6721 }); 6722 6723 }; 6724 6725 /** 6726 * Should be used to transfer funds to certain address 6727 * 6728 * @method transferToAddress 6729 * @param {String} from 6730 * @param {String} to 6731 * @param {Value} value to be tranfered 6732 * @param {Function} callback, callback 6733 */ 6734 var transferToAddress = function (eth, from, to, value, callback) { 6735 return eth.sendTransaction({ 6736 address: to, 6737 from: from, 6738 value: value 6739 }, callback); 6740 }; 6741 6742 /** 6743 * Should be used to deposit funds to generic Exchange contract (must implement deposit(bytes32) method!) 6744 * 6745 * @method deposit 6746 * @param {String} from 6747 * @param {String} to 6748 * @param {Value} value to be transferred 6749 * @param {String} client unique identifier 6750 * @param {Function} callback, callback 6751 */ 6752 var deposit = function (eth, from, to, value, client, callback) { 6753 var abi = exchangeAbi; 6754 return eth.contract(abi).at(to).deposit(client, { 6755 from: from, 6756 value: value 6757 }, callback); 6758 }; 6759 6760 module.exports = transfer; 6761 6762 6763 },{"../contracts/SmartExchange.json":3,"./iban":33}],50:[function(require,module,exports){ 6764 6765 },{}],51:[function(require,module,exports){ 6766 ;(function (root, factory, undef) { 6767 if (typeof exports === "object") { 6768 // CommonJS 6769 module.exports = exports = factory(require("./core"), require("./enc-base64"), require("./md5"), require("./evpkdf"), require("./cipher-core")); 6770 } 6771 else if (typeof define === "function" && define.amd) { 6772 // AMD 6773 define(["./core", "./enc-base64", "./md5", "./evpkdf", "./cipher-core"], factory); 6774 } 6775 else { 6776 // Global (browser) 6777 factory(root.CryptoJS); 6778 } 6779 }(this, function (CryptoJS) { 6780 6781 (function () { 6782 // Shortcuts 6783 var C = CryptoJS; 6784 var C_lib = C.lib; 6785 var BlockCipher = C_lib.BlockCipher; 6786 var C_algo = C.algo; 6787 6788 // Lookup tables 6789 var SBOX = []; 6790 var INV_SBOX = []; 6791 var SUB_MIX_0 = []; 6792 var SUB_MIX_1 = []; 6793 var SUB_MIX_2 = []; 6794 var SUB_MIX_3 = []; 6795 var INV_SUB_MIX_0 = []; 6796 var INV_SUB_MIX_1 = []; 6797 var INV_SUB_MIX_2 = []; 6798 var INV_SUB_MIX_3 = []; 6799 6800 // Compute lookup tables 6801 (function () { 6802 // Compute double table 6803 var d = []; 6804 for (var i = 0; i < 256; i++) { 6805 if (i < 128) { 6806 d[i] = i << 1; 6807 } else { 6808 d[i] = (i << 1) ^ 0x11b; 6809 } 6810 } 6811 6812 // Walk GF(2^8) 6813 var x = 0; 6814 var xi = 0; 6815 for (var i = 0; i < 256; i++) { 6816 // Compute sbox 6817 var sx = xi ^ (xi << 1) ^ (xi << 2) ^ (xi << 3) ^ (xi << 4); 6818 sx = (sx >>> 8) ^ (sx & 0xff) ^ 0x63; 6819 SBOX[x] = sx; 6820 INV_SBOX[sx] = x; 6821 6822 // Compute multiplication 6823 var x2 = d[x]; 6824 var x4 = d[x2]; 6825 var x8 = d[x4]; 6826 6827 // Compute sub bytes, mix columns tables 6828 var t = (d[sx] * 0x101) ^ (sx * 0x1010100); 6829 SUB_MIX_0[x] = (t << 24) | (t >>> 8); 6830 SUB_MIX_1[x] = (t << 16) | (t >>> 16); 6831 SUB_MIX_2[x] = (t << 8) | (t >>> 24); 6832 SUB_MIX_3[x] = t; 6833 6834 // Compute inv sub bytes, inv mix columns tables 6835 var t = (x8 * 0x1010101) ^ (x4 * 0x10001) ^ (x2 * 0x101) ^ (x * 0x1010100); 6836 INV_SUB_MIX_0[sx] = (t << 24) | (t >>> 8); 6837 INV_SUB_MIX_1[sx] = (t << 16) | (t >>> 16); 6838 INV_SUB_MIX_2[sx] = (t << 8) | (t >>> 24); 6839 INV_SUB_MIX_3[sx] = t; 6840 6841 // Compute next counter 6842 if (!x) { 6843 x = xi = 1; 6844 } else { 6845 x = x2 ^ d[d[d[x8 ^ x2]]]; 6846 xi ^= d[d[xi]]; 6847 } 6848 } 6849 }()); 6850 6851 // Precomputed Rcon lookup 6852 var RCON = [0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36]; 6853 6854 /** 6855 * AES block cipher algorithm. 6856 */ 6857 var AES = C_algo.AES = BlockCipher.extend({ 6858 _doReset: function () { 6859 // Skip reset of nRounds has been set before and key did not change 6860 if (this._nRounds && this._keyPriorReset === this._key) { 6861 return; 6862 } 6863 6864 // Shortcuts 6865 var key = this._keyPriorReset = this._key; 6866 var keyWords = key.words; 6867 var keySize = key.sigBytes / 4; 6868 6869 // Compute number of rounds 6870 var nRounds = this._nRounds = keySize + 6; 6871 6872 // Compute number of key schedule rows 6873 var ksRows = (nRounds + 1) * 4; 6874 6875 // Compute key schedule 6876 var keySchedule = this._keySchedule = []; 6877 for (var ksRow = 0; ksRow < ksRows; ksRow++) { 6878 if (ksRow < keySize) { 6879 keySchedule[ksRow] = keyWords[ksRow]; 6880 } else { 6881 var t = keySchedule[ksRow - 1]; 6882 6883 if (!(ksRow % keySize)) { 6884 // Rot word 6885 t = (t << 8) | (t >>> 24); 6886 6887 // Sub word 6888 t = (SBOX[t >>> 24] << 24) | (SBOX[(t >>> 16) & 0xff] << 16) | (SBOX[(t >>> 8) & 0xff] << 8) | SBOX[t & 0xff]; 6889 6890 // Mix Rcon 6891 t ^= RCON[(ksRow / keySize) | 0] << 24; 6892 } else if (keySize > 6 && ksRow % keySize == 4) { 6893 // Sub word 6894 t = (SBOX[t >>> 24] << 24) | (SBOX[(t >>> 16) & 0xff] << 16) | (SBOX[(t >>> 8) & 0xff] << 8) | SBOX[t & 0xff]; 6895 } 6896 6897 keySchedule[ksRow] = keySchedule[ksRow - keySize] ^ t; 6898 } 6899 } 6900 6901 // Compute inv key schedule 6902 var invKeySchedule = this._invKeySchedule = []; 6903 for (var invKsRow = 0; invKsRow < ksRows; invKsRow++) { 6904 var ksRow = ksRows - invKsRow; 6905 6906 if (invKsRow % 4) { 6907 var t = keySchedule[ksRow]; 6908 } else { 6909 var t = keySchedule[ksRow - 4]; 6910 } 6911 6912 if (invKsRow < 4 || ksRow <= 4) { 6913 invKeySchedule[invKsRow] = t; 6914 } else { 6915 invKeySchedule[invKsRow] = INV_SUB_MIX_0[SBOX[t >>> 24]] ^ INV_SUB_MIX_1[SBOX[(t >>> 16) & 0xff]] ^ 6916 INV_SUB_MIX_2[SBOX[(t >>> 8) & 0xff]] ^ INV_SUB_MIX_3[SBOX[t & 0xff]]; 6917 } 6918 } 6919 }, 6920 6921 encryptBlock: function (M, offset) { 6922 this._doCryptBlock(M, offset, this._keySchedule, SUB_MIX_0, SUB_MIX_1, SUB_MIX_2, SUB_MIX_3, SBOX); 6923 }, 6924 6925 decryptBlock: function (M, offset) { 6926 // Swap 2nd and 4th rows 6927 var t = M[offset + 1]; 6928 M[offset + 1] = M[offset + 3]; 6929 M[offset + 3] = t; 6930 6931 this._doCryptBlock(M, offset, this._invKeySchedule, INV_SUB_MIX_0, INV_SUB_MIX_1, INV_SUB_MIX_2, INV_SUB_MIX_3, INV_SBOX); 6932 6933 // Inv swap 2nd and 4th rows 6934 var t = M[offset + 1]; 6935 M[offset + 1] = M[offset + 3]; 6936 M[offset + 3] = t; 6937 }, 6938 6939 _doCryptBlock: function (M, offset, keySchedule, SUB_MIX_0, SUB_MIX_1, SUB_MIX_2, SUB_MIX_3, SBOX) { 6940 // Shortcut 6941 var nRounds = this._nRounds; 6942 6943 // Get input, add round key 6944 var s0 = M[offset] ^ keySchedule[0]; 6945 var s1 = M[offset + 1] ^ keySchedule[1]; 6946 var s2 = M[offset + 2] ^ keySchedule[2]; 6947 var s3 = M[offset + 3] ^ keySchedule[3]; 6948 6949 // Key schedule row counter 6950 var ksRow = 4; 6951 6952 // Rounds 6953 for (var round = 1; round < nRounds; round++) { 6954 // Shift rows, sub bytes, mix columns, add round key 6955 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++]; 6956 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++]; 6957 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++]; 6958 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++]; 6959 6960 // Update state 6961 s0 = t0; 6962 s1 = t1; 6963 s2 = t2; 6964 s3 = t3; 6965 } 6966 6967 // Shift rows, sub bytes, add round key 6968 var t0 = ((SBOX[s0 >>> 24] << 24) | (SBOX[(s1 >>> 16) & 0xff] << 16) | (SBOX[(s2 >>> 8) & 0xff] << 8) | SBOX[s3 & 0xff]) ^ keySchedule[ksRow++]; 6969 var t1 = ((SBOX[s1 >>> 24] << 24) | (SBOX[(s2 >>> 16) & 0xff] << 16) | (SBOX[(s3 >>> 8) & 0xff] << 8) | SBOX[s0 & 0xff]) ^ keySchedule[ksRow++]; 6970 var t2 = ((SBOX[s2 >>> 24] << 24) | (SBOX[(s3 >>> 16) & 0xff] << 16) | (SBOX[(s0 >>> 8) & 0xff] << 8) | SBOX[s1 & 0xff]) ^ keySchedule[ksRow++]; 6971 var t3 = ((SBOX[s3 >>> 24] << 24) | (SBOX[(s0 >>> 16) & 0xff] << 16) | (SBOX[(s1 >>> 8) & 0xff] << 8) | SBOX[s2 & 0xff]) ^ keySchedule[ksRow++]; 6972 6973 // Set output 6974 M[offset] = t0; 6975 M[offset + 1] = t1; 6976 M[offset + 2] = t2; 6977 M[offset + 3] = t3; 6978 }, 6979 6980 keySize: 256/32 6981 }); 6982 6983 /** 6984 * Shortcut functions to the cipher's object interface. 6985 * 6986 * @example 6987 * 6988 * var ciphertext = CryptoJS.AES.encrypt(message, key, cfg); 6989 * var plaintext = CryptoJS.AES.decrypt(ciphertext, key, cfg); 6990 */ 6991 C.AES = BlockCipher._createHelper(AES); 6992 }()); 6993 6994 6995 return CryptoJS.AES; 6996 6997 })); 6998 },{"./cipher-core":52,"./core":53,"./enc-base64":54,"./evpkdf":56,"./md5":61}],52:[function(require,module,exports){ 6999 ;(function (root, factory) { 7000 if (typeof exports === "object") { 7001 // CommonJS 7002 module.exports = exports = factory(require("./core")); 7003 } 7004 else if (typeof define === "function" && define.amd) { 7005 // AMD 7006 define(["./core"], factory); 7007 } 7008 else { 7009 // Global (browser) 7010 factory(root.CryptoJS); 7011 } 7012 }(this, function (CryptoJS) { 7013 7014 /** 7015 * Cipher core components. 7016 */ 7017 CryptoJS.lib.Cipher || (function (undefined) { 7018 // Shortcuts 7019 var C = CryptoJS; 7020 var C_lib = C.lib; 7021 var Base = C_lib.Base; 7022 var WordArray = C_lib.WordArray; 7023 var BufferedBlockAlgorithm = C_lib.BufferedBlockAlgorithm; 7024 var C_enc = C.enc; 7025 var Utf8 = C_enc.Utf8; 7026 var Base64 = C_enc.Base64; 7027 var C_algo = C.algo; 7028 var EvpKDF = C_algo.EvpKDF; 7029 7030 /** 7031 * Abstract base cipher template. 7032 * 7033 * @property {number} keySize This cipher's key size. Default: 4 (128 bits) 7034 * @property {number} ivSize This cipher's IV size. Default: 4 (128 bits) 7035 * @property {number} _ENC_XFORM_MODE A constant representing encryption mode. 7036 * @property {number} _DEC_XFORM_MODE A constant representing decryption mode. 7037 */ 7038 var Cipher = C_lib.Cipher = BufferedBlockAlgorithm.extend({ 7039 /** 7040 * Configuration options. 7041 * 7042 * @property {WordArray} iv The IV to use for this operation. 7043 */ 7044 cfg: Base.extend(), 7045 7046 /** 7047 * Creates this cipher in encryption mode. 7048 * 7049 * @param {WordArray} key The key. 7050 * @param {Object} cfg (Optional) The configuration options to use for this operation. 7051 * 7052 * @return {Cipher} A cipher instance. 7053 * 7054 * @static 7055 * 7056 * @example 7057 * 7058 * var cipher = CryptoJS.algo.AES.createEncryptor(keyWordArray, { iv: ivWordArray }); 7059 */ 7060 createEncryptor: function (key, cfg) { 7061 return this.create(this._ENC_XFORM_MODE, key, cfg); 7062 }, 7063 7064 /** 7065 * Creates this cipher in decryption mode. 7066 * 7067 * @param {WordArray} key The key. 7068 * @param {Object} cfg (Optional) The configuration options to use for this operation. 7069 * 7070 * @return {Cipher} A cipher instance. 7071 * 7072 * @static 7073 * 7074 * @example 7075 * 7076 * var cipher = CryptoJS.algo.AES.createDecryptor(keyWordArray, { iv: ivWordArray }); 7077 */ 7078 createDecryptor: function (key, cfg) { 7079 return this.create(this._DEC_XFORM_MODE, key, cfg); 7080 }, 7081 7082 /** 7083 * Initializes a newly created cipher. 7084 * 7085 * @param {number} xformMode Either the encryption or decryption transormation mode constant. 7086 * @param {WordArray} key The key. 7087 * @param {Object} cfg (Optional) The configuration options to use for this operation. 7088 * 7089 * @example 7090 * 7091 * var cipher = CryptoJS.algo.AES.create(CryptoJS.algo.AES._ENC_XFORM_MODE, keyWordArray, { iv: ivWordArray }); 7092 */ 7093 init: function (xformMode, key, cfg) { 7094 // Apply config defaults 7095 this.cfg = this.cfg.extend(cfg); 7096 7097 // Store transform mode and key 7098 this._xformMode = xformMode; 7099 this._key = key; 7100 7101 // Set initial values 7102 this.reset(); 7103 }, 7104 7105 /** 7106 * Resets this cipher to its initial state. 7107 * 7108 * @example 7109 * 7110 * cipher.reset(); 7111 */ 7112 reset: function () { 7113 // Reset data buffer 7114 BufferedBlockAlgorithm.reset.call(this); 7115 7116 // Perform concrete-cipher logic 7117 this._doReset(); 7118 }, 7119 7120 /** 7121 * Adds data to be encrypted or decrypted. 7122 * 7123 * @param {WordArray|string} dataUpdate The data to encrypt or decrypt. 7124 * 7125 * @return {WordArray} The data after processing. 7126 * 7127 * @example 7128 * 7129 * var encrypted = cipher.process('data'); 7130 * var encrypted = cipher.process(wordArray); 7131 */ 7132 process: function (dataUpdate) { 7133 // Append 7134 this._append(dataUpdate); 7135 7136 // Process available blocks 7137 return this._process(); 7138 }, 7139 7140 /** 7141 * Finalizes the encryption or decryption process. 7142 * Note that the finalize operation is effectively a destructive, read-once operation. 7143 * 7144 * @param {WordArray|string} dataUpdate The final data to encrypt or decrypt. 7145 * 7146 * @return {WordArray} The data after final processing. 7147 * 7148 * @example 7149 * 7150 * var encrypted = cipher.finalize(); 7151 * var encrypted = cipher.finalize('data'); 7152 * var encrypted = cipher.finalize(wordArray); 7153 */ 7154 finalize: function (dataUpdate) { 7155 // Final data update 7156 if (dataUpdate) { 7157 this._append(dataUpdate); 7158 } 7159 7160 // Perform concrete-cipher logic 7161 var finalProcessedData = this._doFinalize(); 7162 7163 return finalProcessedData; 7164 }, 7165 7166 keySize: 128/32, 7167 7168 ivSize: 128/32, 7169 7170 _ENC_XFORM_MODE: 1, 7171 7172 _DEC_XFORM_MODE: 2, 7173 7174 /** 7175 * Creates shortcut functions to a cipher's object interface. 7176 * 7177 * @param {Cipher} cipher The cipher to create a helper for. 7178 * 7179 * @return {Object} An object with encrypt and decrypt shortcut functions. 7180 * 7181 * @static 7182 * 7183 * @example 7184 * 7185 * var AES = CryptoJS.lib.Cipher._createHelper(CryptoJS.algo.AES); 7186 */ 7187 _createHelper: (function () { 7188 function selectCipherStrategy(key) { 7189 if (typeof key == 'string') { 7190 return PasswordBasedCipher; 7191 } else { 7192 return SerializableCipher; 7193 } 7194 } 7195 7196 return function (cipher) { 7197 return { 7198 encrypt: function (message, key, cfg) { 7199 return selectCipherStrategy(key).encrypt(cipher, message, key, cfg); 7200 }, 7201 7202 decrypt: function (ciphertext, key, cfg) { 7203 return selectCipherStrategy(key).decrypt(cipher, ciphertext, key, cfg); 7204 } 7205 }; 7206 }; 7207 }()) 7208 }); 7209 7210 /** 7211 * Abstract base stream cipher template. 7212 * 7213 * @property {number} blockSize The number of 32-bit words this cipher operates on. Default: 1 (32 bits) 7214 */ 7215 var StreamCipher = C_lib.StreamCipher = Cipher.extend({ 7216 _doFinalize: function () { 7217 // Process partial blocks 7218 var finalProcessedBlocks = this._process(!!'flush'); 7219 7220 return finalProcessedBlocks; 7221 }, 7222 7223 blockSize: 1 7224 }); 7225 7226 /** 7227 * Mode namespace. 7228 */ 7229 var C_mode = C.mode = {}; 7230 7231 /** 7232 * Abstract base block cipher mode template. 7233 */ 7234 var BlockCipherMode = C_lib.BlockCipherMode = Base.extend({ 7235 /** 7236 * Creates this mode for encryption. 7237 * 7238 * @param {Cipher} cipher A block cipher instance. 7239 * @param {Array} iv The IV words. 7240 * 7241 * @static 7242 * 7243 * @example 7244 * 7245 * var mode = CryptoJS.mode.CBC.createEncryptor(cipher, iv.words); 7246 */ 7247 createEncryptor: function (cipher, iv) { 7248 return this.Encryptor.create(cipher, iv); 7249 }, 7250 7251 /** 7252 * Creates this mode for decryption. 7253 * 7254 * @param {Cipher} cipher A block cipher instance. 7255 * @param {Array} iv The IV words. 7256 * 7257 * @static 7258 * 7259 * @example 7260 * 7261 * var mode = CryptoJS.mode.CBC.createDecryptor(cipher, iv.words); 7262 */ 7263 createDecryptor: function (cipher, iv) { 7264 return this.Decryptor.create(cipher, iv); 7265 }, 7266 7267 /** 7268 * Initializes a newly created mode. 7269 * 7270 * @param {Cipher} cipher A block cipher instance. 7271 * @param {Array} iv The IV words. 7272 * 7273 * @example 7274 * 7275 * var mode = CryptoJS.mode.CBC.Encryptor.create(cipher, iv.words); 7276 */ 7277 init: function (cipher, iv) { 7278 this._cipher = cipher; 7279 this._iv = iv; 7280 } 7281 }); 7282 7283 /** 7284 * Cipher Block Chaining mode. 7285 */ 7286 var CBC = C_mode.CBC = (function () { 7287 /** 7288 * Abstract base CBC mode. 7289 */ 7290 var CBC = BlockCipherMode.extend(); 7291 7292 /** 7293 * CBC encryptor. 7294 */ 7295 CBC.Encryptor = CBC.extend({ 7296 /** 7297 * Processes the data block at offset. 7298 * 7299 * @param {Array} words The data words to operate on. 7300 * @param {number} offset The offset where the block starts. 7301 * 7302 * @example 7303 * 7304 * mode.processBlock(data.words, offset); 7305 */ 7306 processBlock: function (words, offset) { 7307 // Shortcuts 7308 var cipher = this._cipher; 7309 var blockSize = cipher.blockSize; 7310 7311 // XOR and encrypt 7312 xorBlock.call(this, words, offset, blockSize); 7313 cipher.encryptBlock(words, offset); 7314 7315 // Remember this block to use with next block 7316 this._prevBlock = words.slice(offset, offset + blockSize); 7317 } 7318 }); 7319 7320 /** 7321 * CBC decryptor. 7322 */ 7323 CBC.Decryptor = CBC.extend({ 7324 /** 7325 * Processes the data block at offset. 7326 * 7327 * @param {Array} words The data words to operate on. 7328 * @param {number} offset The offset where the block starts. 7329 * 7330 * @example 7331 * 7332 * mode.processBlock(data.words, offset); 7333 */ 7334 processBlock: function (words, offset) { 7335 // Shortcuts 7336 var cipher = this._cipher; 7337 var blockSize = cipher.blockSize; 7338 7339 // Remember this block to use with next block 7340 var thisBlock = words.slice(offset, offset + blockSize); 7341 7342 // Decrypt and XOR 7343 cipher.decryptBlock(words, offset); 7344 xorBlock.call(this, words, offset, blockSize); 7345 7346 // This block becomes the previous block 7347 this._prevBlock = thisBlock; 7348 } 7349 }); 7350 7351 function xorBlock(words, offset, blockSize) { 7352 // Shortcut 7353 var iv = this._iv; 7354 7355 // Choose mixing block 7356 if (iv) { 7357 var block = iv; 7358 7359 // Remove IV for subsequent blocks 7360 this._iv = undefined; 7361 } else { 7362 var block = this._prevBlock; 7363 } 7364 7365 // XOR blocks 7366 for (var i = 0; i < blockSize; i++) { 7367 words[offset + i] ^= block[i]; 7368 } 7369 } 7370 7371 return CBC; 7372 }()); 7373 7374 /** 7375 * Padding namespace. 7376 */ 7377 var C_pad = C.pad = {}; 7378 7379 /** 7380 * PKCS #5/7 padding strategy. 7381 */ 7382 var Pkcs7 = C_pad.Pkcs7 = { 7383 /** 7384 * Pads data using the algorithm defined in PKCS #5/7. 7385 * 7386 * @param {WordArray} data The data to pad. 7387 * @param {number} blockSize The multiple that the data should be padded to. 7388 * 7389 * @static 7390 * 7391 * @example 7392 * 7393 * CryptoJS.pad.Pkcs7.pad(wordArray, 4); 7394 */ 7395 pad: function (data, blockSize) { 7396 // Shortcut 7397 var blockSizeBytes = blockSize * 4; 7398 7399 // Count padding bytes 7400 var nPaddingBytes = blockSizeBytes - data.sigBytes % blockSizeBytes; 7401 7402 // Create padding word 7403 var paddingWord = (nPaddingBytes << 24) | (nPaddingBytes << 16) | (nPaddingBytes << 8) | nPaddingBytes; 7404 7405 // Create padding 7406 var paddingWords = []; 7407 for (var i = 0; i < nPaddingBytes; i += 4) { 7408 paddingWords.push(paddingWord); 7409 } 7410 var padding = WordArray.create(paddingWords, nPaddingBytes); 7411 7412 // Add padding 7413 data.concat(padding); 7414 }, 7415 7416 /** 7417 * Unpads data that had been padded using the algorithm defined in PKCS #5/7. 7418 * 7419 * @param {WordArray} data The data to unpad. 7420 * 7421 * @static 7422 * 7423 * @example 7424 * 7425 * CryptoJS.pad.Pkcs7.unpad(wordArray); 7426 */ 7427 unpad: function (data) { 7428 // Get number of padding bytes from last byte 7429 var nPaddingBytes = data.words[(data.sigBytes - 1) >>> 2] & 0xff; 7430 7431 // Remove padding 7432 data.sigBytes -= nPaddingBytes; 7433 } 7434 }; 7435 7436 /** 7437 * Abstract base block cipher template. 7438 * 7439 * @property {number} blockSize The number of 32-bit words this cipher operates on. Default: 4 (128 bits) 7440 */ 7441 var BlockCipher = C_lib.BlockCipher = Cipher.extend({ 7442 /** 7443 * Configuration options. 7444 * 7445 * @property {Mode} mode The block mode to use. Default: CBC 7446 * @property {Padding} padding The padding strategy to use. Default: Pkcs7 7447 */ 7448 cfg: Cipher.cfg.extend({ 7449 mode: CBC, 7450 padding: Pkcs7 7451 }), 7452 7453 reset: function () { 7454 // Reset cipher 7455 Cipher.reset.call(this); 7456 7457 // Shortcuts 7458 var cfg = this.cfg; 7459 var iv = cfg.iv; 7460 var mode = cfg.mode; 7461 7462 // Reset block mode 7463 if (this._xformMode == this._ENC_XFORM_MODE) { 7464 var modeCreator = mode.createEncryptor; 7465 } else /* if (this._xformMode == this._DEC_XFORM_MODE) */ { 7466 var modeCreator = mode.createDecryptor; 7467 7468 // Keep at least one block in the buffer for unpadding 7469 this._minBufferSize = 1; 7470 } 7471 this._mode = modeCreator.call(mode, this, iv && iv.words); 7472 }, 7473 7474 _doProcessBlock: function (words, offset) { 7475 this._mode.processBlock(words, offset); 7476 }, 7477 7478 _doFinalize: function () { 7479 // Shortcut 7480 var padding = this.cfg.padding; 7481 7482 // Finalize 7483 if (this._xformMode == this._ENC_XFORM_MODE) { 7484 // Pad data 7485 padding.pad(this._data, this.blockSize); 7486 7487 // Process final blocks 7488 var finalProcessedBlocks = this._process(!!'flush'); 7489 } else /* if (this._xformMode == this._DEC_XFORM_MODE) */ { 7490 // Process final blocks 7491 var finalProcessedBlocks = this._process(!!'flush'); 7492 7493 // Unpad data 7494 padding.unpad(finalProcessedBlocks); 7495 } 7496 7497 return finalProcessedBlocks; 7498 }, 7499 7500 blockSize: 128/32 7501 }); 7502 7503 /** 7504 * A collection of cipher parameters. 7505 * 7506 * @property {WordArray} ciphertext The raw ciphertext. 7507 * @property {WordArray} key The key to this ciphertext. 7508 * @property {WordArray} iv The IV used in the ciphering operation. 7509 * @property {WordArray} salt The salt used with a key derivation function. 7510 * @property {Cipher} algorithm The cipher algorithm. 7511 * @property {Mode} mode The block mode used in the ciphering operation. 7512 * @property {Padding} padding The padding scheme used in the ciphering operation. 7513 * @property {number} blockSize The block size of the cipher. 7514 * @property {Format} formatter The default formatting strategy to convert this cipher params object to a string. 7515 */ 7516 var CipherParams = C_lib.CipherParams = Base.extend({ 7517 /** 7518 * Initializes a newly created cipher params object. 7519 * 7520 * @param {Object} cipherParams An object with any of the possible cipher parameters. 7521 * 7522 * @example 7523 * 7524 * var cipherParams = CryptoJS.lib.CipherParams.create({ 7525 * ciphertext: ciphertextWordArray, 7526 * key: keyWordArray, 7527 * iv: ivWordArray, 7528 * salt: saltWordArray, 7529 * algorithm: CryptoJS.algo.AES, 7530 * mode: CryptoJS.mode.CBC, 7531 * padding: CryptoJS.pad.PKCS7, 7532 * blockSize: 4, 7533 * formatter: CryptoJS.format.OpenSSL 7534 * }); 7535 */ 7536 init: function (cipherParams) { 7537 this.mixIn(cipherParams); 7538 }, 7539 7540 /** 7541 * Converts this cipher params object to a string. 7542 * 7543 * @param {Format} formatter (Optional) The formatting strategy to use. 7544 * 7545 * @return {string} The stringified cipher params. 7546 * 7547 * @throws Error If neither the formatter nor the default formatter is set. 7548 * 7549 * @example 7550 * 7551 * var string = cipherParams + ''; 7552 * var string = cipherParams.toString(); 7553 * var string = cipherParams.toString(CryptoJS.format.OpenSSL); 7554 */ 7555 toString: function (formatter) { 7556 return (formatter || this.formatter).stringify(this); 7557 } 7558 }); 7559 7560 /** 7561 * Format namespace. 7562 */ 7563 var C_format = C.format = {}; 7564 7565 /** 7566 * OpenSSL formatting strategy. 7567 */ 7568 var OpenSSLFormatter = C_format.OpenSSL = { 7569 /** 7570 * Converts a cipher params object to an OpenSSL-compatible string. 7571 * 7572 * @param {CipherParams} cipherParams The cipher params object. 7573 * 7574 * @return {string} The OpenSSL-compatible string. 7575 * 7576 * @static 7577 * 7578 * @example 7579 * 7580 * var openSSLString = CryptoJS.format.OpenSSL.stringify(cipherParams); 7581 */ 7582 stringify: function (cipherParams) { 7583 // Shortcuts 7584 var ciphertext = cipherParams.ciphertext; 7585 var salt = cipherParams.salt; 7586 7587 // Format 7588 if (salt) { 7589 var wordArray = WordArray.create([0x53616c74, 0x65645f5f]).concat(salt).concat(ciphertext); 7590 } else { 7591 var wordArray = ciphertext; 7592 } 7593 7594 return wordArray.toString(Base64); 7595 }, 7596 7597 /** 7598 * Converts an OpenSSL-compatible string to a cipher params object. 7599 * 7600 * @param {string} openSSLStr The OpenSSL-compatible string. 7601 * 7602 * @return {CipherParams} The cipher params object. 7603 * 7604 * @static 7605 * 7606 * @example 7607 * 7608 * var cipherParams = CryptoJS.format.OpenSSL.parse(openSSLString); 7609 */ 7610 parse: function (openSSLStr) { 7611 // Parse base64 7612 var ciphertext = Base64.parse(openSSLStr); 7613 7614 // Shortcut 7615 var ciphertextWords = ciphertext.words; 7616 7617 // Test for salt 7618 if (ciphertextWords[0] == 0x53616c74 && ciphertextWords[1] == 0x65645f5f) { 7619 // Extract salt 7620 var salt = WordArray.create(ciphertextWords.slice(2, 4)); 7621 7622 // Remove salt from ciphertext 7623 ciphertextWords.splice(0, 4); 7624 ciphertext.sigBytes -= 16; 7625 } 7626 7627 return CipherParams.create({ ciphertext: ciphertext, salt: salt }); 7628 } 7629 }; 7630 7631 /** 7632 * A cipher wrapper that returns ciphertext as a serializable cipher params object. 7633 */ 7634 var SerializableCipher = C_lib.SerializableCipher = Base.extend({ 7635 /** 7636 * Configuration options. 7637 * 7638 * @property {Formatter} format The formatting strategy to convert cipher param objects to and from a string. Default: OpenSSL 7639 */ 7640 cfg: Base.extend({ 7641 format: OpenSSLFormatter 7642 }), 7643 7644 /** 7645 * Encrypts a message. 7646 * 7647 * @param {Cipher} cipher The cipher algorithm to use. 7648 * @param {WordArray|string} message The message to encrypt. 7649 * @param {WordArray} key The key. 7650 * @param {Object} cfg (Optional) The configuration options to use for this operation. 7651 * 7652 * @return {CipherParams} A cipher params object. 7653 * 7654 * @static 7655 * 7656 * @example 7657 * 7658 * var ciphertextParams = CryptoJS.lib.SerializableCipher.encrypt(CryptoJS.algo.AES, message, key); 7659 * var ciphertextParams = CryptoJS.lib.SerializableCipher.encrypt(CryptoJS.algo.AES, message, key, { iv: iv }); 7660 * var ciphertextParams = CryptoJS.lib.SerializableCipher.encrypt(CryptoJS.algo.AES, message, key, { iv: iv, format: CryptoJS.format.OpenSSL }); 7661 */ 7662 encrypt: function (cipher, message, key, cfg) { 7663 // Apply config defaults 7664 cfg = this.cfg.extend(cfg); 7665 7666 // Encrypt 7667 var encryptor = cipher.createEncryptor(key, cfg); 7668 var ciphertext = encryptor.finalize(message); 7669 7670 // Shortcut 7671 var cipherCfg = encryptor.cfg; 7672 7673 // Create and return serializable cipher params 7674 return CipherParams.create({ 7675 ciphertext: ciphertext, 7676 key: key, 7677 iv: cipherCfg.iv, 7678 algorithm: cipher, 7679 mode: cipherCfg.mode, 7680 padding: cipherCfg.padding, 7681 blockSize: cipher.blockSize, 7682 formatter: cfg.format 7683 }); 7684 }, 7685 7686 /** 7687 * Decrypts serialized ciphertext. 7688 * 7689 * @param {Cipher} cipher The cipher algorithm to use. 7690 * @param {CipherParams|string} ciphertext The ciphertext to decrypt. 7691 * @param {WordArray} key The key. 7692 * @param {Object} cfg (Optional) The configuration options to use for this operation. 7693 * 7694 * @return {WordArray} The plaintext. 7695 * 7696 * @static 7697 * 7698 * @example 7699 * 7700 * var plaintext = CryptoJS.lib.SerializableCipher.decrypt(CryptoJS.algo.AES, formattedCiphertext, key, { iv: iv, format: CryptoJS.format.OpenSSL }); 7701 * var plaintext = CryptoJS.lib.SerializableCipher.decrypt(CryptoJS.algo.AES, ciphertextParams, key, { iv: iv, format: CryptoJS.format.OpenSSL }); 7702 */ 7703 decrypt: function (cipher, ciphertext, key, cfg) { 7704 // Apply config defaults 7705 cfg = this.cfg.extend(cfg); 7706 7707 // Convert string to CipherParams 7708 ciphertext = this._parse(ciphertext, cfg.format); 7709 7710 // Decrypt 7711 var plaintext = cipher.createDecryptor(key, cfg).finalize(ciphertext.ciphertext); 7712 7713 return plaintext; 7714 }, 7715 7716 /** 7717 * Converts serialized ciphertext to CipherParams, 7718 * else assumed CipherParams already and returns ciphertext unchanged. 7719 * 7720 * @param {CipherParams|string} ciphertext The ciphertext. 7721 * @param {Formatter} format The formatting strategy to use to parse serialized ciphertext. 7722 * 7723 * @return {CipherParams} The unserialized ciphertext. 7724 * 7725 * @static 7726 * 7727 * @example 7728 * 7729 * var ciphertextParams = CryptoJS.lib.SerializableCipher._parse(ciphertextStringOrParams, format); 7730 */ 7731 _parse: function (ciphertext, format) { 7732 if (typeof ciphertext == 'string') { 7733 return format.parse(ciphertext, this); 7734 } else { 7735 return ciphertext; 7736 } 7737 } 7738 }); 7739 7740 /** 7741 * Key derivation function namespace. 7742 */ 7743 var C_kdf = C.kdf = {}; 7744 7745 /** 7746 * OpenSSL key derivation function. 7747 */ 7748 var OpenSSLKdf = C_kdf.OpenSSL = { 7749 /** 7750 * Derives a key and IV from a password. 7751 * 7752 * @param {string} password The password to derive from. 7753 * @param {number} keySize The size in words of the key to generate. 7754 * @param {number} ivSize The size in words of the IV to generate. 7755 * @param {WordArray|string} salt (Optional) A 64-bit salt to use. If omitted, a salt will be generated randomly. 7756 * 7757 * @return {CipherParams} A cipher params object with the key, IV, and salt. 7758 * 7759 * @static 7760 * 7761 * @example 7762 * 7763 * var derivedParams = CryptoJS.kdf.OpenSSL.execute('Password', 256/32, 128/32); 7764 * var derivedParams = CryptoJS.kdf.OpenSSL.execute('Password', 256/32, 128/32, 'saltsalt'); 7765 */ 7766 execute: function (password, keySize, ivSize, salt) { 7767 // Generate random salt 7768 if (!salt) { 7769 salt = WordArray.random(64/8); 7770 } 7771 7772 // Derive key and IV 7773 var key = EvpKDF.create({ keySize: keySize + ivSize }).compute(password, salt); 7774 7775 // Separate key and IV 7776 var iv = WordArray.create(key.words.slice(keySize), ivSize * 4); 7777 key.sigBytes = keySize * 4; 7778 7779 // Return params 7780 return CipherParams.create({ key: key, iv: iv, salt: salt }); 7781 } 7782 }; 7783 7784 /** 7785 * A serializable cipher wrapper that derives the key from a password, 7786 * and returns ciphertext as a serializable cipher params object. 7787 */ 7788 var PasswordBasedCipher = C_lib.PasswordBasedCipher = SerializableCipher.extend({ 7789 /** 7790 * Configuration options. 7791 * 7792 * @property {KDF} kdf The key derivation function to use to generate a key and IV from a password. Default: OpenSSL 7793 */ 7794 cfg: SerializableCipher.cfg.extend({ 7795 kdf: OpenSSLKdf 7796 }), 7797 7798 /** 7799 * Encrypts a message using a password. 7800 * 7801 * @param {Cipher} cipher The cipher algorithm to use. 7802 * @param {WordArray|string} message The message to encrypt. 7803 * @param {string} password The password. 7804 * @param {Object} cfg (Optional) The configuration options to use for this operation. 7805 * 7806 * @return {CipherParams} A cipher params object. 7807 * 7808 * @static 7809 * 7810 * @example 7811 * 7812 * var ciphertextParams = CryptoJS.lib.PasswordBasedCipher.encrypt(CryptoJS.algo.AES, message, 'password'); 7813 * var ciphertextParams = CryptoJS.lib.PasswordBasedCipher.encrypt(CryptoJS.algo.AES, message, 'password', { format: CryptoJS.format.OpenSSL }); 7814 */ 7815 encrypt: function (cipher, message, password, cfg) { 7816 // Apply config defaults 7817 cfg = this.cfg.extend(cfg); 7818 7819 // Derive key and other params 7820 var derivedParams = cfg.kdf.execute(password, cipher.keySize, cipher.ivSize); 7821 7822 // Add IV to config 7823 cfg.iv = derivedParams.iv; 7824 7825 // Encrypt 7826 var ciphertext = SerializableCipher.encrypt.call(this, cipher, message, derivedParams.key, cfg); 7827 7828 // Mix in derived params 7829 ciphertext.mixIn(derivedParams); 7830 7831 return ciphertext; 7832 }, 7833 7834 /** 7835 * Decrypts serialized ciphertext using a password. 7836 * 7837 * @param {Cipher} cipher The cipher algorithm to use. 7838 * @param {CipherParams|string} ciphertext The ciphertext to decrypt. 7839 * @param {string} password The password. 7840 * @param {Object} cfg (Optional) The configuration options to use for this operation. 7841 * 7842 * @return {WordArray} The plaintext. 7843 * 7844 * @static 7845 * 7846 * @example 7847 * 7848 * var plaintext = CryptoJS.lib.PasswordBasedCipher.decrypt(CryptoJS.algo.AES, formattedCiphertext, 'password', { format: CryptoJS.format.OpenSSL }); 7849 * var plaintext = CryptoJS.lib.PasswordBasedCipher.decrypt(CryptoJS.algo.AES, ciphertextParams, 'password', { format: CryptoJS.format.OpenSSL }); 7850 */ 7851 decrypt: function (cipher, ciphertext, password, cfg) { 7852 // Apply config defaults 7853 cfg = this.cfg.extend(cfg); 7854 7855 // Convert string to CipherParams 7856 ciphertext = this._parse(ciphertext, cfg.format); 7857 7858 // Derive key and other params 7859 var derivedParams = cfg.kdf.execute(password, cipher.keySize, cipher.ivSize, ciphertext.salt); 7860 7861 // Add IV to config 7862 cfg.iv = derivedParams.iv; 7863 7864 // Decrypt 7865 var plaintext = SerializableCipher.decrypt.call(this, cipher, ciphertext, derivedParams.key, cfg); 7866 7867 return plaintext; 7868 } 7869 }); 7870 }()); 7871 7872 7873 })); 7874 },{"./core":53}],53:[function(require,module,exports){ 7875 ;(function (root, factory) { 7876 if (typeof exports === "object") { 7877 // CommonJS 7878 module.exports = exports = factory(); 7879 } 7880 else if (typeof define === "function" && define.amd) { 7881 // AMD 7882 define([], factory); 7883 } 7884 else { 7885 // Global (browser) 7886 root.CryptoJS = factory(); 7887 } 7888 }(this, function () { 7889 7890 /** 7891 * CryptoJS core components. 7892 */ 7893 var CryptoJS = CryptoJS || (function (Math, undefined) { 7894 /* 7895 * Local polyfil of Object.create 7896 */ 7897 var create = Object.create || (function () { 7898 function F() {}; 7899 7900 return function (obj) { 7901 var subtype; 7902 7903 F.prototype = obj; 7904 7905 subtype = new F(); 7906 7907 F.prototype = null; 7908 7909 return subtype; 7910 }; 7911 }()) 7912 7913 /** 7914 * CryptoJS namespace. 7915 */ 7916 var C = {}; 7917 7918 /** 7919 * Library namespace. 7920 */ 7921 var C_lib = C.lib = {}; 7922 7923 /** 7924 * Base object for prototypal inheritance. 7925 */ 7926 var Base = C_lib.Base = (function () { 7927 7928 7929 return { 7930 /** 7931 * Creates a new object that inherits from this object. 7932 * 7933 * @param {Object} overrides Properties to copy into the new object. 7934 * 7935 * @return {Object} The new object. 7936 * 7937 * @static 7938 * 7939 * @example 7940 * 7941 * var MyType = CryptoJS.lib.Base.extend({ 7942 * field: 'value', 7943 * 7944 * method: function () { 7945 * } 7946 * }); 7947 */ 7948 extend: function (overrides) { 7949 // Spawn 7950 var subtype = create(this); 7951 7952 // Augment 7953 if (overrides) { 7954 subtype.mixIn(overrides); 7955 } 7956 7957 // Create default initializer 7958 if (!subtype.hasOwnProperty('init') || this.init === subtype.init) { 7959 subtype.init = function () { 7960 subtype.$super.init.apply(this, arguments); 7961 }; 7962 } 7963 7964 // Initializer's prototype is the subtype object 7965 subtype.init.prototype = subtype; 7966 7967 // Reference supertype 7968 subtype.$super = this; 7969 7970 return subtype; 7971 }, 7972 7973 /** 7974 * Extends this object and runs the init method. 7975 * Arguments to create() will be passed to init(). 7976 * 7977 * @return {Object} The new object. 7978 * 7979 * @static 7980 * 7981 * @example 7982 * 7983 * var instance = MyType.create(); 7984 */ 7985 create: function () { 7986 var instance = this.extend(); 7987 instance.init.apply(instance, arguments); 7988 7989 return instance; 7990 }, 7991 7992 /** 7993 * Initializes a newly created object. 7994 * Override this method to add some logic when your objects are created. 7995 * 7996 * @example 7997 * 7998 * var MyType = CryptoJS.lib.Base.extend({ 7999 * init: function () { 8000 * // ... 8001 * } 8002 * }); 8003 */ 8004 init: function () { 8005 }, 8006 8007 /** 8008 * Copies properties into this object. 8009 * 8010 * @param {Object} properties The properties to mix in. 8011 * 8012 * @example 8013 * 8014 * MyType.mixIn({ 8015 * field: 'value' 8016 * }); 8017 */ 8018 mixIn: function (properties) { 8019 for (var propertyName in properties) { 8020 if (properties.hasOwnProperty(propertyName)) { 8021 this[propertyName] = properties[propertyName]; 8022 } 8023 } 8024 8025 // IE won't copy toString using the loop above 8026 if (properties.hasOwnProperty('toString')) { 8027 this.toString = properties.toString; 8028 } 8029 }, 8030 8031 /** 8032 * Creates a copy of this object. 8033 * 8034 * @return {Object} The clone. 8035 * 8036 * @example 8037 * 8038 * var clone = instance.clone(); 8039 */ 8040 clone: function () { 8041 return this.init.prototype.extend(this); 8042 } 8043 }; 8044 }()); 8045 8046 /** 8047 * An array of 32-bit words. 8048 * 8049 * @property {Array} words The array of 32-bit words. 8050 * @property {number} sigBytes The number of significant bytes in this word array. 8051 */ 8052 var WordArray = C_lib.WordArray = Base.extend({ 8053 /** 8054 * Initializes a newly created word array. 8055 * 8056 * @param {Array} words (Optional) An array of 32-bit words. 8057 * @param {number} sigBytes (Optional) The number of significant bytes in the words. 8058 * 8059 * @example 8060 * 8061 * var wordArray = CryptoJS.lib.WordArray.create(); 8062 * var wordArray = CryptoJS.lib.WordArray.create([0x00010203, 0x04050607]); 8063 * var wordArray = CryptoJS.lib.WordArray.create([0x00010203, 0x04050607], 6); 8064 */ 8065 init: function (words, sigBytes) { 8066 words = this.words = words || []; 8067 8068 if (sigBytes != undefined) { 8069 this.sigBytes = sigBytes; 8070 } else { 8071 this.sigBytes = words.length * 4; 8072 } 8073 }, 8074 8075 /** 8076 * Converts this word array to a string. 8077 * 8078 * @param {Encoder} encoder (Optional) The encoding strategy to use. Default: CryptoJS.enc.Hex 8079 * 8080 * @return {string} The stringified word array. 8081 * 8082 * @example 8083 * 8084 * var string = wordArray + ''; 8085 * var string = wordArray.toString(); 8086 * var string = wordArray.toString(CryptoJS.enc.Utf8); 8087 */ 8088 toString: function (encoder) { 8089 return (encoder || Hex).stringify(this); 8090 }, 8091 8092 /** 8093 * Concatenates a word array to this word array. 8094 * 8095 * @param {WordArray} wordArray The word array to append. 8096 * 8097 * @return {WordArray} This word array. 8098 * 8099 * @example 8100 * 8101 * wordArray1.concat(wordArray2); 8102 */ 8103 concat: function (wordArray) { 8104 // Shortcuts 8105 var thisWords = this.words; 8106 var thatWords = wordArray.words; 8107 var thisSigBytes = this.sigBytes; 8108 var thatSigBytes = wordArray.sigBytes; 8109 8110 // Clamp excess bits 8111 this.clamp(); 8112 8113 // Concat 8114 if (thisSigBytes % 4) { 8115 // Copy one byte at a time 8116 for (var i = 0; i < thatSigBytes; i++) { 8117 var thatByte = (thatWords[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff; 8118 thisWords[(thisSigBytes + i) >>> 2] |= thatByte << (24 - ((thisSigBytes + i) % 4) * 8); 8119 } 8120 } else { 8121 // Copy one word at a time 8122 for (var i = 0; i < thatSigBytes; i += 4) { 8123 thisWords[(thisSigBytes + i) >>> 2] = thatWords[i >>> 2]; 8124 } 8125 } 8126 this.sigBytes += thatSigBytes; 8127 8128 // Chainable 8129 return this; 8130 }, 8131 8132 /** 8133 * Removes insignificant bits. 8134 * 8135 * @example 8136 * 8137 * wordArray.clamp(); 8138 */ 8139 clamp: function () { 8140 // Shortcuts 8141 var words = this.words; 8142 var sigBytes = this.sigBytes; 8143 8144 // Clamp 8145 words[sigBytes >>> 2] &= 0xffffffff << (32 - (sigBytes % 4) * 8); 8146 words.length = Math.ceil(sigBytes / 4); 8147 }, 8148 8149 /** 8150 * Creates a copy of this word array. 8151 * 8152 * @return {WordArray} The clone. 8153 * 8154 * @example 8155 * 8156 * var clone = wordArray.clone(); 8157 */ 8158 clone: function () { 8159 var clone = Base.clone.call(this); 8160 clone.words = this.words.slice(0); 8161 8162 return clone; 8163 }, 8164 8165 /** 8166 * Creates a word array filled with random bytes. 8167 * 8168 * @param {number} nBytes The number of random bytes to generate. 8169 * 8170 * @return {WordArray} The random word array. 8171 * 8172 * @static 8173 * 8174 * @example 8175 * 8176 * var wordArray = CryptoJS.lib.WordArray.random(16); 8177 */ 8178 random: function (nBytes) { 8179 var words = []; 8180 8181 var r = (function (m_w) { 8182 var m_w = m_w; 8183 var m_z = 0x3ade68b1; 8184 var mask = 0xffffffff; 8185 8186 return function () { 8187 m_z = (0x9069 * (m_z & 0xFFFF) + (m_z >> 0x10)) & mask; 8188 m_w = (0x4650 * (m_w & 0xFFFF) + (m_w >> 0x10)) & mask; 8189 var result = ((m_z << 0x10) + m_w) & mask; 8190 result /= 0x100000000; 8191 result += 0.5; 8192 return result * (Math.random() > .5 ? 1 : -1); 8193 } 8194 }); 8195 8196 for (var i = 0, rcache; i < nBytes; i += 4) { 8197 var _r = r((rcache || Math.random()) * 0x100000000); 8198 8199 rcache = _r() * 0x3ade67b7; 8200 words.push((_r() * 0x100000000) | 0); 8201 } 8202 8203 return new WordArray.init(words, nBytes); 8204 } 8205 }); 8206 8207 /** 8208 * Encoder namespace. 8209 */ 8210 var C_enc = C.enc = {}; 8211 8212 /** 8213 * Hex encoding strategy. 8214 */ 8215 var Hex = C_enc.Hex = { 8216 /** 8217 * Converts a word array to a hex string. 8218 * 8219 * @param {WordArray} wordArray The word array. 8220 * 8221 * @return {string} The hex string. 8222 * 8223 * @static 8224 * 8225 * @example 8226 * 8227 * var hexString = CryptoJS.enc.Hex.stringify(wordArray); 8228 */ 8229 stringify: function (wordArray) { 8230 // Shortcuts 8231 var words = wordArray.words; 8232 var sigBytes = wordArray.sigBytes; 8233 8234 // Convert 8235 var hexChars = []; 8236 for (var i = 0; i < sigBytes; i++) { 8237 var bite = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff; 8238 hexChars.push((bite >>> 4).toString(16)); 8239 hexChars.push((bite & 0x0f).toString(16)); 8240 } 8241 8242 return hexChars.join(''); 8243 }, 8244 8245 /** 8246 * Converts a hex string to a word array. 8247 * 8248 * @param {string} hexStr The hex string. 8249 * 8250 * @return {WordArray} The word array. 8251 * 8252 * @static 8253 * 8254 * @example 8255 * 8256 * var wordArray = CryptoJS.enc.Hex.parse(hexString); 8257 */ 8258 parse: function (hexStr) { 8259 // Shortcut 8260 var hexStrLength = hexStr.length; 8261 8262 // Convert 8263 var words = []; 8264 for (var i = 0; i < hexStrLength; i += 2) { 8265 words[i >>> 3] |= parseInt(hexStr.substr(i, 2), 16) << (24 - (i % 8) * 4); 8266 } 8267 8268 return new WordArray.init(words, hexStrLength / 2); 8269 } 8270 }; 8271 8272 /** 8273 * Latin1 encoding strategy. 8274 */ 8275 var Latin1 = C_enc.Latin1 = { 8276 /** 8277 * Converts a word array to a Latin1 string. 8278 * 8279 * @param {WordArray} wordArray The word array. 8280 * 8281 * @return {string} The Latin1 string. 8282 * 8283 * @static 8284 * 8285 * @example 8286 * 8287 * var latin1String = CryptoJS.enc.Latin1.stringify(wordArray); 8288 */ 8289 stringify: function (wordArray) { 8290 // Shortcuts 8291 var words = wordArray.words; 8292 var sigBytes = wordArray.sigBytes; 8293 8294 // Convert 8295 var latin1Chars = []; 8296 for (var i = 0; i < sigBytes; i++) { 8297 var bite = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff; 8298 latin1Chars.push(String.fromCharCode(bite)); 8299 } 8300 8301 return latin1Chars.join(''); 8302 }, 8303 8304 /** 8305 * Converts a Latin1 string to a word array. 8306 * 8307 * @param {string} latin1Str The Latin1 string. 8308 * 8309 * @return {WordArray} The word array. 8310 * 8311 * @static 8312 * 8313 * @example 8314 * 8315 * var wordArray = CryptoJS.enc.Latin1.parse(latin1String); 8316 */ 8317 parse: function (latin1Str) { 8318 // Shortcut 8319 var latin1StrLength = latin1Str.length; 8320 8321 // Convert 8322 var words = []; 8323 for (var i = 0; i < latin1StrLength; i++) { 8324 words[i >>> 2] |= (latin1Str.charCodeAt(i) & 0xff) << (24 - (i % 4) * 8); 8325 } 8326 8327 return new WordArray.init(words, latin1StrLength); 8328 } 8329 }; 8330 8331 /** 8332 * UTF-8 encoding strategy. 8333 */ 8334 var Utf8 = C_enc.Utf8 = { 8335 /** 8336 * Converts a word array to a UTF-8 string. 8337 * 8338 * @param {WordArray} wordArray The word array. 8339 * 8340 * @return {string} The UTF-8 string. 8341 * 8342 * @static 8343 * 8344 * @example 8345 * 8346 * var utf8String = CryptoJS.enc.Utf8.stringify(wordArray); 8347 */ 8348 stringify: function (wordArray) { 8349 try { 8350 return decodeURIComponent(escape(Latin1.stringify(wordArray))); 8351 } catch (e) { 8352 throw new Error('Malformed UTF-8 data'); 8353 } 8354 }, 8355 8356 /** 8357 * Converts a UTF-8 string to a word array. 8358 * 8359 * @param {string} utf8Str The UTF-8 string. 8360 * 8361 * @return {WordArray} The word array. 8362 * 8363 * @static 8364 * 8365 * @example 8366 * 8367 * var wordArray = CryptoJS.enc.Utf8.parse(utf8String); 8368 */ 8369 parse: function (utf8Str) { 8370 return Latin1.parse(unescape(encodeURIComponent(utf8Str))); 8371 } 8372 }; 8373 8374 /** 8375 * Abstract buffered block algorithm template. 8376 * 8377 * The property blockSize must be implemented in a concrete subtype. 8378 * 8379 * @property {number} _minBufferSize The number of blocks that should be kept unprocessed in the buffer. Default: 0 8380 */ 8381 var BufferedBlockAlgorithm = C_lib.BufferedBlockAlgorithm = Base.extend({ 8382 /** 8383 * Resets this block algorithm's data buffer to its initial state. 8384 * 8385 * @example 8386 * 8387 * bufferedBlockAlgorithm.reset(); 8388 */ 8389 reset: function () { 8390 // Initial values 8391 this._data = new WordArray.init(); 8392 this._nDataBytes = 0; 8393 }, 8394 8395 /** 8396 * Adds new data to this block algorithm's buffer. 8397 * 8398 * @param {WordArray|string} data The data to append. Strings are converted to a WordArray using UTF-8. 8399 * 8400 * @example 8401 * 8402 * bufferedBlockAlgorithm._append('data'); 8403 * bufferedBlockAlgorithm._append(wordArray); 8404 */ 8405 _append: function (data) { 8406 // Convert string to WordArray, else assume WordArray already 8407 if (typeof data == 'string') { 8408 data = Utf8.parse(data); 8409 } 8410 8411 // Append 8412 this._data.concat(data); 8413 this._nDataBytes += data.sigBytes; 8414 }, 8415 8416 /** 8417 * Processes available data blocks. 8418 * 8419 * This method invokes _doProcessBlock(offset), which must be implemented by a concrete subtype. 8420 * 8421 * @param {boolean} doFlush Whether all blocks and partial blocks should be processed. 8422 * 8423 * @return {WordArray} The processed data. 8424 * 8425 * @example 8426 * 8427 * var processedData = bufferedBlockAlgorithm._process(); 8428 * var processedData = bufferedBlockAlgorithm._process(!!'flush'); 8429 */ 8430 _process: function (doFlush) { 8431 // Shortcuts 8432 var data = this._data; 8433 var dataWords = data.words; 8434 var dataSigBytes = data.sigBytes; 8435 var blockSize = this.blockSize; 8436 var blockSizeBytes = blockSize * 4; 8437 8438 // Count blocks ready 8439 var nBlocksReady = dataSigBytes / blockSizeBytes; 8440 if (doFlush) { 8441 // Round up to include partial blocks 8442 nBlocksReady = Math.ceil(nBlocksReady); 8443 } else { 8444 // Round down to include only full blocks, 8445 // less the number of blocks that must remain in the buffer 8446 nBlocksReady = Math.max((nBlocksReady | 0) - this._minBufferSize, 0); 8447 } 8448 8449 // Count words ready 8450 var nWordsReady = nBlocksReady * blockSize; 8451 8452 // Count bytes ready 8453 var nBytesReady = Math.min(nWordsReady * 4, dataSigBytes); 8454 8455 // Process blocks 8456 if (nWordsReady) { 8457 for (var offset = 0; offset < nWordsReady; offset += blockSize) { 8458 // Perform concrete-algorithm logic 8459 this._doProcessBlock(dataWords, offset); 8460 } 8461 8462 // Remove processed words 8463 var processedWords = dataWords.splice(0, nWordsReady); 8464 data.sigBytes -= nBytesReady; 8465 } 8466 8467 // Return processed words 8468 return new WordArray.init(processedWords, nBytesReady); 8469 }, 8470 8471 /** 8472 * Creates a copy of this object. 8473 * 8474 * @return {Object} The clone. 8475 * 8476 * @example 8477 * 8478 * var clone = bufferedBlockAlgorithm.clone(); 8479 */ 8480 clone: function () { 8481 var clone = Base.clone.call(this); 8482 clone._data = this._data.clone(); 8483 8484 return clone; 8485 }, 8486 8487 _minBufferSize: 0 8488 }); 8489 8490 /** 8491 * Abstract hasher template. 8492 * 8493 * @property {number} blockSize The number of 32-bit words this hasher operates on. Default: 16 (512 bits) 8494 */ 8495 var Hasher = C_lib.Hasher = BufferedBlockAlgorithm.extend({ 8496 /** 8497 * Configuration options. 8498 */ 8499 cfg: Base.extend(), 8500 8501 /** 8502 * Initializes a newly created hasher. 8503 * 8504 * @param {Object} cfg (Optional) The configuration options to use for this hash computation. 8505 * 8506 * @example 8507 * 8508 * var hasher = CryptoJS.algo.SHA256.create(); 8509 */ 8510 init: function (cfg) { 8511 // Apply config defaults 8512 this.cfg = this.cfg.extend(cfg); 8513 8514 // Set initial values 8515 this.reset(); 8516 }, 8517 8518 /** 8519 * Resets this hasher to its initial state. 8520 * 8521 * @example 8522 * 8523 * hasher.reset(); 8524 */ 8525 reset: function () { 8526 // Reset data buffer 8527 BufferedBlockAlgorithm.reset.call(this); 8528 8529 // Perform concrete-hasher logic 8530 this._doReset(); 8531 }, 8532 8533 /** 8534 * Updates this hasher with a message. 8535 * 8536 * @param {WordArray|string} messageUpdate The message to append. 8537 * 8538 * @return {Hasher} This hasher. 8539 * 8540 * @example 8541 * 8542 * hasher.update('message'); 8543 * hasher.update(wordArray); 8544 */ 8545 update: function (messageUpdate) { 8546 // Append 8547 this._append(messageUpdate); 8548 8549 // Update the hash 8550 this._process(); 8551 8552 // Chainable 8553 return this; 8554 }, 8555 8556 /** 8557 * Finalizes the hash computation. 8558 * Note that the finalize operation is effectively a destructive, read-once operation. 8559 * 8560 * @param {WordArray|string} messageUpdate (Optional) A final message update. 8561 * 8562 * @return {WordArray} The hash. 8563 * 8564 * @example 8565 * 8566 * var hash = hasher.finalize(); 8567 * var hash = hasher.finalize('message'); 8568 * var hash = hasher.finalize(wordArray); 8569 */ 8570 finalize: function (messageUpdate) { 8571 // Final message update 8572 if (messageUpdate) { 8573 this._append(messageUpdate); 8574 } 8575 8576 // Perform concrete-hasher logic 8577 var hash = this._doFinalize(); 8578 8579 return hash; 8580 }, 8581 8582 blockSize: 512/32, 8583 8584 /** 8585 * Creates a shortcut function to a hasher's object interface. 8586 * 8587 * @param {Hasher} hasher The hasher to create a helper for. 8588 * 8589 * @return {Function} The shortcut function. 8590 * 8591 * @static 8592 * 8593 * @example 8594 * 8595 * var SHA256 = CryptoJS.lib.Hasher._createHelper(CryptoJS.algo.SHA256); 8596 */ 8597 _createHelper: function (hasher) { 8598 return function (message, cfg) { 8599 return new hasher.init(cfg).finalize(message); 8600 }; 8601 }, 8602 8603 /** 8604 * Creates a shortcut function to the HMAC's object interface. 8605 * 8606 * @param {Hasher} hasher The hasher to use in this HMAC helper. 8607 * 8608 * @return {Function} The shortcut function. 8609 * 8610 * @static 8611 * 8612 * @example 8613 * 8614 * var HmacSHA256 = CryptoJS.lib.Hasher._createHmacHelper(CryptoJS.algo.SHA256); 8615 */ 8616 _createHmacHelper: function (hasher) { 8617 return function (message, key) { 8618 return new C_algo.HMAC.init(hasher, key).finalize(message); 8619 }; 8620 } 8621 }); 8622 8623 /** 8624 * Algorithm namespace. 8625 */ 8626 var C_algo = C.algo = {}; 8627 8628 return C; 8629 }(Math)); 8630 8631 8632 return CryptoJS; 8633 8634 })); 8635 },{}],54:[function(require,module,exports){ 8636 ;(function (root, factory) { 8637 if (typeof exports === "object") { 8638 // CommonJS 8639 module.exports = exports = factory(require("./core")); 8640 } 8641 else if (typeof define === "function" && define.amd) { 8642 // AMD 8643 define(["./core"], factory); 8644 } 8645 else { 8646 // Global (browser) 8647 factory(root.CryptoJS); 8648 } 8649 }(this, function (CryptoJS) { 8650 8651 (function () { 8652 // Shortcuts 8653 var C = CryptoJS; 8654 var C_lib = C.lib; 8655 var WordArray = C_lib.WordArray; 8656 var C_enc = C.enc; 8657 8658 /** 8659 * Base64 encoding strategy. 8660 */ 8661 var Base64 = C_enc.Base64 = { 8662 /** 8663 * Converts a word array to a Base64 string. 8664 * 8665 * @param {WordArray} wordArray The word array. 8666 * 8667 * @return {string} The Base64 string. 8668 * 8669 * @static 8670 * 8671 * @example 8672 * 8673 * var base64String = CryptoJS.enc.Base64.stringify(wordArray); 8674 */ 8675 stringify: function (wordArray) { 8676 // Shortcuts 8677 var words = wordArray.words; 8678 var sigBytes = wordArray.sigBytes; 8679 var map = this._map; 8680 8681 // Clamp excess bits 8682 wordArray.clamp(); 8683 8684 // Convert 8685 var base64Chars = []; 8686 for (var i = 0; i < sigBytes; i += 3) { 8687 var byte1 = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff; 8688 var byte2 = (words[(i + 1) >>> 2] >>> (24 - ((i + 1) % 4) * 8)) & 0xff; 8689 var byte3 = (words[(i + 2) >>> 2] >>> (24 - ((i + 2) % 4) * 8)) & 0xff; 8690 8691 var triplet = (byte1 << 16) | (byte2 << 8) | byte3; 8692 8693 for (var j = 0; (j < 4) && (i + j * 0.75 < sigBytes); j++) { 8694 base64Chars.push(map.charAt((triplet >>> (6 * (3 - j))) & 0x3f)); 8695 } 8696 } 8697 8698 // Add padding 8699 var paddingChar = map.charAt(64); 8700 if (paddingChar) { 8701 while (base64Chars.length % 4) { 8702 base64Chars.push(paddingChar); 8703 } 8704 } 8705 8706 return base64Chars.join(''); 8707 }, 8708 8709 /** 8710 * Converts a Base64 string to a word array. 8711 * 8712 * @param {string} base64Str The Base64 string. 8713 * 8714 * @return {WordArray} The word array. 8715 * 8716 * @static 8717 * 8718 * @example 8719 * 8720 * var wordArray = CryptoJS.enc.Base64.parse(base64String); 8721 */ 8722 parse: function (base64Str) { 8723 // Shortcuts 8724 var base64StrLength = base64Str.length; 8725 var map = this._map; 8726 var reverseMap = this._reverseMap; 8727 8728 if (!reverseMap) { 8729 reverseMap = this._reverseMap = []; 8730 for (var j = 0; j < map.length; j++) { 8731 reverseMap[map.charCodeAt(j)] = j; 8732 } 8733 } 8734 8735 // Ignore padding 8736 var paddingChar = map.charAt(64); 8737 if (paddingChar) { 8738 var paddingIndex = base64Str.indexOf(paddingChar); 8739 if (paddingIndex !== -1) { 8740 base64StrLength = paddingIndex; 8741 } 8742 } 8743 8744 // Convert 8745 return parseLoop(base64Str, base64StrLength, reverseMap); 8746 8747 }, 8748 8749 _map: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=' 8750 }; 8751 8752 function parseLoop(base64Str, base64StrLength, reverseMap) { 8753 var words = []; 8754 var nBytes = 0; 8755 for (var i = 0; i < base64StrLength; i++) { 8756 if (i % 4) { 8757 var bits1 = reverseMap[base64Str.charCodeAt(i - 1)] << ((i % 4) * 2); 8758 var bits2 = reverseMap[base64Str.charCodeAt(i)] >>> (6 - (i % 4) * 2); 8759 words[nBytes >>> 2] |= (bits1 | bits2) << (24 - (nBytes % 4) * 8); 8760 nBytes++; 8761 } 8762 } 8763 return WordArray.create(words, nBytes); 8764 } 8765 }()); 8766 8767 8768 return CryptoJS.enc.Base64; 8769 8770 })); 8771 },{"./core":53}],55:[function(require,module,exports){ 8772 ;(function (root, factory) { 8773 if (typeof exports === "object") { 8774 // CommonJS 8775 module.exports = exports = factory(require("./core")); 8776 } 8777 else if (typeof define === "function" && define.amd) { 8778 // AMD 8779 define(["./core"], factory); 8780 } 8781 else { 8782 // Global (browser) 8783 factory(root.CryptoJS); 8784 } 8785 }(this, function (CryptoJS) { 8786 8787 (function () { 8788 // Shortcuts 8789 var C = CryptoJS; 8790 var C_lib = C.lib; 8791 var WordArray = C_lib.WordArray; 8792 var C_enc = C.enc; 8793 8794 /** 8795 * UTF-16 BE encoding strategy. 8796 */ 8797 var Utf16BE = C_enc.Utf16 = C_enc.Utf16BE = { 8798 /** 8799 * Converts a word array to a UTF-16 BE string. 8800 * 8801 * @param {WordArray} wordArray The word array. 8802 * 8803 * @return {string} The UTF-16 BE string. 8804 * 8805 * @static 8806 * 8807 * @example 8808 * 8809 * var utf16String = CryptoJS.enc.Utf16.stringify(wordArray); 8810 */ 8811 stringify: function (wordArray) { 8812 // Shortcuts 8813 var words = wordArray.words; 8814 var sigBytes = wordArray.sigBytes; 8815 8816 // Convert 8817 var utf16Chars = []; 8818 for (var i = 0; i < sigBytes; i += 2) { 8819 var codePoint = (words[i >>> 2] >>> (16 - (i % 4) * 8)) & 0xffff; 8820 utf16Chars.push(String.fromCharCode(codePoint)); 8821 } 8822 8823 return utf16Chars.join(''); 8824 }, 8825 8826 /** 8827 * Converts a UTF-16 BE string to a word array. 8828 * 8829 * @param {string} utf16Str The UTF-16 BE string. 8830 * 8831 * @return {WordArray} The word array. 8832 * 8833 * @static 8834 * 8835 * @example 8836 * 8837 * var wordArray = CryptoJS.enc.Utf16.parse(utf16String); 8838 */ 8839 parse: function (utf16Str) { 8840 // Shortcut 8841 var utf16StrLength = utf16Str.length; 8842 8843 // Convert 8844 var words = []; 8845 for (var i = 0; i < utf16StrLength; i++) { 8846 words[i >>> 1] |= utf16Str.charCodeAt(i) << (16 - (i % 2) * 16); 8847 } 8848 8849 return WordArray.create(words, utf16StrLength * 2); 8850 } 8851 }; 8852 8853 /** 8854 * UTF-16 LE encoding strategy. 8855 */ 8856 C_enc.Utf16LE = { 8857 /** 8858 * Converts a word array to a UTF-16 LE string. 8859 * 8860 * @param {WordArray} wordArray The word array. 8861 * 8862 * @return {string} The UTF-16 LE string. 8863 * 8864 * @static 8865 * 8866 * @example 8867 * 8868 * var utf16Str = CryptoJS.enc.Utf16LE.stringify(wordArray); 8869 */ 8870 stringify: function (wordArray) { 8871 // Shortcuts 8872 var words = wordArray.words; 8873 var sigBytes = wordArray.sigBytes; 8874 8875 // Convert 8876 var utf16Chars = []; 8877 for (var i = 0; i < sigBytes; i += 2) { 8878 var codePoint = swapEndian((words[i >>> 2] >>> (16 - (i % 4) * 8)) & 0xffff); 8879 utf16Chars.push(String.fromCharCode(codePoint)); 8880 } 8881 8882 return utf16Chars.join(''); 8883 }, 8884 8885 /** 8886 * Converts a UTF-16 LE string to a word array. 8887 * 8888 * @param {string} utf16Str The UTF-16 LE string. 8889 * 8890 * @return {WordArray} The word array. 8891 * 8892 * @static 8893 * 8894 * @example 8895 * 8896 * var wordArray = CryptoJS.enc.Utf16LE.parse(utf16Str); 8897 */ 8898 parse: function (utf16Str) { 8899 // Shortcut 8900 var utf16StrLength = utf16Str.length; 8901 8902 // Convert 8903 var words = []; 8904 for (var i = 0; i < utf16StrLength; i++) { 8905 words[i >>> 1] |= swapEndian(utf16Str.charCodeAt(i) << (16 - (i % 2) * 16)); 8906 } 8907 8908 return WordArray.create(words, utf16StrLength * 2); 8909 } 8910 }; 8911 8912 function swapEndian(word) { 8913 return ((word << 8) & 0xff00ff00) | ((word >>> 8) & 0x00ff00ff); 8914 } 8915 }()); 8916 8917 8918 return CryptoJS.enc.Utf16; 8919 8920 })); 8921 },{"./core":53}],56:[function(require,module,exports){ 8922 ;(function (root, factory, undef) { 8923 if (typeof exports === "object") { 8924 // CommonJS 8925 module.exports = exports = factory(require("./core"), require("./sha1"), require("./hmac")); 8926 } 8927 else if (typeof define === "function" && define.amd) { 8928 // AMD 8929 define(["./core", "./sha1", "./hmac"], factory); 8930 } 8931 else { 8932 // Global (browser) 8933 factory(root.CryptoJS); 8934 } 8935 }(this, function (CryptoJS) { 8936 8937 (function () { 8938 // Shortcuts 8939 var C = CryptoJS; 8940 var C_lib = C.lib; 8941 var Base = C_lib.Base; 8942 var WordArray = C_lib.WordArray; 8943 var C_algo = C.algo; 8944 var MD5 = C_algo.MD5; 8945 8946 /** 8947 * This key derivation function is meant to conform with EVP_BytesToKey. 8948 * www.openssl.org/docs/crypto/EVP_BytesToKey.html 8949 */ 8950 var EvpKDF = C_algo.EvpKDF = Base.extend({ 8951 /** 8952 * Configuration options. 8953 * 8954 * @property {number} keySize The key size in words to generate. Default: 4 (128 bits) 8955 * @property {Hasher} hasher The hash algorithm to use. Default: MD5 8956 * @property {number} iterations The number of iterations to perform. Default: 1 8957 */ 8958 cfg: Base.extend({ 8959 keySize: 128/32, 8960 hasher: MD5, 8961 iterations: 1 8962 }), 8963 8964 /** 8965 * Initializes a newly created key derivation function. 8966 * 8967 * @param {Object} cfg (Optional) The configuration options to use for the derivation. 8968 * 8969 * @example 8970 * 8971 * var kdf = CryptoJS.algo.EvpKDF.create(); 8972 * var kdf = CryptoJS.algo.EvpKDF.create({ keySize: 8 }); 8973 * var kdf = CryptoJS.algo.EvpKDF.create({ keySize: 8, iterations: 1000 }); 8974 */ 8975 init: function (cfg) { 8976 this.cfg = this.cfg.extend(cfg); 8977 }, 8978 8979 /** 8980 * Derives a key from a password. 8981 * 8982 * @param {WordArray|string} password The password. 8983 * @param {WordArray|string} salt A salt. 8984 * 8985 * @return {WordArray} The derived key. 8986 * 8987 * @example 8988 * 8989 * var key = kdf.compute(password, salt); 8990 */ 8991 compute: function (password, salt) { 8992 // Shortcut 8993 var cfg = this.cfg; 8994 8995 // Init hasher 8996 var hasher = cfg.hasher.create(); 8997 8998 // Initial values 8999 var derivedKey = WordArray.create(); 9000 9001 // Shortcuts 9002 var derivedKeyWords = derivedKey.words; 9003 var keySize = cfg.keySize; 9004 var iterations = cfg.iterations; 9005 9006 // Generate key 9007 while (derivedKeyWords.length < keySize) { 9008 if (block) { 9009 hasher.update(block); 9010 } 9011 var block = hasher.update(password).finalize(salt); 9012 hasher.reset(); 9013 9014 // Iterations 9015 for (var i = 1; i < iterations; i++) { 9016 block = hasher.finalize(block); 9017 hasher.reset(); 9018 } 9019 9020 derivedKey.concat(block); 9021 } 9022 derivedKey.sigBytes = keySize * 4; 9023 9024 return derivedKey; 9025 } 9026 }); 9027 9028 /** 9029 * Derives a key from a password. 9030 * 9031 * @param {WordArray|string} password The password. 9032 * @param {WordArray|string} salt A salt. 9033 * @param {Object} cfg (Optional) The configuration options to use for this computation. 9034 * 9035 * @return {WordArray} The derived key. 9036 * 9037 * @static 9038 * 9039 * @example 9040 * 9041 * var key = CryptoJS.EvpKDF(password, salt); 9042 * var key = CryptoJS.EvpKDF(password, salt, { keySize: 8 }); 9043 * var key = CryptoJS.EvpKDF(password, salt, { keySize: 8, iterations: 1000 }); 9044 */ 9045 C.EvpKDF = function (password, salt, cfg) { 9046 return EvpKDF.create(cfg).compute(password, salt); 9047 }; 9048 }()); 9049 9050 9051 return CryptoJS.EvpKDF; 9052 9053 })); 9054 },{"./core":53,"./hmac":58,"./sha1":77}],57:[function(require,module,exports){ 9055 ;(function (root, factory, undef) { 9056 if (typeof exports === "object") { 9057 // CommonJS 9058 module.exports = exports = factory(require("./core"), require("./cipher-core")); 9059 } 9060 else if (typeof define === "function" && define.amd) { 9061 // AMD 9062 define(["./core", "./cipher-core"], factory); 9063 } 9064 else { 9065 // Global (browser) 9066 factory(root.CryptoJS); 9067 } 9068 }(this, function (CryptoJS) { 9069 9070 (function (undefined) { 9071 // Shortcuts 9072 var C = CryptoJS; 9073 var C_lib = C.lib; 9074 var CipherParams = C_lib.CipherParams; 9075 var C_enc = C.enc; 9076 var Hex = C_enc.Hex; 9077 var C_format = C.format; 9078 9079 var HexFormatter = C_format.Hex = { 9080 /** 9081 * Converts the ciphertext of a cipher params object to a hexadecimally encoded string. 9082 * 9083 * @param {CipherParams} cipherParams The cipher params object. 9084 * 9085 * @return {string} The hexadecimally encoded string. 9086 * 9087 * @static 9088 * 9089 * @example 9090 * 9091 * var hexString = CryptoJS.format.Hex.stringify(cipherParams); 9092 */ 9093 stringify: function (cipherParams) { 9094 return cipherParams.ciphertext.toString(Hex); 9095 }, 9096 9097 /** 9098 * Converts a hexadecimally encoded ciphertext string to a cipher params object. 9099 * 9100 * @param {string} input The hexadecimally encoded string. 9101 * 9102 * @return {CipherParams} The cipher params object. 9103 * 9104 * @static 9105 * 9106 * @example 9107 * 9108 * var cipherParams = CryptoJS.format.Hex.parse(hexString); 9109 */ 9110 parse: function (input) { 9111 var ciphertext = Hex.parse(input); 9112 return CipherParams.create({ ciphertext: ciphertext }); 9113 } 9114 }; 9115 }()); 9116 9117 9118 return CryptoJS.format.Hex; 9119 9120 })); 9121 },{"./cipher-core":52,"./core":53}],58:[function(require,module,exports){ 9122 ;(function (root, factory) { 9123 if (typeof exports === "object") { 9124 // CommonJS 9125 module.exports = exports = factory(require("./core")); 9126 } 9127 else if (typeof define === "function" && define.amd) { 9128 // AMD 9129 define(["./core"], factory); 9130 } 9131 else { 9132 // Global (browser) 9133 factory(root.CryptoJS); 9134 } 9135 }(this, function (CryptoJS) { 9136 9137 (function () { 9138 // Shortcuts 9139 var C = CryptoJS; 9140 var C_lib = C.lib; 9141 var Base = C_lib.Base; 9142 var C_enc = C.enc; 9143 var Utf8 = C_enc.Utf8; 9144 var C_algo = C.algo; 9145 9146 /** 9147 * HMAC algorithm. 9148 */ 9149 var HMAC = C_algo.HMAC = Base.extend({ 9150 /** 9151 * Initializes a newly created HMAC. 9152 * 9153 * @param {Hasher} hasher The hash algorithm to use. 9154 * @param {WordArray|string} key The secret key. 9155 * 9156 * @example 9157 * 9158 * var hmacHasher = CryptoJS.algo.HMAC.create(CryptoJS.algo.SHA256, key); 9159 */ 9160 init: function (hasher, key) { 9161 // Init hasher 9162 hasher = this._hasher = new hasher.init(); 9163 9164 // Convert string to WordArray, else assume WordArray already 9165 if (typeof key == 'string') { 9166 key = Utf8.parse(key); 9167 } 9168 9169 // Shortcuts 9170 var hasherBlockSize = hasher.blockSize; 9171 var hasherBlockSizeBytes = hasherBlockSize * 4; 9172 9173 // Allow arbitrary length keys 9174 if (key.sigBytes > hasherBlockSizeBytes) { 9175 key = hasher.finalize(key); 9176 } 9177 9178 // Clamp excess bits 9179 key.clamp(); 9180 9181 // Clone key for inner and outer pads 9182 var oKey = this._oKey = key.clone(); 9183 var iKey = this._iKey = key.clone(); 9184 9185 // Shortcuts 9186 var oKeyWords = oKey.words; 9187 var iKeyWords = iKey.words; 9188 9189 // XOR keys with pad constants 9190 for (var i = 0; i < hasherBlockSize; i++) { 9191 oKeyWords[i] ^= 0x5c5c5c5c; 9192 iKeyWords[i] ^= 0x36363636; 9193 } 9194 oKey.sigBytes = iKey.sigBytes = hasherBlockSizeBytes; 9195 9196 // Set initial values 9197 this.reset(); 9198 }, 9199 9200 /** 9201 * Resets this HMAC to its initial state. 9202 * 9203 * @example 9204 * 9205 * hmacHasher.reset(); 9206 */ 9207 reset: function () { 9208 // Shortcut 9209 var hasher = this._hasher; 9210 9211 // Reset 9212 hasher.reset(); 9213 hasher.update(this._iKey); 9214 }, 9215 9216 /** 9217 * Updates this HMAC with a message. 9218 * 9219 * @param {WordArray|string} messageUpdate The message to append. 9220 * 9221 * @return {HMAC} This HMAC instance. 9222 * 9223 * @example 9224 * 9225 * hmacHasher.update('message'); 9226 * hmacHasher.update(wordArray); 9227 */ 9228 update: function (messageUpdate) { 9229 this._hasher.update(messageUpdate); 9230 9231 // Chainable 9232 return this; 9233 }, 9234 9235 /** 9236 * Finalizes the HMAC computation. 9237 * Note that the finalize operation is effectively a destructive, read-once operation. 9238 * 9239 * @param {WordArray|string} messageUpdate (Optional) A final message update. 9240 * 9241 * @return {WordArray} The HMAC. 9242 * 9243 * @example 9244 * 9245 * var hmac = hmacHasher.finalize(); 9246 * var hmac = hmacHasher.finalize('message'); 9247 * var hmac = hmacHasher.finalize(wordArray); 9248 */ 9249 finalize: function (messageUpdate) { 9250 // Shortcut 9251 var hasher = this._hasher; 9252 9253 // Compute HMAC 9254 var innerHash = hasher.finalize(messageUpdate); 9255 hasher.reset(); 9256 var hmac = hasher.finalize(this._oKey.clone().concat(innerHash)); 9257 9258 return hmac; 9259 } 9260 }); 9261 }()); 9262 9263 9264 })); 9265 },{"./core":53}],59:[function(require,module,exports){ 9266 ;(function (root, factory, undef) { 9267 if (typeof exports === "object") { 9268 // CommonJS 9269 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")); 9270 } 9271 else if (typeof define === "function" && define.amd) { 9272 // AMD 9273 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); 9274 } 9275 else { 9276 // Global (browser) 9277 root.CryptoJS = factory(root.CryptoJS); 9278 } 9279 }(this, function (CryptoJS) { 9280 9281 return CryptoJS; 9282 9283 })); 9284 },{"./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){ 9285 ;(function (root, factory) { 9286 if (typeof exports === "object") { 9287 // CommonJS 9288 module.exports = exports = factory(require("./core")); 9289 } 9290 else if (typeof define === "function" && define.amd) { 9291 // AMD 9292 define(["./core"], factory); 9293 } 9294 else { 9295 // Global (browser) 9296 factory(root.CryptoJS); 9297 } 9298 }(this, function (CryptoJS) { 9299 9300 (function () { 9301 // Check if typed arrays are supported 9302 if (typeof ArrayBuffer != 'function') { 9303 return; 9304 } 9305 9306 // Shortcuts 9307 var C = CryptoJS; 9308 var C_lib = C.lib; 9309 var WordArray = C_lib.WordArray; 9310 9311 // Reference original init 9312 var superInit = WordArray.init; 9313 9314 // Augment WordArray.init to handle typed arrays 9315 var subInit = WordArray.init = function (typedArray) { 9316 // Convert buffers to uint8 9317 if (typedArray instanceof ArrayBuffer) { 9318 typedArray = new Uint8Array(typedArray); 9319 } 9320 9321 // Convert other array views to uint8 9322 if ( 9323 typedArray instanceof Int8Array || 9324 (typeof Uint8ClampedArray !== "undefined" && typedArray instanceof Uint8ClampedArray) || 9325 typedArray instanceof Int16Array || 9326 typedArray instanceof Uint16Array || 9327 typedArray instanceof Int32Array || 9328 typedArray instanceof Uint32Array || 9329 typedArray instanceof Float32Array || 9330 typedArray instanceof Float64Array 9331 ) { 9332 typedArray = new Uint8Array(typedArray.buffer, typedArray.byteOffset, typedArray.byteLength); 9333 } 9334 9335 // Handle Uint8Array 9336 if (typedArray instanceof Uint8Array) { 9337 // Shortcut 9338 var typedArrayByteLength = typedArray.byteLength; 9339 9340 // Extract bytes 9341 var words = []; 9342 for (var i = 0; i < typedArrayByteLength; i++) { 9343 words[i >>> 2] |= typedArray[i] << (24 - (i % 4) * 8); 9344 } 9345 9346 // Initialize this word array 9347 superInit.call(this, words, typedArrayByteLength); 9348 } else { 9349 // Else call normal init 9350 superInit.apply(this, arguments); 9351 } 9352 }; 9353 9354 subInit.prototype = WordArray; 9355 }()); 9356 9357 9358 return CryptoJS.lib.WordArray; 9359 9360 })); 9361 },{"./core":53}],61:[function(require,module,exports){ 9362 ;(function (root, factory) { 9363 if (typeof exports === "object") { 9364 // CommonJS 9365 module.exports = exports = factory(require("./core")); 9366 } 9367 else if (typeof define === "function" && define.amd) { 9368 // AMD 9369 define(["./core"], factory); 9370 } 9371 else { 9372 // Global (browser) 9373 factory(root.CryptoJS); 9374 } 9375 }(this, function (CryptoJS) { 9376 9377 (function (Math) { 9378 // Shortcuts 9379 var C = CryptoJS; 9380 var C_lib = C.lib; 9381 var WordArray = C_lib.WordArray; 9382 var Hasher = C_lib.Hasher; 9383 var C_algo = C.algo; 9384 9385 // Constants table 9386 var T = []; 9387 9388 // Compute constants 9389 (function () { 9390 for (var i = 0; i < 64; i++) { 9391 T[i] = (Math.abs(Math.sin(i + 1)) * 0x100000000) | 0; 9392 } 9393 }()); 9394 9395 /** 9396 * MD5 hash algorithm. 9397 */ 9398 var MD5 = C_algo.MD5 = Hasher.extend({ 9399 _doReset: function () { 9400 this._hash = new WordArray.init([ 9401 0x67452301, 0xefcdab89, 9402 0x98badcfe, 0x10325476 9403 ]); 9404 }, 9405 9406 _doProcessBlock: function (M, offset) { 9407 // Swap endian 9408 for (var i = 0; i < 16; i++) { 9409 // Shortcuts 9410 var offset_i = offset + i; 9411 var M_offset_i = M[offset_i]; 9412 9413 M[offset_i] = ( 9414 (((M_offset_i << 8) | (M_offset_i >>> 24)) & 0x00ff00ff) | 9415 (((M_offset_i << 24) | (M_offset_i >>> 8)) & 0xff00ff00) 9416 ); 9417 } 9418 9419 // Shortcuts 9420 var H = this._hash.words; 9421 9422 var M_offset_0 = M[offset + 0]; 9423 var M_offset_1 = M[offset + 1]; 9424 var M_offset_2 = M[offset + 2]; 9425 var M_offset_3 = M[offset + 3]; 9426 var M_offset_4 = M[offset + 4]; 9427 var M_offset_5 = M[offset + 5]; 9428 var M_offset_6 = M[offset + 6]; 9429 var M_offset_7 = M[offset + 7]; 9430 var M_offset_8 = M[offset + 8]; 9431 var M_offset_9 = M[offset + 9]; 9432 var M_offset_10 = M[offset + 10]; 9433 var M_offset_11 = M[offset + 11]; 9434 var M_offset_12 = M[offset + 12]; 9435 var M_offset_13 = M[offset + 13]; 9436 var M_offset_14 = M[offset + 14]; 9437 var M_offset_15 = M[offset + 15]; 9438 9439 // Working varialbes 9440 var a = H[0]; 9441 var b = H[1]; 9442 var c = H[2]; 9443 var d = H[3]; 9444 9445 // Computation 9446 a = FF(a, b, c, d, M_offset_0, 7, T[0]); 9447 d = FF(d, a, b, c, M_offset_1, 12, T[1]); 9448 c = FF(c, d, a, b, M_offset_2, 17, T[2]); 9449 b = FF(b, c, d, a, M_offset_3, 22, T[3]); 9450 a = FF(a, b, c, d, M_offset_4, 7, T[4]); 9451 d = FF(d, a, b, c, M_offset_5, 12, T[5]); 9452 c = FF(c, d, a, b, M_offset_6, 17, T[6]); 9453 b = FF(b, c, d, a, M_offset_7, 22, T[7]); 9454 a = FF(a, b, c, d, M_offset_8, 7, T[8]); 9455 d = FF(d, a, b, c, M_offset_9, 12, T[9]); 9456 c = FF(c, d, a, b, M_offset_10, 17, T[10]); 9457 b = FF(b, c, d, a, M_offset_11, 22, T[11]); 9458 a = FF(a, b, c, d, M_offset_12, 7, T[12]); 9459 d = FF(d, a, b, c, M_offset_13, 12, T[13]); 9460 c = FF(c, d, a, b, M_offset_14, 17, T[14]); 9461 b = FF(b, c, d, a, M_offset_15, 22, T[15]); 9462 9463 a = GG(a, b, c, d, M_offset_1, 5, T[16]); 9464 d = GG(d, a, b, c, M_offset_6, 9, T[17]); 9465 c = GG(c, d, a, b, M_offset_11, 14, T[18]); 9466 b = GG(b, c, d, a, M_offset_0, 20, T[19]); 9467 a = GG(a, b, c, d, M_offset_5, 5, T[20]); 9468 d = GG(d, a, b, c, M_offset_10, 9, T[21]); 9469 c = GG(c, d, a, b, M_offset_15, 14, T[22]); 9470 b = GG(b, c, d, a, M_offset_4, 20, T[23]); 9471 a = GG(a, b, c, d, M_offset_9, 5, T[24]); 9472 d = GG(d, a, b, c, M_offset_14, 9, T[25]); 9473 c = GG(c, d, a, b, M_offset_3, 14, T[26]); 9474 b = GG(b, c, d, a, M_offset_8, 20, T[27]); 9475 a = GG(a, b, c, d, M_offset_13, 5, T[28]); 9476 d = GG(d, a, b, c, M_offset_2, 9, T[29]); 9477 c = GG(c, d, a, b, M_offset_7, 14, T[30]); 9478 b = GG(b, c, d, a, M_offset_12, 20, T[31]); 9479 9480 a = HH(a, b, c, d, M_offset_5, 4, T[32]); 9481 d = HH(d, a, b, c, M_offset_8, 11, T[33]); 9482 c = HH(c, d, a, b, M_offset_11, 16, T[34]); 9483 b = HH(b, c, d, a, M_offset_14, 23, T[35]); 9484 a = HH(a, b, c, d, M_offset_1, 4, T[36]); 9485 d = HH(d, a, b, c, M_offset_4, 11, T[37]); 9486 c = HH(c, d, a, b, M_offset_7, 16, T[38]); 9487 b = HH(b, c, d, a, M_offset_10, 23, T[39]); 9488 a = HH(a, b, c, d, M_offset_13, 4, T[40]); 9489 d = HH(d, a, b, c, M_offset_0, 11, T[41]); 9490 c = HH(c, d, a, b, M_offset_3, 16, T[42]); 9491 b = HH(b, c, d, a, M_offset_6, 23, T[43]); 9492 a = HH(a, b, c, d, M_offset_9, 4, T[44]); 9493 d = HH(d, a, b, c, M_offset_12, 11, T[45]); 9494 c = HH(c, d, a, b, M_offset_15, 16, T[46]); 9495 b = HH(b, c, d, a, M_offset_2, 23, T[47]); 9496 9497 a = II(a, b, c, d, M_offset_0, 6, T[48]); 9498 d = II(d, a, b, c, M_offset_7, 10, T[49]); 9499 c = II(c, d, a, b, M_offset_14, 15, T[50]); 9500 b = II(b, c, d, a, M_offset_5, 21, T[51]); 9501 a = II(a, b, c, d, M_offset_12, 6, T[52]); 9502 d = II(d, a, b, c, M_offset_3, 10, T[53]); 9503 c = II(c, d, a, b, M_offset_10, 15, T[54]); 9504 b = II(b, c, d, a, M_offset_1, 21, T[55]); 9505 a = II(a, b, c, d, M_offset_8, 6, T[56]); 9506 d = II(d, a, b, c, M_offset_15, 10, T[57]); 9507 c = II(c, d, a, b, M_offset_6, 15, T[58]); 9508 b = II(b, c, d, a, M_offset_13, 21, T[59]); 9509 a = II(a, b, c, d, M_offset_4, 6, T[60]); 9510 d = II(d, a, b, c, M_offset_11, 10, T[61]); 9511 c = II(c, d, a, b, M_offset_2, 15, T[62]); 9512 b = II(b, c, d, a, M_offset_9, 21, T[63]); 9513 9514 // Intermediate hash value 9515 H[0] = (H[0] + a) | 0; 9516 H[1] = (H[1] + b) | 0; 9517 H[2] = (H[2] + c) | 0; 9518 H[3] = (H[3] + d) | 0; 9519 }, 9520 9521 _doFinalize: function () { 9522 // Shortcuts 9523 var data = this._data; 9524 var dataWords = data.words; 9525 9526 var nBitsTotal = this._nDataBytes * 8; 9527 var nBitsLeft = data.sigBytes * 8; 9528 9529 // Add padding 9530 dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32); 9531 9532 var nBitsTotalH = Math.floor(nBitsTotal / 0x100000000); 9533 var nBitsTotalL = nBitsTotal; 9534 dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 15] = ( 9535 (((nBitsTotalH << 8) | (nBitsTotalH >>> 24)) & 0x00ff00ff) | 9536 (((nBitsTotalH << 24) | (nBitsTotalH >>> 8)) & 0xff00ff00) 9537 ); 9538 dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = ( 9539 (((nBitsTotalL << 8) | (nBitsTotalL >>> 24)) & 0x00ff00ff) | 9540 (((nBitsTotalL << 24) | (nBitsTotalL >>> 8)) & 0xff00ff00) 9541 ); 9542 9543 data.sigBytes = (dataWords.length + 1) * 4; 9544 9545 // Hash final blocks 9546 this._process(); 9547 9548 // Shortcuts 9549 var hash = this._hash; 9550 var H = hash.words; 9551 9552 // Swap endian 9553 for (var i = 0; i < 4; i++) { 9554 // Shortcut 9555 var H_i = H[i]; 9556 9557 H[i] = (((H_i << 8) | (H_i >>> 24)) & 0x00ff00ff) | 9558 (((H_i << 24) | (H_i >>> 8)) & 0xff00ff00); 9559 } 9560 9561 // Return final computed hash 9562 return hash; 9563 }, 9564 9565 clone: function () { 9566 var clone = Hasher.clone.call(this); 9567 clone._hash = this._hash.clone(); 9568 9569 return clone; 9570 } 9571 }); 9572 9573 function FF(a, b, c, d, x, s, t) { 9574 var n = a + ((b & c) | (~b & d)) + x + t; 9575 return ((n << s) | (n >>> (32 - s))) + b; 9576 } 9577 9578 function GG(a, b, c, d, x, s, t) { 9579 var n = a + ((b & d) | (c & ~d)) + x + t; 9580 return ((n << s) | (n >>> (32 - s))) + b; 9581 } 9582 9583 function HH(a, b, c, d, x, s, t) { 9584 var n = a + (b ^ c ^ d) + x + t; 9585 return ((n << s) | (n >>> (32 - s))) + b; 9586 } 9587 9588 function II(a, b, c, d, x, s, t) { 9589 var n = a + (c ^ (b | ~d)) + x + t; 9590 return ((n << s) | (n >>> (32 - s))) + b; 9591 } 9592 9593 /** 9594 * Shortcut function to the hasher's object interface. 9595 * 9596 * @param {WordArray|string} message The message to hash. 9597 * 9598 * @return {WordArray} The hash. 9599 * 9600 * @static 9601 * 9602 * @example 9603 * 9604 * var hash = CryptoJS.MD5('message'); 9605 * var hash = CryptoJS.MD5(wordArray); 9606 */ 9607 C.MD5 = Hasher._createHelper(MD5); 9608 9609 /** 9610 * Shortcut function to the HMAC's object interface. 9611 * 9612 * @param {WordArray|string} message The message to hash. 9613 * @param {WordArray|string} key The secret key. 9614 * 9615 * @return {WordArray} The HMAC. 9616 * 9617 * @static 9618 * 9619 * @example 9620 * 9621 * var hmac = CryptoJS.HmacMD5(message, key); 9622 */ 9623 C.HmacMD5 = Hasher._createHmacHelper(MD5); 9624 }(Math)); 9625 9626 9627 return CryptoJS.MD5; 9628 9629 })); 9630 },{"./core":53}],62:[function(require,module,exports){ 9631 ;(function (root, factory, undef) { 9632 if (typeof exports === "object") { 9633 // CommonJS 9634 module.exports = exports = factory(require("./core"), require("./cipher-core")); 9635 } 9636 else if (typeof define === "function" && define.amd) { 9637 // AMD 9638 define(["./core", "./cipher-core"], factory); 9639 } 9640 else { 9641 // Global (browser) 9642 factory(root.CryptoJS); 9643 } 9644 }(this, function (CryptoJS) { 9645 9646 /** 9647 * Cipher Feedback block mode. 9648 */ 9649 CryptoJS.mode.CFB = (function () { 9650 var CFB = CryptoJS.lib.BlockCipherMode.extend(); 9651 9652 CFB.Encryptor = CFB.extend({ 9653 processBlock: function (words, offset) { 9654 // Shortcuts 9655 var cipher = this._cipher; 9656 var blockSize = cipher.blockSize; 9657 9658 generateKeystreamAndEncrypt.call(this, words, offset, blockSize, cipher); 9659 9660 // Remember this block to use with next block 9661 this._prevBlock = words.slice(offset, offset + blockSize); 9662 } 9663 }); 9664 9665 CFB.Decryptor = CFB.extend({ 9666 processBlock: function (words, offset) { 9667 // Shortcuts 9668 var cipher = this._cipher; 9669 var blockSize = cipher.blockSize; 9670 9671 // Remember this block to use with next block 9672 var thisBlock = words.slice(offset, offset + blockSize); 9673 9674 generateKeystreamAndEncrypt.call(this, words, offset, blockSize, cipher); 9675 9676 // This block becomes the previous block 9677 this._prevBlock = thisBlock; 9678 } 9679 }); 9680 9681 function generateKeystreamAndEncrypt(words, offset, blockSize, cipher) { 9682 // Shortcut 9683 var iv = this._iv; 9684 9685 // Generate keystream 9686 if (iv) { 9687 var keystream = iv.slice(0); 9688 9689 // Remove IV for subsequent blocks 9690 this._iv = undefined; 9691 } else { 9692 var keystream = this._prevBlock; 9693 } 9694 cipher.encryptBlock(keystream, 0); 9695 9696 // Encrypt 9697 for (var i = 0; i < blockSize; i++) { 9698 words[offset + i] ^= keystream[i]; 9699 } 9700 } 9701 9702 return CFB; 9703 }()); 9704 9705 9706 return CryptoJS.mode.CFB; 9707 9708 })); 9709 },{"./cipher-core":52,"./core":53}],63:[function(require,module,exports){ 9710 ;(function (root, factory, undef) { 9711 if (typeof exports === "object") { 9712 // CommonJS 9713 module.exports = exports = factory(require("./core"), require("./cipher-core")); 9714 } 9715 else if (typeof define === "function" && define.amd) { 9716 // AMD 9717 define(["./core", "./cipher-core"], factory); 9718 } 9719 else { 9720 // Global (browser) 9721 factory(root.CryptoJS); 9722 } 9723 }(this, function (CryptoJS) { 9724 9725 /** @preserve 9726 * Counter block mode compatible with Dr Brian Gladman fileenc.c 9727 * derived from CryptoJS.mode.CTR 9728 * Jan Hruby jhruby.web@gmail.com 9729 */ 9730 CryptoJS.mode.CTRGladman = (function () { 9731 var CTRGladman = CryptoJS.lib.BlockCipherMode.extend(); 9732 9733 function incWord(word) 9734 { 9735 if (((word >> 24) & 0xff) === 0xff) { //overflow 9736 var b1 = (word >> 16)&0xff; 9737 var b2 = (word >> 8)&0xff; 9738 var b3 = word & 0xff; 9739 9740 if (b1 === 0xff) // overflow b1 9741 { 9742 b1 = 0; 9743 if (b2 === 0xff) 9744 { 9745 b2 = 0; 9746 if (b3 === 0xff) 9747 { 9748 b3 = 0; 9749 } 9750 else 9751 { 9752 ++b3; 9753 } 9754 } 9755 else 9756 { 9757 ++b2; 9758 } 9759 } 9760 else 9761 { 9762 ++b1; 9763 } 9764 9765 word = 0; 9766 word += (b1 << 16); 9767 word += (b2 << 8); 9768 word += b3; 9769 } 9770 else 9771 { 9772 word += (0x01 << 24); 9773 } 9774 return word; 9775 } 9776 9777 function incCounter(counter) 9778 { 9779 if ((counter[0] = incWord(counter[0])) === 0) 9780 { 9781 // encr_data in fileenc.c from Dr Brian Gladman's counts only with DWORD j < 8 9782 counter[1] = incWord(counter[1]); 9783 } 9784 return counter; 9785 } 9786 9787 var Encryptor = CTRGladman.Encryptor = CTRGladman.extend({ 9788 processBlock: function (words, offset) { 9789 // Shortcuts 9790 var cipher = this._cipher 9791 var blockSize = cipher.blockSize; 9792 var iv = this._iv; 9793 var counter = this._counter; 9794 9795 // Generate keystream 9796 if (iv) { 9797 counter = this._counter = iv.slice(0); 9798 9799 // Remove IV for subsequent blocks 9800 this._iv = undefined; 9801 } 9802 9803 incCounter(counter); 9804 9805 var keystream = counter.slice(0); 9806 cipher.encryptBlock(keystream, 0); 9807 9808 // Encrypt 9809 for (var i = 0; i < blockSize; i++) { 9810 words[offset + i] ^= keystream[i]; 9811 } 9812 } 9813 }); 9814 9815 CTRGladman.Decryptor = Encryptor; 9816 9817 return CTRGladman; 9818 }()); 9819 9820 9821 9822 9823 return CryptoJS.mode.CTRGladman; 9824 9825 })); 9826 },{"./cipher-core":52,"./core":53}],64:[function(require,module,exports){ 9827 ;(function (root, factory, undef) { 9828 if (typeof exports === "object") { 9829 // CommonJS 9830 module.exports = exports = factory(require("./core"), require("./cipher-core")); 9831 } 9832 else if (typeof define === "function" && define.amd) { 9833 // AMD 9834 define(["./core", "./cipher-core"], factory); 9835 } 9836 else { 9837 // Global (browser) 9838 factory(root.CryptoJS); 9839 } 9840 }(this, function (CryptoJS) { 9841 9842 /** 9843 * Counter block mode. 9844 */ 9845 CryptoJS.mode.CTR = (function () { 9846 var CTR = CryptoJS.lib.BlockCipherMode.extend(); 9847 9848 var Encryptor = CTR.Encryptor = CTR.extend({ 9849 processBlock: function (words, offset) { 9850 // Shortcuts 9851 var cipher = this._cipher 9852 var blockSize = cipher.blockSize; 9853 var iv = this._iv; 9854 var counter = this._counter; 9855 9856 // Generate keystream 9857 if (iv) { 9858 counter = this._counter = iv.slice(0); 9859 9860 // Remove IV for subsequent blocks 9861 this._iv = undefined; 9862 } 9863 var keystream = counter.slice(0); 9864 cipher.encryptBlock(keystream, 0); 9865 9866 // Increment counter 9867 counter[blockSize - 1] = (counter[blockSize - 1] + 1) | 0 9868 9869 // Encrypt 9870 for (var i = 0; i < blockSize; i++) { 9871 words[offset + i] ^= keystream[i]; 9872 } 9873 } 9874 }); 9875 9876 CTR.Decryptor = Encryptor; 9877 9878 return CTR; 9879 }()); 9880 9881 9882 return CryptoJS.mode.CTR; 9883 9884 })); 9885 },{"./cipher-core":52,"./core":53}],65:[function(require,module,exports){ 9886 ;(function (root, factory, undef) { 9887 if (typeof exports === "object") { 9888 // CommonJS 9889 module.exports = exports = factory(require("./core"), require("./cipher-core")); 9890 } 9891 else if (typeof define === "function" && define.amd) { 9892 // AMD 9893 define(["./core", "./cipher-core"], factory); 9894 } 9895 else { 9896 // Global (browser) 9897 factory(root.CryptoJS); 9898 } 9899 }(this, function (CryptoJS) { 9900 9901 /** 9902 * Electronic Codebook block mode. 9903 */ 9904 CryptoJS.mode.ECB = (function () { 9905 var ECB = CryptoJS.lib.BlockCipherMode.extend(); 9906 9907 ECB.Encryptor = ECB.extend({ 9908 processBlock: function (words, offset) { 9909 this._cipher.encryptBlock(words, offset); 9910 } 9911 }); 9912 9913 ECB.Decryptor = ECB.extend({ 9914 processBlock: function (words, offset) { 9915 this._cipher.decryptBlock(words, offset); 9916 } 9917 }); 9918 9919 return ECB; 9920 }()); 9921 9922 9923 return CryptoJS.mode.ECB; 9924 9925 })); 9926 },{"./cipher-core":52,"./core":53}],66:[function(require,module,exports){ 9927 ;(function (root, factory, undef) { 9928 if (typeof exports === "object") { 9929 // CommonJS 9930 module.exports = exports = factory(require("./core"), require("./cipher-core")); 9931 } 9932 else if (typeof define === "function" && define.amd) { 9933 // AMD 9934 define(["./core", "./cipher-core"], factory); 9935 } 9936 else { 9937 // Global (browser) 9938 factory(root.CryptoJS); 9939 } 9940 }(this, function (CryptoJS) { 9941 9942 /** 9943 * Output Feedback block mode. 9944 */ 9945 CryptoJS.mode.OFB = (function () { 9946 var OFB = CryptoJS.lib.BlockCipherMode.extend(); 9947 9948 var Encryptor = OFB.Encryptor = OFB.extend({ 9949 processBlock: function (words, offset) { 9950 // Shortcuts 9951 var cipher = this._cipher 9952 var blockSize = cipher.blockSize; 9953 var iv = this._iv; 9954 var keystream = this._keystream; 9955 9956 // Generate keystream 9957 if (iv) { 9958 keystream = this._keystream = iv.slice(0); 9959 9960 // Remove IV for subsequent blocks 9961 this._iv = undefined; 9962 } 9963 cipher.encryptBlock(keystream, 0); 9964 9965 // Encrypt 9966 for (var i = 0; i < blockSize; i++) { 9967 words[offset + i] ^= keystream[i]; 9968 } 9969 } 9970 }); 9971 9972 OFB.Decryptor = Encryptor; 9973 9974 return OFB; 9975 }()); 9976 9977 9978 return CryptoJS.mode.OFB; 9979 9980 })); 9981 },{"./cipher-core":52,"./core":53}],67:[function(require,module,exports){ 9982 ;(function (root, factory, undef) { 9983 if (typeof exports === "object") { 9984 // CommonJS 9985 module.exports = exports = factory(require("./core"), require("./cipher-core")); 9986 } 9987 else if (typeof define === "function" && define.amd) { 9988 // AMD 9989 define(["./core", "./cipher-core"], factory); 9990 } 9991 else { 9992 // Global (browser) 9993 factory(root.CryptoJS); 9994 } 9995 }(this, function (CryptoJS) { 9996 9997 /** 9998 * ANSI X.923 padding strategy. 9999 */ 10000 CryptoJS.pad.AnsiX923 = { 10001 pad: function (data, blockSize) { 10002 // Shortcuts 10003 var dataSigBytes = data.sigBytes; 10004 var blockSizeBytes = blockSize * 4; 10005 10006 // Count padding bytes 10007 var nPaddingBytes = blockSizeBytes - dataSigBytes % blockSizeBytes; 10008 10009 // Compute last byte position 10010 var lastBytePos = dataSigBytes + nPaddingBytes - 1; 10011 10012 // Pad 10013 data.clamp(); 10014 data.words[lastBytePos >>> 2] |= nPaddingBytes << (24 - (lastBytePos % 4) * 8); 10015 data.sigBytes += nPaddingBytes; 10016 }, 10017 10018 unpad: function (data) { 10019 // Get number of padding bytes from last byte 10020 var nPaddingBytes = data.words[(data.sigBytes - 1) >>> 2] & 0xff; 10021 10022 // Remove padding 10023 data.sigBytes -= nPaddingBytes; 10024 } 10025 }; 10026 10027 10028 return CryptoJS.pad.Ansix923; 10029 10030 })); 10031 },{"./cipher-core":52,"./core":53}],68:[function(require,module,exports){ 10032 ;(function (root, factory, undef) { 10033 if (typeof exports === "object") { 10034 // CommonJS 10035 module.exports = exports = factory(require("./core"), require("./cipher-core")); 10036 } 10037 else if (typeof define === "function" && define.amd) { 10038 // AMD 10039 define(["./core", "./cipher-core"], factory); 10040 } 10041 else { 10042 // Global (browser) 10043 factory(root.CryptoJS); 10044 } 10045 }(this, function (CryptoJS) { 10046 10047 /** 10048 * ISO 10126 padding strategy. 10049 */ 10050 CryptoJS.pad.Iso10126 = { 10051 pad: function (data, blockSize) { 10052 // Shortcut 10053 var blockSizeBytes = blockSize * 4; 10054 10055 // Count padding bytes 10056 var nPaddingBytes = blockSizeBytes - data.sigBytes % blockSizeBytes; 10057 10058 // Pad 10059 data.concat(CryptoJS.lib.WordArray.random(nPaddingBytes - 1)). 10060 concat(CryptoJS.lib.WordArray.create([nPaddingBytes << 24], 1)); 10061 }, 10062 10063 unpad: function (data) { 10064 // Get number of padding bytes from last byte 10065 var nPaddingBytes = data.words[(data.sigBytes - 1) >>> 2] & 0xff; 10066 10067 // Remove padding 10068 data.sigBytes -= nPaddingBytes; 10069 } 10070 }; 10071 10072 10073 return CryptoJS.pad.Iso10126; 10074 10075 })); 10076 },{"./cipher-core":52,"./core":53}],69:[function(require,module,exports){ 10077 ;(function (root, factory, undef) { 10078 if (typeof exports === "object") { 10079 // CommonJS 10080 module.exports = exports = factory(require("./core"), require("./cipher-core")); 10081 } 10082 else if (typeof define === "function" && define.amd) { 10083 // AMD 10084 define(["./core", "./cipher-core"], factory); 10085 } 10086 else { 10087 // Global (browser) 10088 factory(root.CryptoJS); 10089 } 10090 }(this, function (CryptoJS) { 10091 10092 /** 10093 * ISO/IEC 9797-1 Padding Method 2. 10094 */ 10095 CryptoJS.pad.Iso97971 = { 10096 pad: function (data, blockSize) { 10097 // Add 0x80 byte 10098 data.concat(CryptoJS.lib.WordArray.create([0x80000000], 1)); 10099 10100 // Zero pad the rest 10101 CryptoJS.pad.ZeroPadding.pad(data, blockSize); 10102 }, 10103 10104 unpad: function (data) { 10105 // Remove zero padding 10106 CryptoJS.pad.ZeroPadding.unpad(data); 10107 10108 // Remove one more byte -- the 0x80 byte 10109 data.sigBytes--; 10110 } 10111 }; 10112 10113 10114 return CryptoJS.pad.Iso97971; 10115 10116 })); 10117 },{"./cipher-core":52,"./core":53}],70:[function(require,module,exports){ 10118 ;(function (root, factory, undef) { 10119 if (typeof exports === "object") { 10120 // CommonJS 10121 module.exports = exports = factory(require("./core"), require("./cipher-core")); 10122 } 10123 else if (typeof define === "function" && define.amd) { 10124 // AMD 10125 define(["./core", "./cipher-core"], factory); 10126 } 10127 else { 10128 // Global (browser) 10129 factory(root.CryptoJS); 10130 } 10131 }(this, function (CryptoJS) { 10132 10133 /** 10134 * A noop padding strategy. 10135 */ 10136 CryptoJS.pad.NoPadding = { 10137 pad: function () { 10138 }, 10139 10140 unpad: function () { 10141 } 10142 }; 10143 10144 10145 return CryptoJS.pad.NoPadding; 10146 10147 })); 10148 },{"./cipher-core":52,"./core":53}],71:[function(require,module,exports){ 10149 ;(function (root, factory, undef) { 10150 if (typeof exports === "object") { 10151 // CommonJS 10152 module.exports = exports = factory(require("./core"), require("./cipher-core")); 10153 } 10154 else if (typeof define === "function" && define.amd) { 10155 // AMD 10156 define(["./core", "./cipher-core"], factory); 10157 } 10158 else { 10159 // Global (browser) 10160 factory(root.CryptoJS); 10161 } 10162 }(this, function (CryptoJS) { 10163 10164 /** 10165 * Zero padding strategy. 10166 */ 10167 CryptoJS.pad.ZeroPadding = { 10168 pad: function (data, blockSize) { 10169 // Shortcut 10170 var blockSizeBytes = blockSize * 4; 10171 10172 // Pad 10173 data.clamp(); 10174 data.sigBytes += blockSizeBytes - ((data.sigBytes % blockSizeBytes) || blockSizeBytes); 10175 }, 10176 10177 unpad: function (data) { 10178 // Shortcut 10179 var dataWords = data.words; 10180 10181 // Unpad 10182 var i = data.sigBytes - 1; 10183 while (!((dataWords[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff)) { 10184 i--; 10185 } 10186 data.sigBytes = i + 1; 10187 } 10188 }; 10189 10190 10191 return CryptoJS.pad.ZeroPadding; 10192 10193 })); 10194 },{"./cipher-core":52,"./core":53}],72:[function(require,module,exports){ 10195 ;(function (root, factory, undef) { 10196 if (typeof exports === "object") { 10197 // CommonJS 10198 module.exports = exports = factory(require("./core"), require("./sha1"), require("./hmac")); 10199 } 10200 else if (typeof define === "function" && define.amd) { 10201 // AMD 10202 define(["./core", "./sha1", "./hmac"], factory); 10203 } 10204 else { 10205 // Global (browser) 10206 factory(root.CryptoJS); 10207 } 10208 }(this, function (CryptoJS) { 10209 10210 (function () { 10211 // Shortcuts 10212 var C = CryptoJS; 10213 var C_lib = C.lib; 10214 var Base = C_lib.Base; 10215 var WordArray = C_lib.WordArray; 10216 var C_algo = C.algo; 10217 var SHA1 = C_algo.SHA1; 10218 var HMAC = C_algo.HMAC; 10219 10220 /** 10221 * Password-Based Key Derivation Function 2 algorithm. 10222 */ 10223 var PBKDF2 = C_algo.PBKDF2 = Base.extend({ 10224 /** 10225 * Configuration options. 10226 * 10227 * @property {number} keySize The key size in words to generate. Default: 4 (128 bits) 10228 * @property {Hasher} hasher The hasher to use. Default: SHA1 10229 * @property {number} iterations The number of iterations to perform. Default: 1 10230 */ 10231 cfg: Base.extend({ 10232 keySize: 128/32, 10233 hasher: SHA1, 10234 iterations: 1 10235 }), 10236 10237 /** 10238 * Initializes a newly created key derivation function. 10239 * 10240 * @param {Object} cfg (Optional) The configuration options to use for the derivation. 10241 * 10242 * @example 10243 * 10244 * var kdf = CryptoJS.algo.PBKDF2.create(); 10245 * var kdf = CryptoJS.algo.PBKDF2.create({ keySize: 8 }); 10246 * var kdf = CryptoJS.algo.PBKDF2.create({ keySize: 8, iterations: 1000 }); 10247 */ 10248 init: function (cfg) { 10249 this.cfg = this.cfg.extend(cfg); 10250 }, 10251 10252 /** 10253 * Computes the Password-Based Key Derivation Function 2. 10254 * 10255 * @param {WordArray|string} password The password. 10256 * @param {WordArray|string} salt A salt. 10257 * 10258 * @return {WordArray} The derived key. 10259 * 10260 * @example 10261 * 10262 * var key = kdf.compute(password, salt); 10263 */ 10264 compute: function (password, salt) { 10265 // Shortcut 10266 var cfg = this.cfg; 10267 10268 // Init HMAC 10269 var hmac = HMAC.create(cfg.hasher, password); 10270 10271 // Initial values 10272 var derivedKey = WordArray.create(); 10273 var blockIndex = WordArray.create([0x00000001]); 10274 10275 // Shortcuts 10276 var derivedKeyWords = derivedKey.words; 10277 var blockIndexWords = blockIndex.words; 10278 var keySize = cfg.keySize; 10279 var iterations = cfg.iterations; 10280 10281 // Generate key 10282 while (derivedKeyWords.length < keySize) { 10283 var block = hmac.update(salt).finalize(blockIndex); 10284 hmac.reset(); 10285 10286 // Shortcuts 10287 var blockWords = block.words; 10288 var blockWordsLength = blockWords.length; 10289 10290 // Iterations 10291 var intermediate = block; 10292 for (var i = 1; i < iterations; i++) { 10293 intermediate = hmac.finalize(intermediate); 10294 hmac.reset(); 10295 10296 // Shortcut 10297 var intermediateWords = intermediate.words; 10298 10299 // XOR intermediate with block 10300 for (var j = 0; j < blockWordsLength; j++) { 10301 blockWords[j] ^= intermediateWords[j]; 10302 } 10303 } 10304 10305 derivedKey.concat(block); 10306 blockIndexWords[0]++; 10307 } 10308 derivedKey.sigBytes = keySize * 4; 10309 10310 return derivedKey; 10311 } 10312 }); 10313 10314 /** 10315 * Computes the Password-Based Key Derivation Function 2. 10316 * 10317 * @param {WordArray|string} password The password. 10318 * @param {WordArray|string} salt A salt. 10319 * @param {Object} cfg (Optional) The configuration options to use for this computation. 10320 * 10321 * @return {WordArray} The derived key. 10322 * 10323 * @static 10324 * 10325 * @example 10326 * 10327 * var key = CryptoJS.PBKDF2(password, salt); 10328 * var key = CryptoJS.PBKDF2(password, salt, { keySize: 8 }); 10329 * var key = CryptoJS.PBKDF2(password, salt, { keySize: 8, iterations: 1000 }); 10330 */ 10331 C.PBKDF2 = function (password, salt, cfg) { 10332 return PBKDF2.create(cfg).compute(password, salt); 10333 }; 10334 }()); 10335 10336 10337 return CryptoJS.PBKDF2; 10338 10339 })); 10340 },{"./core":53,"./hmac":58,"./sha1":77}],73:[function(require,module,exports){ 10341 ;(function (root, factory, undef) { 10342 if (typeof exports === "object") { 10343 // CommonJS 10344 module.exports = exports = factory(require("./core"), require("./enc-base64"), require("./md5"), require("./evpkdf"), require("./cipher-core")); 10345 } 10346 else if (typeof define === "function" && define.amd) { 10347 // AMD 10348 define(["./core", "./enc-base64", "./md5", "./evpkdf", "./cipher-core"], factory); 10349 } 10350 else { 10351 // Global (browser) 10352 factory(root.CryptoJS); 10353 } 10354 }(this, function (CryptoJS) { 10355 10356 (function () { 10357 // Shortcuts 10358 var C = CryptoJS; 10359 var C_lib = C.lib; 10360 var StreamCipher = C_lib.StreamCipher; 10361 var C_algo = C.algo; 10362 10363 // Reusable objects 10364 var S = []; 10365 var C_ = []; 10366 var G = []; 10367 10368 /** 10369 * Rabbit stream cipher algorithm. 10370 * 10371 * This is a legacy version that neglected to convert the key to little-endian. 10372 * This error doesn't affect the cipher's security, 10373 * but it does affect its compatibility with other implementations. 10374 */ 10375 var RabbitLegacy = C_algo.RabbitLegacy = StreamCipher.extend({ 10376 _doReset: function () { 10377 // Shortcuts 10378 var K = this._key.words; 10379 var iv = this.cfg.iv; 10380 10381 // Generate initial state values 10382 var X = this._X = [ 10383 K[0], (K[3] << 16) | (K[2] >>> 16), 10384 K[1], (K[0] << 16) | (K[3] >>> 16), 10385 K[2], (K[1] << 16) | (K[0] >>> 16), 10386 K[3], (K[2] << 16) | (K[1] >>> 16) 10387 ]; 10388 10389 // Generate initial counter values 10390 var C = this._C = [ 10391 (K[2] << 16) | (K[2] >>> 16), (K[0] & 0xffff0000) | (K[1] & 0x0000ffff), 10392 (K[3] << 16) | (K[3] >>> 16), (K[1] & 0xffff0000) | (K[2] & 0x0000ffff), 10393 (K[0] << 16) | (K[0] >>> 16), (K[2] & 0xffff0000) | (K[3] & 0x0000ffff), 10394 (K[1] << 16) | (K[1] >>> 16), (K[3] & 0xffff0000) | (K[0] & 0x0000ffff) 10395 ]; 10396 10397 // Carry bit 10398 this._b = 0; 10399 10400 // Iterate the system four times 10401 for (var i = 0; i < 4; i++) { 10402 nextState.call(this); 10403 } 10404 10405 // Modify the counters 10406 for (var i = 0; i < 8; i++) { 10407 C[i] ^= X[(i + 4) & 7]; 10408 } 10409 10410 // IV setup 10411 if (iv) { 10412 // Shortcuts 10413 var IV = iv.words; 10414 var IV_0 = IV[0]; 10415 var IV_1 = IV[1]; 10416 10417 // Generate four subvectors 10418 var i0 = (((IV_0 << 8) | (IV_0 >>> 24)) & 0x00ff00ff) | (((IV_0 << 24) | (IV_0 >>> 8)) & 0xff00ff00); 10419 var i2 = (((IV_1 << 8) | (IV_1 >>> 24)) & 0x00ff00ff) | (((IV_1 << 24) | (IV_1 >>> 8)) & 0xff00ff00); 10420 var i1 = (i0 >>> 16) | (i2 & 0xffff0000); 10421 var i3 = (i2 << 16) | (i0 & 0x0000ffff); 10422 10423 // Modify counter values 10424 C[0] ^= i0; 10425 C[1] ^= i1; 10426 C[2] ^= i2; 10427 C[3] ^= i3; 10428 C[4] ^= i0; 10429 C[5] ^= i1; 10430 C[6] ^= i2; 10431 C[7] ^= i3; 10432 10433 // Iterate the system four times 10434 for (var i = 0; i < 4; i++) { 10435 nextState.call(this); 10436 } 10437 } 10438 }, 10439 10440 _doProcessBlock: function (M, offset) { 10441 // Shortcut 10442 var X = this._X; 10443 10444 // Iterate the system 10445 nextState.call(this); 10446 10447 // Generate four keystream words 10448 S[0] = X[0] ^ (X[5] >>> 16) ^ (X[3] << 16); 10449 S[1] = X[2] ^ (X[7] >>> 16) ^ (X[5] << 16); 10450 S[2] = X[4] ^ (X[1] >>> 16) ^ (X[7] << 16); 10451 S[3] = X[6] ^ (X[3] >>> 16) ^ (X[1] << 16); 10452 10453 for (var i = 0; i < 4; i++) { 10454 // Swap endian 10455 S[i] = (((S[i] << 8) | (S[i] >>> 24)) & 0x00ff00ff) | 10456 (((S[i] << 24) | (S[i] >>> 8)) & 0xff00ff00); 10457 10458 // Encrypt 10459 M[offset + i] ^= S[i]; 10460 } 10461 }, 10462 10463 blockSize: 128/32, 10464 10465 ivSize: 64/32 10466 }); 10467 10468 function nextState() { 10469 // Shortcuts 10470 var X = this._X; 10471 var C = this._C; 10472 10473 // Save old counter values 10474 for (var i = 0; i < 8; i++) { 10475 C_[i] = C[i]; 10476 } 10477 10478 // Calculate new counter values 10479 C[0] = (C[0] + 0x4d34d34d + this._b) | 0; 10480 C[1] = (C[1] + 0xd34d34d3 + ((C[0] >>> 0) < (C_[0] >>> 0) ? 1 : 0)) | 0; 10481 C[2] = (C[2] + 0x34d34d34 + ((C[1] >>> 0) < (C_[1] >>> 0) ? 1 : 0)) | 0; 10482 C[3] = (C[3] + 0x4d34d34d + ((C[2] >>> 0) < (C_[2] >>> 0) ? 1 : 0)) | 0; 10483 C[4] = (C[4] + 0xd34d34d3 + ((C[3] >>> 0) < (C_[3] >>> 0) ? 1 : 0)) | 0; 10484 C[5] = (C[5] + 0x34d34d34 + ((C[4] >>> 0) < (C_[4] >>> 0) ? 1 : 0)) | 0; 10485 C[6] = (C[6] + 0x4d34d34d + ((C[5] >>> 0) < (C_[5] >>> 0) ? 1 : 0)) | 0; 10486 C[7] = (C[7] + 0xd34d34d3 + ((C[6] >>> 0) < (C_[6] >>> 0) ? 1 : 0)) | 0; 10487 this._b = (C[7] >>> 0) < (C_[7] >>> 0) ? 1 : 0; 10488 10489 // Calculate the g-values 10490 for (var i = 0; i < 8; i++) { 10491 var gx = X[i] + C[i]; 10492 10493 // Construct high and low argument for squaring 10494 var ga = gx & 0xffff; 10495 var gb = gx >>> 16; 10496 10497 // Calculate high and low result of squaring 10498 var gh = ((((ga * ga) >>> 17) + ga * gb) >>> 15) + gb * gb; 10499 var gl = (((gx & 0xffff0000) * gx) | 0) + (((gx & 0x0000ffff) * gx) | 0); 10500 10501 // High XOR low 10502 G[i] = gh ^ gl; 10503 } 10504 10505 // Calculate new state values 10506 X[0] = (G[0] + ((G[7] << 16) | (G[7] >>> 16)) + ((G[6] << 16) | (G[6] >>> 16))) | 0; 10507 X[1] = (G[1] + ((G[0] << 8) | (G[0] >>> 24)) + G[7]) | 0; 10508 X[2] = (G[2] + ((G[1] << 16) | (G[1] >>> 16)) + ((G[0] << 16) | (G[0] >>> 16))) | 0; 10509 X[3] = (G[3] + ((G[2] << 8) | (G[2] >>> 24)) + G[1]) | 0; 10510 X[4] = (G[4] + ((G[3] << 16) | (G[3] >>> 16)) + ((G[2] << 16) | (G[2] >>> 16))) | 0; 10511 X[5] = (G[5] + ((G[4] << 8) | (G[4] >>> 24)) + G[3]) | 0; 10512 X[6] = (G[6] + ((G[5] << 16) | (G[5] >>> 16)) + ((G[4] << 16) | (G[4] >>> 16))) | 0; 10513 X[7] = (G[7] + ((G[6] << 8) | (G[6] >>> 24)) + G[5]) | 0; 10514 } 10515 10516 /** 10517 * Shortcut functions to the cipher's object interface. 10518 * 10519 * @example 10520 * 10521 * var ciphertext = CryptoJS.RabbitLegacy.encrypt(message, key, cfg); 10522 * var plaintext = CryptoJS.RabbitLegacy.decrypt(ciphertext, key, cfg); 10523 */ 10524 C.RabbitLegacy = StreamCipher._createHelper(RabbitLegacy); 10525 }()); 10526 10527 10528 return CryptoJS.RabbitLegacy; 10529 10530 })); 10531 },{"./cipher-core":52,"./core":53,"./enc-base64":54,"./evpkdf":56,"./md5":61}],74:[function(require,module,exports){ 10532 ;(function (root, factory, undef) { 10533 if (typeof exports === "object") { 10534 // CommonJS 10535 module.exports = exports = factory(require("./core"), require("./enc-base64"), require("./md5"), require("./evpkdf"), require("./cipher-core")); 10536 } 10537 else if (typeof define === "function" && define.amd) { 10538 // AMD 10539 define(["./core", "./enc-base64", "./md5", "./evpkdf", "./cipher-core"], factory); 10540 } 10541 else { 10542 // Global (browser) 10543 factory(root.CryptoJS); 10544 } 10545 }(this, function (CryptoJS) { 10546 10547 (function () { 10548 // Shortcuts 10549 var C = CryptoJS; 10550 var C_lib = C.lib; 10551 var StreamCipher = C_lib.StreamCipher; 10552 var C_algo = C.algo; 10553 10554 // Reusable objects 10555 var S = []; 10556 var C_ = []; 10557 var G = []; 10558 10559 /** 10560 * Rabbit stream cipher algorithm 10561 */ 10562 var Rabbit = C_algo.Rabbit = StreamCipher.extend({ 10563 _doReset: function () { 10564 // Shortcuts 10565 var K = this._key.words; 10566 var iv = this.cfg.iv; 10567 10568 // Swap endian 10569 for (var i = 0; i < 4; i++) { 10570 K[i] = (((K[i] << 8) | (K[i] >>> 24)) & 0x00ff00ff) | 10571 (((K[i] << 24) | (K[i] >>> 8)) & 0xff00ff00); 10572 } 10573 10574 // Generate initial state values 10575 var X = this._X = [ 10576 K[0], (K[3] << 16) | (K[2] >>> 16), 10577 K[1], (K[0] << 16) | (K[3] >>> 16), 10578 K[2], (K[1] << 16) | (K[0] >>> 16), 10579 K[3], (K[2] << 16) | (K[1] >>> 16) 10580 ]; 10581 10582 // Generate initial counter values 10583 var C = this._C = [ 10584 (K[2] << 16) | (K[2] >>> 16), (K[0] & 0xffff0000) | (K[1] & 0x0000ffff), 10585 (K[3] << 16) | (K[3] >>> 16), (K[1] & 0xffff0000) | (K[2] & 0x0000ffff), 10586 (K[0] << 16) | (K[0] >>> 16), (K[2] & 0xffff0000) | (K[3] & 0x0000ffff), 10587 (K[1] << 16) | (K[1] >>> 16), (K[3] & 0xffff0000) | (K[0] & 0x0000ffff) 10588 ]; 10589 10590 // Carry bit 10591 this._b = 0; 10592 10593 // Iterate the system four times 10594 for (var i = 0; i < 4; i++) { 10595 nextState.call(this); 10596 } 10597 10598 // Modify the counters 10599 for (var i = 0; i < 8; i++) { 10600 C[i] ^= X[(i + 4) & 7]; 10601 } 10602 10603 // IV setup 10604 if (iv) { 10605 // Shortcuts 10606 var IV = iv.words; 10607 var IV_0 = IV[0]; 10608 var IV_1 = IV[1]; 10609 10610 // Generate four subvectors 10611 var i0 = (((IV_0 << 8) | (IV_0 >>> 24)) & 0x00ff00ff) | (((IV_0 << 24) | (IV_0 >>> 8)) & 0xff00ff00); 10612 var i2 = (((IV_1 << 8) | (IV_1 >>> 24)) & 0x00ff00ff) | (((IV_1 << 24) | (IV_1 >>> 8)) & 0xff00ff00); 10613 var i1 = (i0 >>> 16) | (i2 & 0xffff0000); 10614 var i3 = (i2 << 16) | (i0 & 0x0000ffff); 10615 10616 // Modify counter values 10617 C[0] ^= i0; 10618 C[1] ^= i1; 10619 C[2] ^= i2; 10620 C[3] ^= i3; 10621 C[4] ^= i0; 10622 C[5] ^= i1; 10623 C[6] ^= i2; 10624 C[7] ^= i3; 10625 10626 // Iterate the system four times 10627 for (var i = 0; i < 4; i++) { 10628 nextState.call(this); 10629 } 10630 } 10631 }, 10632 10633 _doProcessBlock: function (M, offset) { 10634 // Shortcut 10635 var X = this._X; 10636 10637 // Iterate the system 10638 nextState.call(this); 10639 10640 // Generate four keystream words 10641 S[0] = X[0] ^ (X[5] >>> 16) ^ (X[3] << 16); 10642 S[1] = X[2] ^ (X[7] >>> 16) ^ (X[5] << 16); 10643 S[2] = X[4] ^ (X[1] >>> 16) ^ (X[7] << 16); 10644 S[3] = X[6] ^ (X[3] >>> 16) ^ (X[1] << 16); 10645 10646 for (var i = 0; i < 4; i++) { 10647 // Swap endian 10648 S[i] = (((S[i] << 8) | (S[i] >>> 24)) & 0x00ff00ff) | 10649 (((S[i] << 24) | (S[i] >>> 8)) & 0xff00ff00); 10650 10651 // Encrypt 10652 M[offset + i] ^= S[i]; 10653 } 10654 }, 10655 10656 blockSize: 128/32, 10657 10658 ivSize: 64/32 10659 }); 10660 10661 function nextState() { 10662 // Shortcuts 10663 var X = this._X; 10664 var C = this._C; 10665 10666 // Save old counter values 10667 for (var i = 0; i < 8; i++) { 10668 C_[i] = C[i]; 10669 } 10670 10671 // Calculate new counter values 10672 C[0] = (C[0] + 0x4d34d34d + this._b) | 0; 10673 C[1] = (C[1] + 0xd34d34d3 + ((C[0] >>> 0) < (C_[0] >>> 0) ? 1 : 0)) | 0; 10674 C[2] = (C[2] + 0x34d34d34 + ((C[1] >>> 0) < (C_[1] >>> 0) ? 1 : 0)) | 0; 10675 C[3] = (C[3] + 0x4d34d34d + ((C[2] >>> 0) < (C_[2] >>> 0) ? 1 : 0)) | 0; 10676 C[4] = (C[4] + 0xd34d34d3 + ((C[3] >>> 0) < (C_[3] >>> 0) ? 1 : 0)) | 0; 10677 C[5] = (C[5] + 0x34d34d34 + ((C[4] >>> 0) < (C_[4] >>> 0) ? 1 : 0)) | 0; 10678 C[6] = (C[6] + 0x4d34d34d + ((C[5] >>> 0) < (C_[5] >>> 0) ? 1 : 0)) | 0; 10679 C[7] = (C[7] + 0xd34d34d3 + ((C[6] >>> 0) < (C_[6] >>> 0) ? 1 : 0)) | 0; 10680 this._b = (C[7] >>> 0) < (C_[7] >>> 0) ? 1 : 0; 10681 10682 // Calculate the g-values 10683 for (var i = 0; i < 8; i++) { 10684 var gx = X[i] + C[i]; 10685 10686 // Construct high and low argument for squaring 10687 var ga = gx & 0xffff; 10688 var gb = gx >>> 16; 10689 10690 // Calculate high and low result of squaring 10691 var gh = ((((ga * ga) >>> 17) + ga * gb) >>> 15) + gb * gb; 10692 var gl = (((gx & 0xffff0000) * gx) | 0) + (((gx & 0x0000ffff) * gx) | 0); 10693 10694 // High XOR low 10695 G[i] = gh ^ gl; 10696 } 10697 10698 // Calculate new state values 10699 X[0] = (G[0] + ((G[7] << 16) | (G[7] >>> 16)) + ((G[6] << 16) | (G[6] >>> 16))) | 0; 10700 X[1] = (G[1] + ((G[0] << 8) | (G[0] >>> 24)) + G[7]) | 0; 10701 X[2] = (G[2] + ((G[1] << 16) | (G[1] >>> 16)) + ((G[0] << 16) | (G[0] >>> 16))) | 0; 10702 X[3] = (G[3] + ((G[2] << 8) | (G[2] >>> 24)) + G[1]) | 0; 10703 X[4] = (G[4] + ((G[3] << 16) | (G[3] >>> 16)) + ((G[2] << 16) | (G[2] >>> 16))) | 0; 10704 X[5] = (G[5] + ((G[4] << 8) | (G[4] >>> 24)) + G[3]) | 0; 10705 X[6] = (G[6] + ((G[5] << 16) | (G[5] >>> 16)) + ((G[4] << 16) | (G[4] >>> 16))) | 0; 10706 X[7] = (G[7] + ((G[6] << 8) | (G[6] >>> 24)) + G[5]) | 0; 10707 } 10708 10709 /** 10710 * Shortcut functions to the cipher's object interface. 10711 * 10712 * @example 10713 * 10714 * var ciphertext = CryptoJS.Rabbit.encrypt(message, key, cfg); 10715 * var plaintext = CryptoJS.Rabbit.decrypt(ciphertext, key, cfg); 10716 */ 10717 C.Rabbit = StreamCipher._createHelper(Rabbit); 10718 }()); 10719 10720 10721 return CryptoJS.Rabbit; 10722 10723 })); 10724 },{"./cipher-core":52,"./core":53,"./enc-base64":54,"./evpkdf":56,"./md5":61}],75:[function(require,module,exports){ 10725 ;(function (root, factory, undef) { 10726 if (typeof exports === "object") { 10727 // CommonJS 10728 module.exports = exports = factory(require("./core"), require("./enc-base64"), require("./md5"), require("./evpkdf"), require("./cipher-core")); 10729 } 10730 else if (typeof define === "function" && define.amd) { 10731 // AMD 10732 define(["./core", "./enc-base64", "./md5", "./evpkdf", "./cipher-core"], factory); 10733 } 10734 else { 10735 // Global (browser) 10736 factory(root.CryptoJS); 10737 } 10738 }(this, function (CryptoJS) { 10739 10740 (function () { 10741 // Shortcuts 10742 var C = CryptoJS; 10743 var C_lib = C.lib; 10744 var StreamCipher = C_lib.StreamCipher; 10745 var C_algo = C.algo; 10746 10747 /** 10748 * RC4 stream cipher algorithm. 10749 */ 10750 var RC4 = C_algo.RC4 = StreamCipher.extend({ 10751 _doReset: function () { 10752 // Shortcuts 10753 var key = this._key; 10754 var keyWords = key.words; 10755 var keySigBytes = key.sigBytes; 10756 10757 // Init sbox 10758 var S = this._S = []; 10759 for (var i = 0; i < 256; i++) { 10760 S[i] = i; 10761 } 10762 10763 // Key setup 10764 for (var i = 0, j = 0; i < 256; i++) { 10765 var keyByteIndex = i % keySigBytes; 10766 var keyByte = (keyWords[keyByteIndex >>> 2] >>> (24 - (keyByteIndex % 4) * 8)) & 0xff; 10767 10768 j = (j + S[i] + keyByte) % 256; 10769 10770 // Swap 10771 var t = S[i]; 10772 S[i] = S[j]; 10773 S[j] = t; 10774 } 10775 10776 // Counters 10777 this._i = this._j = 0; 10778 }, 10779 10780 _doProcessBlock: function (M, offset) { 10781 M[offset] ^= generateKeystreamWord.call(this); 10782 }, 10783 10784 keySize: 256/32, 10785 10786 ivSize: 0 10787 }); 10788 10789 function generateKeystreamWord() { 10790 // Shortcuts 10791 var S = this._S; 10792 var i = this._i; 10793 var j = this._j; 10794 10795 // Generate keystream word 10796 var keystreamWord = 0; 10797 for (var n = 0; n < 4; n++) { 10798 i = (i + 1) % 256; 10799 j = (j + S[i]) % 256; 10800 10801 // Swap 10802 var t = S[i]; 10803 S[i] = S[j]; 10804 S[j] = t; 10805 10806 keystreamWord |= S[(S[i] + S[j]) % 256] << (24 - n * 8); 10807 } 10808 10809 // Update counters 10810 this._i = i; 10811 this._j = j; 10812 10813 return keystreamWord; 10814 } 10815 10816 /** 10817 * Shortcut functions to the cipher's object interface. 10818 * 10819 * @example 10820 * 10821 * var ciphertext = CryptoJS.RC4.encrypt(message, key, cfg); 10822 * var plaintext = CryptoJS.RC4.decrypt(ciphertext, key, cfg); 10823 */ 10824 C.RC4 = StreamCipher._createHelper(RC4); 10825 10826 /** 10827 * Modified RC4 stream cipher algorithm. 10828 */ 10829 var RC4Drop = C_algo.RC4Drop = RC4.extend({ 10830 /** 10831 * Configuration options. 10832 * 10833 * @property {number} drop The number of keystream words to drop. Default 192 10834 */ 10835 cfg: RC4.cfg.extend({ 10836 drop: 192 10837 }), 10838 10839 _doReset: function () { 10840 RC4._doReset.call(this); 10841 10842 // Drop 10843 for (var i = this.cfg.drop; i > 0; i--) { 10844 generateKeystreamWord.call(this); 10845 } 10846 } 10847 }); 10848 10849 /** 10850 * Shortcut functions to the cipher's object interface. 10851 * 10852 * @example 10853 * 10854 * var ciphertext = CryptoJS.RC4Drop.encrypt(message, key, cfg); 10855 * var plaintext = CryptoJS.RC4Drop.decrypt(ciphertext, key, cfg); 10856 */ 10857 C.RC4Drop = StreamCipher._createHelper(RC4Drop); 10858 }()); 10859 10860 10861 return CryptoJS.RC4; 10862 10863 })); 10864 },{"./cipher-core":52,"./core":53,"./enc-base64":54,"./evpkdf":56,"./md5":61}],76:[function(require,module,exports){ 10865 ;(function (root, factory) { 10866 if (typeof exports === "object") { 10867 // CommonJS 10868 module.exports = exports = factory(require("./core")); 10869 } 10870 else if (typeof define === "function" && define.amd) { 10871 // AMD 10872 define(["./core"], factory); 10873 } 10874 else { 10875 // Global (browser) 10876 factory(root.CryptoJS); 10877 } 10878 }(this, function (CryptoJS) { 10879 10880 /** @preserve 10881 (c) 2012 by Cédric Mesnil. All rights reserved. 10882 10883 Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 10884 10885 - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 10886 - 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. 10887 10888 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. 10889 */ 10890 10891 (function (Math) { 10892 // Shortcuts 10893 var C = CryptoJS; 10894 var C_lib = C.lib; 10895 var WordArray = C_lib.WordArray; 10896 var Hasher = C_lib.Hasher; 10897 var C_algo = C.algo; 10898 10899 // Constants table 10900 var _zl = WordArray.create([ 10901 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 10902 7, 4, 13, 1, 10, 6, 15, 3, 12, 0, 9, 5, 2, 14, 11, 8, 10903 3, 10, 14, 4, 9, 15, 8, 1, 2, 7, 0, 6, 13, 11, 5, 12, 10904 1, 9, 11, 10, 0, 8, 12, 4, 13, 3, 7, 15, 14, 5, 6, 2, 10905 4, 0, 5, 9, 7, 12, 2, 10, 14, 1, 3, 8, 11, 6, 15, 13]); 10906 var _zr = WordArray.create([ 10907 5, 14, 7, 0, 9, 2, 11, 4, 13, 6, 15, 8, 1, 10, 3, 12, 10908 6, 11, 3, 7, 0, 13, 5, 10, 14, 15, 8, 12, 4, 9, 1, 2, 10909 15, 5, 1, 3, 7, 14, 6, 9, 11, 8, 12, 2, 10, 0, 4, 13, 10910 8, 6, 4, 1, 3, 11, 15, 0, 5, 12, 2, 13, 9, 7, 10, 14, 10911 12, 15, 10, 4, 1, 5, 8, 7, 6, 2, 13, 14, 0, 3, 9, 11]); 10912 var _sl = WordArray.create([ 10913 11, 14, 15, 12, 5, 8, 7, 9, 11, 13, 14, 15, 6, 7, 9, 8, 10914 7, 6, 8, 13, 11, 9, 7, 15, 7, 12, 15, 9, 11, 7, 13, 12, 10915 11, 13, 6, 7, 14, 9, 13, 15, 14, 8, 13, 6, 5, 12, 7, 5, 10916 11, 12, 14, 15, 14, 15, 9, 8, 9, 14, 5, 6, 8, 6, 5, 12, 10917 9, 15, 5, 11, 6, 8, 13, 12, 5, 12, 13, 14, 11, 8, 5, 6 ]); 10918 var _sr = WordArray.create([ 10919 8, 9, 9, 11, 13, 15, 15, 5, 7, 7, 8, 11, 14, 14, 12, 6, 10920 9, 13, 15, 7, 12, 8, 9, 11, 7, 7, 12, 7, 6, 15, 13, 11, 10921 9, 7, 15, 11, 8, 6, 6, 14, 12, 13, 5, 14, 13, 13, 7, 5, 10922 15, 5, 8, 11, 14, 14, 6, 14, 6, 9, 12, 9, 12, 5, 15, 8, 10923 8, 5, 12, 9, 12, 5, 14, 6, 8, 13, 6, 5, 15, 13, 11, 11 ]); 10924 10925 var _hl = WordArray.create([ 0x00000000, 0x5A827999, 0x6ED9EBA1, 0x8F1BBCDC, 0xA953FD4E]); 10926 var _hr = WordArray.create([ 0x50A28BE6, 0x5C4DD124, 0x6D703EF3, 0x7A6D76E9, 0x00000000]); 10927 10928 /** 10929 * RIPEMD160 hash algorithm. 10930 */ 10931 var RIPEMD160 = C_algo.RIPEMD160 = Hasher.extend({ 10932 _doReset: function () { 10933 this._hash = WordArray.create([0x67452301, 0xEFCDAB89, 0x98BADCFE, 0x10325476, 0xC3D2E1F0]); 10934 }, 10935 10936 _doProcessBlock: function (M, offset) { 10937 10938 // Swap endian 10939 for (var i = 0; i < 16; i++) { 10940 // Shortcuts 10941 var offset_i = offset + i; 10942 var M_offset_i = M[offset_i]; 10943 10944 // Swap 10945 M[offset_i] = ( 10946 (((M_offset_i << 8) | (M_offset_i >>> 24)) & 0x00ff00ff) | 10947 (((M_offset_i << 24) | (M_offset_i >>> 8)) & 0xff00ff00) 10948 ); 10949 } 10950 // Shortcut 10951 var H = this._hash.words; 10952 var hl = _hl.words; 10953 var hr = _hr.words; 10954 var zl = _zl.words; 10955 var zr = _zr.words; 10956 var sl = _sl.words; 10957 var sr = _sr.words; 10958 10959 // Working variables 10960 var al, bl, cl, dl, el; 10961 var ar, br, cr, dr, er; 10962 10963 ar = al = H[0]; 10964 br = bl = H[1]; 10965 cr = cl = H[2]; 10966 dr = dl = H[3]; 10967 er = el = H[4]; 10968 // Computation 10969 var t; 10970 for (var i = 0; i < 80; i += 1) { 10971 t = (al + M[offset+zl[i]])|0; 10972 if (i<16){ 10973 t += f1(bl,cl,dl) + hl[0]; 10974 } else if (i<32) { 10975 t += f2(bl,cl,dl) + hl[1]; 10976 } else if (i<48) { 10977 t += f3(bl,cl,dl) + hl[2]; 10978 } else if (i<64) { 10979 t += f4(bl,cl,dl) + hl[3]; 10980 } else {// if (i<80) { 10981 t += f5(bl,cl,dl) + hl[4]; 10982 } 10983 t = t|0; 10984 t = rotl(t,sl[i]); 10985 t = (t+el)|0; 10986 al = el; 10987 el = dl; 10988 dl = rotl(cl, 10); 10989 cl = bl; 10990 bl = t; 10991 10992 t = (ar + M[offset+zr[i]])|0; 10993 if (i<16){ 10994 t += f5(br,cr,dr) + hr[0]; 10995 } else if (i<32) { 10996 t += f4(br,cr,dr) + hr[1]; 10997 } else if (i<48) { 10998 t += f3(br,cr,dr) + hr[2]; 10999 } else if (i<64) { 11000 t += f2(br,cr,dr) + hr[3]; 11001 } else {// if (i<80) { 11002 t += f1(br,cr,dr) + hr[4]; 11003 } 11004 t = t|0; 11005 t = rotl(t,sr[i]) ; 11006 t = (t+er)|0; 11007 ar = er; 11008 er = dr; 11009 dr = rotl(cr, 10); 11010 cr = br; 11011 br = t; 11012 } 11013 // Intermediate hash value 11014 t = (H[1] + cl + dr)|0; 11015 H[1] = (H[2] + dl + er)|0; 11016 H[2] = (H[3] + el + ar)|0; 11017 H[3] = (H[4] + al + br)|0; 11018 H[4] = (H[0] + bl + cr)|0; 11019 H[0] = t; 11020 }, 11021 11022 _doFinalize: function () { 11023 // Shortcuts 11024 var data = this._data; 11025 var dataWords = data.words; 11026 11027 var nBitsTotal = this._nDataBytes * 8; 11028 var nBitsLeft = data.sigBytes * 8; 11029 11030 // Add padding 11031 dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32); 11032 dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = ( 11033 (((nBitsTotal << 8) | (nBitsTotal >>> 24)) & 0x00ff00ff) | 11034 (((nBitsTotal << 24) | (nBitsTotal >>> 8)) & 0xff00ff00) 11035 ); 11036 data.sigBytes = (dataWords.length + 1) * 4; 11037 11038 // Hash final blocks 11039 this._process(); 11040 11041 // Shortcuts 11042 var hash = this._hash; 11043 var H = hash.words; 11044 11045 // Swap endian 11046 for (var i = 0; i < 5; i++) { 11047 // Shortcut 11048 var H_i = H[i]; 11049 11050 // Swap 11051 H[i] = (((H_i << 8) | (H_i >>> 24)) & 0x00ff00ff) | 11052 (((H_i << 24) | (H_i >>> 8)) & 0xff00ff00); 11053 } 11054 11055 // Return final computed hash 11056 return hash; 11057 }, 11058 11059 clone: function () { 11060 var clone = Hasher.clone.call(this); 11061 clone._hash = this._hash.clone(); 11062 11063 return clone; 11064 } 11065 }); 11066 11067 11068 function f1(x, y, z) { 11069 return ((x) ^ (y) ^ (z)); 11070 11071 } 11072 11073 function f2(x, y, z) { 11074 return (((x)&(y)) | ((~x)&(z))); 11075 } 11076 11077 function f3(x, y, z) { 11078 return (((x) | (~(y))) ^ (z)); 11079 } 11080 11081 function f4(x, y, z) { 11082 return (((x) & (z)) | ((y)&(~(z)))); 11083 } 11084 11085 function f5(x, y, z) { 11086 return ((x) ^ ((y) |(~(z)))); 11087 11088 } 11089 11090 function rotl(x,n) { 11091 return (x<<n) | (x>>>(32-n)); 11092 } 11093 11094 11095 /** 11096 * Shortcut function to the hasher's object interface. 11097 * 11098 * @param {WordArray|string} message The message to hash. 11099 * 11100 * @return {WordArray} The hash. 11101 * 11102 * @static 11103 * 11104 * @example 11105 * 11106 * var hash = CryptoJS.RIPEMD160('message'); 11107 * var hash = CryptoJS.RIPEMD160(wordArray); 11108 */ 11109 C.RIPEMD160 = Hasher._createHelper(RIPEMD160); 11110 11111 /** 11112 * Shortcut function to the HMAC's object interface. 11113 * 11114 * @param {WordArray|string} message The message to hash. 11115 * @param {WordArray|string} key The secret key. 11116 * 11117 * @return {WordArray} The HMAC. 11118 * 11119 * @static 11120 * 11121 * @example 11122 * 11123 * var hmac = CryptoJS.HmacRIPEMD160(message, key); 11124 */ 11125 C.HmacRIPEMD160 = Hasher._createHmacHelper(RIPEMD160); 11126 }(Math)); 11127 11128 11129 return CryptoJS.RIPEMD160; 11130 11131 })); 11132 },{"./core":53}],77:[function(require,module,exports){ 11133 ;(function (root, factory) { 11134 if (typeof exports === "object") { 11135 // CommonJS 11136 module.exports = exports = factory(require("./core")); 11137 } 11138 else if (typeof define === "function" && define.amd) { 11139 // AMD 11140 define(["./core"], factory); 11141 } 11142 else { 11143 // Global (browser) 11144 factory(root.CryptoJS); 11145 } 11146 }(this, function (CryptoJS) { 11147 11148 (function () { 11149 // Shortcuts 11150 var C = CryptoJS; 11151 var C_lib = C.lib; 11152 var WordArray = C_lib.WordArray; 11153 var Hasher = C_lib.Hasher; 11154 var C_algo = C.algo; 11155 11156 // Reusable object 11157 var W = []; 11158 11159 /** 11160 * SHA-1 hash algorithm. 11161 */ 11162 var SHA1 = C_algo.SHA1 = Hasher.extend({ 11163 _doReset: function () { 11164 this._hash = new WordArray.init([ 11165 0x67452301, 0xefcdab89, 11166 0x98badcfe, 0x10325476, 11167 0xc3d2e1f0 11168 ]); 11169 }, 11170 11171 _doProcessBlock: function (M, offset) { 11172 // Shortcut 11173 var H = this._hash.words; 11174 11175 // Working variables 11176 var a = H[0]; 11177 var b = H[1]; 11178 var c = H[2]; 11179 var d = H[3]; 11180 var e = H[4]; 11181 11182 // Computation 11183 for (var i = 0; i < 80; i++) { 11184 if (i < 16) { 11185 W[i] = M[offset + i] | 0; 11186 } else { 11187 var n = W[i - 3] ^ W[i - 8] ^ W[i - 14] ^ W[i - 16]; 11188 W[i] = (n << 1) | (n >>> 31); 11189 } 11190 11191 var t = ((a << 5) | (a >>> 27)) + e + W[i]; 11192 if (i < 20) { 11193 t += ((b & c) | (~b & d)) + 0x5a827999; 11194 } else if (i < 40) { 11195 t += (b ^ c ^ d) + 0x6ed9eba1; 11196 } else if (i < 60) { 11197 t += ((b & c) | (b & d) | (c & d)) - 0x70e44324; 11198 } else /* if (i < 80) */ { 11199 t += (b ^ c ^ d) - 0x359d3e2a; 11200 } 11201 11202 e = d; 11203 d = c; 11204 c = (b << 30) | (b >>> 2); 11205 b = a; 11206 a = t; 11207 } 11208 11209 // Intermediate hash value 11210 H[0] = (H[0] + a) | 0; 11211 H[1] = (H[1] + b) | 0; 11212 H[2] = (H[2] + c) | 0; 11213 H[3] = (H[3] + d) | 0; 11214 H[4] = (H[4] + e) | 0; 11215 }, 11216 11217 _doFinalize: function () { 11218 // Shortcuts 11219 var data = this._data; 11220 var dataWords = data.words; 11221 11222 var nBitsTotal = this._nDataBytes * 8; 11223 var nBitsLeft = data.sigBytes * 8; 11224 11225 // Add padding 11226 dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32); 11227 dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = Math.floor(nBitsTotal / 0x100000000); 11228 dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 15] = nBitsTotal; 11229 data.sigBytes = dataWords.length * 4; 11230 11231 // Hash final blocks 11232 this._process(); 11233 11234 // Return final computed hash 11235 return this._hash; 11236 }, 11237 11238 clone: function () { 11239 var clone = Hasher.clone.call(this); 11240 clone._hash = this._hash.clone(); 11241 11242 return clone; 11243 } 11244 }); 11245 11246 /** 11247 * Shortcut function to the hasher's object interface. 11248 * 11249 * @param {WordArray|string} message The message to hash. 11250 * 11251 * @return {WordArray} The hash. 11252 * 11253 * @static 11254 * 11255 * @example 11256 * 11257 * var hash = CryptoJS.SHA1('message'); 11258 * var hash = CryptoJS.SHA1(wordArray); 11259 */ 11260 C.SHA1 = Hasher._createHelper(SHA1); 11261 11262 /** 11263 * Shortcut function to the HMAC's object interface. 11264 * 11265 * @param {WordArray|string} message The message to hash. 11266 * @param {WordArray|string} key The secret key. 11267 * 11268 * @return {WordArray} The HMAC. 11269 * 11270 * @static 11271 * 11272 * @example 11273 * 11274 * var hmac = CryptoJS.HmacSHA1(message, key); 11275 */ 11276 C.HmacSHA1 = Hasher._createHmacHelper(SHA1); 11277 }()); 11278 11279 11280 return CryptoJS.SHA1; 11281 11282 })); 11283 },{"./core":53}],78:[function(require,module,exports){ 11284 ;(function (root, factory, undef) { 11285 if (typeof exports === "object") { 11286 // CommonJS 11287 module.exports = exports = factory(require("./core"), require("./sha256")); 11288 } 11289 else if (typeof define === "function" && define.amd) { 11290 // AMD 11291 define(["./core", "./sha256"], factory); 11292 } 11293 else { 11294 // Global (browser) 11295 factory(root.CryptoJS); 11296 } 11297 }(this, function (CryptoJS) { 11298 11299 (function () { 11300 // Shortcuts 11301 var C = CryptoJS; 11302 var C_lib = C.lib; 11303 var WordArray = C_lib.WordArray; 11304 var C_algo = C.algo; 11305 var SHA256 = C_algo.SHA256; 11306 11307 /** 11308 * SHA-224 hash algorithm. 11309 */ 11310 var SHA224 = C_algo.SHA224 = SHA256.extend({ 11311 _doReset: function () { 11312 this._hash = new WordArray.init([ 11313 0xc1059ed8, 0x367cd507, 0x3070dd17, 0xf70e5939, 11314 0xffc00b31, 0x68581511, 0x64f98fa7, 0xbefa4fa4 11315 ]); 11316 }, 11317 11318 _doFinalize: function () { 11319 var hash = SHA256._doFinalize.call(this); 11320 11321 hash.sigBytes -= 4; 11322 11323 return hash; 11324 } 11325 }); 11326 11327 /** 11328 * Shortcut function to the hasher's object interface. 11329 * 11330 * @param {WordArray|string} message The message to hash. 11331 * 11332 * @return {WordArray} The hash. 11333 * 11334 * @static 11335 * 11336 * @example 11337 * 11338 * var hash = CryptoJS.SHA224('message'); 11339 * var hash = CryptoJS.SHA224(wordArray); 11340 */ 11341 C.SHA224 = SHA256._createHelper(SHA224); 11342 11343 /** 11344 * Shortcut function to the HMAC's object interface. 11345 * 11346 * @param {WordArray|string} message The message to hash. 11347 * @param {WordArray|string} key The secret key. 11348 * 11349 * @return {WordArray} The HMAC. 11350 * 11351 * @static 11352 * 11353 * @example 11354 * 11355 * var hmac = CryptoJS.HmacSHA224(message, key); 11356 */ 11357 C.HmacSHA224 = SHA256._createHmacHelper(SHA224); 11358 }()); 11359 11360 11361 return CryptoJS.SHA224; 11362 11363 })); 11364 },{"./core":53,"./sha256":79}],79:[function(require,module,exports){ 11365 ;(function (root, factory) { 11366 if (typeof exports === "object") { 11367 // CommonJS 11368 module.exports = exports = factory(require("./core")); 11369 } 11370 else if (typeof define === "function" && define.amd) { 11371 // AMD 11372 define(["./core"], factory); 11373 } 11374 else { 11375 // Global (browser) 11376 factory(root.CryptoJS); 11377 } 11378 }(this, function (CryptoJS) { 11379 11380 (function (Math) { 11381 // Shortcuts 11382 var C = CryptoJS; 11383 var C_lib = C.lib; 11384 var WordArray = C_lib.WordArray; 11385 var Hasher = C_lib.Hasher; 11386 var C_algo = C.algo; 11387 11388 // Initialization and round constants tables 11389 var H = []; 11390 var K = []; 11391 11392 // Compute constants 11393 (function () { 11394 function isPrime(n) { 11395 var sqrtN = Math.sqrt(n); 11396 for (var factor = 2; factor <= sqrtN; factor++) { 11397 if (!(n % factor)) { 11398 return false; 11399 } 11400 } 11401 11402 return true; 11403 } 11404 11405 function getFractionalBits(n) { 11406 return ((n - (n | 0)) * 0x100000000) | 0; 11407 } 11408 11409 var n = 2; 11410 var nPrime = 0; 11411 while (nPrime < 64) { 11412 if (isPrime(n)) { 11413 if (nPrime < 8) { 11414 H[nPrime] = getFractionalBits(Math.pow(n, 1 / 2)); 11415 } 11416 K[nPrime] = getFractionalBits(Math.pow(n, 1 / 3)); 11417 11418 nPrime++; 11419 } 11420 11421 n++; 11422 } 11423 }()); 11424 11425 // Reusable object 11426 var W = []; 11427 11428 /** 11429 * SHA-256 hash algorithm. 11430 */ 11431 var SHA256 = C_algo.SHA256 = Hasher.extend({ 11432 _doReset: function () { 11433 this._hash = new WordArray.init(H.slice(0)); 11434 }, 11435 11436 _doProcessBlock: function (M, offset) { 11437 // Shortcut 11438 var H = this._hash.words; 11439 11440 // Working variables 11441 var a = H[0]; 11442 var b = H[1]; 11443 var c = H[2]; 11444 var d = H[3]; 11445 var e = H[4]; 11446 var f = H[5]; 11447 var g = H[6]; 11448 var h = H[7]; 11449 11450 // Computation 11451 for (var i = 0; i < 64; i++) { 11452 if (i < 16) { 11453 W[i] = M[offset + i] | 0; 11454 } else { 11455 var gamma0x = W[i - 15]; 11456 var gamma0 = ((gamma0x << 25) | (gamma0x >>> 7)) ^ 11457 ((gamma0x << 14) | (gamma0x >>> 18)) ^ 11458 (gamma0x >>> 3); 11459 11460 var gamma1x = W[i - 2]; 11461 var gamma1 = ((gamma1x << 15) | (gamma1x >>> 17)) ^ 11462 ((gamma1x << 13) | (gamma1x >>> 19)) ^ 11463 (gamma1x >>> 10); 11464 11465 W[i] = gamma0 + W[i - 7] + gamma1 + W[i - 16]; 11466 } 11467 11468 var ch = (e & f) ^ (~e & g); 11469 var maj = (a & b) ^ (a & c) ^ (b & c); 11470 11471 var sigma0 = ((a << 30) | (a >>> 2)) ^ ((a << 19) | (a >>> 13)) ^ ((a << 10) | (a >>> 22)); 11472 var sigma1 = ((e << 26) | (e >>> 6)) ^ ((e << 21) | (e >>> 11)) ^ ((e << 7) | (e >>> 25)); 11473 11474 var t1 = h + sigma1 + ch + K[i] + W[i]; 11475 var t2 = sigma0 + maj; 11476 11477 h = g; 11478 g = f; 11479 f = e; 11480 e = (d + t1) | 0; 11481 d = c; 11482 c = b; 11483 b = a; 11484 a = (t1 + t2) | 0; 11485 } 11486 11487 // Intermediate hash value 11488 H[0] = (H[0] + a) | 0; 11489 H[1] = (H[1] + b) | 0; 11490 H[2] = (H[2] + c) | 0; 11491 H[3] = (H[3] + d) | 0; 11492 H[4] = (H[4] + e) | 0; 11493 H[5] = (H[5] + f) | 0; 11494 H[6] = (H[6] + g) | 0; 11495 H[7] = (H[7] + h) | 0; 11496 }, 11497 11498 _doFinalize: function () { 11499 // Shortcuts 11500 var data = this._data; 11501 var dataWords = data.words; 11502 11503 var nBitsTotal = this._nDataBytes * 8; 11504 var nBitsLeft = data.sigBytes * 8; 11505 11506 // Add padding 11507 dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32); 11508 dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = Math.floor(nBitsTotal / 0x100000000); 11509 dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 15] = nBitsTotal; 11510 data.sigBytes = dataWords.length * 4; 11511 11512 // Hash final blocks 11513 this._process(); 11514 11515 // Return final computed hash 11516 return this._hash; 11517 }, 11518 11519 clone: function () { 11520 var clone = Hasher.clone.call(this); 11521 clone._hash = this._hash.clone(); 11522 11523 return clone; 11524 } 11525 }); 11526 11527 /** 11528 * Shortcut function to the hasher's object interface. 11529 * 11530 * @param {WordArray|string} message The message to hash. 11531 * 11532 * @return {WordArray} The hash. 11533 * 11534 * @static 11535 * 11536 * @example 11537 * 11538 * var hash = CryptoJS.SHA256('message'); 11539 * var hash = CryptoJS.SHA256(wordArray); 11540 */ 11541 C.SHA256 = Hasher._createHelper(SHA256); 11542 11543 /** 11544 * Shortcut function to the HMAC's object interface. 11545 * 11546 * @param {WordArray|string} message The message to hash. 11547 * @param {WordArray|string} key The secret key. 11548 * 11549 * @return {WordArray} The HMAC. 11550 * 11551 * @static 11552 * 11553 * @example 11554 * 11555 * var hmac = CryptoJS.HmacSHA256(message, key); 11556 */ 11557 C.HmacSHA256 = Hasher._createHmacHelper(SHA256); 11558 }(Math)); 11559 11560 11561 return CryptoJS.SHA256; 11562 11563 })); 11564 },{"./core":53}],80:[function(require,module,exports){ 11565 ;(function (root, factory, undef) { 11566 if (typeof exports === "object") { 11567 // CommonJS 11568 module.exports = exports = factory(require("./core"), require("./x64-core")); 11569 } 11570 else if (typeof define === "function" && define.amd) { 11571 // AMD 11572 define(["./core", "./x64-core"], factory); 11573 } 11574 else { 11575 // Global (browser) 11576 factory(root.CryptoJS); 11577 } 11578 }(this, function (CryptoJS) { 11579 11580 (function (Math) { 11581 // Shortcuts 11582 var C = CryptoJS; 11583 var C_lib = C.lib; 11584 var WordArray = C_lib.WordArray; 11585 var Hasher = C_lib.Hasher; 11586 var C_x64 = C.x64; 11587 var X64Word = C_x64.Word; 11588 var C_algo = C.algo; 11589 11590 // Constants tables 11591 var RHO_OFFSETS = []; 11592 var PI_INDEXES = []; 11593 var ROUND_CONSTANTS = []; 11594 11595 // Compute Constants 11596 (function () { 11597 // Compute rho offset constants 11598 var x = 1, y = 0; 11599 for (var t = 0; t < 24; t++) { 11600 RHO_OFFSETS[x + 5 * y] = ((t + 1) * (t + 2) / 2) % 64; 11601 11602 var newX = y % 5; 11603 var newY = (2 * x + 3 * y) % 5; 11604 x = newX; 11605 y = newY; 11606 } 11607 11608 // Compute pi index constants 11609 for (var x = 0; x < 5; x++) { 11610 for (var y = 0; y < 5; y++) { 11611 PI_INDEXES[x + 5 * y] = y + ((2 * x + 3 * y) % 5) * 5; 11612 } 11613 } 11614 11615 // Compute round constants 11616 var LFSR = 0x01; 11617 for (var i = 0; i < 24; i++) { 11618 var roundConstantMsw = 0; 11619 var roundConstantLsw = 0; 11620 11621 for (var j = 0; j < 7; j++) { 11622 if (LFSR & 0x01) { 11623 var bitPosition = (1 << j) - 1; 11624 if (bitPosition < 32) { 11625 roundConstantLsw ^= 1 << bitPosition; 11626 } else /* if (bitPosition >= 32) */ { 11627 roundConstantMsw ^= 1 << (bitPosition - 32); 11628 } 11629 } 11630 11631 // Compute next LFSR 11632 if (LFSR & 0x80) { 11633 // Primitive polynomial over GF(2): x^8 + x^6 + x^5 + x^4 + 1 11634 LFSR = (LFSR << 1) ^ 0x71; 11635 } else { 11636 LFSR <<= 1; 11637 } 11638 } 11639 11640 ROUND_CONSTANTS[i] = X64Word.create(roundConstantMsw, roundConstantLsw); 11641 } 11642 }()); 11643 11644 // Reusable objects for temporary values 11645 var T = []; 11646 (function () { 11647 for (var i = 0; i < 25; i++) { 11648 T[i] = X64Word.create(); 11649 } 11650 }()); 11651 11652 /** 11653 * SHA-3 hash algorithm. 11654 */ 11655 var SHA3 = C_algo.SHA3 = Hasher.extend({ 11656 /** 11657 * Configuration options. 11658 * 11659 * @property {number} outputLength 11660 * The desired number of bits in the output hash. 11661 * Only values permitted are: 224, 256, 384, 512. 11662 * Default: 512 11663 */ 11664 cfg: Hasher.cfg.extend({ 11665 outputLength: 512 11666 }), 11667 11668 _doReset: function () { 11669 var state = this._state = [] 11670 for (var i = 0; i < 25; i++) { 11671 state[i] = new X64Word.init(); 11672 } 11673 11674 this.blockSize = (1600 - 2 * this.cfg.outputLength) / 32; 11675 }, 11676 11677 _doProcessBlock: function (M, offset) { 11678 // Shortcuts 11679 var state = this._state; 11680 var nBlockSizeLanes = this.blockSize / 2; 11681 11682 // Absorb 11683 for (var i = 0; i < nBlockSizeLanes; i++) { 11684 // Shortcuts 11685 var M2i = M[offset + 2 * i]; 11686 var M2i1 = M[offset + 2 * i + 1]; 11687 11688 // Swap endian 11689 M2i = ( 11690 (((M2i << 8) | (M2i >>> 24)) & 0x00ff00ff) | 11691 (((M2i << 24) | (M2i >>> 8)) & 0xff00ff00) 11692 ); 11693 M2i1 = ( 11694 (((M2i1 << 8) | (M2i1 >>> 24)) & 0x00ff00ff) | 11695 (((M2i1 << 24) | (M2i1 >>> 8)) & 0xff00ff00) 11696 ); 11697 11698 // Absorb message into state 11699 var lane = state[i]; 11700 lane.high ^= M2i1; 11701 lane.low ^= M2i; 11702 } 11703 11704 // Rounds 11705 for (var round = 0; round < 24; round++) { 11706 // Theta 11707 for (var x = 0; x < 5; x++) { 11708 // Mix column lanes 11709 var tMsw = 0, tLsw = 0; 11710 for (var y = 0; y < 5; y++) { 11711 var lane = state[x + 5 * y]; 11712 tMsw ^= lane.high; 11713 tLsw ^= lane.low; 11714 } 11715 11716 // Temporary values 11717 var Tx = T[x]; 11718 Tx.high = tMsw; 11719 Tx.low = tLsw; 11720 } 11721 for (var x = 0; x < 5; x++) { 11722 // Shortcuts 11723 var Tx4 = T[(x + 4) % 5]; 11724 var Tx1 = T[(x + 1) % 5]; 11725 var Tx1Msw = Tx1.high; 11726 var Tx1Lsw = Tx1.low; 11727 11728 // Mix surrounding columns 11729 var tMsw = Tx4.high ^ ((Tx1Msw << 1) | (Tx1Lsw >>> 31)); 11730 var tLsw = Tx4.low ^ ((Tx1Lsw << 1) | (Tx1Msw >>> 31)); 11731 for (var y = 0; y < 5; y++) { 11732 var lane = state[x + 5 * y]; 11733 lane.high ^= tMsw; 11734 lane.low ^= tLsw; 11735 } 11736 } 11737 11738 // Rho Pi 11739 for (var laneIndex = 1; laneIndex < 25; laneIndex++) { 11740 // Shortcuts 11741 var lane = state[laneIndex]; 11742 var laneMsw = lane.high; 11743 var laneLsw = lane.low; 11744 var rhoOffset = RHO_OFFSETS[laneIndex]; 11745 11746 // Rotate lanes 11747 if (rhoOffset < 32) { 11748 var tMsw = (laneMsw << rhoOffset) | (laneLsw >>> (32 - rhoOffset)); 11749 var tLsw = (laneLsw << rhoOffset) | (laneMsw >>> (32 - rhoOffset)); 11750 } else /* if (rhoOffset >= 32) */ { 11751 var tMsw = (laneLsw << (rhoOffset - 32)) | (laneMsw >>> (64 - rhoOffset)); 11752 var tLsw = (laneMsw << (rhoOffset - 32)) | (laneLsw >>> (64 - rhoOffset)); 11753 } 11754 11755 // Transpose lanes 11756 var TPiLane = T[PI_INDEXES[laneIndex]]; 11757 TPiLane.high = tMsw; 11758 TPiLane.low = tLsw; 11759 } 11760 11761 // Rho pi at x = y = 0 11762 var T0 = T[0]; 11763 var state0 = state[0]; 11764 T0.high = state0.high; 11765 T0.low = state0.low; 11766 11767 // Chi 11768 for (var x = 0; x < 5; x++) { 11769 for (var y = 0; y < 5; y++) { 11770 // Shortcuts 11771 var laneIndex = x + 5 * y; 11772 var lane = state[laneIndex]; 11773 var TLane = T[laneIndex]; 11774 var Tx1Lane = T[((x + 1) % 5) + 5 * y]; 11775 var Tx2Lane = T[((x + 2) % 5) + 5 * y]; 11776 11777 // Mix rows 11778 lane.high = TLane.high ^ (~Tx1Lane.high & Tx2Lane.high); 11779 lane.low = TLane.low ^ (~Tx1Lane.low & Tx2Lane.low); 11780 } 11781 } 11782 11783 // Iota 11784 var lane = state[0]; 11785 var roundConstant = ROUND_CONSTANTS[round]; 11786 lane.high ^= roundConstant.high; 11787 lane.low ^= roundConstant.low;; 11788 } 11789 }, 11790 11791 _doFinalize: function () { 11792 // Shortcuts 11793 var data = this._data; 11794 var dataWords = data.words; 11795 var nBitsTotal = this._nDataBytes * 8; 11796 var nBitsLeft = data.sigBytes * 8; 11797 var blockSizeBits = this.blockSize * 32; 11798 11799 // Add padding 11800 dataWords[nBitsLeft >>> 5] |= 0x1 << (24 - nBitsLeft % 32); 11801 dataWords[((Math.ceil((nBitsLeft + 1) / blockSizeBits) * blockSizeBits) >>> 5) - 1] |= 0x80; 11802 data.sigBytes = dataWords.length * 4; 11803 11804 // Hash final blocks 11805 this._process(); 11806 11807 // Shortcuts 11808 var state = this._state; 11809 var outputLengthBytes = this.cfg.outputLength / 8; 11810 var outputLengthLanes = outputLengthBytes / 8; 11811 11812 // Squeeze 11813 var hashWords = []; 11814 for (var i = 0; i < outputLengthLanes; i++) { 11815 // Shortcuts 11816 var lane = state[i]; 11817 var laneMsw = lane.high; 11818 var laneLsw = lane.low; 11819 11820 // Swap endian 11821 laneMsw = ( 11822 (((laneMsw << 8) | (laneMsw >>> 24)) & 0x00ff00ff) | 11823 (((laneMsw << 24) | (laneMsw >>> 8)) & 0xff00ff00) 11824 ); 11825 laneLsw = ( 11826 (((laneLsw << 8) | (laneLsw >>> 24)) & 0x00ff00ff) | 11827 (((laneLsw << 24) | (laneLsw >>> 8)) & 0xff00ff00) 11828 ); 11829 11830 // Squeeze state to retrieve hash 11831 hashWords.push(laneLsw); 11832 hashWords.push(laneMsw); 11833 } 11834 11835 // Return final computed hash 11836 return new WordArray.init(hashWords, outputLengthBytes); 11837 }, 11838 11839 clone: function () { 11840 var clone = Hasher.clone.call(this); 11841 11842 var state = clone._state = this._state.slice(0); 11843 for (var i = 0; i < 25; i++) { 11844 state[i] = state[i].clone(); 11845 } 11846 11847 return clone; 11848 } 11849 }); 11850 11851 /** 11852 * Shortcut function to the hasher's object interface. 11853 * 11854 * @param {WordArray|string} message The message to hash. 11855 * 11856 * @return {WordArray} The hash. 11857 * 11858 * @static 11859 * 11860 * @example 11861 * 11862 * var hash = CryptoJS.SHA3('message'); 11863 * var hash = CryptoJS.SHA3(wordArray); 11864 */ 11865 C.SHA3 = Hasher._createHelper(SHA3); 11866 11867 /** 11868 * Shortcut function to the HMAC's object interface. 11869 * 11870 * @param {WordArray|string} message The message to hash. 11871 * @param {WordArray|string} key The secret key. 11872 * 11873 * @return {WordArray} The HMAC. 11874 * 11875 * @static 11876 * 11877 * @example 11878 * 11879 * var hmac = CryptoJS.HmacSHA3(message, key); 11880 */ 11881 C.HmacSHA3 = Hasher._createHmacHelper(SHA3); 11882 }(Math)); 11883 11884 11885 return CryptoJS.SHA3; 11886 11887 })); 11888 },{"./core":53,"./x64-core":84}],81:[function(require,module,exports){ 11889 ;(function (root, factory, undef) { 11890 if (typeof exports === "object") { 11891 // CommonJS 11892 module.exports = exports = factory(require("./core"), require("./x64-core"), require("./sha512")); 11893 } 11894 else if (typeof define === "function" && define.amd) { 11895 // AMD 11896 define(["./core", "./x64-core", "./sha512"], factory); 11897 } 11898 else { 11899 // Global (browser) 11900 factory(root.CryptoJS); 11901 } 11902 }(this, function (CryptoJS) { 11903 11904 (function () { 11905 // Shortcuts 11906 var C = CryptoJS; 11907 var C_x64 = C.x64; 11908 var X64Word = C_x64.Word; 11909 var X64WordArray = C_x64.WordArray; 11910 var C_algo = C.algo; 11911 var SHA512 = C_algo.SHA512; 11912 11913 /** 11914 * SHA-384 hash algorithm. 11915 */ 11916 var SHA384 = C_algo.SHA384 = SHA512.extend({ 11917 _doReset: function () { 11918 this._hash = new X64WordArray.init([ 11919 new X64Word.init(0xcbbb9d5d, 0xc1059ed8), new X64Word.init(0x629a292a, 0x367cd507), 11920 new X64Word.init(0x9159015a, 0x3070dd17), new X64Word.init(0x152fecd8, 0xf70e5939), 11921 new X64Word.init(0x67332667, 0xffc00b31), new X64Word.init(0x8eb44a87, 0x68581511), 11922 new X64Word.init(0xdb0c2e0d, 0x64f98fa7), new X64Word.init(0x47b5481d, 0xbefa4fa4) 11923 ]); 11924 }, 11925 11926 _doFinalize: function () { 11927 var hash = SHA512._doFinalize.call(this); 11928 11929 hash.sigBytes -= 16; 11930 11931 return hash; 11932 } 11933 }); 11934 11935 /** 11936 * Shortcut function to the hasher's object interface. 11937 * 11938 * @param {WordArray|string} message The message to hash. 11939 * 11940 * @return {WordArray} The hash. 11941 * 11942 * @static 11943 * 11944 * @example 11945 * 11946 * var hash = CryptoJS.SHA384('message'); 11947 * var hash = CryptoJS.SHA384(wordArray); 11948 */ 11949 C.SHA384 = SHA512._createHelper(SHA384); 11950 11951 /** 11952 * Shortcut function to the HMAC's object interface. 11953 * 11954 * @param {WordArray|string} message The message to hash. 11955 * @param {WordArray|string} key The secret key. 11956 * 11957 * @return {WordArray} The HMAC. 11958 * 11959 * @static 11960 * 11961 * @example 11962 * 11963 * var hmac = CryptoJS.HmacSHA384(message, key); 11964 */ 11965 C.HmacSHA384 = SHA512._createHmacHelper(SHA384); 11966 }()); 11967 11968 11969 return CryptoJS.SHA384; 11970 11971 })); 11972 },{"./core":53,"./sha512":82,"./x64-core":84}],82:[function(require,module,exports){ 11973 ;(function (root, factory, undef) { 11974 if (typeof exports === "object") { 11975 // CommonJS 11976 module.exports = exports = factory(require("./core"), require("./x64-core")); 11977 } 11978 else if (typeof define === "function" && define.amd) { 11979 // AMD 11980 define(["./core", "./x64-core"], factory); 11981 } 11982 else { 11983 // Global (browser) 11984 factory(root.CryptoJS); 11985 } 11986 }(this, function (CryptoJS) { 11987 11988 (function () { 11989 // Shortcuts 11990 var C = CryptoJS; 11991 var C_lib = C.lib; 11992 var Hasher = C_lib.Hasher; 11993 var C_x64 = C.x64; 11994 var X64Word = C_x64.Word; 11995 var X64WordArray = C_x64.WordArray; 11996 var C_algo = C.algo; 11997 11998 function X64Word_create() { 11999 return X64Word.create.apply(X64Word, arguments); 12000 } 12001 12002 // Constants 12003 var K = [ 12004 X64Word_create(0x428a2f98, 0xd728ae22), X64Word_create(0x71374491, 0x23ef65cd), 12005 X64Word_create(0xb5c0fbcf, 0xec4d3b2f), X64Word_create(0xe9b5dba5, 0x8189dbbc), 12006 X64Word_create(0x3956c25b, 0xf348b538), X64Word_create(0x59f111f1, 0xb605d019), 12007 X64Word_create(0x923f82a4, 0xaf194f9b), X64Word_create(0xab1c5ed5, 0xda6d8118), 12008 X64Word_create(0xd807aa98, 0xa3030242), X64Word_create(0x12835b01, 0x45706fbe), 12009 X64Word_create(0x243185be, 0x4ee4b28c), X64Word_create(0x550c7dc3, 0xd5ffb4e2), 12010 X64Word_create(0x72be5d74, 0xf27b896f), X64Word_create(0x80deb1fe, 0x3b1696b1), 12011 X64Word_create(0x9bdc06a7, 0x25c71235), X64Word_create(0xc19bf174, 0xcf692694), 12012 X64Word_create(0xe49b69c1, 0x9ef14ad2), X64Word_create(0xefbe4786, 0x384f25e3), 12013 X64Word_create(0x0fc19dc6, 0x8b8cd5b5), X64Word_create(0x240ca1cc, 0x77ac9c65), 12014 X64Word_create(0x2de92c6f, 0x592b0275), X64Word_create(0x4a7484aa, 0x6ea6e483), 12015 X64Word_create(0x5cb0a9dc, 0xbd41fbd4), X64Word_create(0x76f988da, 0x831153b5), 12016 X64Word_create(0x983e5152, 0xee66dfab), X64Word_create(0xa831c66d, 0x2db43210), 12017 X64Word_create(0xb00327c8, 0x98fb213f), X64Word_create(0xbf597fc7, 0xbeef0ee4), 12018 X64Word_create(0xc6e00bf3, 0x3da88fc2), X64Word_create(0xd5a79147, 0x930aa725), 12019 X64Word_create(0x06ca6351, 0xe003826f), X64Word_create(0x14292967, 0x0a0e6e70), 12020 X64Word_create(0x27b70a85, 0x46d22ffc), X64Word_create(0x2e1b2138, 0x5c26c926), 12021 X64Word_create(0x4d2c6dfc, 0x5ac42aed), X64Word_create(0x53380d13, 0x9d95b3df), 12022 X64Word_create(0x650a7354, 0x8baf63de), X64Word_create(0x766a0abb, 0x3c77b2a8), 12023 X64Word_create(0x81c2c92e, 0x47edaee6), X64Word_create(0x92722c85, 0x1482353b), 12024 X64Word_create(0xa2bfe8a1, 0x4cf10364), X64Word_create(0xa81a664b, 0xbc423001), 12025 X64Word_create(0xc24b8b70, 0xd0f89791), X64Word_create(0xc76c51a3, 0x0654be30), 12026 X64Word_create(0xd192e819, 0xd6ef5218), X64Word_create(0xd6990624, 0x5565a910), 12027 X64Word_create(0xf40e3585, 0x5771202a), X64Word_create(0x106aa070, 0x32bbd1b8), 12028 X64Word_create(0x19a4c116, 0xb8d2d0c8), X64Word_create(0x1e376c08, 0x5141ab53), 12029 X64Word_create(0x2748774c, 0xdf8eeb99), X64Word_create(0x34b0bcb5, 0xe19b48a8), 12030 X64Word_create(0x391c0cb3, 0xc5c95a63), X64Word_create(0x4ed8aa4a, 0xe3418acb), 12031 X64Word_create(0x5b9cca4f, 0x7763e373), X64Word_create(0x682e6ff3, 0xd6b2b8a3), 12032 X64Word_create(0x748f82ee, 0x5defb2fc), X64Word_create(0x78a5636f, 0x43172f60), 12033 X64Word_create(0x84c87814, 0xa1f0ab72), X64Word_create(0x8cc70208, 0x1a6439ec), 12034 X64Word_create(0x90befffa, 0x23631e28), X64Word_create(0xa4506ceb, 0xde82bde9), 12035 X64Word_create(0xbef9a3f7, 0xb2c67915), X64Word_create(0xc67178f2, 0xe372532b), 12036 X64Word_create(0xca273ece, 0xea26619c), X64Word_create(0xd186b8c7, 0x21c0c207), 12037 X64Word_create(0xeada7dd6, 0xcde0eb1e), X64Word_create(0xf57d4f7f, 0xee6ed178), 12038 X64Word_create(0x06f067aa, 0x72176fba), X64Word_create(0x0a637dc5, 0xa2c898a6), 12039 X64Word_create(0x113f9804, 0xbef90dae), X64Word_create(0x1b710b35, 0x131c471b), 12040 X64Word_create(0x28db77f5, 0x23047d84), X64Word_create(0x32caab7b, 0x40c72493), 12041 X64Word_create(0x3c9ebe0a, 0x15c9bebc), X64Word_create(0x431d67c4, 0x9c100d4c), 12042 X64Word_create(0x4cc5d4be, 0xcb3e42b6), X64Word_create(0x597f299c, 0xfc657e2a), 12043 X64Word_create(0x5fcb6fab, 0x3ad6faec), X64Word_create(0x6c44198c, 0x4a475817) 12044 ]; 12045 12046 // Reusable objects 12047 var W = []; 12048 (function () { 12049 for (var i = 0; i < 80; i++) { 12050 W[i] = X64Word_create(); 12051 } 12052 }()); 12053 12054 /** 12055 * SHA-512 hash algorithm. 12056 */ 12057 var SHA512 = C_algo.SHA512 = Hasher.extend({ 12058 _doReset: function () { 12059 this._hash = new X64WordArray.init([ 12060 new X64Word.init(0x6a09e667, 0xf3bcc908), new X64Word.init(0xbb67ae85, 0x84caa73b), 12061 new X64Word.init(0x3c6ef372, 0xfe94f82b), new X64Word.init(0xa54ff53a, 0x5f1d36f1), 12062 new X64Word.init(0x510e527f, 0xade682d1), new X64Word.init(0x9b05688c, 0x2b3e6c1f), 12063 new X64Word.init(0x1f83d9ab, 0xfb41bd6b), new X64Word.init(0x5be0cd19, 0x137e2179) 12064 ]); 12065 }, 12066 12067 _doProcessBlock: function (M, offset) { 12068 // Shortcuts 12069 var H = this._hash.words; 12070 12071 var H0 = H[0]; 12072 var H1 = H[1]; 12073 var H2 = H[2]; 12074 var H3 = H[3]; 12075 var H4 = H[4]; 12076 var H5 = H[5]; 12077 var H6 = H[6]; 12078 var H7 = H[7]; 12079 12080 var H0h = H0.high; 12081 var H0l = H0.low; 12082 var H1h = H1.high; 12083 var H1l = H1.low; 12084 var H2h = H2.high; 12085 var H2l = H2.low; 12086 var H3h = H3.high; 12087 var H3l = H3.low; 12088 var H4h = H4.high; 12089 var H4l = H4.low; 12090 var H5h = H5.high; 12091 var H5l = H5.low; 12092 var H6h = H6.high; 12093 var H6l = H6.low; 12094 var H7h = H7.high; 12095 var H7l = H7.low; 12096 12097 // Working variables 12098 var ah = H0h; 12099 var al = H0l; 12100 var bh = H1h; 12101 var bl = H1l; 12102 var ch = H2h; 12103 var cl = H2l; 12104 var dh = H3h; 12105 var dl = H3l; 12106 var eh = H4h; 12107 var el = H4l; 12108 var fh = H5h; 12109 var fl = H5l; 12110 var gh = H6h; 12111 var gl = H6l; 12112 var hh = H7h; 12113 var hl = H7l; 12114 12115 // Rounds 12116 for (var i = 0; i < 80; i++) { 12117 // Shortcut 12118 var Wi = W[i]; 12119 12120 // Extend message 12121 if (i < 16) { 12122 var Wih = Wi.high = M[offset + i * 2] | 0; 12123 var Wil = Wi.low = M[offset + i * 2 + 1] | 0; 12124 } else { 12125 // Gamma0 12126 var gamma0x = W[i - 15]; 12127 var gamma0xh = gamma0x.high; 12128 var gamma0xl = gamma0x.low; 12129 var gamma0h = ((gamma0xh >>> 1) | (gamma0xl << 31)) ^ ((gamma0xh >>> 8) | (gamma0xl << 24)) ^ (gamma0xh >>> 7); 12130 var gamma0l = ((gamma0xl >>> 1) | (gamma0xh << 31)) ^ ((gamma0xl >>> 8) | (gamma0xh << 24)) ^ ((gamma0xl >>> 7) | (gamma0xh << 25)); 12131 12132 // Gamma1 12133 var gamma1x = W[i - 2]; 12134 var gamma1xh = gamma1x.high; 12135 var gamma1xl = gamma1x.low; 12136 var gamma1h = ((gamma1xh >>> 19) | (gamma1xl << 13)) ^ ((gamma1xh << 3) | (gamma1xl >>> 29)) ^ (gamma1xh >>> 6); 12137 var gamma1l = ((gamma1xl >>> 19) | (gamma1xh << 13)) ^ ((gamma1xl << 3) | (gamma1xh >>> 29)) ^ ((gamma1xl >>> 6) | (gamma1xh << 26)); 12138 12139 // W[i] = gamma0 + W[i - 7] + gamma1 + W[i - 16] 12140 var Wi7 = W[i - 7]; 12141 var Wi7h = Wi7.high; 12142 var Wi7l = Wi7.low; 12143 12144 var Wi16 = W[i - 16]; 12145 var Wi16h = Wi16.high; 12146 var Wi16l = Wi16.low; 12147 12148 var Wil = gamma0l + Wi7l; 12149 var Wih = gamma0h + Wi7h + ((Wil >>> 0) < (gamma0l >>> 0) ? 1 : 0); 12150 var Wil = Wil + gamma1l; 12151 var Wih = Wih + gamma1h + ((Wil >>> 0) < (gamma1l >>> 0) ? 1 : 0); 12152 var Wil = Wil + Wi16l; 12153 var Wih = Wih + Wi16h + ((Wil >>> 0) < (Wi16l >>> 0) ? 1 : 0); 12154 12155 Wi.high = Wih; 12156 Wi.low = Wil; 12157 } 12158 12159 var chh = (eh & fh) ^ (~eh & gh); 12160 var chl = (el & fl) ^ (~el & gl); 12161 var majh = (ah & bh) ^ (ah & ch) ^ (bh & ch); 12162 var majl = (al & bl) ^ (al & cl) ^ (bl & cl); 12163 12164 var sigma0h = ((ah >>> 28) | (al << 4)) ^ ((ah << 30) | (al >>> 2)) ^ ((ah << 25) | (al >>> 7)); 12165 var sigma0l = ((al >>> 28) | (ah << 4)) ^ ((al << 30) | (ah >>> 2)) ^ ((al << 25) | (ah >>> 7)); 12166 var sigma1h = ((eh >>> 14) | (el << 18)) ^ ((eh >>> 18) | (el << 14)) ^ ((eh << 23) | (el >>> 9)); 12167 var sigma1l = ((el >>> 14) | (eh << 18)) ^ ((el >>> 18) | (eh << 14)) ^ ((el << 23) | (eh >>> 9)); 12168 12169 // t1 = h + sigma1 + ch + K[i] + W[i] 12170 var Ki = K[i]; 12171 var Kih = Ki.high; 12172 var Kil = Ki.low; 12173 12174 var t1l = hl + sigma1l; 12175 var t1h = hh + sigma1h + ((t1l >>> 0) < (hl >>> 0) ? 1 : 0); 12176 var t1l = t1l + chl; 12177 var t1h = t1h + chh + ((t1l >>> 0) < (chl >>> 0) ? 1 : 0); 12178 var t1l = t1l + Kil; 12179 var t1h = t1h + Kih + ((t1l >>> 0) < (Kil >>> 0) ? 1 : 0); 12180 var t1l = t1l + Wil; 12181 var t1h = t1h + Wih + ((t1l >>> 0) < (Wil >>> 0) ? 1 : 0); 12182 12183 // t2 = sigma0 + maj 12184 var t2l = sigma0l + majl; 12185 var t2h = sigma0h + majh + ((t2l >>> 0) < (sigma0l >>> 0) ? 1 : 0); 12186 12187 // Update working variables 12188 hh = gh; 12189 hl = gl; 12190 gh = fh; 12191 gl = fl; 12192 fh = eh; 12193 fl = el; 12194 el = (dl + t1l) | 0; 12195 eh = (dh + t1h + ((el >>> 0) < (dl >>> 0) ? 1 : 0)) | 0; 12196 dh = ch; 12197 dl = cl; 12198 ch = bh; 12199 cl = bl; 12200 bh = ah; 12201 bl = al; 12202 al = (t1l + t2l) | 0; 12203 ah = (t1h + t2h + ((al >>> 0) < (t1l >>> 0) ? 1 : 0)) | 0; 12204 } 12205 12206 // Intermediate hash value 12207 H0l = H0.low = (H0l + al); 12208 H0.high = (H0h + ah + ((H0l >>> 0) < (al >>> 0) ? 1 : 0)); 12209 H1l = H1.low = (H1l + bl); 12210 H1.high = (H1h + bh + ((H1l >>> 0) < (bl >>> 0) ? 1 : 0)); 12211 H2l = H2.low = (H2l + cl); 12212 H2.high = (H2h + ch + ((H2l >>> 0) < (cl >>> 0) ? 1 : 0)); 12213 H3l = H3.low = (H3l + dl); 12214 H3.high = (H3h + dh + ((H3l >>> 0) < (dl >>> 0) ? 1 : 0)); 12215 H4l = H4.low = (H4l + el); 12216 H4.high = (H4h + eh + ((H4l >>> 0) < (el >>> 0) ? 1 : 0)); 12217 H5l = H5.low = (H5l + fl); 12218 H5.high = (H5h + fh + ((H5l >>> 0) < (fl >>> 0) ? 1 : 0)); 12219 H6l = H6.low = (H6l + gl); 12220 H6.high = (H6h + gh + ((H6l >>> 0) < (gl >>> 0) ? 1 : 0)); 12221 H7l = H7.low = (H7l + hl); 12222 H7.high = (H7h + hh + ((H7l >>> 0) < (hl >>> 0) ? 1 : 0)); 12223 }, 12224 12225 _doFinalize: function () { 12226 // Shortcuts 12227 var data = this._data; 12228 var dataWords = data.words; 12229 12230 var nBitsTotal = this._nDataBytes * 8; 12231 var nBitsLeft = data.sigBytes * 8; 12232 12233 // Add padding 12234 dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32); 12235 dataWords[(((nBitsLeft + 128) >>> 10) << 5) + 30] = Math.floor(nBitsTotal / 0x100000000); 12236 dataWords[(((nBitsLeft + 128) >>> 10) << 5) + 31] = nBitsTotal; 12237 data.sigBytes = dataWords.length * 4; 12238 12239 // Hash final blocks 12240 this._process(); 12241 12242 // Convert hash to 32-bit word array before returning 12243 var hash = this._hash.toX32(); 12244 12245 // Return final computed hash 12246 return hash; 12247 }, 12248 12249 clone: function () { 12250 var clone = Hasher.clone.call(this); 12251 clone._hash = this._hash.clone(); 12252 12253 return clone; 12254 }, 12255 12256 blockSize: 1024/32 12257 }); 12258 12259 /** 12260 * Shortcut function to the hasher's object interface. 12261 * 12262 * @param {WordArray|string} message The message to hash. 12263 * 12264 * @return {WordArray} The hash. 12265 * 12266 * @static 12267 * 12268 * @example 12269 * 12270 * var hash = CryptoJS.SHA512('message'); 12271 * var hash = CryptoJS.SHA512(wordArray); 12272 */ 12273 C.SHA512 = Hasher._createHelper(SHA512); 12274 12275 /** 12276 * Shortcut function to the HMAC's object interface. 12277 * 12278 * @param {WordArray|string} message The message to hash. 12279 * @param {WordArray|string} key The secret key. 12280 * 12281 * @return {WordArray} The HMAC. 12282 * 12283 * @static 12284 * 12285 * @example 12286 * 12287 * var hmac = CryptoJS.HmacSHA512(message, key); 12288 */ 12289 C.HmacSHA512 = Hasher._createHmacHelper(SHA512); 12290 }()); 12291 12292 12293 return CryptoJS.SHA512; 12294 12295 })); 12296 },{"./core":53,"./x64-core":84}],83:[function(require,module,exports){ 12297 ;(function (root, factory, undef) { 12298 if (typeof exports === "object") { 12299 // CommonJS 12300 module.exports = exports = factory(require("./core"), require("./enc-base64"), require("./md5"), require("./evpkdf"), require("./cipher-core")); 12301 } 12302 else if (typeof define === "function" && define.amd) { 12303 // AMD 12304 define(["./core", "./enc-base64", "./md5", "./evpkdf", "./cipher-core"], factory); 12305 } 12306 else { 12307 // Global (browser) 12308 factory(root.CryptoJS); 12309 } 12310 }(this, function (CryptoJS) { 12311 12312 (function () { 12313 // Shortcuts 12314 var C = CryptoJS; 12315 var C_lib = C.lib; 12316 var WordArray = C_lib.WordArray; 12317 var BlockCipher = C_lib.BlockCipher; 12318 var C_algo = C.algo; 12319 12320 // Permuted Choice 1 constants 12321 var PC1 = [ 12322 57, 49, 41, 33, 25, 17, 9, 1, 12323 58, 50, 42, 34, 26, 18, 10, 2, 12324 59, 51, 43, 35, 27, 19, 11, 3, 12325 60, 52, 44, 36, 63, 55, 47, 39, 12326 31, 23, 15, 7, 62, 54, 46, 38, 12327 30, 22, 14, 6, 61, 53, 45, 37, 12328 29, 21, 13, 5, 28, 20, 12, 4 12329 ]; 12330 12331 // Permuted Choice 2 constants 12332 var PC2 = [ 12333 14, 17, 11, 24, 1, 5, 12334 3, 28, 15, 6, 21, 10, 12335 23, 19, 12, 4, 26, 8, 12336 16, 7, 27, 20, 13, 2, 12337 41, 52, 31, 37, 47, 55, 12338 30, 40, 51, 45, 33, 48, 12339 44, 49, 39, 56, 34, 53, 12340 46, 42, 50, 36, 29, 32 12341 ]; 12342 12343 // Cumulative bit shift constants 12344 var BIT_SHIFTS = [1, 2, 4, 6, 8, 10, 12, 14, 15, 17, 19, 21, 23, 25, 27, 28]; 12345 12346 // SBOXes and round permutation constants 12347 var SBOX_P = [ 12348 { 12349 0x0: 0x808200, 12350 0x10000000: 0x8000, 12351 0x20000000: 0x808002, 12352 0x30000000: 0x2, 12353 0x40000000: 0x200, 12354 0x50000000: 0x808202, 12355 0x60000000: 0x800202, 12356 0x70000000: 0x800000, 12357 0x80000000: 0x202, 12358 0x90000000: 0x800200, 12359 0xa0000000: 0x8200, 12360 0xb0000000: 0x808000, 12361 0xc0000000: 0x8002, 12362 0xd0000000: 0x800002, 12363 0xe0000000: 0x0, 12364 0xf0000000: 0x8202, 12365 0x8000000: 0x0, 12366 0x18000000: 0x808202, 12367 0x28000000: 0x8202, 12368 0x38000000: 0x8000, 12369 0x48000000: 0x808200, 12370 0x58000000: 0x200, 12371 0x68000000: 0x808002, 12372 0x78000000: 0x2, 12373 0x88000000: 0x800200, 12374 0x98000000: 0x8200, 12375 0xa8000000: 0x808000, 12376 0xb8000000: 0x800202, 12377 0xc8000000: 0x800002, 12378 0xd8000000: 0x8002, 12379 0xe8000000: 0x202, 12380 0xf8000000: 0x800000, 12381 0x1: 0x8000, 12382 0x10000001: 0x2, 12383 0x20000001: 0x808200, 12384 0x30000001: 0x800000, 12385 0x40000001: 0x808002, 12386 0x50000001: 0x8200, 12387 0x60000001: 0x200, 12388 0x70000001: 0x800202, 12389 0x80000001: 0x808202, 12390 0x90000001: 0x808000, 12391 0xa0000001: 0x800002, 12392 0xb0000001: 0x8202, 12393 0xc0000001: 0x202, 12394 0xd0000001: 0x800200, 12395 0xe0000001: 0x8002, 12396 0xf0000001: 0x0, 12397 0x8000001: 0x808202, 12398 0x18000001: 0x808000, 12399 0x28000001: 0x800000, 12400 0x38000001: 0x200, 12401 0x48000001: 0x8000, 12402 0x58000001: 0x800002, 12403 0x68000001: 0x2, 12404 0x78000001: 0x8202, 12405 0x88000001: 0x8002, 12406 0x98000001: 0x800202, 12407 0xa8000001: 0x202, 12408 0xb8000001: 0x808200, 12409 0xc8000001: 0x800200, 12410 0xd8000001: 0x0, 12411 0xe8000001: 0x8200, 12412 0xf8000001: 0x808002 12413 }, 12414 { 12415 0x0: 0x40084010, 12416 0x1000000: 0x4000, 12417 0x2000000: 0x80000, 12418 0x3000000: 0x40080010, 12419 0x4000000: 0x40000010, 12420 0x5000000: 0x40084000, 12421 0x6000000: 0x40004000, 12422 0x7000000: 0x10, 12423 0x8000000: 0x84000, 12424 0x9000000: 0x40004010, 12425 0xa000000: 0x40000000, 12426 0xb000000: 0x84010, 12427 0xc000000: 0x80010, 12428 0xd000000: 0x0, 12429 0xe000000: 0x4010, 12430 0xf000000: 0x40080000, 12431 0x800000: 0x40004000, 12432 0x1800000: 0x84010, 12433 0x2800000: 0x10, 12434 0x3800000: 0x40004010, 12435 0x4800000: 0x40084010, 12436 0x5800000: 0x40000000, 12437 0x6800000: 0x80000, 12438 0x7800000: 0x40080010, 12439 0x8800000: 0x80010, 12440 0x9800000: 0x0, 12441 0xa800000: 0x4000, 12442 0xb800000: 0x40080000, 12443 0xc800000: 0x40000010, 12444 0xd800000: 0x84000, 12445 0xe800000: 0x40084000, 12446 0xf800000: 0x4010, 12447 0x10000000: 0x0, 12448 0x11000000: 0x40080010, 12449 0x12000000: 0x40004010, 12450 0x13000000: 0x40084000, 12451 0x14000000: 0x40080000, 12452 0x15000000: 0x10, 12453 0x16000000: 0x84010, 12454 0x17000000: 0x4000, 12455 0x18000000: 0x4010, 12456 0x19000000: 0x80000, 12457 0x1a000000: 0x80010, 12458 0x1b000000: 0x40000010, 12459 0x1c000000: 0x84000, 12460 0x1d000000: 0x40004000, 12461 0x1e000000: 0x40000000, 12462 0x1f000000: 0x40084010, 12463 0x10800000: 0x84010, 12464 0x11800000: 0x80000, 12465 0x12800000: 0x40080000, 12466 0x13800000: 0x4000, 12467 0x14800000: 0x40004000, 12468 0x15800000: 0x40084010, 12469 0x16800000: 0x10, 12470 0x17800000: 0x40000000, 12471 0x18800000: 0x40084000, 12472 0x19800000: 0x40000010, 12473 0x1a800000: 0x40004010, 12474 0x1b800000: 0x80010, 12475 0x1c800000: 0x0, 12476 0x1d800000: 0x4010, 12477 0x1e800000: 0x40080010, 12478 0x1f800000: 0x84000 12479 }, 12480 { 12481 0x0: 0x104, 12482 0x100000: 0x0, 12483 0x200000: 0x4000100, 12484 0x300000: 0x10104, 12485 0x400000: 0x10004, 12486 0x500000: 0x4000004, 12487 0x600000: 0x4010104, 12488 0x700000: 0x4010000, 12489 0x800000: 0x4000000, 12490 0x900000: 0x4010100, 12491 0xa00000: 0x10100, 12492 0xb00000: 0x4010004, 12493 0xc00000: 0x4000104, 12494 0xd00000: 0x10000, 12495 0xe00000: 0x4, 12496 0xf00000: 0x100, 12497 0x80000: 0x4010100, 12498 0x180000: 0x4010004, 12499 0x280000: 0x0, 12500 0x380000: 0x4000100, 12501 0x480000: 0x4000004, 12502 0x580000: 0x10000, 12503 0x680000: 0x10004, 12504 0x780000: 0x104, 12505 0x880000: 0x4, 12506 0x980000: 0x100, 12507 0xa80000: 0x4010000, 12508 0xb80000: 0x10104, 12509 0xc80000: 0x10100, 12510 0xd80000: 0x4000104, 12511 0xe80000: 0x4010104, 12512 0xf80000: 0x4000000, 12513 0x1000000: 0x4010100, 12514 0x1100000: 0x10004, 12515 0x1200000: 0x10000, 12516 0x1300000: 0x4000100, 12517 0x1400000: 0x100, 12518 0x1500000: 0x4010104, 12519 0x1600000: 0x4000004, 12520 0x1700000: 0x0, 12521 0x1800000: 0x4000104, 12522 0x1900000: 0x4000000, 12523 0x1a00000: 0x4, 12524 0x1b00000: 0x10100, 12525 0x1c00000: 0x4010000, 12526 0x1d00000: 0x104, 12527 0x1e00000: 0x10104, 12528 0x1f00000: 0x4010004, 12529 0x1080000: 0x4000000, 12530 0x1180000: 0x104, 12531 0x1280000: 0x4010100, 12532 0x1380000: 0x0, 12533 0x1480000: 0x10004, 12534 0x1580000: 0x4000100, 12535 0x1680000: 0x100, 12536 0x1780000: 0x4010004, 12537 0x1880000: 0x10000, 12538 0x1980000: 0x4010104, 12539 0x1a80000: 0x10104, 12540 0x1b80000: 0x4000004, 12541 0x1c80000: 0x4000104, 12542 0x1d80000: 0x4010000, 12543 0x1e80000: 0x4, 12544 0x1f80000: 0x10100 12545 }, 12546 { 12547 0x0: 0x80401000, 12548 0x10000: 0x80001040, 12549 0x20000: 0x401040, 12550 0x30000: 0x80400000, 12551 0x40000: 0x0, 12552 0x50000: 0x401000, 12553 0x60000: 0x80000040, 12554 0x70000: 0x400040, 12555 0x80000: 0x80000000, 12556 0x90000: 0x400000, 12557 0xa0000: 0x40, 12558 0xb0000: 0x80001000, 12559 0xc0000: 0x80400040, 12560 0xd0000: 0x1040, 12561 0xe0000: 0x1000, 12562 0xf0000: 0x80401040, 12563 0x8000: 0x80001040, 12564 0x18000: 0x40, 12565 0x28000: 0x80400040, 12566 0x38000: 0x80001000, 12567 0x48000: 0x401000, 12568 0x58000: 0x80401040, 12569 0x68000: 0x0, 12570 0x78000: 0x80400000, 12571 0x88000: 0x1000, 12572 0x98000: 0x80401000, 12573 0xa8000: 0x400000, 12574 0xb8000: 0x1040, 12575 0xc8000: 0x80000000, 12576 0xd8000: 0x400040, 12577 0xe8000: 0x401040, 12578 0xf8000: 0x80000040, 12579 0x100000: 0x400040, 12580 0x110000: 0x401000, 12581 0x120000: 0x80000040, 12582 0x130000: 0x0, 12583 0x140000: 0x1040, 12584 0x150000: 0x80400040, 12585 0x160000: 0x80401000, 12586 0x170000: 0x80001040, 12587 0x180000: 0x80401040, 12588 0x190000: 0x80000000, 12589 0x1a0000: 0x80400000, 12590 0x1b0000: 0x401040, 12591 0x1c0000: 0x80001000, 12592 0x1d0000: 0x400000, 12593 0x1e0000: 0x40, 12594 0x1f0000: 0x1000, 12595 0x108000: 0x80400000, 12596 0x118000: 0x80401040, 12597 0x128000: 0x0, 12598 0x138000: 0x401000, 12599 0x148000: 0x400040, 12600 0x158000: 0x80000000, 12601 0x168000: 0x80001040, 12602 0x178000: 0x40, 12603 0x188000: 0x80000040, 12604 0x198000: 0x1000, 12605 0x1a8000: 0x80001000, 12606 0x1b8000: 0x80400040, 12607 0x1c8000: 0x1040, 12608 0x1d8000: 0x80401000, 12609 0x1e8000: 0x400000, 12610 0x1f8000: 0x401040 12611 }, 12612 { 12613 0x0: 0x80, 12614 0x1000: 0x1040000, 12615 0x2000: 0x40000, 12616 0x3000: 0x20000000, 12617 0x4000: 0x20040080, 12618 0x5000: 0x1000080, 12619 0x6000: 0x21000080, 12620 0x7000: 0x40080, 12621 0x8000: 0x1000000, 12622 0x9000: 0x20040000, 12623 0xa000: 0x20000080, 12624 0xb000: 0x21040080, 12625 0xc000: 0x21040000, 12626 0xd000: 0x0, 12627 0xe000: 0x1040080, 12628 0xf000: 0x21000000, 12629 0x800: 0x1040080, 12630 0x1800: 0x21000080, 12631 0x2800: 0x80, 12632 0x3800: 0x1040000, 12633 0x4800: 0x40000, 12634 0x5800: 0x20040080, 12635 0x6800: 0x21040000, 12636 0x7800: 0x20000000, 12637 0x8800: 0x20040000, 12638 0x9800: 0x0, 12639 0xa800: 0x21040080, 12640 0xb800: 0x1000080, 12641 0xc800: 0x20000080, 12642 0xd800: 0x21000000, 12643 0xe800: 0x1000000, 12644 0xf800: 0x40080, 12645 0x10000: 0x40000, 12646 0x11000: 0x80, 12647 0x12000: 0x20000000, 12648 0x13000: 0x21000080, 12649 0x14000: 0x1000080, 12650 0x15000: 0x21040000, 12651 0x16000: 0x20040080, 12652 0x17000: 0x1000000, 12653 0x18000: 0x21040080, 12654 0x19000: 0x21000000, 12655 0x1a000: 0x1040000, 12656 0x1b000: 0x20040000, 12657 0x1c000: 0x40080, 12658 0x1d000: 0x20000080, 12659 0x1e000: 0x0, 12660 0x1f000: 0x1040080, 12661 0x10800: 0x21000080, 12662 0x11800: 0x1000000, 12663 0x12800: 0x1040000, 12664 0x13800: 0x20040080, 12665 0x14800: 0x20000000, 12666 0x15800: 0x1040080, 12667 0x16800: 0x80, 12668 0x17800: 0x21040000, 12669 0x18800: 0x40080, 12670 0x19800: 0x21040080, 12671 0x1a800: 0x0, 12672 0x1b800: 0x21000000, 12673 0x1c800: 0x1000080, 12674 0x1d800: 0x40000, 12675 0x1e800: 0x20040000, 12676 0x1f800: 0x20000080 12677 }, 12678 { 12679 0x0: 0x10000008, 12680 0x100: 0x2000, 12681 0x200: 0x10200000, 12682 0x300: 0x10202008, 12683 0x400: 0x10002000, 12684 0x500: 0x200000, 12685 0x600: 0x200008, 12686 0x700: 0x10000000, 12687 0x800: 0x0, 12688 0x900: 0x10002008, 12689 0xa00: 0x202000, 12690 0xb00: 0x8, 12691 0xc00: 0x10200008, 12692 0xd00: 0x202008, 12693 0xe00: 0x2008, 12694 0xf00: 0x10202000, 12695 0x80: 0x10200000, 12696 0x180: 0x10202008, 12697 0x280: 0x8, 12698 0x380: 0x200000, 12699 0x480: 0x202008, 12700 0x580: 0x10000008, 12701 0x680: 0x10002000, 12702 0x780: 0x2008, 12703 0x880: 0x200008, 12704 0x980: 0x2000, 12705 0xa80: 0x10002008, 12706 0xb80: 0x10200008, 12707 0xc80: 0x0, 12708 0xd80: 0x10202000, 12709 0xe80: 0x202000, 12710 0xf80: 0x10000000, 12711 0x1000: 0x10002000, 12712 0x1100: 0x10200008, 12713 0x1200: 0x10202008, 12714 0x1300: 0x2008, 12715 0x1400: 0x200000, 12716 0x1500: 0x10000000, 12717 0x1600: 0x10000008, 12718 0x1700: 0x202000, 12719 0x1800: 0x202008, 12720 0x1900: 0x0, 12721 0x1a00: 0x8, 12722 0x1b00: 0x10200000, 12723 0x1c00: 0x2000, 12724 0x1d00: 0x10002008, 12725 0x1e00: 0x10202000, 12726 0x1f00: 0x200008, 12727 0x1080: 0x8, 12728 0x1180: 0x202000, 12729 0x1280: 0x200000, 12730 0x1380: 0x10000008, 12731 0x1480: 0x10002000, 12732 0x1580: 0x2008, 12733 0x1680: 0x10202008, 12734 0x1780: 0x10200000, 12735 0x1880: 0x10202000, 12736 0x1980: 0x10200008, 12737 0x1a80: 0x2000, 12738 0x1b80: 0x202008, 12739 0x1c80: 0x200008, 12740 0x1d80: 0x0, 12741 0x1e80: 0x10000000, 12742 0x1f80: 0x10002008 12743 }, 12744 { 12745 0x0: 0x100000, 12746 0x10: 0x2000401, 12747 0x20: 0x400, 12748 0x30: 0x100401, 12749 0x40: 0x2100401, 12750 0x50: 0x0, 12751 0x60: 0x1, 12752 0x70: 0x2100001, 12753 0x80: 0x2000400, 12754 0x90: 0x100001, 12755 0xa0: 0x2000001, 12756 0xb0: 0x2100400, 12757 0xc0: 0x2100000, 12758 0xd0: 0x401, 12759 0xe0: 0x100400, 12760 0xf0: 0x2000000, 12761 0x8: 0x2100001, 12762 0x18: 0x0, 12763 0x28: 0x2000401, 12764 0x38: 0x2100400, 12765 0x48: 0x100000, 12766 0x58: 0x2000001, 12767 0x68: 0x2000000, 12768 0x78: 0x401, 12769 0x88: 0x100401, 12770 0x98: 0x2000400, 12771 0xa8: 0x2100000, 12772 0xb8: 0x100001, 12773 0xc8: 0x400, 12774 0xd8: 0x2100401, 12775 0xe8: 0x1, 12776 0xf8: 0x100400, 12777 0x100: 0x2000000, 12778 0x110: 0x100000, 12779 0x120: 0x2000401, 12780 0x130: 0x2100001, 12781 0x140: 0x100001, 12782 0x150: 0x2000400, 12783 0x160: 0x2100400, 12784 0x170: 0x100401, 12785 0x180: 0x401, 12786 0x190: 0x2100401, 12787 0x1a0: 0x100400, 12788 0x1b0: 0x1, 12789 0x1c0: 0x0, 12790 0x1d0: 0x2100000, 12791 0x1e0: 0x2000001, 12792 0x1f0: 0x400, 12793 0x108: 0x100400, 12794 0x118: 0x2000401, 12795 0x128: 0x2100001, 12796 0x138: 0x1, 12797 0x148: 0x2000000, 12798 0x158: 0x100000, 12799 0x168: 0x401, 12800 0x178: 0x2100400, 12801 0x188: 0x2000001, 12802 0x198: 0x2100000, 12803 0x1a8: 0x0, 12804 0x1b8: 0x2100401, 12805 0x1c8: 0x100401, 12806 0x1d8: 0x400, 12807 0x1e8: 0x2000400, 12808 0x1f8: 0x100001 12809 }, 12810 { 12811 0x0: 0x8000820, 12812 0x1: 0x20000, 12813 0x2: 0x8000000, 12814 0x3: 0x20, 12815 0x4: 0x20020, 12816 0x5: 0x8020820, 12817 0x6: 0x8020800, 12818 0x7: 0x800, 12819 0x8: 0x8020000, 12820 0x9: 0x8000800, 12821 0xa: 0x20800, 12822 0xb: 0x8020020, 12823 0xc: 0x820, 12824 0xd: 0x0, 12825 0xe: 0x8000020, 12826 0xf: 0x20820, 12827 0x80000000: 0x800, 12828 0x80000001: 0x8020820, 12829 0x80000002: 0x8000820, 12830 0x80000003: 0x8000000, 12831 0x80000004: 0x8020000, 12832 0x80000005: 0x20800, 12833 0x80000006: 0x20820, 12834 0x80000007: 0x20, 12835 0x80000008: 0x8000020, 12836 0x80000009: 0x820, 12837 0x8000000a: 0x20020, 12838 0x8000000b: 0x8020800, 12839 0x8000000c: 0x0, 12840 0x8000000d: 0x8020020, 12841 0x8000000e: 0x8000800, 12842 0x8000000f: 0x20000, 12843 0x10: 0x20820, 12844 0x11: 0x8020800, 12845 0x12: 0x20, 12846 0x13: 0x800, 12847 0x14: 0x8000800, 12848 0x15: 0x8000020, 12849 0x16: 0x8020020, 12850 0x17: 0x20000, 12851 0x18: 0x0, 12852 0x19: 0x20020, 12853 0x1a: 0x8020000, 12854 0x1b: 0x8000820, 12855 0x1c: 0x8020820, 12856 0x1d: 0x20800, 12857 0x1e: 0x820, 12858 0x1f: 0x8000000, 12859 0x80000010: 0x20000, 12860 0x80000011: 0x800, 12861 0x80000012: 0x8020020, 12862 0x80000013: 0x20820, 12863 0x80000014: 0x20, 12864 0x80000015: 0x8020000, 12865 0x80000016: 0x8000000, 12866 0x80000017: 0x8000820, 12867 0x80000018: 0x8020820, 12868 0x80000019: 0x8000020, 12869 0x8000001a: 0x8000800, 12870 0x8000001b: 0x0, 12871 0x8000001c: 0x20800, 12872 0x8000001d: 0x820, 12873 0x8000001e: 0x20020, 12874 0x8000001f: 0x8020800 12875 } 12876 ]; 12877 12878 // Masks that select the SBOX input 12879 var SBOX_MASK = [ 12880 0xf8000001, 0x1f800000, 0x01f80000, 0x001f8000, 12881 0x0001f800, 0x00001f80, 0x000001f8, 0x8000001f 12882 ]; 12883 12884 /** 12885 * DES block cipher algorithm. 12886 */ 12887 var DES = C_algo.DES = BlockCipher.extend({ 12888 _doReset: function () { 12889 // Shortcuts 12890 var key = this._key; 12891 var keyWords = key.words; 12892 12893 // Select 56 bits according to PC1 12894 var keyBits = []; 12895 for (var i = 0; i < 56; i++) { 12896 var keyBitPos = PC1[i] - 1; 12897 keyBits[i] = (keyWords[keyBitPos >>> 5] >>> (31 - keyBitPos % 32)) & 1; 12898 } 12899 12900 // Assemble 16 subkeys 12901 var subKeys = this._subKeys = []; 12902 for (var nSubKey = 0; nSubKey < 16; nSubKey++) { 12903 // Create subkey 12904 var subKey = subKeys[nSubKey] = []; 12905 12906 // Shortcut 12907 var bitShift = BIT_SHIFTS[nSubKey]; 12908 12909 // Select 48 bits according to PC2 12910 for (var i = 0; i < 24; i++) { 12911 // Select from the left 28 key bits 12912 subKey[(i / 6) | 0] |= keyBits[((PC2[i] - 1) + bitShift) % 28] << (31 - i % 6); 12913 12914 // Select from the right 28 key bits 12915 subKey[4 + ((i / 6) | 0)] |= keyBits[28 + (((PC2[i + 24] - 1) + bitShift) % 28)] << (31 - i % 6); 12916 } 12917 12918 // Since each subkey is applied to an expanded 32-bit input, 12919 // the subkey can be broken into 8 values scaled to 32-bits, 12920 // which allows the key to be used without expansion 12921 subKey[0] = (subKey[0] << 1) | (subKey[0] >>> 31); 12922 for (var i = 1; i < 7; i++) { 12923 subKey[i] = subKey[i] >>> ((i - 1) * 4 + 3); 12924 } 12925 subKey[7] = (subKey[7] << 5) | (subKey[7] >>> 27); 12926 } 12927 12928 // Compute inverse subkeys 12929 var invSubKeys = this._invSubKeys = []; 12930 for (var i = 0; i < 16; i++) { 12931 invSubKeys[i] = subKeys[15 - i]; 12932 } 12933 }, 12934 12935 encryptBlock: function (M, offset) { 12936 this._doCryptBlock(M, offset, this._subKeys); 12937 }, 12938 12939 decryptBlock: function (M, offset) { 12940 this._doCryptBlock(M, offset, this._invSubKeys); 12941 }, 12942 12943 _doCryptBlock: function (M, offset, subKeys) { 12944 // Get input 12945 this._lBlock = M[offset]; 12946 this._rBlock = M[offset + 1]; 12947 12948 // Initial permutation 12949 exchangeLR.call(this, 4, 0x0f0f0f0f); 12950 exchangeLR.call(this, 16, 0x0000ffff); 12951 exchangeRL.call(this, 2, 0x33333333); 12952 exchangeRL.call(this, 8, 0x00ff00ff); 12953 exchangeLR.call(this, 1, 0x55555555); 12954 12955 // Rounds 12956 for (var round = 0; round < 16; round++) { 12957 // Shortcuts 12958 var subKey = subKeys[round]; 12959 var lBlock = this._lBlock; 12960 var rBlock = this._rBlock; 12961 12962 // Feistel function 12963 var f = 0; 12964 for (var i = 0; i < 8; i++) { 12965 f |= SBOX_P[i][((rBlock ^ subKey[i]) & SBOX_MASK[i]) >>> 0]; 12966 } 12967 this._lBlock = rBlock; 12968 this._rBlock = lBlock ^ f; 12969 } 12970 12971 // Undo swap from last round 12972 var t = this._lBlock; 12973 this._lBlock = this._rBlock; 12974 this._rBlock = t; 12975 12976 // Final permutation 12977 exchangeLR.call(this, 1, 0x55555555); 12978 exchangeRL.call(this, 8, 0x00ff00ff); 12979 exchangeRL.call(this, 2, 0x33333333); 12980 exchangeLR.call(this, 16, 0x0000ffff); 12981 exchangeLR.call(this, 4, 0x0f0f0f0f); 12982 12983 // Set output 12984 M[offset] = this._lBlock; 12985 M[offset + 1] = this._rBlock; 12986 }, 12987 12988 keySize: 64/32, 12989 12990 ivSize: 64/32, 12991 12992 blockSize: 64/32 12993 }); 12994 12995 // Swap bits across the left and right words 12996 function exchangeLR(offset, mask) { 12997 var t = ((this._lBlock >>> offset) ^ this._rBlock) & mask; 12998 this._rBlock ^= t; 12999 this._lBlock ^= t << offset; 13000 } 13001 13002 function exchangeRL(offset, mask) { 13003 var t = ((this._rBlock >>> offset) ^ this._lBlock) & mask; 13004 this._lBlock ^= t; 13005 this._rBlock ^= t << offset; 13006 } 13007 13008 /** 13009 * Shortcut functions to the cipher's object interface. 13010 * 13011 * @example 13012 * 13013 * var ciphertext = CryptoJS.DES.encrypt(message, key, cfg); 13014 * var plaintext = CryptoJS.DES.decrypt(ciphertext, key, cfg); 13015 */ 13016 C.DES = BlockCipher._createHelper(DES); 13017 13018 /** 13019 * Triple-DES block cipher algorithm. 13020 */ 13021 var TripleDES = C_algo.TripleDES = BlockCipher.extend({ 13022 _doReset: function () { 13023 // Shortcuts 13024 var key = this._key; 13025 var keyWords = key.words; 13026 13027 // Create DES instances 13028 this._des1 = DES.createEncryptor(WordArray.create(keyWords.slice(0, 2))); 13029 this._des2 = DES.createEncryptor(WordArray.create(keyWords.slice(2, 4))); 13030 this._des3 = DES.createEncryptor(WordArray.create(keyWords.slice(4, 6))); 13031 }, 13032 13033 encryptBlock: function (M, offset) { 13034 this._des1.encryptBlock(M, offset); 13035 this._des2.decryptBlock(M, offset); 13036 this._des3.encryptBlock(M, offset); 13037 }, 13038 13039 decryptBlock: function (M, offset) { 13040 this._des3.decryptBlock(M, offset); 13041 this._des2.encryptBlock(M, offset); 13042 this._des1.decryptBlock(M, offset); 13043 }, 13044 13045 keySize: 192/32, 13046 13047 ivSize: 64/32, 13048 13049 blockSize: 64/32 13050 }); 13051 13052 /** 13053 * Shortcut functions to the cipher's object interface. 13054 * 13055 * @example 13056 * 13057 * var ciphertext = CryptoJS.TripleDES.encrypt(message, key, cfg); 13058 * var plaintext = CryptoJS.TripleDES.decrypt(ciphertext, key, cfg); 13059 */ 13060 C.TripleDES = BlockCipher._createHelper(TripleDES); 13061 }()); 13062 13063 13064 return CryptoJS.TripleDES; 13065 13066 })); 13067 },{"./cipher-core":52,"./core":53,"./enc-base64":54,"./evpkdf":56,"./md5":61}],84:[function(require,module,exports){ 13068 ;(function (root, factory) { 13069 if (typeof exports === "object") { 13070 // CommonJS 13071 module.exports = exports = factory(require("./core")); 13072 } 13073 else if (typeof define === "function" && define.amd) { 13074 // AMD 13075 define(["./core"], factory); 13076 } 13077 else { 13078 // Global (browser) 13079 factory(root.CryptoJS); 13080 } 13081 }(this, function (CryptoJS) { 13082 13083 (function (undefined) { 13084 // Shortcuts 13085 var C = CryptoJS; 13086 var C_lib = C.lib; 13087 var Base = C_lib.Base; 13088 var X32WordArray = C_lib.WordArray; 13089 13090 /** 13091 * x64 namespace. 13092 */ 13093 var C_x64 = C.x64 = {}; 13094 13095 /** 13096 * A 64-bit word. 13097 */ 13098 var X64Word = C_x64.Word = Base.extend({ 13099 /** 13100 * Initializes a newly created 64-bit word. 13101 * 13102 * @param {number} high The high 32 bits. 13103 * @param {number} low The low 32 bits. 13104 * 13105 * @example 13106 * 13107 * var x64Word = CryptoJS.x64.Word.create(0x00010203, 0x04050607); 13108 */ 13109 init: function (high, low) { 13110 this.high = high; 13111 this.low = low; 13112 } 13113 13114 /** 13115 * Bitwise NOTs this word. 13116 * 13117 * @return {X64Word} A new x64-Word object after negating. 13118 * 13119 * @example 13120 * 13121 * var negated = x64Word.not(); 13122 */ 13123 // not: function () { 13124 // var high = ~this.high; 13125 // var low = ~this.low; 13126 13127 // return X64Word.create(high, low); 13128 // }, 13129 13130 /** 13131 * Bitwise ANDs this word with the passed word. 13132 * 13133 * @param {X64Word} word The x64-Word to AND with this word. 13134 * 13135 * @return {X64Word} A new x64-Word object after ANDing. 13136 * 13137 * @example 13138 * 13139 * var anded = x64Word.and(anotherX64Word); 13140 */ 13141 // and: function (word) { 13142 // var high = this.high & word.high; 13143 // var low = this.low & word.low; 13144 13145 // return X64Word.create(high, low); 13146 // }, 13147 13148 /** 13149 * Bitwise ORs this word with the passed word. 13150 * 13151 * @param {X64Word} word The x64-Word to OR with this word. 13152 * 13153 * @return {X64Word} A new x64-Word object after ORing. 13154 * 13155 * @example 13156 * 13157 * var ored = x64Word.or(anotherX64Word); 13158 */ 13159 // or: function (word) { 13160 // var high = this.high | word.high; 13161 // var low = this.low | word.low; 13162 13163 // return X64Word.create(high, low); 13164 // }, 13165 13166 /** 13167 * Bitwise XORs this word with the passed word. 13168 * 13169 * @param {X64Word} word The x64-Word to XOR with this word. 13170 * 13171 * @return {X64Word} A new x64-Word object after XORing. 13172 * 13173 * @example 13174 * 13175 * var xored = x64Word.xor(anotherX64Word); 13176 */ 13177 // xor: function (word) { 13178 // var high = this.high ^ word.high; 13179 // var low = this.low ^ word.low; 13180 13181 // return X64Word.create(high, low); 13182 // }, 13183 13184 /** 13185 * Shifts this word n bits to the left. 13186 * 13187 * @param {number} n The number of bits to shift. 13188 * 13189 * @return {X64Word} A new x64-Word object after shifting. 13190 * 13191 * @example 13192 * 13193 * var shifted = x64Word.shiftL(25); 13194 */ 13195 // shiftL: function (n) { 13196 // if (n < 32) { 13197 // var high = (this.high << n) | (this.low >>> (32 - n)); 13198 // var low = this.low << n; 13199 // } else { 13200 // var high = this.low << (n - 32); 13201 // var low = 0; 13202 // } 13203 13204 // return X64Word.create(high, low); 13205 // }, 13206 13207 /** 13208 * Shifts this word n bits to the right. 13209 * 13210 * @param {number} n The number of bits to shift. 13211 * 13212 * @return {X64Word} A new x64-Word object after shifting. 13213 * 13214 * @example 13215 * 13216 * var shifted = x64Word.shiftR(7); 13217 */ 13218 // shiftR: function (n) { 13219 // if (n < 32) { 13220 // var low = (this.low >>> n) | (this.high << (32 - n)); 13221 // var high = this.high >>> n; 13222 // } else { 13223 // var low = this.high >>> (n - 32); 13224 // var high = 0; 13225 // } 13226 13227 // return X64Word.create(high, low); 13228 // }, 13229 13230 /** 13231 * Rotates this word n bits to the left. 13232 * 13233 * @param {number} n The number of bits to rotate. 13234 * 13235 * @return {X64Word} A new x64-Word object after rotating. 13236 * 13237 * @example 13238 * 13239 * var rotated = x64Word.rotL(25); 13240 */ 13241 // rotL: function (n) { 13242 // return this.shiftL(n).or(this.shiftR(64 - n)); 13243 // }, 13244 13245 /** 13246 * Rotates this word n bits to the right. 13247 * 13248 * @param {number} n The number of bits to rotate. 13249 * 13250 * @return {X64Word} A new x64-Word object after rotating. 13251 * 13252 * @example 13253 * 13254 * var rotated = x64Word.rotR(7); 13255 */ 13256 // rotR: function (n) { 13257 // return this.shiftR(n).or(this.shiftL(64 - n)); 13258 // }, 13259 13260 /** 13261 * Adds this word with the passed word. 13262 * 13263 * @param {X64Word} word The x64-Word to add with this word. 13264 * 13265 * @return {X64Word} A new x64-Word object after adding. 13266 * 13267 * @example 13268 * 13269 * var added = x64Word.add(anotherX64Word); 13270 */ 13271 // add: function (word) { 13272 // var low = (this.low + word.low) | 0; 13273 // var carry = (low >>> 0) < (this.low >>> 0) ? 1 : 0; 13274 // var high = (this.high + word.high + carry) | 0; 13275 13276 // return X64Word.create(high, low); 13277 // } 13278 }); 13279 13280 /** 13281 * An array of 64-bit words. 13282 * 13283 * @property {Array} words The array of CryptoJS.x64.Word objects. 13284 * @property {number} sigBytes The number of significant bytes in this word array. 13285 */ 13286 var X64WordArray = C_x64.WordArray = Base.extend({ 13287 /** 13288 * Initializes a newly created word array. 13289 * 13290 * @param {Array} words (Optional) An array of CryptoJS.x64.Word objects. 13291 * @param {number} sigBytes (Optional) The number of significant bytes in the words. 13292 * 13293 * @example 13294 * 13295 * var wordArray = CryptoJS.x64.WordArray.create(); 13296 * 13297 * var wordArray = CryptoJS.x64.WordArray.create([ 13298 * CryptoJS.x64.Word.create(0x00010203, 0x04050607), 13299 * CryptoJS.x64.Word.create(0x18191a1b, 0x1c1d1e1f) 13300 * ]); 13301 * 13302 * var wordArray = CryptoJS.x64.WordArray.create([ 13303 * CryptoJS.x64.Word.create(0x00010203, 0x04050607), 13304 * CryptoJS.x64.Word.create(0x18191a1b, 0x1c1d1e1f) 13305 * ], 10); 13306 */ 13307 init: function (words, sigBytes) { 13308 words = this.words = words || []; 13309 13310 if (sigBytes != undefined) { 13311 this.sigBytes = sigBytes; 13312 } else { 13313 this.sigBytes = words.length * 8; 13314 } 13315 }, 13316 13317 /** 13318 * Converts this 64-bit word array to a 32-bit word array. 13319 * 13320 * @return {CryptoJS.lib.WordArray} This word array's data as a 32-bit word array. 13321 * 13322 * @example 13323 * 13324 * var x32WordArray = x64WordArray.toX32(); 13325 */ 13326 toX32: function () { 13327 // Shortcuts 13328 var x64Words = this.words; 13329 var x64WordsLength = x64Words.length; 13330 13331 // Convert 13332 var x32Words = []; 13333 for (var i = 0; i < x64WordsLength; i++) { 13334 var x64Word = x64Words[i]; 13335 x32Words.push(x64Word.high); 13336 x32Words.push(x64Word.low); 13337 } 13338 13339 return X32WordArray.create(x32Words, this.sigBytes); 13340 }, 13341 13342 /** 13343 * Creates a copy of this word array. 13344 * 13345 * @return {X64WordArray} The clone. 13346 * 13347 * @example 13348 * 13349 * var clone = x64WordArray.clone(); 13350 */ 13351 clone: function () { 13352 var clone = Base.clone.call(this); 13353 13354 // Clone "words" array 13355 var words = clone.words = this.words.slice(0); 13356 13357 // Clone each X64Word object 13358 var wordsLength = words.length; 13359 for (var i = 0; i < wordsLength; i++) { 13360 words[i] = words[i].clone(); 13361 } 13362 13363 return clone; 13364 } 13365 }); 13366 }()); 13367 13368 13369 return CryptoJS; 13370 13371 })); 13372 },{"./core":53}],85:[function(require,module,exports){ 13373 /*! https://mths.be/utf8js v2.1.2 by @mathias */ 13374 ;(function(root) { 13375 13376 // Detect free variables `exports` 13377 var freeExports = typeof exports == 'object' && exports; 13378 13379 // Detect free variable `module` 13380 var freeModule = typeof module == 'object' && module && 13381 module.exports == freeExports && module; 13382 13383 // Detect free variable `global`, from Node.js or Browserified code, 13384 // and use it as `root` 13385 var freeGlobal = typeof global == 'object' && global; 13386 if (freeGlobal.global === freeGlobal || freeGlobal.window === freeGlobal) { 13387 root = freeGlobal; 13388 } 13389 13390 /*--------------------------------------------------------------------------*/ 13391 13392 var stringFromCharCode = String.fromCharCode; 13393 13394 // Taken from https://mths.be/punycode 13395 function ucs2decode(string) { 13396 var output = []; 13397 var counter = 0; 13398 var length = string.length; 13399 var value; 13400 var extra; 13401 while (counter < length) { 13402 value = string.charCodeAt(counter++); 13403 if (value >= 0xD800 && value <= 0xDBFF && counter < length) { 13404 // high surrogate, and there is a next character 13405 extra = string.charCodeAt(counter++); 13406 if ((extra & 0xFC00) == 0xDC00) { // low surrogate 13407 output.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000); 13408 } else { 13409 // unmatched surrogate; only append this code unit, in case the next 13410 // code unit is the high surrogate of a surrogate pair 13411 output.push(value); 13412 counter--; 13413 } 13414 } else { 13415 output.push(value); 13416 } 13417 } 13418 return output; 13419 } 13420 13421 // Taken from https://mths.be/punycode 13422 function ucs2encode(array) { 13423 var length = array.length; 13424 var index = -1; 13425 var value; 13426 var output = ''; 13427 while (++index < length) { 13428 value = array[index]; 13429 if (value > 0xFFFF) { 13430 value -= 0x10000; 13431 output += stringFromCharCode(value >>> 10 & 0x3FF | 0xD800); 13432 value = 0xDC00 | value & 0x3FF; 13433 } 13434 output += stringFromCharCode(value); 13435 } 13436 return output; 13437 } 13438 13439 function checkScalarValue(codePoint) { 13440 if (codePoint >= 0xD800 && codePoint <= 0xDFFF) { 13441 throw Error( 13442 'Lone surrogate U+' + codePoint.toString(16).toUpperCase() + 13443 ' is not a scalar value' 13444 ); 13445 } 13446 } 13447 /*--------------------------------------------------------------------------*/ 13448 13449 function createByte(codePoint, shift) { 13450 return stringFromCharCode(((codePoint >> shift) & 0x3F) | 0x80); 13451 } 13452 13453 function encodeCodePoint(codePoint) { 13454 if ((codePoint & 0xFFFFFF80) == 0) { // 1-byte sequence 13455 return stringFromCharCode(codePoint); 13456 } 13457 var symbol = ''; 13458 if ((codePoint & 0xFFFFF800) == 0) { // 2-byte sequence 13459 symbol = stringFromCharCode(((codePoint >> 6) & 0x1F) | 0xC0); 13460 } 13461 else if ((codePoint & 0xFFFF0000) == 0) { // 3-byte sequence 13462 checkScalarValue(codePoint); 13463 symbol = stringFromCharCode(((codePoint >> 12) & 0x0F) | 0xE0); 13464 symbol += createByte(codePoint, 6); 13465 } 13466 else if ((codePoint & 0xFFE00000) == 0) { // 4-byte sequence 13467 symbol = stringFromCharCode(((codePoint >> 18) & 0x07) | 0xF0); 13468 symbol += createByte(codePoint, 12); 13469 symbol += createByte(codePoint, 6); 13470 } 13471 symbol += stringFromCharCode((codePoint & 0x3F) | 0x80); 13472 return symbol; 13473 } 13474 13475 function utf8encode(string) { 13476 var codePoints = ucs2decode(string); 13477 var length = codePoints.length; 13478 var index = -1; 13479 var codePoint; 13480 var byteString = ''; 13481 while (++index < length) { 13482 codePoint = codePoints[index]; 13483 byteString += encodeCodePoint(codePoint); 13484 } 13485 return byteString; 13486 } 13487 13488 /*--------------------------------------------------------------------------*/ 13489 13490 function readContinuationByte() { 13491 if (byteIndex >= byteCount) { 13492 throw Error('Invalid byte index'); 13493 } 13494 13495 var continuationByte = byteArray[byteIndex] & 0xFF; 13496 byteIndex++; 13497 13498 if ((continuationByte & 0xC0) == 0x80) { 13499 return continuationByte & 0x3F; 13500 } 13501 13502 // If we end up here, it’s not a continuation byte 13503 throw Error('Invalid continuation byte'); 13504 } 13505 13506 function decodeSymbol() { 13507 var byte1; 13508 var byte2; 13509 var byte3; 13510 var byte4; 13511 var codePoint; 13512 13513 if (byteIndex > byteCount) { 13514 throw Error('Invalid byte index'); 13515 } 13516 13517 if (byteIndex == byteCount) { 13518 return false; 13519 } 13520 13521 // Read first byte 13522 byte1 = byteArray[byteIndex] & 0xFF; 13523 byteIndex++; 13524 13525 // 1-byte sequence (no continuation bytes) 13526 if ((byte1 & 0x80) == 0) { 13527 return byte1; 13528 } 13529 13530 // 2-byte sequence 13531 if ((byte1 & 0xE0) == 0xC0) { 13532 byte2 = readContinuationByte(); 13533 codePoint = ((byte1 & 0x1F) << 6) | byte2; 13534 if (codePoint >= 0x80) { 13535 return codePoint; 13536 } else { 13537 throw Error('Invalid continuation byte'); 13538 } 13539 } 13540 13541 // 3-byte sequence (may include unpaired surrogates) 13542 if ((byte1 & 0xF0) == 0xE0) { 13543 byte2 = readContinuationByte(); 13544 byte3 = readContinuationByte(); 13545 codePoint = ((byte1 & 0x0F) << 12) | (byte2 << 6) | byte3; 13546 if (codePoint >= 0x0800) { 13547 checkScalarValue(codePoint); 13548 return codePoint; 13549 } else { 13550 throw Error('Invalid continuation byte'); 13551 } 13552 } 13553 13554 // 4-byte sequence 13555 if ((byte1 & 0xF8) == 0xF0) { 13556 byte2 = readContinuationByte(); 13557 byte3 = readContinuationByte(); 13558 byte4 = readContinuationByte(); 13559 codePoint = ((byte1 & 0x07) << 0x12) | (byte2 << 0x0C) | 13560 (byte3 << 0x06) | byte4; 13561 if (codePoint >= 0x010000 && codePoint <= 0x10FFFF) { 13562 return codePoint; 13563 } 13564 } 13565 13566 throw Error('Invalid UTF-8 detected'); 13567 } 13568 13569 var byteArray; 13570 var byteCount; 13571 var byteIndex; 13572 function utf8decode(byteString) { 13573 byteArray = ucs2decode(byteString); 13574 byteCount = byteArray.length; 13575 byteIndex = 0; 13576 var codePoints = []; 13577 var tmp; 13578 while ((tmp = decodeSymbol()) !== false) { 13579 codePoints.push(tmp); 13580 } 13581 return ucs2encode(codePoints); 13582 } 13583 13584 /*--------------------------------------------------------------------------*/ 13585 13586 var utf8 = { 13587 'version': '2.1.2', 13588 'encode': utf8encode, 13589 'decode': utf8decode 13590 }; 13591 13592 // Some AMD build optimizers, like r.js, check for specific condition patterns 13593 // like the following: 13594 if ( 13595 typeof define == 'function' && 13596 typeof define.amd == 'object' && 13597 define.amd 13598 ) { 13599 define(function() { 13600 return utf8; 13601 }); 13602 } else if (freeExports && !freeExports.nodeType) { 13603 if (freeModule) { // in Node.js or RingoJS v0.8.0+ 13604 freeModule.exports = utf8; 13605 } else { // in Narwhal or RingoJS v0.7.0- 13606 var object = {}; 13607 var hasOwnProperty = object.hasOwnProperty; 13608 for (var key in utf8) { 13609 hasOwnProperty.call(utf8, key) && (freeExports[key] = utf8[key]); 13610 } 13611 } 13612 } else { // in Rhino or a web browser 13613 root.utf8 = utf8; 13614 } 13615 13616 }(this)); 13617 13618 },{}],86:[function(require,module,exports){ 13619 module.exports = XMLHttpRequest; 13620 13621 },{}],"bignumber.js":[function(require,module,exports){ 13622 'use strict'; 13623 13624 module.exports = BigNumber; // jshint ignore:line 13625 13626 13627 },{}],"web3":[function(require,module,exports){ 13628 var Web3 = require('./lib/web3'); 13629 13630 // don't override global variable 13631 if (typeof window !== 'undefined' && typeof window.Web3 === 'undefined') { 13632 window.Web3 = Web3; 13633 } 13634 13635 module.exports = Web3; 13636 13637 },{"./lib/web3":22}]},{},["web3"]) 13638 //# sourceMappingURL=web3-light.js.map