USB CCID Emulator

The USB CCID Emulator forwards a locally present PC/SC smart card reader as a standard USB CCID reader. USB CCID Emulator can be used as trusted intermediary enabling secure PIN entry and PIN modification. In combination with OpenSC 2 also PACE can be performed by the emulator.

System Message: WARNING/2 (\input{$wd/bilder/tikzstyles.tex} \tikzstyle{bla}=[kleiner, text width=.45\textwidth] \node (reader) {\includegraphics[width=1cm]{$wd/bilder/my_cardreader.pdf}}; \node (readertext) [right=0of reader, bla] {Smartphone provides smart card reader via USB}; \node (display) [below=0of reader] {\includegraphics[width=1cm]{$wd/bilder/display.pdf}}; \node (displaytext) [right=0of display, bla] {Secure display of service provider and purpose of transaction}; \node (keyboard) [below=0of display] {\includegraphics[width=1cm]{$wd/bilder/keyboard.pdf}}; \node (keyboardtext) [right=0of keyboard, bla] {Secure PIN Entry}; \node (firewall) [below=0of keyboard] {\includegraphics[width=1cm]{$wd/bilder/Firewall.pdf}}; \node (firewalltext) [right=0of firewall, bla] {Verification of terminal authentication and sanitiy checks}; \node (features) [fit=(display) (keyboard) (reader) (firewall)] {}; \node (moko) [left=0of features.west] {\includegraphics[height=4cm]{$wd/bilder/phone-fic-neo-freerunner.pdf}}; \node (epa) [left=1.5of moko, yshift=-2cm] {\includegraphics[width=3cm]{$wd/bilder/nPA_VS.png}}; \node (pc) [left=1.5of moko, yshift=1.5cm] {\includegraphics[width=3cm]{$wd/bilder/computer-tango.pdf}}; \begin{pgfonlayer}{background} \node (mokobox) [box, fit=(moko) (readertext) (displaytext) (keyboardtext) (firewalltext) (features)] {}; \draw [usb] (moko) -- (pc.center) ; \draw [decorate, decoration={expanding waves, angle=20, segment length=6}, nichtrundelinie] (moko) -- (epa) ; \end{pgfonlayer})

!pdf2svg command cannot be run

Portable smart card reader with trusted user interface

If the machine running ccid-emulator is in USB device mode, a local reader is forwareded via USB to another machine. If in USB host mode, the USB CCID reader will locally be present.

Applications on Windows and Unix-like systems can access the USB CCID Emulator through PC/SC as if it was a real smart card reader. No installation of a smart card driver is required since USB CCID drivers are usually shipped with the modern OS.

Here is a subset of USB CCID commands supported by the USB CCID Emulator with their PC/SC counterpart:

USB CCID

PC/SC

PC_to_RDR_XfrBlock

SCardTransmit

PC_to_RDR_Secure

FEATURE_VERIFY_PIN_DIRECT, FEATURE_MODIFY_PIN_DIRECT

PC_to_RDR_Secure (proprietary)

FEATURE_EXECUTE_PACE

PIN verification/modification and PACE can also be started by the application transmitting (SCardTransmit) specially crafted APDUs. Only the alternative initialization of PACE using SCardControl requires patching the driver (available for libccid, see patches). The pseudo APDUs with no need for patches are defined as follows (see BSI TR-03119 1.3 7 p. 33-34):

Command APDU

Response APDU

CLA

INS

P1

P2

Command Data

Response Data

SW1/SW2

GetReaderPACECapabilities

0xFF

0x9A

0x04

0x01

(No Data)

PACECapabilities

0x9000 or other in case of an error

EstablishPACEChannel

0xFF

0x9A

0x04

0x02

EstablishPACEChannelInput

EstablishPACEChannelOutput

DestroyPACEChannel

0xFF

0x9A

0x04

0x03

(No Data)

(No Data)

Verify/Modify PIN

0xFF

0x9A

0x04

0x10

Coding as PC_to_RDR_Secure

Coding as RDR_to_PC_DataBlock

The USB CCID Emulator is implemented using GadgetFS 1. Some fragments of the source code are based on the GadgetFS example and on the source code of the OpenSC tools.

System Message: WARNING/2 (\input{$wd/bilder/tikzstyles.tex} \tikzstyle{schicht}=[text width=5cm, align=right] \tikzstyle{fade down}=[path fading=south, color=huslateblue] \node (kernel) [box, shape=rectangle split, rectangle split parts=3, kleiner] {Linux Kernel \nodepart{second} \footnotesize S3C24xx Controller Driver \nodepart{third} \footnotesize GadgetFS }; \node (ccid) [aktivbox, shape=rectangle split, rectangle split parts=2, below=of kernel] {CCID Emulator \nodepart{second} \texttt{usb}\qquad\texttt{ccid} }; \draw [box] ($(ccid.text split)-(.05cm,0)$) -- ($(ccid.south)-(.05cm,0)$); \node (opensc) [box, below=of ccid, kleiner] {OpenSC}; \node (controller) [klein, right=0of kernel.two east, schicht] {Driver for USB Controller}; \node (gadget) [klein, right=0of kernel.three east, schicht] {Gadget Driver}; \node (upper) [klein, right=0of kernel.three east, schicht, yshift=-1.75cm] {Upper Layers}; \tikzstyle{rechts}=[to path={-- ++(1,0) |- (\tikztotarget)}] \tikzstyle{links}=[to path={-- ++(-1,0) |- (\tikztotarget)}] \begin{pgfonlayer}{background} \path (ccid.two west) edge [links, linie] (kernel.three west) (ccid.two east) edge [rechts, linie] (opensc.east) ; \path [color=black!30] (controller.north east) edge +(-9,0) (gadget.north east) edge +(-9,0) (upper.north east) edge +(-9,0) ; \end{pgfonlayer} \node [kleiner, anchor=east, text width=3cm] at ($($(ccid.two west)+(-3,0)$)!.5!(kernel.three west)$) {\color{hublue} \texttt{/dev/gadget/ep1-bulk}\\ \texttt{/dev/gadget/ep2-bulk}\\ \texttt{/dev/gadget/ep3-bulk}\\};)

!pdf2svg command cannot be run

Software stack of the USB CCID Emulator running on the OpenMoko Neo FreeRunner