@antelopejs/interface-database-decorators 0.1.10 → 0.1.12
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/README.md +9 -7
- package/dist/common.js.map +1 -1
- package/dist/database.js +18 -2
- package/dist/database.js.map +1 -1
- package/dist/model.js +48 -29
- package/dist/model.js.map +1 -1
- package/dist/modifiers/common.d.ts +24 -4
- package/dist/modifiers/common.js +104 -130
- package/dist/modifiers/common.js.map +1 -1
- package/dist/modifiers/encryption.js +14 -9
- package/dist/modifiers/encryption.js.map +1 -1
- package/dist/modifiers/hash.d.ts +46 -4
- package/dist/modifiers/hash.js +172 -14
- package/dist/modifiers/hash.js.map +1 -1
- package/dist/modifiers/internal/kinds.d.ts +13 -0
- package/dist/modifiers/internal/kinds.js +33 -0
- package/dist/modifiers/internal/kinds.js.map +1 -0
- package/dist/modifiers/internal/records.d.ts +31 -0
- package/dist/modifiers/internal/records.js +56 -0
- package/dist/modifiers/internal/records.js.map +1 -0
- package/dist/modifiers/localization.js +4 -2
- package/dist/modifiers/localization.js.map +1 -1
- package/dist/schema.js +1 -2
- package/dist/schema.js.map +1 -1
- package/dist/table.js +21 -6
- package/dist/table.js.map +1 -1
- package/dist/tests/codec_helpers.d.ts +6 -2
- package/dist/tests/codec_helpers.js +18 -14
- package/dist/tests/codec_helpers.js.map +1 -1
- package/dist/tests/common.test.js +38 -46
- package/dist/tests/common.test.js.map +1 -1
- package/dist/tests/cross_instance.test.js +27 -2
- package/dist/tests/cross_instance.test.js.map +1 -1
- package/dist/tests/database.test.js +278 -256
- package/dist/tests/database.test.js.map +1 -1
- package/dist/tests/hash_upgrade.test.d.ts +1 -0
- package/dist/tests/hash_upgrade.test.js +132 -0
- package/dist/tests/hash_upgrade.test.js.map +1 -0
- package/dist/tests/helpers/hash-rows.d.ts +40 -0
- package/dist/tests/helpers/hash-rows.js +41 -0
- package/dist/tests/helpers/hash-rows.js.map +1 -0
- package/dist/tests/helpers/other-instance.d.ts +1 -1
- package/dist/tests/helpers/other-instance.js +41 -9
- package/dist/tests/helpers/other-instance.js.map +1 -1
- package/dist/tests/integration.test.js +485 -485
- package/dist/tests/integration.test.js.map +1 -1
- package/dist/tests/model.test.js +293 -308
- package/dist/tests/model.test.js.map +1 -1
- package/dist/tests/modifiers/autodate.test.js +80 -86
- package/dist/tests/modifiers/autodate.test.js.map +1 -1
- package/dist/tests/modifiers/common.test.js +181 -195
- package/dist/tests/modifiers/common.test.js.map +1 -1
- package/dist/tests/modifiers/encryption.test.js +149 -155
- package/dist/tests/modifiers/encryption.test.js.map +1 -1
- package/dist/tests/modifiers/hash.test.js +386 -99
- package/dist/tests/modifiers/hash.test.js.map +1 -1
- package/dist/tests/modifiers/localization.test.js +186 -196
- package/dist/tests/modifiers/localization.test.js.map +1 -1
- package/dist/tests/partial_update.test.d.ts +1 -0
- package/dist/tests/partial_update.test.js +55 -0
- package/dist/tests/partial_update.test.js.map +1 -0
- package/dist/tests/relation.test.js +92 -97
- package/dist/tests/relation.test.js.map +1 -1
- package/dist/tests/schema.test.js +101 -106
- package/dist/tests/schema.test.js.map +1 -1
- package/dist/tests/table.test.js +124 -132
- package/dist/tests/table.test.js.map +1 -1
- package/docs/3.table-modifiers.md +36 -15
- package/package.json +14 -3
- package/skills/database-decorators-interface/SKILL.md +4 -2
- package/skills/database-decorators-interface/cases.json +71 -0
|
@@ -9,18 +9,394 @@ var __metadata = (this && this.__metadata) || function (k, v) {
|
|
|
9
9
|
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
10
|
};
|
|
11
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
const node_crypto_1 = require("node:crypto");
|
|
12
13
|
const chai_1 = require("chai");
|
|
13
|
-
const table_1 = require("
|
|
14
|
-
const
|
|
14
|
+
const table_1 = require("../../table");
|
|
15
|
+
const common_1 = require("../../modifiers/common");
|
|
16
|
+
const hash_1 = require("../../modifiers/hash");
|
|
17
|
+
const hash_rows_1 = require("../helpers/hash-rows");
|
|
18
|
+
const WRONG_PASSWORD = "not the password";
|
|
19
|
+
const SALT = "c2FsdHNhbHRzYWx0c2FsdA";
|
|
20
|
+
const KEY = "a2V5a2V5a2V5a2V5a2V5a2V5a2V5a2V5a2V5a2V5a2U";
|
|
21
|
+
class Account extends table_1.Table.with(hash_1.HashModifier) {
|
|
22
|
+
}
|
|
23
|
+
__decorate([
|
|
24
|
+
(0, hash_1.Hashed)(),
|
|
25
|
+
(0, table_1.Field)("string"),
|
|
26
|
+
__metadata("design:type", String)
|
|
27
|
+
], Account.prototype, "password", void 0);
|
|
28
|
+
__decorate([
|
|
29
|
+
(0, table_1.Field)("string"),
|
|
30
|
+
__metadata("design:type", String)
|
|
31
|
+
], Account.prototype, "email", void 0);
|
|
32
|
+
class Fingerprint extends table_1.Table.with(hash_1.HashModifier) {
|
|
33
|
+
}
|
|
34
|
+
__decorate([
|
|
35
|
+
(0, hash_1.Hashed)({ algorithm: "sha256" }),
|
|
36
|
+
(0, table_1.Field)("string"),
|
|
37
|
+
__metadata("design:type", String)
|
|
38
|
+
], Fingerprint.prototype, "password", void 0);
|
|
39
|
+
__decorate([
|
|
40
|
+
(0, hash_1.Hashed)({ algorithm: "md5" }),
|
|
41
|
+
(0, table_1.Field)("any"),
|
|
42
|
+
__metadata("design:type", Object)
|
|
43
|
+
], Fingerprint.prototype, "checksum", void 0);
|
|
44
|
+
function accountFrom(row) {
|
|
45
|
+
return (0, common_1.fromDatabase)(structuredClone(row), Account);
|
|
46
|
+
}
|
|
47
|
+
function accountStoring(stored) {
|
|
48
|
+
return accountFrom({ _internal: { meta: {}, data: { password: stored } } });
|
|
49
|
+
}
|
|
50
|
+
function newAccount(password = hash_rows_1.PASSWORD) {
|
|
51
|
+
const account = new Account();
|
|
52
|
+
account.password = password;
|
|
53
|
+
return account;
|
|
54
|
+
}
|
|
55
|
+
function scryptRow(ln, password = hash_rows_1.PASSWORD) {
|
|
56
|
+
const salt = Buffer.alloc(16, 7);
|
|
57
|
+
const key = (0, node_crypto_1.scryptSync)(JSON.stringify(password), salt, 32, {
|
|
58
|
+
N: 2 ** ln,
|
|
59
|
+
r: 8,
|
|
60
|
+
p: 1,
|
|
61
|
+
maxmem: 2 ** 30,
|
|
62
|
+
});
|
|
63
|
+
const encoded = [salt, key].map((part) => part.toString("base64").replace(/=+$/, ""));
|
|
64
|
+
return `$scrypt$ln=${ln},r=8,p=1$${encoded[0]}$${encoded[1]}`;
|
|
65
|
+
}
|
|
66
|
+
async function expectVerifies(account, password = hash_rows_1.PASSWORD) {
|
|
67
|
+
(0, chai_1.expect)(account.testHash("password", password)).to.equal(true);
|
|
68
|
+
(0, chai_1.expect)(await account.testHashAsync("password", password)).to.equal(true);
|
|
69
|
+
}
|
|
70
|
+
async function expectRefuses(account, password = WRONG_PASSWORD) {
|
|
71
|
+
(0, chai_1.expect)(account.testHash("password", password)).to.equal(false);
|
|
72
|
+
(0, chai_1.expect)(await account.testHashAsync("password", password)).to.equal(false);
|
|
73
|
+
}
|
|
74
|
+
function fastestMs(work) {
|
|
75
|
+
const runs = [0, 1, 2].map(() => {
|
|
76
|
+
const started = performance.now();
|
|
77
|
+
work();
|
|
78
|
+
return performance.now() - started;
|
|
79
|
+
});
|
|
80
|
+
return Math.min(...runs);
|
|
81
|
+
}
|
|
15
82
|
describe("Modifiers - hash", () => {
|
|
16
|
-
it("hashes string values", async () =>
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
83
|
+
it("hashes string values", async () => {
|
|
84
|
+
const modifier = new TestableHashModifier();
|
|
85
|
+
modifier.setOptions({ algorithm: "sha256" });
|
|
86
|
+
modifier.setMeta({});
|
|
87
|
+
const originalValue = "password123";
|
|
88
|
+
const hashed = modifier.lock(undefined, originalValue);
|
|
89
|
+
(0, chai_1.expect)(hashed).to.be.a("string");
|
|
90
|
+
(0, chai_1.expect)(hashed).to.not.equal(originalValue);
|
|
91
|
+
(0, chai_1.expect)(modifier.getMeta().salt).to.be.a("string");
|
|
92
|
+
});
|
|
93
|
+
it("hashes object values", async () => {
|
|
94
|
+
const modifier = new TestableHashModifier();
|
|
95
|
+
modifier.setOptions({ algorithm: "sha256" });
|
|
96
|
+
modifier.setMeta({});
|
|
97
|
+
const originalValue = { name: "John", age: 30 };
|
|
98
|
+
const hashed = modifier.lock(undefined, originalValue);
|
|
99
|
+
(0, chai_1.expect)(hashed).to.be.a("string");
|
|
100
|
+
(0, chai_1.expect)(hashed).to.not.equal(JSON.stringify(originalValue));
|
|
101
|
+
});
|
|
102
|
+
it("handles undefined values", async () => {
|
|
103
|
+
const modifier = new TestableHashModifier();
|
|
104
|
+
modifier.setOptions({ algorithm: "sha256" });
|
|
105
|
+
modifier.setMeta({});
|
|
106
|
+
const hashed = modifier.lock(undefined, undefined);
|
|
107
|
+
(0, chai_1.expect)(hashed).to.equal(undefined);
|
|
108
|
+
});
|
|
109
|
+
it("uses custom hash algorithm", async () => {
|
|
110
|
+
const modifier = new TestableHashModifier();
|
|
111
|
+
modifier.setOptions({ algorithm: "md5" });
|
|
112
|
+
modifier.setMeta({});
|
|
113
|
+
const originalValue = "test data";
|
|
114
|
+
const hashed = modifier.lock(undefined, originalValue);
|
|
115
|
+
(0, chai_1.expect)(hashed).to.be.a("string");
|
|
116
|
+
(0, chai_1.expect)(hashed).to.not.equal(originalValue);
|
|
117
|
+
(0, chai_1.expect)(modifier.getOptions().algorithm).to.equal("md5");
|
|
118
|
+
});
|
|
119
|
+
it("generates unique salt for each field", async () => {
|
|
120
|
+
const modifier1 = new TestableHashModifier();
|
|
121
|
+
modifier1.setOptions({ algorithm: "sha256" });
|
|
122
|
+
modifier1.setMeta({});
|
|
123
|
+
const modifier2 = new TestableHashModifier();
|
|
124
|
+
modifier2.setOptions({ algorithm: "sha256" });
|
|
125
|
+
modifier2.setMeta({});
|
|
126
|
+
const value = "test data";
|
|
127
|
+
const hashed1 = modifier1.lock(undefined, value);
|
|
128
|
+
const hashed2 = modifier2.lock(undefined, value);
|
|
129
|
+
(0, chai_1.expect)(hashed1).to.not.equal(hashed2);
|
|
130
|
+
(0, chai_1.expect)(modifier1.getMeta().salt).to.not.equal(modifier2.getMeta().salt);
|
|
131
|
+
});
|
|
132
|
+
it("handles hash decorator", async () => {
|
|
133
|
+
class TestTable extends table_1.Table.with(hash_1.HashModifier) {
|
|
134
|
+
}
|
|
135
|
+
__decorate([
|
|
136
|
+
(0, hash_1.Hashed)({ algorithm: "sha256" }),
|
|
137
|
+
(0, table_1.Field)("string"),
|
|
138
|
+
__metadata("design:type", String)
|
|
139
|
+
], TestTable.prototype, "password", void 0);
|
|
140
|
+
const instance = new TestTable();
|
|
141
|
+
instance.password = "myPassword123";
|
|
142
|
+
(0, chai_1.expect)(instance.testHash("password", "myPassword123")).to.equal(true);
|
|
143
|
+
(0, chai_1.expect)(instance.testHash("password", "notMyPassword")).to.equal(false);
|
|
144
|
+
});
|
|
145
|
+
it("tests hash values correctly", async () => {
|
|
146
|
+
const modifier = new TestableHashModifier();
|
|
147
|
+
modifier.setOptions({ algorithm: "sha256" });
|
|
148
|
+
modifier.setMeta({});
|
|
149
|
+
const originalValue = "test data";
|
|
150
|
+
const hashed = modifier.lock(undefined, originalValue);
|
|
151
|
+
const isMatch = modifier.test(hashed, originalValue);
|
|
152
|
+
const isNotMatch = modifier.test(hashed, "wrong data");
|
|
153
|
+
(0, chai_1.expect)(isMatch).to.equal(true);
|
|
154
|
+
(0, chai_1.expect)(isNotMatch).to.equal(false);
|
|
155
|
+
});
|
|
156
|
+
it("provides testHash method through mixin", async () => {
|
|
157
|
+
class TestTable extends table_1.Table.with(hash_1.HashModifier) {
|
|
158
|
+
}
|
|
159
|
+
__decorate([
|
|
160
|
+
(0, hash_1.Hashed)({ algorithm: "sha256" }),
|
|
161
|
+
(0, table_1.Field)("string"),
|
|
162
|
+
__metadata("design:type", String)
|
|
163
|
+
], TestTable.prototype, "password", void 0);
|
|
164
|
+
const instance = new TestTable();
|
|
165
|
+
instance.password = "myPassword123";
|
|
166
|
+
(0, chai_1.expect)(instance).to.have.property("testHash").that.is.a("function");
|
|
167
|
+
const isMatch = instance.testHash("password", "myPassword123");
|
|
168
|
+
const isNotMatch = instance.testHash("password", "wrongPassword");
|
|
169
|
+
(0, chai_1.expect)(isMatch).to.equal(true);
|
|
170
|
+
(0, chai_1.expect)(isNotMatch).to.equal(false);
|
|
171
|
+
});
|
|
172
|
+
});
|
|
173
|
+
(0, hash_rows_1.scryptSuite)("Modifiers - hash, default scrypt format", () => {
|
|
174
|
+
it("stores a string that describes the hash it holds, at N >= 2^15", () => {
|
|
175
|
+
const stored = newAccount().password;
|
|
176
|
+
const match = /^\$scrypt\$ln=(\d+),r=(\d+),p=(\d+)\$([^$]+)\$([^$]+)$/.exec(stored);
|
|
177
|
+
if (!match)
|
|
178
|
+
throw new Error(`Unexpected stored form: ${stored}`);
|
|
179
|
+
const [ln, r, p] = match.slice(1, 4).map(Number);
|
|
180
|
+
(0, chai_1.expect)(ln).to.be.at.least(15);
|
|
181
|
+
const key = (0, node_crypto_1.scryptSync)(JSON.stringify(hash_rows_1.PASSWORD), Buffer.from(match[4], "base64"), Buffer.from(match[5], "base64").length, { N: 2 ** ln, r, p, maxmem: 2 ** 30 });
|
|
182
|
+
(0, chai_1.expect)(key.toString("base64").replace(/=+$/, "")).to.equal(match[5]);
|
|
183
|
+
});
|
|
184
|
+
it("gives each write its own salt", () => {
|
|
185
|
+
(0, chai_1.expect)(newAccount().password).to.not.equal(newAccount().password);
|
|
186
|
+
});
|
|
187
|
+
it("tests a value against the stored hash, sync and async", async () => {
|
|
188
|
+
const account = newAccount();
|
|
189
|
+
await expectVerifies(account);
|
|
190
|
+
await expectRefuses(account);
|
|
191
|
+
});
|
|
192
|
+
it("does not flag a hash it just wrote", () => {
|
|
193
|
+
(0, chai_1.expect)(newAccount().isHashOutdated("password")).to.equal(false);
|
|
194
|
+
});
|
|
195
|
+
it("does not flag a field with nothing stored", () => {
|
|
196
|
+
(0, chai_1.expect)(new Account().isHashOutdated("password")).to.equal(false);
|
|
197
|
+
});
|
|
198
|
+
it("throws when asked about a field that is not hashed", async () => {
|
|
199
|
+
const account = newAccount();
|
|
200
|
+
(0, chai_1.expect)(() => account.isHashOutdated("email")).to.throw("email");
|
|
201
|
+
let failure;
|
|
202
|
+
await account.testHashAsync("email", hash_rows_1.PASSWORD).catch((error) => {
|
|
203
|
+
failure = error;
|
|
204
|
+
});
|
|
205
|
+
(0, chai_1.expect)(failure).to.be.instanceOf(Error);
|
|
206
|
+
});
|
|
207
|
+
});
|
|
208
|
+
(0, hash_rows_1.scryptSuite)("Modifiers - hash, upgrade of stored hashes", () => {
|
|
209
|
+
it("verifies a row written by 0.1.11 and flags it", async () => {
|
|
210
|
+
const account = accountFrom(hash_rows_1.ROW_FROM_0_1_11);
|
|
211
|
+
await expectVerifies(account);
|
|
212
|
+
await expectRefuses(account);
|
|
213
|
+
(0, chai_1.expect)(account.isHashOutdated("password")).to.equal(true);
|
|
214
|
+
});
|
|
215
|
+
it("after a re-hash, verifies and no longer flags that row", async () => {
|
|
216
|
+
const account = accountFrom(hash_rows_1.ROW_FROM_0_1_11);
|
|
217
|
+
account.password = hash_rows_1.PASSWORD;
|
|
218
|
+
(0, chai_1.expect)(account.password).to.match(/^\$scrypt\$/);
|
|
219
|
+
await expectVerifies(account);
|
|
220
|
+
await expectRefuses(account);
|
|
221
|
+
(0, chai_1.expect)(account.isHashOutdated("password")).to.equal(false);
|
|
222
|
+
});
|
|
223
|
+
it("verifies a hash of a lower cost by its own parameters and flags it", async () => {
|
|
224
|
+
const account = accountStoring(scryptRow(14));
|
|
225
|
+
await expectVerifies(account);
|
|
226
|
+
await expectRefuses(account);
|
|
227
|
+
(0, chai_1.expect)(account.isHashOutdated("password")).to.equal(true);
|
|
228
|
+
});
|
|
229
|
+
it("keeps the salt of each row while two async tests overlap", async () => {
|
|
230
|
+
const first = accountFrom(hash_rows_1.ROW_FROM_0_1_11);
|
|
231
|
+
const second = accountFrom({
|
|
232
|
+
_internal: {
|
|
233
|
+
meta: { HashModifier: { salt: "another-salt" } },
|
|
234
|
+
data: {
|
|
235
|
+
password: (0, node_crypto_1.createHash)("sha256")
|
|
236
|
+
.update("another-salt")
|
|
237
|
+
.update(JSON.stringify(WRONG_PASSWORD))
|
|
238
|
+
.digest("base64"),
|
|
239
|
+
},
|
|
240
|
+
},
|
|
241
|
+
});
|
|
242
|
+
const results = await Promise.all([
|
|
243
|
+
first.testHashAsync("password", hash_rows_1.PASSWORD),
|
|
244
|
+
second.testHashAsync("password", WRONG_PASSWORD),
|
|
245
|
+
first.testHashAsync("password", WRONG_PASSWORD),
|
|
246
|
+
second.testHashAsync("password", hash_rows_1.PASSWORD),
|
|
247
|
+
]);
|
|
248
|
+
(0, chai_1.expect)(results).to.deep.equal([true, true, false, false]);
|
|
249
|
+
});
|
|
250
|
+
});
|
|
251
|
+
(0, hash_rows_1.scryptSuite)("Modifiers - hash, assigning the stored hash back", () => {
|
|
252
|
+
const rows = {
|
|
253
|
+
"from 0.1.11": () => accountFrom(hash_rows_1.ROW_FROM_0_1_11),
|
|
254
|
+
current: () => newAccount(),
|
|
255
|
+
};
|
|
256
|
+
for (const [name, build] of Object.entries(rows)) {
|
|
257
|
+
it(`lock() on a ${name} row keeps the hash`, async () => {
|
|
258
|
+
const account = build();
|
|
259
|
+
const stored = account.password;
|
|
260
|
+
(0, common_1.lock)(account, hash_1.HashModifier, undefined);
|
|
261
|
+
(0, common_1.lock)(account, hash_1.HashModifier, ["password"]);
|
|
262
|
+
(0, chai_1.expect)(account.password).to.equal(stored);
|
|
263
|
+
await expectVerifies(account);
|
|
264
|
+
});
|
|
265
|
+
it(`assigning the hash of a ${name} row keeps it`, async () => {
|
|
266
|
+
const account = build();
|
|
267
|
+
const stored = account.password;
|
|
268
|
+
account.password = stored;
|
|
269
|
+
(0, chai_1.expect)(account.password).to.equal(stored);
|
|
270
|
+
await expectVerifies(account);
|
|
271
|
+
});
|
|
272
|
+
}
|
|
273
|
+
});
|
|
274
|
+
(0, hash_rows_1.scryptSuite)("Modifiers - hash, explicit algorithm", () => {
|
|
275
|
+
function fingerprintFrom(row) {
|
|
276
|
+
return (0, common_1.fromDatabase)(structuredClone(row), Fingerprint);
|
|
277
|
+
}
|
|
278
|
+
it("still verifies rows written by 0.1.11 and never flags them", async () => {
|
|
279
|
+
const row = fingerprintFrom(hash_rows_1.FINGERPRINT_ROW_FROM_0_1_11);
|
|
280
|
+
(0, chai_1.expect)(row.testHash("password", hash_rows_1.PASSWORD)).to.equal(true);
|
|
281
|
+
(0, chai_1.expect)(await row.testHashAsync("password", hash_rows_1.PASSWORD)).to.equal(true);
|
|
282
|
+
(0, chai_1.expect)(row.testHash("password", WRONG_PASSWORD)).to.equal(false);
|
|
283
|
+
(0, chai_1.expect)(row.testHash("checksum", { a: 1 })).to.equal(true);
|
|
284
|
+
(0, chai_1.expect)(row.testHash("checksum", { a: 2 })).to.equal(false);
|
|
285
|
+
(0, chai_1.expect)(row.isHashOutdated("password")).to.equal(false);
|
|
286
|
+
(0, chai_1.expect)(row.isHashOutdated("checksum")).to.equal(false);
|
|
287
|
+
});
|
|
288
|
+
it("still writes the same salted digest as 0.1.11", () => {
|
|
289
|
+
const row = fingerprintFrom(hash_rows_1.FINGERPRINT_ROW_FROM_0_1_11);
|
|
290
|
+
row.password = "another value";
|
|
291
|
+
(0, chai_1.expect)(row.password).to.equal((0, node_crypto_1.createHash)("sha256")
|
|
292
|
+
.update(hash_rows_1.FINGERPRINT_ROW_FROM_0_1_11._internal.meta.HashModifier.salt)
|
|
293
|
+
.update(JSON.stringify("another value"))
|
|
294
|
+
.digest("base64"));
|
|
295
|
+
});
|
|
296
|
+
it("verifies a scrypt hash and does not flag it, so it is not weakened", async () => {
|
|
297
|
+
const row = (0, common_1.fromDatabase)({ _internal: { meta: {}, data: { password: scryptRow(15) } } }, Fingerprint);
|
|
298
|
+
(0, chai_1.expect)(await row.testHashAsync("password", hash_rows_1.PASSWORD)).to.equal(true);
|
|
299
|
+
(0, chai_1.expect)(row.testHash("password", WRONG_PASSWORD)).to.equal(false);
|
|
300
|
+
(0, chai_1.expect)(row.isHashOutdated("password")).to.equal(false);
|
|
301
|
+
});
|
|
302
|
+
});
|
|
303
|
+
(0, hash_rows_1.scryptSuite)("Modifiers - hash, values that cannot verify", () => {
|
|
304
|
+
const unusable = [
|
|
305
|
+
["no value", undefined],
|
|
306
|
+
["a null value", null],
|
|
307
|
+
["a number", 42],
|
|
308
|
+
["a digest with no salt", "nPamXXaKC8N+8W7xqxTSo8r+pS9jXMkjJu2XMZtUR+A="],
|
|
309
|
+
["a bare prefix", "$scrypt$"],
|
|
310
|
+
["a key too short to compare", `$scrypt$ln=15,r=8,p=1$${SALT}$A`],
|
|
311
|
+
["an empty key", `$scrypt$ln=15,r=8,p=1$${SALT}$`],
|
|
312
|
+
["a salt too short", `$scrypt$ln=15,r=8,p=1$AAAA$${KEY}`],
|
|
313
|
+
["a cost over the memory limit", `$scrypt$ln=30,r=8,p=1$${SALT}$${KEY}`],
|
|
314
|
+
["a zero p", `$scrypt$ln=15,r=8,p=0$${SALT}$${KEY}`],
|
|
315
|
+
["a zero r", `$scrypt$ln=15,r=0,p=1$${SALT}$${KEY}`],
|
|
316
|
+
["a zero ln", `$scrypt$ln=0,r=8,p=1$${SALT}$${KEY}`],
|
|
317
|
+
["an N that r cannot hold", `$scrypt$ln=16,r=1,p=1$${SALT}$${KEY}`],
|
|
318
|
+
];
|
|
319
|
+
for (const [name, stored] of unusable) {
|
|
320
|
+
it(`refuses a row storing ${name} without throwing`, async () => {
|
|
321
|
+
await expectRefuses(accountStoring(stored), hash_rows_1.PASSWORD);
|
|
322
|
+
});
|
|
323
|
+
}
|
|
324
|
+
it("refuses an undefined candidate on a row with nothing stored", async () => {
|
|
325
|
+
await expectRefuses(new Account(), new Account().email);
|
|
326
|
+
});
|
|
327
|
+
it("refuses an undefined candidate on a row with a hash", async () => {
|
|
328
|
+
await expectRefuses(newAccount(), new Account().email);
|
|
329
|
+
});
|
|
330
|
+
});
|
|
331
|
+
(0, hash_rows_1.scryptSuite)("Modifiers - hash, limits of a stored string", () => {
|
|
332
|
+
function rowFor({ ln = 1, r = 1, p = 1, saltBytes = 16, keyBytes = 32 }) {
|
|
333
|
+
const salt = Buffer.alloc(saltBytes, 7);
|
|
334
|
+
const key = (0, node_crypto_1.scryptSync)(JSON.stringify(hash_rows_1.PASSWORD), salt, keyBytes, {
|
|
335
|
+
N: 2 ** ln,
|
|
336
|
+
r,
|
|
337
|
+
p,
|
|
338
|
+
maxmem: 2 ** 30,
|
|
339
|
+
});
|
|
340
|
+
const [encodedSalt, encodedKey] = [salt, key].map((part) => part.toString("base64").replace(/=+$/, ""));
|
|
341
|
+
return `$scrypt$ln=${ln},r=${r},p=${p}$${encodedSalt}$${encodedKey}`;
|
|
342
|
+
}
|
|
343
|
+
const overLimit = [
|
|
344
|
+
{ name: "a p of 17", cost: { p: 17 } },
|
|
345
|
+
{ name: "an r of 100", cost: { r: 100 } },
|
|
346
|
+
{ name: "memory above 128 MiB", cost: { ln: 17, r: 9 } },
|
|
347
|
+
{ name: "a salt of 65 bytes", cost: { saltBytes: 65 } },
|
|
348
|
+
{ name: "a salt of 15 bytes", cost: { saltBytes: 15 } },
|
|
349
|
+
{ name: "a key of 65 bytes", cost: { keyBytes: 65 } },
|
|
350
|
+
{ name: "a key of 15 bytes", cost: { keyBytes: 15 } },
|
|
351
|
+
];
|
|
352
|
+
for (const { name, cost } of overLimit) {
|
|
353
|
+
it(`refuses the right password on a row asking for ${name}`, async () => {
|
|
354
|
+
const account = accountStoring(rowFor(cost));
|
|
355
|
+
await expectRefuses(account, hash_rows_1.PASSWORD);
|
|
356
|
+
(0, chai_1.expect)(account.isHashOutdated("password")).to.equal(true);
|
|
357
|
+
});
|
|
358
|
+
}
|
|
359
|
+
const atLimit = [
|
|
360
|
+
{ name: "a p of 16", cost: { p: 16 } },
|
|
361
|
+
{ name: "128 MiB of memory", cost: { ln: 17, r: 8 } },
|
|
362
|
+
{ name: "64-byte salt and key", cost: { saltBytes: 64, keyBytes: 64 } },
|
|
363
|
+
];
|
|
364
|
+
for (const { name, cost } of atLimit) {
|
|
365
|
+
it(`verifies the right password on a row asking for ${name}`, () => {
|
|
366
|
+
const account = accountStoring(rowFor(cost));
|
|
367
|
+
(0, chai_1.expect)(account.testHash("password", hash_rows_1.PASSWORD)).to.equal(true);
|
|
368
|
+
});
|
|
369
|
+
}
|
|
370
|
+
});
|
|
371
|
+
(0, hash_rows_1.scryptSuite)("Modifiers - hash, cost of a test", () => {
|
|
372
|
+
it("testHashAsync lets the event loop turn while it runs", async () => {
|
|
373
|
+
const account = newAccount();
|
|
374
|
+
let turns = 0;
|
|
375
|
+
const timer = setInterval(() => {
|
|
376
|
+
turns += 1;
|
|
377
|
+
}, 1);
|
|
378
|
+
await account.testHashAsync("password", hash_rows_1.PASSWORD);
|
|
379
|
+
clearInterval(timer);
|
|
380
|
+
(0, chai_1.expect)(turns).to.be.greaterThan(0);
|
|
381
|
+
});
|
|
382
|
+
it("a refusal costs a scrypt run whatever the row holds", () => {
|
|
383
|
+
const current = newAccount();
|
|
384
|
+
const legacy = accountFrom(hash_rows_1.ROW_FROM_0_1_11);
|
|
385
|
+
const empty = new Account();
|
|
386
|
+
const full = fastestMs(() => current.testHash("password", WRONG_PASSWORD));
|
|
387
|
+
for (const account of [legacy, empty]) {
|
|
388
|
+
const refused = fastestMs(() => account.testHash("password", WRONG_PASSWORD));
|
|
389
|
+
(0, chai_1.expect)(refused).to.be.greaterThan(full / 4);
|
|
390
|
+
}
|
|
391
|
+
});
|
|
392
|
+
it("a field with an explicit digest does not pay for scrypt", () => {
|
|
393
|
+
const row = new Fingerprint();
|
|
394
|
+
row.password = hash_rows_1.PASSWORD;
|
|
395
|
+
const digest = fastestMs(() => row.testHash("password", WRONG_PASSWORD));
|
|
396
|
+
const current = newAccount();
|
|
397
|
+
const full = fastestMs(() => current.testHash("password", WRONG_PASSWORD));
|
|
398
|
+
(0, chai_1.expect)(digest).to.be.lessThan(full / 4);
|
|
399
|
+
});
|
|
24
400
|
});
|
|
25
401
|
class TestableHashModifier extends hash_1.HashModifier {
|
|
26
402
|
setOptions(options) {
|
|
@@ -36,93 +412,4 @@ class TestableHashModifier extends hash_1.HashModifier {
|
|
|
36
412
|
this.meta = meta;
|
|
37
413
|
}
|
|
38
414
|
}
|
|
39
|
-
async function HashStringValuesTest() {
|
|
40
|
-
const modifier = new TestableHashModifier();
|
|
41
|
-
modifier.setOptions({ algorithm: "sha256" });
|
|
42
|
-
modifier.setMeta({});
|
|
43
|
-
const originalValue = "password123";
|
|
44
|
-
const hashed = modifier.lock(undefined, originalValue);
|
|
45
|
-
(0, chai_1.expect)(hashed).to.be.a("string");
|
|
46
|
-
(0, chai_1.expect)(hashed).to.not.equal(originalValue);
|
|
47
|
-
(0, chai_1.expect)(modifier.getMeta().salt).to.be.a("string");
|
|
48
|
-
}
|
|
49
|
-
async function HashObjectValuesTest() {
|
|
50
|
-
const modifier = new TestableHashModifier();
|
|
51
|
-
modifier.setOptions({ algorithm: "sha256" });
|
|
52
|
-
modifier.setMeta({});
|
|
53
|
-
const originalValue = { name: "John", age: 30 };
|
|
54
|
-
const hashed = modifier.lock(undefined, originalValue);
|
|
55
|
-
(0, chai_1.expect)(hashed).to.be.a("string");
|
|
56
|
-
(0, chai_1.expect)(hashed).to.not.equal(JSON.stringify(originalValue));
|
|
57
|
-
}
|
|
58
|
-
async function HandleUndefinedValuesTest() {
|
|
59
|
-
const modifier = new TestableHashModifier();
|
|
60
|
-
modifier.setOptions({ algorithm: "sha256" });
|
|
61
|
-
modifier.setMeta({});
|
|
62
|
-
const hashed = modifier.lock(undefined, undefined);
|
|
63
|
-
(0, chai_1.expect)(hashed).to.equal(undefined);
|
|
64
|
-
}
|
|
65
|
-
async function UseCustomHashAlgorithmTest() {
|
|
66
|
-
const modifier = new TestableHashModifier();
|
|
67
|
-
modifier.setOptions({ algorithm: "md5" });
|
|
68
|
-
modifier.setMeta({});
|
|
69
|
-
const originalValue = "test data";
|
|
70
|
-
const hashed = modifier.lock(undefined, originalValue);
|
|
71
|
-
(0, chai_1.expect)(hashed).to.be.a("string");
|
|
72
|
-
(0, chai_1.expect)(hashed).to.not.equal(originalValue);
|
|
73
|
-
(0, chai_1.expect)(modifier.getOptions().algorithm).to.equal("md5");
|
|
74
|
-
}
|
|
75
|
-
async function GenerateUniqueSaltForEachFieldTest() {
|
|
76
|
-
const modifier1 = new TestableHashModifier();
|
|
77
|
-
modifier1.setOptions({ algorithm: "sha256" });
|
|
78
|
-
modifier1.setMeta({});
|
|
79
|
-
const modifier2 = new TestableHashModifier();
|
|
80
|
-
modifier2.setOptions({ algorithm: "sha256" });
|
|
81
|
-
modifier2.setMeta({});
|
|
82
|
-
const value = "test data";
|
|
83
|
-
const hashed1 = modifier1.lock(undefined, value);
|
|
84
|
-
const hashed2 = modifier2.lock(undefined, value);
|
|
85
|
-
(0, chai_1.expect)(hashed1).to.not.equal(hashed2);
|
|
86
|
-
(0, chai_1.expect)(modifier1.getMeta().salt).to.not.equal(modifier2.getMeta().salt);
|
|
87
|
-
}
|
|
88
|
-
async function HandleHashDecoratorTest() {
|
|
89
|
-
class TestTable extends table_1.Table.with(hash_1.HashModifier) {
|
|
90
|
-
}
|
|
91
|
-
__decorate([
|
|
92
|
-
(0, hash_1.Hashed)({ algorithm: "sha256" }),
|
|
93
|
-
(0, table_1.Field)("string"),
|
|
94
|
-
__metadata("design:type", String)
|
|
95
|
-
], TestTable.prototype, "password", void 0);
|
|
96
|
-
const instance = new TestTable();
|
|
97
|
-
instance.password = "myPassword123";
|
|
98
|
-
(0, chai_1.expect)(instance.testHash("password", "myPassword123")).to.equal(true);
|
|
99
|
-
(0, chai_1.expect)(instance.testHash("password", "notMyPassword")).to.equal(false);
|
|
100
|
-
}
|
|
101
|
-
async function TestHashValuesTest() {
|
|
102
|
-
const modifier = new TestableHashModifier();
|
|
103
|
-
modifier.setOptions({ algorithm: "sha256" });
|
|
104
|
-
modifier.setMeta({});
|
|
105
|
-
const originalValue = "test data";
|
|
106
|
-
const hashed = modifier.lock(undefined, originalValue);
|
|
107
|
-
const isMatch = modifier.test(hashed, originalValue);
|
|
108
|
-
const isNotMatch = modifier.test(hashed, "wrong data");
|
|
109
|
-
(0, chai_1.expect)(isMatch).to.equal(true);
|
|
110
|
-
(0, chai_1.expect)(isNotMatch).to.equal(false);
|
|
111
|
-
}
|
|
112
|
-
async function ProvideTestHashMethodTest() {
|
|
113
|
-
class TestTable extends table_1.Table.with(hash_1.HashModifier) {
|
|
114
|
-
}
|
|
115
|
-
__decorate([
|
|
116
|
-
(0, hash_1.Hashed)({ algorithm: "sha256" }),
|
|
117
|
-
(0, table_1.Field)("string"),
|
|
118
|
-
__metadata("design:type", String)
|
|
119
|
-
], TestTable.prototype, "password", void 0);
|
|
120
|
-
const instance = new TestTable();
|
|
121
|
-
instance.password = "myPassword123";
|
|
122
|
-
(0, chai_1.expect)(typeof instance.testHash).to.equal("function");
|
|
123
|
-
const isMatch = instance.testHash("password", "myPassword123");
|
|
124
|
-
const isNotMatch = instance.testHash("password", "wrongPassword");
|
|
125
|
-
(0, chai_1.expect)(isMatch).to.equal(true);
|
|
126
|
-
(0, chai_1.expect)(isNotMatch).to.equal(false);
|
|
127
|
-
}
|
|
128
415
|
//# sourceMappingURL=hash.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hash.test.js","sourceRoot":"","sources":["../../../src/tests/modifiers/hash.test.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"hash.test.js","sourceRoot":"","sources":["../../../src/tests/modifiers/hash.test.ts"],"names":[],"mappings":"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"}
|