cvend
Differences
This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
| cvend [2026-02-28 12:45 UTC (5 weeks ago)] – usually 0 but have occasionally seen the 3 lowest bits set in various ways, let's call it flags doof | cvend [2026-03-17 20:08 UTC (2 weeks ago)] (current) – [Card reader flow] penguinowl | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| ====== cVEND NFC Reader ====== | ====== cVEND NFC Reader ====== | ||
| - | |||
| cVEND is the NFC reader on the bottom half of the PM3 | cVEND is the NFC reader on the bottom half of the PM3 | ||
| Line 7: | Line 6: | ||
| The associated serial device appears to be at '' | The associated serial device appears to be at '' | ||
| - | |||
| ===== cVEND protocol notes ===== | ===== cVEND protocol notes ===== | ||
| Line 38: | Line 36: | ||
| | 0x10 | -> | Reset | | | | 0x10 | -> | Reset | | | ||
| | 0x11 | <- | ResetReply | | | | 0x11 | <- | ResetReply | | | ||
| - | | 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. | ||
| - | | 0x32 | -> | | //unknown, | + | | 0x32 | -> | CardRelease |
| - | | 0x46 | -> | | //unknown, | + | | 0x46 | -> | AbortCardHandling |
| | 0x96 | -> | PutFile | | | | 0x96 | -> | PutFile | | | ||
| | 0x97 | <- | PutFileReply | | | | 0x97 | <- | PutFileReply | | | ||
| Line 59: | Line 57: | ||
| | 0xaf | <- | ITSOCtrlReply | | | | 0xaf | <- | ITSOCtrlReply | | | ||
| | 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 | | ||
| - | | 0xb4 | -> | APDUProx | // | + | | 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), and 2 other mystery bytes, in some order | | ||
| | 0xb5 | <- | APDUProxReply | | | | 0xb5 | <- | APDUProxReply | | | ||
| | 0xb6 | -> | SAMCtrl | // | | 0xb6 | -> | SAMCtrl | // | ||
| Line 65: | Line 64: | ||
| | 0xb9 | <- | DESFireRead | sent by reader when DESFire card presented, after enabling DESFire with 0xe4 | | | 0xb9 | <- | DESFireRead | sent by reader when DESFire card presented, after enabling DESFire with 0xe4 | | ||
| | 0xba | -> | | //unknown, registered in ProxCardDesfire:: | | 0xba | -> | | //unknown, registered in ProxCardDesfire:: | ||
| - | | 0xbc | -> | | //unknown, registered | + | | 0xbb | <- | DESFireCardRemoved | sent by reader when DESFire card removed from field | |
| - | | 0xbe | <- | PICCRead | + | | 0xbc | -> | DESFireCommand |
| + | | 0xbd | <- | DESFireCommandReply | response to command, documented above | | ||
| + | | 0xbe | <- | UnhandledCard | ||
| | 0xce | -> | | //unknown, registered in IppHandling:: | | 0xce | -> | | //unknown, registered in IppHandling:: | ||
| - | | 0xd0 | -> | | //unknown, registered in EmvIppHandler:: | + | | 0xd0 | -> | EMV | first byte selects subcommand |
| - | | 0xd1 | <- | EMVTransactionSuccessUnk | + | | 0xd1 | <- | EMVStatus |
| | 0xd4 | -> | | //unknown, registered in ProxCardUltralightC:: | | 0xd4 | -> | | //unknown, registered in ProxCardUltralightC:: | ||
| - | | 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 | | | ||
| | 0xe6 | -> | | //unknown, registered in GirogoIppHandler:: | | 0xe6 | -> | | //unknown, registered in GirogoIppHandler:: | ||
| Line 77: | Line 78: | ||
| | 0xe9 | <- | SecurityServicesReply | | | | 0xe9 | <- | SecurityServicesReply | | | ||
| | 0xea | -> | | //unknown, registered in ProxCardMifareClassic:: | | 0xea | -> | | //unknown, registered in ProxCardMifareClassic:: | ||
| - | | 0xed | <- | Log | human-readable log message | + | | 0xed | <- | Log | first byte specifies log level (1=INFO, 2=WARNING, 3=ERROR) followed by null-terminated |
| -> - Host to Reader\\ | -> - Host to Reader\\ | ||
| <- - Reader to Host | <- - Reader to Host | ||
| + | |||
| + | ==== Sample reader flow ==== | ||
| + | |||
| + | - Host enables desired card type with '' | ||
| + | - Reader acknowledges with '' | ||
| + | - Reader waits for card, seems like it eventually goes to sleep without any stimuli. Might have to keep it awake by sending packets occasionally (e.g. '' | ||
| + | - When card is scanned, reader sends the corresponding read packet if the card type is enabled (e.g. '' | ||
| + | - Card data can then be queried by sending the equivalent command packets. DESFire commands are documented in {{ 0: | ||
| + | - Host sets DESFire application (e.g. packet type '' | ||
| + | - Reader responds with a status code in accordance with the documentation. This comes in the form of a '' | ||
| + | - Host sends read command. To read the full contents of file 0x00, the body is '' | ||
| + | - Reader responds with the status code and file data. | ||
| ==== Reader -> Host ==== | ==== Reader -> Host ==== | ||
cvend.1772282727.txt.gz · Last modified: by doof
