@tacet-ink/journal-core 0.3.0 → 0.3.2

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.
@@ -0,0 +1,160 @@
1
+ export const HASH_WASM_VERSION = '4.12.0';
2
+ export const HASH_WASM_ARGON2_SHA256 = 'dcec617a2e1b700fa132d1583a186cb70611113395e869f2dd6cc82b415d3094';
3
+ export function hashWasmArgon2Factory() {
4
+ var exports = {}, module = { exports: exports }, define = undefined;
5
+ // VENDOR-BEGIN
6
+ /*!
7
+ * hash-wasm (https://www.npmjs.com/package/hash-wasm)
8
+ * (c) Dani Biro
9
+ * @license MIT
10
+ */
11
+ !function (A, I) { "object" == typeof exports && "undefined" != typeof module ? I(exports) : "function" == typeof define && define.amd ? define(["exports"], I) : I((A = "undefined" != typeof globalThis ? globalThis : A || self).hashwasm = A.hashwasm || {}); }(this, (function (A) {
12
+ "use strict";
13
+ function I(A, I, i, C) { return new (i || (i = Promise))((function (g, Q) { function B(A) { try {
14
+ e(C.next(A));
15
+ }
16
+ catch (A) {
17
+ Q(A);
18
+ } } function h(A) { try {
19
+ e(C.throw(A));
20
+ }
21
+ catch (A) {
22
+ Q(A);
23
+ } } function e(A) { var I; A.done ? g(A.value) : (I = A.value, I instanceof i ? I : new i((function (A) { A(I); }))).then(B, h); } e((C = C.apply(A, I || [])).next()); })); }
24
+ "function" == typeof SuppressedError && SuppressedError;
25
+ var i, C = { name: "argon2", data: "AGFzbQEAAAABKQVgAX8Bf2AAAX9gEH9/f39/f39/f39/f39/f38AYAR/f39/AGACf38AAwYFAAECAwQFBgEBAoCAAgYIAX8BQZCoBAsHQQQGbWVtb3J5AgASSGFzaF9TZXRNZW1vcnlTaXplAAAOSGFzaF9HZXRCdWZmZXIAAQ5IYXNoX0NhbGN1bGF0ZQAECvEyBVgBAn9BACEBAkAgAEEAKAKICCICRg0AAkAgACACayIAQRB2IABBgIB8cSAASWoiAEAAQX9HDQBB/wHADwtBACEBQQBBACkDiAggAEEQdK18NwOICAsgAcALcAECfwJAQQAoAoAIIgANAEEAPwBBEHQiADYCgAhBACgCiAgiAUGAgCBGDQACQEGAgCAgAWsiAEEQdiAAQYCAfHEgAElqIgBAAEF/Rw0AQQAPC0EAQQApA4gIIABBEHStfDcDiAhBACgCgAghAAsgAAvcDgECfiAAIAQpAwAiECAAKQMAIhF8IBFCAYZC/v///x+DIBBC/////w+DfnwiEDcDACAMIBAgDCkDAIVCIIkiEDcDACAIIBAgCCkDACIRfCARQgGGQv7///8fgyAQQv////8Pg358IhA3AwAgBCAQIAQpAwCFQiiJIhA3AwAgACAQIAApAwAiEXwgEEL/////D4MgEUIBhkL+////H4N+fCIQNwMAIAwgECAMKQMAhUIwiSIQNwMAIAggECAIKQMAIhF8IBBC/////w+DIBFCAYZC/v///x+DfnwiEDcDACAEIBAgBCkDAIVCAYk3AwAgASAFKQMAIhAgASkDACIRfCARQgGGQv7///8fgyAQQv////8Pg358IhA3AwAgDSAQIA0pAwCFQiCJIhA3AwAgCSAQIAkpAwAiEXwgEUIBhkL+////H4MgEEL/////D4N+fCIQNwMAIAUgECAFKQMAhUIoiSIQNwMAIAEgECABKQMAIhF8IBBC/////w+DIBFCAYZC/v///x+DfnwiEDcDACANIBAgDSkDAIVCMIkiEDcDACAJIBAgCSkDACIRfCAQQv////8PgyARQgGGQv7///8fg358IhA3AwAgBSAQIAUpAwCFQgGJNwMAIAIgBikDACIQIAIpAwAiEXwgEUIBhkL+////H4MgEEL/////D4N+fCIQNwMAIA4gECAOKQMAhUIgiSIQNwMAIAogECAKKQMAIhF8IBFCAYZC/v///x+DIBBC/////w+DfnwiEDcDACAGIBAgBikDAIVCKIkiEDcDACACIBAgAikDACIRfCAQQv////8PgyARQgGGQv7///8fg358IhA3AwAgDiAQIA4pAwCFQjCJIhA3AwAgCiAQIAopAwAiEXwgEEL/////D4MgEUIBhkL+////H4N+fCIQNwMAIAYgECAGKQMAhUIBiTcDACADIAcpAwAiECADKQMAIhF8IBFCAYZC/v///x+DIBBC/////w+DfnwiEDcDACAPIBAgDykDAIVCIIkiEDcDACALIBAgCykDACIRfCARQgGGQv7///8fgyAQQv////8Pg358IhA3AwAgByAQIAcpAwCFQiiJIhA3AwAgAyAQIAMpAwAiEXwgEEL/////D4MgEUIBhkL+////H4N+fCIQNwMAIA8gECAPKQMAhUIwiSIQNwMAIAsgECALKQMAIhF8IBBC/////w+DIBFCAYZC/v///x+DfnwiEDcDACAHIBAgBykDAIVCAYk3AwAgACAFKQMAIhAgACkDACIRfCARQgGGQv7///8fgyAQQv////8Pg358IhA3AwAgDyAQIA8pAwCFQiCJIhA3AwAgCiAQIAopAwAiEXwgEUIBhkL+////H4MgEEL/////D4N+fCIQNwMAIAUgECAFKQMAhUIoiSIQNwMAIAAgECAAKQMAIhF8IBBC/////w+DIBFCAYZC/v///x+DfnwiEDcDACAPIBAgDykDAIVCMIkiEDcDACAKIBAgCikDACIRfCAQQv////8PgyARQgGGQv7///8fg358IhA3AwAgBSAQIAUpAwCFQgGJNwMAIAEgBikDACIQIAEpAwAiEXwgEUIBhkL+////H4MgEEL/////D4N+fCIQNwMAIAwgECAMKQMAhUIgiSIQNwMAIAsgECALKQMAIhF8IBFCAYZC/v///x+DIBBC/////w+DfnwiEDcDACAGIBAgBikDAIVCKIkiEDcDACABIBAgASkDACIRfCAQQv////8PgyARQgGGQv7///8fg358IhA3AwAgDCAQIAwpAwCFQjCJIhA3AwAgCyAQIAspAwAiEXwgEEL/////D4MgEUIBhkL+////H4N+fCIQNwMAIAYgECAGKQMAhUIBiTcDACACIAcpAwAiECACKQMAIhF8IBFCAYZC/v///x+DIBBC/////w+DfnwiEDcDACANIBAgDSkDAIVCIIkiEDcDACAIIBAgCCkDACIRfCARQgGGQv7///8fgyAQQv////8Pg358IhA3AwAgByAQIAcpAwCFQiiJIhA3AwAgAiAQIAIpAwAiEXwgEEL/////D4MgEUIBhkL+////H4N+fCIQNwMAIA0gECANKQMAhUIwiSIQNwMAIAggECAIKQMAIhF8IBBC/////w+DIBFCAYZC/v///x+DfnwiEDcDACAHIBAgBykDAIVCAYk3AwAgAyAEKQMAIhAgAykDACIRfCARQgGGQv7///8fgyAQQv////8Pg358IhA3AwAgDiAQIA4pAwCFQiCJIhA3AwAgCSAQIAkpAwAiEXwgEUIBhkL+////H4MgEEL/////D4N+fCIQNwMAIAQgECAEKQMAhUIoiSIQNwMAIAMgECADKQMAIhF8IBBC/////w+DIBFCAYZC/v///x+DfnwiEDcDACAOIBAgDikDAIVCMIkiEDcDACAJIBAgCSkDACIRfCAQQv////8PgyARQgGGQv7///8fg358IhA3AwAgBCAQIAQpAwCFQgGJNwMAC98aAQN/QQAhBEEAIAIpAwAgASkDAIU3A5AIQQAgAikDCCABKQMIhTcDmAhBACACKQMQIAEpAxCFNwOgCEEAIAIpAxggASkDGIU3A6gIQQAgAikDICABKQMghTcDsAhBACACKQMoIAEpAyiFNwO4CEEAIAIpAzAgASkDMIU3A8AIQQAgAikDOCABKQM4hTcDyAhBACACKQNAIAEpA0CFNwPQCEEAIAIpA0ggASkDSIU3A9gIQQAgAikDUCABKQNQhTcD4AhBACACKQNYIAEpA1iFNwPoCEEAIAIpA2AgASkDYIU3A/AIQQAgAikDaCABKQNohTcD+AhBACACKQNwIAEpA3CFNwOACUEAIAIpA3ggASkDeIU3A4gJQQAgAikDgAEgASkDgAGFNwOQCUEAIAIpA4gBIAEpA4gBhTcDmAlBACACKQOQASABKQOQAYU3A6AJQQAgAikDmAEgASkDmAGFNwOoCUEAIAIpA6ABIAEpA6ABhTcDsAlBACACKQOoASABKQOoAYU3A7gJQQAgAikDsAEgASkDsAGFNwPACUEAIAIpA7gBIAEpA7gBhTcDyAlBACACKQPAASABKQPAAYU3A9AJQQAgAikDyAEgASkD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", hash: "e4cdc523" };
26
+ class g {
27
+ constructor() { this.mutex = Promise.resolve(); }
28
+ lock() { let A = () => { }; return this.mutex = this.mutex.then((() => new Promise(A))), new Promise((I => { A = I; })); }
29
+ dispatch(A) { return I(this, void 0, void 0, (function* () { const I = yield this.lock(); try {
30
+ return yield Promise.resolve(A());
31
+ }
32
+ finally {
33
+ I();
34
+ } })); }
35
+ }
36
+ const Q = "undefined" != typeof globalThis ? globalThis : "undefined" != typeof self ? self : "undefined" != typeof window ? window : global, B = null !== (i = Q.Buffer) && void 0 !== i ? i : null, h = Q.TextEncoder ? new Q.TextEncoder : null;
37
+ function e(A, I) { return (15 & A) + (A >> 6 | A >> 3 & 8) << 4 | (15 & I) + (I >> 6 | I >> 3 & 8); }
38
+ function w(A, I) { const i = I.length >> 1; for (let C = 0; C < i; C++) {
39
+ const i = C << 1;
40
+ A[C] = e(I.charCodeAt(i), I.charCodeAt(i + 1));
41
+ } }
42
+ const t = "a".charCodeAt(0) - 10, o = "0".charCodeAt(0);
43
+ function E(A, I, i) { let C = 0; for (let g = 0; g < i; g++) {
44
+ let i = I[g] >>> 4;
45
+ A[C++] = i > 9 ? i + t : i + o, i = 15 & I[g], A[C++] = i > 9 ? i + t : i + o;
46
+ } return String.fromCharCode.apply(null, A); }
47
+ const n = null !== B ? A => { if ("string" == typeof A) {
48
+ const I = B.from(A, "utf8");
49
+ return new Uint8Array(I.buffer, I.byteOffset, I.length);
50
+ } if (B.isBuffer(A))
51
+ return new Uint8Array(A.buffer, A.byteOffset, A.length); if (ArrayBuffer.isView(A))
52
+ return new Uint8Array(A.buffer, A.byteOffset, A.byteLength); throw new Error("Invalid data type!"); } : A => { if ("string" == typeof A)
53
+ return h.encode(A); if (ArrayBuffer.isView(A))
54
+ return new Uint8Array(A.buffer, A.byteOffset, A.byteLength); throw new Error("Invalid data type!"); }, r = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/", D = new Uint8Array(256);
55
+ for (let A = 0; A < r.length; A++)
56
+ D[r.charCodeAt(A)] = A;
57
+ function F(A, I = !0) { const i = A.length, C = i % 3, g = [], Q = i - C; for (let I = 0; I < Q; I += 3) {
58
+ const i = (A[I] << 16 & 16711680) + (A[I + 1] << 8 & 65280) + (255 & A[I + 2]), C = r.charAt(i >> 18 & 63) + r.charAt(i >> 12 & 63) + r.charAt(i >> 6 & 63) + r.charAt(63 & i);
59
+ g.push(C);
60
+ } if (1 === C) {
61
+ const C = A[i - 1], Q = r.charAt(C >> 2), B = r.charAt(C << 4 & 63);
62
+ g.push(`${Q}${B}`), I && g.push("==");
63
+ }
64
+ else if (2 === C) {
65
+ const C = (A[i - 2] << 8) + A[i - 1], Q = r.charAt(C >> 10), B = r.charAt(C >> 4 & 63), h = r.charAt(C << 2 & 63);
66
+ g.push(`${Q}${B}${h}`), I && g.push("=");
67
+ } return g.join(""); }
68
+ function f(A) { let I = Math.floor(.75 * A.length); const i = A.length; return "=" === A[i - 1] && (I -= 1, "=" === A[i - 2] && (I -= 1)), I; }
69
+ function k(A) { const I = f(A), i = A.length, C = new Uint8Array(I); let g = 0; for (let I = 0; I < i; I += 4) {
70
+ const i = D[A.charCodeAt(I)], Q = D[A.charCodeAt(I + 1)], B = D[A.charCodeAt(I + 2)], h = D[A.charCodeAt(I + 3)];
71
+ C[g] = i << 2 | Q >> 4, g += 1, C[g] = (15 & Q) << 4 | B >> 2, g += 1, C[g] = (3 & B) << 6 | 63 & h, g += 1;
72
+ } return C; }
73
+ const a = 16384, s = new g, S = new Map;
74
+ function U(A, i) { return I(this, void 0, void 0, (function* () { let C = null, g = null, Q = !1; if ("undefined" == typeof WebAssembly)
75
+ throw new Error("WebAssembly is not supported in this environment!"); const B = () => new DataView(C.exports.memory.buffer).getUint32(C.exports.STATE_SIZE, !0), h = s.dispatch((() => I(this, void 0, void 0, (function* () { if (!S.has(A.name)) {
76
+ const I = k(A.data), i = WebAssembly.compile(I);
77
+ S.set(A.name, i);
78
+ } const I = yield S.get(A.name); C = yield WebAssembly.instantiate(I, {}); })))), t = (A = null) => { Q = !0, C.exports.Hash_Init(A); }, o = A => { if (!Q)
79
+ throw new Error("update() called before init()"); (A => { let I = 0; for (; I < A.length;) {
80
+ const i = A.subarray(I, I + a);
81
+ I += i.length, g.set(i), C.exports.Hash_Update(i.length);
82
+ } })(n(A)); }, r = new Uint8Array(2 * i), D = (A, I = null) => { if (!Q)
83
+ throw new Error("digest() called before init()"); return Q = !1, C.exports.Hash_Final(I), "binary" === A ? g.slice(0, i) : E(r, g, i); }, F = A => "string" == typeof A ? A.length < 4096 : A.byteLength < a; let f = F; switch (A.name) {
84
+ case "argon2":
85
+ case "scrypt":
86
+ f = () => !0;
87
+ break;
88
+ case "blake2b":
89
+ case "blake2s":
90
+ f = (A, I) => I <= 512 && F(A);
91
+ break;
92
+ case "blake3":
93
+ f = (A, I) => 0 === I && F(A);
94
+ break;
95
+ case "xxhash64":
96
+ case "xxhash3":
97
+ case "xxhash128":
98
+ case "crc64": f = () => !1;
99
+ } return yield (() => I(this, void 0, void 0, (function* () { C || (yield h); const A = C.exports.Hash_GetBuffer(), I = C.exports.memory.buffer; g = new Uint8Array(I, A, a); })))(), { getMemory: () => g, writeMemory: (A, I = 0) => { g.set(A, I); }, getExports: () => C.exports, setMemorySize: A => { C.exports.Hash_SetMemorySize(A); const I = C.exports.Hash_GetBuffer(), i = C.exports.memory.buffer; g = new Uint8Array(i, I, A); }, init: t, update: o, digest: D, save: () => { if (!Q)
100
+ throw new Error("save() can only be called after init() and before digest()"); const I = C.exports.Hash_GetState(), i = B(), g = C.exports.memory.buffer, h = new Uint8Array(g, I, i), e = new Uint8Array(4 + i); return w(e, A.hash), e.set(h, 4), e; }, load: I => { if (!(I instanceof Uint8Array))
101
+ throw new Error("load() expects an Uint8Array generated by save()"); const i = C.exports.Hash_GetState(), g = B(), h = 4 + g, w = C.exports.memory.buffer; if (I.length !== h)
102
+ throw new Error(`Bad state length (expected ${h} bytes, got ${I.length})`); if (!function (A, I) { if (A.length !== 2 * I.length)
103
+ return !1; for (let i = 0; i < I.length; i++) {
104
+ const C = i << 1;
105
+ if (I[i] !== e(A.charCodeAt(C), A.charCodeAt(C + 1)))
106
+ return !1;
107
+ } return !0; }(A.hash, I.subarray(0, 4)))
108
+ throw new Error("This state was written by an incompatible hash implementation"); const t = I.subarray(4); new Uint8Array(w, i, g).set(t), Q = !0; }, calculate: (A, I = null, Q = null) => { if (!f(A, I))
109
+ return t(I), o(A), D("hex", Q); const B = n(A); return g.set(B), C.exports.Hash_Calculate(B.length, I, Q), E(r, g, i); }, hashLength: i }; })); }
110
+ var c = { name: "blake2b", data: "AGFzbQEAAAABEQRgAAF/YAJ/fwBgAX8AYAAAAwoJAAECAwECAgABBQQBAQICBg4CfwFBsIsFC38AQYAICwdwCAZtZW1vcnkCAA5IYXNoX0dldEJ1ZmZlcgAACkhhc2hfRmluYWwAAwlIYXNoX0luaXQABQtIYXNoX1VwZGF0ZQAGDUhhc2hfR2V0U3RhdGUABw5IYXNoX0NhbGN1bGF0ZQAIClNUQVRFX1NJWkUDAQrTOAkFAEGACQvrAgIFfwF+AkAgAUEBSA0AAkACQAJAIAFBgAFBACgC4IoBIgJrIgNKDQAgASEEDAELQQBBADYC4IoBAkAgAkH/AEoNACACQeCJAWohBSAAIQRBACEGA0AgBSAELQAAOgAAIARBAWohBCAFQQFqIQUgAyAGQQFqIgZB/wFxSg0ACwtBAEEAKQPAiQEiB0KAAXw3A8CJAUEAQQApA8iJASAHQv9+Vq18NwPIiQFB4IkBEAIgACADaiEAAkAgASADayIEQYEBSA0AIAIgAWohBQNAQQBBACkDwIkBIgdCgAF8NwPAiQFBAEEAKQPIiQEgB0L/flatfDcDyIkBIAAQAiAAQYABaiEAIAVBgH9qIgVBgAJLDQALIAVBgH9qIQQMAQsgBEEATA0BC0EAIQUDQCAFQQAoAuCKAWpB4IkBaiAAIAVqLQAAOgAAIAQgBUEBaiIFQf8BcUoNAAsLQQBBACgC4IoBIARqNgLgigELC78uASR+QQBBACkD0IkBQQApA7CJASIBQQApA5CJAXwgACkDICICfCIDhULr+obav7X2wR+FQiCJIgRCq/DT9K/uvLc8fCIFIAGFQiiJIgYgA3wgACkDKCIBfCIHIASFQjCJIgggBXwiCSAGhUIBiSIKQQApA8iJAUEAKQOoiQEiBEEAKQOIiQF8IAApAxAiA3wiBYVCn9j52cKR2oKbf4VCIIkiC0K7zqqm2NDrs7t/fCIMIASFQiiJIg0gBXwgACkDGCIEfCIOfCAAKQNQIgV8Ig9BACkDwIkBQQApA6CJASIQQQApA4CJASIRfCAAKQMAIgZ8IhKFQtGFmu/6z5SH0QCFQiCJIhNCiJLznf/M+YTqAHwiFCAQhUIoiSIVIBJ8IAApAwgiEHwiFiAThUIwiSIXhUIgiSIYQQApA9iJAUEAKQO4iQEiE0EAKQOYiQF8IAApAzAiEnwiGYVC+cL4m5Gjs/DbAIVCIIkiGkLx7fT4paf9p6V/fCIbIBOFQiiJIhwgGXwgACkDOCITfCIZIBqFQjCJIhogG3wiG3wiHSAKhUIoiSIeIA98IAApA1giCnwiDyAYhUIwiSIYIB18Ih0gDiALhUIwiSIOIAx8Ih8gDYVCAYkiDCAWfCAAKQNAIgt8Ig0gGoVCIIkiFiAJfCIaIAyFQiiJIiAgDXwgACkDSCIJfCIhIBaFQjCJIhYgGyAchUIBiSIMIAd8IAApA2AiB3wiDSAOhUIgiSIOIBcgFHwiFHwiFyAMhUIoiSIbIA18IAApA2giDHwiHCAOhUIwiSIOIBd8IhcgG4VCAYkiGyAZIBQgFYVCAYkiFHwgACkDcCINfCIVIAiFQiCJIhkgH3wiHyAUhUIoiSIUIBV8IAApA3giCHwiFXwgDHwiIoVCIIkiI3wiJCAbhUIoiSIbICJ8IBJ8IiIgFyAYIBUgGYVCMIkiFSAffCIZIBSFQgGJIhQgIXwgDXwiH4VCIIkiGHwiFyAUhUIoiSIUIB98IAV8Ih8gGIVCMIkiGCAXfCIXIBSFQgGJIhR8IAF8IiEgFiAafCIWIBUgHSAehUIBiSIaIBx8IAl8IhyFQiCJIhV8Ih0gGoVCKIkiGiAcfCAIfCIcIBWFQjCJIhWFQiCJIh4gGSAOIBYgIIVCAYkiFiAPfCACfCIPhUIgiSIOfCIZIBaFQiiJIhYgD3wgC3wiDyAOhUIwiSIOIBl8Ihl8IiAgFIVCKIkiFCAhfCAEfCIhIB6FQjCJIh4gIHwiICAiICOFQjCJIiIgJHwiIyAbhUIBiSIbIBx8IAp8IhwgDoVCIIkiDiAXfCIXIBuFQiiJIhsgHHwgE3wiHCAOhUIwiSIOIBkgFoVCAYkiFiAffCAQfCIZICKFQiCJIh8gFSAdfCIVfCIdIBaFQiiJIhYgGXwgB3wiGSAfhUIwiSIfIB18Ih0gFoVCAYkiFiAVIBqFQgGJIhUgD3wgBnwiDyAYhUIgiSIYICN8IhogFYVCKIkiFSAPfCADfCIPfCAHfCIihUIgiSIjfCIkIBaFQiiJIhYgInwgBnwiIiAjhUIwiSIjICR8IiQgFoVCAYkiFiAOIBd8Ig4gDyAYhUIwiSIPICAgFIVCAYkiFCAZfCAKfCIXhUIgiSIYfCIZIBSFQiiJIhQgF3wgC3wiF3wgBXwiICAPIBp8Ig8gHyAOIBuFQgGJIg4gIXwgCHwiGoVCIIkiG3wiHyAOhUIoiSIOIBp8IAx8IhogG4VCMIkiG4VCIIkiISAdIB4gDyAVhUIBiSIPIBx8IAF8IhWFQiCJIhx8Ih0gD4VCKIkiDyAVfCADfCIVIByFQjCJIhwgHXwiHXwiHiAWhUIoiSIWICB8IA18IiAgIYVCMIkiISAefCIeIBogFyAYhUIwiSIXIBl8IhggFIVCAYkiFHwgCXwiGSAchUIgiSIaICR8IhwgFIVCKIkiFCAZfCACfCIZIBqFQjCJIhogHSAPhUIBiSIPICJ8IAR8Ih0gF4VCIIkiFyAbIB98Iht8Ih8gD4VCKIkiDyAdfCASfCIdIBeFQjCJIhcgH3wiHyAPhUIBiSIPIBsgDoVCAYkiDiAVfCATfCIVICOFQiCJIhsgGHwiGCAOhUIoiSIOIBV8IBB8IhV8IAx8IiKFQiCJIiN8IiQgD4VCKIkiDyAifCAHfCIiICOFQjCJIiMgJHwiJCAPhUIBiSIPIBogHHwiGiAVIBuFQjCJIhUgHiAWhUIBiSIWIB18IAR8IhuFQiCJIhx8Ih0gFoVCKIkiFiAbfCAQfCIbfCABfCIeIBUgGHwiFSAXIBogFIVCAYkiFCAgfCATfCIYhUIgiSIXfCIaIBSFQiiJIhQgGHwgCXwiGCAXhUIwiSIXhUIgiSIgIB8gISAVIA6FQgGJIg4gGXwgCnwiFYVCIIkiGXwiHyAOhUIoiSIOIBV8IA18IhUgGYVCMIkiGSAffCIffCIhIA+FQiiJIg8gHnwgBXwiHiAghUIwiSIgICF8IiEgGyAchUIwiSIbIB18IhwgFoVCAYkiFiAYfCADfCIYIBmFQiCJIhkgJHwiHSAWhUIoiSIWIBh8IBJ8IhggGYVCMIkiGSAfIA6FQgGJIg4gInwgAnwiHyAbhUIgiSIbIBcgGnwiF3wiGiAOhUIoiSIOIB98IAZ8Ih8gG4VCMIkiGyAafCIaIA6FQgGJIg4gFSAXIBSFQgGJIhR8IAh8IhUgI4VCIIkiFyAcfCIcIBSFQiiJIhQgFXwgC3wiFXwgBXwiIoVCIIkiI3wiJCAOhUIoiSIOICJ8IAh8IiIgGiAgIBUgF4VCMIkiFSAcfCIXIBSFQgGJIhQgGHwgCXwiGIVCIIkiHHwiGiAUhUIoiSIUIBh8IAZ8IhggHIVCMIkiHCAafCIaIBSFQgGJIhR8IAR8IiAgGSAdfCIZIBUgISAPhUIBiSIPIB98IAN8Ih2FQiCJIhV8Ih8gD4VCKIkiDyAdfCACfCIdIBWFQjCJIhWFQiCJIiEgFyAbIBkgFoVCAYkiFiAefCABfCIZhUIgiSIbfCIXIBaFQiiJIhYgGXwgE3wiGSAbhUIwiSIbIBd8Ihd8Ih4gFIVCKIkiFCAgfCAMfCIgICGFQjCJIiEgHnwiHiAiICOFQjCJIiIgJHwiIyAOhUIBiSIOIB18IBJ8Ih0gG4VCIIkiGyAafCIaIA6FQiiJIg4gHXwgC3wiHSAbhUIwiSIbIBcgFoVCAYkiFiAYfCANfCIXICKFQiCJIhggFSAffCIVfCIfIBaFQiiJIhYgF3wgEHwiFyAYhUIwiSIYIB98Ih8gFoVCAYkiFiAVIA+FQgGJIg8gGXwgCnwiFSAchUIgiSIZICN8IhwgD4VCKIkiDyAVfCAHfCIVfCASfCIihUIgiSIjfCIkIBaFQiiJIhYgInwgBXwiIiAjhUIwiSIjICR8IiQgFoVCAYkiFiAbIBp8IhogFSAZhUIwiSIVIB4gFIVCAYkiFCAXfCADfCIXhUIgiSIZfCIbIBSFQiiJIhQgF3wgB3wiF3wgAnwiHiAVIBx8IhUgGCAaIA6FQgGJIg4gIHwgC3wiGoVCIIkiGHwiHCAOhUIoiSIOIBp8IAR8IhogGIVCMIkiGIVCIIkiICAfICEgFSAPhUIBiSIPIB18IAZ8IhWFQiCJIh18Ih8gD4VCKIkiDyAVfCAKfCIVIB2FQjCJIh0gH3wiH3wiISAWhUIoiSIWIB58IAx8Ih4gIIVCMIkiICAhfCIhIBogFyAZhUIwiSIXIBt8IhkgFIVCAYkiFHwgEHwiGiAdhUIgiSIbICR8Ih0gFIVCKIkiFCAafCAJfCIaIBuFQjCJIhsgHyAPhUIBiSIPICJ8IBN8Ih8gF4VCIIkiFyAYIBx8Ihh8IhwgD4VCKIkiDyAffCABfCIfIBeFQjCJIhcgHHwiHCAPhUIBiSIPIBggDoVCAYkiDiAVfCAIfCIVICOFQiCJIhggGXwiGSAOhUIoiSIOIBV8IA18IhV8IA18IiKFQiCJIiN8IiQgD4VCKIkiDyAifCAMfCIiICOFQjCJIiMgJHwiJCAPhUIBiSIPIBsgHXwiGyAVIBiFQjCJIhUgISAWhUIBiSIWIB98IBB8IhiFQiCJIh18Ih8gFoVCKIkiFiAYfCAIfCIYfCASfCIhIBUgGXwiFSAXIBsgFIVCAYkiFCAefCAHfCIZhUIgiSIXfCIbIBSFQiiJIhQgGXwgAXwiGSAXhUIwiSIXhUIgiSIeIBwgICAVIA6FQgGJIg4gGnwgAnwiFYVCIIkiGnwiHCAOhUIoiSIOIBV8IAV8IhUgGoVCMIkiGiAcfCIcfCIgIA+FQiiJIg8gIXwgBHwiISAehUIwiSIeICB8IiAgGCAdhUIwiSIYIB98Ih0gFoVCAYkiFiAZfCAGfCIZIBqFQiCJIhogJHwiHyAWhUIoiSIWIBl8IBN8IhkgGoVCMIkiGiAcIA6FQgGJIg4gInwgCXwiHCAYhUIgiSIYIBcgG3wiF3wiGyAOhUIoiSIOIBx8IAN8IhwgGIVCMIkiGCAbfCIbIA6FQgGJIg4gFSAXIBSFQgGJIhR8IAt8IhUgI4VCIIkiFyAdfCIdIBSFQiiJIhQgFXwgCnwiFXwgBHwiIoVCIIkiI3wiJCAOhUIoiSIOICJ8IAl8IiIgGyAeIBUgF4VCMIkiFSAdfCIXIBSFQgGJIhQgGXwgDHwiGYVCIIkiHXwiGyAUhUIoiSIUIBl8IAp8IhkgHYVCMIkiHSAbfCIbIBSFQgGJIhR8IAN8Ih4gGiAffCIaIBUgICAPhUIBiSIPIBx8IAd8IhyFQiCJIhV8Ih8gD4VCKIkiDyAcfCAQfCIcIBWFQjCJIhWFQiCJIiAgFyAYIBogFoVCAYkiFiAhfCATfCIahUIgiSIYfCIXIBaFQiiJIhYgGnwgDXwiGiAYhUIwiSIYIBd8Ihd8IiEgFIVCKIkiFCAefCAFfCIeICCFQjCJIiAgIXwiISAiICOFQjCJIiIgJHwiIyAOhUIBiSIOIBx8IAt8IhwgGIVCIIkiGCAbfCIbIA6FQiiJIg4gHHwgEnwiHCAYhUIwiSIYIBcgFoVCAYkiFiAZfCABfCIXICKFQiCJIhkgFSAffCIVfCIfIBaFQiiJIhYgF3wgBnwiFyAZhUIwiSIZIB98Ih8gFoVCAYkiFiAVIA+FQgGJIg8gGnwgCHwiFSAdhUIgiSIaICN8Ih0gD4VCKIkiDyAVfCACfCIVfCANfCIihUIgiSIjfCIkIBaFQiiJIhYgInwgCXwiIiAjhUIwiSIjICR8IiQgFoVCAYkiFiAYIBt8IhggFSAahUIwiSIVICEgFIVCAYkiFCAXfCASfCIXhUIgiSIafCIbIBSFQiiJIhQgF3wgCHwiF3wgB3wiISAVIB18IhUgGSAYIA6FQgGJIg4gHnwgBnwiGIVCIIkiGXwiHSAOhUIoiSIOIBh8IAt8IhggGYVCMIkiGYVCIIkiHiAfICAgFSAPhUIBiSIPIBx8IAp8IhWFQiCJIhx8Ih8gD4VCKIkiDyAVfCAEfCIVIByFQjCJIhwgH3wiH3wiICAWhUIoiSIWICF8IAN8IiEgHoVCMIkiHiAgfCIgIBggFyAahUIwiSIXIBt8IhogFIVCAYkiFHwgBXwiGCAchUIgiSIbICR8IhwgFIVCKIkiFCAYfCABfCIYIBuFQjCJIhsgHyAPhUIBiSIPICJ8IAx8Ih8gF4VCIIkiFyAZIB18Ihl8Ih0gD4VCKIkiDyAffCATfCIfIBeFQjCJIhcgHXwiHSAPhUIBiSIPIBkgDoVCAYkiDiAVfCAQfCIVICOFQiCJIhkgGnwiGiAOhUIoiSIOIBV8IAJ8IhV8IBN8IiKFQiCJIiN8IiQgD4VCKIkiDyAifCASfCIiICOFQjCJIiMgJHwiJCAPhUIBiSIPIBsgHHwiGyAVIBmFQjCJIhUgICAWhUIBiSIWIB98IAt8IhmFQiCJIhx8Ih8gFoVCKIkiFiAZfCACfCIZfCAJfCIgIBUgGnwiFSAXIBsgFIVCAYkiFCAhfCAFfCIahUIgiSIXfCIbIBSFQiiJIhQgGnwgA3wiGiAXhUIwiSIXhUIgiSIhIB0gHiAVIA6FQgGJIg4gGHwgEHwiFYVCIIkiGHwiHSAOhUIoiSIOIBV8IAF8IhUgGIVCMIkiGCAdfCIdfCIeIA+FQiiJIg8gIHwgDXwiICAhhUIwiSIhIB58Ih4gGSAchUIwiSIZIB98IhwgFoVCAYkiFiAafCAIfCIaIBiFQiCJIhggJHwiHyAWhUIoiSIWIBp8IAp8IhogGIVCMIkiGCAdIA6FQgGJIg4gInwgBHwiHSAZhUIgiSIZIBcgG3wiF3wiGyAOhUIoiSIOIB18IAd8Ih0gGYVCMIkiGSAbfCIbIA6FQgGJIg4gFSAXIBSFQgGJIhR8IAx8IhUgI4VCIIkiFyAcfCIcIBSFQiiJIhQgFXwgBnwiFXwgEnwiIoVCIIkiI3wiJCAOhUIoiSIOICJ8IBN8IiIgGyAhIBUgF4VCMIkiFSAcfCIXIBSFQgGJIhQgGnwgBnwiGoVCIIkiHHwiGyAUhUIoiSIUIBp8IBB8IhogHIVCMIkiHCAbfCIbIBSFQgGJIhR8IA18IiEgGCAffCIYIBUgHiAPhUIBiSIPIB18IAJ8Ih2FQiCJIhV8Ih4gD4VCKIkiDyAdfCABfCIdIBWFQjCJIhWFQiCJIh8gFyAZIBggFoVCAYkiFiAgfCADfCIYhUIgiSIZfCIXIBaFQiiJIhYgGHwgBHwiGCAZhUIwiSIZIBd8Ihd8IiAgFIVCKIkiFCAhfCAIfCIhIB+FQjCJIh8gIHwiICAiICOFQjCJIiIgJHwiIyAOhUIBiSIOIB18IAd8Ih0gGYVCIIkiGSAbfCIbIA6FQiiJIg4gHXwgDHwiHSAZhUIwiSIZIBcgFoVCAYkiFiAafCALfCIXICKFQiCJIhogFSAefCIVfCIeIBaFQiiJIhYgF3wgCXwiFyAahUIwiSIaIB58Ih4gFoVCAYkiFiAVIA+FQgGJIg8gGHwgBXwiFSAchUIgiSIYICN8IhwgD4VCKIkiDyAVfCAKfCIVfCACfCIChUIgiSIifCIjIBaFQiiJIhYgAnwgC3wiAiAihUIwiSILICN8IiIgFoVCAYkiFiAZIBt8IhkgFSAYhUIwiSIVICAgFIVCAYkiFCAXfCANfCINhUIgiSIXfCIYIBSFQiiJIhQgDXwgBXwiBXwgEHwiECAVIBx8Ig0gGiAZIA6FQgGJIg4gIXwgDHwiDIVCIIkiFXwiGSAOhUIoiSIOIAx8IBJ8IhIgFYVCMIkiDIVCIIkiFSAeIB8gDSAPhUIBiSINIB18IAl8IgmFQiCJIg98IhogDYVCKIkiDSAJfCAIfCIJIA+FQjCJIgggGnwiD3wiGiAWhUIoiSIWIBB8IAd8IhAgEYUgDCAZfCIHIA6FQgGJIgwgCXwgCnwiCiALhUIgiSILIAUgF4VCMIkiBSAYfCIJfCIOIAyFQiiJIgwgCnwgE3wiEyALhUIwiSIKIA58IguFNwOAiQFBACADIAYgDyANhUIBiSINIAJ8fCICIAWFQiCJIgUgB3wiBiANhUIoiSIHIAJ8fCICQQApA4iJAYUgBCABIBIgCSAUhUIBiSIDfHwiASAIhUIgiSISICJ8IgkgA4VCKIkiAyABfHwiASAShUIwiSIEIAl8IhKFNwOIiQFBACATQQApA5CJAYUgECAVhUIwiSIQIBp8IhOFNwOQiQFBACABQQApA5iJAYUgAiAFhUIwiSICIAZ8IgGFNwOYiQFBACASIAOFQgGJQQApA6CJAYUgAoU3A6CJAUEAIBMgFoVCAYlBACkDqIkBhSAKhTcDqIkBQQAgASAHhUIBiUEAKQOwiQGFIASFNwOwiQFBACALIAyFQgGJQQApA7iJAYUgEIU3A7iJAQvdAgUBfwF+AX8BfgJ/IwBBwABrIgAkAAJAQQApA9CJAUIAUg0AQQBBACkDwIkBIgFBACgC4IoBIgKsfCIDNwPAiQFBAEEAKQPIiQEgAyABVK18NwPIiQECQEEALQDoigFFDQBBAEJ/NwPYiQELQQBCfzcD0IkBAkAgAkH/AEoNAEEAIQQDQCACIARqQeCJAWpBADoAACAEQQFqIgRBgAFBACgC4IoBIgJrSA0ACwtB4IkBEAIgAEEAKQOAiQE3AwAgAEEAKQOIiQE3AwggAEEAKQOQiQE3AxAgAEEAKQOYiQE3AxggAEEAKQOgiQE3AyAgAEEAKQOoiQE3AyggAEEAKQOwiQE3AzAgAEEAKQO4iQE3AzhBACgC5IoBIgVBAUgNAEEAIQRBACECA0AgBEGACWogACAEai0AADoAACAEQQFqIQQgBSACQQFqIgJB/wFxSg0ACwsgAEHAAGokAAv9AwMBfwF+AX8jAEGAAWsiAiQAQQBBgQI7AfKKAUEAIAE6APGKAUEAIAA6APCKAUGQfiEAA0AgAEGAiwFqQgA3AAAgAEH4igFqQgA3AAAgAEHwigFqQgA3AAAgAEEYaiIADQALQQAhAEEAQQApA/CKASIDQoiS853/zPmE6gCFNwOAiQFBAEEAKQP4igFCu86qptjQ67O7f4U3A4iJAUEAQQApA4CLAUKr8NP0r+68tzyFNwOQiQFBAEEAKQOIiwFC8e30+KWn/aelf4U3A5iJAUEAQQApA5CLAULRhZrv+s+Uh9EAhTcDoIkBQQBBACkDmIsBQp/Y+dnCkdqCm3+FNwOoiQFBAEEAKQOgiwFC6/qG2r+19sEfhTcDsIkBQQBBACkDqIsBQvnC+JuRo7Pw2wCFNwO4iQFBACADp0H/AXE2AuSKAQJAIAFBAUgNACACQgA3A3ggAkIANwNwIAJCADcDaCACQgA3A2AgAkIANwNYIAJCADcDUCACQgA3A0ggAkIANwNAIAJCADcDOCACQgA3AzAgAkIANwMoIAJCADcDICACQgA3AxggAkIANwMQIAJCADcDCCACQgA3AwBBACEEA0AgAiAAaiAAQYAJai0AADoAACAAQQFqIQAgBEEBaiIEQf8BcSABSA0ACyACQYABEAELIAJBgAFqJAALEgAgAEEDdkH/P3EgAEEQdhAECwkAQYAJIAAQAQsGAEGAiQELGwAgAUEDdkH/P3EgAUEQdhAEQYAJIAAQARADCwsLAQBBgAgLBPAAAAA=", hash: "c6f286e6" };
111
+ function G(A) { return !Number.isInteger(A) || A < 8 || A > 512 || A % 8 != 0 ? new Error("Invalid variant! Valid values: 8, 16, ..., 512") : null; }
112
+ function p(A = 512, I = null) { if (G(A))
113
+ return Promise.reject(G(A)); let i = null, C = A; if (null !== I) {
114
+ if (i = n(I), i.length > 64)
115
+ return Promise.reject(new Error("Max key length is 64 bytes"));
116
+ g = A, Q = i.length, C = g | Q << 16;
117
+ } var g, Q; const B = A / 8; return U(c, B).then((A => { C > 512 && A.writeMemory(i), A.init(C); const I = { init: C > 512 ? () => (A.writeMemory(i), A.init(C), I) : () => (A.init(C), I), update: i => (A.update(i), I), digest: I => A.digest(I), save: () => A.save(), load: i => (A.load(i), I), blockSize: 128, digestSize: B }; return I; })); }
118
+ new g;
119
+ const y = new DataView(new ArrayBuffer(4));
120
+ function J(A) { return y.setInt32(0, A, !0), new Uint8Array(y.buffer); }
121
+ function l(A, i, C) { return I(this, void 0, void 0, (function* () { if (C <= 64) {
122
+ const A = yield p(8 * C);
123
+ return A.update(J(C)), A.update(i), A.digest("binary");
124
+ } const I = Math.ceil(C / 32) - 2, g = new Uint8Array(C); A.init(), A.update(J(C)), A.update(i); let Q = A.digest("binary"); g.set(Q.subarray(0, 32), 0); for (let i = 1; i < I; i++)
125
+ A.init(), A.update(Q), Q = A.digest("binary"), g.set(Q.subarray(0, 32), 32 * i); const B = C - 32 * I; let h; return 64 === B ? (h = A, h.init()) : h = yield p(8 * B), h.update(Q), Q = h.digest("binary"), g.set(Q.subarray(0, B), 32 * I), g; })); }
126
+ function u(A) { return I(this, void 0, void 0, (function* () { var I; const { parallelism: i, iterations: g, hashLength: Q } = A, B = n(A.password), h = n(A.salt), e = function (A) { switch (A) {
127
+ case "d": return 0;
128
+ case "i": return 1;
129
+ default: return 2;
130
+ } }(A.hashType), { memorySize: t } = A, o = n(null !== (I = A.secret) && void 0 !== I ? I : ""), [r, D] = yield Promise.all([U(C, 1024), p(512)]); r.setMemorySize(1024 * t + 1024); const f = new Uint8Array(24), k = new DataView(f.buffer); k.setInt32(0, i, !0), k.setInt32(4, Q, !0), k.setInt32(8, t, !0), k.setInt32(12, g, !0), k.setInt32(16, 19, !0), k.setInt32(20, e, !0), r.writeMemory(f, 1024 * t), D.init(), D.update(f), D.update(J(B.length)), D.update(B), D.update(J(h.length)), D.update(h), D.update(J(o.length)), D.update(o), D.update(J(0)); const a = 4 * Math.floor(t / (4 * i)), s = new Uint8Array(72), S = D.digest("binary"); s.set(S); for (let A = 0; A < i; A++) {
131
+ s.set(J(0), 64), s.set(J(A), 68);
132
+ let I = A * a, i = yield l(D, s, 1024);
133
+ r.writeMemory(i, 1024 * I), I += 1, s.set(J(1), 64), i = yield l(D, s, 1024), r.writeMemory(i, 1024 * I);
134
+ } const c = new Uint8Array(1024); w(c, r.calculate(new Uint8Array([]), t)); const G = yield l(D, c, Q); if ("hex" === A.outputType) {
135
+ return E(new Uint8Array(2 * Q), G, Q);
136
+ } return "encoded" === A.outputType ? function (A, I, i) { const C = [`m=${I.memorySize}`, `t=${I.iterations}`, `p=${I.parallelism}`].join(","); return `$argon2${I.hashType}$v=19$${C}$${F(A, !1)}$${F(i, !1)}`; }(h, A, G) : G; })); }
137
+ const H = A => { var I; if (!A || "object" != typeof A)
138
+ throw new Error("Invalid options parameter. It requires an object."); if (!A.password)
139
+ throw new Error("Password must be specified"); if (A.password = n(A.password), A.password.length < 1)
140
+ throw new Error("Password must be specified"); if (!A.salt)
141
+ throw new Error("Salt must be specified"); if (A.salt = n(A.salt), A.salt.length < 8)
142
+ throw new Error("Salt should be at least 8 bytes long"); if (A.secret = n(null !== (I = A.secret) && void 0 !== I ? I : ""), !Number.isInteger(A.iterations) || A.iterations < 1)
143
+ throw new Error("Iterations should be a positive number"); if (!Number.isInteger(A.parallelism) || A.parallelism < 1)
144
+ throw new Error("Parallelism should be a positive number"); if (!Number.isInteger(A.hashLength) || A.hashLength < 4)
145
+ throw new Error("Hash length should be at least 4 bytes."); if (!Number.isInteger(A.memorySize))
146
+ throw new Error("Memory size should be specified."); if (A.memorySize < 8 * A.parallelism)
147
+ throw new Error("Memory size should be at least 8 * parallelism."); if (void 0 === A.outputType && (A.outputType = "hex"), !["hex", "binary", "encoded"].includes(A.outputType))
148
+ throw new Error(`Insupported output type ${A.outputType}. Valid values: ['hex', 'binary', 'encoded']`); };
149
+ A.argon2Verify = function (A) { return I(this, void 0, void 0, (function* () { (A => { if (!A || "object" != typeof A)
150
+ throw new Error("Invalid options parameter. It requires an object."); if (void 0 === A.hash || "string" != typeof A.hash)
151
+ throw new Error("Hash should be specified"); })(A); const I = ((A, I, i) => { const C = I.match(/^\$argon2(id|i|d)\$v=([0-9]+)\$((?:[mtp]=[0-9]+,){2}[mtp]=[0-9]+)\$([A-Za-z0-9+/]+)\$([A-Za-z0-9+/]+)$/); if (!C)
152
+ throw new Error("Invalid hash"); const [, g, Q, B, h, e] = C; if ("19" !== Q)
153
+ throw new Error(`Unsupported version: ${Q}`); const w = {}, t = { m: "memorySize", p: "parallelism", t: "iterations" }; for (const A of B.split(",")) {
154
+ const [I, i] = A.split("=");
155
+ w[t[I]] = Number(i);
156
+ } return Object.assign(Object.assign({}, w), { password: A, secret: i, hashType: g, salt: k(h), hashLength: f(e), outputType: "encoded" }); })(A.password, A.hash, A.secret); H(I); const i = A.hash.lastIndexOf("$") + 1; return (yield u(I)).substring(i) === A.hash.substring(i); })); }, A.argon2d = function (A) { return I(this, void 0, void 0, (function* () { return H(A), u(Object.assign(Object.assign({}, A), { hashType: "d" })); })); }, A.argon2i = function (A) { return I(this, void 0, void 0, (function* () { return H(A), u(Object.assign(Object.assign({}, A), { hashType: "i" })); })); }, A.argon2id = function (A) { return I(this, void 0, void 0, (function* () { return H(A), u(Object.assign(Object.assign({}, A), { hashType: "id" })); })); };
157
+ }));
158
+ // VENDOR-END
159
+ return exports;
160
+ }
package/dist/index.d.ts CHANGED
@@ -11,7 +11,7 @@ export { makeKeyStore, type KeyStore, type KeyStoreConfig } from './client/keys.
11
11
  export { wordlist } from './client/wordlist.ts';
12
12
  /** 伺服器端原語(Cloudflare Workers + D1)。 */
13
13
  export { makeInboundCipher, isCipherFor, validWrappedKey, validHash64, validSalt, pickKeyPackage, loginRouteCore, errResponse, AUTH_RATE, type AuthRow, type AuthStore, type CipherFormats, type KeyPackage, } from './server/auth.ts';
14
- export { checkRate, type RateWindow } from './server/ratelimit.ts';
14
+ export { checkRate, normalizeRateIp, type RateWindow } from './server/ratelimit.ts';
15
15
  export { corsResponse, CORS_HEADERS } from './server/cors.ts';
16
16
  export { sha256Hex, hashString, generateSessionToken, timingSafeEq, } from './server/hash.ts';
17
17
  export type { Env } from './server/env.ts';
package/dist/index.js CHANGED
@@ -11,7 +11,7 @@ export { makeKeyStore } from './client/keys.js';
11
11
  export { wordlist } from './client/wordlist.js';
12
12
  /** 伺服器端原語(Cloudflare Workers + D1)。 */
13
13
  export { makeInboundCipher, isCipherFor, validWrappedKey, validHash64, validSalt, pickKeyPackage, loginRouteCore, errResponse, AUTH_RATE, } from './server/auth.js';
14
- export { checkRate } from './server/ratelimit.js';
14
+ export { checkRate, normalizeRateIp } from './server/ratelimit.js';
15
15
  export { corsResponse, CORS_HEADERS } from './server/cors.js';
