Sunday, March 22, 2020

ATR statistics: ATR list growth (part 2)

In January 2016 I started a study of each byte contained in a smart card ATR. See "ATR list study".

My goal was to publish one new article every week. So with 19 bytes that was a job for 5 months. But it took me more than 4 years! I imagine it is because of some lack of time and/or motivation.

My first article was about the ATR list growth. In January 2016 I had 2098 ATRs in the list. Now I have 3316 ATRs in the list and the number is still growing.


The red line indicates the position in January 2016.

New ATRs only

In 2016 the linear regression for the graph was y = 6.308x10-6 x - 940.4.
For the last 4 years it is y = 9.381x10-6 x - 2409.7

The growth is now 48% faster than before. Woah!

I guess that is because it is very simple to submit a new ATR using the web interface at Before I create this service, in 2010, you had to send me a new ATR by email. Now you just (mostly) click on a button.

No, I will not re-compute all the statistics with the new, more complete, ATR list.

Thank you

to all of you who submit new ATRs.

ATR statistics: TCK - Check byte TCK (conditional)

Article from the series "ATR statistics".

TCK - Check byte TCK (conditional)

The ISO 7816-3 specification is not public. So I can't copy/paste part of the text. I will use Wikipedia instead.
The ChecK byte (if present) allows a check of the integrity of the data in the ATR. If present, TCK is the Exclusive OR of the bytes in the ATR from T0 (included) to TCK (excluded).
TCK shall be present if and only if any of the TDi present in the ATR encodes a value of T other than 0.

110353.23 %
0x001235.94 %
0x1290.43 %
0x2890.43 %
0x0580.39 %
0x8980.39 %
0x9980.39 %
0xC180.39 %
0x0370.34 %
0x0970.34 %
0x0E70.34 %
0x1670.34 %
0x1C70.34 %
0x3870.34 %
0x4370.34 %
0x6570.34 %
0x8870.34 %
0x8C70.34 %
0xA570.34 %
0xB770.34 %
0x0660.29 %
0x0D60.29 %
0x1560.29 %
0x1B60.29 %
0x4A60.29 %
0x5260.29 %
0x5960.29 %
0x5A60.29 %
0x6260.29 %
0x6A60.29 %
0x6D60.29 %
0x7660.29 %
0x7760.29 %
0x7A60.29 %
0x7F60.29 %
0x8360.29 %
0x9060.29 %
0x9C60.29 %
0xA160.29 %
0xA960.29 %
0xF360.29 %
0xFF60.29 %
0x-150.24 %
0x0A50.24 %
0x0F50.24 %
0x1450.24 %
0x1850.24 %
0x1E50.24 %
0x3150.24 %
0x3A50.24 %
0x3C50.24 %
0x4550.24 %
0x5850.24 %
0x6B50.24 %
0x7550.24 %
0x7E50.24 %
0x8050.24 %
0x8450.24 %
0x8F50.24 %
0x9850.24 %
0xB650.24 %
0xBD50.24 %
0xC450.24 %
0xCC50.24 %
0xD250.24 %
0xDA50.24 %
0xFE50.24 %
0x0740.19 %
0x1740.19 %
0x1940.19 %
0x1A40.19 %
0x1D40.19 %
0x2140.19 %
0x2440.19 %
0x3240.19 %
0x3940.19 %
0x3F40.19 %
0x4940.19 %
0x4C40.19 %
0x5C40.19 %
0x5E40.19 %
0x6040.19 %
0x6340.19 %
0x6840.19 %
0x6C40.19 %
0x7040.19 %
0x7140.19 %
0x7440.19 %
0x7940.19 %
0x8640.19 %
0x8A40.19 %
0x9140.19 %
0x9540.19 %
0x9B40.19 %
0x9D40.19 %
0x9F40.19 %
0xA040.19 %
0xA240.19 %
0xA640.19 %
0xB040.19 %
0xB440.19 %
0xBE40.19 %
0xC940.19 %
0xD040.19 %
0xD640.19 %
0xE040.19 %
0xE140.19 %
0xE940.19 %
0xEC40.19 %
0xF840.19 %
0x0130.14 %
0x0230.14 %
0x0830.14 %
0x0C30.14 %
0x1F30.14 %
0x2A30.14 %
0x3030.14 %
0x3330.14 %
0x3D30.14 %
0x4730.14 %
0x4D30.14 %
0x4E30.14 %
0x4F30.14 %
0x5330.14 %
0x5530.14 %
0x5730.14 %
0x5B30.14 %
0x6F30.14 %
0x7230.14 %
0x7830.14 %
0x7B30.14 %
0x7D30.14 %
0x8230.14 %
0x9230.14 %
0x9430.14 %
0x9730.14 %
0x9A30.14 %
0x9E30.14 %
0xA830.14 %
0xAA30.14 %
0xAB30.14 %
0xAD30.14 %
0xB130.14 %
0xB930.14 %
0xBC30.14 %
0xC230.14 %
0xC530.14 %
0xCF30.14 %
0xD330.14 %
0xD430.14 %
0xD730.14 %
0xDF30.14 %
0xEF30.14 %
0xF230.14 %
0xF430.14 %
0xF730.14 %
0xFA30.14 %
0x1020.10 %
0x1120.10 %
0x1320.10 %
0x2220.10 %
0x2520.10 %
0x2620.10 %
0x2720.10 %
0x2920.10 %
0x2B20.10 %
0x2D20.10 %
0x2E20.10 %
0x3520.10 %
0x3620.10 %
0x3B20.10 %
0x4020.10 %
0x4120.10 %
0x4820.10 %
0x5020.10 %
0x5120.10 %
0x5420.10 %
0x5D20.10 %
0x5F20.10 %
0x6420.10 %
0x6620.10 %
0x6720.10 %
0x6920.10 %
0x7320.10 %
0x7C20.10 %
0x8520.10 %
0x8720.10 %
0x8B20.10 %
0x8D20.10 %
0x8E20.10 %
0xAC20.10 %
0xAF20.10 %
0xBA20.10 %
0xBB20.10 %
0xC320.10 %
0xC720.10 %
0xC820.10 %
0xD520.10 %
0xD820.10 %
0xDC20.10 %
0xDD20.10 %
0xDE20.10 %
0xE420.10 %
0xE520.10 %
0xE820.10 %
0xEA20.10 %
0xEB20.10 %
0xF020.10 %
0xF620.10 %
0xFB20.10 %
0xFC20.10 %
0xFD20.10 %
0x0410.05 %
0x0B10.05 %
0x2310.05 %
0x2C10.05 %
0x2F10.05 %
0x3E10.05 %
0x4210.05 %
0x4610.05 %
0x5610.05 %
0x6110.05 %
0x8110.05 %
0x9310.05 %
0x9610.05 %
0xA310.05 %
0xA710.05 %
0xAE10.05 %
0xB210.05 %
0xB310.05 %
0xB510.05 %
0xC610.05 %
0xCA10.05 %
0xCB10.05 %
0xCE10.05 %
0xD110.05 %
0xD910.05 %
0xDB10.05 %
0xE210.05 %
0xE310.05 %
0xEE10.05 %
0xF110.05 %
0xF510.05 %
0xF910.05 %

A large part (53%) or ATR do not have a TCK. These cards are T=0 only.

Some ATR have a TCK of 0 but this value is invalid. For example with 3B 88 80 01 00 00 00 00 77 83 95 00 00.
In most cases the TCK has a value of 0 but that is because a pattern is used in the ATR matching. For example with 3B 8C 80 01 04 43 FD 00 00 00 00 00 00 00 00 00 00. The pattern used to match the ATR is "3B 8C 80 01 04 43 FD .. .. .. .. .. .. .. .. .. .." to accept any value for the "." but my program replaced any "." by a "0".

