Wednesday, February 24, 2021

Writing a SIM card phone book in Python

In the previous article "Reading a SIM card phone book in Python" I presented a program to read the phone book from a SIM card. I will now present the writing part.

 

Source code

The source code is in 2 parts: usim.py and usim_write.py files.

usim.py is the exact same file as in the previous article.

usim_write.py is:

#!/usr/bin/env python3

from smartcard.util import toBytes, padd
import random
import usim


def get_name():
    # List of firstnames from https://www.data.gouv.fr/fr/datasets/liste-de-prenoms/
    with open(random.choice(['f', 'm'])) as fd:
        lines = list(map(str.strip, fd.readlines()))
    return " ".join([random.choice(lines), random.choice(lines),
                    random.choice(lines)])


def get_number():
    numbers = "0123456789"
    phone = list()
    phone.append(random.choice(numbers) + random.choice(numbers))
    phone.append(random.choice(numbers) + random.choice(numbers))
    phone.append(random.choice(numbers) + random.choice(numbers))
    phone.append(random.choice(numbers) + random.choice(numbers))
    phone.append(random.choice(numbers) + random.choice(numbers))
    return " ".join(phone)


def new_record(size):
    # size-14 characters for the name
    name = get_name()[0:size-14]
    phone = get_number()
    print("name:", name)
    print("phone:", phone)
    record = padd(list(map(ord, name)), size-14) \
        + padd(toBytes("06 A1 " + phone), 14)
    return record


def usim_write(reader_nb):
    # Select the EF ADN
    (size, connection) = usim.usim(reader_nb)

    for nbr in range(1, 250):
        record = new_record(size)
        #  Update record
        header = [0xA0, 0xDC]
        record_idx = nbr
        cmd = header + [record_idx, 0x04, size] + record
        data, sw1, sw2 = connection.transmit(cmd)
        if (sw1, sw2) != (0x90, 0x00):
            return


if __name__ == "__main__":
    import sys
    if 2 == len(sys.argv):
        reader_nb = int(sys.argv[1])
    else:
        reader_nb = 0
    usim_write(reader_nb)


Comments

I wanted to have reasonable names and phone numbers in my phone book. So I generate names by randomly selecting 3 first names from 2 lists: the 50 first (by frequency of use) male first names in French stored in the m file, and the 50 first female first names in French stored in the f file. I got the data from https://www.data.gouv.fr/fr/datasets/liste-de-prenoms/. The original list also contains first names from other languages.

The first 10 lines of m are:

Pierre
Juste
Julien
Olivier
Henri
Jacques
Philippe
Nicolas
Aime
Antoine
[...]

The first 10 lines of f are:

Marie
Victoire
Claire
Marine
Reine
Virginie
Vienne
Solange
Jolie
Marguerite
[...]

For the phone number I just select a random 10-digits number.

Maybe the entries I created are non functional in a real phone. First check it works for you if you want to reuse this code. Also if you plan to reuse my source code you must read "My blog source code license" first.


Output

$ ./usim_write.py 
Available readers:
- Gemalto PC Twin Reader
Using: Gemalto PC Twin Reader
connecting to Gemalto PC Twin Reader
Select MF
> A0 A4 00 00 02 3F 00
<  [] 9F 22
Select DF Telecom
> A0 A4 00 00 02 7F 10
<  [] 9F 22
Select EF ADN
> A0 A4 00 00 02 6F 3A
<  [] 9F 0F
Get Response
> A0 C0 00 00 0F
< 00 00 21 34 6F 3A 04 00 11 FF 22 01 02 01 22 90 00
name: Juliette Claire Fran
phone: 50 47 00 17 44
> A0 DC 01 04 22 4A 75 6C 69 65 74 74 65 20 43 6C 61 69 72 65 20 46 72 61 6E 06 A1 50 47 00 17 44 FF FF FF FF FF FF FF
<  [] 90 00
name: Luc Nicolas Regis
phone: 83 46 67 10 73
> A0 DC 02 04 22 4C 75 63 20 4E 69 63 6F 6C 61 73 20 52 65 67 69 73 FF FF FF 06 A1 83 46 67 10 73 FF FF FF FF FF FF FF
<  [] 90 00
name: Julien Jeremie Serge
phone: 89 07 17 20 07
> A0 DC 03 04 22 4A 75 6C 69 65 6E 20 4A 65 72 65 6D 69 65 20 53 65 72 67 65 06 A1 89 07 17 20 07 FF FF FF FF FF FF FF
<  [] 90 00
[...]

