This specification is maintained by the AgentRules Working Group. Have enhancements or want to claim maintainership?Submit Specification →
securitycritical PriorityID: webauthn-prf-zk-key-derivation-boundary

WebAuthn PRF Deterministic Zero-Knowledge Key Derivation Boundary

Enforces a strict cryptographic boundary for WebAuthn Pseudo-Random Function (PRF) extension key derivation. Mandates that raw PRF outputs and intermediate key material are imported strictly as non-extractable CryptoKey instances, isolated within client memory, and derived via HKDF so that zero-knowledge root symmetric credentials never traverse the wire or persist into unmanaged storage.

Prohibited Anti-Pattern: Exposing Raw WebAuthn PRF Outputs Over the Wire or Storing Extractable Master Keys in Persistent Client Storage

Export Ready-to-Drop Configuration

Select format below to copy code or download file directly.

---
description: WebAuthn PRF Deterministic Zero-Knowledge Key Derivation Boundary - Enforces a strict cryptographic boundary for WebAuthn Pseudo-Random Function (PRF) extension key derivation. Mandates that raw PRF outputs and intermediate key material are imported strictly as non-extractable CryptoKey instances, isolated within client memory, and derived via HKDF so that zero-knowledge root symmetric credentials never traverse the wire or persist into unmanaged storage.
globs: src/**/*.{ts,tsx}, lib/**/*.{ts,tsx}
alwaysApply: true
verified_by: "agentrules.org"
license: "CC-BY-4.0"
source: "https://agentrules.org/rules/webauthn-prf-zk-key-derivation-boundary"
---

# WebAuthn PRF Deterministic Zero-Knowledge Key Derivation Boundary

> **Severity**: CRITICAL | **Category**: security
> **Anti-Pattern Warning**: Exposing Raw WebAuthn PRF Outputs Over the Wire or Storing Extractable Master Keys in Persistent Client Storage

## System Constraints
You are a Principal Security Architect enforcing zero-knowledge client-side encryption boundaries. You must reject any implementation where WebAuthn PRF (hmac-secret) outputs, derived root symmetric keys, or intermediate cryptographic salts are transmitted to the server, logged to telemetries, stored in localStorage/sessionStorage/IndexedDB, or imported as extractable WebCrypto keys. Ensure all symmetric cryptographic keys derived from authenticator PRF outputs remain non-extractable and are scrubbed from ephemeral memory buffers immediately after derivation.

## Strict Guidelines
- Engineers MUST ALWAYS import WebAuthn PRF outputs as non-extractable (`extractable: false`) CryptoKey objects using the Web Cryptography API (`crypto.subtle.importKey`).
- Engineers MUST NEVER serialize, log, or transmit raw PRF output buffers (`first`, `second`) or derived master key material across network boundaries.
- Engineers MUST ALWAYS pass the raw PRF output through a standards-compliant key derivation function (HKDF-SHA-256) with application-specific context info before utilizing it for payload encryption/decryption.
- Code MUST explicitly zero out transient ArrayBuffers and Uint8Arrays containing raw PRF secret bytes immediately after importing into `crypto.subtle` by overwriting them with `buffer.fill(0)`.
- Services MUST NEVER accept client PRF outputs on the backend; the backend's role in zero-knowledge architectures is solely storing authenticator credential IDs, nonces, and encrypted ciphertext envelopes.
- Components NEVER store derived cryptographic keys or PRF outputs in persistent client storage mechanisms (`localStorage`, `sessionStorage`, `IndexedDB`, or cookies).

## Bad vs Good Implementations
### Deriving Non-Extractable CryptoKey via WebAuthn PRF and HKDF

#### Bad Antipattern (AI Common Hallucination)
> **Why it fails**: Transmits raw PRF outputs to the server, violating zero-knowledge guarantees. Persists high-entropy secret material in localStorage (vulnerable to XSS), and imports the key as extractable (`true`), allowing malicious extensions or scripts to export the raw key.
```typescript
// CRITICAL SECURITY FLAW: Leaking PRF material and creating extractable keys
export async function deriveKeyAndSync(assertion: AuthenticationCredential) {
  const extensionResults = assertion.getClientExtensionResults();
  const rawPrf = extensionResults.prf?.results?.first;
  if (!rawPrf) throw new Error("PRF output missing");

  // Flaw 1: Sending raw PRF output to backend
  await fetch("/api/user/sync-key", {
    method: "POST",
    body: JSON.stringify({ prfSecret: Array.from(new Uint8Array(rawPrf)) }),
  });

  // Flaw 2: Storing extractable key material in unmanaged client storage
  localStorage.setItem("master_key", btoa(String.fromCharCode(...new Uint8Array(rawPrf))));

  // Flaw 3: Extractable WebCrypto key allows memory dump theft
  return crypto.subtle.importKey(
    "raw",
    rawPrf,
    { name: "AES-GCM" },
    true, // Extractable!
    ["encrypt", "decrypt"]
  );
}
```

