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.
Contexte
Le système de types brandés (
Base64,Base64Url,AesMainKey,HmacMainKey, …) existe danspackages/shared/src/crypto-types.tset le helperbrand<B>()y est défini — mais il n'est jamais appelé. À la place, ~30 sites utilisentvalue 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 lesas 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.tsxpackages/api/src/routes/auth-passkey-*.ts(enroll, login)getByPath/setByPathtypésRecord<string, unknown>), confirm dialogs, export PDFNotes
Issue créée depuis l'audit « corrections / améliorations / optimisations » — point #7.