Some ATR should have an ATR but do NOT contain it. For example with 3B 9E 96 80 1F C7 80 31 E0 73 FE 21 1B 66 D0 01 77 97 0D 00. My parsing program indicates TCK = 0x-1 in this case but that is only a way to indicate a missing TCK. Only 4 ATRs are in this category.

Since the TCK is a checksum no special value is expected. So it is not surprising that the values from 1 to 255 have a mostly equal distribution.

ATR statistics: Historical bytes - Historical bytes Ti (optional)

Article from the series "ATR statistics"

Historical bytes Ti (optional)

The ISO 7816-3 specification is not public. So I can't copy/paste part of the text. I will use Wikipedia instead.

From Wikipedia
Historical Characters Ti for i≥1, if present (as defined by K coded in T0), typically hold Information about the Card Builder, Type of Card (Size etc.), Version number and the State of the Card.

You can read the previous article about the T0 byte at ATR statistics: T0 - Format byte.

Regarding the T0 high nibble values we have:

0x0F74335.86 %
0x0E21210.23 %
0x0D1507.24 %
0x071366.56 %
0x051286.18 %
0x081165.60 %
0x0B1155.55 %
0x0A1075.16 %
0x09904.34 %
0x06864.15 %
0x0C723.47 %
0x04462.22 %
0x02401.93 %
0x03150.72 %
0x00130.63 %
0x0130.14 %

A large part (38%) of the ATR have 15 (0x0F) historical bytes, i.e. the maximum size.

