partkeepr

fork of partkeepr
git clone https://git.e1e0.net/partkeepr.git
Log | Files | Refs | Submodules | README | LICENSE

bcrypt.js (23911B)


      1 function bCrypt() {
      2 	this.GENSALT_DEFAULT_LOG2_ROUNDS = 10;
      3 	this.BCRYPT_SALT_LEN = 16;
      4 	this.BLOWFISH_NUM_ROUNDS = 16;
      5 	this.MAX_EXECUTION_TIME = 100;
      6 	this.P_orig = [0x243f6a88, 0x85a308d3, 0x13198a2e, 0x03707344, 0xa4093822,
      7 			0x299f31d0, 0x082efa98, 0xec4e6c89, 0x452821e6, 0x38d01377,
      8 			0xbe5466cf, 0x34e90c6c, 0xc0ac29b7, 0xc97c50dd, 0x3f84d5b5,
      9 			0xb5470917, 0x9216d5d9, 0x8979fb1b];
     10 	this.S_orig = [0xd1310ba6, 0x98dfb5ac, 0x2ffd72db, 0xd01adfb7, 0xb8e1afed,
     11 			0x6a267e96, 0xba7c9045, 0xf12c7f99, 0x24a19947, 0xb3916cf7,
     12 			0x0801f2e2, 0x858efc16, 0x636920d8, 0x71574e69, 0xa458fea3,
     13 			0xf4933d7e, 0x0d95748f, 0x728eb658, 0x718bcd58, 0x82154aee,
     14 			0x7b54a41d, 0xc25a59b5, 0x9c30d539, 0x2af26013, 0xc5d1b023,
     15 			0x286085f0, 0xca417918, 0xb8db38ef, 0x8e79dcb0, 0x603a180e,
     16 			0x6c9e0e8b, 0xb01e8a3e, 0xd71577c1, 0xbd314b27, 0x78af2fda,
     17 			0x55605c60, 0xe65525f3, 0xaa55ab94, 0x57489862, 0x63e81440,
     18 			0x55ca396a, 0x2aab10b6, 0xb4cc5c34, 0x1141e8ce, 0xa15486af,
     19 			0x7c72e993, 0xb3ee1411, 0x636fbc2a, 0x2ba9c55d, 0x741831f6,
     20 			0xce5c3e16, 0x9b87931e, 0xafd6ba33, 0x6c24cf5c, 0x7a325381,
     21 			0x28958677, 0x3b8f4898, 0x6b4bb9af, 0xc4bfe81b, 0x66282193,
     22 			0x61d809cc, 0xfb21a991, 0x487cac60, 0x5dec8032, 0xef845d5d,
     23 			0xe98575b1, 0xdc262302, 0xeb651b88, 0x23893e81, 0xd396acc5,
     24 			0x0f6d6ff3, 0x83f44239, 0x2e0b4482, 0xa4842004, 0x69c8f04a,
     25 			0x9e1f9b5e, 0x21c66842, 0xf6e96c9a, 0x670c9c61, 0xabd388f0,
     26 			0x6a51a0d2, 0xd8542f68, 0x960fa728, 0xab5133a3, 0x6eef0b6c,
     27 			0x137a3be4, 0xba3bf050, 0x7efb2a98, 0xa1f1651d, 0x39af0176,
     28 			0x66ca593e, 0x82430e88, 0x8cee8619, 0x456f9fb4, 0x7d84a5c3,
     29 			0x3b8b5ebe, 0xe06f75d8, 0x85c12073, 0x401a449f, 0x56c16aa6,
     30 			0x4ed3aa62, 0x363f7706, 0x1bfedf72, 0x429b023d, 0x37d0d724,
     31 			0xd00a1248, 0xdb0fead3, 0x49f1c09b, 0x075372c9, 0x80991b7b,
     32 			0x25d479d8, 0xf6e8def7, 0xe3fe501a, 0xb6794c3b, 0x976ce0bd,
     33 			0x04c006ba, 0xc1a94fb6, 0x409f60c4, 0x5e5c9ec2, 0x196a2463,
     34 			0x68fb6faf, 0x3e6c53b5, 0x1339b2eb, 0x3b52ec6f, 0x6dfc511f,
     35 			0x9b30952c, 0xcc814544, 0xaf5ebd09, 0xbee3d004, 0xde334afd,
     36 			0x660f2807, 0x192e4bb3, 0xc0cba857, 0x45c8740f, 0xd20b5f39,
     37 			0xb9d3fbdb, 0x5579c0bd, 0x1a60320a, 0xd6a100c6, 0x402c7279,
     38 			0x679f25fe, 0xfb1fa3cc, 0x8ea5e9f8, 0xdb3222f8, 0x3c7516df,
     39 			0xfd616b15, 0x2f501ec8, 0xad0552ab, 0x323db5fa, 0xfd238760,
     40 			0x53317b48, 0x3e00df82, 0x9e5c57bb, 0xca6f8ca0, 0x1a87562e,
     41 			0xdf1769db, 0xd542a8f6, 0x287effc3, 0xac6732c6, 0x8c4f5573,
     42 			0x695b27b0, 0xbbca58c8, 0xe1ffa35d, 0xb8f011a0, 0x10fa3d98,
     43 			0xfd2183b8, 0x4afcb56c, 0x2dd1d35b, 0x9a53e479, 0xb6f84565,
     44 			0xd28e49bc, 0x4bfb9790, 0xe1ddf2da, 0xa4cb7e33, 0x62fb1341,
     45 			0xcee4c6e8, 0xef20cada, 0x36774c01, 0xd07e9efe, 0x2bf11fb4,
     46 			0x95dbda4d, 0xae909198, 0xeaad8e71, 0x6b93d5a0, 0xd08ed1d0,
     47 			0xafc725e0, 0x8e3c5b2f, 0x8e7594b7, 0x8ff6e2fb, 0xf2122b64,
     48 			0x8888b812, 0x900df01c, 0x4fad5ea0, 0x688fc31c, 0xd1cff191,
     49 			0xb3a8c1ad, 0x2f2f2218, 0xbe0e1777, 0xea752dfe, 0x8b021fa1,
     50 			0xe5a0cc0f, 0xb56f74e8, 0x18acf3d6, 0xce89e299, 0xb4a84fe0,
     51 			0xfd13e0b7, 0x7cc43b81, 0xd2ada8d9, 0x165fa266, 0x80957705,
     52 			0x93cc7314, 0x211a1477, 0xe6ad2065, 0x77b5fa86, 0xc75442f5,
     53 			0xfb9d35cf, 0xebcdaf0c, 0x7b3e89a0, 0xd6411bd3, 0xae1e7e49,
     54 			0x00250e2d, 0x2071b35e, 0x226800bb, 0x57b8e0af, 0x2464369b,
     55 			0xf009b91e, 0x5563911d, 0x59dfa6aa, 0x78c14389, 0xd95a537f,
     56 			0x207d5ba2, 0x02e5b9c5, 0x83260376, 0x6295cfa9, 0x11c81968,
     57 			0x4e734a41, 0xb3472dca, 0x7b14a94a, 0x1b510052, 0x9a532915,
     58 			0xd60f573f, 0xbc9bc6e4, 0x2b60a476, 0x81e67400, 0x08ba6fb5,
     59 			0x571be91f, 0xf296ec6b, 0x2a0dd915, 0xb6636521, 0xe7b9f9b6,
     60 			0xff34052e, 0xc5855664, 0x53b02d5d, 0xa99f8fa1, 0x08ba4799,
     61 			0x6e85076a, 0x4b7a70e9, 0xb5b32944, 0xdb75092e, 0xc4192623,
     62 			0xad6ea6b0, 0x49a7df7d, 0x9cee60b8, 0x8fedb266, 0xecaa8c71,
     63 			0x699a17ff, 0x5664526c, 0xc2b19ee1, 0x193602a5, 0x75094c29,
     64 			0xa0591340, 0xe4183a3e, 0x3f54989a, 0x5b429d65, 0x6b8fe4d6,
     65 			0x99f73fd6, 0xa1d29c07, 0xefe830f5, 0x4d2d38e6, 0xf0255dc1,
     66 			0x4cdd2086, 0x8470eb26, 0x6382e9c6, 0x021ecc5e, 0x09686b3f,
     67 			0x3ebaefc9, 0x3c971814, 0x6b6a70a1, 0x687f3584, 0x52a0e286,
     68 			0xb79c5305, 0xaa500737, 0x3e07841c, 0x7fdeae5c, 0x8e7d44ec,
     69 			0x5716f2b8, 0xb03ada37, 0xf0500c0d, 0xf01c1f04, 0x0200b3ff,
     70 			0xae0cf51a, 0x3cb574b2, 0x25837a58, 0xdc0921bd, 0xd19113f9,
     71 			0x7ca92ff6, 0x94324773, 0x22f54701, 0x3ae5e581, 0x37c2dadc,
     72 			0xc8b57634, 0x9af3dda7, 0xa9446146, 0x0fd0030e, 0xecc8c73e,
     73 			0xa4751e41, 0xe238cd99, 0x3bea0e2f, 0x3280bba1, 0x183eb331,
     74 			0x4e548b38, 0x4f6db908, 0x6f420d03, 0xf60a04bf, 0x2cb81290,
     75 			0x24977c79, 0x5679b072, 0xbcaf89af, 0xde9a771f, 0xd9930810,
     76 			0xb38bae12, 0xdccf3f2e, 0x5512721f, 0x2e6b7124, 0x501adde6,
     77 			0x9f84cd87, 0x7a584718, 0x7408da17, 0xbc9f9abc, 0xe94b7d8c,
     78 			0xec7aec3a, 0xdb851dfa, 0x63094366, 0xc464c3d2, 0xef1c1847,
     79 			0x3215d908, 0xdd433b37, 0x24c2ba16, 0x12a14d43, 0x2a65c451,
     80 			0x50940002, 0x133ae4dd, 0x71dff89e, 0x10314e55, 0x81ac77d6,
     81 			0x5f11199b, 0x043556f1, 0xd7a3c76b, 0x3c11183b, 0x5924a509,
     82 			0xf28fe6ed, 0x97f1fbfa, 0x9ebabf2c, 0x1e153c6e, 0x86e34570,
     83 			0xeae96fb1, 0x860e5e0a, 0x5a3e2ab3, 0x771fe71c, 0x4e3d06fa,
     84 			0x2965dcb9, 0x99e71d0f, 0x803e89d6, 0x5266c825, 0x2e4cc978,
     85 			0x9c10b36a, 0xc6150eba, 0x94e2ea78, 0xa5fc3c53, 0x1e0a2df4,
     86 			0xf2f74ea7, 0x361d2b3d, 0x1939260f, 0x19c27960, 0x5223a708,
     87 			0xf71312b6, 0xebadfe6e, 0xeac31f66, 0xe3bc4595, 0xa67bc883,
     88 			0xb17f37d1, 0x018cff28, 0xc332ddef, 0xbe6c5aa5, 0x65582185,
     89 			0x68ab9802, 0xeecea50f, 0xdb2f953b, 0x2aef7dad, 0x5b6e2f84,
     90 			0x1521b628, 0x29076170, 0xecdd4775, 0x619f1510, 0x13cca830,
     91 			0xeb61bd96, 0x0334fe1e, 0xaa0363cf, 0xb5735c90, 0x4c70a239,
     92 			0xd59e9e0b, 0xcbaade14, 0xeecc86bc, 0x60622ca7, 0x9cab5cab,
     93 			0xb2f3846e, 0x648b1eaf, 0x19bdf0ca, 0xa02369b9, 0x655abb50,
     94 			0x40685a32, 0x3c2ab4b3, 0x319ee9d5, 0xc021b8f7, 0x9b540b19,
     95 			0x875fa099, 0x95f7997e, 0x623d7da8, 0xf837889a, 0x97e32d77,
     96 			0x11ed935f, 0x16681281, 0x0e358829, 0xc7e61fd6, 0x96dedfa1,
     97 			0x7858ba99, 0x57f584a5, 0x1b227263, 0x9b83c3ff, 0x1ac24696,
     98 			0xcdb30aeb, 0x532e3054, 0x8fd948e4, 0x6dbc3128, 0x58ebf2ef,
     99 			0x34c6ffea, 0xfe28ed61, 0xee7c3c73, 0x5d4a14d9, 0xe864b7e3,
    100 			0x42105d14, 0x203e13e0, 0x45eee2b6, 0xa3aaabea, 0xdb6c4f15,
    101 			0xfacb4fd0, 0xc742f442, 0xef6abbb5, 0x654f3b1d, 0x41cd2105,
    102 			0xd81e799e, 0x86854dc7, 0xe44b476a, 0x3d816250, 0xcf62a1f2,
    103 			0x5b8d2646, 0xfc8883a0, 0xc1c7b6a3, 0x7f1524c3, 0x69cb7492,
    104 			0x47848a0b, 0x5692b285, 0x095bbf00, 0xad19489d, 0x1462b174,
    105 			0x23820e00, 0x58428d2a, 0x0c55f5ea, 0x1dadf43e, 0x233f7061,
    106 			0x3372f092, 0x8d937e41, 0xd65fecf1, 0x6c223bdb, 0x7cde3759,
    107 			0xcbee7460, 0x4085f2a7, 0xce77326e, 0xa6078084, 0x19f8509e,
    108 			0xe8efd855, 0x61d99735, 0xa969a7aa, 0xc50c06c2, 0x5a04abfc,
    109 			0x800bcadc, 0x9e447a2e, 0xc3453484, 0xfdd56705, 0x0e1e9ec9,
    110 			0xdb73dbd3, 0x105588cd, 0x675fda79, 0xe3674340, 0xc5c43465,
    111 			0x713e38d8, 0x3d28f89e, 0xf16dff20, 0x153e21e7, 0x8fb03d4a,
    112 			0xe6e39f2b, 0xdb83adf7, 0xe93d5a68, 0x948140f7, 0xf64c261c,
    113 			0x94692934, 0x411520f7, 0x7602d4f7, 0xbcf46b2e, 0xd4a20068,
    114 			0xd4082471, 0x3320f46a, 0x43b7d4b7, 0x500061af, 0x1e39f62e,
    115 			0x97244546, 0x14214f74, 0xbf8b8840, 0x4d95fc1d, 0x96b591af,
    116 			0x70f4ddd3, 0x66a02f45, 0xbfbc09ec, 0x03bd9785, 0x7fac6dd0,
    117 			0x31cb8504, 0x96eb27b3, 0x55fd3941, 0xda2547e6, 0xabca0a9a,
    118 			0x28507825, 0x530429f4, 0x0a2c86da, 0xe9b66dfb, 0x68dc1462,
    119 			0xd7486900, 0x680ec0a4, 0x27a18dee, 0x4f3ffea2, 0xe887ad8c,
    120 			0xb58ce006, 0x7af4d6b6, 0xaace1e7c, 0xd3375fec, 0xce78a399,
    121 			0x406b2a42, 0x20fe9e35, 0xd9f385b9, 0xee39d7ab, 0x3b124e8b,
    122 			0x1dc9faf7, 0x4b6d1856, 0x26a36631, 0xeae397b2, 0x3a6efa74,
    123 			0xdd5b4332, 0x6841e7f7, 0xca7820fb, 0xfb0af54e, 0xd8feb397,
    124 			0x454056ac, 0xba489527, 0x55533a3a, 0x20838d87, 0xfe6ba9b7,
    125 			0xd096954b, 0x55a867bc, 0xa1159a58, 0xcca92963, 0x99e1db33,
    126 			0xa62a4a56, 0x3f3125f9, 0x5ef47e1c, 0x9029317c, 0xfdf8e802,
    127 			0x04272f70, 0x80bb155c, 0x05282ce3, 0x95c11548, 0xe4c66d22,
    128 			0x48c1133f, 0xc70f86dc, 0x07f9c9ee, 0x41041f0f, 0x404779a4,
    129 			0x5d886e17, 0x325f51eb, 0xd59bc0d1, 0xf2bcc18f, 0x41113564,
    130 			0x257b7834, 0x602a9c60, 0xdff8e8a3, 0x1f636c1b, 0x0e12b4c2,
    131 			0x02e1329e, 0xaf664fd1, 0xcad18115, 0x6b2395e0, 0x333e92e1,
    132 			0x3b240b62, 0xeebeb922, 0x85b2a20e, 0xe6ba0d99, 0xde720c8c,
    133 			0x2da2f728, 0xd0127845, 0x95b794fd, 0x647d0862, 0xe7ccf5f0,
    134 			0x5449a36f, 0x877d48fa, 0xc39dfd27, 0xf33e8d1e, 0x0a476341,
    135 			0x992eff74, 0x3a6f6eab, 0xf4f8fd37, 0xa812dc60, 0xa1ebddf8,
    136 			0x991be14c, 0xdb6e6b0d, 0xc67b5510, 0x6d672c37, 0x2765d43b,
    137 			0xdcd0e804, 0xf1290dc7, 0xcc00ffa3, 0xb5390f92, 0x690fed0b,
    138 			0x667b9ffb, 0xcedb7d9c, 0xa091cf0b, 0xd9155ea3, 0xbb132f88,
    139 			0x515bad24, 0x7b9479bf, 0x763bd6eb, 0x37392eb3, 0xcc115979,
    140 			0x8026e297, 0xf42e312d, 0x6842ada7, 0xc66a2b3b, 0x12754ccc,
    141 			0x782ef11c, 0x6a124237, 0xb79251e7, 0x06a1bbe6, 0x4bfb6350,
    142 			0x1a6b1018, 0x11caedfa, 0x3d25bdd8, 0xe2e1c3c9, 0x44421659,
    143 			0x0a121386, 0xd90cec6e, 0xd5abea2a, 0x64af674e, 0xda86a85f,
    144 			0xbebfe988, 0x64e4c3fe, 0x9dbc8057, 0xf0f7c086, 0x60787bf8,
    145 			0x6003604d, 0xd1fd8346, 0xf6381fb0, 0x7745ae04, 0xd736fccc,
    146 			0x83426b33, 0xf01eab71, 0xb0804187, 0x3c005e5f, 0x77a057be,
    147 			0xbde8ae24, 0x55464299, 0xbf582e61, 0x4e58f48f, 0xf2ddfda2,
    148 			0xf474ef38, 0x8789bdc2, 0x5366f9c3, 0xc8b38e74, 0xb475f255,
    149 			0x46fcd9b9, 0x7aeb2661, 0x8b1ddf84, 0x846a0e79, 0x915f95e2,
    150 			0x466e598e, 0x20b45770, 0x8cd55591, 0xc902de4c, 0xb90bace1,
    151 			0xbb8205d0, 0x11a86248, 0x7574a99e, 0xb77f19b6, 0xe0a9dc09,
    152 			0x662d09a1, 0xc4324633, 0xe85a1f02, 0x09f0be8c, 0x4a99a025,
    153 			0x1d6efe10, 0x1ab93d1d, 0x0ba5a4df, 0xa186f20f, 0x2868f169,
    154 			0xdcb7da83, 0x573906fe, 0xa1e2ce9b, 0x4fcd7f52, 0x50115e01,
    155 			0xa70683fa, 0xa002b5c4, 0x0de6d027, 0x9af88c27, 0x773f8641,
    156 			0xc3604c06, 0x61a806b5, 0xf0177a28, 0xc0f586e0, 0x006058aa,
    157 			0x30dc7d62, 0x11e69ed7, 0x2338ea63, 0x53c2dd94, 0xc2c21634,
    158 			0xbbcbee56, 0x90bcb6de, 0xebfc7da1, 0xce591d76, 0x6f05e409,
    159 			0x4b7c0188, 0x39720a3d, 0x7c927c24, 0x86e3725f, 0x724d9db9,
    160 			0x1ac15bb4, 0xd39eb8fc, 0xed545578, 0x08fca5b5, 0xd83d7cd3,
    161 			0x4dad0fc4, 0x1e50ef5e, 0xb161e6f8, 0xa28514d9, 0x6c51133c,
    162 			0x6fd5c7e7, 0x56e14ec4, 0x362abfce, 0xddc6c837, 0xd79a3234,
    163 			0x92638212, 0x670efa8e, 0x406000e0, 0x3a39ce37, 0xd3faf5cf,
    164 			0xabc27737, 0x5ac52d1b, 0x5cb0679e, 0x4fa33742, 0xd3822740,
    165 			0x99bc9bbe, 0xd5118e9d, 0xbf0f7315, 0xd62d1c7e, 0xc700c47b,
    166 			0xb78c1b6b, 0x21a19045, 0xb26eb1be, 0x6a366eb4, 0x5748ab2f,
    167 			0xbc946e79, 0xc6a376d2, 0x6549c2c8, 0x530ff8ee, 0x468dde7d,
    168 			0xd5730a1d, 0x4cd04dc6, 0x2939bbdb, 0xa9ba4650, 0xac9526e8,
    169 			0xbe5ee304, 0xa1fad5f0, 0x6a2d519a, 0x63ef8ce2, 0x9a86ee22,
    170 			0xc089c2b8, 0x43242ef6, 0xa51e03aa, 0x9cf2d0a4, 0x83c061ba,
    171 			0x9be96a4d, 0x8fe51550, 0xba645bd6, 0x2826a2f9, 0xa73a3ae1,
    172 			0x4ba99586, 0xef5562e9, 0xc72fefd3, 0xf752f7da, 0x3f046f69,
    173 			0x77fa0a59, 0x80e4a915, 0x87b08601, 0x9b09e6ad, 0x3b3ee593,
    174 			0xe990fd5a, 0x9e34d797, 0x2cf0b7d9, 0x022b8b51, 0x96d5ac3a,
    175 			0x017da67d, 0xd1cf3ed6, 0x7c7d2d28, 0x1f9f25cf, 0xadf2b89b,
    176 			0x5ad6b472, 0x5a88f54c, 0xe029ac71, 0xe019a5e6, 0x47b0acfd,
    177 			0xed93fa9b, 0xe8d3c48d, 0x283b57cc, 0xf8d56629, 0x79132e28,
    178 			0x785f0191, 0xed756055, 0xf7960e44, 0xe3d35e8c, 0x15056dd4,
    179 			0x88f46dba, 0x03a16125, 0x0564f0bd, 0xc3eb9e15, 0x3c9057a2,
    180 			0x97271aec, 0xa93a072a, 0x1b3f6d9b, 0x1e6321f5, 0xf59c66fb,
    181 			0x26dcf319, 0x7533d928, 0xb155fdf5, 0x03563482, 0x8aba3cbb,
    182 			0x28517711, 0xc20ad9f8, 0xabcc5167, 0xccad925f, 0x4de81751,
    183 			0x3830dc8e, 0x379d5862, 0x9320f991, 0xea7a90c2, 0xfb3e7bce,
    184 			0x5121ce64, 0x774fbe32, 0xa8b6e37e, 0xc3293d46, 0x48de5369,
    185 			0x6413e680, 0xa2ae0810, 0xdd6db224, 0x69852dfd, 0x09072166,
    186 			0xb39a460a, 0x6445c0dd, 0x586cdecf, 0x1c20c8ae, 0x5bbef7dd,
    187 			0x1b588d40, 0xccd2017f, 0x6bb4e3bb, 0xdda26a7e, 0x3a59ff45,
    188 			0x3e350a44, 0xbcb4cdd5, 0x72eacea8, 0xfa6484bb, 0x8d6612ae,
    189 			0xbf3c6f47, 0xd29be463, 0x542f5d9e, 0xaec2771b, 0xf64e6370,
    190 			0x740e0d8d, 0xe75b1357, 0xf8721671, 0xaf537d5d, 0x4040cb08,
    191 			0x4eb4e2cc, 0x34d2466a, 0x0115af84, 0xe1b00428, 0x95983a1d,
    192 			0x06b89fb4, 0xce6ea048, 0x6f3f3b82, 0x3520ab82, 0x011a1d4b,
    193 			0x277227f8, 0x611560b1, 0xe7933fdc, 0xbb3a792b, 0x344525bd,
    194 			0xa08839e1, 0x51ce794b, 0x2f32c9b7, 0xa01fbac9, 0xe01cc87e,
    195 			0xbcc7d1f6, 0xcf0111c3, 0xa1e8aac7, 0x1a908749, 0xd44fbd9a,
    196 			0xd0dadecb, 0xd50ada38, 0x0339c32a, 0xc6913667, 0x8df9317c,
    197 			0xe0b12b4f, 0xf79e59b7, 0x43f5bb3a, 0xf2d519ff, 0x27d9459c,
    198 			0xbf97222c, 0x15e6fc2a, 0x0f91fc71, 0x9b941525, 0xfae59361,
    199 			0xceb69ceb, 0xc2a86459, 0x12baa8d1, 0xb6c1075e, 0xe3056a0c,
    200 			0x10d25065, 0xcb03a442, 0xe0ec6e0e, 0x1698db3b, 0x4c98a0be,
    201 			0x3278e964, 0x9f1f9532, 0xe0d392df, 0xd3a0342b, 0x8971f21e,
    202 			0x1b0a7441, 0x4ba3348c, 0xc5be7120, 0xc37632d8, 0xdf359f8d,
    203 			0x9b992f2e, 0xe60b6f47, 0x0fe3f11d, 0xe54cda54, 0x1edad891,
    204 			0xce6279cf, 0xcd3e7e6f, 0x1618b166, 0xfd2c1d05, 0x848fd2c5,
    205 			0xf6fb2299, 0xf523f357, 0xa6327623, 0x93a83531, 0x56cccd02,
    206 			0xacf08162, 0x5a75ebb5, 0x6e163697, 0x88d273cc, 0xde966292,
    207 			0x81b949d0, 0x4c50901b, 0x71c65614, 0xe6c6c7bd, 0x327a140a,
    208 			0x45e1d006, 0xc3f27b9a, 0xc9aa53fd, 0x62a80f00, 0xbb25bfe2,
    209 			0x35bdd2f6, 0x71126905, 0xb2040222, 0xb6cbcf7c, 0xcd769c2b,
    210 			0x53113ec0, 0x1640e3d3, 0x38abbd60, 0x2547adf0, 0xba38209c,
    211 			0xf746ce76, 0x77afa1c5, 0x20756060, 0x85cbfe4e, 0x8ae88dd8,
    212 			0x7aaaf9b0, 0x4cf9aa7e, 0x1948c25c, 0x02fb8a8c, 0x01c36ae4,
    213 			0xd6ebe1f9, 0x90d4f869, 0xa65cdea0, 0x3f09252d, 0xc208e69f,
    214 			0xb74e6132, 0xce77e25b, 0x578fdfe3, 0x3ac372e6];
    215 	this.bf_crypt_ciphertext = [0x4f727068, 0x65616e42, 0x65686f6c, 0x64657253,
    216 			0x63727944, 0x6f756274];
    217 	this.base64_code = ['.', '/', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I',
    218 			'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V',
    219 			'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i',
    220 			'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v',
    221 			'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8',
    222 			'9'];
    223 	this.index_64 = [-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
    224 			-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
    225 			-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 1,
    226 			54, 55, 56, 57, 58, 59, 60, 61, 62, 63, -1, -1, -1, -1, -1, -1, -1,
    227 			2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
    228 			21, 22, 23, 24, 25, 26, 27, -1, -1, -1, -1, -1, -1, 28, 29, 30, 31,
    229 			32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48,
    230 			49, 50, 51, 52, 53, -1, -1, -1, -1, -1];
    231 	this.P;
    232 	this.S;
    233 	this.lr;
    234 	this.offp;
    235 };
    236 bCrypt.prototype.getByte = function(c) {
    237 	var ret = 0;
    238 	try {
    239 		var b = c.charCodeAt(0);
    240 	} catch (err) {
    241 		b = c;
    242 	}
    243 	if (b > 127) {
    244 		return -128 + (b % 128);
    245 	} else {
    246 		return b;
    247 	}
    248 };
    249 bCrypt.prototype.encode_base64 = function(d, len) {
    250 	var off = 0;
    251 	var rs = [];
    252 	var c1;
    253 	var c2;
    254 	if (len <= 0 || len > d.length)
    255 		throw "Invalid len";
    256 	while (off < len) {
    257 		c1 = d[off++] & 0xff;
    258 		rs.push(this.base64_code[(c1 >> 2) & 0x3f]);
    259 		c1 = (c1 & 0x03) << 4;
    260 		if (off >= len) {
    261 			rs.push(this.base64_code[c1 & 0x3f]);
    262 			break;
    263 		}
    264 		c2 = d[off++] & 0xff;
    265 		c1 |= (c2 >> 4) & 0x0f;
    266 		rs.push(this.base64_code[c1 & 0x3f]);
    267 		c1 = (c2 & 0x0f) << 2;
    268 		if (off >= len) {
    269 			rs.push(this.base64_code[c1 & 0x3f]);
    270 			break;
    271 		}
    272 		c2 = d[off++] & 0xff;
    273 		c1 |= (c2 >> 6) & 0x03;
    274 		rs.push(this.base64_code[c1 & 0x3f]);
    275 		rs.push(this.base64_code[c2 & 0x3f]);
    276 	}
    277 	return rs.join('');
    278 };
    279 bCrypt.prototype.char64 = function(x) {
    280 	var code = x.charCodeAt(0);
    281 	if (code < 0 || code > this.index_64.length) {
    282 		return -1;
    283 	}
    284 	return this.index_64[code];
    285 };
    286 bCrypt.prototype.decode_base64 = function(s, maxolen) {
    287 	var off = 0;
    288 	var slen = s.length;
    289 	var olen = 0;
    290 	var rs = [];
    291 	var c1, c2, c3, c4, o;
    292 	if (maxolen <= 0)
    293 		throw "Invalid maxolen";
    294 	while (off < slen - 1 && olen < maxolen) {
    295 		c1 = this.char64(s.charAt(off++));
    296 		c2 = this.char64(s.charAt(off++));
    297 		if (c1 == -1 || c2 == -1) {
    298 			break;
    299 		}
    300 		o = this.getByte(c1 << 2);
    301 		o |= (c2 & 0x30) >> 4;
    302 		rs.push(String.fromCharCode(o));
    303 		if (++olen >= maxolen || off >= slen) {
    304 			break;
    305 		}
    306 		c3 = this.char64(s.charAt(off++));
    307 		if (c3 == -1) {
    308 			break;
    309 		}
    310 		o = this.getByte((c2 & 0x0f) << 4);
    311 		o |= (c3 & 0x3c) >> 2;
    312 		rs.push(String.fromCharCode(o));
    313 		if (++olen >= maxolen || off >= slen) {
    314 			break;
    315 		}
    316 		c4 = this.char64(s.charAt(off++));
    317 		o = this.getByte((c3 & 0x03) << 6);
    318 		o |= c4;
    319 		rs.push(String.fromCharCode(o));
    320 		++olen;
    321 	}
    322 	var ret = [];
    323 	for (off = 0; off < olen; off++) {
    324 		ret.push(this.getByte(rs[off]));
    325 	}
    326 	return ret;
    327 };
    328 bCrypt.prototype.encipher = function(lr, off) {
    329 	var i;
    330 	var n;
    331 	var l = lr[off];
    332 	var r = lr[off + 1];
    333 
    334 	l ^= this.P[0];
    335 	for (i = 0; i <= this.BLOWFISH_NUM_ROUNDS - 2;) {
    336 		// Feistel substitution on left word
    337 		n = this.S[(l >> 24) & 0xff];
    338 		n += this.S[0x100 | ((l >> 16) & 0xff)];
    339 		n ^= this.S[0x200 | ((l >> 8) & 0xff)];
    340 		n += this.S[0x300 | (l & 0xff)];
    341 		r ^= n ^ this.P[++i];
    342 
    343 		// Feistel substitution on right word
    344 		n = this.S[(r >> 24) & 0xff];
    345 		n += this.S[0x100 | ((r >> 16) & 0xff)];
    346 		n ^= this.S[0x200 | ((r >> 8) & 0xff)];
    347 		n += this.S[0x300 | (r & 0xff)];
    348 		l ^= n ^ this.P[++i];
    349 	}
    350 	lr[off] = r ^ this.P[this.BLOWFISH_NUM_ROUNDS + 1];
    351 	lr[off + 1] = l;
    352 };
    353 bCrypt.prototype.streamtoword = function(data, offp) {
    354 	var i;
    355 	var word = 0;
    356 	var off = offp;
    357 	for (i = 0; i < 4; i++) {
    358 		word = (word << 8) | (data[off] & 0xff);
    359 		off = (off + 1) % data.length;
    360 	}
    361 	this.offp = off;
    362 	return word;
    363 };
    364 bCrypt.prototype.init_key = function() {
    365 	this.P = this.P_orig.slice();
    366 	this.S = this.S_orig.slice();
    367 };
    368 bCrypt.prototype.key = function(key) {
    369 	var i;
    370 	this.offp = 0;
    371 	var lr = new Array(0x00000000, 0x00000000);
    372 	var plen = this.P.length;
    373 	var slen = this.S.length;
    374 
    375 	for (i = 0; i < plen; i++) {
    376 		this.P[i] = this.P[i] ^ this.streamtoword(key, this.offp);
    377 	}
    378 	for (i = 0; i < plen; i += 2) {
    379 		this.encipher(lr, 0);
    380 		this.P[i] = lr[0];
    381 		this.P[i + 1] = lr[1];
    382 	}
    383 
    384 	for (i = 0; i < slen; i += 2) {
    385 		this.encipher(lr, 0);
    386 		this.S[i] = lr[0];
    387 		this.S[i + 1] = lr[1];
    388 	}
    389 };
    390 bCrypt.prototype.ekskey = function(data, key) {
    391 	var i;
    392 	this.offp = 0;
    393 	var lr = new Array(0x00000000, 0x00000000);
    394 	var plen = this.P.length;
    395 	var slen = this.S.length;
    396 
    397 	for (i = 0; i < plen; i++)
    398 		this.P[i] = this.P[i] ^ this.streamtoword(key, this.offp);
    399 	this.offp = 0;
    400 	for (i = 0; i < plen; i += 2) {
    401 		lr[0] ^= this.streamtoword(data, this.offp);
    402 		lr[1] ^= this.streamtoword(data, this.offp);
    403 		this.encipher(lr, 0);
    404 		this.P[i] = lr[0];
    405 		this.P[i + 1] = lr[1];
    406 	}
    407 	for (i = 0; i < slen; i += 2) {
    408 		lr[0] ^= this.streamtoword(data, this.offp);
    409 		lr[1] ^= this.streamtoword(data, this.offp);
    410 		this.encipher(lr, 0);
    411 		this.S[i] = lr[0];
    412 		this.S[i + 1] = lr[1];
    413 	}
    414 };
    415 
    416 bCrypt.prototype.crypt_raw = function(password, salt, log_rounds, cdata, callback, progress) {
    417 	var rounds;
    418 	var j;
    419 	var clen = cdata.length;
    420 	var one_percent;
    421 
    422 	if (log_rounds < 4) {
    423         throw "Minium of 4 rounds required, changing to default";
    424     }
    425 	if (log_rounds > 30) {
    426         throw "Maximum of 30 rounds exceded";
    427     }
    428 
    429 	if (salt.length != this.BCRYPT_SALT_LEN)
    430 		throw "Bad salt length";
    431 
    432 	rounds = 1 << log_rounds;
    433 	one_percent = Math.floor(rounds / 100) + 1;
    434 	this.init_key();
    435 	this.ekskey(salt, password);
    436 
    437 	var obj = this;
    438 	var i = 0;
    439 	setTimeout(function(){
    440 		if(i < rounds){
    441 			var start = new Date();
    442 			for (; i != rounds;) {
    443 				i = i + 1;
    444 				obj.key(password);
    445 				obj.key(salt);
    446 		                if(i % one_percent == 0){
    447 			        	progress();
    448                 		}
    449 		                if((new Date() - start) > obj.MAX_EXECUTION_TIME){
    450                     			break;
    451 		                }
    452             		}
    453 		        setTimeout(arguments.callee, 0);
    454         	}else{
    455  	        	for (i = 0; i < 64; i++) {
    456                 		for (j = 0; j < (clen >> 1); j++) {
    457                     			obj.encipher(cdata, j << 1);
    458                 		}
    459             		}
    460 			var ret = [];
    461 		        for (i = 0; i < clen; i++) {
    462                 		ret.push(obj.getByte((cdata[i] >> 24) & 0xff));
    463                 		ret.push(obj.getByte((cdata[i] >> 16) & 0xff));
    464                 		ret.push(obj.getByte((cdata[i] >> 8) & 0xff));
    465                 		ret.push(obj.getByte(cdata[i] & 0xff));
    466             		}
    467             		callback(ret);
    468         	}
    469     	}, 0);
    470 };
    471 /*
    472  * callback: a function that will be passed the hash when it is complete
    473  * progress: optional - this function will be called every time 1% of hashing
    474  *      is complete.
    475  */
    476 bCrypt.prototype.hashpw = function(password, salt, callback, progress) {
    477 	var real_salt;
    478 	var passwordb = [];
    479 	var saltb = [];
    480 	var hashed = [];
    481 	var minor = String.fromCharCode(0);
    482 	var rounds = 0;
    483 	var off = 0;
    484 
    485 	if (!progress){
    486 	        var progress = function() {};
    487 	}
    488 
    489 	if (salt.charAt(0) != '$' || salt.charAt(1) != '2')
    490 		throw "Invalid salt version";
    491 	if (salt.charAt(2) == '$')
    492 		off = 3;
    493 	else {
    494 		minor = salt.charAt(2);
    495 		if (minor != 'y' || salt.charAt(3) != '$')
    496 			throw "Invalid salt revision";
    497 		off = 4;
    498 	}
    499 
    500 	// Extract number of rounds
    501 	if (salt.charAt(off + 2) > '$')
    502 		throw "Missing salt rounds";
    503 	var r1 = parseInt(salt.substring(off, off + 1)) * 10;
    504 	var r2 = parseInt(salt.substring(off + 1, off + 2));
    505 	rounds = r1 + r2;
    506 	real_salt = salt.substring(off + 3, off + 25);
    507 	password = password + (minor >= 'a' ? "\000" : "");
    508 	for (var n = 0; n < password.length; n++) {
    509     var c = password.charCodeAt(n);
    510     if (c < 128) {
    511         passwordb.push(c);
    512     }
    513     else if((c > 127) && (c < 2048)) {
    514         passwordb.push((c >> 6) | 192);
    515         passwordb.push((c & 63) | 128);
    516     }
    517     else if ((c >= 55296) && (c <= 56319)) {
    518         n++;
    519         if (n > password.length) {
    520             throw "utf-16 Decoding error: lead surrogate found without trail surrogate";
    521         }
    522         c = password.charCodeAt(n);
    523         if (c < 56320 || c > 57343) {
    524             throw "utf-16 Decoding error: trail surrogate not in the range of 0xdc00 through 0xdfff";
    525         }
    526         c = ((password.charCodeAt(n - 1) - 55296) << 10) + (c - 56320) + 65536;
    527         passwordb.push((c >> 18) | 240);
    528         passwordb.push(((c >> 12) & 63) | 128);
    529         passwordb.push(((c >> 6) & 63) | 128);
    530         passwordb.push((c & 63) | 128);
    531     }
    532     else {
    533         passwordb.push((c >> 12) | 224);
    534         passwordb.push(((c >> 6) & 63) | 128);
    535         passwordb.push((c & 63) | 128);
    536     }
    537 	}
    538 	saltb = this.decode_base64(real_salt, this.BCRYPT_SALT_LEN);
    539 	var obj = this;
    540 	this.crypt_raw(passwordb, saltb, rounds, obj.bf_crypt_ciphertext.slice(), function(hashed) {
    541 		var rs = [];
    542 	        rs.push("$2");
    543 	        if (minor >= 'a')
    544 			rs.push(minor);
    545 		rs.push("$");
    546         	if (rounds < 10)
    547 			rs.push("0");
    548         	rs.push(rounds.toString());
    549 	        rs.push("$");
    550 	        rs.push(obj.encode_base64(saltb, saltb.length));
    551 	        rs.push(obj.encode_base64(hashed, obj.bf_crypt_ciphertext.length * 4 - 1));
    552 	        callback(rs.join(''));
    553 	}, progress);
    554 };
    555 
    556 bCrypt.prototype.gensalt = function(rounds) {
    557 	var iteration_count = rounds;
    558 	if (iteration_count < 4 || iteration_count > 30) {
    559 		throw "Rounds exceded maximum (30)!"
    560 	}
    561 	var output = [];
    562 	output.push("$2a$");
    563 	if (iteration_count < 10)
    564 		output.push("0");
    565 	output.push(iteration_count.toString());
    566 	output.push('$');
    567 	var s1 = [];
    568 	for (var r = 0; r < this.BCRYPT_SALT_LEN; r++){
    569 		s1.push(Math.abs(isaac.rand()));
    570 	}
    571 	output.push(this.encode_base64(s1,this.BCRYPT_SALT_LEN))
    572 	return output.join('');
    573 };
    574 
    575 bCrypt.prototype.ready = function(){
    576 	return true;
    577 };
    578 
    579 bCrypt.prototype.checkpw = function(plaintext, hashed, callback, progress) {
    580 	var off = 0;
    581 	if (hashed.charAt(0) != '$' || hashed.charAt(1) != '2')
    582 		throw "Invalid salt version";
    583 	if (hashed.charAt(2) == '$')
    584 		off = 3;
    585 	else {
    586 		minor = hashed.charAt(2);
    587 		if (minor != 'a' || hashed.charAt(3) != '$') {
    588 			throw "Invalid salt revision";
    589 		}
    590 		off = 4;
    591 	}
    592 	salt = hashed.substring(0, off + 25)
    593 	this.hashpw(plaintext, salt, function(try_pass) {
    594 		var ret = 0;
    595 		for(var i = 0; i < hashed.length; i++){
    596 			ret |= bcrypt.getByte(hashed[i]) ^ bcrypt.getByte(try_pass[i])
    597 		}
    598 		callback(ret == 0);
    599 	}, progress);
    600 };