16
16
  export { sha256Hex, hashString, generateSessionToken, timingSafeEq, } from './server/hash.js';
17
17
  export { PH2_LADDER_TABLE, PH2_LADDER_KIND_LEGACY, PH2_LADDER_KIND_V2, } from './server/ladder.js';
@@ -1,6 +1,12 @@
1
1
  /**
2
2
  * env.ts — core 對 Worker Env 的最小介面。各 fork 的 Env 以此為基底擴充。
3
+ *
4
+ * D1Database 型別以模組 import 承載(非全域 triple-slash reference):
5
+ * 消費者未帶 @cloudflare/workers-types 時,吃 client 面 .d.ts 不會被 env.d.ts 的
6
+ * 全域型別缺席炸掉(types= reference 在 types 套件缺席=TS2688 全檔紅;import type
7
+ * 缺席=該欄型別 any 化+TS2304 只在吃 env.d.ts 的檔案現形=影響面收斂)。
3
8
  */
9
+ import type { D1Database } from '@cloudflare/workers-types';
4
10
  export interface Env {
5
11
  DB: D1Database;
6
12
  }
@@ -14,6 +14,10 @@
14
14
  * 放行判準:RETURNING 的 count <= max(窗口內超額後的每一發都回實際 count,
15
15
  * 由呼叫端以 count <= max 拒絕——計數不封頂,超額仍逐發累計)。
