Corpus de test public
Nos affirmations de compatibilité des scanners ne valent que les preuves sur lesquelles elles reposent. Cette page est le corpus, les entrées contre lesquelles nous testons nos familles d'encodeurs en régression, plus le comportement de la caméra téléphone que vous pouvez auditer vous-même sans nous croire sur parole.
Télécharger corpus.zip Fixtures JSON + CSV + méthodologie + README. ~4 Ko.
Chargement de la version…
Comment utiliser le corpus
Chaque vecteur de test est dans /test-vectors/fixtures.json. Un objet JSON par type avec les champs d'entrée et les sous-chaînes décodées attendues. Récupéré en temps réel depuis ce site, pas de copies périmées.
Prenez le map fields d'un fixture, entrez les valeurs dans le générateur pour ce type et cliquez Générer. Le QR résultant est bit à bit identique à ce que notre CI traite en aller-retour.
Pointez une caméra iPhone, caméra Android, Google Lens, scanner industriel (Zebra, Honeywell, Datalogic) ou lecteur spécifique à l'app (app bancaire, authentificateur) sur le QR généré. Confirmez que le texte décodé contient chaque sous-chaîne expect de ce fixture.
Si un scanner de votre parc retourne un décodage qui ne correspond pas au fixture, signalez un problème. Nous reproduirons, ajouterons votre scanner à la matrice de compatibilité publique et (si c'est un bug d'encodeur) enverrons un correctif.
Résultats de scan attendus
Généré à partir du même jeu de données que la matrice de compatibilité et la ligne « Scanne sur » de chaque page de type, ces trois éléments ne peuvent donc pas se contredire. Le fichier de fixtures complet sur /test-vectors/ compte 33 entrées, une par famille d'encodeurs que nous testons en régression ; ce n'est pas une ligne par type de produit, et nous ne prétendons pas que ce soit le cas.
| Type | Entrée du fixture | iPhone Camera | Android Camera | Scanner pro |
|---|---|---|---|---|
| URL | https://example.com/test | Ouvre le lienA1 | Ouvre le lienA5 | DécodeA8 |
| WiFi | WIFI:S:MyNet;T:WPA;P:...;; | Rejoint le réseauA1 | Rejoint le réseauA5 | Décode le payloadA8 |
| WiFi Enterprise (EAP) | WPA2-EAP PEAP identity=alice@corp | iOS 17+, signaléU | Décode ; la connexion dépend du fabricantU | Décode le payloadQ |
| vCard | FN=Alice ORG=Acme ... | Ajouter aux ContactsA1 | Ajouter aux ContactsA5 | Décode le payloadA8 |
| TOTP | otpauth://totp/...?secret=JBSW... | L'application d'authentification le litA9, A10 | L'application d'authentification le litA9, A10 | Décode l'URIA8 |
| eSIM | LPA:1$rsp.example.com$K2-LM... | iOS 17.4+ provisionneA4 | Android 13+ provisionneU | Décode l'URIQ |
| Bitcoin (BIP-21) | bitcoin:1A1zP1eP... | Ouvre l'app portefeuilleQ | Ouvre l'app portefeuilleQ | Décode l'URIQ |
| SEPA (EPC) | BCD header + name + IBAN + amount | Chaîne brute uniquementQ | Chaîne brute uniquementQ | Décode la chaîne bruteQ |
| Swiss QR-bill | SPC header + IBAN + address + amount | Chaîne brute uniquementQ | Chaîne brute uniquementQ | Décode la chaîne bruteQ |
| Micro QR | Compact payload | Pas de décodageV, U | Pas de décodageG | Lecteurs industrielsZ |
| rMQR | Rectangular payload | Pas de décodageU | Pas de décodageG | Firmware Zebra, Scandit et Cognex récentsZ |
| GS1 Digital Link | https://id.gs1.org/01/09506000134352 | Ouvre l'URLQ | Ouvre l'URLQ | Le firmware POS analyse les AIQ |
| Aztec | Arbitrary payload | Pas de décodageA2 | Google Lens, certaines variantesA7 | NatifA8 |
| Data Matrix | Arbitrary payload | Pas de décodageA2 | Google LensA6 | NatifA8 |
| PDF417 | AAMVA or arbitrary | Pas de décodageA2 | Google Lens, inégalA7 | NatifA8 |
| AAMVA driver license | @\n\x1e\rANSI 636014100002DL... | Flux compatible permis dès iOS 17A3 | Apps compatibles permis uniquementU | NatifA8 |
| EAN-13 / UPC-A | 0012345678905 | Pas de décodageAp | Google LensG | Chaque POS retailA8 |
| Code 128 | ABC-123 | Pas de décodageAp | Google LensG | NatifA8 |
Comment lire les marques
- ✓: le lit depuis l'application appareil photo native, sans app supplémentaire
- ~: le lit sous une condition indiquée dans la cellule (une app spécifique, une version d'OS ou un mode)
- ✗: ne le décode pas ; il faut une app de scan ou du matériel dédié
Preuve
- A: our own device test; the number is the row in the attestation log
- Ap: Apple's support page describes the Camera app and Code Scanner as reading QR codes and lists no other symbology
- G: Google Lens decodes the ML Kit barcode formats: Codabar, Code 39, Code 93, Code 128, EAN-8, EAN-13, ITF, UPC-A, UPC-E, Aztec, Data Matrix, PDF417 and QR Code; Micro QR and rMQR are not on the list
- Z: Zebra lists Micro QR and rectangular Micro QR among the DS8100 series' 2D symbologies
- V: Apple's Vision framework decodes Micro QR for third-party apps since iOS 15; that is a developer API, not the Camera app
- Q: a standard QR symbol, so decoding is the attested QR result; the question is what the phone does with the payload
- U: not in our attestation log yet; from vendor documentation or field reports, treat as provisional
Ce que signifie "résultat de scan attendu"
- Decodes, Décode, le lecteur natif du téléphone retourne le payload sans avoir besoin d'une app séparée.
- Partial, Partiel, le décodage dépend d'une app spécifique (authentificateur, portefeuille, banque) ou d'une version OS spécifique.
- No decode, Pas de décodage, la caméra native ne retourne rien. Nécessite un scanner ou lecteur spécialisé.
- Les petites lettres après chaque résultat indiquent la preuve : un A suivi d'un chiffre renvoie à une ligne du journal d'attestation ci-dessous ; les autres lettres renvoient à la documentation du fournisseur, indiquée sous chaque tableau. Un U signifie que nous n'avons pas encore fait passer cette cellule par nos propres appareils.
Notes de méthodologie
- Tous les fixtures sont en aller-retour. Notre CI génère chaque code dans Chromium sans tête, le décode via l'API
BarcodeDetectordu navigateur et vérifie la correspondance de sous-chaîne. Un CI vert signifie que le corpus est cohérent en interne. - Les résultats du scanner dans ce tableau proviennent de tests manuels sur de vrais appareils. Pas de synthèse. iPhone 15 Pro sur iOS 18.3, Pixel 8 sur Android 14, imageur Zebra DS8100 sur firmware CAAACS00-002-R06.
- Nous publions les résultats négatifs. Si la caméra iPhone refuse de décoder une symbologie (Data Matrix, Aztec, PDF417), c'est un 'Pas de décodage' dans le tableau, pas un renommage de 'lecteur natif'.
- Le corpus est versionné. Quand nous ajoutons un type ou corrigeons un bug d'encodeur, l'entrée fixture correspondante est expédiée dans le même commit. Le journal des modifications enregistre chaque changement de fixture, et corpus.VERSION.txt porte le hash du fichier de fixtures à partir duquel le ZIP actuel a été construit.
Journal d'attestation du parc de scanners
Chaque passage manuel sur un appareil, daté. Des lignes sont ajoutées lorsque nous acquérons du matériel ou qu'un utilisateur signale une divergence ; un résultat ne change jamais silencieusement, il obtient une nouvelle ligne.
| # | Device | OS / app | Corpus slice | Result | Date | Notes |
|---|---|---|---|---|---|---|
| A1 | iPhone 15 Pro | iOS 18.3, native Camera | All QR fixtures | pass | 2026-04-10 | |
| A2 | iPhone 15 Pro | iOS 18.3, native Camera | Aztec, PDF417, Data Matrix | fail | 2026-04-10 | Aucun ne décode nativement (attendu, voir /standards/non-qr-2d/) |
| A3 | iPhone 15 Pro | iOS 18.3, native Camera | AAMVA PDF417 | partial | 2026-04-10 | Le flux compatible permis d'iOS 17+ propose Ajouter au Wallet ; le PDF417 brut n'est pas retourné |
| A4 | iPhone 15 Pro | iOS 18.3, Wallet | eSIM LPA | pass | 2026-04-12 | Le flux d'ajout d'eSIM se déclenche correctement |
| A5 | Pixel 8 | Android 14, native Camera | All QR fixtures | pass | 2026-04-10 | |
| A6 | Pixel 8 | Android 14, Google Lens | Data Matrix | pass | 2026-04-10 | |
| A7 | Pixel 8 | Android 14, Google Lens | Aztec, PDF417 | partial | 2026-04-10 | Certaines variantes décodent ; le support est inégal |
| A8 | Zebra DS8100 | firmware CAAACS00-002-R06 | All 2D + 1D fixtures | pass | 2026-04-11 | Imageur industriel, référence canonique |
| A9 | Google Authenticator | v7.0+ (iOS/Android) | TOTP, HOTP | pass | 2026-04-12 | SHA-1 uniquement, 6 chiffres (ignore les paramètres algorithme/chiffres selon le profil de facto de Google) |
| A10 | 1Password | v8 (iOS/Android/macOS) | TOTP, HOTP | pass | 2026-04-12 | Support RFC complet incl. SHA-256, SHA-512, 8 chiffres |
À venir
- Artefacts pré-rendus. Le ZIP actuel inclut fixtures + méthodologie + CSV. Une future révision ajoutera du SVG + PNG pré-rendus de chaque fixture pour que vous puissiez les intégrer directement dans un harness de parc de scanners. Étape de navigateur sans tête au moment de la compilation en attente.
- Attestation du parc de scanners. Le journal d'appareils daté est publié sur cette page et s'agrandit à chaque vérification contre un nouvel appareil.
- Vérification tierce. Un laboratoire de sécurité indépendant exécute le corpus sur un parc de scanners et publie une attestation signée. En attente, commandé ; le rapport sera publié ici à son arrivée.
Voir aussi
- /test-vectors/, JSON complet des fixtures et tableau consultable.
- /compatibility/, matrice de compatibilité des scanners en direct.
- /standards/, pages de référence par standard.
- /print-size/, guide d'impression physique qui accompagne le corpus.