
Extension de navigateur open source pour le chiffrement, déchiffrement et signature PGP. Moteur Rust/WASM avec déverrouillage WebAuthn PRF, protection par mot de passe Argon2id et mémoire remise à zéro.
Extension de navigateur open-source pour le chiffrement, déchiffrement et signature PGP.
Construit avec Rust/WebAssembly. Les clés privées ne touchent jamais le tas JS sauf si nécessaire.
Open source et transparent. La plupart des extensions de navigateur PGP sont en source fermée. Vous ne devriez pas faire confiance à une boîte noire avec vos secrets.
La crypto s'exécute en WASM, pas en JavaScript. Toutes les opérations PGP s'exécutent dans un bac à sable WebAssembly Rust/Sequoia-PGP. JS ne contient qu'un handle entier opaque sur votre clé - les octets réels résident dans la mémoire linéaire WASM et sont remis à zéro lors de la suppression. Les clés privées traversent brièvement JS lors de la génération et de l'importation avant d'être chiffrées et stockées.
Déverrouillage par clé d'accès. Protégez les clés avec WebAuthn PRF - déverrouillez avec Touch ID, Face ID, Windows Hello ou une YubiKey au lieu d'un mot de passe. La sortie PRF est combinée avec un secret stocké via HKDF-SHA256, et l'ensemble du flux de déverrouillage s'exécute en WASM.
Argon2id pour les mots de passe. 64 Mo de mémoire, 3 itérations - résistant à la force brute GPU. Le KDF, le déchiffrement et le stockage des clés se déroulent tous en WASM. Les octets du mot de passe sont remis à zéro des deux côtés immédiatement après utilisation.
Déchiffrement atomique + vérification. Le texte en clair et le résultat de la signature sont renvoyés ensemble dans une seule réponse compacte. Mauvaise signature = aucun texte en clair renvoyé. Pas de fenêtre TOCTOU.
Remise à zéro partout. Crate zeroize sur toutes les clés stockées et intermédiaires (Rust). Uint8Array.fill(0) sur les mots de passe, sorties PRF et clés dérivées (JS). La mémoire WASM n'est pas GC, donc la remise à zéro est déterministe.
AAD par clé. Chaque clé privée est chiffrée avec AES-256-GCM en utilisant des données authentifiées supplémentaires liées à son empreinte. L'échange de blobs entre les emplacements de clés échoue.
.crx) pour les téléchargements CRX vérifiés du Web Store (optionnel ; désactivé par défaut)pnpm install
pnpm dev # serveur de dev avec rechargement à chaud
pnpm test # tests unitaires (vitest) ; tests du moteur Rust : cargo test dans apps/pgp/gpg-wasm
pnpm build # build de production (compile WASM automatiquement)
pnpm zip # paquet pour Chrome Web Store / Firefox Add-ons
Le module WASM doit être compilé à partir des sources. Pour reconstruire manuellement :
cd apps/pgp && pnpm build:wasm
apps/pgp/ Source de l'extension
components/ Interface React
entrypoints/ background + panneau latéral
hooks/ porte-clés, sessions, contacts
lib/pgp/ Wrapper WASM + opérations
lib/protection/ WebAuthn PRF, Argon2id, AES-256-GCM
lib/storage/ chrome.storage avec mutex
gpg-wasm/ Moteur Rust/WASM (sequoia-openpgp)
packages/ui/ Composants shadcn/ui
tooling/ eslint, prettier, tailwind, tsconfig
Construit avec une assistance IA significative (Claude). L'interface utilisateur, la plomberie React, le stockage et le câblage de l'extension ont été largement générés par IA.
Les implémentations cryptographiques - moteur Rust/WASM, protection des clés, WebAuthn PRF, configuration Argon2id - ont été conçues et revues par des humains. Nous ne faisons pas confiance à la crypto basée sur les vibrations.
MIT
| Couche | Mécanisme |
|---|
| Moteur cryptographique | Sequoia-PGP en WASM (clés en JS uniquement pendant la génération/import) |
| Déverrouillage des clés | WebAuthn PRF (clés d'accès) ou Argon2id 64 Mo (mots de passe) |
| Stockage des clés | AES-256-GCM avec AAD par clé |
| Mémoire | Crate zeroize (Rust) + remise à zéro manuelle (JS) |
| Signatures | Déchiffrement atomique + vérification (pas de TOCTOU) |
| Sessions | Verrouillage automatique en cas d'inactivité, fermeture du panneau ou par opération |
| Force brute | Retard exponentiel sur les déverrouillages échoués |
| Périmètre | Pas de scripts de contenu - uniquement le sandbox de l'extension |