void dvbcsa_key_set (const dvbcsa_cw_t cw, struct dvbcsa_key_s *key) { uint64_t a = dvbcsa_load_le64(cw); dvbcsa_store_le64(key->cw, a); dvbcsa_store_le64(key->cws, ((a & 0xf0f0f0f0f0f0f0f0ULL) >> 4) | ((a & 0x0f0f0f0f0f0f0f0fULL) << 4)); dvbcsa_key_schedule_block(cw, key->sch); }
void dvbcsa_bs_key_set (const dvbcsa_cw_t cw, struct dvbcsa_bs_key_s *key) { dvbcsa_keys_t kk; int i; /* precalculations for stream */ uint64_t ck = dvbcsa_load_le64(cw); for (i = 0; i < DVBCSA_CWBITS_SIZE; i++) key->stream[i] = (ck >> (i^4)) & 1 ? BS_VAL8(ff) : BS_VAL8(00); /* precalculations for block */ dvbcsa_key_schedule_block(cw, kk); for (i = 0; i < DVBCSA_KEYSBUFF_SIZE; i++) { #if BS_BATCH_SIZE == 32 *(uint32_t*)(key->block + i) = kk[i] * 0x01010101; #elif BS_BATCH_SIZE == 64 *(uint64_t*)(key->block + i) = kk[i] * 0x0101010101010101ULL; #elif BS_BATCH_SIZE > 64 && BS_BATCH_SIZE % 64 == 0 uint64_t v = kk[i] * 0x0101010101010101ULL; int j; for (j = 0; j < BS_BATCH_BYTES / 8; j++) *((uint64_t*)(key->block + i) + j) = v; #else # error #endif } }