Your files are the specimen · physical
The Camera in the Noise
Bring at least four unedited, same-size photographs and this local browser lab will average their aligned noise residual, lock one file out before estimating the reference, and test crop, shift, scale, and JPEG controls without uploading a byte. The shipped anchor uses 51 training images because the 2006 paper recommends more than 50, but its fallback is openly synthetic, so a positive score is evidence of an aligned shared residual and never proof of a unique camera.
A photograph is not only a scene. It also carries what the imaging pipeline failed to remove: shot noise, demosaicking structure, compression blocks, row and column offsets, texture the denoiser mistook for noise, and sometimes a faint pixel-aligned response field. Average enough residuals in the same coordinates and the scene changes can cancel while a fixed field remains. The dangerous leap is to call that field a unique physical fingerprint. This page stops one sentence earlier.
1. The published anchor comes first
The instrument below follows the paper's residual definition W = I - F(I), its literal residual mean PC = sum(Wk)/N, and its zero-lag normalized correlation. The browser reduction is luma-only at a disclosed native crop, not the paper's full three-channel treatment. The fallback is generated, so it verifies the machinery and controls. It does not reproduce a measured physical-camera error rate.
Shipped anchor · 51 train, 1 held out, 8 controls
Opening provenance from the archive.
The archive has not been checked yet.
Waiting for the page load boundary.
Held out before estimation:
SHA-256:
Every plotted comparator as text
| role | source | centered corr |
|---|
| N | residual mean | intensity-weighted MLE |
|---|
| transform | setting | zero-lag corr |
|---|
The anchor must beat every different-source control, every one of 32 preregistered nonzero circular shifts, and its own one-pixel crop and 0.90 scale damage, and its held-out frame must not be a near-duplicate of any training frame. Any failed line keeps the reader controls locked. A comparison that was not supplied reads NOT RUN and never counts as a pass. This is deliberately easier to fail than an assertion that a score is merely positive.
2. Bring the run already on your disk
Use native-resolution originals from one physical camera if you can. More than 50 calibration files plus one held-out file reaches the paper's printed recommendation. Four through 51 total files get an explicitly underpowered preview. Exact stored dimensions, orientation, format, and EXIF make/model form separate groups. EXIF is a grouping hint, not identity evidence.
A split between groups can be caused by editing, a changed lens or pipeline, orientation handling, or ordinary export settings. It is a compatibility warning, not proof that a file was edited. The page never mixes those groups silently.
Up to 100 files, at least 256 by 256 stored pixels each. The parser accepts 8-bit JPEG and 8-bit PNG of color type 0, 2, 4, or 6; indexed PNG of color type 3 is refused by name rather than decoded. Every byte is read locally for type, dimensions, metadata, and SHA-256. Two files with identical bytes are refused, because a repeated file would put the held-out frame inside its own reference. Nothing is posted or persisted.
Waiting for the anchor.
Compatibility audit before any score
| group | files | format | stored size | orientation | EXIF make/model |
|---|
A control group is a second, incompatible group of files from somewhere else: a different camera, a different phone, a stranger's photographs. Without one, the control line in the check panel reads NOT RUN, because a comparison that was never made is not a passed comparison. Up to eight control files are used, and they must be at least as large as the reference group's sample square.
Your aligned shared residual
Held out before decode:
SHA-256:
Every plotted comparator as text
| role | source | centered corr |
|---|
| N | residual mean | intensity-weighted MLE |
|---|
| transform | setting | zero-lag corr |
|---|
3. Make the match fail
The sophisticated dismissal is right: scene leakage, an 8 by 8 JPEG grid, demosaicking, model-wide processing, and mere registration can all correlate without unique sensor PRNU. The useful response is not a stronger label. It is a bench where geometry and encoding can attack the score while all settings remain visible.
Crop and recover
A crop translates the pixel field. It does not destroy it. The zero-lag score can collapse while an offset search finds the peak again.
Not run.
Scale and search
The bench applies a 0.95 bilinear scale, restores the canvas, then compares it with reference patterns resampled from 0.90 through 1.02 in steps of 0.005. It is coarse and illustrative.
Estimated work: 25 bilinear resamples and correlations, under a second on a current laptop after residual estimation.
JPEG round trip
The browser's own canvas encoder receives a quality argument. It is not promised to map that number to a standardized quantization table.
No round trip yet.
Leakage and holdout controls
Swap the hash-locked held-out member, or apply later row and column zero-meaning inside four pixel-parity subarrays. Neither control grants a forensic threshold.
No swap yet.
Literal 2006 path is still selected.
4. The historical rates stay historical
The following are Table II's unprocessed threshold and false rejection pairs at its fixed false acceptance rate. The detection-rate column is subtraction performed here, not a separately printed measurement. For example, the Canon G2 conversion is . None is a threshold for this page.
| camera | printed t | printed FRR | 1 minus FRR |
|---|
Heavy JPEG compression is not a universal off switch. In the 2006 controlled JPEG rows, quality 50 raised the Nikon D100 false rejection rate to 0.163, while other listed cameras moved differently. Compression may suppress non-unique correlation, bury useful structure, introduce a common block grid, or do several at once.
All controlled JPEG rows printed in Table II
| camera | quality | printed t | printed FRR |
|---|
Canon A10 and Olympus C3030 are absent because their source sets were already JPEG. These are historical rows only, never reader thresholds.
The check · equations, choices, and failure conditions
PC = (1/N) sum Wk
corr = ((W - mean(W)) dot (PC - mean(PC))) / (norm(W - mean(W)) norm(PC - mean(PC)))
Khat = sum(Wk times Ik) / sum(Ik squared)
PCE = signed peak squared / mean squared correlation outside the 11 by 11 peak neighborhood
Fixed free choices
All 8-tap analysis coefficients
Choices fixed by your specimen
Exact membership and exclusions; SHA-256 ordering; the held-out file; stored dimensions; EXIF orientation; optional make and model strings; center crop origin; whether a native crop margin exists; browser decoder and color management; format and progressive JPEG status; file count N; and every decode refusal. Names and pixels are discarded when the page is closed. No score is exported unless you explicitly copy it.
Uncertainties that remain
Scene leakage is not calibrated; the near-duplicate check catches copies, not two photographs of the same wall. Browser color conversion can vary. EXIF can lie. A phone may fuse frames, stabilize, change lenses, correct geometry, or rescale before writing. The luma reduction differs from the paper's color-channel treatment. This small crop has no validated threshold, false acceptance rate, or false rejection rate. The fallback's synthetic signal is easier than physical PRNU. A bounded shift or scale search can miss a real alignment. A high score can be forged, and the 2006 paper itself discusses deliberate suppression and planting.
Two further limits are worth naming because they are the ones most likely to flatter a result. First, a different-source control is the easy null. Two unrelated cameras are two independent random fields, and beating that says nothing about the case where the doubt actually lives: two physically distinct bodies of the same model, sharing a sensor design, a lens, a demosaicking pipeline and a JPEG table. This page cannot test that case and does not claim to. Second, a correlation that rises as N rises is not by itself evidence of a sensor. Non-unique artifacts shared by a camera model, and row and column structure, accumulate with averaging exactly as a fingerprint would, which is why the later large-scale work suppresses them before estimating anything. That is what the row and column control on the bench is for, and it is also why that control recomputes the nulls and not only the held-out score.
Rules that were changed after seeing data
These were not derived in advance. On 2026-08-09 an adversarial audit handed this instrument the same nonconstant image fifty-two times under different names. The page selected fifty-one copies as the reference and the fifty-second as the held-out evidence, and every line of the check panel went green at a correlation of 0.9999999999999342, because the held-out pixels were present verbatim inside the reference. A second audit finding was that the different-source control line printed PASS for readers, who never had a way to supply a control at all. In response, five rules were added after the fact and are named here as such:
- Two files with the same SHA-256 in one group are refused before the held-out position is chosen.
- Two decoded crops with identical pixels are refused after decode, which also catches the same image arriving in two containers.
- A held-out frame whose intensity correlates with its closest training frame above 0.95 fails a new near-duplicate check. The limit is a round number chosen for being far above anything two different exposures of a moving aim produce and far below the 1.0 of a copy. On the shipped specimen this statistic is about 0.33.
- The different-source comparison reads NOT RUN, not PASS, when no control group was supplied, and the summary counts checks that ran separately from checks that did not.
- The reader can now nominate a second, incompatible group as a different-source control, which is what makes that line able to run at all.
The audit's fully green duplicate result is now a refusal. That transition is asserted by the offline verifier, which builds the fifty-two-copy specimen itself and requires it to be refused rather than scored.
Refusals tested in this tab
The archive hash refusal runs when the shipped bytes open.
Local-only ledger
Your photographs were decoded in this tab and were never uploaded. This page's Content Security Policy sets connect-src 'self', so the only address this code may open a connection to is this origin, and the only connection it opens is one GET for the shipped specimen, issued before the file input is enabled. It has no analytics, remote font, service worker, storage write, beacon, or socket. Open the browser Network panel before choosing files and watch the list remain unchanged.
The counter describes this page's own code and the Resource Timing entries this browser exposes. It cannot prove facts about extensions, the browser, the operating system, or another page. The shipped specimen is fetched from this origin as a 3.35 MiB gzip file, and its length and SHA-256 are pinned in the page's own module, so a substituted archive refuses rather than scores. That request is inbound: it carries this page's asset path and nothing else, and it completes before any reader file can be chosen. Reader files enter only through the file input or drop event, and no code path sends them anywhere.