PCSC 7.0.0
dotnet add package PCSC --version 7.0.0
NuGet\Install-Package PCSC -Version 7.0.0
<PackageReference Include="PCSC" Version="7.0.0" />
paket add PCSC --version 7.0.0
#r "nuget: PCSC, 7.0.0"
// Install PCSC as a Cake Addin #addin nuget:?package=PCSC&version=7.0.0 // Install PCSC as a Cake Tool #tool nuget:?package=PCSC&version=7.0.0
PC/SC wrapper classes for .NET
Introduction
The pcsc-sharp library is wrapper that provides access to the Personal Computer/Smart Card Resource Manager using the system's native PC/SC API. It implements partial ISO7816 support and is written to run on both Windows and Unix (.Net Core or Mono using PCSC Lite).
pcsc-sharp is not a fully featured library for accessing vendor specific protocols. You must implement those protocols / applications yourself. For example: You can use pcsc-sharp to access NXP's Mirfare RFID chips, but pcsc-sharp does not provide any APDUs to request KEYs, authorize, etc.
pcsc-sharp does not contain any device drivers. A PC/SC compliant reader + driver is mandatory.
The GitHub issue tracker is not a support forum. Please contact your vendor for reader or card specific questions.
You can find PC/SC specific documentation here:
- Windows: Smart Card Resource Manager API
- Linux: PCSC lite project
Supported Operating systems
Windows (winscard.dll)
- Windows 11 64-bit
- Windows 10 64-bit Professional
- Windows 10 32-bit Professional
Linux (PC/SC lite)
- Ubuntu Linux 64-bit
- Ubuntu Linux 32-bit
MacOS X
Raspberry Pi / Linux ARM
- linux-arm
Quick start
Establish the resource manager context
Each operation requires a valid context. See SCardEstablishContext for more information.
var contextFactory = ContextFactory.Instance;
using (var context = contextFactory.Establish(SCardScope.System)) {
// your code
}
Basic rules / best practices:
- One context per smartcard / reader.
- One context per
SCardMonitor
. - The context must be disposed of after usage to free system resources.
- The context must not be disposed of if your application still accesses the smartcard / reader.
List all connected smartcard readers
See SCardListReaders.
var contextFactory = ContextFactory.Instance;
using (var context = contextFactory.Establish(SCardScope.System)) {
Console.WriteLine("Currently connected readers: ");
var readerNames = context.GetReaders();
foreach (var readerName in readerNames) {
Console.WriteLine("\t" + readerName);
}
}
Send ISO7816 APDUs
var contextFactory = ContextFactory.Instance;
using (var ctx = contextFactory.Establish(SCardScope.System)) {
using (var isoReader = new IsoReader(ctx, "ACME Smartcard reader", SCardShareMode.Shared, SCardProtocol.Any, false)) {
var apdu = new CommandApdu(IsoCase.Case2Short, isoReader.ActiveProtocol) {
CLA = 0x00, // Class
Instruction = InstructionCode.GetChallenge,
P1 = 0x00, // Parameter 1
P2 = 0x00, // Parameter 2
Le = 0x08 // Expected length of the returned data
};
var response = isoReader.Transmit(apdu);
Console.WriteLine("SW1 SW2 = {0:X2} {1:X2}", response.SW1, response.SW2);
// ..
}
}
Read reader attributes
using (var ctx = ContextFactory.Instance.Establish(SCardScope.System)) {
using (var reader = ctx.ConnectReader("OMNIKEY CardMan 5x21 0", SCardShareMode.Shared, SCardProtocol.Any)) {
var cardAtr = reader.GetAttrib(SCardAttribute.AtrString);
Console.WriteLine("ATR: {0}", BitConverter.ToString(cardAtr));
Console.ReadKey();
}
}
Monitor reader events
var monitorFactory = MonitorFactory.Instance;
var monitor = monitorFactory.Create(SCardScope.System);
// connect events here..
monitor.StatusChanged += (sender, args) =>
Console.WriteLine($"New state: {args.NewState}");
monitor.Start("OMNIKEY CardMan 5x21-CL 0");
Console.ReadKey(); // Press any key to exit
monitor.Cancel();
monitor.Dispose();
More example code
Checkout the Examples directory.
Build from source
Required software
Build tools
- .Net 8.0 SDKs (Multi target build)
Compile with
dotnet build -c Release
Build instructions for Raspberry Pi
Compile with
dotnet publish -r linux-arm
Product | Versions Compatible and additional computed target framework versions. |
---|---|
.NET | net5.0 was computed. net5.0-windows was computed. net6.0 was computed. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 was computed. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 is compatible. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. |
.NET Core | netcoreapp2.0 was computed. netcoreapp2.1 was computed. netcoreapp2.2 was computed. netcoreapp3.0 was computed. netcoreapp3.1 was computed. |
.NET Standard | netstandard2.0 is compatible. netstandard2.1 is compatible. |
.NET Framework | net461 was computed. net462 was computed. net463 was computed. net47 was computed. net471 was computed. net472 was computed. net48 was computed. net481 was computed. |
MonoAndroid | monoandroid was computed. |
MonoMac | monomac was computed. |
MonoTouch | monotouch was computed. |
Tizen | tizen40 was computed. tizen60 was computed. |
Xamarin.iOS | xamarinios was computed. |
Xamarin.Mac | xamarinmac was computed. |
Xamarin.TVOS | xamarintvos was computed. |
Xamarin.WatchOS | xamarinwatchos was computed. |
-
.NETStandard 2.0
- No dependencies.
-
.NETStandard 2.1
- No dependencies.
-
net8.0
- No dependencies.
NuGet packages (11)
Showing the top 5 NuGet packages that depend on PCSC:
Package | Downloads |
---|---|
PCSC.Iso7816
Implements partial ISO7816 support (APDU etc.) for PCSC. |
|
PCSC.Reactive
Reactive extensions for PC/SC. Observables from smart card monitor events. |
|
ArsMagna.Rfid
ArsMagna RFID services |
|
MRTD.NET
MRTD.NET |
|
ThaiNationalIDCard
Thailand National ID Smart card Helper |
GitHub repositories (1)
Showing the top 1 popular GitHub repositories that depend on PCSC:
Repository | Stars |
---|---|
chakphanu/ThaiNationalIDCard
ThaiNational IDCard(Smartcard) helper
|
Version | Downloads | Last updated |
---|---|---|
7.0.0 | 13,907 | 8/23/2024 |
6.2.0 | 55,620 | 12/30/2023 |
6.1.3 | 59,268 | 12/19/2022 |
6.1.2 | 5,447 | 12/1/2022 |
6.1.1 | 1,202 | 12/1/2022 |
6.1.0 | 1,171 | 11/30/2022 |
6.0.0 | 40,364 | 3/9/2022 |
5.1.0 | 31,960 | 12/6/2021 |
5.0.0 | 150,533 | 12/7/2019 |
4.2.0 | 26,302 | 7/3/2019 |
4.1.1 | 3,264 | 5/26/2019 |
4.1.0 | 1,524 | 5/26/2019 |
4.0.3 | 4,851 | 2/18/2019 |
4.0.2 | 3,909 | 2/4/2019 |
4.0.1 | 8,732 | 9/24/2018 |
4.0.0 | 83,885 | 2/25/2018 |
3.8.0 | 56,275 | 10/8/2017 |
3.7.0 | 10,632 | 6/22/2017 |
3.6.1 | 16,190 | 4/12/2017 |
3.6.0 | 13,015 | 11/18/2016 |
3.5.3 | 2,270 | 11/3/2016 |
3.5.2 | 1,345 | 11/2/2016 |
3.5.1 | 18,782 | 5/24/2016 |
3.5.0 | 6,873 | 4/19/2016 |
3.4.1 | 2,333 | 3/5/2016 |
3.4.0 | 1,400 | 2/11/2016 |
3.3.1 | 1,894 | 1/21/2016 |
3.3.0 | 2,525 | 10/28/2015 |
3.2.0 | 2,648 | 7/31/2015 |
3.1.0 | 1,646 | 7/12/2013 |
3.0.0 | 1,648 | 5/20/2013 |
Breaking change introduced in 7.0.0: The *IsoReader.MaxReceiveSize* default value changed from 128 to 255. See [pull request #118](https://github.com/danm-de/pcsc-sharp/pull/118) for more information.