The output is truncated. I do not want to include all the 255 phone numbers.

If I use usim_read.py (with debug disabled) I get:

$ ./usim_read.py 
Available readers:
- Gemalto PC Twin Reader
Using: Gemalto PC Twin Reader
Select MF
Select DF Telecom
Select EF ADN
Get Response
1: Name: Juliette Claire Fra, phone: 0574007144
2: Name: Luc Nicolas Regis.., phone: 3864760137
3: Name: Julien Jeremie Serg, phone: 9870710270
[...]

Note that the phone numbers are reversed by group of 2 digits. 50 47 00 17 44 becomes 0574007144.


Conclusion

It is as easy to write than to read a SIM phone book.

My goal here was to be able to write "realistic" phone book entries so that the usim_read.py has "real" data to read and display.

usim_read.py will be used again in the next episode.

Monday, February 22, 2021

Reading a SIM card phone book in Python

I already wrote a SIM phone book dumper program in 2004. This first version was in Perl and was presented in "SIM card phone book listing".

You can also find more advanced tools in articles with the SIM label, like cardpeek, monosim or PSSI.

I now present a version in Python using the PySCard wrapper

 

Source code

The source code is in 2 parts: usim.py and usim_read.py files.

usim.py is:

#!/usr/bin/env python3

from smartcard.System import readers
from smartcard.util import toBytes
from smartcard.CardConnectionObserver import ConsoleCardConnectionObserver

debug = True

def usim(reader_nb):
    # get all the available readers
    r = readers()
    print("Available readers:")
    for reader in r:
        print("-", reader)

    reader = r[reader_nb]
    print("Using:", reader)

    connection = reader.createConnection()
    if debug:
        observer = ConsoleCardConnectionObserver()
        connection.addObserver(observer)
    connection.connect()

    SELECT = "A0 A4 00 00 02 "
    GET_RESPONSE = "A0 C0 00 00 "

    # Select MF
    print("Select MF")
    data, sw1, sw2 = connection.transmit(toBytes(SELECT + "3F 00"))
    if sw1 != 0x9F:
        raise(Exception("Error"))

    # Select DF Telecom
    print("Select DF Telecom")
    data, sw1, sw2 = connection.transmit(toBytes(SELECT + "7F 10"))
    if sw1 != 0x9F:
        raise(Exception("Error"))

    # Select EF ADN
    print("Select EF ADN")
    data, sw1, sw2 = connection.transmit(toBytes(SELECT + "6F 3A"))
    if (sw1, sw2) != (0x9F, 0x0F):
        raise(Exception("Error"))

    # Get Response
    print("Get Response")
    data, sw1, sw2 = connection.transmit(toBytes(GET_RESPONSE) + [sw2])
    if (sw1, sw2) != (0x90, 0x00):
        raise(Exception("Error"))

    size = data[-1]

    pin = None
    if pin:
        print(pin)
        pin = list(map(ord, pin))
        padd(pin, 8)

        # Verify CHV
        VERIFY = "A0 20 00 01 08"
        cmd = toBytes(VERIFY) + pin
        data, sw1, sw2 = connection.transmit(cmd)
        if (sw1, sw2) != (0x90, 0x00):
            raise(Exception("Wrong PIN:" + pin))

    return size, connection


if __name__ == "__main__":
    usim(0)

usim_read.py is:

#!/usr/bin/env python3

from smartcard.util import toBytes, toASCIIString
import usim


def decode_record(record):
    """
    decode_record(toBytes("43 75 73 74 6F 6D 65 72 20 43 61 72 65 FF 06 A1 80 00 07 70 00 FF FF FF FF FF FF FF"))
    >> ['Customer Care', '0800700700']
    """
    X = len(record) - 14
    name = toASCIIString(record[0:X - 1]).replace("ΓΏ", "")
    # number of bytes for the phone number
    tel_size = record[X]
    phone = record[X + 2:X + tel_size + 1]

    decoded = ""
    for n in phone:
        hex = "%02X" % n
        high = hex[0]
        low = hex[1]
        decoded += low + high
    # if the number of digits is odd we suppress the padding
    if decoded[-1] == "F":
        decoded = decoded[:-1]
    phone = decoded

    return name, phone


