|
SASC-NG
DVBSoftCAM
|
00001 00002 #include <stdlib.h> 00003 #include <stdio.h> 00004 00005 #define TESTER 00006 #include "crypto.h" 00007 #include "data.h" 00008 #include "system-common.h" 00009 #include "systems/nagra/cpu.c" 00010 #include "systems/nagra/nagra.c" 00011 #include "systems/nagra/nagra1.c" 00012 00013 #include "compat.h" 00014 00015 class cTestNagra : public cNagra1 { 00016 public: 00017 virtual void Process(int id, unsigned char *emmdata); 00018 }; 00019 00020 void cTestNagra::Process(int id, unsigned char *emmdata) 00021 { 00022 cEmu *emu=0; 00023 cBN n1, e1; 00024 00025 unsigned int i=0; 00026 bool gotKeys=false; 00027 unsigned char key0[8], key1[8]; 00028 int keyId=(emmdata[i+1]<<8)+emmdata[i+2]; 00029 switch(emmdata[i]) { // Check filter type 00030 case 0x00: // One card 00031 i+=7; break; 00032 case 0x01 ... 0x20: // Group of cards 00033 i+=emmdata[i]+0x7; break; 00034 case 0x3e: 00035 i+=6; break; 00036 case 0x3d: // All cards with same system ID 00037 case 0x3f: 00038 i+=3; break; 00039 } 00040 int nrKeys=0; 00041 while(i<sizeof(emmdata)) { 00042 if((emmdata[i]&0xF0)==0xF0) { // Update with CPU code 00043 const int romNr=emmdata[i]&0x0F; 00044 if(!emu || !emu->Matches(romNr,id)) { 00045 delete emu; emu=0; 00046 printf("Testing with ROM %d, 0xID %04x\n",romNr,id); 00047 switch(romNr) { 00048 case 3: emu=new cEmuRom3; break; 00049 case 7: emu=new cEmuRom7; break; 00050 case 10: emu=new cEmuRom10; break; 00051 case 11: emu=new cEmuRom11; break; 00052 default: printf("unsupported ROM"); return; 00053 } 00054 if(!emu || !emu->Init(romNr,id)) { 00055 delete emu; emu=0; 00056 printf("initialization failed for ROM %d\n",romNr); 00057 return; 00058 } 00059 } 00060 unsigned char ki[2]; 00061 if((gotKeys=emu->GetOpKeys(emmdata,ki,key0,key1))) { 00062 printf("keyid: "); SDump(ki,2); 00063 printf("key0: "); SDump(key0,8); 00064 printf("key1: "); SDump(key1,8); 00065 keyId=(ki[0]<<8)+ki[1]; 00066 printf("got keys for %04X (ROM %d)\n",keyId,romNr); 00067 } 00068 unsigned char select[3], pkset[3][15]; 00069 select[0]=(keyId>>8)|0x01; // always high id for ECM RSA keys 00070 select[1]=keyId&0xFF; 00071 select[2]=0; // type 0 00072 HexDump(select,3); 00073 if(emu->GetPkKeys(&select[0],&pkset[0][0])) { 00074 int pkKeyId=((select[0]<<8)+select[1]); 00075 printf("got PK keys for %04X (ROM %d)\n",pkKeyId,romNr); 00076 HexDump(pkset[0],sizeof(pkset[0])); 00077 HexDump(pkset[1],sizeof(pkset[1])); 00078 HexDump(pkset[2],sizeof(pkset[2])); 00079 for(int i=0; i<3; i++) { 00080 CreateRSAPair(pkset[i],0,e1,n1); 00081 printf("keyE1 set=%d ",i); bprint(e1); 00082 printf("keyN1 set=%d ",i); bprint(n1); 00083 } 00084 } 00085 break; // don't process other nanos 00086 } 00087 else if(emmdata[i]==0x60) { // NULL nano 00088 i+=2; 00089 } 00090 else if(emmdata[i]==0x00) { 00091 i++; 00092 } 00093 else if(emmdata[i]==0x81) { 00094 i++; 00095 } 00096 else if(emmdata[i]==0x83) { 00097 keyId=(emmdata[i+1]<<8)+emmdata[i+2]; 00098 i+=3; 00099 } 00100 else if(emmdata[i]==0x42) { // plain Key 00101 if(emmdata[i+1]==0x05) memcpy(key0,&emmdata[i+2],sizeof(key0)); 00102 else memcpy(key1,&emmdata[i+2],sizeof(key1)); 00103 i+=10; 00104 if(++nrKeys==2) { 00105 gotKeys=true; 00106 printf("got keys for %04X (plain)\n",keyId); 00107 break; 00108 } 00109 } 00110 else { 00111 printf("ignored nano %02x\n",emmdata[i]); 00112 break; 00113 } 00114 } 00115 00116 delete emu; 00117 } 00118 00119 00120 int main(int argc, char *argv[]) 00121 { 00122 if(argc<3) { 00123 printf("usage: %s <plugin-dir> <id> <rawemm-file>\n",argv[0]); 00124 return 1; 00125 } 00126 00127 InitAll(argv[1]); 00128 unsigned char emmdata[64]; 00129 int emmlen=ReadRaw(argv[3],emmdata,sizeof(emmdata)); 00130 if(emmlen!=64) { 00131 printf("bad rawemm file format\n"); 00132 return 1; 00133 } 00134 const int id=strtol(argv[2],0,0); 00135 cTestNagra test; 00136 test.Process(id,emmdata); 00137 return 0; 00138 }