<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="../assets/xml/rss.xsl" media="all"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Ludovic Rousseau's blog (Posts about ccid)</title><link>https://blog.apdu.fr/</link><description></description><atom:link href="https://blog.apdu.fr/categories/ccid.xml" rel="self" type="application/rss+xml"></atom:link><language>en</language><copyright>Contents © 2026 &lt;a href="mailto:ludovic.rousseau+blog@free.fr"&gt;Ludovic Rousseau&lt;/a&gt; - License &lt;a href="/posts/2010/08/my-blog-messages-license/"&gt;CC BY-NC-SA 4.0 Deed&lt;/a&gt; for the text &amp;amp; &lt;a href="/posts/2019/01/my-blog-source-code-license/"&gt;GNU GPLv3&lt;/a&gt; for the code</copyright><lastBuildDate>Wed, 04 Mar 2026 10:32:21 GMT</lastBuildDate><generator>Nikola (getnikola.com)</generator><docs>http://blogs.law.harvard.edu/tech/rss</docs><item><title>Laptops and smart card readers</title><link>https://blog.apdu.fr/posts/2026/03/laptops-and-smart-card-readers/</link><dc:creator>Ludovic Rousseau</dc:creator><description>&lt;p&gt;Which smart card reader is present in a particular laptop model? It can
be difficult to find out the exact model of smart card reader included
in a laptop before buying it.&lt;/p&gt;
&lt;p&gt;However, thanks to the &lt;a class="reference external" href="https://linux-hardware.org/"&gt;Hardware for Linux&lt;/a&gt; project, you can submit your own hardware
configuration and also consult the configurations of many laptops and
desktops to find out what hardware is included.&lt;/p&gt;
&lt;p&gt;The website also provides &lt;a class="reference external" href="https://linux-hardware.org/?view=trends"&gt;aggregated results&lt;/a&gt; for a specific categories
such as &lt;a class="reference external" href="https://linux-hardware.org/?view=cpu_vendor"&gt;CPU Vendors&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;One interesting result is the &lt;a class="reference external" href="https://linux-hardware.org/?view=chipcard_vendor"&gt;Chipcard Vendor&lt;/a&gt; aggregation.&lt;/p&gt;
&lt;section id="chipard-vendors-market-shares"&gt;
&lt;h2&gt;Chipard Vendors market shares&lt;/h2&gt;
&lt;p&gt;The results do not represent exact market shares. They only include
systems that:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;run GNU/Linux&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;and that have been submitted to &lt;a class="reference external" href="https://linux-hardware.org/"&gt;https://linux-hardware.org/&lt;/a&gt; by their
owners.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;However, they should reflect reality.&lt;/p&gt;
&lt;svg xmlns="http://www.w3.org/2000/svg" width="500" height="420" version="1.0" id="ezcGraph"&gt;
&lt;defs&gt;&lt;/defs&gt;
&lt;g id="ezcGraphChart" color-rendering="optimizeQuality" shape-rendering="geometricPrecision" text-rendering="optimizeLegibility"&gt;
&lt;path d=" M 0.0000,420.0000 L 0.0000,0.0000 L 500.0000,0.0000 L 500.0000,420.0000 L 0.0000,420.0000 z " style="fill: #eeeeec; fill-opacity: 1.00; stroke: none;" id="ezcGraphPolygon_1"&gt;&lt;/path&gt;
&lt;path d=" M 0.0000,42.0000 L 0.0000,0.0000 L 500.0000,0.0000 L 500.0000,42.0000 L 0.0000,42.0000 z " style="fill: #000000; fill-opacity: 0.00; stroke: none;" id="ezcGraphPolygon_2"&gt;&lt;/path&gt;
&lt;path d="M 247.81,243.31 L 360.31,243.31 A 112.50,112.50 0 1,1 142.23,204.46 z" style="fill: #3465a4; fill-opacity: 1.00; stroke: none; cursor: pointer;" id="ezcGraphCircleSector_4" onclick="top.location = 'https://linux-hardware.org/?view=computers&amp;amp;type=notebook&amp;amp;f=chipcard_vendor&amp;amp;v=Broadcom&amp;amp;p=-2'"&gt;&lt;/path&gt;
&lt;path d="M 247.72,243.81 L 359.81,243.81 A 112.00,112.00 0 1,1 142.53,205.10 z" style="fill: none; stroke: #1a3352; stroke-width: 1; stroke-opacity: 1.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphCircleSector_5"&gt;&lt;/path&gt;
&lt;path d="M 250.00,231.00 L 144.42,192.15 A 112.50,112.50 0 0,1 296.52,128.57 z" style="fill: #4e9a06; fill-opacity: 1.00; stroke: none; cursor: pointer;" id="ezcGraphCircleSector_6" onclick="top.location = 'https://linux-hardware.org/?view=computers&amp;amp;type=notebook&amp;amp;f=chipcard_vendor&amp;amp;v=Alcor+Micro&amp;amp;p=-2'"&gt;&lt;/path&gt;
&lt;path d="M 249.74,230.37 L 145.06,191.85 A 112.00,112.00 0 0,1 295.86,128.82 z" style="fill: none; stroke: #274d03; stroke-width: 1; stroke-opacity: 1.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphCircleSector_7"&gt;&lt;/path&gt;
&lt;path d="M 250.00,231.00 L 296.52,128.57 A 112.50,112.50 0 0,1 333.52,155.63 z" style="fill: #cc0000; fill-opacity: 1.00; stroke: none; cursor: pointer;" id="ezcGraphCircleSector_8" onclick="top.location = 'https://linux-hardware.org/?view=computers&amp;amp;type=notebook&amp;amp;f=chipcard_vendor&amp;amp;v=O2+Micro&amp;amp;p=-2'"&gt;&lt;/path&gt;
&lt;path d="M 251.45,229.02 L 296.77,129.23 A 112.00,112.00 0 0,1 332.82,155.60 z" style="fill: none; stroke: #660000; stroke-width: 1; stroke-opacity: 1.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphCircleSector_9"&gt;&lt;/path&gt;
&lt;path d="M 250.00,231.00 L 333.52,155.63 A 112.50,112.50 0 0,1 351.82,183.15 z" style="fill: #edd400; fill-opacity: 1.00; stroke: none; cursor: pointer;" id="ezcGraphCircleSector_10" onclick="top.location = 'https://linux-hardware.org/?view=computers&amp;amp;type=notebook&amp;amp;f=chipcard_vendor&amp;amp;v=Upek&amp;amp;p=-2'"&gt;&lt;/path&gt;
&lt;path d="M 252.84,229.12 L 333.49,156.34 A 112.00,112.00 0 0,1 351.15,182.91 z" style="fill: none; stroke: #776a00; stroke-width: 1; stroke-opacity: 1.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphCircleSector_11"&gt;&lt;/path&gt;
&lt;path d="M 250.00,231.00 L 351.82,183.15 A 112.50,112.50 0 0,1 359.73,206.17 z" style="fill: #75505b; fill-opacity: 1.00; stroke: none; cursor: pointer;" id="ezcGraphCircleSector_12" onclick="top.location = 'https://linux-hardware.org/?view=computers&amp;amp;type=notebook&amp;amp;f=chipcard_vendor&amp;amp;v=Lenovo&amp;amp;p=-2'"&gt;&lt;/path&gt;
&lt;path d="M 254.37,229.50 L 351.58,183.82 A 112.00,112.00 0 0,1 359.13,205.79 z" style="fill: none; stroke: #3b282e; stroke-width: 1; stroke-opacity: 1.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphCircleSector_13"&gt;&lt;/path&gt;
&lt;path d="M 250.00,231.00 L 359.73,206.17 A 112.50,112.50 0 0,1 360.87,211.91 z" style="fill: #f57900; fill-opacity: 1.00; stroke: none; cursor: pointer;" id="ezcGraphCircleSector_14" onclick="top.location = 'https://linux-hardware.org/?view=computers&amp;amp;type=notebook&amp;amp;f=chipcard_vendor&amp;amp;v=Yubico.com&amp;amp;p=-2'"&gt;&lt;/path&gt;
&lt;path d="M 268.85,227.25 L 359.35,206.77 A 112.00,112.00 0 0,1 360.29,211.50 z" style="fill: none; stroke: #7b3d00; stroke-width: 1; stroke-opacity: 1.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphCircleSector_15"&gt;&lt;/path&gt;
&lt;path d="M 250.00,231.00 L 360.87,211.91 A 112.50,112.50 0 0,1 361.51,216.09 z" style="fill: #204a87; fill-opacity: 1.00; stroke: none; cursor: pointer;" id="ezcGraphCircleSector_16" onclick="top.location = 'https://linux-hardware.org/?view=computers&amp;amp;type=notebook&amp;amp;f=chipcard_vendor&amp;amp;v=Gemalto+%28was+Gemplus%29&amp;amp;p=-2'"&gt;&lt;/path&gt;
&lt;path d="M 276.31,226.98 L 360.46,212.49 A 112.00,112.00 0 0,1 360.95,215.66 z" style="fill: none; stroke: #102544; stroke-width: 1; stroke-opacity: 1.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphCircleSector_17"&gt;&lt;/path&gt;
&lt;path d="M 250.00,231.00 L 361.51,216.09 A 112.50,112.50 0 0,1 361.92,219.64 z" style="fill: #c17d11; fill-opacity: 1.00; stroke: none; cursor: pointer;" id="ezcGraphCircleSector_18" onclick="top.location = 'https://linux-hardware.org/?view=computers&amp;amp;type=notebook&amp;amp;f=chipcard_vendor&amp;amp;v=SCM+Microsystems&amp;amp;p=-2'"&gt;&lt;/path&gt;
&lt;path d="M 281.24,227.33 L 361.08,216.65 A 112.00,112.00 0 0,1 361.38,219.19 z" style="fill: none; stroke: #613f09; stroke-width: 1; stroke-opacity: 1.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphCircleSector_19"&gt;&lt;/path&gt;
&lt;path d="M 250.00,231.00 L 361.92,219.64 A 112.50,112.50 0 0,1 362.16,222.23 z" style="fill: #3465a4; fill-opacity: 1.00; stroke: none; cursor: pointer;" id="ezcGraphCircleSector_20" onclick="top.location = 'https://linux-hardware.org/?view=computers&amp;amp;type=notebook&amp;amp;f=chipcard_vendor&amp;amp;v=Advanced+Card+Systems&amp;amp;p=-2'"&gt;&lt;/path&gt;
&lt;path d="M 293.08,227.13 L 361.48,220.19 A 112.00,112.00 0 0,1 361.62,221.77 z" style="fill: none; stroke: #1a3352; stroke-width: 1; stroke-opacity: 1.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphCircleSector_21"&gt;&lt;/path&gt;
&lt;path d="M 250.00,231.00 L 362.16,222.23 A 112.50,112.50 0 0,1 362.27,223.85 z" style="fill: #4e9a06; fill-opacity: 1.00; stroke: none; cursor: pointer;" id="ezcGraphCircleSector_22" onclick="top.location = 'https://linux-hardware.org/?view=computers&amp;amp;type=notebook&amp;amp;f=chipcard_vendor&amp;amp;v=Aktiv&amp;amp;p=-2'"&gt;&lt;/path&gt;
&lt;path d="M 319.03,226.10 L 361.70,222.77 A 112.00,112.00 0 0,1 361.74,223.38 z" style="fill: none; stroke: #274d03; stroke-width: 1; stroke-opacity: 1.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphCircleSector_23"&gt;&lt;/path&gt;
&lt;path d="M 250.00,231.00 L 362.27,223.85 A 112.50,112.50 0 0,1 362.50,231.00 z" style="fill: #cc0000; fill-opacity: 1.00; stroke: none;" id="ezcGraphCircleSector_24"&gt;&lt;/path&gt;
&lt;path d="M 265.72,230.50 L 361.81,224.38 A 112.00,112.00 0 0,1 362.00,230.50 z" style="fill: none; stroke: #660000; stroke-width: 1; stroke-opacity: 1.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphCircleSector_25"&gt;&lt;/path&gt;
&lt;path d=" M 217.8596,154.1141 L 197.4275,115.0000" style="fill: none; stroke: #000000; stroke-width: 1; stroke-opacity: 1.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_26"&gt;&lt;/path&gt;
&lt;ellipse cx="217.8596" cy="154.1141" rx="3.0000" ry="3.0000" style="fill: #000000; fill-opacity: 1.00; stroke: none;" id="ezcGraphCircle_27"&gt;&lt;/ellipse&gt;
&lt;ellipse cx="197.4275" cy="115.0000" rx="3.0000" ry="3.0000" style="fill: #000000; fill-opacity: 1.00; stroke: none;" id="ezcGraphCircle_28"&gt;&lt;/ellipse&gt;
&lt;path d=" M 233.1921,325.3479 L 233.1921,366.0000" style="fill: none; stroke: #000000; stroke-width: 1; stroke-opacity: 1.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_30"&gt;&lt;/path&gt;
&lt;ellipse cx="233.1921" cy="325.3479" rx="3.0000" ry="3.0000" style="fill: #000000; fill-opacity: 1.00; stroke: none;" id="ezcGraphCircle_31"&gt;&lt;/ellipse&gt;
&lt;ellipse cx="233.1921" cy="366.0000" rx="3.0000" ry="3.0000" style="fill: #000000; fill-opacity: 1.00; stroke: none;" id="ezcGraphCircle_32"&gt;&lt;/ellipse&gt;
&lt;path d=" M 299.1962,163.7380 L 320.7139,124.0556" style="fill: none; stroke: #000000; stroke-width: 1; stroke-opacity: 1.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_34"&gt;&lt;/path&gt;
&lt;ellipse cx="299.1962" cy="163.7380" rx="3.0000" ry="3.0000" style="fill: #000000; fill-opacity: 1.00; stroke: none;" id="ezcGraphCircle_35"&gt;&lt;/ellipse&gt;
&lt;ellipse cx="320.7139" cy="124.0556" rx="3.0000" ry="3.0000" style="fill: #000000; fill-opacity: 1.00; stroke: none;" id="ezcGraphCircle_36"&gt;&lt;/ellipse&gt;
&lt;path d=" M 319.3977,184.8653 L 354.9431,154.6111" style="fill: none; stroke: #000000; stroke-width: 1; stroke-opacity: 1.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_38"&gt;&lt;/path&gt;
&lt;ellipse cx="319.3977" cy="184.8653" rx="3.0000" ry="3.0000" style="fill: #000000; fill-opacity: 1.00; stroke: none;" id="ezcGraphCircle_39"&gt;&lt;/ellipse&gt;
&lt;ellipse cx="354.9431" cy="154.6111" rx="3.0000" ry="3.0000" style="fill: #000000; fill-opacity: 1.00; stroke: none;" id="ezcGraphCircle_40"&gt;&lt;/ellipse&gt;
&lt;path d=" M 328.8119,203.9237 L 372.2940,185.1667" style="fill: none; stroke: #000000; stroke-width: 1; stroke-opacity: 1.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_42"&gt;&lt;/path&gt;
&lt;ellipse cx="328.8119" cy="203.9237" rx="3.0000" ry="3.0000" style="fill: #000000; fill-opacity: 1.00; stroke: none;" id="ezcGraphCircle_43"&gt;&lt;/ellipse&gt;
&lt;ellipse cx="372.2940" cy="185.1667" rx="3.0000" ry="3.0000" style="fill: #000000; fill-opacity: 1.00; stroke: none;" id="ezcGraphCircle_44"&gt;&lt;/ellipse&gt;
&lt;path d=" M 331.7292,214.7277 L 380.0628,215.7222" style="fill: none; stroke: #000000; stroke-width: 1; stroke-opacity: 1.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_46"&gt;&lt;/path&gt;
&lt;ellipse cx="331.7292" cy="214.7277" rx="3.0000" ry="3.0000" style="fill: #000000; fill-opacity: 1.00; stroke: none;" id="ezcGraphCircle_47"&gt;&lt;/ellipse&gt;
&lt;ellipse cx="380.0628" cy="215.7222" rx="3.0000" ry="3.0000" style="fill: #000000; fill-opacity: 1.00; stroke: none;" id="ezcGraphCircle_48"&gt;&lt;/ellipse&gt;
&lt;path d=" M 332.3759,218.4041 L 380.0628,246.2778" style="fill: none; stroke: #000000; stroke-width: 1; stroke-opacity: 1.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_50"&gt;&lt;/path&gt;
&lt;ellipse cx="332.3759" cy="218.4041" rx="3.0000" ry="3.0000" style="fill: #000000; fill-opacity: 1.00; stroke: none;" id="ezcGraphCircle_51"&gt;&lt;/ellipse&gt;
&lt;ellipse cx="380.0628" cy="246.2778" rx="3.0000" ry="3.0000" style="fill: #000000; fill-opacity: 1.00; stroke: none;" id="ezcGraphCircle_52"&gt;&lt;/ellipse&gt;
&lt;path d=" M 332.7631,221.2680 L 372.2940,276.8333" style="fill: none; stroke: #000000; stroke-width: 1; stroke-opacity: 1.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_54"&gt;&lt;/path&gt;
&lt;ellipse cx="332.7631" cy="221.2680" rx="3.0000" ry="3.0000" style="fill: #000000; fill-opacity: 1.00; stroke: none;" id="ezcGraphCircle_55"&gt;&lt;/ellipse&gt;
&lt;ellipse cx="372.2940" cy="276.8333" rx="3.0000" ry="3.0000" style="fill: #000000; fill-opacity: 1.00; stroke: none;" id="ezcGraphCircle_56"&gt;&lt;/ellipse&gt;
&lt;path d=" M 332.9991,223.5438 L 354.9431,307.3889" style="fill: none; stroke: #000000; stroke-width: 1; stroke-opacity: 1.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_58"&gt;&lt;/path&gt;
&lt;ellipse cx="332.9991" cy="223.5438" rx="3.0000" ry="3.0000" style="fill: #000000; fill-opacity: 1.00; stroke: none;" id="ezcGraphCircle_59"&gt;&lt;/ellipse&gt;
&lt;ellipse cx="354.9431" cy="307.3889" rx="3.0000" ry="3.0000" style="fill: #000000; fill-opacity: 1.00; stroke: none;" id="ezcGraphCircle_60"&gt;&lt;/ellipse&gt;
&lt;path d=" M 333.1245,225.1042 L 320.7139,337.9444" style="fill: none; stroke: #000000; stroke-width: 1; stroke-opacity: 1.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_62"&gt;&lt;/path&gt;
&lt;ellipse cx="333.1245" cy="225.1042" rx="3.0000" ry="3.0000" style="fill: #000000; fill-opacity: 1.00; stroke: none;" id="ezcGraphCircle_63"&gt;&lt;/ellipse&gt;
&lt;ellipse cx="320.7139" cy="337.9444" rx="3.0000" ry="3.0000" style="fill: #000000; fill-opacity: 1.00; stroke: none;" id="ezcGraphCircle_64"&gt;&lt;/ellipse&gt;
&lt;path d=" M 333.2912,228.3511 L 333.2912,368.5000" style="fill: none; stroke: #000000; stroke-width: 1; stroke-opacity: 1.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_66"&gt;&lt;/path&gt;
&lt;ellipse cx="333.2912" cy="228.3511" rx="3.0000" ry="3.0000" style="fill: #000000; fill-opacity: 1.00; stroke: none;" id="ezcGraphCircle_67"&gt;&lt;/ellipse&gt;
&lt;ellipse cx="333.2912" cy="368.5000" rx="3.0000" ry="3.0000" style="fill: #000000; fill-opacity: 1.00; stroke: none;" id="ezcGraphCircle_68"&gt;&lt;/ellipse&gt;
&lt;g id="ezcGraphTextBox_3"&gt;
&lt;path d=" M 90.5000,42.0000 L 90.5000,0.5000 L 410.0000,0.5000 L 410.0000,42.0000 L 90.5000,42.0000 z " style="fill: #ffffff; fill-opacity: 0.00; stroke: none;" id="ezcGraphPolygon_70"&gt;&lt;/path&gt;
&lt;text id="ezcGraphTextBox_3_text" x="91.0000" text-length="318.0000px" y="35.0000" style="font-size: 40px; font-family: 'Arial'; fill: #2e3436; fill-opacity: 1.00; stroke: none;"&gt;Chipcard Vendor
&lt;/text&gt;
&lt;/g&gt;
&lt;g id="ezcGraphTextBox_29" style=" cursor: pointer;" onclick="top.location = 'https://linux-hardware.org/?view=computers&amp;amp;type=notebook&amp;amp;f=chipcard_vendor&amp;amp;v=Alcor+Micro&amp;amp;p=-2'"&gt;
&lt;path d=" M 54.4230,122.7778 L 54.4230,107.7222 L 192.4275,107.7222 L 192.4275,122.7778 L 54.4230,122.7778 z " style="fill: #ffffff; fill-opacity: 0.00; stroke: none;" id="ezcGraphPolygon_71"&gt;&lt;/path&gt;
&lt;text id="ezcGraphTextBox_29_text" x="54.9230" text-length="136.5044px" y="119.7444" style="font-size: 13px; font-family: 'Arial'; fill: #2e3436; fill-opacity: 1.00; stroke: none;"&gt;Alcor Micro (26.2%)
&lt;/text&gt;
&lt;/g&gt;
&lt;g id="ezcGraphTextBox_33" style=" cursor: pointer;" onclick="top.location = 'https://linux-hardware.org/?view=computers&amp;amp;type=notebook&amp;amp;f=chipcard_vendor&amp;amp;v=Broadcom&amp;amp;p=-2'"&gt;
&lt;path d=" M 111.7409,373.7778 L 111.7409,358.7222 L 228.1921,358.7222 L 228.1921,373.7778 L 111.7409,373.7778 z " style="fill: #ffffff; fill-opacity: 0.00; stroke: none;" id="ezcGraphPolygon_72"&gt;&lt;/path&gt;
&lt;text id="ezcGraphTextBox_33_text" x="112.2409" text-length="114.9511px" y="370.7444" style="font-size: 13px; font-family: 'Arial'; fill: #2e3436; fill-opacity: 1.00; stroke: none;"&gt;Broadcom (55.6%)
&lt;/text&gt;
&lt;/g&gt;
&lt;g id="ezcGraphTextBox_37" style=" cursor: pointer;" onclick="top.location = 'https://linux-hardware.org/?view=computers&amp;amp;type=notebook&amp;amp;f=chipcard_vendor&amp;amp;v=O2+Micro&amp;amp;p=-2'"&gt;
&lt;path d=" M 326.2139,131.8333 L 326.2139,116.7778 L 435.4805,116.7778 L 435.4805,131.8333 L 326.2139,131.8333 z " style="fill: #ffffff; fill-opacity: 0.00; stroke: none;" id="ezcGraphPolygon_73"&gt;&lt;/path&gt;
&lt;text id="ezcGraphTextBox_37_text" x="326.7139" text-length="107.7667px" y="128.8000" style="font-size: 13px; font-family: 'Arial'; fill: #2e3436; fill-opacity: 1.00; stroke: none;"&gt;O2 Micro (6.5%)
&lt;/text&gt;
&lt;/g&gt;
&lt;g id="ezcGraphTextBox_41" style=" cursor: pointer;" onclick="top.location = 'https://linux-hardware.org/?view=computers&amp;amp;type=notebook&amp;amp;f=chipcard_vendor&amp;amp;v=Upek&amp;amp;p=-2'"&gt;
&lt;path d=" M 360.4431,162.3889 L 360.4431,147.3333 L 440.9720,147.3333 L 440.9720,162.3889 L 360.4431,162.3889 z " style="fill: #ffffff; fill-opacity: 0.00; stroke: none;" id="ezcGraphPolygon_74"&gt;&lt;/path&gt;
&lt;text id="ezcGraphTextBox_41_text" x="360.9431" text-length="79.0289px" y="159.3556" style="font-size: 13px; font-family: 'Arial'; fill: #2e3436; fill-opacity: 1.00; stroke: none;"&gt;Upek (4.7%)
&lt;/text&gt;
&lt;/g&gt;
&lt;g id="ezcGraphTextBox_45" style=" cursor: pointer;" onclick="top.location = 'https://linux-hardware.org/?view=computers&amp;amp;type=notebook&amp;amp;f=chipcard_vendor&amp;amp;v=Lenovo&amp;amp;p=-2'"&gt;
&lt;path d=" M 377.7940,192.9444 L 377.7940,177.8889 L 472.6918,177.8889 L 472.6918,192.9444 L 377.7940,192.9444 z " style="fill: #ffffff; fill-opacity: 0.00; stroke: none;" id="ezcGraphPolygon_75"&gt;&lt;/path&gt;
&lt;text id="ezcGraphTextBox_45_text" x="378.2940" text-length="93.3978px" y="189.9111" style="font-size: 13px; font-family: 'Arial'; fill: #2e3436; fill-opacity: 1.00; stroke: none;"&gt;Lenovo (3.4%)
&lt;/text&gt;
&lt;/g&gt;
&lt;g id="ezcGraphTextBox_49" style=" cursor: pointer;" onclick="top.location = 'https://linux-hardware.org/?view=computers&amp;amp;type=notebook&amp;amp;f=chipcard_vendor&amp;amp;v=Yubico.com&amp;amp;p=-2'"&gt;
&lt;path d=" M 385.5628,230.3278 L 385.5628,201.6167 L 458.9073,201.6167 L 458.9073,230.3278 L 385.5628,230.3278 z " style="fill: #ffffff; fill-opacity: 0.00; stroke: none;" id="ezcGraphPolygon_76"&gt;&lt;/path&gt;
&lt;text id="ezcGraphTextBox_49_text" x="386.0628" text-length="71.8444px" y="213.6389" style="font-size: 13px; font-family: 'Arial'; fill: #2e3436; fill-opacity: 1.00; stroke: none;"&gt;Yubico.com
&lt;/text&gt;
&lt;text id="ezcGraphTextBox_49_text" x="386.0628" text-length="43.1067px" y="228.5500" style="font-size: 13px; font-family: 'Arial'; fill: #2e3436; fill-opacity: 1.00; stroke: none;"&gt;(0.8%)
&lt;/text&gt;
&lt;/g&gt;
&lt;g id="ezcGraphTextBox_53" style=" cursor: pointer;" onclick="top.location = 'https://linux-hardware.org/?view=computers&amp;amp;type=notebook&amp;amp;f=chipcard_vendor&amp;amp;v=Gemalto+%28was+Gemplus%29&amp;amp;p=-2'"&gt;
&lt;path d=" M 385.5628,260.8833 L 385.5628,232.1722 L 473.2762,232.1722 L 473.2762,260.8833 L 385.5628,260.8833 z " style="fill: #ffffff; fill-opacity: 0.00; stroke: none;" id="ezcGraphPolygon_77"&gt;&lt;/path&gt;
&lt;text id="ezcGraphTextBox_53_text" x="386.0628" text-length="86.2133px" y="244.1944" style="font-size: 13px; font-family: 'Arial'; fill: #2e3436; fill-opacity: 1.00; stroke: none;"&gt;Gemalto (was
&lt;/text&gt;
&lt;text id="ezcGraphTextBox_53_text" x="386.0628" text-length="71.8444px" y="259.1056" style="font-size: 13px; font-family: 'Arial'; fill: #2e3436; fill-opacity: 1.00; stroke: none;"&gt;... (0.6%)
&lt;/text&gt;
&lt;/g&gt;
&lt;g id="ezcGraphTextBox_57" style=" cursor: pointer;" onclick="top.location = 'https://linux-hardware.org/?view=computers&amp;amp;type=notebook&amp;amp;f=chipcard_vendor&amp;amp;v=SCM+Microsystems&amp;amp;p=-2'"&gt;
&lt;path d=" M 377.7940,291.4389 L 377.7940,262.7278 L 494.2452,262.7278 L 494.2452,291.4389 L 377.7940,291.4389 z " style="fill: #ffffff; fill-opacity: 0.00; stroke: none;" id="ezcGraphPolygon_78"&gt;&lt;/path&gt;
&lt;text id="ezcGraphTextBox_57_text" x="378.2940" text-length="114.9511px" y="274.7500" style="font-size: 13px; font-family: 'Arial'; fill: #2e3436; fill-opacity: 1.00; stroke: none;"&gt;SCM Microsystems
&lt;/text&gt;
&lt;text id="ezcGraphTextBox_57_text" x="378.2940" text-length="43.1067px" y="289.6611" style="font-size: 13px; font-family: 'Arial'; fill: #2e3436; fill-opacity: 1.00; stroke: none;"&gt;(0.5%)
&lt;/text&gt;
&lt;/g&gt;
&lt;g id="ezcGraphTextBox_61" style=" cursor: pointer;" onclick="top.location = 'https://linux-hardware.org/?view=computers&amp;amp;type=notebook&amp;amp;f=chipcard_vendor&amp;amp;v=Advanced+Card+Systems&amp;amp;p=-2'"&gt;
&lt;path d=" M 360.4431,321.9944 L 360.4431,293.2833 L 476.8942,293.2833 L 476.8942,321.9944 L 360.4431,321.9944 z " style="fill: #ffffff; fill-opacity: 0.00; stroke: none;" id="ezcGraphPolygon_79"&gt;&lt;/path&gt;
&lt;text id="ezcGraphTextBox_61_text" x="360.9431" text-length="114.9511px" y="305.3056" style="font-size: 13px; font-family: 'Arial'; fill: #2e3436; fill-opacity: 1.00; stroke: none;"&gt;Advanced Card...
&lt;/text&gt;
&lt;text id="ezcGraphTextBox_61_text" x="360.9431" text-length="43.1067px" y="320.2167" style="font-size: 13px; font-family: 'Arial'; fill: #2e3436; fill-opacity: 1.00; stroke: none;"&gt;(0.4%)
&lt;/text&gt;
&lt;/g&gt;
&lt;g id="ezcGraphTextBox_65" style=" cursor: pointer;" onclick="top.location = 'https://linux-hardware.org/?view=computers&amp;amp;type=notebook&amp;amp;f=chipcard_vendor&amp;amp;v=Aktiv&amp;amp;p=-2'"&gt;
&lt;path d=" M 326.2139,345.7222 L 326.2139,330.6667 L 413.9272,330.6667 L 413.9272,345.7222 L 326.2139,345.7222 z " style="fill: #ffffff; fill-opacity: 0.00; stroke: none;" id="ezcGraphPolygon_80"&gt;&lt;/path&gt;
&lt;text id="ezcGraphTextBox_65_text" x="326.7139" text-length="86.2133px" y="342.6889" style="font-size: 13px; font-family: 'Arial'; fill: #2e3436; fill-opacity: 1.00; stroke: none;"&gt;Aktiv (0.2%)
&lt;/text&gt;
&lt;/g&gt;
&lt;g id="ezcGraphTextBox_69"&gt;
&lt;path d=" M 338.7912,376.2778 L 338.7912,361.2222 L 433.6890,361.2222 L 433.6890,376.2778 L 338.7912,376.2778 z " style="fill: #ffffff; fill-opacity: 0.00; stroke: none;" id="ezcGraphPolygon_81"&gt;&lt;/path&gt;
&lt;text id="ezcGraphTextBox_69_text" x="339.2912" text-length="93.3978px" y="373.2444" style="font-size: 13px; font-family: 'Arial'; fill: #2e3436; fill-opacity: 1.00; stroke: none;"&gt;Others (1.0%)
&lt;/text&gt;
&lt;/g&gt;
&lt;/g&gt;
&lt;/svg&gt;&lt;table&gt;
&lt;caption&gt;Chipcard Vendors&lt;/caption&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th class="head"&gt;&lt;p&gt;#&lt;/p&gt;&lt;/th&gt;
&lt;th class="head"&gt;&lt;p&gt;Vendor&lt;/p&gt;&lt;/th&gt;
&lt;th class="head"&gt;&lt;p&gt;Percent&lt;/p&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;p&gt;1&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;Broadcom&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;55.61%&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;p&gt;2&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;Alcor Micro&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;26.17%&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;p&gt;3&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;O2 Micro&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;6.53%&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;p&gt;4&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;Upek&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;4.69%&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;p&gt;5&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;Lenovo&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;3.45%&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;p&gt;6&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;Yubico.com&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;0.83%&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;p&gt;7&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;Gemalto (was Gemplus)&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;0.6%&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;p&gt;8&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;SCM Microsystems&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;0.51%&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;p&gt;9&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;Advanced Card Systems&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;0.37%&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;p&gt;10&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;Activ&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;0.23%&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;An important point to note is that the first five on the list should be
correct, as they correspond to the manufacturers of embedded smart card
readers.  However, the next five in the list are often (if not always)
external smart card readers that are connected via a USB port and not
integrated into the laptop.  For instance, I am not aware of any Yubico
readers that are embedded in laptops.  These readers are listed on
&lt;a class="reference external" href="https://linux-hardware.org/"&gt;https://linux-hardware.org/&lt;/a&gt; because they were plugged in when the user
ran the &lt;code class="docutils literal"&gt;&lt;span class="pre"&gt;hw-probe&lt;/span&gt;&lt;/code&gt; program to scan and report the hardware
configuration.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="which-laptop-manufacturers-use-which-smart-card-reader"&gt;
&lt;h2&gt;Which laptop manufacturers use which smart card reader?&lt;/h2&gt;
&lt;p&gt;You can click on a specific slice of the Chipcard Vendor pie chart to
see which laptop manuifacturers uses this smart card reader brand.&lt;/p&gt;
&lt;section id="broadcom"&gt;
&lt;h3&gt;Broadcom&lt;/h3&gt;
&lt;svg xmlns="http://www.w3.org/2000/svg" width="500" height="420" version="1.0" id="ezcGraph"&gt;
&lt;defs&gt;&lt;/defs&gt;
&lt;g id="ezcGraphChart" color-rendering="optimizeQuality" shape-rendering="geometricPrecision" text-rendering="optimizeLegibility"&gt;
&lt;path d=" M 0.0000,420.0000 L 0.0000,0.0000 L 500.0000,0.0000 L 500.0000,420.0000 L 0.0000,420.0000 z " style="fill: #eeeeec; fill-opacity: 1.00; stroke: none;" id="ezcGraphPolygon_1"&gt;&lt;/path&gt;
&lt;path d=" M 0.0000,42.0000 L 0.0000,0.0000 L 500.0000,0.0000 L 500.0000,42.0000 L 0.0000,42.0000 z " style="fill: #000000; fill-opacity: 0.00; stroke: none;" id="ezcGraphPolygon_2"&gt;&lt;/path&gt;
&lt;ellipse cx="237.5000" cy="231.0000" rx="112.5000" ry="112.5000" style="fill: #3465a4; fill-opacity: 1.00; stroke: none; cursor: pointer;" id="ezcGraphCircle_4" onclick="top.location = 'https://linux-hardware.org/?view=computers&amp;amp;type=notebook&amp;amp;f=chipcard_vendor&amp;amp;v=Broadcom&amp;amp;p=-2&amp;amp;vendor=Dell'"&gt;&lt;/ellipse&gt;
&lt;ellipse cx="237.5000" cy="231.0000" rx="112.0000" ry="112.0000" style="fill: none; stroke: #1a3352; stroke-width: 1; stroke-opacity: 1.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphCircle_5"&gt;&lt;/ellipse&gt;
&lt;path d=" M 154.1667,231.0000 L 119.0000,231.0000" style="fill: none; stroke: #000000; stroke-width: 1; stroke-opacity: 1.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_6"&gt;&lt;/path&gt;
&lt;ellipse cx="154.1667" cy="231.0000" rx="3.0000" ry="3.0000" style="fill: #000000; fill-opacity: 1.00; stroke: none;" id="ezcGraphCircle_7"&gt;&lt;/ellipse&gt;
&lt;ellipse cx="119.0000" cy="231.0000" rx="3.0000" ry="3.0000" style="fill: #000000; fill-opacity: 1.00; stroke: none;" id="ezcGraphCircle_8"&gt;&lt;/ellipse&gt;
&lt;g id="ezcGraphTextBox_3"&gt;
&lt;path d=" M 79.9000,42.0000 L 79.9000,0.5000 L 420.6000,0.5000 L 420.6000,42.0000 L 79.9000,42.0000 z " style="fill: #ffffff; fill-opacity: 0.00; stroke: none;" id="ezcGraphPolygon_10"&gt;&lt;/path&gt;
&lt;text id="ezcGraphTextBox_3_text" x="80.4000" text-length="339.2000px" y="35.0000" style="font-size: 40px; font-family: 'Arial'; fill: #2e3436; fill-opacity: 1.00; stroke: none;"&gt;Notebook Vendors
&lt;/text&gt;
&lt;/g&gt;
&lt;g id="ezcGraphTextBox_9" style=" cursor: pointer;" onclick="top.location = 'https://linux-hardware.org/?view=computers&amp;amp;type=notebook&amp;amp;f=chipcard_vendor&amp;amp;v=Broadcom&amp;amp;p=-2&amp;amp;vendor=Dell'"&gt;
&lt;path d=" M 37.0280,249.8500 L 37.0280,212.6500 L 114.0000,212.6500 L 114.0000,249.8500 L 37.0280,249.8500 z " style="fill: #ffffff; fill-opacity: 0.00; stroke: none;" id="ezcGraphPolygon_11"&gt;&lt;/path&gt;
&lt;text id="ezcGraphTextBox_9_text" x="75.2640" text-length="37.7360px" y="228.2800" style="font-size: 17px; font-family: 'Arial'; fill: #2e3436; fill-opacity: 1.00; stroke: none;"&gt;Dell
&lt;/text&gt;
&lt;text id="ezcGraphTextBox_9_text" x="37.5280" text-length="75.4720px" y="247.8600" style="font-size: 17px; font-family: 'Arial'; fill: #2e3436; fill-opacity: 1.00; stroke: none;"&gt;(100.0%)
&lt;/text&gt;
&lt;/g&gt;
&lt;/g&gt;
&lt;/svg&gt;&lt;p&gt;All Broadcom readers are used by Dell.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="alcor-micro"&gt;
&lt;h3&gt;Alcor Micro&lt;/h3&gt;
&lt;svg xmlns="http://www.w3.org/2000/svg" width="500" height="420" version="1.0" id="ezcGraph"&gt;
&lt;defs&gt;&lt;/defs&gt;
&lt;g id="ezcGraphChart" color-rendering="optimizeQuality" shape-rendering="geometricPrecision" text-rendering="optimizeLegibility"&gt;
&lt;path d=" M 0.0000,420.0000 L 0.0000,0.0000 L 500.0000,0.0000 L 500.0000,420.0000 L 0.0000,420.0000 z " style="fill: #eeeeec; fill-opacity: 1.00; stroke: none;" id="ezcGraphPolygon_1"&gt;&lt;/path&gt;
&lt;path d=" M 0.0000,42.0000 L 0.0000,0.0000 L 500.0000,0.0000 L 500.0000,42.0000 L 0.0000,42.0000 z " style="fill: #000000; fill-opacity: 0.00; stroke: none;" id="ezcGraphPolygon_2"&gt;&lt;/path&gt;
&lt;path d="M 239.36,237.56 L 351.86,237.56 A 112.50,112.50 0 1,1 289.96,137.08 z" style="fill: #3465a4; fill-opacity: 1.00; stroke: none; cursor: pointer;" id="ezcGraphCircleSector_4" onclick="top.location = 'https://linux-hardware.org/?view=computers&amp;amp;f=chipcard_vendor&amp;amp;v=Alcor+Micro&amp;amp;p=-2&amp;amp;type=Notebook&amp;amp;vendor=Lenovo'"&gt;&lt;/path&gt;
&lt;path d="M 238.55,238.06 L 351.36,238.06 A 112.00,112.00 0 1,1 289.29,137.30 z" style="fill: none; stroke: #1a3352; stroke-width: 1; stroke-opacity: 1.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphCircleSector_5"&gt;&lt;/path&gt;
&lt;path d="M 250.00,231.00 L 300.60,130.52 A 112.50,112.50 0 0,1 345.13,170.94 z" style="fill: #4e9a06; fill-opacity: 1.00; stroke: none; cursor: pointer;" id="ezcGraphCircleSector_6" onclick="top.location = 'https://linux-hardware.org/?view=computers&amp;amp;f=chipcard_vendor&amp;amp;v=Alcor+Micro&amp;amp;p=-2&amp;amp;type=Notebook&amp;amp;vendor=Hewlett-Packard'"&gt;&lt;/path&gt;
&lt;path d="M 251.26,229.61 L 300.82,131.19 A 112.00,112.00 0 0,1 344.44,170.78 z" style="fill: none; stroke: #274d03; stroke-width: 1; stroke-opacity: 1.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphCircleSector_7"&gt;&lt;/path&gt;
&lt;path d="M 250.00,231.00 L 345.13,170.94 A 112.50,112.50 0 0,1 361.16,213.68 z" style="fill: #cc0000; fill-opacity: 1.00; stroke: none; cursor: pointer;" id="ezcGraphCircleSector_8" onclick="top.location = 'https://linux-hardware.org/?view=computers&amp;amp;f=chipcard_vendor&amp;amp;v=Alcor+Micro&amp;amp;p=-2&amp;amp;type=Notebook&amp;amp;vendor=Fujitsu'"&gt;&lt;/path&gt;
&lt;path d="M 252.31,230.13 L 344.97,171.63 A 112.00,112.00 0 0,1 360.59,213.26 z" style="fill: none; stroke: #660000; stroke-width: 1; stroke-opacity: 1.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphCircleSector_9"&gt;&lt;/path&gt;
&lt;path d="M 250.00,231.00 L 361.16,213.68 A 112.50,112.50 0 0,1 361.81,218.60 z" style="fill: #edd400; fill-opacity: 1.00; stroke: none; cursor: pointer;" id="ezcGraphCircleSector_10" onclick="top.location = 'https://linux-hardware.org/?view=computers&amp;amp;f=chipcard_vendor&amp;amp;v=Alcor+Micro&amp;amp;p=-2&amp;amp;type=Notebook&amp;amp;vendor=Acer'"&gt;&lt;/path&gt;
&lt;path d="M 272.44,228.01 L 360.74,214.25 A 112.00,112.00 0 0,1 361.26,218.16 z" style="fill: none; stroke: #776a00; stroke-width: 1; stroke-opacity: 1.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphCircleSector_11"&gt;&lt;/path&gt;
&lt;path d="M 250.00,231.00 L 361.81,218.60 A 112.50,112.50 0 0,1 362.06,221.07 z" style="fill: #75505b; fill-opacity: 1.00; stroke: none; cursor: pointer;" id="ezcGraphCircleSector_12" onclick="top.location = 'https://linux-hardware.org/?view=computers&amp;amp;f=chipcard_vendor&amp;amp;v=Alcor+Micro&amp;amp;p=-2&amp;amp;type=Notebook&amp;amp;vendor=ASUSTek+Computer'"&gt;&lt;/path&gt;
&lt;path d="M 295.06,226.51 L 361.37,219.15 A 112.00,112.00 0 0,1 361.52,220.62 z" style="fill: none; stroke: #3b282e; stroke-width: 1; stroke-opacity: 1.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphCircleSector_13"&gt;&lt;/path&gt;
&lt;path d="M 250.00,231.00 L 362.06,221.07 A 112.50,112.50 0 0,1 362.25,223.55 z" style="fill: #f57900; fill-opacity: 1.00; stroke: none; cursor: pointer;" id="ezcGraphCircleSector_14" onclick="top.location = 'https://linux-hardware.org/?view=computers&amp;amp;f=chipcard_vendor&amp;amp;v=Alcor+Micro&amp;amp;p=-2&amp;amp;type=Notebook&amp;amp;vendor=Dell'"&gt;&lt;/path&gt;
&lt;path d="M 295.15,227.50 L 361.61,221.62 A 112.00,112.00 0 0,1 361.72,223.09 z" style="fill: none; stroke: #7b3d00; stroke-width: 1; stroke-opacity: 1.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphCircleSector_15"&gt;&lt;/path&gt;
&lt;path d="M 250.00,231.00 L 362.25,223.55 A 112.50,112.50 0 0,1 362.33,224.79 z" style="fill: #204a87; fill-opacity: 1.00; stroke: none; cursor: pointer;" id="ezcGraphCircleSector_16" onclick="top.location = 'https://linux-hardware.org/?view=computers&amp;amp;f=chipcard_vendor&amp;amp;v=Alcor+Micro&amp;amp;p=-2&amp;amp;type=Notebook&amp;amp;vendor=Durabook'"&gt;&lt;/path&gt;
&lt;path d="M 340.39,225.50 L 361.79,224.08 A 112.00,112.00 0 0,1 361.80,224.32 z" style="fill: none; stroke: #102544; stroke-width: 1; stroke-opacity: 1.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphCircleSector_17"&gt;&lt;/path&gt;
&lt;path d="M 250.00,231.00 L 362.33,224.79 A 112.50,112.50 0 0,1 362.39,226.03 z" style="fill: #c17d11; fill-opacity: 1.00; stroke: none; cursor: pointer;" id="ezcGraphCircleSector_18" onclick="top.location = 'https://linux-hardware.org/?view=computers&amp;amp;f=chipcard_vendor&amp;amp;v=Alcor+Micro&amp;amp;p=-2&amp;amp;type=Notebook&amp;amp;vendor=Getac'"&gt;&lt;/path&gt;
&lt;path d="M 340.45,226.50 L 361.86,225.32 A 112.00,112.00 0 0,1 361.87,225.56 z" style="fill: none; stroke: #613f09; stroke-width: 1; stroke-opacity: 1.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphCircleSector_19"&gt;&lt;/path&gt;
&lt;path d="M 250.00,231.00 L 362.39,226.03 A 112.50,112.50 0 0,1 362.44,227.27 z" style="fill: #3465a4; fill-opacity: 1.00; stroke: none; cursor: pointer;" id="ezcGraphCircleSector_20" onclick="top.location = 'https://linux-hardware.org/?view=computers&amp;amp;f=chipcard_vendor&amp;amp;v=Alcor+Micro&amp;amp;p=-2&amp;amp;type=Notebook&amp;amp;vendor=Google'"&gt;&lt;/path&gt;
&lt;path d="M 340.49,227.50 L 361.91,226.55 A 112.00,112.00 0 0,1 361.92,226.79 z" style="fill: none; stroke: #1a3352; stroke-width: 1; stroke-opacity: 1.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphCircleSector_21"&gt;&lt;/path&gt;
&lt;path d="M 250.00,231.00 L 362.44,227.27 A 112.50,112.50 0 0,1 362.47,228.52 z" style="fill: #4e9a06; fill-opacity: 1.00; stroke: none; cursor: pointer;" id="ezcGraphCircleSector_22" onclick="top.location = 'https://linux-hardware.org/?view=computers&amp;amp;f=chipcard_vendor&amp;amp;v=Alcor+Micro&amp;amp;p=-2&amp;amp;type=Notebook&amp;amp;vendor=Notebook'"&gt;&lt;/path&gt;
&lt;path d="M 340.53,228.50 L 361.96,227.79 A 112.00,112.00 0 0,1 361.96,228.03 z" style="fill: none; stroke: #274d03; stroke-width: 1; stroke-opacity: 1.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphCircleSector_23"&gt;&lt;/path&gt;
&lt;path d="M 250.00,231.00 L 362.47,228.52 A 112.50,112.50 0 0,1 362.50,231.00 z" style="fill: #cc0000; fill-opacity: 1.00; stroke: none;" id="ezcGraphCircleSector_24"&gt;&lt;/path&gt;
&lt;path d="M 295.28,230.50 L 361.98,229.03 A 112.00,112.00 0 0,1 362.00,230.50 z" style="fill: none; stroke: #660000; stroke-width: 1; stroke-opacity: 1.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphCircleSector_25"&gt;&lt;/path&gt;
&lt;path d=" M 168.4064,281.2644 L 141.8188,303.0000" style="fill: none; stroke: #000000; stroke-width: 1; stroke-opacity: 1.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_26"&gt;&lt;/path&gt;
&lt;ellipse cx="168.4064" cy="281.2644" rx="3.0000" ry="3.0000" style="fill: #000000; fill-opacity: 1.00; stroke: none;" id="ezcGraphCircle_27"&gt;&lt;/ellipse&gt;
&lt;ellipse cx="141.8188" cy="303.0000" rx="3.0000" ry="3.0000" style="fill: #000000; fill-opacity: 1.00; stroke: none;" id="ezcGraphCircle_28"&gt;&lt;/ellipse&gt;
&lt;path d=" M 306.0112,169.2975 L 306.0112,96.0000" style="fill: none; stroke: #000000; stroke-width: 1; stroke-opacity: 1.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_30"&gt;&lt;/path&gt;
&lt;ellipse cx="306.0112" cy="169.2975" rx="3.0000" ry="3.0000" style="fill: #000000; fill-opacity: 1.00; stroke: none;" id="ezcGraphCircle_31"&gt;&lt;/ellipse&gt;
&lt;ellipse cx="306.0112" cy="96.0000" rx="3.0000" ry="3.0000" style="fill: #000000; fill-opacity: 1.00; stroke: none;" id="ezcGraphCircle_32"&gt;&lt;/ellipse&gt;
&lt;path d=" M 328.0242,201.7311 L 323.8233,126.0000" style="fill: none; stroke: #000000; stroke-width: 1; stroke-opacity: 1.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_34"&gt;&lt;/path&gt;
&lt;ellipse cx="328.0242" cy="201.7311" rx="3.0000" ry="3.0000" style="fill: #000000; fill-opacity: 1.00; stroke: none;" id="ezcGraphCircle_35"&gt;&lt;/ellipse&gt;
&lt;ellipse cx="323.8233" cy="126.0000" rx="3.0000" ry="3.0000" style="fill: #000000; fill-opacity: 1.00; stroke: none;" id="ezcGraphCircle_36"&gt;&lt;/ellipse&gt;
&lt;path d=" M 332.6028,219.9898 L 356.0000,156.0000" style="fill: none; stroke: #000000; stroke-width: 1; stroke-opacity: 1.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_38"&gt;&lt;/path&gt;
&lt;ellipse cx="332.6028" cy="219.9898" rx="3.0000" ry="3.0000" style="fill: #000000; fill-opacity: 1.00; stroke: none;" id="ezcGraphCircle_39"&gt;&lt;/ellipse&gt;
&lt;ellipse cx="356.0000" cy="156.0000" rx="3.0000" ry="3.0000" style="fill: #000000; fill-opacity: 1.00; stroke: none;" id="ezcGraphCircle_40"&gt;&lt;/ellipse&gt;
&lt;path d=" M 332.9221,222.7317 L 372.6190,186.0000" style="fill: none; stroke: #000000; stroke-width: 1; stroke-opacity: 1.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_42"&gt;&lt;/path&gt;
&lt;ellipse cx="332.9221" cy="222.7317" rx="3.0000" ry="3.0000" style="fill: #000000; fill-opacity: 1.00; stroke: none;" id="ezcGraphCircle_43"&gt;&lt;/ellipse&gt;
&lt;ellipse cx="372.6190" cy="186.0000" rx="3.0000" ry="3.0000" style="fill: #000000; fill-opacity: 1.00; stroke: none;" id="ezcGraphCircle_44"&gt;&lt;/ellipse&gt;
&lt;path d=" M 333.0845,224.5650 L 380.0967,216.0000" style="fill: none; stroke: #000000; stroke-width: 1; stroke-opacity: 1.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_46"&gt;&lt;/path&gt;
&lt;ellipse cx="333.0845" cy="224.5650" rx="3.0000" ry="3.0000" style="fill: #000000; fill-opacity: 1.00; stroke: none;" id="ezcGraphCircle_47"&gt;&lt;/ellipse&gt;
&lt;ellipse cx="380.0967" cy="216.0000" rx="3.0000" ry="3.0000" style="fill: #000000; fill-opacity: 1.00; stroke: none;" id="ezcGraphCircle_48"&gt;&lt;/ellipse&gt;
&lt;path d=" M 333.1797,225.9420 L 380.0967,246.0000" style="fill: none; stroke: #000000; stroke-width: 1; stroke-opacity: 1.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_50"&gt;&lt;/path&gt;
&lt;ellipse cx="333.1797" cy="225.9420" rx="3.0000" ry="3.0000" style="fill: #000000; fill-opacity: 1.00; stroke: none;" id="ezcGraphCircle_51"&gt;&lt;/ellipse&gt;
&lt;ellipse cx="380.0967" cy="246.0000" rx="3.0000" ry="3.0000" style="fill: #000000; fill-opacity: 1.00; stroke: none;" id="ezcGraphCircle_52"&gt;&lt;/ellipse&gt;
&lt;path d=" M 333.2305,226.8608 L 372.6190,276.0000" style="fill: none; stroke: #000000; stroke-width: 1; stroke-opacity: 1.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_54"&gt;&lt;/path&gt;
&lt;ellipse cx="333.2305" cy="226.8608" rx="3.0000" ry="3.0000" style="fill: #000000; fill-opacity: 1.00; stroke: none;" id="ezcGraphCircle_55"&gt;&lt;/ellipse&gt;
&lt;ellipse cx="372.6190" cy="276.0000" rx="3.0000" ry="3.0000" style="fill: #000000; fill-opacity: 1.00; stroke: none;" id="ezcGraphCircle_56"&gt;&lt;/ellipse&gt;
&lt;path d=" M 333.2711,227.7801 L 356.0000,306.0000" style="fill: none; stroke: #000000; stroke-width: 1; stroke-opacity: 1.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_58"&gt;&lt;/path&gt;
&lt;ellipse cx="333.2711" cy="227.7801" rx="3.0000" ry="3.0000" style="fill: #000000; fill-opacity: 1.00; stroke: none;" id="ezcGraphCircle_59"&gt;&lt;/ellipse&gt;
&lt;ellipse cx="356.0000" cy="306.0000" rx="3.0000" ry="3.0000" style="fill: #000000; fill-opacity: 1.00; stroke: none;" id="ezcGraphCircle_60"&gt;&lt;/ellipse&gt;
&lt;path d=" M 333.3016,228.6998 L 323.8233,336.0000" style="fill: none; stroke: #000000; stroke-width: 1; stroke-opacity: 1.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_62"&gt;&lt;/path&gt;
&lt;ellipse cx="333.3016" cy="228.6998" rx="3.0000" ry="3.0000" style="fill: #000000; fill-opacity: 1.00; stroke: none;" id="ezcGraphCircle_63"&gt;&lt;/ellipse&gt;
&lt;ellipse cx="323.8233" cy="336.0000" rx="3.0000" ry="3.0000" style="fill: #000000; fill-opacity: 1.00; stroke: none;" id="ezcGraphCircle_64"&gt;&lt;/ellipse&gt;
&lt;path d=" M 333.3283,230.0798 L 333.3283,366.0000" style="fill: none; stroke: #000000; stroke-width: 1; stroke-opacity: 1.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_66"&gt;&lt;/path&gt;
&lt;ellipse cx="333.3283" cy="230.0798" rx="3.0000" ry="3.0000" style="fill: #000000; fill-opacity: 1.00; stroke: none;" id="ezcGraphCircle_67"&gt;&lt;/ellipse&gt;
&lt;ellipse cx="333.3283" cy="366.0000" rx="3.0000" ry="3.0000" style="fill: #000000; fill-opacity: 1.00; stroke: none;" id="ezcGraphCircle_68"&gt;&lt;/ellipse&gt;
&lt;g id="ezcGraphTextBox_3"&gt;
&lt;path d=" M 79.9000,42.0000 L 79.9000,0.5000 L 420.6000,0.5000 L 420.6000,42.0000 L 79.9000,42.0000 z " style="fill: #ffffff; fill-opacity: 0.00; stroke: none;" id="ezcGraphPolygon_70"&gt;&lt;/path&gt;
&lt;text id="ezcGraphTextBox_3_text" x="80.4000" text-length="339.2000px" y="35.0000" style="font-size: 40px; font-family: 'Arial'; fill: #2e3436; fill-opacity: 1.00; stroke: none;"&gt;Notebook Vendors
&lt;/text&gt;
&lt;/g&gt;
&lt;g id="ezcGraphTextBox_29" style=" cursor: pointer;" onclick="top.location = 'https://linux-hardware.org/?view=computers&amp;amp;f=chipcard_vendor&amp;amp;v=Alcor+Micro&amp;amp;p=-2&amp;amp;type=Notebook&amp;amp;vendor=Lenovo'"&gt;
&lt;path d=" M 31.4388,311.0000 L 31.4388,295.5000 L 136.8188,295.5000 L 136.8188,311.0000 L 31.4388,311.0000 z " style="fill: #ffffff; fill-opacity: 0.00; stroke: none;" id="ezcGraphPolygon_71"&gt;&lt;/path&gt;
&lt;text id="ezcGraphTextBox_29_text" x="31.9388" text-length="103.8800px" y="307.9000" style="font-size: 14px; font-family: 'Arial'; fill: #2e3436; fill-opacity: 1.00; stroke: none;"&gt;Lenovo (82.4%)
&lt;/text&gt;
&lt;/g&gt;
&lt;g id="ezcGraphTextBox_33" style=" cursor: pointer;" onclick="top.location = 'https://linux-hardware.org/?view=computers&amp;amp;f=chipcard_vendor&amp;amp;v=Alcor+Micro&amp;amp;p=-2&amp;amp;type=Notebook&amp;amp;vendor=Hewlett-Packard'"&gt;
&lt;path d=" M 311.5112,104.0000 L 311.5112,88.5000 L 476.2512,88.5000 L 476.2512,104.0000 L 311.5112,104.0000 z " style="fill: #ffffff; fill-opacity: 0.00; stroke: none;" id="ezcGraphPolygon_72"&gt;&lt;/path&gt;
&lt;text id="ezcGraphTextBox_33_text" x="312.0112" text-length="163.2400px" y="100.9000" style="font-size: 14px; font-family: 'Arial'; fill: #2e3436; fill-opacity: 1.00; stroke: none;"&gt;Hewlett-Packard (8.6%)
&lt;/text&gt;
&lt;/g&gt;
&lt;g id="ezcGraphTextBox_37" style=" cursor: pointer;" onclick="top.location = 'https://linux-hardware.org/?view=computers&amp;amp;f=chipcard_vendor&amp;amp;v=Alcor+Micro&amp;amp;p=-2&amp;amp;type=Notebook&amp;amp;vendor=Fujitsu'"&gt;
&lt;path d=" M 329.3233,134.0000 L 329.3233,118.5000 L 434.7033,118.5000 L 434.7033,134.0000 L 329.3233,134.0000 z " style="fill: #ffffff; fill-opacity: 0.00; stroke: none;" id="ezcGraphPolygon_73"&gt;&lt;/path&gt;
&lt;text id="ezcGraphTextBox_37_text" x="329.8233" text-length="103.8800px" y="130.9000" style="font-size: 14px; font-family: 'Arial'; fill: #2e3436; fill-opacity: 1.00; stroke: none;"&gt;Fujitsu (6.5%)
&lt;/text&gt;
&lt;/g&gt;
&lt;g id="ezcGraphTextBox_41" style=" cursor: pointer;" onclick="top.location = 'https://linux-hardware.org/?view=computers&amp;amp;f=chipcard_vendor&amp;amp;v=Alcor+Micro&amp;amp;p=-2&amp;amp;type=Notebook&amp;amp;vendor=Acer'"&gt;
&lt;path d=" M 361.5000,164.0000 L 361.5000,148.5000 L 444.6200,148.5000 L 444.6200,164.0000 L 361.5000,164.0000 z " style="fill: #ffffff; fill-opacity: 0.00; stroke: none;" id="ezcGraphPolygon_74"&gt;&lt;/path&gt;
&lt;text id="ezcGraphTextBox_41_text" x="362.0000" text-length="81.6200px" y="160.9000" style="font-size: 14px; font-family: 'Arial'; fill: #2e3436; fill-opacity: 1.00; stroke: none;"&gt;Acer (0.7%)
&lt;/text&gt;
&lt;/g&gt;
&lt;g id="ezcGraphTextBox_45" style=" cursor: pointer;" onclick="top.location = 'https://linux-hardware.org/?view=computers&amp;amp;f=chipcard_vendor&amp;amp;v=Alcor+Micro&amp;amp;p=-2&amp;amp;type=Notebook&amp;amp;vendor=ASUSTek+Computer'"&gt;
&lt;path d=" M 378.1190,194.0000 L 378.1190,178.5000 L 483.4990,178.5000 L 483.4990,194.0000 L 378.1190,194.0000 z " style="fill: #ffffff; fill-opacity: 0.00; stroke: none;" id="ezcGraphPolygon_75"&gt;&lt;/path&gt;
&lt;text id="ezcGraphTextBox_45_text" x="378.6190" text-length="103.8800px" y="190.9000" style="font-size: 14px; font-family: 'Arial'; fill: #2e3436; fill-opacity: 1.00; stroke: none;"&gt;ASUSTek (0.4%)
&lt;/text&gt;
&lt;/g&gt;
&lt;g id="ezcGraphTextBox_49" style=" cursor: pointer;" onclick="top.location = 'https://linux-hardware.org/?view=computers&amp;amp;f=chipcard_vendor&amp;amp;v=Alcor+Micro&amp;amp;p=-2&amp;amp;type=Notebook&amp;amp;vendor=Dell'"&gt;
&lt;path d=" M 385.5967,224.0000 L 385.5967,208.5000 L 468.7167,208.5000 L 468.7167,224.0000 L 385.5967,224.0000 z " style="fill: #ffffff; fill-opacity: 0.00; stroke: none;" id="ezcGraphPolygon_76"&gt;&lt;/path&gt;
&lt;text id="ezcGraphTextBox_49_text" x="386.0967" text-length="81.6200px" y="220.9000" style="font-size: 14px; font-family: 'Arial'; fill: #2e3436; fill-opacity: 1.00; stroke: none;"&gt;Dell (0.4%)
&lt;/text&gt;
&lt;/g&gt;
&lt;g id="ezcGraphTextBox_53" style=" cursor: pointer;" onclick="top.location = 'https://linux-hardware.org/?view=computers&amp;amp;f=chipcard_vendor&amp;amp;v=Alcor+Micro&amp;amp;p=-2&amp;amp;type=Notebook&amp;amp;vendor=Durabook'"&gt;
&lt;path d=" M 385.5967,254.0000 L 385.5967,238.5000 L 498.3967,238.5000 L 498.3967,254.0000 L 385.5967,254.0000 z " style="fill: #ffffff; fill-opacity: 0.00; stroke: none;" id="ezcGraphPolygon_77"&gt;&lt;/path&gt;
&lt;text id="ezcGraphTextBox_53_text" x="386.0967" text-length="111.3000px" y="250.9000" style="font-size: 14px; font-family: 'Arial'; fill: #2e3436; fill-opacity: 1.00; stroke: none;"&gt;Durabook (0.2%)
&lt;/text&gt;
&lt;/g&gt;
&lt;g id="ezcGraphTextBox_57" style=" cursor: pointer;" onclick="top.location = 'https://linux-hardware.org/?view=computers&amp;amp;f=chipcard_vendor&amp;amp;v=Alcor+Micro&amp;amp;p=-2&amp;amp;type=Notebook&amp;amp;vendor=Getac'"&gt;
&lt;path d=" M 378.1190,284.0000 L 378.1190,268.5000 L 468.6590,268.5000 L 468.6590,284.0000 L 378.1190,284.0000 z " style="fill: #ffffff; fill-opacity: 0.00; stroke: none;" id="ezcGraphPolygon_78"&gt;&lt;/path&gt;
&lt;text id="ezcGraphTextBox_57_text" x="378.6190" text-length="89.0400px" y="280.9000" style="font-size: 14px; font-family: 'Arial'; fill: #2e3436; fill-opacity: 1.00; stroke: none;"&gt;Getac (0.2%)
&lt;/text&gt;
&lt;/g&gt;
&lt;g id="ezcGraphTextBox_61" style=" cursor: pointer;" onclick="top.location = 'https://linux-hardware.org/?view=computers&amp;amp;f=chipcard_vendor&amp;amp;v=Alcor+Micro&amp;amp;p=-2&amp;amp;type=Notebook&amp;amp;vendor=Google'"&gt;
&lt;path d=" M 361.5000,314.0000 L 361.5000,298.5000 L 459.4600,298.5000 L 459.4600,314.0000 L 361.5000,314.0000 z " style="fill: #ffffff; fill-opacity: 0.00; stroke: none;" id="ezcGraphPolygon_79"&gt;&lt;/path&gt;
&lt;text id="ezcGraphTextBox_61_text" x="362.0000" text-length="96.4600px" y="310.9000" style="font-size: 14px; font-family: 'Arial'; fill: #2e3436; fill-opacity: 1.00; stroke: none;"&gt;Google (0.2%)
&lt;/text&gt;
&lt;/g&gt;
&lt;g id="ezcGraphTextBox_65" style=" cursor: pointer;" onclick="top.location = 'https://linux-hardware.org/?view=computers&amp;amp;f=chipcard_vendor&amp;amp;v=Alcor+Micro&amp;amp;p=-2&amp;amp;type=Notebook&amp;amp;vendor=Notebook'"&gt;
&lt;path d=" M 329.3233,344.0000 L 329.3233,328.5000 L 442.1233,328.5000 L 442.1233,344.0000 L 329.3233,344.0000 z " style="fill: #ffffff; fill-opacity: 0.00; stroke: none;" id="ezcGraphPolygon_80"&gt;&lt;/path&gt;
&lt;text id="ezcGraphTextBox_65_text" x="329.8233" text-length="111.3000px" y="340.9000" style="font-size: 14px; font-family: 'Arial'; fill: #2e3436; fill-opacity: 1.00; stroke: none;"&gt;Notebook (0.2%)
&lt;/text&gt;
&lt;/g&gt;
&lt;g id="ezcGraphTextBox_69"&gt;
&lt;path d=" M 338.8283,374.0000 L 338.8283,358.5000 L 436.7883,358.5000 L 436.7883,374.0000 L 338.8283,374.0000 z " style="fill: #ffffff; fill-opacity: 0.00; stroke: none;" id="ezcGraphPolygon_81"&gt;&lt;/path&gt;
&lt;text id="ezcGraphTextBox_69_text" x="339.3283" text-length="96.4600px" y="370.9000" style="font-size: 14px; font-family: 'Arial'; fill: #2e3436; fill-opacity: 1.00; stroke: none;"&gt;Others (0.4%)
&lt;/text&gt;
&lt;/g&gt;
&lt;/g&gt;
&lt;/svg&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th class="head"&gt;&lt;p&gt;#&lt;/p&gt;&lt;/th&gt;
&lt;th class="head"&gt;&lt;p&gt;Vendor&lt;/p&gt;&lt;/th&gt;
&lt;th class="head"&gt;&lt;p&gt;Percent&lt;/p&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;p&gt;1&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;Lenovo&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;82.4%&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;p&gt;2&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;Hewlett-Packard&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;8.6%&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;p&gt;3&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;Fujitsu&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;6.5%&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;p&gt;4&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;Acer&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;0.7%&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;p&gt;5&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;ASUSTek Computer&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;0.4%&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/section&gt;
&lt;section id="o2-micro"&gt;
&lt;h3&gt;O2 Micro&lt;/h3&gt;
&lt;svg xmlns="http://www.w3.org/2000/svg" width="500" height="420" version="1.0" id="ezcGraph"&gt;
&lt;defs&gt;&lt;/defs&gt;
&lt;g id="ezcGraphChart" color-rendering="optimizeQuality" shape-rendering="geometricPrecision" text-rendering="optimizeLegibility"&gt;
&lt;path d=" M 0.0000,420.0000 L 0.0000,0.0000 L 500.0000,0.0000 L 500.0000,420.0000 L 0.0000,420.0000 z " style="fill: #eeeeec; fill-opacity: 1.00; stroke: none;" id="ezcGraphPolygon_1"&gt;&lt;/path&gt;
&lt;path d=" M 0.0000,42.0000 L 0.0000,0.0000 L 500.0000,0.0000 L 500.0000,42.0000 L 0.0000,42.0000 z " style="fill: #000000; fill-opacity: 0.00; stroke: none;" id="ezcGraphPolygon_2"&gt;&lt;/path&gt;
&lt;path d="M 253.55,242.99 L 366.05,242.99 A 112.50,112.50 0 0,1 159.15,304.19 z" style="fill: #3465a4; fill-opacity: 1.00; stroke: none; cursor: pointer;" id="ezcGraphCircleSector_4" onclick="top.location = 'https://linux-hardware.org/?view=computers&amp;amp;type=notebook&amp;amp;f=chipcard_vendor&amp;amp;v=O2+Micro&amp;amp;p=-2&amp;amp;vendor=Dell'"&gt;&lt;/path&gt;
&lt;path d="M 253.69,243.49 L 365.55,243.49 A 112.00,112.00 0 0,1 159.84,304.34 z" style="fill: none; stroke: #1a3352; stroke-width: 1; stroke-opacity: 1.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphCircleSector_5"&gt;&lt;/path&gt;
&lt;path d="M 250.00,231.00 L 155.60,292.20 A 112.50,112.50 0 0,1 272.25,120.72 z" style="fill: #4e9a06; fill-opacity: 1.00; stroke: none; cursor: pointer;" id="ezcGraphCircleSector_6" onclick="top.location = 'https://linux-hardware.org/?view=computers&amp;amp;type=notebook&amp;amp;f=chipcard_vendor&amp;amp;v=O2+Micro&amp;amp;p=-2&amp;amp;vendor=Fujitsu'"&gt;&lt;/path&gt;
&lt;path d="M 249.55,230.69 L 155.75,291.51 A 112.00,112.00 0 0,1 271.66,121.11 z" style="fill: none; stroke: #274d03; stroke-width: 1; stroke-opacity: 1.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphCircleSector_7"&gt;&lt;/path&gt;
&lt;path d="M 250.00,231.00 L 272.25,120.72 A 112.50,112.50 0 0,1 361.51,216.11 z" style="fill: #cc0000; fill-opacity: 1.00; stroke: none; cursor: pointer;" id="ezcGraphCircleSector_8" onclick="top.location = 'https://linux-hardware.org/?view=computers&amp;amp;type=notebook&amp;amp;f=chipcard_vendor&amp;amp;v=O2+Micro&amp;amp;p=-2&amp;amp;vendor=Toshiba'"&gt;&lt;/path&gt;
&lt;path d="M 250.63,230.41 L 272.64,121.31 A 112.00,112.00 0 0,1 360.95,215.68 z" style="fill: none; stroke: #660000; stroke-width: 1; stroke-opacity: 1.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphCircleSector_9"&gt;&lt;/path&gt;
&lt;path d="M 250.00,231.00 L 361.51,216.11 A 112.50,112.50 0 0,1 362.50,231.00 z" style="fill: #edd400; fill-opacity: 1.00; stroke: none; cursor: pointer;" id="ezcGraphCircleSector_10" onclick="top.location = 'https://linux-hardware.org/?view=computers&amp;amp;type=notebook&amp;amp;f=chipcard_vendor&amp;amp;v=O2+Micro&amp;amp;p=-2&amp;amp;vendor=Fujitsu+Siemens'"&gt;&lt;/path&gt;
&lt;path d="M 257.52,230.50 L 361.08,216.67 A 112.00,112.00 0 0,1 362.00,230.50 z" style="fill: none; stroke: #776a00; stroke-width: 1; stroke-opacity: 1.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphCircleSector_11"&gt;&lt;/path&gt;
&lt;path d=" M 181.0974,184.1292 L 141.1214,160.0000" style="fill: none; stroke: #000000; stroke-width: 1; stroke-opacity: 1.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_12"&gt;&lt;/path&gt;
&lt;ellipse cx="181.0974" cy="184.1292" rx="3.0000" ry="3.0000" style="fill: #000000; fill-opacity: 1.00; stroke: none;" id="ezcGraphCircle_13"&gt;&lt;/ellipse&gt;
&lt;ellipse cx="141.1214" cy="160.0000" rx="3.0000" ry="3.0000" style="fill: #000000; fill-opacity: 1.00; stroke: none;" id="ezcGraphCircle_14"&gt;&lt;/ellipse&gt;
&lt;path d=" M 310.8483,174.0620 L 346.7138,145.0000" style="fill: none; stroke: #000000; stroke-width: 1; stroke-opacity: 1.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_16"&gt;&lt;/path&gt;
&lt;ellipse cx="310.8483" cy="174.0620" rx="3.0000" ry="3.0000" style="fill: #000000; fill-opacity: 1.00; stroke: none;" id="ezcGraphCircle_17"&gt;&lt;/ellipse&gt;
&lt;ellipse cx="346.7138" cy="145.0000" rx="3.0000" ry="3.0000" style="fill: #000000; fill-opacity: 1.00; stroke: none;" id="ezcGraphCircle_18"&gt;&lt;/ellipse&gt;
&lt;path d=" M 333.1499,225.4731 L 380.6756,222.0000" style="fill: none; stroke: #000000; stroke-width: 1; stroke-opacity: 1.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_20"&gt;&lt;/path&gt;
&lt;ellipse cx="333.1499" cy="225.4731" rx="3.0000" ry="3.0000" style="fill: #000000; fill-opacity: 1.00; stroke: none;" id="ezcGraphCircle_21"&gt;&lt;/ellipse&gt;
&lt;ellipse cx="380.6756" cy="222.0000" rx="3.0000" ry="3.0000" style="fill: #000000; fill-opacity: 1.00; stroke: none;" id="ezcGraphCircle_22"&gt;&lt;/ellipse&gt;
&lt;path d=" M 277.1843,322.8969 L 277.1843,362.0000" style="fill: none; stroke: #000000; stroke-width: 1; stroke-opacity: 1.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_24"&gt;&lt;/path&gt;
&lt;ellipse cx="277.1843" cy="322.8969" rx="3.0000" ry="3.0000" style="fill: #000000; fill-opacity: 1.00; stroke: none;" id="ezcGraphCircle_25"&gt;&lt;/ellipse&gt;
&lt;ellipse cx="277.1843" cy="362.0000" rx="3.0000" ry="3.0000" style="fill: #000000; fill-opacity: 1.00; stroke: none;" id="ezcGraphCircle_26"&gt;&lt;/ellipse&gt;
&lt;g id="ezcGraphTextBox_3"&gt;
&lt;path d=" M 79.9000,42.0000 L 79.9000,0.5000 L 420.6000,0.5000 L 420.6000,42.0000 L 79.9000,42.0000 z " style="fill: #ffffff; fill-opacity: 0.00; stroke: none;" id="ezcGraphPolygon_28"&gt;&lt;/path&gt;
&lt;text id="ezcGraphTextBox_3_text" x="80.4000" text-length="339.2000px" y="35.0000" style="font-size: 40px; font-family: 'Arial'; fill: #2e3436; fill-opacity: 1.00; stroke: none;"&gt;Notebook Vendors
&lt;/text&gt;
&lt;/g&gt;
&lt;g id="ezcGraphTextBox_15" style=" cursor: pointer;" onclick="top.location = 'https://linux-hardware.org/?view=computers&amp;amp;type=notebook&amp;amp;f=chipcard_vendor&amp;amp;v=O2+Micro&amp;amp;p=-2&amp;amp;vendor=Fujitsu'"&gt;
&lt;path d=" M 78.9714,176.0500 L 78.9714,144.4500 L 136.1214,144.4500 L 136.1214,176.0500 L 78.9714,176.0500 z " style="fill: #ffffff; fill-opacity: 0.00; stroke: none;" id="ezcGraphPolygon_29"&gt;&lt;/path&gt;
&lt;text id="ezcGraphTextBox_15_text" x="79.4714" text-length="55.6500px" y="157.7000" style="font-size: 15px; font-family: 'Arial'; fill: #2e3436; fill-opacity: 1.00; stroke: none;"&gt;Fujitsu
&lt;/text&gt;
&lt;text id="ezcGraphTextBox_15_text" x="79.4714" text-length="55.6500px" y="174.2000" style="font-size: 15px; font-family: 'Arial'; fill: #2e3436; fill-opacity: 1.00; stroke: none;"&gt;(37.3%)
&lt;/text&gt;
&lt;/g&gt;
&lt;g id="ezcGraphTextBox_19" style=" cursor: pointer;" onclick="top.location = 'https://linux-hardware.org/?view=computers&amp;amp;type=notebook&amp;amp;f=chipcard_vendor&amp;amp;v=O2+Micro&amp;amp;p=-2&amp;amp;vendor=Toshiba'"&gt;
&lt;path d=" M 352.2138,153.5000 L 352.2138,137.0000 L 472.9638,137.0000 L 472.9638,153.5000 L 352.2138,153.5000 z " style="fill: #ffffff; fill-opacity: 0.00; stroke: none;" id="ezcGraphPolygon_30"&gt;&lt;/path&gt;
&lt;text id="ezcGraphTextBox_19_text" x="352.7138" text-length="119.2500px" y="150.2500" style="font-size: 15px; font-family: 'Arial'; fill: #2e3436; fill-opacity: 1.00; stroke: none;"&gt;Toshiba (19.7%)
&lt;/text&gt;
&lt;/g&gt;
&lt;g id="ezcGraphTextBox_23" style=" cursor: pointer;" onclick="top.location = 'https://linux-hardware.org/?view=computers&amp;amp;type=notebook&amp;amp;f=chipcard_vendor&amp;amp;v=O2+Micro&amp;amp;p=-2&amp;amp;vendor=Fujitsu+Siemens'"&gt;
&lt;path d=" M 386.1756,238.0500 L 386.1756,206.4500 L 498.9756,206.4500 L 498.9756,238.0500 L 386.1756,238.0500 z " style="fill: #ffffff; fill-opacity: 0.00; stroke: none;" id="ezcGraphPolygon_31"&gt;&lt;/path&gt;
&lt;text id="ezcGraphTextBox_23_text" x="386.6756" text-length="55.6500px" y="219.7000" style="font-size: 15px; font-family: 'Arial'; fill: #2e3436; fill-opacity: 1.00; stroke: none;"&gt;Fujitsu
&lt;/text&gt;
&lt;text id="ezcGraphTextBox_23_text" x="386.6756" text-length="111.3000px" y="236.2000" style="font-size: 15px; font-family: 'Arial'; fill: #2e3436; fill-opacity: 1.00; stroke: none;"&gt;Siemens (2.1%)
&lt;/text&gt;
&lt;/g&gt;
&lt;g id="ezcGraphTextBox_27" style=" cursor: pointer;" onclick="top.location = 'https://linux-hardware.org/?view=computers&amp;amp;type=notebook&amp;amp;f=chipcard_vendor&amp;amp;v=O2+Micro&amp;amp;p=-2&amp;amp;vendor=Dell'"&gt;
&lt;path d=" M 282.6843,370.5000 L 282.6843,354.0000 L 379.5843,354.0000 L 379.5843,370.5000 L 282.6843,370.5000 z " style="fill: #ffffff; fill-opacity: 0.00; stroke: none;" id="ezcGraphPolygon_32"&gt;&lt;/path&gt;
&lt;text id="ezcGraphTextBox_27_text" x="283.1843" text-length="95.4000px" y="367.2500" style="font-size: 15px; font-family: 'Arial'; fill: #2e3436; fill-opacity: 1.00; stroke: none;"&gt;Dell (40.8%)
&lt;/text&gt;
&lt;/g&gt;
&lt;/g&gt;
&lt;/svg&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th class="head"&gt;&lt;p&gt;#&lt;/p&gt;&lt;/th&gt;
&lt;th class="head"&gt;&lt;p&gt;Vendor&lt;/p&gt;&lt;/th&gt;
&lt;th class="head"&gt;&lt;p&gt;Percent&lt;/p&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;p&gt;1&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;Dell&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;40.8%&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;p&gt;2&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;Fujitsu&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;37.3%&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;p&gt;3&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;Toshiba&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;19.7%&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;p&gt;4&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;Fujitsu Siemens&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;2.1%&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/section&gt;
&lt;section id="upek"&gt;
&lt;h3&gt;Upek&lt;/h3&gt;
&lt;svg xmlns="http://www.w3.org/2000/svg" width="500" height="420" version="1.0" id="ezcGraph"&gt;
&lt;defs&gt;&lt;/defs&gt;
&lt;g id="ezcGraphChart" color-rendering="optimizeQuality" shape-rendering="geometricPrecision" text-rendering="optimizeLegibility"&gt;
&lt;path d=" M 0.0000,420.0000 L 0.0000,0.0000 L 500.0000,0.0000 L 500.0000,420.0000 L 0.0000,420.0000 z " style="fill: #eeeeec; fill-opacity: 1.00; stroke: none;" id="ezcGraphPolygon_1"&gt;&lt;/path&gt;
&lt;path d=" M 0.0000,42.0000 L 0.0000,0.0000 L 500.0000,0.0000 L 500.0000,42.0000 L 0.0000,42.0000 z " style="fill: #000000; fill-opacity: 0.00; stroke: none;" id="ezcGraphPolygon_2"&gt;&lt;/path&gt;
&lt;ellipse cx="237.5000" cy="231.0000" rx="112.5000" ry="112.5000" style="fill: #3465a4; fill-opacity: 1.00; stroke: none; cursor: pointer;" id="ezcGraphCircle_4" onclick="top.location = 'https://linux-hardware.org/?view=computers&amp;amp;type=notebook&amp;amp;f=chipcard_vendor&amp;amp;v=Upek&amp;amp;p=-2&amp;amp;vendor=Lenovo'"&gt;&lt;/ellipse&gt;
&lt;ellipse cx="237.5000" cy="231.0000" rx="112.0000" ry="112.0000" style="fill: none; stroke: #1a3352; stroke-width: 1; stroke-opacity: 1.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphCircle_5"&gt;&lt;/ellipse&gt;
&lt;path d=" M 154.1667,231.0000 L 119.0000,231.0000" style="fill: none; stroke: #000000; stroke-width: 1; stroke-opacity: 1.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_6"&gt;&lt;/path&gt;
&lt;ellipse cx="154.1667" cy="231.0000" rx="3.0000" ry="3.0000" style="fill: #000000; fill-opacity: 1.00; stroke: none;" id="ezcGraphCircle_7"&gt;&lt;/ellipse&gt;
&lt;ellipse cx="119.0000" cy="231.0000" rx="3.0000" ry="3.0000" style="fill: #000000; fill-opacity: 1.00; stroke: none;" id="ezcGraphCircle_8"&gt;&lt;/ellipse&gt;
&lt;g id="ezcGraphTextBox_3"&gt;
&lt;path d=" M 79.9000,42.0000 L 79.9000,0.5000 L 420.6000,0.5000 L 420.6000,42.0000 L 79.9000,42.0000 z " style="fill: #ffffff; fill-opacity: 0.00; stroke: none;" id="ezcGraphPolygon_10"&gt;&lt;/path&gt;
&lt;text id="ezcGraphTextBox_3_text" x="80.4000" text-length="339.2000px" y="35.0000" style="font-size: 40px; font-family: 'Arial'; fill: #2e3436; fill-opacity: 1.00; stroke: none;"&gt;Notebook Vendors
&lt;/text&gt;
&lt;/g&gt;
&lt;g id="ezcGraphTextBox_9" style=" cursor: pointer;" onclick="top.location = 'https://linux-hardware.org/?view=computers&amp;amp;type=notebook&amp;amp;f=chipcard_vendor&amp;amp;v=Upek&amp;amp;p=-2&amp;amp;vendor=Lenovo'"&gt;
&lt;path d=" M 36.1800,250.0500 L 36.1800,212.4500 L 114.0000,212.4500 L 114.0000,250.0500 L 36.1800,250.0500 z " style="fill: #ffffff; fill-opacity: 0.00; stroke: none;" id="ezcGraphPolygon_11"&gt;&lt;/path&gt;
&lt;text id="ezcGraphTextBox_9_text" x="55.7600" text-length="57.2400px" y="228.2500" style="font-size: 18px; font-family: 'Arial'; fill: #2e3436; fill-opacity: 1.00; stroke: none;"&gt;Lenovo
&lt;/text&gt;
&lt;text id="ezcGraphTextBox_9_text" x="36.6800" text-length="76.3200px" y="248.0500" style="font-size: 18px; font-family: 'Arial'; fill: #2e3436; fill-opacity: 1.00; stroke: none;"&gt;(100.0%)
&lt;/text&gt;
&lt;/g&gt;
&lt;/g&gt;
&lt;/svg&gt;&lt;p&gt;All of Upek readers are used by Lenovo.&lt;/p&gt;
&lt;p&gt;It looks like the Upek devices are "TouchChip Fingerprint Coprocessor"
and not an "Integrated Smart Card Reader". I don't know why they are
listed as "Chipcard Vendor". Perhaps it is a bug or limitation of
&lt;a class="reference external" href="https://linux-hardware.org/"&gt;https://linux-hardware.org/&lt;/a&gt;.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="lenovo"&gt;
&lt;h3&gt;Lenovo&lt;/h3&gt;
&lt;svg xmlns="http://www.w3.org/2000/svg" width="500" height="420" version="1.0" id="ezcGraph"&gt;
&lt;defs&gt;&lt;/defs&gt;
&lt;g id="ezcGraphChart" color-rendering="optimizeQuality" shape-rendering="geometricPrecision" text-rendering="optimizeLegibility"&gt;
&lt;path d=" M 0.0000,420.0000 L 0.0000,0.0000 L 500.0000,0.0000 L 500.0000,420.0000 L 0.0000,420.0000 z " style="fill: #eeeeec; fill-opacity: 1.00; stroke: none;" id="ezcGraphPolygon_1"&gt;&lt;/path&gt;
&lt;path d=" M 0.0000,42.0000 L 0.0000,0.0000 L 500.0000,0.0000 L 500.0000,42.0000 L 0.0000,42.0000 z " style="fill: #000000; fill-opacity: 0.00; stroke: none;" id="ezcGraphPolygon_2"&gt;&lt;/path&gt;
&lt;ellipse cx="237.5000" cy="231.0000" rx="112.5000" ry="112.5000" style="fill: #3465a4; fill-opacity: 1.00; stroke: none; cursor: pointer;" id="ezcGraphCircle_4" onclick="top.location = 'https://linux-hardware.org/?view=computers&amp;amp;type=notebook&amp;amp;f=chipcard_vendor&amp;amp;v=Lenovo&amp;amp;p=-2&amp;amp;vendor=Lenovo'"&gt;&lt;/ellipse&gt;
&lt;ellipse cx="237.5000" cy="231.0000" rx="112.0000" ry="112.0000" style="fill: none; stroke: #1a3352; stroke-width: 1; stroke-opacity: 1.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphCircle_5"&gt;&lt;/ellipse&gt;
&lt;path d=" M 154.1667,231.0000 L 119.0000,231.0000" style="fill: none; stroke: #000000; stroke-width: 1; stroke-opacity: 1.00; stroke-linecap: round; stroke-linejoin: round;" id="ezcGraphLine_6"&gt;&lt;/path&gt;
&lt;ellipse cx="154.1667" cy="231.0000" rx="3.0000" ry="3.0000" style="fill: #000000; fill-opacity: 1.00; stroke: none;" id="ezcGraphCircle_7"&gt;&lt;/ellipse&gt;
&lt;ellipse cx="119.0000" cy="231.0000" rx="3.0000" ry="3.0000" style="fill: #000000; fill-opacity: 1.00; stroke: none;" id="ezcGraphCircle_8"&gt;&lt;/ellipse&gt;
&lt;g id="ezcGraphTextBox_3"&gt;
&lt;path d=" M 79.9000,42.0000 L 79.9000,0.5000 L 420.6000,0.5000 L 420.6000,42.0000 L 79.9000,42.0000 z " style="fill: #ffffff; fill-opacity: 0.00; stroke: none;" id="ezcGraphPolygon_10"&gt;&lt;/path&gt;
&lt;text id="ezcGraphTextBox_3_text" x="80.4000" text-length="339.2000px" y="35.0000" style="font-size: 40px; font-family: 'Arial'; fill: #2e3436; fill-opacity: 1.00; stroke: none;"&gt;Notebook Vendors
&lt;/text&gt;
&lt;/g&gt;
&lt;g id="ezcGraphTextBox_9" style=" cursor: pointer;" onclick="top.location = 'https://linux-hardware.org/?view=computers&amp;amp;type=notebook&amp;amp;f=chipcard_vendor&amp;amp;v=Lenovo&amp;amp;p=-2&amp;amp;vendor=Lenovo'"&gt;
&lt;path d=" M 36.1800,250.0500 L 36.1800,212.4500 L 114.0000,212.4500 L 114.0000,250.0500 L 36.1800,250.0500 z " style="fill: #ffffff; fill-opacity: 0.00; stroke: none;" id="ezcGraphPolygon_11"&gt;&lt;/path&gt;
&lt;text id="ezcGraphTextBox_9_text" x="55.7600" text-length="57.2400px" y="228.2500" style="font-size: 18px; font-family: 'Arial'; fill: #2e3436; fill-opacity: 1.00; stroke: none;"&gt;Lenovo
&lt;/text&gt;
&lt;text id="ezcGraphTextBox_9_text" x="36.6800" text-length="76.3200px" y="248.0500" style="font-size: 18px; font-family: 'Arial'; fill: #2e3436; fill-opacity: 1.00; stroke: none;"&gt;(100.0%)
&lt;/text&gt;
&lt;/g&gt;
&lt;/g&gt;
&lt;/svg&gt;&lt;p&gt;Unsurprisingly, all of Lenovo readers are used by... Lenovo.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="corresponding-ccid-devices"&gt;
&lt;h2&gt;Corresponding CCID devices&lt;/h2&gt;
&lt;p&gt;It is possible to list the CCID devices of each manufacturer that I know
of:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://ccid.apdu.fr/select_readers/?iManufacturer~broadcom"&gt;Broadcom&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://ccid.apdu.fr/select_readers/?iManufacturer~alcor%20micro"&gt;Alcor Micro&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://ccid.apdu.fr/select_readers/?iManufacturer~O2"&gt;O2 Micro&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Upek (not smart card readers)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://ccid.apdu.fr/select_readers/?iManufacturer~Lenovo"&gt;Lenovo&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="conclusion"&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Only three main vendors of smart card readers are used in laptops: Broadcom,
Alcor Micro and O2 Micro.&lt;/p&gt;
&lt;p&gt;Do they produce good products? Are their products supported by my CCID
driver? These are both very good questions, but for other blog articles.
To be continued...&lt;/p&gt;
&lt;/section&gt;</description><category>ccid</category><guid>https://blog.apdu.fr/posts/2026/03/laptops-and-smart-card-readers/</guid><pubDate>Tue, 03 Mar 2026 20:29:45 GMT</pubDate></item><item><title>SCARD_CTL_CODE(3601): USB path of the reader</title><link>https://blog.apdu.fr/posts/2026/02/scard_ctl_code3601-usb-path-of-the-reader/</link><dc:creator>Ludovic Rousseau</dc:creator><description>&lt;p&gt;In version &lt;a class="reference external" href="https://blog.apdu.fr/posts/2026/02/new-version-of-libccid-171"&gt;1.7.1&lt;/a&gt; of my CCID driver I added a new service with the
Control Code &lt;code class="docutils literal"&gt;SCARD_CTL_CODE(3601)&lt;/code&gt;.&lt;/p&gt;
&lt;section id="problem"&gt;
&lt;h2&gt;Problem&lt;/h2&gt;
&lt;p&gt;Some people use two (or more) readers. And each reader plays a specific
role in their application. It is therefore important to identify each one.&lt;/p&gt;
&lt;p&gt;While it is often possible to use the PC/SC reader name (see
&lt;a class="reference external" href="https://blog.apdu.fr/posts/2010/05/what-is-in-pcsc-reader-name/"&gt;What is in a PC/SC reader name?&lt;/a&gt;), if you have two identical readers
with no serial numbers, it becomes impossible to distinguish between
them.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="solution"&gt;
&lt;h2&gt;Solution&lt;/h2&gt;
&lt;p&gt;A USB device is connected to a USB bus with a specific topology. The
&lt;code class="docutils literal"&gt;lsusb &lt;span class="pre"&gt;--tree&lt;/span&gt;&lt;/code&gt; command, for example, can display the USB bus topology.
The output looks like this:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code console"&gt;&lt;a id="rest_code_72036de8652b4f17bf21b7d1d65951c3-1" name="rest_code_72036de8652b4f17bf21b7d1d65951c3-1" href="https://blog.apdu.fr/posts/2026/02/scard_ctl_code3601-usb-path-of-the-reader/#rest_code_72036de8652b4f17bf21b7d1d65951c3-1"&gt;&lt;/a&gt;&lt;span class="gp"&gt;$ &lt;/span&gt;lsusb&lt;span class="w"&gt; &lt;/span&gt;-t
&lt;a id="rest_code_72036de8652b4f17bf21b7d1d65951c3-2" name="rest_code_72036de8652b4f17bf21b7d1d65951c3-2" href="https://blog.apdu.fr/posts/2026/02/scard_ctl_code3601-usb-path-of-the-reader/#rest_code_72036de8652b4f17bf21b7d1d65951c3-2"&gt;&lt;/a&gt;&lt;span class="go"&gt;/:  Bus 001.Port 001: Dev 001, Class=root_hub, Driver=xhci_hcd/16p, 480M&lt;/span&gt;
&lt;a id="rest_code_72036de8652b4f17bf21b7d1d65951c3-3" name="rest_code_72036de8652b4f17bf21b7d1d65951c3-3" href="https://blog.apdu.fr/posts/2026/02/scard_ctl_code3601-usb-path-of-the-reader/#rest_code_72036de8652b4f17bf21b7d1d65951c3-3"&gt;&lt;/a&gt;&lt;span class="go"&gt;    |__ Port 003: Dev 039, If 0, Class=Chip/SmartCard, Driver=usbfs, 12M&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The smart card reader is connected to USB Port 003 on Bus 001. These
numbers are fixed and linked to the computer's physical USB port.
Disconnecting and reconnecting the reader to the same USB port will
result in the same topology.&lt;/p&gt;
&lt;p&gt;On GNU/Linux, the device number &lt;cite&gt;will&lt;/cite&gt; change. For example, if I
disconnect and reconnect the device, the reader's device number (Dev)
will change from 039 to 040.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="scard-ctl-code-3601"&gt;
&lt;h2&gt;SCARD_CTL_CODE(3601)&lt;/h2&gt;
&lt;p&gt;This code is specific to my CCID driver. It comes after &lt;code class="docutils literal"&gt;SCARD_CTL_CODE(3600)&lt;/code&gt;
that is also specific/proprietary and used for MEP (see
&lt;a class="reference external" href="https://blog.apdu.fr/posts/2024/06/ccid-driver-and-multiple-enabled-profiles-mep/"&gt;CCID driver and Multiple Enabled Profiles (MEP)&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Ideally, we would use a code defined by the &lt;a class="reference external" href="https://pcscworkgroup.com/"&gt;PC/SC Workgroup&lt;/a&gt; but this group is essentially defunct and
Microsoft is no longer a member. Microsoft stopped following the
PC/SC Workgroup Specification a long time ago. Therefore, even if a name is
defined by the PC/SC Workgroup, it will not be available on Windows.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="api-documentation"&gt;
&lt;h2&gt;API documentation&lt;/h2&gt;
&lt;p&gt;Use &lt;a class="reference external" href="https://pcsclite.apdu.fr/api/group__API.html#gac3454d4657110fd7f753b2d3d8f4e32f"&gt;SCardControl()&lt;/a&gt;
to send the control code &lt;code class="docutils literal"&gt;SCARD_CTL_CODE(3601)&lt;/code&gt; to the reader. This
code will be intercepted by the CCID driver. On return, you get a
NUL-terminated string in the format
&lt;code class="docutils literal"&gt;&lt;span class="pre"&gt;&amp;lt;bus&amp;gt;-&amp;lt;port[.port[.port]]&amp;gt;:&amp;lt;config&amp;gt;.&amp;lt;interface&amp;gt;&lt;/span&gt;&lt;/code&gt; (e.g.,
&lt;code class="docutils literal"&gt;&lt;span class="pre"&gt;1-1.3.2:1.0&lt;/span&gt;&lt;/code&gt;) as found in &lt;code class="docutils literal"&gt;/sys/bus/usb/devices/&lt;/code&gt;.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="source-code"&gt;
&lt;h2&gt;Source code&lt;/h2&gt;
&lt;p&gt;This example code is also included in the CCID driver's source code, in the
&lt;a class="reference external" href="https://salsa.debian.org/rousseau/CCID/-/blob/master/examples/get_usb_path.py?ref_type=heads"&gt;examples/get_usb_path.py&lt;/a&gt;
file.&lt;/p&gt;
&lt;p&gt;The code also displays the &lt;code class="docutils literal"&gt;SCARD_ATTR_CHANNEL_ID&lt;/code&gt; of the reader (see
&lt;a class="reference external" href="https://blog.apdu.fr/posts/2020/04/scardattrchannelid-and-usb-devices/"&gt;SCARD_ATTR_CHANNEL_ID and USB devices&lt;/a&gt;). This is an official PC/SC
feature. It can be used when topology information is obtained from another
source.&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code python"&gt;&lt;a id="rest_code_dfe3098305be4caba554259b7e66443f-1" name="rest_code_dfe3098305be4caba554259b7e66443f-1" href="https://blog.apdu.fr/posts/2026/02/scard_ctl_code3601-usb-path-of-the-reader/#rest_code_dfe3098305be4caba554259b7e66443f-1"&gt;&lt;/a&gt;&lt;span class="ch"&gt;#! /usr/bin/env python3&lt;/span&gt;
&lt;a id="rest_code_dfe3098305be4caba554259b7e66443f-2" name="rest_code_dfe3098305be4caba554259b7e66443f-2" href="https://blog.apdu.fr/posts/2026/02/scard_ctl_code3601-usb-path-of-the-reader/#rest_code_dfe3098305be4caba554259b7e66443f-2"&gt;&lt;/a&gt;
&lt;a id="rest_code_dfe3098305be4caba554259b7e66443f-3" name="rest_code_dfe3098305be4caba554259b7e66443f-3" href="https://blog.apdu.fr/posts/2026/02/scard_ctl_code3601-usb-path-of-the-reader/#rest_code_dfe3098305be4caba554259b7e66443f-3"&gt;&lt;/a&gt;&lt;span class="sd"&gt;"""&lt;/span&gt;
&lt;a id="rest_code_dfe3098305be4caba554259b7e66443f-4" name="rest_code_dfe3098305be4caba554259b7e66443f-4" href="https://blog.apdu.fr/posts/2026/02/scard_ctl_code3601-usb-path-of-the-reader/#rest_code_dfe3098305be4caba554259b7e66443f-4"&gt;&lt;/a&gt;&lt;span class="sd"&gt;get_usb_path.py: get USB path of readers&lt;/span&gt;
&lt;a id="rest_code_dfe3098305be4caba554259b7e66443f-5" name="rest_code_dfe3098305be4caba554259b7e66443f-5" href="https://blog.apdu.fr/posts/2026/02/scard_ctl_code3601-usb-path-of-the-reader/#rest_code_dfe3098305be4caba554259b7e66443f-5"&gt;&lt;/a&gt;&lt;span class="sd"&gt;Copyright (C) 2026  Ludovic Rousseau&lt;/span&gt;
&lt;a id="rest_code_dfe3098305be4caba554259b7e66443f-6" name="rest_code_dfe3098305be4caba554259b7e66443f-6" href="https://blog.apdu.fr/posts/2026/02/scard_ctl_code3601-usb-path-of-the-reader/#rest_code_dfe3098305be4caba554259b7e66443f-6"&gt;&lt;/a&gt;&lt;span class="sd"&gt;"""&lt;/span&gt;
&lt;a id="rest_code_dfe3098305be4caba554259b7e66443f-7" name="rest_code_dfe3098305be4caba554259b7e66443f-7" href="https://blog.apdu.fr/posts/2026/02/scard_ctl_code3601-usb-path-of-the-reader/#rest_code_dfe3098305be4caba554259b7e66443f-7"&gt;&lt;/a&gt;
&lt;a id="rest_code_dfe3098305be4caba554259b7e66443f-8" name="rest_code_dfe3098305be4caba554259b7e66443f-8" href="https://blog.apdu.fr/posts/2026/02/scard_ctl_code3601-usb-path-of-the-reader/#rest_code_dfe3098305be4caba554259b7e66443f-8"&gt;&lt;/a&gt;&lt;span class="c1"&gt;#   This program is free software; you can redistribute it and/or modify&lt;/span&gt;
&lt;a id="rest_code_dfe3098305be4caba554259b7e66443f-9" name="rest_code_dfe3098305be4caba554259b7e66443f-9" href="https://blog.apdu.fr/posts/2026/02/scard_ctl_code3601-usb-path-of-the-reader/#rest_code_dfe3098305be4caba554259b7e66443f-9"&gt;&lt;/a&gt;&lt;span class="c1"&gt;#   it under the terms of the GNU General Public License as published by&lt;/span&gt;
&lt;a id="rest_code_dfe3098305be4caba554259b7e66443f-10" name="rest_code_dfe3098305be4caba554259b7e66443f-10" href="https://blog.apdu.fr/posts/2026/02/scard_ctl_code3601-usb-path-of-the-reader/#rest_code_dfe3098305be4caba554259b7e66443f-10"&gt;&lt;/a&gt;&lt;span class="c1"&gt;#   the Free Software Foundation; either version 3 of the License, or&lt;/span&gt;
&lt;a id="rest_code_dfe3098305be4caba554259b7e66443f-11" name="rest_code_dfe3098305be4caba554259b7e66443f-11" href="https://blog.apdu.fr/posts/2026/02/scard_ctl_code3601-usb-path-of-the-reader/#rest_code_dfe3098305be4caba554259b7e66443f-11"&gt;&lt;/a&gt;&lt;span class="c1"&gt;#   (at your option) any later version.&lt;/span&gt;
&lt;a id="rest_code_dfe3098305be4caba554259b7e66443f-12" name="rest_code_dfe3098305be4caba554259b7e66443f-12" href="https://blog.apdu.fr/posts/2026/02/scard_ctl_code3601-usb-path-of-the-reader/#rest_code_dfe3098305be4caba554259b7e66443f-12"&gt;&lt;/a&gt;&lt;span class="c1"&gt;#&lt;/span&gt;
&lt;a id="rest_code_dfe3098305be4caba554259b7e66443f-13" name="rest_code_dfe3098305be4caba554259b7e66443f-13" href="https://blog.apdu.fr/posts/2026/02/scard_ctl_code3601-usb-path-of-the-reader/#rest_code_dfe3098305be4caba554259b7e66443f-13"&gt;&lt;/a&gt;&lt;span class="c1"&gt;#   This program is distributed in the hope that it will be useful,&lt;/span&gt;
&lt;a id="rest_code_dfe3098305be4caba554259b7e66443f-14" name="rest_code_dfe3098305be4caba554259b7e66443f-14" href="https://blog.apdu.fr/posts/2026/02/scard_ctl_code3601-usb-path-of-the-reader/#rest_code_dfe3098305be4caba554259b7e66443f-14"&gt;&lt;/a&gt;&lt;span class="c1"&gt;#   but WITHOUT ANY WARRANTY; without even the implied warranty of&lt;/span&gt;
&lt;a id="rest_code_dfe3098305be4caba554259b7e66443f-15" name="rest_code_dfe3098305be4caba554259b7e66443f-15" href="https://blog.apdu.fr/posts/2026/02/scard_ctl_code3601-usb-path-of-the-reader/#rest_code_dfe3098305be4caba554259b7e66443f-15"&gt;&lt;/a&gt;&lt;span class="c1"&gt;#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the&lt;/span&gt;
&lt;a id="rest_code_dfe3098305be4caba554259b7e66443f-16" name="rest_code_dfe3098305be4caba554259b7e66443f-16" href="https://blog.apdu.fr/posts/2026/02/scard_ctl_code3601-usb-path-of-the-reader/#rest_code_dfe3098305be4caba554259b7e66443f-16"&gt;&lt;/a&gt;&lt;span class="c1"&gt;#   GNU General Public License for more details.&lt;/span&gt;
&lt;a id="rest_code_dfe3098305be4caba554259b7e66443f-17" name="rest_code_dfe3098305be4caba554259b7e66443f-17" href="https://blog.apdu.fr/posts/2026/02/scard_ctl_code3601-usb-path-of-the-reader/#rest_code_dfe3098305be4caba554259b7e66443f-17"&gt;&lt;/a&gt;&lt;span class="c1"&gt;#&lt;/span&gt;
&lt;a id="rest_code_dfe3098305be4caba554259b7e66443f-18" name="rest_code_dfe3098305be4caba554259b7e66443f-18" href="https://blog.apdu.fr/posts/2026/02/scard_ctl_code3601-usb-path-of-the-reader/#rest_code_dfe3098305be4caba554259b7e66443f-18"&gt;&lt;/a&gt;&lt;span class="c1"&gt;#   You should have received a copy of the GNU General Public License along&lt;/span&gt;
&lt;a id="rest_code_dfe3098305be4caba554259b7e66443f-19" name="rest_code_dfe3098305be4caba554259b7e66443f-19" href="https://blog.apdu.fr/posts/2026/02/scard_ctl_code3601-usb-path-of-the-reader/#rest_code_dfe3098305be4caba554259b7e66443f-19"&gt;&lt;/a&gt;&lt;span class="c1"&gt;#   with this program; if not, see &amp;lt;http://www.gnu.org/licenses/&amp;gt;.&lt;/span&gt;
&lt;a id="rest_code_dfe3098305be4caba554259b7e66443f-20" name="rest_code_dfe3098305be4caba554259b7e66443f-20" href="https://blog.apdu.fr/posts/2026/02/scard_ctl_code3601-usb-path-of-the-reader/#rest_code_dfe3098305be4caba554259b7e66443f-20"&gt;&lt;/a&gt;
&lt;a id="rest_code_dfe3098305be4caba554259b7e66443f-21" name="rest_code_dfe3098305be4caba554259b7e66443f-21" href="https://blog.apdu.fr/posts/2026/02/scard_ctl_code3601-usb-path-of-the-reader/#rest_code_dfe3098305be4caba554259b7e66443f-21"&gt;&lt;/a&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;struct&lt;/span&gt;
&lt;a id="rest_code_dfe3098305be4caba554259b7e66443f-22" name="rest_code_dfe3098305be4caba554259b7e66443f-22" href="https://blog.apdu.fr/posts/2026/02/scard_ctl_code3601-usb-path-of-the-reader/#rest_code_dfe3098305be4caba554259b7e66443f-22"&gt;&lt;/a&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;smartcard&lt;/span&gt;
&lt;a id="rest_code_dfe3098305be4caba554259b7e66443f-23" name="rest_code_dfe3098305be4caba554259b7e66443f-23" href="https://blog.apdu.fr/posts/2026/02/scard_ctl_code3601-usb-path-of-the-reader/#rest_code_dfe3098305be4caba554259b7e66443f-23"&gt;&lt;/a&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;smartcard.pcsc.PCSCPart10&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;SCARD_CTL_CODE&lt;/span&gt;
&lt;a id="rest_code_dfe3098305be4caba554259b7e66443f-24" name="rest_code_dfe3098305be4caba554259b7e66443f-24" href="https://blog.apdu.fr/posts/2026/02/scard_ctl_code3601-usb-path-of-the-reader/#rest_code_dfe3098305be4caba554259b7e66443f-24"&gt;&lt;/a&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;smartcard.scard&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
&lt;a id="rest_code_dfe3098305be4caba554259b7e66443f-25" name="rest_code_dfe3098305be4caba554259b7e66443f-25" href="https://blog.apdu.fr/posts/2026/02/scard_ctl_code3601-usb-path-of-the-reader/#rest_code_dfe3098305be4caba554259b7e66443f-25"&gt;&lt;/a&gt;    &lt;span class="n"&gt;SCARD_E_NOT_TRANSACTED&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_dfe3098305be4caba554259b7e66443f-26" name="rest_code_dfe3098305be4caba554259b7e66443f-26" href="https://blog.apdu.fr/posts/2026/02/scard_ctl_code3601-usb-path-of-the-reader/#rest_code_dfe3098305be4caba554259b7e66443f-26"&gt;&lt;/a&gt;    &lt;span class="n"&gt;SCARD_E_INVALID_PARAMETER&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_dfe3098305be4caba554259b7e66443f-27" name="rest_code_dfe3098305be4caba554259b7e66443f-27" href="https://blog.apdu.fr/posts/2026/02/scard_ctl_code3601-usb-path-of-the-reader/#rest_code_dfe3098305be4caba554259b7e66443f-27"&gt;&lt;/a&gt;    &lt;span class="n"&gt;SCARD_ATTR_CHANNEL_ID&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_dfe3098305be4caba554259b7e66443f-28" name="rest_code_dfe3098305be4caba554259b7e66443f-28" href="https://blog.apdu.fr/posts/2026/02/scard_ctl_code3601-usb-path-of-the-reader/#rest_code_dfe3098305be4caba554259b7e66443f-28"&gt;&lt;/a&gt;    &lt;span class="n"&gt;SCARD_SHARE_DIRECT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_dfe3098305be4caba554259b7e66443f-29" name="rest_code_dfe3098305be4caba554259b7e66443f-29" href="https://blog.apdu.fr/posts/2026/02/scard_ctl_code3601-usb-path-of-the-reader/#rest_code_dfe3098305be4caba554259b7e66443f-29"&gt;&lt;/a&gt;    &lt;span class="n"&gt;SCARD_LEAVE_CARD&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_dfe3098305be4caba554259b7e66443f-30" name="rest_code_dfe3098305be4caba554259b7e66443f-30" href="https://blog.apdu.fr/posts/2026/02/scard_ctl_code3601-usb-path-of-the-reader/#rest_code_dfe3098305be4caba554259b7e66443f-30"&gt;&lt;/a&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a id="rest_code_dfe3098305be4caba554259b7e66443f-31" name="rest_code_dfe3098305be4caba554259b7e66443f-31" href="https://blog.apdu.fr/posts/2026/02/scard_ctl_code3601-usb-path-of-the-reader/#rest_code_dfe3098305be4caba554259b7e66443f-31"&gt;&lt;/a&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;smartcard.util&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;toASCIIString&lt;/span&gt;
&lt;a id="rest_code_dfe3098305be4caba554259b7e66443f-32" name="rest_code_dfe3098305be4caba554259b7e66443f-32" href="https://blog.apdu.fr/posts/2026/02/scard_ctl_code3601-usb-path-of-the-reader/#rest_code_dfe3098305be4caba554259b7e66443f-32"&gt;&lt;/a&gt;
&lt;a id="rest_code_dfe3098305be4caba554259b7e66443f-33" name="rest_code_dfe3098305be4caba554259b7e66443f-33" href="https://blog.apdu.fr/posts/2026/02/scard_ctl_code3601-usb-path-of-the-reader/#rest_code_dfe3098305be4caba554259b7e66443f-33"&gt;&lt;/a&gt;
&lt;a id="rest_code_dfe3098305be4caba554259b7e66443f-34" name="rest_code_dfe3098305be4caba554259b7e66443f-34" href="https://blog.apdu.fr/posts/2026/02/scard_ctl_code3601-usb-path-of-the-reader/#rest_code_dfe3098305be4caba554259b7e66443f-34"&gt;&lt;/a&gt;&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;get_usb_path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;reader&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;a id="rest_code_dfe3098305be4caba554259b7e66443f-35" name="rest_code_dfe3098305be4caba554259b7e66443f-35" href="https://blog.apdu.fr/posts/2026/02/scard_ctl_code3601-usb-path-of-the-reader/#rest_code_dfe3098305be4caba554259b7e66443f-35"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="sd"&gt;"""&lt;/span&gt;
&lt;a id="rest_code_dfe3098305be4caba554259b7e66443f-36" name="rest_code_dfe3098305be4caba554259b7e66443f-36" href="https://blog.apdu.fr/posts/2026/02/scard_ctl_code3601-usb-path-of-the-reader/#rest_code_dfe3098305be4caba554259b7e66443f-36"&gt;&lt;/a&gt;&lt;span class="sd"&gt;    Display USB topology&lt;/span&gt;
&lt;a id="rest_code_dfe3098305be4caba554259b7e66443f-37" name="rest_code_dfe3098305be4caba554259b7e66443f-37" href="https://blog.apdu.fr/posts/2026/02/scard_ctl_code3601-usb-path-of-the-reader/#rest_code_dfe3098305be4caba554259b7e66443f-37"&gt;&lt;/a&gt;&lt;span class="sd"&gt;    """&lt;/span&gt;
&lt;a id="rest_code_dfe3098305be4caba554259b7e66443f-38" name="rest_code_dfe3098305be4caba554259b7e66443f-38" href="https://blog.apdu.fr/posts/2026/02/scard_ctl_code3601-usb-path-of-the-reader/#rest_code_dfe3098305be4caba554259b7e66443f-38"&gt;&lt;/a&gt;    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Using:"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;reader&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a id="rest_code_dfe3098305be4caba554259b7e66443f-39" name="rest_code_dfe3098305be4caba554259b7e66443f-39" href="https://blog.apdu.fr/posts/2026/02/scard_ctl_code3601-usb-path-of-the-reader/#rest_code_dfe3098305be4caba554259b7e66443f-39"&gt;&lt;/a&gt;    &lt;span class="n"&gt;card_connection&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;reader&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;createConnection&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;a id="rest_code_dfe3098305be4caba554259b7e66443f-40" name="rest_code_dfe3098305be4caba554259b7e66443f-40" href="https://blog.apdu.fr/posts/2026/02/scard_ctl_code3601-usb-path-of-the-reader/#rest_code_dfe3098305be4caba554259b7e66443f-40"&gt;&lt;/a&gt;    &lt;span class="n"&gt;card_connection&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;connect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mode&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;SCARD_SHARE_DIRECT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;disposition&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;SCARD_LEAVE_CARD&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a id="rest_code_dfe3098305be4caba554259b7e66443f-41" name="rest_code_dfe3098305be4caba554259b7e66443f-41" href="https://blog.apdu.fr/posts/2026/02/scard_ctl_code3601-usb-path-of-the-reader/#rest_code_dfe3098305be4caba554259b7e66443f-41"&gt;&lt;/a&gt;
&lt;a id="rest_code_dfe3098305be4caba554259b7e66443f-42" name="rest_code_dfe3098305be4caba554259b7e66443f-42" href="https://blog.apdu.fr/posts/2026/02/scard_ctl_code3601-usb-path-of-the-reader/#rest_code_dfe3098305be4caba554259b7e66443f-42"&gt;&lt;/a&gt;    &lt;span class="c1"&gt;# special control code&lt;/span&gt;
&lt;a id="rest_code_dfe3098305be4caba554259b7e66443f-43" name="rest_code_dfe3098305be4caba554259b7e66443f-43" href="https://blog.apdu.fr/posts/2026/02/scard_ctl_code3601-usb-path-of-the-reader/#rest_code_dfe3098305be4caba554259b7e66443f-43"&gt;&lt;/a&gt;    &lt;span class="n"&gt;ioctl_get_usb_path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;SCARD_CTL_CODE&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3601&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a id="rest_code_dfe3098305be4caba554259b7e66443f-44" name="rest_code_dfe3098305be4caba554259b7e66443f-44" href="https://blog.apdu.fr/posts/2026/02/scard_ctl_code3601-usb-path-of-the-reader/#rest_code_dfe3098305be4caba554259b7e66443f-44"&gt;&lt;/a&gt;    &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;a id="rest_code_dfe3098305be4caba554259b7e66443f-45" name="rest_code_dfe3098305be4caba554259b7e66443f-45" href="https://blog.apdu.fr/posts/2026/02/scard_ctl_code3601-usb-path-of-the-reader/#rest_code_dfe3098305be4caba554259b7e66443f-45"&gt;&lt;/a&gt;        &lt;span class="n"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;card_connection&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;control&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ioctl_get_usb_path&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a id="rest_code_dfe3098305be4caba554259b7e66443f-46" name="rest_code_dfe3098305be4caba554259b7e66443f-46" href="https://blog.apdu.fr/posts/2026/02/scard_ctl_code3601-usb-path-of-the-reader/#rest_code_dfe3098305be4caba554259b7e66443f-46"&gt;&lt;/a&gt;    &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="n"&gt;smartcard&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Exceptions&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SmartcardException&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;ex&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;a id="rest_code_dfe3098305be4caba554259b7e66443f-47" name="rest_code_dfe3098305be4caba554259b7e66443f-47" href="https://blog.apdu.fr/posts/2026/02/scard_ctl_code3601-usb-path-of-the-reader/#rest_code_dfe3098305be4caba554259b7e66443f-47"&gt;&lt;/a&gt;        &lt;span class="c1"&gt;# SCARD_E_NOT_TRANSACTED returned by pcsc-lite&lt;/span&gt;
&lt;a id="rest_code_dfe3098305be4caba554259b7e66443f-48" name="rest_code_dfe3098305be4caba554259b7e66443f-48" href="https://blog.apdu.fr/posts/2026/02/scard_ctl_code3601-usb-path-of-the-reader/#rest_code_dfe3098305be4caba554259b7e66443f-48"&gt;&lt;/a&gt;        &lt;span class="c1"&gt;# SCARD_E_INVALID_PARAMETER retruned by macOS&lt;/span&gt;
&lt;a id="rest_code_dfe3098305be4caba554259b7e66443f-49" name="rest_code_dfe3098305be4caba554259b7e66443f-49" href="https://blog.apdu.fr/posts/2026/02/scard_ctl_code3601-usb-path-of-the-reader/#rest_code_dfe3098305be4caba554259b7e66443f-49"&gt;&lt;/a&gt;        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;ex&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;hresult&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;SCARD_E_NOT_TRANSACTED&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;SCARD_E_INVALID_PARAMETER&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
&lt;a id="rest_code_dfe3098305be4caba554259b7e66443f-50" name="rest_code_dfe3098305be4caba554259b7e66443f-50" href="https://blog.apdu.fr/posts/2026/02/scard_ctl_code3601-usb-path-of-the-reader/#rest_code_dfe3098305be4caba554259b7e66443f-50"&gt;&lt;/a&gt;            &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Your driver does not (yet) support SCARD_CTL_CODE(3601)"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a id="rest_code_dfe3098305be4caba554259b7e66443f-51" name="rest_code_dfe3098305be4caba554259b7e66443f-51" href="https://blog.apdu.fr/posts/2026/02/scard_ctl_code3601-usb-path-of-the-reader/#rest_code_dfe3098305be4caba554259b7e66443f-51"&gt;&lt;/a&gt;            &lt;span class="k"&gt;return&lt;/span&gt;
&lt;a id="rest_code_dfe3098305be4caba554259b7e66443f-52" name="rest_code_dfe3098305be4caba554259b7e66443f-52" href="https://blog.apdu.fr/posts/2026/02/scard_ctl_code3601-usb-path-of-the-reader/#rest_code_dfe3098305be4caba554259b7e66443f-52"&gt;&lt;/a&gt;        &lt;span class="k"&gt;raise&lt;/span&gt;
&lt;a id="rest_code_dfe3098305be4caba554259b7e66443f-53" name="rest_code_dfe3098305be4caba554259b7e66443f-53" href="https://blog.apdu.fr/posts/2026/02/scard_ctl_code3601-usb-path-of-the-reader/#rest_code_dfe3098305be4caba554259b7e66443f-53"&gt;&lt;/a&gt;    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"USB path:"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;toASCIIString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;res&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;a id="rest_code_dfe3098305be4caba554259b7e66443f-54" name="rest_code_dfe3098305be4caba554259b7e66443f-54" href="https://blog.apdu.fr/posts/2026/02/scard_ctl_code3601-usb-path-of-the-reader/#rest_code_dfe3098305be4caba554259b7e66443f-54"&gt;&lt;/a&gt;
&lt;a id="rest_code_dfe3098305be4caba554259b7e66443f-55" name="rest_code_dfe3098305be4caba554259b7e66443f-55" href="https://blog.apdu.fr/posts/2026/02/scard_ctl_code3601-usb-path-of-the-reader/#rest_code_dfe3098305be4caba554259b7e66443f-55"&gt;&lt;/a&gt;    &lt;span class="c1"&gt;# get Channel ID&lt;/span&gt;
&lt;a id="rest_code_dfe3098305be4caba554259b7e66443f-56" name="rest_code_dfe3098305be4caba554259b7e66443f-56" href="https://blog.apdu.fr/posts/2026/02/scard_ctl_code3601-usb-path-of-the-reader/#rest_code_dfe3098305be4caba554259b7e66443f-56"&gt;&lt;/a&gt;    &lt;span class="n"&gt;attrib&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;card_connection&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;getAttrib&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;SCARD_ATTR_CHANNEL_ID&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a id="rest_code_dfe3098305be4caba554259b7e66443f-57" name="rest_code_dfe3098305be4caba554259b7e66443f-57" href="https://blog.apdu.fr/posts/2026/02/scard_ctl_code3601-usb-path-of-the-reader/#rest_code_dfe3098305be4caba554259b7e66443f-57"&gt;&lt;/a&gt;    &lt;span class="n"&gt;ddddcccc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;struct&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;unpack&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"i"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;bytearray&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;attrib&lt;/span&gt;&lt;span class="p"&gt;))[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;a id="rest_code_dfe3098305be4caba554259b7e66443f-58" name="rest_code_dfe3098305be4caba554259b7e66443f-58" href="https://blog.apdu.fr/posts/2026/02/scard_ctl_code3601-usb-path-of-the-reader/#rest_code_dfe3098305be4caba554259b7e66443f-58"&gt;&lt;/a&gt;    &lt;span class="n"&gt;dddd&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ddddcccc&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;16&lt;/span&gt;
&lt;a id="rest_code_dfe3098305be4caba554259b7e66443f-59" name="rest_code_dfe3098305be4caba554259b7e66443f-59" href="https://blog.apdu.fr/posts/2026/02/scard_ctl_code3601-usb-path-of-the-reader/#rest_code_dfe3098305be4caba554259b7e66443f-59"&gt;&lt;/a&gt;    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;dddd&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mh"&gt;0x0020&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;a id="rest_code_dfe3098305be4caba554259b7e66443f-60" name="rest_code_dfe3098305be4caba554259b7e66443f-60" href="https://blog.apdu.fr/posts/2026/02/scard_ctl_code3601-usb-path-of-the-reader/#rest_code_dfe3098305be4caba554259b7e66443f-60"&gt;&lt;/a&gt;        &lt;span class="n"&gt;bus&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ddddcccc&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="mh"&gt;0xFF00&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;
&lt;a id="rest_code_dfe3098305be4caba554259b7e66443f-61" name="rest_code_dfe3098305be4caba554259b7e66443f-61" href="https://blog.apdu.fr/posts/2026/02/scard_ctl_code3601-usb-path-of-the-reader/#rest_code_dfe3098305be4caba554259b7e66443f-61"&gt;&lt;/a&gt;        &lt;span class="n"&gt;addr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ddddcccc&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="mh"&gt;0xFF&lt;/span&gt;
&lt;a id="rest_code_dfe3098305be4caba554259b7e66443f-62" name="rest_code_dfe3098305be4caba554259b7e66443f-62" href="https://blog.apdu.fr/posts/2026/02/scard_ctl_code3601-usb-path-of-the-reader/#rest_code_dfe3098305be4caba554259b7e66443f-62"&gt;&lt;/a&gt;        &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;" USB: bus: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;bus&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;, addr: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;addr&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a id="rest_code_dfe3098305be4caba554259b7e66443f-63" name="rest_code_dfe3098305be4caba554259b7e66443f-63" href="https://blog.apdu.fr/posts/2026/02/scard_ctl_code3601-usb-path-of-the-reader/#rest_code_dfe3098305be4caba554259b7e66443f-63"&gt;&lt;/a&gt;    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;a id="rest_code_dfe3098305be4caba554259b7e66443f-64" name="rest_code_dfe3098305be4caba554259b7e66443f-64" href="https://blog.apdu.fr/posts/2026/02/scard_ctl_code3601-usb-path-of-the-reader/#rest_code_dfe3098305be4caba554259b7e66443f-64"&gt;&lt;/a&gt;
&lt;a id="rest_code_dfe3098305be4caba554259b7e66443f-65" name="rest_code_dfe3098305be4caba554259b7e66443f-65" href="https://blog.apdu.fr/posts/2026/02/scard_ctl_code3601-usb-path-of-the-reader/#rest_code_dfe3098305be4caba554259b7e66443f-65"&gt;&lt;/a&gt;
&lt;a id="rest_code_dfe3098305be4caba554259b7e66443f-66" name="rest_code_dfe3098305be4caba554259b7e66443f-66" href="https://blog.apdu.fr/posts/2026/02/scard_ctl_code3601-usb-path-of-the-reader/#rest_code_dfe3098305be4caba554259b7e66443f-66"&gt;&lt;/a&gt;&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
&lt;a id="rest_code_dfe3098305be4caba554259b7e66443f-67" name="rest_code_dfe3098305be4caba554259b7e66443f-67" href="https://blog.apdu.fr/posts/2026/02/scard_ctl_code3601-usb-path-of-the-reader/#rest_code_dfe3098305be4caba554259b7e66443f-67"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="sd"&gt;"""&lt;/span&gt;
&lt;a id="rest_code_dfe3098305be4caba554259b7e66443f-68" name="rest_code_dfe3098305be4caba554259b7e66443f-68" href="https://blog.apdu.fr/posts/2026/02/scard_ctl_code3601-usb-path-of-the-reader/#rest_code_dfe3098305be4caba554259b7e66443f-68"&gt;&lt;/a&gt;&lt;span class="sd"&gt;    main&lt;/span&gt;
&lt;a id="rest_code_dfe3098305be4caba554259b7e66443f-69" name="rest_code_dfe3098305be4caba554259b7e66443f-69" href="https://blog.apdu.fr/posts/2026/02/scard_ctl_code3601-usb-path-of-the-reader/#rest_code_dfe3098305be4caba554259b7e66443f-69"&gt;&lt;/a&gt;&lt;span class="sd"&gt;    """&lt;/span&gt;
&lt;a id="rest_code_dfe3098305be4caba554259b7e66443f-70" name="rest_code_dfe3098305be4caba554259b7e66443f-70" href="https://blog.apdu.fr/posts/2026/02/scard_ctl_code3601-usb-path-of-the-reader/#rest_code_dfe3098305be4caba554259b7e66443f-70"&gt;&lt;/a&gt;    &lt;span class="c1"&gt;# for all the available readers&lt;/span&gt;
&lt;a id="rest_code_dfe3098305be4caba554259b7e66443f-71" name="rest_code_dfe3098305be4caba554259b7e66443f-71" href="https://blog.apdu.fr/posts/2026/02/scard_ctl_code3601-usb-path-of-the-reader/#rest_code_dfe3098305be4caba554259b7e66443f-71"&gt;&lt;/a&gt;    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;reader&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;smartcard&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;readers&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
&lt;a id="rest_code_dfe3098305be4caba554259b7e66443f-72" name="rest_code_dfe3098305be4caba554259b7e66443f-72" href="https://blog.apdu.fr/posts/2026/02/scard_ctl_code3601-usb-path-of-the-reader/#rest_code_dfe3098305be4caba554259b7e66443f-72"&gt;&lt;/a&gt;        &lt;span class="n"&gt;get_usb_path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;reader&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a id="rest_code_dfe3098305be4caba554259b7e66443f-73" name="rest_code_dfe3098305be4caba554259b7e66443f-73" href="https://blog.apdu.fr/posts/2026/02/scard_ctl_code3601-usb-path-of-the-reader/#rest_code_dfe3098305be4caba554259b7e66443f-73"&gt;&lt;/a&gt;
&lt;a id="rest_code_dfe3098305be4caba554259b7e66443f-74" name="rest_code_dfe3098305be4caba554259b7e66443f-74" href="https://blog.apdu.fr/posts/2026/02/scard_ctl_code3601-usb-path-of-the-reader/#rest_code_dfe3098305be4caba554259b7e66443f-74"&gt;&lt;/a&gt;
&lt;a id="rest_code_dfe3098305be4caba554259b7e66443f-75" name="rest_code_dfe3098305be4caba554259b7e66443f-75" href="https://blog.apdu.fr/posts/2026/02/scard_ctl_code3601-usb-path-of-the-reader/#rest_code_dfe3098305be4caba554259b7e66443f-75"&gt;&lt;/a&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="vm"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;"__main__"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;a id="rest_code_dfe3098305be4caba554259b7e66443f-76" name="rest_code_dfe3098305be4caba554259b7e66443f-76" href="https://blog.apdu.fr/posts/2026/02/scard_ctl_code3601-usb-path-of-the-reader/#rest_code_dfe3098305be4caba554259b7e66443f-76"&gt;&lt;/a&gt;    &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/section&gt;
&lt;section id="output"&gt;
&lt;h2&gt;Output&lt;/h2&gt;
&lt;section id="the-reader-is-connected-directly-to-the-computer"&gt;
&lt;h3&gt;The reader is connected directly to the computer&lt;/h3&gt;
&lt;div class="code"&gt;&lt;pre class="code console"&gt;&lt;a id="rest_code_24e22b1dfb914e78b7f067ef7ad7d722-1" name="rest_code_24e22b1dfb914e78b7f067ef7ad7d722-1" href="https://blog.apdu.fr/posts/2026/02/scard_ctl_code3601-usb-path-of-the-reader/#rest_code_24e22b1dfb914e78b7f067ef7ad7d722-1"&gt;&lt;/a&gt;&lt;span class="gp"&gt;$ &lt;/span&gt;./get_usb_path.py
&lt;a id="rest_code_24e22b1dfb914e78b7f067ef7ad7d722-2" name="rest_code_24e22b1dfb914e78b7f067ef7ad7d722-2" href="https://blog.apdu.fr/posts/2026/02/scard_ctl_code3601-usb-path-of-the-reader/#rest_code_24e22b1dfb914e78b7f067ef7ad7d722-2"&gt;&lt;/a&gt;&lt;span class="go"&gt;Using: Gemalto PC Twin Reader (70D7E2EE) 01 00&lt;/span&gt;
&lt;a id="rest_code_24e22b1dfb914e78b7f067ef7ad7d722-3" name="rest_code_24e22b1dfb914e78b7f067ef7ad7d722-3" href="https://blog.apdu.fr/posts/2026/02/scard_ctl_code3601-usb-path-of-the-reader/#rest_code_24e22b1dfb914e78b7f067ef7ad7d722-3"&gt;&lt;/a&gt;&lt;span class="go"&gt;USB path: 1-3:1.0&lt;/span&gt;
&lt;a id="rest_code_24e22b1dfb914e78b7f067ef7ad7d722-4" name="rest_code_24e22b1dfb914e78b7f067ef7ad7d722-4" href="https://blog.apdu.fr/posts/2026/02/scard_ctl_code3601-usb-path-of-the-reader/#rest_code_24e22b1dfb914e78b7f067ef7ad7d722-4"&gt;&lt;/a&gt;&lt;span class="go"&gt; USB: bus: 1, addr: 39&lt;/span&gt;
&lt;a id="rest_code_24e22b1dfb914e78b7f067ef7ad7d722-5" name="rest_code_24e22b1dfb914e78b7f067ef7ad7d722-5" href="https://blog.apdu.fr/posts/2026/02/scard_ctl_code3601-usb-path-of-the-reader/#rest_code_24e22b1dfb914e78b7f067ef7ad7d722-5"&gt;&lt;/a&gt;
&lt;a id="rest_code_24e22b1dfb914e78b7f067ef7ad7d722-6" name="rest_code_24e22b1dfb914e78b7f067ef7ad7d722-6" href="https://blog.apdu.fr/posts/2026/02/scard_ctl_code3601-usb-path-of-the-reader/#rest_code_24e22b1dfb914e78b7f067ef7ad7d722-6"&gt;&lt;/a&gt;&lt;span class="gp"&gt;$ &lt;/span&gt;lsusb&lt;span class="w"&gt; &lt;/span&gt;-t
&lt;a id="rest_code_24e22b1dfb914e78b7f067ef7ad7d722-7" name="rest_code_24e22b1dfb914e78b7f067ef7ad7d722-7" href="https://blog.apdu.fr/posts/2026/02/scard_ctl_code3601-usb-path-of-the-reader/#rest_code_24e22b1dfb914e78b7f067ef7ad7d722-7"&gt;&lt;/a&gt;&lt;span class="go"&gt;/:  Bus 001.Port 001: Dev 001, Class=root_hub, Driver=xhci_hcd/16p, 480M&lt;/span&gt;
&lt;a id="rest_code_24e22b1dfb914e78b7f067ef7ad7d722-8" name="rest_code_24e22b1dfb914e78b7f067ef7ad7d722-8" href="https://blog.apdu.fr/posts/2026/02/scard_ctl_code3601-usb-path-of-the-reader/#rest_code_24e22b1dfb914e78b7f067ef7ad7d722-8"&gt;&lt;/a&gt;&lt;span class="go"&gt;    |__ Port 003: Dev 039, If 0, Class=Chip/SmartCard, Driver=usbfs, 12M&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The USB path is &lt;code class="docutils literal"&gt;&lt;span class="pre"&gt;1-3:1.0&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;This corresponds to bus 1, port 3, configuration 1 and interface 0. You
can ignore the configuration and interface details for non-composite USB
devices.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="connected-to-another-usb-port-of-the-computer"&gt;
&lt;h3&gt;Connected to another USB port of the computer&lt;/h3&gt;
&lt;div class="code"&gt;&lt;pre class="code console"&gt;&lt;a id="rest_code_072be8e66c1f4abe9d18de2368d63342-1" name="rest_code_072be8e66c1f4abe9d18de2368d63342-1" href="https://blog.apdu.fr/posts/2026/02/scard_ctl_code3601-usb-path-of-the-reader/#rest_code_072be8e66c1f4abe9d18de2368d63342-1"&gt;&lt;/a&gt;&lt;span class="gp"&gt;$ &lt;/span&gt;./get_usb_path.py
&lt;a id="rest_code_072be8e66c1f4abe9d18de2368d63342-2" name="rest_code_072be8e66c1f4abe9d18de2368d63342-2" href="https://blog.apdu.fr/posts/2026/02/scard_ctl_code3601-usb-path-of-the-reader/#rest_code_072be8e66c1f4abe9d18de2368d63342-2"&gt;&lt;/a&gt;&lt;span class="go"&gt;Using: Gemalto PC Twin Reader (70D7E2EE) 01 00&lt;/span&gt;
&lt;a id="rest_code_072be8e66c1f4abe9d18de2368d63342-3" name="rest_code_072be8e66c1f4abe9d18de2368d63342-3" href="https://blog.apdu.fr/posts/2026/02/scard_ctl_code3601-usb-path-of-the-reader/#rest_code_072be8e66c1f4abe9d18de2368d63342-3"&gt;&lt;/a&gt;&lt;span class="go"&gt;USB path: 1-6:1.0&lt;/span&gt;
&lt;a id="rest_code_072be8e66c1f4abe9d18de2368d63342-4" name="rest_code_072be8e66c1f4abe9d18de2368d63342-4" href="https://blog.apdu.fr/posts/2026/02/scard_ctl_code3601-usb-path-of-the-reader/#rest_code_072be8e66c1f4abe9d18de2368d63342-4"&gt;&lt;/a&gt;&lt;span class="go"&gt; USB: bus: 1, addr: 40&lt;/span&gt;
&lt;a id="rest_code_072be8e66c1f4abe9d18de2368d63342-5" name="rest_code_072be8e66c1f4abe9d18de2368d63342-5" href="https://blog.apdu.fr/posts/2026/02/scard_ctl_code3601-usb-path-of-the-reader/#rest_code_072be8e66c1f4abe9d18de2368d63342-5"&gt;&lt;/a&gt;
&lt;a id="rest_code_072be8e66c1f4abe9d18de2368d63342-6" name="rest_code_072be8e66c1f4abe9d18de2368d63342-6" href="https://blog.apdu.fr/posts/2026/02/scard_ctl_code3601-usb-path-of-the-reader/#rest_code_072be8e66c1f4abe9d18de2368d63342-6"&gt;&lt;/a&gt;&lt;span class="gp"&gt;$ &lt;/span&gt;lsusb&lt;span class="w"&gt; &lt;/span&gt;-t
&lt;a id="rest_code_072be8e66c1f4abe9d18de2368d63342-7" name="rest_code_072be8e66c1f4abe9d18de2368d63342-7" href="https://blog.apdu.fr/posts/2026/02/scard_ctl_code3601-usb-path-of-the-reader/#rest_code_072be8e66c1f4abe9d18de2368d63342-7"&gt;&lt;/a&gt;&lt;span class="go"&gt;/:  Bus 001.Port 001: Dev 001, Class=root_hub, Driver=xhci_hcd/16p, 480M&lt;/span&gt;
&lt;a id="rest_code_072be8e66c1f4abe9d18de2368d63342-8" name="rest_code_072be8e66c1f4abe9d18de2368d63342-8" href="https://blog.apdu.fr/posts/2026/02/scard_ctl_code3601-usb-path-of-the-reader/#rest_code_072be8e66c1f4abe9d18de2368d63342-8"&gt;&lt;/a&gt;&lt;span class="go"&gt;    |__ Port 006: Dev 040, If 0, Class=Chip/SmartCard, Driver=usbfs, 12M&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Note:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;the Port changed from 003 to 006&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;the Dev changed from 039 to 040&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="connected-to-a-hub"&gt;
&lt;h3&gt;Connected to a hub&lt;/h3&gt;
&lt;div class="code"&gt;&lt;pre class="code console"&gt;&lt;a id="rest_code_b9b1b9855d0f4dd0b9d462085b015053-1" name="rest_code_b9b1b9855d0f4dd0b9d462085b015053-1" href="https://blog.apdu.fr/posts/2026/02/scard_ctl_code3601-usb-path-of-the-reader/#rest_code_b9b1b9855d0f4dd0b9d462085b015053-1"&gt;&lt;/a&gt;&lt;span class="gp"&gt;$ &lt;/span&gt;./get_usb_path.py
&lt;a id="rest_code_b9b1b9855d0f4dd0b9d462085b015053-2" name="rest_code_b9b1b9855d0f4dd0b9d462085b015053-2" href="https://blog.apdu.fr/posts/2026/02/scard_ctl_code3601-usb-path-of-the-reader/#rest_code_b9b1b9855d0f4dd0b9d462085b015053-2"&gt;&lt;/a&gt;&lt;span class="go"&gt;Using: Gemalto PC Twin Reader (70D7E2EE) 01 00&lt;/span&gt;
&lt;a id="rest_code_b9b1b9855d0f4dd0b9d462085b015053-3" name="rest_code_b9b1b9855d0f4dd0b9d462085b015053-3" href="https://blog.apdu.fr/posts/2026/02/scard_ctl_code3601-usb-path-of-the-reader/#rest_code_b9b1b9855d0f4dd0b9d462085b015053-3"&gt;&lt;/a&gt;&lt;span class="go"&gt;USB path: 1-3.1:1.0&lt;/span&gt;
&lt;a id="rest_code_b9b1b9855d0f4dd0b9d462085b015053-4" name="rest_code_b9b1b9855d0f4dd0b9d462085b015053-4" href="https://blog.apdu.fr/posts/2026/02/scard_ctl_code3601-usb-path-of-the-reader/#rest_code_b9b1b9855d0f4dd0b9d462085b015053-4"&gt;&lt;/a&gt;&lt;span class="go"&gt; USB: bus: 1, addr: 42&lt;/span&gt;
&lt;a id="rest_code_b9b1b9855d0f4dd0b9d462085b015053-5" name="rest_code_b9b1b9855d0f4dd0b9d462085b015053-5" href="https://blog.apdu.fr/posts/2026/02/scard_ctl_code3601-usb-path-of-the-reader/#rest_code_b9b1b9855d0f4dd0b9d462085b015053-5"&gt;&lt;/a&gt;
&lt;a id="rest_code_b9b1b9855d0f4dd0b9d462085b015053-6" name="rest_code_b9b1b9855d0f4dd0b9d462085b015053-6" href="https://blog.apdu.fr/posts/2026/02/scard_ctl_code3601-usb-path-of-the-reader/#rest_code_b9b1b9855d0f4dd0b9d462085b015053-6"&gt;&lt;/a&gt;&lt;span class="gp"&gt;$ &lt;/span&gt;lsusb&lt;span class="w"&gt; &lt;/span&gt;-t
&lt;a id="rest_code_b9b1b9855d0f4dd0b9d462085b015053-7" name="rest_code_b9b1b9855d0f4dd0b9d462085b015053-7" href="https://blog.apdu.fr/posts/2026/02/scard_ctl_code3601-usb-path-of-the-reader/#rest_code_b9b1b9855d0f4dd0b9d462085b015053-7"&gt;&lt;/a&gt;&lt;span class="go"&gt;/:  Bus 001.Port 001: Dev 001, Class=root_hub, Driver=xhci_hcd/16p, 480M&lt;/span&gt;
&lt;a id="rest_code_b9b1b9855d0f4dd0b9d462085b015053-8" name="rest_code_b9b1b9855d0f4dd0b9d462085b015053-8" href="https://blog.apdu.fr/posts/2026/02/scard_ctl_code3601-usb-path-of-the-reader/#rest_code_b9b1b9855d0f4dd0b9d462085b015053-8"&gt;&lt;/a&gt;&lt;span class="go"&gt;    |__ Port 003: Dev 041, If 0, Class=Hub, Driver=hub/4p, 480M&lt;/span&gt;
&lt;a id="rest_code_b9b1b9855d0f4dd0b9d462085b015053-9" name="rest_code_b9b1b9855d0f4dd0b9d462085b015053-9" href="https://blog.apdu.fr/posts/2026/02/scard_ctl_code3601-usb-path-of-the-reader/#rest_code_b9b1b9855d0f4dd0b9d462085b015053-9"&gt;&lt;/a&gt;&lt;span class="go"&gt;        |__ Port 001: Dev 042, If 0, Class=Chip/SmartCard, Driver=usbfs, 12M&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Note:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Port 003 is now used by the USB hub (Class=Hub)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;the reader uses Port 001 of the hub&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;the USB path has one extra level &lt;code class="docutils literal"&gt;&lt;span class="pre"&gt;1-3.1:1.0&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="connected-to-another-port-of-the-hub"&gt;
&lt;h3&gt;Connected to another port of the hub&lt;/h3&gt;
&lt;div class="code"&gt;&lt;pre class="code console"&gt;&lt;a id="rest_code_3ddc1889a7a943fe8e4c1c200a14eec4-1" name="rest_code_3ddc1889a7a943fe8e4c1c200a14eec4-1" href="https://blog.apdu.fr/posts/2026/02/scard_ctl_code3601-usb-path-of-the-reader/#rest_code_3ddc1889a7a943fe8e4c1c200a14eec4-1"&gt;&lt;/a&gt;&lt;span class="gp"&gt;$ &lt;/span&gt;./get_usb_path.py
&lt;a id="rest_code_3ddc1889a7a943fe8e4c1c200a14eec4-2" name="rest_code_3ddc1889a7a943fe8e4c1c200a14eec4-2" href="https://blog.apdu.fr/posts/2026/02/scard_ctl_code3601-usb-path-of-the-reader/#rest_code_3ddc1889a7a943fe8e4c1c200a14eec4-2"&gt;&lt;/a&gt;&lt;span class="go"&gt;Using: Gemalto PC Twin Reader (70D7E2EE) 01 00&lt;/span&gt;
&lt;a id="rest_code_3ddc1889a7a943fe8e4c1c200a14eec4-3" name="rest_code_3ddc1889a7a943fe8e4c1c200a14eec4-3" href="https://blog.apdu.fr/posts/2026/02/scard_ctl_code3601-usb-path-of-the-reader/#rest_code_3ddc1889a7a943fe8e4c1c200a14eec4-3"&gt;&lt;/a&gt;&lt;span class="go"&gt;USB path: 1-3.4:1.0&lt;/span&gt;
&lt;a id="rest_code_3ddc1889a7a943fe8e4c1c200a14eec4-4" name="rest_code_3ddc1889a7a943fe8e4c1c200a14eec4-4" href="https://blog.apdu.fr/posts/2026/02/scard_ctl_code3601-usb-path-of-the-reader/#rest_code_3ddc1889a7a943fe8e4c1c200a14eec4-4"&gt;&lt;/a&gt;&lt;span class="go"&gt; USB: bus: 1, addr: 43&lt;/span&gt;
&lt;a id="rest_code_3ddc1889a7a943fe8e4c1c200a14eec4-5" name="rest_code_3ddc1889a7a943fe8e4c1c200a14eec4-5" href="https://blog.apdu.fr/posts/2026/02/scard_ctl_code3601-usb-path-of-the-reader/#rest_code_3ddc1889a7a943fe8e4c1c200a14eec4-5"&gt;&lt;/a&gt;
&lt;a id="rest_code_3ddc1889a7a943fe8e4c1c200a14eec4-6" name="rest_code_3ddc1889a7a943fe8e4c1c200a14eec4-6" href="https://blog.apdu.fr/posts/2026/02/scard_ctl_code3601-usb-path-of-the-reader/#rest_code_3ddc1889a7a943fe8e4c1c200a14eec4-6"&gt;&lt;/a&gt;&lt;span class="gp"&gt;$ &lt;/span&gt;lsusb&lt;span class="w"&gt; &lt;/span&gt;-t
&lt;a id="rest_code_3ddc1889a7a943fe8e4c1c200a14eec4-7" name="rest_code_3ddc1889a7a943fe8e4c1c200a14eec4-7" href="https://blog.apdu.fr/posts/2026/02/scard_ctl_code3601-usb-path-of-the-reader/#rest_code_3ddc1889a7a943fe8e4c1c200a14eec4-7"&gt;&lt;/a&gt;&lt;span class="go"&gt;/:  Bus 001.Port 001: Dev 001, Class=root_hub, Driver=xhci_hcd/16p, 480M&lt;/span&gt;
&lt;a id="rest_code_3ddc1889a7a943fe8e4c1c200a14eec4-8" name="rest_code_3ddc1889a7a943fe8e4c1c200a14eec4-8" href="https://blog.apdu.fr/posts/2026/02/scard_ctl_code3601-usb-path-of-the-reader/#rest_code_3ddc1889a7a943fe8e4c1c200a14eec4-8"&gt;&lt;/a&gt;&lt;span class="go"&gt;    |__ Port 003: Dev 041, If 0, Class=Hub, Driver=hub/4p, 480M&lt;/span&gt;
&lt;a id="rest_code_3ddc1889a7a943fe8e4c1c200a14eec4-9" name="rest_code_3ddc1889a7a943fe8e4c1c200a14eec4-9" href="https://blog.apdu.fr/posts/2026/02/scard_ctl_code3601-usb-path-of-the-reader/#rest_code_3ddc1889a7a943fe8e4c1c200a14eec4-9"&gt;&lt;/a&gt;&lt;span class="go"&gt;        |__ Port 004: Dev 043, If 0, Class=Chip/SmartCard, Driver=usbfs, 12M&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Note:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;the reader is connected to Port 004 of the hub&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;the hub is still connected to Port 003&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="conclusion"&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Not everyone will need or use this feature. However, it can be very
important if you have a large number of readers.&lt;/p&gt;
&lt;p&gt;Many Thanks to Diego de los Santos for the idea and implementation.&lt;/p&gt;
&lt;/section&gt;</description><category>ccid</category><category>code</category><guid>https://blog.apdu.fr/posts/2026/02/scard_ctl_code3601-usb-path-of-the-reader/</guid><pubDate>Sun, 08 Feb 2026 12:10:17 GMT</pubDate></item><item><title>New version of libccid: 1.7.1</title><link>https://blog.apdu.fr/posts/2026/02/new-version-of-libccid-171/</link><dc:creator>Ludovic Rousseau</dc:creator><description>&lt;p&gt;I just released &lt;a class="reference external" href="https://ccid.apdu.fr/files/"&gt;version 1.7.1&lt;/a&gt; of
&lt;a class="reference external" href="https://ccid.apdu.fr/"&gt;libccid&lt;/a&gt; the Free Software CCID class smart
card reader driver.&lt;/p&gt;
&lt;section id="changes"&gt;
&lt;h2&gt;Changes:&lt;/h2&gt;
&lt;p&gt;1.7.1 - 4 February 2026, Ludovic Rousseau&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Add support of&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;ACS APG8201-B2&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;BUDGET E-ID BUD001&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;CHERRY Smart Board 1150&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;CryptnoxCR CryptnoxCR&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Diebold Nixdorf PN7362au CCID&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;FT BioPass FIDO2 Pro&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Nitrokey Nitrokey Passkey&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add &lt;code class="docutils literal"&gt;SCARD_CTL_CODE(3601)&lt;/code&gt;: USB path of the reader&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Some other minor improvements&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;</description><category>ccid</category><guid>https://blog.apdu.fr/posts/2026/02/new-version-of-libccid-171/</guid><pubDate>Wed, 04 Feb 2026 16:09:03 GMT</pubDate></item><item><title>New version of libccid: 1.7.0</title><link>https://blog.apdu.fr/posts/2025/10/new-version-of-libccid-170/</link><dc:creator>Ludovic Rousseau</dc:creator><description>&lt;p&gt;I just released &lt;a class="reference external" href="https://ccid.apdu.fr/files/"&gt;version 1.7.0&lt;/a&gt; of
&lt;a class="reference external" href="https://ccid.apdu.fr/"&gt;libccid&lt;/a&gt; the Free Software CCID class smart
card reader driver.&lt;/p&gt;
&lt;p&gt;This version includes a udev rules file to modifies the group access
rights of the CCID device (&lt;cite&gt;i.e.&lt;/cite&gt; the file &lt;code class="docutils literal"&gt;/dev/bus/usb/001/xyz&lt;/code&gt;) so
that the pcscd process has read/write access without having to run as
root.  The change on pcsc-lite will be included in version 2.4.0
(coming soon).&lt;/p&gt;
&lt;section id="changes"&gt;
&lt;h2&gt;Changes:&lt;/h2&gt;
&lt;p&gt;1.7.0 - 2 October 2025, Ludovic Rousseau&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Add support of&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;GIGA-TMS NFC CCID Reader&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Identiv Identiv SmartOS Reader&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;SEC1210URT, single slot variant of SEC1210 serial&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;TOKEN2 FIDO2 Security Key(0013),PIN+ Mini with OTP + PGP&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;TOKEN2 FIDO2 Security Key(0014),PIN+ Mini with FIDO + PGP&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;TOKEN2 FIDO2 Security Key(0015),PIN+ Mini with PGP&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;TOKEN2 FIDO2 Security Key(0016),PIN+ Mini with OTP + PGP + FIDO&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;TOKEN2 FIDO2 Security Key(0023),PIN+ Series with OTP + PGP&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;TOKEN2 FIDO2 Security Key(0024),PIN+ Series with FIDO + PGP&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;TOKEN2 FIDO2 Security Key(0025),PIN+ Series with PGP&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;TOKEN2 FIDO2 Security Key(0203),Bio3 Dual with OTP + PGP&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;TOKEN2 FIDO2 Security Key(0204),Bio3 Dual with FIDO + PGP&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;TOKEN2 FIDO2 Security Key(0205),Bio3 Dual with PGP&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;TOKEN2 FIDO2 Security Key(0206),Bio3 Dual with OTP + PGP + FIDO&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;TOKEN2 Molto2 (older version)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;VIX TECHNOLOGY SECURE READER&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Remove support of&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;SIMHUB pcsc reader&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Give pcscd group permission to CCID devices in udev rule&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Avoid a timeout issue with the Thales Fusion NFC reader&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Provide the option to synchronize the 2 interfaces of a SEC1210 (see
&lt;a class="reference external" href="https://blog.apdu.fr/posts/2025/04/card-state-synchronisation-on-sec1210-reader-2-interfaces/"&gt;Card state synchronisation on SEC1210 reader 2 interfaces&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Some other minor improvements&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;</description><category>ccid</category><guid>https://blog.apdu.fr/posts/2025/10/new-version-of-libccid-170/</guid><pubDate>Thu, 02 Oct 2025 13:25:24 GMT</pubDate></item><item><title>Pre-built parse binaries</title><link>https://blog.apdu.fr/posts/2025/06/pre-built-parse-binaries/</link><dc:creator>Ludovic Rousseau</dc:creator><description>&lt;p&gt;Since October 2023, I've been offering a simple way to check if a reader
whether or not a reader complies with the CCID standard. See &lt;a class="reference external" href="https://ccid.apdu.fr/#CCID_compliant"&gt;Check
reader's compliance to CCID specification&lt;/a&gt;.&lt;/p&gt;
&lt;section id="parse-tool"&gt;
&lt;h2&gt;Parse tool&lt;/h2&gt;
&lt;p&gt;As early as the first version of my CCID driver, I provided a tool
called &lt;code class="docutils literal"&gt;parse&lt;/code&gt; to analyze the USB descriptor and see if a connected
device is declared as a CCID devide (USB interface class = 11).&lt;/p&gt;
&lt;p&gt;The &lt;code class="docutils literal"&gt;parse&lt;/code&gt; tool is written in C and you have to build it from source
code. This is not an easy task for non-developers.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="non-developers"&gt;
&lt;h2&gt;Non-developers&lt;/h2&gt;
&lt;p&gt;For non developers, it wasn't easy. Hence the idea of providing pre-built
versions of the &lt;code class="docutils literal"&gt;parse&lt;/code&gt; tool.&lt;/p&gt;
&lt;p&gt;I can't provide a binary for all possible systems (Unix, not just GNU/Linux).&lt;/p&gt;
&lt;p&gt;I provide a binary version for:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Linux x86_64 (GNU/Linux on Intel/AMD 64 bits CPU)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Linux aarch64 (GNU/Linux on ARM 64 bits CPU)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Linux armv7l (GNU/Linux on for example on a Raspberry)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Darwin x86_64 (macOS on Intel 64 bits CPU)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Darwin arm64 (macOS on Apple M1, M2, etc. CPU)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You do not have to know what system or processor you have. Just use, in
a terminal:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code console"&gt;&lt;a id="rest_code_7a6973ad3b264509b1079d817b4989a4-1" name="rest_code_7a6973ad3b264509b1079d817b4989a4-1" href="https://blog.apdu.fr/posts/2025/06/pre-built-parse-binaries/#rest_code_7a6973ad3b264509b1079d817b4989a4-1"&gt;&lt;/a&gt;&lt;span class="go"&gt;curl https://ccid.apdu.fr/files/parse.sh | bash -&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/section&gt;
&lt;section id="statistics"&gt;
&lt;h2&gt;Statistics&lt;/h2&gt;
&lt;p&gt;From last month's HTTP server logs, I get:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th class="head"&gt;&lt;p&gt;Architecture&lt;/p&gt;&lt;/th&gt;
&lt;th class="head"&gt;&lt;p&gt;#&lt;/p&gt;&lt;/th&gt;
&lt;th class="head"&gt;&lt;p&gt;%&lt;/p&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;p&gt;Linux-x86_64&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;52&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;86.67 %&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;p&gt;Darwin-x86_64&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;4&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;6.67 %&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;p&gt;Linux-aarch64&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;4&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;6.67 %&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;p&gt;Darwin-arm64&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;0&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;0 %&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;p&gt;Linux-armv7l&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;0&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;0 %&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;figure class="align-center"&gt;
&lt;img alt="/images/2025/06/parse.png" src="https://blog.apdu.fr/images/2025/06/parse.png"&gt;
&lt;/figure&gt;
&lt;p&gt;Unsurprisingly, the majority of users are on a GNU/Linux system with an
Intel/AMD 64-bits processor.&lt;/p&gt;
&lt;p&gt;I am pleasantly surprised to see GNU/Linux systems on ARM processors.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security"&gt;
&lt;h2&gt;Security&lt;/h2&gt;
&lt;p&gt;I understand that some people prefer to build a program from source code
rather than run a binary retrieved from the Internet.&lt;/p&gt;
&lt;p&gt;I also do not like using:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code console"&gt;&lt;a id="rest_code_5e0118c31bfc4e7d9cd8ceab9cfe81e6-1" name="rest_code_5e0118c31bfc4e7d9cd8ceab9cfe81e6-1" href="https://blog.apdu.fr/posts/2025/06/pre-built-parse-binaries/#rest_code_5e0118c31bfc4e7d9cd8ceab9cfe81e6-1"&gt;&lt;/a&gt;&lt;span class="go"&gt;curl https://random.web.site/install_script.sh | bash -&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This is why is is still possible to rebuild the &lt;code class="docutils literal"&gt;parse&lt;/code&gt; binary from the
source code.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="conclusion"&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;It should (now) be easy to check if a USB smart card reader complies
with hthe CCID standard.&lt;/p&gt;
&lt;p&gt;If you are the product owner of a new smart card reader and don't have a
GNU/Linux developer available to help you, this tool will allow you to
send me the details as documented at &lt;a class="reference external" href="https://ccid.apdu.fr/#CCID_compliant"&gt;Check reader's compliance to CCID
specification&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I can then add your reader in the "&lt;a class="reference external" href="https://ccid.apdu.fr/ccid/shouldwork.html"&gt;Should work but untested by me&lt;/a&gt;" list. If you want to have
your reader listed in the "&lt;a class="reference external" href="https://ccid.apdu.fr/ccid/supported.html"&gt;Supported CCID readers/ICCD tokens&lt;/a&gt;" list, contact me.&lt;/p&gt;
&lt;/section&gt;</description><category>ccid</category><guid>https://blog.apdu.fr/posts/2025/06/pre-built-parse-binaries/</guid><pubDate>Wed, 25 Jun 2025 13:04:43 GMT</pubDate></item><item><title>In case of smart card issues on macOS</title><link>https://blog.apdu.fr/posts/2025/06/in-case-of-smart-card-issues-on-macos/</link><dc:creator>Ludovic Rousseau</dc:creator><description>&lt;p&gt;If you have a problem with your smart card or smart card reader on
macOS, the first step is to disable the CCID provided by Apple and
enable &lt;a class="reference external" href="https://ccid.apdu.fr/"&gt;my CCID driver&lt;/a&gt;.&lt;/p&gt;
&lt;section id="enable-a-good-ccid-driver"&gt;
&lt;h2&gt;Enable a good CCID driver&lt;/h2&gt;
&lt;p&gt;It is very simple. Just do, in a Terminal:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code console"&gt;&lt;a id="rest_code_6c893e7775b94991bf275350433b8a3e-1" name="rest_code_6c893e7775b94991bf275350433b8a3e-1" href="https://blog.apdu.fr/posts/2025/06/in-case-of-smart-card-issues-on-macos/#rest_code_6c893e7775b94991bf275350433b8a3e-1"&gt;&lt;/a&gt;&lt;span class="go"&gt;sudo defaults write /Library/Preferences/com.apple.security.smartcard useIFDCCID -bool yes&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;If the problem is solved then there is no need to report it to me.&lt;/p&gt;
&lt;p&gt;You will find more information in &lt;a class="reference external" href="https://blog.apdu.fr/posts/2023/11/apple-own-ccid-driver-in-sonoma/"&gt;Apple's own CCID driver in Sonoma&lt;/a&gt;.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="update-of-my-ccid-driver"&gt;
&lt;h2&gt;Update of my CCID driver&lt;/h2&gt;
&lt;p&gt;In macOS Sonoma 14.0 Apple provided version 1.5.1 of my CCID driver
(&lt;a class="reference external" href="https://blog.apdu.fr/posts/2023/09/macos-sonoma-and-smart-cards-status/"&gt;macOS Sonoma and smart cards status&lt;/a&gt;) whereas the current version
was 1.5.2.&lt;/p&gt;
&lt;p&gt;In macOS Sequoia 15.0 my CCID driver was still version 1.5.1 whereas the
current version was 1.6.1 (&lt;a class="reference external" href="https://blog.apdu.fr/posts/2024/10/macos-sequoia-and-smart-cards-status/"&gt;macOS Sequoia and smart cards status&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;If you want/need a version of my CCID driver newer than 1.5.1, or a
custom installer for macOS, you can &lt;a class="reference external" href="https://blog.apdu.fr/articles/about_me"&gt;contact me&lt;/a&gt;.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="conclusion"&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;An issue was reported recently (&lt;a class="reference external" href="https://github.com/LudovicRousseau/pyscard/issues/225"&gt;MacOS NFC reader issue for large APDUs&lt;/a&gt;) and
activating my CCID driver &lt;a class="reference external" href="https://github.com/LudovicRousseau/pyscard/issues/225#issuecomment-2979881600"&gt;solved the problem&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;First step is to use a good CCID driver.&lt;/p&gt;
&lt;/section&gt;</description><category>ccid</category><category>Mac OS X</category><category>macOS bug</category><guid>https://blog.apdu.fr/posts/2025/06/in-case-of-smart-card-issues-on-macos/</guid><pubDate>Wed, 18 Jun 2025 11:34:25 GMT</pubDate></item><item><title>Card state synchronisation on SEC1210 reader 2 interfaces</title><link>https://blog.apdu.fr/posts/2025/04/card-state-synchronisation-on-sec1210-reader-2-interfaces/</link><dc:creator>Ludovic Rousseau</dc:creator><description>&lt;p&gt;The next CCID driver (version 1.6.3 not yet released) will contain a
custom code to change the behavior of the Microchip SEC1210 reader.&lt;/p&gt;
&lt;section id="sec1210-reader"&gt;
&lt;h2&gt;SEC1210 reader&lt;/h2&gt;
&lt;p&gt;The &lt;a class="reference external" href="https://www.microchip.com/en-us/product/SEC1210"&gt;Microchip SEC1210 smart card reader&lt;/a&gt; is a chip that you
can integrate in your hardware projects.&lt;/p&gt;
&lt;p&gt;A &lt;a class="reference external" href="https://www.microchip.com/en-us/development-tool/EVB-SEC1210"&gt;development board&lt;/a&gt; is available.&lt;/p&gt;
&lt;img alt="https://ccid.apdu.fr/ccid/img/Microchip-SEC1210.gif" src="https://ccid.apdu.fr/ccid/img/Microchip-SEC1210.gif"&gt;
&lt;p&gt;The board has 2 CCID interfaces that are seen as 2 CCID readers at the
USB level (it is a composite device). See the &lt;a class="reference external" href="https://ccid.apdu.fr/ccid/readers/Microchip_SEC1210.txt"&gt;USB descriptor&lt;/a&gt;:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code text"&gt;&lt;a id="rest_code_645f3bbab8484e899c48f82223cf95e6-1" name="rest_code_645f3bbab8484e899c48f82223cf95e6-1" href="https://blog.apdu.fr/posts/2025/04/card-state-synchronisation-on-sec1210-reader-2-interfaces/#rest_code_645f3bbab8484e899c48f82223cf95e6-1"&gt;&lt;/a&gt;idVendor: 0x0424
&lt;a id="rest_code_645f3bbab8484e899c48f82223cf95e6-2" name="rest_code_645f3bbab8484e899c48f82223cf95e6-2" href="https://blog.apdu.fr/posts/2025/04/card-state-synchronisation-on-sec1210-reader-2-interfaces/#rest_code_645f3bbab8484e899c48f82223cf95e6-2"&gt;&lt;/a&gt; iManufacturer: SMSC
&lt;a id="rest_code_645f3bbab8484e899c48f82223cf95e6-3" name="rest_code_645f3bbab8484e899c48f82223cf95e6-3" href="https://blog.apdu.fr/posts/2025/04/card-state-synchronisation-on-sec1210-reader-2-interfaces/#rest_code_645f3bbab8484e899c48f82223cf95e6-3"&gt;&lt;/a&gt;idProduct: 0x1202
&lt;a id="rest_code_645f3bbab8484e899c48f82223cf95e6-4" name="rest_code_645f3bbab8484e899c48f82223cf95e6-4" href="https://blog.apdu.fr/posts/2025/04/card-state-synchronisation-on-sec1210-reader-2-interfaces/#rest_code_645f3bbab8484e899c48f82223cf95e6-4"&gt;&lt;/a&gt; iProduct: SMSC USX101x Reader
&lt;a id="rest_code_645f3bbab8484e899c48f82223cf95e6-5" name="rest_code_645f3bbab8484e899c48f82223cf95e6-5" href="https://blog.apdu.fr/posts/2025/04/card-state-synchronisation-on-sec1210-reader-2-interfaces/#rest_code_645f3bbab8484e899c48f82223cf95e6-5"&gt;&lt;/a&gt;bcdDevice: 2.22 (firmware release?)
&lt;a id="rest_code_645f3bbab8484e899c48f82223cf95e6-6" name="rest_code_645f3bbab8484e899c48f82223cf95e6-6" href="https://blog.apdu.fr/posts/2025/04/card-state-synchronisation-on-sec1210-reader-2-interfaces/#rest_code_645f3bbab8484e899c48f82223cf95e6-6"&gt;&lt;/a&gt;bLength: 9
&lt;a id="rest_code_645f3bbab8484e899c48f82223cf95e6-7" name="rest_code_645f3bbab8484e899c48f82223cf95e6-7" href="https://blog.apdu.fr/posts/2025/04/card-state-synchronisation-on-sec1210-reader-2-interfaces/#rest_code_645f3bbab8484e899c48f82223cf95e6-7"&gt;&lt;/a&gt;bDescriptorType: 4
&lt;a id="rest_code_645f3bbab8484e899c48f82223cf95e6-8" name="rest_code_645f3bbab8484e899c48f82223cf95e6-8" href="https://blog.apdu.fr/posts/2025/04/card-state-synchronisation-on-sec1210-reader-2-interfaces/#rest_code_645f3bbab8484e899c48f82223cf95e6-8"&gt;&lt;/a&gt;&lt;span class="hll"&gt;bInterfaceNumber: 0
&lt;/span&gt;&lt;a id="rest_code_645f3bbab8484e899c48f82223cf95e6-9" name="rest_code_645f3bbab8484e899c48f82223cf95e6-9" href="https://blog.apdu.fr/posts/2025/04/card-state-synchronisation-on-sec1210-reader-2-interfaces/#rest_code_645f3bbab8484e899c48f82223cf95e6-9"&gt;&lt;/a&gt;bAlternateSetting: 0
&lt;a id="rest_code_645f3bbab8484e899c48f82223cf95e6-10" name="rest_code_645f3bbab8484e899c48f82223cf95e6-10" href="https://blog.apdu.fr/posts/2025/04/card-state-synchronisation-on-sec1210-reader-2-interfaces/#rest_code_645f3bbab8484e899c48f82223cf95e6-10"&gt;&lt;/a&gt;&lt;span class="hll"&gt;bNumEndpoints: 3
&lt;/span&gt;&lt;a id="rest_code_645f3bbab8484e899c48f82223cf95e6-11" name="rest_code_645f3bbab8484e899c48f82223cf95e6-11" href="https://blog.apdu.fr/posts/2025/04/card-state-synchronisation-on-sec1210-reader-2-interfaces/#rest_code_645f3bbab8484e899c48f82223cf95e6-11"&gt;&lt;/a&gt;&lt;span class="hll"&gt; bulk-IN, bulk-OUT and Interrupt-IN
&lt;/span&gt;&lt;a id="rest_code_645f3bbab8484e899c48f82223cf95e6-12" name="rest_code_645f3bbab8484e899c48f82223cf95e6-12" href="https://blog.apdu.fr/posts/2025/04/card-state-synchronisation-on-sec1210-reader-2-interfaces/#rest_code_645f3bbab8484e899c48f82223cf95e6-12"&gt;&lt;/a&gt;bInterfaceClass: 0x0B [Chip Card Interface Device Class (CCID)]
&lt;a id="rest_code_645f3bbab8484e899c48f82223cf95e6-13" name="rest_code_645f3bbab8484e899c48f82223cf95e6-13" href="https://blog.apdu.fr/posts/2025/04/card-state-synchronisation-on-sec1210-reader-2-interfaces/#rest_code_645f3bbab8484e899c48f82223cf95e6-13"&gt;&lt;/a&gt;[...]
&lt;a id="rest_code_645f3bbab8484e899c48f82223cf95e6-14" name="rest_code_645f3bbab8484e899c48f82223cf95e6-14" href="https://blog.apdu.fr/posts/2025/04/card-state-synchronisation-on-sec1210-reader-2-interfaces/#rest_code_645f3bbab8484e899c48f82223cf95e6-14"&gt;&lt;/a&gt;
&lt;a id="rest_code_645f3bbab8484e899c48f82223cf95e6-15" name="rest_code_645f3bbab8484e899c48f82223cf95e6-15" href="https://blog.apdu.fr/posts/2025/04/card-state-synchronisation-on-sec1210-reader-2-interfaces/#rest_code_645f3bbab8484e899c48f82223cf95e6-15"&gt;&lt;/a&gt;idVendor: 0x0424
&lt;a id="rest_code_645f3bbab8484e899c48f82223cf95e6-16" name="rest_code_645f3bbab8484e899c48f82223cf95e6-16" href="https://blog.apdu.fr/posts/2025/04/card-state-synchronisation-on-sec1210-reader-2-interfaces/#rest_code_645f3bbab8484e899c48f82223cf95e6-16"&gt;&lt;/a&gt; iManufacturer: SMSC
&lt;a id="rest_code_645f3bbab8484e899c48f82223cf95e6-17" name="rest_code_645f3bbab8484e899c48f82223cf95e6-17" href="https://blog.apdu.fr/posts/2025/04/card-state-synchronisation-on-sec1210-reader-2-interfaces/#rest_code_645f3bbab8484e899c48f82223cf95e6-17"&gt;&lt;/a&gt;idProduct: 0x1202
&lt;a id="rest_code_645f3bbab8484e899c48f82223cf95e6-18" name="rest_code_645f3bbab8484e899c48f82223cf95e6-18" href="https://blog.apdu.fr/posts/2025/04/card-state-synchronisation-on-sec1210-reader-2-interfaces/#rest_code_645f3bbab8484e899c48f82223cf95e6-18"&gt;&lt;/a&gt; iProduct: SMSC USX101x Reader
&lt;a id="rest_code_645f3bbab8484e899c48f82223cf95e6-19" name="rest_code_645f3bbab8484e899c48f82223cf95e6-19" href="https://blog.apdu.fr/posts/2025/04/card-state-synchronisation-on-sec1210-reader-2-interfaces/#rest_code_645f3bbab8484e899c48f82223cf95e6-19"&gt;&lt;/a&gt;bcdDevice: 2.22 (firmware release?)
&lt;a id="rest_code_645f3bbab8484e899c48f82223cf95e6-20" name="rest_code_645f3bbab8484e899c48f82223cf95e6-20" href="https://blog.apdu.fr/posts/2025/04/card-state-synchronisation-on-sec1210-reader-2-interfaces/#rest_code_645f3bbab8484e899c48f82223cf95e6-20"&gt;&lt;/a&gt;bLength: 9
&lt;a id="rest_code_645f3bbab8484e899c48f82223cf95e6-21" name="rest_code_645f3bbab8484e899c48f82223cf95e6-21" href="https://blog.apdu.fr/posts/2025/04/card-state-synchronisation-on-sec1210-reader-2-interfaces/#rest_code_645f3bbab8484e899c48f82223cf95e6-21"&gt;&lt;/a&gt;bDescriptorType: 4
&lt;a id="rest_code_645f3bbab8484e899c48f82223cf95e6-22" name="rest_code_645f3bbab8484e899c48f82223cf95e6-22" href="https://blog.apdu.fr/posts/2025/04/card-state-synchronisation-on-sec1210-reader-2-interfaces/#rest_code_645f3bbab8484e899c48f82223cf95e6-22"&gt;&lt;/a&gt;&lt;span class="hll"&gt;bInterfaceNumber: 1
&lt;/span&gt;&lt;a id="rest_code_645f3bbab8484e899c48f82223cf95e6-23" name="rest_code_645f3bbab8484e899c48f82223cf95e6-23" href="https://blog.apdu.fr/posts/2025/04/card-state-synchronisation-on-sec1210-reader-2-interfaces/#rest_code_645f3bbab8484e899c48f82223cf95e6-23"&gt;&lt;/a&gt;bAlternateSetting: 0
&lt;a id="rest_code_645f3bbab8484e899c48f82223cf95e6-24" name="rest_code_645f3bbab8484e899c48f82223cf95e6-24" href="https://blog.apdu.fr/posts/2025/04/card-state-synchronisation-on-sec1210-reader-2-interfaces/#rest_code_645f3bbab8484e899c48f82223cf95e6-24"&gt;&lt;/a&gt;&lt;span class="hll"&gt;bNumEndpoints: 2
&lt;/span&gt;&lt;a id="rest_code_645f3bbab8484e899c48f82223cf95e6-25" name="rest_code_645f3bbab8484e899c48f82223cf95e6-25" href="https://blog.apdu.fr/posts/2025/04/card-state-synchronisation-on-sec1210-reader-2-interfaces/#rest_code_645f3bbab8484e899c48f82223cf95e6-25"&gt;&lt;/a&gt;&lt;span class="hll"&gt; bulk-IN and bulk-OUT
&lt;/span&gt;&lt;a id="rest_code_645f3bbab8484e899c48f82223cf95e6-26" name="rest_code_645f3bbab8484e899c48f82223cf95e6-26" href="https://blog.apdu.fr/posts/2025/04/card-state-synchronisation-on-sec1210-reader-2-interfaces/#rest_code_645f3bbab8484e899c48f82223cf95e6-26"&gt;&lt;/a&gt;bInterfaceClass: 0x0B [Chip Card Interface Device Class (CCID)]
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The 2 interfaces have the same descriptor, except for:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;bInterfaceNumber: 0 or 1&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;bNumEndpoints: 2 or 3&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;One interface provides the Interrupt-IN endpoint while the other
interface does not. This means one interface will provide card movements
notification on the interrupt pipe while the other interface will not.&lt;/p&gt;
&lt;p&gt;In fact the 2nd interface does not support
&lt;code class="docutils literal"&gt;RDR_to_PC_NotifySlotChange&lt;/code&gt; but also does not support card presence
using the CCID command &lt;code class="docutils literal"&gt;PC_to_RDR_GetSlotStatus&lt;/code&gt;. The reader will
always report a card is inserted even if no card is inserted.&lt;/p&gt;
&lt;p&gt;This second interface is, in general, used with a SAM (&lt;a class="reference external" href="https://en.wikipedia.org/wiki/Secure_access_module"&gt;Secure access
module&lt;/a&gt;) that is
rarely removed from the reader.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="new-use-case"&gt;
&lt;h2&gt;New use case&lt;/h2&gt;
&lt;p&gt;A user of this reader asked me to add the option of duplicating the
card presence status of the 1st interface on the 2nd interface. The idea
is to be able to insert or remove 2 cards from both interfaces at the
same time.&lt;/p&gt;
&lt;p&gt;The 2nd interface can then be used as a &lt;cite&gt;almost normal&lt;/cite&gt; reader.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="custom-code"&gt;
&lt;h2&gt;Custom code&lt;/h2&gt;
&lt;p&gt;The patch is visible at &lt;a class="reference external" href="https://salsa.debian.org/rousseau/CCID/-/commit/4842c97561794acb7269dfcba21c877d42895a4e"&gt;https://salsa.debian.org/rousseau/CCID/-/commit/4842c97561794acb7269dfcba21c877d42895a4e&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The code is not active by default. You need to uncomment a line and
rebuild the driver:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code text"&gt;&lt;a id="rest_code_979c49ecdc6848048e65223d85981fbc-1" name="rest_code_979c49ecdc6848048e65223d85981fbc-1" href="https://blog.apdu.fr/posts/2025/04/card-state-synchronisation-on-sec1210-reader-2-interfaces/#rest_code_979c49ecdc6848048e65223d85981fbc-1"&gt;&lt;/a&gt;// Uncomment if you want to synchronize the card movements on the 2
&lt;a id="rest_code_979c49ecdc6848048e65223d85981fbc-2" name="rest_code_979c49ecdc6848048e65223d85981fbc-2" href="https://blog.apdu.fr/posts/2025/04/card-state-synchronisation-on-sec1210-reader-2-interfaces/#rest_code_979c49ecdc6848048e65223d85981fbc-2"&gt;&lt;/a&gt;// interfaces of the Microchip SEC 1210 reader
&lt;a id="rest_code_979c49ecdc6848048e65223d85981fbc-3" name="rest_code_979c49ecdc6848048e65223d85981fbc-3" href="https://blog.apdu.fr/posts/2025/04/card-state-synchronisation-on-sec1210-reader-2-interfaces/#rest_code_979c49ecdc6848048e65223d85981fbc-3"&gt;&lt;/a&gt;&lt;span class="hll"&gt;// #define SEC1210_SYNC
&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The code is a bit complex, as each interface is managed by a different
pcsc-lite thread. The 2 threads are synchronized with a &lt;code class="docutils literal"&gt;pthread_cond&lt;/code&gt;
and share some states.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="conclusion"&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;The 2 interfaces of the Microchip SEC1210 smart card reader can be used
mostly as normal interfaces. The (industrial) user is happy.&lt;/p&gt;
&lt;p&gt;If you need custom development of the CCID driver and/or pcsc-lite,
please don't hesitate to contact me. See &lt;a class="reference external" href="https://blog.apdu.fr/articles/about_me/"&gt;About me&lt;/a&gt;.&lt;/p&gt;
&lt;/section&gt;</description><category>ccid</category><guid>https://blog.apdu.fr/posts/2025/04/card-state-synchronisation-on-sec1210-reader-2-interfaces/</guid><pubDate>Sun, 04 May 2025 11:07:00 GMT</pubDate></item><item><title>New version of libccid: 1.6.2</title><link>https://blog.apdu.fr/posts/2025/03/new-version-of-libccid-162/</link><dc:creator>Ludovic Rousseau</dc:creator><description>&lt;p&gt;I just released &lt;a class="reference external" href="https://ccid.apdu.fr/files/"&gt;version 1.6.2&lt;/a&gt; of
&lt;a class="reference external" href="https://ccid.apdu.fr/"&gt;libccid&lt;/a&gt; the Free Software CCID class smart
card reader driver.&lt;/p&gt;
&lt;section id="changes"&gt;
&lt;h2&gt;Changes:&lt;/h2&gt;
&lt;p&gt;1.6.2 - 19 March 2025, Ludovic Rousseau&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Add support of&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Arculus AuthentiKey&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;BHDC Reader-HHD02&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;CHERRY Smart Terminal 1150&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;HSIC CCID-Reader&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Ledger Flex&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;SYC USB CCID Reader&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Thales RF CR2000&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;TOKEN2 FIDO2 Security Key(0026)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Give more time to initialize the ACS ACR122U&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Do not build examples and contrib by default&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;meson: add missing check for &lt;code class="docutils literal"&gt;pthread_condattr_setclock&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Don't assume that all notifications are NotifySlotChange&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Hide unexported functions and variables&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Some other minor improvements&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;</description><category>ccid</category><guid>https://blog.apdu.fr/posts/2025/03/new-version-of-libccid-162/</guid><pubDate>Wed, 19 Mar 2025 16:45:24 GMT</pubDate></item><item><title>New version of libccid: 1.6.1</title><link>https://blog.apdu.fr/posts/2024/07/new-version-of-libccid-161/</link><dc:creator>Ludovic Rousseau</dc:creator><description>&lt;p&gt;I just released &lt;a class="reference external" href="https://ccid.apdu.fr/files/"&gt;version 1.6.1&lt;/a&gt; of
&lt;a class="reference external" href="https://ccid.apdu.fr/"&gt;libccid&lt;/a&gt; the Free Software CCID class smart
card reader driver.&lt;/p&gt;
&lt;section id="changes"&gt;
&lt;h2&gt;Changes:&lt;/h2&gt;
&lt;p&gt;1.6.1 - 5 July 2024, Ludovic Rousseau&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;fix 'parse' build issues on some systems (pthread &amp;amp; strlcpy)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Some other minor improvements&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;</description><category>ccid</category><guid>https://blog.apdu.fr/posts/2024/07/new-version-of-libccid-161/</guid><pubDate>Fri, 05 Jul 2024 09:08:42 GMT</pubDate></item><item><title>CCID driver and Multiple Enabled Profiles (MEP)</title><link>https://blog.apdu.fr/posts/2024/06/ccid-driver-and-multiple-enabled-profiles-mep/</link><dc:creator>Ludovic Rousseau</dc:creator><description>&lt;p&gt;Some smartphones can handle 2 SIM cards.
The smartphones now use eSIM (embedded SIM) instead of rSIM (removable
SIM). It is still useful to have 2 subscriber configurations so the same
eSIM should support two (or more) USIM applications.&lt;/p&gt;
&lt;section id="specification"&gt;
&lt;h2&gt;Specification&lt;/h2&gt;
&lt;p&gt;From:&lt;/p&gt;
&lt;pre class="literal-block"&gt;RSP Technical Specification
Version 3.0
19th October 2022
https://www.gsma.com/esim/resources/sgp-22-v3-0/&lt;/pre&gt;
&lt;p&gt;Chapter &lt;strong&gt;2.12 Multiple Enabled Profiles&lt;/strong&gt;, page 77:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;This specification defines optional support of Multiple Enabled
(MEP), where several Profiles can be in Enabled state. This enables a
Device with more than one baseband to use more than one Profile at the
same time for providing connectivity to different networks.&lt;/p&gt;
&lt;p&gt;The multiplexing of the APDU streams to those Profiles on a single
physical interface is specified in ETSI TS 102 221 (Smart Cards;
UICC-Terminal interface; Release 17). This specification uses the term
"eSIM Port" for what ETSI TS 102 221 calls a logical SE interface (LSI).&lt;/p&gt;
&lt;p&gt;[...]&lt;/p&gt;
&lt;p&gt;Several options for different features are defined for MEP:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;APDU multiplexing can use any of the mechanisms defined in ETSI TS
102 221 [6], e.g.:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;eSIM Port selection via the APDU MANAGE LSI (select LSI) when
the transmission protocol T=0 or T=1 is used.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;eSIM Port selection via the NAD byte when the transmission
protocol T=1 is used.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;/section&gt;
&lt;section id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;p&gt;Reda ZAITI, from Thales, implemented the second mechanism: eSIM Port
selection via the NAD byte. The original patch is simple: &lt;a class="reference external" href="https://salsa.debian.org/rousseau/CCID/-/commit/23649297b11224fd2c012eb4f3930aa65cc50e04"&gt;Add
possibility to set/get NAD on T=1 for MEP&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This feature can be used to test eSIM chips using a standard smart card
reader.  The CCID driver must manage the T=1 protocol so only &lt;a class="reference external" href="https://ccid.apdu.fr/select_readers/?dwFeatures=12"&gt;TPDU
readers&lt;/a&gt; can be
used.&lt;/p&gt;
&lt;p&gt;The PC/SC workgroup does not define anything regarding MEP. So it was
implemented using &lt;code class="docutils literal"&gt;SCardControl()&lt;/code&gt; and the control code &lt;code class="docutils literal"&gt;SCARD_CTL_CODE(3600)&lt;/code&gt;.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="sample-code"&gt;
&lt;h2&gt;Sample code&lt;/h2&gt;
&lt;p&gt;A sample code &lt;a class="reference external" href="https://salsa.debian.org/rousseau/CCID/-/blob/master/examples/GetSetNAD.py?ref_type=heads"&gt;GetSetNAD.py&lt;/a&gt;
is provided:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code python"&gt;&lt;a id="rest_code_00b0727d493d4e98b2395dbed59285e5-1" name="rest_code_00b0727d493d4e98b2395dbed59285e5-1" href="https://blog.apdu.fr/posts/2024/06/ccid-driver-and-multiple-enabled-profiles-mep/#rest_code_00b0727d493d4e98b2395dbed59285e5-1"&gt;&lt;/a&gt;&lt;span class="ch"&gt;#! /usr/bin/env python3&lt;/span&gt;
&lt;a id="rest_code_00b0727d493d4e98b2395dbed59285e5-2" name="rest_code_00b0727d493d4e98b2395dbed59285e5-2" href="https://blog.apdu.fr/posts/2024/06/ccid-driver-and-multiple-enabled-profiles-mep/#rest_code_00b0727d493d4e98b2395dbed59285e5-2"&gt;&lt;/a&gt;
&lt;a id="rest_code_00b0727d493d4e98b2395dbed59285e5-3" name="rest_code_00b0727d493d4e98b2395dbed59285e5-3" href="https://blog.apdu.fr/posts/2024/06/ccid-driver-and-multiple-enabled-profiles-mep/#rest_code_00b0727d493d4e98b2395dbed59285e5-3"&gt;&lt;/a&gt;&lt;span class="sd"&gt;"""&lt;/span&gt;
&lt;a id="rest_code_00b0727d493d4e98b2395dbed59285e5-4" name="rest_code_00b0727d493d4e98b2395dbed59285e5-4" href="https://blog.apdu.fr/posts/2024/06/ccid-driver-and-multiple-enabled-profiles-mep/#rest_code_00b0727d493d4e98b2395dbed59285e5-4"&gt;&lt;/a&gt;&lt;span class="sd"&gt;#   GetSetNAD.py: get/set NAD value&lt;/span&gt;
&lt;a id="rest_code_00b0727d493d4e98b2395dbed59285e5-5" name="rest_code_00b0727d493d4e98b2395dbed59285e5-5" href="https://blog.apdu.fr/posts/2024/06/ccid-driver-and-multiple-enabled-profiles-mep/#rest_code_00b0727d493d4e98b2395dbed59285e5-5"&gt;&lt;/a&gt;&lt;span class="sd"&gt;#   Copyright (C) 2022  Ludovic Rousseau&lt;/span&gt;
&lt;a id="rest_code_00b0727d493d4e98b2395dbed59285e5-6" name="rest_code_00b0727d493d4e98b2395dbed59285e5-6" href="https://blog.apdu.fr/posts/2024/06/ccid-driver-and-multiple-enabled-profiles-mep/#rest_code_00b0727d493d4e98b2395dbed59285e5-6"&gt;&lt;/a&gt;&lt;span class="sd"&gt;"""&lt;/span&gt;
&lt;a id="rest_code_00b0727d493d4e98b2395dbed59285e5-7" name="rest_code_00b0727d493d4e98b2395dbed59285e5-7" href="https://blog.apdu.fr/posts/2024/06/ccid-driver-and-multiple-enabled-profiles-mep/#rest_code_00b0727d493d4e98b2395dbed59285e5-7"&gt;&lt;/a&gt;
&lt;a id="rest_code_00b0727d493d4e98b2395dbed59285e5-8" name="rest_code_00b0727d493d4e98b2395dbed59285e5-8" href="https://blog.apdu.fr/posts/2024/06/ccid-driver-and-multiple-enabled-profiles-mep/#rest_code_00b0727d493d4e98b2395dbed59285e5-8"&gt;&lt;/a&gt;&lt;span class="c1"&gt;#   This program is free software; you can redistribute it and/or modify&lt;/span&gt;
&lt;a id="rest_code_00b0727d493d4e98b2395dbed59285e5-9" name="rest_code_00b0727d493d4e98b2395dbed59285e5-9" href="https://blog.apdu.fr/posts/2024/06/ccid-driver-and-multiple-enabled-profiles-mep/#rest_code_00b0727d493d4e98b2395dbed59285e5-9"&gt;&lt;/a&gt;&lt;span class="c1"&gt;#   it under the terms of the GNU General Public License as published by&lt;/span&gt;
&lt;a id="rest_code_00b0727d493d4e98b2395dbed59285e5-10" name="rest_code_00b0727d493d4e98b2395dbed59285e5-10" href="https://blog.apdu.fr/posts/2024/06/ccid-driver-and-multiple-enabled-profiles-mep/#rest_code_00b0727d493d4e98b2395dbed59285e5-10"&gt;&lt;/a&gt;&lt;span class="c1"&gt;#   the Free Software Foundation; either version 3 of the License, or&lt;/span&gt;
&lt;a id="rest_code_00b0727d493d4e98b2395dbed59285e5-11" name="rest_code_00b0727d493d4e98b2395dbed59285e5-11" href="https://blog.apdu.fr/posts/2024/06/ccid-driver-and-multiple-enabled-profiles-mep/#rest_code_00b0727d493d4e98b2395dbed59285e5-11"&gt;&lt;/a&gt;&lt;span class="c1"&gt;#   (at your option) any later version.&lt;/span&gt;
&lt;a id="rest_code_00b0727d493d4e98b2395dbed59285e5-12" name="rest_code_00b0727d493d4e98b2395dbed59285e5-12" href="https://blog.apdu.fr/posts/2024/06/ccid-driver-and-multiple-enabled-profiles-mep/#rest_code_00b0727d493d4e98b2395dbed59285e5-12"&gt;&lt;/a&gt;&lt;span class="c1"&gt;#&lt;/span&gt;
&lt;a id="rest_code_00b0727d493d4e98b2395dbed59285e5-13" name="rest_code_00b0727d493d4e98b2395dbed59285e5-13" href="https://blog.apdu.fr/posts/2024/06/ccid-driver-and-multiple-enabled-profiles-mep/#rest_code_00b0727d493d4e98b2395dbed59285e5-13"&gt;&lt;/a&gt;&lt;span class="c1"&gt;#   This program is distributed in the hope that it will be useful,&lt;/span&gt;
&lt;a id="rest_code_00b0727d493d4e98b2395dbed59285e5-14" name="rest_code_00b0727d493d4e98b2395dbed59285e5-14" href="https://blog.apdu.fr/posts/2024/06/ccid-driver-and-multiple-enabled-profiles-mep/#rest_code_00b0727d493d4e98b2395dbed59285e5-14"&gt;&lt;/a&gt;&lt;span class="c1"&gt;#   but WITHOUT ANY WARRANTY; without even the implied warranty of&lt;/span&gt;
&lt;a id="rest_code_00b0727d493d4e98b2395dbed59285e5-15" name="rest_code_00b0727d493d4e98b2395dbed59285e5-15" href="https://blog.apdu.fr/posts/2024/06/ccid-driver-and-multiple-enabled-profiles-mep/#rest_code_00b0727d493d4e98b2395dbed59285e5-15"&gt;&lt;/a&gt;&lt;span class="c1"&gt;#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the&lt;/span&gt;
&lt;a id="rest_code_00b0727d493d4e98b2395dbed59285e5-16" name="rest_code_00b0727d493d4e98b2395dbed59285e5-16" href="https://blog.apdu.fr/posts/2024/06/ccid-driver-and-multiple-enabled-profiles-mep/#rest_code_00b0727d493d4e98b2395dbed59285e5-16"&gt;&lt;/a&gt;&lt;span class="c1"&gt;#   GNU General Public License for more details.&lt;/span&gt;
&lt;a id="rest_code_00b0727d493d4e98b2395dbed59285e5-17" name="rest_code_00b0727d493d4e98b2395dbed59285e5-17" href="https://blog.apdu.fr/posts/2024/06/ccid-driver-and-multiple-enabled-profiles-mep/#rest_code_00b0727d493d4e98b2395dbed59285e5-17"&gt;&lt;/a&gt;&lt;span class="c1"&gt;#&lt;/span&gt;
&lt;a id="rest_code_00b0727d493d4e98b2395dbed59285e5-18" name="rest_code_00b0727d493d4e98b2395dbed59285e5-18" href="https://blog.apdu.fr/posts/2024/06/ccid-driver-and-multiple-enabled-profiles-mep/#rest_code_00b0727d493d4e98b2395dbed59285e5-18"&gt;&lt;/a&gt;&lt;span class="c1"&gt;#   You should have received a copy of the GNU General Public License along&lt;/span&gt;
&lt;a id="rest_code_00b0727d493d4e98b2395dbed59285e5-19" name="rest_code_00b0727d493d4e98b2395dbed59285e5-19" href="https://blog.apdu.fr/posts/2024/06/ccid-driver-and-multiple-enabled-profiles-mep/#rest_code_00b0727d493d4e98b2395dbed59285e5-19"&gt;&lt;/a&gt;&lt;span class="c1"&gt;#   with this program; if not, see &amp;lt;http://www.gnu.org/licenses/&amp;gt;.&lt;/span&gt;
&lt;a id="rest_code_00b0727d493d4e98b2395dbed59285e5-20" name="rest_code_00b0727d493d4e98b2395dbed59285e5-20" href="https://blog.apdu.fr/posts/2024/06/ccid-driver-and-multiple-enabled-profiles-mep/#rest_code_00b0727d493d4e98b2395dbed59285e5-20"&gt;&lt;/a&gt;
&lt;a id="rest_code_00b0727d493d4e98b2395dbed59285e5-21" name="rest_code_00b0727d493d4e98b2395dbed59285e5-21" href="https://blog.apdu.fr/posts/2024/06/ccid-driver-and-multiple-enabled-profiles-mep/#rest_code_00b0727d493d4e98b2395dbed59285e5-21"&gt;&lt;/a&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;smartcard.System&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;readers&lt;/span&gt;
&lt;a id="rest_code_00b0727d493d4e98b2395dbed59285e5-22" name="rest_code_00b0727d493d4e98b2395dbed59285e5-22" href="https://blog.apdu.fr/posts/2024/06/ccid-driver-and-multiple-enabled-profiles-mep/#rest_code_00b0727d493d4e98b2395dbed59285e5-22"&gt;&lt;/a&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;smartcard.pcsc.PCSCPart10&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;SCARD_LEAVE_CARD&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;SCARD_CTL_CODE&lt;/span&gt;
&lt;a id="rest_code_00b0727d493d4e98b2395dbed59285e5-23" name="rest_code_00b0727d493d4e98b2395dbed59285e5-23" href="https://blog.apdu.fr/posts/2024/06/ccid-driver-and-multiple-enabled-profiles-mep/#rest_code_00b0727d493d4e98b2395dbed59285e5-23"&gt;&lt;/a&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;smartcard&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Exceptions&lt;/span&gt;
&lt;a id="rest_code_00b0727d493d4e98b2395dbed59285e5-24" name="rest_code_00b0727d493d4e98b2395dbed59285e5-24" href="https://blog.apdu.fr/posts/2024/06/ccid-driver-and-multiple-enabled-profiles-mep/#rest_code_00b0727d493d4e98b2395dbed59285e5-24"&gt;&lt;/a&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;smartcard.util&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;toHexString&lt;/span&gt;
&lt;a id="rest_code_00b0727d493d4e98b2395dbed59285e5-25" name="rest_code_00b0727d493d4e98b2395dbed59285e5-25" href="https://blog.apdu.fr/posts/2024/06/ccid-driver-and-multiple-enabled-profiles-mep/#rest_code_00b0727d493d4e98b2395dbed59285e5-25"&gt;&lt;/a&gt;
&lt;a id="rest_code_00b0727d493d4e98b2395dbed59285e5-26" name="rest_code_00b0727d493d4e98b2395dbed59285e5-26" href="https://blog.apdu.fr/posts/2024/06/ccid-driver-and-multiple-enabled-profiles-mep/#rest_code_00b0727d493d4e98b2395dbed59285e5-26"&gt;&lt;/a&gt;
&lt;a id="rest_code_00b0727d493d4e98b2395dbed59285e5-27" name="rest_code_00b0727d493d4e98b2395dbed59285e5-27" href="https://blog.apdu.fr/posts/2024/06/ccid-driver-and-multiple-enabled-profiles-mep/#rest_code_00b0727d493d4e98b2395dbed59285e5-27"&gt;&lt;/a&gt;&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;get_nad&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cardConnection&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;a id="rest_code_00b0727d493d4e98b2395dbed59285e5-28" name="rest_code_00b0727d493d4e98b2395dbed59285e5-28" href="https://blog.apdu.fr/posts/2024/06/ccid-driver-and-multiple-enabled-profiles-mep/#rest_code_00b0727d493d4e98b2395dbed59285e5-28"&gt;&lt;/a&gt;    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Get NAD"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a id="rest_code_00b0727d493d4e98b2395dbed59285e5-29" name="rest_code_00b0727d493d4e98b2395dbed59285e5-29" href="https://blog.apdu.fr/posts/2024/06/ccid-driver-and-multiple-enabled-profiles-mep/#rest_code_00b0727d493d4e98b2395dbed59285e5-29"&gt;&lt;/a&gt;
&lt;a id="rest_code_00b0727d493d4e98b2395dbed59285e5-30" name="rest_code_00b0727d493d4e98b2395dbed59285e5-30" href="https://blog.apdu.fr/posts/2024/06/ccid-driver-and-multiple-enabled-profiles-mep/#rest_code_00b0727d493d4e98b2395dbed59285e5-30"&gt;&lt;/a&gt;    &lt;span class="n"&gt;get_NAD&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mh"&gt;0x3F&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;a id="rest_code_00b0727d493d4e98b2395dbed59285e5-31" name="rest_code_00b0727d493d4e98b2395dbed59285e5-31" href="https://blog.apdu.fr/posts/2024/06/ccid-driver-and-multiple-enabled-profiles-mep/#rest_code_00b0727d493d4e98b2395dbed59285e5-31"&gt;&lt;/a&gt;    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;" command:"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;toHexString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;get_NAD&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;a id="rest_code_00b0727d493d4e98b2395dbed59285e5-32" name="rest_code_00b0727d493d4e98b2395dbed59285e5-32" href="https://blog.apdu.fr/posts/2024/06/ccid-driver-and-multiple-enabled-profiles-mep/#rest_code_00b0727d493d4e98b2395dbed59285e5-32"&gt;&lt;/a&gt;    &lt;span class="n"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cardConnection&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;control&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;SCARD_CTL_CODE&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3600&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;get_NAD&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a id="rest_code_00b0727d493d4e98b2395dbed59285e5-33" name="rest_code_00b0727d493d4e98b2395dbed59285e5-33" href="https://blog.apdu.fr/posts/2024/06/ccid-driver-and-multiple-enabled-profiles-mep/#rest_code_00b0727d493d4e98b2395dbed59285e5-33"&gt;&lt;/a&gt;    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"  result:"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;toHexString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;res&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;a id="rest_code_00b0727d493d4e98b2395dbed59285e5-34" name="rest_code_00b0727d493d4e98b2395dbed59285e5-34" href="https://blog.apdu.fr/posts/2024/06/ccid-driver-and-multiple-enabled-profiles-mep/#rest_code_00b0727d493d4e98b2395dbed59285e5-34"&gt;&lt;/a&gt;    &lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;res&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;a id="rest_code_00b0727d493d4e98b2395dbed59285e5-35" name="rest_code_00b0727d493d4e98b2395dbed59285e5-35" href="https://blog.apdu.fr/posts/2024/06/ccid-driver-and-multiple-enabled-profiles-mep/#rest_code_00b0727d493d4e98b2395dbed59285e5-35"&gt;&lt;/a&gt;    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;a id="rest_code_00b0727d493d4e98b2395dbed59285e5-36" name="rest_code_00b0727d493d4e98b2395dbed59285e5-36" href="https://blog.apdu.fr/posts/2024/06/ccid-driver-and-multiple-enabled-profiles-mep/#rest_code_00b0727d493d4e98b2395dbed59285e5-36"&gt;&lt;/a&gt;        &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Success"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a id="rest_code_00b0727d493d4e98b2395dbed59285e5-37" name="rest_code_00b0727d493d4e98b2395dbed59285e5-37" href="https://blog.apdu.fr/posts/2024/06/ccid-driver-and-multiple-enabled-profiles-mep/#rest_code_00b0727d493d4e98b2395dbed59285e5-37"&gt;&lt;/a&gt;        &lt;span class="n"&gt;nad&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;res&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;a id="rest_code_00b0727d493d4e98b2395dbed59285e5-38" name="rest_code_00b0727d493d4e98b2395dbed59285e5-38" href="https://blog.apdu.fr/posts/2024/06/ccid-driver-and-multiple-enabled-profiles-mep/#rest_code_00b0727d493d4e98b2395dbed59285e5-38"&gt;&lt;/a&gt;        &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"NAD:"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;nad&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a id="rest_code_00b0727d493d4e98b2395dbed59285e5-39" name="rest_code_00b0727d493d4e98b2395dbed59285e5-39" href="https://blog.apdu.fr/posts/2024/06/ccid-driver-and-multiple-enabled-profiles-mep/#rest_code_00b0727d493d4e98b2395dbed59285e5-39"&gt;&lt;/a&gt;    &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;a id="rest_code_00b0727d493d4e98b2395dbed59285e5-40" name="rest_code_00b0727d493d4e98b2395dbed59285e5-40" href="https://blog.apdu.fr/posts/2024/06/ccid-driver-and-multiple-enabled-profiles-mep/#rest_code_00b0727d493d4e98b2395dbed59285e5-40"&gt;&lt;/a&gt;        &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Failed!"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a id="rest_code_00b0727d493d4e98b2395dbed59285e5-41" name="rest_code_00b0727d493d4e98b2395dbed59285e5-41" href="https://blog.apdu.fr/posts/2024/06/ccid-driver-and-multiple-enabled-profiles-mep/#rest_code_00b0727d493d4e98b2395dbed59285e5-41"&gt;&lt;/a&gt;
&lt;a id="rest_code_00b0727d493d4e98b2395dbed59285e5-42" name="rest_code_00b0727d493d4e98b2395dbed59285e5-42" href="https://blog.apdu.fr/posts/2024/06/ccid-driver-and-multiple-enabled-profiles-mep/#rest_code_00b0727d493d4e98b2395dbed59285e5-42"&gt;&lt;/a&gt;
&lt;a id="rest_code_00b0727d493d4e98b2395dbed59285e5-43" name="rest_code_00b0727d493d4e98b2395dbed59285e5-43" href="https://blog.apdu.fr/posts/2024/06/ccid-driver-and-multiple-enabled-profiles-mep/#rest_code_00b0727d493d4e98b2395dbed59285e5-43"&gt;&lt;/a&gt;&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;set_nad&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cardConnection&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;nad&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;a id="rest_code_00b0727d493d4e98b2395dbed59285e5-44" name="rest_code_00b0727d493d4e98b2395dbed59285e5-44" href="https://blog.apdu.fr/posts/2024/06/ccid-driver-and-multiple-enabled-profiles-mep/#rest_code_00b0727d493d4e98b2395dbed59285e5-44"&gt;&lt;/a&gt;    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Set NAD"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a id="rest_code_00b0727d493d4e98b2395dbed59285e5-45" name="rest_code_00b0727d493d4e98b2395dbed59285e5-45" href="https://blog.apdu.fr/posts/2024/06/ccid-driver-and-multiple-enabled-profiles-mep/#rest_code_00b0727d493d4e98b2395dbed59285e5-45"&gt;&lt;/a&gt;
&lt;a id="rest_code_00b0727d493d4e98b2395dbed59285e5-46" name="rest_code_00b0727d493d4e98b2395dbed59285e5-46" href="https://blog.apdu.fr/posts/2024/06/ccid-driver-and-multiple-enabled-profiles-mep/#rest_code_00b0727d493d4e98b2395dbed59285e5-46"&gt;&lt;/a&gt;    &lt;span class="n"&gt;set_NAD&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mh"&gt;0x3E&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;nad&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;a id="rest_code_00b0727d493d4e98b2395dbed59285e5-47" name="rest_code_00b0727d493d4e98b2395dbed59285e5-47" href="https://blog.apdu.fr/posts/2024/06/ccid-driver-and-multiple-enabled-profiles-mep/#rest_code_00b0727d493d4e98b2395dbed59285e5-47"&gt;&lt;/a&gt;    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;" command:"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;toHexString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;set_NAD&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;a id="rest_code_00b0727d493d4e98b2395dbed59285e5-48" name="rest_code_00b0727d493d4e98b2395dbed59285e5-48" href="https://blog.apdu.fr/posts/2024/06/ccid-driver-and-multiple-enabled-profiles-mep/#rest_code_00b0727d493d4e98b2395dbed59285e5-48"&gt;&lt;/a&gt;    &lt;span class="n"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cardConnection&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;control&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;SCARD_CTL_CODE&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3600&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;set_NAD&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a id="rest_code_00b0727d493d4e98b2395dbed59285e5-49" name="rest_code_00b0727d493d4e98b2395dbed59285e5-49" href="https://blog.apdu.fr/posts/2024/06/ccid-driver-and-multiple-enabled-profiles-mep/#rest_code_00b0727d493d4e98b2395dbed59285e5-49"&gt;&lt;/a&gt;    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"  result:"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;toHexString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;res&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;a id="rest_code_00b0727d493d4e98b2395dbed59285e5-50" name="rest_code_00b0727d493d4e98b2395dbed59285e5-50" href="https://blog.apdu.fr/posts/2024/06/ccid-driver-and-multiple-enabled-profiles-mep/#rest_code_00b0727d493d4e98b2395dbed59285e5-50"&gt;&lt;/a&gt;    &lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;res&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;a id="rest_code_00b0727d493d4e98b2395dbed59285e5-51" name="rest_code_00b0727d493d4e98b2395dbed59285e5-51" href="https://blog.apdu.fr/posts/2024/06/ccid-driver-and-multiple-enabled-profiles-mep/#rest_code_00b0727d493d4e98b2395dbed59285e5-51"&gt;&lt;/a&gt;    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;a id="rest_code_00b0727d493d4e98b2395dbed59285e5-52" name="rest_code_00b0727d493d4e98b2395dbed59285e5-52" href="https://blog.apdu.fr/posts/2024/06/ccid-driver-and-multiple-enabled-profiles-mep/#rest_code_00b0727d493d4e98b2395dbed59285e5-52"&gt;&lt;/a&gt;        &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Success"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a id="rest_code_00b0727d493d4e98b2395dbed59285e5-53" name="rest_code_00b0727d493d4e98b2395dbed59285e5-53" href="https://blog.apdu.fr/posts/2024/06/ccid-driver-and-multiple-enabled-profiles-mep/#rest_code_00b0727d493d4e98b2395dbed59285e5-53"&gt;&lt;/a&gt;    &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;a id="rest_code_00b0727d493d4e98b2395dbed59285e5-54" name="rest_code_00b0727d493d4e98b2395dbed59285e5-54" href="https://blog.apdu.fr/posts/2024/06/ccid-driver-and-multiple-enabled-profiles-mep/#rest_code_00b0727d493d4e98b2395dbed59285e5-54"&gt;&lt;/a&gt;        &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Failed!"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a id="rest_code_00b0727d493d4e98b2395dbed59285e5-55" name="rest_code_00b0727d493d4e98b2395dbed59285e5-55" href="https://blog.apdu.fr/posts/2024/06/ccid-driver-and-multiple-enabled-profiles-mep/#rest_code_00b0727d493d4e98b2395dbed59285e5-55"&gt;&lt;/a&gt;
&lt;a id="rest_code_00b0727d493d4e98b2395dbed59285e5-56" name="rest_code_00b0727d493d4e98b2395dbed59285e5-56" href="https://blog.apdu.fr/posts/2024/06/ccid-driver-and-multiple-enabled-profiles-mep/#rest_code_00b0727d493d4e98b2395dbed59285e5-56"&gt;&lt;/a&gt;
&lt;a id="rest_code_00b0727d493d4e98b2395dbed59285e5-57" name="rest_code_00b0727d493d4e98b2395dbed59285e5-57" href="https://blog.apdu.fr/posts/2024/06/ccid-driver-and-multiple-enabled-profiles-mep/#rest_code_00b0727d493d4e98b2395dbed59285e5-57"&gt;&lt;/a&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="vm"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;"__main__"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;a id="rest_code_00b0727d493d4e98b2395dbed59285e5-58" name="rest_code_00b0727d493d4e98b2395dbed59285e5-58" href="https://blog.apdu.fr/posts/2024/06/ccid-driver-and-multiple-enabled-profiles-mep/#rest_code_00b0727d493d4e98b2395dbed59285e5-58"&gt;&lt;/a&gt;    &lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;sys&lt;/span&gt;
&lt;a id="rest_code_00b0727d493d4e98b2395dbed59285e5-59" name="rest_code_00b0727d493d4e98b2395dbed59285e5-59" href="https://blog.apdu.fr/posts/2024/06/ccid-driver-and-multiple-enabled-profiles-mep/#rest_code_00b0727d493d4e98b2395dbed59285e5-59"&gt;&lt;/a&gt;
&lt;a id="rest_code_00b0727d493d4e98b2395dbed59285e5-60" name="rest_code_00b0727d493d4e98b2395dbed59285e5-60" href="https://blog.apdu.fr/posts/2024/06/ccid-driver-and-multiple-enabled-profiles-mep/#rest_code_00b0727d493d4e98b2395dbed59285e5-60"&gt;&lt;/a&gt;    &lt;span class="n"&gt;reader_idx&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;a id="rest_code_00b0727d493d4e98b2395dbed59285e5-61" name="rest_code_00b0727d493d4e98b2395dbed59285e5-61" href="https://blog.apdu.fr/posts/2024/06/ccid-driver-and-multiple-enabled-profiles-mep/#rest_code_00b0727d493d4e98b2395dbed59285e5-61"&gt;&lt;/a&gt;    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;a id="rest_code_00b0727d493d4e98b2395dbed59285e5-62" name="rest_code_00b0727d493d4e98b2395dbed59285e5-62" href="https://blog.apdu.fr/posts/2024/06/ccid-driver-and-multiple-enabled-profiles-mep/#rest_code_00b0727d493d4e98b2395dbed59285e5-62"&gt;&lt;/a&gt;        &lt;span class="n"&gt;reader_idx&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;a id="rest_code_00b0727d493d4e98b2395dbed59285e5-63" name="rest_code_00b0727d493d4e98b2395dbed59285e5-63" href="https://blog.apdu.fr/posts/2024/06/ccid-driver-and-multiple-enabled-profiles-mep/#rest_code_00b0727d493d4e98b2395dbed59285e5-63"&gt;&lt;/a&gt;
&lt;a id="rest_code_00b0727d493d4e98b2395dbed59285e5-64" name="rest_code_00b0727d493d4e98b2395dbed59285e5-64" href="https://blog.apdu.fr/posts/2024/06/ccid-driver-and-multiple-enabled-profiles-mep/#rest_code_00b0727d493d4e98b2395dbed59285e5-64"&gt;&lt;/a&gt;    &lt;span class="n"&gt;reader&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;readers&lt;/span&gt;&lt;span class="p"&gt;()[&lt;/span&gt;&lt;span class="n"&gt;reader_idx&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;a id="rest_code_00b0727d493d4e98b2395dbed59285e5-65" name="rest_code_00b0727d493d4e98b2395dbed59285e5-65" href="https://blog.apdu.fr/posts/2024/06/ccid-driver-and-multiple-enabled-profiles-mep/#rest_code_00b0727d493d4e98b2395dbed59285e5-65"&gt;&lt;/a&gt;    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Reader:"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;reader&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a id="rest_code_00b0727d493d4e98b2395dbed59285e5-66" name="rest_code_00b0727d493d4e98b2395dbed59285e5-66" href="https://blog.apdu.fr/posts/2024/06/ccid-driver-and-multiple-enabled-profiles-mep/#rest_code_00b0727d493d4e98b2395dbed59285e5-66"&gt;&lt;/a&gt;
&lt;a id="rest_code_00b0727d493d4e98b2395dbed59285e5-67" name="rest_code_00b0727d493d4e98b2395dbed59285e5-67" href="https://blog.apdu.fr/posts/2024/06/ccid-driver-and-multiple-enabled-profiles-mep/#rest_code_00b0727d493d4e98b2395dbed59285e5-67"&gt;&lt;/a&gt;    &lt;span class="n"&gt;cardConnection&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;reader&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;createConnection&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;a id="rest_code_00b0727d493d4e98b2395dbed59285e5-68" name="rest_code_00b0727d493d4e98b2395dbed59285e5-68" href="https://blog.apdu.fr/posts/2024/06/ccid-driver-and-multiple-enabled-profiles-mep/#rest_code_00b0727d493d4e98b2395dbed59285e5-68"&gt;&lt;/a&gt;    &lt;span class="n"&gt;cardConnection&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;connect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;disposition&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;SCARD_LEAVE_CARD&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a id="rest_code_00b0727d493d4e98b2395dbed59285e5-69" name="rest_code_00b0727d493d4e98b2395dbed59285e5-69" href="https://blog.apdu.fr/posts/2024/06/ccid-driver-and-multiple-enabled-profiles-mep/#rest_code_00b0727d493d4e98b2395dbed59285e5-69"&gt;&lt;/a&gt;
&lt;a id="rest_code_00b0727d493d4e98b2395dbed59285e5-70" name="rest_code_00b0727d493d4e98b2395dbed59285e5-70" href="https://blog.apdu.fr/posts/2024/06/ccid-driver-and-multiple-enabled-profiles-mep/#rest_code_00b0727d493d4e98b2395dbed59285e5-70"&gt;&lt;/a&gt;    &lt;span class="n"&gt;get_nad&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cardConnection&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a id="rest_code_00b0727d493d4e98b2395dbed59285e5-71" name="rest_code_00b0727d493d4e98b2395dbed59285e5-71" href="https://blog.apdu.fr/posts/2024/06/ccid-driver-and-multiple-enabled-profiles-mep/#rest_code_00b0727d493d4e98b2395dbed59285e5-71"&gt;&lt;/a&gt;    &lt;span class="n"&gt;set_nad&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cardConnection&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;42&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a id="rest_code_00b0727d493d4e98b2395dbed59285e5-72" name="rest_code_00b0727d493d4e98b2395dbed59285e5-72" href="https://blog.apdu.fr/posts/2024/06/ccid-driver-and-multiple-enabled-profiles-mep/#rest_code_00b0727d493d4e98b2395dbed59285e5-72"&gt;&lt;/a&gt;    &lt;span class="n"&gt;get_nad&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cardConnection&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;section id="output"&gt;
&lt;h3&gt;Output&lt;/h3&gt;
&lt;div class="code"&gt;&lt;pre class="code console"&gt;&lt;a id="rest_code_04c559e3f486471d89b22c85c2769ab2-1" name="rest_code_04c559e3f486471d89b22c85c2769ab2-1" href="https://blog.apdu.fr/posts/2024/06/ccid-driver-and-multiple-enabled-profiles-mep/#rest_code_04c559e3f486471d89b22c85c2769ab2-1"&gt;&lt;/a&gt;&lt;span class="go"&gt; ./GetSetNAD.py 1&lt;/span&gt;
&lt;a id="rest_code_04c559e3f486471d89b22c85c2769ab2-2" name="rest_code_04c559e3f486471d89b22c85c2769ab2-2" href="https://blog.apdu.fr/posts/2024/06/ccid-driver-and-multiple-enabled-profiles-mep/#rest_code_04c559e3f486471d89b22c85c2769ab2-2"&gt;&lt;/a&gt;&lt;span class="go"&gt;Reader: Gemalto PC Twin Reader 01 00&lt;/span&gt;
&lt;a id="rest_code_04c559e3f486471d89b22c85c2769ab2-3" name="rest_code_04c559e3f486471d89b22c85c2769ab2-3" href="https://blog.apdu.fr/posts/2024/06/ccid-driver-and-multiple-enabled-profiles-mep/#rest_code_04c559e3f486471d89b22c85c2769ab2-3"&gt;&lt;/a&gt;&lt;span class="go"&gt;Get NAD&lt;/span&gt;
&lt;a id="rest_code_04c559e3f486471d89b22c85c2769ab2-4" name="rest_code_04c559e3f486471d89b22c85c2769ab2-4" href="https://blog.apdu.fr/posts/2024/06/ccid-driver-and-multiple-enabled-profiles-mep/#rest_code_04c559e3f486471d89b22c85c2769ab2-4"&gt;&lt;/a&gt;&lt;span class="go"&gt; command: 3F 00 00&lt;/span&gt;
&lt;a id="rest_code_04c559e3f486471d89b22c85c2769ab2-5" name="rest_code_04c559e3f486471d89b22c85c2769ab2-5" href="https://blog.apdu.fr/posts/2024/06/ccid-driver-and-multiple-enabled-profiles-mep/#rest_code_04c559e3f486471d89b22c85c2769ab2-5"&gt;&lt;/a&gt;&lt;span class="go"&gt;  result: 3F 00 02 00 00&lt;/span&gt;
&lt;a id="rest_code_04c559e3f486471d89b22c85c2769ab2-6" name="rest_code_04c559e3f486471d89b22c85c2769ab2-6" href="https://blog.apdu.fr/posts/2024/06/ccid-driver-and-multiple-enabled-profiles-mep/#rest_code_04c559e3f486471d89b22c85c2769ab2-6"&gt;&lt;/a&gt;&lt;span class="go"&gt;Success&lt;/span&gt;
&lt;a id="rest_code_04c559e3f486471d89b22c85c2769ab2-7" name="rest_code_04c559e3f486471d89b22c85c2769ab2-7" href="https://blog.apdu.fr/posts/2024/06/ccid-driver-and-multiple-enabled-profiles-mep/#rest_code_04c559e3f486471d89b22c85c2769ab2-7"&gt;&lt;/a&gt;&lt;span class="go"&gt;NAD: 0&lt;/span&gt;
&lt;a id="rest_code_04c559e3f486471d89b22c85c2769ab2-8" name="rest_code_04c559e3f486471d89b22c85c2769ab2-8" href="https://blog.apdu.fr/posts/2024/06/ccid-driver-and-multiple-enabled-profiles-mep/#rest_code_04c559e3f486471d89b22c85c2769ab2-8"&gt;&lt;/a&gt;&lt;span class="go"&gt;Set NAD&lt;/span&gt;
&lt;a id="rest_code_04c559e3f486471d89b22c85c2769ab2-9" name="rest_code_04c559e3f486471d89b22c85c2769ab2-9" href="https://blog.apdu.fr/posts/2024/06/ccid-driver-and-multiple-enabled-profiles-mep/#rest_code_04c559e3f486471d89b22c85c2769ab2-9"&gt;&lt;/a&gt;&lt;span class="go"&gt; command: 3E 00 01 2A&lt;/span&gt;
&lt;a id="rest_code_04c559e3f486471d89b22c85c2769ab2-10" name="rest_code_04c559e3f486471d89b22c85c2769ab2-10" href="https://blog.apdu.fr/posts/2024/06/ccid-driver-and-multiple-enabled-profiles-mep/#rest_code_04c559e3f486471d89b22c85c2769ab2-10"&gt;&lt;/a&gt;&lt;span class="go"&gt;  result: 3E 00 01 00&lt;/span&gt;
&lt;a id="rest_code_04c559e3f486471d89b22c85c2769ab2-11" name="rest_code_04c559e3f486471d89b22c85c2769ab2-11" href="https://blog.apdu.fr/posts/2024/06/ccid-driver-and-multiple-enabled-profiles-mep/#rest_code_04c559e3f486471d89b22c85c2769ab2-11"&gt;&lt;/a&gt;&lt;span class="go"&gt;Success&lt;/span&gt;
&lt;a id="rest_code_04c559e3f486471d89b22c85c2769ab2-12" name="rest_code_04c559e3f486471d89b22c85c2769ab2-12" href="https://blog.apdu.fr/posts/2024/06/ccid-driver-and-multiple-enabled-profiles-mep/#rest_code_04c559e3f486471d89b22c85c2769ab2-12"&gt;&lt;/a&gt;&lt;span class="go"&gt;Get NAD&lt;/span&gt;
&lt;a id="rest_code_04c559e3f486471d89b22c85c2769ab2-13" name="rest_code_04c559e3f486471d89b22c85c2769ab2-13" href="https://blog.apdu.fr/posts/2024/06/ccid-driver-and-multiple-enabled-profiles-mep/#rest_code_04c559e3f486471d89b22c85c2769ab2-13"&gt;&lt;/a&gt;&lt;span class="go"&gt; command: 3F 00 00&lt;/span&gt;
&lt;a id="rest_code_04c559e3f486471d89b22c85c2769ab2-14" name="rest_code_04c559e3f486471d89b22c85c2769ab2-14" href="https://blog.apdu.fr/posts/2024/06/ccid-driver-and-multiple-enabled-profiles-mep/#rest_code_04c559e3f486471d89b22c85c2769ab2-14"&gt;&lt;/a&gt;&lt;span class="go"&gt;  result: 3F 00 02 00 2A&lt;/span&gt;
&lt;a id="rest_code_04c559e3f486471d89b22c85c2769ab2-15" name="rest_code_04c559e3f486471d89b22c85c2769ab2-15" href="https://blog.apdu.fr/posts/2024/06/ccid-driver-and-multiple-enabled-profiles-mep/#rest_code_04c559e3f486471d89b22c85c2769ab2-15"&gt;&lt;/a&gt;&lt;span class="go"&gt;Success&lt;/span&gt;
&lt;a id="rest_code_04c559e3f486471d89b22c85c2769ab2-16" name="rest_code_04c559e3f486471d89b22c85c2769ab2-16" href="https://blog.apdu.fr/posts/2024/06/ccid-driver-and-multiple-enabled-profiles-mep/#rest_code_04c559e3f486471d89b22c85c2769ab2-16"&gt;&lt;/a&gt;&lt;span class="go"&gt;NAD: 42&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Here the NAD is changed from the default value 0 to 42.&lt;/p&gt;
&lt;p&gt;To enable the feature in the CCID driver you need to define
&lt;code class="docutils literal"&gt;ENABLE_MULTIPLE_ENABLED_PROFILES&lt;/code&gt; in the source code and
rebuild + reinstall the driver.&lt;/p&gt;
&lt;p&gt;It is NOT enabled by default because:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;very few people will need it&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;it is too easy to create a Denial Of Service using the &lt;code class="docutils literal"&gt;SCardControl()&lt;/code&gt;
code and update the NAD value&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="example-of-denial-of-service"&gt;
&lt;h3&gt;Example of denial of service&lt;/h3&gt;
&lt;p&gt;Just after running the &lt;code class="docutils literal"&gt;GetSetNAD.py&lt;/code&gt; program you can try to send an
APDU to the smart card:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code console"&gt;&lt;a id="rest_code_365c9c77fdb74e1b87970102fd1e6359-1" name="rest_code_365c9c77fdb74e1b87970102fd1e6359-1" href="https://blog.apdu.fr/posts/2024/06/ccid-driver-and-multiple-enabled-profiles-mep/#rest_code_365c9c77fdb74e1b87970102fd1e6359-1"&gt;&lt;/a&gt;&lt;span class="gp"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"00 00 00 00"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;scriptor&lt;span class="w"&gt; &lt;/span&gt;-r&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Gemalto PC Twin Reader 01 00"&lt;/span&gt;
&lt;a id="rest_code_365c9c77fdb74e1b87970102fd1e6359-2" name="rest_code_365c9c77fdb74e1b87970102fd1e6359-2" href="https://blog.apdu.fr/posts/2024/06/ccid-driver-and-multiple-enabled-profiles-mep/#rest_code_365c9c77fdb74e1b87970102fd1e6359-2"&gt;&lt;/a&gt;&lt;span class="go"&gt;Using given card reader: Gemalto PC Twin Reader 01 00&lt;/span&gt;
&lt;a id="rest_code_365c9c77fdb74e1b87970102fd1e6359-3" name="rest_code_365c9c77fdb74e1b87970102fd1e6359-3" href="https://blog.apdu.fr/posts/2024/06/ccid-driver-and-multiple-enabled-profiles-mep/#rest_code_365c9c77fdb74e1b87970102fd1e6359-3"&gt;&lt;/a&gt;&lt;span class="go"&gt;Using T=1 protocol&lt;/span&gt;
&lt;a id="rest_code_365c9c77fdb74e1b87970102fd1e6359-4" name="rest_code_365c9c77fdb74e1b87970102fd1e6359-4" href="https://blog.apdu.fr/posts/2024/06/ccid-driver-and-multiple-enabled-profiles-mep/#rest_code_365c9c77fdb74e1b87970102fd1e6359-4"&gt;&lt;/a&gt;&lt;span class="go"&gt;Reading commands from STDIN&lt;/span&gt;
&lt;a id="rest_code_365c9c77fdb74e1b87970102fd1e6359-5" name="rest_code_365c9c77fdb74e1b87970102fd1e6359-5" href="https://blog.apdu.fr/posts/2024/06/ccid-driver-and-multiple-enabled-profiles-mep/#rest_code_365c9c77fdb74e1b87970102fd1e6359-5"&gt;&lt;/a&gt;&lt;span class="go"&gt;&amp;gt; 00 00 00 00&lt;/span&gt;
&lt;a id="rest_code_365c9c77fdb74e1b87970102fd1e6359-6" name="rest_code_365c9c77fdb74e1b87970102fd1e6359-6" href="https://blog.apdu.fr/posts/2024/06/ccid-driver-and-multiple-enabled-profiles-mep/#rest_code_365c9c77fdb74e1b87970102fd1e6359-6"&gt;&lt;/a&gt;&lt;span class="go"&gt;Can't get info: Transaction failed.&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;From pcscd logs you get:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code text"&gt;&lt;a id="rest_code_0a57c3b5ab5b413ca298f2f8b14ae4fe-1" name="rest_code_0a57c3b5ab5b413ca298f2f8b14ae4fe-1" href="https://blog.apdu.fr/posts/2024/06/ccid-driver-and-multiple-enabled-profiles-mep/#rest_code_0a57c3b5ab5b413ca298f2f8b14ae4fe-1"&gt;&lt;/a&gt;00000004 [140363545183936] APDU: 00 00 00 00
&lt;a id="rest_code_0a57c3b5ab5b413ca298f2f8b14ae4fe-2" name="rest_code_0a57c3b5ab5b413ca298f2f8b14ae4fe-2" href="https://blog.apdu.fr/posts/2024/06/ccid-driver-and-multiple-enabled-profiles-mep/#rest_code_0a57c3b5ab5b413ca298f2f8b14ae4fe-2"&gt;&lt;/a&gt;00000005 [140363545183936] ../src/ifdhandler.c:1360:IFDHTransmitToICC() usb:08e6/3437:libudev:0:/dev/bus/usb/001/008 (lun: 10000)
&lt;a id="rest_code_0a57c3b5ab5b413ca298f2f8b14ae4fe-3" name="rest_code_0a57c3b5ab5b413ca298f2f8b14ae4fe-3" href="https://blog.apdu.fr/posts/2024/06/ccid-driver-and-multiple-enabled-profiles-mep/#rest_code_0a57c3b5ab5b413ca298f2f8b14ae4fe-3"&gt;&lt;/a&gt;00000004 [140363545183936] ../src/commands.c:2289:CmdXfrBlockTPDU_T1() T=1: 4 and 65548 bytes
&lt;a id="rest_code_0a57c3b5ab5b413ca298f2f8b14ae4fe-4" name="rest_code_0a57c3b5ab5b413ca298f2f8b14ae4fe-4" href="https://blog.apdu.fr/posts/2024/06/ccid-driver-and-multiple-enabled-profiles-mep/#rest_code_0a57c3b5ab5b413ca298f2f8b14ae4fe-4"&gt;&lt;/a&gt;00000004 [140363545183936] ../src/openct/proto-t1.c:599:t1_build() more bit: 0
&lt;a id="rest_code_0a57c3b5ab5b413ca298f2f8b14ae4fe-5" name="rest_code_0a57c3b5ab5b413ca298f2f8b14ae4fe-5" href="https://blog.apdu.fr/posts/2024/06/ccid-driver-and-multiple-enabled-profiles-mep/#rest_code_0a57c3b5ab5b413ca298f2f8b14ae4fe-5"&gt;&lt;/a&gt;00000005 [140363545183936] sending: 2A 40 04 00 00 00 00 6E
&lt;a id="rest_code_0a57c3b5ab5b413ca298f2f8b14ae4fe-6" name="rest_code_0a57c3b5ab5b413ca298f2f8b14ae4fe-6" href="https://blog.apdu.fr/posts/2024/06/ccid-driver-and-multiple-enabled-profiles-mep/#rest_code_0a57c3b5ab5b413ca298f2f8b14ae4fe-6"&gt;&lt;/a&gt;00000006 [140363545183936] -&amp;gt; 000001 6F 08 00 00 00 00 20 00 00 00 2A 40 04 00 00 00 00 6E
&lt;a id="rest_code_0a57c3b5ab5b413ca298f2f8b14ae4fe-7" name="rest_code_0a57c3b5ab5b413ca298f2f8b14ae4fe-7" href="https://blog.apdu.fr/posts/2024/06/ccid-driver-and-multiple-enabled-profiles-mep/#rest_code_0a57c3b5ab5b413ca298f2f8b14ae4fe-7"&gt;&lt;/a&gt;00002295 [140363545183936] &amp;lt;- 000001 80 04 00 00 00 00 20 00 00 00 00 92 00 92
&lt;a id="rest_code_0a57c3b5ab5b413ca298f2f8b14ae4fe-8" name="rest_code_0a57c3b5ab5b413ca298f2f8b14ae4fe-8" href="https://blog.apdu.fr/posts/2024/06/ccid-driver-and-multiple-enabled-profiles-mep/#rest_code_0a57c3b5ab5b413ca298f2f8b14ae4fe-8"&gt;&lt;/a&gt;00000016 [140363545183936] received: 00 92 00 92
&lt;a id="rest_code_0a57c3b5ab5b413ca298f2f8b14ae4fe-9" name="rest_code_0a57c3b5ab5b413ca298f2f8b14ae4fe-9" href="https://blog.apdu.fr/posts/2024/06/ccid-driver-and-multiple-enabled-profiles-mep/#rest_code_0a57c3b5ab5b413ca298f2f8b14ae4fe-9"&gt;&lt;/a&gt;00000004 [140363545183936] ../src/openct/proto-t1.c:242:t1_transceive() R-BLOCK required
&lt;a id="rest_code_0a57c3b5ab5b413ca298f2f8b14ae4fe-10" name="rest_code_0a57c3b5ab5b413ca298f2f8b14ae4fe-10" href="https://blog.apdu.fr/posts/2024/06/ccid-driver-and-multiple-enabled-profiles-mep/#rest_code_0a57c3b5ab5b413ca298f2f8b14ae4fe-10"&gt;&lt;/a&gt;00000004 [140363545183936] sending: 2A 92 00 B8
&lt;a id="rest_code_0a57c3b5ab5b413ca298f2f8b14ae4fe-11" name="rest_code_0a57c3b5ab5b413ca298f2f8b14ae4fe-11" href="https://blog.apdu.fr/posts/2024/06/ccid-driver-and-multiple-enabled-profiles-mep/#rest_code_0a57c3b5ab5b413ca298f2f8b14ae4fe-11"&gt;&lt;/a&gt;00000005 [140363545183936] -&amp;gt; 000001 6F 04 00 00 00 00 21 00 00 00 2A 92 00 B8
&lt;a id="rest_code_0a57c3b5ab5b413ca298f2f8b14ae4fe-12" name="rest_code_0a57c3b5ab5b413ca298f2f8b14ae4fe-12" href="https://blog.apdu.fr/posts/2024/06/ccid-driver-and-multiple-enabled-profiles-mep/#rest_code_0a57c3b5ab5b413ca298f2f8b14ae4fe-12"&gt;&lt;/a&gt;00002016 [140363545183936] &amp;lt;- 000001 80 04 00 00 00 00 21 00 00 00 00 92 00 92
&lt;a id="rest_code_0a57c3b5ab5b413ca298f2f8b14ae4fe-13" name="rest_code_0a57c3b5ab5b413ca298f2f8b14ae4fe-13" href="https://blog.apdu.fr/posts/2024/06/ccid-driver-and-multiple-enabled-profiles-mep/#rest_code_0a57c3b5ab5b413ca298f2f8b14ae4fe-13"&gt;&lt;/a&gt;00000012 [140363545183936] received: 00 92 00 92
&lt;a id="rest_code_0a57c3b5ab5b413ca298f2f8b14ae4fe-14" name="rest_code_0a57c3b5ab5b413ca298f2f8b14ae4fe-14" href="https://blog.apdu.fr/posts/2024/06/ccid-driver-and-multiple-enabled-profiles-mep/#rest_code_0a57c3b5ab5b413ca298f2f8b14ae4fe-14"&gt;&lt;/a&gt;00000004 [140363545183936] ../src/openct/proto-t1.c:242:t1_transceive() R-BLOCK required
&lt;a id="rest_code_0a57c3b5ab5b413ca298f2f8b14ae4fe-15" name="rest_code_0a57c3b5ab5b413ca298f2f8b14ae4fe-15" href="https://blog.apdu.fr/posts/2024/06/ccid-driver-and-multiple-enabled-profiles-mep/#rest_code_0a57c3b5ab5b413ca298f2f8b14ae4fe-15"&gt;&lt;/a&gt;00000003 [140363545183936] ../src/openct/proto-t1.c:250:t1_transceive() Rule 7.2
&lt;a id="rest_code_0a57c3b5ab5b413ca298f2f8b14ae4fe-16" name="rest_code_0a57c3b5ab5b413ca298f2f8b14ae4fe-16" href="https://blog.apdu.fr/posts/2024/06/ccid-driver-and-multiple-enabled-profiles-mep/#rest_code_0a57c3b5ab5b413ca298f2f8b14ae4fe-16"&gt;&lt;/a&gt;00000002 [140363545183936] sending: 2A 92 00 B8
&lt;a id="rest_code_0a57c3b5ab5b413ca298f2f8b14ae4fe-17" name="rest_code_0a57c3b5ab5b413ca298f2f8b14ae4fe-17" href="https://blog.apdu.fr/posts/2024/06/ccid-driver-and-multiple-enabled-profiles-mep/#rest_code_0a57c3b5ab5b413ca298f2f8b14ae4fe-17"&gt;&lt;/a&gt;00000005 [140363545183936] -&amp;gt; 000001 6F 04 00 00 00 00 22 00 00 00 2A 92 00 B8
&lt;a id="rest_code_0a57c3b5ab5b413ca298f2f8b14ae4fe-18" name="rest_code_0a57c3b5ab5b413ca298f2f8b14ae4fe-18" href="https://blog.apdu.fr/posts/2024/06/ccid-driver-and-multiple-enabled-profiles-mep/#rest_code_0a57c3b5ab5b413ca298f2f8b14ae4fe-18"&gt;&lt;/a&gt;01555310 [140363545183936] &amp;lt;- 000001 80 00 00 00 00 00 22 40 FE 00
&lt;a id="rest_code_0a57c3b5ab5b413ca298f2f8b14ae4fe-19" name="rest_code_0a57c3b5ab5b413ca298f2f8b14ae4fe-19" href="https://blog.apdu.fr/posts/2024/06/ccid-driver-and-multiple-enabled-profiles-mep/#rest_code_0a57c3b5ab5b413ca298f2f8b14ae4fe-19"&gt;&lt;/a&gt;00000020 [140363545183936] ../src/commands.c:1564:CCID_Receive Card absent or mute
&lt;a id="rest_code_0a57c3b5ab5b413ca298f2f8b14ae4fe-20" name="rest_code_0a57c3b5ab5b413ca298f2f8b14ae4fe-20" href="https://blog.apdu.fr/posts/2024/06/ccid-driver-and-multiple-enabled-profiles-mep/#rest_code_0a57c3b5ab5b413ca298f2f8b14ae4fe-20"&gt;&lt;/a&gt;00000006 [140363545183936] ../src/openct/proto-t1.c:234:t1_transceive() fatal: transmit/receive failed
&lt;a id="rest_code_0a57c3b5ab5b413ca298f2f8b14ae4fe-21" name="rest_code_0a57c3b5ab5b413ca298f2f8b14ae4fe-21" href="https://blog.apdu.fr/posts/2024/06/ccid-driver-and-multiple-enabled-profiles-mep/#rest_code_0a57c3b5ab5b413ca298f2f8b14ae4fe-21"&gt;&lt;/a&gt;00000004 [140363545183936] SW:
&lt;a id="rest_code_0a57c3b5ab5b413ca298f2f8b14ae4fe-22" name="rest_code_0a57c3b5ab5b413ca298f2f8b14ae4fe-22" href="https://blog.apdu.fr/posts/2024/06/ccid-driver-and-multiple-enabled-profiles-mep/#rest_code_0a57c3b5ab5b413ca298f2f8b14ae4fe-22"&gt;&lt;/a&gt;00000004 [140363545183936] ../src/ifdwrapper.c:543:IFDTransmit() Card not transacted: 612
&lt;a id="rest_code_0a57c3b5ab5b413ca298f2f8b14ae4fe-23" name="rest_code_0a57c3b5ab5b413ca298f2f8b14ae4fe-23" href="https://blog.apdu.fr/posts/2024/06/ccid-driver-and-multiple-enabled-profiles-mep/#rest_code_0a57c3b5ab5b413ca298f2f8b14ae4fe-23"&gt;&lt;/a&gt;00000003 [140363545183936] ../src/winscard.c:1622:SCardTransmit() Card not transacted: rv=SCARD_E_NOT_TRANSACTED
&lt;a id="rest_code_0a57c3b5ab5b413ca298f2f8b14ae4fe-24" name="rest_code_0a57c3b5ab5b413ca298f2f8b14ae4fe-24" href="https://blog.apdu.fr/posts/2024/06/ccid-driver-and-multiple-enabled-profiles-mep/#rest_code_0a57c3b5ab5b413ca298f2f8b14ae4fe-24"&gt;&lt;/a&gt;00000003 [140363545183936] ../src/winscard.c:1650:SCardTransmit() UnrefReader() count was: 2
&lt;a id="rest_code_0a57c3b5ab5b413ca298f2f8b14ae4fe-25" name="rest_code_0a57c3b5ab5b413ca298f2f8b14ae4fe-25" href="https://blog.apdu.fr/posts/2024/06/ccid-driver-and-multiple-enabled-profiles-mep/#rest_code_0a57c3b5ab5b413ca298f2f8b14ae4fe-25"&gt;&lt;/a&gt;00000005 [140363545183936] ../src/winscard_svc.c:719:ContextThread() TRANSMIT for client 15, rv=SCARD_E_NOT_TRANSACTED
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;You can see the NAD (node address byte) value (42 or 0x2A) in the first
byte of the T=1 block sent by the driver to the reader.  My smart card
does not like this NAD value (it is not an eSIM with MEP support) and
requests an R-Block before becoming mute.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="conclusion"&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Very few people will use this feature. I guess only developers of eSIM
and testers/evaluators of eSIM will need this.&lt;/p&gt;
&lt;p&gt;My driver is Free Software and was modified to add the feature. This is
the beauty of Free Software.&lt;/p&gt;
&lt;/section&gt;</description><category>ccid</category><category>sim</category><guid>https://blog.apdu.fr/posts/2024/06/ccid-driver-and-multiple-enabled-profiles-mep/</guid><pubDate>Wed, 05 Jun 2024 12:39:49 GMT</pubDate></item></channel></rss>