#### Production Standard (Correct)
> **Standard**: Enforces zero-knowledge boundaries: PRF outputs never leave the browser runtime, are imported into non-extractable HKDF keys, pass through domain-separated derivation for AES-GCM, and raw transient buffers are scrubbed immediately in a `finally` block.
```typescript
// SECURE: Zero-knowledge non-extractable derivation with memory scrubbing
export async function deriveZeroKnowledgeKey(
  assertion: AuthenticationCredential,
  salt: Uint8Array,
  contextInfo: string
): Promise<CryptoKey> {
  const extensionResults = assertion.getClientExtensionResults();
  const prfOutput = extensionResults.prf?.results?.first;
  if (!prfOutput) {
    throw new Error("Authenticator does not support PRF or PRF output is missing");
  }

  const prfBytes = new Uint8Array(prfOutput);
  let hkdfKey: CryptoKey | null = null;

  try {
    // 1. Import raw PRF bytes as an intermediate non-extractable HKDF master secret
    hkdfKey = await crypto.subtle.importKey(
      "raw",
      prfBytes,
      { name: "HKDF" },
      false, // Strictly non-extractable
      ["deriveKey"]
    );

    const infoBuffer = new TextEncoder().encode(contextInfo);

    // 2. Derive operational symmetric encryption key (AES-GCM)
    return await crypto.subtle.deriveKey(
      {
        name: "HKDF",
        hash: "SHA-256",
        salt,
        info: infoBuffer,
      },
      hkdfKey,
      { name: "AES-GCM", length: 256 },
      false, // Strictly non-extractable
      ["encrypt", "decrypt"]
    );
  } finally {
    // 3. Guaranteed zeroization of ephemeral memory buffers
    prfBytes.fill(0);
  }
}
```

Architectural Specification & Invariant Rationale

Architectural Invariant Design: WebAuthn PRF Deterministic Zero-Knowledge Key Derivation Boundary

WebAuthn PRF Deterministic Zero-Knowledge Key Derivation Boundary defines an industrial-grade behavioral standard for security engineering. Enforces a strict cryptographic boundary for WebAuthn Pseudo-Random Function (PRF) extension key derivation. Mandates that raw PRF outputs and intermediate key material are imported strictly as non-extractable CryptoKey instances, isolated within client memory, and derived via HKDF so that zero-knowledge root symmetric credentials never traverse the wire or persist into unmanaged storage. Modern software architectures require strict adherence to deterministic patterns to guarantee high availability, maintainability, and zero security vulnerabilities.

Framework Paradigm Shift & Drift MechanicsLLMs are trained on millions of open-source repositories containing outdated code, legacy idioms, and unpatched antipatterns. When coding assistants generate implementations for this stack, they default to common statistical tokens: Exposing Raw WebAuthn PRF Outputs Over the Wire or Storing Extractable Master Keys in Persistent Client Storage Without an explicit system instruction file, developers spend hours debugging silent failures.
Failure Modes & Production Blast Radius

Hazard Analysis: What Breaks Without This Rule

The following failure modes have been cataloged from hundreds of hours of production code reviews where AI assistants produced non-compliant implementations:

Failure ModeAI Symptom (The Anti-Pattern)SeverityProduction Impact & Remedy
AI Hallucination & Deprecation DriftExposing Raw WebAuthn PRF Outputs Over the Wire or Storing Extractable Master Keys in Persistent Client StorageCritical
Violating this industrial standard introduces regression bugs, security risks, and unexpected runtime failures in production.
Enforce explicit behavioral system directives across all AI coding assistants in your repository.
Silent Architecture InconsistencyAI assistants produce mixed paradigms across files, creating fragmented codebase conventions.Medium
Increases cognitive load during code reviews and leads to maintenance debt across engineering teams.
Pin project conventions in .cursor/rules, CLAUDE.md, and AGENTS.md so all team agents follow identical guardrails.
Architectural Directives in Detail

Step-by-Step Production Directives

Each rule constraint below is injected into the AI agent's system prompt to establish deterministic boundaries:

1

