This specification is maintained by the AgentRules Working Group. Have enhancements or want to claim maintainership?Submit Specification →
securitycritical PriorityID: webauthn-largeblob-secret-partitioning-standard

WebAuthn LargeBlob Hardware-Bound Secret Partitioning & Exhaustion Guardrail

Enforces AEAD encryption, strict byte budget allocation, and versioned envelope partitioning for WebAuthn largeBlob extension payloads. Prevents silent authenticator storage exhaustion, cross-tenant key corruption, and unauthenticated secret exfiltration from client memory.

Prohibited Anti-Pattern: Writing Unbounded, Unencrypted Payloads Directly into WebAuthn largeBlob Extensions

Export Ready-to-Drop Configuration

Select format below to copy code or download file directly.

---
description: WebAuthn LargeBlob Hardware-Bound Secret Partitioning & Exhaustion Guardrail - Enforces AEAD encryption, strict byte budget allocation, and versioned envelope partitioning for WebAuthn largeBlob extension payloads. Prevents silent authenticator storage exhaustion, cross-tenant key corruption, and unauthenticated secret exfiltration from client memory.
globs: src/**/auth/**/*.{ts,tsx}, src/**/passkey/**/*.{ts,tsx}, src/**/crypto/**/*.{ts,tsx}, src/**/webauthn/**/*.{ts,tsx}
alwaysApply: true
verified_by: "agentrules.org"
license: "CC-BY-4.0"
source: "https://agentrules.org/rules/webauthn-largeblob-secret-partitioning-standard"
---

# WebAuthn LargeBlob Hardware-Bound Secret Partitioning & Exhaustion Guardrail

> **Severity**: CRITICAL | **Category**: security
> **Anti-Pattern Warning**: Writing Unbounded, Unencrypted Payloads Directly into WebAuthn largeBlob Extensions

## System Constraints
You are a Principal Security Architect enforcing the WebAuthn LargeBlob Hardware-Bound Secret Partitioning Standard. FIDO2/WebAuthn authenticators have strictly limited, non-volatile storage capacities (often < 2KB total) and lack native confidentiality guarantees across client origins. You must mandate AEAD client-side encryption (AES-256-GCM or ChaCha20-Poly1305), pre-flight byte budget verification (ceiling at 1024 bytes), partition envelope headers, and explicit verification of the authenticator write status.

## Strict Guidelines
- Engineers MUST ALWAYS encrypt largeBlob payloads using AEAD (AES-256-GCM) with an authenticated derivation key (e.g., from WebAuthn PRF or client KMS) before calling navigator.credentials.get() with largeBlob.write.
- Engineers MUST ALWAYS enforce strict pre-flight byte budget verification asserting payload.byteLength <= MAX_BLOB_BYTES (default: 1024) before calling the WebAuthn API.
- Code MUST partition the blob with a binary envelope containing a schema version header, 12-byte initialization vector, and authentication tag to guarantee cryptographically verifiable unpacking.
- Services MUST explicitly assert that cred.getClientExtensionResults().largeBlob?.written === true and handle storage overflow exceptions deterministically.
- Components NEVER write raw JSON, plaintext recovery phrases, or uncompressed session identifiers to largeBlob storage.

## Bad vs Good Implementations
### Unbounded Plaintext largeBlob Write vs. Partitioned Encrypted Envelope with Budget Control

#### Bad Antipattern (AI Common Hallucination)
> **Why it fails**: The code writes unencrypted secrets into the authenticator, exposing client data if the hardware key is inspected or shared. It also performs no byte-budget checks, causing silent write failures when authenticator capacity is exceeded, and never checks whether largeBlob.written was successful.
```typescript
export async function saveAuthenticatorSecret(credentialId: Uint8Array, secret: string): Promise<void> {
  // Anti-pattern: Serializing unencrypted plaintext directly into largeBlob without size checks
  const encoder = new TextEncoder();
  const rawData = encoder.encode(secret);

  await navigator.credentials.get({
    publicKey: {
      challenge: crypto.getRandomValues(new Uint8Array(32)),
      allowCredentials: [{ id: credentialId, type: 'public-key' }],
      extensions: {
        largeBlob: {
          // Security failure: Unencrypted PII/secret written directly to authenticator
          // Operational failure: No verification against authenticator storage limits
          write: rawData.buffer,
        },
      },
    },
  });
  // Flaw: Silent write failures ignored; extension status never inspected
}
```

