passkey-kit 0.16.5 → 0.17.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 (71) hide show
  1. package/README.md +70 -33
  2. package/dist/contract-errors.d.ts +1 -1
  3. package/dist/contract-errors.d.ts.map +1 -1
  4. package/dist/contract-errors.js +6 -2
  5. package/dist/contract-errors.js.map +1 -1
  6. package/dist/errors.d.ts +7 -0
  7. package/dist/errors.d.ts.map +1 -1
  8. package/dist/errors.js +11 -0
  9. package/dist/errors.js.map +1 -1
  10. package/dist/index.d.ts +3 -2
  11. package/dist/index.d.ts.map +1 -1
  12. package/dist/index.js +1 -1
  13. package/dist/index.js.map +1 -1
  14. package/dist/indexer/index.d.ts +1 -1
  15. package/dist/indexer/index.d.ts.map +1 -1
  16. package/dist/indexer/index.js.map +1 -1
  17. package/dist/indexer/mercury.d.ts +8 -12
  18. package/dist/indexer/mercury.d.ts.map +1 -1
  19. package/dist/indexer/mercury.js +110 -37
  20. package/dist/indexer/mercury.js.map +1 -1
  21. package/dist/indexer/types.d.ts +41 -5
  22. package/dist/indexer/types.d.ts.map +1 -1
  23. package/dist/kit/birth-verification.d.ts +45 -0
  24. package/dist/kit/birth-verification.d.ts.map +1 -0
  25. package/dist/kit/birth-verification.js +127 -0
  26. package/dist/kit/birth-verification.js.map +1 -0
  27. package/dist/kit/deploy-ops.d.ts +2 -2
  28. package/dist/kit/deploy-ops.d.ts.map +1 -1
  29. package/dist/kit/deploy-ops.js +2 -2
  30. package/dist/kit/deploy-ops.js.map +1 -1
  31. package/dist/kit/wallet-ops.d.ts +14 -2
  32. package/dist/kit/wallet-ops.d.ts.map +1 -1
  33. package/dist/kit/wallet-ops.js +50 -3
  34. package/dist/kit/wallet-ops.js.map +1 -1
  35. package/dist/kit/webauthn-ops.d.ts +3 -1
  36. package/dist/kit/webauthn-ops.d.ts.map +1 -1
  37. package/dist/kit/webauthn-ops.js +8 -2
  38. package/dist/kit/webauthn-ops.js.map +1 -1
  39. package/dist/kit/webauthn-verify.d.ts +166 -0
  40. package/dist/kit/webauthn-verify.d.ts.map +1 -0
  41. package/dist/kit/webauthn-verify.js +328 -0
  42. package/dist/kit/webauthn-verify.js.map +1 -0
  43. package/dist/kit.d.ts +60 -38
  44. package/dist/kit.d.ts.map +1 -1
  45. package/dist/kit.js +335 -108
  46. package/dist/kit.js.map +1 -1
  47. package/dist/managers/credential-manager.d.ts +2 -2
  48. package/dist/managers/credential-manager.d.ts.map +1 -1
  49. package/dist/managers/credential-manager.js +3 -3
  50. package/dist/managers/credential-manager.js.map +1 -1
  51. package/dist/managers/signer-manager.d.ts +10 -4
  52. package/dist/managers/signer-manager.d.ts.map +1 -1
  53. package/dist/managers/signer-manager.js +11 -5
  54. package/dist/managers/signer-manager.js.map +1 -1
  55. package/dist/managers/submission-manager.d.ts +2 -1
  56. package/dist/managers/submission-manager.d.ts.map +1 -1
  57. package/dist/managers/submission-manager.js +2 -2
  58. package/dist/managers/submission-manager.js.map +1 -1
  59. package/dist/server.d.ts +7 -5
  60. package/dist/server.d.ts.map +1 -1
  61. package/dist/server.js +6 -5
  62. package/dist/server.js.map +1 -1
  63. package/dist/types.d.ts +8 -5
  64. package/dist/types.d.ts.map +1 -1
  65. package/dist/utils.d.ts +4 -8
  66. package/dist/utils.d.ts.map +1 -1
  67. package/dist/utils.js +4 -8
  68. package/dist/utils.js.map +1 -1
  69. package/dist/version.d.ts +1 -1
  70. package/dist/version.js +1 -1
  71. package/package.json +2 -2
@@ -14,7 +14,9 @@
14
14
  */
15
15
  import { Keypair } from "@stellar/stellar-sdk";
16
16
  import { Durability } from "@stellar/stellar-sdk/rpc";
17
+ import { Address } from "@stellar/stellar-sdk";
17
18
  import base64url from "../base64url.js";
19
+ import { PasskeyKitErrorCode, ValidationError } from "../errors.js";
18
20
  import { readContractData } from "../rpc-data.js";
19
21
  import { signerKeyToScVal, SIGNER_VAL_UDT } from "./auth-payload.js";
20
22
  /** Encode an optional expiration into the contract's `Option<u64>` timestamp. */
@@ -43,7 +45,7 @@ export function toContractSignerLimits(limits) {
43
45
  }
44
46
  return [map];
45
47
  }
46
- function buildSecp256r1Signer(keyId, publicKey, limits, store, expiration) {
48
+ export function buildSecp256r1Signer(keyId, publicKey, limits, store, expiration) {
47
49
  const keyIdBuffer = typeof keyId === "string" ? base64url.toBuffer(keyId) : Buffer.from(keyId);
48
50
  const publicKeyBuffer = typeof publicKey === "string"
49
51
  ? base64url.toBuffer(publicKey)
@@ -84,11 +86,56 @@ function buildPolicySigner(policy, limits, store, expiration) {
84
86
  export function buildSecp256r1SignerTx(deps, fn, keyId, publicKey, limits, store, expiration) {
85
87
  return deps.wallet[fn]({ signer: buildSecp256r1Signer(keyId, publicKey, limits, store, expiration) }, { timeoutInSeconds: deps.timeoutInSeconds });
86
88
  }
89
+ /** Build a proof-carrying Secp256r1 signer addition. */
90
+ export function buildAddSecp256r1SignerTx(deps, keyId, publicKey, limits, store, proof, expiration) {
91
+ return deps.wallet.add_secp256r1({
92
+ signer: buildSecp256r1Signer(keyId, publicKey, limits, store, expiration),
93
+ proof,
94
+ }, { timeoutInSeconds: deps.timeoutInSeconds });
95
+ }
87
96
  export function buildEd25519SignerTx(deps, fn, publicKey, limits, store, expiration) {
88
97
  return deps.wallet[fn]({ signer: buildEd25519Signer(publicKey, limits, store, expiration) }, { timeoutInSeconds: deps.timeoutInSeconds });
89
98
  }
90
- export function buildPolicySignerTx(deps, fn, policy, limits, store, expiration) {
91
- return deps.wallet[fn]({ signer: buildPolicySigner(policy, limits, store, expiration) }, { timeoutInSeconds: deps.timeoutInSeconds });
99
+ export async function buildPolicySignerTx(deps, fn, policy, limits, store, expiration, options) {
100
+ const tx = await deps.wallet[fn]({ signer: buildPolicySigner(policy, limits, store, expiration) }, { timeoutInSeconds: deps.timeoutInSeconds });
101
+ // `add_signer` on a policy runs the policy's `install` hook while the
102
+ // wallet's authorization is live. Anything the hook `require_auth`s against
103
+ // the wallet is recorded by simulation as a sub-invocation of the
104
+ // `add_signer` root, and a single passkey signature would cover it. A
105
+ // legitimate install needs no wallet-authorized calls, so refuse by default.
106
+ if (fn === "add_signer" && !options?.allowInstallSubInvocations) {
107
+ assertNoInstallSubInvocations(tx, deps.wallet.options.contractId, policy);
108
+ }
109
+ return tx;
110
+ }
111
+ function assertNoInstallSubInvocations(tx, contractId, policy) {
112
+ const auth = tx
113
+ .simulationData?.result?.auth ?? [];
114
+ for (const entry of auth) {
115
+ const root = entry.rootInvocation();
116
+ const fn = root.function();
117
+ if (fn.switch().name !== "sorobanAuthorizedFunctionTypeContractFn")
118
+ continue;
119
+ const args = fn.contractFn();
120
+ if (Address.fromScAddress(args.contractAddress()).toString() !== contractId)
121
+ continue;
122
+ if (args.functionName().toString() !== "add_signer")
123
+ continue;
124
+ const subs = root.subInvocations().map(describeInvocation);
125
+ if (subs.length > 0) {
126
+ throw new ValidationError(`Policy ${policy} install hook requests wallet-authorized sub-invocations ` +
127
+ `(${subs.join(", ")}). Refusing to build add_signer. Pass ` +
128
+ `allowInstallSubInvocations: true to override.`, PasskeyKitErrorCode.INVALID_INPUT, { policy, subInvocations: subs });
129
+ }
130
+ }
131
+ }
132
+ function describeInvocation(inv) {
133
+ const fn = inv.function();
134
+ if (fn.switch().name !== "sorobanAuthorizedFunctionTypeContractFn") {
135
+ return fn.switch().name;
136
+ }
137
+ const args = fn.contractFn();
138
+ return `${Address.fromScAddress(args.contractAddress()).toString()}.${args.functionName().toString()}`;
92
139
  }
93
140
  export function buildRemoveSignerTx(deps, signerKey) {
94
141
  return deps.wallet.remove_signer({ signer_key: toContractSignerKey(signerKey) }, { timeoutInSeconds: deps.timeoutInSeconds });
@@ -1 +1 @@
1
- {"version":3,"file":"wallet-ops.js","sourceRoot":"","sources":["../../src/kit/wallet-ops.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"wallet-ops.js","sourceRoot":"","sources":["../../src/kit/wallet-ops.ts"],"names":[],"mappings":"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"}
@@ -44,6 +44,8 @@ export declare function createPasskey(deps: WebAuthnDeps, appName: string, userN
44
44
  export interface AuthenticatedPasskey {
45
45
  keyId: string;
46
46
  keyIdBuffer: Buffer;
47
+ /** Raw random challenge used by this authentication ceremony. */
48
+ challenge: Buffer;
47
49
  rawResponse: AuthenticationResponseJSON;
48
50
  }
49
51
  /**
@@ -51,5 +53,5 @@ export interface AuthenticatedPasskey {
51
53
  * `allowCredentials`), returning the selected credential id. Used by
52
54
  * `connectWallet` to discover which passkey the user picked.
53
55
  */
54
- export declare function authenticatePasskey(deps: WebAuthnDeps): Promise<AuthenticatedPasskey>;
56
+ export declare function authenticatePasskey(deps: WebAuthnDeps, keyId?: string | Uint8Array): Promise<AuthenticatedPasskey>;
55
57
  //# sourceMappingURL=webauthn-ops.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"webauthn-ops.d.ts","sourceRoot":"","sources":["../../src/kit/webauthn-ops.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EACV,0BAA0B,EAC1B,wBAAwB,EACxB,sCAAsC,EACtC,qCAAqC,EACrC,8BAA8B,EAC/B,MAAM,yBAAyB,CAAC;AAMjC,gFAAgF;AAChF,MAAM,WAAW,cAAc;IAC7B,iBAAiB,CAAC,IAAI,EAAE;QACtB,WAAW,EAAE,sCAAsC,CAAC;KACrD,GAAG,OAAO,CAAC,wBAAwB,CAAC,CAAC;IACtC,mBAAmB,CAAC,IAAI,EAAE;QACxB,WAAW,EAAE,qCAAqC,CAAC;KACpD,GAAG,OAAO,CAAC,0BAA0B,CAAC,CAAC;CACzC;AAED,8DAA8D;AAC9D,MAAM,WAAW,YAAY;IAC3B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,cAAc,CAAC;CAC1B;AAED,oCAAoC;AACpC,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,wBAAwB,CAAC;IACtC,+BAA+B;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,+BAA+B;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,iDAAiD;IACjD,SAAS,EAAE,UAAU,CAAC;CACvB;AAED;;;;GAIG;AACH,wBAAsB,aAAa,CACjC,IAAI,EAAE,YAAY,EAClB,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,sBAAsB,GAAE,8BAGvB,GACA,OAAO,CAAC,cAAc,CAAC,CAoCzB;AAED,uDAAuD;AACvD,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,0BAA0B,CAAC;CACzC;AAED;;;;GAIG;AACH,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,YAAY,GACjB,OAAO,CAAC,oBAAoB,CAAC,CAwB/B"}
1
+ {"version":3,"file":"webauthn-ops.d.ts","sourceRoot":"","sources":["../../src/kit/webauthn-ops.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EACV,0BAA0B,EAC1B,wBAAwB,EACxB,sCAAsC,EACtC,qCAAqC,EACrC,8BAA8B,EAC/B,MAAM,yBAAyB,CAAC;AAMjC,gFAAgF;AAChF,MAAM,WAAW,cAAc;IAC7B,iBAAiB,CAAC,IAAI,EAAE;QACtB,WAAW,EAAE,sCAAsC,CAAC;KACrD,GAAG,OAAO,CAAC,wBAAwB,CAAC,CAAC;IACtC,mBAAmB,CAAC,IAAI,EAAE;QACxB,WAAW,EAAE,qCAAqC,CAAC;KACpD,GAAG,OAAO,CAAC,0BAA0B,CAAC,CAAC;CACzC;AAED,8DAA8D;AAC9D,MAAM,WAAW,YAAY;IAC3B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,cAAc,CAAC;CAC1B;AAED,oCAAoC;AACpC,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,wBAAwB,CAAC;IACtC,+BAA+B;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,+BAA+B;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,iDAAiD;IACjD,SAAS,EAAE,UAAU,CAAC;CACvB;AAED;;;;GAIG;AACH,wBAAsB,aAAa,CACjC,IAAI,EAAE,YAAY,EAClB,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,sBAAsB,GAAE,8BAGvB,GACA,OAAO,CAAC,cAAc,CAAC,CAoCzB;AAED,uDAAuD;AACvD,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,iEAAiE;IACjE,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,0BAA0B,CAAC;CACzC;AAED;;;;GAIG;AACH,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,YAAY,EAClB,KAAK,CAAC,EAAE,MAAM,GAAG,UAAU,GAC1B,OAAO,CAAC,oBAAoB,CAAC,CA+B/B"}
@@ -56,12 +56,17 @@ export async function createPasskey(deps, appName, userName, authenticatorSelect
56
56
  * `allowCredentials`), returning the selected credential id. Used by
57
57
  * `connectWallet` to discover which passkey the user picked.
58
58
  */
59
- export async function authenticatePasskey(deps) {
59
+ export async function authenticatePasskey(deps, keyId) {
60
+ const challenge = generateChallenge();
61
+ const requestedKeyId = keyId instanceof Uint8Array ? base64url(Buffer.from(keyId)) : keyId;
60
62
  const optionsJSON = {
61
- challenge: generateChallenge(),
63
+ challenge,
62
64
  rpId: deps.rpId,
63
65
  userVerification: "preferred",
64
66
  timeout: WEBAUTHN_TIMEOUT_MS,
67
+ ...(requestedKeyId
68
+ ? { allowCredentials: [{ id: requestedKeyId, type: "public-key" }] }
69
+ : {}),
65
70
  };
66
71
  let rawResponse;
67
72
  try {
@@ -73,6 +78,7 @@ export async function authenticatePasskey(deps) {
73
78
  return {
74
79
  keyId: rawResponse.id,
75
80
  keyIdBuffer: base64url.toBuffer(rawResponse.id),
81
+ challenge: base64url.toBuffer(challenge),
76
82
  rawResponse,
77
83
  };
78
84
  }
@@ -1 +1 @@
1
- {"version":3,"file":"webauthn-ops.js","sourceRoot":"","sources":["../../src/kit/webauthn-ops.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AASH,OAAO,SAAS,MAAM,iBAAiB,CAAC;AACxC,OAAO,EAAE,+BAA+B,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AACjF,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AA6BlE;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,IAAkB,EAClB,OAAe,EACf,QAAgB,EAChB,yBAAyD;IACvD,WAAW,EAAE,WAAW;IACxB,gBAAgB,EAAE,WAAW;CAC9B;IAED,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;IACvB,MAAM,WAAW,GAAG,GAAG,QAAQ,MAAM,GAAG,CAAC,cAAc,EAAE,EAAE,CAAC;IAE5D,MAAM,WAAW,GAA2C;QAC1D,SAAS,EAAE,iBAAiB,EAAE;QAC9B,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE;QACpC,IAAI,EAAE;YACJ,EAAE,EAAE,iBAAiB,EAAE;YACvB,IAAI,EAAE,WAAW;YACjB,WAAW;SACZ;QACD,sBAAsB;QACtB,gBAAgB,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;QACnD,OAAO,EAAE,mBAAmB;KAC7B,CAAC;IAEF,IAAI,WAAqC,CAAC;IAC1C,IAAI,CAAC;QACH,WAAW,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC;IACvE,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,aAAa,CACrB,6BAA6B,EAC7B,mBAAmB,CAAC,4BAA4B,EAChD,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CACvC,CAAC;IACJ,CAAC;IAED,MAAM,SAAS,GAAG,MAAM,+BAA+B,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;IAE9E,OAAO;QACL,WAAW;QACX,KAAK,EAAE,WAAW,CAAC,EAAE;QACrB,WAAW,EAAE,SAAS,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;QAC/C,SAAS;KACV,CAAC;AACJ,CAAC;AASD;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,IAAkB;IAElB,MAAM,WAAW,GAA0C;QACzD,SAAS,EAAE,iBAAiB,EAAE;QAC9B,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,gBAAgB,EAAE,WAAW;QAC7B,OAAO,EAAE,mBAAmB;KAC7B,CAAC;IAEF,IAAI,WAAuC,CAAC;IAC5C,IAAI,CAAC;QACH,WAAW,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,mBAAmB,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC;IACzE,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,aAAa,CACrB,+BAA+B,EAC/B,mBAAmB,CAAC,8BAA8B,EAClD,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CACvC,CAAC;IACJ,CAAC;IAED,OAAO;QACL,KAAK,EAAE,WAAW,CAAC,EAAE;QACrB,WAAW,EAAE,SAAS,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;QAC/C,WAAW;KACZ,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"webauthn-ops.js","sourceRoot":"","sources":["../../src/kit/webauthn-ops.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,166 @@
1
+ /**
2
+ * Client-side cryptography for the Secp256r1 signer-binding protocol.
3
+ *
4
+ * Three things live here, all browser-safe (WebCrypto + stellar-sdk hashing,
5
+ * no Node-only modules):
6
+ *
7
+ * 1. **The binding challenge.** `sha256(XDR(Secp256r1BindingPayload))`, where
8
+ * the payload contains the network, wallet, purpose, and complete original
9
+ * signer. GENESIS and ADD use separate domains. The payload is encoded
10
+ * through the contract `Spec` and canonicalized to the host's map order.
11
+ * This is the exact value the wallet contract recomputes.
12
+ *
13
+ * 2. **WebAuthn assertion verification.** For a STORED proof (the contract's
14
+ * 64-byte compact `r||s` signature) and for a FRESH `AuthenticationResponseJSON`
15
+ * (DER signature straight from the authenticator). Checks: clientDataJSON
16
+ * `type`, `challenge`, optional origin allowlist, `rpIdHash`, User Presence,
17
+ * optional User Verification, the credential id where one is available, and
18
+ * the P-256 signature over `authenticatorData || sha256(clientDataJSON)`.
19
+ *
20
+ * 3. **Binding-record verification.** The record's immutable `keyId` and
21
+ * `publicKey` must equal the LIVE signer entry. The proof verifies
22
+ * against the ORIGINAL signer in the record. This permits authorized policy
23
+ * updates without changing the signed deployment or addition consent.
24
+ * The caller must also verify the wallet's accepted birth code. Custom birth
25
+ * code can copy a pending proof before it upgrades to accepted current code.
26
+ *
27
+ * Every verifier returns a result object rather than throwing, so a candidate
28
+ * filter can drop a wallet for a named reason without aborting the whole
29
+ * resolution. Only programmer errors (missing WebCrypto, malformed inputs to the
30
+ * challenge builder) throw.
31
+ *
32
+ * @packageDocumentation
33
+ */
34
+ import { xdr } from "@stellar/stellar-sdk";
35
+ import type { Spec as ContractSpec } from "@stellar/stellar-sdk/contract";
36
+ import type { AuthenticationResponseJSON } from "@simplewebauthn/browser";
37
+ import type { BindingPurpose, Secp256r1BindingRecord as ContractSecp256r1BindingRecord, Signer as ContractSigner } from "passkey-kit-sdk";
38
+ /**
39
+ * Fixed domain separators. These values must equal the contract constants.
40
+ */
41
+ export declare const SECP256R1_GENESIS_DOMAIN = "secp256r1_genesis_v1";
42
+ export declare const SECP256R1_ADD_DOMAIN = "secp256r1_add_v1";
43
+ /** The contract spec UDT name of the binding payload struct. */
44
+ export declare const SECP256R1_BINDING_PAYLOAD_TYPE = "Secp256r1BindingPayload";
45
+ /** Inputs that fully determine a binding challenge. */
46
+ export interface BindingChallengeInput {
47
+ /** A contract `Spec` that defines `Secp256r1BindingPayload`. */
48
+ spec: ContractSpec;
49
+ /** Network passphrase; hashed to the `network_id` the wallet reads. */
50
+ networkPassphrase: string;
51
+ /** The wallet contract address (`C…`) the proof binds to. */
52
+ contractId: string;
53
+ /** Entry point that will consume this proof. */
54
+ purpose: BindingPurpose["tag"];
55
+ /** The complete original signer value, including its mutable policy fields. */
56
+ signer: ContractSigner;
57
+ }
58
+ /** Normalize a base64url string or raw bytes to bytes. */
59
+ export declare function toKeyIdBytes(keyId: Uint8Array | string): Uint8Array;
60
+ /**
61
+ * Canonicalize an `ScVal` map into the host's storage order.
62
+ *
63
+ * The contract hashes `to_xdr(payload)`, and the host serializes a struct as
64
+ * an `ScMap` sorted by key. `Spec.nativeToScVal` emits struct fields in spec
65
+ * declaration order, which for the Rust struct is NOT sorted, so the map is
66
+ * re-sorted here by symbol key (bytewise, the host's order for symbols).
67
+ * Non-map values pass through unchanged.
68
+ */
69
+ export declare function canonicalScVal(value: xdr.ScVal): xdr.ScVal;
70
+ /**
71
+ * The binding payload as a canonical `ScVal`, encoded through the contract
72
+ * `Spec` so field types are exactly the on-chain ones.
73
+ */
74
+ export declare function bindingPayloadScVal(input: BindingChallengeInput): xdr.ScVal;
75
+ /**
76
+ * The 32-byte binding challenge: `sha256(XDR(payload))`. This is the value a
77
+ * WebAuthn ceremony must carry (base64url-encoded) as its `challenge`.
78
+ */
79
+ export declare function bindingChallenge(input: BindingChallengeInput): Uint8Array;
80
+ /** The binding challenge as the base64url string WebAuthn puts in clientDataJSON. */
81
+ export declare function bindingChallengeBase64url(input: BindingChallengeInput): string;
82
+ /** Why an assertion failed to verify. */
83
+ export type AssertionFailure = "key_id" | "client_data" | "type" | "challenge" | "origin" | "authenticator_data" | "rp_id" | "user_presence" | "user_verification" | "public_key" | "signature";
84
+ export type AssertionResult = {
85
+ ok: true;
86
+ } | {
87
+ ok: false;
88
+ reason: AssertionFailure;
89
+ detail: string;
90
+ };
91
+ /** What an assertion must satisfy. */
92
+ export interface AssertionPolicy {
93
+ /** The 32-byte challenge the assertion must carry. */
94
+ expectedChallenge: Uint8Array;
95
+ /** Relying Party id; `sha256(rpId)` must equal `authenticatorData[0..32]`. */
96
+ rpId: string;
97
+ /** 65-byte P-256 public key the signature must verify under. */
98
+ publicKey: Uint8Array;
99
+ /**
100
+ * Credential id the assertion must come from. Checked only where the
101
+ * assertion carries one (a fresh response has `id`; a stored proof does not).
102
+ */
103
+ expectedKeyId?: Uint8Array | string;
104
+ /** Require the User Verification flag (biometric/PIN). Default: UP only. */
105
+ requireUserVerification?: boolean;
106
+ /** When set (non-empty), `clientDataJSON.origin` must be listed. */
107
+ allowedOrigins?: readonly string[];
108
+ }
109
+ /** A stored proof as the contract keeps it (compact 64-byte `r||s`). */
110
+ export interface StoredWebAuthnProof {
111
+ authenticatorData: Uint8Array;
112
+ clientDataJSON: Uint8Array;
113
+ /** 64 bytes: `r || s`, low-S. */
114
+ signature: Uint8Array;
115
+ }
116
+ /**
117
+ * Verify one WebAuthn assertion with a compact signature against a policy.
118
+ * Every structural check runs before the signature, so a malformed assertion
119
+ * never costs a curve operation.
120
+ */
121
+ export declare function verifyAssertion(proof: StoredWebAuthnProof, policy: AssertionPolicy, presentedKeyId?: string): Promise<AssertionResult>;
122
+ /** Verify a STORED binding proof (contract compact signature). */
123
+ export declare function verifyStoredProof(proof: StoredWebAuthnProof, policy: AssertionPolicy): Promise<AssertionResult>;
124
+ /**
125
+ * Verify a FRESH `AuthenticationResponseJSON` from `startAuthentication`. The
126
+ * DER signature is converted to compact form (with low-S) through the same
127
+ * `compactSignature` the signing pipeline uses, and `response.id` is checked
128
+ * against `policy.expectedKeyId` when that is set.
129
+ */
130
+ export declare function verifyFreshAssertion(response: AuthenticationResponseJSON, policy: AssertionPolicy): Promise<AssertionResult>;
131
+ /** The contract's `Secp256r1BindingRecord`, as read from the ledger. */
132
+ export type Secp256r1BindingRecord = ContractSecp256r1BindingRecord;
133
+ /** The live `Secp256r1` signer entry the record must agree with. */
134
+ export interface LiveSecp256r1Signer {
135
+ keyId: Uint8Array | string;
136
+ publicKey: Uint8Array;
137
+ }
138
+ /** What a binding record must satisfy for one candidate wallet. */
139
+ export interface BindingRecordPolicy {
140
+ spec: ContractSpec;
141
+ networkPassphrase: string;
142
+ /** The CANDIDATE address the challenge is recomputed for. */
143
+ contractId: string;
144
+ rpId: string;
145
+ allowedOrigins?: readonly string[];
146
+ requireUserVerification?: boolean;
147
+ }
148
+ export type BindingFailure = AssertionFailure | "signer_kind" | "key_id_mismatch" | "public_key_mismatch";
149
+ export type BindingResult = {
150
+ ok: true;
151
+ challenge: Uint8Array;
152
+ } | {
153
+ ok: false;
154
+ reason: BindingFailure;
155
+ detail: string;
156
+ };
157
+ /**
158
+ * Verify that `record` binds `liveSigner` to `policy.contractId`.
159
+ *
160
+ * 1. The record's signer keyId and public key equal the live signer.
161
+ * 2. The challenge uses the record's original full signer and purpose.
162
+ * 3. The stored proof must be a valid `webauthn.get` assertion over that
163
+ * challenge under that key, with the rpId/UP/UV/origin policy applied.
164
+ */
165
+ export declare function verifyBindingRecord(record: Secp256r1BindingRecord, liveSigner: LiveSecp256r1Signer, policy: BindingRecordPolicy): Promise<BindingResult>;
166
+ //# sourceMappingURL=webauthn-verify.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webauthn-verify.d.ts","sourceRoot":"","sources":["../../src/kit/webauthn-verify.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAEH,OAAO,EAAQ,GAAG,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,KAAK,EAAE,IAAI,IAAI,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAC1E,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,yBAAyB,CAAC;AAC1E,OAAO,KAAK,EACV,cAAc,EACd,sBAAsB,IAAI,8BAA8B,EACxD,MAAM,IAAI,cAAc,EACzB,MAAM,iBAAiB,CAAC;AAwBzB;;GAEG;AACH,eAAO,MAAM,wBAAwB,yBAAyB,CAAC;AAC/D,eAAO,MAAM,oBAAoB,qBAAqB,CAAC;AAEvD,gEAAgE;AAChE,eAAO,MAAM,8BAA8B,4BAA4B,CAAC;AAExE,uDAAuD;AACvD,MAAM,WAAW,qBAAqB;IACpC,gEAAgE;IAChE,IAAI,EAAE,YAAY,CAAC;IACnB,uEAAuE;IACvE,iBAAiB,EAAE,MAAM,CAAC;IAC1B,6DAA6D;IAC7D,UAAU,EAAE,MAAM,CAAC;IACnB,gDAAgD;IAChD,OAAO,EAAE,cAAc,CAAC,KAAK,CAAC,CAAC;IAC/B,+EAA+E;IAC/E,MAAM,EAAE,cAAc,CAAC;CACxB;AAED,0DAA0D;AAC1D,wBAAgB,YAAY,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,GAAG,UAAU,CAInE;AASD;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,GAAG,CAAC,KAAK,GAAG,GAAG,CAAC,KAAK,CAqB1D;AAmBD;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,qBAAqB,GAAG,GAAG,CAAC,KAAK,CA6B3E;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,qBAAqB,GAAG,UAAU,CAEzE;AAED,qFAAqF;AACrF,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,qBAAqB,GAAG,MAAM,CAE9E;AAMD,yCAAyC;AACzC,MAAM,MAAM,gBAAgB,GACxB,QAAQ,GACR,aAAa,GACb,MAAM,GACN,WAAW,GACX,QAAQ,GACR,oBAAoB,GACpB,OAAO,GACP,eAAe,GACf,mBAAmB,GACnB,YAAY,GACZ,WAAW,CAAC;AAEhB,MAAM,MAAM,eAAe,GACvB;IAAE,EAAE,EAAE,IAAI,CAAA;CAAE,GACZ;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,gBAAgB,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAE5D,sCAAsC;AACtC,MAAM,WAAW,eAAe;IAC9B,sDAAsD;IACtD,iBAAiB,EAAE,UAAU,CAAC;IAC9B,8EAA8E;IAC9E,IAAI,EAAE,MAAM,CAAC;IACb,gEAAgE;IAChE,SAAS,EAAE,UAAU,CAAC;IACtB;;;OAGG;IACH,aAAa,CAAC,EAAE,UAAU,GAAG,MAAM,CAAC;IACpC,4EAA4E;IAC5E,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAClC,oEAAoE;IACpE,cAAc,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACpC;AAED,wEAAwE;AACxE,MAAM,WAAW,mBAAmB;IAClC,iBAAiB,EAAE,UAAU,CAAC;IAC9B,cAAc,EAAE,UAAU,CAAC;IAC3B,iCAAiC;IACjC,SAAS,EAAE,UAAU,CAAC;CACvB;AA0ED;;;;GAIG;AACH,wBAAsB,eAAe,CACnC,KAAK,EAAE,mBAAmB,EAC1B,MAAM,EAAE,eAAe,EACvB,cAAc,CAAC,EAAE,MAAM,GACtB,OAAO,CAAC,eAAe,CAAC,CAqD1B;AAED,kEAAkE;AAClE,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,mBAAmB,EAC1B,MAAM,EAAE,eAAe,GACtB,OAAO,CAAC,eAAe,CAAC,CAE1B;AAED;;;;;GAKG;AACH,wBAAsB,oBAAoB,CACxC,QAAQ,EAAE,0BAA0B,EACpC,MAAM,EAAE,eAAe,GACtB,OAAO,CAAC,eAAe,CAAC,CAmB1B;AAMD,wEAAwE;AACxE,MAAM,MAAM,sBAAsB,GAAG,8BAA8B,CAAC;AAEpE,oEAAoE;AACpE,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,UAAU,GAAG,MAAM,CAAC;IAC3B,SAAS,EAAE,UAAU,CAAC;CACvB;AAED,mEAAmE;AACnE,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,YAAY,CAAC;IACnB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,6DAA6D;IAC7D,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,cAAc,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,uBAAuB,CAAC,EAAE,OAAO,CAAC;CACnC;AAED,MAAM,MAAM,cAAc,GACtB,gBAAgB,GAChB,aAAa,GACb,iBAAiB,GACjB,qBAAqB,CAAC;AAE1B,MAAM,MAAM,aAAa,GACrB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,SAAS,EAAE,UAAU,CAAA;CAAE,GACnC;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,cAAc,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAE1D;;;;;;;GAOG;AACH,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,sBAAsB,EAC9B,UAAU,EAAE,mBAAmB,EAC/B,MAAM,EAAE,mBAAmB,GAC1B,OAAO,CAAC,aAAa,CAAC,CAgDxB"}