4 // Copyright (C) Dean Camera, 2018.
6 // dean [at] fourwalledcubicle [dot] com
10 // Copyright 2018 Filipe Rodrigues (filipepazrodrigues [at] gmail [dot] com)
12 // LUFA Generic CCID device demo host test script. This script test multiple
13 // kinds of CCID messages and shows the result to the console
15 // You have to install the usb and async modules prior to executing this script:
16 // apt-get install libusb-1.0-0-dev
17 // npm install usb async sprintf
19 var usb
= require('usb');
20 var async
= require('async');
21 var sprintf
= require('sprintf');
23 var deviceVid
= 0x03EB;
24 var devicePid
= 0x206E;
26 var CCID_PC_to_RDR_IccPowerOn
= 0x62;
27 var CCID_PC_to_RDR_IccPowerOff
= 0x63;
28 var CCID_PC_to_RDR_GetSlotStatus
= 0x65;
29 var CCID_PC_to_RDR_XfrBlock
= 0x6f;
31 function getAndInitCcidDeviceAndInterface()
33 device
= usb
.findByIds(deviceVid
, devicePid
);
35 console
.log('No device found');
40 var ccidInterface
= device
.interface(0);
41 if (ccidInterface
.isKernelDriverActive()) {
42 ccidInterface
.detachKernelDriver();
44 ccidInterface
.claim();
46 return {ccidDevice
:device
, ccidInterface
:ccidInterface
};
49 function read(ccidInterface
, responseSize
, callback
)
51 inEndpoint
= ccidInterface
.endpoints
[0];
52 inEndpoint
.transfer(responseSize
, function(error
, data
) {
56 console
.log("Received data:", data
);
62 function write(ccidInterface
, message
, callback
)
64 outEndpoint
= ccidInterface
.endpoints
[1]
65 outEndpoint
.transfer( // Send a Set Report control request
66 message
, // message to be sent
67 function(error
) { // callback to be executed upon finishing the transfer
75 function IccPowerOnMessage(slot
, seq
)
78 CCID_PC_to_RDR_IccPowerOn
, //message type
82 0, //power select: automatic
87 function IccPowerOffMessage(slot
, seq
)
90 CCID_PC_to_RDR_IccPowerOff
, //message type
98 function GetSlotStatusMessage(slot
, seq
)
101 CCID_PC_to_RDR_GetSlotStatus
, //message type
109 function XfrBlockMessage(slot
, seq
, apdu
)
112 CCID_PC_to_RDR_XfrBlock
, //message type
113 apdu
.length
, 0, 0, 0, //length: only for < 0xFF
117 0, 0 //level parameter
126 write(ccidInterface
, new Buffer(IccPowerOnMessage(0, 1)), callback
);
129 read(ccidInterface
, 10 + 17, callback
);
132 write(ccidInterface
, new Buffer(IccPowerOffMessage(0, 2)), callback
);
135 read(ccidInterface
, 10, callback
);
138 write(ccidInterface
, new Buffer(GetSlotStatusMessage(0, 3)), callback
);
141 read(ccidInterface
, 10, callback
);
144 write(ccidInterface
, new Buffer(XfrBlockMessage(0, 4, [0x0, 0xFD, 0x0, 0x0, 0x0])), callback
);
147 read(ccidInterface
, 10 + 2, callback
);
152 var ccidDeviceAndInterface
= getAndInitCcidDeviceAndInterface();
153 var ccidDevice
= ccidDeviceAndInterface
.ccidDevice
154 var ccidInterface
= ccidDeviceAndInterface
.ccidInterface
;
156 console
.log(sprintf("Connected to device 0x%04X/0x%04X - %s [%s]",
157 ccidDevice
.deviceDescriptor
.idVendor
,
158 ccidDevice
.deviceDescriptor
.idProduct
,
159 ccidDevice
.deviceDescriptor
.iProduct
,
160 ccidDevice
.deviceDescriptor
.iManufacturer
));