4 // Copyright (C) Dean Camera, 2019.
6 // dean [at] fourwalledcubicle [dot] com
10 // Copyright 2019 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_SetParameters
= 0x61;
27 var CCID_PC_to_RDR_GetParameters
= 0x6C;
28 var CCID_PC_to_RDR_IccPowerOn
= 0x62;
29 var CCID_PC_to_RDR_IccPowerOff
= 0x63;
30 var CCID_PC_to_RDR_GetSlotStatus
= 0x65;
31 var CCID_PC_to_RDR_XfrBlock
= 0x6f;
33 function getAndInitCcidDeviceAndInterface()
35 device
= usb
.findByIds(deviceVid
, devicePid
);
37 console
.log('No device found');
42 var ccidInterface
= device
.interface(0);
43 if (ccidInterface
.isKernelDriverActive()) {
44 ccidInterface
.detachKernelDriver();
46 ccidInterface
.claim();
48 return {ccidDevice
:device
, ccidInterface
:ccidInterface
};
51 function read(ccidInterface
, responseSize
, callback
)
53 inEndpoint
= ccidInterface
.endpoints
[0];
54 inEndpoint
.transfer(responseSize
, function(error
, data
) {
58 console
.log("Received data:", data
);
64 function write(ccidInterface
, message
, callback
)
66 outEndpoint
= ccidInterface
.endpoints
[1]
67 outEndpoint
.transfer( // Send a Set Report control request
68 message
, // message to be sent
69 function(error
) { // callback to be executed upon finishing the transfer
77 function GetParametersMessage(slot
, seq
, protocolNum
, t0Params
)
80 CCID_PC_to_RDR_GetParameters
, //message type
88 function SetParametersMessage(slot
, seq
, protocolNum
, t0Params
)
91 CCID_PC_to_RDR_SetParameters
, //message type
92 t0Params
.length
, 0, 0, 0, //length
101 function IccPowerOnMessage(slot
, seq
)
104 CCID_PC_to_RDR_IccPowerOn
, //message type
108 0, //power select: automatic
113 function IccPowerOffMessage(slot
, seq
)
116 CCID_PC_to_RDR_IccPowerOff
, //message type
124 function GetSlotStatusMessage(slot
, seq
)
127 CCID_PC_to_RDR_GetSlotStatus
, //message type
135 function XfrBlockMessage(slot
, seq
, apdu
)
138 CCID_PC_to_RDR_XfrBlock
, //message type
139 apdu
.length
, 0, 0, 0, //length: only for < 0xFF
143 0, 0 //level parameter
148 function testCcidMessages()
152 write(ccidInterface
, new Buffer(IccPowerOnMessage(0, 1)), callback
);
155 read(ccidInterface
, 10 + 17, callback
);
158 write(ccidInterface
, new Buffer(IccPowerOffMessage(0, 2)), callback
);
161 read(ccidInterface
, 10, callback
);
164 write(ccidInterface
, new Buffer(GetSlotStatusMessage(0, 3)), callback
);
167 read(ccidInterface
, 10, callback
);
170 write(ccidInterface
, new Buffer(SetParametersMessage(0, 4, 0, [0x11, 0x00, 0x00, 0x0a, 0x00])), callback
);
173 //must return 82 05 00 00 00 00 04 00 80 00 11 00 00 0a 00
174 read(ccidInterface
, 30, callback
);
177 write(ccidInterface
, new Buffer(GetParametersMessage(0, 5, 0)), callback
);
180 //must return 82 05 00 00 00 00 04 00 80 00 11 00 00 0a 00
181 read(ccidInterface
, 30, callback
);
188 .concat(testCcidMessages())
192 var ccidDeviceAndInterface
= getAndInitCcidDeviceAndInterface();
193 var ccidDevice
= ccidDeviceAndInterface
.ccidDevice
194 var ccidInterface
= ccidDeviceAndInterface
.ccidInterface
;
196 console
.log(sprintf("Connected to device 0x%04X/0x%04X - %s [%s]",
197 ccidDevice
.deviceDescriptor
.idVendor
,
198 ccidDevice
.deviceDescriptor
.idProduct
,
199 ccidDevice
.deviceDescriptor
.iProduct
,
200 ccidDevice
.deviceDescriptor
.iManufacturer
));