source: node_modules/bcryptjs/src/bcrypt/impl.js@ 62b2964

finki-main main
Last change on this file since 62b2964 was 81bc7da, checked in by Klimentina Efremova <klimentina08642@…>, 3 months ago

Initial commit

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