@naylence/advanced-security 0.3.5-test.101 → 0.3.5-test.104

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 (170) hide show
  1. package/dist/browser/index.js +17524 -12952
  2. package/dist/browser/index.js.map +1 -1
  3. package/dist/cjs/browser.js +1 -0
  4. package/dist/cjs/browser.js.map +1 -1
  5. package/dist/cjs/naylence/fame/factory-manifest.js +18 -0
  6. package/dist/cjs/naylence/fame/factory-manifest.js.map +1 -1
  7. package/dist/cjs/naylence/fame/security/cert/browser-csr.js +103 -0
  8. package/dist/cjs/naylence/fame/security/cert/browser-csr.js.map +1 -0
  9. package/dist/cjs/naylence/fame/security/cert/ca-server-cli.js +30 -0
  10. package/dist/cjs/naylence/fame/security/cert/ca-server-cli.js.map +1 -0
  11. package/dist/cjs/naylence/fame/security/cert/ca-server.js +171 -0
  12. package/dist/cjs/naylence/fame/security/cert/ca-server.js.map +1 -0
  13. package/dist/cjs/naylence/fame/security/cert/ca-service-client.js +331 -24
  14. package/dist/cjs/naylence/fame/security/cert/ca-service-client.js.map +1 -1
  15. package/dist/cjs/naylence/fame/security/cert/ca-types.js +8 -0
  16. package/dist/cjs/naylence/fame/security/cert/ca-types.js.map +1 -1
  17. package/dist/cjs/naylence/fame/security/cert/csr-types.js +2 -0
  18. package/dist/cjs/naylence/fame/security/cert/csr-types.js.map +1 -0
  19. package/dist/cjs/naylence/fame/security/cert/default-ca-service.js +102 -1
  20. package/dist/cjs/naylence/fame/security/cert/default-ca-service.js.map +1 -1
  21. package/dist/cjs/naylence/fame/security/cert/default-certificate-manager.js +242 -65
  22. package/dist/cjs/naylence/fame/security/cert/default-certificate-manager.js.map +1 -1
  23. package/dist/cjs/naylence/fame/security/cert/index.js +7 -1
  24. package/dist/cjs/naylence/fame/security/cert/index.js.map +1 -1
  25. package/dist/cjs/naylence/fame/security/cert/internal-ca-service.js +2 -5
  26. package/dist/cjs/naylence/fame/security/cert/internal-ca-service.js.map +1 -1
  27. package/dist/cjs/naylence/fame/security/cert/node-ed25519-csr.js +156 -0
  28. package/dist/cjs/naylence/fame/security/cert/node-ed25519-csr.js.map +1 -0
  29. package/dist/cjs/naylence/fame/security/cert/oid-constants.js +7 -0
  30. package/dist/cjs/naylence/fame/security/cert/oid-constants.js.map +1 -0
  31. package/dist/cjs/naylence/fame/security/cert/trust-store/anchor-utils.js +119 -0
  32. package/dist/cjs/naylence/fame/security/cert/trust-store/anchor-utils.js.map +1 -0
  33. package/dist/cjs/naylence/fame/security/cert/trust-store/browser-trust-store-provider-factory.js +82 -0
  34. package/dist/cjs/naylence/fame/security/cert/trust-store/browser-trust-store-provider-factory.js.map +1 -0
  35. package/dist/cjs/naylence/fame/security/cert/trust-store/env-provider.js +168 -0
  36. package/dist/cjs/naylence/fame/security/cert/trust-store/env-provider.js.map +1 -0
  37. package/dist/cjs/naylence/fame/security/cert/trust-store/fame-ca-certs-parser.js +257 -0
  38. package/dist/cjs/naylence/fame/security/cert/trust-store/fame-ca-certs-parser.js.map +1 -0
  39. package/dist/cjs/naylence/fame/security/cert/trust-store/http-bundle-provider.js +497 -0
  40. package/dist/cjs/naylence/fame/security/cert/trust-store/http-bundle-provider.js.map +1 -0
  41. package/dist/cjs/naylence/fame/security/cert/trust-store/http-signed-bundle-provider.js +2 -0
  42. package/dist/cjs/naylence/fame/security/cert/trust-store/http-signed-bundle-provider.js.map +1 -0
  43. package/dist/cjs/naylence/fame/security/cert/trust-store/node-trust-store-provider-factory.js +61 -0
  44. package/dist/cjs/naylence/fame/security/cert/trust-store/node-trust-store-provider-factory.js.map +1 -0
  45. package/dist/cjs/naylence/fame/security/cert/trust-store/static-bundle-provider.js +44 -0
  46. package/dist/cjs/naylence/fame/security/cert/trust-store/static-bundle-provider.js.map +1 -0
  47. package/dist/cjs/naylence/fame/security/cert/trust-store/trust-store-provider-factory.js +40 -0
  48. package/dist/cjs/naylence/fame/security/cert/trust-store/trust-store-provider-factory.js.map +1 -0
  49. package/dist/cjs/naylence/fame/security/cert/trust-store/trust-store-provider.js +2 -0
  50. package/dist/cjs/naylence/fame/security/cert/trust-store/trust-store-provider.js.map +1 -0
  51. package/dist/cjs/naylence/fame/security/cert/util.js +1 -2
  52. package/dist/cjs/naylence/fame/security/cert/util.js.map +1 -1
  53. package/dist/cjs/naylence/fame/security/register-advanced-security-factories.js +113 -23
  54. package/dist/cjs/naylence/fame/security/register-advanced-security-factories.js.map +1 -1
  55. package/dist/cjs/naylence/fame/security/signing/eddsa-envelope-verifier-factory.js +6 -0
  56. package/dist/cjs/naylence/fame/security/signing/eddsa-envelope-verifier-factory.js.map +1 -1
  57. package/dist/cjs/naylence/fame/security/signing/eddsa-envelope-verifier.js +43 -59
  58. package/dist/cjs/naylence/fame/security/signing/eddsa-envelope-verifier.js.map +1 -1
  59. package/dist/cjs/version.js +2 -2
  60. package/dist/esm/browser.js +1 -0
  61. package/dist/esm/browser.js.map +1 -1
  62. package/dist/esm/naylence/fame/factory-manifest.js +18 -0
  63. package/dist/esm/naylence/fame/factory-manifest.js.map +1 -1
  64. package/dist/esm/naylence/fame/security/cert/browser-csr.js +103 -0
  65. package/dist/esm/naylence/fame/security/cert/browser-csr.js.map +1 -0
  66. package/dist/esm/naylence/fame/security/cert/ca-server-cli.js +30 -0
  67. package/dist/esm/naylence/fame/security/cert/ca-server-cli.js.map +1 -0
  68. package/dist/esm/naylence/fame/security/cert/ca-server.js +35 -17
  69. package/dist/esm/naylence/fame/security/cert/ca-server.js.map +1 -1
  70. package/dist/esm/naylence/fame/security/cert/ca-service-client.js +331 -24
  71. package/dist/esm/naylence/fame/security/cert/ca-service-client.js.map +1 -1
  72. package/dist/esm/naylence/fame/security/cert/ca-types.js +8 -0
  73. package/dist/esm/naylence/fame/security/cert/ca-types.js.map +1 -1
  74. package/dist/esm/naylence/fame/security/cert/csr-types.js +2 -0
  75. package/dist/esm/naylence/fame/security/cert/csr-types.js.map +1 -0
  76. package/dist/esm/naylence/fame/security/cert/default-ca-service.js +102 -1
  77. package/dist/esm/naylence/fame/security/cert/default-ca-service.js.map +1 -1
  78. package/dist/esm/naylence/fame/security/cert/default-certificate-manager.js +242 -65
  79. package/dist/esm/naylence/fame/security/cert/default-certificate-manager.js.map +1 -1
  80. package/dist/esm/naylence/fame/security/cert/index.js +7 -1
  81. package/dist/esm/naylence/fame/security/cert/index.js.map +1 -1
  82. package/dist/esm/naylence/fame/security/cert/internal-ca-service.js +2 -5
  83. package/dist/esm/naylence/fame/security/cert/internal-ca-service.js.map +1 -1
  84. package/dist/esm/naylence/fame/security/cert/node-ed25519-csr.js +156 -0
  85. package/dist/esm/naylence/fame/security/cert/node-ed25519-csr.js.map +1 -0
  86. package/dist/esm/naylence/fame/security/cert/oid-constants.js +7 -0
  87. package/dist/esm/naylence/fame/security/cert/oid-constants.js.map +1 -0
  88. package/dist/esm/naylence/fame/security/cert/trust-store/anchor-utils.js +119 -0
  89. package/dist/esm/naylence/fame/security/cert/trust-store/anchor-utils.js.map +1 -0
  90. package/dist/esm/naylence/fame/security/cert/trust-store/browser-trust-store-provider-factory.js +82 -0
  91. package/dist/esm/naylence/fame/security/cert/trust-store/browser-trust-store-provider-factory.js.map +1 -0
  92. package/dist/esm/naylence/fame/security/cert/trust-store/env-provider.js +168 -0
  93. package/dist/esm/naylence/fame/security/cert/trust-store/env-provider.js.map +1 -0
  94. package/dist/esm/naylence/fame/security/cert/trust-store/fame-ca-certs-parser.js +257 -0
  95. package/dist/esm/naylence/fame/security/cert/trust-store/fame-ca-certs-parser.js.map +1 -0
  96. package/dist/esm/naylence/fame/security/cert/trust-store/http-bundle-provider.js +497 -0
  97. package/dist/esm/naylence/fame/security/cert/trust-store/http-bundle-provider.js.map +1 -0
  98. package/dist/esm/naylence/fame/security/cert/trust-store/http-signed-bundle-provider.js +2 -0
  99. package/dist/esm/naylence/fame/security/cert/trust-store/http-signed-bundle-provider.js.map +1 -0
  100. package/dist/esm/naylence/fame/security/cert/trust-store/node-trust-store-provider-factory.js +61 -0
  101. package/dist/esm/naylence/fame/security/cert/trust-store/node-trust-store-provider-factory.js.map +1 -0
  102. package/dist/esm/naylence/fame/security/cert/trust-store/static-bundle-provider.js +44 -0
  103. package/dist/esm/naylence/fame/security/cert/trust-store/static-bundle-provider.js.map +1 -0
  104. package/dist/esm/naylence/fame/security/cert/trust-store/trust-store-provider-factory.js +40 -0
  105. package/dist/esm/naylence/fame/security/cert/trust-store/trust-store-provider-factory.js.map +1 -0
  106. package/dist/esm/naylence/fame/security/cert/trust-store/trust-store-provider.js +2 -0
  107. package/dist/esm/naylence/fame/security/cert/trust-store/trust-store-provider.js.map +1 -0
  108. package/dist/esm/naylence/fame/security/cert/util.js +1 -2
  109. package/dist/esm/naylence/fame/security/cert/util.js.map +1 -1
  110. package/dist/esm/naylence/fame/security/register-advanced-security-factories.js +113 -23
  111. package/dist/esm/naylence/fame/security/register-advanced-security-factories.js.map +1 -1
  112. package/dist/esm/naylence/fame/security/signing/eddsa-envelope-verifier-factory.js +6 -0
  113. package/dist/esm/naylence/fame/security/signing/eddsa-envelope-verifier-factory.js.map +1 -1
  114. package/dist/esm/naylence/fame/security/signing/eddsa-envelope-verifier.js +43 -59
  115. package/dist/esm/naylence/fame/security/signing/eddsa-envelope-verifier.js.map +1 -1
  116. package/dist/esm/version.js +2 -2
  117. package/dist/types/browser.d.ts +2 -0
  118. package/dist/types/browser.d.ts.map +1 -1
  119. package/dist/types/naylence/fame/factory-manifest.d.ts +3 -1
  120. package/dist/types/naylence/fame/factory-manifest.d.ts.map +1 -1
  121. package/dist/types/naylence/fame/security/cert/browser-csr.d.ts +9 -0
  122. package/dist/types/naylence/fame/security/cert/browser-csr.d.ts.map +1 -0
  123. package/dist/types/naylence/fame/security/cert/ca-server-cli.d.ts +3 -0
  124. package/dist/types/naylence/fame/security/cert/ca-server-cli.d.ts.map +1 -0
  125. package/dist/types/naylence/fame/security/cert/ca-server.d.ts +2 -2
  126. package/dist/types/naylence/fame/security/cert/ca-server.d.ts.map +1 -1
  127. package/dist/types/naylence/fame/security/cert/ca-service-client.d.ts.map +1 -1
  128. package/dist/types/naylence/fame/security/cert/ca-types.d.ts +32 -0
  129. package/dist/types/naylence/fame/security/cert/ca-types.d.ts.map +1 -1
  130. package/dist/types/naylence/fame/security/cert/csr-types.d.ts +5 -0
  131. package/dist/types/naylence/fame/security/cert/csr-types.d.ts.map +1 -0
  132. package/dist/types/naylence/fame/security/cert/default-ca-service.d.ts +2 -1
  133. package/dist/types/naylence/fame/security/cert/default-ca-service.d.ts.map +1 -1
  134. package/dist/types/naylence/fame/security/cert/default-certificate-manager.d.ts +33 -1
  135. package/dist/types/naylence/fame/security/cert/default-certificate-manager.d.ts.map +1 -1
  136. package/dist/types/naylence/fame/security/cert/index.d.ts +9 -1
  137. package/dist/types/naylence/fame/security/cert/index.d.ts.map +1 -1
  138. package/dist/types/naylence/fame/security/cert/internal-ca-service.d.ts +0 -3
  139. package/dist/types/naylence/fame/security/cert/internal-ca-service.d.ts.map +1 -1
  140. package/dist/types/naylence/fame/security/cert/node-ed25519-csr.d.ts +9 -0
  141. package/dist/types/naylence/fame/security/cert/node-ed25519-csr.d.ts.map +1 -0
  142. package/dist/types/naylence/fame/security/cert/oid-constants.d.ts +7 -0
  143. package/dist/types/naylence/fame/security/cert/oid-constants.d.ts.map +1 -0
  144. package/dist/types/naylence/fame/security/cert/trust-store/anchor-utils.d.ts +12 -0
  145. package/dist/types/naylence/fame/security/cert/trust-store/anchor-utils.d.ts.map +1 -0
  146. package/dist/types/naylence/fame/security/cert/trust-store/browser-trust-store-provider-factory.d.ts +29 -0
  147. package/dist/types/naylence/fame/security/cert/trust-store/browser-trust-store-provider-factory.d.ts.map +1 -0
  148. package/dist/types/naylence/fame/security/cert/trust-store/env-provider.d.ts +7 -0
  149. package/dist/types/naylence/fame/security/cert/trust-store/env-provider.d.ts.map +1 -0
  150. package/dist/types/naylence/fame/security/cert/trust-store/fame-ca-certs-parser.d.ts +9 -0
  151. package/dist/types/naylence/fame/security/cert/trust-store/fame-ca-certs-parser.d.ts.map +1 -0
  152. package/dist/types/naylence/fame/security/cert/trust-store/http-bundle-provider.d.ts +35 -0
  153. package/dist/types/naylence/fame/security/cert/trust-store/http-bundle-provider.d.ts.map +1 -0
  154. package/dist/types/naylence/fame/security/cert/trust-store/http-signed-bundle-provider.d.ts +2 -0
  155. package/dist/types/naylence/fame/security/cert/trust-store/http-signed-bundle-provider.d.ts.map +1 -0
  156. package/dist/types/naylence/fame/security/cert/trust-store/node-trust-store-provider-factory.d.ts +23 -0
  157. package/dist/types/naylence/fame/security/cert/trust-store/node-trust-store-provider-factory.d.ts.map +1 -0
  158. package/dist/types/naylence/fame/security/cert/trust-store/static-bundle-provider.d.ts +15 -0
  159. package/dist/types/naylence/fame/security/cert/trust-store/static-bundle-provider.d.ts.map +1 -0
  160. package/dist/types/naylence/fame/security/cert/trust-store/trust-store-provider-factory.d.ts +28 -0
  161. package/dist/types/naylence/fame/security/cert/trust-store/trust-store-provider-factory.d.ts.map +1 -0
  162. package/dist/types/naylence/fame/security/cert/trust-store/trust-store-provider.d.ts +43 -0
  163. package/dist/types/naylence/fame/security/cert/trust-store/trust-store-provider.d.ts.map +1 -0
  164. package/dist/types/naylence/fame/security/cert/util.d.ts.map +1 -1
  165. package/dist/types/naylence/fame/security/register-advanced-security-factories.d.ts.map +1 -1
  166. package/dist/types/naylence/fame/security/signing/eddsa-envelope-verifier-factory.d.ts.map +1 -1
  167. package/dist/types/naylence/fame/security/signing/eddsa-envelope-verifier.d.ts +5 -0
  168. package/dist/types/naylence/fame/security/signing/eddsa-envelope-verifier.d.ts.map +1 -1
  169. package/dist/types/version.d.ts +1 -1
  170. package/package.json +9 -6
@@ -0,0 +1,497 @@
1
+ import { sha256 } from "@noble/hashes/sha2.js";
2
+ import { anchorsToPem, computeSpkiSha256, normalizePem, pemChainToAnchors, toBase64Url, withComputedSpki, } from "./anchor-utils.js";
3
+ const DEFAULT_REFRESH_INTERVAL_MS = 86400000; // 24 hours
4
+ const MIN_REFRESH_INTERVAL_MS = 60000; // 1 minute
5
+ const consoleLogger = {
6
+ debug: (...args) => {
7
+ if (!isProductionEnvironment()) {
8
+ console.debug("[trust-bundle]", ...args);
9
+ }
10
+ },
11
+ warn: (...args) => {
12
+ console.warn("[trust-bundle]", ...args);
13
+ },
14
+ };
15
+ function isTruthyFlag(value) {
16
+ if (typeof value === "boolean") {
17
+ return value;
18
+ }
19
+ if (typeof value === "string") {
20
+ const normalized = value.trim().toLowerCase();
21
+ if (!normalized) {
22
+ return false;
23
+ }
24
+ return normalized !== "false" && normalized !== "0";
25
+ }
26
+ return false;
27
+ }
28
+ function isCacheDisabled() {
29
+ if (isNodeEnvironment() && typeof process !== "undefined") {
30
+ const flag = process.env?.NAYLENCE_TRUST_BUNDLE_DISABLE_CACHE;
31
+ if (flag !== undefined) {
32
+ return isTruthyFlag(flag);
33
+ }
34
+ }
35
+ if (typeof globalThis !== "undefined") {
36
+ const globalFlag = globalThis.NAYLENCE_TRUST_BUNDLE_DISABLE_CACHE;
37
+ if (globalFlag !== undefined) {
38
+ return isTruthyFlag(globalFlag);
39
+ }
40
+ }
41
+ return false;
42
+ }
43
+ export class HttpBundleProvider {
44
+ constructor(options) {
45
+ this.lastFetched = 0;
46
+ this.etag = null;
47
+ this.lastKnownHash = null;
48
+ this.version = null;
49
+ this.anchors = null;
50
+ this.inflight = null;
51
+ this.listeners = new Set();
52
+ this.initialized = false;
53
+ this.pemChain = null;
54
+ if (!options.url) {
55
+ throw new Error("HTTP trust bundle requires a URL");
56
+ }
57
+ const parsed = new URL(options.url);
58
+ const allowInsecureEnv = isTruthyFlag(getGlobalFlag("FAME_TRUST_BUNDLE_ALLOW_HTTP"));
59
+ const allowInsecureOption = options.allowInsecureHttp === true;
60
+ this.allowInsecureHttp = allowInsecureEnv || allowInsecureOption;
61
+ if (parsed.protocol !== "https:") {
62
+ const isLoopbackHost = isLoopbackHostname(parsed.hostname);
63
+ const devMode = !isProductionEnvironment();
64
+ if (!(this.allowInsecureHttp && devMode && isLoopbackHost)) {
65
+ throw new Error("Trust bundle URL must use HTTPS (set allowInsecureHttp or FAME_TRUST_BUNDLE_ALLOW_HTTP for dev-only http)");
66
+ }
67
+ consoleLogger.warn("Allowing insecure trust bundle URL", {
68
+ url: parsed.toString(),
69
+ devMode,
70
+ isLoopbackHost,
71
+ });
72
+ }
73
+ this.url = parsed;
74
+ this.refreshIntervalMs = normalizeRefreshInterval(options.refreshIntervalMs);
75
+ this.hashPins = normalizeHashPins(options.hashPins);
76
+ this.allowedSpkis = normalizeAllowedSpkis(options.allowedSpkis);
77
+ this.allowTofu = options.allowTofu === true;
78
+ this.enforceBrowserPins = options.enforcePinsInBrowser !== false;
79
+ this.cacheKey =
80
+ options.cacheKey ?? computeCacheKey(`${parsed.origin}${parsed.pathname}`);
81
+ if (isBrowserEnvironment() && !this.allowTofu && this.enforceBrowserPins) {
82
+ if (this.hashPins.length === 0 && this.allowedSpkis.length === 0) {
83
+ throw new Error("Browser environments require hash pin, SPKI allowlist, or TOFU");
84
+ }
85
+ }
86
+ }
87
+ async getRoots() {
88
+ if (!this.initialized) {
89
+ await this.initialize();
90
+ }
91
+ if (this.inflight) {
92
+ return this.inflight;
93
+ }
94
+ const now = Date.now();
95
+ const stale = now - this.lastFetched >= this.refreshIntervalMs;
96
+ if (stale || !this.anchors) {
97
+ this.inflight = this.fetchLatest()
98
+ .catch((error) => {
99
+ consoleLogger.warn("Trust bundle refresh failed", error);
100
+ if (this.anchors) {
101
+ return this.anchors;
102
+ }
103
+ throw error;
104
+ })
105
+ .finally(() => {
106
+ this.inflight = null;
107
+ });
108
+ return this.inflight;
109
+ }
110
+ return this.anchors;
111
+ }
112
+ async getTrustStorePem() {
113
+ const anchors = await this.getRoots();
114
+ if (!anchors || anchors.length === 0) {
115
+ throw new Error("Trust bundle does not contain any certificates");
116
+ }
117
+ if (!this.pemChain || this.pemChain.trim().length === 0) {
118
+ this.pemChain = anchorsToPem(anchors);
119
+ }
120
+ if (!this.pemChain) {
121
+ throw new Error("Trust bundle PEM resolution failed");
122
+ }
123
+ return this.pemChain;
124
+ }
125
+ onUpdate(callback) {
126
+ this.listeners.add(callback);
127
+ return () => {
128
+ this.listeners.delete(callback);
129
+ };
130
+ }
131
+ async initialize() {
132
+ if (this.initialized) {
133
+ return;
134
+ }
135
+ try {
136
+ const cached = await loadCache(this.cacheKey);
137
+ if (cached) {
138
+ this.applyCachedEntry(cached);
139
+ consoleLogger.debug("Loaded trust bundle from cache", {
140
+ url: this.url.href,
141
+ anchorCount: cached.anchors.length,
142
+ });
143
+ }
144
+ }
145
+ catch (error) {
146
+ consoleLogger.warn("Failed to load cached trust bundle", error);
147
+ }
148
+ this.initialized = true;
149
+ }
150
+ applyCachedEntry(entry) {
151
+ this.anchors = withComputedSpki(entry.anchors);
152
+ this.etag = entry.etag;
153
+ this.lastFetched = entry.fetchedAt;
154
+ this.lastKnownHash = entry.hash;
155
+ this.version = entry.version;
156
+ this.pemChain = this.anchors ? anchorsToPem(this.anchors) : null;
157
+ }
158
+ async fetchLatest() {
159
+ const headers = {
160
+ "Accept": "application/json, application/pem-certificate-chain, text/plain",
161
+ };
162
+ if (this.etag) {
163
+ headers["If-None-Match"] = this.etag;
164
+ }
165
+ const response = await fetch(this.url, {
166
+ method: "GET",
167
+ headers,
168
+ cache: "no-store",
169
+ });
170
+ if (response.status === 304 && this.anchors) {
171
+ this.lastFetched = Date.now();
172
+ return this.anchors;
173
+ }
174
+ if (!response.ok) {
175
+ throw new Error(`Failed to download trust bundle: ${response.status} ${response.statusText}`);
176
+ }
177
+ const arrayBuffer = await response.arrayBuffer();
178
+ const payload = new Uint8Array(arrayBuffer);
179
+ const hash = computeHash(payload);
180
+ const pins = this.hashPins.length > 0 ? this.hashPins : null;
181
+ if (pins && !pins.includes(hash)) {
182
+ throw new Error("Trust bundle hash mismatch");
183
+ }
184
+ let expectedHash = pins ? hash : null;
185
+ if (!pins) {
186
+ if (this.lastKnownHash) {
187
+ if (this.lastKnownHash !== hash) {
188
+ throw new Error("Trust bundle hash changed without pin");
189
+ }
190
+ expectedHash = hash;
191
+ }
192
+ else if (this.allowTofu) {
193
+ expectedHash = hash;
194
+ }
195
+ else if (isBrowserEnvironment() && this.enforceBrowserPins) {
196
+ throw new Error("Browser download without pins or TOFU is blocked");
197
+ }
198
+ }
199
+ const bundle = parseBundlePayload(payload, this.url.href);
200
+ if (bundle.version !== null && this.version !== null) {
201
+ if (bundle.version < this.version) {
202
+ throw new Error("Trust bundle downgrade detected");
203
+ }
204
+ }
205
+ if (this.allowedSpkis.length > 0) {
206
+ enforceSpkiAllowlist(bundle.anchors, this.allowedSpkis);
207
+ }
208
+ const etagHeader = response.headers.get("etag");
209
+ this.anchors = withComputedSpki(bundle.anchors);
210
+ this.etag = etagHeader;
211
+ this.lastFetched = Date.now();
212
+ this.lastKnownHash = expectedHash;
213
+ this.version = bundle.version;
214
+ this.pemChain = anchorsToPem(this.anchors);
215
+ const cacheEntry = {
216
+ anchors: this.anchors,
217
+ etag: this.etag,
218
+ fetchedAt: this.lastFetched,
219
+ hash: this.lastKnownHash,
220
+ version: this.version,
221
+ };
222
+ await saveCache(this.cacheKey, cacheEntry);
223
+ this.notifyListeners();
224
+ return this.anchors;
225
+ }
226
+ notifyListeners() {
227
+ for (const callback of this.listeners) {
228
+ try {
229
+ callback();
230
+ }
231
+ catch (error) {
232
+ consoleLogger.warn("Trust bundle listener failed", error);
233
+ }
234
+ }
235
+ }
236
+ }
237
+ function getGlobalFlag(name) {
238
+ if (typeof process !== "undefined" && process.env) {
239
+ const envValue = process.env[name];
240
+ if (envValue !== undefined) {
241
+ return envValue;
242
+ }
243
+ }
244
+ if (typeof globalThis !== "undefined") {
245
+ return globalThis[name];
246
+ }
247
+ return undefined;
248
+ }
249
+ function isLoopbackHostname(hostname) {
250
+ if (hostname === "localhost" || hostname === "[::1]") {
251
+ return true;
252
+ }
253
+ if (/^127(?:\.\d{1,3}){3}$/.test(hostname)) {
254
+ return true;
255
+ }
256
+ return false;
257
+ }
258
+ function parseBundlePayload(payload, sourceUrl) {
259
+ const text = bytesToUtf8(payload);
260
+ const trimmed = text.trim();
261
+ if (trimmed.startsWith("{")) {
262
+ const parsed = JSON.parse(trimmed);
263
+ const version = typeof parsed.version === "number" ? parsed.version : null;
264
+ const roots = Array.isArray(parsed.roots) ? parsed.roots : [];
265
+ const anchors = roots
266
+ .map((root) => {
267
+ const record = root;
268
+ const pem = normalizePem(String(record.pem ?? ""));
269
+ if (!pem) {
270
+ return null;
271
+ }
272
+ const anchor = {
273
+ pem,
274
+ ...(typeof record.kid === "string" ? { kid: record.kid } : {}),
275
+ ...(typeof record.validUntil === "string"
276
+ ? { notAfter: record.validUntil }
277
+ : {}),
278
+ ...(typeof record.notBefore === "string"
279
+ ? { notBefore: record.notBefore }
280
+ : {}),
281
+ };
282
+ return anchor;
283
+ })
284
+ .filter((anchor) => anchor !== null);
285
+ if (anchors.length === 0) {
286
+ throw new Error("Trust bundle JSON does not contain any roots");
287
+ }
288
+ return { anchors, version };
289
+ }
290
+ if (trimmed.includes("-----BEGIN")) {
291
+ return { anchors: pemChainToAnchors(trimmed), version: null };
292
+ }
293
+ throw new Error(`Unsupported trust bundle format from ${sourceUrl}`);
294
+ }
295
+ function enforceSpkiAllowlist(anchors, allowlist) {
296
+ const missing = [];
297
+ for (const anchor of anchors) {
298
+ const spki = anchor.spkiSha256 ?? computeSpkiSha256(anchor.pem);
299
+ if (!spki || !allowlist.includes(spki)) {
300
+ missing.push(anchor.kid ?? spki ?? "unknown");
301
+ }
302
+ }
303
+ if (missing.length > 0) {
304
+ throw new Error(`Trust bundle contains roots not present in SPKI allowlist: ${missing.join(",")}`);
305
+ }
306
+ }
307
+ function normalizeHashPins(pins) {
308
+ if (!pins || pins.length === 0) {
309
+ return [];
310
+ }
311
+ return pins
312
+ .map((pin) => pin.trim())
313
+ .filter((pin) => pin.length > 0)
314
+ .map((pin) => {
315
+ if (/^[0-9a-fA-F]{64}$/u.test(pin)) {
316
+ return hexToBase64Url(pin);
317
+ }
318
+ return pin;
319
+ });
320
+ }
321
+ function normalizeAllowedSpkis(entries) {
322
+ if (!entries || entries.length === 0) {
323
+ return [];
324
+ }
325
+ return entries.map((entry) => entry.trim()).filter((entry) => entry.length);
326
+ }
327
+ function normalizeRefreshInterval(value) {
328
+ if (typeof value !== "number" || Number.isNaN(value) || value <= 0) {
329
+ return DEFAULT_REFRESH_INTERVAL_MS;
330
+ }
331
+ return Math.max(MIN_REFRESH_INTERVAL_MS, Math.floor(value));
332
+ }
333
+ function computeHash(payload) {
334
+ const digest = sha256(payload);
335
+ return toBase64Url(digest);
336
+ }
337
+ function hexToBase64Url(hex) {
338
+ const bytes = new Uint8Array(hex.length / 2);
339
+ for (let index = 0; index < bytes.length; index += 1) {
340
+ bytes[index] = parseInt(hex.slice(index * 2, index * 2 + 2), 16);
341
+ }
342
+ return toBase64Url(bytes);
343
+ }
344
+ function bytesToUtf8(data) {
345
+ if (typeof TextDecoder !== "undefined") {
346
+ return new TextDecoder().decode(data);
347
+ }
348
+ if (typeof Buffer !== "undefined") {
349
+ return Buffer.from(data).toString("utf8");
350
+ }
351
+ return String.fromCharCode(...Array.from(data));
352
+ }
353
+ function computeCacheKey(value) {
354
+ const digest = sha256(new TextEncoder().encode(value));
355
+ return Array.from(digest)
356
+ .map((byte) => byte.toString(16).padStart(2, "0"))
357
+ .join("");
358
+ }
359
+ async function loadCache(key) {
360
+ if (isCacheDisabled()) {
361
+ return null;
362
+ }
363
+ if (isNodeEnvironment()) {
364
+ return loadCacheFromFile(key);
365
+ }
366
+ return loadCacheFromBrowser(key);
367
+ }
368
+ async function saveCache(key, entry) {
369
+ if (isCacheDisabled()) {
370
+ return;
371
+ }
372
+ if (isNodeEnvironment()) {
373
+ await saveCacheToFile(key, entry);
374
+ }
375
+ else {
376
+ await saveCacheToBrowser(key, entry);
377
+ }
378
+ }
379
+ async function loadCacheFromFile(key) {
380
+ try {
381
+ const { default: path } = await import("node:path");
382
+ const fs = await import("node:fs/promises");
383
+ const os = await import("node:os");
384
+ const dir = path.join(os.homedir(), ".naylence", "trust-bundles");
385
+ const filePath = path.join(dir, `${key}.json`);
386
+ const content = await fs.readFile(filePath, "utf8");
387
+ const parsed = JSON.parse(content);
388
+ return parsed;
389
+ }
390
+ catch (error) {
391
+ if (error?.code === "ENOENT") {
392
+ return null;
393
+ }
394
+ throw error;
395
+ }
396
+ }
397
+ async function saveCacheToFile(key, entry) {
398
+ const { default: path } = await import("node:path");
399
+ const fs = await import("node:fs/promises");
400
+ const os = await import("node:os");
401
+ const dir = path.join(os.homedir(), ".naylence", "trust-bundles");
402
+ await fs.mkdir(dir, { recursive: true });
403
+ const filePath = path.join(dir, `${key}.json`);
404
+ const payload = JSON.stringify(entry, null, 2);
405
+ await fs.writeFile(filePath, payload, "utf8");
406
+ }
407
+ const BROWSER_CACHE_NAMESPACE = "naylence.trustBundles";
408
+ async function loadCacheFromBrowser(key) {
409
+ const store = await openBrowserStore();
410
+ if (!store) {
411
+ return null;
412
+ }
413
+ return store.get(key);
414
+ }
415
+ async function saveCacheToBrowser(key, entry) {
416
+ const store = await openBrowserStore();
417
+ if (!store) {
418
+ return;
419
+ }
420
+ await store.set(key, entry);
421
+ }
422
+ async function openBrowserStore() {
423
+ if (typeof indexedDB !== "undefined") {
424
+ return openIndexedDbStore();
425
+ }
426
+ if (typeof localStorage !== "undefined") {
427
+ return {
428
+ async get(key) {
429
+ const payload = localStorage.getItem(`${BROWSER_CACHE_NAMESPACE}:${key}`);
430
+ if (!payload) {
431
+ return null;
432
+ }
433
+ return JSON.parse(payload);
434
+ },
435
+ async set(key, value) {
436
+ localStorage.setItem(`${BROWSER_CACHE_NAMESPACE}:${key}`, JSON.stringify(value));
437
+ },
438
+ };
439
+ }
440
+ return null;
441
+ }
442
+ async function openIndexedDbStore() {
443
+ return new Promise((resolve) => {
444
+ const request = indexedDB.open("naylence_trust_bundles", 1);
445
+ request.onupgradeneeded = () => {
446
+ const db = request.result;
447
+ if (!db.objectStoreNames.contains("bundles")) {
448
+ db.createObjectStore("bundles");
449
+ }
450
+ };
451
+ request.onsuccess = () => {
452
+ const db = request.result;
453
+ resolve({
454
+ get: (key) => new Promise((storeResolve, storeReject) => {
455
+ const transaction = db.transaction("bundles", "readonly");
456
+ const store = transaction.objectStore("bundles");
457
+ const getRequest = store.get(key);
458
+ getRequest.onsuccess = () => {
459
+ storeResolve(getRequest.result ?? null);
460
+ };
461
+ getRequest.onerror = () => {
462
+ storeReject(getRequest.error ?? new Error("IndexedDB get failed"));
463
+ };
464
+ }),
465
+ set: (key, value) => new Promise((storeResolve, storeReject) => {
466
+ const transaction = db.transaction("bundles", "readwrite");
467
+ const store = transaction.objectStore("bundles");
468
+ const putRequest = store.put(value, key);
469
+ putRequest.onsuccess = () => {
470
+ storeResolve();
471
+ };
472
+ putRequest.onerror = () => {
473
+ storeReject(putRequest.error ?? new Error("IndexedDB put failed"));
474
+ };
475
+ }),
476
+ });
477
+ };
478
+ request.onerror = () => {
479
+ consoleLogger.warn("IndexedDB unavailable for trust bundle caching", request.error);
480
+ resolve(null);
481
+ };
482
+ });
483
+ }
484
+ function isBrowserEnvironment() {
485
+ return typeof window !== "undefined" && typeof window.document !== "undefined";
486
+ }
487
+ function isNodeEnvironment() {
488
+ return (typeof process !== "undefined" &&
489
+ typeof process.versions !== "undefined" &&
490
+ typeof process.versions.node === "string");
491
+ }
492
+ function isProductionEnvironment() {
493
+ return (typeof process !== "undefined" &&
494
+ typeof process.env !== "undefined" &&
495
+ process.env.NODE_ENV === "production");
496
+ }
497
+ //# sourceMappingURL=http-bundle-provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-bundle-provider.js","sourceRoot":"","sources":["../../../../../../../src/naylence/fame/security/cert/trust-store/http-bundle-provider.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export { HttpBundleProvider } from "./http-bundle-provider.js";
2
+ //# sourceMappingURL=http-signed-bundle-provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-signed-bundle-provider.js","sourceRoot":"","sources":["../../../../../../../src/naylence/fame/security/cert/trust-store/http-signed-bundle-provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC"}
@@ -0,0 +1,61 @@
1
+ import { TRUST_STORE_PROVIDER_FACTORY_BASE_TYPE, TrustStoreProviderFactory, } from "./trust-store-provider-factory.js";
2
+ import { createTrustStoreProviderFromEnv } from "./env-provider.js";
3
+ export const FACTORY_META = {
4
+ base: TRUST_STORE_PROVIDER_FACTORY_BASE_TYPE,
5
+ key: "EnvTrustStoreProvider",
6
+ isDefault: isNodeEnvironment(),
7
+ priority: isNodeEnvironment() ? 100 : 0,
8
+ };
9
+ export class EnvTrustStoreProviderFactory extends TrustStoreProviderFactory {
10
+ constructor() {
11
+ super(...arguments);
12
+ this.type = "EnvTrustStoreProvider";
13
+ this.isDefault = FACTORY_META.isDefault;
14
+ this.priority = FACTORY_META.priority;
15
+ }
16
+ async create(config, ...factoryArgs) {
17
+ const normalizedConfig = this.normalizeConfig(config);
18
+ const dependencies = this.extractDependencies(factoryArgs);
19
+ const envOverride = normalizedConfig.env ?? dependencies?.env ?? null;
20
+ const requirePinsInBrowser = normalizedConfig.requirePinsInBrowser ?? false;
21
+ const provider = await createTrustStoreProviderFromEnv({
22
+ env: envOverride ?? undefined,
23
+ requirePinsInBrowser,
24
+ });
25
+ if (provider) {
26
+ return provider;
27
+ }
28
+ return this.createUnconfiguredProvider("Trust store is not configured. For Node.js, set FAME_CA_CERTS to a PEM string, a file path, a data URI, or an HTTPS URL.");
29
+ }
30
+ normalizeConfig(config) {
31
+ if (!config) {
32
+ return {
33
+ type: "EnvTrustStoreProvider",
34
+ };
35
+ }
36
+ if (config.type === "EnvTrustStoreProvider") {
37
+ return config;
38
+ }
39
+ return {
40
+ ...config,
41
+ type: "EnvTrustStoreProvider",
42
+ };
43
+ }
44
+ extractDependencies(factoryArgs) {
45
+ if (factoryArgs.length === 0) {
46
+ return null;
47
+ }
48
+ const candidate = factoryArgs[0];
49
+ if (candidate && typeof candidate === "object") {
50
+ return candidate;
51
+ }
52
+ return null;
53
+ }
54
+ }
55
+ function isNodeEnvironment() {
56
+ return (typeof process !== "undefined" &&
57
+ typeof process.versions !== "undefined" &&
58
+ typeof process.versions.node === "string");
59
+ }
60
+ export default EnvTrustStoreProviderFactory;
61
+ //# sourceMappingURL=node-trust-store-provider-factory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node-trust-store-provider-factory.js","sourceRoot":"","sources":["../../../../../../../src/naylence/fame/security/cert/trust-store/node-trust-store-provider-factory.ts"],"names":[],"mappings":"AACA,OAAO,EACL,sCAAsC,EACtC,yBAAyB,GAG1B,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EAAE,+BAA+B,EAAE,MAAM,mBAAmB,CAAC;AAQpE,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,IAAI,EAAE,sCAAsC;IAC5C,GAAG,EAAE,uBAAuB;IAC5B,SAAS,EAAE,iBAAiB,EAAE;IAC9B,QAAQ,EAAE,iBAAiB,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;CAC/B,CAAC;AAEX,MAAM,OAAO,4BAA6B,SAAQ,yBAAsD;IAAxG;;QACkB,SAAI,GAAG,uBAAuB,CAAC;QAC/B,cAAS,GAAG,YAAY,CAAC,SAAS,CAAC;QACnC,aAAQ,GAAG,YAAY,CAAC,QAAQ,CAAC;IA2DnD,CAAC;IAzDQ,KAAK,CAAC,MAAM,CACjB,MAAqE,EACrE,GAAG,WAAsB;QAEzB,MAAM,gBAAgB,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;QACtD,MAAM,YAAY,GAAG,IAAI,CAAC,mBAAmB,CAAC,WAAW,CAAC,CAAC;QAE3D,MAAM,WAAW,GAAG,gBAAgB,CAAC,GAAG,IAAI,YAAY,EAAE,GAAG,IAAI,IAAI,CAAC;QACtE,MAAM,oBAAoB,GAAG,gBAAgB,CAAC,oBAAoB,IAAI,KAAK,CAAC;QAE5E,MAAM,QAAQ,GAAG,MAAM,+BAA+B,CAAC;YACrD,GAAG,EAAE,WAAW,IAAI,SAAS;YAC7B,oBAAoB;SACrB,CAAC,CAAC;QAEH,IAAI,QAAQ,EAAE,CAAC;YACb,OAAO,QAAQ,CAAC;QAClB,CAAC;QAED,OAAO,IAAI,CAAC,0BAA0B,CACpC,0HAA0H,CAC3H,CAAC;IACJ,CAAC;IAEO,eAAe,CACrB,MAAqE;QAErE,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO;gBACL,IAAI,EAAE,uBAAuB;aAC9B,CAAC;QACJ,CAAC;QAED,IAAK,MAAsC,CAAC,IAAI,KAAK,uBAAuB,EAAE,CAAC;YAC7E,OAAO,MAAqC,CAAC;QAC/C,CAAC;QAED,OAAO;YACL,GAAG,MAAM;YACT,IAAI,EAAE,uBAAuB;SACC,CAAC;IACnC,CAAC;IAEO,mBAAmB,CACzB,WAA+B;QAE/B,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC7B,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,SAAS,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;QACjC,IAAI,SAAS,IAAI,OAAO,SAAS,KAAK,QAAQ,EAAE,CAAC;YAC/C,OAAO,SAA2C,CAAC;QACrD,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;CACF;AAED,SAAS,iBAAiB;IACxB,OAAO,CACL,OAAO,OAAO,KAAK,WAAW;QAC9B,OAAO,OAAO,CAAC,QAAQ,KAAK,WAAW;QACvC,OAAO,OAAO,CAAC,QAAQ,CAAC,IAAI,KAAK,QAAQ,CAC1C,CAAC;AACJ,CAAC;AAED,eAAe,4BAA4B,CAAC"}
@@ -0,0 +1,44 @@
1
+ import { anchorsToPem, normalizePem, pemChainToAnchors, withComputedSpki, dataUriToPem, } from "./anchor-utils.js";
2
+ export class StaticBundleProvider {
3
+ constructor(anchors) {
4
+ const normalized = Array.from(anchors).map((anchor) => ({
5
+ ...anchor,
6
+ pem: normalizePem(anchor.pem),
7
+ }));
8
+ this.anchors = withComputedSpki(normalized);
9
+ this.pemChain = anchorsToPem(this.anchors);
10
+ }
11
+ async getRoots() {
12
+ return this.anchors;
13
+ }
14
+ async getTrustStorePem() {
15
+ if (!this.pemChain || this.pemChain.trim().length === 0) {
16
+ throw new Error("Static trust bundle is empty");
17
+ }
18
+ return this.pemChain;
19
+ }
20
+ }
21
+ export async function loadPemFromFile(path) {
22
+ if (!isNodeEnvironment()) {
23
+ throw new Error("File-based trust bundles are only supported in Node environments");
24
+ }
25
+ const fs = await import("node:fs/promises");
26
+ const contents = await fs.readFile(path, "utf8");
27
+ return normalizePem(contents);
28
+ }
29
+ export function createProviderFromPem(pem) {
30
+ return new StaticBundleProvider(pemChainToAnchors(pem));
31
+ }
32
+ export function createProviderFromDataUri(dataUri) {
33
+ const pem = dataUriToPem(dataUri);
34
+ if (!pem) {
35
+ throw new Error("Invalid data URI for trust bundle");
36
+ }
37
+ return createProviderFromPem(pem);
38
+ }
39
+ function isNodeEnvironment() {
40
+ return (typeof process !== "undefined" &&
41
+ typeof process.versions !== "undefined" &&
42
+ typeof process.versions.node === "string");
43
+ }
44
+ //# sourceMappingURL=static-bundle-provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"static-bundle-provider.js","sourceRoot":"","sources":["../../../../../../../src/naylence/fame/security/cert/trust-store/static-bundle-provider.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EACZ,YAAY,EACZ,iBAAiB,EACjB,gBAAgB,EAChB,YAAY,GACb,MAAM,mBAAmB,CAAC;AAO3B,MAAM,OAAO,oBAAoB;IAI/B,YAAmB,OAA8B;QAC/C,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;YACtD,GAAG,MAAM;YACT,GAAG,EAAE,YAAY,CAAC,MAAM,CAAC,GAAG,CAAC;SAC9B,CAAC,CAAC,CAAC;QACJ,IAAI,CAAC,OAAO,GAAG,gBAAgB,CAAC,UAAU,CAAC,CAAC;QAC5C,IAAI,CAAC,QAAQ,GAAG,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC7C,CAAC;IAEM,KAAK,CAAC,QAAQ;QACnB,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IAEM,KAAK,CAAC,gBAAgB;QAC3B,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxD,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;QAClD,CAAC;QACD,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;CACF;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,IAAY;IAChD,IAAI,CAAC,iBAAiB,EAAE,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CAAC,kEAAkE,CAAC,CAAC;IACtF,CAAC;IAED,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,CAAC;IAC5C,MAAM,QAAQ,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACjD,OAAO,YAAY,CAAC,QAAQ,CAAC,CAAC;AAChC,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,GAAW;IAC/C,OAAO,IAAI,oBAAoB,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC;AAC1D,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,OAAe;IACvD,MAAM,GAAG,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;IAClC,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;IACvD,CAAC;IACD,OAAO,qBAAqB,CAAC,GAAG,CAAC,CAAC;AACpC,CAAC;AAED,SAAS,iBAAiB;IACxB,OAAO,CACL,OAAO,OAAO,KAAK,WAAW;QAC9B,OAAO,OAAO,CAAC,QAAQ,KAAK,WAAW;QACvC,OAAO,OAAO,CAAC,QAAQ,CAAC,IAAI,KAAK,QAAQ,CAC1C,CAAC;AACJ,CAAC"}