This specification is maintained by the AgentRules Working Group. Have enhancements or want to claim maintainership?Submit Specification →
mobilecritical PriorityID: capacitor-biometric-enclave-ephemeral-nonce-production-standard

Capacitor 7 Biometric Enclave Ephemeral Nonce Challenge Standard

Enforces hardware-backed cryptographic attestation for biometric authentication flows in Capacitor 7 hybrid applications. Eliminates client-side boolean authentication vulnerabilities and credential replay attacks by requiring server-issued ephemeral nonces to be signed directly within the device Secure Enclave or Android KeyStore. Guarantees that compromised runtime environments cannot forge biometric assertions using dynamic instrumentation tools like Frida or Objection.

Prohibited Anti-Pattern: Trusting Client-Side Boolean Biometric Prompts and Static Token Retrieval Without Enclave Nonce Signing

Export Ready-to-Drop Configuration

Select format below to copy code or download file directly.

---
description: Capacitor 7 Biometric Enclave Ephemeral Nonce Challenge Standard - Enforces hardware-backed cryptographic attestation for biometric authentication flows in Capacitor 7 hybrid applications. Eliminates client-side boolean authentication vulnerabilities and credential replay attacks by requiring server-issued ephemeral nonces to be signed directly within the device Secure Enclave or Android KeyStore. Guarantees that compromised runtime environments cannot forge biometric assertions using dynamic instrumentation tools like Frida or Objection.
globs: src/services/**/*.{ts,tsx}, src/auth/**/*.{ts,tsx}, src/plugins/**/*.{ts,tsx}, ios/App/App/**/*.{swift,m}, android/app/src/main/**/*.{java,kt}
alwaysApply: true
verified_by: "agentrules.org"
license: "CC-BY-4.0"
source: "https://agentrules.org/rules/capacitor-biometric-enclave-ephemeral-nonce-production-standard"
---

# Capacitor 7 Biometric Enclave Ephemeral Nonce Challenge Standard

> **Severity**: CRITICAL | **Category**: mobile
> **Anti-Pattern Warning**: Trusting Client-Side Boolean Biometric Prompts and Static Token Retrieval Without Enclave Nonce Signing

## System Constraints
You are a Principal Mobile Security Architect enforcing the Capacitor 7 Biometric Enclave Ephemeral Nonce Challenge Standard. You must strictly reject any biometric implementation that relies on client-side boolean checks (`isSuccess`, `verified === true`), static token unlocking without hardware challenges, or unverified biometric prompt responses. Mandate end-to-end cryptographic challenge-response validation using ephemeral server nonces signed inside the iOS Secure Enclave or Android hardware-backed KeyStore.

## Strict Guidelines
- Engineers MUST ALWAYS fetch a cryptographically random, ephemeral nonce with a strictly enforced TTL (maximum 60 seconds) from the backend authorization server prior to initiating a biometric prompt.
- Engineers MUST NEVER grant authenticated access, mint sessions, or release API tokens based on boolean return values from local authentication plugins (e.g., `result.verified === true` or `NativeBiometric.verifyIdentity()`).
- Services MUST generate private keys in the hardware enclave (iOS Secure Enclave with `kSecAccessControlBiometryCurrentSet` / Android Keystore with `setUserAuthenticationRequired(true)`) and keep them non-exportable.
- Engineers MUST configure biometric keys with strict invalidation policies so that enrollment of new biometric factors (enrolled fingerprints/faces) immediately invalidates existing keys.
- Mobile clients MUST transmit the enclave-generated signature, the public key identifier, and the raw nonce to the backend server for cryptographic verification before session establishment.
- Backend verification services MUST reject nonces that have expired, been previously consumed (replay protection), or fail ECDSA/Ed25519 signature verification against the registered device public key.

## Bad vs Good Implementations
### Biometric Authentication: Boolean Reliance vs. Hardware-Signed Nonce Challenge

#### Bad Antipattern (AI Common Hallucination)
> **Why it fails**: This code relies on a local boolean result (`result.verified`) and unseals a stored static JWT from unencrypted storage. A dynamic instrumentation framework (like Frida or Objection) can hook the plugin method and trivially override the return value to `{ verified: true }`, gaining full access without user interaction or biometric validation.
```typescript
import { NativeBiometric } from 'capacitor-native-biometric';
import { Preferences } from '@capacitor/preferences';

// ANTI-PATTERN: Client-side boolean verification easily bypassed via Frida/Objection
export async function authenticateUser(): Promise<boolean> {
  const result = await NativeBiometric.verifyIdentity({
    reason: 'Please authenticate to log in',
    title: 'Biometric Login',
  });

  // VULNERABLE: Frida hook on verifyIdentity can return { verified: true }
  if (result.verified) {
    const storedToken = await Preferences.get({ key: 'auth_token' });
    await fetch('/api/v1/user/profile', {
      headers: { Authorization: `Bearer ${storedToken.value}` },
    });
    return true;
  }

  return false;
}
```

#### Production Standard (Correct)
> **Standard**: This pattern requests a short-lived nonce from the server, binds biometric authentication directly to hardware key usage (signing), and transmits the resulting cryptographic signature to the backend. Bypassing the local UI prompt or hooking local returns fails because the server verifies the enclave signature over the single-use nonce.
```typescript
import { registerPlugin } from '@capacitor/core';

export interface SecureBiometricPlugin {
  signChallenge(options: { challenge: string; keyAlias: string }): Promise<{
    signature: string; // Base64 encoded enclave signature
    algorithm: 'ES256';
  }>;
}

const SecureBiometric = registerPlugin<SecureBiometricPlugin>('SecureBiometricEnclave');

export async function authenticateWithEnclaveChallenge(userId: string): Promise<string> {
  // 1. Fetch ephemeral cryptographically secure nonce from server (TTL <= 60s)
  const challengeResponse = await fetch('/api/v1/auth/biometric/challenge', {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({ userId }),
  });

  if (!challengeResponse.ok) {
    throw new Error('Failed to acquire challenge nonce from server');
  }

  const { challenge, nonceId } = await challengeResponse.json();

  // 2. Unlock hardware key via biometric prompt and sign the challenge inside Enclave/KeyStore
  // The native plugin configures kSecAccessControlBiometryCurrentSet / KeyProperties.PURPOSE_SIGN
  const { signature, algorithm } = await SecureBiometric.signChallenge({
    challenge,
    keyAlias: `user_auth_${userId}`,
  });

  // 3. Transmit signature and nonce identifier to server for cryptographic validation
  const authResponse = await fetch('/api/v1/auth/biometric/verify', {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({
      userId,
      nonceId,
      signature,
      algorithm,
    }),
  });

  if (!authResponse.ok) {
    throw new Error('Biometric cryptographic proof failed or nonce expired');
  }

  const { sessionToken } = await authResponse.json();
  return sessionToken;
}
```

Recommended MCP Servers (mcp-serverlist.com)

Equip agent with system tools to verify code for this stack.

Architectural Specification & Invariant Rationale

Architectural Invariant Design: Capacitor 7 Biometric Enclave Ephemeral Nonce Challenge Standard

Capacitor 7 Biometric Enclave Ephemeral Nonce Challenge Standard defines an industrial-grade behavioral standard for mobile engineering. Enforces hardware-backed cryptographic attestation for biometric authentication flows in Capacitor 7 hybrid applications. Eliminates client-side boolean authentication vulnerabilities and credential replay attacks by requiring server-issued ephemeral nonces to be signed directly within the device Secure Enclave or Android KeyStore. Guarantees that compromised runtime environments cannot forge biometric assertions using dynamic instrumentation tools like Frida or Objection. 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: Trusting Client-Side Boolean Biometric Prompts and Static Token Retrieval Without Enclave Nonce Signing 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 DriftTrusting Client-Side Boolean Biometric Prompts and Static Token Retrieval Without Enclave Nonce SigningCritical
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 fetch a cryptographically random, ephemeral nonce with a strictly enforced TTL (maximum 60 seconds) from the backend authorization server prior to initiating a biometric prompt.

Engineers MUST ALWAYS fetch a cryptographically random, ephemeral nonce with a strictly enforced TTL (maximum 60 seconds) from the backend authorization server prior to initiating a biometric prompt.

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 grant authenticated access, mint sessions, or release API tokens based on boolean return values from local authentication plugins (e.g., `result.verified === true` or `NativeBiometric.verifyIdentity()`).

Engineers MUST NEVER grant authenticated access, mint sessions, or release API tokens based on boolean return values from local authentication plugins (e.g., `result.verified === true` or `NativeBiometric.verifyIdentity()`).

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

Services MUST generate private keys in the hardware enclave (iOS Secure Enclave with `kSecAccessControlBiometryCurrentSet` / Android Keystore with `setUserAuthenticationRequired(true)`) and keep them non-exportable.

Services MUST generate private keys in the hardware enclave (iOS Secure Enclave with `kSecAccessControlBiometryCurrentSet` / Android Keystore with `setUserAuthenticationRequired(true)`) and keep them non-exportable.

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

Engineers MUST configure biometric keys with strict invalidation policies so that enrollment of new biometric factors (enrolled fingerprints/faces) immediately invalidates existing keys.

Engineers MUST configure biometric keys with strict invalidation policies so that enrollment of new biometric factors (enrolled fingerprints/faces) immediately invalidates existing keys.

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

Mobile clients MUST transmit the enclave-generated signature, the public key identifier, and the raw nonce to the backend server for cryptographic verification before session establishment.

Mobile clients MUST transmit the enclave-generated signature, the public key identifier, and the raw nonce to the backend server for cryptographic verification before session establishment.

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

Backend verification services MUST reject nonces that have expired, been previously consumed (replay protection), or fail ECDSA/Ed25519 signature verification against the registered device public key.

Backend verification services MUST reject nonces that have expired, been previously consumed (replay protection), or fail ECDSA/Ed25519 signature verification against the registered device public key.

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 Capacitor 7 Biometric Enclave Ephemeral Nonce Challenge Standard critical for AI coding assistants?

Enforces hardware-backed cryptographic attestation for biometric authentication flows in Capacitor 7 hybrid applications. Eliminates client-side boolean authentication vulnerabilities and credential replay attacks by requiring server-issued ephemeral nonces to be signed directly within the device Secure Enclave or Android KeyStore. Guarantees that compromised runtime environments cannot forge biometric assertions using dynamic instrumentation tools like Frida or Objection. 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 (Trusting Client-Side Boolean Biometric Prompts and Static Token Retrieval Without Enclave Nonce Signing) 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.

Related MOBILE Rules

View all rules →
1 Rule in Stack

Capacitor