Subversion Repositories oidplus

Rev

Rev 642 | Details | Compare with Previous | Last modification | View Log | RSS feed

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