Publiek testcorpus
Onze scannercompatibiliteitsclaims zijn slechts zo goed als het bewijs waarop ze zijn gebaseerd. Deze pagina is het corpus, de invoer waarmee we onze encoderfamilies regressiontesten, plus het telefonische cameragedrag dat je zelf kunt controleren zonder ons op ons woord te geloven.
Corpus.zip downloaden Gebundelde fixtures-JSON + CSV + methodologie + README. ~4 KB.
Versie laden…
Het corpus gebruiken
Elke testvector staat in /test-vectors/fixtures.json. Eén JSON-object per type met de invoervelden en de verwachte gedecodeerde subtekenreeks(en). Live opgehaald van deze site, geen verouderde kopieën.
Neem de fields-map van een fixture, voer de waarden in de generator in voor dat type en klik op Genereer. De resulterende QR is bit-voor-bit identiek aan wat onze CI round-trip test.
Richt een iPhone-camera, Android-camera, Google Lens, industriële scanner (Zebra, Honeywell, Datalogic) of app-specifieke lezer (een bankapp, een authenticator) op de gegenereerde QR. Bevestig dat de gedecodeerde tekst elke expect-subtekenreeks voor die fixture bevat.
Als een scanner in je vloot een decodering teruggeeft die niet overeenkomt met de fixture, dien dan een issue in. We reproduceren, voegen je scanner toe aan de openbare compatibiliteitsmatrix en leveren (als het een encoderbug is) een oplossing.
Verwachte scanresultaten
Gerenderd vanuit dezelfde dataset als de compatibiliteitsmatrix en de regel "Scant op" van elke typepagina, zodat de drie elkaar niet kunnen tegenspreken. Het volledige fixturebestand op /test-vectors/ heeft 33 items, één per encoderfamilie die we regressiontesten; het is geen rij per producttype, en dat beweren we ook niet.
| Type | Fixture-invoer | iPhone Camera | Android Camera | Pro-scanner |
|---|---|---|---|---|
| URL | https://example.com/test | Opent linkA1 | Opent linkA5 | DecodeertA8 |
| WiFi | WIFI:S:MyNet;T:WPA;P:...;; | Verbindt met netwerkA1 | Verbindt met netwerkA5 | Decodeert payloadA8 |
| WiFi Enterprise (EAP) | WPA2-EAP PEAP identity=alice@corp | iOS 17+, gemeldU | Decodeert; verbinden hangt af van de fabrikantU | Decodeert payloadQ |
| vCard | FN=Alice ORG=Acme ... | Toevoegen aan contactenA1 | Toevoegen aan contactenA5 | Decodeert payloadA8 |
| TOTP | otpauth://totp/...?secret=JBSW... | Authenticator-app leest hetA9, A10 | Authenticator-app leest hetA9, A10 | Decodeert URIA8 |
| eSIM | LPA:1$rsp.example.com$K2-LM... | iOS 17.4+ activeertA4 | Android 13+ activeertU | Decodeert URIQ |
| Bitcoin (BIP-21) | bitcoin:1A1zP1eP... | Wallet-app opentQ | Wallet-app opentQ | Decodeert URIQ |
| SEPA (EPC) | BCD header + name + IBAN + amount | Alleen ruwe tekenreeksQ | Alleen ruwe tekenreeksQ | Decodeert ruwe tekenreeksQ |
| Swiss QR-bill | SPC header + IBAN + address + amount | Alleen ruwe tekenreeksQ | Alleen ruwe tekenreeksQ | Decodeert ruwe tekenreeksQ |
| Micro QR | Compact payload | Geen decoderingV, U | Geen decoderingG | Industriële lezersZ |
| rMQR | Rectangular payload | Geen decoderingU | Geen decoderingG | Nieuwere Zebra-, Scandit- en Cognex-firmwareZ |
| GS1 Digital Link | https://id.gs1.org/01/09506000134352 | Opent URLQ | Opent URLQ | POS-firmware verwerkt de AI'sQ |
| Aztec | Arbitrary payload | Geen decoderingA2 | Google Lens, sommige variantenA7 | NativeA8 |
| Data Matrix | Arbitrary payload | Geen decoderingA2 | Google LensA6 | NativeA8 |
| PDF417 | AAMVA or arbitrary | Geen decoderingA2 | Google Lens, wisselendA7 | NativeA8 |
| AAMVA driver license | @\n\x1e\rANSI 636014100002DL... | iOS 17+ rijbewijsbewuste stroomA3 | Alleen rijbewijsbewuste appsU | NativeA8 |
| EAN-13 / UPC-A | 0012345678905 | Geen decoderingAp | Google LensG | Elke retail-POSA8 |
| Code 128 | ABC-123 | Geen decoderingAp | Google LensG | NativeA8 |
Hoe je de markeringen leest
- ✓: leest het vanuit de standaard camera-app, geen extra app nodig
- ~: leest het onder een voorwaarde die in de cel staat (een specifieke app, OS-versie of modus)
- ✗: decodeert het niet; je hebt een scanner-app of hardware nodig
Bewijs
- 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
Wat "verwacht scanresultaat" betekent
- Decodeert, native telefoon-cameralezer geeft de payload terug zonder aparte app nodig.
- Gedeeltelijk, decodering hangt af van een specifieke app (authenticator, wallet, bankieren) of een specifieke OS-versie.
- Geen decodering, native camera geeft niets terug. Vereist een speciale scanner of lezer.
- De kleine letters na elk resultaat noemen het bewijs: A plus een getal is een rij van het attestatielogboek hieronder; andere letters zijn documentatie van de leverancier, vermeld onder elke tabel. Een U betekent dat we die cel zelf nog niet met onze eigen apparaten hebben getest.
Methodologische opmerkingen
- Elke fixture maakt een round-trip. Onze CI genereert elke code in headless Chromium, decodeert hem terug via de
BarcodeDetector-API van de browser en verifieert de subtekenreeksovereenkomst. Een groen CI betekent dat het corpus intern consistent is. - Scanresultaten in deze tabel zijn afkomstig van handmatig testen op echte apparaten. Niet gesynthetiseerd. iPhone 15 Pro op iOS 18.3, Pixel 8 op Android 14, Zebra DS8100-imager op firmware CAAACS00-002-R06.
- We publiceren negatieve resultaten. Als iPhone Camera een symbologie niet decodeert (Data Matrix, Aztec, PDF417), staat er "Geen decodering" in de tabel, niet een herformulering van "native lezer".
- Het corpus is geversioneerd. Wanneer we een type toevoegen of een encoderbug oplossen, verschijnt de bijbehorende fixture-invoer in hetzelfde commit. De changelog houdt elke fixturewijziging bij, en corpus.VERSION.txt draagt de hash van het fixturebestand waaruit de huidige ZIP is gebouwd.
Scannervloot-attestatielogboek
Elke handmatige apparaattest, gedateerd. Rijen worden toegevoegd wanneer we hardware aanschaffen of een gebruiker een discrepantie meldt; een resultaat verandert nooit stilzwijgend, het krijgt een nieuwe rij.
| # | 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 | Geen enkele decodeert native (verwacht, zie /standards/non-qr-2d/) |
| A3 | iPhone 15 Pro | iOS 18.3, native Camera | AAMVA PDF417 | partial | 2026-04-10 | iOS 17+ rijbewijsbewuste stroom biedt 'Toevoegen aan Wallet' aan; ruwe PDF417 wordt niet teruggegeven |
| A4 | iPhone 15 Pro | iOS 18.3, Wallet | eSIM LPA | pass | 2026-04-12 | eSIM-toevoegen-stroom start correct |
| 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 | Sommige varianten decoderen; ondersteuning is wisselend |
| A8 | Zebra DS8100 | firmware CAAACS00-002-R06 | All 2D + 1D fixtures | pass | 2026-04-11 | Industriële imager, canonieke referentie |
| A9 | Google Authenticator | v7.0+ (iOS/Android) | TOTP, HOTP | pass | 2026-04-12 | Alleen SHA-1, 6 cijfers (negeert algoritme-/cijferparameters volgens Googles de-facto-profiel) |
| A10 | 1Password | v8 (iOS/Android/macOS) | TOTP, HOTP | pass | 2026-04-12 | Volledige RFC-ondersteuning incl. SHA-256, SHA-512, 8 cijfers |
Wat er komen gaat
- Pre-rendered artefacten. De huidige ZIP bundelt fixtures + methodologie + CSV. Een toekomstige revisie voegt pre-rendered SVG + PNG van elke fixture toe zodat je ze direct in een scannervlootharness kunt importeren. In afwachting van een headless-browserstap bij buildtime.
- Scannervloot-attestatie. Het gedateerde apparaatlog staat op deze pagina gepubliceerd en groeit elke keer dat we verifiëren tegen een nieuw apparaat.
- Verificatie door derden. Een onafhankelijk beveiligingslaboratorium voert het corpus uit via een scannervloot en publiceert een ondertekende attestatie. In afwachting, in opdracht; rapport verschijnt hier bij aankomst.
Zie ook
- /test-vectors/, volledige fixture-JSON en doorzoekbare tabel.
- /compatibility/, live scannercompatibiliteitsmatrix.
- /standards/, per-standaard referentiepagina's.
- /print-size/, fysieke afdrukguidance naast het corpus.