- added command line parameter for USB iInterface, use it to fool AusweisApp
- fixed population of event notification status - dont initialize serial number, when given in input git-svn-id: https://vsmartcard.svn.sourceforge.net/svnroot/vsmartcard@295 96b47cad-a561-4643-ad3b-153ac7d7599c
This commit is contained in:
@@ -58,6 +58,8 @@ static int debug = 0;
|
|||||||
static int dohid = 0;
|
static int dohid = 0;
|
||||||
static int doint = 0;
|
static int doint = 0;
|
||||||
static int doinfo = 0;
|
static int doinfo = 0;
|
||||||
|
static const char *doserial = NULL;
|
||||||
|
static const char *doiintf = NULL;
|
||||||
static int usb_reader_num = -1;
|
static int usb_reader_num = -1;
|
||||||
static const char *cdriver = NULL;
|
static const char *cdriver = NULL;
|
||||||
|
|
||||||
@@ -65,6 +67,7 @@ static const char *cdriver = NULL;
|
|||||||
#define OPT_INTERRUPT 'n'
|
#define OPT_INTERRUPT 'n'
|
||||||
#define OPT_READER 'r'
|
#define OPT_READER 'r'
|
||||||
#define OPT_SERIAL 's'
|
#define OPT_SERIAL 's'
|
||||||
|
#define OPT_IINTERFACE 'i'
|
||||||
#define OPT_PRODUCT 'p'
|
#define OPT_PRODUCT 'p'
|
||||||
#define OPT_VENDOR 'e'
|
#define OPT_VENDOR 'e'
|
||||||
#define OPT_VERBOSE 'v'
|
#define OPT_VERBOSE 'v'
|
||||||
@@ -77,6 +80,7 @@ static const struct option options[] = {
|
|||||||
{ "reader", required_argument, NULL, OPT_READER },
|
{ "reader", required_argument, NULL, OPT_READER },
|
||||||
{ "card-driver", required_argument, NULL, OPT_CARD },
|
{ "card-driver", required_argument, NULL, OPT_CARD },
|
||||||
{ "serial", required_argument, NULL, OPT_SERIAL },
|
{ "serial", required_argument, NULL, OPT_SERIAL },
|
||||||
|
{ "interface", required_argument, NULL, OPT_IINTERFACE },
|
||||||
{ "product", required_argument, NULL, OPT_PRODUCT },
|
{ "product", required_argument, NULL, OPT_PRODUCT },
|
||||||
{ "vendor", required_argument, NULL, OPT_VENDOR },
|
{ "vendor", required_argument, NULL, OPT_VENDOR },
|
||||||
{ "interrupt", no_argument, NULL, OPT_INTERRUPT },
|
{ "interrupt", no_argument, NULL, OPT_INTERRUPT },
|
||||||
@@ -87,9 +91,10 @@ static const struct option options[] = {
|
|||||||
static const char *option_help[] = {
|
static const char *option_help[] = {
|
||||||
/*"Emulate HID device",*/
|
/*"Emulate HID device",*/
|
||||||
"Print help and exit",
|
"Print help and exit",
|
||||||
"Number of reader to use (default: auto-detect)",
|
"Number of reader (default: auto-detect)",
|
||||||
"Which card driver to use (default: auto-detect)",
|
"Card driver to use (default: auto-detect)",
|
||||||
"USB serial number (default: random)",
|
"USB serial number (default: random)",
|
||||||
|
"USB iInterface (default: notification status)",
|
||||||
"USB product ID (default: 0x3010)",
|
"USB product ID (default: 0x3010)",
|
||||||
"USB vendor ID (default: 0x0D46)",
|
"USB vendor ID (default: 0x0D46)",
|
||||||
"Add interrupt pipe for CCID",
|
"Add interrupt pipe for CCID",
|
||||||
@@ -286,8 +291,8 @@ static const struct usb_endpoint_descriptor *hs_eps [] = {
|
|||||||
/* 56 is the maximum for the KOBIL Class 3 Reader */
|
/* 56 is the maximum for the KOBIL Class 3 Reader */
|
||||||
static char serial [57];
|
static char serial [57];
|
||||||
|
|
||||||
static const char interrupt_on_string[] = "REINER SCT cyberJack pinpad/e-com USB";
|
static const char interrupt_on_string[] = "Insertion and removal events enabled";
|
||||||
static const char interrupt_off_string[] = "REINER SCT cyberJack pinpad/e-com USB";
|
static const char interrupt_off_string[] = "Insertion and removal events disabled";
|
||||||
static struct usb_string stringtab [] = {
|
static struct usb_string stringtab [] = {
|
||||||
{ STRINGID_MFGR, "Virtual Smart Card Architecture", },
|
{ STRINGID_MFGR, "Virtual Smart Card Architecture", },
|
||||||
{ STRINGID_PRODUCT, "CCID Emulator", },
|
{ STRINGID_PRODUCT, "CCID Emulator", },
|
||||||
@@ -593,12 +598,14 @@ static int autoconfig ()
|
|||||||
if (!doint) {
|
if (!doint) {
|
||||||
source_sink_intf.bNumEndpoints = 2;
|
source_sink_intf.bNumEndpoints = 2;
|
||||||
int i;
|
int i;
|
||||||
|
if (!doiintf) {
|
||||||
for (i=0; i<sizeof(stringtab)/sizeof(struct usb_string); i++) {
|
for (i=0; i<sizeof(stringtab)/sizeof(struct usb_string); i++) {
|
||||||
if (stringtab[i].id == STRINGID_INTERFACE) {
|
if (stringtab[i].id == STRINGID_INTERFACE) {
|
||||||
stringtab[i].s = interrupt_off_string;
|
stringtab[i].s = interrupt_off_string;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
// Automatic activation of ICC on inserting not supported
|
// Automatic activation of ICC on inserting not supported
|
||||||
// USB Wake up signaling not supported
|
// USB Wake up signaling not supported
|
||||||
ccid_desc.dwFeatures &= ~__constant_cpu_to_le32(0x4|0x100000);
|
ccid_desc.dwFeatures &= ~__constant_cpu_to_le32(0x4|0x100000);
|
||||||
@@ -1719,16 +1726,8 @@ main (int argc, char **argv)
|
|||||||
int fd, c, i;
|
int fd, c, i;
|
||||||
int oindex = 0;
|
int oindex = 0;
|
||||||
|
|
||||||
/* random initial serial number */
|
|
||||||
srand ((int) time (0));
|
|
||||||
for (i = 0; i < sizeof serial - 1; ) {
|
|
||||||
c = rand () % 127;
|
|
||||||
if ((('a' <= c && c <= 'z') || ('0' <= c && c <= '9')))
|
|
||||||
serial [i++] = c;
|
|
||||||
}
|
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
c = getopt_long(argc, argv, "hnr:s:i::u::a::z::I::A::p:e:voc:", options, &oindex);
|
c = getopt_long(argc, argv, "hnr:s:i:p:e:voc:", options, &oindex);
|
||||||
if (c == -1)
|
if (c == -1)
|
||||||
break;
|
break;
|
||||||
switch (c) {
|
switch (c) {
|
||||||
@@ -1743,10 +1742,10 @@ main (int argc, char **argv)
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case OPT_SERIAL:
|
case OPT_SERIAL:
|
||||||
if (sscanf(optarg, "%56s", serial) != 1) {
|
doserial = optarg;
|
||||||
parse_error(argv[0], options, option_help, optarg, oindex);
|
break;
|
||||||
exit(2);
|
case OPT_IINTERFACE:
|
||||||
}
|
doiintf = optarg;
|
||||||
break;
|
break;
|
||||||
case OPT_PRODUCT:
|
case OPT_PRODUCT:
|
||||||
if (sscanf(optarg, "%x", &productid) != 1) {
|
if (sscanf(optarg, "%x", &productid) != 1) {
|
||||||
@@ -1809,6 +1808,32 @@ main (int argc, char **argv)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (doserial) {
|
||||||
|
for (i=0; i<sizeof(stringtab)/sizeof(struct usb_string); i++) {
|
||||||
|
if (stringtab[i].id == STRINGID_SERIAL) {
|
||||||
|
stringtab[i].s = doserial;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
/* random initial serial number */
|
||||||
|
srand ((int) time (0));
|
||||||
|
for (i = 0; i < sizeof serial - 1; ) {
|
||||||
|
c = rand () % 127;
|
||||||
|
if ((('a' <= c && c <= 'z') || ('0' <= c && c <= '9')))
|
||||||
|
serial [i++] = c;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (doiintf) {
|
||||||
|
for (i=0; i<sizeof(stringtab)/sizeof(struct usb_string); i++) {
|
||||||
|
if (stringtab[i].id == STRINGID_INTERFACE) {
|
||||||
|
stringtab[i].s = doiintf;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fd = init_device ();
|
fd = init_device ();
|
||||||
if (fd < 0)
|
if (fd < 0)
|
||||||
return 1;
|
return 1;
|
||||||
|
|||||||
Reference in New Issue
Block a user