- Notifications
You must be signed in to change notification settings - Fork56
PCSC smartcard reader library for nodejs
License
tomkp/smartcard
Folders and files
Name | Name | Last commit message | Last commit date | |
---|---|---|---|---|
Repository files navigation
Smartcard library.
This is a simple wrapper aroundSantiago Gimeno's greatpcsclite library.
Used byCard Spy
The following objects are defined by thesmartcard
library, each contains its own set of methods and events.
A general object that provides access to all smartcard related devices.
Thedevices
object emits the following events
Emitted when a card reader is attached.Returns:
Object
Device
Array
: List of all devices, returned viadevices.listDevices()
Emitted when a card reader is detached.Returns:
Object
Device
Array
: List of all devices, returned viadevices.listDevices()
Emitted when an error occursReturnsObject
:
- error
Error
The following methods are available within thedevices
class.
The constructor for a devices object takes no arguments,
devices=newDevices();
ReturnsPromise
- Resolves with activationevent
ReturnsPromise
- Resolves with deactivationevent
ReturnsObject
a list of the different devices attached, each adevice
object
name
String
: The text name of a deviceReturns
Device
An object representing a specific card reader (device).
The following methods are available within thedevice
class.
Returns the name of the attached device.
Sends a command to the connected device
- data
Buffer
: data to be transmitted - res_len
Number
: Maximum length of the expected response, includes the 2 byte response (sw1 and sw2) - protocol
Number
: Protocol to be used in the transmission - cb(error,response)
Function
: Called when transmit function completes- error
Error
- output
Buffer
- error
Thedevice
object emits the following events
Emitted when a smartcard is inserted into a card reader
ReturnsObject
:
- device
Device
- card
Card
Emitted when a smartcard is removed from a card reader
ReturnsObject
:
- name
String
- card
Card
An object representing an attached smart card.
The following methods are available within thecard
class.
ReturnsString
containing the atr of the card
Sends a command to the card
- commandApdu: The command to be sent to the card
String
Buffer
Array
CommandApdu
- callback(error,response): (optional) Function to call upon completion of the command
- error
Error
- response
Buffer
- error
ReturnsPromise
- Resolves withresponse
Buffer
- Rejects witherror
Error
If no callback is specified, returns aPromise
*
Thecard
object emits the following events
Emitted when a command is sent to the smartcard.
ReturnsObject
:
- card
Card
- command
Buffer
Emitted when a response is received from the card.
ReturnsObject
:
- card
Card
- command
Buffer
- response
ResponseApdu
An object representing a command to send to a smart card
TheCommandApdu
class has the following methods.
Creates a new instance and sets the appropriate items
- obj
Object
- cla
Number
: The class of the command, typically 0 - ins
Number
: The instruction - p1
Number
: The value of p1 - p2
Number
: The value of p2 - data
Array
(optional): The value of data - le
Number
(optional): The value of le
- cla
OR
- obj
Array
: Byte array representing the whole command
Converts the command to a Buffer
- Returns
Buffer
Converts the command to a hex string
- Returns
String
Converts the command to a byte array
- Returns
Array
Updates the le value of the command
- le
Number
: The new le value
Class representing a response from the card
TheResponseApdu
class has the following methods.
Interprets the return code and attempts to provide a text translation.
- Returns
String
Returns the response data without including the status code
- Returns
String
Returns only the status code
- Returns
String
Check if the status code is 9000
- Returns
Boolean
Returns the whole buffer, status code and data
- Returns
Buffer
Reads the status code and looks for a 61 as sw1, meaning more data is available
- Returns
Boolean
Reads sw2 staus code to return number of bytes left, when sw1 is 61. A value of 0 means there are more than 256 bytes remaining.
- Returns
Number
Checks status code for 6c as sw1
- Returns
Boolean
If sw1 is 6c, returns the correct length from sw2. A value of 0 means there are more than 256 bytes remaining.
- Returns
Number
An object offering general commands to most ISO7816 compliant smart cards.
Sets up theIso7816Application
object
- card
Card
: The card to communicate with using ISO7816 standards
Sends the provided command to the card. Automatically retrieve the full response, even if it requires multiple GET_RESPONSE commands
- commandApdu
CommandApdu
: Command to send to the card
Returns
ResponseApdu
Complete response from card
Sends the SELECT command to the card, often called selecting an application
- bytes
Buffer
: The resource locater (AID, etc) - p1
Number
: Value to specify as the p1 value - p2
Number
: Value to specify as the p2 value
Returns
ResponseApdu
Complete response from card
Sends a single GET_RESPONSE command to the card
- length
Number
: The length of the response expected, maximum is 0xFF
Returns
ResponseApdu
Complete response from card
Sends a READ_RECORD command to the card
- sfi
Number
: The sfi - record
Number
: The record
Returns
ResponseApdu
Complete response from card
Sends a GET_DATA command to the card
- p1
Number
: Value to specify as the p1 value - p2
Number
: Value to specify as the p2 value
Returns
ResponseApdu
Complete response from card
TheIso7816Application
class emits the following events
Emitted when a successful reply to aselectFile()
command is received.
ReturnsObject
:
- application
String
'use strict';constsmartcard=require('smartcard');constDevices=smartcard.Devices;constdevices=newDevices();devices.on('device-activated',(event=>{console.log(`Device '${event.device}' activated`);event.devices.map((device,index)=>{console.log(`Device #${index+1}: '${device.name}'`);});}));
'use strict';constsmartcard=require('smartcard');constDevices=smartcard.Devices;constdevices=newDevices();devices.onActivated().then(event=>{console.log(`Device '${event.device}' activated`);event.devices.map((device,index)=>{console.log(`Device #${index+1}: '${device.name}'`);});});
'use strict';constsmartcard=require('smartcard');constDevices=smartcard.Devices;constIso7816Application=smartcard.Iso7816Application;constdevices=newDevices();devices.on('device-activated',event=>{constcurrentDevices=event.devices;letdevice=event.device;console.log(`Device '${device}' activated, devices:${currentDevices}`);for(letpropincurrentDevices){console.log("Devices: "+currentDevices[prop]);}device.on('card-inserted',event=>{letcard=event.card;console.log(`Card '${card.getAtr()}' inserted into '${event.device}'`);card.on('command-issued',event=>{console.log(`Command '${event.command}' issued to '${event.card}' `);});card.on('response-received',event=>{console.log(`Response '${event.response}' received from '${event.card}' in response to '${event.command}'`);});constapplication=newIso7816Application(card);application.selectFile([0x31,0x50,0x41,0x59,0x2E,0x53,0x59,0x53,0x2E,0x44,0x44,0x46,0x30,0x31]).then(response=>{console.info(`Select PSE Response: '${response}' '${response.meaning()}'`);}).catch(error=>{console.error('Error:',error,error.stack);});});device.on('card-removed',event=>{console.log(`Card removed from '${event.name}' `);});});devices.on('device-deactivated',event=>{console.log(`Device '${event.device}' deactivated, devices: [${event.devices}]`);});
About
PCSC smartcard reader library for nodejs