mirror of
https://github.com/FeitianTech/u2f-ref-code.git
synced 2026-08-28 10:40:37 -07:00
151 lines
4.0 KiB
JavaScript
151 lines
4.0 KiB
JavaScript
// Copyright 2014 Google Inc. All rights reserved
|
|
//
|
|
// Use of this source code is governed by a BSD-style
|
|
// license that can be found in the LICENSE file or at
|
|
// https://developers.google.com/open-source/licenses/bsd
|
|
|
|
/**
|
|
* @fileoverview Interface for representing a low-level gnubby device.
|
|
*/
|
|
'use strict';
|
|
|
|
/**
|
|
* Low level gnubby 'driver'. One per physical USB device.
|
|
* @interface
|
|
*/
|
|
function GnubbyDevice() {}
|
|
|
|
// Commands of the USB interface.
|
|
/** Echo data through local processor only */
|
|
GnubbyDevice.CMD_PING = 0x81;
|
|
/** Perform reset action and read ATR string */
|
|
GnubbyDevice.CMD_ATR = 0x82;
|
|
/** Send raw APDU */
|
|
GnubbyDevice.CMD_APDU = 0x83;
|
|
/** Send lock channel command */
|
|
GnubbyDevice.CMD_LOCK = 0x84;
|
|
/** Obtain system information record */
|
|
GnubbyDevice.CMD_SYSINFO = 0x85;
|
|
/** Obtain an unused channel ID */
|
|
GnubbyDevice.CMD_INIT = 0x86;
|
|
/** Control prompt flashing */
|
|
GnubbyDevice.CMD_PROMPT = 0x87;
|
|
/** Send device identification wink */
|
|
GnubbyDevice.CMD_WINK = 0x88;
|
|
/** USB test */
|
|
GnubbyDevice.CMD_USB_TEST = 0xb9;
|
|
/** Device Firmware Upgrade */
|
|
GnubbyDevice.CMD_DFU = 0xba;
|
|
/** Protocol resync command */
|
|
GnubbyDevice.CMD_SYNC = 0xbc;
|
|
/** Error response */
|
|
GnubbyDevice.CMD_ERROR = 0xbf;
|
|
|
|
// Low-level error codes.
|
|
/** No error */
|
|
GnubbyDevice.OK = 0;
|
|
/** Invalid command */
|
|
GnubbyDevice.INVALID_CMD = 1;
|
|
/** Invalid parameter */
|
|
GnubbyDevice.INVALID_PAR = 2;
|
|
/** Invalid message length */
|
|
GnubbyDevice.INVALID_LEN = 3;
|
|
/** Invalid message sequencing */
|
|
GnubbyDevice.INVALID_SEQ = 4;
|
|
/** Message has timed out */
|
|
GnubbyDevice.TIMEOUT = 5;
|
|
/** CHannel is busy */
|
|
GnubbyDevice.BUSY = 6;
|
|
/** Access denied */
|
|
GnubbyDevice.ACCESS_DENIED = 7;
|
|
/** Device is gone */
|
|
GnubbyDevice.GONE = 8;
|
|
/** Verification error */
|
|
GnubbyDevice.VERIFY_ERROR = 9;
|
|
/** Command requires channel lock */
|
|
GnubbyDevice.LOCK_REQUIRED = 10;
|
|
/** Sync error */
|
|
GnubbyDevice.SYNC_FAIL = 11;
|
|
/** Other unspecified error */
|
|
GnubbyDevice.OTHER = 127;
|
|
|
|
// Remote helper errors.
|
|
/** Not a remote helper */
|
|
GnubbyDevice.NOTREMOTE = 263;
|
|
/** Could not reach remote endpoint */
|
|
GnubbyDevice.COULDNOTDIAL = 264;
|
|
|
|
// chrome.usb-related errors.
|
|
/** No device */
|
|
GnubbyDevice.NODEVICE = 512;
|
|
/** Permission denied */
|
|
GnubbyDevice.NOPERMISSION = 666;
|
|
|
|
/** Destroys this low-level device instance. */
|
|
GnubbyDevice.prototype.destroy = function() {};
|
|
|
|
/**
|
|
* Register a client for this gnubby.
|
|
* @param {*} who The client.
|
|
*/
|
|
GnubbyDevice.prototype.registerClient = function(who) {};
|
|
|
|
/**
|
|
* De-register a client.
|
|
* @param {*} who The client.
|
|
* @return {number} The number of remaining listeners for this device, or -1
|
|
* if this had no clients to start with.
|
|
*/
|
|
GnubbyDevice.prototype.deregisterClient = function(who) {};
|
|
|
|
/**
|
|
* @param {*} who The client.
|
|
* @return {boolean} Whether this device has who as a client.
|
|
*/
|
|
GnubbyDevice.prototype.hasClient = function(who) {};
|
|
|
|
/**
|
|
* Queue command to be sent.
|
|
* If queue was empty, initiate the write.
|
|
* @param {number} cid The client's channel ID.
|
|
* @param {number} cmd The command to send.
|
|
* @param {ArrayBuffer|Uint8Array} data Command data
|
|
*/
|
|
GnubbyDevice.prototype.queueCommand = function(cid, cmd, data) {};
|
|
|
|
/**
|
|
* @typedef {{
|
|
* vendorId: number,
|
|
* productId: number
|
|
* }}
|
|
*/
|
|
var UsbDeviceSpec;
|
|
|
|
/**
|
|
* Gets the list of USB devices permitted by this app.
|
|
* @param {function(!Array.<!UsbDeviceSpec>)} cb Called back with a list of USB
|
|
* device specifiers.
|
|
*/
|
|
GnubbyDevice.getPermittedUsbDevices = function(cb) {
|
|
chrome.permissions.getAll(function(perms) {
|
|
if (!perms.hasOwnProperty('permissions')) {
|
|
cb([]);
|
|
return;
|
|
}
|
|
var devs = [];
|
|
var permissions = perms['permissions'];
|
|
for (var i = 0; i < permissions.length; i++) {
|
|
var permission = permissions[i];
|
|
if (typeof permission === 'object' &&
|
|
permission.hasOwnProperty('usbDevices')) {
|
|
for (var j = 0; j < permission['usbDevices'].length; j++) {
|
|
var dev = permission['usbDevices'][j];
|
|
devs.push(
|
|
{'vendorId': dev['vendorId'], 'productId': dev['productId']});
|
|
}
|
|
}
|
|
}
|
|
cb(devs);
|
|
});
|
|
};
|