Skip to content
This repository has been archived by the owner on Apr 14, 2024. It is now read-only.

Commit

Permalink
part 2.
Browse files Browse the repository at this point in the history
Support for DVB-CISSA scrambling algorithm and 16 byte CWs

DVB-CISSA is defined in 
https://www.etsi.org/deliver/etsi_ts/103100_103199/103127/01.01.01_60/ts_103127v010101p.pdf
enigma2 box manufacturers should support the new ioctl(CA_SET_DESCR_DATA) as defined in the module-dvbapi.h

git-svn-id: http://www.streamboard.tv/svn/oscam/trunk@11509 4b0bc96b-bc66-0410-9d44-ebda105a78c1
  • Loading branch information
gorgone.impertinence committed Apr 7, 2019
1 parent c9f1645 commit 3a8f34f
Show file tree
Hide file tree
Showing 7 changed files with 247 additions and 99 deletions.
16 changes: 7 additions & 9 deletions globals.h
Original file line number Diff line number Diff line change
Expand Up @@ -988,21 +988,19 @@ struct s_cardsystem
int32_t (*get_tunemm_filter)(struct s_reader *, struct s_csystem_emm_filter **, uint32_t *);
};

#ifdef WITH_EXTENDED_CW
typedef struct cw_extendted_t
{
#ifdef WITH_EXTENDED_CW
uint8_t mode;
uint8_t audio[4][16];
uint8_t data[16];
uint8_t algo;
uint8_t algo_mode;
} EXTENDED_CW;
uint8_t audio[4][16]; // 4 x odd/even pairs of 8 byte CWs
uint8_t data[16]; // odd/even pair of 8 byte CW or 16 byte IV
uint8_t session_word[32]; // odd/even pair of 16 byte CW
uint8_t algo; // CSA, DES or AES128
uint8_t algo_mode; // ECB or CBC
#else
typedef struct cw_extendted_t
{
uint8_t disabled;
} EXTENDED_CW;
#endif
} EXTENDED_CW;

