bcrypt-ts 2.1.0 → 2.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "bcrypt-ts",
3
- "version": "2.1.0",
3
+ "version": "2.2.0",
4
4
  "description": "bcrypt written in typescript",
5
5
  "keywords": [
6
6
  "bcrypt",
@@ -14,20 +14,30 @@
14
14
  },
15
15
  "type": "module",
16
16
  "exports": {
17
- "types": "./dist/index.d.ts",
18
- "browser": "./dist/browser.mjs",
19
- "node": "./dist/node.mjs",
20
- "import": "./dist/node.mjs",
21
- "require": "./dist/node.cjs",
22
- "default": "./dist/node.mjs"
17
+ ".": {
18
+ "browser": "./dist/browser.mjs",
19
+ "node": "./dist/node.mjs",
20
+ "import": "./dist/node.mjs",
21
+ "require": "./dist/node.cjs",
22
+ "default": "./dist/node.cjs"
23
+ },
24
+ "./browser": {
25
+ "import": "./dist/browser.mjs",
26
+ "require": "./dist/browser.cjs",
27
+ "default": "./dist/browser.mjs"
28
+ },
29
+ "./node": {
30
+ "import": "./dist/node.mjs",
31
+ "require": "./dist/node.cjs",
32
+ "default": "./dist/node.cjs"
33
+ }
23
34
  },
24
35
  "main": "./dist/node.cjs",
25
36
  "module": "./dist/node.mjs",
26
37
  "browser": "./dist/browser.mjs",
27
38
  "types": "./dist/index.d.ts",
28
39
  "files": [
29
- "dist",
30
- "src"
40
+ "dist"
31
41
  ],
32
42
  "packageManager": "pnpm@7.9.5",
