You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Production GitHub Pages can decode a Google Authenticator migration QR containing a small/single-account export, but a real Google Authenticator multi-account migration QR screenshot fails before migration parsing with:
No supported QR code could be decoded from the selected image.
No real QR image, migration URI, protobuf payload, Base64, secret, account name, issuer, or other authentication material is attached to this Issue or should be added later.
Multi-part Google Authenticator migration batches are already supported at the parser/session layer.
The observed failure occurs earlier, in web/src/import/qr.ts, while decoding image pixels with @zxing/library.
Current image decode attempts are single-image/single-code ZXing paths using Hybrid/GlobalHistogram and detector/PURE_BARCODE variants.
A normal/smaller Google Authenticator QR screenshot succeeds, while the denser multi-account export screenshot fails.
Required behavior
A local screenshot/image containing one Google Authenticator migration QR that encodes multiple accounts must decode reliably enough for the existing migration parser/session to process it.
This Issue concerns one QR symbol carrying a denser multi-account migration payload. It does not require decoding multiple independent QR symbols from one collage/image.
Existing multi-part export behavior (1/N, 2/N, etc.) must continue to work by importing each QR image separately into the same import session.
Investigation direction
Determine why the current ZXing image path fails on dense migration QR screenshots and implement the smallest robust local-only fallback/preprocessing strategy. Candidate approaches may include, based on evidence:
bounded image-scale pyramid / nearest-neighbor upscaling before decode;
bounded crop/quiet-zone handling where safe;
additional luminance/binarization variants;
inversion/contrast-safe fallback where justified;
Chrome-native/local decoder fallback only if it preserves deterministic local-only/privacy behavior and has explicit regression coverage.
Do not blindly add unbounded retries or expensive image transforms. Keep memory/runtime bounded.
Regression coverage
Use synthetic-only test data. Do not use or commit a real Google Authenticator export.
Add coverage for at least:
a synthetic migration payload containing multiple accounts and enough payload density to produce a materially denser QR than the current small fixture;
browser/image-level decode of that generated/rasterized dense QR;
legacy/small QR continues to decode;
unsupported/non-QR image remains fail-closed;
temporary pixel buffers are cleared as today;
decoded migration payload still flows through existing version/profile/account-limit validation;
multi-part batch import remains unchanged.
Prefer generating fixtures deterministically from synthetic secrets/account labels at test time or from clearly synthetic checked-in fixtures that contain no real credentials.
Security/privacy constraints
All QR decoding stays local in the browser.
No runtime network/API/service for QR decoding.
No persistent plaintext QR image/payload/account/secret storage.
No logging/telemetry of decoded URI, Base64, protobuf bytes, secrets, account names, issuers, or recovery material.
Error diagnostics must remain secret-free.
Preserve cleanup/zeroization of temporary image/payload/account secret buffers.
No firmware, Protocol, Vault format, Recovery, eFuse, or Device behavior change.
Avoid dependency/lockfile changes unless the implementation cannot be made robust with the existing decoder; if a dependency change is proposed, justify it explicitly in the PR.
Acceptance criteria
Synthetic dense multi-account Google Authenticator migration QR image decodes in Web tests/Chrome smoke.
Existing small/single-account QR decode remains green.
Problem
Production GitHub Pages can decode a Google Authenticator migration QR containing a small/single-account export, but a real Google Authenticator multi-account migration QR screenshot fails before migration parsing with:
No real QR image, migration URI, protobuf payload, Base64, secret, account name, issuer, or other authentication material is attached to this Issue or should be added later.
Current state
version1/2, batch semantics, unknown additive fields).web/src/import/qr.ts, while decoding image pixels with@zxing/library.Required behavior
A local screenshot/image containing one Google Authenticator migration QR that encodes multiple accounts must decode reliably enough for the existing migration parser/session to process it.
This Issue concerns one QR symbol carrying a denser multi-account migration payload. It does not require decoding multiple independent QR symbols from one collage/image.
Existing multi-part export behavior (
1/N,2/N, etc.) must continue to work by importing each QR image separately into the same import session.Investigation direction
Determine why the current ZXing image path fails on dense migration QR screenshots and implement the smallest robust local-only fallback/preprocessing strategy. Candidate approaches may include, based on evidence:
Do not blindly add unbounded retries or expensive image transforms. Keep memory/runtime bounded.
Regression coverage
Use synthetic-only test data. Do not use or commit a real Google Authenticator export.
Add coverage for at least:
Prefer generating fixtures deterministically from synthetic secrets/account labels at test time or from clearly synthetic checked-in fixtures that contain no real credentials.
Security/privacy constraints
Acceptance criteria
Related