Example #1
0
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); }
}
Example #3
0
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);
}
Example #4
0
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);
}