/**************************************************************************************
Function Name       :   main
Description         :   Read and Write the Password in the EEPROM
Parameters          :   commandline arguments
Return              :   NULL
**************************************************************************************/
int main(int argc, char **argv)
{
usbDevice_t *dev;
char        buffer[129];    /* room for dummy report ID */
int         err;

    if(argc < 2){
        usage(argv[0]);
        exit(1);
    }
    if((dev = openDevice()) == NULL)
        exit(1);
    if(strcasecmp(argv[1], "read") == 0){
        int len = sizeof(buffer);
        if((err = usbhidGetReport(dev, 0, buffer, &len)) != 0){
            fprintf(stderr, "error reading data: %s\n", usbErrorMessage(err));
        }else{
            hexdump(buffer + 1, sizeof(buffer) - 1);
        }
    }else if(strcasecmp(argv[1], "write") == 0){
        memset(buffer, 0, sizeof(buffer));
        int i = 1;
        while(*argv[2] != '\0'){    
            buffer[i] += *argv[2]++;
            i++;
        }
        if((err = usbhidSetReport(dev, buffer, sizeof(buffer))) != 0)   /* add a dummy report ID */
            fprintf(stderr, "error writing data: %s\n", usbErrorMessage(err));
    }else{
        usage(argv[0]);
        exit(1);
    }
    usbhidCloseDevice(dev);
    return 0;
}
Example #2
0
int main(int argc, char **argv)
{
usbDevice_t *dev;
char        buffer[4];    /* room for dummy report ID */
int         err;

    if(argc < 2){
        usage(argv[0]);
        exit(1);
    }
    if((dev = openDevice()) == NULL)
        exit(1);
    if(strcasecmp(argv[1], "read") == 0){
        int len = sizeof(buffer);
        if((err = usbhidGetReport(dev, 0, buffer, &len)) != 0){
            fprintf(stderr, "error reading data: %s\n", usbErrorMessage(err));
        }else{
            hexdump(buffer + 1, sizeof(buffer) - 1);
        }
    }else if(strcasecmp(argv[1], "write") == 0){
        int i, pos;
        memset(buffer, 0, sizeof(buffer));
        for(pos = 1, i = 2; i < argc && pos < sizeof(buffer); i++){
            pos += hexread(buffer + pos, argv[i], sizeof(buffer) - pos);
        }
        if((err = usbhidSetReport(dev, buffer, sizeof(buffer))) != 0)   /* add a dummy report ID */
            fprintf(stderr, "error writing data: %s\n", usbErrorMessage(err));
    }else{
        usage(argv[0]);
        exit(1);
    }
    usbhidCloseDevice(dev);
    return 0;
}
/** Free an enumeration Linked List*/
void USBRL_API usb_io_free_device_list(struct usb_io_device_info *dilist)
{
    struct usb_io_internal_s *p = (struct usb_io_internal_s *)dilist;

    while ( p ) {
        struct usb_io_internal_s *q = (struct usb_io_internal_s *)((pusb_io_device_info_t)p)->next;
        if ( p->usbh && ((USBDEVHANDLE)(-1)) != p->usbh ) {
            usbhidCloseDevice(p->usbh);
            p->usbh = 0;
        }
        free(p);
        p = q;
    }

    return;
}
Example #4
0
HIDDevice::~HIDDevice()
{
	if (hHIDDev != NULL)
		usbhidCloseDevice(hHIDDev);
}
Example #5
0
int main(int argc, char **argv)
{


    int option = 0;      // For getopt temp option

    usbDevice_t *dev;
    ucp_cmd_t buffer;    //room for dummy report ID
    int         err;

    //Initialize globalArgs before we get to work
    globalArgs.rFlag = 0;   //False
    globalArgs.iFlag = 0;   //False
    globalArgs.wFlag = 0;   //False
    globalArgs.fFlag = 0;   //False
    globalArgs.pFlag = 0;   //False
    globalArgs.hashFlag = 0;   //False
    globalArgs.kFlag = 0;   //False
    strncpy(globalArgs.pin,"0000",sizeof(globalArgs.pin)); //Default pin
    globalArgs.offset = 0; //Default
    globalArgs.size = 512; //Default
    globalArgs.fileName = NULL;
    globalArgs.file = NULL;

    //Check if no arguments at all
    if(argc==1) printUsage(argv[0]);

    //If there's some argument, parse them
    while((option = getopt(argc, argv, "rwif:o:p:Pk:s:h?")) !=-1){
    //Check option flags
    switch(option){
        case 'r':
            globalArgs.rFlag = 1; //True
            break;
        case 'w':
            globalArgs.wFlag = 1; //True
            break;
        case 'i':
            globalArgs.iFlag = 1; //True
            break;
        case 'f':
            globalArgs.fFlag = 1; //True
            globalArgs.fileName = optarg;
            printf("File: %s\n",globalArgs.fileName);
            break;
        case 'o':
            globalArgs.offset = atoi(optarg);
            break;
        case 'p':
            globalArgs.pFlag = 1; //True
            strncpy(globalArgs.pin,optarg, sizeof(globalArgs.pin));
            break;
        case 'P':
            globalArgs.hashFlag=1; //True
            break;
        case 'k':
            globalArgs.kFlag = 1; //True
            globalArgs.keyboard = optarg;
            printf("Keyboard: %s\n", globalArgs.keyboard);
        case 's':
            globalArgs.size = atoi(optarg);
            break;
        case 'h':
        case '?':
            printUsage(argv[0]);
            break;
        //Unknown flag, don't know what to do
        default:
            //After getopt prints the error
            printUsage(argv[0]);
            break;
    }
    }

    //Check that only one action is done at a time
    if(globalArgs.rFlag + globalArgs.wFlag + globalArgs.iFlag > 1) printUsage(argv[0]);
    //Check that not set PIN and read HASH are given at a time
    if(globalArgs.pFlag + globalArgs.hashFlag > 1) printUsage(argv[0]);
    //Check that if write from file to device, we are given a file and a pin to encrypt!
    if(globalArgs.wFlag  && !globalArgs.fFlag) printUsage(argv[0]);
    if(globalArgs.wFlag && !globalArgs.pFlag) printUsage(argv[0]);
    //Also check pin for read flag
    if(globalArgs.rFlag && !globalArgs.pFlag) printUsage(argv[0]);

    //Try to open the device, exit if no device present.
    if((dev = openDevice()) == NULL) exit(1);

    //Clean the buffer before working with it
    memset((void*)&buffer, 0, sizeof(buffer));
    

    //Check and perform the desired commands
    if(globalArgs.rFlag){  //READ COMMAND
        buffer.cmd = UCP_CMD_READ;
        deviceRead.offset = globalArgs.offset;
        deviceRead.size = globalArgs.size;
        memcpy((void*)&buffer.buff, (void*)&deviceRead, sizeof(deviceRead));

        //give some feedback
        fprintf(stderr,"Reading from the MemType: offset=%d bytes, size=%d bytes.\n",deviceRead.offset, deviceRead.size);

    }else if(globalArgs.wFlag){  //WRITE COMMAND
        buffer.cmd = UCP_CMD_WRITE;
        deviceRead.offset = globalArgs.offset;
        deviceRead.size = readXML(globalArgs.fileName);
        memcpy((void*)&buffer.buff, (void*)&deviceRead, sizeof(deviceRead));

        //give some feedback
        fprintf(stderr,"Writing to the MemType: offset=%d bytes, size=%d bytes.\n",deviceRead.offset, deviceRead.size);

    }else if(globalArgs.iFlag){  //INFO COMMAND
        buffer.cmd = UCP_CMD_INFO;
    }else if(globalArgs.hashFlag){ //READ PIN HASH COMMAND
        buffer.cmd = UCP_CMD_READ_PIN;
    }else if(globalArgs.pFlag){ //SET PIN COMMAND
        buffer.cmd = UCP_CMD_SET_PIN;
        buffer.buff[0] = 16; //sizeof hash in bytes
    }else if(globalArgs.kFlag){
        buffer.cmd = UCP_CMD_KEYBOARD;
    }
       
        //Add a dummy report ID and send data to device 
        buffer.reportid = 2;
        if((err = usbhidSetReport(dev, (char*)&buffer, sizeof(buffer))) != 0)
            fprintf(stderr, "Error sending data to device: %s\n", usbErrorMessage(err));

        //Read back report 
        int len = sizeof(buffer);
        if((err = usbhidGetReport(dev, 2, (char*)&buffer, &len)) != 0)
        {   //... if not OK, print error
            fprintf(stderr, "Error reading data from device: %s\n", usbErrorMessage(err));
        }
        else //... if OK, do things :)
        {
            fprintf( stderr, "\nMemType CMD Response: ");
            hexdump( (void*)&buffer.cmd, sizeof(buffer.cmd)+sizeof(buffer.buff));
            fprintf( stderr, "Received data from the device: \n");
            switch(buffer.cmd)
            {
                case UCP_CMD_RESET:
                    fprintf( stderr, "RESET\n");
                    break;
                case UCP_CMD_READ:
                    fprintf( stderr, "READ\n");
                    cmdRead(dev, deviceRead.size);
                    break;
                case UCP_CMD_WRITE:
                    fprintf( stderr, "WRITE\n");
                    cmdWrite(dev, flashMemory, deviceRead.size);
                    fprintf(stderr, "[ENCRYPTION TEST] only hexdump");
                    break;
                case UCP_CMD_SET_PIN:
                    fprintf(stderr, "SET PIN\n");
                    cmdSetPin(dev);
                    break;
                case UCP_CMD_READ_PIN:
                    fprintf(stderr, "READ PIN HASH\n");
                    cmdReadPinHash(dev);
                    break;
                case UCP_CMD_KEYBOARD:
                    fprintf(stderr, "KEYBOARD\n");
                    cmdKeyboard(dev);
                    break;
                case UCP_CMD_DATA:
                    fprintf( stderr, "DATA\n");
                    break;
                case UCP_CMD_INFO:
                    fprintf( stderr, "sizeof(info) -> %lu\n", sizeof(deviceInfo));
                    memcpy((void*)&deviceInfo, (void*)buffer.buff, sizeof(deviceInfo));
                    
                    /* Call info */
                    cmdInfo(&deviceInfo);
                    break;
                case UCP_CMD_ERROR:  //Wait! the device returned one error!
                    switch( (unsigned char) buffer.buff[0] )
                    {
                        case UCP_ERR:
                            fprintf( stderr, "GENERIC ERROR\n");
                            break;
                        case UCP_ERR_PACKET:
                            fprintf( stderr, "PACKET ERROR\n");
                            break;
                        case UCP_ERR_CMD:
                            fprintf( stderr, "CMD ERROR\n");
                            break;
                        case UCP_ERR_ADDR:
                            fprintf( stderr, "ADDR ERROR\n");
                            break;
                        case UCP_ERR_SIZE:
                            fprintf( stderr, "SIZE ERRROR\n");
                            break;
                        case UCP_ERR_PROTOCOL:
                            fprintf( stderr, "PROTOCOL ERROR\n");
                            break;
                        case UCP_ERR_LOCKED:
                            fprintf( stderr, "DEVICE LOCKED ERROR\n");
                            break; 
                        default:
                            fprintf( stderr, "UNKNOWN ERROR\n");
                    }
                    break;
                default:
                    fprintf( stderr, "UNKNOWN CMD ERROR\n");
            }
        }

    usbhidCloseDevice(dev);
    
    return 0;
}
Example #6
0
void hidtool_close(usb_dev_handle *dev){
    usbhidCloseDevice(dev);
}
Example #7
0
int main(int argc, char **argv) {
	usbDevice_t *dev;
	char buffer[REPORT_SIZE]; /* room for dummy report ID */
	int err;

	if (argc < 2) {
		usage(argv[0]);
		exit(1);
	}
	if ((dev = openDevice()) == NULL)
		exit(1);
	if (strcasecmp(argv[1], "read") == 0) {
		int len = sizeof(buffer);
		if ((err = usbhidGetReport(dev, 0, buffer, &len)) != 0) {
			fprintf(stderr, "error reading data: %s\n", usbErrorMessage(err));
		} else {
			int16dump(buffer + 1, sizeof(buffer) - 1);
		}
	} else if (strcasecmp(argv[1], "write") == 0) {
		int i, pos;
		memset(buffer, 0, sizeof(buffer));
		for (pos = 1, i = 2; i < argc && pos < sizeof(buffer); i++) {
			pos += int16read(buffer + pos, argv[i], sizeof(buffer) - pos);
		}
		if ((err = usbhidSetReport(dev, buffer, sizeof(buffer))) != 0) /* add a dummy report ID */
			fprintf(stderr, "error writing data: %s\n", usbErrorMessage(err));
	} else if (strcasecmp(argv[1], "writeinput") == 0) {
		int i, pos;
		// read initial positions
		int len = sizeof(buffer);
		if ((err = usbhidGetReport(dev, 0, buffer, &len)) != 0) {
			fprintf(stderr, "error reading data: %s\n", usbErrorMessage(err));
		}
		// int16dump(buffer + 1, sizeof(buffer) - 1);
		char input[1000];
		int scanfEof;
		do {
			scanfEof = scanf("%[^\n]%*c", input);
			// printf("[%i] %s\n", scanfEof, input);
			int16read(buffer + 1, input, sizeof(buffer) - 1);
			// int16dump(buffer + 1, sizeof(buffer) - 1);
			buffer[0] ++;
			int retry = 0;
			do {
				if ((err = usbhidSetReport(dev, buffer, sizeof(buffer))) != 0) { /* add a dummy report ID */
					fprintf(stderr, "error writing data: %s\n", usbErrorMessage(err));
				}
			} while (err != 0 && retry ++ < 3);
			if (err != 0) {
				// try to reconnect
				usbhidCloseDevice(dev);
				dev = openDevice();
				if ((err = usbhidSetReport(dev, buffer, sizeof(buffer))) != 0) { /* add a dummy report ID */
					fprintf(stderr, "error writing data: %s\n", usbErrorMessage(err));
				}
			}
			//usleep(20000);
		} while (scanfEof > 0);
//		for (pos = 1, i = 2; i < argc && pos < sizeof(buffer); i++) {
//			pos += int16read(buffer + pos, argv[i], sizeof(buffer) - pos);
//		}
//		if ((err = usbhidSetReport(dev, buffer, sizeof(buffer))) != 0) /* add a dummy report ID */
//			fprintf(stderr, "error writing data: %s\n", usbErrorMessage(err));
	} else {
		usage(argv[0]);
		exit(1);
	}
	usbhidCloseDevice(dev);
	return 0;
}
// Enum function for building list of devices
static
int enumfunc(USBDEVHANDLE usbh, void *context)
{
    static const char vendorName[] = USB_IO16_VENDOR_NAME;
    static const char productName[] = USB_IO16_NAME;
    int err;
    char buffer[128 * sizeof(short)]; // max USB string is 128 UTF-16 chars
    int i;
    struct usb_io_internal_s *q;
    struct enumctx_s *ectx = (struct enumctx_s *)context;

    err = usbhidGetVendorString(usbh, buffer, sizeof(buffer));
    if ( err )
    {
        goto next;
    }

    if ( 0 != strcmp(buffer, vendorName) )
    {
        goto next;
    }

    err = usbhidGetProductString(usbh, buffer, sizeof(buffer));
    if ( err )
    {
        goto next;
    }

    if ( 0 != strcmp(buffer, productName) )
    {
        goto next;
    }

    /* Check the unique ID: USB_IO16_ID_STR_LEN  bytes at offset 1 (just after the report id) */
    err = d16_read_rep(usbh, 0, buffer);
    if ( err < 0 )
    {
        dbgprintf("Error reading report 0: %s\n", usbErrorMessage(err));
        goto next;
    }

    for ( i = 1; i <= USB_IO16_ID_STR_LEN; i++ )
    {
        unsigned char x = (unsigned char)buffer[i];
        if ( x <= 0x20 || x >= 0x7F )
        {
            dbgprintf("Bad USBIO16 ID string!\n");
            goto next;
        }
    }

    dbgprintf("Device %s found: ID=[%.*s]\n", productName, USB_IO16_ID_STR_LEN, &buffer[1]);

    // allocate & save info
    q = (struct usb_io_internal_s *)calloc(1, sizeof(struct usb_io_internal_s));
    if ( !q ) {
        dbgprintf("Malloc err\n");
        goto next; //$$$ revise
    }
    /* keep this device, continue */
    q->usbh = usbh;
    memcpy(q->idstr, &buffer[1], USB_IO16_ID_STR_LEN);
    q->type = 16; // put # of pins for now...
    q->urdi.serial_number = (void*)&q->idstr[0];
    q->urdi.device_path = (char*)g_dummyPath;

    if ( !ectx->head ) {
        ectx->head = q;
        ectx->tail = q;
    } else {
        ectx->tail->urdi.next = (pusb_io_device_info_t)q;
        ectx->tail = q;
    }

    ++ectx->numdevs;
    return 1;

next:
    /* Continue search */
    usbhidCloseDevice(usbh);
    return 1;
}
Example #9
0
int main(int argc, char **argv)
{
usbDevice_t *dev;
char        buffer[65];    /* room for dummy report ID */
int         err;
char        quiet = 0;

    if ( argc < 2) {
        usage(argv[0]);
        exit(1);
    }
    if ( (dev = openDevice()) == NULL)
        exit(1);

    if ( strcasecmp(argv[1], "read") == 0) {
        int len = sizeof(buffer);
        if ( (err = usbhidGetReport(dev, 0, buffer, &len)) != 0) {
            fprintf(stderr, "error reading data: %s\n", usbErrorMessage(err));
        } else {
            hexdump(buffer + 1, sizeof(buffer) - 1);
        }
    } else if ( strcasecmp(argv[1], "write") == 0) {
        int i, pos;
        bzero(buffer, sizeof(buffer));
        for ( pos = 1, i = 2; i < argc && pos < sizeof(buffer); i++) {
            pos += hexread(buffer + pos, argv[i], sizeof(buffer) - pos);
        }
	/*
	printf("%d\n",buffer[0]);
	printf("%d\n",buffer[1]);
	printf("%d\n",buffer[2]);
	printf("%d\n",buffer[3]);
	*/
        //if ( (err = usbhidSetReport(dev, buffer, sizeof(buffer))) != 0)   /* add a dummy report ID */
        if ( (err = usbhidSetReport(dev, buffer, pos)) != 0)   /* add a dummy report ID */
            fprintf(stderr, "error writing data: %s\n", usbErrorMessage(err));
    } else if ( strcasecmp( argv[1], "interactive" ) == 0 ) {
        int t = 0;
            for ( t = 0; t < argc; t++ )
	        if ( strcasecmp(argv[t], "quiet") == 0 )
	            quiet = 1;

	char *help = "q = exit\nr = read\nw = write <Data separated by spaces as decimal or hex (8bit unsigned)>\n";

	if ( !quiet )
	    printf("%s",help);

	char exit = 0;
	while ( exit != 1 )
	{
		int nbytes = 350;

		if ( !quiet )
			printf("> ");

		char *input;
		input = (char *) malloc (nbytes + 1);
		int cnt = getline(&input, &nbytes, stdin);

		if ( strncasecmp(input, "q", 1) == 0 )
		{

			if ( !quiet )
			    printf("bye.\n");

			exit = 1;

		} else if ( strncasecmp(input, "r", 1) == 0 ) {

			if ( !quiet )
			    printf("reading...\n");

			int len = sizeof(buffer) ;
			if ( (err = usbhidGetReport(dev, 0, buffer, &len)) != 0)
			{
				fprintf(stderr, "error reading data: %s\n", usbErrorMessage(err));
				exit = 1;
			} else {
				hexdump(buffer + 1, sizeof(buffer) - 1);
			}

		} else if ( strncasecmp(input, "w ", 2) == 0 ) {
        		int i, pos;
			input[0] = 32; // kommando durch leerzeichen ersetzen
			bzero(buffer, sizeof(buffer));

			if ( !quiet )
				printf("sending data... ");

			for ( pos = 1, i = 2; i < cnt -1 && pos < sizeof(buffer); i++) {
				//printf(">%c\n", input[i]);
				pos += hexread( buffer + pos, &input[i], sizeof(buffer) - pos);
			}
			if ( (err = usbhidSetReport(dev, buffer, sizeof(buffer))) != 0)   // add a dummy report ID
			{
				fprintf(stderr, "error writing data: %s\n", usbErrorMessage(err));
    				usbhidCloseDevice(dev);
				if ( (dev = openDevice()) != NULL)
					printf("reconnect...\n");
				else
					exit = 1;
			} else {
				if ( !quiet )
					printf("ok.\n");
			}
		} else
			printf("%s",help);
	}
    } else {
        usage(argv[0]);
        exit(1);
    }
    usbhidCloseDevice(dev);
    return 0;
}