• Stars
    star
    134
  • Rank 270,967 (Top 6 %)
  • Language
    JavaScript
  • License
    MIT License
  • Created over 8 years ago
  • Updated almost 2 years ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

PCSC smartcard reader library for nodejs

smartcard

Smartcard library.

This is a simple wrapper around Santiago Gimeno's great pcsclite library.

Used by Card Spy

API

The following objects are defined by the smartcard library, each contains its own set of methods and events.

Class: Devices

A general object that provides access to all smartcard related devices.

Events

The devices object emits the following events

Event: 'device-activated'

Emitted when a card reader is attached. Returns:

  • Object
    • Device
    • Array: List of all devices, returned via devices.listDevices()
Event: 'device-deactivated'

Emitted when a card reader is detached. Returns:

  • Object
    • Device
    • Array: List of all devices, returned via devices.listDevices()
Event: 'error'

Emitted when an error occurs Returns Object:

  • error Error

Methods

The following methods are available within the devices class.

Constructor

The constructor for a devices object takes no arguments,

devices = new Devices();
devices.onActivated()

Returns Promise

  • Resolves with activation event
devices.onDeactivated()

Returns Promise

  • Resolves with deactivation event
devices.listDevices()

Returns Object a list of the different devices attached, each a device object

devices.lookup(name)
  • name String: The text name of a device

  • Returns Device

Class: Device

An object representing a specific card reader (device).

Methods

The following methods are available within the device class.

device.getName()

Returns the name of the attached device.

device.transmit(data, res_len, protocol, cb)

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

Events

The device object emits the following events

Event: 'card-inserted'

Emitted when a smartcard is inserted into a card reader

Returns Object:

  • device Device
  • card Card
Event: 'card-removed'

Emitted when a smartcard is removed from a card reader

Returns Object:

  • name String
  • card Card

Class: Card

An object representing an attached smart card.

Methods

The following methods are available within the card class.

card.getAtr()

Returns String containing the atr of the card

card.issueCommand(commandApdu, callback)

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

Returns Promise

  • Resolves with response Buffer
  • Rejects with error Error

If no callback is specified, returns a Promise *

Events

The card object emits the following events

Event: 'command-issued'

Emitted when a command is sent to the smartcard.

Returns Object:

  • card Card
  • command Buffer
Event: 'response-received'

Emitted when a response is received from the card.

Returns Object:

  • card Card
  • command Buffer
  • response ResponseApdu

Class: CommandApdu

An object representing a command to send to a smart card

Methods

The CommandApdu class has the following methods.

Constructor CommandApdu(obj)

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

OR

  • obj Array: Byte array representing the whole command
CommandApdu.toBuffer()

Converts the command to a Buffer

  • Returns Buffer
CommandApdu.toString()

Converts the command to a hex string

  • Returns String
CommandApdu.toByteArray()

Converts the command to a byte array

  • Returns Array
CommandApdu.setLe(le)

Updates the le value of the command

  • le Number: The new le value

Class: ResponseApdu

Class representing a response from the card

Methods

The ResponseApdu class has the following methods.

Constructor
ResponseApdu.meaning()

Interprets the return code and attempts to provide a text translation.

  • Returns String
ResponseApdu.getDataOnly()

Returns the response data without including the status code

  • Returns String
ResponseApdu.getStatusCode()

Returns only the status code

  • Returns String
ResponseApdu.isOk()

Check if the status code is 9000

  • Returns Boolean
ResponseApdu.buffer()

Returns the whole buffer, status code and data

  • Returns Buffer
ResponseApdu.hasMoreBytesAvailable()

Reads the status code and looks for a 61 as sw1, meaning more data is available

  • Returns Boolean
ResponseApdu.numberOfBytesAvailable()

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
ResponseApdu.isWrongLength()

Checks status code for 6c as sw1

  • Returns Boolean
ResponseApdu.correctLength()

If sw1 is 6c, returns the correct length from sw2. A value of 0 means there are more than 256 bytes remaining.

  • Returns Number

Class: Iso7816Application

An object offering general commands to most ISO7816 compliant smart cards.

Methods

Constructor Iso7816Application(card)

Sets up the Iso7816Application object

  • card Card: The card to communicate with using ISO7816 standards
Iso7816Application.issueCommand(commandApdu)

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
Iso7816Application.selectFile(bytes, p1, p2)

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
Iso7816Application.getResponse(length)

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
Iso7816Application.getResponse(sfi,record)

Sends a READ_RECORD command to the card

  • sfi Number: The sfi
  • record Number: The record

Returns

  • ResponseApdu Complete response from card
Iso7816Application.getData(p1, p2)

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

Events

The Iso7816Application class emits the following events

Event: 'application-selected'

Emitted when a successful reply to a selectFile() command is received.

Returns Object:

  • application String

Examples

With event emitter

'use strict';

const smartcard = require('smartcard');
const Devices = smartcard.Devices;
const devices = new Devices();


devices.on('device-activated', (event => {
    console.log(`Device '${event.device}' activated`);
    event.devices.map((device, index) => {
        console.log(`Device #${index + 1}: '${device.name}'`);
    });
}));

Using promises

'use strict';

const smartcard = require('smartcard');
const Devices = smartcard.Devices;
const devices = new Devices();


devices.onActivated().then(event => {
    console.log(`Device '${event.device}' activated`);
    event.devices.map((device, index) => {
        console.log(`Device #${index + 1}: '${device.name}'`);
    });
});

Selecting the Payment Systems Environment on an EMV (Chip & Pin) card

'use strict';

const smartcard = require('smartcard');
const Devices = smartcard.Devices;
const Iso7816Application = smartcard.Iso7816Application;

const devices = new Devices();

devices.on('device-activated', event => {
    const currentDevices = event.devices;
    let device = event.device;
    console.log(`Device '${device}' activated, devices: ${currentDevices}`);
    for (let prop in currentDevices) {
        console.log("Devices: " + currentDevices[prop]);
    }

    device.on('card-inserted', event => {
        let card = 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}'`);
        });

        const application = new Iso7816Application(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}]`);
});

More Repositories

1

react-split-pane

React split-pane component
JavaScript
3,198
star
2

react-layout-pane

React layout component using flexbox
JavaScript
98
star
3

card-spy

SmartCard / ISO7816 / EMV diagnostic tool
JavaScript
86
star
4

emv

EMV / Chip and PIN library
JavaScript
28
star
5

react-calendar-pane

React calendar component
JavaScript
26
star
6

card-reader

PCSC smartcard reader library for nodejs
JavaScript
17
star
7

react-tab-pane

React tab-pane component
JavaScript
9
star
8

flexbox

I ♥ Flexbox. Forever.
HTML
8
star
9

react-auto-suggest

React auto-suggest component
JavaScript
7
star
10

react-tree-pane

Tree-Pane component built with React
JavaScript
5
star
11

scroll-to-bottom

JavaScript
5
star
12

apdu

JavaScript
4
star
13

react-application

React layout components
JavaScript
3
star
14

iso7816

JavaScript
2
star
15

pointbreak-as-a-service

JavaScript
2
star
16

agon-as-a-service

2
star
17

hexify

Hex conversion utils
JavaScript
2
star
18

moxy

Simple mocking / proxy http server annotations for integration tests
Java
2
star
19

react-graph-bars

JavaScript
2
star
20

aspect-ratios

JavaScript
1
star
21

chess

JavaScript
1
star
22

cardx

CSS
1
star
23

weather-icons

Icons for where's hot now?
1
star
24

colors

JavaScript
1
star
25

select

Simple util for selecting DOM elements
JavaScript
1
star
26

open-weather-map-service

JavaScript
1
star
27

dates.js

Simple javascript date parser / formatter
JavaScript
1
star
28

yahoo-finance-quotes

Fetch stock prices from the Yahoo finance api
JavaScript
1
star
29

todo.js

Vanilla framework-free TODO application
JavaScript
1
star
30

super-simple-react

Super simple react
JavaScript
1
star
31

simple-redux

JavaScript
1
star
32

nashville

specification runner
Java
1
star
33

ui

HTML
1
star
34

chatbot-conversation-pane

JavaScript
1
star
35

iestimate

simple js estimater for iphone
1
star
36

analog-clock

Analog clock build with svg, css variables and a little javascript
HTML
1
star
37

google-finance-service

Google finance micro service
JavaScript
1
star
38

create.js

Shortcut for document.createElement
JavaScript
1
star