|
SASC-NG
DVBSoftCAM
|
Inheritance diagram for cTestNagra:Public Member Functions | |
| virtual void | Process (int id, unsigned char *emmdata) |
Definition at line 15 of file testN1Emu.c.
| void cTestNagra::Process | ( | int | id, |
| unsigned char * | emmdata | ||
| ) | [virtual] |
Definition at line 20 of file testN1Emu.c.
References bprint, cNagra::CreateRSAPair(), cEmu::GetOpKeys(), cEmu::GetPkKeys(), HexDump, i, cEmu::Init(), cEmu::Matches(), and SDump().
Referenced by main().
{
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 0
HexDump(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;
}