Friday, November 28, 2014

CCID descriptor statistics: dwFeatures

Article from the serie "CCID descriptor statistics".

The dwFeatures field is a number value from the CCID USB descriptor:
This value indicates what intelligent features the CCID has. The value is a bitwise OR operation performed on the following values:
  • 00000000h No special characteristics
  • 00000002h Automatic parameter configuration based on ATR data
  • 00000004h Automatic activation of ICC on inserting
  • 00000008h Automatic ICC voltage selection
  • 00000010h Automatic ICC clock frequency change according to active parameters provided by the Host or self determined
  • 00000020h Automatic baud rate change according to active parameters provided by the Host or self determined
  • 00000040h Automatic parameters negotiation made by the CCID (use of warm or cold resets or PPS according to a manufacturer proprietary algorithm to select the communication parameters with the ICC)
  • 00000080h Automatic PPS made by the CCID according to the active parameters
  • 00000100h CCID can set ICC in clock stop mode
  • 00000200h NAD value other than 00 accepted (T=1 protocol in use)
  • 00000400h Automatic IFSD exchange as first exchange (T=1 protocol in use)
Only one of the following values may be present to select a level of exchange:
  • 00010000h TPDU level exchanges with CCID
  • 00020000h Short APDU level exchange with CCID
  • 00040000h Short and Extended APDU level exchange with CCID
  • If none of those values is indicated the level of exchange is character.
Only one of the values 00000040h and 00000080h may be present. When value 00000040h is present the host shall not try to change the FI, DI, and protocol currently selected.

When an APDU level for exchanges is selected, one of the values 00000040h or 00000080h must be present, as well as the value 00000002h.

To support selective suspend:
  • 00100000h USB Wake up signaling supported on card insertion and removal
When bit 20th, as shown above, is set bit D5 in bmAttributes of the Standard Configuration Descriptor must be set to 1.

dwFeatures#%
0x000102303614.17 %
0x000100BA2710.63 %
0x00020840207.87 %
0x000207B2197.48 %
0x00010030187.09 %
0x000204BA114.33 %
0x0002047E103.94 %
0x000404B2103.94 %
0x000406BA103.94 %
0x000404BE93.54 %
0x000404BA83.15 %
0x000204BE62.36 %
0x0001033051.97 %
0x0004004251.97 %
0x000101BA41.57 %
0x000102BA41.57 %
0x0000084031.18 %
0x000100B631.18 %
0x0002047231.18 %
0x000400FE31.18 %
0x0000003020.79 %
0x0001007A20.79 %
0x0001020020.79 %
0x0001023C20.79 %
0x0002004020.79 %
0x0002067220.79 %
0x000206BA20.79 %
0x0004047E20.79 %
0x000404B020.79 %
0x000004B210.39 %
0x0001000010.39 %
0x0001000210.39 %
0x0001007010.39 %
0x0001013010.39 %
0x0001013810.39 %
0x0001023810.39 %
0x0001023A10.39 %
0x000102B810.39 %
0x000103B110.39 %
0x000104BA10.39 %
0x0002004210.39 %
0x0002004E10.39 %
0x0002005E10.39 %
0x0002043010.39 %
0x000204B210.39 %
0x000205B210.39 %
0x000205B810.39 %
0x0002087010.39 %
0x000405F210.39 %
0x0004067210.39 %
0x0004084010.39 %


The dwFeatures field is the most complex field in a CCID descriptor. The numerical value is not really informative. You have to parse the value to extract every bit of information.

We will now parse dwFeatures field by field. I will not explain each possible value. Have a look at the CCID specification or my CCID driver file ifdhandler.c in the function IFDHSetProtocolParameters().

No special characteristics: 00000000h

No reader.


Undocumented bit: 00000001h

1 reader: OMNIKEY CardMan 1021


Automatic parameter configuration based on ATR data: 00000002h

151 readers


Automatic activation of ICC on inserting: 00000004h

37 readers


Automatic ICC voltage selection: 00000008h

108 readers


Automatic ICC clock frequency change according to active parameters provided by the Host or self determined: 00000010h

217 readers


Automatic baud rate change according to active parameters provided by the Host or self determined: 00000020h

216 readers


Automatic parameters negotiation made by the CCID: 00000040h

60 readers


Automatic PPS made by the CCID according to the active parameters: 00000080h

126 readers


CCID can set ICC in clock stop mode: 00000100h

34 readers


NAD value other than 00 accepted (T=1 protocol in use): 00000200h

87 readers


Automatic IFSD exchange as first exchange (T=1 protocol in use): 00000400h

102 readers


ICCD: 00000800h

25 readers


level of exhange

dwFeatures#%
Character62.36 %
TPDU11344.49 %
Short APDU8332.68 %
Short and Extended APDU5220.47 %


USB Wake up signaling supported on card insertion and removal: 00100000h

No reader


Data analysis

It is difficult to say if a reader should or should not support a particular feature.

One easy case is the level of exchange. As explained in Extended APDU support not all readers can support extended APDUs. If your application and your card is using extended APDU you shall use a reader with extended APDU support. That is either a TPDU or a short and extended APDU reader. 44.49 % + 20.47 % = 64.96% of the readers support extended APDU.

Regarding the other features the choice is between:
  • a feature implemented by the reader
    • Simpler driver
    • Impossible to patch in the driver if the reader firmware or a smart card is bogus
  • a feature implemented by the driver
    • More complex driver
    • Possible to modify the driver to adapt the feature to special cases (bogus reader firmware or bogus smart card)

My CCID driver is already "complex" with support of most the features. Some features are not yet supported but nobody asked from them. So I imagine they are not important.

So, except for the extended APDU support, the other features presented here are not so important. It may be more important for you to check if the reader supports the communication speed of your smart card, or the voltage of your card.