inline void csa_decrypt_single_packet(csakey_t *csakey, uint8_t *ts_packet) { struct csakey *key = (struct csakey *)csakey; if (use_dvbcsa) { unsigned int key_idx = ts_packet_get_scrambled(ts_packet) - 2; unsigned int payload_offset = ts_packet_get_payload_offset(ts_packet); ts_packet_set_not_scrambled(ts_packet); dvbcsa_decrypt(key->s_csakey[key_idx], ts_packet + payload_offset, 188 - payload_offset); } if (use_ffdecsa) { uint8_t *cluster[3] = { ts_packet, ts_packet + 188, NULL }; ffdecsa_decrypt_packets(key->ff_csakey, cluster); } }
int main (void) { struct dvbcsa_key_s *key = dvbcsa_key_alloc(); unsigned int i; uint8_t data[256]; #ifdef HAVE_ASSERT_H assert(key != NULL); #endif puts("* CSA decryption *"); for (i = 0; i < sizeof(csa_tests) / sizeof(struct test_s); i++) { printf(" test %u\n", i + 1); dvbcsa_key_set(csa_tests[i].key, key); memcpy(data, csa_tests[i].in, TS_SIZE); dvbcsa_decrypt(key, data, TS_SIZE); if (memcmp(data, csa_tests[i].out, TS_SIZE)) { puts("\nTest failed\n"); hexdump("control words", csa_tests[i].key, sizeof(dvbcsa_cw_t)); hexdump("input data", csa_tests[i].out, TS_SIZE); hexdump("expected stream", csa_tests[i].in, TS_SIZE); hexdump("output stream", data, TS_SIZE); return (1); } } dvbcsa_key_free(key); puts("* Done *"); return (0); }