<?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</title><link>https://blog.apdu.fr/</link><description>My activities related to smart card and Free Software (as in free speech).</description><atom:link href="https://blog.apdu.fr/rss.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:20 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>pcsc_scan improved user interface</title><link>https://blog.apdu.fr/posts/2026/02/pcsc_scan-improved-user-interface/</link><dc:creator>Ludovic Rousseau</dc:creator><description>&lt;p&gt;Version 1.7.4 of pcsc-tools provides an enhanced version of the
&lt;code class="docutils literal"&gt;pcsc_scan&lt;/code&gt; tool.&lt;/p&gt;
&lt;section id="problem"&gt;
&lt;h2&gt;Problem&lt;/h2&gt;
&lt;p&gt;The program waits for card and reader events and reports any
smart card events. If no reader or card is inserted or removed,
nothing happens.&lt;/p&gt;
&lt;p&gt;Since version 1.6.0 (&lt;a class="reference external" href="https://blog.apdu.fr/posts/2022/01/new-version-of-pcsc-tools-160/"&gt;New version of pcsc-tools: 1.6.0&lt;/a&gt;) the program
has included an animation (cycling &lt;code class="docutils literal"&gt;&lt;span class="pre"&gt;\|/-&lt;/span&gt;&lt;/code&gt; characters) to indicate that
it is waiting. However, this was not obvious to users who did not know
how to stop the program or what to do.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="solution"&gt;
&lt;h2&gt;Solution&lt;/h2&gt;
&lt;p&gt;Now when the program is waiting for an event it displays a message such
as:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code text"&gt;&lt;a id="rest_code_1ac2afbf5e6f4579bd30a014a0b9d49a-1" name="rest_code_1ac2afbf5e6f4579bd30a014a0b9d49a-1" href="https://blog.apdu.fr/posts/2026/02/pcsc_scan-improved-user-interface/#rest_code_1ac2afbf5e6f4579bd30a014a0b9d49a-1"&gt;&lt;/a&gt;Waiting for the first reader...   \  (use Ctrl-C to exit)
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;or&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code text"&gt;&lt;a id="rest_code_21191e348a634643b7c3a776e181eca4-1" name="rest_code_21191e348a634643b7c3a776e181eca4-1" href="https://blog.apdu.fr/posts/2026/02/pcsc_scan-improved-user-interface/#rest_code_21191e348a634643b7c3a776e181eca4-1"&gt;&lt;/a&gt;Insert or remove a card or a reader... /  (use Ctrl-C to exit)
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;I hope this makes it clearer what the user is expected to do.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="demo"&gt;
&lt;h2&gt;Demo&lt;/h2&gt;
&lt;p&gt;The animation was recorded and played using &lt;a class="reference external" href="https://asciinema.org/"&gt;asciinema&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The sequence in the animation below correspons to:&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;Connect a reader&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Insert a card&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Remove the card&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Disconnect the reader&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Exit pcsc_scan&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;link rel="stylesheet" type="text/css" href="https://pcsc-tools.apdu.fr/asciinema-player.css"&gt;
&lt;div id="demo1"&gt;&lt;/div&gt;
&lt;script src="https://pcsc-tools.apdu.fr/asciinema-player.min.js"&gt;&lt;/script&gt;
&lt;script&gt;
        AsciinemaPlayer.create('/assets/cast/demo1.cast',
                document.getElementById('demo1'));
