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