#### Production Standard (Correct)
> **Standard**: The payload is encrypted via AES-GCM using an authenticated key, structured into an explicit versioned envelope, verified against a 1024-byte authenticator budget constraint, and asserted against the largeBlob.written extension result.
```typescript
const MAX_LARGE_BLOB_PAYLOAD_BYTES = 1024;
const CURRENT_ENVELOPE_VERSION = 0x01;

interface EncryptedBlobEnvelope {
  version: number;
  iv: Uint8Array;
  ciphertext: Uint8Array;
}

export async function saveAuthenticatorSecret(
  credentialId: Uint8Array,
  secret: Uint8Array,
  kekKey: CryptoKey
): Promise<void> {
  const iv = crypto.getRandomValues(new Uint8Array(12));
  const ciphertextBuffer = await crypto.subtle.encrypt(
    { name: 'AES-GCM', iv },
    kekKey,
    secret
  );

  const ciphertext = new Uint8Array(ciphertextBuffer);
  const totalSize = 1 + iv.byteLength + ciphertext.byteLength;

  if (totalSize > MAX_LARGE_BLOB_PAYLOAD_BYTES) {
    throw new RangeError(`largeBlob payload size ${totalSize}B exceeds ceiling of ${MAX_LARGE_BLOB_PAYLOAD_BYTES}B`);
  }

  const envelope = new Uint8Array(totalSize);
  envelope[0] = CURRENT_ENVELOPE_VERSION;
  envelope.set(iv, 1);
  envelope.set(ciphertext, 1 + iv.byteLength);

  const assertion = (await navigator.credentials.get({
    publicKey: {
      challenge: crypto.getRandomValues(new Uint8Array(32)),
      allowCredentials: [{ id: credentialId, type: 'public-key' }],
      extensions: {
        largeBlob: { write: envelope.buffer },
      },
    },
  })) as PublicKeyCredential | null;

  if (!assertion) {
    throw new Error('WebAuthn assertion failed or cancelled');
  }

  const extResults = assertion.getClientExtensionResults();
  if (extResults.largeBlob?.written !== true) {
    throw new Error('Authenticator largeBlob storage exhausted or write rejected');
  }
}
```

Architectural Specification & Invariant Rationale

Architectural Invariant Design: WebAuthn LargeBlob Hardware-Bound Secret Partitioning & Exhaustion Guardrail

WebAuthn LargeBlob Hardware-Bound Secret Partitioning & Exhaustion Guardrail defines an industrial-grade behavioral standard for security engineering. Enforces AEAD encryption, strict byte budget allocation, and versioned envelope partitioning for WebAuthn largeBlob extension payloads. Prevents silent authenticator storage exhaustion, cross-tenant key corruption, and unauthenticated secret exfiltration from client memory. 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: Writing Unbounded, Unencrypted Payloads Directly into WebAuthn largeBlob Extensions 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 DriftWriting Unbounded, Unencrypted Payloads Directly into WebAuthn largeBlob ExtensionsCritical
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 encrypt largeBlob payloads using AEAD (AES-256-GCM) with an authenticated derivation key (e.g., from WebAuthn PRF or client KMS) before calling navigator.credentials.get() with largeBlob.write.

Engineers MUST ALWAYS encrypt largeBlob payloads using AEAD (AES-256-GCM) with an authenticated derivation key (e.g., from WebAuthn PRF or client KMS) before calling navigator.credentials.get() with largeBlob.write.

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 ALWAYS enforce strict pre-flight byte budget verification asserting payload.byteLength <= MAX_BLOB_BYTES (default

Engineers MUST ALWAYS enforce strict pre-flight byte budget verification asserting payload.byteLength <= MAX_BLOB_BYTES (default: 1024) before calling the WebAuthn API.

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

Code MUST partition the blob with a binary envelope containing a schema version header, 12-byte initialization vector, and authentication tag to guarantee cryptographically verifiable unpacking.

Code MUST partition the blob with a binary envelope containing a schema version header, 12-byte initialization vector, and authentication tag to guarantee cryptographically verifiable unpacking.

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

Services MUST explicitly assert that cred.getClientExtensionResults().largeBlob?.written === true and handle storage overflow exceptions deterministically.

Services MUST explicitly assert that cred.getClientExtensionResults().largeBlob?.written === true and handle storage overflow exceptions deterministically.

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

Components NEVER write raw JSON, plaintext recovery phrases, or uncompressed session identifiers to largeBlob storage.

Components NEVER write raw JSON, plaintext recovery phrases, or uncompressed session identifiers to largeBlob storage.

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 LargeBlob Hardware-Bound Secret Partitioning & Exhaustion Guardrail critical for AI coding assistants?

Enforces AEAD encryption, strict byte budget allocation, and versioned envelope partitioning for WebAuthn largeBlob extension payloads. Prevents silent authenticator storage exhaustion, cross-tenant key corruption, and unauthenticated secret exfiltration from client memory. 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 (Writing Unbounded, Unencrypted Payloads Directly into WebAuthn largeBlob Extensions) 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