|
4 | 4 | */
|
5 | 5 | import { scrypt as scryptOld } from "https://deno.land/x/scrypt@v4.3.4/lib/scrypt.ts";
|
6 | 6 | import { scrypt } from "./scrypt.ts";
|
| 7 | +import { scrypt as scryptNodeRaw } from "node:crypto"; |
| 8 | +import { scrypt as scryptoRaw } from "https://deno.land/x/scrypto@v1.0.0/main.ts"; |
| 9 | +import { scrypt as scryptWasmRaw } from "npm:hash-wasm" |
| 10 | + |
| 11 | +function scryptNode( |
| 12 | + password: string, |
| 13 | + salt: string, |
| 14 | + N: number, |
| 15 | + r: number, |
| 16 | + p: number, |
| 17 | + dklen: number = 64, |
| 18 | +) { |
| 19 | + return new Promise((resolve) => |
| 20 | + scryptNodeRaw(password, salt, dklen, { N, r, p }, resolve) |
| 21 | + ); |
| 22 | +} |
| 23 | + |
| 24 | +function scrypto( |
| 25 | + password: string, |
| 26 | + salt: string, |
| 27 | + N: number, |
| 28 | + r: number, |
| 29 | + p: number, |
| 30 | + dkLen: number = 64, |
| 31 | +) { |
| 32 | + return scryptoRaw(password, salt, { N, r, p, dkLen}) |
| 33 | +} |
| 34 | + |
| 35 | +function scryptWasm ( |
| 36 | + password: string, |
| 37 | + salt: string, |
| 38 | + N: number, |
| 39 | + r: number, |
| 40 | + p: number, |
| 41 | + dkLen: number = 64, |
| 42 | +) { |
| 43 | + return scryptWasmRaw({password, salt, costFactor: N, blockSize: r, parallelism: p, hashLength: dkLen}); |
| 44 | +} |
| 45 | + |
| 46 | +const scryptImplementations = { |
| 47 | + "current": scrypt, |
| 48 | + "last version": scryptOld, |
| 49 | + "node": scryptNode, |
| 50 | + "scrypto": scrypto, |
| 51 | + "hash-wasm": scryptWasm, |
| 52 | +}; |
| 53 | + |
7 | 54 | const extremeSalt =
|
8 | 55 | `IkjpewCbNm4A7cuY1VL9KC3y92blEthtLf9Cet6uEoTxz5cyF660da2zeci42fYwVCVwsKogETMCXupSZZAUh6a80ZnnBTk17B3UTCSVQPpYfL8GktJ2BDokE7ox2hV8OwwUT1hFvCuJqwHZpRvZw1RNCO6HfukPdgMHhq9rWLTXXUNwrIjlmkeydKGFJz2mS1xFcvLQtle4olJVK0SXXXYHAigBfpYxxSC2acvoxuacWcXhzSSRZAMysU2J7zDfXdxnYoqz50rvmvi36g7t2WDSAdzZ44JpxVcc3bYD7xYI3UgfVMPOfeblzwJi455QIurHzDuXEUNS0tZX1kWwZ0XcNSCwGzPs7WSVHxHc0KVUNhwSz16wDYFK4pYeA29ThXgFiFICSLVshiRrCfuzRthW7IZtRa9efcf4nFJsVBk51jpHY0b8CLhARrQU92mlBULwmJKe8DgST3Vn9rva98E9jk4y7NfSb4i9g74OjuFQ8yRO3BHksBZoVtBl4wUppM2hsLt72LZKA0ZsaWW7dG9a1bgWUkBBRG5OwzARenDqQIA2Gp5V4JsXuUUYNDylCelkLUVfS7hB1AZHtnIgwVqTaGDxl7nNZGKpAx6MrOd40laTUhrtZo4prwFZROHPNVJGQk2PQDgwqxX5SWoBTK8cCCzrbGBfHq9r8BwBvSVdeQ7bgjUW2j7NCapHHZ6filzxZaVsLsEITGZNcK0t5DdSnaDLRxyOn21ncKVIyZfOdlvpytvqpQaH5RWu4G50IPkEevue8KenXpGLP0pmEseBf6eX02rlN9arqZ4HJWmD7RbAChs7OJwfKlNIawb0V3G3N0eJeXiRsYOk10GIb91pyZRLSr2AJDtiWCcMuOWZfgLVHIrUVftfh9iXmRk2RAT1sigivbNtdqcF2cVvbTVMUCe7MIPRt4dGqwOQqdReGjPy9p1CNfKfJBIgW0xhYsOGMkcUqSurHxPl4wTOnMBx8vEZQsqJCZomENA1`;
|
9 | 56 | const extremePassword =
|
10 | 57 | `TFImeWrtF2kOIvDjG4P0ybmMrNOq0bQ0aERcC69iHflECWrwuSMO4JPD3Ng5HwNXZrCpHyEwviW8zly3WLsQ6zJ60lnfwhVRdkEQCsFiH4NvGl0tCAuty9Rruf47WHeE3GK7qAJwhcXHx3FCJgWN8KHdoy3vn2zUKJlhhjSFGANJdVYQGSaQTmtoJdhcemmYT5hprkALp7Q9vMwCk9hDvV5vB0evXfxqG0dFV3MPJmywwWAUJEi5MyM2Pio7fL50M5ohPWFmUllpa6G5pVBhi26GtOy6sM3GDGHmnohavtsMvTeRcMX1ds4HWA9U3vH7urQ3XGkCUzulB6WxuxHn8Z3fRz3BL6MZI0EReep2qUVaqJn8onzsI6da6pU6iDtRbufWxi0q8XN1S3BCtFGjzaTU12nvfg5js53PiSw1KUnZj2thKxWtnKcpwzbXdTuuZ9GVhZHIMcOXXrDR0rj539ZLAVyJmqwDOMjTsqPN7BY522PcJHoTElSRNRAsAsFx2m7h9brhcZXOgV1PZohJsdQS7RWhAl9EYBkgF8WCgGw9DXidVduIIHDlEd7mAVJfo9HYX85kFcwrLEpuPiFxfNhubeDpeBu2FAbAo6DNHFlqXUUnyKvMbzptcgisSr2V1pwykB6uLVrwx3AceRnyqg5flldmfsSKw0AFZ4PagGMJuFDMGrV29Vmqhv61SRL9in0ngZx0gJ2vKv26qS3jGN72UUsbkysuGNz6ul0D5jIapvIcCTncIiXSY24pPctxFsawcXvSNw4jEKccsHCTZF0gri6iFS7JqqQd87FNowbrug6sIWSwiWHYGN1VfSwuE5plQHVvNCHNZnMBBIoaMWh45lhtlfCWdUwVpjjK5dAUcOtKftJ2hcl4mIlxs7Fy8ASWhYvWAbpp3fRgmAeTRYAFEwMohN9b03iXyDSNFIeZtQoaL7HYFVWoXV4BfBVlR3CvNIwp6OPBAFFSDlSn9CZU06UziY1tSwqBzkCD`;
|
11 | 58 |
|
12 |
| -Deno.bench("small scrypt - last version", { group: "small scrypt" }, () => { |
13 |
| - scryptOld("password", "salt", 1024, 8, 1, 64); |
14 |
| -}); |
15 |
| -Deno.bench("small scrypt", { group: "small scrypt", baseline: true }, () => { |
16 |
| - scrypt("password", "salt", 1024, 8, 1, 64); |
17 |
| -}); |
18 |
| - |
19 |
| -Deno.bench("small scrypt - last version (longer password and salt)", { |
20 |
| - group: "small scrypt (longer password and salt)", |
21 |
| -}, () => { |
22 |
| - scryptOld( |
23 |
| - "long password to test that", |
24 |
| - "long salt to test that", |
25 |
| - 1024, |
26 |
| - 8, |
27 |
| - 1, |
28 |
| - 64, |
29 |
| - ); |
30 |
| -}); |
31 |
| -Deno.bench("small scrypt (longer password and salt)", { |
32 |
| - group: "small scrypt (longer password and salt)", |
33 |
| - baseline: true, |
34 |
| -}, () => { |
35 |
| - scrypt( |
36 |
| - "long password to test that", |
37 |
| - "long salt to test that", |
38 |
| - 1024, |
39 |
| - 8, |
40 |
| - 1, |
41 |
| - 64, |
42 |
| - ); |
43 |
| -}); |
44 |
| - |
45 |
| -Deno.bench("small scrypt - last version (extremely long password and salt)", { |
46 |
| - group: "small scrypt (extremely long password and salt)", |
47 |
| -}, () => { |
48 |
| - scryptOld(extremePassword, extremeSalt, 1024, 8, 1, 64); |
49 |
| -}); |
50 |
| -Deno.bench("small scrypt (extremely long password and salt)", { |
51 |
| - group: "small scrypt (extremely long password and salt)", |
52 |
| - baseline: true, |
53 |
| -}, () => { |
54 |
| - scrypt(extremePassword, extremeSalt, 1024, 8, 1, 64); |
55 |
| -}); |
56 |
| - |
57 |
| -Deno.bench("standard scrypt - last version", { group: "scrypt" }, () => { |
58 |
| - scryptOld("password", "salt", 16384, 8, 1, 64); |
59 |
| -}); |
60 |
| -Deno.bench("standard scrypt", { group: "scrypt", baseline: true }, () => { |
61 |
| - scrypt("password", "salt", 16384, 8, 1, 64); |
62 |
| -}); |
| 59 | +for (const [name, implementation] of Object.entries(scryptImplementations)) { |
| 60 | + Deno.bench(`small scrypt - ${name}`, { |
| 61 | + group: "small scrypt", |
| 62 | + baseline: name === "current", |
| 63 | + }, async () => { |
| 64 | + await implementation("password", "salt", 1024, 8, 1, 64); |
| 65 | + }); |
63 | 66 |
|
64 |
| -Deno.bench( |
65 |
| - "standard scrypt - last version (longer password and salt)", |
66 |
| - { group: "scrypt (longer password and salt)" }, |
67 |
| - () => { |
68 |
| - scryptOld( |
| 67 | + Deno.bench(`small scrypt - ${name} (longer password and salt)`, { |
| 68 | + group: "small scrypt (longer password and salt)", |
| 69 | + baseline: name === "current", |
| 70 | + }, async () => { |
| 71 | + await implementation( |
69 | 72 | "long password to test that",
|
70 | 73 | "long salt to test that",
|
71 |
| - 16384, |
| 74 | + 1024, |
72 | 75 | 8,
|
73 | 76 | 1,
|
74 | 77 | 64,
|
75 | 78 | );
|
76 |
| - }, |
77 |
| -); |
78 |
| -Deno.bench( |
79 |
| - "standard scrypt (longer password and salt)", |
80 |
| - { group: "scrypt (longer password and salt)", baseline: true }, |
81 |
| - () => { |
82 |
| - scrypt( |
83 |
| - "long password to test that", |
84 |
| - "long salt to test that", |
85 |
| - 16384, |
86 |
| - 8, |
87 |
| - 1, |
88 |
| - 64, |
89 |
| - ); |
90 |
| - }, |
91 |
| -); |
| 79 | + }); |
| 80 | + |
| 81 | + Deno.bench(`small scrypt - ${name} (extremely long password and salt)`, { |
| 82 | + group: "small scrypt (extremely long password and salt)", |
| 83 | + baseline: name === "current", |
| 84 | + }, async () => { |
| 85 | + await implementation(extremePassword, extremeSalt, 1024, 8, 1, 64); |
| 86 | + }); |
92 | 87 |
|
93 |
| -Deno.bench( |
94 |
| - "standard scrypt - last version (extremely long password and salt)", |
95 |
| - { |
96 |
| - group: "scrypt (extremely long password and salt)", |
97 |
| - }, |
98 |
| - () => { |
99 |
| - scryptOld(extremePassword, extremeSalt, 16384, 8, 1, 64); |
100 |
| - }, |
101 |
| -); |
102 |
| -Deno.bench("standard scrypt (extremely long password and salt)", { |
103 |
| - group: "scrypt (extremely long password and salt)", |
104 |
| - baseline: true, |
105 |
| -}, () => { |
106 |
| - scrypt(extremePassword, extremeSalt, 16384, 8, 1, 64); |
107 |
| -}); |
| 88 | + Deno.bench(`standard scrypt - ${name}`, { |
| 89 | + group: "scrypt", |
| 90 | + baseline: name === "current", |
| 91 | + }, async () => { |
| 92 | + await implementation("password", "salt", 16384, 8, 1, 64); |
| 93 | + }); |
| 94 | + Deno.bench( |
| 95 | + `standard scrypt - ${name} (longer password and salt)`, |
| 96 | + { |
| 97 | + group: "scrypt (longer password and salt)", |
| 98 | + baseline: name === "current", |
| 99 | + }, |
| 100 | + async () => { |
| 101 | + await implementation( |
| 102 | + "long password to test that", |
| 103 | + "long salt to test that", |
| 104 | + 16384, |
| 105 | + 8, |
| 106 | + 1, |
| 107 | + 64, |
| 108 | + ); |
| 109 | + }, |
| 110 | + ); |
| 111 | + |
| 112 | + Deno.bench( |
| 113 | + `standard scrypt - ${name} (extremely long password and salt)`, |
| 114 | + { |
| 115 | + group: "scrypt (extremely long password and salt)", |
| 116 | + baseline: name === "current", |
| 117 | + }, |
| 118 | + async () => { |
| 119 | + await implementation(extremePassword, extremeSalt, 16384, 8, 1, 64); |
| 120 | + }, |
| 121 | + ); |
108 | 122 |
|
109 |
| -Deno.bench("large n scrypt - last version (4x standard)", { |
110 |
| - group: "large n scrypt", |
111 |
| -}, () => { |
112 |
| - scryptOld("password", "salt", 65536, 8, 1, 64); |
113 |
| -}); |
114 |
| -Deno.bench("large n scrypt (4x standard)", { |
115 |
| - group: "large n scrypt", |
116 |
| - baseline: true, |
117 |
| -}, () => { |
118 |
| - scrypt("password", "salt", 65536, 8, 1, 64); |
119 |
| -}); |
| 123 | + Deno.bench(`large n scrypt - ${name} (4x standard)`, { |
| 124 | + group: "large n scrypt", |
| 125 | + baseline: name === "current", |
| 126 | + }, async () => { |
| 127 | + await implementation("password", "salt", 65536, 8, 1, 64); |
| 128 | + }); |
120 | 129 |
|
121 |
| -Deno.bench("large r scrypt - last version (4x standard)", { |
122 |
| - group: "large r scrypt", |
123 |
| -}, () => { |
124 |
| - scryptOld("password", "salt", 16384, 32, 1, 64); |
125 |
| -}); |
126 |
| -Deno.bench("large r scrypt (4x standard)", { |
127 |
| - group: "large r scrypt", |
128 |
| - baseline: true, |
129 |
| -}, () => { |
130 |
| - scrypt("password", "salt", 16384, 32, 1, 64); |
131 |
| -}); |
| 130 | + Deno.bench(`large r scrypt - ${name} (4x standard)`, { |
| 131 | + group: "large r scrypt", |
| 132 | + baseline: name === "current", |
| 133 | + }, async () => { |
| 134 | + await implementation("password", "salt", 16384, 32, 1, 64); |
| 135 | + }); |
132 | 136 |
|
133 |
| -Deno.bench("large p scrypt - last version (4x standard)", { |
134 |
| - group: "large p scrypt", |
135 |
| -}, () => { |
136 |
| - scryptOld("password", "salt", 16384, 8, 4, 64); |
137 |
| -}); |
138 |
| -Deno.bench("large p scrypt (4x standard)", { |
139 |
| - group: "large p scrypt", |
140 |
| - baseline: true, |
141 |
| -}, () => { |
142 |
| - scrypt("password", "salt", 16384, 8, 4, 64); |
143 |
| -}); |
| 137 | + Deno.bench(`large p scrypt - ${name} (4x standard)`, { |
| 138 | + group: "large p scrypt", |
| 139 | + baseline: name === "current", |
| 140 | + }, async () => { |
| 141 | + await implementation("password", "salt", 16384, 8, 4, 64); |
| 142 | + }); |
| 143 | +} |
0 commit comments