def usim_read(reader_nb):
    # Select the EF ADN
    (size, connection) = usim.usim(reader_nb)

    for nbr in range(1, 250):
        #  Read record
        header = [0xA0, 0xB2]
        record_idx = nbr
        cmd = header + [record_idx, 0x04, size]
        data, sw1, sw2 = connection.transmit(cmd)
        if (sw1, sw2) != (0x90, 0x00):
            return

        name, phone = decode_record(data)
        if name != "":
            print(f"{record_idx}: Name: {name}, phone: {phone}")


if __name__ == "__main__":
    import sys
    if 2 == len(sys.argv):
        reader_nb = int(sys.argv[1])
    else:
        reader_nb = 0
    usim_read(reader_nb)


Comments

The debug is enabled. So you can see the communication between the application and the card.
You ned to change only one line to remove the APDU log if needed. 

The phone book record size is not fixed for all the SIM cards. The record size is returned in the last byte of the GET RESPONSE command after the SELECT EF (Elementary File) ADN (Abbreviated dialling numbers).

You can get more details about the EF ADN and the record coding in the document ETSI TS 131 102 V16.6.0 (2021-01) chapter "4.4.2.3 EF_ADN (Abbreviated dialling numbers)". It is important to note that ETSI (European Telecommunications Standards Institute) standards are public and free.

By default the first PC/SC reader is used. But you can select another reader by passing a number as argument to the program. We will use this feature later.

No PIN is defined and verified. I am using a sysmocom sysmoUSIM-SJS1 card. This card has the user PIN disabled by default.
You can enable PIN verification by defining a PIN in usim.py. The code is already present.

USIM (Universal Subscriber Identity Module) is a new application introduced for GSM version 3 (3G) to replace/improve the SIM (subscriber identity/identification) application. The code should work the same with a SIM card or a USIM card (but untested).

Output

$ ./usim_read.py 
Available readers:
- Gemalto PC Twin Reader
Using: Gemalto PC Twin Reader
connecting to Gemalto PC Twin Reader
Select MF
> A0 A4 00 00 02 3F 00
<  [] 9F 22
Select DF Telecom
> A0 A4 00 00 02 7F 10
<  [] 9F 22
Select EF ADN
> A0 A4 00 00 02 6F 3A
<  [] 9F 0F
Get Response
> A0 C0 00 00 0F
< 00 00 21 34 6F 3A 04 00 11 FF 22 01 02 01 22 90 00
> A0 B2 01 04 22
< 4C 61 75 72 65 20 46 72 61 6E E7 6F 69 73 65 20 59 76 6F 6E 06 A1 24 66 85 10 22 FF FF FF FF FF FF FF 90 00
1: Name: Laure Francoise Yvo, phone: 4266580122
> A0 B2 02 04 22
< 4C 75 63 69 65 6E 6E 65 20 48 65 6C 65 6E 65 20 4C 75 63 69 06 A1 76 45 65 28 77 FF FF FF FF FF FF FF 90 00
2: Name: Lucienne Helene Luc, phone: 6754568277
> A0 B2 03 04 22
< 55 72 62 61 69 6E 20 47 69 6C 6C 65 73 20 4A 75 73 74 65 FF 06 A1 80 38 74 16 54 FF FF FF FF FF FF FF 90 00
3: Name: Urbain Gilles Juste, phone: 0883476145
> A0 B2 04 04 22
< 4A 65 72 6F 6D 65 20 50 61 73 63 61 6C 20 46 65 72 6E 61 6E 06 A1 80 53 42 10 86 FF FF FF FF FF FF FF 90 00
4: Name: Jerome Pascal Ferna, phone: 0835240168
[...]

The output is truncated. I do not want to include all the 255 phone numbers. 

Note that the names and numbers are random. More on that later.


Conclusion

It is easy to dump the phone book from a SIM card.

