SASC-NG
DVBSoftCAM

cN2Prov4101 Class Reference

Inheritance diagram for cN2Prov4101:

List of all members.

Public Member Functions

 cN2Prov4101 (int Id, int Flags)
virtual bool PostProcAU (int id, unsigned char *data)
virtual int ProcessBx (unsigned char *data, int len, int pos)

Protected Member Functions

virtual void WriteHandler (unsigned char seg, unsigned short ea, unsigned char &op)

Detailed Description

Definition at line 78 of file nagra2-4101.c.


Constructor & Destructor Documentation

cN2Prov4101::cN2Prov4101 ( int  Id,
int  Flags 
)

Definition at line 89 of file nagra2-4101.c.

References c6805::hasWriteHandler, and cMapCore::SetMapIdent().

:cN2Prov(Id,Flags)
{
  hasWriteHandler=true;
  SetMapIdent(Id);
}

Member Function Documentation

bool cN2Prov4101::PostProcAU ( int  id,
unsigned char *  data 
) [virtual]

Reimplemented from cN2Prov.

Definition at line 96 of file nagra2-4101.c.

References DES_CAST, cPlainKeys::FindKeyNoTrig(), cPlainKey::Get(), keys, L_SYS_EMM, MBC, N2_MAGIC, and PRINTF.

{
  if(data[1]==0x01) {
    cPlainKey *pk;
    if(!(pk=keys.FindKeyNoTrig('N',id,MBC(N2_MAGIC,0x30),16))) {
      PRINTF(L_SYS_EMM,"missing %04x NN 30 3DES key (16 bytes)",id);
      return false;
      }
    unsigned char dkey[16];
    pk->Get(dkey);
    DES_key_schedule ks1, ks2;
    DES_key_sched((DES_cblock *)&dkey[0],&ks1);
    DES_key_sched((DES_cblock *)&dkey[8],&ks2);
    DES_ecb2_encrypt(DES_CAST(&data[7]),DES_CAST(&data[7]),&ks1,&ks2,DES_DECRYPT);
    DES_ecb2_encrypt(DES_CAST(&data[7+8]),DES_CAST(&data[7+8]),&ks1,&ks2,DES_DECRYPT);
    }
  return true;
}
int cN2Prov4101::ProcessBx ( unsigned char *  data,
int  len,
int  pos 
) [virtual]

Reimplemented from cN2Prov.

Definition at line 115 of file nagra2-4101.c.

References c6805::a, c6805::AddBreakpoint(), c6805::ClearBreakpoints(), cMapCore::DoMap(), c6805::Get(), c6805::GetMem(), c6805::GetPc(), cN2Emu::Init(), c6805::PopPc(), c6805::Run(), c6805::SetMem(), c6805::SetPc(), and c6805::SetSp().

{
  if(Init(id,110)) {
    SetMem(0x80,data,len);
    SetPc(0x80+pos);
    SetSp(0x0FFF,0x0FE0);
    ClearBreakpoints();
    AddBreakpoint(0xACDD);
    AddBreakpoint(0x9BDD);
    AddBreakpoint(0x7EC5);
    while(!Run(5000)) {
      switch(GetPc()) {
        case 0xACDD:
          return -1;
        case 0x9BDD:
          GetMem(0x80,data,len);
          return a;
        case 0x7EC5:
          {
          PopPc();
          unsigned short args=GetPc();
          int clen=Get(args+4);
          unsigned short ptr=(Get(args)<<8)+Get(args+1);
          if(clen+pos-1>len) return -1; // sanity
          GetMem(ptr,&data[pos-1],clen);
          ptr=(Get(args+2)<<8)+Get(args+3)-0x0CED+0x00B4-0x0080; // wild hack
          if(ptr<7 || ptr+8>len || data[ptr-1]!=0x10 || data[ptr-7]!=0x42) // sanity
            return -1;
          unsigned char tmp[96];
          memcpy(&tmp[0],&data[ptr],8);
          ptr=(((data[ptr]&0x3F)|0x40)<<8)+(data[ptr+1]&0x7F);
          GetMem(ptr,&tmp[8],sizeof(tmp)-8);
          DoMap(0x02,0,2);
          DoMap(0x58,tmp);
          DoMap(0x43);
          DoMap(0x44,tmp);
          SetMem(0x0440,tmp,20);
          SetMem(0x80,data,len);
          SetPc(0x80+pos);
          break;
          }
        }
      }
    }
  return -1;
}
void cN2Prov4101::WriteHandler ( unsigned char  seg,
unsigned short  ea,
unsigned char &  op 
) [protected, virtual]

Reimplemented from c6805.

Definition at line 162 of file nagra2-4101.c.

References c6805::cr, and c6805::Get().

{
  if(cr==0x00) {
    if(ea==0x0a || ea==0x12 || ea==0x16) {
      unsigned char old=Get(ea);
      if(old&2) op=(old&~0x02) | (op&0x02);
      }
    }
}

The documentation for this class was generated from the following file:
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines