diff -Nru sc-hg-20120721/parse.c sc-hg-20120721-emm-viaccess/parse.c --- sc-hg-20120721/parse.c 2012-07-22 17:25:10.000000000 +0000 +++ sc-hg-20120721-emm-viaccess/parse.c 2012-07-22 17:39:17.000000000 +0000 @@ -69,11 +69,11 @@ return p; } -cProvider *cProviders::MatchProv(const unsigned char *data) +cProvider *cProviders::MatchProv(const unsigned char *data, int pid) { cProvider *p=First(); while(p) { - if(p->MatchEMM(data)) break; + if(p->MatchEMM(data, pid)) break; p=Next(p); } return p; @@ -140,12 +140,12 @@ card=c; } -bool cIdSet::MatchEMM(const unsigned char *data) +bool cIdSet::MatchEMM(const unsigned char *data, int pid) { - return (card && card->MatchEMM(data)) || MatchProv(data); + return (card && card->MatchEMM(data)) || MatchProv(data, pid); } -bool cIdSet::MatchAndAssemble(cAssembleData *ad, int *updtype, cProvider **prov) +bool cIdSet::MatchAndAssemble(cAssembleData *ad, int *updtype, cProvider **prov, int pid) { const unsigned char *data=ad->Data(); cProvider *p; @@ -154,10 +154,10 @@ if(prov) *prov=0; if(card->Assemble(ad)>=0) return true; } - else if((p=MatchProv(data))) { + else if((p=MatchProv(data, pid))) { if(updtype) *updtype=p->UpdateType(data); if(prov) *prov=p; - if(p->Assemble(ad)>=0) return true; + if(p->Assemble(ad, pid)>=0) return true; } return false; } @@ -176,7 +176,7 @@ return (mode<0x10 && mode==provBase); } -bool cProviderIrdeto::MatchEMM(const unsigned char *data) +bool cProviderIrdeto::MatchEMM(const unsigned char *data, int pid) { const unsigned int len=cParseIrdeto::AddrLen(data); const unsigned int mode=cParseIrdeto::AddrBase(data); @@ -241,7 +241,7 @@ return id && !memcmp(id,provId,sizeof(provId)); } -bool cProviderSeca::MatchEMM(const unsigned char *data) +bool cProviderSeca::MatchEMM(const unsigned char *data, int pid) { return TID(data)==0x84 && !memcmp(SID(data),provId,sizeof(provId)) && !memcmp(SA(data),sa,sizeof(sa)); @@ -326,16 +326,92 @@ return id ? (id[0]<<8)+id[1] : -1; } +// -- cSharedEmm -------------------------------------------------------- + +cSharedEmm::cSharedEmm (void) +{ + sharedEmm = 0; + sharedLen = 0; + sharedToggle = 0; + allPid = 0; + nbShared = 0; +} + +cSharedEmm::~cSharedEmm () +{ + for (int i=0; i < nbShared; i++) { + free (sharedEmm [i]); + } + free (sharedEmm); + free (sharedLen); + free (sharedToggle); + free (allPid); + nbShared = 0; +} + +void cSharedEmm::set (int pid, const unsigned char *emm, int emm_len, int toggle) +{ + bool found = false; + int index; + for (index=0; index < nbShared; index++) { + if (allPid [index] == pid) { + found = true; + break; + } + } + + if (found && toggle == sharedToggle [index]) { + return; + } + + if (!found) { + nbShared++; + index = nbShared - 1; + sharedEmm = (unsigned char **)realloc (sharedEmm, nbShared * sizeof (unsigned char *)); + sharedLen = (int *)realloc (sharedLen, nbShared * sizeof (int)); + sharedToggle = (int *)realloc (sharedToggle, nbShared * sizeof (int)); + allPid = (int *)realloc (allPid, nbShared * sizeof (int)); + } else { + if (sharedEmm [index]) { + free (sharedEmm [index]); + } + } + + sharedEmm [index] = (unsigned char *)malloc (emm_len * sizeof (unsigned char)); + memcpy (sharedEmm [index], emm, emm_len); + sharedLen [index] = emm_len; + sharedToggle [index] = toggle; + allPid [index] = pid; +} + +unsigned char *cSharedEmm::get (int pid) +{ + for (int i=0; i < nbShared; i++) { + if (allPid [i] == pid) { + return sharedEmm [i]; + } + } + return 0; +} + +int cSharedEmm::len (int pid) +{ + for (int i=0; i < nbShared; i++) { + if (allPid [i] == pid) { + return sharedLen [i]; + } + } + return 0; +} + // -- cProviderViaccess -------------------------------------------------------- cProviderViaccess::cProviderViaccess(void) { - sharedEmm=0; sharedLen=sharedToggle=0; } cProviderViaccess::cProviderViaccess(const unsigned char *id, const unsigned char *s) { - sharedEmm=0; sharedLen=sharedToggle=0; memcpy(ident,id,sizeof(ident)); ident[2]&=0xf0; memcpy(sa,s,sizeof(sa)); @@ -343,7 +419,6 @@ cProviderViaccess::~cProviderViaccess() { - free(sharedEmm); } bool cProviderViaccess::MatchID(const unsigned char *data) @@ -352,17 +427,19 @@ return id && id[0]==ident[0] && id[1]==ident[1] && (id[2]&0xf0)==ident[2]; } -bool cProviderViaccess::MatchEMM(const unsigned char *data) +bool cProviderViaccess::MatchEMM(const unsigned char *data, int pid) { switch(data[0]) { case 0x8e: - if(memcmp(&data[3],sa,sizeof(sa)-1)) break; - if((data[6]&2)==0) - return sharedEmm && MatchID(sharedEmm); - // fall through + return sharedEmm.get (pid) && sharedEmm.len (pid) && memcmp(&data[3],sa,sizeof(sa)-1)==0; case 0x8c: case 0x8d: - return MatchID(data); + int sharedLen = 0; + if (MatchID (data)) { + sharedLen = SCT_LEN (data); + } + sharedEmm.set (pid, data, sharedLen, data [0]); + return false; // we don't match here even if it's ok for clearing all the other sharedEmm } return false; } @@ -382,25 +459,16 @@ } } -int cProviderViaccess::Assemble(cAssembleData *ad) +int cProviderViaccess::Assemble(cAssembleData *ad, int pid) { const unsigned char *data=ad->Data(); int len=SCT_LEN(data); switch(data[0]) { - case 0x8C: - case 0x8D: - if(data[0]!=sharedToggle) { - free(sharedEmm); - sharedLen=len; - sharedEmm=(unsigned char *)malloc(len); - if(sharedEmm) memcpy(sharedEmm,data,sharedLen); - sharedToggle=data[0]; - } - break; - case 0x8E: - if(sharedEmm) { - unsigned char *tmp=AUTOMEM(len+sharedLen); + unsigned char *currentSharedEmm = sharedEmm.get (pid); + int currentLen = sharedEmm.len (pid); + if(currentSharedEmm && currentLen) { + unsigned char *tmp=AUTOMEM(len+currentLen); unsigned char *ass=(unsigned char *)cParseViaccess::NanoStart(data); len-=(ass-data); if((data[6]&2)==0) { @@ -416,8 +484,8 @@ else { memcpy(tmp,ass,len); } - ass=(unsigned char *)cParseViaccess::NanoStart(sharedEmm); - int l=sharedLen-(ass-sharedEmm); + ass=(unsigned char *)cParseViaccess::NanoStart(currentSharedEmm); + int l=currentLen-(ass-currentSharedEmm); memcpy(&tmp[len],ass,l); len+=l; ass=(unsigned char *)malloc(len+7); @@ -536,10 +604,10 @@ bool cProviderConax::MatchID(const unsigned char *data) { - return MatchEMM(data); + return MatchEMM(data, 0); } -bool cProviderConax::MatchEMM(const unsigned char *data) +bool cProviderConax::MatchEMM(const unsigned char *data, int pid) { return !memcmp(&data[3],addr,sizeof(addr)); } @@ -570,10 +638,10 @@ bool cProviderCryptoworks::MatchID(const unsigned char *data) { - return MatchEMM(data); + return MatchEMM(data, 0); } -bool cProviderCryptoworks::MatchEMM(const unsigned char *data) +bool cProviderCryptoworks::MatchEMM(const unsigned char *data, int pid) { return false; } @@ -681,10 +749,10 @@ bool cProviderNDS::MatchID(const unsigned char *data) { - return MatchEMM(data); + return MatchEMM(data, 0); } -bool cProviderNDS::MatchEMM(const unsigned char *data) +bool cProviderNDS::MatchEMM(const unsigned char *data, int pid) { return cParseNDS::HasAddr(data,sa); } @@ -694,7 +762,7 @@ return Bin2LongLong(sa,sizeof(sa)); } -int cProviderNDS::Assemble(cAssembleData *ad) +int cProviderNDS::Assemble(cAssembleData *ad, int pid) { return cParseNDS::Assemble(ad,sa); } diff -Nru sc-hg-20120721/parse.h sc-hg-20120721-emm-viaccess/parse.h --- sc-hg-20120721/parse.h 2012-07-22 17:25:10.000000000 +0000 +++ sc-hg-20120721-emm-viaccess/parse.h 2012-07-22 17:39:17.000000000 +0000 @@ -46,17 +46,17 @@ class cProvider : public cSimpleItem { public: virtual bool MatchID(const unsigned char *data)=0; - virtual bool MatchEMM(const unsigned char *data)=0; + virtual bool MatchEMM(const unsigned char *data, int pid)=0; virtual unsigned long long ProvId(void)=0; virtual int UpdateType(const unsigned char *data) { return 2; } - virtual int Assemble(cAssembleData *ad) { return 0; } + virtual int Assemble(cAssembleData *ad, int pid) { return 0; } }; class cProviders : public cSimpleList { public: void AddProv(cProvider *p); cProvider *FindProv(const unsigned char *data); - cProvider *MatchProv(const unsigned char *data); + cProvider *MatchProv(const unsigned char *data, int pid); }; class cCard { @@ -75,8 +75,8 @@ ~cIdSet(); void SetCard(cCard *c); void ResetIdSet(void); - bool MatchEMM(const unsigned char *data); - bool MatchAndAssemble(cAssembleData *ad, int *updtype, cProvider **p); + bool MatchEMM(const unsigned char *data, int pid); + bool MatchAndAssemble(cAssembleData *ad, int *updtype, cProvider **p, int pid); }; // -- IRDETO ------------------------------------------------------ @@ -89,7 +89,7 @@ cProviderIrdeto(void) {} cProviderIrdeto(unsigned char pb, const unsigned char *pi); virtual bool MatchID(const unsigned char *data); - virtual bool MatchEMM(const unsigned char *data); + virtual bool MatchEMM(const unsigned char *data, int pid); virtual unsigned long long ProvId(void); }; @@ -156,7 +156,7 @@ cProviderSeca(void) {} cProviderSeca(const unsigned char *pi, const unsigned char *s); virtual bool MatchID(const unsigned char *data); - virtual bool MatchEMM(const unsigned char *data); + virtual bool MatchEMM(const unsigned char *data, int pid); virtual unsigned long long ProvId(void); }; @@ -181,10 +181,24 @@ // -- VIACCESS ----------------------------------------------------- +class cSharedEmm { +private: + unsigned char **sharedEmm; + int *sharedLen; + int *sharedToggle; + int *allPid; + int nbShared; +public: + cSharedEmm (void); + virtual ~cSharedEmm (); + virtual void set (int pid, const unsigned char *emm, int emm_len, int toggle); + virtual unsigned char *get (int pid); + virtual int len (int pid); +}; + class cProviderViaccess : public cProvider { private: - unsigned char *sharedEmm; - int sharedLen, sharedToggle; + cSharedEmm sharedEmm; public: unsigned char ident[3]; unsigned char sa[4]; @@ -193,10 +207,10 @@ cProviderViaccess(const unsigned char *id, const unsigned char *s); virtual ~cProviderViaccess(); virtual bool MatchID(const unsigned char *data); - virtual bool MatchEMM(const unsigned char *data); + virtual bool MatchEMM(const unsigned char *data, int pid); virtual unsigned long long ProvId(void); virtual int UpdateType(const unsigned char *data); - virtual int Assemble(cAssembleData *ad); + virtual int Assemble(cAssembleData *ad, int pid); }; class cCardViaccess : public cCard { @@ -239,7 +253,7 @@ // cProviderConax(const unsigned char *a); virtual bool MatchID(const unsigned char *data); - virtual bool MatchEMM(const unsigned char *data); + virtual bool MatchEMM(const unsigned char *data, int pid); virtual unsigned long long ProvId(void); }; @@ -259,7 +273,7 @@ // cProviderCryptoworks(const unsigned char *a); virtual bool MatchID(const unsigned char *data); - virtual bool MatchEMM(const unsigned char *data); + virtual bool MatchEMM(const unsigned char *data, int pid); virtual unsigned long long ProvId(void); }; @@ -286,9 +300,9 @@ // cProviderNDS(const unsigned char *s); virtual bool MatchID(const unsigned char *data); - virtual bool MatchEMM(const unsigned char *data); + virtual bool MatchEMM(const unsigned char *data, int pid); virtual unsigned long long ProvId(void); - virtual int Assemble(cAssembleData *ad); + virtual int Assemble(cAssembleData *ad, int pid); }; class cCardNDS : public cCard { diff -Nru sc-hg-20120721/systems/cardclient/aroureos.c sc-hg-20120721-emm-viaccess/systems/cardclient/aroureos.c --- sc-hg-20120721/systems/cardclient/aroureos.c 2012-07-22 17:25:10.000000000 +0000 +++ sc-hg-20120721-emm-viaccess/systems/cardclient/aroureos.c 2012-07-22 17:39:17.000000000 +0000 @@ -33,7 +33,7 @@ virtual bool Init(const char *config); virtual bool Login(void); virtual bool ProcessECM(const cEcmInfo *ecm, const unsigned char *source, unsigned char *cw); - virtual bool ProcessEMM(int caSys, const unsigned char *source); + virtual bool ProcessEMM(int pid, int caSys, const unsigned char *source); }; static cCardClientLinkReg __aroureos("Aroureos"); @@ -79,11 +79,11 @@ return true; } -bool cCardClientAroureos::ProcessEMM(int caSys, const unsigned char *source) +bool cCardClientAroureos::ProcessEMM(int pid, int caSys, const unsigned char *source) { if(emmAllowed) { cMutexLock lock(this); - if(MatchEMM(source)) { + if(MatchEMM(source, pid)) { const int length=SCT_LEN(source); int id=msEMM.Get(source,length,0); if(id>0 || emmAllowed>1) { diff -Nru sc-hg-20120721/systems/cardclient/camd.c sc-hg-20120721-emm-viaccess/systems/cardclient/camd.c --- sc-hg-20120721/systems/cardclient/camd.c 2012-07-22 17:25:10.000000000 +0000 +++ sc-hg-20120721-emm-viaccess/systems/cardclient/camd.c 2012-07-22 17:39:17.000000000 +0000 @@ -57,7 +57,7 @@ virtual bool Login(void); virtual bool Immediate(void); virtual bool ProcessECM(const cEcmInfo *ecm, const unsigned char *source, unsigned char *cw); - virtual bool ProcessEMM(int caSys, const unsigned char *source); + virtual bool ProcessEMM(int pid, int caSys, const unsigned char *source); }; cCardClientCommon::cCardClientCommon(const char *Name, bool ConReply, bool LogReply, bool DoAES, int MinMsgLen) @@ -175,11 +175,11 @@ return true; } -bool cCardClientCommon::ProcessEMM(int caSys, const unsigned char *source) +bool cCardClientCommon::ProcessEMM(int pid, int caSys, const unsigned char *source) { if(emmAllowed && CanHandleEMM(caSys)) { cMutexLock lock(this); - if(MatchEMM(source)) { + if(MatchEMM(source, pid)) { const int length=SCT_LEN(source); int id=msEMM.Get(source,length,0); if(id>0 || emmAllowed>1) { @@ -443,7 +443,7 @@ virtual bool Init(const char *config); virtual bool Login(void); virtual bool ProcessECM(const cEcmInfo *ecm, const unsigned char *data, unsigned char *cw); - virtual bool ProcessEMM(int caSys, const unsigned char *data); + virtual bool ProcessEMM(int pid, int caSys, const unsigned char *data); }; static cCardClientLinkReg __camd35("Camd35"); @@ -606,7 +606,7 @@ return false; } -bool cCardClientCamd35::ProcessEMM(int caSys, const unsigned char *data) +bool cCardClientCamd35::ProcessEMM(int pid, int caSys, const unsigned char *data) { if(emmProcessing && emmAllowed) { cMutexLock lock(this); @@ -616,7 +616,7 @@ int upd; cProvider *p; cAssembleData ad(data); - if(MatchAndAssemble(&ad,&upd,&p)) { + if(MatchAndAssemble(&ad,&upd,&p,pid)) { PRINTF(L_CC_CAMDEXTR,"EMM matched upd=%d provId=%.4llx",upd,p ? p->ProvId() : 0); while((data=ad.Assembled())) { LDUMP(L_CC_CAMDEXTR,&data[0],10,"processing assembled EMM"); diff -Nru sc-hg-20120721/systems/cardclient/cc.c sc-hg-20120721-emm-viaccess/systems/cardclient/cc.c --- sc-hg-20120721/systems/cardclient/cc.c 2012-07-22 17:25:10.000000000 +0000 +++ sc-hg-20120721-emm-viaccess/systems/cardclient/cc.c 2012-07-22 17:39:17.000000000 +0000 @@ -246,7 +246,7 @@ { cCardClient *cc=0; while((cc=staticCcl.FindBySysId(caid,cc))) - cc->ProcessEMM(caid,buffer); + cc->ProcessEMM(pid,caid,buffer); } // -- cSystemLinkCardClient ----------------------------------------------------------- diff -Nru sc-hg-20120721/systems/cardclient/cccam2.c sc-hg-20120721-emm-viaccess/systems/cardclient/cccam2.c --- sc-hg-20120721/systems/cardclient/cccam2.c 2012-07-22 17:25:10.000000000 +0000 +++ sc-hg-20120721-emm-viaccess/systems/cardclient/cccam2.c 2012-07-22 17:39:17.000000000 +0000 @@ -681,7 +681,7 @@ virtual bool Login(void); virtual bool CanHandle(unsigned short SysId); virtual bool ProcessECM(const cEcmInfo *ecm, const unsigned char *data, unsigned char *Cw); - virtual bool ProcessEMM(int caSys, const unsigned char *data); + virtual bool ProcessEMM(int pid, int caSys, const unsigned char *data); }; static cCardClientLinkReg __ncd("cccam2"); @@ -1221,7 +1221,7 @@ return false; } -bool cCardClientCCcam2::ProcessEMM(int caSys, const unsigned char *data) +bool cCardClientCCcam2::ProcessEMM(int pid, int caSys, const unsigned char *data) { bool res=false; if(emmProcessing && emmAllowed) { @@ -1231,7 +1231,7 @@ if(s->EmmReady() && s->CaID()==caSys) { cProvider *p; cAssembleData ad(data); - if(s->MatchAndAssemble(&ad,0,&p)) { + if(s->MatchAndAssemble(&ad,0,&p,pid)) { const unsigned char *d; while((d=ad.Assembled())) { int len=SCT_LEN(d); diff -Nru sc-hg-20120721/systems/cardclient/cc.h sc-hg-20120721-emm-viaccess/systems/cardclient/cc.h --- sc-hg-20120721/systems/cardclient/cc.h 2012-07-22 17:25:10.000000000 +0000 +++ sc-hg-20120721-emm-viaccess/systems/cardclient/cc.h 2012-07-22 17:39:17.000000000 +0000 @@ -79,7 +79,7 @@ virtual bool Immediate(void); virtual bool CanHandle(unsigned short SysId); virtual bool ProcessECM(const cEcmInfo *ecm, const unsigned char *data, unsigned char *cw)=0; - virtual bool ProcessEMM(int caSys, const unsigned char *data) { return false; } + virtual bool ProcessEMM(int pid, int caSys, const unsigned char *data) { return false; } const char *Name(void) { return name; } }; diff -Nru sc-hg-20120721/systems/cardclient/newcamd.c sc-hg-20120721-emm-viaccess/systems/cardclient/newcamd.c --- sc-hg-20120721/systems/cardclient/newcamd.c 2012-07-22 17:25:10.000000000 +0000 +++ sc-hg-20120721-emm-viaccess/systems/cardclient/newcamd.c 2012-07-22 17:39:17.000000000 +0000 @@ -190,7 +190,7 @@ virtual bool Login(void); virtual bool CanHandle(unsigned short SysId); virtual bool ProcessECM(const cEcmInfo *ecm, const unsigned char *data, unsigned char *Cw); - virtual bool ProcessEMM(int caSys, const unsigned char *data); + virtual bool ProcessEMM(int pid, int caSys, const unsigned char *data); }; static cCardClientLinkReg __ncd("Newcamd"); @@ -499,12 +499,12 @@ return false; } -bool cCardClientNewCamd::ProcessEMM(int caSys, const unsigned char *data) +bool cCardClientNewCamd::ProcessEMM(int pid, int caSys, const unsigned char *data) { if(emmProcessing && emmAllowed) { cMutexLock lock(this); cAssembleData ad(data); - if(MatchAndAssemble(&ad,0,0)) { + if(MatchAndAssemble(&ad,0,0,pid)) { while((data=ad.Assembled())) { int len=SCT_LEN(data); int id=msEMM.Get(data,len,0); diff -Nru sc-hg-20120721/systems/cardclient/radegast.c sc-hg-20120721-emm-viaccess/systems/cardclient/radegast.c --- sc-hg-20120721/systems/cardclient/radegast.c 2012-07-22 17:25:10.000000000 +0000 +++ sc-hg-20120721-emm-viaccess/systems/cardclient/radegast.c 2012-07-22 17:39:17.000000000 +0000 @@ -51,7 +51,7 @@ virtual bool Login(void); virtual bool CanHandle(unsigned short SysId); virtual bool ProcessECM(const cEcmInfo *ecm, const unsigned char *source, unsigned char *cw); - virtual bool ProcessEMM(int caSys, const unsigned char *data); + virtual bool ProcessEMM(int pid, int caSys, const unsigned char *data); }; static cCardClientLinkReg __rdg("Radegast"); @@ -273,14 +273,14 @@ return false; } -bool cCardClientRadegast::ProcessEMM(int caSys, const unsigned char *data) +bool cCardClientRadegast::ProcessEMM(int pid, int caSys, const unsigned char *data) { if(emmProcessing && emmAllowed) { cMutexLock lock(this); int upd; cProvider *p; cAssembleData ad(data); - if(MatchAndAssemble(&ad,&upd,&p)) { + if(MatchAndAssemble(&ad,&upd,&p,pid)) { while((data=ad.Assembled())) { int len=SCT_LEN(data); int id=msEMM.Get(data,len,0); diff -Nru sc-hg-20120721/systems/irdeto/irdeto1.c sc-hg-20120721-emm-viaccess/systems/irdeto/irdeto1.c --- sc-hg-20120721/systems/irdeto/irdeto1.c 2012-07-22 17:25:10.000000000 +0000 +++ sc-hg-20120721-emm-viaccess/systems/irdeto/irdeto1.c 2012-07-22 17:39:17.000000000 +0000 @@ -388,7 +388,7 @@ unsigned char *chkkey=AUTOMEM(max(sizeof(ci->PMK),sizeof(ci->HMK))); while(ci) { ci->hexBase=cParseIrdeto::AddrBase(buffer); - if((numKeys>0 && (ci->cProviderIrdeto::MatchEMM(buffer) || CheckNull(ci->provId,sizeof(ci->provId)) )) || + if((numKeys>0 && (ci->cProviderIrdeto::MatchEMM(buffer, pid) || CheckNull(ci->provId,sizeof(ci->provId)) )) || (mk && ci->haveHMK && (ci->cCardIrdeto::MatchEMM(buffer)))) { LBSTARTF(L_SYS_EMM); LBPUT("%02x %02x%02x%02x",buffer[3],buffer[4],buffer[5],buffer[6]); diff -Nru sc-hg-20120721/systems/sc-conax/sc-conax.c sc-hg-20120721-emm-viaccess/systems/sc-conax/sc-conax.c --- sc-hg-20120721/systems/sc-conax/sc-conax.c 2012-07-22 17:25:10.000000000 +0000 +++ sc-hg-20120721-emm-viaccess/systems/sc-conax/sc-conax.c 2012-07-22 17:39:17.000000000 +0000 @@ -429,7 +429,7 @@ static unsigned char ins84[] = { 0xdd,0x84,0x00,0x00,0x00 }; unsigned char buff[MAX_LEN]; - if(MatchEMM(data)) { + if(MatchEMM(data, pid)) { int l; if((l=CheckSctLen(data,2))>0) { buff[0]=0x12; buff[1]=l; diff -Nru sc-hg-20120721/systems/sc-cryptoworks/sc-cryptoworks.c sc-hg-20120721-emm-viaccess/systems/sc-cryptoworks/sc-cryptoworks.c --- sc-hg-20120721/systems/sc-cryptoworks/sc-cryptoworks.c 2012-07-22 17:25:10.000000000 +0000 +++ sc-hg-20120721-emm-viaccess/systems/sc-cryptoworks/sc-cryptoworks.c 2012-07-22 17:39:17.000000000 +0000 @@ -533,7 +533,7 @@ static unsigned char ins[] = { 0xA4,0x42,0x00,0x00,0x00 }; cAssembleData ad(data); - if(MatchAndAssemble(&ad,0,0)) { + if(MatchAndAssemble(&ad,0,0,pid)) { while((data=ad.Assembled())) { int c, n; switch(data[0]) { diff -Nru sc-hg-20120721/systems/sc-irdeto/sc-irdeto.c sc-hg-20120721-emm-viaccess/systems/sc-irdeto/sc-irdeto.c --- sc-hg-20120721/systems/sc-irdeto/sc-irdeto.c 2012-07-22 17:25:10.000000000 +0000 +++ sc-hg-20120721-emm-viaccess/systems/sc-irdeto/sc-irdeto.c 2012-07-22 17:39:17.000000000 +0000 @@ -640,7 +640,7 @@ { static const unsigned char emmCmd[] = { 0x01,0x01,0x00,0x00,0x00,0x00 }; - if(MatchEMM(data)) { + if(MatchEMM(data, pid)) { int len=cParseIrdeto::AddrLen(data)+1; if(len<=ADDRLEN) { const int dataLen=SCT_LEN(data)-5-len; // sizeof of data bytes (nanos) diff -Nru sc-hg-20120721/systems/sc-nagra/sc-nagra.c sc-hg-20120721-emm-viaccess/systems/sc-nagra/sc-nagra.c --- sc-hg-20120721/systems/sc-nagra/sc-nagra.c 2012-07-22 17:25:10.000000000 +0000 +++ sc-hg-20120721-emm-viaccess/systems/sc-nagra/sc-nagra.c 2012-07-22 17:39:17.000000000 +0000 @@ -708,7 +708,7 @@ bool cSmartCardNagra::Update(int pid, int caid, const unsigned char *data) { - if(MatchEMM(data)) { + if(MatchEMM(data, pid)) { if(DoBlkCmd(data[8],data[9]+2,0x84,0x02,data+8+2) && Status()) { cCondWait::SleepMs(300); PostProcess(); diff -Nru sc-hg-20120721/systems/sc-seca/sc-seca.c sc-hg-20120721-emm-viaccess/systems/sc-seca/sc-seca.c --- sc-hg-20120721/systems/sc-seca/sc-seca.c 2012-07-22 17:25:10.000000000 +0000 +++ sc-hg-20120721-emm-viaccess/systems/sc-seca/sc-seca.c 2012-07-22 17:39:17.000000000 +0000 @@ -322,7 +322,7 @@ if(data[0]==0x83) return false; // don't know how to handle if(blocker==0 || (data[0]==0x82 && blocker==2) || (data[0]==0x84 && blocker==1)) { cProviderScSeca *p=(cProviderScSeca *)FindProv(data); - if(p && MatchEMM(data)) { + if(p && MatchEMM(data, pid)) { PRINTF(L_SC_PROC,"got %s update",data[0]==0x82?"UNIQUE":"SHARED"); const unsigned char *payload; ins40[2]=p->index | (cParseSeca::SysMode(data) & 0xF0); diff -Nru sc-hg-20120721/systems/sc-viaccess/sc-viaccess.c sc-hg-20120721-emm-viaccess/systems/sc-viaccess/sc-viaccess.c --- sc-hg-20120721/systems/sc-viaccess/sc-viaccess.c 2012-07-22 17:25:10.000000000 +0000 +++ sc-hg-20120721-emm-viaccess/systems/sc-viaccess/sc-viaccess.c 2012-07-22 17:39:17.000000000 +0000 @@ -471,7 +471,7 @@ int updtype; cAssembleData ad(data); - if(MatchAndAssemble(&ad,&updtype,0)) { + if(MatchAndAssemble(&ad,&updtype,0,pid)) { while((data=ad.Assembled())) { const unsigned char *start=cParseViaccess::NanoStart(data); int nanolen=SCT_LEN(data)-(start-data); diff -Nru sc-hg-20120721/systems/sc-videoguard2/sc-videoguard2.c sc-hg-20120721-emm-viaccess/systems/sc-videoguard2/sc-videoguard2.c --- sc-hg-20120721/systems/sc-videoguard2/sc-videoguard2.c 2012-07-22 17:25:10.000000000 +0000 +++ sc-hg-20120721-emm-viaccess/systems/sc-videoguard2/sc-videoguard2.c 2012-07-22 17:39:17.000000000 +0000 @@ -673,7 +673,7 @@ bool cSmartCardVideoGuard2::Update(int pid, int caid, const unsigned char *data) { static unsigned char ins42[5] = { 0xD1,0x42,0x00,0x00,0xFF }; - if(MatchEMM(data)) { + if(MatchEMM(data, pid)) { const unsigned char *payloaddata=cParseNDS::PayloadStart(data,cardID); //points to 02 xx yy int lenEMM; switch(payloaddata[0]) { diff -Nru sc-hg-20120721/systems/seca/seca.c sc-hg-20120721-emm-viaccess/systems/seca/seca.c --- sc-hg-20120721/systems/seca/seca.c 2012-07-22 17:25:10.000000000 +0000 +++ sc-hg-20120721-emm-viaccess/systems/seca/seca.c 2012-07-22 17:39:17.000000000 +0000 @@ -1602,7 +1602,7 @@ unsigned char *buff=AUTOMEM(msgLen); for(cSecaCardInfo *ci=Scards.First(); ci; ci=Scards.Next(ci)) { - if(ci->MatchEMM(buffer) || (CheckNull(ci->sa,sizeof(ci->sa)) && ci->MatchID(buffer))) { + if(ci->MatchEMM(buffer, pid) || (CheckNull(ci->sa,sizeof(ci->sa)) && ci->MatchID(buffer))) { unsigned char MK[16]; if(cParseSeca::SysMode(buffer)&0x10) { if(ci->KeySize()!=16) continue; // don't bother diff -Nru sc-hg-20120721/systems/viaccess/viaccess.c sc-hg-20120721-emm-viaccess/systems/viaccess/viaccess.c --- sc-hg-20120721/systems/viaccess/viaccess.c 2012-07-22 17:25:10.000000000 +0000 +++ sc-hg-20120721-emm-viaccess/systems/viaccess/viaccess.c 2012-07-22 17:39:17.000000000 +0000 @@ -788,8 +788,8 @@ HashClear(); memcpy(hbuff+3,mkey->ua,sizeof(mkey->ua)); } - else if(mkey->cProviderViaccess::MatchEMM(data)) { - if(mkey->cProviderViaccess::Assemble(&ad)<0) continue; + else if(mkey->cProviderViaccess::MatchEMM(data, pid)) { + if(mkey->cProviderViaccess::Assemble(&ad, pid)<0) continue; updtype=2; HashClear(); memcpy(hbuff+5,mkey->sa,sizeof(mkey->sa)-1);