@oneuptime/common 12.0.21 → 12.0.22
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/Models/DatabaseModels/Index.ts +2 -0
- package/Models/DatabaseModels/UserTwoFactorBackupCode.ts +262 -0
- package/Server/API/UserTwoFactorBackupCodeAPI.ts +258 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1789100000000-AddUserTwoFactorBackupCode.ts +63 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +2 -0
- package/Server/Services/Index.ts +2 -0
- package/Server/Services/UserService.ts +42 -0
- package/Server/Services/UserTwoFactorBackupCodeService.ts +355 -0
- package/Server/Utils/TwoFactorBackupCode.ts +266 -0
- package/Tests/Server/API/UserAuthenticationAPI.test.ts +16 -3
- package/Tests/Server/API/UserTwoFactorAuthAdminAPI.test.ts +18 -2
- package/Tests/Server/API/UserTwoFactorBackupCodeAPI.test.ts +1390 -0
- package/Tests/Server/Services/UserAuthenticationService.test.ts +23 -1
- package/Tests/Server/Services/UserTwoFactorAuthAdmin.test.ts +21 -0
- package/Tests/Server/Services/UserTwoFactorBackupCodeAdminSurface.test.ts +919 -0
- package/Tests/Server/Services/UserTwoFactorBackupCodeService.test.ts +862 -0
- package/Tests/Server/Utils/TwoFactorBackupCode.test.ts +475 -0
- package/Types/Email/EmailTemplateType.ts +2 -0
- package/Types/UserAuthenticationStatus.ts +16 -0
- package/build/dist/Models/DatabaseModels/Index.js +2 -0
- package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserTwoFactorBackupCode.js +277 -0
- package/build/dist/Models/DatabaseModels/UserTwoFactorBackupCode.js.map +1 -0
- package/build/dist/Server/API/UserTwoFactorBackupCodeAPI.js +201 -0
- package/build/dist/Server/API/UserTwoFactorBackupCodeAPI.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1789100000000-AddUserTwoFactorBackupCode.js +46 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1789100000000-AddUserTwoFactorBackupCode.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +2 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
- package/build/dist/Server/Services/Index.js +2 -0
- package/build/dist/Server/Services/Index.js.map +1 -1
- package/build/dist/Server/Services/UserService.js +39 -0
- package/build/dist/Server/Services/UserService.js.map +1 -1
- package/build/dist/Server/Services/UserTwoFactorBackupCodeService.js +327 -0
- package/build/dist/Server/Services/UserTwoFactorBackupCodeService.js.map +1 -0
- package/build/dist/Server/Utils/TwoFactorBackupCode.js +269 -0
- package/build/dist/Server/Utils/TwoFactorBackupCode.js.map +1 -0
- package/build/dist/Types/Email/EmailTemplateType.js +2 -0
- package/build/dist/Types/Email/EmailTemplateType.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,475 @@
|
|
|
1
|
+
import TwoFactorBackupCode, {
|
|
2
|
+
BackupCodeAlphabet,
|
|
3
|
+
BackupCodeLength,
|
|
4
|
+
BackupCodeSetSize,
|
|
5
|
+
} from "../../../Server/Utils/TwoFactorBackupCode";
|
|
6
|
+
import { EncryptionSecret } from "../../../Server/EnvironmentConfig";
|
|
7
|
+
import ObjectID from "../../../Types/ObjectID";
|
|
8
|
+
import crypto from "crypto";
|
|
9
|
+
import { describe, expect, it } from "@jest/globals";
|
|
10
|
+
|
|
11
|
+
/*
|
|
12
|
+
* ---------------------------------------------------------------------------
|
|
13
|
+
* The code generation and hashing behind two factor backup codes.
|
|
14
|
+
*
|
|
15
|
+
* WHAT THIS FILE IS GUARDING
|
|
16
|
+
*
|
|
17
|
+
* A backup code is the last door into an account whose second factor is gone,
|
|
18
|
+
* so it fails in two directions and both are unacceptable:
|
|
19
|
+
*
|
|
20
|
+
* - too weak, and a caller who has the password guesses their way past two
|
|
21
|
+
* factor auth. The whole security argument for this feature rests on the
|
|
22
|
+
* code space being enormous, so the alphabet, the length and the uniformity
|
|
23
|
+
* of the draw are pinned here rather than left to a comment;
|
|
24
|
+
* - too strict, and a user who typed exactly the right code off a piece of
|
|
25
|
+
* paper is told it is wrong. Those users are, by definition, already locked
|
|
26
|
+
* out and already panicking, and every transcription rule the alphabet was
|
|
27
|
+
* designed around (I/1, L/1, O/0, the display hyphen, a lowercase phone
|
|
28
|
+
* keyboard) is a way to produce that failure if normalization drifts.
|
|
29
|
+
*
|
|
30
|
+
* NOTHING IS MOCKED. The point of these tests is the real crypto: real
|
|
31
|
+
* randomness from crypto.randomInt, real HMAC keyed by the real
|
|
32
|
+
* EnvironmentConfig secret. The expected digests are recomputed here from
|
|
33
|
+
* Node's crypto directly rather than by calling the function under test, so a
|
|
34
|
+
* change to the construction has to be a deliberate, visible one.
|
|
35
|
+
*
|
|
36
|
+
* The single-use SEMANTICS are not here -- they live in Postgres, and are
|
|
37
|
+
* covered by Common/Tests/Server/Services/UserTwoFactorBackupCodeService.test.ts.
|
|
38
|
+
* ---------------------------------------------------------------------------
|
|
39
|
+
*/
|
|
40
|
+
|
|
41
|
+
const USER_ID: ObjectID = new ObjectID("11111111-1111-4111-8111-111111111111");
|
|
42
|
+
const OTHER_USER_ID: ObjectID = new ObjectID(
|
|
43
|
+
"22222222-2222-4222-8222-222222222222",
|
|
44
|
+
);
|
|
45
|
+
|
|
46
|
+
/*
|
|
47
|
+
* The digest, recomputed from the RFC primitives rather than from the module
|
|
48
|
+
* under test. If the construction in TwoFactorBackupCode.hashCode is changed,
|
|
49
|
+
* this stops matching -- which is the point: the digest of every stored code
|
|
50
|
+
* depends on it, so a silent change is a silent invalidation of every backup
|
|
51
|
+
* code every user is holding.
|
|
52
|
+
*/
|
|
53
|
+
type ExpectedHashFunction = (data: {
|
|
54
|
+
code: string;
|
|
55
|
+
userId: ObjectID;
|
|
56
|
+
}) => string;
|
|
57
|
+
|
|
58
|
+
const expectedHash: ExpectedHashFunction = (data: {
|
|
59
|
+
code: string;
|
|
60
|
+
userId: ObjectID;
|
|
61
|
+
}): string => {
|
|
62
|
+
const parts: Array<string> = ["v1", data.userId.toString(), data.code];
|
|
63
|
+
|
|
64
|
+
const message: string = parts
|
|
65
|
+
.map((part: string) => {
|
|
66
|
+
return `${part.length}:${part}`;
|
|
67
|
+
})
|
|
68
|
+
.join("");
|
|
69
|
+
|
|
70
|
+
return crypto
|
|
71
|
+
.createHmac("sha256", EncryptionSecret.toString())
|
|
72
|
+
.update(message)
|
|
73
|
+
.digest("hex");
|
|
74
|
+
};
|
|
75
|
+
|
|
76
|
+
describe("TwoFactorBackupCode.generateCode -- the code space", () => {
|
|
77
|
+
it("draws only from the declared alphabet", () => {
|
|
78
|
+
const violations: Array<string> = [];
|
|
79
|
+
|
|
80
|
+
for (let attempt: number = 0; attempt < 200; attempt++) {
|
|
81
|
+
const code: string = TwoFactorBackupCode.generateCode();
|
|
82
|
+
|
|
83
|
+
for (const character of code) {
|
|
84
|
+
if (!BackupCodeAlphabet.includes(character)) {
|
|
85
|
+
violations.push(`${code} contains ${character}`);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
expect(violations).toEqual([]);
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
it("is exactly BackupCodeLength characters long every time", () => {
|
|
94
|
+
const lengths: Set<number> = new Set<number>();
|
|
95
|
+
|
|
96
|
+
for (let attempt: number = 0; attempt < 200; attempt++) {
|
|
97
|
+
lengths.add(TwoFactorBackupCode.generateCode().length);
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
expect(Array.from(lengths)).toEqual([BackupCodeLength]);
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
/*
|
|
104
|
+
* The alphabet is not decoration. Every symbol it excludes is one a person
|
|
105
|
+
* transcribes wrongly off a printed list -- and `normalizeCode` MAPS those
|
|
106
|
+
* symbols onto their lookalikes, so a generator that emitted an `O` would
|
|
107
|
+
* produce a code that normalizes to a DIFFERENT code and can never be
|
|
108
|
+
* redeemed. The exclusion and the mapping have to stay in step.
|
|
109
|
+
*/
|
|
110
|
+
it.each(["I", "L", "O", "U"])(
|
|
111
|
+
"never emits the ambiguous character %p",
|
|
112
|
+
(character: string) => {
|
|
113
|
+
expect(BackupCodeAlphabet).not.toContain(character);
|
|
114
|
+
},
|
|
115
|
+
);
|
|
116
|
+
|
|
117
|
+
it("has a 32 symbol alphabet, so ten characters is 2^50", () => {
|
|
118
|
+
expect(BackupCodeAlphabet.length).toBe(32);
|
|
119
|
+
expect(BackupCodeLength).toBe(10);
|
|
120
|
+
|
|
121
|
+
/*
|
|
122
|
+
* Stated as an assertion rather than a comment because the security case
|
|
123
|
+
* for this whole feature is this number. At 2^50 a caller holding the
|
|
124
|
+
* password guesses one of ten live codes with probability ~1e-14 per
|
|
125
|
+
* attempt; shortening the code or shrinking the alphabet would quietly
|
|
126
|
+
* move that into range of the rate limiter's budget.
|
|
127
|
+
*/
|
|
128
|
+
expect(Math.pow(BackupCodeAlphabet.length, BackupCodeLength)).toBe(
|
|
129
|
+
Math.pow(2, 50),
|
|
130
|
+
);
|
|
131
|
+
});
|
|
132
|
+
|
|
133
|
+
/*
|
|
134
|
+
* A uniformity smoke test, not a statistical proof. It exists to catch the
|
|
135
|
+
* one realistic implementation slip -- a modulo reduction over a range that
|
|
136
|
+
* is not a multiple of the alphabet size, which biases the first few symbols
|
|
137
|
+
* and shrinks the effective key space. With 32000 draws every symbol should
|
|
138
|
+
* land ~1000 times; a biased implementation misses this by a mile.
|
|
139
|
+
*/
|
|
140
|
+
it("draws every symbol, roughly uniformly", () => {
|
|
141
|
+
const counts: Map<string, number> = new Map<string, number>();
|
|
142
|
+
|
|
143
|
+
for (const character of BackupCodeAlphabet) {
|
|
144
|
+
counts.set(character, 0);
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
const drawCount: number = 3200;
|
|
148
|
+
|
|
149
|
+
for (let attempt: number = 0; attempt < drawCount; attempt++) {
|
|
150
|
+
for (const character of TwoFactorBackupCode.generateCode()) {
|
|
151
|
+
counts.set(character, (counts.get(character) || 0) + 1);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
const totalDraws: number = drawCount * BackupCodeLength;
|
|
156
|
+
const expectedPerSymbol: number = totalDraws / BackupCodeAlphabet.length;
|
|
157
|
+
|
|
158
|
+
const violations: Array<string> = [];
|
|
159
|
+
|
|
160
|
+
for (const [character, count] of counts) {
|
|
161
|
+
if (count < expectedPerSymbol * 0.6 || count > expectedPerSymbol * 1.4) {
|
|
162
|
+
violations.push(
|
|
163
|
+
`${character}: ${count} (expected ~${expectedPerSymbol})`,
|
|
164
|
+
);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
expect(violations).toEqual([]);
|
|
169
|
+
});
|
|
170
|
+
|
|
171
|
+
it("does not repeat itself", () => {
|
|
172
|
+
const codes: Set<string> = new Set<string>();
|
|
173
|
+
|
|
174
|
+
for (let attempt: number = 0; attempt < 500; attempt++) {
|
|
175
|
+
codes.add(TwoFactorBackupCode.generateCode());
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
expect(codes.size).toBe(500);
|
|
179
|
+
});
|
|
180
|
+
});
|
|
181
|
+
|
|
182
|
+
describe("TwoFactorBackupCode.generateCodeSet", () => {
|
|
183
|
+
it("issues BackupCodeSetSize codes by default", () => {
|
|
184
|
+
expect(TwoFactorBackupCode.generateCodeSet()).toHaveLength(
|
|
185
|
+
BackupCodeSetSize,
|
|
186
|
+
);
|
|
187
|
+
});
|
|
188
|
+
|
|
189
|
+
it("honours an explicit count", () => {
|
|
190
|
+
expect(TwoFactorBackupCode.generateCodeSet(3)).toHaveLength(3);
|
|
191
|
+
});
|
|
192
|
+
|
|
193
|
+
/*
|
|
194
|
+
* Duplicates inside one set would not weaken the code space -- they would
|
|
195
|
+
* break SINGLE USE. Two rows sharing a digest means consuming one leaves an
|
|
196
|
+
* identical, still-unspent second row behind, so a code advertised as
|
|
197
|
+
* one-time would work twice.
|
|
198
|
+
*/
|
|
199
|
+
it("never issues the same code twice in one set", () => {
|
|
200
|
+
for (let attempt: number = 0; attempt < 50; attempt++) {
|
|
201
|
+
const codes: Array<string> = TwoFactorBackupCode.generateCodeSet();
|
|
202
|
+
|
|
203
|
+
expect(new Set(codes).size).toBe(codes.length);
|
|
204
|
+
}
|
|
205
|
+
});
|
|
206
|
+
});
|
|
207
|
+
|
|
208
|
+
describe("TwoFactorBackupCode.formatForDisplay", () => {
|
|
209
|
+
it("splits a ten character code into two groups of five", () => {
|
|
210
|
+
expect(TwoFactorBackupCode.formatForDisplay("ABCDE12345")).toBe(
|
|
211
|
+
"ABCDE-12345",
|
|
212
|
+
);
|
|
213
|
+
});
|
|
214
|
+
|
|
215
|
+
/*
|
|
216
|
+
* The hyphen is cosmetic and must survive the round trip, or every code we
|
|
217
|
+
* show the user is a code they cannot type back in.
|
|
218
|
+
*/
|
|
219
|
+
it("produces something normalizeCode maps back to the original", () => {
|
|
220
|
+
const violations: Array<string> = [];
|
|
221
|
+
|
|
222
|
+
for (let attempt: number = 0; attempt < 200; attempt++) {
|
|
223
|
+
const code: string = TwoFactorBackupCode.generateCode();
|
|
224
|
+
const displayed: string = TwoFactorBackupCode.formatForDisplay(code);
|
|
225
|
+
|
|
226
|
+
if (TwoFactorBackupCode.normalizeCode(displayed) !== code) {
|
|
227
|
+
violations.push(`${code} -> ${displayed}`);
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
expect(violations).toEqual([]);
|
|
232
|
+
});
|
|
233
|
+
});
|
|
234
|
+
|
|
235
|
+
describe("TwoFactorBackupCode.normalizeCode -- what a locked-out user types", () => {
|
|
236
|
+
it("accepts the code exactly as displayed", () => {
|
|
237
|
+
expect(TwoFactorBackupCode.normalizeCode("ABCDE-12345")).toBe("ABCDE12345");
|
|
238
|
+
});
|
|
239
|
+
|
|
240
|
+
it.each([
|
|
241
|
+
["lowercase from a phone keyboard", "abcde-12345", "ABCDE12345"],
|
|
242
|
+
["no hyphen at all", "ABCDE12345", "ABCDE12345"],
|
|
243
|
+
["a space where the hyphen was", "ABCDE 12345", "ABCDE12345"],
|
|
244
|
+
["leading and trailing whitespace", " ABCDE-12345 ", "ABCDE12345"],
|
|
245
|
+
["a clipboard that inserted newlines", "ABCDE\n12345", "ABCDE12345"],
|
|
246
|
+
["mixed case and stray punctuation", "aB.cD/e-1 2345", "ABCDE12345"],
|
|
247
|
+
])("handles %s", (_label: string, raw: string, expected: string) => {
|
|
248
|
+
expect(TwoFactorBackupCode.normalizeCode(raw)).toBe(expected);
|
|
249
|
+
});
|
|
250
|
+
|
|
251
|
+
/*
|
|
252
|
+
* Crockford's transcription rules. These are the ONLY reason the alphabet
|
|
253
|
+
* drops these letters -- if the mapping went away, the exclusion would just
|
|
254
|
+
* be an arbitrary restriction and a user reading `0` as `O` off a printout
|
|
255
|
+
* would be told their code is invalid.
|
|
256
|
+
*/
|
|
257
|
+
it.each([
|
|
258
|
+
["O", "0"],
|
|
259
|
+
["o", "0"],
|
|
260
|
+
["I", "1"],
|
|
261
|
+
["i", "1"],
|
|
262
|
+
["L", "1"],
|
|
263
|
+
["l", "1"],
|
|
264
|
+
])("maps the lookalike %p to %p", (typed: string, canonical: string) => {
|
|
265
|
+
expect(TwoFactorBackupCode.normalizeCode(typed)).toBe(canonical);
|
|
266
|
+
});
|
|
267
|
+
|
|
268
|
+
/*
|
|
269
|
+
* `U` is excluded from the alphabet with no lookalike to map onto, so it is
|
|
270
|
+
* dropped rather than translated. Pinned so that nobody "helpfully" maps it
|
|
271
|
+
* to V later and changes what a submitted code means.
|
|
272
|
+
*/
|
|
273
|
+
it("drops U rather than mapping it", () => {
|
|
274
|
+
expect(TwoFactorBackupCode.normalizeCode("UUU")).toBe("");
|
|
275
|
+
});
|
|
276
|
+
|
|
277
|
+
/*
|
|
278
|
+
* The code arrives straight off a JSON body, so it is only a string because
|
|
279
|
+
* the caller chose to make it one. Anything else must fail verification
|
|
280
|
+
* rather than throw out of the normalizer and surface as a 500 -- an
|
|
281
|
+
* unhandled exception on the login path is both an availability bug and a
|
|
282
|
+
* way to tell requests apart.
|
|
283
|
+
*/
|
|
284
|
+
it.each([[undefined], [null], [12345], [{}], [[]], [true]])(
|
|
285
|
+
"returns empty for the non-string input %p",
|
|
286
|
+
(raw: unknown) => {
|
|
287
|
+
expect(TwoFactorBackupCode.normalizeCode(raw as string)).toBe("");
|
|
288
|
+
},
|
|
289
|
+
);
|
|
290
|
+
|
|
291
|
+
it("returns empty for a string with nothing usable in it", () => {
|
|
292
|
+
expect(TwoFactorBackupCode.normalizeCode(" --- ")).toBe("");
|
|
293
|
+
});
|
|
294
|
+
});
|
|
295
|
+
|
|
296
|
+
describe("TwoFactorBackupCode.hashCode", () => {
|
|
297
|
+
it("matches an independently computed HMAC", () => {
|
|
298
|
+
const code: string = "ABCDE12345";
|
|
299
|
+
|
|
300
|
+
expect(TwoFactorBackupCode.hashCode({ code: code, userId: USER_ID })).toBe(
|
|
301
|
+
expectedHash({ code: code, userId: USER_ID }),
|
|
302
|
+
);
|
|
303
|
+
});
|
|
304
|
+
|
|
305
|
+
it("is deterministic, which is what lets a code be looked up by digest", () => {
|
|
306
|
+
const code: string = TwoFactorBackupCode.generateCode();
|
|
307
|
+
|
|
308
|
+
expect(TwoFactorBackupCode.hashCode({ code: code, userId: USER_ID })).toBe(
|
|
309
|
+
TwoFactorBackupCode.hashCode({ code: code, userId: USER_ID }),
|
|
310
|
+
);
|
|
311
|
+
});
|
|
312
|
+
|
|
313
|
+
/*
|
|
314
|
+
* Domain separation. Without it, one precomputed table inverts every
|
|
315
|
+
* account's codes at once, and two users issued the same code would be
|
|
316
|
+
* visibly linked by identical rows.
|
|
317
|
+
*/
|
|
318
|
+
it("gives two users different digests for the same code", () => {
|
|
319
|
+
const code: string = "ABCDE12345";
|
|
320
|
+
|
|
321
|
+
expect(
|
|
322
|
+
TwoFactorBackupCode.hashCode({ code: code, userId: USER_ID }),
|
|
323
|
+
).not.toBe(
|
|
324
|
+
TwoFactorBackupCode.hashCode({ code: code, userId: OTHER_USER_ID }),
|
|
325
|
+
);
|
|
326
|
+
});
|
|
327
|
+
|
|
328
|
+
/*
|
|
329
|
+
* The digest is computed over the NORMALIZED code, not the raw submission.
|
|
330
|
+
* If it were not, a user who typed their code with the hyphen would hash to
|
|
331
|
+
* something that matches nothing -- the exact lockout the normalizer exists
|
|
332
|
+
* to prevent, moved one function along.
|
|
333
|
+
*/
|
|
334
|
+
it.each(["ABCDE-12345", "abcde12345", " abcde-12345 ", "ABCDE 12345"])(
|
|
335
|
+
"hashes %p to the same digest as the canonical form",
|
|
336
|
+
(raw: string) => {
|
|
337
|
+
expect(TwoFactorBackupCode.hashCode({ code: raw, userId: USER_ID })).toBe(
|
|
338
|
+
TwoFactorBackupCode.hashCode({
|
|
339
|
+
code: "ABCDE12345",
|
|
340
|
+
userId: USER_ID,
|
|
341
|
+
}),
|
|
342
|
+
);
|
|
343
|
+
},
|
|
344
|
+
);
|
|
345
|
+
|
|
346
|
+
it("produces 64 hex characters, which fits the ShortText column", () => {
|
|
347
|
+
const digest: string = TwoFactorBackupCode.hashCode({
|
|
348
|
+
code: TwoFactorBackupCode.generateCode(),
|
|
349
|
+
userId: USER_ID,
|
|
350
|
+
});
|
|
351
|
+
|
|
352
|
+
expect(digest).toMatch(/^[0-9a-f]{64}$/);
|
|
353
|
+
expect(digest.length).toBeLessThanOrEqual(100);
|
|
354
|
+
});
|
|
355
|
+
|
|
356
|
+
/*
|
|
357
|
+
* Length prefixing. Without it, concatenation is ambiguous: a userId of
|
|
358
|
+
* "ab" with code "cd" and a userId of "abc" with code "d" would produce the
|
|
359
|
+
* same message and therefore the same digest.
|
|
360
|
+
*/
|
|
361
|
+
it("cannot be confused by rearranging the boundary between user and code", () => {
|
|
362
|
+
const first: string = TwoFactorBackupCode.hashCode({
|
|
363
|
+
code: "CD",
|
|
364
|
+
userId: new ObjectID("ab"),
|
|
365
|
+
});
|
|
366
|
+
|
|
367
|
+
const second: string = TwoFactorBackupCode.hashCode({
|
|
368
|
+
code: "D",
|
|
369
|
+
userId: new ObjectID("abc"),
|
|
370
|
+
});
|
|
371
|
+
|
|
372
|
+
expect(first).not.toBe(second);
|
|
373
|
+
});
|
|
374
|
+
|
|
375
|
+
/*
|
|
376
|
+
* The plaintext must not be recoverable from the digest by anything short of
|
|
377
|
+
* brute force -- in particular, the digest must not merely BE the code, or
|
|
378
|
+
* contain it, which is the shape a careless "hash" refactor tends to take.
|
|
379
|
+
*/
|
|
380
|
+
it("does not contain the code it was computed from", () => {
|
|
381
|
+
const code: string = TwoFactorBackupCode.generateCode();
|
|
382
|
+
|
|
383
|
+
const digest: string = TwoFactorBackupCode.hashCode({
|
|
384
|
+
code: code,
|
|
385
|
+
userId: USER_ID,
|
|
386
|
+
});
|
|
387
|
+
|
|
388
|
+
expect(digest).not.toContain(code);
|
|
389
|
+
expect(digest).not.toContain(code.toLowerCase());
|
|
390
|
+
});
|
|
391
|
+
|
|
392
|
+
it("changes completely when a single character of the code changes", () => {
|
|
393
|
+
const a: string = TwoFactorBackupCode.hashCode({
|
|
394
|
+
code: "ABCDE12345",
|
|
395
|
+
userId: USER_ID,
|
|
396
|
+
});
|
|
397
|
+
|
|
398
|
+
const b: string = TwoFactorBackupCode.hashCode({
|
|
399
|
+
code: "ABCDE12346",
|
|
400
|
+
userId: USER_ID,
|
|
401
|
+
});
|
|
402
|
+
|
|
403
|
+
expect(a).not.toBe(b);
|
|
404
|
+
});
|
|
405
|
+
|
|
406
|
+
it("hashes an empty code to something no real code can collide with", () => {
|
|
407
|
+
/*
|
|
408
|
+
* An empty submission still produces a digest here -- the refusal lives in
|
|
409
|
+
* the service, which never gets this far. What matters is that the digest
|
|
410
|
+
* of "" is not the digest of any generated code, so a caller sending an
|
|
411
|
+
* empty string can never match a row even if a future caller forgets the
|
|
412
|
+
* guard.
|
|
413
|
+
*/
|
|
414
|
+
const emptyDigest: string = TwoFactorBackupCode.hashCode({
|
|
415
|
+
code: "",
|
|
416
|
+
userId: USER_ID,
|
|
417
|
+
});
|
|
418
|
+
|
|
419
|
+
const violations: Array<string> = [];
|
|
420
|
+
|
|
421
|
+
for (let attempt: number = 0; attempt < 100; attempt++) {
|
|
422
|
+
const code: string = TwoFactorBackupCode.generateCode();
|
|
423
|
+
|
|
424
|
+
if (
|
|
425
|
+
TwoFactorBackupCode.hashCode({ code: code, userId: USER_ID }) ===
|
|
426
|
+
emptyDigest
|
|
427
|
+
) {
|
|
428
|
+
violations.push(code);
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
|
|
432
|
+
expect(violations).toEqual([]);
|
|
433
|
+
});
|
|
434
|
+
});
|
|
435
|
+
|
|
436
|
+
describe("TwoFactorBackupCode.isHashEqual", () => {
|
|
437
|
+
it("accepts two identical digests", () => {
|
|
438
|
+
const digest: string = TwoFactorBackupCode.hashCode({
|
|
439
|
+
code: "ABCDE12345",
|
|
440
|
+
userId: USER_ID,
|
|
441
|
+
});
|
|
442
|
+
|
|
443
|
+
expect(TwoFactorBackupCode.isHashEqual(digest, digest)).toBe(true);
|
|
444
|
+
});
|
|
445
|
+
|
|
446
|
+
it("rejects two different digests", () => {
|
|
447
|
+
expect(
|
|
448
|
+
TwoFactorBackupCode.isHashEqual(
|
|
449
|
+
TwoFactorBackupCode.hashCode({ code: "AAAAA11111", userId: USER_ID }),
|
|
450
|
+
TwoFactorBackupCode.hashCode({ code: "BBBBB22222", userId: USER_ID }),
|
|
451
|
+
),
|
|
452
|
+
).toBe(false);
|
|
453
|
+
});
|
|
454
|
+
|
|
455
|
+
/*
|
|
456
|
+
* crypto.timingSafeEqual THROWS on a length mismatch, so the length check in
|
|
457
|
+
* front of it is not an optimisation -- without it, a short or malformed
|
|
458
|
+
* value turns a failed comparison into a 500 on the login path.
|
|
459
|
+
*/
|
|
460
|
+
it.each([
|
|
461
|
+
["", ""],
|
|
462
|
+
["abc", ""],
|
|
463
|
+
["", "abc"],
|
|
464
|
+
["abc", "abcd"],
|
|
465
|
+
])(
|
|
466
|
+
"returns false rather than throwing for (%p, %p)",
|
|
467
|
+
(a: string, b: string) => {
|
|
468
|
+
expect(() => {
|
|
469
|
+
return TwoFactorBackupCode.isHashEqual(a, b);
|
|
470
|
+
}).not.toThrow();
|
|
471
|
+
|
|
472
|
+
expect(TwoFactorBackupCode.isHashEqual(a, b)).toBe(false);
|
|
473
|
+
},
|
|
474
|
+
);
|
|
475
|
+
});
|
|
@@ -10,6 +10,8 @@ enum EmailTemplateType {
|
|
|
10
10
|
ConfirmStatusPageSubscription = "ConfirmStatusPageSubscription.hbs",
|
|
11
11
|
EmailVerified = "EmailVerified.hbs",
|
|
12
12
|
PasswordChanged = "PasswordChanged.hbs",
|
|
13
|
+
TwoFactorBackupCodeUsed = "TwoFactorBackupCodeUsed.hbs",
|
|
14
|
+
TwoFactorBackupCodesRegenerated = "TwoFactorBackupCodesRegenerated.hbs",
|
|
13
15
|
ProbeOwnerAdded = "ProbeOwnerAdded.hbs",
|
|
14
16
|
InviteMember = "InviteMember.hbs",
|
|
15
17
|
EmailChanged = "EmailChanged.hbs",
|
|
@@ -47,6 +47,22 @@ export default interface UserAuthenticationStatus {
|
|
|
47
47
|
*/
|
|
48
48
|
verifiedTwoFactorAuthMethodCount: number;
|
|
49
49
|
|
|
50
|
+
/*
|
|
51
|
+
* How many single-use backup codes the user has left.
|
|
52
|
+
*
|
|
53
|
+
* Deliberately NOT folded into `verifiedTwoFactorAuthMethodCount`, and the
|
|
54
|
+
* separation is the operator's whole decision. The count above answers "can
|
|
55
|
+
* they sign in at all today"; this one answers "can they get themselves back
|
|
56
|
+
* in without me". An operator looking at a lost-phone ticket needs both: a
|
|
57
|
+
* user with codes left should be told to use one, and only a user with none
|
|
58
|
+
* needs the reset button -- which signs them out everywhere and marches them
|
|
59
|
+
* through enrolment.
|
|
60
|
+
*
|
|
61
|
+
* Zero is the normal reading for an account that never generated any, not an
|
|
62
|
+
* error state.
|
|
63
|
+
*/
|
|
64
|
+
unusedTwoFactorBackupCodeCount: number;
|
|
65
|
+
|
|
50
66
|
// Is there an unexpired password-reset link outstanding for this user?
|
|
51
67
|
hasPendingPasswordResetLink: boolean;
|
|
52
68
|
}
|
|
@@ -302,6 +302,7 @@ import RunbookRule from "./RunbookRule";
|
|
|
302
302
|
import AutoRemediationRule from "./AutoRemediationRule";
|
|
303
303
|
import AutoRemediationSuggestion from "./AutoRemediationSuggestion";
|
|
304
304
|
import UserTotpAuth from "./UserTotpAuth";
|
|
305
|
+
import UserTwoFactorBackupCode from "./UserTwoFactorBackupCode";
|
|
305
306
|
import UserWebAuthn from "./UserWebAuthn";
|
|
306
307
|
import TelemetryIngestionKey from "./TelemetryIngestionKey";
|
|
307
308
|
import TelemetryException from "./TelemetryException";
|
|
@@ -728,6 +729,7 @@ const AllModelTypes = [
|
|
|
728
729
|
DataSource,
|
|
729
730
|
UserSession,
|
|
730
731
|
UserTotpAuth,
|
|
732
|
+
UserTwoFactorBackupCode,
|
|
731
733
|
UserWebAuthn,
|
|
732
734
|
TelemetryIngestionKey,
|
|
733
735
|
TelemetryException,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Index.js","sourceRoot":"","sources":["../../../../Models/DatabaseModels/Index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Index.js","sourceRoot":"","sources":["../../../../Models/DatabaseModels/Index.ts"],"names":[],"mappings":"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"}
|