16
16
  *
17
+ * 限流鍵(2026-10-11 定案):checkRate 入口經 normalizeRateIp 正規化——IPv6 聚合至 /64
18
+ * (單一終端可自由輪換 /64 內尾段=完整地址當鍵即每發新鍵、限流失效);IPv4-mapped
19
+ * 位址回點分 IPv4(=原生 IPv4 同 /32 鍵,review r1 MAJOR-1 收口);IPv4 與非 IPv6 形原樣。
20
+ *
17
21
  * 呼叫端須自建表(無 GC 機制:舊 IP 列不清,表隨活躍 IP 數緩慢增長——
18
22
  * 每列 ~40 bytes,量級可忽略;如需回收見下方 GC 註記):
19
23
  * CREATE TABLE IF NOT EXISTS {table} (ip TEXT PRIMARY KEY, window_start INTEGER, count INTEGER);
@@ -29,4 +33,14 @@ export interface RateWindow {
29
33
  export declare const SQL_RATE_BUMP = "INSERT INTO {table} (ip, window_start, count) VALUES (?1, ?2, 1)\n ON CONFLICT(ip) DO UPDATE SET\n count = CASE WHEN window_start <= ?3 THEN 1 ELSE count + 1 END,\n window_start = CASE WHEN window_start <= ?3 THEN ?2 ELSE window_start END\n RETURNING count AS n";
30
34
  /** @internal(0.1.6 公開面走 index.ts checkRate)。放行判準單一真相:窗口內超額後照實回實際 count,呼叫端以 count <= max 拒絕。 */
31
35
  export declare function isRateAllowed(count: number, max: number): boolean;
36
+ /**
37
+ * 限流鍵正規化(單一真相;純函式、零 throw):
38
+ * - IPv6 → /64 前綴+`/64` 標記(RFC 5952 規範形:hextet 前導零摘除、小寫、零串壓縮),
39
+ * 例 `2001:0DB8:0000:000A::1` → `2001:db8:0:a::/64`、`::1` → `::/64`;zone id(`%…`)先剝除。
40
+ * 介面 ID 歸零後末 4 組恆零=最長零串恆為尾串(前綴內零串至多 3 組),故壓縮形=前綴摘尾零組+`::`。
41
+ * - IPv4-mapped(::/96 前綴+映射尾組,RFC 4291 §2.5.5.2)→ 點分 IPv4 原鍵——mapped 位址就是 IPv4
42
+ * 節點的表示法,回 /32 與原生同鍵(hex 尾組 twin `::ffff:c000:201` 同鍵 192.0.2.1;禁併入 ::/64 全域桶)。
43
+ * - IPv4/`'unknown'`/空串/無法解析形:原樣返回(鍵照樣進表=可見面,不靜默丟鍵)。
44
+ */
45
+ export declare function normalizeRateIp(ip: string): string;
32
46
  export declare function checkRate(env: Env, w: RateWindow, ip: string): Promise<boolean>;
@@ -14,6 +14,10 @@
14
14
  * 放行判準:RETURNING 的 count <= max(窗口內超額後的每一發都回實際 count,
15
15
  * 由呼叫端以 count <= max 拒絕——計數不封頂,超額仍逐發累計)。
16
16
  *
17
+ * 限流鍵(2026-10-11 定案):checkRate 入口經 normalizeRateIp 正規化——IPv6 聚合至 /64
18
+ * (單一終端可自由輪換 /64 內尾段=完整地址當鍵即每發新鍵、限流失效);IPv4-mapped
19
+ * 位址回點分 IPv4(=原生 IPv4 同 /32 鍵,review r1 MAJOR-1 收口);IPv4 與非 IPv6 形原樣。
20
+ *
17
21
  * 呼叫端須自建表(無 GC 機制:舊 IP 列不清,表隨活躍 IP 數緩慢增長——
18
22
  * 每列 ~40 bytes,量級可忽略;如需回收見下方 GC 註記):
19
23
  * CREATE TABLE IF NOT EXISTS {table} (ip TEXT PRIMARY KEY, window_start INTEGER, count INTEGER);
@@ -58,6 +62,55 @@ async function bumpRate(env, w, ip) {
58
62
  return true;
59
63
  }
60
64
  }
65
+ const HEXTET = /^[0-9a-f]{1,4}$/i;
66
+ const IPV4_OCTET = /^(0|[1-9]\d{0,2})$/;
67
+ /** IPv6 文字形 → 8 組 hextet 數值(RFC 4291 §2.2:`::` 至多一處、嵌入 IPv4 僅居末);非法形回 null。 */
68
+ function parseIpv6(s) {
69
+ const halves = s.split('::');
70
+ if (halves.length > 2)
71
+ return null;
72
+ const parts = halves.map((h) => (h === '' ? [] : h.split(':')));
73
+ const last = parts[parts.length - 1];
74
+ const v4 = [];
75
+ if (last.length > 0 && last[last.length - 1].includes('.')) {
76
+ const q = last.pop().split('.');
77
+ if (q.length !== 4 || !q.every((o) => IPV4_OCTET.test(o) && Number(o) <= 255))
78
+ return null;
79
+ v4.push(Number(q[0]) * 256 + Number(q[1]), Number(q[2]) * 256 + Number(q[3]));
80
+ }
81
+ if (!parts.every((p) => p.every((g) => HEXTET.test(g))))
82
+ return null;
83
+ const n = parts.reduce((a, p) => a + p.length, 0) + v4.length;
84
+ const hex = (p) => p.map((g) => parseInt(g, 16));
85
+ if (halves.length === 1)
86
+ return n === 8 ? [...hex(parts[0]), ...v4] : null;
87
+ if (n > 7)
88
+ return null;
89
+ return [...hex(parts[0]), ...new Array(8 - n).fill(0), ...hex(parts[1]), ...v4];
90
+ }
91
+ /**
92
+ * 限流鍵正規化(單一真相;純函式、零 throw):
93
+ * - IPv6 → /64 前綴+`/64` 標記(RFC 5952 規範形:hextet 前導零摘除、小寫、零串壓縮),
94
+ * 例 `2001:0DB8:0000:000A::1` → `2001:db8:0:a::/64`、`::1` → `::/64`;zone id(`%…`)先剝除。
95
+ * 介面 ID 歸零後末 4 組恆零=最長零串恆為尾串(前綴內零串至多 3 組),故壓縮形=前綴摘尾零組+`::`。
96
+ * - IPv4-mapped(::/96 前綴+映射尾組,RFC 4291 §2.5.5.2)→ 點分 IPv4 原鍵——mapped 位址就是 IPv4
97
+ * 節點的表示法,回 /32 與原生同鍵(hex 尾組 twin `::ffff:c000:201` 同鍵 192.0.2.1;禁併入 ::/64 全域桶)。
98
+ * - IPv4/`'unknown'`/空串/無法解析形:原樣返回(鍵照樣進表=可見面,不靜默丟鍵)。
99
+ */
100
+ export function normalizeRateIp(ip) {
101
+ if (typeof ip !== 'string' || !ip.includes(':'))
102
+ return ip;
103
+ const pct = ip.indexOf('%');
104
+ const g = parseIpv6(pct >= 0 ? ip.slice(0, pct) : ip);
105
+ if (!g)
106
+ return ip;
107
+ if (g[0] === 0 && g[1] === 0 && g[2] === 0 && g[3] === 0 && g[4] === 0 && g[5] === 0xffff)
108
+ return [g[6] >> 8, g[6] & 255, g[7] >> 8, g[7] & 255].join('.');
109
+ const net = g.slice(0, 4);
110
+ while (net.length > 0 && net[net.length - 1] === 0)
111
+ net.pop();
112
+ return net.map((h) => h.toString(16)).join(':') + '::/64';
113
+ }
61
114
  export function checkRate(env, w, ip) {
62
- return bumpRate(env, w, ip);
115
+ return bumpRate(env, w, normalizeRateIp(ip));
63
116
  }
@@ -351,7 +351,7 @@ PH1 鹽是 per-product 固定域鹽(PH2 UNIQUE 約束);v2/v3 鹽域值
351
351
  | `inputs` | 產生時的輸入(密語、PIN、identity、config 欄、外置鹽 `salt_hex`/`salt1_hex`、`note_key_hex` 或 `plaintext`) |
352
352
  | `wire` | 完整線上字串(`prefix + b64(payload)`) |
353
353
  | `payload_len` | Base64 解碼後位元組數 |
354
- | `fields` | payload 欄位切分陣列,每項 `name`(`pinSalt`/`iv`/`ct`/`tag`)、`offset`、`len`、`hex`;`len` 總和=`payload_len` |
354
+ | `fields` | payload 欄位切分陣列,每項 `fields[].name`(`pinSalt`/`iv`/`ct`/`tag`)、`fields[].offset`、`fields[].len`、`fields[].hex`;`fields[].len` 總和=`payload_len` |
355
355
 
356
356
  金鑰包裹家族的 `inputs.note_key_hex` 固定 `c3`×32(驗證閘 KAT 母型),以此 wire 依本規格解包須得回之;
357
357
  content 家族以 `inputs.plaintext`/`inputs.aad` 解密須得回原文。
@@ -360,10 +360,10 @@ content 家族以 `inputs.plaintext`/`inputs.aad` 解密須得回原文。
360
360
 
361
361
  | 欄位 | 意義 |
362
362
  | --- | --- |
363
- | `rfc9106` | Argon2id RFC 9106 §5.3 參數與 `expected_tag_hex` |
364
- | `frozen_blobs` | 驗證閘凍結 blob([14] `jr2w.`、[17] `jr3w.`/`jr3d.`/`jr4w.`/`jr4d.`、[20] `jr1r.`/`jr1w.` 復原舊契約):`prefix`、`wire`、解包輸入、`expected_note_key_hex`、`source`(閘段號) |
365
- | `credentials` | §5 憑證派生樣本:`kind`、`input`、`salt`、`expected_hex` |
363
+ | `rfc9106` | Argon2id RFC 9106 §5.3 參數:`rfc9106.algorithm`、`rfc9106.version`、`rfc9106.memory_kib`、`rfc9106.iterations`、`rfc9106.parallelism`、`rfc9106.tag_len`、`rfc9106.password_hex`、`rfc9106.salt_hex`、`rfc9106.secret`/`rfc9106.associated_data`(恆 null),與 `rfc9106.expected_tag_hex` |
364
+ | `frozen_blobs` | 驗證閘凍結 blob([14] `jr2w.`、[17] `jr3w.`/`jr3d.`/`jr4w.`/`jr4d.`、[20] `jr1r.`/`jr1w.` 復原舊契約):`frozen_blobs[].prefix`、`frozen_blobs[].wire`、`frozen_blobs[].payload_len`、`frozen_blobs[].inputs`(解包輸入)、`frozen_blobs[].expected_note_key_hex`、`frozen_blobs[].source`(閘段號) |
365
+ | `credentials` | §5 憑證派生樣本:`credentials[].kind`、`credentials[].input`、`credentials[].input_nfkc`(僅 `ph1_v3`:`input` 經 `normalizePassphrase` 後的值)、`credentials[].salt`、`credentials[].expected_hex` |
366
366
 
367
367
  ### 7.3 `bip39.json`——BIP39 抽樣
368
368
 
369
- `samples`(陣列)每筆:`entropy_hex`、`checksum_hex`、`words`(24 詞陣列)、`source`(`seeded:<n>`/`edge`)。
369
+ `samples`(陣列)每筆:`samples[].entropy_hex`、`samples[].checksum_hex`、`samples[].words`(24 詞陣列)、`samples[].source`(`seeded:<n>`/`edge`)。
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "format": "journal-core-vectors/1",
3
- "package_version": "0.3.0",
3
+ "package_version": "0.3.1",
4
4
  "spec": "docs/format-spec.md",
5
5
  "generator": "scripts/generate-vectors.ts",
6
6
  "note": "Frozen evidence generated once by calling the real primitives; not recomputed in CI (random iv/salt). Verify gate [26] checks presence and shape only.",