Koch Laboratory

A printout checked line by line: five refuted assumptions and first measurements

A new research line: can a printout, scan or phone photo of a document be checked automatically, line by line, without ever flagging an honest character as changed? First five assumptions that did not hold, then measurements: zero false alarms on 22,680 honest characters, 36 of 36 single-character changes detected on scans, the cost in undecided characters, a sheet-fed scanner that distorts the page more than a phone, and a test model with verdicts fixed before the trial: 198 of 198. The reading method and the code design stay withheld.

Koch Laboratory - a printout checked line by line: five refuted assumptions and first measurements

A document issued as a PDF lives on as a printout, a scan or a phone photo. Whether an amount, a date or a number on such a copy is the same characters the document had at the moment of sealing is today usually decided by a person: the app shows the data from the code on the document, and the person compares it with the printout. This line of research, run since 31 October 2026, measures whether this can be checked automatically, line by line, from an ordinary scan and a phone photo, without ever treating an honest document as altered. The entry gives the results from the first ten days of November 2026: first five assumptions that did not hold, then the detection of a change to a single character, the differences between a sheet-fed scanner and a phone, and a test model with verdicts fixed before the trial.

What is research here and what is not. Signed data in a visible 2D code on paper is a mature pattern (ICAO VDS, the BSI digital seal, the French 2D-Doc). Automatic checking of a printout with the altered fragment pointed out was described in 2006-2007 (University of Geneva), and checking a printout with a phone by, among others, Fraunhofer SIT (2023) and SealClub (ETH Zurich). The research content is measurement under a hard criterion: whether an honest character never comes out as altered, how many changes to a single character are then detected on a scan and on a photo, how many honest characters the image leaves undecided, and what distorts the geometry of the sheet - and the assumptions that did not hold along the way. Evidentiary claim: verification shows that the checked lines of the printout are as they were at the moment of the seal. It does not show that their content is true, who issued the document, or that the sheet is not a copy.

Method. As in the rest of the laboratory: problem → state of the art → falsifiable criterion → method → result (confirmed, refuted or partial, with boundary conditions) → next step. A negative result is a result. A false alarm is an honest character or line judged to be altered. “Undecided” means the image does not settle the matter: the verifier accepts such a character neither as matching nor as altered, but shows it to a person as doubtful. The figures come from measurement notes and trial reports of 5-10 November 2026.

1. Direction 1 - five assumptions that did not hold

Problem. The line’s first assumptions - some from the concept of 31 October 2026, some from the first days of work - had not been checked. Each of them, if false, would give either apparent protection or false alarms. State of the art (published). Copy attack: a hidden mark in a document that does not depend on the content can be read from the protected document and applied in the same way to another, without knowing the key (Voloshynovskiy et al., SPIE 2006). OCR autocorrection: in the experiments of Villán et al. (SPIE 2007) the OCR read the forged word “aufhentication” as “authentication” and the forgery passed. BSI TR-03137 (part 1, version 3.0 of 2026, chap. 19) describes recovering data with error-tolerant OCR and recommends showing a person every corrected character. Criterion (falsifiable). An assumption fails when (1) an attack exists that satisfies it and nevertheless changes the content; (2) calculation shows an effect smaller than the resolution of the device; (3) measurement under the stated conditions gives an unreadable or doubtful reading where the assumption promised an unambiguous one. Method. We checked three assumptions by analysis and calculation: binding the content through the geometry of the page, the physics of printing at 10 pt and 600 dpi, and the role of the lower time bound. Two by measurement: OCR on 12 images of the test page (scans at 150-600 dpi and phone photos, 6 November 2026) and three monospaced fonts on PDF renders of the same page at 150 and 300 dpi (10 November 2026). The method of reading and the construction of the code remain withheld. Result. None of the five assumptions held.

Next step. None - assumptions closed; (b) remains a calculation. Status: five assumptions closed: three by analysis and calculation, two by measurement.

2. Direction 2 - a change to a single character on a printout: zero false alarms and the price in undecided characters

Problem. The smallest change to the content is one character: a digit of an amount or a date, a comma replaced by a full stop. A reader that is to detect it from a scan or a photo must not, in doing so, judge honest characters to be altered: a single false alarm on a genuine document undermines the whole verification. The question: how many single-character changes are detected at zero false alarms, and how many honest characters does the image then leave undecided. State of the art (published). The Geneva works (Voloshynovskiy et al., 2006; Villán et al., 2007) point out an altered block of text - a word, a line or a paragraph - after printing, scanning, photocopying and fax; in the 2007 experiments the addition, removal and substitution of a character were detected, but the forgery “aufhentication” was let through by the OCR. Fraunhofer SIT (Bugert, Heeger, Berchtold, IS&T Electronic Imaging 2023) checks signed text blocks read by OCR with a phone; every mismatch is decided by the user, and the paper gives no numerical results. SealClub (Ochoa, Toro-Pozo, Basin, ETH Zurich; arXiv 2022) authenticates a paper document from a short phone recording and, by comparing images, marks places suspected of forgery. Criterion (falsifiable). Zero false alarms: no honest character may be judged altered. A character the image does not settle gets the status “undecided” and is counted separately, as a cost. An altered character must not be judged matching. The criterion is refuted by one false alarm or by one change judged matching. Method. A test page on two A4 sheets. The first is an honest document. On the second, an invoice, four lines were printed differently from how they were sealed, each with one change: comma to full stop, 5 to 8, 3 to 8, 2 to 7; plus samples of type from 7 to 12 pt. Printing: Samsung Xpress C430W laser printer. Scans: HP ScanJet Pro 2000 s2 with a sheet feeder; 150, 200, 300 and 600 dpi in colour, 300 dpi as JPEG, in black and white, and with sheets rotated by 180°. Photos: Motorola Razr 50 Ultra, the whole page from above and at an angle in dimmer light. Measurement of 5 November 2026: 22 images (18 scans and 4 photos). Repeat of 6 November 2026: 40 images - scans of two editions of the test page, four photos and PDF renders at 150-600 dpi. Line verdicts: 9 November 2026, 60 images of three editions of the page that differ only in the code (scans, PDF renders and photos). The method of reading and the construction of the code remain withheld. Result. Criterion met. False alarms: 0 in 12,474 checks of honest characters (22 images, 5 November) and 0 in 22,680 honest characters (40 images, 6 November). Single-character changes on scans: 36 of 36 detected as altered, each time with a correct reading of what was printed. On photos: altered digits 6 of 6, while a comma replaced by a full stop was undecided in 2 of 2 cases, because the tail of the comma is not visible in a photo of the whole page. On 40 images 78 of 80 changes were detected; the other two are the same comma on photos, undecided. Price: honest characters undecided - on scans 0.5-4%, almost exclusively pairs of similar characters in a proportional font (l/I, i/I, j/J, ł/l, full stop and colon); on photos 2-10% on the first page and 20-29% on the second, where the blurred small samples of 7-9 pt lie. Line verdicts (60 images): no honest line came out as mismatching or unreadable; altered lines came out as mismatching: 4 of 4 on scans and renders (27 images) and 3 of 4 on photos (3 images), where the fourth, with the comma, remained undecided. Boundary conditions: (a) we developed the reader on the same images on which we report the result; its earlier version gave one false alarm on the 150 dpi render (a full stop in the 7 pt sample), which disappeared after the reader was fixed - the independent test is only new documents (direction 4) and new printouts; (b) a photo of the whole page is enough for digits, not for fine punctuation. Next step. Manual trials on a new printout (direction 4). Status: criterion met on images of the test page, with conditions (a)-(b); the cost in undecided characters measured.

3. Direction 3 - sheet-fed scanner and phone: sheet geometry and code readability

Problem. Verification is meant to work from a scan and from a phone photo. Both devices distort the sheet, and the code reader in a phone does not read every code. Before assuming that a scan is a “better photo”, one has to measure how large these distortions are and where they come from. State of the art (published). ICAO Doc 9303, part 13 (8th ed., 2021) assumes that the seal can be checked even by an untrained person with inexpensive equipment, e.g. a smartphone app, and for inkjet printers recommends a code module of at least 0.3386 mm; BSI TR-03137 adopts this module as a requirement. Fraunhofer SIT (2023) cautions that the robustness of checking with a phone depends strongly on the quality of the photo and the straightening of the document, without giving numbers. Criterion (falsifiable). The intuition “a scan from the feeder reproduces the sheet more faithfully than a hand-held photo” fails when the geometry deviation is larger on scans than on photos. We attribute the deviation to the feeder if, after the sheet is rotated by 180°, it stays in the scanner’s frame and not in the page’s. We rate the reading of a code on three levels: quickly, after long aiming, not at all. Method. Control points distributed over the sheet compared with the position expected for a flat sheet; deviation in millimetres on the paper. Equipment as in direction 2. Scanner: 18 images of 5 November 2026 and further runs of 6 November 2026 on two subsequent printouts. Phone: 4 photos of whole pages of 5 November 2026 (JPEG 4096 × 3072). 2D codes: nine variants with a module from 0.25 to 0.50 mm and different error-correction levels; the reader in the phone camera, each code separately from close up (5 and 6 November 2026), and a measurement tool on whole images of scans and photos. The method of reading and the construction of the code remain withheld. Result. The intuition fails. Sheet-fed scanner: deviation on average 0.12-0.24 mm on the first sheet and 0.32-0.44 mm on the second, at most 0.79 mm. It grows along the paper feed to about 0.7 mm and falls towards the end of the sheet. After the sheet is rotated by 180° it changes direction in the page’s frame and stays the same in the scanner’s frame - so it comes from the feeder, not from the printer. Between runs it varies by about ±0.2 mm, and on two subsequent printouts the averages were similar (0.14-0.21 mm and 0.31-0.37 mm). Phone: on average 0.16-0.20 mm, at most 0.29-0.50 mm, at a resolution on the sheet of 271-339 dpi; the photo has no paper-feed distortion. Codes: from scans at 150-600 dpi the measurement tool read from the whole image all codes except the smallest at 150 and 600 dpi; from a photo of the whole page only some, mainly the larger ones. The reader in the phone camera read codes with fewer modules quickly, and denser ones very slowly or not at all: on 5 November it read eight of nine variants, three of them only after very long aiming; on 6 November, when the codes carried more data, it practically did not read three (once, after very long aiming). The results of the two days are not fully consistent: the code with the lowest error-correction level was not read on 5 November, and was on 6 November. Codes lying close together required long aiming, because the reader takes one code from the frame. Negative result as to the tool: one of the open libraries for reading codes read all codes from the PDF render, but from the 300 dpi scan only 4 of 9, and only from a straightened crop; it also erred at a fractional module size on a sharp image. We do not use it to measure readability. Next step. Scans, photos and a photocopy of the new printout in the manual trials (direction 4). Status: measured on 5-6 November 2026.

4. Direction 4 - a test model with verdicts fixed before the trial

Problem. A measurement on the test page checks reading, but not the whole path of a document - issuance, code, time, verification - nor the verifier’s behaviour towards forgeries planned in advance. So that the result does not fit itself to whatever came out, the expected verdict of each trial must be written down before the run. State of the art (published). ICAO Doc 9303, part 13 defines the verdict on a seal: valid or invalid, with a reason (among others read error, unknown certificate, invalid signature). The Fraunhofer SIT prototype (2023) gives no numerical results. A deployed format can also be unreliable: France Titres-ANTS wrote on 30 September 2025 that 2D-Doc on the 2025 tax notices gives errors on reading, and recommended submitting another document. Criterion (falsifiable). A catalogue of trials with the expected verdict of each trial and acceptance criteria adopted on 10 November 2026, before the run: no altered line gets “matching” (an exception foreseen in advance: a forger who has the same software and issues their own seal - the lines then agree with their seal, and the time bounds protect against that, direction 1 (e)); no honest line gets “mismatching”, and on renders also not “unreadable”; every false time proof is unconfirmed and every genuine one confirmed; malicious inputs cause neither crashes nor rejection without a message. The criterion is refuted by one verification that does not match the expected verdict. Method. A model in Docker with the full path of a document: a test issuer, real cryptography, a test time service instead of the production one, verification by the same route as in the browser. Three document templates (two kinds of certificates and an invoice), 75 documents, 120 trials, 198 verifications of page images at 150 and 300 dpi. Forgeries arise in two ways: as a PDF with a different text from the sealed one and as an image change after rendering (pasting, erasing, substitution). The same run on two PDF renderers: on Windows (Windows.Data.Pdf) and in Docker under Linux (poppler 22.12, a clean build from the repository, without network). In addition, robustness: a million random and malicious code texts, 200,000 malicious verification inputs, 22 extreme images (among others blank, noise only, very small and very large, rotated, mirrored, in negative) and 21 format-boundary cases, some also in the version of the verifier intended for the browser; and a review in which every byte of the code content was altered in several ways and the code was generated anew. The method of reading and the construction of the code remain withheld. Result. 198 of 198 verifications matched the expected verdict, the same in both environments. Robustness: zero crashes and zero rejections without a message. None of the 5232 alterations of the code content gave full confirmation. The model found six reader errors that the measurement on test-page images could not reveal, because those images did not contain such cases:

We fixed them all, each with a test; on 62 images from earlier measurements (scans, PDF renders, photos) the line statuses did not change after the fixes. After the first run we also corrected four expected verdicts (10 November 2026) - two concerned an altered code and additions in a line, two the time checks. This is a departure from the rule “verdict before the trial”, so 198 of 198 is the state after these corrections and after the reader fixes. Known imperfections: at 150 dpi a pasted digit 8 was read as “S” (the verdict “mismatching” was correct), and not every fine addition next to punctuation marks is detected at 300 dpi. The automatic trials are PDF renders and image changes, not printouts. The model does not prove the absence of errors; it gives a measurable result on a catalogue of trials fixed in advance.

Next step. Manual trials according to a ready list: 12 pages, each as a separate document with its own seal and expected verdict - scans, photos, photocopy, scaled printout, corrections with a ballpoint pen and tape, foreign codes stuck on, and finally a crumpled sheet. Then an assessment of how the verdict is presented and an independent review of the verification code. Status: automatic part completed on 10 November 2026.

Status of the direction. Closed: the five assumptions from direction 1. Measured: detection of a change to a single character at zero false alarms, the cost in undecided characters, the geometry of the scanner and the phone, and code readability. The test model passed the automatic part: 198 of 198. Limits of the measurement: one printer, one scanner, one phone and 8 photos in total; the “forgeries” were printed by the author. Nearest steps: manual trials - corrections with a ballpoint pen, photocopy, scaled printout - and an independent code review.

Proof of time

This text was hashed and stamped on publication. Verifying it takes both files: the stamp proves that one exact byte string existed at that moment, and only the source below is that byte string. Any later edit changes the hash and breaks the match — which is the point.

· @390.27 · 2026-W46

SHA-256 of the stamped text: d247398122b1e7a2092a1cce53dcf73b0c527482b0266e75e9f8661ca4d19770

Verify with: ots verify <proof> --file <source>