typedef struct ecm_request_t
{
Expand Down
6 changes: 3 additions & 3 deletions module-dvbapi-azbox.c
Original file line number Diff line number Diff line change
Expand Up @@ -258,7 +258,7 @@ void azbox_send_dcw(struct s_client *client, ECM_REQUEST *er)

delayer(er, delay);

dvbapi_write_ecminfo_file(client, er, demux[0].lastcw[0], demux[0].lastcw[1]);
dvbapi_write_ecminfo_file(client, er, demux[0].last_cw[0][0], demux[0].last_cw[0][1], 8);

openxcas_busy = 0;

Expand Down Expand Up @@ -311,9 +311,9 @@ void azbox_send_dcw(struct s_client *client, ECM_REQUEST *er)
{
// Skip check for BISS1 - cw could be indeed zero
// Skip check for BISS2 - we use the extended cw, so the "simple" cw is always zero
if(memcmp(er->cw + (n * 8), demux[0].lastcw[n], 8) && (memcmp(er->cw + (n * 8), nullcw, 8) != 0 || caid_is_biss(er->caid)))
if(memcmp(er->cw + (n * 8), demux[0].last_cw[0][n], 8) && (memcmp(er->cw + (n * 8), nullcw, 8) != 0 || caid_is_biss(er->caid)))
{
memcpy(demux[0].lastcw[n], er->cw + (n * 8), 8);
memcpy(demux[0].last_cw[0][n], er->cw + (n * 8), 8);
memcpy(openxcas_cw + (n * 8), er->cw + (n * 8), 8);
}
}
Expand Down
11 changes: 6 additions & 5 deletions module-dvbapi-mca.c
Original file line number Diff line number Diff line change
Expand Up @@ -293,7 +293,8 @@ static void mca_demux_convert(DEMUXTYPE *demux_orig, DEMUXMATRIX *demux_matrix)
demux_matrix->curindex = (int32_t)demux_orig->curindex;
demux_matrix->max_status = (int32_t)demux_orig->max_status;
demux_matrix->program_number = (uint16_t)demux_orig->program_number;
memcpy(&demux_matrix->lastcw, &demux_orig->lastcw, 2 * 8 * sizeof(uint8_t));
memcpy(&demux_matrix->lastcw[0], &demux_orig->last_cw[0][0], 8 * sizeof(uint8_t));
memcpy(&demux_matrix->lastcw[1], &demux_orig->last_cw[0][1], 8 * sizeof(uint8_t));
demux_matrix->emm_filter = (int32_t)demux_orig->emm_filter;
memcpy(&demux_matrix->hexserial, &demux_orig->hexserial, 8 * sizeof(uint8_t));
demux_matrix->rdr = (struct s_reader *)demux_orig->rdr;
Expand Down Expand Up @@ -547,7 +548,7 @@ void mca_send_dcw(struct s_client *client, ECM_REQUEST *er)

delayer(er, delay);

dvbapi_write_ecminfo_file(client, er, demux[0].lastcw[0], demux[0].lastcw[1]);
dvbapi_write_ecminfo_file(client, er, demux[0].last_cw[0][0], demux[0].last_cw[0][1], 8);

openxcas_busy = 0;

Expand Down Expand Up @@ -599,10 +600,10 @@ void mca_send_dcw(struct s_client *client, ECM_REQUEST *er)
{
// Skip check for BISS1 - cw could be indeed zero
// Skip check for BISS2 - we use the extended cw, so the "simple" cw is always zero
if((memcmp(er->cw + (n * 8), demux[0].lastcw[0], 8) && memcmp(er->cw + (n * 8), demux[0].lastcw[1], 8))
&& (memcmp(er->cw + (n * 8), nullcw, 8) !=0 || caid_is_biss(er->caid)))
if((memcmp(er->cw + (n * 8), demux[0].last_cw[0][0], 8) && memcmp(er->cw + (n * 8), demux[0].last_cw[0][1], 8))
&& (memcmp(er->cw + (n * 8), nullcw, 8) != 0 || caid_is_biss(er->caid)))
{
memcpy(demux[0].lastcw[n], er->cw + (n * 8), 8);
memcpy(demux[0].last_cw[0][n], er->cw + (n * 8), 8);
memcpy(openxcas_cw + (n * 8), er->cw + (n * 8), 8);
if(mca_set_key(openxcas_cw) < 0)
{ cs_log("set cw failed"); }
Expand Down
4 changes: 2 additions & 2 deletions module-dvbapi-stapi.c
Original file line number Diff line number Diff line change
Expand Up @@ -727,7 +727,7 @@ int32_t stapi_write_cw(int32_t demux_id, uint8_t *cw, uint16_t *STREAMpids, int3
{
// Skip check for BISS1 - cw could be indeed zero
// Skip check for BISS2 - we use the extended cw, so the "simple" cw is always zero
if(memcmp(cw + (l * 8), demux[demux_id].lastcw[l], 8) != 0
if(memcmp(cw + (l * 8), demux[demux_id].last_cw[0][l], 8) != 0
&& (memcmp(cw + (l * 8), nullcw, 8) != 0 || caid_is_biss(demux[demux_id].ECMpids[pidnum].CAID)))
{
for(n = 0; n < PTINUM; n++)
Expand All @@ -738,7 +738,7 @@ int32_t stapi_write_cw(int32_t demux_id, uint8_t *cw, uint16_t *STREAMpids, int3
if(ErrorCode != 0)
{ cs_log("DescramblerSet: ErrorCode: %d", ErrorCode); }

memcpy(demux[demux_id].lastcw[l], cw + (l * 8), 8);
memcpy(demux[demux_id].last_cw[0][l], cw + (l * 8), 8);
cs_log_dbg(D_DVBAPI, "write cw %s index: %d %s", text[l], demux_id, dev_list[n].name);
}
}
Expand Down
4 changes: 2 additions & 2 deletions module-dvbapi-stapi5.c
Original file line number Diff line number Diff line change
Expand Up @@ -729,12 +729,12 @@ int32_t stapi_write_cw(int32_t demux_id, uint8_t *cw, uint16_t *STREAMpids, int3
{
// Skip check for BISS1 - cw could be indeed zero
// Skip check for BISS2 - we use the extended cw, so the "simple" cw is always zero
if(memcmp(cw + (l * 8), demux[demux_id].lastcw[l], 8) != 0
if(memcmp(cw + (l * 8), demux[demux_id].last_cw[0][l], 8) != 0
&& (memcmp(cw + (l * 8), nullcw, 8) != 0 || caid_is_biss(demux[demux_id].ECMpids[pidnum].CAID)))
{
ErrorCode = oscam_sttkd_KeyWrite(tkd_desc_info[demux[demux_id].dev_index].key_hndl, l, cw + (l * 8));

memcpy(demux[demux_id].lastcw[l], cw + (l * 8), 8);
memcpy(demux[demux_id].last_cw[0][l], cw + (l * 8), 8);
cs_log_dbg(D_DVBAPI, "write cw %s index: %d on %s", text[l], demux_id, dev_list[demux[demux_id].dev_index].name);
}
}
Expand Down
Loading

0 comments on commit 3a8f34f

Please sign in to comment.