passkey-kit 0.16.4 → 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.
- package/README.md +72 -33
- package/dist/contract-errors.d.ts +1 -1
- package/dist/contract-errors.d.ts.map +1 -1
- package/dist/contract-errors.js +6 -2
- package/dist/contract-errors.js.map +1 -1
- package/dist/errors.d.ts +7 -0
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +11 -0
- package/dist/errors.js.map +1 -1
- package/dist/index.d.ts +3 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/indexer/index.d.ts +1 -1
- package/dist/indexer/index.d.ts.map +1 -1
- package/dist/indexer/index.js.map +1 -1
- package/dist/indexer/mercury.d.ts +8 -12
- package/dist/indexer/mercury.d.ts.map +1 -1
- package/dist/indexer/mercury.js +110 -37
- package/dist/indexer/mercury.js.map +1 -1
- package/dist/indexer/types.d.ts +41 -5
- package/dist/indexer/types.d.ts.map +1 -1
- package/dist/kit/birth-verification.d.ts +45 -0
- package/dist/kit/birth-verification.d.ts.map +1 -0
- package/dist/kit/birth-verification.js +127 -0
- package/dist/kit/birth-verification.js.map +1 -0
- package/dist/kit/deploy-ops.d.ts +2 -2
- package/dist/kit/deploy-ops.d.ts.map +1 -1
- package/dist/kit/deploy-ops.js +2 -2
- package/dist/kit/deploy-ops.js.map +1 -1
- package/dist/kit/wallet-ops.d.ts +14 -2
- package/dist/kit/wallet-ops.d.ts.map +1 -1
- package/dist/kit/wallet-ops.js +50 -3
- package/dist/kit/wallet-ops.js.map +1 -1
- package/dist/kit/webauthn-ops.d.ts +3 -1
- package/dist/kit/webauthn-ops.d.ts.map +1 -1
- package/dist/kit/webauthn-ops.js +8 -2
- package/dist/kit/webauthn-ops.js.map +1 -1
- package/dist/kit/webauthn-verify.d.ts +166 -0
- package/dist/kit/webauthn-verify.d.ts.map +1 -0
- package/dist/kit/webauthn-verify.js +328 -0
- package/dist/kit/webauthn-verify.js.map +1 -0
- package/dist/kit.d.ts +63 -41
- package/dist/kit.d.ts.map +1 -1
- package/dist/kit.js +339 -115
- package/dist/kit.js.map +1 -1
- package/dist/managers/credential-manager.d.ts +2 -2
- package/dist/managers/credential-manager.d.ts.map +1 -1
- package/dist/managers/credential-manager.js +3 -3
- package/dist/managers/credential-manager.js.map +1 -1
- package/dist/managers/signer-manager.d.ts +10 -4
- package/dist/managers/signer-manager.d.ts.map +1 -1
- package/dist/managers/signer-manager.js +11 -5
- package/dist/managers/signer-manager.js.map +1 -1
- package/dist/managers/submission-manager.d.ts +4 -1
- package/dist/managers/submission-manager.d.ts.map +1 -1
- package/dist/managers/submission-manager.js +11 -3
- package/dist/managers/submission-manager.js.map +1 -1
- package/dist/server.d.ts +7 -5
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +6 -5
- package/dist/server.js.map +1 -1
- package/dist/types.d.ts +10 -2
- package/dist/types.d.ts.map +1 -1
- package/dist/utils.d.ts +4 -8
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +4 -8
- package/dist/utils.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +2 -2
package/dist/kit/wallet-ops.js
CHANGED
|
@@ -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
|
-
|
|
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":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAe,MAAM,0BAA0B,CAAC;
|
|
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,
|
|
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"}
|
package/dist/kit/webauthn-ops.js
CHANGED
|
@@ -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
|
|
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;
|
|
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":"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"}
|