&lt;/script&gt;&lt;/section&gt;
&lt;section id="windows"&gt;
&lt;h2&gt;Windows&lt;/h2&gt;
&lt;p&gt;The program is also available for Windows. You can download the Windows binary
from the project page &lt;a class="reference external" href="https://pcsc-tools.apdu.fr/#windows"&gt;https://pcsc-tools.apdu.fr/#windows&lt;/a&gt;&lt;/p&gt;
&lt;img alt="https://pcsc-tools.apdu.fr/pcsc_scan_windows.gif" src="https://pcsc-tools.apdu.fr/pcsc_scan_windows.gif"&gt;
&lt;/section&gt;
&lt;section id="conclusion"&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;I hope you find &lt;code class="docutils literal"&gt;pcsc_scan&lt;/code&gt; usefull for you. This tool is intended for
initial debugging purposes. For example see
&lt;a class="reference external" href="https://blog.apdu.fr/posts/2014/03/level-1-smart-card-support-on-gnulinux/"&gt;Level 1 smart card support on GNU/Linux&lt;/a&gt;.&lt;/p&gt;
&lt;/section&gt;</description><category>Tools</category><guid>https://blog.apdu.fr/posts/2026/02/pcsc_scan-improved-user-interface/</guid><pubDate>Wed, 18 Feb 2026 14:09:09 GMT</pubDate></item><item><title>New version of pcsc-tools: 1.7.4</title><link>https://blog.apdu.fr/posts/2026/02/new-version-of-pcsc-tools-174/</link><dc:creator>Ludovic Rousseau</dc:creator><description>&lt;p&gt;I just released a new version of &lt;a class="reference external" href="https://pcsc-tools.apdu.fr/"&gt;pcsc-tools&lt;/a&gt;, a suite of tools for PC/SC.&lt;/p&gt;
&lt;section id="changes"&gt;
&lt;h2&gt;Changes:&lt;/h2&gt;
&lt;p&gt;1.7.4 - 15 February 2026, Ludovic ROUSSEAU&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;282 new ATRs&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;pcsc_scan: display what the program expect from the user&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;</description><category>Perl Tools</category><guid>https://blog.apdu.fr/posts/2026/02/new-version-of-pcsc-tools-174/</guid><pubDate>Sun, 15 Feb 2026 14:44:21 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>PCSC sample in Zig</title><link>https://blog.apdu.fr/posts/2026/01/pcsc-sample-in-zig/</link><dc:creator>Ludovic Rousseau</dc:creator><description>&lt;p&gt;I continue the list of PC/SC wrappers I started in 2010 with
&lt;a class="reference external" href="https://blog.apdu.fr/posts/2010/04/pcsc-sample-in-different-languages/"&gt;PC/SC sample in different languages&lt;/a&gt;. I am now presenting a new
sample code in &lt;a class="reference external" href="https://ziglang.org/"&gt;Zig&lt;/a&gt;.&lt;/p&gt;
&lt;section id="pcsc-z"&gt;
&lt;h2&gt;pcsc-z&lt;/h2&gt;
&lt;p&gt;The wrapper is available at &lt;a class="reference external" href="https://github.com/kofi-q/pcsc-z"&gt;https://github.com/kofi-q/pcsc-z&lt;/a&gt; and is
compatible for GNU/Linux, macOS and Windows.&lt;/p&gt;
&lt;p&gt;The author is &lt;a class="reference external" href="https://github.com/kofi-q"&gt;kofi-q&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The licence is &lt;a class="reference external" href="https://github.com/kofi-q/pcsc-z/blob/main/LICENSE"&gt;MIT&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The API documentation can be found at &lt;a class="reference external" href="https://kofi-q.github.io/pcsc-z/#pcsc"&gt;https://kofi-q.github.io/pcsc-z/#pcsc&lt;/a&gt;.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="zig-1"&gt;
&lt;h2&gt;Zig&lt;/h2&gt;
&lt;p&gt;From Wikipedia &lt;a class="reference external" href="https://en.wikipedia.org/wiki/Zig_(programming_language)"&gt;Zig article&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Zig is a system programming language designed to be a
general-purpose improvement to the C programming language. It is
free and open-source software, released under an MIT License.&lt;/p&gt;
&lt;p&gt;Differences with C relate to control flow, function calls, library
imports, variable declaration and Unicode support. The language
makes no use of macros or preprocessor instructions. Features adopted
from modern languages include the addition of compile time generic
programming data types, allowing functions to work on a variety of data,
along with a small set of new compiler directives to allow access to the
information about those types using reflection. Zig requires manual
memory management, but attempts to improve memory safety through option
types and a unit testing framework. Features for low-level programming
include packed structs, arbitrary-width integers and multiple pointer
types.&lt;/p&gt;
&lt;p&gt;Zig was designed by Andrew Kelly and first announced in 2016.
Development is funded by the Zig Software Foundation (ZSF).&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/section&gt;
&lt;section id="installation"&gt;
&lt;h2&gt;Installation&lt;/h2&gt;
&lt;div class="code"&gt;&lt;pre class="code console"&gt;&lt;a id="rest_code_19d5803ecd83472f97d934e1523d37a1-1" name="rest_code_19d5803ecd83472f97d934e1523d37a1-1" href="https://blog.apdu.fr/posts/2026/01/pcsc-sample-in-zig/#rest_code_19d5803ecd83472f97d934e1523d37a1-1"&gt;&lt;/a&gt;&lt;span class="gp"&gt;$ &lt;/span&gt;zig&lt;span class="w"&gt; &lt;/span&gt;fetch&lt;span class="w"&gt; &lt;/span&gt;--save&lt;span class="o"&gt;=&lt;/span&gt;pcsc&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"git+https://github.com/kofi-q/pcsc-z.git"&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;I had to use an older version of the Zig-PC/SC wrapper because I used
Zig 0.15.2 (stable version) instead of the development version 0.16.&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code console"&gt;&lt;a id="rest_code_449590a1c26e4611809623176c30d319-1" name="rest_code_449590a1c26e4611809623176c30d319-1" href="https://blog.apdu.fr/posts/2026/01/pcsc-sample-in-zig/#rest_code_449590a1c26e4611809623176c30d319-1"&gt;&lt;/a&gt;&lt;span class="gp"&gt;$ &lt;/span&gt;zig&lt;span class="w"&gt; &lt;/span&gt;fetch&lt;span class="w"&gt; &lt;/span&gt;--save&lt;span class="o"&gt;=&lt;/span&gt;pcsc&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"git+https://github.com/kofi-q/pcsc-z.git#zig-0.15"&lt;/span&gt;
&lt;a id="rest_code_449590a1c26e4611809623176c30d319-2" name="rest_code_449590a1c26e4611809623176c30d319-2" href="https://blog.apdu.fr/posts/2026/01/pcsc-sample-in-zig/#rest_code_449590a1c26e4611809623176c30d319-2"&gt;&lt;/a&gt;&lt;span class="go"&gt;info: resolved ref 'zig-0.15' to commit b347fd008c003ceb92041654a050c48d02468ce3&lt;/span&gt;
&lt;a id="rest_code_449590a1c26e4611809623176c30d319-3" name="rest_code_449590a1c26e4611809623176c30d319-3" href="https://blog.apdu.fr/posts/2026/01/pcsc-sample-in-zig/#rest_code_449590a1c26e4611809623176c30d319-3"&gt;&lt;/a&gt;&lt;span class="go"&gt;warning: overwriting existing dependency named 'pcsc'&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/section&gt;
&lt;section id="source-code"&gt;
&lt;h2&gt;Source code&lt;/h2&gt;
&lt;p&gt;To get started, you can use the &lt;code class="docutils literal"&gt;zig init&lt;/code&gt; command to generate a
minimal zig project.&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code console"&gt;&lt;a id="rest_code_0e8ee671d2854cbda9af685134f642d6-1" name="rest_code_0e8ee671d2854cbda9af685134f642d6-1" href="https://blog.apdu.fr/posts/2026/01/pcsc-sample-in-zig/#rest_code_0e8ee671d2854cbda9af685134f642d6-1"&gt;&lt;/a&gt;&lt;span class="gp"&gt;$ &lt;/span&gt;zig&lt;span class="w"&gt; &lt;/span&gt;init
&lt;a id="rest_code_0e8ee671d2854cbda9af685134f642d6-2" name="rest_code_0e8ee671d2854cbda9af685134f642d6-2" href="https://blog.apdu.fr/posts/2026/01/pcsc-sample-in-zig/#rest_code_0e8ee671d2854cbda9af685134f642d6-2"&gt;&lt;/a&gt;&lt;span class="go"&gt;info: created build.zig&lt;/span&gt;
&lt;a id="rest_code_0e8ee671d2854cbda9af685134f642d6-3" name="rest_code_0e8ee671d2854cbda9af685134f642d6-3" href="https://blog.apdu.fr/posts/2026/01/pcsc-sample-in-zig/#rest_code_0e8ee671d2854cbda9af685134f642d6-3"&gt;&lt;/a&gt;&lt;span class="go"&gt;info: created build.zig.zon&lt;/span&gt;
&lt;a id="rest_code_0e8ee671d2854cbda9af685134f642d6-4" name="rest_code_0e8ee671d2854cbda9af685134f642d6-4" href="https://blog.apdu.fr/posts/2026/01/pcsc-sample-in-zig/#rest_code_0e8ee671d2854cbda9af685134f642d6-4"&gt;&lt;/a&gt;&lt;span class="go"&gt;info: created src/main.zig&lt;/span&gt;
&lt;a id="rest_code_0e8ee671d2854cbda9af685134f642d6-5" name="rest_code_0e8ee671d2854cbda9af685134f642d6-5" href="https://blog.apdu.fr/posts/2026/01/pcsc-sample-in-zig/#rest_code_0e8ee671d2854cbda9af685134f642d6-5"&gt;&lt;/a&gt;&lt;span class="go"&gt;info: created src/root.zig&lt;/span&gt;
&lt;a id="rest_code_0e8ee671d2854cbda9af685134f642d6-6" name="rest_code_0e8ee671d2854cbda9af685134f642d6-6" href="https://blog.apdu.fr/posts/2026/01/pcsc-sample-in-zig/#rest_code_0e8ee671d2854cbda9af685134f642d6-6"&gt;&lt;/a&gt;&lt;span class="go"&gt;info: see `zig build --help` for a menu of options&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;You then need to update 2 files: &lt;code class="docutils literal"&gt;src/main.zig&lt;/code&gt; and &lt;code class="docutils literal"&gt;build.zig&lt;/code&gt;.&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code zig"&gt;&lt;a id="rest_code_bb85004b52c84b369a22ba1c3393d163-1" name="rest_code_bb85004b52c84b369a22ba1c3393d163-1" href="https://blog.apdu.fr/posts/2026/01/pcsc-sample-in-zig/#rest_code_bb85004b52c84b369a22ba1c3393d163-1"&gt;&lt;/a&gt;&lt;span class="c1"&gt;//! src/main.zig&lt;/span&gt;
&lt;a id="rest_code_bb85004b52c84b369a22ba1c3393d163-2" name="rest_code_bb85004b52c84b369a22ba1c3393d163-2" href="https://blog.apdu.fr/posts/2026/01/pcsc-sample-in-zig/#rest_code_bb85004b52c84b369a22ba1c3393d163-2"&gt;&lt;/a&gt;
&lt;a id="rest_code_bb85004b52c84b369a22ba1c3393d163-3" name="rest_code_bb85004b52c84b369a22ba1c3393d163-3" href="https://blog.apdu.fr/posts/2026/01/pcsc-sample-in-zig/#rest_code_bb85004b52c84b369a22ba1c3393d163-3"&gt;&lt;/a&gt;&lt;span class="kr"&gt;const&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;@import&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"std"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;a id="rest_code_bb85004b52c84b369a22ba1c3393d163-4" name="rest_code_bb85004b52c84b369a22ba1c3393d163-4" href="https://blog.apdu.fr/posts/2026/01/pcsc-sample-in-zig/#rest_code_bb85004b52c84b369a22ba1c3393d163-4"&gt;&lt;/a&gt;&lt;span class="kr"&gt;const&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;pcsc&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;@import&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"pcsc"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;a id="rest_code_bb85004b52c84b369a22ba1c3393d163-5" name="rest_code_bb85004b52c84b369a22ba1c3393d163-5" href="https://blog.apdu.fr/posts/2026/01/pcsc-sample-in-zig/#rest_code_bb85004b52c84b369a22ba1c3393d163-5"&gt;&lt;/a&gt;
&lt;a id="rest_code_bb85004b52c84b369a22ba1c3393d163-6" name="rest_code_bb85004b52c84b369a22ba1c3393d163-6" href="https://blog.apdu.fr/posts/2026/01/pcsc-sample-in-zig/#rest_code_bb85004b52c84b369a22ba1c3393d163-6"&gt;&lt;/a&gt;&lt;span class="kr"&gt;pub&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;fn&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;a id="rest_code_bb85004b52c84b369a22ba1c3393d163-7" name="rest_code_bb85004b52c84b369a22ba1c3393d163-7" href="https://blog.apdu.fr/posts/2026/01/pcsc-sample-in-zig/#rest_code_bb85004b52c84b369a22ba1c3393d163-7"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kr"&gt;const&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;pcsc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;init&lt;/span&gt;&lt;span class="p"&gt;(.&lt;/span&gt;&lt;span class="n"&gt;SYSTEM&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;a id="rest_code_bb85004b52c84b369a22ba1c3393d163-8" name="rest_code_bb85004b52c84b369a22ba1c3393d163-8" href="https://blog.apdu.fr/posts/2026/01/pcsc-sample-in-zig/#rest_code_bb85004b52c84b369a22ba1c3393d163-8"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;defer&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;deinit&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;catch&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;err&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;debug&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;a id="rest_code_bb85004b52c84b369a22ba1c3393d163-9" name="rest_code_bb85004b52c84b369a22ba1c3393d163-9" href="https://blog.apdu.fr/posts/2026/01/pcsc-sample-in-zig/#rest_code_bb85004b52c84b369a22ba1c3393d163-9"&gt;&lt;/a&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s"&gt;"Unable to release client: {t}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_bb85004b52c84b369a22ba1c3393d163-10" name="rest_code_bb85004b52c84b369a22ba1c3393d163-10" href="https://blog.apdu.fr/posts/2026/01/pcsc-sample-in-zig/#rest_code_bb85004b52c84b369a22ba1c3393d163-10"&gt;&lt;/a&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;.{&lt;/span&gt;&lt;span class="n"&gt;err&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
&lt;a id="rest_code_bb85004b52c84b369a22ba1c3393d163-11" name="rest_code_bb85004b52c84b369a22ba1c3393d163-11" href="https://blog.apdu.fr/posts/2026/01/pcsc-sample-in-zig/#rest_code_bb85004b52c84b369a22ba1c3393d163-11"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;a id="rest_code_bb85004b52c84b369a22ba1c3393d163-12" name="rest_code_bb85004b52c84b369a22ba1c3393d163-12" href="https://blog.apdu.fr/posts/2026/01/pcsc-sample-in-zig/#rest_code_bb85004b52c84b369a22ba1c3393d163-12"&gt;&lt;/a&gt;
&lt;a id="rest_code_bb85004b52c84b369a22ba1c3393d163-13" name="rest_code_bb85004b52c84b369a22ba1c3393d163-13" href="https://blog.apdu.fr/posts/2026/01/pcsc-sample-in-zig/#rest_code_bb85004b52c84b369a22ba1c3393d163-13"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;// Connect to 1st reader&lt;/span&gt;
&lt;a id="rest_code_bb85004b52c84b369a22ba1c3393d163-14" name="rest_code_bb85004b52c84b369a22ba1c3393d163-14" href="https://blog.apdu.fr/posts/2026/01/pcsc-sample-in-zig/#rest_code_bb85004b52c84b369a22ba1c3393d163-14"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kr"&gt;var&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;reader_names&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;readerNames&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;a id="rest_code_bb85004b52c84b369a22ba1c3393d163-15" name="rest_code_bb85004b52c84b369a22ba1c3393d163-15" href="https://blog.apdu.fr/posts/2026/01/pcsc-sample-in-zig/#rest_code_bb85004b52c84b369a22ba1c3393d163-15"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;reader_names&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;next&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;reader_name&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;a id="rest_code_bb85004b52c84b369a22ba1c3393d163-16" name="rest_code_bb85004b52c84b369a22ba1c3393d163-16" href="https://blog.apdu.fr/posts/2026/01/pcsc-sample-in-zig/#rest_code_bb85004b52c84b369a22ba1c3393d163-16"&gt;&lt;/a&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;debug&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Using: {s}&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;.{&lt;/span&gt;&lt;span class="n"&gt;reader_name&lt;/span&gt;&lt;span class="p"&gt;});&lt;/span&gt;
&lt;a id="rest_code_bb85004b52c84b369a22ba1c3393d163-17" name="rest_code_bb85004b52c84b369a22ba1c3393d163-17" href="https://blog.apdu.fr/posts/2026/01/pcsc-sample-in-zig/#rest_code_bb85004b52c84b369a22ba1c3393d163-17"&gt;&lt;/a&gt;
&lt;a id="rest_code_bb85004b52c84b369a22ba1c3393d163-18" name="rest_code_bb85004b52c84b369a22ba1c3393d163-18" href="https://blog.apdu.fr/posts/2026/01/pcsc-sample-in-zig/#rest_code_bb85004b52c84b369a22ba1c3393d163-18"&gt;&lt;/a&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="c1"&gt;// Connect to an inserted card:&lt;/span&gt;
&lt;a id="rest_code_bb85004b52c84b369a22ba1c3393d163-19" name="rest_code_bb85004b52c84b369a22ba1c3393d163-19" href="https://blog.apdu.fr/posts/2026/01/pcsc-sample-in-zig/#rest_code_bb85004b52c84b369a22ba1c3393d163-19"&gt;&lt;/a&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="kr"&gt;const&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;card&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&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;reader_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SHARED&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ANY&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;a id="rest_code_bb85004b52c84b369a22ba1c3393d163-20" name="rest_code_bb85004b52c84b369a22ba1c3393d163-20" href="https://blog.apdu.fr/posts/2026/01/pcsc-sample-in-zig/#rest_code_bb85004b52c84b369a22ba1c3393d163-20"&gt;&lt;/a&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="k"&gt;defer&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;card&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;disconnect&lt;/span&gt;&lt;span class="p"&gt;(.&lt;/span&gt;&lt;span class="n"&gt;LEAVE&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;catch&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;err&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;debug&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;a id="rest_code_bb85004b52c84b369a22ba1c3393d163-21" name="rest_code_bb85004b52c84b369a22ba1c3393d163-21" href="https://blog.apdu.fr/posts/2026/01/pcsc-sample-in-zig/#rest_code_bb85004b52c84b369a22ba1c3393d163-21"&gt;&lt;/a&gt;&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="s"&gt;"Unable to disconnect card: {t}&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_bb85004b52c84b369a22ba1c3393d163-22" name="rest_code_bb85004b52c84b369a22ba1c3393d163-22" href="https://blog.apdu.fr/posts/2026/01/pcsc-sample-in-zig/#rest_code_bb85004b52c84b369a22ba1c3393d163-22"&gt;&lt;/a&gt;&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="p"&gt;.{&lt;/span&gt;&lt;span class="n"&gt;err&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
&lt;a id="rest_code_bb85004b52c84b369a22ba1c3393d163-23" name="rest_code_bb85004b52c84b369a22ba1c3393d163-23" href="https://blog.apdu.fr/posts/2026/01/pcsc-sample-in-zig/#rest_code_bb85004b52c84b369a22ba1c3393d163-23"&gt;&lt;/a&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;a id="rest_code_bb85004b52c84b369a22ba1c3393d163-24" name="rest_code_bb85004b52c84b369a22ba1c3393d163-24" href="https://blog.apdu.fr/posts/2026/01/pcsc-sample-in-zig/#rest_code_bb85004b52c84b369a22ba1c3393d163-24"&gt;&lt;/a&gt;
&lt;a id="rest_code_bb85004b52c84b369a22ba1c3393d163-25" name="rest_code_bb85004b52c84b369a22ba1c3393d163-25" href="https://blog.apdu.fr/posts/2026/01/pcsc-sample-in-zig/#rest_code_bb85004b52c84b369a22ba1c3393d163-25"&gt;&lt;/a&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;debug&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Card connected with protocol {f}&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;.{&lt;/span&gt;&lt;span class="n"&gt;card&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;protocol&lt;/span&gt;&lt;span class="p"&gt;});&lt;/span&gt;
&lt;a id="rest_code_bb85004b52c84b369a22ba1c3393d163-26" name="rest_code_bb85004b52c84b369a22ba1c3393d163-26" href="https://blog.apdu.fr/posts/2026/01/pcsc-sample-in-zig/#rest_code_bb85004b52c84b369a22ba1c3393d163-26"&gt;&lt;/a&gt;
&lt;a id="rest_code_bb85004b52c84b369a22ba1c3393d163-27" name="rest_code_bb85004b52c84b369a22ba1c3393d163-27" href="https://blog.apdu.fr/posts/2026/01/pcsc-sample-in-zig/#rest_code_bb85004b52c84b369a22ba1c3393d163-27"&gt;&lt;/a&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="kr"&gt;var&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;buf_response&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;pcsc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;max_buffer_len&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="kt"&gt;u8&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;undefined&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;a id="rest_code_bb85004b52c84b369a22ba1c3393d163-28" name="rest_code_bb85004b52c84b369a22ba1c3393d163-28" href="https://blog.apdu.fr/posts/2026/01/pcsc-sample-in-zig/#rest_code_bb85004b52c84b369a22ba1c3393d163-28"&gt;&lt;/a&gt;
&lt;a id="rest_code_bb85004b52c84b369a22ba1c3393d163-29" name="rest_code_bb85004b52c84b369a22ba1c3393d163-29" href="https://blog.apdu.fr/posts/2026/01/pcsc-sample-in-zig/#rest_code_bb85004b52c84b369a22ba1c3393d163-29"&gt;&lt;/a&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="c1"&gt;// SELECT command&lt;/span&gt;
&lt;a id="rest_code_bb85004b52c84b369a22ba1c3393d163-30" name="rest_code_bb85004b52c84b369a22ba1c3393d163-30" href="https://blog.apdu.fr/posts/2026/01/pcsc-sample-in-zig/#rest_code_bb85004b52c84b369a22ba1c3393d163-30"&gt;&lt;/a&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="kr"&gt;const&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;select&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="kt"&gt;u8&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xA4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x04&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x0A&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xA0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_bb85004b52c84b369a22ba1c3393d163-31" name="rest_code_bb85004b52c84b369a22ba1c3393d163-31" href="https://blog.apdu.fr/posts/2026/01/pcsc-sample-in-zig/#rest_code_bb85004b52c84b369a22ba1c3393d163-31"&gt;&lt;/a&gt;&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x62&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x03&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x01&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x0C&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x06&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x01&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;};&lt;/span&gt;
&lt;a id="rest_code_bb85004b52c84b369a22ba1c3393d163-32" name="rest_code_bb85004b52c84b369a22ba1c3393d163-32" href="https://blog.apdu.fr/posts/2026/01/pcsc-sample-in-zig/#rest_code_bb85004b52c84b369a22ba1c3393d163-32"&gt;&lt;/a&gt;
&lt;a id="rest_code_bb85004b52c84b369a22ba1c3393d163-33" name="rest_code_bb85004b52c84b369a22ba1c3393d163-33" href="https://blog.apdu.fr/posts/2026/01/pcsc-sample-in-zig/#rest_code_bb85004b52c84b369a22ba1c3393d163-33"&gt;&lt;/a&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;debug&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Transmitting APDU: {x}&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;.{&lt;/span&gt;&lt;span class="n"&gt;select&lt;/span&gt;&lt;span class="p"&gt;});&lt;/span&gt;
&lt;a id="rest_code_bb85004b52c84b369a22ba1c3393d163-34" name="rest_code_bb85004b52c84b369a22ba1c3393d163-34" href="https://blog.apdu.fr/posts/2026/01/pcsc-sample-in-zig/#rest_code_bb85004b52c84b369a22ba1c3393d163-34"&gt;&lt;/a&gt;
&lt;a id="rest_code_bb85004b52c84b369a22ba1c3393d163-35" name="rest_code_bb85004b52c84b369a22ba1c3393d163-35" href="https://blog.apdu.fr/posts/2026/01/pcsc-sample-in-zig/#rest_code_bb85004b52c84b369a22ba1c3393d163-35"&gt;&lt;/a&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="kr"&gt;var&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;card&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;transmit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;select&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;buf_response&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;a id="rest_code_bb85004b52c84b369a22ba1c3393d163-36" name="rest_code_bb85004b52c84b369a22ba1c3393d163-36" href="https://blog.apdu.fr/posts/2026/01/pcsc-sample-in-zig/#rest_code_bb85004b52c84b369a22ba1c3393d163-36"&gt;&lt;/a&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;debug&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Received response: {x}&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;.{&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;});&lt;/span&gt;
&lt;a id="rest_code_bb85004b52c84b369a22ba1c3393d163-37" name="rest_code_bb85004b52c84b369a22ba1c3393d163-37" href="https://blog.apdu.fr/posts/2026/01/pcsc-sample-in-zig/#rest_code_bb85004b52c84b369a22ba1c3393d163-37"&gt;&lt;/a&gt;
&lt;a id="rest_code_bb85004b52c84b369a22ba1c3393d163-38" name="rest_code_bb85004b52c84b369a22ba1c3393d163-38" href="https://blog.apdu.fr/posts/2026/01/pcsc-sample-in-zig/#rest_code_bb85004b52c84b369a22ba1c3393d163-38"&gt;&lt;/a&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="c1"&gt;// TEST command&lt;/span&gt;
&lt;a id="rest_code_bb85004b52c84b369a22ba1c3393d163-39" name="rest_code_bb85004b52c84b369a22ba1c3393d163-39" href="https://blog.apdu.fr/posts/2026/01/pcsc-sample-in-zig/#rest_code_bb85004b52c84b369a22ba1c3393d163-39"&gt;&lt;/a&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="kr"&gt;const&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;command&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="kt"&gt;u8&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;};&lt;/span&gt;
&lt;a id="rest_code_bb85004b52c84b369a22ba1c3393d163-40" name="rest_code_bb85004b52c84b369a22ba1c3393d163-40" href="https://blog.apdu.fr/posts/2026/01/pcsc-sample-in-zig/#rest_code_bb85004b52c84b369a22ba1c3393d163-40"&gt;&lt;/a&gt;
&lt;a id="rest_code_bb85004b52c84b369a22ba1c3393d163-41" name="rest_code_bb85004b52c84b369a22ba1c3393d163-41" href="https://blog.apdu.fr/posts/2026/01/pcsc-sample-in-zig/#rest_code_bb85004b52c84b369a22ba1c3393d163-41"&gt;&lt;/a&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;debug&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Transmitting APDU: {x}&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;.{&lt;/span&gt;&lt;span class="n"&gt;command&lt;/span&gt;&lt;span class="p"&gt;});&lt;/span&gt;
&lt;a id="rest_code_bb85004b52c84b369a22ba1c3393d163-42" name="rest_code_bb85004b52c84b369a22ba1c3393d163-42" href="https://blog.apdu.fr/posts/2026/01/pcsc-sample-in-zig/#rest_code_bb85004b52c84b369a22ba1c3393d163-42"&gt;&lt;/a&gt;
&lt;a id="rest_code_bb85004b52c84b369a22ba1c3393d163-43" name="rest_code_bb85004b52c84b369a22ba1c3393d163-43" href="https://blog.apdu.fr/posts/2026/01/pcsc-sample-in-zig/#rest_code_bb85004b52c84b369a22ba1c3393d163-43"&gt;&lt;/a&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;card&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;transmit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;command&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;buf_response&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;a id="rest_code_bb85004b52c84b369a22ba1c3393d163-44" name="rest_code_bb85004b52c84b369a22ba1c3393d163-44" href="https://blog.apdu.fr/posts/2026/01/pcsc-sample-in-zig/#rest_code_bb85004b52c84b369a22ba1c3393d163-44"&gt;&lt;/a&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;debug&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Received response: {x}&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;.{&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;});&lt;/span&gt;
&lt;a id="rest_code_bb85004b52c84b369a22ba1c3393d163-45" name="rest_code_bb85004b52c84b369a22ba1c3393d163-45" href="https://blog.apdu.fr/posts/2026/01/pcsc-sample-in-zig/#rest_code_bb85004b52c84b369a22ba1c3393d163-45"&gt;&lt;/a&gt;
&lt;a id="rest_code_bb85004b52c84b369a22ba1c3393d163-46" name="rest_code_bb85004b52c84b369a22ba1c3393d163-46" href="https://blog.apdu.fr/posts/2026/01/pcsc-sample-in-zig/#rest_code_bb85004b52c84b369a22ba1c3393d163-46"&gt;&lt;/a&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="c1"&gt;// Truncate the 2 last bytes: status word&lt;/span&gt;
&lt;a id="rest_code_bb85004b52c84b369a22ba1c3393d163-47" name="rest_code_bb85004b52c84b369a22ba1c3393d163-47" href="https://blog.apdu.fr/posts/2026/01/pcsc-sample-in-zig/#rest_code_bb85004b52c84b369a22ba1c3393d163-47"&gt;&lt;/a&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="kr"&gt;const&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;response&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="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;len&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;a id="rest_code_bb85004b52c84b369a22ba1c3393d163-48" name="rest_code_bb85004b52c84b369a22ba1c3393d163-48" href="https://blog.apdu.fr/posts/2026/01/pcsc-sample-in-zig/#rest_code_bb85004b52c84b369a22ba1c3393d163-48"&gt;&lt;/a&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;debug&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Text: {s}&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;.{&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;});&lt;/span&gt;
&lt;a id="rest_code_bb85004b52c84b369a22ba1c3393d163-49" name="rest_code_bb85004b52c84b369a22ba1c3393d163-49" href="https://blog.apdu.fr/posts/2026/01/pcsc-sample-in-zig/#rest_code_bb85004b52c84b369a22ba1c3393d163-49"&gt;&lt;/a&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;&lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;a id="rest_code_bb85004b52c84b369a22ba1c3393d163-50" name="rest_code_bb85004b52c84b369a22ba1c3393d163-50" href="https://blog.apdu.fr/posts/2026/01/pcsc-sample-in-zig/#rest_code_bb85004b52c84b369a22ba1c3393d163-50"&gt;&lt;/a&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;debug&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"No reader found&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;.{});&lt;/span&gt;
&lt;a id="rest_code_bb85004b52c84b369a22ba1c3393d163-51" name="rest_code_bb85004b52c84b369a22ba1c3393d163-51" href="https://blog.apdu.fr/posts/2026/01/pcsc-sample-in-zig/#rest_code_bb85004b52c84b369a22ba1c3393d163-51"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;a id="rest_code_bb85004b52c84b369a22ba1c3393d163-52" name="rest_code_bb85004b52c84b369a22ba1c3393d163-52" href="https://blog.apdu.fr/posts/2026/01/pcsc-sample-in-zig/#rest_code_bb85004b52c84b369a22ba1c3393d163-52"&gt;&lt;/a&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;div class="code"&gt;&lt;pre class="code zig"&gt;&lt;a id="rest_code_5be131bbf9ed4dfa98c969f36368a922-1" name="rest_code_5be131bbf9ed4dfa98c969f36368a922-1" href="https://blog.apdu.fr/posts/2026/01/pcsc-sample-in-zig/#rest_code_5be131bbf9ed4dfa98c969f36368a922-1"&gt;&lt;/a&gt;&lt;span class="c1"&gt;//! build.zig&lt;/span&gt;
&lt;a id="rest_code_5be131bbf9ed4dfa98c969f36368a922-2" name="rest_code_5be131bbf9ed4dfa98c969f36368a922-2" href="https://blog.apdu.fr/posts/2026/01/pcsc-sample-in-zig/#rest_code_5be131bbf9ed4dfa98c969f36368a922-2"&gt;&lt;/a&gt;
&lt;a id="rest_code_5be131bbf9ed4dfa98c969f36368a922-3" name="rest_code_5be131bbf9ed4dfa98c969f36368a922-3" href="https://blog.apdu.fr/posts/2026/01/pcsc-sample-in-zig/#rest_code_5be131bbf9ed4dfa98c969f36368a922-3"&gt;&lt;/a&gt;&lt;span class="kr"&gt;const&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;@import&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"std"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;a id="rest_code_5be131bbf9ed4dfa98c969f36368a922-4" name="rest_code_5be131bbf9ed4dfa98c969f36368a922-4" href="https://blog.apdu.fr/posts/2026/01/pcsc-sample-in-zig/#rest_code_5be131bbf9ed4dfa98c969f36368a922-4"&gt;&lt;/a&gt;
&lt;a id="rest_code_5be131bbf9ed4dfa98c969f36368a922-5" name="rest_code_5be131bbf9ed4dfa98c969f36368a922-5" href="https://blog.apdu.fr/posts/2026/01/pcsc-sample-in-zig/#rest_code_5be131bbf9ed4dfa98c969f36368a922-5"&gt;&lt;/a&gt;&lt;span class="kr"&gt;pub&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;fn&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Build&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;a id="rest_code_5be131bbf9ed4dfa98c969f36368a922-6" name="rest_code_5be131bbf9ed4dfa98c969f36368a922-6" href="https://blog.apdu.fr/posts/2026/01/pcsc-sample-in-zig/#rest_code_5be131bbf9ed4dfa98c969f36368a922-6"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kr"&gt;const&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;target&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;standardTargetOptions&lt;/span&gt;&lt;span class="p"&gt;(.{});&lt;/span&gt;
&lt;a id="rest_code_5be131bbf9ed4dfa98c969f36368a922-7" name="rest_code_5be131bbf9ed4dfa98c969f36368a922-7" href="https://blog.apdu.fr/posts/2026/01/pcsc-sample-in-zig/#rest_code_5be131bbf9ed4dfa98c969f36368a922-7"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kr"&gt;const&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;mode&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;standardOptimizeOption&lt;/span&gt;&lt;span class="p"&gt;(.{});&lt;/span&gt;
&lt;a id="rest_code_5be131bbf9ed4dfa98c969f36368a922-8" name="rest_code_5be131bbf9ed4dfa98c969f36368a922-8" href="https://blog.apdu.fr/posts/2026/01/pcsc-sample-in-zig/#rest_code_5be131bbf9ed4dfa98c969f36368a922-8"&gt;&lt;/a&gt;
&lt;a id="rest_code_5be131bbf9ed4dfa98c969f36368a922-9" name="rest_code_5be131bbf9ed4dfa98c969f36368a922-9" href="https://blog.apdu.fr/posts/2026/01/pcsc-sample-in-zig/#rest_code_5be131bbf9ed4dfa98c969f36368a922-9"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kr"&gt;const&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;pcsc_dep&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dependency&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"pcsc"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;.{&lt;/span&gt;
&lt;a id="rest_code_5be131bbf9ed4dfa98c969f36368a922-10" name="rest_code_5be131bbf9ed4dfa98c969f36368a922-10" href="https://blog.apdu.fr/posts/2026/01/pcsc-sample-in-zig/#rest_code_5be131bbf9ed4dfa98c969f36368a922-10"&gt;&lt;/a&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;optimize&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;mode&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_5be131bbf9ed4dfa98c969f36368a922-11" name="rest_code_5be131bbf9ed4dfa98c969f36368a922-11" href="https://blog.apdu.fr/posts/2026/01/pcsc-sample-in-zig/#rest_code_5be131bbf9ed4dfa98c969f36368a922-11"&gt;&lt;/a&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;target&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;target&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_5be131bbf9ed4dfa98c969f36368a922-12" name="rest_code_5be131bbf9ed4dfa98c969f36368a922-12" href="https://blog.apdu.fr/posts/2026/01/pcsc-sample-in-zig/#rest_code_5be131bbf9ed4dfa98c969f36368a922-12"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;});&lt;/span&gt;
&lt;a id="rest_code_5be131bbf9ed4dfa98c969f36368a922-13" name="rest_code_5be131bbf9ed4dfa98c969f36368a922-13" href="https://blog.apdu.fr/posts/2026/01/pcsc-sample-in-zig/#rest_code_5be131bbf9ed4dfa98c969f36368a922-13"&gt;&lt;/a&gt;
&lt;a id="rest_code_5be131bbf9ed4dfa98c969f36368a922-14" name="rest_code_5be131bbf9ed4dfa98c969f36368a922-14" href="https://blog.apdu.fr/posts/2026/01/pcsc-sample-in-zig/#rest_code_5be131bbf9ed4dfa98c969f36368a922-14"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kr"&gt;const&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;pcsc_mod&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;pcsc_dep&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;module&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"pcsc"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;a id="rest_code_5be131bbf9ed4dfa98c969f36368a922-15" name="rest_code_5be131bbf9ed4dfa98c969f36368a922-15" href="https://blog.apdu.fr/posts/2026/01/pcsc-sample-in-zig/#rest_code_5be131bbf9ed4dfa98c969f36368a922-15"&gt;&lt;/a&gt;
&lt;a id="rest_code_5be131bbf9ed4dfa98c969f36368a922-16" name="rest_code_5be131bbf9ed4dfa98c969f36368a922-16" href="https://blog.apdu.fr/posts/2026/01/pcsc-sample-in-zig/#rest_code_5be131bbf9ed4dfa98c969f36368a922-16"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kr"&gt;const&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;exe&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;addExecutable&lt;/span&gt;&lt;span class="p"&gt;(.{&lt;/span&gt;
&lt;a id="rest_code_5be131bbf9ed4dfa98c969f36368a922-17" name="rest_code_5be131bbf9ed4dfa98c969f36368a922-17" href="https://blog.apdu.fr/posts/2026/01/pcsc-sample-in-zig/#rest_code_5be131bbf9ed4dfa98c969f36368a922-17"&gt;&lt;/a&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"pcsc-demo"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_5be131bbf9ed4dfa98c969f36368a922-18" name="rest_code_5be131bbf9ed4dfa98c969f36368a922-18" href="https://blog.apdu.fr/posts/2026/01/pcsc-sample-in-zig/#rest_code_5be131bbf9ed4dfa98c969f36368a922-18"&gt;&lt;/a&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;root_module&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;createModule&lt;/span&gt;&lt;span class="p"&gt;(.{&lt;/span&gt;
&lt;a id="rest_code_5be131bbf9ed4dfa98c969f36368a922-19" name="rest_code_5be131bbf9ed4dfa98c969f36368a922-19" href="https://blog.apdu.fr/posts/2026/01/pcsc-sample-in-zig/#rest_code_5be131bbf9ed4dfa98c969f36368a922-19"&gt;&lt;/a&gt;&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;imports&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="p"&gt;.{&lt;/span&gt;
&lt;a id="rest_code_5be131bbf9ed4dfa98c969f36368a922-20" name="rest_code_5be131bbf9ed4dfa98c969f36368a922-20" href="https://blog.apdu.fr/posts/2026/01/pcsc-sample-in-zig/#rest_code_5be131bbf9ed4dfa98c969f36368a922-20"&gt;&lt;/a&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;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"pcsc"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;module&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;pcsc_mod&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
&lt;a id="rest_code_5be131bbf9ed4dfa98c969f36368a922-21" name="rest_code_5be131bbf9ed4dfa98c969f36368a922-21" href="https://blog.apdu.fr/posts/2026/01/pcsc-sample-in-zig/#rest_code_5be131bbf9ed4dfa98c969f36368a922-21"&gt;&lt;/a&gt;&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
&lt;a id="rest_code_5be131bbf9ed4dfa98c969f36368a922-22" name="rest_code_5be131bbf9ed4dfa98c969f36368a922-22" href="https://blog.apdu.fr/posts/2026/01/pcsc-sample-in-zig/#rest_code_5be131bbf9ed4dfa98c969f36368a922-22"&gt;&lt;/a&gt;&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;optimize&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;mode&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_5be131bbf9ed4dfa98c969f36368a922-23" name="rest_code_5be131bbf9ed4dfa98c969f36368a922-23" href="https://blog.apdu.fr/posts/2026/01/pcsc-sample-in-zig/#rest_code_5be131bbf9ed4dfa98c969f36368a922-23"&gt;&lt;/a&gt;&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;root_source_file&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"src/main.zig"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;a id="rest_code_5be131bbf9ed4dfa98c969f36368a922-24" name="rest_code_5be131bbf9ed4dfa98c969f36368a922-24" href="https://blog.apdu.fr/posts/2026/01/pcsc-sample-in-zig/#rest_code_5be131bbf9ed4dfa98c969f36368a922-24"&gt;&lt;/a&gt;&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;target&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;target&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_5be131bbf9ed4dfa98c969f36368a922-25" name="rest_code_5be131bbf9ed4dfa98c969f36368a922-25" href="https://blog.apdu.fr/posts/2026/01/pcsc-sample-in-zig/#rest_code_5be131bbf9ed4dfa98c969f36368a922-25"&gt;&lt;/a&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;}),&lt;/span&gt;
&lt;a id="rest_code_5be131bbf9ed4dfa98c969f36368a922-26" name="rest_code_5be131bbf9ed4dfa98c969f36368a922-26" href="https://blog.apdu.fr/posts/2026/01/pcsc-sample-in-zig/#rest_code_5be131bbf9ed4dfa98c969f36368a922-26"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;});&lt;/span&gt;
&lt;a id="rest_code_5be131bbf9ed4dfa98c969f36368a922-27" name="rest_code_5be131bbf9ed4dfa98c969f36368a922-27" href="https://blog.apdu.fr/posts/2026/01/pcsc-sample-in-zig/#rest_code_5be131bbf9ed4dfa98c969f36368a922-27"&gt;&lt;/a&gt;
&lt;a id="rest_code_5be131bbf9ed4dfa98c969f36368a922-28" name="rest_code_5be131bbf9ed4dfa98c969f36368a922-28" href="https://blog.apdu.fr/posts/2026/01/pcsc-sample-in-zig/#rest_code_5be131bbf9ed4dfa98c969f36368a922-28"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kr"&gt;const&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;demo_run&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;addRunArtifact&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;exe&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;a id="rest_code_5be131bbf9ed4dfa98c969f36368a922-29" name="rest_code_5be131bbf9ed4dfa98c969f36368a922-29" href="https://blog.apdu.fr/posts/2026/01/pcsc-sample-in-zig/#rest_code_5be131bbf9ed4dfa98c969f36368a922-29"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kr"&gt;const&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;demo_step&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;step&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"demo"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"Run PCSC demo"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;a id="rest_code_5be131bbf9ed4dfa98c969f36368a922-30" name="rest_code_5be131bbf9ed4dfa98c969f36368a922-30" href="https://blog.apdu.fr/posts/2026/01/pcsc-sample-in-zig/#rest_code_5be131bbf9ed4dfa98c969f36368a922-30"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;demo_step&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dependOn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;demo_run&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;step&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;a id="rest_code_5be131bbf9ed4dfa98c969f36368a922-31" name="rest_code_5be131bbf9ed4dfa98c969f36368a922-31" href="https://blog.apdu.fr/posts/2026/01/pcsc-sample-in-zig/#rest_code_5be131bbf9ed4dfa98c969f36368a922-31"&gt;&lt;/a&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;div class="code"&gt;&lt;pre class="code console"&gt;&lt;a id="rest_code_13c6afc579ab44d487c3d49467086cef-1" name="rest_code_13c6afc579ab44d487c3d49467086cef-1" href="https://blog.apdu.fr/posts/2026/01/pcsc-sample-in-zig/#rest_code_13c6afc579ab44d487c3d49467086cef-1"&gt;&lt;/a&gt;&lt;span class="gp"&gt;$ &lt;/span&gt;zig&lt;span class="w"&gt; &lt;/span&gt;build&lt;span class="w"&gt; &lt;/span&gt;demo
&lt;a id="rest_code_13c6afc579ab44d487c3d49467086cef-2" name="rest_code_13c6afc579ab44d487c3d49467086cef-2" href="https://blog.apdu.fr/posts/2026/01/pcsc-sample-in-zig/#rest_code_13c6afc579ab44d487c3d49467086cef-2"&gt;&lt;/a&gt;&lt;span class="go"&gt;Using: Gemalto USB SmartCard Reader&lt;/span&gt;
&lt;a id="rest_code_13c6afc579ab44d487c3d49467086cef-3" name="rest_code_13c6afc579ab44d487c3d49467086cef-3" href="https://blog.apdu.fr/posts/2026/01/pcsc-sample-in-zig/#rest_code_13c6afc579ab44d487c3d49467086cef-3"&gt;&lt;/a&gt;&lt;span class="go"&gt;Card connected with protocol T=1&lt;/span&gt;
&lt;a id="rest_code_13c6afc579ab44d487c3d49467086cef-4" name="rest_code_13c6afc579ab44d487c3d49467086cef-4" href="https://blog.apdu.fr/posts/2026/01/pcsc-sample-in-zig/#rest_code_13c6afc579ab44d487c3d49467086cef-4"&gt;&lt;/a&gt;&lt;span class="go"&gt;Transmitting APDU: 00a404000aa00000006203010c0601&lt;/span&gt;
&lt;a id="rest_code_13c6afc579ab44d487c3d49467086cef-5" name="rest_code_13c6afc579ab44d487c3d49467086cef-5" href="https://blog.apdu.fr/posts/2026/01/pcsc-sample-in-zig/#rest_code_13c6afc579ab44d487c3d49467086cef-5"&gt;&lt;/a&gt;&lt;span class="go"&gt;Received response: 9000&lt;/span&gt;
&lt;a id="rest_code_13c6afc579ab44d487c3d49467086cef-6" name="rest_code_13c6afc579ab44d487c3d49467086cef-6" href="https://blog.apdu.fr/posts/2026/01/pcsc-sample-in-zig/#rest_code_13c6afc579ab44d487c3d49467086cef-6"&gt;&lt;/a&gt;&lt;span class="go"&gt;Transmitting APDU: 00000000&lt;/span&gt;
&lt;a id="rest_code_13c6afc579ab44d487c3d49467086cef-7" name="rest_code_13c6afc579ab44d487c3d49467086cef-7" href="https://blog.apdu.fr/posts/2026/01/pcsc-sample-in-zig/#rest_code_13c6afc579ab44d487c3d49467086cef-7"&gt;&lt;/a&gt;&lt;span class="go"&gt;Received response: 48656c6c6f20776f726c64219000&lt;/span&gt;
&lt;a id="rest_code_13c6afc579ab44d487c3d49467086cef-8" name="rest_code_13c6afc579ab44d487c3d49467086cef-8" href="https://blog.apdu.fr/posts/2026/01/pcsc-sample-in-zig/#rest_code_13c6afc579ab44d487c3d49467086cef-8"&gt;&lt;/a&gt;&lt;span class="go"&gt;Text: Hello world!&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/section&gt;
&lt;section id="conclusion"&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Zig is a relatively new programming language. We can already find a
PC/SC wrapper for it. That is great!&lt;/p&gt;
&lt;p&gt;If you are working on a Free Software PC/SC wrapper that is not yet on
my list please let me know.&lt;/p&gt;
&lt;/section&gt;</description><category>code</category><guid>https://blog.apdu.fr/posts/2026/01/pcsc-sample-in-zig/</guid><pubDate>Sat, 31 Jan 2026 14:29:33 GMT</pubDate></item><item><title>pcsc-lite backward &amp; forward compatible with itself</title><link>https://blog.apdu.fr/posts/2026/01/pcsc-lite-backward-forward-compatible-with-itself/</link><dc:creator>Ludovic Rousseau</dc:creator><description>&lt;p&gt;pcsc-lite 2.4.1 now provides a backward &amp;amp; forward compatible mechanism
that supports both the current and previous &lt;cite&gt;internal&lt;/cite&gt; communication
protocols.&lt;/p&gt;
&lt;p&gt;The communication protocol we are talking about here is the one between
the client (libpcsclite) and the server (pcscd) sides. It is an
internal-only protocol that is specific to pcsc-lite.&lt;/p&gt;
&lt;section id="protocol-negotiation"&gt;
&lt;h2&gt;Protocol negotiation&lt;/h2&gt;
&lt;p&gt;To ensure that the client and server are using the same protocol, they
negotiate the procotol they know. If they are different, the server
will refuse the connection. In the application (client side), the
&lt;a class="reference external" href="https://pcsclite.apdu.fr/api/group__API.html#gaa1b8970169fd4883a6dc4a8f43f19b67"&gt;SCardEstablishContext()&lt;/a&gt;
function will return the error code &lt;code class="docutils literal"&gt;SCARD_E_SERVICE_STOPPED&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Up to version 2.4.0, both the server and the client only supported one
protocol version (version 4:5).&lt;/p&gt;
&lt;/section&gt;
&lt;section id="sandboxes"&gt;
&lt;h2&gt;Sandboxes&lt;/h2&gt;
&lt;p&gt;&lt;a class="reference external" href="https://www.wikipedia.org/wiki/Flatpak"&gt;Flatpack&lt;/a&gt;, &lt;a class="reference external" href="https://www.wikipedia.org/wiki/Snap_(software)"&gt;Snap&lt;/a&gt;, &lt;a class="reference external" href="https://www.wikipedia.org/wiki/AppImage"&gt;AppImage&lt;/a&gt; and other sandbox
technologies are now used to distribute applications.&lt;/p&gt;
&lt;p&gt;In some/many cases, the server (pcscd daemon) running on the host comes
from a different version of pcsc-lite than the client used in the
sandbox. If the internal communication protocol differs, the
communication is not possible.&lt;/p&gt;
&lt;p&gt;I receive requests to solve this problem. See:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://github.com/LudovicRousseau/PCSC/issues/199"&gt;Backward protocol compatibility #199&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://github.com/LudovicRousseau/PCSC/issues/246"&gt;Runtime-configurable IPC dir #246&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://salsa.debian.org/rousseau/PCSC/-/issues/22"&gt;Support multiple versions of the internal protocol: fix Flatpak issues&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="protocol-history"&gt;
&lt;h2&gt;Protocol History&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th class="head"&gt;&lt;p&gt;pcsc-lite version&lt;/p&gt;&lt;/th&gt;
&lt;th class="head"&gt;&lt;p&gt;Release Date&lt;/p&gt;&lt;/th&gt;
&lt;th class="head"&gt;&lt;p&gt;Protocol version&lt;/p&gt;&lt;/th&gt;
&lt;th class="head"&gt;&lt;p&gt;Compatible with&lt;/p&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;p&gt;2.4.1&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;1 Jan 2026&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;4:5&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;4:4 &amp;amp; 4:5&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;p&gt;2.4.0&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;19 Oct 2025&lt;/p&gt;&lt;/td&gt;
&lt;td rowspan="5"&gt;&lt;p&gt;4:5&lt;/p&gt;&lt;/td&gt;
&lt;td rowspan="5"&gt;&lt;p&gt;4:5&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;p&gt;2.3.3&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;2 Apr 2025&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;p&gt;2.3.2&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;26 Mar 2025&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;p&gt;2.3.1&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;24 Dec 2024&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;p&gt;2.3.0&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;3 Aug 2024&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;p&gt;2.2.3&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;26 May 2024&lt;/p&gt;&lt;/td&gt;
&lt;td rowspan="3"&gt;&lt;p&gt;4:4&lt;/p&gt;&lt;/td&gt;
&lt;td rowspan="3"&gt;&lt;p&gt;4:4&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;p&gt;...&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;!--  --&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;p&gt;1.8.24&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;12 Oct 2018&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;p&gt;1.8.23&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;18 Dec 2017&lt;/p&gt;&lt;/td&gt;
&lt;td rowspan="3"&gt;&lt;p&gt;4:3&lt;/p&gt;&lt;/td&gt;
&lt;td rowspan="3"&gt;&lt;p&gt;4:3&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;p&gt;...&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;!--  --&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;p&gt;1.8.9&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;16 Oct 2013&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;p&gt;1.8.8&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;16 Jan 2012&lt;/p&gt;&lt;/td&gt;
&lt;td rowspan="3"&gt;&lt;p&gt;4:2&lt;/p&gt;&lt;/td&gt;
&lt;td rowspan="3"&gt;&lt;p&gt;4:2&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;p&gt;...&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;!--  --&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;p&gt;1.6.5&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;12 Oct 2010&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/section&gt;
&lt;section id="new-protocol-negotiation"&gt;
&lt;h2&gt;New protocol negotiation&lt;/h2&gt;
&lt;p&gt;From pcsc-lite 2.4.1 onwards, the protocol negotiation is smarter.&lt;/p&gt;
&lt;p&gt;The daemon side will accept the current version and also the previous
one. Versions 4:5 and 4:4 are accepted. It is straightforward, as the
only change with version 4:5 is the addition of a new command
(command &lt;code class="docutils literal"&gt;CMD_GET_READER_EVENTS&lt;/code&gt; introduced in commit
&lt;a class="reference external" href="https://salsa.debian.org/rousseau/PCSC/-/commit/53f57ed700bcd0bc47d970dc674ba3fd5ee5b387"&gt;53f57ed700bcd0bc47d970dc674ba3fd5ee5b387&lt;/a&gt;).
Old clients will simply not use the new command.&lt;/p&gt;
&lt;p&gt;The client side will also accept the current version and the previous
one. These are versions 4:5 and 4:4. Using a recent client (protocol 4:5)
with an old server (protocol 4:4) will have a small side effect. The
&lt;code class="docutils literal"&gt;SCardGetStatusChange()&lt;/code&gt; function will not include the number of
reader events (see
&lt;a class="reference external" href="https://blog.apdu.fr/posts/2024/08/improved-scardgetstatuschange-for-pnpnotification-special-reader/"&gt;Improved SCardGetStatusChange() for "\\?PnP?\Notification" special reader&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Applications using pcsc-lite 2.4.1 can use a daemon as old as
pcsc-lite version 1.8.24, released in October 2018.&lt;/p&gt;
&lt;p&gt;A pcscd daemon from pcsc-lite 2.4.1 can handle clients as old as the
same pcsc-lite version 1.8.24 from October 2018.&lt;/p&gt;
&lt;p&gt;Supporting the (older) protocol version 4:3 may be possible but would
require more efforts and be more complex. Contact me if you require
this.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="conclusion"&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;This change should help mix PC/SC servers and clients from more
different versions.&lt;/p&gt;
&lt;p&gt;This should prevent people from using ugly hacks.&lt;/p&gt;
&lt;/section&gt;</description><category>pcsc-lite</category><guid>https://blog.apdu.fr/posts/2026/01/pcsc-lite-backward-forward-compatible-with-itself/</guid><pubDate>Wed, 07 Jan 2026 15:55:10 GMT</pubDate></item><item><title>New version of pcsc-lite: 2.4.1</title><link>https://blog.apdu.fr/posts/2026/01/new-version-of-pcsc-lite-241/</link><dc:creator>Ludovic Rousseau</dc:creator><description>&lt;p&gt;I have just released a new version of &lt;a class="reference external" href="https://pcsclite.apdu.fr/files/"&gt;pcsc-lite 2.4.1&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://pcsclite.apdu.fr/"&gt;pcsc-lite&lt;/a&gt; is a Free Software
implementation of the &lt;a class="reference external" href="https://www.wikipedia.org/wiki/PC/SC"&gt;PC/SC&lt;/a&gt;
(also known as WinSCard) API for Unix systems. It provides an API for
using &lt;a class="reference external" href="https://www.wikipedia.org/wiki/Smart_card"&gt;smart cards&lt;/a&gt; and
smart card readers.&lt;/p&gt;
&lt;p&gt;This version offers backwards compatibility for both the client and
server components. It should now be easier to mix and match different
versions of pcscd and libpcsclite (and using different internal protocol
versions).&lt;/p&gt;
&lt;section id="changes"&gt;
&lt;h2&gt;Changes:&lt;/h2&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;2.4.1: Ludovic Rousseau&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;1 January 2026&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Add backward version support on the client side&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add backward version support on the server side&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;hotplug libudev: rescan the USB bus with &lt;code class="docutils literal"&gt;pcscd &lt;span class="pre"&gt;--hotplug&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;fix a value in &lt;code class="docutils literal"&gt;pcscd.service&lt;/code&gt; systemd file&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;meson: install systemd files even if libsystemd is not used&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>pcsc-lite</category><guid>https://blog.apdu.fr/posts/2026/01/new-version-of-pcsc-lite-241/</guid><pubDate>Wed, 07 Jan 2026 14:33:25 GMT</pubDate></item><item><title>Blog statistics for 2025</title><link>https://blog.apdu.fr/posts/2026/01/blog-statistics-for-2025/</link><dc:creator>Ludovic Rousseau</dc:creator><description>&lt;p&gt;Dear readers,&lt;/p&gt;
&lt;p&gt;I wish you a happy New Year 2026!&lt;/p&gt;
&lt;p&gt;In 2025 I published 26 articles on this blog.&lt;/p&gt;
&lt;img alt="/images/2026/01/stats_2025.png" class="align-center" src="https://blog.apdu.fr/images/2026/01/stats_2025.png"&gt;
&lt;section id="statistics"&gt;
&lt;h2&gt;Statistics&lt;/h2&gt;
&lt;img alt="/images/2026/01/usage.png" class="align-center" src="https://blog.apdu.fr/images/2026/01/usage.png"&gt;
&lt;p&gt;In 2025 the blog served 355,108 pages (+57%) totalling 35.89 GB
(+35%). I would say that a large part of the increase in traffic is due
to artificial intelligence bots scraping the website.&lt;/p&gt;
&lt;section id="by-month"&gt;
&lt;h3&gt;By month&lt;/h3&gt;
&lt;p&gt;Only the top 5 articles.&lt;/p&gt;
&lt;table&gt;
&lt;caption&gt;January 2025&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;Title&lt;/p&gt;&lt;/th&gt;
&lt;th class="head"&gt;&lt;p&gt;Hits&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;&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; (November 2023)&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;372&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;&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; (October 2024)&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;343&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;&lt;a class="reference external" href="https://blog.apdu.fr/posts/2024/05/pcsc-lite-now-uses-meson-build-tool/"&gt;pcsc-lite now uses meson build tool&lt;/a&gt; (May 2024)&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;216&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;&lt;a class="reference external" href="https://blog.apdu.fr/posts/2022/10/ubuntu-2204-and-pcscd-auto-start-failure/"&gt;Ubuntu 22.04 and pcscd auto start failure&lt;/a&gt; (October 2022)&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;185&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;&lt;a class="reference external" href="https://blog.apdu.fr/posts/2025/01/blog-statistics-for-2024/"&gt;Blog statistics for 2024&lt;/a&gt; (January 2025)&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;179&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;table&gt;
&lt;caption&gt;February 2025&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;Title&lt;/p&gt;&lt;/th&gt;
&lt;th class="head"&gt;&lt;p&gt;Hits&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;&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; (October 2024)&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;399&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;&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; (November 2023)&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;336&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;&lt;a class="reference external" href="https://blog.apdu.fr/posts/2025/01/rss-feed-for-my-blog/"&gt;RSS feed for my blog&lt;/a&gt; (January 2025)&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;315&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;&lt;a class="reference external" href="https://blog.apdu.fr/posts/2017/05/pcscscan-on-windows/"&gt;pcsc_scan on Windows&lt;/a&gt; (May 2017)&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;220&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;&lt;a class="reference external" href="https://blog.apdu.fr/posts/2022/10/ubuntu-2204-and-pcscd-auto-start-failure/"&gt;Ubuntu 22.04 and pcscd auto start failure&lt;/a&gt; (October 2022)&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;202&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;table&gt;
&lt;caption&gt;March 2025&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;Title&lt;/p&gt;&lt;/th&gt;
&lt;th class="head"&gt;&lt;p&gt;Hits&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;&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; (November 2023)&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;376&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;&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; (October 2024)&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;353&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;&lt;a class="reference external" href="https://blog.apdu.fr/posts/2025/03/results-of-the-blog-survey/"&gt;Results of the blog survey&lt;/a&gt; (March 2025)&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;302&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;&lt;a class="reference external" href="https://blog.apdu.fr/posts/2024/05/pcsc-lite-now-uses-meson-build-tool/"&gt;pcsc-lite now uses meson build tool&lt;/a&gt; (May 2024)&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;205&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;&lt;a class="reference external" href="https://blog.apdu.fr/posts/2017/05/pcscscan-on-windows/"&gt;pcsc_scan on Windows&lt;/a&gt; (May 2017)&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;202&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;table&gt;
&lt;caption&gt;April 2025&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;Title&lt;/p&gt;&lt;/th&gt;
&lt;th class="head"&gt;&lt;p&gt;Hits&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;&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; (November 2023)&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;397&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;&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; (October 2024)&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;342&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;&lt;a class="reference external" href="https://blog.apdu.fr/posts/2025/04/ignore-readers-using-pcsclite_ignore-udev-property/"&gt;Ignore readers using PCSCLITE_IGNORE udev property&lt;/a&gt; (April 2025)&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;322&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;&lt;a class="reference external" href="https://blog.apdu.fr/posts/2025/04/new-version-of-pcsc-lite-233/"&gt;New version of pcsc-lite: 2.3.3&lt;/a&gt; (April 2025)&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;320&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;&lt;a class="reference external" href="https://blog.apdu.fr/posts/2025/04/resources-release-in-pyscard/"&gt;Resources release in PySCard&lt;/a&gt; (April 2025)&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;226&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;table&gt;
&lt;caption&gt;May 2025&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;Title&lt;/p&gt;&lt;/th&gt;
&lt;th class="head"&gt;&lt;p&gt;Hits&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;&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; (April 2025)&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;399&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;&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; (November 2023)&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;362&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;&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; (October 2024)&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;302&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;&lt;a class="reference external" href="https://blog.apdu.fr/posts/2010/04/pcsc-sample-in-c/"&gt;PCSC sample in C&lt;/a&gt; (November 2010)&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;213&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;&lt;a class="reference external" href="https://blog.apdu.fr/posts/2010/10/card-auto-power-on-and-off/"&gt;Card auto power on and off&lt;/a&gt; (October 2010)&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;181&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;table&gt;
&lt;caption&gt;June 2025&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;Title&lt;/p&gt;&lt;/th&gt;
&lt;th class="head"&gt;&lt;p&gt;Hits&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;&lt;a class="reference external" href="https://blog.apdu.fr/posts/2025/04/resources-release-in-pyscard/"&gt;Resources release in PySCard&lt;/a&gt; (April 2025)&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;522&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;&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; (October 2024)&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;518&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;&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; (November 2023)&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;489&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;&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; (April 2025)&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;423&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;&lt;a class="reference external" href="https://blog.apdu.fr/posts/2024/02/macos-sonoma-bug-scardcontrol-part-2/"&gt;macOS Sonoma bug: SCardControl() (part 2)&lt;/a&gt; (February 2024)&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;362&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;table&gt;
&lt;caption&gt;July 2025&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;Title&lt;/p&gt;&lt;/th&gt;
&lt;th class="head"&gt;&lt;p&gt;Hits&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;&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; (November 2023)&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;1220&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;&lt;a class="reference external" href="https://blog.apdu.fr/posts/2025/04/resources-release-in-pyscard/"&gt;Resources release in PySCard&lt;/a&gt; (April 2025)&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;1193&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;&lt;a class="reference external" href="https://blog.apdu.fr/posts/2024/02/macos-sonoma-bug-scardcontrol-part-2/"&gt;macOS Sonoma bug: SCardControl() (part 2)&lt;/a&gt; (February 2024)&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;1075&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;&lt;a class="reference external" href="https://blog.apdu.fr/posts/2025/04/ignore-readers-using-pcsclite_ignore-udev-property/"&gt;Ignore readers using PCSCLITE_IGNORE udev property&lt;/a&gt; (April 2025)&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;776&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;&lt;a class="reference external" href="https://blog.apdu.fr/posts/2023/10/macos-sonoma-the-reader-name-should-include-the-usb-serial-number/"&gt;macOS Sonoma: The reader name should include the USB serial number&lt;/a&gt; (October 2023)&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;744&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;table&gt;
&lt;caption&gt;August 2025&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;Title&lt;/p&gt;&lt;/th&gt;
&lt;th class="head"&gt;&lt;p&gt;Hits&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;&lt;a class="reference external" href="https://blog.apdu.fr/posts/2024/02/macos-sonoma-bug-scardcontrol-part-2/"&gt;macOS Sonoma bug: SCardControl() (part 2)&lt;/a&gt; (February 2024)&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;1195&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;&lt;a class="reference external" href="https://blog.apdu.fr/posts/2025/04/resources-release-in-pyscard/"&gt;Resources release in PySCard&lt;/a&gt; (April 2025)&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;1174&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;&lt;a class="reference external" href="https://blog.apdu.fr/posts/2023/10/macos-sonoma-the-reader-name-should-include-the-usb-serial-number/"&gt;macOS Sonoma: The reader name should include the USB serial number&lt;/a&gt; (October 2023)&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;946&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;&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; (November 2023)&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;832&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;&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; (October 2024)&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;630&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;table&gt;
&lt;caption&gt;September 2025&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;Title&lt;/p&gt;&lt;/th&gt;
&lt;th class="head"&gt;&lt;p&gt;Hits&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;&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; (November 2023)&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;1677&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;&lt;a class="reference external" href="https://blog.apdu.fr/posts/2024/02/macos-sonoma-bug-scardcontrol-part-2/"&gt;macOS Sonoma bug: SCardControl() (part 2)&lt;/a&gt; (February 2024)&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;1634&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;&lt;a class="reference external" href="https://blog.apdu.fr/posts/2025/04/resources-release-in-pyscard/"&gt;Resources release in PySCard&lt;/a&gt; (April 2025)&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;1372&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;&lt;a class="reference external" href="https://blog.apdu.fr/posts/2024/08/improved-scardgetstatuschange-for-pnpnotification-special-reader/"&gt;Improved SCardGetStatusChange() for "\\?PnP?\Notification" special reader&lt;/a&gt; (August 2024)&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;1214&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;&lt;a class="reference external" href="https://blog.apdu.fr/posts/2023/10/macos-sonoma-the-reader-name-should-include-the-usb-serial-number/"&gt;macOS Sonoma: The reader name should include the USB serial number&lt;/a&gt; (October 2023)&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;1050&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;table&gt;
&lt;caption&gt;October 2025&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;Title&lt;/p&gt;&lt;/th&gt;
&lt;th class="head"&gt;&lt;p&gt;Hits&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;&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; (November 2023)&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;1631&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;&lt;a class="reference external" href="https://blog.apdu.fr/posts/2024/02/macos-sonoma-bug-scardcontrol-part-2/"&gt;macOS Sonoma bug: SCardControl() (part 2)&lt;/a&gt; (February 2024)&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;1611&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;&lt;a class="reference external" href="https://blog.apdu.fr/posts/2025/04/resources-release-in-pyscard/"&gt;Resources release in PySCard&lt;/a&gt; (April 2025)&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;1595&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;&lt;a class="reference external" href="https://blog.apdu.fr/posts/2023/10/macos-sonoma-the-reader-name-should-include-the-usb-serial-number/"&gt;macOS Sonoma: The reader name should include the USB serial number&lt;/a&gt; (October 2023)&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;1243&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;&lt;a class="reference external" href="https://blog.apdu.fr/posts/2024/08/improved-scardgetstatuschange-for-pnpnotification-special-reader/"&gt;Improved SCardGetStatusChange() for "\\?PnP?\Notification" special reader&lt;/a&gt; (August 2024)&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;1071&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;table&gt;
&lt;caption&gt;November 2025&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;Title&lt;/p&gt;&lt;/th&gt;
&lt;th class="head"&gt;&lt;p&gt;Hits&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;&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; (November 2023)&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;1377&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;&lt;a class="reference external" href="https://blog.apdu.fr/posts/2024/08/improved-scardgetstatuschange-for-pnpnotification-special-reader/"&gt;Improved SCardGetStatusChange() for "\\?PnP?\Notification" special reader&lt;/a&gt; (August 2024)&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;1299&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;&lt;a class="reference external" href="https://blog.apdu.fr/posts/2025/10/pcscd-runs-as-pcscd-user/"&gt;pcscd runs as pcscd user&lt;/a&gt; (October 2025)&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;1231&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;&lt;a class="reference external" href="https://blog.apdu.fr/posts/2024/02/macos-sonoma-bug-scardcontrol-part-2/"&gt;macOS Sonoma bug: SCardControl() (part 2)&lt;/a&gt; (February 2024)&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;1115&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;&lt;a class="reference external" href="https://blog.apdu.fr/posts/2023/10/macos-sonoma-the-reader-name-should-include-the-usb-serial-number/"&gt;macOS Sonoma: The reader name should include the USB serial number&lt;/a&gt; (October 2023)&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;1015&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;table&gt;
&lt;caption&gt;December 2025&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;Title&lt;/p&gt;&lt;/th&gt;
&lt;th class="head"&gt;&lt;p&gt;Hits&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;&lt;a class="reference external" href="https://blog.apdu.fr/posts/2024/02/macos-sonoma-bug-scardcontrol-part-2/"&gt;macOS Sonoma bug: SCardControl() (part 2)&lt;/a&gt; (February 2024)&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;1607&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;&lt;a class="reference external" href="https://blog.apdu.fr/posts/2024/08/improved-scardgetstatuschange-for-pnpnotification-special-reader/"&gt;Improved SCardGetStatusChange() for "\\?PnP?\Notification" special reader&lt;/a&gt; (August 2024)&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;1006&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;&lt;a class="reference external" href="https://blog.apdu.fr/posts/2025/10/pcscd-runs-as-pcscd-user/"&gt;pcscd runs as pcscd user&lt;/a&gt; (October 2025)&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;940&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;&lt;a class="reference external" href="https://blog.apdu.fr/posts/2025/04/resources-release-in-pyscard/"&gt;Resources release in PySCard&lt;/a&gt; (April 2025)&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;895&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;&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; (November 2023)&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;847&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/section&gt;
&lt;section id="full-year-2025"&gt;
&lt;h3&gt;Full year 2025&lt;/h3&gt;
&lt;p&gt;Only the top 20 articles&lt;/p&gt;
&lt;table&gt;
&lt;caption&gt;Complete year 2025&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;Title&lt;/p&gt;&lt;/th&gt;
&lt;th class="head"&gt;&lt;p&gt;Hits&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;&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; (November 2023)&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;9916&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;&lt;a class="reference external" href="https://blog.apdu.fr/posts/2024/02/macos-sonoma-bug-scardcontrol-part-2/"&gt;macOS Sonoma bug: SCardControl() (part 2)&lt;/a&gt; (February 2024)&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;8953&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;&lt;a class="reference external" href="https://blog.apdu.fr/posts/2025/04/resources-release-in-pyscard/"&gt;Resources release in PySCard&lt;/a&gt; (April 2025)&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;8152&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;&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; (October 2024)&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;6859&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;&lt;a class="reference external" href="https://blog.apdu.fr/posts/2023/10/macos-sonoma-the-reader-name-should-include-the-usb-serial-number/"&gt;macOS Sonoma: The reader name should include the USB serial number&lt;/a&gt; (October 2023)&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;6313&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;&lt;a class="reference external" href="https://blog.apdu.fr/posts/2024/08/improved-scardgetstatuschange-for-pnpnotification-special-reader/"&gt;Improved SCardGetStatusChange() for "\\?PnP?\Notification" special reader&lt;/a&gt; (August 2024)&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;6143&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;&lt;a class="reference external" href="https://blog.apdu.fr/posts/2025/04/ignore-readers-using-pcsclite_ignore-udev-property/"&gt;Ignore readers using PCSCLITE_IGNORE udev property&lt;/a&gt; (April 2025)&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;4800&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;&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; (June 2024)&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;4601&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;&lt;a class="reference external" href="https://blog.apdu.fr/posts/2023/11/pcsc-lite-and-polkit/"&gt;pcsc-lite and polkit&lt;/a&gt; (November 2023)&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;4062&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;&lt;a class="reference external" href="https://blog.apdu.fr/posts/2023/09/macos-sonoma-bug-scardcontrol-returns-scard_e_not_transacted/"&gt;macOS Sonoma bug: SCardControl() returns SCARD_E_NOT_TRANSACTED&lt;/a&gt; (September 2023)&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;3993&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;p&gt;11&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;&lt;a class="reference external" href="https://blog.apdu.fr/posts/2024/12/gnupg-and-pcsc-conflicts-episode-3/"&gt;GnuPG and PC/SC conflicts, episode 3&lt;/a&gt; (December 2024)&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;3926&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;p&gt;12&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;&lt;a class="reference external" href="https://blog.apdu.fr/posts/2010/04/pcsc-sample-in-c/"&gt;PCSC sample in C&lt;/a&gt; (November 2010)&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;3466&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;p&gt;13&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;&lt;a class="reference external" href="https://blog.apdu.fr/posts/2025/08/reading-a-sim-card-in-hackable-magazine/"&gt;Reading a SIM card (in Hackable magazine)&lt;/a&gt; (August 2025)&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;3294&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;p&gt;14&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;&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; (April 2025)&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;3047&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;p&gt;15&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;&lt;a class="reference external" href="https://blog.apdu.fr/posts/2025/10/pcscd-runs-as-pcscd-user/"&gt;pcscd runs as pcscd user&lt;/a&gt; (October 2025)&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;2774&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;p&gt;16&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;&lt;a class="reference external" href="https://blog.apdu.fr/posts/2017/05/pcscscan-on-windows/"&gt;pcsc_scan on Windows&lt;/a&gt; (May 2017)&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;2583&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;p&gt;17&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;&lt;a class="reference external" href="https://blog.apdu.fr/posts/2025/06/in-case-of-smart-card-issues-on-macos/"&gt;In case of smart card issues on macOS&lt;/a&gt; (June 2025)&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;2556&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;p&gt;18&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;&lt;a class="reference external" href="https://blog.apdu.fr/posts/2024/05/pcsc-lite-now-uses-meson-build-tool/"&gt;pcsc-lite now uses meson build tool&lt;/a&gt; (May 2024)&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;2503&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;p&gt;19&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;&lt;a class="reference external" href="https://blog.apdu.fr/posts/2022/10/ubuntu-2204-and-pcscd-auto-start-failure/"&gt;Ubuntu 22.04 and pcscd auto start failure&lt;/a&gt; (October 2022)&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;2497&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;p&gt;20&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;&lt;a class="reference external" href="https://blog.apdu.fr/posts/2011/11/pcscd-auto-start-using-systemd/"&gt;pcscd auto start using systemd&lt;/a&gt; (November 2011)&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;2267&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/section&gt;
&lt;section id="analysis"&gt;
&lt;h3&gt;Analysis&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;only 30% of the top 20 articles were published in 2025&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;30% of the top 20 articles are about macOS&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;the &lt;a class="reference external" href="https://blog.apdu.fr/posts/2010/04/pcsc-sample-in-c/"&gt;PCSC sample in C&lt;/a&gt; from 2010 is still in a strong position: 12th&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://blog.apdu.fr/posts/2017/05/pcscscan-on-windows/"&gt;pcsc_scan on Windows&lt;/a&gt; has dropped to 16th position (down from 6th in 2024)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;I am surprised by the &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;
being in 8th position (up from 12th last year) position since it is a
very niche use case&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;Last year, I asked people to contact me with suggestions for new
subjects or tools. However, I received nothing.&lt;/p&gt;
&lt;p&gt;This blog does not contain any advertising. If you would like to support
me you can become a &lt;a class="reference external" href="https://blog.apdu.fr/posts/2020/01/github-sponsors/"&gt;GitHub Sponsors&lt;/a&gt;.&lt;/p&gt;
&lt;/section&gt;</description><guid>https://blog.apdu.fr/posts/2026/01/blog-statistics-for-2025/</guid><pubDate>Fri, 02 Jan 2026 15:11:08 GMT</pubDate></item><item><title>ssh-add -s: Could not add card: agent refused operation</title><link>https://blog.apdu.fr/posts/2025/12/ssh-add-s-could-not-add-card-agent-refused-operation/</link><dc:creator>Ludovic Rousseau</dc:creator><description>&lt;section id="problem"&gt;
&lt;h2&gt;Problem&lt;/h2&gt;
&lt;p&gt;I wanted to use ssh-agent with a PKCS#11 library on macOS. So I tried
adding the smart card using the command &lt;code class="docutils literal"&gt;&lt;span class="pre"&gt;ssh-add&lt;/span&gt; &lt;span class="pre"&gt;-s&lt;/span&gt;&lt;/code&gt; but I received
the following error:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code text"&gt;&lt;a id="rest_code_99e6db7515e140a79b11fb71fced56a5-1" name="rest_code_99e6db7515e140a79b11fb71fced56a5-1" href="https://blog.apdu.fr/posts/2025/12/ssh-add-s-could-not-add-card-agent-refused-operation/#rest_code_99e6db7515e140a79b11fb71fced56a5-1"&gt;&lt;/a&gt; $ ssh-add -s /Library/Frameworks/xyz.framework/Versions/A/libxyz.dylib
&lt;a id="rest_code_99e6db7515e140a79b11fb71fced56a5-2" name="rest_code_99e6db7515e140a79b11fb71fced56a5-2" href="https://blog.apdu.fr/posts/2025/12/ssh-add-s-could-not-add-card-agent-refused-operation/#rest_code_99e6db7515e140a79b11fb71fced56a5-2"&gt;&lt;/a&gt; Enter passphrase for PKCS#11:
&lt;a id="rest_code_99e6db7515e140a79b11fb71fced56a5-3" name="rest_code_99e6db7515e140a79b11fb71fced56a5-3" href="https://blog.apdu.fr/posts/2025/12/ssh-add-s-could-not-add-card-agent-refused-operation/#rest_code_99e6db7515e140a79b11fb71fced56a5-3"&gt;&lt;/a&gt;&lt;span class="hll"&gt; Could not add card "/Library/Frameworks/xyz.framework/Versions/A/libxyz.dylib": agent refused operation
&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The error &lt;code class="docutils literal"&gt;agent refused operation&lt;/code&gt; is not very informative. From the
logs of the PKCS#11 library, I can see that the library is not being
used at all.  The problem does not come from the library, which would
have returned an error.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="analysis"&gt;
&lt;h2&gt;Analysis&lt;/h2&gt;
&lt;p&gt;In order to analyse the problem, I tried debugging the version of
OpenSSH provided by Apple. However, I encountered another issue. See
my previous article &lt;a class="reference external" href="https://blog.apdu.fr/posts/2025/12/apple-and-openssh-modified-source-code/"&gt;Apple and OpenSSH modified source code&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;To find out exactly what is happening, we need to obtain the logs
from &lt;code class="docutils literal"&gt;&lt;span class="pre"&gt;ssh-agent&lt;/span&gt;&lt;/code&gt; command, rather than the &lt;code class="docutils literal"&gt;&lt;span class="pre"&gt;ssh-add&lt;/span&gt;&lt;/code&gt; command. So I
restart ssh-agent in debug mode and I re-run the ssh-add command.&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code text"&gt;&lt;a id="rest_code_1f76ce934e3642f9a1e5141e52883347-1" name="rest_code_1f76ce934e3642f9a1e5141e52883347-1" href="https://blog.apdu.fr/posts/2025/12/ssh-add-s-could-not-add-card-agent-refused-operation/#rest_code_1f76ce934e3642f9a1e5141e52883347-1"&gt;&lt;/a&gt; $ ssh-agent -d
&lt;a id="rest_code_1f76ce934e3642f9a1e5141e52883347-2" name="rest_code_1f76ce934e3642f9a1e5141e52883347-2" href="https://blog.apdu.fr/posts/2025/12/ssh-add-s-could-not-add-card-agent-refused-operation/#rest_code_1f76ce934e3642f9a1e5141e52883347-2"&gt;&lt;/a&gt; [...]
&lt;a id="rest_code_1f76ce934e3642f9a1e5141e52883347-3" name="rest_code_1f76ce934e3642f9a1e5141e52883347-3" href="https://blog.apdu.fr/posts/2025/12/ssh-add-s-could-not-add-card-agent-refused-operation/#rest_code_1f76ce934e3642f9a1e5141e52883347-3"&gt;&lt;/a&gt; debug1: new_socket: type = CONNECTION
&lt;a id="rest_code_1f76ce934e3642f9a1e5141e52883347-4" name="rest_code_1f76ce934e3642f9a1e5141e52883347-4" href="https://blog.apdu.fr/posts/2025/12/ssh-add-s-could-not-add-card-agent-refused-operation/#rest_code_1f76ce934e3642f9a1e5141e52883347-4"&gt;&lt;/a&gt; debug2: fd 4 setting O_NONBLOCK
&lt;a id="rest_code_1f76ce934e3642f9a1e5141e52883347-5" name="rest_code_1f76ce934e3642f9a1e5141e52883347-5" href="https://blog.apdu.fr/posts/2025/12/ssh-add-s-could-not-add-card-agent-refused-operation/#rest_code_1f76ce934e3642f9a1e5141e52883347-5"&gt;&lt;/a&gt; debug1: process_message: socket 1 (fd=4) type 20
&lt;a id="rest_code_1f76ce934e3642f9a1e5141e52883347-6" name="rest_code_1f76ce934e3642f9a1e5141e52883347-6" href="https://blog.apdu.fr/posts/2025/12/ssh-add-s-could-not-add-card-agent-refused-operation/#rest_code_1f76ce934e3642f9a1e5141e52883347-6"&gt;&lt;/a&gt; debug2: process_add_smartcard_key: entering
&lt;a id="rest_code_1f76ce934e3642f9a1e5141e52883347-7" name="rest_code_1f76ce934e3642f9a1e5141e52883347-7" href="https://blog.apdu.fr/posts/2025/12/ssh-add-s-could-not-add-card-agent-refused-operation/#rest_code_1f76ce934e3642f9a1e5141e52883347-7"&gt;&lt;/a&gt;&lt;span class="hll"&gt; refusing PKCS#11 add of "/Library/Frameworks/xyz.framework/Versions/A/libxyz.dylib": provider not allowed
&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The error here is different: &lt;code class="docutils literal"&gt;provider not allowed&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The &lt;code class="docutils literal"&gt;&lt;span class="pre"&gt;ssh-agent&lt;/span&gt;&lt;/code&gt; manpage indicates an option &lt;code class="docutils literal"&gt;&lt;span class="pre"&gt;[-P&lt;/span&gt; allowed_providers]&lt;/code&gt;.&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code text"&gt;&lt;a id="rest_code_4dc18c040f55464dbadc4d676633d1ab-1" name="rest_code_4dc18c040f55464dbadc4d676633d1ab-1" href="https://blog.apdu.fr/posts/2025/12/ssh-add-s-could-not-add-card-agent-refused-operation/#rest_code_4dc18c040f55464dbadc4d676633d1ab-1"&gt;&lt;/a&gt;-P allowed_providers
&lt;a id="rest_code_4dc18c040f55464dbadc4d676633d1ab-2" name="rest_code_4dc18c040f55464dbadc4d676633d1ab-2" href="https://blog.apdu.fr/posts/2025/12/ssh-add-s-could-not-add-card-agent-refused-operation/#rest_code_4dc18c040f55464dbadc4d676633d1ab-2"&gt;&lt;/a&gt;        Specify  a pattern-list of acceptable paths for PKCS#11 provider
&lt;a id="rest_code_4dc18c040f55464dbadc4d676633d1ab-3" name="rest_code_4dc18c040f55464dbadc4d676633d1ab-3" href="https://blog.apdu.fr/posts/2025/12/ssh-add-s-could-not-add-card-agent-refused-operation/#rest_code_4dc18c040f55464dbadc4d676633d1ab-3"&gt;&lt;/a&gt;        and FIDO authenticator middleware shared libraries that  may  be
&lt;a id="rest_code_4dc18c040f55464dbadc4d676633d1ab-4" name="rest_code_4dc18c040f55464dbadc4d676633d1ab-4" href="https://blog.apdu.fr/posts/2025/12/ssh-add-s-could-not-add-card-agent-refused-operation/#rest_code_4dc18c040f55464dbadc4d676633d1ab-4"&gt;&lt;/a&gt;        used with the -S or -s options to ssh-add(1).  Libraries that do
&lt;a id="rest_code_4dc18c040f55464dbadc4d676633d1ab-5" name="rest_code_4dc18c040f55464dbadc4d676633d1ab-5" href="https://blog.apdu.fr/posts/2025/12/ssh-add-s-could-not-add-card-agent-refused-operation/#rest_code_4dc18c040f55464dbadc4d676633d1ab-5"&gt;&lt;/a&gt;        not match the pattern list will be refused.  The default list is
&lt;a id="rest_code_4dc18c040f55464dbadc4d676633d1ab-6" name="rest_code_4dc18c040f55464dbadc4d676633d1ab-6" href="https://blog.apdu.fr/posts/2025/12/ssh-add-s-could-not-add-card-agent-refused-operation/#rest_code_4dc18c040f55464dbadc4d676633d1ab-6"&gt;&lt;/a&gt;        "/usr/lib*/*,/usr/local/lib*/*".
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The problem is clear. The PKCS#11 library is located in
&lt;code class="docutils literal"&gt;/Library/Frameworks/&lt;/code&gt;, which is not included in the default list of
allowed directories.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="solutions"&gt;
&lt;h2&gt;Solutions&lt;/h2&gt;
&lt;p&gt;Update the way &lt;code class="docutils literal"&gt;&lt;span class="pre"&gt;ssh-agent&lt;/span&gt;&lt;/code&gt; is started by adding the
&lt;code class="docutils literal"&gt;&lt;span class="pre"&gt;-P&lt;/span&gt; &lt;span class="pre"&gt;'/Library/Frameworks/*'&lt;/span&gt;&lt;/code&gt; option.&lt;/p&gt;
&lt;p&gt;Alternatively, copy or install the PKCS#11 library somewhere in the
&lt;code class="docutils literal"&gt;/usr/local/lib/&lt;/code&gt; directory.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="conclusion"&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;I wrote this blog article to ensure that it is indexed by web search engines,
so that other people can find it when searching for the ssh-add error
&lt;code class="docutils literal"&gt;agent refused operation&lt;/code&gt; message.&lt;/p&gt;
&lt;p&gt;Using Free Software is really helpful when you need to debug an issue.
You can read (and modify) the source code to identify the problem.&lt;/p&gt;
&lt;p&gt;I should sometimes read a program's manpage before looking at its source
code 😀.&lt;/p&gt;
&lt;/section&gt;</description><category>macOS</category><guid>https://blog.apdu.fr/posts/2025/12/ssh-add-s-could-not-add-card-agent-refused-operation/</guid><pubDate>Fri, 26 Dec 2025 12:43:36 GMT</pubDate></item></channel></rss>