smartcard 3.2.1 → 3.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,107 +0,0 @@
1
- // @ts-check
2
- 'use strict';
3
-
4
- /**
5
- * Control codes and feature constants for PC/SC smart card operations
6
- */
7
-
8
- /**
9
- * Generate a control code (platform-specific)
10
- * @param {number} code - The control code number
11
- * @returns {number} The platform-specific control code
12
- */
13
- function SCARD_CTL_CODE(code) {
14
- if (process.platform === 'win32') {
15
- // Windows: (FILE_DEVICE_SMARTCARD << 16) + (code << 2)
16
- // FILE_DEVICE_SMARTCARD = 0x31
17
- return (0x31 << 16) + (code << 2);
18
- } else {
19
- // macOS/Linux: 0x42000000 + code
20
- return 0x42000000 + code;
21
- }
22
- }
23
-
24
- // Common control codes
25
- const CM_IOCTL_GET_FEATURE_REQUEST = SCARD_CTL_CODE(3400);
26
-
27
- // CCID Feature tags (from CCID spec)
28
- const FEATURE_VERIFY_PIN_START = 0x01;
29
- const FEATURE_VERIFY_PIN_FINISH = 0x02;
30
- const FEATURE_MODIFY_PIN_START = 0x03;
31
- const FEATURE_MODIFY_PIN_FINISH = 0x04;
32
- const FEATURE_GET_KEY_PRESSED = 0x05;
33
- const FEATURE_VERIFY_PIN_DIRECT = 0x06;
34
- const FEATURE_MODIFY_PIN_DIRECT = 0x07;
35
- const FEATURE_MCT_READER_DIRECT = 0x08;
36
- const FEATURE_MCT_UNIVERSAL = 0x09;
37
- const FEATURE_IFD_PIN_PROPERTIES = 0x0A;
38
- const FEATURE_ABORT = 0x0B;
39
- const FEATURE_SET_SPE_MESSAGE = 0x0C;
40
- const FEATURE_VERIFY_PIN_DIRECT_APP_ID = 0x0D;
41
- const FEATURE_MODIFY_PIN_DIRECT_APP_ID = 0x0E;
42
- const FEATURE_WRITE_DISPLAY = 0x0F;
43
- const FEATURE_GET_KEY = 0x10;
44
- const FEATURE_IFD_DISPLAY_PROPERTIES = 0x11;
45
- const FEATURE_GET_TLV_PROPERTIES = 0x12;
46
- const FEATURE_CCID_ESC_COMMAND = 0x13;
47
-
48
- /**
49
- * Parse feature TLV response from CM_IOCTL_GET_FEATURE_REQUEST
50
- * @param {Buffer} response - The TLV response buffer
51
- * @returns {Map<number, number>} Map of feature tag to control code
52
- */
53
- function parseFeatures(response) {
54
- const features = new Map();
55
- let offset = 0;
56
-
57
- while (offset + 4 <= response.length) {
58
- const tag = response[offset];
59
- const length = response[offset + 1];
60
-
61
- if (length === 4 && offset + 2 + length <= response.length) {
62
- // Big-endian control code
63
- const controlCode =
64
- (response[offset + 2] << 24) |
65
- (response[offset + 3] << 16) |
66
- (response[offset + 4] << 8) |
67
- response[offset + 5];
68
- features.set(tag, controlCode);
69
- }
70
-
71
- offset += 2 + length;
72
- }
73
-
74
- return features;
75
- }
76
-
77
- module.exports = {
78
- // Control code generator
79
- SCARD_CTL_CODE,
80
-
81
- // Common control codes
82
- CM_IOCTL_GET_FEATURE_REQUEST,
83
-
84
- // CCID Feature tags
85
- FEATURE_VERIFY_PIN_START,
86
- FEATURE_VERIFY_PIN_FINISH,
87
- FEATURE_MODIFY_PIN_START,
88
- FEATURE_MODIFY_PIN_FINISH,
89
- FEATURE_GET_KEY_PRESSED,
90
- FEATURE_VERIFY_PIN_DIRECT,
91
- FEATURE_MODIFY_PIN_DIRECT,
92
- FEATURE_MCT_READER_DIRECT,
93
- FEATURE_MCT_UNIVERSAL,
94
- FEATURE_IFD_PIN_PROPERTIES,
95
- FEATURE_ABORT,
96
- FEATURE_SET_SPE_MESSAGE,
97
- FEATURE_VERIFY_PIN_DIRECT_APP_ID,
98
- FEATURE_MODIFY_PIN_DIRECT_APP_ID,
99
- FEATURE_WRITE_DISPLAY,
100
- FEATURE_GET_KEY,
101
- FEATURE_IFD_DISPLAY_PROPERTIES,
102
- FEATURE_GET_TLV_PROPERTIES,
103
- FEATURE_CCID_ESC_COMMAND,
104
-
105
- // Helper functions
106
- parseFeatures,
107
- };
package/lib/index.d.ts DELETED
@@ -1,325 +0,0 @@
1
- /// <reference types="node" />
2
-
3
- import { EventEmitter } from 'events';
4
-
5
- /**
6
- * Reader state information returned from waitForChange
7
- */
8
- export interface ReaderState {
9
- name: string;
10
- state: number;
11
- changed: boolean;
12
- atr: Buffer | null;
13
- }
14
-
15
- /**
16
- * Card status information
17
- */
18
- export interface CardStatus {
19
- state: number;
20
- protocol: number;
21
- atr: Buffer;
22
- }
23
-
24
- /**
25
- * Options for card.transmit()
26
- */
27
- export interface TransmitOptions {
28
- /**
29
- * Maximum receive buffer size in bytes.
30
- * Default: 258 (standard APDU: 256 data + 2 status bytes)
31
- * Maximum: 262144 (256KB for extended APDUs)
32
- */
33
- maxRecvLength?: number;
34
- }
35
-
36
- /**
37
- * Represents a connected smart card
38
- */
39
- export interface Card {
40
- /** The active protocol (T0, T1, or RAW) */
41
- readonly protocol: number;
42
- /** Whether the card is still connected */
43
- readonly connected: boolean;
44
- /** The card's ATR (Answer To Reset) */
45
- readonly atr: Buffer | null;
46
-
47
- /**
48
- * Transmit an APDU command to the card
49
- * @param command - The command buffer or byte array
50
- * @param options - Optional transmit options
51
- * @returns Promise resolving to the response buffer
52
- */
53
- transmit(command: Buffer | number[], options?: TransmitOptions): Promise<Buffer>;
54
-
55
- /**
56
- * Send a control command to the reader
57
- * @param code - Control code
58
- * @param data - Optional data buffer
59
- * @returns Promise resolving to the response buffer
60
- */
61
- control(code: number, data?: Buffer | number[]): Promise<Buffer>;
62
-
63
- /**
64
- * Get the current card status
65
- * @returns Card status object
66
- */
67
- getStatus(): CardStatus;
68
-
69
- /**
70
- * Disconnect from the card
71
- * @param disposition - What to do with the card (default: SCARD_LEAVE_CARD)
72
- */
73
- disconnect(disposition?: number): void;
74
-
75
- /**
76
- * Reconnect to the card (async)
77
- * @param shareMode - Share mode
78
- * @param protocol - Preferred protocol(s)
79
- * @param initialization - Initialization action
80
- * @returns Promise resolving to the new active protocol
81
- */
82
- reconnect(shareMode?: number, protocol?: number, initialization?: number): Promise<number>;
83
- }
84
-
85
- /**
86
- * Represents a smart card reader
87
- */
88
- export interface Reader {
89
- /** The reader name */
90
- readonly name: string;
91
- /** Current reader state flags */
92
- readonly state: number;
93
- /** ATR of the card if present */
94
- readonly atr: Buffer | null;
95
-
96
- /**
97
- * Connect to a card in the reader
98
- * @param shareMode - Share mode (default: SCARD_SHARE_SHARED)
99
- * @param protocol - Preferred protocol(s) (default: T0 | T1)
100
- * @returns Promise resolving to a Card object
101
- */
102
- connect(shareMode?: number, protocol?: number): Promise<Card>;
103
- }
104
-
105
- /**
106
- * Low-level PC/SC context
107
- */
108
- export declare class Context {
109
- constructor();
110
-
111
- /** Whether the context is still valid */
112
- readonly isValid: boolean;
113
-
114
- /**
115
- * List available readers
116
- * @returns Array of Reader objects
117
- */
118
- listReaders(): Reader[];
119
-
120
- /**
121
- * Wait for reader/card state changes
122
- * @param readers - Optional array of readers to monitor
123
- * @param timeout - Timeout in milliseconds (default: infinite)
124
- * @returns Promise resolving to array of reader states
125
- */
126
- waitForChange(readers?: Reader[] | ReaderState[], timeout?: number): Promise<ReaderState[] | null>;
127
-
128
- /**
129
- * Cancel a pending waitForChange call
130
- */
131
- cancel(): void;
132
-
133
- /**
134
- * Close the context and release resources
135
- */
136
- close(): void;
137
- }
138
-
139
- /**
140
- * Monitor event from native ReaderMonitor
141
- */
142
- export interface MonitorEvent {
143
- type: 'reader-attached' | 'reader-detached' | 'card-inserted' | 'card-removed' | 'error';
144
- reader: string;
145
- state: number;
146
- atr: Buffer | null;
147
- }
148
-
149
- /**
150
- * Native PC/SC event monitor using ThreadSafeFunction
151
- * Runs monitoring on a background thread for efficiency
152
- */
153
- export declare class ReaderMonitor {
154
- constructor();
155
-
156
- /** Whether the monitor is currently running */
157
- readonly isRunning: boolean;
158
-
159
- /**
160
- * Start monitoring for reader/card changes
161
- * @param callback - Function called when events occur
162
- */
163
- start(callback: (event: MonitorEvent) => void): void;
164
-
165
- /**
166
- * Stop monitoring
167
- */
168
- stop(): void;
169
- }
170
-
171
- /**
172
- * Event types for Devices class
173
- */
174
- export interface DeviceEvents {
175
- 'reader-attached': (reader: Reader) => void;
176
- 'reader-detached': (reader: Reader) => void;
177
- 'card-inserted': (event: { reader: Reader; card: Card }) => void;
178
- 'card-removed': (event: { reader: Reader; card: Card | null }) => void;
179
- 'error': (error: Error) => void;
180
- }
181
-
182
- /**
183
- * High-level event-driven API for monitoring PC/SC devices
184
- */
185
- export declare class Devices extends EventEmitter {
186
- constructor();
187
-
188
- /**
189
- * Start monitoring for device changes
190
- */
191
- start(): void;
192
-
193
- /**
194
- * Stop monitoring and release resources
195
- */
196
- stop(): void;
197
-
198
- /**
199
- * List currently known readers
200
- * @returns Array of Reader objects
201
- */
202
- listReaders(): Reader[];
203
-
204
- on<K extends keyof DeviceEvents>(event: K, listener: DeviceEvents[K]): this;
205
- once<K extends keyof DeviceEvents>(event: K, listener: DeviceEvents[K]): this;
206
- off<K extends keyof DeviceEvents>(event: K, listener: DeviceEvents[K]): this;
207
- emit<K extends keyof DeviceEvents>(event: K, ...args: Parameters<DeviceEvents[K]>): boolean;
208
- }
209
-
210
- /**
211
- * Base PC/SC error class
212
- */
213
- export declare class PCSCError extends Error {
214
- readonly code: number;
215
- constructor(message: string, code: number);
216
- }
217
-
218
- /**
219
- * Error thrown when card is removed during operation
220
- */
221
- export declare class CardRemovedError extends PCSCError {
222
- constructor(message?: string);
223
- }
224
-
225
- /**
226
- * Error thrown when operation times out
227
- */
228
- export declare class TimeoutError extends PCSCError {
229
- constructor(message?: string);
230
- }
231
-
232
- /**
233
- * Error thrown when no readers are available
234
- */
235
- export declare class NoReadersError extends PCSCError {
236
- constructor(message?: string);
237
- }
238
-
239
- /**
240
- * Error thrown when PC/SC service is not running
241
- */
242
- export declare class ServiceNotRunningError extends PCSCError {
243
- constructor(message?: string);
244
- }
245
-
246
- /**
247
- * Error thrown when there's a sharing violation
248
- */
249
- export declare class SharingViolationError extends PCSCError {
250
- constructor(message?: string);
251
- }
252
-
253
- /**
254
- * Factory function to create the appropriate error class based on PC/SC error code
255
- */
256
- export declare function createPCSCError(message: string, code: number): PCSCError;
257
-
258
- // Share modes
259
- export declare const SCARD_SHARE_EXCLUSIVE: number;
260
- export declare const SCARD_SHARE_SHARED: number;
261
- export declare const SCARD_SHARE_DIRECT: number;
262
-
263
- // Protocols
264
- export declare const SCARD_PROTOCOL_T0: number;
265
- export declare const SCARD_PROTOCOL_T1: number;
266
- export declare const SCARD_PROTOCOL_RAW: number;
267
- export declare const SCARD_PROTOCOL_UNDEFINED: number;
268
-
269
- // Disposition
270
- export declare const SCARD_LEAVE_CARD: number;
271
- export declare const SCARD_RESET_CARD: number;
272
- export declare const SCARD_UNPOWER_CARD: number;
273
- export declare const SCARD_EJECT_CARD: number;
274
-
275
- // State flags
276
- export declare const SCARD_STATE_UNAWARE: number;
277
- export declare const SCARD_STATE_IGNORE: number;
278
- export declare const SCARD_STATE_CHANGED: number;
279
- export declare const SCARD_STATE_UNKNOWN: number;
280
- export declare const SCARD_STATE_UNAVAILABLE: number;
281
- export declare const SCARD_STATE_EMPTY: number;
282
- export declare const SCARD_STATE_PRESENT: number;
283
- export declare const SCARD_STATE_ATRMATCH: number;
284
- export declare const SCARD_STATE_EXCLUSIVE: number;
285
- export declare const SCARD_STATE_INUSE: number;
286
- export declare const SCARD_STATE_MUTE: number;
287
-
288
- // Control code generator
289
- /**
290
- * Generate a platform-specific control code
291
- * @param code - The control code number
292
- * @returns The platform-specific control code
293
- */
294
- export declare function SCARD_CTL_CODE(code: number): number;
295
-
296
- // Common control codes
297
- export declare const CM_IOCTL_GET_FEATURE_REQUEST: number;
298
-
299
- // CCID Feature tags
300
- export declare const FEATURE_VERIFY_PIN_START: number;
301
- export declare const FEATURE_VERIFY_PIN_FINISH: number;
302
- export declare const FEATURE_MODIFY_PIN_START: number;
303
- export declare const FEATURE_MODIFY_PIN_FINISH: number;
304
- export declare const FEATURE_GET_KEY_PRESSED: number;
305
- export declare const FEATURE_VERIFY_PIN_DIRECT: number;
306
- export declare const FEATURE_MODIFY_PIN_DIRECT: number;
307
- export declare const FEATURE_MCT_READER_DIRECT: number;
308
- export declare const FEATURE_MCT_UNIVERSAL: number;
309
- export declare const FEATURE_IFD_PIN_PROPERTIES: number;
310
- export declare const FEATURE_ABORT: number;
311
- export declare const FEATURE_SET_SPE_MESSAGE: number;
312
- export declare const FEATURE_VERIFY_PIN_DIRECT_APP_ID: number;
313
- export declare const FEATURE_MODIFY_PIN_DIRECT_APP_ID: number;
314
- export declare const FEATURE_WRITE_DISPLAY: number;
315
- export declare const FEATURE_GET_KEY: number;
316
- export declare const FEATURE_IFD_DISPLAY_PROPERTIES: number;
317
- export declare const FEATURE_GET_TLV_PROPERTIES: number;
318
- export declare const FEATURE_CCID_ESC_COMMAND: number;
319
-
320
- /**
321
- * Parse feature TLV response from CM_IOCTL_GET_FEATURE_REQUEST
322
- * @param response - The TLV response buffer
323
- * @returns Map of feature tag to control code
324
- */
325
- export declare function parseFeatures(response: Buffer): Map<number, number>;
package/lib/index.js DELETED
@@ -1,151 +0,0 @@
1
- // @ts-check
2
- 'use strict';
3
-
4
- // Load native addon
5
- const addon = require('../build/Release/smartcard_napi.node');
6
-
7
- // Re-export native classes
8
- const { Context, Reader, Card, ReaderMonitor } = addon;
9
-
10
- // Re-export constants
11
- const SCARD_SHARE_EXCLUSIVE = addon.SCARD_SHARE_EXCLUSIVE;
12
- const SCARD_SHARE_SHARED = addon.SCARD_SHARE_SHARED;
13
- const SCARD_SHARE_DIRECT = addon.SCARD_SHARE_DIRECT;
14
-
15
- const SCARD_PROTOCOL_T0 = addon.SCARD_PROTOCOL_T0;
16
- const SCARD_PROTOCOL_T1 = addon.SCARD_PROTOCOL_T1;
17
- const SCARD_PROTOCOL_RAW = addon.SCARD_PROTOCOL_RAW;
18
- const SCARD_PROTOCOL_UNDEFINED = addon.SCARD_PROTOCOL_UNDEFINED;
19
-
20
- const SCARD_LEAVE_CARD = addon.SCARD_LEAVE_CARD;
21
- const SCARD_RESET_CARD = addon.SCARD_RESET_CARD;
22
- const SCARD_UNPOWER_CARD = addon.SCARD_UNPOWER_CARD;
23
- const SCARD_EJECT_CARD = addon.SCARD_EJECT_CARD;
24
-
25
- const SCARD_STATE_UNAWARE = addon.SCARD_STATE_UNAWARE;
26
- const SCARD_STATE_IGNORE = addon.SCARD_STATE_IGNORE;
27
- const SCARD_STATE_CHANGED = addon.SCARD_STATE_CHANGED;
28
- const SCARD_STATE_UNKNOWN = addon.SCARD_STATE_UNKNOWN;
29
- const SCARD_STATE_UNAVAILABLE = addon.SCARD_STATE_UNAVAILABLE;
30
- const SCARD_STATE_EMPTY = addon.SCARD_STATE_EMPTY;
31
- const SCARD_STATE_PRESENT = addon.SCARD_STATE_PRESENT;
32
- const SCARD_STATE_ATRMATCH = addon.SCARD_STATE_ATRMATCH;
33
- const SCARD_STATE_EXCLUSIVE = addon.SCARD_STATE_EXCLUSIVE;
34
- const SCARD_STATE_INUSE = addon.SCARD_STATE_INUSE;
35
- const SCARD_STATE_MUTE = addon.SCARD_STATE_MUTE;
36
-
37
- // Import Devices class
38
- const { Devices } = require('./devices');
39
-
40
- // Import error classes
41
- const {
42
- PCSCError,
43
- CardRemovedError,
44
- TimeoutError,
45
- NoReadersError,
46
- ServiceNotRunningError,
47
- SharingViolationError,
48
- createPCSCError,
49
- } = require('./errors');
50
-
51
- // Import control codes
52
- const {
53
- SCARD_CTL_CODE,
54
- CM_IOCTL_GET_FEATURE_REQUEST,
55
- FEATURE_VERIFY_PIN_START,
56
- FEATURE_VERIFY_PIN_FINISH,
57
- FEATURE_MODIFY_PIN_START,
58
- FEATURE_MODIFY_PIN_FINISH,
59
- FEATURE_GET_KEY_PRESSED,
60
- FEATURE_VERIFY_PIN_DIRECT,
61
- FEATURE_MODIFY_PIN_DIRECT,
62
- FEATURE_MCT_READER_DIRECT,
63
- FEATURE_MCT_UNIVERSAL,
64
- FEATURE_IFD_PIN_PROPERTIES,
65
- FEATURE_ABORT,
66
- FEATURE_SET_SPE_MESSAGE,
67
- FEATURE_VERIFY_PIN_DIRECT_APP_ID,
68
- FEATURE_MODIFY_PIN_DIRECT_APP_ID,
69
- FEATURE_WRITE_DISPLAY,
70
- FEATURE_GET_KEY,
71
- FEATURE_IFD_DISPLAY_PROPERTIES,
72
- FEATURE_GET_TLV_PROPERTIES,
73
- FEATURE_CCID_ESC_COMMAND,
74
- parseFeatures,
75
- } = require('./control-codes');
76
-
77
- module.exports = {
78
- // Classes
79
- Context,
80
- Reader,
81
- Card,
82
- Devices,
83
- ReaderMonitor,
84
-
85
- // Error classes
86
- PCSCError,
87
- CardRemovedError,
88
- TimeoutError,
89
- NoReadersError,
90
- ServiceNotRunningError,
91
- SharingViolationError,
92
- createPCSCError,
93
-
94
- // Share modes
95
- SCARD_SHARE_EXCLUSIVE,
96
- SCARD_SHARE_SHARED,
97
- SCARD_SHARE_DIRECT,
98
-
99
- // Protocols
100
- SCARD_PROTOCOL_T0,
101
- SCARD_PROTOCOL_T1,
102
- SCARD_PROTOCOL_RAW,
103
- SCARD_PROTOCOL_UNDEFINED,
104
-
105
- // Disposition
106
- SCARD_LEAVE_CARD,
107
- SCARD_RESET_CARD,
108
- SCARD_UNPOWER_CARD,
109
- SCARD_EJECT_CARD,
110
-
111
- // State flags
112
- SCARD_STATE_UNAWARE,
113
- SCARD_STATE_IGNORE,
114
- SCARD_STATE_CHANGED,
115
- SCARD_STATE_UNKNOWN,
116
- SCARD_STATE_UNAVAILABLE,
117
- SCARD_STATE_EMPTY,
118
- SCARD_STATE_PRESENT,
119
- SCARD_STATE_ATRMATCH,
120
- SCARD_STATE_EXCLUSIVE,
121
- SCARD_STATE_INUSE,
122
- SCARD_STATE_MUTE,
123
-
124
- // Control codes
125
- SCARD_CTL_CODE,
126
- CM_IOCTL_GET_FEATURE_REQUEST,
127
-
128
- // CCID Feature tags
129
- FEATURE_VERIFY_PIN_START,
130
- FEATURE_VERIFY_PIN_FINISH,
131
- FEATURE_MODIFY_PIN_START,
132
- FEATURE_MODIFY_PIN_FINISH,
133
- FEATURE_GET_KEY_PRESSED,
134
- FEATURE_VERIFY_PIN_DIRECT,
135
- FEATURE_MODIFY_PIN_DIRECT,
136
- FEATURE_MCT_READER_DIRECT,
137
- FEATURE_MCT_UNIVERSAL,
138
- FEATURE_IFD_PIN_PROPERTIES,
139
- FEATURE_ABORT,
140
- FEATURE_SET_SPE_MESSAGE,
141
- FEATURE_VERIFY_PIN_DIRECT_APP_ID,
142
- FEATURE_MODIFY_PIN_DIRECT_APP_ID,
143
- FEATURE_WRITE_DISPLAY,
144
- FEATURE_GET_KEY,
145
- FEATURE_IFD_DISPLAY_PROPERTIES,
146
- FEATURE_GET_TLV_PROPERTIES,
147
- FEATURE_CCID_ESC_COMMAND,
148
-
149
- // Helper functions
150
- parseFeatures,
151
- };