int shared_toggle;
int shared_len;
uint8_t * shared_emm;
+ void *ca_update_id;
} cwc_viaccess_emm;
#define cwc_cryptoworks_emm cwc_viaccess_emm
void cwc_emm_irdeto(cwc_t *cwc, uint8_t *data, int len);
void cwc_emm_dre(cwc_t *cwc, uint8_t *data, int len);
void cwc_emm_seca(cwc_t *cwc, uint8_t *data, int len);
-void cwc_emm_viaccess(cwc_t *cwc, uint8_t *data, int len);
+void cwc_emm_viaccess(cwc_t *cwc, uint8_t *data, int len, void *ca_update_id);
void cwc_emm_nagra(cwc_t *cwc, uint8_t *data, int len);
void cwc_emm_nds(cwc_t *cwc, uint8_t *data, int len);
-void cwc_emm_cryptoworks(cwc_t *cwc, uint8_t *data, int len);
+void cwc_emm_cryptoworks(cwc_t *cwc, uint8_t *data, int len, void *ca_update_id);
/**
*
*/
void
-cwc_emm(uint8_t *data, int len, uint16_t caid)
+cwc_emm(uint8_t *data, int len, uint16_t caid, void *ca_update_id)
{
cwc_t *cwc;
cwc_emm_seca(cwc, data, len);
break;
case CARD_VIACCESS:
- cwc_emm_viaccess(cwc, data, len);
+ cwc_emm_viaccess(cwc, data, len, ca_update_id);
break;
case CARD_DRE:
cwc_emm_dre(cwc, data, len);
cwc_emm_nds(cwc, data, len);
break;
case CARD_CRYPTOWORKS:
- cwc_emm_cryptoworks(cwc, data, len);
+ cwc_emm_cryptoworks(cwc, data, len, ca_update_id);
break;
case CARD_UNKNOWN:
break;
void
-cwc_emm_viaccess(cwc_t *cwc, uint8_t *data, int mlen)
+cwc_emm_viaccess(cwc_t *cwc, uint8_t *data, int mlen, void *ca_update_id)
{
/* Get SCT len */
int len = 3 + ((data[1] & 0x0f) << 8) + data[2];
if (cwc->cwc_viaccess_emm.shared_emm) {
cwc->cwc_viaccess_emm.shared_len = len;
memcpy(cwc->cwc_viaccess_emm.shared_emm, data, len);
+ cwc->cwc_viaccess_emm.ca_update_id = ca_update_id;
}
cwc->cwc_viaccess_emm.shared_toggle = data[0];
}
}
break;
case 0x8e:
- if (cwc->cwc_viaccess_emm.shared_emm) {
+ if (cwc->cwc_viaccess_emm.shared_emm &&
+ cwc->cwc_viaccess_emm.ca_update_id == ca_update_id) {
int match = 0;
int i;
/* Match SA and provider in shared */
}
void
-cwc_emm_cryptoworks(cwc_t *cwc, uint8_t *data, int len)
+cwc_emm_cryptoworks(cwc_t *cwc, uint8_t *data, int len, void *ca_update_id)
{
int match = 0;
if (cwc->cwc_cryptoworks_emm.shared_emm) {
cwc->cwc_cryptoworks_emm.shared_len = len;
memcpy(cwc->cwc_cryptoworks_emm.shared_emm, data, len);
+ cwc->cwc_cryptoworks_emm.ca_update_id = ca_update_id;
}
}
break;
case 0x86: /* emm-sb */
- if (cwc->cwc_cryptoworks_emm.shared_emm) {
+ if (cwc->cwc_cryptoworks_emm.shared_emm &&
+ cwc->cwc_cryptoworks_emm.ca_update_id == ca_update_id) {
/* python: EMM_SH[0:12] + EMM_SB[5:-1] + EMM_SH[12:-1] */
uint32_t elen = len - 5 + cwc->cwc_cryptoworks_emm.shared_len - 12;
uint8_t *tmp = malloc(elen);
#define TDT_CRC 0x1
#define TDT_QUICKREQ 0x2
-#define TDT_INC_TABLE_HDR 0x4
+#define TDT_CA 0x4
static void dvb_table_add_pmt(th_dvb_mux_instance_t *tdmi, int pmt_pid);
ptr = &sec[3];
if(chkcrc) len -= 4; /* Strip trailing CRC */
- if(tdt->tdt_flags & TDT_INC_TABLE_HDR)
- ret = tdt->tdt_callback(tdmi, sec, len + 3, tableid, tdt->tdt_opaque);
+ if(tdt->tdt_flags & TDT_CA)
+ ret = tdt->tdt_callback((th_dvb_mux_instance_t *)tdt,
+ sec, len + 3, tableid, tdt->tdt_opaque);
else
ret = tdt->tdt_callback(tdmi, ptr, len, tableid, tdt->tdt_opaque);
dvb_ca_callback(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len,
uint8_t tableid, void *opaque)
{
- cwc_emm(ptr, len, (uintptr_t)opaque);
+ cwc_emm(ptr, len, (uintptr_t)opaque, (void *)tdmi);
return 0;
}
break;
tdt_add(tdmi, NULL, dvb_ca_callback, (void *)caid, "CA",
- TDT_INC_TABLE_HDR, pid, NULL);
+ TDT_CA, pid, NULL);
break;
default: