@keyneom/sync-kit 0.1.1 → 0.2.0-rc.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 (68) hide show
  1. package/README.md +99 -8
  2. package/dist/auth/google-web/identity.d.ts +49 -0
  3. package/dist/auth/google-web/identity.d.ts.map +1 -0
  4. package/dist/auth/google-web/identity.js +102 -0
  5. package/dist/auth/google-web/identity.js.map +1 -0
  6. package/dist/auth/google-web/index.d.ts +1 -0
  7. package/dist/auth/google-web/index.d.ts.map +1 -1
  8. package/dist/auth/google-web/index.js +1 -0
  9. package/dist/auth/google-web/index.js.map +1 -1
  10. package/dist/core/errors.d.ts +1 -1
  11. package/dist/core/errors.d.ts.map +1 -1
  12. package/dist/core/errors.js +22 -1
  13. package/dist/core/errors.js.map +1 -1
  14. package/dist/crypto/canonical.d.ts +5 -0
  15. package/dist/crypto/canonical.d.ts.map +1 -1
  16. package/dist/crypto/canonical.js +8 -1
  17. package/dist/crypto/canonical.js.map +1 -1
  18. package/dist/crypto/envelope.d.ts.map +1 -1
  19. package/dist/crypto/envelope.js +1 -0
  20. package/dist/crypto/envelope.js.map +1 -1
  21. package/dist/index.d.ts +1 -0
  22. package/dist/index.d.ts.map +1 -1
  23. package/dist/index.js +1 -0
  24. package/dist/index.js.map +1 -1
  25. package/dist/keys/web-passkey/index.d.ts +8 -2
  26. package/dist/keys/web-passkey/index.d.ts.map +1 -1
  27. package/dist/keys/web-passkey/index.js +32 -10
  28. package/dist/keys/web-passkey/index.js.map +1 -1
  29. package/dist/sharing/account-binding.d.ts +57 -0
  30. package/dist/sharing/account-binding.d.ts.map +1 -0
  31. package/dist/sharing/account-binding.js +305 -0
  32. package/dist/sharing/account-binding.js.map +1 -0
  33. package/dist/sharing/controller.d.ts +139 -0
  34. package/dist/sharing/controller.d.ts.map +1 -0
  35. package/dist/sharing/controller.js +549 -0
  36. package/dist/sharing/controller.js.map +1 -0
  37. package/dist/sharing/index.d.ts +119 -0
  38. package/dist/sharing/index.d.ts.map +1 -0
  39. package/dist/sharing/index.js +360 -0
  40. package/dist/sharing/index.js.map +1 -0
  41. package/dist/sharing/transport.d.ts +65 -0
  42. package/dist/sharing/transport.d.ts.map +1 -0
  43. package/dist/sharing/transport.js +2 -0
  44. package/dist/sharing/transport.js.map +1 -0
  45. package/dist/sharing/web-crypto.d.ts +68 -0
  46. package/dist/sharing/web-crypto.d.ts.map +1 -0
  47. package/dist/sharing/web-crypto.js +645 -0
  48. package/dist/sharing/web-crypto.js.map +1 -0
  49. package/dist/sharing/web-passkey.d.ts +68 -0
  50. package/dist/sharing/web-passkey.d.ts.map +1 -0
  51. package/dist/sharing/web-passkey.js +303 -0
  52. package/dist/sharing/web-passkey.js.map +1 -0
  53. package/dist/snapshot/controller.d.ts.map +1 -1
  54. package/dist/snapshot/controller.js +4 -8
  55. package/dist/snapshot/controller.js.map +1 -1
  56. package/dist/stores/google-drive/index.d.ts +147 -1
  57. package/dist/stores/google-drive/index.d.ts.map +1 -1
  58. package/dist/stores/google-drive/index.js +397 -0
  59. package/dist/stores/google-drive/index.js.map +1 -1
  60. package/dist/stores/google-drive/picker.d.ts +89 -0
  61. package/dist/stores/google-drive/picker.d.ts.map +1 -0
  62. package/dist/stores/google-drive/picker.js +179 -0
  63. package/dist/stores/google-drive/picker.js.map +1 -0
  64. package/dist/stores/google-drive/sharing.d.ts +55 -0
  65. package/dist/stores/google-drive/sharing.d.ts.map +1 -0
  66. package/dist/stores/google-drive/sharing.js +295 -0
  67. package/dist/stores/google-drive/sharing.js.map +1 -0
  68. package/package.json +67 -10
@@ -45,27 +45,37 @@ export class WebPasskeyProvider {
45
45
  const secret = returnedSecret ??
46
46
  (await this.evaluatePrf(credentialId, prfInput, this.options.rpId));
47
47
  const key = await this.deriveAndZero(secret, kdfSalt);
48
+ const credentialPublicKey = await exportCredentialPublicKey(credential, cryptoImplementation.subtle);
48
49
  const metadata = {
49
50
  credentialId: bytesToBase64Url(credentialId),
50
51
  rpId: this.options.rpId,
51
52
  prfInput,
52
53
  kdfSalt,
54
+ ...(credentialPublicKey ? { credentialPublicKey } : {}),
53
55
  };
54
56
  this.cached = { identity: metadataIdentity(metadata), key };
55
57
  return { metadata, key };
56
58
  }
57
59
  async unlock(envelope) {
58
- if (envelope.rpId !== this.options.rpId) {
59
- throw new SyncKitError("compatibility", `The snapshot belongs to ${envelope.rpId}, not ${this.options.rpId}.`);
60
+ return this.unlockMetadata({
61
+ credentialId: envelope.credentialId,
62
+ rpId: envelope.rpId,
63
+ prfInput: base64UrlToBytes(envelope.prfInput),
64
+ kdfSalt: base64UrlToBytes(envelope.kdfSalt),
65
+ });
66
+ }
67
+ async unlockMetadata(metadata) {
68
+ if (metadata.rpId !== this.options.rpId) {
69
+ throw new SyncKitError("compatibility", `The protected key belongs to ${metadata.rpId}, not ${this.options.rpId}.`);
60
70
  }
61
- const identity = envelopeIdentity(envelope);
71
+ const identity = metadataIdentity(metadata);
62
72
  if (this.cached?.identity === identity)
63
73
  return this.cached.key;
64
74
  if (this.cached)
65
75
  this.clear();
66
76
  if (this.pending?.identity === identity)
67
77
  return this.pending.promise;
68
- const promise = this.unlockNow(envelope, identity);
78
+ const promise = this.unlockNow(metadata, identity);
69
79
  this.pending = { identity, promise };
70
80
  try {
71
81
  return await promise;
@@ -85,10 +95,10 @@ export class WebPasskeyProvider {
85
95
  (typeof window !== "undefined" && window.isSecureContext)) &&
86
96
  Boolean(navigatorImplementation?.credentials));
87
97
  }
88
- async unlockNow(envelope, identity) {
98
+ async unlockNow(metadata, identity) {
89
99
  this.assertSupported();
90
- const secret = await this.evaluatePrf(base64UrlToBytes(envelope.credentialId), base64UrlToBytes(envelope.prfInput), envelope.rpId);
91
- const key = await this.deriveAndZero(secret, base64UrlToBytes(envelope.kdfSalt));
100
+ const secret = await this.evaluatePrf(base64UrlToBytes(metadata.credentialId), metadata.prfInput, metadata.rpId);
101
+ const key = await this.deriveAndZero(secret, metadata.kdfSalt);
92
102
  this.cached = { identity, key };
93
103
  return key;
94
104
  }
@@ -143,6 +153,20 @@ export class WebPasskeyProvider {
143
153
  (typeof navigator === "undefined" ? undefined : navigator));
144
154
  }
145
155
  }
