cvend
Differences
This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
| cvend [2026-03-17 20:08 UTC (2 months ago)] – [Card reader flow] penguinowl | cvend [2026-05-24 10:59 UTC (6 days ago)] (current) – 0xd0 EMV doof | ||
|---|---|---|---|
| Line 5: | Line 5: | ||
| {{ : | {{ : | ||
| - | The associated serial device appears to be at '' | + | The associated serial device appears to be at '' |
| ===== cVEND protocol notes ===== | ===== cVEND protocol notes ===== | ||
| Line 18: | Line 18: | ||
| | 0 | 1 | | always 0xBC | | | 0 | 1 | | always 0xBC | | ||
| | 1 | 1 | '' | | 1 | 1 | '' | ||
| - | | 2 | 1 | '' | + | | 2 | 1 | '' |
| | 3 | 1 | '' | | 3 | 1 | '' | ||
| | 4 | 2 | '' | | 4 | 2 | '' | ||
| | 6 | 1 | '' | | 6 | 1 | '' | ||
| | 7 | '' | | 7 | '' | ||
| - | | 7+'' | + | | 7+'' |
| ==== IPP message types ==== | ==== IPP message types ==== | ||
| Line 34: | Line 34: | ||
| | 0x07 | <- | Heartbeat| sent periodically by reader | | | 0x07 | <- | Heartbeat| sent periodically by reader | | ||
| | 0x0f | <- | Startup | sent by reader after startup, approx 1 minute after power on, e.g. " | | 0x0f | <- | Startup | sent by reader after startup, approx 1 minute after power on, e.g. " | ||
| - | | 0x10 | -> | Reset | | | + | | 0x10 | -> | Reset | first byte selects subcommand (2 = restart application, |
| - | | 0x11 | <- | ResetReply | | | + | | 0x11 | <- | ResetReply | e.g. " |
| | 0x20 | -> | LEDs | sets LED status, u32 bitmap; the only two externally visible LEDs on the PM3 are " | | 0x20 | -> | LEDs | sets LED status, u32 bitmap; the only two externally visible LEDs on the PM3 are " | ||
| | 0x22 | -> | Buzzer | makes the cvend beep; u16 frequency, u16 duration. | | 0x22 | -> | Buzzer | makes the cvend beep; u16 frequency, u16 duration. | ||
| Line 48: | Line 48: | ||
| | 0x9c | -> | FileInfo | | | | 0x9c | -> | FileInfo | | | ||
| | 0x9d | <- | FileInfoReply | | | | 0x9d | <- | FileInfoReply | | | ||
| - | | 0xa4 | -> | FileList | | | + | | 0xa4 | -> | FileList | Seems to list files on the cVEND. First 2 bytes are the path length, remaining bytes are the path to list | |
| - | | 0xa5 | <- | FileListReply | | | + | | 0xa5 | <- | FileListReply | First 4 bytes are reply length, remaining bytes seem to be null seperated modification timestamps and file/folder names | |
| | 0xaa | -> | SetTime | | | | 0xaa | -> | SetTime | | | ||
| | 0xab | <- | SetTimeReply | | | | 0xab | <- | SetTimeReply | | | ||
| Line 58: | Line 58: | ||
| | 0xb1 | <- | ISORead | sent by reader when ISO14443A card presented, after enabling Iso with 0xe4\\ card UID at offset 2 | | | 0xb1 | <- | ISORead | sent by reader when ISO14443A card presented, after enabling Iso with 0xe4\\ card UID at offset 2 | | ||
| | 0xb3 | <- | ISOCardReleased | sent by reader after ISO1443A card released with 0x32 or 0x46 | | | 0xb3 | <- | ISOCardReleased | sent by reader after ISO1443A card released with 0x32 or 0x46 | | ||
| - | | 0xb4 | -> | APDUProx | CLA, INS, P1, P2, Lc (2 bytes), Data, Le (2 bytes), | + | | 0xb4 | -> | APDUProx | DeviceSelect(0x00), |
| - | | 0xb5 | <- | APDUProxReply | | | + | | 0xb5 | <- | APDUProxReply | DeviceSelect(0x00), |
| | 0xb6 | -> | SAMCtrl | // | | 0xb6 | -> | SAMCtrl | // | ||
| | 0xb7 | <- | SAMCtrlReply | | | | 0xb7 | <- | SAMCtrlReply | | | ||
| Line 67: | Line 67: | ||
| | 0xbc | -> | DESFireCommand | sends desfire command, documented in {{ 0: | | 0xbc | -> | DESFireCommand | sends desfire command, documented in {{ 0: | ||
| | 0xbd | <- | DESFireCommandReply | response to command, documented above | | | 0xbd | <- | DESFireCommandReply | response to command, documented above | | ||
| - | | 0xbe | <- | UnhandledCard | sent by reader when a card is presented that is not supported by any enabled ProxCardFunction, | + | | 0xbe | <- | UnhandledCard | sent by reader when a card is presented that is not supported by any enabled ProxCardFunction, |
| | 0xce | -> | | //unknown, registered in IppHandling:: | | 0xce | -> | | //unknown, registered in IppHandling:: | ||
| - | | 0xd0 | -> | EMV | first byte selects subcommand (0 = load config, 1 = preprocess, 2 = toggle polling) | | + | | 0xd0 | -> | EMV | first byte selects subcommand (0 = load config, 1 = preprocess, 2 = toggle |
| | 0xd1 | <- | EMVStatus | sent by reader after startup and certain nfc state changes, format and semantics not yet understood | | | 0xd1 | <- | EMVStatus | sent by reader after startup and certain nfc state changes, format and semantics not yet understood | | ||
| - | | 0xd4 | -> | | //unknown, registered | + | | 0xd4 | -> | UltralightCommand |
| + | | 0xd5 | <- | UltralightReply | Unsolicited card event ('' | ||
| | 0xe4 | -> | ProxCardFunction | first 2 bytes specify function (4=VdvKa, 5=MifareClassic, | | 0xe4 | -> | ProxCardFunction | first 2 bytes specify function (4=VdvKa, 5=MifareClassic, | ||
| - | | 0xe5 | <- | ProxCardFunctionReply | | | + | | 0xe5 | <- | ProxCardFunctionReply | Returns 4 byte payload: 0x00, the function number (as above), 0x00, 0x00 | |
| | 0xe6 | -> | | //unknown, registered in GirogoIppHandler:: | | 0xe6 | -> | | //unknown, registered in GirogoIppHandler:: | ||
| | 0xe8 | -> | SecurityServices | first byte selects subcommand (0=GetVersionOfKey, | | 0xe8 | -> | SecurityServices | first byte selects subcommand (0=GetVersionOfKey, | ||
| Line 82: | Line 83: | ||
| -> - Host to Reader\\ | -> - Host to Reader\\ | ||
| <- - Reader to Host | <- - Reader to Host | ||
| + | |||
| + | ==== 0xD5 UltralightReply — unsolicited card events ==== | ||
| + | |||
| + | '' | ||
| + | |||
| + | ^ byte 0 ^ meaning ^ payload ^ | ||
| + | | 0x00 | Card entered field | byte 1 = 0x00 (purpose unknown); bytes 2–8 = 7-byte UID (cascade / double UID format, e.g. '' | ||
| + | | 0x01 | Card left field | byte 1 = 0x00 | | ||
| + | |||
| + | ==== 0xD4 UltralightCommand / 0xD5 UltralightReply — subcommands ==== | ||
| + | |||
| + | Host sends 0xD4 with '' | ||
| + | |||
| + | Reply format: '' | ||
| + | |||
| + | Status codes: '' | ||
| + | |||
| + | ^ subcmd ^ name ^ request payload (after subcmd byte) ^ reply payload (after subcmd + status) ^ | ||
| + | | 0x02 | Read | '' | ||
| + | | 0x03 | Write | '' | ||
| + | | 0x04 | Authenticate (raw key) | '' | ||
| + | | 0x05 | Authenticate (key index) | '' | ||
| + | | 0x06 | Authenticate (index + key) | '' | ||
| + | | 0x07 | Abort | //none// — exactly 1 byte total | //empty// | | ||
| + | | 0x00–0x01, | ||
| + | |||
| + | Notes: | ||
| + | * Subcmds 0x02–0x07 are registered in '' | ||
| + | * If no card is in the field, the device echoes '' | ||
| + | * To read all pages of an NTAG 215: send subcmd 0x02 with '' | ||
| ==== Sample reader flow ==== | ==== Sample reader flow ==== | ||
| Line 146: | Line 177: | ||
| * Host only sends two types of messages after initialization - both of type 0xBC. One is length 1 and the body is always 0x60 (+ negated CRC 2A714F60), the other is of length 4 and the body is always 5A2BC3F9 (+ negated-CRC 11A8A56A) | * Host only sends two types of messages after initialization - both of type 0xBC. One is length 1 and the body is always 0x60 (+ negated CRC 2A714F60), the other is of length 4 and the body is always 5A2BC3F9 (+ negated-CRC 11A8A56A) | ||
| + | |||
cvend.1773778113.txt.gz · Last modified: by penguinowl
