SASC
DVBSoftCAM

cSmartCardNagra Class Reference

Inheritance diagram for cSmartCardNagra:

List of all members.

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)

Detailed Description

Definition at line 373 of file sc-nagra.c.


Constructor & Destructor Documentation

cSmartCardNagra::cSmartCardNagra ( void  )

Definition at line 407 of file sc-nagra.c.

cSmartCardNagra::cSmartCardNagra ( void  )

Member Function Documentation

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().

{
  if(MatchEMM(data)) {
    if(DoBlkCmd(data[8],data[9]+2,0x84,0x02,data+8+2) && Status()) {
      cCondWait::SleepMs(300);
      PostProcess();
      }
    return true;
    }
  return false;
}
virtual bool cSmartCardNagra::Update ( int  pid,
int  caid,
const unsigned char *  data 
) [virtual]

Reimplemented from cSmartCard.


The documentation for this class was generated from the following files:
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines