diff --git a/packages/addons/service/multimedia/hts-tvheadend/patches/hts-tvheadend-85e23bb-096-bulcrypt_emm_support.patch b/packages/addons/service/multimedia/hts-tvheadend/patches/hts-tvheadend-85e23bb-096-bulcrypt_emm_support.patch new file mode 100644 index 0000000000..230fabaaa2 --- /dev/null +++ b/packages/addons/service/multimedia/hts-tvheadend/patches/hts-tvheadend-85e23bb-096-bulcrypt_emm_support.patch @@ -0,0 +1,93 @@ +diff --git a/src/cwc.c b/src/cwc.c +index 895eaf6..dfb3a6f 100644 +--- a/src/cwc.c ++++ b/src/cwc.c +@@ -61,6 +61,7 @@ typedef enum { + CARD_VIACCESS, + CARD_NAGRA, + CARD_NDS, ++ CARD_BULCRYPT, + CARD_UNKNOWN + } card_type_t; + +@@ -280,6 +281,7 @@ 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); ++void cwc_emm_bulcrypt(cwc_t *cwc, uint8_t *data, int len); + + + /** +@@ -658,6 +660,15 @@ static void + cwc_detect_card_type(cwc_t *cwc) + { + uint8_t c_sys = cwc->cwc_caid >> 8; ++ ++ switch(cwc->cwc_caid) { ++ case 0x5581: ++ case 0x4aee: ++ cwc->cwc_card_type = CARD_BULCRYPT; ++ tvhlog(LOG_INFO, "cwc", "%s:%i: bulcrypt card", ++ cwc->cwc_hostname, cwc->cwc_port); ++ return; ++ } + + switch(c_sys) { + case 0x17: +@@ -1212,6 +1223,9 @@ cwc_emm(uint8_t *data, int len) + case CARD_NDS: + cwc_emm_nds(cwc, data, len); + break; ++ case CARD_BULCRYPT: ++ cwc_emm_bulcrypt(cwc, data, len); ++ break; + case CARD_UNKNOWN: + break; + } +@@ -1656,6 +1670,31 @@ cwc_emm_nds(cwc_t *cwc, uint8_t *data, int len) + cwc_send_msg(cwc, data, len, 0, 1); + } + ++void ++cwc_emm_bulcrypt(cwc_t *cwc, uint8_t *data, int len) ++{ ++ int match = 0; ++ ++ switch (data[0]) { ++ case 0x82: /* unique */ ++ case 0x85: /* unique */ ++ match = len >= 10 && memcmp(data + 3, cwc->cwc_ua + 2, 3) == 0; ++ break; ++ case 0x84: /* shared */ ++ match = len >= 10 && memcmp(data + 3, cwc->cwc_ua + 2, 2) == 0; ++ break; ++ case 0x8b: /* shared-unknown */ ++ match = len >= 10 && memcmp(data + 4, cwc->cwc_ua + 2, 2) == 0; ++ break; ++ case 0x8a: /* global */ ++ match = len >= 10 && memcmp(data + 4, cwc->cwc_ua + 2, 1) == 0; ++ break; ++ } ++ ++ if (match) ++ cwc_send_msg(cwc, data, len, 0, 1); ++} ++ + /** + * + */ +diff --git a/src/psi.c b/src/psi.c +index 116e001..57c34f4 100644 +--- a/src/psi.c ++++ b/src/psi.c +@@ -868,7 +868,9 @@ static struct strtab caidnametab[] = { + { "GI", 0x4700 }, + { "Telemann", 0x4800 }, + { "DRECrypt", 0x4ae0 }, +- { "DRECrypt2", 0x4ae1 } ++ { "DRECrypt2", 0x4ae1 }, ++ { "Bulcrypt", 0x4aee }, ++ { "Bulcrypt", 0x5581 }, + }; + + const char *