oscam-2.26.01-11942-802-wit.../module-cccam-data.h
2026-02-24 21:37:51 +00:00

256 lines
5.2 KiB
C
Executable File

/*
* Created on: 23.04.2010
* Author: alno
*/
#ifndef MODULE_CCCAM_DATA_H_
#define MODULE_CCCAM_DATA_H_
#include "cscrypt/rc6.h"
#include "cscrypt/idea.h"
#define CAID_KEY 0x20
#define CC_MAXMSGSIZE 0x400 // by Project::Keynation: Buffer size is limited on "O" CCCam to 1024 bytes
#define CC_MAX_PROV 32
#define SWAPC(X, Y) do { char p; p = *X; *X = *Y; *Y = p; } while(0)
#if (defined(WIN32) || defined(__CYGWIN__)) && !defined(MSG_WAITALL)
#define MSG_WAITALL 0
#endif
#define MINIMIZE_NONE 0
#define MINIMIZE_HOPS 1
#define MINIMIZE_CAID 2
#define MINIMIZE_TRANSPARENT 3
#define CCCAM_MODE_NOTINIT 0
#define CCCAM_MODE_NORMAL 1
#define CCCAM_MODE_SHUTDOWN 0xFF
#define QUITERROR 1
#define MIN_RATING -25
#define MAX_RATING 25
#define HOP_RATING 5
typedef enum
{
DECRYPT, ENCRYPT
} cc_crypt_mode_t;
typedef enum
{
MSG_CLI_DATA = 0,
MSG_CW_ECM = 1,
MSG_EMM_ACK = 2,
MSG_CARD_REMOVED = 4,
MSG_CMD_05 = 5,
MSG_KEEPALIVE = 6,
MSG_NEW_CARD = 7,
MSG_SRV_DATA = 8,
MSG_CMD_0A = 0x0a,
MSG_CMD_0B = 0x0b,
MSG_CMD_0C = 0x0c, // CCCam 2.2.x fake client checks
MSG_CMD_0D = 0x0d, // "
MSG_CMD_0E = 0x0e, // "
MSG_NEW_CARD_SIDINFO = 0x0f,
MSG_SLEEPSEND = 0x80, // Sleepsend support
MSG_CACHE_PUSH = 0x81, // CacheEx Cache-Push In/Out
MSG_CACHE_FILTER = 0x82, // CacheEx Cache-Filter Request
#ifdef CS_CACHEEX_AIO
MSG_CACHE_FEATURE_EXCHANGE = 0x83, // CacheEx feature-exchange
MSG_CACHE_FEATURE_EXCHANGE_REPLY = 0x84, // CacheEx feature-exchange-reply
MSG_CACHE_FEATURE_TRIGGER = 0x85, // CacheEx feature-trigger
MSG_CW_ECM_LGF = 0x86, // oscam lg-flagged CW
#endif
MSG_CW_NOK1 = 0xfe, // Node no more available
MSG_CW_NOK2 = 0xff, // No decoding
MSG_NO_HEADER = 0xffff
} cc_msg_type_t;
struct cc_crypt_block
{
uint8_t keytable[256];
uint8_t state;
uint8_t counter;
uint8_t sum;
};
struct cc_srvid
{
uint16_t sid;
uint16_t chid;
uint8_t ecmlen;
};
struct cc_srvid_block
{
uint16_t sid;
uint16_t chid;
uint8_t ecmlen;
time_t blocked_till;
};
struct cc_provider
{
uint32_t prov; // provider
uint8_t sa[4]; // shared address
};
typedef enum
{
CT_LOCALCARD = 1,
CT_CARD_BY_SERVICE_READER = 2,
CT_CARD_BY_SERVICE_USER = 3,
CT_CARD_BY_CAID1 = 4,
CT_CARD_BY_CAID2 = 5,
CT_CARD_BY_CAID3 = 6,
CT_REMOTECARD = 10
} cc_card_type;
struct cc_card
{
uint32_t id; // cccam card (share) id - reader
uint32_t remote_id;
uint16_t caid;
uint8_t hop;
uint8_t reshare;
uint8_t hexserial[8]; // card serial (for au)
LLIST *providers; // providers (struct cc_provider)
LLIST *badsids; // sids that have failed to decode (struct cc_srvid_block)
LLIST *goodsids; // sids that could decoded (struct cc_srvid)
LLIST *remote_nodes; // remote note id, 8 bytes
struct s_reader *origin_reader;
uint32_t origin_id;
cc_card_type card_type;
struct s_sidtab *sidtab; // pointer to sidtab entry if card_type = CT_CARD_BY_SERVICE
uint64_t grp;
uint8_t rdr_reshare;
SIDTABBITS sidtabno;
time_t timeout;
uint8_t is_ext;
int8_t rating;
};
typedef enum
{
MODE_UNKNOWN = 0,
MODE_PLAIN = 1,
MODE_AES = 2,
MODE_CC_CRYPT = 3,
MODE_RC4_CRYPT = 4,
MODE_LEN0 = 5,
} cc_cmd05_mode;
typedef enum
{
MODE_CMD_0x0C_NONE = 0,
MODE_CMD_0x0C_RC6 = 1,
MODE_CMD_0x0C_RC4 = 2,
MODE_CMD_0x0C_CC_CRYPT = 3,
MODE_CMD_0x0C_AES = 4,
MODE_CMD_0x0C_IDEA = 5,
} cc_cmd0c_mode;
struct cc_extended_ecm_idx
{
uint8_t send_idx;
uint16_t ecm_idx;
struct cc_card *card;
struct cc_srvid srvid;
uint8_t free_card;
struct timeb tps;
uint32_t cccam_id;
};
struct cc_data
{
uint8_t g_flag;
char *prefix;
struct cc_crypt_block block[2]; // crypto state blocks
uint8_t node_id[8]; // client node id
uint8_t peer_node_id[8]; // server node id
uint8_t peer_version[8]; // server version
uint8_t dcw[16]; // control words
uint8_t cmd0b_aeskey[16];
uint8_t cmd05_aeskey[16];
struct cc_crypt_block cmd05_cryptkey;
uint8_t is_oscam_cccam;
uint8_t cmd05_active;
int32_t cmd05_data_len;
uint8_t cmd05_data[256];
cc_cmd05_mode cmd05_mode;
int32_t cmd05_offset;
cc_cmd0c_mode cmd0c_mode;
struct cc_crypt_block cmd0c_cryptkey;
RC6KEY cmd0c_RC6_cryptkey;
AES_KEY cmd0c_AES_key;
IDEA_KEY_SCHEDULE cmd0c_IDEA_dkey;
uint8_t receive_buffer[CC_MAXMSGSIZE];
uint8_t send_buffer[CC_MAXMSGSIZE];
LLIST *cards; // cards list
int32_t max_ecms;
int32_t ecm_counter;
int32_t card_added_count;
int32_t card_removed_count;
uint8_t just_logged_in; // true for checking NOK direct after login
uint8_t key_table; // key for CMD 0B
LLIST *pending_emms; // pending emm list
uint32_t recv_ecmtask;
struct cc_card *last_emm_card;
int32_t server_ecm_pending; // initialized by server
uint16_t server_ecm_idx;
CS_MUTEX_LOCK lockcmd;
int8_t ecm_busy;
CS_MUTEX_LOCK cards_busy;
struct timeb ecm_time;
uint8_t last_msg;
uint8_t cmd05NOK;
char remote_version[7];
char remote_build[7];
char remote_oscam[200];
uint8_t cccam220;
uint32_t remote_build_nr;
uint8_t sleepsend;
// Extended Mode for SPECIAL clients:
uint8_t extended_mode;
LLIST *extended_ecm_idx;
// multics detection
int8_t multics_mode;
int8_t multics_version[2];
// stats:
int32_t num_hop1;
int32_t num_hop2;
int32_t num_hopx;
int32_t num_reshare0;
int32_t num_reshare1;
int32_t num_reshare2;
int32_t num_resharex;
char *nok_message;
#ifdef CS_CACHEEX_AIO
uint8_t extended_lg_flagged_cws;
#endif
};
#endif