]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
descrambler: cwc: do not register bad provider numbers for betacrypt and irdeto
authorJaroslav Kysela <perex@perex.cz>
Sun, 22 Jan 2023 16:11:05 +0000 (17:11 +0100)
committerJaroslav Kysela <perex@perex.cz>
Sun, 22 Jan 2023 16:12:29 +0000 (17:12 +0100)
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
src/descrambler/cwc.c
src/descrambler/emm_reass.h

index d2872073219970145fbba19b252f5bff4a23d7ef..4f89a5eaa1796f2bb1c94e1ec1d356e1baac6deb 100644 (file)
@@ -449,21 +449,31 @@ cwc_running_reply(cwc_t *cwc, uint8_t msgtype, uint8_t *msg, int len)
 
       caid = (msg[6] << 8) | msg[7];
 
-      if (caid){
-        if(len < 3) {
+      if (caid) {
+        if (len < 3) {
           tvhinfo(cwc->cc_subsys, "%s: Invalid card data reply", cwc->cc_name);
           return -1;
         }
 
         plen = (msg[1] & 0xf) << 8 | msg[2];
 
-        if(plen < 14) {
+        if (plen < 14) {
           tvhinfo(cwc->cc_subsys, "%s: Invalid card data reply (message)", cwc->cc_name);
           return -1;
         }
 
         caclient_set_status((caclient_t *)cwc, CACLIENT_STATUS_CONNECTED);
+        
         u8 = &msg[8];
+        if (caid_is_betacrypt(caid) || caid_is_irdeto(caid)) {
+          const char *n = caid2name(caid) ?: "Unknown";
+          uint32_t provid = (u8[0] << 16) | (u8[1] << 8) | u8[0];
+          if (provid != 0) {
+            tvhdebug(cwc->cc_subsys, "%s: Bad provider for %s-card [CAID:%04X Provider:0x%06X], using zero",
+                     cwc->cc_name, n, caid, provid);
+            memset(u8, 0, 3);
+          }
+        }
         cc_new_card((cclient_t *)cwc, caid, 0, NULL, 1, &u8, NULL, 1);
       }
   }
index 5a5e92a300a5fd79764de55ce15cae4b0abe0b5a..c816c663a1b0f9b5f973b460efa97c0979231722 100644 (file)
@@ -75,4 +75,7 @@ emm_provider_t *emm_find_provider(emm_reass_t *ra, uint32_t provid);
 void emm_reass_init(emm_reass_t *ra, int subsys, uint16_t caid);
 void emm_reass_done(emm_reass_t *ra);
 
+static inline int caid_is_betacrypt(uint16_t caid) { return (caid >> 8) == 0x17; }
+static inline int caid_is_irdeto(uint16_t caid) { return (caid >> 8) == 0x06; }
+
 #endif /* __TVH_EMM_REASS_H__ */