static void tvhcsa_aes_descramble ( tvhcsa_t *csa, struct mpegts_service *s, const uint8_t *tsb ) { aes_decrypt_packet(csa->csa_aes_keys, (unsigned char *)tsb); ts_recv_packet2(s, tsb); }
static void tvhcsa_csa_cbc_flush ( tvhcsa_t *csa, struct mpegts_service *s ) { #if ENABLE_DVBCSA tvhtrace(LS_CSA, "%p: CSA flush - descramble packets for service \"%s\" MAX=%d even=%d odd=%d fill=%d", csa,((mpegts_service_t *)s)->s_dvb_svcname, csa->csa_cluster_size,csa->csa_fill_even,csa->csa_fill_odd,csa->csa_fill); if(csa->csa_fill_even) { csa->csa_tsbbatch_even[csa->csa_fill_even].data = NULL; dvbcsa_bs_decrypt(csa->csa_key_even, csa->csa_tsbbatch_even, 184); csa->csa_fill_even = 0; } if(csa->csa_fill_odd) { csa->csa_tsbbatch_odd[csa->csa_fill_odd].data = NULL; dvbcsa_bs_decrypt(csa->csa_key_odd, csa->csa_tsbbatch_odd, 184); csa->csa_fill_odd = 0; } ts_recv_packet2(s, csa->csa_tsbcluster, csa->csa_fill * 188); csa->csa_fill = 0; #else #error "Unknown CSA descrambler" #endif }
static void tvhcsa_csa_cbc_flush ( tvhcsa_t *csa, struct mpegts_service *s ) { #if ENABLE_DVBCSA if(csa->csa_fill_even) { csa->csa_tsbbatch_even[csa->csa_fill_even].data = NULL; dvbcsa_bs_decrypt(csa->csa_key_even, csa->csa_tsbbatch_even, 184); csa->csa_fill_even = 0; } if(csa->csa_fill_odd) { csa->csa_tsbbatch_odd[csa->csa_fill_odd].data = NULL; dvbcsa_bs_decrypt(csa->csa_key_odd, csa->csa_tsbbatch_odd, 184); csa->csa_fill_odd = 0; } ts_recv_packet2(s, csa->csa_tsbcluster, csa->csa_fill * 188); csa->csa_fill = 0; #else int r, l; unsigned char *vec[3]; vec[0] = csa->csa_tsbcluster; vec[1] = csa->csa_tsbcluster + csa->csa_fill * 188; vec[2] = NULL; r = decrypt_packets(csa->csa_keys, vec); if(r > 0) { ts_recv_packet2(s, csa->csa_tsbcluster, r * 188); l = csa->csa_fill - r; assert(l >= 0); if(l > 0) memmove(csa->csa_tsbcluster, csa->csa_tsbcluster + r * 188, l * 188); csa->csa_fill = l; } else { csa->csa_fill = 0; } #endif }
static void tvhcsa_des_ncb_descramble ( tvhcsa_t *csa, struct mpegts_service *s, const uint8_t *tsb, int len ) { const uint8_t *tsb2, *end2; for (tsb2 = tsb, end2 = tsb + len; tsb2 < end2; tsb2 += 188) des_decrypt_packet(csa->csa_priv, tsb2); ts_recv_packet2(s, tsb, len); }
static void tvhcsa_des_flush ( tvhcsa_t *csa, struct mpegts_service *s ) { #if ENABLE_DVBCSA int i; const uint8_t *t0; if(csa->csa_fill_even) { csa->csa_tsbbatch_even[csa->csa_fill_even].data = NULL; dvbcsa_bs_decrypt(csa->csa_key_even, csa->csa_tsbbatch_even, 184); csa->csa_fill_even = 0; } if(csa->csa_fill_odd) { csa->csa_tsbbatch_odd[csa->csa_fill_odd].data = NULL; dvbcsa_bs_decrypt(csa->csa_key_odd, csa->csa_tsbbatch_odd, 184); csa->csa_fill_odd = 0; } t0 = csa->csa_tsbcluster; for(i = 0; i < csa->csa_fill; i++) { ts_recv_packet2(s, t0); t0 += 188; } csa->csa_fill = 0; #else int r; unsigned char *vec[3]; while(1) { vec[0] = csa->csa_tsbcluster; vec[1] = csa->csa_tsbcluster + csa->csa_fill * 188; vec[2] = NULL; r = decrypt_packets(csa->csa_keys, vec); if(r > 0) { int i; const uint8_t *t0 = csa->csa_tsbcluster; for(i = 0; i < r; i++) { ts_recv_packet2(s, t0); t0 += 188; } r = csa->csa_fill - r; assert(r >= 0); if(r > 0) memmove(csa->csa_tsbcluster, t0, r * 188); csa->csa_fill = r; } else { csa->csa_fill = 0; } break; } #endif }