156
+ async function exportCredentialPublicKey(credential, subtle) {
157
+ if (!subtle || !credential.response)
158
+ return undefined;
159
+ const response = credential.response;
160
+ if (response.getPublicKeyAlgorithm?.() !== -7 ||
161
+ typeof response.getPublicKey !== "function") {
162
+ return undefined;
163
+ }
164
+ const spki = response.getPublicKey();
165
+ if (!spki)
166
+ return undefined;
167
+ const key = await subtle.importKey("spki", spki, { name: "ECDSA", namedCurve: "P-256" }, true, ["verify"]);
168
+ return subtle.exportKey("jwk", key);
169
+ }
146
170
  export function createWebPasskeyProvider(profile, options) {
147
171
  const backend = options.backend ?? createWebCryptoBackend();
148
172
  return new WebPasskeyProvider(profile, {
@@ -173,13 +197,11 @@ function prfExtensions(prfInput) {
173
197
  function randomBytes(length, cryptoImplementation) {
174
198
  return cryptoImplementation.getRandomValues(new Uint8Array(length));
175
199
  }
176
- function envelopeIdentity(envelope) {
177
- return [envelope.rpId, envelope.credentialId, envelope.kdfSalt].join("\n");
178
- }
179
200
  function metadataIdentity(metadata) {
180
201
  return [
181
202
  metadata.rpId,
182
203
  metadata.credentialId,
204
+ bytesToBase64Url(metadata.prfInput),
183
205
  bytesToBase64Url(metadata.kdfSalt),
184
206
  ].join("\n");
185
207
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/keys/web-passkey/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/keys/web-passkey/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,57 @@
1
+ import type { SharingAccountBindingV1, SharingPasskeyAssertionV1 } from "./index.js";
2
+ export type SharingAccountBindingContext = {
3
+ appId: string;
4
+ exchangeId: string;
5
+ sharingKeyId: string;
6
+ credentialId: string;
7
+ };
8
+ export type VerifiedGoogleAccount = {
9
+ subject: string;
10
+ audience: string;
11
+ email?: string;
12
+ };
13
+ export declare function createBackendlessSharingAccountBinding(context: Omit<SharingAccountBindingContext, "credentialId">, options: {
14
+ credential(): Promise<{
15
+ credentialId: string;
16
+ credentialPublicKey: JsonWebKey;
17
+ }>;
18
+ requestGoogleIdToken(nonce: string): Promise<string>;
19
+ rpId: string;
20
+ timeoutMs?: number;
21
+ navigator?: Navigator;
22
+ crypto?: Crypto;
23
+ }): Promise<SharingAccountBindingV1>;
24
+ export declare function createSharingAccountBindingChallenge(context: SharingAccountBindingContext, cryptoImplementation?: Crypto): Promise<string>;
25
+ export declare function createSharingAccountBindingV1(challenge: string, googleIdToken: string, passkey: SharingPasskeyAssertionV1): SharingAccountBindingV1;
26
+ export declare function verifySharingAccountBindingV1(binding: SharingAccountBindingV1, context: SharingAccountBindingContext, options: {
27
+ googleAudience: string;
28
+ rpId: string;
29
+ allowedOrigins: string[];
30
+ requireUserVerification?: boolean;
31
+ fetch?: typeof fetch;
32
+ crypto?: Crypto;
33
+ now?: () => number;
34
+ }): Promise<VerifiedGoogleAccount>;
35
+ export declare function getSharingPasskeyAssertion(input: {
36
+ challenge: string;
37
+ rpId: string;
38
+ credentialId: string;
39
+ credentialPublicKey: JsonWebKey;
40
+ timeoutMs?: number;
41
+ navigator?: Navigator;
42
+ }): Promise<SharingPasskeyAssertionV1>;
43
+ export declare function verifyPasskeyAssertion(assertion: SharingPasskeyAssertionV1, options: {
44
+ challenge: string;
45
+ rpId: string;
46
+ allowedOrigins: string[];
47
+ requireUserVerification?: boolean;
48
+ crypto?: Crypto;
49
+ }): Promise<void>;
50
+ export declare function verifyGoogleIdToken(token: string, options: {
51
+ audience: string;
52
+ nonce: string;
53
+ fetch?: typeof fetch;
54
+ crypto?: Crypto;
55
+ now?: () => number;
56
+ }): Promise<VerifiedGoogleAccount>;
57
+ //# sourceMappingURL=account-binding.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"account-binding.d.ts","sourceRoot":"","sources":["../../src/sharing/account-binding.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,uBAAuB,EACvB,yBAAyB,EAC1B,MAAM,YAAY,CAAC;AAMpB,MAAM,MAAM,4BAA4B,GAAG;IACzC,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,wBAAsB,sCAAsC,CAC1D,OAAO,EAAE,IAAI,CAAC,4BAA4B,EAAE,cAAc,CAAC,EAC3D,OAAO,EAAE;IACP,UAAU,IAAI,OAAO,CAAC;QACpB,YAAY,EAAE,MAAM,CAAC;QACrB,mBAAmB,EAAE,UAAU,CAAC;KACjC,CAAC,CAAC;IACH,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACrD,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,GACA,OAAO,CAAC,uBAAuB,CAAC,CAuBlC;AAED,wBAAsB,oCAAoC,CACxD,OAAO,EAAE,4BAA4B,EACrC,oBAAoB,GAAE,MAA0B,GAC/C,OAAO,CAAC,MAAM,CAAC,CAYjB;AAED,wBAAgB,6BAA6B,CAC3C,SAAS,EAAE,MAAM,EACjB,aAAa,EAAE,MAAM,EACrB,OAAO,EAAE,yBAAyB,GACjC,uBAAuB,CAczB;AAED,wBAAsB,6BAA6B,CACjD,OAAO,EAAE,uBAAuB,EAChC,OAAO,EAAE,4BAA4B,EACrC,OAAO,EAAE;IACP,cAAc,EAAE,MAAM,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAClC,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACpB,GACA,OAAO,CAAC,qBAAqB,CAAC,CA6BhC;AAED,wBAAsB,0BAA0B,CAC9C,KAAK,EAAE;IACL,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,mBAAmB,EAAE,UAAU,CAAC;IAChC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,SAAS,CAAC;CACvB,GACA,OAAO,CAAC,yBAAyB,CAAC,CAkDpC;AAED,wBAAsB,sBAAsB,CAC1C,SAAS,EAAE,yBAAyB,EACpC,OAAO,EAAE;IACP,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAClC,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,GACA,OAAO,CAAC,IAAI,CAAC,CAoHf;AAED,wBAAsB,mBAAmB,CACvC,KAAK,EAAE,MAAM,EACb,OAAO,EAAE;IACP,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACpB,GACA,OAAO,CAAC,qBAAqB,CAAC,CA4GhC"}
@@ -0,0 +1,305 @@
1
+ import { SyncKitError } from "../core/errors.js";
2
+ import { base64UrlToBytes, bytesToBase64Url } from "../crypto/base64url.js";
3
+ import { canonicalAad } from "../crypto/canonical.js";
4
+ import { copyBuffer } from "../crypto/runtime.js";
5
+ const GOOGLE_CERTS = "https://www.googleapis.com/oauth2/v3/certs";
6
+ const encoder = new TextEncoder();
7
+ const decoder = new TextDecoder();
8
+ export async function createBackendlessSharingAccountBinding(context, options) {
9
+ const credential = await options.credential();
10
+ const challenge = await createSharingAccountBindingChallenge({
11
+ ...context,
12
+ credentialId: credential.credentialId,
13
+ }, options.crypto ?? globalThis.crypto);
14
+ const passkey = await getSharingPasskeyAssertion({
15
+ challenge,
16
+ rpId: options.rpId,
17
+ credentialId: credential.credentialId,
18
+ credentialPublicKey: credential.credentialPublicKey,
19
+ ...(options.timeoutMs ? { timeoutMs: options.timeoutMs } : {}),
20
+ ...(options.navigator ? { navigator: options.navigator } : {}),
21
+ });
22
+ const googleIdToken = await options.requestGoogleIdToken(challenge);
23
+ return createSharingAccountBindingV1(challenge, googleIdToken, passkey);
24
+ }
25
+ export async function createSharingAccountBindingChallenge(context, cryptoImplementation = globalThis.crypto) {
26
+ for (const [name, value] of Object.entries(context)) {
27
+ if (!value.trim())
28
+ throw new TypeError(`${name} must not be empty.`);
29
+ }
30
+ return bytesToBase64Url(new Uint8Array(await cryptoImplementation.subtle.digest("SHA-256", copyBuffer(canonicalAad(context)))));
31
+ }
32
+ export function createSharingAccountBindingV1(challenge, googleIdToken, passkey) {
33
+ if (base64UrlToBytes(challenge).length !== 32) {
34
+ throw new TypeError("challenge must be a SHA-256 value.");
35
+ }
36
+ if (!googleIdToken.trim()) {
37
+ throw new TypeError("googleIdToken must not be empty.");
38
+ }
39
+ return {
40
+ schemaVersion: 1,
41
+ kind: "sync-kit-sharing-account-binding",
42
+ challenge,
43
+ googleIdToken,
44
+ passkey,
45
+ };
46
+ }
47
+ export async function verifySharingAccountBindingV1(binding, context, options) {
48
+ const cryptoImplementation = options.crypto ?? globalThis.crypto;
49
+ const expectedChallenge = await createSharingAccountBindingChallenge(context, cryptoImplementation);
50
+ if (binding.challenge !== expectedChallenge ||
51
+ binding.passkey.credentialId !== context.credentialId) {
52
+ throw new SyncKitError("authorization", "The account binding does not match this exchange and sharing key.");
53
+ }
54
+ await verifyPasskeyAssertion(binding.passkey, {
55
+ challenge: expectedChallenge,
56
+ rpId: options.rpId,
57
+ allowedOrigins: options.allowedOrigins,
58
+ requireUserVerification: options.requireUserVerification ?? true,
59
+ crypto: cryptoImplementation,
60
+ });
61
+ return verifyGoogleIdToken(binding.googleIdToken, {
62
+ audience: options.googleAudience,
63
+ nonce: expectedChallenge,
64
+ ...(options.fetch ? { fetch: options.fetch } : {}),
65
+ crypto: cryptoImplementation,
66
+ ...(options.now ? { now: options.now } : {}),
67
+ });
68
+ }
69
+ export async function getSharingPasskeyAssertion(input) {
70
+ const navigatorImplementation = input.navigator ??
71
+ (typeof navigator === "undefined" ? undefined : navigator);
72
+ if (!navigatorImplementation?.credentials) {
73
+ throw new SyncKitError("configuration", "WebAuthn credentials are unavailable.");
74
+ }
75
+ const credential = await navigatorImplementation.credentials.get({
76
+ publicKey: {
77
+ challenge: copyBuffer(base64UrlToBytes(input.challenge)),
78
+ rpId: input.rpId,
79
+ allowCredentials: [
80
+ {
81
+ type: "public-key",
82
+ id: copyBuffer(base64UrlToBytes(input.credentialId)),
83
+ },
84
+ ],
85
+ userVerification: "required",
86
+ timeout: input.timeoutMs ?? 60_000,
87
+ },
88
+ });
89
+ if (!credential ||
90
+ !("rawId" in credential) ||
91
+ !("response" in credential)) {
92
+ throw new SyncKitError("key", "The passkey assertion was cancelled.");
93
+ }
94
+ const publicKeyCredential = credential;
95
+ const response = publicKeyCredential.response;
96
+ return {
97
+ credentialId: bytesToBase64Url(new Uint8Array(publicKeyCredential.rawId)),
98
+ credentialPublicKey: input.credentialPublicKey,
99
+ authenticatorData: bytesToBase64Url(new Uint8Array(response.authenticatorData)),
100
+ clientDataJSON: bytesToBase64Url(new Uint8Array(response.clientDataJSON)),
101
+ signature: bytesToBase64Url(new Uint8Array(response.signature)),
102
+ };
103
+ }
104
+ export async function verifyPasskeyAssertion(assertion, options) {
105
+ const cryptoImplementation = options.crypto ?? globalThis.crypto;
106
+ const clientDataBytes = base64UrlToBytes(assertion.clientDataJSON);
107
+ let clientData;
108
+ try {
109
+ clientData = JSON.parse(decoder.decode(clientDataBytes));
110
+ }
111
+ catch (error) {
112
+ throw new SyncKitError("compatibility", "The WebAuthn client data is invalid.", { cause: error });
113
+ }
114
+ if (!clientData ||
115
+ typeof clientData !== "object" ||
116
+ Array.isArray(clientData)) {
117
+ throw new SyncKitError("compatibility", "The WebAuthn client data is malformed.");
118
+ }
119
+ const client = clientData;
120
+ if (client.type !== "webauthn.get" ||
121
+ client.challenge !== options.challenge ||
122
+ typeof client.origin !== "string" ||
123
+ !options.allowedOrigins.includes(client.origin)) {
124
+ throw new SyncKitError("authorization", "The WebAuthn assertion context is invalid.");
125
+ }
126
+ const authenticatorData = base64UrlToBytes(assertion.authenticatorData);
127
+ if (authenticatorData.length < 37) {
128
+ throw new SyncKitError("compatibility", "The WebAuthn authenticator data is truncated.");
129
+ }
130
+ const expectedRpHash = new Uint8Array(await cryptoImplementation.subtle.digest("SHA-256", copyBuffer(encoder.encode(options.rpId))));
131
+ if (!equalBytes(authenticatorData.slice(0, 32), expectedRpHash)) {
132
+ throw new SyncKitError("authorization", "The WebAuthn assertion belongs to another relying party.");
133
+ }
134
+ const flags = authenticatorData[32] ?? 0;
135
+ if ((flags & 0x01) === 0) {
136
+ throw new SyncKitError("authorization", "The WebAuthn assertion lacks user presence.");
137
+ }
138
+ if ((options.requireUserVerification ?? true) && (flags & 0x04) === 0) {
139
+ throw new SyncKitError("authorization", "The WebAuthn assertion lacks user verification.");
140
+ }
141
+ const clientDataHash = new Uint8Array(await cryptoImplementation.subtle.digest("SHA-256", copyBuffer(clientDataBytes)));
142
+ const signed = new Uint8Array(authenticatorData.length + clientDataHash.length);
143
+ signed.set(authenticatorData);
144
+ signed.set(clientDataHash, authenticatorData.length);
145
+ const publicKey = assertion.credentialPublicKey;
146
+ if (publicKey.kty !== "EC" ||
147
+ publicKey.crv !== "P-256" ||
148
+ !publicKey.x ||
149
+ !publicKey.y) {
150
+ throw new SyncKitError("compatibility", "The passkey public key must be an ES256 P-256 JWK.");
151
+ }
152
+ const imported = await cryptoImplementation.subtle.importKey("jwk", {
153
+ kty: "EC",
154
+ crv: "P-256",
155
+ x: publicKey.x,
156
+ y: publicKey.y,
157
+ ext: true,
158
+ key_ops: ["verify"],
159
+ }, { name: "ECDSA", namedCurve: "P-256" }, false, ["verify"]);
160
+ const valid = await cryptoImplementation.subtle.verify({ name: "ECDSA", hash: "SHA-256" }, imported, copyBuffer(derEcdsaToP1363(base64UrlToBytes(assertion.signature), 32)), copyBuffer(signed));
161
+ if (!valid) {
162
+ throw new SyncKitError("authorization", "The WebAuthn assertion signature is invalid.");
163
+ }
164
+ }
165
+ export async function verifyGoogleIdToken(token, options) {
166
+ const cryptoImplementation = options.crypto ?? globalThis.crypto;
167
+ const parts = token.split(".");
168
+ if (parts.length !== 3) {
169
+ throw new SyncKitError("compatibility", "The Google ID token is not a JWT.");
170
+ }
171
+ const [encodedHeader, encodedPayload, encodedSignature] = parts;
172
+ if (!encodedHeader || !encodedPayload || !encodedSignature) {
173
+ throw new SyncKitError("compatibility", "The Google ID token is incomplete.");
174
+ }
175
+ const header = parseJwtObject(encodedHeader, "header");
176
+ const claims = parseJwtObject(encodedPayload, "claims");
177
+ if (header.alg !== "RS256" ||
178
+ typeof header.kid !== "string" ||
179
+ !header.kid) {
180
+ throw new SyncKitError("compatibility", "The Google ID token algorithm is unsupported.");
181
+ }
182
+ const fetchImplementation = options.fetch ?? globalThis.fetch;
183
+ if (!fetchImplementation) {
184
+ throw new SyncKitError("configuration", "Fetch is required to verify Google identity tokens.");
185
+ }
186
+ const response = await fetchImplementation(GOOGLE_CERTS);
187
+ if (!response.ok) {
188
+ throw new SyncKitError("provider", `Google signing keys could not be loaded (${response.status}).`, { status: response.status });
189
+ }
190
+ const keySet = (await response.json());
191
+ const jwk = keySet.keys?.find((key) => key.kid === header.kid);
192
+ if (!jwk) {
193
+ throw new SyncKitError("authorization", "The Google ID token signing key is unknown.");
194
+ }
195
+ const key = await cryptoImplementation.subtle.importKey("jwk", { ...jwk, key_ops: ["verify"], ext: true }, { name: "RSASSA-PKCS1-v1_5", hash: "SHA-256" }, false, ["verify"]);
196
+ const valid = await cryptoImplementation.subtle.verify("RSASSA-PKCS1-v1_5", key, copyBuffer(base64UrlToBytes(encodedSignature)), copyBuffer(encoder.encode(`${encodedHeader}.${encodedPayload}`)));
197
+ if (!valid) {
198
+ throw new SyncKitError("authorization", "The Google ID token signature is invalid.");
199
+ }
200
+ const nowSeconds = Math.floor((options.now?.() ?? Date.now()) / 1_000);
201
+ const audiences = Array.isArray(claims.aud)
202
+ ? claims.aud
203
+ : [claims.aud];
204
+ if ((claims.iss !== "https://accounts.google.com" &&
205
+ claims.iss !== "accounts.google.com") ||
206
+ !audiences.includes(options.audience) ||
207
+ typeof claims.exp !== "number" ||
208
+ claims.exp <= nowSeconds ||
209
+ claims.nonce !== options.nonce ||
210
+ typeof claims.sub !== "string" ||
211
+ !claims.sub) {
212
+ throw new SyncKitError("authorization", "The Google ID token claims do not match this account binding.");
213
+ }
214
+ if (claims.email !== undefined &&
215
+ (typeof claims.email !== "string" ||
216
+ claims.email_verified !== true)) {
217
+ throw new SyncKitError("authorization", "The Google ID token email is not verified.");
218
+ }
219
+ return {
220
+ subject: claims.sub,
221
+ audience: options.audience,
222
+ ...(typeof claims.email === "string"
223
+ ? { email: claims.email }
224
+ : {}),
225
+ };
226
+ }
227
+ function parseJwtObject(encoded, label) {
228
+ try {
229
+ const value = JSON.parse(decoder.decode(base64UrlToBytes(encoded)));
230
+ if (!value || typeof value !== "object" || Array.isArray(value)) {
231
+ throw new TypeError("not an object");
232
+ }
233
+ return value;
234
+ }
235
+ catch (error) {
236
+ throw new SyncKitError("compatibility", `The Google ID token ${label} is invalid.`, { cause: error });
237
+ }
238
+ }
239
+ function derEcdsaToP1363(der, width) {
240
+ let offset = 0;
241
+ if (der[offset++] !== 0x30)
242
+ throw invalidDer();
243
+ const sequenceLength = readDerLength(der, offset);
244
+ offset = sequenceLength.offset;
245
+ if (sequenceLength.length !== der.length - offset)
246
+ throw invalidDer();
247
+ if (der[offset++] !== 0x02)
248
+ throw invalidDer();
249
+ const rLength = readDerLength(der, offset);
250
+ offset = rLength.offset;
251
+ const r = der.slice(offset, offset + rLength.length);
252
+ offset += rLength.length;
253
+ if (der[offset++] !== 0x02)
254
+ throw invalidDer();
255
+ const sLength = readDerLength(der, offset);
256
+ offset = sLength.offset;
257
+ const s = der.slice(offset, offset + sLength.length);
258
+ offset += sLength.length;
259
+ if (offset !== der.length)
260
+ throw invalidDer();
261
+ const result = new Uint8Array(width * 2);
262
+ result.set(normalizeInteger(r, width), 0);
263
+ result.set(normalizeInteger(s, width), width);
264
+ return result;
265
+ }
266
+ function readDerLength(value, offset) {
267
+ const first = value[offset];
268
+ if (first === undefined)
269
+ throw invalidDer();
270
+ if ((first & 0x80) === 0)
271
+ return { length: first, offset: offset + 1 };
272
+ const bytes = first & 0x7f;
273
+ if (bytes === 0 || bytes > 2 || offset + bytes >= value.length) {
274
+ throw invalidDer();
275
+ }
276
+ let length = 0;
277
+ for (let index = 0; index < bytes; index += 1) {
278
+ length = (length << 8) | (value[offset + 1 + index] ?? 0);
279
+ }
280
+ return { length, offset: offset + 1 + bytes };
281
+ }
282
+ function normalizeInteger(value, width) {
283
+ let normalized = value;
284
+ while (normalized.length > 1 && normalized[0] === 0) {
285
+ normalized = normalized.slice(1);
286
+ }
287
+ if (normalized.length > width)
288
+ throw invalidDer();
289
+ const result = new Uint8Array(width);
290
+ result.set(normalized, width - normalized.length);
291
+ return result;
292
+ }
293
+ function invalidDer() {
294
+ return new SyncKitError("compatibility", "The WebAuthn ECDSA signature is malformed.");
295
+ }
296
+ function equalBytes(left, right) {
297
+ if (left.length !== right.length)
298
+ return false;
299
+ let difference = 0;
300
+ for (let index = 0; index < left.length; index += 1) {
301
+ difference |= (left[index] ?? 0) ^ (right[index] ?? 0);
302
+ }
303
+ return difference === 0;
304
+ }
305
+ //# sourceMappingURL=account-binding.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"account-binding.js","sourceRoot":"","sources":["../../src/sharing/account-binding.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,139 @@
1
+ import { type SharedBackupCodec, type SharingAccountBindingV1, type SharingDatasetGrantV1, type SharingInvitationV1, type SharingRole } from "./index.js";
2
+ import type { SharedBackupStorage, SharedBackupTransport, SharedDatasetFile, SharedExchangeFile } from "./transport.js";
3
+ import { type WebCryptoSharingIdentity } from "./web-crypto.js";
4
+ export type SharedBackupControllerCodec<T> = SharedBackupCodec<T> & {
5
+ merge(local: T, remote: T): T;
6
+ fingerprint(value: T): string;
7
+ };
8
+ export type SharedDatasetRegistryRecord = {
9
+ datasetId: string;
10
+ fileId?: string;
11
+ trustedOwnerKeyId: string;
12
+ lastRevisionId?: string;
13
+ seenRevisionIds?: string[];
14
+ participantPermissionIds?: Record<string, string>;
15
+ };
16
+ export interface SharedBackupRegistry {
17
+ get(datasetId: string): Promise<SharedDatasetRegistryRecord | null>;
18
+ set(record: SharedDatasetRegistryRecord): Promise<void>;
19
+ delete(datasetId: string): Promise<void>;
20
+ }
21
+ export declare class MemorySharedBackupRegistry implements SharedBackupRegistry {
22
+ private readonly records;
23
+ get(datasetId: string): Promise<SharedDatasetRegistryRecord | null>;
24
+ set(record: SharedDatasetRegistryRecord): Promise<void>;
25
+ delete(datasetId: string): Promise<void>;
26
+ }
27
+ export type SharedDatasetResult<T> = {
28
+ datasetId: string;
29
+ fileId: string;
30
+ revisionId: string;
31
+ value: T;
32
+ outcome: "created" | "loaded" | "updated" | "unchanged";
33
+ };
34
+ export type SharingInvitationResult = {
35
+ invitation: SharingInvitationV1;
36
+ invitationFileId: string;
37
+ drivePermissionId: string;
38
+ };
39
+ export type AcceptedDatasetResult = {
40
+ datasetId: string;
41
+ fileId?: string;
42
+ revisionId?: string;
43
+ permissionId?: string;
44
+ status: "accepted" | "failed";
45
+ error?: unknown;
46
+ };
47
+ export type RotatedDatasetResult = {
48
+ datasetId: string;
49
+ status: "rotated" | "failed";
50
+ revisionId?: string;
51
+ error?: unknown;
52
+ };
53
+ export type SharedBackupControllerOptions<T> = {
54
+ appId: string;
55
+ codec: SharedBackupControllerCodec<T>;
56
+ identity(): Promise<WebCryptoSharingIdentity>;
57
+ transport: SharedBackupTransport;
58
+ registry: SharedBackupRegistry;
59
+ crypto?: Crypto;
60
+ now?: () => Date;
61
+ randomUUID?: () => string;
62
+ createAccountBinding?(context: {
63
+ appId: string;
64
+ exchangeId: string;
65
+ sharingKeyId: string;
66
+ }): Promise<SharingAccountBindingV1>;
67
+ verifyAccountBinding?(binding: SharingAccountBindingV1, context: {
68
+ appId: string;
69
+ exchangeId: string;
70
+ sharingKeyId: string;
71
+ credentialId: string;
72
+ }): Promise<{
73
+ subject: string;
74
+ }>;
75
+ requireAccountBinding?: boolean;
76
+ resolveFork?(context: {
77
+ datasetId: string;
78
+ lastVerifiedRevisionId: string;
79
+ remoteRevisionId: string;
80
+ localValue: T;
81
+ remoteValue: T;
82
+ }): Promise<"merge" | "reject">;
83
+ };
84
+ /**
85
+ * Headless, backend-independent sharing orchestration. Consumers own UI,
86
+ * persistence, lifecycle policy, and conflict resolution.
87
+ */
88
+ export declare class SharedBackupController<T> {
89
+ private readonly options;
90
+ private queue;
91
+ constructor(options: SharedBackupControllerOptions<T>);
92
+ ensureStorage(): Promise<SharedBackupStorage>;
93
+ listDatasets(): Promise<SharedDatasetFile[]>;
94
+ createDataset(datasetId: string, value: T): Promise<SharedDatasetResult<T>>;
95
+ loadDataset(datasetId: string): Promise<SharedDatasetResult<T>>;
96
+ syncDataset(datasetId: string, localValue: T): Promise<SharedDatasetResult<T>>;
97
+ inviteParticipant(input: {
98
+ emailAddress: string;
99
+ requestedGrants: SharingDatasetGrantV1[];
100
+ expiresAt?: string;
101
+ sendNotificationEmail?: boolean;
102
+ emailMessage?: string;
103
+ }): Promise<SharingInvitationResult>;
104
+ listExchanges(options?: {
105
+ exchangeId?: string;
106
+ kind?: SharedExchangeFile["kind"];
107
+ }): Promise<SharedExchangeFile[]>;
108
+ submitKeyResponse(invitationFileId: string): Promise<{
109
+ responseFileId: string;
110
+ exchangeId: string;
111
+ }>;
112
+ acceptKeyResponse(input: {
113
+ invitation: SharingInvitationV1;
114
+ responseFileId: string;
115
+ recipientEmailAddress: string;
116
+ }): Promise<AcceptedDatasetResult[]>;
117
+ setDatasetRole(input: {
118
+ datasetId: string;
119
+ keyId: string;
120
+ role: Exclude<SharingRole, "owner">;
121
+ emailAddress: string;
122
+ }): Promise<SharedDatasetResult<T>>;
123
+ revokeDatasetKey(input: {
124
+ datasetId: string;
125
+ keyId: string;
126
+ }): Promise<SharedDatasetResult<T>>;
127
+ rotateLocalKey(replacementIdentity: WebCryptoSharingIdentity, datasetIds: string[]): Promise<RotatedDatasetResult[]>;
128
+ private changeParticipants;
129
+ private readDatasetById;
130
+ private requiredRegistry;
131
+ private verifyHead;
132
+ private initialOwnerRecord;
133
+ private persistHead;
134
+ private crypto;
135
+ private cryptoOptions;
136
+ private serialized;
137
+ }
138
+ export declare function createSharedBackupController<T>(options: SharedBackupControllerOptions<T>): SharedBackupController<T>;
139
+ //# sourceMappingURL=controller.d.ts.map