33
43
  "devDependencies": {
package/src/base64.ts DELETED
@@ -1,102 +0,0 @@
1
- import { BASE64_CODE, BASE64_INDEX } from "./constant";
2
-
3
- /**
4
- * Encodes a byte array to base64 with up to len bytes of input, using the custom bcrypt alphabet.
5
- *
6
- * @param byteArray Byte array
7
- * @param length Maximum input length
8
- */
9
- export const encodeBase64 = (
10
- byteArray: number[] | Buffer,
11
- length: number
12
- ): string => {
13
- if (length <= 0 || length > byteArray.length)
14
- throw Error(`Illegal len: ${length}`);
15
-
16
- let off = 0;
17
- let c1: number;
18
- let c2: number;
19
- const rs: string[] = [];
20
-
21
- while (off < length) {
22
- c1 = byteArray[off++] & 0xff;
23
- rs.push(BASE64_CODE[(c1 >> 2) & 0x3f]);
24
- c1 = (c1 & 0x03) << 4;
25
- if (off >= length) {
26
- rs.push(BASE64_CODE[c1 & 0x3f]);
27
- break;
28
- }
29
- c2 = byteArray[off++] & 0xff;
30
- c1 |= (c2 >> 4) & 0x0f;
31
- rs.push(BASE64_CODE[c1 & 0x3f]);
32
- c1 = (c2 & 0x0f) << 2;
33
- if (off >= length) {
34
- rs.push(BASE64_CODE[c1 & 0x3f]);
35
- break;
36
- }
37
- c2 = byteArray[off++] & 0xff;
38
- c1 |= (c2 >> 6) & 0x03;
39
- rs.push(BASE64_CODE[c1 & 0x3f]);
40
- rs.push(BASE64_CODE[c2 & 0x3f]);
41
- }
42
-
43
- return rs.join("");
44
- };
45
-
46
- /**
47
- * Decodes a base64 encoded string to up to len bytes of output, using the custom bcrypt alphabet.
48
- *
49
- * @param contentString String to decode
50
- * @param length Maximum output length
51
- */
52
- export const decodeBase64 = (
53
- contentString: string,
54
- length: number
55
- ): number[] => {
56
- if (length <= 0) throw Error(`Illegal len: ${length}`);
57
-
58
- const stringLength = contentString.length;
59
- let off = 0;
60
- let olen = 0;
61
- let c1: number;
62
- let c2: number;
63
- let c3: number;
64
- let c4: number;
65
- let o: number;
66
- let code: number;
67
- const rs: string[] = [];
68
-
69
- while (off < stringLength - 1 && olen < length) {
70
- code = contentString.charCodeAt(off++);
71
- c1 = code < BASE64_INDEX.length ? BASE64_INDEX[code] : -1;
72
- code = contentString.charCodeAt(off++);
73
- c2 = code < BASE64_INDEX.length ? BASE64_INDEX[code] : -1;
74
-
75
- if (c1 == -1 || c2 == -1) break;
76
-
77
- o = (c1 << 2) >>> 0;
78
- o |= (c2 & 0x30) >> 4;
79
- rs.push(String.fromCharCode(o));
80
-
81
- if (++olen >= length || off >= stringLength) break;
82
-
83
- code = contentString.charCodeAt(off++);
84
- c3 = code < BASE64_INDEX.length ? BASE64_INDEX[code] : -1;
85
- if (c3 == -1) break;
86
- o = ((c2 & 0x0f) << 4) >>> 0;
87
- o |= (c3 & 0x3c) >> 2;
88
- rs.push(String.fromCharCode(o));
89
-
90
- if (++olen >= length || off >= stringLength) break;
91
-
92
- code = contentString.charCodeAt(off++);
93
- c4 = code < BASE64_INDEX.length ? BASE64_INDEX[code] : -1;
94
- o = ((c3 & 0x03) << 6) >>> 0;
95
- o |= c4;
96
- rs.push(String.fromCharCode(o));
97
-
98
- ++olen;
99
- }
100
-
101
- return rs.map((item) => item.charCodeAt(0));
102
- };
package/src/compare.ts DELETED
@@ -1,51 +0,0 @@
1
- import { hash as hashAsync, hashSync } from "./hash";
2
- import { nextTick } from "./utils";
3
-
4
- /**
5
- * Synchronously tests a string against a hash.
6
- *
7
- * @param content String to compare
8
- * @param hash Hash to test against
9
- */
10
- export const compareSync = (content: string, hash: string): boolean => {
11
- if (typeof content !== "string" || typeof hash !== "string")
12
- throw Error("Illegal arguments: " + typeof content + ", " + typeof hash);
13
- if (hash.length !== 60) return false;
14
-
15
- return hashSync(content, hash.substring(0, hash.length - 31)) === hash;
16
- };
17
-
18
- /**
19
- * Asynchronously compares the given data against the given hash.
20
- *
21
- * @param content Data to compare
22
- * @param hash Data to be compared to
23
- * @param progressCallback Callback successively called with the percentage of rounds completed
24
- * (0.0 - 1.0), maximally once per `MAX_EXECUTION_TIME = 100` ms.
25
- */
26
- export const compare = (
27
- content: string,
28
- hash: string,
29
- progressCallback?: (percent: number) => void
30
- ): Promise<boolean> =>
31
- new Promise((resolve, reject) => {
32
- if (typeof content !== "string" || typeof hash !== "string") {
33
- nextTick(() =>
34
- reject(
35
- new Error(`Illegal arguments: ${typeof content}, ${typeof hash}`)
36
- )
37
- );
38
-
39
- return;
40
- }
41
-
42
- if (hash.length !== 60) {
43
- nextTick(() => reject(false));
44
-
45
- return;
46
- }
47
-
48
- hashAsync(content, hash.substring(0, 29), progressCallback)
49
- .then((comp) => resolve(comp === hash))
50
- .catch((err) => reject(err));
51
- });
package/src/constant.ts DELETED
@@ -1,204 +0,0 @@
1
- export const BCRYPT_SALT_LEN = 16;
2
-
3
- export const GENSALT_DEFAULT_LOG2_ROUNDS = 10;
4
-
5
- export const BLOWFISH_NUM_ROUNDS = 16;
6
-
7
- export const MAX_EXECUTION_TIME = 100;
8
-
9
- export const BASE64_CODE =
10
- "./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789".split("");
11
-
12
- export const BASE64_INDEX = [
13
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
14
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
15
- -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
16
- -1, -1, -1, -1, -1, -1, -1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
17
- 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, -1, -1, -1, -1, -1, -1, 28,
18
- 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
19
- 48, 49, 50, 51, 52, 53, -1, -1, -1, -1, -1,
20
- ];
21
-
22
- export const P_ORIG = [
23
- 0x243f6a88, 0x85a308d3, 0x13198a2e, 0x03707344, 0xa4093822, 0x299f31d0,
24
- 0x082efa98, 0xec4e6c89, 0x452821e6, 0x38d01377, 0xbe5466cf, 0x34e90c6c,
25
- 0xc0ac29b7, 0xc97c50dd, 0x3f84d5b5, 0xb5470917, 0x9216d5d9, 0x8979fb1b,
26
- ];
27
-
28
- export const S_ORIG = [
29
- 0xd1310ba6, 0x98dfb5ac, 0x2ffd72db, 0xd01adfb7, 0xb8e1afed, 0x6a267e96,
30
- 0xba7c9045, 0xf12c7f99, 0x24a19947, 0xb3916cf7, 0x0801f2e2, 0x858efc16,
31
- 0x636920d8, 0x71574e69, 0xa458fea3, 0xf4933d7e, 0x0d95748f, 0x728eb658,
32
- 0x718bcd58, 0x82154aee, 0x7b54a41d, 0xc25a59b5, 0x9c30d539, 0x2af26013,
33
- 0xc5d1b023, 0x286085f0, 0xca417918, 0xb8db38ef, 0x8e79dcb0, 0x603a180e,
34
- 0x6c9e0e8b, 0xb01e8a3e, 0xd71577c1, 0xbd314b27, 0x78af2fda, 0x55605c60,
35
- 0xe65525f3, 0xaa55ab94, 0x57489862, 0x63e81440, 0x55ca396a, 0x2aab10b6,
36
- 0xb4cc5c34, 0x1141e8ce, 0xa15486af, 0x7c72e993, 0xb3ee1411, 0x636fbc2a,
37
- 0x2ba9c55d, 0x741831f6, 0xce5c3e16, 0x9b87931e, 0xafd6ba33, 0x6c24cf5c,
38
- 0x7a325381, 0x28958677, 0x3b8f4898, 0x6b4bb9af, 0xc4bfe81b, 0x66282193,
39
- 0x61d809cc, 0xfb21a991, 0x487cac60, 0x5dec8032, 0xef845d5d, 0xe98575b1,
40
- 0xdc262302, 0xeb651b88, 0x23893e81, 0xd396acc5, 0x0f6d6ff3, 0x83f44239,
41
- 0x2e0b4482, 0xa4842004, 0x69c8f04a, 0x9e1f9b5e, 0x21c66842, 0xf6e96c9a,
42
- 0x670c9c61, 0xabd388f0, 0x6a51a0d2, 0xd8542f68, 0x960fa728, 0xab5133a3,
43
- 0x6eef0b6c, 0x137a3be4, 0xba3bf050, 0x7efb2a98, 0xa1f1651d, 0x39af0176,
44
- 0x66ca593e, 0x82430e88, 0x8cee8619, 0x456f9fb4, 0x7d84a5c3, 0x3b8b5ebe,
45
- 0xe06f75d8, 0x85c12073, 0x401a449f, 0x56c16aa6, 0x4ed3aa62, 0x363f7706,
46
- 0x1bfedf72, 0x429b023d, 0x37d0d724, 0xd00a1248, 0xdb0fead3, 0x49f1c09b,
47
- 0x075372c9, 0x80991b7b, 0x25d479d8, 0xf6e8def7, 0xe3fe501a, 0xb6794c3b,
48
- 0x976ce0bd, 0x04c006ba, 0xc1a94fb6, 0x409f60c4, 0x5e5c9ec2, 0x196a2463,
49
- 0x68fb6faf, 0x3e6c53b5, 0x1339b2eb, 0x3b52ec6f, 0x6dfc511f, 0x9b30952c,
50
- 0xcc814544, 0xaf5ebd09, 0xbee3d004, 0xde334afd, 0x660f2807, 0x192e4bb3,
51
- 0xc0cba857, 0x45c8740f, 0xd20b5f39, 0xb9d3fbdb, 0x5579c0bd, 0x1a60320a,
52
- 0xd6a100c6, 0x402c7279, 0x679f25fe, 0xfb1fa3cc, 0x8ea5e9f8, 0xdb3222f8,
53
- 0x3c7516df, 0xfd616b15, 0x2f501ec8, 0xad0552ab, 0x323db5fa, 0xfd238760,
54
- 0x53317b48, 0x3e00df82, 0x9e5c57bb, 0xca6f8ca0, 0x1a87562e, 0xdf1769db,
55
- 0xd542a8f6, 0x287effc3, 0xac6732c6, 0x8c4f5573, 0x695b27b0, 0xbbca58c8,
56
- 0xe1ffa35d, 0xb8f011a0, 0x10fa3d98, 0xfd2183b8, 0x4afcb56c, 0x2dd1d35b,
57
- 0x9a53e479, 0xb6f84565, 0xd28e49bc, 0x4bfb9790, 0xe1ddf2da, 0xa4cb7e33,
58
- 0x62fb1341, 0xcee4c6e8, 0xef20cada, 0x36774c01, 0xd07e9efe, 0x2bf11fb4,
59
- 0x95dbda4d, 0xae909198, 0xeaad8e71, 0x6b93d5a0, 0xd08ed1d0, 0xafc725e0,
60
- 0x8e3c5b2f, 0x8e7594b7, 0x8ff6e2fb, 0xf2122b64, 0x8888b812, 0x900df01c,
61
- 0x4fad5ea0, 0x688fc31c, 0xd1cff191, 0xb3a8c1ad, 0x2f2f2218, 0xbe0e1777,
62
- 0xea752dfe, 0x8b021fa1, 0xe5a0cc0f, 0xb56f74e8, 0x18acf3d6, 0xce89e299,
63
- 0xb4a84fe0, 0xfd13e0b7, 0x7cc43b81, 0xd2ada8d9, 0x165fa266, 0x80957705,
64
- 0x93cc7314, 0x211a1477, 0xe6ad2065, 0x77b5fa86, 0xc75442f5, 0xfb9d35cf,
65
- 0xebcdaf0c, 0x7b3e89a0, 0xd6411bd3, 0xae1e7e49, 0x00250e2d, 0x2071b35e,
66
- 0x226800bb, 0x57b8e0af, 0x2464369b, 0xf009b91e, 0x5563911d, 0x59dfa6aa,
67
- 0x78c14389, 0xd95a537f, 0x207d5ba2, 0x02e5b9c5, 0x83260376, 0x6295cfa9,
68
- 0x11c81968, 0x4e734a41, 0xb3472dca, 0x7b14a94a, 0x1b510052, 0x9a532915,
69
- 0xd60f573f, 0xbc9bc6e4, 0x2b60a476, 0x81e67400, 0x08ba6fb5, 0x571be91f,
70
- 0xf296ec6b, 0x2a0dd915, 0xb6636521, 0xe7b9f9b6, 0xff34052e, 0xc5855664,
71
- 0x53b02d5d, 0xa99f8fa1, 0x08ba4799, 0x6e85076a, 0x4b7a70e9, 0xb5b32944,
72
- 0xdb75092e, 0xc4192623, 0xad6ea6b0, 0x49a7df7d, 0x9cee60b8, 0x8fedb266,
73
- 0xecaa8c71, 0x699a17ff, 0x5664526c, 0xc2b19ee1, 0x193602a5, 0x75094c29,
74
- 0xa0591340, 0xe4183a3e, 0x3f54989a, 0x5b429d65, 0x6b8fe4d6, 0x99f73fd6,
75
- 0xa1d29c07, 0xefe830f5, 0x4d2d38e6, 0xf0255dc1, 0x4cdd2086, 0x8470eb26,
76
- 0x6382e9c6, 0x021ecc5e, 0x09686b3f, 0x3ebaefc9, 0x3c971814, 0x6b6a70a1,
77
- 0x687f3584, 0x52a0e286, 0xb79c5305, 0xaa500737, 0x3e07841c, 0x7fdeae5c,
78
- 0x8e7d44ec, 0x5716f2b8, 0xb03ada37, 0xf0500c0d, 0xf01c1f04, 0x0200b3ff,
79
- 0xae0cf51a, 0x3cb574b2, 0x25837a58, 0xdc0921bd, 0xd19113f9, 0x7ca92ff6,
80
- 0x94324773, 0x22f54701, 0x3ae5e581, 0x37c2dadc, 0xc8b57634, 0x9af3dda7,
81
- 0xa9446146, 0x0fd0030e, 0xecc8c73e, 0xa4751e41, 0xe238cd99, 0x3bea0e2f,
82
- 0x3280bba1, 0x183eb331, 0x4e548b38, 0x4f6db908, 0x6f420d03, 0xf60a04bf,
83
- 0x2cb81290, 0x24977c79, 0x5679b072, 0xbcaf89af, 0xde9a771f, 0xd9930810,
84
- 0xb38bae12, 0xdccf3f2e, 0x5512721f, 0x2e6b7124, 0x501adde6, 0x9f84cd87,
85
- 0x7a584718, 0x7408da17, 0xbc9f9abc, 0xe94b7d8c, 0xec7aec3a, 0xdb851dfa,
86
- 0x63094366, 0xc464c3d2, 0xef1c1847, 0x3215d908, 0xdd433b37, 0x24c2ba16,
87
- 0x12a14d43, 0x2a65c451, 0x50940002, 0x133ae4dd, 0x71dff89e, 0x10314e55,
88
- 0x81ac77d6, 0x5f11199b, 0x043556f1, 0xd7a3c76b, 0x3c11183b, 0x5924a509,
89
- 0xf28fe6ed, 0x97f1fbfa, 0x9ebabf2c, 0x1e153c6e, 0x86e34570, 0xeae96fb1,
90
- 0x860e5e0a, 0x5a3e2ab3, 0x771fe71c, 0x4e3d06fa, 0x2965dcb9, 0x99e71d0f,
91
- 0x803e89d6, 0x5266c825, 0x2e4cc978, 0x9c10b36a, 0xc6150eba, 0x94e2ea78,
92
- 0xa5fc3c53, 0x1e0a2df4, 0xf2f74ea7, 0x361d2b3d, 0x1939260f, 0x19c27960,
93
- 0x5223a708, 0xf71312b6, 0xebadfe6e, 0xeac31f66, 0xe3bc4595, 0xa67bc883,
94
- 0xb17f37d1, 0x018cff28, 0xc332ddef, 0xbe6c5aa5, 0x65582185, 0x68ab9802,
95
- 0xeecea50f, 0xdb2f953b, 0x2aef7dad, 0x5b6e2f84, 0x1521b628, 0x29076170,
96
- 0xecdd4775, 0x619f1510, 0x13cca830, 0xeb61bd96, 0x0334fe1e, 0xaa0363cf,
97
- 0xb5735c90, 0x4c70a239, 0xd59e9e0b, 0xcbaade14, 0xeecc86bc, 0x60622ca7,
98
- 0x9cab5cab, 0xb2f3846e, 0x648b1eaf, 0x19bdf0ca, 0xa02369b9, 0x655abb50,
99
- 0x40685a32, 0x3c2ab4b3, 0x319ee9d5, 0xc021b8f7, 0x9b540b19, 0x875fa099,
100
- 0x95f7997e, 0x623d7da8, 0xf837889a, 0x97e32d77, 0x11ed935f, 0x16681281,
101
- 0x0e358829, 0xc7e61fd6, 0x96dedfa1, 0x7858ba99, 0x57f584a5, 0x1b227263,
102
- 0x9b83c3ff, 0x1ac24696, 0xcdb30aeb, 0x532e3054, 0x8fd948e4, 0x6dbc3128,
103
- 0x58ebf2ef, 0x34c6ffea, 0xfe28ed61, 0xee7c3c73, 0x5d4a14d9, 0xe864b7e3,
104
- 0x42105d14, 0x203e13e0, 0x45eee2b6, 0xa3aaabea, 0xdb6c4f15, 0xfacb4fd0,
105
- 0xc742f442, 0xef6abbb5, 0x654f3b1d, 0x41cd2105, 0xd81e799e, 0x86854dc7,
106
- 0xe44b476a, 0x3d816250, 0xcf62a1f2, 0x5b8d2646, 0xfc8883a0, 0xc1c7b6a3,
107
- 0x7f1524c3, 0x69cb7492, 0x47848a0b, 0x5692b285, 0x095bbf00, 0xad19489d,
108
- 0x1462b174, 0x23820e00, 0x58428d2a, 0x0c55f5ea, 0x1dadf43e, 0x233f7061,
109
- 0x3372f092, 0x8d937e41, 0xd65fecf1, 0x6c223bdb, 0x7cde3759, 0xcbee7460,
110
- 0x4085f2a7, 0xce77326e, 0xa6078084, 0x19f8509e, 0xe8efd855, 0x61d99735,
111
- 0xa969a7aa, 0xc50c06c2, 0x5a04abfc, 0x800bcadc, 0x9e447a2e, 0xc3453484,
112
- 0xfdd56705, 0x0e1e9ec9, 0xdb73dbd3, 0x105588cd, 0x675fda79, 0xe3674340,
113
- 0xc5c43465, 0x713e38d8, 0x3d28f89e, 0xf16dff20, 0x153e21e7, 0x8fb03d4a,
114
- 0xe6e39f2b, 0xdb83adf7, 0xe93d5a68, 0x948140f7, 0xf64c261c, 0x94692934,
115
- 0x411520f7, 0x7602d4f7, 0xbcf46b2e, 0xd4a20068, 0xd4082471, 0x3320f46a,
116
- 0x43b7d4b7, 0x500061af, 0x1e39f62e, 0x97244546, 0x14214f74, 0xbf8b8840,
117
- 0x4d95fc1d, 0x96b591af, 0x70f4ddd3, 0x66a02f45, 0xbfbc09ec, 0x03bd9785,
118
- 0x7fac6dd0, 0x31cb8504, 0x96eb27b3, 0x55fd3941, 0xda2547e6, 0xabca0a9a,
119
- 0x28507825, 0x530429f4, 0x0a2c86da, 0xe9b66dfb, 0x68dc1462, 0xd7486900,
120
- 0x680ec0a4, 0x27a18dee, 0x4f3ffea2, 0xe887ad8c, 0xb58ce006, 0x7af4d6b6,
121
- 0xaace1e7c, 0xd3375fec, 0xce78a399, 0x406b2a42, 0x20fe9e35, 0xd9f385b9,
122
- 0xee39d7ab, 0x3b124e8b, 0x1dc9faf7, 0x4b6d1856, 0x26a36631, 0xeae397b2,
123
- 0x3a6efa74, 0xdd5b4332, 0x6841e7f7, 0xca7820fb, 0xfb0af54e, 0xd8feb397,
124
- 0x454056ac, 0xba489527, 0x55533a3a, 0x20838d87, 0xfe6ba9b7, 0xd096954b,
125
- 0x55a867bc, 0xa1159a58, 0xcca92963, 0x99e1db33, 0xa62a4a56, 0x3f3125f9,
126
- 0x5ef47e1c, 0x9029317c, 0xfdf8e802, 0x04272f70, 0x80bb155c, 0x05282ce3,
127
- 0x95c11548, 0xe4c66d22, 0x48c1133f, 0xc70f86dc, 0x07f9c9ee, 0x41041f0f,
128
- 0x404779a4, 0x5d886e17, 0x325f51eb, 0xd59bc0d1, 0xf2bcc18f, 0x41113564,
129
- 0x257b7834, 0x602a9c60, 0xdff8e8a3, 0x1f636c1b, 0x0e12b4c2, 0x02e1329e,
130
- 0xaf664fd1, 0xcad18115, 0x6b2395e0, 0x333e92e1, 0x3b240b62, 0xeebeb922,
131
- 0x85b2a20e, 0xe6ba0d99, 0xde720c8c, 0x2da2f728, 0xd0127845, 0x95b794fd,
132
- 0x647d0862, 0xe7ccf5f0, 0x5449a36f, 0x877d48fa, 0xc39dfd27, 0xf33e8d1e,
133
- 0x0a476341, 0x992eff74, 0x3a6f6eab, 0xf4f8fd37, 0xa812dc60, 0xa1ebddf8,
134
- 0x991be14c, 0xdb6e6b0d, 0xc67b5510, 0x6d672c37, 0x2765d43b, 0xdcd0e804,
135
- 0xf1290dc7, 0xcc00ffa3, 0xb5390f92, 0x690fed0b, 0x667b9ffb, 0xcedb7d9c,
136
- 0xa091cf0b, 0xd9155ea3, 0xbb132f88, 0x515bad24, 0x7b9479bf, 0x763bd6eb,
137
- 0x37392eb3, 0xcc115979, 0x8026e297, 0xf42e312d, 0x6842ada7, 0xc66a2b3b,
138
- 0x12754ccc, 0x782ef11c, 0x6a124237, 0xb79251e7, 0x06a1bbe6, 0x4bfb6350,
139
- 0x1a6b1018, 0x11caedfa, 0x3d25bdd8, 0xe2e1c3c9, 0x44421659, 0x0a121386,
140
- 0xd90cec6e, 0xd5abea2a, 0x64af674e, 0xda86a85f, 0xbebfe988, 0x64e4c3fe,
141
- 0x9dbc8057, 0xf0f7c086, 0x60787bf8, 0x6003604d, 0xd1fd8346, 0xf6381fb0,
142
- 0x7745ae04, 0xd736fccc, 0x83426b33, 0xf01eab71, 0xb0804187, 0x3c005e5f,
143
- 0x77a057be, 0xbde8ae24, 0x55464299, 0xbf582e61, 0x4e58f48f, 0xf2ddfda2,
144
- 0xf474ef38, 0x8789bdc2, 0x5366f9c3, 0xc8b38e74, 0xb475f255, 0x46fcd9b9,
145
- 0x7aeb2661, 0x8b1ddf84, 0x846a0e79, 0x915f95e2, 0x466e598e, 0x20b45770,
146
- 0x8cd55591, 0xc902de4c, 0xb90bace1, 0xbb8205d0, 0x11a86248, 0x7574a99e,
147
- 0xb77f19b6, 0xe0a9dc09, 0x662d09a1, 0xc4324633, 0xe85a1f02, 0x09f0be8c,
148
- 0x4a99a025, 0x1d6efe10, 0x1ab93d1d, 0x0ba5a4df, 0xa186f20f, 0x2868f169,
149
- 0xdcb7da83, 0x573906fe, 0xa1e2ce9b, 0x4fcd7f52, 0x50115e01, 0xa70683fa,
150
- 0xa002b5c4, 0x0de6d027, 0x9af88c27, 0x773f8641, 0xc3604c06, 0x61a806b5,
151
- 0xf0177a28, 0xc0f586e0, 0x006058aa, 0x30dc7d62, 0x11e69ed7, 0x2338ea63,
152
- 0x53c2dd94, 0xc2c21634, 0xbbcbee56, 0x90bcb6de, 0xebfc7da1, 0xce591d76,
153
- 0x6f05e409, 0x4b7c0188, 0x39720a3d, 0x7c927c24, 0x86e3725f, 0x724d9db9,
154
- 0x1ac15bb4, 0xd39eb8fc, 0xed545578, 0x08fca5b5, 0xd83d7cd3, 0x4dad0fc4,
155
- 0x1e50ef5e, 0xb161e6f8, 0xa28514d9, 0x6c51133c, 0x6fd5c7e7, 0x56e14ec4,
156
- 0x362abfce, 0xddc6c837, 0xd79a3234, 0x92638212, 0x670efa8e, 0x406000e0,
157
- 0x3a39ce37, 0xd3faf5cf, 0xabc27737, 0x5ac52d1b, 0x5cb0679e, 0x4fa33742,
158
- 0xd3822740, 0x99bc9bbe, 0xd5118e9d, 0xbf0f7315, 0xd62d1c7e, 0xc700c47b,
159
- 0xb78c1b6b, 0x21a19045, 0xb26eb1be, 0x6a366eb4, 0x5748ab2f, 0xbc946e79,
160
- 0xc6a376d2, 0x6549c2c8, 0x530ff8ee, 0x468dde7d, 0xd5730a1d, 0x4cd04dc6,
161
- 0x2939bbdb, 0xa9ba4650, 0xac9526e8, 0xbe5ee304, 0xa1fad5f0, 0x6a2d519a,
162
- 0x63ef8ce2, 0x9a86ee22, 0xc089c2b8, 0x43242ef6, 0xa51e03aa, 0x9cf2d0a4,
163
- 0x83c061ba, 0x9be96a4d, 0x8fe51550, 0xba645bd6, 0x2826a2f9, 0xa73a3ae1,
164
- 0x4ba99586, 0xef5562e9, 0xc72fefd3, 0xf752f7da, 0x3f046f69, 0x77fa0a59,
165
- 0x80e4a915, 0x87b08601, 0x9b09e6ad, 0x3b3ee593, 0xe990fd5a, 0x9e34d797,
166
- 0x2cf0b7d9, 0x022b8b51, 0x96d5ac3a, 0x017da67d, 0xd1cf3ed6, 0x7c7d2d28,
167
- 0x1f9f25cf, 0xadf2b89b, 0x5ad6b472, 0x5a88f54c, 0xe029ac71, 0xe019a5e6,
168
- 0x47b0acfd, 0xed93fa9b, 0xe8d3c48d, 0x283b57cc, 0xf8d56629, 0x79132e28,
169
- 0x785f0191, 0xed756055, 0xf7960e44, 0xe3d35e8c, 0x15056dd4, 0x88f46dba,
170
- 0x03a16125, 0x0564f0bd, 0xc3eb9e15, 0x3c9057a2, 0x97271aec, 0xa93a072a,
171
- 0x1b3f6d9b, 0x1e6321f5, 0xf59c66fb, 0x26dcf319, 0x7533d928, 0xb155fdf5,
172
- 0x03563482, 0x8aba3cbb, 0x28517711, 0xc20ad9f8, 0xabcc5167, 0xccad925f,
173
- 0x4de81751, 0x3830dc8e, 0x379d5862, 0x9320f991, 0xea7a90c2, 0xfb3e7bce,
174
- 0x5121ce64, 0x774fbe32, 0xa8b6e37e, 0xc3293d46, 0x48de5369, 0x6413e680,
175
- 0xa2ae0810, 0xdd6db224, 0x69852dfd, 0x09072166, 0xb39a460a, 0x6445c0dd,
176
- 0x586cdecf, 0x1c20c8ae, 0x5bbef7dd, 0x1b588d40, 0xccd2017f, 0x6bb4e3bb,
177
- 0xdda26a7e, 0x3a59ff45, 0x3e350a44, 0xbcb4cdd5, 0x72eacea8, 0xfa6484bb,
178
- 0x8d6612ae, 0xbf3c6f47, 0xd29be463, 0x542f5d9e, 0xaec2771b, 0xf64e6370,
179
- 0x740e0d8d, 0xe75b1357, 0xf8721671, 0xaf537d5d, 0x4040cb08, 0x4eb4e2cc,
180
- 0x34d2466a, 0x0115af84, 0xe1b00428, 0x95983a1d, 0x06b89fb4, 0xce6ea048,
181
- 0x6f3f3b82, 0x3520ab82, 0x011a1d4b, 0x277227f8, 0x611560b1, 0xe7933fdc,
182
- 0xbb3a792b, 0x344525bd, 0xa08839e1, 0x51ce794b, 0x2f32c9b7, 0xa01fbac9,
183
- 0xe01cc87e, 0xbcc7d1f6, 0xcf0111c3, 0xa1e8aac7, 0x1a908749, 0xd44fbd9a,
184
- 0xd0dadecb, 0xd50ada38, 0x0339c32a, 0xc6913667, 0x8df9317c, 0xe0b12b4f,
185
- 0xf79e59b7, 0x43f5bb3a, 0xf2d519ff, 0x27d9459c, 0xbf97222c, 0x15e6fc2a,
186
- 0x0f91fc71, 0x9b941525, 0xfae59361, 0xceb69ceb, 0xc2a86459, 0x12baa8d1,
187
- 0xb6c1075e, 0xe3056a0c, 0x10d25065, 0xcb03a442, 0xe0ec6e0e, 0x1698db3b,
188
- 0x4c98a0be, 0x3278e964, 0x9f1f9532, 0xe0d392df, 0xd3a0342b, 0x8971f21e,
189
- 0x1b0a7441, 0x4ba3348c, 0xc5be7120, 0xc37632d8, 0xdf359f8d, 0x9b992f2e,
190
- 0xe60b6f47, 0x0fe3f11d, 0xe54cda54, 0x1edad891, 0xce6279cf, 0xcd3e7e6f,
191
- 0x1618b166, 0xfd2c1d05, 0x848fd2c5, 0xf6fb2299, 0xf523f357, 0xa6327623,
192
- 0x93a83531, 0x56cccd02, 0xacf08162, 0x5a75ebb5, 0x6e163697, 0x88d273cc,
193
- 0xde966292, 0x81b949d0, 0x4c50901b, 0x71c65614, 0xe6c6c7bd, 0x327a140a,
194
- 0x45e1d006, 0xc3f27b9a, 0xc9aa53fd, 0x62a80f00, 0xbb25bfe2, 0x35bdd2f6,
195
- 0x71126905, 0xb2040222, 0xb6cbcf7c, 0xcd769c2b, 0x53113ec0, 0x1640e3d3,
196
- 0x38abbd60, 0x2547adf0, 0xba38209c, 0xf746ce76, 0x77afa1c5, 0x20756060,
197
- 0x85cbfe4e, 0x8ae88dd8, 0x7aaaf9b0, 0x4cf9aa7e, 0x1948c25c, 0x02fb8a8c,
198
- 0x01c36ae4, 0xd6ebe1f9, 0x90d4f869, 0xa65cdea0, 0x3f09252d, 0xc208e69f,
199
- 0xb74e6132, 0xce77e25b, 0x578fdfe3, 0x3ac372e6,
200
- ];
201
-
202
- export const C_ORIG = [
203
- 0x4f727068, 0x65616e42, 0x65686f6c, 0x64657253, 0x63727944, 0x6f756274,
204
- ];
package/src/crypt.ts DELETED
@@ -1,307 +0,0 @@
1
- import {
2
- BCRYPT_SALT_LEN,
3
- BLOWFISH_NUM_ROUNDS,
4
- MAX_EXECUTION_TIME,
5
- C_ORIG,
6
- P_ORIG,
7
- S_ORIG,
8
- } from "./constant";
9
- import { nextTick } from "./utils";
10
-
11
- // A base64 implementation for the bcrypt algorithm. This is partly non-standard.
12
-
13
- const encipher = (
14
- lr: number[],
15
- off: number,
16
- P: Int32Array | number[],
17
- S: Int32Array | number[]
18
- ): number[] => {
19
- // This is our bottleneck: 1714/1905 ticks / 90% - see profile.txt
20
- let n: number;
21
- let l = lr[off];
22
- let r = lr[off + 1];
23
-
24
- l ^= P[0];
25
-
26
- //The following is an unrolled version of the above loop.
27
- //Iteration 0
28
- n = S[l >>> 24];
29
- n += S[0x100 | ((l >> 16) & 0xff)];
30
- n ^= S[0x200 | ((l >> 8) & 0xff)];
31
- n += S[0x300 | (l & 0xff)];
32
- r ^= n ^ P[1];
33
- n = S[r >>> 24];
34
- n += S[0x100 | ((r >> 16) & 0xff)];
35
- n ^= S[0x200 | ((r >> 8) & 0xff)];
36
- n += S[0x300 | (r & 0xff)];
37
- l ^= n ^ P[2];
38
- //Iteration 1
39
- n = S[l >>> 24];
40
- n += S[0x100 | ((l >> 16) & 0xff)];
41
- n ^= S[0x200 | ((l >> 8) & 0xff)];
42
- n += S[0x300 | (l & 0xff)];
43
- r ^= n ^ P[3];
44
- n = S[r >>> 24];
45
- n += S[0x100 | ((r >> 16) & 0xff)];
46
- n ^= S[0x200 | ((r >> 8) & 0xff)];
47
- n += S[0x300 | (r & 0xff)];
48
- l ^= n ^ P[4];
49
- //Iteration 2
50
- n = S[l >>> 24];
51
- n += S[0x100 | ((l >> 16) & 0xff)];
52
- n ^= S[0x200 | ((l >> 8) & 0xff)];
53
- n += S[0x300 | (l & 0xff)];
54
- r ^= n ^ P[5];
55
- n = S[r >>> 24];
56
- n += S[0x100 | ((r >> 16) & 0xff)];
57
- n ^= S[0x200 | ((r >> 8) & 0xff)];
58
- n += S[0x300 | (r & 0xff)];
59
- l ^= n ^ P[6];
60
- //Iteration 3
61
- n = S[l >>> 24];
62
- n += S[0x100 | ((l >> 16) & 0xff)];
63
- n ^= S[0x200 | ((l >> 8) & 0xff)];
64
- n += S[0x300 | (l & 0xff)];
65
- r ^= n ^ P[7];
66
- n = S[r >>> 24];
67
- n += S[0x100 | ((r >> 16) & 0xff)];
68
- n ^= S[0x200 | ((r >> 8) & 0xff)];
69
- n += S[0x300 | (r & 0xff)];
70
- l ^= n ^ P[8];
71
- //Iteration 4
72
- n = S[l >>> 24];
73
- n += S[0x100 | ((l >> 16) & 0xff)];
74
- n ^= S[0x200 | ((l >> 8) & 0xff)];
75
- n += S[0x300 | (l & 0xff)];
76
- r ^= n ^ P[9];
77
- n = S[r >>> 24];
78
- n += S[0x100 | ((r >> 16) & 0xff)];
79
- n ^= S[0x200 | ((r >> 8) & 0xff)];
80
- n += S[0x300 | (r & 0xff)];
81
- l ^= n ^ P[10];
82
- //Iteration 5
83
- n = S[l >>> 24];
84
- n += S[0x100 | ((l >> 16) & 0xff)];
85
- n ^= S[0x200 | ((l >> 8) & 0xff)];
86
- n += S[0x300 | (l & 0xff)];
87
- r ^= n ^ P[11];
88
- n = S[r >>> 24];
89
- n += S[0x100 | ((r >> 16) & 0xff)];
90
- n ^= S[0x200 | ((r >> 8) & 0xff)];
91
- n += S[0x300 | (r & 0xff)];
92
- l ^= n ^ P[12];
93
- //Iteration 6
94
- n = S[l >>> 24];
95
- n += S[0x100 | ((l >> 16) & 0xff)];
96
- n ^= S[0x200 | ((l >> 8) & 0xff)];
97
- n += S[0x300 | (l & 0xff)];
98
- r ^= n ^ P[13];
99
- n = S[r >>> 24];
100
- n += S[0x100 | ((r >> 16) & 0xff)];
101
- n ^= S[0x200 | ((r >> 8) & 0xff)];
102
- n += S[0x300 | (r & 0xff)];
103
- l ^= n ^ P[14];
104
- //Iteration 7
105
- n = S[l >>> 24];
106
- n += S[0x100 | ((l >> 16) & 0xff)];
107
- n ^= S[0x200 | ((l >> 8) & 0xff)];
108
- n += S[0x300 | (l & 0xff)];
109
- r ^= n ^ P[15];
110
- n = S[r >>> 24];
111
- n += S[0x100 | ((r >> 16) & 0xff)];
112
- n ^= S[0x200 | ((r >> 8) & 0xff)];
113
- n += S[0x300 | (r & 0xff)];
114
- l ^= n ^ P[16];
115
-
116
- lr[off] = r ^ P[BLOWFISH_NUM_ROUNDS + 1];
117
- lr[off + 1] = l;
118
-
119
- return lr;
120
- };
121
-
122
- const streamtoword = (
123
- data: number[],
124
- offp: number
125
- ): { key: number; offp: number } => {
126
- let word = 0;
127
-
128
- for (let i = 0; i < 4; ++i)
129
- (word = (word << 8) | (data[offp] & 0xff)),
130
- (offp = (offp + 1) % data.length);
131
-
132
- return { key: word, offp: offp };
133
- };
134
-
135
- const key = (
136
- key: number[],
137
- P: Int32Array | number[],
138
- S: Int32Array | number[]
139
- ): void => {
140
- const pLength = P.length;
141
- const sLength = S.length;
142
- let offp = 0;
143
- let lr = [0, 0];
144
- let sw: {
145
- key: number;
146
- offp: number;
147
- };
148
-
149
- for (let i = 0; i < pLength; i++)
150
- (sw = streamtoword(key, offp)), (offp = sw.offp), (P[i] = P[i] ^ sw.key);
151
-
152
- for (let i = 0; i < pLength; i += 2)
153
- (lr = encipher(lr, 0, P, S)), (P[i] = lr[0]), (P[i + 1] = lr[1]);
154
-
155
- for (let i = 0; i < sLength; i += 2)
156
- (lr = encipher(lr, 0, P, S)), (S[i] = lr[0]), (S[i + 1] = lr[1]);
157
- };
158
-
159
- /**
160
- * Expensive key schedule Blowfish.
161
- */
162
- const ekskey = (
163
- data: number[],
164
- key: number[],
165
- P: Int32Array | number[],
166
- S: Int32Array | number[]
167
- ): void => {
168
- const pLength = P.length;
169
- const sLength = S.length;
170
- let offp = 0;
171
- let lr = [0, 0];
172
- let sw: {
173
- key: number;
174
- offp: number;
175
- };
176
-
177
- for (let i = 0; i < pLength; i++)
178
- (sw = streamtoword(key, offp)), (offp = sw.offp), (P[i] = P[i] ^ sw.key);
179
-
180
- offp = 0;
181
-
182
- for (let i = 0; i < pLength; i += 2)
183
- (sw = streamtoword(data, offp)),
184
- (offp = sw.offp),
185
- (lr[0] ^= sw.key),
186
- (sw = streamtoword(data, offp)),
187
- (offp = sw.offp),
188
- (lr[1] ^= sw.key),
189
- (lr = encipher(lr, 0, P, S)),
190
- (P[i] = lr[0]),
191
- (P[i + 1] = lr[1]);
192
-
193
- for (let i = 0; i < sLength; i += 2)
194
- (sw = streamtoword(data, offp)),
195
- (offp = sw.offp),
196
- (lr[0] ^= sw.key),
197
- (sw = streamtoword(data, offp)),
198
- (offp = sw.offp),
199
- (lr[1] ^= sw.key),
200
- (lr = encipher(lr, 0, P, S)),
201
- (S[i] = lr[0]),
202
- (S[i + 1] = lr[1]);
203
- };
204
-
205
- /**
206
- * Internaly crypts a string.
207
- *
208
- * @param bytes Bytes to crypt
209
- * @param salt Salt bytes to use
210
- * @param rounds Number of rounds
211
- * @param progressCallback Callback called with the current progress
212
- */
213
- export const crypt = (
214
- bytes: number[],
215
- salt: number[],
216
- rounds: number,
217
- sync: boolean,
218
- progressCallback?: (progress: number) => void
219
- ): Promise<number[]> | number[] => {
220
- const cdata = C_ORIG.slice();
221
- const cLength = cdata.length;
222
-
223
- // Validate
224
- if (rounds < 4 || rounds > 31) {
225
- const err = new Error(`Illegal number of rounds (4-31): ${rounds}`);
226
-
227
- if (sync === false) return Promise.reject(err);
228
-
229
- throw err;
230
- }
231
-
232
- if (salt.length !== BCRYPT_SALT_LEN) {
233
- const err = new Error(
234
- `Illegal salt length: ${salt.length} != ${BCRYPT_SALT_LEN}`
235
- );
236
-
237
- if (sync === false) return Promise.reject(err);
238
-
239
- throw err;
240
- }
241
-
242
- rounds = (1 << rounds) >>> 0;
243
-
244
- let P: Int32Array | number[];
245
- let S: Int32Array | number[];
246
- let i = 0;
247
- let j: number;
248
-
249
- //Use typed arrays when available - huge speedup!
250
- if (Int32Array) {
251
- P = new Int32Array(P_ORIG);
252
- S = new Int32Array(S_ORIG);
253
- } else {
254
- P = P_ORIG.slice();
255
- S = S_ORIG.slice();
256
- }
257
-
258
- ekskey(salt, bytes, P, S);
259
-
260
- /**
261
- * Calcualtes the next round.
262
- */
263
- const next = (): Promise<number[] | undefined> | number[] | void => {
264
- if (progressCallback) progressCallback(i / rounds);
265
-
266
- if (i < rounds) {
267
- const start = Date.now();
268
-
269
- for (; i < rounds; ) {
270
- i = i + 1;
271
- key(bytes, P, S);
272
- key(salt, P, S);
273
- if (Date.now() - start > MAX_EXECUTION_TIME) break;
274
- }
275
- } else {
276
- for (i = 0; i < 64; i++)
277
- for (j = 0; j < cLength >> 1; j++) encipher(cdata, j << 1, P, S);
278
- const ret: number[] = [];
279
-
280
- for (i = 0; i < cLength; i++)
281
- ret.push(((cdata[i] >> 24) & 0xff) >>> 0),
282
- ret.push(((cdata[i] >> 16) & 0xff) >>> 0),
283
- ret.push(((cdata[i] >> 8) & 0xff) >>> 0),
284
- ret.push((cdata[i] & 0xff) >>> 0);
285
-
286
- if (sync === false) return Promise.resolve(ret);
287
-
288
- return ret;
289
- }
290
-
291
- if (sync === false)
292
- return new Promise((resolve) =>
293
- nextTick(() => {
294
- void (next() as Promise<number[] | undefined>).then(resolve);
295
- })
296
- );
297
- };
298
-
299
- if (sync === false) return next() as Promise<number[]>;
300
- else {
301
- let res;
302
-
303
- // eslint-disable-next-line no-constant-condition
304
- while (true)
305
- if (typeof (res = next()) !== "undefined") return (res as number[]) || [];
306
- }
307
- };
package/src/hash.ts DELETED
@@ -1,168 +0,0 @@
1
- import { encodeBase64, decodeBase64 } from "./base64";
2
- import {
3
- BCRYPT_SALT_LEN,
4
- C_ORIG,
5
- GENSALT_DEFAULT_LOG2_ROUNDS,
6
- } from "./constant";
7
- import { crypt } from "./crypt";
8
- import { genSalt, genSaltSync } from "./salt";
9
- import { stringToBytes } from "./utils";
10
-
11
- /**
12
- * Internally hashes a string.
13
- *
14
- * @param contentString String to hash
15
- * @param salt Salt to use, actually never null
16
- * @param {function(Error, string=)=} callback Callback receiving the error, if any, and the resulting hash. If omitted,
17
- * hashing is perormed synchronously.
18
- * @param {function(number)=} progressCallback Callback called with the current progress
19
- * @returns {string|undefined} Resulting hash if callback has been omitted, otherwise `undefined`
20
- * @inner
21
- */
22
- function _hash(
23
- contentString: string,
24
- salt: string,
25
- sync: boolean,
26
- progressCallback?: (progress: number) => void
27
- ): Promise<string> | string {
28
- if (typeof contentString !== "string" || typeof salt !== "string") {
29
- const err = new Error("Invalid string / salt: Not a string");
30
-
31
- if (sync === false) return Promise.reject(err);
32
-
33
- throw err;
34
- }
35
-
36
- // Validate the salt
37
- let minor: string;
38
- let offset: number;
39
-
40
- if (salt.charAt(0) !== "$" || salt.charAt(1) !== "2") {
41
- const err = new Error("Invalid salt version: " + salt.substring(0, 2));
42
-
43
- if (sync === false) return Promise.reject(err);
44
-
45
- throw err;
46
- }
47
- if (salt.charAt(2) === "$") (minor = String.fromCharCode(0)), (offset = 3);
48
- else {
49
- minor = salt.charAt(2);
50
- if (
51
- (minor !== "a" && minor !== "b" && minor !== "y") ||
52
- salt.charAt(3) !== "$"
53
- ) {
54
- const err = Error("Invalid salt revision: " + salt.substring(2, 4));
55
-
56
- if (sync === false) return Promise.reject(err);
57
-
58
- throw err;
59
- }
60
- offset = 4;
61
- }
62
-
63
- // Extract number of rounds
64
- if (salt.charAt(offset + 2) > "$") {
65
- const err = new Error("Missing salt rounds");
66
-
67
- if (sync === false) return Promise.reject(err);
68
-
69
- throw err;
70
- }
71
-
72
- const r1 = parseInt(salt.substring(offset, offset + 1), 10) * 10,
73
- r2 = parseInt(salt.substring(offset + 1, offset + 2), 10),
74
- rounds = r1 + r2,
75
- realSalt = salt.substring(offset + 3, offset + 25);
76
-
77
- contentString += minor >= "a" ? "\x00" : "";
78
-
79
- const passwordBytes = stringToBytes(contentString),
80
- saltBytes = decodeBase64(realSalt, BCRYPT_SALT_LEN);
81
-
82
- /**
83
- * Finishes hashing.
84
- * @param bytes Byte array
85
- */
86
- const finish = (bytes: number[]): string => {
87
- const res = [];
88
-
89
- res.push("$2");
90
- if (minor >= "a") res.push(minor);
91
- res.push("$");
92
- if (rounds < 10) res.push("0");
93
- res.push(rounds.toString());
94
- res.push("$");
95
- res.push(encodeBase64(saltBytes, saltBytes.length));
96
- res.push(encodeBase64(bytes, C_ORIG.length * 4 - 1));
97
-
98
- return res.join("");
99
- };
100
-
101
- // Sync
102
- if (sync === false)
103
- return (
104
- crypt(
105
- passwordBytes,
106
- saltBytes,
107
- rounds,
108
- false,
109
- progressCallback
110
- ) as Promise<number[]>
111
- ).then((bytes) => finish(bytes));
112
-
113
- return finish(
114
- crypt(passwordBytes, saltBytes, rounds, true, progressCallback) as number[]
115
- );
116
- }
117
-
118
- /**
119
- * Synchronously generates a hash for the given string.
120
- *
121
- * @param contentString String to hash
122
- * @param salt Salt length to generate or salt to use, default to 10
123
- * @returns Resulting hash
124
- */
125
- export const hashSync = (
126
- contentString: string,
127
- salt: string | number = GENSALT_DEFAULT_LOG2_ROUNDS
128
- ): string => {
129
- if (typeof salt === "number") salt = genSaltSync(salt);
130
- if (typeof contentString !== "string" || typeof salt !== "string")
131
- throw Error(
132
- "Illegal arguments: " + typeof contentString + ", " + typeof salt
133
- );
134
-
135
- return _hash(contentString, salt, true) as string;
136
- };
137
-
138
- /**
139
- * Asynchronously generates a hash for the given string.
140
- *
141
- * @param contentString String to hash
142
- * @param salt Salt length to generate or salt to use
143
- * @param progressCallback Callback successively called with the percentage of rounds completed
144
- * (0.0 - 1.0), maximally once per `MAX_EXECUTION_TIME = 100` ms.
145
- */
146
- export const hash = function (
147
- contentString: string,
148
- salt: number | string,
149
- progressCallback?: (progress: number) => void
150
- ): Promise<string> {
151
- if (typeof contentString === "string" && typeof salt === "number")
152
- return genSalt(salt).then(
153
- (salt) =>
154
- _hash(contentString, salt, false, progressCallback) as Promise<string>
155
- );
156
-
157
- if (typeof contentString === "string" && typeof salt === "string")
158
- return _hash(
159
- contentString,
160
- salt,
161
- false,
162
- progressCallback
163
- ) as Promise<string>;
164
-
165
- return Promise.reject(
166
- new Error(`Illegal arguments: ${typeof contentString}, ${typeof salt}`)
167
- );
168
- };
package/src/helpers.ts DELETED
@@ -1,30 +0,0 @@
1
- /**
2
- * Gets the number of rounds used to encrypt the specified hash.
3
- *
4
- * @param hash Hash to extract the used number of rounds from
5
- * @returns Number of rounds used
6
- * @throws {Error} If `hash` is not a string
7
- */
8
- export const getRounds = (hash: string): number => {
9
- if (typeof hash !== "string")
10
- throw new Error(`Illegal arguments: ${typeof hash}`);
11
-
12
- return parseInt(hash.split("$")[2], 10);
13
- };
14
-
15
- /**
16
- * Gets the salt portion from a hash. Does not validate the hash.
17
- *
18
- * @param hash Hash to extract the salt from
19
- * @returns Extracted salt part
20
- * @throws {Error} If `hash` is not a string or otherwise invalid
21
- */
22
- export const getSalt = (hash: string): string => {
23
- if (typeof hash !== "string")
24
- throw new Error(`Illegal arguments: ${typeof hash}`);
25
-
26
- if (hash.length !== 60)
27
- throw new Error(`Illegal hash length: ${hash.length} != 60`);
28
-
29
- return hash.substring(0, 29);
30
- };
package/src/index.ts DELETED
@@ -1,39 +0,0 @@
1
- /**
2
- * Copyright (c) 2012 Nevins Bartolomeo <nevins.bartolomeo@gmail.com>
3
- * Copyright (c) 2012 Shane Girish <shaneGirish@gmail.com>
4
- * Copyright (c) 2014 Daniel Wirtz <dcode@dcode.io>
5
- *
6
- * Redistribution and use in source and binary forms, with or without
7
- * modification, are permitted provided that the following conditions
8
- * are met:
9
- * 1. Redistributions of source code must retain the above copyright
10
- * notice, this list of conditions and the following disclaimer.
11
- * 2. Redistributions in binary form must reproduce the above copyright
12
- * notice, this list of conditions and the following disclaimer in the
13
- * documentation and/or other materials provided with the distribution.
14
- * 3. The name of the author may not be used to endorse or promote products
15
- * derived from this software without specific prior written permission.
16
- *
17
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27
- */
28
-
29
- /**
30
- * @license bcrypt.js (c) 2013 Daniel Wirtz <dcode@dcode.io>
31
- * Released under the Apache License, Version 2.0
32
- * see: https://github.com/dcodeIO/bcrypt.js for details
33
- */
34
-
35
- export * from "./base64";
36
- export * from "./compare";
37
- export * from "./hash";
38
- export * from "./helpers";
39
- export * from "./salt";
@@ -1,23 +0,0 @@
1
- /**
2
- * Generates cryptographically secure random bytes.
3
- *
4
- * @param length Bytes length
5
- * @returns Random bytes
6
- * @throws {Error} If no random implementation is available
7
- */
8
- export const random = (length: number): number[] => {
9
- try {
10
- let array: Uint32Array;
11
-
12
- // eslint-disable-next-line @typescript-eslint/ban-ts-comment
13
- // @ts-ignore
14
- (self["crypto"] || self["msCrypto"])["getRandomValues"](
15
- (array = new Uint32Array(length))
16
- );
17
-
18
- // eslint-disable-next-line @typescript-eslint/no-unsafe-return
19
- return Array.prototype.slice.call(array);
20
- } catch (err) {
21
- throw Error("WebCryptoAPI is not available");
22
- }
23
- };
@@ -1,10 +0,0 @@
1
- import { randomBytes } from "node:crypto";
2
-
3
- /**
4
- * Generates cryptographically secure random bytes.
5
- *
6
- * @param length Bytes length
7
- * @returns Random bytes
8
- * @throws {Error} If no random implementation is available
9
- */
10
- export const random = (length: number): Buffer => randomBytes(length);
package/src/salt.ts DELETED
@@ -1,51 +0,0 @@
1
- import { BCRYPT_SALT_LEN, GENSALT_DEFAULT_LOG2_ROUNDS } from "./constant";
2
- import { encodeBase64 } from "./base64";
3
- import { nextTick } from "./utils";
4
- import { random } from "@random";
5
-
6
- /**
7
- * Synchronously generates a salt.
8
- *
9
- * @param rounds Number of rounds to use, defaults to 10 if omitted
10
- * @returns Resulting salt
11
- * @throws {Error} If a random fallback is required but not set
12
- */
13
- export const genSaltSync = (rounds = GENSALT_DEFAULT_LOG2_ROUNDS): string => {
14
- if (typeof rounds !== "number")
15
- throw Error("Illegal arguments: " + typeof rounds);
16
- if (rounds < 4) rounds = 4;
17
- else if (rounds > 31) rounds = 31;
18
-
19
- const salt = [];
20
-
21
- salt.push("$2a$");
22
- if (rounds < 10) salt.push("0");
23
- salt.push(rounds.toString());
24
- salt.push("$");
25
- salt.push(encodeBase64(random(BCRYPT_SALT_LEN), BCRYPT_SALT_LEN)); // May throw
26
-
27
- return salt.join("");
28
- };
29
-
30
- /**
31
- * Asynchronously generates a salt.
32
- *
33
- * @param rounds Number of rounds to use, defaults to 10 if omitted
34
- */
35
- export const genSalt = (
36
- rounds = GENSALT_DEFAULT_LOG2_ROUNDS
37
- ): Promise<string> => {
38
- if (typeof rounds !== "number")
39
- throw Error("illegal arguments: " + typeof rounds);
40
-
41
- return new Promise((resolve, reject) =>
42
- nextTick(() => {
43
- // Pretty thin, but salting is fast enough
44
- try {
45
- resolve(genSaltSync(rounds));
46
- } catch (err) {
47
- reject(err);
48
- }
49
- })
50
- );
51
- };
@@ -1,3 +0,0 @@
1
- declare module "@random" {
2
- export const random: (length: number) => number[] | Buffer;
3
- }
package/src/utfx.ts DELETED
@@ -1,232 +0,0 @@
1
- /**
2
- * utfx-embeddable (c) 2014 Daniel Wirtz <dcode@dcode.io>
3
- * Released under the Apache License, Version 2.0
4
- * see: https://github.com/dcodeIO/utfx for details
5
- */
6
-
7
- export const MAX_CODEPOINT = 0x10ffff;
8
-
9
- /**
10
- * Encodes UTF8 code points to UTF8 bytes.
11
- * @param {(!function():number|null) | number} src Code points source, either as a function returning the next code point
12
- * respectively `null` if there are no more code points left or a single numeric code point.
13
- * @param {!function(number)} dst Bytes destination as a function successively called with the next byte
14
- */
15
- export const encodeUTF8 = (
16
- src: number | (() => number | null),
17
- dst: (byte: number) => void
18
- ): void => {
19
- let cp = null;
20
-
21
- if (typeof src === "number") (cp = src), (src = (): null => null);
22
-
23
- while (cp !== null || (cp = src()) !== null) {
24
- if (cp < 0x80) dst(cp & 0x7f);
25
- else if (cp < 0x800)
26
- dst(((cp >> 6) & 0x1f) | 0xc0), dst((cp & 0x3f) | 0x80);
27
- else if (cp < 0x10000)
28
- dst(((cp >> 12) & 0x0f) | 0xe0),
29
- dst(((cp >> 6) & 0x3f) | 0x80),
30
- dst((cp & 0x3f) | 0x80);
31
- else
32
- dst(((cp >> 18) & 0x07) | 0xf0),
33
- dst(((cp >> 12) & 0x3f) | 0x80),
34
- dst(((cp >> 6) & 0x3f) | 0x80),
35
- dst((cp & 0x3f) | 0x80);
36
- cp = null;
37
- }
38
- };
39
-
40
- /**
41
- * Decodes UTF8 bytes to UTF8 code points.
42
- *
43
- * @param src Bytes source as a function returning the next byte respectively `null` if there
44
- * are no more bytes left.
45
- * @param dst Code points destination as a function successively called with each decoded code point.
46
- * @throws {RangeError} If a starting byte is invalid in UTF8
47
- * @throws {Error} If the last sequence is truncated. Has an array property `bytes` holding the
48
- * remaining bytes.
49
- */
50
- export const decodeUTF8 = (
51
- src: () => number | null,
52
- dst: (byte: number) => void
53
- ): void => {
54
- let a: number | null;
55
- let b: number | null;
56
- let c: number | null;
57
- let d: number | null;
58
-
59
- const fail = (b: (number | null)[]): void => {
60
- b = b.slice(0, b.indexOf(null));
61
-
62
- const err = Error(b.toString());
63
-
64
- err.name = "TruncatedError";
65
- // eslint-disable-next-line @typescript-eslint/ban-ts-comment
66
- // @ts-ignore
67
- err["bytes"] = b;
68
-
69
- throw err;
70
- };
71
-
72
- while ((a = src()) !== null) {
73
- if ((a & 0x80) === 0) dst(a);
74
- else if ((a & 0xe0) === 0xc0)
75
- // eslint-disable-next-line @typescript-eslint/ban-ts-comment
76
- // @ts-ignore
77
- (b = src()) === null && fail([a, b]), dst(((a & 0x1f) << 6) | (b & 0x3f));
78
- else if ((a & 0xf0) === 0xe0)
79
- // eslint-disable-next-line @typescript-eslint/ban-ts-comment
80
- // @ts-ignore
81
- ((b = src()) === null || (c = src()) === null) && fail([a, b, c]),
82
- // eslint-disable-next-line @typescript-eslint/ban-ts-comment
83
- // @ts-ignore
84
- dst(((a & 0x0f) << 12) | ((b & 0x3f) << 6) | (c & 0x3f));
85
- else if ((a & 0xf8) === 0xf0)
86
- ((b = src()) === null || (c = src()) === null || (d = src()) === null) &&
87
- // eslint-disable-next-line @typescript-eslint/ban-ts-comment
88
- // @ts-ignore
89
- fail([a, b, c, d]),
90
- dst(
91
- ((a & 0x07) << 18) |
92
- // eslint-disable-next-line @typescript-eslint/ban-ts-comment
93
- // @ts-ignore
94
- ((b & 0x3f) << 12) |
95
- // eslint-disable-next-line @typescript-eslint/ban-ts-comment
96
- // @ts-ignore
97
- ((c & 0x3f) << 6) |
98
- // eslint-disable-next-line @typescript-eslint/ban-ts-comment
99
- // @ts-ignore
100
- (d & 0x3f)
101
- );
102
- else throw RangeError(`Illegal starting byte: ${a}`);
103
- }
104
- };
105
-
106
- /**
107
- * Converts UTF16 characters to UTF8 code points.
108
- * @param {!function():number|null} src Characters source as a function returning the next char code respectively
109
- * `null` if there are no more characters left.
110
- * @param {!function(number)} dst Code points destination as a function successively called with each converted code
111
- * point.
112
- */
113
- export const UTF16toUTF8 = (
114
- src: () => number | null,
115
- dst: (byte: number) => void
116
- ): void => {
117
- let c1: number | null;
118
- let c2 = null;
119
-
120
- // eslint-disable-next-line no-constant-condition
121
- while (true) {
122
- if ((c1 = c2 !== null ? c2 : src()) === null) break;
123
- if (c1 >= 0xd800 && c1 <= 0xdfff) {
124
- if ((c2 = src()) !== null) {
125
- if (c2 >= 0xdc00 && c2 <= 0xdfff) {
126
- dst((c1 - 0xd800) * 0x400 + c2 - 0xdc00 + 0x10000);
127
- c2 = null;
128
- continue;
129
- }
130
- }
131
- }
132
- dst(c1);
133
- }
134
- if (c2 !== null) dst(c2);
135
- };
136
-
137
- /**
138
- * Converts UTF8 code points to UTF16 characters.
139
- *
140
- * @param src Code points source, either as a function returning the next code point
141
- * respectively `null` if there are no more code points left or a single numeric code point.
142
- * @param dst Characters destination as a function successively called with each converted char code.
143
- * @throws {RangeError} If a code point is out of range
144
- */
145
- export const UTF8toUTF16 = (
146
- src: (() => number | null) | number,
147
- dst: (byte: number) => void
148
- ): void => {
149
- let cp = null;
150
-
151
- if (typeof src === "number") (cp = src), (src = (): null => null);
152
-
153
- while (cp !== null || (cp = src()) !== null) {
154
- if (cp <= 0xffff) dst(cp);
155
- else (cp -= 0x10000), dst((cp >> 10) + 0xd800), dst((cp % 0x400) + 0xdc00);
156
- cp = null;
157
- }
158
- };
159
-
160
- /**
161
- * Converts and encodes UTF16 characters to UTF8 bytes.
162
- * @param {!function():number|null} src Characters source as a function returning the next char code respectively `null`
163
- * if there are no more characters left.
164
- * @param {!function(number)} dst Bytes destination as a function successively called with the next byte.
165
- */
166
- export const encodeUTF16toUTF8 = (
167
- src: () => number | null,
168
- dst: (byte: number) => void
169
- ): void => {
170
- UTF16toUTF8(src, function (cp) {
171
- encodeUTF8(cp, dst);
172
- });
173
- };
174
-
175
- /**
176
- * Decodes and converts UTF8 bytes to UTF16 characters.
177
- * @param {!function():number|null} src Bytes source as a function returning the next byte respectively `null` if there
178
- * are no more bytes left.
179
- * @param {!function(number)} dst Characters destination as a function successively called with each converted char code.
180
- * @throws {RangeError} If a starting byte is invalid in UTF8
181
- * @throws {Error} If the last sequence is truncated. Has an array property `bytes` holding the remaining bytes.
182
- */
183
- export const decodeUTF8toUTF16 = (
184
- src: () => number | null,
185
- dst: (byte: number) => void
186
- ): void => {
187
- decodeUTF8(src, (cp) => {
188
- UTF8toUTF16(cp, dst);
189
- });
190
- };
191
-
192
- /**
193
- * Calculates the byte length of an UTF8 code point.
194
- *
195
- * @param codePoint UTF8 code point
196
- * @returns Byte length
197
- */
198
- export const calculateCodePoint = (codePoint: number): number =>
199
- codePoint < 0x80 ? 1 : codePoint < 0x800 ? 2 : codePoint < 0x10000 ? 3 : 4;
200
-
201
- /**
202
- * Calculates the number of UTF8 bytes required to store UTF8 code points.
203
- * @param src Code points source as a function returning the next code point respectively
204
- * `null` if there are no more code points left.
205
- * @returns The number of UTF8 bytes required
206
- */
207
- export const calculateUTF8 = (src: () => number | null): number => {
208
- let cp: number | null;
209
- let l = 0;
210
-
211
- while ((cp = src()) !== null) l += calculateCodePoint(cp);
212
-
213
- return l;
214
- };
215
-
216
- /**
217
- * Calculates the number of UTF8 code points respectively UTF8 bytes required to store UTF16 char codes.
218
- * @param src Characters source as a function returning the next char code respectively
219
- * `null` if there are no more characters left.
220
- * @returns The number of UTF8 code points at index 0 and the number of UTF8 bytes required at index 1.
221
- */
222
- export const calculateUTF16asUTF8 = (src: () => number | null): number[] => {
223
- let n = 0,
224
- l = 0;
225
-
226
- UTF16toUTF8(src, function (cp) {
227
- ++n;
228
- l += calculateCodePoint(cp);
229
- });
230
-
231
- return [n, l];
232
- };
package/src/utils.ts DELETED
@@ -1,35 +0,0 @@
1
- import { encodeUTF16toUTF8 } from "./utfx";
2
-
3
- /**
4
- * Continues with the callback on the next tick.
5
- */
6
- export const nextTick =
7
- typeof process !== "undefined" &&
8
- process &&
9
- typeof process.nextTick === "function"
10
- ? typeof setImmediate === "function"
11
- ? setImmediate
12
- : // eslint-disable-next-line @typescript-eslint/unbound-method
13
- process.nextTick
14
- : setTimeout;
15
-
16
- /**
17
- * Converts a JavaScript string to UTF8 bytes.
18
- * @param {string} str String
19
- * @returns {!Array.<number>} UTF8 bytes
20
- * @inner
21
- */
22
-
23
- export const stringToBytes = (str: string): number[] => {
24
- const out: number[] = [];
25
- let i = 0;
26
-
27
- encodeUTF16toUTF8(
28
- () => (i >= str.length ? null : str.charCodeAt(i++)),
29
- (b: number) => {
30
- out.push(b);
31
- }
32
- );
33
-
34
- return out;
35
- };