static void pandora_process_request(struct s_client *cl, uchar *buf, int32_t l) { int ecmlen; ECM_REQUEST *er; uchar md5tmp[MD5_DIGEST_LENGTH]; if (!(er = get_ecmtask())) return; er->caid = b2i(2, buf + 1); er->srvid = b2i(2, buf + 3); er->prid = b2i(4, buf + 5); //er->ecmcrc32 = crc32(0L, buf+10, CS_ECMSTORESIZE); er->chid = b2i(2, buf + 10 + CS_ECMSTORESIZE); if (l > 12 + CS_ECMSTORESIZE + 16) { ecmlen = b2i(2, buf + 12 + CS_ECMSTORESIZE); if ((ecmlen > 320) || cl->pand_ignore_ecm) er->ecmlen = 0; else { if (!memcmp(buf + 10, MD5(buf + 14 + CS_ECMSTORESIZE, ecmlen, md5tmp), CS_ECMSTORESIZE)) { er->ecmlen = ecmlen; memcpy(er->ecm, buf + 14 + CS_ECMSTORESIZE, ecmlen); //set_ecmhash(cl, er); } else er->ecmlen = 0; } } else er->ecmlen = 0; if (!er->ecmlen) usleep(cl->pand_autodelay); get_cw(cl, er); }
static void radegast_process_ecm(uchar *buf, int32_t l) { int32_t i, n, sl; ECM_REQUEST *er; struct s_client *cl = cur_client(); if(!(er = get_ecmtask())) { return; } for(i = 0; i+1 < l; i += (sl + 2)) { sl = buf[i + 1]; switch(buf[i]) { case 2: // CAID (upper byte only, oldstyle) if(i+2 >= l) { break; } er->caid = buf[i + 2] << 8; break; case 10: // CAID if(i+3 >= l) { break; } er->caid = b2i(2, buf + i + 2); break; case 3: // ECM DATA if(i+4 >= l) { break; } er->ecmlen = (((buf[i + 1 + 2] & 0x0F) << 8) | buf[i + 2 + 2]) + 3; if(er->ecmlen < 3 || er->ecmlen > MAX_ECM_SIZE || i+2+er->ecmlen > l) { break; } memcpy(er->ecm, buf + i + 2, er->ecmlen); break; case 6: // PROVID (ASCII) if(i+2+sl > l) { break; } n = (sl > 6) ? 3 : (sl >> 1); er->prid = cs_atoi((char *) buf + i + 2 + sl - (n << 1), n, 0); break; case 7: // KEYNR (ASCII), not needed break; case 8: // ECM PROCESS PID ?? don't know, not needed break; } } if(l != i) { cs_log("WARNING: ECM-request corrupt"); } else { get_cw(cl, er); } }
static void oscam_ser_process_ecm(uchar *buf, int32_t l) { ECM_REQUEST *er; if (!(er=get_ecmtask())) return; switch(oscam_ser_check_ecm(er, buf, l)) { case 2: er->rc=E_CORRUPT; return; // error without log case 1: er->rc=E_CORRUPT; // error with log } get_cw(cur_client(), er); }
static void radegast_process_ecm(uchar *buf, int32_t l) { int32_t i, n, sl; ECM_REQUEST *er; struct s_client *cl = cur_client(); if (!(er=get_ecmtask())) return; for (i=0; i<l; i+=(sl+2)) { sl=buf[i+1]; switch(buf[i]) { case 2: // CAID (upper byte only, oldstyle) er->caid=buf[i+2]<<8; break; case 10: // CAID er->caid=b2i(2, buf+i+2); break; case 3: // ECM DATA er->ecmlen = sl; memcpy(er->ecm, buf+i+2, er->ecmlen); break; case 6: // PROVID (ASCII) n=(sl>6) ? 3 : (sl>>1); er->prid=cs_atoi((char *) buf+i+2+sl-(n<<1), n, 0); break; case 7: // KEYNR (ASCII), not needed break; case 8: // ECM PROCESS PID ?? don't know, not needed break; } } if (l!=i) cs_log("WARNING: ECM-request corrupt"); else get_cw(cl, er); }