}
void
-descrambler_keys ( th_descrambler_t *td,
+descrambler_keys ( th_descrambler_t *td, int type,
const uint8_t *even, const uint8_t *odd )
{
service_t *t = td->td_service;
th_descrambler_runtime_t *dr;
th_descrambler_t *td2;
+ tvhcsa_t *csa = td->td_csa;
int i, j = 0;
if (t == NULL || (dr = t->s_descramble) == NULL) {
return;
}
+ if (tvhcsa_set_type(td->td_csa, type) < 0)
+ return;
+
pthread_mutex_lock(&t->s_stream_mutex);
LIST_FOREACH(td2, &t->s_descramblers, td_service_link)
goto fin;
}
- for (i = 0; i < 8; i++)
+ for (i = 0; i < csa->csa_keylen; i++)
if (even[i]) {
j++;
- tvhcsa_set_key_even(td->td_csa, even);
+ tvhcsa_set_key_even(csa, even);
dr->dr_key_valid |= 0x40;
dr->dr_key_timestamp[0] = dispatch_clock;
break;
}
- for (i = 0; i < 8; i++)
+ for (i = 0; i < csa->csa_keylen; i++)
if (odd[i]) {
j++;
- tvhcsa_set_key_odd(td->td_csa, odd);
+ tvhcsa_set_key_odd(csa, odd);
dr->dr_key_valid |= 0x80;
dr->dr_key_timestamp[1] = dispatch_clock;
break;
"Obtained keys from %s for service \"%s\"",
td->td_nicename,
((mpegts_service_t *)t)->s_dvb_svcname);
- tvhtrace("descrambler", "Obtained keys "
- "%02X%02X%02X%02X%02X%02X%02X%02X:%02X%02X%02X%02X%02X%02X%02X%02X"
- " from %s for service \"%s\"",
- even[0], even[1], even[2], even[3], even[4], even[5], even[6], even[7],
- odd[0], odd[1], odd[2], odd[3], odd[4], odd[5], odd[6], odd[7],
- td->td_nicename,
- ((mpegts_service_t *)t)->s_dvb_svcname);
+ if (csa->csa_keylen == 8) {
+ tvhtrace("descrambler", "Obtained keys "
+ "%02X%02X%02X%02X%02X%02X%02X%02X:%02X%02X%02X%02X%02X%02X%02X%02X"
+ " from %s for service \"%s\"",
+ even[0], even[1], even[2], even[3], even[4], even[5], even[6], even[7],
+ odd[0], odd[1], odd[2], odd[3], odd[4], odd[5], odd[6], odd[7],
+ td->td_nicename,
+ ((mpegts_service_t *)t)->s_dvb_svcname);
+ } else if (csa->csa_keylen == 16) {
+ tvhtrace("descrambler", "Obtained keys "
+ "%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X:"
+ "%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X"
+ " from %s for service \"%s\"",
+ even[0], even[1], even[2], even[3], even[4], even[5], even[6], even[7],
+ even[8], even[9], even[10], even[11], even[12], even[13], even[14], even[15],
+ odd[0], odd[1], odd[2], odd[3], odd[4], odd[5], odd[6], odd[7],
+ odd[8], odd[9], odd[10], odd[11], odd[12], odd[13], odd[14], odd[15],
+ td->td_nicename,
+ ((mpegts_service_t *)t)->s_dvb_svcname);
+ } else {
+ tvhtrace("descrambler", "Unknown keys from %s for for service \"%s\"",
+ td->td_nicename, ((mpegts_service_t *)t)->s_dvb_svcname);
+ }
dr->dr_ecm_key_time = dispatch_clock;
td->td_keystate = DS_RESOLVED;
} else {
key_update(dr, ki);
}
}
- tvhcsa_descramble(td->td_csa,
- (mpegts_service_t *)td->td_service,
- tsb2);
+ td->td_csa->csa_descramble(td->td_csa,
+ (mpegts_service_t *)td->td_service,
+ tsb2);
dr->dr_last_descramble = dispatch_clock;
}
sbuf_free(&dr->dr_buf);
key_update(dr, ki);
}
}
- tvhcsa_descramble(td->td_csa,
- (mpegts_service_t *)td->td_service,
- tsb);
+ td->td_csa->csa_descramble(td->td_csa,
+ (mpegts_service_t *)td->td_service,
+ tsb);
dr->dr_last_descramble = dispatch_clock;
return 1;
next:
#include <unistd.h>
#include <assert.h>
-void
-tvhcsa_descramble
+static void
+tvhcsa_aes_descramble
+ ( tvhcsa_t *csa, struct mpegts_service *s, const uint8_t *tsb )
+{
+ /* Not Implemented Yet */
+}
+
+static void
+tvhcsa_des_descramble
( tvhcsa_t *csa, struct mpegts_service *s, const uint8_t *tsb )
{
#if ENABLE_DVBCSA
#endif
}
+int
+tvhcsa_set_type( tvhcsa_t *csa, int type )
+{
+ if (csa->csa_type == type)
+ return 0;
+ if (csa->csa_descramble)
+ return -1;
+ switch (type) {
+ case DESCRAMBLER_DES:
+ csa->csa_descramble = tvhcsa_des_descramble;
+ csa->csa_keylen = 8;
+ break;
+ case DESCRAMBLER_AES:
+ csa->csa_descramble = tvhcsa_aes_descramble;
+ csa->csa_keylen = 16;
+ break;
+ default:
+ assert(0);
+ }
+ csa->csa_type = type;
+ return 0;
+}
+
+
+void tvhcsa_set_key_even( tvhcsa_t *csa, const uint8_t *even )
+{
+ switch (csa->csa_type) {
+ case DESCRAMBLER_DES:
+#if ENABLE_DVBCSA
+ dvbcsa_bs_key_set(even, csa->csa_key_even);
+#else
+ set_even_control_word((csa)->csa_keys, even);
+#endif
+ break;
+ case DESCRAMBLER_AES:
+ /* Not Yet Implemented */
+ break;
+ default:
+ assert(0);
+ }
+}
+
+void tvhcsa_set_key_odd( tvhcsa_t *csa, const uint8_t *odd )
+{
+ assert(csa->csa_type);
+ switch (csa->csa_type) {
+ case DESCRAMBLER_DES:
+#if ENABLE_DVBCSA
+ dvbcsa_bs_key_set(odd, csa->csa_key_odd);
+#else
+ set_odd_control_word((csa)->csa_keys, odd);
+#endif
+ break;
+ case DESCRAMBLER_AES:
+ /* Not Yet Implemented */
+ break;
+ default:
+ assert(0);
+ }
+}
+
void
tvhcsa_init ( tvhcsa_t *csa )
{
+ csa->csa_type = 0;
+ csa->csa_keylen = 0;
#if ENABLE_DVBCSA
csa->csa_cluster_size = dvbcsa_bs_batch_size();
#else
struct elementary_stream;
#include "tvheadend.h"
+#include "descrambler.h"
#include <stdint.h>
#if ENABLE_DVBCSA
/**
* CSA
*/
+ int csa_type; /*< see DESCRAMBLER_* defines */
+ int csa_keylen;
+ void (*csa_descramble)
+ ( struct tvhcsa *csa, struct mpegts_service *s, const uint8_t *tsb );
+
int csa_cluster_size;
uint8_t *csa_tsbcluster;
int csa_fill;
#else
void *csa_keys;
#endif
+ void *csa_aes_keys;
} tvhcsa_t;
-#if ENABLE_DVBCSA
-
-#define tvhcsa_set_key_even(csa, cw)\
- dvbcsa_bs_key_set(cw, (csa)->csa_key_even)
-
-#define tvhcsa_set_key_odd(csa, cw)\
- dvbcsa_bs_key_set(cw, (csa)->csa_key_odd)
-
-#else
-
-#define tvhcsa_set_key_even(csa, cw)\
- set_even_control_word((csa)->csa_keys, cw)
-
-#define tvhcsa_set_key_odd(csa, cw)\
- set_odd_control_word((csa)->csa_keys, cw)
-
-#endif
+int tvhcsa_set_type( tvhcsa_t *csa, int type );
-void
-tvhcsa_descramble
- ( tvhcsa_t *csa, struct mpegts_service *s, const uint8_t *tsb );
+void tvhcsa_set_key_even( tvhcsa_t *csa, const uint8_t *even );
+void tvhcsa_set_key_odd ( tvhcsa_t *csa, const uint8_t *odd );
void tvhcsa_init ( tvhcsa_t *csa );
void tvhcsa_destroy ( tvhcsa_t *csa );