Changeset 11517


Ignore:
Timestamp:
04/21/19 16:15:33 (4 years ago)
Author:
Gorgone Impertinence
Message:
  • fix bug in disablecrccws_only_for also in cacheex
  • general disable checksum correction code optimization

thanks to kabeltod

Location:
trunk
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/module-cacheex.c

    r11508 r11517  
    664664    }
    665665
    666     uint8_t selectedForIgnChecksum = chk_if_ignore_checksum(er, cfg.disablecrccws, &cfg.disablecrccws_only_for);
    667             if (cl->typ == 'c') {
    668                 selectedForIgnChecksum += chk_if_ignore_checksum (er, cl->account->disablecrccacheex, &cl->account->disablecrccacheex_only_for);
    669             }
    670             if (cl->typ == 'p') {
    671                 selectedForIgnChecksum += chk_if_ignore_checksum (er, cl->reader->disablecrccws, &cl->reader->disablecrccws_only_for);
    672             }
    673 
    674     uint8_t i, c;
    675     if(cfg.disablecrccws == 0 || (cl->typ == 'c' && cl->account->disablecrccacheex == 0) || ( cl->typ == 'p' && cl->reader->disablecrccws == 0))
    676     {
    677         for(i = 0; i < 16; i += 4)
    678         {
    679             c = ((er->cw[i] + er->cw[i + 1] + er->cw[i + 2]) & 0xff);
    680 
    681             if((i!=12) && selectedForIgnChecksum && (er->cw[i + 3] != c)){
    682                 break;
    683             }
    684 
    685             if(er->cw[i + 3] != c)
    686             {
    687                 cs_log_dump_dbg(D_CACHEEX, er->cw, 16, "push received cw with chksum error from %s", csp ? "csp" : username(cl));
    688                 cl->cwcacheexerr++;
    689                 if(cl->account)
    690                     { cl->account->cwcacheexerr++; }
    691                 return 0;
     666    if(!cfg.disablecrccws && ((cl->typ == 'c' && !cl->account->disablecrccacheex) || ( cl->typ == 'p' && !cl->reader->disablecrccws)))
     667    {
     668        uint8_t selectedForIgnChecksum = chk_if_ignore_checksum(er, &cfg.disablecrccws_only_for);
     669        if(cl->typ == 'c')
     670        {
     671            selectedForIgnChecksum += chk_if_ignore_checksum(er, &cl->account->disablecrccacheex_only_for);
     672        }
     673        if(cl->typ == 'p')
     674        {
     675            selectedForIgnChecksum += chk_if_ignore_checksum(er, &cl->reader->disablecrccws_only_for);
     676        }
     677        if(!selectedForIgnChecksum)
     678        {
     679            uint8_t i, c;
     680            for(i = 0; i < 16; i += 4)
     681            {
     682                c = ((er->cw[i] + er->cw[i + 1] + er->cw[i + 2]) & 0xff);
     683
     684                if(er->cw[i + 3] != c)
     685                {
     686                    cs_log_dump_dbg(D_CACHEEX, er->cw, 16, "push received cw with chksum error from %s", csp ? "csp" : username(cl));
     687                    cl->cwcacheexerr++;
     688                    if(cl->account)
     689                        { cl->account->cwcacheexerr++; }
     690                    return 0;
     691                }
    692692            }
    693693        }
  • trunk/oscam-chk.c

    r11503 r11517  
    725725}
    726726
    727 uint8_t chk_if_ignore_checksum(ECM_REQUEST *er, int8_t disablecrc, FTAB *disablecrc_only_for)
    728 {
    729     if(!disablecrc && !disablecrc_only_for->nfilts) { return 0; }
     727uint8_t chk_if_ignore_checksum(ECM_REQUEST *er, FTAB *disablecrc_only_for)
     728{
     729    if(!disablecrc_only_for->nfilts) { return 0; }
    730730
    731731    int32_t i, k;
  • trunk/oscam-chk.h

    r11480 r11517  
    99int32_t ecm_ratelimit_check(struct s_reader *reader, ECM_REQUEST *er, int32_t reader_mode);
    1010int32_t matching_reader(ECM_REQUEST *er, struct s_reader *rdr);
    11 uint8_t chk_if_ignore_checksum(ECM_REQUEST *er, int8_t disablecrc, FTAB *disablecrc_only_for);
     11uint8_t chk_if_ignore_checksum(ECM_REQUEST *er, FTAB *disablecrc_only_for);
    1212
    1313uint8_t is_localreader(struct s_reader *rdr, ECM_REQUEST *er);
  • trunk/oscam-ecm.c

    r11516 r11517  
    15931593        { return 0; }
    15941594
    1595     int32_t i;
    1596     uint8_t c;
    15971595    struct timeb now;
    15981596    cs_ftime(&now);
     
    16401638    if(reader && cw && rc < E_NOTFOUND)
    16411639    {
    1642         if(cfg.disablecrccws == 0 && reader->disablecrccws == 0)
    1643         {
    1644             uint8_t selectedForIgnChecksum = chk_if_ignore_checksum(er, cfg.disablecrccws, &cfg.disablecrccws_only_for)
    1645                     + chk_if_ignore_checksum(er, reader->disablecrccws, &reader->disablecrccws_only_for);
    1646 
    1647             for(i = 0; i < 16; i += 4)
    1648             {
    1649                 c = ((cw[i] + cw[i + 1] + cw[i + 2]) & 0xff);
    1650 
    1651                 if(selectedForIgnChecksum && (cw[i + 3] != c))
     1640        if(!cfg.disablecrccws && !reader->disablecrccws)
     1641        {
     1642            if(!(chk_if_ignore_checksum(er, &cfg.disablecrccws_only_for) + chk_if_ignore_checksum(er, &reader->disablecrccws_only_for)))
     1643            {
     1644                uint8_t i, c;
     1645                for(i = 0; i < 16; i += 4)
    16521646                {
    1653                     cs_log_dbg(D_TRACE, "notice: CW checksum check disabled for %04X:%06X", er->caid, er->prid);
    1654                     break;
    1655                 }
    1656 
    1657                 if(cw[i + 3] != c)
    1658                 {
    1659                     uint8_t nano = 0x00;
    1660                     if(er->caid == 0x100 && er->ecm[5] > 0x00)
     1647                    c = ((cw[i] + cw[i + 1] + cw[i + 2]) & 0xff);
     1648
     1649                    if(cw[i + 3] != c)
    16611650                    {
    1662                         nano = er->ecm[5]; // seca nano protection
    1663                     }
    1664 
    1665                     if(reader->dropbadcws && !nano) // only drop controlword if no cw encryption is applied
    1666                     {
    1667                         rc = E_NOTFOUND;
    1668                         rcEx = E2_WRONG_CHKSUM;
    1669                         break;
    1670                     }
    1671                     else
    1672                     {
    1673                         if(!nano) // only fix checksum if no cw encryption is applied (nano = 0)
     1651                        uint8_t nano = 0x00;
     1652                        if(er->caid == 0x100 && er->ecm[5] > 0x00)
    16741653                        {
    1675                             cs_log_dbg(D_TRACE, "notice: changed dcw checksum byte cw[%i] from %02x to %02x", i + 3, cw[i + 3], c);
    1676                             cw[i + 3] = c;
     1654                            nano = er->ecm[5]; // seca nano protection
     1655                        }
     1656
     1657                        if(reader->dropbadcws && !nano) // only drop controlword if no cw encryption is applied
     1658                        {
     1659                            rc = E_NOTFOUND;
     1660                            rcEx = E2_WRONG_CHKSUM;
     1661                            break;
    16771662                        }
    16781663                        else
    16791664                        {
    1680                             if(i == 12) // there are servers delivering correct controlwords but with failing last cw checksum (on purpose?!)
     1665                            if(!nano) // only fix checksum if no cw encryption is applied (nano = 0)
    16811666                            {
    1682                                 cs_log_dbg(D_TRACE,"NANO%02d: BAD PEER DETECTED, oscam has fixed the last cw crc that wasn't matching!", nano);
    1683                                 cw[i + 3] = c; // fix the last controlword
     1667                                cs_log_dbg(D_TRACE, "notice: changed dcw checksum byte cw[%i] from %02x to %02x", i + 3, cw[i + 3], c);
     1668                                cw[i + 3] = c;
    16841669                            }
    16851670                            else
    16861671                            {
    1687                                 cs_log_dbg(D_TRACE,"NANO%02d: not fixing the crc of this cw since its still encrypted!", nano);
    1688                                 break; // crc failed so stop!
     1672                                if(i == 12) // there are servers delivering correct controlwords but with failing last cw checksum (on purpose?!)
     1673                                {
     1674                                    cs_log_dbg(D_TRACE,"NANO%02d: BAD PEER DETECTED, oscam has fixed the last cw crc that wasn't matching!", nano);
     1675                                    cw[i + 3] = c; // fix the last controlword
     1676                                }
     1677                                else
     1678                                {
     1679                                    cs_log_dbg(D_TRACE,"NANO%02d: not fixing the crc of this cw since its still encrypted!", nano);
     1680                                    break; // crc failed so stop!
     1681                                }
    16891682                            }
    16901683                        }
    16911684                    }
    16921685                }
     1686            }
     1687            else
     1688            {
     1689                cs_log_dbg(D_TRACE, "notice: CW checksum check disabled for %04X:%06X", er->caid, er->prid);
    16931690            }
    16941691        }
Note: See TracChangeset for help on using the changeset viewer.