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