From ea4566404305f992cb2552628df387805c11fc2d Mon Sep 17 00:00:00 2001 From: leslie Date: Wed, 25 Feb 2009 17:42:57 +0800 Subject: [PATCH] smartcard: restructure card data loader --- sc.c | 3 +- smartcard.c | 58 ++++++++++++++----------- smartcard.h | 23 +++++++--- systems/sc-cryptoworks/sc-cryptoworks.c | 6 +-- systems/sc-irdeto/sc-irdeto.c | 4 +- systems/sc-nagra/sc-nagra.c | 4 +- systems/sc-videoguard2/sc-videoguard2.c | 4 +- 7 files changed, 59 insertions(+), 43 deletions(-) diff --git a/sc.c b/sc.c index 4b3d989..0a5f037 100644 --- a/sc.c +++ b/sc.c @@ -1008,7 +1008,7 @@ bool cScSetup::Ignore(unsigned short caid) bool cSoftCAM::Load(const char *cfgdir) { if(!Feature.KeyFile()) keys.Disable(); - if(!Feature.SmartCard()) smartcards.Disable(); + if(!Feature.SmartCard()) carddatas.Disable(); cStructLoaders::Load(false); if(Feature.KeyFile() && keys.Count()<1) PRINTF(L_GEN_ERROR,"no keys loaded for softcam!"); @@ -1022,6 +1022,7 @@ void cSoftCAM::Shutdown(void) cStructLoaders::Save(true); cSystems::Clean(); smartcards.Shutdown(); + carddatas.SafeClear(); keys.SafeClear(); } diff --git a/smartcard.c b/smartcard.c index 0f642bd..fa7f73d 100644 --- a/smartcard.c +++ b/smartcard.c @@ -1093,6 +1093,38 @@ cSmartCardData::cSmartCardData(int Ident) ident=Ident; } +// -- cSmartCardDatas ---------------------------------------------------------- + +cSmartCardDatas carddatas; + +cSmartCardDatas::cSmartCardDatas(void) +:cStructList("smartcard data",DATAFILE,SL_MISSINGOK|SL_WATCH|SL_VERBOSE) +{} + +cSmartCardData *cSmartCardDatas::Find(cSmartCardData *param) +{ + ListLock(false); + cSmartCardData *cd; + for(cd=First(); cd; cd=Next(cd)) + if(cd->Ident()==param->Ident() && cd->Matches(param)) break; + ListUnlock(); + return cd; +} + +cStructItem *cSmartCardDatas::ParseLine(char *line) +{ + char *r=index(line,':'); + if(r) + for(cSmartCardLink *scl=cSmartCards::first; scl; scl=scl->next) + if(!strncasecmp(scl->name,line,r-line)) { + cSmartCardData *scd=scl->CreateData(); + if(scd && scd->Parse(r+1)) return scd; + delete scd; + break; + } + return 0; +} + // -- cSmartCardLink ----------------------------------------------------------- cSmartCardLink::cSmartCardLink(const char *Name, int Id) @@ -1111,7 +1143,6 @@ static const char *serModes[] = { 0,"8e2","8o2","8n2" }; cSmartCards::cSmartCards(void) :cThread("SmartcardWatcher") -,cStructList("smartcard data",DATAFILE,SL_MISSINGOK|SL_WATCH|SL_VERBOSE) { for(int i=0 ; inext) - if(!strncasecmp(scl->name,line,r-line)) { - cSmartCardData *scd=scl->CreateData(); - if(scd && scd->Parse(r+1)) return scd; - delete scd; - break; - } - return 0; -} - -cSmartCardData *cSmartCards::FindCardData(cSmartCardData *param) -{ - ListLock(false); - cSmartCardData *cd; - for(cd=First(); cd; cd=Next(cd)) - if(cd->ident==param->ident && cd->Matches(param)) break; - ListUnlock(); - return cd; -} - bool cSmartCards::HaveCard(int id) { cMutexLock lock(&mutex); diff --git a/smartcard.h b/smartcard.h index 838ab07..e7a9ed0 100644 --- a/smartcard.h +++ b/smartcard.h @@ -140,7 +140,6 @@ public: // ---------------------------------------------------------------- class cSmartCardData : public cStructItem { -friend class cSmartCards; protected: int ident; public: @@ -148,13 +147,25 @@ public: virtual ~cSmartCardData() {} virtual bool Parse(const char *line)=0; virtual bool Matches(cSmartCardData *cmp)=0; + int Ident(void) const { return ident; } }; // ---------------------------------------------------------------- +class cSmartCardDatas : public cStructList { +protected: + virtual cStructItem *ParseLine(char *line); +public: + cSmartCardDatas(void); + cSmartCardData *Find(cSmartCardData *param); + }; + +extern cSmartCardDatas carddatas; + +// ---------------------------------------------------------------- + class cSmartCardLink { -friend class cSmartCards; -private: +public: cSmartCardLink *next; const char *name; int id; @@ -163,7 +174,6 @@ public: virtual ~cSmartCardLink() {} virtual cSmartCard *Create(void)=0; virtual cSmartCardData *CreateData(void) { return 0; } - int ID(void) { return id; } }; // ---------------------------------------------------------------- @@ -178,8 +188,9 @@ struct Port { struct Atr Atr; }; -class cSmartCards : private cThread, public cStructList { +class cSmartCards : private cThread { friend class cSmartCardLink; +friend class cSmartCardDatas; private: static cSmartCardLink *first; cMutex mutex; @@ -195,7 +206,6 @@ private: void SetPort(struct Port *port, cSmartCard *sc, int id, bool dead); protected: virtual void Action(void); - virtual cStructItem *ParseLine(char *line); public: cSmartCards(void); void Shutdown(void); @@ -203,7 +213,6 @@ public: bool HaveCard(int id); cSmartCard *LockCard(int id); void ReleaseCard(cSmartCard *sc); - cSmartCardData *FindCardData(cSmartCardData *param); // to be called ONLY from frontend thread! bool AddPort(const char *devName, bool invCD, bool invRST, int clock); void LaunchWatcher(void); diff --git a/systems/sc-cryptoworks/sc-cryptoworks.c b/systems/sc-cryptoworks/sc-cryptoworks.c index 9f16889..af38f16 100644 --- a/systems/sc-cryptoworks/sc-cryptoworks.c +++ b/systems/sc-cryptoworks/sc-cryptoworks.c @@ -304,7 +304,7 @@ bool cSmartCardCryptoworks::Init(void) if(ReadRecord(buff,0x9E)>=66) { HEXDUMP(L_SC_EXTRA,&buff[2],64,"card ISK"); cSmartCardDataCryptoworks cd(dtIPK,Caid); - cSmartCardDataCryptoworks *entry=(cSmartCardDataCryptoworks *)smartcards.FindCardData(&cd); + cSmartCardDataCryptoworks *entry=(cSmartCardDataCryptoworks *)carddatas.Find(&cd); if(entry) { PRINTF(L_SC_EXTRA,"got IPK from smartcard.conf"); if(rsa.RSA(&buff[2],&buff[2],64,exp,entry->key,false)>0) { @@ -322,7 +322,7 @@ bool cSmartCardCryptoworks::Init(void) } if(!ucpkValid) { cSmartCardDataCryptoworks cd(dtUCPK,serial); - cSmartCardDataCryptoworks *entry=(cSmartCardDataCryptoworks *)smartcards.FindCardData(&cd); + cSmartCardDataCryptoworks *entry=(cSmartCardDataCryptoworks *)carddatas.Find(&cd); if(entry) { BN_copy(ucpk,entry->key); ucpkValid=true; @@ -418,7 +418,7 @@ bool cSmartCardCryptoworks::Init(void) } if(!pinOK) { cSmartCardDataCryptoworks cd(dtPIN,serial); - cSmartCardDataCryptoworks *entry=(cSmartCardDataCryptoworks *)smartcards.FindCardData(&cd); + cSmartCardDataCryptoworks *entry=(cSmartCardDataCryptoworks *)carddatas.Find(&cd); if(entry) { memcpy(&buff[2],entry->pin,4); pinOK=true; diff --git a/systems/sc-irdeto/sc-irdeto.c b/systems/sc-irdeto/sc-irdeto.c index 2a316f5..628b90d 100644 --- a/systems/sc-irdeto/sc-irdeto.c +++ b/systems/sc-irdeto/sc-irdeto.c @@ -462,10 +462,10 @@ bool cSmartCardIrdeto::Init(void) cSmartCardDataIrdeto *entry=0; if(!doPlain) { cSmartCardDataIrdeto cd(ACS,caId); - if(!(entry=(cSmartCardDataIrdeto *)smartcards.FindCardData(&cd))) { + if(!(entry=(cSmartCardDataIrdeto *)carddatas.Find(&cd))) { PRINTF(L_GEN_WARN,"didn't find Irdeto card specific certificate, falling back to default"); cSmartCardDataIrdeto cd(-1,-1); - if(!(entry=(cSmartCardDataIrdeto *)smartcards.FindCardData(&cd))) { + if(!(entry=(cSmartCardDataIrdeto *)carddatas.Find(&cd))) { PRINTF(L_GEN_WARN,"didn't find default Irdeto certificate, please add one"); if(ACS!=0x0384) return false; PRINTF(L_GEN_WARN,"trying pre-coded ACS 384 challenge. This mode is DEPRECATED. There ARE valid certificates for these cards available!"); diff --git a/systems/sc-nagra/sc-nagra.c b/systems/sc-nagra/sc-nagra.c index e0feeac..ec16d09 100644 --- a/systems/sc-nagra/sc-nagra.c +++ b/systems/sc-nagra/sc-nagra.c @@ -385,7 +385,7 @@ bool cSmartCardNagra::Init(void) bool sessOk=false; if(buff[5]!=0 && irdProvId==((buff[10]*256)|buff[11])) { // prepare DT08 data cSmartCardDataNagra cd(irdProvId,true); - if(!(entry=(cSmartCardDataNagra *)smartcards.FindCardData(&cd))) { + if(!(entry=(cSmartCardDataNagra *)carddatas.Find(&cd))) { PRINTF(L_GEN_WARN,"didn't find smartcard Nagra IRD modulus"); } else { @@ -395,7 +395,7 @@ bool cSmartCardNagra::Init(void) } else { cSmartCardDataNagra cd(irdProvId); - if(!(entry=(cSmartCardDataNagra *)smartcards.FindCardData(&cd))) { + if(!(entry=(cSmartCardDataNagra *)carddatas.Find(&cd))) { PRINTF(L_GEN_WARN,"didn't find smartcard Nagra CAM modulus"); } else { diff --git a/systems/sc-videoguard2/sc-videoguard2.c b/systems/sc-videoguard2/sc-videoguard2.c index 3080e88..c0bbd29 100644 --- a/systems/sc-videoguard2/sc-videoguard2.c +++ b/systems/sc-videoguard2/sc-videoguard2.c @@ -566,7 +566,7 @@ bool cSmartCardVideoGuard2::Init(void) } if(!boxidOK) { cSmartCardDataVideoGuard2 cd(dtBoxId); - cSmartCardDataVideoGuard2 *entry=(cSmartCardDataVideoGuard2 *)smartcards.FindCardData(&cd); + cSmartCardDataVideoGuard2 *entry=(cSmartCardDataVideoGuard2 *)carddatas.Find(&cd); if(entry) { memcpy(&boxID,entry->boxid,sizeof(boxID)); boxidOK=true; @@ -603,7 +603,7 @@ bool cSmartCardVideoGuard2::Init(void) PRINTF(L_SC_INIT,"cardtype: %c%c.%d boxID %s caid %04x cardID %s",atr->hist[10],atr->hist[11],atr->hist[12],HexStr(str,boxID,4),CAID,HexStr(str2,cardID,4)); cSmartCardDataVideoGuard2 cd(dtSeed); - cSmartCardDataVideoGuard2 *entry=(cSmartCardDataVideoGuard2 *)smartcards.FindCardData(&cd); + cSmartCardDataVideoGuard2 *entry=(cSmartCardDataVideoGuard2 *)carddatas.Find(&cd); if(!entry) { PRINTF(L_SC_ERROR,"no NDS seed available"); return false; -- 2.39.5