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

📄 testn1emu.c

📁 这是一个LINUX环境的 VDR 插件源代码,可支持Irdeto, Seca, Viaccess, Nagra, Conax & Cryptoworks等CA系统的读卡、共享等操作。
💻 C
字号:
#include <stdlib.h>#include <stdio.h>#define TESTER#include "crypto.h"#include "data.h"#include "system-common.h"#include "systems/nagra/cpu.c"#include "systems/nagra/nagra.c"#include "systems/nagra/nagra1.c"#include "compat.h"class cTestNagra : public cNagra1 {public:  virtual void Process(int id, unsigned char *emmdata);  };void cTestNagra::Process(int id, unsigned char *emmdata){  cEmu *emu=0;  cBN n1, e1;  unsigned int i=0;  bool gotKeys=false;  unsigned char key0[8], key1[8];  int keyId=(emmdata[i+1]<<8)+emmdata[i+2];  switch(emmdata[i]) { // Check filter type    case 0x00: // One card      i+=7; break;    case 0x01 ... 0x20: // Group of cards      i+=emmdata[i]+0x7; break;    case 0x3e:      i+=6; break;    case 0x3d: // All cards with same system ID    case 0x3f:      i+=3; break;    }  int nrKeys=0;  while(i<sizeof(emmdata)) {    if((emmdata[i]&0xF0)==0xF0) { // Update with CPU code      const int romNr=emmdata[i]&0x0F;      if(!emu || !emu->Matches(romNr,id)) {        delete emu; emu=0;        printf("Testing with ROM %d, 0xID %04x\n",romNr,id);        switch(romNr) {          case 3:  emu=new cEmuRom3;  break;          case 7:  emu=new cEmuRom7;  break;          case 10: emu=new cEmuRom10; break;          case 11: emu=new cEmuRom11; break;          default: printf("unsupported ROM"); return;          }        if(!emu || !emu->Init(romNr,id)) {          delete emu; emu=0;          printf("initialization failed for ROM %d\n",romNr);          return;          }        }      unsigned char ki[2];      if((gotKeys=emu->GetOpKeys(emmdata,ki,key0,key1))) {        printf("keyid: "); SDump(ki,2);        printf("key0: "); SDump(key0,8);        printf("key1: "); SDump(key1,8);        keyId=(ki[0]<<8)+ki[1];        printf("got keys for %04X (ROM %d)\n",keyId,romNr);        }      unsigned char select[3], pkset[3][15];      select[0]=(keyId>>8)|0x01; // always high id for ECM RSA keys      select[1]=keyId&0xFF;      select[2]=0; // type 0HexDump(select,3);      if(emu->GetPkKeys(&select[0],&pkset[0][0])) {        int pkKeyId=((select[0]<<8)+select[1]);        printf("got PK keys for %04X (ROM %d)\n",pkKeyId,romNr);HexDump(pkset[0],sizeof(pkset[0]));HexDump(pkset[1],sizeof(pkset[1]));HexDump(pkset[2],sizeof(pkset[2]));        for(int i=0; i<3; i++) {          CreateRSAPair(pkset[i],0,e1,n1);          printf("keyE1 set=%d ",i); bprint(e1);          printf("keyN1 set=%d ",i); bprint(n1);          }        }      break; // don't process other nanos      }   else if(emmdata[i]==0x60) { // NULL nano      i+=2;      }    else if(emmdata[i]==0x00) {      i++;      }    else if(emmdata[i]==0x81) {      i++;      }    else if(emmdata[i]==0x83) {      keyId=(emmdata[i+1]<<8)+emmdata[i+2];      i+=3;      }    else if(emmdata[i]==0x42) { // plain Key      if(emmdata[i+1]==0x05) memcpy(key0,&emmdata[i+2],sizeof(key0));      else                   memcpy(key1,&emmdata[i+2],sizeof(key1));      i+=10;      if(++nrKeys==2) {        gotKeys=true;        printf("got keys for %04X (plain)\n",keyId);        break;        }      }    else {      printf("ignored nano %02x\n",emmdata[i]);      break;      }    }  delete emu;}int main(int argc, char *argv[]){  if(argc<3) {    printf("usage: %s <plugin-dir> <id> <rawemm-file>\n",argv[0]);    return 1;    }  InitAll(argv[1]);  unsigned char emmdata[64];  int emmlen=ReadRaw(argv[3],emmdata,sizeof(emmdata));  if(emmlen!=64) {    printf("bad rawemm file format\n");    return 1;    }  const int id=strtol(argv[2],0,0);  cTestNagra test;  test.Process(id,emmdata);  return 0;}

⌨️ 快捷键说明

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