@c9up/transit 0.1.0

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 (183) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +191 -0
  3. package/dist/Oauth1Driver.d.ts +68 -0
  4. package/dist/Oauth1Driver.d.ts.map +1 -0
  5. package/dist/Oauth1Driver.js +148 -0
  6. package/dist/Oauth1Driver.js.map +1 -0
  7. package/dist/Oauth2Driver.d.ts +89 -0
  8. package/dist/Oauth2Driver.d.ts.map +1 -0
  9. package/dist/Oauth2Driver.js +196 -0
  10. package/dist/Oauth2Driver.js.map +1 -0
  11. package/dist/TransitManager.d.ts +59 -0
  12. package/dist/TransitManager.d.ts.map +1 -0
  13. package/dist/TransitManager.js +100 -0
  14. package/dist/TransitManager.js.map +1 -0
  15. package/dist/TransitProvider.d.ts +26 -0
  16. package/dist/TransitProvider.d.ts.map +1 -0
  17. package/dist/TransitProvider.js +32 -0
  18. package/dist/TransitProvider.js.map +1 -0
  19. package/dist/apple.d.ts +45 -0
  20. package/dist/apple.d.ts.map +1 -0
  21. package/dist/apple.js +80 -0
  22. package/dist/apple.js.map +1 -0
  23. package/dist/ber.d.ts +50 -0
  24. package/dist/ber.d.ts.map +1 -0
  25. package/dist/ber.js +156 -0
  26. package/dist/ber.js.map +1 -0
  27. package/dist/c14n.d.ts +38 -0
  28. package/dist/c14n.d.ts.map +1 -0
  29. package/dist/c14n.js +129 -0
  30. package/dist/c14n.js.map +1 -0
  31. package/dist/config.d.ts +115 -0
  32. package/dist/config.d.ts.map +1 -0
  33. package/dist/config.js +146 -0
  34. package/dist/config.js.map +1 -0
  35. package/dist/configure.d.ts +18 -0
  36. package/dist/configure.d.ts.map +1 -0
  37. package/dist/configure.js +33 -0
  38. package/dist/configure.js.map +1 -0
  39. package/dist/drivers/AppleDriver.d.ts +36 -0
  40. package/dist/drivers/AppleDriver.d.ts.map +1 -0
  41. package/dist/drivers/AppleDriver.js +58 -0
  42. package/dist/drivers/AppleDriver.js.map +1 -0
  43. package/dist/drivers/DiscordDriver.d.ts +15 -0
  44. package/dist/drivers/DiscordDriver.d.ts.map +1 -0
  45. package/dist/drivers/DiscordDriver.js +45 -0
  46. package/dist/drivers/DiscordDriver.js.map +1 -0
  47. package/dist/drivers/FacebookDriver.d.ts +15 -0
  48. package/dist/drivers/FacebookDriver.d.ts.map +1 -0
  49. package/dist/drivers/FacebookDriver.js +47 -0
  50. package/dist/drivers/FacebookDriver.js.map +1 -0
  51. package/dist/drivers/GitHubDriver.d.ts +33 -0
  52. package/dist/drivers/GitHubDriver.d.ts.map +1 -0
  53. package/dist/drivers/GitHubDriver.js +72 -0
  54. package/dist/drivers/GitHubDriver.js.map +1 -0
  55. package/dist/drivers/GoogleDriver.d.ts +16 -0
  56. package/dist/drivers/GoogleDriver.d.ts.map +1 -0
  57. package/dist/drivers/GoogleDriver.js +31 -0
  58. package/dist/drivers/GoogleDriver.js.map +1 -0
  59. package/dist/drivers/LdapDirectory.d.ts +51 -0
  60. package/dist/drivers/LdapDirectory.d.ts.map +1 -0
  61. package/dist/drivers/LdapDirectory.js +127 -0
  62. package/dist/drivers/LdapDirectory.js.map +1 -0
  63. package/dist/drivers/LinkedInDriver.d.ts +29 -0
  64. package/dist/drivers/LinkedInDriver.d.ts.map +1 -0
  65. package/dist/drivers/LinkedInDriver.js +97 -0
  66. package/dist/drivers/LinkedInDriver.js.map +1 -0
  67. package/dist/drivers/LinkedInOpenidConnectDriver.d.ts +17 -0
  68. package/dist/drivers/LinkedInOpenidConnectDriver.d.ts.map +1 -0
  69. package/dist/drivers/LinkedInOpenidConnectDriver.js +27 -0
  70. package/dist/drivers/LinkedInOpenidConnectDriver.js.map +1 -0
  71. package/dist/drivers/OidcDriver.d.ts +64 -0
  72. package/dist/drivers/OidcDriver.d.ts.map +1 -0
  73. package/dist/drivers/OidcDriver.js +259 -0
  74. package/dist/drivers/OidcDriver.js.map +1 -0
  75. package/dist/drivers/SamlDriver.d.ts +66 -0
  76. package/dist/drivers/SamlDriver.d.ts.map +1 -0
  77. package/dist/drivers/SamlDriver.js +228 -0
  78. package/dist/drivers/SamlDriver.js.map +1 -0
  79. package/dist/drivers/SpotifyDriver.d.ts +16 -0
  80. package/dist/drivers/SpotifyDriver.d.ts.map +1 -0
  81. package/dist/drivers/SpotifyDriver.js +34 -0
  82. package/dist/drivers/SpotifyDriver.js.map +1 -0
  83. package/dist/drivers/TwitterDriver.d.ts +21 -0
  84. package/dist/drivers/TwitterDriver.d.ts.map +1 -0
  85. package/dist/drivers/TwitterDriver.js +46 -0
  86. package/dist/drivers/TwitterDriver.js.map +1 -0
  87. package/dist/drivers/TwitterXDriver.d.ts +22 -0
  88. package/dist/drivers/TwitterXDriver.d.ts.map +1 -0
  89. package/dist/drivers/TwitterXDriver.js +47 -0
  90. package/dist/drivers/TwitterXDriver.js.map +1 -0
  91. package/dist/dsig.d.ts +51 -0
  92. package/dist/dsig.d.ts.map +1 -0
  93. package/dist/dsig.js +273 -0
  94. package/dist/dsig.js.map +1 -0
  95. package/dist/index.d.ts +38 -0
  96. package/dist/index.d.ts.map +1 -0
  97. package/dist/index.js +33 -0
  98. package/dist/index.js.map +1 -0
  99. package/dist/jwt.d.ts +135 -0
  100. package/dist/jwt.d.ts.map +1 -0
  101. package/dist/jwt.js +167 -0
  102. package/dist/jwt.js.map +1 -0
  103. package/dist/ldap.d.ts +82 -0
  104. package/dist/ldap.d.ts.map +1 -0
  105. package/dist/ldap.js +271 -0
  106. package/dist/ldap.js.map +1 -0
  107. package/dist/nodeEnv.d.ts +17 -0
  108. package/dist/nodeEnv.d.ts.map +1 -0
  109. package/dist/nodeEnv.js +33 -0
  110. package/dist/nodeEnv.js.map +1 -0
  111. package/dist/oauth1.d.ts +68 -0
  112. package/dist/oauth1.d.ts.map +1 -0
  113. package/dist/oauth1.js +106 -0
  114. package/dist/oauth1.js.map +1 -0
  115. package/dist/oidc.d.ts +61 -0
  116. package/dist/oidc.d.ts.map +1 -0
  117. package/dist/oidc.js +151 -0
  118. package/dist/oidc.js.map +1 -0
  119. package/dist/quasar.d.ts +14 -0
  120. package/dist/quasar.d.ts.map +1 -0
  121. package/dist/quasar.js +42 -0
  122. package/dist/quasar.js.map +1 -0
  123. package/dist/replay.d.ts +70 -0
  124. package/dist/replay.d.ts.map +1 -0
  125. package/dist/replay.js +82 -0
  126. package/dist/replay.js.map +1 -0
  127. package/dist/saml.d.ts +68 -0
  128. package/dist/saml.d.ts.map +1 -0
  129. package/dist/saml.js +181 -0
  130. package/dist/saml.js.map +1 -0
  131. package/dist/services/main.d.ts +22 -0
  132. package/dist/services/main.d.ts.map +1 -0
  133. package/dist/services/main.js +39 -0
  134. package/dist/services/main.js.map +1 -0
  135. package/dist/testing/FakeTransit.d.ts +82 -0
  136. package/dist/testing/FakeTransit.d.ts.map +1 -0
  137. package/dist/testing/FakeTransit.js +160 -0
  138. package/dist/testing/FakeTransit.js.map +1 -0
  139. package/dist/types.d.ts +118 -0
  140. package/dist/types.d.ts.map +1 -0
  141. package/dist/types.js +27 -0
  142. package/dist/types.js.map +1 -0
  143. package/dist/xml.d.ts +72 -0
  144. package/dist/xml.d.ts.map +1 -0
  145. package/dist/xml.js +353 -0
  146. package/dist/xml.js.map +1 -0
  147. package/package.json +73 -0
  148. package/src/Oauth1Driver.ts +216 -0
  149. package/src/Oauth2Driver.ts +271 -0
  150. package/src/TransitManager.ts +145 -0
  151. package/src/TransitProvider.ts +51 -0
  152. package/src/apple.ts +101 -0
  153. package/src/ber.ts +175 -0
  154. package/src/c14n.ts +187 -0
  155. package/src/config.ts +160 -0
  156. package/src/configure.ts +47 -0
  157. package/src/drivers/AppleDriver.ts +69 -0
  158. package/src/drivers/DiscordDriver.ts +50 -0
  159. package/src/drivers/FacebookDriver.ts +53 -0
  160. package/src/drivers/GitHubDriver.ts +91 -0
  161. package/src/drivers/GoogleDriver.ts +38 -0
  162. package/src/drivers/LdapDirectory.ts +185 -0
  163. package/src/drivers/LinkedInDriver.ts +105 -0
  164. package/src/drivers/LinkedInOpenidConnectDriver.ts +33 -0
  165. package/src/drivers/OidcDriver.ts +379 -0
  166. package/src/drivers/SamlDriver.ts +326 -0
  167. package/src/drivers/SpotifyDriver.ts +38 -0
  168. package/src/drivers/TwitterDriver.ts +55 -0
  169. package/src/drivers/TwitterXDriver.ts +53 -0
  170. package/src/dsig.ts +405 -0
  171. package/src/index.ts +85 -0
  172. package/src/jwt.ts +263 -0
  173. package/src/ldap.ts +374 -0
  174. package/src/nodeEnv.ts +31 -0
  175. package/src/oauth1.ts +144 -0
  176. package/src/oidc.ts +208 -0
  177. package/src/quasar.ts +64 -0
  178. package/src/replay.ts +136 -0
  179. package/src/saml.ts +309 -0
  180. package/src/services/main.ts +47 -0
  181. package/src/testing/FakeTransit.ts +233 -0
  182. package/src/types.ts +150 -0
  183. package/src/xml.ts +438 -0
package/dist/dsig.js ADDED
@@ -0,0 +1,273 @@
1
+ /**
2
+ * XML Signature verification.
3
+ *
4
+ * The danger in XML-DSig is not the cryptography — it is that a signature can
5
+ * be perfectly valid over one part of a document while the application reads
6
+ * another. That is XML Signature Wrapping, and it has broken SAML
7
+ * implementations repeatedly. The mitigation is structural, not a check:
8
+ *
9
+ * **This returns the element the signature actually covers, and the caller
10
+ * must read that object. Never search the document again afterwards.**
11
+ *
12
+ * Everything else here exists to make that guarantee hold:
13
+ *
14
+ * - Exactly one reference. Several is not a shape a signed assertion needs,
15
+ * and it multiplies what "the signed element" could mean.
16
+ * - The reference must resolve to exactly ONE element. A second element
17
+ * carrying the same ID is the classic wrapping payload.
18
+ * - The signature must sit inside the element it signs. A signature that
19
+ * references a sibling is describing a document this refuses to reason
20
+ * about.
21
+ * - Only the enveloped-signature and exclusive-c14n transforms are accepted.
22
+ * XPath and XSLT transforms are a way to make the digest cover something
23
+ * other than the element, and XSLT is executable.
24
+ * - SHA-1 is refused. Collisions against it are practical, and a signature
25
+ * over attacker-influenced XML is exactly where that matters.
26
+ * - The key comes from the caller, from the provider's metadata. The
27
+ * certificate embedded in the document is checked against it, never
28
+ * trusted on its own: verifying a document against a key it carries is
29
+ * verifying it against itself.
30
+ */
31
+ import { createHash, verify as verifySignature, X509Certificate, } from "node:crypto";
32
+ import { canonicalize } from "./c14n.js";
33
+ import { childrenNamed, textOf, walk, } from "./xml.js";
34
+ export const DSIG_NS = "http://www.w3.org/2000/09/xmldsig#";
35
+ const EXC_C14N = "http://www.w3.org/2001/10/xml-exc-c14n#";
36
+ const EXC_C14N_COMMENTS = "http://www.w3.org/2001/10/xml-exc-c14n#WithComments";
37
+ const ENVELOPED = "http://www.w3.org/2000/09/xmldsig#enveloped-signature";
38
+ const EC_NS = "http://www.w3.org/2001/10/xml-exc-c14n#";
39
+ /** Digest algorithms, by their URI. SHA-1 is absent on purpose. */
40
+ const DIGESTS = {
41
+ "http://www.w3.org/2001/04/xmlenc#sha256": "sha256",
42
+ "http://www.w3.org/2001/04/xmldsig-more#sha384": "sha384",
43
+ "http://www.w3.org/2001/04/xmlenc#sha512": "sha512",
44
+ };
45
+ /** Signature algorithms, by their URI. SHA-1 is absent on purpose. */
46
+ const SIGNATURES = {
47
+ "http://www.w3.org/2001/04/xmldsig-more#rsa-sha256": {
48
+ hash: "sha256",
49
+ kind: "rsa",
50
+ },
51
+ "http://www.w3.org/2001/04/xmldsig-more#rsa-sha384": {
52
+ hash: "sha384",
53
+ kind: "rsa",
54
+ },
55
+ "http://www.w3.org/2001/04/xmldsig-more#rsa-sha512": {
56
+ hash: "sha512",
57
+ kind: "rsa",
58
+ },
59
+ "http://www.w3.org/2001/04/xmldsig-more#ecdsa-sha256": {
60
+ hash: "sha256",
61
+ kind: "ec",
62
+ },
63
+ "http://www.w3.org/2001/04/xmldsig-more#ecdsa-sha384": {
64
+ hash: "sha384",
65
+ kind: "ec",
66
+ },
67
+ "http://www.w3.org/2001/04/xmldsig-more#ecdsa-sha512": {
68
+ hash: "sha512",
69
+ kind: "ec",
70
+ },
71
+ };
72
+ export class SignatureError extends Error {
73
+ constructor(message) {
74
+ super(`[transit] ${message}`);
75
+ this.name = "SignatureError";
76
+ }
77
+ }
78
+ /**
79
+ * Verify one signature under `root`, and answer with the element it covers.
80
+ *
81
+ * Read the returned element. Reading anything found by searching the document
82
+ * afterwards throws the guarantee away.
83
+ */
84
+ export function verifyXmlSignature(root, options) {
85
+ const signatures = [...walk(root)].filter((element) => element.namespaceUri === DSIG_NS && element.local === "Signature");
86
+ if (signatures.length === 0) {
87
+ throw new SignatureError("the document carries no signature");
88
+ }
89
+ if (signatures.length > 1) {
90
+ // Which one covers what a reader will use is exactly the ambiguity
91
+ // wrapping attacks live in.
92
+ throw new SignatureError(`the document carries ${signatures.length} signatures, and this verifies documents with one`);
93
+ }
94
+ const signature = signatures[0];
95
+ const signedInfo = only(signature, "SignedInfo");
96
+ const method = only(signedInfo, "SignatureMethod").attributes.find((a) => a.local === "Algorithm")?.value;
97
+ const spec = method === undefined ? undefined : SIGNATURES[method];
98
+ if (spec === undefined) {
99
+ throw new SignatureError(`the signature uses '${method ?? "no algorithm"}', which this refuses. SHA-1 and the symmetric methods are not accepted.`);
100
+ }
101
+ const canonicalizationMethod = only(signedInfo, "CanonicalizationMethod").attributes.find((a) => a.local === "Algorithm")?.value;
102
+ if (canonicalizationMethod !== EXC_C14N &&
103
+ canonicalizationMethod !== EXC_C14N_COMMENTS) {
104
+ throw new SignatureError(`SignedInfo is canonicalized with '${canonicalizationMethod ?? "nothing"}', and this verifies exclusive canonicalization`);
105
+ }
106
+ // The signature is over SignedInfo, canonicalized. Everything the reference
107
+ // claims is only trustworthy once this holds.
108
+ const signedBytes = Buffer.from(canonicalize(signedInfo, {
109
+ withComments: canonicalizationMethod === EXC_C14N_COMMENTS,
110
+ }), "utf8");
111
+ const signatureValue = Buffer.from(textOf(only(signature, "SignatureValue")).replace(/\s+/g, ""), "base64");
112
+ const key = resolveKey(signature, options.certificates);
113
+ const holds = verifySignature(spec.hash, signedBytes, spec.kind === "ec" ? { key, dsaEncoding: "ieee-p1363" } : key, signatureValue);
114
+ if (!holds) {
115
+ throw new SignatureError("the signature does not verify");
116
+ }
117
+ return verifyReference(root, signature, signedInfo);
118
+ }
119
+ /**
120
+ * Check the digest, and answer with the element it was computed over.
121
+ *
122
+ * The element is resolved once, here, and handed back. That is the whole
123
+ * defence: a caller that uses this object cannot be reading a different part of
124
+ * the document than the one the signature covers.
125
+ */
126
+ function verifyReference(root, signature, signedInfo) {
127
+ const references = childrenNamed(signedInfo, DSIG_NS, "Reference");
128
+ if (references.length !== 1) {
129
+ throw new SignatureError(`SignedInfo carries ${references.length} references, and this verifies one`);
130
+ }
131
+ const reference = references[0];
132
+ const uri = reference.attributes.find((a) => a.local === "URI")?.value;
133
+ if (uri === undefined || !uri.startsWith("#") || uri.length < 2) {
134
+ throw new SignatureError(`the reference points at '${uri ?? "nothing"}', and this verifies a same-document '#id' reference`);
135
+ }
136
+ const id = uri.slice(1);
137
+ const matches = [...walk(root)].filter((element) => element.attributes.some((a) => a.namespaceUri === "" && isIdAttribute(a.local) && a.value === id));
138
+ if (matches.length === 0) {
139
+ throw new SignatureError(`the reference names '${id}', which is not in the document`);
140
+ }
141
+ if (matches.length > 1) {
142
+ // A second element carrying the signed element's ID is the classic
143
+ // wrapping payload: the signature stays valid, and a reader that looks
144
+ // the ID up finds the attacker's copy.
145
+ throw new SignatureError(`${matches.length} elements carry the id '${id}', which is how a signature gets pointed at the wrong one`);
146
+ }
147
+ const signed = matches[0];
148
+ if (!contains(signed, signature)) {
149
+ throw new SignatureError("the signature sits outside the element it references, which this refuses to reason about");
150
+ }
151
+ const { inclusivePrefixes, withComments } = readTransforms(reference, signature);
152
+ const digestMethod = only(reference, "DigestMethod").attributes.find((a) => a.local === "Algorithm")?.value;
153
+ const hash = digestMethod === undefined ? undefined : DIGESTS[digestMethod];
154
+ if (hash === undefined) {
155
+ throw new SignatureError(`the digest uses '${digestMethod ?? "no algorithm"}', which this refuses. SHA-1 is not accepted.`);
156
+ }
157
+ // The enveloped-signature transform: the element cannot carry a digest of
158
+ // itself, so the signature is left out of what is hashed.
159
+ const omit = new Set([signature]);
160
+ const digest = createHash(hash)
161
+ .update(canonicalize(signed, { inclusivePrefixes, withComments, omit }), "utf8")
162
+ .digest("base64");
163
+ const expected = textOf(only(reference, "DigestValue")).replace(/\s+/g, "");
164
+ if (digest !== expected) {
165
+ throw new SignatureError("the signed element does not match its digest — it was changed after signing");
166
+ }
167
+ return signed;
168
+ }
169
+ /** Which transforms the reference asks for, refusing the dangerous ones. */
170
+ function readTransforms(reference, signature) {
171
+ const container = childrenNamed(reference, DSIG_NS, "Transforms")[0];
172
+ const transforms = container
173
+ ? childrenNamed(container, DSIG_NS, "Transform")
174
+ : [];
175
+ let sawEnveloped = false;
176
+ let inclusivePrefixes = [];
177
+ let withComments = false;
178
+ for (const transform of transforms) {
179
+ const algorithm = transform.attributes.find((a) => a.local === "Algorithm")?.value;
180
+ if (algorithm === ENVELOPED) {
181
+ sawEnveloped = true;
182
+ continue;
183
+ }
184
+ if (algorithm === EXC_C14N || algorithm === EXC_C14N_COMMENTS) {
185
+ withComments = algorithm === EXC_C14N_COMMENTS;
186
+ const list = childrenNamed(transform, EC_NS, "InclusiveNamespaces")[0];
187
+ const prefixes = list?.attributes.find((a) => a.local === "PrefixList")?.value;
188
+ if (prefixes) {
189
+ inclusivePrefixes = prefixes.split(/\s+/).filter(Boolean);
190
+ }
191
+ continue;
192
+ }
193
+ // XPath and XSLT can make the digest cover something other than the
194
+ // element, and one of them is executable.
195
+ throw new SignatureError(`the reference asks for the transform '${algorithm ?? "(none)"}', which this refuses`);
196
+ }
197
+ if (!sawEnveloped && contains(signature.parent ?? signature, signature)) {
198
+ // A signature inside the element it signs has to be excluded from the
199
+ // digest, and the transform is how that is declared.
200
+ throw new SignatureError("the signature is inside the element it signs and does not declare the enveloped-signature transform");
201
+ }
202
+ return { inclusivePrefixes, withComments };
203
+ }
204
+ /**
205
+ * The key to verify with — the caller's, from the provider's metadata.
206
+ *
207
+ * When the document carries a certificate it must be one of them. That check
208
+ * gives a clear error instead of an opaque "does not verify" when a provider
209
+ * has rotated and the metadata has not been updated.
210
+ */
211
+ function resolveKey(signature, certificates) {
212
+ if (certificates.length === 0) {
213
+ throw new SignatureError("no certificate was supplied — the key has to come from the provider's metadata, never from the document itself");
214
+ }
215
+ const known = certificates.map(toCertificate);
216
+ const embedded = embeddedCertificate(signature);
217
+ if (embedded !== undefined) {
218
+ const match = known.find((cert) => cert.raw.equals(embedded.raw));
219
+ if (!match) {
220
+ throw new SignatureError("the document is signed with a certificate the provider's metadata does not list");
221
+ }
222
+ return match.publicKey;
223
+ }
224
+ // No certificate in the document: the metadata is all there is, which is
225
+ // the safer of the two cases.
226
+ return known[0].publicKey;
227
+ }
228
+ function embeddedCertificate(signature) {
229
+ for (const element of walk(signature)) {
230
+ if (element.namespaceUri === DSIG_NS &&
231
+ element.local === "X509Certificate") {
232
+ return toCertificate(textOf(element));
233
+ }
234
+ }
235
+ return undefined;
236
+ }
237
+ function toCertificate(value) {
238
+ const trimmed = value.trim();
239
+ const pem = trimmed.includes("BEGIN CERTIFICATE")
240
+ ? trimmed
241
+ : `-----BEGIN CERTIFICATE-----\n${trimmed.replace(/\s+/g, "").replace(/(.{64})/g, "$1\n")}\n-----END CERTIFICATE-----`;
242
+ try {
243
+ return new X509Certificate(pem);
244
+ }
245
+ catch {
246
+ throw new SignatureError("a certificate could not be read");
247
+ }
248
+ }
249
+ /** Exactly one child named `local`, or a clear refusal. */
250
+ function only(parent, local) {
251
+ const found = childrenNamed(parent, DSIG_NS, local);
252
+ if (found.length !== 1) {
253
+ throw new SignatureError(`expected one <${local}> under <${parent.local}>, and there are ${found.length}`);
254
+ }
255
+ return found[0];
256
+ }
257
+ /** Whether `descendant` sits inside `ancestor`, or is it. */
258
+ function contains(ancestor, descendant) {
259
+ for (let node = descendant; node !== undefined; node = node.parent) {
260
+ if (node === ancestor)
261
+ return true;
262
+ }
263
+ return false;
264
+ }
265
+ /**
266
+ * SAML identifies signed elements with `ID`; other dialects use `Id` or `id`.
267
+ * All three are accepted, and a document mixing them is what the
268
+ * duplicate check above catches.
269
+ */
270
+ function isIdAttribute(local) {
271
+ return local === "ID" || local === "Id" || local === "id";
272
+ }
273
+ //# sourceMappingURL=dsig.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dsig.js","sourceRoot":"","sources":["../src/dsig.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * @c9up/transit — federated sign-in for the Ream framework.
3
+ *
4
+ * Everything that lets a person prove who they are through an authority the
5
+ * application does not own. Today that is OAuth1 and OAuth2, and the providers
6
+ * that speak them.
7
+ */
8
+ export { type AppleKey, appleClientSecret, parseAppleUser } from "./apple.js";
9
+ export { type CanonicalizeOptions, canonicalize } from "./c14n.js";
10
+ export type { TransitConfig, TransitDriverFactory, TransitProviderEntry, } from "./config.js";
11
+ export { defineConfig, ldap, oidc, saml, socials } from "./config.js";
12
+ export { type AppleConfig, AppleDriver } from "./drivers/AppleDriver.js";
13
+ export { DiscordDriver } from "./drivers/DiscordDriver.js";
14
+ export { FacebookDriver } from "./drivers/FacebookDriver.js";
15
+ export { GitHubDriver } from "./drivers/GitHubDriver.js";
16
+ export { GoogleDriver } from "./drivers/GoogleDriver.js";
17
+ export { type LdapConfig, LdapDirectory } from "./drivers/LdapDirectory.js";
18
+ export { LinkedInDriver } from "./drivers/LinkedInDriver.js";
19
+ export { LinkedInOpenidConnectDriver } from "./drivers/LinkedInOpenidConnectDriver.js";
20
+ export { type OidcConfig, OidcDriver } from "./drivers/OidcDriver.js";
21
+ export { type SamlConfig, SamlDriver } from "./drivers/SamlDriver.js";
22
+ export { SpotifyDriver } from "./drivers/SpotifyDriver.js";
23
+ export { TwitterDriver } from "./drivers/TwitterDriver.js";
24
+ export { TwitterXDriver } from "./drivers/TwitterXDriver.js";
25
+ export type { IdTokenClaims, Jwk, SupportedAlg } from "./jwt.js";
26
+ export { LdapConnection, type LdapEntry, LdapError, type LdapFilter, type LdapOptions, } from "./ldap.js";
27
+ export { Oauth1Driver } from "./Oauth1Driver.js";
28
+ export { createCodeVerifier, Oauth2Driver } from "./Oauth2Driver.js";
29
+ export type { OidcMetadata, RemoteOptions } from "./oidc.js";
30
+ export { type AssertionReplayStore, MemoryAssertionReplayStore, RedisAssertionReplayStore, type ReplayRedisClient, type ReplayRedisResolver, replayStores, } from "./replay.js";
31
+ export { assertionInside, assertResponseSucceeded, SAML_ASSERTION_NS, SAML_PROTOCOL_NS, SamlError, type SamlExpectations, type SamlIdentity, validateAssertion, } from "./saml.js";
32
+ export { TransitManager } from "./TransitManager.js";
33
+ export type { TransitAppContext } from "./TransitProvider.js";
34
+ export { default as TransitProvider } from "./TransitProvider.js";
35
+ export type { DirectoryDriver, EmailVerificationState, OAuthConfig, OAuthToken, RedirectRequest, TransitDriver, TransitEntry, TransitUser, } from "./types.js";
36
+ export { assertOAuthState, isDirectory } from "./types.js";
37
+ export { childrenNamed, findByAttribute, parseXml, resolvePrefix, textOf, walk, XML_NS, type XmlAttribute, type XmlElement, type XmlNamespace, type XmlNode, } from "./xml.js";
38
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,KAAK,QAAQ,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC9E,OAAO,EAAE,KAAK,mBAAmB,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACnE,YAAY,EACX,aAAa,EACb,oBAAoB,EACpB,oBAAoB,GACpB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,YAAY,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AACtE,OAAO,EAAE,KAAK,WAAW,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACzE,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,KAAK,UAAU,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC5E,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAAE,2BAA2B,EAAE,MAAM,0CAA0C,CAAC;AACvF,OAAO,EAAE,KAAK,UAAU,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACtE,OAAO,EAAE,KAAK,UAAU,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACtE,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,YAAY,EAAE,aAAa,EAAE,GAAG,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AACjE,OAAO,EACN,cAAc,EACd,KAAK,SAAS,EACd,SAAS,EACT,KAAK,UAAU,EACf,KAAK,WAAW,GAChB,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACrE,YAAY,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC7D,OAAO,EACN,KAAK,oBAAoB,EACzB,0BAA0B,EAC1B,yBAAyB,EACzB,KAAK,iBAAiB,EACtB,KAAK,mBAAmB,EACxB,YAAY,GACZ,MAAM,aAAa,CAAC;AACrB,OAAO,EACN,eAAe,EACf,uBAAuB,EACvB,iBAAiB,EACjB,gBAAgB,EAChB,SAAS,EACT,KAAK,gBAAgB,EACrB,KAAK,YAAY,EACjB,iBAAiB,GACjB,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,YAAY,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAClE,YAAY,EACX,eAAe,EACf,sBAAsB,EACtB,WAAW,EACX,UAAU,EACV,eAAe,EACf,aAAa,EACb,YAAY,EACZ,WAAW,GACX,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC3D,OAAO,EACN,aAAa,EACb,eAAe,EACf,QAAQ,EACR,aAAa,EACb,MAAM,EACN,IAAI,EACJ,MAAM,EACN,KAAK,YAAY,EACjB,KAAK,UAAU,EACf,KAAK,YAAY,EACjB,KAAK,OAAO,GACZ,MAAM,UAAU,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,33 @@
1
+ /**
2
+ * @c9up/transit — federated sign-in for the Ream framework.
3
+ *
4
+ * Everything that lets a person prove who they are through an authority the
5
+ * application does not own. Today that is OAuth1 and OAuth2, and the providers
6
+ * that speak them.
7
+ */
8
+ export { appleClientSecret, parseAppleUser } from "./apple.js";
9
+ export { canonicalize } from "./c14n.js";
10
+ export { defineConfig, ldap, oidc, saml, socials } from "./config.js";
11
+ export { AppleDriver } from "./drivers/AppleDriver.js";
12
+ export { DiscordDriver } from "./drivers/DiscordDriver.js";
13
+ export { FacebookDriver } from "./drivers/FacebookDriver.js";
14
+ export { GitHubDriver } from "./drivers/GitHubDriver.js";
15
+ export { GoogleDriver } from "./drivers/GoogleDriver.js";
16
+ export { LdapDirectory } from "./drivers/LdapDirectory.js";
17
+ export { LinkedInDriver } from "./drivers/LinkedInDriver.js";
18
+ export { LinkedInOpenidConnectDriver } from "./drivers/LinkedInOpenidConnectDriver.js";
19
+ export { OidcDriver } from "./drivers/OidcDriver.js";
20
+ export { SamlDriver } from "./drivers/SamlDriver.js";
21
+ export { SpotifyDriver } from "./drivers/SpotifyDriver.js";
22
+ export { TwitterDriver } from "./drivers/TwitterDriver.js";
23
+ export { TwitterXDriver } from "./drivers/TwitterXDriver.js";
24
+ export { LdapConnection, LdapError, } from "./ldap.js";
25
+ export { Oauth1Driver } from "./Oauth1Driver.js";
26
+ export { createCodeVerifier, Oauth2Driver } from "./Oauth2Driver.js";
27
+ export { MemoryAssertionReplayStore, RedisAssertionReplayStore, replayStores, } from "./replay.js";
28
+ export { assertionInside, assertResponseSucceeded, SAML_ASSERTION_NS, SAML_PROTOCOL_NS, SamlError, validateAssertion, } from "./saml.js";
29
+ export { TransitManager } from "./TransitManager.js";
30
+ export { default as TransitProvider } from "./TransitProvider.js";
31
+ export { assertOAuthState, isDirectory } from "./types.js";
32
+ export { childrenNamed, findByAttribute, parseXml, resolvePrefix, textOf, walk, XML_NS, } from "./xml.js";
33
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAiB,iBAAiB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC9E,OAAO,EAA4B,YAAY,EAAE,MAAM,WAAW,CAAC;AAMnE,OAAO,EAAE,YAAY,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AACtE,OAAO,EAAoB,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACzE,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAmB,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC5E,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAAE,2BAA2B,EAAE,MAAM,0CAA0C,CAAC;AACvF,OAAO,EAAmB,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACtE,OAAO,EAAmB,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACtE,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAE7D,OAAO,EACN,cAAc,EAEd,SAAS,GAGT,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAErE,OAAO,EAEN,0BAA0B,EAC1B,yBAAyB,EAGzB,YAAY,GACZ,MAAM,aAAa,CAAC;AACrB,OAAO,EACN,eAAe,EACf,uBAAuB,EACvB,iBAAiB,EACjB,gBAAgB,EAChB,SAAS,EAGT,iBAAiB,GACjB,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAErD,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAWlE,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC3D,OAAO,EACN,aAAa,EACb,eAAe,EACf,QAAQ,EACR,aAAa,EACb,MAAM,EACN,IAAI,EACJ,MAAM,GAKN,MAAM,UAAU,CAAC"}
package/dist/jwt.d.ts ADDED
@@ -0,0 +1,135 @@
1
+ /**
2
+ * Verifying an OpenID Connect `id_token`.
3
+ *
4
+ * This is the file that decides whether a sign-in is genuine, so it is written
5
+ * to refuse rather than to accept. Three rules shape it:
6
+ *
7
+ * - The algorithm is chosen by US, never read from the token. A verifier that
8
+ * trusts the header's `alg` accepts `none`, and accepts an RS256 public key
9
+ * replayed as an HS256 shared secret — the two oldest JWT forgeries there
10
+ * are.
11
+ * - Every claim that binds the token to this exchange is checked: the issuer,
12
+ * the audience, the expiry, and the nonce. A token that is perfectly valid
13
+ * for somebody else is not valid here.
14
+ * - Nothing is decoded before the signature holds.
15
+ *
16
+ * No dependency: Node verifies RSA and EC against a JWK on its own.
17
+ */
18
+ /** A public key as a provider publishes it. */
19
+ export interface Jwk {
20
+ kty: string;
21
+ kid?: string;
22
+ alg?: string;
23
+ use?: string;
24
+ [key: string]: unknown;
25
+ }
26
+ export interface IdTokenClaims {
27
+ iss: string;
28
+ sub: string;
29
+ aud: string | string[];
30
+ exp: number;
31
+ iat?: number;
32
+ nonce?: string;
33
+ azp?: string;
34
+ [claim: string]: unknown;
35
+ }
36
+ /**
37
+ * The algorithms this verifies. Asymmetric only, and deliberately so: the
38
+ * symmetric family signs with the client secret, so anyone holding it — every
39
+ * copy of the config, every log line that leaked it — can mint a token for any
40
+ * user. `none` is not an algorithm.
41
+ */
42
+ declare const SUPPORTED: {
43
+ readonly RS256: {
44
+ readonly hash: "sha256";
45
+ readonly kind: "rsa";
46
+ readonly kty: "RSA";
47
+ };
48
+ readonly RS384: {
49
+ readonly hash: "sha384";
50
+ readonly kind: "rsa";
51
+ readonly kty: "RSA";
52
+ };
53
+ readonly RS512: {
54
+ readonly hash: "sha512";
55
+ readonly kind: "rsa";
56
+ readonly kty: "RSA";
57
+ };
58
+ readonly PS256: {
59
+ readonly hash: "sha256";
60
+ readonly kind: "rsa-pss";
61
+ readonly kty: "RSA";
62
+ };
63
+ readonly PS384: {
64
+ readonly hash: "sha384";
65
+ readonly kind: "rsa-pss";
66
+ readonly kty: "RSA";
67
+ };
68
+ readonly PS512: {
69
+ readonly hash: "sha512";
70
+ readonly kind: "rsa-pss";
71
+ readonly kty: "RSA";
72
+ };
73
+ readonly ES256: {
74
+ readonly hash: "sha256";
75
+ readonly kind: "ec";
76
+ readonly kty: "EC";
77
+ readonly crv: "P-256";
78
+ };
79
+ readonly ES384: {
80
+ readonly hash: "sha384";
81
+ readonly kind: "ec";
82
+ readonly kty: "EC";
83
+ readonly crv: "P-384";
84
+ };
85
+ readonly ES512: {
86
+ readonly hash: "sha512";
87
+ readonly kind: "ec";
88
+ readonly kty: "EC";
89
+ readonly crv: "P-521";
90
+ };
91
+ };
92
+ export type SupportedAlg = keyof typeof SUPPORTED;
93
+ export declare function isSupportedAlg(value: unknown): value is SupportedAlg;
94
+ /** The three parts of a compact JWS, still encoded. */
95
+ interface Parts {
96
+ header: Record<string, unknown>;
97
+ payload: Record<string, unknown>;
98
+ signingInput: string;
99
+ signature: Buffer;
100
+ }
101
+ /**
102
+ * Split and decode a compact JWS. This says nothing about whether the token is
103
+ * genuine — it is what the caller needs to find the right key.
104
+ */
105
+ export declare function decodeJws(token: string): Parts;
106
+ /**
107
+ * Check a token's signature against one key.
108
+ *
109
+ * `alg` is the caller's choice, not the token's. Passing the header's own
110
+ * value would be the vulnerability this exists to avoid.
111
+ */
112
+ export declare function verifyJwsSignature(parts: Parts, jwk: Jwk, alg: SupportedAlg): boolean;
113
+ export interface ClaimExpectations {
114
+ /** The issuer the discovery document declared. */
115
+ issuer: string;
116
+ /** This application's client id. */
117
+ audience: string;
118
+ /** The nonce sent on the redirect. Required for the authorization-code flow. */
119
+ nonce: string;
120
+ /** Tolerance for clock drift between here and the provider, in seconds. */
121
+ leewaySeconds?: number;
122
+ /** Injected in tests; seconds since the epoch. */
123
+ now?: number;
124
+ }
125
+ /**
126
+ * Check every claim that binds this token to this exchange.
127
+ *
128
+ * Each of these has been a real vulnerability somewhere: a token from another
129
+ * issuer, a token minted for another client of the same issuer, an expired one
130
+ * replayed, and — the one people forget — a token from an older sign-in of the
131
+ * same user, which is what the nonce catches.
132
+ */
133
+ export declare function assertIdTokenClaims(payload: Record<string, unknown>, expected: ClaimExpectations): IdTokenClaims;
134
+ export {};
135
+ //# sourceMappingURL=jwt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jwt.d.ts","sourceRoot":"","sources":["../src/jwt.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AASH,+CAA+C;AAC/C,MAAM,WAAW,GAAG;IACnB,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,aAAa;IAC7B,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IACvB,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;CACzB;AAED;;;;;GAKG;AACH,QAAA,MAAM,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAad,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG,MAAM,OAAO,SAAS,CAAC;AAElD,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,YAAY,CAEpE;AAED,uDAAuD;AACvD,UAAU,KAAK;IACd,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;CAClB;AAED;;;GAGG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,CAgB9C;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CACjC,KAAK,EAAE,KAAK,EACZ,GAAG,EAAE,GAAG,EACR,GAAG,EAAE,YAAY,GACf,OAAO,CAgCT;AAED,MAAM,WAAW,iBAAiB;IACjC,kDAAkD;IAClD,MAAM,EAAE,MAAM,CAAC;IACf,oCAAoC;IACpC,QAAQ,EAAE,MAAM,CAAC;IACjB,gFAAgF;IAChF,KAAK,EAAE,MAAM,CAAC;IACd,2EAA2E;IAC3E,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,kDAAkD;IAClD,GAAG,CAAC,EAAE,MAAM,CAAC;CACb;AAED;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAClC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,QAAQ,EAAE,iBAAiB,GACzB,aAAa,CAsDf"}