flutter_smart_card

A Flutter plugin for communicating with smart card readers via USB. Supports Android, macOS, and Windows with platform-specific native implementations.

Features

  • List readers - Discover connected smart card readers
  • Connect/Disconnect - Establish and close sessions with smart cards
  • Transmit APDU - Send and receive raw APDU commands

Platform Support

Platform Implementation Notes
Android USB Host (CCID) Direct USB communication, requires USB host support
macOS CryptoTokenKit Uses system smart card framework
Windows WinSCard Uses Windows Smart Card API

Installation

Add to your pubspec.yaml:

dependencies:
  flutter_smart_card: ^0.1.0

Platform Setup

Android

Add USB host feature to your AndroidManifest.xml:

<uses-feature android:name="android.hardware.usb.host" android:required="true" />

The plugin handles USB permission requests automatically.

Minimum SDK: 26 (Android 8.0)

macOS

Add the following entitlement to your macos/Runner/DebugProfile.entitlements and macos/Runner/Release.entitlements:

<key>com.apple.security.smartcard</key>
<true/>

Windows

No additional setup required. The plugin uses the WinSCard API which is available on all Windows versions.

Usage

Basic Smart Card Communication

import 'package:flutter_smart_card/flutter_smart_card.dart';

final smartCard = FlutterSmartCard();

// List available readers
final readers = await smartCard.listReaders();

// Connect to the first reader
if (readers.isNotEmpty) {
  await smartCard.connect(readers.first);

  // Send an APDU command (e.g. SELECT PSE)
  final pse = '1PAY.SYS.DDF01'.codeUnits;
  final response = await smartCard.transmit(
    Uint8List.fromList([0x00, 0xA4, 0x04, 0x00, pse.length, ...pse, 0x00]),
  );

  // Disconnect
  await smartCard.disconnect();
}

API Reference

FlutterSmartCard

Method Description
listReaders() Returns a list of connected smart card reader names
connect(String reader) Connects to the specified reader, returns true on success
transmit(Uint8List apdu) Sends an APDU command and returns the response
disconnect() Disconnects from the current reader

License

BSD 3-Clause License. See LICENSE for details.