csakey_t *csa_key_alloc(void) { struct csakey *key = calloc(1, sizeof(struct csakey)); key->s_csakey[0] = dvbcsa_key_alloc(); key->s_csakey[1] = dvbcsa_key_alloc(); key->bs_csakey[0] = dvbcsa_bs_key_alloc(); key->bs_csakey[1] = dvbcsa_bs_key_alloc(); key->ff_csakey = ffdecsa_key_alloc(); return (csakey_t *)key; }
bool cDeCSA::GetKeyStruct(int idx) { if(!csa_bs_key_even[idx]) csa_bs_key_even[idx] = dvbcsa_bs_key_alloc(); if(!csa_bs_key_odd[idx]) csa_bs_key_odd[idx] = dvbcsa_bs_key_alloc(); return (csa_bs_key_even[idx]!=0 && csa_bs_key_odd[idx]!=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; }
/* 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); }