SASC
DVBSoftCAM

testN1Emu.c

Go to the documentation of this file.
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 }
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines