tinbase 0.5.0 → 0.6.1

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.
Files changed (70) hide show
  1. package/README.md +29 -26
  2. package/dist/admin/api.d.ts +3 -1
  3. package/dist/admin/api.js +9 -1
  4. package/dist/admin/api.js.map +1 -1
  5. package/dist/admin/ui.d.ts +1 -1
  6. package/dist/admin/ui.js +7 -7
  7. package/dist/auth/handler.d.ts +6 -1
  8. package/dist/auth/handler.js +148 -6
  9. package/dist/auth/handler.js.map +1 -1
  10. package/dist/auth/inbox.d.ts +31 -0
  11. package/dist/auth/inbox.js +112 -0
  12. package/dist/auth/inbox.js.map +1 -0
  13. package/dist/auth/qr.d.ts +8 -0
  14. package/dist/auth/qr.js +376 -0
  15. package/dist/auth/qr.js.map +1 -0
  16. package/dist/auth/totp.d.ts +19 -0
  17. package/dist/auth/totp.js +101 -0
  18. package/dist/auth/totp.js.map +1 -0
  19. package/dist/cli.js +86 -15
  20. package/dist/cli.js.map +1 -1
  21. package/dist/db/bootstrap.d.ts +8 -1
  22. package/dist/db/bootstrap.js +197 -0
  23. package/dist/db/bootstrap.js.map +1 -1
  24. package/dist/db/database.d.ts +21 -0
  25. package/dist/db/database.js +46 -6
  26. package/dist/db/database.js.map +1 -1
  27. package/dist/db/engine.d.ts +2 -0
  28. package/dist/db/engine.js.map +1 -1
  29. package/dist/db/inspect.d.ts +13 -0
  30. package/dist/db/inspect.js +22 -0
  31. package/dist/db/inspect.js.map +1 -0
  32. package/dist/db/pgmem-engine.d.ts +22 -0
  33. package/dist/db/pgmem-engine.js +135 -0
  34. package/dist/db/pgmem-engine.js.map +1 -0
  35. package/dist/functions/handler.d.ts +3 -1
  36. package/dist/functions/handler.js.map +1 -1
  37. package/dist/index.d.ts +11 -0
  38. package/dist/index.js +49 -10
  39. package/dist/index.js.map +1 -1
  40. package/dist/jwt.d.ts +7 -0
  41. package/dist/jwt.js.map +1 -1
  42. package/dist/log-buffer.d.ts +21 -0
  43. package/dist/log-buffer.js +20 -0
  44. package/dist/log-buffer.js.map +1 -0
  45. package/dist/node/bundle-function.d.ts +7 -0
  46. package/dist/node/bundle-function.js +90 -0
  47. package/dist/node/bundle-function.js.map +1 -0
  48. package/dist/node/db-diff.d.ts +21 -0
  49. package/dist/node/db-diff.js +42 -0
  50. package/dist/node/db-diff.js.map +1 -1
  51. package/dist/node/index.d.ts +4 -3
  52. package/dist/node/index.js +4 -3
  53. package/dist/node/index.js.map +1 -1
  54. package/dist/node/load-functions.d.ts +6 -0
  55. package/dist/node/load-functions.js +49 -5
  56. package/dist/node/load-functions.js.map +1 -1
  57. package/dist/node/server.d.ts +6 -0
  58. package/dist/node/server.js +27 -1
  59. package/dist/node/server.js.map +1 -1
  60. package/dist/realtime/engine.d.ts +10 -0
  61. package/dist/realtime/engine.js +90 -1
  62. package/dist/realtime/engine.js.map +1 -1
  63. package/dist/rest/build.d.ts +5 -1
  64. package/dist/rest/build.js +17 -8
  65. package/dist/rest/build.js.map +1 -1
  66. package/dist/rest/handler.js +22 -9
  67. package/dist/rest/handler.js.map +1 -1
  68. package/dist/types.d.ts +2 -0
  69. package/dist/types.js.map +1 -1
  70. package/package.json +5 -1
@@ -0,0 +1,376 @@
1
+ /**
2
+ * Minimal QR Code generator (byte mode, full version/ECC/mask support) used to
3
+ * render the MFA enrollment otpauth:// URI as a scannable SVG. Compact port of
4
+ * Nayuki's public-domain "QR Code generator" algorithm — no dependencies.
5
+ * Source of the algorithm: https://www.nayuki.io/page/qr-code-generator-library
6
+ */
7
+ // Error-correction level → format bits. We use M (medium) like GoTrue.
8
+ const ECC_M = { ordinal: 0, formatBits: 0 };
9
+ const ECC_CODEWORDS_PER_BLOCK = [
10
+ // index by version (1..40); level M row
11
+ -1, 10, 16, 26, 18, 24, 16, 18, 22, 22, 26, 30, 22, 22, 24, 24, 28, 28, 26, 26, 26, 26, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
12
+ ];
13
+ const NUM_ERROR_CORRECTION_BLOCKS = [
14
+ -1, 1, 1, 1, 2, 2, 4, 4, 4, 5, 5, 5, 8, 9, 9, 10, 10, 11, 13, 14, 16, 17, 17, 18, 20, 21, 23, 25, 26, 28, 29, 31, 33, 35, 37, 38, 40, 43, 45, 47, 49,
15
+ ];
16
+ function getNumRawDataModules(ver) {
17
+ let result = (16 * ver + 128) * ver + 64;
18
+ if (ver >= 2) {
19
+ const numAlign = Math.floor(ver / 7) + 2;
20
+ result -= (25 * numAlign - 10) * numAlign - 55;
21
+ if (ver >= 7)
22
+ result -= 36;
23
+ }
24
+ return result;
25
+ }
26
+ function getNumDataCodewords(ver) {
27
+ return (Math.floor(getNumRawDataModules(ver) / 8) -
28
+ ECC_CODEWORDS_PER_BLOCK[ver] * NUM_ERROR_CORRECTION_BLOCKS[ver]);
29
+ }
30
+ // ── Reed-Solomon over GF(256) ──────────────────────────────────────────────
31
+ function reedSolomonComputeDivisor(degree) {
32
+ const result = new Uint8Array(degree);
33
+ result[degree - 1] = 1;
34
+ let root = 1;
35
+ for (let i = 0; i < degree; i++) {
36
+ for (let j = 0; j < result.length; j++) {
37
+ result[j] = reedSolomonMultiply(result[j], root);
38
+ if (j + 1 < result.length)
39
+ result[j] ^= result[j + 1];
40
+ }
41
+ root = reedSolomonMultiply(root, 0x02);
42
+ }
43
+ return result;
44
+ }
45
+ function reedSolomonComputeRemainder(data, divisor) {
46
+ const result = new Uint8Array(divisor.length);
47
+ for (const b of data) {
48
+ const factor = b ^ result[0];
49
+ result.copyWithin(0, 1);
50
+ result[result.length - 1] = 0;
51
+ for (let i = 0; i < result.length; i++)
52
+ result[i] ^= reedSolomonMultiply(divisor[i], factor);
53
+ }
54
+ return result;
55
+ }
56
+ function reedSolomonMultiply(x, y) {
57
+ let z = 0;
58
+ for (let i = 7; i >= 0; i--) {
59
+ z = (z << 1) ^ ((z >>> 7) * 0x11d);
60
+ z ^= ((y >>> i) & 1) * x;
61
+ }
62
+ return z & 0xff;
63
+ }
64
+ class QrCode {
65
+ version;
66
+ size;
67
+ modules;
68
+ isFunction;
69
+ static encodeText(text) {
70
+ const bytes = new TextEncoder().encode(text);
71
+ // byte-mode segment bit length = 4 (mode) + charCountBits + 8*len
72
+ let version = 1;
73
+ for (; version <= 40; version++) {
74
+ const dataCapacityBits = getNumDataCodewords(version) * 8;
75
+ const ccBits = version < 10 ? 8 : 16;
76
+ const usedBits = 4 + ccBits + bytes.length * 8;
77
+ if (usedBits <= dataCapacityBits)
78
+ break;
79
+ }
80
+ if (version > 40)
81
+ throw new Error('QR data too long');
82
+ const bb = [];
83
+ const append = (val, len) => {
84
+ for (let i = len - 1; i >= 0; i--)
85
+ bb.push((val >>> i) & 1);
86
+ };
87
+ append(0x4, 4); // byte mode
88
+ append(bytes.length, version < 10 ? 8 : 16);
89
+ for (const b of bytes)
90
+ append(b, 8);
91
+ const dataCapacityBits = getNumDataCodewords(version) * 8;
92
+ append(0, Math.min(4, dataCapacityBits - bb.length));
93
+ while (bb.length % 8 !== 0)
94
+ bb.push(0);
95
+ for (let pad = 0xec; bb.length < dataCapacityBits; pad ^= 0xec ^ 0x11)
96
+ append(pad, 8);
97
+ const dataCodewords = new Uint8Array(bb.length / 8);
98
+ for (let i = 0; i < bb.length; i++)
99
+ dataCodewords[i >>> 3] |= bb[i] << (7 - (i & 7));
100
+ return new QrCode(version, dataCodewords);
101
+ }
102
+ constructor(version, dataCodewords) {
103
+ this.version = version;
104
+ this.size = version * 4 + 17;
105
+ const row = () => new Array(this.size).fill(false);
106
+ this.modules = Array.from({ length: this.size }, row);
107
+ this.isFunction = Array.from({ length: this.size }, row);
108
+ this.drawFunctionPatterns();
109
+ const allCodewords = this.addEccAndInterleave(dataCodewords);
110
+ this.drawCodewords(allCodewords);
111
+ // pick the mask with the lowest penalty (all masks are valid; this is polish)
112
+ let minPenalty = Infinity;
113
+ let bestMask = 0;
114
+ for (let mask = 0; mask < 8; mask++) {
115
+ this.applyMask(mask);
116
+ this.drawFormatBits(mask);
117
+ const penalty = this.getPenaltyScore();
118
+ if (penalty < minPenalty) {
119
+ bestMask = mask;
120
+ minPenalty = penalty;
121
+ }
122
+ this.applyMask(mask); // undo
123
+ }
124
+ this.applyMask(bestMask);
125
+ this.drawFormatBits(bestMask);
126
+ }
127
+ getModule(x, y) {
128
+ return x >= 0 && x < this.size && y >= 0 && y < this.size && this.modules[y][x];
129
+ }
130
+ setFunctionModule(x, y, isDark) {
131
+ this.modules[y][x] = isDark;
132
+ this.isFunction[y][x] = true;
133
+ }
134
+ drawFunctionPatterns() {
135
+ for (let i = 0; i < this.size; i++) {
136
+ this.setFunctionModule(6, i, i % 2 === 0);
137
+ this.setFunctionModule(i, 6, i % 2 === 0);
138
+ }
139
+ this.drawFinderPattern(3, 3);
140
+ this.drawFinderPattern(this.size - 4, 3);
141
+ this.drawFinderPattern(3, this.size - 4);
142
+ const alignPos = this.getAlignmentPatternPositions();
143
+ const n = alignPos.length;
144
+ for (let i = 0; i < n; i++) {
145
+ for (let j = 0; j < n; j++) {
146
+ if (!((i === 0 && j === 0) || (i === 0 && j === n - 1) || (i === n - 1 && j === 0)))
147
+ this.drawAlignmentPattern(alignPos[i], alignPos[j]);
148
+ }
149
+ }
150
+ this.drawFormatBits(0);
151
+ this.drawVersion();
152
+ }
153
+ drawFormatBits(mask) {
154
+ const data = (ECC_M.formatBits << 3) | mask;
155
+ let rem = data;
156
+ for (let i = 0; i < 10; i++)
157
+ rem = (rem << 1) ^ ((rem >>> 9) * 0x537);
158
+ const bits = ((data << 10) | rem) ^ 0x5412;
159
+ for (let i = 0; i <= 5; i++)
160
+ this.setFunctionModule(8, i, ((bits >>> i) & 1) !== 0);
161
+ this.setFunctionModule(8, 7, ((bits >>> 6) & 1) !== 0);
162
+ this.setFunctionModule(8, 8, ((bits >>> 7) & 1) !== 0);
163
+ this.setFunctionModule(7, 8, ((bits >>> 8) & 1) !== 0);
164
+ for (let i = 9; i < 15; i++)
165
+ this.setFunctionModule(14 - i, 8, ((bits >>> i) & 1) !== 0);
166
+ for (let i = 0; i < 8; i++)
167
+ this.setFunctionModule(this.size - 1 - i, 8, ((bits >>> i) & 1) !== 0);
168
+ for (let i = 8; i < 15; i++)
169
+ this.setFunctionModule(8, this.size - 15 + i, ((bits >>> i) & 1) !== 0);
170
+ this.setFunctionModule(8, this.size - 8, true);
171
+ }
172
+ drawVersion() {
173
+ if (this.version < 7)
174
+ return;
175
+ let rem = this.version;
176
+ for (let i = 0; i < 12; i++)
177
+ rem = (rem << 1) ^ ((rem >>> 11) * 0x1f25);
178
+ const bits = (this.version << 12) | rem;
179
+ for (let i = 0; i < 18; i++) {
180
+ const bit = ((bits >>> i) & 1) !== 0;
181
+ const a = this.size - 11 + (i % 3);
182
+ const b = Math.floor(i / 3);
183
+ this.setFunctionModule(a, b, bit);
184
+ this.setFunctionModule(b, a, bit);
185
+ }
186
+ }
187
+ drawFinderPattern(x, y) {
188
+ for (let dy = -4; dy <= 4; dy++) {
189
+ for (let dx = -4; dx <= 4; dx++) {
190
+ const dist = Math.max(Math.abs(dx), Math.abs(dy));
191
+ const xx = x + dx;
192
+ const yy = y + dy;
193
+ if (xx >= 0 && xx < this.size && yy >= 0 && yy < this.size)
194
+ this.setFunctionModule(xx, yy, dist !== 2 && dist !== 4);
195
+ }
196
+ }
197
+ }
198
+ drawAlignmentPattern(x, y) {
199
+ for (let dy = -2; dy <= 2; dy++)
200
+ for (let dx = -2; dx <= 2; dx++)
201
+ this.setFunctionModule(x + dx, y + dy, Math.max(Math.abs(dx), Math.abs(dy)) !== 1);
202
+ }
203
+ getAlignmentPatternPositions() {
204
+ if (this.version === 1)
205
+ return [];
206
+ const numAlign = Math.floor(this.version / 7) + 2;
207
+ const step = Math.floor((this.version * 8 + numAlign * 3 + 5) / (numAlign * 4 - 4)) * 2;
208
+ const result = [6];
209
+ for (let pos = this.size - 7; result.length < numAlign; pos -= step)
210
+ result.splice(1, 0, pos);
211
+ return result;
212
+ }
213
+ addEccAndInterleave(data) {
214
+ const ver = this.version;
215
+ const numBlocks = NUM_ERROR_CORRECTION_BLOCKS[ver];
216
+ const blockEccLen = ECC_CODEWORDS_PER_BLOCK[ver];
217
+ const rawCodewords = Math.floor(getNumRawDataModules(ver) / 8);
218
+ const numShortBlocks = numBlocks - (rawCodewords % numBlocks);
219
+ const shortBlockLen = Math.floor(rawCodewords / numBlocks);
220
+ const blocks = [];
221
+ const rsDiv = reedSolomonComputeDivisor(blockEccLen);
222
+ let k = 0;
223
+ for (let i = 0; i < numBlocks; i++) {
224
+ const datLen = shortBlockLen - blockEccLen + (i < numShortBlocks ? 0 : 1);
225
+ const dat = data.slice(k, k + datLen);
226
+ k += datLen;
227
+ const ecc = reedSolomonComputeRemainder(dat, rsDiv);
228
+ const block = new Uint8Array(shortBlockLen + 1);
229
+ block.set(dat, 0);
230
+ block.set(ecc, block.length - blockEccLen);
231
+ blocks.push(block);
232
+ }
233
+ const result = new Uint8Array(rawCodewords);
234
+ let ri = 0;
235
+ for (let i = 0; i < blocks[0].length; i++) {
236
+ for (let j = 0; j < blocks.length; j++) {
237
+ // skip the unused cell in short blocks' data region
238
+ if (i !== shortBlockLen - blockEccLen || j >= numShortBlocks) {
239
+ result[ri++] = blocks[j][i];
240
+ }
241
+ }
242
+ }
243
+ return result;
244
+ }
245
+ drawCodewords(data) {
246
+ let i = 0;
247
+ for (let right = this.size - 1; right >= 1; right -= 2) {
248
+ if (right === 6)
249
+ right = 5;
250
+ for (let vert = 0; vert < this.size; vert++) {
251
+ for (let j = 0; j < 2; j++) {
252
+ const x = right - j;
253
+ const upward = ((right + 1) & 2) === 0;
254
+ const y = upward ? this.size - 1 - vert : vert;
255
+ if (!this.isFunction[y][x] && i < data.length * 8) {
256
+ this.modules[y][x] = ((data[i >>> 3] >>> (7 - (i & 7))) & 1) !== 0;
257
+ i++;
258
+ }
259
+ }
260
+ }
261
+ }
262
+ }
263
+ applyMask(mask) {
264
+ for (let y = 0; y < this.size; y++) {
265
+ for (let x = 0; x < this.size; x++) {
266
+ let invert = false;
267
+ switch (mask) {
268
+ case 0:
269
+ invert = (x + y) % 2 === 0;
270
+ break;
271
+ case 1:
272
+ invert = y % 2 === 0;
273
+ break;
274
+ case 2:
275
+ invert = x % 3 === 0;
276
+ break;
277
+ case 3:
278
+ invert = (x + y) % 3 === 0;
279
+ break;
280
+ case 4:
281
+ invert = (Math.floor(x / 3) + Math.floor(y / 2)) % 2 === 0;
282
+ break;
283
+ case 5:
284
+ invert = ((x * y) % 2) + ((x * y) % 3) === 0;
285
+ break;
286
+ case 6:
287
+ invert = (((x * y) % 2) + ((x * y) % 3)) % 2 === 0;
288
+ break;
289
+ case 7:
290
+ invert = (((x + y) % 2) + ((x * y) % 3)) % 2 === 0;
291
+ break;
292
+ }
293
+ if (invert && !this.isFunction[y][x])
294
+ this.modules[y][x] = !this.modules[y][x];
295
+ }
296
+ }
297
+ }
298
+ getPenaltyScore() {
299
+ let result = 0;
300
+ const size = this.size;
301
+ // adjacent same-color runs in rows/columns
302
+ for (let y = 0; y < size; y++) {
303
+ let runColor = false;
304
+ let runLen = 0;
305
+ for (let x = 0; x < size; x++) {
306
+ if (this.modules[y][x] === runColor) {
307
+ runLen++;
308
+ if (runLen === 5)
309
+ result += 3;
310
+ else if (runLen > 5)
311
+ result++;
312
+ }
313
+ else {
314
+ runColor = this.modules[y][x];
315
+ runLen = 1;
316
+ }
317
+ }
318
+ }
319
+ for (let x = 0; x < size; x++) {
320
+ let runColor = false;
321
+ let runLen = 0;
322
+ for (let y = 0; y < size; y++) {
323
+ if (this.modules[y][x] === runColor) {
324
+ runLen++;
325
+ if (runLen === 5)
326
+ result += 3;
327
+ else if (runLen > 5)
328
+ result++;
329
+ }
330
+ else {
331
+ runColor = this.modules[y][x];
332
+ runLen = 1;
333
+ }
334
+ }
335
+ }
336
+ // 2x2 blocks
337
+ for (let y = 0; y < size - 1; y++) {
338
+ for (let x = 0; x < size - 1; x++) {
339
+ const c = this.modules[y][x];
340
+ if (c === this.modules[y][x + 1] && c === this.modules[y + 1][x] && c === this.modules[y + 1][x + 1])
341
+ result += 3;
342
+ }
343
+ }
344
+ // proportion of dark modules
345
+ let dark = 0;
346
+ for (const rowArr of this.modules)
347
+ for (const v of rowArr)
348
+ if (v)
349
+ dark++;
350
+ const total = size * size;
351
+ const k = Math.ceil(Math.abs(dark * 20 - total * 10) / total) - 1;
352
+ result += k * 10;
353
+ return result;
354
+ }
355
+ /** Render as an SVG string with a quiet-zone border (module units). */
356
+ toSvgString(border) {
357
+ const dim = this.size + border * 2;
358
+ const parts = [];
359
+ for (let y = 0; y < this.size; y++) {
360
+ for (let x = 0; x < this.size; x++) {
361
+ if (this.modules[y][x])
362
+ parts.push(`M${x + border},${y + border}h1v1h-1z`);
363
+ }
364
+ }
365
+ return (`<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 ${dim} ${dim}" shape-rendering="crispEdges">` +
366
+ `<rect width="${dim}" height="${dim}" fill="#ffffff"/>` +
367
+ `<path d="${parts.join('')}" fill="#000000"/>` +
368
+ `</svg>`);
369
+ }
370
+ }
371
+ /** Encode `text` as a QR SVG data URI (works directly as an <img src>). */
372
+ export function qrSvgDataUri(text) {
373
+ const svg = QrCode.encodeText(text).toSvgString(4);
374
+ return `data:image/svg+xml;utf8,${encodeURIComponent(svg)}`;
375
+ }
376
+ //# sourceMappingURL=qr.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"qr.js","sourceRoot":"","sources":["../../src/auth/qr.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ /** Encode bytes as unpadded RFC 4648 base32 (the format authenticator apps expect). */
2
+ export declare function base32Encode(bytes: Uint8Array): string;
3
+ /** Decode an unpadded/padded base32 string to bytes (case-insensitive). */
4
+ export declare function base32Decode(input: string): Uint8Array;
5
+ /** A fresh 20-byte (160-bit) base32 secret, the GoTrue/authenticator default. */
6
+ export declare function generateTotpSecret(): string;
7
+ /** Build the otpauth:// URI an authenticator app scans. */
8
+ export declare function otpauthUri(opts: {
9
+ secret: string;
10
+ account: string;
11
+ issuer: string;
12
+ }): string;
13
+ /** Current 6-digit code for a base32 secret (used in tests and self-checks). */
14
+ export declare function totpNow(secretBase32: string, atMs?: number): Promise<string>;
15
+ /**
16
+ * Verify a submitted code against the secret, allowing ±`window` steps of
17
+ * clock skew (default ±1 = a 90-second acceptance window, like GoTrue).
18
+ */
19
+ export declare function verifyTotp(secretBase32: string, code: string, window?: number, atMs?: number): Promise<boolean>;
@@ -0,0 +1,101 @@
1
+ /**
2
+ * TOTP (RFC 6238) for MFA — pure WebCrypto, no dependencies. GoTrue uses
3
+ * SHA-1, 6 digits, a 30-second period; we mirror that so any standard
4
+ * authenticator app (Google Authenticator, 1Password, …) works against the
5
+ * secret we hand out at enroll time.
6
+ */
7
+ const B32_ALPHABET = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ234567';
8
+ /** Encode bytes as unpadded RFC 4648 base32 (the format authenticator apps expect). */
9
+ export function base32Encode(bytes) {
10
+ let bits = 0;
11
+ let value = 0;
12
+ let out = '';
13
+ for (const b of bytes) {
14
+ value = (value << 8) | b;
15
+ bits += 8;
16
+ while (bits >= 5) {
17
+ out += B32_ALPHABET[(value >>> (bits - 5)) & 31];
18
+ bits -= 5;
19
+ }
20
+ }
21
+ if (bits > 0)
22
+ out += B32_ALPHABET[(value << (5 - bits)) & 31];
23
+ return out;
24
+ }
25
+ /** Decode an unpadded/padded base32 string to bytes (case-insensitive). */
26
+ export function base32Decode(input) {
27
+ const clean = input.toUpperCase().replace(/=+$/, '').replace(/\s/g, '');
28
+ let bits = 0;
29
+ let value = 0;
30
+ const out = [];
31
+ for (const ch of clean) {
32
+ const idx = B32_ALPHABET.indexOf(ch);
33
+ if (idx === -1)
34
+ continue;
35
+ value = (value << 5) | idx;
36
+ bits += 5;
37
+ if (bits >= 8) {
38
+ out.push((value >>> (bits - 8)) & 0xff);
39
+ bits -= 8;
40
+ }
41
+ }
42
+ return new Uint8Array(out);
43
+ }
44
+ /** A fresh 20-byte (160-bit) base32 secret, the GoTrue/authenticator default. */
45
+ export function generateTotpSecret() {
46
+ const bytes = new Uint8Array(20);
47
+ crypto.getRandomValues(bytes);
48
+ return base32Encode(bytes);
49
+ }
50
+ /** Build the otpauth:// URI an authenticator app scans. */
51
+ export function otpauthUri(opts) {
52
+ const label = `${opts.issuer}:${opts.account}`;
53
+ const params = new URLSearchParams({
54
+ secret: opts.secret,
55
+ issuer: opts.issuer,
56
+ algorithm: 'SHA1',
57
+ digits: '6',
58
+ period: '30',
59
+ });
60
+ return `otpauth://totp/${encodeURIComponent(label)}?${params.toString()}`;
61
+ }
62
+ /** Compute the 6-digit TOTP for a given counter (RFC 6238 dynamic truncation). */
63
+ async function hotp(secret, counter) {
64
+ const msg = new Uint8Array(8);
65
+ // 64-bit big-endian counter (safe integer range covers TOTP for millennia)
66
+ let c = counter;
67
+ for (let i = 7; i >= 0; i--) {
68
+ msg[i] = c & 0xff;
69
+ c = Math.floor(c / 256);
70
+ }
71
+ const key = await crypto.subtle.importKey('raw', secret, { name: 'HMAC', hash: 'SHA-1' }, false, ['sign']);
72
+ const hmac = new Uint8Array(await crypto.subtle.sign('HMAC', key, msg));
73
+ const offset = hmac[hmac.length - 1] & 0x0f;
74
+ const bin = ((hmac[offset] & 0x7f) << 24) |
75
+ ((hmac[offset + 1] & 0xff) << 16) |
76
+ ((hmac[offset + 2] & 0xff) << 8) |
77
+ (hmac[offset + 3] & 0xff);
78
+ return (bin % 1_000_000).toString().padStart(6, '0');
79
+ }
80
+ /** Current 6-digit code for a base32 secret (used in tests and self-checks). */
81
+ export async function totpNow(secretBase32, atMs = Date.now()) {
82
+ const counter = Math.floor(atMs / 1000 / 30);
83
+ return hotp(base32Decode(secretBase32), counter);
84
+ }
85
+ /**
86
+ * Verify a submitted code against the secret, allowing ±`window` steps of
87
+ * clock skew (default ±1 = a 90-second acceptance window, like GoTrue).
88
+ */
89
+ export async function verifyTotp(secretBase32, code, window = 1, atMs = Date.now()) {
90
+ const trimmed = (code ?? '').trim();
91
+ if (!/^\d{6}$/.test(trimmed))
92
+ return false;
93
+ const secret = base32Decode(secretBase32);
94
+ const base = Math.floor(atMs / 1000 / 30);
95
+ for (let i = -window; i <= window; i++) {
96
+ if ((await hotp(secret, base + i)) === trimmed)
97
+ return true;
98
+ }
99
+ return false;
100
+ }
101
+ //# sourceMappingURL=totp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"totp.js","sourceRoot":"","sources":["../../src/auth/totp.ts"],"names":[],"mappings":"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"}