Engineers MUST ALWAYS import WebAuthn PRF outputs as non-extractable (`extractable

Engineers MUST ALWAYS import WebAuthn PRF outputs as non-extractable (`extractable: false`) CryptoKey objects using the Web Cryptography API (`crypto.subtle.importKey`).

Rationale:AI models frequently generate unconstrained code here because statistical language distributions lack project-specific architectural context. Mandating this directive ensures that generated code adheres to verified industrial production requirements.
Enforcement:Integrated into the Agent Pack rule file. When Cursor, Claude Code, or Codex processes this prompt, it applies this constraint before emitting syntax.
2

Engineers MUST NEVER serialize, log, or transmit raw PRF output buffers (`first`, `second`) or derived master key material across network boundaries.

Engineers MUST NEVER serialize, log, or transmit raw PRF output buffers (`first`, `second`) or derived master key material across network boundaries.

Rationale:AI models frequently generate unconstrained code here because statistical language distributions lack project-specific architectural context. Mandating this directive ensures that generated code adheres to verified industrial production requirements.
Enforcement:Integrated into the Agent Pack rule file. When Cursor, Claude Code, or Codex processes this prompt, it applies this constraint before emitting syntax.
3

Engineers MUST ALWAYS pass the raw PRF output through a standards-compliant key derivation function (HKDF-SHA-256) with application-specific context info before utilizing it for payload encryption/decryption.

Engineers MUST ALWAYS pass the raw PRF output through a standards-compliant key derivation function (HKDF-SHA-256) with application-specific context info before utilizing it for payload encryption/decryption.

Rationale:AI models frequently generate unconstrained code here because statistical language distributions lack project-specific architectural context. Mandating this directive ensures that generated code adheres to verified industrial production requirements.
Enforcement:Integrated into the Agent Pack rule file. When Cursor, Claude Code, or Codex processes this prompt, it applies this constraint before emitting syntax.
4

Code MUST explicitly zero out transient ArrayBuffers and Uint8Arrays containing raw PRF secret bytes immediately after importing into `crypto.subtle` by overwriting them with `buffer.fill(0)`.

Code MUST explicitly zero out transient ArrayBuffers and Uint8Arrays containing raw PRF secret bytes immediately after importing into `crypto.subtle` by overwriting them with `buffer.fill(0)`.

Rationale:AI models frequently generate unconstrained code here because statistical language distributions lack project-specific architectural context. Mandating this directive ensures that generated code adheres to verified industrial production requirements.
Enforcement:Integrated into the Agent Pack rule file. When Cursor, Claude Code, or Codex processes this prompt, it applies this constraint before emitting syntax.
5

Services MUST NEVER accept client PRF outputs on the backend

Services MUST NEVER accept client PRF outputs on the backend; the backend's role in zero-knowledge architectures is solely storing authenticator credential IDs, nonces, and encrypted ciphertext envelopes.

Rationale:AI models frequently generate unconstrained code here because statistical language distributions lack project-specific architectural context. Mandating this directive ensures that generated code adheres to verified industrial production requirements.
Enforcement:Integrated into the Agent Pack rule file. When Cursor, Claude Code, or Codex processes this prompt, it applies this constraint before emitting syntax.
6

Components NEVER store derived cryptographic keys or PRF outputs in persistent client storage mechanisms (`localStorage`, `sessionStorage`, `IndexedDB`, or cookies).

Components NEVER store derived cryptographic keys or PRF outputs in persistent client storage mechanisms (`localStorage`, `sessionStorage`, `IndexedDB`, or cookies).

Rationale:AI models frequently generate unconstrained code here because statistical language distributions lack project-specific architectural context. Mandating this directive ensures that generated code adheres to verified industrial production requirements.
Enforcement:Integrated into the Agent Pack rule file. When Cursor, Claude Code, or Codex processes this prompt, it applies this constraint before emitting syntax.
Technical Questions & Answers

Frequently Asked Technical Questions

Common questions developers face when configuring AI coding assistants for this stack:

Q:Why is WebAuthn PRF Deterministic Zero-Knowledge Key Derivation Boundary critical for AI coding assistants?

Enforces a strict cryptographic boundary for WebAuthn Pseudo-Random Function (PRF) extension key derivation. Mandates that raw PRF outputs and intermediate key material are imported strictly as non-extractable CryptoKey instances, isolated within client memory, and derived via HKDF so that zero-knowledge root symmetric credentials never traverse the wire or persist into unmanaged storage. Without explicit behavioral boundaries, AI coding assistants (Cursor, Claude Code, Windsurf, Codex) rely on training data averages, which frequently produce deprecated, inefficient, or vulnerable code patterns.

Q:How does adopting this rule prevent AI hallucinations?

This rule explicitly declares what the AI must avoid (Exposing Raw WebAuthn PRF Outputs Over the Wire or Storing Extractable Master Keys in Persistent Client Storage) and prescribes verified positive examples. Grounding the LLM with negative and positive pairs eliminates guesswork.

Q:Which AI coding environments are supported?

This specification is multi-platform compatible: Cursor (.cursor/rules/*.mdc & .cursorrules), Anthropic Claude Code (CLAUDE.md), Windsurf (.windsurfrules), Codex / Cline (AGENTS.md), and GitHub Copilot (.github/copilot-instructions.md).

Q:Can I combine this rule with other technology stacks?

Yes. Use the Interactive Stack Builder or download an Agent Pack to merge this rule with other frontend, backend, database, security, and DevOps rules without syntax collision.

Open Specification · CC BY 4.0·Free for Personal, Team & Commercial In-Repo Use

Citation & Open Source Attribution Guidelines

This specification is licensed under Creative Commons Attribution 4.0 International (CC BY 4.0). You are completely free to adapt and share this rule in your workspace. If citing, including in public AI benchmark datasets, or redistributing, attribution to AgentRules.org is required.

1 Rule in Stack

WebAuthn