smartcard 3.5.0 → 3.7.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.
- package/README.md +67 -1
- package/dist/lib/card-wrapper.d.ts +27 -0
- package/dist/lib/card-wrapper.d.ts.map +1 -0
- package/dist/lib/card-wrapper.js +57 -0
- package/dist/lib/card-wrapper.js.map +1 -0
- package/dist/lib/control-codes.d.ts.map +1 -1
- package/dist/lib/control-codes.js +6 -2
- package/dist/lib/control-codes.js.map +1 -1
- package/dist/lib/devices.d.ts +9 -2
- package/dist/lib/devices.d.ts.map +1 -1
- package/dist/lib/devices.js +26 -8
- package/dist/lib/devices.js.map +1 -1
- package/dist/lib/index.d.ts +5 -2
- package/dist/lib/index.d.ts.map +1 -1
- package/dist/lib/index.js +11 -2
- package/dist/lib/index.js.map +1 -1
- package/dist/lib/t0-handler.d.ts +32 -0
- package/dist/lib/t0-handler.d.ts.map +1 -0
- package/dist/lib/t0-handler.js +93 -0
- package/dist/lib/t0-handler.js.map +1 -0
- package/dist/lib/types.d.ts +10 -0
- package/dist/lib/types.d.ts.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -289,7 +289,7 @@ interface Card {
|
|
|
289
289
|
readonly protocol: number;
|
|
290
290
|
readonly connected: boolean;
|
|
291
291
|
readonly atr: Buffer | null;
|
|
292
|
-
transmit(command: Buffer | number[], options?: { maxRecvLength?: number }): Promise<Buffer>;
|
|
292
|
+
transmit(command: Buffer | number[], options?: { maxRecvLength?: number; autoGetResponse?: boolean }): Promise<Buffer>;
|
|
293
293
|
control(code: number, data?: Buffer): Promise<Buffer>;
|
|
294
294
|
getStatus(): { state: number; protocol: number; atr: Buffer };
|
|
295
295
|
disconnect(disposition?: number): void;
|
|
@@ -306,6 +306,8 @@ class Devices extends EventEmitter {
|
|
|
306
306
|
start(): void;
|
|
307
307
|
stop(): void;
|
|
308
308
|
listReaders(): Reader[];
|
|
309
|
+
getCards(): ReadonlyMap<string, Card>; // Get all connected cards by reader name
|
|
310
|
+
getCard(readerName: string): Card | null; // Get card for specific reader
|
|
309
311
|
|
|
310
312
|
on(event: 'reader-attached', listener: (reader: Reader) => void): this;
|
|
311
313
|
on(event: 'reader-detached', listener: (reader: Reader) => void): this;
|
|
@@ -315,6 +317,60 @@ class Devices extends EventEmitter {
|
|
|
315
317
|
}
|
|
316
318
|
```
|
|
317
319
|
|
|
320
|
+
### Auto GET RESPONSE (T=0 Protocol)
|
|
321
|
+
|
|
322
|
+
For T=0 protocol cards, you can automatically handle status words by passing the `autoGetResponse` option:
|
|
323
|
+
- `SW1=61`: Sends GET RESPONSE to retrieve remaining data
|
|
324
|
+
- `SW1=6C`: Retries with corrected Le value
|
|
325
|
+
|
|
326
|
+
```javascript
|
|
327
|
+
// Without auto-response (raw)
|
|
328
|
+
const raw = await card.transmit([0x00, 0xA4, 0x04, 0x00, 0x0E, ...aid]);
|
|
329
|
+
// Returns: 61 1C (meaning 28 more bytes available)
|
|
330
|
+
|
|
331
|
+
// With auto-response - handles 61 XX automatically
|
|
332
|
+
const response = await card.transmit([0x00, 0xA4, 0x04, 0x00, 0x0E, ...aid], {
|
|
333
|
+
autoGetResponse: true
|
|
334
|
+
});
|
|
335
|
+
// Returns: full response data + 90 00
|
|
336
|
+
```
|
|
337
|
+
|
|
338
|
+
The `transmitWithAutoResponse()` helper function is also available for low-level API usage:
|
|
339
|
+
|
|
340
|
+
```javascript
|
|
341
|
+
const { transmitWithAutoResponse } = require('smartcard');
|
|
342
|
+
|
|
343
|
+
const response = await transmitWithAutoResponse(card, [0x00, 0xA4, 0x04, 0x00, 0x0E, ...aid], {
|
|
344
|
+
autoGetResponse: true
|
|
345
|
+
});
|
|
346
|
+
```
|
|
347
|
+
|
|
348
|
+
### Control Codes
|
|
349
|
+
|
|
350
|
+
Utilities for reader control commands (e.g., PIN verification on pinpad readers).
|
|
351
|
+
|
|
352
|
+
```javascript
|
|
353
|
+
const {
|
|
354
|
+
SCARD_CTL_CODE,
|
|
355
|
+
CM_IOCTL_GET_FEATURE_REQUEST,
|
|
356
|
+
parseFeatures,
|
|
357
|
+
FEATURE_VERIFY_PIN_DIRECT,
|
|
358
|
+
FEATURE_MODIFY_PIN_DIRECT
|
|
359
|
+
} = require('smartcard');
|
|
360
|
+
|
|
361
|
+
// Get supported features from reader
|
|
362
|
+
const featureResponse = await card.control(CM_IOCTL_GET_FEATURE_REQUEST);
|
|
363
|
+
const features = parseFeatures(featureResponse);
|
|
364
|
+
|
|
365
|
+
if (features.has(FEATURE_VERIFY_PIN_DIRECT)) {
|
|
366
|
+
const pinVerifyCode = features.get(FEATURE_VERIFY_PIN_DIRECT);
|
|
367
|
+
// Use pinVerifyCode with card.control() for PIN verification
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
// Generate platform-specific control code
|
|
371
|
+
const customCode = SCARD_CTL_CODE(3500);
|
|
372
|
+
```
|
|
373
|
+
|
|
318
374
|
### Constants
|
|
319
375
|
|
|
320
376
|
```javascript
|
|
@@ -339,6 +395,16 @@ SCARD_STATE_PRESENT // Card is present
|
|
|
339
395
|
SCARD_STATE_EMPTY // No card in reader
|
|
340
396
|
SCARD_STATE_CHANGED // State has changed
|
|
341
397
|
// ... and more
|
|
398
|
+
|
|
399
|
+
// CCID Feature constants
|
|
400
|
+
FEATURE_VERIFY_PIN_START // 0x01
|
|
401
|
+
FEATURE_VERIFY_PIN_FINISH // 0x02
|
|
402
|
+
FEATURE_MODIFY_PIN_START // 0x03
|
|
403
|
+
FEATURE_MODIFY_PIN_FINISH // 0x04
|
|
404
|
+
FEATURE_GET_KEY_PRESSED // 0x05
|
|
405
|
+
FEATURE_VERIFY_PIN_DIRECT // 0x06
|
|
406
|
+
FEATURE_MODIFY_PIN_DIRECT // 0x07
|
|
407
|
+
// ... and more
|
|
342
408
|
```
|
|
343
409
|
|
|
344
410
|
## Common APDU Commands
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Card wrapper that adds autoGetResponse support to card.transmit()
|
|
3
|
+
*
|
|
4
|
+
* Wraps the native Card object to intercept transmit() calls and
|
|
5
|
+
* automatically handle T=0 protocol status words when autoGetResponse is set.
|
|
6
|
+
*/
|
|
7
|
+
import type { Card, CardStatus, TransmitOptions } from './types';
|
|
8
|
+
/**
|
|
9
|
+
* Wraps a native Card to add autoGetResponse support to transmit()
|
|
10
|
+
*/
|
|
11
|
+
export declare class CardWrapper implements Card {
|
|
12
|
+
private _nativeCard;
|
|
13
|
+
constructor(nativeCard: Card);
|
|
14
|
+
get protocol(): number;
|
|
15
|
+
get connected(): boolean;
|
|
16
|
+
get atr(): Buffer | null;
|
|
17
|
+
transmit(command: Buffer | number[], options?: TransmitOptions): Promise<Buffer>;
|
|
18
|
+
control(code: number, data?: Buffer | number[]): Promise<Buffer>;
|
|
19
|
+
getStatus(): CardStatus;
|
|
20
|
+
disconnect(disposition?: number): void;
|
|
21
|
+
reconnect(shareMode?: number, protocol?: number, initialization?: number): Promise<number>;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Wrap a native card with autoGetResponse support
|
|
25
|
+
*/
|
|
26
|
+
export declare function wrapCard(nativeCard: Card): Card;
|
|
27
|
+
//# sourceMappingURL=card-wrapper.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"card-wrapper.d.ts","sourceRoot":"","sources":["../../lib/card-wrapper.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAGjE;;GAEG;AACH,qBAAa,WAAY,YAAW,IAAI;IACpC,OAAO,CAAC,WAAW,CAAO;gBAEd,UAAU,EAAE,IAAI;IAI5B,IAAI,QAAQ,IAAI,MAAM,CAErB;IAED,IAAI,SAAS,IAAI,OAAO,CAEvB;IAED,IAAI,GAAG,IAAI,MAAM,GAAG,IAAI,CAEvB;IAEK,QAAQ,CACV,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,EAC1B,OAAO,CAAC,EAAE,eAAe,GAC1B,OAAO,CAAC,MAAM,CAAC;IASlB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IAIhE,SAAS,IAAI,UAAU;IAIvB,UAAU,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI;IAIhC,SAAS,CACX,SAAS,CAAC,EAAE,MAAM,EAClB,QAAQ,CAAC,EAAE,MAAM,EACjB,cAAc,CAAC,EAAE,MAAM,GACxB,OAAO,CAAC,MAAM,CAAC;CAGrB;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,UAAU,EAAE,IAAI,GAAG,IAAI,CAE/C"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Card wrapper that adds autoGetResponse support to card.transmit()
|
|
4
|
+
*
|
|
5
|
+
* Wraps the native Card object to intercept transmit() calls and
|
|
6
|
+
* automatically handle T=0 protocol status words when autoGetResponse is set.
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.CardWrapper = void 0;
|
|
10
|
+
exports.wrapCard = wrapCard;
|
|
11
|
+
const t0_handler_1 = require("./t0-handler");
|
|
12
|
+
/**
|
|
13
|
+
* Wraps a native Card to add autoGetResponse support to transmit()
|
|
14
|
+
*/
|
|
15
|
+
class CardWrapper {
|
|
16
|
+
_nativeCard;
|
|
17
|
+
constructor(nativeCard) {
|
|
18
|
+
this._nativeCard = nativeCard;
|
|
19
|
+
}
|
|
20
|
+
get protocol() {
|
|
21
|
+
return this._nativeCard.protocol;
|
|
22
|
+
}
|
|
23
|
+
get connected() {
|
|
24
|
+
return this._nativeCard.connected;
|
|
25
|
+
}
|
|
26
|
+
get atr() {
|
|
27
|
+
return this._nativeCard.atr;
|
|
28
|
+
}
|
|
29
|
+
async transmit(command, options) {
|
|
30
|
+
if (options?.autoGetResponse) {
|
|
31
|
+
// Delegate to transmitWithAutoResponse for T=0 handling
|
|
32
|
+
return (0, t0_handler_1.transmitWithAutoResponse)(this._nativeCard, command, options);
|
|
33
|
+
}
|
|
34
|
+
// Pass through to native transmit
|
|
35
|
+
return this._nativeCard.transmit(command, options);
|
|
36
|
+
}
|
|
37
|
+
control(code, data) {
|
|
38
|
+
return this._nativeCard.control(code, data);
|
|
39
|
+
}
|
|
40
|
+
getStatus() {
|
|
41
|
+
return this._nativeCard.getStatus();
|
|
42
|
+
}
|
|
43
|
+
disconnect(disposition) {
|
|
44
|
+
return this._nativeCard.disconnect(disposition);
|
|
45
|
+
}
|
|
46
|
+
async reconnect(shareMode, protocol, initialization) {
|
|
47
|
+
return this._nativeCard.reconnect(shareMode, protocol, initialization);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
exports.CardWrapper = CardWrapper;
|
|
51
|
+
/**
|
|
52
|
+
* Wrap a native card with autoGetResponse support
|
|
53
|
+
*/
|
|
54
|
+
function wrapCard(nativeCard) {
|
|
55
|
+
return new CardWrapper(nativeCard);
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=card-wrapper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"card-wrapper.js","sourceRoot":"","sources":["../../lib/card-wrapper.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AA+DH,4BAEC;AA9DD,6CAAwD;AAExD;;GAEG;AACH,MAAa,WAAW;IACZ,WAAW,CAAO;IAE1B,YAAY,UAAgB;QACxB,IAAI,CAAC,WAAW,GAAG,UAAU,CAAC;IAClC,CAAC;IAED,IAAI,QAAQ;QACR,OAAO,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC;IACrC,CAAC;IAED,IAAI,SAAS;QACT,OAAO,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC;IACtC,CAAC;IAED,IAAI,GAAG;QACH,OAAO,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC;IAChC,CAAC;IAED,KAAK,CAAC,QAAQ,CACV,OAA0B,EAC1B,OAAyB;QAEzB,IAAI,OAAO,EAAE,eAAe,EAAE,CAAC;YAC3B,wDAAwD;YACxD,OAAO,IAAA,qCAAwB,EAAC,IAAI,CAAC,WAAW,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QACxE,CAAC;QACD,kCAAkC;QAClC,OAAO,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IACvD,CAAC;IAED,OAAO,CAAC,IAAY,EAAE,IAAwB;QAC1C,OAAO,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAChD,CAAC;IAED,SAAS;QACL,OAAO,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE,CAAC;IACxC,CAAC;IAED,UAAU,CAAC,WAAoB;QAC3B,OAAO,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;IACpD,CAAC;IAED,KAAK,CAAC,SAAS,CACX,SAAkB,EAClB,QAAiB,EACjB,cAAuB;QAEvB,OAAO,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,SAAS,EAAE,QAAQ,EAAE,cAAc,CAAC,CAAC;IAC3E,CAAC;CACJ;AAlDD,kCAkDC;AAED;;GAEG;AACH,SAAgB,QAAQ,CAAC,UAAgB;IACrC,OAAO,IAAI,WAAW,CAAC,UAAU,CAAC,CAAC;AACvC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"control-codes.d.ts","sourceRoot":"","sources":["../../lib/control-codes.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CASnD;AAGD,eAAO,MAAM,4BAA4B,QAAuB,CAAC;AAGjE,eAAO,MAAM,wBAAwB,IAAO,CAAC;AAC7C,eAAO,MAAM,yBAAyB,IAAO,CAAC;AAC9C,eAAO,MAAM,wBAAwB,IAAO,CAAC;AAC7C,eAAO,MAAM,yBAAyB,IAAO,CAAC;AAC9C,eAAO,MAAM,uBAAuB,IAAO,CAAC;AAC5C,eAAO,MAAM,yBAAyB,IAAO,CAAC;AAC9C,eAAO,MAAM,yBAAyB,IAAO,CAAC;AAC9C,eAAO,MAAM,yBAAyB,IAAO,CAAC;AAC9C,eAAO,MAAM,qBAAqB,IAAO,CAAC;AAC1C,eAAO,MAAM,0BAA0B,KAAO,CAAC;AAC/C,eAAO,MAAM,aAAa,KAAO,CAAC;AAClC,eAAO,MAAM,uBAAuB,KAAO,CAAC;AAC5C,eAAO,MAAM,gCAAgC,KAAO,CAAC;AACrD,eAAO,MAAM,gCAAgC,KAAO,CAAC;AACrD,eAAO,MAAM,qBAAqB,KAAO,CAAC;AAC1C,eAAO,MAAM,eAAe,KAAO,CAAC;AACpC,eAAO,MAAM,8BAA8B,KAAO,CAAC;AACnD,eAAO,MAAM,0BAA0B,KAAO,CAAC;AAC/C,eAAO,MAAM,wBAAwB,KAAO,CAAC;AAE7C;;GAEG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,
|
|
1
|
+
{"version":3,"file":"control-codes.d.ts","sourceRoot":"","sources":["../../lib/control-codes.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CASnD;AAGD,eAAO,MAAM,4BAA4B,QAAuB,CAAC;AAGjE,eAAO,MAAM,wBAAwB,IAAO,CAAC;AAC7C,eAAO,MAAM,yBAAyB,IAAO,CAAC;AAC9C,eAAO,MAAM,wBAAwB,IAAO,CAAC;AAC7C,eAAO,MAAM,yBAAyB,IAAO,CAAC;AAC9C,eAAO,MAAM,uBAAuB,IAAO,CAAC;AAC5C,eAAO,MAAM,yBAAyB,IAAO,CAAC;AAC9C,eAAO,MAAM,yBAAyB,IAAO,CAAC;AAC9C,eAAO,MAAM,yBAAyB,IAAO,CAAC;AAC9C,eAAO,MAAM,qBAAqB,IAAO,CAAC;AAC1C,eAAO,MAAM,0BAA0B,KAAO,CAAC;AAC/C,eAAO,MAAM,aAAa,KAAO,CAAC;AAClC,eAAO,MAAM,uBAAuB,KAAO,CAAC;AAC5C,eAAO,MAAM,gCAAgC,KAAO,CAAC;AACrD,eAAO,MAAM,gCAAgC,KAAO,CAAC;AACrD,eAAO,MAAM,qBAAqB,KAAO,CAAC;AAC1C,eAAO,MAAM,eAAe,KAAO,CAAC;AACpC,eAAO,MAAM,8BAA8B,KAAO,CAAC;AACnD,eAAO,MAAM,0BAA0B,KAAO,CAAC;AAC/C,eAAO,MAAM,wBAAwB,KAAO,CAAC;AAE7C;;GAEG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CA2BnE"}
|
|
@@ -48,10 +48,14 @@ exports.FEATURE_CCID_ESC_COMMAND = 0x13;
|
|
|
48
48
|
function parseFeatures(response) {
|
|
49
49
|
const features = new Map();
|
|
50
50
|
let offset = 0;
|
|
51
|
-
while (offset +
|
|
51
|
+
while (offset + 2 <= response.length) {
|
|
52
52
|
const tag = response[offset];
|
|
53
53
|
const length = response[offset + 1];
|
|
54
|
-
|
|
54
|
+
// Validate length doesn't exceed remaining buffer
|
|
55
|
+
if (offset + 2 + length > response.length) {
|
|
56
|
+
break;
|
|
57
|
+
}
|
|
58
|
+
if (length === 4) {
|
|
55
59
|
// Big-endian control code
|
|
56
60
|
const controlCode = (response[offset + 2] << 24) |
|
|
57
61
|
(response[offset + 3] << 16) |
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"control-codes.js","sourceRoot":"","sources":["../../lib/control-codes.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAKH,wCASC;AA6BD,
|
|
1
|
+
{"version":3,"file":"control-codes.js","sourceRoot":"","sources":["../../lib/control-codes.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAKH,wCASC;AA6BD,sCA2BC;AApED;;GAEG;AACH,SAAgB,cAAc,CAAC,IAAY;IACvC,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QAC/B,uDAAuD;QACvD,+BAA+B;QAC/B,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC;IACtC,CAAC;SAAM,CAAC;QACJ,iCAAiC;QACjC,OAAO,UAAU,GAAG,IAAI,CAAC;IAC7B,CAAC;AACL,CAAC;AAED,uBAAuB;AACV,QAAA,4BAA4B,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;AAEjE,qCAAqC;AACxB,QAAA,wBAAwB,GAAG,IAAI,CAAC;AAChC,QAAA,yBAAyB,GAAG,IAAI,CAAC;AACjC,QAAA,wBAAwB,GAAG,IAAI,CAAC;AAChC,QAAA,yBAAyB,GAAG,IAAI,CAAC;AACjC,QAAA,uBAAuB,GAAG,IAAI,CAAC;AAC/B,QAAA,yBAAyB,GAAG,IAAI,CAAC;AACjC,QAAA,yBAAyB,GAAG,IAAI,CAAC;AACjC,QAAA,yBAAyB,GAAG,IAAI,CAAC;AACjC,QAAA,qBAAqB,GAAG,IAAI,CAAC;AAC7B,QAAA,0BAA0B,GAAG,IAAI,CAAC;AAClC,QAAA,aAAa,GAAG,IAAI,CAAC;AACrB,QAAA,uBAAuB,GAAG,IAAI,CAAC;AAC/B,QAAA,gCAAgC,GAAG,IAAI,CAAC;AACxC,QAAA,gCAAgC,GAAG,IAAI,CAAC;AACxC,QAAA,qBAAqB,GAAG,IAAI,CAAC;AAC7B,QAAA,eAAe,GAAG,IAAI,CAAC;AACvB,QAAA,8BAA8B,GAAG,IAAI,CAAC;AACtC,QAAA,0BAA0B,GAAG,IAAI,CAAC;AAClC,QAAA,wBAAwB,GAAG,IAAI,CAAC;AAE7C;;GAEG;AACH,SAAgB,aAAa,CAAC,QAAgB;IAC1C,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC3C,IAAI,MAAM,GAAG,CAAC,CAAC;IAEf,OAAO,MAAM,GAAG,CAAC,IAAI,QAAQ,CAAC,MAAM,EAAE,CAAC;QACnC,MAAM,GAAG,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;QAC7B,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAEpC,kDAAkD;QAClD,IAAI,MAAM,GAAG,CAAC,GAAG,MAAM,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC;YACxC,MAAM;QACV,CAAC;QAED,IAAI,MAAM,KAAK,CAAC,EAAE,CAAC;YACf,0BAA0B;YAC1B,MAAM,WAAW,GACb,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;gBAC5B,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;gBAC5B,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC;gBAC3B,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YACzB,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;QACnC,CAAC;QAED,MAAM,IAAI,CAAC,GAAG,MAAM,CAAC;IACzB,CAAC;IAED,OAAO,QAAQ,CAAC;AACpB,CAAC"}
|
package/dist/lib/devices.d.ts
CHANGED
|
@@ -1,5 +1,10 @@
|
|
|
1
1
|
import { EventEmitter } from 'events';
|
|
2
2
|
import type { Card, DeviceEvents, DevicesOptions, Reader } from './types';
|
|
3
|
+
/**
|
|
4
|
+
* Check if an error indicates an unresponsive card (SCARD_W_UNRESPONSIVE_CARD).
|
|
5
|
+
* Used to determine if we should fallback to T=0 protocol.
|
|
6
|
+
*/
|
|
7
|
+
export declare function isUnresponsiveCardError(err: Error): boolean;
|
|
3
8
|
/**
|
|
4
9
|
* High-level event-driven API for PC/SC devices
|
|
5
10
|
*
|
|
@@ -44,9 +49,9 @@ export declare class Devices extends EventEmitter {
|
|
|
44
49
|
listReaders(): Reader[];
|
|
45
50
|
/**
|
|
46
51
|
* Get all currently connected cards
|
|
47
|
-
* @returns
|
|
52
|
+
* @returns ReadonlyMap of reader name to Card object
|
|
48
53
|
*/
|
|
49
|
-
getCards():
|
|
54
|
+
getCards(): ReadonlyMap<string, Card>;
|
|
50
55
|
/**
|
|
51
56
|
* Get the card connected to a specific reader
|
|
52
57
|
* @param readerName The name of the reader
|
|
@@ -81,6 +86,8 @@ export declare class Devices extends EventEmitter {
|
|
|
81
86
|
on<K extends keyof DeviceEvents>(event: K, listener: DeviceEvents[K]): this;
|
|
82
87
|
once<K extends keyof DeviceEvents>(event: K, listener: DeviceEvents[K]): this;
|
|
83
88
|
off<K extends keyof DeviceEvents>(event: K, listener: DeviceEvents[K]): this;
|
|
89
|
+
addListener<K extends keyof DeviceEvents>(event: K, listener: DeviceEvents[K]): this;
|
|
90
|
+
removeListener<K extends keyof DeviceEvents>(event: K, listener: DeviceEvents[K]): this;
|
|
84
91
|
emit<K extends keyof DeviceEvents>(event: K, ...args: Parameters<DeviceEvents[K]>): boolean;
|
|
85
92
|
}
|
|
86
93
|
//# sourceMappingURL=devices.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"devices.d.ts","sourceRoot":"","sources":["../../lib/devices.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,KAAK,EACR,IAAI,EAGJ,YAAY,EACZ,cAAc,
|
|
1
|
+
{"version":3,"file":"devices.d.ts","sourceRoot":"","sources":["../../lib/devices.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,KAAK,EACR,IAAI,EAGJ,YAAY,EACZ,cAAc,EAGd,MAAM,EAGT,MAAM,SAAS,CAAC;AAUjB;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,KAAK,GAAG,OAAO,CAK3D;AAED;;;;;;;;;;;;GAYG;AACH,qBAAa,OAAQ,SAAQ,YAAY;IACrC,OAAO,CAAC,QAAQ,CAA8B;IAC9C,OAAO,CAAC,QAAQ,CAAwB;IACxC,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,QAAQ,CAA0C;IAC1D,OAAO,CAAC,WAAW,CAAoC;IAGvD,OAAO,CAAC,QAAQ,CAAqB;IACrC,OAAO,CAAC,cAAc,CAA2B;IACjD,OAAO,CAAC,oBAAoB,CAAS;IACrC,OAAO,CAAC,mBAAmB,CAAS;IACpC,OAAO,CAAC,kBAAkB,CAAS;IACnC,OAAO,CAAC,kBAAkB,CAAS;IAEnC;;;OAGG;gBACS,OAAO,CAAC,EAAE,cAAc;IAcpC;;OAEG;IACH,KAAK,IAAI,IAAI;IAsBb;;OAEG;IACH,IAAI,IAAI,IAAI;IAkCZ;;OAEG;IACH,WAAW,IAAI,MAAM,EAAE;IAWvB;;;OAGG;IACH,QAAQ,IAAI,WAAW,CAAC,MAAM,EAAE,IAAI,CAAC;IAUrC;;;;OAIG;IACH,OAAO,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;IAKxC;;;OAGG;IACH,OAAO,CAAC,YAAY;IAOpB;;OAEG;YACW,aAAa;IA+B3B;;OAEG;YACW,qBAAqB;IA0BnC;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAc7B;;OAEG;YACW,mBAAmB;IAuDjC;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAyB1B,EAAE,CAAC,CAAC,SAAS,MAAM,YAAY,EAC3B,KAAK,EAAE,CAAC,EACR,QAAQ,EAAE,YAAY,CAAC,CAAC,CAAC,GAC1B,IAAI;IAIP,IAAI,CAAC,CAAC,SAAS,MAAM,YAAY,EAC7B,KAAK,EAAE,CAAC,EACR,QAAQ,EAAE,YAAY,CAAC,CAAC,CAAC,GAC1B,IAAI;IAIP,GAAG,CAAC,CAAC,SAAS,MAAM,YAAY,EAC5B,KAAK,EAAE,CAAC,EACR,QAAQ,EAAE,YAAY,CAAC,CAAC,CAAC,GAC1B,IAAI;IAIP,WAAW,CAAC,CAAC,SAAS,MAAM,YAAY,EACpC,KAAK,EAAE,CAAC,EACR,QAAQ,EAAE,YAAY,CAAC,CAAC,CAAC,GAC1B,IAAI;IAIP,cAAc,CAAC,CAAC,SAAS,MAAM,YAAY,EACvC,KAAK,EAAE,CAAC,EACR,QAAQ,EAAE,YAAY,CAAC,CAAC,CAAC,GAC1B,IAAI;IAIP,IAAI,CAAC,CAAC,SAAS,MAAM,YAAY,EAC7B,KAAK,EAAE,CAAC,EACR,GAAG,IAAI,EAAE,UAAU,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,GACrC,OAAO;CAGb"}
|
package/dist/lib/devices.js
CHANGED
|
@@ -1,8 +1,20 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.Devices = void 0;
|
|
4
|
+
exports.isUnresponsiveCardError = isUnresponsiveCardError;
|
|
4
5
|
const events_1 = require("events");
|
|
6
|
+
const card_wrapper_1 = require("./card-wrapper");
|
|
5
7
|
const addon = require('../../build/Release/smartcard_napi.node');
|
|
8
|
+
/**
|
|
9
|
+
* Check if an error indicates an unresponsive card (SCARD_W_UNRESPONSIVE_CARD).
|
|
10
|
+
* Used to determine if we should fallback to T=0 protocol.
|
|
11
|
+
*/
|
|
12
|
+
function isUnresponsiveCardError(err) {
|
|
13
|
+
if (!err || typeof err.message !== 'string') {
|
|
14
|
+
return false;
|
|
15
|
+
}
|
|
16
|
+
return err.message.toLowerCase().includes('unresponsive');
|
|
17
|
+
}
|
|
6
18
|
/**
|
|
7
19
|
* High-level event-driven API for PC/SC devices
|
|
8
20
|
*
|
|
@@ -120,7 +132,7 @@ class Devices extends events_1.EventEmitter {
|
|
|
120
132
|
}
|
|
121
133
|
/**
|
|
122
134
|
* Get all currently connected cards
|
|
123
|
-
* @returns
|
|
135
|
+
* @returns ReadonlyMap of reader name to Card object
|
|
124
136
|
*/
|
|
125
137
|
getCards() {
|
|
126
138
|
const cards = new Map();
|
|
@@ -224,24 +236,24 @@ class Devices extends events_1.EventEmitter {
|
|
|
224
236
|
const readers = this._context.listReaders();
|
|
225
237
|
const reader = readers.find((r) => r.name === readerName);
|
|
226
238
|
if (reader) {
|
|
227
|
-
let
|
|
239
|
+
let nativeCard;
|
|
228
240
|
try {
|
|
229
241
|
// First try with both T=0 and T=1 protocols
|
|
230
|
-
|
|
242
|
+
nativeCard = await reader.connect(this._SCARD_SHARE_SHARED, this._SCARD_PROTOCOL_T0 | this._SCARD_PROTOCOL_T1);
|
|
231
243
|
}
|
|
232
244
|
catch (dualProtocolErr) {
|
|
233
|
-
// If dual protocol fails
|
|
245
|
+
// If dual protocol fails with unresponsive card error,
|
|
234
246
|
// fallback to T=0 only (issue #34)
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
err.message.toLowerCase().includes('unresponsive')) {
|
|
238
|
-
card = await reader.connect(this._SCARD_SHARE_SHARED, this._SCARD_PROTOCOL_T0);
|
|
247
|
+
if (isUnresponsiveCardError(dualProtocolErr)) {
|
|
248
|
+
nativeCard = await reader.connect(this._SCARD_SHARE_SHARED, this._SCARD_PROTOCOL_T0);
|
|
239
249
|
}
|
|
240
250
|
else {
|
|
241
251
|
// Re-throw if it's a different error
|
|
242
252
|
throw dualProtocolErr;
|
|
243
253
|
}
|
|
244
254
|
}
|
|
255
|
+
// Wrap the native card to add autoGetResponse support
|
|
256
|
+
const card = (0, card_wrapper_1.wrapCard)(nativeCard);
|
|
245
257
|
state.card = card;
|
|
246
258
|
this.emit('card-inserted', {
|
|
247
259
|
reader: { name: readerName, state: eventState, atr: atr },
|
|
@@ -288,6 +300,12 @@ class Devices extends events_1.EventEmitter {
|
|
|
288
300
|
off(event, listener) {
|
|
289
301
|
return super.off(event, listener);
|
|
290
302
|
}
|
|
303
|
+
addListener(event, listener) {
|
|
304
|
+
return super.addListener(event, listener);
|
|
305
|
+
}
|
|
306
|
+
removeListener(event, listener) {
|
|
307
|
+
return super.removeListener(event, listener);
|
|
308
|
+
}
|
|
291
309
|
emit(event, ...args) {
|
|
292
310
|
return super.emit(event, ...args);
|
|
293
311
|
}
|
package/dist/lib/devices.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"devices.js","sourceRoot":"","sources":["../../lib/devices.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"devices.js","sourceRoot":"","sources":["../../lib/devices.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/index.d.ts
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
|
|
1
|
+
import type { ContextConstructor, ReaderMonitorConstructor } from './types';
|
|
2
|
+
export declare const Context: ContextConstructor;
|
|
2
3
|
export declare const Reader: unknown;
|
|
3
4
|
export declare const Card: unknown;
|
|
4
|
-
export declare const ReaderMonitor:
|
|
5
|
+
export declare const ReaderMonitor: ReaderMonitorConstructor;
|
|
5
6
|
export declare const SCARD_SHARE_EXCLUSIVE: number;
|
|
6
7
|
export declare const SCARD_SHARE_SHARED: number;
|
|
7
8
|
export declare const SCARD_SHARE_DIRECT: number;
|
|
@@ -25,6 +26,8 @@ export declare const SCARD_STATE_EXCLUSIVE: number;
|
|
|
25
26
|
export declare const SCARD_STATE_INUSE: number;
|
|
26
27
|
export declare const SCARD_STATE_MUTE: number;
|
|
27
28
|
export { Devices } from './devices';
|
|
29
|
+
export { transmitWithAutoResponse, buildGetResponseCommand, correctLeInCommand, } from './t0-handler';
|
|
30
|
+
export { CardWrapper, wrapCard } from './card-wrapper';
|
|
28
31
|
export { PCSCError, CardRemovedError, TimeoutError, NoReadersError, ServiceNotRunningError, SharingViolationError, createPCSCError, } from './errors';
|
|
29
32
|
export { SCARD_CTL_CODE, CM_IOCTL_GET_FEATURE_REQUEST, FEATURE_VERIFY_PIN_START, FEATURE_VERIFY_PIN_FINISH, FEATURE_MODIFY_PIN_START, FEATURE_MODIFY_PIN_FINISH, FEATURE_GET_KEY_PRESSED, FEATURE_VERIFY_PIN_DIRECT, FEATURE_MODIFY_PIN_DIRECT, FEATURE_MCT_READER_DIRECT, FEATURE_MCT_UNIVERSAL, FEATURE_IFD_PIN_PROPERTIES, FEATURE_ABORT, FEATURE_SET_SPE_MESSAGE, FEATURE_VERIFY_PIN_DIRECT_APP_ID, FEATURE_MODIFY_PIN_DIRECT_APP_ID, FEATURE_WRITE_DISPLAY, FEATURE_GET_KEY, FEATURE_IFD_DISPLAY_PROPERTIES, FEATURE_GET_TLV_PROPERTIES, FEATURE_CCID_ESC_COMMAND, parseFeatures, } from './control-codes';
|
|
30
33
|
export type { ReaderState, CardStatus, TransmitOptions, Card as CardInterface, Reader as ReaderInterface, Context as ContextInterface, MonitorEvent, ReaderMonitor as ReaderMonitorInterface, DeviceEvents, DevicesOptions, } from './types';
|
package/dist/lib/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../lib/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../lib/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACR,kBAAkB,EAElB,wBAAwB,EAC3B,MAAM,SAAS,CAAC;AAMjB,eAAO,MAAM,OAAO,EAAoB,kBAAkB,CAAC;AAC3D,eAAO,MAAM,MAAM,SAAe,CAAC;AACnC,eAAO,MAAM,IAAI,SAAa,CAAC;AAC/B,eAAO,MAAM,aAAa,EAA0B,wBAAwB,CAAC;AAG7E,eAAO,MAAM,qBAAqB,QAA8B,CAAC;AACjE,eAAO,MAAM,kBAAkB,QAA2B,CAAC;AAC3D,eAAO,MAAM,kBAAkB,QAA2B,CAAC;AAE3D,eAAO,MAAM,iBAAiB,QAA0B,CAAC;AACzD,eAAO,MAAM,iBAAiB,QAA0B,CAAC;AACzD,eAAO,MAAM,kBAAkB,QAA2B,CAAC;AAC3D,eAAO,MAAM,wBAAwB,QAAiC,CAAC;AAEvE,eAAO,MAAM,gBAAgB,QAAyB,CAAC;AACvD,eAAO,MAAM,gBAAgB,QAAyB,CAAC;AACvD,eAAO,MAAM,kBAAkB,QAA2B,CAAC;AAC3D,eAAO,MAAM,gBAAgB,QAAyB,CAAC;AAEvD,eAAO,MAAM,mBAAmB,QAA4B,CAAC;AAC7D,eAAO,MAAM,kBAAkB,QAA2B,CAAC;AAC3D,eAAO,MAAM,mBAAmB,QAA4B,CAAC;AAC7D,eAAO,MAAM,mBAAmB,QAA4B,CAAC;AAC7D,eAAO,MAAM,uBAAuB,QAAgC,CAAC;AACrE,eAAO,MAAM,iBAAiB,QAA0B,CAAC;AACzD,eAAO,MAAM,mBAAmB,QAA4B,CAAC;AAC7D,eAAO,MAAM,oBAAoB,QAA6B,CAAC;AAC/D,eAAO,MAAM,qBAAqB,QAA8B,CAAC;AACjE,eAAO,MAAM,iBAAiB,QAA0B,CAAC;AACzD,eAAO,MAAM,gBAAgB,QAAyB,CAAC;AAGvD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGpC,OAAO,EACH,wBAAwB,EACxB,uBAAuB,EACvB,kBAAkB,GACrB,MAAM,cAAc,CAAC;AAGtB,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAGvD,OAAO,EACH,SAAS,EACT,gBAAgB,EAChB,YAAY,EACZ,cAAc,EACd,sBAAsB,EACtB,qBAAqB,EACrB,eAAe,GAClB,MAAM,UAAU,CAAC;AAGlB,OAAO,EACH,cAAc,EACd,4BAA4B,EAC5B,wBAAwB,EACxB,yBAAyB,EACzB,wBAAwB,EACxB,yBAAyB,EACzB,uBAAuB,EACvB,yBAAyB,EACzB,yBAAyB,EACzB,yBAAyB,EACzB,qBAAqB,EACrB,0BAA0B,EAC1B,aAAa,EACb,uBAAuB,EACvB,gCAAgC,EAChC,gCAAgC,EAChC,qBAAqB,EACrB,eAAe,EACf,8BAA8B,EAC9B,0BAA0B,EAC1B,wBAAwB,EACxB,aAAa,GAChB,MAAM,iBAAiB,CAAC;AAGzB,YAAY,EACR,WAAW,EACX,UAAU,EACV,eAAe,EACf,IAAI,IAAI,aAAa,EACrB,MAAM,IAAI,eAAe,EACzB,OAAO,IAAI,gBAAgB,EAC3B,YAAY,EACZ,aAAa,IAAI,sBAAsB,EACvC,YAAY,EACZ,cAAc,GACjB,MAAM,SAAS,CAAC"}
|
package/dist/lib/index.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
4
|
-
exports.parseFeatures = exports.FEATURE_CCID_ESC_COMMAND = exports.FEATURE_GET_TLV_PROPERTIES = exports.FEATURE_IFD_DISPLAY_PROPERTIES = exports.FEATURE_GET_KEY = exports.FEATURE_WRITE_DISPLAY = void 0;
|
|
3
|
+
exports.FEATURE_MCT_UNIVERSAL = exports.FEATURE_MCT_READER_DIRECT = exports.FEATURE_MODIFY_PIN_DIRECT = exports.FEATURE_VERIFY_PIN_DIRECT = exports.FEATURE_GET_KEY_PRESSED = exports.FEATURE_MODIFY_PIN_FINISH = exports.FEATURE_MODIFY_PIN_START = exports.FEATURE_VERIFY_PIN_FINISH = exports.FEATURE_VERIFY_PIN_START = exports.CM_IOCTL_GET_FEATURE_REQUEST = exports.SCARD_CTL_CODE = exports.createPCSCError = exports.SharingViolationError = exports.ServiceNotRunningError = exports.NoReadersError = exports.TimeoutError = exports.CardRemovedError = exports.PCSCError = exports.wrapCard = exports.CardWrapper = exports.correctLeInCommand = exports.buildGetResponseCommand = exports.transmitWithAutoResponse = exports.Devices = exports.SCARD_STATE_MUTE = exports.SCARD_STATE_INUSE = exports.SCARD_STATE_EXCLUSIVE = exports.SCARD_STATE_ATRMATCH = exports.SCARD_STATE_PRESENT = exports.SCARD_STATE_EMPTY = exports.SCARD_STATE_UNAVAILABLE = exports.SCARD_STATE_UNKNOWN = exports.SCARD_STATE_CHANGED = exports.SCARD_STATE_IGNORE = exports.SCARD_STATE_UNAWARE = exports.SCARD_EJECT_CARD = exports.SCARD_UNPOWER_CARD = exports.SCARD_RESET_CARD = exports.SCARD_LEAVE_CARD = exports.SCARD_PROTOCOL_UNDEFINED = exports.SCARD_PROTOCOL_RAW = exports.SCARD_PROTOCOL_T1 = exports.SCARD_PROTOCOL_T0 = exports.SCARD_SHARE_DIRECT = exports.SCARD_SHARE_SHARED = exports.SCARD_SHARE_EXCLUSIVE = exports.ReaderMonitor = exports.Card = exports.Reader = exports.Context = void 0;
|
|
4
|
+
exports.parseFeatures = exports.FEATURE_CCID_ESC_COMMAND = exports.FEATURE_GET_TLV_PROPERTIES = exports.FEATURE_IFD_DISPLAY_PROPERTIES = exports.FEATURE_GET_KEY = exports.FEATURE_WRITE_DISPLAY = exports.FEATURE_MODIFY_PIN_DIRECT_APP_ID = exports.FEATURE_VERIFY_PIN_DIRECT_APP_ID = exports.FEATURE_SET_SPE_MESSAGE = exports.FEATURE_ABORT = exports.FEATURE_IFD_PIN_PROPERTIES = void 0;
|
|
5
5
|
// Load native addon
|
|
6
6
|
const addon = require('../../build/Release/smartcard_napi.node');
|
|
7
7
|
// Re-export native classes
|
|
@@ -35,6 +35,15 @@ exports.SCARD_STATE_MUTE = addon.SCARD_STATE_MUTE;
|
|
|
35
35
|
// Import and re-export Devices class
|
|
36
36
|
var devices_1 = require("./devices");
|
|
37
37
|
Object.defineProperty(exports, "Devices", { enumerable: true, get: function () { return devices_1.Devices; } });
|
|
38
|
+
// Import and re-export T=0 protocol handler
|
|
39
|
+
var t0_handler_1 = require("./t0-handler");
|
|
40
|
+
Object.defineProperty(exports, "transmitWithAutoResponse", { enumerable: true, get: function () { return t0_handler_1.transmitWithAutoResponse; } });
|
|
41
|
+
Object.defineProperty(exports, "buildGetResponseCommand", { enumerable: true, get: function () { return t0_handler_1.buildGetResponseCommand; } });
|
|
42
|
+
Object.defineProperty(exports, "correctLeInCommand", { enumerable: true, get: function () { return t0_handler_1.correctLeInCommand; } });
|
|
43
|
+
// Import and re-export card wrapper for low-level API users
|
|
44
|
+
var card_wrapper_1 = require("./card-wrapper");
|
|
45
|
+
Object.defineProperty(exports, "CardWrapper", { enumerable: true, get: function () { return card_wrapper_1.CardWrapper; } });
|
|
46
|
+
Object.defineProperty(exports, "wrapCard", { enumerable: true, get: function () { return card_wrapper_1.wrapCard; } });
|
|
38
47
|
// Import and re-export error classes
|
|
39
48
|
var errors_1 = require("./errors");
|
|
40
49
|
Object.defineProperty(exports, "PCSCError", { enumerable: true, get: function () { return errors_1.PCSCError; } });
|
package/dist/lib/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../lib/index.ts"],"names":[],"mappings":";;;;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../lib/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* T=0 protocol status word handling
|
|
3
|
+
*
|
|
4
|
+
* Handles automatic GET RESPONSE (SW1=61) and Le correction (SW1=6C)
|
|
5
|
+
* for T=0 protocol smart cards.
|
|
6
|
+
*/
|
|
7
|
+
import type { Card, TransmitOptions } from './types';
|
|
8
|
+
/**
|
|
9
|
+
* Build a GET RESPONSE APDU command (00 C0 00 00 Le)
|
|
10
|
+
*
|
|
11
|
+
* @param bytesAvailable Number of bytes to retrieve (Le value)
|
|
12
|
+
* @returns GET RESPONSE command buffer
|
|
13
|
+
*/
|
|
14
|
+
export declare function buildGetResponseCommand(bytesAvailable: number): Buffer;
|
|
15
|
+
/**
|
|
16
|
+
* Correct the Le value in an APDU command
|
|
17
|
+
*
|
|
18
|
+
* @param command Original command buffer
|
|
19
|
+
* @param newLe Corrected Le value from SW2
|
|
20
|
+
* @returns New command buffer with corrected Le
|
|
21
|
+
*/
|
|
22
|
+
export declare function correctLeInCommand(command: Buffer, newLe: number): Buffer;
|
|
23
|
+
/**
|
|
24
|
+
* Transmit an APDU with optional automatic T=0 status word handling
|
|
25
|
+
*
|
|
26
|
+
* @param card The card to transmit to
|
|
27
|
+
* @param command The APDU command
|
|
28
|
+
* @param options Transmit options including autoGetResponse
|
|
29
|
+
* @returns The response data
|
|
30
|
+
*/
|
|
31
|
+
export declare function transmitWithAutoResponse(card: Card, command: Buffer | number[], options?: TransmitOptions): Promise<Buffer>;
|
|
32
|
+
//# sourceMappingURL=t0-handler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"t0-handler.d.ts","sourceRoot":"","sources":["../../lib/t0-handler.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAErD;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,cAAc,EAAE,MAAM,GAAG,MAAM,CAEtE;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAezE;AAED;;;;;;;GAOG;AACH,wBAAsB,wBAAwB,CAC1C,IAAI,EAAE,IAAI,EACV,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,EAC1B,OAAO,GAAE,eAAoB,GAC9B,OAAO,CAAC,MAAM,CAAC,CA4CjB"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* T=0 protocol status word handling
|
|
4
|
+
*
|
|
5
|
+
* Handles automatic GET RESPONSE (SW1=61) and Le correction (SW1=6C)
|
|
6
|
+
* for T=0 protocol smart cards.
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.buildGetResponseCommand = buildGetResponseCommand;
|
|
10
|
+
exports.correctLeInCommand = correctLeInCommand;
|
|
11
|
+
exports.transmitWithAutoResponse = transmitWithAutoResponse;
|
|
12
|
+
/**
|
|
13
|
+
* Build a GET RESPONSE APDU command (00 C0 00 00 Le)
|
|
14
|
+
*
|
|
15
|
+
* @param bytesAvailable Number of bytes to retrieve (Le value)
|
|
16
|
+
* @returns GET RESPONSE command buffer
|
|
17
|
+
*/
|
|
18
|
+
function buildGetResponseCommand(bytesAvailable) {
|
|
19
|
+
return Buffer.from([0x00, 0xc0, 0x00, 0x00, bytesAvailable]);
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Correct the Le value in an APDU command
|
|
23
|
+
*
|
|
24
|
+
* @param command Original command buffer
|
|
25
|
+
* @param newLe Corrected Le value from SW2
|
|
26
|
+
* @returns New command buffer with corrected Le
|
|
27
|
+
*/
|
|
28
|
+
function correctLeInCommand(command, newLe) {
|
|
29
|
+
if (command.length === 4) {
|
|
30
|
+
// Case 1: No Le in original, append it
|
|
31
|
+
return Buffer.concat([command, Buffer.from([newLe])]);
|
|
32
|
+
}
|
|
33
|
+
else if (command.length === 5) {
|
|
34
|
+
// Case 2: Le at end, replace it
|
|
35
|
+
const newCmd = Buffer.from(command);
|
|
36
|
+
newCmd[4] = newLe;
|
|
37
|
+
return newCmd;
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
// Case 3/4: Command with Lc and data, Le at end
|
|
41
|
+
const newCmd = Buffer.from(command);
|
|
42
|
+
newCmd[newCmd.length - 1] = newLe;
|
|
43
|
+
return newCmd;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Transmit an APDU with optional automatic T=0 status word handling
|
|
48
|
+
*
|
|
49
|
+
* @param card The card to transmit to
|
|
50
|
+
* @param command The APDU command
|
|
51
|
+
* @param options Transmit options including autoGetResponse
|
|
52
|
+
* @returns The response data
|
|
53
|
+
*/
|
|
54
|
+
async function transmitWithAutoResponse(card, command, options = {}) {
|
|
55
|
+
const cmdBuffer = Buffer.isBuffer(command) ? command : Buffer.from(command);
|
|
56
|
+
// Transmit the initial command
|
|
57
|
+
let response = await card.transmit(cmdBuffer, options);
|
|
58
|
+
// If autoGetResponse is not enabled, return raw response
|
|
59
|
+
if (!options.autoGetResponse) {
|
|
60
|
+
return response;
|
|
61
|
+
}
|
|
62
|
+
// Handle T=0 special status words
|
|
63
|
+
const collectedData = [];
|
|
64
|
+
while (response.length >= 2) {
|
|
65
|
+
const sw1 = response[response.length - 2];
|
|
66
|
+
const sw2 = response[response.length - 1];
|
|
67
|
+
if (sw1 === 0x61) {
|
|
68
|
+
// SW1=61: More data available, send GET RESPONSE
|
|
69
|
+
// Collect any data before the status word
|
|
70
|
+
if (response.length > 2) {
|
|
71
|
+
collectedData.push(response.subarray(0, response.length - 2));
|
|
72
|
+
}
|
|
73
|
+
const getResponseCmd = buildGetResponseCommand(sw2);
|
|
74
|
+
response = await card.transmit(getResponseCmd, options);
|
|
75
|
+
}
|
|
76
|
+
else if (sw1 === 0x6c) {
|
|
77
|
+
// SW1=6C: Wrong Le, retry with correct value
|
|
78
|
+
const newCmd = correctLeInCommand(cmdBuffer, sw2);
|
|
79
|
+
response = await card.transmit(newCmd, options);
|
|
80
|
+
}
|
|
81
|
+
else {
|
|
82
|
+
// Not a special status word, we're done
|
|
83
|
+
break;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
// If we collected data from chained responses, concatenate it with final response
|
|
87
|
+
if (collectedData.length > 0) {
|
|
88
|
+
collectedData.push(response);
|
|
89
|
+
return Buffer.concat(collectedData);
|
|
90
|
+
}
|
|
91
|
+
return response;
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=t0-handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"t0-handler.js","sourceRoot":"","sources":["../../lib/t0-handler.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;AAUH,0DAEC;AASD,gDAeC;AAUD,4DAgDC;AA1FD;;;;;GAKG;AACH,SAAgB,uBAAuB,CAAC,cAAsB;IAC1D,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,cAAc,CAAC,CAAC,CAAC;AACjE,CAAC;AAED;;;;;;GAMG;AACH,SAAgB,kBAAkB,CAAC,OAAe,EAAE,KAAa;IAC7D,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,uCAAuC;QACvC,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1D,CAAC;SAAM,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC9B,gCAAgC;QAChC,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACpC,MAAM,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC;QAClB,OAAO,MAAM,CAAC;IAClB,CAAC;SAAM,CAAC;QACJ,gDAAgD;QAChD,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACpC,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC;QAClC,OAAO,MAAM,CAAC;IAClB,CAAC;AACL,CAAC;AAED;;;;;;;GAOG;AACI,KAAK,UAAU,wBAAwB,CAC1C,IAAU,EACV,OAA0B,EAC1B,UAA2B,EAAE;IAE7B,MAAM,SAAS,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAE5E,+BAA+B;IAC/B,IAAI,QAAQ,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAEvD,yDAAyD;IACzD,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,CAAC;QAC3B,OAAO,QAAQ,CAAC;IACpB,CAAC;IAED,kCAAkC;IAClC,MAAM,aAAa,GAAa,EAAE,CAAC;IAEnC,OAAO,QAAQ,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;QAC1B,MAAM,GAAG,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAC1C,MAAM,GAAG,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAE1C,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;YACf,iDAAiD;YACjD,0CAA0C;YAC1C,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACtB,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,EAAE,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;YAClE,CAAC;YAED,MAAM,cAAc,GAAG,uBAAuB,CAAC,GAAG,CAAC,CAAC;YACpD,QAAQ,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;QAC5D,CAAC;aAAM,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;YACtB,6CAA6C;YAC7C,MAAM,MAAM,GAAG,kBAAkB,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;YAClD,QAAQ,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACpD,CAAC;aAAM,CAAC;YACJ,wCAAwC;YACxC,MAAM;QACV,CAAC;IACL,CAAC;IAED,kFAAkF;IAClF,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC3B,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC7B,OAAO,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;IACxC,CAAC;IAED,OAAO,QAAQ,CAAC;AACpB,CAAC"}
|
package/dist/lib/types.d.ts
CHANGED
|
@@ -28,6 +28,16 @@ export interface TransmitOptions {
|
|
|
28
28
|
* Maximum: 262144 (256KB for extended APDUs)
|
|
29
29
|
*/
|
|
30
30
|
maxRecvLength?: number;
|
|
31
|
+
/**
|
|
32
|
+
* Automatically handle T=0 protocol status words:
|
|
33
|
+
* - SW1=61: Send GET RESPONSE to retrieve remaining data
|
|
34
|
+
* - SW1=6C: Retry with corrected Le value
|
|
35
|
+
*
|
|
36
|
+
* Works with both card.transmit() (when using Devices high-level API)
|
|
37
|
+
* and transmitWithAutoResponse() function.
|
|
38
|
+
* Default: false (raw responses returned)
|
|
39
|
+
*/
|
|
40
|
+
autoGetResponse?: boolean;
|
|
31
41
|
}
|
|
32
42
|
/**
|
|
33
43
|
* Represents a connected smart card
|
package/dist/lib/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../lib/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,MAAM,WAAW,WAAW;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,OAAO,CAAC;IACjB,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC5B;;;;OAIG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../lib/types.ts"],"names":[],"mappings":"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"}
|