The SIM phone book is very limited (no birthday, no email address). The real phone book is, in general, in the phone itself and synchronised using CardDav with a server like Nextcloud.

Wednesday, February 17, 2021

GitHub Sponsors: first year

In January 2020 I engaged in the GitHub Sponsors project. I got my first payment in May 2020. After a full year I think it is time for a public status. 

 

Results

My gains give a total of 296,82€ for 12 months. Of course I will have to pay some French taxes (employee and employer social security contributions URSSAF) of around 25% and also some income taxes.

Description
Revenue 296,82 €
Social Contributions
-74,20 €
Remaining
225,62 €

That is 18,55€/month.

 

Bills

That is not much (I can't live with that yet) but enough to pay some of the infrastructure used by my smart card projects: a Virtual Private Server to host the web sites and the domain name for https://muscle.apdu.fr/, https://pcsclite.apdu.fr/ and https://ccid.apdu.fr/.

Description
Virtual Private Server 100,66 €
Domain name .apdu.fr
8,39 €
Total
109,05 €

That is 9,09€/month.

 

Conclusion

Thank you to the generous sponsors.

Tuesday, February 16, 2021

New version of pcsc-lite: 1.9.1

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

 Changes:

1.9.1: Ludovic Rousseau
16 February 2021

  • Do not (possibly) lock a reader if allocating hCard fails
  • Fix a hang in SCardTransmit()
  • Do not report an error if the wrong interface is used by the driver
  • Update reader state when a card is removed during an exchange
  • readerfactory: Make sure a freed Reader Context is not accessed
  • PHSetProtocol(): supports T=0&1 cards on T=0 reader
  • hotplug-libusb:
    • support CCIDCLASSDRIVER
    • add interface name to reader name
    • remove obsolete libhal scheme
  • Some other minor improvements

Sunday, January 24, 2021

New version of libccid: 1.4.34

I just released version 1.4.34 of libccid the Free Software CCID class smart card reader driver.

Changes

1.4.34 - 24 January 2021, Ludovic Rousseau
  • Add support of
    • ACS ACR1252IMP Reader
    • ACS CryptoMate EVO
    • Aktiv Rutoken SCR 3001 Reader
    • Avtor KP-375BLE
    • Avtor SC Reader KP382
    • BIT4ID mLector AIR DI V3
    • BIT4ID miniLector AIR NFC v3
    • Bit4id Digital-DNA Key (ProductID 0x2354)
    • Canokeys Canokey
    • DESKO GmbH IDenty chrom
    • DESKO GmbH PENTA Scanner
    • FT Biopass CCID
    • FT Biopass FIDO2
    • FT Biopass KB CCID
    • FT Biopass KB FIDO CCID
    • Feitian BLE CCID Dongle
    • Feitian R805
    • Feitian vR504 Contactless Reader
    • GoTrust Idem Key
    • Identiv uTrust 3720 Contactless Reader
    • Sunrex HP USB Business Slim Smartcard CCID Keyboard
    • sysmocom - s.f.m.c. GmbH sysmoOCTSIM
  • Fail if the requested protocol is not supported by reader
  • Disable USB suspend for the AlcorMicro AU9520 reader
  • Return "no smart card" if we get notified during a transmit
  • Minor improvements reported by Maksim Ivanov
  • Some other minor improvements

Wednesday, January 13, 2021

macOS Big Sur and smart card source code

Apple released the source code of the open source components they use in Big Sur (macOS 11.0, released in October 2020). The components are available at macOS X 11.0.1 Source.


SmartcardCCID

The SmartcardCCID component moved from version SmartcardCCID-55018.0.2 in Catalina 10.15.0 to SmartcardCCID-55021.40.1 in Big Sur 11.0.1.

Incomplete diff:

diff -ru SmartcardCCID-55018.0.2/SmartcardCCID.plist SmartcardCCID-55021.40.1/SmartcardCCID.plist
--- SmartcardCCID-55018.0.2/SmartcardCCID.plist	2019-08-21 00:16:22.000000000 +0200
+++ SmartcardCCID-55021.40.1/SmartcardCCID.plist	2020-04-28 20:53:09.000000000 +0200
@@ -6,13 +6,13 @@
 		<key>OpenSourceProject</key>
 		<string>ccid</string>
 		<key>OpenSourceVersion</key>
-		<string>1.4.31</string>
+		<string>1.4.32</string>
 		<key>OpenSourceWebsiteURL</key>
 		<string>https://ccid.apdu.fr</string>
 		<key>OpenSourceURL</key>
-		<string>https://ccid.apdu.fr/files/ccid-1.4.31.tar.bz2</string>
+		<string>https://ccid.apdu.fr/files/ccid-1.4.32.tar.bz2</string>
 		<key>OpenSourceImportDate</key>
-		<string>2019-08-20</string>
+		<string>2020-04-27</string>
 		<key>OpenSourceModifications</key>
 		<array>
 			<string>destDirFix.patch - makefile.in, customized destination directory</string>
diff -ru SmartcardCCID-55018.0.2/ccid/Makefile SmartcardCCID-55021.40.1/ccid/Makefile
--- SmartcardCCID-55018.0.2/ccid/Makefile	2019-08-21 00:16:21.000000000 +0200
+++ SmartcardCCID-55021.40.1/ccid/Makefile	2020-08-06 20:06:44.000000000 +0200
@@ -24,11 +24,12 @@
 	find $(DSTROOT)/ -name 'usb*.h' -exec rm \{\} \;
 	rm -r $(DSTROOT)/usr/include
 	rm -r $(DSTROOT)/usr/lib
-	install_name_tool -id $(CCIDDriversPath)$(CCIDdylib) $(DSTROOT)$(CCIDDriversPath)$(CCIDdylib) 
+	install_name_tool -id $(CCIDDriversPath)$(CCIDdylib) $(DSTROOT)$(CCIDDriversPath)$(CCIDdylib)
+	codesign -s - $(DSTROOT)$(CCIDDriversPath)$(CCIDdylib)
 
 # Automatic Extract & Patch
 AEP_Project    = ccid
-AEP_Version    = 1.4.31
+AEP_Version    = 1.4.32
 AEP_ProjVers   = $(AEP_Project)-$(AEP_Version)
 AEP_Filename   = $(AEP_ProjVers).tar.bz2
 AEP_ExtractDir = $(AEP_ProjVers)
[...]

As we already saw in macOS Big Sur and smart cards status the CCID driver was updated from version 1.4.31 to version 1.4.32. You can find the patches Apple applies to the CCID driver in the ccid/files/ directory. Nothing special to say.

In fact, after checking the different releases of Catalina 10.15.x in https://opensource.apple.com/ I found that the CCID driver was upgraded from 1.4.31 to 1.4.32 in Catalina itself from 10.15.5 to 10.15.6.

So Apple upgraded the CCID driver within the same major version version of macOS.
And they missed the opportunity to upgrade to 1.4.33 in Big Sur. Maybe it is planned for a future minor version upgrade of Big Sur?


libusb

SmartcardCCID includes the libusb component used by the CCID driver.

This libusb library is statically linked to the CCID driver and can't be used by another project.

The version is 1.0.9. This is a very old version of libusb that was released in April 2012. The current libusb version is 1.0.24 released in December 2020.

I guess Apple does not want to upgrade a component that works fine enough from them.


SecurityTokend

This component is the same as in Catalina. It is SecurityTokend-55113.

It is strange to still find a tokend related component. Tokend technology is deprecated since Mac OS X Lion in 2011 (Mac OS X Lion and tokend).

Tokend was disabled by default in Catalina but was still usable (macOS Catalina and smart cards status).

In Big Sur tokend are not usable at all.

This component SecurityTokend does not contain any tokend plugin. There were in the Tokend component, not SecurityTokend. This component generates two file: SecurityTokend.framework and libsecurity_tokend_client.a. I am not sure what they are used for.


Conclusion

Interesting parts of the smart card stack would be the CryptoTokenKit and WinSCard layers. But since Apple moved away from the Free Software project pcsc-lite in macOS Yosemite in 2014 (OS X Yosemite and smart cards status) these components are not open source.

Monday, January 4, 2021

MUSCLE mailing list statistics for 2020

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

Evolution

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

Comments

A high increase in the number of messages. Maybe the mailing list is not dead after all.

Statistics from 3.1.2020 to 24.11.2020
for pcsclite-muscle@lists.infradead.org


People who have written most messages:

  Author  Msg  Percent 
1ludovic.rousseau@gmail.com36 47.37 %
2Marc.Kewitz.ext@rohde-schwarz.com4 5.26 %
3axel.braun@gmx.de4 5.26 %
4trenta.sis@gmail.com3 3.95 %
5emaxx@google.com3 3.95 %
6suffsuccotash@gmail.com3 3.95 %
7stephan.guilloux@crisalid.com3 3.95 %
8zeroconf@zeroconf.ee3 3.95 %
9thomas@schlenkhoff.me2 2.63 %
10izh1979@gmail.com2 2.63 %
11sebastien@lorquet.fr2 2.63 %
12gregor.waltz@raritan.com1 1.32 %
13gsvelto@mozilla.com1 1.32 %
14Gabriele Svelto1 1.32 %
15tristan.degroof@multiversum.broedersvanliefde.be1 1.32 %
16t-pcsc@girst.at1 1.32 %
17mstjohns@comcast.net1 1.32 %
18mauro@faresoftware.it1 1.32 %
19Axel.braun@gmx.de1 1.32 %
20godfreyhkchung@gmail.com1 1.32 %
21jonathan.verner@nexusgroup.com1 1.32 %
 other1 1.32 %

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

  Author  KBytes 
1ludovic.rousseau@gmail.com1032.8
2stephan.guilloux@crisalid.com 38.4
3zeroconf@zeroconf.ee 31.9
4emaxx@google.com 31.7
5Marc.Kewitz.ext@rohde-schwarz.com 30.6
6sebastien@lorquet.fr 29.5
7izh1979@gmail.com 23.3
8suffsuccotash@gmail.com 17.2
9gsvelto@mozilla.com 13.6
10trenta.sis@gmail.com 12.4
11mstjohns@comcast.net 11.3
12axel.braun@gmx.de 10.8
13godfreyhkchung@gmail.com 10.0
14t-pcsc@girst.at 9.7
15Gabriele Svelto 8.2
16Axel.braun@gmx.de 4.1
17thomas@schlenkhoff.me 2.9
18tristan.degroof@multiversum.broedersvanliefde.be 2.7
19jonathan.verner@nexusgroup.com 2.0
20gregor.waltz@raritan.com 1.4
21mauro@faresoftware.it 1.1

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

  Author  bytes 
1ludovic.rousseau@gmail.com29376
2sebastien@lorquet.fr15120
3gsvelto@mozilla.com13970
4stephan.guilloux@crisalid.com13096
5izh1979@gmail.com11923
6mstjohns@comcast.net11535
7zeroconf@zeroconf.ee10893
8emaxx@google.com10814
9godfreyhkchung@gmail.com10216
10t-pcsc@girst.at9922
11Gabriele Svelto8439
12Marc.Kewitz.ext@rohde-schwarz.com7844
13suffsuccotash@gmail.com5869
14trenta.sis@gmail.com4218
15Axel.braun@gmx.de4210
16tristan.degroof@multiversum.broedersvanliefde.be2798
17axel.braun@gmx.de2753
18jonathan.verner@nexusgroup.com2032
19thomas@schlenkhoff.me1490
20gregor.waltz@raritan.com1462
21mauro@faresoftware.it1143

Table showing the most successful subjects:

  Subject  Msg  Percent 
1[Pcsclite-muscle] Workaround for missing suspend/resume9 11.84 %
2[Pcsclite-muscle] Different behaviour with Select MF on Omnikey7 9.21 %
3[Pcsclite-muscle] Alcor Micro AU9520 not recognized by libccid 1.4.317 9.21 %
4[Pcsclite-muscle] Fwd: dead lock caused by SCardReleaseContext4 5.26 %
5[Pcsclite-muscle] memory consumption3 3.95 %
6[Pcsclite-muscle] pcsc-lite release3 3.95 %
7[Pcsclite-muscle] Exclusive access mode to the smart card reader3 3.95 %
8[Pcsclite-muscle] Lenovo laptops, GNU/Linux and smart card readers?3 3.95 %
9[Pcsclite-muscle] Chrome gets stuck and firefox won't open3 3.95 %
10[Pcsclite-muscle] Confused about extended APDU support2 2.63 %
11Potential security issues in CCID2 2.63 %
12[Pcsclite-muscle] SCardConnect behavior with invalid contexts2 2.63 %
13[Pcsclite-muscle] Missing checks of ATRDecodeAtr returns2 2.63 %
14[Pcsclite-muscle] Race condition during readerstate update2 2.63 %
15[Newsletter] Re: [Pcsclite-muscle] Race condition during2 2.63 %
16[Pcsclite-muscle] Alcor Micro AU9520 not recognized by libccid2 2.63 %
17New version of pcsc-lite: 1.8.261 1.32 %
18[Pcsclite-muscle] Linux Kernel 5.5 / CCID / PCSCLITE change1 1.32 %
19[Pcsclite-muscle] pcsclite-muscle Digest, Vol 24, Issue 21 1.32 %
20[Pcsclite-muscle] [Question] How to read SCARD_READER_CAPABILITIES1 1.32 %
21[Pcsclite-muscle] multi threading from a single pcsc handle /1 1.32 %
22[Pcsclite-muscle] Interfacing 32 bit driver with 64 pcscd1 1.32 %
23Unicode characters in a reader name1 1.32 %
24New version of libccid: 1.4.331 1.32 %
25[Pcsclite-muscle] How to dectect card status?1 1.32 %
26[Pcsclite-muscle] Potential hang in SCardTransmit1 1.32 %
27[Pcsclite-muscle] Instances of Undefined behavior in CCID1 1.32 %
28Incomplete archive between May 2018 and June 20201 1.32 %
29Lenovo laptops, GNU/Linux and smart card readers?1 1.32 %
30[Pcsclite-muscle] Race condition during readerstate1 1.32 %
 other6 7.89 %

Most used email clients:

  Mailer  Msg  Percent 
1(unknown)66 86.84 %
2Mozilla/5.x5 6.58 %
3Evolution 3.36.5 (3.36.5-1.fc32) 3 3.95 %
4K-9 Mail for Android1 1.32 %
 other1 1.32 %

Table of maximal quoting:

  Author  Percent 
1mauro@faresoftware.it 19.95 %
2jonathan.verner@nexusgroup.com 19.71 %
3axel.braun@gmx.de 17.27 %
4Axel.braun@gmx.de 11.83 %
5t-pcsc@girst.at 11.03 %
6tristan.degroof@multiversum.broedersvanliefde.be 10.60 %
7suffsuccotash@gmail.com 9.36 %
8thomas@schlenkhoff.me 7.59 %
9gregor.waltz@raritan.com 6.58 %
10stephan.guilloux@crisalid.com 4.97 %
11ludovic.rousseau@gmail.com 3.57 %
12trenta.sis@gmail.com 3.04 %
13Marc.Kewitz.ext@rohde-schwarz.com 2.29 %
14zeroconf@zeroconf.ee 1.75 %
15godfreyhkchung@gmail.com 1.51 %
16gsvelto@mozilla.com 0.43 %
17emaxx@google.com 0.00 %
18izh1979@gmail.com 0.00 %
19sebastien@lorquet.fr 0.00 %
20Gabriele Svelto 0.00 %
21mstjohns@comcast.net 0.00 %
 average 3.59 %

Maximal quoting:

Author : ludovic.rousseau@gmail.com
Subject : [Pcsclite-muscle] Alcor Micro AU9520 not recognized by libccid 1.4.31
Date : Thu, 5 Nov 2020 14:43:12 +0100
Quote ratio: 62.97% / 18890 bytes

Longest message:

Author : ludovic.rousseau@gmail.com
Subject : [Pcsclite-muscle] Alcor Micro AU9520 not recognized by libccid 1.4.31
Date : Wed, 4 Nov 2020 22:37:47 +0100
Size : 729365 bytes

Most successful subject:

Subject : [Pcsclite-muscle] Workaround for missing suspend/resume
No. of msgs: 9
Total size : 90764 bytes

Final summary:

Total number of messages: 76
Total number of different authors: 21
Total number of different subjects: 35
Total size of messages (w/o headers): 1407974 bytes
Average size of a message: 18525 bytes