Snapper - metrodroid/metrodroid GitHub Wiki

Snapper is the ticketing system used in Wellington, and a number of other towns in New Zealand.

There are two types of cards:

This discusses the Snapper plus exclusively.

Metrodroid detects this as a T-Money card, and shows the balance (in cents) as KRW rather than NZD. Better support for this card is being implemented in PR 362.

Applications

AID Name
a000000003000000 GlobalPlatform
d4100000030001 Snapper / T-Money application

Note: Unlike T-Money, there is no Config DF.

  • All date and times are BCD-encoded:

    • YYYYMMDD for dates
    • YYYYMMDDHHMMSS for timestamps (date + time)
  • Multi-byte integers are big endian unless otherwise specified.

  • All currency values are in cents of the New Zealand Dollar

a000000003000000

The card responds to an empty SELECT "by name" with AID a000000003000000. This can also be explicitly selected by name.

This is a GlobalPlatform application.

The card responds to EMV GET PROCESSING OPTIONS request (80a8000002830000) with 6985 (conditions not satisfied).

d4100000030001

This is a variant of the T-Money (KS X 6924) application:

  • All costs are in cents of the New Zealand Dollar.
  • T-Money GET BALANCE (90 4c 0000 04) has the card balance in cents of the New Zealand Dollar (as opposed to KRW).
  • The Snapper app attempts to use a command that looks like a proprietary GET RECORD command (90 78 rr00 10) on records 0-f; but this appears to contain no data?
  • Selecting the T-Money application to read file IDs doesn't work -- only SFI works.
  • There is no Config DF.

The files are a different bit layout to T-Money, with SFI files:

  • 0x03: trip data
  • 0x04: transaction data
  • 0x06: on an unused card this is all 00, on a used card this has data.

The trip data (SFI 3 records) and balance data (SFI 4 records) should be treated as a pair.

SFI file 3 (trip data)

Each record is 51 (0x34) bytes long.

Start byte End byte Length Meaning
0 0 1 Unknown, always 0x01
1 1 1 Byte length of the transaction (always 0x32)
4 4 1 Trip ID in journey (for transfers)
5 5 1 Journey ID
13 19 7 Timestamp

SFI file 4 (balance data)

Records are 46 (0x2e) bytes long.

Start byte End byte Length Meaning
0 0 1 Transaction type (1 = trip, 2 = topup)
1 1 1 Byte length of the transaction (always 0x2c)
2 5 4 Balance after transaction (int32)
6 9 4 Transaction counter
10 13 4 Cost (int32)
14 18.5 4.5 Agency ID (binary-coded decimal)
26 46 20 FF

Other notes / trivia

  • Snapper also contributed to Leap's mobile app (Ireland) -- but these are very different card systems.

  • The Snapper Feeder (used by the MySnapper PC app) is an ACS ACR122T USB dongle.

    This works with the jvmcli version of Metrodroid (and supports many different cards – not just Snapper) provided you've installed appropriate drivers for your system's PC/SC implementation.

  • The MySnapper and Snapper Mobile apps appear to proxy card communication to a remote server (over HTTP/SOAP), and then that remote server indicates some data. There is some limited information available offline, and the Snapper Mobile app partially caches data.

    For Metrodroid, probing the remote web server isn't a valid strategy for reading a Snapper card.

  • Snapper Mobile has a complete list of Stop IDs available in cd.zip.

  • d 410 000003 0001 is from the ISO7816 National AID range for South Korea (d 410).