The bytes can contain application information like for 3B 6F 00 FF 00 56 72 75 54 6F 6B 6E 73 30 20 00 00 90 00
Historical bytes00 56 72 75 54 6F 6B 6E 73 30 20 00 00 90 00
Category indicator byte: 0x00 (compact TLV data object)
Tag: 5, Len: 6 (card issuer's data)
Card issuer data: 72 75 54 6F 6B 6E "ruTokn"
Tag: 7, Len: 3 (card capabilities)
Selection methods: 48
- DF selection by file identifier
- DF selection by path
Data coding byte: 32
- Behaviour of write functions: proprietary
- Value 'FF' for the first byte of BER-TLV tag fields: valid
- Data unit in quartets: 0
Command chaining, length fields and logical channels: 0
- Logical channel number assignment: No logical channel
- Maximum number of logical channels: 1
Mandatory status indicator (3 last bytes)
LCS (life card cycle): 0 (No information given)
SW: 90 00 ()
or contain only the card name like for 3B 6F 00 FF 52 53 41 53 65 63 75 72 49 44 28 52 29 31 30
Historical bytes52 53 41 53 65 63 75 72 49 44 28 52 29 31 30
Category indicator byte: 0x52(proprietary format) "SASecurID(R)10"

I do not think it is important to detail all the possible information contained in the historical bytes.

For those who are interested you can read the ISO 7816-4 (note: not the 7816-3) chapter "8.1.1 Historical bytes".

Saturday, March 21, 2020

ATR statistics: TC4

Article from the series "ATR statistics".


TC4 should have the same meaning as TC3.

For T = 1: type of error detection code used

Bit 1 of the first TC for T=1 indicates the error detection code to be used:
  • CRC if bit 1 is set to 1;
  • LRC (default value) if bit 1 is set to 0.
Bits 8 to 2 of the first TC for T=1 are reserved for future use and shall be set to 0.

2072100.00 %

In my list of ATR none of them defines an TC4.

Wednesday, March 18, 2020

Wait for a card state change: SCardGetStatusChange()

I am "often" asked for a way to detect a card movement. There is a simple active loop solution but the correct answer is to use SCardGetStatusChange()

Simple but inefficient approach

It is possible to get a reader status using SCardStatus(). It is then possible to imagine something like:

  SCardStatus(hCard, NULL, 0, &dwState, NULL, NULL, NULL);
  if (dwState & SCARD_PRESENT)
    do stuff

The problems with this code are:
  • it consumes CPU cycles even when nothing happens
  • when the code is executing the sleep(1) then no card movement is detected. So you can wait for up to 1 second before you detect a card event. You can shorted the delay to 0.1 second but then you will waste even more CPU cycles.
Of course this solution is not efficient and not recommanded.

Correct solution: SCardGetStatusChange()

The WinSCard API provides the function SCardGetStatusChange() to wait for events.

You give a list of reader names and the function returns when the state of one (or more) reader changes, or a timeout occurs. I let you read the API documentation for the details.

You can interrupt the function using SCardCancel() if needed. The function will then return before the expiration of the timeout.

Source code

#include <stdio.h>
#include <stdlib.h>

#ifdef __APPLE__
#include <PCSC/winscard.h>
#include <PCSC/wintypes.h>
#include <winscard.h>

#define CHECK(f, rv) printf(f ":[0x%08lX] %s\n", rv, pcsc_stringify_error(rv))

int main(void)
    LONG rv;
    SCARDCONTEXT hContext;
    LPTSTR mszReaders = NULL;
    DWORD dwReaders;

    rv = SCardEstablishContext(SCARD_SCOPE_USER, NULL, NULL, &hContext);
    CHECK("SCardEstablishContext", rv);


    rv = SCardListReaders(hContext, NULL, (LPTSTR)&mszReaders, &dwReaders);
    CHECK("SCardListReaders", rv);
    rv = SCardListReaders(hContext, NULL, NULL, &dwReaders);
    CHECK("SCardListReaders", rv);

    mszReaders = calloc(dwReaders, sizeof(char));
    rv = SCardListReaders(hContext, NULL, mszReaders, &dwReaders);
    CHECK("SCardListReaders", rv);

    if (dwReaders > 1)
 printf("Using reader: %s\n", mszReaders);

 SCARD_READERSTATE reader_states[] = {
  .szReader = mszReaders,
  .pvUserData = NULL,
  .dwCurrentState = SCARD_STATE_UNAWARE,
  .dwEventState = SCARD_STATE_UNAWARE,

 /* first call to get the current state */
 rv = SCardGetStatusChange(hContext, 0, reader_states, 1);
 CHECK("SCardGetStatusChange", rv);

 /* set the state we expect to change */
 reader_states[0].dwCurrentState = reader_states[0].dwEventState;

 /* wait for a state change, or a timeout after 3 seconds */
 rv = SCardGetStatusChange(hContext, 3 * 1000, reader_states, 1);
 CHECK("SCardGetStatusChange", rv);

 printf(".dwEventState: 0x%08lX\n", reader_states[0].dwEventState);

    rv = SCardFreeMemory(hContext, mszReaders);
    CHECK("SCardFreeMemory", rv);

    rv = SCardReleaseContext(hContext);
    CHECK("SCardReleaseContext", rv);

    return 0;


The code uses the first reader returned by SCardListReaders(). I wanted to keep the code very simple. Adding support of multi readers is left as an execise to the reader.

pcsc-lite on GNU/Linux supports the auto allocation. But the PC/SC API on macOS does not. That is why I use the #ifdef SCARD_AUTOALLOCATE.


The outputs on GNU/Linux and macOS are slightly different. Can you find the difference (except the reader name)?


$ ./sample 
SCardEstablishContext:[0x00000000] Command successful.
SCardListReaders:[0x00000000] Command successful.
Using reader: Gemalto PC Twin Reader 00 00
SCardGetStatusChange:[0x00000000] Command successful.
SCardGetStatusChange:[0x00000000] Command successful.
.dwEventState: 0x00050022
SCardFreeMemory:[0x00000000] Command successful.
SCardReleaseContext:[0x00000000] Command successful.


$ ./sample
SCardEstablishContext:[0x00000000] Command successful.
SCardListReaders:[0x00000000] Command successful.
SCardListReaders:[0x00000000] Command successful.
Using reader: Cherry KC 1000 SC Z
SCardGetStatusChange:[0x00000000] Command successful.
SCardGetStatusChange:[0x00000000] Command successful.
.dwEventState: 0x00000022
SCardReleaseContext:[0x00000000] Command successful.


The difference is the .dwEventState value. On GNU/Linux the 16 upper bits are not 0.

From the documentation:
dwEventState also contains a number of events in the upper 16 bits (dwEventState & 0xFFFF0000). This number of events is incremented for each card insertion or removal in the specified reader. This can be used to detect a card removal/insertion between two calls to SCardGetStatusChange()

In the GNU/Linux output we have .dwEventState: 0x00050022 so we got 5 card events for this reader. The events were card insertion, removal, insertion, removal and insertion.

The lower 16-bits value is 0x0022 in both cases and it indicates SCARD_STATE_CHANGED and SCARD_STATE_PRESENT.

Other language

SCardGetStatusChange() is for the C language API. Since it is possible to use the smart card API with many languages (at least 23) each wrapper has (or should have) its own equivalent.

For example in Python you can use the low level API with the Python method SCardGetStatusChange() or use the higher API with the CardMonitor() class.


It is easy to use SCardGetStatusChange(). Please use it when needed.

It is also easy to misuse it. After writting this article I (re)discovered that I already wrote about SCardGetStatusChange() in "How to use SCardGetStatusChange()?" two years ago. This articles has different details and may also help you.

Sunday, March 8, 2020

New version of pcsc-tools: 1.5.6

I just released a new version of pcsc-tools, a suite of tools for PC/SC.


1.5.6 - 8 March 2020, Ludovic ROUSSEAU
  • 62 new ATRs
  • pcsc_scan: better support of Windows

See also my previous article "Better pcsc_scan on Windows".

Saturday, March 7, 2020

Better pcsc_scan on Windows

Since pcsc-tools 1.5.0 (May 2017) it is possible to build and use pcsc_scan on Windows.
See my previous blog article "pcsc_scan on Windows".

New version

digitalentropy user reported a bug on Windows. So I had a look to fix the problem and also improved pcsc_scan on Windows at the same time.

New features

  • Color support
    The Windows terminal is now recognized and the output is in color.
    The colors may look ugly on a white on black terminal. Sorry for that.
  • Exit key
    You can now quit the program by pressing the shift key. The combination Ctrl-C does not work on Windows to send a signal to the process so I had to use something else.

Sample output

Binary download

You can download the Windows binary from the project page in the Windows section at the bottom of the web page.

Saturday, February 15, 2020

I love Free Software

I love Free Software

All the software projects I develop on my free time are Free Software. I also use a LOT of Free Software projects for many different things.

I created this blog just to talk about my activities in Free Software and document what I think is interesting to you.

Sunday, February 2, 2020

User eXperience fixes for "Smart card ATR parsing"

Smart card ATR parsing

My web site/service "Smart card ATR parsing" is used to parse smart card ATR. You can read the previous article "Parsing an ATR: new web site URL" to get some background history.

If you have an ATR I do not already have in my database you can submit it with a description of the corresponding smart card.


I sometimes receive strange ATR to be added the list. For example I just received these 2 ATRs:
What is strange with these 2 ATRs is that:
  1. I already have a shorter version in my list
  2. they have 4 extra bytes at the end
  3. these 4 extra bytes "3B 02 14 50" look like another ATR
At first I thought of a corrupted ATR or a bogus reader or driver that mixes 2 ATRs.
But then I realised that the value "3B 02 14 50" is the default value I use for the ATR input field. So if you copy & paste a new ATR value without removing the default value then the default value is appended to your ATR.


The solution is now obvious. The problem is with my web site.
The value "3B 02 14 50" is now a placeholder= and not a value=. You can copy & paste a new ATR in the input field and the "3B 02 14 50" will disappear.


I was aware of this problem. I used to first select the default value "3B 02 14 50" to replace it with the real ATR. I thought every body would do the same as me. I was wrong and the User eXperience was bad.

The web site should now be more useful to my users and also easier to use.
Do not hesitate to complain if you find a bug or want to suggest a UX improvement.

Friday, January 31, 2020

ATR statistics: TB4 - Global after T=15 in TDi–1

Article from the series "ATR statistics".

TB4 - Global after T=15 in TDi–1

For T=15 protocol TBi the coding is defined in the document ETSI TS 102 221 V10.0.0 (2011-12) chapter "6.3.3 Global Interface byte".

Table 6.7: Coding of the first TBi (i > 2) after T = 15 of the ATR

00000000No additional global interface parameters supported
1--1----Low Impedance drivers and protocol available on the I/O line available (see clause 7.2.1)
11------Inter-Chip USB UICC-Terminal interface supported as defined in TS 102 60
1-1-----UICC-CLF interface supported as defined in TS 102 613
1---1---Secure Channel supported as defined in TS 102 484
1---11--Secured APDU - Platform to Platform required as defined in TS 102 484
NOTE: Any other value is RFU.

207099.90 %
0x8320.10 %

Only 2 cards have a TB4 in the ATR. They are:
The 2 cards use the same value for TB4: 0x83 that is RFU.

GitHub Sponsors

GitHub Sponsors

GitHub now proposes a way to fund the Free Software projects you use. From their presentation page:
A new way to contribute on GitHub
Funding developers and organizations through GitHub Sponsors is one more way to contribute to open source projects you appreciate. Help projects get the resources they need, and recognize contributors working behind the scenes to make open source better for everyone.
With Sponsors, any GitHub user can sponsor any open source developer or organization in the program.
I am now part of the Sponsors project. You can sponsor my Free Software projects on github.
You will find a Sponsor button in each project page. For example:

I am really new to this program so I have no idea how it will work for me and my Free Software projects.
I configured two options: 1 $ per month and 10 $ per month. Maybe I should configure more options. Just tell me.

Other funding systems

I already tried other ways to receive some money.


In 2010 I tried Flattr. See "How to help my projects?" but, as I explained in "My Flattr experience" 4 years later, all the money went to Flattr itself as "tax".
It was not a positive experience.


In 2014 I created a bitcoin account. See "How to help my projects? Send me bitcoins!". After 2 years (in 2016) I made a status in "Bitcoins received for this blog: 2 years later".

Since the bitcoin blockchain is public you can see all the transactions I received so far. In 5 years I received 0.12837149 BTC (around 1000 €) for a total of 10 donations.
That is ~200 € per year or ~15 € per month. That is enough to pay for the VPS I use to host the services.

Maybe I should make more advertising about the possibility to send me bitcoin.


I have no idea how the GitHub (owned by Microsoft) Sponsors program will evolve. I propose to make a status in 2 or 3 years to see how it goes.

Update: 1 Feb 2020

You can access my Sponsor page at

I added new options 2$, 4$ and 8$ per month in addition to the 1$ and 10$ per month to give you more flexibility. Maybe I should have used a Fibonacci suite instead? 🙂

Monday, January 6, 2020

New generator for the CCID readers pages

Since Python 2.x is no more maintained from 1st January 2020 I had to move the script to generate some CCID pages to Python 3.

These pages are the famous ones available from

Technology update

The previous Python script used templayer. templayer is no more maintained since 2009 and only works with Python 2.
I now use Jinja2.

Request for comments

If you see a problem or want to propose a change to these web pages just email me or the pcsclite-muscle mailing list. It is the good time to make suggestions.
It can be about the information provided on the pages or the graphical design of the pages (you may have noted that I am not a website designer).

Saturday, January 4, 2020

New version of pcsc-tools: 1.5.5

I just released a new version of pcsc-tools, a suite of tools for PC/SC.


1.5.5 - 4 January 2020, Ludovic ROUSSEAU
  • 353 new ATRs
  • scriptor: add -u option to make stdout unbuffered

Friday, January 3, 2020

New version of pcsc-lite: 1.8.26

I just released a new version of pcsc-lite 1.8.26.
pcsc-lite is a Free Software implementation of the PC/SC (or WinSCard) API for Unix systems.


1.8.26: Ludovic Rousseau
3 January 2020
  • Use poll() instead of select() to allow file descriptor higher than FD_SETSIZE
  • Enable reader filtering by default
  • pcsc-spy:
    • Do not read output buffer after error
    • Adjust code to handle autoallocated buffers
    • fix year-2038 issue by using long instead of int
  • Android: fix compilation
  • if client/server protocol mismatch:
    • log an explicit message
    • SCardEstablishContext() returns SCARD_E_SERVICE_STOPPED
  • polkit: log the error message if polkit_authority_get_sync() fails
  • Exit with EXIT_SUCCESS on shutdown to please systemd
  • Doxygen: fix minor issues in the documentation
  • Add --disable-documentation option
  • Fix a minor memory leak


The major change is the use of reader filtering by default. No need to rebuild pcsc-lite using --enable-filter any more.
The feature was introduced in 2015 and is documented at "Remove and/or customize PC/SC reader names".

This feature is requested in packages by some users.

To avoid that each GNU/Linux distribution changes the packaging configuration to enable the feature I decided to enable the feature by default in the upstream project.

This change should not have any bad side effect. Only root can modify the configuration file /etc/default/pcscd or the systemd file /etc/systemd/system/pcscd.service.d/override.conf.

For systemd use: sudo systemctl edit pcscd to add something like:

You can get the previous behaviour by using
./configure --disable-filter

Wednesday, January 1, 2020

MUSCLE mailing list statistics for 2019

As I did in 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017 and 2018 I propose some statistics of the MUSCLE mailing list usage.


YearTotal number of messages Progression
2010718+19 %
2011999+39 %
2012207-79 %
2013198-4 %
2014194-2 %
2014194-2 %
2015120-38 %
2016125+4 %
2017128+2 %
201866-51 %
201929-56 %


Again a high decrease in number of messages.
I note that I receive many messages directly by email instead of from the mailing list.

My interpretation is (same as one year ago) that the development of pcsc-lite and related software is now complete. Only rare bugs are reported.
Now users are asking for support or help and the easiest way to contact me is using one of my emails.

Statistics from 3.1.2019 to 24.11.2019

People who have written most messages:

 Author  Msg  Percent
1ludovic.rousseau@gmail.com1655.17 %
2wrosenauer@gmail.com310.34 %
3brice.gagnage@renault.com26.90 %
4ertan@cronosmedikal.com26.90 %
5frankmorgner@gmail.com13.45 %
6=?iso-8859-1?Q?Ralph_Pr=FCtting_=40_Active_Key_GmbH_=26_Co=2E_KG?=13.45 %
700cpxxx@gmail.com13.45 %
8godfreyhkchung@gmail.com13.45 %
9pnickerson@cashstar.com13.45 %
10gsvelto@mozilla.com13.45 %
other00.00 %

Best authors, by total size of their messages (w/o quoting):

 Author  KBytes

Best authors, by average size of their message (w/o quoting):

 Author  bytes

Table showing the most successful subjects:

 Subject  Msg  Percent
1[Pcsclite-muscle] Interaction pcsc-lite and Yubikey413.79 %
2[Pcsclite-muscle] Bug fix for ccid-1.4.31310.34 %
3[Pcsclite-muscle] pcscd errors break https for chromium-based browsers26.90 %
4[Pcsclite-muscle] Stuck in a CCID_Receive Overrun error loop26.90 %
5[Pcsclite-muscle] Yubico YubiKey 5: RFInitializeReader() Open Port13.45 %
6[Pcsclite-muscle] Yubico YubiKey 5: RFInitializeReader() Open13.45 %
7[Pcsclite-muscle] Multiple command processing and card recognition13.45 %
8[Pcsclite-muscle] Very low cost PCSC card reader13.45 %
9[Pcsclite-muscle] Multiple command processing and card13.45 %
10New version of pcsc-lite: 1.8.2513.45 %
11[Pcsclite-muscle] What happened to the PC/SC workgroup (and site)?13.45 %
12[Pcsclite-muscle] CCID driver release13.45 %
13[Pcsclite-muscle] pcscd unable to handle second interface on ACS ACR1281U-C113.45 %
14[Muscle] Is there a way to know if a reader is contactless?13.45 %
15[Pcsclite-muscle] [Muscle] Is there a way to know if a reader is contactless?13.45 %
16[Pcsclite-muscle] acsccid 1.1.7 Released13.45 %
17New version of libccid: 1.4.3113.45 %
18[Pcsclite-muscle] Raise SCardTransmit timeout13.45 %
19[Pcsclite-muscle] looking for fast ISO7816-3 card (clock and baud rates)13.45 %
20[PATCH] Use poll() instead of select()13.45 %
21[Pcsclite-muscle] select()-induced crashes (and attached13.45 %
22[Pcsclite-muscle] NFC13.45 %
other00.00 %

Most used email clients:

 Mailer  Msg  Percent
1(unknown)2689.66 %
2Microsoft Outlook 16.026.90 %
3Mozilla/5.x13.45 %
other00.00 %

Table of maximal quoting:

 Author  Percent
1wrosenauer@gmail.com39.19 %
2godfreyhkchung@gmail.com16.23 %
3ertan@cronosmedikal.com9.90 %
400cpxxx@gmail.com3.77 %
5ludovic.rousseau@gmail.com2.78 %
6brice.gagnage@renault.com0.87 %
7frankmorgner@gmail.com0.00 %
8=?iso-8859-1?Q?Ralph_Pr=FCtting_=40_Active_Key_GmbH_=26_Co=2E_KG?=0.00 %
9pnickerson@cashstar.com0.00 %
10gsvelto@mozilla.com0.00 %
average2.99 %

Maximal quoting:

Author :
Subject : [Pcsclite-muscle] Interaction pcsc-lite and Yubikey

Date : Thu, 31 Jan 2019 11:49:26 +0100

Quote ratio: 78.91% / 4505 bytes

Longest message:

Author :
Subject : [Pcsclite-muscle] pcscd errors break https for chromium-based browsers
Date : Tue, 26 Feb 2019 20:28:50 +0200
Size : 363885 bytes

Most successful subject:

Subject : [Pcsclite-muscle] Interaction pcsc-lite and Yubikey
No. of msgs: 4
Total size : 19290 bytes

Final summary:

Total number of messages: 29
Total number of different authors: 10
Total number of different subjects: 22
Total size of messages (w/o headers): 1518712 bytes
Average size of a message: 52369 bytes

Input file last updated: Wed Jan 1 16:53:58 2020Generated by MailListStat v1.3

Happy new year 2020

Dear readers,

I wish you a happy new year for 2020.

In 2019 I published 25 articles on this blog (24 in 2018, 34 in 2017 and 49 in 2016 and 51 in 2015). It is stable compared to 2018.


The number of readers in 2019 is also stable compared to 2018.

A large part of readers came from the USA. This year Germany is second followed by France.

Most read articles

PCSC sample in C15.15 %=
Blog homepage24.80 %=
PC/SC sample in different languages34.62 %=
Smart card integration in macOS Sierra: CryptoTokenKit plugin43.42 %new
PCSC sample in C# 53.02 %-1
PCSC sample in Python 62,81 %-1
pcscd auto start using systemd 72.80 %=
PCSC sample in Java 82,19 %-2
Linux NFC driver conflicts with CCID driver for ACS ACR122U 92.12 %+1
PCSC sample in JavaScript (Node.js) 101.92 %-1

PC/SC sample articles are always successful. I wrote them in 2010.

The first article from those I wrote in 2019 is at position 20 and is "macOS Catalina and smart cards status".

If I use the results for the previous month (Dec 2019) I find a different picture:
We still have the old PC/SC samples (in C, Python, Java and C#) but also 4 articles about smart card and macOS.
I am happy to see my blog is useful to macOS users, developers, etc.

Thank you

Thank you to you, readers.

This blog has no advertising. If you want to support me you can send me some bitcoins. If you want to send $ or € instead of bitcoins then contact me.