source: trunk/globals.h@ 21

Last change on this file since 21 was 21, checked in by smurzch2, 14 years ago

Rename from MpCS to OSCam

File size: 18.0 KB
Line 
1#include <stdlib.h>
2#include <stdio.h>
3#include <assert.h>
4#include <fcntl.h>
5#include <sys/ioctl.h>
6#include <sys/poll.h>
7#include <ctype.h>
8#include <sys/types.h>
9#include <sys/stat.h>
10#include <sys/shm.h>
11#include <sys/wait.h>
12#include <unistd.h>
13#include <sys/mman.h>
14#include <stdarg.h>
15#include <time.h>
16#include <sys/timeb.h>
17#include <limits.h>
18
19#include <sys/socket.h>
20#include <netinet/in.h>
21#include <netdb.h>
22#include <string.h>
23#include <signal.h>
24#include <errno.h>
25
26#include <pthread.h>
27
28#ifndef CS_GLOBALS
29#define CS_GLOBALS
30#define CS_VERSION "0.9d"
31
32#if defined(__GNUC__)
33# define GCC_PACK __attribute__((packed))
34#else
35# define GCC_PACK
36#endif
37
38#include "oscam-config.h"
39#include "oscam-ostype.h"
40#include "oscam-types.h"
41#include "cscrypt/cscrypt.h"
42
43#ifndef CS_CONFDIR
44#define CS_CONFDIR "/usr/local/etc"
45#endif
46#ifndef CS_MMAPFILE
47#define CS_MMAPFILE "/tmp/mcps.mem"
48#endif
49#ifndef CS_LOGFILE
50#define CS_LOGFILE "/var/log/mcps.log"
51#endif
52#define CS_QLEN 128 // size of request queue
53#define CS_MAXQLEN 128 // size of request queue for cardreader
54#define CS_MAXCAIDTAB 32 // max. caid-defs/user
55#define CS_MAXPROV 32
56#define CS_MAXPORTS 32 // max server ports
57#define CS_MAXFILTERS 16
58
59#define CS_MAXCARDS 4096
60#define CS_MAXIGNORE 1024
61#define CS_MAXLOCALS 16
62#define CS_ECMSTORESIZE 16 // use MD5()
63#define CS_EMMSTORESIZE 270
64#define CS_CLIENT_TIMEOUT 5
65#define CS_CLIENT_MAXIDLE 120
66#define CS_BIND_TIMEOUT 120
67#define CS_DELAY 0
68#define CS_RESOLVE_DELAY 30
69#define CS_MAXLOGHIST 30
70#define CS_LOGHISTSIZE 160 // 32+128: username + logline
71
72#ifdef OLD_DEFS
73#ifdef CS_EMBEDDED
74#define CS_MAXPENDING 32
75#define CS_ECMCACHESIZE 32
76#define CS_EMMCACHESIZE 64
77#define CS_MAXPID 32
78#define CS_MAXREADER 8
79#else
80#define CS_MAXPENDING 128
81#define CS_ECMCACHESIZE 128
82#define CS_EMMCACHESIZE 256
83#define CS_MAXPID 128
84#define CS_MAXREADER 64
85#endif
86#endif
87
88#ifdef CS_EMBEDDED
89#define CS_MAXPID 32
90#define CS_MAXREADER (CS_MAXPID>>1)
91#define CS_MAXPENDING CS_MAXPID
92#define CS_ECMCACHESIZE CS_MAXPID
93#define CS_EMMCACHESIZE (CS_MAXPID<<1)
94#else
95#define CS_MAXPID 512
96#define CS_MAXREADER (CS_MAXPID>>2)
97#define CS_MAXPENDING (CS_MAXPID<<1)
98#define CS_ECMCACHESIZE CS_MAXPID
99#define CS_EMMCACHESIZE (CS_MAXPID<<1)
100#define CS_RDR_INIT_HIST
101#endif
102
103#define D_DUMP 1 // Debug Dumps
104#define D_MASTER 2 // Debug Master Process
105#define D_READER 4 // Debug Reader/Proxy Process
106#define D_CLIENT 8 // Debug Client Process
107#define D_DEVICE 16 // Debug Reader I/O
108#define D_WATCHDOG 32 // Debug Watchdog
109#define D_ALL_DUMP 63
110
111#define R_MOUSE 0x1 // Reader smartcard mouse
112#define R_INTERN 0x2 // Reader smartcard intern
113#define R_CAMD35 0x10 // Reader cascading camd 3.5x
114#define R_CAMD33 0x11 // Reader cascading camd 3.3x
115#define R_NEWCAMD 0x12 // Reader cascading newcamd
116#define R_RADEGAST 0x13 // Reader cascading radegast
117#define R_CS378X 0x14 // Reader cascading camd 3.5x TCP
118#define R_GBOX 0x20 // Reader cascading gbox
119#define R_SERIAL 0x80 // Reader serial
120#define R_IS_NETWORK 0x70
121#define R_IS_CASCADING 0xF0
122
123#define CS_MAX_MOD 8
124#define MOD_CONN_TCP 1
125#define MOD_CONN_UDP 2
126#define MOD_CONN_NET 3
127#define MOD_CONN_SERIAL 4
128
129#ifdef CS_CORE
130char *PIP_ID_TXT[] = { "ECM", "EMM", "LOG", "CIN", "HUP", NULL };
131char *RDR_CD_TXT[] = { "cd", "dsr", "cts", "ring", "none",
132#ifdef USE_GPIO
133 "gpio2", "gpio3", "gpio4", "gpio5", "gpio6", "gpio7",
134#endif
135 NULL };
136#else
137extern char *PIP_ID_TXT[];
138extern char *RDR_CD_TXT[];
139#endif
140
141#define PIP_ID_ECM 0
142#define PIP_ID_EMM 1
143#define PIP_ID_LOG 2
144#define PIP_ID_CIN 3 // CARD_INFO
145#define PIP_ID_HUP 4
146#define PIP_ID_MAX PIP_ID_HUP
147#define PIP_ID_DCW 5
148
149#define PIP_ID_ERR (-1)
150#define PIP_ID_DIR (-2)
151#define PIP_ID_NUL (-3)
152
153#define cdiff *c_start
154
155#define NCD_AUTO 0
156#define NCD_524 1
157#define NCD_525 2
158
159#define CS_ANTICASC
160
161enum {E1_GLOBAL=0, E1_USER, E1_READER, E1_SERVER, E1_LSERVER};
162enum {E2_GLOBAL=0, E2_GROUP, E2_CAID, E2_IDENT, E2_CLASS, E2_CHID, E2_QUEUE,
163 E2_EA_LEN, E2_F0_LEN, E2_OFFLINE, E2_SID};
164
165//typedef unsigned char uchar;
166//typedef unsigned long ulong;
167
168typedef struct s_classtab
169{
170 uchar an;
171 uchar bn;
172 uchar aclass[31];
173 uchar bclass[31];
174} GCC_PACK CLASSTAB;
175
176typedef struct s_caidtab
177{
178 ushort caid[CS_MAXCAIDTAB];
179 ushort mask[CS_MAXCAIDTAB];
180 ushort cmap[CS_MAXCAIDTAB];
181} GCC_PACK CAIDTAB;
182
183typedef struct s_sidtab
184{
185 char label[33];
186 ushort num_caid;
187 ushort num_provid;
188 ushort num_srvid;
189 ushort *caid;
190 ulong *provid;
191 ushort *srvid;
192 struct s_sidtab *next;
193} GCC_PACK SIDTAB;
194
195
196typedef struct s_filter
197{
198 ushort caid;
199 uchar nprids;
200 ulong prids[CS_MAXPROV];
201} GCC_PACK FILTER;
202
203typedef struct s_ftab
204{
205 int nfilts;
206 FILTER filts[CS_MAXFILTERS];
207} GCC_PACK FTAB;
208
209typedef struct s_port
210{
211 int fd;
212 int s_port;
213 FTAB ftab;
214} GCC_PACK PORT;
215
216typedef struct s_ptab
217{
218 int nports;
219 PORT ports[CS_MAXPORTS];
220} GCC_PACK PTAB;
221
222struct s_ecm
223{
224 uchar ecmd5[CS_ECMSTORESIZE];
225 uchar cw[16];
226 ushort caid;
227 ulong prid;
228 ulong grp;
229// int level;
230};
231
232struct s_emm
233{
234 uchar emm[CS_EMMSTORESIZE];
235 uchar type;
236 int count;
237};
238
239struct s_module
240{
241 //int fd;
242 int multi;
243 int type;
244 int watchdog;
245 char desc[16];
246 char *logtxt;
247 //int s_port;
248 in_addr_t s_ip;
249 void (*s_handler)();
250 int (*recv)();
251 void (*send_dcw)();
252 int c_multi;
253 int (*c_recv_chk)();
254 int (*c_init)();
255 int (*c_send_ecm)();
256 int (*c_init_log)();
257 int (*c_recv_log)();
258 int c_port;
259 PTAB *ptab;
260};
261
262struct s_irdeto_quess
263{
264 int b47;
265 ushort caid;
266 ushort sid;
267 struct s_irdeto_quess *next;
268};
269
270struct s_client
271{
272 pid_t pid;
273 in_addr_t ip;
274 in_port_t port;
275 time_t login;
276 time_t last;
277 time_t lastswitch;
278 time_t lastemm;
279 time_t lastecm;
280 ulong grp;
281 int crypted;
282 int dup;
283 int au;
284 int monlvl;
285 int dbglvl;
286 CAIDTAB ctab;
287 ulong sidtabok; // positiv services
288 ulong sidtabno; // negative services
289 int typ;
290 int ctyp;
291 int stat;
292 int ufd;
293 int last_srvid;
294 int last_caid;
295 int tosleep;
296 char usr[32];
297 int udp_fd;
298 int fd_m2c;
299 struct sockaddr_in udp_sa;
300 int log;
301 int logcounter;
302 int cwfound;
303 int cwcache;
304 int cwnot;
305 uchar ucrc[4]; // needed by monitor and used by camd35
306 ulong pcrc; // pwd crc
307 AES_KEY aeskey; // needed by monitor and used by camd33, camd35
308 ushort ncd_msgid;
309 uchar ncd_skey[16];
310 int port_idx; // index in server ptab
311 int ncd_server; // newcamd server?
312#ifdef CS_ANTICASC
313 ushort ac_idx;
314 ushort ac_limit;
315 uchar ac_penalty;
316#endif
317 FTAB fchid;
318 FTAB ftab; // user [caid] and ident filter
319 CLASSTAB cltab;
320};
321
322struct s_reader
323{
324 int cs_idx;
325 int fd;
326 ulong grp;
327 int fallback;
328 int typ;
329 int card_system;
330 char label[32];
331 char device[128];
332 int detect;
333 int mhz;
334 int custom_speed;
335 int r_port;
336 char r_usr[64];
337 char r_pwd[64];
338 int r_crypted;
339 int l_port;
340 int log_port;
341 CAIDTAB ctab;
342 ulong sidtabok; // positiv services
343 ulong sidtabno; // negative services
344 uchar hexserial[8];
345 int nprov;
346 uchar prid[CS_MAXPROV][8];
347 uchar availkeys[CS_MAXPROV][16]; // viaccess; misused in seca, if availkeys[PROV][0]=0 then expired, 1 then valid.
348 uchar sa[CS_MAXPROV][4]; // viaccess & seca
349 ushort acs; // irdeto
350 ushort caid[16];
351 uchar b_nano[256];
352 int logemm;
353 int cachemm;
354 int rewritemm;
355 int online;
356 struct s_module ph;
357 uchar ncd_key[16];
358 uchar ncd_skey[16];
359 int ncd_disable_server_filt;
360 ushort ncd_msgid;
361 int ncd_proto;
362 uchar tcp_connected;
363 int tcp_ito; // inactivity timeout
364 int tcp_rto; // reconnect timeout
365 time_t last_g; // get (if last_s-last_g>tcp_rto - reconnect )
366 time_t last_s; // send
367 uchar show_cls; // number of classes subscription showed on kill -31
368 int maxqlen; // max queue length
369 int qlen; // current queue length
370 FTAB fchid;
371 FTAB ftab;
372 CLASSTAB cltab;
373 uchar gbox_pwd[4];
374 uchar gbox_timecode[7];
375 int gbox_online;
376 uchar gbox_vers;
377 uchar gbox_prem;
378 int gbox_fd;
379 struct timeb gbox_lasthello; // incoming time stamp
380#ifdef CS_RDR_INIT_HIST
381 uchar init_history[1024];
382 int init_history_pos;
383#endif
384};
385
386#ifdef CS_ANTICASC
387
388struct s_acasc_shm {
389 ushort count : 15;
390 ushort deny : 1;
391};
392
393struct s_acasc {
394 ushort stat[10];
395 uchar idx; // current active index in stat[]
396};
397
398struct s_cpmap
399{
400 ushort caid;
401 ulong provid;
402 ushort sid;
403 ushort chid;
404 ushort dwtime;
405 struct s_cpmap *next;
406};
407#endif
408
409struct s_auth
410{
411 char usr[33];
412 char pwd[33];
413 int uniq;
414 int au;
415 int monlvl;
416 ulong grp;
417 int tosleep;
418 CAIDTAB ctab;
419 ulong sidtabok; // positiv services
420 ulong sidtabno; // negative services
421 FTAB fchid;
422 FTAB ftab; // user [caid] and ident filter
423 CLASSTAB cltab;
424#ifdef CS_ANTICASC
425 int ac_idx;
426 int ac_users; // 0 - unlimited
427 uchar ac_penalty; // 0 - log, >0 - fake dw
428#endif
429 in_addr_t dynip;
430 uchar dyndns[64];
431 int premhack;
432 struct s_auth *next;
433};
434
435struct s_srvid
436{
437 int srvid;
438 char name[33];
439 struct s_srvid *next;
440};
441
442struct s_ip
443{
444 in_addr_t ip[2];
445 struct s_ip *next;
446};
447
448struct s_config
449{
450 int nice;
451 ulong netprio;
452 int ctimeout;
453 int ftimeout;
454 int cmaxidle;
455 ulong delay;
456 int bindwait;
457 int resolvedelay;
458 int tosleep;
459 in_addr_t srvip;
460 char pidfile[128];
461 char usrfile[128];
462 struct s_auth *account;
463 struct s_srvid *srvid;
464 struct s_sidtab *sidtab;
465 int mon_port;
466 in_addr_t mon_srvip;
467 struct s_ip *mon_allowed;
468 int mon_aulow;
469 int mon_hideclient_to;
470 int mon_level;
471 int c33_port;
472 in_addr_t c33_srvip;
473 uchar c33_key[16];
474 int c33_crypted;
475 int c33_passive;
476 struct s_ip *c33_plain;
477 int c35_port;
478 in_addr_t c35_srvip;
479 PTAB c35_tcp_ptab;
480 in_addr_t c35_tcp_srvip;
481 PTAB ncd_ptab;
482 in_addr_t ncd_srvip;
483 uchar ncd_key[16];
484 int rad_port;
485 in_addr_t rad_srvip;
486 struct s_ip *rad_allowed;
487 char rad_usr[32];
488 char ser_device[512];
489 int srtimeout; // SerialReaderTimeount in millisec
490 int max_log_size;
491 int show_ecm_dw;
492 uchar gbox_pwd[8];
493 uchar ignorefile[512];
494 uchar cardfile[512];
495 uchar gbxShareOnl[512];
496 int maxdist;
497 int num_locals;
498 unsigned long locals[CS_MAXLOCALS];
499 //struct s_irdeto_quess *itab[0xff];
500#ifdef CS_ANTICASC
501 char ac_enabled;
502 int ac_users; // num of users for account (0 - default)
503 int ac_stime; // time to collect AC statistics (3 min - default)
504 int ac_samples; // qty of samples
505 int ac_penalty; // 0 - write to log
506 int ac_fakedelay; // 100-1000 ms
507 int ac_denysamples;
508 char ac_logfile[128];
509 struct s_cpmap *cpmap;
510#endif
511// struct s_reader reader[];
512};
513
514typedef struct ecm_request_t
515{
516
517 uchar ecm[256];
518 uchar cw[16];
519 uchar ecmd5[CS_ECMSTORESIZE];
520// uchar l;
521 short l;
522 ushort caid;
523 ushort ocaid;
524 ushort srvid;
525 ushort chid;
526 ushort pid;
527 ushort idx;
528 ulong prid;
529 int reader[CS_MAXREADER];
530 int cidx; // client index
531 int cpti; // client pending table index
532 int stage; // processing stage in server module
533 int level; // send-level in client module
534 int rc;
535 uchar rcEx;
536 struct timeb tps; // incoming time stamp
537 ushort gbxCWFrom;
538 ushort gbxFrom;
539 ushort gbxTo;
540
541 uchar gbxForward[16];
542 int gbxRidx;
543} GCC_PACK ECM_REQUEST;
544
545typedef struct emm_packet_t
546{
547 uchar emm[258];
548 uchar l;
549 uchar caid[2];
550 uchar provid[4];
551 uchar hexserial[8];
552 uchar type;
553 int cidx;
554} GCC_PACK EMM_PACKET;
555
556// oscam-simples
557extern char *remote_txt(void);
558extern char *trim(char *);
559extern char *strtolower(char *);
560extern int gethexval(char);
561extern int cs_atob(uchar *, char *, int);
562extern ulong cs_atoi(char *, int, int);
563extern int byte_atob(char *);
564extern long word_atob(char *);
565extern int key_atob(char *, uchar *);
566extern int key_atob4(char *, uchar *);
567extern char *key_btoa(char *, uchar *);
568extern char *cs_hexdump(int, uchar *, int);
569extern in_addr_t cs_inet_order(in_addr_t);
570extern char *cs_inet_ntoa(in_addr_t);
571extern in_addr_t cs_inet_addr(char *txt);
572extern ulong b2i(int, uchar *);
573extern ullong b2ll(int, uchar *);
574extern uchar *i2b(int, ulong);
575extern ulong a2i(char *, int);
576extern int boundary(int, int);
577extern void cs_ftime(struct timeb *);
578extern void cs_sleepms(int);
579extern int bytes_available(int);
580extern void cs_setpriority(int);
581extern struct s_auth *find_user(char *);
582
583// oscam variables
584extern int pfd, rfd, fd_c2m, fd_m2c, cs_idx, *c_start, cs_ptyp, cs_dblevel, cs_hw;
585extern int *logidx, *loghistidx, *log_fd;
586extern int is_server, *mcl;
587extern uchar mbuf[1024];
588extern ushort len4caid[256];
589extern pid_t master_pid;
590extern struct s_ecm *ecmcache;
591extern struct s_client *client;
592extern struct s_reader *reader;
593
594extern struct card_struct *Cards;
595extern struct idstore_struct *idstore;
596extern unsigned long *IgnoreList;
597
598extern struct s_config *cfg;
599extern char cs_confdir[], *loghist;
600extern EMM_PACKET epg;
601extern struct s_module ph[CS_MAX_MOD];
602extern ECM_REQUEST *ecmtask;
603extern char logfile[256];
604#ifdef CS_ANTICASC
605extern struct s_acasc_shm *acasc;
606extern FILE *fpa;
607extern int use_ac_log;
608#endif
609
610
611// oscam
612extern char *cs_platform(char *);
613extern int recv_from_udpipe(uchar *, int);
614extern char* username(int);
615extern int idx_from_pid(pid_t);
616extern int chk_bcaid(ECM_REQUEST *, CAIDTAB *);
617extern void cs_exit(int sig);
618extern int cs_fork(in_addr_t, in_port_t);
619extern void wait4master(void);
620extern int cs_auth_client(struct s_auth *, char*);
621extern void cs_disconnect_client(void);
622extern int check_ecmcache(ECM_REQUEST *, ulong);
623extern int write_to_pipe(int, int, uchar *, int);
624extern int read_from_pipe(int, uchar **, int);
625extern int write_ecm_request(int, ECM_REQUEST *);
626extern int write_ecm_answer(int, ECM_REQUEST *);
627extern void log_emm_request(int);
628extern ulong chk_provid(uchar *, ushort);
629extern void guess_cardsystem(ECM_REQUEST *);
630extern void guess_irdeto(ECM_REQUEST *);
631extern void get_cw(ECM_REQUEST *);
632extern void do_emm(EMM_PACKET *);
633extern ECM_REQUEST *get_ecmtask(void);
634extern void request_cw(ECM_REQUEST *, int);
635extern int send_dcw(ECM_REQUEST *);
636extern int process_input(uchar *, int, int);
637extern int chk_srvid(ECM_REQUEST *, int);
638extern int chk_sfilter(ECM_REQUEST *, PTAB*);
639extern int chk_ufilters(ECM_REQUEST *);
640extern int chk_rfilter(ECM_REQUEST *, struct s_reader *);
641extern int chk_rsfilter(ECM_REQUEST *, int);
642extern int chk_avail_reader(ECM_REQUEST *, struct s_reader *);
643extern void set_signal_handler(int , int , void (*)(int));
644extern void cs_log_config(void);
645
646#ifdef CS_ANTICASC
647//extern void start_anticascader(void);
648extern void init_ac(void);
649extern void ac_init_stat(int);
650extern int ac_init_log(char*);
651extern void ac_do_stat(void);
652extern void ac_init_client(struct s_auth *);
653extern void ac_chk(ECM_REQUEST*, int);
654#endif
655
656// oscam-nano
657extern int chk_class(ECM_REQUEST *, CLASSTAB*, const char*, const char*);
658
659// oscam-config
660extern int init_config(void);
661extern int init_userdb(void);
662extern int init_readerdb(void);
663extern int init_sidtab(void);
664extern int init_srvid(void);
665extern int search_boxkey(ushort, ulong, char *);
666extern void init_len4caid(void);
667extern int init_irdeto_guess_tab(void);
668
669// oscam-reader
670extern int ridx, logfd;
671extern void cs_ri_brk(int);
672extern void cs_ri_log(char *,...);
673extern void start_cardreader(void);
674extern void reader_card_info(void);
675
676// oscam-log
677extern int cs_init_log(char *);
678extern void cs_log(char *,...);
679extern void cs_debug(char *,...);
680extern void cs_ddump(uchar *, int, char *, ...);
681extern void cs_close_log(void);
682extern int cs_init_statistics(char *);
683extern void cs_statistics(int);
684extern void cs_dump(uchar *, int, char *, ...);
685
686// oscam-aes
687extern void aes_set_key(char *);
688extern void aes_encrypt_idx(int, uchar *, int);
689extern void aes_decrypt(uchar *, int);
690#define aes_encrypt(b, n) aes_encrypt_idx(cs_idx, b, n)
691
692// reader-common
693extern int reader_device_init(char *, int);
694extern int reader_checkhealth(void);
695extern int reader_ecm(ECM_REQUEST *);
696extern int reader_emm(EMM_PACKET *);
697
698// reader-irdeto
699extern int irdeto_card_init(uchar *, int);
700extern int irdeto_do_ecm(ECM_REQUEST *);
701extern int irdeto_do_emm(EMM_PACKET *);
702extern int irdeto_card_info(void);
703
704// reader-viaccess
705extern int viaccess_card_init(uchar *, int);
706extern int viaccess_do_ecm(ECM_REQUEST *);
707extern int viaccess_do_emm(EMM_PACKET *);
708extern int viaccess_card_info(void);
709
710// reader-videoguard
711extern int videoguard_card_init(uchar *, int);
712extern int videoguard_do_ecm(ECM_REQUEST *);
713extern int videoguard_do_emm(EMM_PACKET *);
714extern int videoguard_card_info(void);
715
716// reader-cryptoworks
717extern int cryptoworks_card_init(uchar *, int);
718extern int cryptoworks_do_ecm(ECM_REQUEST *);
719extern int cryptoworks_do_emm(EMM_PACKET *);
720extern int cryptoworks_card_info(void);
721
722// reader-seca
723extern int seca_card_init(uchar *, int);
724extern int seca_do_ecm(ECM_REQUEST *);
725extern int seca_do_emm(EMM_PACKET *);
726extern int seca_card_info(void);
727
728// protocol modules
729extern int monitor_send_idx(int, char *);
730extern void module_monitor(struct s_module *);
731extern void module_camd35(struct s_module *);
732extern void module_camd35_tcp(struct s_module *);
733extern void module_camd33(struct s_module *);
734extern void module_newcamd(struct s_module *);
735extern void module_radegast(struct s_module *);
736extern void module_oscam_ser(struct s_module *);
737extern void module_gbox(struct s_module *);
738extern struct timeval *chk_pending(struct timeb tp_ctimeout);
739#endif // CS_GLOBALS
Note: See TracBrowser for help on using the repository browser.