All pastes #817368 Raw Edit

Anonym

public diff v1 · immutable
·published 2007-12-15 14:55 UTC
rendered paste body
diff -r 4a78d1ec9701 sc/PLUGINS/src/sc-src/systems/nagra/nagra2-0501.c--- a/sc/PLUGINS/src/sc-src/systems/nagra/nagra2-0501.c	Fri Dec 07 08:17:25 2007 -0800+++ b/sc/PLUGINS/src/sc-src/systems/nagra/nagra2-0501.c	Wed Dec 12 07:01:04 2007 +0100@@ -113,6 +113,7 @@ int cN2Prov0501::ProcessBx(unsigned char     SetSp(0x0FFF,0x0FE0);     Set(0x0001,0xFF);     Set(0x000E,0xFF);+    Set(0,4);     ClearBreakpoints();     AddBreakpoint(0x821f);     while(!Run(5000)) {diff -r 4a78d1ec9701 sc/PLUGINS/src/sc-src/systems/nagra/nagra2-4101.c--- a/sc/PLUGINS/src/sc-src/systems/nagra/nagra2-4101.c	Fri Dec 07 08:17:25 2007 -0800+++ b/sc/PLUGINS/src/sc-src/systems/nagra/nagra2-4101.c	Wed Dec 12 07:01:04 2007 +0100@@ -17,9 +17,56 @@  * Or, point your browser to http://www.gnu.org/copyleft/gpl.html  */ +// -- cMap4101 -----------------------------------------------------------------++#include "nagra2-ECC.c"++class cMap4101 : public cMapCore {+private:+  int mId;+  N2AU ecc;+protected:+  void DoMap(int f, unsigned char *data=0, int l=0);+public:+  cMap4101(int Id);+  };++cMap4101::cMap4101(int Id)+{+  mId=Id|0x100;+}++void cMap4101::DoMap(int f, unsigned char *data, int l)+{+  PRINTF(L_SYS_MAP,"%04x: calling function %02X",mId,f);+  switch(f) {+    case 0x58:+      {+      unsigned char res[64];+      memset(res,0,sizeof(res));+//      ecc.MAP58(P,Px,Py,a,K,resX,resY);+      ecc.MAP58(&data[0],&data[16],&data[32],&data[64],&data[80],&res[0],&res[32]);+      memcpy(data,res,sizeof(res));+      break;+      }+    case 0x44:+      sctx.h4=UINT32_LE(data);+      sctx.h3=UINT32_LE(data+4);+      sctx.h2=UINT32_LE(data+8);+      sctx.h1=UINT32_LE(data+12);+      sctx.h0=UINT32_LE(data+16);+      cMapCore::DoMap(0x44,data);+      break;+    default:+      if(!cMapCore::DoMap(f,data,l))+        PRINTF(L_SYS_MAP,"%04x: unsupported call %02x",mId,f);+      break;+    }+}+ // -- cN2Prov4101 ---------------------------------------------------------------- -class cN2Prov4101 : public cN2Prov, public cN2Emu {+class cN2Prov4101 : public cN2Prov, public cMap4101, public cN2Emu { protected:   virtual void WriteHandler(unsigned char seg, unsigned short ea, unsigned char &op); public:@@ -32,6 +79,7 @@ static cN2ProvLinkReg<cN2Prov4101,0x4101  cN2Prov4101::cN2Prov4101(int Id, int Flags) :cN2Prov(Id,Flags)+,cMap4101(Id) {   hasWriteHandler=true; }@@ -64,6 +112,8 @@ int cN2Prov4101::ProcessBx(unsigned char     ClearBreakpoints();     AddBreakpoint(0xACDD);     AddBreakpoint(0x9BDD);+    AddBreakpoint(0x7EC5);+    AddBreakpoint(0xAE5F);     while(!Run(5000)) {       switch(GetPc()) {         case 0xACDD:@@ -71,6 +121,51 @@ int cN2Prov4101::ProcessBx(unsigned char         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);+          GetMem(ptr,&data[pos-1],clen);+          ptr=(Get(args+2)<<8)+Get(args+3)-0x0CED+0x00B4-0x0080; // wild hack+          if(ptr<7 || 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(0x58,tmp);+          DoMap(0x43);+          DoMap(0x44,tmp);+          SetMem(0x0440,tmp,20);+          SetMem(0x80,data,len);+          SetPc(0x80+pos);+          break;+          }+        case 0xAE5F:+          {+        int size=wordsize<<3;+        unsigned char tmp[size];+        unsigned short addr=(Get(0x44)<<8)+Get(0x45);+        switch(a) {+          case 0x02:+            DoMap(a,0,Get(0x48)); break;+          case IMPORT_J ... IMPORT_LAST:+            GetMem(addr,tmp,size,0); DoMap(a,tmp); break;+          case EXPORT_J ... EXPORT_LAST:+            DoMap(a,tmp); SetMem(addr,tmp,size,0); break;+          case SWAP_A ... SWAP_D:+            GetMem(addr,tmp,size,0); DoMap(a,tmp); SetMem(addr,tmp,size,0); break;+          case CLEAR_A ... CLEAR_D:+          case COPY_A_B ... COPY_D_C:+            DoMap(a); break;+          default:+            PRINTF(L_SYS_EMM,"%04X: unrecognized map call %02x",id,a);+            return -1;+          }+        PopCr(); PopPc();+        }         }       }     }diff -r 4a78d1ec9701 sc/PLUGINS/src/sc-src/systems/nagra/nagra2.c--- a/sc/PLUGINS/src/sc-src/systems/nagra/nagra2.c	Fri Dec 07 08:17:25 2007 -0800+++ b/sc/PLUGINS/src/sc-src/systems/nagra/nagra2.c	Wed Dec 12 07:01:04 2007 +0100@@ -117,13 +117,13 @@ class cMapCore { class cMapCore { private:   cBN x, y, s, j;-  SHA_CTX sctx; protected:   cBN A, B, C, D, J;   cBN H, R;   cBNctx ctx;   int wordsize, last;   cBN *regs[5];+  SHA_CTX sctx;   //   void MakeJ(void);   void MonMul(BIGNUM *o, BIGNUM *i1, BIGNUM *i2);@@ -646,6 +646,8 @@ bool cSystemNagra2::ProcessECM(const cEc   cTimeMs minTime;    if(id==0x4101) StartLog(ecm,0x1881); // D+ AU+  if (id==0x0505||id==0x0503 || id==0x0511) id=0x0501;+  if(doLog) PRINTF(L_SYS_KEY,"using id %04x P*-Star patch ",id); // using 0501 for Prem Star        if(cmdLen<64 || SCT_LEN(data)<cmdLen+10) {     if(doLog) PRINTF(L_SYS_ECM,"bad ECM message msgLen=%d sctLen=%d",cmdLen,SCT_LEN(data));@@ -837,7 +839,16 @@ void cSystemNagra2::ProcessEMM(int pid,        case 0xE0: // DN key update         if(emmdata[i+1]==0x25) {           FoundKey();-          if(keys.NewKey('N',id,(emmdata[i+16]&0x40)>>6,&emmdata[i+23],16)) NewKey();+          if(keys.NewKey('N',id,(emmdata[i+16]&0x40)>>6,&emmdata[i+23],16))+          {+           // Hack: Poor men's P-Star and Entavio AU+           if (id == 0x501) {+             keys.NewKey('N',0x503,(emmdata[i+16]&0x40)>>6,&emmdata[i+23],16);+             keys.NewKey('N',0x505,(emmdata[i+16]&0x40)>>6,&emmdata[i+23],16);+             keys.NewKey('N',0x511,(emmdata[i+16]&0x40)>>6,&emmdata[i+23],16);+           }+           NewKey();+          }           cLoaders::SaveCache();           }         i+=emmdata[i+1]+2;