# NFC and Coldcard Mk4

(Applies to Coldcard Mk4 only)

## Usage

Mk4 NFC antenna is centered under number `8` on the keypad. Before using NFC,
it is important to locate the position of NFC antenna on your device and point it 
correctly towards the Coldcard NFC antenna. Picture below shows an example with iPhone
that has NFC antenna located at the top right edge. The NFC smartphone antenna 
can be positioned almost anywhere on the device, but mostly on the top, middle, 
or bottom of the back side of the phone, and it is rarely indicated on the phone case. 
It is always best to look up your specific phone model on the internet to find 
the exact antenna location.

![iphone_nfc](iphone_nfc.jpg)

## Standards Background

NFC is a layer of protocols on top of ISO standards for short-range
radio communications.

Unfortunately, both ISO and NFC Forum bodies are so poor they must
sell their standards. Membership starts at a few thousand dollars,
or you must buy each PDF for a few hundred dollars. Every single
thing is behind a paywall.

This policy does not allow us to link to reference standards. Instead
we have to hand-wave about our interpretation of their standards
documents.

In our opinion, this policy is not in the public interest and is
hindering adoption of their standards and even technological progress
in general. Good interoperability is critical with radio standards.


## Lower Layers

The Coldcard Mk4 has an chip that acts as a Type 5 NFC tag.  The
radio standard is called "NFC-V" or ISO-15693, and operates on a
13.56 Mhz carrier wave.

The tag chip implements NFC standards to support reading and writing
commands appropriate to a typical Type 5 tag.

Effectively it exposes a flash memory chip, of up to 8k Bytes in
size. NDEF standards describes the organization of the data in that
memory. This document will describe what bytes are needed in those
records.

## Security

All NFC features of the Coldcard can be disabled from the settings
menu, and when that is done, the tag chip is completely disabled,
and there is no way to probe, detect or access the Coldcard over
RF. Even when NFC features are enabled, we keep the tag chip disabled
unless we are actively sharing something. We disable the "energy
harvesting" features of the chip, so it will not do anything when
the Coldcard is powered-down, regardless of the NFC setting.

If the above is not enough for you, the antenna can be destroyed
by cutting the trace labeled "NFC" inside the hole for the MicroSD
card. Use the point of a sharp knife to cut and peel up the trace.

The NFC traffic is not encrypted and is subject to eavesdropping.
While the NFC feature is active, your Coldcard can be uniquely
identified because the NFC protocol requires a unique ID (64 bits)
that is defined by the NFC tag chip and shared automatically as
part of the anti-collision protocol. Again, that happens only during
active transfers, not when idle.

## Desktop Testing

Most USB-powered desktop contactless card readers will not work
with the Coldcard because they do not implement NFC-V (ISO-15693).
Instead they are doing ISO-14443A or B.

Smartphones, on the other hand, all support NFC-V and they are the
intended targets. Generic NFC tag reading apps can view the data
we share, and that may be enough to be useful. Our long-term goal
is integration with mobile wallets.

# Types of Records

## Background

The "NDEF message" is a list of values ("NDEF records"). In most
cases we share only a a single value, but for more complex object
data we will use multiple records. The order is not defined and may
change. Each NDEF record has data-type information and a payload
of bytes.

If we can use "text" or "URI" records, we will, but we generally
need our own Bitcoin-specific types.

We are using "NFC Forum Local Types" for new stuff. Other Bitcoin
developers are welcome to use the same types as long as it doesn't
create interoperation problems.

Types are shown in full URN format (RFC 2141) but only the final
two parts are sent as part of the NDEF record (ie. `bitcoin.org:psbt`).
We are using TNF=4 (NFC Forum external type) to communicate the
prefix of `urn:nfc:ext:`

# Simple Data

## General QR Replacement

Anytime there is a QR displayed on the Coldcard screen, you can
press (3) and the same data will be shared over NFC. In these cases,
it will be shared as a simple text record, regardless of the content.

Type: `urn:nfc:wkt:T` (text)

Body: varies, but always ascii text.

Many values can be exported this way, include xpub and even seed
words after enough warning screens.

## Payment Address

This is typically a deposit address, generated on the Coldcard via
the address explorer. We share these by themselves as simple text
records for max compatibility.

Type: `urn:nfc:wkt:T` (text)

Body: bech32 or base58 encoded Bitcoin payment address

If there are multiple addresses (10 shown for address explorer case)
then they are separated by a single unix new line (`0x0a`).

# Complex Data

For Bitcoin-specific data we provide a few records together. The
first is a label, then various binary data related to what's going
on (such as a PSBT file after signing).

## Text Label

Coldcard's first record will be a simple text record (English, UTF-8) that
describes what is being shared.

Type: urn:nfc:wkt:T  (standard text)

Body: "Partly signed PSBT", "Deposit Address", "Signed Transaction" and similar.

Consider this a title for what's being offered for sharing purposes.

## SHA256 Checksum

When the Coldcard is sharing a larger object, such as a PSBT file,
we know the SHA256 of that object, so we share that as well. This value can
be ignored or used for end-to-end error detection. It does not
protect against tampering.

Type: `urn:nfc:ext:bitcoin.org:sha256`

Body: Exactly 32 bytes of binary. It's the SHA256 over the main 
payload (PSBT file, for example).

If present, this value will always directly preceed the object (txn
or PSBT) that it covers. NFC-V has CRC16 over each low-level message,
but that's all.

## TXID Value

When sharing a fully-signed transaction, the TXID, if known, will be
shared in hex.

Type: `urn:nfc:ext:bitcoin.org:txid`

Body: Exactly 32 bytes of binary. 

The transaction ID is calculated as a hash over the transaction.
Without signature witness data, it is simply SHA256 over the bytes
of the transaction. For segwit transactions, it's a bit more complex
to calculate.

## PSBT File

The payload is a binary PSBT file, per BIP-174. The PSBT may be unsigned,
partly signed, fully signed or otherwise incomplete.

Type: `urn:nfc:ext:bitcoin.org:psbt`

Body: Binary PSBT file, variable length. First five bytes will be `psbt\xff`.


## Bitcoin Transaction

A fully-signed, wire-ready Bitcoin transaction.

Type: `urn:nfc:ext:bitcoin.org:txn`

Body: Binary, variable length. First four bytes will typically be
`0x02 0x00 0x00 0x00` (version number two, in LE32).

When the Coldcard has signed and finalized a transaction, it can
share it in this format. Typically the user will want to broadcast
this new transaction on the Bitcoin P2P network.

## JSON Files

When exporting wallet details, we need to share a JSON file in most
cases. These are marked as "application/json".

# Examples

This section will include a number of examples, with analysis of the content.

- __comming soon__


