⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 irdeto.c

📁 VDR softcam plugin 0.9.1
💻 C
字号:
/* * Softcam plugin to VDR (C++) * * This code is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This code is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * Or, point your browser to http://www.gnu.org/copyleft/gpl.html */#include <stdlib.h>#include <string.h>#include <ctype.h>#include "system-common.h"#include "irdeto.h"#include "log-irdeto.h"static const struct LogModule lm_sys = {  (LMOD_ENABLE|L_SYS_ALL)&LOPT_MASK,  (LMOD_ENABLE|L_SYS_DEFDEF)&LOPT_MASK,  "irdeto",  { L_SYS_DEFNAMES,"rawemm","rawecm" }  };ADD_MODULE(L_SYS,lm_sys)// -- cPlainKeyIrd -------------------------------------------------------------#define I1_KEYLEN 8#define I2_KEYLEN 16class cPlainKeyIrd : public cHexKey {private:  bool IsI2Key(void);protected:  virtual int IdSize(void);  virtual cString PrintKeyNr(void);public:  cPlainKeyIrd(bool Super);  virtual bool Parse(const char *line);  virtual bool SetKey(void *Key, int Keylen);  virtual bool SetBinKey(unsigned char *Mem, int Keylen);  };static cPlainKeyTypeReg<cPlainKeyIrd,'I'> KeyReg;cPlainKeyIrd::cPlainKeyIrd(bool Super):cHexKey(Super){}bool cPlainKeyIrd::SetKey(void *Key, int Keylen){  if(!IsI2Key()) SetSupersede(false);  return cHexKey::SetKey(Key,Keylen);}bool cPlainKeyIrd::SetBinKey(unsigned char *Mem, int Keylen){  if(!IsI2Key()) SetSupersede(false);  return cHexKey::SetBinKey(Mem,Keylen);}int cPlainKeyIrd::IdSize(void){  return IsI2Key() ? 4 : 2;}bool cPlainKeyIrd::IsI2Key(void){  return TYPE(keynr)!=TYPE_I1;}bool cPlainKeyIrd::Parse(const char *line){  unsigned char sid[2], skey[I2_KEYLEN];  int klen;  if(GetChar(line,&type,1) && (klen=GetHex(line,sid,2,false))) {     type=toupper(type); id=Bin2Int(sid,klen);     line=skipspace(line);     bool ok=false;     if(klen==2) {       klen=I2_KEYLEN;       unsigned char prov;       if(GetHex(line,&prov,1)) {         line=skipspace(line);         int typ, id;         if(!strncasecmp(line,"IV",2)) {       typ=TYPE_IV; id=0; line+=2; ok=true; }         else if(!strncasecmp(line,"ECM",3)) { typ=TYPE_SEED; id=0; line+=3; ok=true; }         else if(!strncasecmp(line,"EMM",3)) { typ=TYPE_SEED; id=1; line+=3; ok=true; }         else if(!strncasecmp(line,"MK",2)) {  typ=TYPE_PMK; id=line[2]-'0'; line+=3; ok=true; }         else { typ=TYPE_OP; ok=GetHex(line,sid,1); id=sid[0]; }         keynr=KEYSET(prov,typ,id);         }       }     else {       klen=I1_KEYLEN;       ok=GetHex(line,sid,1);       keynr=KEYSET(0,TYPE_I1,sid[0]);       }     line=skipspace(line);     if(ok && GetHex(line,skey,klen)) {       SetBinKey(skey,klen);       return true;       }    }  return false;}cString cPlainKeyIrd::PrintKeyNr(void){  char tmp[16];  if(IsI2Key()) {    snprintf(tmp,sizeof(tmp),"%02X ",PROV(keynr));    switch(TYPE(keynr)) {      case TYPE_OP:   snprintf(tmp+3,sizeof(tmp)-3,"%02X",ID(keynr)); break;      case TYPE_IV:   snprintf(tmp+3,sizeof(tmp)-3,"IV"); break;      case TYPE_SEED: snprintf(tmp+3,sizeof(tmp)-3,"%s",ID(keynr)?"EMM":"ECM"); break;      case TYPE_PMK:  snprintf(tmp+3,sizeof(tmp)-3,"MK%d",ID(keynr)); break;      }    }  else    snprintf(tmp,sizeof(tmp),"%02X",ID(keynr));  return tmp;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -