rendered paste bodydiff -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;