inline unsigned int csa_get_batch_size(void) { if (use_dvbcsa) { return dvbcsa_bs_batch_size(); // 32? } if (use_ffdecsa) { return ffdecsa_get_suggested_cluster_size() / 2; } return 0; }
int tvhcsa_set_type( tvhcsa_t *csa, struct mpegts_service *s, int type ) { if (csa->csa_type == type) return 0; if (csa->csa_descramble) return -1; switch (type) { case DESCRAMBLER_CSA_CBC: csa->csa_descramble = tvhcsa_csa_cbc_descramble; csa->csa_flush = tvhcsa_csa_cbc_flush; csa->csa_keylen = 8; #if ENABLE_DVBCSA csa->csa_cluster_size = dvbcsa_bs_batch_size(); #else csa->csa_cluster_size = 0; #endif csa->csa_fill_size = 3 * csa->csa_cluster_size; tvhtrace(LS_CSA, "%p: service \"%s\" using CSA batch size = %d for decryption", csa, ((mpegts_service_t *)s)->s_dvb_svcname, csa->csa_cluster_size ); csa->csa_tsbcluster = malloc(csa->csa_fill_size * 188); #if ENABLE_DVBCSA csa->csa_tsbbatch_even = malloc((csa->csa_cluster_size + 1) * sizeof(struct dvbcsa_bs_batch_s)); csa->csa_tsbbatch_odd = malloc((csa->csa_cluster_size + 1) * sizeof(struct dvbcsa_bs_batch_s)); csa->csa_key_even = dvbcsa_bs_key_alloc(); csa->csa_key_odd = dvbcsa_bs_key_alloc(); #endif break; case DESCRAMBLER_DES_NCB: csa->csa_priv = des_get_priv_struct(); csa->csa_descramble = tvhcsa_des_ncb_descramble; csa->csa_flush = tvhcsa_empty_flush; csa->csa_keylen = 8; break; case DESCRAMBLER_AES_ECB: csa->csa_priv = aes_get_priv_struct(); csa->csa_descramble = tvhcsa_aes_ecb_descramble; csa->csa_flush = tvhcsa_empty_flush; csa->csa_keylen = 8; break; case DESCRAMBLER_AES128_ECB: csa->csa_priv = aes128_get_priv_struct(); csa->csa_descramble = tvhcsa_aes128_ecb_descramble; csa->csa_flush = tvhcsa_empty_flush; csa->csa_keylen = 16; break; default: assert(0); } csa->csa_type = type; return 0; }
cDeCSA::cDeCSA(int _adapter, int _demux) { adapter = _adapter; demux = _demux; cs=dvbcsa_bs_batch_size(); pcks = new dvbcsa_bs_batch_s[cs+1]; for (int i=0; i<=cs; i++) { pcks[i].data = NULL; } memset(csa_bs_key_even,0,sizeof(csa_bs_key_even)); memset(csa_bs_key_odd,0,sizeof(csa_bs_key_odd)); memset(pidmap,0,sizeof(pidmap)); ResetState(); }
/* The following routine is taken from benchbitslice in libdvbcsa */ void dvbcsa_benchmark(void) { struct timeval t0, t1; struct dvbcsa_bs_key_s *key = dvbcsa_bs_key_alloc(); unsigned int n, i, npackets = 0; unsigned int batch_size = dvbcsa_bs_batch_size(); uint8_t data[batch_size + 1][188]; struct dvbcsa_bs_batch_s pcks[batch_size + 1]; uint8_t cw[8] = { 0x12, 0x34, 0x56, 0x78, 0x89, 0xab, 0xcd, 0xef, }; dvbcsa_bs_key_set (cw, key); printf("Batch size %d packets.\n\n", batch_size); for (i = 0; i < batch_size; i++) { pcks[i].data = data[i]; pcks[i].len = 184; memset(data[i], rand(), pcks[i].len); } pcks[i].data = NULL; gettimeofday(&t0, NULL); for (n = (1 << 12) / batch_size; n < (1 << 19) / batch_size; n *= 2) { printf(" Decrypting %6u mpegts packets\r", n * batch_size); fflush(stdout); for (i = 0; i < n; i++) { dvbcsa_bs_decrypt(key, pcks, 184); } npackets += n * batch_size; } gettimeofday(&t1, NULL); unsigned long long usec = timeval_diff_usec(&t0, &t1); printf("DONE: %u packets (%u bytes) decrypted in %llu ms = %.1f Mbits/s\n\n", npackets, npackets * 188, usec / 1000, (double)(npackets * 188 * 8) / (double)usec ); dvbcsa_bs_key_free(key); }