From 90e35703b9f6fb81df16f8cd59fd5cb258931946 Mon Sep 17 00:00:00 2001 From: Lars Op den Kamp Date: Mon, 18 Apr 2011 00:57:52 +0800 Subject: [PATCH] implement emm updates for nagra and nds. credits: neoen --- src/cwc.c | 67 ++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 66 insertions(+), 1 deletion(-) diff --git a/src/cwc.c b/src/cwc.c index c42ec3f0..408b0d5f 100644 --- a/src/cwc.c +++ b/src/cwc.c @@ -59,6 +59,8 @@ typedef enum { CARD_CONAX, CARD_SECA, CARD_VIACCESS, + CARD_NAGRA, + CARD_NDS, CARD_UNKNOWN } card_type_t; @@ -276,6 +278,8 @@ 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_nagra(cwc_t *cwc, uint8_t *data, int len); +void cwc_emm_nds(cwc_t *cwc, uint8_t *data, int len); /** @@ -567,7 +571,7 @@ cwc_decode_card_data_reply(cwc_t *cwc, uint8_t *msg, int len) cwc->cwc_connected = 1; cwc_comet_status_update(cwc); cwc->cwc_caid = (msg[4] << 8) | msg[5]; - n = psi_caid2name(cwc->cwc_caid) ?: "Unknown"; + n = psi_caid2name(cwc->cwc_caid & 0xff00) ?: "Unknown"; memcpy(cwc->cwc_ua, &msg[6], 8); @@ -675,6 +679,16 @@ cwc_detect_card_type(cwc_t *cwc) tvhlog(LOG_INFO, "cwc", "%s: dre card", cwc->cwc_hostname); break; + case 0x18: + cwc->cwc_card_type = CARD_NAGRA; + tvhlog(LOG_INFO, "cwc", "%s: nagra card", + cwc->cwc_hostname); + break; + case 0x09: + cwc->cwc_card_type = CARD_NDS; + tvhlog(LOG_INFO, "cwc", "%s: nds card", + cwc->cwc_hostname); + break; default: cwc->cwc_card_type = CARD_UNKNOWN; break; @@ -1183,6 +1197,12 @@ cwc_emm(uint8_t *data, int len) case CARD_DRE: cwc_emm_dre(cwc, data, len); break; + case CARD_NAGRA: + cwc_emm_nagra(cwc, data, len); + break; + case CARD_NDS: + cwc_emm_nds(cwc, data, len); + break; case CARD_UNKNOWN: break; } @@ -1581,6 +1601,51 @@ cwc_emm_dre(cwc_t *cwc, uint8_t *data, int len) cwc_send_msg(cwc, data, len, 0, 1); } +void +cwc_emm_nagra(cwc_t *cwc, uint8_t *data, int len) +{ + int match = 0; + unsigned char hexserial[4]; + + if (data[0] == 0x83) { // unique|shared + hexserial[0] = data[5]; + hexserial[1] = data[4]; + hexserial[2] = data[3]; + hexserial[3] = data[6]; + if (memcmp(hexserial, &cwc->cwc_ua[4], (data[7] == 0x10) ? 3 : 4) == 0) + match = 1; + } + else if (data[0] == 0x82) { // global + match = 1; + } + + if (match) + cwc_send_msg(cwc, data, len, 0, 1); +} + +void +cwc_emm_nds(cwc_t *cwc, uint8_t *data, int len) +{ + int match = 0; + int i; + int serial_count = ((data[3] >> 4) & 3) + 1; + unsigned char emmtype = (data[3] & 0xC0) >> 6; + + if (emmtype == 1 || emmtype == 2) { // unique|shared + for (i = 0; i < serial_count; i++) { + if (memcmp(&data[i * 4 + 4], &cwc->cwc_ua[4], 5 - emmtype) == 0) { + match = 1; + break; + } + } + } + else if (emmtype == 0) { // global + match = 1; + } + + if (match) + cwc_send_msg(cwc, data, len, 0, 1); +} /** *