256 lines
5.2 KiB
C
Executable File
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
|