EdgeNFC
Start free

Security

Real cryptography, not a serial number.

A QR code is an image: photograph it and you have it. A static NFC tag is a string: read it and you have it. An EdgeNFC tag holds a key it will not disclose, and uses that key to sign a message that is different on every tap.

The claim, stated precisely. Forging a tap requires the tag's AES key. Replaying a captured tap fails a counter check. Neither is a matter of obscurity — both are the ordinary properties of a MAC and a monotonic counter.

Key hierarchy

One master key. One key per tag. Never the same one twice.

The master key exists so that per-tag keys can be derived from it. It is never written to a tag, and it is not needed to answer a tap — only to re-derive the key of the tag that produced it.

AN10922 diversification (AES-128)

Each tag's key is derived from your System Master Key and data that includes the chip's own 7-byte UID, using NXP's AN10922 AES-128 diversification. Two tags from the same master never share a key.

A teardown costs you one tag

An attacker who successfully extracts a key from a chip in a lab learns that chip's key. The derivation is one-way: it does not run backwards to the master, and it says nothing about any other tag in the system.

Separate roles, separate keys

The key that encrypts the tag's identity (SDMMetaReadKey) and the key that signs the tap (SDMFileReadKey) are derived with different role labels, so the two capabilities are not interchangeable.

The key never crosses the air

SDM is a read operation. The chip performs the cryptography internally and emits the result; the key itself is never part of the NDEF payload and never appears in the URL a phone opens.

Threat model

What we defend against, and with what

Each row is a specific attack and the specific mechanism that answers it — not a posture statement.

Cloned or forged tag

Every tap carries an AES-CMAC computed with that tag's diversified key. Producing a code that verifies means possessing the key; copying the chip's memory does not produce it.

Replay of a captured URL

The chip's read counter is signed into the message and only increases. A URL captured from a real tap carries a counter we have already seen, and is rejected even though its signature is valid.

UID harvesting and tracking

In encrypted-PICC mode the UID and counter are AES-encrypted into one opaque parameter, so the URL does not expose a stable identifier to anyone who reads it over your customer's shoulder.

Master-key exfiltration

Hosted master keys are envelope-encrypted under a KMS-held wrapping key and exist in plaintext only transiently in memory at verify time. No API returns key bytes after creation, and keys are never written to logs or error messages.

Timing side-channels

MAC comparison is constant-time with no early exit, so the time a rejection takes tells an attacker nothing about how close the guess was.

Downgrade to a weaker mode

The expected SDM mode and key version are pinned per system server-side. A tag that presents a weaker configuration than the system expects does not get a pass because it asked for one.

Key custody

Three places a master key can live

Custody is a decision you make, not a tier we assign. All hosted plans use hosted custody; the perpetual Edge License is how you take custody yourself.

1

In the provisioning app

Held in Android Keystore-wrapped storage, used in-process to derive per-tag keys, and zeroized after each provisioning operation. Never logged, and never exported in plaintext except by an explicit action you take.

2

Hosted by us

Stored envelope-encrypted: a KMS-held wrapping key encrypts the master key at rest. Plaintext exists only transiently in memory at verify time and is then zeroized.

3

Only ever yours

With the Edge License, the master key is shown to you once at creation and is never persisted on our side. The self-host package ships public configuration only — it contains no key.

Primitives

Nothing here is invented

The only thing we designed is how these pieces are composed. The pieces themselves are standard, and implemented with vetted libraries.

AES-128 and AES-CMAC

All ciphers are AES-128; all MACs are AES-CMAC as specified in NIST SP 800-38B. Key generation uses a cryptographically secure RNG.

AN10922 diversification

Implemented to NXP's published specification and checked against NXP's published test vector — including its deliberate divergence from generic CMAC, which is a classic place for an implementation to be subtly and silently wrong.

Constant-time comparison, zeroization

Every tag and MAC comparison is constant-time. Derived and session keys are zeroized after use. The core returns non-secret error values and does not panic on attacker input.

One core, cross-checked

Hosted and self-hosted run the same Rust/WASM build, and the Kotlin provisioning side is held to the same test vectors as the Rust verification side, so the two ends of the system cannot quietly disagree.

Privacy

A tap should not become a tracker

The UID does not have to be public

Encrypted-PICC mode — the recommended configuration — keeps the tag's UID out of the URL entirely, so a scan URL is not a durable identifier for the object it is attached to.

Tap URLs are kept out of search

Per-tap verification URLs are transient and are excluded from indexing and from our sitemap, so an individual tap cannot end up in a search result.

Verification is not gated on consent

Checking whether a product is genuine is the function of the page, so it runs without a cookie banner standing in the way. Nothing non-essential loads before you consent. See the Privacy Policy.

We keep verdicts, not keys

The verification event log retains outcomes and counters so you can see what happened. It never contains key material.

Straight answers

What we do not claim

Has EdgeNFC had an independent security audit?

Not yet. We have not commissioned a third-party audit or obtained any security certification, and we will say so here until that changes. What we can point at today is the design above, standard primitives, and conformance against published NXP vectors.

What is the state of encrypted-PICC mode?

It is implemented in the verification core and covered by round-trip tests. Our published conformance vectors currently cover the plaintext-mirror mode end to end; treat encrypted-PICC as supported and tested, but not yet independently vector-validated against NXP AN12196.

What happens when I rotate a master key?

Rotation changes the key every field tag was provisioned against. Today, tags provisioned under the old key need re-provisioning to verify again — plan a rotation as a re-provisioning exercise, not as a switch you flip. A rolling migration window is on the roadmap and is not shipped.

Does a valid tap prove the product is genuine?

It proves the tag is genuine, present, and not replayed. Whether that transfers to the item depends on how the tag is attached — a tag that can be peeled off a real item and stuck on a fake one proves only that the tag is real. Design the attachment as carefully as the crypto.

Can you recover my master key if I lose it?

Under self-hosted custody, no — that is the point of it. The key is shown once and never persisted by us, so a lost key means re-provisioning the tags. Back it up accordingly before you provision at scale.

Next

Don't take our word for it — try to forge one.

The demo runs the real verification core in your browser. Change a byte of the MAC, or reuse a counter, and watch it refuse.