Skip to content

type-safety: adopt brand() at trust boundaries instead of as unknown as casts #150

Description

@aliceout

Contexte

Le système de types brandés (Base64, Base64Url, AesMainKey, HmacMainKey, …) existe dans packages/shared/src/crypto-types.ts et le helper brand<B>() y est défini — mais il n'est jamais appelé. À la place, ~30 sites utilisent value as unknown as Base64 (double-cast), ce qui traverse complètement le branding sans aucune validation. La protection compile-time que les types brandés sont censés offrir (interdire de confondre deux encodages ou deux clés) est donc largement illusoire.

Objectif (option B)

Adopter brand() aux vraies frontières de confiance (là où une string du réseau / du stockage devient une valeur brandée), et laisser le reste du code manipuler le type brandé pour que le compilateur attrape les mélanges. Retirer les as unknown as <Branded> partout où c'est possible.

Sites concernés (non exhaustif, repérés à l'audit)

  • packages/web/src/core/auth/session/*.ts (password, recovery-code, passkeys, login, change-password)
  • packages/web/src/app/flow/Review/views/Wizard.tsx
  • packages/api/src/routes/auth-passkey-*.ts (enroll, login)
  • divers form utils (getByPath/setByPath typés Record<string, unknown>), confirm dialogs, export PDF

Notes

  • Respecter les règles crypto de CLAUDE.md (séparation de domaine HKDF ; les types brandés doivent échouer à la compilation).
  • Tester les round-trips crypto avant de retirer l'ancien code.
  • Effort : M→L (refactor multi-sites). Sa propre PR, sans nouvelle feature.

Issue créée depuis l'audit « corrections / améliorations / optimisations » — point #7.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions