CCID (PC/SC) over Serial

Overview

SpringCard USB-enabled devices running in PC/SC Mode implement the USB CCID specification. For convenience and efficiency, most SpringCard non-USB couplers also implement the CCID protocol on top of whatever communication interface they feature. This is known as “PC/SC-like” operation.

This chapter details the implementation of CCID over the Serial interface of a SpringCore device.

CCID protocol over Serial

Every message starts with a constant START mark (CD byte), followed by the Endpoint number (copied from USB), then the CCID Header and Payload. A 1-byte LRC terminates the message.

Byte Name Description
0 START mark Constant value CD (in hex)
1 Endpoint
2-11 CCID header Always present
12-N CCID payload Absent if not payload
N+1 LRC XOR of bytes 1-N (all the preceding bytes, expect the START byte)

Values for the Endpoint byte

Value Endpoint Purpose Protocol
00 ControlOut Control endpoint, PC to RDR See Non-USB Control
80 ControlIn Control endpoint, RDR to PC See Non-USB Control
02 BulkOut PC to RDR commands CCID_PC_To_RDR, see CCID protocol
81 BulkIn RDR to PC responses CCID_RDR_To_PC, see CCID protocol
83 InterruptIn RDR to PC notification of card(s) insertion/removal CCID_Interrupts, see CCID protocol

Format of the CCID header

The format conforms to the CCID specification for BulkOut and BulkIn endpoints. For the other endpoints, the format is exactly the same (hence not conform).

Byte Name Description
2 Message type Command or response opcode.
See tables in the CCID protocol chapter.
3-6 Length of payload DWORD, LSB-first
7-11 Parameters BulkOut/BulkIn endpoints: slot number and sequence number followed by 3 bytes of context-specific parameters or error/status
Other endpoints: free

Supported length

  • The shortest messages are 13-byte long (length=0, no payload),
  • BulkOut/BulkIn endpoints support 64kB of payload, i.e. messages up to 65549 bytes (max length is 0001000 in hex),
  • Other endpoints are limited to 256B of payload, i.e. messages up to 269 bytes (max length is 00000100 in hex).