bool cCardClientRadegast::Login(void) { Logout(); if(!so.Connect(hostname,port)) return false; PRINTF(L_CC_LOGIN,"%s: connected to %s:%d",name,hostname,port); InitVars(); unsigned char buff[512]; char hello[32]; snprintf(hello,sizeof(hello),"rdgd/vdr-sc-%s",ScVersion); StartMsg(buff,0x90); // RDGD_MSG_CLIENT_HELLO AddNano(buff,1,strlen(hello),(unsigned char *)hello); // RDGD_NANO_DESCR if(!Send(buff) || Recv(buff,sizeof(buff))<0) return false; if(buff[0]==0x91) { PRINTF(L_CC_RDGD,"got server hello, assuming V4 mode"); StartMsg(buff,0x94); // RDGD_MSG_CLIENT_CAP_REQ; int n; if(!Send(buff) || (n=Recv(buff,sizeof(buff)))<0) return false; if(buff[0]==0x95) { LBSTARTF(L_CC_LOGIN); LBPUT("radegast: got caps"); int caid; for(int l=GetNanoStart(buff); l<n; l+=buff[l+1]+2) { switch(buff[l]) { case 0xE2: LBPUT(" VERS %s",(char *)&buff[l+2]); break; case 0xE4: // CAP_NANO_CAID if(numCaids>=MAXCAIDS) { l=n; break; } //stop processing caid=(buff[l+2]<<8)+buff[l+3]; LBPUT(" CAID %04X",caid); caids[numCaids++]=caid; // XXX we should have EMM processing setup here, but as we don't // XXX get any ua/sa we cannot filter EMM anyways break; case 0xE5: // CAP_NANO_PROVID for(int i=0; i<buff[l+1]; i+=3) LBPUT("/%02X%02X%02X",buff[l+2+i],buff[l+2+i+1],buff[l+2+i+2]); break; } } LBEND(); } } else PRINTF(L_CC_RDGD,"no server hello, assuming old mode"); if(emmProcessing && !emmAllowed) PRINTF(L_CC_EMM,"%s: EMM disabled from config",name); CaidsChanged(); return true; }
bool cSmartCardVideoGuard2::Init(void) { static const unsigned char vg2Hist[] = { 'i',0xff,'J','P' }; if(atr->histLen<4 || memcmp(&atr->hist[3],vg2Hist,4)) { PRINTF(L_SC_INIT,"doesn't look like a VideoGuard2 card"); return false; } infoStr.Begin(); infoStr.Strcat("VideoGuard2 smartcard\n"); snprintf(idStr,sizeof(idStr),"%s (%c%c.%d)",SC_NAME,atr->hist[10],atr->hist[11],atr->hist[12]); ResetIdSet(); delete cmdList; cmdList=0; static unsigned char ins7401[] = { 0xD0,0x74,0x01,0x00,0x00 }; int l; if((l=ReadCmdLen(ins7401))<0) { PRINTF(L_SC_ERROR,"bogus answer. Now try delayed mode"); NewCardConfig(&cardCfgDelay); if((l=ReadCmdLen(ins7401))<0) return false; } ins7401[4]=l; unsigned char buff[256]; if(!IsoRead(ins7401,buff) || !Status()) { PRINTF(L_SC_ERROR,"failed to read cmd list"); return false; } cmdList=new CmdTable(buff,l); static const unsigned char ins7416[5] = { 0xD0,0x74,0x16,0x00,0x00 }; if(DoCmd(ins7416)<0 || !Status()) { PRINTF(L_SC_ERROR,"cmd 7416 failed"); return false; } static const unsigned char ins36[5] = { 0xD0,0x36,0x00,0x00,0x00 }; bool boxidOK=false; if((l=DoCmd(ins36,0,buff))>0 && Status()) for(int i=0; i<l ;i++) { if(buff[i]==0x00 && buff[i+1]==0xF3) { memcpy(&boxID,&buff[i+2],sizeof(boxID)); boxidOK=true; break; } } if(!boxidOK) { cSmartCardDataVideoGuard2 cd(dtBoxId); cSmartCardDataVideoGuard2 *entry=(cSmartCardDataVideoGuard2 *)smartcards.FindCardData(&cd); if(entry) { memcpy(&boxID,entry->boxid,sizeof(boxID)); boxidOK=true; } } if(!boxidOK) { PRINTF(L_SC_ERROR,"no boxID available"); return false; } static const unsigned char ins4C[5] = { 0xD0,0x4C,0x00,0x00,0x00 }; static unsigned char payload4C[9] = { 0,0,0,0, 3,0,0,2,4 }; memcpy(payload4C,boxID,4); if(DoCmd(ins4C,payload4C)<0 || !Status()) { PRINTF(L_SC_ERROR,"sending boxid failed"); return false; } static const unsigned char ins58[5] = { 0xD0,0x58,0x00,0x00,0x00 }; if(DoCmd(ins58,0,buff)<0 || !Status()) { PRINTF(L_SC_ERROR,"failed to read card details"); return false; } unsigned int c=WORD(buff,0x1D,0xFFFF); if(c!=CAID) CaidsChanged(); CAID=c; memcpy(&cardID,&buff[8],4); memcpy(&groupID,&buff[8],4); groupID[3]=0; SetCard(new cCardNDS(cardID)); AddProv(new cProviderNDS(groupID)); char str[20], str2[20]; infoStr.Printf("Cardtype: %c%c.%d\n" "BoxID %s Caid %04x CardID %s\n", atr->hist[10],atr->hist[11],atr->hist[12],HexStr(str,boxID,4),CAID,HexStr(str2,cardID,4)); 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); if(!entry) { PRINTF(L_SC_ERROR,"no NDS seed available"); return false; } state.SetSeed(entry->seed0,entry->seed1); unsigned char tbuff[64]; state.GetCamKey(tbuff); static const unsigned char insB4[5] = { 0xD0,0xB4,0x00,0x00,0x00 }; if(DoCmd(insB4,tbuff)<0 || !Status()) { PRINTF(L_SC_ERROR,"cmd D0B4 failed"); return false; } static const unsigned char insBC[5] = { 0xD0,0xBC,0x00,0x00,0x00 }; if(DoCmd(insBC)<0 || !Status()) { PRINTF(L_SC_ERROR,"cmd D0BC failed"); return false; } static const unsigned char insBE[5] = { 0xD3,0xBE,0x00,0x00,0x00 }; if(DoCmd(insBE)<0 || !Status()) { PRINTF(L_SC_ERROR,"cmd D3BE failed"); return false; } static const unsigned char ins58a[5] = { 0xD1,0x58,0x00,0x00,0x00 }; if(DoCmd(ins58a)<0 || !Status()) { PRINTF(L_SC_ERROR,"cmd D158 failed"); return false; } static const unsigned char ins4Ca[5] = { 0xD1,0x4C,0x00,0x00,0x00 }; if(DoCmd(ins4Ca,payload4C)<0 || !Status()) { PRINTF(L_SC_ERROR,"cmd D14C failed"); return false; } ReadTiers(); return true; }