{"version":3,"sources":["../src/Cavos.ts","../src/recovery/recoveryCode.ts","../src/auth/loginBinding.ts"],"names":["keyId","vault","unwrapKey"],"mappings":"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","file":"chunk-7ZTPQKT4.mjs","sourcesContent":["import { CavosSolana } from \"./chains/solana/CavosSolana\";\nimport { CavosStarknet } from \"./chains/starknet/CavosStarknet\";\nimport type { SolanaRelayer } from \"./chains/solana/SolanaRelayer\";\nimport { TollClient } from \"./chains/solana/TollClient\";\nimport type { SolanaNetwork } from \"./chains/solana/constants\";\nimport { CavosStellar } from \"./chains/stellar/CavosStellar\";\nimport type { StellarRelayer } from \"./chains/stellar/StellarRelayer\";\nimport type { DeviceUnwrapKey } from \"./chains/stellar/DeviceUnwrapKey\";\nimport type { StellarNetwork } from \"./chains/stellar/constants\";\nimport type { StarknetNetwork } from \"./chains/starknet/constants\";\nimport type { Keypair as StellarKeypair } from \"@stellar/stellar-sdk\";\nimport type { AuthProvider, Identity } from \"./auth/AuthProvider\";\nimport type { WalletRegistry } from \"./registry/WalletRegistry\";\nimport { deviceFactorFromUnwrapKey } from \"./secret/factor\";\nimport type { SocialRecoveryClient } from \"./recovery/SocialRecoveryClient\";\nimport type { SocialRecoveryCredential } from \"./recovery/SocialRecoveryCredential\";\nimport type { PasskeyPrfProvider } from \"./signer/PasskeyProvider\";\nimport { VaultClient } from \"./vault/VaultClient\";\n\n/** The chains the unified `Cavos.connect` can target. */\nexport type Chain = \"starknet\" | \"solana\" | \"stellar\";\n\n/**\n * Environment selector. `Cavos.connect` resolves it to the chain's concrete\n * network: starknet → sepolia/mainnet, solana → solana-devnet/solana-mainnet.\n */\nexport type NetworkEnv = \"mainnet\" | \"testnet\";\n\n/** Resolve the abstract `{ chain, network }` to each chain's concrete network. */\nconst STARKNET_ENV: Record<NetworkEnv, StarknetNetwork> = {\n  mainnet: \"mainnet\",\n  testnet: \"sepolia\",\n};\nconst SOLANA_ENV: Record<NetworkEnv, SolanaNetwork> = {\n  mainnet: \"solana-mainnet\",\n  testnet: \"solana-devnet\",\n};\nconst STELLAR_ENV: Record<NetworkEnv, StellarNetwork> = {\n  mainnet: \"stellar-mainnet\",\n  testnet: \"stellar-testnet\",\n};\n\n/**\n * Chain status indicates whether an account is deployed, ready, or needs restoring.\n * - `undeployed`: Address derived but no on-chain account exists yet.\n * - `ready`: This device holds the spend key (and the account exists, where it has to be deployed).\n * - `needs-device-approval`: This device holds no spend key yet; restore it with the enclave or a passkey.\n */\nexport type ChainStatus = \"undeployed\" | \"ready\" | \"needs-device-approval\";\n\n/** A connected wallet: discriminated by `chain`, so `execute()` stays native. */\nexport type CavosWallet = CavosStarknet | CavosSolana | CavosStellar;\n\n/**\n * Multi-chain session returned by `Cavos.connect` when multiple chains are configured.\n * The session IS the default chain's wallet, augmented with methods\n * to access other configured chains without re-connecting.\n *\n * Type-narrow on `wallet.chain` before calling chain-specific `execute()`.\n */\nexport interface CavosSession {\n  /** The configured chains for this session. */\n  readonly chains: Chain[];\n  /** The default chain for this session. */\n  readonly defaultChain: Chain;\n  /**\n   * Get the wallet for a specific configured chain. Throws if the chain is not\n   * in the session's configured `chains`.\n   */\n  wallet(chain: Chain): CavosWallet;\n  /**\n   * Get the status of a specific configured chain. Returns the wallet's\n   * `status` property for that chain.\n   */\n  chainStatus(chain: Chain): ChainStatus;\n  /**\n   * Get the address for a specific configured chain.\n   */\n  chainAddress(chain: Chain): string;\n}\n\nexport interface ConnectOptions {\n  /**\n   * Target chain (single-chain mode). The returned wallet is discriminated by this value.\n   * @deprecated Use `chains` and `defaultChain` for multi-chain sessions.\n   * When `chains` is provided, this is ignored. If only `chain` is provided,\n   * it's treated as `chains: [chain], defaultChain: chain` but connect still\n   * does NOT deploy on connect (lazy deploy on first execute).\n   */\n  chain?: Chain;\n  /**\n   * Chains to configure for this session. Connect derives addresses for all\n   * configured chains but NEVER deploys on connect. Deployment happens lazily\n   * on the first `execute` call for each chain.\n   */\n  chains?: Chain[];\n  /**\n   * Default chain for the session. Must be in `chains`. When using the\n   * single-chain `chain` option, `defaultChain` defaults to that chain.\n   */\n  defaultChain?: Chain;\n  /** Environment. Resolved to sepolia/devnet (testnet) or mainnet per chain. */\n  network: NetworkEnv;\n  /** Authenticated user (pass `identity` directly, or an `auth` provider). */\n  auth?: AuthProvider;\n  identity?: Identity;\n  appSalt: string;\n  /**\n   * Cavos App ID. When set (with `backendUrl`), the kit uses the hosted\n   * WalletRegistry by default for real multi-device support.\n   */\n  appId?: string;\n  /** Cavos console environment. Defaults to production when omitted. */\n  environment?: \"development\" | \"production\";\n  /** Cavos backend base URL. Defaults to https://cavos.xyz. */\n  backendUrl?: string;\n  /**\n   * Off-chain user_id -> wallet map. Defaults to the hosted HttpWalletRegistry\n   * when `appId` is set, else an in-memory registry (single-device only).\n   */\n  registry?: WalletRegistry;\n  rpcUrl?: string;\n  /**\n   * Per-chain RPC overrides. With more than one configured chain a single\n   * `rpcUrl` cannot be right — pointing Starknet at a Solana node answers\n   * `starknet_call` with \"Method not found\" — so this wins over `rpcUrl` for\n   * the chain it names.\n   */\n  rpcUrls?: Partial<Record<Chain, string>>;\n\n  // --- Starknet-only ---\n  /** Cavos paymaster API key (sponsors deploy + execute). Required for Starknet. */\n  paymasterApiKey?: string;\n  paymasterUrl?: string;\n\n  // --- Solana-only ---\n  /** Gasless sponsorship relayer (defaults to the hosted one when `appId` set). */\n  relayer?: SolanaRelayer;\n  /**\n   * Where Toll lives, for `fee: { token }` — the user pays their own fee, in a\n   * token they already hold. Omit it and that route is simply unavailable.\n   */\n  /**\n   * Overrides where the token fee route settles. Defaults to the hosted\n   * service, so `fee: { token }` needs no configuration.\n   */\n  tollUrl?: string;\n  socialRecovery?: SocialRecoveryClient;\n  socialRecoveryCredential?: SocialRecoveryCredential;\n  /**\n   * When the app is not using the enclave, a synced passkey derives the\n   * MasterDEK. The same credential on a new device produces the same address.\n   */\n  passkeyPrf?: PasskeyPrfProvider;\n\n  // --- Stellar-only (classic `G…` multisig) ---\n  /** Gasless sponsorship relayer (defaults to the hosted one when `appId` set). */\n  stellarRelayer?: StellarRelayer;\n  /** Self-funded source/fee-payer Stellar keypair when no relayer is configured. */\n  stellarSourceKeypair?: StellarKeypair;\n  /**\n   * This device's ECDH unwrap key for the Stellar control-key envelope. Defaults\n   * to a persisted `WebCryptoDeviceUnwrapKey` in the browser; pass your own on\n   * React Native / server.\n   */\n  stellarDeviceKey?: DeviceUnwrapKey;\n  /** Create/load the Stellar ECDH unwrap key (native / tests). */\n  createStellarDeviceKey?: (keyId: string) => Promise<DeviceUnwrapKey>;\n\n  /**\n   * Keep the signing keys in the Cavos vault, an iframe on a Cavos origin,\n   * instead of this page's storage. Needs `appId`.\n   */\n  vault?: boolean | { url?: string };\n}\n\n/**\n * Whether this device can already operate the wallet, or needs it restored.\n * - `undeployed`: Address derived but no on-chain account exists yet. First execute will deploy.\n * - `ready`: This device holds the spend key.\n * - `needs-device-approval`: This device holds no spend key yet.\n */\nexport type ConnectStatus = \"undeployed\" | \"ready\" | \"needs-device-approval\";\n\n/**\n * The RPC to use for `chain`.\n *\n * `rpcUrls` names the chain, so it is always safe. The older single `rpcUrl` is\n * only unambiguous when one chain is configured; applied across a multi-chain\n * session it sends every chain's calls to one node, and the node that is wrong\n * answers \"Method not found\" rather than failing usefully.\n */\nfunction rpcFor(chain: Chain, opts: ConnectOptions): string | undefined {\n  const named = opts.rpcUrls?.[chain];\n  if (named) return named;\n  const configured = opts.chains ?? (opts.chain ? [opts.chain] : []);\n  return configured.length > 1 ? undefined : opts.rpcUrl;\n}\n\n/**\n * Unified entry point. Pick a `chain` (or `chains` + `defaultChain`) and a\n * `network` environment; the kit resolves the concrete network and returns\n * a chain-native wallet. The result is a discriminated union (`wallet.chain`),\n * so `execute()` keeps each chain's native signature.\n *\n * Every chain is native: the account key is derived from a MasterDEK, recovery\n * is off-chain (enclave or passkey), and there is no on-chain device list.\n *\n * **Lazy deploy**: Connect NEVER deploys on connect. The first `execute` call\n * on an undeployed chain triggers deployment + the user operation atomically.\n *\n *   const wallet = await Cavos.connect({ chain: \"solana\", network: \"testnet\", identity, appSalt, appId });\n *   if (wallet.chain === \"starknet\") await wallet.execute(calls); // deploys here if needed\n *   else                              await wallet.execute(amount, dest);\n *\n * **Multi-chain**:\n *\n *   const wallet = await Cavos.connect({\n *     chains: [\"solana\", \"stellar\"],\n *     defaultChain: \"stellar\",\n *     network: \"testnet\",\n *     identity,\n *     appSalt,\n *     appId,\n *   });\n *   // wallet.chain is \"stellar\" (the default)\n *   // wallet.wallet(\"solana\") → CavosSolana\n *   // wallet.chainStatus(\"solana\") → \"undeployed\" | \"ready\" | \"needs-device-approval\"\n */\nasync function connect(opts: ConnectOptions): Promise<CavosWallet & CavosSession> {\n  const configuredChains = opts.chains ?? (opts.chain ? [opts.chain] : [\"starknet\" as Chain]);\n  const defaultChain = opts.defaultChain ?? configuredChains[0];\n\n  if (configuredChains.length === 0) {\n    throw new Error(\"kit: at least one chain must be configured\");\n  }\n  if (!configuredChains.includes(defaultChain)) {\n    throw new Error(`kit: defaultChain \"${defaultChain}\" must be in chains [${configuredChains.join(\", \")}]`);\n  }\n\n  const identity = opts.identity ?? (opts.auth ? await opts.auth.authenticate() : undefined);\n  if (!identity) throw new Error(\"kit: connect requires `identity` or `auth`\");\n\n  const wallets = await Promise.all(\n    configuredChains.map((chain) => connectSingleChain(chain, { ...opts, identity })),\n  );\n\n  const walletMap = new Map<Chain, CavosWallet>();\n  for (let i = 0; i < configuredChains.length; i++) {\n    walletMap.set(configuredChains[i], wallets[i]);\n  }\n\n  const defaultWallet = walletMap.get(defaultChain)!;\n\n  const session: CavosSession = {\n    chains: configuredChains,\n    defaultChain,\n    wallet(chain: Chain): CavosWallet {\n      const w = walletMap.get(chain);\n      if (!w) {\n        throw new Error(`kit: chain \"${chain}\" is not configured in this session. Configured chains: [${configuredChains.join(\", \")}]`);\n      }\n      return w;\n    },\n    chainStatus(chain: Chain): ChainStatus {\n      return session.wallet(chain).status;\n    },\n    chainAddress(chain: Chain): string {\n      return session.wallet(chain).address;\n    },\n  };\n\n  return Object.assign(defaultWallet, session);\n}\n\nasync function connectSingleChain(\n  chain: Chain,\n  opts: ConnectOptions & { identity: Identity },\n): Promise<CavosWallet> {\n  if (chain === \"solana\") {\n    const keyId = `${opts.identity.userId}:${opts.appSalt}`;\n    const vault = vaultFor(opts);\n    const unwrapKey = vault\n      ? undefined\n      : opts.stellarDeviceKey ?? (opts.createStellarDeviceKey ? await opts.createStellarDeviceKey(keyId) : undefined);\n    return CavosSolana.connect({\n      network: SOLANA_ENV[opts.network],\n      identity: opts.identity,\n      appSalt: opts.appSalt,\n      ...(opts.auth ? { auth: opts.auth } : {}),\n      ...(opts.appId ? { appId: opts.appId } : {}),\n      ...(opts.environment ? { environment: opts.environment } : {}),\n      ...(opts.backendUrl ? { backendUrl: opts.backendUrl } : {}),\n      ...(opts.registry ? { registry: opts.registry } : {}),\n      ...(rpcFor('solana', opts) ? { rpcUrl: rpcFor('solana', opts)! } : {}),\n      ...(opts.relayer ? { relayer: opts.relayer } : {}),\n      toll: new TollClient(opts.tollUrl ? { baseUrl: opts.tollUrl } : {}),\n      ...(opts.socialRecovery ? { socialRecovery: opts.socialRecovery } : {}),\n      ...(opts.socialRecoveryCredential ? { credential: opts.socialRecoveryCredential } : {}),\n      ...(opts.passkeyPrf ? { passkey: opts.passkeyPrf } : {}),\n      ...(unwrapKey ? { factor: deviceFactorFromUnwrapKey(unwrapKey) } : {}),\n      ...(vault ? { vault } : {}),\n    });\n  }\n  if (chain === \"stellar\") {\n    const keyId = `${opts.identity.userId}:${opts.appSalt}`;\n    const vault = vaultFor(opts);\n    const deviceKey = vault\n      ? undefined\n      : opts.stellarDeviceKey\n        ?? (opts.createStellarDeviceKey\n          ? await opts.createStellarDeviceKey(keyId)\n          : await loadDefaultWebDeviceKey(keyId));\n    return CavosStellar.connect({\n      network: STELLAR_ENV[opts.network],\n      identity: opts.identity,\n      appSalt: opts.appSalt,\n      deviceKey,\n      ...(opts.auth ? { auth: opts.auth } : {}),\n      ...(opts.appId ? { appId: opts.appId } : {}),\n      ...(opts.environment ? { environment: opts.environment } : {}),\n      ...(opts.backendUrl ? { backendUrl: opts.backendUrl } : {}),\n      ...(opts.stellarRelayer ? { relayer: opts.stellarRelayer } : {}),\n      ...(opts.stellarSourceKeypair ? { sourceKeypair: opts.stellarSourceKeypair } : {}),\n      ...(opts.socialRecovery ? { socialRecovery: opts.socialRecovery } : {}),\n      ...(opts.socialRecoveryCredential ? { credential: opts.socialRecoveryCredential } : {}),\n      ...(opts.passkeyPrf ? { passkey: opts.passkeyPrf } : {}),\n      ...(vault ? { vault } : {}),\n    });\n  }\n  if (!opts.paymasterApiKey) {\n    throw new Error(\"kit: `paymasterApiKey` is required for Starknet connections\");\n  }\n  const keyId = `${opts.identity.userId}:${opts.appSalt}`;\n  const vault = vaultFor(opts);\n  const unwrapKey = vault\n    ? undefined\n    : opts.stellarDeviceKey ?? (opts.createStellarDeviceKey ? await opts.createStellarDeviceKey(keyId) : undefined);\n  return CavosStarknet.connect({\n    network: STARKNET_ENV[opts.network],\n    identity: opts.identity,\n    appSalt: opts.appSalt,\n    paymasterApiKey: opts.paymasterApiKey,\n    ...(opts.auth ? { auth: opts.auth } : {}),\n    ...(opts.appId ? { appId: opts.appId } : {}),\n    ...(opts.environment ? { environment: opts.environment } : {}),\n    ...(opts.backendUrl ? { backendUrl: opts.backendUrl } : {}),\n    ...(opts.registry ? { registry: opts.registry } : {}),\n    ...(opts.paymasterUrl ? { paymasterUrl: opts.paymasterUrl } : {}),\n    ...(rpcFor('starknet', opts) ? { rpcUrl: rpcFor('starknet', opts)! } : {}),\n    ...(opts.socialRecovery ? { socialRecovery: opts.socialRecovery } : {}),\n    ...(opts.socialRecoveryCredential ? { credential: opts.socialRecoveryCredential } : {}),\n    ...(opts.passkeyPrf ? { passkey: opts.passkeyPrf } : {}),\n    ...(unwrapKey ? { factor: deviceFactorFromUnwrapKey(unwrapKey) } : {}),\n    ...(vault ? { vault } : {}),\n  });\n}\n\n/** The unified entry point: `Cavos.connect` returns the chain-native wallet for each configured chain. */\nexport const Cavos = { connect };\n\nfunction vaultFor(opts: ConnectOptions): VaultClient | undefined {\n  if (!opts.vault) return undefined;\n  if (!opts.appId) throw new Error(\"kit: the vault needs `appId`\");\n  return VaultClient.attach({\n    appId: opts.appId,\n    ...(typeof opts.vault === \"object\" && opts.vault.url ? { url: opts.vault.url } : {}),\n  });\n}\n\nasync function loadDefaultWebDeviceKey(keyId: string): Promise<DeviceUnwrapKey> {\n  if (typeof indexedDB === \"undefined\" || !globalThis.crypto?.subtle) {\n    throw new Error(\n      \"kit/stellar: this runtime requires createStellarDeviceKey; React Native apps must import @cavos/kit/react-native\",\n    );\n  }\n  const { WebCryptoDeviceUnwrapKey } = await import(\"./chains/stellar/WebCryptoDeviceUnwrapKey\");\n  return WebCryptoDeviceUnwrapKey.loadOrCreate({ keyId });\n}\n","import { randomBytes } from \"@noble/hashes/utils\";\n\n/** How many words make up a recovery code. 16 words @ 8 bits/word = 128 bits. */\nconst CODE_WORDS = 16;\n\n/**\n * Generate a fresh, human-readable recovery code. The caller MUST present this\n * to the user exactly once and never persist it server-side. ~128 bits of\n * entropy encoded as words from a fixed wordlist (BIP39-style but our own list,\n * so we don't pull a dependency on a BIP39 wordfile).\n */\nexport function generateRecoveryCode(): string {\n  const bytes = randomBytes(CODE_WORDS);\n  const words: string[] = [];\n  for (const b of bytes) words.push(WORDLIST[b]);\n  return words.join(\" \");\n}\n\n/**\n * 256 short, unambiguous, lowercase English words. Chosen to be hard to\n * misread and easy to type; not the full BIP39 list (we don't need 2048 — 8\n * bits/word is plenty at 16 words). Keep this list stable: changing it changes\n * the meaning of every existing recovery code. Must stay exactly 256 unique\n * entries so each byte value maps to one word.\n */\nconst WORDLIST = [\n  \"able\", \"acid\", \"amber\", \"apple\", \"arch\", \"arrow\", \"ashen\", \"atlas\",\n  \"axis\", \"badge\", \"baker\", \"balm\", \"banner\", \"basin\", \"beacon\", \"bench\",\n  \"beryl\", \"birch\", \"blade\", \"bloom\", \"bluer\", \"border\", \"brave\", \"brick\",\n  \"brook\", \"cabin\", \"candle\", \"carbon\", \"cargo\", \"cedar\", \"chalk\", \"charm\",\n  \"chrome\", \"cipher\", \"clam\", \"clasp\", \"cliff\", \"clock\", \"cobia\", \"comet\",\n  \"coral\", \"cotton\", \"coves\", \"crane\", \"crest\", \"crow\", \"crystal\", \"curio\",\n  \"dawn\", \"delta\", \"denim\", \"depth\", \"dewy\", \"digger\", \"docks\", \"dover\",\n  \"drift\", \"dunes\", \"eagle\", \"ember\", \"echo\", \"eden\", \"elite\", \"ethic\",\n  \"fable\", \"falcon\", \"fawn\", \"feather\", \"fern\", \"fjord\", \"flame\", \"flint\",\n  \"forest\", \"forge\", \"frost\", \"garnet\", \"gemini\", \"glade\", \"glider\", \"glow\",\n  \"granite\", \"grove\", \"guppy\", \"harbor\", \"haven\", \"hazel\", \"helio\", \"heron\",\n  \"hickory\", \"honey\", \"horizon\", \"ivory\", \"jade\", \"jasper\", \"kestrel\", \"knot\",\n  \"lagoon\", \"lattice\", \"laurel\", \"lavender\", \"lemon\", \"linden\", \"loon\", \"luger\",\n  \"lumen\", \"lunar\", \"mango\", \"maple\", \"marble\", \"marsh\", \"meadow\", \"mercy\",\n  \"mistle\", \"monsoon\", \"morning\", \"moss\", \"nacre\", \"nectar\", \"needle\", \"nimbus\",\n  \"nova\", \"ocean\", \"onyx\", \"orbit\", \"otter\", \"palm\", \"panda\", \"pansy\",\n  \"papaya\", \"passage\", \"pebble\", \"pelican\", \"pepper\", \"petal\", \"piano\", \"pierce\",\n  \"pilot\", \"pioneer\", \"platinum\", \"plume\", \"poplar\", \"porpoise\", \"prairie\", \"prism\",\n  \"pulsar\", \"quartz\", \"quasar\", \"quill\", \"quiver\", \"raven\", \"reef\", \"relic\",\n  \"ridge\", \"ripple\", \"robin\", \"rocket\", \"rouge\", \"ruby\", \"saffron\", \"sage\",\n  \"sail\", \"salmon\", \"sapphire\", \"scarab\", \"shadow\", \"shale\", \"sienna\", \"silica\",\n  \"silver\", \"skyline\", \"slate\", \"sonar\", \"spruce\", \"starling\", \"stone\", \"sugar\",\n  \"summit\", \"sunset\", \"swan\", \"tangent\", \"tarragon\", \"temple\", \"thistle\", \"thrush\",\n  \"tiger\", \"topaz\", \"tundra\", \"turtle\", \"umber\", \"union\", \"valley\", \"vapor\",\n  \"vector\", \"velvet\", \"violet\", \"vortex\", \"walnut\", \"whale\", \"winter\", \"wisp\",\n  \"wisteria\", \"xenon\", \"yarrow\", \"zephyr\", \"zinc\", \"zodiac\", \"anchor\", \"basil\",\n  \"cider\", \"daisy\", \"elfin\", \"ferry\", \"gimlet\", \"halcyon\", \"indigo\", \"juniper\",\n  \"kindle\", \"lilac\", \"mantis\", \"nylon\", \"oracle\", \"parch\", \"quokka\", \"ramble\",\n  \"thatch\", \"ultra\", \"vivid\", \"xylo\", \"yodel\", \"zesty\", \"arbor\", \"bliss\",\n  \"calyx\", \"dwindle\", \"folio\", \"globe\", \"hymn\", \"ionic\", \"jolly\", \"knack\",\n  \"lyric\", \"myrtle\", \"noble\", \"plumb\", \"quaint\", \"rustic\", \"satin\", \"timber\",\n  \"urge\", \"vault\", \"whimsy\", \"yearn\", \"zenith\", \"ash\", \"beach\", \"dusk\",\n];\n","import { sha256 } from \"@noble/hashes/sha256\";\nimport { bytesToBase64Url, utf8ToBytes } from \"../crypto/encoding\";\nimport { ENCLAVE_EMAIL_ISSUER } from \"../recovery/SocialRecoveryCredential\";\n\n/**\n * Binding a provider token to the login that asked for it.\n *\n * Google, Apple and the enclave's email token sign one value the client\n * chooses: the `nonce`. The kit\n * sends the hash of a secret it keeps; the Cavos backend prefixes the app, so\n * the token carries `<app_id>.<base64url(SHA-256(secret))>`. The recovery\n * enclave then only accepts the token together with the secret, which never\n * leaves this client except inside the job encrypted to the enclave.\n *\n * This is the nonce use OpenID Connect Core §15.5.2 describes, with PKCE's\n * S256 transform (RFC 7636 §4.2).\n */\n\n/** A fresh login secret from 32 bytes of randomness. */\nexport function loginSecretFrom(random: Uint8Array): string {\n  if (random.length !== 32) throw new Error(\"kit/auth: a login secret needs 32 random bytes\");\n  return bytesToBase64Url(random);\n}\n\n/** The value sent as the login `nonce`: base64url(SHA-256(secret)). */\nexport function loginNonce(secret: string): string {\n  return bytesToBase64Url(sha256(utf8ToBytes(secret)));\n}\n\n/** Google, Apple and enclave email tokens all carry a nonce this login chose. */\nexport function requiresLoginBinding(issuer: unknown): boolean {\n  return (\n    issuer === \"https://accounts.google.com\" ||\n    issuer === \"accounts.google.com\" ||\n    issuer === \"https://appleid.apple.com\" ||\n    issuer === ENCLAVE_EMAIL_ISSUER\n  );\n}\n\n/**\n * Refuse a token this client did not ask for.\n *\n * OpenID Connect requires it (\"Clients MUST verify that the nonce Claim Value\n * is equal to the value of the nonce parameter sent in the Authentication\n * Request\"). Without it, a callback carrying someone else's one-time code\n * signs the user into that person's account.\n */\nexport function assertLoginBinding(tokenNonce: unknown, secret: string | null): asserts secret is string {\n  if (!secret) {\n    throw new Error(\n      \"kit/auth: this sign-in did not start here, or the browser could not keep its state. Sign in again.\",\n    );\n  }\n  if (typeof tokenNonce !== \"string\" || !tokenNonce.endsWith(`.${loginNonce(secret)}`)) {\n    throw new Error(\"kit/auth: the sign-in response does not match this sign-in. Sign in again.\");\n  }\n}\n"]}