Ignore:
Timestamp:
Mar 18, 2014, 9:42:45 PM (5 years ago)
Author:
blaky
Message:

*handle ins7E11 fastmode on a proper cardinit time as seen in V13 bootlog
-his should/could fix broken fastmode for some V13 Cards since svn9568
-patch by pfanne

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/reader-videoguard2.c

    r9568 r9569  
    432432    }
    433433
     434
    434435    /* get Vg credit on card */
    435436    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     }
     437    if ((l = read_cmd_len(reader, ins7404)) > 0)                     //get command len for ins7404
     438    {
     439        ins7404[4] = l;
     440        if(!write_cmd_vg(ins7404, NULL) || !status_ok(cta_res + l))
     441        {
     442            rdr_log(reader, "classD0 ins7404: failed");
     443        }
     444        else
     445        {
     446            if (cta_res[0] == 0x15)
     447            {
     448                reader->VgCredit = ((cta_res[8] << 8) + cta_res[9]) / 100;
     449                rdr_log(reader, "Credit available on card: %i €", reader->VgCredit);
     450            }
     451        }
     452    }
     453    else
     454    {                                                           //case V13
     455        rdr_log(reader, "Unable to get smartcard credit");
     456    }
     457
    531458    static const unsigned char ins7416[5] = { 0xD0, 0x74, 0x16, 0x00, 0x00 };
    532459
     
    667594    }
    668595
     596    static const unsigned char ins7403[5] = { 0xD0, 0x74, 0x03, 0x00, 0x00 };   //taken from v13 boot log
     597    if(do_cmd(reader, ins7403, NULL, NULL, cta_res) < 0)
     598    {
     599        rdr_log(reader, "classD0 ins7403: failed");
     600    }
     601
     602    if(reader->ins7E11[0x01])                                                   //the position of the ins7E is taken from v13 log
     603    {
     604        unsigned char ins742b[5] = { 0xD0, 0x74, 0x2b, 0x00, 0x00 };
     605
     606        l = read_cmd_len(reader, ins742b);  //get command len for ins742b
     607
     608        if(l < 2)
     609        {
     610            rdr_log(reader, "No TA1 change for this card is possible by ins7E11");
     611        }
     612        else
     613        {
     614            ins742b[4] = l;
     615            bool ta1ok = 0;
     616
     617            if(!write_cmd_vg(ins742b, NULL) || !status_ok(cta_res + ins742b[4]))  //get supported TA1 bytes
     618            {
     619                rdr_log(reader, "classD0 ins742b: failed");
     620                return ERROR;
     621            }
     622            else
     623            {
     624                int32_t i;
     625
     626                for(i = 2; i < l; i++)
     627                {
     628                    if(cta_res[i] == reader->ins7E11[0x00])
     629                    {
     630                        ta1ok = 1;
     631                        break;
     632                    }
     633                }
     634            }
     635            if(ta1ok == 0)
     636            {
     637                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]);
     638            }
     639            else
     640            {
     641                static const uint8_t ins7E11[5] = { 0xD0, 0x7E, 0x11, 0x00, 0x01 };
     642
     643                reader->ins7e11_fast_reset = 0;
     644
     645                l = do_cmd(reader, ins7E11, reader->ins7E11, NULL, cta_res);
     646
     647                if(l < 0 || !status_ok(cta_res))
     648                {
     649                    rdr_log(reader, "classD0 ins7E11: failed");
     650                    return ERROR;
     651                }
     652                else
     653                {
     654                    unsigned char TA1;
     655
     656                    if(ATR_GetInterfaceByte(newatr, 1, ATR_INTERFACE_BYTE_TA, &TA1) == ATR_OK)
     657                    {
     658                        if(TA1 != reader->ins7E11[0x00])
     659                        {
     660                            rdr_log(reader, "classD0 ins7E11: Scheduling card reset for TA1 change from %02X to %02X", TA1, reader->ins7E11[0x00]);
     661                            reader->ins7e11_fast_reset = 1;
     662#ifdef WITH_COOLAPI
     663                            if(reader->typ == R_MOUSE || reader->typ == R_SC8in1 || reader->typ == R_SMART || reader->typ == R_INTERNAL)
     664                            {
     665#else
     666                            if(reader->typ == R_MOUSE || reader->typ == R_SC8in1 || reader->typ == R_SMART)
     667                            {
     668#endif
     669                                add_job(reader->client, ACTION_READER_RESET_FAST, NULL, 0);
     670                            }
     671                            else
     672                            {
     673                                add_job(reader->client, ACTION_READER_RESTART, NULL, 0);
     674                            }
     675                            return OK; // Skip the rest of the init since the card will be reset anyway
     676                        }
     677                    }
     678                }
     679            }
     680        }
     681    }
     682
    669683    //int16_t int32_t SWIRDstatus = cta_res[1];
    670684    static const unsigned char ins58[5] = { 0xD0, 0x58, 0x00, 0x00, 0x00 };
Note: See TracChangeset for help on using the changeset viewer.