Changeset 9568 for trunk/reader-videoguard2.c
- Timestamp:
- 03/16/14 13:48:56 (10 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/reader-videoguard2.c
r8960 r9568 402 402 unsigned char buff[256]; 403 403 404 static const unsigned char ins7416[5] = { 0xD0, 0x74, 0x16, 0x00, 0x00 };405 if(do_cmd(reader, ins7416, NULL, NULL, cta_res) < 0)406 {407 rdr_log(reader, "classD0 ins7416: failed");408 return ERROR;409 }410 411 404 static const unsigned char ins02[5] = { 0xD0, 0x02, 0x00, 0x00, 0x08 }; 412 405 // D0 02 command is not always present in command table but should be supported … … 439 432 } 440 433 441 434 /* get Vg credit on card */ 435 unsigned char ins7404[5] = { 0xD0, 0x74, 0x04, 0x00, 0x00 }; 436 l = read_cmd_len(reader, ins7404); //get command len for ins7404 437 ins7404[4] = l; 438 if(!write_cmd_vg(ins7404, NULL) || !status_ok(cta_res + l)) 439 { 440 rdr_log(reader, "Unable to get smartcard credit"); 441 } 442 else 443 { 444 if (cta_res[0] == 0x15) 445 { 446 reader->VgCredit = ((cta_res[8] << 8) + cta_res[9]) / 100; 447 rdr_log(reader, "Credit available on card: %i ", reader->VgCredit); 448 } 449 } 450 451 if(reader->ins7E11[0x01]) 452 { 453 unsigned char ins742b[5] = { 0xD0, 0x74, 0x2b, 0x00, 0x00 }; 454 455 l = read_cmd_len(reader, ins742b); //get command len for ins742b 456 457 if(l < 2) 458 { 459 rdr_log(reader, "No TA1 change for this card is possible by ins7E11"); 460 } 461 else 462 { 463 ins742b[4] = l; 464 bool ta1ok = 0; 465 466 if(!write_cmd_vg(ins742b, NULL) || !status_ok(cta_res + ins742b[4])) //get supported TA1 bytes 467 { 468 rdr_log(reader, "classD0 ins742b: failed"); 469 return ERROR; 470 } 471 else 472 { 473 int32_t i; 474 475 for(i = 2; i < l; i++) 476 { 477 if(cta_res[i] == reader->ins7E11[0x00]) 478 { 479 ta1ok = 1; 480 break; 481 } 482 } 483 } 484 if(ta1ok == 0) 485 { 486 rdr_log(reader, "The value %02X of ins7E11 is not supported,try one between %02X and %02X", reader->ins7E11[0x00], cta_res[2], cta_res[ins742b[4] - 1]); 487 } 488 else 489 { 490 static const uint8_t ins7E11[5] = { 0xD0, 0x7E, 0x11, 0x00, 0x01 }; 491 492 reader->ins7e11_fast_reset = 0; 493 494 l = do_cmd(reader, ins7E11, reader->ins7E11, NULL, cta_res); 495 496 if(l < 0 || !status_ok(cta_res)) 497 { 498 rdr_log(reader, "classD0 ins7E11: failed"); 499 return ERROR; 500 } 501 else 502 { 503 unsigned char TA1; 504 505 if(ATR_GetInterfaceByte(newatr, 1, ATR_INTERFACE_BYTE_TA, &TA1) == ATR_OK) 506 { 507 if(TA1 != reader->ins7E11[0x00]) 508 { 509 rdr_log(reader, "classD0 ins7E11: Scheduling card reset for TA1 change from %02X to %02X", TA1, reader->ins7E11[0x00]); 510 reader->ins7e11_fast_reset = 1; 511 #ifdef WITH_COOLAPI 512 if(reader->typ == R_MOUSE || reader->typ == R_SC8in1 || reader->typ == R_SMART || reader->typ == R_INTERNAL) 513 { 514 #else 515 if(reader->typ == R_MOUSE || reader->typ == R_SC8in1 || reader->typ == R_SMART) 516 { 517 #endif 518 add_job(reader->client, ACTION_READER_RESET_FAST, NULL, 0); 519 } 520 else 521 { 522 add_job(reader->client, ACTION_READER_RESTART, NULL, 0); 523 } 524 return OK; // Skip the rest of the init since the card will be reset anyway 525 } 526 } 527 } 528 } 529 } 530 } 531 static const unsigned char ins7416[5] = { 0xD0, 0x74, 0x16, 0x00, 0x00 }; 532 533 if(do_cmd(reader, ins7416, NULL, NULL, cta_res) < 0) 534 { 535 rdr_log(reader, "classD0 ins7416: failed"); 536 return ERROR; 537 } 442 538 unsigned char boxID [4]; 443 539 … … 551 647 } 552 648 553 static const unsigned char ins4C[5] = { 0xD0, 0x4C, 0x00, 0x00, 0x09 }; 554 unsigned char payload4C[9] = { 0, 0, 0, 0, 3, 0, 0, 0, 4 }; 649 unsigned char ins4C[5] = { 0xD0, 0x4C, 0x00, 0x00, 0x09 }; 650 unsigned char len4c = 0, mode = 0; 651 unsigned char payload4C[0xF] = { 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; 652 if(cmd_table_get_info(reader, ins4C, &len4c, &mode)) 653 { 654 ins4C[4] = len4c; //don't mind if payload is > of ins len, it will be cutted after write_cmd_vg() 655 if(len4c > 9) 656 { 657 payload4C[8] = 0x44; //value taken from v14 boot log 658 rdr_log(reader, "Extended 4C detected"); 659 } 660 } 661 555 662 memcpy(payload4C, boxID, 4); 556 if(!write_cmd_vg(ins4C, payload4C) || !status_ok(cta_res + l))663 if(!write_cmd_vg(ins4C, payload4C) || !status_ok(cta_res )) 557 664 { 558 665 rdr_log(reader, "classD0 ins4C: failed - sending boxid failed"); … … 572 679 memcpy(reader->sa, cta_res + 3, 3); 573 680 reader->caid = cta_res[24] * 0x100 + cta_res[25]; 681 memset(reader->VgRegionC, 0, 8); 682 memcpy(reader->VgRegionC, cta_res + 60, 8); 683 rdr_log(reader, "Region Code: %c%c%c%c%c%c%c%c", reader->VgRegionC[0], reader->VgRegionC[1], reader->VgRegionC[2], reader->VgRegionC[3], reader->VgRegionC[4], reader->VgRegionC[5], reader->VgRegionC[6], reader->VgRegionC[7]); 574 684 575 685 /* we have one provider, 0x0000 */ … … 621 731 return ERROR; 622 732 } 733 /*new ins74 present at boot*/ 734 735 static const unsigned char ins7423[5] = { 0xD1, 0x74, 0x23, 0x00, 0x00 }; 736 if(do_cmd(reader, ins7423, NULL, NULL, cta_res) < 0) 737 { 738 rdr_log(reader, "classD1 ins7423: failed"); 739 } 740 741 static const unsigned char ins742A[5] = { 0xD1, 0x74, 0x2A, 0x00, 0x00 }; 742 if(do_cmd(reader, ins742A, NULL, NULL, cta_res) < 0) 743 { 744 rdr_log(reader, "classD1 ins742A: failed"); 745 } 746 747 static const unsigned char ins741B[5] = { 0xD1, 0x74, 0x1B, 0x00, 0x00 }; 748 if(do_cmd(reader, ins741B, NULL, NULL, cta_res) < 0) 749 { 750 rdr_log(reader, "classD1 ins741B: failed"); 751 } 623 752 624 753 static const unsigned char ins4Ca[5] = { 0xD1, 0x4C, 0x00, 0x00, 0x00 }; 754 unsigned char ins741C[5] = { 0xD1, 0x74, 0x1C, 0x00, 0x00 }; 755 if(len4c > 9) 756 { 757 if((l = read_cmd_len(reader, ins741C)) < 0) // We need to know the exact len 758 { 759 return ERROR; 760 } 761 ins741C[4] = l; 762 if(do_cmd(reader, ins741C, NULL, NULL, cta_res) < 0) //from log this payload is copied on 4c 763 { 764 rdr_log(reader, "classD1 ins741C: failed"); 765 } 766 else 767 { 768 if(l > 8) //if payload4c is length 0xF, we can't copy over more than 8 bytes in the next memcopy 769 { 770 l = 8; 771 } 772 memcpy(payload4C + 8, cta_res, l); 773 } 774 } 625 775 l = do_cmd(reader, ins4Ca, payload4C, NULL, cta_res); 626 776 if(l < 0 || !status_ok(cta_res)) … … 640 790 } 641 791 } 642 643 if(reader->ins7E11[0x01]) 644 { 645 unsigned char ins742b[5] = { 0xD0, 0x74, 0x2b, 0x00, 0x00 }; 646 647 l = read_cmd_len(reader, ins742b); //get command len for ins742b 648 649 if(l < 2) 650 { 651 rdr_log(reader, "No TA1 change for this card is possible by ins7E11"); 792 /* get PIN settings */ 793 static const unsigned char ins7411[5] = { 0xD1, 0x74, 0x11, 0x00, 0x00 }; 794 unsigned char payload2e4[4]; 795 if(do_cmd(reader, ins7411, NULL, NULL, cta_res) < 0) 796 { 797 rdr_log(reader, "classD1 ins7411: unable to get PIN"); 798 return ERROR; 799 } 800 else 801 { 802 memset(payload2e4, 0, 4); 803 memcpy(payload2e4, cta_res + 2, 4); 804 reader->VgPin = (cta_res[4] << 8) + cta_res[5]; 805 rdr_log(reader, "Pincode read: %i", reader->VgPin); 806 } 807 808 /* get PCB(content rating) settings */ 809 static const unsigned char ins74e[5] = {0xD1, 0x74, 0x0E, 0x00, 0x00}; 810 if(do_cmd(reader, ins74e, NULL, NULL, cta_res) < 0) 811 { 812 rdr_log(reader, "classD1 ins74e: failed to get PCB settings"); 813 } 814 else 815 { 816 rdr_log(reader, "PCB settings: %X %X %X %X", cta_res[2], cta_res[3], cta_res[4], cta_res[5]); 817 } 818 819 /* send PIN */ 820 static const unsigned char ins2epin[5] = {0xD1, 0x2E, 0x04, 0x00, 0x04}; 821 if(cfg.ulparent) 822 { 823 l = do_cmd(reader, ins2epin, payload2e4, NULL, cta_res); 824 if(l < 0 || !status_ok(cta_res)) 825 { 826 rdr_log(reader, "classD1 ins2E: failed"); 827 rdr_log(reader, "Cannot disable parental control"); 828 return ERROR; 652 829 } 653 830 else 654 831 { 655 ins742b[4] = l; 656 bool ta1ok = 0; 657 658 if(!write_cmd_vg(ins742b, NULL) || !status_ok(cta_res + ins742b[4])) //get supported TA1 bytes 659 { 660 rdr_log(reader, "classD0 ins742b: failed"); 661 return ERROR; 662 } 663 else 664 { 665 int32_t i; 666 667 for(i = 2; i < l; i++) 668 { 669 if(cta_res[i] == reader->ins7E11[0x00]) 670 { 671 ta1ok = 1; 672 break; 673 } 674 } 675 } 676 if(ta1ok == 0) 677 { 678 rdr_log(reader, "The value %02X of ins7E11 is not supported,try one between %02X and %02X", reader->ins7E11[0x00], cta_res[2], cta_res[ins742b[4] - 1]); 679 } 680 else 681 { 682 static const uint8_t ins7E11[5] = { 0xD0, 0x7E, 0x11, 0x00, 0x01 }; 683 684 reader->ins7e11_fast_reset = 0; 685 686 l = do_cmd(reader, ins7E11, reader->ins7E11, NULL, cta_res); 687 688 if(l < 0 || !status_ok(cta_res)) 689 { 690 rdr_log(reader, "classD0 ins7E11: failed"); 691 return ERROR; 692 } 693 else 694 { 695 unsigned char TA1; 696 697 if(ATR_GetInterfaceByte(newatr, 1, ATR_INTERFACE_BYTE_TA, &TA1) == ATR_OK) 698 { 699 if(TA1 != reader->ins7E11[0x00]) 700 { 701 rdr_log(reader, "classD0 ins7E11: Scheduling card reset for TA1 change from %02X to %02X", TA1, reader->ins7E11[0x00]); 702 reader->ins7e11_fast_reset = 1; 703 #ifdef WITH_COOLAPI 704 if(reader->typ == R_MOUSE || reader->typ == R_SC8in1 || reader->typ == R_SMART || reader->typ == R_INTERNAL) 705 { 706 #else 707 if(reader->typ == R_MOUSE || reader->typ == R_SC8in1 || reader->typ == R_SMART) 708 { 709 #endif 710 add_job(reader->client, ACTION_READER_RESET_FAST, NULL, 0); 711 } 712 else 713 { 714 add_job(reader->client, ACTION_READER_RESTART, NULL, 0); 715 } 716 return OK; // Skip the rest of the init since the card will be reset anyway 717 } 718 } 719 } 720 } 721 } 722 } 723 724 /* get parental lock settings */ 725 static const unsigned char ins74e[5] = {0xD0, 0x74, 0x0E, 0x00, 0x00}; 726 if(cmd_exists(reader, ins74e)) 727 { 728 l = do_cmd(reader, ins74e, NULL, NULL, cta_res); 729 if(l < 0 || !status_ok(cta_res + l)) 730 { 731 rdr_log(reader, "classD0 ins74e: failed to get parental lock settings"); 732 } 733 else 734 { 735 char tmp[l > 0 ? l * 3 : 1]; 736 rdr_log(reader, "parental lock setting: %s", cs_hexdump(1, cta_res + 2, l - 2, tmp, sizeof(tmp))); 737 } 738 } 739 740 /* disable parental lock */ 741 static const uchar ins2e[5] = {0xD0, 0x2E, 0x00, 0x00, 0x04}; 742 static const uchar payload2e[4] = {0xFF, 0xFF, 0xFF, 0xFF}; 743 if(cfg.ulparent) 744 { 745 if(cmd_exists(reader, ins74e) && write_cmd_vg(ins2e, payload2e) && status_ok(cta_res + l)) 746 { 747 rdr_log(reader, "parental lock disabled"); 748 } 749 else 750 { 751 rdr_log(reader, "cannot disable parental lock"); 752 } 753 if(cmd_exists(reader, ins74e)) 754 { 755 l = do_cmd(reader, ins74e, NULL, NULL, cta_res); 756 if(l < 0 || !status_ok(cta_res + l)) 757 { 758 rdr_log(reader, "classD0 ins74e: failed to get parental lock settings"); 759 } 760 else 761 { 762 char tmp[l > 0 ? l * 3 : 1]; 763 rdr_log(reader, "parental lock setting after disabling: %s", cs_hexdump(1, cta_res + 2, l - 2, tmp, sizeof(tmp))); 764 } 832 rdr_log(reader, "Parental control disabled"); 833 } 834 } 835 /* send check control for pin, needed on some cards */ 836 /* the presence and the value of payloads is provider's dependent*/ 837 if(reader->ins2e06[4]) 838 { 839 static const unsigned char ins2e06[5] = { 0xD1, 0x2E, 0x06, 0x00, 0x04 }; 840 l = do_cmd(reader, ins2e06, reader->ins2e06, NULL, cta_res); 841 if(l < 0 || !status_ok(cta_res)) 842 { 843 rdr_log(reader, "classD1 ins2E: failed"); 844 return ERROR; 765 845 } 766 846 } … … 842 922 if(l < 0 || !status_ok(cta_res)) 843 923 { 844 rdr_log(reader, "classD 0ins40: (%d) status not ok %02x %02x", l, cta_res[0], cta_res[1]);924 rdr_log(reader, "classD1 ins40: (%d) status not ok %02x %02x", l, cta_res[0], cta_res[1]); 845 925 rdr_log(reader, "The card is not answering correctly! Restarting reader for safety"); 846 926 add_job(reader->client, ACTION_READER_RESTART, NULL, 0);
Note:
See TracChangeset
for help on using the changeset viewer.