pcsc-mini
Version:
PC/SC (smart card) API bindings for Linux, MacOS, and Win32.
345 lines (303 loc) • 8.31 kB
TypeScript
/**
* Maximum number of bytes in an ATR value.
*/
export const MAX_ATR_LEN: number;
/**
* Maximum number of bytes that can be sent/received in input/output buffers.
*/
export const MAX_BUFFER_LEN: number;
/**
* Maximum number of connected readers that will be monitored by `pcsc-mini`.
*/
export const MAX_READERS: number;
/**
* Card disposition action to perform when disconnecting or reconnecting.
*/
export enum CardDisposition {
/** Eject the card. (Not currently supported by any known hardware.) */
EJECT = 3,
/** Do nothing. */
LEAVE = 0,
/** Reset the card (warm reset). */
RESET = 1,
/** Power down the card (cold reset). */
UNPOWER = 2,
}
/**
* Card connection mode.
*/
export enum CardMode {
/**
* Initiate direct connection to the reader without the need for a card to be
* present. The connection is shared on Unix systems and exclusive on Windows.
*/
DIRECT = 3,
/**
* No other processes will be able to access the reader until disconnected.
*/
EXCLUSIVE = 1,
/**
* Other processes will be able access the reader as well.
*/
SHARED = 2,
}
/**
* Status of a card in a reader, if any.
*/
export enum CardStatus {
ABSENT = 2,
NEGOTIABLE = 32,
POWERED = 16,
PRESENT = 4,
SPECIFIC = 64,
SWALLOWED = 8,
UNKNOWN = 1,
}
/**
* Card communication protocol flags.
*/
export enum Protocol {
/** The T=0 protocol. */
T0 = 1,
/** The T=1 protocol. */
T1 = 2,
/**
* Used when specifying a preferred protocol to indicate that an appropriate
* protocol for the card may be automatically selected.
*/
ANY = T0 | T1,
/**
* Used with memory type cards. This value varies based on OS.
*
* Can be used in conjunction with {@link CardMode.DIRECT} for connecting with
* no initial protocol negotiated (after which if must be manually set with an
* appropriate reader control command).
*/
RAW = number,
/** The T=15 protocol. */
T15 = 8,
/**
* No protocol set.
*/
UNSET = 0,
}
/**
* Status of connected (or previously connected) card reader.
*/
export enum ReaderStatus {
ATR_MATCH = 64,
CHANGED = 2,
EMPTY = 16,
EXCLUSIVE = 128,
IGNORE = 1,
IN_USE = 256,
MUTE = 512,
PRESENT = 32,
UNAVAILABLE = 8,
UNKNOWN = 4,
UNPOWERED = 1024,
}
/**
* Represents a card connection session created via {@link Client.connect}
*/
export interface Card {
attributeGet(id: number, outputBuffer?: ArrayBuffer): Promise<Uint8Array>;
attributeSet(id: number, value: Uint8Array): Promise<void>;
control(
code: number,
command?: Uint8Array,
outputBuffer?: ArrayBuffer,
): Promise<Uint8Array>;
disconnect(then: CardDisposition): Promise<void>;
protocol(): Protocol;
reconnect(mode: CardMode, disposition: CardDisposition): Promise<Protocol>;
state(): Promise<CardState>;
transaction(): Promise<Transaction>;
transmit(
protocol?: Protocol,
input: Uint8Array,
outputBuffer?: ArrayBuffer,
): Promise<Uint8Array>;
}
export interface CardState {
atr: Uint8Array;
protocol: Protocol;
readerName: string;
status: number;
}
export interface Client {
connect(
readerName: string,
mode: CardMode,
protocol?: Protocol,
): Promise<Card>;
start(onStateChange: ReaderChangeHandler, onError: ErrorHandler): void;
stop(): void;
}
/**
* Error type thrown/rejected from native API calls and emitted by the
* reader state background monitoring thread.
*/
export interface Err extends Error {
/**
* The associated error code. This may originate from `pcsc-mini`, the
* underlying PCSC implementation, or the Node-API.
*/
code: string;
}
export type ErrorHandler = (err: Err) => void;
/**
* Event type emitted by the background monitoring thread on state changes.
*/
export interface ReaderState {
atr: Uint8Array;
name: string;
status: number;
}
export type ReaderChangeHandler = (
readerName: string,
status: number,
atr: Uint8Array,
) => void;
/**
*
* Represents a temporary {@link CardMode.EXCLUSIVE} connection session, which
* can be started from a {@link CardMode.SHARED} connection via
* {@link Card.transaction}().
*
* > [!IMPORTANT]
* > {@link Transaction.end}() must be called when done.
*
* ## Example:
* ```ts
* import * as pcsc from "pcsc-mini";
*
* async function longRunningProcess(card: pcsc.Card) {
* const txn = card.transaction();
*
* try {
* const r1 = await card.transmit(Uint8Array.of(0xca, 0xfe, 0xf0, 0x0d));
* const r2 = await card.transmit(Uint8Array.of(0xfa, 0xde, 0xfa, 0xce));
*
* return processResults(r1, r2);
* } catch (err) {
* console.error("Something went wrong:", err);
* } finally {
* txn.end(pcsc.CardDisposition.LEAVE);
* }
* }
* ```
*/
export interface Transaction {
/**
* Closes the transaction and restores the previous card connection mode.
*
* @param then - The action to take after ending the transaction.
*
* @throws {@link Err}
*/
end(then: CardDisposition): Promise<void>;
}
/**
* Human-readable string representation of the given card status flags.
*
* @throws {@link Err}
*/
export function cardStatusString(rawStatus: number): string;
/**
* Constructs a platform-specific PCSC reader control code
* from the given function code.
*
* ## Example:
* ```ts
* import * as pcsc from "pcsc-mini";
*
* const IOCTL_GET_FEATURE_REQUEST = pcsc.controlCode(3400);
*
* function getFeatures(card: pcsc.Card): Promise<Uint8Array> {
* return card.control(IOCTL_GET_FEATURE_REQUEST);
* }
* ```
*
* @throws {@link Err}
*/
export function controlCode(functionCode: number): number;
/**
* Creates a new {@link Client} - no connection is established with the PCSC
* server until {@link Client.start} is called.
*
* @throws {@link Err}
*/
export function newClient(): Client;
/**
* String representation of the given card connection protocol.
*
* @throws {@link Err}
*/
export function protocolString(protocol: Protocol): string;
/**
* Human-readable string representation of the given reader status flags.
*
* @throws {@link Err}
*/
export function readerStatusString(rawStatus: number): string;
export namespace attributes {
export enum Class {
COMMUNICATIONS = 2,
ICC_STATE = 9,
IFD_PROTOCOL = 8,
MECHANICAL = 6,
POWER_MGMT = 4,
PROTOCOL = 3,
SECURITY = 5,
SYSTEM = 32767,
VENDOR_DEFINED = 7,
VENDOR_INFO = 1,
}
export namespace ids {
export const ASYNC_PROTOCOL_TYPES: number;
export const ATR_STRING: number;
export const CHANNEL_ID: number;
export const CHARACTERISTICS: number;
export const CURRENT_BWT: number;
export const CURRENT_CLK: number;
export const CURRENT_CWT: number;
export const CURRENT_D: number;
export const CURRENT_EBC_ENCODING: number;
export const CURRENT_F: number;
export const CURRENT_IFSC: number;
export const CURRENT_IFSD: number;
export const CURRENT_IO_STATE: number;
export const CURRENT_N: number;
export const CURRENT_PROTOCOL_TYPE: number;
export const CURRENT_W: number;
export const DEFAULT_CLK: number;
export const DEFAULT_DATA_RATE: number;
export const DEVICE_FRIENDLY_NAME: number;
export const DEVICE_FRIENDLY_NAME_W: number;
export const DEVICE_IN_USE: number;
export const DEVICE_SYSTEM_NAME: number;
export const DEVICE_SYSTEM_NAME_W: number;
export const DEVICE_UNIT: number;
export const ESC_AUTH_REQUEST: number;
export const ESC_CANCEL: number;
export const ESC_RESET: number;
export const EXTENDED_BWT: number;
export const ICC_INTERFACE_STATUS: number;
export const ICC_PRESENCE: number;
export const ICC_TYPE_PER_ATR: number;
export const MAX_CLK: number;
export const MAX_DATA_RATE: number;
export const MAX_IFSD: number;
export const MAX_INPUT: number;
export const POWER_MGMT_SUPPORT: number;
export const SUPPRESS_T1_IFS_REQUEST: number;
export const SYNC_PROTOCOL_TYPES: number;
export const USER_AUTH_INPUT_DEVICE: number;
export const USER_TO_CARD_AUTH_DEVICE: number;
export const VENDOR_IFD_SERIAL_NO: number;
export const VENDOR_IFD_TYPE: number;
export const VENDOR_IFD_VERSION: number;
export const VENDOR_NAME: number;
}
}