|
SASC
DVBSoftCAM
|
Inheritance diagram for cSmartCardNagra:Public Member Functions | |
| cSmartCardNagra (void) | |
| virtual bool | Init (void) |
| virtual bool | Decode (const cEcmInfo *ecm, const unsigned char *data, unsigned char *cw) |
| virtual bool | Update (int pid, int caid, const unsigned char *data) |
| virtual bool | CanHandle (unsigned short CaId) |
| cSmartCardNagra (void) | |
| virtual bool | Init (void) |
| virtual bool | Decode (const cEcmInfo *ecm, const unsigned char *data, unsigned char *cw) |
| virtual bool | Update (int pid, int caid, const unsigned char *data) |
| virtual bool | CanHandle (unsigned short CaId) |
Definition at line 373 of file sc-nagra.c.
| cSmartCardNagra::cSmartCardNagra | ( | void | ) |
Definition at line 407 of file sc-nagra.c.
:cSmartCard(&cardCfg,msgs) {}
| cSmartCardNagra::cSmartCardNagra | ( | void | ) |
| bool cSmartCardNagra::CanHandle | ( | unsigned short | CaId | ) | [virtual] |
Reimplemented from cSmartCard.
Definition at line 440 of file sc-nagra.c.
References caid.
{
return CaId==caid;
}
| virtual bool cSmartCardNagra::CanHandle | ( | unsigned short | CaId | ) | [virtual] |
Reimplemented from cSmartCard.
| bool cSmartCardNagra::Decode | ( | const cEcmInfo * | ecm, |
| const unsigned char * | data, | ||
| unsigned char * | cw | ||
| ) | [virtual] |
Implements cSmartCard.
Definition at line 665 of file sc-nagra.c.
References cCamCryptNagra::DecryptCW(), HAS_CW, i, L_SC_ERROR, PRINTF, cCondWait::SleepMs(), and cSmartCard::Status().
{
if(!isTiger) {
unsigned char pkt[256+16];
memset(pkt,0,sizeof(pkt));
memcpy(pkt,data+3+2,data[4]);
for(int i=1; i>=0; i--) {
if(((!isN3 && DoBlkCmd(data[3],data[4]+2,0x87,0x02,pkt)) ||
( isN3 && DoBlkCmd(data[3]+1,data[4]+5+2,0x88,0x04,pkt))) &&
Status())
break;
PRINTF(L_SC_ERROR,"ECM cmd failed%s",(i>0)?", retrying":"");
if(i==0) return false;
}
cCondWait::SleepMs(10);
for(int retry=0; !GetCardStatus() && retry<5; retry++) cCondWait::SleepMs(5);
cCondWait::SleepMs(10);
if(HAS_CW() && DoBlkCmd(0x1C,0x02,0x9C,0x36) && Status()) {
DecryptCW(cw,buff+33,buff+7);
PostProcess();
if(swapCW) {
unsigned char tt[8];
memcpy(&tt[0],&cw[0],8);
memcpy(&cw[0],&cw[8],8);
memcpy(&cw[8],&tt[0],8);
}
return true;
}
}
else {
// ecm_data: 80 30 89 D3 87 54 11 10 DA A6 0F 4B 92 05 34 00 ...
//serial_data: A0 CA 00 00 8C D3 8A 00 00 00 00 00 10 DA A6 0F .
unsigned char ecm_trim[150];
memset(ecm_trim,0,150);
memcpy(&ecm_trim[5],data+3+2+2,data[4]+2);
if(DoBlkCmd(data[3],data[4]+5,0x53,0x16,ecm_trim) && Status()) {
DecryptCW(cw,buff+17,buff+9);
PostProcess();
return true;
}
}
return false;
}
| virtual bool cSmartCardNagra::Decode | ( | const cEcmInfo * | ecm, |
| const unsigned char * | data, | ||
| unsigned char * | cw | ||
| ) | [virtual] |
Implements cSmartCard.
| virtual bool cSmartCardNagra::Init | ( | void | ) | [virtual] |
Implements cSmartCard.
| bool cSmartCardNagra::Init | ( | void | ) | [virtual] |
Implements cSmartCard.
Definition at line 445 of file sc-nagra.c.
References allowT14, cSmartCard::atr, cInfoStr::Begin(), cSmartCardDataNagra::bk, block, caid, CAMDATA, DT01, DT04, DT06, cSmartCardDataNagra::exp, cSmartCards::FindCardData(), cInfoStr::Finish(), cCamCryptNagra::HasCamMod(), Atr::hist, cSmartCard::infoStr, IRDINFO, L_SC_ERROR, L_SC_INIT, cSmartCardDataNagra::mod, cLineBuff::Printf(), PRINTF, cIdSet::ResetIdSet(), cCamCryptNagra::SetCamMod(), cIdSet::SetCard(), cCamCryptNagra::SetCardData(), smartcards, cSmartCard::Status(), cLineBuff::Strcat(), SYSTEM_NAGRA, TIERS, and UINT32_BE.
{
block=0; isTiger=isT14Nagra=isN3=swapCW=false;
caid=SYSTEM_NAGRA;
ResetIdSet();
static const unsigned char atrDNASP[] = { 'D','N','A','S','P' };
static const unsigned char atrTIGER[] = { 'T','I','G','E','R' };
static const unsigned char atrNCMED[] = { 'N','C','M','E','D' };
static const unsigned char atrIRDET[] = { 'I','R','D','E','T','O' };
if(!memcmp(atr->hist,atrDNASP,sizeof(atrDNASP))) {
if(atr->hist[5]=='2' && atr->hist[6]=='4') isN3=true;
PRINTF(L_SC_INIT,"detected native T1 nagra card (N%d Mode)",isN3?3:2);
if(!SetIFS(0xFE)) return false;
memcpy(rominfo,atr->hist,sizeof(rominfo));
}
else if(!memcmp(atr->hist,atrTIGER,sizeof(atrTIGER)) || !memcmp(atr->hist,atrNCMED,sizeof(atrNCMED))) {
PRINTF(L_SC_INIT,"detected nagra tiger card");
if(!SetIFS(0xFE)) return false;
memcpy(rominfo,atr->hist,sizeof(rominfo));
cardId=0xFFFFFFFF;
isTiger=true;
}
else if(!memcmp(atr->hist,atrIRDET,sizeof(atrIRDET))) {
PRINTF(L_SC_INIT,"detected tunneled T14 nagra card");
if(!allowT14) {
PRINTF(L_SC_INIT,"Nagra mode for T14 card disabled in setup");
return false;
}
PRINTF(L_SC_INIT,"using nagra mode");
isT14Nagra=true;
if(!DoBlkCmd(0x10,0x02,0x90,0x11)) {
PRINTF(L_SC_ERROR,"get rom version failed");
return false;
}
memcpy(rominfo,&buff[2],15);
}
else {
PRINTF(L_SC_INIT,"doesn't look like a nagra card");
return false;
}
infoStr.Begin();
infoStr.Strcat("Nagra smartcard\n");
char rom[12], rev[12];
snprintf(rom,sizeof(rom),"%c%c%c%c%c%c%c%c",rominfo[0],rominfo[1],rominfo[2],rominfo[3],rominfo[4],rominfo[5],rominfo[6],rominfo[7]);
snprintf(rev,sizeof(rev),"%c%c%c%c%c%c",rominfo[9],rominfo[10],rominfo[11],rominfo[12],rominfo[13],rominfo[14]);
PRINTF(L_SC_INIT,"rom version: %s revision: %s",rom,rev);
infoStr.Printf("Rom %s Rev %s\n",rom,rev);
if(!isTiger) {
GetCardStatus();
if(!DoBlkCmd(0x12,0x02,0x92,0x06) || !Status()) return false;
cardId=UINT32_BE(buff+5);
SetCard(new cCardNagra2(buff+5));
if(!GetDataType(DT01,0x0E)) return false;
GetCardStatus();
if(!GetDataType(IRDINFO,0x39)) return false;
GetCardStatus();
if(!GetDataType(CAMDATA,0x55)) return false;
GetCardStatus();
if(!GetDataType(DT04,0x44)) return false;
GetCardStatus();
if(memcmp(rominfo+5,"181",3)!=0) { // not working on ROM181
infoStr.Printf("Tiers\n");
infoStr.Printf("|id |chid| dates |\n");
infoStr.Printf("+----+----+---------------------+\n");
if(!GetDataType(TIERS,0x57)) return false;
GetCardStatus();
}
if(!GetDataType(DT06,0x16)) return false;
GetCardStatus();
}
if(!HasCamMod()) {
cSmartCardDataNagra cd(cardId,false);
cSmartCardDataNagra *entry=(cSmartCardDataNagra *)smartcards.FindCardData(&cd);
if(entry) {
SetCardData(cardId,entry->bk,entry->exp);
SetCamMod(entry->mod);
}
else {
PRINTF(L_SC_ERROR,"can't find CARD modulus");
return false;
}
}
if(!DoCamExchange()) return false;
infoStr.Finish();
return true;
}
| bool cSmartCardNagra::Update | ( | int | pid, |
| int | caid, | ||
| const unsigned char * | data | ||
| ) | [virtual] |
Reimplemented from cSmartCard.
Definition at line 709 of file sc-nagra.c.
References cIdSet::MatchEMM(), cCondWait::SleepMs(), and cSmartCard::Status().
| virtual bool cSmartCardNagra::Update | ( | int | pid, |
| int | caid, | ||
| const unsigned char * | data | ||
| ) | [virtual] |
Reimplemented from cSmartCard.